diff --git a/.bazelrc b/.bazelrc index 725bd1626ee1b..0f538d661b0da 100644 --- a/.bazelrc +++ b/.bazelrc @@ -18,7 +18,6 @@ build:release --workspace_status_command=./build/print-workspace-status.sh --sta build:release --config=ci build:race --config=ci build:race --@io_bazel_rules_go//go/config:race --test_env=GORACE=halt_on_error=1 --test_sharding_strategy=disabled -test --test_env=TZ=Asia/Shanghai test --test_output=errors --test_summary=detailed test:ci --color=yes test:ci --verbose_failures --test_verbose_timeout_warnings diff --git a/.codecov.yml b/.codecov.yml index 3ee2f36bdd828..3cb8bbf64ec9c 100644 --- a/.codecov.yml +++ b/.codecov.yml @@ -72,22 +72,24 @@ flag_management: ignore: - "LICENSES" - - "*_test.go" + - "**/*_test.go" - ".git" - - "*.yml" - - "*.md" - - "cmd/.*" - - "docs/.*" - - "vendor/.*" - - "pkg/ddl/failtest/.*" - - "pkg/ddl/testutil/.*" - - "pkg/executor/seqtest/.*" - - "pkg/metrics/.*" - - "pkg/expression/generator/.*" - - "br/pkg/mock/.*" - - "pkg/testkit/.*" - - "pkg/server/internal/testutil/.*" - - "pkg/statistics/handle/cache/internal/testutil/.*" + - "**/*.yml" + - "**/*.md" + - "cmd" + - "docs" + - "vendor" + - "pkg/ddl/failtest" + - "pkg/ddl/testutil" + - "pkg/executor/seqtest" + - "pkg/metrics" + - "pkg/expression/generator" + - "br/pkg/mock" + - "pkg/testkit" + - "pkg/server/internal/testutil" + - "pkg/statistics/handle/cache/internal/testutil" - "pkg/session/testutil.go" - "pkg/store/mockstore/unistore/testutil.go" + - "k8s.io/apimachinery/pkg" + - "build" diff --git a/.dockerignore b/.dockerignore index d114ba901dc2b..dc7a19bf62c16 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,4 +1,3 @@ -.git/ bazel-bin/ bazel-out/ bazel-tidb/ @@ -6,5 +5,4 @@ bazel-testlogs/ bin/ tidb-server/tidb-server *.test.bin -cmd/ Dockerfile diff --git a/.github/licenserc.yml b/.github/licenserc.yml index e49c1e35a0563..6bd4ef9d67c58 100644 --- a/.github/licenserc.yml +++ b/.github/licenserc.yml @@ -16,6 +16,8 @@ header: - "**/BUILD.bazel" - "WORKSPACE" - "WORKSPACE.patchgo" + - "MODULE.bazel" + - "MODULE.bazel.lock" - ".bazelrc" - "**/*.key" - "**/*.md" @@ -28,6 +30,7 @@ header: - "**/*.example" - "**/*.patch" - "**/*.bzl" + - "**/.git/**" - ".codecov.yml" - "Jenkinsfile" - ".editorconfig" diff --git a/.gitignore b/.gitignore index f553c7e473a86..0deb8a2183978 100644 --- a/.gitignore +++ b/.gitignore @@ -6,7 +6,6 @@ coverage.out *.iml *.swp *.log -*.test.bin tags profile.coverprofile mysql_tester @@ -14,6 +13,7 @@ tests/integrationtest/integration-test.out tests/integrationtest/integrationtest_tidb-server tests/integrationtest/portgenerator tests/integrationtest/s/ +tests/integrationtest/replayer/ *.fail.go tools/bin/ vendor @@ -38,3 +38,6 @@ bazel-tidb .ijwb/ /oom_record/ *.log.json +genkeyword +test_coverage +coverage.dat diff --git a/DEPS.bzl b/DEPS.bzl index 560e71190dcc2..cc529f9a5b242 100644 --- a/DEPS.bzl +++ b/DEPS.bzl @@ -186,19 +186,6 @@ def go_deps(): "https://storage.googleapis.com/pingcapmirror/gomod/github.com/alecthomas/kingpin/v2/com_github_alecthomas_kingpin_v2-v2.3.2.zip", ], ) - go_repository( - name = "com_github_alecthomas_template", - build_file_proto_mode = "disable_global", - importpath = "github.com/alecthomas/template", - sha256 = "86de3337a475e323a0fb54ef03386a4e495682201f42795bd7be646c05298692", - strip_prefix = "github.com/alecthomas/template@v0.0.0-20160405071501-a0175ee3bccc", - urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/github.com/alecthomas/template/com_github_alecthomas_template-v0.0.0-20160405071501-a0175ee3bccc.zip", - "http://ats.apps.svc/gomod/github.com/alecthomas/template/com_github_alecthomas_template-v0.0.0-20160405071501-a0175ee3bccc.zip", - "https://cache.hawkingrei.com/gomod/github.com/alecthomas/template/com_github_alecthomas_template-v0.0.0-20160405071501-a0175ee3bccc.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/github.com/alecthomas/template/com_github_alecthomas_template-v0.0.0-20160405071501-a0175ee3bccc.zip", - ], - ) go_repository( name = "com_github_alecthomas_units", build_file_proto_mode = "disable_global", @@ -368,19 +355,6 @@ def go_deps(): "https://storage.googleapis.com/pingcapmirror/gomod/github.com/apache/thrift/com_github_apache_thrift-v0.13.1-0.20201008052519-daf620915714.zip", ], ) - go_repository( - name = "com_github_armon_circbuf", - build_file_proto_mode = "disable_global", - importpath = "github.com/armon/circbuf", - sha256 = "3819cde26cd4b25c4043dc9384da7b0c1c29fd06e6e3a38604f4a6933fc017ed", - strip_prefix = "github.com/armon/circbuf@v0.0.0-20150827004946-bbbad097214e", - urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/github.com/armon/circbuf/com_github_armon_circbuf-v0.0.0-20150827004946-bbbad097214e.zip", - "http://ats.apps.svc/gomod/github.com/armon/circbuf/com_github_armon_circbuf-v0.0.0-20150827004946-bbbad097214e.zip", - "https://cache.hawkingrei.com/gomod/github.com/armon/circbuf/com_github_armon_circbuf-v0.0.0-20150827004946-bbbad097214e.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/github.com/armon/circbuf/com_github_armon_circbuf-v0.0.0-20150827004946-bbbad097214e.zip", - ], - ) go_repository( name = "com_github_armon_consul_api", build_file_proto_mode = "disable_global", @@ -398,26 +372,13 @@ def go_deps(): name = "com_github_armon_go_metrics", build_file_proto_mode = "disable_global", importpath = "github.com/armon/go-metrics", - sha256 = "247448464a8d219611279cde2540ef86de10828a5b2679477ded835adef351b1", - strip_prefix = "github.com/armon/go-metrics@v0.0.0-20180917152333-f0300d1749da", - urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/github.com/armon/go-metrics/com_github_armon_go_metrics-v0.0.0-20180917152333-f0300d1749da.zip", - "http://ats.apps.svc/gomod/github.com/armon/go-metrics/com_github_armon_go_metrics-v0.0.0-20180917152333-f0300d1749da.zip", - "https://cache.hawkingrei.com/gomod/github.com/armon/go-metrics/com_github_armon_go_metrics-v0.0.0-20180917152333-f0300d1749da.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/github.com/armon/go-metrics/com_github_armon_go_metrics-v0.0.0-20180917152333-f0300d1749da.zip", - ], - ) - go_repository( - name = "com_github_armon_go_radix", - build_file_proto_mode = "disable_global", - importpath = "github.com/armon/go-radix", - sha256 = "cb090b2b3c19987353e831ca79b31eb31eaa534b1f46d11b8813b235b1058859", - strip_prefix = "github.com/armon/go-radix@v0.0.0-20180808171621-7fddfc383310", + sha256 = "f1b9155b8635eea48fb8929934b1268bf624cec2d51fcef8b62fa4aa91e05cc9", + strip_prefix = "github.com/armon/go-metrics@v0.4.1", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/github.com/armon/go-radix/com_github_armon_go_radix-v0.0.0-20180808171621-7fddfc383310.zip", - "http://ats.apps.svc/gomod/github.com/armon/go-radix/com_github_armon_go_radix-v0.0.0-20180808171621-7fddfc383310.zip", - "https://cache.hawkingrei.com/gomod/github.com/armon/go-radix/com_github_armon_go_radix-v0.0.0-20180808171621-7fddfc383310.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/github.com/armon/go-radix/com_github_armon_go_radix-v0.0.0-20180808171621-7fddfc383310.zip", + "http://bazel-cache.pingcap.net:8080/gomod/github.com/armon/go-metrics/com_github_armon_go_metrics-v0.4.1.zip", + "http://ats.apps.svc/gomod/github.com/armon/go-metrics/com_github_armon_go_metrics-v0.4.1.zip", + "https://cache.hawkingrei.com/gomod/github.com/armon/go-metrics/com_github_armon_go_metrics-v0.4.1.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/github.com/armon/go-metrics/com_github_armon_go_metrics-v0.4.1.zip", ], ) go_repository( @@ -433,6 +394,19 @@ def go_deps(): "https://storage.googleapis.com/pingcapmirror/gomod/github.com/armon/go-socks5/com_github_armon_go_socks5-v0.0.0-20160902184237-e75332964ef5.zip", ], ) + go_repository( + name = "com_github_asaskevich_govalidator", + build_file_proto_mode = "disable_global", + importpath = "github.com/asaskevich/govalidator", + sha256 = "0f8ec67bbc585d29ec115c0885cef6f2431a422cc1cc10008e466ebe8be5dc37", + strip_prefix = "github.com/asaskevich/govalidator@v0.0.0-20230301143203-a9d515a09cc2", + urls = [ + "http://bazel-cache.pingcap.net:8080/gomod/github.com/asaskevich/govalidator/com_github_asaskevich_govalidator-v0.0.0-20230301143203-a9d515a09cc2.zip", + "http://ats.apps.svc/gomod/github.com/asaskevich/govalidator/com_github_asaskevich_govalidator-v0.0.0-20230301143203-a9d515a09cc2.zip", + "https://cache.hawkingrei.com/gomod/github.com/asaskevich/govalidator/com_github_asaskevich_govalidator-v0.0.0-20230301143203-a9d515a09cc2.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/github.com/asaskevich/govalidator/com_github_asaskevich_govalidator-v0.0.0-20230301143203-a9d515a09cc2.zip", + ], + ) go_repository( name = "com_github_ashanbrown_forbidigo", build_file_proto_mode = "disable_global", @@ -463,13 +437,13 @@ def go_deps(): name = "com_github_aws_aws_sdk_go", build_file_proto_mode = "disable_global", importpath = "github.com/aws/aws-sdk-go", - sha256 = "8f1bd64c68621278523ecb27db81d4a0f1c1d5539f81f767b3d987778e78abcb", - strip_prefix = "github.com/aws/aws-sdk-go@v1.44.259", + sha256 = "41451d24417630e603c76d88cd9c589c7f6eb05f710dea9ee86ed3c4f1837eee", + strip_prefix = "github.com/aws/aws-sdk-go@v1.45.25", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/github.com/aws/aws-sdk-go/com_github_aws_aws_sdk_go-v1.44.259.zip", - "http://ats.apps.svc/gomod/github.com/aws/aws-sdk-go/com_github_aws_aws_sdk_go-v1.44.259.zip", - "https://cache.hawkingrei.com/gomod/github.com/aws/aws-sdk-go/com_github_aws_aws_sdk_go-v1.44.259.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/github.com/aws/aws-sdk-go/com_github_aws_aws_sdk_go-v1.44.259.zip", + "http://bazel-cache.pingcap.net:8080/gomod/github.com/aws/aws-sdk-go/com_github_aws_aws_sdk_go-v1.45.25.zip", + "http://ats.apps.svc/gomod/github.com/aws/aws-sdk-go/com_github_aws_aws_sdk_go-v1.45.25.zip", + "https://cache.hawkingrei.com/gomod/github.com/aws/aws-sdk-go/com_github_aws_aws_sdk_go-v1.45.25.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/github.com/aws/aws-sdk-go/com_github_aws_aws_sdk_go-v1.45.25.zip", ], ) go_repository( @@ -485,43 +459,30 @@ def go_deps(): "https://storage.googleapis.com/pingcapmirror/gomod/github.com/aymerick/raymond/com_github_aymerick_raymond-v2.0.3-0.20180322193309-b565731e1464+incompatible.zip", ], ) - go_repository( - name = "com_github_azure_azure_sdk_for_go", - build_file_proto_mode = "disable_global", - importpath = "github.com/Azure/azure-sdk-for-go", - sha256 = "a607abe933a75124c63e6b03141da5fa9cfb6db23691512f343f6013944c8673", - strip_prefix = "github.com/Azure/azure-sdk-for-go@v23.2.0+incompatible", - urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/github.com/Azure/azure-sdk-for-go/com_github_azure_azure_sdk_for_go-v23.2.0+incompatible.zip", - "http://ats.apps.svc/gomod/github.com/Azure/azure-sdk-for-go/com_github_azure_azure_sdk_for_go-v23.2.0+incompatible.zip", - "https://cache.hawkingrei.com/gomod/github.com/Azure/azure-sdk-for-go/com_github_azure_azure_sdk_for_go-v23.2.0+incompatible.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/github.com/Azure/azure-sdk-for-go/com_github_azure_azure_sdk_for_go-v23.2.0+incompatible.zip", - ], - ) go_repository( name = "com_github_azure_azure_sdk_for_go_sdk_azcore", build_file_proto_mode = "disable_global", importpath = "github.com/Azure/azure-sdk-for-go/sdk/azcore", - sha256 = "94a9a4cee0462fac76fd5f89f1381f28fac3f1a05d59cea70f09745e55638a0c", - strip_prefix = "github.com/Azure/azure-sdk-for-go/sdk/azcore@v1.6.0", + sha256 = "c309f857e82c604b6efe0e4e05615136a7a757394f51dbe3429272dd22817d9f", + strip_prefix = "github.com/Azure/azure-sdk-for-go/sdk/azcore@v1.8.0", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/github.com/Azure/azure-sdk-for-go/sdk/azcore/com_github_azure_azure_sdk_for_go_sdk_azcore-v1.6.0.zip", - "http://ats.apps.svc/gomod/github.com/Azure/azure-sdk-for-go/sdk/azcore/com_github_azure_azure_sdk_for_go_sdk_azcore-v1.6.0.zip", - "https://cache.hawkingrei.com/gomod/github.com/Azure/azure-sdk-for-go/sdk/azcore/com_github_azure_azure_sdk_for_go_sdk_azcore-v1.6.0.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/github.com/Azure/azure-sdk-for-go/sdk/azcore/com_github_azure_azure_sdk_for_go_sdk_azcore-v1.6.0.zip", + "http://bazel-cache.pingcap.net:8080/gomod/github.com/Azure/azure-sdk-for-go/sdk/azcore/com_github_azure_azure_sdk_for_go_sdk_azcore-v1.8.0.zip", + "http://ats.apps.svc/gomod/github.com/Azure/azure-sdk-for-go/sdk/azcore/com_github_azure_azure_sdk_for_go_sdk_azcore-v1.8.0.zip", + "https://cache.hawkingrei.com/gomod/github.com/Azure/azure-sdk-for-go/sdk/azcore/com_github_azure_azure_sdk_for_go_sdk_azcore-v1.8.0.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/github.com/Azure/azure-sdk-for-go/sdk/azcore/com_github_azure_azure_sdk_for_go_sdk_azcore-v1.8.0.zip", ], ) go_repository( name = "com_github_azure_azure_sdk_for_go_sdk_azidentity", build_file_proto_mode = "disable_global", importpath = "github.com/Azure/azure-sdk-for-go/sdk/azidentity", - sha256 = "27947f13cb64475fd59e5d9f8b9c042b3d1e8603f49c54fc42820001c33d5f78", - strip_prefix = "github.com/Azure/azure-sdk-for-go/sdk/azidentity@v1.1.0", + sha256 = "39566249254f05e58d8a8a1324cd44c0545ca4091b34d5d86dfb832062b8302c", + strip_prefix = "github.com/Azure/azure-sdk-for-go/sdk/azidentity@v1.4.0", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/github.com/Azure/azure-sdk-for-go/sdk/azidentity/com_github_azure_azure_sdk_for_go_sdk_azidentity-v1.1.0.zip", - "http://ats.apps.svc/gomod/github.com/Azure/azure-sdk-for-go/sdk/azidentity/com_github_azure_azure_sdk_for_go_sdk_azidentity-v1.1.0.zip", - "https://cache.hawkingrei.com/gomod/github.com/Azure/azure-sdk-for-go/sdk/azidentity/com_github_azure_azure_sdk_for_go_sdk_azidentity-v1.1.0.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/github.com/Azure/azure-sdk-for-go/sdk/azidentity/com_github_azure_azure_sdk_for_go_sdk_azidentity-v1.1.0.zip", + "http://bazel-cache.pingcap.net:8080/gomod/github.com/Azure/azure-sdk-for-go/sdk/azidentity/com_github_azure_azure_sdk_for_go_sdk_azidentity-v1.4.0.zip", + "http://ats.apps.svc/gomod/github.com/Azure/azure-sdk-for-go/sdk/azidentity/com_github_azure_azure_sdk_for_go_sdk_azidentity-v1.4.0.zip", + "https://cache.hawkingrei.com/gomod/github.com/Azure/azure-sdk-for-go/sdk/azidentity/com_github_azure_azure_sdk_for_go_sdk_azidentity-v1.4.0.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/github.com/Azure/azure-sdk-for-go/sdk/azidentity/com_github_azure_azure_sdk_for_go_sdk_azidentity-v1.4.0.zip", ], ) go_repository( @@ -537,6 +498,45 @@ def go_deps(): "https://storage.googleapis.com/pingcapmirror/gomod/github.com/Azure/azure-sdk-for-go/sdk/internal/com_github_azure_azure_sdk_for_go_sdk_internal-v1.3.0.zip", ], ) + go_repository( + name = "com_github_azure_azure_sdk_for_go_sdk_resourcemanager_compute_armcompute_v4", + build_file_proto_mode = "disable_global", + importpath = "github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v4", + sha256 = "b0c3b75b9e8fc156c488016d93e411f3089b5b97cd8250ac30a4746a558d3b62", + strip_prefix = "github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v4@v4.2.1", + urls = [ + "http://bazel-cache.pingcap.net:8080/gomod/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v4/com_github_azure_azure_sdk_for_go_sdk_resourcemanager_compute_armcompute_v4-v4.2.1.zip", + "http://ats.apps.svc/gomod/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v4/com_github_azure_azure_sdk_for_go_sdk_resourcemanager_compute_armcompute_v4-v4.2.1.zip", + "https://cache.hawkingrei.com/gomod/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v4/com_github_azure_azure_sdk_for_go_sdk_resourcemanager_compute_armcompute_v4-v4.2.1.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v4/com_github_azure_azure_sdk_for_go_sdk_resourcemanager_compute_armcompute_v4-v4.2.1.zip", + ], + ) + go_repository( + name = "com_github_azure_azure_sdk_for_go_sdk_resourcemanager_network_armnetwork", + build_file_proto_mode = "disable_global", + importpath = "github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork", + sha256 = "ea444a1c3fcddb0477f7d1df7716c4d9a9edf5d89b12bbd5c92e89c036a1c01b", + strip_prefix = "github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork@v1.1.0", + urls = [ + "http://bazel-cache.pingcap.net:8080/gomod/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork/com_github_azure_azure_sdk_for_go_sdk_resourcemanager_network_armnetwork-v1.1.0.zip", + "http://ats.apps.svc/gomod/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork/com_github_azure_azure_sdk_for_go_sdk_resourcemanager_network_armnetwork-v1.1.0.zip", + "https://cache.hawkingrei.com/gomod/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork/com_github_azure_azure_sdk_for_go_sdk_resourcemanager_network_armnetwork-v1.1.0.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork/com_github_azure_azure_sdk_for_go_sdk_resourcemanager_network_armnetwork-v1.1.0.zip", + ], + ) + go_repository( + name = "com_github_azure_azure_sdk_for_go_sdk_resourcemanager_network_armnetwork_v2", + build_file_proto_mode = "disable_global", + importpath = "github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork/v2", + sha256 = "4e0253514cf7072a29ddb22adf71cea03a44935a05de3897910a3932ae0034e3", + strip_prefix = "github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork/v2@v2.2.1", + urls = [ + "http://bazel-cache.pingcap.net:8080/gomod/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork/v2/com_github_azure_azure_sdk_for_go_sdk_resourcemanager_network_armnetwork_v2-v2.2.1.zip", + "http://ats.apps.svc/gomod/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork/v2/com_github_azure_azure_sdk_for_go_sdk_resourcemanager_network_armnetwork_v2-v2.2.1.zip", + "https://cache.hawkingrei.com/gomod/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork/v2/com_github_azure_azure_sdk_for_go_sdk_resourcemanager_network_armnetwork_v2-v2.2.1.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork/v2/com_github_azure_azure_sdk_for_go_sdk_resourcemanager_network_armnetwork_v2-v2.2.1.zip", + ], + ) go_repository( name = "com_github_azure_azure_sdk_for_go_sdk_storage_azblob", build_file_proto_mode = "disable_global", @@ -550,19 +550,6 @@ def go_deps(): "https://storage.googleapis.com/pingcapmirror/gomod/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/com_github_azure_azure_sdk_for_go_sdk_storage_azblob-v1.0.0.zip", ], ) - go_repository( - name = "com_github_azure_go_autorest", - build_file_proto_mode = "disable_global", - importpath = "github.com/Azure/go-autorest", - sha256 = "295b69ffc36f1b89b3f58025b4d7d6c06cc3e2f0131a1666d49b5456611a3501", - strip_prefix = "github.com/Azure/go-autorest@v11.2.8+incompatible", - urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/github.com/Azure/go-autorest/com_github_azure_go_autorest-v11.2.8+incompatible.zip", - "http://ats.apps.svc/gomod/github.com/Azure/go-autorest/com_github_azure_go_autorest-v11.2.8+incompatible.zip", - "https://cache.hawkingrei.com/gomod/github.com/Azure/go-autorest/com_github_azure_go_autorest-v11.2.8+incompatible.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/github.com/Azure/go-autorest/com_github_azure_go_autorest-v11.2.8+incompatible.zip", - ], - ) go_repository( name = "com_github_azure_go_ntlmssp", build_file_proto_mode = "disable_global", @@ -580,13 +567,13 @@ def go_deps(): name = "com_github_azuread_microsoft_authentication_library_for_go", build_file_proto_mode = "disable_global", importpath = "github.com/AzureAD/microsoft-authentication-library-for-go", - sha256 = "303670915e2c0de9e6ed4658360ce5ae07320714c9a8228f0f2d69a12b8ddf5d", - strip_prefix = "github.com/AzureAD/microsoft-authentication-library-for-go@v0.5.1", + sha256 = "6f933f00d5310409c8f3fe25917c3c48abb94fa9c582a9ce6ae35eaafe80d06c", + strip_prefix = "github.com/AzureAD/microsoft-authentication-library-for-go@v1.1.1", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/github.com/AzureAD/microsoft-authentication-library-for-go/com_github_azuread_microsoft_authentication_library_for_go-v0.5.1.zip", - "http://ats.apps.svc/gomod/github.com/AzureAD/microsoft-authentication-library-for-go/com_github_azuread_microsoft_authentication_library_for_go-v0.5.1.zip", - "https://cache.hawkingrei.com/gomod/github.com/AzureAD/microsoft-authentication-library-for-go/com_github_azuread_microsoft_authentication_library_for_go-v0.5.1.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/github.com/AzureAD/microsoft-authentication-library-for-go/com_github_azuread_microsoft_authentication_library_for_go-v0.5.1.zip", + "http://bazel-cache.pingcap.net:8080/gomod/github.com/AzureAD/microsoft-authentication-library-for-go/com_github_azuread_microsoft_authentication_library_for_go-v1.1.1.zip", + "http://ats.apps.svc/gomod/github.com/AzureAD/microsoft-authentication-library-for-go/com_github_azuread_microsoft_authentication_library_for_go-v1.1.1.zip", + "https://cache.hawkingrei.com/gomod/github.com/AzureAD/microsoft-authentication-library-for-go/com_github_azuread_microsoft_authentication_library_for_go-v1.1.1.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/github.com/AzureAD/microsoft-authentication-library-for-go/com_github_azuread_microsoft_authentication_library_for_go-v1.1.1.zip", ], ) go_repository( @@ -641,32 +628,6 @@ def go_deps(): "https://storage.googleapis.com/pingcapmirror/gomod/github.com/beorn7/perks/com_github_beorn7_perks-v1.0.1.zip", ], ) - go_repository( - name = "com_github_bgentry_speakeasy", - build_file_proto_mode = "disable_global", - importpath = "github.com/bgentry/speakeasy", - sha256 = "d4bfd48b9bf68c87f92c94478ac910bcdab272e15eb909d58f1fb939233f75f0", - strip_prefix = "github.com/bgentry/speakeasy@v0.1.0", - urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/github.com/bgentry/speakeasy/com_github_bgentry_speakeasy-v0.1.0.zip", - "http://ats.apps.svc/gomod/github.com/bgentry/speakeasy/com_github_bgentry_speakeasy-v0.1.0.zip", - "https://cache.hawkingrei.com/gomod/github.com/bgentry/speakeasy/com_github_bgentry_speakeasy-v0.1.0.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/github.com/bgentry/speakeasy/com_github_bgentry_speakeasy-v0.1.0.zip", - ], - ) - go_repository( - name = "com_github_biogo_store", - build_file_proto_mode = "disable_global", - importpath = "github.com/biogo/store", - sha256 = "26551f8829c5ada84a68ef240732375be6747252aba423cf5c88bc03002c3600", - strip_prefix = "github.com/biogo/store@v0.0.0-20160505134755-913427a1d5e8", - urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/github.com/biogo/store/com_github_biogo_store-v0.0.0-20160505134755-913427a1d5e8.zip", - "http://ats.apps.svc/gomod/github.com/biogo/store/com_github_biogo_store-v0.0.0-20160505134755-913427a1d5e8.zip", - "https://cache.hawkingrei.com/gomod/github.com/biogo/store/com_github_biogo_store-v0.0.0-20160505134755-913427a1d5e8.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/github.com/biogo/store/com_github_biogo_store-v0.0.0-20160505134755-913427a1d5e8.zip", - ], - ) go_repository( name = "com_github_bkielbasa_cyclop", build_file_proto_mode = "disable_global", @@ -810,6 +771,19 @@ def go_deps(): "https://storage.googleapis.com/pingcapmirror/gomod/github.com/butuzov/mirror/com_github_butuzov_mirror-v1.1.0.zip", ], ) + go_repository( + name = "com_github_cakturk_go_netstat", + build_file_proto_mode = "disable_global", + importpath = "github.com/cakturk/go-netstat", + sha256 = "c8c3a7b894b4522d56bef918d1299b848ea78c566e19d3e35afa7ce0a207b5ab", + strip_prefix = "github.com/cakturk/go-netstat@v0.0.0-20200220111822-e5b49efee7a5", + urls = [ + "http://bazel-cache.pingcap.net:8080/gomod/github.com/cakturk/go-netstat/com_github_cakturk_go_netstat-v0.0.0-20200220111822-e5b49efee7a5.zip", + "http://ats.apps.svc/gomod/github.com/cakturk/go-netstat/com_github_cakturk_go_netstat-v0.0.0-20200220111822-e5b49efee7a5.zip", + "https://cache.hawkingrei.com/gomod/github.com/cakturk/go-netstat/com_github_cakturk_go_netstat-v0.0.0-20200220111822-e5b49efee7a5.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/github.com/cakturk/go-netstat/com_github_cakturk_go_netstat-v0.0.0-20200220111822-e5b49efee7a5.zip", + ], + ) go_repository( name = "com_github_carlmjohnson_flagext", build_file_proto_mode = "disable_global", @@ -849,30 +823,17 @@ def go_deps(): "https://storage.googleapis.com/pingcapmirror/gomod/github.com/ccojocar/zxcvbn-go/com_github_ccojocar_zxcvbn_go-v1.0.1.zip", ], ) - go_repository( - name = "com_github_cenk_backoff", - build_file_proto_mode = "disable_global", - importpath = "github.com/cenk/backoff", - sha256 = "ac042b9692e3f0f8bd3b6a5d17443905e4c02ab84067650a96c0d43e5ea08138", - strip_prefix = "github.com/cenk/backoff@v2.0.0+incompatible", - urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/github.com/cenk/backoff/com_github_cenk_backoff-v2.0.0+incompatible.zip", - "http://ats.apps.svc/gomod/github.com/cenk/backoff/com_github_cenk_backoff-v2.0.0+incompatible.zip", - "https://cache.hawkingrei.com/gomod/github.com/cenk/backoff/com_github_cenk_backoff-v2.0.0+incompatible.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/github.com/cenk/backoff/com_github_cenk_backoff-v2.0.0+incompatible.zip", - ], - ) go_repository( name = "com_github_cenkalti_backoff_v4", build_file_proto_mode = "disable_global", importpath = "github.com/cenkalti/backoff/v4", - sha256 = "de69f5db190ee0f2c441e50e4bf607853ab99512a183a5713803888ced502dde", - strip_prefix = "github.com/cenkalti/backoff/v4@v4.1.1", + sha256 = "0b1d9cedebb1b814f4fbc03a47fdd2c2bb91d8cf14dbb1a71d3bc1482600cd2a", + strip_prefix = "github.com/cenkalti/backoff/v4@v4.2.1", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/github.com/cenkalti/backoff/v4/com_github_cenkalti_backoff_v4-v4.1.1.zip", - "http://ats.apps.svc/gomod/github.com/cenkalti/backoff/v4/com_github_cenkalti_backoff_v4-v4.1.1.zip", - "https://cache.hawkingrei.com/gomod/github.com/cenkalti/backoff/v4/com_github_cenkalti_backoff_v4-v4.1.1.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/github.com/cenkalti/backoff/v4/com_github_cenkalti_backoff_v4-v4.1.1.zip", + "http://bazel-cache.pingcap.net:8080/gomod/github.com/cenkalti/backoff/v4/com_github_cenkalti_backoff_v4-v4.2.1.zip", + "http://ats.apps.svc/gomod/github.com/cenkalti/backoff/v4/com_github_cenkalti_backoff_v4-v4.2.1.zip", + "https://cache.hawkingrei.com/gomod/github.com/cenkalti/backoff/v4/com_github_cenkalti_backoff_v4-v4.2.1.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/github.com/cenkalti/backoff/v4/com_github_cenkalti_backoff_v4-v4.2.1.zip", ], ) go_repository( @@ -888,32 +849,6 @@ def go_deps(): "https://storage.googleapis.com/pingcapmirror/gomod/github.com/census-instrumentation/opencensus-proto/com_github_census_instrumentation_opencensus_proto-v0.4.1.zip", ], ) - go_repository( - name = "com_github_certifi_gocertifi", - build_file_proto_mode = "disable_global", - importpath = "github.com/certifi/gocertifi", - sha256 = "e007c669f49757301c34b7c5bc4a37f0fbe3707ed123995728cb814217fae2f7", - strip_prefix = "github.com/certifi/gocertifi@v0.0.0-20180905225744-ee1a9a0726d2", - urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/github.com/certifi/gocertifi/com_github_certifi_gocertifi-v0.0.0-20180905225744-ee1a9a0726d2.zip", - "http://ats.apps.svc/gomod/github.com/certifi/gocertifi/com_github_certifi_gocertifi-v0.0.0-20180905225744-ee1a9a0726d2.zip", - "https://cache.hawkingrei.com/gomod/github.com/certifi/gocertifi/com_github_certifi_gocertifi-v0.0.0-20180905225744-ee1a9a0726d2.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/github.com/certifi/gocertifi/com_github_certifi_gocertifi-v0.0.0-20180905225744-ee1a9a0726d2.zip", - ], - ) - go_repository( - name = "com_github_cespare_xxhash", - build_file_proto_mode = "disable_global", - importpath = "github.com/cespare/xxhash", - sha256 = "fe98c56670b21631f7fd3305a29a3b17e86a6cce3876a2119460717a18538e2e", - strip_prefix = "github.com/cespare/xxhash@v1.1.0", - urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/github.com/cespare/xxhash/com_github_cespare_xxhash-v1.1.0.zip", - "http://ats.apps.svc/gomod/github.com/cespare/xxhash/com_github_cespare_xxhash-v1.1.0.zip", - "https://cache.hawkingrei.com/gomod/github.com/cespare/xxhash/com_github_cespare_xxhash-v1.1.0.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/github.com/cespare/xxhash/com_github_cespare_xxhash-v1.1.0.zip", - ], - ) go_repository( name = "com_github_cespare_xxhash_v2", build_file_proto_mode = "disable_global", @@ -979,6 +914,45 @@ def go_deps(): "https://storage.googleapis.com/pingcapmirror/gomod/github.com/cheynewallace/tabby/com_github_cheynewallace_tabby-v1.1.1.zip", ], ) + go_repository( + name = "com_github_chromedp_cdproto", + build_file_proto_mode = "disable_global", + importpath = "github.com/chromedp/cdproto", + sha256 = "23440cb9922bc66da55e23455aaf53799b4e838516dfca92202f29d21f9f4ad3", + strip_prefix = "github.com/chromedp/cdproto@v0.0.0-20230802225258-3cf4e6d46a89", + urls = [ + "http://bazel-cache.pingcap.net:8080/gomod/github.com/chromedp/cdproto/com_github_chromedp_cdproto-v0.0.0-20230802225258-3cf4e6d46a89.zip", + "http://ats.apps.svc/gomod/github.com/chromedp/cdproto/com_github_chromedp_cdproto-v0.0.0-20230802225258-3cf4e6d46a89.zip", + "https://cache.hawkingrei.com/gomod/github.com/chromedp/cdproto/com_github_chromedp_cdproto-v0.0.0-20230802225258-3cf4e6d46a89.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/github.com/chromedp/cdproto/com_github_chromedp_cdproto-v0.0.0-20230802225258-3cf4e6d46a89.zip", + ], + ) + go_repository( + name = "com_github_chromedp_chromedp", + build_file_proto_mode = "disable_global", + importpath = "github.com/chromedp/chromedp", + sha256 = "f141d0c242b87bafe550404588cd86ba1e6ba05d9d1774ce96d4d097455b51d6", + strip_prefix = "github.com/chromedp/chromedp@v0.9.2", + urls = [ + "http://bazel-cache.pingcap.net:8080/gomod/github.com/chromedp/chromedp/com_github_chromedp_chromedp-v0.9.2.zip", + "http://ats.apps.svc/gomod/github.com/chromedp/chromedp/com_github_chromedp_chromedp-v0.9.2.zip", + "https://cache.hawkingrei.com/gomod/github.com/chromedp/chromedp/com_github_chromedp_chromedp-v0.9.2.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/github.com/chromedp/chromedp/com_github_chromedp_chromedp-v0.9.2.zip", + ], + ) + go_repository( + name = "com_github_chromedp_sysutil", + build_file_proto_mode = "disable_global", + importpath = "github.com/chromedp/sysutil", + sha256 = "0d2f5cf0478bef0a8ee71e8b60a9279fd55b07cbfc66dbcfbf5a5f4ccb905c62", + strip_prefix = "github.com/chromedp/sysutil@v1.0.0", + urls = [ + "http://bazel-cache.pingcap.net:8080/gomod/github.com/chromedp/sysutil/com_github_chromedp_sysutil-v1.0.0.zip", + "http://ats.apps.svc/gomod/github.com/chromedp/sysutil/com_github_chromedp_sysutil-v1.0.0.zip", + "https://cache.hawkingrei.com/gomod/github.com/chromedp/sysutil/com_github_chromedp_sysutil-v1.0.0.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/github.com/chromedp/sysutil/com_github_chromedp_sysutil-v1.0.0.zip", + ], + ) go_repository( name = "com_github_chzyer_logex", build_file_proto_mode = "disable_global", @@ -996,13 +970,13 @@ def go_deps(): name = "com_github_chzyer_readline", build_file_proto_mode = "disable_global", importpath = "github.com/chzyer/readline", - sha256 = "3dc842677887278fb33d25078d375ae6a7a94bb77a8d205ee2230b581b6947a6", - strip_prefix = "github.com/chzyer/readline@v0.0.0-20180603132655-2972be24d48e", + sha256 = "ce25854a8beae5c20bdde840d5142e6fbd1f86f0e58442705b8fb21dfce48501", + strip_prefix = "github.com/chzyer/readline@v1.5.1", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/github.com/chzyer/readline/com_github_chzyer_readline-v0.0.0-20180603132655-2972be24d48e.zip", - "http://ats.apps.svc/gomod/github.com/chzyer/readline/com_github_chzyer_readline-v0.0.0-20180603132655-2972be24d48e.zip", - "https://cache.hawkingrei.com/gomod/github.com/chzyer/readline/com_github_chzyer_readline-v0.0.0-20180603132655-2972be24d48e.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/github.com/chzyer/readline/com_github_chzyer_readline-v0.0.0-20180603132655-2972be24d48e.zip", + "http://bazel-cache.pingcap.net:8080/gomod/github.com/chzyer/readline/com_github_chzyer_readline-v1.5.1.zip", + "http://ats.apps.svc/gomod/github.com/chzyer/readline/com_github_chzyer_readline-v1.5.1.zip", + "https://cache.hawkingrei.com/gomod/github.com/chzyer/readline/com_github_chzyer_readline-v1.5.1.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/github.com/chzyer/readline/com_github_chzyer_readline-v1.5.1.zip", ], ) go_repository( @@ -1096,58 +1070,6 @@ def go_deps(): "https://storage.googleapis.com/pingcapmirror/gomod/github.com/cncf/xds/go/com_github_cncf_xds_go-v0.0.0-20230607035331-e9ce68804cb4.zip", ], ) - go_repository( - name = "com_github_cockroachdb_apd", - build_file_proto_mode = "disable_global", - importpath = "github.com/cockroachdb/apd", - sha256 = "fef7ec2fae220f84bfacb17fbfc1b04a666ab7f6fc04f3ff6d2b1e05c380777d", - strip_prefix = "github.com/cockroachdb/apd@v1.1.0", - urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/github.com/cockroachdb/apd/com_github_cockroachdb_apd-v1.1.0.zip", - "http://ats.apps.svc/gomod/github.com/cockroachdb/apd/com_github_cockroachdb_apd-v1.1.0.zip", - "https://cache.hawkingrei.com/gomod/github.com/cockroachdb/apd/com_github_cockroachdb_apd-v1.1.0.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/github.com/cockroachdb/apd/com_github_cockroachdb_apd-v1.1.0.zip", - ], - ) - go_repository( - name = "com_github_cockroachdb_cmux", - build_file_proto_mode = "disable_global", - importpath = "github.com/cockroachdb/cmux", - sha256 = "88f6f9cf33eb535658540b46f6222f029398e590a3ff9cc873d7d561ac6debf0", - strip_prefix = "github.com/cockroachdb/cmux@v0.0.0-20170110192607-30d10be49292", - urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/github.com/cockroachdb/cmux/com_github_cockroachdb_cmux-v0.0.0-20170110192607-30d10be49292.zip", - "http://ats.apps.svc/gomod/github.com/cockroachdb/cmux/com_github_cockroachdb_cmux-v0.0.0-20170110192607-30d10be49292.zip", - "https://cache.hawkingrei.com/gomod/github.com/cockroachdb/cmux/com_github_cockroachdb_cmux-v0.0.0-20170110192607-30d10be49292.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/github.com/cockroachdb/cmux/com_github_cockroachdb_cmux-v0.0.0-20170110192607-30d10be49292.zip", - ], - ) - go_repository( - name = "com_github_cockroachdb_cockroach", - build_file_proto_mode = "disable_global", - importpath = "github.com/cockroachdb/cockroach", - sha256 = "0c0590292ad16788da3ebe10bd407e2441a201391a24a681838c2aa26f01b991", - strip_prefix = "github.com/cockroachdb/cockroach@v0.0.0-20170608034007-84bc9597164f", - urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/github.com/cockroachdb/cockroach/com_github_cockroachdb_cockroach-v0.0.0-20170608034007-84bc9597164f.zip", - "http://ats.apps.svc/gomod/github.com/cockroachdb/cockroach/com_github_cockroachdb_cockroach-v0.0.0-20170608034007-84bc9597164f.zip", - "https://cache.hawkingrei.com/gomod/github.com/cockroachdb/cockroach/com_github_cockroachdb_cockroach-v0.0.0-20170608034007-84bc9597164f.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/github.com/cockroachdb/cockroach/com_github_cockroachdb_cockroach-v0.0.0-20170608034007-84bc9597164f.zip", - ], - ) - go_repository( - name = "com_github_cockroachdb_cockroach_go", - build_file_proto_mode = "disable_global", - importpath = "github.com/cockroachdb/cockroach-go", - sha256 = "cbc7e32c0af7ddd88afe6ef57b45481495322cb4c973f4928bc753c8be05f1a6", - strip_prefix = "github.com/cockroachdb/cockroach-go@v0.0.0-20181001143604-e0a95dfd547c", - urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/github.com/cockroachdb/cockroach-go/com_github_cockroachdb_cockroach_go-v0.0.0-20181001143604-e0a95dfd547c.zip", - "http://ats.apps.svc/gomod/github.com/cockroachdb/cockroach-go/com_github_cockroachdb_cockroach_go-v0.0.0-20181001143604-e0a95dfd547c.zip", - "https://cache.hawkingrei.com/gomod/github.com/cockroachdb/cockroach-go/com_github_cockroachdb_cockroach_go-v0.0.0-20181001143604-e0a95dfd547c.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/github.com/cockroachdb/cockroach-go/com_github_cockroachdb_cockroach_go-v0.0.0-20181001143604-e0a95dfd547c.zip", - ], - ) go_repository( name = "com_github_cockroachdb_datadriven", build_file_proto_mode = "disable_global", @@ -1308,13 +1230,13 @@ def go_deps(): name = "com_github_coreos_etcd", build_file_proto_mode = "disable_global", importpath = "github.com/coreos/etcd", - sha256 = "5848e1797f8d426f4aa4b61b15611456fb0183f974cbf9e64a8a11e740883367", - strip_prefix = "github.com/coreos/etcd@v3.3.12+incompatible", + sha256 = "6d4f268491a5e80078b3f80a94a8780c3c04bad50efb371ef10bbc80652ec122", + strip_prefix = "github.com/coreos/etcd@v3.3.10+incompatible", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/github.com/coreos/etcd/com_github_coreos_etcd-v3.3.12+incompatible.zip", - "http://ats.apps.svc/gomod/github.com/coreos/etcd/com_github_coreos_etcd-v3.3.12+incompatible.zip", - "https://cache.hawkingrei.com/gomod/github.com/coreos/etcd/com_github_coreos_etcd-v3.3.12+incompatible.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/github.com/coreos/etcd/com_github_coreos_etcd-v3.3.12+incompatible.zip", + "http://bazel-cache.pingcap.net:8080/gomod/github.com/coreos/etcd/com_github_coreos_etcd-v3.3.10+incompatible.zip", + "http://ats.apps.svc/gomod/github.com/coreos/etcd/com_github_coreos_etcd-v3.3.10+incompatible.zip", + "https://cache.hawkingrei.com/gomod/github.com/coreos/etcd/com_github_coreos_etcd-v3.3.10+incompatible.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/github.com/coreos/etcd/com_github_coreos_etcd-v3.3.10+incompatible.zip", ], ) go_repository( @@ -1503,13 +1425,13 @@ def go_deps(): name = "com_github_davecgh_go_spew", build_file_proto_mode = "disable_global", importpath = "github.com/davecgh/go-spew", - sha256 = "6b44a843951f371b7010c754ecc3cabefe815d5ced1c5b9409fb2d697e8a890d", - strip_prefix = "github.com/davecgh/go-spew@v1.1.1", + sha256 = "b4d0923b169b194f0016ec46f3df1ab0c68e27999743e43fe2de59ecb2484128", + strip_prefix = "github.com/davecgh/go-spew@v1.1.2-0.20180830191138-d8f796af33cc", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/github.com/davecgh/go-spew/com_github_davecgh_go_spew-v1.1.1.zip", - "http://ats.apps.svc/gomod/github.com/davecgh/go-spew/com_github_davecgh_go_spew-v1.1.1.zip", - "https://cache.hawkingrei.com/gomod/github.com/davecgh/go-spew/com_github_davecgh_go_spew-v1.1.1.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/github.com/davecgh/go-spew/com_github_davecgh_go_spew-v1.1.1.zip", + "http://bazel-cache.pingcap.net:8080/gomod/github.com/davecgh/go-spew/com_github_davecgh_go_spew-v1.1.2-0.20180830191138-d8f796af33cc.zip", + "http://ats.apps.svc/gomod/github.com/davecgh/go-spew/com_github_davecgh_go_spew-v1.1.2-0.20180830191138-d8f796af33cc.zip", + "https://cache.hawkingrei.com/gomod/github.com/davecgh/go-spew/com_github_davecgh_go_spew-v1.1.2-0.20180830191138-d8f796af33cc.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/github.com/davecgh/go-spew/com_github_davecgh_go_spew-v1.1.2-0.20180830191138-d8f796af33cc.zip", ], ) go_repository( @@ -1551,6 +1473,19 @@ def go_deps(): "https://storage.googleapis.com/pingcapmirror/gomod/github.com/denis-tingaikin/go-header/com_github_denis_tingaikin_go_header-v0.4.3.zip", ], ) + go_repository( + name = "com_github_dennwc_varint", + build_file_proto_mode = "disable_global", + importpath = "github.com/dennwc/varint", + sha256 = "2918e66c0fb5a82dbfc8cca1ed34cb8ccff8188e876c0ca25f85b8247e53626f", + strip_prefix = "github.com/dennwc/varint@v1.0.0", + urls = [ + "http://bazel-cache.pingcap.net:8080/gomod/github.com/dennwc/varint/com_github_dennwc_varint-v1.0.0.zip", + "http://ats.apps.svc/gomod/github.com/dennwc/varint/com_github_dennwc_varint-v1.0.0.zip", + "https://cache.hawkingrei.com/gomod/github.com/dennwc/varint/com_github_dennwc_varint-v1.0.0.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/github.com/dennwc/varint/com_github_dennwc_varint-v1.0.0.zip", + ], + ) go_repository( name = "com_github_dgraph_io_badger", build_file_proto_mode = "disable_global", @@ -1604,16 +1539,16 @@ def go_deps(): ], ) go_repository( - name = "com_github_dgryski_go_sip13", + name = "com_github_digitalocean_godo", build_file_proto_mode = "disable_global", - importpath = "github.com/dgryski/go-sip13", - sha256 = "aa6f56ab1d40952c536786beb834d9e361ef796bd7aefb7d6997e1753d4058eb", - strip_prefix = "github.com/dgryski/go-sip13@v0.0.0-20181026042036-e10d5fee7954", + importpath = "github.com/digitalocean/godo", + sha256 = "6185166897277ede2d4cba00ccca94bb4386da928c2719ffd0c50cb83b7282f6", + strip_prefix = "github.com/digitalocean/godo@v1.104.1", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/github.com/dgryski/go-sip13/com_github_dgryski_go_sip13-v0.0.0-20181026042036-e10d5fee7954.zip", - "http://ats.apps.svc/gomod/github.com/dgryski/go-sip13/com_github_dgryski_go_sip13-v0.0.0-20181026042036-e10d5fee7954.zip", - "https://cache.hawkingrei.com/gomod/github.com/dgryski/go-sip13/com_github_dgryski_go_sip13-v0.0.0-20181026042036-e10d5fee7954.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/github.com/dgryski/go-sip13/com_github_dgryski_go_sip13-v0.0.0-20181026042036-e10d5fee7954.zip", + "http://bazel-cache.pingcap.net:8080/gomod/github.com/digitalocean/godo/com_github_digitalocean_godo-v1.104.1.zip", + "http://ats.apps.svc/gomod/github.com/digitalocean/godo/com_github_digitalocean_godo-v1.104.1.zip", + "https://cache.hawkingrei.com/gomod/github.com/digitalocean/godo/com_github_digitalocean_godo-v1.104.1.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/github.com/digitalocean/godo/com_github_digitalocean_godo-v1.104.1.zip", ], ) go_repository( @@ -1633,26 +1568,65 @@ def go_deps(): name = "com_github_dnaeon_go_vcr", build_file_proto_mode = "disable_global", importpath = "github.com/dnaeon/go-vcr", - sha256 = "d6d94a1c8471809db30c2979add32bac647120bc577ea30f7e8fcc06436483f0", - strip_prefix = "github.com/dnaeon/go-vcr@v1.1.0", + sha256 = "6d34b7e17c158d51ffc34f6ac64df05ab736b2ae50c0db07be4a9556dac10c52", + strip_prefix = "github.com/dnaeon/go-vcr@v1.2.0", + urls = [ + "http://bazel-cache.pingcap.net:8080/gomod/github.com/dnaeon/go-vcr/com_github_dnaeon_go_vcr-v1.2.0.zip", + "http://ats.apps.svc/gomod/github.com/dnaeon/go-vcr/com_github_dnaeon_go_vcr-v1.2.0.zip", + "https://cache.hawkingrei.com/gomod/github.com/dnaeon/go-vcr/com_github_dnaeon_go_vcr-v1.2.0.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/github.com/dnaeon/go-vcr/com_github_dnaeon_go_vcr-v1.2.0.zip", + ], + ) + go_repository( + name = "com_github_docker_distribution", + build_file_proto_mode = "disable_global", + importpath = "github.com/docker/distribution", + sha256 = "9e0a17bbcaa1419232cd44e3a79209be26d9ccfa079e32e0e9999c81c0991477", + strip_prefix = "github.com/docker/distribution@v2.8.2+incompatible", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/github.com/dnaeon/go-vcr/com_github_dnaeon_go_vcr-v1.1.0.zip", - "http://ats.apps.svc/gomod/github.com/dnaeon/go-vcr/com_github_dnaeon_go_vcr-v1.1.0.zip", - "https://cache.hawkingrei.com/gomod/github.com/dnaeon/go-vcr/com_github_dnaeon_go_vcr-v1.1.0.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/github.com/dnaeon/go-vcr/com_github_dnaeon_go_vcr-v1.1.0.zip", + "http://bazel-cache.pingcap.net:8080/gomod/github.com/docker/distribution/com_github_docker_distribution-v2.8.2+incompatible.zip", + "http://ats.apps.svc/gomod/github.com/docker/distribution/com_github_docker_distribution-v2.8.2+incompatible.zip", + "https://cache.hawkingrei.com/gomod/github.com/docker/distribution/com_github_docker_distribution-v2.8.2+incompatible.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/github.com/docker/distribution/com_github_docker_distribution-v2.8.2+incompatible.zip", + ], + ) + go_repository( + name = "com_github_docker_docker", + build_file_proto_mode = "disable_global", + importpath = "github.com/docker/docker", + sha256 = "a2042099c93f698ea6a418a850ab2e15214173d0b1f27ad20683afa4d4653cb1", + strip_prefix = "github.com/docker/docker@v24.0.6+incompatible", + urls = [ + "http://bazel-cache.pingcap.net:8080/gomod/github.com/docker/docker/com_github_docker_docker-v24.0.6+incompatible.zip", + "http://ats.apps.svc/gomod/github.com/docker/docker/com_github_docker_docker-v24.0.6+incompatible.zip", + "https://cache.hawkingrei.com/gomod/github.com/docker/docker/com_github_docker_docker-v24.0.6+incompatible.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/github.com/docker/docker/com_github_docker_docker-v24.0.6+incompatible.zip", + ], + ) + go_repository( + name = "com_github_docker_go_connections", + build_file_proto_mode = "disable_global", + importpath = "github.com/docker/go-connections", + sha256 = "570ebcee7e6fd844e00c89eeab2b1922081d6969df76078dfe4ffacd3db56ada", + strip_prefix = "github.com/docker/go-connections@v0.4.0", + urls = [ + "http://bazel-cache.pingcap.net:8080/gomod/github.com/docker/go-connections/com_github_docker_go_connections-v0.4.0.zip", + "http://ats.apps.svc/gomod/github.com/docker/go-connections/com_github_docker_go_connections-v0.4.0.zip", + "https://cache.hawkingrei.com/gomod/github.com/docker/go-connections/com_github_docker_go_connections-v0.4.0.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/github.com/docker/go-connections/com_github_docker_go_connections-v0.4.0.zip", ], ) go_repository( name = "com_github_docker_go_units", build_file_proto_mode = "disable_global", importpath = "github.com/docker/go-units", - sha256 = "0f2be7dce7b1a0ba6a4a786eb144a3398e9a61afc0eec5799a1520d9906fc58c", - strip_prefix = "github.com/docker/go-units@v0.4.0", + sha256 = "039d53ebe64af1aefa0be94ce42c621a17a3052c58ad15e5b3f357529beeaff6", + strip_prefix = "github.com/docker/go-units@v0.5.0", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/github.com/docker/go-units/com_github_docker_go_units-v0.4.0.zip", - "http://ats.apps.svc/gomod/github.com/docker/go-units/com_github_docker_go_units-v0.4.0.zip", - "https://cache.hawkingrei.com/gomod/github.com/docker/go-units/com_github_docker_go_units-v0.4.0.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/github.com/docker/go-units/com_github_docker_go_units-v0.4.0.zip", + "http://bazel-cache.pingcap.net:8080/gomod/github.com/docker/go-units/com_github_docker_go_units-v0.5.0.zip", + "http://ats.apps.svc/gomod/github.com/docker/go-units/com_github_docker_go_units-v0.5.0.zip", + "https://cache.hawkingrei.com/gomod/github.com/docker/go-units/com_github_docker_go_units-v0.5.0.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/github.com/docker/go-units/com_github_docker_go_units-v0.5.0.zip", ], ) go_repository( @@ -1733,6 +1707,19 @@ def go_deps(): "https://storage.googleapis.com/pingcapmirror/gomod/github.com/eapache/queue/com_github_eapache_queue-v1.1.0.zip", ], ) + go_repository( + name = "com_github_edsrzf_mmap_go", + build_file_proto_mode = "disable_global", + importpath = "github.com/edsrzf/mmap-go", + sha256 = "1c2fa2b55d253fb95d4b253ec39348deba3d46a184bc0a4393a355807b8e5df7", + strip_prefix = "github.com/edsrzf/mmap-go@v1.1.0", + urls = [ + "http://bazel-cache.pingcap.net:8080/gomod/github.com/edsrzf/mmap-go/com_github_edsrzf_mmap_go-v1.1.0.zip", + "http://ats.apps.svc/gomod/github.com/edsrzf/mmap-go/com_github_edsrzf_mmap_go-v1.1.0.zip", + "https://cache.hawkingrei.com/gomod/github.com/edsrzf/mmap-go/com_github_edsrzf_mmap_go-v1.1.0.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/github.com/edsrzf/mmap-go/com_github_edsrzf_mmap_go-v1.1.0.zip", + ], + ) go_repository( name = "com_github_eknkc_amber", build_file_proto_mode = "disable_global", @@ -1747,29 +1734,16 @@ def go_deps(): ], ) go_repository( - name = "com_github_elastic_gosigar", - build_file_proto_mode = "disable_global", - importpath = "github.com/elastic/gosigar", - sha256 = "21ddafe5b9912113983e4210aa48f12a87d3a88a0a6946601e65725b736ca852", - strip_prefix = "github.com/elastic/gosigar@v0.9.0", - urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/github.com/elastic/gosigar/com_github_elastic_gosigar-v0.9.0.zip", - "http://ats.apps.svc/gomod/github.com/elastic/gosigar/com_github_elastic_gosigar-v0.9.0.zip", - "https://cache.hawkingrei.com/gomod/github.com/elastic/gosigar/com_github_elastic_gosigar-v0.9.0.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/github.com/elastic/gosigar/com_github_elastic_gosigar-v0.9.0.zip", - ], - ) - go_repository( - name = "com_github_elazarl_go_bindata_assetfs", + name = "com_github_emicklei_go_restful_v3", build_file_proto_mode = "disable_global", - importpath = "github.com/elazarl/go-bindata-assetfs", - sha256 = "3aa225ae5ae4a8059a671fa656d8567f09861f88b88dbef9e06a291efd90013a", - strip_prefix = "github.com/elazarl/go-bindata-assetfs@v1.0.0", + importpath = "github.com/emicklei/go-restful/v3", + sha256 = "42f1f1e5d986212ba6c7d96f6e76ba2a28b1d17fad9a40b0c45d1505d39bda26", + strip_prefix = "github.com/emicklei/go-restful/v3@v3.10.2", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/github.com/elazarl/go-bindata-assetfs/com_github_elazarl_go_bindata_assetfs-v1.0.0.zip", - "http://ats.apps.svc/gomod/github.com/elazarl/go-bindata-assetfs/com_github_elazarl_go_bindata_assetfs-v1.0.0.zip", - "https://cache.hawkingrei.com/gomod/github.com/elazarl/go-bindata-assetfs/com_github_elazarl_go_bindata_assetfs-v1.0.0.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/github.com/elazarl/go-bindata-assetfs/com_github_elazarl_go_bindata_assetfs-v1.0.0.zip", + "http://bazel-cache.pingcap.net:8080/gomod/github.com/emicklei/go-restful/v3/com_github_emicklei_go_restful_v3-v3.10.2.zip", + "http://ats.apps.svc/gomod/github.com/emicklei/go-restful/v3/com_github_emicklei_go_restful_v3-v3.10.2.zip", + "https://cache.hawkingrei.com/gomod/github.com/emicklei/go-restful/v3/com_github_emicklei_go_restful_v3-v3.10.2.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/github.com/emicklei/go-restful/v3/com_github_emicklei_go_restful_v3-v3.10.2.zip", ], ) go_repository( @@ -1867,26 +1841,13 @@ def go_deps(): name = "com_github_evanphx_json_patch", build_file_proto_mode = "disable_global", importpath = "github.com/evanphx/json-patch", - sha256 = "dd873b8aea0a9546ae2adf65dd112882ddc06f6c28a9a9eea3512db7dfea3496", - strip_prefix = "github.com/evanphx/json-patch@v4.12.0+incompatible", + sha256 = "1105c2dc020fe36fa8ac02ad52f64c64291d9639c7108b6fc3da77299efd13f3", + strip_prefix = "github.com/evanphx/json-patch@v5.6.0+incompatible", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/github.com/evanphx/json-patch/com_github_evanphx_json_patch-v4.12.0+incompatible.zip", - "http://ats.apps.svc/gomod/github.com/evanphx/json-patch/com_github_evanphx_json_patch-v4.12.0+incompatible.zip", - "https://cache.hawkingrei.com/gomod/github.com/evanphx/json-patch/com_github_evanphx_json_patch-v4.12.0+incompatible.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/github.com/evanphx/json-patch/com_github_evanphx_json_patch-v4.12.0+incompatible.zip", - ], - ) - go_repository( - name = "com_github_facebookgo_clock", - build_file_proto_mode = "disable_global", - importpath = "github.com/facebookgo/clock", - sha256 = "5d6b671bd5afef8459fb7561d19bcf7c7f378da9943722d36676735b3c6272fa", - strip_prefix = "github.com/facebookgo/clock@v0.0.0-20150410010913-600d898af40a", - urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/github.com/facebookgo/clock/com_github_facebookgo_clock-v0.0.0-20150410010913-600d898af40a.zip", - "http://ats.apps.svc/gomod/github.com/facebookgo/clock/com_github_facebookgo_clock-v0.0.0-20150410010913-600d898af40a.zip", - "https://cache.hawkingrei.com/gomod/github.com/facebookgo/clock/com_github_facebookgo_clock-v0.0.0-20150410010913-600d898af40a.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/github.com/facebookgo/clock/com_github_facebookgo_clock-v0.0.0-20150410010913-600d898af40a.zip", + "http://bazel-cache.pingcap.net:8080/gomod/github.com/evanphx/json-patch/com_github_evanphx_json_patch-v5.6.0+incompatible.zip", + "http://ats.apps.svc/gomod/github.com/evanphx/json-patch/com_github_evanphx_json_patch-v5.6.0+incompatible.zip", + "https://cache.hawkingrei.com/gomod/github.com/evanphx/json-patch/com_github_evanphx_json_patch-v5.6.0+incompatible.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/github.com/evanphx/json-patch/com_github_evanphx_json_patch-v5.6.0+incompatible.zip", ], ) go_repository( @@ -1954,17 +1915,30 @@ def go_deps(): "https://storage.googleapis.com/pingcapmirror/gomod/github.com/fatih/structtag/com_github_fatih_structtag-v1.2.0.zip", ], ) + go_repository( + name = "com_github_felixge_fgprof", + build_file_proto_mode = "disable_global", + importpath = "github.com/felixge/fgprof", + sha256 = "2c83268087acf8b767be69dbc37c099fa85856763c2e88fb99637d46eb6ac23c", + strip_prefix = "github.com/felixge/fgprof@v0.9.3", + urls = [ + "http://bazel-cache.pingcap.net:8080/gomod/github.com/felixge/fgprof/com_github_felixge_fgprof-v0.9.3.zip", + "http://ats.apps.svc/gomod/github.com/felixge/fgprof/com_github_felixge_fgprof-v0.9.3.zip", + "https://cache.hawkingrei.com/gomod/github.com/felixge/fgprof/com_github_felixge_fgprof-v0.9.3.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/github.com/felixge/fgprof/com_github_felixge_fgprof-v0.9.3.zip", + ], + ) go_repository( name = "com_github_felixge_httpsnoop", build_file_proto_mode = "disable_global", importpath = "github.com/felixge/httpsnoop", - sha256 = "b345e22aa5ff8c496e6c5b8aed355ac47eb3ce631361782065e0cfdcab1b54ac", - strip_prefix = "github.com/felixge/httpsnoop@v1.0.2", + sha256 = "75aa471311265e9860df0e523400b4650ed0c1a33262786a421f07226792e494", + strip_prefix = "github.com/felixge/httpsnoop@v1.0.4", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/github.com/felixge/httpsnoop/com_github_felixge_httpsnoop-v1.0.2.zip", - "http://ats.apps.svc/gomod/github.com/felixge/httpsnoop/com_github_felixge_httpsnoop-v1.0.2.zip", - "https://cache.hawkingrei.com/gomod/github.com/felixge/httpsnoop/com_github_felixge_httpsnoop-v1.0.2.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/github.com/felixge/httpsnoop/com_github_felixge_httpsnoop-v1.0.2.zip", + "http://bazel-cache.pingcap.net:8080/gomod/github.com/felixge/httpsnoop/com_github_felixge_httpsnoop-v1.0.4.zip", + "http://ats.apps.svc/gomod/github.com/felixge/httpsnoop/com_github_felixge_httpsnoop-v1.0.4.zip", + "https://cache.hawkingrei.com/gomod/github.com/felixge/httpsnoop/com_github_felixge_httpsnoop-v1.0.4.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/github.com/felixge/httpsnoop/com_github_felixge_httpsnoop-v1.0.4.zip", ], ) go_repository( @@ -2097,19 +2071,6 @@ def go_deps(): "https://storage.googleapis.com/pingcapmirror/gomod/github.com/gavv/httpexpect/com_github_gavv_httpexpect-v2.0.0+incompatible.zip", ], ) - go_repository( - name = "com_github_getsentry_raven_go", - build_file_proto_mode = "disable_global", - importpath = "github.com/getsentry/raven-go", - sha256 = "99cba0dce93b1c0ca86b44787bb7a61e31da95a11773dfa197a67f4a92f75b71", - strip_prefix = "github.com/getsentry/raven-go@v0.1.2", - urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/github.com/getsentry/raven-go/com_github_getsentry_raven_go-v0.1.2.zip", - "http://ats.apps.svc/gomod/github.com/getsentry/raven-go/com_github_getsentry_raven_go-v0.1.2.zip", - "https://cache.hawkingrei.com/gomod/github.com/getsentry/raven-go/com_github_getsentry_raven_go-v0.1.2.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/github.com/getsentry/raven-go/com_github_getsentry_raven_go-v0.1.2.zip", - ], - ) go_repository( name = "com_github_ghemawat_stream", build_file_proto_mode = "disable_global", @@ -2253,30 +2214,17 @@ def go_deps(): "https://storage.googleapis.com/pingcapmirror/gomod/github.com/go-gl/glfw/v3.3/glfw/com_github_go_gl_glfw_v3_3_glfw-v0.0.0-20200222043503-6f7a984d4dc4.zip", ], ) - go_repository( - name = "com_github_go_ini_ini", - build_file_proto_mode = "disable_global", - importpath = "github.com/go-ini/ini", - sha256 = "2ec52de9f1c96133e9f81b8250fdc99ca0729c0d429e318d7c8836b7a6ba5f60", - strip_prefix = "github.com/go-ini/ini@v1.25.4", - urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/github.com/go-ini/ini/com_github_go_ini_ini-v1.25.4.zip", - "http://ats.apps.svc/gomod/github.com/go-ini/ini/com_github_go_ini_ini-v1.25.4.zip", - "https://cache.hawkingrei.com/gomod/github.com/go-ini/ini/com_github_go_ini_ini-v1.25.4.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/github.com/go-ini/ini/com_github_go_ini_ini-v1.25.4.zip", - ], - ) go_repository( name = "com_github_go_kit_kit", build_file_proto_mode = "disable_global", importpath = "github.com/go-kit/kit", - sha256 = "f3da9b35b100dd32e7b10c37a0630af60d54afa37c61291e7df94bc0ac31ed03", - strip_prefix = "github.com/go-kit/kit@v0.9.0", + sha256 = "2006e7fbfba4273d29042661e2c13749105ac430d85f06175359b520371e6c5a", + strip_prefix = "github.com/go-kit/kit@v0.12.0", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/github.com/go-kit/kit/com_github_go_kit_kit-v0.9.0.zip", - "http://ats.apps.svc/gomod/github.com/go-kit/kit/com_github_go_kit_kit-v0.9.0.zip", - "https://cache.hawkingrei.com/gomod/github.com/go-kit/kit/com_github_go_kit_kit-v0.9.0.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/github.com/go-kit/kit/com_github_go_kit_kit-v0.9.0.zip", + "http://bazel-cache.pingcap.net:8080/gomod/github.com/go-kit/kit/com_github_go_kit_kit-v0.12.0.zip", + "http://ats.apps.svc/gomod/github.com/go-kit/kit/com_github_go_kit_kit-v0.12.0.zip", + "https://cache.hawkingrei.com/gomod/github.com/go-kit/kit/com_github_go_kit_kit-v0.12.0.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/github.com/go-kit/kit/com_github_go_kit_kit-v0.12.0.zip", ], ) go_repository( @@ -2309,26 +2257,26 @@ def go_deps(): name = "com_github_go_logfmt_logfmt", build_file_proto_mode = "disable_global", importpath = "github.com/go-logfmt/logfmt", - sha256 = "9e030cd09b584e59a2f5baaa24cf600520757d732af0f8993cc412dd3086703a", - strip_prefix = "github.com/go-logfmt/logfmt@v0.5.1", + sha256 = "a49c00cff30c02d9c09a4974ce91215bfe37f528a74f129576697869a1b8c630", + strip_prefix = "github.com/go-logfmt/logfmt@v0.6.0", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/github.com/go-logfmt/logfmt/com_github_go_logfmt_logfmt-v0.5.1.zip", - "http://ats.apps.svc/gomod/github.com/go-logfmt/logfmt/com_github_go_logfmt_logfmt-v0.5.1.zip", - "https://cache.hawkingrei.com/gomod/github.com/go-logfmt/logfmt/com_github_go_logfmt_logfmt-v0.5.1.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/github.com/go-logfmt/logfmt/com_github_go_logfmt_logfmt-v0.5.1.zip", + "http://bazel-cache.pingcap.net:8080/gomod/github.com/go-logfmt/logfmt/com_github_go_logfmt_logfmt-v0.6.0.zip", + "http://ats.apps.svc/gomod/github.com/go-logfmt/logfmt/com_github_go_logfmt_logfmt-v0.6.0.zip", + "https://cache.hawkingrei.com/gomod/github.com/go-logfmt/logfmt/com_github_go_logfmt_logfmt-v0.6.0.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/github.com/go-logfmt/logfmt/com_github_go_logfmt_logfmt-v0.6.0.zip", ], ) go_repository( name = "com_github_go_logr_logr", build_file_proto_mode = "disable_global", importpath = "github.com/go-logr/logr", - sha256 = "9f2fe2600670561e7ea60903e736f3e38c304bfd217d0b06194daa1cf04a904f", - strip_prefix = "github.com/go-logr/logr@v1.3.0", + sha256 = "27d1c8d411fd8e42dc6202991d70afa630089700f1d002de5454d6c26f93674c", + strip_prefix = "github.com/go-logr/logr@v1.4.1", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/github.com/go-logr/logr/com_github_go_logr_logr-v1.3.0.zip", - "http://ats.apps.svc/gomod/github.com/go-logr/logr/com_github_go_logr_logr-v1.3.0.zip", - "https://cache.hawkingrei.com/gomod/github.com/go-logr/logr/com_github_go_logr_logr-v1.3.0.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/github.com/go-logr/logr/com_github_go_logr_logr-v1.3.0.zip", + "http://bazel-cache.pingcap.net:8080/gomod/github.com/go-logr/logr/com_github_go_logr_logr-v1.4.1.zip", + "http://ats.apps.svc/gomod/github.com/go-logr/logr/com_github_go_logr_logr-v1.4.1.zip", + "https://cache.hawkingrei.com/gomod/github.com/go-logr/logr/com_github_go_logr_logr-v1.4.1.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/github.com/go-logr/logr/com_github_go_logr_logr-v1.4.1.zip", ], ) go_repository( @@ -2370,43 +2318,134 @@ def go_deps(): "https://storage.googleapis.com/pingcapmirror/gomod/github.com/go-ole/go-ole/com_github_go_ole_go_ole-v1.3.0.zip", ], ) + go_repository( + name = "com_github_go_openapi_analysis", + build_file_proto_mode = "disable_global", + importpath = "github.com/go-openapi/analysis", + sha256 = "c38edc10742e5592847d0608ba13b1372a4a7ce1309fc521ea58842a0eb99d16", + strip_prefix = "github.com/go-openapi/analysis@v0.21.4", + urls = [ + "http://bazel-cache.pingcap.net:8080/gomod/github.com/go-openapi/analysis/com_github_go_openapi_analysis-v0.21.4.zip", + "http://ats.apps.svc/gomod/github.com/go-openapi/analysis/com_github_go_openapi_analysis-v0.21.4.zip", + "https://cache.hawkingrei.com/gomod/github.com/go-openapi/analysis/com_github_go_openapi_analysis-v0.21.4.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/github.com/go-openapi/analysis/com_github_go_openapi_analysis-v0.21.4.zip", + ], + ) + go_repository( + name = "com_github_go_openapi_errors", + build_file_proto_mode = "disable_global", + importpath = "github.com/go-openapi/errors", + sha256 = "40b1b8d380b340602f760e050ca81fe3abfdd88d4e671ab5b9ca6d0361038eee", + strip_prefix = "github.com/go-openapi/errors@v0.20.4", + urls = [ + "http://bazel-cache.pingcap.net:8080/gomod/github.com/go-openapi/errors/com_github_go_openapi_errors-v0.20.4.zip", + "http://ats.apps.svc/gomod/github.com/go-openapi/errors/com_github_go_openapi_errors-v0.20.4.zip", + "https://cache.hawkingrei.com/gomod/github.com/go-openapi/errors/com_github_go_openapi_errors-v0.20.4.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/github.com/go-openapi/errors/com_github_go_openapi_errors-v0.20.4.zip", + ], + ) go_repository( name = "com_github_go_openapi_jsonpointer", build_file_proto_mode = "disable_global", importpath = "github.com/go-openapi/jsonpointer", - sha256 = "13184359227db1ba359382af560d5c32c8b08c0aabfb13cfcb332700a7f01913", - strip_prefix = "github.com/go-openapi/jsonpointer@v0.19.6", + sha256 = "ff51a1ccbf148289e755c55f756fde4aa9626d5b6a79065f7592be868fc0ed74", + strip_prefix = "github.com/go-openapi/jsonpointer@v0.20.0", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/github.com/go-openapi/jsonpointer/com_github_go_openapi_jsonpointer-v0.19.6.zip", - "http://ats.apps.svc/gomod/github.com/go-openapi/jsonpointer/com_github_go_openapi_jsonpointer-v0.19.6.zip", - "https://cache.hawkingrei.com/gomod/github.com/go-openapi/jsonpointer/com_github_go_openapi_jsonpointer-v0.19.6.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/github.com/go-openapi/jsonpointer/com_github_go_openapi_jsonpointer-v0.19.6.zip", + "http://bazel-cache.pingcap.net:8080/gomod/github.com/go-openapi/jsonpointer/com_github_go_openapi_jsonpointer-v0.20.0.zip", + "http://ats.apps.svc/gomod/github.com/go-openapi/jsonpointer/com_github_go_openapi_jsonpointer-v0.20.0.zip", + "https://cache.hawkingrei.com/gomod/github.com/go-openapi/jsonpointer/com_github_go_openapi_jsonpointer-v0.20.0.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/github.com/go-openapi/jsonpointer/com_github_go_openapi_jsonpointer-v0.20.0.zip", ], ) go_repository( name = "com_github_go_openapi_jsonreference", build_file_proto_mode = "disable_global", importpath = "github.com/go-openapi/jsonreference", - sha256 = "9bd65d3ea1d52937248fa19dabdf3619f2017328cfd758818668d9694985b32f", - strip_prefix = "github.com/go-openapi/jsonreference@v0.20.1", + sha256 = "27afd0bef56453e463eba6093afb04dc08d97b5ad0e15b2266cac867d062ae1b", + strip_prefix = "github.com/go-openapi/jsonreference@v0.20.2", + urls = [ + "http://bazel-cache.pingcap.net:8080/gomod/github.com/go-openapi/jsonreference/com_github_go_openapi_jsonreference-v0.20.2.zip", + "http://ats.apps.svc/gomod/github.com/go-openapi/jsonreference/com_github_go_openapi_jsonreference-v0.20.2.zip", + "https://cache.hawkingrei.com/gomod/github.com/go-openapi/jsonreference/com_github_go_openapi_jsonreference-v0.20.2.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/github.com/go-openapi/jsonreference/com_github_go_openapi_jsonreference-v0.20.2.zip", + ], + ) + go_repository( + name = "com_github_go_openapi_loads", + build_file_proto_mode = "disable_global", + importpath = "github.com/go-openapi/loads", + sha256 = "a97ae476c31ad269ad3429186fab2fe08f38eeb5d4167215004194b19da9d1de", + strip_prefix = "github.com/go-openapi/loads@v0.21.2", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/github.com/go-openapi/jsonreference/com_github_go_openapi_jsonreference-v0.20.1.zip", - "http://ats.apps.svc/gomod/github.com/go-openapi/jsonreference/com_github_go_openapi_jsonreference-v0.20.1.zip", - "https://cache.hawkingrei.com/gomod/github.com/go-openapi/jsonreference/com_github_go_openapi_jsonreference-v0.20.1.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/github.com/go-openapi/jsonreference/com_github_go_openapi_jsonreference-v0.20.1.zip", + "http://bazel-cache.pingcap.net:8080/gomod/github.com/go-openapi/loads/com_github_go_openapi_loads-v0.21.2.zip", + "http://ats.apps.svc/gomod/github.com/go-openapi/loads/com_github_go_openapi_loads-v0.21.2.zip", + "https://cache.hawkingrei.com/gomod/github.com/go-openapi/loads/com_github_go_openapi_loads-v0.21.2.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/github.com/go-openapi/loads/com_github_go_openapi_loads-v0.21.2.zip", + ], + ) + go_repository( + name = "com_github_go_openapi_spec", + build_file_proto_mode = "disable_global", + importpath = "github.com/go-openapi/spec", + sha256 = "06c843a4617b262b06f232c6fa380e732dea80cf77b9a80a09c0d1c83a0a8665", + strip_prefix = "github.com/go-openapi/spec@v0.20.9", + urls = [ + "http://bazel-cache.pingcap.net:8080/gomod/github.com/go-openapi/spec/com_github_go_openapi_spec-v0.20.9.zip", + "http://ats.apps.svc/gomod/github.com/go-openapi/spec/com_github_go_openapi_spec-v0.20.9.zip", + "https://cache.hawkingrei.com/gomod/github.com/go-openapi/spec/com_github_go_openapi_spec-v0.20.9.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/github.com/go-openapi/spec/com_github_go_openapi_spec-v0.20.9.zip", + ], + ) + go_repository( + name = "com_github_go_openapi_strfmt", + build_file_proto_mode = "disable_global", + importpath = "github.com/go-openapi/strfmt", + sha256 = "cec92176d987eef51b7564b8209657d915ef0722d3f63832925cc3fd097a36c4", + strip_prefix = "github.com/go-openapi/strfmt@v0.21.7", + urls = [ + "http://bazel-cache.pingcap.net:8080/gomod/github.com/go-openapi/strfmt/com_github_go_openapi_strfmt-v0.21.7.zip", + "http://ats.apps.svc/gomod/github.com/go-openapi/strfmt/com_github_go_openapi_strfmt-v0.21.7.zip", + "https://cache.hawkingrei.com/gomod/github.com/go-openapi/strfmt/com_github_go_openapi_strfmt-v0.21.7.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/github.com/go-openapi/strfmt/com_github_go_openapi_strfmt-v0.21.7.zip", ], ) go_repository( name = "com_github_go_openapi_swag", build_file_proto_mode = "disable_global", importpath = "github.com/go-openapi/swag", - sha256 = "200aad3e5eed2c395172b822650575d994b84345a2bbc7789e336545634cac09", - strip_prefix = "github.com/go-openapi/swag@v0.22.3", + sha256 = "ce8e7f82205e5c1949c99710f7d74be65d9a1353f38afe85338e9e4ba5981cb9", + strip_prefix = "github.com/go-openapi/swag@v0.22.4", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/github.com/go-openapi/swag/com_github_go_openapi_swag-v0.22.3.zip", - "http://ats.apps.svc/gomod/github.com/go-openapi/swag/com_github_go_openapi_swag-v0.22.3.zip", - "https://cache.hawkingrei.com/gomod/github.com/go-openapi/swag/com_github_go_openapi_swag-v0.22.3.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/github.com/go-openapi/swag/com_github_go_openapi_swag-v0.22.3.zip", + "http://bazel-cache.pingcap.net:8080/gomod/github.com/go-openapi/swag/com_github_go_openapi_swag-v0.22.4.zip", + "http://ats.apps.svc/gomod/github.com/go-openapi/swag/com_github_go_openapi_swag-v0.22.4.zip", + "https://cache.hawkingrei.com/gomod/github.com/go-openapi/swag/com_github_go_openapi_swag-v0.22.4.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/github.com/go-openapi/swag/com_github_go_openapi_swag-v0.22.4.zip", + ], + ) + go_repository( + name = "com_github_go_openapi_validate", + build_file_proto_mode = "disable_global", + importpath = "github.com/go-openapi/validate", + sha256 = "7d528b3b728df6a721977532d838cec9a6699baf49959e195aa775e32909d0b2", + strip_prefix = "github.com/go-openapi/validate@v0.22.1", + urls = [ + "http://bazel-cache.pingcap.net:8080/gomod/github.com/go-openapi/validate/com_github_go_openapi_validate-v0.22.1.zip", + "http://ats.apps.svc/gomod/github.com/go-openapi/validate/com_github_go_openapi_validate-v0.22.1.zip", + "https://cache.hawkingrei.com/gomod/github.com/go-openapi/validate/com_github_go_openapi_validate-v0.22.1.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/github.com/go-openapi/validate/com_github_go_openapi_validate-v0.22.1.zip", + ], + ) + go_repository( + name = "com_github_go_resty_resty_v2", + build_file_proto_mode = "disable_global", + importpath = "github.com/go-resty/resty/v2", + sha256 = "8df732287dbe0ec992fe89c720c7803f1fd31708573ccda8d2a6814c6e847c4e", + strip_prefix = "github.com/go-resty/resty/v2@v2.7.0", + urls = [ + "http://bazel-cache.pingcap.net:8080/gomod/github.com/go-resty/resty/v2/com_github_go_resty_resty_v2-v2.7.0.zip", + "http://ats.apps.svc/gomod/github.com/go-resty/resty/v2/com_github_go_resty_resty_v2-v2.7.0.zip", + "https://cache.hawkingrei.com/gomod/github.com/go-resty/resty/v2/com_github_go_resty_resty_v2-v2.7.0.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/github.com/go-resty/resty/v2/com_github_go_resty_resty_v2-v2.7.0.zip", ], ) go_repository( @@ -2439,13 +2478,13 @@ def go_deps(): name = "com_github_go_task_slim_sprig", build_file_proto_mode = "disable_global", importpath = "github.com/go-task/slim-sprig", - sha256 = "a0bb8b3e4aa7c75e47a3fe505f39aa6b57d339c1adf00149c0193a25f1cc5703", - strip_prefix = "github.com/go-task/slim-sprig@v0.0.0-20210107165309-348f09dbbbc0", + sha256 = "25a036dc8eb9f6227c2df818916f76db93eebbac88cc24bad5c960b0c60d7a08", + strip_prefix = "github.com/go-task/slim-sprig@v0.0.0-20230315185526-52ccab3ef572", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/github.com/go-task/slim-sprig/com_github_go_task_slim_sprig-v0.0.0-20210107165309-348f09dbbbc0.zip", - "http://ats.apps.svc/gomod/github.com/go-task/slim-sprig/com_github_go_task_slim_sprig-v0.0.0-20210107165309-348f09dbbbc0.zip", - "https://cache.hawkingrei.com/gomod/github.com/go-task/slim-sprig/com_github_go_task_slim_sprig-v0.0.0-20210107165309-348f09dbbbc0.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/github.com/go-task/slim-sprig/com_github_go_task_slim_sprig-v0.0.0-20210107165309-348f09dbbbc0.zip", + "http://bazel-cache.pingcap.net:8080/gomod/github.com/go-task/slim-sprig/com_github_go_task_slim_sprig-v0.0.0-20230315185526-52ccab3ef572.zip", + "http://ats.apps.svc/gomod/github.com/go-task/slim-sprig/com_github_go_task_slim_sprig-v0.0.0-20230315185526-52ccab3ef572.zip", + "https://cache.hawkingrei.com/gomod/github.com/go-task/slim-sprig/com_github_go_task_slim_sprig-v0.0.0-20230315185526-52ccab3ef572.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/github.com/go-task/slim-sprig/com_github_go_task_slim_sprig-v0.0.0-20230315185526-52ccab3ef572.zip", ], ) go_repository( @@ -2552,6 +2591,19 @@ def go_deps(): "https://storage.googleapis.com/pingcapmirror/gomod/github.com/go-xmlfmt/xmlfmt/com_github_go_xmlfmt_xmlfmt-v1.1.2.zip", ], ) + go_repository( + name = "com_github_go_zookeeper_zk", + build_file_proto_mode = "disable_global", + importpath = "github.com/go-zookeeper/zk", + sha256 = "5577b9e7924ff73c19e2c62fb6fddb9621d05f0720d0994ce8dc4be625399ca3", + strip_prefix = "github.com/go-zookeeper/zk@v1.0.3", + urls = [ + "http://bazel-cache.pingcap.net:8080/gomod/github.com/go-zookeeper/zk/com_github_go_zookeeper_zk-v1.0.3.zip", + "http://ats.apps.svc/gomod/github.com/go-zookeeper/zk/com_github_go_zookeeper_zk-v1.0.3.zip", + "https://cache.hawkingrei.com/gomod/github.com/go-zookeeper/zk/com_github_go_zookeeper_zk-v1.0.3.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/github.com/go-zookeeper/zk/com_github_go_zookeeper_zk-v1.0.3.zip", + ], + ) go_repository( name = "com_github_gobwas_glob", build_file_proto_mode = "disable_global", @@ -2569,39 +2621,39 @@ def go_deps(): name = "com_github_gobwas_httphead", build_file_proto_mode = "disable_global", importpath = "github.com/gobwas/httphead", - sha256 = "5a43ed4a7cd2b063b634f0df5311c0dfa6576683bfc1339f2c5b1b1127fc392b", - strip_prefix = "github.com/gobwas/httphead@v0.0.0-20180130184737-2c6c146eadee", + sha256 = "a4646f1d12786fee639c489219e7c667b10f7dc19578a4e7222bd17c5d9bdf8a", + strip_prefix = "github.com/gobwas/httphead@v0.1.0", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/github.com/gobwas/httphead/com_github_gobwas_httphead-v0.0.0-20180130184737-2c6c146eadee.zip", - "http://ats.apps.svc/gomod/github.com/gobwas/httphead/com_github_gobwas_httphead-v0.0.0-20180130184737-2c6c146eadee.zip", - "https://cache.hawkingrei.com/gomod/github.com/gobwas/httphead/com_github_gobwas_httphead-v0.0.0-20180130184737-2c6c146eadee.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/github.com/gobwas/httphead/com_github_gobwas_httphead-v0.0.0-20180130184737-2c6c146eadee.zip", + "http://bazel-cache.pingcap.net:8080/gomod/github.com/gobwas/httphead/com_github_gobwas_httphead-v0.1.0.zip", + "http://ats.apps.svc/gomod/github.com/gobwas/httphead/com_github_gobwas_httphead-v0.1.0.zip", + "https://cache.hawkingrei.com/gomod/github.com/gobwas/httphead/com_github_gobwas_httphead-v0.1.0.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/github.com/gobwas/httphead/com_github_gobwas_httphead-v0.1.0.zip", ], ) go_repository( name = "com_github_gobwas_pool", build_file_proto_mode = "disable_global", importpath = "github.com/gobwas/pool", - sha256 = "52604b1456b92bb310461167a3e6515562f0f4214f01ed6440e3105f78be188f", - strip_prefix = "github.com/gobwas/pool@v0.2.0", + sha256 = "79b505a9f42b141affca1eedd2edc87ae922482d052e16e3b6e5e3c9dcec89e1", + strip_prefix = "github.com/gobwas/pool@v0.2.1", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/github.com/gobwas/pool/com_github_gobwas_pool-v0.2.0.zip", - "http://ats.apps.svc/gomod/github.com/gobwas/pool/com_github_gobwas_pool-v0.2.0.zip", - "https://cache.hawkingrei.com/gomod/github.com/gobwas/pool/com_github_gobwas_pool-v0.2.0.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/github.com/gobwas/pool/com_github_gobwas_pool-v0.2.0.zip", + "http://bazel-cache.pingcap.net:8080/gomod/github.com/gobwas/pool/com_github_gobwas_pool-v0.2.1.zip", + "http://ats.apps.svc/gomod/github.com/gobwas/pool/com_github_gobwas_pool-v0.2.1.zip", + "https://cache.hawkingrei.com/gomod/github.com/gobwas/pool/com_github_gobwas_pool-v0.2.1.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/github.com/gobwas/pool/com_github_gobwas_pool-v0.2.1.zip", ], ) go_repository( name = "com_github_gobwas_ws", build_file_proto_mode = "disable_global", importpath = "github.com/gobwas/ws", - sha256 = "f9e5c26e83278f19958c68be7b76ad6711c806b6dae766fad7692d2af867bedd", - strip_prefix = "github.com/gobwas/ws@v1.0.2", + sha256 = "423d7d8b1364e1d9b0c4418905f7dfc29c092dc2db4c80fb66b695d4a002daca", + strip_prefix = "github.com/gobwas/ws@v1.2.1", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/github.com/gobwas/ws/com_github_gobwas_ws-v1.0.2.zip", - "http://ats.apps.svc/gomod/github.com/gobwas/ws/com_github_gobwas_ws-v1.0.2.zip", - "https://cache.hawkingrei.com/gomod/github.com/gobwas/ws/com_github_gobwas_ws-v1.0.2.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/github.com/gobwas/ws/com_github_gobwas_ws-v1.0.2.zip", + "http://bazel-cache.pingcap.net:8080/gomod/github.com/gobwas/ws/com_github_gobwas_ws-v1.2.1.zip", + "http://ats.apps.svc/gomod/github.com/gobwas/ws/com_github_gobwas_ws-v1.2.1.zip", + "https://cache.hawkingrei.com/gomod/github.com/gobwas/ws/com_github_gobwas_ws-v1.2.1.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/github.com/gobwas/ws/com_github_gobwas_ws-v1.2.1.zip", ], ) go_repository( @@ -2760,6 +2812,19 @@ def go_deps(): "https://storage.googleapis.com/pingcapmirror/gomod/github.com/golang-jwt/jwt/v4/com_github_golang_jwt_jwt_v4-v4.4.2.zip", ], ) + go_repository( + name = "com_github_golang_jwt_jwt_v5", + build_file_proto_mode = "disable_global", + importpath = "github.com/golang-jwt/jwt/v5", + sha256 = "d7d763fe73d36361b7a005a3fa3e7bc908ac395c490e1b5b0fdbc4a65272f0b8", + strip_prefix = "github.com/golang-jwt/jwt/v5@v5.0.0", + urls = [ + "http://bazel-cache.pingcap.net:8080/gomod/github.com/golang-jwt/jwt/v5/com_github_golang_jwt_jwt_v5-v5.0.0.zip", + "http://ats.apps.svc/gomod/github.com/golang-jwt/jwt/v5/com_github_golang_jwt_jwt_v5-v5.0.0.zip", + "https://cache.hawkingrei.com/gomod/github.com/golang-jwt/jwt/v5/com_github_golang_jwt_jwt_v5-v5.0.0.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/github.com/golang-jwt/jwt/v5/com_github_golang_jwt_jwt_v5-v5.0.0.zip", + ], + ) go_repository( name = "com_github_golang_mock", build_file_proto_mode = "disable_global", @@ -2986,16 +3051,16 @@ def go_deps(): ], ) go_repository( - name = "com_github_google_gnostic", + name = "com_github_google_gnostic_models", build_file_proto_mode = "disable_global", - importpath = "github.com/google/gnostic", - sha256 = "34d7aa522313f30b48196821dab8a9ec788349d7be9c8d3167d4b9b328cd8ec8", - strip_prefix = "github.com/google/gnostic@v0.5.7-v3refs", + importpath = "github.com/google/gnostic-models", + sha256 = "5276180bd184f64676867fc2f64a583175968c507d404be6b7f1261ead229484", + strip_prefix = "github.com/google/gnostic-models@v0.6.8", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/github.com/google/gnostic/com_github_google_gnostic-v0.5.7-v3refs.zip", - "http://ats.apps.svc/gomod/github.com/google/gnostic/com_github_google_gnostic-v0.5.7-v3refs.zip", - "https://cache.hawkingrei.com/gomod/github.com/google/gnostic/com_github_google_gnostic-v0.5.7-v3refs.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/github.com/google/gnostic/com_github_google_gnostic-v0.5.7-v3refs.zip", + "http://bazel-cache.pingcap.net:8080/gomod/github.com/google/gnostic-models/com_github_google_gnostic_models-v0.6.8.zip", + "http://ats.apps.svc/gomod/github.com/google/gnostic-models/com_github_google_gnostic_models-v0.6.8.zip", + "https://cache.hawkingrei.com/gomod/github.com/google/gnostic-models/com_github_google_gnostic_models-v0.6.8.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/github.com/google/gnostic-models/com_github_google_gnostic_models-v0.6.8.zip", ], ) go_repository( @@ -3054,13 +3119,13 @@ def go_deps(): name = "com_github_google_gofuzz", build_file_proto_mode = "disable_global", importpath = "github.com/google/gofuzz", - sha256 = "5c41453c0e2df199e899097e95d75f19fdda591e977233f47fab15b84e352b04", - strip_prefix = "github.com/google/gofuzz@v1.1.0", + sha256 = "5948f40af1923d8f98dc1d4191311030e40e0057fb255df19ebc0360f2faac16", + strip_prefix = "github.com/google/gofuzz@v1.2.0", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/github.com/google/gofuzz/com_github_google_gofuzz-v1.1.0.zip", - "http://ats.apps.svc/gomod/github.com/google/gofuzz/com_github_google_gofuzz-v1.1.0.zip", - "https://cache.hawkingrei.com/gomod/github.com/google/gofuzz/com_github_google_gofuzz-v1.1.0.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/github.com/google/gofuzz/com_github_google_gofuzz-v1.1.0.zip", + "http://bazel-cache.pingcap.net:8080/gomod/github.com/google/gofuzz/com_github_google_gofuzz-v1.2.0.zip", + "http://ats.apps.svc/gomod/github.com/google/gofuzz/com_github_google_gofuzz-v1.2.0.zip", + "https://cache.hawkingrei.com/gomod/github.com/google/gofuzz/com_github_google_gofuzz-v1.2.0.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/github.com/google/gofuzz/com_github_google_gofuzz-v1.2.0.zip", ], ) go_repository( @@ -3106,13 +3171,13 @@ def go_deps(): name = "com_github_google_pprof", build_file_proto_mode = "disable_global", importpath = "github.com/google/pprof", - sha256 = "8638c11ff6cfa719453d52f3ccc4159a6749548469b59fff7f6f46b81d4ea434", - strip_prefix = "github.com/google/pprof@v0.0.0-20211122183932-1daafda22083", + sha256 = "60f026eec86d52690ca1ee088f62bceafc25a93073ab62994434542ff9d708d6", + strip_prefix = "github.com/google/pprof@v0.0.0-20230926050212-f7f687d19a98", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/github.com/google/pprof/com_github_google_pprof-v0.0.0-20211122183932-1daafda22083.zip", - "http://ats.apps.svc/gomod/github.com/google/pprof/com_github_google_pprof-v0.0.0-20211122183932-1daafda22083.zip", - "https://cache.hawkingrei.com/gomod/github.com/google/pprof/com_github_google_pprof-v0.0.0-20211122183932-1daafda22083.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/github.com/google/pprof/com_github_google_pprof-v0.0.0-20211122183932-1daafda22083.zip", + "http://bazel-cache.pingcap.net:8080/gomod/github.com/google/pprof/com_github_google_pprof-v0.0.0-20230926050212-f7f687d19a98.zip", + "http://ats.apps.svc/gomod/github.com/google/pprof/com_github_google_pprof-v0.0.0-20230926050212-f7f687d19a98.zip", + "https://cache.hawkingrei.com/gomod/github.com/google/pprof/com_github_google_pprof-v0.0.0-20230926050212-f7f687d19a98.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/github.com/google/pprof/com_github_google_pprof-v0.0.0-20230926050212-f7f687d19a98.zip", ], ) go_repository( @@ -3171,13 +3236,13 @@ def go_deps(): name = "com_github_google_uuid", build_file_proto_mode = "disable_global", importpath = "github.com/google/uuid", - sha256 = "15ff3397648edf4999d37359b3fc041212d49bcd6b457327c0f8dff19f594050", - strip_prefix = "github.com/google/uuid@v1.4.0", + sha256 = "668a7373c2590b9406de3c1652a564e292446fa39f3fbf6815f4c63d3c1a6585", + strip_prefix = "github.com/google/uuid@v1.5.0", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/github.com/google/uuid/com_github_google_uuid-v1.4.0.zip", - "http://ats.apps.svc/gomod/github.com/google/uuid/com_github_google_uuid-v1.4.0.zip", - "https://cache.hawkingrei.com/gomod/github.com/google/uuid/com_github_google_uuid-v1.4.0.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/github.com/google/uuid/com_github_google_uuid-v1.4.0.zip", + "http://bazel-cache.pingcap.net:8080/gomod/github.com/google/uuid/com_github_google_uuid-v1.5.0.zip", + "http://ats.apps.svc/gomod/github.com/google/uuid/com_github_google_uuid-v1.5.0.zip", + "https://cache.hawkingrei.com/gomod/github.com/google/uuid/com_github_google_uuid-v1.5.0.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/github.com/google/uuid/com_github_google_uuid-v1.5.0.zip", ], ) go_repository( @@ -3206,30 +3271,17 @@ def go_deps(): "https://storage.googleapis.com/pingcapmirror/gomod/github.com/googleapis/gax-go/v2/com_github_googleapis_gax_go_v2-v2.12.0.zip", ], ) - go_repository( - name = "com_github_googleapis_gnostic", - build_file_proto_mode = "disable_global", - importpath = "github.com/googleapis/gnostic", - sha256 = "6a594aca0b27b1618faa8cfe5f2c7b8385258831d409276ee6024ba7a7f70b42", - strip_prefix = "github.com/googleapis/gnostic@v0.2.0", - urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/github.com/googleapis/gnostic/com_github_googleapis_gnostic-v0.2.0.zip", - "http://ats.apps.svc/gomod/github.com/googleapis/gnostic/com_github_googleapis_gnostic-v0.2.0.zip", - "https://cache.hawkingrei.com/gomod/github.com/googleapis/gnostic/com_github_googleapis_gnostic-v0.2.0.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/github.com/googleapis/gnostic/com_github_googleapis_gnostic-v0.2.0.zip", - ], - ) go_repository( name = "com_github_gophercloud_gophercloud", build_file_proto_mode = "disable_global", importpath = "github.com/gophercloud/gophercloud", - sha256 = "34a191cae40881f94769d10990921db8092af81a123214969f668e9c8a79ecd7", - strip_prefix = "github.com/gophercloud/gophercloud@v0.0.0-20190301152420-fca40860790e", + sha256 = "4d420d960690f5dcde091c02fa3131ba1263ba49e57fe8fb52582fdb382ed176", + strip_prefix = "github.com/gophercloud/gophercloud@v1.7.0", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/github.com/gophercloud/gophercloud/com_github_gophercloud_gophercloud-v0.0.0-20190301152420-fca40860790e.zip", - "http://ats.apps.svc/gomod/github.com/gophercloud/gophercloud/com_github_gophercloud_gophercloud-v0.0.0-20190301152420-fca40860790e.zip", - "https://cache.hawkingrei.com/gomod/github.com/gophercloud/gophercloud/com_github_gophercloud_gophercloud-v0.0.0-20190301152420-fca40860790e.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/github.com/gophercloud/gophercloud/com_github_gophercloud_gophercloud-v0.0.0-20190301152420-fca40860790e.zip", + "http://bazel-cache.pingcap.net:8080/gomod/github.com/gophercloud/gophercloud/com_github_gophercloud_gophercloud-v1.7.0.zip", + "http://ats.apps.svc/gomod/github.com/gophercloud/gophercloud/com_github_gophercloud_gophercloud-v1.7.0.zip", + "https://cache.hawkingrei.com/gomod/github.com/gophercloud/gophercloud/com_github_gophercloud_gophercloud-v1.7.0.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/github.com/gophercloud/gophercloud/com_github_gophercloud_gophercloud-v1.7.0.zip", ], ) go_repository( @@ -3258,19 +3310,6 @@ def go_deps(): "https://storage.googleapis.com/pingcapmirror/gomod/github.com/gordonklaus/ineffassign/com_github_gordonklaus_ineffassign-v0.0.0-20230610083614-0e73809eb601.zip", ], ) - go_repository( - name = "com_github_gorilla_context", - build_file_proto_mode = "disable_global", - importpath = "github.com/gorilla/context", - sha256 = "4ec8e01fe741a931edeebdee9348ffb49b5cc565ca245551d0d20b67062e6f0b", - strip_prefix = "github.com/gorilla/context@v1.1.1", - urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/github.com/gorilla/context/com_github_gorilla_context-v1.1.1.zip", - "http://ats.apps.svc/gomod/github.com/gorilla/context/com_github_gorilla_context-v1.1.1.zip", - "https://cache.hawkingrei.com/gomod/github.com/gorilla/context/com_github_gorilla_context-v1.1.1.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/github.com/gorilla/context/com_github_gorilla_context-v1.1.1.zip", - ], - ) go_repository( name = "com_github_gorilla_handlers", build_file_proto_mode = "disable_global", @@ -3327,13 +3366,13 @@ def go_deps(): name = "com_github_gorilla_websocket", build_file_proto_mode = "disable_global", importpath = "github.com/gorilla/websocket", - sha256 = "d0d1728deaa06dac190bf4964c9c6395923403eae337cb3305d6dda18ef07337", - strip_prefix = "github.com/gorilla/websocket@v1.4.2", + sha256 = "690ea4d1ffe00ab5fcb6d63e2ec3783fc5a58e9d0f1789ea5dc9b6663deee6d5", + strip_prefix = "github.com/gorilla/websocket@v1.5.0", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/github.com/gorilla/websocket/com_github_gorilla_websocket-v1.4.2.zip", - "http://ats.apps.svc/gomod/github.com/gorilla/websocket/com_github_gorilla_websocket-v1.4.2.zip", - "https://cache.hawkingrei.com/gomod/github.com/gorilla/websocket/com_github_gorilla_websocket-v1.4.2.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/github.com/gorilla/websocket/com_github_gorilla_websocket-v1.4.2.zip", + "http://bazel-cache.pingcap.net:8080/gomod/github.com/gorilla/websocket/com_github_gorilla_websocket-v1.5.0.zip", + "http://ats.apps.svc/gomod/github.com/gorilla/websocket/com_github_gorilla_websocket-v1.5.0.zip", + "https://cache.hawkingrei.com/gomod/github.com/gorilla/websocket/com_github_gorilla_websocket-v1.5.0.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/github.com/gorilla/websocket/com_github_gorilla_websocket-v1.5.0.zip", ], ) go_repository( @@ -3401,6 +3440,19 @@ def go_deps(): "https://storage.googleapis.com/pingcapmirror/gomod/github.com/gostaticanalysis/testutil/com_github_gostaticanalysis_testutil-v0.4.0.zip", ], ) + go_repository( + name = "com_github_grafana_regexp", + build_file_proto_mode = "disable_global", + importpath = "github.com/grafana/regexp", + sha256 = "32777ad2e39bac06b359b0d93460530a41a1e0cb7cfd92faac82feb364ce8c91", + strip_prefix = "github.com/grafana/regexp@v0.0.0-20221122212121-6b5c0a4cb7fd", + urls = [ + "http://bazel-cache.pingcap.net:8080/gomod/github.com/grafana/regexp/com_github_grafana_regexp-v0.0.0-20221122212121-6b5c0a4cb7fd.zip", + "http://ats.apps.svc/gomod/github.com/grafana/regexp/com_github_grafana_regexp-v0.0.0-20221122212121-6b5c0a4cb7fd.zip", + "https://cache.hawkingrei.com/gomod/github.com/grafana/regexp/com_github_grafana_regexp-v0.0.0-20221122212121-6b5c0a4cb7fd.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/github.com/grafana/regexp/com_github_grafana_regexp-v0.0.0-20221122212121-6b5c0a4cb7fd.zip", + ], + ) go_repository( name = "com_github_grpc_ecosystem_go_grpc_middleware", build_file_proto_mode = "disable_global", @@ -3446,94 +3498,98 @@ def go_deps(): ], ) go_repository( - name = "com_github_grpc_ecosystem_grpc_opentracing", + name = "com_github_grpc_ecosystem_grpc_gateway_v2", build_file_proto_mode = "disable_global", - importpath = "github.com/grpc-ecosystem/grpc-opentracing", - sha256 = "0606bde24e978e9cd91ae45ca9e5222ce695c21a07ae02e77546496bf23b1c62", - strip_prefix = "github.com/grpc-ecosystem/grpc-opentracing@v0.0.0-20180507213350-8e809c8a8645", + importpath = "github.com/grpc-ecosystem/grpc-gateway/v2", + patch_args = ["-p1"], + patches = [ + "//build/patches:com_github_grpc_ecosystem_grpc_gateway_v2.patch", + ], + sha256 = "12995bc9a8d7a18ff3fb7fe3575dd2d9b7447d2f2749f0dbd99ef2efbaf9a6e2", + strip_prefix = "github.com/grpc-ecosystem/grpc-gateway/v2@v2.16.0", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/github.com/grpc-ecosystem/grpc-opentracing/com_github_grpc_ecosystem_grpc_opentracing-v0.0.0-20180507213350-8e809c8a8645.zip", - "http://ats.apps.svc/gomod/github.com/grpc-ecosystem/grpc-opentracing/com_github_grpc_ecosystem_grpc_opentracing-v0.0.0-20180507213350-8e809c8a8645.zip", - "https://cache.hawkingrei.com/gomod/github.com/grpc-ecosystem/grpc-opentracing/com_github_grpc_ecosystem_grpc_opentracing-v0.0.0-20180507213350-8e809c8a8645.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/github.com/grpc-ecosystem/grpc-opentracing/com_github_grpc_ecosystem_grpc_opentracing-v0.0.0-20180507213350-8e809c8a8645.zip", + "http://bazel-cache.pingcap.net:8080/gomod/github.com/grpc-ecosystem/grpc-gateway/v2/com_github_grpc_ecosystem_grpc_gateway_v2-v2.16.0.zip", + "http://ats.apps.svc/gomod/github.com/grpc-ecosystem/grpc-gateway/v2/com_github_grpc_ecosystem_grpc_gateway_v2-v2.16.0.zip", + "https://cache.hawkingrei.com/gomod/github.com/grpc-ecosystem/grpc-gateway/v2/com_github_grpc_ecosystem_grpc_gateway_v2-v2.16.0.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/github.com/grpc-ecosystem/grpc-gateway/v2/com_github_grpc_ecosystem_grpc_gateway_v2-v2.16.0.zip", ], ) go_repository( name = "com_github_hashicorp_consul_api", build_file_proto_mode = "disable_global", importpath = "github.com/hashicorp/consul/api", - sha256 = "3971a179e700f1a839efe3b5a61d782d07124f7a4d2ad290ad37eaa888907a19", - strip_prefix = "github.com/hashicorp/consul/api@v1.1.0", + sha256 = "8b2511a1f51609c6ead859a847f071cf03c93bf7a9dc7dcd95727b65c0647c3d", + strip_prefix = "github.com/hashicorp/consul/api@v1.25.1", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/github.com/hashicorp/consul/api/com_github_hashicorp_consul_api-v1.1.0.zip", - "http://ats.apps.svc/gomod/github.com/hashicorp/consul/api/com_github_hashicorp_consul_api-v1.1.0.zip", - "https://cache.hawkingrei.com/gomod/github.com/hashicorp/consul/api/com_github_hashicorp_consul_api-v1.1.0.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/github.com/hashicorp/consul/api/com_github_hashicorp_consul_api-v1.1.0.zip", + "http://bazel-cache.pingcap.net:8080/gomod/github.com/hashicorp/consul/api/com_github_hashicorp_consul_api-v1.25.1.zip", + "http://ats.apps.svc/gomod/github.com/hashicorp/consul/api/com_github_hashicorp_consul_api-v1.25.1.zip", + "https://cache.hawkingrei.com/gomod/github.com/hashicorp/consul/api/com_github_hashicorp_consul_api-v1.25.1.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/github.com/hashicorp/consul/api/com_github_hashicorp_consul_api-v1.25.1.zip", ], ) go_repository( - name = "com_github_hashicorp_consul_sdk", + name = "com_github_hashicorp_cronexpr", build_file_proto_mode = "disable_global", - importpath = "github.com/hashicorp/consul/sdk", - sha256 = "85188b2110551574646fcce5aa0a72dbde588596f3ebcf14964a3c4ce9c354ea", - strip_prefix = "github.com/hashicorp/consul/sdk@v0.1.1", + importpath = "github.com/hashicorp/cronexpr", + sha256 = "d4a26ea051d2e1c3518ae9bae405db83f91b4b3bf2cb9fec903aff10e447cfa7", + strip_prefix = "github.com/hashicorp/cronexpr@v1.1.2", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/github.com/hashicorp/consul/sdk/com_github_hashicorp_consul_sdk-v0.1.1.zip", - "http://ats.apps.svc/gomod/github.com/hashicorp/consul/sdk/com_github_hashicorp_consul_sdk-v0.1.1.zip", - "https://cache.hawkingrei.com/gomod/github.com/hashicorp/consul/sdk/com_github_hashicorp_consul_sdk-v0.1.1.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/github.com/hashicorp/consul/sdk/com_github_hashicorp_consul_sdk-v0.1.1.zip", + "http://bazel-cache.pingcap.net:8080/gomod/github.com/hashicorp/cronexpr/com_github_hashicorp_cronexpr-v1.1.2.zip", + "http://ats.apps.svc/gomod/github.com/hashicorp/cronexpr/com_github_hashicorp_cronexpr-v1.1.2.zip", + "https://cache.hawkingrei.com/gomod/github.com/hashicorp/cronexpr/com_github_hashicorp_cronexpr-v1.1.2.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/github.com/hashicorp/cronexpr/com_github_hashicorp_cronexpr-v1.1.2.zip", ], ) go_repository( name = "com_github_hashicorp_errwrap", build_file_proto_mode = "disable_global", importpath = "github.com/hashicorp/errwrap", - sha256 = "ccdf4c90f894d8a5fde4e79d5828c5d27a13e9f7ce3006dd72ce76e6e17cdeb2", - strip_prefix = "github.com/hashicorp/errwrap@v1.0.0", + sha256 = "209ae99bc039443e28e4d6bb66517d1756d9468b7578d31f1b63a28103d8e18c", + strip_prefix = "github.com/hashicorp/errwrap@v1.1.0", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/github.com/hashicorp/errwrap/com_github_hashicorp_errwrap-v1.0.0.zip", - "http://ats.apps.svc/gomod/github.com/hashicorp/errwrap/com_github_hashicorp_errwrap-v1.0.0.zip", - "https://cache.hawkingrei.com/gomod/github.com/hashicorp/errwrap/com_github_hashicorp_errwrap-v1.0.0.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/github.com/hashicorp/errwrap/com_github_hashicorp_errwrap-v1.0.0.zip", + "http://bazel-cache.pingcap.net:8080/gomod/github.com/hashicorp/errwrap/com_github_hashicorp_errwrap-v1.1.0.zip", + "http://ats.apps.svc/gomod/github.com/hashicorp/errwrap/com_github_hashicorp_errwrap-v1.1.0.zip", + "https://cache.hawkingrei.com/gomod/github.com/hashicorp/errwrap/com_github_hashicorp_errwrap-v1.1.0.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/github.com/hashicorp/errwrap/com_github_hashicorp_errwrap-v1.1.0.zip", ], ) go_repository( name = "com_github_hashicorp_go_cleanhttp", build_file_proto_mode = "disable_global", importpath = "github.com/hashicorp/go-cleanhttp", - sha256 = "e3cc9964b0bc80c6156d6fb064abcb62ff8c00df8be8009b6f6d3aefc2776a23", - strip_prefix = "github.com/hashicorp/go-cleanhttp@v0.5.1", + sha256 = "e9f3dcfcb33172ba499b4f8e888169252d7f1e072082182124a6e2053523f7df", + strip_prefix = "github.com/hashicorp/go-cleanhttp@v0.5.2", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/github.com/hashicorp/go-cleanhttp/com_github_hashicorp_go_cleanhttp-v0.5.1.zip", - "http://ats.apps.svc/gomod/github.com/hashicorp/go-cleanhttp/com_github_hashicorp_go_cleanhttp-v0.5.1.zip", - "https://cache.hawkingrei.com/gomod/github.com/hashicorp/go-cleanhttp/com_github_hashicorp_go_cleanhttp-v0.5.1.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/github.com/hashicorp/go-cleanhttp/com_github_hashicorp_go_cleanhttp-v0.5.1.zip", + "http://bazel-cache.pingcap.net:8080/gomod/github.com/hashicorp/go-cleanhttp/com_github_hashicorp_go_cleanhttp-v0.5.2.zip", + "http://ats.apps.svc/gomod/github.com/hashicorp/go-cleanhttp/com_github_hashicorp_go_cleanhttp-v0.5.2.zip", + "https://cache.hawkingrei.com/gomod/github.com/hashicorp/go-cleanhttp/com_github_hashicorp_go_cleanhttp-v0.5.2.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/github.com/hashicorp/go-cleanhttp/com_github_hashicorp_go_cleanhttp-v0.5.2.zip", ], ) go_repository( - name = "com_github_hashicorp_go_immutable_radix", + name = "com_github_hashicorp_go_hclog", build_file_proto_mode = "disable_global", - importpath = "github.com/hashicorp/go-immutable-radix", - sha256 = "ab5d08582870e7177a74ba2c84c327aece8655cbd94653f801a0551156bb8a9c", - strip_prefix = "github.com/hashicorp/go-immutable-radix@v1.0.0", + importpath = "github.com/hashicorp/go-hclog", + sha256 = "37eae99309c542b32aa7e28bcd0236e1ded8acce4aadc25d8e5a8ab03066482d", + strip_prefix = "github.com/hashicorp/go-hclog@v1.5.0", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/github.com/hashicorp/go-immutable-radix/com_github_hashicorp_go_immutable_radix-v1.0.0.zip", - "http://ats.apps.svc/gomod/github.com/hashicorp/go-immutable-radix/com_github_hashicorp_go_immutable_radix-v1.0.0.zip", - "https://cache.hawkingrei.com/gomod/github.com/hashicorp/go-immutable-radix/com_github_hashicorp_go_immutable_radix-v1.0.0.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/github.com/hashicorp/go-immutable-radix/com_github_hashicorp_go_immutable_radix-v1.0.0.zip", + "http://bazel-cache.pingcap.net:8080/gomod/github.com/hashicorp/go-hclog/com_github_hashicorp_go_hclog-v1.5.0.zip", + "http://ats.apps.svc/gomod/github.com/hashicorp/go-hclog/com_github_hashicorp_go_hclog-v1.5.0.zip", + "https://cache.hawkingrei.com/gomod/github.com/hashicorp/go-hclog/com_github_hashicorp_go_hclog-v1.5.0.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/github.com/hashicorp/go-hclog/com_github_hashicorp_go_hclog-v1.5.0.zip", ], ) go_repository( - name = "com_github_hashicorp_go_msgpack", + name = "com_github_hashicorp_go_immutable_radix", build_file_proto_mode = "disable_global", - importpath = "github.com/hashicorp/go-msgpack", - sha256 = "24cb41ed887c67c361bfa7b87f79eff4d07152196a015d29ae2e1e51c14066d7", - strip_prefix = "github.com/hashicorp/go-msgpack@v0.5.4", + importpath = "github.com/hashicorp/go-immutable-radix", + sha256 = "47f3d79b57082d5db3f966547ad4de2a00544dfb362790fbf2cef1a161b4de3f", + strip_prefix = "github.com/hashicorp/go-immutable-radix@v1.3.1", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/github.com/hashicorp/go-msgpack/com_github_hashicorp_go_msgpack-v0.5.4.zip", - "http://ats.apps.svc/gomod/github.com/hashicorp/go-msgpack/com_github_hashicorp_go_msgpack-v0.5.4.zip", - "https://cache.hawkingrei.com/gomod/github.com/hashicorp/go-msgpack/com_github_hashicorp_go_msgpack-v0.5.4.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/github.com/hashicorp/go-msgpack/com_github_hashicorp_go_msgpack-v0.5.4.zip", + "http://bazel-cache.pingcap.net:8080/gomod/github.com/hashicorp/go-immutable-radix/com_github_hashicorp_go_immutable_radix-v1.3.1.zip", + "http://ats.apps.svc/gomod/github.com/hashicorp/go-immutable-radix/com_github_hashicorp_go_immutable_radix-v1.3.1.zip", + "https://cache.hawkingrei.com/gomod/github.com/hashicorp/go-immutable-radix/com_github_hashicorp_go_immutable_radix-v1.3.1.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/github.com/hashicorp/go-immutable-radix/com_github_hashicorp_go_immutable_radix-v1.3.1.zip", ], ) go_repository( @@ -3550,55 +3606,29 @@ def go_deps(): ], ) go_repository( - name = "com_github_hashicorp_go_net", + name = "com_github_hashicorp_go_retryablehttp", build_file_proto_mode = "disable_global", - importpath = "github.com/hashicorp/go.net", - sha256 = "71564aa3cb6e2820ee31e4d9e264e4ed889c7916f958b2f54c6f3004d4fcd8d2", - strip_prefix = "github.com/hashicorp/go.net@v0.0.1", + importpath = "github.com/hashicorp/go-retryablehttp", + sha256 = "00f6d85c5c8b327f56d49ad48ef1d2df94affea340ca46ce827415ba75db4712", + strip_prefix = "github.com/hashicorp/go-retryablehttp@v0.7.4", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/github.com/hashicorp/go.net/com_github_hashicorp_go_net-v0.0.1.zip", - "http://ats.apps.svc/gomod/github.com/hashicorp/go.net/com_github_hashicorp_go_net-v0.0.1.zip", - "https://cache.hawkingrei.com/gomod/github.com/hashicorp/go.net/com_github_hashicorp_go_net-v0.0.1.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/github.com/hashicorp/go.net/com_github_hashicorp_go_net-v0.0.1.zip", + "http://bazel-cache.pingcap.net:8080/gomod/github.com/hashicorp/go-retryablehttp/com_github_hashicorp_go_retryablehttp-v0.7.4.zip", + "http://ats.apps.svc/gomod/github.com/hashicorp/go-retryablehttp/com_github_hashicorp_go_retryablehttp-v0.7.4.zip", + "https://cache.hawkingrei.com/gomod/github.com/hashicorp/go-retryablehttp/com_github_hashicorp_go_retryablehttp-v0.7.4.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/github.com/hashicorp/go-retryablehttp/com_github_hashicorp_go_retryablehttp-v0.7.4.zip", ], ) go_repository( name = "com_github_hashicorp_go_rootcerts", build_file_proto_mode = "disable_global", importpath = "github.com/hashicorp/go-rootcerts", - sha256 = "4393b0b9cd741e00de5624d5124cf054bf50c57231d4b1caff84c8a4d16c6a47", - strip_prefix = "github.com/hashicorp/go-rootcerts@v1.0.0", - urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/github.com/hashicorp/go-rootcerts/com_github_hashicorp_go_rootcerts-v1.0.0.zip", - "http://ats.apps.svc/gomod/github.com/hashicorp/go-rootcerts/com_github_hashicorp_go_rootcerts-v1.0.0.zip", - "https://cache.hawkingrei.com/gomod/github.com/hashicorp/go-rootcerts/com_github_hashicorp_go_rootcerts-v1.0.0.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/github.com/hashicorp/go-rootcerts/com_github_hashicorp_go_rootcerts-v1.0.0.zip", - ], - ) - go_repository( - name = "com_github_hashicorp_go_sockaddr", - build_file_proto_mode = "disable_global", - importpath = "github.com/hashicorp/go-sockaddr", - sha256 = "50c1b60863b0cd31d03b26d3975f76cab55466666c067cd1823481a61f19af33", - strip_prefix = "github.com/hashicorp/go-sockaddr@v1.0.2", + sha256 = "864a48e642e87a273fb5ef60bb3575bd74a7090510f93143163fa6700be31948", + strip_prefix = "github.com/hashicorp/go-rootcerts@v1.0.2", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/github.com/hashicorp/go-sockaddr/com_github_hashicorp_go_sockaddr-v1.0.2.zip", - "http://ats.apps.svc/gomod/github.com/hashicorp/go-sockaddr/com_github_hashicorp_go_sockaddr-v1.0.2.zip", - "https://cache.hawkingrei.com/gomod/github.com/hashicorp/go-sockaddr/com_github_hashicorp_go_sockaddr-v1.0.2.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/github.com/hashicorp/go-sockaddr/com_github_hashicorp_go_sockaddr-v1.0.2.zip", - ], - ) - go_repository( - name = "com_github_hashicorp_go_syslog", - build_file_proto_mode = "disable_global", - importpath = "github.com/hashicorp/go-syslog", - sha256 = "a0ca8b61ea365e9ecdca513b94f200aef3ff68b4c95d9dabc88ca25fcb33bce6", - strip_prefix = "github.com/hashicorp/go-syslog@v1.0.0", - urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/github.com/hashicorp/go-syslog/com_github_hashicorp_go_syslog-v1.0.0.zip", - "http://ats.apps.svc/gomod/github.com/hashicorp/go-syslog/com_github_hashicorp_go_syslog-v1.0.0.zip", - "https://cache.hawkingrei.com/gomod/github.com/hashicorp/go-syslog/com_github_hashicorp_go_syslog-v1.0.0.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/github.com/hashicorp/go-syslog/com_github_hashicorp_go_syslog-v1.0.0.zip", + "http://bazel-cache.pingcap.net:8080/gomod/github.com/hashicorp/go-rootcerts/com_github_hashicorp_go_rootcerts-v1.0.2.zip", + "http://ats.apps.svc/gomod/github.com/hashicorp/go-rootcerts/com_github_hashicorp_go_rootcerts-v1.0.2.zip", + "https://cache.hawkingrei.com/gomod/github.com/hashicorp/go-rootcerts/com_github_hashicorp_go_rootcerts-v1.0.2.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/github.com/hashicorp/go-rootcerts/com_github_hashicorp_go_rootcerts-v1.0.2.zip", ], ) go_repository( @@ -3631,13 +3661,13 @@ def go_deps(): name = "com_github_hashicorp_golang_lru", build_file_proto_mode = "disable_global", importpath = "github.com/hashicorp/golang-lru", - sha256 = "0f8aaf311e48fba046920d38b999c066da69997b479f4eca126fe968899717da", - strip_prefix = "github.com/hashicorp/golang-lru@v0.5.1", + sha256 = "75a21bee633745563dc3161386b2245fc126f882d2e5d2d97c0c6899511a5faf", + strip_prefix = "github.com/hashicorp/golang-lru@v0.6.0", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/github.com/hashicorp/golang-lru/com_github_hashicorp_golang_lru-v0.5.1.zip", - "http://ats.apps.svc/gomod/github.com/hashicorp/golang-lru/com_github_hashicorp_golang_lru-v0.5.1.zip", - "https://cache.hawkingrei.com/gomod/github.com/hashicorp/golang-lru/com_github_hashicorp_golang_lru-v0.5.1.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/github.com/hashicorp/golang-lru/com_github_hashicorp_golang_lru-v0.5.1.zip", + "http://bazel-cache.pingcap.net:8080/gomod/github.com/hashicorp/golang-lru/com_github_hashicorp_golang_lru-v0.6.0.zip", + "http://ats.apps.svc/gomod/github.com/hashicorp/golang-lru/com_github_hashicorp_golang_lru-v0.6.0.zip", + "https://cache.hawkingrei.com/gomod/github.com/hashicorp/golang-lru/com_github_hashicorp_golang_lru-v0.6.0.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/github.com/hashicorp/golang-lru/com_github_hashicorp_golang_lru-v0.6.0.zip", ], ) go_repository( @@ -3654,55 +3684,29 @@ def go_deps(): ], ) go_repository( - name = "com_github_hashicorp_logutils", + name = "com_github_hashicorp_nomad_api", build_file_proto_mode = "disable_global", - importpath = "github.com/hashicorp/logutils", - sha256 = "0e88424578d1d6b7793b63d30c180a353ce8041701d25dc7c3bcd9841c36db5b", - strip_prefix = "github.com/hashicorp/logutils@v1.0.0", + importpath = "github.com/hashicorp/nomad/api", + sha256 = "84f0a19132b5bc9b3694d113d0bd551a605717728f6b13a474db9bfbec502bc6", + strip_prefix = "github.com/hashicorp/nomad/api@v0.0.0-20230721134942-515895c7690c", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/github.com/hashicorp/logutils/com_github_hashicorp_logutils-v1.0.0.zip", - "http://ats.apps.svc/gomod/github.com/hashicorp/logutils/com_github_hashicorp_logutils-v1.0.0.zip", - "https://cache.hawkingrei.com/gomod/github.com/hashicorp/logutils/com_github_hashicorp_logutils-v1.0.0.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/github.com/hashicorp/logutils/com_github_hashicorp_logutils-v1.0.0.zip", - ], - ) - go_repository( - name = "com_github_hashicorp_mdns", - build_file_proto_mode = "disable_global", - importpath = "github.com/hashicorp/mdns", - sha256 = "a1e1440d9c4189636b6cd30ec7592beab68139a4d87e580f5a1fed029778bdc9", - strip_prefix = "github.com/hashicorp/mdns@v1.0.0", - urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/github.com/hashicorp/mdns/com_github_hashicorp_mdns-v1.0.0.zip", - "http://ats.apps.svc/gomod/github.com/hashicorp/mdns/com_github_hashicorp_mdns-v1.0.0.zip", - "https://cache.hawkingrei.com/gomod/github.com/hashicorp/mdns/com_github_hashicorp_mdns-v1.0.0.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/github.com/hashicorp/mdns/com_github_hashicorp_mdns-v1.0.0.zip", - ], - ) - go_repository( - name = "com_github_hashicorp_memberlist", - build_file_proto_mode = "disable_global", - importpath = "github.com/hashicorp/memberlist", - sha256 = "9f83e052b0a5d96f6d8144a40c297aea37137bef7f58aa496bc5eab4e0c54e0b", - strip_prefix = "github.com/hashicorp/memberlist@v0.1.3", - urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/github.com/hashicorp/memberlist/com_github_hashicorp_memberlist-v0.1.3.zip", - "http://ats.apps.svc/gomod/github.com/hashicorp/memberlist/com_github_hashicorp_memberlist-v0.1.3.zip", - "https://cache.hawkingrei.com/gomod/github.com/hashicorp/memberlist/com_github_hashicorp_memberlist-v0.1.3.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/github.com/hashicorp/memberlist/com_github_hashicorp_memberlist-v0.1.3.zip", + "http://bazel-cache.pingcap.net:8080/gomod/github.com/hashicorp/nomad/api/com_github_hashicorp_nomad_api-v0.0.0-20230721134942-515895c7690c.zip", + "http://ats.apps.svc/gomod/github.com/hashicorp/nomad/api/com_github_hashicorp_nomad_api-v0.0.0-20230721134942-515895c7690c.zip", + "https://cache.hawkingrei.com/gomod/github.com/hashicorp/nomad/api/com_github_hashicorp_nomad_api-v0.0.0-20230721134942-515895c7690c.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/github.com/hashicorp/nomad/api/com_github_hashicorp_nomad_api-v0.0.0-20230721134942-515895c7690c.zip", ], ) go_repository( name = "com_github_hashicorp_serf", build_file_proto_mode = "disable_global", importpath = "github.com/hashicorp/serf", - sha256 = "0f431658e69625f61defd36073e893ce21f04fe5a96484b812d47e32d4154be0", - strip_prefix = "github.com/hashicorp/serf@v0.8.2", + sha256 = "661b6ad5df497dcda0f581607b003e40646ef9f3ca09d12bdeec7cb3d16ad370", + strip_prefix = "github.com/hashicorp/serf@v0.10.1", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/github.com/hashicorp/serf/com_github_hashicorp_serf-v0.8.2.zip", - "http://ats.apps.svc/gomod/github.com/hashicorp/serf/com_github_hashicorp_serf-v0.8.2.zip", - "https://cache.hawkingrei.com/gomod/github.com/hashicorp/serf/com_github_hashicorp_serf-v0.8.2.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/github.com/hashicorp/serf/com_github_hashicorp_serf-v0.8.2.zip", + "http://bazel-cache.pingcap.net:8080/gomod/github.com/hashicorp/serf/com_github_hashicorp_serf-v0.10.1.zip", + "http://ats.apps.svc/gomod/github.com/hashicorp/serf/com_github_hashicorp_serf-v0.10.1.zip", + "https://cache.hawkingrei.com/gomod/github.com/hashicorp/serf/com_github_hashicorp_serf-v0.10.1.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/github.com/hashicorp/serf/com_github_hashicorp_serf-v0.10.1.zip", ], ) go_repository( @@ -3718,6 +3722,19 @@ def go_deps(): "https://storage.googleapis.com/pingcapmirror/gomod/github.com/HdrHistogram/hdrhistogram-go/com_github_hdrhistogram_hdrhistogram_go-v1.1.2.zip", ], ) + go_repository( + name = "com_github_hetznercloud_hcloud_go_v2", + build_file_proto_mode = "disable_global", + importpath = "github.com/hetznercloud/hcloud-go/v2", + sha256 = "71e2f7c3acd1b9b8838ce91b16baf302bb39684b03af90f1f710d4917d754ca2", + strip_prefix = "github.com/hetznercloud/hcloud-go/v2@v2.4.0", + urls = [ + "http://bazel-cache.pingcap.net:8080/gomod/github.com/hetznercloud/hcloud-go/v2/com_github_hetznercloud_hcloud_go_v2-v2.4.0.zip", + "http://ats.apps.svc/gomod/github.com/hetznercloud/hcloud-go/v2/com_github_hetznercloud_hcloud_go_v2-v2.4.0.zip", + "https://cache.hawkingrei.com/gomod/github.com/hetznercloud/hcloud-go/v2/com_github_hetznercloud_hcloud_go_v2-v2.4.0.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/github.com/hetznercloud/hcloud-go/v2/com_github_hetznercloud_hcloud_go_v2-v2.4.0.zip", + ], + ) go_repository( name = "com_github_hexops_gotextdiff", build_file_proto_mode = "disable_global", @@ -3787,26 +3804,26 @@ def go_deps(): name = "com_github_ianlancetaylor_demangle", build_file_proto_mode = "disable_global", importpath = "github.com/ianlancetaylor/demangle", - sha256 = "5bbddd83cb4b8a42d741fb6a2b50826ebbee800c51b7a9e75dfd2bdc373278a1", - strip_prefix = "github.com/ianlancetaylor/demangle@v0.0.0-20210905161508-09a460cdf81d", + sha256 = "b6426a32f7d0525c6a6012a5be7b14ba57a59810d949fadb3bfec22f66604cac", + strip_prefix = "github.com/ianlancetaylor/demangle@v0.0.0-20230524184225-eabc099b10ab", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/github.com/ianlancetaylor/demangle/com_github_ianlancetaylor_demangle-v0.0.0-20210905161508-09a460cdf81d.zip", - "http://ats.apps.svc/gomod/github.com/ianlancetaylor/demangle/com_github_ianlancetaylor_demangle-v0.0.0-20210905161508-09a460cdf81d.zip", - "https://cache.hawkingrei.com/gomod/github.com/ianlancetaylor/demangle/com_github_ianlancetaylor_demangle-v0.0.0-20210905161508-09a460cdf81d.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/github.com/ianlancetaylor/demangle/com_github_ianlancetaylor_demangle-v0.0.0-20210905161508-09a460cdf81d.zip", + "http://bazel-cache.pingcap.net:8080/gomod/github.com/ianlancetaylor/demangle/com_github_ianlancetaylor_demangle-v0.0.0-20230524184225-eabc099b10ab.zip", + "http://ats.apps.svc/gomod/github.com/ianlancetaylor/demangle/com_github_ianlancetaylor_demangle-v0.0.0-20230524184225-eabc099b10ab.zip", + "https://cache.hawkingrei.com/gomod/github.com/ianlancetaylor/demangle/com_github_ianlancetaylor_demangle-v0.0.0-20230524184225-eabc099b10ab.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/github.com/ianlancetaylor/demangle/com_github_ianlancetaylor_demangle-v0.0.0-20230524184225-eabc099b10ab.zip", ], ) go_repository( name = "com_github_imdario_mergo", build_file_proto_mode = "disable_global", importpath = "github.com/imdario/mergo", - sha256 = "47332eb559e993749cc31292807b3a639a470032ec603fd3c15fbe46f82192f6", - strip_prefix = "github.com/imdario/mergo@v0.3.11", + sha256 = "536b0b87ec2b9f02d759a3a01604043b538e15e62924a29e34cfc2b16a1cf580", + strip_prefix = "github.com/imdario/mergo@v0.3.16", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/github.com/imdario/mergo/com_github_imdario_mergo-v0.3.11.zip", - "http://ats.apps.svc/gomod/github.com/imdario/mergo/com_github_imdario_mergo-v0.3.11.zip", - "https://cache.hawkingrei.com/gomod/github.com/imdario/mergo/com_github_imdario_mergo-v0.3.11.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/github.com/imdario/mergo/com_github_imdario_mergo-v0.3.11.zip", + "http://bazel-cache.pingcap.net:8080/gomod/github.com/imdario/mergo/com_github_imdario_mergo-v0.3.16.zip", + "http://ats.apps.svc/gomod/github.com/imdario/mergo/com_github_imdario_mergo-v0.3.16.zip", + "https://cache.hawkingrei.com/gomod/github.com/imdario/mergo/com_github_imdario_mergo-v0.3.16.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/github.com/imdario/mergo/com_github_imdario_mergo-v0.3.16.zip", ], ) go_repository( @@ -3835,19 +3852,6 @@ def go_deps(): "https://storage.googleapis.com/pingcapmirror/gomod/github.com/inconshreveable/mousetrap/com_github_inconshreveable_mousetrap-v1.1.0.zip", ], ) - go_repository( - name = "com_github_influxdata_influxdb", - build_file_proto_mode = "disable_global", - importpath = "github.com/influxdata/influxdb", - sha256 = "a59a6a42828346f125f7d97be36639cda093ce1c311e1e3fd292680b4474ced6", - strip_prefix = "github.com/influxdata/influxdb@v0.0.0-20170331210902-15e594fc09f1", - urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/github.com/influxdata/influxdb/com_github_influxdata_influxdb-v0.0.0-20170331210902-15e594fc09f1.zip", - "http://ats.apps.svc/gomod/github.com/influxdata/influxdb/com_github_influxdata_influxdb-v0.0.0-20170331210902-15e594fc09f1.zip", - "https://cache.hawkingrei.com/gomod/github.com/influxdata/influxdb/com_github_influxdata_influxdb-v0.0.0-20170331210902-15e594fc09f1.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/github.com/influxdata/influxdb/com_github_influxdata_influxdb-v0.0.0-20170331210902-15e594fc09f1.zip", - ], - ) go_repository( name = "com_github_influxdata_tdigest", build_file_proto_mode = "disable_global", @@ -3861,6 +3865,19 @@ def go_deps(): "https://storage.googleapis.com/pingcapmirror/gomod/github.com/influxdata/tdigest/com_github_influxdata_tdigest-v0.0.1.zip", ], ) + go_repository( + name = "com_github_ionos_cloud_sdk_go_v6", + build_file_proto_mode = "disable_global", + importpath = "github.com/ionos-cloud/sdk-go/v6", + sha256 = "2eca0d2a3075d7c9ebfd17258656eb5a9e8819a4c09a91dcb3fd0199945d014d", + strip_prefix = "github.com/ionos-cloud/sdk-go/v6@v6.1.9", + urls = [ + "http://bazel-cache.pingcap.net:8080/gomod/github.com/ionos-cloud/sdk-go/v6/com_github_ionos_cloud_sdk_go_v6-v6.1.9.zip", + "http://ats.apps.svc/gomod/github.com/ionos-cloud/sdk-go/v6/com_github_ionos_cloud_sdk_go_v6-v6.1.9.zip", + "https://cache.hawkingrei.com/gomod/github.com/ionos-cloud/sdk-go/v6/com_github_ionos_cloud_sdk_go_v6-v6.1.9.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/github.com/ionos-cloud/sdk-go/v6/com_github_ionos_cloud_sdk_go_v6-v6.1.9.zip", + ], + ) go_repository( name = "com_github_iris_contrib_blackfriday", build_file_proto_mode = "disable_global", @@ -3913,32 +3930,6 @@ def go_deps(): "https://storage.googleapis.com/pingcapmirror/gomod/github.com/iris-contrib/schema/com_github_iris_contrib_schema-v0.0.1.zip", ], ) - go_repository( - name = "com_github_jackc_fake", - build_file_proto_mode = "disable_global", - importpath = "github.com/jackc/fake", - sha256 = "bf8b5b51ae03f572a70a0582dc663c5733bba9aca785d39bb0367797148e6d64", - strip_prefix = "github.com/jackc/fake@v0.0.0-20150926172116-812a484cc733", - urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/github.com/jackc/fake/com_github_jackc_fake-v0.0.0-20150926172116-812a484cc733.zip", - "http://ats.apps.svc/gomod/github.com/jackc/fake/com_github_jackc_fake-v0.0.0-20150926172116-812a484cc733.zip", - "https://cache.hawkingrei.com/gomod/github.com/jackc/fake/com_github_jackc_fake-v0.0.0-20150926172116-812a484cc733.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/github.com/jackc/fake/com_github_jackc_fake-v0.0.0-20150926172116-812a484cc733.zip", - ], - ) - go_repository( - name = "com_github_jackc_pgx", - build_file_proto_mode = "disable_global", - importpath = "github.com/jackc/pgx", - sha256 = "e158f1752893bc638d66e31c0a928cbb96119df8d459d36fcef52b4b31a6d24d", - strip_prefix = "github.com/jackc/pgx@v3.2.0+incompatible", - urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/github.com/jackc/pgx/com_github_jackc_pgx-v3.2.0+incompatible.zip", - "http://ats.apps.svc/gomod/github.com/jackc/pgx/com_github_jackc_pgx-v3.2.0+incompatible.zip", - "https://cache.hawkingrei.com/gomod/github.com/jackc/pgx/com_github_jackc_pgx-v3.2.0+incompatible.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/github.com/jackc/pgx/com_github_jackc_pgx-v3.2.0+incompatible.zip", - ], - ) go_repository( name = "com_github_jcmturner_aescts_v2", build_file_proto_mode = "disable_global", @@ -4516,16 +4507,16 @@ def go_deps(): ], ) go_repository( - name = "com_github_knz_strtime", + name = "com_github_kolo_xmlrpc", build_file_proto_mode = "disable_global", - importpath = "github.com/knz/strtime", - sha256 = "bd562758fa61a744b3b7c5fd3616dece50c6b92bfa11511ed1e1ab8c43831eb8", - strip_prefix = "github.com/knz/strtime@v0.0.0-20181018220328-af2256ee352c", + importpath = "github.com/kolo/xmlrpc", + sha256 = "310742360a864798a1bfce6db8604263574c0be502670c8bfedeab8fcbe9d191", + strip_prefix = "github.com/kolo/xmlrpc@v0.0.0-20220921171641-a4b6fa1dd06b", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/github.com/knz/strtime/com_github_knz_strtime-v0.0.0-20181018220328-af2256ee352c.zip", - "http://ats.apps.svc/gomod/github.com/knz/strtime/com_github_knz_strtime-v0.0.0-20181018220328-af2256ee352c.zip", - "https://cache.hawkingrei.com/gomod/github.com/knz/strtime/com_github_knz_strtime-v0.0.0-20181018220328-af2256ee352c.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/github.com/knz/strtime/com_github_knz_strtime-v0.0.0-20181018220328-af2256ee352c.zip", + "http://bazel-cache.pingcap.net:8080/gomod/github.com/kolo/xmlrpc/com_github_kolo_xmlrpc-v0.0.0-20220921171641-a4b6fa1dd06b.zip", + "http://ats.apps.svc/gomod/github.com/kolo/xmlrpc/com_github_kolo_xmlrpc-v0.0.0-20220921171641-a4b6fa1dd06b.zip", + "https://cache.hawkingrei.com/gomod/github.com/kolo/xmlrpc/com_github_kolo_xmlrpc-v0.0.0-20220921171641-a4b6fa1dd06b.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/github.com/kolo/xmlrpc/com_github_kolo_xmlrpc-v0.0.0-20220921171641-a4b6fa1dd06b.zip", ], ) go_repository( @@ -4597,13 +4588,13 @@ def go_deps(): name = "com_github_ks3sdklib_aws_sdk_go", build_file_proto_mode = "disable_global", importpath = "github.com/ks3sdklib/aws-sdk-go", - sha256 = "21e8e063b2c274f9a34c23d7f9ebe180d22bf3ddaf9e11d9a9471aa3c93b4c97", - strip_prefix = "github.com/ks3sdklib/aws-sdk-go@v1.2.7", + sha256 = "1edfac4a072a0180b308ddc1a9e96d51407e2e66573938e14e056ba6fef5bddb", + strip_prefix = "github.com/ks3sdklib/aws-sdk-go@v1.2.9", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/github.com/ks3sdklib/aws-sdk-go/com_github_ks3sdklib_aws_sdk_go-v1.2.7.zip", - "http://ats.apps.svc/gomod/github.com/ks3sdklib/aws-sdk-go/com_github_ks3sdklib_aws_sdk_go-v1.2.7.zip", - "https://cache.hawkingrei.com/gomod/github.com/ks3sdklib/aws-sdk-go/com_github_ks3sdklib_aws_sdk_go-v1.2.7.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/github.com/ks3sdklib/aws-sdk-go/com_github_ks3sdklib_aws_sdk_go-v1.2.7.zip", + "http://bazel-cache.pingcap.net:8080/gomod/github.com/ks3sdklib/aws-sdk-go/com_github_ks3sdklib_aws_sdk_go-v1.2.9.zip", + "http://ats.apps.svc/gomod/github.com/ks3sdklib/aws-sdk-go/com_github_ks3sdklib_aws_sdk_go-v1.2.9.zip", + "https://cache.hawkingrei.com/gomod/github.com/ks3sdklib/aws-sdk-go/com_github_ks3sdklib_aws_sdk_go-v1.2.9.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/github.com/ks3sdklib/aws-sdk-go/com_github_ks3sdklib_aws_sdk_go-v1.2.9.zip", ], ) go_repository( @@ -4727,13 +4718,13 @@ def go_deps(): name = "com_github_lestrrat_go_blackmagic", build_file_proto_mode = "disable_global", importpath = "github.com/lestrrat-go/blackmagic", - sha256 = "0621ab66f2510093f86f838db09a698027e8cbf08cc0e52bfa7d359b4f1b3745", - strip_prefix = "github.com/lestrrat-go/blackmagic@v1.0.1", + sha256 = "2baa5f21e1db4781a11d0ba2fbe8e71323c78875034da61687d80f47ae9c78ce", + strip_prefix = "github.com/lestrrat-go/blackmagic@v1.0.2", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/github.com/lestrrat-go/blackmagic/com_github_lestrrat_go_blackmagic-v1.0.1.zip", - "http://ats.apps.svc/gomod/github.com/lestrrat-go/blackmagic/com_github_lestrrat_go_blackmagic-v1.0.1.zip", - "https://cache.hawkingrei.com/gomod/github.com/lestrrat-go/blackmagic/com_github_lestrrat_go_blackmagic-v1.0.1.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/github.com/lestrrat-go/blackmagic/com_github_lestrrat_go_blackmagic-v1.0.1.zip", + "http://bazel-cache.pingcap.net:8080/gomod/github.com/lestrrat-go/blackmagic/com_github_lestrrat_go_blackmagic-v1.0.2.zip", + "http://ats.apps.svc/gomod/github.com/lestrrat-go/blackmagic/com_github_lestrrat_go_blackmagic-v1.0.2.zip", + "https://cache.hawkingrei.com/gomod/github.com/lestrrat-go/blackmagic/com_github_lestrrat_go_blackmagic-v1.0.2.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/github.com/lestrrat-go/blackmagic/com_github_lestrrat_go_blackmagic-v1.0.2.zip", ], ) go_repository( @@ -4779,13 +4770,13 @@ def go_deps(): name = "com_github_lestrrat_go_jwx_v2", build_file_proto_mode = "disable_global", importpath = "github.com/lestrrat-go/jwx/v2", - sha256 = "bea73ce04072a52f02af194a18dfd61de16b468eecc4e05c31e497cd03b67bfd", - strip_prefix = "github.com/lestrrat-go/jwx/v2@v2.0.11", + sha256 = "98630c9e00fa85bfc16d33cffb225d7ac86ab2f8eabeb9cc95a8e78d898de7f3", + strip_prefix = "github.com/lestrrat-go/jwx/v2@v2.0.17", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/github.com/lestrrat-go/jwx/v2/com_github_lestrrat_go_jwx_v2-v2.0.11.zip", - "http://ats.apps.svc/gomod/github.com/lestrrat-go/jwx/v2/com_github_lestrrat_go_jwx_v2-v2.0.11.zip", - "https://cache.hawkingrei.com/gomod/github.com/lestrrat-go/jwx/v2/com_github_lestrrat_go_jwx_v2-v2.0.11.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/github.com/lestrrat-go/jwx/v2/com_github_lestrrat_go_jwx_v2-v2.0.11.zip", + "http://bazel-cache.pingcap.net:8080/gomod/github.com/lestrrat-go/jwx/v2/com_github_lestrrat_go_jwx_v2-v2.0.17.zip", + "http://ats.apps.svc/gomod/github.com/lestrrat-go/jwx/v2/com_github_lestrrat_go_jwx_v2-v2.0.17.zip", + "https://cache.hawkingrei.com/gomod/github.com/lestrrat-go/jwx/v2/com_github_lestrrat_go_jwx_v2-v2.0.17.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/github.com/lestrrat-go/jwx/v2/com_github_lestrrat_go_jwx_v2-v2.0.17.zip", ], ) go_repository( @@ -4802,29 +4793,16 @@ def go_deps(): ], ) go_repository( - name = "com_github_lib_pq", + name = "com_github_linode_linodego", build_file_proto_mode = "disable_global", - importpath = "github.com/lib/pq", - sha256 = "8aa4a8870dbd30c8b143fe70f121c3ea917b6483251d1384da1b01fc6c6f6c30", - strip_prefix = "github.com/lib/pq@v1.0.0", + importpath = "github.com/linode/linodego", + sha256 = "3e39d39b24cf0504cae3528c9d956c7e7823adaafc0dee315e781e256e0db85c", + strip_prefix = "github.com/linode/linodego@v1.23.0", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/github.com/lib/pq/com_github_lib_pq-v1.0.0.zip", - "http://ats.apps.svc/gomod/github.com/lib/pq/com_github_lib_pq-v1.0.0.zip", - "https://cache.hawkingrei.com/gomod/github.com/lib/pq/com_github_lib_pq-v1.0.0.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/github.com/lib/pq/com_github_lib_pq-v1.0.0.zip", - ], - ) - go_repository( - name = "com_github_lightstep_lightstep_tracer_go", - build_file_proto_mode = "disable_global", - importpath = "github.com/lightstep/lightstep-tracer-go", - sha256 = "426bdb6f7cd88747dceddf20745314abb3c568e782fa811faf2f3433c4cfabaa", - strip_prefix = "github.com/lightstep/lightstep-tracer-go@v0.15.6", - urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/github.com/lightstep/lightstep-tracer-go/com_github_lightstep_lightstep_tracer_go-v0.15.6.zip", - "http://ats.apps.svc/gomod/github.com/lightstep/lightstep-tracer-go/com_github_lightstep_lightstep_tracer_go-v0.15.6.zip", - "https://cache.hawkingrei.com/gomod/github.com/lightstep/lightstep-tracer-go/com_github_lightstep_lightstep_tracer_go-v0.15.6.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/github.com/lightstep/lightstep-tracer-go/com_github_lightstep_lightstep_tracer_go-v0.15.6.zip", + "http://bazel-cache.pingcap.net:8080/gomod/github.com/linode/linodego/com_github_linode_linodego-v1.23.0.zip", + "http://ats.apps.svc/gomod/github.com/linode/linodego/com_github_linode_linodego-v1.23.0.zip", + "https://cache.hawkingrei.com/gomod/github.com/linode/linodego/com_github_linode_linodego-v1.23.0.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/github.com/linode/linodego/com_github_linode_linodego-v1.23.0.zip", ], ) go_repository( @@ -5000,13 +4978,13 @@ def go_deps(): name = "com_github_mattn_go_isatty", build_file_proto_mode = "disable_global", importpath = "github.com/mattn/go-isatty", - sha256 = "5484892c645beb53b7120549baa8ca3297b5cd2fd57158603441e71ea7c3d511", - strip_prefix = "github.com/mattn/go-isatty@v0.0.18", + sha256 = "ba8bc1b864325972dc436089351b9dea6262e7fabffdc88e96afb7130ce63da3", + strip_prefix = "github.com/mattn/go-isatty@v0.0.19", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/github.com/mattn/go-isatty/com_github_mattn_go_isatty-v0.0.18.zip", - "http://ats.apps.svc/gomod/github.com/mattn/go-isatty/com_github_mattn_go_isatty-v0.0.18.zip", - "https://cache.hawkingrei.com/gomod/github.com/mattn/go-isatty/com_github_mattn_go_isatty-v0.0.18.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/github.com/mattn/go-isatty/com_github_mattn_go_isatty-v0.0.18.zip", + "http://bazel-cache.pingcap.net:8080/gomod/github.com/mattn/go-isatty/com_github_mattn_go_isatty-v0.0.19.zip", + "http://ats.apps.svc/gomod/github.com/mattn/go-isatty/com_github_mattn_go_isatty-v0.0.19.zip", + "https://cache.hawkingrei.com/gomod/github.com/mattn/go-isatty/com_github_mattn_go_isatty-v0.0.19.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/github.com/mattn/go-isatty/com_github_mattn_go_isatty-v0.0.19.zip", ], ) go_repository( @@ -5140,29 +5118,29 @@ def go_deps(): ], ) go_repository( - name = "com_github_miekg_dns", + name = "com_github_microsoft_go_winio", build_file_proto_mode = "disable_global", - importpath = "github.com/miekg/dns", - sha256 = "32fd332c8cea149f29ffb603020548a48773bc44c974465898c938a58ca0c03a", - strip_prefix = "github.com/miekg/dns@v1.1.10", + importpath = "github.com/Microsoft/go-winio", + sha256 = "fdfec88b9eb61895ab39ed3a6181d99d78366638f86a609170d76417ba018f53", + strip_prefix = "github.com/Microsoft/go-winio@v0.6.1", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/github.com/miekg/dns/com_github_miekg_dns-v1.1.10.zip", - "http://ats.apps.svc/gomod/github.com/miekg/dns/com_github_miekg_dns-v1.1.10.zip", - "https://cache.hawkingrei.com/gomod/github.com/miekg/dns/com_github_miekg_dns-v1.1.10.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/github.com/miekg/dns/com_github_miekg_dns-v1.1.10.zip", + "http://bazel-cache.pingcap.net:8080/gomod/github.com/Microsoft/go-winio/com_github_microsoft_go_winio-v0.6.1.zip", + "http://ats.apps.svc/gomod/github.com/Microsoft/go-winio/com_github_microsoft_go_winio-v0.6.1.zip", + "https://cache.hawkingrei.com/gomod/github.com/Microsoft/go-winio/com_github_microsoft_go_winio-v0.6.1.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/github.com/Microsoft/go-winio/com_github_microsoft_go_winio-v0.6.1.zip", ], ) go_repository( - name = "com_github_mitchellh_cli", + name = "com_github_miekg_dns", build_file_proto_mode = "disable_global", - importpath = "github.com/mitchellh/cli", - sha256 = "74199f2c2e1735a45e9f5c2ca049d352b0cc73d945823540e54ca9975ce35752", - strip_prefix = "github.com/mitchellh/cli@v1.0.0", + importpath = "github.com/miekg/dns", + sha256 = "cf99e395ed590f3668a514646d058e17484d63066bcad4226e4c4ae2b9b65938", + strip_prefix = "github.com/miekg/dns@v1.1.56", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/github.com/mitchellh/cli/com_github_mitchellh_cli-v1.0.0.zip", - "http://ats.apps.svc/gomod/github.com/mitchellh/cli/com_github_mitchellh_cli-v1.0.0.zip", - "https://cache.hawkingrei.com/gomod/github.com/mitchellh/cli/com_github_mitchellh_cli-v1.0.0.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/github.com/mitchellh/cli/com_github_mitchellh_cli-v1.0.0.zip", + "http://bazel-cache.pingcap.net:8080/gomod/github.com/miekg/dns/com_github_miekg_dns-v1.1.56.zip", + "http://ats.apps.svc/gomod/github.com/miekg/dns/com_github_miekg_dns-v1.1.56.zip", + "https://cache.hawkingrei.com/gomod/github.com/miekg/dns/com_github_miekg_dns-v1.1.56.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/github.com/miekg/dns/com_github_miekg_dns-v1.1.56.zip", ], ) go_repository( @@ -5204,58 +5182,6 @@ def go_deps(): "https://storage.googleapis.com/pingcapmirror/gomod/github.com/mitchellh/go-ps/com_github_mitchellh_go_ps-v1.0.0.zip", ], ) - go_repository( - name = "com_github_mitchellh_go_testing_interface", - build_file_proto_mode = "disable_global", - importpath = "github.com/mitchellh/go-testing-interface", - sha256 = "255871a399420cd3513b12f50738d290e251637deb23e21a4332192584ecf9c7", - strip_prefix = "github.com/mitchellh/go-testing-interface@v1.0.0", - urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/github.com/mitchellh/go-testing-interface/com_github_mitchellh_go_testing_interface-v1.0.0.zip", - "http://ats.apps.svc/gomod/github.com/mitchellh/go-testing-interface/com_github_mitchellh_go_testing_interface-v1.0.0.zip", - "https://cache.hawkingrei.com/gomod/github.com/mitchellh/go-testing-interface/com_github_mitchellh_go_testing_interface-v1.0.0.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/github.com/mitchellh/go-testing-interface/com_github_mitchellh_go_testing_interface-v1.0.0.zip", - ], - ) - go_repository( - name = "com_github_mitchellh_go_wordwrap", - build_file_proto_mode = "disable_global", - importpath = "github.com/mitchellh/go-wordwrap", - sha256 = "9ea185f97dfe616da351b63b229a5a212b14ac0e23bd3f943e39590eadb38031", - strip_prefix = "github.com/mitchellh/go-wordwrap@v1.0.0", - urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/github.com/mitchellh/go-wordwrap/com_github_mitchellh_go_wordwrap-v1.0.0.zip", - "http://ats.apps.svc/gomod/github.com/mitchellh/go-wordwrap/com_github_mitchellh_go_wordwrap-v1.0.0.zip", - "https://cache.hawkingrei.com/gomod/github.com/mitchellh/go-wordwrap/com_github_mitchellh_go_wordwrap-v1.0.0.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/github.com/mitchellh/go-wordwrap/com_github_mitchellh_go_wordwrap-v1.0.0.zip", - ], - ) - go_repository( - name = "com_github_mitchellh_gox", - build_file_proto_mode = "disable_global", - importpath = "github.com/mitchellh/gox", - sha256 = "70c976edc82b069d55c4b05409be9e91d85c20238a5e38c60fbb0b03b43c9550", - strip_prefix = "github.com/mitchellh/gox@v0.4.0", - urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/github.com/mitchellh/gox/com_github_mitchellh_gox-v0.4.0.zip", - "http://ats.apps.svc/gomod/github.com/mitchellh/gox/com_github_mitchellh_gox-v0.4.0.zip", - "https://cache.hawkingrei.com/gomod/github.com/mitchellh/gox/com_github_mitchellh_gox-v0.4.0.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/github.com/mitchellh/gox/com_github_mitchellh_gox-v0.4.0.zip", - ], - ) - go_repository( - name = "com_github_mitchellh_iochan", - build_file_proto_mode = "disable_global", - importpath = "github.com/mitchellh/iochan", - sha256 = "f3eede01adb24c22945bf71b4f84ae25e3744a12b9d8bd7c016705adc0d778b8", - strip_prefix = "github.com/mitchellh/iochan@v1.0.0", - urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/github.com/mitchellh/iochan/com_github_mitchellh_iochan-v1.0.0.zip", - "http://ats.apps.svc/gomod/github.com/mitchellh/iochan/com_github_mitchellh_iochan-v1.0.0.zip", - "https://cache.hawkingrei.com/gomod/github.com/mitchellh/iochan/com_github_mitchellh_iochan-v1.0.0.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/github.com/mitchellh/iochan/com_github_mitchellh_iochan-v1.0.0.zip", - ], - ) go_repository( name = "com_github_mitchellh_mapstructure", build_file_proto_mode = "disable_global", @@ -5295,6 +5221,19 @@ def go_deps(): "https://storage.googleapis.com/pingcapmirror/gomod/github.com/moby/spdystream/com_github_moby_spdystream-v0.2.0.zip", ], ) + go_repository( + name = "com_github_moby_term", + build_file_proto_mode = "disable_global", + importpath = "github.com/moby/term", + sha256 = "0d2e2ce8280f803a14d9c2af23a79cf854e06d47f2e6b7d455291ffd47c11e2f", + strip_prefix = "github.com/moby/term@v0.0.0-20210619224110-3f7ff695adc6", + urls = [ + "http://bazel-cache.pingcap.net:8080/gomod/github.com/moby/term/com_github_moby_term-v0.0.0-20210619224110-3f7ff695adc6.zip", + "http://ats.apps.svc/gomod/github.com/moby/term/com_github_moby_term-v0.0.0-20210619224110-3f7ff695adc6.zip", + "https://cache.hawkingrei.com/gomod/github.com/moby/term/com_github_moby_term-v0.0.0-20210619224110-3f7ff695adc6.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/github.com/moby/term/com_github_moby_term-v0.0.0-20210619224110-3f7ff695adc6.zip", + ], + ) go_repository( name = "com_github_modern_go_concurrent", build_file_proto_mode = "disable_global", @@ -5325,13 +5264,13 @@ def go_deps(): name = "com_github_montanaflynn_stats", build_file_proto_mode = "disable_global", importpath = "github.com/montanaflynn/stats", - sha256 = "fac4308cc66d568256e7aafe694ae58603ddeb9bb39965caa550dbe3fbd77ddc", - strip_prefix = "github.com/montanaflynn/stats@v0.6.6", + sha256 = "661546beb7c49f92a2c798709323f5cb175251bc359c061e5933071679f9b2ef", + strip_prefix = "github.com/montanaflynn/stats@v0.7.0", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/github.com/montanaflynn/stats/com_github_montanaflynn_stats-v0.6.6.zip", - "http://ats.apps.svc/gomod/github.com/montanaflynn/stats/com_github_montanaflynn_stats-v0.6.6.zip", - "https://cache.hawkingrei.com/gomod/github.com/montanaflynn/stats/com_github_montanaflynn_stats-v0.6.6.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/github.com/montanaflynn/stats/com_github_montanaflynn_stats-v0.6.6.zip", + "http://bazel-cache.pingcap.net:8080/gomod/github.com/montanaflynn/stats/com_github_montanaflynn_stats-v0.7.0.zip", + "http://ats.apps.svc/gomod/github.com/montanaflynn/stats/com_github_montanaflynn_stats-v0.7.0.zip", + "https://cache.hawkingrei.com/gomod/github.com/montanaflynn/stats/com_github_montanaflynn_stats-v0.7.0.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/github.com/montanaflynn/stats/com_github_montanaflynn_stats-v0.7.0.zip", ], ) go_repository( @@ -5347,6 +5286,19 @@ def go_deps(): "https://storage.googleapis.com/pingcapmirror/gomod/github.com/moricho/tparallel/com_github_moricho_tparallel-v0.3.1.zip", ], ) + go_repository( + name = "com_github_morikuni_aec", + build_file_proto_mode = "disable_global", + importpath = "github.com/morikuni/aec", + sha256 = "c14eeff6945b854edd8b91a83ac760fbd95068f33dc17d102c18f2e8e86bcced", + strip_prefix = "github.com/morikuni/aec@v1.0.0", + urls = [ + "http://bazel-cache.pingcap.net:8080/gomod/github.com/morikuni/aec/com_github_morikuni_aec-v1.0.0.zip", + "http://ats.apps.svc/gomod/github.com/morikuni/aec/com_github_morikuni_aec-v1.0.0.zip", + "https://cache.hawkingrei.com/gomod/github.com/morikuni/aec/com_github_morikuni_aec-v1.0.0.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/github.com/morikuni/aec/com_github_morikuni_aec-v1.0.0.zip", + ], + ) go_repository( name = "com_github_moul_http2curl", build_file_proto_mode = "disable_global", @@ -5360,6 +5312,19 @@ def go_deps(): "https://storage.googleapis.com/pingcapmirror/gomod/github.com/moul/http2curl/com_github_moul_http2curl-v1.0.0.zip", ], ) + go_repository( + name = "com_github_munnerz_goautoneg", + build_file_proto_mode = "disable_global", + importpath = "github.com/munnerz/goautoneg", + sha256 = "3d7ce17916779890be02ea6b3dd6345c3c30c1df502ad9d8b5b9b310e636afd9", + strip_prefix = "github.com/munnerz/goautoneg@v0.0.0-20191010083416-a7dc8b61c822", + urls = [ + "http://bazel-cache.pingcap.net:8080/gomod/github.com/munnerz/goautoneg/com_github_munnerz_goautoneg-v0.0.0-20191010083416-a7dc8b61c822.zip", + "http://ats.apps.svc/gomod/github.com/munnerz/goautoneg/com_github_munnerz_goautoneg-v0.0.0-20191010083416-a7dc8b61c822.zip", + "https://cache.hawkingrei.com/gomod/github.com/munnerz/goautoneg/com_github_munnerz_goautoneg-v0.0.0-20191010083416-a7dc8b61c822.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/github.com/munnerz/goautoneg/com_github_munnerz_goautoneg-v0.0.0-20191010083416-a7dc8b61c822.zip", + ], + ) go_repository( name = "com_github_mwitkow_go_conntrack", build_file_proto_mode = "disable_global", @@ -5559,13 +5524,13 @@ def go_deps(): name = "com_github_oklog_run", build_file_proto_mode = "disable_global", importpath = "github.com/oklog/run", - sha256 = "108d409b7d235d61b82cfb6e1df139501123fcd8fa68fe94ddb024b53335cb48", - strip_prefix = "github.com/oklog/run@v1.0.0", + sha256 = "d6f69fc71aa155043f926c2a98fc1e5b3a8ebab422f2f36d785cfba38a7ebee4", + strip_prefix = "github.com/oklog/run@v1.1.0", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/github.com/oklog/run/com_github_oklog_run-v1.0.0.zip", - "http://ats.apps.svc/gomod/github.com/oklog/run/com_github_oklog_run-v1.0.0.zip", - "https://cache.hawkingrei.com/gomod/github.com/oklog/run/com_github_oklog_run-v1.0.0.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/github.com/oklog/run/com_github_oklog_run-v1.0.0.zip", + "http://bazel-cache.pingcap.net:8080/gomod/github.com/oklog/run/com_github_oklog_run-v1.1.0.zip", + "http://ats.apps.svc/gomod/github.com/oklog/run/com_github_oklog_run-v1.1.0.zip", + "https://cache.hawkingrei.com/gomod/github.com/oklog/run/com_github_oklog_run-v1.1.0.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/github.com/oklog/run/com_github_oklog_run-v1.1.0.zip", ], ) go_repository( @@ -5594,19 +5559,6 @@ def go_deps(): "https://storage.googleapis.com/pingcapmirror/gomod/github.com/olekukonko/tablewriter/com_github_olekukonko_tablewriter-v0.0.5.zip", ], ) - go_repository( - name = "com_github_oneofone_xxhash", - build_file_proto_mode = "disable_global", - importpath = "github.com/OneOfOne/xxhash", - sha256 = "7ab3c6a0e7c16c987a589e50a9a353e8877cfffea02bf9e04e370fd26a0c85e1", - strip_prefix = "github.com/OneOfOne/xxhash@v1.2.5", - urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/github.com/OneOfOne/xxhash/com_github_oneofone_xxhash-v1.2.5.zip", - "http://ats.apps.svc/gomod/github.com/OneOfOne/xxhash/com_github_oneofone_xxhash-v1.2.5.zip", - "https://cache.hawkingrei.com/gomod/github.com/OneOfOne/xxhash/com_github_oneofone_xxhash-v1.2.5.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/github.com/OneOfOne/xxhash/com_github_oneofone_xxhash-v1.2.5.zip", - ], - ) go_repository( name = "com_github_onsi_ginkgo", build_file_proto_mode = "disable_global", @@ -5624,26 +5576,52 @@ def go_deps(): name = "com_github_onsi_ginkgo_v2", build_file_proto_mode = "disable_global", importpath = "github.com/onsi/ginkgo/v2", - sha256 = "c5cdb980ec4d450f3df8a471718494fd9192a5751cbeff14b9025fa9c0c86b16", - strip_prefix = "github.com/onsi/ginkgo/v2@v2.9.1", + sha256 = "f41e92baa52ec53d482603e4585c0906ca0c02e05004dca78a62bf1de88833ad", + strip_prefix = "github.com/onsi/ginkgo/v2@v2.9.4", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/github.com/onsi/ginkgo/v2/com_github_onsi_ginkgo_v2-v2.9.1.zip", - "http://ats.apps.svc/gomod/github.com/onsi/ginkgo/v2/com_github_onsi_ginkgo_v2-v2.9.1.zip", - "https://cache.hawkingrei.com/gomod/github.com/onsi/ginkgo/v2/com_github_onsi_ginkgo_v2-v2.9.1.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/github.com/onsi/ginkgo/v2/com_github_onsi_ginkgo_v2-v2.9.1.zip", + "http://bazel-cache.pingcap.net:8080/gomod/github.com/onsi/ginkgo/v2/com_github_onsi_ginkgo_v2-v2.9.4.zip", + "http://ats.apps.svc/gomod/github.com/onsi/ginkgo/v2/com_github_onsi_ginkgo_v2-v2.9.4.zip", + "https://cache.hawkingrei.com/gomod/github.com/onsi/ginkgo/v2/com_github_onsi_ginkgo_v2-v2.9.4.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/github.com/onsi/ginkgo/v2/com_github_onsi_ginkgo_v2-v2.9.4.zip", ], ) go_repository( name = "com_github_onsi_gomega", build_file_proto_mode = "disable_global", importpath = "github.com/onsi/gomega", - sha256 = "c7c39c6aa6a544939044a2a51ff86cd4d911a3801358d83ee48278fdbe5fe42c", - strip_prefix = "github.com/onsi/gomega@v1.27.4", + sha256 = "ea2b22782cc15569645dfdfc066a651e1335626677ad92d7ba4358a0885bf369", + strip_prefix = "github.com/onsi/gomega@v1.20.1", + urls = [ + "http://bazel-cache.pingcap.net:8080/gomod/github.com/onsi/gomega/com_github_onsi_gomega-v1.20.1.zip", + "http://ats.apps.svc/gomod/github.com/onsi/gomega/com_github_onsi_gomega-v1.20.1.zip", + "https://cache.hawkingrei.com/gomod/github.com/onsi/gomega/com_github_onsi_gomega-v1.20.1.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/github.com/onsi/gomega/com_github_onsi_gomega-v1.20.1.zip", + ], + ) + go_repository( + name = "com_github_opencontainers_go_digest", + build_file_proto_mode = "disable_global", + importpath = "github.com/opencontainers/go-digest", + sha256 = "615efb31ff6cd71035b8aa38c3659d8b4da46f3cd92ac807cb50449adfe37c86", + strip_prefix = "github.com/opencontainers/go-digest@v1.0.0", + urls = [ + "http://bazel-cache.pingcap.net:8080/gomod/github.com/opencontainers/go-digest/com_github_opencontainers_go_digest-v1.0.0.zip", + "http://ats.apps.svc/gomod/github.com/opencontainers/go-digest/com_github_opencontainers_go_digest-v1.0.0.zip", + "https://cache.hawkingrei.com/gomod/github.com/opencontainers/go-digest/com_github_opencontainers_go_digest-v1.0.0.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/github.com/opencontainers/go-digest/com_github_opencontainers_go_digest-v1.0.0.zip", + ], + ) + go_repository( + name = "com_github_opencontainers_image_spec", + build_file_proto_mode = "disable_global", + importpath = "github.com/opencontainers/image-spec", + sha256 = "d842127b6038c1a74c2bb609d75bdde0ac9c7cde5c354ac82c4f953ce08d0c08", + strip_prefix = "github.com/opencontainers/image-spec@v1.0.2", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/github.com/onsi/gomega/com_github_onsi_gomega-v1.27.4.zip", - "http://ats.apps.svc/gomod/github.com/onsi/gomega/com_github_onsi_gomega-v1.27.4.zip", - "https://cache.hawkingrei.com/gomod/github.com/onsi/gomega/com_github_onsi_gomega-v1.27.4.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/github.com/onsi/gomega/com_github_onsi_gomega-v1.27.4.zip", + "http://bazel-cache.pingcap.net:8080/gomod/github.com/opencontainers/image-spec/com_github_opencontainers_image_spec-v1.0.2.zip", + "http://ats.apps.svc/gomod/github.com/opencontainers/image-spec/com_github_opencontainers_image_spec-v1.0.2.zip", + "https://cache.hawkingrei.com/gomod/github.com/opencontainers/image-spec/com_github_opencontainers_image_spec-v1.0.2.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/github.com/opencontainers/image-spec/com_github_opencontainers_image_spec-v1.0.2.zip", ], ) go_repository( @@ -5672,19 +5650,6 @@ def go_deps(): "https://storage.googleapis.com/pingcapmirror/gomod/github.com/opentracing/basictracer-go/com_github_opentracing_basictracer_go-v1.0.0.zip", ], ) - go_repository( - name = "com_github_opentracing_contrib_go_stdlib", - build_file_proto_mode = "disable_global", - importpath = "github.com/opentracing-contrib/go-stdlib", - sha256 = "b12d4649ede78423ab6d147161dfe160daaeb02a77dca0b488b7ffad51cc49c1", - strip_prefix = "github.com/opentracing-contrib/go-stdlib@v0.0.0-20170113013457-1de4cc2120e7", - urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/github.com/opentracing-contrib/go-stdlib/com_github_opentracing_contrib_go_stdlib-v0.0.0-20170113013457-1de4cc2120e7.zip", - "http://ats.apps.svc/gomod/github.com/opentracing-contrib/go-stdlib/com_github_opentracing_contrib_go_stdlib-v0.0.0-20170113013457-1de4cc2120e7.zip", - "https://cache.hawkingrei.com/gomod/github.com/opentracing-contrib/go-stdlib/com_github_opentracing_contrib_go_stdlib-v0.0.0-20170113013457-1de4cc2120e7.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/github.com/opentracing-contrib/go-stdlib/com_github_opentracing_contrib_go_stdlib-v0.0.0-20170113013457-1de4cc2120e7.zip", - ], - ) go_repository( name = "com_github_opentracing_opentracing_go", build_file_proto_mode = "disable_global", @@ -5698,19 +5663,6 @@ def go_deps(): "https://storage.googleapis.com/pingcapmirror/gomod/github.com/opentracing/opentracing-go/com_github_opentracing_opentracing_go-v1.2.0.zip", ], ) - go_repository( - name = "com_github_openzipkin_zipkin_go", - build_file_proto_mode = "disable_global", - importpath = "github.com/openzipkin/zipkin-go", - sha256 = "36fd67db687108f4dc2b2a8607c3ad6ca226228a7a307897105d7d3f3ea28ccb", - strip_prefix = "github.com/openzipkin/zipkin-go@v0.1.6", - urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/github.com/openzipkin/zipkin-go/com_github_openzipkin_zipkin_go-v0.1.6.zip", - "http://ats.apps.svc/gomod/github.com/openzipkin/zipkin-go/com_github_openzipkin_zipkin_go-v0.1.6.zip", - "https://cache.hawkingrei.com/gomod/github.com/openzipkin/zipkin-go/com_github_openzipkin_zipkin_go-v0.1.6.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/github.com/openzipkin/zipkin-go/com_github_openzipkin_zipkin_go-v0.1.6.zip", - ], - ) go_repository( name = "com_github_otiai10_copy", build_file_proto_mode = "disable_global", @@ -5751,16 +5703,16 @@ def go_deps(): ], ) go_repository( - name = "com_github_pascaldekloe_goe", + name = "com_github_ovh_go_ovh", build_file_proto_mode = "disable_global", - importpath = "github.com/pascaldekloe/goe", - sha256 = "fa1b653a2e460194150393e186af967c8b1d24811252aac12f9ab4474beefdc6", - strip_prefix = "github.com/pascaldekloe/goe@v0.0.0-20180627143212-57f6aae5913c", + importpath = "github.com/ovh/go-ovh", + sha256 = "011dc40423f453de4570f9ad737ff4185e0205aa11d294e1bd606fb70f07177b", + strip_prefix = "github.com/ovh/go-ovh@v1.4.3", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/github.com/pascaldekloe/goe/com_github_pascaldekloe_goe-v0.0.0-20180627143212-57f6aae5913c.zip", - "http://ats.apps.svc/gomod/github.com/pascaldekloe/goe/com_github_pascaldekloe_goe-v0.0.0-20180627143212-57f6aae5913c.zip", - "https://cache.hawkingrei.com/gomod/github.com/pascaldekloe/goe/com_github_pascaldekloe_goe-v0.0.0-20180627143212-57f6aae5913c.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/github.com/pascaldekloe/goe/com_github_pascaldekloe_goe-v0.0.0-20180627143212-57f6aae5913c.zip", + "http://bazel-cache.pingcap.net:8080/gomod/github.com/ovh/go-ovh/com_github_ovh_go_ovh-v1.4.3.zip", + "http://ats.apps.svc/gomod/github.com/ovh/go-ovh/com_github_ovh_go_ovh-v1.4.3.zip", + "https://cache.hawkingrei.com/gomod/github.com/ovh/go-ovh/com_github_ovh_go_ovh-v1.4.3.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/github.com/ovh/go-ovh/com_github_ovh_go_ovh-v1.4.3.zip", ], ) go_repository( @@ -5802,19 +5754,6 @@ def go_deps(): "https://storage.googleapis.com/pingcapmirror/gomod/github.com/pelletier/go-toml/v2/com_github_pelletier_go_toml_v2-v2.0.5.zip", ], ) - go_repository( - name = "com_github_peterbourgon_g2s", - build_file_proto_mode = "disable_global", - importpath = "github.com/peterbourgon/g2s", - sha256 = "41526f42b4fe3019581ab3745afea18271d7f037eb55a6e9fb3e32fd09ff9b8d", - strip_prefix = "github.com/peterbourgon/g2s@v0.0.0-20170223122336-d4e7ad98afea", - urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/github.com/peterbourgon/g2s/com_github_peterbourgon_g2s-v0.0.0-20170223122336-d4e7ad98afea.zip", - "http://ats.apps.svc/gomod/github.com/peterbourgon/g2s/com_github_peterbourgon_g2s-v0.0.0-20170223122336-d4e7ad98afea.zip", - "https://cache.hawkingrei.com/gomod/github.com/peterbourgon/g2s/com_github_peterbourgon_g2s-v0.0.0-20170223122336-d4e7ad98afea.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/github.com/peterbourgon/g2s/com_github_peterbourgon_g2s-v0.0.0-20170223122336-d4e7ad98afea.zip", - ], - ) go_repository( name = "com_github_petermattis_goid", build_file_proto_mode = "disable_global", @@ -5871,13 +5810,13 @@ def go_deps(): name = "com_github_pingcap_errors", build_file_proto_mode = "disable_global", importpath = "github.com/pingcap/errors", - sha256 = "4dadf9dc507b4187a70b78e49d572bc0e8f89a7b4a8974d6a978f72620526996", - strip_prefix = "github.com/pingcap/errors@v0.11.5-0.20221009092201-b66cddb77c32", + sha256 = "b4db3d3c222d9039c84baacbbd9c46aa0346f3f04d2577a77475a64ecfefebf9", + strip_prefix = "github.com/pingcap/errors@v0.11.5-0.20231212100244-799fae176cfb", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/github.com/pingcap/errors/com_github_pingcap_errors-v0.11.5-0.20221009092201-b66cddb77c32.zip", - "http://ats.apps.svc/gomod/github.com/pingcap/errors/com_github_pingcap_errors-v0.11.5-0.20221009092201-b66cddb77c32.zip", - "https://cache.hawkingrei.com/gomod/github.com/pingcap/errors/com_github_pingcap_errors-v0.11.5-0.20221009092201-b66cddb77c32.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/github.com/pingcap/errors/com_github_pingcap_errors-v0.11.5-0.20221009092201-b66cddb77c32.zip", + "http://bazel-cache.pingcap.net:8080/gomod/github.com/pingcap/errors/com_github_pingcap_errors-v0.11.5-0.20231212100244-799fae176cfb.zip", + "http://ats.apps.svc/gomod/github.com/pingcap/errors/com_github_pingcap_errors-v0.11.5-0.20231212100244-799fae176cfb.zip", + "https://cache.hawkingrei.com/gomod/github.com/pingcap/errors/com_github_pingcap_errors-v0.11.5-0.20231212100244-799fae176cfb.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/github.com/pingcap/errors/com_github_pingcap_errors-v0.11.5-0.20231212100244-799fae176cfb.zip", ], ) go_repository( @@ -5923,13 +5862,13 @@ def go_deps(): name = "com_github_pingcap_kvproto", build_file_proto_mode = "disable_global", importpath = "github.com/pingcap/kvproto", - sha256 = "457e1273f6c608e8276f6904d7db6c25d8480621e00814a4c911edaffb9041fe", - strip_prefix = "github.com/pingcap/kvproto@v0.0.0-20231122054644-fb0f5c2a0a10", + sha256 = "53da7bf27e06dedfeea1b523941e8adb94d7d7ed5f93dbfb7467cb71b5d19bd6", + strip_prefix = "github.com/pingcap/kvproto@v0.0.0-20240109063850-932639606bcf", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/github.com/pingcap/kvproto/com_github_pingcap_kvproto-v0.0.0-20231122054644-fb0f5c2a0a10.zip", - "http://ats.apps.svc/gomod/github.com/pingcap/kvproto/com_github_pingcap_kvproto-v0.0.0-20231122054644-fb0f5c2a0a10.zip", - "https://cache.hawkingrei.com/gomod/github.com/pingcap/kvproto/com_github_pingcap_kvproto-v0.0.0-20231122054644-fb0f5c2a0a10.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/github.com/pingcap/kvproto/com_github_pingcap_kvproto-v0.0.0-20231122054644-fb0f5c2a0a10.zip", + "http://bazel-cache.pingcap.net:8080/gomod/github.com/pingcap/kvproto/com_github_pingcap_kvproto-v0.0.0-20240109063850-932639606bcf.zip", + "http://ats.apps.svc/gomod/github.com/pingcap/kvproto/com_github_pingcap_kvproto-v0.0.0-20240109063850-932639606bcf.zip", + "https://cache.hawkingrei.com/gomod/github.com/pingcap/kvproto/com_github_pingcap_kvproto-v0.0.0-20240109063850-932639606bcf.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/github.com/pingcap/kvproto/com_github_pingcap_kvproto-v0.0.0-20240109063850-932639606bcf.zip", ], ) go_repository( @@ -5975,13 +5914,13 @@ def go_deps(): name = "com_github_pkg_browser", build_file_proto_mode = "disable_global", importpath = "github.com/pkg/browser", - sha256 = "84db38d8db553ccc34c75f867396126eac07774b979c470f97a20854d3a3af6d", - strip_prefix = "github.com/pkg/browser@v0.0.0-20210115035449-ce105d075bb4", + sha256 = "415b8b7d7e47074cf3f6c2269d8712efa8a8433cba7bfce7eed22ca7f0b447a4", + strip_prefix = "github.com/pkg/browser@v0.0.0-20210911075715-681adbf594b8", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/github.com/pkg/browser/com_github_pkg_browser-v0.0.0-20210115035449-ce105d075bb4.zip", - "http://ats.apps.svc/gomod/github.com/pkg/browser/com_github_pkg_browser-v0.0.0-20210115035449-ce105d075bb4.zip", - "https://cache.hawkingrei.com/gomod/github.com/pkg/browser/com_github_pkg_browser-v0.0.0-20210115035449-ce105d075bb4.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/github.com/pkg/browser/com_github_pkg_browser-v0.0.0-20210115035449-ce105d075bb4.zip", + "http://bazel-cache.pingcap.net:8080/gomod/github.com/pkg/browser/com_github_pkg_browser-v0.0.0-20210911075715-681adbf594b8.zip", + "http://ats.apps.svc/gomod/github.com/pkg/browser/com_github_pkg_browser-v0.0.0-20210911075715-681adbf594b8.zip", + "https://cache.hawkingrei.com/gomod/github.com/pkg/browser/com_github_pkg_browser-v0.0.0-20210911075715-681adbf594b8.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/github.com/pkg/browser/com_github_pkg_browser-v0.0.0-20210911075715-681adbf594b8.zip", ], ) go_repository( @@ -6040,13 +5979,13 @@ def go_deps(): name = "com_github_pmezard_go_difflib", build_file_proto_mode = "disable_global", importpath = "github.com/pmezard/go-difflib", - sha256 = "de04cecc1a4b8d53e4357051026794bcbc54f2e6a260cfac508ce69d5d6457a0", - strip_prefix = "github.com/pmezard/go-difflib@v1.0.0", + sha256 = "24ff45e356f638a53bd0c89fff961fbeaecfdb0dc5e482ceed0a2230e0e5f3b7", + strip_prefix = "github.com/pmezard/go-difflib@v1.0.1-0.20181226105442-5d4384ee4fb2", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/github.com/pmezard/go-difflib/com_github_pmezard_go_difflib-v1.0.0.zip", - "http://ats.apps.svc/gomod/github.com/pmezard/go-difflib/com_github_pmezard_go_difflib-v1.0.0.zip", - "https://cache.hawkingrei.com/gomod/github.com/pmezard/go-difflib/com_github_pmezard_go_difflib-v1.0.0.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/github.com/pmezard/go-difflib/com_github_pmezard_go_difflib-v1.0.0.zip", + "http://bazel-cache.pingcap.net:8080/gomod/github.com/pmezard/go-difflib/com_github_pmezard_go_difflib-v1.0.1-0.20181226105442-5d4384ee4fb2.zip", + "http://ats.apps.svc/gomod/github.com/pmezard/go-difflib/com_github_pmezard_go_difflib-v1.0.1-0.20181226105442-5d4384ee4fb2.zip", + "https://cache.hawkingrei.com/gomod/github.com/pmezard/go-difflib/com_github_pmezard_go_difflib-v1.0.1-0.20181226105442-5d4384ee4fb2.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/github.com/pmezard/go-difflib/com_github_pmezard_go_difflib-v1.0.1-0.20181226105442-5d4384ee4fb2.zip", ], ) go_repository( @@ -6062,19 +6001,6 @@ def go_deps(): "https://storage.googleapis.com/pingcapmirror/gomod/github.com/polyfloyd/go-errorlint/com_github_polyfloyd_go_errorlint-v1.4.5.zip", ], ) - go_repository( - name = "com_github_posener_complete", - build_file_proto_mode = "disable_global", - importpath = "github.com/posener/complete", - sha256 = "828ec8cd2a7a4f57b238d7475bce89dcccf8f5dc9f55008fdc435bceeb83d927", - strip_prefix = "github.com/posener/complete@v1.1.1", - urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/github.com/posener/complete/com_github_posener_complete-v1.1.1.zip", - "http://ats.apps.svc/gomod/github.com/posener/complete/com_github_posener_complete-v1.1.1.zip", - "https://cache.hawkingrei.com/gomod/github.com/posener/complete/com_github_posener_complete-v1.1.1.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/github.com/posener/complete/com_github_posener_complete-v1.1.1.zip", - ], - ) go_repository( name = "com_github_power_devops_perfstat", build_file_proto_mode = "disable_global", @@ -6101,17 +6027,30 @@ def go_deps(): "https://storage.googleapis.com/pingcapmirror/gomod/github.com/prashantv/gostub/com_github_prashantv_gostub-v1.1.0.zip", ], ) + go_repository( + name = "com_github_prometheus_alertmanager", + build_file_proto_mode = "disable_global", + importpath = "github.com/prometheus/alertmanager", + sha256 = "7666007c7ccec339fd09aaeec1d15c5b8c26cb01d387c9a9f7273f904db825b0", + strip_prefix = "github.com/prometheus/alertmanager@v0.26.0", + urls = [ + "http://bazel-cache.pingcap.net:8080/gomod/github.com/prometheus/alertmanager/com_github_prometheus_alertmanager-v0.26.0.zip", + "http://ats.apps.svc/gomod/github.com/prometheus/alertmanager/com_github_prometheus_alertmanager-v0.26.0.zip", + "https://cache.hawkingrei.com/gomod/github.com/prometheus/alertmanager/com_github_prometheus_alertmanager-v0.26.0.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/github.com/prometheus/alertmanager/com_github_prometheus_alertmanager-v0.26.0.zip", + ], + ) go_repository( name = "com_github_prometheus_client_golang", build_file_proto_mode = "disable_global", importpath = "github.com/prometheus/client_golang", - sha256 = "db3c3279e5f3377cc21bf7f353ba67a7472321fad5562990cd55adc2127538f9", - strip_prefix = "github.com/prometheus/client_golang@v1.17.0", + sha256 = "796a019bdd9b4000c228ea3345528592a27219c18c3fa36fece884110ed1f4cd", + strip_prefix = "github.com/prometheus/client_golang@v1.18.0", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/github.com/prometheus/client_golang/com_github_prometheus_client_golang-v1.17.0.zip", - "http://ats.apps.svc/gomod/github.com/prometheus/client_golang/com_github_prometheus_client_golang-v1.17.0.zip", - "https://cache.hawkingrei.com/gomod/github.com/prometheus/client_golang/com_github_prometheus_client_golang-v1.17.0.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/github.com/prometheus/client_golang/com_github_prometheus_client_golang-v1.17.0.zip", + "http://bazel-cache.pingcap.net:8080/gomod/github.com/prometheus/client_golang/com_github_prometheus_client_golang-v1.18.0.zip", + "http://ats.apps.svc/gomod/github.com/prometheus/client_golang/com_github_prometheus_client_golang-v1.18.0.zip", + "https://cache.hawkingrei.com/gomod/github.com/prometheus/client_golang/com_github_prometheus_client_golang-v1.18.0.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/github.com/prometheus/client_golang/com_github_prometheus_client_golang-v1.18.0.zip", ], ) go_repository( @@ -6140,6 +6079,45 @@ def go_deps(): "https://storage.googleapis.com/pingcapmirror/gomod/github.com/prometheus/common/com_github_prometheus_common-v0.45.0.zip", ], ) + go_repository( + name = "com_github_prometheus_common_assets", + build_file_proto_mode = "disable_global", + importpath = "github.com/prometheus/common/assets", + sha256 = "e8bcf444eb69d4dc41764f84401d57a181d282250e4c97b3c2bb31edc93e984b", + strip_prefix = "github.com/prometheus/common/assets@v0.2.0", + urls = [ + "http://bazel-cache.pingcap.net:8080/gomod/github.com/prometheus/common/assets/com_github_prometheus_common_assets-v0.2.0.zip", + "http://ats.apps.svc/gomod/github.com/prometheus/common/assets/com_github_prometheus_common_assets-v0.2.0.zip", + "https://cache.hawkingrei.com/gomod/github.com/prometheus/common/assets/com_github_prometheus_common_assets-v0.2.0.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/github.com/prometheus/common/assets/com_github_prometheus_common_assets-v0.2.0.zip", + ], + ) + go_repository( + name = "com_github_prometheus_common_sigv4", + build_file_proto_mode = "disable_global", + importpath = "github.com/prometheus/common/sigv4", + sha256 = "e76ec796837158dc2624343f88da4ba3c5d9d4b45e66b359358eba5db39846dd", + strip_prefix = "github.com/prometheus/common/sigv4@v0.1.0", + urls = [ + "http://bazel-cache.pingcap.net:8080/gomod/github.com/prometheus/common/sigv4/com_github_prometheus_common_sigv4-v0.1.0.zip", + "http://ats.apps.svc/gomod/github.com/prometheus/common/sigv4/com_github_prometheus_common_sigv4-v0.1.0.zip", + "https://cache.hawkingrei.com/gomod/github.com/prometheus/common/sigv4/com_github_prometheus_common_sigv4-v0.1.0.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/github.com/prometheus/common/sigv4/com_github_prometheus_common_sigv4-v0.1.0.zip", + ], + ) + go_repository( + name = "com_github_prometheus_exporter_toolkit", + build_file_proto_mode = "disable_global", + importpath = "github.com/prometheus/exporter-toolkit", + sha256 = "d6d1eee3a082bd82744db81a52b01e4923932b498f92411ca57390e7489cf34b", + strip_prefix = "github.com/prometheus/exporter-toolkit@v0.10.0", + urls = [ + "http://bazel-cache.pingcap.net:8080/gomod/github.com/prometheus/exporter-toolkit/com_github_prometheus_exporter_toolkit-v0.10.0.zip", + "http://ats.apps.svc/gomod/github.com/prometheus/exporter-toolkit/com_github_prometheus_exporter_toolkit-v0.10.0.zip", + "https://cache.hawkingrei.com/gomod/github.com/prometheus/exporter-toolkit/com_github_prometheus_exporter_toolkit-v0.10.0.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/github.com/prometheus/exporter-toolkit/com_github_prometheus_exporter_toolkit-v0.10.0.zip", + ], + ) go_repository( name = "com_github_prometheus_procfs", build_file_proto_mode = "disable_global", @@ -6157,26 +6135,13 @@ def go_deps(): name = "com_github_prometheus_prometheus", build_file_proto_mode = "disable_global", importpath = "github.com/prometheus/prometheus", - sha256 = "de87fe7382f3fcea38548f0e8b636faffa4104264c41d7cbcb4ec243d54a898d", - strip_prefix = "github.com/prometheus/prometheus@v0.0.0-20190525122359-d20e84d0fb64", + sha256 = "942dba743bc78a6933cc9c2fbcc3d1d301254d3fd343975476ecd73573866f6e", + strip_prefix = "github.com/prometheus/prometheus@v0.48.1", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/github.com/prometheus/prometheus/com_github_prometheus_prometheus-v0.0.0-20190525122359-d20e84d0fb64.zip", - "http://ats.apps.svc/gomod/github.com/prometheus/prometheus/com_github_prometheus_prometheus-v0.0.0-20190525122359-d20e84d0fb64.zip", - "https://cache.hawkingrei.com/gomod/github.com/prometheus/prometheus/com_github_prometheus_prometheus-v0.0.0-20190525122359-d20e84d0fb64.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/github.com/prometheus/prometheus/com_github_prometheus_prometheus-v0.0.0-20190525122359-d20e84d0fb64.zip", - ], - ) - go_repository( - name = "com_github_prometheus_tsdb", - build_file_proto_mode = "disable_global", - importpath = "github.com/prometheus/tsdb", - sha256 = "34e98f0e9ba55e7290774ee40569737745b395e32811e5940d2ed124a20f927c", - strip_prefix = "github.com/prometheus/tsdb@v0.10.0", - urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/github.com/prometheus/tsdb/com_github_prometheus_tsdb-v0.10.0.zip", - "http://ats.apps.svc/gomod/github.com/prometheus/tsdb/com_github_prometheus_tsdb-v0.10.0.zip", - "https://cache.hawkingrei.com/gomod/github.com/prometheus/tsdb/com_github_prometheus_tsdb-v0.10.0.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/github.com/prometheus/tsdb/com_github_prometheus_tsdb-v0.10.0.zip", + "http://bazel-cache.pingcap.net:8080/gomod/github.com/prometheus/prometheus/com_github_prometheus_prometheus-v0.48.1.zip", + "http://ats.apps.svc/gomod/github.com/prometheus/prometheus/com_github_prometheus_prometheus-v0.48.1.zip", + "https://cache.hawkingrei.com/gomod/github.com/prometheus/prometheus/com_github_prometheus_prometheus-v0.48.1.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/github.com/prometheus/prometheus/com_github_prometheus_prometheus-v0.48.1.zip", ], ) go_repository( @@ -6283,19 +6248,6 @@ def go_deps(): "https://storage.googleapis.com/pingcapmirror/gomod/github.com/rivo/uniseg/com_github_rivo_uniseg-v0.4.4.zip", ], ) - go_repository( - name = "com_github_rlmcpherson_s3gof3r", - build_file_proto_mode = "disable_global", - importpath = "github.com/rlmcpherson/s3gof3r", - sha256 = "570e59b69f0b3a33b0c382e19c6674fc17d981dc7d2c41db2fe42510131f1423", - strip_prefix = "github.com/rlmcpherson/s3gof3r@v0.5.0", - urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/github.com/rlmcpherson/s3gof3r/com_github_rlmcpherson_s3gof3r-v0.5.0.zip", - "http://ats.apps.svc/gomod/github.com/rlmcpherson/s3gof3r/com_github_rlmcpherson_s3gof3r-v0.5.0.zip", - "https://cache.hawkingrei.com/gomod/github.com/rlmcpherson/s3gof3r/com_github_rlmcpherson_s3gof3r-v0.5.0.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/github.com/rlmcpherson/s3gof3r/com_github_rlmcpherson_s3gof3r-v0.5.0.zip", - ], - ) go_repository( name = "com_github_robfig_cron_v3", build_file_proto_mode = "disable_global", @@ -6335,19 +6287,6 @@ def go_deps(): "https://storage.googleapis.com/pingcapmirror/gomod/github.com/rogpeppe/go-internal/com_github_rogpeppe_go_internal-v1.11.0.zip", ], ) - go_repository( - name = "com_github_rubyist_circuitbreaker", - build_file_proto_mode = "disable_global", - importpath = "github.com/rubyist/circuitbreaker", - sha256 = "fc1125d9260a471d349c94a251340c437f98743b42324706482596f303c28b11", - strip_prefix = "github.com/rubyist/circuitbreaker@v2.2.1+incompatible", - urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/github.com/rubyist/circuitbreaker/com_github_rubyist_circuitbreaker-v2.2.1+incompatible.zip", - "http://ats.apps.svc/gomod/github.com/rubyist/circuitbreaker/com_github_rubyist_circuitbreaker-v2.2.1+incompatible.zip", - "https://cache.hawkingrei.com/gomod/github.com/rubyist/circuitbreaker/com_github_rubyist_circuitbreaker-v2.2.1+incompatible.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/github.com/rubyist/circuitbreaker/com_github_rubyist_circuitbreaker-v2.2.1+incompatible.zip", - ], - ) go_repository( name = "com_github_russross_blackfriday", build_file_proto_mode = "disable_global", @@ -6426,19 +6365,6 @@ def go_deps(): "https://storage.googleapis.com/pingcapmirror/gomod/github.com/ryszard/goskiplist/com_github_ryszard_goskiplist-v0.0.0-20150312221310-2dfbae5fcf46.zip", ], ) - go_repository( - name = "com_github_samuel_go_zookeeper", - build_file_proto_mode = "disable_global", - importpath = "github.com/samuel/go-zookeeper", - sha256 = "229ebba6824b318d379a00d4cbaff13143ea1b93f916bf36d11054da36f39239", - strip_prefix = "github.com/samuel/go-zookeeper@v0.0.0-20161028232340-1d7be4effb13", - urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/github.com/samuel/go-zookeeper/com_github_samuel_go_zookeeper-v0.0.0-20161028232340-1d7be4effb13.zip", - "http://ats.apps.svc/gomod/github.com/samuel/go-zookeeper/com_github_samuel_go_zookeeper-v0.0.0-20161028232340-1d7be4effb13.zip", - "https://cache.hawkingrei.com/gomod/github.com/samuel/go-zookeeper/com_github_samuel_go_zookeeper-v0.0.0-20161028232340-1d7be4effb13.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/github.com/samuel/go-zookeeper/com_github_samuel_go_zookeeper-v0.0.0-20161028232340-1d7be4effb13.zip", - ], - ) go_repository( name = "com_github_sanposhiho_wastedassign_v2", build_file_proto_mode = "disable_global", @@ -6492,16 +6418,16 @@ def go_deps(): ], ) go_repository( - name = "com_github_satori_go_uuid", + name = "com_github_scaleway_scaleway_sdk_go", build_file_proto_mode = "disable_global", - importpath = "github.com/satori/go.uuid", - sha256 = "4f741306a0cbe97581e34a638531bcafe3c2848150539a2ec2ba12c5e3e6cbdd", - strip_prefix = "github.com/satori/go.uuid@v1.2.0", + importpath = "github.com/scaleway/scaleway-sdk-go", + sha256 = "c1c638a823b55c10a89bf55a501c55dc91ee2aced5e677d66748363923d34108", + strip_prefix = "github.com/scaleway/scaleway-sdk-go@v1.0.0-beta.21", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/github.com/satori/go.uuid/com_github_satori_go_uuid-v1.2.0.zip", - "http://ats.apps.svc/gomod/github.com/satori/go.uuid/com_github_satori_go_uuid-v1.2.0.zip", - "https://cache.hawkingrei.com/gomod/github.com/satori/go.uuid/com_github_satori_go_uuid-v1.2.0.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/github.com/satori/go.uuid/com_github_satori_go_uuid-v1.2.0.zip", + "http://bazel-cache.pingcap.net:8080/gomod/github.com/scaleway/scaleway-sdk-go/com_github_scaleway_scaleway_sdk_go-v1.0.0-beta.21.zip", + "http://ats.apps.svc/gomod/github.com/scaleway/scaleway-sdk-go/com_github_scaleway_scaleway_sdk_go-v1.0.0-beta.21.zip", + "https://cache.hawkingrei.com/gomod/github.com/scaleway/scaleway-sdk-go/com_github_scaleway_scaleway_sdk_go-v1.0.0-beta.21.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/github.com/scaleway/scaleway-sdk-go/com_github_scaleway_scaleway_sdk_go-v1.0.0-beta.21.zip", ], ) go_repository( @@ -6517,19 +6443,6 @@ def go_deps(): "https://storage.googleapis.com/pingcapmirror/gomod/github.com/sclevine/agouti/com_github_sclevine_agouti-v3.0.0+incompatible.zip", ], ) - go_repository( - name = "com_github_sean__seed", - build_file_proto_mode = "disable_global", - importpath = "github.com/sean-/seed", - sha256 = "0bc8e6e0a07e554674b0bb92ef4eb7de1650056b50878eed8d5d631aec9b6362", - strip_prefix = "github.com/sean-/seed@v0.0.0-20170313163322-e2103e2c3529", - urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/github.com/sean-/seed/com_github_sean__seed-v0.0.0-20170313163322-e2103e2c3529.zip", - "http://ats.apps.svc/gomod/github.com/sean-/seed/com_github_sean__seed-v0.0.0-20170313163322-e2103e2c3529.zip", - "https://cache.hawkingrei.com/gomod/github.com/sean-/seed/com_github_sean__seed-v0.0.0-20170313163322-e2103e2c3529.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/github.com/sean-/seed/com_github_sean__seed-v0.0.0-20170313163322-e2103e2c3529.zip", - ], - ) go_repository( name = "com_github_securego_gosec_v2", build_file_proto_mode = "disable_global", @@ -6690,13 +6603,13 @@ def go_deps(): name = "com_github_shurcool_httpfs", build_file_proto_mode = "disable_global", importpath = "github.com/shurcooL/httpfs", - sha256 = "a2079dbd8c236262ecbb22312467265fbbddd9b5ee789531c5f7f24fbdda174b", - strip_prefix = "github.com/shurcooL/httpfs@v0.0.0-20190707220628-8d4bc4ba7749", + sha256 = "4b3bea8ded4d221b448bf34d21cfe0b84d60faa71aa21ac2664c67009365d7f6", + strip_prefix = "github.com/shurcooL/httpfs@v0.0.0-20230704072500-f1e31cf0ba5c", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/github.com/shurcooL/httpfs/com_github_shurcool_httpfs-v0.0.0-20190707220628-8d4bc4ba7749.zip", - "http://ats.apps.svc/gomod/github.com/shurcooL/httpfs/com_github_shurcool_httpfs-v0.0.0-20190707220628-8d4bc4ba7749.zip", - "https://cache.hawkingrei.com/gomod/github.com/shurcooL/httpfs/com_github_shurcool_httpfs-v0.0.0-20190707220628-8d4bc4ba7749.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/github.com/shurcooL/httpfs/com_github_shurcool_httpfs-v0.0.0-20190707220628-8d4bc4ba7749.zip", + "http://bazel-cache.pingcap.net:8080/gomod/github.com/shurcooL/httpfs/com_github_shurcool_httpfs-v0.0.0-20230704072500-f1e31cf0ba5c.zip", + "http://ats.apps.svc/gomod/github.com/shurcooL/httpfs/com_github_shurcool_httpfs-v0.0.0-20230704072500-f1e31cf0ba5c.zip", + "https://cache.hawkingrei.com/gomod/github.com/shurcooL/httpfs/com_github_shurcool_httpfs-v0.0.0-20230704072500-f1e31cf0ba5c.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/github.com/shurcooL/httpfs/com_github_shurcool_httpfs-v0.0.0-20230704072500-f1e31cf0ba5c.zip", ], ) go_repository( @@ -6855,19 +6768,6 @@ def go_deps(): "https://storage.googleapis.com/pingcapmirror/gomod/github.com/sourcegraph/go-diff/com_github_sourcegraph_go_diff-v0.7.0.zip", ], ) - go_repository( - name = "com_github_spaolacci_murmur3", - build_file_proto_mode = "disable_global", - importpath = "github.com/spaolacci/murmur3", - sha256 = "60bd43ada88cc70823b31fd678a8b906d48631b47145300544d45219ee6a17bc", - strip_prefix = "github.com/spaolacci/murmur3@v1.1.0", - urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/github.com/spaolacci/murmur3/com_github_spaolacci_murmur3-v1.1.0.zip", - "http://ats.apps.svc/gomod/github.com/spaolacci/murmur3/com_github_spaolacci_murmur3-v1.1.0.zip", - "https://cache.hawkingrei.com/gomod/github.com/spaolacci/murmur3/com_github_spaolacci_murmur3-v1.1.0.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/github.com/spaolacci/murmur3/com_github_spaolacci_murmur3-v1.1.0.zip", - ], - ) go_repository( name = "com_github_spf13_afero", build_file_proto_mode = "disable_global", @@ -6972,19 +6872,6 @@ def go_deps(): "https://storage.googleapis.com/pingcapmirror/gomod/github.com/ssgreg/nlreturn/v2/com_github_ssgreg_nlreturn_v2-v2.2.1.zip", ], ) - go_repository( - name = "com_github_stackexchange_wmi", - build_file_proto_mode = "disable_global", - importpath = "github.com/StackExchange/wmi", - sha256 = "78bee244eb43b1114204ae736f28c45fade2a60dd5c84e20117939787e3cb14b", - strip_prefix = "github.com/StackExchange/wmi@v0.0.0-20180725035823-b12b22c5341f", - urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/github.com/StackExchange/wmi/com_github_stackexchange_wmi-v0.0.0-20180725035823-b12b22c5341f.zip", - "http://ats.apps.svc/gomod/github.com/StackExchange/wmi/com_github_stackexchange_wmi-v0.0.0-20180725035823-b12b22c5341f.zip", - "https://cache.hawkingrei.com/gomod/github.com/StackExchange/wmi/com_github_stackexchange_wmi-v0.0.0-20180725035823-b12b22c5341f.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/github.com/StackExchange/wmi/com_github_stackexchange_wmi-v0.0.0-20180725035823-b12b22c5341f.zip", - ], - ) go_repository( name = "com_github_stathat_consistent", build_file_proto_mode = "disable_global", @@ -7145,26 +7032,26 @@ def go_deps(): name = "com_github_tikv_client_go_v2", build_file_proto_mode = "disable_global", importpath = "github.com/tikv/client-go/v2", - sha256 = "548df2ca5c27559e3318b97b4cb91703d5c253410e7f9fa0eb926e2d3aa28b59", - strip_prefix = "github.com/tikv/client-go/v2@v2.0.8-0.20231116051730-1c2351c28173", + sha256 = "0d106e10de6e58555b6e1e78f6100afe1e05388fab09857d42c3c30f4137f745", + strip_prefix = "github.com/tikv/client-go/v2@v2.0.8-0.20231227070846-61c486af13a5", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/github.com/tikv/client-go/v2/com_github_tikv_client_go_v2-v2.0.8-0.20231116051730-1c2351c28173.zip", - "http://ats.apps.svc/gomod/github.com/tikv/client-go/v2/com_github_tikv_client_go_v2-v2.0.8-0.20231116051730-1c2351c28173.zip", - "https://cache.hawkingrei.com/gomod/github.com/tikv/client-go/v2/com_github_tikv_client_go_v2-v2.0.8-0.20231116051730-1c2351c28173.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/github.com/tikv/client-go/v2/com_github_tikv_client_go_v2-v2.0.8-0.20231116051730-1c2351c28173.zip", + "http://bazel-cache.pingcap.net:8080/gomod/github.com/tikv/client-go/v2/com_github_tikv_client_go_v2-v2.0.8-0.20231227070846-61c486af13a5.zip", + "http://ats.apps.svc/gomod/github.com/tikv/client-go/v2/com_github_tikv_client_go_v2-v2.0.8-0.20231227070846-61c486af13a5.zip", + "https://cache.hawkingrei.com/gomod/github.com/tikv/client-go/v2/com_github_tikv_client_go_v2-v2.0.8-0.20231227070846-61c486af13a5.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/github.com/tikv/client-go/v2/com_github_tikv_client_go_v2-v2.0.8-0.20231227070846-61c486af13a5.zip", ], ) go_repository( name = "com_github_tikv_pd_client", build_file_proto_mode = "disable_global", importpath = "github.com/tikv/pd/client", - sha256 = "440821579da980d0405695b463da892608a59252a296cd7e52b4f97881c5fdb7", - strip_prefix = "github.com/tikv/pd/client@v0.0.0-20231121080541-8919bc11f770", + sha256 = "ea1ce959374afae8cbe31345e696f5731443c9ea6029de46fcf6844c09677c9c", + strip_prefix = "github.com/tikv/pd/client@v0.0.0-20240109100024-dd8df25316e9", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/github.com/tikv/pd/client/com_github_tikv_pd_client-v0.0.0-20231121080541-8919bc11f770.zip", - "http://ats.apps.svc/gomod/github.com/tikv/pd/client/com_github_tikv_pd_client-v0.0.0-20231121080541-8919bc11f770.zip", - "https://cache.hawkingrei.com/gomod/github.com/tikv/pd/client/com_github_tikv_pd_client-v0.0.0-20231121080541-8919bc11f770.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/github.com/tikv/pd/client/com_github_tikv_pd_client-v0.0.0-20231121080541-8919bc11f770.zip", + "http://bazel-cache.pingcap.net:8080/gomod/github.com/tikv/pd/client/com_github_tikv_pd_client-v0.0.0-20240109100024-dd8df25316e9.zip", + "http://ats.apps.svc/gomod/github.com/tikv/pd/client/com_github_tikv_pd_client-v0.0.0-20240109100024-dd8df25316e9.zip", + "https://cache.hawkingrei.com/gomod/github.com/tikv/pd/client/com_github_tikv_pd_client-v0.0.0-20240109100024-dd8df25316e9.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/github.com/tikv/pd/client/com_github_tikv_pd_client-v0.0.0-20240109100024-dd8df25316e9.zip", ], ) go_repository( @@ -7466,6 +7353,19 @@ def go_deps(): "https://storage.googleapis.com/pingcapmirror/gomod/github.com/VividCortex/ewma/com_github_vividcortex_ewma-v1.2.0.zip", ], ) + go_repository( + name = "com_github_vultr_govultr_v2", + build_file_proto_mode = "disable_global", + importpath = "github.com/vultr/govultr/v2", + sha256 = "3c8f94575d509164614b364a75529b1dab895c228a5b5516b7b6334c96e5094a", + strip_prefix = "github.com/vultr/govultr/v2@v2.17.2", + urls = [ + "http://bazel-cache.pingcap.net:8080/gomod/github.com/vultr/govultr/v2/com_github_vultr_govultr_v2-v2.17.2.zip", + "http://ats.apps.svc/gomod/github.com/vultr/govultr/v2/com_github_vultr_govultr_v2-v2.17.2.zip", + "https://cache.hawkingrei.com/gomod/github.com/vultr/govultr/v2/com_github_vultr_govultr_v2-v2.17.2.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/github.com/vultr/govultr/v2/com_github_vultr_govultr_v2-v2.17.2.zip", + ], + ) go_repository( name = "com_github_wangjohn_quickselect", build_file_proto_mode = "disable_global", @@ -7756,13 +7656,13 @@ def go_deps(): name = "com_google_cloud_go", build_file_proto_mode = "disable_global", importpath = "cloud.google.com/go", - sha256 = "65e6a32b316f200d6b3cf58f2a160dc6f68a85f073dca24c0513f74f30c78471", - strip_prefix = "cloud.google.com/go@v0.110.10", + sha256 = "b64ae080db87dc2827d84b409daaed7f4e42b56391db239e1f41e1bf076c1dd3", + strip_prefix = "cloud.google.com/go@v0.112.0", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/cloud.google.com/go/com_google_cloud_go-v0.110.10.zip", - "http://ats.apps.svc/gomod/cloud.google.com/go/com_google_cloud_go-v0.110.10.zip", - "https://cache.hawkingrei.com/gomod/cloud.google.com/go/com_google_cloud_go-v0.110.10.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/cloud.google.com/go/com_google_cloud_go-v0.110.10.zip", + "http://bazel-cache.pingcap.net:8080/gomod/cloud.google.com/go/com_google_cloud_go-v0.112.0.zip", + "http://ats.apps.svc/gomod/cloud.google.com/go/com_google_cloud_go-v0.112.0.zip", + "https://cache.hawkingrei.com/gomod/cloud.google.com/go/com_google_cloud_go-v0.112.0.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/cloud.google.com/go/com_google_cloud_go-v0.112.0.zip", ], ) go_repository( @@ -7795,26 +7695,26 @@ def go_deps(): name = "com_google_cloud_go_aiplatform", build_file_proto_mode = "disable_global", importpath = "cloud.google.com/go/aiplatform", - sha256 = "ac9a8ef2af71031070a4601a8c617b2d87f7fc6d1a3372be8c3c43ef66c98fb6", - strip_prefix = "cloud.google.com/go/aiplatform@v1.52.0", + sha256 = "8f88805d6b7f4a51a9317230871569692ef3a9fcd4bb833ae7dbfeaa623368fc", + strip_prefix = "cloud.google.com/go/aiplatform@v1.58.0", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/cloud.google.com/go/aiplatform/com_google_cloud_go_aiplatform-v1.52.0.zip", - "http://ats.apps.svc/gomod/cloud.google.com/go/aiplatform/com_google_cloud_go_aiplatform-v1.52.0.zip", - "https://cache.hawkingrei.com/gomod/cloud.google.com/go/aiplatform/com_google_cloud_go_aiplatform-v1.52.0.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/cloud.google.com/go/aiplatform/com_google_cloud_go_aiplatform-v1.52.0.zip", + "http://bazel-cache.pingcap.net:8080/gomod/cloud.google.com/go/aiplatform/com_google_cloud_go_aiplatform-v1.58.0.zip", + "http://ats.apps.svc/gomod/cloud.google.com/go/aiplatform/com_google_cloud_go_aiplatform-v1.58.0.zip", + "https://cache.hawkingrei.com/gomod/cloud.google.com/go/aiplatform/com_google_cloud_go_aiplatform-v1.58.0.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/cloud.google.com/go/aiplatform/com_google_cloud_go_aiplatform-v1.58.0.zip", ], ) go_repository( name = "com_google_cloud_go_analytics", build_file_proto_mode = "disable_global", importpath = "cloud.google.com/go/analytics", - sha256 = "4bc313552680c60feb0171f8e940913a8a61fc3830cb8973833613019528d96b", - strip_prefix = "cloud.google.com/go/analytics@v0.21.6", + sha256 = "e9da5da0996103f15c950ab2d21e577b1135ab42d71392c1dad0e87614eb12f9", + strip_prefix = "cloud.google.com/go/analytics@v0.22.0", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/cloud.google.com/go/analytics/com_google_cloud_go_analytics-v0.21.6.zip", - "http://ats.apps.svc/gomod/cloud.google.com/go/analytics/com_google_cloud_go_analytics-v0.21.6.zip", - "https://cache.hawkingrei.com/gomod/cloud.google.com/go/analytics/com_google_cloud_go_analytics-v0.21.6.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/cloud.google.com/go/analytics/com_google_cloud_go_analytics-v0.21.6.zip", + "http://bazel-cache.pingcap.net:8080/gomod/cloud.google.com/go/analytics/com_google_cloud_go_analytics-v0.22.0.zip", + "http://ats.apps.svc/gomod/cloud.google.com/go/analytics/com_google_cloud_go_analytics-v0.22.0.zip", + "https://cache.hawkingrei.com/gomod/cloud.google.com/go/analytics/com_google_cloud_go_analytics-v0.22.0.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/cloud.google.com/go/analytics/com_google_cloud_go_analytics-v0.22.0.zip", ], ) go_repository( @@ -7899,13 +7799,13 @@ def go_deps(): name = "com_google_cloud_go_asset", build_file_proto_mode = "disable_global", importpath = "cloud.google.com/go/asset", - sha256 = "98a53c57e877c9917eb8ef5427f31127fefa99ec4f2e2695f83479f1673c55a2", - strip_prefix = "cloud.google.com/go/asset@v1.15.3", + sha256 = "53d3a9799a6d46634bcad7f74c0e7d8263c806b2f4cc927ff7ac102426609c91", + strip_prefix = "cloud.google.com/go/asset@v1.17.0", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/cloud.google.com/go/asset/com_google_cloud_go_asset-v1.15.3.zip", - "http://ats.apps.svc/gomod/cloud.google.com/go/asset/com_google_cloud_go_asset-v1.15.3.zip", - "https://cache.hawkingrei.com/gomod/cloud.google.com/go/asset/com_google_cloud_go_asset-v1.15.3.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/cloud.google.com/go/asset/com_google_cloud_go_asset-v1.15.3.zip", + "http://bazel-cache.pingcap.net:8080/gomod/cloud.google.com/go/asset/com_google_cloud_go_asset-v1.17.0.zip", + "http://ats.apps.svc/gomod/cloud.google.com/go/asset/com_google_cloud_go_asset-v1.17.0.zip", + "https://cache.hawkingrei.com/gomod/cloud.google.com/go/asset/com_google_cloud_go_asset-v1.17.0.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/cloud.google.com/go/asset/com_google_cloud_go_asset-v1.17.0.zip", ], ) go_repository( @@ -7951,13 +7851,13 @@ def go_deps(): name = "com_google_cloud_go_batch", build_file_proto_mode = "disable_global", importpath = "cloud.google.com/go/batch", - sha256 = "d7f09a5da02b32c3e00759974de19b562b33869c43de1dbfa65a7b3e8c916ac4", - strip_prefix = "cloud.google.com/go/batch@v1.6.3", + sha256 = "26a4027ca15832ed4cf367ae6bb29c19a5db6e3fab416efe16abe4a1fb64497b", + strip_prefix = "cloud.google.com/go/batch@v1.7.0", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/cloud.google.com/go/batch/com_google_cloud_go_batch-v1.6.3.zip", - "http://ats.apps.svc/gomod/cloud.google.com/go/batch/com_google_cloud_go_batch-v1.6.3.zip", - "https://cache.hawkingrei.com/gomod/cloud.google.com/go/batch/com_google_cloud_go_batch-v1.6.3.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/cloud.google.com/go/batch/com_google_cloud_go_batch-v1.6.3.zip", + "http://bazel-cache.pingcap.net:8080/gomod/cloud.google.com/go/batch/com_google_cloud_go_batch-v1.7.0.zip", + "http://ats.apps.svc/gomod/cloud.google.com/go/batch/com_google_cloud_go_batch-v1.7.0.zip", + "https://cache.hawkingrei.com/gomod/cloud.google.com/go/batch/com_google_cloud_go_batch-v1.7.0.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/cloud.google.com/go/batch/com_google_cloud_go_batch-v1.7.0.zip", ], ) go_repository( @@ -7990,26 +7890,26 @@ def go_deps(): name = "com_google_cloud_go_billing", build_file_proto_mode = "disable_global", importpath = "cloud.google.com/go/billing", - sha256 = "5df058fed01cf1fb5a2a5e924e8e1aba7c790a63fb8c7c0d6d60237fa1917b44", - strip_prefix = "cloud.google.com/go/billing@v1.17.4", + sha256 = "a675de5631e1179cad0f6e36523412402552c2c436684642ea4fb464b320633c", + strip_prefix = "cloud.google.com/go/billing@v1.18.0", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/cloud.google.com/go/billing/com_google_cloud_go_billing-v1.17.4.zip", - "http://ats.apps.svc/gomod/cloud.google.com/go/billing/com_google_cloud_go_billing-v1.17.4.zip", - "https://cache.hawkingrei.com/gomod/cloud.google.com/go/billing/com_google_cloud_go_billing-v1.17.4.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/cloud.google.com/go/billing/com_google_cloud_go_billing-v1.17.4.zip", + "http://bazel-cache.pingcap.net:8080/gomod/cloud.google.com/go/billing/com_google_cloud_go_billing-v1.18.0.zip", + "http://ats.apps.svc/gomod/cloud.google.com/go/billing/com_google_cloud_go_billing-v1.18.0.zip", + "https://cache.hawkingrei.com/gomod/cloud.google.com/go/billing/com_google_cloud_go_billing-v1.18.0.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/cloud.google.com/go/billing/com_google_cloud_go_billing-v1.18.0.zip", ], ) go_repository( name = "com_google_cloud_go_binaryauthorization", build_file_proto_mode = "disable_global", importpath = "cloud.google.com/go/binaryauthorization", - sha256 = "689b3c95ee0449009ba3bf2b3ebddb750ac56ff6b4524f0786bb8ad85cebca39", - strip_prefix = "cloud.google.com/go/binaryauthorization@v1.7.3", + sha256 = "2c9242c6419862f1703fa54ee22c785fcde67ca619b936b7727d190fba296716", + strip_prefix = "cloud.google.com/go/binaryauthorization@v1.8.0", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/cloud.google.com/go/binaryauthorization/com_google_cloud_go_binaryauthorization-v1.7.3.zip", - "http://ats.apps.svc/gomod/cloud.google.com/go/binaryauthorization/com_google_cloud_go_binaryauthorization-v1.7.3.zip", - "https://cache.hawkingrei.com/gomod/cloud.google.com/go/binaryauthorization/com_google_cloud_go_binaryauthorization-v1.7.3.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/cloud.google.com/go/binaryauthorization/com_google_cloud_go_binaryauthorization-v1.7.3.zip", + "http://bazel-cache.pingcap.net:8080/gomod/cloud.google.com/go/binaryauthorization/com_google_cloud_go_binaryauthorization-v1.8.0.zip", + "http://ats.apps.svc/gomod/cloud.google.com/go/binaryauthorization/com_google_cloud_go_binaryauthorization-v1.8.0.zip", + "https://cache.hawkingrei.com/gomod/cloud.google.com/go/binaryauthorization/com_google_cloud_go_binaryauthorization-v1.8.0.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/cloud.google.com/go/binaryauthorization/com_google_cloud_go_binaryauthorization-v1.8.0.zip", ], ) go_repository( @@ -8029,26 +7929,26 @@ def go_deps(): name = "com_google_cloud_go_channel", build_file_proto_mode = "disable_global", importpath = "cloud.google.com/go/channel", - sha256 = "3d69ec1b2b1fd69def2d60e7798430bfc74408f223db4e0afe7eb07db188a0d6", - strip_prefix = "cloud.google.com/go/channel@v1.17.3", + sha256 = "7d738a3164e0bcdf43eff86060d36bb1ca38b30b7cf04ef39492838c9efc079b", + strip_prefix = "cloud.google.com/go/channel@v1.17.4", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/cloud.google.com/go/channel/com_google_cloud_go_channel-v1.17.3.zip", - "http://ats.apps.svc/gomod/cloud.google.com/go/channel/com_google_cloud_go_channel-v1.17.3.zip", - "https://cache.hawkingrei.com/gomod/cloud.google.com/go/channel/com_google_cloud_go_channel-v1.17.3.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/cloud.google.com/go/channel/com_google_cloud_go_channel-v1.17.3.zip", + "http://bazel-cache.pingcap.net:8080/gomod/cloud.google.com/go/channel/com_google_cloud_go_channel-v1.17.4.zip", + "http://ats.apps.svc/gomod/cloud.google.com/go/channel/com_google_cloud_go_channel-v1.17.4.zip", + "https://cache.hawkingrei.com/gomod/cloud.google.com/go/channel/com_google_cloud_go_channel-v1.17.4.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/cloud.google.com/go/channel/com_google_cloud_go_channel-v1.17.4.zip", ], ) go_repository( name = "com_google_cloud_go_cloudbuild", build_file_proto_mode = "disable_global", importpath = "cloud.google.com/go/cloudbuild", - sha256 = "f1ef849f9d6fed0cb77f9dcc7122d857863044850df8007e5155ba8487209965", - strip_prefix = "cloud.google.com/go/cloudbuild@v1.14.3", + sha256 = "07d461ce0826262bcdc4959f22ec62990dda585a77ee3a7fc3cd78ece7be9544", + strip_prefix = "cloud.google.com/go/cloudbuild@v1.15.0", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/cloud.google.com/go/cloudbuild/com_google_cloud_go_cloudbuild-v1.14.3.zip", - "http://ats.apps.svc/gomod/cloud.google.com/go/cloudbuild/com_google_cloud_go_cloudbuild-v1.14.3.zip", - "https://cache.hawkingrei.com/gomod/cloud.google.com/go/cloudbuild/com_google_cloud_go_cloudbuild-v1.14.3.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/cloud.google.com/go/cloudbuild/com_google_cloud_go_cloudbuild-v1.14.3.zip", + "http://bazel-cache.pingcap.net:8080/gomod/cloud.google.com/go/cloudbuild/com_google_cloud_go_cloudbuild-v1.15.0.zip", + "http://ats.apps.svc/gomod/cloud.google.com/go/cloudbuild/com_google_cloud_go_cloudbuild-v1.15.0.zip", + "https://cache.hawkingrei.com/gomod/cloud.google.com/go/cloudbuild/com_google_cloud_go_cloudbuild-v1.15.0.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/cloud.google.com/go/cloudbuild/com_google_cloud_go_cloudbuild-v1.15.0.zip", ], ) go_repository( @@ -8107,26 +8007,26 @@ def go_deps(): name = "com_google_cloud_go_contactcenterinsights", build_file_proto_mode = "disable_global", importpath = "cloud.google.com/go/contactcenterinsights", - sha256 = "d26b376d57b67a99e35f1dbb68b6396dfcc59552eb6346dae9c1fd54fc0ef6a5", - strip_prefix = "cloud.google.com/go/contactcenterinsights@v1.11.3", + sha256 = "96c8cd52aa4e5f70d189674b2fa3bf9c12f019fcffe77af849942287d6ec9563", + strip_prefix = "cloud.google.com/go/contactcenterinsights@v1.12.1", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/cloud.google.com/go/contactcenterinsights/com_google_cloud_go_contactcenterinsights-v1.11.3.zip", - "http://ats.apps.svc/gomod/cloud.google.com/go/contactcenterinsights/com_google_cloud_go_contactcenterinsights-v1.11.3.zip", - "https://cache.hawkingrei.com/gomod/cloud.google.com/go/contactcenterinsights/com_google_cloud_go_contactcenterinsights-v1.11.3.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/cloud.google.com/go/contactcenterinsights/com_google_cloud_go_contactcenterinsights-v1.11.3.zip", + "http://bazel-cache.pingcap.net:8080/gomod/cloud.google.com/go/contactcenterinsights/com_google_cloud_go_contactcenterinsights-v1.12.1.zip", + "http://ats.apps.svc/gomod/cloud.google.com/go/contactcenterinsights/com_google_cloud_go_contactcenterinsights-v1.12.1.zip", + "https://cache.hawkingrei.com/gomod/cloud.google.com/go/contactcenterinsights/com_google_cloud_go_contactcenterinsights-v1.12.1.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/cloud.google.com/go/contactcenterinsights/com_google_cloud_go_contactcenterinsights-v1.12.1.zip", ], ) go_repository( name = "com_google_cloud_go_container", build_file_proto_mode = "disable_global", importpath = "cloud.google.com/go/container", - sha256 = "0185d0ab299a3468d8e96f6d96ab680c96cb9e0718b6e017151ee2d4de681e44", - strip_prefix = "cloud.google.com/go/container@v1.27.1", + sha256 = "b022a43a70f6b33b943b1a19f8e3029816a5e3ea83452976bdf80597f49a67aa", + strip_prefix = "cloud.google.com/go/container@v1.29.0", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/cloud.google.com/go/container/com_google_cloud_go_container-v1.27.1.zip", - "http://ats.apps.svc/gomod/cloud.google.com/go/container/com_google_cloud_go_container-v1.27.1.zip", - "https://cache.hawkingrei.com/gomod/cloud.google.com/go/container/com_google_cloud_go_container-v1.27.1.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/cloud.google.com/go/container/com_google_cloud_go_container-v1.27.1.zip", + "http://bazel-cache.pingcap.net:8080/gomod/cloud.google.com/go/container/com_google_cloud_go_container-v1.29.0.zip", + "http://ats.apps.svc/gomod/cloud.google.com/go/container/com_google_cloud_go_container-v1.29.0.zip", + "https://cache.hawkingrei.com/gomod/cloud.google.com/go/container/com_google_cloud_go_container-v1.29.0.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/cloud.google.com/go/container/com_google_cloud_go_container-v1.29.0.zip", ], ) go_repository( @@ -8146,13 +8046,13 @@ def go_deps(): name = "com_google_cloud_go_datacatalog", build_file_proto_mode = "disable_global", importpath = "cloud.google.com/go/datacatalog", - sha256 = "b553802a86e5c851719265f2ead1e9b5a82e385f71be94d72871cc09d9f64473", - strip_prefix = "cloud.google.com/go/datacatalog@v1.18.3", + sha256 = "117486f884892eab8854c43786c0e62e43703fa07621af3de697f4456088575c", + strip_prefix = "cloud.google.com/go/datacatalog@v1.19.0", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/cloud.google.com/go/datacatalog/com_google_cloud_go_datacatalog-v1.18.3.zip", - "http://ats.apps.svc/gomod/cloud.google.com/go/datacatalog/com_google_cloud_go_datacatalog-v1.18.3.zip", - "https://cache.hawkingrei.com/gomod/cloud.google.com/go/datacatalog/com_google_cloud_go_datacatalog-v1.18.3.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/cloud.google.com/go/datacatalog/com_google_cloud_go_datacatalog-v1.18.3.zip", + "http://bazel-cache.pingcap.net:8080/gomod/cloud.google.com/go/datacatalog/com_google_cloud_go_datacatalog-v1.19.0.zip", + "http://ats.apps.svc/gomod/cloud.google.com/go/datacatalog/com_google_cloud_go_datacatalog-v1.19.0.zip", + "https://cache.hawkingrei.com/gomod/cloud.google.com/go/datacatalog/com_google_cloud_go_datacatalog-v1.19.0.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/cloud.google.com/go/datacatalog/com_google_cloud_go_datacatalog-v1.19.0.zip", ], ) go_repository( @@ -8211,26 +8111,26 @@ def go_deps(): name = "com_google_cloud_go_dataplex", build_file_proto_mode = "disable_global", importpath = "cloud.google.com/go/dataplex", - sha256 = "b5b04335e6d5ca695c41e795219c4a140c46e3175b8802bb5faf3a7d0fcbe5b5", - strip_prefix = "cloud.google.com/go/dataplex@v1.11.1", + sha256 = "e3222fd38c336d4ed25f26d557e3141fc3171ca60db0b085ecb823e9ccad3ed7", + strip_prefix = "cloud.google.com/go/dataplex@v1.14.0", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/cloud.google.com/go/dataplex/com_google_cloud_go_dataplex-v1.11.1.zip", - "http://ats.apps.svc/gomod/cloud.google.com/go/dataplex/com_google_cloud_go_dataplex-v1.11.1.zip", - "https://cache.hawkingrei.com/gomod/cloud.google.com/go/dataplex/com_google_cloud_go_dataplex-v1.11.1.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/cloud.google.com/go/dataplex/com_google_cloud_go_dataplex-v1.11.1.zip", + "http://bazel-cache.pingcap.net:8080/gomod/cloud.google.com/go/dataplex/com_google_cloud_go_dataplex-v1.14.0.zip", + "http://ats.apps.svc/gomod/cloud.google.com/go/dataplex/com_google_cloud_go_dataplex-v1.14.0.zip", + "https://cache.hawkingrei.com/gomod/cloud.google.com/go/dataplex/com_google_cloud_go_dataplex-v1.14.0.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/cloud.google.com/go/dataplex/com_google_cloud_go_dataplex-v1.14.0.zip", ], ) go_repository( name = "com_google_cloud_go_dataproc_v2", build_file_proto_mode = "disable_global", importpath = "cloud.google.com/go/dataproc/v2", - sha256 = "b521fdfdbc339546d214b318d7f918888a16abff55f4761d22c4bd7002cdd494", - strip_prefix = "cloud.google.com/go/dataproc/v2@v2.2.3", + sha256 = "6471eb9337da13a139c01caf534e75633475bfb9e7e8130aaa8a839470f98598", + strip_prefix = "cloud.google.com/go/dataproc/v2@v2.3.0", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/cloud.google.com/go/dataproc/v2/com_google_cloud_go_dataproc_v2-v2.2.3.zip", - "http://ats.apps.svc/gomod/cloud.google.com/go/dataproc/v2/com_google_cloud_go_dataproc_v2-v2.2.3.zip", - "https://cache.hawkingrei.com/gomod/cloud.google.com/go/dataproc/v2/com_google_cloud_go_dataproc_v2-v2.2.3.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/cloud.google.com/go/dataproc/v2/com_google_cloud_go_dataproc_v2-v2.2.3.zip", + "http://bazel-cache.pingcap.net:8080/gomod/cloud.google.com/go/dataproc/v2/com_google_cloud_go_dataproc_v2-v2.3.0.zip", + "http://ats.apps.svc/gomod/cloud.google.com/go/dataproc/v2/com_google_cloud_go_dataproc_v2-v2.3.0.zip", + "https://cache.hawkingrei.com/gomod/cloud.google.com/go/dataproc/v2/com_google_cloud_go_dataproc_v2-v2.3.0.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/cloud.google.com/go/dataproc/v2/com_google_cloud_go_dataproc_v2-v2.3.0.zip", ], ) go_repository( @@ -8276,26 +8176,26 @@ def go_deps(): name = "com_google_cloud_go_deploy", build_file_proto_mode = "disable_global", importpath = "cloud.google.com/go/deploy", - sha256 = "ebb8d298df020747a043567258f4bd7dbea45392ebe63b0fdf2791992586e539", - strip_prefix = "cloud.google.com/go/deploy@v1.14.2", + sha256 = "37ee7c5d5f9c8cf4bfc457f4e176b427378fa313ff07b2dc3b55db56beeaf171", + strip_prefix = "cloud.google.com/go/deploy@v1.16.0", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/cloud.google.com/go/deploy/com_google_cloud_go_deploy-v1.14.2.zip", - "http://ats.apps.svc/gomod/cloud.google.com/go/deploy/com_google_cloud_go_deploy-v1.14.2.zip", - "https://cache.hawkingrei.com/gomod/cloud.google.com/go/deploy/com_google_cloud_go_deploy-v1.14.2.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/cloud.google.com/go/deploy/com_google_cloud_go_deploy-v1.14.2.zip", + "http://bazel-cache.pingcap.net:8080/gomod/cloud.google.com/go/deploy/com_google_cloud_go_deploy-v1.16.0.zip", + "http://ats.apps.svc/gomod/cloud.google.com/go/deploy/com_google_cloud_go_deploy-v1.16.0.zip", + "https://cache.hawkingrei.com/gomod/cloud.google.com/go/deploy/com_google_cloud_go_deploy-v1.16.0.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/cloud.google.com/go/deploy/com_google_cloud_go_deploy-v1.16.0.zip", ], ) go_repository( name = "com_google_cloud_go_dialogflow", build_file_proto_mode = "disable_global", importpath = "cloud.google.com/go/dialogflow", - sha256 = "085bda58ebc4499d6b4c178d9c1c09ddb574716817ef3f3d3881469d710ab34c", - strip_prefix = "cloud.google.com/go/dialogflow@v1.44.3", + sha256 = "890476517906f1e76bee0b5054f89da541010d109df04a0b38468ff4fd3577fe", + strip_prefix = "cloud.google.com/go/dialogflow@v1.48.0", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/cloud.google.com/go/dialogflow/com_google_cloud_go_dialogflow-v1.44.3.zip", - "http://ats.apps.svc/gomod/cloud.google.com/go/dialogflow/com_google_cloud_go_dialogflow-v1.44.3.zip", - "https://cache.hawkingrei.com/gomod/cloud.google.com/go/dialogflow/com_google_cloud_go_dialogflow-v1.44.3.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/cloud.google.com/go/dialogflow/com_google_cloud_go_dialogflow-v1.44.3.zip", + "http://bazel-cache.pingcap.net:8080/gomod/cloud.google.com/go/dialogflow/com_google_cloud_go_dialogflow-v1.48.0.zip", + "http://ats.apps.svc/gomod/cloud.google.com/go/dialogflow/com_google_cloud_go_dialogflow-v1.48.0.zip", + "https://cache.hawkingrei.com/gomod/cloud.google.com/go/dialogflow/com_google_cloud_go_dialogflow-v1.48.0.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/cloud.google.com/go/dialogflow/com_google_cloud_go_dialogflow-v1.48.0.zip", ], ) go_repository( @@ -8315,13 +8215,13 @@ def go_deps(): name = "com_google_cloud_go_documentai", build_file_proto_mode = "disable_global", importpath = "cloud.google.com/go/documentai", - sha256 = "908e696281ff4bddd73363cceabdeff568a3dc4f781b3c8ffebd2c337481755a", - strip_prefix = "cloud.google.com/go/documentai@v1.23.5", + sha256 = "7a6127c9990bcce566a8ff04464384779cbba05b0a73ff6efdf51f1b0163dc4c", + strip_prefix = "cloud.google.com/go/documentai@v1.23.7", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/cloud.google.com/go/documentai/com_google_cloud_go_documentai-v1.23.5.zip", - "http://ats.apps.svc/gomod/cloud.google.com/go/documentai/com_google_cloud_go_documentai-v1.23.5.zip", - "https://cache.hawkingrei.com/gomod/cloud.google.com/go/documentai/com_google_cloud_go_documentai-v1.23.5.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/cloud.google.com/go/documentai/com_google_cloud_go_documentai-v1.23.5.zip", + "http://bazel-cache.pingcap.net:8080/gomod/cloud.google.com/go/documentai/com_google_cloud_go_documentai-v1.23.7.zip", + "http://ats.apps.svc/gomod/cloud.google.com/go/documentai/com_google_cloud_go_documentai-v1.23.7.zip", + "https://cache.hawkingrei.com/gomod/cloud.google.com/go/documentai/com_google_cloud_go_documentai-v1.23.7.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/cloud.google.com/go/documentai/com_google_cloud_go_documentai-v1.23.7.zip", ], ) go_repository( @@ -8393,13 +8293,13 @@ def go_deps(): name = "com_google_cloud_go_filestore", build_file_proto_mode = "disable_global", importpath = "cloud.google.com/go/filestore", - sha256 = "5e264d7e910ad767c88a4e4236ea1b26d52f5b56e18a5d6dcdb989a5020ceefb", - strip_prefix = "cloud.google.com/go/filestore@v1.7.4", + sha256 = "acbbb8611db8486e51e59f378fc91f1b4e48b86c1334246f056463ddc84392f9", + strip_prefix = "cloud.google.com/go/filestore@v1.8.0", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/cloud.google.com/go/filestore/com_google_cloud_go_filestore-v1.7.4.zip", - "http://ats.apps.svc/gomod/cloud.google.com/go/filestore/com_google_cloud_go_filestore-v1.7.4.zip", - "https://cache.hawkingrei.com/gomod/cloud.google.com/go/filestore/com_google_cloud_go_filestore-v1.7.4.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/cloud.google.com/go/filestore/com_google_cloud_go_filestore-v1.7.4.zip", + "http://bazel-cache.pingcap.net:8080/gomod/cloud.google.com/go/filestore/com_google_cloud_go_filestore-v1.8.0.zip", + "http://ats.apps.svc/gomod/cloud.google.com/go/filestore/com_google_cloud_go_filestore-v1.8.0.zip", + "https://cache.hawkingrei.com/gomod/cloud.google.com/go/filestore/com_google_cloud_go_filestore-v1.8.0.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/cloud.google.com/go/filestore/com_google_cloud_go_filestore-v1.8.0.zip", ], ) go_repository( @@ -8471,13 +8371,13 @@ def go_deps(): name = "com_google_cloud_go_gkemulticloud", build_file_proto_mode = "disable_global", importpath = "cloud.google.com/go/gkemulticloud", - sha256 = "ec3d60fcb963da75d5bf6108161567acd79f7887e4b9cfb2e4a5e53e3f69857d", - strip_prefix = "cloud.google.com/go/gkemulticloud@v1.0.3", + sha256 = "9bb6a057f06def924fd767e6370b283e7db9a643a375a08d35baeec4e1f3386a", + strip_prefix = "cloud.google.com/go/gkemulticloud@v1.1.0", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/cloud.google.com/go/gkemulticloud/com_google_cloud_go_gkemulticloud-v1.0.3.zip", - "http://ats.apps.svc/gomod/cloud.google.com/go/gkemulticloud/com_google_cloud_go_gkemulticloud-v1.0.3.zip", - "https://cache.hawkingrei.com/gomod/cloud.google.com/go/gkemulticloud/com_google_cloud_go_gkemulticloud-v1.0.3.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/cloud.google.com/go/gkemulticloud/com_google_cloud_go_gkemulticloud-v1.0.3.zip", + "http://bazel-cache.pingcap.net:8080/gomod/cloud.google.com/go/gkemulticloud/com_google_cloud_go_gkemulticloud-v1.1.0.zip", + "http://ats.apps.svc/gomod/cloud.google.com/go/gkemulticloud/com_google_cloud_go_gkemulticloud-v1.1.0.zip", + "https://cache.hawkingrei.com/gomod/cloud.google.com/go/gkemulticloud/com_google_cloud_go_gkemulticloud-v1.1.0.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/cloud.google.com/go/gkemulticloud/com_google_cloud_go_gkemulticloud-v1.1.0.zip", ], ) go_repository( @@ -8588,13 +8488,13 @@ def go_deps(): name = "com_google_cloud_go_logging", build_file_proto_mode = "disable_global", importpath = "cloud.google.com/go/logging", - sha256 = "8b2275192caa4b3f260c23edcf2ae08a45e510573fca5487c7a21056fd88d3f9", - strip_prefix = "cloud.google.com/go/logging@v1.8.1", + sha256 = "abc0c1703a42cbbd58108e003596bb3c803847c28a9df43354dd9f8a1a55b4b8", + strip_prefix = "cloud.google.com/go/logging@v1.9.0", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/cloud.google.com/go/logging/com_google_cloud_go_logging-v1.8.1.zip", - "http://ats.apps.svc/gomod/cloud.google.com/go/logging/com_google_cloud_go_logging-v1.8.1.zip", - "https://cache.hawkingrei.com/gomod/cloud.google.com/go/logging/com_google_cloud_go_logging-v1.8.1.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/cloud.google.com/go/logging/com_google_cloud_go_logging-v1.8.1.zip", + "http://bazel-cache.pingcap.net:8080/gomod/cloud.google.com/go/logging/com_google_cloud_go_logging-v1.9.0.zip", + "http://ats.apps.svc/gomod/cloud.google.com/go/logging/com_google_cloud_go_logging-v1.9.0.zip", + "https://cache.hawkingrei.com/gomod/cloud.google.com/go/logging/com_google_cloud_go_logging-v1.9.0.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/cloud.google.com/go/logging/com_google_cloud_go_logging-v1.9.0.zip", ], ) go_repository( @@ -8627,13 +8527,13 @@ def go_deps(): name = "com_google_cloud_go_maps", build_file_proto_mode = "disable_global", importpath = "cloud.google.com/go/maps", - sha256 = "c05c26dd3bcafd9d6f617cc9d2291760cc83d1946b5cb3de00e29e210147404d", - strip_prefix = "cloud.google.com/go/maps@v1.6.1", + sha256 = "665fc09d439834279ef167d50a87b0ea8520f8dabe4d605c837d093281277e17", + strip_prefix = "cloud.google.com/go/maps@v1.6.2", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/cloud.google.com/go/maps/com_google_cloud_go_maps-v1.6.1.zip", - "http://ats.apps.svc/gomod/cloud.google.com/go/maps/com_google_cloud_go_maps-v1.6.1.zip", - "https://cache.hawkingrei.com/gomod/cloud.google.com/go/maps/com_google_cloud_go_maps-v1.6.1.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/cloud.google.com/go/maps/com_google_cloud_go_maps-v1.6.1.zip", + "http://bazel-cache.pingcap.net:8080/gomod/cloud.google.com/go/maps/com_google_cloud_go_maps-v1.6.2.zip", + "http://ats.apps.svc/gomod/cloud.google.com/go/maps/com_google_cloud_go_maps-v1.6.2.zip", + "https://cache.hawkingrei.com/gomod/cloud.google.com/go/maps/com_google_cloud_go_maps-v1.6.2.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/cloud.google.com/go/maps/com_google_cloud_go_maps-v1.6.2.zip", ], ) go_repository( @@ -8679,13 +8579,13 @@ def go_deps(): name = "com_google_cloud_go_monitoring", build_file_proto_mode = "disable_global", importpath = "cloud.google.com/go/monitoring", - sha256 = "3efde7106653d6791f116cfd445dcfdd51f6b732226688b5ad5feae69fa42924", - strip_prefix = "cloud.google.com/go/monitoring@v1.16.3", + sha256 = "b6397501b2403876b33430adc4d59d162231c13449214b16281da25667cb9120", + strip_prefix = "cloud.google.com/go/monitoring@v1.17.0", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/cloud.google.com/go/monitoring/com_google_cloud_go_monitoring-v1.16.3.zip", - "http://ats.apps.svc/gomod/cloud.google.com/go/monitoring/com_google_cloud_go_monitoring-v1.16.3.zip", - "https://cache.hawkingrei.com/gomod/cloud.google.com/go/monitoring/com_google_cloud_go_monitoring-v1.16.3.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/cloud.google.com/go/monitoring/com_google_cloud_go_monitoring-v1.16.3.zip", + "http://bazel-cache.pingcap.net:8080/gomod/cloud.google.com/go/monitoring/com_google_cloud_go_monitoring-v1.17.0.zip", + "http://ats.apps.svc/gomod/cloud.google.com/go/monitoring/com_google_cloud_go_monitoring-v1.17.0.zip", + "https://cache.hawkingrei.com/gomod/cloud.google.com/go/monitoring/com_google_cloud_go_monitoring-v1.17.0.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/cloud.google.com/go/monitoring/com_google_cloud_go_monitoring-v1.17.0.zip", ], ) go_repository( @@ -8770,13 +8670,13 @@ def go_deps(): name = "com_google_cloud_go_orgpolicy", build_file_proto_mode = "disable_global", importpath = "cloud.google.com/go/orgpolicy", - sha256 = "97839eca96155da1a5d4e9ed13491c1a7afd8e57fe98efa8c590fad77f935dcd", - strip_prefix = "cloud.google.com/go/orgpolicy@v1.11.4", + sha256 = "bc7da766f28769503d931c707e57cdf2f6a4dffe6bda1f234b32d5a672d00b00", + strip_prefix = "cloud.google.com/go/orgpolicy@v1.12.0", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/cloud.google.com/go/orgpolicy/com_google_cloud_go_orgpolicy-v1.11.4.zip", - "http://ats.apps.svc/gomod/cloud.google.com/go/orgpolicy/com_google_cloud_go_orgpolicy-v1.11.4.zip", - "https://cache.hawkingrei.com/gomod/cloud.google.com/go/orgpolicy/com_google_cloud_go_orgpolicy-v1.11.4.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/cloud.google.com/go/orgpolicy/com_google_cloud_go_orgpolicy-v1.11.4.zip", + "http://bazel-cache.pingcap.net:8080/gomod/cloud.google.com/go/orgpolicy/com_google_cloud_go_orgpolicy-v1.12.0.zip", + "http://ats.apps.svc/gomod/cloud.google.com/go/orgpolicy/com_google_cloud_go_orgpolicy-v1.12.0.zip", + "https://cache.hawkingrei.com/gomod/cloud.google.com/go/orgpolicy/com_google_cloud_go_orgpolicy-v1.12.0.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/cloud.google.com/go/orgpolicy/com_google_cloud_go_orgpolicy-v1.12.0.zip", ], ) go_repository( @@ -8874,13 +8774,13 @@ def go_deps(): name = "com_google_cloud_go_recaptchaenterprise_v2", build_file_proto_mode = "disable_global", importpath = "cloud.google.com/go/recaptchaenterprise/v2", - sha256 = "7f00c16714a2ae8caad220cc9f91188024a2dd46495fb410f44fc9872d3734c5", - strip_prefix = "cloud.google.com/go/recaptchaenterprise/v2@v2.8.3", + sha256 = "e00c995c3b6e1d77ee65826f75bd2981e22360057323297ac2a378f25d0c8055", + strip_prefix = "cloud.google.com/go/recaptchaenterprise/v2@v2.9.0", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/cloud.google.com/go/recaptchaenterprise/v2/com_google_cloud_go_recaptchaenterprise_v2-v2.8.3.zip", - "http://ats.apps.svc/gomod/cloud.google.com/go/recaptchaenterprise/v2/com_google_cloud_go_recaptchaenterprise_v2-v2.8.3.zip", - "https://cache.hawkingrei.com/gomod/cloud.google.com/go/recaptchaenterprise/v2/com_google_cloud_go_recaptchaenterprise_v2-v2.8.3.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/cloud.google.com/go/recaptchaenterprise/v2/com_google_cloud_go_recaptchaenterprise_v2-v2.8.3.zip", + "http://bazel-cache.pingcap.net:8080/gomod/cloud.google.com/go/recaptchaenterprise/v2/com_google_cloud_go_recaptchaenterprise_v2-v2.9.0.zip", + "http://ats.apps.svc/gomod/cloud.google.com/go/recaptchaenterprise/v2/com_google_cloud_go_recaptchaenterprise_v2-v2.9.0.zip", + "https://cache.hawkingrei.com/gomod/cloud.google.com/go/recaptchaenterprise/v2/com_google_cloud_go_recaptchaenterprise_v2-v2.9.0.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/cloud.google.com/go/recaptchaenterprise/v2/com_google_cloud_go_recaptchaenterprise_v2-v2.9.0.zip", ], ) go_repository( @@ -8900,13 +8800,13 @@ def go_deps(): name = "com_google_cloud_go_recommender", build_file_proto_mode = "disable_global", importpath = "cloud.google.com/go/recommender", - sha256 = "91d47908960d25962b698dfa918db6fe8ce7f7c997b8c70243f2522019cdce92", - strip_prefix = "cloud.google.com/go/recommender@v1.11.3", + sha256 = "50befdd4adcaf218907e92a797531f047700f1ea9d82ef7489b92e07f0512b94", + strip_prefix = "cloud.google.com/go/recommender@v1.12.0", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/cloud.google.com/go/recommender/com_google_cloud_go_recommender-v1.11.3.zip", - "http://ats.apps.svc/gomod/cloud.google.com/go/recommender/com_google_cloud_go_recommender-v1.11.3.zip", - "https://cache.hawkingrei.com/gomod/cloud.google.com/go/recommender/com_google_cloud_go_recommender-v1.11.3.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/cloud.google.com/go/recommender/com_google_cloud_go_recommender-v1.11.3.zip", + "http://bazel-cache.pingcap.net:8080/gomod/cloud.google.com/go/recommender/com_google_cloud_go_recommender-v1.12.0.zip", + "http://ats.apps.svc/gomod/cloud.google.com/go/recommender/com_google_cloud_go_recommender-v1.12.0.zip", + "https://cache.hawkingrei.com/gomod/cloud.google.com/go/recommender/com_google_cloud_go_recommender-v1.12.0.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/cloud.google.com/go/recommender/com_google_cloud_go_recommender-v1.12.0.zip", ], ) go_repository( @@ -8978,13 +8878,13 @@ def go_deps(): name = "com_google_cloud_go_scheduler", build_file_proto_mode = "disable_global", importpath = "cloud.google.com/go/scheduler", - sha256 = "eb4159cd7e874e6382b8e6aa828956bd3e3d01b26baf7c98ce25f80c67d19955", - strip_prefix = "cloud.google.com/go/scheduler@v1.10.4", + sha256 = "2473302c464f345db4fce2ed455adda7719db0c968f10f6670b776f84dfbb803", + strip_prefix = "cloud.google.com/go/scheduler@v1.10.5", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/cloud.google.com/go/scheduler/com_google_cloud_go_scheduler-v1.10.4.zip", - "http://ats.apps.svc/gomod/cloud.google.com/go/scheduler/com_google_cloud_go_scheduler-v1.10.4.zip", - "https://cache.hawkingrei.com/gomod/cloud.google.com/go/scheduler/com_google_cloud_go_scheduler-v1.10.4.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/cloud.google.com/go/scheduler/com_google_cloud_go_scheduler-v1.10.4.zip", + "http://bazel-cache.pingcap.net:8080/gomod/cloud.google.com/go/scheduler/com_google_cloud_go_scheduler-v1.10.5.zip", + "http://ats.apps.svc/gomod/cloud.google.com/go/scheduler/com_google_cloud_go_scheduler-v1.10.5.zip", + "https://cache.hawkingrei.com/gomod/cloud.google.com/go/scheduler/com_google_cloud_go_scheduler-v1.10.5.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/cloud.google.com/go/scheduler/com_google_cloud_go_scheduler-v1.10.5.zip", ], ) go_repository( @@ -9017,13 +8917,13 @@ def go_deps(): name = "com_google_cloud_go_securitycenter", build_file_proto_mode = "disable_global", importpath = "cloud.google.com/go/securitycenter", - sha256 = "9f8495ac103e255ec42d0b1de9f93ebe7308b6614f705cbce1e13f02d260781d", - strip_prefix = "cloud.google.com/go/securitycenter@v1.24.2", + sha256 = "df7a9c403bb5d6e392243c023afe01211c9b4f5a2ba97e723ffd0c4c91a59677", + strip_prefix = "cloud.google.com/go/securitycenter@v1.24.3", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/cloud.google.com/go/securitycenter/com_google_cloud_go_securitycenter-v1.24.2.zip", - "http://ats.apps.svc/gomod/cloud.google.com/go/securitycenter/com_google_cloud_go_securitycenter-v1.24.2.zip", - "https://cache.hawkingrei.com/gomod/cloud.google.com/go/securitycenter/com_google_cloud_go_securitycenter-v1.24.2.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/cloud.google.com/go/securitycenter/com_google_cloud_go_securitycenter-v1.24.2.zip", + "http://bazel-cache.pingcap.net:8080/gomod/cloud.google.com/go/securitycenter/com_google_cloud_go_securitycenter-v1.24.3.zip", + "http://ats.apps.svc/gomod/cloud.google.com/go/securitycenter/com_google_cloud_go_securitycenter-v1.24.3.zip", + "https://cache.hawkingrei.com/gomod/cloud.google.com/go/securitycenter/com_google_cloud_go_securitycenter-v1.24.3.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/cloud.google.com/go/securitycenter/com_google_cloud_go_securitycenter-v1.24.3.zip", ], ) go_repository( @@ -9056,39 +8956,39 @@ def go_deps(): name = "com_google_cloud_go_spanner", build_file_proto_mode = "disable_global", importpath = "cloud.google.com/go/spanner", - sha256 = "4d60c2d98601cd8d11e332bb821ce5ee3c06ca8b4e58989d5efb18e135893f85", - strip_prefix = "cloud.google.com/go/spanner@v1.51.0", + sha256 = "21399c4123f27dccd04a1ec9cdd263b7412f8db259030265aab1f8fb92091d48", + strip_prefix = "cloud.google.com/go/spanner@v1.54.0", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/cloud.google.com/go/spanner/com_google_cloud_go_spanner-v1.51.0.zip", - "http://ats.apps.svc/gomod/cloud.google.com/go/spanner/com_google_cloud_go_spanner-v1.51.0.zip", - "https://cache.hawkingrei.com/gomod/cloud.google.com/go/spanner/com_google_cloud_go_spanner-v1.51.0.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/cloud.google.com/go/spanner/com_google_cloud_go_spanner-v1.51.0.zip", + "http://bazel-cache.pingcap.net:8080/gomod/cloud.google.com/go/spanner/com_google_cloud_go_spanner-v1.54.0.zip", + "http://ats.apps.svc/gomod/cloud.google.com/go/spanner/com_google_cloud_go_spanner-v1.54.0.zip", + "https://cache.hawkingrei.com/gomod/cloud.google.com/go/spanner/com_google_cloud_go_spanner-v1.54.0.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/cloud.google.com/go/spanner/com_google_cloud_go_spanner-v1.54.0.zip", ], ) go_repository( name = "com_google_cloud_go_speech", build_file_proto_mode = "disable_global", importpath = "cloud.google.com/go/speech", - sha256 = "814ff4b2392758a14b7c4ec91e028564c984920ccecfaac5b817f086dcf295b6", - strip_prefix = "cloud.google.com/go/speech@v1.20.1", + sha256 = "08942667a6899bcf64f2990a2c2a50213e91405305cbf880505b146cb980cb71", + strip_prefix = "cloud.google.com/go/speech@v1.21.0", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/cloud.google.com/go/speech/com_google_cloud_go_speech-v1.20.1.zip", - "http://ats.apps.svc/gomod/cloud.google.com/go/speech/com_google_cloud_go_speech-v1.20.1.zip", - "https://cache.hawkingrei.com/gomod/cloud.google.com/go/speech/com_google_cloud_go_speech-v1.20.1.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/cloud.google.com/go/speech/com_google_cloud_go_speech-v1.20.1.zip", + "http://bazel-cache.pingcap.net:8080/gomod/cloud.google.com/go/speech/com_google_cloud_go_speech-v1.21.0.zip", + "http://ats.apps.svc/gomod/cloud.google.com/go/speech/com_google_cloud_go_speech-v1.21.0.zip", + "https://cache.hawkingrei.com/gomod/cloud.google.com/go/speech/com_google_cloud_go_speech-v1.21.0.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/cloud.google.com/go/speech/com_google_cloud_go_speech-v1.21.0.zip", ], ) go_repository( name = "com_google_cloud_go_storage", build_file_proto_mode = "disable_global", importpath = "cloud.google.com/go/storage", - sha256 = "d3702216afe89ee6a768eb302695d8ec64395c30a13fd0dc855acc9e30d4aad8", - strip_prefix = "cloud.google.com/go/storage@v1.30.1", + sha256 = "272530d5e205a825b33546e9ac349a66346267a0bc06f006d617d353cdec5525", + strip_prefix = "cloud.google.com/go/storage@v1.36.0", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/cloud.google.com/go/storage/com_google_cloud_go_storage-v1.30.1.zip", - "http://ats.apps.svc/gomod/cloud.google.com/go/storage/com_google_cloud_go_storage-v1.30.1.zip", - "https://cache.hawkingrei.com/gomod/cloud.google.com/go/storage/com_google_cloud_go_storage-v1.30.1.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/cloud.google.com/go/storage/com_google_cloud_go_storage-v1.30.1.zip", + "http://bazel-cache.pingcap.net:8080/gomod/cloud.google.com/go/storage/com_google_cloud_go_storage-v1.36.0.zip", + "http://ats.apps.svc/gomod/cloud.google.com/go/storage/com_google_cloud_go_storage-v1.36.0.zip", + "https://cache.hawkingrei.com/gomod/cloud.google.com/go/storage/com_google_cloud_go_storage-v1.36.0.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/cloud.google.com/go/storage/com_google_cloud_go_storage-v1.36.0.zip", ], ) go_repository( @@ -9160,13 +9060,13 @@ def go_deps(): name = "com_google_cloud_go_translate", build_file_proto_mode = "disable_global", importpath = "cloud.google.com/go/translate", - sha256 = "c7130da1e8941ea8db679b62e0e94d8b01441a13fe780d8c2c18bc2132385197", - strip_prefix = "cloud.google.com/go/translate@v1.9.3", + sha256 = "93fdaf72f807a8881262559b4c9a5ea488989d479ae381cfb071d945e6d7b83c", + strip_prefix = "cloud.google.com/go/translate@v1.10.0", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/cloud.google.com/go/translate/com_google_cloud_go_translate-v1.9.3.zip", - "http://ats.apps.svc/gomod/cloud.google.com/go/translate/com_google_cloud_go_translate-v1.9.3.zip", - "https://cache.hawkingrei.com/gomod/cloud.google.com/go/translate/com_google_cloud_go_translate-v1.9.3.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/cloud.google.com/go/translate/com_google_cloud_go_translate-v1.9.3.zip", + "http://bazel-cache.pingcap.net:8080/gomod/cloud.google.com/go/translate/com_google_cloud_go_translate-v1.10.0.zip", + "http://ats.apps.svc/gomod/cloud.google.com/go/translate/com_google_cloud_go_translate-v1.10.0.zip", + "https://cache.hawkingrei.com/gomod/cloud.google.com/go/translate/com_google_cloud_go_translate-v1.10.0.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/cloud.google.com/go/translate/com_google_cloud_go_translate-v1.10.0.zip", ], ) go_repository( @@ -9303,26 +9203,26 @@ def go_deps(): name = "com_sourcegraph_sourcegraph_appdash", build_file_proto_mode = "disable_global", importpath = "sourcegraph.com/sourcegraph/appdash", - sha256 = "bd2492d9db05362c2fecd0b3d0f6002c89a6d90d678fb93b4158298ab883736f", - strip_prefix = "sourcegraph.com/sourcegraph/appdash@v0.0.0-20190731080439-ebfcffb1b5c0", + sha256 = "c46b442fa40d2af48e08064f4c16ae3712953a9988cd0f7588fcf5e4fc7a2fed", + strip_prefix = "github.com/sourcegraph/appdash@v0.0.0-20190731080439-ebfcffb1b5c0", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/sourcegraph.com/sourcegraph/appdash/com_sourcegraph_sourcegraph_appdash-v0.0.0-20190731080439-ebfcffb1b5c0.zip", - "http://ats.apps.svc/gomod/sourcegraph.com/sourcegraph/appdash/com_sourcegraph_sourcegraph_appdash-v0.0.0-20190731080439-ebfcffb1b5c0.zip", - "https://cache.hawkingrei.com/gomod/sourcegraph.com/sourcegraph/appdash/com_sourcegraph_sourcegraph_appdash-v0.0.0-20190731080439-ebfcffb1b5c0.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/sourcegraph.com/sourcegraph/appdash/com_sourcegraph_sourcegraph_appdash-v0.0.0-20190731080439-ebfcffb1b5c0.zip", + "http://bazel-cache.pingcap.net:8080/gomod/github.com/sourcegraph/appdash/com_github_sourcegraph_appdash-v0.0.0-20190731080439-ebfcffb1b5c0.zip", + "http://ats.apps.svc/gomod/github.com/sourcegraph/appdash/com_github_sourcegraph_appdash-v0.0.0-20190731080439-ebfcffb1b5c0.zip", + "https://cache.hawkingrei.com/gomod/github.com/sourcegraph/appdash/com_github_sourcegraph_appdash-v0.0.0-20190731080439-ebfcffb1b5c0.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/github.com/sourcegraph/appdash/com_github_sourcegraph_appdash-v0.0.0-20190731080439-ebfcffb1b5c0.zip", ], ) go_repository( name = "com_sourcegraph_sourcegraph_appdash_data", build_file_proto_mode = "disable_global", importpath = "sourcegraph.com/sourcegraph/appdash-data", - sha256 = "382adefecd62bb79172e2552bcfb7d45f47122f9bd22259b0566b26fb2627b87", - strip_prefix = "sourcegraph.com/sourcegraph/appdash-data@v0.0.0-20151005221446-73f23eafcf67", + sha256 = "59b71fa8cdb0fe2b1c02739ccf2daeaf28f2e22c4b178cdc8e1b902ad1022bc0", + strip_prefix = "github.com/sourcegraph/appdash-data@v0.0.0-20151005221446-73f23eafcf67", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/sourcegraph.com/sourcegraph/appdash-data/com_sourcegraph_sourcegraph_appdash_data-v0.0.0-20151005221446-73f23eafcf67.zip", - "http://ats.apps.svc/gomod/sourcegraph.com/sourcegraph/appdash-data/com_sourcegraph_sourcegraph_appdash_data-v0.0.0-20151005221446-73f23eafcf67.zip", - "https://cache.hawkingrei.com/gomod/sourcegraph.com/sourcegraph/appdash-data/com_sourcegraph_sourcegraph_appdash_data-v0.0.0-20151005221446-73f23eafcf67.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/sourcegraph.com/sourcegraph/appdash-data/com_sourcegraph_sourcegraph_appdash_data-v0.0.0-20151005221446-73f23eafcf67.zip", + "http://bazel-cache.pingcap.net:8080/gomod/github.com/sourcegraph/appdash-data/com_github_sourcegraph_appdash_data-v0.0.0-20151005221446-73f23eafcf67.zip", + "http://ats.apps.svc/gomod/github.com/sourcegraph/appdash-data/com_github_sourcegraph_appdash_data-v0.0.0-20151005221446-73f23eafcf67.zip", + "https://cache.hawkingrei.com/gomod/github.com/sourcegraph/appdash-data/com_github_sourcegraph_appdash_data-v0.0.0-20151005221446-73f23eafcf67.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/github.com/sourcegraph/appdash-data/com_github_sourcegraph_appdash_data-v0.0.0-20151005221446-73f23eafcf67.zip", ], ) go_repository( @@ -9351,19 +9251,6 @@ def go_deps(): "https://storage.googleapis.com/pingcapmirror/gomod/go.tmz.dev/musttag/dev_tmz_go_musttag-v0.7.2.zip", ], ) - go_repository( - name = "in_gopkg_alecthomas_kingpin_v2", - build_file_proto_mode = "disable_global", - importpath = "gopkg.in/alecthomas/kingpin.v2", - sha256 = "638080591aefe7d2642f2575b627d534c692606f02ea54ba89f42db112ba8839", - strip_prefix = "gopkg.in/alecthomas/kingpin.v2@v2.2.6", - urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/gopkg.in/alecthomas/kingpin.v2/in_gopkg_alecthomas_kingpin_v2-v2.2.6.zip", - "http://ats.apps.svc/gomod/gopkg.in/alecthomas/kingpin.v2/in_gopkg_alecthomas_kingpin_v2-v2.2.6.zip", - "https://cache.hawkingrei.com/gomod/gopkg.in/alecthomas/kingpin.v2/in_gopkg_alecthomas_kingpin_v2-v2.2.6.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/gopkg.in/alecthomas/kingpin.v2/in_gopkg_alecthomas_kingpin_v2-v2.2.6.zip", - ], - ) go_repository( name = "in_gopkg_check_v1", build_file_proto_mode = "disable_global", @@ -9390,19 +9277,6 @@ def go_deps(): "https://storage.googleapis.com/pingcapmirror/gomod/gopkg.in/errgo.v2/in_gopkg_errgo_v2-v2.1.0.zip", ], ) - go_repository( - name = "in_gopkg_fsnotify_fsnotify_v1", - build_file_proto_mode = "disable_global", - importpath = "gopkg.in/fsnotify/fsnotify.v1", - sha256 = "d24b0fa77291be6c99ad3f75dfde626112e018ce8d28cc2e0d68b6c8f2c29521", - strip_prefix = "gopkg.in/fsnotify/fsnotify.v1@v1.3.1", - urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/gopkg.in/fsnotify/fsnotify.v1/in_gopkg_fsnotify_fsnotify_v1-v1.3.1.zip", - "http://ats.apps.svc/gomod/gopkg.in/fsnotify/fsnotify.v1/in_gopkg_fsnotify_fsnotify_v1-v1.3.1.zip", - "https://cache.hawkingrei.com/gomod/gopkg.in/fsnotify/fsnotify.v1/in_gopkg_fsnotify_fsnotify_v1-v1.3.1.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/gopkg.in/fsnotify/fsnotify.v1/in_gopkg_fsnotify_fsnotify_v1-v1.3.1.zip", - ], - ) go_repository( name = "in_gopkg_fsnotify_v1", build_file_proto_mode = "disable_global", @@ -9559,19 +9433,6 @@ def go_deps(): "https://storage.googleapis.com/pingcapmirror/gomod/gopkg.in/natefinch/lumberjack.v2/in_gopkg_natefinch_lumberjack_v2-v2.2.1.zip", ], ) - go_repository( - name = "in_gopkg_resty_v1", - build_file_proto_mode = "disable_global", - importpath = "gopkg.in/resty.v1", - sha256 = "43487bb0bb40626d16502b1fe9e719cf751e7a5b4e4233276971873e7863d3cf", - strip_prefix = "gopkg.in/resty.v1@v1.12.0", - urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/gopkg.in/resty.v1/in_gopkg_resty_v1-v1.12.0.zip", - "http://ats.apps.svc/gomod/gopkg.in/resty.v1/in_gopkg_resty_v1-v1.12.0.zip", - "https://cache.hawkingrei.com/gomod/gopkg.in/resty.v1/in_gopkg_resty_v1-v1.12.0.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/gopkg.in/resty.v1/in_gopkg_resty_v1-v1.12.0.zip", - ], - ) go_repository( name = "in_gopkg_tomb_v1", build_file_proto_mode = "disable_global", @@ -9762,78 +9623,78 @@ def go_deps(): name = "io_k8s_api", build_file_proto_mode = "disable_global", importpath = "k8s.io/api", - sha256 = "417e394e3510035a617292da245c07d606d9a4c0674361719f6a08dc0bf67b68", - strip_prefix = "k8s.io/api@v0.27.2", + sha256 = "a1c52127e7ea4b782c171300588502580b0b2779186791c330f673c365a12332", + strip_prefix = "k8s.io/api@v0.28.2", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/k8s.io/api/io_k8s_api-v0.27.2.zip", - "http://ats.apps.svc/gomod/k8s.io/api/io_k8s_api-v0.27.2.zip", - "https://cache.hawkingrei.com/gomod/k8s.io/api/io_k8s_api-v0.27.2.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/k8s.io/api/io_k8s_api-v0.27.2.zip", + "http://bazel-cache.pingcap.net:8080/gomod/k8s.io/api/io_k8s_api-v0.28.2.zip", + "http://ats.apps.svc/gomod/k8s.io/api/io_k8s_api-v0.28.2.zip", + "https://cache.hawkingrei.com/gomod/k8s.io/api/io_k8s_api-v0.28.2.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/k8s.io/api/io_k8s_api-v0.28.2.zip", ], ) go_repository( name = "io_k8s_apimachinery", build_file_proto_mode = "disable_global", importpath = "k8s.io/apimachinery", - sha256 = "1f2f04041166fcddead7f31f03149f33ee6fdc08db1093ddbc027191204c2f86", - strip_prefix = "k8s.io/apimachinery@v0.27.2", + sha256 = "e006533970f892c51b7a378fb9e884a00ee19c3b8600e7f6473ee02281515df9", + strip_prefix = "k8s.io/apimachinery@v0.28.2", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/k8s.io/apimachinery/io_k8s_apimachinery-v0.27.2.zip", - "http://ats.apps.svc/gomod/k8s.io/apimachinery/io_k8s_apimachinery-v0.27.2.zip", - "https://cache.hawkingrei.com/gomod/k8s.io/apimachinery/io_k8s_apimachinery-v0.27.2.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/k8s.io/apimachinery/io_k8s_apimachinery-v0.27.2.zip", + "http://bazel-cache.pingcap.net:8080/gomod/k8s.io/apimachinery/io_k8s_apimachinery-v0.28.2.zip", + "http://ats.apps.svc/gomod/k8s.io/apimachinery/io_k8s_apimachinery-v0.28.2.zip", + "https://cache.hawkingrei.com/gomod/k8s.io/apimachinery/io_k8s_apimachinery-v0.28.2.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/k8s.io/apimachinery/io_k8s_apimachinery-v0.28.2.zip", ], ) go_repository( name = "io_k8s_client_go", build_file_proto_mode = "disable_global", importpath = "k8s.io/client-go", - sha256 = "27e135d4d9663f42f5e6b75830a9e795db9752d6da9cc5f595a1b75233efd817", - strip_prefix = "k8s.io/client-go@v11.0.1-0.20190409021438-1a26190bd76a+incompatible", + sha256 = "435692d0b6b435260c49fde6caf1852cdd8d5d69714db147d7d07a3684cdd65e", + strip_prefix = "k8s.io/client-go@v0.28.2", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/k8s.io/client-go/io_k8s_client_go-v11.0.1-0.20190409021438-1a26190bd76a+incompatible.zip", - "http://ats.apps.svc/gomod/k8s.io/client-go/io_k8s_client_go-v11.0.1-0.20190409021438-1a26190bd76a+incompatible.zip", - "https://cache.hawkingrei.com/gomod/k8s.io/client-go/io_k8s_client_go-v11.0.1-0.20190409021438-1a26190bd76a+incompatible.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/k8s.io/client-go/io_k8s_client_go-v11.0.1-0.20190409021438-1a26190bd76a+incompatible.zip", + "http://bazel-cache.pingcap.net:8080/gomod/k8s.io/client-go/io_k8s_client_go-v0.28.2.zip", + "http://ats.apps.svc/gomod/k8s.io/client-go/io_k8s_client_go-v0.28.2.zip", + "https://cache.hawkingrei.com/gomod/k8s.io/client-go/io_k8s_client_go-v0.28.2.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/k8s.io/client-go/io_k8s_client_go-v0.28.2.zip", ], ) go_repository( name = "io_k8s_klog", build_file_proto_mode = "disable_global", importpath = "k8s.io/klog", - sha256 = "520558eccd4b172aa20cd0b3ee1f60d15a8d5894ace059304c19f83afd4df36a", - strip_prefix = "k8s.io/klog@v0.3.0", + sha256 = "a564b06078ddf014c5b793a7d36643d6fda31fc131e36b95cdea94ff838b99be", + strip_prefix = "k8s.io/klog@v1.0.0", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/k8s.io/klog/io_k8s_klog-v0.3.0.zip", - "http://ats.apps.svc/gomod/k8s.io/klog/io_k8s_klog-v0.3.0.zip", - "https://cache.hawkingrei.com/gomod/k8s.io/klog/io_k8s_klog-v0.3.0.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/k8s.io/klog/io_k8s_klog-v0.3.0.zip", + "http://bazel-cache.pingcap.net:8080/gomod/k8s.io/klog/io_k8s_klog-v1.0.0.zip", + "http://ats.apps.svc/gomod/k8s.io/klog/io_k8s_klog-v1.0.0.zip", + "https://cache.hawkingrei.com/gomod/k8s.io/klog/io_k8s_klog-v1.0.0.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/k8s.io/klog/io_k8s_klog-v1.0.0.zip", ], ) go_repository( name = "io_k8s_klog_v2", build_file_proto_mode = "disable_global", importpath = "k8s.io/klog/v2", - sha256 = "73f9da873c79b331e5b9d70a56ca89bda33f42b04564bf8f848807f60e3232e5", - strip_prefix = "k8s.io/klog/v2@v2.90.1", + sha256 = "753a27de9f28b54d76937797e1a6c9a197c92ff97dd17330d2800b8de2a06241", + strip_prefix = "k8s.io/klog/v2@v2.100.1", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/k8s.io/klog/v2/io_k8s_klog_v2-v2.90.1.zip", - "http://ats.apps.svc/gomod/k8s.io/klog/v2/io_k8s_klog_v2-v2.90.1.zip", - "https://cache.hawkingrei.com/gomod/k8s.io/klog/v2/io_k8s_klog_v2-v2.90.1.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/k8s.io/klog/v2/io_k8s_klog_v2-v2.90.1.zip", + "http://bazel-cache.pingcap.net:8080/gomod/k8s.io/klog/v2/io_k8s_klog_v2-v2.100.1.zip", + "http://ats.apps.svc/gomod/k8s.io/klog/v2/io_k8s_klog_v2-v2.100.1.zip", + "https://cache.hawkingrei.com/gomod/k8s.io/klog/v2/io_k8s_klog_v2-v2.100.1.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/k8s.io/klog/v2/io_k8s_klog_v2-v2.100.1.zip", ], ) go_repository( name = "io_k8s_kube_openapi", build_file_proto_mode = "disable_global", importpath = "k8s.io/kube-openapi", - sha256 = "2738e6254f17109e5cf8c0ac5b902bcfe014ad065a9520b8dadad5a7a7d166d5", - strip_prefix = "k8s.io/kube-openapi@v0.0.0-20230501164219-8b0f38b5fd1f", + sha256 = "1439fcbc0a04bbf7edf72712288e1cc4d2497fd28279c76a01a366910b65d6c7", + strip_prefix = "k8s.io/kube-openapi@v0.0.0-20230717233707-2695361300d9", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/k8s.io/kube-openapi/io_k8s_kube_openapi-v0.0.0-20230501164219-8b0f38b5fd1f.zip", - "http://ats.apps.svc/gomod/k8s.io/kube-openapi/io_k8s_kube_openapi-v0.0.0-20230501164219-8b0f38b5fd1f.zip", - "https://cache.hawkingrei.com/gomod/k8s.io/kube-openapi/io_k8s_kube_openapi-v0.0.0-20230501164219-8b0f38b5fd1f.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/k8s.io/kube-openapi/io_k8s_kube_openapi-v0.0.0-20230501164219-8b0f38b5fd1f.zip", + "http://bazel-cache.pingcap.net:8080/gomod/k8s.io/kube-openapi/io_k8s_kube_openapi-v0.0.0-20230717233707-2695361300d9.zip", + "http://ats.apps.svc/gomod/k8s.io/kube-openapi/io_k8s_kube_openapi-v0.0.0-20230717233707-2695361300d9.zip", + "https://cache.hawkingrei.com/gomod/k8s.io/kube-openapi/io_k8s_kube_openapi-v0.0.0-20230717233707-2695361300d9.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/k8s.io/kube-openapi/io_k8s_kube_openapi-v0.0.0-20230717233707-2695361300d9.zip", ], ) go_repository( @@ -9853,13 +9714,13 @@ def go_deps(): name = "io_k8s_sigs_structured_merge_diff_v4", build_file_proto_mode = "disable_global", importpath = "sigs.k8s.io/structured-merge-diff/v4", - sha256 = "81c147c247afbc71fa135b2f4209c0641e141267be5c6a956a0f8bf851e74e31", - strip_prefix = "sigs.k8s.io/structured-merge-diff/v4@v4.2.3", + sha256 = "0a5107d9269d3fc45d3abb9a1fc0c3c4788b82d848679416cb4c2bc49cad89de", + strip_prefix = "sigs.k8s.io/structured-merge-diff/v4@v4.3.0", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/sigs.k8s.io/structured-merge-diff/v4/io_k8s_sigs_structured_merge_diff_v4-v4.2.3.zip", - "http://ats.apps.svc/gomod/sigs.k8s.io/structured-merge-diff/v4/io_k8s_sigs_structured_merge_diff_v4-v4.2.3.zip", - "https://cache.hawkingrei.com/gomod/sigs.k8s.io/structured-merge-diff/v4/io_k8s_sigs_structured_merge_diff_v4-v4.2.3.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/sigs.k8s.io/structured-merge-diff/v4/io_k8s_sigs_structured_merge_diff_v4-v4.2.3.zip", + "http://bazel-cache.pingcap.net:8080/gomod/sigs.k8s.io/structured-merge-diff/v4/io_k8s_sigs_structured_merge_diff_v4-v4.3.0.zip", + "http://ats.apps.svc/gomod/sigs.k8s.io/structured-merge-diff/v4/io_k8s_sigs_structured_merge_diff_v4-v4.3.0.zip", + "https://cache.hawkingrei.com/gomod/sigs.k8s.io/structured-merge-diff/v4/io_k8s_sigs_structured_merge_diff_v4-v4.3.0.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/sigs.k8s.io/structured-merge-diff/v4/io_k8s_sigs_structured_merge_diff_v4-v4.3.0.zip", ], ) go_repository( @@ -9879,13 +9740,13 @@ def go_deps(): name = "io_k8s_utils", build_file_proto_mode = "disable_global", importpath = "k8s.io/utils", - sha256 = "29b4ceb51420d6f5c6482e9cc0884b369dc44647b4b4cc09886acd5091817026", - strip_prefix = "k8s.io/utils@v0.0.0-20230209194617-a36077c30491", + sha256 = "755df44d714f0c28df51b94f096c1ff5af7625a00c92ca03b5914217a759b391", + strip_prefix = "k8s.io/utils@v0.0.0-20230711102312-30195339c3c7", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/k8s.io/utils/io_k8s_utils-v0.0.0-20230209194617-a36077c30491.zip", - "http://ats.apps.svc/gomod/k8s.io/utils/io_k8s_utils-v0.0.0-20230209194617-a36077c30491.zip", - "https://cache.hawkingrei.com/gomod/k8s.io/utils/io_k8s_utils-v0.0.0-20230209194617-a36077c30491.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/k8s.io/utils/io_k8s_utils-v0.0.0-20230209194617-a36077c30491.zip", + "http://bazel-cache.pingcap.net:8080/gomod/k8s.io/utils/io_k8s_utils-v0.0.0-20230711102312-30195339c3c7.zip", + "http://ats.apps.svc/gomod/k8s.io/utils/io_k8s_utils-v0.0.0-20230711102312-30195339c3c7.zip", + "https://cache.hawkingrei.com/gomod/k8s.io/utils/io_k8s_utils-v0.0.0-20230711102312-30195339c3c7.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/k8s.io/utils/io_k8s_utils-v0.0.0-20230711102312-30195339c3c7.zip", ], ) go_repository( @@ -9902,16 +9763,29 @@ def go_deps(): ], ) go_repository( - name = "io_opencensus_go_contrib_exporter_ocagent", + name = "io_opentelemetry_go_collector_pdata", build_file_proto_mode = "disable_global", - importpath = "contrib.go.opencensus.io/exporter/ocagent", - sha256 = "a06ce658c281fe830953bf2548047de8c43776c87d0eac63db37206538928e51", - strip_prefix = "contrib.go.opencensus.io/exporter/ocagent@v0.4.12", + importpath = "go.opentelemetry.io/collector/pdata", + sha256 = "737f1976ed7d5028a19f72834d429f2fa31f803e16591bb79aa0779a2d52ea2c", + strip_prefix = "go.opentelemetry.io/collector/pdata@v1.0.0-rcv0016", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/contrib.go.opencensus.io/exporter/ocagent/io_opencensus_go_contrib_exporter_ocagent-v0.4.12.zip", - "http://ats.apps.svc/gomod/contrib.go.opencensus.io/exporter/ocagent/io_opencensus_go_contrib_exporter_ocagent-v0.4.12.zip", - "https://cache.hawkingrei.com/gomod/contrib.go.opencensus.io/exporter/ocagent/io_opencensus_go_contrib_exporter_ocagent-v0.4.12.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/contrib.go.opencensus.io/exporter/ocagent/io_opencensus_go_contrib_exporter_ocagent-v0.4.12.zip", + "http://bazel-cache.pingcap.net:8080/gomod/go.opentelemetry.io/collector/pdata/io_opentelemetry_go_collector_pdata-v1.0.0-rcv0016.zip", + "http://ats.apps.svc/gomod/go.opentelemetry.io/collector/pdata/io_opentelemetry_go_collector_pdata-v1.0.0-rcv0016.zip", + "https://cache.hawkingrei.com/gomod/go.opentelemetry.io/collector/pdata/io_opentelemetry_go_collector_pdata-v1.0.0-rcv0016.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/go.opentelemetry.io/collector/pdata/io_opentelemetry_go_collector_pdata-v1.0.0-rcv0016.zip", + ], + ) + go_repository( + name = "io_opentelemetry_go_collector_semconv", + build_file_proto_mode = "disable_global", + importpath = "go.opentelemetry.io/collector/semconv", + sha256 = "a07e0233a84e7c50b911a49c7c740a312643184e2a4b6f1c185cc9e5c306399b", + strip_prefix = "go.opentelemetry.io/collector/semconv@v0.87.0", + urls = [ + "http://bazel-cache.pingcap.net:8080/gomod/go.opentelemetry.io/collector/semconv/io_opentelemetry_go_collector_semconv-v0.87.0.zip", + "http://ats.apps.svc/gomod/go.opentelemetry.io/collector/semconv/io_opentelemetry_go_collector_semconv-v0.87.0.zip", + "https://cache.hawkingrei.com/gomod/go.opentelemetry.io/collector/semconv/io_opentelemetry_go_collector_semconv-v0.87.0.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/go.opentelemetry.io/collector/semconv/io_opentelemetry_go_collector_semconv-v0.87.0.zip", ], ) go_repository( @@ -9927,6 +9801,19 @@ def go_deps(): "https://storage.googleapis.com/pingcapmirror/gomod/go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc/io_opentelemetry_go_contrib_instrumentation_google_golang_org_grpc_otelgrpc-v0.46.1.zip", ], ) + go_repository( + name = "io_opentelemetry_go_contrib_instrumentation_net_http_otelhttp", + build_file_proto_mode = "disable_global", + importpath = "go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp", + sha256 = "0531177f28070e042d586c2bb751850350ae7c34702af4550b19ce86fc92a33e", + strip_prefix = "go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp@v0.46.1", + urls = [ + "http://bazel-cache.pingcap.net:8080/gomod/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/io_opentelemetry_go_contrib_instrumentation_net_http_otelhttp-v0.46.1.zip", + "http://ats.apps.svc/gomod/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/io_opentelemetry_go_contrib_instrumentation_net_http_otelhttp-v0.46.1.zip", + "https://cache.hawkingrei.com/gomod/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/io_opentelemetry_go_contrib_instrumentation_net_http_otelhttp-v0.46.1.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/io_opentelemetry_go_contrib_instrumentation_net_http_otelhttp-v0.46.1.zip", + ], + ) go_repository( name = "io_opentelemetry_go_otel", build_file_proto_mode = "disable_global", @@ -9944,26 +9831,39 @@ def go_deps(): name = "io_opentelemetry_go_otel_exporters_otlp_otlptrace", build_file_proto_mode = "disable_global", importpath = "go.opentelemetry.io/otel/exporters/otlp/otlptrace", - sha256 = "c0b373451618d70053fcfad5acbdc243cbad8b6b9252e0a30303171b0b065499", - strip_prefix = "go.opentelemetry.io/otel/exporters/otlp/otlptrace@v1.0.1", + sha256 = "6b0338c4e65c7d642ca44c4e0fc177c92cdc85c20de255f2feffa845c0312039", + strip_prefix = "go.opentelemetry.io/otel/exporters/otlp/otlptrace@v1.19.0", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/go.opentelemetry.io/otel/exporters/otlp/otlptrace/io_opentelemetry_go_otel_exporters_otlp_otlptrace-v1.0.1.zip", - "http://ats.apps.svc/gomod/go.opentelemetry.io/otel/exporters/otlp/otlptrace/io_opentelemetry_go_otel_exporters_otlp_otlptrace-v1.0.1.zip", - "https://cache.hawkingrei.com/gomod/go.opentelemetry.io/otel/exporters/otlp/otlptrace/io_opentelemetry_go_otel_exporters_otlp_otlptrace-v1.0.1.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/go.opentelemetry.io/otel/exporters/otlp/otlptrace/io_opentelemetry_go_otel_exporters_otlp_otlptrace-v1.0.1.zip", + "http://bazel-cache.pingcap.net:8080/gomod/go.opentelemetry.io/otel/exporters/otlp/otlptrace/io_opentelemetry_go_otel_exporters_otlp_otlptrace-v1.19.0.zip", + "http://ats.apps.svc/gomod/go.opentelemetry.io/otel/exporters/otlp/otlptrace/io_opentelemetry_go_otel_exporters_otlp_otlptrace-v1.19.0.zip", + "https://cache.hawkingrei.com/gomod/go.opentelemetry.io/otel/exporters/otlp/otlptrace/io_opentelemetry_go_otel_exporters_otlp_otlptrace-v1.19.0.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/go.opentelemetry.io/otel/exporters/otlp/otlptrace/io_opentelemetry_go_otel_exporters_otlp_otlptrace-v1.19.0.zip", ], ) go_repository( name = "io_opentelemetry_go_otel_exporters_otlp_otlptrace_otlptracegrpc", build_file_proto_mode = "disable_global", importpath = "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc", - sha256 = "7e99951c02fdc104a08bff9244de6f9129171ccde70761c61c9f4255ce81dc5d", - strip_prefix = "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc@v1.0.1", + sha256 = "a410831cce2fbc295d2d94fc0ca302f1b56791d152896718be36d6bb17699216", + strip_prefix = "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc@v1.19.0", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc/io_opentelemetry_go_otel_exporters_otlp_otlptrace_otlptracegrpc-v1.0.1.zip", - "http://ats.apps.svc/gomod/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc/io_opentelemetry_go_otel_exporters_otlp_otlptrace_otlptracegrpc-v1.0.1.zip", - "https://cache.hawkingrei.com/gomod/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc/io_opentelemetry_go_otel_exporters_otlp_otlptrace_otlptracegrpc-v1.0.1.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc/io_opentelemetry_go_otel_exporters_otlp_otlptrace_otlptracegrpc-v1.0.1.zip", + "http://bazel-cache.pingcap.net:8080/gomod/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc/io_opentelemetry_go_otel_exporters_otlp_otlptrace_otlptracegrpc-v1.19.0.zip", + "http://ats.apps.svc/gomod/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc/io_opentelemetry_go_otel_exporters_otlp_otlptrace_otlptracegrpc-v1.19.0.zip", + "https://cache.hawkingrei.com/gomod/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc/io_opentelemetry_go_otel_exporters_otlp_otlptrace_otlptracegrpc-v1.19.0.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc/io_opentelemetry_go_otel_exporters_otlp_otlptrace_otlptracegrpc-v1.19.0.zip", + ], + ) + go_repository( + name = "io_opentelemetry_go_otel_exporters_otlp_otlptrace_otlptracehttp", + build_file_proto_mode = "disable_global", + importpath = "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp", + sha256 = "fedab3fc44536278ce213e81a044d6b048dda8969f9defc936fcaf3272765e92", + strip_prefix = "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp@v1.19.0", + urls = [ + "http://bazel-cache.pingcap.net:8080/gomod/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/io_opentelemetry_go_otel_exporters_otlp_otlptrace_otlptracehttp-v1.19.0.zip", + "http://ats.apps.svc/gomod/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/io_opentelemetry_go_otel_exporters_otlp_otlptrace_otlptracehttp-v1.19.0.zip", + "https://cache.hawkingrei.com/gomod/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/io_opentelemetry_go_otel_exporters_otlp_otlptrace_otlptracehttp-v1.19.0.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/io_opentelemetry_go_otel_exporters_otlp_otlptrace_otlptracehttp-v1.19.0.zip", ], ) go_repository( @@ -10009,13 +9909,13 @@ def go_deps(): name = "io_opentelemetry_go_proto_otlp", build_file_proto_mode = "disable_global", importpath = "go.opentelemetry.io/proto/otlp", - sha256 = "1a91376c923da07bee23439e8430c32736f6330532df85d3bd1ada90305097d7", - strip_prefix = "go.opentelemetry.io/proto/otlp@v0.9.0", + sha256 = "264e0db82a8c572ebc52fbe3da3f4a2a60d7e5fcf81238d1389390f66e2da246", + strip_prefix = "go.opentelemetry.io/proto/otlp@v1.0.0", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/go.opentelemetry.io/proto/otlp/io_opentelemetry_go_proto_otlp-v0.9.0.zip", - "http://ats.apps.svc/gomod/go.opentelemetry.io/proto/otlp/io_opentelemetry_go_proto_otlp-v0.9.0.zip", - "https://cache.hawkingrei.com/gomod/go.opentelemetry.io/proto/otlp/io_opentelemetry_go_proto_otlp-v0.9.0.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/go.opentelemetry.io/proto/otlp/io_opentelemetry_go_proto_otlp-v0.9.0.zip", + "http://bazel-cache.pingcap.net:8080/gomod/go.opentelemetry.io/proto/otlp/io_opentelemetry_go_proto_otlp-v1.0.0.zip", + "http://ats.apps.svc/gomod/go.opentelemetry.io/proto/otlp/io_opentelemetry_go_proto_otlp-v1.0.0.zip", + "https://cache.hawkingrei.com/gomod/go.opentelemetry.io/proto/otlp/io_opentelemetry_go_proto_otlp-v1.0.0.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/go.opentelemetry.io/proto/otlp/io_opentelemetry_go_proto_otlp-v1.0.0.zip", ], ) go_repository( @@ -10100,117 +10000,130 @@ def go_deps(): name = "org_golang_google_api", build_file_proto_mode = "disable_global", importpath = "google.golang.org/api", - sha256 = "72ad7e7194310ac3eaae621dda412787b35382478edcdde4f12df9cad2f393c9", - strip_prefix = "google.golang.org/api@v0.149.0", + sha256 = "2ae8c24e4d8b3815f05a2c7746204a45fe21fd88c1c649ff5453e517c14eb56d", + strip_prefix = "google.golang.org/api@v0.156.0", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/google.golang.org/api/org_golang_google_api-v0.149.0.zip", - "http://ats.apps.svc/gomod/google.golang.org/api/org_golang_google_api-v0.149.0.zip", - "https://cache.hawkingrei.com/gomod/google.golang.org/api/org_golang_google_api-v0.149.0.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/google.golang.org/api/org_golang_google_api-v0.149.0.zip", + "http://bazel-cache.pingcap.net:8080/gomod/google.golang.org/api/org_golang_google_api-v0.156.0.zip", + "http://ats.apps.svc/gomod/google.golang.org/api/org_golang_google_api-v0.156.0.zip", + "https://cache.hawkingrei.com/gomod/google.golang.org/api/org_golang_google_api-v0.156.0.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/google.golang.org/api/org_golang_google_api-v0.156.0.zip", ], ) go_repository( name = "org_golang_google_appengine", build_file_proto_mode = "disable_global", importpath = "google.golang.org/appengine", - sha256 = "79f80dfac18681788f1414e21a4a7734eff4cdf992070be9163103eb8d9f92cd", - strip_prefix = "google.golang.org/appengine@v1.6.7", + sha256 = "23e40ee378db26bd45b7de851a85ba6c6d340c9dd353f8ba961ebe9e01bf02c6", + strip_prefix = "google.golang.org/appengine@v1.6.8", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/google.golang.org/appengine/org_golang_google_appengine-v1.6.7.zip", - "http://ats.apps.svc/gomod/google.golang.org/appengine/org_golang_google_appengine-v1.6.7.zip", - "https://cache.hawkingrei.com/gomod/google.golang.org/appengine/org_golang_google_appengine-v1.6.7.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/google.golang.org/appengine/org_golang_google_appengine-v1.6.7.zip", + "http://bazel-cache.pingcap.net:8080/gomod/google.golang.org/appengine/org_golang_google_appengine-v1.6.8.zip", + "http://ats.apps.svc/gomod/google.golang.org/appengine/org_golang_google_appengine-v1.6.8.zip", + "https://cache.hawkingrei.com/gomod/google.golang.org/appengine/org_golang_google_appengine-v1.6.8.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/google.golang.org/appengine/org_golang_google_appengine-v1.6.8.zip", ], ) go_repository( name = "org_golang_google_genproto", build_file_proto_mode = "disable_global", importpath = "google.golang.org/genproto", - sha256 = "2d1407c2ce93329ed8348a11126eeccf88a96353a49540463f55bd26f7a342fb", - strip_prefix = "google.golang.org/genproto@v0.0.0-20231106174013-bbf56f31fb17", + sha256 = "5ed90251b73540d8576554928e989df1e0ab81f91a487960f0c93c77ff2e38c0", + strip_prefix = "google.golang.org/genproto@v0.0.0-20240108191215-35c7eff3a6b1", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/google.golang.org/genproto/org_golang_google_genproto-v0.0.0-20231106174013-bbf56f31fb17.zip", - "http://ats.apps.svc/gomod/google.golang.org/genproto/org_golang_google_genproto-v0.0.0-20231106174013-bbf56f31fb17.zip", - "https://cache.hawkingrei.com/gomod/google.golang.org/genproto/org_golang_google_genproto-v0.0.0-20231106174013-bbf56f31fb17.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/google.golang.org/genproto/org_golang_google_genproto-v0.0.0-20231106174013-bbf56f31fb17.zip", + "http://bazel-cache.pingcap.net:8080/gomod/google.golang.org/genproto/org_golang_google_genproto-v0.0.0-20240108191215-35c7eff3a6b1.zip", + "http://ats.apps.svc/gomod/google.golang.org/genproto/org_golang_google_genproto-v0.0.0-20240108191215-35c7eff3a6b1.zip", + "https://cache.hawkingrei.com/gomod/google.golang.org/genproto/org_golang_google_genproto-v0.0.0-20240108191215-35c7eff3a6b1.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/google.golang.org/genproto/org_golang_google_genproto-v0.0.0-20240108191215-35c7eff3a6b1.zip", ], ) go_repository( name = "org_golang_google_genproto_googleapis_api", build_file_proto_mode = "disable_global", importpath = "google.golang.org/genproto/googleapis/api", - sha256 = "521565d08641a65c1425b74db6bfff04ca2ee5cfde35aa784c1d647f418b6108", - strip_prefix = "google.golang.org/genproto/googleapis/api@v0.0.0-20231030173426-d783a09b4405", + sha256 = "fc875eda023d38270acfba901e7b2ae40853e45b92ae3f988b2caa2413b0529f", + strip_prefix = "google.golang.org/genproto/googleapis/api@v0.0.0-20240108191215-35c7eff3a6b1", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/google.golang.org/genproto/googleapis/api/org_golang_google_genproto_googleapis_api-v0.0.0-20231030173426-d783a09b4405.zip", - "http://ats.apps.svc/gomod/google.golang.org/genproto/googleapis/api/org_golang_google_genproto_googleapis_api-v0.0.0-20231030173426-d783a09b4405.zip", - "https://cache.hawkingrei.com/gomod/google.golang.org/genproto/googleapis/api/org_golang_google_genproto_googleapis_api-v0.0.0-20231030173426-d783a09b4405.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/google.golang.org/genproto/googleapis/api/org_golang_google_genproto_googleapis_api-v0.0.0-20231030173426-d783a09b4405.zip", + "http://bazel-cache.pingcap.net:8080/gomod/google.golang.org/genproto/googleapis/api/org_golang_google_genproto_googleapis_api-v0.0.0-20240108191215-35c7eff3a6b1.zip", + "http://ats.apps.svc/gomod/google.golang.org/genproto/googleapis/api/org_golang_google_genproto_googleapis_api-v0.0.0-20240108191215-35c7eff3a6b1.zip", + "https://cache.hawkingrei.com/gomod/google.golang.org/genproto/googleapis/api/org_golang_google_genproto_googleapis_api-v0.0.0-20240108191215-35c7eff3a6b1.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/google.golang.org/genproto/googleapis/api/org_golang_google_genproto_googleapis_api-v0.0.0-20240108191215-35c7eff3a6b1.zip", ], ) go_repository( name = "org_golang_google_genproto_googleapis_bytestream", build_file_proto_mode = "disable_global", importpath = "google.golang.org/genproto/googleapis/bytestream", - sha256 = "dfc6aba2d6c8a069e582efa17f6e00569ce90c2be98edd7a38283deeb69c493a", - strip_prefix = "google.golang.org/genproto/googleapis/bytestream@v0.0.0-20231030173426-d783a09b4405", + sha256 = "9e05ca3edc431cf33edb417b757cc9397c7daf03ce562cec3d817bf764d0148c", + strip_prefix = "google.golang.org/genproto/googleapis/bytestream@v0.0.0-20240102182953-50ed04b92917", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/google.golang.org/genproto/googleapis/bytestream/org_golang_google_genproto_googleapis_bytestream-v0.0.0-20231030173426-d783a09b4405.zip", - "http://ats.apps.svc/gomod/google.golang.org/genproto/googleapis/bytestream/org_golang_google_genproto_googleapis_bytestream-v0.0.0-20231030173426-d783a09b4405.zip", - "https://cache.hawkingrei.com/gomod/google.golang.org/genproto/googleapis/bytestream/org_golang_google_genproto_googleapis_bytestream-v0.0.0-20231030173426-d783a09b4405.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/google.golang.org/genproto/googleapis/bytestream/org_golang_google_genproto_googleapis_bytestream-v0.0.0-20231030173426-d783a09b4405.zip", + "http://bazel-cache.pingcap.net:8080/gomod/google.golang.org/genproto/googleapis/bytestream/org_golang_google_genproto_googleapis_bytestream-v0.0.0-20240102182953-50ed04b92917.zip", + "http://ats.apps.svc/gomod/google.golang.org/genproto/googleapis/bytestream/org_golang_google_genproto_googleapis_bytestream-v0.0.0-20240102182953-50ed04b92917.zip", + "https://cache.hawkingrei.com/gomod/google.golang.org/genproto/googleapis/bytestream/org_golang_google_genproto_googleapis_bytestream-v0.0.0-20240102182953-50ed04b92917.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/google.golang.org/genproto/googleapis/bytestream/org_golang_google_genproto_googleapis_bytestream-v0.0.0-20240102182953-50ed04b92917.zip", ], ) go_repository( name = "org_golang_google_genproto_googleapis_rpc", build_file_proto_mode = "disable_global", importpath = "google.golang.org/genproto/googleapis/rpc", - sha256 = "b351b49112507e61aeca7718b51570799d615ee5e5564f3e25124a9e01a85835", - strip_prefix = "google.golang.org/genproto/googleapis/rpc@v0.0.0-20231120223509-83a465c0220f", + sha256 = "4e4c60b74b5bba370fbba795eab6313e42b6eabd668aea1ed87a5b25065ec144", + strip_prefix = "google.golang.org/genproto/googleapis/rpc@v0.0.0-20240108191215-35c7eff3a6b1", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/google.golang.org/genproto/googleapis/rpc/org_golang_google_genproto_googleapis_rpc-v0.0.0-20231120223509-83a465c0220f.zip", - "http://ats.apps.svc/gomod/google.golang.org/genproto/googleapis/rpc/org_golang_google_genproto_googleapis_rpc-v0.0.0-20231120223509-83a465c0220f.zip", - "https://cache.hawkingrei.com/gomod/google.golang.org/genproto/googleapis/rpc/org_golang_google_genproto_googleapis_rpc-v0.0.0-20231120223509-83a465c0220f.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/google.golang.org/genproto/googleapis/rpc/org_golang_google_genproto_googleapis_rpc-v0.0.0-20231120223509-83a465c0220f.zip", + "http://bazel-cache.pingcap.net:8080/gomod/google.golang.org/genproto/googleapis/rpc/org_golang_google_genproto_googleapis_rpc-v0.0.0-20240108191215-35c7eff3a6b1.zip", + "http://ats.apps.svc/gomod/google.golang.org/genproto/googleapis/rpc/org_golang_google_genproto_googleapis_rpc-v0.0.0-20240108191215-35c7eff3a6b1.zip", + "https://cache.hawkingrei.com/gomod/google.golang.org/genproto/googleapis/rpc/org_golang_google_genproto_googleapis_rpc-v0.0.0-20240108191215-35c7eff3a6b1.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/google.golang.org/genproto/googleapis/rpc/org_golang_google_genproto_googleapis_rpc-v0.0.0-20240108191215-35c7eff3a6b1.zip", ], ) go_repository( name = "org_golang_google_grpc", build_file_proto_mode = "disable_global", importpath = "google.golang.org/grpc", - sha256 = "8d8be58b73bcbefd731939880edd32aa3a90c4b6937ce07d904075470fce3565", - strip_prefix = "google.golang.org/grpc@v1.59.0", + sha256 = "c9088df910b74b8a815c2eabf7e7b458aa9a355312aee77994d5d8f6ca24928a", + strip_prefix = "google.golang.org/grpc@v1.60.1", + urls = [ + "http://bazel-cache.pingcap.net:8080/gomod/google.golang.org/grpc/org_golang_google_grpc-v1.60.1.zip", + "http://ats.apps.svc/gomod/google.golang.org/grpc/org_golang_google_grpc-v1.60.1.zip", + "https://cache.hawkingrei.com/gomod/google.golang.org/grpc/org_golang_google_grpc-v1.60.1.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/google.golang.org/grpc/org_golang_google_grpc-v1.60.1.zip", + ], + ) + go_repository( + name = "org_golang_google_grpc_examples", + build_file_proto_mode = "disable_global", + importpath = "google.golang.org/grpc/examples", + sha256 = "1d6cbdae96a305d977ffa3b101fd89fa9bceb80cead93254d3f85b43faf40e07", + strip_prefix = "google.golang.org/grpc/examples@v0.0.0-20231221225426-4f03f3ff32c9", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/google.golang.org/grpc/org_golang_google_grpc-v1.59.0.zip", - "http://ats.apps.svc/gomod/google.golang.org/grpc/org_golang_google_grpc-v1.59.0.zip", - "https://cache.hawkingrei.com/gomod/google.golang.org/grpc/org_golang_google_grpc-v1.59.0.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/google.golang.org/grpc/org_golang_google_grpc-v1.59.0.zip", + "http://bazel-cache.pingcap.net:8080/gomod/google.golang.org/grpc/examples/org_golang_google_grpc_examples-v0.0.0-20231221225426-4f03f3ff32c9.zip", + "http://ats.apps.svc/gomod/google.golang.org/grpc/examples/org_golang_google_grpc_examples-v0.0.0-20231221225426-4f03f3ff32c9.zip", + "https://cache.hawkingrei.com/gomod/google.golang.org/grpc/examples/org_golang_google_grpc_examples-v0.0.0-20231221225426-4f03f3ff32c9.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/google.golang.org/grpc/examples/org_golang_google_grpc_examples-v0.0.0-20231221225426-4f03f3ff32c9.zip", ], ) go_repository( name = "org_golang_google_protobuf", build_file_proto_mode = "disable_global", importpath = "google.golang.org/protobuf", - sha256 = "f01e7df25c79e12e4381b3f770b5fd97d8295e568e3a91b267dacb5b3622c203", - strip_prefix = "google.golang.org/protobuf@v1.31.0", + sha256 = "c2c117cf29abee8697dabdc69662accf66171bea0efa2749988867ae8ef2362d", + strip_prefix = "google.golang.org/protobuf@v1.32.0", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/google.golang.org/protobuf/org_golang_google_protobuf-v1.31.0.zip", - "http://ats.apps.svc/gomod/google.golang.org/protobuf/org_golang_google_protobuf-v1.31.0.zip", - "https://cache.hawkingrei.com/gomod/google.golang.org/protobuf/org_golang_google_protobuf-v1.31.0.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/google.golang.org/protobuf/org_golang_google_protobuf-v1.31.0.zip", + "http://bazel-cache.pingcap.net:8080/gomod/google.golang.org/protobuf/org_golang_google_protobuf-v1.32.0.zip", + "http://ats.apps.svc/gomod/google.golang.org/protobuf/org_golang_google_protobuf-v1.32.0.zip", + "https://cache.hawkingrei.com/gomod/google.golang.org/protobuf/org_golang_google_protobuf-v1.32.0.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/google.golang.org/protobuf/org_golang_google_protobuf-v1.32.0.zip", ], ) go_repository( name = "org_golang_x_crypto", build_file_proto_mode = "disable_global", importpath = "golang.org/x/crypto", - sha256 = "6a363fb982d3bb85bcad009cbece9ba82d3ea64c949f31133c9a8265a05b956e", - strip_prefix = "golang.org/x/crypto@v0.15.0", + sha256 = "5413479720bbf5183144652805203a3df74800d2f281f611e82d3a7ec15f4325", + strip_prefix = "golang.org/x/crypto@v0.18.0", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/golang.org/x/crypto/org_golang_x_crypto-v0.15.0.zip", - "http://ats.apps.svc/gomod/golang.org/x/crypto/org_golang_x_crypto-v0.15.0.zip", - "https://cache.hawkingrei.com/gomod/golang.org/x/crypto/org_golang_x_crypto-v0.15.0.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/golang.org/x/crypto/org_golang_x_crypto-v0.15.0.zip", + "http://bazel-cache.pingcap.net:8080/gomod/golang.org/x/crypto/org_golang_x_crypto-v0.18.0.zip", + "http://ats.apps.svc/gomod/golang.org/x/crypto/org_golang_x_crypto-v0.18.0.zip", + "https://cache.hawkingrei.com/gomod/golang.org/x/crypto/org_golang_x_crypto-v0.18.0.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/golang.org/x/crypto/org_golang_x_crypto-v0.18.0.zip", ], ) go_repository( @@ -10295,65 +10208,65 @@ def go_deps(): name = "org_golang_x_net", build_file_proto_mode = "disable_global", importpath = "golang.org/x/net", - sha256 = "4cab2282ffbcfc8cceed657567a5fcf11e735312d1865f953fae62bbf1307a7a", - strip_prefix = "golang.org/x/net@v0.18.0", + sha256 = "00adca2fa3315d397ecb886989998f03fefda7b81a0b5ebb3586acef273e0f29", + strip_prefix = "golang.org/x/net@v0.20.0", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/golang.org/x/net/org_golang_x_net-v0.18.0.zip", - "http://ats.apps.svc/gomod/golang.org/x/net/org_golang_x_net-v0.18.0.zip", - "https://cache.hawkingrei.com/gomod/golang.org/x/net/org_golang_x_net-v0.18.0.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/golang.org/x/net/org_golang_x_net-v0.18.0.zip", + "http://bazel-cache.pingcap.net:8080/gomod/golang.org/x/net/org_golang_x_net-v0.20.0.zip", + "http://ats.apps.svc/gomod/golang.org/x/net/org_golang_x_net-v0.20.0.zip", + "https://cache.hawkingrei.com/gomod/golang.org/x/net/org_golang_x_net-v0.20.0.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/golang.org/x/net/org_golang_x_net-v0.20.0.zip", ], ) go_repository( name = "org_golang_x_oauth2", build_file_proto_mode = "disable_global", importpath = "golang.org/x/oauth2", - sha256 = "21e3fa05a7c13202e9446bccb7e20d6579310eafd1d8c25331e6ef0d1721a5d5", - strip_prefix = "golang.org/x/oauth2@v0.14.0", + sha256 = "a6597a80e0461877b21bf5bda71423bfdc9e8701128e39c71ec3aa7e190c7ac3", + strip_prefix = "golang.org/x/oauth2@v0.16.0", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/golang.org/x/oauth2/org_golang_x_oauth2-v0.14.0.zip", - "http://ats.apps.svc/gomod/golang.org/x/oauth2/org_golang_x_oauth2-v0.14.0.zip", - "https://cache.hawkingrei.com/gomod/golang.org/x/oauth2/org_golang_x_oauth2-v0.14.0.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/golang.org/x/oauth2/org_golang_x_oauth2-v0.14.0.zip", + "http://bazel-cache.pingcap.net:8080/gomod/golang.org/x/oauth2/org_golang_x_oauth2-v0.16.0.zip", + "http://ats.apps.svc/gomod/golang.org/x/oauth2/org_golang_x_oauth2-v0.16.0.zip", + "https://cache.hawkingrei.com/gomod/golang.org/x/oauth2/org_golang_x_oauth2-v0.16.0.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/golang.org/x/oauth2/org_golang_x_oauth2-v0.16.0.zip", ], ) go_repository( name = "org_golang_x_sync", build_file_proto_mode = "disable_global", importpath = "golang.org/x/sync", - sha256 = "9e094c65b153881437ce230b2d2492719d063c8924009631c9025add13056922", - strip_prefix = "golang.org/x/sync@v0.5.0", + sha256 = "7c75175297a3b368b806bd24c7401629df11dcc655e3c14470058282f101ca6a", + strip_prefix = "golang.org/x/sync@v0.6.0", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/golang.org/x/sync/org_golang_x_sync-v0.5.0.zip", - "http://ats.apps.svc/gomod/golang.org/x/sync/org_golang_x_sync-v0.5.0.zip", - "https://cache.hawkingrei.com/gomod/golang.org/x/sync/org_golang_x_sync-v0.5.0.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/golang.org/x/sync/org_golang_x_sync-v0.5.0.zip", + "http://bazel-cache.pingcap.net:8080/gomod/golang.org/x/sync/org_golang_x_sync-v0.6.0.zip", + "http://ats.apps.svc/gomod/golang.org/x/sync/org_golang_x_sync-v0.6.0.zip", + "https://cache.hawkingrei.com/gomod/golang.org/x/sync/org_golang_x_sync-v0.6.0.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/golang.org/x/sync/org_golang_x_sync-v0.6.0.zip", ], ) go_repository( name = "org_golang_x_sys", build_file_proto_mode = "disable_global", importpath = "golang.org/x/sys", - sha256 = "b89913c967594ac104dc08f1b6a2f1ac888d0d001494f80e053ce95d0a13989d", - strip_prefix = "golang.org/x/sys@v0.14.0", + sha256 = "0175809134fc12e040ea427e927036692127f2891b72e224e5153da543af604a", + strip_prefix = "golang.org/x/sys@v0.16.0", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/golang.org/x/sys/org_golang_x_sys-v0.14.0.zip", - "http://ats.apps.svc/gomod/golang.org/x/sys/org_golang_x_sys-v0.14.0.zip", - "https://cache.hawkingrei.com/gomod/golang.org/x/sys/org_golang_x_sys-v0.14.0.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/golang.org/x/sys/org_golang_x_sys-v0.14.0.zip", + "http://bazel-cache.pingcap.net:8080/gomod/golang.org/x/sys/org_golang_x_sys-v0.16.0.zip", + "http://ats.apps.svc/gomod/golang.org/x/sys/org_golang_x_sys-v0.16.0.zip", + "https://cache.hawkingrei.com/gomod/golang.org/x/sys/org_golang_x_sys-v0.16.0.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/golang.org/x/sys/org_golang_x_sys-v0.16.0.zip", ], ) go_repository( name = "org_golang_x_term", build_file_proto_mode = "disable_global", importpath = "golang.org/x/term", - sha256 = "ee6eca1965d6b7d74f15c6f721eac7f3a35dced1e88cd6297e696b0067934f4b", - strip_prefix = "golang.org/x/term@v0.14.0", + sha256 = "83ef4af9d349065d0a05559b033bf384cfc2b2b0b66fc2bdf2a094bd0fc4858f", + strip_prefix = "golang.org/x/term@v0.16.0", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/golang.org/x/term/org_golang_x_term-v0.14.0.zip", - "http://ats.apps.svc/gomod/golang.org/x/term/org_golang_x_term-v0.14.0.zip", - "https://cache.hawkingrei.com/gomod/golang.org/x/term/org_golang_x_term-v0.14.0.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/golang.org/x/term/org_golang_x_term-v0.14.0.zip", + "http://bazel-cache.pingcap.net:8080/gomod/golang.org/x/term/org_golang_x_term-v0.16.0.zip", + "http://ats.apps.svc/gomod/golang.org/x/term/org_golang_x_term-v0.16.0.zip", + "https://cache.hawkingrei.com/gomod/golang.org/x/term/org_golang_x_term-v0.16.0.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/golang.org/x/term/org_golang_x_term-v0.16.0.zip", ], ) go_repository( @@ -10373,39 +10286,39 @@ def go_deps(): name = "org_golang_x_time", build_file_proto_mode = "disable_global", importpath = "golang.org/x/time", - sha256 = "1b1f6164838141925c3871d2ff38ad977fd1708a595931f73dd69b486e8a15af", - strip_prefix = "golang.org/x/time@v0.4.0", + sha256 = "e0e5812d19aed367f79ac0ae0ce4770b6602c85f5cfb8d59f3f573c7487ea516", + strip_prefix = "golang.org/x/time@v0.5.0", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/golang.org/x/time/org_golang_x_time-v0.4.0.zip", - "http://ats.apps.svc/gomod/golang.org/x/time/org_golang_x_time-v0.4.0.zip", - "https://cache.hawkingrei.com/gomod/golang.org/x/time/org_golang_x_time-v0.4.0.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/golang.org/x/time/org_golang_x_time-v0.4.0.zip", + "http://bazel-cache.pingcap.net:8080/gomod/golang.org/x/time/org_golang_x_time-v0.5.0.zip", + "http://ats.apps.svc/gomod/golang.org/x/time/org_golang_x_time-v0.5.0.zip", + "https://cache.hawkingrei.com/gomod/golang.org/x/time/org_golang_x_time-v0.5.0.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/golang.org/x/time/org_golang_x_time-v0.5.0.zip", ], ) go_repository( name = "org_golang_x_tools", build_file_proto_mode = "disable_global", importpath = "golang.org/x/tools", - sha256 = "5cdd3e8b6d805e11c63e8a0262050cd6eac9b0c51bd9b35cd82d5f309d290c70", - strip_prefix = "golang.org/x/tools@v0.15.0", + sha256 = "f4c5fce4cd013419429592043ce0549f47060dfe6f44cca940224cd48c3e28ad", + strip_prefix = "golang.org/x/tools@v0.17.0", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/golang.org/x/tools/org_golang_x_tools-v0.15.0.zip", - "http://ats.apps.svc/gomod/golang.org/x/tools/org_golang_x_tools-v0.15.0.zip", - "https://cache.hawkingrei.com/gomod/golang.org/x/tools/org_golang_x_tools-v0.15.0.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/golang.org/x/tools/org_golang_x_tools-v0.15.0.zip", + "http://bazel-cache.pingcap.net:8080/gomod/golang.org/x/tools/org_golang_x_tools-v0.17.0.zip", + "http://ats.apps.svc/gomod/golang.org/x/tools/org_golang_x_tools-v0.17.0.zip", + "https://cache.hawkingrei.com/gomod/golang.org/x/tools/org_golang_x_tools-v0.17.0.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/golang.org/x/tools/org_golang_x_tools-v0.17.0.zip", ], ) go_repository( name = "org_golang_x_xerrors", build_file_proto_mode = "disable_global", importpath = "golang.org/x/xerrors", - sha256 = "b9c481db33c4b682ba8ba348018ddbd2155bd227cc38ff9f6b4cb2b74bbc3c14", - strip_prefix = "golang.org/x/xerrors@v0.0.0-20220907171357-04be3eba64a2", + sha256 = "df5dd109153c94d2f5c9601d28f558871094e37c42f8e3875f36db858d8be9f9", + strip_prefix = "golang.org/x/xerrors@v0.0.0-20231012003039-104605ab7028", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/golang.org/x/xerrors/org_golang_x_xerrors-v0.0.0-20220907171357-04be3eba64a2.zip", - "http://ats.apps.svc/gomod/golang.org/x/xerrors/org_golang_x_xerrors-v0.0.0-20220907171357-04be3eba64a2.zip", - "https://cache.hawkingrei.com/gomod/golang.org/x/xerrors/org_golang_x_xerrors-v0.0.0-20220907171357-04be3eba64a2.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/golang.org/x/xerrors/org_golang_x_xerrors-v0.0.0-20220907171357-04be3eba64a2.zip", + "http://bazel-cache.pingcap.net:8080/gomod/golang.org/x/xerrors/org_golang_x_xerrors-v0.0.0-20231012003039-104605ab7028.zip", + "http://ats.apps.svc/gomod/golang.org/x/xerrors/org_golang_x_xerrors-v0.0.0-20231012003039-104605ab7028.zip", + "https://cache.hawkingrei.com/gomod/golang.org/x/xerrors/org_golang_x_xerrors-v0.0.0-20231012003039-104605ab7028.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/golang.org/x/xerrors/org_golang_x_xerrors-v0.0.0-20231012003039-104605ab7028.zip", ], ) go_repository( @@ -10525,6 +10438,19 @@ def go_deps(): "https://storage.googleapis.com/pingcapmirror/gomod/modernc.org/y/org_modernc_y-v1.0.9.zip", ], ) + go_repository( + name = "org_mongodb_go_mongo_driver", + build_file_proto_mode = "disable_global", + importpath = "go.mongodb.org/mongo-driver", + sha256 = "6807fb7b9bff4ca90bcffc5eab1952c5f52304f2983c3fec1ff88679b10e40f9", + strip_prefix = "go.mongodb.org/mongo-driver@v1.12.0", + urls = [ + "http://bazel-cache.pingcap.net:8080/gomod/go.mongodb.org/mongo-driver/org_mongodb_go_mongo_driver-v1.12.0.zip", + "http://ats.apps.svc/gomod/go.mongodb.org/mongo-driver/org_mongodb_go_mongo_driver-v1.12.0.zip", + "https://cache.hawkingrei.com/gomod/go.mongodb.org/mongo-driver/org_mongodb_go_mongo_driver-v1.12.0.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/go.mongodb.org/mongo-driver/org_mongodb_go_mongo_driver-v1.12.0.zip", + ], + ) go_repository( name = "org_uber_go_atomic", build_file_proto_mode = "disable_global", @@ -10568,13 +10494,13 @@ def go_deps(): name = "org_uber_go_mock", build_file_proto_mode = "disable_global", importpath = "go.uber.org/mock", - sha256 = "3520cddd6a3fc4d72a5cedb293508cf68ae2fcb0147f038fed8c0d6fd526880c", - strip_prefix = "go.uber.org/mock@v0.3.0", + sha256 = "29c088ba1621e04fba8670e388e962f92c15f47cd45a63bf0e5decd6d5d63cd1", + strip_prefix = "go.uber.org/mock@v0.4.0", urls = [ - "http://bazel-cache.pingcap.net:8080/gomod/go.uber.org/mock/org_uber_go_mock-v0.3.0.zip", - "http://ats.apps.svc/gomod/go.uber.org/mock/org_uber_go_mock-v0.3.0.zip", - "https://cache.hawkingrei.com/gomod/go.uber.org/mock/org_uber_go_mock-v0.3.0.zip", - "https://storage.googleapis.com/pingcapmirror/gomod/go.uber.org/mock/org_uber_go_mock-v0.3.0.zip", + "http://bazel-cache.pingcap.net:8080/gomod/go.uber.org/mock/org_uber_go_mock-v0.4.0.zip", + "http://ats.apps.svc/gomod/go.uber.org/mock/org_uber_go_mock-v0.4.0.zip", + "https://cache.hawkingrei.com/gomod/go.uber.org/mock/org_uber_go_mock-v0.4.0.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/go.uber.org/mock/org_uber_go_mock-v0.4.0.zip", ], ) go_repository( @@ -10616,3 +10542,16 @@ def go_deps(): "https://storage.googleapis.com/pingcapmirror/gomod/go.uber.org/zap/org_uber_go_zap-v1.26.0.zip", ], ) + go_repository( + name = "tools_gotest_v3", + build_file_proto_mode = "disable_global", + importpath = "gotest.tools/v3", + sha256 = "9c1e4b8a1477c52441aafc2025a4b4e8bc300a9817c5549c0dc7fffef34bdaef", + strip_prefix = "gotest.tools/v3@v3.0.3", + urls = [ + "http://bazel-cache.pingcap.net:8080/gomod/gotest.tools/v3/tools_gotest_v3-v3.0.3.zip", + "http://ats.apps.svc/gomod/gotest.tools/v3/tools_gotest_v3-v3.0.3.zip", + "https://cache.hawkingrei.com/gomod/gotest.tools/v3/tools_gotest_v3-v3.0.3.zip", + "https://storage.googleapis.com/pingcapmirror/gomod/gotest.tools/v3/tools_gotest_v3-v3.0.3.zip", + ], + ) diff --git a/Dockerfile b/Dockerfile index 78703896de752..72ed515137983 100644 --- a/Dockerfile +++ b/Dockerfile @@ -12,23 +12,20 @@ # See the License for the specific language governing permissions and # limitations under the License. +# The current dockerfile is only used for development purposes. If used in a +# production environment, please refer to https://github.com/PingCAP-QE/artifacts/blob/main/dockerfiles/cd/builders/tidb/Dockerfile. + # Builder image -FROM rockylinux:9 as builder - -ENV GOLANG_VERSION 1.21.1 -ENV ARCH amd64 -ENV GOLANG_DOWNLOAD_URL https://dl.google.com/go/go$GOLANG_VERSION.linux-$ARCH.tar.gz -ENV GOPATH /go -ENV GOROOT /usr/local/go -ENV PATH $GOPATH/bin:$GOROOT/bin:$PATH -RUN yum update -y && yum groupinstall 'Development Tools' -y \ - && curl -fsSL "$GOLANG_DOWNLOAD_URL" -o golang.tar.gz \ - && tar -C /usr/local -xzf golang.tar.gz \ - && rm golang.tar.gz - -COPY . /tidb +FROM golang:1.21 as builder +WORKDIR /tidb + +COPY . . + ARG GOPROXY -RUN export GOPROXY=${GOPROXY} && cd /tidb && make server +ENV GOPROXY ${GOPROXY} + +RUN make server + FROM rockylinux:9-minimal diff --git a/Dockerfile.enterprise b/Dockerfile.enterprise index 2293674b67bbb..5122580c718ed 100644 --- a/Dockerfile.enterprise +++ b/Dockerfile.enterprise @@ -12,23 +12,17 @@ # See the License for the specific language governing permissions and # limitations under the License. +# The current dockerfile is only used for development purposes. # Builder image -FROM rockylinux:9 as builder +FROM golang:1.21 as builder +WORKDIR /tidb -ENV GOLANG_VERSION 1.21.1 -ENV ARCH amd64 -ENV GOLANG_DOWNLOAD_URL https://dl.google.com/go/go$GOLANG_VERSION.linux-$ARCH.tar.gz -ENV GOPATH /go -ENV GOROOT /usr/local/go -ENV PATH $GOPATH/bin:$GOROOT/bin:$PATH -RUN yum update -y && yum groupinstall 'Development Tools' -y \ - && curl -fsSL "$GOLANG_DOWNLOAD_URL" -o golang.tar.gz \ - && tar -C /usr/local -xzf golang.tar.gz \ - && rm golang.tar.gz +COPY . . -COPY . /tidb ARG GOPROXY -RUN export GOPROXY=${GOPROXY} && cd /tidb && make enterprise-server-build +ENV GOPROXY ${GOPROXY} + +RUN make enterprise-server-build FROM rockylinux:9-minimal diff --git a/MODULE.bazel b/MODULE.bazel new file mode 100644 index 0000000000000..00bb18361f7f6 --- /dev/null +++ b/MODULE.bazel @@ -0,0 +1,6 @@ +############################################################################### +# Bazel now uses Bzlmod by default to manage external dependencies. +# Please consider migrating your external dependencies from WORKSPACE to MODULE.bazel. +# +# For more details, please check https://github.com/bazelbuild/bazel/issues/18958 +############################################################################### diff --git a/MODULE.bazel.lock b/MODULE.bazel.lock new file mode 100644 index 0000000000000..964faf91b3b1b --- /dev/null +++ b/MODULE.bazel.lock @@ -0,0 +1,1245 @@ +{ + "lockFileVersion": 3, + "moduleFileHash": "0e3e315145ac7ee7a4e0ac825e1c5e03c068ec1254dd42c3caaecb27e921dc4d", + "flags": { + "cmdRegistries": [ + "https://bcr.bazel.build/" + ], + "cmdModuleOverrides": {}, + "allowedYankedVersions": [], + "envVarAllowedYankedVersions": "", + "ignoreDevDependency": false, + "directDependenciesMode": "WARNING", + "compatibilityMode": "ERROR" + }, + "localOverrideHashes": { + "bazel_tools": "922ea6752dc9105de5af957f7a99a6933c0a6a712d23df6aad16a9c399f7e787" + }, + "moduleDepGraph": { + "": { + "name": "", + "version": "", + "key": "", + "repoName": "", + "executionPlatformsToRegister": [], + "toolchainsToRegister": [], + "extensionUsages": [], + "deps": { + "bazel_tools": "bazel_tools@_", + "local_config_platform": "local_config_platform@_" + } + }, + "bazel_tools@_": { + "name": "bazel_tools", + "version": "", + "key": "bazel_tools@_", + "repoName": "bazel_tools", + "executionPlatformsToRegister": [], + "toolchainsToRegister": [ + "@local_config_cc_toolchains//:all", + "@local_config_sh//:local_sh_toolchain" + ], + "extensionUsages": [ + { + "extensionBzlFile": "@bazel_tools//tools/cpp:cc_configure.bzl", + "extensionName": "cc_configure_extension", + "usingModule": "bazel_tools@_", + "location": { + "file": "@@bazel_tools//:MODULE.bazel", + "line": 17, + "column": 29 + }, + "imports": { + "local_config_cc": "local_config_cc", + "local_config_cc_toolchains": "local_config_cc_toolchains" + }, + "devImports": [], + "tags": [], + "hasDevUseExtension": false, + "hasNonDevUseExtension": true + }, + { + "extensionBzlFile": "@bazel_tools//tools/osx:xcode_configure.bzl", + "extensionName": "xcode_configure_extension", + "usingModule": "bazel_tools@_", + "location": { + "file": "@@bazel_tools//:MODULE.bazel", + "line": 21, + "column": 32 + }, + "imports": { + "local_config_xcode": "local_config_xcode" + }, + "devImports": [], + "tags": [], + "hasDevUseExtension": false, + "hasNonDevUseExtension": true + }, + { + "extensionBzlFile": "@rules_java//java:extensions.bzl", + "extensionName": "toolchains", + "usingModule": "bazel_tools@_", + "location": { + "file": "@@bazel_tools//:MODULE.bazel", + "line": 24, + "column": 32 + }, + "imports": { + "local_jdk": "local_jdk", + "remote_java_tools": "remote_java_tools", + "remote_java_tools_linux": "remote_java_tools_linux", + "remote_java_tools_windows": "remote_java_tools_windows", + "remote_java_tools_darwin_x86_64": "remote_java_tools_darwin_x86_64", + "remote_java_tools_darwin_arm64": "remote_java_tools_darwin_arm64" + }, + "devImports": [], + "tags": [], + "hasDevUseExtension": false, + "hasNonDevUseExtension": true + }, + { + "extensionBzlFile": "@bazel_tools//tools/sh:sh_configure.bzl", + "extensionName": "sh_configure_extension", + "usingModule": "bazel_tools@_", + "location": { + "file": "@@bazel_tools//:MODULE.bazel", + "line": 35, + "column": 39 + }, + "imports": { + "local_config_sh": "local_config_sh" + }, + "devImports": [], + "tags": [], + "hasDevUseExtension": false, + "hasNonDevUseExtension": true + }, + { + "extensionBzlFile": "@bazel_tools//tools/test:extensions.bzl", + "extensionName": "remote_coverage_tools_extension", + "usingModule": "bazel_tools@_", + "location": { + "file": "@@bazel_tools//:MODULE.bazel", + "line": 39, + "column": 48 + }, + "imports": { + "remote_coverage_tools": "remote_coverage_tools" + }, + "devImports": [], + "tags": [], + "hasDevUseExtension": false, + "hasNonDevUseExtension": true + }, + { + "extensionBzlFile": "@bazel_tools//tools/android:android_extensions.bzl", + "extensionName": "remote_android_tools_extensions", + "usingModule": "bazel_tools@_", + "location": { + "file": "@@bazel_tools//:MODULE.bazel", + "line": 42, + "column": 42 + }, + "imports": { + "android_gmaven_r8": "android_gmaven_r8", + "android_tools": "android_tools" + }, + "devImports": [], + "tags": [], + "hasDevUseExtension": false, + "hasNonDevUseExtension": true + } + ], + "deps": { + "rules_cc": "rules_cc@0.0.9", + "rules_java": "rules_java@7.1.0", + "rules_license": "rules_license@0.0.7", + "rules_proto": "rules_proto@4.0.0", + "rules_python": "rules_python@0.4.0", + "platforms": "platforms@0.0.7", + "com_google_protobuf": "protobuf@3.19.6", + "zlib": "zlib@1.3", + "build_bazel_apple_support": "apple_support@1.5.0", + "local_config_platform": "local_config_platform@_" + } + }, + "local_config_platform@_": { + "name": "local_config_platform", + "version": "", + "key": "local_config_platform@_", + "repoName": "local_config_platform", + "executionPlatformsToRegister": [], + "toolchainsToRegister": [], + "extensionUsages": [], + "deps": { + "platforms": "platforms@0.0.7", + "bazel_tools": "bazel_tools@_" + } + }, + "rules_cc@0.0.9": { + "name": "rules_cc", + "version": "0.0.9", + "key": "rules_cc@0.0.9", + "repoName": "rules_cc", + "executionPlatformsToRegister": [], + "toolchainsToRegister": [ + "@local_config_cc_toolchains//:all" + ], + "extensionUsages": [ + { + "extensionBzlFile": "@bazel_tools//tools/cpp:cc_configure.bzl", + "extensionName": "cc_configure_extension", + "usingModule": "rules_cc@0.0.9", + "location": { + "file": "https://bcr.bazel.build/modules/rules_cc/0.0.9/MODULE.bazel", + "line": 9, + "column": 29 + }, + "imports": { + "local_config_cc_toolchains": "local_config_cc_toolchains" + }, + "devImports": [], + "tags": [], + "hasDevUseExtension": false, + "hasNonDevUseExtension": true + } + ], + "deps": { + "platforms": "platforms@0.0.7", + "bazel_tools": "bazel_tools@_", + "local_config_platform": "local_config_platform@_" + }, + "repoSpec": { + "bzlFile": "@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "rules_cc~0.0.9", + "urls": [ + "https://github.com/bazelbuild/rules_cc/releases/download/0.0.9/rules_cc-0.0.9.tar.gz" + ], + "integrity": "sha256-IDeHW5pEVtzkp50RKorohbvEqtlo5lh9ym5k86CQDN8=", + "strip_prefix": "rules_cc-0.0.9", + "remote_patches": { + "https://bcr.bazel.build/modules/rules_cc/0.0.9/patches/module_dot_bazel_version.patch": "sha256-mM+qzOI0SgAdaJBlWOSMwMPKpaA9b7R37Hj/tp5bb4g=" + }, + "remote_patch_strip": 0 + } + } + }, + "rules_java@7.1.0": { + "name": "rules_java", + "version": "7.1.0", + "key": "rules_java@7.1.0", + "repoName": "rules_java", + "executionPlatformsToRegister": [], + "toolchainsToRegister": [ + "//toolchains:all", + "@local_jdk//:runtime_toolchain_definition", + "@local_jdk//:bootstrap_runtime_toolchain_definition", + "@remotejdk11_linux_toolchain_config_repo//:all", + "@remotejdk11_linux_aarch64_toolchain_config_repo//:all", + "@remotejdk11_linux_ppc64le_toolchain_config_repo//:all", + "@remotejdk11_linux_s390x_toolchain_config_repo//:all", + "@remotejdk11_macos_toolchain_config_repo//:all", + "@remotejdk11_macos_aarch64_toolchain_config_repo//:all", + "@remotejdk11_win_toolchain_config_repo//:all", + "@remotejdk11_win_arm64_toolchain_config_repo//:all", + "@remotejdk17_linux_toolchain_config_repo//:all", + "@remotejdk17_linux_aarch64_toolchain_config_repo//:all", + "@remotejdk17_linux_ppc64le_toolchain_config_repo//:all", + "@remotejdk17_linux_s390x_toolchain_config_repo//:all", + "@remotejdk17_macos_toolchain_config_repo//:all", + "@remotejdk17_macos_aarch64_toolchain_config_repo//:all", + "@remotejdk17_win_toolchain_config_repo//:all", + "@remotejdk17_win_arm64_toolchain_config_repo//:all", + "@remotejdk21_linux_toolchain_config_repo//:all", + "@remotejdk21_linux_aarch64_toolchain_config_repo//:all", + "@remotejdk21_macos_toolchain_config_repo//:all", + "@remotejdk21_macos_aarch64_toolchain_config_repo//:all", + "@remotejdk21_win_toolchain_config_repo//:all" + ], + "extensionUsages": [ + { + "extensionBzlFile": "@rules_java//java:extensions.bzl", + "extensionName": "toolchains", + "usingModule": "rules_java@7.1.0", + "location": { + "file": "https://bcr.bazel.build/modules/rules_java/7.1.0/MODULE.bazel", + "line": 19, + "column": 27 + }, + "imports": { + "remote_java_tools": "remote_java_tools", + "remote_java_tools_linux": "remote_java_tools_linux", + "remote_java_tools_windows": "remote_java_tools_windows", + "remote_java_tools_darwin_x86_64": "remote_java_tools_darwin_x86_64", + "remote_java_tools_darwin_arm64": "remote_java_tools_darwin_arm64", + "local_jdk": "local_jdk", + "remotejdk11_linux_toolchain_config_repo": "remotejdk11_linux_toolchain_config_repo", + "remotejdk11_linux_aarch64_toolchain_config_repo": "remotejdk11_linux_aarch64_toolchain_config_repo", + "remotejdk11_linux_ppc64le_toolchain_config_repo": "remotejdk11_linux_ppc64le_toolchain_config_repo", + "remotejdk11_linux_s390x_toolchain_config_repo": "remotejdk11_linux_s390x_toolchain_config_repo", + "remotejdk11_macos_toolchain_config_repo": "remotejdk11_macos_toolchain_config_repo", + "remotejdk11_macos_aarch64_toolchain_config_repo": "remotejdk11_macos_aarch64_toolchain_config_repo", + "remotejdk11_win_toolchain_config_repo": "remotejdk11_win_toolchain_config_repo", + "remotejdk11_win_arm64_toolchain_config_repo": "remotejdk11_win_arm64_toolchain_config_repo", + "remotejdk17_linux_toolchain_config_repo": "remotejdk17_linux_toolchain_config_repo", + "remotejdk17_linux_aarch64_toolchain_config_repo": "remotejdk17_linux_aarch64_toolchain_config_repo", + "remotejdk17_linux_ppc64le_toolchain_config_repo": "remotejdk17_linux_ppc64le_toolchain_config_repo", + "remotejdk17_linux_s390x_toolchain_config_repo": "remotejdk17_linux_s390x_toolchain_config_repo", + "remotejdk17_macos_toolchain_config_repo": "remotejdk17_macos_toolchain_config_repo", + "remotejdk17_macos_aarch64_toolchain_config_repo": "remotejdk17_macos_aarch64_toolchain_config_repo", + "remotejdk17_win_toolchain_config_repo": "remotejdk17_win_toolchain_config_repo", + "remotejdk17_win_arm64_toolchain_config_repo": "remotejdk17_win_arm64_toolchain_config_repo", + "remotejdk21_linux_toolchain_config_repo": "remotejdk21_linux_toolchain_config_repo", + "remotejdk21_linux_aarch64_toolchain_config_repo": "remotejdk21_linux_aarch64_toolchain_config_repo", + "remotejdk21_macos_toolchain_config_repo": "remotejdk21_macos_toolchain_config_repo", + "remotejdk21_macos_aarch64_toolchain_config_repo": "remotejdk21_macos_aarch64_toolchain_config_repo", + "remotejdk21_win_toolchain_config_repo": "remotejdk21_win_toolchain_config_repo" + }, + "devImports": [], + "tags": [], + "hasDevUseExtension": false, + "hasNonDevUseExtension": true + } + ], + "deps": { + "platforms": "platforms@0.0.7", + "rules_cc": "rules_cc@0.0.9", + "bazel_skylib": "bazel_skylib@1.3.0", + "rules_proto": "rules_proto@4.0.0", + "rules_license": "rules_license@0.0.7", + "bazel_tools": "bazel_tools@_", + "local_config_platform": "local_config_platform@_" + }, + "repoSpec": { + "bzlFile": "@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "rules_java~7.1.0", + "urls": [ + "https://github.com/bazelbuild/rules_java/releases/download/7.1.0/rules_java-7.1.0.tar.gz" + ], + "integrity": "sha256-o3pOX2OrgnFuXdau75iO2EYcegC46TYnImKJn1h81OE=", + "strip_prefix": "", + "remote_patches": {}, + "remote_patch_strip": 0 + } + } + }, + "rules_license@0.0.7": { + "name": "rules_license", + "version": "0.0.7", + "key": "rules_license@0.0.7", + "repoName": "rules_license", + "executionPlatformsToRegister": [], + "toolchainsToRegister": [], + "extensionUsages": [], + "deps": { + "bazel_tools": "bazel_tools@_", + "local_config_platform": "local_config_platform@_" + }, + "repoSpec": { + "bzlFile": "@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "rules_license~0.0.7", + "urls": [ + "https://github.com/bazelbuild/rules_license/releases/download/0.0.7/rules_license-0.0.7.tar.gz" + ], + "integrity": "sha256-RTHezLkTY5ww5cdRKgVNXYdWmNrrddjPkPKEN1/nw2A=", + "strip_prefix": "", + "remote_patches": {}, + "remote_patch_strip": 0 + } + } + }, + "rules_proto@4.0.0": { + "name": "rules_proto", + "version": "4.0.0", + "key": "rules_proto@4.0.0", + "repoName": "rules_proto", + "executionPlatformsToRegister": [], + "toolchainsToRegister": [], + "extensionUsages": [], + "deps": { + "bazel_skylib": "bazel_skylib@1.3.0", + "rules_cc": "rules_cc@0.0.9", + "bazel_tools": "bazel_tools@_", + "local_config_platform": "local_config_platform@_" + }, + "repoSpec": { + "bzlFile": "@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "rules_proto~4.0.0", + "urls": [ + "https://github.com/bazelbuild/rules_proto/archive/refs/tags/4.0.0.zip" + ], + "integrity": "sha256-Lr5z6xyuRA19pNtRYMGjKaynwQpck4H/lwYyVjyhoq4=", + "strip_prefix": "rules_proto-4.0.0", + "remote_patches": { + "https://bcr.bazel.build/modules/rules_proto/4.0.0/patches/module_dot_bazel.patch": "sha256-MclJO7tIAM2ElDAmscNId9pKTpOuDGHgVlW/9VBOIp0=" + }, + "remote_patch_strip": 0 + } + } + }, + "rules_python@0.4.0": { + "name": "rules_python", + "version": "0.4.0", + "key": "rules_python@0.4.0", + "repoName": "rules_python", + "executionPlatformsToRegister": [], + "toolchainsToRegister": [ + "@bazel_tools//tools/python:autodetecting_toolchain" + ], + "extensionUsages": [ + { + "extensionBzlFile": "@rules_python//bzlmod:extensions.bzl", + "extensionName": "pip_install", + "usingModule": "rules_python@0.4.0", + "location": { + "file": "https://bcr.bazel.build/modules/rules_python/0.4.0/MODULE.bazel", + "line": 7, + "column": 28 + }, + "imports": { + "pypi__click": "pypi__click", + "pypi__pip": "pypi__pip", + "pypi__pip_tools": "pypi__pip_tools", + "pypi__pkginfo": "pypi__pkginfo", + "pypi__setuptools": "pypi__setuptools", + "pypi__wheel": "pypi__wheel" + }, + "devImports": [], + "tags": [], + "hasDevUseExtension": false, + "hasNonDevUseExtension": true + } + ], + "deps": { + "bazel_tools": "bazel_tools@_", + "local_config_platform": "local_config_platform@_" + }, + "repoSpec": { + "bzlFile": "@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "rules_python~0.4.0", + "urls": [ + "https://github.com/bazelbuild/rules_python/releases/download/0.4.0/rules_python-0.4.0.tar.gz" + ], + "integrity": "sha256-lUqom0kb5KCDMEosuDgBnIuMNyCnq7nEy4GseiQjDOo=", + "strip_prefix": "", + "remote_patches": { + "https://bcr.bazel.build/modules/rules_python/0.4.0/patches/propagate_pip_install_dependencies.patch": "sha256-v7S/dem/mixg63MF4KoRGDA4KEol9ab/tIVp+6Xq0D0=", + "https://bcr.bazel.build/modules/rules_python/0.4.0/patches/module_dot_bazel.patch": "sha256-kG4VIfWxQazzTuh50mvsx6pmyoRVA4lfH5rkto/Oq+Y=" + }, + "remote_patch_strip": 1 + } + } + }, + "platforms@0.0.7": { + "name": "platforms", + "version": "0.0.7", + "key": "platforms@0.0.7", + "repoName": "platforms", + "executionPlatformsToRegister": [], + "toolchainsToRegister": [], + "extensionUsages": [], + "deps": { + "rules_license": "rules_license@0.0.7", + "bazel_tools": "bazel_tools@_", + "local_config_platform": "local_config_platform@_" + }, + "repoSpec": { + "bzlFile": "@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "platforms", + "urls": [ + "https://github.com/bazelbuild/platforms/releases/download/0.0.7/platforms-0.0.7.tar.gz" + ], + "integrity": "sha256-OlYcmee9vpFzqmU/1Xn+hJ8djWc5V4CrR3Cx84FDHVE=", + "strip_prefix": "", + "remote_patches": {}, + "remote_patch_strip": 0 + } + } + }, + "protobuf@3.19.6": { + "name": "protobuf", + "version": "3.19.6", + "key": "protobuf@3.19.6", + "repoName": "protobuf", + "executionPlatformsToRegister": [], + "toolchainsToRegister": [], + "extensionUsages": [], + "deps": { + "bazel_skylib": "bazel_skylib@1.3.0", + "zlib": "zlib@1.3", + "rules_python": "rules_python@0.4.0", + "rules_cc": "rules_cc@0.0.9", + "rules_proto": "rules_proto@4.0.0", + "rules_java": "rules_java@7.1.0", + "bazel_tools": "bazel_tools@_", + "local_config_platform": "local_config_platform@_" + }, + "repoSpec": { + "bzlFile": "@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "protobuf~3.19.6", + "urls": [ + "https://github.com/protocolbuffers/protobuf/archive/refs/tags/v3.19.6.zip" + ], + "integrity": "sha256-OH4sVZuyx8G8N5jE5s/wFTgaebJ1hpavy/johzC0c4k=", + "strip_prefix": "protobuf-3.19.6", + "remote_patches": { + "https://bcr.bazel.build/modules/protobuf/3.19.6/patches/relative_repo_names.patch": "sha256-w/5gw/zGv8NFId+669hcdw1Uus2lxgYpulATHIwIByI=", + "https://bcr.bazel.build/modules/protobuf/3.19.6/patches/remove_dependency_on_rules_jvm_external.patch": "sha256-THUTnVgEBmjA0W7fKzIyZOVG58DnW9HQTkr4D2zKUUc=", + "https://bcr.bazel.build/modules/protobuf/3.19.6/patches/add_module_dot_bazel_for_examples.patch": "sha256-s/b1gi3baK3LsXefI2rQilhmkb2R5jVJdnT6zEcdfHY=", + "https://bcr.bazel.build/modules/protobuf/3.19.6/patches/module_dot_bazel.patch": "sha256-S0DEni8zgx7rHscW3z/rCEubQnYec0XhNet640cw0h4=" + }, + "remote_patch_strip": 1 + } + } + }, + "zlib@1.3": { + "name": "zlib", + "version": "1.3", + "key": "zlib@1.3", + "repoName": "zlib", + "executionPlatformsToRegister": [], + "toolchainsToRegister": [], + "extensionUsages": [], + "deps": { + "platforms": "platforms@0.0.7", + "rules_cc": "rules_cc@0.0.9", + "bazel_tools": "bazel_tools@_", + "local_config_platform": "local_config_platform@_" + }, + "repoSpec": { + "bzlFile": "@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "zlib~1.3", + "urls": [ + "https://github.com/madler/zlib/releases/download/v1.3/zlib-1.3.tar.gz" + ], + "integrity": "sha256-/wukwpIBPbwnUws6geH5qBPNOd4Byl4Pi/NVcC76WT4=", + "strip_prefix": "zlib-1.3", + "remote_patches": { + "https://bcr.bazel.build/modules/zlib/1.3/patches/add_build_file.patch": "sha256-Ei+FYaaOo7A3jTKunMEodTI0Uw5NXQyZEcboMC8JskY=", + "https://bcr.bazel.build/modules/zlib/1.3/patches/module_dot_bazel.patch": "sha256-fPWLM+2xaF/kuy+kZc1YTfW6hNjrkG400Ho7gckuyJk=" + }, + "remote_patch_strip": 0 + } + } + }, + "apple_support@1.5.0": { + "name": "apple_support", + "version": "1.5.0", + "key": "apple_support@1.5.0", + "repoName": "build_bazel_apple_support", + "executionPlatformsToRegister": [], + "toolchainsToRegister": [ + "@local_config_apple_cc_toolchains//:all" + ], + "extensionUsages": [ + { + "extensionBzlFile": "@build_bazel_apple_support//crosstool:setup.bzl", + "extensionName": "apple_cc_configure_extension", + "usingModule": "apple_support@1.5.0", + "location": { + "file": "https://bcr.bazel.build/modules/apple_support/1.5.0/MODULE.bazel", + "line": 17, + "column": 35 + }, + "imports": { + "local_config_apple_cc": "local_config_apple_cc", + "local_config_apple_cc_toolchains": "local_config_apple_cc_toolchains" + }, + "devImports": [], + "tags": [], + "hasDevUseExtension": false, + "hasNonDevUseExtension": true + } + ], + "deps": { + "bazel_skylib": "bazel_skylib@1.3.0", + "platforms": "platforms@0.0.7", + "bazel_tools": "bazel_tools@_", + "local_config_platform": "local_config_platform@_" + }, + "repoSpec": { + "bzlFile": "@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "apple_support~1.5.0", + "urls": [ + "https://github.com/bazelbuild/apple_support/releases/download/1.5.0/apple_support.1.5.0.tar.gz" + ], + "integrity": "sha256-miM41vja0yRPgj8txghKA+TQ+7J8qJLclw5okNW0gYQ=", + "strip_prefix": "", + "remote_patches": {}, + "remote_patch_strip": 0 + } + } + }, + "bazel_skylib@1.3.0": { + "name": "bazel_skylib", + "version": "1.3.0", + "key": "bazel_skylib@1.3.0", + "repoName": "bazel_skylib", + "executionPlatformsToRegister": [], + "toolchainsToRegister": [ + "//toolchains/unittest:cmd_toolchain", + "//toolchains/unittest:bash_toolchain" + ], + "extensionUsages": [], + "deps": { + "platforms": "platforms@0.0.7", + "bazel_tools": "bazel_tools@_", + "local_config_platform": "local_config_platform@_" + }, + "repoSpec": { + "bzlFile": "@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "bazel_skylib~1.3.0", + "urls": [ + "https://github.com/bazelbuild/bazel-skylib/releases/download/1.3.0/bazel-skylib-1.3.0.tar.gz" + ], + "integrity": "sha256-dNVE2W9KW7Yw1GXKi7z+Ix41lOWq5X4e2/F6brPKJQY=", + "strip_prefix": "", + "remote_patches": {}, + "remote_patch_strip": 0 + } + } + } + }, + "moduleExtensions": { + "@@apple_support~1.5.0//crosstool:setup.bzl%apple_cc_configure_extension": { + "general": { + "bzlTransitiveDigest": "pMLFCYaRPkgXPQ8vtuNkMfiHfPmRBy6QJfnid4sWfv0=", + "accumulatedFileDigests": {}, + "envVariables": {}, + "generatedRepoSpecs": { + "local_config_apple_cc": { + "bzlFile": "@@apple_support~1.5.0//crosstool:setup.bzl", + "ruleClassName": "_apple_cc_autoconf", + "attributes": { + "name": "apple_support~1.5.0~apple_cc_configure_extension~local_config_apple_cc" + } + }, + "local_config_apple_cc_toolchains": { + "bzlFile": "@@apple_support~1.5.0//crosstool:setup.bzl", + "ruleClassName": "_apple_cc_autoconf_toolchains", + "attributes": { + "name": "apple_support~1.5.0~apple_cc_configure_extension~local_config_apple_cc_toolchains" + } + } + } + } + }, + "@@bazel_tools//tools/cpp:cc_configure.bzl%cc_configure_extension": { + "general": { + "bzlTransitiveDigest": "O9sf6ilKWU9Veed02jG9o2HM/xgV/UAyciuFBuxrFRY=", + "accumulatedFileDigests": {}, + "envVariables": {}, + "generatedRepoSpecs": { + "local_config_cc": { + "bzlFile": "@@bazel_tools//tools/cpp:cc_configure.bzl", + "ruleClassName": "cc_autoconf", + "attributes": { + "name": "bazel_tools~cc_configure_extension~local_config_cc" + } + }, + "local_config_cc_toolchains": { + "bzlFile": "@@bazel_tools//tools/cpp:cc_configure.bzl", + "ruleClassName": "cc_autoconf_toolchains", + "attributes": { + "name": "bazel_tools~cc_configure_extension~local_config_cc_toolchains" + } + } + } + } + }, + "@@bazel_tools//tools/osx:xcode_configure.bzl%xcode_configure_extension": { + "general": { + "bzlTransitiveDigest": "Qh2bWTU6QW6wkrd87qrU4YeY+SG37Nvw3A0PR4Y0L2Y=", + "accumulatedFileDigests": {}, + "envVariables": {}, + "generatedRepoSpecs": { + "local_config_xcode": { + "bzlFile": "@@bazel_tools//tools/osx:xcode_configure.bzl", + "ruleClassName": "xcode_autoconf", + "attributes": { + "name": "bazel_tools~xcode_configure_extension~local_config_xcode", + "xcode_locator": "@bazel_tools//tools/osx:xcode_locator.m", + "remote_xcode": "" + } + } + } + } + }, + "@@bazel_tools//tools/sh:sh_configure.bzl%sh_configure_extension": { + "general": { + "bzlTransitiveDigest": "hp4NgmNjEg5+xgvzfh6L83bt9/aiiWETuNpwNuF1MSU=", + "accumulatedFileDigests": {}, + "envVariables": {}, + "generatedRepoSpecs": { + "local_config_sh": { + "bzlFile": "@@bazel_tools//tools/sh:sh_configure.bzl", + "ruleClassName": "sh_config", + "attributes": { + "name": "bazel_tools~sh_configure_extension~local_config_sh" + } + } + } + } + }, + "@@rules_java~7.1.0//java:extensions.bzl%toolchains": { + "general": { + "bzlTransitiveDigest": "iUIRqCK7tkhvcDJCAfPPqSd06IHG0a8HQD0xeQyVAqw=", + "accumulatedFileDigests": {}, + "envVariables": {}, + "generatedRepoSpecs": { + "remotejdk21_linux_toolchain_config_repo": { + "bzlFile": "@@rules_java~7.1.0//toolchains:remote_java_repository.bzl", + "ruleClassName": "_toolchain_config", + "attributes": { + "name": "rules_java~7.1.0~toolchains~remotejdk21_linux_toolchain_config_repo", + "build_file": "\nconfig_setting(\n name = \"prefix_version_setting\",\n values = {\"java_runtime_version\": \"remotejdk_21\"},\n visibility = [\"//visibility:private\"],\n)\nconfig_setting(\n name = \"version_setting\",\n values = {\"java_runtime_version\": \"21\"},\n visibility = [\"//visibility:private\"],\n)\nalias(\n name = \"version_or_prefix_version_setting\",\n actual = select({\n \":version_setting\": \":version_setting\",\n \"//conditions:default\": \":prefix_version_setting\",\n }),\n visibility = [\"//visibility:private\"],\n)\ntoolchain(\n name = \"toolchain\",\n target_compatible_with = [\"@platforms//os:linux\", \"@platforms//cpu:x86_64\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@bazel_tools//tools/jdk:runtime_toolchain_type\",\n toolchain = \"@remotejdk21_linux//:jdk\",\n)\ntoolchain(\n name = \"bootstrap_runtime_toolchain\",\n # These constraints are not required for correctness, but prevent fetches of remote JDK for\n # different architectures. As every Java compilation toolchain depends on a bootstrap runtime in\n # the same configuration, this constraint will not result in toolchain resolution failures.\n exec_compatible_with = [\"@platforms//os:linux\", \"@platforms//cpu:x86_64\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@bazel_tools//tools/jdk:bootstrap_runtime_toolchain_type\",\n toolchain = \"@remotejdk21_linux//:jdk\",\n)\n" + } + }, + "remotejdk17_linux_s390x_toolchain_config_repo": { + "bzlFile": "@@rules_java~7.1.0//toolchains:remote_java_repository.bzl", + "ruleClassName": "_toolchain_config", + "attributes": { + "name": "rules_java~7.1.0~toolchains~remotejdk17_linux_s390x_toolchain_config_repo", + "build_file": "\nconfig_setting(\n name = \"prefix_version_setting\",\n values = {\"java_runtime_version\": \"remotejdk_17\"},\n visibility = [\"//visibility:private\"],\n)\nconfig_setting(\n name = \"version_setting\",\n values = {\"java_runtime_version\": \"17\"},\n visibility = [\"//visibility:private\"],\n)\nalias(\n name = \"version_or_prefix_version_setting\",\n actual = select({\n \":version_setting\": \":version_setting\",\n \"//conditions:default\": \":prefix_version_setting\",\n }),\n visibility = [\"//visibility:private\"],\n)\ntoolchain(\n name = \"toolchain\",\n target_compatible_with = [\"@platforms//os:linux\", \"@platforms//cpu:s390x\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@bazel_tools//tools/jdk:runtime_toolchain_type\",\n toolchain = \"@remotejdk17_linux_s390x//:jdk\",\n)\ntoolchain(\n name = \"bootstrap_runtime_toolchain\",\n # These constraints are not required for correctness, but prevent fetches of remote JDK for\n # different architectures. As every Java compilation toolchain depends on a bootstrap runtime in\n # the same configuration, this constraint will not result in toolchain resolution failures.\n exec_compatible_with = [\"@platforms//os:linux\", \"@platforms//cpu:s390x\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@bazel_tools//tools/jdk:bootstrap_runtime_toolchain_type\",\n toolchain = \"@remotejdk17_linux_s390x//:jdk\",\n)\n" + } + }, + "remotejdk17_macos_toolchain_config_repo": { + "bzlFile": "@@rules_java~7.1.0//toolchains:remote_java_repository.bzl", + "ruleClassName": "_toolchain_config", + "attributes": { + "name": "rules_java~7.1.0~toolchains~remotejdk17_macos_toolchain_config_repo", + "build_file": "\nconfig_setting(\n name = \"prefix_version_setting\",\n values = {\"java_runtime_version\": \"remotejdk_17\"},\n visibility = [\"//visibility:private\"],\n)\nconfig_setting(\n name = \"version_setting\",\n values = {\"java_runtime_version\": \"17\"},\n visibility = [\"//visibility:private\"],\n)\nalias(\n name = \"version_or_prefix_version_setting\",\n actual = select({\n \":version_setting\": \":version_setting\",\n \"//conditions:default\": \":prefix_version_setting\",\n }),\n visibility = [\"//visibility:private\"],\n)\ntoolchain(\n name = \"toolchain\",\n target_compatible_with = [\"@platforms//os:macos\", \"@platforms//cpu:x86_64\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@bazel_tools//tools/jdk:runtime_toolchain_type\",\n toolchain = \"@remotejdk17_macos//:jdk\",\n)\ntoolchain(\n name = \"bootstrap_runtime_toolchain\",\n # These constraints are not required for correctness, but prevent fetches of remote JDK for\n # different architectures. As every Java compilation toolchain depends on a bootstrap runtime in\n # the same configuration, this constraint will not result in toolchain resolution failures.\n exec_compatible_with = [\"@platforms//os:macos\", \"@platforms//cpu:x86_64\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@bazel_tools//tools/jdk:bootstrap_runtime_toolchain_type\",\n toolchain = \"@remotejdk17_macos//:jdk\",\n)\n" + } + }, + "remotejdk21_macos_aarch64_toolchain_config_repo": { + "bzlFile": "@@rules_java~7.1.0//toolchains:remote_java_repository.bzl", + "ruleClassName": "_toolchain_config", + "attributes": { + "name": "rules_java~7.1.0~toolchains~remotejdk21_macos_aarch64_toolchain_config_repo", + "build_file": "\nconfig_setting(\n name = \"prefix_version_setting\",\n values = {\"java_runtime_version\": \"remotejdk_21\"},\n visibility = [\"//visibility:private\"],\n)\nconfig_setting(\n name = \"version_setting\",\n values = {\"java_runtime_version\": \"21\"},\n visibility = [\"//visibility:private\"],\n)\nalias(\n name = \"version_or_prefix_version_setting\",\n actual = select({\n \":version_setting\": \":version_setting\",\n \"//conditions:default\": \":prefix_version_setting\",\n }),\n visibility = [\"//visibility:private\"],\n)\ntoolchain(\n name = \"toolchain\",\n target_compatible_with = [\"@platforms//os:macos\", \"@platforms//cpu:aarch64\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@bazel_tools//tools/jdk:runtime_toolchain_type\",\n toolchain = \"@remotejdk21_macos_aarch64//:jdk\",\n)\ntoolchain(\n name = \"bootstrap_runtime_toolchain\",\n # These constraints are not required for correctness, but prevent fetches of remote JDK for\n # different architectures. As every Java compilation toolchain depends on a bootstrap runtime in\n # the same configuration, this constraint will not result in toolchain resolution failures.\n exec_compatible_with = [\"@platforms//os:macos\", \"@platforms//cpu:aarch64\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@bazel_tools//tools/jdk:bootstrap_runtime_toolchain_type\",\n toolchain = \"@remotejdk21_macos_aarch64//:jdk\",\n)\n" + } + }, + "remotejdk17_linux_aarch64_toolchain_config_repo": { + "bzlFile": "@@rules_java~7.1.0//toolchains:remote_java_repository.bzl", + "ruleClassName": "_toolchain_config", + "attributes": { + "name": "rules_java~7.1.0~toolchains~remotejdk17_linux_aarch64_toolchain_config_repo", + "build_file": "\nconfig_setting(\n name = \"prefix_version_setting\",\n values = {\"java_runtime_version\": \"remotejdk_17\"},\n visibility = [\"//visibility:private\"],\n)\nconfig_setting(\n name = \"version_setting\",\n values = {\"java_runtime_version\": \"17\"},\n visibility = [\"//visibility:private\"],\n)\nalias(\n name = \"version_or_prefix_version_setting\",\n actual = select({\n \":version_setting\": \":version_setting\",\n \"//conditions:default\": \":prefix_version_setting\",\n }),\n visibility = [\"//visibility:private\"],\n)\ntoolchain(\n name = \"toolchain\",\n target_compatible_with = [\"@platforms//os:linux\", \"@platforms//cpu:aarch64\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@bazel_tools//tools/jdk:runtime_toolchain_type\",\n toolchain = \"@remotejdk17_linux_aarch64//:jdk\",\n)\ntoolchain(\n name = \"bootstrap_runtime_toolchain\",\n # These constraints are not required for correctness, but prevent fetches of remote JDK for\n # different architectures. As every Java compilation toolchain depends on a bootstrap runtime in\n # the same configuration, this constraint will not result in toolchain resolution failures.\n exec_compatible_with = [\"@platforms//os:linux\", \"@platforms//cpu:aarch64\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@bazel_tools//tools/jdk:bootstrap_runtime_toolchain_type\",\n toolchain = \"@remotejdk17_linux_aarch64//:jdk\",\n)\n" + } + }, + "remotejdk21_macos_aarch64": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "rules_java~7.1.0~toolchains~remotejdk21_macos_aarch64", + "build_file_content": "load(\"@rules_java//java:defs.bzl\", \"java_runtime\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\nexports_files([\"WORKSPACE\", \"BUILD.bazel\"])\n\nfilegroup(\n name = \"jre\",\n srcs = glob(\n [\n \"jre/bin/**\",\n \"jre/lib/**\",\n ],\n allow_empty = True,\n # In some configurations, Java browser plugin is considered harmful and\n # common antivirus software blocks access to npjp2.dll interfering with Bazel,\n # so do not include it in JRE on Windows.\n exclude = [\"jre/bin/plugin2/**\"],\n ),\n)\n\nfilegroup(\n name = \"jdk-bin\",\n srcs = glob(\n [\"bin/**\"],\n # The JDK on Windows sometimes contains a directory called\n # \"%systemroot%\", which is not a valid label.\n exclude = [\"**/*%*/**\"],\n ),\n)\n\n# This folder holds security policies.\nfilegroup(\n name = \"jdk-conf\",\n srcs = glob(\n [\"conf/**\"],\n allow_empty = True,\n ),\n)\n\nfilegroup(\n name = \"jdk-include\",\n srcs = glob(\n [\"include/**\"],\n allow_empty = True,\n ),\n)\n\nfilegroup(\n name = \"jdk-lib\",\n srcs = glob(\n [\"lib/**\", \"release\"],\n allow_empty = True,\n exclude = [\n \"lib/missioncontrol/**\",\n \"lib/visualvm/**\",\n ],\n ),\n)\n\njava_runtime(\n name = \"jdk\",\n srcs = [\n \":jdk-bin\",\n \":jdk-conf\",\n \":jdk-include\",\n \":jdk-lib\",\n \":jre\",\n ],\n # Provide the 'java` binary explicitly so that the correct path is used by\n # Bazel even when the host platform differs from the execution platform.\n # Exactly one of the two globs will be empty depending on the host platform.\n # When --incompatible_disallow_empty_glob is enabled, each individual empty\n # glob will fail without allow_empty = True, even if the overall result is\n # non-empty.\n java = glob([\"bin/java.exe\", \"bin/java\"], allow_empty = True)[0],\n version = 21,\n)\n", + "sha256": "2a7a99a3ea263dbd8d32a67d1e6e363ba8b25c645c826f5e167a02bbafaff1fa", + "strip_prefix": "zulu21.28.85-ca-jdk21.0.0-macosx_aarch64", + "urls": [ + "https://mirror.bazel.build/cdn.azul.com/zulu/bin/zulu21.28.85-ca-jdk21.0.0-macosx_aarch64.tar.gz", + "https://cdn.azul.com/zulu/bin/zulu21.28.85-ca-jdk21.0.0-macosx_aarch64.tar.gz" + ] + } + }, + "remotejdk17_linux_toolchain_config_repo": { + "bzlFile": "@@rules_java~7.1.0//toolchains:remote_java_repository.bzl", + "ruleClassName": "_toolchain_config", + "attributes": { + "name": "rules_java~7.1.0~toolchains~remotejdk17_linux_toolchain_config_repo", + "build_file": "\nconfig_setting(\n name = \"prefix_version_setting\",\n values = {\"java_runtime_version\": \"remotejdk_17\"},\n visibility = [\"//visibility:private\"],\n)\nconfig_setting(\n name = \"version_setting\",\n values = {\"java_runtime_version\": \"17\"},\n visibility = [\"//visibility:private\"],\n)\nalias(\n name = \"version_or_prefix_version_setting\",\n actual = select({\n \":version_setting\": \":version_setting\",\n \"//conditions:default\": \":prefix_version_setting\",\n }),\n visibility = [\"//visibility:private\"],\n)\ntoolchain(\n name = \"toolchain\",\n target_compatible_with = [\"@platforms//os:linux\", \"@platforms//cpu:x86_64\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@bazel_tools//tools/jdk:runtime_toolchain_type\",\n toolchain = \"@remotejdk17_linux//:jdk\",\n)\ntoolchain(\n name = \"bootstrap_runtime_toolchain\",\n # These constraints are not required for correctness, but prevent fetches of remote JDK for\n # different architectures. As every Java compilation toolchain depends on a bootstrap runtime in\n # the same configuration, this constraint will not result in toolchain resolution failures.\n exec_compatible_with = [\"@platforms//os:linux\", \"@platforms//cpu:x86_64\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@bazel_tools//tools/jdk:bootstrap_runtime_toolchain_type\",\n toolchain = \"@remotejdk17_linux//:jdk\",\n)\n" + } + }, + "remotejdk17_macos_aarch64": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "rules_java~7.1.0~toolchains~remotejdk17_macos_aarch64", + "build_file_content": "load(\"@rules_java//java:defs.bzl\", \"java_runtime\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\nexports_files([\"WORKSPACE\", \"BUILD.bazel\"])\n\nfilegroup(\n name = \"jre\",\n srcs = glob(\n [\n \"jre/bin/**\",\n \"jre/lib/**\",\n ],\n allow_empty = True,\n # In some configurations, Java browser plugin is considered harmful and\n # common antivirus software blocks access to npjp2.dll interfering with Bazel,\n # so do not include it in JRE on Windows.\n exclude = [\"jre/bin/plugin2/**\"],\n ),\n)\n\nfilegroup(\n name = \"jdk-bin\",\n srcs = glob(\n [\"bin/**\"],\n # The JDK on Windows sometimes contains a directory called\n # \"%systemroot%\", which is not a valid label.\n exclude = [\"**/*%*/**\"],\n ),\n)\n\n# This folder holds security policies.\nfilegroup(\n name = \"jdk-conf\",\n srcs = glob(\n [\"conf/**\"],\n allow_empty = True,\n ),\n)\n\nfilegroup(\n name = \"jdk-include\",\n srcs = glob(\n [\"include/**\"],\n allow_empty = True,\n ),\n)\n\nfilegroup(\n name = \"jdk-lib\",\n srcs = glob(\n [\"lib/**\", \"release\"],\n allow_empty = True,\n exclude = [\n \"lib/missioncontrol/**\",\n \"lib/visualvm/**\",\n ],\n ),\n)\n\njava_runtime(\n name = \"jdk\",\n srcs = [\n \":jdk-bin\",\n \":jdk-conf\",\n \":jdk-include\",\n \":jdk-lib\",\n \":jre\",\n ],\n # Provide the 'java` binary explicitly so that the correct path is used by\n # Bazel even when the host platform differs from the execution platform.\n # Exactly one of the two globs will be empty depending on the host platform.\n # When --incompatible_disallow_empty_glob is enabled, each individual empty\n # glob will fail without allow_empty = True, even if the overall result is\n # non-empty.\n java = glob([\"bin/java.exe\", \"bin/java\"], allow_empty = True)[0],\n version = 17,\n)\n", + "sha256": "314b04568ec0ae9b36ba03c9cbd42adc9e1265f74678923b19297d66eb84dcca", + "strip_prefix": "zulu17.44.53-ca-jdk17.0.8.1-macosx_aarch64", + "urls": [ + "https://mirror.bazel.build/cdn.azul.com/zulu/bin/zulu17.44.53-ca-jdk17.0.8.1-macosx_aarch64.tar.gz", + "https://cdn.azul.com/zulu/bin/zulu17.44.53-ca-jdk17.0.8.1-macosx_aarch64.tar.gz" + ] + } + }, + "remote_java_tools_windows": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "rules_java~7.1.0~toolchains~remote_java_tools_windows", + "sha256": "c5c70c214a350f12cbf52da8270fa43ba629b795f3dd328028a38f8f0d39c2a1", + "urls": [ + "https://mirror.bazel.build/bazel_java_tools/releases/java/v13.1/java_tools_windows-v13.1.zip", + "https://github.com/bazelbuild/java_tools/releases/download/java_v13.1/java_tools_windows-v13.1.zip" + ] + } + }, + "remotejdk11_win": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "rules_java~7.1.0~toolchains~remotejdk11_win", + "build_file_content": "load(\"@rules_java//java:defs.bzl\", \"java_runtime\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\nexports_files([\"WORKSPACE\", \"BUILD.bazel\"])\n\nfilegroup(\n name = \"jre\",\n srcs = glob(\n [\n \"jre/bin/**\",\n \"jre/lib/**\",\n ],\n allow_empty = True,\n # In some configurations, Java browser plugin is considered harmful and\n # common antivirus software blocks access to npjp2.dll interfering with Bazel,\n # so do not include it in JRE on Windows.\n exclude = [\"jre/bin/plugin2/**\"],\n ),\n)\n\nfilegroup(\n name = \"jdk-bin\",\n srcs = glob(\n [\"bin/**\"],\n # The JDK on Windows sometimes contains a directory called\n # \"%systemroot%\", which is not a valid label.\n exclude = [\"**/*%*/**\"],\n ),\n)\n\n# This folder holds security policies.\nfilegroup(\n name = \"jdk-conf\",\n srcs = glob(\n [\"conf/**\"],\n allow_empty = True,\n ),\n)\n\nfilegroup(\n name = \"jdk-include\",\n srcs = glob(\n [\"include/**\"],\n allow_empty = True,\n ),\n)\n\nfilegroup(\n name = \"jdk-lib\",\n srcs = glob(\n [\"lib/**\", \"release\"],\n allow_empty = True,\n exclude = [\n \"lib/missioncontrol/**\",\n \"lib/visualvm/**\",\n ],\n ),\n)\n\njava_runtime(\n name = \"jdk\",\n srcs = [\n \":jdk-bin\",\n \":jdk-conf\",\n \":jdk-include\",\n \":jdk-lib\",\n \":jre\",\n ],\n # Provide the 'java` binary explicitly so that the correct path is used by\n # Bazel even when the host platform differs from the execution platform.\n # Exactly one of the two globs will be empty depending on the host platform.\n # When --incompatible_disallow_empty_glob is enabled, each individual empty\n # glob will fail without allow_empty = True, even if the overall result is\n # non-empty.\n java = glob([\"bin/java.exe\", \"bin/java\"], allow_empty = True)[0],\n version = 11,\n)\n", + "sha256": "43408193ce2fa0862819495b5ae8541085b95660153f2adcf91a52d3a1710e83", + "strip_prefix": "zulu11.66.15-ca-jdk11.0.20-win_x64", + "urls": [ + "https://mirror.bazel.build/cdn.azul.com/zulu/bin/zulu11.66.15-ca-jdk11.0.20-win_x64.zip", + "https://cdn.azul.com/zulu/bin/zulu11.66.15-ca-jdk11.0.20-win_x64.zip" + ] + } + }, + "remotejdk11_win_toolchain_config_repo": { + "bzlFile": "@@rules_java~7.1.0//toolchains:remote_java_repository.bzl", + "ruleClassName": "_toolchain_config", + "attributes": { + "name": "rules_java~7.1.0~toolchains~remotejdk11_win_toolchain_config_repo", + "build_file": "\nconfig_setting(\n name = \"prefix_version_setting\",\n values = {\"java_runtime_version\": \"remotejdk_11\"},\n visibility = [\"//visibility:private\"],\n)\nconfig_setting(\n name = \"version_setting\",\n values = {\"java_runtime_version\": \"11\"},\n visibility = [\"//visibility:private\"],\n)\nalias(\n name = \"version_or_prefix_version_setting\",\n actual = select({\n \":version_setting\": \":version_setting\",\n \"//conditions:default\": \":prefix_version_setting\",\n }),\n visibility = [\"//visibility:private\"],\n)\ntoolchain(\n name = \"toolchain\",\n target_compatible_with = [\"@platforms//os:windows\", \"@platforms//cpu:x86_64\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@bazel_tools//tools/jdk:runtime_toolchain_type\",\n toolchain = \"@remotejdk11_win//:jdk\",\n)\ntoolchain(\n name = \"bootstrap_runtime_toolchain\",\n # These constraints are not required for correctness, but prevent fetches of remote JDK for\n # different architectures. As every Java compilation toolchain depends on a bootstrap runtime in\n # the same configuration, this constraint will not result in toolchain resolution failures.\n exec_compatible_with = [\"@platforms//os:windows\", \"@platforms//cpu:x86_64\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@bazel_tools//tools/jdk:bootstrap_runtime_toolchain_type\",\n toolchain = \"@remotejdk11_win//:jdk\",\n)\n" + } + }, + "remotejdk11_linux_aarch64": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "rules_java~7.1.0~toolchains~remotejdk11_linux_aarch64", + "build_file_content": "load(\"@rules_java//java:defs.bzl\", \"java_runtime\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\nexports_files([\"WORKSPACE\", \"BUILD.bazel\"])\n\nfilegroup(\n name = \"jre\",\n srcs = glob(\n [\n \"jre/bin/**\",\n \"jre/lib/**\",\n ],\n allow_empty = True,\n # In some configurations, Java browser plugin is considered harmful and\n # common antivirus software blocks access to npjp2.dll interfering with Bazel,\n # so do not include it in JRE on Windows.\n exclude = [\"jre/bin/plugin2/**\"],\n ),\n)\n\nfilegroup(\n name = \"jdk-bin\",\n srcs = glob(\n [\"bin/**\"],\n # The JDK on Windows sometimes contains a directory called\n # \"%systemroot%\", which is not a valid label.\n exclude = [\"**/*%*/**\"],\n ),\n)\n\n# This folder holds security policies.\nfilegroup(\n name = \"jdk-conf\",\n srcs = glob(\n [\"conf/**\"],\n allow_empty = True,\n ),\n)\n\nfilegroup(\n name = \"jdk-include\",\n srcs = glob(\n [\"include/**\"],\n allow_empty = True,\n ),\n)\n\nfilegroup(\n name = \"jdk-lib\",\n srcs = glob(\n [\"lib/**\", \"release\"],\n allow_empty = True,\n exclude = [\n \"lib/missioncontrol/**\",\n \"lib/visualvm/**\",\n ],\n ),\n)\n\njava_runtime(\n name = \"jdk\",\n srcs = [\n \":jdk-bin\",\n \":jdk-conf\",\n \":jdk-include\",\n \":jdk-lib\",\n \":jre\",\n ],\n # Provide the 'java` binary explicitly so that the correct path is used by\n # Bazel even when the host platform differs from the execution platform.\n # Exactly one of the two globs will be empty depending on the host platform.\n # When --incompatible_disallow_empty_glob is enabled, each individual empty\n # glob will fail without allow_empty = True, even if the overall result is\n # non-empty.\n java = glob([\"bin/java.exe\", \"bin/java\"], allow_empty = True)[0],\n version = 11,\n)\n", + "sha256": "54174439f2b3fddd11f1048c397fe7bb45d4c9d66d452d6889b013d04d21c4de", + "strip_prefix": "zulu11.66.15-ca-jdk11.0.20-linux_aarch64", + "urls": [ + "https://mirror.bazel.build/cdn.azul.com/zulu/bin/zulu11.66.15-ca-jdk11.0.20-linux_aarch64.tar.gz", + "https://cdn.azul.com/zulu/bin/zulu11.66.15-ca-jdk11.0.20-linux_aarch64.tar.gz" + ] + } + }, + "remotejdk17_linux": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "rules_java~7.1.0~toolchains~remotejdk17_linux", + "build_file_content": "load(\"@rules_java//java:defs.bzl\", \"java_runtime\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\nexports_files([\"WORKSPACE\", \"BUILD.bazel\"])\n\nfilegroup(\n name = \"jre\",\n srcs = glob(\n [\n \"jre/bin/**\",\n \"jre/lib/**\",\n ],\n allow_empty = True,\n # In some configurations, Java browser plugin is considered harmful and\n # common antivirus software blocks access to npjp2.dll interfering with Bazel,\n # so do not include it in JRE on Windows.\n exclude = [\"jre/bin/plugin2/**\"],\n ),\n)\n\nfilegroup(\n name = \"jdk-bin\",\n srcs = glob(\n [\"bin/**\"],\n # The JDK on Windows sometimes contains a directory called\n # \"%systemroot%\", which is not a valid label.\n exclude = [\"**/*%*/**\"],\n ),\n)\n\n# This folder holds security policies.\nfilegroup(\n name = \"jdk-conf\",\n srcs = glob(\n [\"conf/**\"],\n allow_empty = True,\n ),\n)\n\nfilegroup(\n name = \"jdk-include\",\n srcs = glob(\n [\"include/**\"],\n allow_empty = True,\n ),\n)\n\nfilegroup(\n name = \"jdk-lib\",\n srcs = glob(\n [\"lib/**\", \"release\"],\n allow_empty = True,\n exclude = [\n \"lib/missioncontrol/**\",\n \"lib/visualvm/**\",\n ],\n ),\n)\n\njava_runtime(\n name = \"jdk\",\n srcs = [\n \":jdk-bin\",\n \":jdk-conf\",\n \":jdk-include\",\n \":jdk-lib\",\n \":jre\",\n ],\n # Provide the 'java` binary explicitly so that the correct path is used by\n # Bazel even when the host platform differs from the execution platform.\n # Exactly one of the two globs will be empty depending on the host platform.\n # When --incompatible_disallow_empty_glob is enabled, each individual empty\n # glob will fail without allow_empty = True, even if the overall result is\n # non-empty.\n java = glob([\"bin/java.exe\", \"bin/java\"], allow_empty = True)[0],\n version = 17,\n)\n", + "sha256": "b9482f2304a1a68a614dfacddcf29569a72f0fac32e6c74f83dc1b9a157b8340", + "strip_prefix": "zulu17.44.53-ca-jdk17.0.8.1-linux_x64", + "urls": [ + "https://mirror.bazel.build/cdn.azul.com/zulu/bin/zulu17.44.53-ca-jdk17.0.8.1-linux_x64.tar.gz", + "https://cdn.azul.com/zulu/bin/zulu17.44.53-ca-jdk17.0.8.1-linux_x64.tar.gz" + ] + } + }, + "remotejdk11_linux_s390x_toolchain_config_repo": { + "bzlFile": "@@rules_java~7.1.0//toolchains:remote_java_repository.bzl", + "ruleClassName": "_toolchain_config", + "attributes": { + "name": "rules_java~7.1.0~toolchains~remotejdk11_linux_s390x_toolchain_config_repo", + "build_file": "\nconfig_setting(\n name = \"prefix_version_setting\",\n values = {\"java_runtime_version\": \"remotejdk_11\"},\n visibility = [\"//visibility:private\"],\n)\nconfig_setting(\n name = \"version_setting\",\n values = {\"java_runtime_version\": \"11\"},\n visibility = [\"//visibility:private\"],\n)\nalias(\n name = \"version_or_prefix_version_setting\",\n actual = select({\n \":version_setting\": \":version_setting\",\n \"//conditions:default\": \":prefix_version_setting\",\n }),\n visibility = [\"//visibility:private\"],\n)\ntoolchain(\n name = \"toolchain\",\n target_compatible_with = [\"@platforms//os:linux\", \"@platforms//cpu:s390x\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@bazel_tools//tools/jdk:runtime_toolchain_type\",\n toolchain = \"@remotejdk11_linux_s390x//:jdk\",\n)\ntoolchain(\n name = \"bootstrap_runtime_toolchain\",\n # These constraints are not required for correctness, but prevent fetches of remote JDK for\n # different architectures. As every Java compilation toolchain depends on a bootstrap runtime in\n # the same configuration, this constraint will not result in toolchain resolution failures.\n exec_compatible_with = [\"@platforms//os:linux\", \"@platforms//cpu:s390x\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@bazel_tools//tools/jdk:bootstrap_runtime_toolchain_type\",\n toolchain = \"@remotejdk11_linux_s390x//:jdk\",\n)\n" + } + }, + "remotejdk11_linux_toolchain_config_repo": { + "bzlFile": "@@rules_java~7.1.0//toolchains:remote_java_repository.bzl", + "ruleClassName": "_toolchain_config", + "attributes": { + "name": "rules_java~7.1.0~toolchains~remotejdk11_linux_toolchain_config_repo", + "build_file": "\nconfig_setting(\n name = \"prefix_version_setting\",\n values = {\"java_runtime_version\": \"remotejdk_11\"},\n visibility = [\"//visibility:private\"],\n)\nconfig_setting(\n name = \"version_setting\",\n values = {\"java_runtime_version\": \"11\"},\n visibility = [\"//visibility:private\"],\n)\nalias(\n name = \"version_or_prefix_version_setting\",\n actual = select({\n \":version_setting\": \":version_setting\",\n \"//conditions:default\": \":prefix_version_setting\",\n }),\n visibility = [\"//visibility:private\"],\n)\ntoolchain(\n name = \"toolchain\",\n target_compatible_with = [\"@platforms//os:linux\", \"@platforms//cpu:x86_64\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@bazel_tools//tools/jdk:runtime_toolchain_type\",\n toolchain = \"@remotejdk11_linux//:jdk\",\n)\ntoolchain(\n name = \"bootstrap_runtime_toolchain\",\n # These constraints are not required for correctness, but prevent fetches of remote JDK for\n # different architectures. As every Java compilation toolchain depends on a bootstrap runtime in\n # the same configuration, this constraint will not result in toolchain resolution failures.\n exec_compatible_with = [\"@platforms//os:linux\", \"@platforms//cpu:x86_64\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@bazel_tools//tools/jdk:bootstrap_runtime_toolchain_type\",\n toolchain = \"@remotejdk11_linux//:jdk\",\n)\n" + } + }, + "remotejdk11_macos": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "rules_java~7.1.0~toolchains~remotejdk11_macos", + "build_file_content": "load(\"@rules_java//java:defs.bzl\", \"java_runtime\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\nexports_files([\"WORKSPACE\", \"BUILD.bazel\"])\n\nfilegroup(\n name = \"jre\",\n srcs = glob(\n [\n \"jre/bin/**\",\n \"jre/lib/**\",\n ],\n allow_empty = True,\n # In some configurations, Java browser plugin is considered harmful and\n # common antivirus software blocks access to npjp2.dll interfering with Bazel,\n # so do not include it in JRE on Windows.\n exclude = [\"jre/bin/plugin2/**\"],\n ),\n)\n\nfilegroup(\n name = \"jdk-bin\",\n srcs = glob(\n [\"bin/**\"],\n # The JDK on Windows sometimes contains a directory called\n # \"%systemroot%\", which is not a valid label.\n exclude = [\"**/*%*/**\"],\n ),\n)\n\n# This folder holds security policies.\nfilegroup(\n name = \"jdk-conf\",\n srcs = glob(\n [\"conf/**\"],\n allow_empty = True,\n ),\n)\n\nfilegroup(\n name = \"jdk-include\",\n srcs = glob(\n [\"include/**\"],\n allow_empty = True,\n ),\n)\n\nfilegroup(\n name = \"jdk-lib\",\n srcs = glob(\n [\"lib/**\", \"release\"],\n allow_empty = True,\n exclude = [\n \"lib/missioncontrol/**\",\n \"lib/visualvm/**\",\n ],\n ),\n)\n\njava_runtime(\n name = \"jdk\",\n srcs = [\n \":jdk-bin\",\n \":jdk-conf\",\n \":jdk-include\",\n \":jdk-lib\",\n \":jre\",\n ],\n # Provide the 'java` binary explicitly so that the correct path is used by\n # Bazel even when the host platform differs from the execution platform.\n # Exactly one of the two globs will be empty depending on the host platform.\n # When --incompatible_disallow_empty_glob is enabled, each individual empty\n # glob will fail without allow_empty = True, even if the overall result is\n # non-empty.\n java = glob([\"bin/java.exe\", \"bin/java\"], allow_empty = True)[0],\n version = 11,\n)\n", + "sha256": "bcaab11cfe586fae7583c6d9d311c64384354fb2638eb9a012eca4c3f1a1d9fd", + "strip_prefix": "zulu11.66.15-ca-jdk11.0.20-macosx_x64", + "urls": [ + "https://mirror.bazel.build/cdn.azul.com/zulu/bin/zulu11.66.15-ca-jdk11.0.20-macosx_x64.tar.gz", + "https://cdn.azul.com/zulu/bin/zulu11.66.15-ca-jdk11.0.20-macosx_x64.tar.gz" + ] + } + }, + "remotejdk11_win_arm64": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "rules_java~7.1.0~toolchains~remotejdk11_win_arm64", + "build_file_content": "load(\"@rules_java//java:defs.bzl\", \"java_runtime\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\nexports_files([\"WORKSPACE\", \"BUILD.bazel\"])\n\nfilegroup(\n name = \"jre\",\n srcs = glob(\n [\n \"jre/bin/**\",\n \"jre/lib/**\",\n ],\n allow_empty = True,\n # In some configurations, Java browser plugin is considered harmful and\n # common antivirus software blocks access to npjp2.dll interfering with Bazel,\n # so do not include it in JRE on Windows.\n exclude = [\"jre/bin/plugin2/**\"],\n ),\n)\n\nfilegroup(\n name = \"jdk-bin\",\n srcs = glob(\n [\"bin/**\"],\n # The JDK on Windows sometimes contains a directory called\n # \"%systemroot%\", which is not a valid label.\n exclude = [\"**/*%*/**\"],\n ),\n)\n\n# This folder holds security policies.\nfilegroup(\n name = \"jdk-conf\",\n srcs = glob(\n [\"conf/**\"],\n allow_empty = True,\n ),\n)\n\nfilegroup(\n name = \"jdk-include\",\n srcs = glob(\n [\"include/**\"],\n allow_empty = True,\n ),\n)\n\nfilegroup(\n name = \"jdk-lib\",\n srcs = glob(\n [\"lib/**\", \"release\"],\n allow_empty = True,\n exclude = [\n \"lib/missioncontrol/**\",\n \"lib/visualvm/**\",\n ],\n ),\n)\n\njava_runtime(\n name = \"jdk\",\n srcs = [\n \":jdk-bin\",\n \":jdk-conf\",\n \":jdk-include\",\n \":jdk-lib\",\n \":jre\",\n ],\n # Provide the 'java` binary explicitly so that the correct path is used by\n # Bazel even when the host platform differs from the execution platform.\n # Exactly one of the two globs will be empty depending on the host platform.\n # When --incompatible_disallow_empty_glob is enabled, each individual empty\n # glob will fail without allow_empty = True, even if the overall result is\n # non-empty.\n java = glob([\"bin/java.exe\", \"bin/java\"], allow_empty = True)[0],\n version = 11,\n)\n", + "sha256": "b8a28e6e767d90acf793ea6f5bed0bb595ba0ba5ebdf8b99f395266161e53ec2", + "strip_prefix": "jdk-11.0.13+8", + "urls": [ + "https://mirror.bazel.build/aka.ms/download-jdk/microsoft-jdk-11.0.13.8.1-windows-aarch64.zip" + ] + } + }, + "remotejdk17_macos": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "rules_java~7.1.0~toolchains~remotejdk17_macos", + "build_file_content": "load(\"@rules_java//java:defs.bzl\", \"java_runtime\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\nexports_files([\"WORKSPACE\", \"BUILD.bazel\"])\n\nfilegroup(\n name = \"jre\",\n srcs = glob(\n [\n \"jre/bin/**\",\n \"jre/lib/**\",\n ],\n allow_empty = True,\n # In some configurations, Java browser plugin is considered harmful and\n # common antivirus software blocks access to npjp2.dll interfering with Bazel,\n # so do not include it in JRE on Windows.\n exclude = [\"jre/bin/plugin2/**\"],\n ),\n)\n\nfilegroup(\n name = \"jdk-bin\",\n srcs = glob(\n [\"bin/**\"],\n # The JDK on Windows sometimes contains a directory called\n # \"%systemroot%\", which is not a valid label.\n exclude = [\"**/*%*/**\"],\n ),\n)\n\n# This folder holds security policies.\nfilegroup(\n name = \"jdk-conf\",\n srcs = glob(\n [\"conf/**\"],\n allow_empty = True,\n ),\n)\n\nfilegroup(\n name = \"jdk-include\",\n srcs = glob(\n [\"include/**\"],\n allow_empty = True,\n ),\n)\n\nfilegroup(\n name = \"jdk-lib\",\n srcs = glob(\n [\"lib/**\", \"release\"],\n allow_empty = True,\n exclude = [\n \"lib/missioncontrol/**\",\n \"lib/visualvm/**\",\n ],\n ),\n)\n\njava_runtime(\n name = \"jdk\",\n srcs = [\n \":jdk-bin\",\n \":jdk-conf\",\n \":jdk-include\",\n \":jdk-lib\",\n \":jre\",\n ],\n # Provide the 'java` binary explicitly so that the correct path is used by\n # Bazel even when the host platform differs from the execution platform.\n # Exactly one of the two globs will be empty depending on the host platform.\n # When --incompatible_disallow_empty_glob is enabled, each individual empty\n # glob will fail without allow_empty = True, even if the overall result is\n # non-empty.\n java = glob([\"bin/java.exe\", \"bin/java\"], allow_empty = True)[0],\n version = 17,\n)\n", + "sha256": "640453e8afe8ffe0fb4dceb4535fb50db9c283c64665eebb0ba68b19e65f4b1f", + "strip_prefix": "zulu17.44.53-ca-jdk17.0.8.1-macosx_x64", + "urls": [ + "https://mirror.bazel.build/cdn.azul.com/zulu/bin/zulu17.44.53-ca-jdk17.0.8.1-macosx_x64.tar.gz", + "https://cdn.azul.com/zulu/bin/zulu17.44.53-ca-jdk17.0.8.1-macosx_x64.tar.gz" + ] + } + }, + "remotejdk21_macos": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "rules_java~7.1.0~toolchains~remotejdk21_macos", + "build_file_content": "load(\"@rules_java//java:defs.bzl\", \"java_runtime\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\nexports_files([\"WORKSPACE\", \"BUILD.bazel\"])\n\nfilegroup(\n name = \"jre\",\n srcs = glob(\n [\n \"jre/bin/**\",\n \"jre/lib/**\",\n ],\n allow_empty = True,\n # In some configurations, Java browser plugin is considered harmful and\n # common antivirus software blocks access to npjp2.dll interfering with Bazel,\n # so do not include it in JRE on Windows.\n exclude = [\"jre/bin/plugin2/**\"],\n ),\n)\n\nfilegroup(\n name = \"jdk-bin\",\n srcs = glob(\n [\"bin/**\"],\n # The JDK on Windows sometimes contains a directory called\n # \"%systemroot%\", which is not a valid label.\n exclude = [\"**/*%*/**\"],\n ),\n)\n\n# This folder holds security policies.\nfilegroup(\n name = \"jdk-conf\",\n srcs = glob(\n [\"conf/**\"],\n allow_empty = True,\n ),\n)\n\nfilegroup(\n name = \"jdk-include\",\n srcs = glob(\n [\"include/**\"],\n allow_empty = True,\n ),\n)\n\nfilegroup(\n name = \"jdk-lib\",\n srcs = glob(\n [\"lib/**\", \"release\"],\n allow_empty = True,\n exclude = [\n \"lib/missioncontrol/**\",\n \"lib/visualvm/**\",\n ],\n ),\n)\n\njava_runtime(\n name = \"jdk\",\n srcs = [\n \":jdk-bin\",\n \":jdk-conf\",\n \":jdk-include\",\n \":jdk-lib\",\n \":jre\",\n ],\n # Provide the 'java` binary explicitly so that the correct path is used by\n # Bazel even when the host platform differs from the execution platform.\n # Exactly one of the two globs will be empty depending on the host platform.\n # When --incompatible_disallow_empty_glob is enabled, each individual empty\n # glob will fail without allow_empty = True, even if the overall result is\n # non-empty.\n java = glob([\"bin/java.exe\", \"bin/java\"], allow_empty = True)[0],\n version = 21,\n)\n", + "sha256": "9639b87db586d0c89f7a9892ae47f421e442c64b97baebdff31788fbe23265bd", + "strip_prefix": "zulu21.28.85-ca-jdk21.0.0-macosx_x64", + "urls": [ + "https://mirror.bazel.build/cdn.azul.com/zulu/bin/zulu21.28.85-ca-jdk21.0.0-macosx_x64.tar.gz", + "https://cdn.azul.com/zulu/bin/zulu21.28.85-ca-jdk21.0.0-macosx_x64.tar.gz" + ] + } + }, + "remotejdk21_macos_toolchain_config_repo": { + "bzlFile": "@@rules_java~7.1.0//toolchains:remote_java_repository.bzl", + "ruleClassName": "_toolchain_config", + "attributes": { + "name": "rules_java~7.1.0~toolchains~remotejdk21_macos_toolchain_config_repo", + "build_file": "\nconfig_setting(\n name = \"prefix_version_setting\",\n values = {\"java_runtime_version\": \"remotejdk_21\"},\n visibility = [\"//visibility:private\"],\n)\nconfig_setting(\n name = \"version_setting\",\n values = {\"java_runtime_version\": \"21\"},\n visibility = [\"//visibility:private\"],\n)\nalias(\n name = \"version_or_prefix_version_setting\",\n actual = select({\n \":version_setting\": \":version_setting\",\n \"//conditions:default\": \":prefix_version_setting\",\n }),\n visibility = [\"//visibility:private\"],\n)\ntoolchain(\n name = \"toolchain\",\n target_compatible_with = [\"@platforms//os:macos\", \"@platforms//cpu:x86_64\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@bazel_tools//tools/jdk:runtime_toolchain_type\",\n toolchain = \"@remotejdk21_macos//:jdk\",\n)\ntoolchain(\n name = \"bootstrap_runtime_toolchain\",\n # These constraints are not required for correctness, but prevent fetches of remote JDK for\n # different architectures. As every Java compilation toolchain depends on a bootstrap runtime in\n # the same configuration, this constraint will not result in toolchain resolution failures.\n exec_compatible_with = [\"@platforms//os:macos\", \"@platforms//cpu:x86_64\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@bazel_tools//tools/jdk:bootstrap_runtime_toolchain_type\",\n toolchain = \"@remotejdk21_macos//:jdk\",\n)\n" + } + }, + "remotejdk17_macos_aarch64_toolchain_config_repo": { + "bzlFile": "@@rules_java~7.1.0//toolchains:remote_java_repository.bzl", + "ruleClassName": "_toolchain_config", + "attributes": { + "name": "rules_java~7.1.0~toolchains~remotejdk17_macos_aarch64_toolchain_config_repo", + "build_file": "\nconfig_setting(\n name = \"prefix_version_setting\",\n values = {\"java_runtime_version\": \"remotejdk_17\"},\n visibility = [\"//visibility:private\"],\n)\nconfig_setting(\n name = \"version_setting\",\n values = {\"java_runtime_version\": \"17\"},\n visibility = [\"//visibility:private\"],\n)\nalias(\n name = \"version_or_prefix_version_setting\",\n actual = select({\n \":version_setting\": \":version_setting\",\n \"//conditions:default\": \":prefix_version_setting\",\n }),\n visibility = [\"//visibility:private\"],\n)\ntoolchain(\n name = \"toolchain\",\n target_compatible_with = [\"@platforms//os:macos\", \"@platforms//cpu:aarch64\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@bazel_tools//tools/jdk:runtime_toolchain_type\",\n toolchain = \"@remotejdk17_macos_aarch64//:jdk\",\n)\ntoolchain(\n name = \"bootstrap_runtime_toolchain\",\n # These constraints are not required for correctness, but prevent fetches of remote JDK for\n # different architectures. As every Java compilation toolchain depends on a bootstrap runtime in\n # the same configuration, this constraint will not result in toolchain resolution failures.\n exec_compatible_with = [\"@platforms//os:macos\", \"@platforms//cpu:aarch64\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@bazel_tools//tools/jdk:bootstrap_runtime_toolchain_type\",\n toolchain = \"@remotejdk17_macos_aarch64//:jdk\",\n)\n" + } + }, + "remotejdk17_win": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "rules_java~7.1.0~toolchains~remotejdk17_win", + "build_file_content": "load(\"@rules_java//java:defs.bzl\", \"java_runtime\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\nexports_files([\"WORKSPACE\", \"BUILD.bazel\"])\n\nfilegroup(\n name = \"jre\",\n srcs = glob(\n [\n \"jre/bin/**\",\n \"jre/lib/**\",\n ],\n allow_empty = True,\n # In some configurations, Java browser plugin is considered harmful and\n # common antivirus software blocks access to npjp2.dll interfering with Bazel,\n # so do not include it in JRE on Windows.\n exclude = [\"jre/bin/plugin2/**\"],\n ),\n)\n\nfilegroup(\n name = \"jdk-bin\",\n srcs = glob(\n [\"bin/**\"],\n # The JDK on Windows sometimes contains a directory called\n # \"%systemroot%\", which is not a valid label.\n exclude = [\"**/*%*/**\"],\n ),\n)\n\n# This folder holds security policies.\nfilegroup(\n name = \"jdk-conf\",\n srcs = glob(\n [\"conf/**\"],\n allow_empty = True,\n ),\n)\n\nfilegroup(\n name = \"jdk-include\",\n srcs = glob(\n [\"include/**\"],\n allow_empty = True,\n ),\n)\n\nfilegroup(\n name = \"jdk-lib\",\n srcs = glob(\n [\"lib/**\", \"release\"],\n allow_empty = True,\n exclude = [\n \"lib/missioncontrol/**\",\n \"lib/visualvm/**\",\n ],\n ),\n)\n\njava_runtime(\n name = \"jdk\",\n srcs = [\n \":jdk-bin\",\n \":jdk-conf\",\n \":jdk-include\",\n \":jdk-lib\",\n \":jre\",\n ],\n # Provide the 'java` binary explicitly so that the correct path is used by\n # Bazel even when the host platform differs from the execution platform.\n # Exactly one of the two globs will be empty depending on the host platform.\n # When --incompatible_disallow_empty_glob is enabled, each individual empty\n # glob will fail without allow_empty = True, even if the overall result is\n # non-empty.\n java = glob([\"bin/java.exe\", \"bin/java\"], allow_empty = True)[0],\n version = 17,\n)\n", + "sha256": "192f2afca57701de6ec496234f7e45d971bf623ff66b8ee4a5c81582054e5637", + "strip_prefix": "zulu17.44.53-ca-jdk17.0.8.1-win_x64", + "urls": [ + "https://mirror.bazel.build/cdn.azul.com/zulu/bin/zulu17.44.53-ca-jdk17.0.8.1-win_x64.zip", + "https://cdn.azul.com/zulu/bin/zulu17.44.53-ca-jdk17.0.8.1-win_x64.zip" + ] + } + }, + "remotejdk11_macos_aarch64_toolchain_config_repo": { + "bzlFile": "@@rules_java~7.1.0//toolchains:remote_java_repository.bzl", + "ruleClassName": "_toolchain_config", + "attributes": { + "name": "rules_java~7.1.0~toolchains~remotejdk11_macos_aarch64_toolchain_config_repo", + "build_file": "\nconfig_setting(\n name = \"prefix_version_setting\",\n values = {\"java_runtime_version\": \"remotejdk_11\"},\n visibility = [\"//visibility:private\"],\n)\nconfig_setting(\n name = \"version_setting\",\n values = {\"java_runtime_version\": \"11\"},\n visibility = [\"//visibility:private\"],\n)\nalias(\n name = \"version_or_prefix_version_setting\",\n actual = select({\n \":version_setting\": \":version_setting\",\n \"//conditions:default\": \":prefix_version_setting\",\n }),\n visibility = [\"//visibility:private\"],\n)\ntoolchain(\n name = \"toolchain\",\n target_compatible_with = [\"@platforms//os:macos\", \"@platforms//cpu:aarch64\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@bazel_tools//tools/jdk:runtime_toolchain_type\",\n toolchain = \"@remotejdk11_macos_aarch64//:jdk\",\n)\ntoolchain(\n name = \"bootstrap_runtime_toolchain\",\n # These constraints are not required for correctness, but prevent fetches of remote JDK for\n # different architectures. As every Java compilation toolchain depends on a bootstrap runtime in\n # the same configuration, this constraint will not result in toolchain resolution failures.\n exec_compatible_with = [\"@platforms//os:macos\", \"@platforms//cpu:aarch64\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@bazel_tools//tools/jdk:bootstrap_runtime_toolchain_type\",\n toolchain = \"@remotejdk11_macos_aarch64//:jdk\",\n)\n" + } + }, + "remotejdk11_linux_ppc64le_toolchain_config_repo": { + "bzlFile": "@@rules_java~7.1.0//toolchains:remote_java_repository.bzl", + "ruleClassName": "_toolchain_config", + "attributes": { + "name": "rules_java~7.1.0~toolchains~remotejdk11_linux_ppc64le_toolchain_config_repo", + "build_file": "\nconfig_setting(\n name = \"prefix_version_setting\",\n values = {\"java_runtime_version\": \"remotejdk_11\"},\n visibility = [\"//visibility:private\"],\n)\nconfig_setting(\n name = \"version_setting\",\n values = {\"java_runtime_version\": \"11\"},\n visibility = [\"//visibility:private\"],\n)\nalias(\n name = \"version_or_prefix_version_setting\",\n actual = select({\n \":version_setting\": \":version_setting\",\n \"//conditions:default\": \":prefix_version_setting\",\n }),\n visibility = [\"//visibility:private\"],\n)\ntoolchain(\n name = \"toolchain\",\n target_compatible_with = [\"@platforms//os:linux\", \"@platforms//cpu:ppc\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@bazel_tools//tools/jdk:runtime_toolchain_type\",\n toolchain = \"@remotejdk11_linux_ppc64le//:jdk\",\n)\ntoolchain(\n name = \"bootstrap_runtime_toolchain\",\n # These constraints are not required for correctness, but prevent fetches of remote JDK for\n # different architectures. As every Java compilation toolchain depends on a bootstrap runtime in\n # the same configuration, this constraint will not result in toolchain resolution failures.\n exec_compatible_with = [\"@platforms//os:linux\", \"@platforms//cpu:ppc\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@bazel_tools//tools/jdk:bootstrap_runtime_toolchain_type\",\n toolchain = \"@remotejdk11_linux_ppc64le//:jdk\",\n)\n" + } + }, + "remotejdk21_linux": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "rules_java~7.1.0~toolchains~remotejdk21_linux", + "build_file_content": "load(\"@rules_java//java:defs.bzl\", \"java_runtime\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\nexports_files([\"WORKSPACE\", \"BUILD.bazel\"])\n\nfilegroup(\n name = \"jre\",\n srcs = glob(\n [\n \"jre/bin/**\",\n \"jre/lib/**\",\n ],\n allow_empty = True,\n # In some configurations, Java browser plugin is considered harmful and\n # common antivirus software blocks access to npjp2.dll interfering with Bazel,\n # so do not include it in JRE on Windows.\n exclude = [\"jre/bin/plugin2/**\"],\n ),\n)\n\nfilegroup(\n name = \"jdk-bin\",\n srcs = glob(\n [\"bin/**\"],\n # The JDK on Windows sometimes contains a directory called\n # \"%systemroot%\", which is not a valid label.\n exclude = [\"**/*%*/**\"],\n ),\n)\n\n# This folder holds security policies.\nfilegroup(\n name = \"jdk-conf\",\n srcs = glob(\n [\"conf/**\"],\n allow_empty = True,\n ),\n)\n\nfilegroup(\n name = \"jdk-include\",\n srcs = glob(\n [\"include/**\"],\n allow_empty = True,\n ),\n)\n\nfilegroup(\n name = \"jdk-lib\",\n srcs = glob(\n [\"lib/**\", \"release\"],\n allow_empty = True,\n exclude = [\n \"lib/missioncontrol/**\",\n \"lib/visualvm/**\",\n ],\n ),\n)\n\njava_runtime(\n name = \"jdk\",\n srcs = [\n \":jdk-bin\",\n \":jdk-conf\",\n \":jdk-include\",\n \":jdk-lib\",\n \":jre\",\n ],\n # Provide the 'java` binary explicitly so that the correct path is used by\n # Bazel even when the host platform differs from the execution platform.\n # Exactly one of the two globs will be empty depending on the host platform.\n # When --incompatible_disallow_empty_glob is enabled, each individual empty\n # glob will fail without allow_empty = True, even if the overall result is\n # non-empty.\n java = glob([\"bin/java.exe\", \"bin/java\"], allow_empty = True)[0],\n version = 21,\n)\n", + "sha256": "0c0eadfbdc47a7ca64aeab51b9c061f71b6e4d25d2d87674512e9b6387e9e3a6", + "strip_prefix": "zulu21.28.85-ca-jdk21.0.0-linux_x64", + "urls": [ + "https://mirror.bazel.build/cdn.azul.com/zulu/bin/zulu21.28.85-ca-jdk21.0.0-linux_x64.tar.gz", + "https://cdn.azul.com/zulu/bin/zulu21.28.85-ca-jdk21.0.0-linux_x64.tar.gz" + ] + } + }, + "remote_java_tools_linux": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "rules_java~7.1.0~toolchains~remote_java_tools_linux", + "sha256": "d134da9b04c9023fb6e56a5d4bffccee73f7bc9572ddc4e747778dacccd7a5a7", + "urls": [ + "https://mirror.bazel.build/bazel_java_tools/releases/java/v13.1/java_tools_linux-v13.1.zip", + "https://github.com/bazelbuild/java_tools/releases/download/java_v13.1/java_tools_linux-v13.1.zip" + ] + } + }, + "remotejdk21_win": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "rules_java~7.1.0~toolchains~remotejdk21_win", + "build_file_content": "load(\"@rules_java//java:defs.bzl\", \"java_runtime\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\nexports_files([\"WORKSPACE\", \"BUILD.bazel\"])\n\nfilegroup(\n name = \"jre\",\n srcs = glob(\n [\n \"jre/bin/**\",\n \"jre/lib/**\",\n ],\n allow_empty = True,\n # In some configurations, Java browser plugin is considered harmful and\n # common antivirus software blocks access to npjp2.dll interfering with Bazel,\n # so do not include it in JRE on Windows.\n exclude = [\"jre/bin/plugin2/**\"],\n ),\n)\n\nfilegroup(\n name = \"jdk-bin\",\n srcs = glob(\n [\"bin/**\"],\n # The JDK on Windows sometimes contains a directory called\n # \"%systemroot%\", which is not a valid label.\n exclude = [\"**/*%*/**\"],\n ),\n)\n\n# This folder holds security policies.\nfilegroup(\n name = \"jdk-conf\",\n srcs = glob(\n [\"conf/**\"],\n allow_empty = True,\n ),\n)\n\nfilegroup(\n name = \"jdk-include\",\n srcs = glob(\n [\"include/**\"],\n allow_empty = True,\n ),\n)\n\nfilegroup(\n name = \"jdk-lib\",\n srcs = glob(\n [\"lib/**\", \"release\"],\n allow_empty = True,\n exclude = [\n \"lib/missioncontrol/**\",\n \"lib/visualvm/**\",\n ],\n ),\n)\n\njava_runtime(\n name = \"jdk\",\n srcs = [\n \":jdk-bin\",\n \":jdk-conf\",\n \":jdk-include\",\n \":jdk-lib\",\n \":jre\",\n ],\n # Provide the 'java` binary explicitly so that the correct path is used by\n # Bazel even when the host platform differs from the execution platform.\n # Exactly one of the two globs will be empty depending on the host platform.\n # When --incompatible_disallow_empty_glob is enabled, each individual empty\n # glob will fail without allow_empty = True, even if the overall result is\n # non-empty.\n java = glob([\"bin/java.exe\", \"bin/java\"], allow_empty = True)[0],\n version = 21,\n)\n", + "sha256": "e9959d500a0d9a7694ac243baf657761479da132f0f94720cbffd092150bd802", + "strip_prefix": "zulu21.28.85-ca-jdk21.0.0-win_x64", + "urls": [ + "https://mirror.bazel.build/cdn.azul.com/zulu/bin/zulu21.28.85-ca-jdk21.0.0-win_x64.zip", + "https://cdn.azul.com/zulu/bin/zulu21.28.85-ca-jdk21.0.0-win_x64.zip" + ] + } + }, + "remotejdk21_linux_aarch64": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "rules_java~7.1.0~toolchains~remotejdk21_linux_aarch64", + "build_file_content": "load(\"@rules_java//java:defs.bzl\", \"java_runtime\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\nexports_files([\"WORKSPACE\", \"BUILD.bazel\"])\n\nfilegroup(\n name = \"jre\",\n srcs = glob(\n [\n \"jre/bin/**\",\n \"jre/lib/**\",\n ],\n allow_empty = True,\n # In some configurations, Java browser plugin is considered harmful and\n # common antivirus software blocks access to npjp2.dll interfering with Bazel,\n # so do not include it in JRE on Windows.\n exclude = [\"jre/bin/plugin2/**\"],\n ),\n)\n\nfilegroup(\n name = \"jdk-bin\",\n srcs = glob(\n [\"bin/**\"],\n # The JDK on Windows sometimes contains a directory called\n # \"%systemroot%\", which is not a valid label.\n exclude = [\"**/*%*/**\"],\n ),\n)\n\n# This folder holds security policies.\nfilegroup(\n name = \"jdk-conf\",\n srcs = glob(\n [\"conf/**\"],\n allow_empty = True,\n ),\n)\n\nfilegroup(\n name = \"jdk-include\",\n srcs = glob(\n [\"include/**\"],\n allow_empty = True,\n ),\n)\n\nfilegroup(\n name = \"jdk-lib\",\n srcs = glob(\n [\"lib/**\", \"release\"],\n allow_empty = True,\n exclude = [\n \"lib/missioncontrol/**\",\n \"lib/visualvm/**\",\n ],\n ),\n)\n\njava_runtime(\n name = \"jdk\",\n srcs = [\n \":jdk-bin\",\n \":jdk-conf\",\n \":jdk-include\",\n \":jdk-lib\",\n \":jre\",\n ],\n # Provide the 'java` binary explicitly so that the correct path is used by\n # Bazel even when the host platform differs from the execution platform.\n # Exactly one of the two globs will be empty depending on the host platform.\n # When --incompatible_disallow_empty_glob is enabled, each individual empty\n # glob will fail without allow_empty = True, even if the overall result is\n # non-empty.\n java = glob([\"bin/java.exe\", \"bin/java\"], allow_empty = True)[0],\n version = 21,\n)\n", + "sha256": "1fb64b8036c5d463d8ab59af06bf5b6b006811e6012e3b0eb6bccf57f1c55835", + "strip_prefix": "zulu21.28.85-ca-jdk21.0.0-linux_aarch64", + "urls": [ + "https://mirror.bazel.build/cdn.azul.com/zulu/bin/zulu21.28.85-ca-jdk21.0.0-linux_aarch64.tar.gz", + "https://cdn.azul.com/zulu/bin/zulu21.28.85-ca-jdk21.0.0-linux_aarch64.tar.gz" + ] + } + }, + "remotejdk11_linux_aarch64_toolchain_config_repo": { + "bzlFile": "@@rules_java~7.1.0//toolchains:remote_java_repository.bzl", + "ruleClassName": "_toolchain_config", + "attributes": { + "name": "rules_java~7.1.0~toolchains~remotejdk11_linux_aarch64_toolchain_config_repo", + "build_file": "\nconfig_setting(\n name = \"prefix_version_setting\",\n values = {\"java_runtime_version\": \"remotejdk_11\"},\n visibility = [\"//visibility:private\"],\n)\nconfig_setting(\n name = \"version_setting\",\n values = {\"java_runtime_version\": \"11\"},\n visibility = [\"//visibility:private\"],\n)\nalias(\n name = \"version_or_prefix_version_setting\",\n actual = select({\n \":version_setting\": \":version_setting\",\n \"//conditions:default\": \":prefix_version_setting\",\n }),\n visibility = [\"//visibility:private\"],\n)\ntoolchain(\n name = \"toolchain\",\n target_compatible_with = [\"@platforms//os:linux\", \"@platforms//cpu:aarch64\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@bazel_tools//tools/jdk:runtime_toolchain_type\",\n toolchain = \"@remotejdk11_linux_aarch64//:jdk\",\n)\ntoolchain(\n name = \"bootstrap_runtime_toolchain\",\n # These constraints are not required for correctness, but prevent fetches of remote JDK for\n # different architectures. As every Java compilation toolchain depends on a bootstrap runtime in\n # the same configuration, this constraint will not result in toolchain resolution failures.\n exec_compatible_with = [\"@platforms//os:linux\", \"@platforms//cpu:aarch64\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@bazel_tools//tools/jdk:bootstrap_runtime_toolchain_type\",\n toolchain = \"@remotejdk11_linux_aarch64//:jdk\",\n)\n" + } + }, + "remotejdk11_linux_s390x": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "rules_java~7.1.0~toolchains~remotejdk11_linux_s390x", + "build_file_content": "load(\"@rules_java//java:defs.bzl\", \"java_runtime\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\nexports_files([\"WORKSPACE\", \"BUILD.bazel\"])\n\nfilegroup(\n name = \"jre\",\n srcs = glob(\n [\n \"jre/bin/**\",\n \"jre/lib/**\",\n ],\n allow_empty = True,\n # In some configurations, Java browser plugin is considered harmful and\n # common antivirus software blocks access to npjp2.dll interfering with Bazel,\n # so do not include it in JRE on Windows.\n exclude = [\"jre/bin/plugin2/**\"],\n ),\n)\n\nfilegroup(\n name = \"jdk-bin\",\n srcs = glob(\n [\"bin/**\"],\n # The JDK on Windows sometimes contains a directory called\n # \"%systemroot%\", which is not a valid label.\n exclude = [\"**/*%*/**\"],\n ),\n)\n\n# This folder holds security policies.\nfilegroup(\n name = \"jdk-conf\",\n srcs = glob(\n [\"conf/**\"],\n allow_empty = True,\n ),\n)\n\nfilegroup(\n name = \"jdk-include\",\n srcs = glob(\n [\"include/**\"],\n allow_empty = True,\n ),\n)\n\nfilegroup(\n name = \"jdk-lib\",\n srcs = glob(\n [\"lib/**\", \"release\"],\n allow_empty = True,\n exclude = [\n \"lib/missioncontrol/**\",\n \"lib/visualvm/**\",\n ],\n ),\n)\n\njava_runtime(\n name = \"jdk\",\n srcs = [\n \":jdk-bin\",\n \":jdk-conf\",\n \":jdk-include\",\n \":jdk-lib\",\n \":jre\",\n ],\n # Provide the 'java` binary explicitly so that the correct path is used by\n # Bazel even when the host platform differs from the execution platform.\n # Exactly one of the two globs will be empty depending on the host platform.\n # When --incompatible_disallow_empty_glob is enabled, each individual empty\n # glob will fail without allow_empty = True, even if the overall result is\n # non-empty.\n java = glob([\"bin/java.exe\", \"bin/java\"], allow_empty = True)[0],\n version = 11,\n)\n", + "sha256": "a58fc0361966af0a5d5a31a2d8a208e3c9bb0f54f345596fd80b99ea9a39788b", + "strip_prefix": "jdk-11.0.15+10", + "urls": [ + "https://mirror.bazel.build/github.com/adoptium/temurin11-binaries/releases/download/jdk-11.0.15+10/OpenJDK11U-jdk_s390x_linux_hotspot_11.0.15_10.tar.gz", + "https://github.com/adoptium/temurin11-binaries/releases/download/jdk-11.0.15+10/OpenJDK11U-jdk_s390x_linux_hotspot_11.0.15_10.tar.gz" + ] + } + }, + "remotejdk17_linux_aarch64": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "rules_java~7.1.0~toolchains~remotejdk17_linux_aarch64", + "build_file_content": "load(\"@rules_java//java:defs.bzl\", \"java_runtime\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\nexports_files([\"WORKSPACE\", \"BUILD.bazel\"])\n\nfilegroup(\n name = \"jre\",\n srcs = glob(\n [\n \"jre/bin/**\",\n \"jre/lib/**\",\n ],\n allow_empty = True,\n # In some configurations, Java browser plugin is considered harmful and\n # common antivirus software blocks access to npjp2.dll interfering with Bazel,\n # so do not include it in JRE on Windows.\n exclude = [\"jre/bin/plugin2/**\"],\n ),\n)\n\nfilegroup(\n name = \"jdk-bin\",\n srcs = glob(\n [\"bin/**\"],\n # The JDK on Windows sometimes contains a directory called\n # \"%systemroot%\", which is not a valid label.\n exclude = [\"**/*%*/**\"],\n ),\n)\n\n# This folder holds security policies.\nfilegroup(\n name = \"jdk-conf\",\n srcs = glob(\n [\"conf/**\"],\n allow_empty = True,\n ),\n)\n\nfilegroup(\n name = \"jdk-include\",\n srcs = glob(\n [\"include/**\"],\n allow_empty = True,\n ),\n)\n\nfilegroup(\n name = \"jdk-lib\",\n srcs = glob(\n [\"lib/**\", \"release\"],\n allow_empty = True,\n exclude = [\n \"lib/missioncontrol/**\",\n \"lib/visualvm/**\",\n ],\n ),\n)\n\njava_runtime(\n name = \"jdk\",\n srcs = [\n \":jdk-bin\",\n \":jdk-conf\",\n \":jdk-include\",\n \":jdk-lib\",\n \":jre\",\n ],\n # Provide the 'java` binary explicitly so that the correct path is used by\n # Bazel even when the host platform differs from the execution platform.\n # Exactly one of the two globs will be empty depending on the host platform.\n # When --incompatible_disallow_empty_glob is enabled, each individual empty\n # glob will fail without allow_empty = True, even if the overall result is\n # non-empty.\n java = glob([\"bin/java.exe\", \"bin/java\"], allow_empty = True)[0],\n version = 17,\n)\n", + "sha256": "6531cef61e416d5a7b691555c8cf2bdff689201b8a001ff45ab6740062b44313", + "strip_prefix": "zulu17.44.53-ca-jdk17.0.8.1-linux_aarch64", + "urls": [ + "https://mirror.bazel.build/cdn.azul.com/zulu/bin/zulu17.44.53-ca-jdk17.0.8.1-linux_aarch64.tar.gz", + "https://cdn.azul.com/zulu/bin/zulu17.44.53-ca-jdk17.0.8.1-linux_aarch64.tar.gz" + ] + } + }, + "remotejdk17_win_arm64_toolchain_config_repo": { + "bzlFile": "@@rules_java~7.1.0//toolchains:remote_java_repository.bzl", + "ruleClassName": "_toolchain_config", + "attributes": { + "name": "rules_java~7.1.0~toolchains~remotejdk17_win_arm64_toolchain_config_repo", + "build_file": "\nconfig_setting(\n name = \"prefix_version_setting\",\n values = {\"java_runtime_version\": \"remotejdk_17\"},\n visibility = [\"//visibility:private\"],\n)\nconfig_setting(\n name = \"version_setting\",\n values = {\"java_runtime_version\": \"17\"},\n visibility = [\"//visibility:private\"],\n)\nalias(\n name = \"version_or_prefix_version_setting\",\n actual = select({\n \":version_setting\": \":version_setting\",\n \"//conditions:default\": \":prefix_version_setting\",\n }),\n visibility = [\"//visibility:private\"],\n)\ntoolchain(\n name = \"toolchain\",\n target_compatible_with = [\"@platforms//os:windows\", \"@platforms//cpu:arm64\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@bazel_tools//tools/jdk:runtime_toolchain_type\",\n toolchain = \"@remotejdk17_win_arm64//:jdk\",\n)\ntoolchain(\n name = \"bootstrap_runtime_toolchain\",\n # These constraints are not required for correctness, but prevent fetches of remote JDK for\n # different architectures. As every Java compilation toolchain depends on a bootstrap runtime in\n # the same configuration, this constraint will not result in toolchain resolution failures.\n exec_compatible_with = [\"@platforms//os:windows\", \"@platforms//cpu:arm64\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@bazel_tools//tools/jdk:bootstrap_runtime_toolchain_type\",\n toolchain = \"@remotejdk17_win_arm64//:jdk\",\n)\n" + } + }, + "remotejdk11_linux": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "rules_java~7.1.0~toolchains~remotejdk11_linux", + "build_file_content": "load(\"@rules_java//java:defs.bzl\", \"java_runtime\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\nexports_files([\"WORKSPACE\", \"BUILD.bazel\"])\n\nfilegroup(\n name = \"jre\",\n srcs = glob(\n [\n \"jre/bin/**\",\n \"jre/lib/**\",\n ],\n allow_empty = True,\n # In some configurations, Java browser plugin is considered harmful and\n # common antivirus software blocks access to npjp2.dll interfering with Bazel,\n # so do not include it in JRE on Windows.\n exclude = [\"jre/bin/plugin2/**\"],\n ),\n)\n\nfilegroup(\n name = \"jdk-bin\",\n srcs = glob(\n [\"bin/**\"],\n # The JDK on Windows sometimes contains a directory called\n # \"%systemroot%\", which is not a valid label.\n exclude = [\"**/*%*/**\"],\n ),\n)\n\n# This folder holds security policies.\nfilegroup(\n name = \"jdk-conf\",\n srcs = glob(\n [\"conf/**\"],\n allow_empty = True,\n ),\n)\n\nfilegroup(\n name = \"jdk-include\",\n srcs = glob(\n [\"include/**\"],\n allow_empty = True,\n ),\n)\n\nfilegroup(\n name = \"jdk-lib\",\n srcs = glob(\n [\"lib/**\", \"release\"],\n allow_empty = True,\n exclude = [\n \"lib/missioncontrol/**\",\n \"lib/visualvm/**\",\n ],\n ),\n)\n\njava_runtime(\n name = \"jdk\",\n srcs = [\n \":jdk-bin\",\n \":jdk-conf\",\n \":jdk-include\",\n \":jdk-lib\",\n \":jre\",\n ],\n # Provide the 'java` binary explicitly so that the correct path is used by\n # Bazel even when the host platform differs from the execution platform.\n # Exactly one of the two globs will be empty depending on the host platform.\n # When --incompatible_disallow_empty_glob is enabled, each individual empty\n # glob will fail without allow_empty = True, even if the overall result is\n # non-empty.\n java = glob([\"bin/java.exe\", \"bin/java\"], allow_empty = True)[0],\n version = 11,\n)\n", + "sha256": "a34b404f87a08a61148b38e1416d837189e1df7a040d949e743633daf4695a3c", + "strip_prefix": "zulu11.66.15-ca-jdk11.0.20-linux_x64", + "urls": [ + "https://mirror.bazel.build/cdn.azul.com/zulu/bin/zulu11.66.15-ca-jdk11.0.20-linux_x64.tar.gz", + "https://cdn.azul.com/zulu/bin/zulu11.66.15-ca-jdk11.0.20-linux_x64.tar.gz" + ] + } + }, + "remotejdk11_macos_toolchain_config_repo": { + "bzlFile": "@@rules_java~7.1.0//toolchains:remote_java_repository.bzl", + "ruleClassName": "_toolchain_config", + "attributes": { + "name": "rules_java~7.1.0~toolchains~remotejdk11_macos_toolchain_config_repo", + "build_file": "\nconfig_setting(\n name = \"prefix_version_setting\",\n values = {\"java_runtime_version\": \"remotejdk_11\"},\n visibility = [\"//visibility:private\"],\n)\nconfig_setting(\n name = \"version_setting\",\n values = {\"java_runtime_version\": \"11\"},\n visibility = [\"//visibility:private\"],\n)\nalias(\n name = \"version_or_prefix_version_setting\",\n actual = select({\n \":version_setting\": \":version_setting\",\n \"//conditions:default\": \":prefix_version_setting\",\n }),\n visibility = [\"//visibility:private\"],\n)\ntoolchain(\n name = \"toolchain\",\n target_compatible_with = [\"@platforms//os:macos\", \"@platforms//cpu:x86_64\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@bazel_tools//tools/jdk:runtime_toolchain_type\",\n toolchain = \"@remotejdk11_macos//:jdk\",\n)\ntoolchain(\n name = \"bootstrap_runtime_toolchain\",\n # These constraints are not required for correctness, but prevent fetches of remote JDK for\n # different architectures. As every Java compilation toolchain depends on a bootstrap runtime in\n # the same configuration, this constraint will not result in toolchain resolution failures.\n exec_compatible_with = [\"@platforms//os:macos\", \"@platforms//cpu:x86_64\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@bazel_tools//tools/jdk:bootstrap_runtime_toolchain_type\",\n toolchain = \"@remotejdk11_macos//:jdk\",\n)\n" + } + }, + "remotejdk17_linux_ppc64le_toolchain_config_repo": { + "bzlFile": "@@rules_java~7.1.0//toolchains:remote_java_repository.bzl", + "ruleClassName": "_toolchain_config", + "attributes": { + "name": "rules_java~7.1.0~toolchains~remotejdk17_linux_ppc64le_toolchain_config_repo", + "build_file": "\nconfig_setting(\n name = \"prefix_version_setting\",\n values = {\"java_runtime_version\": \"remotejdk_17\"},\n visibility = [\"//visibility:private\"],\n)\nconfig_setting(\n name = \"version_setting\",\n values = {\"java_runtime_version\": \"17\"},\n visibility = [\"//visibility:private\"],\n)\nalias(\n name = \"version_or_prefix_version_setting\",\n actual = select({\n \":version_setting\": \":version_setting\",\n \"//conditions:default\": \":prefix_version_setting\",\n }),\n visibility = [\"//visibility:private\"],\n)\ntoolchain(\n name = \"toolchain\",\n target_compatible_with = [\"@platforms//os:linux\", \"@platforms//cpu:ppc\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@bazel_tools//tools/jdk:runtime_toolchain_type\",\n toolchain = \"@remotejdk17_linux_ppc64le//:jdk\",\n)\ntoolchain(\n name = \"bootstrap_runtime_toolchain\",\n # These constraints are not required for correctness, but prevent fetches of remote JDK for\n # different architectures. As every Java compilation toolchain depends on a bootstrap runtime in\n # the same configuration, this constraint will not result in toolchain resolution failures.\n exec_compatible_with = [\"@platforms//os:linux\", \"@platforms//cpu:ppc\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@bazel_tools//tools/jdk:bootstrap_runtime_toolchain_type\",\n toolchain = \"@remotejdk17_linux_ppc64le//:jdk\",\n)\n" + } + }, + "remotejdk17_win_arm64": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "rules_java~7.1.0~toolchains~remotejdk17_win_arm64", + "build_file_content": "load(\"@rules_java//java:defs.bzl\", \"java_runtime\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\nexports_files([\"WORKSPACE\", \"BUILD.bazel\"])\n\nfilegroup(\n name = \"jre\",\n srcs = glob(\n [\n \"jre/bin/**\",\n \"jre/lib/**\",\n ],\n allow_empty = True,\n # In some configurations, Java browser plugin is considered harmful and\n # common antivirus software blocks access to npjp2.dll interfering with Bazel,\n # so do not include it in JRE on Windows.\n exclude = [\"jre/bin/plugin2/**\"],\n ),\n)\n\nfilegroup(\n name = \"jdk-bin\",\n srcs = glob(\n [\"bin/**\"],\n # The JDK on Windows sometimes contains a directory called\n # \"%systemroot%\", which is not a valid label.\n exclude = [\"**/*%*/**\"],\n ),\n)\n\n# This folder holds security policies.\nfilegroup(\n name = \"jdk-conf\",\n srcs = glob(\n [\"conf/**\"],\n allow_empty = True,\n ),\n)\n\nfilegroup(\n name = \"jdk-include\",\n srcs = glob(\n [\"include/**\"],\n allow_empty = True,\n ),\n)\n\nfilegroup(\n name = \"jdk-lib\",\n srcs = glob(\n [\"lib/**\", \"release\"],\n allow_empty = True,\n exclude = [\n \"lib/missioncontrol/**\",\n \"lib/visualvm/**\",\n ],\n ),\n)\n\njava_runtime(\n name = \"jdk\",\n srcs = [\n \":jdk-bin\",\n \":jdk-conf\",\n \":jdk-include\",\n \":jdk-lib\",\n \":jre\",\n ],\n # Provide the 'java` binary explicitly so that the correct path is used by\n # Bazel even when the host platform differs from the execution platform.\n # Exactly one of the two globs will be empty depending on the host platform.\n # When --incompatible_disallow_empty_glob is enabled, each individual empty\n # glob will fail without allow_empty = True, even if the overall result is\n # non-empty.\n java = glob([\"bin/java.exe\", \"bin/java\"], allow_empty = True)[0],\n version = 17,\n)\n", + "sha256": "6802c99eae0d788e21f52d03cab2e2b3bf42bc334ca03cbf19f71eb70ee19f85", + "strip_prefix": "zulu17.44.53-ca-jdk17.0.8.1-win_aarch64", + "urls": [ + "https://mirror.bazel.build/cdn.azul.com/zulu/bin/zulu17.44.53-ca-jdk17.0.8.1-win_aarch64.zip", + "https://cdn.azul.com/zulu/bin/zulu17.44.53-ca-jdk17.0.8.1-win_aarch64.zip" + ] + } + }, + "remote_java_tools_darwin_arm64": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "rules_java~7.1.0~toolchains~remote_java_tools_darwin_arm64", + "sha256": "dab5bb87ec43e980faea6e1cec14bafb217b8e2f5346f53aa784fd715929a930", + "urls": [ + "https://mirror.bazel.build/bazel_java_tools/releases/java/v13.1/java_tools_darwin_arm64-v13.1.zip", + "https://github.com/bazelbuild/java_tools/releases/download/java_v13.1/java_tools_darwin_arm64-v13.1.zip" + ] + } + }, + "remotejdk17_linux_ppc64le": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "rules_java~7.1.0~toolchains~remotejdk17_linux_ppc64le", + "build_file_content": "load(\"@rules_java//java:defs.bzl\", \"java_runtime\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\nexports_files([\"WORKSPACE\", \"BUILD.bazel\"])\n\nfilegroup(\n name = \"jre\",\n srcs = glob(\n [\n \"jre/bin/**\",\n \"jre/lib/**\",\n ],\n allow_empty = True,\n # In some configurations, Java browser plugin is considered harmful and\n # common antivirus software blocks access to npjp2.dll interfering with Bazel,\n # so do not include it in JRE on Windows.\n exclude = [\"jre/bin/plugin2/**\"],\n ),\n)\n\nfilegroup(\n name = \"jdk-bin\",\n srcs = glob(\n [\"bin/**\"],\n # The JDK on Windows sometimes contains a directory called\n # \"%systemroot%\", which is not a valid label.\n exclude = [\"**/*%*/**\"],\n ),\n)\n\n# This folder holds security policies.\nfilegroup(\n name = \"jdk-conf\",\n srcs = glob(\n [\"conf/**\"],\n allow_empty = True,\n ),\n)\n\nfilegroup(\n name = \"jdk-include\",\n srcs = glob(\n [\"include/**\"],\n allow_empty = True,\n ),\n)\n\nfilegroup(\n name = \"jdk-lib\",\n srcs = glob(\n [\"lib/**\", \"release\"],\n allow_empty = True,\n exclude = [\n \"lib/missioncontrol/**\",\n \"lib/visualvm/**\",\n ],\n ),\n)\n\njava_runtime(\n name = \"jdk\",\n srcs = [\n \":jdk-bin\",\n \":jdk-conf\",\n \":jdk-include\",\n \":jdk-lib\",\n \":jre\",\n ],\n # Provide the 'java` binary explicitly so that the correct path is used by\n # Bazel even when the host platform differs from the execution platform.\n # Exactly one of the two globs will be empty depending on the host platform.\n # When --incompatible_disallow_empty_glob is enabled, each individual empty\n # glob will fail without allow_empty = True, even if the overall result is\n # non-empty.\n java = glob([\"bin/java.exe\", \"bin/java\"], allow_empty = True)[0],\n version = 17,\n)\n", + "sha256": "00a4c07603d0218cd678461b5b3b7e25b3253102da4022d31fc35907f21a2efd", + "strip_prefix": "jdk-17.0.8.1+1", + "urls": [ + "https://mirror.bazel.build/github.com/adoptium/temurin17-binaries/releases/download/jdk-17.0.8.1%2B1/OpenJDK17U-jdk_ppc64le_linux_hotspot_17.0.8.1_1.tar.gz", + "https://github.com/adoptium/temurin17-binaries/releases/download/jdk-17.0.8.1%2B1/OpenJDK17U-jdk_ppc64le_linux_hotspot_17.0.8.1_1.tar.gz" + ] + } + }, + "remotejdk21_linux_aarch64_toolchain_config_repo": { + "bzlFile": "@@rules_java~7.1.0//toolchains:remote_java_repository.bzl", + "ruleClassName": "_toolchain_config", + "attributes": { + "name": "rules_java~7.1.0~toolchains~remotejdk21_linux_aarch64_toolchain_config_repo", + "build_file": "\nconfig_setting(\n name = \"prefix_version_setting\",\n values = {\"java_runtime_version\": \"remotejdk_21\"},\n visibility = [\"//visibility:private\"],\n)\nconfig_setting(\n name = \"version_setting\",\n values = {\"java_runtime_version\": \"21\"},\n visibility = [\"//visibility:private\"],\n)\nalias(\n name = \"version_or_prefix_version_setting\",\n actual = select({\n \":version_setting\": \":version_setting\",\n \"//conditions:default\": \":prefix_version_setting\",\n }),\n visibility = [\"//visibility:private\"],\n)\ntoolchain(\n name = \"toolchain\",\n target_compatible_with = [\"@platforms//os:linux\", \"@platforms//cpu:aarch64\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@bazel_tools//tools/jdk:runtime_toolchain_type\",\n toolchain = \"@remotejdk21_linux_aarch64//:jdk\",\n)\ntoolchain(\n name = \"bootstrap_runtime_toolchain\",\n # These constraints are not required for correctness, but prevent fetches of remote JDK for\n # different architectures. As every Java compilation toolchain depends on a bootstrap runtime in\n # the same configuration, this constraint will not result in toolchain resolution failures.\n exec_compatible_with = [\"@platforms//os:linux\", \"@platforms//cpu:aarch64\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@bazel_tools//tools/jdk:bootstrap_runtime_toolchain_type\",\n toolchain = \"@remotejdk21_linux_aarch64//:jdk\",\n)\n" + } + }, + "remotejdk11_win_arm64_toolchain_config_repo": { + "bzlFile": "@@rules_java~7.1.0//toolchains:remote_java_repository.bzl", + "ruleClassName": "_toolchain_config", + "attributes": { + "name": "rules_java~7.1.0~toolchains~remotejdk11_win_arm64_toolchain_config_repo", + "build_file": "\nconfig_setting(\n name = \"prefix_version_setting\",\n values = {\"java_runtime_version\": \"remotejdk_11\"},\n visibility = [\"//visibility:private\"],\n)\nconfig_setting(\n name = \"version_setting\",\n values = {\"java_runtime_version\": \"11\"},\n visibility = [\"//visibility:private\"],\n)\nalias(\n name = \"version_or_prefix_version_setting\",\n actual = select({\n \":version_setting\": \":version_setting\",\n \"//conditions:default\": \":prefix_version_setting\",\n }),\n visibility = [\"//visibility:private\"],\n)\ntoolchain(\n name = \"toolchain\",\n target_compatible_with = [\"@platforms//os:windows\", \"@platforms//cpu:arm64\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@bazel_tools//tools/jdk:runtime_toolchain_type\",\n toolchain = \"@remotejdk11_win_arm64//:jdk\",\n)\ntoolchain(\n name = \"bootstrap_runtime_toolchain\",\n # These constraints are not required for correctness, but prevent fetches of remote JDK for\n # different architectures. As every Java compilation toolchain depends on a bootstrap runtime in\n # the same configuration, this constraint will not result in toolchain resolution failures.\n exec_compatible_with = [\"@platforms//os:windows\", \"@platforms//cpu:arm64\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@bazel_tools//tools/jdk:bootstrap_runtime_toolchain_type\",\n toolchain = \"@remotejdk11_win_arm64//:jdk\",\n)\n" + } + }, + "local_jdk": { + "bzlFile": "@@rules_java~7.1.0//toolchains:local_java_repository.bzl", + "ruleClassName": "_local_java_repository_rule", + "attributes": { + "name": "rules_java~7.1.0~toolchains~local_jdk", + "java_home": "", + "version": "", + "build_file_content": "load(\"@rules_java//java:defs.bzl\", \"java_runtime\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\nexports_files([\"WORKSPACE\", \"BUILD.bazel\"])\n\nfilegroup(\n name = \"jre\",\n srcs = glob(\n [\n \"jre/bin/**\",\n \"jre/lib/**\",\n ],\n allow_empty = True,\n # In some configurations, Java browser plugin is considered harmful and\n # common antivirus software blocks access to npjp2.dll interfering with Bazel,\n # so do not include it in JRE on Windows.\n exclude = [\"jre/bin/plugin2/**\"],\n ),\n)\n\nfilegroup(\n name = \"jdk-bin\",\n srcs = glob(\n [\"bin/**\"],\n # The JDK on Windows sometimes contains a directory called\n # \"%systemroot%\", which is not a valid label.\n exclude = [\"**/*%*/**\"],\n ),\n)\n\n# This folder holds security policies.\nfilegroup(\n name = \"jdk-conf\",\n srcs = glob(\n [\"conf/**\"],\n allow_empty = True,\n ),\n)\n\nfilegroup(\n name = \"jdk-include\",\n srcs = glob(\n [\"include/**\"],\n allow_empty = True,\n ),\n)\n\nfilegroup(\n name = \"jdk-lib\",\n srcs = glob(\n [\"lib/**\", \"release\"],\n allow_empty = True,\n exclude = [\n \"lib/missioncontrol/**\",\n \"lib/visualvm/**\",\n ],\n ),\n)\n\njava_runtime(\n name = \"jdk\",\n srcs = [\n \":jdk-bin\",\n \":jdk-conf\",\n \":jdk-include\",\n \":jdk-lib\",\n \":jre\",\n ],\n # Provide the 'java` binary explicitly so that the correct path is used by\n # Bazel even when the host platform differs from the execution platform.\n # Exactly one of the two globs will be empty depending on the host platform.\n # When --incompatible_disallow_empty_glob is enabled, each individual empty\n # glob will fail without allow_empty = True, even if the overall result is\n # non-empty.\n java = glob([\"bin/java.exe\", \"bin/java\"], allow_empty = True)[0],\n version = {RUNTIME_VERSION},\n)\n" + } + }, + "remote_java_tools_darwin_x86_64": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "rules_java~7.1.0~toolchains~remote_java_tools_darwin_x86_64", + "sha256": "0db40d8505a2b65ef0ed46e4256757807db8162f7acff16225be57c1d5726dbc", + "urls": [ + "https://mirror.bazel.build/bazel_java_tools/releases/java/v13.1/java_tools_darwin_x86_64-v13.1.zip", + "https://github.com/bazelbuild/java_tools/releases/download/java_v13.1/java_tools_darwin_x86_64-v13.1.zip" + ] + } + }, + "remote_java_tools": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "rules_java~7.1.0~toolchains~remote_java_tools", + "sha256": "286bdbbd66e616fc4ed3f90101418729a73baa7e8c23a98ffbef558f74c0ad14", + "urls": [ + "https://mirror.bazel.build/bazel_java_tools/releases/java/v13.1/java_tools-v13.1.zip", + "https://github.com/bazelbuild/java_tools/releases/download/java_v13.1/java_tools-v13.1.zip" + ] + } + }, + "remotejdk17_linux_s390x": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "rules_java~7.1.0~toolchains~remotejdk17_linux_s390x", + "build_file_content": "load(\"@rules_java//java:defs.bzl\", \"java_runtime\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\nexports_files([\"WORKSPACE\", \"BUILD.bazel\"])\n\nfilegroup(\n name = \"jre\",\n srcs = glob(\n [\n \"jre/bin/**\",\n \"jre/lib/**\",\n ],\n allow_empty = True,\n # In some configurations, Java browser plugin is considered harmful and\n # common antivirus software blocks access to npjp2.dll interfering with Bazel,\n # so do not include it in JRE on Windows.\n exclude = [\"jre/bin/plugin2/**\"],\n ),\n)\n\nfilegroup(\n name = \"jdk-bin\",\n srcs = glob(\n [\"bin/**\"],\n # The JDK on Windows sometimes contains a directory called\n # \"%systemroot%\", which is not a valid label.\n exclude = [\"**/*%*/**\"],\n ),\n)\n\n# This folder holds security policies.\nfilegroup(\n name = \"jdk-conf\",\n srcs = glob(\n [\"conf/**\"],\n allow_empty = True,\n ),\n)\n\nfilegroup(\n name = \"jdk-include\",\n srcs = glob(\n [\"include/**\"],\n allow_empty = True,\n ),\n)\n\nfilegroup(\n name = \"jdk-lib\",\n srcs = glob(\n [\"lib/**\", \"release\"],\n allow_empty = True,\n exclude = [\n \"lib/missioncontrol/**\",\n \"lib/visualvm/**\",\n ],\n ),\n)\n\njava_runtime(\n name = \"jdk\",\n srcs = [\n \":jdk-bin\",\n \":jdk-conf\",\n \":jdk-include\",\n \":jdk-lib\",\n \":jre\",\n ],\n # Provide the 'java` binary explicitly so that the correct path is used by\n # Bazel even when the host platform differs from the execution platform.\n # Exactly one of the two globs will be empty depending on the host platform.\n # When --incompatible_disallow_empty_glob is enabled, each individual empty\n # glob will fail without allow_empty = True, even if the overall result is\n # non-empty.\n java = glob([\"bin/java.exe\", \"bin/java\"], allow_empty = True)[0],\n version = 17,\n)\n", + "sha256": "ffacba69c6843d7ca70d572489d6cc7ab7ae52c60f0852cedf4cf0d248b6fc37", + "strip_prefix": "jdk-17.0.8.1+1", + "urls": [ + "https://mirror.bazel.build/github.com/adoptium/temurin17-binaries/releases/download/jdk-17.0.8.1%2B1/OpenJDK17U-jdk_s390x_linux_hotspot_17.0.8.1_1.tar.gz", + "https://github.com/adoptium/temurin17-binaries/releases/download/jdk-17.0.8.1%2B1/OpenJDK17U-jdk_s390x_linux_hotspot_17.0.8.1_1.tar.gz" + ] + } + }, + "remotejdk17_win_toolchain_config_repo": { + "bzlFile": "@@rules_java~7.1.0//toolchains:remote_java_repository.bzl", + "ruleClassName": "_toolchain_config", + "attributes": { + "name": "rules_java~7.1.0~toolchains~remotejdk17_win_toolchain_config_repo", + "build_file": "\nconfig_setting(\n name = \"prefix_version_setting\",\n values = {\"java_runtime_version\": \"remotejdk_17\"},\n visibility = [\"//visibility:private\"],\n)\nconfig_setting(\n name = \"version_setting\",\n values = {\"java_runtime_version\": \"17\"},\n visibility = [\"//visibility:private\"],\n)\nalias(\n name = \"version_or_prefix_version_setting\",\n actual = select({\n \":version_setting\": \":version_setting\",\n \"//conditions:default\": \":prefix_version_setting\",\n }),\n visibility = [\"//visibility:private\"],\n)\ntoolchain(\n name = \"toolchain\",\n target_compatible_with = [\"@platforms//os:windows\", \"@platforms//cpu:x86_64\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@bazel_tools//tools/jdk:runtime_toolchain_type\",\n toolchain = \"@remotejdk17_win//:jdk\",\n)\ntoolchain(\n name = \"bootstrap_runtime_toolchain\",\n # These constraints are not required for correctness, but prevent fetches of remote JDK for\n # different architectures. As every Java compilation toolchain depends on a bootstrap runtime in\n # the same configuration, this constraint will not result in toolchain resolution failures.\n exec_compatible_with = [\"@platforms//os:windows\", \"@platforms//cpu:x86_64\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@bazel_tools//tools/jdk:bootstrap_runtime_toolchain_type\",\n toolchain = \"@remotejdk17_win//:jdk\",\n)\n" + } + }, + "remotejdk11_linux_ppc64le": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "rules_java~7.1.0~toolchains~remotejdk11_linux_ppc64le", + "build_file_content": "load(\"@rules_java//java:defs.bzl\", \"java_runtime\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\nexports_files([\"WORKSPACE\", \"BUILD.bazel\"])\n\nfilegroup(\n name = \"jre\",\n srcs = glob(\n [\n \"jre/bin/**\",\n \"jre/lib/**\",\n ],\n allow_empty = True,\n # In some configurations, Java browser plugin is considered harmful and\n # common antivirus software blocks access to npjp2.dll interfering with Bazel,\n # so do not include it in JRE on Windows.\n exclude = [\"jre/bin/plugin2/**\"],\n ),\n)\n\nfilegroup(\n name = \"jdk-bin\",\n srcs = glob(\n [\"bin/**\"],\n # The JDK on Windows sometimes contains a directory called\n # \"%systemroot%\", which is not a valid label.\n exclude = [\"**/*%*/**\"],\n ),\n)\n\n# This folder holds security policies.\nfilegroup(\n name = \"jdk-conf\",\n srcs = glob(\n [\"conf/**\"],\n allow_empty = True,\n ),\n)\n\nfilegroup(\n name = \"jdk-include\",\n srcs = glob(\n [\"include/**\"],\n allow_empty = True,\n ),\n)\n\nfilegroup(\n name = \"jdk-lib\",\n srcs = glob(\n [\"lib/**\", \"release\"],\n allow_empty = True,\n exclude = [\n \"lib/missioncontrol/**\",\n \"lib/visualvm/**\",\n ],\n ),\n)\n\njava_runtime(\n name = \"jdk\",\n srcs = [\n \":jdk-bin\",\n \":jdk-conf\",\n \":jdk-include\",\n \":jdk-lib\",\n \":jre\",\n ],\n # Provide the 'java` binary explicitly so that the correct path is used by\n # Bazel even when the host platform differs from the execution platform.\n # Exactly one of the two globs will be empty depending on the host platform.\n # When --incompatible_disallow_empty_glob is enabled, each individual empty\n # glob will fail without allow_empty = True, even if the overall result is\n # non-empty.\n java = glob([\"bin/java.exe\", \"bin/java\"], allow_empty = True)[0],\n version = 11,\n)\n", + "sha256": "a8fba686f6eb8ae1d1a9566821dbd5a85a1108b96ad857fdbac5c1e4649fc56f", + "strip_prefix": "jdk-11.0.15+10", + "urls": [ + "https://mirror.bazel.build/github.com/adoptium/temurin11-binaries/releases/download/jdk-11.0.15+10/OpenJDK11U-jdk_ppc64le_linux_hotspot_11.0.15_10.tar.gz", + "https://github.com/adoptium/temurin11-binaries/releases/download/jdk-11.0.15+10/OpenJDK11U-jdk_ppc64le_linux_hotspot_11.0.15_10.tar.gz" + ] + } + }, + "remotejdk11_macos_aarch64": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "rules_java~7.1.0~toolchains~remotejdk11_macos_aarch64", + "build_file_content": "load(\"@rules_java//java:defs.bzl\", \"java_runtime\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\nexports_files([\"WORKSPACE\", \"BUILD.bazel\"])\n\nfilegroup(\n name = \"jre\",\n srcs = glob(\n [\n \"jre/bin/**\",\n \"jre/lib/**\",\n ],\n allow_empty = True,\n # In some configurations, Java browser plugin is considered harmful and\n # common antivirus software blocks access to npjp2.dll interfering with Bazel,\n # so do not include it in JRE on Windows.\n exclude = [\"jre/bin/plugin2/**\"],\n ),\n)\n\nfilegroup(\n name = \"jdk-bin\",\n srcs = glob(\n [\"bin/**\"],\n # The JDK on Windows sometimes contains a directory called\n # \"%systemroot%\", which is not a valid label.\n exclude = [\"**/*%*/**\"],\n ),\n)\n\n# This folder holds security policies.\nfilegroup(\n name = \"jdk-conf\",\n srcs = glob(\n [\"conf/**\"],\n allow_empty = True,\n ),\n)\n\nfilegroup(\n name = \"jdk-include\",\n srcs = glob(\n [\"include/**\"],\n allow_empty = True,\n ),\n)\n\nfilegroup(\n name = \"jdk-lib\",\n srcs = glob(\n [\"lib/**\", \"release\"],\n allow_empty = True,\n exclude = [\n \"lib/missioncontrol/**\",\n \"lib/visualvm/**\",\n ],\n ),\n)\n\njava_runtime(\n name = \"jdk\",\n srcs = [\n \":jdk-bin\",\n \":jdk-conf\",\n \":jdk-include\",\n \":jdk-lib\",\n \":jre\",\n ],\n # Provide the 'java` binary explicitly so that the correct path is used by\n # Bazel even when the host platform differs from the execution platform.\n # Exactly one of the two globs will be empty depending on the host platform.\n # When --incompatible_disallow_empty_glob is enabled, each individual empty\n # glob will fail without allow_empty = True, even if the overall result is\n # non-empty.\n java = glob([\"bin/java.exe\", \"bin/java\"], allow_empty = True)[0],\n version = 11,\n)\n", + "sha256": "7632bc29f8a4b7d492b93f3bc75a7b61630894db85d136456035ab2a24d38885", + "strip_prefix": "zulu11.66.15-ca-jdk11.0.20-macosx_aarch64", + "urls": [ + "https://mirror.bazel.build/cdn.azul.com/zulu/bin/zulu11.66.15-ca-jdk11.0.20-macosx_aarch64.tar.gz", + "https://cdn.azul.com/zulu/bin/zulu11.66.15-ca-jdk11.0.20-macosx_aarch64.tar.gz" + ] + } + }, + "remotejdk21_win_toolchain_config_repo": { + "bzlFile": "@@rules_java~7.1.0//toolchains:remote_java_repository.bzl", + "ruleClassName": "_toolchain_config", + "attributes": { + "name": "rules_java~7.1.0~toolchains~remotejdk21_win_toolchain_config_repo", + "build_file": "\nconfig_setting(\n name = \"prefix_version_setting\",\n values = {\"java_runtime_version\": \"remotejdk_21\"},\n visibility = [\"//visibility:private\"],\n)\nconfig_setting(\n name = \"version_setting\",\n values = {\"java_runtime_version\": \"21\"},\n visibility = [\"//visibility:private\"],\n)\nalias(\n name = \"version_or_prefix_version_setting\",\n actual = select({\n \":version_setting\": \":version_setting\",\n \"//conditions:default\": \":prefix_version_setting\",\n }),\n visibility = [\"//visibility:private\"],\n)\ntoolchain(\n name = \"toolchain\",\n target_compatible_with = [\"@platforms//os:windows\", \"@platforms//cpu:x86_64\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@bazel_tools//tools/jdk:runtime_toolchain_type\",\n toolchain = \"@remotejdk21_win//:jdk\",\n)\ntoolchain(\n name = \"bootstrap_runtime_toolchain\",\n # These constraints are not required for correctness, but prevent fetches of remote JDK for\n # different architectures. As every Java compilation toolchain depends on a bootstrap runtime in\n # the same configuration, this constraint will not result in toolchain resolution failures.\n exec_compatible_with = [\"@platforms//os:windows\", \"@platforms//cpu:x86_64\"],\n target_settings = [\":version_or_prefix_version_setting\"],\n toolchain_type = \"@bazel_tools//tools/jdk:bootstrap_runtime_toolchain_type\",\n toolchain = \"@remotejdk21_win//:jdk\",\n)\n" + } + } + } + } + } + } +} diff --git a/Makefile b/Makefile index 2d0a08f8b6ecf..fc7c20dce25b3 100644 --- a/Makefile +++ b/Makefile @@ -71,7 +71,6 @@ license: --run_under="cd $(CURDIR) && " \ @com_github_apache_skywalking_eyes//cmd/license-eye:license-eye --run_under="cd $(CURDIR) && " -- -c ./.github/licenserc.yml header check - tidy: @echo "go mod tidy" ./tools/check/check-tidy.sh @@ -87,8 +86,12 @@ check-parallel: xargs -0 grep -F -n "t.Parallel()" || \ ! echo "Error: all the go tests should be run in serial." +CLEAN_UT_BINARY := find . -name '*.test.bin'| xargs rm -f + clean: failpoint-disable $(GO) clean -i ./... + rm -rf $(TEST_COVERAGE_DIR) + @$(CLEAN_UT_BINARY) # Split tests for CI to run `make test` in parallel. test: test_part_1 test_part_2 @@ -126,8 +129,6 @@ integrationtest: server_check ddltest: @cd cmd/ddltest && $(GO) test --tags=deadllock,intest -o ../../bin/ddltest -c -CLEAN_UT_BINARY := find . -name '*.test.bin'| xargs rm - ut: tools/bin/ut tools/bin/xprog failpoint-enable tools/bin/ut $(X) || { $(FAILPOINT_DISABLE); exit 1; } @$(FAILPOINT_DISABLE) @@ -136,22 +137,19 @@ ut: tools/bin/ut tools/bin/xprog failpoint-enable gotest_in_verify_ci: tools/bin/xprog tools/bin/ut failpoint-enable @echo "Running gotest_in_verify_ci" @mkdir -p $(TEST_COVERAGE_DIR) - @export TZ='Asia/Shanghai'; \ tools/bin/ut --junitfile "$(TEST_COVERAGE_DIR)/tidb-junit-report.xml" --coverprofile "$(TEST_COVERAGE_DIR)/tidb_cov.unit_test.out" --except unstable.txt || { $(FAILPOINT_DISABLE); exit 1; } @$(FAILPOINT_DISABLE) @$(CLEAN_UT_BINARY) gotest_unstable_in_verify_ci: tools/bin/xprog tools/bin/ut failpoint-enable - @echo "Running gotest_in_verify_ci" + @echo "Running gotest_unstable_in_verify_ci" @mkdir -p $(TEST_COVERAGE_DIR) - @export TZ='Asia/Shanghai'; \ tools/bin/ut --junitfile "$(TEST_COVERAGE_DIR)/tidb-junit-report.xml" --coverprofile "$(TEST_COVERAGE_DIR)/tidb_cov.unit_test.out" --only unstable.txt || { $(FAILPOINT_DISABLE); exit 1; } @$(FAILPOINT_DISABLE) @$(CLEAN_UT_BINARY) race: failpoint-enable @mkdir -p $(TEST_COVERAGE_DIR) - @export TZ='Asia/Shanghai'; \ tools/bin/ut --race --junitfile "$(TEST_COVERAGE_DIR)/tidb-junit-report.xml" --coverprofile "$(TEST_COVERAGE_DIR)/tidb_cov.unit_test" --except unstable.txt || { $(FAILPOINT_DISABLE); exit 1; } @$(FAILPOINT_DISABLE) @$(CLEAN_UT_BINARY) @@ -266,7 +264,8 @@ tools/bin/vfsgendev: tools/bin/gotestsum: GOBIN=$(shell pwd)/tools/bin $(GO) install gotest.tools/gotestsum@v1.8.1 -tools/bin/mockgen: +# mockgen@v0.2.0 is imcompatible with v0.3.0, so install it always. +mockgen: GOBIN=$(shell pwd)/tools/bin $(GO) install go.uber.org/mock/mockgen@v0.3.0 # Usage: @@ -374,20 +373,21 @@ br_compatibility_test_prepare: br_compatibility_test: @cd br && tests/run_compatible.sh run -mock_s3iface: tools/bin/mockgen +mock_s3iface: mockgen tools/bin/mockgen -package mock github.com/aws/aws-sdk-go/service/s3/s3iface S3API > br/pkg/mock/s3iface.go # mock interface for lightning and IMPORT INTO -mock_lightning: tools/bin/mockgen +mock_lightning: mockgen tools/bin/mockgen -package mock github.com/pingcap/tidb/br/pkg/lightning/backend Backend,EngineWriter,TargetInfoGetter,ChunkFlushStatus > br/pkg/mock/backend.go tools/bin/mockgen -package mock github.com/pingcap/tidb/br/pkg/lightning/backend/encode Encoder,EncodingBuilder,Rows,Row > br/pkg/mock/encode.go - tools/bin/mockgen -package mocklocal github.com/pingcap/tidb/br/pkg/lightning/backend/local DiskUsage,TiKVModeSwitcher > br/pkg/mock/mocklocal/local.go + tools/bin/mockgen -package mocklocal github.com/pingcap/tidb/br/pkg/lightning/backend/local DiskUsage,TiKVModeSwitcher,StoreHelper > br/pkg/mock/mocklocal/local.go tools/bin/mockgen -package mock github.com/pingcap/tidb/br/pkg/utils TaskRegister > br/pkg/mock/task_register.go -gen_mock: tools/bin/mockgen - tools/bin/mockgen -package mock github.com/pingcap/tidb/pkg/disttask/framework/scheduler TaskTable,Pool,Scheduler,Extension > pkg/disttask/framework/mock/scheduler_mock.go - tools/bin/mockgen -package mock github.com/pingcap/tidb/pkg/disttask/framework/dispatcher Dispatcher,CleanUpRoutine,TaskManager > pkg/disttask/framework/mock/dispatcher_mock.go - tools/bin/mockgen -package execute github.com/pingcap/tidb/pkg/disttask/framework/scheduler/execute SubtaskExecutor > pkg/disttask/framework/mock/execute/execute_mock.go +gen_mock: mockgen + tools/bin/mockgen -package mock github.com/pingcap/tidb/pkg/disttask/framework/taskexecutor TaskTable,Pool,TaskExecutor,Extension > pkg/disttask/framework/mock/task_executor_mock.go + tools/bin/mockgen -package mock github.com/pingcap/tidb/pkg/disttask/framework/scheduler Scheduler,CleanUpRoutine,TaskManager > pkg/disttask/framework/mock/scheduler_mock.go + tools/bin/mockgen -package mock github.com/pingcap/tidb/pkg/disttask/framework/scheduler Extension > pkg/disttask/framework/scheduler/mock/scheduler_mock.go + tools/bin/mockgen -package execute github.com/pingcap/tidb/pkg/disttask/framework/taskexecutor/execute StepExecutor > pkg/disttask/framework/mock/execute/execute_mock.go tools/bin/mockgen -package mock github.com/pingcap/tidb/pkg/disttask/importinto MiniTaskExecutor > pkg/disttask/importinto/mock/import_mock.go tools/bin/mockgen -package mock github.com/pingcap/tidb/pkg/disttask/framework/planner LogicalPlan,PipelineSpec > pkg/disttask/framework/mock/plan_mock.go tools/bin/mockgen -package mock github.com/pingcap/tidb/pkg/util/sqlexec RestrictedSQLExecutor > pkg/util/sqlexec/mock/restricted_sql_executor_mock.go @@ -497,7 +497,7 @@ bazel_test: failpoint-enable bazel_prepare bazel_coverage_test: failpoint-enable bazel_ci_simple_prepare - bazel $(BAZEL_GLOBAL_CONFIG) --nohome_rc coverage $(BAZEL_CMD_CONFIG) --jobs=35 --build_tests_only --test_keep_going=false \ + bazel $(BAZEL_GLOBAL_CONFIG) --nohome_rc coverage $(BAZEL_CMD_CONFIG) $(BAZEL_INSTRUMENTATION_FILTER) --jobs=35 --build_tests_only --test_keep_going=false \ --@io_bazel_rules_go//go/config:cover_format=go_cover --define gotags=deadlock,intest \ -- //... -//cmd/... -//tests/graceshutdown/... \ -//tests/globalkilltest/... -//tests/readonlytest/... -//br/pkg/task:task_test -//tests/realtikvtest/... @@ -534,89 +534,89 @@ bazel_golangcilinter: -- run $$($(PACKAGE_DIRECTORIES)) --config ./.golangci.yaml bazel_brietest: failpoint-enable bazel_ci_simple_prepare - bazel $(BAZEL_GLOBAL_CONFIG) coverage $(BAZEL_CMD_CONFIG) --test_arg=-with-real-tikv --define gotags=deadlock,intest \ + bazel $(BAZEL_GLOBAL_CONFIG) coverage $(BAZEL_CMD_CONFIG) $(BAZEL_INSTRUMENTATION_FILTER) --test_arg=-with-real-tikv --define gotags=deadlock,intest \ --@io_bazel_rules_go//go/config:cover_format=go_cover \ -- //tests/realtikvtest/brietest/... ./build/jenkins_collect_coverage.sh bazel_pessimistictest: failpoint-enable bazel_ci_simple_prepare - bazel $(BAZEL_GLOBAL_CONFIG) coverage $(BAZEL_CMD_CONFIG) --test_arg=-with-real-tikv --define gotags=deadlock,intest \ + bazel $(BAZEL_GLOBAL_CONFIG) coverage $(BAZEL_CMD_CONFIG) $(BAZEL_INSTRUMENTATION_FILTER) --test_arg=-with-real-tikv --define gotags=deadlock,intest \ --@io_bazel_rules_go//go/config:cover_format=go_cover \ -- //tests/realtikvtest/pessimistictest/... ./build/jenkins_collect_coverage.sh bazel_sessiontest: failpoint-enable bazel_ci_simple_prepare - bazel $(BAZEL_GLOBAL_CONFIG) coverage $(BAZEL_CMD_CONFIG) --test_arg=-with-real-tikv --define gotags=deadlock,intest \ + bazel $(BAZEL_GLOBAL_CONFIG) coverage $(BAZEL_CMD_CONFIG) $(BAZEL_INSTRUMENTATION_FILTER) --test_arg=-with-real-tikv --define gotags=deadlock,intest \ --@io_bazel_rules_go//go/config:cover_format=go_cover \ -- //tests/realtikvtest/sessiontest/... ./build/jenkins_collect_coverage.sh bazel_statisticstest: failpoint-enable bazel_ci_simple_prepare - bazel $(BAZEL_GLOBAL_CONFIG) coverage $(BAZEL_CMD_CONFIG) --test_arg=-with-real-tikv --define gotags=deadlock,intest \ + bazel $(BAZEL_GLOBAL_CONFIG) coverage $(BAZEL_CMD_CONFIG) $(BAZEL_INSTRUMENTATION_FILTER) --test_arg=-with-real-tikv --define gotags=deadlock,intest \ --@io_bazel_rules_go//go/config:cover_format=go_cover \ -- //tests/realtikvtest/statisticstest/... ./build/jenkins_collect_coverage.sh bazel_txntest: failpoint-enable bazel_ci_simple_prepare - bazel $(BAZEL_GLOBAL_CONFIG) coverage $(BAZEL_CMD_CONFIG) --test_arg=-with-real-tikv --define gotags=deadlock,intest \ + bazel $(BAZEL_GLOBAL_CONFIG) coverage $(BAZEL_CMD_CONFIG) $(BAZEL_INSTRUMENTATION_FILTER) --test_arg=-with-real-tikv --define gotags=deadlock,intest \ --@io_bazel_rules_go//go/config:cover_format=go_cover \ -- //tests/realtikvtest/txntest/... ./build/jenkins_collect_coverage.sh bazel_addindextest: failpoint-enable bazel_ci_simple_prepare - bazel $(BAZEL_GLOBAL_CONFIG) coverage $(BAZEL_CMD_CONFIG) --test_arg=-with-real-tikv --define gotags=deadlock,intest \ + bazel $(BAZEL_GLOBAL_CONFIG) coverage $(BAZEL_CMD_CONFIG) $(BAZEL_INSTRUMENTATION_FILTER) --test_arg=-with-real-tikv --define gotags=deadlock,intest \ --@io_bazel_rules_go//go/config:cover_format=go_cover \ -- //tests/realtikvtest/addindextest/... ./build/jenkins_collect_coverage.sh bazel_addindextest1: failpoint-enable bazel_ci_simple_prepare - bazel $(BAZEL_GLOBAL_CONFIG) coverage $(BAZEL_CMD_CONFIG) --test_arg=-with-real-tikv --define gotags=deadlock,intest \ + bazel $(BAZEL_GLOBAL_CONFIG) coverage $(BAZEL_CMD_CONFIG) $(BAZEL_INSTRUMENTATION_FILTER) --test_arg=-with-real-tikv --define gotags=deadlock,intest \ --@io_bazel_rules_go//go/config:cover_format=go_cover \ -- //tests/realtikvtest/addindextest1/... ./build/jenkins_collect_coverage.sh bazel_addindextest2: failpoint-enable bazel_ci_simple_prepare - bazel $(BAZEL_GLOBAL_CONFIG) coverage $(BAZEL_CMD_CONFIG) --test_arg=-with-real-tikv --define gotags=deadlock,intest \ + bazel $(BAZEL_GLOBAL_CONFIG) coverage $(BAZEL_CMD_CONFIG) $(BAZEL_INSTRUMENTATION_FILTER) --test_arg=-with-real-tikv --define gotags=deadlock,intest \ --@io_bazel_rules_go//go/config:cover_format=go_cover \ -- //tests/realtikvtest/addindextest2/... ./build/jenkins_collect_coverage.sh bazel_addindextest3: failpoint-enable bazel_ci_simple_prepare - bazel $(BAZEL_GLOBAL_CONFIG) coverage $(BAZEL_CMD_CONFIG) --test_arg=-with-real-tikv --define gotags=deadlock,intest \ + bazel $(BAZEL_GLOBAL_CONFIG) coverage $(BAZEL_CMD_CONFIG) $(BAZEL_INSTRUMENTATION_FILTER) --test_arg=-with-real-tikv --define gotags=deadlock,intest \ --@io_bazel_rules_go//go/config:cover_format=go_cover \ -- //tests/realtikvtest/addindextest3/... ./build/jenkins_collect_coverage.sh bazel_addindextest4: failpoint-enable bazel_ci_simple_prepare - bazel $(BAZEL_GLOBAL_CONFIG) coverage $(BAZEL_CMD_CONFIG) --test_arg=-with-real-tikv --define gotags=deadlock,intest \ + bazel $(BAZEL_GLOBAL_CONFIG) coverage $(BAZEL_CMD_CONFIG) $(BAZEL_INSTRUMENTATION_FILTER) --test_arg=-with-real-tikv --define gotags=deadlock,intest \ --@io_bazel_rules_go//go/config:cover_format=go_cover \ -- //tests/realtikvtest/addindextest4/... ./build/jenkins_collect_coverage.sh # on timeout, bazel won't print log sometimes, so we use --test_output=all to print log always bazel_importintotest: failpoint-enable bazel_ci_simple_prepare - bazel $(BAZEL_GLOBAL_CONFIG) coverage $(BAZEL_CMD_CONFIG) --test_output=all --test_arg=-with-real-tikv --define gotags=deadlock,intest \ + bazel $(BAZEL_GLOBAL_CONFIG) coverage $(BAZEL_CMD_CONFIG) $(BAZEL_INSTRUMENTATION_FILTER) --test_output=all --test_arg=-with-real-tikv --define gotags=deadlock,intest \ --@io_bazel_rules_go//go/config:cover_format=go_cover \ -- //tests/realtikvtest/importintotest/... ./build/jenkins_collect_coverage.sh # on timeout, bazel won't print log sometimes, so we use --test_output=all to print log always bazel_importintotest2: failpoint-enable bazel_ci_simple_prepare - bazel $(BAZEL_GLOBAL_CONFIG) coverage $(BAZEL_CMD_CONFIG) --test_output=all --test_arg=-with-real-tikv --define gotags=deadlock,intest \ + bazel $(BAZEL_GLOBAL_CONFIG) coverage $(BAZEL_CMD_CONFIG) $(BAZEL_INSTRUMENTATION_FILTER) --test_output=all --test_arg=-with-real-tikv --define gotags=deadlock,intest \ --@io_bazel_rules_go//go/config:cover_format=go_cover \ -- //tests/realtikvtest/importintotest2/... ./build/jenkins_collect_coverage.sh # on timeout, bazel won't print log sometimes, so we use --test_output=all to print log always bazel_importintotest3: failpoint-enable bazel_ci_simple_prepare - bazel $(BAZEL_GLOBAL_CONFIG) coverage $(BAZEL_CMD_CONFIG) --test_output=all --test_arg=-with-real-tikv --define gotags=deadlock,intest \ + bazel $(BAZEL_GLOBAL_CONFIG) coverage $(BAZEL_CMD_CONFIG) $(BAZEL_INSTRUMENTATION_FILTER) --test_output=all --test_arg=-with-real-tikv --define gotags=deadlock,intest \ --@io_bazel_rules_go//go/config:cover_format=go_cover \ -- //tests/realtikvtest/importintotest3/... ./build/jenkins_collect_coverage.sh # on timeout, bazel won't print log sometimes, so we use --test_output=all to print log always bazel_importintotest4: failpoint-enable bazel_ci_simple_prepare - bazel $(BAZEL_GLOBAL_CONFIG) coverage $(BAZEL_CMD_CONFIG) --test_output=all --test_arg=-with-real-tikv --define gotags=deadlock,intest \ + bazel $(BAZEL_GLOBAL_CONFIG) coverage $(BAZEL_CMD_CONFIG) $(BAZEL_INSTRUMENTATION_FILTER) --test_output=all --test_arg=-with-real-tikv --define gotags=deadlock,intest \ --@io_bazel_rules_go//go/config:cover_format=go_cover \ -- //tests/realtikvtest/importintotest4/... ./build/jenkins_collect_coverage.sh diff --git a/Makefile.common b/Makefile.common index a2ba71009105f..b540debd422e0 100644 --- a/Makefile.common +++ b/Makefile.common @@ -130,3 +130,4 @@ ifneq ("$(CI)", "") BAZEL_CMD_CONFIG := --config=ci --repository_cache=/home/jenkins/.tidb/tmp BAZEL_SYNC_CONFIG := --repository_cache=/home/jenkins/.tidb/tmp endif +BAZEL_INSTRUMENTATION_FILTER := --instrument_test_targets --instrumentation_filter=//pkg/...,//br/...,//dumpling/... diff --git a/OWNERS b/OWNERS index f1fa925b86f65..167bb74572080 100644 --- a/OWNERS +++ b/OWNERS @@ -31,7 +31,9 @@ approvers: - dveeden - Ehco1996 - ekexium + - elsa0520 - eurekaka + - fixdb - francis0407 - fzhedu - glorv @@ -102,6 +104,7 @@ approvers: - you06 - youjiali1995 - YuJuncen + - ywqzzy - zanmato1984 - zhaoxinyu - zhouqiang-cl @@ -118,9 +121,7 @@ reviewers: - charleszheng44 - ChenPeng2013 - dhysum - - elsa0520 - fengou1 - - fixdb - fzzf678 - iamxy - jiyfhust @@ -129,6 +130,7 @@ reviewers: - lamxTyler - LittleFall - longfangsong + - lyzx2001 - mengxin9014 - MoCuishle28 - mornyx @@ -144,7 +146,6 @@ reviewers: - TonsnakeLin - tsthght - TszKitLo40 - - ywqzzy - zhangjinpeng1987 - zhongzc - zhuo-zhi diff --git a/WORKSPACE b/WORKSPACE index f0eaf4460c355..df1b84ba5f5a6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -16,23 +16,23 @@ versions.check(minimum_bazel_version = "6.0.0") http_archive( name = "io_bazel_rules_go", - sha256 = "d6ab6b57e48c09523e93050f13698f708428cfd5e619252e369d377af6597707", + sha256 = "de7974538c31f76658e0d333086c69efdf6679dbc6a466ac29e65434bf47076d", urls = [ - "http://bazel-cache.pingcap.net:8080/bazelbuild/rules_go/releases/download/v0.43.0/rules_go-v0.43.0.zip", - "http://ats.apps.svc/bazelbuild/rules_go/releases/download/v0.43.0/rules_go-v0.43.0.zip", - "https://github.com/bazelbuild/rules_go/releases/download/v0.43.0/rules_go-v0.43.0.zip", - "https://mirror.bazel.build/github.com/bazelbuild/rules_go/releases/download/v0.43.0/rules_go-v0.43.0.zip", + "http://bazel-cache.pingcap.net:8080/bazelbuild/rules_go/releases/download/v0.45.0/rules_go-v0.45.0.zip", + "http://ats.apps.svc/bazelbuild/rules_go/releases/download/v0.45.0/rules_go-v0.45.0.zip", + "https://github.com/bazelbuild/rules_go/releases/download/v0.45.0/rules_go-v0.45.0.zip", + "https://mirror.bazel.build/github.com/bazelbuild/rules_go/releases/download/v0.45.0/rules_go-v0.45.0.zip", ], ) http_archive( name = "bazel_gazelle", - sha256 = "b7387f72efb59f876e4daae42f1d3912d0d45563eac7cb23d1de0b094ab588cf", + sha256 = "32938bda16e6700063035479063d9d24c60eda8d79fd4739563f50d331cb3209", urls = [ - "http://bazel-cache.pingcap.net:8080/bazelbuild/bazel-gazelle/releases/download/v0.34.0/bazel-gazelle-v0.34.0.tar.gz", - "https://mirror.bazel.build/github.com/bazelbuild/bazel-gazelle/releases/download/v0.34.0/bazel-gazelle-v0.34.0.tar.gz", - "https://github.com/bazelbuild/bazel-gazelle/releases/download/v0.34.0/bazel-gazelle-v0.34.0.tar.gz", - "http://ats.apps.svc/bazelbuild/bazel-gazelle/releases/download/v0.34.0/bazel-gazelle-v0.34.0.tar.gz", + "http://bazel-cache.pingcap.net:8080/bazelbuild/bazel-gazelle/releases/download/v0.35.0/bazel-gazelle-v0.35.0.tar.gz", + "https://mirror.bazel.build/github.com/bazelbuild/bazel-gazelle/releases/download/v0.35.0/bazel-gazelle-v0.35.0.tar.gz", + "https://github.com/bazelbuild/bazel-gazelle/releases/download/v0.35.0/bazel-gazelle-v0.35.0.tar.gz", + "http://ats.apps.svc/bazelbuild/bazel-gazelle/releases/download/v0.35.0/bazel-gazelle-v0.35.0.tar.gz", ], ) @@ -64,7 +64,7 @@ go_download_sdk( "https://mirrors.aliyun.com/golang/{}", "https://dl.google.com/go/{}", ], - version = "1.21.4", + version = "1.21.6", ) go_register_toolchains( diff --git a/WORKSPACE.patchgo b/WORKSPACE.patchgo index cd82ce99ab0c9..ddb6b7a9261fa 100644 --- a/WORKSPACE.patchgo +++ b/WORKSPACE.patchgo @@ -16,12 +16,12 @@ versions.check(minimum_bazel_version = "6.0.0") http_archive( name = "io_bazel_rules_go", - sha256 = "278b7ff5a826f3dc10f04feaf0b70d48b68748ccd512d7f98bf442077f043fe3", + sha256 = "c8035e8ae248b56040a65ad3f0b7434712e2037e5dfdcebfe97576e620422709", urls = [ - "http://bazel-cache.pingcap.net:8080/bazelbuild/rules_go/releases/download/v0.41.0/rules_go-v0.41.0.zip", - "http://ats.apps.svc/bazelbuild/rules_go/releases/download/v0.41.0/rules_go-v0.41.0.zip", - "https://mirror.bazel.build/github.com/bazelbuild/rules_go/releases/download/v0.41.0/rules_go-v0.41.0.zip", - "https://github.com/bazelbuild/rules_go/releases/download/v0.41.0/rules_go-v0.41.0.zip", + "http://bazel-cache.pingcap.net:8080/bazelbuild/rules_go/releases/download/v0.44.0/rules_go-v0.44.0.zip", + "http://ats.apps.svc/bazelbuild/rules_go/releases/download/v0.44.0/rules_go-v0.44.0.zip", + "https://github.com/bazelbuild/rules_go/releases/download/v0.44.0/rules_go-v0.44.0.zip", + "https://mirror.bazel.build/github.com/bazelbuild/rules_go/releases/download/v0.44.0/rules_go-v0.44.0.zip", ], ) diff --git a/br/cmd/br/BUILD.bazel b/br/cmd/br/BUILD.bazel index 0115777f2046a..d67a3722dd118 100644 --- a/br/cmd/br/BUILD.bazel +++ b/br/cmd/br/BUILD.bazel @@ -36,6 +36,7 @@ go_library( "//pkg/session", "//pkg/util", "//pkg/util/logutil", + "//pkg/util/memory", "//pkg/util/metricsutil", "@com_github_gogo_protobuf//proto", "@com_github_pingcap_errors//:errors", diff --git a/br/cmd/br/backup.go b/br/cmd/br/backup.go index 5bf64a455c8a9..86ddbe78b793d 100644 --- a/br/cmd/br/backup.go +++ b/br/cmd/br/backup.go @@ -45,10 +45,8 @@ func runBackupCommand(command *cobra.Command, cmdName string) error { return nil } - if cfg.IgnoreStats { - // Do not run stat worker in BR. - session.DisableStats4Test() - } + // No need to cache the coproceesor result + config.GetGlobalConfig().TiKVClient.CoprCache.CapacityMB = 0 if err := task.RunBackup(ctx, tidbGlue, cmdName, &cfg); err != nil { log.Error("failed to backup", zap.Error(err)) @@ -110,6 +108,8 @@ func NewBackupCommand() *cobra.Command { build.LogInfo(build.BR) utils.LogEnvVariables() task.LogArguments(c) + // Do not run stat worker in BR. + session.DisableStats4Test() // Do not run ddl worker in BR. config.GetGlobalConfig().Instance.TiDBEnableDDL.Store(false) diff --git a/br/cmd/br/cmd.go b/br/cmd/br/cmd.go index 66d8e989f0a37..07b56b5129dbd 100644 --- a/br/cmd/br/cmd.go +++ b/br/cmd/br/cmd.go @@ -22,6 +22,7 @@ import ( "github.com/pingcap/tidb/pkg/config" tidbutils "github.com/pingcap/tidb/pkg/util" "github.com/pingcap/tidb/pkg/util/logutil" + "github.com/pingcap/tidb/pkg/util/memory" "github.com/spf13/cobra" ) @@ -36,6 +37,7 @@ var ( "*.*", fmt.Sprintf("!%s.*", utils.TemporaryDBName("*")), "!mysql.*", + "mysql.bind_info", "mysql.user", "mysql.db", "mysql.tables_priv", @@ -159,6 +161,7 @@ func Init(cmd *cobra.Command) (err error) { return } log.ReplaceGlobals(lg, p) + memory.InitMemoryHook() redactLog, e := cmd.Flags().GetBool(FlagRedactLog) if e != nil { diff --git a/br/cmd/br/debug.go b/br/cmd/br/debug.go index abd723f66f9d7..df9795fd32482 100644 --- a/br/cmd/br/debug.go +++ b/br/cmd/br/debug.go @@ -80,7 +80,7 @@ func newCheckSumCommand() *cobra.Command { } reader := metautil.NewMetaReader(backupMeta, s, &cfg.CipherInfo) - dbs, err := utils.LoadBackupTables(ctx, reader) + dbs, err := metautil.LoadBackupTables(ctx, reader) if err != nil { return errors.Trace(err) } @@ -173,7 +173,7 @@ func newBackupMetaValidateCommand() *cobra.Command { return errors.Trace(err) } reader := metautil.NewMetaReader(backupMeta, s, &cfg.CipherInfo) - dbs, err := utils.LoadBackupTables(ctx, reader) + dbs, err := metautil.LoadBackupTables(ctx, reader) if err != nil { log.Error("load tables failed", zap.Error(err)) return errors.Trace(err) diff --git a/br/cmd/br/fips.go b/br/cmd/br/fips.go index 6d5e181a04022..228261f45998f 100644 --- a/br/cmd/br/fips.go +++ b/br/cmd/br/fips.go @@ -17,12 +17,4 @@ package main -import ( - _ "crypto/tls/fipsonly" - - "github.com/pingcap/tidb/br/pkg/version/build" -) - -func init() { - build.ReleaseVersion += "-fips" -} +import _ "crypto/tls/fipsonly" diff --git a/br/cmd/br/restore.go b/br/cmd/br/restore.go index 7e8cb6b8d9324..5a6c849890676 100644 --- a/br/cmd/br/restore.go +++ b/br/cmd/br/restore.go @@ -14,6 +14,7 @@ import ( "github.com/pingcap/tidb/br/pkg/trace" "github.com/pingcap/tidb/br/pkg/utils" "github.com/pingcap/tidb/br/pkg/version/build" + "github.com/pingcap/tidb/pkg/config" "github.com/pingcap/tidb/pkg/session" "github.com/pingcap/tidb/pkg/util/metricsutil" "github.com/spf13/cobra" @@ -38,6 +39,9 @@ func runRestoreCommand(command *cobra.Command, cmdName string) error { } } + // have to skip grant table, in order to NotifyUpdatePrivilege in binary mode + config.GetGlobalConfig().Security.SkipGrantTable = true + ctx := GetDefaultContext() if cfg.EnableOpenTracing { var store *appdash.MemoryStore @@ -60,6 +64,9 @@ func runRestoreCommand(command *cobra.Command, cmdName string) error { return nil } + // No need to cache the coproceesor result + config.GetGlobalConfig().TiKVClient.CoprCache.CapacityMB = 0 + if err := task.RunRestore(GetDefaultContext(), tidbGlue, cmdName, &cfg); err != nil { log.Error("failed to restore", zap.Error(err)) printWorkaroundOnFullRestoreError(command, err) @@ -81,7 +88,7 @@ func printWorkaroundOnFullRestoreError(command *cobra.Command, err error) { fmt.Println("# you can drop existing databases and tables and start restore again") case errors.ErrorEqual(err, berrors.ErrRestoreIncompatibleSys): fmt.Println("# the target cluster is not compatible with the backup data,") - fmt.Println("# you can remove 'with-sys-table' flag to skip restoring system tables") + fmt.Println("# you can use '--with-sys-table=false' to skip restoring system tables") } fmt.Println("#######################################################################") } diff --git a/br/cmd/tidb-lightning-ctl/BUILD.bazel b/br/cmd/tidb-lightning-ctl/BUILD.bazel index df997a8738d54..c626f436ee98e 100644 --- a/br/cmd/tidb-lightning-ctl/BUILD.bazel +++ b/br/cmd/tidb-lightning-ctl/BUILD.bazel @@ -15,6 +15,8 @@ go_library( "//br/pkg/lightning/importer", "//br/pkg/lightning/tikv", "@com_github_pingcap_errors//:errors", + "@com_github_pingcap_kvproto//pkg/metapb", + "@com_github_tikv_pd_client//http", ], ) diff --git a/br/cmd/tidb-lightning-ctl/fips.go b/br/cmd/tidb-lightning-ctl/fips.go index 6d5e181a04022..228261f45998f 100644 --- a/br/cmd/tidb-lightning-ctl/fips.go +++ b/br/cmd/tidb-lightning-ctl/fips.go @@ -17,12 +17,4 @@ package main -import ( - _ "crypto/tls/fipsonly" - - "github.com/pingcap/tidb/br/pkg/version/build" -) - -func init() { - build.ReleaseVersion += "-fips" -} +import _ "crypto/tls/fipsonly" diff --git a/br/cmd/tidb-lightning-ctl/main.go b/br/cmd/tidb-lightning-ctl/main.go index fd36380ff1252..166a9eb2c7b81 100644 --- a/br/cmd/tidb-lightning-ctl/main.go +++ b/br/cmd/tidb-lightning-ctl/main.go @@ -20,8 +20,10 @@ import ( "fmt" "os" "path/filepath" + "strings" "github.com/pingcap/errors" + "github.com/pingcap/kvproto/pkg/metapb" "github.com/pingcap/tidb/br/pkg/lightning" "github.com/pingcap/tidb/br/pkg/lightning/backend" "github.com/pingcap/tidb/br/pkg/lightning/backend/local" @@ -30,6 +32,7 @@ import ( "github.com/pingcap/tidb/br/pkg/lightning/config" "github.com/pingcap/tidb/br/pkg/lightning/importer" "github.com/pingcap/tidb/br/pkg/lightning/tikv" + pdhttp "github.com/tikv/pd/client/http" ) func main() { @@ -92,14 +95,24 @@ func run() error { return err } + var opts []pdhttp.ClientOption + if tls != nil { + opts = append(opts, pdhttp.WithTLSConfig(tls.TLSConfig())) + } + cli := pdhttp.NewClient( + "lightning-ctl", + strings.Split(cfg.TiDB.PdAddr, ","), + opts...) + defer cli.Close() + if *compact { - return errors.Trace(compactCluster(ctx, cfg, tls)) + return errors.Trace(compactCluster(ctx, cli, tls)) } if *flagFetchMode { - return errors.Trace(fetchMode(ctx, cfg, tls)) + return errors.Trace(fetchMode(ctx, cli, tls)) } if len(*mode) != 0 { - return errors.Trace(lightning.SwitchMode(ctx, cfg, tls, *mode)) + return errors.Trace(lightning.SwitchMode(ctx, cli, tls, *mode)) } if len(*cpRemove) != 0 { @@ -122,23 +135,23 @@ func run() error { return nil } -func compactCluster(ctx context.Context, cfg *config.Config, tls *common.TLS) error { +func compactCluster(ctx context.Context, cli pdhttp.Client, tls *common.TLS) error { return tikv.ForAllStores( ctx, - tls.WithHost(cfg.TiDB.PdAddr), - tikv.StoreStateDisconnected, - func(c context.Context, store *tikv.Store) error { + cli, + metapb.StoreState_Offline, + func(c context.Context, store *pdhttp.MetaStore) error { return tikv.Compact(c, tls, store.Address, importer.FullLevelCompact, "") }, ) } -func fetchMode(ctx context.Context, cfg *config.Config, tls *common.TLS) error { +func fetchMode(ctx context.Context, cli pdhttp.Client, tls *common.TLS) error { return tikv.ForAllStores( ctx, - tls.WithHost(cfg.TiDB.PdAddr), - tikv.StoreStateDisconnected, - func(c context.Context, store *tikv.Store) error { + cli, + metapb.StoreState_Offline, + func(c context.Context, store *pdhttp.MetaStore) error { mode, err := tikv.FetchMode(c, tls, store.Address) if err != nil { fmt.Fprintf(os.Stderr, "%-30s | Error: %v\n", store.Address, err) diff --git a/br/cmd/tidb-lightning/BUILD.bazel b/br/cmd/tidb-lightning/BUILD.bazel index 01041f562861c..64e92eaede0ce 100644 --- a/br/cmd/tidb-lightning/BUILD.bazel +++ b/br/cmd/tidb-lightning/BUILD.bazel @@ -11,6 +11,7 @@ go_library( "//br/pkg/lightning/config", "//br/pkg/lightning/log", "//br/pkg/lightning/web", + "//pkg/util/memory", "@org_uber_go_zap//:zap", ], ) diff --git a/br/cmd/tidb-lightning/fips.go b/br/cmd/tidb-lightning/fips.go index 6d5e181a04022..228261f45998f 100644 --- a/br/cmd/tidb-lightning/fips.go +++ b/br/cmd/tidb-lightning/fips.go @@ -17,12 +17,4 @@ package main -import ( - _ "crypto/tls/fipsonly" - - "github.com/pingcap/tidb/br/pkg/version/build" -) - -func init() { - build.ReleaseVersion += "-fips" -} +import _ "crypto/tls/fipsonly" diff --git a/br/cmd/tidb-lightning/main.go b/br/cmd/tidb-lightning/main.go index 079182ce0863e..0afefe67ac228 100644 --- a/br/cmd/tidb-lightning/main.go +++ b/br/cmd/tidb-lightning/main.go @@ -27,6 +27,7 @@ import ( "github.com/pingcap/tidb/br/pkg/lightning/config" "github.com/pingcap/tidb/br/pkg/lightning/log" "github.com/pingcap/tidb/br/pkg/lightning/web" + "github.com/pingcap/tidb/pkg/util/memory" "go.uber.org/zap" ) @@ -38,6 +39,7 @@ func main() { } app := lightning.New(globalCfg) + memory.InitMemoryHook() sc := make(chan os.Signal, 1) signal.Notify(sc, diff --git a/br/pkg/aws/ebs.go b/br/pkg/aws/ebs.go index 2e0cfa36f6e65..18f4f5b484a1b 100644 --- a/br/pkg/aws/ebs.go +++ b/br/pkg/aws/ebs.go @@ -550,7 +550,7 @@ func fetchTargetSnapshots(meta *config.EBSBasedBRMeta, specifiedAZ string) map[s // CreateVolumes create volumes from snapshots // if err happens in the middle, return half-done result // returned map: store id -> old volume id -> new volume id -func (e *EC2Session) CreateVolumes(meta *config.EBSBasedBRMeta, volumeType string, iops, throughput int64, targetAZ string) (map[string]string, error) { +func (e *EC2Session) CreateVolumes(meta *config.EBSBasedBRMeta, volumeType string, iops, throughput int64, encrypted bool, targetAZ string) (map[string]string, error) { template := ec2.CreateVolumeInput{ VolumeType: &volumeType, } @@ -560,6 +560,7 @@ func (e *EC2Session) CreateVolumes(meta *config.EBSBasedBRMeta, volumeType strin if throughput > 0 { template.SetThroughput(throughput) } + template.Encrypted = &encrypted newVolumeIDMap := make(map[string]string) var mutex sync.Mutex diff --git a/br/pkg/backup/BUILD.bazel b/br/pkg/backup/BUILD.bazel index 3693456d0d509..470aaecb7b06a 100644 --- a/br/pkg/backup/BUILD.bazel +++ b/br/pkg/backup/BUILD.bazel @@ -70,7 +70,7 @@ go_test( embed = [":backup"], flaky = True, race = "on", - shard_count = 9, + shard_count = 10, deps = [ "//br/pkg/conn", "//br/pkg/gluetidb", @@ -89,6 +89,7 @@ go_test( "//pkg/util/codec", "//pkg/util/table-filter", "@com_github_golang_protobuf//proto", + "@com_github_pingcap_failpoint//:failpoint", "@com_github_pingcap_kvproto//pkg/brpb", "@com_github_pingcap_kvproto//pkg/encryptionpb", "@com_github_pingcap_kvproto//pkg/errorpb", diff --git a/br/pkg/backup/client.go b/br/pkg/backup/client.go index 1721fab2c45ba..9e6af11b9d326 100644 --- a/br/pkg/backup/client.go +++ b/br/pkg/backup/client.go @@ -1011,23 +1011,74 @@ func (bc *Client) BackupRange( return nil } -func (bc *Client) findTargetPeer(ctx context.Context, key []byte, isRawKv bool, targetStoreIds map[uint64]struct{}) (*metapb.Peer, error) { +func (bc *Client) FindTargetPeer(ctx context.Context, key []byte, isRawKv bool, targetStoreIds map[uint64]struct{}) (*metapb.Peer, error) { // Keys are saved in encoded format in TiKV, so the key must be encoded // in order to find the correct region. + var leader *metapb.Peer key = codec.EncodeBytesExt([]byte{}, key, isRawKv) - for i := 0; i < 5; i++ { - // better backoff. + state := utils.InitialRetryState(60, 100*time.Millisecond, 2*time.Second) + failpoint.Inject("retry-state-on-find-target-peer", func(v failpoint.Value) { + logutil.CL(ctx).Info("reset state for FindTargetPeer") + state = utils.InitialRetryState(v.(int), 100*time.Millisecond, 100*time.Millisecond) + }) + err := utils.WithRetry(ctx, func() error { region, err := bc.mgr.GetPDClient().GetRegion(ctx, key) + failpoint.Inject("return-region-on-find-target-peer", func(v failpoint.Value) { + switch v.(string) { + case "nil": + { + region = nil + } + case "hasLeader": + { + region = &pd.Region{ + Leader: &metapb.Peer{ + Id: 42, + }, + } + } + case "hasPeer": + { + region = &pd.Region{ + Meta: &metapb.Region{ + Peers: []*metapb.Peer{ + { + Id: 43, + StoreId: 42, + }, + }, + }, + } + } + + case "noLeader": + { + region = &pd.Region{ + Leader: nil, + } + } + case "noPeer": + { + { + region = &pd.Region{ + Meta: &metapb.Region{ + Peers: nil, + }, + } + } + } + } + }) if err != nil || region == nil { logutil.CL(ctx).Error("find region failed", zap.Error(err), zap.Reflect("region", region)) - time.Sleep(time.Millisecond * time.Duration(100*i)) - continue + return errors.Annotate(berrors.ErrPDLeaderNotFound, "cannot find region from pd client") } if len(targetStoreIds) == 0 { if region.Leader != nil { logutil.CL(ctx).Info("find leader", zap.Reflect("Leader", region.Leader), logutil.Key("key", key)) - return region.Leader, nil + leader = region.Leader + return nil } } else { candidates := make([]*metapb.Peer, 0, len(region.Meta.Peers)) @@ -1040,19 +1091,18 @@ func (bc *Client) findTargetPeer(ctx context.Context, key []byte, isRawKv bool, peer := candidates[rand.Intn(len(candidates))] logutil.CL(ctx).Info("find target peer for backup", zap.Reflect("Peer", peer), logutil.Key("key", key)) - return peer, nil + leader = peer + return nil } } - - logutil.CL(ctx).Warn("fail to find a target peer", logutil.Key("key", key)) - time.Sleep(time.Millisecond * time.Duration(1000*i)) - continue - } - logutil.CL(ctx).Error("can not find a valid target peer", logutil.Key("key", key)) - if len(targetStoreIds) == 0 { - return nil, errors.Annotatef(berrors.ErrBackupNoLeader, "can not find a valid leader for key %s", key) + return errors.Annotate(berrors.ErrPDLeaderNotFound, "cannot find leader or candidate from pd client") + }, &state) + if err != nil { + logutil.CL(ctx).Error("can not find a valid target peer after retry", logutil.Key("key", key)) + return nil, err } - return nil, errors.Errorf("can not find a valid target peer for key %s", key) + // leader cannot be nil if err is nil + return leader, nil } func (bc *Client) fineGrainedBackup( @@ -1185,17 +1235,18 @@ func OnBackupResponse( backupTS uint64, lockResolver *txnlock.LockResolver, resp *backuppb.BackupResponse, + errContext *utils.ErrorContext, ) (*backuppb.BackupResponse, int, error) { log.Debug("OnBackupResponse", zap.Reflect("resp", resp)) if resp.Error == nil { return resp, 0, nil } backoffMs := 0 - switch v := resp.Error.Detail.(type) { + + err := resp.Error + switch v := err.Detail.(type) { case *backuppb.Error_KvError: if lockErr := v.KvError.Locked; lockErr != nil { - // Try to resolve lock. - log.Warn("backup occur kv error", zap.Reflect("error", v)) msBeforeExpired, err1 := lockResolver.ResolveLocks( bo, backupTS, []*txnlock.Lock{txnlock.NewLock(lockErr)}) if err1 != nil { @@ -1206,44 +1257,16 @@ func OnBackupResponse( } return nil, backoffMs, nil } - // Backup should not meet error other than KeyLocked. - log.Error("unexpect kv error", zap.Reflect("KvError", v.KvError)) - return nil, backoffMs, errors.Annotatef(berrors.ErrKVUnknown, "storeID: %d OnBackupResponse error %v", storeID, v) - - case *backuppb.Error_RegionError: - regionErr := v.RegionError - // Ignore following errors. - if !(regionErr.EpochNotMatch != nil || - regionErr.NotLeader != nil || - regionErr.RegionNotFound != nil || - regionErr.ServerIsBusy != nil || - regionErr.StaleCommand != nil || - regionErr.StoreNotMatch != nil || - regionErr.ReadIndexNotReady != nil || - regionErr.ProposalInMergingMode != nil) { - log.Error("unexpect region error", zap.Reflect("RegionError", regionErr)) - return nil, backoffMs, errors.Annotatef(berrors.ErrKVUnknown, "storeID: %d OnBackupResponse error %v", storeID, v) - } - log.Warn("backup occur region error", - zap.Reflect("RegionError", regionErr), - zap.Uint64("storeID", storeID)) - // TODO: a better backoff. - backoffMs = 1000 /* 1s */ - return nil, backoffMs, nil - case *backuppb.Error_ClusterIdError: - log.Error("backup occur cluster ID error", zap.Reflect("error", v), zap.Uint64("storeID", storeID)) - return nil, 0, errors.Annotatef(berrors.ErrKVClusterIDMismatch, "%v on storeID: %d", resp.Error, storeID) default: - // UNSAFE! TODO: use meaningful error code instead of unstructured message to find failed to write error. - if utils.MessageIsRetryableStorageError(resp.GetError().GetMsg()) { - log.Warn("backup occur storage error", zap.String("error", resp.GetError().GetMsg())) - // back off 3000ms, for S3 is 99.99% available (i.e. the max outage time would less than 52.56mins per year), - // this time would be probably enough for s3 to resume. + res := errContext.HandleError(resp.Error, storeID) + switch res.Strategy { + case utils.GiveUpStrategy: + return nil, 0, errors.Annotatef(berrors.ErrKVUnknown, "storeID: %d OnBackupResponse error %s", storeID, res.Reason) + case utils.RetryStrategy: return nil, 3000, nil } - log.Error("backup occur unknown error", zap.String("error", resp.Error.GetMsg()), zap.Uint64("storeID", storeID)) - return nil, 0, errors.Annotatef(berrors.ErrKVUnknown, "%v on storeID: %d", resp.Error, storeID) } + return nil, 3000, errors.Annotatef(berrors.ErrKVUnknown, "unreachable") } func (bc *Client) handleFineGrained( @@ -1253,7 +1276,7 @@ func (bc *Client) handleFineGrained( targetStoreIds map[uint64]struct{}, respCh chan<- *backuppb.BackupResponse, ) (int, error) { - targetPeer, pderr := bc.findTargetPeer(ctx, req.StartKey, req.IsRawKv, targetStoreIds) + targetPeer, pderr := bc.FindTargetPeer(ctx, req.StartKey, req.IsRawKv, targetStoreIds) if pderr != nil { return 0, errors.Trace(pderr) } @@ -1273,12 +1296,13 @@ func (bc *Client) handleFineGrained( } hasProgress := false backoffMill := 0 + errContext := utils.NewErrorContext("handleFineGrainedBackup", 10) err = SendBackup( ctx, storeID, client, req, // Handle responses with the same backoffer. func(resp *backuppb.BackupResponse) error { response, shouldBackoff, err1 := - OnBackupResponse(storeID, bo, req.EndVersion, lockResolver, resp) + OnBackupResponse(storeID, bo, req.EndVersion, lockResolver, resp, errContext) if err1 != nil { return err1 } diff --git a/br/pkg/backup/client_test.go b/br/pkg/backup/client_test.go index 53f0fa7c37ae0..e1c1e9520d1a4 100644 --- a/br/pkg/backup/client_test.go +++ b/br/pkg/backup/client_test.go @@ -10,6 +10,7 @@ import ( "time" "github.com/golang/protobuf/proto" + "github.com/pingcap/failpoint" backuppb "github.com/pingcap/kvproto/pkg/brpb" "github.com/pingcap/kvproto/pkg/encryptionpb" "github.com/pingcap/kvproto/pkg/errorpb" @@ -20,6 +21,7 @@ import ( "github.com/pingcap/tidb/br/pkg/mock" "github.com/pingcap/tidb/br/pkg/pdutil" "github.com/pingcap/tidb/br/pkg/storage" + "github.com/pingcap/tidb/br/pkg/utils" "github.com/pingcap/tidb/pkg/kv" "github.com/pingcap/tidb/pkg/parser/model" "github.com/pingcap/tidb/pkg/tablecodec" @@ -40,6 +42,7 @@ type testBackup struct { cancel context.CancelFunc mockPDClient pd.Client + mockCluster *testutils.MockCluster mockGlue *gluetidb.MockGlue backupClient *backup.Client @@ -48,11 +51,12 @@ type testBackup struct { } func createBackupSuite(t *testing.T) *testBackup { - tikvClient, _, pdClient, err := testutils.NewMockTiKV("", nil) + tikvClient, mockCluster, pdClient, err := testutils.NewMockTiKV("", nil) require.NoError(t, err) s := new(testBackup) s.mockGlue = &gluetidb.MockGlue{} s.mockPDClient = pdClient + s.mockCluster = mockCluster s.ctx, s.cancel = context.WithCancel(context.Background()) mockMgr := &conn.Mgr{PdController: &pdutil.PdController{}} mockMgr.SetPDClient(s.mockPDClient) @@ -230,20 +234,20 @@ func TestOnBackupRegionErrorResponse(t *testing.T) { } cases := []Case{ - {storeID: 1, backupTS: 421123291611137, resp: newBackupRegionErrorResp(&errorpb.Error{NotLeader: &errorpb.NotLeader{}}), exceptedBackoffMs: 1000, exceptedErr: false}, - {storeID: 1, backupTS: 421123291611137, resp: newBackupRegionErrorResp(&errorpb.Error{RegionNotFound: &errorpb.RegionNotFound{}}), exceptedBackoffMs: 1000, exceptedErr: false}, + {storeID: 1, backupTS: 421123291611137, resp: newBackupRegionErrorResp(&errorpb.Error{NotLeader: &errorpb.NotLeader{}}), exceptedBackoffMs: 3000, exceptedErr: false}, + {storeID: 1, backupTS: 421123291611137, resp: newBackupRegionErrorResp(&errorpb.Error{RegionNotFound: &errorpb.RegionNotFound{}}), exceptedBackoffMs: 3000, exceptedErr: false}, {storeID: 1, backupTS: 421123291611137, resp: newBackupRegionErrorResp(&errorpb.Error{KeyNotInRegion: &errorpb.KeyNotInRegion{}}), exceptedBackoffMs: 0, exceptedErr: true}, - {storeID: 1, backupTS: 421123291611137, resp: newBackupRegionErrorResp(&errorpb.Error{EpochNotMatch: &errorpb.EpochNotMatch{}}), exceptedBackoffMs: 1000, exceptedErr: false}, - {storeID: 1, backupTS: 421123291611137, resp: newBackupRegionErrorResp(&errorpb.Error{ServerIsBusy: &errorpb.ServerIsBusy{}}), exceptedBackoffMs: 1000, exceptedErr: false}, - {storeID: 1, backupTS: 421123291611137, resp: newBackupRegionErrorResp(&errorpb.Error{StaleCommand: &errorpb.StaleCommand{}}), exceptedBackoffMs: 1000, exceptedErr: false}, - {storeID: 1, backupTS: 421123291611137, resp: newBackupRegionErrorResp(&errorpb.Error{StoreNotMatch: &errorpb.StoreNotMatch{}}), exceptedBackoffMs: 1000, exceptedErr: false}, + {storeID: 1, backupTS: 421123291611137, resp: newBackupRegionErrorResp(&errorpb.Error{EpochNotMatch: &errorpb.EpochNotMatch{}}), exceptedBackoffMs: 3000, exceptedErr: false}, + {storeID: 1, backupTS: 421123291611137, resp: newBackupRegionErrorResp(&errorpb.Error{ServerIsBusy: &errorpb.ServerIsBusy{}}), exceptedBackoffMs: 3000, exceptedErr: false}, + {storeID: 1, backupTS: 421123291611137, resp: newBackupRegionErrorResp(&errorpb.Error{StaleCommand: &errorpb.StaleCommand{}}), exceptedBackoffMs: 3000, exceptedErr: false}, + {storeID: 1, backupTS: 421123291611137, resp: newBackupRegionErrorResp(&errorpb.Error{StoreNotMatch: &errorpb.StoreNotMatch{}}), exceptedBackoffMs: 3000, exceptedErr: false}, {storeID: 1, backupTS: 421123291611137, resp: newBackupRegionErrorResp(&errorpb.Error{RaftEntryTooLarge: &errorpb.RaftEntryTooLarge{}}), exceptedBackoffMs: 0, exceptedErr: true}, - {storeID: 1, backupTS: 421123291611137, resp: newBackupRegionErrorResp(&errorpb.Error{ReadIndexNotReady: &errorpb.ReadIndexNotReady{}}), exceptedBackoffMs: 1000, exceptedErr: false}, - {storeID: 1, backupTS: 421123291611137, resp: newBackupRegionErrorResp(&errorpb.Error{ProposalInMergingMode: &errorpb.ProposalInMergingMode{}}), exceptedBackoffMs: 1000, exceptedErr: false}, + {storeID: 1, backupTS: 421123291611137, resp: newBackupRegionErrorResp(&errorpb.Error{ReadIndexNotReady: &errorpb.ReadIndexNotReady{}}), exceptedBackoffMs: 3000, exceptedErr: false}, + {storeID: 1, backupTS: 421123291611137, resp: newBackupRegionErrorResp(&errorpb.Error{ProposalInMergingMode: &errorpb.ProposalInMergingMode{}}), exceptedBackoffMs: 3000, exceptedErr: false}, } for _, cs := range cases { t.Log(cs) - _, backoffMs, err := backup.OnBackupResponse(cs.storeID, cs.bo, cs.backupTS, cs.lockResolver, cs.resp) + _, backoffMs, err := backup.OnBackupResponse(cs.storeID, cs.bo, cs.backupTS, cs.lockResolver, cs.resp, utils.NewErrorContext("test", 1)) require.Equal(t, cs.exceptedBackoffMs, backoffMs) if cs.exceptedErr { require.Error(t, err) @@ -333,3 +337,63 @@ func TestCheckBackupIsLocked(t *testing.T) { require.Error(t, err) require.Regexp(t, "backup lock file and sst file exist in(.+)", err.Error()) } + +func TestFindTargetPeer(t *testing.T) { + s := createBackupSuite(t) + + ctx := context.Background() + testutils.BootstrapWithMultiRegions(s.mockCluster, []byte("g"), []byte("n"), []byte("t")) + + leader1, err := s.backupClient.FindTargetPeer(ctx, []byte("a"), false, nil) + require.NoError(t, err) + + leader2, err := s.backupClient.FindTargetPeer(ctx, []byte("b"), false, nil) + require.NoError(t, err) + + // check passed keys on same region + require.Equal(t, leader1.GetId(), leader2.GetId()) + + failpoint.Enable("github.com/pingcap/tidb/br/pkg/backup/retry-state-on-find-target-peer", "return(2)") + failpoint.Enable("github.com/pingcap/tidb/br/pkg/backup/return-region-on-find-target-peer", "1*return(\"nil\")->1*return(\"hasLeader\")") + + leader, err := s.backupClient.FindTargetPeer(ctx, []byte("m"), false, nil) + require.NoError(t, err) + // check passed keys on find leader after retry + require.Equal(t, 42, int(leader.GetId())) + + failpoint.Disable("github.com/pingcap/tidb/br/pkg/backup/retry-state-on-find-target-peer") + failpoint.Disable("github.com/pingcap/tidb/br/pkg/backup/return-region-on-find-target-peer") + + failpoint.Enable("github.com/pingcap/tidb/br/pkg/backup/retry-state-on-find-target-peer", "return(2)") + failpoint.Enable("github.com/pingcap/tidb/br/pkg/backup/return-region-on-find-target-peer", "return(\"noLeader\")") + + leader, err = s.backupClient.FindTargetPeer(ctx, []byte("m"), false, nil) + // check passed keys with error on find leader after retry + require.ErrorContains(t, err, "cannot find leader") + + failpoint.Disable("github.com/pingcap/tidb/br/pkg/backup/retry-state-on-find-target-peer") + failpoint.Disable("github.com/pingcap/tidb/br/pkg/backup/return-region-on-find-target-peer") + + failpoint.Enable("github.com/pingcap/tidb/br/pkg/backup/retry-state-on-find-target-peer", "return(2)") + failpoint.Enable("github.com/pingcap/tidb/br/pkg/backup/return-region-on-find-target-peer", "1*return(\"nil\")->1*return(\"hasPeer\")") + + storeIDMap := make(map[uint64]struct{}) + storeIDMap[42] = struct{}{} + leader, err = s.backupClient.FindTargetPeer(ctx, []byte("m"), false, storeIDMap) + require.NoError(t, err) + // check passed keys with target peer + require.Equal(t, 43, int(leader.GetId())) + + failpoint.Disable("github.com/pingcap/tidb/br/pkg/backup/retry-state-on-find-target-peer") + failpoint.Disable("github.com/pingcap/tidb/br/pkg/backup/return-region-on-find-target-peer") + + failpoint.Enable("github.com/pingcap/tidb/br/pkg/backup/retry-state-on-find-target-peer", "return(2)") + failpoint.Enable("github.com/pingcap/tidb/br/pkg/backup/return-region-on-find-target-peer", "1*return(\"nil\")->1*return(\"noPeer\")") + + leader, err = s.backupClient.FindTargetPeer(ctx, []byte("m"), false, storeIDMap) + // check passed keys with error and cannot find target peer + require.ErrorContains(t, err, "cannot find leader") + + failpoint.Disable("github.com/pingcap/tidb/br/pkg/backup/retry-state-on-find-target-peer") + failpoint.Disable("github.com/pingcap/tidb/br/pkg/backup/return-region-on-find-target-peer") +} diff --git a/br/pkg/backup/main_test.go b/br/pkg/backup/main_test.go index 399489c0186c2..6bc0597fa7cac 100644 --- a/br/pkg/backup/main_test.go +++ b/br/pkg/backup/main_test.go @@ -25,6 +25,7 @@ func TestMain(m *testing.M) { testsetup.SetupForCommonTest() opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("github.com/klauspost/compress/zstd.(*blockDec).startDecoder"), goleak.IgnoreTopFunction("github.com/pingcap/goleveldb/leveldb.(*DB).mpoolDrain"), diff --git a/br/pkg/backup/prepare_snap/BUILD.bazel b/br/pkg/backup/prepare_snap/BUILD.bazel new file mode 100644 index 0000000000000..ce61679db0c53 --- /dev/null +++ b/br/pkg/backup/prepare_snap/BUILD.bazel @@ -0,0 +1,53 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") + +go_library( + name = "prepare_snap", + srcs = [ + "env.go", + "errors.go", + "prepare.go", + "stream.go", + ], + importpath = "github.com/pingcap/tidb/br/pkg/backup/prepare_snap", + visibility = ["//visibility:public"], + deps = [ + "//br/pkg/logutil", + "//br/pkg/utils", + "//pkg/util/engine", + "@com_github_docker_go_units//:go-units", + "@com_github_google_btree//:btree", + "@com_github_pingcap_errors//:errors", + "@com_github_pingcap_kvproto//pkg/brpb", + "@com_github_pingcap_kvproto//pkg/errorpb", + "@com_github_pingcap_kvproto//pkg/metapb", + "@com_github_pingcap_log//:log", + "@com_github_tikv_client_go_v2//tikv", + "@com_github_tikv_pd_client//:client", + "@org_golang_google_grpc//:grpc", + "@org_golang_x_sync//errgroup", + "@org_uber_go_zap//:zap", + "@org_uber_go_zap//zapcore", + ], +) + +go_test( + name = "prepare_snap_test", + timeout = "short", + srcs = ["prepare_test.go"], + flaky = True, + shard_count = 7, + deps = [ + ":prepare_snap", + "//br/pkg/utils", + "//pkg/store/mockstore/unistore", + "@com_github_pingcap_errors//:errors", + "@com_github_pingcap_kvproto//pkg/brpb", + "@com_github_pingcap_kvproto//pkg/errorpb", + "@com_github_pingcap_kvproto//pkg/metapb", + "@com_github_pingcap_log//:log", + "@com_github_stretchr_testify//require", + "@com_github_tikv_client_go_v2//tikv", + "@com_github_tikv_pd_client//:client", + "@org_uber_go_zap//zapcore", + ], +) diff --git a/br/pkg/backup/prepare_snap/env.go b/br/pkg/backup/prepare_snap/env.go new file mode 100644 index 0000000000000..e0998adc392e3 --- /dev/null +++ b/br/pkg/backup/prepare_snap/env.go @@ -0,0 +1,172 @@ +// Copyright 2024 PingCAP, 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. + +package preparesnap + +import ( + "context" + "slices" + "time" + + "github.com/docker/go-units" + "github.com/pingcap/errors" + brpb "github.com/pingcap/kvproto/pkg/brpb" + "github.com/pingcap/kvproto/pkg/metapb" + "github.com/pingcap/log" + "github.com/pingcap/tidb/br/pkg/logutil" + "github.com/pingcap/tidb/br/pkg/utils" + "github.com/pingcap/tidb/pkg/util/engine" + "github.com/tikv/client-go/v2/tikv" + pd "github.com/tikv/pd/client" + "go.uber.org/zap" + "google.golang.org/grpc" +) + +const ( + // default max gRPC message size is 10MiB. + // split requests to chunks of 1MiB will reduce the possibility of being rejected + // due to max gRPC message size. + maxRequestSize = units.MiB +) + +type Env interface { + ConnectToStore(ctx context.Context, storeID uint64) (PrepareClient, error) + GetAllLiveStores(ctx context.Context) ([]*metapb.Store, error) + + LoadRegionsInKeyRange(ctx context.Context, startKey, endKey []byte) (regions []Region, err error) +} + +type PrepareClient interface { + Send(*brpb.PrepareSnapshotBackupRequest) error + Recv() (*brpb.PrepareSnapshotBackupResponse, error) +} + +type SplitRequestClient struct { + PrepareClient + MaxRequestSize int +} + +func (s SplitRequestClient) Send(req *brpb.PrepareSnapshotBackupRequest) error { + // Try best to keeping the request untouched. + if req.Ty == brpb.PrepareSnapshotBackupRequestType_WaitApply && req.Size() > s.MaxRequestSize { + rs := req.Regions + findSplitIndex := func() int { + if len(rs) == 0 { + return -1 + } + + // Select at least one request. + // So we won't get sutck if there were a really huge (!) request. + collected := 0 + lastI := 1 + for i := 2; i < len(rs) && collected+rs[i].Size() < s.MaxRequestSize; i++ { + lastI = i + collected += rs[i].Size() + } + return lastI + } + for splitIdx := findSplitIndex(); splitIdx > 0; splitIdx = findSplitIndex() { + split := &brpb.PrepareSnapshotBackupRequest{ + Ty: brpb.PrepareSnapshotBackupRequestType_WaitApply, + Regions: rs[:splitIdx], + } + rs = rs[splitIdx:] + if err := s.PrepareClient.Send(split); err != nil { + return err + } + } + return nil + } + return s.PrepareClient.Send(req) +} + +type Region interface { + GetMeta() *metapb.Region + GetLeaderStoreID() uint64 +} + +type CliEnv struct { + Cache *tikv.RegionCache + Mgr *utils.StoreManager +} + +func (c CliEnv) GetAllLiveStores(ctx context.Context) ([]*metapb.Store, error) { + stores, err := c.Cache.PDClient().GetAllStores(ctx, pd.WithExcludeTombstone()) + if err != nil { + return nil, err + } + withoutTiFlash := slices.DeleteFunc(stores, engine.IsTiFlash) + return withoutTiFlash, err +} + +func (c CliEnv) ConnectToStore(ctx context.Context, storeID uint64) (PrepareClient, error) { + var cli brpb.Backup_PrepareSnapshotBackupClient + err := c.Mgr.TryWithConn(ctx, storeID, func(cc *grpc.ClientConn) error { + bcli := brpb.NewBackupClient(cc) + c, err := bcli.PrepareSnapshotBackup(ctx) + if err != nil { + return errors.Annotatef(err, "failed to create prepare backup stream") + } + cli = c + return nil + }) + if err != nil { + return nil, err + } + return cli, nil +} + +func (c CliEnv) LoadRegionsInKeyRange(ctx context.Context, startKey []byte, endKey []byte) (regions []Region, err error) { + bo := tikv.NewBackoffer(ctx, regionCacheMaxBackoffMs) + if len(endKey) == 0 { + // This is encoded [0xff; 8]. + // Workaround for https://github.com/tikv/client-go/issues/1051. + endKey = []byte{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff} + } + rs, err := c.Cache.LoadRegionsInKeyRange(bo, startKey, endKey) + if err != nil { + return nil, err + } + rrs := make([]Region, 0, len(rs)) + for _, r := range rs { + rrs = append(rrs, r) + } + return rrs, nil +} + +type RetryAndSplitRequestEnv struct { + Env + GetBackoffer func() utils.Backoffer +} + +func (r RetryAndSplitRequestEnv) ConnectToStore(ctx context.Context, storeID uint64) (PrepareClient, error) { + // Retry for about 2 minutes. + rs := utils.InitialRetryState(12, 10*time.Second, 10*time.Second) + bo := utils.Backoffer(&rs) + if r.GetBackoffer != nil { + bo = r.GetBackoffer() + } + cli, err := utils.WithRetryV2(ctx, bo, func(ctx context.Context) (PrepareClient, error) { + cli, err := r.Env.ConnectToStore(ctx, storeID) + if err != nil { + log.Warn("Failed to connect to store, will retry.", zap.Uint64("store", storeID), logutil.ShortError(err)) + return nil, err + } + return cli, nil + }) + if err != nil { + return nil, err + } + return SplitRequestClient{PrepareClient: cli, MaxRequestSize: maxRequestSize}, nil +} diff --git a/br/pkg/backup/prepare_snap/errors.go b/br/pkg/backup/prepare_snap/errors.go new file mode 100644 index 0000000000000..eb2ca151ec514 --- /dev/null +++ b/br/pkg/backup/prepare_snap/errors.go @@ -0,0 +1,39 @@ +// Copyright 2024 PingCAP, 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. + +package preparesnap + +import ( + "github.com/pingcap/errors" + "github.com/pingcap/kvproto/pkg/errorpb" +) + +func convertErr(err *errorpb.Error) error { + if err == nil { + return nil + } + return errors.New(err.Message) +} + +func leaseExpired() error { + return errors.New("the lease has expired") +} + +func unsupported() error { + return errors.New("unsupported operation") +} + +func retryLimitExceeded() error { + return errors.New("the limit of retrying exceeded") +} diff --git a/br/pkg/backup/prepare_snap/prepare.go b/br/pkg/backup/prepare_snap/prepare.go new file mode 100644 index 0000000000000..46f1916873831 --- /dev/null +++ b/br/pkg/backup/prepare_snap/prepare.go @@ -0,0 +1,430 @@ +// Copyright 2024 PingCAP, 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. + +package preparesnap + +import ( + "bytes" + "context" + "fmt" + "time" + + "github.com/google/btree" + "github.com/pingcap/errors" + brpb "github.com/pingcap/kvproto/pkg/brpb" + "github.com/pingcap/kvproto/pkg/metapb" + "github.com/pingcap/log" + "github.com/pingcap/tidb/br/pkg/logutil" + "go.uber.org/zap" + "go.uber.org/zap/zapcore" + "golang.org/x/sync/errgroup" +) + +const ( + /* The combination of defaultMaxRetry and defaultRetryBackoff limits + the whole procedure to about 5 min if there is a region always fail. + Also note that we are batching during retrying. Retrying many region + costs only one chance of retrying if they are batched. */ + + defaultMaxRetry = 60 + defaultRetryBackoff = 5 * time.Second + defaultLeaseDur = 120 * time.Second + + /* Give pd enough time to find the region. If we aren't able to fetch + the region, the whole procedure might be aborted. */ + + regionCacheMaxBackoffMs = 60000 +) + +type pendingRequests map[uint64]*brpb.PrepareSnapshotBackupRequest + +type rangeOrRegion struct { + // If it is a range, this should be zero. + id uint64 + startKey []byte + endKey []byte +} + +func (r rangeOrRegion) String() string { + rng := logutil.StringifyRangeOf(r.startKey, r.endKey) + if r.id == 0 { + return fmt.Sprintf("range%s", rng) + } + return fmt.Sprintf("region(id=%d, range=%s)", r.id, rng) +} + +func (r rangeOrRegion) compareWith(than rangeOrRegion) bool { + return bytes.Compare(r.startKey, than.startKey) < 0 +} + +type Preparer struct { + /* Environments. */ + env Env + + /* Internal Status. */ + inflightReqs map[uint64]metapb.Region + failed []rangeOrRegion + waitApplyDoneRegions btree.BTreeG[rangeOrRegion] + retryTime int + nextRetry *time.Timer + + /* Internal I/O. */ + eventChan chan event + clients map[uint64]*prepareStream + + /* Interface for caller. */ + waitApplyFinished bool + + /* Some configurations. They aren't thread safe. + You may need to configure them before starting the Preparer. */ + RetryBackoff time.Duration + RetryLimit int + LeaseDuration time.Duration +} + +func New(env Env) *Preparer { + prep := &Preparer{ + env: env, + + inflightReqs: make(map[uint64]metapb.Region), + waitApplyDoneRegions: *btree.NewG(16, rangeOrRegion.compareWith), + eventChan: make(chan event, 128), + clients: make(map[uint64]*prepareStream), + + RetryBackoff: defaultRetryBackoff, + RetryLimit: defaultMaxRetry, + LeaseDuration: defaultLeaseDur, + } + return prep +} + +func (p *Preparer) MarshalLogObject(om zapcore.ObjectEncoder) error { + om.AddInt("inflight_requests", len(p.inflightReqs)) + reqs := 0 + for _, r := range p.inflightReqs { + om.AddString("simple_inflight_region", rangeOrRegion{id: r.Id, startKey: r.StartKey, endKey: r.EndKey}.String()) + reqs += 1 + if reqs > 3 { + break + } + } + om.AddInt("failed_requests", len(p.failed)) + failed := 0 + for _, r := range p.failed { + om.AddString("simple_failed_region", r.String()) + failed += 1 + if failed > 5 { + break + } + } + err := om.AddArray("connected_stores", zapcore.ArrayMarshalerFunc(func(ae zapcore.ArrayEncoder) error { + for id := range p.clients { + ae.AppendUint64(id) + } + return nil + })) + if err != nil { + return err + } + om.AddInt("retry_time", p.retryTime) + om.AddBool("wait_apply_finished", p.waitApplyFinished) + return nil +} + +// DriveLoopAndWaitPrepare drives the state machine and block the +// current goroutine until we are safe to start taking snapshot. +// +// After this invoked, you shouldn't share this `Preparer` with any other goroutines. +// +// After this the cluster will enter the land between normal and taking snapshot. +// This state will continue even this function returns, until `Finalize` invoked. +// Splitting, ingesting and conf changing will all be blocked. +func (p *Preparer) DriveLoopAndWaitPrepare(ctx context.Context) error { + logutil.CL(ctx).Info("Start drive the loop.", zap.Duration("retry_backoff", p.RetryBackoff), + zap.Int("retry_limit", p.RetryLimit), + zap.Duration("lease_duration", p.LeaseDuration)) + p.retryTime = 0 + if err := p.prepareConnections(ctx); err != nil { + log.Error("failed to prepare connections", logutil.ShortError(err)) + return errors.Annotate(err, "failed to prepare connections") + } + if err := p.AdvanceState(ctx); err != nil { + log.Error("failed to check the progress of our work", logutil.ShortError(err)) + return errors.Annotate(err, "failed to begin step") + } + for !p.waitApplyFinished { + if err := p.WaitAndHandleNextEvent(ctx); err != nil { + log.Error("failed to wait and handle next event", logutil.ShortError(err)) + return errors.Annotate(err, "failed to step") + } + } + return nil +} + +// Finalize notify the cluster to go back to the normal mode. +// This will return an error if the cluster has already entered the normal mode when this is called. +func (p *Preparer) Finalize(ctx context.Context) error { + eg := new(errgroup.Group) + for id, cli := range p.clients { + cli := cli + id := id + eg.Go(func() error { + if err := cli.Finalize(ctx); err != nil { + return errors.Annotatef(err, "failed to finalize the prepare stream for %d", id) + } + return nil + }) + } + if err := eg.Wait(); err != nil { + logutil.CL(ctx).Warn("failed to finalize some prepare streams.", logutil.ShortError(err)) + return err + } + logutil.CL(ctx).Info("all connections to store have shuted down.") + for { + select { + case event := <-p.eventChan: + if err := p.onEvent(ctx, event); err != nil { + return err + } + default: + return nil + } + } +} + +func (p *Preparer) batchEvents(evts *[]event) { + for { + select { + case evt := <-p.eventChan: + *evts = append(*evts, evt) + default: + return + } + } +} + +// WaitAndHandleNextEvent is exported for test usage. +// This waits the next event (wait apply done, errors, etc..) of preparing. +// Generally `DriveLoopAndWaitPrepare` is all you need. +func (p *Preparer) WaitAndHandleNextEvent(ctx context.Context) error { + select { + case <-ctx.Done(): + logutil.CL(ctx).Warn("User canceled.", logutil.ShortError(ctx.Err())) + return ctx.Err() + case evt := <-p.eventChan: + logutil.CL(ctx).Debug("received event", zap.Stringer("event", evt)) + events := []event{evt} + p.batchEvents(&events) + for _, evt := range events { + err := p.onEvent(ctx, evt) + if err != nil { + return errors.Annotatef(err, "failed to handle event %v", evt) + } + } + return p.AdvanceState(ctx) + case <-p.retryChan(): + return p.workOnPendingRanges(ctx) + } +} + +func (p *Preparer) removePendingRequest(r *metapb.Region) bool { + r2, ok := p.inflightReqs[r.GetId()] + if !ok { + return false + } + matches := r2.GetRegionEpoch().GetVersion() == r.GetRegionEpoch().GetVersion() && + r2.GetRegionEpoch().GetConfVer() == r.GetRegionEpoch().GetConfVer() + if !matches { + return false + } + delete(p.inflightReqs, r.GetId()) + return true +} + +func (p *Preparer) onEvent(ctx context.Context, e event) error { + switch e.ty { + case eventMiscErr: + // Note: some of errors might be able to be retry. + // But for now it seems there isn't one. + return errors.Annotatef(e.err, "unrecoverable error at store %d", e.storeID) + case eventWaitApplyDone: + if !p.removePendingRequest(e.region) { + logutil.CL(ctx).Warn("received unmatched response, perhaps stale, drop it", zap.Stringer("region", e.region)) + return nil + } + r := rangeOrRegion{ + id: e.region.GetId(), + startKey: e.region.GetStartKey(), + endKey: e.region.GetEndKey(), + } + if e.err != nil { + logutil.CL(ctx).Warn("requesting a region failed.", zap.Uint64("store", e.storeID), logutil.ShortError(e.err)) + p.failed = append(p.failed, r) + if p.nextRetry != nil { + p.nextRetry.Stop() + } + // Reset the timer so we can collect more regions. + // Note: perhaps it is better to make a deadline heap or something + // so every region backoffs the same time. + p.nextRetry = time.NewTimer(p.RetryBackoff) + return nil + } + if item, ok := p.waitApplyDoneRegions.ReplaceOrInsert(r); ok { + logutil.CL(ctx).Warn("overlapping in success region", + zap.Stringer("old_region", item), + zap.Stringer("new_region", r)) + } + default: + return errors.Annotatef(unsupported(), "unsupported event type %d", e.ty) + } + + return nil +} + +func (p *Preparer) retryChan() <-chan time.Time { + if p.nextRetry == nil { + return nil + } + return p.nextRetry.C +} + +// AdvanceState is exported for test usage. +// This call will check whether now we are safe to forward the whole procedure. +// If we can, this will set `p.waitApplyFinished` to true. +// Generally `DriveLoopAndWaitPrepare` is all you need, you may not want to call this. +func (p *Preparer) AdvanceState(ctx context.Context) error { + logutil.CL(ctx).Info("Checking the progress of our work.", zap.Object("current", p)) + if len(p.inflightReqs) == 0 && len(p.failed) == 0 { + holes := p.checkHole() + if len(holes) == 0 { + p.waitApplyFinished = true + return nil + } + logutil.CL(ctx).Warn("It seems there are still some works to be done.", zap.Stringers("regions", holes)) + p.failed = holes + return p.workOnPendingRanges(ctx) + } + + return nil +} + +func (p *Preparer) checkHole() []rangeOrRegion { + log.Info("Start checking the hole.", zap.Int("len", p.waitApplyDoneRegions.Len())) + if p.waitApplyDoneRegions.Len() == 0 { + return []rangeOrRegion{{}} + } + + last := []byte("") + failed := []rangeOrRegion{} + p.waitApplyDoneRegions.Ascend(func(item rangeOrRegion) bool { + if bytes.Compare(last, item.startKey) < 0 { + failed = append(failed, rangeOrRegion{startKey: last, endKey: item.startKey}) + } + last = item.endKey + return true + }) + // Not the end key of key space. + if len(last) > 0 { + failed = append(failed, rangeOrRegion{ + startKey: last, + }) + } + return failed +} + +func (p *Preparer) workOnPendingRanges(ctx context.Context) error { + p.nextRetry = nil + if len(p.failed) == 0 { + return nil + } + p.retryTime += 1 + if p.retryTime > p.RetryLimit { + return retryLimitExceeded() + } + + logutil.CL(ctx).Info("retrying some ranges incomplete.", zap.Int("ranges", len(p.failed))) + preqs := pendingRequests{} + for _, r := range p.failed { + rs, err := p.env.LoadRegionsInKeyRange(ctx, r.startKey, r.endKey) + if err != nil { + return errors.Annotatef(err, "retrying range of %s: get region", logutil.StringifyRangeOf(r.startKey, r.endKey)) + } + logutil.CL(ctx).Info("loaded regions in range for retry.", zap.Int("regions", len(rs))) + for _, region := range rs { + p.pushWaitApply(preqs, region) + } + } + p.failed = nil + return p.sendWaitApply(ctx, preqs) +} + +func (p *Preparer) sendWaitApply(ctx context.Context, reqs pendingRequests) error { + for store, req := range reqs { + stream, err := p.streamOf(ctx, store) + if err != nil { + return errors.Annotatef(err, "failed to dial the store %d", store) + } + err = stream.cli.Send(req) + if err != nil { + return errors.Annotatef(err, "failed to send message to the store %d", store) + } + logutil.CL(ctx).Info("sent wait apply requests to store", zap.Uint64("store", store), zap.Int("regions", len(req.Regions))) + } + return nil +} + +func (p *Preparer) streamOf(ctx context.Context, storeID uint64) (*prepareStream, error) { + s, ok := p.clients[storeID] + if !ok { + cli, err := p.env.ConnectToStore(ctx, storeID) + if err != nil { + return nil, errors.Annotatef(err, "failed to dial store %d", storeID) + } + s = new(prepareStream) + s.storeID = storeID + s.output = p.eventChan + s.leaseDuration = p.LeaseDuration + err = s.InitConn(ctx, cli) + if err != nil { + return nil, err + } + p.clients[storeID] = s + } + return s, nil +} + +func (p *Preparer) pushWaitApply(reqs pendingRequests, region Region) { + leader := region.GetLeaderStoreID() + if _, ok := reqs[leader]; !ok { + reqs[leader] = new(brpb.PrepareSnapshotBackupRequest) + reqs[leader].Ty = brpb.PrepareSnapshotBackupRequestType_WaitApply + } + reqs[leader].Regions = append(reqs[leader].Regions, region.GetMeta()) + p.inflightReqs[region.GetMeta().Id] = *region.GetMeta() +} + +func (p *Preparer) prepareConnections(ctx context.Context) error { + log.Info("Preparing connections to stores.") + stores, err := p.env.GetAllLiveStores(ctx) + if err != nil { + return errors.Annotate(err, "failed to get all live stores") + } + for _, store := range stores { + _, err := p.streamOf(ctx, store.Id) + if err != nil { + return errors.Annotatef(err, "failed to prepare connection to store %d", store.Id) + } + } + return nil +} diff --git a/br/pkg/backup/prepare_snap/prepare_test.go b/br/pkg/backup/prepare_snap/prepare_test.go new file mode 100644 index 0000000000000..502af2249d9d9 --- /dev/null +++ b/br/pkg/backup/prepare_snap/prepare_test.go @@ -0,0 +1,458 @@ +// Copyright 2024 PingCAP, 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. + +package preparesnap_test + +import ( + "bytes" + "context" + "encoding/hex" + "io" + "slices" + "sync" + "testing" + "time" + + "github.com/pingcap/errors" + brpb "github.com/pingcap/kvproto/pkg/brpb" + "github.com/pingcap/kvproto/pkg/errorpb" + "github.com/pingcap/kvproto/pkg/metapb" + "github.com/pingcap/log" + . "github.com/pingcap/tidb/br/pkg/backup/prepare_snap" + "github.com/pingcap/tidb/br/pkg/utils" + "github.com/pingcap/tidb/pkg/store/mockstore/unistore" + "github.com/stretchr/testify/require" + "github.com/tikv/client-go/v2/tikv" + pd "github.com/tikv/pd/client" + "go.uber.org/zap/zapcore" +) + +type mockStore struct { + mu sync.Mutex + + output chan brpb.PrepareSnapshotBackupResponse + leaseUntil time.Time + + successRegions []metapb.Region + onWaitApply func(*metapb.Region) error + now func() time.Time +} + +func (s *mockStore) Send(req *brpb.PrepareSnapshotBackupRequest) error { + switch req.Ty { + case brpb.PrepareSnapshotBackupRequestType_WaitApply: + s.mu.Lock() + defer s.mu.Unlock() + for _, region := range req.Regions { + resp := brpb.PrepareSnapshotBackupResponse{ + Ty: brpb.PrepareSnapshotBackupEventType_WaitApplyDone, + Region: region, + } + if s.onWaitApply != nil { + if err := s.onWaitApply(region); err != nil { + resp.Error = &errorpb.Error{ + Message: err.Error(), + } + } + } + s.sendResp(resp) + if resp.Error == nil { + s.successRegions = append(s.successRegions, *region) + } + } + case brpb.PrepareSnapshotBackupRequestType_UpdateLease: + s.mu.Lock() + defer s.mu.Unlock() + expired := s.leaseUntil.Before(s.now()) + s.leaseUntil = s.now().Add(time.Duration(req.LeaseInSeconds) * time.Second) + s.sendResp(brpb.PrepareSnapshotBackupResponse{ + Ty: brpb.PrepareSnapshotBackupEventType_UpdateLeaseResult, + LastLeaseIsValid: !expired, + }) + case brpb.PrepareSnapshotBackupRequestType_Finish: + s.mu.Lock() + defer s.mu.Unlock() + expired := s.leaseUntil.Before(s.now()) + s.leaseUntil = time.Time{} + s.sendResp(brpb.PrepareSnapshotBackupResponse{ + Ty: brpb.PrepareSnapshotBackupEventType_UpdateLeaseResult, + LastLeaseIsValid: !expired, + }) + close(s.output) + } + return nil +} + +func (s *mockStore) sendResp(resp brpb.PrepareSnapshotBackupResponse) { + s.output <- resp +} + +func (s *mockStore) Recv() (*brpb.PrepareSnapshotBackupResponse, error) { + out, ok := <-s.output + if !ok { + return nil, io.EOF + } + return &out, nil +} + +type mockStores struct { + mu sync.Mutex + stores map[uint64]*mockStore + onCreateStore func(*mockStore) + onConnectToStore func(uint64) error + + pdc *tikv.RegionCache +} + +func newTestEnv(pdc pd.Client) *mockStores { + r := tikv.NewRegionCache(pdc) + ms := &mockStores{ + stores: map[uint64]*mockStore{}, + pdc: r, + onCreateStore: func(ms *mockStore) {}, + } + return ms +} + +func (m *mockStores) GetAllLiveStores(ctx context.Context) ([]*metapb.Store, error) { + m.mu.Lock() + defer m.mu.Unlock() + + res := []*metapb.Store{} + for id := range m.stores { + res = append(res, &metapb.Store{Id: id}) + } + return res, nil +} + +func (m *mockStores) ConnectToStore(ctx context.Context, storeID uint64) (PrepareClient, error) { + m.mu.Lock() + defer m.mu.Unlock() + + if m.onConnectToStore != nil { + err := m.onConnectToStore(storeID) + if err != nil { + return nil, err + } + } + + _, ok := m.stores[storeID] + if !ok { + m.stores[storeID] = &mockStore{ + output: make(chan brpb.PrepareSnapshotBackupResponse, 16), + successRegions: []metapb.Region{}, + onWaitApply: func(r *metapb.Region) error { + return nil + }, + now: func() time.Time { + return time.Now() + }, + } + m.onCreateStore(m.stores[storeID]) + } + return m.stores[storeID], nil +} + +func (m *mockStores) LoadRegionsInKeyRange(ctx context.Context, startKey []byte, endKey []byte) (regions []Region, err error) { + if len(endKey) == 0 { + // This is encoded [0xff; 8]. + // Workaround for https://github.com/tikv/client-go/issues/1051. + endKey = []byte{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff} + } + rs, err := m.pdc.LoadRegionsInKeyRange(tikv.NewBackoffer(ctx, 100), startKey, endKey) + if err != nil { + return nil, err + } + rrs := make([]Region, 0, len(rs)) + for _, r := range rs { + rrs = append(rrs, r) + } + return rrs, nil +} + +type rng [2][]byte + +func (m *mockStores) AssertSafeForBackup(t *testing.T) { + m.mu.Lock() + defer m.mu.Unlock() + + res := []rng{} + for _, store := range m.stores { + store.mu.Lock() + for _, region := range store.successRegions { + res = append(res, rng{region.StartKey, region.EndKey}) + } + now := store.now() + if store.leaseUntil.Before(now) { + t.Fatalf("lease has expired: at %s, now is %s", store.leaseUntil, now) + } + store.mu.Unlock() + } + slices.SortFunc(res, func(a, b rng) int { + return bytes.Compare(a[0], b[0]) + }) + for i := 1; i < len(res); i++ { + if bytes.Compare(res[i-1][1], res[i][0]) < 0 { + t.Fatalf("hole: %s %s", hex.EncodeToString(res[i-1][1]), hex.EncodeToString(res[i][0])) + } + } +} + +func (m *mockStores) AssertIsNormalMode(t *testing.T) { + m.mu.Lock() + defer m.mu.Unlock() + + for id, store := range m.stores { + store.mu.Lock() + if !store.leaseUntil.Before(store.now()) { + t.Fatalf("lease in store %d doesn't expire, the store may not work as normal", id) + } + store.mu.Unlock() + } +} + +func fakeCluster(t *testing.T, nodes int, keys ...[]byte) pd.Client { + tmp := t.TempDir() + _, pdc, cluster, err := unistore.New(tmp) + unistore.BootstrapWithMultiStores(cluster, nodes) + require.NoError(t, err) + cluster.SplitArbitrary(keys...) + return pdc +} + +func dummyRegions(size int) [][]byte { + // Generate regions like "a", "b", ..., "z", "aa", "ba", ..., "zz", "aaa" + res := [][]byte{} + for i := 0; i < size; i++ { + s := make([]byte, 0, i/26) + for j := i; j > 0; j /= 26 { + s = append(s, byte('a')+byte(j%26)) + } + res = append(res, s) + } + slices.SortFunc(res, bytes.Compare) + return res +} + +func TestBasic(t *testing.T) { + req := require.New(t) + pdc := fakeCluster(t, 3, dummyRegions(100)...) + ms := newTestEnv(pdc) + + ctx := context.Background() + prep := New(ms) + req.NoError(prep.DriveLoopAndWaitPrepare(ctx)) + ms.AssertSafeForBackup(t) + req.NoError(prep.Finalize(ctx)) + ms.AssertIsNormalMode(t) +} + +func TestFailDueToErr(t *testing.T) { + req := require.New(t) + pdc := fakeCluster(t, 3, dummyRegions(100)...) + ms := newTestEnv(pdc) + + ms.onCreateStore = func(ms *mockStore) { + ms.onWaitApply = func(r *metapb.Region) error { + return errors.New("failed meow") + } + } + + ctx := context.Background() + prep := New(ms) + prep.RetryBackoff = 100 * time.Millisecond + prep.RetryLimit = 3 + now := time.Now() + req.Error(prep.DriveLoopAndWaitPrepare(ctx)) + req.Greater(time.Since(now), 300*time.Millisecond) + req.NoError(prep.Finalize(ctx)) + ms.AssertIsNormalMode(t) +} + +func TestError(t *testing.T) { + req := require.New(t) + pdc := fakeCluster(t, 3, dummyRegions(100)...) + ms := newTestEnv(pdc) + + ms.onCreateStore = func(ms *mockStore) { + failed := false + ms.onWaitApply = func(r *metapb.Region) error { + if !failed { + failed = true + return errors.New("failed") + } + return nil + } + } + + ctx := context.Background() + prep := New(ms) + prep.RetryBackoff = 0 + req.NoError(prep.DriveLoopAndWaitPrepare(ctx)) + ms.AssertSafeForBackup(t) + req.NoError(prep.Finalize(ctx)) + ms.AssertIsNormalMode(t) +} + +func TestLeaseTimeout(t *testing.T) { + log.SetLevel(zapcore.DebugLevel) + req := require.New(t) + pdc := fakeCluster(t, 3, dummyRegions(100)...) + ms := newTestEnv(pdc) + tt := struct { + now time.Time + mu sync.Mutex + }{now: time.Now()} + + ms.onCreateStore = func(ms *mockStore) { + ms.now = func() time.Time { + tt.mu.Lock() + defer tt.mu.Unlock() + return tt.now + } + } + + ctx := context.Background() + prep := New(ms) + req.NoError(prep.DriveLoopAndWaitPrepare(ctx)) + ms.AssertSafeForBackup(t) + tt.mu.Lock() + tt.now = tt.now.Add(100 * time.Minute) + tt.mu.Unlock() + req.Error(prep.Finalize(ctx)) +} + +func TestLeaseTimeoutWhileTakingSnapshot(t *testing.T) { + log.SetLevel(zapcore.DebugLevel) + req := require.New(t) + pdc := fakeCluster(t, 3, dummyRegions(100)...) + ms := newTestEnv(pdc) + tt := struct { + now time.Time + mu sync.Mutex + }{now: time.Now()} + + ms.onCreateStore = func(ms *mockStore) { + ms.now = func() time.Time { + tt.mu.Lock() + defer tt.mu.Unlock() + return tt.now + } + } + + ctx := context.Background() + prep := New(ms) + prep.LeaseDuration = 4 * time.Second + req.NoError(prep.AdvanceState(ctx)) + tt.mu.Lock() + tt.now = tt.now.Add(100 * time.Minute) + tt.mu.Unlock() + time.Sleep(2 * time.Second) + cx, cancel := context.WithTimeout(ctx, 1*time.Second) + defer cancel() + for { + err := prep.WaitAndHandleNextEvent(cx) + if err != nil { + req.ErrorContains(err, "the lease has expired") + break + } + } +} + +func TestRetryEnv(t *testing.T) { + log.SetLevel(zapcore.DebugLevel) + req := require.New(t) + pdc := fakeCluster(t, 3, dummyRegions(100)...) + tms := newTestEnv(pdc) + failed := new(sync.Once) + tms.onConnectToStore = func(u uint64) error { + shouldFail := false + failed.Do(func() { + shouldFail = true + }) + if shouldFail { + return errors.New("nya?") + } + return nil + } + ms := RetryAndSplitRequestEnv{Env: tms} + ms.GetBackoffer = func() utils.Backoffer { + o := utils.InitialRetryState(2, 0, 0) + return &o + } + prep := New(ms) + ctx := context.Background() + req.NoError(prep.DriveLoopAndWaitPrepare(ctx)) + req.NoError(prep.Finalize(ctx)) +} + +type counterClient struct { + send int + regions []*metapb.Region +} + +func (c *counterClient) Send(req *brpb.PrepareSnapshotBackupRequest) error { + c.send += 1 + c.regions = append(c.regions, req.Regions...) + return nil +} + +func (c *counterClient) Recv() (*brpb.PrepareSnapshotBackupResponse, error) { + panic("not implemented") +} + +func TestSplitEnv(t *testing.T) { + log.SetLevel(zapcore.DebugLevel) + cc := SplitRequestClient{PrepareClient: &counterClient{}, MaxRequestSize: 1024} + reset := func() { + cc.PrepareClient.(*counterClient).send = 0 + cc.PrepareClient.(*counterClient).regions = nil + } + makeHugeRequestRegions := func(n int, eachSize int) []*metapb.Region { + regions := []*metapb.Region{} + for i := 0; i < n; i++ { + regions = append(regions, &metapb.Region{ + StartKey: append(make([]byte, eachSize-1), byte(i)), + EndKey: append(make([]byte, eachSize-1), byte(i+1)), + }) + } + return regions + } + + hugeRequest := brpb.PrepareSnapshotBackupRequest{ + Ty: brpb.PrepareSnapshotBackupRequestType_WaitApply, + Regions: makeHugeRequestRegions(100, 128), + } + require.NoError(t, cc.Send(&hugeRequest)) + require.GreaterOrEqual(t, cc.PrepareClient.(*counterClient).send, 20) + require.ElementsMatch(t, cc.PrepareClient.(*counterClient).regions, hugeRequest.Regions) + + reset() + reallyHugeRequest := brpb.PrepareSnapshotBackupRequest{ + Ty: brpb.PrepareSnapshotBackupRequestType_WaitApply, + Regions: makeHugeRequestRegions(10, 2048), + } + require.NoError(t, cc.Send(&reallyHugeRequest)) + require.Equal(t, cc.PrepareClient.(*counterClient).send, 10) + require.ElementsMatch(t, cc.PrepareClient.(*counterClient).regions, reallyHugeRequest.Regions) + + reset() + tinyRequest := brpb.PrepareSnapshotBackupRequest{ + Ty: brpb.PrepareSnapshotBackupRequestType_WaitApply, + Regions: makeHugeRequestRegions(10, 10), + } + require.NoError(t, cc.Send(&tinyRequest)) + require.Equal(t, cc.PrepareClient.(*counterClient).send, 1) + require.ElementsMatch(t, cc.PrepareClient.(*counterClient).regions, tinyRequest.Regions) +} diff --git a/br/pkg/backup/prepare_snap/stream.go b/br/pkg/backup/prepare_snap/stream.go new file mode 100644 index 0000000000000..9e253fc4a4d37 --- /dev/null +++ b/br/pkg/backup/prepare_snap/stream.go @@ -0,0 +1,212 @@ +// Copyright 2024 PingCAP, 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. + +package preparesnap + +import ( + "context" + "fmt" + "io" + "time" + + "github.com/pingcap/errors" + brpb "github.com/pingcap/kvproto/pkg/brpb" + "github.com/pingcap/kvproto/pkg/metapb" + "github.com/pingcap/log" + "github.com/pingcap/tidb/br/pkg/logutil" + "github.com/pingcap/tidb/br/pkg/utils" + "go.uber.org/zap" + "golang.org/x/sync/errgroup" +) + +type eventType int + +const ( + eventMiscErr eventType = iota + eventWaitApplyDone +) + +type event struct { + ty eventType + + storeID uint64 + err error + region *metapb.Region +} + +func (e event) String() string { + return fmt.Sprintf("Event(Type: %v, StoreID: %v, Error: %v, Region: %v)", e.ty, e.storeID, e.err, e.region) +} + +type prepareStream struct { + storeID uint64 + cli PrepareClient + leaseDuration time.Duration + + output chan<- event + serverStream <-chan utils.Result[*brpb.PrepareSnapshotBackupResponse] + + clientLoopHandle *errgroup.Group + stopBgTasks context.CancelFunc +} + +// InitConn initializes the connection to the stream (i.e. "active" the stream). +// +// Before calling this, make sure you have filled the store ID and output channel. +// +// Once this has been called, them **should not be changed** any more. +func (p *prepareStream) InitConn(ctx context.Context, cli PrepareClient) error { + p.cli = cli + p.clientLoopHandle, ctx = errgroup.WithContext(ctx) + ctx, p.stopBgTasks = context.WithCancel(ctx) + return p.GoLeaseLoop(ctx, p.leaseDuration) +} + +func (p *prepareStream) Finalize(ctx context.Context) error { + log.Info("shutting down", zap.Uint64("store", p.storeID)) + return p.stopClientLoop(ctx) +} + +func (p *prepareStream) GoLeaseLoop(ctx context.Context, dur time.Duration) error { + err := p.cli.Send(&brpb.PrepareSnapshotBackupRequest{ + Ty: brpb.PrepareSnapshotBackupRequestType_UpdateLease, + LeaseInSeconds: uint64(dur.Seconds()), + }) + if err != nil { + return errors.Annotate(err, "failed to initialize the lease") + } + msg, err := p.cli.Recv() + if err != nil { + return errors.Annotate(err, "failed to recv the initialize lease result") + } + if msg.Ty != brpb.PrepareSnapshotBackupEventType_UpdateLeaseResult { + return errors.Errorf("unexpected type of response during creating lease loop: it is %s", msg.Ty) + } + p.serverStream = utils.AsyncStreamBy(p.cli.Recv) + p.clientLoopHandle.Go(func() error { return p.clientLoop(ctx, dur) }) + return nil +} + +func (p *prepareStream) onResponse(ctx context.Context, res utils.Result[*brpb.PrepareSnapshotBackupResponse]) error { + if err := res.Err; err != nil { + return err + } + resp := res.Item + logutil.CL(ctx).Debug("received response", zap.Stringer("resp", resp)) + evt, needDeliver := p.convertToEvent(resp) + if needDeliver { + logutil.CL(ctx).Debug("generating internal event", zap.Stringer("event", evt)) + p.output <- evt + } + return nil +} + +func (p *prepareStream) stopClientLoop(ctx context.Context) error { + p.stopBgTasks() + err := p.cli.Send(&brpb.PrepareSnapshotBackupRequest{ + Ty: brpb.PrepareSnapshotBackupRequestType_Finish, + }) + if err != nil { + return errors.Annotate(err, "failed to send finish request") + } +recv_loop: + for { + select { + case <-ctx.Done(): + return ctx.Err() + case res, ok := <-p.serverStream: + err := p.onResponse(ctx, res) + if err == io.EOF || !ok { + logutil.CL(ctx).Info("close loop done.", zap.Uint64("store", p.storeID), zap.Bool("is-chan-closed", !ok)) + break recv_loop + } + if err != nil { + return err + } + } + } + return p.clientLoopHandle.Wait() +} + +func (p *prepareStream) clientLoop(ctx context.Context, dur time.Duration) error { + ticker := time.NewTicker(dur / 4) + lastSuccess := time.Unix(0, 0) + defer ticker.Stop() + for { + select { + case <-ctx.Done(): + logutil.CL(ctx).Info("client loop exits.", zap.Uint64("store", p.storeID)) + return nil + case res := <-p.serverStream: + if err := p.onResponse(ctx, res); err != nil { + p.sendErr(errors.Annotate(err, "failed to recv from the stream")) + return err + } + case <-ticker.C: + err := p.cli.Send(&brpb.PrepareSnapshotBackupRequest{ + Ty: brpb.PrepareSnapshotBackupRequestType_UpdateLease, + LeaseInSeconds: uint64(dur.Seconds()), + }) + if err != nil { + log.Warn("failed to update the lease loop", logutil.ShortError(err)) + if time.Since(lastSuccess) > dur { + err := errors.Annotate(err, "too many times failed to update the lease, it is probably expired") + p.output <- event{ + ty: eventMiscErr, + storeID: p.storeID, + err: err, + } + return err + } + } else { + lastSuccess = time.Now() + } + } + } +} + +func (p *prepareStream) sendErr(err error) { + p.output <- event{ + ty: eventMiscErr, + storeID: p.storeID, + err: err, + } +} + +func (p *prepareStream) convertToEvent(resp *brpb.PrepareSnapshotBackupResponse) (event, bool) { + switch resp.Ty { + case brpb.PrepareSnapshotBackupEventType_WaitApplyDone: + return event{ + ty: eventWaitApplyDone, + storeID: p.storeID, + region: resp.Region, + err: convertErr(resp.Error), + }, true + case brpb.PrepareSnapshotBackupEventType_UpdateLeaseResult: + if !resp.LastLeaseIsValid { + return event{ + ty: eventMiscErr, + storeID: p.storeID, + err: leaseExpired(), + }, true + } + return event{}, false + } + return event{ + ty: eventMiscErr, + storeID: p.storeID, + err: errors.Annotatef(unsupported(), "unknown response type %v (%d)", + resp.Ty, resp.Ty), + }, true +} diff --git a/br/pkg/backup/push.go b/br/pkg/backup/push.go index 83df6f46ff3a3..302d810951528 100644 --- a/br/pkg/backup/push.go +++ b/br/pkg/backup/push.go @@ -4,7 +4,6 @@ package backup import ( "context" - "fmt" "sync" "github.com/opentracing/opentracing-go" @@ -73,6 +72,7 @@ func (push *pushDown) pushBackup( }) wg := new(sync.WaitGroup) + errContext := utils.NewErrorContext("pushBackup", 10) for _, s := range stores { store := s storeID := s.GetId() @@ -183,35 +183,10 @@ func (push *pushDown) pushBackup( progressCallBack(RegionUnit) } else { errPb := resp.GetError() - switch v := errPb.Detail.(type) { - case *backuppb.Error_KvError: - logutil.CL(ctx).Warn("backup occur kv error", zap.Reflect("error", v)) - - case *backuppb.Error_RegionError: - logutil.CL(ctx).Warn("backup occur region error", zap.Reflect("error", v)) - - case *backuppb.Error_ClusterIdError: - logutil.CL(ctx).Error("backup occur cluster ID error", zap.Reflect("error", v)) - return errors.Annotatef(berrors.ErrKVClusterIDMismatch, "%v", errPb) - default: - if utils.MessageIsRetryableStorageError(errPb.GetMsg()) { - logutil.CL(ctx).Warn("backup occur storage error", zap.String("error", errPb.GetMsg())) - continue - } - var errMsg string - if utils.MessageIsNotFoundStorageError(errPb.GetMsg()) { - errMsg = fmt.Sprintf("File or directory not found on TiKV Node (store id: %v; Address: %s). "+ - "work around:please ensure br and tikv nodes share a same storage and the user of br and tikv has same uid.", - store.GetId(), redact.String(store.GetAddress())) - logutil.CL(ctx).Error("", zap.String("error", berrors.ErrKVStorage.Error()+": "+errMsg)) - } - if utils.MessageIsPermissionDeniedStorageError(errPb.GetMsg()) { - errMsg = fmt.Sprintf("I/O permission denied error occurs on TiKV Node(store id: %v; Address: %s). "+ - "work around:please ensure tikv has permission to read from & write to the storage.", - store.GetId(), redact.String(store.GetAddress())) - logutil.CL(ctx).Error("", zap.String("error", berrors.ErrKVStorage.Error()+": "+errMsg)) - } - + res := errContext.HandleIgnorableError(errPb, store.GetId()) + switch res.Strategy { + case utils.GiveUpStrategy: + errMsg := res.Reason if len(errMsg) <= 0 { errMsg = errPb.Msg } @@ -220,6 +195,10 @@ func (push *pushDown) pushBackup( redact.String(store.GetAddress()), errMsg, ) + default: + // other type just continue for next response + // and finally handle the range in fineGrainedBackup + continue } } case err := <-push.errCh: diff --git a/br/pkg/backup/schema.go b/br/pkg/backup/schema.go index 1ad991aba5e50..27c301e22f531 100644 --- a/br/pkg/backup/schema.go +++ b/br/pkg/backup/schema.go @@ -40,6 +40,7 @@ type schemaInfo struct { totalKvs uint64 totalBytes uint64 stats *util.JSONTable + statsIndex []*backuppb.StatsFileIndex } type iterFuncTp func(kv.Storage, func(*model.DBInfo, *model.TableInfo)) error @@ -147,8 +148,10 @@ func (ss *Schemas) BackupSchemas( } } if statsHandle != nil { - if err := schema.dumpStatsToJSON(statsHandle, backupTS); err != nil { + statsWriter := metaWriter.NewStatsWriter() + if err := schema.dumpStatsToJSON(ctx, statsWriter, statsHandle, backupTS); err != nil { logger.Error("dump table stats failed", logutil.ShortError(err)) + return errors.Trace(err) } } } @@ -209,15 +212,19 @@ func (s *schemaInfo) calculateChecksum( return nil } -func (s *schemaInfo) dumpStatsToJSON(statsHandle *handle.Handle, backupTS uint64) error { +func (s *schemaInfo) dumpStatsToJSON(ctx context.Context, statsWriter *metautil.StatsWriter, statsHandle *handle.Handle, backupTS uint64) error { log.Info("dump stats to json", zap.Stringer("db", s.dbInfo.Name), zap.Stringer("table", s.tableInfo.Name)) - jsonTable, err := statsHandle.DumpStatsToJSONBySnapshot( - s.dbInfo.Name.String(), s.tableInfo, backupTS, true) - if err != nil { + if err := statsHandle.PersistStatsBySnapshot( + ctx, s.dbInfo.Name.String(), s.tableInfo, backupTS, statsWriter.BackupStats, + ); err != nil { return errors.Trace(err) } - s.stats = jsonTable + statsFileIndexes, err := statsWriter.BackupStatsDone(ctx) + if err != nil { + return errors.Trace(err) + } + s.statsIndex = statsFileIndexes return nil } @@ -249,5 +256,6 @@ func (s *schemaInfo) encodeToSchema() (*backuppb.Schema, error) { TotalKvs: s.totalKvs, TotalBytes: s.totalBytes, Stats: statsBytes, + StatsIndex: s.statsIndex, }, nil } diff --git a/br/pkg/backup/schema_test.go b/br/pkg/backup/schema_test.go index 87baf681ec58d..a0664a6fe6b55 100644 --- a/br/pkg/backup/schema_test.go +++ b/br/pkg/backup/schema_test.go @@ -243,7 +243,7 @@ func TestBuildBackupRangeAndSchemaWithBrokenStats(t *testing.T) { require.NoError(t, err) require.Len(t, schemas, 1) // the stats should be empty, but other than that everything should be backed up. - require.Nil(t, schemas[0].Stats) + require.Nil(t, schemas[0].StatsFileIndexes) require.NotZerof(t, schemas[0].Crc64Xor, "%v", schemas[0]) require.NotZerof(t, schemas[0].TotalKvs, "%v", schemas[0]) require.NotZerof(t, schemas[0].TotalBytes, "%v", schemas[0]) @@ -270,7 +270,7 @@ func TestBuildBackupRangeAndSchemaWithBrokenStats(t *testing.T) { schemas2 := GetSchemasFromMeta(t, es2) require.Len(t, schemas2, 1) // the stats should now be filled, and other than that the result should be equivalent to the first backup. - require.NotNil(t, schemas2[0].Stats) + require.True(t, len(schemas2[0].StatsFileIndexes[0].InlineData) > 0 || len(schemas2[0].StatsFileIndexes[0].Name) > 0) require.Equal(t, schemas[0].Crc64Xor, schemas2[0].Crc64Xor) require.Equal(t, schemas[0].TotalKvs, schemas2[0].TotalKvs) require.Equal(t, schemas[0].TotalBytes, schemas2[0].TotalBytes) diff --git a/br/pkg/checksum/main_test.go b/br/pkg/checksum/main_test.go index 8893f24fe6d29..d68585d6a152b 100644 --- a/br/pkg/checksum/main_test.go +++ b/br/pkg/checksum/main_test.go @@ -24,6 +24,7 @@ import ( func TestMain(m *testing.M) { opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("github.com/klauspost/compress/zstd.(*blockDec).startDecoder"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), diff --git a/br/pkg/conn/main_test.go b/br/pkg/conn/main_test.go index ee998da3e7499..23f0382f2d443 100644 --- a/br/pkg/conn/main_test.go +++ b/br/pkg/conn/main_test.go @@ -24,6 +24,7 @@ import ( func TestMain(m *testing.M) { opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), diff --git a/br/pkg/errors/errors.go b/br/pkg/errors/errors.go index 1c18f0b45fe6e..4000f574321c9 100644 --- a/br/pkg/errors/errors.go +++ b/br/pkg/errors/errors.go @@ -40,15 +40,19 @@ var ( ErrEnvNotSpecified = errors.Normalize("environment variable not found", errors.RFCCodeText("BR:Common:ErrEnvNotSpecified")) ErrUnsupportedOperation = errors.Normalize("the operation is not supported", errors.RFCCodeText("BR:Common:ErrUnsupportedOperation")) - ErrPDUpdateFailed = errors.Normalize("failed to update PD", errors.RFCCodeText("BR:PD:ErrPDUpdateFailed")) - ErrPDLeaderNotFound = errors.Normalize("PD leader not found", errors.RFCCodeText("BR:PD:ErrPDLeaderNotFound")) - ErrPDInvalidResponse = errors.Normalize("PD invalid response", errors.RFCCodeText("BR:PD:ErrPDInvalidResponse")) - ErrPDBatchScanRegion = errors.Normalize("batch scan region", errors.RFCCodeText("BR:PD:ErrPDBatchScanRegion")) + ErrPDUpdateFailed = errors.Normalize("failed to update PD", errors.RFCCodeText("BR:PD:ErrPDUpdateFailed")) + ErrPDLeaderNotFound = errors.Normalize("PD leader not found", errors.RFCCodeText("BR:PD:ErrPDLeaderNotFound")) + ErrPDInvalidResponse = errors.Normalize("PD invalid response", errors.RFCCodeText("BR:PD:ErrPDInvalidResponse")) + ErrPDBatchScanRegion = errors.Normalize("batch scan region", errors.RFCCodeText("BR:PD:ErrPDBatchScanRegion")) + ErrPDUnknownScatterResult = errors.Normalize("failed to wait region scattered", errors.RFCCodeText("BR:PD:ErrPDUknownScatterResult")) + ErrPDSplitFailed = errors.Normalize("failed to wait region splitted", errors.RFCCodeText("BR:PD:ErrPDUknownScatterResult")) ErrBackupChecksumMismatch = errors.Normalize("backup checksum mismatch", errors.RFCCodeText("BR:Backup:ErrBackupChecksumMismatch")) ErrBackupInvalidRange = errors.Normalize("backup range invalid", errors.RFCCodeText("BR:Backup:ErrBackupInvalidRange")) ErrBackupNoLeader = errors.Normalize("backup no leader", errors.RFCCodeText("BR:Backup:ErrBackupNoLeader")) ErrBackupGCSafepointExceeded = errors.Normalize("backup GC safepoint exceeded", errors.RFCCodeText("BR:Backup:ErrBackupGCSafepointExceeded")) + ErrBackupKeyIsLocked = errors.Normalize("backup key is locked", errors.RFCCodeText("BR:Backup:ErrBackupKeyIsLocked")) + ErrBackupRegion = errors.Normalize("backup region error", errors.RFCCodeText("BR:Backup:ErrBackupRegion")) ErrRestoreModeMismatch = errors.Normalize("restore mode mismatch", errors.RFCCodeText("BR:Restore:ErrRestoreModeMismatch")) ErrRestoreRangeMismatch = errors.Normalize("restore range mismatch", errors.RFCCodeText("BR:Restore:ErrRestoreRangeMismatch")) diff --git a/br/pkg/gluetidb/BUILD.bazel b/br/pkg/gluetidb/BUILD.bazel index 6ff71aa916e86..b639da451010d 100644 --- a/br/pkg/gluetidb/BUILD.bazel +++ b/br/pkg/gluetidb/BUILD.bazel @@ -14,9 +14,7 @@ go_library( "//pkg/domain", "//pkg/executor", "//pkg/kv", - "//pkg/meta/autoid", "//pkg/parser/model", - "//pkg/parser/mysql", "//pkg/session", "//pkg/session/types", "//pkg/sessionctx", @@ -33,17 +31,11 @@ go_test( srcs = ["glue_test.go"], embed = [":gluetidb"], flaky = True, - shard_count = 4, deps = [ "//br/pkg/glue", - "//pkg/ddl", - "//pkg/kv", - "//pkg/meta", "//pkg/parser/model", - "//pkg/sessionctx", "//pkg/testkit", "//pkg/types", - "@com_github_pingcap_failpoint//:failpoint", "@com_github_stretchr_testify//require", ], ) diff --git a/br/pkg/gluetidb/glue.go b/br/pkg/gluetidb/glue.go index c618281b4b2b3..84b3561d40484 100644 --- a/br/pkg/gluetidb/glue.go +++ b/br/pkg/gluetidb/glue.go @@ -3,9 +3,7 @@ package gluetidb import ( - "bytes" "context" - "strings" "time" "github.com/pingcap/errors" @@ -18,9 +16,7 @@ import ( "github.com/pingcap/tidb/pkg/domain" "github.com/pingcap/tidb/pkg/executor" "github.com/pingcap/tidb/pkg/kv" - "github.com/pingcap/tidb/pkg/meta/autoid" "github.com/pingcap/tidb/pkg/parser/model" - "github.com/pingcap/tidb/pkg/parser/mysql" "github.com/pingcap/tidb/pkg/session" sessiontypes "github.com/pingcap/tidb/pkg/session/types" "github.com/pingcap/tidb/pkg/sessionctx" @@ -34,11 +30,7 @@ var ( _ glue.Glue = Glue{} ) -const ( - defaultCapOfCreateTable = 512 - defaultCapOfCreateDatabase = 64 - brComment = `/*from(br)*/` -) +const brComment = `/*from(br)*/` // New makes a new tidb glue. func New() Glue { @@ -207,17 +199,7 @@ func (gs *tidbSession) ExecuteInternal(ctx context.Context, sql string, args ... // CreateDatabase implements glue.Session. func (gs *tidbSession) CreateDatabase(ctx context.Context, schema *model.DBInfo) error { - d := domain.GetDomain(gs.se).DDL() - query, err := gs.showCreateDatabase(schema) - if err != nil { - return errors.Trace(err) - } - gs.se.SetValue(sessionctx.QueryString, query) - schema = schema.Clone() - if len(schema.Charset) == 0 { - schema.Charset = mysql.DefaultCharset - } - return d.CreateSchemaWithInfo(gs.se, schema, ddl.OnExistIgnore) + return errors.Trace(executor.BRIECreateDatabase(gs.se, schema, brComment)) } // CreatePlacementPolicy implements glue.Session. @@ -228,95 +210,16 @@ func (gs *tidbSession) CreatePlacementPolicy(ctx context.Context, policy *model. return d.CreatePlacementPolicyWithInfo(gs.se, policy, ddl.OnExistIgnore) } -// SplitBatchCreateTable provide a way to split batch into small batch when batch size is large than 6 MB. -// The raft entry has limit size of 6 MB, a batch of CreateTables may hit this limitation -// TODO: shall query string be set for each split batch create, it looks does not matter if we set once for all. -func (gs *tidbSession) SplitBatchCreateTable(schema model.CIStr, - infos []*model.TableInfo, cs ...ddl.CreateTableWithInfoConfigurier) error { - var err error - d := domain.GetDomain(gs.se).DDL() - err = d.BatchCreateTableWithInfo(gs.se, schema, infos, append(cs, ddl.OnExistIgnore)...) - if kv.ErrEntryTooLarge.Equal(err) { - log.Info("entry too large, split batch create table", zap.Int("num table", len(infos))) - if len(infos) == 1 { - return err - } - mid := len(infos) / 2 - err = gs.SplitBatchCreateTable(schema, infos[:mid], cs...) - if err != nil { - return err - } - err = gs.SplitBatchCreateTable(schema, infos[mid:], cs...) - if err != nil { - return err - } - return nil - } - return err -} - // CreateTables implements glue.BatchCreateTableSession. func (gs *tidbSession) CreateTables(_ context.Context, tables map[string][]*model.TableInfo, cs ...ddl.CreateTableWithInfoConfigurier) error { - var dbName model.CIStr - - // Disable foreign key check when batch create tables. - gs.se.GetSessionVars().ForeignKeyChecks = false - for db, tablesInDB := range tables { - dbName = model.NewCIStr(db) - queryBuilder := strings.Builder{} - cloneTables := make([]*model.TableInfo, 0, len(tablesInDB)) - for _, table := range tablesInDB { - query, err := gs.showCreateTable(table) - if err != nil { - return errors.Trace(err) - } - - queryBuilder.WriteString(query) - queryBuilder.WriteString(";") - - table = table.Clone() - // Clone() does not clone partitions yet :( - if table.Partition != nil { - newPartition := *table.Partition - newPartition.Definitions = append([]model.PartitionDefinition{}, table.Partition.Definitions...) - table.Partition = &newPartition - } - cloneTables = append(cloneTables, table) - } - gs.se.SetValue(sessionctx.QueryString, queryBuilder.String()) - if err := gs.SplitBatchCreateTable(dbName, cloneTables, cs...); err != nil { - //It is possible to failure when TiDB does not support model.ActionCreateTables. - //In this circumstance, BatchCreateTableWithInfo returns errno.ErrInvalidDDLJob, - //we fall back to old way that creating table one by one - log.Warn("batch create table from tidb failure", zap.Error(err)) - return err - } - } - - return nil + return errors.Trace(executor.BRIECreateTables(gs.se, tables, brComment, cs...)) } // CreateTable implements glue.Session. func (gs *tidbSession) CreateTable(_ context.Context, dbName model.CIStr, table *model.TableInfo, cs ...ddl.CreateTableWithInfoConfigurier) error { - d := domain.GetDomain(gs.se).DDL() - query, err := gs.showCreateTable(table) - if err != nil { - return errors.Trace(err) - } - gs.se.SetValue(sessionctx.QueryString, query) - // Disable foreign key check when batch create tables. - gs.se.GetSessionVars().ForeignKeyChecks = false - // Clone() does not clone partitions yet :( - table = table.Clone() - if table.Partition != nil { - newPartition := *table.Partition - newPartition.Definitions = append([]model.PartitionDefinition{}, table.Partition.Definitions...) - table.Partition = &newPartition - } - - return d.CreateTableWithInfo(gs.se, dbName, table, append(cs, ddl.OnExistIgnore)...) + return errors.Trace(executor.BRIECreateTable(gs.se, dbName, table, brComment, cs...)) } // Close implements glue.Session. @@ -329,30 +232,6 @@ func (gs *tidbSession) GetGlobalVariable(name string) (string, error) { return gs.se.GetSessionVars().GlobalVarsAccessor.GetTiDBTableValue(name) } -// showCreateTable shows the result of SHOW CREATE TABLE from a TableInfo. -func (gs *tidbSession) showCreateTable(tbl *model.TableInfo) (string, error) { - table := tbl.Clone() - table.AutoIncID = 0 - result := bytes.NewBuffer(make([]byte, 0, defaultCapOfCreateTable)) - // this can never fail. - _, _ = result.WriteString(brComment) - if err := executor.ConstructResultOfShowCreateTable(gs.se, tbl, autoid.Allocators{}, result); err != nil { - return "", errors.Trace(err) - } - return result.String(), nil -} - -// showCreateDatabase shows the result of SHOW CREATE DATABASE from a dbInfo. -func (gs *tidbSession) showCreateDatabase(db *model.DBInfo) (string, error) { - result := bytes.NewBuffer(make([]byte, 0, defaultCapOfCreateDatabase)) - // this can never fail. - _, _ = result.WriteString(brComment) - if err := executor.ConstructResultOfShowCreateDatabase(gs.se, db, true, result); err != nil { - return "", errors.Trace(err) - } - return result.String(), nil -} - func (gs *tidbSession) showCreatePlacementPolicy(policy *model.PolicyInfo) string { return executor.ConstructResultOfShowCreatePlacementPolicy(policy) } diff --git a/br/pkg/gluetidb/glue_test.go b/br/pkg/gluetidb/glue_test.go index 8c4b3420dc669..1813a7b357b16 100644 --- a/br/pkg/gluetidb/glue_test.go +++ b/br/pkg/gluetidb/glue_test.go @@ -16,206 +16,15 @@ package gluetidb import ( "context" - "strconv" "testing" - "github.com/pingcap/failpoint" "github.com/pingcap/tidb/br/pkg/glue" - "github.com/pingcap/tidb/pkg/ddl" - "github.com/pingcap/tidb/pkg/kv" - "github.com/pingcap/tidb/pkg/meta" "github.com/pingcap/tidb/pkg/parser/model" - "github.com/pingcap/tidb/pkg/sessionctx" "github.com/pingcap/tidb/pkg/testkit" "github.com/pingcap/tidb/pkg/types" "github.com/stretchr/testify/require" ) -// batch create table with table id reused -func TestSplitBatchCreateTableWithTableId(t *testing.T) { - store, dom := testkit.CreateMockStoreAndDomain(t) - tk := testkit.NewTestKit(t, store) - tk.MustExec("use test") - tk.MustExec("drop table if exists table_id_resued1") - tk.MustExec("drop table if exists table_id_resued2") - tk.MustExec("drop table if exists table_id_new") - - d := dom.DDL() - require.NotNil(t, d) - - infos1 := []*model.TableInfo{} - infos1 = append(infos1, &model.TableInfo{ - ID: 124, - Name: model.NewCIStr("table_id_resued1"), - }) - infos1 = append(infos1, &model.TableInfo{ - ID: 125, - Name: model.NewCIStr("table_id_resued2"), - }) - - se := &tidbSession{se: tk.Session()} - - // keep/reused table id verification - tk.Session().SetValue(sessionctx.QueryString, "skip") - err := se.SplitBatchCreateTable(model.NewCIStr("test"), infos1, ddl.AllocTableIDIf(func(ti *model.TableInfo) bool { - return false - })) - require.NoError(t, err) - - tk.MustQuery("select tidb_table_id from information_schema.tables where table_name = 'table_id_resued1'"). - Check(testkit.Rows("124")) - tk.MustQuery("select tidb_table_id from information_schema.tables where table_name = 'table_id_resued2'"). - Check(testkit.Rows("125")) - ctx := kv.WithInternalSourceType(context.Background(), kv.InternalTxnOthers) - - // allocate new table id verification - // query the global id - var id int64 - err = kv.RunInNewTxn(ctx, store, true, func(_ context.Context, txn kv.Transaction) error { - m := meta.NewMeta(txn) - var err error - id, err = m.GenGlobalID() - return err - }) - - require.NoError(t, err) - - infos2 := []*model.TableInfo{} - infos2 = append(infos2, &model.TableInfo{ - ID: 124, - Name: model.NewCIStr("table_id_new"), - }) - - tk.Session().SetValue(sessionctx.QueryString, "skip") - err = se.SplitBatchCreateTable(model.NewCIStr("test"), infos2, ddl.AllocTableIDIf(func(ti *model.TableInfo) bool { - return true - })) - require.NoError(t, err) - - idGen, ok := tk.MustQuery( - "select tidb_table_id from information_schema.tables where table_name = 'table_id_new'"). - Rows()[0][0].(string) - require.True(t, ok) - idGenNum, err := strconv.ParseInt(idGen, 10, 64) - require.NoError(t, err) - require.Greater(t, idGenNum, id) - - // a empty table info with len(info3) = 0 - infos3 := []*model.TableInfo{} - - err = se.SplitBatchCreateTable(model.NewCIStr("test"), infos3, ddl.AllocTableIDIf(func(ti *model.TableInfo) bool { - return false - })) - require.NoError(t, err) -} - -// batch create table with table id reused -func TestSplitBatchCreateTable(t *testing.T) { - store, dom := testkit.CreateMockStoreAndDomain(t) - tk := testkit.NewTestKit(t, store) - tk.MustExec("use test") - tk.MustExec("drop table if exists table_1") - tk.MustExec("drop table if exists table_2") - tk.MustExec("drop table if exists table_3") - - d := dom.DDL() - require.NotNil(t, d) - - infos := []*model.TableInfo{} - infos = append(infos, &model.TableInfo{ - ID: 1234, - Name: model.NewCIStr("tables_1"), - }) - infos = append(infos, &model.TableInfo{ - ID: 1235, - Name: model.NewCIStr("tables_2"), - }) - infos = append(infos, &model.TableInfo{ - ID: 1236, - Name: model.NewCIStr("tables_3"), - }) - - se := &tidbSession{se: tk.Session()} - - // keep/reused table id verification - tk.Session().SetValue(sessionctx.QueryString, "skip") - require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/ddl/RestoreBatchCreateTableEntryTooLarge", "return(1)")) - err := se.SplitBatchCreateTable(model.NewCIStr("test"), infos, ddl.AllocTableIDIf(func(ti *model.TableInfo) bool { - return false - })) - - require.NoError(t, err) - tk.MustQuery("show tables like '%tables_%'").Check(testkit.Rows("tables_1", "tables_2", "tables_3")) - jobs := tk.MustQuery("admin show ddl jobs").Rows() - require.Greater(t, len(jobs), 3) - // check table_1 - job1 := jobs[0] - require.Equal(t, "test", job1[1]) - require.Equal(t, "tables_3", job1[2]) - require.Equal(t, "create tables", job1[3]) - require.Equal(t, "public", job1[4]) - - // check table_2 - job2 := jobs[1] - require.Equal(t, "test", job2[1]) - require.Equal(t, "tables_2", job2[2]) - require.Equal(t, "create tables", job2[3]) - require.Equal(t, "public", job2[4]) - - // check table_3 - job3 := jobs[2] - require.Equal(t, "test", job3[1]) - require.Equal(t, "tables_1", job3[2]) - require.Equal(t, "create tables", job3[3]) - require.Equal(t, "public", job3[4]) - - // check reused table id - tk.MustQuery("select tidb_table_id from information_schema.tables where table_name = 'tables_1'"). - Check(testkit.Rows("1234")) - tk.MustQuery("select tidb_table_id from information_schema.tables where table_name = 'tables_2'"). - Check(testkit.Rows("1235")) - tk.MustQuery("select tidb_table_id from information_schema.tables where table_name = 'tables_3'"). - Check(testkit.Rows("1236")) - - require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/ddl/RestoreBatchCreateTableEntryTooLarge")) -} - -// batch create table with table id reused -func TestSplitBatchCreateTableFailWithEntryTooLarge(t *testing.T) { - store, dom := testkit.CreateMockStoreAndDomain(t) - tk := testkit.NewTestKit(t, store) - tk.MustExec("use test") - tk.MustExec("drop table if exists table_1") - tk.MustExec("drop table if exists table_2") - tk.MustExec("drop table if exists table_3") - - d := dom.DDL() - require.NotNil(t, d) - - infos := []*model.TableInfo{} - infos = append(infos, &model.TableInfo{ - Name: model.NewCIStr("tables_1"), - }) - infos = append(infos, &model.TableInfo{ - Name: model.NewCIStr("tables_2"), - }) - infos = append(infos, &model.TableInfo{ - Name: model.NewCIStr("tables_3"), - }) - - se := &tidbSession{se: tk.Session()} - - tk.Session().SetValue(sessionctx.QueryString, "skip") - require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/ddl/RestoreBatchCreateTableEntryTooLarge", "return(0)")) - err := se.SplitBatchCreateTable(model.NewCIStr("test"), infos, ddl.AllocTableIDIf(func(ti *model.TableInfo) bool { - return true - })) - - require.True(t, kv.ErrEntryTooLarge.Equal(err)) - - require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/ddl/RestoreBatchCreateTableEntryTooLarge")) -} - func TestTheSessionIsoation(t *testing.T) { req := require.New(t) store := testkit.CreateMockStore(t) diff --git a/br/pkg/lightning/BUILD.bazel b/br/pkg/lightning/BUILD.bazel index b2f8c1bbd24f5..09ad2f9d45684 100644 --- a/br/pkg/lightning/BUILD.bazel +++ b/br/pkg/lightning/BUILD.bazel @@ -35,10 +35,12 @@ go_library( "@com_github_pingcap_errors//:errors", "@com_github_pingcap_failpoint//:failpoint", "@com_github_pingcap_kvproto//pkg/import_sstpb", + "@com_github_pingcap_kvproto//pkg/metapb", "@com_github_prometheus_client_golang//prometheus", "@com_github_prometheus_client_golang//prometheus/collectors", "@com_github_prometheus_client_golang//prometheus/promhttp", "@com_github_shurcool_httpgzip//:httpgzip", + "@com_github_tikv_pd_client//http", "@org_uber_go_atomic//:atomic", "@org_uber_go_zap//:zap", "@org_uber_go_zap//zapcore", diff --git a/br/pkg/lightning/backend/backend.go b/br/pkg/lightning/backend/backend.go index 026dda56e8744..3cbae8a97cdb2 100644 --- a/br/pkg/lightning/backend/backend.go +++ b/br/pkg/lightning/backend/backend.go @@ -99,6 +99,9 @@ type LocalEngineConfig struct { CompactThreshold int64 // compact routine concurrency CompactConcurrency int + + // blocksize + BlockSize int } // ExternalEngineConfig is the configuration used for local backend external engine. diff --git a/br/pkg/lightning/backend/external/BUILD.bazel b/br/pkg/lightning/backend/external/BUILD.bazel index 0280abc26c41a..9f1b80d6b453a 100644 --- a/br/pkg/lightning/backend/external/BUILD.bazel +++ b/br/pkg/lightning/backend/external/BUILD.bazel @@ -11,9 +11,12 @@ go_library( "iter.go", "kv_reader.go", "merge.go", + "merge_v2.go", "onefile_writer.go", + "reader.go", "split.go", "stat_reader.go", + "testutil.go", "util.go", "writer.go", ], @@ -37,8 +40,10 @@ go_library( "@com_github_cockroachdb_pebble//:pebble", "@com_github_docker_go_units//:go-units", "@com_github_google_uuid//:uuid", + "@com_github_jfcg_sorty_v2//:sorty", "@com_github_pingcap_errors//:errors", "@com_github_pingcap_failpoint//:failpoint", + "@com_github_stretchr_testify//require", "@org_golang_x_sync//errgroup", "@org_uber_go_atomic//:atomic", "@org_uber_go_zap//:zap", @@ -57,18 +62,20 @@ go_test( "engine_test.go", "file_test.go", "iter_test.go", - "merge_test.go", "onefile_writer_test.go", + "reader_test.go", + "sort_test.go", "split_test.go", "util_test.go", "writer_test.go", ], embed = [":external"], flaky = True, - shard_count = 49, + shard_count = 50, deps = [ "//br/pkg/lightning/backend/kv", "//br/pkg/lightning/common", + "//br/pkg/lightning/log", "//br/pkg/membuf", "//br/pkg/storage", "//pkg/kv", @@ -81,6 +88,9 @@ go_test( "@com_github_aws_aws_sdk_go//aws/session", "@com_github_aws_aws_sdk_go//service/s3", "@com_github_cockroachdb_pebble//:pebble", + "@com_github_docker_go_units//:go-units", + "@com_github_felixge_fgprof//:fgprof", + "@com_github_google_uuid//:uuid", "@com_github_jfcg_sorty_v2//:sorty", "@com_github_johannesboyne_gofakes3//:gofakes3", "@com_github_johannesboyne_gofakes3//backend/s3mem", @@ -91,5 +101,6 @@ go_test( "@org_golang_x_exp//rand", "@org_golang_x_sync//errgroup", "@org_uber_go_atomic//:atomic", + "@org_uber_go_zap//:zap", ], ) diff --git a/br/pkg/lightning/backend/external/bench_test.go b/br/pkg/lightning/backend/external/bench_test.go index 12378cd8707ee..d88ba07b2b642 100644 --- a/br/pkg/lightning/backend/external/bench_test.go +++ b/br/pkg/lightning/backend/external/bench_test.go @@ -19,15 +19,26 @@ import ( "flag" "fmt" "io" + "math" + "math/rand" "os" + "runtime" "runtime/pprof" + "slices" "sync" "testing" "time" + "github.com/docker/go-units" + "github.com/felixge/fgprof" "github.com/pingcap/tidb/br/pkg/storage" "github.com/pingcap/tidb/pkg/kv" "github.com/pingcap/tidb/pkg/util/intest" + "github.com/pingcap/tidb/pkg/util/logutil" + "github.com/pingcap/tidb/pkg/util/size" + "github.com/stretchr/testify/require" + "go.uber.org/atomic" + "go.uber.org/zap" "golang.org/x/sync/errgroup" ) @@ -37,10 +48,8 @@ func openTestingStorage(t *testing.T) storage.ExternalStorage { if *testingStorageURI == "" { t.Skip("testingStorageURI is not set") } - b, err := storage.ParseBackend(*testingStorageURI, nil) - intest.Assert(err == nil) - s, err := storage.New(context.Background(), b, nil) - intest.Assert(err == nil) + s, err := storage.NewFromURL(context.Background(), *testingStorageURI) + require.NoError(t, err) return s } @@ -49,69 +58,234 @@ type kvSource interface { outputSize() int } -type ascendingKeySource struct { - keySize, valueSize int - count int - kvChan chan [2][]byte - curKey []byte - totalSize int -} - -func newAscendingKeySource(keySize, valueSize, count int) *ascendingKeySource { - s := &ascendingKeySource{keySize: keySize, valueSize: valueSize, count: count} - s.curKey = make([]byte, keySize) - s.kvChan = make(chan [2][]byte, 100) - s.run() - return s +type ascendingKeyGenerator struct { + keySize int + keyCommonPrefix []byte + count int + curKey []byte + keyOutCh chan []byte +} + +func generateAscendingKey( + count int, + keySize int, + keyCommonPrefix []byte, +) chan []byte { + c := &ascendingKeyGenerator{ + keySize: keySize, + count: count, + keyCommonPrefix: keyCommonPrefix, + keyOutCh: make(chan []byte, 100), + } + c.curKey = make([]byte, keySize) + copy(c.curKey, keyCommonPrefix) + c.run() + return c.keyOutCh } -func (s *ascendingKeySource) run() { +func (c *ascendingKeyGenerator) run() { + keyCommonPrefixSize := len(c.keyCommonPrefix) + incSuffixLen := int(math.Ceil(math.Log2(float64(c.count)) / 8)) + if c.keySize-keyCommonPrefixSize < incSuffixLen { + panic(fmt.Sprintf("key size %d is too small, keyCommonPrefixSize: %d, incSuffixLen: %d", + c.keySize, keyCommonPrefixSize, incSuffixLen)) + } + go func() { - defer close(s.kvChan) - for i := 0; i < s.count; i++ { - for j := len(s.curKey) - 1; j >= 0; j-- { - s.curKey[j]++ - if s.curKey[j] != 0 { + defer close(c.keyOutCh) + for i := 0; i < c.count; i++ { + // ret to use most left bytes to alternate the key + for j := keyCommonPrefixSize + incSuffixLen - 1; j >= keyCommonPrefixSize; j-- { + c.curKey[j]++ + if c.curKey[j] != 0 { break } } - key := make([]byte, s.keySize) - copy(key, s.curKey) - value := make([]byte, s.valueSize) - s.kvChan <- [2][]byte{key, value} - s.totalSize += len(key) + len(value) + c.keyOutCh <- slices.Clone(c.curKey) } }() } +type ascendingKeySource struct { + valueSize int + keys [][]byte + keysIdx int + totalSize int +} + +func newAscendingKeySource( + count int, + keySize int, + valueSize int, + keyCommonPrefix []byte, +) *ascendingKeySource { + keyCh := generateAscendingKey(count, keySize, keyCommonPrefix) + s := &ascendingKeySource{ + valueSize: valueSize, + keys: make([][]byte, count), + } + for i := 0; i < count; i++ { + key := <-keyCh + s.keys[i] = key + s.totalSize += len(key) + valueSize + } + return s +} + func (s *ascendingKeySource) next() (key, value []byte, handle kv.Handle) { - pair, ok := <-s.kvChan - if !ok { + if s.keysIdx >= len(s.keys) { return nil, nil, nil } - return pair[0], pair[1], nil + key = s.keys[s.keysIdx] + s.keysIdx++ + return key, make([]byte, s.valueSize), nil } func (s *ascendingKeySource) outputSize() int { return s.totalSize } +type ascendingKeyAsyncSource struct { + valueSize int + keyOutCh chan []byte + totalSize int +} + +func newAscendingKeyAsyncSource( + count int, + keySize int, + valueSize int, + keyCommonPrefix []byte, +) *ascendingKeyAsyncSource { + s := &ascendingKeyAsyncSource{ + valueSize: valueSize, + keyOutCh: generateAscendingKey(count, keySize, keyCommonPrefix), + } + return s +} + +func (s *ascendingKeyAsyncSource) next() (key, value []byte, handle kv.Handle) { + key, ok := <-s.keyOutCh + if !ok { + return nil, nil, nil + } + s.totalSize += len(key) + s.valueSize + return key, make([]byte, s.valueSize), nil +} + +func (s *ascendingKeyAsyncSource) outputSize() int { + return s.totalSize +} + +type randomKeyGenerator struct { + keySize int + keyCommonPrefix []byte + rnd *rand.Rand + count int + curKey []byte + keyOutCh chan []byte +} + +func generateRandomKey( + count int, + keySize int, + keyCommonPrefix []byte, + seed int, +) chan []byte { + c := &randomKeyGenerator{ + keySize: keySize, + count: count, + keyCommonPrefix: keyCommonPrefix, + rnd: rand.New(rand.NewSource(int64(seed))), + keyOutCh: make(chan []byte, 100), + } + c.curKey = make([]byte, keySize) + copy(c.curKey, keyCommonPrefix) + c.run() + return c.keyOutCh +} + +func (c *randomKeyGenerator) run() { + keyCommonPrefixSize := len(c.keyCommonPrefix) + incSuffixLen := int(math.Ceil(math.Log2(float64(c.count)) / 8)) + randomLen := c.keySize - keyCommonPrefixSize - incSuffixLen + if randomLen < 0 { + panic(fmt.Sprintf("key size %d is too small, keyCommonPrefixSize: %d, incSuffixLen: %d", + c.keySize, keyCommonPrefixSize, incSuffixLen)) + } + + go func() { + defer close(c.keyOutCh) + for i := 0; i < c.count; i++ { + c.rnd.Read(c.curKey[keyCommonPrefixSize : keyCommonPrefixSize+randomLen]) + for j := len(c.curKey) - 1; j >= keyCommonPrefixSize+randomLen; j-- { + c.curKey[j]++ + if c.curKey[j] != 0 { + break + } + } + c.keyOutCh <- slices.Clone(c.curKey) + } + }() +} + +type randomKeySource struct { + valueSize int + keys [][]byte + keysIdx int + totalSize int +} + +func newRandomKeySource( + count int, + keySize int, + valueSize int, + keyCommonPrefix []byte, + seed int, +) *randomKeySource { + keyCh := generateRandomKey(count, keySize, keyCommonPrefix, seed) + s := &randomKeySource{ + valueSize: valueSize, + keys: make([][]byte, count), + } + for i := 0; i < count; i++ { + key := <-keyCh + s.keys[i] = key + s.totalSize += len(key) + valueSize + } + return s +} + +func (s *randomKeySource) next() (key, value []byte, handle kv.Handle) { + if s.keysIdx >= len(s.keys) { + return nil, nil, nil + } + key = s.keys[s.keysIdx] + s.keysIdx++ + return key, make([]byte, s.valueSize), nil +} + +func (s *randomKeySource) outputSize() int { + return s.totalSize +} + type writeTestSuite struct { store storage.ExternalStorage source kvSource memoryLimit int beforeCreateWriter func() - beforeWriterClose func() afterWriterClose func() } func writePlainFile(s *writeTestSuite) { ctx := context.Background() + filePath := "/test/writer" + _ = s.store.DeleteFile(ctx, filePath) buf := make([]byte, s.memoryLimit) offset := 0 flush := func(w storage.ExternalFileWriter) { n, err := w.Write(ctx, buf[:offset]) - intest.Assert(err == nil) + intest.AssertNoError(err) intest.Assert(offset == n) offset = 0 } @@ -119,8 +293,8 @@ func writePlainFile(s *writeTestSuite) { if s.beforeCreateWriter != nil { s.beforeCreateWriter() } - writer, err := s.store.Create(ctx, "test/plain_file", nil) - intest.Assert(err == nil) + writer, err := s.store.Create(ctx, filePath, nil) + intest.AssertNoError(err) key, val, _ := s.source.next() for key != nil { if offset+len(key)+len(val) > len(buf) { @@ -131,36 +305,41 @@ func writePlainFile(s *writeTestSuite) { key, val, _ = s.source.next() } flush(writer) - if s.beforeWriterClose != nil { - s.beforeWriterClose() - } err = writer.Close(ctx) - intest.Assert(err == nil) + intest.AssertNoError(err) if s.afterWriterClose != nil { s.afterWriterClose() } } +func cleanOldFiles(ctx context.Context, store storage.ExternalStorage, subDir string) { + dataFiles, statFiles, err := GetAllFileNames(ctx, store, subDir) + intest.AssertNoError(err) + err = store.DeleteFiles(ctx, dataFiles) + intest.AssertNoError(err) + err = store.DeleteFiles(ctx, statFiles) + intest.AssertNoError(err) +} + func writeExternalFile(s *writeTestSuite) { ctx := context.Background() + filePath := "/test/writer" + cleanOldFiles(ctx, s.store, filePath) builder := NewWriterBuilder(). SetMemorySizeLimit(uint64(s.memoryLimit)) if s.beforeCreateWriter != nil { s.beforeCreateWriter() } - writer := builder.Build(s.store, "test/external", "writerID") + writer := builder.Build(s.store, filePath, "writerID") key, val, h := s.source.next() for key != nil { err := writer.WriteRow(ctx, key, val, h) - intest.Assert(err == nil) + intest.AssertNoError(err) key, val, h = s.source.next() } - if s.beforeWriterClose != nil { - s.beforeWriterClose() - } err := writer.Close(ctx) - intest.Assert(err == nil) + intest.AssertNoError(err) if s.afterWriterClose != nil { s.afterWriterClose() } @@ -168,6 +347,8 @@ func writeExternalFile(s *writeTestSuite) { func writeExternalOneFile(s *writeTestSuite) { ctx := context.Background() + filePath := "/test/writer" + cleanOldFiles(ctx, s.store, filePath) builder := NewWriterBuilder(). SetMemorySizeLimit(uint64(s.memoryLimit)) @@ -175,182 +356,261 @@ func writeExternalOneFile(s *writeTestSuite) { s.beforeCreateWriter() } writer := builder.BuildOneFile( - s.store, "test/external", "writerID") - _ = writer.Init(ctx, 20*1024*1024) + s.store, filePath, "writerID") + intest.AssertNoError(writer.Init(ctx, 20*1024*1024)) key, val, _ := s.source.next() for key != nil { err := writer.WriteRow(ctx, key, val) intest.AssertNoError(err) key, val, _ = s.source.next() } - if s.beforeWriterClose != nil { - s.beforeWriterClose() - } - err := writer.Close(ctx) - intest.AssertNoError(err) + intest.AssertNoError(writer.Close(ctx)) if s.afterWriterClose != nil { s.afterWriterClose() } } +func recordHeapForMaxInUse(filename string) (chan struct{}, *sync.WaitGroup) { + doneCh := make(chan struct{}) + var wg sync.WaitGroup + wg.Add(1) + maxInUse := uint64(0) + go func() { + defer wg.Done() + + var m runtime.MemStats + ticker := time.NewTicker(300 * time.Millisecond) + defer ticker.Stop() + + for { + select { + case <-doneCh: + return + case <-ticker.C: + runtime.ReadMemStats(&m) + if m.HeapInuse <= maxInUse { + continue + } + maxInUse = m.HeapInuse + file, err := os.Create(filename) + intest.AssertNoError(err) + err = pprof.WriteHeapProfile(file) + intest.AssertNoError(err) + err = file.Close() + intest.AssertNoError(err) + } + } + }() + return doneCh, &wg +} + +// TestCompareWriter should be run like +// go test ./br/pkg/lightning/backend/external -v -timeout=1h --tags=intest -test.run TestCompareWriter --testing-storage-uri="s3://xxx". func TestCompareWriter(t *testing.T) { - store := openTestingStorage(t) - sourceKVNum := 10000000 - source := newAscendingKeySource(20, 100, sourceKVNum) - memoryLimit := 64 * 1024 * 1024 - fileIdx := 0 + externalStore := openTestingStorage(t) + expectedKVSize := 2 * 1024 * 1024 * 1024 + memoryLimit := 256 * 1024 * 1024 + testIdx := 0 + seed := time.Now().Nanosecond() + t.Logf("random seed: %d", seed) var ( + err error now time.Time elapsed time.Duration - file *os.File - err error + + fileCPU *os.File + cpuProfCloser func() error + + filenameHeap string + heapProfDoneCh chan struct{} + heapWg *sync.WaitGroup ) beforeTest := func() { - fileIdx++ - file, err = os.Create(fmt.Sprintf("cpu-profile-%d.prof", fileIdx)) - intest.Assert(err == nil) - err = pprof.StartCPUProfile(file) - intest.Assert(err == nil) + testIdx++ + fileCPU, err = os.Create(fmt.Sprintf("cpu-profile-%d.prof", testIdx)) + intest.AssertNoError(err) + cpuProfCloser = fgprof.Start(fileCPU, fgprof.FormatPprof) + + filenameHeap = fmt.Sprintf("heap-profile-%d.prof", testIdx) + heapProfDoneCh, heapWg = recordHeapForMaxInUse(filenameHeap) + now = time.Now() } - beforeClose := func() { - file, err = os.Create(fmt.Sprintf("heap-profile-%d.prof", fileIdx)) - intest.Assert(err == nil) - // check heap profile to see the memory usage is expected - err = pprof.WriteHeapProfile(file) - intest.Assert(err == nil) - } afterClose := func() { elapsed = time.Since(now) - pprof.StopCPUProfile() + err = cpuProfCloser() + intest.AssertNoError(err) + close(heapProfDoneCh) + heapWg.Wait() } suite := &writeTestSuite{ - store: store, - source: source, memoryLimit: memoryLimit, beforeCreateWriter: beforeTest, - beforeWriterClose: beforeClose, afterWriterClose: afterClose, } - writePlainFile(suite) - baseSpeed := float64(source.outputSize()) / elapsed.Seconds() / 1024 / 1024 - t.Logf("base speed for %d bytes: %.2f MB/s", source.outputSize(), baseSpeed) + stores := map[string]storage.ExternalStorage{ + "external store": externalStore, + "memory store": storage.NewMemStorage(), + } + writerTestFn := map[string]func(*writeTestSuite){ + "plain file": writePlainFile, + "external file": writeExternalFile, + "external one file": writeExternalOneFile, + } - suite.source = newAscendingKeySource(20, 100, sourceKVNum) - writeExternalFile(suite) - writerSpeed := float64(source.outputSize()) / elapsed.Seconds() / 1024 / 1024 - t.Logf("writer speed for %d bytes: %.2f MB/s", source.outputSize(), writerSpeed) + // not much difference between size 3 & 10 + keyCommonPrefix := []byte{1, 2, 3} - suite.source = newAscendingKeySource(20, 100, sourceKVNum) - writeExternalOneFile(suite) - writerSpeed = float64(source.outputSize()) / elapsed.Seconds() / 1024 / 1024 - t.Logf("one file writer speed for %d bytes: %.2f MB/s", source.outputSize(), writerSpeed) + for _, kvSize := range [][2]int{{20, 1000}, {20, 100}, {20, 10}} { + expectedKVNum := expectedKVSize / (kvSize[0] + kvSize[1]) + sources := map[string]func() kvSource{} + sources["ascending key"] = func() kvSource { + return newAscendingKeySource(expectedKVNum, kvSize[0], kvSize[1], keyCommonPrefix) + } + sources["random key"] = func() kvSource { + return newRandomKeySource(expectedKVNum, kvSize[0], kvSize[1], keyCommonPrefix, seed) + } + for sourceName, sourceGetter := range sources { + for storeName, store := range stores { + for writerName, fn := range writerTestFn { + if writerName == "plain file" && storeName == "external store" { + // about 27MB/s + continue + } + suite.store = store + source := sourceGetter() + suite.source = source + t.Logf("test %d: %s, %s, %s, key size: %d, value size: %d", + testIdx+1, sourceName, storeName, writerName, kvSize[0], kvSize[1]) + fn(suite) + speed := float64(source.outputSize()) / elapsed.Seconds() / 1024 / 1024 + t.Logf("test %d: speed for %d bytes: %.2f MB/s", testIdx, source.outputSize(), speed) + suite.source = nil + } + } + } + } } type readTestSuite struct { store storage.ExternalStorage + subDir string totalKVCnt int concurrency int memoryLimit int + mergeIterHotspot bool beforeCreateReader func() - beforeReaderClose func() afterReaderClose func() } -func readFileSequential(s *readTestSuite) { +func readFileSequential(t *testing.T, s *readTestSuite) { ctx := context.Background() - files, _, err := GetAllFileNames(ctx, s.store, "evenly_distributed") - intest.Assert(err == nil) + files, _, err := GetAllFileNames(ctx, s.store, "/"+s.subDir) + intest.AssertNoError(err) buf := make([]byte, s.memoryLimit) if s.beforeCreateReader != nil { s.beforeCreateReader() } - for i, file := range files { + var totalFileSize atomic.Int64 + startTime := time.Now() + for _, file := range files { reader, err := s.store.Open(ctx, file, nil) - intest.Assert(err == nil) - _, err = reader.Read(buf) - for err == nil { - _, err = reader.Read(buf) - } - intest.Assert(err == io.EOF) - if i == len(files)-1 { - if s.beforeReaderClose != nil { - s.beforeReaderClose() + intest.AssertNoError(err) + var sz int + for { + n, err := reader.Read(buf) + sz += n + if err != nil { + break } } + intest.Assert(err == io.EOF) + totalFileSize.Add(int64(sz)) err = reader.Close() - intest.Assert(err == nil) + intest.AssertNoError(err) } if s.afterReaderClose != nil { s.afterReaderClose() } + t.Logf( + "sequential read speed for %s bytes(%d files): %s/s", + units.BytesSize(float64(totalFileSize.Load())), + len(files), + units.BytesSize(float64(totalFileSize.Load())/time.Since(startTime).Seconds()), + ) } -func readFileConcurrently(s *readTestSuite) { +func readFileConcurrently(t *testing.T, s *readTestSuite) { ctx := context.Background() - files, _, err := GetAllFileNames(ctx, s.store, "evenly_distributed") - intest.Assert(err == nil) + files, _, err := GetAllFileNames(ctx, s.store, "/"+s.subDir) + intest.AssertNoError(err) conc := min(s.concurrency, len(files)) var eg errgroup.Group eg.SetLimit(conc) - var once sync.Once if s.beforeCreateReader != nil { s.beforeCreateReader() } - for _, file := range files { + var totalFileSize atomic.Int64 + startTime := time.Now() + for i := range files { + file := files[i] eg.Go(func() error { buf := make([]byte, s.memoryLimit/conc) reader, err := s.store.Open(ctx, file, nil) - intest.Assert(err == nil) - _, err = reader.Read(buf) - for err == nil { - _, err = reader.Read(buf) + intest.AssertNoError(err) + var sz int + for { + n, err := reader.Read(buf) + sz += n + if err != nil { + break + } } intest.Assert(err == io.EOF) - once.Do(func() { - if s.beforeReaderClose != nil { - s.beforeReaderClose() - } - }) + totalFileSize.Add(int64(sz)) err = reader.Close() - intest.Assert(err == nil) + intest.AssertNoError(err) return nil }) } err = eg.Wait() - intest.Assert(err == nil) + intest.AssertNoError(err) if s.afterReaderClose != nil { s.afterReaderClose() } + totalDur := time.Since(startTime) + t.Logf( + "concurrent read speed for %s bytes(%d files): %s/s, total-dur=%s", + units.BytesSize(float64(totalFileSize.Load())), + len(files), + units.BytesSize(float64(totalFileSize.Load())/totalDur.Seconds()), totalDur, + ) } func createEvenlyDistributedFiles( - t *testing.T, + store storage.ExternalStorage, fileSize, fileCount int, -) (storage.ExternalStorage, int) { - store := openTestingStorage(t) + subDir string, +) (int, kv.Key, kv.Key) { ctx := context.Background() - files, statFiles, err := GetAllFileNames(ctx, store, "evenly_distributed") - intest.Assert(err == nil) - err = store.DeleteFiles(ctx, files) - intest.Assert(err == nil) - err = store.DeleteFiles(ctx, statFiles) - intest.Assert(err == nil) + cleanOldFiles(ctx, store, "/"+subDir) value := make([]byte, 100) kvCnt := 0 + var minKey, maxKey kv.Key for i := 0; i < fileCount; i++ { builder := NewWriterBuilder(). + SetBlockSize(10 * 1024 * 1024). SetMemorySizeLimit(uint64(float64(fileSize) * 1.1)) writer := builder.Build( store, - "evenly_distributed", + "/"+subDir, fmt.Sprintf("%d", i), ) @@ -358,79 +618,99 @@ func createEvenlyDistributedFiles( totalSize := 0 for totalSize < fileSize { key := fmt.Sprintf("key_%09d", keyIdx) + if len(minKey) == 0 && len(maxKey) == 0 { + minKey = []byte(key) + maxKey = []byte(key) + } else { + minKey = BytesMin(minKey, []byte(key)) + maxKey = BytesMax(maxKey, []byte(key)) + } err := writer.WriteRow(ctx, []byte(key), value, nil) - intest.Assert(err == nil) + intest.AssertNoError(err) keyIdx += fileCount totalSize += len(key) + len(value) kvCnt++ } err := writer.Close(ctx) - intest.Assert(err == nil) + intest.AssertNoError(err) } - return store, kvCnt + return kvCnt, minKey, maxKey } -func readMergeIter(s *readTestSuite) { +func readMergeIter(t *testing.T, s *readTestSuite) { ctx := context.Background() - files, _, err := GetAllFileNames(ctx, s.store, "evenly_distributed") - intest.Assert(err == nil) + files, _, err := GetAllFileNames(ctx, s.store, "/"+s.subDir) + intest.AssertNoError(err) if s.beforeCreateReader != nil { s.beforeCreateReader() } + startTime := time.Now() + var totalSize int readBufSize := s.memoryLimit / len(files) zeroOffsets := make([]uint64, len(files)) - iter, err := NewMergeKVIter(ctx, files, zeroOffsets, s.store, readBufSize, false) - intest.Assert(err == nil) + iter, err := NewMergeKVIter(ctx, files, zeroOffsets, s.store, readBufSize, s.mergeIterHotspot, 0) + intest.AssertNoError(err) kvCnt := 0 for iter.Next() { kvCnt++ - if kvCnt == s.totalKVCnt/2 { - if s.beforeReaderClose != nil { - s.beforeReaderClose() - } - } + totalSize += len(iter.Key()) + len(iter.Value()) + lengthBytes*2 } intest.Assert(kvCnt == s.totalKVCnt) err = iter.Close() - intest.Assert(err == nil) + intest.AssertNoError(err) if s.afterReaderClose != nil { s.afterReaderClose() } + t.Logf( + "merge iter read (hotspot=%t) speed for %s bytes: %s/s", + s.mergeIterHotspot, + units.BytesSize(float64(totalSize)), + units.BytesSize(float64(totalSize)/time.Since(startTime).Seconds()), + ) } -func TestCompareReader(t *testing.T) { +func TestCompareReaderEvenlyDistributedContent(t *testing.T) { fileSize := 50 * 1024 * 1024 fileCnt := 24 - store, kvCnt := createEvenlyDistributedFiles(t, fileSize, fileCnt) + subDir := "evenly_distributed" + store := openTestingStorage(t) + + kvCnt, _, _ := createEvenlyDistributedFiles(store, fileSize, fileCnt, subDir) memoryLimit := 64 * 1024 * 1024 fileIdx := 0 + var ( + err error now time.Time elapsed time.Duration - file *os.File - err error + + fileCPU *os.File + cpuProfCloser func() error + + filenameHeap string + heapProfDoneCh chan struct{} + heapWg *sync.WaitGroup ) beforeTest := func() { fileIdx++ - file, err = os.Create(fmt.Sprintf("cpu-profile-%d.prof", fileIdx)) - intest.Assert(err == nil) - err = pprof.StartCPUProfile(file) - intest.Assert(err == nil) + fileCPU, err = os.Create(fmt.Sprintf("cpu-profile-%d.prof", fileIdx)) + intest.AssertNoError(err) + cpuProfCloser = fgprof.Start(fileCPU, fgprof.FormatPprof) + + filenameHeap = fmt.Sprintf("heap-profile-%d.prof", fileIdx) + heapProfDoneCh, heapWg = recordHeapForMaxInUse(filenameHeap) + now = time.Now() } - beforeClose := func() { - file, err = os.Create(fmt.Sprintf("heap-profile-%d.prof", fileIdx)) - intest.Assert(err == nil) - // check heap profile to see the memory usage is expected - err = pprof.WriteHeapProfile(file) - intest.Assert(err == nil) - } afterClose := func() { elapsed = time.Since(now) - pprof.StopCPUProfile() + err = cpuProfCloser() + intest.AssertNoError(err) + close(heapProfDoneCh) + heapWg.Wait() } suite := &readTestSuite{ @@ -439,27 +719,404 @@ func TestCompareReader(t *testing.T) { concurrency: 100, memoryLimit: memoryLimit, beforeCreateReader: beforeTest, - beforeReaderClose: beforeClose, afterReaderClose: afterClose, + subDir: subDir, } - readFileSequential(suite) + + readFileSequential(t, suite) t.Logf( "sequential read speed for %d bytes: %.2f MB/s", fileSize*fileCnt, float64(fileSize*fileCnt)/elapsed.Seconds()/1024/1024, ) - readFileConcurrently(suite) + readFileConcurrently(t, suite) t.Logf( "concurrent read speed for %d bytes: %.2f MB/s", fileSize*fileCnt, float64(fileSize*fileCnt)/elapsed.Seconds()/1024/1024, ) - readMergeIter(suite) + readMergeIter(t, suite) t.Logf( "merge iter read speed for %d bytes: %.2f MB/s", fileSize*fileCnt, float64(fileSize*fileCnt)/elapsed.Seconds()/1024/1024, ) } + +func createAscendingFiles( + store storage.ExternalStorage, + fileSize, fileCount int, + subDir string, +) (int, kv.Key, kv.Key) { + ctx := context.Background() + + cleanOldFiles(ctx, store, "/"+subDir) + + keyIdx := 0 + value := make([]byte, 100) + kvCnt := 0 + var minKey, maxKey kv.Key + for i := 0; i < fileCount; i++ { + builder := NewWriterBuilder(). + SetMemorySizeLimit(uint64(float64(fileSize) * 1.1)) + writer := builder.Build( + store, + "/"+subDir, + fmt.Sprintf("%d", i), + ) + + totalSize := 0 + var key string + for totalSize < fileSize { + key = fmt.Sprintf("key_%09d", keyIdx) + if i == 0 && totalSize == 0 { + minKey = []byte(key) + } + err := writer.WriteRow(ctx, []byte(key), value, nil) + intest.AssertNoError(err) + keyIdx++ + totalSize += len(key) + len(value) + kvCnt++ + } + if i == fileCount-1 { + maxKey = []byte(key) + } + err := writer.Close(ctx) + intest.AssertNoError(err) + } + return kvCnt, minKey, maxKey +} + +var ( + objectPrefix = flag.String("object-prefix", "ascending", "object prefix") + fileSize = flag.Int("file-size", 50*units.MiB, "file size") + fileCount = flag.Int("file-count", 24, "file count") + concurrency = flag.Int("concurrency", 100, "concurrency") + memoryLimit = flag.Int("memory-limit", 64*units.MiB, "memory limit") + skipCreate = flag.Bool("skip-create", false, "skip create files") + fileName = flag.String("file-name", "test", "file name for tests") +) + +func TestReadFileConcurrently(t *testing.T) { + testCompareReaderWithContent(t, createAscendingFiles, readFileConcurrently) +} + +func TestReadFileSequential(t *testing.T) { + testCompareReaderWithContent(t, createAscendingFiles, readFileSequential) +} + +func TestReadMergeIterCheckHotspot(t *testing.T) { + testCompareReaderWithContent(t, createAscendingFiles, func(t *testing.T, suite *readTestSuite) { + suite.mergeIterHotspot = true + readMergeIter(t, suite) + }) +} + +func TestReadMergeIterWithoutCheckHotspot(t *testing.T) { + testCompareReaderWithContent(t, createAscendingFiles, readMergeIter) +} + +func testCompareReaderWithContent( + t *testing.T, + createFn func(store storage.ExternalStorage, fileSize int, fileCount int, objectPrefix string) (int, kv.Key, kv.Key), + fn func(t *testing.T, suite *readTestSuite), +) { + store := openTestingStorage(t) + kvCnt := 0 + if !*skipCreate { + kvCnt, _, _ = createFn(store, *fileSize, *fileCount, *objectPrefix) + } + fileIdx := 0 + + var ( + err error + + fileCPU *os.File + cpuProfCloser func() error + + filenameHeap string + heapProfDoneCh chan struct{} + heapWg *sync.WaitGroup + ) + beforeTest := func() { + fileIdx++ + fileCPU, err = os.Create(fmt.Sprintf("cpu-profile-%d.prof", fileIdx)) + intest.AssertNoError(err) + cpuProfCloser = fgprof.Start(fileCPU, fgprof.FormatPprof) + + filenameHeap = fmt.Sprintf("heap-profile-%d.prof", fileIdx) + heapProfDoneCh, heapWg = recordHeapForMaxInUse(filenameHeap) + } + afterClose := func() { + err = cpuProfCloser() + intest.AssertNoError(err) + close(heapProfDoneCh) + heapWg.Wait() + } + + suite := &readTestSuite{ + store: store, + totalKVCnt: kvCnt, + concurrency: *concurrency, + memoryLimit: *memoryLimit, + beforeCreateReader: beforeTest, + afterReaderClose: afterClose, + subDir: *objectPrefix, + } + + fn(t, suite) +} + +const largeAscendingDataPath = "large_ascending_data" + +// TestPrepareLargeData will write 1000 * 256MB data to the storage. +func TestPrepareLargeData(t *testing.T) { + store := openTestingStorage(t) + ctx := context.Background() + + cleanOldFiles(ctx, store, largeAscendingDataPath) + + fileSize := 256 * 1024 * 1024 + fileCnt := 1000 + keySize := 20 + valueSize := 100 + concurrency := runtime.NumCPU() / 2 + filePerConcUpperBound := (fileCnt + concurrency - 1) / concurrency + + size := atomic.NewInt64(0) + now := time.Now() + wg := sync.WaitGroup{} + wg.Add(concurrency) + + for i := 0; i < concurrency; i++ { + i := i + go func() { + defer wg.Done() + writer := NewWriterBuilder(). + SetMemorySizeLimit(uint64(fileSize)). + Build(store, largeAscendingDataPath, fmt.Sprintf("%02d", i)) + endFile := min((i+1)*filePerConcUpperBound, fileCnt) + startFile := min(i*filePerConcUpperBound, endFile) + if startFile == endFile { + return + } + + // slightly reduce total size to avoid generate a small file at the end + totalSize := fileSize*(endFile-startFile) - 20*1024*1024 + kvCnt := totalSize / (keySize + valueSize + 16) + source := newAscendingKeyAsyncSource(kvCnt, keySize, valueSize, []byte{byte(i)}) + key, val, _ := source.next() + for key != nil { + err := writer.WriteRow(ctx, key, val, nil) + intest.AssertNoError(err) + size.Add(int64(len(key) + len(val))) + key, val, _ = source.next() + } + err := writer.Close(ctx) + intest.AssertNoError(err) + }() + } + wg.Wait() + elapsed := time.Since(now) + t.Logf("write %d bytes in %s, speed: %.2f MB/s", + size.Load(), elapsed, float64(size.Load())/elapsed.Seconds()/1024/1024) + dataFiles, _, err := GetAllFileNames(ctx, store, largeAscendingDataPath) + intest.AssertNoError(err) + + r, err := store.Open(ctx, dataFiles[0], nil) + intest.AssertNoError(err) + firstFileSize, err := r.GetFileSize() + intest.AssertNoError(err) + err = r.Close() + intest.AssertNoError(err) + + r, err = store.Open(ctx, dataFiles[len(dataFiles)-1], nil) + intest.AssertNoError(err) + lastFileSize, err := r.GetFileSize() + intest.AssertNoError(err) + err = r.Close() + intest.AssertNoError(err) + t.Logf("total %d data files, first file size: %.2f MB, last file size: %.2f MB", + len(dataFiles), float64(firstFileSize)/1024/1024, float64(lastFileSize)/1024/1024) +} + +type mergeTestSuite struct { + store storage.ExternalStorage + subDir string + totalKVCnt int + concurrency int + memoryLimit int + mergeIterHotspot bool + minKey kv.Key + maxKey kv.Key + beforeMerge func() + afterMerge func() +} + +func mergeStep(t *testing.T, s *mergeTestSuite) { + ctx := context.Background() + datas, _, err := GetAllFileNames(ctx, s.store, "/"+s.subDir) + intest.AssertNoError(err) + + mergeOutput := "merge_output" + totalSize := atomic.NewUint64(0) + onClose := func(s *WriterSummary) { + totalSize.Add(s.TotalSize) + } + if s.beforeMerge != nil { + s.beforeMerge() + } + + now := time.Now() + err = MergeOverlappingFiles( + ctx, + datas, + s.store, + int64(5*size.MB), + 64*1024, + mergeOutput, + DefaultBlockSize, + DefaultMemSizeLimit, + 8*1024, + 1*size.MB, + 8*1024, + onClose, + s.concurrency, + s.mergeIterHotspot, + ) + + intest.AssertNoError(err) + if s.afterMerge != nil { + s.afterMerge() + } + elapsed := time.Since(now) + t.Logf( + "merge speed for %d bytes in %s with %d concurrency, speed: %.2f MB/s", + totalSize.Load(), + elapsed, + s.concurrency, + float64(totalSize.Load())/elapsed.Seconds()/1024/1024, + ) +} + +func newMergeStep(t *testing.T, s *mergeTestSuite) { + ctx := context.Background() + datas, stats, err := GetAllFileNames(ctx, s.store, "/"+s.subDir) + intest.AssertNoError(err) + + mergeOutput := "merge_output" + totalSize := atomic.NewUint64(0) + onClose := func(s *WriterSummary) { + totalSize.Add(s.TotalSize) + } + if s.beforeMerge != nil { + s.beforeMerge() + } + + now := time.Now() + err = MergeOverlappingFilesV2( + ctx, + mockOneMultiFileStat(datas, stats), + s.store, + s.minKey, + s.maxKey.Next(), + int64(5*size.MB), + mergeOutput, + "test", + DefaultBlockSize, + 8*1024, + 1*size.MB, + 8*1024, + onClose, + s.concurrency, + s.mergeIterHotspot, + ) + + intest.AssertNoError(err) + if s.afterMerge != nil { + s.afterMerge() + } + elapsed := time.Since(now) + t.Logf( + "new merge speed for %d bytes in %s, speed: %.2f MB/s", + totalSize.Load(), + elapsed, + float64(totalSize.Load())/elapsed.Seconds()/1024/1024, + ) +} + +func testCompareMergeWithContent( + t *testing.T, + concurrency int, + createFn func(store storage.ExternalStorage, fileSize int, fileCount int, objectPrefix string) (int, kv.Key, kv.Key), + fn func(t *testing.T, suite *mergeTestSuite)) { + store := openTestingStorage(t) + kvCnt := 0 + var minKey, maxKey kv.Key + if !*skipCreate { + kvCnt, minKey, maxKey = createFn(store, *fileSize, *fileCount, *objectPrefix) + } + + fileIdx := 0 + var ( + file *os.File + err error + ) + beforeTest := func() { + file, err = os.Create(fmt.Sprintf("cpu-profile-%d.prof", fileIdx)) + intest.AssertNoError(err) + err = pprof.StartCPUProfile(file) + intest.AssertNoError(err) + } + + afterTest := func() { + pprof.StopCPUProfile() + } + + suite := &mergeTestSuite{ + store: store, + totalKVCnt: kvCnt, + concurrency: concurrency, + memoryLimit: *memoryLimit, + beforeMerge: beforeTest, + afterMerge: afterTest, + subDir: *objectPrefix, + minKey: minKey, + maxKey: maxKey, + mergeIterHotspot: true, + } + + fn(t, suite) +} + +func TestMergeBench(t *testing.T) { + testCompareMergeWithContent(t, 1, createAscendingFiles, mergeStep) + testCompareMergeWithContent(t, 1, createEvenlyDistributedFiles, mergeStep) + testCompareMergeWithContent(t, 2, createAscendingFiles, mergeStep) + testCompareMergeWithContent(t, 2, createEvenlyDistributedFiles, mergeStep) + testCompareMergeWithContent(t, 4, createAscendingFiles, mergeStep) + testCompareMergeWithContent(t, 4, createEvenlyDistributedFiles, mergeStep) + testCompareMergeWithContent(t, 8, createAscendingFiles, mergeStep) + testCompareMergeWithContent(t, 8, createEvenlyDistributedFiles, mergeStep) + testCompareMergeWithContent(t, 8, createAscendingFiles, newMergeStep) + testCompareMergeWithContent(t, 8, createEvenlyDistributedFiles, newMergeStep) +} + +func TestReadStatFile(t *testing.T) { + ctx := context.Background() + store := openTestingStorage(t) + rd, _ := newStatsReader(ctx, store, *fileName, 4096) + for { + prop, err := rd.nextProp() + if err == io.EOF { + break + } + logutil.BgLogger().Info("read one prop", + zap.Int("prop len", prop.len()), + zap.Int("prop offset", int(prop.offset)), + zap.Int("prop size", int(prop.size)), + zap.Int("prop keys", int(prop.keys))) + } +} diff --git a/br/pkg/lightning/backend/external/byte_reader.go b/br/pkg/lightning/backend/external/byte_reader.go index bed2661f50764..a982c4349513d 100644 --- a/br/pkg/lightning/backend/external/byte_reader.go +++ b/br/pkg/lightning/backend/external/byte_reader.go @@ -18,18 +18,19 @@ import ( "context" "io" + "github.com/pingcap/errors" "github.com/pingcap/tidb/br/pkg/membuf" "github.com/pingcap/tidb/br/pkg/storage" "github.com/pingcap/tidb/pkg/util/logutil" + "github.com/pingcap/tidb/pkg/util/size" "go.uber.org/zap" ) var ( // ConcurrentReaderBufferSizePerConc is the buffer size for concurrent reader per // concurrency. - ConcurrentReaderBufferSizePerConc = 4 * 1024 * 1024 - // ConcurrentReaderConcurrency is the concurrency for concurrent reader. - ConcurrentReaderConcurrency = 8 + ConcurrentReaderBufferSizePerConc = int(4 * size.MB) + readAllDataConcThreshold = uint64(16) ) // byteReader provides structured reading on a byte stream of external storage. @@ -40,12 +41,11 @@ type byteReader struct { storageReader storage.ExternalFileReader // curBuf is either smallBuf or concurrentReader.largeBuf. - curBuf []byte - curBufOffset int + curBuf [][]byte + curBufIdx int // invariant: 0 <= curBufIdx < len(curBuf) when curBuf contains unread data + curBufOffset int // invariant: 0 <= curBufOffset < len(curBuf[curBufIdx]) if curBufIdx < len(curBuf) smallBuf []byte - retPointers []*[]byte - concurrentReader struct { largeBufferPool *membuf.Buffer store storage.ExternalStorage @@ -55,7 +55,7 @@ type byteReader struct { now bool expected bool - largeBuf []byte + largeBuf [][]byte reader *concurrentFileReader reloadCnt int } @@ -68,8 +68,9 @@ func openStoreReaderAndSeek( store storage.ExternalStorage, name string, initFileOffset uint64, + prefetchSize int, ) (storage.ExternalFileReader, error) { - storageReader, err := store.Open(ctx, name, nil) + storageReader, err := store.Open(ctx, name, &storage.ReaderOption{PrefetchSize: prefetchSize}) if err != nil { return nil, err } @@ -99,7 +100,7 @@ func newByteReader( smallBuf: make([]byte, bufSize), curBufOffset: 0, } - r.curBuf = r.smallBuf + r.curBuf = [][]byte{r.smallBuf} r.logger = logutil.Logger(r.ctx) return r, r.reload() } @@ -147,6 +148,7 @@ func (r *byteReader) switchConcurrentMode(useConcurrent bool) error { // and no further switchConcurrentMode should be called. largeBufSize := readerFields.bufSizePerConc * readerFields.concurrency delta := int64(offsetInOldBuf + (reloadCnt-1)*largeBufSize) + if _, err := r.storageReader.Seek(delta, io.SeekCurrent); err != nil { return err } @@ -184,72 +186,91 @@ func (r *byteReader) switchToConcurrentReader() error { return err } - totalSize := readerFields.concurrency * readerFields.bufSizePerConc - readerFields.largeBuf = readerFields.largeBufferPool.AllocBytes(totalSize) + readerFields.largeBuf = make([][]byte, readerFields.concurrency) + for i := range readerFields.largeBuf { + readerFields.largeBuf[i] = readerFields.largeBufferPool.AllocBytes(readerFields.bufSizePerConc) + if readerFields.largeBuf[i] == nil { + return errors.Errorf("alloc large buffer failed, size %d", readerFields.bufSizePerConc) + } + } + r.curBuf = readerFields.largeBuf r.curBufOffset = 0 readerFields.now = true return nil } -// readNBytes reads the next n bytes from the reader and returns a buffer slice containing those bytes. -// The returned slice (pointer) can not be used after r.reset. In the same interval of r.reset, -// byteReader guarantees that the returned slice (pointer) will point to the same content -// though the slice may be changed. -func (r *byteReader) readNBytes(n int) (*[]byte, error) { - b := r.next(n) - readLen := len(b) - if readLen == n { - ret := &b - r.retPointers = append(r.retPointers, ret) - return ret, nil +// readNBytes reads the next n bytes from the reader and returns a buffer slice +// containing those bytes. The content of returned slice may be changed after +// next call. +func (r *byteReader) readNBytes(n int) ([]byte, error) { + readLen, bs := r.next(n) + if readLen == n && len(bs) == 1 { + return bs[0], nil + } + // need to flatten bs + if n <= 0 { + return nil, errors.Errorf("illegal n (%d) when reading from external storage", n) + } + if n > int(size.GB) { + return nil, errors.Errorf("read %d bytes from external storage, exceed max limit %d", n, size.GB) + } + if n <= 0 { + return nil, errors.Errorf("illegal n (%d) when reading from external storage", n) } - // If the reader has fewer than n bytes remaining in current buffer, - // `auxBuf` is used as a container instead. auxBuf := make([]byte, n) - copy(auxBuf, b) - for readLen < n { - r.cloneSlices() + for _, b := range bs { + copy(auxBuf[len(auxBuf)-n:], b) + n -= len(b) + } + hasRead := readLen > 0 + for n > 0 { err := r.reload() switch err { case nil: case io.EOF: - if readLen > 0 { + // EOF is only allowed when we have not read any data + if hasRead { return nil, io.ErrUnexpectedEOF } return nil, err default: return nil, err } - b = r.next(n - readLen) - copy(auxBuf[readLen:], b) - readLen += len(b) - } - return &auxBuf, nil -} - -func (r *byteReader) reset() { - for i := range r.retPointers { - r.retPointers[i] = nil + readLen, bs = r.next(n) + hasRead = hasRead || readLen > 0 + for _, b := range bs { + copy(auxBuf[len(auxBuf)-n:], b) + n -= len(b) + } } - r.retPointers = r.retPointers[:0] + return auxBuf, nil } -func (r *byteReader) cloneSlices() { - for i := range r.retPointers { - copied := make([]byte, len(*r.retPointers[i])) - copy(copied, *r.retPointers[i]) - *r.retPointers[i] = copied - r.retPointers[i] = nil +func (r *byteReader) next(n int) (int, [][]byte) { + retCnt := 0 + // TODO(lance6716): heap escape performance? + ret := make([][]byte, 0, len(r.curBuf)-r.curBufIdx+1) + for r.curBufIdx < len(r.curBuf) && n > 0 { + cur := r.curBuf[r.curBufIdx] + if r.curBufOffset+n <= len(cur) { + ret = append(ret, cur[r.curBufOffset:r.curBufOffset+n]) + retCnt += n + r.curBufOffset += n + if r.curBufOffset == len(cur) { + r.curBufIdx++ + r.curBufOffset = 0 + } + break + } + ret = append(ret, cur[r.curBufOffset:]) + retCnt += len(cur) - r.curBufOffset + n -= len(cur) - r.curBufOffset + r.curBufIdx++ + r.curBufOffset = 0 } - r.retPointers = r.retPointers[:0] -} -func (r *byteReader) next(n int) []byte { - end := min(r.curBufOffset+n, len(r.curBuf)) - ret := r.curBuf[r.curBufOffset:end] - r.curBufOffset += len(ret) - return ret + return retCnt, ret } func (r *byteReader) reload() error { @@ -266,29 +287,32 @@ func (r *byteReader) reload() error { if r.concurrentReader.now { r.concurrentReader.reloadCnt++ - n, err := r.concurrentReader.reader.read(r.concurrentReader.largeBuf) + buffers, err := r.concurrentReader.reader.read(r.concurrentReader.largeBuf) if err != nil { return err } - r.curBuf = r.curBuf[:n] + r.curBuf = buffers + r.curBufIdx = 0 r.curBufOffset = 0 return nil } - n, err := io.ReadFull(r.storageReader, r.curBuf[0:]) + // when not using concurrentReader, len(curBuf) == 1 + n, err := io.ReadFull(r.storageReader, r.curBuf[0][0:]) if err != nil { switch err { case io.EOF: - // move curBufOffset so following read will also find EOF - r.curBufOffset = len(r.curBuf) + // move curBufIdx so following read will also find EOF + r.curBufIdx = len(r.curBuf) return err case io.ErrUnexpectedEOF: // The last batch. - r.curBuf = r.curBuf[:n] + r.curBuf[0] = r.curBuf[0][:n] default: r.logger.Warn("other error during read", zap.Error(err)) return err } } + r.curBufIdx = 0 r.curBufOffset = 0 return nil } @@ -296,15 +320,16 @@ func (r *byteReader) reload() error { func (r *byteReader) closeConcurrentReader() (reloadCnt, offsetInOldBuffer int) { r.logger.Info("drop data in closeConcurrentReader", zap.Int("reloadCnt", r.concurrentReader.reloadCnt), - zap.Int("dropBytes", len(r.curBuf)-r.curBufOffset), + zap.Int("dropBytes", r.concurrentReader.bufSizePerConc*(len(r.curBuf)-r.curBufIdx)-r.curBufOffset), + zap.Int("curBufIdx", r.curBufIdx), ) r.concurrentReader.largeBufferPool.Destroy() r.concurrentReader.largeBuf = nil r.concurrentReader.now = false reloadCnt = r.concurrentReader.reloadCnt r.concurrentReader.reloadCnt = 0 - r.curBuf = r.smallBuf - offsetInOldBuffer = r.curBufOffset + r.curBuf = [][]byte{r.smallBuf} + offsetInOldBuffer = r.curBufOffset + r.curBufIdx*r.concurrentReader.bufSizePerConc r.curBufOffset = 0 return } diff --git a/br/pkg/lightning/backend/external/byte_reader_test.go b/br/pkg/lightning/backend/external/byte_reader_test.go index 71d281ec13f3b..1023f46fa146d 100644 --- a/br/pkg/lightning/backend/external/byte_reader_test.go +++ b/br/pkg/lightning/backend/external/byte_reader_test.go @@ -29,6 +29,8 @@ import ( "github.com/johannesboyne/gofakes3/backend/s3mem" "github.com/pingcap/errors" backuppb "github.com/pingcap/kvproto/pkg/brpb" + "github.com/pingcap/tidb/br/pkg/lightning/common" + "github.com/pingcap/tidb/br/pkg/membuf" "github.com/pingcap/tidb/br/pkg/storage" "github.com/stretchr/testify/require" "golang.org/x/exp/rand" @@ -63,11 +65,6 @@ func (s *mockExtStore) GetFileSize() (int64, error) { } func TestByteReader(t *testing.T) { - testByteReaderNormal(t, false) - testByteReaderNormal(t, true) -} - -func testByteReaderNormal(t *testing.T, useConcurrency bool) { st, clean := NewS3WithBucketAndPrefix(t, "test", "testprefix") defer clean() @@ -84,21 +81,19 @@ func testByteReaderNormal(t *testing.T, useConcurrency bool) { // Test basic next() usage. br, err := newByteReader(context.Background(), newRsc(), 3) require.NoError(t, err) - x := br.next(1) - require.Equal(t, 1, len(x)) - require.Equal(t, byte('a'), x[0]) - x = br.next(2) - require.Equal(t, 2, len(x)) - require.Equal(t, byte('b'), x[0]) - require.Equal(t, byte('c'), x[1]) + n, bs := br.next(1) + require.Equal(t, 1, n) + require.Equal(t, [][]byte{{'a'}}, bs) + n, bs = br.next(2) + require.Equal(t, 2, n) + require.Equal(t, [][]byte{{'b', 'c'}}, bs) require.NoError(t, br.Close()) // Test basic readNBytes() usage. br, err = newByteReader(context.Background(), newRsc(), 3) require.NoError(t, err) - y, err := br.readNBytes(2) + x, err := br.readNBytes(2) require.NoError(t, err) - x = *y require.Equal(t, 2, len(x)) require.Equal(t, byte('a'), x[0]) require.Equal(t, byte('b'), x[1]) @@ -106,17 +101,18 @@ func testByteReaderNormal(t *testing.T, useConcurrency bool) { br, err = newByteReader(context.Background(), newRsc(), 3) require.NoError(t, err) - y, err = br.readNBytes(5) // Read all the data. + x, err = br.readNBytes(5) // Read all the data. require.NoError(t, err) - x = *y require.Equal(t, 5, len(x)) require.Equal(t, byte('e'), x[4]) + _, err = br.readNBytes(1) // EOF + require.ErrorIs(t, err, io.EOF) require.NoError(t, br.Close()) br, err = newByteReader(context.Background(), newRsc(), 3) require.NoError(t, err) _, err = br.readNBytes(7) // EOF - require.Error(t, err) + require.ErrorIs(t, err, io.ErrUnexpectedEOF) err = st.WriteFile(context.Background(), "testfile", []byte("abcdef")) require.NoError(t, err) @@ -124,11 +120,10 @@ func testByteReaderNormal(t *testing.T, useConcurrency bool) { ms := &mockExtStore{src: []byte("abcdef")} br, err = newByteReader(context.Background(), ms, 2) require.NoError(t, err) - y, err = br.readNBytes(3) + x, err = br.readNBytes(3) require.NoError(t, err) // Pollute mockExtStore to verify if the slice is not affected. - copy(ms.src, []byte("xyz")) - x = *y + copy(ms.src, "xyz") require.Equal(t, 3, len(x)) require.Equal(t, byte('c'), x[2]) require.NoError(t, br.Close()) @@ -136,57 +131,12 @@ func testByteReaderNormal(t *testing.T, useConcurrency bool) { ms = &mockExtStore{src: []byte("abcdef")} br, err = newByteReader(context.Background(), ms, 2) require.NoError(t, err) - y, err = br.readNBytes(2) + x, err = br.readNBytes(2) require.NoError(t, err) // Pollute mockExtStore to verify if the slice is not affected. - copy(ms.src, []byte("xyz")) - x = *y + copy(ms.src, "xyz") require.Equal(t, 2, len(x)) require.Equal(t, byte('b'), x[1]) - br.reset() - require.NoError(t, br.Close()) -} - -func TestByteReaderClone(t *testing.T) { - ms := &mockExtStore{src: []byte("0123456789")} - br, err := newByteReader(context.Background(), ms, 4) - require.NoError(t, err) - y1, err := br.readNBytes(2) - require.NoError(t, err) - y2, err := br.readNBytes(1) - require.NoError(t, err) - x1, x2 := *y1, *y2 - require.Len(t, x1, 2) - require.Len(t, x2, 1) - require.Equal(t, byte('0'), x1[0]) - require.Equal(t, byte('2'), x2[0]) - require.NoError(t, br.reload()) // Perform a read to overwrite buffer. - x1, x2 = *y1, *y2 - require.Len(t, x1, 2) - require.Len(t, x2, 1) - require.Equal(t, byte('4'), x1[0]) // Verify if the buffer is overwritten. - require.Equal(t, byte('6'), x2[0]) - require.NoError(t, br.Close()) - - ms = &mockExtStore{src: []byte("0123456789")} - br, err = newByteReader(context.Background(), ms, 4) - require.NoError(t, err) - y1, err = br.readNBytes(2) - require.NoError(t, err) - y2, err = br.readNBytes(1) - require.NoError(t, err) - x1, x2 = *y1, *y2 - require.Len(t, x1, 2) - require.Len(t, x2, 1) - require.Equal(t, byte('0'), x1[0]) - require.Equal(t, byte('2'), x2[0]) - br.cloneSlices() - require.NoError(t, br.reload()) // Perform a read to overwrite buffer. - x1, x2 = *y1, *y2 - require.Len(t, x1, 2) - require.Len(t, x2, 1) - require.Equal(t, byte('0'), x1[0]) // Verify if the buffer is NOT overwritten. - require.Equal(t, byte('2'), x2[0]) require.NoError(t, br.Close()) } @@ -196,78 +146,17 @@ func TestByteReaderAuxBuf(t *testing.T) { require.NoError(t, err) y1, err := br.readNBytes(1) require.NoError(t, err) + require.Equal(t, []byte("0"), y1) y2, err := br.readNBytes(2) require.NoError(t, err) - require.Equal(t, []byte("0"), *y1) - require.Equal(t, []byte("12"), *y2) + require.Equal(t, []byte("12"), y2) y3, err := br.readNBytes(1) require.NoError(t, err) + require.Equal(t, []byte("3"), y3) y4, err := br.readNBytes(2) require.NoError(t, err) - require.Equal(t, []byte("3"), *y3) - require.Equal(t, []byte("45"), *y4) - require.Equal(t, []byte("0"), *y1) - require.Equal(t, []byte("12"), *y2) -} - -func TestReset(t *testing.T) { - testReset(t, false) - testReset(t, true) -} - -func testReset(t *testing.T, useConcurrency bool) { - st, clean := NewS3WithBucketAndPrefix(t, "test", "testprefix") - defer func() { - clean() - }() - - seed := time.Now().Unix() - rand.Seed(uint64(seed)) - t.Logf("seed: %d", seed) - src := make([]byte, 256) - for i := range src { - src[i] = byte(i) - } - // Prepare - err := st.WriteFile(context.Background(), "testfile", src) - require.NoError(t, err) - - newRsc := func() storage.ExternalFileReader { - rsc, err := st.Open(context.Background(), "testfile", nil) - require.NoError(t, err) - return rsc - } - bufSize := rand.Intn(256) - br, err := newByteReader(context.Background(), newRsc(), bufSize) - require.NoError(t, err) - end := 0 - toCheck := make([]*[]byte, 0, 10) - for end < len(src) { - n := rand.Intn(len(src) - end) - if n == 0 { - n = 1 - } - y, err := br.readNBytes(n) - require.NoError(t, err) - toCheck = append(toCheck, y) - end += n - - l := end - r := end - for i := len(toCheck) - 1; i >= 0; i-- { - l -= len(*toCheck[i]) - require.Equal(t, src[l:r], *toCheck[i]) - r = l - } - - if rand.Intn(2) == 0 { - br.reset() - toCheck = toCheck[:0] - } - } - _, err = br.readNBytes(1) - require.Equal(t, io.EOF, err) + require.Equal(t, []byte("45"), y4) } func TestUnexpectedEOF(t *testing.T) { @@ -319,57 +208,66 @@ func TestEmptyContent(t *testing.T) { } func TestSwitchMode(t *testing.T) { - st, clean := NewS3WithBucketAndPrefix(t, "test", "testprefix") - defer clean() - + seed := time.Now().Unix() + rand.Seed(uint64(seed)) + t.Logf("seed: %d", seed) + st := storage.NewMemStorage() // Prepare - fileSize := 1024 * 1024 - err := st.WriteFile(context.Background(), "testfile", make([]byte, fileSize)) + ctx := context.Background() + writer := NewWriterBuilder(). + SetPropSizeDistance(100). + SetPropKeysDistance(2). + BuildOneFile(st, "/test", "0") + + err := writer.Init(ctx, 5*1024*1024) require.NoError(t, err) - newRsc := func() storage.ExternalFileReader { - rsc, err := st.Open(context.Background(), "testfile", nil) + kvCnt := 1000000 + kvs := make([]common.KvPair, kvCnt) + for i := 0; i < kvCnt; i++ { + randLen := rand.Intn(10) + 1 + kvs[i].Key = make([]byte, randLen) + _, err := rand.Read(kvs[i].Key) + require.NoError(t, err) + randLen = rand.Intn(10) + 1 + kvs[i].Val = make([]byte, randLen) + _, err = rand.Read(kvs[i].Val) require.NoError(t, err) - return rsc } - ConcurrentReaderBufferSizePerConc = 100 - br, err := newByteReader(context.Background(), newRsc(), 100) + for _, item := range kvs { + err := writer.WriteRow(ctx, item.Key, item.Val) + require.NoError(t, err) + } - seed := time.Now().Unix() - rand.Seed(uint64(seed)) - t.Logf("seed: %d", seed) - totalCnt := 0 + err = writer.Close(ctx) + require.NoError(t, err) + pool := membuf.NewPool() + ConcurrentReaderBufferSizePerConc = rand.Intn(100) + 1 + kvReader, err := newKVReader(context.Background(), "/test/0/one-file", st, 0, 64*1024) + require.NoError(t, err) + kvReader.byteReader.enableConcurrentRead(st, "/test/0/one-file", 100, ConcurrentReaderBufferSizePerConc, pool.NewBuffer()) modeUseCon := false - for totalCnt < fileSize { + i := 0 + for { if rand.Intn(5) == 0 { if modeUseCon { - br.switchConcurrentMode(false) + kvReader.byteReader.switchConcurrentMode(false) modeUseCon = false } else { - br.switchConcurrentMode(true) + kvReader.byteReader.switchConcurrentMode(true) modeUseCon = true } } - n := rand.Intn(100) - if n == 0 { - n = 1 - } - if totalCnt+n > fileSize { - n = fileSize - totalCnt - } - if n == 0 { - break - } - y, err := br.readNBytes(n) + key, val, err := kvReader.nextKV() if err == io.EOF { break } require.NoError(t, err) - totalCnt += len(*y) + require.Equal(t, kvs[i].Key, key) + require.Equal(t, kvs[i].Val, val) + i++ } - require.Equal(t, fileSize, totalCnt) - } // NewS3WithBucketAndPrefix creates a new S3Storage for testing. diff --git a/br/pkg/lightning/backend/external/concurrent_reader.go b/br/pkg/lightning/backend/external/concurrent_reader.go index 39574850ccdb7..613f161e06daf 100644 --- a/br/pkg/lightning/backend/external/concurrent_reader.go +++ b/br/pkg/lightning/backend/external/concurrent_reader.go @@ -59,41 +59,38 @@ func newConcurrentFileReader( } // read loads the file content concurrently into the buffer. -func (r *concurrentFileReader) read(buf []byte) (int64, error) { +func (r *concurrentFileReader) read(bufs [][]byte) ([][]byte, error) { if r.offset >= r.fileSize { - return 0, io.EOF + return nil, io.EOF } - bufSize := len(buf) - fileSizeRemain := r.fileSize - r.offset - readBatchTotal := r.readBufferSize * r.concurrency - bytesRead := min(bufSize, int(fileSizeRemain), readBatchTotal) + ret := make([][]byte, 0, r.concurrency) eg := errgroup.Group{} for i := 0; i < r.concurrency; i++ { - i := i + if r.offset >= r.fileSize { + break + } + end := r.readBufferSize + if r.offset+int64(end) > r.fileSize { + end = int(r.fileSize - r.offset) + } + buf := bufs[i][:end] + ret = append(ret, buf) + offset := r.offset + r.offset += int64(end) eg.Go(func() error { - bufStart := i * r.readBufferSize - bufEnd := bufStart + r.readBufferSize - if bufEnd > bytesRead { - bufEnd = bytesRead - } - if bufStart >= bufEnd { - return nil - } - - fileStart := r.offset + int64(bufStart) _, err := storage.ReadDataInRange( r.ctx, r.storage, r.name, - fileStart, - buf[bufStart:bufEnd], + offset, + buf, ) if err != nil { log.FromContext(r.ctx).Error( "concurrent read meet error", - zap.Int64("fileStart", fileStart), - zap.Int("readSize", bufEnd-bufStart), + zap.Int64("offset", offset), + zap.Int("readSize", len(buf)), zap.Error(err), ) return err @@ -103,9 +100,8 @@ func (r *concurrentFileReader) read(buf []byte) (int64, error) { } err := eg.Wait() if err != nil { - return 0, err + return nil, err } - r.offset += int64(bytesRead) - return int64(bytesRead), nil + return ret, nil } diff --git a/br/pkg/lightning/backend/external/concurrent_reader_test.go b/br/pkg/lightning/backend/external/concurrent_reader_test.go index 70ccf34cd38b3..45d715604d89d 100644 --- a/br/pkg/lightning/backend/external/concurrent_reader_test.go +++ b/br/pkg/lightning/backend/external/concurrent_reader_test.go @@ -50,6 +50,10 @@ func TestConcurrentRead(t *testing.T) { concurrency := rand.Intn(4) + 1 readBufferSize := rand.Intn(100) + 1 + bufs := make([][]byte, concurrency) + for i := range bufs { + bufs[i] = make([]byte, readBufferSize) + } rd, err := newConcurrentFileReader( ctx, memStore, @@ -61,19 +65,19 @@ func TestConcurrentRead(t *testing.T) { ) require.NoError(t, err) - readSize := rand.Intn(500) + 1 - readBuf := make([]byte, readSize) got := make([]byte, 0, 256) for { - n, err := rd.read(readBuf) + bs, err := rd.read(bufs) if err != nil { if err == io.EOF { break } require.NoError(t, err) } - got = append(got, readBuf[:n]...) + for _, b := range bs { + got = append(got, b...) + } } require.Equal(t, data[offset:], got) diff --git a/br/pkg/lightning/backend/external/engine.go b/br/pkg/lightning/backend/external/engine.go index 4465534053917..f51289b96b405 100644 --- a/br/pkg/lightning/backend/external/engine.go +++ b/br/pkg/lightning/backend/external/engine.go @@ -18,12 +18,14 @@ import ( "bytes" "context" "encoding/hex" - "slices" "sort" + "sync" "time" "github.com/cockroachdb/pebble" + "github.com/jfcg/sorty/v2" "github.com/pingcap/errors" + "github.com/pingcap/failpoint" "github.com/pingcap/tidb/br/pkg/lightning/common" "github.com/pingcap/tidb/br/pkg/lightning/config" "github.com/pingcap/tidb/br/pkg/lightning/log" @@ -31,7 +33,6 @@ import ( "github.com/pingcap/tidb/br/pkg/storage" "github.com/pingcap/tidb/pkg/kv" "github.com/pingcap/tidb/pkg/metrics" - "github.com/pingcap/tidb/pkg/util" "github.com/pingcap/tidb/pkg/util/logutil" "go.uber.org/atomic" "go.uber.org/zap" @@ -45,7 +46,15 @@ import ( // but, ks3 supporter says there's no such limit on connections. // And our target for global sort is AWS s3, this default value might not fit well. // TODO: adjust it according to cloud storage. -const maxCloudStorageConnections = 8000 +const maxCloudStorageConnections = 1000 + +type memKVsAndBuffers struct { + mu sync.Mutex + keys [][]byte + values [][]byte + memKVBuffers []*membuf.Buffer + size int +} // Engine stored sorted key/value pairs in an external storage. type Engine struct { @@ -57,13 +66,17 @@ type Engine struct { splitKeys [][]byte regionSplitSize int64 bufPool *membuf.Pool + + memKVsAndBuffers memKVsAndBuffers + // checkHotspot is true means we will check hotspot file when using MergeKVIter. // if hotspot file is detected, we will use multiple readers to read data. // if it's false, MergeKVIter will read each file using 1 reader. // this flag also affects the strategy of loading data, either: // less load routine + check and read hotspot file concurrently (add-index uses this one) // more load routine + read each file using 1 reader (import-into uses this one) - checkHotspot bool + checkHotspot bool + mergerIterConcurrency int keyAdapter common.KeyAdapter duplicateDetection bool @@ -79,6 +92,8 @@ type Engine struct { importedKVCount *atomic.Int64 } +const memLimit = 16 * 1024 * 1024 * 1024 + // NewExternalEngine creates an (external) engine. func NewExternalEngine( storage storage.ExternalStorage, @@ -98,15 +113,20 @@ func NewExternalEngine( totalKVCount int64, checkHotspot bool, ) common.Engine { + memLimiter := membuf.NewLimiter(memLimit) return &Engine{ - storage: storage, - dataFiles: dataFiles, - statsFiles: statsFiles, - startKey: startKey, - endKey: endKey, - splitKeys: splitKeys, - regionSplitSize: regionSplitSize, - bufPool: membuf.NewPool(), + storage: storage, + dataFiles: dataFiles, + statsFiles: statsFiles, + startKey: startKey, + endKey: endKey, + splitKeys: splitKeys, + regionSplitSize: regionSplitSize, + bufPool: membuf.NewPool( + membuf.WithBlockNum(0), + membuf.WithPoolMemoryLimiter(memLimiter), + membuf.WithBlockSize(ConcurrentReaderBufferSizePerConc), + ), checkHotspot: checkHotspot, keyAdapter: keyAdapter, duplicateDetection: duplicateDetection, @@ -143,15 +163,127 @@ func split[T any](in []T, groupNum int) [][]T { func (e *Engine) getAdjustedConcurrency() int { if e.checkHotspot { - // estimate we will open at most 1000 files, so if e.dataFiles is small we can + // estimate we will open at most 8000 files, so if e.dataFiles is small we can // try to concurrently process ranges. adjusted := maxCloudStorageConnections / len(e.dataFiles) + if adjusted == 0 { + return 1 + } return min(adjusted, 8) } adjusted := min(e.workerConcurrency, maxCloudStorageConnections/len(e.dataFiles)) return max(adjusted, 1) } +func getFilesReadConcurrency( + ctx context.Context, + storage storage.ExternalStorage, + statsFiles []string, + startKey, endKey []byte, +) ([]uint64, []uint64, error) { + result := make([]uint64, len(statsFiles)) + startOffs, err := seekPropsOffsets(ctx, startKey, statsFiles, storage, false) + if err != nil { + return nil, nil, err + } + endOffs, err := seekPropsOffsets(ctx, endKey, statsFiles, storage, false) + if err != nil { + return nil, nil, err + } + for i := range statsFiles { + result[i] = (endOffs[i] - startOffs[i]) / uint64(ConcurrentReaderBufferSizePerConc) + result[i] = max(result[i], 1) + logutil.Logger(ctx).Info("found hotspot file in getFilesReadConcurrency", + zap.String("filename", statsFiles[i]), + zap.Uint64("startOffset", startOffs[i]), + zap.Uint64("endOffset", endOffs[i]), + zap.Uint64("expected concurrency", result[i]), + ) + } + return result, startOffs, nil +} + +func (e *Engine) loadBatchRegionData(ctx context.Context, startKey, endKey []byte, outCh chan<- common.DataAndRange) error { + readAndSortRateHist := metrics.GlobalSortReadFromCloudStorageRate.WithLabelValues("read_and_sort") + readAndSortDurHist := metrics.GlobalSortReadFromCloudStorageDuration.WithLabelValues("read_and_sort") + readRateHist := metrics.GlobalSortReadFromCloudStorageRate.WithLabelValues("read") + readDurHist := metrics.GlobalSortReadFromCloudStorageDuration.WithLabelValues("read") + sortRateHist := metrics.GlobalSortReadFromCloudStorageRate.WithLabelValues("sort") + sortDurHist := metrics.GlobalSortReadFromCloudStorageDuration.WithLabelValues("sort") + + readStart := time.Now() + err := readAllData( + ctx, + e.storage, + e.dataFiles, + e.statsFiles, + startKey, + endKey, + e.bufPool, + &e.memKVsAndBuffers, + ) + if err != nil { + return err + } + readSecond := time.Since(readStart).Seconds() + readDurHist.Observe(readSecond) + logutil.Logger(ctx).Info("reading external storage in loadBatchRegionData", + zap.Duration("cost time", time.Since(readStart))) + sortStart := time.Now() + oldSortyGor := sorty.MaxGor + sorty.MaxGor = uint64(e.workerConcurrency * 2) + sorty.Sort(len(e.memKVsAndBuffers.keys), func(i, k, r, s int) bool { + if bytes.Compare(e.memKVsAndBuffers.keys[i], e.memKVsAndBuffers.keys[k]) < 0 { // strict comparator like < or > + if r != s { + e.memKVsAndBuffers.keys[r], e.memKVsAndBuffers.keys[s] = e.memKVsAndBuffers.keys[s], e.memKVsAndBuffers.keys[r] + e.memKVsAndBuffers.values[r], e.memKVsAndBuffers.values[s] = e.memKVsAndBuffers.values[s], e.memKVsAndBuffers.values[r] + } + return true + } + return false + }) + sorty.MaxGor = oldSortyGor + sortSecond := time.Since(sortStart).Seconds() + sortDurHist.Observe(sortSecond) + logutil.Logger(ctx).Info("sorting in loadBatchRegionData", + zap.Duration("cost time", time.Since(sortStart))) + + readAndSortSecond := time.Since(readStart).Seconds() + readAndSortDurHist.Observe(readAndSortSecond) + + size := e.memKVsAndBuffers.size + readAndSortRateHist.Observe(float64(size) / 1024.0 / 1024.0 / readAndSortSecond) + readRateHist.Observe(float64(size) / 1024.0 / 1024.0 / readSecond) + sortRateHist.Observe(float64(size) / 1024.0 / 1024.0 / sortSecond) + + data := e.buildIngestData( + e.memKVsAndBuffers.keys, + e.memKVsAndBuffers.values, + e.memKVsAndBuffers.memKVBuffers, + ) + + // release the reference of e.memKVsAndBuffers + e.memKVsAndBuffers.keys = nil + e.memKVsAndBuffers.values = nil + e.memKVsAndBuffers.memKVBuffers = nil + + sendFn := func(dr common.DataAndRange) error { + select { + case <-ctx.Done(): + return ctx.Err() + case outCh <- dr: + } + return nil + } + return sendFn(common.DataAndRange{ + Data: data, + Range: common.Range{ + Start: startKey, + End: endKey, + }, + }) +} + // LoadIngestData loads the data from the external storage to memory in [start, // end) range, so local backend can ingest it. The used byte slice of ingest data // are allocated from Engine.bufPool and must be released by @@ -161,43 +293,22 @@ func (e *Engine) LoadIngestData( regionRanges []common.Range, outCh chan<- common.DataAndRange, ) error { - concurrency := e.getAdjustedConcurrency() - rangeGroups := split(regionRanges, concurrency) - - logutil.Logger(ctx).Info("load ingest data", - zap.Int("concurrency", concurrency), - zap.Int("ranges", len(regionRanges)), - zap.Int("range-groups", len(rangeGroups)), - zap.Int("num-data-files", len(e.dataFiles)), - zap.Int("num-stat-files", len(e.statsFiles)), - zap.Bool("check-hotspot", e.checkHotspot), - ) - eg, egCtx := util.NewErrorGroupWithRecoverWithCtx(ctx) - for _, ranges := range rangeGroups { - ranges := ranges - eg.Go(func() error { - iter, err := e.createMergeIter(egCtx, ranges[0].Start) - if err != nil { - return errors.Trace(err) - } - defer iter.Close() - - if !iter.Next() { - return iter.Error() - } - for _, r := range ranges { - err := e.loadIngestData(egCtx, iter, r.Start, r.End, outCh) - if err != nil { - return errors.Trace(err) - } - } - return nil - }) + // currently we assume the region size is 96MB and will download 96MB*40 = 3.8GB + // data at once + regionBatchSize := 40 + failpoint.Inject("LoadIngestDataBatchSize", func(val failpoint.Value) { + regionBatchSize = val.(int) + }) + for i := 0; i < len(regionRanges); i += regionBatchSize { + err := e.loadBatchRegionData(ctx, regionRanges[i].Start, regionRanges[min(i+regionBatchSize, len(regionRanges))-1].End, outCh) + if err != nil { + return err + } } - return eg.Wait() + return nil } -func (e *Engine) buildIngestData(keys, values [][]byte, buf *membuf.Buffer) *MemoryIngestData { +func (e *Engine) buildIngestData(keys, values [][]byte, buf []*membuf.Buffer) *MemoryIngestData { return &MemoryIngestData{ keyAdapter: e.keyAdapter, duplicateDetection: e.duplicateDetection, @@ -216,101 +327,8 @@ func (e *Engine) buildIngestData(keys, values [][]byte, buf *membuf.Buffer) *Mem // LargeRegionSplitDataThreshold is exposed for test. var LargeRegionSplitDataThreshold = int(config.SplitRegionSize) -// loadIngestData loads the data from the external storage to memory in [start, -// end) range, and if the range is large enough, it will return multiple data. -// The input `iter` should be called Next() before calling this function. -func (e *Engine) loadIngestData( - ctx context.Context, - iter *MergeKVIter, - start, end []byte, - outCh chan<- common.DataAndRange) error { - if bytes.Equal(start, end) { - return errors.Errorf("start key and end key must not be the same: %s", - hex.EncodeToString(start)) - } - - readRateHist := metrics.GlobalSortReadFromCloudStorageRate.WithLabelValues("read_and_sort") - readDurHist := metrics.GlobalSortReadFromCloudStorageDuration.WithLabelValues("read_and_sort") - sendFn := func(dr common.DataAndRange) error { - select { - case <-ctx.Done(): - return ctx.Err() - case outCh <- dr: - } - return nil - } - - loadStartTs, batchStartTs := time.Now(), time.Now() - keys := make([][]byte, 0, 1024) - values := make([][]byte, 0, 1024) - memBuf := e.bufPool.NewBuffer() - cnt := 0 - size := 0 - curStart := start - - // there should be a key that just exceeds the end key in last loadIngestData - // invocation. - k, v := iter.Key(), iter.Value() - if len(k) > 0 { - keys = append(keys, memBuf.AddBytes(k)) - values = append(values, memBuf.AddBytes(v)) - cnt++ - size += len(k) + len(v) - } - - for iter.Next() { - k, v = iter.Key(), iter.Value() - if bytes.Compare(k, start) < 0 { - continue - } - if bytes.Compare(k, end) >= 0 { - break - } - // as we keep KV data in memory, to avoid OOM, we only keep at most 1 - // DataAndRange for each loadIngestData and regionJobWorker routine(channel - // is unbuffered). - if size > LargeRegionSplitDataThreshold { - readRateHist.Observe(float64(size) / 1024.0 / 1024.0 / time.Since(batchStartTs).Seconds()) - readDurHist.Observe(time.Since(batchStartTs).Seconds()) - curKey := slices.Clone(k) - if err := sendFn(common.DataAndRange{ - Data: e.buildIngestData(keys, values, memBuf), - Range: common.Range{Start: curStart, End: curKey}, - }); err != nil { - return errors.Trace(err) - } - keys = make([][]byte, 0, 1024) - values = make([][]byte, 0, 1024) - size = 0 - curStart = curKey - batchStartTs = time.Now() - memBuf = e.bufPool.NewBuffer() - } - - keys = append(keys, memBuf.AddBytes(k)) - values = append(values, memBuf.AddBytes(v)) - cnt++ - size += len(k) + len(v) - } - if iter.Error() != nil { - return errors.Trace(iter.Error()) - } - if len(keys) > 0 { - readRateHist.Observe(float64(size) / 1024.0 / 1024.0 / time.Since(batchStartTs).Seconds()) - readDurHist.Observe(time.Since(batchStartTs).Seconds()) - if err := sendFn(common.DataAndRange{ - Data: e.buildIngestData(keys, values, memBuf), - Range: common.Range{Start: curStart, End: end}, - }); err != nil { - return errors.Trace(err) - } - } - logutil.Logger(ctx).Info("load data from external storage", - zap.Duration("cost time", time.Since(loadStartTs)), - zap.Int("iterated count", cnt)) - return nil -} - +// createMergeIter is unused now. +// TODO(lance6716): check the performance of new design and remove it. func (e *Engine) createMergeIter(ctx context.Context, start kv.Key) (*MergeKVIter, error) { logger := logutil.Logger(ctx) @@ -331,7 +349,15 @@ func (e *Engine) createMergeIter(ctx context.Context, start kv.Key) (*MergeKVIte zap.Strings("dataFiles", e.dataFiles), zap.Strings("statsFiles", e.statsFiles)) } - iter, err := NewMergeKVIter(ctx, e.dataFiles, offsets, e.storage, 64*1024, e.checkHotspot) + iter, err := NewMergeKVIter( + ctx, + e.dataFiles, + offsets, + e.storage, + 64*1024, + e.checkHotspot, + e.mergerIterConcurrency, + ) if err != nil { return nil, errors.Trace(err) } @@ -392,7 +418,10 @@ func (e *Engine) Close() error { func (e *Engine) Reset() error { if e.bufPool != nil { e.bufPool.Destroy() - e.bufPool = membuf.NewPool() + memLimiter := membuf.NewLimiter(memLimit) + e.bufPool = membuf.NewPool( + membuf.WithPoolMemoryLimiter(memLimiter), + ) } return nil } @@ -408,7 +437,7 @@ type MemoryIngestData struct { values [][]byte ts uint64 - memBuf *membuf.Buffer + memBuf []*membuf.Buffer refCnt *atomic.Int64 importedKVSize *atomic.Int64 importedKVCount *atomic.Int64 @@ -616,7 +645,9 @@ func (m *MemoryIngestData) IncRef() { // DecRef implements IngestData.DecRef. func (m *MemoryIngestData) DecRef() { if m.refCnt.Dec() == 0 { - m.memBuf.Destroy() + for _, b := range m.memBuf { + b.Destroy() + } } } diff --git a/br/pkg/lightning/backend/external/engine_test.go b/br/pkg/lightning/backend/external/engine_test.go index deb33d4b0fde7..f810fb5c1f952 100644 --- a/br/pkg/lightning/backend/external/engine_test.go +++ b/br/pkg/lightning/backend/external/engine_test.go @@ -342,10 +342,10 @@ func TestGetAdjustedConcurrency(t *testing.T) { require.Equal(t, 1, e.getAdjustedConcurrency()) e.checkHotspot = false - e.dataFiles = genFiles(100) + e.dataFiles = genFiles(10) require.Equal(t, 32, e.getAdjustedConcurrency()) - e.dataFiles = genFiles(1000) - require.Equal(t, 8, e.getAdjustedConcurrency()) + e.dataFiles = genFiles(100) + require.Equal(t, 10, e.getAdjustedConcurrency()) e.dataFiles = genFiles(10000) require.Equal(t, 1, e.getAdjustedConcurrency()) } diff --git a/br/pkg/lightning/backend/external/file.go b/br/pkg/lightning/backend/external/file.go index fd66938a03a0a..07428021576ea 100644 --- a/br/pkg/lightning/backend/external/file.go +++ b/br/pkg/lightning/backend/external/file.go @@ -50,32 +50,33 @@ func NewKeyValueStore( } // addEncodedData saves encoded key-value pairs to the KeyValueStore. -// data layout: keyLen + key + valueLen + value. If the accumulated +// data layout: keyLen + valueLen + key + value. If the accumulated // size or key count exceeds the given distance, a new range property will be // appended to the rangePropertiesCollector with current status. // `key` must be in strictly ascending order for invocations of a KeyValueStore. -func (s *KeyValueStore) addEncodedData(val []byte) error { - _, err := s.dataWriter.Write(s.ctx, val) +func (s *KeyValueStore) addEncodedData(data []byte) error { + _, err := s.dataWriter.Write(s.ctx, data) if err != nil { return err } - keyLen := binary.BigEndian.Uint64(val) - key := val[lengthBytes : lengthBytes+keyLen] + keyLen := binary.BigEndian.Uint64(data) + key := data[2*lengthBytes : 2*lengthBytes+keyLen] + if len(s.rc.currProp.firstKey) == 0 { s.rc.currProp.firstKey = key } s.rc.currProp.lastKey = key - s.offset += uint64(len(val)) - s.rc.currProp.size += uint64(len(val) - lengthBytes*2) + s.offset += uint64(len(data)) + s.rc.currProp.size += uint64(len(data) - 2*lengthBytes) s.rc.currProp.keys++ if s.rc.currProp.size >= s.rc.propSizeDist || s.rc.currProp.keys >= s.rc.propKeysDist { newProp := *s.rc.currProp s.rc.props = append(s.rc.props, &newProp) - + // reset currProp, and start to update this prop. s.rc.currProp.firstKey = nil s.rc.currProp.offset = s.offset s.rc.currProp.keys = 0 diff --git a/br/pkg/lightning/backend/external/file_test.go b/br/pkg/lightning/backend/external/file_test.go index 65ab999b17476..f58be194c0988 100644 --- a/br/pkg/lightning/backend/external/file_test.go +++ b/br/pkg/lightning/backend/external/file_test.go @@ -16,6 +16,7 @@ package external import ( "context" + "encoding/binary" "io" "testing" "time" @@ -25,6 +26,15 @@ import ( "golang.org/x/exp/rand" ) +func getEncodedData(key, value []byte) []byte { + buf := make([]byte, 8*2+len(key)+len(value)) + binary.BigEndian.PutUint64(buf, uint64(len(key))) + binary.BigEndian.PutUint64(buf[8:], uint64(len(value))) + copy(buf[8*2:], key) + copy(buf[8*2+len(key):], value) + return buf +} + func TestAddKeyValueMaintainRangeProperty(t *testing.T) { ctx := context.Background() memStore := storage.NewMemStorage() @@ -71,9 +81,9 @@ func TestAddKeyValueMaintainRangeProperty(t *testing.T) { require.NoError(t, err) require.Len(t, rc.props, 1) + kvStore.Close() err = writer.Close(ctx) require.NoError(t, err) - kvStore.Close() expected = &rangeProperty{ firstKey: k3, lastKey: k3, @@ -152,6 +162,7 @@ func TestKVReadWrite(t *testing.T) { err = kvStore.addEncodedData(getEncodedData(keys[i], values[i])) require.NoError(t, err) } + kvStore.Close() err = writer.Close(ctx) require.NoError(t, err) diff --git a/br/pkg/lightning/backend/external/iter.go b/br/pkg/lightning/backend/external/iter.go index 547d147132f1d..00e0ed159f7af 100644 --- a/br/pkg/lightning/backend/external/iter.go +++ b/br/pkg/lightning/backend/external/iter.go @@ -19,10 +19,13 @@ import ( "container/heap" "context" "io" + "sync" + "github.com/pingcap/errors" "github.com/pingcap/tidb/br/pkg/membuf" "github.com/pingcap/tidb/br/pkg/storage" "github.com/pingcap/tidb/pkg/util/logutil" + "github.com/pingcap/tidb/pkg/util/size" "go.uber.org/zap" "golang.org/x/sync/errgroup" ) @@ -33,10 +36,13 @@ type heapElem interface { // owned memory. Sometimes to reduce allocation the memory is shared between // multiple elements and it's needed to call it before we free the shared memory. cloneInnerFields() + len() int } type sortedReader[T heapElem] interface { path() string + // next returns the next element in the reader. If there is no more element, + // it returns io.EOF. next() (T, error) // When `need` is changed from false to true, the reader should prefetch more // data than usual when local cache is used up. It's used when one reader is more @@ -83,7 +89,7 @@ func (h *mergeHeap[T]) Pop() interface{} { type mergeIter[T heapElem, R sortedReader[T]] struct { h mergeHeap[T] readers []*R - curr T + curr T // TODO(lance6716): why we don't use h[0] as curr? lastReaderIdx int err error @@ -102,32 +108,24 @@ type mergeIter[T heapElem, R sortedReader[T]] struct { // readerOpenerFn is a function that opens a sorted reader. type readerOpenerFn[T heapElem, R sortedReader[T]] func() (*R, error) -// newMergeIter creates a merge iterator for multiple sorted reader opener -// functions. -func newMergeIter[ +// openAndGetFirstElem opens readers in parallel and reads the first element. +func openAndGetFirstElem[ T heapElem, R sortedReader[T], -](ctx context.Context, readerOpeners []readerOpenerFn[T, R], checkHotspot bool) (*mergeIter[T, R], error) { - logger := logutil.Logger(ctx) - readers := make([]*R, len(readerOpeners)) +](openers ...readerOpenerFn[T, R]) ([]*R, []T, error) { + wg := errgroup.Group{} + mayNilReaders := make([]*R, len(openers)) closeReaders := func() { - for _, rp := range readers { + for _, rp := range mayNilReaders { if rp == nil { continue } r := *rp - err := r.close() - if err != nil { - logger.Warn("failed to close reader", - zap.String("path", r.path()), - zap.Error(err)) - } + _ = r.close() } } - // Open readers in parallel. - wg := errgroup.Group{} - for i, f := range readerOpeners { + for i, f := range openers { i := i f := f wg.Go(func() error { @@ -135,17 +133,58 @@ func newMergeIter[ switch err { case nil: case io.EOF: - // will leave a nil reader in `readers` when reader is empty + // will leave a nil reader in `mayNilReaders` return nil default: return err } - readers[i] = rd + mayNilReaders[i] = rd return nil }) } if err := wg.Wait(); err != nil { closeReaders() + return nil, nil, err + } + + elements := make([]T, len(mayNilReaders)) + for j, rp := range mayNilReaders { + if rp == nil { + continue + } + rd := *rp + e, err := rd.next() + if err == io.EOF { + _ = rd.close() + mayNilReaders[j] = nil + continue + } + if err != nil { + closeReaders() + return nil, nil, err + } + elements[j] = e + } + return mayNilReaders, elements, nil +} + +// newMergeIter creates a merge iterator for multiple sorted reader opener +// functions. mergeIter.readers will have same order as input readerOpeners. +func newMergeIter[ + T heapElem, + R sortedReader[T], +]( + ctx context.Context, + readerOpeners []readerOpenerFn[T, R], + checkHotspot bool, +) (*mergeIter[T, R], error) { + if len(readerOpeners) == 0 { + return nil, errors.New("no reader openers") + } + logger := logutil.Logger(ctx) + + readers, firstElements, err := openAndGetFirstElem(readerOpeners...) + if err != nil { return nil, err } @@ -159,35 +198,17 @@ func newMergeIter[ } sampleKeySize := 0 sampleKeyCnt := 0 - for j := range i.readers { - if i.readers[j] == nil { + for j, rp := range i.readers { + // the reader has no content and is closed by openAndGetFirstElem + if rp == nil { continue } - rd := *i.readers[j] - e, err := rd.next() - if err == io.EOF { - closeErr := rd.close() - if closeErr != nil { - i.logger.Warn("failed to close reader", - zap.String("path", rd.path()), - zap.Error(closeErr)) - } - i.readers[j] = nil - continue - } - if err != nil { - closeErr := i.close() - if closeErr != nil { - i.logger.Warn("failed to close merge iterator", - zap.Error(closeErr)) - } - return nil, err - } + e := firstElements[j] i.h = append(i.h, mergeHeapElem[T]{ elem: e, readerIdx: j, }) - sampleKeySize += len(e.sortKey()) + sampleKeySize += e.len() sampleKeyCnt++ } // We check the hotspot when the elements size is almost the same as the concurrent reader buffer size. @@ -195,7 +216,8 @@ func newMergeIter[ if sampleKeySize == 0 || sampleKeySize/sampleKeyCnt == 0 { i.checkHotspotPeriod = 10000 } else { - i.checkHotspotPeriod = max(1000, ConcurrentReaderBufferSizePerConc*ConcurrentReaderConcurrency/(sampleKeySize/sampleKeyCnt)) + sizeThreshold := int(32 * size.MB) + i.checkHotspotPeriod = max(1000, sizeThreshold/(sampleKeySize/sampleKeyCnt)) } heap.Init(&i.h) return i, nil @@ -223,13 +245,16 @@ func (i *mergeIter[T, R]) close() error { return firstErr } -func (i *mergeIter[T, R]) currElem() T { - return i.curr -} - -// next forwards the iterator to the next element. It returns false if there is -// no available element. -func (i *mergeIter[T, R]) next() bool { +// next forwards the iterator to the next element. +// +// ok == false if there is no available element, and if the iterator is +// exhausted, i.err will be nil instead of io.EOF. For other errors, i.err will +// be set. +// +// closeReaderIdx >= 0 means that reader is closed after last invocation, -1 +// means no reader is closed. +func (i *mergeIter[T, R]) next() (closeReaderIdx int, ok bool) { + closeReaderIdx = -1 if i.lastReaderIdx >= 0 { if i.checkHotspot { i.hotspotMap[i.lastReaderIdx] = i.hotspotMap[i.lastReaderIdx] + 1 @@ -263,7 +288,7 @@ func (i *mergeIter[T, R]) next() bool { err := (*rp).switchConcurrentMode(isHotspot) if err != nil { i.err = err - return false + return closeReaderIdx, false } } i.checkHotspotCnt = 0 @@ -289,20 +314,138 @@ func (i *mergeIter[T, R]) next() bool { } i.readers[i.lastReaderIdx] = nil delete(i.hotspotMap, i.lastReaderIdx) + closeReaderIdx = i.lastReaderIdx default: + i.logger.Error("failed to read next element", + zap.String("path", rd.path()), + zap.Error(err)) i.err = err - return false + return closeReaderIdx, false } } i.lastReaderIdx = -1 if i.h.Len() == 0 { - return false + return closeReaderIdx, false } currMergeElem := heap.Pop(&i.h).(mergeHeapElem[T]) i.curr = currMergeElem.elem i.lastReaderIdx = currMergeElem.readerIdx - return true + return closeReaderIdx, true +} + +// limitSizeMergeIter acts like a mergeIter, except that each reader has a weight +// and it will try to open more readers with the total weight doesn't exceed the +// limit. +// +// Because it's like a mergeIter it's expected to iterate in ascending order, +// caller should set a proper limit to do not block opening new readers +// containing the next minimum element. +type limitSizeMergeIter[T heapElem, R sortedReader[T]] struct { + *mergeIter[T, R] + readerOpeners []readerOpenerFn[T, R] + weights []int64 + nextReaderIdx int + weightSum int64 + limit int64 +} + +func newLimitSizeMergeIter[ + T heapElem, + R sortedReader[T], +]( + ctx context.Context, + readerOpeners []readerOpenerFn[T, R], + weights []int64, + limit int64, +) (*limitSizeMergeIter[T, R], error) { + if limit <= 0 { + return nil, errors.Errorf("limit must be positive, got %d", limit) + } + end := 0 + cur := int64(0) + for ; end < len(weights); end++ { + if cur+weights[end] > limit { + break + } + cur += weights[end] + } + iter, err := newMergeIter(ctx, readerOpeners[:end], false) + if err != nil { + return nil, errors.Trace(err) + } + ret := &limitSizeMergeIter[T, R]{ + mergeIter: iter, + readerOpeners: readerOpeners, + weights: weights, + weightSum: cur, + nextReaderIdx: end, + limit: limit, + } + // newMergeIter may close readers if the reader has no content, so we need to + // fill more + for i, rp := range iter.readers { + if rp != nil { + continue + } + ret.weightSum -= weights[i] + } + + return ret, ret.tryOpenMoreReaders() +} + +func (i *limitSizeMergeIter[T, R]) tryOpenMoreReaders() error { + for i.nextReaderIdx < len(i.readerOpeners) { + weight := i.weights[i.nextReaderIdx] + if i.weightSum+weight > i.limit { + return nil + } + + opener := i.readerOpeners[i.nextReaderIdx] + i.nextReaderIdx++ + newReaders, firstElements, err := openAndGetFirstElem(opener) + if err != nil { + return err + } + newReader := newReaders[0] + newReaderIdx := len(i.mergeIter.readers) + i.mergeIter.readers = append(i.mergeIter.readers, newReader) + if newReader == nil { + // maybe this reader has no content, just skip it + continue + } + e := firstElements[0] + i.mergeIter.h = append(i.mergeIter.h, mergeHeapElem[T]{ + elem: e, + readerIdx: newReaderIdx, + }) + heap.Fix(&i.mergeIter.h, len(i.mergeIter.h)-1) + i.weightSum += weight + } + return nil +} + +func (i *limitSizeMergeIter[T, R]) next() (ok bool, closeReaderIdx int) { + closeReaderIdx, ok = i.mergeIter.next() + if closeReaderIdx == -1 { + return + } + + mergeIterDrained := !ok && i.mergeIter.h.Len() == 0 + + // limitSizeMergeIter will try to open next reader when one reader is closed. + i.weightSum -= i.weights[closeReaderIdx] + if err := i.tryOpenMoreReaders(); err != nil { + i.mergeIter.err = err + return false, closeReaderIdx + } + + // we need to call next once because mergeIter doesn't use h[0] as current value, + // but a separate curr field + if mergeIterDrained && i.mergeIter.h.Len() > 0 { + _, ok = i.mergeIter.next() + } + return } // begin instantiations of mergeIter @@ -321,6 +464,10 @@ func (p *kvPair) cloneInnerFields() { p.value = append([]byte{}, p.value...) } +func (p *kvPair) len() int { + return len(p.key) + len(p.value) +} + type kvReaderProxy struct { p string r *kvReader @@ -362,13 +509,17 @@ func NewMergeKVIter( exStorage storage.ExternalStorage, readBufferSize int, checkHotspot bool, + outerConcurrency int, ) (*MergeKVIter, error) { readerOpeners := make([]readerOpenerFn[*kvPair, kvReaderProxy], 0, len(paths)) - largeBufSize := ConcurrentReaderBufferSizePerConc * ConcurrentReaderConcurrency + if outerConcurrency <= 0 { + outerConcurrency = 1 + } + concurrentReaderConcurrency := max(256/outerConcurrency, 8) + largeBufSize := ConcurrentReaderBufferSizePerConc * concurrentReaderConcurrency memPool := membuf.NewPool( - membuf.WithPoolSize(1), // currently only one reader will become hotspot + membuf.WithBlockNum(1), // currently only one reader will become hotspot membuf.WithBlockSize(largeBufSize), - membuf.WithLargeAllocThreshold(largeBufSize), ) for i := range paths { @@ -381,7 +532,7 @@ func NewMergeKVIter( rd.byteReader.enableConcurrentRead( exStorage, paths[i], - ConcurrentReaderConcurrency, + concurrentReaderConcurrency, ConcurrentReaderBufferSizePerConc, memPool.NewBuffer(), ) @@ -400,7 +551,8 @@ func (i *MergeKVIter) Error() error { // Next moves the iterator to the next position. When it returns false, the iterator is not usable. func (i *MergeKVIter) Next() bool { - return i.iter.next() + _, ok := i.iter.next() + return ok } // Key returns the current key. @@ -432,6 +584,11 @@ func (p *rangeProperty) cloneInnerFields() { p.lastKey = append([]byte{}, p.lastKey...) } +func (p *rangeProperty) len() int { + // 24 is the length of member offset, size and keys, which are all uint64 + return len(p.firstKey) + len(p.lastKey) + 24 +} + type statReaderProxy struct { p string r *statsReader @@ -451,32 +608,217 @@ func (p statReaderProxy) close() error { return p.r.Close() } +// mergePropBaseIter handles one MultipleFilesStat and use limitSizeMergeIter to +// run heap sort on it. Also, it's a sortedReader of *rangeProperty that can be +// used by MergePropIter to handle multiple MultipleFilesStat. +type mergePropBaseIter struct { + iter *limitSizeMergeIter[*rangeProperty, statReaderProxy] + closeReaderFlag *bool + closeCh chan struct{} + wg *sync.WaitGroup +} + +type readerAndError struct { + r *statReaderProxy + err error +} + +var errMergePropBaseIterClosed = errors.New("mergePropBaseIter is closed") + +func newMergePropBaseIter( + ctx context.Context, + multiStat MultipleFilesStat, + exStorage storage.ExternalStorage, +) (*mergePropBaseIter, error) { + var limit int64 + if multiStat.MaxOverlappingNum <= 0 { + // make it an easy usage that caller don't need to set it + limit = int64(len(multiStat.Filenames)) + } else { + // we have no time to open the next reader before we get the next value for + // limitSizeMergeIter, so we directly open one more reader. If we don't do this, + // considering: + // + // [1, 11, ... + // [2, 12, ... + // [3, 13, ... + // + // we limit the size to 2, so after read 2, the next read will be 11 and then we + // insert the third reader into heap. TODO: refine limitSizeMergeIter and mergeIter + // to support this. + limit = multiStat.MaxOverlappingNum + 1 + } + limit = min(limit, int64(len(multiStat.Filenames))) + + // we are rely on the caller have reduced the overall overlapping to less than + // MergeSortOverlapThreshold for []MultipleFilesStat. And we are going to open + // about 8000 connection to read files. + preOpenLimit := limit * 8 + preOpenLimit = min(preOpenLimit, int64(len(multiStat.Filenames))) + preOpenCh := make(chan chan readerAndError, preOpenLimit-limit) + closeCh := make(chan struct{}) + wg := &sync.WaitGroup{} + wg.Add(1) + go func() { + defer close(preOpenCh) + defer wg.Done() + // newLimitSizeMergeIter will open #limit readers at the beginning, and for rest + // readers we open them in advance to reduce block when we need to open them. + for i := int(limit); i < len(multiStat.Filenames); i++ { + filePair := multiStat.Filenames[i] + path := filePair[1] + asyncTask := make(chan readerAndError, 1) + wg.Add(1) + go func() { + defer close(asyncTask) + defer wg.Done() + rd, err := newStatsReader(ctx, exStorage, path, 500*1024) + select { + case <-closeCh: + _ = rd.Close() + return + case asyncTask <- readerAndError{r: &statReaderProxy{p: path, r: rd}, err: err}: + } + }() + select { + case <-closeCh: + // when close, no other methods is called simultaneously, so this goroutine can + // check the size of channel and drain all + for j := len(preOpenCh); j > 0; j-- { + asyncTask2 := <-preOpenCh + t, ok := <-asyncTask2 + if !ok { + continue + } + _ = t.r.close() + } + t, ok := <-asyncTask + if ok { + _ = t.r.close() + } + return + case preOpenCh <- asyncTask: + } + } + }() + + readerOpeners := make([]readerOpenerFn[*rangeProperty, statReaderProxy], 0, len(multiStat.Filenames)) + // first `limit` reader will be opened by newLimitSizeMergeIter + for i := 0; i < int(limit); i++ { + path := multiStat.Filenames[i][1] + readerOpeners = append(readerOpeners, func() (*statReaderProxy, error) { + rd, err := newStatsReader(ctx, exStorage, path, 500*1024) + if err != nil { + return nil, err + } + return &statReaderProxy{p: path, r: rd}, nil + }) + } + // rest reader will be opened in above goroutine, just read them from channel + for i := int(limit); i < len(multiStat.Filenames); i++ { + readerOpeners = append(readerOpeners, func() (*statReaderProxy, error) { + select { + case <-closeCh: + return nil, errMergePropBaseIterClosed + case asyncTask, ok := <-preOpenCh: + if !ok { + return nil, errMergePropBaseIterClosed + } + select { + case <-closeCh: + return nil, errMergePropBaseIterClosed + case t, ok := <-asyncTask: + if !ok { + return nil, errMergePropBaseIterClosed + } + return t.r, t.err + } + } + }) + } + weight := make([]int64, len(readerOpeners)) + for i := range weight { + weight[i] = 1 + } + i, err := newLimitSizeMergeIter(ctx, readerOpeners, weight, limit) + return &mergePropBaseIter{iter: i, closeCh: closeCh, wg: wg}, err +} + +func (m mergePropBaseIter) path() string { + return "mergePropBaseIter" +} + +func (m mergePropBaseIter) next() (*rangeProperty, error) { + ok, closeReaderIdx := m.iter.next() + if m.closeReaderFlag != nil && closeReaderIdx >= 0 { + *m.closeReaderFlag = true + } + if !ok { + if m.iter.err == nil { + return nil, io.EOF + } + return nil, m.iter.err + } + return m.iter.curr, nil +} + +func (m mergePropBaseIter) switchConcurrentMode(bool) error { + return nil +} + +// close should not be called concurrently with next. +func (m mergePropBaseIter) close() error { + close(m.closeCh) + m.wg.Wait() + return m.iter.close() +} + // MergePropIter is an iterator that merges multiple range properties from different files. type MergePropIter struct { - iter *mergeIter[*rangeProperty, statReaderProxy] + iter *limitSizeMergeIter[*rangeProperty, mergePropBaseIter] + baseCloseReaderFlag *bool } // NewMergePropIter creates a new MergePropIter. +// +// Input MultipleFilesStat should be processed by functions like +// MergeOverlappingFiles to reduce overlapping to less than +// MergeSortOverlapThreshold. MergePropIter will only open needed +// MultipleFilesStat and its Filenames when iterates, and input MultipleFilesStat +// must guarantee its order and its Filename order can be process from left to +// right. func NewMergePropIter( ctx context.Context, - paths []string, + multiStat []MultipleFilesStat, exStorage storage.ExternalStorage, - checkHotSpot bool, + _ bool, ) (*MergePropIter, error) { - readerOpeners := make([]readerOpenerFn[*rangeProperty, statReaderProxy], 0, len(paths)) - for i := range paths { - i := i - readerOpeners = append(readerOpeners, func() (*statReaderProxy, error) { - rd, err := newStatsReader(ctx, exStorage, paths[i], 4096) + closeReaderFlag := false + readerOpeners := make([]readerOpenerFn[*rangeProperty, mergePropBaseIter], 0, len(multiStat)) + for _, m := range multiStat { + m := m + readerOpeners = append(readerOpeners, func() (*mergePropBaseIter, error) { + baseIter, err := newMergePropBaseIter(ctx, m, exStorage) if err != nil { return nil, err } - return &statReaderProxy{p: paths[i], r: rd}, nil + baseIter.closeReaderFlag = &closeReaderFlag + return baseIter, nil }) } + weight := make([]int64, len(multiStat)) + for i := range weight { + weight[i] = multiStat[i].MaxOverlappingNum + } + + // see the comment of newMergePropBaseIter why we need to raise the limit + limit := MergeSortOverlapThreshold * 2 - it, err := newMergeIter[*rangeProperty, statReaderProxy](ctx, readerOpeners, checkHotSpot) - return &MergePropIter{iter: it}, err + it, err := newLimitSizeMergeIter(ctx, readerOpeners, weight, limit) + return &MergePropIter{ + iter: it, + baseCloseReaderFlag: &closeReaderFlag, + }, err } // Error returns the error of the iterator. @@ -486,15 +828,19 @@ func (i *MergePropIter) Error() error { // Next moves the iterator to the next position. func (i *MergePropIter) Next() bool { - return i.iter.next() + *i.baseCloseReaderFlag = false + ok, _ := i.iter.next() + return ok } func (i *MergePropIter) prop() *rangeProperty { return i.iter.curr } -func (i *MergePropIter) readerIndex() int { - return i.iter.lastReaderIdx +// readerIndex returns the indices of last accessed 2 level reader. +func (i *MergePropIter) readerIndex() (int, int) { + idx := i.iter.lastReaderIdx + return idx, i.iter.readers[idx].iter.lastReaderIdx } // Close closes the iterator. diff --git a/br/pkg/lightning/backend/external/iter_test.go b/br/pkg/lightning/backend/external/iter_test.go index e9b27f3793b6e..cd7f9865d8cde 100644 --- a/br/pkg/lightning/backend/external/iter_test.go +++ b/br/pkg/lightning/backend/external/iter_test.go @@ -60,15 +60,6 @@ func (r *trackOpenFileReader) Close() error { return nil } -func getEncodedData(key, value []byte) []byte { - buf := make([]byte, 8*2+len(key)+len(value)) - binary.BigEndian.PutUint64(buf, uint64(len(key))) - copy(buf[8:], key) - binary.BigEndian.PutUint64(buf[8+len(key):], uint64(len(value))) - copy(buf[8*2+len(key):], value) - return buf -} - func TestMergeKVIter(t *testing.T) { ctx := context.Background() memStore := storage.NewMemStorage() @@ -92,12 +83,13 @@ func TestMergeKVIter(t *testing.T) { err = kvStore.addEncodedData(getEncodedData([]byte(kv[0]), []byte(kv[1]))) require.NoError(t, err) } + kvStore.Close() err = writer.Close(ctx) require.NoError(t, err) } trackStore := &trackOpenMemStorage{MemStorage: memStore} - iter, err := NewMergeKVIter(ctx, filenames, []uint64{0, 0, 0}, trackStore, 5, true) + iter, err := NewMergeKVIter(ctx, filenames, []uint64{0, 0, 0}, trackStore, 5, true, 0) require.NoError(t, err) // close one empty file immediately in NewMergeKVIter require.EqualValues(t, 2, trackStore.opened.Load()) @@ -144,12 +136,13 @@ func TestOneUpstream(t *testing.T) { err = kvStore.addEncodedData(getEncodedData([]byte(kv[0]), []byte(kv[1]))) require.NoError(t, err) } + kvStore.Close() err = writer.Close(ctx) require.NoError(t, err) } trackStore := &trackOpenMemStorage{MemStorage: memStore} - iter, err := NewMergeKVIter(ctx, filenames, []uint64{0, 0, 0}, trackStore, 5, true) + iter, err := NewMergeKVIter(ctx, filenames, []uint64{0, 0, 0}, trackStore, 5, true, 0) require.NoError(t, err) require.EqualValues(t, 1, trackStore.opened.Load()) @@ -186,14 +179,14 @@ func TestAllEmpty(t *testing.T) { } trackStore := &trackOpenMemStorage{MemStorage: memStore} - iter, err := NewMergeKVIter(ctx, []string{filenames[0]}, []uint64{0}, trackStore, 5, false) + iter, err := NewMergeKVIter(ctx, []string{filenames[0]}, []uint64{0}, trackStore, 5, false, 0) require.NoError(t, err) require.EqualValues(t, 0, trackStore.opened.Load()) require.False(t, iter.Next()) require.NoError(t, iter.Error()) require.NoError(t, iter.Close()) - iter, err = NewMergeKVIter(ctx, filenames, []uint64{0, 0}, trackStore, 5, false) + iter, err = NewMergeKVIter(ctx, filenames, []uint64{0, 0}, trackStore, 5, false, 0) require.NoError(t, err) require.EqualValues(t, 0, trackStore.opened.Load()) require.False(t, iter.Next()) @@ -222,6 +215,7 @@ func TestCorruptContent(t *testing.T) { err = kvStore.addEncodedData(getEncodedData([]byte(kv[0]), []byte(kv[1]))) require.NoError(t, err) } + kvStore.Close() if i == 0 { _, err = writer.Write(ctx, []byte("corrupt")) require.NoError(t, err) @@ -231,7 +225,7 @@ func TestCorruptContent(t *testing.T) { } trackStore := &trackOpenMemStorage{MemStorage: memStore} - iter, err := NewMergeKVIter(ctx, filenames, []uint64{0, 0, 0}, trackStore, 5, true) + iter, err := NewMergeKVIter(ctx, filenames, []uint64{0, 0, 0}, trackStore, 5, true, 0) require.NoError(t, err) require.EqualValues(t, 2, trackStore.opened.Load()) @@ -319,7 +313,7 @@ func testMergeIterSwitchMode(t *testing.T, f func([]byte, int) []byte) { offsets := make([]uint64, len(dataNames)) - iter, err := NewMergeKVIter(context.Background(), dataNames, offsets, st, 2048, true) + iter, err := NewMergeKVIter(context.Background(), dataNames, offsets, st, 2048, true, 0) require.NoError(t, err) for iter.Next() { @@ -350,7 +344,7 @@ func TestReadAfterCloseConnReader(t *testing.T) { curBufOffset: 8, logger: logutil.Logger(ctx), } - reader.curBuf = reader.smallBuf + reader.curBuf = [][]byte{reader.smallBuf} pool := membuf.NewPool() reader.concurrentReader.largeBufferPool = pool.NewBuffer() reader.concurrentReader.store = storage.NewMemStorage() @@ -390,12 +384,13 @@ func TestHotspot(t *testing.T) { err = kvStore.addEncodedData(getEncodedData([]byte(k), value)) require.NoError(t, err) } + kvStore.Close() err = writer.Close(ctx) require.NoError(t, err) } // readerBufSize = 8+5+8+5, every KV will cause reload - iter, err := NewMergeKVIter(ctx, filenames, make([]uint64, len(filenames)), store, 26, true) + iter, err := NewMergeKVIter(ctx, filenames, make([]uint64, len(filenames)), store, 26, true, 0) require.NoError(t, err) iter.iter.checkHotspotPeriod = 2 // after read key00 and key01 from reader_0, it becomes hotspot @@ -499,7 +494,7 @@ func TestMemoryUsageWhenHotspotChange(t *testing.T) { beforeMem := getMemoryInUse() - iter, err := NewMergeKVIter(ctx, filenames, make([]uint64, len(filenames)), store, 1024, true) + iter, err := NewMergeKVIter(ctx, filenames, make([]uint64, len(filenames)), store, 1024, true, 16) require.NoError(t, err) iter.iter.checkHotspotPeriod = 10 i := 0 @@ -518,3 +513,260 @@ func TestMemoryUsageWhenHotspotChange(t *testing.T) { require.Less(t, delta, uint64(4*1024*1024*1024)) _ = iter.Close() } + +type myInt int + +func (m myInt) sortKey() []byte { + return []byte{byte(m)} +} + +func (m myInt) cloneInnerFields() {} + +func (m myInt) len() int { return 1 } + +type intReader struct { + ints []int + refCnt *atomic.Int64 +} + +const errInt = -1 + +func (i *intReader) path() string { return "" } + +func (i *intReader) next() (myInt, error) { + if len(i.ints) == 0 { + return 0, io.EOF + } + ret := i.ints[0] + i.ints = i.ints[1:] + if ret == errInt { + return 0, fmt.Errorf("mock error") + } + return myInt(ret), nil +} + +func (i *intReader) switchConcurrentMode(bool) error { return nil } + +func (i *intReader) close() error { + i.refCnt.Dec() + return nil +} + +func buildOpener(in [][]int, refCnt *atomic.Int64) []readerOpenerFn[myInt, *intReader] { + ret := make([]readerOpenerFn[myInt, *intReader], 0, len(in)) + for _, ints := range in { + ints := ints + ret = append(ret, func() (**intReader, error) { + refCnt.Inc() + r := &intReader{ints, refCnt} + return &r, nil + }) + } + return ret +} + +func TestLimitSizeMergeIter(t *testing.T) { + ctx := context.Background() + refCnt := atomic.NewInt64(0) + readerOpeners := buildOpener([][]int{ + {1, 2, 3}, {4, 5, 6}, {7, 8, 9}, + }, refCnt) + weight := []int64{1, 1, 1} + + oneToNine := []int{1, 2, 3, 4, 5, 6, 7, 8, 9} + for limit := int64(1); limit <= 4; limit++ { + refCnt.Store(0) + i, err := newLimitSizeMergeIter(ctx, readerOpeners, weight, limit) + require.NoError(t, err) + var got []int + ok, _ := i.next() + for ok { + got = append(got, int(i.curr)) + require.LessOrEqual(t, refCnt.Load(), limit) + ok, _ = i.next() + } + require.NoError(t, i.err) + require.Equal(t, oneToNine, got) + + // check it can return error + for errIdx := 1; errIdx <= 9; errIdx++ { + nums := make([]int, 9) + for i := range nums { + nums[i] = i + 1 + if nums[i] == errIdx { + nums[i] = errInt + } + } + readerOpeners := buildOpener([][]int{nums[:3], nums[3:6], nums[6:]}, refCnt) + i, err = newLimitSizeMergeIter(ctx, readerOpeners, weight, limit) + if err != nil { + require.EqualError(t, err, "mock error") + continue + } + var got []int + ok, _ = i.next() + for ok { + got = append(got, int(i.curr)) + ok, _ = i.next() + } + require.ErrorContains(t, i.err, "mock error") + require.Less(t, len(got), 9) + } + } +} + +func TestLimitSizeMergeIterDiffWeight(t *testing.T) { + ctx := context.Background() + refCnt := atomic.NewInt64(0) + readerOpeners := buildOpener([][]int{ + {1, 4, 7}, {2, 5}, {3}, + {10}, + {11, 14, 17}, {12, 15}, {13}, + }, refCnt) + weight := []int64{ + 1, 1, 1, + 3, + 1, 1, 1, + } + limit := int64(3) + + expected := []int{1, 2, 3, 4, 5, 7, 10, 11, 12, 13, 14, 15, 17} + expectedRefCnt := []int64{3, 3, 3, 2, 2, 1, 1, 3, 3, 3, 2, 2, 1} + iter, err := newLimitSizeMergeIter(ctx, readerOpeners, weight, limit) + require.NoError(t, err) + for i, exp := range expected { + ok, _ := iter.next() + require.True(t, ok) + require.Equal(t, exp, int(iter.curr), "i: %d", i) + require.Equal(t, expectedRefCnt[i], refCnt.Load(), "i: %d", i) + } + + ok, _ := iter.next() + require.False(t, ok) + require.NoError(t, iter.err) + require.Equal(t, int64(0), refCnt.Load()) +} + +type slowOpenStorage struct { + *storage.MemStorage + sleep time.Duration + openCnt atomic.Int32 +} + +func (s *slowOpenStorage) Open( + ctx context.Context, + filePath string, + o *storage.ReaderOption, +) (storage.ExternalFileReader, error) { + time.Sleep(s.sleep) + s.openCnt.Inc() + return s.MemStorage.Open(ctx, filePath, o) +} + +func TestMergePropBaseIter(t *testing.T) { + // this test should be finished around 1 second. However, due to CI is not + // stable, we don't check the time. + oneOpenSleep := time.Second + + fileNum := 16 + filenames := make([]string, fileNum) + for i := range filenames { + filenames[i] = fmt.Sprintf("/test%06d", i) + } + ctx := context.Background() + store := &slowOpenStorage{ + MemStorage: storage.NewMemStorage(), + sleep: oneOpenSleep, + } + for i, filename := range filenames { + writer, err := store.Create(ctx, filename, nil) + require.NoError(t, err) + prop := &rangeProperty{firstKey: []byte{byte(i)}} + buf := encodeMultiProps(nil, []*rangeProperty{prop}) + _, err = writer.Write(ctx, buf) + require.NoError(t, err) + err = writer.Close(ctx) + require.NoError(t, err) + } + + multiStat := MultipleFilesStat{MaxOverlappingNum: 1} + for _, f := range filenames { + multiStat.Filenames = append(multiStat.Filenames, [2]string{"", f}) + } + iter, err := newMergePropBaseIter(ctx, multiStat, store) + require.NoError(t, err) + for i := 0; i < fileNum; i++ { + p, err := iter.next() + require.NoError(t, err) + require.EqualValues(t, i, p.firstKey[0]) + } + + _, err = iter.next() + require.ErrorIs(t, err, io.EOF) + require.EqualValues(t, fileNum, store.openCnt.Load()) +} + +func TestEmptyBaseReader4LimitSizeMergeIter(t *testing.T) { + fileNum := 100 + filenames := make([]string, fileNum) + for i := range filenames { + filenames[i] = fmt.Sprintf("/test%06d", i) + } + ctx := context.Background() + store := &slowOpenStorage{ + MemStorage: storage.NewMemStorage(), + } + // empty file so reader will be closed at init + for _, filename := range filenames { + writer, err := store.Create(ctx, filename, nil) + require.NoError(t, err) + err = writer.Close(ctx) + require.NoError(t, err) + } + + multiStat := MultipleFilesStat{MaxOverlappingNum: 1} + for _, f := range filenames { + multiStat.Filenames = append(multiStat.Filenames, [2]string{"", f}) + } + iter, err := newMergePropBaseIter(ctx, multiStat, store) + require.NoError(t, err) + + _, err = iter.next() + require.ErrorIs(t, err, io.EOF) + require.EqualValues(t, fileNum, store.openCnt.Load()) +} + +func TestCloseLimitSizeMergeIterHalfway(t *testing.T) { + fileNum := 10000 + filenames := make([]string, fileNum) + for i := range filenames { + filenames[i] = fmt.Sprintf("/test%06d", i) + } + ctx := context.Background() + store := &trackOpenMemStorage{MemStorage: storage.NewMemStorage()} + + for i, filename := range filenames { + writer, err := store.Create(ctx, filename, nil) + require.NoError(t, err) + prop := &rangeProperty{firstKey: []byte{byte(i)}} + buf := encodeMultiProps(nil, []*rangeProperty{prop}) + _, err = writer.Write(ctx, buf) + require.NoError(t, err) + err = writer.Close(ctx) + require.NoError(t, err) + } + + multiStat := MultipleFilesStat{MaxOverlappingNum: 1} + for _, f := range filenames { + multiStat.Filenames = append(multiStat.Filenames, [2]string{"", f}) + } + iter, err := newMergePropBaseIter(ctx, multiStat, store) + require.NoError(t, err) + + _, err = iter.next() + require.NoError(t, err) + + err = iter.close() + require.NoError(t, err) + require.EqualValues(t, 0, store.opened.Load()) +} diff --git a/br/pkg/lightning/backend/external/kv_reader.go b/br/pkg/lightning/backend/external/kv_reader.go index 7659ecd6bb4f6..def354b18f884 100644 --- a/br/pkg/lightning/backend/external/kv_reader.go +++ b/br/pkg/lightning/backend/external/kv_reader.go @@ -36,11 +36,12 @@ func newKVReader( initFileOffset uint64, bufSize int, ) (*kvReader, error) { - sr, err := openStoreReaderAndSeek(ctx, store, name, initFileOffset) + oneThird := bufSize / 3 + sr, err := openStoreReaderAndSeek(ctx, store, name, initFileOffset, oneThird*2) if err != nil { return nil, err } - br, err := newByteReader(ctx, sr, bufSize) + br, err := newByteReader(ctx, sr, oneThird) if err != nil { return nil, err } @@ -50,26 +51,21 @@ func newKVReader( } func (r *kvReader) nextKV() (key, val []byte, err error) { - r.byteReader.reset() lenBytes, err := r.byteReader.readNBytes(8) if err != nil { return nil, nil, err } - keyLen := int(binary.BigEndian.Uint64(*lenBytes)) - keyPtr, err := r.byteReader.readNBytes(keyLen) - if err != nil { - return nil, nil, noEOF(err) - } + keyLen := int(binary.BigEndian.Uint64(lenBytes)) lenBytes, err = r.byteReader.readNBytes(8) if err != nil { return nil, nil, noEOF(err) } - valLen := int(binary.BigEndian.Uint64(*lenBytes)) - valPtr, err := r.byteReader.readNBytes(valLen) + valLen := int(binary.BigEndian.Uint64(lenBytes)) + keyAndValue, err := r.byteReader.readNBytes(keyLen + valLen) if err != nil { return nil, nil, noEOF(err) } - return *keyPtr, *valPtr, nil + return keyAndValue[:keyLen], keyAndValue[keyLen:], nil } // noEOF converts the EOF error to io.ErrUnexpectedEOF. diff --git a/br/pkg/lightning/backend/external/merge.go b/br/pkg/lightning/backend/external/merge.go index a2eb92c924733..71b30a47959bf 100644 --- a/br/pkg/lightning/backend/external/merge.go +++ b/br/pkg/lightning/backend/external/merge.go @@ -2,10 +2,8 @@ package external import ( "context" - "errors" "github.com/google/uuid" - "github.com/pingcap/failpoint" "github.com/pingcap/tidb/br/pkg/lightning/log" "github.com/pingcap/tidb/br/pkg/storage" tidbkv "github.com/pingcap/tidb/pkg/kv" @@ -17,9 +15,22 @@ import ( // MergeOverlappingFiles reads from given files whose key range may overlap // and writes to new sorted, nonoverlapping files. -func MergeOverlappingFiles(ctx context.Context, paths []string, store storage.ExternalStorage, partSize int64, readBufferSize int, - newFilePrefix string, blockSize int, writeBatchCount uint64, propSizeDist uint64, propKeysDist uint64, - onClose OnCloseFunc, concurrency int, checkHotspot bool) error { +func MergeOverlappingFiles( + ctx context.Context, + paths []string, + store storage.ExternalStorage, + partSize int64, + readBufferSize int, + newFilePrefix string, + blockSize int, + memSizeLimit uint64, + writeBatchCount uint64, + propSizeDist uint64, + propKeysDist uint64, + onClose OnCloseFunc, + concurrency int, + checkHotspot bool, +) error { var dataFilesSlice [][]string batchCount := 1 if len(paths) > concurrency { @@ -43,7 +54,7 @@ func MergeOverlappingFiles(ctx context.Context, paths []string, store storage.Ex for _, files := range dataFilesSlice { files := files eg.Go(func() error { - return MergeOverlappingFilesV2( + return mergeOverlappingFilesInternal( egCtx, files, store, @@ -51,7 +62,7 @@ func MergeOverlappingFiles(ctx context.Context, paths []string, store storage.Ex readBufferSize, newFilePrefix, uuid.New().String(), - DefaultMemSizeLimit, + memSizeLimit, blockSize, writeBatchCount, propSizeDist, @@ -64,68 +75,9 @@ func MergeOverlappingFiles(ctx context.Context, paths []string, store storage.Ex return eg.Wait() } -// unused for now. -func mergeOverlappingFilesImpl(ctx context.Context, - paths []string, - store storage.ExternalStorage, - readBufferSize int, - newFilePrefix string, - writerID string, - memSizeLimit uint64, - blockSize int, - writeBatchCount uint64, - propSizeDist uint64, - propKeysDist uint64, - onClose OnCloseFunc, - checkHotspot bool, -) (err error) { - task := log.BeginTask(logutil.Logger(ctx).With( - zap.String("writer-id", writerID), - zap.Int("file-count", len(paths)), - ), "merge overlapping files") - defer func() { - task.End(zap.ErrorLevel, err) - }() - - zeroOffsets := make([]uint64, len(paths)) - iter, err := NewMergeKVIter(ctx, paths, zeroOffsets, store, readBufferSize, checkHotspot) - if err != nil { - return err - } - defer func() { - err := iter.Close() - if err != nil { - logutil.Logger(ctx).Warn("close iterator failed", zap.Error(err)) - } - }() - - writer := NewWriterBuilder(). - SetMemorySizeLimit(memSizeLimit). - SetBlockSize(blockSize). - SetOnCloseFunc(onClose). - SetWriterBatchCount(writeBatchCount). - SetPropSizeDistance(propSizeDist). - SetPropKeysDistance(propKeysDist). - Build(store, newFilePrefix, writerID) - - // currently use same goroutine to do read and write. The main advantage is - // there's no KV copy and iter can reuse the buffer. - for iter.Next() { - err = writer.WriteRow(ctx, iter.Key(), iter.Value(), nil) - if err != nil { - return err - } - } - err = iter.Error() - if err != nil { - return err - } - return writer.Close(ctx) -} - -// MergeOverlappingFilesV2 reads from given files whose key range may overlap +// mergeOverlappingFilesInternal reads from given files whose key range may overlap // and writes to one new sorted, nonoverlapping files. -func MergeOverlappingFilesV2( +func mergeOverlappingFilesInternal( ctx context.Context, paths []string, store storage.ExternalStorage, @@ -149,19 +101,8 @@ func MergeOverlappingFilesV2( task.End(zap.ErrorLevel, err) }() - failpoint.Inject("mergeOverlappingFilesImpl", func(val failpoint.Value) { - if val.(string) == paths[0] { - failpoint.Return(errors.New("injected error")) - } else { - select { - case <-ctx.Done(): - failpoint.Return(ctx.Err()) - } - } - }) - zeroOffsets := make([]uint64, len(paths)) - iter, err := NewMergeKVIter(ctx, paths, zeroOffsets, store, readBufferSize, checkHotspot) + iter, err := NewMergeKVIter(ctx, paths, zeroOffsets, store, readBufferSize, checkHotspot, 0) if err != nil { return err } @@ -178,7 +119,6 @@ func MergeOverlappingFilesV2( SetWriterBatchCount(writeBatchCount). SetPropKeysDistance(propKeysDist). SetPropSizeDistance(propSizeDist). - SetOnCloseFunc(onClose). BuildOneFile(store, newFilePrefix, writerID) err = writer.Init(ctx, partSize) if err != nil { @@ -218,9 +158,5 @@ func MergeOverlappingFilesV2( }) } - err = writer.Close(ctx) - if err != nil { - return err - } - return nil + return writer.Close(ctx) } diff --git a/br/pkg/lightning/backend/external/merge_test.go b/br/pkg/lightning/backend/external/merge_test.go deleted file mode 100644 index 799121c4fc7fb..0000000000000 --- a/br/pkg/lightning/backend/external/merge_test.go +++ /dev/null @@ -1,45 +0,0 @@ -// Copyright 2023 PingCAP, 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. - -package external - -import ( - "context" - "testing" - - "github.com/pingcap/failpoint" - "github.com/stretchr/testify/require" -) - -func TestMergeOverlappingFiles(t *testing.T) { - require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/br/pkg/lightning/backend/external/mergeOverlappingFilesImpl", `return("a")`)) - t.Cleanup(func() { - require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/br/pkg/lightning/backend/external/mergeOverlappingFilesImpl")) - }) - require.ErrorContains(t, MergeOverlappingFiles( - context.Background(), - []string{"a", "b", "c", "d", "e"}, - nil, - 1, - 1, - "", - 1, - 1, - 1, - 1, - nil, - 5, - false, - ), "injected error") -} diff --git a/br/pkg/lightning/backend/external/merge_v2.go b/br/pkg/lightning/backend/external/merge_v2.go new file mode 100644 index 0000000000000..88c23106f120e --- /dev/null +++ b/br/pkg/lightning/backend/external/merge_v2.go @@ -0,0 +1,191 @@ +package external + +import ( + "bytes" + "context" + "math" + "time" + + "github.com/jfcg/sorty/v2" + "github.com/pingcap/failpoint" + "github.com/pingcap/tidb/br/pkg/lightning/log" + "github.com/pingcap/tidb/br/pkg/membuf" + "github.com/pingcap/tidb/br/pkg/storage" + "github.com/pingcap/tidb/pkg/kv" + "github.com/pingcap/tidb/pkg/util/logutil" + "github.com/pingcap/tidb/pkg/util/size" + "go.uber.org/zap" +) + +// MergeOverlappingFilesV2 reads from given files whose key range may overlap +// and writes to new sorted, nonoverlapping files. +// Using 1 readAllData and 1 writer. +func MergeOverlappingFilesV2( + ctx context.Context, + multiFileStat []MultipleFilesStat, + store storage.ExternalStorage, + startKey []byte, + endKey []byte, + partSize int64, + newFilePrefix string, + writerID string, + blockSize int, + writeBatchCount uint64, + propSizeDist uint64, + propKeysDist uint64, + onClose OnCloseFunc, + concurrency int, + checkHotspot bool, +) (err error) { + fileCnt := 0 + for _, m := range multiFileStat { + fileCnt += len(m.Filenames) + } + task := log.BeginTask(logutil.Logger(ctx).With( + zap.Int("file-count", fileCnt), + zap.Binary("start-key", startKey), + zap.Binary("end-key", endKey), + zap.String("new-file-prefix", newFilePrefix), + zap.Int("concurrency", concurrency), + ), "merge overlapping files") + defer func() { + task.End(zap.ErrorLevel, err) + }() + + rangesGroupSize := 4 * size.GB + failpoint.Inject("mockRangesGroupSize", func(val failpoint.Value) { + rangesGroupSize = uint64(val.(int)) + }) + + splitter, err := NewRangeSplitter( + ctx, + multiFileStat, + store, + int64(rangesGroupSize), + math.MaxInt64, + int64(4*size.GB), + math.MaxInt64, + checkHotspot, + ) + if err != nil { + return err + } + + writer := NewWriterBuilder(). + SetMemorySizeLimit(DefaultMemSizeLimit). + SetBlockSize(blockSize). + SetPropKeysDistance(propKeysDist). + SetPropSizeDistance(propSizeDist). + SetOnCloseFunc(onClose). + BuildOneFile( + store, + newFilePrefix, + writerID) + defer func() { + err = splitter.Close() + if err != nil { + logutil.Logger(ctx).Warn("close range splitter failed", zap.Error(err)) + } + err = writer.Close(ctx) + if err != nil { + logutil.Logger(ctx).Warn("close writer failed", zap.Error(err)) + } + }() + + err = writer.Init(ctx, partSize) + if err != nil { + logutil.Logger(ctx).Warn("init writer failed", zap.Error(err)) + return + } + + bufPool := membuf.NewPool() + loaded := &memKVsAndBuffers{} + curStart := kv.Key(startKey).Clone() + var curEnd kv.Key + var maxKey, minKey kv.Key + + for { + endKeyOfGroup, dataFilesOfGroup, statFilesOfGroup, _, err1 := splitter.SplitOneRangesGroup() + if err1 != nil { + logutil.Logger(ctx).Warn("split one ranges group failed", zap.Error(err1)) + return + } + curEnd = kv.Key(endKeyOfGroup).Clone() + if len(endKeyOfGroup) == 0 { + curEnd = kv.Key(endKey).Clone() + } + now := time.Now() + err1 = readAllData( + ctx, + store, + dataFilesOfGroup, + statFilesOfGroup, + curStart, + curEnd, + bufPool, + loaded, + ) + if err1 != nil { + logutil.Logger(ctx).Warn("read all data failed", zap.Error(err1)) + return + } + readTime := time.Since(now) + now = time.Now() + sorty.MaxGor = uint64(concurrency) + sorty.Sort(len(loaded.keys), func(i, k, r, s int) bool { + if bytes.Compare(loaded.keys[i], loaded.keys[k]) < 0 { // strict comparator like < or > + if r != s { + loaded.keys[r], loaded.keys[s] = loaded.keys[s], loaded.keys[r] + loaded.values[r], loaded.values[s] = loaded.values[s], loaded.values[r] + } + return true + } + return false + }) + sortTime := time.Since(now) + now = time.Now() + for i, key := range loaded.keys { + err1 = writer.WriteRow(ctx, key, loaded.values[i]) + if err1 != nil { + logutil.Logger(ctx).Warn("write one row to writer failed", zap.Error(err1)) + return + } + } + writeTime := time.Since(now) + logutil.Logger(ctx).Info("sort one group in MergeOverlappingFiles", + zap.Duration("read time", readTime), + zap.Duration("sort time", sortTime), + zap.Duration("write time", writeTime), + zap.Int("key len", len(loaded.keys))) + + if len(minKey) == 0 { + minKey = kv.Key(loaded.keys[0]).Clone() + } + maxKey = kv.Key(loaded.keys[len(loaded.keys)-1]).Clone() + curStart = curEnd.Clone() + loaded.keys = nil + loaded.values = nil + loaded.memKVBuffers = nil + + if len(endKeyOfGroup) == 0 { + break + } + } + + var stat MultipleFilesStat + stat.Filenames = append(stat.Filenames, + [2]string{writer.dataFile, writer.statFile}) + + stat.build([]kv.Key{minKey}, []kv.Key{curEnd}) + if onClose != nil { + onClose(&WriterSummary{ + WriterID: writer.writerID, + Seq: 0, + Min: minKey, + Max: maxKey, + TotalSize: writer.totalSize, + MultipleFilesStats: []MultipleFilesStat{stat}, + }) + } + return +} diff --git a/br/pkg/lightning/backend/external/onefile_writer.go b/br/pkg/lightning/backend/external/onefile_writer.go index b0dea86661744..d64cc2bbeef4d 100644 --- a/br/pkg/lightning/backend/external/onefile_writer.go +++ b/br/pkg/lightning/backend/external/onefile_writer.go @@ -47,8 +47,7 @@ type OneFileWriter struct { dataWriter storage.ExternalFileWriter statWriter storage.ExternalFileWriter - onClose OnCloseFunc - closed bool + closed bool logger *zap.Logger } @@ -65,7 +64,9 @@ func (w *OneFileWriter) initWriter(ctx context.Context, partSize int64) ( w.statFile = filepath.Join(w.filenamePrefix+statSuffix, "one-file") w.statWriter, err = w.store.Create(ctx, w.statFile, &storage.WriterOption{Concurrency: 20, PartSize: int64(5 * size.MB)}) if err != nil { - _ = w.dataWriter.Close(ctx) + w.logger.Info("create stat writer failed", + zap.Error(err)) + err = w.dataWriter.Close(ctx) return err } w.logger.Info("one file writer", zap.String("data-file", w.dataFile), zap.String("stat-file", w.statFile)) @@ -104,12 +105,17 @@ func (w *OneFileWriter) WriteRow(ctx context.Context, idxKey, idxVal []byte) err return err } w.rc.reset() + // the new prop should have the same offset with kvStore. + w.rc.currProp.offset = w.kvStore.offset } binary.BigEndian.AppendUint64(buf[:0], uint64(keyLen)) - copy(buf[lengthBytes:], idxKey) - binary.BigEndian.AppendUint64(buf[lengthBytes+keyLen:lengthBytes+keyLen], uint64(len(idxVal))) + binary.BigEndian.AppendUint64(buf[lengthBytes:lengthBytes], uint64(len(idxVal))) + copy(buf[lengthBytes*2:], idxKey) copy(buf[lengthBytes*2+keyLen:], idxVal) - w.kvStore.addEncodedData(buf[:length]) + err := w.kvStore.addEncodedData(buf[:length]) + if err != nil { + return err + } w.totalSize += uint64(keyLen + len(idxVal)) return nil } @@ -147,7 +153,7 @@ func (w *OneFileWriter) closeImpl(ctx context.Context) (err error) { err = err1 return } - // 4. close stat writer. + // 3. close stat writer. err2 := w.statWriter.Close(ctx) if err2 != nil { w.logger.Error("Close stat writer failed", zap.Error(err)) diff --git a/br/pkg/lightning/backend/external/onefile_writer_test.go b/br/pkg/lightning/backend/external/onefile_writer_test.go index be1bb8a717ad6..672da6ccb26e5 100644 --- a/br/pkg/lightning/backend/external/onefile_writer_test.go +++ b/br/pkg/lightning/backend/external/onefile_writer_test.go @@ -50,8 +50,7 @@ func TestOnefileWriterBasic(t *testing.T) { SetPropKeysDistance(2). BuildOneFile(memStore, "/test", "0") - err := writer.Init(ctx, 5*1024*1024) - require.NoError(t, err) + require.NoError(t, writer.Init(ctx, 5*1024*1024)) kvCnt := 100 kvs := make([]common.KvPair, kvCnt) @@ -67,12 +66,10 @@ func TestOnefileWriterBasic(t *testing.T) { } for _, item := range kvs { - err := writer.WriteRow(ctx, item.Key, item.Val) - require.NoError(t, err) + require.NoError(t, writer.WriteRow(ctx, item.Key, item.Val)) } - err = writer.Close(ctx) - require.NoError(t, err) + require.NoError(t, writer.Close(ctx)) bufSize := rand.Intn(100) + 1 kvReader, err := newKVReader(ctx, "/test/0/one-file", memStore, 0, bufSize) @@ -124,8 +121,7 @@ func checkOneFileWriterStatWithDistance(t *testing.T, kvCnt int, keysDistance ui SetPropKeysDistance(keysDistance). BuildOneFile(memStore, "/"+prefix, "0") - err := writer.Init(ctx, 5*1024*1024) - require.NoError(t, err) + require.NoError(t, writer.Init(ctx, 5*1024*1024)) kvs := make([]common.KvPair, 0, kvCnt) for i := 0; i < kvCnt; i++ { kvs = append(kvs, common.KvPair{ @@ -134,11 +130,9 @@ func checkOneFileWriterStatWithDistance(t *testing.T, kvCnt int, keysDistance ui }) } for _, item := range kvs { - err := writer.WriteRow(ctx, item.Key, item.Val) - require.NoError(t, err) + require.NoError(t, writer.WriteRow(ctx, item.Key, item.Val)) } - err = writer.Close(ctx) - require.NoError(t, err) + require.NoError(t, writer.Close(ctx)) bufSize := rand.Intn(100) + 1 kvReader, err := newKVReader(ctx, "/"+prefix+"/0/one-file", memStore, 0, bufSize) @@ -177,7 +171,7 @@ func checkOneFileWriterStatWithDistance(t *testing.T, kvCnt int, keysDistance ui require.NoError(t, statReader.Close()) } -func TestMergeOverlappingFilesV2(t *testing.T) { +func TestMergeOverlappingFilesInternal(t *testing.T) { // 1. Write to 5 files. // 2. merge 5 files into one file. // 3. read one file and check result. @@ -197,13 +191,11 @@ func TestMergeOverlappingFilesV2(t *testing.T) { v-- // insert a duplicate key. } key, val := []byte{byte(v)}, []byte{byte(v)} - err := writer.WriteRow(ctx, key, val, dbkv.IntHandle(i)) - require.NoError(t, err) + require.NoError(t, writer.WriteRow(ctx, key, val, dbkv.IntHandle(i))) } - err := writer.Close(ctx) - require.NoError(t, err) + require.NoError(t, writer.Close(ctx)) - err = MergeOverlappingFilesV2( + require.NoError(t, mergeOverlappingFilesInternal( ctx, []string{"/test/0/0", "/test/0/1", "/test/0/2", "/test/0/3", "/test/0/4"}, memStore, @@ -218,8 +210,7 @@ func TestMergeOverlappingFilesV2(t *testing.T) { 2, nil, true, - ) - require.NoError(t, err) + )) keys := make([][]byte, 0, kvCount) values := make([][]byte, 0, kvCount) @@ -276,8 +267,7 @@ func TestOnefileWriterManyRows(t *testing.T) { SetMemorySizeLimit(1000). BuildOneFile(memStore, "/test", "0") - err := writer.Init(ctx, 5*1024*1024) - require.NoError(t, err) + require.NoError(t, writer.Init(ctx, 5*1024*1024)) kvCnt := 100000 expectedTotalSize := 0 @@ -301,17 +291,15 @@ func TestOnefileWriterManyRows(t *testing.T) { }) for _, item := range kvs { - err := writer.WriteRow(ctx, item.Key, item.Val) - require.NoError(t, err) + require.NoError(t, writer.WriteRow(ctx, item.Key, item.Val)) } - err = writer.Close(ctx) - require.NoError(t, err) + require.NoError(t, writer.Close(ctx)) var resSummary *WriterSummary onClose := func(summary *WriterSummary) { resSummary = summary } - err = MergeOverlappingFilesV2( + require.NoError(t, mergeOverlappingFilesInternal( ctx, []string{"/test/0/one-file"}, memStore, @@ -326,8 +314,7 @@ func TestOnefileWriterManyRows(t *testing.T) { 2, onClose, true, - ) - require.NoError(t, err) + )) bufSize := rand.Intn(100) + 1 kvReader, err := newKVReader(ctx, "/test2/mergeID/one-file", memStore, 0, bufSize) @@ -357,3 +344,54 @@ func TestOnefileWriterManyRows(t *testing.T) { require.Equal(t, expected.MaxOverlappingNum, resSummary.MultipleFilesStats[0].MaxOverlappingNum) require.EqualValues(t, expectedTotalSize, resSummary.TotalSize) } + +func TestOnefilePropOffset(t *testing.T) { + seed := time.Now().Unix() + rand.Seed(uint64(seed)) + t.Logf("seed: %d", seed) + ctx := context.Background() + memStore := storage.NewMemStorage() + memSizeLimit := (rand.Intn(10) + 1) * 200 + + // 1. write into one file. + // 2. read stat file and check offset ascending. + writer := NewWriterBuilder(). + SetPropSizeDistance(100). + SetPropKeysDistance(2). + SetBlockSize(memSizeLimit). + SetMemorySizeLimit(uint64(memSizeLimit)). + BuildOneFile(memStore, "/test", "0") + + require.NoError(t, writer.Init(ctx, 5*1024*1024)) + + kvCnt := 10000 + kvs := make([]common.KvPair, kvCnt) + for i := 0; i < kvCnt; i++ { + randLen := rand.Intn(10) + 1 + kvs[i].Key = make([]byte, randLen) + _, err := rand.Read(kvs[i].Key) + require.NoError(t, err) + randLen = rand.Intn(10) + 1 + kvs[i].Val = make([]byte, randLen) + _, err = rand.Read(kvs[i].Val) + require.NoError(t, err) + } + + for _, item := range kvs { + require.NoError(t, writer.WriteRow(ctx, item.Key, item.Val)) + } + + require.NoError(t, writer.Close(ctx)) + + rd, err := newStatsReader(ctx, memStore, "/test/0_stat/one-file", 4096) + require.NoError(t, err) + lastOffset := uint64(0) + for { + prop, err := rd.nextProp() + if err == io.EOF { + break + } + require.GreaterOrEqual(t, prop.offset, lastOffset) + lastOffset = prop.offset + } +} diff --git a/br/pkg/lightning/backend/external/reader.go b/br/pkg/lightning/backend/external/reader.go new file mode 100644 index 0000000000000..d5f3d05ff55c6 --- /dev/null +++ b/br/pkg/lightning/backend/external/reader.go @@ -0,0 +1,158 @@ +// Copyright 2023 PingCAP, 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. + +package external + +import ( + "bytes" + "context" + "io" + "time" + + "github.com/pingcap/errors" + "github.com/pingcap/tidb/br/pkg/lightning/log" + "github.com/pingcap/tidb/br/pkg/membuf" + "github.com/pingcap/tidb/br/pkg/storage" + "github.com/pingcap/tidb/pkg/metrics" + "github.com/pingcap/tidb/pkg/util" + "github.com/pingcap/tidb/pkg/util/logutil" + "go.uber.org/zap" +) + +func readAllData( + ctx context.Context, + storage storage.ExternalStorage, + dataFiles, statsFiles []string, + startKey, endKey []byte, + bufPool *membuf.Pool, + output *memKVsAndBuffers, +) (err error) { + task := log.BeginTask(logutil.Logger(ctx), "read all data") + task.Info("arguments", + zap.Int("data-file-count", len(dataFiles)), + zap.Int("stat-file-count", len(statsFiles)), + zap.Binary("start-key", startKey), + zap.Binary("end-key", endKey), + ) + defer func() { + task.End(zap.ErrorLevel, err) + }() + + concurrences, startOffsets, err := getFilesReadConcurrency( + ctx, + storage, + statsFiles, + startKey, + endKey, + ) + // TODO(lance6716): refine adjust concurrency + for i, c := range concurrences { + if c < readAllDataConcThreshold { + concurrences[i] = 1 + } + } + + if err != nil { + return err + } + eg, egCtx := util.NewErrorGroupWithRecoverWithCtx(ctx) + // TODO(lance6716): limit the concurrency of eg to 30 does not help + for i := range dataFiles { + i := i + eg.Go(func() error { + err2 := readOneFile( + egCtx, + storage, + dataFiles[i], + startKey, + endKey, + startOffsets[i], + concurrences[i], + bufPool, + output, + ) + return errors.Annotatef(err2, "failed to read file %s", dataFiles[i]) + }) + } + return eg.Wait() +} + +func readOneFile( + ctx context.Context, + storage storage.ExternalStorage, + dataFile string, + startKey, endKey []byte, + startOffset uint64, + concurrency uint64, + bufPool *membuf.Pool, + output *memKVsAndBuffers, +) error { + readAndSortDurHist := metrics.GlobalSortReadFromCloudStorageDuration.WithLabelValues("read_one_file") + + ts := time.Now() + + rd, err := newKVReader(ctx, dataFile, storage, startOffset, 64*1024) + if err != nil { + return err + } + defer rd.Close() + if concurrency > 1 { + rd.byteReader.enableConcurrentRead( + storage, + dataFile, + int(concurrency), + ConcurrentReaderBufferSizePerConc, + bufPool.NewBuffer(), + ) + err = rd.byteReader.switchConcurrentMode(true) + if err != nil { + return err + } + } + + // this buffer is associated with data slices and will return to caller + memBuf := bufPool.NewBuffer() + keys := make([][]byte, 0, 1024) + values := make([][]byte, 0, 1024) + size := 0 + + for { + k, v, err := rd.nextKV() + if err != nil { + if err == io.EOF { + break + } + return err + } + if bytes.Compare(k, startKey) < 0 { + continue + } + if bytes.Compare(k, endKey) >= 0 { + break + } + // TODO(lance6716): we are copying every KV from rd's buffer to memBuf, can we + // directly read into memBuf? + keys = append(keys, memBuf.AddBytes(k)) + values = append(values, memBuf.AddBytes(v)) + size += len(k) + len(v) + } + readAndSortDurHist.Observe(time.Since(ts).Seconds()) + output.mu.Lock() + output.keys = append(output.keys, keys...) + output.values = append(output.values, values...) + output.memKVBuffers = append(output.memKVBuffers, memBuf) + output.size += size + output.mu.Unlock() + return nil +} diff --git a/br/pkg/lightning/backend/external/reader_test.go b/br/pkg/lightning/backend/external/reader_test.go new file mode 100644 index 0000000000000..329ac48a478b2 --- /dev/null +++ b/br/pkg/lightning/backend/external/reader_test.go @@ -0,0 +1,108 @@ +// Copyright 2023 PingCAP, 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. + +package external + +import ( + "bytes" + "context" + "fmt" + "slices" + "testing" + "time" + + "github.com/pingcap/tidb/br/pkg/lightning/backend/kv" + "github.com/pingcap/tidb/br/pkg/lightning/common" + "github.com/pingcap/tidb/br/pkg/storage" + "github.com/pingcap/tidb/pkg/util/size" + "github.com/stretchr/testify/require" + "golang.org/x/exp/rand" +) + +func TestReadAllDataBasic(t *testing.T) { + seed := time.Now().Unix() + rand.Seed(uint64(seed)) + t.Logf("seed: %d", seed) + ctx := context.Background() + memStore := storage.NewMemStorage() + memSizeLimit := (rand.Intn(10) + 1) * 400 + + w := NewWriterBuilder(). + SetPropSizeDistance(100). + SetPropKeysDistance(2). + SetMemorySizeLimit(uint64(memSizeLimit)). + SetBlockSize(memSizeLimit). + Build(memStore, "/test", "0") + + writer := NewEngineWriter(w) + kvCnt := rand.Intn(10) + 10000 + kvs := make([]common.KvPair, kvCnt) + for i := 0; i < kvCnt; i++ { + kvs[i] = common.KvPair{ + Key: []byte(fmt.Sprintf("key%05d", i)), + Val: []byte("56789"), + } + } + + require.NoError(t, writer.AppendRows(ctx, nil, kv.MakeRowsFromKvPairs(kvs))) + _, err := writer.Close(ctx) + require.NoError(t, err) + + slices.SortFunc(kvs, func(i, j common.KvPair) int { + return bytes.Compare(i.Key, j.Key) + }) + + datas, stats, err := GetAllFileNames(ctx, memStore, "") + require.NoError(t, err) + + testReadAndCompare(ctx, t, kvs, memStore, datas, stats, kvs[0].Key, memSizeLimit) +} + +func TestReadAllOneFile(t *testing.T) { + seed := time.Now().Unix() + rand.Seed(uint64(seed)) + t.Logf("seed: %d", seed) + ctx := context.Background() + memStore := storage.NewMemStorage() + memSizeLimit := (rand.Intn(10) + 1) * 400 + + w := NewWriterBuilder(). + SetPropSizeDistance(100). + SetPropKeysDistance(2). + SetMemorySizeLimit(uint64(memSizeLimit)). + BuildOneFile(memStore, "/test", "0") + + require.NoError(t, w.Init(ctx, int64(5*size.MB))) + + kvCnt := rand.Intn(10) + 10000 + kvs := make([]common.KvPair, kvCnt) + for i := 0; i < kvCnt; i++ { + kvs[i] = common.KvPair{ + Key: []byte(fmt.Sprintf("key%05d", i)), + Val: []byte("56789"), + } + require.NoError(t, w.WriteRow(ctx, kvs[i].Key, kvs[i].Val)) + } + + require.NoError(t, w.Close(ctx)) + + slices.SortFunc(kvs, func(i, j common.KvPair) int { + return bytes.Compare(i.Key, j.Key) + }) + + datas, stats, err := GetAllFileNames(ctx, memStore, "") + require.NoError(t, err) + + testReadAndCompare(ctx, t, kvs, memStore, datas, stats, kvs[0].Key, memSizeLimit) +} diff --git a/br/pkg/lightning/backend/external/sort_test.go b/br/pkg/lightning/backend/external/sort_test.go new file mode 100644 index 0000000000000..849db2fa2342a --- /dev/null +++ b/br/pkg/lightning/backend/external/sort_test.go @@ -0,0 +1,274 @@ +// Copyright 2023 PingCAP, 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. + +package external + +import ( + "bytes" + "context" + "slices" + "strconv" + "testing" + "time" + + "github.com/google/uuid" + "github.com/pingcap/failpoint" + "github.com/pingcap/tidb/br/pkg/lightning/backend/kv" + "github.com/pingcap/tidb/br/pkg/lightning/common" + "github.com/pingcap/tidb/br/pkg/storage" + dbkv "github.com/pingcap/tidb/pkg/kv" + "github.com/pingcap/tidb/pkg/util/size" + "github.com/stretchr/testify/require" + "golang.org/x/exp/rand" +) + +func TestGlobalSortLocalBasic(t *testing.T) { + // 1. write data step + seed := time.Now().Unix() + rand.Seed(uint64(seed)) + t.Logf("seed: %d", seed) + ctx := context.Background() + memStore := storage.NewMemStorage() + memSizeLimit := (rand.Intn(10) + 1) * 400 + lastStepDatas := make([]string, 0, 10) + lastStepStats := make([]string, 0, 10) + var startKey, endKey dbkv.Key + + closeFn := func(s *WriterSummary) { + for _, stat := range s.MultipleFilesStats { + for i := range stat.Filenames { + lastStepDatas = append(lastStepDatas, stat.Filenames[i][0]) + lastStepStats = append(lastStepStats, stat.Filenames[i][1]) + } + } + if len(startKey) == 0 && len(endKey) == 0 { + startKey = s.Min.Clone() + endKey = s.Max.Clone().Next() + } + startKey = BytesMin(startKey, s.Min.Clone()) + endKey = BytesMax(endKey, s.Max.Clone().Next()) + } + + w := NewWriterBuilder(). + SetPropSizeDistance(100). + SetPropKeysDistance(2). + SetMemorySizeLimit(uint64(memSizeLimit)). + SetBlockSize(memSizeLimit). + SetOnCloseFunc(closeFn). + Build(memStore, "/test", "0") + + writer := NewEngineWriter(w) + kvCnt := rand.Intn(10) + 10000 + kvs := make([]common.KvPair, kvCnt) + for i := 0; i < kvCnt; i++ { + kvs[i] = common.KvPair{ + Key: []byte(uuid.New().String()), + Val: []byte("56789"), + } + } + slices.SortFunc(kvs, func(i, j common.KvPair) int { + return bytes.Compare(i.Key, j.Key) + }) + + require.NoError(t, writer.AppendRows(ctx, nil, kv.MakeRowsFromKvPairs(kvs))) + _, err := writer.Close(ctx) + require.NoError(t, err) + + // 2. read and sort step + testReadAndCompare(ctx, t, kvs, memStore, lastStepDatas, lastStepStats, startKey, memSizeLimit) +} + +func TestGlobalSortLocalWithMerge(t *testing.T) { + // 1. write data step + seed := time.Now().Unix() + rand.Seed(uint64(seed)) + t.Logf("seed: %d", seed) + ctx := context.Background() + memStore := storage.NewMemStorage() + memSizeLimit := (rand.Intn(10) + 1) * 400 + + w := NewWriterBuilder(). + SetPropSizeDistance(100). + SetPropKeysDistance(2). + SetMemorySizeLimit(uint64(memSizeLimit)). + SetBlockSize(memSizeLimit). + Build(memStore, "/test", "0") + + writer := NewEngineWriter(w) + kvCnt := rand.Intn(10) + 10000 + kvs := make([]common.KvPair, kvCnt) + for i := 0; i < kvCnt; i++ { + kvs[i] = common.KvPair{ + Key: []byte(uuid.New().String()), + Val: []byte("56789"), + } + } + + slices.SortFunc(kvs, func(i, j common.KvPair) int { + return bytes.Compare(i.Key, j.Key) + }) + + require.NoError(t, writer.AppendRows(ctx, nil, kv.MakeRowsFromKvPairs(kvs))) + _, err := writer.Close(ctx) + require.NoError(t, err) + + // 2. merge step + datas, stats, err := GetAllFileNames(ctx, memStore, "") + require.NoError(t, err) + + dataGroup, _ := splitDataAndStatFiles(datas, stats) + + lastStepDatas := make([]string, 0, 10) + lastStepStats := make([]string, 0, 10) + var startKey, endKey dbkv.Key + + closeFn := func(s *WriterSummary) { + for _, stat := range s.MultipleFilesStats { + for i := range stat.Filenames { + lastStepDatas = append(lastStepDatas, stat.Filenames[i][0]) + lastStepStats = append(lastStepStats, stat.Filenames[i][1]) + } + + } + if len(startKey) == 0 && len(endKey) == 0 { + startKey = s.Min.Clone() + endKey = s.Max.Clone().Next() + } + startKey = BytesMin(startKey, s.Min.Clone()) + endKey = BytesMax(endKey, s.Max.Clone().Next()) + } + mergeMemSize := (rand.Intn(10) + 1) * 100 + // use random mergeMemSize to test different memLimit of writer. + // reproduce one bug, see https://github.com/pingcap/tidb/issues/49590 + for _, group := range dataGroup { + require.NoError(t, MergeOverlappingFiles( + ctx, + group, + memStore, + int64(5*size.MB), + 100, + "/test2", + mergeMemSize, + uint64(mergeMemSize), + 8*1024, + 100, + 2, + closeFn, + 1, + true, + )) + } + + // 3. read and sort step + testReadAndCompare(ctx, t, kvs, memStore, lastStepDatas, lastStepStats, startKey, memSizeLimit) +} + +func TestGlobalSortLocalWithMergeV2(t *testing.T) { + // 1. write data step + seed := time.Now().Unix() + rand.Seed(uint64(seed)) + t.Logf("seed: %d", seed) + ctx := context.Background() + memStore := storage.NewMemStorage() + memSizeLimit := (rand.Intn(10) + 1) * 400 + multiStats := make([]MultipleFilesStat, 0, 100) + randomSize := (rand.Intn(500) + 1) * 1000 + + failpoint.Enable("github.com/pingcap/tidb/br/pkg/lightning/backend/external/mockRangesGroupSize", + "return("+strconv.Itoa(randomSize)+")") + t.Cleanup(func() { + failpoint.Disable("github.com/pingcap/tidb/br/pkg/lightning/backend/external/mockRangesGroupSize") + }) + datas := make([]string, 0, 100) + stats := make([]string, 0, 100) + // prepare meta for merge step. + closeFn := func(s *WriterSummary) { + multiStats = append(multiStats, s.MultipleFilesStats...) + for _, stat := range s.MultipleFilesStats { + for i := range stat.Filenames { + datas = append(datas, stat.Filenames[i][0]) + stats = append(stats, stat.Filenames[i][1]) + } + } + } + + w := NewWriterBuilder(). + SetPropSizeDistance(100). + SetPropKeysDistance(2). + SetMemorySizeLimit(uint64(memSizeLimit)). + SetBlockSize(memSizeLimit). + SetOnCloseFunc(closeFn). + Build(memStore, "/test", "0") + + writer := NewEngineWriter(w) + kvCnt := rand.Intn(10) + 10000 + kvs := make([]common.KvPair, kvCnt) + for i := 0; i < kvCnt; i++ { + kvs[i] = common.KvPair{ + Key: []byte(uuid.New().String()), + Val: []byte("56789"), + } + } + slices.SortFunc(kvs, func(i, j common.KvPair) int { + return bytes.Compare(i.Key, j.Key) + }) + require.NoError(t, writer.AppendRows(ctx, nil, kv.MakeRowsFromKvPairs(kvs))) + _, err := writer.Close(ctx) + require.NoError(t, err) + + // 2. merge step + dataGroup, statGroup, startKeys, endKeys := splitDataStatAndKeys(datas, stats, multiStats) + lastStepDatas := make([]string, 0, 10) + lastStepStats := make([]string, 0, 10) + var startKey, endKey dbkv.Key + + // prepare meta for last step. + closeFn1 := func(s *WriterSummary) { + for _, stat := range s.MultipleFilesStats { + for i := range stat.Filenames { + lastStepDatas = append(lastStepDatas, stat.Filenames[i][0]) + lastStepStats = append(lastStepStats, stat.Filenames[i][1]) + } + + } + if len(startKey) == 0 && len(endKey) == 0 { + startKey = s.Min.Clone() + endKey = s.Max.Clone().Next() + } + startKey = BytesMin(startKey, s.Min.Clone()) + endKey = BytesMax(endKey, s.Max.Clone().Next()) + } + + for i, group := range dataGroup { + require.NoError(t, MergeOverlappingFilesV2( + ctx, + mockOneMultiFileStat(group, statGroup[i]), + memStore, + startKeys[i], + endKeys[i], + int64(5*size.MB), + "/test2", + uuid.NewString(), + 100, + 8*1024, + 100, + 2, + closeFn1, + 1, + true)) + } + + // 3. read and sort step + testReadAndCompare(ctx, t, kvs, memStore, lastStepDatas, lastStepStats, startKey, memSizeLimit) +} diff --git a/br/pkg/lightning/backend/external/split.go b/br/pkg/lightning/backend/external/split.go index 2d24001e83621..5c6e9ee794310 100644 --- a/br/pkg/lightning/backend/external/split.go +++ b/br/pkg/lightning/backend/external/split.go @@ -21,6 +21,8 @@ import ( "slices" "github.com/pingcap/tidb/br/pkg/storage" + "github.com/pingcap/tidb/pkg/util/logutil" + "go.uber.org/zap" ) type exhaustedHeapElem struct { @@ -63,13 +65,12 @@ type RangeSplitter struct { rangeSize int64 rangeKeys int64 - propIter *MergePropIter - dataFiles []string - statFiles []string + propIter *MergePropIter + multiFileStat []MultipleFilesStat - // filename -> index in dataFiles/statFiles - activeDataFiles map[string]int - activeStatFiles map[string]int + // filename -> 2 level index in dataFiles/statFiles + activeDataFiles map[string][2]int + activeStatFiles map[string][2]int curGroupSize int64 curGroupKeys int64 curRangeSize int64 @@ -77,27 +78,43 @@ type RangeSplitter struct { recordSplitKeyAfterNextProp bool lastDataFile string lastStatFile string - lastHeapSize int lastRangeProperty *rangeProperty willExhaustHeap exhaustedHeap rangeSplitKeysBuf [][]byte + + logger *zap.Logger } // NewRangeSplitter creates a new RangeSplitter. -// `dataFiles` and `statFiles` must be corresponding to each other. // `rangesGroupSize` and `rangesGroupKeys` controls the total range group // size of one `SplitOneRangesGroup` invocation, while `rangeSize` and // `rangeKeys` controls the size of one range. func NewRangeSplitter( ctx context.Context, - dataFiles, statFiles []string, + multiFileStat []MultipleFilesStat, externalStorage storage.ExternalStorage, rangesGroupSize, rangesGroupKeys int64, maxRangeSize, maxRangeKeys int64, checkHotSpot bool, ) (*RangeSplitter, error) { - propIter, err := NewMergePropIter(ctx, statFiles, externalStorage, checkHotSpot) + logger := logutil.Logger(ctx) + overlaps := make([]int64, 0, len(multiFileStat)) + fileNums := make([]int, 0, len(multiFileStat)) + for _, m := range multiFileStat { + overlaps = append(overlaps, m.MaxOverlappingNum) + fileNums = append(fileNums, len(m.Filenames)) + } + logger.Info("create range splitter", + zap.Int64s("overlaps", overlaps), + zap.Ints("fileNums", fileNums), + zap.Int64("rangesGroupSize", rangesGroupSize), + zap.Int64("rangesGroupKeys", rangesGroupKeys), + zap.Int64("maxRangeSize", maxRangeSize), + zap.Int64("maxRangeKeys", maxRangeKeys), + zap.Bool("checkHotSpot", checkHotSpot), + ) + propIter, err := NewMergePropIter(ctx, multiFileStat, externalStorage, checkHotSpot) if err != nil { return nil, err } @@ -106,20 +123,23 @@ func NewRangeSplitter( rangesGroupSize: rangesGroupSize, rangesGroupKeys: rangesGroupKeys, propIter: propIter, - dataFiles: dataFiles, - statFiles: statFiles, - activeDataFiles: make(map[string]int), - activeStatFiles: make(map[string]int), + multiFileStat: multiFileStat, + activeDataFiles: make(map[string][2]int), + activeStatFiles: make(map[string][2]int), rangeSize: maxRangeSize, rangeKeys: maxRangeKeys, rangeSplitKeysBuf: make([][]byte, 0, 16), + + logger: logger, }, nil } // Close release the resources of RangeSplitter. func (r *RangeSplitter) Close() error { - return r.propIter.Close() + err := r.propIter.Close() + r.logger.Info("close range splitter", zap.Error(err)) + return err } // GetRangeSplitSize returns the expected size of one range. @@ -155,9 +175,8 @@ func (r *RangeSplitter) SplitOneRangesGroup() ( r.curGroupKeys += int64(prop.keys) r.curRangeKeys += int64(prop.keys) - // a tricky way to detect source file will exhaust - heapSize := r.propIter.iter.h.Len() - if heapSize < r.lastHeapSize { + // if this Next call will close the last reader + if *r.propIter.baseCloseReaderFlag { heap.Push(&r.willExhaustHeap, exhaustedHeapElem{ key: r.lastRangeProperty.lastKey, dataFile: r.lastDataFile, @@ -165,14 +184,14 @@ func (r *RangeSplitter) SplitOneRangesGroup() ( }) } - fileIdx := r.propIter.readerIndex() - dataFilePath := r.dataFiles[fileIdx] - statFilePath := r.statFiles[fileIdx] - r.activeDataFiles[dataFilePath] = fileIdx - r.activeStatFiles[statFilePath] = fileIdx + idx, idx2 := r.propIter.readerIndex() + filePair := r.multiFileStat[idx].Filenames[idx2] + dataFilePath := filePair[0] + statFilePath := filePair[1] + r.activeDataFiles[dataFilePath] = [2]int{idx, idx2} + r.activeStatFiles[statFilePath] = [2]int{idx, idx2} r.lastDataFile = dataFilePath r.lastStatFile = statFilePath - r.lastHeapSize = heapSize r.lastRangeProperty = prop for r.willExhaustHeap.Len() > 0 && @@ -214,8 +233,8 @@ func (r *RangeSplitter) SplitOneRangesGroup() ( } retDataFiles, retStatFiles = r.cloneActiveFiles() - r.activeDataFiles = make(map[string]int) - r.activeStatFiles = make(map[string]int) + r.activeDataFiles = make(map[string][2]int) + r.activeStatFiles = make(map[string][2]int) return nil, retDataFiles, retStatFiles, r.takeSplitKeys(), r.propIter.Error() } @@ -225,14 +244,24 @@ func (r *RangeSplitter) cloneActiveFiles() (data []string, stat []string) { dataFiles = append(dataFiles, path) } slices.SortFunc(dataFiles, func(i, j string) int { - return r.activeDataFiles[i] - r.activeDataFiles[j] + iInts := r.activeDataFiles[i] + jInts := r.activeDataFiles[j] + if iInts[0] != jInts[0] { + return iInts[0] - jInts[0] + } + return iInts[1] - jInts[1] }) statFiles := make([]string, 0, len(r.activeStatFiles)) for path := range r.activeStatFiles { statFiles = append(statFiles, path) } slices.SortFunc(statFiles, func(i, j string) int { - return r.activeStatFiles[i] - r.activeStatFiles[j] + iInts := r.activeStatFiles[i] + jInts := r.activeStatFiles[j] + if iInts[0] != jInts[0] { + return iInts[0] - jInts[0] + } + return iInts[1] - jInts[1] }) return dataFiles, statFiles } diff --git a/br/pkg/lightning/backend/external/split_test.go b/br/pkg/lightning/backend/external/split_test.go index a49f697b46116..75408165ca6fc 100644 --- a/br/pkg/lightning/backend/external/split_test.go +++ b/br/pkg/lightning/backend/external/split_test.go @@ -54,8 +54,9 @@ func TestGeneralProperties(t *testing.T) { dataFiles, statFiles, err := MockExternalEngine(memStore, keys, values) require.NoError(t, err) + multiFileStat := mockOneMultiFileStat(dataFiles, statFiles) splitter, err := NewRangeSplitter( - ctx, dataFiles, statFiles, memStore, 1000, 30, 1000, 1, true, + ctx, multiFileStat, memStore, 1000, 30, 1000, 1, true, ) var lastEndKey []byte notExhausted: @@ -102,16 +103,20 @@ func TestOnlyOneGroup(t *testing.T) { subDir := "/mock-test" writer := NewWriterBuilder(). - SetMemorySizeLimit(15). + SetMemorySizeLimit(20). SetPropSizeDistance(1). SetPropKeysDistance(1). Build(memStore, subDir, "5") dataFiles, statFiles, err := MockExternalEngineWithWriter(memStore, writer, subDir, [][]byte{{1}, {2}}, [][]byte{{1}, {2}}) require.NoError(t, err) + require.Len(t, dataFiles, 1) + require.Len(t, statFiles, 1) + + multiFileStat := mockOneMultiFileStat(dataFiles, statFiles) splitter, err := NewRangeSplitter( - ctx, dataFiles, statFiles, memStore, 1000, 30, 1000, 10, true, + ctx, multiFileStat, memStore, 1000, 30, 1000, 10, true, ) require.NoError(t, err) endKey, dataFiles, statFiles, splitKeys, err := splitter.SplitOneRangesGroup() @@ -123,7 +128,7 @@ func TestOnlyOneGroup(t *testing.T) { require.NoError(t, splitter.Close()) splitter, err = NewRangeSplitter( - ctx, dataFiles, statFiles, memStore, 1000, 30, 1000, 1, true, + ctx, multiFileStat, memStore, 1000, 30, 1000, 1, true, ) require.NoError(t, err) endKey, dataFiles, statFiles, splitKeys, err = splitter.SplitOneRangesGroup() @@ -155,8 +160,9 @@ func TestSortedData(t *testing.T) { rangesGroupKV := 30 groupFileNumUpperBound := int(math.Ceil(float64(rangesGroupKV-1)/avgKVPerFile)) + 1 + multiFileStat := mockOneMultiFileStat(dataFiles, statFiles) splitter, err := NewRangeSplitter( - ctx, dataFiles, statFiles, memStore, 1000, int64(rangesGroupKV), 1000, 10, true, + ctx, multiFileStat, memStore, 1000, int64(rangesGroupKV), 1000, 10, true, ) require.NoError(t, err) @@ -235,9 +241,12 @@ func TestRangeSplitterStrictCase(t *testing.T) { "/mock-test/3/0", "/mock-test/3/1", }, dataFiles123) + multi := mockOneMultiFileStat(dataFiles123[:4], statFiles123[:4]) + multi2 := mockOneMultiFileStat(dataFiles123[4:], statFiles123[4:]) + multiFileStat := []MultipleFilesStat{multi[0], multi2[0]} // group keys = 2, region keys = 1 splitter, err := NewRangeSplitter( - ctx, dataFiles123, statFiles123, memStore, 1000, 2, 1000, 1, true, + ctx, multiFileStat, memStore, 1000, 2, 1000, 1, true, ) require.NoError(t, err) @@ -316,10 +325,11 @@ func TestExactlyKeyNum(t *testing.T) { dataFiles, statFiles, err := MockExternalEngineWithWriter(memStore, writer, subDir, keys, values) require.NoError(t, err) + multiFileStat := mockOneMultiFileStat(dataFiles, statFiles) // maxRangeKeys = 3 splitter, err := NewRangeSplitter( - ctx, dataFiles, statFiles, memStore, 1000, 100, 1000, 3, true, + ctx, multiFileStat, memStore, 1000, 100, 1000, 3, true, ) require.NoError(t, err) endKey, splitDataFiles, splitStatFiles, splitKeys, err := splitter.SplitOneRangesGroup() @@ -331,7 +341,7 @@ func TestExactlyKeyNum(t *testing.T) { // rangesGroupKeys = 3 splitter, err = NewRangeSplitter( - ctx, dataFiles, statFiles, memStore, 1000, 3, 1000, 1, true, + ctx, multiFileStat, memStore, 1000, 3, 1000, 1, true, ) require.NoError(t, err) endKey, splitDataFiles, splitStatFiles, splitKeys, err = splitter.SplitOneRangesGroup() diff --git a/br/pkg/lightning/backend/external/stat_reader.go b/br/pkg/lightning/backend/external/stat_reader.go index 512dd8df5f37c..5aaea5988973e 100644 --- a/br/pkg/lightning/backend/external/stat_reader.go +++ b/br/pkg/lightning/backend/external/stat_reader.go @@ -26,7 +26,7 @@ type statsReader struct { } func newStatsReader(ctx context.Context, store storage.ExternalStorage, name string, bufSize int) (*statsReader, error) { - sr, err := openStoreReaderAndSeek(ctx, store, name, 0) + sr, err := openStoreReaderAndSeek(ctx, store, name, 0, 0) if err != nil { return nil, err } @@ -40,17 +40,16 @@ func newStatsReader(ctx context.Context, store storage.ExternalStorage, name str } func (r *statsReader) nextProp() (*rangeProperty, error) { - r.byteReader.reset() lenBytes, err := r.byteReader.readNBytes(4) if err != nil { return nil, err } - propLen := int(binary.BigEndian.Uint32(*lenBytes)) + propLen := int(binary.BigEndian.Uint32(lenBytes)) propBytes, err := r.byteReader.readNBytes(propLen) if err != nil { return nil, noEOF(err) } - return decodeProp(*propBytes), nil + return decodeProp(propBytes), nil } func (r *statsReader) Close() error { diff --git a/br/pkg/lightning/backend/external/testutil.go b/br/pkg/lightning/backend/external/testutil.go new file mode 100644 index 0000000000000..bd3a3fe6bda99 --- /dev/null +++ b/br/pkg/lightning/backend/external/testutil.go @@ -0,0 +1,170 @@ +// Copyright 2023 PingCAP, 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. + +package external + +import ( + "bytes" + "context" + "math" + "testing" + + "github.com/jfcg/sorty/v2" + "github.com/pingcap/tidb/br/pkg/lightning/common" + "github.com/pingcap/tidb/br/pkg/membuf" + "github.com/pingcap/tidb/br/pkg/storage" + dbkv "github.com/pingcap/tidb/pkg/kv" + "github.com/stretchr/testify/require" +) + +func mockOneMultiFileStat(data, stat []string) []MultipleFilesStat { + m := MultipleFilesStat{} + for i := range data { + m.Filenames = append(m.Filenames, [2]string{data[i], stat[i]}) + } + return []MultipleFilesStat{m} +} + +func testReadAndCompare( + ctx context.Context, + t *testing.T, + kvs []common.KvPair, + store storage.ExternalStorage, + datas []string, + stats []string, + startKey dbkv.Key, + memSizeLimit int) { + + splitter, err := NewRangeSplitter( + ctx, + mockOneMultiFileStat(datas, stats), + store, + int64(memSizeLimit), // make the group small for testing + math.MaxInt64, + 4*1024*1024*1024, + math.MaxInt64, + true, + ) + require.NoError(t, err) + + bufPool := membuf.NewPool() + loaded := &memKVsAndBuffers{} + curStart := startKey.Clone() + kvIdx := 0 + + for { + endKeyOfGroup, dataFilesOfGroup, statFilesOfGroup, _, err := splitter.SplitOneRangesGroup() + require.NoError(t, err) + curEnd := dbkv.Key(endKeyOfGroup).Clone() + if len(endKeyOfGroup) == 0 { + curEnd = dbkv.Key(kvs[len(kvs)-1].Key).Next() + } + + err = readAllData( + ctx, + store, + dataFilesOfGroup, + statFilesOfGroup, + curStart, + curEnd, + bufPool, + loaded, + ) + + require.NoError(t, err) + // check kvs sorted + sorty.MaxGor = uint64(8) + sorty.Sort(len(loaded.keys), func(i, k, r, s int) bool { + if bytes.Compare(loaded.keys[i], loaded.keys[k]) < 0 { // strict comparator like < or > + if r != s { + loaded.keys[r], loaded.keys[s] = loaded.keys[s], loaded.keys[r] + loaded.values[r], loaded.values[s] = loaded.values[s], loaded.values[r] + } + return true + } + return false + }) + for i, key := range loaded.keys { + require.EqualValues(t, kvs[kvIdx].Key, key) + require.EqualValues(t, kvs[kvIdx].Val, loaded.values[i]) + kvIdx++ + } + curStart = curEnd.Clone() + + // release + loaded.keys = nil + loaded.values = nil + loaded.memKVBuffers = nil + + if len(endKeyOfGroup) == 0 { + break + } + } + err = splitter.Close() + require.NoError(t, err) +} + +// split data and stat files into groups for merge step. +// like scheduler code for merge sort step in add index and import into. +func splitDataAndStatFiles(datas []string, stats []string) ([][]string, [][]string) { + dataGroup := make([][]string, 0, 10) + statGroup := make([][]string, 0, 10) + + start := 0 + step := 10 + for start < len(datas) { + end := start + step + if end > len(datas) { + end = len(datas) + } + dataGroup = append(dataGroup, datas[start:end]) + statGroup = append(statGroup, stats[start:end]) + start = end + } + return dataGroup, statGroup +} + +// split data&stat files, startKeys and endKeys into groups for new merge step. +func splitDataStatAndKeys(datas []string, stats []string, multiStats []MultipleFilesStat) ([][]string, [][]string, []dbkv.Key, []dbkv.Key) { + startKeys := make([]dbkv.Key, 0, 10) + endKeys := make([]dbkv.Key, 0, 10) + i := 0 + for ; i < len(multiStats)-1; i += 2 { + startKey := BytesMin(multiStats[i].MinKey, multiStats[i+1].MinKey) + endKey := BytesMax(multiStats[i].MaxKey, multiStats[i+1].MaxKey) + endKey = dbkv.Key(endKey).Next().Clone() + startKeys = append(startKeys, startKey) + endKeys = append(endKeys, endKey) + } + if i == len(multiStats)-1 { + startKeys = append(startKeys, multiStats[i].MinKey.Clone()) + endKeys = append(endKeys, multiStats[i].MaxKey.Next().Clone()) + } + + dataGroup := make([][]string, 0, 10) + statGroup := make([][]string, 0, 10) + + start := 0 + step := 2 * multiFileStatNum + for start < len(datas) { + end := start + step + if end > len(datas) { + end = len(datas) + } + dataGroup = append(dataGroup, datas[start:end]) + statGroup = append(statGroup, stats[start:end]) + start = end + } + return dataGroup, statGroup, startKeys, endKeys +} diff --git a/br/pkg/lightning/backend/external/util.go b/br/pkg/lightning/backend/external/util.go index a9597e42b9883..c2d5bced83abe 100644 --- a/br/pkg/lightning/backend/external/util.go +++ b/br/pkg/lightning/backend/external/util.go @@ -48,7 +48,13 @@ func seekPropsOffsets( defer func() { task.End(zapcore.ErrorLevel, err) }() - iter, err := NewMergePropIter(ctx, paths, exStorage, checkHotSpot) + + // adapt the NewMergePropIter argument types + multiFileStat := MultipleFilesStat{Filenames: make([][2]string, 0, len(paths))} + for _, path := range paths { + multiFileStat.Filenames = append(multiFileStat.Filenames, [2]string{"", path}) + } + iter, err := NewMergePropIter(ctx, []MultipleFilesStat{multiFileStat}, exStorage, checkHotSpot) if err != nil { return nil, err } @@ -73,7 +79,8 @@ func seekPropsOffsets( return offsets, nil } moved = true - offsets[iter.readerIndex()] = p.offset + _, idx := iter.readerIndex() + offsets[idx] = p.offset } if iter.Error() != nil { return nil, iter.Error() diff --git a/br/pkg/lightning/backend/external/writer.go b/br/pkg/lightning/backend/external/writer.go index 6556da432b784..be5bb662fce3a 100644 --- a/br/pkg/lightning/backend/external/writer.go +++ b/br/pkg/lightning/backend/external/writer.go @@ -21,6 +21,7 @@ import ( "encoding/hex" "path/filepath" "slices" + "sort" "strconv" "time" @@ -179,7 +180,10 @@ func (b *WriterBuilder) Build( if b.keyDupeEncoding { keyAdapter = common.DupDetectKeyAdapter{} } - p := membuf.NewPool(membuf.WithPoolSize(0), membuf.WithBlockSize(b.blockSize)) + p := membuf.NewPool( + membuf.WithBlockNum(0), + membuf.WithBlockSize(b.blockSize), + ) ret := &Writer{ rc: &rangePropertiesCollector{ props: make([]*rangeProperty, 0, 1024), @@ -189,12 +193,11 @@ func (b *WriterBuilder) Build( }, memSizeLimit: b.memSizeLimit, store: store, - kvBuffer: p.NewBuffer(membuf.WithMemoryLimit(b.memSizeLimit)), + kvBuffer: p.NewBuffer(membuf.WithBufferMemoryLimit(b.memSizeLimit)), currentSeq: 0, filenamePrefix: filenamePrefix, keyAdapter: keyAdapter, writerID: writerID, - kvStore: nil, onClose: b.onClose, closed: false, multiFileStats: make([]MultipleFilesStat, 1), @@ -214,7 +217,7 @@ func (b *WriterBuilder) BuildOneFile( writerID string, ) *OneFileWriter { filenamePrefix := filepath.Join(prefix, writerID) - p := membuf.NewPool(membuf.WithPoolSize(0), membuf.WithBlockSize(b.blockSize)) + p := membuf.NewPool(membuf.WithBlockNum(0), membuf.WithBlockSize(b.blockSize)) ret := &OneFileWriter{ rc: &rangePropertiesCollector{ @@ -223,12 +226,11 @@ func (b *WriterBuilder) BuildOneFile( propSizeDist: b.propSizeDist, propKeysDist: b.propKeysDist, }, - kvBuffer: p.NewBuffer(membuf.WithMemoryLimit(b.memSizeLimit)), + kvBuffer: p.NewBuffer(membuf.WithBufferMemoryLimit(b.memSizeLimit)), store: store, filenamePrefix: filenamePrefix, writerID: writerID, kvStore: nil, - onClose: b.onClose, closed: false, } return ret @@ -238,12 +240,32 @@ func (b *WriterBuilder) BuildOneFile( // every 500 files). It is used to estimate the data overlapping, and per-file // statistic information maybe too big to loaded into memory. type MultipleFilesStat struct { - MinKey tidbkv.Key `json:"min-key"` - MaxKey tidbkv.Key `json:"max-key"` - Filenames [][2]string `json:"filenames"` // [dataFile, statFile] + MinKey tidbkv.Key `json:"min-key"` + MaxKey tidbkv.Key `json:"max-key"` + // Filenames is a list of [dataFile, statFile] paris, and it's sorted by the + // first key of the data file. + Filenames [][2]string `json:"filenames"` MaxOverlappingNum int64 `json:"max-overlapping-num"` } +type startKeysAndFiles struct { + startKeys []tidbkv.Key + files [][2]string +} + +func (s *startKeysAndFiles) Len() int { + return len(s.startKeys) +} + +func (s *startKeysAndFiles) Less(i, j int) bool { + return s.startKeys[i].Cmp(s.startKeys[j]) < 0 +} + +func (s *startKeysAndFiles) Swap(i, j int) { + s.startKeys[i], s.startKeys[j] = s.startKeys[j], s.startKeys[i] + s.files[i], s.files[j] = s.files[j], s.files[i] +} + func (m *MultipleFilesStat) build(startKeys, endKeys []tidbkv.Key) { if len(startKeys) == 0 { return @@ -258,6 +280,9 @@ func (m *MultipleFilesStat) build(startKeys, endKeys []tidbkv.Key) { m.MaxKey = endKeys[i] } } + // make Filenames sorted by startKeys + s := &startKeysAndFiles{startKeys, m.Filenames} + sort.Sort(s) points := make([]Endpoint, 0, len(startKeys)*2) for _, k := range startKeys { @@ -291,8 +316,7 @@ type Writer struct { filenamePrefix string keyAdapter common.KeyAdapter - kvStore *KeyValueStore - rc *rangePropertiesCollector + rc *rangePropertiesCollector memSizeLimit uint64 @@ -339,9 +363,9 @@ func (w *Writer) WriteRow(ctx context.Context, idxKey, idxVal []byte, handle tid } } binary.BigEndian.AppendUint64(dataBuf[:0], uint64(encodedKeyLen)) - keyAdapter.Encode(dataBuf[lengthBytes:lengthBytes:lengthBytes+encodedKeyLen], idxKey, rowID) - binary.BigEndian.AppendUint64(dataBuf[lengthBytes+encodedKeyLen:lengthBytes+encodedKeyLen], uint64(len(idxVal))) - copy(dataBuf[lengthBytes*2+encodedKeyLen:], idxVal) + binary.BigEndian.AppendUint64(dataBuf[:lengthBytes], uint64(len(idxVal))) + keyAdapter.Encode(dataBuf[2*lengthBytes:2*lengthBytes:2*lengthBytes+encodedKeyLen], idxKey, rowID) + copy(dataBuf[2*lengthBytes+encodedKeyLen:], idxVal) w.kvLocations = append(w.kvLocations, loc) w.kvSize += int64(encodedKeyLen + len(idxVal)) @@ -377,7 +401,6 @@ func (w *Writer) Close(ctx context.Context) error { zap.String("maxKey", hex.EncodeToString(w.maxKey))) w.kvLocations = nil - w.onClose(&WriterSummary{ WriterID: w.writerID, Seq: w.currentSeq, @@ -399,94 +422,58 @@ func (w *Writer) recordMinMax(newMin, newMax tidbkv.Key, size uint64) { w.totalSize += size } +const flushKVsRetryTimes = 3 + func (w *Writer) flushKVs(ctx context.Context, fromClose bool) (err error) { if len(w.kvLocations) == 0 { return nil } - logger := logutil.Logger(ctx) - dataFile, statFile, dataWriter, statWriter, err := w.createStorageWriter(ctx) - if err != nil { - return err - } - - var ( - savedBytes uint64 - statSize int - sortDuration, writeDuration time.Duration - writeStartTime time.Time + logger := logutil.Logger(ctx).With( + zap.String("writer-id", w.writerID), + zap.Int("sequence-number", w.currentSeq), ) - savedBytes = w.batchSize - startTs := time.Now() - - kvCnt := len(w.kvLocations) - defer func() { - w.currentSeq++ - err1, err2 := dataWriter.Close(ctx), statWriter.Close(ctx) - if err != nil { - return - } - if err1 != nil { - logger.Error("close data writer failed", zap.Error(err1)) - err = err1 - return - } - if err2 != nil { - logger.Error("close stat writer failed", zap.Error(err2)) - err = err2 - return - } - writeDuration = time.Since(writeStartTime) - logger.Info("flush kv", - zap.Uint64("bytes", savedBytes), - zap.Int("kv-cnt", kvCnt), - zap.Int("stat-size", statSize), - zap.Duration("sort-time", sortDuration), - zap.Duration("write-time", writeDuration), - zap.String("sort-speed(kv/s)", getSpeed(uint64(kvCnt), sortDuration.Seconds(), false)), - zap.String("write-speed(bytes/s)", getSpeed(savedBytes, writeDuration.Seconds(), true)), - zap.String("writer-id", w.writerID), - ) - metrics.GlobalSortWriteToCloudStorageDuration.WithLabelValues("write").Observe(writeDuration.Seconds()) - metrics.GlobalSortWriteToCloudStorageRate.WithLabelValues("write").Observe(float64(savedBytes) / 1024.0 / 1024.0 / writeDuration.Seconds()) - metrics.GlobalSortWriteToCloudStorageDuration.WithLabelValues("sort_and_write").Observe(time.Since(startTs).Seconds()) - metrics.GlobalSortWriteToCloudStorageRate.WithLabelValues("sort_and_write").Observe(float64(savedBytes) / 1024.0 / 1024.0 / time.Since(startTs).Seconds()) - }() - sortStart := time.Now() slices.SortFunc(w.kvLocations, func(i, j membuf.SliceLocation) int { return bytes.Compare(w.getKeyByLoc(i), w.getKeyByLoc(j)) }) - sortDuration = time.Since(sortStart) - - writeStartTime = time.Now() + sortDuration := time.Since(sortStart) metrics.GlobalSortWriteToCloudStorageDuration.WithLabelValues("sort").Observe(sortDuration.Seconds()) - metrics.GlobalSortWriteToCloudStorageRate.WithLabelValues("sort").Observe(float64(savedBytes) / 1024.0 / 1024.0 / sortDuration.Seconds()) - w.kvStore, err = NewKeyValueStore(ctx, dataWriter, w.rc) - if err != nil { - return err - } - - for _, pair := range w.kvLocations { - err = w.kvStore.addEncodedData(w.kvBuffer.GetSlice(pair)) - if err != nil { - return err + metrics.GlobalSortWriteToCloudStorageRate.WithLabelValues("sort").Observe(float64(w.batchSize) / 1024.0 / 1024.0 / sortDuration.Seconds()) + + writeStartTime := time.Now() + var dataFile, statFile string + for i := 0; i < flushKVsRetryTimes; i++ { + dataFile, statFile, err = w.flushSortedKVs(ctx) + if err == nil { + break } + logger.Warn("flush sorted kv failed", + zap.Error(err), + zap.Int("retry-count", i), + ) } - - w.kvStore.Close() - encodedStat := w.rc.encode() - statSize = len(encodedStat) - _, err = statWriter.Write(ctx, encodedStat) if err != nil { return err } + writeDuration := time.Since(writeStartTime) + kvCnt := len(w.kvLocations) + logger.Info("flush kv", + zap.Uint64("bytes", w.batchSize), + zap.Int("kv-cnt", kvCnt), + zap.Duration("sort-time", sortDuration), + zap.Duration("write-time", writeDuration), + zap.String("sort-speed(kv/s)", getSpeed(uint64(kvCnt), sortDuration.Seconds(), false)), + zap.String("writer-id", w.writerID), + ) + totalDuration := time.Since(sortStart) + metrics.GlobalSortWriteToCloudStorageDuration.WithLabelValues("sort_and_write").Observe(totalDuration.Seconds()) + metrics.GlobalSortWriteToCloudStorageRate.WithLabelValues("sort_and_write").Observe(float64(w.batchSize) / 1024.0 / 1024.0 / totalDuration.Seconds()) minKey, maxKey := w.getKeyByLoc(w.kvLocations[0]), w.getKeyByLoc(w.kvLocations[len(w.kvLocations)-1]) w.recordMinMax(minKey, maxKey, uint64(w.kvSize)) // maintain 500-batch statistics - l := len(w.multiFileStats) w.multiFileStats[l-1].Filenames = append(w.multiFileStats[l-1].Filenames, [2]string{dataFile, statFile}, @@ -507,13 +494,77 @@ func (w *Writer) flushKVs(ctx context.Context, fromClose bool) (err error) { w.kvBuffer.Reset() w.rc.reset() w.batchSize = 0 + w.currentSeq++ return nil } +func (w *Writer) flushSortedKVs(ctx context.Context) (string, string, error) { + logger := logutil.Logger(ctx).With( + zap.String("writer-id", w.writerID), + zap.Int("sequence-number", w.currentSeq), + ) + writeStartTime := time.Now() + dataFile, statFile, dataWriter, statWriter, err := w.createStorageWriter(ctx) + if err != nil { + return "", "", err + } + defer func() { + // close the writers when meet error. If no error happens, writers will + // be closed outside and assigned to nil. + if dataWriter != nil { + _ = dataWriter.Close(ctx) + } + if statWriter != nil { + _ = statWriter.Close(ctx) + } + }() + kvStore, err := NewKeyValueStore(ctx, dataWriter, w.rc) + if err != nil { + return "", "", err + } + + for _, pair := range w.kvLocations { + err = kvStore.addEncodedData(w.kvBuffer.GetSlice(pair)) + if err != nil { + return "", "", err + } + } + + kvStore.Close() + encodedStat := w.rc.encode() + statSize := len(encodedStat) + _, err = statWriter.Write(ctx, encodedStat) + if err != nil { + return "", "", err + } + err = dataWriter.Close(ctx) + dataWriter = nil + if err != nil { + return "", "", err + } + err = statWriter.Close(ctx) + statWriter = nil + if err != nil { + return "", "", err + } + + writeDuration := time.Since(writeStartTime) + logger.Info("flush sorted kv", + zap.Uint64("bytes", w.batchSize), + zap.Int("stat-size", statSize), + zap.Duration("write-time", writeDuration), + zap.String("write-speed(bytes/s)", getSpeed(w.batchSize, writeDuration.Seconds(), true)), + ) + metrics.GlobalSortWriteToCloudStorageDuration.WithLabelValues("write").Observe(writeDuration.Seconds()) + metrics.GlobalSortWriteToCloudStorageRate.WithLabelValues("write").Observe(float64(w.batchSize) / 1024.0 / 1024.0 / writeDuration.Seconds()) + + return dataFile, statFile, nil +} + func (w *Writer) getKeyByLoc(loc membuf.SliceLocation) []byte { block := w.kvBuffer.GetSlice(loc) keyLen := binary.BigEndian.Uint64(block[:lengthBytes]) - return block[lengthBytes : lengthBytes+keyLen] + return block[2*lengthBytes : 2*lengthBytes+keyLen] } func (w *Writer) createStorageWriter(ctx context.Context) ( diff --git a/br/pkg/lightning/backend/external/writer_test.go b/br/pkg/lightning/backend/external/writer_test.go index 7bc853f63dc1c..eaa6180d41066 100644 --- a/br/pkg/lightning/backend/external/writer_test.go +++ b/br/pkg/lightning/backend/external/writer_test.go @@ -30,14 +30,76 @@ import ( "github.com/jfcg/sorty/v2" "github.com/pingcap/tidb/br/pkg/lightning/backend/kv" "github.com/pingcap/tidb/br/pkg/lightning/common" + "github.com/pingcap/tidb/br/pkg/lightning/log" "github.com/pingcap/tidb/br/pkg/membuf" "github.com/pingcap/tidb/br/pkg/storage" dbkv "github.com/pingcap/tidb/pkg/kv" + "github.com/pingcap/tidb/pkg/util/logutil" "github.com/pingcap/tidb/pkg/util/size" "github.com/stretchr/testify/require" + "go.uber.org/zap" "golang.org/x/exp/rand" ) +// only used in testing for now. +func mergeOverlappingFilesImpl(ctx context.Context, + paths []string, + store storage.ExternalStorage, + readBufferSize int, + newFilePrefix string, + writerID string, + memSizeLimit uint64, + blockSize int, + writeBatchCount uint64, + propSizeDist uint64, + propKeysDist uint64, + onClose OnCloseFunc, + checkHotspot bool, +) (err error) { + task := log.BeginTask(logutil.Logger(ctx).With( + zap.String("writer-id", writerID), + zap.Int("file-count", len(paths)), + ), "merge overlapping files") + defer func() { + task.End(zap.ErrorLevel, err) + }() + + zeroOffsets := make([]uint64, len(paths)) + iter, err := NewMergeKVIter(ctx, paths, zeroOffsets, store, readBufferSize, checkHotspot, 0) + if err != nil { + return err + } + defer func() { + err := iter.Close() + if err != nil { + logutil.Logger(ctx).Warn("close iterator failed", zap.Error(err)) + } + }() + + writer := NewWriterBuilder(). + SetMemorySizeLimit(memSizeLimit). + SetBlockSize(blockSize). + SetOnCloseFunc(onClose). + SetWriterBatchCount(writeBatchCount). + SetPropSizeDistance(propSizeDist). + SetPropKeysDistance(propKeysDist). + Build(store, newFilePrefix, writerID) + + // currently use same goroutine to do read and write. The main advantage is + // there's no KV copy and iter can reuse the buffer. + for iter.Next() { + err = writer.WriteRow(ctx, iter.Key(), iter.Value(), nil) + if err != nil { + return err + } + } + err = iter.Error() + if err != nil { + return err + } + return writer.Close(ctx) +} + func TestWriter(t *testing.T) { seed := time.Now().Unix() rand.Seed(uint64(seed)) @@ -236,7 +298,11 @@ func TestWriterDuplicateDetect(t *testing.T) { } func TestMultiFileStat(t *testing.T) { - s := &MultipleFilesStat{} + s := &MultipleFilesStat{ + Filenames: [][2]string{ + {"3", "5"}, {"1", "3"}, {"2", "4"}, + }, + } // [3, 5], [1, 3], [2, 4] startKeys := []dbkv.Key{{3}, {1}, {2}} endKeys := []dbkv.Key{{5}, {3}, {4}} @@ -244,6 +310,7 @@ func TestMultiFileStat(t *testing.T) { require.EqualValues(t, []byte{1}, s.MinKey) require.EqualValues(t, []byte{5}, s.MaxKey) require.EqualValues(t, 3, s.MaxOverlappingNum) + require.Equal(t, [][2]string{{"1", "3"}, {"2", "4"}, {"3", "5"}}, s.Filenames) } func TestMultiFileStatOverlap(t *testing.T) { diff --git a/br/pkg/lightning/backend/kv/BUILD.bazel b/br/pkg/lightning/backend/kv/BUILD.bazel index 207297a01ddc1..a15f31d90f2e8 100644 --- a/br/pkg/lightning/backend/kv/BUILD.bazel +++ b/br/pkg/lightning/backend/kv/BUILD.bazel @@ -22,6 +22,7 @@ go_library( "//br/pkg/logutil", "//br/pkg/redact", "//br/pkg/utils", + "//pkg/errctx", "//pkg/expression", "//pkg/kv", "//pkg/meta/autoid", diff --git a/br/pkg/lightning/backend/kv/base.go b/br/pkg/lightning/backend/kv/base.go index b4cfeb1d318f5..1dceebf90e568 100644 --- a/br/pkg/lightning/backend/kv/base.go +++ b/br/pkg/lightning/backend/kv/base.go @@ -270,7 +270,7 @@ func (e *BaseKVEncoder) getActualDatum(col *table.Column, rowID int64, inputDatu // if MutRowFromDatums sees a nil it won't initialize the underlying storage and cause SetDatum to panic. value = types.GetMinValue(&col.FieldType) case isBadNullValue: - err = col.HandleBadNull(&value, e.SessionCtx.Vars.StmtCtx, 0) + err = col.HandleBadNull(e.SessionCtx.Vars.StmtCtx.ErrCtx(), &value, 0) default: // copy from the following GetColDefaultValue function, when this is true it will use getColDefaultExprValue if col.DefaultIsExpr { diff --git a/br/pkg/lightning/backend/kv/session.go b/br/pkg/lightning/backend/kv/session.go index d6b9add03273c..fc5d14275ecfd 100644 --- a/br/pkg/lightning/backend/kv/session.go +++ b/br/pkg/lightning/backend/kv/session.go @@ -29,11 +29,11 @@ import ( "github.com/pingcap/tidb/br/pkg/lightning/log" "github.com/pingcap/tidb/br/pkg/lightning/manual" "github.com/pingcap/tidb/br/pkg/utils" + "github.com/pingcap/tidb/pkg/errctx" "github.com/pingcap/tidb/pkg/kv" "github.com/pingcap/tidb/pkg/parser/model" "github.com/pingcap/tidb/pkg/sessionctx" "github.com/pingcap/tidb/pkg/sessionctx/variable" - "github.com/pingcap/tidb/pkg/types" "github.com/pingcap/tidb/pkg/util/topsql/stmtstats" "go.uber.org/zap" ) @@ -286,8 +286,6 @@ func NewSession(options *encode.SessionOptions, logger log.Logger) *Session { vars.SkipUTF8Check = true vars.StmtCtx.InInsertStmt = true vars.StmtCtx.BatchCheck = true - vars.StmtCtx.BadNullAsWarning = !sqlMode.HasStrictMode() - vars.StmtCtx.OverflowAsWarning = !sqlMode.HasStrictMode() vars.SQLMode = sqlMode typeFlags := vars.StmtCtx.TypeFlags(). @@ -295,6 +293,13 @@ func NewSession(options *encode.SessionOptions, logger log.Logger) *Session { WithIgnoreInvalidDateErr(sqlMode.HasAllowInvalidDatesMode()). WithIgnoreZeroInDate(!sqlMode.HasStrictMode() || sqlMode.HasAllowInvalidDatesMode()) vars.StmtCtx.SetTypeFlags(typeFlags) + + errLevels := vars.StmtCtx.ErrLevels() + errLevels[errctx.ErrGroupBadNull] = errctx.ResolveErrLevel(false, !sqlMode.HasStrictMode()) + errLevels[errctx.ErrGroupDividedByZero] = + errctx.ResolveErrLevel(!sqlMode.HasErrorForDivisionByZeroMode(), !sqlMode.HasStrictMode()) + vars.StmtCtx.SetErrLevels(errLevels) + if options.SysVars != nil { for k, v := range options.SysVars { // since 6.3(current master) tidb checks whether we can set a system variable @@ -315,7 +320,6 @@ func NewSession(options *encode.SessionOptions, logger log.Logger) *Session { } } vars.StmtCtx.SetTimeZone(vars.Location()) - vars.StmtCtx.SetTypeFlags(types.StrictFlags) if err := vars.SetSystemVar("timestamp", strconv.FormatInt(options.Timestamp, 10)); err != nil { logger.Warn("new session: failed to set timestamp", log.ShortError(err)) diff --git a/br/pkg/lightning/backend/kv/sql2kv.go b/br/pkg/lightning/backend/kv/sql2kv.go index 489bb6e30d824..1d3ef8b1d2038 100644 --- a/br/pkg/lightning/backend/kv/sql2kv.go +++ b/br/pkg/lightning/backend/kv/sql2kv.go @@ -115,7 +115,7 @@ func CollectGeneratedColumns(se *Session, meta *model.TableInfo, cols []*table.C var genCols []GeneratedCol for i, col := range cols { if col.GeneratedExpr != nil { - expr, err := expression.RewriteAstExpr(se, col.GeneratedExpr, schema, names, true) + expr, err := expression.RewriteAstExpr(se, col.GeneratedExpr.Internal(), schema, names, true) if err != nil { return nil, err } diff --git a/br/pkg/lightning/backend/local/BUILD.bazel b/br/pkg/lightning/backend/local/BUILD.bazel index 7ff8ac076ccbd..4777cc55dc981 100644 --- a/br/pkg/lightning/backend/local/BUILD.bazel +++ b/br/pkg/lightning/backend/local/BUILD.bazel @@ -8,6 +8,7 @@ go_library( "disk_quota.go", "duplicate.go", "engine.go", + "engine_mgr.go", "iterator.go", "local.go", "local_freebsd.go", @@ -51,10 +52,10 @@ go_library( "//pkg/parser/model", "//pkg/parser/mysql", "//pkg/sessionctx/variable", - "//pkg/store/pdtypes", "//pkg/table", "//pkg/tablecodec", "//pkg/types", + "//pkg/util", "//pkg/util/codec", "//pkg/util/compress", "//pkg/util/engine", @@ -81,6 +82,8 @@ go_library( "@com_github_tikv_client_go_v2//tikv", "@com_github_tikv_client_go_v2//util", "@com_github_tikv_pd_client//:client", + "@com_github_tikv_pd_client//http", + "@com_github_tikv_pd_client//retry", "@org_golang_google_grpc//:grpc", "@org_golang_google_grpc//backoff", "@org_golang_google_grpc//codes", @@ -104,11 +107,13 @@ go_test( "compress_test.go", "disk_quota_test.go", "duplicate_test.go", + "engine_mgr_test.go", "engine_test.go", "iterator_test.go", "local_check_test.go", "local_test.go", "localhelper_test.go", + "main_test.go", "region_job_test.go", ], embed = [":local"], @@ -127,7 +132,6 @@ go_test( "//br/pkg/lightning/mydump", "//br/pkg/membuf", "//br/pkg/mock/mocklocal", - "//br/pkg/pdutil", "//br/pkg/restore/split", "//br/pkg/storage", "//br/pkg/utils", @@ -143,6 +147,7 @@ go_test( "//pkg/store/pdtypes", "//pkg/table/tables", "//pkg/tablecodec", + "//pkg/testkit/testsetup", "//pkg/types", "//pkg/util", "//pkg/util/codec", @@ -167,11 +172,13 @@ go_test( "@com_github_tikv_client_go_v2//oracle", "@com_github_tikv_pd_client//:client", "@com_github_tikv_pd_client//errs", + "@com_github_tikv_pd_client//http", "@org_golang_google_grpc//:grpc", "@org_golang_google_grpc//codes", "@org_golang_google_grpc//encoding", "@org_golang_google_grpc//status", "@org_uber_go_atomic//:atomic", + "@org_uber_go_goleak//:goleak", "@org_uber_go_mock//gomock", ], ) diff --git a/br/pkg/lightning/backend/local/checksum_test.go b/br/pkg/lightning/backend/local/checksum_test.go index 4e9334492b051..173133cd041da 100644 --- a/br/pkg/lightning/backend/local/checksum_test.go +++ b/br/pkg/lightning/backend/local/checksum_test.go @@ -239,6 +239,9 @@ func TestDoChecksumWithErrorAndLongOriginalLifetime(t *testing.T) { func TestGetGCLifetime(t *testing.T) { db, mock, err := sqlmock.New() require.NoError(t, err) + t.Cleanup(func() { + require.NoError(t, db.Close()) + }) ctx := context.Background() mock. @@ -254,6 +257,9 @@ func TestGetGCLifetime(t *testing.T) { func TestSetGCLifetime(t *testing.T) { db, mock, err := sqlmock.New() + t.Cleanup(func() { + require.NoError(t, db.Close()) + }) require.NoError(t, err) ctx := context.Background() @@ -353,6 +359,7 @@ func TestGcTTLManagerSingle(t *testing.T) { // after remove the job, there are no job remain, gc ttl needn't to be updated manager.removeOneJob("test") + cancel() time.Sleep(10 * time.Millisecond) val = pdClient.count.Load() time.Sleep(1*time.Second + 10*time.Millisecond) @@ -361,7 +368,8 @@ func TestGcTTLManagerSingle(t *testing.T) { func TestGcTTLManagerMulti(t *testing.T) { manager := newGCTTLManager(&testPDClient{}) - ctx := context.Background() + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() for i := uint64(1); i <= 5; i++ { err := manager.addOneJob(ctx, fmt.Sprintf("test%d", i), i) @@ -383,6 +391,9 @@ func TestGcTTLManagerMulti(t *testing.T) { manager.removeOneJob("test5") require.Equal(t, uint64(0), manager.currentTS) + cancel() + // GCTTLManager don't wait its goroutine to exit, so we need to wait awhile. + time.Sleep(time.Second) } func TestPdServiceID(t *testing.T) { diff --git a/br/pkg/lightning/backend/local/engine.go b/br/pkg/lightning/backend/local/engine.go index d577258142711..78b98b11a62f1 100644 --- a/br/pkg/lightning/backend/local/engine.go +++ b/br/pkg/lightning/backend/local/engine.go @@ -642,7 +642,7 @@ func (e *Engine) ingestSSTLoop() { } ingestMetas := metas.metas if e.config.Compact { - newMeta, err := e.sstIngester.mergeSSTs(metas.metas, e.sstDir) + newMeta, err := e.sstIngester.mergeSSTs(metas.metas, e.sstDir, e.config.BlockSize) if err != nil { e.setError(err) return @@ -1349,7 +1349,7 @@ func (w *Writer) addSST(ctx context.Context, meta *sstMeta) error { func (w *Writer) createSSTWriter() (*sstWriter, error) { path := filepath.Join(w.engine.sstDir, uuid.New().String()+".sst") - writer, err := newSSTWriter(path) + writer, err := newSSTWriter(path, w.engine.config.BlockSize) if err != nil { return nil, err } @@ -1365,7 +1365,7 @@ type sstWriter struct { logger log.Logger } -func newSSTWriter(path string) (*sstable.Writer, error) { +func newSSTWriter(path string, blockSize int) (*sstable.Writer, error) { f, err := os.Create(path) if err != nil { return nil, errors.Trace(err) @@ -1374,7 +1374,7 @@ func newSSTWriter(path string) (*sstable.Writer, error) { TablePropertyCollectors: []func() pebble.TablePropertyCollector{ newRangePropertiesCollector, }, - BlockSize: 16 * 1024, + BlockSize: blockSize, }) return writer, nil } @@ -1504,7 +1504,7 @@ func (h *sstIterHeap) Next() ([]byte, []byte, error) { // sstIngester is a interface used to merge and ingest SST files. // it's a interface mainly used for test convenience type sstIngester interface { - mergeSSTs(metas []*sstMeta, dir string) (*sstMeta, error) + mergeSSTs(metas []*sstMeta, dir string, blockSize int) (*sstMeta, error) ingest([]*sstMeta) error } @@ -1512,7 +1512,7 @@ type dbSSTIngester struct { e *Engine } -func (i dbSSTIngester) mergeSSTs(metas []*sstMeta, dir string) (*sstMeta, error) { +func (i dbSSTIngester) mergeSSTs(metas []*sstMeta, dir string, blockSize int) (*sstMeta, error) { if len(metas) == 0 { return nil, errors.New("sst metas is empty") } else if len(metas) == 1 { @@ -1561,7 +1561,7 @@ func (i dbSSTIngester) mergeSSTs(metas []*sstMeta, dir string) (*sstMeta, error) heap.Init(mergeIter) name := filepath.Join(dir, fmt.Sprintf("%s.sst", uuid.New())) - writer, err := newSSTWriter(name) + writer, err := newSSTWriter(name, blockSize) if err != nil { return nil, errors.Trace(err) } diff --git a/br/pkg/lightning/backend/local/engine_mgr.go b/br/pkg/lightning/backend/local/engine_mgr.go new file mode 100644 index 0000000000000..dfeb4f4726f76 --- /dev/null +++ b/br/pkg/lightning/backend/local/engine_mgr.go @@ -0,0 +1,602 @@ +// Copyright 2023 PingCAP, 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. + +package local + +import ( + "context" + "math" + "os" + "path/filepath" + "sync" + + "github.com/cockroachdb/pebble" + "github.com/docker/go-units" + "github.com/google/uuid" + "github.com/pingcap/errors" + "github.com/pingcap/failpoint" + "github.com/pingcap/tidb/br/pkg/lightning/backend" + "github.com/pingcap/tidb/br/pkg/lightning/backend/external" + "github.com/pingcap/tidb/br/pkg/lightning/common" + "github.com/pingcap/tidb/br/pkg/lightning/log" + "github.com/pingcap/tidb/br/pkg/lightning/manual" + "github.com/pingcap/tidb/br/pkg/membuf" + "github.com/pingcap/tidb/br/pkg/storage" + "github.com/tikv/client-go/v2/oracle" + tikvclient "github.com/tikv/client-go/v2/tikv" + "go.uber.org/atomic" + "go.uber.org/zap" + "golang.org/x/sync/errgroup" + "google.golang.org/grpc/status" +) + +var ( + // RunInTest indicates whether the current process is running in test. + RunInTest bool + // LastAlloc is the last ID allocator. + LastAlloc manual.Allocator +) + +// StoreHelper have some api to help encode or store KV data +type StoreHelper interface { + GetTS(ctx context.Context) (physical, logical int64, err error) + GetTiKVCodec() tikvclient.Codec +} + +// engineManager manages all engines, either local or external. +type engineManager struct { + BackendConfig + StoreHelper + engines sync.Map // sync version of map[uuid.UUID]*Engine + externalEngine map[uuid.UUID]common.Engine + bufferPool *membuf.Pool + duplicateDB *pebble.DB + keyAdapter common.KeyAdapter + logger log.Logger +} + +func newEngineManager(config BackendConfig, storeHelper StoreHelper, logger log.Logger) (_ *engineManager, err error) { + var duplicateDB *pebble.DB + defer func() { + if err != nil && duplicateDB != nil { + _ = duplicateDB.Close() + } + }() + + if err = prepareSortDir(config); err != nil { + return nil, err + } + + keyAdapter := common.KeyAdapter(common.NoopKeyAdapter{}) + if config.DupeDetectEnabled { + duplicateDB, err = openDuplicateDB(config.LocalStoreDir) + if err != nil { + return nil, common.ErrOpenDuplicateDB.Wrap(err).GenWithStackByArgs() + } + keyAdapter = common.DupDetectKeyAdapter{} + } + alloc := manual.Allocator{} + if RunInTest { + alloc.RefCnt = new(atomic.Int64) + LastAlloc = alloc + } + return &engineManager{ + BackendConfig: config, + StoreHelper: storeHelper, + engines: sync.Map{}, + externalEngine: map[uuid.UUID]common.Engine{}, + bufferPool: membuf.NewPool(membuf.WithAllocator(alloc)), + duplicateDB: duplicateDB, + keyAdapter: keyAdapter, + logger: logger, + }, nil +} + +// rlock read locks a local file and returns the Engine instance if it exists. +func (em *engineManager) rLockEngine(engineID uuid.UUID) *Engine { + if e, ok := em.engines.Load(engineID); ok { + engine := e.(*Engine) + engine.rLock() + return engine + } + return nil +} + +// lock locks a local file and returns the Engine instance if it exists. +func (em *engineManager) lockEngine(engineID uuid.UUID, state importMutexState) *Engine { + if e, ok := em.engines.Load(engineID); ok { + engine := e.(*Engine) + engine.lock(state) + return engine + } + return nil +} + +// tryRLockAllEngines tries to read lock all engines, return all `Engine`s that are successfully locked. +func (em *engineManager) tryRLockAllEngines() []*Engine { + var allEngines []*Engine + em.engines.Range(func(k, v interface{}) bool { + engine := v.(*Engine) + // skip closed engine + if engine.tryRLock() { + if !engine.closed.Load() { + allEngines = append(allEngines, engine) + } else { + engine.rUnlock() + } + } + return true + }) + return allEngines +} + +// lockAllEnginesUnless tries to lock all engines, unless those which are already locked in the +// state given by ignoreStateMask. Returns the list of locked engines. +func (em *engineManager) lockAllEnginesUnless(newState, ignoreStateMask importMutexState) []*Engine { + var allEngines []*Engine + em.engines.Range(func(k, v interface{}) bool { + engine := v.(*Engine) + if engine.lockUnless(newState, ignoreStateMask) { + allEngines = append(allEngines, engine) + } + return true + }) + return allEngines +} + +// flushEngine ensure the written data is saved successfully, to make sure no data lose after restart +func (em *engineManager) flushEngine(ctx context.Context, engineID uuid.UUID) error { + engine := em.rLockEngine(engineID) + + // the engine cannot be deleted after while we've acquired the lock identified by UUID. + if engine == nil { + return errors.Errorf("engine '%s' not found", engineID) + } + defer engine.rUnlock() + if engine.closed.Load() { + return nil + } + return engine.flushEngineWithoutLock(ctx) +} + +// flushAllEngines flush all engines. +func (em *engineManager) flushAllEngines(parentCtx context.Context) (err error) { + allEngines := em.tryRLockAllEngines() + defer func() { + for _, engine := range allEngines { + engine.rUnlock() + } + }() + + eg, ctx := errgroup.WithContext(parentCtx) + for _, engine := range allEngines { + e := engine + eg.Go(func() error { + return e.flushEngineWithoutLock(ctx) + }) + } + return eg.Wait() +} + +func (em *engineManager) openEngineDB(engineUUID uuid.UUID, readOnly bool) (*pebble.DB, error) { + opt := &pebble.Options{ + MemTableSize: em.MemTableSize, + // the default threshold value may cause write stall. + MemTableStopWritesThreshold: 8, + MaxConcurrentCompactions: 16, + // set threshold to half of the max open files to avoid trigger compaction + L0CompactionThreshold: math.MaxInt32, + L0StopWritesThreshold: math.MaxInt32, + LBaseMaxBytes: 16 * units.TiB, + MaxOpenFiles: em.MaxOpenFiles, + DisableWAL: true, + ReadOnly: readOnly, + TablePropertyCollectors: []func() pebble.TablePropertyCollector{ + newRangePropertiesCollector, + }, + DisableAutomaticCompactions: em.DisableAutomaticCompactions, + } + // set level target file size to avoid pebble auto triggering compaction that split ingest SST files into small SST. + opt.Levels = []pebble.LevelOptions{ + { + TargetFileSize: 16 * units.GiB, + BlockSize: em.BlockSize, + }, + } + + dbPath := filepath.Join(em.LocalStoreDir, engineUUID.String()) + db, err := pebble.Open(dbPath, opt) + return db, errors.Trace(err) +} + +// openEngine must be called with holding mutex of Engine. +func (em *engineManager) openEngine(ctx context.Context, cfg *backend.EngineConfig, engineUUID uuid.UUID) error { + db, err := em.openEngineDB(engineUUID, false) + if err != nil { + return err + } + + sstDir := engineSSTDir(em.LocalStoreDir, engineUUID) + if !cfg.KeepSortDir { + if err := os.RemoveAll(sstDir); err != nil { + return errors.Trace(err) + } + } + if !common.IsDirExists(sstDir) { + if err := os.Mkdir(sstDir, 0o750); err != nil { + return errors.Trace(err) + } + } + engineCtx, cancel := context.WithCancel(ctx) + + e, _ := em.engines.LoadOrStore(engineUUID, &Engine{ + UUID: engineUUID, + sstDir: sstDir, + sstMetasChan: make(chan metaOrFlush, 64), + ctx: engineCtx, + cancel: cancel, + config: cfg.Local, + tableInfo: cfg.TableInfo, + duplicateDetection: em.DupeDetectEnabled, + dupDetectOpt: em.DuplicateDetectOpt, + duplicateDB: em.duplicateDB, + keyAdapter: em.keyAdapter, + logger: log.FromContext(ctx), + }) + engine := e.(*Engine) + engine.lock(importMutexStateOpen) + defer engine.unlock() + engine.db.Store(db) + engine.sstIngester = dbSSTIngester{e: engine} + if err = engine.loadEngineMeta(); err != nil { + return errors.Trace(err) + } + if err = em.allocateTSIfNotExists(ctx, engine); err != nil { + return errors.Trace(err) + } + engine.wg.Add(1) + go engine.ingestSSTLoop() + return nil +} + +// closeEngine closes backend engine by uuid. +func (em *engineManager) closeEngine(ctx context.Context, cfg *backend.EngineConfig, engineUUID uuid.UUID) error { + if externalCfg := cfg.External; externalCfg != nil { + storeBackend, err := storage.ParseBackend(externalCfg.StorageURI, nil) + if err != nil { + return err + } + store, err := storage.NewWithDefaultOpt(ctx, storeBackend) + if err != nil { + return err + } + physical, logical, err := em.GetTS(ctx) + if err != nil { + return err + } + ts := oracle.ComposeTS(physical, logical) + externalEngine := external.NewExternalEngine( + store, + externalCfg.DataFiles, + externalCfg.StatFiles, + externalCfg.StartKey, + externalCfg.EndKey, + externalCfg.SplitKeys, + externalCfg.RegionSplitSize, + em.keyAdapter, + em.DupeDetectEnabled, + em.duplicateDB, + em.DuplicateDetectOpt, + em.WorkerConcurrency, + ts, + externalCfg.TotalFileSize, + externalCfg.TotalKVCount, + externalCfg.CheckHotspot, + ) + em.externalEngine[engineUUID] = externalEngine + return nil + } + + // flush mem table to storage, to free memory, + // ask others' advise, looks like unnecessary, but with this we can control memory precisely. + engineI, ok := em.engines.Load(engineUUID) + if !ok { + // recovery mode, we should reopen this engine file + db, err := em.openEngineDB(engineUUID, true) + if err != nil { + return err + } + engine := &Engine{ + UUID: engineUUID, + sstMetasChan: make(chan metaOrFlush), + tableInfo: cfg.TableInfo, + keyAdapter: em.keyAdapter, + duplicateDetection: em.DupeDetectEnabled, + dupDetectOpt: em.DuplicateDetectOpt, + duplicateDB: em.duplicateDB, + logger: log.FromContext(ctx), + } + engine.db.Store(db) + engine.sstIngester = dbSSTIngester{e: engine} + if err = engine.loadEngineMeta(); err != nil { + return err + } + em.engines.Store(engineUUID, engine) + return nil + } + + engine := engineI.(*Engine) + engine.rLock() + if engine.closed.Load() { + engine.rUnlock() + return nil + } + + err := engine.flushEngineWithoutLock(ctx) + engine.rUnlock() + + // use mutex to make sure we won't close sstMetasChan while other routines + // trying to do flush. + engine.lock(importMutexStateClose) + engine.closed.Store(true) + close(engine.sstMetasChan) + engine.unlock() + if err != nil { + return errors.Trace(err) + } + engine.wg.Wait() + return engine.ingestErr.Get() +} + +// getImportedKVCount returns the number of imported KV pairs of some engine. +func (em *engineManager) getImportedKVCount(engineUUID uuid.UUID) int64 { + v, ok := em.engines.Load(engineUUID) + if !ok { + // we get it after import, but before clean up, so this should not happen + // todo: return error + return 0 + } + e := v.(*Engine) + return e.importedKVCount.Load() +} + +// getExternalEngineKVStatistics returns kv statistics of some engine. +func (em *engineManager) getExternalEngineKVStatistics(engineUUID uuid.UUID) ( + totalKVSize int64, totalKVCount int64) { + v, ok := em.externalEngine[engineUUID] + if !ok { + return 0, 0 + } + return v.ImportedStatistics() +} + +// resetEngine reset the engine and reclaim the space. +func (em *engineManager) resetEngine(ctx context.Context, engineUUID uuid.UUID) error { + // the only way to reset the engine + reclaim the space is to delete and reopen it 🤷 + localEngine := em.lockEngine(engineUUID, importMutexStateClose) + if localEngine == nil { + if engineI, ok := em.externalEngine[engineUUID]; ok { + extEngine := engineI.(*external.Engine) + return extEngine.Reset() + } + + log.FromContext(ctx).Warn("could not find engine in cleanupEngine", zap.Stringer("uuid", engineUUID)) + return nil + } + defer localEngine.unlock() + if err := localEngine.Close(); err != nil { + return err + } + if err := localEngine.Cleanup(em.LocalStoreDir); err != nil { + return err + } + db, err := em.openEngineDB(engineUUID, false) + if err == nil { + localEngine.db.Store(db) + localEngine.engineMeta = engineMeta{} + if !common.IsDirExists(localEngine.sstDir) { + if err := os.Mkdir(localEngine.sstDir, 0o750); err != nil { + return errors.Trace(err) + } + } + if err = em.allocateTSIfNotExists(ctx, localEngine); err != nil { + return errors.Trace(err) + } + failpoint.Inject("mockAllocateTSErr", func() { + // mock generate timestamp error when reset engine. + localEngine.TS = 0 + mockGRPCErr, _ := status.FromError(errors.Errorf("mock generate timestamp error")) + failpoint.Return(errors.Trace(mockGRPCErr.Err())) + }) + } + localEngine.pendingFileSize.Store(0) + + return err +} + +func (em *engineManager) allocateTSIfNotExists(ctx context.Context, engine *Engine) error { + if engine.TS > 0 { + return nil + } + physical, logical, err := em.GetTS(ctx) + if err != nil { + return err + } + ts := oracle.ComposeTS(physical, logical) + engine.TS = ts + return engine.saveEngineMeta() +} + +// cleanupEngine cleanup the engine and reclaim the space. +func (em *engineManager) cleanupEngine(ctx context.Context, engineUUID uuid.UUID) error { + localEngine := em.lockEngine(engineUUID, importMutexStateClose) + // release this engine after import success + if localEngine == nil { + if extEngine, ok := em.externalEngine[engineUUID]; ok { + retErr := extEngine.Close() + delete(em.externalEngine, engineUUID) + return retErr + } + log.FromContext(ctx).Warn("could not find engine in cleanupEngine", zap.Stringer("uuid", engineUUID)) + return nil + } + defer localEngine.unlock() + + // since closing the engine causes all subsequent operations on it panic, + // we make sure to delete it from the engine map before calling Close(). + // (note that Close() returning error does _not_ mean the pebble DB + // remains open/usable.) + em.engines.Delete(engineUUID) + err := localEngine.Close() + if err != nil { + return err + } + err = localEngine.Cleanup(em.LocalStoreDir) + if err != nil { + return err + } + localEngine.TotalSize.Store(0) + localEngine.Length.Store(0) + return nil +} + +// LocalWriter returns a new local writer. +func (em *engineManager) localWriter(_ context.Context, cfg *backend.LocalWriterConfig, engineUUID uuid.UUID) (backend.EngineWriter, error) { + e, ok := em.engines.Load(engineUUID) + if !ok { + return nil, errors.Errorf("could not find engine for %s", engineUUID.String()) + } + engine := e.(*Engine) + return openLocalWriter(cfg, engine, em.GetTiKVCodec(), em.LocalWriterMemCacheSize, em.bufferPool.NewBuffer()) +} + +func (em *engineManager) engineFileSizes() (res []backend.EngineFileSize) { + em.engines.Range(func(k, v interface{}) bool { + engine := v.(*Engine) + res = append(res, engine.getEngineFileSize()) + return true + }) + return +} + +func (em *engineManager) close() { + for _, e := range em.externalEngine { + _ = e.Close() + } + em.externalEngine = map[uuid.UUID]common.Engine{} + allLocalEngines := em.lockAllEnginesUnless(importMutexStateClose, 0) + for _, e := range allLocalEngines { + _ = e.Close() + e.unlock() + } + em.engines = sync.Map{} + em.bufferPool.Destroy() + + if em.duplicateDB != nil { + // Check if there are duplicates that are not collected. + iter := em.duplicateDB.NewIter(&pebble.IterOptions{}) + hasDuplicates := iter.First() + allIsWell := true + if err := iter.Error(); err != nil { + em.logger.Warn("iterate duplicate db failed", zap.Error(err)) + allIsWell = false + } + if err := iter.Close(); err != nil { + em.logger.Warn("close duplicate db iter failed", zap.Error(err)) + allIsWell = false + } + if err := em.duplicateDB.Close(); err != nil { + em.logger.Warn("close duplicate db failed", zap.Error(err)) + allIsWell = false + } + // If checkpoint is disabled, or we don't detect any duplicate, then this duplicate + // db dir will be useless, so we clean up this dir. + if allIsWell && (!em.CheckpointEnabled || !hasDuplicates) { + if err := os.RemoveAll(filepath.Join(em.LocalStoreDir, duplicateDBName)); err != nil { + em.logger.Warn("remove duplicate db file failed", zap.Error(err)) + } + } + em.duplicateDB = nil + } + + // if checkpoint is disabled, or we finish load all data successfully, then files in this + // dir will be useless, so we clean up this dir and all files in it. + if !em.CheckpointEnabled || common.IsEmptyDir(em.LocalStoreDir) { + err := os.RemoveAll(em.LocalStoreDir) + if err != nil { + em.logger.Warn("remove local db file failed", zap.Error(err)) + } + } +} + +func (em *engineManager) getExternalEngine(uuid uuid.UUID) (common.Engine, bool) { + e, ok := em.externalEngine[uuid] + return e, ok +} + +func (em *engineManager) totalMemoryConsume() int64 { + var memConsume int64 + em.engines.Range(func(k, v interface{}) bool { + e := v.(*Engine) + if e != nil { + memConsume += e.TotalMemorySize() + } + return true + }) + return memConsume + em.bufferPool.TotalSize() +} + +func (em *engineManager) getDuplicateDB() *pebble.DB { + return em.duplicateDB +} + +func (em *engineManager) getKeyAdapter() common.KeyAdapter { + return em.keyAdapter +} + +func (em *engineManager) getBufferPool() *membuf.Pool { + return em.bufferPool +} + +func openDuplicateDB(storeDir string) (*pebble.DB, error) { + dbPath := filepath.Join(storeDir, duplicateDBName) + // TODO: Optimize the opts for better write. + opts := &pebble.Options{ + TablePropertyCollectors: []func() pebble.TablePropertyCollector{ + newRangePropertiesCollector, + }, + } + return pebble.Open(dbPath, opts) +} + +func prepareSortDir(config BackendConfig) error { + shouldCreate := true + if config.CheckpointEnabled { + if info, err := os.Stat(config.LocalStoreDir); err != nil { + if !os.IsNotExist(err) { + return err + } + } else if info.IsDir() { + shouldCreate = false + } + } + + if shouldCreate { + err := os.Mkdir(config.LocalStoreDir, 0o700) + if err != nil { + return common.ErrInvalidSortedKVDir.Wrap(err).GenWithStackByArgs(config.LocalStoreDir) + } + } + return nil +} diff --git a/br/pkg/lightning/backend/local/engine_mgr_test.go b/br/pkg/lightning/backend/local/engine_mgr_test.go new file mode 100644 index 0000000000000..e73afefd6b642 --- /dev/null +++ b/br/pkg/lightning/backend/local/engine_mgr_test.go @@ -0,0 +1,116 @@ +// Copyright 2023 PingCAP, 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. + +package local + +import ( + "context" + "io" + "os" + "path" + "sync" + "testing" + + "github.com/google/uuid" + "github.com/pingcap/tidb/br/pkg/lightning/backend" + "github.com/pingcap/tidb/br/pkg/lightning/common" + "github.com/pingcap/tidb/br/pkg/lightning/config" + "github.com/pingcap/tidb/br/pkg/lightning/log" + "github.com/pingcap/tidb/br/pkg/mock/mocklocal" + "github.com/stretchr/testify/require" + "go.uber.org/mock/gomock" +) + +func getBackendConfig(t *testing.T) BackendConfig { + return BackendConfig{ + MemTableSize: config.DefaultEngineMemCacheSize, + MaxOpenFiles: 1000, + DisableAutomaticCompactions: true, + LocalStoreDir: path.Join(t.TempDir(), "sorted-kv"), + DupeDetectEnabled: false, + DuplicateDetectOpt: common.DupDetectOpt{}, + WorkerConcurrency: 8, + LocalWriterMemCacheSize: config.DefaultLocalWriterMemCacheSize, + CheckpointEnabled: false, + } +} + +func TestEngineManager(t *testing.T) { + ctrl := gomock.NewController(t) + defer ctrl.Finish() + storeHelper := mocklocal.NewMockStoreHelper(ctrl) + ctx := context.Background() + syncMapLen := func(m *sync.Map) int { + count := 0 + m.Range(func(key, value interface{}) bool { + count++ + return true + }) + return count + } + isEmptyDir := func(name string) bool { + f, err := os.Open(name) + require.NoError(t, err) + defer f.Close() + _, err = f.Readdirnames(1) // Or f.Readdir(1) + if err == io.EOF { + return true + } + require.Fail(t, err.Error()) + return false + } + + backendConfig := getBackendConfig(t) + em, err := newEngineManager(backendConfig, storeHelper, log.L()) + require.NoError(t, err) + storeHelper.EXPECT().GetTS(gomock.Any()).Return(int64(0), int64(0), nil) + engine1ID := uuid.New() + require.NoError(t, em.openEngine(ctx, &backend.EngineConfig{}, engine1ID)) + require.Equal(t, 1, syncMapLen(&em.engines)) + _, ok := em.engines.Load(engine1ID) + require.True(t, ok) + require.True(t, ctrl.Satisfied()) + require.Len(t, em.engineFileSizes(), 1) + + require.NoError(t, em.closeEngine(ctx, &backend.EngineConfig{}, engine1ID)) + require.Equal(t, 0, int(em.getImportedKVCount(engine1ID))) + // close non-existent engine + require.ErrorContains(t, em.closeEngine(ctx, &backend.EngineConfig{}, uuid.New()), "no such file or directory") + + // reset non-existent engine should work + require.NoError(t, em.resetEngine(ctx, uuid.New())) + storeHelper.EXPECT().GetTS(gomock.Any()).Return(int64(0), int64(0), nil) + require.NoError(t, em.resetEngine(ctx, engine1ID)) + require.Equal(t, 1, syncMapLen(&em.engines)) + _, ok = em.engines.Load(engine1ID) + require.True(t, ok) + require.True(t, ctrl.Satisfied()) + + require.NoError(t, em.cleanupEngine(ctx, uuid.New())) + require.NoError(t, em.cleanupEngine(ctx, engine1ID)) + require.Equal(t, 0, syncMapLen(&em.engines)) + + require.True(t, isEmptyDir(backendConfig.LocalStoreDir)) + em.close() +} + +func TestGetExternalEngineKVStatistics(t *testing.T) { + em := &engineManager{ + externalEngine: map[uuid.UUID]common.Engine{}, + } + // non existent uuid + size, count := em.getExternalEngineKVStatistics(uuid.New()) + require.Zero(t, size) + require.Zero(t, count) +} diff --git a/br/pkg/lightning/backend/local/engine_test.go b/br/pkg/lightning/backend/local/engine_test.go index ec676d13b5616..fc69775460fbb 100644 --- a/br/pkg/lightning/backend/local/engine_test.go +++ b/br/pkg/lightning/backend/local/engine_test.go @@ -133,6 +133,9 @@ func TestIngestSSTWithClosedEngine(t *testing.T) { func TestGetFirstAndLastKey(t *testing.T) { db, tmpPath := makePebbleDB(t, nil) + t.Cleanup(func() { + require.NoError(t, db.Close()) + }) f := &Engine{ sstDir: tmpPath, } @@ -172,6 +175,9 @@ func TestGetFirstAndLastKey(t *testing.T) { func TestIterOutputHasUniqueMemorySpace(t *testing.T) { db, tmpPath := makePebbleDB(t, nil) + t.Cleanup(func() { + require.NoError(t, db.Close()) + }) f := &Engine{ sstDir: tmpPath, } diff --git a/br/pkg/lightning/backend/local/local.go b/br/pkg/lightning/backend/local/local.go index c526188bf55fd..eb2017f898ec2 100644 --- a/br/pkg/lightning/backend/local/local.go +++ b/br/pkg/lightning/backend/local/local.go @@ -22,13 +22,11 @@ import ( "io" "math" "net" - "os" "path/filepath" "strings" "sync" "time" - "github.com/cockroachdb/pebble" "github.com/coreos/go-semver/semver" "github.com/docker/go-units" "github.com/google/uuid" @@ -44,28 +42,25 @@ import ( "github.com/pingcap/tidb/br/pkg/lightning/config" "github.com/pingcap/tidb/br/pkg/lightning/errormanager" "github.com/pingcap/tidb/br/pkg/lightning/log" - "github.com/pingcap/tidb/br/pkg/lightning/manual" "github.com/pingcap/tidb/br/pkg/lightning/metric" "github.com/pingcap/tidb/br/pkg/lightning/tikv" "github.com/pingcap/tidb/br/pkg/logutil" "github.com/pingcap/tidb/br/pkg/membuf" "github.com/pingcap/tidb/br/pkg/pdutil" "github.com/pingcap/tidb/br/pkg/restore/split" - "github.com/pingcap/tidb/br/pkg/storage" "github.com/pingcap/tidb/br/pkg/version" "github.com/pingcap/tidb/pkg/infoschema" "github.com/pingcap/tidb/pkg/metrics" "github.com/pingcap/tidb/pkg/parser/model" - "github.com/pingcap/tidb/pkg/store/pdtypes" "github.com/pingcap/tidb/pkg/tablecodec" + "github.com/pingcap/tidb/pkg/util" "github.com/pingcap/tidb/pkg/util/codec" "github.com/pingcap/tidb/pkg/util/engine" - "github.com/tikv/client-go/v2/oracle" tikvclient "github.com/tikv/client-go/v2/tikv" pd "github.com/tikv/pd/client" - "go.uber.org/atomic" + pdhttp "github.com/tikv/pd/client/http" + "github.com/tikv/pd/client/retry" "go.uber.org/zap" - "golang.org/x/sync/errgroup" "google.golang.org/grpc" "google.golang.org/grpc/backoff" "google.golang.org/grpc/codes" @@ -261,17 +256,17 @@ func (*encodingBuilder) MakeEmptyRows() encode.Rows { } type targetInfoGetter struct { - tls *common.TLS - targetDB *sql.DB - pdCli pd.Client + tls *common.TLS + targetDB *sql.DB + pdHTTPCli pdhttp.Client } // NewTargetInfoGetter creates an TargetInfoGetter with local backend implementation. -func NewTargetInfoGetter(tls *common.TLS, db *sql.DB, pdCli pd.Client) backend.TargetInfoGetter { +func NewTargetInfoGetter(tls *common.TLS, db *sql.DB, pdHTTPCli pdhttp.Client) backend.TargetInfoGetter { return &targetInfoGetter{ - tls: tls, - targetDB: db, - pdCli: pdCli, + tls: tls, + targetDB: db, + pdHTTPCli: pdHTTPCli, } } @@ -292,10 +287,10 @@ func (g *targetInfoGetter) CheckRequirements(ctx context.Context, checkCtx *back if err := checkTiDBVersion(ctx, versionStr, localMinTiDBVersion, localMaxTiDBVersion); err != nil { return err } - if err := tikv.CheckPDVersion(ctx, g.tls, g.pdCli.GetLeaderAddr(), localMinPDVersion, localMaxPDVersion); err != nil { + if err := tikv.CheckPDVersion(ctx, g.pdHTTPCli, localMinPDVersion, localMaxPDVersion); err != nil { return err } - if err := tikv.CheckTiKVVersion(ctx, g.tls, g.pdCli.GetLeaderAddr(), localMinTiKVVersion, localMaxTiKVVersion); err != nil { + if err := tikv.CheckTiKVVersion(ctx, g.pdHTTPCli, localMinTiKVVersion, localMaxTiKVVersion); err != nil { return err } @@ -425,6 +420,7 @@ type BackendConfig struct { // see DisableAutomaticCompactions of pebble.Options for more details. // default true. DisableAutomaticCompactions bool + BlockSize int } // NewBackendConfig creates a new BackendConfig. @@ -435,6 +431,7 @@ func NewBackendConfig(cfg *config.Config, maxOpenFiles int, keyspaceName, resour MaxConnPerStore: cfg.TikvImporter.RangeConcurrency, ConnCompressType: cfg.TikvImporter.CompressKVPairs, WorkerConcurrency: cfg.TikvImporter.RangeConcurrency * 2, + BlockSize: int(cfg.TikvImporter.BlockSize), KVWriteBatchSize: int64(cfg.TikvImporter.SendKVSize), RegionSplitBatchSize: cfg.TikvImporter.RegionSplitBatchSize, RegionSplitConcurrency: cfg.TikvImporter.RegionSplitConcurrency, @@ -462,10 +459,8 @@ func (c *BackendConfig) adjust() { // Backend is a local backend. type Backend struct { - engines sync.Map // sync version of map[uuid.UUID]*Engine - externalEngine map[uuid.UUID]common.Engine - - pdCtl *pdutil.PdController + pdCli pd.Client + pdHTTPCli pdhttp.Client splitCli split.SplitClient tikvCli *tikvclient.KVStore tls *common.TLS @@ -473,13 +468,11 @@ type Backend struct { tikvCodec tikvclient.Codec BackendConfig + engineMgr *engineManager supportMultiIngest bool - duplicateDB *pebble.DB - keyAdapter common.KeyAdapter importClientFactory ImportClientFactory - bufferPool *membuf.Pool metrics *metric.Common writeLimiter StoreWriteLimiter logger log.Logger @@ -488,24 +481,18 @@ type Backend struct { } var _ DiskUsage = (*Backend)(nil) +var _ StoreHelper = (*Backend)(nil) var _ backend.Backend = (*Backend)(nil) -func openDuplicateDB(storeDir string) (*pebble.DB, error) { - dbPath := filepath.Join(storeDir, duplicateDBName) - // TODO: Optimize the opts for better write. - opts := &pebble.Options{ - TablePropertyCollectors: []func() pebble.TablePropertyCollector{ - newRangePropertiesCollector, - }, - } - return pebble.Open(dbPath, opts) -} +const ( + pdCliMaxMsgSize = int(128 * units.MiB) // pd.ScanRegion may return a large response +) var ( - // RunInTest indicates whether the current process is running in test. - RunInTest bool - // LastAlloc is the last ID allocator. - LastAlloc manual.Allocator + maxCallMsgSize = []grpc.DialOption{ + grpc.WithDefaultCallOptions(grpc.MaxCallRecvMsgSize(pdCliMaxMsgSize)), + grpc.WithDefaultCallOptions(grpc.MaxCallSendMsgSize(pdCliMaxMsgSize)), + } ) // NewBackend creates new connections to tikv. @@ -515,43 +502,19 @@ func NewBackend( config BackendConfig, regionSizeGetter TableRegionSizeGetter, ) (b *Backend, err error) { - var duplicateDB *pebble.DB - defer func() { - if err != nil && duplicateDB != nil { - _ = duplicateDB.Close() - } - }() config.adjust() - pdCtl, err := pdutil.NewPdController(ctx, config.PDAddr, tls.TLSConfig(), tls.ToPDSecurityOption()) + pdAddrs := strings.Split(config.PDAddr, ",") + pdCli, err := pd.NewClientWithContext( + ctx, pdAddrs, tls.ToPDSecurityOption(), + pd.WithGRPCDialOptions(maxCallMsgSize...), + // If the time too short, we may scatter a region many times, because + // the interface `ScatterRegions` may time out. + pd.WithCustomTimeoutOption(60*time.Second), + pd.WithMaxErrorRetry(3), + ) if err != nil { return nil, common.NormalizeOrWrapErr(common.ErrCreatePDClient, err) } - splitCli := split.NewSplitClient(pdCtl.GetPDClient(), tls.TLSConfig(), false) - - shouldCreate := true - if config.CheckpointEnabled { - if info, err := os.Stat(config.LocalStoreDir); err != nil { - if !os.IsNotExist(err) { - return nil, err - } - } else if info.IsDir() { - shouldCreate = false - } - } - - if shouldCreate { - err = os.Mkdir(config.LocalStoreDir, 0o700) - if err != nil { - return nil, common.ErrInvalidSortedKVDir.Wrap(err).GenWithStackByArgs(config.LocalStoreDir) - } - } - - if config.DupeDetectEnabled { - duplicateDB, err = openDuplicateDB(config.LocalStoreDir) - if err != nil { - return nil, common.ErrOpenDuplicateDB.Wrap(err).GenWithStackByArgs() - } - } // The following copies tikv.NewTxnClient without creating yet another pdClient. spkv, err := tikvclient.NewEtcdSafePointKV(strings.Split(config.PDAddr, ","), tls.TLSConfig()) @@ -561,9 +524,9 @@ func NewBackend( var pdCliForTiKV *tikvclient.CodecPDClient if config.KeyspaceName == "" { - pdCliForTiKV = tikvclient.NewCodecPDClient(tikvclient.ModeTxn, pdCtl.GetPDClient()) + pdCliForTiKV = tikvclient.NewCodecPDClient(tikvclient.ModeTxn, pdCli) } else { - pdCliForTiKV, err = tikvclient.NewCodecPDClientWithKeyspace(tikvclient.ModeTxn, pdCtl.GetPDClient(), config.KeyspaceName) + pdCliForTiKV, err = tikvclient.NewCodecPDClientWithKeyspace(tikvclient.ModeTxn, pdCli, config.KeyspaceName) if err != nil { return nil, common.ErrCreatePDClient.Wrap(err).GenWithStackByArgs() } @@ -575,26 +538,19 @@ func NewBackend( if err != nil { return nil, common.ErrCreateKVClient.Wrap(err).GenWithStackByArgs() } + pdHTTPCli := pdhttp.NewClient("lightning", pdAddrs, pdhttp.WithTLSConfig(tls.TLSConfig())). + WithBackoffer(retry.InitialBackoffer(time.Second, time.Second, pdutil.PDRequestRetryTime*time.Second)) + splitCli := split.NewSplitClient(pdCli, pdHTTPCli, tls.TLSConfig(), false) importClientFactory := newImportClientFactoryImpl(splitCli, tls, config.MaxConnPerStore, config.ConnCompressType) - keyAdapter := common.KeyAdapter(common.NoopKeyAdapter{}) - if config.DupeDetectEnabled { - keyAdapter = common.DupDetectKeyAdapter{} - } var writeLimiter StoreWriteLimiter if config.StoreWriteBWLimit > 0 { writeLimiter = newStoreWriteLimiter(config.StoreWriteBWLimit) } else { writeLimiter = noopStoreWriteLimiter{} } - alloc := manual.Allocator{} - if RunInTest { - alloc.RefCnt = new(atomic.Int64) - LastAlloc = alloc - } local := &Backend{ - engines: sync.Map{}, - externalEngine: map[uuid.UUID]common.Engine{}, - pdCtl: pdCtl, + pdCli: pdCli, + pdHTTPCli: pdHTTPCli, splitCli: splitCli, tikvCli: tikvCli, tls: tls, @@ -603,13 +559,15 @@ func NewBackend( BackendConfig: config, - duplicateDB: duplicateDB, - keyAdapter: keyAdapter, importClientFactory: importClientFactory, - bufferPool: membuf.NewPool(membuf.WithAllocator(alloc)), writeLimiter: writeLimiter, logger: log.FromContext(ctx), } + engineMgr, err := newEngineManager(config, local, local.logger) + if err != nil { + return nil, err + } + local.engineMgr = engineMgr if m, ok := metric.GetCommonMetric(ctx); ok { local.metrics = m } @@ -620,21 +578,34 @@ func NewBackend( return local, nil } +// NewBackendForTest creates a new Backend for test. +func NewBackendForTest(ctx context.Context, config BackendConfig, storeHelper StoreHelper) (*Backend, error) { + config.adjust() + + logger := log.FromContext(ctx) + engineMgr, err := newEngineManager(config, storeHelper, logger) + if err != nil { + return nil, err + } + local := &Backend{ + BackendConfig: config, + logger: logger, + engineMgr: engineMgr, + } + if m, ok := metric.GetCommonMetric(ctx); ok { + local.metrics = m + } + + return local, nil +} + // TotalMemoryConsume returns the total memory usage of the local backend. func (local *Backend) TotalMemoryConsume() int64 { - var memConsume int64 - local.engines.Range(func(k, v interface{}) bool { - e := v.(*Engine) - if e != nil { - memConsume += e.TotalMemorySize() - } - return true - }) - return memConsume + local.bufferPool.TotalSize() + return local.engineMgr.totalMemoryConsume() } func (local *Backend) checkMultiIngestSupport(ctx context.Context) error { - stores, err := local.pdCtl.GetPDClient().GetAllStores(ctx, pd.WithExcludeTombstone()) + stores, err := local.pdCli.GetAllStores(ctx, pd.WithExcludeTombstone()) if err != nil { return errors.Trace(err) } @@ -698,144 +669,24 @@ func (local *Backend) checkMultiIngestSupport(ctx context.Context) error { return nil } -// rlock read locks a local file and returns the Engine instance if it exists. -func (local *Backend) rLockEngine(engineID uuid.UUID) *Engine { - if e, ok := local.engines.Load(engineID); ok { - engine := e.(*Engine) - engine.rLock() - return engine - } - return nil -} - -// lock locks a local file and returns the Engine instance if it exists. -func (local *Backend) lockEngine(engineID uuid.UUID, state importMutexState) *Engine { - if e, ok := local.engines.Load(engineID); ok { - engine := e.(*Engine) - engine.lock(state) - return engine - } - return nil -} - -// tryRLockAllEngines tries to read lock all engines, return all `Engine`s that are successfully locked. -func (local *Backend) tryRLockAllEngines() []*Engine { - var allEngines []*Engine - local.engines.Range(func(k, v interface{}) bool { - engine := v.(*Engine) - // skip closed engine - if engine.tryRLock() { - if !engine.closed.Load() { - allEngines = append(allEngines, engine) - } else { - engine.rUnlock() - } - } - return true - }) - return allEngines -} - -// lockAllEnginesUnless tries to lock all engines, unless those which are already locked in the -// state given by ignoreStateMask. Returns the list of locked engines. -func (local *Backend) lockAllEnginesUnless(newState, ignoreStateMask importMutexState) []*Engine { - var allEngines []*Engine - local.engines.Range(func(k, v interface{}) bool { - engine := v.(*Engine) - if engine.lockUnless(newState, ignoreStateMask) { - allEngines = append(allEngines, engine) - } - return true - }) - return allEngines -} - // Close the local backend. func (local *Backend) Close() { - for _, e := range local.externalEngine { - _ = e.Close() - } - local.externalEngine = map[uuid.UUID]common.Engine{} - allLocalEngines := local.lockAllEnginesUnless(importMutexStateClose, 0) - for _, e := range allLocalEngines { - _ = e.Close() - e.unlock() - } - local.engines = sync.Map{} + local.engineMgr.close() local.importClientFactory.Close() - local.bufferPool.Destroy() - - if local.duplicateDB != nil { - // Check if there are duplicates that are not collected. - iter := local.duplicateDB.NewIter(&pebble.IterOptions{}) - hasDuplicates := iter.First() - allIsWell := true - if err := iter.Error(); err != nil { - local.logger.Warn("iterate duplicate db failed", zap.Error(err)) - allIsWell = false - } - if err := iter.Close(); err != nil { - local.logger.Warn("close duplicate db iter failed", zap.Error(err)) - allIsWell = false - } - if err := local.duplicateDB.Close(); err != nil { - local.logger.Warn("close duplicate db failed", zap.Error(err)) - allIsWell = false - } - // If checkpoint is disabled, or we don't detect any duplicate, then this duplicate - // db dir will be useless, so we clean up this dir. - if allIsWell && (!local.CheckpointEnabled || !hasDuplicates) { - if err := os.RemoveAll(filepath.Join(local.LocalStoreDir, duplicateDBName)); err != nil { - local.logger.Warn("remove duplicate db file failed", zap.Error(err)) - } - } - local.duplicateDB = nil - } - // if checkpoint is disable or we finish load all data successfully, then files in this - // dir will be useless, so we clean up this dir and all files in it. - if !local.CheckpointEnabled || common.IsEmptyDir(local.LocalStoreDir) { - err := os.RemoveAll(local.LocalStoreDir) - if err != nil { - local.logger.Warn("remove local db file failed", zap.Error(err)) - } - } _ = local.tikvCli.Close() - local.pdCtl.Close() + local.pdHTTPCli.Close() + local.pdCli.Close() } // FlushEngine ensure the written data is saved successfully, to make sure no data lose after restart func (local *Backend) FlushEngine(ctx context.Context, engineID uuid.UUID) error { - engine := local.rLockEngine(engineID) - - // the engine cannot be deleted after while we've acquired the lock identified by UUID. - if engine == nil { - return errors.Errorf("engine '%s' not found", engineID) - } - defer engine.rUnlock() - if engine.closed.Load() { - return nil - } - return engine.flushEngineWithoutLock(ctx) + return local.engineMgr.flushEngine(ctx, engineID) } // FlushAllEngines flush all engines. func (local *Backend) FlushAllEngines(parentCtx context.Context) (err error) { - allEngines := local.tryRLockAllEngines() - defer func() { - for _, engine := range allEngines { - engine.rUnlock() - } - }() - - eg, ctx := errgroup.WithContext(parentCtx) - for _, engine := range allEngines { - e := engine - eg.Go(func() error { - return e.flushEngineWithoutLock(ctx) - }) - } - return eg.Wait() + return local.engineMgr.flushAllEngines(parentCtx) } // RetryImportDelay returns the delay time before retrying to import a file. @@ -848,186 +699,14 @@ func (*Backend) ShouldPostProcess() bool { return true } -func (local *Backend) openEngineDB(engineUUID uuid.UUID, readOnly bool) (*pebble.DB, error) { - opt := &pebble.Options{ - MemTableSize: local.MemTableSize, - // the default threshold value may cause write stall. - MemTableStopWritesThreshold: 8, - MaxConcurrentCompactions: 16, - // set threshold to half of the max open files to avoid trigger compaction - L0CompactionThreshold: math.MaxInt32, - L0StopWritesThreshold: math.MaxInt32, - LBaseMaxBytes: 16 * units.TiB, - MaxOpenFiles: local.MaxOpenFiles, - DisableWAL: true, - ReadOnly: readOnly, - TablePropertyCollectors: []func() pebble.TablePropertyCollector{ - newRangePropertiesCollector, - }, - DisableAutomaticCompactions: local.DisableAutomaticCompactions, - } - // set level target file size to avoid pebble auto triggering compaction that split ingest SST files into small SST. - opt.Levels = []pebble.LevelOptions{ - { - TargetFileSize: 16 * units.GiB, - }, - } - - dbPath := filepath.Join(local.LocalStoreDir, engineUUID.String()) - db, err := pebble.Open(dbPath, opt) - return db, errors.Trace(err) -} - // OpenEngine must be called with holding mutex of Engine. func (local *Backend) OpenEngine(ctx context.Context, cfg *backend.EngineConfig, engineUUID uuid.UUID) error { - db, err := local.openEngineDB(engineUUID, false) - if err != nil { - return err - } - - sstDir := engineSSTDir(local.LocalStoreDir, engineUUID) - if !cfg.KeepSortDir { - if err := os.RemoveAll(sstDir); err != nil { - return errors.Trace(err) - } - } - if !common.IsDirExists(sstDir) { - if err := os.Mkdir(sstDir, 0o750); err != nil { - return errors.Trace(err) - } - } - engineCtx, cancel := context.WithCancel(ctx) - - e, _ := local.engines.LoadOrStore(engineUUID, &Engine{ - UUID: engineUUID, - sstDir: sstDir, - sstMetasChan: make(chan metaOrFlush, 64), - ctx: engineCtx, - cancel: cancel, - config: cfg.Local, - tableInfo: cfg.TableInfo, - duplicateDetection: local.DupeDetectEnabled, - dupDetectOpt: local.DuplicateDetectOpt, - duplicateDB: local.duplicateDB, - keyAdapter: local.keyAdapter, - logger: log.FromContext(ctx), - }) - engine := e.(*Engine) - engine.lock(importMutexStateOpen) - defer engine.unlock() - engine.db.Store(db) - engine.sstIngester = dbSSTIngester{e: engine} - if err = engine.loadEngineMeta(); err != nil { - return errors.Trace(err) - } - if err = local.allocateTSIfNotExists(ctx, engine); err != nil { - return errors.Trace(err) - } - engine.wg.Add(1) - go engine.ingestSSTLoop() - return nil -} - -func (local *Backend) allocateTSIfNotExists(ctx context.Context, engine *Engine) error { - if engine.TS > 0 { - return nil - } - physical, logical, err := local.pdCtl.GetPDClient().GetTS(ctx) - if err != nil { - return err - } - ts := oracle.ComposeTS(physical, logical) - engine.TS = ts - return engine.saveEngineMeta() + return local.engineMgr.openEngine(ctx, cfg, engineUUID) } // CloseEngine closes backend engine by uuid. func (local *Backend) CloseEngine(ctx context.Context, cfg *backend.EngineConfig, engineUUID uuid.UUID) error { - if externalCfg := cfg.External; externalCfg != nil { - storeBackend, err := storage.ParseBackend(externalCfg.StorageURI, nil) - if err != nil { - return err - } - store, err := storage.NewWithDefaultOpt(ctx, storeBackend) - if err != nil { - return err - } - physical, logical, err := local.pdCtl.GetPDClient().GetTS(ctx) - if err != nil { - return err - } - ts := oracle.ComposeTS(physical, logical) - externalEngine := external.NewExternalEngine( - store, - externalCfg.DataFiles, - externalCfg.StatFiles, - externalCfg.StartKey, - externalCfg.EndKey, - externalCfg.SplitKeys, - externalCfg.RegionSplitSize, - local.keyAdapter, - local.DupeDetectEnabled, - local.duplicateDB, - local.DuplicateDetectOpt, - local.WorkerConcurrency, - ts, - externalCfg.TotalFileSize, - externalCfg.TotalKVCount, - externalCfg.CheckHotspot, - ) - local.externalEngine[engineUUID] = externalEngine - return nil - } - - // flush mem table to storage, to free memory, - // ask others' advise, looks like unnecessary, but with this we can control memory precisely. - engineI, ok := local.engines.Load(engineUUID) - if !ok { - // recovery mode, we should reopen this engine file - db, err := local.openEngineDB(engineUUID, true) - if err != nil { - return err - } - engine := &Engine{ - UUID: engineUUID, - sstMetasChan: make(chan metaOrFlush), - tableInfo: cfg.TableInfo, - keyAdapter: local.keyAdapter, - duplicateDetection: local.DupeDetectEnabled, - dupDetectOpt: local.DuplicateDetectOpt, - duplicateDB: local.duplicateDB, - logger: log.FromContext(ctx), - } - engine.db.Store(db) - engine.sstIngester = dbSSTIngester{e: engine} - if err = engine.loadEngineMeta(); err != nil { - return err - } - local.engines.Store(engineUUID, engine) - return nil - } - - engine := engineI.(*Engine) - engine.rLock() - if engine.closed.Load() { - engine.rUnlock() - return nil - } - - err := engine.flushEngineWithoutLock(ctx) - engine.rUnlock() - - // use mutex to make sure we won't close sstMetasChan while other routines - // trying to do flush. - engine.lock(importMutexStateClose) - engine.closed.Store(true) - close(engine.sstMetasChan) - engine.unlock() - if err != nil { - return errors.Trace(err) - } - engine.wg.Wait() - return engine.ingestErr.Get() + return local.engineMgr.closeEngine(ctx, cfg, engineUUID) } func (local *Backend) getImportClient(ctx context.Context, storeID uint64) (sst.ImportSSTClient, error) { @@ -1128,6 +807,8 @@ func (local *Backend) prepareAndSendJob( needSplit = true }) logger := log.FromContext(ctx).With(zap.String("uuid", engine.ID())).Begin(zap.InfoLevel, "split and scatter ranges") + backOffTime := 10 * time.Second + maxbackoffTime := 120 * time.Second for i := 0; i < maxRetryTimes; i++ { failpoint.Inject("skipSplitAndScatter", func() { failpoint.Break() @@ -1140,6 +821,15 @@ func (local *Backend) prepareAndSendJob( log.FromContext(ctx).Warn("split and scatter failed in retry", zap.String("engine ID", engine.ID()), log.ShortError(err), zap.Int("retry", i)) + select { + case <-time.After(backOffTime): + case <-ctx.Done(): + return ctx.Err() + } + backOffTime *= 2 + if backOffTime > maxbackoffTime { + backOffTime = maxbackoffTime + } } logger.End(zap.ErrorLevel, err) if err != nil { @@ -1186,10 +876,16 @@ func (local *Backend) generateAndSendJob( logger.Debug("the ranges length write to tikv", zap.Int("length", len(jobRanges))) - eg, egCtx := errgroup.WithContext(ctx) + eg, egCtx := util.NewErrorGroupWithRecoverWithCtx(ctx) dataAndRangeCh := make(chan common.DataAndRange) - for i := 0; i < local.WorkerConcurrency; i++ { + conn := local.WorkerConcurrency + if _, ok := engine.(*external.Engine); ok { + // currently external engine will generate a large IngestData, se we lower the + // concurrency to pass backpressure to the LoadIngestData goroutine to avoid OOM + conn = 1 + } + for i := 0; i < conn; i++ { eg.Go(func() error { for { select { @@ -1393,6 +1089,37 @@ func (*Backend) isRetryableImportTiKVError(err error) bool { return common.IsRetryableError(err) } +func checkDiskAvail(ctx context.Context, store *pdhttp.StoreInfo) error { + logger := log.FromContext(ctx) + capacity, err := units.RAMInBytes(store.Status.Capacity) + if err != nil { + logger.Warn("failed to parse capacity", + zap.String("capacity", store.Status.Capacity), zap.Error(err)) + return nil + } + if capacity <= 0 { + // PD will return a zero value StoreInfo if heartbeat is not received after + // startup, skip temporarily. + return nil + } + available, err := units.RAMInBytes(store.Status.Available) + if err != nil { + logger.Warn("failed to parse available", + zap.String("available", store.Status.Available), zap.Error(err)) + return nil + } + ratio := available * 100 / capacity + if ratio < 10 { + storeType := "TiKV" + if engine.IsTiFlashHTTPResp(&store.Store) { + storeType = "TiFlash" + } + return errors.Errorf("the remaining storage capacity of %s(%s) is less than 10%%; please increase the storage capacity of %s and try again", + storeType, store.Store.Address, storeType) + } + return nil +} + // executeJob handles a regionJob and tries to convert it to ingested stage. // If non-retryable error occurs, it will return the error. // If retryable error occurs, it will return nil and caller should check the stage @@ -1407,26 +1134,14 @@ func (local *Backend) executeJob( }) if local.ShouldCheckTiKV { for _, peer := range job.region.Region.GetPeers() { - var ( - store *pdtypes.StoreInfo - err error - ) - for i := 0; i < maxRetryTimes; i++ { - store, err = local.pdCtl.GetStoreInfo(ctx, peer.StoreId) - if err != nil { - continue - } - if store.Status.Capacity > 0 { - // The available disk percent of TiKV - ratio := store.Status.Available * 100 / store.Status.Capacity - if ratio < 10 { - return errors.Errorf("the remaining storage capacity of TiKV(%s) is less than 10%%; please increase the storage capacity of TiKV and try again", store.Store.Address) - } - } - break - } + store, err := local.pdHTTPCli.GetStore(ctx, peer.StoreId) if err != nil { log.FromContext(ctx).Error("failed to get StoreInfo from pd http api", zap.Error(err)) + continue + } + err = checkDiskAvail(ctx, store) + if err != nil { + return err } } } @@ -1477,10 +1192,10 @@ func (local *Backend) ImportEngine( regionSplitSize, regionSplitKeys int64, ) error { var e common.Engine - if externalEngine, ok := local.externalEngine[engineUUID]; ok { + if externalEngine, ok := local.engineMgr.getExternalEngine(engineUUID); ok { e = externalEngine } else { - localEngine := local.lockEngine(engineUUID, importMutexStateImport) + localEngine := local.engineMgr.lockEngine(engineUUID, importMutexStateImport) if localEngine == nil { // skip if engine not exist. See the comment of `CloseEngine` for more detail. return nil @@ -1495,7 +1210,7 @@ func (local *Backend) ImportEngine( log.FromContext(ctx).Info("engine contains no kv, skip import", zap.Stringer("engine", engineUUID)) return nil } - kvRegionSplitSize, kvRegionSplitKeys, err := GetRegionSplitSizeKeys(ctx, local.pdCtl.GetPDClient(), local.tls) + kvRegionSplitSize, kvRegionSplitKeys, err := GetRegionSplitSizeKeys(ctx, local.pdCli, local.tls) if err == nil { if kvRegionSplitSize > regionSplitSize { regionSplitSize = kvRegionSplitSize @@ -1525,7 +1240,7 @@ func (local *Backend) ImportEngine( if len(regionRanges[len(regionRanges)-1].End) > 0 { endKey = codec.EncodeBytes(nil, regionRanges[len(regionRanges)-1].End) } - done, err := local.pdCtl.PauseSchedulersByKeyRange(subCtx, startKey, endKey) + done, err := pdutil.PauseSchedulersByKeyRange(subCtx, local.pdHTTPCli, startKey, endKey) if err != nil { return errors.Trace(err) } @@ -1573,11 +1288,6 @@ func (local *Backend) ImportEngine( return err } -// GetRegionSplitSizeKeys gets the region split size and keys from PD. -func (local *Backend) GetRegionSplitSizeKeys(ctx context.Context) (finalSize int64, finalKeys int64, err error) { - return GetRegionSplitSizeKeys(ctx, local.pdCtl.GetPDClient(), local.tls) -} - // expose these variables to unit test. var ( testJobToWorkerCh = make(chan *regionJob) @@ -1598,7 +1308,7 @@ func (local *Backend) doImport(ctx context.Context, engine common.Engine, region ctx2, workerCancel = context.WithCancel(ctx) // workerCtx.Done() means workflow is canceled by error. It may be caused // by calling workerCancel() or workers in workGroup meets error. - workGroup, workerCtx = errgroup.WithContext(ctx2) + workGroup, workerCtx = util.NewErrorGroupWithRecoverWithCtx(ctx2) firstErr common.OnceError // jobToWorkerCh and jobFromWorkerCh are unbuffered so jobs will not be // owned by them. @@ -1709,101 +1419,23 @@ func (local *Backend) doImport(ctx context.Context, engine common.Engine, region // GetImportedKVCount returns the number of imported KV pairs of some engine. func (local *Backend) GetImportedKVCount(engineUUID uuid.UUID) int64 { - v, ok := local.engines.Load(engineUUID) - if !ok { - // we get it after import, but before clean up, so this should not happen - // todo: return error - return 0 - } - e := v.(*Engine) - return e.importedKVCount.Load() + return local.engineMgr.getImportedKVCount(engineUUID) } // GetExternalEngineKVStatistics returns kv statistics of some engine. func (local *Backend) GetExternalEngineKVStatistics(engineUUID uuid.UUID) ( totalKVSize int64, totalKVCount int64) { - v, ok := local.externalEngine[engineUUID] - if !ok { - return 0, 0 - } - return v.ImportedStatistics() + return local.engineMgr.getExternalEngineKVStatistics(engineUUID) } // ResetEngine reset the engine and reclaim the space. func (local *Backend) ResetEngine(ctx context.Context, engineUUID uuid.UUID) error { - // the only way to reset the engine + reclaim the space is to delete and reopen it 🤷 - localEngine := local.lockEngine(engineUUID, importMutexStateClose) - if localEngine == nil { - if engineI, ok := local.externalEngine[engineUUID]; ok { - extEngine := engineI.(*external.Engine) - return extEngine.Reset() - } - - log.FromContext(ctx).Warn("could not find engine in cleanupEngine", zap.Stringer("uuid", engineUUID)) - return nil - } - defer localEngine.unlock() - if err := localEngine.Close(); err != nil { - return err - } - if err := localEngine.Cleanup(local.LocalStoreDir); err != nil { - return err - } - db, err := local.openEngineDB(engineUUID, false) - if err == nil { - localEngine.db.Store(db) - localEngine.engineMeta = engineMeta{} - if !common.IsDirExists(localEngine.sstDir) { - if err := os.Mkdir(localEngine.sstDir, 0o750); err != nil { - return errors.Trace(err) - } - } - if err = local.allocateTSIfNotExists(ctx, localEngine); err != nil { - return errors.Trace(err) - } - failpoint.Inject("mockAllocateTSErr", func() { - // mock generate timestamp error when reset engine. - localEngine.TS = 0 - mockGRPCErr, _ := status.FromError(errors.Errorf("mock generate timestamp error")) - failpoint.Return(errors.Trace(mockGRPCErr.Err())) - }) - } - localEngine.pendingFileSize.Store(0) - - return err + return local.engineMgr.resetEngine(ctx, engineUUID) } // CleanupEngine cleanup the engine and reclaim the space. func (local *Backend) CleanupEngine(ctx context.Context, engineUUID uuid.UUID) error { - localEngine := local.lockEngine(engineUUID, importMutexStateClose) - // release this engine after import success - if localEngine == nil { - if extEngine, ok := local.externalEngine[engineUUID]; ok { - retErr := extEngine.Close() - delete(local.externalEngine, engineUUID) - return retErr - } - log.FromContext(ctx).Warn("could not find engine in cleanupEngine", zap.Stringer("uuid", engineUUID)) - return nil - } - defer localEngine.unlock() - - // since closing the engine causes all subsequent operations on it panic, - // we make sure to delete it from the engine map before calling Close(). - // (note that Close() returning error does _not_ mean the pebble DB - // remains open/usable.) - local.engines.Delete(engineUUID) - err := localEngine.Close() - if err != nil { - return err - } - err = localEngine.Cleanup(local.LocalStoreDir) - if err != nil { - return err - } - localEngine.TotalSize.Store(0) - localEngine.Length.Store(0) - return nil + return local.engineMgr.cleanupEngine(ctx, engineUUID) } // GetDupeController returns a new dupe controller. @@ -1814,8 +1446,8 @@ func (local *Backend) GetDupeController(dupeConcurrency int, errorMgr *errormana tikvCodec: local.tikvCodec, errorMgr: errorMgr, dupeConcurrency: dupeConcurrency, - duplicateDB: local.duplicateDB, - keyAdapter: local.keyAdapter, + duplicateDB: local.engineMgr.getDuplicateDB(), + keyAdapter: local.engineMgr.getKeyAdapter(), importClientFactory: local.importClientFactory, resourceGroupName: local.ResourceGroupName, taskType: local.TaskType, @@ -1837,7 +1469,7 @@ func (local *Backend) UnsafeImportAndReset(ctx context.Context, engineUUID uuid. if err := closedEngine.Import(ctx, regionSplitSize, regionSplitKeys); err != nil { return err } - return local.ResetEngine(ctx, engineUUID) + return local.engineMgr.resetEngine(ctx, engineUUID) } func engineSSTDir(storeDir string, engineUUID uuid.UUID) string { @@ -1845,20 +1477,15 @@ func engineSSTDir(storeDir string, engineUUID uuid.UUID) string { } // LocalWriter returns a new local writer. -func (local *Backend) LocalWriter(_ context.Context, cfg *backend.LocalWriterConfig, engineUUID uuid.UUID) (backend.EngineWriter, error) { - e, ok := local.engines.Load(engineUUID) - if !ok { - return nil, errors.Errorf("could not find engine for %s", engineUUID.String()) - } - engine := e.(*Engine) - return openLocalWriter(cfg, engine, local.tikvCodec, local.LocalWriterMemCacheSize, local.bufferPool.NewBuffer()) +func (local *Backend) LocalWriter(ctx context.Context, cfg *backend.LocalWriterConfig, engineUUID uuid.UUID) (backend.EngineWriter, error) { + return local.engineMgr.localWriter(ctx, cfg, engineUUID) } // SwitchModeByKeyRanges will switch tikv mode for regions in the specific key range for multirocksdb. // This function will spawn a goroutine to keep switch mode periodically until the context is done. // The return done channel is used to notify the caller that the background goroutine is exited. func (local *Backend) SwitchModeByKeyRanges(ctx context.Context, ranges []common.Range) (<-chan struct{}, error) { - switcher := NewTiKVModeSwitcher(local.tls, local.pdCtl.GetPDClient(), log.FromContext(ctx).Logger) + switcher := NewTiKVModeSwitcher(local.tls, local.pdHTTPCli, log.FromContext(ctx).Logger) done := make(chan struct{}) keyRanges := make([]*sst.Range, 0, len(ranges)) @@ -1946,17 +1573,23 @@ func nextKey(key []byte) []byte { // EngineFileSizes implements DiskUsage interface. func (local *Backend) EngineFileSizes() (res []backend.EngineFileSize) { - local.engines.Range(func(k, v interface{}) bool { - engine := v.(*Engine) - res = append(res, engine.getEngineFileSize()) - return true - }) - return + return local.engineMgr.engineFileSizes() +} + +// GetTS implements StoreHelper interface. +func (local *Backend) GetTS(ctx context.Context) (physical, logical int64, err error) { + return local.pdCli.GetTS(ctx) +} + +// GetTiKVCodec implements StoreHelper interface. +func (local *Backend) GetTiKVCodec() tikvclient.Codec { + return local.tikvCodec } -// GetPDClient returns the PD client. -func (local *Backend) GetPDClient() pd.Client { - return local.pdCtl.GetPDClient() +// CloseEngineMgr close the engine manager. +// This function is used for test. +func (local *Backend) CloseEngineMgr() { + local.engineMgr.close() } var getSplitConfFromStoreFunc = getSplitConfFromStore diff --git a/br/pkg/lightning/backend/local/local_check_test.go b/br/pkg/lightning/backend/local/local_check_test.go index 4a48935a1b519..72e2c1e794fd0 100644 --- a/br/pkg/lightning/backend/local/local_check_test.go +++ b/br/pkg/lightning/backend/local/local_check_test.go @@ -28,6 +28,9 @@ import ( func TestCheckRequirementsTiFlash(t *testing.T) { db, mock, err := sqlmock.New() + t.Cleanup(func() { + require.NoError(t, db.Close()) + }) require.NoError(t, err) ctx := context.Background() @@ -69,6 +72,7 @@ func TestCheckRequirementsTiFlash(t *testing.T) { AddRow("db", "tbl"). AddRow("test", "t1"). AddRow("test1", "tbl")) + mock.ExpectClose() err = local.CheckTiFlashVersionForTest(ctx, db, checkCtx, *semver.New("4.0.2")) require.Regexp(t, "^lightning local backend doesn't support TiFlash in this TiDB version. conflict tables: \\[`test`.`t1`, `test1`.`tbl`\\]", err.Error()) diff --git a/br/pkg/lightning/backend/local/local_test.go b/br/pkg/lightning/backend/local/local_test.go index 70796cc7d7a9f..45220e6cd74c3 100644 --- a/br/pkg/lightning/backend/local/local_test.go +++ b/br/pkg/lightning/backend/local/local_test.go @@ -22,6 +22,7 @@ import ( "io" "math" "math/rand" + "path" "path/filepath" "sort" "strings" @@ -46,7 +47,6 @@ import ( "github.com/pingcap/tidb/br/pkg/lightning/config" "github.com/pingcap/tidb/br/pkg/lightning/log" "github.com/pingcap/tidb/br/pkg/membuf" - "github.com/pingcap/tidb/br/pkg/pdutil" "github.com/pingcap/tidb/br/pkg/restore/split" "github.com/pingcap/tidb/br/pkg/storage" "github.com/pingcap/tidb/br/pkg/utils" @@ -60,6 +60,7 @@ import ( "github.com/pingcap/tidb/pkg/util/hack" "github.com/stretchr/testify/require" pd "github.com/tikv/pd/client" + "github.com/tikv/pd/client/http" "google.golang.org/grpc" "google.golang.org/grpc/codes" "google.golang.org/grpc/encoding" @@ -327,7 +328,9 @@ func testLocalWriter(t *testing.T, needSort bool, partitialSort bool) { ReadOnly: false, } db, tmpPath := makePebbleDB(t, opt) - defer db.Close() + t.Cleanup(func() { + require.NoError(t, db.Close()) + }) _, engineUUID := backend.MakeUUID("ww", 0) engineCtx, cancel := context.WithCancel(context.Background()) @@ -414,19 +417,19 @@ func testLocalWriter(t *testing.T, needSort bool, partitialSort bool) { require.Equal(t, k, it.Key()) it.Next() } + require.NoError(t, it.Close()) close(f.sstMetasChan) f.wg.Wait() } -func TestLocalWriterWithSort(t *testing.T) { +func TestEngineLocalWriter(t *testing.T) { + // test local writer with sort testLocalWriter(t, false, false) -} -func TestLocalWriterWithIngest(t *testing.T) { + // test local writer with ingest testLocalWriter(t, true, false) -} -func TestLocalWriterWithIngestUnsort(t *testing.T) { + // test local writer with ingest unsort testLocalWriter(t, true, true) } @@ -446,7 +449,7 @@ func (c *mockSplitClient) GetRegion(ctx context.Context, key []byte) (*split.Reg type testIngester struct{} -func (i testIngester) mergeSSTs(metas []*sstMeta, dir string) (*sstMeta, error) { +func (i testIngester) mergeSSTs(metas []*sstMeta, dir string, blockSize int) (*sstMeta, error) { if len(metas) == 0 { return nil, errors.New("sst metas is empty") } else if len(metas) == 1 { @@ -590,7 +593,7 @@ func testMergeSSTs(t *testing.T, kvs [][]common.KvPair, meta *sstMeta) { createSSTWriter := func() (*sstWriter, error) { path := filepath.Join(f.sstDir, uuid.New().String()+".sst") - writer, err := newSSTWriter(path) + writer, err := newSSTWriter(path, 16*1024) if err != nil { return nil, err } @@ -612,7 +615,7 @@ func testMergeSSTs(t *testing.T, kvs [][]common.KvPair, meta *sstMeta) { } i := dbSSTIngester{e: f} - newMeta, err := i.mergeSSTs(metas, tmpPath) + newMeta, err := i.mergeSSTs(metas, tmpPath, 16*1024) require.NoError(t, err) require.Equal(t, meta.totalCount, newMeta.totalCount) @@ -668,7 +671,7 @@ func (c *mockPdClient) GetAllStores(ctx context.Context, opts ...pd.GetStoreOpti return c.stores, nil } -func (c *mockPdClient) ScanRegions(ctx context.Context, key, endKey []byte, limit int) ([]*pd.Region, error) { +func (c *mockPdClient) ScanRegions(ctx context.Context, key, endKey []byte, limit int, opts ...pd.GetRegionOption) ([]*pd.Region, error) { return c.regions, nil } @@ -1058,11 +1061,9 @@ func TestMultiIngest(t *testing.T) { err: testCase.err, multiIngestCheckFn: testCase.multiIngestSupport, } - pdCtl := &pdutil.PdController{} - pdCtl.SetPDClient(&mockPdClient{stores: stores}) local := &Backend{ - pdCtl: pdCtl, + pdCli: &mockPdClient{stores: stores}, importClientFactory: &mockImportClientFactory{ stores: allStores, createClientFn: func(store *metapb.Store) sst.ImportSSTClient { @@ -1255,13 +1256,16 @@ func TestCheckPeersBusy(t *testing.T) { }, logger: log.L(), writeLimiter: noopStoreWriteLimiter{}, - bufferPool: membuf.NewPool(), supportMultiIngest: true, BackendConfig: BackendConfig{ ShouldCheckWriteStall: true, + LocalStoreDir: path.Join(t.TempDir(), "sorted-kv"), }, tikvCodec: keyspace.CodecV1, } + var err error + local.engineMgr, err = newEngineManager(local.BackendConfig, local, local.logger) + require.NoError(t, err) data := mockIngestData{{[]byte("a"), []byte("a")}, {[]byte("b"), []byte("b")}} @@ -1375,13 +1379,16 @@ func TestNotLeaderErrorNeedUpdatePeers(t *testing.T) { }, logger: log.L(), writeLimiter: noopStoreWriteLimiter{}, - bufferPool: membuf.NewPool(), supportMultiIngest: true, BackendConfig: BackendConfig{ ShouldCheckWriteStall: true, + LocalStoreDir: path.Join(t.TempDir(), "sorted-kv"), }, tikvCodec: keyspace.CodecV1, } + var err error + local.engineMgr, err = newEngineManager(local.BackendConfig, local, local.logger) + require.NoError(t, err) data := mockIngestData{{[]byte("a"), []byte("a")}} @@ -1471,10 +1478,15 @@ func TestPartialWriteIngestErrorWontPanic(t *testing.T) { }, logger: log.L(), writeLimiter: noopStoreWriteLimiter{}, - bufferPool: membuf.NewPool(), supportMultiIngest: true, tikvCodec: keyspace.CodecV1, + BackendConfig: BackendConfig{ + LocalStoreDir: path.Join(t.TempDir(), "sorted-kv"), + }, } + var err error + local.engineMgr, err = newEngineManager(local.BackendConfig, local, local.logger) + require.NoError(t, err) data := mockIngestData{{[]byte("a"), []byte("a")}, {[]byte("a2"), []byte("a2")}} @@ -1562,10 +1574,15 @@ func TestPartialWriteIngestBusy(t *testing.T) { }, logger: log.L(), writeLimiter: noopStoreWriteLimiter{}, - bufferPool: membuf.NewPool(), supportMultiIngest: true, tikvCodec: keyspace.CodecV1, + BackendConfig: BackendConfig{ + LocalStoreDir: path.Join(t.TempDir(), "sorted-kv"), + }, } + var err error + local.engineMgr, err = newEngineManager(local.BackendConfig, local, local.logger) + require.NoError(t, err) db, tmpPath := makePebbleDB(t, nil) _, engineUUID := backend.MakeUUID("ww", 0) @@ -1580,7 +1597,7 @@ func TestPartialWriteIngestBusy(t *testing.T) { logger: log.L(), } f.db.Store(db) - err := db.Set([]byte("a"), []byte("a"), nil) + err = db.Set([]byte("a"), []byte("a"), nil) require.NoError(t, err) err = db.Set([]byte("a2"), []byte("a2"), nil) require.NoError(t, err) @@ -1646,6 +1663,8 @@ func TestPartialWriteIngestBusy(t *testing.T) { require.Equal(t, []uint64{1, 2, 3, 1, 2, 3}, apiInvokeRecorder["Write"]) require.Equal(t, []uint64{1, 1, 1}, apiInvokeRecorder["MultiIngest"]) + + require.NoError(t, f.Close()) } // mockGetSizeProperties mocks that 50MB * 20 SST file. @@ -1748,9 +1767,11 @@ func TestSplitRangeAgain4BigRegion(t *testing.T) { jobWg.Done() } jobWg.Wait() + require.NoError(t, f.Close()) } func TestSplitRangeAgain4BigRegionExternalEngine(t *testing.T) { + t.Skip("skip due to the delay of dynamic region feature, and external engine changed its behaviour") backup := external.LargeRegionSplitDataThreshold external.LargeRegionSplitDataThreshold = 1 t.Cleanup(func() { @@ -2269,10 +2290,12 @@ func TestExternalEngine(t *testing.T) { _ = failpoint.Enable("github.com/pingcap/tidb/br/pkg/lightning/backend/local/skipSplitAndScatter", "return()") _ = failpoint.Enable("github.com/pingcap/tidb/br/pkg/lightning/backend/local/skipStartWorker", "return()") _ = failpoint.Enable("github.com/pingcap/tidb/br/pkg/lightning/backend/local/injectVariables", "return()") + _ = failpoint.Enable("github.com/pingcap/tidb/br/pkg/lightning/backend/external/LoadIngestDataBatchSize", "return(2)") t.Cleanup(func() { _ = failpoint.Disable("github.com/pingcap/tidb/br/pkg/lightning/backend/local/skipSplitAndScatter") _ = failpoint.Disable("github.com/pingcap/tidb/br/pkg/lightning/backend/local/skipStartWorker") _ = failpoint.Disable("github.com/pingcap/tidb/br/pkg/lightning/backend/local/injectVariables") + _ = failpoint.Disable("github.com/pingcap/tidb/br/pkg/lightning/backend/external/LoadIngestDataBatchSize") }) ctx := context.Background() dir := t.TempDir() @@ -2300,24 +2323,23 @@ func TestExternalEngine(t *testing.T) { StatFiles: statFiles, StartKey: keys[0], EndKey: endKey, - SplitKeys: [][]byte{keys[30], keys[60], keys[90]}, + SplitKeys: [][]byte{keys[20], keys[30], keys[50], keys[60], keys[80], keys[90]}, TotalFileSize: int64(config.SplitRegionSize) + 1, TotalKVCount: int64(config.SplitRegionKeys) + 1, } engineUUID := uuid.New() - pdCtl := &pdutil.PdController{} - pdCtl.SetPDClient(&mockPdClient{}) local := &Backend{ BackendConfig: BackendConfig{ WorkerConcurrency: 2, + LocalStoreDir: path.Join(t.TempDir(), "sorted-kv"), }, splitCli: initTestSplitClient([][]byte{ keys[0], keys[50], endKey, }, nil), - pdCtl: pdCtl, - externalEngine: map[uuid.UUID]common.Engine{}, - keyAdapter: common.NoopKeyAdapter{}, + pdCli: &mockPdClient{}, } + local.engineMgr, err = newEngineManager(local.BackendConfig, local, local.logger) + require.NoError(t, err) jobs := make([]*regionJob, 0, 5) jobToWorkerCh := make(chan *regionJob, 10) @@ -2372,12 +2394,14 @@ func TestExternalEngine(t *testing.T) { require.Equal(t, 100, kvIdx) } -func TestGetExternalEngineKVStatistics(t *testing.T) { - b := Backend{ - externalEngine: map[uuid.UUID]common.Engine{}, - } - // non existent uuid - size, count := b.GetExternalEngineKVStatistics(uuid.New()) - require.Zero(t, size) - require.Zero(t, count) +func TestCheckDiskAvail(t *testing.T) { + store := &http.StoreInfo{Status: http.StoreStatus{Capacity: "100 GB", Available: "50 GB"}} + ctx := context.Background() + err := checkDiskAvail(ctx, store) + require.NoError(t, err) + + // pd may return this StoreInfo before the store reports heartbeat + store = &http.StoreInfo{Status: http.StoreStatus{LeaderWeight: 1.0, RegionWeight: 1.0}} + err = checkDiskAvail(ctx, store) + require.NoError(t, err) } diff --git a/br/pkg/lightning/backend/local/localhelper_test.go b/br/pkg/lightning/backend/local/localhelper_test.go index 29ff06b5481a3..117576e244db0 100644 --- a/br/pkg/lightning/backend/local/localhelper_test.go +++ b/br/pkg/lightning/backend/local/localhelper_test.go @@ -38,6 +38,7 @@ import ( "github.com/pingcap/tidb/pkg/types" "github.com/pingcap/tidb/pkg/util/codec" "github.com/stretchr/testify/require" + pdhttp "github.com/tikv/pd/client/http" "go.uber.org/atomic" ) @@ -277,11 +278,11 @@ func (c *testSplitClient) ScanRegions(ctx context.Context, key, endKey []byte, l return regions, err } -func (c *testSplitClient) GetPlacementRule(ctx context.Context, groupID, ruleID string) (r pdtypes.Rule, err error) { +func (c *testSplitClient) GetPlacementRule(ctx context.Context, groupID, ruleID string) (r *pdhttp.Rule, err error) { return } -func (c *testSplitClient) SetPlacementRule(ctx context.Context, rule pdtypes.Rule) error { +func (c *testSplitClient) SetPlacementRule(ctx context.Context, rule *pdhttp.Rule) error { return nil } diff --git a/pkg/executor/asyncloaddata/main_test.go b/br/pkg/lightning/backend/local/main_test.go similarity index 69% rename from pkg/executor/asyncloaddata/main_test.go rename to br/pkg/lightning/backend/local/main_test.go index cec283e704947..6ee794c16a23b 100644 --- a/pkg/executor/asyncloaddata/main_test.go +++ b/br/pkg/lightning/backend/local/main_test.go @@ -4,7 +4,7 @@ // 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 +// 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, @@ -12,24 +12,25 @@ // See the License for the specific language governing permissions and // limitations under the License. -package asyncloaddata +package local import ( "testing" + "github.com/pingcap/tidb/pkg/testkit/testsetup" "go.uber.org/goleak" ) func TestMain(m *testing.M) { + testsetup.SetupForCommonTest() + opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), - goleak.IgnoreTopFunction("github.com/tikv/client-go/v2/txnkv/transaction.keepAlive"), + goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), - goleak.IgnoreTopFunction("internal/poll.runtime_pollWait"), - goleak.IgnoreTopFunction("net.(*netFD).connect.func2"), - goleak.IgnoreTopFunction("net/http.(*persistConn).readLoop"), - goleak.IgnoreTopFunction("net/http.(*persistConn).writeLoop"), + goleak.IgnoreTopFunction("syscall.syscall"), } goleak.VerifyTestMain(m, opts...) } diff --git a/br/pkg/lightning/backend/local/region_job.go b/br/pkg/lightning/backend/local/region_job.go index 1c25434974c55..9aab4bf87f3bc 100644 --- a/br/pkg/lightning/backend/local/region_job.go +++ b/br/pkg/lightning/backend/local/region_job.go @@ -225,7 +225,7 @@ func (local *Backend) doWrite(ctx context.Context, j *regionJob) error { apiVersion := local.tikvCodec.GetAPIVersion() clientFactory := local.importClientFactory kvBatchSize := local.KVWriteBatchSize - bufferPool := local.bufferPool + bufferPool := local.engineMgr.getBufferPool() writeLimiter := local.writeLimiter begin := time.Now() diff --git a/br/pkg/lightning/backend/local/tikv_mode.go b/br/pkg/lightning/backend/local/tikv_mode.go index 69345e58a8f4e..a55de0d18bc42 100644 --- a/br/pkg/lightning/backend/local/tikv_mode.go +++ b/br/pkg/lightning/backend/local/tikv_mode.go @@ -18,9 +18,10 @@ import ( "context" sstpb "github.com/pingcap/kvproto/pkg/import_sstpb" + "github.com/pingcap/kvproto/pkg/metapb" "github.com/pingcap/tidb/br/pkg/lightning/common" "github.com/pingcap/tidb/br/pkg/lightning/tikv" - pd "github.com/tikv/pd/client" + pdhttp "github.com/tikv/pd/client/http" "go.uber.org/zap" ) @@ -34,17 +35,17 @@ type TiKVModeSwitcher interface { // TiKVModeSwitcher is used to switch TiKV nodes between Import and Normal mode. type switcher struct { - tls *common.TLS - pdCli pd.Client - logger *zap.Logger + tls *common.TLS + pdHTTPCli pdhttp.Client + logger *zap.Logger } // NewTiKVModeSwitcher creates a new TiKVModeSwitcher. -func NewTiKVModeSwitcher(tls *common.TLS, pdCli pd.Client, logger *zap.Logger) TiKVModeSwitcher { +func NewTiKVModeSwitcher(tls *common.TLS, pdHTTPCli pdhttp.Client, logger *zap.Logger) TiKVModeSwitcher { return &switcher{ - tls: tls, - pdCli: pdCli, - logger: logger, + tls: tls, + pdHTTPCli: pdHTTPCli, + logger: logger, } } @@ -63,21 +64,14 @@ func (rc *switcher) switchTiKVMode(ctx context.Context, mode sstpb.SwitchMode, r // since we're running it periodically, so we exclude disconnected stores. // But it is essentially all stores be switched back to Normal mode to allow // normal operation. - var minState tikv.StoreState - if mode == sstpb.SwitchMode_Import { - minState = tikv.StoreStateOffline - } else { - minState = tikv.StoreStateDisconnected - } - tls := rc.tls.WithHost(rc.pdCli.GetLeaderAddr()) // we ignore switch mode failure since it is not fatal. // no need log the error, it is done in kv.SwitchMode already. _ = tikv.ForAllStores( ctx, - tls, - minState, - func(c context.Context, store *tikv.Store) error { - return tikv.SwitchMode(c, tls, store.Address, mode, ranges...) + rc.pdHTTPCli, + metapb.StoreState_Offline, + func(c context.Context, store *pdhttp.MetaStore) error { + return tikv.SwitchMode(c, rc.tls, store.Address, mode, ranges...) }, ) } diff --git a/br/pkg/lightning/checkpoints/BUILD.bazel b/br/pkg/lightning/checkpoints/BUILD.bazel index ed3c69ff04935..41506474aee82 100644 --- a/br/pkg/lightning/checkpoints/BUILD.bazel +++ b/br/pkg/lightning/checkpoints/BUILD.bazel @@ -4,7 +4,6 @@ go_library( name = "checkpoints", srcs = [ "checkpoints.go", - "glue_checkpoint.go", "tidb.go", ], importpath = "github.com/pingcap/tidb/br/pkg/lightning/checkpoints", @@ -18,11 +17,7 @@ go_library( "//br/pkg/lightning/verification", "//br/pkg/storage", "//br/pkg/version/build", - "//pkg/parser/ast", "//pkg/parser/model", - "//pkg/types", - "//pkg/util/chunk", - "//pkg/util/sqlexec", "@com_github_joho_sqltocsv//:sqltocsv", "@com_github_pingcap_errors//:errors", "@org_uber_go_zap//:zap", diff --git a/br/pkg/lightning/checkpoints/checkpoints.go b/br/pkg/lightning/checkpoints/checkpoints.go index fd5f318f041c0..65ea720a1f455 100644 --- a/br/pkg/lightning/checkpoints/checkpoints.go +++ b/br/pkg/lightning/checkpoints/checkpoints.go @@ -79,7 +79,6 @@ const ( const ( // Some frequently used table name or constants. allTables = "all" - stringLitAll = "'all'" columnTableName = "table_name" ) @@ -730,40 +729,39 @@ type MySQLCheckpointsDB struct { // NewMySQLCheckpointsDB creates a new MySQLCheckpointsDB. func NewMySQLCheckpointsDB(ctx context.Context, db *sql.DB, schemaName string) (*MySQLCheckpointsDB, error) { - schema := common.EscapeIdentifier(schemaName) sql := common.SQLWithRetry{ DB: db, Logger: log.FromContext(ctx).With(zap.String("schema", schemaName)), HideQueryLog: true, } - err := sql.Exec(ctx, "create checkpoints database", fmt.Sprintf(CreateDBTemplate, schema)) + err := sql.Exec(ctx, "create checkpoints database", common.SprintfWithIdentifiers(CreateDBTemplate, schemaName)) if err != nil { return nil, errors.Trace(err) } - err = sql.Exec(ctx, "create task checkpoints table", fmt.Sprintf(CreateTaskTableTemplate, schema, CheckpointTableNameTask)) + err = sql.Exec(ctx, "create task checkpoints table", common.SprintfWithIdentifiers(CreateTaskTableTemplate, schemaName, CheckpointTableNameTask)) if err != nil { return nil, errors.Trace(err) } - err = sql.Exec(ctx, "create table checkpoints table", fmt.Sprintf(CreateTableTableTemplate, schema, CheckpointTableNameTable)) + err = sql.Exec(ctx, "create table checkpoints table", common.SprintfWithIdentifiers(CreateTableTableTemplate, schemaName, CheckpointTableNameTable)) if err != nil { return nil, errors.Trace(err) } - err = sql.Exec(ctx, "create engine checkpoints table", fmt.Sprintf(CreateEngineTableTemplate, schema, CheckpointTableNameEngine)) + err = sql.Exec(ctx, "create engine checkpoints table", common.SprintfWithIdentifiers(CreateEngineTableTemplate, schemaName, CheckpointTableNameEngine)) if err != nil { return nil, errors.Trace(err) } - err = sql.Exec(ctx, "create chunks checkpoints table", fmt.Sprintf(CreateChunkTableTemplate, schema, CheckpointTableNameChunk)) + err = sql.Exec(ctx, "create chunks checkpoints table", common.SprintfWithIdentifiers(CreateChunkTableTemplate, schemaName, CheckpointTableNameChunk)) if err != nil { return nil, errors.Trace(err) } return &MySQLCheckpointsDB{ db: db, - schema: schema, + schema: schemaName, }, nil } @@ -773,7 +771,7 @@ func (cpdb *MySQLCheckpointsDB) Initialize(ctx context.Context, cfg *config.Conf // Since this step is not performance critical, we just insert the rows one-by-one. s := common.SQLWithRetry{DB: cpdb.db, Logger: log.FromContext(ctx)} err := s.Transact(ctx, "insert checkpoints", func(c context.Context, tx *sql.Tx) error { - taskStmt, err := tx.PrepareContext(c, fmt.Sprintf(InitTaskTemplate, cpdb.schema, CheckpointTableNameTask)) + taskStmt, err := tx.PrepareContext(c, common.SprintfWithIdentifiers(InitTaskTemplate, cpdb.schema, CheckpointTableNameTask)) if err != nil { return errors.Trace(err) } @@ -792,7 +790,7 @@ func (cpdb *MySQLCheckpointsDB) Initialize(ctx context.Context, cfg *config.Conf // statement to fail with an irrecoverable error. // We do need to capture the error is display a user friendly message // (multiple nodes cannot import the same table) though. - stmt, err := tx.PrepareContext(c, fmt.Sprintf(InitTableTemplate, cpdb.schema, CheckpointTableNameTable)) + stmt, err := tx.PrepareContext(c, common.SprintfWithIdentifiers(InitTableTemplate, cpdb.schema, CheckpointTableNameTable)) if err != nil { return errors.Trace(err) } @@ -829,7 +827,7 @@ func (cpdb *MySQLCheckpointsDB) TaskCheckpoint(ctx context.Context) (*TaskCheckp Logger: log.FromContext(ctx), } - taskQuery := fmt.Sprintf(ReadTaskTemplate, cpdb.schema, CheckpointTableNameTask) + taskQuery := common.SprintfWithIdentifiers(ReadTaskTemplate, cpdb.schema, CheckpointTableNameTask) taskCp := &TaskCheckpoint{} err := s.QueryRow(ctx, "fetch task checkpoint", taskQuery, &taskCp.TaskID, &taskCp.SourceDir, &taskCp.Backend, &taskCp.ImporterAddr, &taskCp.TiDBHost, &taskCp.TiDBPort, &taskCp.PdAddr, &taskCp.SortedKVDir, &taskCp.LightningVer) @@ -862,7 +860,7 @@ func (cpdb *MySQLCheckpointsDB) Get(ctx context.Context, tableName string) (*Tab err := s.Transact(ctx, "read checkpoint", func(c context.Context, tx *sql.Tx) error { // 1. Populate the engines. - engineQuery := fmt.Sprintf(ReadEngineTemplate, cpdb.schema, CheckpointTableNameEngine) + engineQuery := common.SprintfWithIdentifiers(ReadEngineTemplate, cpdb.schema, CheckpointTableNameEngine) engineRows, err := tx.QueryContext(c, engineQuery, tableName) if err != nil { return errors.Trace(err) @@ -887,7 +885,7 @@ func (cpdb *MySQLCheckpointsDB) Get(ctx context.Context, tableName string) (*Tab // 2. Populate the chunks. - chunkQuery := fmt.Sprintf(ReadChunkTemplate, cpdb.schema, CheckpointTableNameChunk) + chunkQuery := common.SprintfWithIdentifiers(ReadChunkTemplate, cpdb.schema, CheckpointTableNameChunk) chunkRows, err := tx.QueryContext(c, chunkQuery, tableName) if err != nil { return errors.Trace(err) @@ -924,7 +922,7 @@ func (cpdb *MySQLCheckpointsDB) Get(ctx context.Context, tableName string) (*Tab // 3. Fill in the remaining table info - tableQuery := fmt.Sprintf(ReadTableRemainTemplate, cpdb.schema, CheckpointTableNameTable) + tableQuery := common.SprintfWithIdentifiers(ReadTableRemainTemplate, cpdb.schema, CheckpointTableNameTable) tableRow := tx.QueryRowContext(c, tableQuery, tableName) var status uint8 @@ -956,14 +954,14 @@ func (cpdb *MySQLCheckpointsDB) InsertEngineCheckpoints(ctx context.Context, tab Logger: log.FromContext(ctx).With(zap.String("table", tableName)), } err := s.Transact(ctx, "update engine checkpoints", func(c context.Context, tx *sql.Tx) error { - engineStmt, err := tx.PrepareContext(c, fmt.Sprintf(ReplaceEngineTemplate, cpdb.schema, CheckpointTableNameEngine)) + engineStmt, err := tx.PrepareContext(c, common.SprintfWithIdentifiers(ReplaceEngineTemplate, cpdb.schema, CheckpointTableNameEngine)) if err != nil { return errors.Trace(err) } //nolint: errcheck defer engineStmt.Close() - chunkStmt, err := tx.PrepareContext(c, fmt.Sprintf(ReplaceChunkTemplate, cpdb.schema, CheckpointTableNameChunk)) + chunkStmt, err := tx.PrepareContext(c, common.SprintfWithIdentifiers(ReplaceChunkTemplate, cpdb.schema, CheckpointTableNameChunk)) if err != nil { return errors.Trace(err) } @@ -1003,11 +1001,11 @@ func (cpdb *MySQLCheckpointsDB) InsertEngineCheckpoints(ctx context.Context, tab // Update implements the DB interface. func (cpdb *MySQLCheckpointsDB) Update(taskCtx context.Context, checkpointDiffs map[string]*TableCheckpointDiff) error { - chunkQuery := fmt.Sprintf(UpdateChunkTemplate, cpdb.schema, CheckpointTableNameChunk) - rebaseQuery := fmt.Sprintf(UpdateTableRebaseTemplate, cpdb.schema, CheckpointTableNameTable) - tableStatusQuery := fmt.Sprintf(UpdateTableStatusTemplate, cpdb.schema, CheckpointTableNameTable) - tableChecksumQuery := fmt.Sprintf(UpdateTableChecksumTemplate, cpdb.schema, CheckpointTableNameTable) - engineStatusQuery := fmt.Sprintf(UpdateEngineTemplate, cpdb.schema, CheckpointTableNameEngine) + chunkQuery := common.SprintfWithIdentifiers(UpdateChunkTemplate, cpdb.schema, CheckpointTableNameChunk) + rebaseQuery := common.SprintfWithIdentifiers(UpdateTableRebaseTemplate, cpdb.schema, CheckpointTableNameTable) + tableStatusQuery := common.SprintfWithIdentifiers(UpdateTableStatusTemplate, cpdb.schema, CheckpointTableNameTable) + tableChecksumQuery := common.SprintfWithIdentifiers(UpdateTableChecksumTemplate, cpdb.schema, CheckpointTableNameTable) + engineStatusQuery := common.SprintfWithIdentifiers(UpdateEngineTemplate, cpdb.schema, CheckpointTableNameEngine) s := common.SQLWithRetry{DB: cpdb.db, Logger: log.FromContext(taskCtx)} return s.Transact(taskCtx, "update checkpoints", func(c context.Context, tx *sql.Tx) error { @@ -1499,12 +1497,12 @@ func (cpdb *MySQLCheckpointsDB) RemoveCheckpoint(ctx context.Context, tableName } if tableName == allTables { - return s.Exec(ctx, "remove all checkpoints", "DROP SCHEMA "+cpdb.schema) + return s.Exec(ctx, "remove all checkpoints", common.SprintfWithIdentifiers("DROP SCHEMA %s", cpdb.schema)) } - deleteChunkQuery := fmt.Sprintf(DeleteCheckpointRecordTemplate, cpdb.schema, CheckpointTableNameChunk) - deleteEngineQuery := fmt.Sprintf(DeleteCheckpointRecordTemplate, cpdb.schema, CheckpointTableNameEngine) - deleteTableQuery := fmt.Sprintf(DeleteCheckpointRecordTemplate, cpdb.schema, CheckpointTableNameTable) + deleteChunkQuery := common.SprintfWithIdentifiers(DeleteCheckpointRecordTemplate, cpdb.schema, CheckpointTableNameChunk) + deleteEngineQuery := common.SprintfWithIdentifiers(DeleteCheckpointRecordTemplate, cpdb.schema, CheckpointTableNameEngine) + deleteTableQuery := common.SprintfWithIdentifiers(DeleteCheckpointRecordTemplate, cpdb.schema, CheckpointTableNameTable) return s.Transact(ctx, "remove checkpoints", func(c context.Context, tx *sql.Tx) error { if _, e := tx.ExecContext(c, deleteChunkQuery, tableName); e != nil { @@ -1522,16 +1520,13 @@ func (cpdb *MySQLCheckpointsDB) RemoveCheckpoint(ctx context.Context, tableName // MoveCheckpoints implements CheckpointsDB.MoveCheckpoints. func (cpdb *MySQLCheckpointsDB) MoveCheckpoints(ctx context.Context, taskID int64) error { - // The "cpdb.schema" is an escaped schema name of the form "`foo`". - // We use "x[1:len(x)-1]" instead of unescaping it to keep the - // double-backquotes (if any) intact. - newSchema := fmt.Sprintf("`%s.%d.bak`", cpdb.schema[1:len(cpdb.schema)-1], taskID) + newSchema := fmt.Sprintf("%s.%d.bak", cpdb.schema, taskID) s := common.SQLWithRetry{ DB: cpdb.db, Logger: log.FromContext(ctx).With(zap.Int64("taskID", taskID)), } - createSchemaQuery := "CREATE SCHEMA IF NOT EXISTS " + newSchema + createSchemaQuery := common.SprintfWithIdentifiers("CREATE SCHEMA IF NOT EXISTS %s", newSchema) if e := s.Exec(ctx, "create backup checkpoints schema", createSchemaQuery); e != nil { return e } @@ -1539,7 +1534,7 @@ func (cpdb *MySQLCheckpointsDB) MoveCheckpoints(ctx context.Context, taskID int6 CheckpointTableNameChunk, CheckpointTableNameEngine, CheckpointTableNameTable, CheckpointTableNameTask, } { - query := fmt.Sprintf("RENAME TABLE %[1]s.%[3]s TO %[2]s.%[3]s", cpdb.schema, newSchema, tbl) + query := common.SprintfWithIdentifiers("RENAME TABLE %[1]s.%[3]s TO %[2]s.%[3]s", cpdb.schema, newSchema, tbl) if e := s.Exec(ctx, fmt.Sprintf("move %s checkpoints table", tbl), query); e != nil { return e } @@ -1558,20 +1553,20 @@ func (cpdb *MySQLCheckpointsDB) GetLocalStoringTables(ctx context.Context) (map[ // 2. engine status is earlier than CheckpointStatusImported, and // 3. chunk has been read - query := fmt.Sprintf(` + query := common.SprintfWithIdentifiers(` SELECT DISTINCT t.table_name, c.engine_id FROM %s.%s t, %s.%s c, %s.%s e WHERE t.table_name = c.table_name AND t.table_name = e.table_name AND c.engine_id = e.engine_id - AND %d < t.status AND t.status < %d - AND %d < e.status AND e.status < %d + AND ? < t.status AND t.status < ? + AND ? < e.status AND e.status < ? AND c.pos > c.offset;`, - cpdb.schema, CheckpointTableNameTable, cpdb.schema, CheckpointTableNameChunk, cpdb.schema, CheckpointTableNameEngine, - CheckpointStatusMaxInvalid, CheckpointStatusIndexImported, - CheckpointStatusMaxInvalid, CheckpointStatusImported) + cpdb.schema, CheckpointTableNameTable, cpdb.schema, CheckpointTableNameChunk, cpdb.schema, CheckpointTableNameEngine) err := common.Retry("get local storing tables", log.FromContext(ctx), func() error { targetTables = make(map[string][]int32) - rows, err := cpdb.db.QueryContext(ctx, query) // #nosec G201 + rows, err := cpdb.db.QueryContext(ctx, query, + CheckpointStatusMaxInvalid, CheckpointStatusIndexImported, + CheckpointStatusMaxInvalid, CheckpointStatusImported) if err != nil { return errors.Trace(err) } @@ -1601,34 +1596,29 @@ func (cpdb *MySQLCheckpointsDB) GetLocalStoringTables(ctx context.Context) (map[ // IgnoreErrorCheckpoint implements CheckpointsDB.IgnoreErrorCheckpoint. func (cpdb *MySQLCheckpointsDB) IgnoreErrorCheckpoint(ctx context.Context, tableName string) error { - var colName string + var ( + query, query2 string + args []any + ) if tableName == allTables { - // This will expand to `WHERE 'all' = 'all'` and effectively allowing - // all tables to be included. - colName = stringLitAll + query = common.SprintfWithIdentifiers("UPDATE %s.%s SET status = ? WHERE status <= ?", cpdb.schema, CheckpointTableNameEngine) + query2 = common.SprintfWithIdentifiers("UPDATE %s.%s SET status = ? WHERE status <= ?", cpdb.schema, CheckpointTableNameTable) + args = []any{CheckpointStatusLoaded, CheckpointStatusMaxInvalid} } else { - colName = columnTableName + query = common.SprintfWithIdentifiers("UPDATE %s.%s SET status = ? WHERE table_name = ? AND status <= ?", cpdb.schema, CheckpointTableNameEngine) + query2 = common.SprintfWithIdentifiers("UPDATE %s.%s SET status = ? WHERE table_name = ? AND status <= ?", cpdb.schema, CheckpointTableNameTable) + args = []any{CheckpointStatusLoaded, tableName, CheckpointStatusMaxInvalid} } - // nolint:gosec - engineQuery := fmt.Sprintf(` - UPDATE %s.%s SET status = %d WHERE %s = ? AND status <= %d; - `, cpdb.schema, CheckpointTableNameEngine, CheckpointStatusLoaded, colName, CheckpointStatusMaxInvalid) - - // nolint:gosec - tableQuery := fmt.Sprintf(` - UPDATE %s.%s SET status = %d WHERE %s = ? AND status <= %d; - `, cpdb.schema, CheckpointTableNameTable, CheckpointStatusLoaded, colName, CheckpointStatusMaxInvalid) - s := common.SQLWithRetry{ DB: cpdb.db, Logger: log.FromContext(ctx).With(zap.String("table", tableName)), } err := s.Transact(ctx, "ignore error checkpoints", func(c context.Context, tx *sql.Tx) error { - if _, e := tx.ExecContext(c, engineQuery, tableName); e != nil { + if _, e := tx.ExecContext(c, query, args...); e != nil { return errors.Trace(e) } - if _, e := tx.ExecContext(c, tableQuery, tableName); e != nil { + if _, e := tx.ExecContext(c, query2, args...); e != nil { return errors.Trace(e) } return nil @@ -1638,44 +1628,54 @@ func (cpdb *MySQLCheckpointsDB) IgnoreErrorCheckpoint(ctx context.Context, table // DestroyErrorCheckpoint implements CheckpointsDB.DestroyErrorCheckpoint. func (cpdb *MySQLCheckpointsDB) DestroyErrorCheckpoint(ctx context.Context, tableName string) ([]DestroyedTableCheckpoint, error) { - var colName, aliasedColName string - + var ( + selectQuery, deleteChunkQuery, deleteEngineQuery, deleteTableQuery string + args []any + ) if tableName == allTables { - // These will expand to `WHERE 'all' = 'all'` and effectively allowing - // all tables to be included. - colName = stringLitAll - aliasedColName = stringLitAll + selectQuery = common.SprintfWithIdentifiers(` + SELECT + t.table_name, + COALESCE(MIN(e.engine_id), 0), + COALESCE(MAX(e.engine_id), -1) + FROM %[1]s.%[2]s t + LEFT JOIN %[1]s.%[3]s e ON t.table_name = e.table_name + WHERE t.status <= ? + GROUP BY t.table_name; + `, cpdb.schema, CheckpointTableNameTable, CheckpointTableNameEngine) + deleteChunkQuery = common.SprintfWithIdentifiers(` + DELETE FROM %[1]s.%[2]s WHERE table_name IN (SELECT table_name FROM %[1]s.%[3]s WHERE status <= ?) + `, cpdb.schema, CheckpointTableNameChunk, CheckpointTableNameTable) + deleteEngineQuery = common.SprintfWithIdentifiers(` + DELETE FROM %[1]s.%[2]s WHERE table_name IN (SELECT table_name FROM %[1]s.%[3]s WHERE status <= ?) + `, cpdb.schema, CheckpointTableNameEngine, CheckpointTableNameTable) + deleteTableQuery = common.SprintfWithIdentifiers(` + DELETE FROM %s.%s status <= ? + `, cpdb.schema, CheckpointTableNameTable) + args = []any{CheckpointStatusMaxInvalid} } else { - colName = columnTableName - aliasedColName = "t.table_name" + selectQuery = common.SprintfWithIdentifiers(` + SELECT + t.table_name, + COALESCE(MIN(e.engine_id), 0), + COALESCE(MAX(e.engine_id), -1) + FROM %[1]s.%[2]s t + LEFT JOIN %[1]s.%[3]s e ON t.table_name = e.table_name + WHERE t.table_name = ? AND t.status <= ? + GROUP BY t.table_name; + `, cpdb.schema, CheckpointTableNameTable, CheckpointTableNameEngine) + deleteChunkQuery = common.SprintfWithIdentifiers(` + DELETE FROM %[1]s.%[2]s WHERE table_name IN (SELECT table_name FROM %[1]s.%[3]s WHERE table_name = ? AND status <= ?) + `, cpdb.schema, CheckpointTableNameChunk, CheckpointTableNameTable) + deleteEngineQuery = common.SprintfWithIdentifiers(` + DELETE FROM %[1]s.%[2]s WHERE table_name IN (SELECT table_name FROM %[1]s.%[3]s WHERE table_name = ? AND status <= ?) + `, cpdb.schema, CheckpointTableNameEngine, CheckpointTableNameTable) + deleteTableQuery = common.SprintfWithIdentifiers(` + DELETE FROM %s.%s WHERE table_name = ? AND status <= ? + `, cpdb.schema, CheckpointTableNameTable) + args = []any{tableName, CheckpointStatusMaxInvalid} } - selectQuery := fmt.Sprintf(` - SELECT - t.table_name, - COALESCE(MIN(e.engine_id), 0), - COALESCE(MAX(e.engine_id), -1) - FROM %[1]s.%[4]s t - LEFT JOIN %[1]s.%[5]s e ON t.table_name = e.table_name - WHERE %[2]s = ? AND t.status <= %[3]d - GROUP BY t.table_name; - `, cpdb.schema, aliasedColName, CheckpointStatusMaxInvalid, CheckpointTableNameTable, CheckpointTableNameEngine) - - // nolint:gosec - deleteChunkQuery := fmt.Sprintf(` - DELETE FROM %[1]s.%[4]s WHERE table_name IN (SELECT table_name FROM %[1]s.%[5]s WHERE %[2]s = ? AND status <= %[3]d) - `, cpdb.schema, colName, CheckpointStatusMaxInvalid, CheckpointTableNameChunk, CheckpointTableNameTable) - - // nolint:gosec - deleteEngineQuery := fmt.Sprintf(` - DELETE FROM %[1]s.%[4]s WHERE table_name IN (SELECT table_name FROM %[1]s.%[5]s WHERE %[2]s = ? AND status <= %[3]d) - `, cpdb.schema, colName, CheckpointStatusMaxInvalid, CheckpointTableNameEngine, CheckpointTableNameTable) - - // nolint:gosec - deleteTableQuery := fmt.Sprintf(` - DELETE FROM %s.%s WHERE %s = ? AND status <= %d - `, cpdb.schema, CheckpointTableNameTable, colName, CheckpointStatusMaxInvalid) - var targetTables []DestroyedTableCheckpoint s := common.SQLWithRetry{ @@ -1685,7 +1685,7 @@ func (cpdb *MySQLCheckpointsDB) DestroyErrorCheckpoint(ctx context.Context, tabl err := s.Transact(ctx, "destroy error checkpoints", func(c context.Context, tx *sql.Tx) error { // Obtain the list of tables targetTables = nil - rows, e := tx.QueryContext(c, selectQuery, tableName) // #nosec G201 + rows, e := tx.QueryContext(c, selectQuery, args...) if e != nil { return errors.Trace(e) } @@ -1703,13 +1703,13 @@ func (cpdb *MySQLCheckpointsDB) DestroyErrorCheckpoint(ctx context.Context, tabl } // Delete the checkpoints - if _, e := tx.ExecContext(c, deleteChunkQuery, tableName); e != nil { + if _, e := tx.ExecContext(c, deleteChunkQuery, args...); e != nil { return errors.Trace(e) } - if _, e := tx.ExecContext(c, deleteEngineQuery, tableName); e != nil { + if _, e := tx.ExecContext(c, deleteEngineQuery, args...); e != nil { return errors.Trace(e) } - if _, e := tx.ExecContext(c, deleteTableQuery, tableName); e != nil { + if _, e := tx.ExecContext(c, deleteTableQuery, args...); e != nil { return errors.Trace(e) } return nil @@ -1726,7 +1726,7 @@ func (cpdb *MySQLCheckpointsDB) DestroyErrorCheckpoint(ctx context.Context, tabl //nolint:rowserrcheck // sqltocsv.Write will check this. func (cpdb *MySQLCheckpointsDB) DumpTables(ctx context.Context, writer io.Writer) error { //nolint: rowserrcheck - rows, err := cpdb.db.QueryContext(ctx, fmt.Sprintf(` + rows, err := cpdb.db.QueryContext(ctx, common.SprintfWithIdentifiers(` SELECT task_id, table_name, @@ -1751,7 +1751,7 @@ func (cpdb *MySQLCheckpointsDB) DumpTables(ctx context.Context, writer io.Writer //nolint:rowserrcheck // sqltocsv.Write will check this. func (cpdb *MySQLCheckpointsDB) DumpEngines(ctx context.Context, writer io.Writer) error { //nolint: rowserrcheck - rows, err := cpdb.db.QueryContext(ctx, fmt.Sprintf(` + rows, err := cpdb.db.QueryContext(ctx, common.SprintfWithIdentifiers(` SELECT table_name, engine_id, @@ -1774,7 +1774,7 @@ func (cpdb *MySQLCheckpointsDB) DumpEngines(ctx context.Context, writer io.Write //nolint:rowserrcheck // sqltocsv.Write will check this. func (cpdb *MySQLCheckpointsDB) DumpChunks(ctx context.Context, writer io.Writer) error { //nolint: rowserrcheck - rows, err := cpdb.db.QueryContext(ctx, fmt.Sprintf(` + rows, err := cpdb.db.QueryContext(ctx, common.SprintfWithIdentifiers(` SELECT table_name, path, diff --git a/br/pkg/lightning/checkpoints/checkpoints_sql_test.go b/br/pkg/lightning/checkpoints/checkpoints_sql_test.go index 7f62fe0e7ca88..d85bfb69c9156 100644 --- a/br/pkg/lightning/checkpoints/checkpoints_sql_test.go +++ b/br/pkg/lightning/checkpoints/checkpoints_sql_test.go @@ -36,16 +36,16 @@ func newCPSQLSuite(t *testing.T) *cpSQLSuite { ExpectExec("CREATE DATABASE IF NOT EXISTS `mock-schema`"). WillReturnResult(sqlmock.NewResult(1, 1)) s.mock. - ExpectExec("CREATE TABLE IF NOT EXISTS `mock-schema`\\.task_v\\d+ .+"). + ExpectExec("CREATE TABLE IF NOT EXISTS `mock-schema`\\.`task_v\\d+` .+"). WillReturnResult(sqlmock.NewResult(2, 1)) s.mock. - ExpectExec("CREATE TABLE IF NOT EXISTS `mock-schema`\\.table_v\\d+ .+"). + ExpectExec("CREATE TABLE IF NOT EXISTS `mock-schema`\\.`table_v\\d+` .+"). WillReturnResult(sqlmock.NewResult(3, 1)) s.mock. - ExpectExec("CREATE TABLE IF NOT EXISTS `mock-schema`\\.engine_v\\d+ .+"). + ExpectExec("CREATE TABLE IF NOT EXISTS `mock-schema`\\.`engine_v\\d+` .+"). WillReturnResult(sqlmock.NewResult(4, 1)) s.mock. - ExpectExec("CREATE TABLE IF NOT EXISTS `mock-schema`\\.chunk_v\\d+ .+"). + ExpectExec("CREATE TABLE IF NOT EXISTS `mock-schema`\\.`chunk_v\\d+` .+"). WillReturnResult(sqlmock.NewResult(5, 1)) cpdb, err := checkpoints.NewMySQLCheckpointsDB(context.Background(), s.db, "mock-schema") @@ -82,12 +82,12 @@ func TestNormalOperations(t *testing.T) { s.mock.ExpectBegin() initializeStmt := s.mock.ExpectPrepare( - "REPLACE INTO `mock-schema`\\.task_v\\d+") + "REPLACE INTO `mock-schema`\\.`task_v\\d+`") initializeStmt.ExpectExec(). WithArgs(123, "/data", "local", "127.0.0.1:8287", "127.0.0.1", 4000, "127.0.0.1:2379", "/tmp/sorted-kv", build.ReleaseVersion). WillReturnResult(sqlmock.NewResult(6, 1)) initializeStmt = s.mock. - ExpectPrepare("INSERT INTO `mock-schema`\\.table_v\\d+") + ExpectPrepare("INSERT INTO `mock-schema`\\.`table_v\\d+`") initializeStmt.ExpectExec(). WithArgs(123, "`db1`.`t1`", sqlmock.AnyArg(), int64(1), t1Info). WillReturnResult(sqlmock.NewResult(7, 1)) @@ -142,7 +142,7 @@ func TestNormalOperations(t *testing.T) { s.mock.ExpectBegin() insertEngineStmt := s.mock. - ExpectPrepare("REPLACE INTO `mock-schema`\\.engine_v\\d+ .+") + ExpectPrepare("REPLACE INTO `mock-schema`\\.`engine_v\\d+` .+") insertEngineStmt. ExpectExec(). WithArgs("`db1`.`t2`", 0, 30). @@ -152,7 +152,7 @@ func TestNormalOperations(t *testing.T) { WithArgs("`db1`.`t2`", -1, 30). WillReturnResult(sqlmock.NewResult(9, 1)) insertChunkStmt := s.mock. - ExpectPrepare("REPLACE INTO `mock-schema`\\.chunk_v\\d+ .+") + ExpectPrepare("REPLACE INTO `mock-schema`\\.`chunk_v\\d+` .+") insertChunkStmt. ExpectExec(). WithArgs("`db1`.`t2`", 0, "/tmp/path/1.sql", 0, mydump.SourceTypeSQL, 0, "", 123, []byte("null"), 12, 102400, 1, 5000, 1234567890). @@ -223,7 +223,7 @@ func TestNormalOperations(t *testing.T) { s.mock.ExpectBegin() s.mock. - ExpectPrepare("UPDATE `mock-schema`\\.chunk_v\\d+ SET pos = .+"). + ExpectPrepare("UPDATE `mock-schema`\\.`chunk_v\\d+` SET pos = .+"). ExpectExec(). WithArgs( 55904, 681, 4491, 586, 486070148917, []byte("null"), @@ -231,22 +231,22 @@ func TestNormalOperations(t *testing.T) { ). WillReturnResult(sqlmock.NewResult(11, 1)) s.mock. - ExpectPrepare("UPDATE `mock-schema`\\.table_v\\d+ SET alloc_base = .+"). + ExpectPrepare("UPDATE `mock-schema`\\.`table_v\\d+` SET alloc_base = .+"). ExpectExec(). WithArgs(132861, "`db1`.`t2`"). WillReturnResult(sqlmock.NewResult(12, 1)) s.mock. - ExpectPrepare("UPDATE `mock-schema`\\.engine_v\\d+ SET status = .+"). + ExpectPrepare("UPDATE `mock-schema`\\.`engine_v\\d+` SET status = .+"). ExpectExec(). WithArgs(120, "`db1`.`t2`", 0). WillReturnResult(sqlmock.NewResult(13, 1)) s.mock. - ExpectPrepare("UPDATE `mock-schema`\\.table_v\\d+ SET status = .+"). + ExpectPrepare("UPDATE `mock-schema`\\.`table_v\\d+` SET status = .+"). ExpectExec(). WithArgs(60, "`db1`.`t2`"). WillReturnResult(sqlmock.NewResult(14, 1)) s.mock. - ExpectPrepare("UPDATE `mock-schema`\\.table_v\\d+ SET kv_bytes = .+"). + ExpectPrepare("UPDATE `mock-schema`\\.`table_v\\d+` SET kv_bytes = .+"). ExpectExec(). WithArgs(4492, 686, 486070148910, "`db1`.`t2`"). WillReturnResult(sqlmock.NewResult(15, 1)) @@ -262,7 +262,7 @@ func TestNormalOperations(t *testing.T) { s.mock.ExpectBegin() s.mock. - ExpectQuery("SELECT .+ FROM `mock-schema`\\.engine_v\\d+"). + ExpectQuery("SELECT .+ FROM `mock-schema`\\.`engine_v\\d+`"). WithArgs("`db1`.`t2`"). WillReturnRows( sqlmock.NewRows([]string{"engine_id", "status"}). @@ -270,7 +270,7 @@ func TestNormalOperations(t *testing.T) { AddRow(-1, 30), ) s.mock. - ExpectQuery("SELECT (?s:.+) FROM `mock-schema`\\.chunk_v\\d+"). + ExpectQuery("SELECT (?s:.+) FROM `mock-schema`\\.`chunk_v\\d+`"). WithArgs("`db1`.`t2`"). WillReturnRows( sqlmock.NewRows([]string{ @@ -285,7 +285,7 @@ func TestNormalOperations(t *testing.T) { ), ) s.mock. - ExpectQuery("SELECT .+ FROM `mock-schema`\\.table_v\\d+"). + ExpectQuery("SELECT .+ FROM `mock-schema`\\.`table_v\\d+`"). WithArgs("`db1`.`t2`"). WillReturnRows( sqlmock.NewRows([]string{"status", "alloc_base", "table_id", "table_info", "kv_bytes", "kv_kvs", "kv_checksum"}). @@ -345,11 +345,11 @@ func TestRemoveAllCheckpoints_SQL(t *testing.T) { s.mock.ExpectBegin() s.mock. - ExpectQuery("SELECT .+ FROM `mock-schema`\\.engine_v\\d+"). + ExpectQuery("SELECT .+ FROM `mock-schema`\\.`engine_v\\d+`"). WithArgs("`db1`.`t2`"). WillReturnRows(sqlmock.NewRows([]string{"engine_id", "status"})) s.mock. - ExpectQuery("SELECT (?s:.+) FROM `mock-schema`\\.chunk_v\\d+"). + ExpectQuery("SELECT (?s:.+) FROM `mock-schema`\\.`chunk_v\\d+`"). WithArgs("`db1`.`t2`"). WillReturnRows( sqlmock.NewRows([]string{ @@ -358,7 +358,7 @@ func TestRemoveAllCheckpoints_SQL(t *testing.T) { "kvc_bytes", "kvc_kvs", "kvc_checksum", "unix_timestamp(create_time)", })) s.mock. - ExpectQuery("SELECT .+ FROM `mock-schema`\\.table_v\\d+"). + ExpectQuery("SELECT .+ FROM `mock-schema`\\.`table_v\\d+`"). WithArgs("`db1`.`t2`"). WillReturnRows(sqlmock.NewRows([]string{"status", "alloc_base", "table_id"})) s.mock.ExpectRollback() @@ -373,15 +373,15 @@ func TestRemoveOneCheckpoint_SQL(t *testing.T) { s.mock.ExpectBegin() s.mock. - ExpectExec("DELETE FROM `mock-schema`\\.chunk_v\\d+ WHERE table_name = \\?"). + ExpectExec("DELETE FROM `mock-schema`\\.`chunk_v\\d+` WHERE table_name = \\?"). WithArgs("`db1`.`t2`"). WillReturnResult(sqlmock.NewResult(0, 4)) s.mock. - ExpectExec("DELETE FROM `mock-schema`\\.engine_v\\d+ WHERE table_name = \\?"). + ExpectExec("DELETE FROM `mock-schema`\\.`engine_v\\d+` WHERE table_name = \\?"). WithArgs("`db1`.`t2`"). WillReturnResult(sqlmock.NewResult(0, 2)) s.mock. - ExpectExec("DELETE FROM `mock-schema`\\.table_v\\d+ WHERE table_name = \\?"). + ExpectExec("DELETE FROM `mock-schema`\\.`table_v\\d+` WHERE table_name = \\?"). WithArgs("`db1`.`t2`"). WillReturnResult(sqlmock.NewResult(0, 1)) s.mock.ExpectCommit() @@ -395,12 +395,12 @@ func TestIgnoreAllErrorCheckpoints_SQL(t *testing.T) { s.mock.ExpectBegin() s.mock. - ExpectExec("UPDATE `mock-schema`\\.engine_v\\d+ SET status = 30 WHERE 'all' = \\? AND status <= 25"). - WithArgs(sqlmock.AnyArg()). + ExpectExec("UPDATE `mock-schema`\\.`engine_v\\d+` SET status = \\? WHERE status <= \\?"). + WithArgs(checkpoints.CheckpointStatusLoaded, 25). WillReturnResult(sqlmock.NewResult(5, 3)) s.mock. - ExpectExec("UPDATE `mock-schema`\\.table_v\\d+ SET status = 30 WHERE 'all' = \\? AND status <= 25"). - WithArgs(sqlmock.AnyArg()). + ExpectExec("UPDATE `mock-schema`\\.`table_v\\d+` SET status = \\? WHERE status <= \\?"). + WithArgs(checkpoints.CheckpointStatusLoaded, 25). WillReturnResult(sqlmock.NewResult(6, 2)) s.mock.ExpectCommit() @@ -413,12 +413,12 @@ func TestIgnoreOneErrorCheckpoint(t *testing.T) { s.mock.ExpectBegin() s.mock. - ExpectExec("UPDATE `mock-schema`\\.engine_v\\d+ SET status = 30 WHERE table_name = \\? AND status <= 25"). - WithArgs("`db1`.`t2`"). + ExpectExec("UPDATE `mock-schema`\\.`engine_v\\d+` SET status = \\? WHERE table_name = \\? AND status <= \\?"). + WithArgs(checkpoints.CheckpointStatusLoaded, "`db1`.`t2`", 25). WillReturnResult(sqlmock.NewResult(5, 2)) s.mock. - ExpectExec("UPDATE `mock-schema`\\.table_v\\d+ SET status = 30 WHERE table_name = \\? AND status <= 25"). - WithArgs("`db1`.`t2`"). + ExpectExec("UPDATE `mock-schema`\\.`table_v\\d+` SET status = \\? WHERE table_name = \\? AND status <= \\?"). + WithArgs(checkpoints.CheckpointStatusLoaded, "`db1`.`t2`", 25). WillReturnResult(sqlmock.NewResult(6, 1)) s.mock.ExpectCommit() @@ -431,22 +431,22 @@ func TestDestroyAllErrorCheckpoints_SQL(t *testing.T) { s.mock.ExpectBegin() s.mock. - ExpectQuery("SELECT (?s:.+)'all' = \\?"). + ExpectQuery("SELECT (?s:.+)"). WithArgs(sqlmock.AnyArg()). WillReturnRows( sqlmock.NewRows([]string{"table_name", "__min__", "__max__"}). AddRow("`db1`.`t2`", -1, 0), ) s.mock. - ExpectExec("DELETE FROM `mock-schema`\\.chunk_v\\d+ WHERE table_name IN .+ 'all' = \\?"). + ExpectExec("DELETE FROM `mock-schema`\\.`chunk_v\\d+` WHERE table_name IN"). WithArgs(sqlmock.AnyArg()). WillReturnResult(sqlmock.NewResult(0, 5)) s.mock. - ExpectExec("DELETE FROM `mock-schema`\\.engine_v\\d+ WHERE table_name IN .+ 'all' = \\?"). + ExpectExec("DELETE FROM `mock-schema`\\.`engine_v\\d+` WHERE table_name IN"). WithArgs(sqlmock.AnyArg()). WillReturnResult(sqlmock.NewResult(0, 3)) s.mock. - ExpectExec("DELETE FROM `mock-schema`\\.table_v\\d+ WHERE 'all' = \\?"). + ExpectExec("DELETE FROM `mock-schema`\\.`table_v\\d+`"). WithArgs(sqlmock.AnyArg()). WillReturnResult(sqlmock.NewResult(0, 2)) s.mock.ExpectCommit() @@ -466,22 +466,22 @@ func TestDestroyOneErrorCheckpoints(t *testing.T) { s.mock.ExpectBegin() s.mock. ExpectQuery("SELECT (?s:.+)table_name = \\?"). - WithArgs("`db1`.`t2`"). + WithArgs("`db1`.`t2`", sqlmock.AnyArg()). WillReturnRows( sqlmock.NewRows([]string{"table_name", "__min__", "__max__"}). AddRow("`db1`.`t2`", -1, 0), ) s.mock. - ExpectExec("DELETE FROM `mock-schema`\\.chunk_v\\d+ WHERE .+table_name = \\?"). - WithArgs("`db1`.`t2`"). + ExpectExec("DELETE FROM `mock-schema`\\.`chunk_v\\d+` WHERE .+table_name = \\?"). + WithArgs("`db1`.`t2`", sqlmock.AnyArg()). WillReturnResult(sqlmock.NewResult(0, 4)) s.mock. - ExpectExec("DELETE FROM `mock-schema`\\.engine_v\\d+ WHERE .+table_name = \\?"). - WithArgs("`db1`.`t2`"). + ExpectExec("DELETE FROM `mock-schema`\\.`engine_v\\d+` WHERE .+table_name = \\?"). + WithArgs("`db1`.`t2`", sqlmock.AnyArg()). WillReturnResult(sqlmock.NewResult(0, 2)) s.mock. - ExpectExec("DELETE FROM `mock-schema`\\.table_v\\d+ WHERE table_name = \\?"). - WithArgs("`db1`.`t2`"). + ExpectExec("DELETE FROM `mock-schema`\\.`table_v\\d+` WHERE table_name = \\?"). + WithArgs("`db1`.`t2`", sqlmock.AnyArg()). WillReturnResult(sqlmock.NewResult(0, 1)) s.mock.ExpectCommit() @@ -500,7 +500,7 @@ func TestDump(t *testing.T) { tm := time.Unix(1555555555, 0).UTC() s.mock. - ExpectQuery("SELECT (?s:.+) FROM `mock-schema`\\.chunk_v\\d+"). + ExpectQuery("SELECT (?s:.+) FROM `mock-schema`\\.`chunk_v\\d+`"). WillReturnRows( sqlmock.NewRows([]string{ "table_name", "path", "offset", "type", "compression", "sort_key", "file_size", "columns", @@ -525,7 +525,7 @@ func TestDump(t *testing.T) { ) s.mock. - ExpectQuery("SELECT .+ FROM `mock-schema`\\.engine_v\\d+"). + ExpectQuery("SELECT .+ FROM `mock-schema`\\.`engine_v\\d+`"). WillReturnRows( sqlmock.NewRows([]string{"table_name", "engine_id", "status", "create_time", "update_time"}). AddRow("`db1`.`t2`", -1, 30, tm, tm). @@ -541,7 +541,7 @@ func TestDump(t *testing.T) { csvBuilder.String()) s.mock. - ExpectQuery("SELECT .+ FROM `mock-schema`\\.table_v\\d+"). + ExpectQuery("SELECT .+ FROM `mock-schema`\\.`table_v\\d+`"). WillReturnRows( sqlmock.NewRows([]string{"task_id", "table_name", "hash", "status", "alloc_base", "create_time", "update_time"}). AddRow(1555555555, "`db1`.`t2`", 0, 90, 132861, tm, tm), @@ -564,16 +564,16 @@ func TestMoveCheckpoints(t *testing.T) { ExpectExec("CREATE SCHEMA IF NOT EXISTS `mock-schema\\.12345678\\.bak`"). WillReturnResult(sqlmock.NewResult(1, 1)) s.mock. - ExpectExec("RENAME TABLE `mock-schema`\\.chunk_v\\d+ TO `mock-schema\\.12345678\\.bak`\\.chunk_v\\d+"). + ExpectExec("RENAME TABLE `mock-schema`\\.`chunk_v\\d+` TO `mock-schema\\.12345678\\.bak`\\.`chunk_v\\d+`"). WillReturnResult(sqlmock.NewResult(0, 1)) s.mock. - ExpectExec("RENAME TABLE `mock-schema`\\.engine_v\\d+ TO `mock-schema\\.12345678\\.bak`\\.engine_v\\d+"). + ExpectExec("RENAME TABLE `mock-schema`\\.`engine_v\\d+` TO `mock-schema\\.12345678\\.bak`\\.`engine_v\\d+`"). WillReturnResult(sqlmock.NewResult(0, 1)) s.mock. - ExpectExec("RENAME TABLE `mock-schema`\\.table_v\\d+ TO `mock-schema\\.12345678\\.bak`\\.table_v\\d+"). + ExpectExec("RENAME TABLE `mock-schema`\\.`table_v\\d+` TO `mock-schema\\.12345678\\.bak`\\.`table_v\\d+`"). WillReturnResult(sqlmock.NewResult(0, 1)) s.mock. - ExpectExec("RENAME TABLE `mock-schema`\\.task_v\\d+ TO `mock-schema\\.12345678\\.bak`\\.task_v\\d+"). + ExpectExec("RENAME TABLE `mock-schema`\\.`task_v\\d+` TO `mock-schema\\.12345678\\.bak`\\.`task_v\\d+`"). WillReturnResult(sqlmock.NewResult(0, 1)) err := s.cpdb.MoveCheckpoints(ctx, 12345678) diff --git a/br/pkg/lightning/checkpoints/glue_checkpoint.go b/br/pkg/lightning/checkpoints/glue_checkpoint.go deleted file mode 100644 index a1a8cd96fed3b..0000000000000 --- a/br/pkg/lightning/checkpoints/glue_checkpoint.go +++ /dev/null @@ -1,826 +0,0 @@ -// Copyright 2020 PingCAP, 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. - -package checkpoints - -import ( - "context" - "encoding/json" - "fmt" - "io" - "strings" - - "github.com/pingcap/errors" - "github.com/pingcap/tidb/br/pkg/lightning/common" - "github.com/pingcap/tidb/br/pkg/lightning/config" - "github.com/pingcap/tidb/br/pkg/lightning/log" - "github.com/pingcap/tidb/br/pkg/lightning/mydump" - verify "github.com/pingcap/tidb/br/pkg/lightning/verification" - "github.com/pingcap/tidb/br/pkg/version/build" - "github.com/pingcap/tidb/pkg/parser/ast" - "github.com/pingcap/tidb/pkg/types" - "github.com/pingcap/tidb/pkg/util/chunk" - "github.com/pingcap/tidb/pkg/util/sqlexec" - "go.uber.org/zap" -) - -// Session is a wrapper of TiDB's session. -type Session interface { - Close() - Execute(context.Context, string) ([]sqlexec.RecordSet, error) - CommitTxn(context.Context) error - RollbackTxn(context.Context) - PrepareStmt(sql string) (stmtID uint32, paramCount int, fields []*ast.ResultField, err error) - ExecutePreparedStmt(ctx context.Context, stmtID uint32, param []types.Datum) (sqlexec.RecordSet, error) - DropPreparedStmt(stmtID uint32) error -} - -// GlueCheckpointsDB is almost same with MySQLCheckpointsDB, but it uses TiDB's internal data structure which requires a -// lot to keep same with database/sql. -// TODO: Encapsulate Begin/Commit/Rollback txn, form SQL with args and query/iter/scan TiDB's RecordSet into a interface -// to reuse MySQLCheckpointsDB. -type GlueCheckpointsDB struct { - // getSessionFunc will get a new session from TiDB - getSessionFunc func() (Session, error) - schema string -} - -var _ DB = (*GlueCheckpointsDB)(nil) - -// dropPreparedStmt drops the statement and when meet an error, -// print an error message. -func dropPreparedStmt(ctx context.Context, session Session, stmtID uint32) { - if err := session.DropPreparedStmt(stmtID); err != nil { - log.FromContext(ctx).Error("failed to drop prepared statement", log.ShortError(err)) - } -} - -// NewGlueCheckpointsDB creates a new GlueCheckpointsDB. -func NewGlueCheckpointsDB(ctx context.Context, se Session, f func() (Session, error), schemaName string) (*GlueCheckpointsDB, error) { - var escapedSchemaName strings.Builder - common.WriteMySQLIdentifier(&escapedSchemaName, schemaName) - schema := escapedSchemaName.String() - logger := log.FromContext(ctx).With(zap.String("schema", schemaName)) - - sql := fmt.Sprintf(CreateDBTemplate, schema) - err := common.Retry("create checkpoints database", logger, func() error { - _, err := se.Execute(ctx, sql) - return err - }) - if err != nil { - return nil, errors.Trace(err) - } - - sql = fmt.Sprintf(CreateTaskTableTemplate, schema, CheckpointTableNameTask) - err = common.Retry("create task checkpoints table", logger, func() error { - _, err := se.Execute(ctx, sql) - return err - }) - if err != nil { - return nil, errors.Trace(err) - } - - sql = fmt.Sprintf(CreateTableTableTemplate, schema, CheckpointTableNameTable) - err = common.Retry("create table checkpoints table", logger, func() error { - _, err := se.Execute(ctx, sql) - return err - }) - if err != nil { - return nil, errors.Trace(err) - } - - sql = fmt.Sprintf(CreateEngineTableTemplate, schema, CheckpointTableNameEngine) - err = common.Retry("create engine checkpoints table", logger, func() error { - _, err := se.Execute(ctx, sql) - return err - }) - if err != nil { - return nil, errors.Trace(err) - } - - sql = fmt.Sprintf(CreateChunkTableTemplate, schema, CheckpointTableNameChunk) - err = common.Retry("create chunks checkpoints table", logger, func() error { - _, err := se.Execute(ctx, sql) - return err - }) - if err != nil { - return nil, errors.Trace(err) - } - - return &GlueCheckpointsDB{ - getSessionFunc: f, - schema: schema, - }, nil -} - -// Initialize implements CheckpointsDB.Initialize. -func (g GlueCheckpointsDB) Initialize(ctx context.Context, cfg *config.Config, dbInfo map[string]*TidbDBInfo) error { - logger := log.FromContext(ctx) - se, err := g.getSessionFunc() - if err != nil { - return errors.Trace(err) - } - defer se.Close() - - err = Transact(ctx, "insert checkpoints", se, logger, func(c context.Context, s Session) error { - stmtID, _, _, err := s.PrepareStmt(fmt.Sprintf(InitTaskTemplate, g.schema, CheckpointTableNameTask)) - if err != nil { - return errors.Trace(err) - } - defer dropPreparedStmt(ctx, s, stmtID) - _, err = s.ExecutePreparedStmt(c, stmtID, []types.Datum{ - types.NewIntDatum(cfg.TaskID), - types.NewStringDatum(cfg.Mydumper.SourceDir), - types.NewStringDatum(cfg.TikvImporter.Backend), - types.NewStringDatum(cfg.TikvImporter.Addr), - types.NewStringDatum(cfg.TiDB.Host), - types.NewIntDatum(int64(cfg.TiDB.Port)), - types.NewStringDatum(cfg.TiDB.PdAddr), - types.NewStringDatum(cfg.TikvImporter.SortedKVDir), - types.NewStringDatum(build.ReleaseVersion), - }) - if err != nil { - return errors.Trace(err) - } - - stmtID2, _, _, err := s.PrepareStmt(fmt.Sprintf(InitTableTemplate, g.schema, CheckpointTableNameTable)) - if err != nil { - return errors.Trace(err) - } - defer dropPreparedStmt(ctx, s, stmtID2) - - for _, db := range dbInfo { - for _, table := range db.Tables { - tableName := common.UniqueTable(db.Name, table.Name) - _, err = s.ExecutePreparedStmt(c, stmtID2, []types.Datum{ - types.NewIntDatum(cfg.TaskID), - types.NewStringDatum(tableName), - types.NewIntDatum(0), - types.NewIntDatum(table.ID), - }) - if err != nil { - return errors.Trace(err) - } - } - } - return nil - }) - return errors.Trace(err) -} - -// TaskCheckpoint implements CheckpointsDB.TaskCheckpoint. -func (g GlueCheckpointsDB) TaskCheckpoint(ctx context.Context) (*TaskCheckpoint, error) { - logger := log.FromContext(ctx) - sql := fmt.Sprintf(ReadTaskTemplate, g.schema, CheckpointTableNameTask) - se, err := g.getSessionFunc() - if err != nil { - return nil, errors.Trace(err) - } - defer se.Close() - - var taskCp *TaskCheckpoint - err = common.Retry("fetch task checkpoint", logger, func() error { - rs, err := se.Execute(ctx, sql) - if err != nil { - return errors.Trace(err) - } - r := rs[0] - //nolint: errcheck - defer r.Close() - req := r.NewChunk(nil) - err = r.Next(ctx, req) - if err != nil { - return err - } - if req.NumRows() == 0 { - return nil - } - - row := req.GetRow(0) - taskCp = &TaskCheckpoint{} - taskCp.TaskID = row.GetInt64(0) - taskCp.SourceDir = row.GetString(1) - taskCp.Backend = row.GetString(2) - taskCp.ImporterAddr = row.GetString(3) - taskCp.TiDBHost = row.GetString(4) - taskCp.TiDBPort = int(row.GetInt64(5)) - taskCp.PdAddr = row.GetString(6) - taskCp.SortedKVDir = row.GetString(7) - taskCp.LightningVer = row.GetString(8) - return nil - }) - if err != nil { - return nil, errors.Trace(err) - } - return taskCp, nil -} - -// Get implements CheckpointsDB.Get. -func (g GlueCheckpointsDB) Get(ctx context.Context, tableName string) (*TableCheckpoint, error) { - cp := &TableCheckpoint{ - Engines: map[int32]*EngineCheckpoint{}, - } - logger := log.FromContext(ctx).With(zap.String("table", tableName)) - se, err := g.getSessionFunc() - if err != nil { - return nil, errors.Trace(err) - } - defer se.Close() - - tableName = common.InterpolateMySQLString(tableName) - err = Transact(ctx, "read checkpoint", se, logger, func(c context.Context, s Session) error { - // 1. Populate the engines. - sql := fmt.Sprintf(ReadEngineTemplate, g.schema, CheckpointTableNameEngine) - sql = strings.ReplaceAll(sql, "?", tableName) - rs, err := s.Execute(ctx, sql) - if err != nil { - return errors.Trace(err) - } - r := rs[0] - req := r.NewChunk(nil) - it := chunk.NewIterator4Chunk(req) - for { - err = r.Next(ctx, req) - if err != nil { - _ = r.Close() - return err - } - if req.NumRows() == 0 { - break - } - - for row := it.Begin(); row != it.End(); row = it.Next() { - engineID := int32(row.GetInt64(0)) - status := uint8(row.GetUint64(1)) - cp.Engines[engineID] = &EngineCheckpoint{ - Status: CheckpointStatus(status), - } - } - } - _ = r.Close() - - // 2. Populate the chunks. - sql = fmt.Sprintf(ReadChunkTemplate, g.schema, CheckpointTableNameChunk) - sql = strings.ReplaceAll(sql, "?", tableName) - rs, err = s.Execute(ctx, sql) - if err != nil { - return errors.Trace(err) - } - r = rs[0] - req = r.NewChunk(nil) - it = chunk.NewIterator4Chunk(req) - for { - err = r.Next(ctx, req) - if err != nil { - _ = r.Close() - return err - } - if req.NumRows() == 0 { - break - } - - for row := it.Begin(); row != it.End(); row = it.Next() { - value := &ChunkCheckpoint{} - engineID := int32(row.GetInt64(0)) - value.Key.Path = row.GetString(1) - value.Key.Offset = row.GetInt64(2) - value.FileMeta.Type = mydump.SourceType(row.GetInt64(3)) - value.FileMeta.Compression = mydump.Compression(row.GetInt64(4)) - value.FileMeta.SortKey = row.GetString(5) - value.FileMeta.FileSize = row.GetInt64(6) - colPerm := row.GetBytes(7) - value.Chunk.Offset = row.GetInt64(8) - value.Chunk.EndOffset = row.GetInt64(9) - value.Chunk.PrevRowIDMax = row.GetInt64(10) - value.Chunk.RowIDMax = row.GetInt64(11) - kvcBytes := row.GetUint64(12) - kvcKVs := row.GetUint64(13) - kvcChecksum := row.GetUint64(14) - value.Timestamp = row.GetInt64(15) - - value.FileMeta.Path = value.Key.Path - value.Checksum = verify.MakeKVChecksum(kvcBytes, kvcKVs, kvcChecksum) - if err := json.Unmarshal(colPerm, &value.ColumnPermutation); err != nil { - _ = r.Close() - return errors.Trace(err) - } - cp.Engines[engineID].Chunks = append(cp.Engines[engineID].Chunks, value) - } - } - _ = r.Close() - - // 3. Fill in the remaining table info - sql = fmt.Sprintf(ReadTableRemainTemplate, g.schema, CheckpointTableNameTable) - sql = strings.ReplaceAll(sql, "?", tableName) - rs, err = s.Execute(ctx, sql) - if err != nil { - return errors.Trace(err) - } - r = rs[0] - //nolint: errcheck - defer r.Close() - req = r.NewChunk(nil) - err = r.Next(ctx, req) - if err != nil { - return err - } - if req.NumRows() == 0 { - return nil - } - - row := req.GetRow(0) - cp.Status = CheckpointStatus(row.GetUint64(0)) - cp.AllocBase = row.GetInt64(1) - cp.TableID = row.GetInt64(2) - rawTableInfo := row.GetBytes(3) - if err := json.Unmarshal(rawTableInfo, &cp.TableInfo); err != nil { - return errors.Trace(err) - } - return nil - }) - - if err != nil { - return nil, errors.Trace(err) - } - - return cp, nil -} - -// Close implements CheckpointsDB.Close. -func (GlueCheckpointsDB) Close() error { - return nil -} - -// InsertEngineCheckpoints implements CheckpointsDB.InsertEngineCheckpoints. -func (g GlueCheckpointsDB) InsertEngineCheckpoints(ctx context.Context, tableName string, checkpointMap map[int32]*EngineCheckpoint) error { - logger := log.FromContext(ctx).With(zap.String("table", tableName)) - se, err := g.getSessionFunc() - if err != nil { - return errors.Trace(err) - } - defer se.Close() - - err = Transact(ctx, "update engine checkpoints", se, logger, func(c context.Context, s Session) error { - engineStmt, _, _, err := s.PrepareStmt(fmt.Sprintf(ReplaceEngineTemplate, g.schema, CheckpointTableNameEngine)) - if err != nil { - return errors.Trace(err) - } - defer dropPreparedStmt(ctx, s, engineStmt) - - chunkStmt, _, _, err := s.PrepareStmt(fmt.Sprintf(ReplaceChunkTemplate, g.schema, CheckpointTableNameChunk)) - if err != nil { - return errors.Trace(err) - } - defer dropPreparedStmt(ctx, s, chunkStmt) - - for engineID, engine := range checkpointMap { - _, err := s.ExecutePreparedStmt(c, engineStmt, []types.Datum{ - types.NewStringDatum(tableName), - types.NewIntDatum(int64(engineID)), - types.NewUintDatum(uint64(engine.Status)), - }) - if err != nil { - return errors.Trace(err) - } - for _, value := range engine.Chunks { - columnPerm, err := json.Marshal(value.ColumnPermutation) - if err != nil { - return errors.Trace(err) - } - _, err = s.ExecutePreparedStmt(c, chunkStmt, []types.Datum{ - types.NewStringDatum(tableName), - types.NewIntDatum(int64(engineID)), - types.NewStringDatum(value.Key.Path), - types.NewIntDatum(value.Key.Offset), - types.NewIntDatum(int64(value.FileMeta.Type)), - types.NewIntDatum(int64(value.FileMeta.Compression)), - types.NewStringDatum(value.FileMeta.SortKey), - types.NewIntDatum(value.FileMeta.FileSize), - types.NewBytesDatum(columnPerm), - types.NewIntDatum(value.Chunk.Offset), - types.NewIntDatum(value.Chunk.EndOffset), - types.NewIntDatum(value.Chunk.PrevRowIDMax), - types.NewIntDatum(value.Chunk.RowIDMax), - types.NewIntDatum(value.Timestamp), - }) - if err != nil { - return errors.Trace(err) - } - } - } - return nil - }) - return errors.Trace(err) -} - -// Update implements CheckpointsDB.Update. -func (g GlueCheckpointsDB) Update(ctx context.Context, checkpointDiffs map[string]*TableCheckpointDiff) error { - logger := log.FromContext(ctx) - se, err := g.getSessionFunc() - if err != nil { - log.FromContext(ctx).Error("can't get a session to update GlueCheckpointsDB", zap.Error(errors.Trace(err))) - return err - } - defer se.Close() - - chunkQuery := fmt.Sprintf(UpdateChunkTemplate, g.schema, CheckpointTableNameChunk) - rebaseQuery := fmt.Sprintf(UpdateTableRebaseTemplate, g.schema, CheckpointTableNameTable) - tableStatusQuery := fmt.Sprintf(UpdateTableStatusTemplate, g.schema, CheckpointTableNameTable) - engineStatusQuery := fmt.Sprintf(UpdateEngineTemplate, g.schema, CheckpointTableNameEngine) - return Transact(context.Background(), "update checkpoints", se, logger, func(c context.Context, s Session) error { - chunkStmt, _, _, err := s.PrepareStmt(chunkQuery) - if err != nil { - return errors.Trace(err) - } - defer dropPreparedStmt(ctx, s, chunkStmt) - rebaseStmt, _, _, err := s.PrepareStmt(rebaseQuery) - if err != nil { - return errors.Trace(err) - } - defer dropPreparedStmt(ctx, s, rebaseStmt) - tableStatusStmt, _, _, err := s.PrepareStmt(tableStatusQuery) - if err != nil { - return errors.Trace(err) - } - defer dropPreparedStmt(ctx, s, tableStatusStmt) - engineStatusStmt, _, _, err := s.PrepareStmt(engineStatusQuery) - if err != nil { - return errors.Trace(err) - } - defer dropPreparedStmt(ctx, s, engineStatusStmt) - - for tableName, cpd := range checkpointDiffs { - if cpd.hasStatus { - _, err := s.ExecutePreparedStmt(c, tableStatusStmt, []types.Datum{ - types.NewUintDatum(uint64(cpd.status)), - types.NewStringDatum(tableName), - }) - if err != nil { - return errors.Trace(err) - } - } - if cpd.hasRebase { - _, err := s.ExecutePreparedStmt(c, rebaseStmt, []types.Datum{ - types.NewIntDatum(cpd.allocBase), - types.NewStringDatum(tableName), - }) - if err != nil { - return errors.Trace(err) - } - } - for engineID, engineDiff := range cpd.engines { - if engineDiff.hasStatus { - _, err := s.ExecutePreparedStmt(c, engineStatusStmt, []types.Datum{ - types.NewUintDatum(uint64(engineDiff.status)), - types.NewStringDatum(tableName), - types.NewIntDatum(int64(engineID)), - }) - if err != nil { - return errors.Trace(err) - } - } - for key, diff := range engineDiff.chunks { - columnPerm, err := json.Marshal(diff.columnPermutation) - if err != nil { - return errors.Trace(err) - } - _, err = s.ExecutePreparedStmt(c, chunkStmt, []types.Datum{ - types.NewIntDatum(diff.pos), - types.NewIntDatum(diff.rowID), - types.NewUintDatum(diff.checksum.SumSize()), - types.NewUintDatum(diff.checksum.SumKVS()), - types.NewUintDatum(diff.checksum.Sum()), - types.NewBytesDatum(columnPerm), - types.NewStringDatum(tableName), - types.NewIntDatum(int64(engineID)), - types.NewStringDatum(key.Path), - types.NewIntDatum(key.Offset), - }) - if err != nil { - return errors.Trace(err) - } - } - } - } - return nil - }) -} - -// RemoveCheckpoint implements CheckpointsDB.RemoveCheckpoint. -func (g GlueCheckpointsDB) RemoveCheckpoint(ctx context.Context, tableName string) error { - logger := log.FromContext(ctx).With(zap.String("table", tableName)) - se, err := g.getSessionFunc() - if err != nil { - return errors.Trace(err) - } - defer se.Close() - - if tableName == allTables { - return common.Retry("remove all checkpoints", logger, func() error { - _, err := se.Execute(ctx, "DROP SCHEMA "+g.schema) - return err - }) - } - tableName = common.InterpolateMySQLString(tableName) - deleteChunkQuery := fmt.Sprintf(DeleteCheckpointRecordTemplate, g.schema, CheckpointTableNameChunk) - deleteChunkQuery = strings.ReplaceAll(deleteChunkQuery, "?", tableName) - deleteEngineQuery := fmt.Sprintf(DeleteCheckpointRecordTemplate, g.schema, CheckpointTableNameEngine) - deleteEngineQuery = strings.ReplaceAll(deleteEngineQuery, "?", tableName) - deleteTableQuery := fmt.Sprintf(DeleteCheckpointRecordTemplate, g.schema, CheckpointTableNameTable) - deleteTableQuery = strings.ReplaceAll(deleteTableQuery, "?", tableName) - - return errors.Trace(Transact(ctx, "remove checkpoints", se, logger, func(c context.Context, s Session) error { - if _, e := s.Execute(c, deleteChunkQuery); e != nil { - return e - } - if _, e := s.Execute(c, deleteEngineQuery); e != nil { - return e - } - if _, e := s.Execute(c, deleteTableQuery); e != nil { - return e - } - return nil - })) -} - -// MoveCheckpoints implements CheckpointsDB.MoveCheckpoints. -func (g GlueCheckpointsDB) MoveCheckpoints(ctx context.Context, taskID int64) error { - newSchema := fmt.Sprintf("`%s.%d.bak`", g.schema[1:len(g.schema)-1], taskID) - logger := log.FromContext(ctx).With(zap.Int64("taskID", taskID)) - se, err := g.getSessionFunc() - if err != nil { - return errors.Trace(err) - } - defer se.Close() - - err = common.Retry("create backup checkpoints schema", logger, func() error { - _, err := se.Execute(ctx, "CREATE SCHEMA IF NOT EXISTS "+newSchema) - return err - }) - if err != nil { - return errors.Trace(err) - } - for _, tbl := range []string{ - CheckpointTableNameChunk, CheckpointTableNameEngine, - CheckpointTableNameTable, CheckpointTableNameTask, - } { - query := fmt.Sprintf("RENAME TABLE %[1]s.%[3]s TO %[2]s.%[3]s", g.schema, newSchema, tbl) - err := common.Retry(fmt.Sprintf("move %s checkpoints table", tbl), logger, func() error { - _, err := se.Execute(ctx, query) - return err - }) - if err != nil { - return errors.Trace(err) - } - } - return nil -} - -// GetLocalStoringTables implements CheckpointsDB.GetLocalStoringTables. -func (g GlueCheckpointsDB) GetLocalStoringTables(ctx context.Context) (map[string][]int32, error) { - se, err := g.getSessionFunc() - if err != nil { - return nil, errors.Trace(err) - } - defer se.Close() - - var targetTables map[string][]int32 - - // lightning didn't check CheckpointStatusMaxInvalid before this function is called, so we skip invalid ones - // engines should exist if - // 1. table status is earlier than CheckpointStatusIndexImported, and - // 2. engine status is earlier than CheckpointStatusImported, and - // 3. chunk has been read - query := fmt.Sprintf(` - SELECT DISTINCT t.table_name, c.engine_id - FROM %s.%s t, %s.%s c, %s.%s e - WHERE t.table_name = c.table_name AND t.table_name = e.table_name AND c.engine_id = e.engine_id - AND %d < t.status AND t.status < %d - AND %d < e.status AND e.status < %d - AND c.pos > c.offset;`, - g.schema, CheckpointTableNameTable, g.schema, CheckpointTableNameChunk, g.schema, CheckpointTableNameEngine, - CheckpointStatusMaxInvalid, CheckpointStatusIndexImported, - CheckpointStatusMaxInvalid, CheckpointStatusImported) - - err = common.Retry("get local storing tables", log.FromContext(ctx), func() error { - targetTables = make(map[string][]int32) - rs, err := se.Execute(ctx, query) - if err != nil { - return errors.Trace(err) - } - rows, err := drainFirstRecordSet(ctx, rs) - if err != nil { - return errors.Trace(err) - } - - for _, row := range rows { - tableName := row.GetString(0) - engineID := int32(row.GetInt64(1)) - targetTables[tableName] = append(targetTables[tableName], engineID) - } - return nil - }) - if err != nil { - return nil, errors.Trace(err) - } - - return targetTables, err -} - -// IgnoreErrorCheckpoint implements CheckpointsDB.IgnoreErrorCheckpoint. -func (g GlueCheckpointsDB) IgnoreErrorCheckpoint(ctx context.Context, tableName string) error { - logger := log.FromContext(ctx).With(zap.String("table", tableName)) - se, err := g.getSessionFunc() - if err != nil { - return errors.Trace(err) - } - defer se.Close() - - var colName string - if tableName == allTables { - // This will expand to `WHERE 'all' = 'all'` and effectively allowing - // all tables to be included. - colName = stringLitAll - } else { - colName = columnTableName - } - - tableName = common.InterpolateMySQLString(tableName) - - engineQuery := fmt.Sprintf(` - UPDATE %s.%s SET status = %d WHERE %s = %s AND status <= %d; - `, g.schema, CheckpointTableNameEngine, CheckpointStatusLoaded, colName, tableName, CheckpointStatusMaxInvalid) - tableQuery := fmt.Sprintf(` - UPDATE %s.%s SET status = %d WHERE %s = %s AND status <= %d; - `, g.schema, CheckpointTableNameTable, CheckpointStatusLoaded, colName, tableName, CheckpointStatusMaxInvalid) - return errors.Trace(Transact(ctx, "ignore error checkpoints", se, logger, func(c context.Context, s Session) error { - if _, e := s.Execute(c, engineQuery); e != nil { - return e - } - if _, e := s.Execute(c, tableQuery); e != nil { - return e - } - return nil - })) -} - -// DestroyErrorCheckpoint implements CheckpointsDB.DestroyErrorCheckpoint. -func (g GlueCheckpointsDB) DestroyErrorCheckpoint(ctx context.Context, tableName string) ([]DestroyedTableCheckpoint, error) { - logger := log.FromContext(ctx).With(zap.String("table", tableName)) - se, err := g.getSessionFunc() - if err != nil { - return nil, errors.Trace(err) - } - defer se.Close() - - var colName, aliasedColName string - - if tableName == allTables { - // These will expand to `WHERE 'all' = 'all'` and effectively allowing - // all tables to be included. - colName = stringLitAll - aliasedColName = stringLitAll - } else { - colName = columnTableName - aliasedColName = "t.table_name" - } - - tableName = common.InterpolateMySQLString(tableName) - - selectQuery := fmt.Sprintf(` - SELECT - t.table_name, - COALESCE(MIN(e.engine_id), 0), - COALESCE(MAX(e.engine_id), -1) - FROM %[1]s.%[4]s t - LEFT JOIN %[1]s.%[5]s e ON t.table_name = e.table_name - WHERE %[2]s = %[6]s AND t.status <= %[3]d - GROUP BY t.table_name; - `, g.schema, aliasedColName, CheckpointStatusMaxInvalid, CheckpointTableNameTable, CheckpointTableNameEngine, tableName) - deleteChunkQuery := fmt.Sprintf(` - DELETE FROM %[1]s.%[4]s WHERE table_name IN (SELECT table_name FROM %[1]s.%[5]s WHERE %[2]s = %[6]s AND status <= %[3]d) - `, g.schema, colName, CheckpointStatusMaxInvalid, CheckpointTableNameChunk, CheckpointTableNameTable, tableName) - deleteEngineQuery := fmt.Sprintf(` - DELETE FROM %[1]s.%[4]s WHERE table_name IN (SELECT table_name FROM %[1]s.%[5]s WHERE %[2]s = %[6]s AND status <= %[3]d) - `, g.schema, colName, CheckpointStatusMaxInvalid, CheckpointTableNameEngine, CheckpointTableNameTable, tableName) - deleteTableQuery := fmt.Sprintf(` - DELETE FROM %s.%s WHERE %s = %s AND status <= %d - `, g.schema, CheckpointTableNameTable, colName, tableName, CheckpointStatusMaxInvalid) - - var targetTables []DestroyedTableCheckpoint - err = Transact(ctx, "destroy error checkpoints", se, logger, func(c context.Context, s Session) error { - // clean because it's in a retry - targetTables = nil - rs, err := s.Execute(c, selectQuery) - if err != nil { - return errors.Trace(err) - } - r := rs[0] - req := r.NewChunk(nil) - it := chunk.NewIterator4Chunk(req) - for { - err = r.Next(ctx, req) - if err != nil { - _ = r.Close() - return err - } - if req.NumRows() == 0 { - break - } - - for row := it.Begin(); row != it.End(); row = it.Next() { - var dtc DestroyedTableCheckpoint - dtc.TableName = row.GetString(0) - dtc.MinEngineID = int32(row.GetInt64(1)) - dtc.MaxEngineID = int32(row.GetInt64(2)) - targetTables = append(targetTables, dtc) - } - } - _ = r.Close() - - if _, e := s.Execute(c, deleteChunkQuery); e != nil { - return errors.Trace(e) - } - if _, e := s.Execute(c, deleteEngineQuery); e != nil { - return errors.Trace(e) - } - if _, e := s.Execute(c, deleteTableQuery); e != nil { - return errors.Trace(e) - } - return nil - }) - - if err != nil { - return nil, errors.Trace(err) - } - - return targetTables, nil -} - -// DumpTables implements CheckpointsDB.DumpTables. -func (GlueCheckpointsDB) DumpTables(_ context.Context, _ io.Writer) error { - return errors.Errorf("dumping glue checkpoint into CSV not unsupported") -} - -// DumpEngines implements CheckpointsDB.DumpEngines. -func (GlueCheckpointsDB) DumpEngines(_ context.Context, _ io.Writer) error { - return errors.Errorf("dumping glue checkpoint into CSV not unsupported") -} - -// DumpChunks implements CheckpointsDB.DumpChunks. -func (GlueCheckpointsDB) DumpChunks(_ context.Context, _ io.Writer) error { - return errors.Errorf("dumping glue checkpoint into CSV not unsupported") -} - -// Transact is a helper function to execute a transaction. -func Transact(ctx context.Context, purpose string, s Session, logger log.Logger, action func(context.Context, Session) error) error { - return common.Retry(purpose, logger, func() error { - _, err := s.Execute(ctx, "BEGIN") - if err != nil { - return errors.Annotate(err, "begin transaction failed") - } - err = action(ctx, s) - if err != nil { - s.RollbackTxn(ctx) - return err - } - err = s.CommitTxn(ctx) - if err != nil { - return errors.Annotate(err, "commit transaction failed") - } - return nil - }) -} - -// TODO: will use drainFirstRecordSet to reduce repeat in GlueCheckpointsDB later -func drainFirstRecordSet(ctx context.Context, rss []sqlexec.RecordSet) ([]chunk.Row, error) { - if len(rss) != 1 { - return nil, errors.New("given result set doesn't have length 1") - } - rs := rss[0] - var rows []chunk.Row - req := rs.NewChunk(nil) - for { - err := rs.Next(ctx, req) - if err != nil || req.NumRows() == 0 { - _ = rs.Close() - return rows, err - } - iter := chunk.NewIterator4Chunk(req) - for r := iter.Begin(); r != iter.End(); r = iter.Next() { - rows = append(rows, r) - } - req = chunk.Renew(req, 1024) - } -} diff --git a/br/pkg/lightning/checkpoints/main_test.go b/br/pkg/lightning/checkpoints/main_test.go index 7fa4555bbb116..74ce3b9eb0c10 100644 --- a/br/pkg/lightning/checkpoints/main_test.go +++ b/br/pkg/lightning/checkpoints/main_test.go @@ -25,6 +25,7 @@ func TestMain(m *testing.M) { testsetup.SetupForCommonTest() opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("github.com/klauspost/compress/zstd.(*blockDec).startDecoder"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), diff --git a/br/pkg/lightning/common/BUILD.bazel b/br/pkg/lightning/common/BUILD.bazel index ce66efd91bf09..6fdc16688a869 100644 --- a/br/pkg/lightning/common/BUILD.bazel +++ b/br/pkg/lightning/common/BUILD.bazel @@ -136,7 +136,6 @@ go_test( "@com_github_stretchr_testify//assert", "@com_github_stretchr_testify//require", "@com_github_tikv_pd_client//http", - "@io_etcd_go_etcd_client_v3//:client", "@org_golang_google_grpc//codes", "@org_golang_google_grpc//status", "@org_uber_go_goleak//:goleak", diff --git a/br/pkg/lightning/common/common_test.go b/br/pkg/lightning/common/common_test.go index 419768f3c42d7..3b5cf002ac762 100644 --- a/br/pkg/lightning/common/common_test.go +++ b/br/pkg/lightning/common/common_test.go @@ -30,7 +30,6 @@ import ( "github.com/pingcap/tidb/pkg/store/mockstore" tmock "github.com/pingcap/tidb/pkg/util/mock" "github.com/stretchr/testify/require" - clientv3 "go.etcd.io/etcd/client/v3" ) func newTableInfo(t *testing.T, @@ -52,7 +51,7 @@ func newTableInfo(t *testing.T, if err := m.CreateDatabase(&model.DBInfo{ID: dbID}); err != nil && !errors.ErrorEqual(err, meta.ErrDBExists) { return err } - return m.CreateTableOrView(dbID, tableInfo) + return m.CreateTableOrView(dbID, "", tableInfo) }) require.NoError(t, err) return tableInfo @@ -169,7 +168,7 @@ func (r mockRequirement) Store() kv.Storage { return r.Storage } -func (r mockRequirement) GetEtcdClient() *clientv3.Client { +func (r mockRequirement) AutoIDClient() *autoid.ClientDiscover { return nil } diff --git a/br/pkg/lightning/common/main_test.go b/br/pkg/lightning/common/main_test.go index 476b2537d9743..c91ae4fa8a4ed 100644 --- a/br/pkg/lightning/common/main_test.go +++ b/br/pkg/lightning/common/main_test.go @@ -25,8 +25,12 @@ func TestMain(m *testing.M) { testsetup.SetupForCommonTest() opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), + goleak.IgnoreTopFunction("net.(*Resolver).lookupIPAddr.func2"), + goleak.IgnoreTopFunction("net.(*Resolver).goLookupIPCNAMEOrder.func4"), + goleak.IgnoreTopFunction("internal/poll.runtime_pollWait"), } goleak.VerifyTestMain(m, opts...) } diff --git a/br/pkg/lightning/common/util.go b/br/pkg/lightning/common/util.go index 39a0c8f9fa363..45c4ed9330551 100644 --- a/br/pkg/lightning/common/util.go +++ b/br/pkg/lightning/common/util.go @@ -313,6 +313,26 @@ func UniqueTable(schema string, table string) string { return builder.String() } +func escapeIdentifiers(identifier []string) []any { + escaped := make([]any, len(identifier)) + for i, id := range identifier { + escaped[i] = EscapeIdentifier(id) + } + return escaped +} + +// SprintfWithIdentifiers escapes the identifiers and sprintf them. The input +// identifiers must not be escaped. +func SprintfWithIdentifiers(format string, identifiers ...string) string { + return fmt.Sprintf(format, escapeIdentifiers(identifiers)...) +} + +// FprintfWithIdentifiers escapes the identifiers and fprintf them. The input +// identifiers must not be escaped. +func FprintfWithIdentifiers(w io.Writer, format string, identifiers ...string) (int, error) { + return fmt.Fprintf(w, format, escapeIdentifiers(identifiers)...) +} + // EscapeIdentifier quote and escape an sql identifier func EscapeIdentifier(identifier string) string { var builder strings.Builder @@ -525,11 +545,11 @@ loop: } // BuildDropIndexSQL builds the SQL statement to drop index. -func BuildDropIndexSQL(tableName string, idxInfo *model.IndexInfo) string { +func BuildDropIndexSQL(dbName, tableName string, idxInfo *model.IndexInfo) string { if idxInfo.Primary { - return fmt.Sprintf("ALTER TABLE %s DROP PRIMARY KEY", tableName) + return SprintfWithIdentifiers("ALTER TABLE %s.%s DROP PRIMARY KEY", dbName, tableName) } - return fmt.Sprintf("ALTER TABLE %s DROP INDEX %s", tableName, EscapeIdentifier(idxInfo.Name.O)) + return SprintfWithIdentifiers("ALTER TABLE %s.%s DROP INDEX %s", dbName, tableName, idxInfo.Name.O) } // BuildAddIndexSQL builds the SQL statement to create missing indexes. diff --git a/br/pkg/lightning/config/bytesize_test.go b/br/pkg/lightning/config/bytesize_test.go index 46968777056e5..bb76cd11b25a7 100644 --- a/br/pkg/lightning/config/bytesize_test.go +++ b/br/pkg/lightning/config/bytesize_test.go @@ -61,7 +61,7 @@ func TestByteSizeTOMLDecode(t *testing.T) { }, { input: "x = 'invalid value'", - err: "invalid size: 'invalid value'", + err: "strconv.ParseFloat: parsing \"invalid\": invalid syntax", }, { input: "x = true", @@ -85,7 +85,7 @@ func TestByteSizeTOMLDecode(t *testing.T) { }, { input: "x = 2020-01-01T00:00:00Z", - err: "invalid size: '2020-01-01T00:00:00Z'", + err: "strconv.ParseFloat: parsing \"2020-01-01T00:00:00\": invalid syntax", }, { input: "x = ['100000']", diff --git a/br/pkg/lightning/config/config.go b/br/pkg/lightning/config/config.go index 9367c984b98d3..b3bbd66fa33af 100644 --- a/br/pkg/lightning/config/config.go +++ b/br/pkg/lightning/config/config.go @@ -187,7 +187,7 @@ func (d *DBStore) adjust( if d.Security.TLSConfig == nil { /* #nosec G402 */ d.Security.TLSConfig = &tls.Config{ - MinVersion: tls.VersionTLS10, + MinVersion: tls.VersionTLS12, InsecureSkipVerify: true, NextProtos: []string{"h2", "http/1.1"}, // specify `h2` to let Go use HTTP/2. } @@ -215,8 +215,18 @@ func (d *DBStore) adjust( d.Port = int(settings.Port) } if len(d.PdAddr) == 0 { + // verify that it is not a empty string pdAddrs := strings.Split(settings.Path, ",") - d.PdAddr = pdAddrs[0] // FIXME support multiple PDs once importer can. + for _, ip := range pdAddrs { + ipPort := strings.Split(ip, ":") + if len(ipPort[0]) == 0 { + return common.ErrInvalidConfig.GenWithStack("invalid `tidb.pd-addr` setting") + } + if len(ipPort[1]) == 0 || ipPort[1] == "0" { + return common.ErrInvalidConfig.GenWithStack("invalid `tidb.port` setting") + } + } + d.PdAddr = settings.Path } } @@ -1070,6 +1080,7 @@ type TikvImporter struct { StoreWriteBWLimit ByteSize `toml:"store-write-bwlimit" json:"store-write-bwlimit"` // default is PausePDSchedulerScopeTable to compatible with previous version(>= 6.1) PausePDSchedulerScope PausePDSchedulerScope `toml:"pause-pd-scheduler-scope" json:"pause-pd-scheduler-scope"` + BlockSize ByteSize `toml:"block-size" json:"block-size"` } func (t *TikvImporter) adjust() error { @@ -1336,9 +1347,9 @@ func (c *Conflict) adjust(i *TikvImporter, l *Lightning) error { "unsupported `%s` (%s)", strategyConfigFrom, c.Strategy) } if c.Strategy != "" { - if i.ParallelImport { + if i.ParallelImport && i.Backend == BackendLocal { return common.ErrInvalidConfig.GenWithStack( - "%s cannot be used with tikv-importer.parallel-import", + `%s cannot be used with tikv-importer.parallel-import and tikv-importer.backend = "local"`, strategyConfigFrom) } if i.DuplicateResolution != DupeResAlgNone { @@ -1457,6 +1468,7 @@ func NewConfig() *Config { DiskQuota: ByteSize(math.MaxInt64), DuplicateResolution: DupeResAlgNone, PausePDSchedulerScope: PausePDSchedulerScopeTable, + BlockSize: 16 * 1024, }, PostRestore: PostRestore{ Checksum: OpLevelRequired, diff --git a/br/pkg/lightning/config/config_test.go b/br/pkg/lightning/config/config_test.go index 19ef66b8aeed9..1a1386ff75849 100644 --- a/br/pkg/lightning/config/config_test.go +++ b/br/pkg/lightning/config/config_test.go @@ -79,7 +79,7 @@ func TestAdjustPdAddrAndPort(t *testing.T) { err := cfg.Adjust(context.Background()) require.NoError(t, err) require.Equal(t, 4444, cfg.TiDB.Port) - require.Equal(t, "123.45.67.89:1234", cfg.TiDB.PdAddr) + require.Equal(t, "123.45.67.89:1234,56.78.90.12:3456", cfg.TiDB.PdAddr) } func TestPausePDSchedulerScope(t *testing.T) { @@ -273,6 +273,7 @@ func TestInvalidSetting(t *testing.T) { cfg.TikvImporter.SortedKVDir = "." cfg.TiDB.DistSQLScanConcurrency = 1 cfg.Mydumper.SourceDir = "." + cfg.TiDB.PdAddr = "234.56.78.90:12345" err := cfg.Adjust(context.Background()) require.EqualError(t, err, "[Lightning:Config:ErrInvalidConfig]invalid `tidb.port` setting") @@ -986,7 +987,11 @@ func TestAdjustConflictStrategy(t *testing.T) { cfg.TikvImporter.Backend = BackendLocal cfg.Conflict.Strategy = ReplaceOnDup cfg.TikvImporter.ParallelImport = true - require.ErrorContains(t, cfg.Adjust(ctx), "conflict.strategy cannot be used with tikv-importer.parallel-import") + require.ErrorContains(t, cfg.Adjust(ctx), `conflict.strategy cannot be used with tikv-importer.parallel-import and tikv-importer.backend = "local"`) + + cfg.TikvImporter.Backend = BackendTiDB + cfg.Conflict.Strategy = IgnoreOnDup + require.NoError(t, cfg.Adjust(ctx)) cfg.TikvImporter.Backend = BackendLocal cfg.Conflict.Strategy = ReplaceOnDup diff --git a/br/pkg/lightning/errormanager/errormanager.go b/br/pkg/lightning/errormanager/errormanager.go index 80d1ab32df5a6..b92785762b4d8 100644 --- a/br/pkg/lightning/errormanager/errormanager.go +++ b/br/pkg/lightning/errormanager/errormanager.go @@ -170,7 +170,7 @@ const ( type ErrorManager struct { db *sql.DB taskID int64 - schemaEscaped string + schema string configError *config.MaxError remainingError config.MaxError @@ -229,7 +229,7 @@ func New(db *sql.DB, cfg *config.Config, logger log.Logger) *ErrorManager { } if len(cfg.App.TaskInfoSchemaName) != 0 { em.db = db - em.schemaEscaped = common.EscapeIdentifier(cfg.App.TaskInfoSchemaName) + em.schema = cfg.App.TaskInfoSchemaName } return em } @@ -267,7 +267,7 @@ func (em *ErrorManager) Init(ctx context.Context) error { for _, sql := range sqls { // trim spaces for unit test pattern matching - err := exec.Exec(ctx, sql[0], strings.TrimSpace(fmt.Sprintf(sql[1], em.schemaEscaped))) + err := exec.Exec(ctx, sql[0], strings.TrimSpace(common.SprintfWithIdentifiers(sql[1], em.schema))) if err != nil { return err } @@ -312,7 +312,7 @@ func (em *ErrorManager) RecordTypeError( HideQueryLog: redact.NeedRedact(), } if err := exec.Exec(ctx, "insert type error record", - fmt.Sprintf(insertIntoTypeError, em.schemaEscaped), + common.SprintfWithIdentifiers(insertIntoTypeError, em.schema), em.taskID, tableName, path, @@ -366,7 +366,10 @@ func (em *ErrorManager) RecordDataConflictError( } if err := exec.Transact(ctx, "insert data conflict error record", func(c context.Context, txn *sql.Tx) error { sb := &strings.Builder{} - fmt.Fprintf(sb, insertIntoConflictErrorData, em.schemaEscaped) + _, err := common.FprintfWithIdentifiers(sb, insertIntoConflictErrorData, em.schema) + if err != nil { + return err + } var sqlArgs []interface{} for i, conflictInfo := range conflictInfos { if i > 0 { @@ -383,7 +386,7 @@ func (em *ErrorManager) RecordDataConflictError( tablecodec.IsRecordKey(conflictInfo.RawKey), ) } - _, err := txn.ExecContext(c, sb.String(), sqlArgs...) + _, err = txn.ExecContext(c, sb.String(), sqlArgs...) return err }); err != nil { gerr = err @@ -425,7 +428,10 @@ func (em *ErrorManager) RecordIndexConflictError( } if err := exec.Transact(ctx, "insert index conflict error record", func(c context.Context, txn *sql.Tx) error { sb := &strings.Builder{} - fmt.Fprintf(sb, insertIntoConflictErrorIndex, em.schemaEscaped) + _, err := common.FprintfWithIdentifiers(sb, insertIntoConflictErrorIndex, em.schema) + if err != nil { + return err + } var sqlArgs []interface{} for i, conflictInfo := range conflictInfos { if i > 0 { @@ -445,7 +451,7 @@ func (em *ErrorManager) RecordIndexConflictError( tablecodec.IsRecordKey(conflictInfo.RawKey), ) } - _, err := txn.ExecContext(c, sb.String(), sqlArgs...) + _, err = txn.ExecContext(c, sb.String(), sqlArgs...) return err }); err != nil { gerr = err @@ -487,7 +493,7 @@ func (em *ErrorManager) RemoveAllConflictKeys( var handleRows [][2][]byte for start < end { rows, err := em.db.QueryContext( - gCtx, fmt.Sprintf(selectConflictKeysRemove, em.schemaEscaped), + gCtx, common.SprintfWithIdentifiers(selectConflictKeysRemove, em.schema), tableName, start, end, rowLimit) if err != nil { return errors.Trace(err) @@ -567,7 +573,7 @@ func (em *ErrorManager) ReplaceConflictKeys( // demo for "replace" algorithm: https://github.com/lyzx2001/tidb-conflict-replace // check index KV indexKvRows, err := em.db.QueryContext( - gCtx, fmt.Sprintf(selectIndexConflictKeysReplace, em.schemaEscaped), + gCtx, common.SprintfWithIdentifiers(selectIndexConflictKeysReplace, em.schema), tableName) if err != nil { return errors.Trace(err) @@ -666,7 +672,10 @@ func (em *ErrorManager) ReplaceConflictKeys( if err := exec.Transact(ctx, "insert data conflict error record for conflict detection 'replace' mode", func(c context.Context, txn *sql.Tx) error { sb := &strings.Builder{} - fmt.Fprintf(sb, insertIntoConflictErrorData, em.schemaEscaped) + _, err2 := common.FprintfWithIdentifiers(sb, insertIntoConflictErrorData, em.schema) + if err2 != nil { + return err2 + } var sqlArgs []interface{} sb.WriteString(sqlValuesConflictErrorData) sqlArgs = append(sqlArgs, @@ -696,7 +705,7 @@ func (em *ErrorManager) ReplaceConflictKeys( // check data KV dataKvRows, err := em.db.QueryContext( - gCtx, fmt.Sprintf(selectDataConflictKeysReplace, em.schemaEscaped), + gCtx, common.SprintfWithIdentifiers(selectDataConflictKeysReplace, em.schema), tableName) if err != nil { return errors.Trace(err) @@ -872,7 +881,7 @@ func (em *ErrorManager) recordDuplicate( HideQueryLog: redact.NeedRedact(), } return exec.Exec(ctx, "insert duplicate record", - fmt.Sprintf(insertIntoDupRecord, em.schemaEscaped), + common.SprintfWithIdentifiers(insertIntoDupRecord, em.schema), em.taskID, tableName, path, @@ -974,7 +983,7 @@ func (em *ErrorManager) LogErrorDetails() { } func (em *ErrorManager) fmtTableName(t string) string { - return fmt.Sprintf("%s.`%s`", em.schemaEscaped, t) + return common.UniqueTable(em.schema, t) } // Output renders a table which contains error summery for each error type. diff --git a/br/pkg/lightning/errormanager/errormanager_test.go b/br/pkg/lightning/errormanager/errormanager_test.go index 0cfa3345de1bc..5745cbfb5de70 100644 --- a/br/pkg/lightning/errormanager/errormanager_test.go +++ b/br/pkg/lightning/errormanager/errormanager_test.go @@ -623,7 +623,7 @@ func TestErrorMgrErrorOutput(t *testing.T) { remainingError: cfg.App.MaxError, configConflict: &cfg.Conflict, conflictErrRemain: atomic.NewInt64(100), - schemaEscaped: "`error_info`", + schema: "error_info", conflictV1Enabled: true, } diff --git a/br/pkg/lightning/importer/BUILD.bazel b/br/pkg/lightning/importer/BUILD.bazel index 3c7a9ce68ab38..5d23ec67edca6 100644 --- a/br/pkg/lightning/importer/BUILD.bazel +++ b/br/pkg/lightning/importer/BUILD.bazel @@ -62,7 +62,6 @@ go_library( "//pkg/sessionctx/variable", "//pkg/store/driver", "//pkg/store/driver/txn", - "//pkg/store/pdtypes", "//pkg/table", "//pkg/table/tables", "//pkg/tablecodec", @@ -118,6 +117,7 @@ go_test( "table_import_test.go", "tidb_test.go", ], + data = glob(["testdata/**"]), embed = [":importer"], flaky = True, shard_count = 50, @@ -155,7 +155,6 @@ go_test( "//pkg/parser/model", "//pkg/parser/mysql", "//pkg/store/mockstore", - "//pkg/store/pdtypes", "//pkg/table/tables", "//pkg/tablecodec", "//pkg/types", @@ -172,11 +171,9 @@ go_test( "@com_github_google_uuid//:uuid", "@com_github_pingcap_errors//:errors", "@com_github_pingcap_failpoint//:failpoint", - "@com_github_pingcap_kvproto//pkg/metapb", "@com_github_stretchr_testify//require", "@com_github_stretchr_testify//suite", "@com_github_tikv_client_go_v2//config", - "@com_github_tikv_client_go_v2//testutils", "@com_github_tikv_pd_client//:client", "@com_github_tikv_pd_client//http", "@com_github_xitongsys_parquet_go//writer", diff --git a/br/pkg/lightning/importer/checksum_helper.go b/br/pkg/lightning/importer/checksum_helper.go index c1dee11e62f4f..efad3d6c7a349 100644 --- a/br/pkg/lightning/importer/checksum_helper.go +++ b/br/pkg/lightning/importer/checksum_helper.go @@ -36,7 +36,7 @@ func NewChecksumManager(ctx context.Context, rc *Controller, store kv.Storage) ( return nil, nil } - pdVersion, err := pdutil.FetchPDVersion(ctx, rc.tls, rc.pdCli.GetLeaderAddr()) + pdVersion, err := pdutil.FetchPDVersion(ctx, rc.pdHTTPCli) if err != nil { return nil, errors.Trace(err) } diff --git a/br/pkg/lightning/importer/get_pre_info.go b/br/pkg/lightning/importer/get_pre_info.go index b7f0ac04cb8e1..114bd642b36a3 100644 --- a/br/pkg/lightning/importer/get_pre_info.go +++ b/br/pkg/lightning/importer/get_pre_info.go @@ -45,12 +45,10 @@ import ( "github.com/pingcap/tidb/pkg/parser/ast" "github.com/pingcap/tidb/pkg/parser/model" _ "github.com/pingcap/tidb/pkg/planner/core" // to setup expression.EvalAstExpr. Otherwise we cannot parse the default value - "github.com/pingcap/tidb/pkg/store/pdtypes" "github.com/pingcap/tidb/pkg/table/tables" "github.com/pingcap/tidb/pkg/types" "github.com/pingcap/tidb/pkg/util/dbterror" "github.com/pingcap/tidb/pkg/util/mock" - pd "github.com/tikv/pd/client" pdhttp "github.com/tikv/pd/client/http" "go.uber.org/zap" "golang.org/x/exp/maps" @@ -100,12 +98,12 @@ type TargetInfoGetter interface { IsTableEmpty(ctx context.Context, schemaName string, tableName string) (*bool, error) // GetTargetSysVariablesForImport gets some important systam variables for importing on the target. GetTargetSysVariablesForImport(ctx context.Context, opts ...ropts.GetPreInfoOption) map[string]string - // GetReplicationConfig gets the replication config on the target. - GetReplicationConfig(ctx context.Context) (*pdtypes.ReplicationConfig, error) + // GetMaxReplica gets the max-replica from replication config on the target. + GetMaxReplica(ctx context.Context) (uint64, error) // GetStorageInfo gets the storage information on the target. - GetStorageInfo(ctx context.Context) (*pdtypes.StoresInfo, error) + GetStorageInfo(ctx context.Context) (*pdhttp.StoresInfo, error) // GetEmptyRegionsInfo gets the region information of all the empty regions on the target. - GetEmptyRegionsInfo(ctx context.Context) (*pdtypes.RegionsInfo, error) + GetEmptyRegionsInfo(ctx context.Context) (*pdhttp.RegionsInfo, error) } type preInfoGetterKey string @@ -121,18 +119,17 @@ func WithPreInfoGetterDBMetas(ctx context.Context, dbMetas []*mydump.MDDatabaseM // TargetInfoGetterImpl implements the operations to get information from the target. type TargetInfoGetterImpl struct { - cfg *config.Config - db *sql.DB - tls *common.TLS - backend backend.TargetInfoGetter - pdCli pd.Client + cfg *config.Config + db *sql.DB + backend backend.TargetInfoGetter + pdHTTPCli pdhttp.Client } // NewTargetInfoGetterImpl creates a TargetInfoGetterImpl object. func NewTargetInfoGetterImpl( cfg *config.Config, targetDB *sql.DB, - pdCli pd.Client, + pdHTTPCli pdhttp.Client, ) (*TargetInfoGetterImpl, error) { tls, err := cfg.ToTLS() if err != nil { @@ -143,19 +140,18 @@ func NewTargetInfoGetterImpl( case config.BackendTiDB: backendTargetInfoGetter = tidb.NewTargetInfoGetter(targetDB) case config.BackendLocal: - if pdCli == nil { - return nil, common.ErrUnknown.GenWithStack("pd client is required when using local backend") + if pdHTTPCli == nil { + return nil, common.ErrUnknown.GenWithStack("pd HTTP client is required when using local backend") } - backendTargetInfoGetter = local.NewTargetInfoGetter(tls, targetDB, pdCli) + backendTargetInfoGetter = local.NewTargetInfoGetter(tls, targetDB, pdHTTPCli) default: return nil, common.ErrUnknownBackend.GenWithStackByArgs(cfg.TikvImporter.Backend) } return &TargetInfoGetterImpl{ - cfg: cfg, - tls: tls, - db: targetDB, - backend: backendTargetInfoGetter, - pdCli: pdCli, + cfg: cfg, + db: targetDB, + backend: backendTargetInfoGetter, + pdHTTPCli: pdHTTPCli, }, nil } @@ -200,7 +196,7 @@ func (g *TargetInfoGetterImpl) IsTableEmpty(ctx context.Context, schemaName stri // the data is partially imported, but the index data has not been imported. // In this situation, if no hint is added, the SQL executor might fetch the record from index, // which is empty. This will result in missing check. - fmt.Sprintf("SELECT 1 FROM %s USE INDEX() LIMIT 1", common.UniqueTable(schemaName, tableName)), + common.SprintfWithIdentifiers("SELECT 1 FROM %s.%s USE INDEX() LIMIT 1", schemaName, tableName), &dump, ) @@ -232,37 +228,28 @@ func (g *TargetInfoGetterImpl) GetTargetSysVariablesForImport(ctx context.Contex return sysVars } -// GetReplicationConfig gets the replication config on the target. -// It implements the TargetInfoGetter interface. -// It uses the PD interface through TLS to get the information. -func (g *TargetInfoGetterImpl) GetReplicationConfig(ctx context.Context) (*pdtypes.ReplicationConfig, error) { - result := new(pdtypes.ReplicationConfig) - if err := g.tls.WithHost(g.pdCli.GetLeaderAddr()).GetJSON(ctx, pdhttp.ReplicateConfig, &result); err != nil { - return nil, errors.Trace(err) +// GetMaxReplica implements the TargetInfoGetter interface. +func (g *TargetInfoGetterImpl) GetMaxReplica(ctx context.Context) (uint64, error) { + cfg, err := g.pdHTTPCli.GetReplicateConfig(ctx) + if err != nil { + return 0, errors.Trace(err) } - return result, nil + val := cfg["max-replicas"].(float64) + return uint64(val), nil } // GetStorageInfo gets the storage information on the target. // It implements the TargetInfoGetter interface. // It uses the PD interface through TLS to get the information. -func (g *TargetInfoGetterImpl) GetStorageInfo(ctx context.Context) (*pdtypes.StoresInfo, error) { - result := new(pdtypes.StoresInfo) - if err := g.tls.WithHost(g.pdCli.GetLeaderAddr()).GetJSON(ctx, pdhttp.Stores, result); err != nil { - return nil, errors.Trace(err) - } - return result, nil +func (g *TargetInfoGetterImpl) GetStorageInfo(ctx context.Context) (*pdhttp.StoresInfo, error) { + return g.pdHTTPCli.GetStores(ctx) } // GetEmptyRegionsInfo gets the region information of all the empty regions on the target. // It implements the TargetInfoGetter interface. // It uses the PD interface through TLS to get the information. -func (g *TargetInfoGetterImpl) GetEmptyRegionsInfo(ctx context.Context) (*pdtypes.RegionsInfo, error) { - result := new(pdtypes.RegionsInfo) - if err := g.tls.WithHost(g.pdCli.GetLeaderAddr()).GetJSON(ctx, pdhttp.EmptyRegions, &result); err != nil { - return nil, errors.Trace(err) - } - return result, nil +func (g *TargetInfoGetterImpl) GetEmptyRegionsInfo(ctx context.Context) (*pdhttp.RegionsInfo, error) { + return g.pdHTTPCli.GetEmptyRegions(ctx) } // PreImportInfoGetterImpl implements the operations to get information used in importing preparation. @@ -777,21 +764,20 @@ outloop: return resultIndexRatio, isRowOrdered, nil } -// GetReplicationConfig gets the replication config on the target. -// It implements the PreImportInfoGetter interface. -func (p *PreImportInfoGetterImpl) GetReplicationConfig(ctx context.Context) (*pdtypes.ReplicationConfig, error) { - return p.targetInfoGetter.GetReplicationConfig(ctx) +// GetMaxReplica implements the PreImportInfoGetter interface. +func (p *PreImportInfoGetterImpl) GetMaxReplica(ctx context.Context) (uint64, error) { + return p.targetInfoGetter.GetMaxReplica(ctx) } // GetStorageInfo gets the storage information on the target. // It implements the PreImportInfoGetter interface. -func (p *PreImportInfoGetterImpl) GetStorageInfo(ctx context.Context) (*pdtypes.StoresInfo, error) { +func (p *PreImportInfoGetterImpl) GetStorageInfo(ctx context.Context) (*pdhttp.StoresInfo, error) { return p.targetInfoGetter.GetStorageInfo(ctx) } // GetEmptyRegionsInfo gets the region information of all the empty regions on the target. // It implements the PreImportInfoGetter interface. -func (p *PreImportInfoGetterImpl) GetEmptyRegionsInfo(ctx context.Context) (*pdtypes.RegionsInfo, error) { +func (p *PreImportInfoGetterImpl) GetEmptyRegionsInfo(ctx context.Context) (*pdhttp.RegionsInfo, error) { return p.targetInfoGetter.GetEmptyRegionsInfo(ctx) } diff --git a/br/pkg/lightning/importer/get_pre_info_test.go b/br/pkg/lightning/importer/get_pre_info_test.go index 4639b494ef841..fd0df79c2816e 100644 --- a/br/pkg/lightning/importer/get_pre_info_test.go +++ b/br/pkg/lightning/importer/get_pre_info_test.go @@ -758,7 +758,7 @@ func TestGetPreInfoIsTableEmpty(t *testing.T) { lnConfig := config.NewConfig() lnConfig.TikvImporter.Backend = config.BackendLocal _, err = NewTargetInfoGetterImpl(lnConfig, db, nil) - require.ErrorContains(t, err, "pd client is required when using local backend") + require.ErrorContains(t, err, "pd HTTP client is required when using local backend") lnConfig.TikvImporter.Backend = config.BackendTiDB targetGetter, err := NewTargetInfoGetterImpl(lnConfig, db, nil) require.NoError(t, err) diff --git a/br/pkg/lightning/importer/import.go b/br/pkg/lightning/importer/import.go index 68e7470120b64..57b80ae1f16d8 100644 --- a/br/pkg/lightning/importer/import.go +++ b/br/pkg/lightning/importer/import.go @@ -30,6 +30,7 @@ import ( "github.com/google/uuid" "github.com/pingcap/errors" "github.com/pingcap/failpoint" + "github.com/pingcap/kvproto/pkg/metapb" "github.com/pingcap/tidb/br/pkg/backup" berrors "github.com/pingcap/tidb/br/pkg/errors" "github.com/pingcap/tidb/br/pkg/lightning/backend" @@ -68,6 +69,7 @@ import ( tikvconfig "github.com/tikv/client-go/v2/config" kvutil "github.com/tikv/client-go/v2/util" pd "github.com/tikv/pd/client" + pdhttp "github.com/tikv/pd/client/http" clientv3 "go.etcd.io/etcd/client/v3" "go.uber.org/atomic" "go.uber.org/multierr" @@ -90,7 +92,7 @@ const ( TaskMetaTableName = "task_meta_v2" TableMetaTableName = "table_meta" // CreateTableMetadataTable stores the per-table sub jobs information used by TiDB Lightning - CreateTableMetadataTable = `CREATE TABLE IF NOT EXISTS %s ( + CreateTableMetadataTable = `CREATE TABLE IF NOT EXISTS %s.%s ( task_id BIGINT(20) UNSIGNED, table_id BIGINT(64) NOT NULL, table_name VARCHAR(64) NOT NULL, @@ -107,7 +109,7 @@ const ( PRIMARY KEY (table_id, task_id) );` // CreateTaskMetaTable stores the pre-lightning metadata used by TiDB Lightning - CreateTaskMetaTable = `CREATE TABLE IF NOT EXISTS %s ( + CreateTaskMetaTable = `CREATE TABLE IF NOT EXISTS %s.%s ( task_id BIGINT(20) UNSIGNED NOT NULL, pd_cfgs VARCHAR(2048) NOT NULL DEFAULT '', status VARCHAR(32) NOT NULL, @@ -205,11 +207,11 @@ type Controller struct { backend backend.Backend db *sql.DB pdCli pd.Client + pdHTTPCli pdhttp.Client - alterTableLock sync.Mutex - sysVars map[string]string - tls *common.TLS - checkTemplate Template + sysVars map[string]string + tls *common.TLS + checkTemplate Template errorSummaries errorSummaries @@ -342,6 +344,7 @@ func NewImportControllerWithPauser( var encodingBuilder encode.EncodingBuilder var backendObj backend.Backend var pdCli pd.Client + var pdHTTPCli pdhttp.Client switch cfg.TikvImporter.Backend { case config.BackendTiDB: encodingBuilder = tidb.NewEncodingBuilder() @@ -357,13 +360,16 @@ func NewImportControllerWithPauser( if maxOpenFiles < 0 { maxOpenFiles = math.MaxInt32 } - pdCli, err = pd.NewClientWithContext(ctx, []string{cfg.TiDB.PdAddr}, tls.ToPDSecurityOption()) + + addrs := strings.Split(cfg.TiDB.PdAddr, ",") + pdCli, err = pd.NewClientWithContext(ctx, addrs, tls.ToPDSecurityOption()) if err != nil { return nil, errors.Trace(err) } + pdHTTPCli = pdhttp.NewClient("lightning", addrs, pdhttp.WithTLSConfig(tls.TLSConfig())) if cfg.TikvImporter.DuplicateResolution != config.DupeResAlgNone { - if err := tikv.CheckTiKVVersion(ctx, tls, pdCli.GetLeaderAddr(), minTiKVVersionForDuplicateResolution, maxTiKVVersionForDuplicateResolution); err != nil { + if err := tikv.CheckTiKVVersion(ctx, pdHTTPCli, minTiKVVersionForDuplicateResolution, maxTiKVVersionForDuplicateResolution); err != nil { if !berrors.Is(err, berrors.ErrVersionMismatch) { return nil, common.ErrCheckKVVersion.Wrap(err).GenWithStackByArgs() } @@ -441,17 +447,16 @@ func NewImportControllerWithPauser( var wrapper backend.TargetInfoGetter if cfg.TikvImporter.Backend == config.BackendLocal { - wrapper = local.NewTargetInfoGetter(tls, db, pdCli) + wrapper = local.NewTargetInfoGetter(tls, db, pdHTTPCli) } else { wrapper = tidb.NewTargetInfoGetter(db) } ioWorkers := worker.NewPool(ctx, cfg.App.IOConcurrency, "io") targetInfoGetter := &TargetInfoGetterImpl{ - cfg: cfg, - db: db, - tls: tls, - backend: wrapper, - pdCli: pdCli, + cfg: cfg, + db: db, + backend: wrapper, + pdHTTPCli: pdHTTPCli, } preInfoGetter, err := NewPreImportInfoGetter( cfg, @@ -466,7 +471,7 @@ func NewImportControllerWithPauser( } preCheckBuilder := NewPrecheckItemBuilder( - cfg, p.DBMetas, preInfoGetter, cpdb, pdCli, + cfg, p.DBMetas, preInfoGetter, cpdb, pdHTTPCli, ) rc := &Controller{ @@ -482,6 +487,7 @@ func NewImportControllerWithPauser( engineMgr: backend.MakeEngineManager(backendObj), backend: backendObj, pdCli: pdCli, + pdHTTPCli: pdHTTPCli, db: db, sysVars: common.DefaultImportantVariables, tls: tls, @@ -506,7 +512,7 @@ func NewImportControllerWithPauser( preInfoGetter: preInfoGetter, precheckItemBuilder: preCheckBuilder, encBuilder: encodingBuilder, - tikvModeSwitcher: local.NewTiKVModeSwitcher(tls, pdCli, log.FromContext(ctx).Logger), + tikvModeSwitcher: local.NewTiKVModeSwitcher(tls, pdHTTPCli, log.FromContext(ctx).Logger), keyspaceName: p.KeyspaceName, resourceGroupName: p.ResourceGroupName, @@ -1437,7 +1443,8 @@ const ( func (rc *Controller) keepPauseGCForDupeRes(ctx context.Context) (<-chan struct{}, error) { tlsOpt := rc.tls.ToPDSecurityOption() - pdCli, err := pd.NewClientWithContext(ctx, []string{rc.pdCli.GetLeaderAddr()}, tlsOpt) + addrs := strings.Split(rc.cfg.TiDB.PdAddr, ",") + pdCli, err := pd.NewClientWithContext(ctx, addrs, tlsOpt) if err != nil { return nil, errors.Trace(err) } @@ -1921,13 +1928,12 @@ func (rc *Controller) fullCompact(ctx context.Context) error { } func (rc *Controller) doCompact(ctx context.Context, level int32) error { - tls := rc.tls.WithHost(rc.pdCli.GetLeaderAddr()) return tikv.ForAllStores( ctx, - tls, - tikv.StoreStateDisconnected, - func(c context.Context, store *tikv.Store) error { - return tikv.Compact(c, tls, store.Address, level, rc.resourceGroupName) + rc.pdHTTPCli, + metapb.StoreState_Offline, + func(c context.Context, store *pdhttp.MetaStore) error { + return tikv.Compact(c, rc.tls, store.Address, level, rc.resourceGroupName) }, ) } diff --git a/br/pkg/lightning/importer/meta_manager.go b/br/pkg/lightning/importer/meta_manager.go index fff80ddb09718..61c34dadc93d3 100644 --- a/br/pkg/lightning/importer/meta_manager.go +++ b/br/pkg/lightning/importer/meta_manager.go @@ -43,15 +43,15 @@ func (b *dbMetaMgrBuilder) Init(ctx context.Context) error { Logger: log.FromContext(ctx), HideQueryLog: redact.NeedRedact(), } - metaDBSQL := fmt.Sprintf("CREATE DATABASE IF NOT EXISTS %s", common.EscapeIdentifier(b.schema)) + metaDBSQL := common.SprintfWithIdentifiers("CREATE DATABASE IF NOT EXISTS %s", b.schema) if err := exec.Exec(ctx, "create meta schema", metaDBSQL); err != nil { return errors.Annotate(err, "create meta schema failed") } - taskMetaSQL := fmt.Sprintf(CreateTaskMetaTable, common.UniqueTable(b.schema, TaskMetaTableName)) + taskMetaSQL := common.SprintfWithIdentifiers(CreateTaskMetaTable, b.schema, TaskMetaTableName) if err := exec.Exec(ctx, "create meta table", taskMetaSQL); err != nil { return errors.Annotate(err, "create task meta table failed") } - tableMetaSQL := fmt.Sprintf(CreateTableMetadataTable, common.UniqueTable(b.schema, TableMetaTableName)) + tableMetaSQL := common.SprintfWithIdentifiers(CreateTableMetadataTable, b.schema, TableMetaTableName) if err := exec.Exec(ctx, "create meta table", tableMetaSQL); err != nil { return errors.Annotate(err, "create table meta table failed") } @@ -63,7 +63,7 @@ func (b *dbMetaMgrBuilder) TaskMetaMgr(pd *pdutil.PdController) taskMetaMgr { session: b.db, taskID: b.taskID, pd: pd, - tableName: common.UniqueTable(b.schema, TaskMetaTableName), + tableName: TaskMetaTableName, schemaName: b.schema, } } @@ -73,7 +73,8 @@ func (b *dbMetaMgrBuilder) TableMetaMgr(tr *TableImporter) tableMetaMgr { session: b.db, taskID: b.taskID, tr: tr, - tableName: common.UniqueTable(b.schema, TableMetaTableName), + schemaName: b.schema, + tableName: TableMetaTableName, needChecksum: b.needChecksum, } } @@ -92,6 +93,7 @@ type dbTableMetaMgr struct { session *sql.DB taskID int64 tr *TableImporter + schemaName string tableName string needChecksum bool } @@ -102,7 +104,7 @@ func (m *dbTableMetaMgr) InitTableMeta(ctx context.Context) error { Logger: m.tr.logger, } // avoid override existing metadata if the meta is already inserted. - stmt := fmt.Sprintf(`INSERT IGNORE INTO %s (task_id, table_id, table_name, status) values (?, ?, ?, ?)`, m.tableName) + stmt := common.SprintfWithIdentifiers(`INSERT IGNORE INTO %s.%s (task_id, table_id, table_name, status) VALUES (?, ?, ?, ?)`, m.schemaName, m.tableName) task := m.tr.logger.Begin(zap.DebugLevel, "init table meta") err := exec.Exec(ctx, "init table meta", stmt, m.taskID, m.tr.tableInfo.ID, m.tr.tableName, metaStatusInitial.String()) task.End(zap.ErrorLevel, err) @@ -189,7 +191,7 @@ func (m *dbTableMetaMgr) AllocTableRowIDs(ctx context.Context, rawRowIDMax int64 return exec.Transact(ctx, "init table allocator base", func(ctx context.Context, tx *sql.Tx) error { rows, err := tx.QueryContext( ctx, - fmt.Sprintf("SELECT task_id, row_id_base, row_id_max, total_kvs_base, total_bytes_base, checksum_base, status from %s WHERE table_id = ? FOR UPDATE", m.tableName), + common.SprintfWithIdentifiers("SELECT task_id, row_id_base, row_id_max, total_kvs_base, total_bytes_base, checksum_base, status FROM %s.%s WHERE table_id = ? FOR UPDATE", m.schemaName, m.tableName), m.tr.tableInfo.ID, ) if err != nil { @@ -270,8 +272,7 @@ func (m *dbTableMetaMgr) AllocTableRowIDs(ctx context.Context, rawRowIDMax int64 newStatus = metaStatusRestoreStarted } - // nolint:gosec - query := fmt.Sprintf("update %s set row_id_base = ?, row_id_max = ?, status = ? where table_id = ? and task_id = ?", m.tableName) + query := common.SprintfWithIdentifiers("UPDATE %s.%s SET row_id_base = ?, row_id_max = ?, status = ? WHERE table_id = ? AND task_id = ?", m.schemaName, m.tableName) _, err := tx.ExecContext(ctx, query, newRowIDBase, newRowIDMax, newStatus.String(), m.tr.tableInfo.ID, m.taskID) if err != nil { return errors.Trace(err) @@ -351,7 +352,7 @@ func (m *dbTableMetaMgr) UpdateTableBaseChecksum(ctx context.Context, checksum * DB: m.session, Logger: m.tr.logger, } - query := fmt.Sprintf("update %s set total_kvs_base = ?, total_bytes_base = ?, checksum_base = ?, status = ? where table_id = ? and task_id = ?", m.tableName) + query := common.SprintfWithIdentifiers("UPDATE %s.%s SET total_kvs_base = ?, total_bytes_base = ?, checksum_base = ?, status = ? WHERE table_id = ? AND task_id = ?", m.schemaName, m.tableName) return exec.Exec(ctx, "update base checksum", query, checksum.SumKVS(), checksum.SumSize(), checksum.Sum(), metaStatusRestoreStarted.String(), m.tr.tableInfo.ID, m.taskID) @@ -362,7 +363,7 @@ func (m *dbTableMetaMgr) UpdateTableStatus(ctx context.Context, status metaStatu DB: m.session, Logger: m.tr.logger, } - query := fmt.Sprintf("update %s set status = ? where table_id = ? and task_id = ?", m.tableName) + query := common.SprintfWithIdentifiers("UPDATE %s.%s SET status = ? WHERE table_id = ? AND task_id = ?", m.schemaName, m.tableName) return exec.Exec(ctx, "update meta status", query, status.String(), m.tr.tableInfo.ID, m.taskID) } @@ -395,7 +396,7 @@ func (m *dbTableMetaMgr) CheckAndUpdateLocalChecksum(ctx context.Context, checks err = exec.Transact(ctx, "checksum pre-check", func(ctx context.Context, tx *sql.Tx) error { rows, err := tx.QueryContext( ctx, - fmt.Sprintf("SELECT task_id, total_kvs_base, total_bytes_base, checksum_base, total_kvs, total_bytes, checksum, status, has_duplicates from %s WHERE table_id = ? FOR UPDATE", m.tableName), + common.SprintfWithIdentifiers("SELECT task_id, total_kvs_base, total_bytes_base, checksum_base, total_kvs, total_bytes, checksum, status, has_duplicates from %s.%s WHERE table_id = ? FOR UPDATE", m.schemaName, m.tableName), m.tr.tableInfo.ID, ) if err != nil { @@ -442,7 +443,7 @@ func (m *dbTableMetaMgr) CheckAndUpdateLocalChecksum(ctx context.Context, checks needRemoteDupe = false break } else if status == metaStatusChecksuming { - return common.ErrTableIsChecksuming.GenWithStackByArgs(m.tableName) + return common.ErrTableIsChecksuming.GenWithStackByArgs(common.UniqueTable(m.schemaName, m.tableName)) } totalBytes += baseTotalBytes @@ -459,8 +460,7 @@ func (m *dbTableMetaMgr) CheckAndUpdateLocalChecksum(ctx context.Context, checks return errors.Trace(err) } - // nolint:gosec - query := fmt.Sprintf("update %s set total_kvs = ?, total_bytes = ?, checksum = ?, status = ?, has_duplicates = ? where table_id = ? and task_id = ?", m.tableName) + query := common.SprintfWithIdentifiers("UPDATE %s.%s SET total_kvs = ?, total_bytes = ?, checksum = ?, status = ?, has_duplicates = ? WHERE table_id = ? AND task_id = ?", m.schemaName, m.tableName) _, err = tx.ExecContext(ctx, query, checksum.SumKVS(), checksum.SumSize(), checksum.Sum(), newStatus.String(), hasLocalDupes, m.tr.tableInfo.ID, m.taskID) return errors.Annotate(err, "update local checksum failed") }) @@ -483,7 +483,7 @@ func (m *dbTableMetaMgr) FinishTable(ctx context.Context) error { DB: m.session, Logger: m.tr.logger, } - query := fmt.Sprintf("DELETE FROM %s where table_id = ? and (status = 'checksuming' or status = 'checksum_skipped')", m.tableName) + query := common.SprintfWithIdentifiers("DELETE FROM %s.%s where table_id = ? and (status = 'checksuming' or status = 'checksum_skipped')", m.schemaName, m.tableName) return exec.Exec(ctx, "clean up metas", query, m.tr.tableInfo.ID) } @@ -524,10 +524,9 @@ type taskMetaMgr interface { } type dbTaskMetaMgr struct { - session *sql.DB - taskID int64 - pd *pdutil.PdController - // unique name of task meta table + session *sql.DB + taskID int64 + pd *pdutil.PdController tableName string schemaName string } @@ -598,7 +597,10 @@ func (m *dbTaskMetaMgr) InitTask(ctx context.Context, tikvSourceSize, tiflashSou Logger: log.FromContext(ctx), } // avoid override existing metadata if the meta is already inserted. - stmt := fmt.Sprintf(`INSERT INTO %s (task_id, status, tikv_source_bytes, tiflash_source_bytes) values (?, ?, ?, ?) ON DUPLICATE KEY UPDATE state = ?`, m.tableName) + stmt := common.SprintfWithIdentifiers(` + INSERT INTO %s.%s (task_id, status, tikv_source_bytes, tiflash_source_bytes) + VALUES (?, ?, ?, ?) ON DUPLICATE KEY UPDATE state = ?`, + m.schemaName, m.tableName) err := exec.Exec(ctx, "init task meta", stmt, m.taskID, taskMetaStatusInitial.String(), tikvSourceSize, tiflashSourceSize, taskStateNormal) return errors.Trace(err) } @@ -612,7 +614,7 @@ func (m *dbTaskMetaMgr) CheckTaskExist(ctx context.Context) (bool, error) { exist := false err := exec.Transact(ctx, "check whether this task has started before", func(ctx context.Context, tx *sql.Tx) error { rows, err := tx.QueryContext(ctx, - fmt.Sprintf("SELECT task_id from %s WHERE task_id = ?", m.tableName), + common.SprintfWithIdentifiers("SELECT task_id from %s.%s WHERE task_id = ?", m.schemaName, m.tableName), m.taskID, ) if err != nil { @@ -658,7 +660,17 @@ func (m *dbTaskMetaMgr) CheckTasksExclusively(ctx context.Context, action func(t return exec.Transact(ctx, "check tasks exclusively", func(ctx context.Context, tx *sql.Tx) error { rows, err := tx.QueryContext( ctx, - fmt.Sprintf("SELECT task_id, pd_cfgs, status, state, tikv_source_bytes, tiflash_source_bytes, tikv_avail, tiflash_avail from %s FOR UPDATE", m.tableName), + common.SprintfWithIdentifiers(` + SELECT + task_id, + pd_cfgs, + status, + state, + tikv_source_bytes, + tiflash_source_bytes, + tikv_avail, + tiflash_avail + FROM %s.%s FOR UPDATE`, m.schemaName, m.tableName), ) if err != nil { return errors.Annotate(err, "fetch task metas failed") @@ -687,8 +699,10 @@ func (m *dbTaskMetaMgr) CheckTasksExclusively(ctx context.Context, action func(t return errors.Trace(err) } for _, task := range newTasks { - // nolint:gosec - query := fmt.Sprintf("REPLACE INTO %s (task_id, pd_cfgs, status, state, tikv_source_bytes, tiflash_source_bytes, tikv_avail, tiflash_avail) VALUES(?, ?, ?, ?, ?, ?, ?, ?)", m.tableName) + query := common.SprintfWithIdentifiers(` + REPLACE INTO %s.%s (task_id, pd_cfgs, status, state, tikv_source_bytes, tiflash_source_bytes, tikv_avail, tiflash_avail) + VALUES(?, ?, ?, ?, ?, ?, ?, ?)`, + m.schemaName, m.tableName) if _, err = tx.ExecContext(ctx, query, task.taskID, task.pdCfgs, task.status.String(), task.state, task.tikvSourceBytes, task.tiflashSourceBytes, task.tikvAvail, task.tiflashAvail); err != nil { return errors.Trace(err) } @@ -722,7 +736,10 @@ func (m *dbTaskMetaMgr) CheckAndPausePdSchedulers(ctx context.Context) (pdutil.U err = exec.Transact(ctx, "check and pause schedulers", func(ctx context.Context, tx *sql.Tx) error { rows, err := tx.QueryContext( ctx, - fmt.Sprintf("SELECT task_id, pd_cfgs, status, state from %s FOR UPDATE", m.tableName), + common.SprintfWithIdentifiers(` + SELECT task_id, pd_cfgs, status, state + FROM %s.%s FOR UPDATE`, + m.schemaName, m.tableName), ) if err != nil { return errors.Annotate(err, "fetch task meta failed") @@ -796,8 +813,9 @@ func (m *dbTaskMetaMgr) CheckAndPausePdSchedulers(ctx context.Context) (pdutil.U return errors.Trace(err) } - // nolint:gosec - query := fmt.Sprintf("update %s set pd_cfgs = ?, status = ? where task_id = ?", m.tableName) + query := common.SprintfWithIdentifiers(` + UPDATE %s.%s SET pd_cfgs = ?, status = ? WHERE task_id = ?`, + m.schemaName, m.tableName) _, err = tx.ExecContext(ctx, query, string(jsonByts), taskMetaStatusScheduleSet.String(), m.taskID) return errors.Annotate(err, "update task pd configs failed") @@ -854,7 +872,10 @@ func (m *dbTaskMetaMgr) CheckAndFinishRestore(ctx context.Context, finished bool switchBack = true allFinished = finished err = exec.Transact(ctx, "check and finish schedulers", func(ctx context.Context, tx *sql.Tx) error { - rows, err := tx.QueryContext(ctx, fmt.Sprintf("SELECT task_id, status, state from %s FOR UPDATE", m.tableName)) + rows, err := tx.QueryContext( + ctx, + common.SprintfWithIdentifiers("SELECT task_id, status, state FROM %s.%s FOR UPDATE", m.schemaName, m.tableName), + ) if err != nil { return errors.Annotate(err, "fetch task meta failed") } @@ -914,8 +935,7 @@ func (m *dbTaskMetaMgr) CheckAndFinishRestore(ctx context.Context, finished bool newStatus = taskMetaStatusSwitchSkipped } - // nolint:gosec - query := fmt.Sprintf("update %s set status = ?, state = ? where task_id = ?", m.tableName) + query := common.SprintfWithIdentifiers("UPDATE %s.%s SET status = ?, state = ? WHERE task_id = ?", m.schemaName, m.tableName) if _, err = tx.ExecContext(ctx, query, newStatus.String(), newState, m.taskID); err != nil { return errors.Trace(err) } @@ -935,7 +955,7 @@ func (m *dbTaskMetaMgr) Cleanup(ctx context.Context) error { Logger: log.FromContext(ctx), } // avoid override existing metadata if the meta is already inserted. - stmt := fmt.Sprintf("DROP TABLE %s;", m.tableName) + stmt := common.SprintfWithIdentifiers("DROP TABLE %s.%s;", m.schemaName, m.tableName) if err := exec.Exec(ctx, "cleanup task meta tables", stmt); err != nil { return errors.Trace(err) } @@ -947,8 +967,8 @@ func (m *dbTaskMetaMgr) CleanupTask(ctx context.Context) error { DB: m.session, Logger: log.FromContext(ctx), } - stmt := fmt.Sprintf("DELETE FROM %s WHERE task_id = %d;", m.tableName, m.taskID) - err := exec.Exec(ctx, "clean up task", stmt) + stmt := common.SprintfWithIdentifiers("DELETE FROM %s.%s WHERE task_id = ?;", m.schemaName, m.tableName) + err := exec.Exec(ctx, "clean up task", stmt, m.taskID) return errors.Trace(err) } @@ -975,7 +995,7 @@ func MaybeCleanupAllMetas( // check if all tables are finished if tableMetaExist { - query := fmt.Sprintf("SELECT COUNT(*) from %s", common.UniqueTable(schemaName, TableMetaTableName)) + query := common.SprintfWithIdentifiers("SELECT COUNT(*) from %s.%s", schemaName, TableMetaTableName) var cnt int if err := exec.QueryRow(ctx, "fetch table meta row count", query, &cnt); err != nil { return errors.Trace(err) @@ -987,7 +1007,7 @@ func MaybeCleanupAllMetas( } // avoid override existing metadata if the meta is already inserted. - stmt := fmt.Sprintf("DROP DATABASE %s;", common.EscapeIdentifier(schemaName)) + stmt := common.SprintfWithIdentifiers("DROP DATABASE %s;", schemaName) if err := exec.Exec(ctx, "cleanup task meta tables", stmt); err != nil { return errors.Trace(err) } diff --git a/br/pkg/lightning/importer/meta_manager_test.go b/br/pkg/lightning/importer/meta_manager_test.go index d778c04645dc0..847da5452402b 100644 --- a/br/pkg/lightning/importer/meta_manager_test.go +++ b/br/pkg/lightning/importer/meta_manager_test.go @@ -69,7 +69,7 @@ func newTableRestore(t *testing.T, if err := m.CreateDatabase(&model.DBInfo{ID: dbInfo.ID}); err != nil && !errors.ErrorEqual(err, meta.ErrDBExists) { return err } - return m.CreateTableOrView(dbInfo.ID, ti.Core) + return m.CreateTableOrView(dbInfo.ID, db, ti.Core) }) require.NoError(t, err) @@ -99,7 +99,8 @@ func newMetaMgrSuite(t *testing.T) *metaMgrSuite { taskID: 1, tr: newTableRestore(t, "test", "t1", 1, 1, "CREATE TABLE `t1` (`c1` varchar(5) NOT NULL)", kvStore), - tableName: common.UniqueTable("test", TableMetaTableName), + schemaName: "test", + tableName: TableMetaTableName, needChecksum: true, } s.mockDB = m @@ -279,7 +280,7 @@ func TestAllocTableRowIDsRetryOnTableInChecksum(t *testing.T) { s.mockDB.ExpectExec("SET SESSION tidb_txn_mode = 'pessimistic';"). WillReturnResult(sqlmock.NewResult(int64(0), int64(0))) s.mockDB.ExpectBegin() - s.mockDB.ExpectQuery("\\QSELECT task_id, row_id_base, row_id_max, total_kvs_base, total_bytes_base, checksum_base, status from `test`.`table_meta` WHERE table_id = ? FOR UPDATE\\E"). + s.mockDB.ExpectQuery("\\QSELECT task_id, row_id_base, row_id_max, total_kvs_base, total_bytes_base, checksum_base, status FROM `test`.`table_meta` WHERE table_id = ? FOR UPDATE\\E"). WithArgs(int64(1)). WillReturnError(errors.New("mock err")) s.mockDB.ExpectRollback() @@ -313,6 +314,7 @@ func (s *metaMgrSuite) prepareMock(rowsVal [][]driver.Value, nextRowID *int64, u WillReturnResult(sqlmock.NewResult(int64(0), int64(0))) s.prepareMockInner(rowsVal, nextRowID, updateArgs, checksum, updateStatus, rollback) } + func (s *metaMgrSuite) prepareMockInner(rowsVal [][]driver.Value, nextRowID *int64, updateArgs []driver.Value, checksum *verification.KVChecksum, updateStatus *string, rollback bool) { s.mockDB.ExpectBegin() @@ -320,7 +322,7 @@ func (s *metaMgrSuite) prepareMockInner(rowsVal [][]driver.Value, nextRowID *int for _, r := range rowsVal { rows = rows.AddRow(r...) } - s.mockDB.ExpectQuery("\\QSELECT task_id, row_id_base, row_id_max, total_kvs_base, total_bytes_base, checksum_base, status from `test`.`table_meta` WHERE table_id = ? FOR UPDATE\\E"). + s.mockDB.ExpectQuery("\\QSELECT task_id, row_id_base, row_id_max, total_kvs_base, total_bytes_base, checksum_base, status FROM `test`.`table_meta` WHERE table_id = ? FOR UPDATE\\E"). WithArgs(int64(1)). WillReturnRows(rows) @@ -331,7 +333,7 @@ func (s *metaMgrSuite) prepareMockInner(rowsVal [][]driver.Value, nextRowID *int } if len(updateArgs) > 0 { - s.mockDB.ExpectExec("\\Qupdate `test`.`table_meta` set row_id_base = ?, row_id_max = ?, status = ? where table_id = ? and task_id = ?\\E"). + s.mockDB.ExpectExec("\\QUPDATE `test`.`table_meta` SET row_id_base = ?, row_id_max = ?, status = ? WHERE table_id = ? AND task_id = ?\\E"). WithArgs(updateArgs...). WillReturnResult(sqlmock.NewResult(int64(0), int64(1))) } @@ -344,7 +346,7 @@ func (s *metaMgrSuite) prepareMockInner(rowsVal [][]driver.Value, nextRowID *int s.mockDB.ExpectCommit() if checksum != nil { - s.mockDB.ExpectExec("\\Qupdate `test`.`table_meta` set total_kvs_base = ?, total_bytes_base = ?, checksum_base = ?, status = ? where table_id = ? and task_id = ?\\E"). + s.mockDB.ExpectExec("\\QUPDATE `test`.`table_meta` SET total_kvs_base = ?, total_bytes_base = ?, checksum_base = ?, status = ? WHERE table_id = ? AND task_id = ?\\E"). WithArgs(checksum.SumKVS(), checksum.SumSize(), checksum.Sum(), metaStatusRestoreStarted.String(), int64(1), int64(1)). WillReturnResult(sqlmock.NewResult(int64(0), int64(1))) s.checksumMgr.checksum = local.RemoteChecksum{ @@ -355,7 +357,7 @@ func (s *metaMgrSuite) prepareMockInner(rowsVal [][]driver.Value, nextRowID *int } if updateStatus != nil { - s.mockDB.ExpectExec("\\Qupdate `test`.`table_meta` set status = ? where table_id = ? and task_id = ?\\E"). + s.mockDB.ExpectExec("\\QUPDATE `test`.`table_meta` SET status = ? WHERE table_id = ? AND task_id = ?\\E"). WithArgs(*updateStatus, int64(1), int64(1)). WillReturnResult(sqlmock.NewResult(int64(0), int64(1))) } @@ -372,9 +374,10 @@ func newTaskMetaMgrSuite(t *testing.T) *taskMetaMgrSuite { var s taskMetaMgrSuite s.mgr = &dbTaskMetaMgr{ - session: db, - taskID: 1, - tableName: common.UniqueTable("test", "t1"), + session: db, + taskID: 1, + tableName: "t1", + schemaName: "test", } s.mockDB = m return &s @@ -385,7 +388,7 @@ func TestCheckTasksExclusively(t *testing.T) { s.mockDB.ExpectExec("SET SESSION tidb_txn_mode = 'pessimistic';"). WillReturnResult(sqlmock.NewResult(int64(0), int64(0))) s.mockDB.ExpectBegin() - s.mockDB.ExpectQuery("SELECT task_id, pd_cfgs, status, state, tikv_source_bytes, tiflash_source_bytes, tikv_avail, tiflash_avail from `test`.`t1` FOR UPDATE"). + s.mockDB.ExpectQuery("SELECT task_id, pd_cfgs, status, state, tikv_source_bytes, tiflash_source_bytes, tikv_avail, tiflash_avail FROM `test`.`t1` FOR UPDATE"). WillReturnRows(sqlmock.NewRows([]string{"task_id", "pd_cfgs", "status", "state", "tikv_source_bytes", "tiflash_source_bytes", "tiflash_avail", "tiflash_avail"}). AddRow("0", "", taskMetaStatusInitial.String(), "0", "0", "0", "0", "0"). AddRow("1", "", taskMetaStatusInitial.String(), "0", "0", "0", "0", "0"). diff --git a/br/pkg/lightning/importer/mock/BUILD.bazel b/br/pkg/lightning/importer/mock/BUILD.bazel index 303d8a87ff01b..08e64fa8b2406 100644 --- a/br/pkg/lightning/importer/mock/BUILD.bazel +++ b/br/pkg/lightning/importer/mock/BUILD.bazel @@ -11,11 +11,11 @@ go_library( "//br/pkg/storage", "//pkg/errno", "//pkg/parser/model", - "//pkg/store/pdtypes", "//pkg/util/dbterror", "//pkg/util/filter", + "@com_github_docker_go_units//:go-units", "@com_github_pingcap_errors//:errors", - "@com_github_pingcap_kvproto//pkg/metapb", + "@com_github_tikv_pd_client//http", ], ) diff --git a/br/pkg/lightning/importer/mock/mock.go b/br/pkg/lightning/importer/mock/mock.go index f24fb073b1208..27605efb2db50 100644 --- a/br/pkg/lightning/importer/mock/mock.go +++ b/br/pkg/lightning/importer/mock/mock.go @@ -17,16 +17,16 @@ import ( "context" "strings" + "github.com/docker/go-units" "github.com/pingcap/errors" - "github.com/pingcap/kvproto/pkg/metapb" ropts "github.com/pingcap/tidb/br/pkg/lightning/importer/opts" "github.com/pingcap/tidb/br/pkg/lightning/mydump" "github.com/pingcap/tidb/br/pkg/storage" "github.com/pingcap/tidb/pkg/errno" "github.com/pingcap/tidb/pkg/parser/model" - "github.com/pingcap/tidb/pkg/store/pdtypes" "github.com/pingcap/tidb/pkg/util/dbterror" "github.com/pingcap/tidb/pkg/util/filter" + pdhttp "github.com/tikv/pd/client/http" ) // SourceFile defines a mock source file. @@ -237,39 +237,34 @@ func (t *TargetInfo) GetTargetSysVariablesForImport(_ context.Context, _ ...ropt return result } -// GetReplicationConfig gets the replication config on the target. -// It implements the TargetInfoGetter interface. -func (t *TargetInfo) GetReplicationConfig(_ context.Context) (*pdtypes.ReplicationConfig, error) { +// GetMaxReplica implements the TargetInfoGetter interface. +func (t *TargetInfo) GetMaxReplica(context.Context) (uint64, error) { replCount := t.MaxReplicasPerRegion if replCount <= 0 { replCount = 1 } - return &pdtypes.ReplicationConfig{ - MaxReplicas: uint64(replCount), - }, nil + return uint64(replCount), nil } // GetStorageInfo gets the storage information on the target. // It implements the TargetInfoGetter interface. -func (t *TargetInfo) GetStorageInfo(_ context.Context) (*pdtypes.StoresInfo, error) { - resultStoreInfos := make([]*pdtypes.StoreInfo, len(t.StorageInfos)) +func (t *TargetInfo) GetStorageInfo(_ context.Context) (*pdhttp.StoresInfo, error) { + resultStoreInfos := make([]pdhttp.StoreInfo, len(t.StorageInfos)) for i, storeInfo := range t.StorageInfos { - resultStoreInfos[i] = &pdtypes.StoreInfo{ - Store: &pdtypes.MetaStore{ - Store: &metapb.Store{ - Id: uint64(i + 1), - }, + resultStoreInfos[i] = pdhttp.StoreInfo{ + Store: pdhttp.MetaStore{ + ID: int64(i + 1), StateName: "Up", }, - Status: &pdtypes.StoreStatus{ - Capacity: pdtypes.ByteSize(storeInfo.TotalSize), - Available: pdtypes.ByteSize(storeInfo.AvailableSize), - UsedSize: pdtypes.ByteSize(storeInfo.UsedSize), - RegionCount: storeInfo.RegionCount, + Status: pdhttp.StoreStatus{ + Capacity: units.BytesSize(float64(storeInfo.TotalSize)), + Available: units.BytesSize(float64(storeInfo.AvailableSize)), + RegionSize: int64(storeInfo.UsedSize), + RegionCount: int64(storeInfo.RegionCount), }, } } - return &pdtypes.StoresInfo{ + return &pdhttp.StoresInfo{ Count: len(resultStoreInfos), Stores: resultStoreInfos, }, nil @@ -277,18 +272,16 @@ func (t *TargetInfo) GetStorageInfo(_ context.Context) (*pdtypes.StoresInfo, err // GetEmptyRegionsInfo gets the region information of all the empty regions on the target. // It implements the TargetInfoGetter interface. -func (t *TargetInfo) GetEmptyRegionsInfo(_ context.Context) (*pdtypes.RegionsInfo, error) { - totalEmptyRegions := []pdtypes.RegionInfo{} +func (t *TargetInfo) GetEmptyRegionsInfo(_ context.Context) (*pdhttp.RegionsInfo, error) { + totalEmptyRegions := []pdhttp.RegionInfo{} totalEmptyRegionCount := 0 for storeID, storeEmptyRegionCount := range t.EmptyRegionCountMap { - regions := make([]pdtypes.RegionInfo, storeEmptyRegionCount) + regions := make([]pdhttp.RegionInfo, storeEmptyRegionCount) for i := 0; i < storeEmptyRegionCount; i++ { - regions[i] = pdtypes.RegionInfo{ - Peers: []pdtypes.MetaPeer{ + regions[i] = pdhttp.RegionInfo{ + Peers: []pdhttp.RegionPeer{ { - Peer: &metapb.Peer{ - StoreId: storeID, - }, + StoreID: int64(storeID), }, }, } @@ -296,8 +289,8 @@ func (t *TargetInfo) GetEmptyRegionsInfo(_ context.Context) (*pdtypes.RegionsInf totalEmptyRegions = append(totalEmptyRegions, regions...) totalEmptyRegionCount += storeEmptyRegionCount } - return &pdtypes.RegionsInfo{ - Count: totalEmptyRegionCount, + return &pdhttp.RegionsInfo{ + Count: int64(totalEmptyRegionCount), Regions: totalEmptyRegions, }, nil } diff --git a/br/pkg/lightning/importer/mock/mock_test.go b/br/pkg/lightning/importer/mock/mock_test.go index 4efb250d6ffc5..05be2127966a5 100644 --- a/br/pkg/lightning/importer/mock/mock_test.go +++ b/br/pkg/lightning/importer/mock/mock_test.go @@ -107,8 +107,10 @@ func TestMockTargetInfoBasic(t *testing.T) { const replicaCount = 3 const emptyRegionCount = 5 const s01TotalSize uint64 = 10 << 30 + const s01TotalSizeStr = "10GiB" const s01UsedSize uint64 = 7<<30 + 500<<20 const s02TotalSize uint64 = 50 << 30 + const s02TotalSizeStr = "50GiB" const s02UsedSize uint64 = 35<<30 + 700<<20 ti.SetSysVar("aaa", "111") @@ -122,9 +124,9 @@ func TestMockTargetInfoBasic(t *testing.T) { require.Equal(t, "222", v) ti.MaxReplicasPerRegion = replicaCount - rcfg, err := ti.GetReplicationConfig(ctx) + cnt, err := ti.GetMaxReplica(ctx) require.NoError(t, err) - require.Equal(t, uint64(replicaCount), rcfg.MaxReplicas) + require.Equal(t, uint64(replicaCount), cnt) ti.StorageInfos = append(ti.StorageInfos, StorageInfo{ @@ -142,18 +144,18 @@ func TestMockTargetInfoBasic(t *testing.T) { require.NoError(t, err) require.Equal(t, 2, si.Count) store := si.Stores[0] - require.Equal(t, s01TotalSize, uint64(store.Status.Capacity)) - require.Equal(t, s01UsedSize, uint64(store.Status.UsedSize)) + require.Equal(t, s01TotalSizeStr, store.Status.Capacity) + require.Equal(t, s01UsedSize, uint64(store.Status.RegionSize)) store = si.Stores[1] - require.Equal(t, s02TotalSize, uint64(store.Status.Capacity)) - require.Equal(t, s02UsedSize, uint64(store.Status.UsedSize)) + require.Equal(t, s02TotalSizeStr, store.Status.Capacity) + require.Equal(t, s02UsedSize, uint64(store.Status.RegionSize)) ti.EmptyRegionCountMap = map[uint64]int{ 1: emptyRegionCount, } ri, err := ti.GetEmptyRegionsInfo(ctx) require.NoError(t, err) - require.Equal(t, emptyRegionCount, ri.Count) + require.EqualValues(t, emptyRegionCount, ri.Count) require.Equal(t, emptyRegionCount, len(ri.Regions)) ti.SetTableInfo("testdb", "testtbl1", diff --git a/br/pkg/lightning/importer/precheck.go b/br/pkg/lightning/importer/precheck.go index 2e4b4b5f000c7..5023d1b6b785d 100644 --- a/br/pkg/lightning/importer/precheck.go +++ b/br/pkg/lightning/importer/precheck.go @@ -9,7 +9,7 @@ import ( ropts "github.com/pingcap/tidb/br/pkg/lightning/importer/opts" "github.com/pingcap/tidb/br/pkg/lightning/mydump" "github.com/pingcap/tidb/br/pkg/lightning/precheck" - pd "github.com/tikv/pd/client" + pdhttp "github.com/tikv/pd/client/http" ) type precheckContextKey string @@ -27,15 +27,15 @@ type PrecheckItemBuilder struct { dbMetas []*mydump.MDDatabaseMeta preInfoGetter PreImportInfoGetter checkpointsDB checkpoints.DB - pdLeaderAddrGetter func() string + pdLeaderAddrGetter func(context.Context) string } // NewPrecheckItemBuilderFromConfig creates a new PrecheckItemBuilder from config -// pdCli **must not** be nil for local backend +// pdHTTPCli **must not** be nil for local backend func NewPrecheckItemBuilderFromConfig( ctx context.Context, cfg *config.Config, - pdCli pd.Client, + pdHTTPCli pdhttp.Client, opts ...ropts.PrecheckItemBuilderOption, ) (*PrecheckItemBuilder, error) { var gerr error @@ -47,7 +47,7 @@ func NewPrecheckItemBuilderFromConfig( if err != nil { return nil, errors.Trace(err) } - targetInfoGetter, err := NewTargetInfoGetterImpl(cfg, targetDB, pdCli) + targetInfoGetter, err := NewTargetInfoGetterImpl(cfg, targetDB, pdHTTPCli) if err != nil { return nil, errors.Trace(err) } @@ -77,7 +77,7 @@ func NewPrecheckItemBuilderFromConfig( if err != nil { return nil, errors.Trace(err) } - return NewPrecheckItemBuilder(cfg, dbMetas, preInfoGetter, cpdb, pdCli), gerr + return NewPrecheckItemBuilder(cfg, dbMetas, preInfoGetter, cpdb, pdHTTPCli), gerr } // NewPrecheckItemBuilder creates a new PrecheckItemBuilder @@ -86,14 +86,24 @@ func NewPrecheckItemBuilder( dbMetas []*mydump.MDDatabaseMeta, preInfoGetter PreImportInfoGetter, checkpointsDB checkpoints.DB, - pdCli pd.Client, + pdHTTPCli pdhttp.Client, ) *PrecheckItemBuilder { - leaderAddrGetter := func() string { + leaderAddrGetter := func(context.Context) string { return cfg.TiDB.PdAddr } // in tests we may not have a pdCli - if pdCli != nil { - leaderAddrGetter = pdCli.GetLeaderAddr + if pdHTTPCli != nil { + leaderAddrGetter = func(ctx context.Context) string { + leaderInfo, err := pdHTTPCli.GetLeader(ctx) + if err != nil { + return cfg.TiDB.PdAddr + } + addrs := leaderInfo.GetClientUrls() + if len(addrs) == 0 { + return cfg.TiDB.PdAddr + } + return addrs[0] + } } return &PrecheckItemBuilder{ cfg: cfg, diff --git a/br/pkg/lightning/importer/precheck_impl.go b/br/pkg/lightning/importer/precheck_impl.go index 517edd5f5e3cb..1f24d6a8cf293 100644 --- a/br/pkg/lightning/importer/precheck_impl.go +++ b/br/pkg/lightning/importer/precheck_impl.go @@ -41,11 +41,11 @@ import ( "github.com/pingcap/tidb/br/pkg/utils" "github.com/pingcap/tidb/pkg/parser/model" "github.com/pingcap/tidb/pkg/parser/mysql" - "github.com/pingcap/tidb/pkg/store/pdtypes" "github.com/pingcap/tidb/pkg/table" "github.com/pingcap/tidb/pkg/types" "github.com/pingcap/tidb/pkg/util/engine" "github.com/pingcap/tidb/pkg/util/set" + pdhttp "github.com/tikv/pd/client/http" clientv3 "go.etcd.io/etcd/client/v3" "go.uber.org/zap" "golang.org/x/sync/errgroup" @@ -75,10 +75,14 @@ func (ci *clusterResourceCheckItem) getClusterAvail(ctx context.Context) (tikvAv } for _, store := range storeInfo.Stores { - if engine.IsTiFlash(store.Store.Store) { - tiflashAvail += uint64(store.Status.Available) + avail, err := units.RAMInBytes(store.Status.Available) + if err != nil { + return 0, 0, errors.Trace(err) + } + if engine.IsTiFlashHTTPResp(&store.Store) { + tiflashAvail += uint64(avail) } else { - tikvAvail += uint64(store.Status.Available) + tikvAvail += uint64(avail) } } return @@ -158,11 +162,11 @@ func (ci *clusterResourceCheckItem) Check(ctx context.Context) (*precheck.CheckR } } - replicaCount, err := ci.preInfoGetter.GetReplicationConfig(ctx) + replicaCount, err := ci.preInfoGetter.GetMaxReplica(ctx) if err != nil { return nil, errors.Trace(err) } - tikvSourceSize = tikvSourceSize * replicaCount.MaxReplicas + tikvSourceSize = tikvSourceSize * replicaCount if tikvSourceSize <= tikvAvail && tiflashSourceSize <= tiflashAvail { theResult.Message = fmt.Sprintf("The storage space is rich, which TiKV/Tiflash is %s/%s. The estimated storage space is %s/%s.", @@ -261,15 +265,16 @@ func (ci *emptyRegionCheckItem) Check(ctx context.Context) (*precheck.CheckResul if err != nil { return nil, errors.Trace(err) } - regions := make(map[uint64]int) - stores := make(map[uint64]*pdtypes.StoreInfo) + regions := make(map[int64]int) + stores := make(map[int64]*pdhttp.StoreInfo) for _, region := range emptyRegionsInfo.Regions { for _, peer := range region.Peers { - regions[peer.StoreId]++ + regions[peer.StoreID]++ } } for _, store := range storeInfo.Stores { - stores[store.Store.GetId()] = store + store := store + stores[store.Store.ID] = &store } tableCount := 0 for _, db := range ci.dbMetas { @@ -290,7 +295,7 @@ func (ci *emptyRegionCheckItem) Check(ctx context.Context) (*precheck.CheckResul if metapb.StoreState(metapb.StoreState_value[store.Store.StateName]) != metapb.StoreState_Up { continue } - if engine.IsTiFlash(store.Store.Store) { + if engine.IsTiFlashHTTPResp(&store.Store) { continue } if regionCnt > errorThrehold { @@ -348,20 +353,21 @@ func (ci *regionDistributionCheckItem) Check(ctx context.Context) (*precheck.Che if err != nil { return nil, errors.Trace(err) } - stores := make([]*pdtypes.StoreInfo, 0, len(storesInfo.Stores)) + stores := make([]*pdhttp.StoreInfo, 0, len(storesInfo.Stores)) for _, store := range storesInfo.Stores { + store := store if metapb.StoreState(metapb.StoreState_value[store.Store.StateName]) != metapb.StoreState_Up { continue } - if engine.IsTiFlash(store.Store.Store) { + if engine.IsTiFlashHTTPResp(&store.Store) { continue } - stores = append(stores, store) + stores = append(stores, &store) } if len(stores) <= 1 { return theResult, nil } - slices.SortFunc(stores, func(i, j *pdtypes.StoreInfo) int { + slices.SortFunc(stores, func(i, j *pdhttp.StoreInfo) int { return cmp.Compare(i.Status.RegionCount, j.Status.RegionCount) }) minStore := stores[0] @@ -380,7 +386,7 @@ func (ci *regionDistributionCheckItem) Check(ctx context.Context) (*precheck.Che tableCount += len(info.Tables) } threhold := max(checkRegionCntRatioThreshold, tableCount) - if maxStore.Status.RegionCount <= threhold { + if maxStore.Status.RegionCount <= int64(threhold) { return theResult, nil } ratio := float64(minStore.Status.RegionCount) / float64(maxStore.Status.RegionCount) @@ -388,11 +394,11 @@ func (ci *regionDistributionCheckItem) Check(ctx context.Context) (*precheck.Che theResult.Passed = false theResult.Message = fmt.Sprintf("Region distribution is unbalanced, the ratio of the regions count of the store(%v) "+ "with least regions(%v) to the store(%v) with most regions(%v) is %v, but we expect it must not be less than %v", - minStore.Store.GetId(), minStore.Status.RegionCount, maxStore.Store.GetId(), maxStore.Status.RegionCount, ratio, errorRegionCntMinMaxRatio) + minStore.Store.ID, minStore.Status.RegionCount, maxStore.Store.ID, maxStore.Status.RegionCount, ratio, errorRegionCntMinMaxRatio) } else if ratio < warnRegionCntMinMaxRatio { theResult.Message = fmt.Sprintf("Region distribution is unbalanced, the ratio of the regions count of the store(%v) "+ "with least regions(%v) to the store(%v) with most regions(%v) is %v, but we expect it should not be less than %v", - minStore.Store.GetId(), minStore.Status.RegionCount, maxStore.Store.GetId(), maxStore.Status.RegionCount, ratio, warnRegionCntMinMaxRatio) + minStore.Store.ID, minStore.Status.RegionCount, maxStore.Store.ID, maxStore.Status.RegionCount, ratio, warnRegionCntMinMaxRatio) } return theResult, nil } @@ -748,13 +754,13 @@ func (ci *checkpointCheckItem) checkpointIsValid(ctx context.Context, tableInfo type CDCPITRCheckItem struct { cfg *config.Config Instruction string - leaderAddrGetter func() string + leaderAddrGetter func(context.Context) string // used in test etcdCli *clientv3.Client } // NewCDCPITRCheckItem creates a checker to check downstream has enabled CDC or PiTR. -func NewCDCPITRCheckItem(cfg *config.Config, leaderAddrGetter func() string) precheck.Checker { +func NewCDCPITRCheckItem(cfg *config.Config, leaderAddrGetter func(context.Context) string) precheck.Checker { return &CDCPITRCheckItem{ cfg: cfg, Instruction: "local backend is not compatible with them. Please switch to tidb backend then try again.", @@ -807,7 +813,7 @@ func (ci *CDCPITRCheckItem) Check(ctx context.Context) (*precheck.CheckResult, e if ci.etcdCli == nil { var err error - ci.etcdCli, err = dialEtcdWithCfg(ctx, ci.cfg, ci.leaderAddrGetter()) + ci.etcdCli, err = dialEtcdWithCfg(ctx, ci.cfg, ci.leaderAddrGetter(ctx)) if err != nil { return nil, errors.Trace(err) } diff --git a/br/pkg/lightning/importer/table_import.go b/br/pkg/lightning/importer/table_import.go index 5cf39f26c1bde..7f13c9d1cc62b 100644 --- a/br/pkg/lightning/importer/table_import.go +++ b/br/pkg/lightning/importer/table_import.go @@ -42,6 +42,7 @@ import ( verify "github.com/pingcap/tidb/br/pkg/lightning/verification" "github.com/pingcap/tidb/br/pkg/lightning/web" "github.com/pingcap/tidb/br/pkg/lightning/worker" + "github.com/pingcap/tidb/br/pkg/storage" "github.com/pingcap/tidb/br/pkg/version" "github.com/pingcap/tidb/pkg/errno" tidbkv "github.com/pingcap/tidb/pkg/kv" @@ -71,6 +72,7 @@ type TableImporter struct { logger log.Logger kvStore tidbkv.Storage etcdCli *clientv3.Client + autoidCli *autoid.ClientDiscover // dupIgnoreRows tracks the rowIDs of rows that are duplicated and should be ignored. dupIgnoreRows extsort.ExternalSorter @@ -95,6 +97,7 @@ func NewTableImporter( if err != nil { return nil, errors.Annotatef(err, "failed to tables.TableFromMeta %s", tableName) } + autoidCli := autoid.NewClientDiscover(etcdCli) return &TableImporter{ tableName: tableName, @@ -105,6 +108,7 @@ func NewTableImporter( alloc: idAlloc, kvStore: kvStore, etcdCli: etcdCli, + autoidCli: autoidCli, logger: logger.With(zap.String("table", tableName)), ignoreColumns: ignoreColumns, }, nil @@ -328,9 +332,9 @@ func (tr *TableImporter) Store() tidbkv.Storage { return tr.kvStore } -// GetEtcdClient implements the autoid.Requirement interface. -func (tr *TableImporter) GetEtcdClient() *clientv3.Client { - return tr.etcdCli +// AutoIDClient implements the autoid.Requirement interface. +func (tr *TableImporter) AutoIDClient() *autoid.ClientDiscover { + return tr.autoidCli } // RebaseChunkRowIDs rebase the row id of the chunks. @@ -445,6 +449,7 @@ func (tr *TableImporter) importEngines(pCtx context.Context, rc *Controller, cp Compact: threshold > 0, CompactConcurrency: 4, CompactThreshold: threshold, + BlockSize: int(rc.cfg.TikvImporter.BlockSize), } } // import backend can't reopen engine if engine is closed, so @@ -765,6 +770,13 @@ ChunkLoop: break } + if chunk.FileMeta.Type == mydump.SourceTypeParquet { + // TODO: use the compressed size of the chunk to conduct memory control + if _, err = getChunkCompressedSizeForParquet(ctx, chunk, rc.store); err != nil { + return nil, errors.Trace(err) + } + } + restoreWorker := rc.regionWorkers.Apply() wg.Add(1) go func(w *worker.Worker, cr *chunkProcessor) { @@ -939,7 +951,6 @@ func (tr *TableImporter) postProcess( // alter table set auto_increment if cp.Status < checkpoints.CheckpointStatusAlteredAutoInc { - rc.alterTableLock.Lock() tblInfo := tr.tableInfo.Core var err error if tblInfo.ContainsAutoRandomBits() { @@ -964,7 +975,6 @@ func (tr *TableImporter) postProcess( err = common.RebaseGlobalAutoID(ctx, adjustIDBase(newBase), tr, tr.dbInfo.ID, tr.tableInfo.Core) } } - rc.alterTableLock.Unlock() saveCpErr := rc.saveStatusCheckpoint(ctx, tr.tableName, checkpoints.WholeTableEngineID, err, checkpoints.CheckpointStatusAlteredAutoInc) if err = firstErr(err, saveCpErr); err != nil { return false, errors.Trace(err) @@ -987,6 +997,7 @@ func (tr *TableImporter) postProcess( defer rc.checksumWorks.Recycle(w) shouldSkipAnalyze := false + estimatedModifyCnt := 100_000_000 if cp.Status < checkpoints.CheckpointStatusChecksumSkipped { // 4. do table checksum var localChecksum verify.KVChecksum @@ -995,6 +1006,11 @@ func (tr *TableImporter) postProcess( localChecksum.Add(&chunk.Checksum) } } + indexNum := len(tr.tableInfo.Core.Indices) + if common.TableHasAutoRowID(tr.tableInfo.Core) { + indexNum++ + } + estimatedModifyCnt = int(localChecksum.SumKVS()) / (1 + indexNum) tr.logger.Info("local checksum", zap.Object("checksum", &localChecksum)) // 4.5. do duplicate detection. @@ -1135,6 +1151,9 @@ func (tr *TableImporter) postProcess( if cp.Status < checkpoints.CheckpointStatusAnalyzeSkipped { switch { case shouldSkipAnalyze || rc.cfg.PostRestore.Analyze == config.OpLevelOff: + if !shouldSkipAnalyze { + updateStatsMeta(ctx, rc.db, tr.tableInfo.ID, estimatedModifyCnt) + } tr.logger.Info("skip analyze") if err := rc.saveStatusCheckpoint(ctx, tr.tableName, checkpoints.WholeTableEngineID, nil, checkpoints.CheckpointStatusAnalyzeSkipped); err != nil { return false, errors.Trace(err) @@ -1160,6 +1179,70 @@ func (tr *TableImporter) postProcess( return true, nil } +func getChunkCompressedSizeForParquet( + ctx context.Context, + chunk *checkpoints.ChunkCheckpoint, + store storage.ExternalStorage, +) (int64, error) { + reader, err := mydump.OpenReader(ctx, &chunk.FileMeta, store, storage.DecompressConfig{}) + if err != nil { + return 0, errors.Trace(err) + } + parser, err := mydump.NewParquetParser(ctx, store, reader, chunk.FileMeta.Path) + if err != nil { + _ = reader.Close() + return 0, errors.Trace(err) + } + //nolint: errcheck + defer parser.Close() + err = parser.Reader.ReadFooter() + if err != nil { + return 0, errors.Trace(err) + } + rowGroups := parser.Reader.Footer.GetRowGroups() + var maxRowGroupSize int64 + for _, rowGroup := range rowGroups { + var rowGroupSize int64 + columnChunks := rowGroup.GetColumns() + for _, columnChunk := range columnChunks { + columnChunkSize := columnChunk.MetaData.GetTotalCompressedSize() + rowGroupSize += columnChunkSize + } + maxRowGroupSize = max(maxRowGroupSize, rowGroupSize) + } + return maxRowGroupSize, nil +} + +func updateStatsMeta(ctx context.Context, db *sql.DB, tableID int64, count int) { + s := common.SQLWithRetry{ + DB: db, + Logger: log.FromContext(ctx).With(zap.Int64("tableID", tableID)), + } + err := s.Transact(ctx, "update stats_meta", func(ctx context.Context, tx *sql.Tx) error { + rs, err := tx.ExecContext(ctx, ` +update mysql.stats_meta + set modify_count = ?, + count = ?, + version = @@tidb_current_ts + where table_id = ?; +`, count, count, tableID) + if err != nil { + return errors.Trace(err) + } + affected, err := rs.RowsAffected() + if err != nil { + return errors.Trace(err) + } + if affected == 0 { + return errors.Errorf("record with table_id %d not found", tableID) + } + return nil + }) + if err != nil { + s.Logger.Warn("failed to update stats_meta", zap.Error(err)) + } +} + func parseColumnPermutations( tableInfo *model.TableInfo, columns []string, @@ -1310,10 +1393,9 @@ func (tr *TableImporter) dropIndexes(ctx context.Context, db *sql.DB) error { logger := log.FromContext(ctx).With(zap.String("table", tr.tableName)) tblInfo := tr.tableInfo - tableName := common.UniqueTable(tblInfo.DB, tblInfo.Name) remainIndexes, dropIndexes := common.GetDropIndexInfos(tblInfo.Core) for _, idxInfo := range dropIndexes { - sqlStr := common.BuildDropIndexSQL(tableName, idxInfo) + sqlStr := common.BuildDropIndexSQL(tblInfo.DB, tblInfo.Name, idxInfo) logger.Info("drop index", zap.String("sql", sqlStr)) diff --git a/br/pkg/lightning/importer/table_import_test.go b/br/pkg/lightning/importer/table_import_test.go index 3891dcde52e30..7c13e0ab5e22a 100644 --- a/br/pkg/lightning/importer/table_import_test.go +++ b/br/pkg/lightning/importer/table_import_test.go @@ -17,10 +17,7 @@ package importer import ( "context" "database/sql" - "encoding/json" "fmt" - "net/http" - "net/http/httptest" "os" "path/filepath" "strconv" @@ -34,7 +31,6 @@ import ( "github.com/google/uuid" "github.com/pingcap/errors" "github.com/pingcap/failpoint" - "github.com/pingcap/kvproto/pkg/metapb" "github.com/pingcap/tidb/br/pkg/lightning/backend" "github.com/pingcap/tidb/br/pkg/lightning/backend/encode" "github.com/pingcap/tidb/br/pkg/lightning/backend/kv" @@ -60,7 +56,6 @@ import ( "github.com/pingcap/tidb/pkg/parser/ast" "github.com/pingcap/tidb/pkg/parser/model" "github.com/pingcap/tidb/pkg/parser/mysql" - "github.com/pingcap/tidb/pkg/store/pdtypes" "github.com/pingcap/tidb/pkg/table/tables" "github.com/pingcap/tidb/pkg/types" tmock "github.com/pingcap/tidb/pkg/util/mock" @@ -68,7 +63,6 @@ import ( filter "github.com/pingcap/tidb/pkg/util/table-filter" "github.com/stretchr/testify/require" "github.com/stretchr/testify/suite" - "github.com/tikv/client-go/v2/testutils" pd "github.com/tikv/pd/client" pdhttp "github.com/tikv/pd/client/http" "go.uber.org/mock/gomock" @@ -1097,52 +1091,71 @@ func (s *tableRestoreSuite) TestSaveStatusCheckpoint() { rc.checkpointsWg.Wait() } +type mockPDHTTPCli struct { + pdhttp.Client + storesInfo *pdhttp.StoresInfo + replicaCfg map[string]interface{} + emptyRegions *pdhttp.RegionsInfo +} + +func (c mockPDHTTPCli) GetStores(context.Context) (*pdhttp.StoresInfo, error) { + return c.storesInfo, nil +} + +func (c mockPDHTTPCli) GetReplicateConfig(context.Context) (map[string]interface{}, error) { + return c.replicaCfg, nil +} + +func (c mockPDHTTPCli) GetEmptyRegions(context.Context) (*pdhttp.RegionsInfo, error) { + return c.emptyRegions, nil +} + func (s *tableRestoreSuite) TestCheckClusterResource() { cases := []struct { - mockStoreResponse []byte - mockReplicaResponse []byte + mockStoreResponse *pdhttp.StoresInfo + mockReplicaResponse map[string]interface{} expectMsg string expectResult bool expectErrorCount int }{ { - []byte(`{ - "count": 1, - "stores": [ + &pdhttp.StoresInfo{ + Count: 1, + Stores: []pdhttp.StoreInfo{ { - "store": { - "id": 2 + Store: pdhttp.MetaStore{ + ID: 2, + }, + Status: pdhttp.StoreStatus{ + Available: "24", }, - "status": { - "available": "24" - } - } - ] - }`), - []byte(`{ - "max-replicas": 1 - }`), + }, + }, + }, + map[string]interface{}{ + "max-replicas": 1.0, + }, "(.*)The storage space is rich(.*)", true, 0, }, { - []byte(`{ - "count": 1, - "stores": [ + &pdhttp.StoresInfo{ + Count: 1, + Stores: []pdhttp.StoreInfo{ { - "store": { - "id": 2 + Store: pdhttp.MetaStore{ + ID: 2, + }, + Status: pdhttp.StoreStatus{ + Available: "15", }, - "status": { - "available": "15" - } - } - ] - }`), - []byte(`{ - "max-replicas": 1 - }`), + }, + }, + }, + map[string]interface{}{ + "max-replicas": 1.0, + }, "(.*)Please increase storage(.*)", true, 0, @@ -1164,29 +1177,17 @@ func (s *tableRestoreSuite) TestCheckClusterResource() { require.NoError(s.T(), err) mockStore, err := storage.NewLocalStorage(dir) require.NoError(s.T(), err) - _, _, pdClient, err := testutils.NewMockTiKV("", nil) - require.NoError(s.T(), err) for _, ca := range cases { - server := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { - var err error - if strings.HasSuffix(req.URL.Path, "stores") { - _, err = w.Write(ca.mockStoreResponse) - } else { - _, err = w.Write(ca.mockReplicaResponse) - } - require.NoError(s.T(), err) - })) - - tls := common.NewTLSFromMockServer(server) template := NewSimpleTemplate() - url := strings.TrimPrefix(server.URL, "https://") - cfg := &config.Config{TiDB: config.DBStore{PdAddr: url}} - pdCli := &mockPDClient{Client: pdClient, leaderAddr: url} + cfg := &config.Config{} + cli := &mockPDHTTPCli{ + storesInfo: ca.mockStoreResponse, + replicaCfg: ca.mockReplicaResponse, + } targetInfoGetter := &TargetInfoGetterImpl{ - cfg: cfg, - tls: tls, - pdCli: pdCli, + cfg: cfg, + pdHTTPCli: cli, } preInfoGetter := &PreImportInfoGetterImpl{ cfg: cfg, @@ -1196,12 +1197,11 @@ func (s *tableRestoreSuite) TestCheckClusterResource() { theCheckBuilder := NewPrecheckItemBuilder(cfg, []*mydump.MDDatabaseMeta{}, preInfoGetter, nil, nil) rc := &Controller{ cfg: cfg, - tls: tls, store: mockStore, checkTemplate: template, preInfoGetter: preInfoGetter, precheckItemBuilder: theCheckBuilder, - pdCli: pdCli, + pdHTTPCli: cli, } var sourceSize int64 err = rc.store.WalkDir(ctx, &storage.WalkOption{}, func(path string, size int64) error { @@ -1219,8 +1219,6 @@ func (s *tableRestoreSuite) TestCheckClusterResource() { require.Equal(s.T(), ca.expectErrorCount, template.FailedCount(precheck.Critical)) require.Equal(s.T(), ca.expectResult, template.Success()) require.Regexp(s.T(), ca.expectMsg, strings.ReplaceAll(template.Output(), "\n", "")) - - server.Close() } } @@ -1249,41 +1247,39 @@ func (m *mockPDClient) GetLeaderAddr() string { func (s *tableRestoreSuite) TestCheckClusterRegion() { type testCase struct { - stores pdtypes.StoresInfo - emptyRegions pdtypes.RegionsInfo + stores pdhttp.StoresInfo + emptyRegions pdhttp.RegionsInfo expectMsgs []string expectErrorCnt int } - makeRegions := func(regionCnt int, storeID uint64) []pdtypes.RegionInfo { - var regions []pdtypes.RegionInfo + makeRegions := func(regionCnt int, storeID int64) []pdhttp.RegionInfo { + var regions []pdhttp.RegionInfo for i := 0; i < regionCnt; i++ { - regions = append(regions, pdtypes.RegionInfo{Peers: []pdtypes.MetaPeer{{Peer: &metapb.Peer{StoreId: storeID}}}}) + regions = append(regions, pdhttp.RegionInfo{Peers: []pdhttp.RegionPeer{{StoreID: storeID}}}) } return regions } - _, _, pdClient, err := testutils.NewMockTiKV("", nil) - require.NoError(s.T(), err) testCases := []testCase{ { - stores: pdtypes.StoresInfo{Stores: []*pdtypes.StoreInfo{ - {Store: &pdtypes.MetaStore{Store: &metapb.Store{Id: 1}}, Status: &pdtypes.StoreStatus{RegionCount: 200}}, + stores: pdhttp.StoresInfo{Stores: []pdhttp.StoreInfo{ + {Store: pdhttp.MetaStore{ID: 1}, Status: pdhttp.StoreStatus{RegionCount: 200}}, }}, - emptyRegions: pdtypes.RegionsInfo{ - Regions: append([]pdtypes.RegionInfo(nil), makeRegions(100, 1)...), + emptyRegions: pdhttp.RegionsInfo{ + Regions: append([]pdhttp.RegionInfo(nil), makeRegions(100, 1)...), }, expectMsgs: []string{".*Cluster doesn't have too many empty regions.*", ".*Cluster region distribution is balanced.*"}, expectErrorCnt: 0, }, { - stores: pdtypes.StoresInfo{Stores: []*pdtypes.StoreInfo{ - {Store: &pdtypes.MetaStore{Store: &metapb.Store{Id: 1}}, Status: &pdtypes.StoreStatus{RegionCount: 2000}}, - {Store: &pdtypes.MetaStore{Store: &metapb.Store{Id: 2}}, Status: &pdtypes.StoreStatus{RegionCount: 3100}}, - {Store: &pdtypes.MetaStore{Store: &metapb.Store{Id: 3}}, Status: &pdtypes.StoreStatus{RegionCount: 2500}}, + stores: pdhttp.StoresInfo{Stores: []pdhttp.StoreInfo{ + {Store: pdhttp.MetaStore{ID: 1}, Status: pdhttp.StoreStatus{RegionCount: 2000}}, + {Store: pdhttp.MetaStore{ID: 2}, Status: pdhttp.StoreStatus{RegionCount: 3100}}, + {Store: pdhttp.MetaStore{ID: 3}, Status: pdhttp.StoreStatus{RegionCount: 2500}}, }}, - emptyRegions: pdtypes.RegionsInfo{ - Regions: append(append(append([]pdtypes.RegionInfo(nil), + emptyRegions: pdhttp.RegionsInfo{ + Regions: append(append(append([]pdhttp.RegionInfo(nil), makeRegions(600, 1)...), makeRegions(300, 2)...), makeRegions(1200, 3)...), @@ -1296,55 +1292,34 @@ func (s *tableRestoreSuite) TestCheckClusterRegion() { expectErrorCnt: 1, // empty region too large }, { - stores: pdtypes.StoresInfo{Stores: []*pdtypes.StoreInfo{ - {Store: &pdtypes.MetaStore{Store: &metapb.Store{Id: 1}}, Status: &pdtypes.StoreStatus{RegionCount: 1200}}, - {Store: &pdtypes.MetaStore{Store: &metapb.Store{Id: 2}}, Status: &pdtypes.StoreStatus{RegionCount: 3000}}, - {Store: &pdtypes.MetaStore{Store: &metapb.Store{Id: 3}}, Status: &pdtypes.StoreStatus{RegionCount: 2500}}, + stores: pdhttp.StoresInfo{Stores: []pdhttp.StoreInfo{ + {Store: pdhttp.MetaStore{ID: 1}, Status: pdhttp.StoreStatus{RegionCount: 1200}}, + {Store: pdhttp.MetaStore{ID: 2}, Status: pdhttp.StoreStatus{RegionCount: 3000}}, + {Store: pdhttp.MetaStore{ID: 3}, Status: pdhttp.StoreStatus{RegionCount: 2500}}, }}, expectMsgs: []string{".*Region distribution is unbalanced.*but we expect it must not be less than 0.5.*"}, expectErrorCnt: 1, }, { - stores: pdtypes.StoresInfo{Stores: []*pdtypes.StoreInfo{ - {Store: &pdtypes.MetaStore{Store: &metapb.Store{Id: 1}}, Status: &pdtypes.StoreStatus{RegionCount: 0}}, - {Store: &pdtypes.MetaStore{Store: &metapb.Store{Id: 2}}, Status: &pdtypes.StoreStatus{RegionCount: 2800}}, - {Store: &pdtypes.MetaStore{Store: &metapb.Store{Id: 3}}, Status: &pdtypes.StoreStatus{RegionCount: 2500}}, + stores: pdhttp.StoresInfo{Stores: []pdhttp.StoreInfo{ + {Store: pdhttp.MetaStore{ID: 1}, Status: pdhttp.StoreStatus{RegionCount: 0}}, + {Store: pdhttp.MetaStore{ID: 2}, Status: pdhttp.StoreStatus{RegionCount: 2800}}, + {Store: pdhttp.MetaStore{ID: 3}, Status: pdhttp.StoreStatus{RegionCount: 2500}}, }}, expectMsgs: []string{".*Region distribution is unbalanced.*but we expect it must not be less than 0.5.*"}, expectErrorCnt: 1, }, } - mustMarshal := func(v interface{}) []byte { - data, err := json.Marshal(v) - require.NoError(s.T(), err) - return data - } - for i, ca := range testCases { - server := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { - var err error - if req.URL.Path == pdhttp.Stores { - _, err = w.Write(mustMarshal(ca.stores)) - } else if req.URL.Path == pdhttp.EmptyRegions { - _, err = w.Write(mustMarshal(ca.emptyRegions)) - } else { - w.WriteHeader(http.StatusNotFound) - } - require.NoError(s.T(), err) - })) - - tls := common.NewTLSFromMockServer(server) template := NewSimpleTemplate() - url := strings.TrimPrefix(server.URL, "https://") - cfg := &config.Config{TiDB: config.DBStore{PdAddr: url}} - pdCli := &mockPDClient{Client: pdClient, leaderAddr: url} + cfg := &config.Config{} + cli := &mockPDHTTPCli{storesInfo: &ca.stores, emptyRegions: &ca.emptyRegions} targetInfoGetter := &TargetInfoGetterImpl{ - cfg: cfg, - tls: tls, - pdCli: pdCli, + cfg: cfg, + pdHTTPCli: cli, } dbMetas := []*mydump.MDDatabaseMeta{} preInfoGetter := &PreImportInfoGetterImpl{ @@ -1355,13 +1330,12 @@ func (s *tableRestoreSuite) TestCheckClusterRegion() { theCheckBuilder := NewPrecheckItemBuilder(cfg, dbMetas, preInfoGetter, checkpoints.NewNullCheckpointsDB(), nil) rc := &Controller{ cfg: cfg, - tls: tls, taskMgr: mockTaskMetaMgr{}, checkTemplate: template, preInfoGetter: preInfoGetter, dbInfos: make(map[string]*checkpoints.TidbDBInfo), precheckItemBuilder: theCheckBuilder, - pdCli: pdCli, + pdHTTPCli: cli, } preInfoGetter.dbInfosCache = rc.dbInfos @@ -1373,8 +1347,6 @@ func (s *tableRestoreSuite) TestCheckClusterRegion() { for _, expectMsg := range ca.expectMsgs { require.Regexp(s.T(), expectMsg, strings.ReplaceAll(template.Output(), "\n", "")) } - - server.Close() } } @@ -2421,3 +2393,39 @@ func TestGetDDLStatus(t *testing.T) { require.Equal(t, model.JobStateRunning, status.state) require.Equal(t, int64(123)+int64(456), status.rowCount) } + +func TestGetChunkCompressedSizeForParquet(t *testing.T) { + dir := "./testdata/" + fileName := "000000_0.parquet" + store, err := storage.NewLocalStorage(dir) + require.NoError(t, err) + + dataFiles := make([]mydump.FileInfo, 0) + dataFiles = append(dataFiles, mydump.FileInfo{ + TableName: filter.Table{Schema: "db", Name: "table"}, + FileMeta: mydump.SourceFileMeta{ + Path: fileName, + Type: mydump.SourceTypeParquet, + Compression: mydump.CompressionNone, + SortKey: "99", + FileSize: 192, + }, + }) + + chunk := checkpoints.ChunkCheckpoint{ + Key: checkpoints.ChunkCheckpointKey{Path: dataFiles[0].FileMeta.Path, Offset: 0}, + FileMeta: dataFiles[0].FileMeta, + Chunk: mydump.Chunk{ + Offset: 0, + EndOffset: 192, + PrevRowIDMax: 0, + RowIDMax: 100, + }, + } + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + compressedSize, err := getChunkCompressedSizeForParquet(ctx, &chunk, store) + require.NoError(t, err) + require.Equal(t, compressedSize, int64(192)) +} diff --git a/br/pkg/lightning/importer/testdata/000000_0.parquet b/br/pkg/lightning/importer/testdata/000000_0.parquet new file mode 100644 index 0000000000000..ae8a5001bc2b3 Binary files /dev/null and b/br/pkg/lightning/importer/testdata/000000_0.parquet differ diff --git a/br/pkg/lightning/importer/tidb.go b/br/pkg/lightning/importer/tidb.go index 2ca91a1cff535..f9a7aeeadb014 100644 --- a/br/pkg/lightning/importer/tidb.go +++ b/br/pkg/lightning/importer/tidb.go @@ -18,6 +18,7 @@ import ( "context" "database/sql" "fmt" + "maps" "math" "strconv" "strings" @@ -37,7 +38,6 @@ import ( "github.com/pingcap/tidb/pkg/sessionctx/variable" "github.com/tikv/client-go/v2/util" "go.uber.org/zap" - "golang.org/x/exp/maps" ) // TiDBManager is a wrapper of *sql.DB which provides some helper methods for diff --git a/br/pkg/lightning/lightning.go b/br/pkg/lightning/lightning.go index 3c6d9013d262e..7cf1156c7f4a2 100644 --- a/br/pkg/lightning/lightning.go +++ b/br/pkg/lightning/lightning.go @@ -41,6 +41,7 @@ import ( "github.com/pingcap/errors" "github.com/pingcap/failpoint" "github.com/pingcap/kvproto/pkg/import_sstpb" + "github.com/pingcap/kvproto/pkg/metapb" "github.com/pingcap/tidb/br/pkg/lightning/backend/local" "github.com/pingcap/tidb/br/pkg/lightning/checkpoints" "github.com/pingcap/tidb/br/pkg/lightning/common" @@ -64,6 +65,7 @@ import ( "github.com/prometheus/client_golang/prometheus/collectors" "github.com/prometheus/client_golang/prometheus/promhttp" "github.com/shurcooL/httpgzip" + pdhttp "github.com/tikv/pd/client/http" "go.uber.org/atomic" "go.uber.org/zap" "go.uber.org/zap/zapcore" @@ -1054,7 +1056,7 @@ func CleanupMetas(ctx context.Context, cfg *config.Config, tableName string) err } // SwitchMode switches the mode of the TiKV cluster. -func SwitchMode(ctx context.Context, cfg *config.Config, tls *common.TLS, mode string, ranges ...*import_sstpb.Range) error { +func SwitchMode(ctx context.Context, cli pdhttp.Client, tls *common.TLS, mode string, ranges ...*import_sstpb.Range) error { var m import_sstpb.SwitchMode switch mode { case config.ImportMode: @@ -1067,9 +1069,9 @@ func SwitchMode(ctx context.Context, cfg *config.Config, tls *common.TLS, mode s return tikv.ForAllStores( ctx, - tls.WithHost(cfg.TiDB.PdAddr), - tikv.StoreStateDisconnected, - func(c context.Context, store *tikv.Store) error { + cli, + metapb.StoreState_Offline, + func(c context.Context, store *pdhttp.MetaStore) error { return tikv.SwitchMode(c, tls, store.Address, m, ranges...) }, ) diff --git a/br/pkg/lightning/log/BUILD.bazel b/br/pkg/lightning/log/BUILD.bazel index 7ed3c01476c73..ab2e89b4ccbcc 100644 --- a/br/pkg/lightning/log/BUILD.bazel +++ b/br/pkg/lightning/log/BUILD.bazel @@ -12,7 +12,6 @@ go_library( deps = [ "//pkg/util/logutil", "@com_github_aws_aws_sdk_go//aws/awserr", - "@com_github_aws_aws_sdk_go//aws/request", "@com_github_pingcap_errors//:errors", "@com_github_pingcap_log//:log", "@org_golang_google_grpc//codes", diff --git a/br/pkg/lightning/log/log.go b/br/pkg/lightning/log/log.go index bcbfa994bcba8..26bc936f932f8 100644 --- a/br/pkg/lightning/log/log.go +++ b/br/pkg/lightning/log/log.go @@ -21,7 +21,6 @@ import ( "time" "github.com/aws/aws-sdk-go/aws/awserr" - "github.com/aws/aws-sdk-go/aws/request" "github.com/pingcap/errors" pclog "github.com/pingcap/log" "github.com/pingcap/tidb/pkg/util/logutil" @@ -187,9 +186,16 @@ func IsContextCanceledError(err error) bool { return true } - // see https://github.com/aws/aws-sdk-go/blob/9d1f49ba63bdac44a5b9f4d736e79d792e389e8a/aws/credentials/credentials.go#L246-L249 - if v, ok := err.(awserr.Error); ok { - return v.Code() == request.CanceledErrorCode + // see https://github.com/aws/aws-sdk-go/blob/9d1f49ba/aws/credentials/credentials.go#L246-L249 + // 2 cases that have meet: + // awserr.New("RequestCanceled", "request context canceled", err) and the nested err is context.Canceled + // awserr.New( "MultipartUpload", "upload multipart failed", err) and the nested err is the upper one + if v, ok := err.(awserr.BatchedErrors); ok { + for _, origErr := range v.OrigErrs() { + if IsContextCanceledError(origErr) { + return true + } + } } return false } diff --git a/br/pkg/lightning/log/log_test.go b/br/pkg/lightning/log/log_test.go index 25a9507fd0a04..9b0fa920201a1 100644 --- a/br/pkg/lightning/log/log_test.go +++ b/br/pkg/lightning/log/log_test.go @@ -97,8 +97,11 @@ func TestIsContextCanceledError(t *testing.T) { require.True(t, log.IsContextCanceledError(context.Canceled)) require.True(t, log.IsContextCanceledError(status.Error(codes.Canceled, ""))) require.True(t, log.IsContextCanceledError(errors.Annotate(context.Canceled, "foo"))) - require.True(t, log.IsContextCanceledError(awserr.New(request.CanceledErrorCode, "", nil))) + require.True(t, log.IsContextCanceledError(awserr.New(request.CanceledErrorCode, "", context.Canceled))) + require.True(t, log.IsContextCanceledError(awserr.New( + "MultipartUpload", "upload multipart failed", + awserr.New(request.CanceledErrorCode, "", context.Canceled)))) + require.True(t, log.IsContextCanceledError(awserr.New(request.ErrCodeRequestError, "", context.Canceled))) - require.False(t, log.IsContextCanceledError(awserr.New(request.ErrCodeRequestError, "", nil))) require.False(t, log.IsContextCanceledError(nil)) } diff --git a/br/pkg/lightning/mydump/loader.go b/br/pkg/lightning/mydump/loader.go index 630a40e015a24..3b3b95eadc8f4 100644 --- a/br/pkg/lightning/mydump/loader.go +++ b/br/pkg/lightning/mydump/loader.go @@ -69,7 +69,7 @@ func (m *MDDatabaseMeta) GetSchema(ctx context.Context, store storage.ExternalSt } } // set default if schema sql is empty or failed to extract. - return "CREATE DATABASE IF NOT EXISTS " + common.EscapeIdentifier(m.Name) + return common.SprintfWithIdentifiers("CREATE DATABASE IF NOT EXISTS %s", m.Name) } // MDTableMeta contains some parsed metadata for a table in the source by MyDumper Loader. diff --git a/br/pkg/lightning/mydump/main_test.go b/br/pkg/lightning/mydump/main_test.go index 57b3db6db90eb..1dc76d3bc1255 100644 --- a/br/pkg/lightning/mydump/main_test.go +++ b/br/pkg/lightning/mydump/main_test.go @@ -25,6 +25,7 @@ func TestMain(m *testing.M) { testsetup.SetupForCommonTest() opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), goleak.IgnoreTopFunction("github.com/klauspost/compress/zstd.(*blockDec).startDecoder"), diff --git a/br/pkg/lightning/tikv/BUILD.bazel b/br/pkg/lightning/tikv/BUILD.bazel index f13cdd3301b26..f278f57681d09 100644 --- a/br/pkg/lightning/tikv/BUILD.bazel +++ b/br/pkg/lightning/tikv/BUILD.bazel @@ -18,6 +18,7 @@ go_library( "@com_github_pingcap_kvproto//pkg/debugpb", "@com_github_pingcap_kvproto//pkg/import_sstpb", "@com_github_pingcap_kvproto//pkg/kvrpcpb", + "@com_github_pingcap_kvproto//pkg/metapb", "@com_github_tikv_client_go_v2//util", "@com_github_tikv_pd_client//http", "@org_golang_google_grpc//:grpc", @@ -36,9 +37,9 @@ go_test( shard_count = 4, deps = [ ":tikv", - "//br/pkg/lightning/common", "@com_github_coreos_go_semver//semver", "@com_github_pingcap_kvproto//pkg/import_sstpb", + "@com_github_pingcap_kvproto//pkg/metapb", "@com_github_stretchr_testify//require", "@com_github_tikv_pd_client//http", ], diff --git a/br/pkg/lightning/tikv/tikv.go b/br/pkg/lightning/tikv/tikv.go index 397e69795cb9c..a661a5f62b067 100644 --- a/br/pkg/lightning/tikv/tikv.go +++ b/br/pkg/lightning/tikv/tikv.go @@ -25,6 +25,7 @@ import ( "github.com/pingcap/kvproto/pkg/debugpb" "github.com/pingcap/kvproto/pkg/import_sstpb" "github.com/pingcap/kvproto/pkg/kvrpcpb" + "github.com/pingcap/kvproto/pkg/metapb" "github.com/pingcap/tidb/br/pkg/lightning/common" "github.com/pingcap/tidb/br/pkg/lightning/config" "github.com/pingcap/tidb/br/pkg/lightning/log" @@ -33,7 +34,7 @@ import ( "github.com/pingcap/tidb/pkg/kv" "github.com/pingcap/tidb/pkg/parser/model" "github.com/tikv/client-go/v2/util" - pd "github.com/tikv/pd/client/http" + pdhttp "github.com/tikv/pd/client/http" "go.uber.org/zap" "golang.org/x/sync/errgroup" "google.golang.org/grpc" @@ -65,32 +66,12 @@ const ( StoreStateTombstone ) -var jsonToStoreState = map[string]StoreState{ - `"Up"`: StoreStateUp, - `"Offline"`: StoreStateOffline, - `"Disconnected"`: StoreStateDisconnected, - `"Down"`: StoreStateDown, - `"Tombstone"`: StoreStateTombstone, -} - -// UnmarshalJSON implements the json.Unmarshaler interface. -func (ss *StoreState) UnmarshalJSON(content []byte) error { - if state, ok := jsonToStoreState[string(content)]; ok { - *ss = state - return nil - } - return errors.New("Unknown store state") -} - -// Store contains metadata about a TiKV store. -type Store struct { - Address string - Version string - State StoreState `json:"state_name"` -} - -func withTiKVConnection(ctx context.Context, tls *common.TLS, tikvAddr string, - action func(import_sstpb.ImportSSTClient) error) error { +func withTiKVConnection( + ctx context.Context, + tls *common.TLS, + tikvAddr string, + action func(import_sstpb.ImportSSTClient) error, +) error { // Connect to the ImportSST service on the given TiKV node. // The connection is needed for executing `action` and will be tear down // when this function exits. @@ -105,34 +86,27 @@ func withTiKVConnection(ctx context.Context, tls *common.TLS, tikvAddr string, } // ForAllStores executes `action` in parallel for all TiKV stores connected to -// a PD server given by the HTTPS client `tls`. +// a PD server. // // Returns the first non-nil error returned in all `action` calls. If all // `action` returns nil, this method would return nil as well. // -// The `minState` argument defines the minimum store state to be included in the -// result (Tombstone < Offline < Down < Disconnected < Up). +// The `maxState` argument defines the maximum store state (inclusive) to be +// included in the result (Up < Offline < Tombstone). func ForAllStores( ctx context.Context, - tls *common.TLS, - minState StoreState, - action func(c context.Context, store *Store) error, + pdHTTPCli pdhttp.Client, + maxState metapb.StoreState, + action func(c context.Context, store *pdhttp.MetaStore) error, ) error { - // Go through the HTTP interface instead of gRPC so we don't need to keep - // track of the cluster ID. - var stores struct { - Stores []struct { - Store Store - } - } - err := tls.GetJSON(ctx, pd.Stores, &stores) + storesInfo, err := pdHTTPCli.GetStores(ctx) if err != nil { return err } eg, c := errgroup.WithContext(ctx) - for _, store := range stores.Stores { - if store.Store.State >= minState { + for _, store := range storesInfo.Stores { + if store.Store.State <= int64(maxState) { s := store.Store eg.Go(func() error { return action(c, &s) }) } @@ -242,9 +216,12 @@ func FetchRemoteTableModelsFromTLS(ctx context.Context, tls *common.TLS, schema } // CheckPDVersion checks the version of PD. -func CheckPDVersion(ctx context.Context, tls *common.TLS, pdAddr string, - requiredMinVersion, requiredMaxVersion semver.Version) error { - ver, err := pdutil.FetchPDVersion(ctx, tls, pdAddr) +func CheckPDVersion( + ctx context.Context, + pdHTTPCli pdhttp.Client, + requiredMinVersion, requiredMaxVersion semver.Version, +) error { + ver, err := pdutil.FetchPDVersion(ctx, pdHTTPCli) if err != nil { return errors.Trace(err) } @@ -253,13 +230,16 @@ func CheckPDVersion(ctx context.Context, tls *common.TLS, pdAddr string, } // CheckTiKVVersion checks the version of TiKV. -func CheckTiKVVersion(ctx context.Context, tls *common.TLS, pdAddr string, - requiredMinVersion, requiredMaxVersion semver.Version) error { +func CheckTiKVVersion( + ctx context.Context, + pdHTTPCli pdhttp.Client, + requiredMinVersion, requiredMaxVersion semver.Version, +) error { return ForAllStores( ctx, - tls.WithHost(pdAddr), - StoreStateDown, - func(c context.Context, store *Store) error { + pdHTTPCli, + metapb.StoreState_Offline, + func(c context.Context, store *pdhttp.MetaStore) error { component := fmt.Sprintf("TiKV (at %s)", store.Address) ver, err := semver.NewVersion(strings.TrimPrefix(store.Version, "v")) if err != nil { diff --git a/br/pkg/lightning/tikv/tikv_test.go b/br/pkg/lightning/tikv/tikv_test.go index ff6c6eb5677a8..661975b85d14e 100644 --- a/br/pkg/lightning/tikv/tikv_test.go +++ b/br/pkg/lightning/tikv/tikv_test.go @@ -16,21 +16,17 @@ package tikv_test import ( "context" - "encoding/json" "fmt" - "net/http" - "net/http/httptest" - "net/url" "sort" "sync" "testing" "github.com/coreos/go-semver/semver" "github.com/pingcap/kvproto/pkg/import_sstpb" - "github.com/pingcap/tidb/br/pkg/lightning/common" + "github.com/pingcap/kvproto/pkg/metapb" kv "github.com/pingcap/tidb/br/pkg/lightning/tikv" "github.com/stretchr/testify/require" - pd "github.com/tikv/pd/client/http" + pdhttp "github.com/tikv/pd/client/http" ) var ( @@ -42,71 +38,53 @@ var ( requiredMaxTiKVVersion = *semver.New("6.0.0") ) +type mockGetStoresCli struct { + pdhttp.Client + storesInfo *pdhttp.StoresInfo +} + +func (c mockGetStoresCli) GetStores(context.Context) (*pdhttp.StoresInfo, error) { + return c.storesInfo, nil +} + func TestForAllStores(t *testing.T) { - server := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { - _, err := w.Write([]byte(` + cli := mockGetStoresCli{} + cli.storesInfo = &pdhttp.StoresInfo{ + Count: 3, + Stores: []pdhttp.StoreInfo{ + { + Store: pdhttp.MetaStore{ + ID: 1, + Address: "127.0.0.1:20160", + Version: "3.0.0-beta.1", + State: int64(metapb.StoreState_Up), + }, + }, + { + Store: pdhttp.MetaStore{ + ID: 5, + Address: "127.0.0.1:20164", + Version: "3.0.1", + State: int64(metapb.StoreState_Offline), + }, + }, { - "count": 5, - "stores": [ - { - "store": { - "id": 1, - "address": "127.0.0.1:20160", - "version": "3.0.0-beta.1", - "state_name": "Up" - }, - "status": {} - }, - { - "store": { - "id": 2, - "address": "127.0.0.1:20161", - "version": "3.0.0-rc.1", - "state_name": "Down" - }, - "status": {} - }, - { - "store": { - "id": 3, - "address": "127.0.0.1:20162", - "version": "3.0.0-rc.2", - "state_name": "Disconnected" - }, - "status": {} - }, - { - "store": { - "id": 4, - "address": "127.0.0.1:20163", - "version": "3.0.0", - "state_name": "Tombstone" - }, - "status": {} - }, - { - "store": { - "id": 5, - "address": "127.0.0.1:20164", - "version": "3.0.1", - "state_name": "Offline" - }, - "status": {} - } - ] - } - `)) - require.NoError(t, err) - })) - defer server.Close() + Store: pdhttp.MetaStore{ + ID: 4, + Address: "127.0.0.1:20163", + Version: "3.0.0", + State: int64(metapb.StoreState_Tombstone), + }, + }, + }, + } ctx := context.Background() var ( allStoresLock sync.Mutex - allStores []*kv.Store + allStores []*pdhttp.MetaStore ) - tls := common.NewTLSFromMockServer(server) - err := kv.ForAllStores(ctx, tls, kv.StoreStateDown, func(c2 context.Context, store *kv.Store) error { + err := kv.ForAllStores(ctx, cli, metapb.StoreState_Offline, func(c2 context.Context, store *pdhttp.MetaStore) error { allStoresLock.Lock() allStores = append(allStores, store) allStoresLock.Unlock() @@ -115,26 +93,18 @@ func TestForAllStores(t *testing.T) { require.NoError(t, err) sort.Slice(allStores, func(i, j int) bool { return allStores[i].Address < allStores[j].Address }) - require.Equal(t, []*kv.Store{ + require.Equal(t, []*pdhttp.MetaStore{ { + ID: 1, Address: "127.0.0.1:20160", Version: "3.0.0-beta.1", - State: kv.StoreStateUp, - }, - { - Address: "127.0.0.1:20161", - Version: "3.0.0-rc.1", - State: kv.StoreStateDown, - }, - { - Address: "127.0.0.1:20162", - Version: "3.0.0-rc.2", - State: kv.StoreStateDisconnected, + State: int64(metapb.StoreState_Up), }, { + ID: 5, Address: "127.0.0.1:20164", Version: "3.0.1", - State: kv.StoreStateOffline, + State: int64(metapb.StoreState_Offline), }, }, allStores) } @@ -171,108 +141,91 @@ func TestFetchModeFromMetrics(t *testing.T) { } } -func TestCheckPDVersion(t *testing.T) { - var version string - ctx := context.Background() +type mockGetPDVersionCli struct { + pdhttp.Client + version string +} - mockServer := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { - require.Equal(t, pd.Version, req.URL.Path) - w.WriteHeader(http.StatusOK) - _, err := w.Write([]byte(version)) - require.NoError(t, err) - })) - mockURL, err := url.Parse(mockServer.URL) - require.NoError(t, err) +func (c mockGetPDVersionCli) GetPDVersion(context.Context) (string, error) { + return c.version, nil +} - tls := common.NewTLSFromMockServer(mockServer) +func TestCheckPDVersion(t *testing.T) { + ctx := context.Background() + cli := mockGetPDVersionCli{} - version = `{ - "version": "v4.0.0-rc.2-451-g760fb650" -}` - require.NoError(t, kv.CheckPDVersion(ctx, tls, mockURL.Host, requiredMinPDVersion, requiredMaxPDVersion)) + cli.version = "v4.0.0-rc.2-451-g760fb650" + require.NoError(t, kv.CheckPDVersion(ctx, cli, requiredMinPDVersion, requiredMaxPDVersion)) - version = `{ - "version": "v4.0.0" -}` - require.NoError(t, kv.CheckPDVersion(ctx, tls, mockURL.Host, requiredMinPDVersion, requiredMaxPDVersion)) + cli.version = "v4.0.0" + require.NoError(t, kv.CheckPDVersion(ctx, cli, requiredMinPDVersion, requiredMaxPDVersion)) - version = `{ - "version": "v9999.0.0" -}` - err = kv.CheckPDVersion(ctx, tls, mockURL.Host, requiredMinPDVersion, requiredMaxPDVersion) + cli.version = "v9999.0.0" + err := kv.CheckPDVersion(ctx, cli, requiredMinPDVersion, requiredMaxPDVersion) require.Error(t, err) require.Regexp(t, "PD version too new.*", err.Error()) - version = `{ - "version": "v6.0.0" -}` - err = kv.CheckPDVersion(ctx, tls, mockURL.Host, requiredMinPDVersion, requiredMaxPDVersion) + cli.version = "v6.0.0" + err = kv.CheckPDVersion(ctx, cli, requiredMinPDVersion, requiredMaxPDVersion) require.Error(t, err) require.Regexp(t, "PD version too new.*", err.Error()) - version = `{ - "version": "v6.0.0-beta" -}` - err = kv.CheckPDVersion(ctx, tls, mockURL.Host, requiredMinPDVersion, requiredMaxPDVersion) + cli.version = "v6.0.0-beta" + err = kv.CheckPDVersion(ctx, cli, requiredMinPDVersion, requiredMaxPDVersion) require.Error(t, err) require.Regexp(t, "PD version too new.*", err.Error()) - version = `{ - "version": "v1.0.0" -}` - err = kv.CheckPDVersion(ctx, tls, mockURL.Host, requiredMinPDVersion, requiredMaxPDVersion) + cli.version = "v1.0.0" + err = kv.CheckPDVersion(ctx, cli, requiredMinPDVersion, requiredMaxPDVersion) require.Error(t, err) require.Regexp(t, "PD version too old.*", err.Error()) } func TestCheckTiKVVersion(t *testing.T) { - var versions []string ctx := context.Background() + cli := mockGetStoresCli{} - mockServer := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { - require.Equal(t, pd.Stores, req.URL.Path) - w.WriteHeader(http.StatusOK) - - stores := make([]map[string]interface{}, 0, len(versions)) + genStoresInfo := func(versions []string) *pdhttp.StoresInfo { + stores := make([]pdhttp.StoreInfo, 0, len(versions)) for i, v := range versions { - stores = append(stores, map[string]interface{}{ - "store": map[string]interface{}{ - "address": fmt.Sprintf("tikv%d.test:20160", i), - "version": v, + stores = append(stores, pdhttp.StoreInfo{ + Store: pdhttp.MetaStore{ + Address: fmt.Sprintf("tikv%d.test:20160", i), + Version: v, }, }) } - err := json.NewEncoder(w).Encode(map[string]interface{}{ - "count": len(versions), - "stores": stores, - }) - require.NoError(t, err) - })) - mockURL, err := url.Parse(mockServer.URL) - require.NoError(t, err) - - tls := common.NewTLSFromMockServer(mockServer) + return &pdhttp.StoresInfo{ + Count: len(versions), + Stores: stores, + } + } - versions = []string{"4.1.0", "v4.1.0-alpha-9-ga27a7dd"} - require.NoError(t, kv.CheckTiKVVersion(ctx, tls, mockURL.Host, requiredMinTiKVVersion, requiredMaxTiKVVersion)) + versions := []string{"4.1.0", "v4.1.0-alpha-9-ga27a7dd"} + cli.storesInfo = genStoresInfo(versions) + require.NoError(t, kv.CheckTiKVVersion(ctx, cli, requiredMinTiKVVersion, requiredMaxTiKVVersion)) versions = []string{"9999.0.0", "4.0.0"} - err = kv.CheckTiKVVersion(ctx, tls, mockURL.Host, requiredMinPDVersion, requiredMaxPDVersion) + cli.storesInfo = genStoresInfo(versions) + err := kv.CheckTiKVVersion(ctx, cli, requiredMinPDVersion, requiredMaxPDVersion) require.Error(t, err) require.Regexp(t, `TiKV \(at tikv0\.test:20160\) version too new.*`, err.Error()) versions = []string{"4.0.0", "1.0.0"} - err = kv.CheckTiKVVersion(ctx, tls, mockURL.Host, requiredMinPDVersion, requiredMaxPDVersion) + cli.storesInfo = genStoresInfo(versions) + err = kv.CheckTiKVVersion(ctx, cli, requiredMinPDVersion, requiredMaxPDVersion) require.Error(t, err) require.Regexp(t, `TiKV \(at tikv1\.test:20160\) version too old.*`, err.Error()) versions = []string{"6.0.0"} - err = kv.CheckTiKVVersion(ctx, tls, mockURL.Host, requiredMinPDVersion, requiredMaxPDVersion) + cli.storesInfo = genStoresInfo(versions) + err = kv.CheckTiKVVersion(ctx, cli, requiredMinPDVersion, requiredMaxPDVersion) require.Error(t, err) require.Regexp(t, `TiKV \(at tikv0\.test:20160\) version too new.*`, err.Error()) versions = []string{"6.0.0-beta"} - err = kv.CheckTiKVVersion(ctx, tls, mockURL.Host, requiredMinPDVersion, requiredMaxPDVersion) + cli.storesInfo = genStoresInfo(versions) + err = kv.CheckTiKVVersion(ctx, cli, requiredMinPDVersion, requiredMaxPDVersion) require.Error(t, err) require.Regexp(t, `TiKV \(at tikv0\.test:20160\) version too new.*`, err.Error()) } diff --git a/br/pkg/logutil/logging.go b/br/pkg/logutil/logging.go index b98330f78c8b6..d383e0d000e98 100644 --- a/br/pkg/logutil/logging.go +++ b/br/pkg/logutil/logging.go @@ -61,6 +61,18 @@ func (file zapFileMarshaler) MarshalLogObject(enc zapcore.ObjectEncoder) error { return nil } +func AbbreviatedStringers[T fmt.Stringer](key string, stringers []T) zap.Field { + if len(stringers) < 4 { + return zap.Stringers(key, stringers) + } + return zap.Array(key, zapcore.ArrayMarshalerFunc(func(ae zapcore.ArrayEncoder) error { + ae.AppendString(stringers[0].String()) + ae.AppendString(fmt.Sprintf("(skip %d)", len(stringers)-2)) + ae.AppendString(stringers[len(stringers)-1].String()) + return nil + })) +} + type zapFilesMarshaler []*backuppb.File // MarshalLogObjectForFiles is an internal util function to zap something having `Files` field. @@ -278,6 +290,10 @@ func Redact(field zap.Field) zap.Field { return field } +func StringifyRangeOf(start, end []byte) StringifyRange { + return StringifyRange{StartKey: start, EndKey: end} +} + // StringifyKeys wraps the key range into a stringer. type StringifyKeys []kv.KeyRange diff --git a/br/pkg/membuf/BUILD.bazel b/br/pkg/membuf/BUILD.bazel index a6a2024306f54..6889568ce292e 100644 --- a/br/pkg/membuf/BUILD.bazel +++ b/br/pkg/membuf/BUILD.bazel @@ -2,7 +2,10 @@ load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") go_library( name = "membuf", - srcs = ["buffer.go"], + srcs = [ + "buffer.go", + "limiter.go", + ], importpath = "github.com/pingcap/tidb/br/pkg/membuf", visibility = ["//visibility:public"], ) @@ -10,9 +13,15 @@ go_library( go_test( name = "membuf_test", timeout = "short", - srcs = ["buffer_test.go"], + srcs = [ + "buffer_test.go", + "limiter_test.go", + ], embed = [":membuf"], flaky = True, - shard_count = 3, - deps = ["@com_github_stretchr_testify//require"], + shard_count = 6, + deps = [ + "@com_github_stretchr_testify//require", + "@org_uber_go_atomic//:atomic", + ], ) diff --git a/br/pkg/membuf/buffer.go b/br/pkg/membuf/buffer.go index 3a999d75e7404..6db90be880489 100644 --- a/br/pkg/membuf/buffer.go +++ b/br/pkg/membuf/buffer.go @@ -14,10 +14,11 @@ package membuf +import "unsafe" + const ( - defaultPoolSize = 1024 - defaultBlockSize = 1 << 20 // 1M - defaultLargeAllocThreshold = 1 << 16 // 64K + defaultPoolSize = 1024 + defaultBlockSize = 1 << 20 // 1M ) // Allocator is the abstract interface for allocating and freeing memory. @@ -34,32 +35,34 @@ func (stdAllocator) Alloc(n int) []byte { func (stdAllocator) Free(_ []byte) {} -// Pool is like `sync.Pool`, which manages memory for all bytes buffers. +// Pool is like `sync.Pool`, which manages memory for all bytes buffers. You can +// use Pool.NewBuffer to create a new buffer, and use Buffer.Destroy to release +// its memory to the pool. Pool can provide fixed size []byte blocks to Buffer. // // NOTE: we don't used a `sync.Pool` because when will sync.Pool release is depending on the // garbage collector which always release the memory so late. Use a fixed size chan to reuse // can decrease the memory usage to 1/3 compare with sync.Pool. type Pool struct { - allocator Allocator - blockSize int - blockCache chan []byte - largeAllocThreshold int + allocator Allocator + blockSize int + blockCache chan []byte + limiter *Limiter } // Option configures a pool. type Option func(p *Pool) -// WithPoolSize configures how many blocks cached by this pool. -func WithPoolSize(size int) Option { +// WithBlockNum configures how many blocks cached by this pool. +func WithBlockNum(num int) Option { return func(p *Pool) { - p.blockCache = make(chan []byte, size) + p.blockCache = make(chan []byte, num) } } // WithBlockSize configures the size of each block. -func WithBlockSize(size int) Option { +func WithBlockSize(bytes int) Option { return func(p *Pool) { - p.blockSize = size + p.blockSize = bytes } } @@ -70,22 +73,21 @@ func WithAllocator(allocator Allocator) Option { } } -// WithLargeAllocThreshold configures the threshold for large allocation of a Buffer. -// If allocate size is larger than this threshold, bytes will be allocated directly -// by the make built-in function and won't be tracked by the pool. -func WithLargeAllocThreshold(threshold int) Option { +// WithPoolMemoryLimiter controls the maximum memory returned to buffer. Note +// that when call AllocBytes with size larger than blockSize, the memory is not +// controlled by this limiter. +func WithPoolMemoryLimiter(limiter *Limiter) Option { return func(p *Pool) { - p.largeAllocThreshold = threshold + p.limiter = limiter } } // NewPool creates a new pool. func NewPool(opts ...Option) *Pool { p := &Pool{ - allocator: stdAllocator{}, - blockSize: defaultBlockSize, - blockCache: make(chan []byte, defaultPoolSize), - largeAllocThreshold: defaultLargeAllocThreshold, + allocator: stdAllocator{}, + blockSize: defaultBlockSize, + blockCache: make(chan []byte, defaultPoolSize), } for _, opt := range opts { opt(p) @@ -94,6 +96,9 @@ func NewPool(opts ...Option) *Pool { } func (p *Pool) acquire() []byte { + if p.limiter != nil { + p.limiter.Acquire(p.blockSize) + } select { case b := <-p.blockCache: return b @@ -108,6 +113,9 @@ func (p *Pool) release(b []byte) { default: p.allocator.Free(b) } + if p.limiter != nil { + p.limiter.Release(p.blockSize) + } } // Destroy frees all buffers. @@ -118,12 +126,12 @@ func (p *Pool) Destroy() { } } -// TotalSize is the total memory size of this Pool. +// TotalSize is the total memory size of this Pool, not considering its Buffer. func (p *Pool) TotalSize() int64 { return int64(len(p.blockCache) * p.blockSize) } -// Buffer represents the reuse buffer. +// Buffer represents a buffer that can allocate []byte from its memory. type Buffer struct { pool *Pool blocks [][]byte @@ -131,16 +139,18 @@ type Buffer struct { curBlock []byte curBlockIdx int curIdx int + + smallObjOverhead int + smallObjOverheadCache int } // BufferOption configures a buffer. type BufferOption func(*Buffer) -// WithMemoryLimit approximately limits the maximum memory size of this Buffer. -// Due to it use blocks to allocate memory, the actual memory size is +// WithBufferMemoryLimit approximately limits the maximum memory size of this +// Buffer. Due to it use blocks to allocate memory, the actual memory size is // blockSize*ceil(limit/blockSize). -// In order to keep compatibility, it will only restrict AllocBytesWithSliceLocation. -func WithMemoryLimit(limit uint64) BufferOption { +func WithBufferMemoryLimit(limit uint64) BufferOption { return func(b *Buffer) { blockCntLimit := int(limit+uint64(b.pool.blockSize)-1) / b.pool.blockSize b.blockCntLimit = blockCntLimit @@ -148,7 +158,8 @@ func WithMemoryLimit(limit uint64) BufferOption { } } -// NewBuffer creates a new buffer in current pool. +// NewBuffer creates a new buffer in current pool. The buffer can gradually +// acquire memory from the pool and release all memory once it's not used. func (p *Pool) NewBuffer(opts ...BufferOption) *Buffer { b := &Buffer{ pool: p, @@ -164,8 +175,38 @@ func (p *Pool) NewBuffer(opts ...BufferOption) *Buffer { return b } -// Reset resets the buffer. +// smallObjOverheadBatch is the batch size to acquire memory from limiter. 256KB +// can store 256KB/24B = 10922 []byte objects, or 256KB/12B = 21845 SliceLocation +// objects. +const smallObjOverheadBatch = 256 * 1024 + +// recordSmallObjOverhead records the memory cost of []byte or SliceLocation into +// pool's limiter. The caller will ensure the pool's limiter is not nil. +func (b *Buffer) recordSmallObjOverhead(n int) { + if n > b.smallObjOverheadCache { + b.pool.limiter.Acquire(smallObjOverheadBatch) + b.smallObjOverheadCache += smallObjOverheadBatch + b.smallObjOverhead += smallObjOverheadBatch + } + b.smallObjOverheadCache -= n +} + +// releaseSmallObjOverhead releases the memory cost of []byte or SliceLocation +// that are acquired from this Buffer before to the pool's limiter. The caller +// will ensure the pool's limiter is not nil. +func (b *Buffer) releaseSmallObjOverhead() { + b.pool.limiter.Release(b.smallObjOverhead) + b.smallObjOverhead = 0 + b.smallObjOverheadCache = 0 +} + +// Reset resets the buffer, the memory is still retained in this buffer. Caller +// must release the reference to the returned []byte or SliceLocation before +// calling Reset. func (b *Buffer) Reset() { + if b.pool.limiter != nil { + b.releaseSmallObjOverhead() + } if len(b.blocks) > 0 { b.curBlock = b.blocks[0] b.curBlockIdx = 0 @@ -173,12 +214,19 @@ func (b *Buffer) Reset() { } } -// Destroy frees all buffers. +// Destroy releases all buffers to the pool. Caller must release the reference to +// the returned []byte or SliceLocation before calling Destroy. func (b *Buffer) Destroy() { + if b.pool.limiter != nil { + b.releaseSmallObjOverhead() + } for _, buf := range b.blocks { b.pool.release(buf) } b.blocks = nil + b.curBlock = nil + b.curBlockIdx = -1 + b.curIdx = 0 } // TotalSize represents the total memory size of this Buffer. @@ -186,32 +234,19 @@ func (b *Buffer) TotalSize() int64 { return int64(len(b.blocks) * b.pool.blockSize) } +var sizeOfSlice = int(unsafe.Sizeof([]byte{})) + // AllocBytes allocates bytes with the given length. func (b *Buffer) AllocBytes(n int) []byte { - if n > b.pool.largeAllocThreshold { + if n > b.pool.blockSize { return make([]byte, n) } - if b.curIdx+n > len(b.curBlock) { - b.addBuf() - } - idx := b.curIdx - b.curIdx += n - return b.curBlock[idx:b.curIdx:b.curIdx] -} -// addBuf adds buffer to Buffer. -func (b *Buffer) addBuf() { - if b.curBlockIdx < len(b.blocks)-1 { - b.curBlockIdx++ - b.curBlock = b.blocks[b.curBlockIdx] - } else { - buf := b.pool.acquire() - b.blocks = append(b.blocks, buf) - b.curBlock = buf - b.curBlockIdx = len(b.blocks) - 1 + bs, _ := b.allocBytesWithSliceLocation(n) + if bs != nil && b.pool.limiter != nil { + b.recordSmallObjOverhead(sizeOfSlice) } - - b.curIdx = 0 + return bs } // SliceLocation is like a reflect.SliceHeader, but it's associated with a @@ -223,22 +258,18 @@ type SliceLocation struct { length int32 } -// AllocBytesWithSliceLocation is like AllocBytes, but it also returns a -// SliceLocation. The expected usage is after writing data into returned slice we -// do not store the slice itself, but only the SliceLocation. Later we can use -// the SliceLocation to get the slice again. When we have a large number of -// slices in memory this can improve performance. -// nil returned slice means allocation failed. -func (b *Buffer) AllocBytesWithSliceLocation(n int) ([]byte, SliceLocation) { +var sizeOfSliceLocation = int(unsafe.Sizeof(SliceLocation{})) + +func (b *Buffer) allocBytesWithSliceLocation(n int) ([]byte, SliceLocation) { if n > b.pool.blockSize { return nil, SliceLocation{} } if b.curIdx+n > len(b.curBlock) { - if b.blockCntLimit >= 0 && len(b.blocks) >= b.blockCntLimit { + if b.blockCntLimit >= 0 && b.curBlockIdx+1 >= b.blockCntLimit { return nil, SliceLocation{} } - b.addBuf() + b.addBlock() } blockIdx := int32(b.curBlockIdx) offset := int32(b.curIdx) @@ -249,11 +280,39 @@ func (b *Buffer) AllocBytesWithSliceLocation(n int) ([]byte, SliceLocation) { return b.curBlock[idx:b.curIdx:b.curIdx], loc } +// AllocBytesWithSliceLocation is like AllocBytes, but it must allocate the +// buffer in the pool rather from go's runtime. The expected usage is after +// writing data into returned slice **we do not store the slice**, but only the +// SliceLocation. Later we can use the SliceLocation to get the slice again. When +// we have a large number of slices in memory this can reduce memory occupation. +// nil returned slice means allocation failed. +func (b *Buffer) AllocBytesWithSliceLocation(n int) ([]byte, SliceLocation) { + bs, loc := b.allocBytesWithSliceLocation(n) + if bs != nil && b.pool.limiter != nil { + b.recordSmallObjOverhead(sizeOfSliceLocation) + } + return bs, loc +} + +func (b *Buffer) addBlock() { + if b.curBlockIdx < len(b.blocks)-1 { + b.curBlockIdx++ + b.curBlock = b.blocks[b.curBlockIdx] + } else { + block := b.pool.acquire() + b.blocks = append(b.blocks, block) + b.curBlock = block + b.curBlockIdx = len(b.blocks) - 1 + } + + b.curIdx = 0 +} + func (b *Buffer) GetSlice(loc SliceLocation) []byte { return b.blocks[loc.bufIdx][loc.offset : loc.offset+loc.length] } -// AddBytes adds the bytes into this Buffer. +// AddBytes adds the bytes into this Buffer's managed memory and return it. func (b *Buffer) AddBytes(bytes []byte) []byte { buf := b.AllocBytes(len(bytes)) copy(buf, bytes) diff --git a/br/pkg/membuf/buffer_test.go b/br/pkg/membuf/buffer_test.go index 44e8441066985..53d462b6cb035 100644 --- a/br/pkg/membuf/buffer_test.go +++ b/br/pkg/membuf/buffer_test.go @@ -20,7 +20,9 @@ import ( rand2 "math/rand" "runtime" "slices" + "sync" "testing" + "time" "github.com/stretchr/testify/require" ) @@ -42,10 +44,9 @@ func (t *testAllocator) Free(_ []byte) { func TestBufferPool(t *testing.T) { allocator := &testAllocator{} pool := NewPool( - WithPoolSize(2), + WithBlockNum(2), WithAllocator(allocator), WithBlockSize(1024), - WithLargeAllocThreshold(512), ) defer pool.Destroy() @@ -59,8 +60,8 @@ func TestBufferPool(t *testing.T) { bytesBuf.AllocBytes(767) require.Equal(t, 2, allocator.allocs) - largeBytes := bytesBuf.AllocBytes(513) - require.Equal(t, 513, len(largeBytes)) + largeBytes := bytesBuf.AllocBytes(1025) + require.Equal(t, 1025, len(largeBytes)) require.Equal(t, 2, allocator.allocs) require.Equal(t, 0, allocator.frees) @@ -76,6 +77,45 @@ func TestBufferPool(t *testing.T) { require.Equal(t, 1, allocator.frees) } +func TestPoolMemLimit(t *testing.T) { + limiter := NewLimiter(2*1024*1024 + 2*smallObjOverheadBatch) + // only allow to allocate one block + pool := NewPool( + WithBlockSize(2*1024*1024), + WithPoolMemoryLimiter(limiter), + ) + defer pool.Destroy() + buf := pool.NewBuffer() + buf.AllocBytes(1024 * 1024) + buf.AllocBytes(1024 * 1024) + + buf2 := pool.NewBuffer() + done := make(chan struct{}, 1) + go func() { + buf2.AllocBytes(1024 * 1024) + buf2.Destroy() + done <- struct{}{} + }() + + // sleep a while to make sure the goroutine is started + time.Sleep(50 * time.Millisecond) + require.Len(t, done, 0) + // reset will not release memory to pool + buf.Reset() + buf.AllocBytes(1024 * 1024) + buf.AllocBytes(1024 * 1024) + require.Len(t, done, 0) + // destroy will release memory to pool + buf.Destroy() + // wait buf2 to finish + require.Eventually(t, func() bool { + return len(done) > 0 + }, time.Second, 10*time.Millisecond) + // after buf2 is finished, still can allocate memory from pool + buf.AllocBytes(2 * 1024 * 1024) + buf.Destroy() +} + func TestBufferIsolation(t *testing.T) { pool := NewPool(WithBlockSize(1024)) defer pool.Destroy() @@ -99,7 +139,7 @@ func TestBufferMemLimit(t *testing.T) { pool := NewPool(WithBlockSize(10)) defer pool.Destroy() // the actual memory limit is 10 bytes. - bytesBuf := pool.NewBuffer(WithMemoryLimit(5)) + bytesBuf := pool.NewBuffer(WithBufferMemoryLimit(5)) got, _ := bytesBuf.AllocBytesWithSliceLocation(9) require.NotNil(t, got) @@ -107,9 +147,22 @@ func TestBufferMemLimit(t *testing.T) { require.Nil(t, got) bytesBuf.Destroy() + // test the buffer is still usable after destroy. + got, _ = bytesBuf.AllocBytesWithSliceLocation(3) + require.NotNil(t, got) // exactly 2 block - bytesBuf = pool.NewBuffer(WithMemoryLimit(20)) + bytesBuf = pool.NewBuffer(WithBufferMemoryLimit(20)) + + got, _ = bytesBuf.AllocBytesWithSliceLocation(9) + require.NotNil(t, got) + got, _ = bytesBuf.AllocBytesWithSliceLocation(9) + require.NotNil(t, got) + got, _ = bytesBuf.AllocBytesWithSliceLocation(2) + require.Nil(t, got) + + // after reset, can get same allocation again + bytesBuf.Reset() got, _ = bytesBuf.AllocBytesWithSliceLocation(9) require.NotNil(t, got) @@ -250,3 +303,26 @@ func BenchmarkSortLocationWithGC(b *testing.B) { }() } } + +func BenchmarkConcurrentAcquire(b *testing.B) { + for i := 0; i < b.N; i++ { + limiter := NewLimiter(512 * 1024 * 1024) + pool := NewPool(WithPoolMemoryLimiter(limiter), WithBlockSize(4*1024)) + // start 1000 clients, each client will acquire 100B for 1000 times. + wg := sync.WaitGroup{} + clientNum := 1000 + wg.Add(clientNum) + for j := 0; j < clientNum; j++ { + go func() { + defer wg.Done() + buf := pool.NewBuffer() + for k := 0; k < 1000; k++ { + buf.AllocBytes(100) + } + buf.Destroy() + }() + } + wg.Wait() + pool.Destroy() + } +} diff --git a/br/pkg/membuf/limiter.go b/br/pkg/membuf/limiter.go new file mode 100644 index 0000000000000..c58114b3a0b3d --- /dev/null +++ b/br/pkg/membuf/limiter.go @@ -0,0 +1,67 @@ +// Copyright 2023 PingCAP, 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. + +package membuf + +import "sync" + +// Limiter will block on Acquire if the number it has acquired and not released +// exceeds the limit. +type Limiter struct { + limit int + mu sync.Mutex + waitNums []int + waitChs []chan struct{} +} + +// NewLimiter creates a new Limiter with the given limit. +func NewLimiter(limit int) *Limiter { + return &Limiter{limit: limit} +} + +// Acquire acquires n tokens from the limiter. If the number of tokens acquired +// and not released exceeds the limit, it will block until enough tokens are +// released. +func (l *Limiter) Acquire(n int) { + l.mu.Lock() + + if l.limit >= n { + l.limit -= n + l.mu.Unlock() + return + } + + waitCh := make(chan struct{}) + l.waitNums = append(l.waitNums, n) + l.waitChs = append(l.waitChs, waitCh) + l.mu.Unlock() + + <-waitCh +} + +// Release releases tokens to the limiter. If there are goroutines waiting for +// tokens, it will wake them up. +func (l *Limiter) Release(n int) { + l.mu.Lock() + + l.limit += n + for len(l.waitNums) > 0 && l.limit >= l.waitNums[0] { + l.limit -= l.waitNums[0] + close(l.waitChs[0]) + l.waitNums = l.waitNums[1:] + l.waitChs = l.waitChs[1:] + } + + l.mu.Unlock() +} diff --git a/br/pkg/membuf/limiter_test.go b/br/pkg/membuf/limiter_test.go new file mode 100644 index 0000000000000..e8d1857925368 --- /dev/null +++ b/br/pkg/membuf/limiter_test.go @@ -0,0 +1,72 @@ +// Copyright 2023 PingCAP, 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. + +package membuf + +import ( + "sync" + "testing" + + "github.com/stretchr/testify/require" + "go.uber.org/atomic" +) + +func TestLimiter(t *testing.T) { + limit := 20 + cur := atomic.NewInt64(0) + l := NewLimiter(limit) + wg := sync.WaitGroup{} + + for i := 0; i < 100; i++ { + wg.Add(1) + go func() { + defer wg.Done() + + l.Acquire(1) + val := cur.Inc() + require.LessOrEqual(t, val, int64(limit)) + cur.Dec() + l.Release(1) + }() + } + + wg.Wait() + require.Equal(t, limit, l.limit) +} + +func TestWaitUpMultipleCaller(t *testing.T) { + limit := 20 + l := NewLimiter(limit) + l.Acquire(18) + + start := make(chan struct{}, 3) + finish := make(chan struct{}, 3) + for i := 0; i < 3; i++ { + go func() { + start <- struct{}{} + l.Acquire(3) + finish <- struct{}{} + }() + } + + for i := 0; i < 3; i++ { + <-start + } + require.Len(t, finish, 0) + l.Release(18) + for i := 0; i < 3; i++ { + <-finish + } + require.Equal(t, limit-3*3, l.limit) +} diff --git a/br/pkg/metautil/BUILD.bazel b/br/pkg/metautil/BUILD.bazel index 4ec271cace580..5a250b6cf5e39 100644 --- a/br/pkg/metautil/BUILD.bazel +++ b/br/pkg/metautil/BUILD.bazel @@ -2,7 +2,11 @@ load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") go_library( name = "metautil", - srcs = ["metafile.go"], + srcs = [ + "load.go", + "metafile.go", + "statsfile.go", + ], importpath = "github.com/pingcap/tidb/br/pkg/metautil", visibility = ["//visibility:public"], deps = [ @@ -10,7 +14,10 @@ go_library( "//br/pkg/logutil", "//br/pkg/storage", "//br/pkg/summary", + "//br/pkg/utils", "//pkg/parser/model", + "//pkg/statistics/handle", + "//pkg/statistics/handle/types", "//pkg/statistics/handle/util", "//pkg/tablecodec", "//pkg/util/encrypt", @@ -21,6 +28,7 @@ go_library( "@com_github_pingcap_kvproto//pkg/brpb", "@com_github_pingcap_kvproto//pkg/encryptionpb", "@com_github_pingcap_log//:log", + "@org_golang_x_sync//errgroup", "@org_uber_go_zap//:zap", ], ) @@ -29,18 +37,29 @@ go_test( name = "metautil_test", timeout = "short", srcs = [ + "load_test.go", "main_test.go", "metafile_test.go", + "statsfile_test.go", ], embed = [":metautil"], flaky = True, - shard_count = 6, + shard_count = 9, deps = [ "//br/pkg/mock/storage", + "//br/pkg/storage", + "//br/pkg/utils", + "//pkg/parser/model", + "//pkg/statistics/handle/types", + "//pkg/statistics/handle/util", + "//pkg/tablecodec", "//pkg/testkit/testsetup", + "@com_github_golang_protobuf//proto", "@com_github_pingcap_kvproto//pkg/brpb", "@com_github_pingcap_kvproto//pkg/encryptionpb", + "@com_github_pingcap_tipb//go-tipb", "@com_github_stretchr_testify//require", + "@org_golang_x_sync//errgroup", "@org_uber_go_goleak//:goleak", "@org_uber_go_mock//gomock", ], diff --git a/br/pkg/metautil/load.go b/br/pkg/metautil/load.go new file mode 100644 index 0000000000000..6f62a534b337b --- /dev/null +++ b/br/pkg/metautil/load.go @@ -0,0 +1,75 @@ +// Copyright 2024 PingCAP, 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. + +package metautil + +import ( + "context" + + "github.com/pingcap/errors" + "github.com/pingcap/tidb/pkg/parser/model" +) + +// Database wraps the schema and tables of a database. +type Database struct { + Info *model.DBInfo + Tables []*Table +} + +// GetTable returns a table of the database by name. +func (db *Database) GetTable(name string) *Table { + for _, table := range db.Tables { + if table.Info.Name.String() == name { + return table + } + } + return nil +} + +// LoadBackupTables loads schemas from BackupMeta. +func LoadBackupTables(ctx context.Context, reader *MetaReader) (map[string]*Database, error) { + ch := make(chan *Table) + errCh := make(chan error) + go func() { + if err := reader.ReadSchemasFiles(ctx, ch); err != nil { + errCh <- errors.Trace(err) + } + close(ch) + }() + + databases := make(map[string]*Database) + for { + select { + case <-ctx.Done(): + return nil, ctx.Err() + case err := <-errCh: + return nil, errors.Trace(err) + case table, ok := <-ch: + if !ok { + close(errCh) + return databases, nil + } + dbName := table.DB.Name.String() + db, ok := databases[dbName] + if !ok { + db = &Database{ + Info: table.DB, + Tables: make([]*Table, 0), + } + databases[dbName] = db + } + db.Tables = append(db.Tables, table) + } + } +} diff --git a/br/pkg/utils/schema_test.go b/br/pkg/metautil/load_test.go similarity index 89% rename from br/pkg/utils/schema_test.go rename to br/pkg/metautil/load_test.go index f6c001f8f9106..92a8987ef7ee9 100644 --- a/br/pkg/utils/schema_test.go +++ b/br/pkg/metautil/load_test.go @@ -1,6 +1,17 @@ -// Copyright 2020 PingCAP, Inc. Licensed under Apache-2.0. - -package utils +// Copyright 2024 PingCAP, 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. +package metautil import ( "context" @@ -11,7 +22,6 @@ import ( "github.com/golang/protobuf/proto" backuppb "github.com/pingcap/kvproto/pkg/brpb" "github.com/pingcap/kvproto/pkg/encryptionpb" - "github.com/pingcap/tidb/br/pkg/metautil" "github.com/pingcap/tidb/br/pkg/storage" "github.com/pingcap/tidb/pkg/parser/model" "github.com/pingcap/tidb/pkg/statistics/handle/util" @@ -84,12 +94,12 @@ func TestLoadBackupMeta(t *testing.T) { require.NoError(t, err) ctx := context.Background() - err = store.WriteFile(ctx, metautil.MetaFile, data) + err = store.WriteFile(ctx, MetaFile, data) require.NoError(t, err) dbs, err := LoadBackupTables( ctx, - metautil.NewMetaReader( + NewMetaReader( meta, store, &backuppb.CipherInfo{ @@ -179,12 +189,12 @@ func TestLoadBackupMetaPartionTable(t *testing.T) { require.NoError(t, err) ctx := context.Background() - err = store.WriteFile(ctx, metautil.MetaFile, data) + err = store.WriteFile(ctx, MetaFile, data) require.NoError(t, err) dbs, err := LoadBackupTables( ctx, - metautil.NewMetaReader( + NewMetaReader( meta, store, &backuppb.CipherInfo{ @@ -265,12 +275,12 @@ func BenchmarkLoadBackupMeta64(b *testing.B) { require.NoError(b, err) ctx := context.Background() - err = store.WriteFile(ctx, metautil.MetaFile, data) + err = store.WriteFile(ctx, MetaFile, data) require.NoError(b, err) dbs, err := LoadBackupTables( ctx, - metautil.NewMetaReader( + NewMetaReader( meta, store, &backuppb.CipherInfo{ @@ -297,12 +307,12 @@ func BenchmarkLoadBackupMeta1024(b *testing.B) { require.NoError(b, err) ctx := context.Background() - err = store.WriteFile(ctx, metautil.MetaFile, data) + err = store.WriteFile(ctx, MetaFile, data) require.NoError(b, err) dbs, err := LoadBackupTables( ctx, - metautil.NewMetaReader( + NewMetaReader( meta, store, &backuppb.CipherInfo{ @@ -329,12 +339,12 @@ func BenchmarkLoadBackupMeta10240(b *testing.B) { require.NoError(b, err) ctx := context.Background() - err = store.WriteFile(ctx, metautil.MetaFile, data) + err = store.WriteFile(ctx, MetaFile, data) require.NoError(b, err) dbs, err := LoadBackupTables( ctx, - metautil.NewMetaReader( + NewMetaReader( meta, store, &backuppb.CipherInfo{ diff --git a/br/pkg/metautil/main_test.go b/br/pkg/metautil/main_test.go index 969f54de2426b..7d25283e067b5 100644 --- a/br/pkg/metautil/main_test.go +++ b/br/pkg/metautil/main_test.go @@ -24,6 +24,7 @@ import ( func TestMain(m *testing.M) { opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), } diff --git a/br/pkg/metautil/metafile.go b/br/pkg/metautil/metafile.go index b915da8fa10d6..212ab9cdcc150 100644 --- a/br/pkg/metautil/metafile.go +++ b/br/pkg/metautil/metafile.go @@ -146,14 +146,15 @@ func walkLeafMetaFile( // Table wraps the schema and files of a table. type Table struct { - DB *model.DBInfo - Info *model.TableInfo - Crc64Xor uint64 - TotalKvs uint64 - TotalBytes uint64 - Files []*backuppb.File - TiFlashReplicas int - Stats *util.JSONTable + DB *model.DBInfo + Info *model.TableInfo + Crc64Xor uint64 + TotalKvs uint64 + TotalBytes uint64 + Files []*backuppb.File + TiFlashReplicas int + Stats *util.JSONTable + StatsFileIndexes []*backuppb.StatsFileIndex } // NoChecksum checks whether the table has a calculated checksum. @@ -351,15 +352,20 @@ func (reader *MetaReader) ReadSchemasFiles(ctx context.Context, output chan<- *T return errors.Trace(err) } } + var statsFileIndexes []*backuppb.StatsFileIndex + if len(s.StatsIndex) > 0 { + statsFileIndexes = s.StatsIndex + } table := &Table{ - DB: dbInfo, - Info: tableInfo, - Crc64Xor: s.Crc64Xor, - TotalKvs: s.TotalKvs, - TotalBytes: s.TotalBytes, - TiFlashReplicas: int(s.TiflashReplicas), - Stats: stats, + DB: dbInfo, + Info: tableInfo, + Crc64Xor: s.Crc64Xor, + TotalKvs: s.TotalKvs, + TotalBytes: s.TotalBytes, + TiFlashReplicas: int(s.TiflashReplicas), + Stats: stats, + StatsFileIndexes: statsFileIndexes, } if tableInfo != nil { if fileMap != nil { @@ -547,7 +553,7 @@ type MetaWriter struct { totalDataFileSize int // records the total metafile size for backupmeta v2 - totalMetaFileSize int + totalMetaFileSize uint64 } // NewMetaWriter creates MetaWriter. @@ -712,6 +718,12 @@ func (writer *MetaWriter) fillMetasV1(_ context.Context, op AppendOp) { writer.backupMeta.Files = writer.metafiles.root.DataFiles case AppendSchema: writer.backupMeta.Schemas = writer.metafiles.root.Schemas + // calculate the stats file size + for _, schema := range writer.metafiles.root.Schemas { + for _, statsIndex := range schema.StatsIndex { + writer.totalMetaFileSize += statsIndex.SizeEnc + } + } case AppendDDL: writer.backupMeta.Ddls = mergeDDLs(writer.metafiles.root.Ddls) default: @@ -727,6 +739,12 @@ func (writer *MetaWriter) flushMetasV2(ctx context.Context, op AppendOp) error { if len(writer.metafiles.root.Schemas) == 0 { return nil } + // calculate the stats file size + for _, schema := range writer.metafiles.root.Schemas { + for _, statsIndex := range schema.StatsIndex { + writer.totalMetaFileSize += statsIndex.SizeEnc + } + } // Add the metafile to backupmeta and reset metafiles. if writer.backupMeta.SchemaIndex == nil { writer.backupMeta.SchemaIndex = &backuppb.MetaFile{} @@ -768,7 +786,7 @@ func (writer *MetaWriter) flushMetasV2(ctx context.Context, op AppendOp) error { return errors.Trace(err) } - writer.totalMetaFileSize += len(encyptedContent) + writer.totalMetaFileSize += uint64(len(encyptedContent)) if err = writer.storage.WriteFile(ctx, fname, encyptedContent); err != nil { return errors.Trace(err) } @@ -799,7 +817,7 @@ func (writer *MetaWriter) ArchiveSize() uint64 { // MetaFilesSize represents the size of meta files from backupmeta v2, // must be called after everything finishes by `FinishWriteMetas`. func (writer *MetaWriter) MetaFilesSize() uint64 { - return uint64(writer.totalMetaFileSize) + return writer.totalMetaFileSize } // Backupmeta clones a backupmeta. @@ -808,6 +826,11 @@ func (writer *MetaWriter) Backupmeta() *backuppb.BackupMeta { return clone.(*backuppb.BackupMeta) } +// NewStatsWriter wraps the new function of stats writer +func (writer *MetaWriter) NewStatsWriter() *StatsWriter { + return newStatsWriter(writer.storage, writer.cipher) +} + func mergeDDLs(ddls [][]byte) []byte { b := bytes.Join(ddls, []byte(`,`)) b = append(b, 0) diff --git a/br/pkg/metautil/statsfile.go b/br/pkg/metautil/statsfile.go new file mode 100644 index 0000000000000..13be3720bdfad --- /dev/null +++ b/br/pkg/metautil/statsfile.go @@ -0,0 +1,243 @@ +// Copyright 2024 PingCAP, 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. + +package metautil + +import ( + "bytes" + "context" + "crypto/sha256" + "encoding/json" + "fmt" + + "github.com/gogo/protobuf/proto" + "github.com/pingcap/errors" + backuppb "github.com/pingcap/kvproto/pkg/brpb" + berrors "github.com/pingcap/tidb/br/pkg/errors" + "github.com/pingcap/tidb/br/pkg/storage" + "github.com/pingcap/tidb/br/pkg/utils" + "github.com/pingcap/tidb/pkg/parser/model" + "github.com/pingcap/tidb/pkg/statistics/handle" + statstypes "github.com/pingcap/tidb/pkg/statistics/handle/types" + statsutil "github.com/pingcap/tidb/pkg/statistics/handle/util" + "golang.org/x/sync/errgroup" +) + +var maxStatsJsonTableSize = 32 * 1024 * 1024 // 32 MiB +var inlineSize = 8 * 1024 // 8 KiB + +func getStatsFileName(physicalID int64) string { + return fmt.Sprintf("backupmeta.schema.stats.%09d", physicalID) +} + +// A lightweight function wrapper to dump the statistic +type StatsWriter struct { + storage storage.ExternalStorage + cipher *backuppb.CipherInfo + + // final stats file indexes + statsFileIndexes []*backuppb.StatsFileIndex + + // temporary variables, clear after each flush + totalSize int + statsFile *backuppb.StatsFile +} + +func newStatsWriter( + storage storage.ExternalStorage, + cipher *backuppb.CipherInfo, +) *StatsWriter { + return &StatsWriter{ + storage: storage, + cipher: cipher, + + statsFileIndexes: make([]*backuppb.StatsFileIndex, 0), + + totalSize: 0, + statsFile: &backuppb.StatsFile{ + Blocks: make([]*backuppb.StatsBlock, 0, 8), + }, + } +} + +func (s *StatsWriter) clearTemporary() { + // clear the temporary variables + s.totalSize = 0 + s.statsFile = &backuppb.StatsFile{ + Blocks: make([]*backuppb.StatsBlock, 0, 8), + } +} + +func (s *StatsWriter) writeStatsFileAndClear(ctx context.Context, physicalID int64) error { + fileName := getStatsFileName(physicalID) + content, err := proto.Marshal(s.statsFile) + if err != nil { + return errors.Trace(err) + } + + if len(s.statsFileIndexes) == 0 && len(content) < inlineSize { + s.statsFileIndexes = append(s.statsFileIndexes, &backuppb.StatsFileIndex{InlineData: content}) + return nil + } + + checksum := sha256.Sum256(content) + + encryptedContent, iv, err := Encrypt(content, s.cipher) + if err != nil { + return errors.Trace(err) + } + + if err := s.storage.WriteFile(ctx, fileName, encryptedContent); err != nil { + return errors.Trace(err) + } + + s.statsFileIndexes = append(s.statsFileIndexes, &backuppb.StatsFileIndex{ + Name: fileName, + Sha256: checksum[:], + SizeEnc: uint64(len(encryptedContent)), + SizeOri: uint64(len(content)), + CipherIv: iv, + }) + + s.clearTemporary() + return nil +} + +func (s *StatsWriter) BackupStats(ctx context.Context, jsonTable *statsutil.JSONTable, physicalID int64) error { + if jsonTable == nil { + return nil + } + + statsBytes, err := json.Marshal(jsonTable) + if err != nil { + return errors.Trace(err) + } + + s.totalSize += len(statsBytes) + s.statsFile.Blocks = append(s.statsFile.Blocks, &backuppb.StatsBlock{ + PhysicalId: physicalID, + JsonTable: statsBytes, + }) + + // check whether need to flush + if s.totalSize > maxStatsJsonTableSize { + if err := s.writeStatsFileAndClear(ctx, physicalID); err != nil { + return errors.Trace(err) + } + } + return nil +} + +func (s *StatsWriter) BackupStatsDone(ctx context.Context) ([]*backuppb.StatsFileIndex, error) { + if s.totalSize == 0 || len(s.statsFile.Blocks) == 0 { + return s.statsFileIndexes, nil + } + + if err := s.writeStatsFileAndClear(ctx, s.statsFile.Blocks[0].PhysicalId); err != nil { + return nil, errors.Trace(err) + } + return s.statsFileIndexes, nil +} + +func RestoreStats( + ctx context.Context, + storage storage.ExternalStorage, + cipher *backuppb.CipherInfo, + statsHandler *handle.Handle, + newTableInfo *model.TableInfo, + statsFileIndexes []*backuppb.StatsFileIndex, + rewriteIDMap map[int64]int64, +) error { + eg, ectx := errgroup.WithContext(ctx) + taskCh := make(chan *statstypes.PartitionStatisticLoadTask, 8) + eg.Go(func() error { + return downloadStats(ectx, storage, cipher, statsFileIndexes, rewriteIDMap, taskCh) + }) + eg.Go(func() error { + // NOTICE: skip updating cache after load stats from json + return statsHandler.LoadStatsFromJSONConcurrently(ectx, newTableInfo, taskCh, 0) + }) + return eg.Wait() +} + +func downloadStats( + ctx context.Context, + storage storage.ExternalStorage, + cipher *backuppb.CipherInfo, + statsFileIndexes []*backuppb.StatsFileIndex, + rewriteIDMap map[int64]int64, + taskCh chan<- *statstypes.PartitionStatisticLoadTask, +) error { + defer close(taskCh) + eg, ectx := errgroup.WithContext(ctx) + downloadWorkerpool := utils.NewWorkerPool(4, "download stats for each partition") + for _, statsFileIndex := range statsFileIndexes { + if ectx.Err() != nil { + break + } + statsFile := statsFileIndex + downloadWorkerpool.ApplyOnErrorGroup(eg, func() error { + var statsContent []byte + if len(statsFile.InlineData) > 0 { + statsContent = statsFile.InlineData + } else { + content, err := storage.ReadFile(ectx, statsFile.Name) + if err != nil { + return errors.Trace(err) + } + + decryptContent, err := Decrypt(content, cipher, statsFile.CipherIv) + if err != nil { + return errors.Trace(err) + } + + checksum := sha256.Sum256(decryptContent) + if !bytes.Equal(statsFile.Sha256, checksum[:]) { + return berrors.ErrInvalidMetaFile.GenWithStackByArgs(fmt.Sprintf( + "checksum mismatch expect %x, got %x", statsFile.Sha256, checksum[:])) + } + statsContent = decryptContent + } + + statsFileBlocks := &backuppb.StatsFile{} + if err := proto.Unmarshal(statsContent, statsFileBlocks); err != nil { + return errors.Trace(err) + } + + for _, block := range statsFileBlocks.Blocks { + physicalId, ok := rewriteIDMap[block.PhysicalId] + if !ok { + return berrors.ErrRestoreInvalidRewrite.GenWithStackByArgs(fmt.Sprintf( + "not rewrite rule matched, old physical id: %d", block.PhysicalId)) + } + jsonTable := &statsutil.JSONTable{} + if err := json.Unmarshal(block.JsonTable, jsonTable); err != nil { + return errors.Trace(err) + } + select { + case <-ectx.Done(): + return nil + case taskCh <- &statstypes.PartitionStatisticLoadTask{ + PhysicalID: physicalId, + JSONTable: jsonTable, + }: + } + } + + return nil + }) + } + + return eg.Wait() +} diff --git a/br/pkg/metautil/statsfile_test.go b/br/pkg/metautil/statsfile_test.go new file mode 100644 index 0000000000000..25ae4507c1e36 --- /dev/null +++ b/br/pkg/metautil/statsfile_test.go @@ -0,0 +1,155 @@ +// Copyright 2024 PingCAP, 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. + +package metautil + +import ( + "context" + "fmt" + "testing" + + backuppb "github.com/pingcap/kvproto/pkg/brpb" + "github.com/pingcap/kvproto/pkg/encryptionpb" + "github.com/pingcap/tidb/br/pkg/storage" + "github.com/pingcap/tidb/br/pkg/utils" + "github.com/pingcap/tidb/pkg/statistics/handle/types" + "github.com/pingcap/tidb/pkg/statistics/handle/util" + "github.com/pingcap/tipb/go-tipb" + "github.com/stretchr/testify/require" + "golang.org/x/sync/errgroup" +) + +func newJsonColumn(magic int64) *util.JSONColumn { + statsVer := magic + return &util.JSONColumn{ + Histogram: &tipb.Histogram{ + Ndv: magic, + Buckets: []*tipb.Bucket{ + { + Count: magic, + LowerBound: []byte(fmt.Sprintf("%d", magic)), + UpperBound: []byte(fmt.Sprintf("%d", magic)), + Repeats: magic, + }, + }, + }, + CMSketch: &tipb.CMSketch{ + DefaultValue: uint64(magic), + }, + FMSketch: &tipb.FMSketch{ + Mask: uint64(magic), + }, + StatsVer: &statsVer, + NullCount: magic, + } +} + +func TestStatsWriter(t *testing.T) { + ctx := context.Background() + + testCases := []encryptTest{ + { + method: encryptionpb.EncryptionMethod_PLAINTEXT, + }, + { + method: encryptionpb.EncryptionMethod_AES128_CTR, + rightKey: "0123456789012345", + wrongKey: "012345678901234", + }, + { + method: encryptionpb.EncryptionMethod_AES192_CTR, + rightKey: "012345678901234567890123", + wrongKey: "0123456789012345678901234", + }, + { + method: encryptionpb.EncryptionMethod_AES256_CTR, + rightKey: "01234567890123456789012345678901", + wrongKey: "01234567890123456789012345678902", + }, + } + fakeJsonTables := map[int64]*util.JSONTable{ + 1: { + Columns: map[string]*util.JSONColumn{"test": newJsonColumn(1)}, + Indices: map[string]*util.JSONColumn{"test": newJsonColumn(2)}, + DatabaseName: "test-schema", + TableName: "test-table", + ExtStats: []*util.JSONExtendedStats{ + { + StatsName: "test", + StringVals: "test", + ColIDs: []int64{1, 2, 3}, + }, + }, + Count: 1, + }, + 2: { + Columns: map[string]*util.JSONColumn{"test": newJsonColumn(3)}, + Indices: map[string]*util.JSONColumn{"test": newJsonColumn(4)}, + DatabaseName: "test-schema", + TableName: "test-table-1", + ExtStats: []*util.JSONExtendedStats{ + { + StatsName: "test", + StringVals: "test", + ColIDs: []int64{3, 4, 5}, + }, + }, + Count: 2, + }, + } + + rewriteIDs := map[int64]int64{1: 10, 2: 20} + rerewriteIDs := map[int64]int64{10: 1, 20: 2} + + base := t.TempDir() + stg, err := storage.NewLocalStorage(base) + require.NoError(t, err) + for _, v := range testCases { + cipher := backuppb.CipherInfo{ + CipherType: v.method, + CipherKey: []byte(v.rightKey), + } + statsWriter := newStatsWriter(stg, &cipher) + + // set the maxStatsJsonTableSize less enough + maxStatsJsonTableSize = 1 + inlineSize = 1 + err := statsWriter.BackupStats(ctx, fakeJsonTables[1], 1) + require.NoError(t, err) + + // set the maxStatsJsonTableSize back + maxStatsJsonTableSize = 32 * 1024 * 1024 + inlineSize = 8 * 1024 + err = statsWriter.BackupStats(ctx, fakeJsonTables[2], 2) + require.NoError(t, err) + statsFileIndexes, err := statsWriter.BackupStatsDone(ctx) + require.NoError(t, err) + + controlWorker := utils.NewWorkerPool(2, "test") + eg, ectx := errgroup.WithContext(ctx) + taskCh := make(chan *types.PartitionStatisticLoadTask) + controlWorker.ApplyOnErrorGroup(eg, func() error { + return downloadStats(ectx, stg, &cipher, statsFileIndexes, rewriteIDs, taskCh) + }) + controlWorker.ApplyOnErrorGroup(eg, func() error { + for task := range taskCh { + expectedJsonTable := fakeJsonTables[rerewriteIDs[task.PhysicalID]] + require.Equal(t, expectedJsonTable, task.JSONTable) + } + return nil + }) + err = eg.Wait() + require.NoError(t, err) + } +} diff --git a/br/pkg/mock/BUILD.bazel b/br/pkg/mock/BUILD.bazel index f0d1626685ef3..04c401174fc39 100644 --- a/br/pkg/mock/BUILD.bazel +++ b/br/pkg/mock/BUILD.bazel @@ -34,6 +34,7 @@ go_library( "@com_github_tikv_client_go_v2//testutils", "@com_github_tikv_client_go_v2//tikv", "@com_github_tikv_pd_client//:client", + "@com_github_tikv_pd_client//http", "@io_opencensus_go//stats/view", "@org_golang_google_grpc//:grpc", "@org_golang_google_grpc//metadata", diff --git a/br/pkg/mock/backend.go b/br/pkg/mock/backend.go index cb1d1a484229e..66c829552f5f7 100644 --- a/br/pkg/mock/backend.go +++ b/br/pkg/mock/backend.go @@ -1,6 +1,10 @@ // Code generated by MockGen. DO NOT EDIT. // Source: github.com/pingcap/tidb/br/pkg/lightning/backend (interfaces: Backend,EngineWriter,TargetInfoGetter,ChunkFlushStatus) - +// +// Generated by this command: +// +// mockgen -package mock github.com/pingcap/tidb/br/pkg/lightning/backend Backend,EngineWriter,TargetInfoGetter,ChunkFlushStatus +// // Package mock is a generated GoMock package. package mock @@ -48,7 +52,7 @@ func (m *MockBackend) CleanupEngine(arg0 context.Context, arg1 uuid.UUID) error } // CleanupEngine indicates an expected call of CleanupEngine. -func (mr *MockBackendMockRecorder) CleanupEngine(arg0, arg1 interface{}) *gomock.Call { +func (mr *MockBackendMockRecorder) CleanupEngine(arg0, arg1 any) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CleanupEngine", reflect.TypeOf((*MockBackend)(nil).CleanupEngine), arg0, arg1) } @@ -74,7 +78,7 @@ func (m *MockBackend) CloseEngine(arg0 context.Context, arg1 *backend.EngineConf } // CloseEngine indicates an expected call of CloseEngine. -func (mr *MockBackendMockRecorder) CloseEngine(arg0, arg1, arg2 interface{}) *gomock.Call { +func (mr *MockBackendMockRecorder) CloseEngine(arg0, arg1, arg2 any) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CloseEngine", reflect.TypeOf((*MockBackend)(nil).CloseEngine), arg0, arg1, arg2) } @@ -88,7 +92,7 @@ func (m *MockBackend) FlushAllEngines(arg0 context.Context) error { } // FlushAllEngines indicates an expected call of FlushAllEngines. -func (mr *MockBackendMockRecorder) FlushAllEngines(arg0 interface{}) *gomock.Call { +func (mr *MockBackendMockRecorder) FlushAllEngines(arg0 any) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FlushAllEngines", reflect.TypeOf((*MockBackend)(nil).FlushAllEngines), arg0) } @@ -102,7 +106,7 @@ func (m *MockBackend) FlushEngine(arg0 context.Context, arg1 uuid.UUID) error { } // FlushEngine indicates an expected call of FlushEngine. -func (mr *MockBackendMockRecorder) FlushEngine(arg0, arg1 interface{}) *gomock.Call { +func (mr *MockBackendMockRecorder) FlushEngine(arg0, arg1 any) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FlushEngine", reflect.TypeOf((*MockBackend)(nil).FlushEngine), arg0, arg1) } @@ -116,7 +120,7 @@ func (m *MockBackend) ImportEngine(arg0 context.Context, arg1 uuid.UUID, arg2, a } // ImportEngine indicates an expected call of ImportEngine. -func (mr *MockBackendMockRecorder) ImportEngine(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { +func (mr *MockBackendMockRecorder) ImportEngine(arg0, arg1, arg2, arg3 any) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ImportEngine", reflect.TypeOf((*MockBackend)(nil).ImportEngine), arg0, arg1, arg2, arg3) } @@ -131,7 +135,7 @@ func (m *MockBackend) LocalWriter(arg0 context.Context, arg1 *backend.LocalWrite } // LocalWriter indicates an expected call of LocalWriter. -func (mr *MockBackendMockRecorder) LocalWriter(arg0, arg1, arg2 interface{}) *gomock.Call { +func (mr *MockBackendMockRecorder) LocalWriter(arg0, arg1, arg2 any) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "LocalWriter", reflect.TypeOf((*MockBackend)(nil).LocalWriter), arg0, arg1, arg2) } @@ -145,7 +149,7 @@ func (m *MockBackend) OpenEngine(arg0 context.Context, arg1 *backend.EngineConfi } // OpenEngine indicates an expected call of OpenEngine. -func (mr *MockBackendMockRecorder) OpenEngine(arg0, arg1, arg2 interface{}) *gomock.Call { +func (mr *MockBackendMockRecorder) OpenEngine(arg0, arg1, arg2 any) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "OpenEngine", reflect.TypeOf((*MockBackend)(nil).OpenEngine), arg0, arg1, arg2) } @@ -159,7 +163,7 @@ func (m *MockBackend) ResetEngine(arg0 context.Context, arg1 uuid.UUID) error { } // ResetEngine indicates an expected call of ResetEngine. -func (mr *MockBackendMockRecorder) ResetEngine(arg0, arg1 interface{}) *gomock.Call { +func (mr *MockBackendMockRecorder) ResetEngine(arg0, arg1 any) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ResetEngine", reflect.TypeOf((*MockBackend)(nil).ResetEngine), arg0, arg1) } @@ -224,7 +228,7 @@ func (m *MockEngineWriter) AppendRows(arg0 context.Context, arg1 []string, arg2 } // AppendRows indicates an expected call of AppendRows. -func (mr *MockEngineWriterMockRecorder) AppendRows(arg0, arg1, arg2 interface{}) *gomock.Call { +func (mr *MockEngineWriterMockRecorder) AppendRows(arg0, arg1, arg2 any) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AppendRows", reflect.TypeOf((*MockEngineWriter)(nil).AppendRows), arg0, arg1, arg2) } @@ -239,7 +243,7 @@ func (m *MockEngineWriter) Close(arg0 context.Context) (backend.ChunkFlushStatus } // Close indicates an expected call of Close. -func (mr *MockEngineWriterMockRecorder) Close(arg0 interface{}) *gomock.Call { +func (mr *MockEngineWriterMockRecorder) Close(arg0 any) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Close", reflect.TypeOf((*MockEngineWriter)(nil).Close), arg0) } @@ -290,7 +294,7 @@ func (m *MockTargetInfoGetter) CheckRequirements(arg0 context.Context, arg1 *bac } // CheckRequirements indicates an expected call of CheckRequirements. -func (mr *MockTargetInfoGetterMockRecorder) CheckRequirements(arg0, arg1 interface{}) *gomock.Call { +func (mr *MockTargetInfoGetterMockRecorder) CheckRequirements(arg0, arg1 any) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CheckRequirements", reflect.TypeOf((*MockTargetInfoGetter)(nil).CheckRequirements), arg0, arg1) } @@ -305,7 +309,7 @@ func (m *MockTargetInfoGetter) FetchRemoteTableModels(arg0 context.Context, arg1 } // FetchRemoteTableModels indicates an expected call of FetchRemoteTableModels. -func (mr *MockTargetInfoGetterMockRecorder) FetchRemoteTableModels(arg0, arg1 interface{}) *gomock.Call { +func (mr *MockTargetInfoGetterMockRecorder) FetchRemoteTableModels(arg0, arg1 any) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FetchRemoteTableModels", reflect.TypeOf((*MockTargetInfoGetter)(nil).FetchRemoteTableModels), arg0, arg1) } diff --git a/br/pkg/mock/encode.go b/br/pkg/mock/encode.go index e92c6ffd17848..0470325d353c9 100644 --- a/br/pkg/mock/encode.go +++ b/br/pkg/mock/encode.go @@ -1,6 +1,10 @@ // Code generated by MockGen. DO NOT EDIT. // Source: github.com/pingcap/tidb/br/pkg/lightning/backend/encode (interfaces: Encoder,EncodingBuilder,Rows,Row) - +// +// Generated by this command: +// +// mockgen -package mock github.com/pingcap/tidb/br/pkg/lightning/backend/encode Encoder,EncodingBuilder,Rows,Row +// // Package mock is a generated GoMock package. package mock @@ -59,7 +63,7 @@ func (m *MockEncoder) Encode(arg0 []types.Datum, arg1 int64, arg2 []int, arg3 in } // Encode indicates an expected call of Encode. -func (mr *MockEncoderMockRecorder) Encode(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { +func (mr *MockEncoderMockRecorder) Encode(arg0, arg1, arg2, arg3 any) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Encode", reflect.TypeOf((*MockEncoder)(nil).Encode), arg0, arg1, arg2, arg3) } @@ -111,7 +115,7 @@ func (m *MockEncodingBuilder) NewEncoder(arg0 context.Context, arg1 *encode.Enco } // NewEncoder indicates an expected call of NewEncoder. -func (mr *MockEncodingBuilderMockRecorder) NewEncoder(arg0, arg1 interface{}) *gomock.Call { +func (mr *MockEncodingBuilderMockRecorder) NewEncoder(arg0, arg1 any) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NewEncoder", reflect.TypeOf((*MockEncodingBuilder)(nil).NewEncoder), arg0, arg1) } @@ -162,7 +166,7 @@ func (m *MockRows) SplitIntoChunks(arg0 int) []encode.Rows { } // SplitIntoChunks indicates an expected call of SplitIntoChunks. -func (mr *MockRowsMockRecorder) SplitIntoChunks(arg0 interface{}) *gomock.Call { +func (mr *MockRowsMockRecorder) SplitIntoChunks(arg0 any) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SplitIntoChunks", reflect.TypeOf((*MockRows)(nil).SplitIntoChunks), arg0) } @@ -197,7 +201,7 @@ func (m *MockRow) ClassifyAndAppend(arg0 *encode.Rows, arg1 *verification.KVChec } // ClassifyAndAppend indicates an expected call of ClassifyAndAppend. -func (mr *MockRowMockRecorder) ClassifyAndAppend(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { +func (mr *MockRowMockRecorder) ClassifyAndAppend(arg0, arg1, arg2, arg3 any) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ClassifyAndAppend", reflect.TypeOf((*MockRow)(nil).ClassifyAndAppend), arg0, arg1, arg2, arg3) } diff --git a/br/pkg/mock/mock_cluster.go b/br/pkg/mock/mock_cluster.go index 0e87d4b411c2d..e0d81e562f8cb 100644 --- a/br/pkg/mock/mock_cluster.go +++ b/br/pkg/mock/mock_cluster.go @@ -24,6 +24,7 @@ import ( "github.com/tikv/client-go/v2/testutils" "github.com/tikv/client-go/v2/tikv" pd "github.com/tikv/pd/client" + pdhttp "github.com/tikv/pd/client/http" "go.opencensus.io/stats/view" "go.uber.org/zap" ) @@ -39,6 +40,7 @@ type Cluster struct { *domain.Domain DSN string PDClient pd.Client + PDHTTPCli pdhttp.Client HttpServer *http.Server } @@ -79,6 +81,7 @@ func NewCluster() (*Cluster, error) { cluster.Domain = dom cluster.PDClient = storage.(tikv.Storage).GetRegionCache().PDClient() + cluster.PDHTTPCli = storage.(tikv.Storage).GetPDHTTPClient() return cluster, nil } diff --git a/br/pkg/mock/mock_cluster_test.go b/br/pkg/mock/mock_cluster_test.go index 9d94261568412..e40d83ec26646 100644 --- a/br/pkg/mock/mock_cluster_test.go +++ b/br/pkg/mock/mock_cluster_test.go @@ -14,6 +14,7 @@ func TestSmoke(t *testing.T) { defer goleak.VerifyNone( t, goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("github.com/klauspost/compress/zstd.(*blockDec).startDecoder"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), diff --git a/br/pkg/mock/mocklocal/BUILD.bazel b/br/pkg/mock/mocklocal/BUILD.bazel index cb1b234843426..a9ac3497f50ba 100644 --- a/br/pkg/mock/mocklocal/BUILD.bazel +++ b/br/pkg/mock/mocklocal/BUILD.bazel @@ -8,6 +8,7 @@ go_library( deps = [ "//br/pkg/lightning/backend", "@com_github_pingcap_kvproto//pkg/import_sstpb", + "@com_github_tikv_client_go_v2//tikv", "@org_uber_go_mock//gomock", ], ) diff --git a/br/pkg/mock/mocklocal/local.go b/br/pkg/mock/mocklocal/local.go index f1987f224c3d1..785f3c4173782 100644 --- a/br/pkg/mock/mocklocal/local.go +++ b/br/pkg/mock/mocklocal/local.go @@ -1,6 +1,10 @@ // Code generated by MockGen. DO NOT EDIT. -// Source: github.com/pingcap/tidb/br/pkg/lightning/backend/local (interfaces: DiskUsage,TiKVModeSwitcher) - +// Source: github.com/pingcap/tidb/br/pkg/lightning/backend/local (interfaces: DiskUsage,TiKVModeSwitcher,StoreHelper) +// +// Generated by this command: +// +// mockgen -package mocklocal github.com/pingcap/tidb/br/pkg/lightning/backend/local DiskUsage,TiKVModeSwitcher,StoreHelper +// // Package mocklocal is a generated GoMock package. package mocklocal @@ -10,6 +14,7 @@ import ( import_sstpb "github.com/pingcap/kvproto/pkg/import_sstpb" backend "github.com/pingcap/tidb/br/pkg/lightning/backend" + "github.com/tikv/client-go/v2/tikv" gomock "go.uber.org/mock/gomock" ) @@ -76,7 +81,7 @@ func (m *MockTiKVModeSwitcher) EXPECT() *MockTiKVModeSwitcherMockRecorder { // ToImportMode mocks base method. func (m *MockTiKVModeSwitcher) ToImportMode(arg0 context.Context, arg1 ...*import_sstpb.Range) { m.ctrl.T.Helper() - varargs := []interface{}{arg0} + varargs := []any{arg0} for _, a := range arg1 { varargs = append(varargs, a) } @@ -84,16 +89,16 @@ func (m *MockTiKVModeSwitcher) ToImportMode(arg0 context.Context, arg1 ...*impor } // ToImportMode indicates an expected call of ToImportMode. -func (mr *MockTiKVModeSwitcherMockRecorder) ToImportMode(arg0 interface{}, arg1 ...interface{}) *gomock.Call { +func (mr *MockTiKVModeSwitcherMockRecorder) ToImportMode(arg0 any, arg1 ...any) *gomock.Call { mr.mock.ctrl.T.Helper() - varargs := append([]interface{}{arg0}, arg1...) + varargs := append([]any{arg0}, arg1...) return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ToImportMode", reflect.TypeOf((*MockTiKVModeSwitcher)(nil).ToImportMode), varargs...) } // ToNormalMode mocks base method. func (m *MockTiKVModeSwitcher) ToNormalMode(arg0 context.Context, arg1 ...*import_sstpb.Range) { m.ctrl.T.Helper() - varargs := []interface{}{arg0} + varargs := []any{arg0} for _, a := range arg1 { varargs = append(varargs, a) } @@ -101,8 +106,61 @@ func (m *MockTiKVModeSwitcher) ToNormalMode(arg0 context.Context, arg1 ...*impor } // ToNormalMode indicates an expected call of ToNormalMode. -func (mr *MockTiKVModeSwitcherMockRecorder) ToNormalMode(arg0 interface{}, arg1 ...interface{}) *gomock.Call { +func (mr *MockTiKVModeSwitcherMockRecorder) ToNormalMode(arg0 any, arg1 ...any) *gomock.Call { mr.mock.ctrl.T.Helper() - varargs := append([]interface{}{arg0}, arg1...) + varargs := append([]any{arg0}, arg1...) return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ToNormalMode", reflect.TypeOf((*MockTiKVModeSwitcher)(nil).ToNormalMode), varargs...) } + +// MockStoreHelper is a mock of StoreHelper interface. +type MockStoreHelper struct { + ctrl *gomock.Controller + recorder *MockStoreHelperMockRecorder +} + +// MockStoreHelperMockRecorder is the mock recorder for MockStoreHelper. +type MockStoreHelperMockRecorder struct { + mock *MockStoreHelper +} + +// NewMockStoreHelper creates a new mock instance. +func NewMockStoreHelper(ctrl *gomock.Controller) *MockStoreHelper { + mock := &MockStoreHelper{ctrl: ctrl} + mock.recorder = &MockStoreHelperMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockStoreHelper) EXPECT() *MockStoreHelperMockRecorder { + return m.recorder +} + +// GetTS mocks base method. +func (m *MockStoreHelper) GetTS(arg0 context.Context) (int64, int64, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetTS", arg0) + ret0, _ := ret[0].(int64) + ret1, _ := ret[1].(int64) + ret2, _ := ret[2].(error) + return ret0, ret1, ret2 +} + +// GetTS indicates an expected call of GetTS. +func (mr *MockStoreHelperMockRecorder) GetTS(arg0 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetTS", reflect.TypeOf((*MockStoreHelper)(nil).GetTS), arg0) +} + +// GetTiKVCodec mocks base method. +func (m *MockStoreHelper) GetTiKVCodec() tikv.Codec { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetTiKVCodec") + ret0, _ := ret[0].(tikv.Codec) + return ret0 +} + +// GetTiKVCodec indicates an expected call of GetTiKVCodec. +func (mr *MockStoreHelperMockRecorder) GetTiKVCodec() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetTiKVCodec", reflect.TypeOf((*MockStoreHelper)(nil).GetTiKVCodec)) +} diff --git a/br/pkg/mock/task_register.go b/br/pkg/mock/task_register.go index 66d54bc1733eb..3585b54962b5e 100644 --- a/br/pkg/mock/task_register.go +++ b/br/pkg/mock/task_register.go @@ -1,6 +1,10 @@ // Code generated by MockGen. DO NOT EDIT. // Source: github.com/pingcap/tidb/br/pkg/utils (interfaces: TaskRegister) - +// +// Generated by this command: +// +// mockgen -package mock github.com/pingcap/tidb/br/pkg/utils TaskRegister +// // Package mock is a generated GoMock package. package mock @@ -43,7 +47,7 @@ func (m *MockTaskRegister) Close(arg0 context.Context) error { } // Close indicates an expected call of Close. -func (mr *MockTaskRegisterMockRecorder) Close(arg0 interface{}) *gomock.Call { +func (mr *MockTaskRegisterMockRecorder) Close(arg0 any) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Close", reflect.TypeOf((*MockTaskRegister)(nil).Close), arg0) } @@ -57,7 +61,7 @@ func (m *MockTaskRegister) RegisterTask(arg0 context.Context) error { } // RegisterTask indicates an expected call of RegisterTask. -func (mr *MockTaskRegisterMockRecorder) RegisterTask(arg0 interface{}) *gomock.Call { +func (mr *MockTaskRegisterMockRecorder) RegisterTask(arg0 any) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RegisterTask", reflect.TypeOf((*MockTaskRegister)(nil).RegisterTask), arg0) } @@ -71,7 +75,7 @@ func (m *MockTaskRegister) RegisterTaskOnce(arg0 context.Context) error { } // RegisterTaskOnce indicates an expected call of RegisterTaskOnce. -func (mr *MockTaskRegisterMockRecorder) RegisterTaskOnce(arg0 interface{}) *gomock.Call { +func (mr *MockTaskRegisterMockRecorder) RegisterTaskOnce(arg0 any) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RegisterTaskOnce", reflect.TypeOf((*MockTaskRegister)(nil).RegisterTaskOnce), arg0) } diff --git a/br/pkg/pdutil/BUILD.bazel b/br/pkg/pdutil/BUILD.bazel index b9b42e7d534b0..779a6959bfa08 100644 --- a/br/pkg/pdutil/BUILD.bazel +++ b/br/pkg/pdutil/BUILD.bazel @@ -24,6 +24,7 @@ go_library( "@com_github_pingcap_log//:log", "@com_github_tikv_pd_client//:client", "@com_github_tikv_pd_client//http", + "@com_github_tikv_pd_client//retry", "@org_golang_google_grpc//:grpc", "@org_uber_go_zap//:zap", ], diff --git a/br/pkg/pdutil/main_test.go b/br/pkg/pdutil/main_test.go index 6a73f877ab289..5a1c7570fd77b 100644 --- a/br/pkg/pdutil/main_test.go +++ b/br/pkg/pdutil/main_test.go @@ -25,6 +25,7 @@ func TestMain(m *testing.M) { testsetup.SetupForCommonTest() opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), diff --git a/br/pkg/pdutil/pd.go b/br/pkg/pdutil/pd.go index 779d3044de11d..575fae954d09a 100644 --- a/br/pkg/pdutil/pd.go +++ b/br/pkg/pdutil/pd.go @@ -33,6 +33,7 @@ import ( "github.com/pingcap/tidb/pkg/util/codec" pd "github.com/tikv/pd/client" pdhttp "github.com/tikv/pd/client/http" + "github.com/tikv/pd/client/retry" "go.uber.org/zap" "google.golang.org/grpc" ) @@ -41,7 +42,7 @@ const ( maxMsgSize = int(128 * units.MiB) // pd.ScanRegion may return a large response pauseTimeout = 5 * time.Minute // pd request retry time when connection fail - pdRequestRetryTime = 120 + PDRequestRetryTime = 120 // set max-pending-peer-count to a large value to avoid scatter region failed. maxPendingPeerUnlimited uint64 = math.MaxInt32 ) @@ -167,7 +168,7 @@ func pdRequestWithCode( resp, err = cli.Do(req) //nolint:bodyclose count++ failpoint.Inject("InjectClosed", func(v failpoint.Value) { - if failType, ok := v.(int); ok && count <= pdRequestRetryTime-1 { + if failType, ok := v.(int); ok && count <= PDRequestRetryTime-1 { resp = nil switch failType { case 0: @@ -183,7 +184,7 @@ func pdRequestWithCode( } } }) - if count > pdRequestRetryTime || (resp != nil && resp.StatusCode < 500) || + if count > PDRequestRetryTime || (resp != nil && resp.StatusCode < 500) || (err != nil && !common.IsRetryableError(err)) { break } @@ -234,19 +235,22 @@ func DefaultExpectPDCfgGenerators() map[string]pauseConfigGenerator { // PdController manage get/update config from pd. type PdController struct { - addrs []string - cli *http.Client - pdClient pd.Client - version *semver.Version + addrs []string + cli *http.Client // TODO: replace it with pd HTTP client + pdClient pd.Client + pdHTTPCli pdhttp.Client + version *semver.Version // control the pause schedulers goroutine schedulerPauseCh chan struct{} + // control the ttl of pausing schedulers + SchedulerPauseTTL time.Duration } // NewPdController creates a new PdController. func NewPdController( ctx context.Context, - pdAddrs string, + pdAddrs string, // TODO(lance6716): use HTTP client? tlsConf *tls.Config, securityOption pd.SecurityOption, ) (*PdController, error) { @@ -293,11 +297,18 @@ func NewPdController( return nil, errors.Trace(err) } + pdHTTPCliConfig := make([]pdhttp.ClientOption, 0, 1) + if tlsConf != nil { + pdHTTPCliConfig = append(pdHTTPCliConfig, pdhttp.WithTLSConfig(tlsConf)) + } + pdHTTPCli := pdhttp.NewClient("br/lightning PD controller", addrs, pdHTTPCliConfig...). + WithBackoffer(retry.InitialBackoffer(time.Second, time.Second, PDRequestRetryTime*time.Second)) return &PdController{ - addrs: processedAddrs, - cli: cli, - pdClient: pdClient, - version: version, + addrs: processedAddrs, + cli: cli, + pdClient: pdClient, + pdHTTPCli: pdHTTPCli, + version: version, // We should make a buffered channel here otherwise when context canceled, // gracefully shutdown will stick at resuming schedulers. schedulerPauseCh: make(chan struct{}, 1), @@ -354,6 +365,11 @@ func (p *PdController) GetPDClient() pd.Client { return p.pdClient } +// GetPDHTTPClient returns the pd http client. +func (p *PdController) GetPDHTTPClient() pdhttp.Client { + return p.pdHTTPCli +} + // GetClusterVersion returns the current cluster version. func (p *PdController) GetClusterVersion(ctx context.Context) (string, error) { return p.getClusterVersionWith(ctx, pdRequest) @@ -389,7 +405,9 @@ func (p *PdController) getRegionCountWith( } var err error for _, addr := range p.getAllPDAddrs() { - v, e := get(ctx, addr, pdhttp.RegionStatsByKeyRange(start, end), p.cli, http.MethodGet, nil) + v, e := get(ctx, addr, + pdhttp.RegionStatsByKeyRange(pdhttp.NewKeyRange(start, end), false), + p.cli, http.MethodGet, nil) if e != nil { err = e continue @@ -431,7 +449,7 @@ func (p *PdController) getStoreInfoWith( func (p *PdController) doPauseSchedulers(ctx context.Context, schedulers []string, post pdHTTPRequest) ([]string, error) { // pause this scheduler with 300 seconds - body, err := json.Marshal(pauseSchedulerBody{Delay: int64(pauseTimeout.Seconds())}) + body, err := json.Marshal(pauseSchedulerBody{Delay: int64(p.ttlOfPausing().Seconds())}) if err != nil { return nil, errors.Trace(err) } @@ -439,9 +457,11 @@ func (p *PdController) doPauseSchedulers(ctx context.Context, removedSchedulers := make([]string, 0, len(schedulers)) for _, scheduler := range schedulers { for _, addr := range p.getAllPDAddrs() { - _, err = post(ctx, addr, pdhttp.SchedulerByName(scheduler), p.cli, http.MethodPost, body) + var resp []byte + resp, err = post(ctx, addr, pdhttp.SchedulerByName(scheduler), p.cli, http.MethodPost, body) if err == nil { removedSchedulers = append(removedSchedulers, scheduler) + log.Info("Paused scheduler.", zap.String("response", string(resp)), zap.String("on", addr)) break } } @@ -476,7 +496,7 @@ func (p *PdController) pauseSchedulersAndConfigWith( } go func() { - tick := time.NewTicker(pauseTimeout / 3) + tick := time.NewTicker(p.ttlOfPausing() / 3) defer tick.Stop() for { @@ -621,7 +641,7 @@ func (p *PdController) doUpdatePDScheduleConfig( func (p *PdController) doPauseConfigs(ctx context.Context, cfg map[string]interface{}, post pdHTTPRequest) error { // pause this scheduler with 300 seconds - return p.doUpdatePDScheduleConfig(ctx, cfg, post, pdhttp.ConfigWithTTLSeconds(pauseTimeout.Seconds())) + return p.doUpdatePDScheduleConfig(ctx, cfg, post, pdhttp.ConfigWithTTLSeconds(p.ttlOfPausing().Seconds())) } func restoreSchedulers(ctx context.Context, pd *PdController, clusterCfg ClusterConfig, @@ -957,67 +977,32 @@ type KeyRangeRule struct { EndKeyHex string `json:"end_key"` // hex format end key, for marshal/unmarshal } -// CreateOrUpdateRegionLabelRule creates or updates a region label rule. -func (p *PdController) CreateOrUpdateRegionLabelRule(ctx context.Context, rule LabelRule) error { - reqData, err := json.Marshal(&rule) - if err != nil { - panic(err) - } - var lastErr error - addrs := p.getAllPDAddrs() - for i, addr := range addrs { - _, lastErr = pdRequest(ctx, addr, pdhttp.RegionLabelRule, - p.cli, http.MethodPost, reqData) - if lastErr == nil { - return nil - } - if berrors.IsContextCanceled(lastErr) { - return errors.Trace(lastErr) - } - - if i < len(addrs) { - log.Warn("failed to create or update region label rule, will try next pd address", - zap.Error(lastErr), zap.String("pdAddr", addr)) - } - } - return errors.Trace(lastErr) -} - -// DeleteRegionLabelRule deletes a region label rule. -func (p *PdController) DeleteRegionLabelRule(ctx context.Context, ruleID string) error { - var lastErr error - addrs := p.getAllPDAddrs() - for i, addr := range addrs { - _, lastErr = pdRequest(ctx, addr, fmt.Sprintf("%s/%s", pdhttp.RegionLabelRule, ruleID), - p.cli, http.MethodDelete, nil) - if lastErr == nil { - return nil - } - if berrors.IsContextCanceled(lastErr) { - return errors.Trace(lastErr) - } - - if i < len(addrs) { - log.Warn("failed to delete region label rule, will try next pd address", - zap.Error(lastErr), zap.String("pdAddr", addr)) - } - } - return errors.Trace(lastErr) -} - // PauseSchedulersByKeyRange will pause schedulers for regions in the specific key range. // This function will spawn a goroutine to keep pausing schedulers periodically until the context is done. // The return done channel is used to notify the caller that the background goroutine is exited. -func (p *PdController) PauseSchedulersByKeyRange(ctx context.Context, - startKey, endKey []byte) (done <-chan struct{}, err error) { - return p.pauseSchedulerByKeyRangeWithTTL(ctx, startKey, endKey, pauseTimeout) +func PauseSchedulersByKeyRange( + ctx context.Context, + pdHTTPCli pdhttp.Client, + startKey, endKey []byte, +) (done <-chan struct{}, err error) { + done, err = pauseSchedulerByKeyRangeWithTTL(ctx, pdHTTPCli, startKey, endKey, pauseTimeout) + // Wait for the rule to take effect because the PD operator is processed asynchronously. + // To synchronize this, checking the operator status may not be enough. For details, see + // https://github.com/pingcap/tidb/issues/49477. + // Let's use two times default value of `patrol-region-interval` from PD configuration. + <-time.After(20 * time.Millisecond) + return } -func (p *PdController) pauseSchedulerByKeyRangeWithTTL(ctx context.Context, - startKey, endKey []byte, ttl time.Duration) (_done <-chan struct{}, err error) { - rule := LabelRule{ +func pauseSchedulerByKeyRangeWithTTL( + ctx context.Context, + pdHTTPCli pdhttp.Client, + startKey, endKey []byte, + ttl time.Duration, +) (<-chan struct{}, error) { + rule := &pdhttp.LabelRule{ ID: uuid.New().String(), - Labels: []RegionLabel{{ + Labels: []pdhttp.RegionLabel{{ Key: "schedule", Value: "deny", TTL: ttl.String(), @@ -1031,7 +1016,8 @@ func (p *PdController) pauseSchedulerByKeyRangeWithTTL(ctx context.Context, }}, } done := make(chan struct{}) - if err := p.CreateOrUpdateRegionLabelRule(ctx, rule); err != nil { + + if err := pdHTTPCli.SetRegionLabelRule(ctx, rule); err != nil { close(done) return nil, errors.Trace(err) } @@ -1044,7 +1030,7 @@ func (p *PdController) pauseSchedulerByKeyRangeWithTTL(ctx context.Context, for { select { case <-ticker.C: - if err := p.CreateOrUpdateRegionLabelRule(ctx, rule); err != nil { + if err := pdHTTPCli.SetRegionLabelRule(ctx, rule); err != nil { if berrors.IsContextCanceled(err) { break loop } @@ -1060,7 +1046,8 @@ func (p *PdController) pauseSchedulerByKeyRangeWithTTL(ctx context.Context, defer cancel() // Set ttl to 0 to remove the rule. rule.Labels[0].TTL = time.Duration(0).String() - if err := p.DeleteRegionLabelRule(recoverCtx, rule.ID); err != nil { + deleteRule := &pdhttp.LabelRulePatch{DeleteRules: []string{rule.ID}} + if err := pdHTTPCli.PatchRegionLabelRules(recoverCtx, deleteRule); err != nil { log.Warn("failed to delete region label rule, the rule will be removed after ttl expires", zap.String("rule-id", rule.ID), zap.Duration("ttl", ttl), zap.Error(err)) } @@ -1074,28 +1061,31 @@ func (p *PdController) CanPauseSchedulerByKeyRange() bool { return p.version.Compare(minVersionForRegionLabelTTL) >= 0 } -// Close close the connection to pd. +// Close closes the connection to pd. func (p *PdController) Close() { p.pdClient.Close() + if p.pdHTTPCli != nil { + // nil in some unit tests + p.pdHTTPCli.Close() + } if p.schedulerPauseCh != nil { close(p.schedulerPauseCh) } } -// FetchPDVersion get pd version -func FetchPDVersion(ctx context.Context, tls *common.TLS, pdAddr string) (*semver.Version, error) { - // An example of PD version API. - // curl http://pd_address/pd/api/v1/version - // { - // "version": "v4.0.0-rc.2-451-g760fb650" - // } - var rawVersion struct { - Version string `json:"version"` +func (p *PdController) ttlOfPausing() time.Duration { + if p.SchedulerPauseTTL > 0 { + return p.SchedulerPauseTTL } - err := tls.WithHost(pdAddr).GetJSON(ctx, pdhttp.Version, &rawVersion) + return pauseTimeout +} + +// FetchPDVersion get pd version +func FetchPDVersion(ctx context.Context, pdHTTPCli pdhttp.Client) (*semver.Version, error) { + ver, err := pdHTTPCli.GetPDVersion(ctx) if err != nil { return nil, errors.Trace(err) } - return parseVersion([]byte(rawVersion.Version)), nil + return parseVersion([]byte(ver)), nil } diff --git a/br/pkg/pdutil/pd_serial_test.go b/br/pkg/pdutil/pd_serial_test.go index f76f61f6dddb9..273db5a9f395c 100644 --- a/br/pkg/pdutil/pd_serial_test.go +++ b/br/pkg/pdutil/pd_serial_test.go @@ -12,7 +12,6 @@ import ( "net/http" "net/http/httptest" "net/url" - "strings" "sync" "testing" "time" @@ -23,7 +22,7 @@ import ( "github.com/pingcap/tidb/pkg/store/pdtypes" "github.com/pingcap/tidb/pkg/util/codec" "github.com/stretchr/testify/require" - pd "github.com/tikv/pd/client/http" + pdhttp "github.com/tikv/pd/client/http" ) func TestScheduler(t *testing.T) { @@ -183,7 +182,7 @@ func TestPDRequestRetry(t *testing.T) { bytes, err := io.ReadAll(r.Body) require.NoError(t, err) require.Equal(t, "test", string(bytes)) - if count <= pdRequestRetryTime-1 { + if count <= PDRequestRetryTime-1 { w.WriteHeader(http.StatusGatewayTimeout) return } @@ -204,7 +203,7 @@ func TestPDRequestRetry(t *testing.T) { count = 0 ts = httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { count++ - if count <= pdRequestRetryTime+1 { + if count <= PDRequestRetryTime+1 { w.WriteHeader(http.StatusGatewayTimeout) return } @@ -273,7 +272,7 @@ func TestStoreInfo(t *testing.T) { _ context.Context, addr string, prefix string, _ *http.Client, _ string, _ []byte, ) ([]byte, error) { require.Equal(t, - fmt.Sprintf("http://mock%s", pd.StoreByID(1)), + fmt.Sprintf("http://mock%s", pdhttp.StoreByID(1)), fmt.Sprintf("%s%s", addr, prefix)) ret, err := json.Marshal(storeInfo) require.NoError(t, err) @@ -306,37 +305,43 @@ func TestPauseSchedulersByKeyRange(t *testing.T) { if deleted { return } - if r.Method == http.MethodDelete { - ruleID := strings.TrimPrefix(r.URL.Path, pd.RegionLabelRule+"/") - delete(labelExpires, ruleID) + switch r.Method { + case http.MethodPatch: + var patch pdhttp.LabelRulePatch + err := json.NewDecoder(r.Body).Decode(&patch) + require.NoError(t, err) + require.Len(t, patch.SetRules, 0) + require.Len(t, patch.DeleteRules, 1) + delete(labelExpires, patch.DeleteRules[0]) deleted = true - return - } - var labelRule LabelRule - err := json.NewDecoder(r.Body).Decode(&labelRule) - require.NoError(t, err) - require.Len(t, labelRule.Labels, 1) - regionLabel := labelRule.Labels[0] - require.Equal(t, "schedule", regionLabel.Key) - require.Equal(t, "deny", regionLabel.Value) - reqTTL, err := time.ParseDuration(regionLabel.TTL) - require.NoError(t, err) - if reqTTL == 0 { - delete(labelExpires, labelRule.ID) - } else { - require.Equal(t, ttl, reqTTL) - if expire, ok := labelExpires[labelRule.ID]; ok { - require.True(t, expire.After(time.Now()), "should not expire before now") + case http.MethodPost: + var labelRule LabelRule + err := json.NewDecoder(r.Body).Decode(&labelRule) + require.NoError(t, err) + require.Len(t, labelRule.Labels, 1) + regionLabel := labelRule.Labels[0] + require.Equal(t, "schedule", regionLabel.Key) + require.Equal(t, "deny", regionLabel.Value) + reqTTL, err := time.ParseDuration(regionLabel.TTL) + require.NoError(t, err) + if reqTTL == 0 { + delete(labelExpires, labelRule.ID) + } else { + require.Equal(t, ttl, reqTTL) + if expire, ok := labelExpires[labelRule.ID]; ok { + require.True(t, expire.After(time.Now()), "should not expire before now") + } + labelExpires[labelRule.ID] = time.Now().Add(ttl) } - labelExpires[labelRule.ID] = time.Now().Add(ttl) } })) defer httpSrv.Close() - pdController := &PdController{addrs: []string{httpSrv.URL}, cli: http.DefaultClient} + pdHTTPCli := pdhttp.NewClient("test", []string{httpSrv.URL}) + defer pdHTTPCli.Close() ctx, cancel := context.WithCancel(context.Background()) defer cancel() - done, err := pdController.pauseSchedulerByKeyRangeWithTTL(ctx, []byte{0, 0, 0, 0}, []byte{0xff, 0xff, 0xff, 0xff}, ttl) + done, err := pauseSchedulerByKeyRangeWithTTL(ctx, pdHTTPCli, []byte{0, 0, 0, 0}, []byte{0xff, 0xff, 0xff, 0xff}, ttl) require.NoError(t, err) time.Sleep(ttl * 3) cancel() diff --git a/br/pkg/redact/BUILD.bazel b/br/pkg/redact/BUILD.bazel index 9dfe9995d6ebd..b15d22af3e53d 100644 --- a/br/pkg/redact/BUILD.bazel +++ b/br/pkg/redact/BUILD.bazel @@ -11,10 +11,14 @@ go_library( go_test( name = "redact_test", timeout = "short", - srcs = ["redact_test.go"], + srcs = [ + "main_test.go", + "redact_test.go", + ], + embed = [":redact"], flaky = True, deps = [ - ":redact", + "//pkg/testkit/testsetup", "@com_github_stretchr_testify//require", "@org_uber_go_goleak//:goleak", ], diff --git a/pkg/planner/core/tests/prepare/issue/main_test.go b/br/pkg/redact/main_test.go similarity index 81% rename from pkg/planner/core/tests/prepare/issue/main_test.go rename to br/pkg/redact/main_test.go index cef07c27d30f9..253b8ea0ea1e3 100644 --- a/pkg/planner/core/tests/prepare/issue/main_test.go +++ b/br/pkg/redact/main_test.go @@ -12,10 +12,9 @@ // See the License for the specific language governing permissions and // limitations under the License. -package issue +package redact import ( - "flag" "testing" "github.com/pingcap/tidb/pkg/testkit/testsetup" @@ -24,10 +23,11 @@ import ( func TestMain(m *testing.M) { testsetup.SetupForCommonTest() - flag.Parse() opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), + goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), } goleak.VerifyTestMain(m, opts...) } diff --git a/br/pkg/redact/redact_test.go b/br/pkg/redact/redact_test.go index 5647a681974f3..939cc919edd30 100644 --- a/br/pkg/redact/redact_test.go +++ b/br/pkg/redact/redact_test.go @@ -8,12 +8,9 @@ import ( "github.com/pingcap/tidb/br/pkg/redact" "github.com/stretchr/testify/require" - "go.uber.org/goleak" ) func TestRedact(t *testing.T) { - defer goleak.VerifyNone(t) - redacted, secret := "?", "secret" redact.InitRedact(false) diff --git a/br/pkg/restore/BUILD.bazel b/br/pkg/restore/BUILD.bazel index 02b2fb047063d..322ff3c6eed5c 100644 --- a/br/pkg/restore/BUILD.bazel +++ b/br/pkg/restore/BUILD.bazel @@ -48,7 +48,7 @@ go_library( "//br/pkg/utils/iter", "//br/pkg/utils/storewatch", "//br/pkg/version", - "//pkg/config", + "//pkg/bindinfo", "//pkg/ddl", "//pkg/ddl/util", "//pkg/domain", @@ -64,6 +64,7 @@ go_library( "//pkg/util", "//pkg/util/codec", "//pkg/util/collate", + "//pkg/util/engine", "//pkg/util/hack", "//pkg/util/mathutil", "//pkg/util/sqlexec", @@ -99,6 +100,7 @@ go_library( "@org_golang_google_grpc//credentials/insecure", "@org_golang_google_grpc//keepalive", "@org_golang_google_grpc//status", + "@org_golang_x_exp//maps", "@org_golang_x_sync//errgroup", "@org_uber_go_multierr//:multierr", "@org_uber_go_zap//:zap", @@ -124,7 +126,6 @@ go_test( "search_test.go", "split_test.go", "stream_metas_test.go", - "systable_restore_test.go", "util_test.go", ], embed = [":restore"], @@ -161,6 +162,7 @@ go_test( "//pkg/testkit/testsetup", "//pkg/types", "//pkg/util/codec", + "//pkg/util/intest", "//pkg/util/table-filter", "@com_github_fsouza_fake_gcs_server//fakestorage", "@com_github_golang_protobuf//proto", @@ -180,6 +182,7 @@ go_test( "@com_github_tikv_client_go_v2//rawkv", "@com_github_tikv_client_go_v2//testutils", "@com_github_tikv_pd_client//:client", + "@com_github_tikv_pd_client//http", "@org_golang_google_grpc//codes", "@org_golang_google_grpc//keepalive", "@org_golang_google_grpc//status", diff --git a/br/pkg/restore/client.go b/br/pkg/restore/client.go index 7f47605c3b7e5..1a9bdfd9af4e9 100644 --- a/br/pkg/restore/client.go +++ b/br/pkg/restore/client.go @@ -27,6 +27,7 @@ import ( "github.com/pingcap/log" "github.com/pingcap/tidb/br/pkg/checkpoint" "github.com/pingcap/tidb/br/pkg/checksum" + "github.com/pingcap/tidb/br/pkg/conn" "github.com/pingcap/tidb/br/pkg/conn/util" berrors "github.com/pingcap/tidb/br/pkg/errors" "github.com/pingcap/tidb/br/pkg/glue" @@ -45,7 +46,6 @@ import ( "github.com/pingcap/tidb/br/pkg/utils" "github.com/pingcap/tidb/br/pkg/utils/iter" "github.com/pingcap/tidb/br/pkg/version" - "github.com/pingcap/tidb/pkg/config" ddlutil "github.com/pingcap/tidb/pkg/ddl/util" "github.com/pingcap/tidb/pkg/domain" "github.com/pingcap/tidb/pkg/domain/infosync" @@ -58,6 +58,7 @@ import ( "github.com/pingcap/tidb/pkg/tablecodec" "github.com/pingcap/tidb/pkg/util/codec" "github.com/pingcap/tidb/pkg/util/collate" + "github.com/pingcap/tidb/pkg/util/engine" "github.com/pingcap/tidb/pkg/util/sqlexec" filter "github.com/pingcap/tidb/pkg/util/table-filter" "github.com/tikv/client-go/v2/oracle" @@ -87,9 +88,22 @@ const ( MetaKVBatchSize = 64 * 1024 * 1024 ) +// tables in this map is restored when fullClusterRestore=true +var sysPrivilegeTableMap = map[string]string{ + "user": "(user = '%s' and host = '%%')", // since v1.0.0 + "db": "(user = '%s' and host = '%%')", // since v1.0.0 + "tables_priv": "(user = '%s' and host = '%%')", // since v1.0.0 + "columns_priv": "(user = '%s' and host = '%%')", // since v1.0.0 + "default_roles": "(user = '%s' and host = '%%')", // since v3.0.0 + "role_edges": "(to_user = '%s' and to_host = '%%')", // since v3.0.0 + "global_priv": "(user = '%s' and host = '%%')", // since v3.0.8 + "global_grants": "(user = '%s' and host = '%%')", // since v5.0.3 +} + // Client sends requests to restore files. type Client struct { pdClient pd.Client + pdHTTPClient pdhttp.Client toolClient split.SplitClient fileImporter FileImporter rawKVClient *RawKVBatchClient @@ -97,8 +111,9 @@ type Client struct { tlsConf *tls.Config keepaliveConf keepalive.ClientParameters - databases map[string]*utils.Database - ddlJobs []*model.Job + concurrencyPerStore uint + databases map[string]*metautil.Database + ddlJobs []*model.Job // store tables need to rebase info like auto id and random id and so on after create table rebasedTablesMap map[UniqueTableName]bool @@ -119,10 +134,12 @@ type Client struct { dbPool []*DB rateLimit uint64 isOnline bool + granularity string noSchema bool hasSpeedLimited bool restoreStores []uint64 + storeCount int cipher *backuppb.CipherInfo switchModeInterval time.Duration @@ -170,8 +187,8 @@ type Client struct { // this feature is controlled by flag with-sys-table fullClusterRestore bool // the query to insert rows into table `gc_delete_range`, lack of ts. - deleteRangeQuery []string - deleteRangeQueryCh chan string + deleteRangeQuery []*stream.PreDelRangeQuery + deleteRangeQueryCh chan *stream.PreDelRangeQuery deleteRangeQueryWaitGroup sync.WaitGroup // see RestoreCommonConfig.WithSysTable @@ -194,18 +211,20 @@ type Client struct { // NewRestoreClient returns a new RestoreClient. func NewRestoreClient( pdClient pd.Client, + pdHTTPCli pdhttp.Client, tlsConf *tls.Config, keepaliveConf keepalive.ClientParameters, isRawKv bool, ) *Client { return &Client{ pdClient: pdClient, - toolClient: split.NewSplitClient(pdClient, tlsConf, isRawKv), + pdHTTPClient: pdHTTPCli, + toolClient: split.NewSplitClient(pdClient, pdHTTPCli, tlsConf, isRawKv), tlsConf: tlsConf, keepaliveConf: keepaliveConf, switchCh: make(chan struct{}), - deleteRangeQuery: make([]string, 0), - deleteRangeQueryCh: make(chan string, 10), + deleteRangeQuery: make([]*stream.PreDelRangeQuery, 0), + deleteRangeQueryCh: make(chan *stream.PreDelRangeQuery, 10), } } @@ -231,24 +250,22 @@ func (rc *Client) Init(g glue.Glue, store kv.Storage) error { rc.backupMeta = new(backuppb.BackupMeta) } - // Only in binary we can use multi-thread sessions to create tables. - // so use OwnStorage() to tell whether we are use binary or SQL. - if g.OwnsStorage() { - // Maybe allow user modify the DDL concurrency isn't necessary, - // because executing DDL is really I/O bound (or, algorithm bound?), - // and we cost most of time at waiting DDL jobs be enqueued. - // So these jobs won't be faster or slower when machine become faster or slower, - // hence make it a fixed value would be fine. - rc.dbPool, err = makeDBPool(defaultDDLConcurrency, func() (*DB, error) { - db, _, err := NewDB(g, store, rc.policyMode) - return db, err - }) - if err != nil { - log.Warn("create session pool failed, we will send DDLs only by created sessions", - zap.Error(err), - zap.Int("sessionCount", len(rc.dbPool)), - ) - } + // There are different ways to create session between in binary and in SQL. + // + // Maybe allow user modify the DDL concurrency isn't necessary, + // because executing DDL is really I/O bound (or, algorithm bound?), + // and we cost most of time at waiting DDL jobs be enqueued. + // So these jobs won't be faster or slower when machine become faster or slower, + // hence make it a fixed value would be fine. + rc.dbPool, err = makeDBPool(defaultDDLConcurrency, func() (*DB, error) { + db, _, err := NewDB(g, store, rc.policyMode) + return db, err + }) + if err != nil { + log.Warn("create session pool failed, we will send DDLs only by created sessions", + zap.Error(err), + zap.Int("sessionCount", len(rc.dbPool)), + ) } return errors.Trace(err) } @@ -457,6 +474,10 @@ func (rc *Client) GetDomain() *domain.Domain { return rc.dom } +func (rc *Client) GetStoreCount() int { + return rc.storeCount +} + // GetPDClient returns a pd client. func (rc *Client) GetPDClient() pd.Client { return rc.pdClient @@ -488,12 +509,21 @@ func (rc *Client) GetRewriteMode() RewriteMode { return rc.rewriteMode } -// Close a client. -func (rc *Client) Close() { +func (rc *Client) closeConn() { // rc.db can be nil in raw kv mode. if rc.db != nil { rc.db.Close() } + for _, db := range rc.dbPool { + db.Close() + } +} + +// Close a client. +func (rc *Client) Close() { + // close the connection, and it must be succeed when in SQL mode. + rc.closeConn() + if rc.rawKVClient != nil { rc.rawKVClient.Close() } @@ -514,10 +544,29 @@ func (rc *Client) SetStorage(ctx context.Context, backend *backuppb.StorageBacke return nil } -func (rc *Client) InitClients(backend *backuppb.StorageBackend, isRawKvMode bool, isTxnKvMode bool) { - metaClient := split.NewSplitClient(rc.pdClient, rc.tlsConf, isRawKvMode) +func (rc *Client) InitClients(ctx context.Context, backend *backuppb.StorageBackend, isRawKvMode bool, isTxnKvMode bool) { + storeWorkerPoolMap := make(map[uint64]chan struct{}) + stores, err := conn.GetAllTiKVStoresWithRetry(ctx, rc.pdClient, util.SkipTiFlash) + if err != nil { + log.Fatal("failed to get stores", zap.Error(err)) + } + concurrencyPerStore := rc.GetConcurrencyPerStore() + useTokenBucket := false + if rc.granularity == string(CoarseGrained) { + // coarse-grained make split & scatter pipeline fast enough + // so we can use a new token bucket way to speed up download. + // ToDo remove it when token bucket is stable enough. + log.Info("use token bucket to control download and ingest flow") + useTokenBucket = true + for _, store := range stores { + ch := utils.BuildWorkerTokenChannel(concurrencyPerStore) + storeWorkerPoolMap[store.Id] = ch + } + } + + metaClient := split.NewSplitClient(rc.pdClient, rc.pdHTTPClient, rc.tlsConf, isRawKvMode) importCli := NewImportClient(metaClient, rc.tlsConf, rc.keepaliveConf) - rc.fileImporter = NewFileImporter(metaClient, importCli, backend, isRawKvMode, isTxnKvMode, rc.rewriteMode) + rc.fileImporter = NewFileImporter(metaClient, importCli, backend, isRawKvMode, isTxnKvMode, storeWorkerPoolMap, rc.rewriteMode, concurrencyPerStore, useTokenBucket) } func (rc *Client) SetRawKVClient(c *RawKVBatchClient) { @@ -535,7 +584,7 @@ func (rc *Client) InitBackupMeta( backend *backuppb.StorageBackend, reader *metautil.MetaReader) error { if rc.needLoadSchemas(backupMeta) { - databases, err := utils.LoadBackupTables(c, reader) + databases, err := metautil.LoadBackupTables(c, reader) if err != nil { return errors.Trace(err) } @@ -557,7 +606,7 @@ func (rc *Client) InitBackupMeta( } rc.backupMeta = backupMeta - rc.InitClients(backend, backupMeta.IsRawKv, backupMeta.IsTxnKv) + rc.InitClients(c, backend, backupMeta.IsRawKv, backupMeta.IsTxnKv) log.Info("load backupmeta", zap.Int("databases", len(rc.databases)), zap.Int("jobs", len(rc.ddlJobs))) return rc.fileImporter.CheckMultiIngestSupport(c, rc.pdClient) } @@ -625,15 +674,42 @@ func (rc *Client) GetFilesInRawRange(startKey []byte, endKey []byte, cf string) // SetConcurrency sets the concurrency of dbs tables files. func (rc *Client) SetConcurrency(c uint) { - log.Info("new worker pool", zap.Uint("currency-count", c)) + log.Info("download worker pool", zap.Uint("size", c)) rc.workerPool = utils.NewWorkerPool(c, "file") } +// SetConcurrencyPerStore sets the concurrency of download files for each store. +func (rc *Client) SetConcurrencyPerStore(c uint) { + log.Info("per-store download worker pool", zap.Uint("size", c)) + rc.concurrencyPerStore = c +} + +func (rc *Client) GetTotalDownloadConcurrency() uint { + if rc.storeCount <= 0 { + log.Fatal("uninitialize store count", zap.Int("storeCount", rc.storeCount)) + } + return rc.concurrencyPerStore * uint(rc.storeCount) +} + +func (rc *Client) GetConcurrencyPerStore() uint { + return rc.concurrencyPerStore +} + // EnableOnline sets the mode of restore to online. func (rc *Client) EnableOnline() { rc.isOnline = true } +// SetGranularity sets the ganularity of restore pipeline. +func (rc *Client) SetGranularity(g string) { + rc.granularity = g +} + +// GetGranularity sets the ganularity of restore pipeline. +func (rc *Client) GetGranularity() string { + return rc.granularity +} + // GetTLSConfig returns the tls config. func (rc *Client) GetTLSConfig() *tls.Config { return rc.tlsConf @@ -702,8 +778,8 @@ func (rc *Client) GetPlacementRules(ctx context.Context, pdAddrs []string) ([]pd } // GetDatabases returns all databases. -func (rc *Client) GetDatabases() []*utils.Database { - dbs := make([]*utils.Database, 0, len(rc.databases)) +func (rc *Client) GetDatabases() []*metautil.Database { + dbs := make([]*metautil.Database, 0, len(rc.databases)) for _, db := range rc.databases { dbs = append(dbs, db) } @@ -711,7 +787,7 @@ func (rc *Client) GetDatabases() []*utils.Database { } // GetDatabase returns a database by name. -func (rc *Client) GetDatabase(name string) *utils.Database { +func (rc *Client) GetDatabase(name string) *metautil.Database { return rc.databases[name] } @@ -1215,7 +1291,7 @@ func MockCallSetSpeedLimit(ctx context.Context, fakeImportClient ImporterClient, rc.SetRateLimit(42) rc.SetConcurrency(concurrency) rc.hasSpeedLimited = false - rc.fileImporter = NewFileImporter(nil, fakeImportClient, nil, false, false, rc.rewriteMode) + rc.fileImporter = NewFileImporter(nil, fakeImportClient, nil, false, false, nil, rc.rewriteMode, 128, false) return rc.setSpeedLimit(ctx, rc.rateLimit) } @@ -1322,7 +1398,7 @@ func (rc *Client) WrapLogFilesIterWithSplitHelper(logIter LogIter, rules map[int execCtx := se.GetSessionCtx().(sqlexec.RestrictedSQLExecutor) splitSize, splitKeys := utils.GetRegionSplitInfo(execCtx) log.Info("get split threshold from tikv config", zap.Uint64("split-size", splitSize), zap.Int64("split-keys", splitKeys)) - client := split.NewSplitClient(rc.GetPDClient(), rc.GetTLSConfig(), false) + client := split.NewSplitClient(rc.GetPDClient(), rc.pdHTTPClient, rc.GetTLSConfig(), false) return NewLogFilesIterWithSplitHelper(logIter, rules, client, splitSize, splitKeys), nil } @@ -1418,7 +1494,7 @@ LOOPFORTABLE: // breaking here directly is also a reasonable behavior. break LOOPFORTABLE } - rc.workerPool.ApplyOnErrorGroup(eg, func() error { + restoreFn := func() error { filesGroups := getGroupFiles(filesReplica, rc.fileImporter.supportMultiIngest) for _, filesGroup := range filesGroups { if importErr := func(fs []*backuppb.File) error { @@ -1444,7 +1520,15 @@ LOOPFORTABLE: } } return nil - }) + } + if rc.granularity == string(CoarseGrained) { + eg.Go(restoreFn) + } else { + // if we are not use coarse granularity which means + // we still pipeline split & scatter regions and import sst files + // just keep the consistency as before. + rc.workerPool.ApplyOnErrorGroup(eg, restoreFn) + } } } @@ -1753,10 +1837,17 @@ func (rc *Client) execChecksum( return nil } -func (rc *Client) GoUpdateMetaAndLoadStats(ctx context.Context, inCh <-chan *CreatedTable, errCh chan<- error) chan *CreatedTable { +func (rc *Client) GoUpdateMetaAndLoadStats( + ctx context.Context, + s storage.ExternalStorage, + cipher *backuppb.CipherInfo, + inCh <-chan *CreatedTable, + errCh chan<- error, + statsConcurrency uint, +) chan *CreatedTable { log.Info("Start to update meta then load stats") outCh := DefaultOutputTableChan() - workers := utils.NewWorkerPool(16, "UpdateStats") + workers := utils.NewWorkerPool(statsConcurrency, "UpdateStats") // The rc.db is not thread safe var updateMetaLock sync.Mutex @@ -1794,6 +1885,20 @@ func (rc *Client) GoUpdateMetaAndLoadStats(ctx context.Context, inCh <-chan *Cre zap.Stringer("table", oldTable.Info.Name), zap.Stringer("db", oldTable.DB.Name), zap.Duration("cost", time.Since(start))) + } else if oldTable.StatsFileIndexes != nil { + log.Info("start to load statistic data for each partition", + zap.Int64("old id", oldTable.Info.ID), + zap.Int64("new id", tbl.Table.ID), + ) + start := time.Now() + rewriteIDMap := getTableIDMap(tbl.Table, tbl.OldTable.Info) + if err := metautil.RestoreStats(ctx, s, cipher, rc.statsHandler, tbl.Table, oldTable.StatsFileIndexes, rewriteIDMap); err != nil { + log.Error("analyze table failed", zap.Any("table", oldTable.StatsFileIndexes), zap.Error(err)) + } + log.Info("restore statistic data done", + zap.Stringer("table", oldTable.Info.Name), + zap.Stringer("db", oldTable.DB.Name), + zap.Duration("cost", time.Since(start))) } return nil }, func() { @@ -1813,10 +1918,8 @@ func (rc *Client) GoWaitTiFlashReady(ctx context.Context, inCh <-chan *CreatedTa } tiFlashStores := make(map[int64]pdhttp.StoreInfo) for _, store := range tikvStats.Stores { - for _, l := range store.Store.Labels { - if l.Key == "engine" && l.Value == "tiflash" { - tiFlashStores[store.Store.ID] = store - } + if engine.IsTiFlashHTTPResp(&store.Store) { + tiFlashStores[store.Store.ID] = store } } go concurrentHandleTablesCh(ctx, inCh, outCh, errCh, workers, func(c context.Context, tbl *CreatedTable) error { @@ -1996,16 +2099,13 @@ const ( // LoadRestoreStores loads the stores used to restore data. func (rc *Client) LoadRestoreStores(ctx context.Context) error { - if !rc.isOnline { - return nil - } if span := opentracing.SpanFromContext(ctx); span != nil && span.Tracer() != nil { span1 := span.Tracer().StartSpan("Client.LoadRestoreStores", opentracing.ChildOf(span.Context())) defer span1.Finish() ctx = opentracing.ContextWithSpan(ctx, span1) } + stores, err := conn.GetAllTiKVStoresWithRetry(ctx, rc.pdClient, util.SkipTiFlash) - stores, err := rc.pdClient.GetAllStores(ctx) if err != nil { return errors.Trace(err) } @@ -2013,14 +2113,19 @@ func (rc *Client) LoadRestoreStores(ctx context.Context) error { if s.GetState() != metapb.StoreState_Up { continue } - for _, l := range s.GetLabels() { - if l.GetKey() == restoreLabelKey && l.GetValue() == restoreLabelValue { - rc.restoreStores = append(rc.restoreStores, s.GetId()) - break + rc.storeCount++ + if rc.isOnline { + for _, l := range s.GetLabels() { + if l.GetKey() == restoreLabelKey && l.GetValue() == restoreLabelValue { + rc.restoreStores = append(rc.restoreStores, s.GetId()) + break + } } } } - log.Info("load restore stores", zap.Uint64s("store-ids", rc.restoreStores)) + if rc.isOnline { + log.Info("load restore stores", zap.Uint64s("store-ids", rc.restoreStores)) + } return nil } @@ -2045,7 +2150,7 @@ func (rc *Client) SetupPlacementRules(ctx context.Context, tables []*model.Table } rule.Index = 100 rule.Override = true - rule.LabelConstraints = append(rule.LabelConstraints, pdtypes.LabelConstraint{ + rule.LabelConstraints = append(rule.LabelConstraints, pdhttp.LabelConstraint{ Key: restoreLabelKey, Op: "in", Values: []string{restoreLabelValue}, @@ -2675,7 +2780,7 @@ func initFullBackupTables( // read full backup databases to get map[table]table.Info reader := metautil.NewMetaReader(backupMeta, s, nil) - databases, err := utils.LoadBackupTables(ctx, reader) + databases, err := metautil.LoadBackupTables(ctx, reader) if err != nil { return nil, errors.Trace(err) } @@ -2797,7 +2902,7 @@ func (rc *Client) InitSchemasReplaceForDDL( dbReplace.TableMap[t.Info.ID] = &stream.TableReplace{ Name: newTableInfo.Name.O, TableID: newTableInfo.ID, - PartitionMap: getTableIDMap(newTableInfo, t.Info), + PartitionMap: getPartitionIDMap(newTableInfo, t.Info), IndexMap: getIndexIDMap(newTableInfo, t.Info), } } @@ -2824,7 +2929,7 @@ func (rc *Client) InitSchemasReplaceForDDL( rp := stream.NewSchemasReplace( dbReplaces, needConstructIdMap, cfg.TiFlashRecorder, rc.currentTS, cfg.TableFilter, rc.GenGlobalID, rc.GenGlobalIDs, - rc.InsertDeleteRangeForTable, rc.InsertDeleteRangeForIndex) + rc.RecordDeleteRange) return rp, nil } @@ -3428,66 +3533,8 @@ NEXTSQL: return nil } -const ( - insertDeleteRangeSQLPrefix = `INSERT IGNORE INTO mysql.gc_delete_range VALUES ` - insertDeleteRangeSQLValue = "(%d, %d, '%s', '%s', %%[1]d)" - - batchInsertDeleteRangeSize = 256 -) - -// InsertDeleteRangeForTable generates query to insert table delete job into table `gc_delete_range`. -func (rc *Client) InsertDeleteRangeForTable(jobID int64, tableIDs []int64) { - var elementID int64 = 1 - var tableID int64 - for i := 0; i < len(tableIDs); i += batchInsertDeleteRangeSize { - batchEnd := len(tableIDs) - if batchEnd > i+batchInsertDeleteRangeSize { - batchEnd = i + batchInsertDeleteRangeSize - } - - var buf strings.Builder - buf.WriteString(insertDeleteRangeSQLPrefix) - for j := i; j < batchEnd; j++ { - tableID = tableIDs[j] - startKey := tablecodec.EncodeTablePrefix(tableID) - endKey := tablecodec.EncodeTablePrefix(tableID + 1) - startKeyEncoded := hex.EncodeToString(startKey) - endKeyEncoded := hex.EncodeToString(endKey) - buf.WriteString(fmt.Sprintf(insertDeleteRangeSQLValue, jobID, elementID, startKeyEncoded, endKeyEncoded)) - if j != batchEnd-1 { - buf.WriteString(",") - } - elementID += 1 - } - rc.deleteRangeQueryCh <- buf.String() - } -} - -// InsertDeleteRangeForIndex generates query to insert index delete job into table `gc_delete_range`. -func (rc *Client) InsertDeleteRangeForIndex(jobID int64, elementID *int64, tableID int64, indexIDs []int64) { - var indexID int64 - for i := 0; i < len(indexIDs); i += batchInsertDeleteRangeSize { - batchEnd := len(indexIDs) - if batchEnd > i+batchInsertDeleteRangeSize { - batchEnd = i + batchInsertDeleteRangeSize - } - - var buf strings.Builder - buf.WriteString(insertDeleteRangeSQLPrefix) - for j := i; j < batchEnd; j++ { - indexID = indexIDs[j] - startKey := tablecodec.EncodeTableIndexPrefix(tableID, indexID) - endKey := tablecodec.EncodeTableIndexPrefix(tableID, indexID+1) - startKeyEncoded := hex.EncodeToString(startKey) - endKeyEncoded := hex.EncodeToString(endKey) - buf.WriteString(fmt.Sprintf(insertDeleteRangeSQLValue, jobID, *elementID, startKeyEncoded, endKeyEncoded)) - if j != batchEnd-1 { - buf.WriteString(",") - } - *elementID += 1 - } - rc.deleteRangeQueryCh <- buf.String() - } +func (rc *Client) RecordDeleteRange(sql *stream.PreDelRangeQuery) { + rc.deleteRangeQueryCh <- sql } // use channel to save the delete-range query to make it thread-safety. @@ -3518,16 +3565,41 @@ func (rc *Client) InsertGCRows(ctx context.Context) error { if err != nil { return errors.Trace(err) } + jobIDMap := make(map[int64]int64) for _, query := range rc.deleteRangeQuery { - if err := rc.db.se.ExecuteInternal(ctx, fmt.Sprintf(query, ts)); err != nil { - return errors.Trace(err) + paramsList := make([]interface{}, 0, len(query.ParamsList)*5) + for _, params := range query.ParamsList { + newJobID, exists := jobIDMap[params.JobID] + if !exists { + newJobID, err = rc.GenGlobalID(ctx) + if err != nil { + return errors.Trace(err) + } + jobIDMap[params.JobID] = newJobID + } + log.Info("insert into the delete range", + zap.Int64("jobID", newJobID), + zap.Int64("elemID", params.ElemID), + zap.String("startKey", params.StartKey), + zap.String("endKey", params.EndKey), + zap.Uint64("ts", ts)) + // (job_id, elem_id, start_key, end_key, ts) + paramsList = append(paramsList, newJobID, params.ElemID, params.StartKey, params.EndKey, ts) + } + if len(paramsList) > 0 { + // trim the ',' behind the query.Sql if exists + // that's when the rewrite rule of the last table id is not exist + sql := strings.TrimSuffix(query.Sql, ",") + if err := rc.db.se.ExecuteInternal(ctx, sql, paramsList...); err != nil { + return errors.Trace(err) + } } } return nil } // only for unit test -func (rc *Client) GetGCRows() []string { +func (rc *Client) GetGCRows() []*stream.PreDelRangeQuery { close(rc.deleteRangeQueryCh) rc.deleteRangeQueryWaitGroup.Wait() return rc.deleteRangeQuery @@ -3575,11 +3647,6 @@ func (rc *Client) InitFullClusterRestore(explicitFilter bool) { rc.fullClusterRestore = !explicitFilter && rc.IsFull() log.Info("full cluster restore", zap.Bool("value", rc.fullClusterRestore)) - - if rc.fullClusterRestore { - // have to skip grant table, in order to NotifyUpdatePrivilege - config.GetGlobalConfig().Security.SkipGrantTable = true - } } func (rc *Client) IsFullClusterRestore() bool { @@ -3692,7 +3759,7 @@ func (rc *Client) RangeFilterFromIngestRecorder(recorder *ingestrec.IngestRecord } // MockClient create a fake client used to test. -func MockClient(dbs map[string]*utils.Database) *Client { +func MockClient(dbs map[string]*metautil.Database) *Client { return &Client{databases: dbs} } @@ -3705,43 +3772,43 @@ func CheckNewCollationEnable( g glue.Glue, storage kv.Storage, CheckRequirements bool, -) error { +) (bool, error) { + se, err := g.CreateSession(storage) + if err != nil { + return false, errors.Trace(err) + } + + newCollationEnable, err := se.GetGlobalVariable(utils.GetTidbNewCollationEnabled()) + if err != nil { + return false, errors.Trace(err) + } + // collate.newCollationEnabled is set to 1 when the collate package is initialized, + // so we need to modify this value according to the config of the cluster + // before using the collate package. + enabled := newCollationEnable == "True" + // modify collate.newCollationEnabled according to the config of the cluster + collate.SetNewCollationEnabledForTest(enabled) + log.Info(fmt.Sprintf("set %s", utils.TidbNewCollationEnabled), zap.Bool("new_collation_enabled", enabled)) + if backupNewCollationEnable == "" { if CheckRequirements { - return errors.Annotatef(berrors.ErrUnknown, + return enabled, errors.Annotatef(berrors.ErrUnknown, "the value '%s' not found in backupmeta. "+ "you can use \"SELECT VARIABLE_VALUE FROM mysql.tidb WHERE VARIABLE_NAME='%s';\" to manually check the config. "+ "if you ensure the value '%s' in backup cluster is as same as restore cluster, use --check-requirements=false to skip this check", utils.TidbNewCollationEnabled, utils.TidbNewCollationEnabled, utils.TidbNewCollationEnabled) } log.Warn(fmt.Sprintf("the config '%s' is not in backupmeta", utils.TidbNewCollationEnabled)) - return nil - } - - se, err := g.CreateSession(storage) - if err != nil { - return errors.Trace(err) - } - - newCollationEnable, err := se.GetGlobalVariable(utils.GetTidbNewCollationEnabled()) - if err != nil { - return errors.Trace(err) + return enabled, nil } if !strings.EqualFold(backupNewCollationEnable, newCollationEnable) { - return errors.Annotatef(berrors.ErrUnknown, + return enabled, errors.Annotatef(berrors.ErrUnknown, "the config '%s' not match, upstream:%v, downstream: %v", utils.TidbNewCollationEnabled, backupNewCollationEnable, newCollationEnable) } - // collate.newCollationEnabled is set to 1 when the collate package is initialized, - // so we need to modify this value according to the config of the cluster - // before using the collate package. - enabled := newCollationEnable == "True" - // modify collate.newCollationEnabled according to the config of the cluster - collate.SetNewCollationEnabledForTest(enabled) - log.Info(fmt.Sprintf("set %s", utils.TidbNewCollationEnabled), zap.Bool("new_collation_enabled", enabled)) - return nil + return enabled, nil } type waitTiFlashBackoffer struct { diff --git a/br/pkg/restore/client_test.go b/br/pkg/restore/client_test.go index eeec487895fe7..4407a90d07b35 100644 --- a/br/pkg/restore/client_test.go +++ b/br/pkg/restore/client_test.go @@ -47,7 +47,7 @@ var defaultKeepaliveCfg = keepalive.ClientParameters{ func TestCreateTables(t *testing.T) { m := mc g := gluetidb.New() - client := restore.NewRestoreClient(m.PDClient, nil, defaultKeepaliveCfg, false) + client := restore.NewRestoreClient(m.PDClient, m.PDHTTPCli, nil, defaultKeepaliveCfg, false) err := client.Init(g, m.Storage) require.NoError(t, err) @@ -106,7 +106,7 @@ func TestCreateTables(t *testing.T) { func TestIsOnline(t *testing.T) { m := mc g := gluetidb.New() - client := restore.NewRestoreClient(m.PDClient, nil, defaultKeepaliveCfg, false) + client := restore.NewRestoreClient(m.PDClient, m.PDHTTPCli, nil, defaultKeepaliveCfg, false) err := client.Init(g, m.Storage) require.NoError(t, err) @@ -130,7 +130,7 @@ func TestCheckTargetClusterFresh(t *testing.T) { defer cluster.Stop() g := gluetidb.New() - client := restore.NewRestoreClient(cluster.PDClient, nil, defaultKeepaliveCfg, false) + client := restore.NewRestoreClient(cluster.PDClient, cluster.PDHTTPCli, nil, defaultKeepaliveCfg, false) err := client.Init(g, cluster.Storage) require.NoError(t, err) @@ -147,7 +147,7 @@ func TestCheckTargetClusterFreshWithTable(t *testing.T) { defer cluster.Stop() g := gluetidb.New() - client := restore.NewRestoreClient(cluster.PDClient, nil, defaultKeepaliveCfg, false) + client := restore.NewRestoreClient(cluster.PDClient, cluster.PDHTTPCli, nil, defaultKeepaliveCfg, false) err := client.Init(g, cluster.Storage) require.NoError(t, err) @@ -182,7 +182,7 @@ func TestCheckTargetClusterFreshWithTable(t *testing.T) { func TestCheckSysTableCompatibility(t *testing.T) { cluster := mc g := gluetidb.New() - client := restore.NewRestoreClient(cluster.PDClient, nil, defaultKeepaliveCfg, false) + client := restore.NewRestoreClient(cluster.PDClient, cluster.PDHTTPCli, nil, defaultKeepaliveCfg, false) err := client.Init(g, cluster.Storage) require.NoError(t, err) @@ -258,7 +258,7 @@ func TestCheckSysTableCompatibility(t *testing.T) { func TestInitFullClusterRestore(t *testing.T) { cluster := mc g := gluetidb.New() - client := restore.NewRestoreClient(cluster.PDClient, nil, defaultKeepaliveCfg, false) + client := restore.NewRestoreClient(cluster.PDClient, cluster.PDHTTPCli, nil, defaultKeepaliveCfg, false) err := client.Init(g, cluster.Storage) require.NoError(t, err) @@ -283,7 +283,7 @@ func TestInitFullClusterRestore(t *testing.T) { func TestPreCheckTableClusterIndex(t *testing.T) { m := mc g := gluetidb.New() - client := restore.NewRestoreClient(m.PDClient, nil, defaultKeepaliveCfg, false) + client := restore.NewRestoreClient(m.PDClient, m.PDHTTPCli, nil, defaultKeepaliveCfg, false) err := client.Init(g, m.Storage) require.NoError(t, err) @@ -372,7 +372,7 @@ func TestGetTSWithRetry(t *testing.T) { t.Run("PD leader is healthy:", func(t *testing.T) { retryTimes := -1000 pDClient := fakePDClient{notLeader: false, retryTimes: &retryTimes} - client := restore.NewRestoreClient(pDClient, nil, defaultKeepaliveCfg, false) + client := restore.NewRestoreClient(pDClient, nil, nil, defaultKeepaliveCfg, false) _, err := client.GetTSWithRetry(context.Background()) require.NoError(t, err) }) @@ -380,7 +380,7 @@ func TestGetTSWithRetry(t *testing.T) { t.Run("PD leader failure:", func(t *testing.T) { retryTimes := -1000 pDClient := fakePDClient{notLeader: true, retryTimes: &retryTimes} - client := restore.NewRestoreClient(pDClient, nil, defaultKeepaliveCfg, false) + client := restore.NewRestoreClient(pDClient, nil, nil, defaultKeepaliveCfg, false) _, err := client.GetTSWithRetry(context.Background()) require.Error(t, err) }) @@ -388,7 +388,7 @@ func TestGetTSWithRetry(t *testing.T) { t.Run("PD leader switch successfully", func(t *testing.T) { retryTimes := 0 pDClient := fakePDClient{notLeader: true, retryTimes: &retryTimes} - client := restore.NewRestoreClient(pDClient, nil, defaultKeepaliveCfg, false) + client := restore.NewRestoreClient(pDClient, nil, nil, defaultKeepaliveCfg, false) _, err := client.GetTSWithRetry(context.Background()) require.NoError(t, err) }) @@ -420,7 +420,7 @@ func TestPreCheckTableTiFlashReplicas(t *testing.T) { g := gluetidb.New() client := restore.NewRestoreClient(fakePDClient{ stores: mockStores, - }, nil, defaultKeepaliveCfg, false) + }, nil, nil, defaultKeepaliveCfg, false) err := client.Init(g, m.Storage) require.NoError(t, err) @@ -544,7 +544,7 @@ func TestSetSpeedLimit(t *testing.T) { // 1. The cost of concurrent communication is expected to be less than the cost of serial communication. client := restore.NewRestoreClient(fakePDClient{ stores: mockStores, - }, nil, defaultKeepaliveCfg, false) + }, nil, nil, defaultKeepaliveCfg, false) ctx := context.Background() recordStores = NewRecordStores() @@ -570,7 +570,7 @@ func TestSetSpeedLimit(t *testing.T) { mockStores[5].Id = SET_SPEED_LIMIT_ERROR // setting a fault store client = restore.NewRestoreClient(fakePDClient{ stores: mockStores, - }, nil, defaultKeepaliveCfg, false) + }, nil, nil, defaultKeepaliveCfg, false) // Concurrency needs to be less than the number of stores err = restore.MockCallSetSpeedLimit(ctx, FakeImporterClient{}, client, 2) @@ -586,6 +586,43 @@ func TestSetSpeedLimit(t *testing.T) { } } +var deleteRangeQueryList = []*stream.PreDelRangeQuery{ + { + Sql: "INSERT IGNORE INTO mysql.gc_delete_range VALUES (%?, %?, %?, %?, %?), (%?, %?, %?, %?, %?)", + ParamsList: []stream.DelRangeParams{ + { + JobID: 1, + ElemID: 1, + StartKey: "a", + EndKey: "b", + }, + { + JobID: 1, + ElemID: 2, + StartKey: "b", + EndKey: "c", + }, + }, + }, + { + // When the last table id has no rewrite rule + Sql: "INSERT IGNORE INTO mysql.gc_delete_range VALUES (%?, %?, %?, %?, %?),", + ParamsList: []stream.DelRangeParams{ + { + JobID: 2, + ElemID: 1, + StartKey: "a", + EndKey: "b", + }, + }, + }, + { + // When all the tables have no rewrite rule + Sql: "INSERT IGNORE INTO mysql.gc_delete_range VALUES ", + ParamsList: nil, + }, +} + func TestDeleteRangeQuery(t *testing.T) { ctx := context.Background() m := mc @@ -613,24 +650,67 @@ func TestDeleteRangeQuery(t *testing.T) { g := gluetidb.New() client := restore.NewRestoreClient(fakePDClient{ stores: mockStores, - }, nil, defaultKeepaliveCfg, false) + }, nil, nil, defaultKeepaliveCfg, false) err := client.Init(g, m.Storage) require.NoError(t, err) client.RunGCRowsLoader(ctx) - client.InsertDeleteRangeForTable(2, []int64{3}) - client.InsertDeleteRangeForTable(4, []int64{5, 6}) + for _, query := range deleteRangeQueryList { + client.RecordDeleteRange(query) + } + querys := client.GetGCRows() + require.Equal(t, len(querys), len(deleteRangeQueryList)) + for i, query := range querys { + expected_query := deleteRangeQueryList[i] + require.Equal(t, expected_query.Sql, query.Sql) + require.Equal(t, len(expected_query.ParamsList), len(query.ParamsList)) + for j := range expected_query.ParamsList { + require.Equal(t, expected_query.ParamsList[j], query.ParamsList[j]) + } + } +} + +func TestDeleteRangeQueryExec(t *testing.T) { + ctx := context.Background() + m := mc + mockStores := []*metapb.Store{ + { + Id: 1, + Labels: []*metapb.StoreLabel{ + { + Key: "engine", + Value: "tiflash", + }, + }, + }, + { + Id: 2, + Labels: []*metapb.StoreLabel{ + { + Key: "engine", + Value: "tiflash", + }, + }, + }, + } + + g := gluetidb.New() + retryCnt := 1 + client := restore.NewRestoreClient(fakePDClient{ + stores: mockStores, + retryTimes: &retryCnt, + }, nil, nil, defaultKeepaliveCfg, false) + err := client.Init(g, m.Storage) + require.NoError(t, err) + + client.RunGCRowsLoader(ctx) - elementID := int64(1) - client.InsertDeleteRangeForIndex(7, &elementID, 8, []int64{1}) - client.InsertDeleteRangeForIndex(9, &elementID, 10, []int64{1, 2}) + for _, query := range deleteRangeQueryList { + client.RecordDeleteRange(query) + } - querys := client.GetGCRows() - require.Equal(t, querys[0], "INSERT IGNORE INTO mysql.gc_delete_range VALUES (2, 1, '748000000000000003', '748000000000000004', %[1]d)") - require.Equal(t, querys[1], "INSERT IGNORE INTO mysql.gc_delete_range VALUES (4, 1, '748000000000000005', '748000000000000006', %[1]d),(4, 2, '748000000000000006', '748000000000000007', %[1]d)") - require.Equal(t, querys[2], "INSERT IGNORE INTO mysql.gc_delete_range VALUES (7, 1, '7480000000000000085f698000000000000001', '7480000000000000085f698000000000000002', %[1]d)") - require.Equal(t, querys[3], "INSERT IGNORE INTO mysql.gc_delete_range VALUES (9, 2, '74800000000000000a5f698000000000000001', '74800000000000000a5f698000000000000002', %[1]d),(9, 3, '74800000000000000a5f698000000000000002', '74800000000000000a5f698000000000000003', %[1]d)") + require.NoError(t, client.InsertGCRows(ctx)) } func MockEmptySchemasReplace() *stream.SchemasReplace { @@ -644,7 +724,6 @@ func MockEmptySchemasReplace() *stream.SchemasReplace { nil, nil, nil, - nil, ) } @@ -1872,19 +1951,25 @@ func TestCheckNewCollationEnable(t *testing.T) { CheckRequirements: true, isErr: true, }, + { + backupMeta: &backuppb.BackupMeta{NewCollationsEnabled: ""}, + newCollationEnableInCluster: "False", + CheckRequirements: false, + isErr: false, + }, } for i, ca := range caseList { g := &gluetidb.MockGlue{ GlobalVars: map[string]string{"new_collation_enabled": ca.newCollationEnableInCluster}, } - err := restore.CheckNewCollationEnable(ca.backupMeta.GetNewCollationsEnabled(), g, nil, ca.CheckRequirements) - + enabled, err := restore.CheckNewCollationEnable(ca.backupMeta.GetNewCollationsEnabled(), g, nil, ca.CheckRequirements) t.Logf("[%d] Got Error: %v\n", i, err) if ca.isErr { require.Error(t, err) } else { require.NoError(t, err) } + require.Equal(t, ca.newCollationEnableInCluster == "True", enabled) } } diff --git a/br/pkg/restore/data.go b/br/pkg/restore/data.go index 48f015d80a85e..535ed7e4484f0 100644 --- a/br/pkg/restore/data.go +++ b/br/pkg/restore/data.go @@ -139,10 +139,6 @@ func doRecoveryData(ctx context.Context, resolveTS uint64, allStores []*metapb.S return totalRegions, recoveryError{error: err, atStage: StageRecovering} } - if err := recovery.WaitApply(ctx); err != nil { - return totalRegions, recoveryError{error: err, atStage: StageRecovering} - } - if err := recovery.PrepareFlashbackToVersion(ctx, resolveTS, restoreTS-1); err != nil { return totalRegions, recoveryError{error: err, atStage: StageFlashback} } @@ -227,7 +223,7 @@ func (recovery *Recovery) ReadRegionMeta(ctx context.Context) error { totalStores := len(recovery.allStores) workers := utils.NewWorkerPool(uint(min(totalStores, common.MaxStoreConcurrency)), "Collect Region Meta") // TODO: int overflow? - // TODO: optimize the ErroGroup when TiKV is panic + // TODO: optimize the ErrorGroup when TiKV is panic metaChan := make(chan StoreMeta, 1024) defer close(metaChan) @@ -398,42 +394,6 @@ func (recovery *Recovery) SpawnTiKVShutDownWatchers(ctx context.Context) { go mainLoop() } -// WaitApply send wait apply to all tikv ensure all region peer apply log into the last -func (recovery *Recovery) WaitApply(ctx context.Context) (err error) { - eg, ectx := errgroup.WithContext(ctx) - totalStores := len(recovery.allStores) - workers := utils.NewWorkerPool(uint(min(totalStores, common.MaxStoreConcurrency)), "wait apply") - - for _, store := range recovery.allStores { - if err := ectx.Err(); err != nil { - break - } - storeAddr := getStoreAddress(recovery.allStores, store.Id) - storeId := store.Id - - workers.ApplyOnErrorGroup(eg, func() error { - recoveryClient, conn, err := recovery.newRecoveryClient(ectx, storeAddr) - if err != nil { - return errors.Trace(err) - } - defer conn.Close() - log.Info("send wait apply to tikv", zap.String("tikv address", storeAddr), zap.Uint64("store id", storeId)) - req := &recovpb.WaitApplyRequest{StoreId: storeId} - _, err = recoveryClient.WaitApply(ectx, req) - if err != nil { - log.Error("wait apply failed", zap.Uint64("store id", storeId)) - return errors.Trace(err) - } - - recovery.progress.Inc() - log.Info("wait apply execution success", zap.Uint64("store id", storeId)) - return nil - }) - } - // Wait for all TiKV instances force leader and wait apply to last log. - return eg.Wait() -} - // prepare the region for flashback the data, the purpose is to stop region service, put region in flashback state func (recovery *Recovery) PrepareFlashbackToVersion(ctx context.Context, resolveTS uint64, startTS uint64) (err error) { retryState := utils.InitialRetryState(utils.FlashbackRetryTime, utils.FlashbackWaitInterval, utils.FlashbackMaxWaitInterval) diff --git a/br/pkg/restore/db_test.go b/br/pkg/restore/db_test.go index b6488ded728e6..d03ccb8ec55ac 100644 --- a/br/pkg/restore/db_test.go +++ b/br/pkg/restore/db_test.go @@ -415,3 +415,17 @@ func TestGetExistedUserDBs(t *testing.T) { dbs = restore.GetExistedUserDBs(dom) require.Equal(t, 2, len(dbs)) } + +// NOTICE: Once there is a new system table, BR needs to ensure that it is correctly classified: +// +// - IF it is an unrecoverable table, please add the table name into `unRecoverableTable`. +// - IF it is an system privilege table, please add the table name into `sysPrivilegeTableMap`. +// - IF it is an statistics table, please add the table name into `statsTables`. +// +// The above variables are in the file br/pkg/restore/systable_restore.go +func TestMonitorTheSystemTableIncremental(t *testing.T) { + s := createRestoreSchemaSuite(t) + tk := testkit.NewTestKit(t, s.mock.Storage) + ret := tk.MustQuery("SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'mysql'") + ret.Equal([][]interface{}{{55}}) +} diff --git a/br/pkg/restore/import.go b/br/pkg/restore/import.go index c04737b831df1..9a2c5d06ed3d9 100644 --- a/br/pkg/restore/import.go +++ b/br/pkg/restore/import.go @@ -35,6 +35,7 @@ import ( pd "github.com/tikv/pd/client" "go.uber.org/multierr" "go.uber.org/zap" + "golang.org/x/exp/maps" "golang.org/x/sync/errgroup" "google.golang.org/grpc" "google.golang.org/grpc/backoff" @@ -54,8 +55,9 @@ const ( ) const ( - importScanRegionTime = 10 * time.Second - gRPCBackOffMaxDelay = 3 * time.Second + gRPCBackOffMaxDelay = 3 * time.Second + // Todo: make it configable + gRPCTimeOut = 25 * time.Minute ) // RewriteMode is a mode flag that tells the TiKV how to handle the rewrite rules. @@ -267,6 +269,11 @@ type FileImporter struct { importClient ImporterClient backend *backuppb.StorageBackend + storeWorkerPoolRWLock sync.RWMutex + storeWorkerPoolMap map[uint64]chan struct{} + concurrencyPerStore uint + useTokenBucket bool + kvMode KvMode rawStartKey []byte rawEndKey []byte @@ -283,7 +290,10 @@ func NewFileImporter( backend *backuppb.StorageBackend, isRawKvMode bool, isTxnKvMode bool, + storeWorkerPoolMap map[uint64]chan struct{}, rewriteMode RewriteMode, + concurrencyPerStore uint, + useTokenBucket bool, ) FileImporter { kvMode := TiDB if isRawKvMode { @@ -293,12 +303,15 @@ func NewFileImporter( kvMode = Txn } return FileImporter{ - metaClient: metaClient, - backend: backend, - importClient: importClient, - kvMode: kvMode, - rewriteMode: rewriteMode, - cacheKey: fmt.Sprintf("BR-%s-%d", time.Now().Format("20060102150405"), rand.Int63()), + metaClient: metaClient, + backend: backend, + importClient: importClient, + storeWorkerPoolMap: storeWorkerPoolMap, + kvMode: kvMode, + rewriteMode: rewriteMode, + cacheKey: fmt.Sprintf("BR-%s-%d", time.Now().Format("20060102150405"), rand.Int63()), + concurrencyPerStore: concurrencyPerStore, + useTokenBucket: useTokenBucket, } } @@ -525,12 +538,15 @@ func (importer *FileImporter) ImportSSTFiles( return errors.Trace(err) } + downloadFn := importer.download + if importer.useTokenBucket { + downloadFn = importer.downloadV2 + } + err = utils.WithRetry(ctx, func() error { - tctx, cancel := context.WithTimeout(ctx, importScanRegionTime) - defer cancel() // Scan regions covered by the file range regionInfos, errScanRegion := split.PaginateScanRegion( - tctx, importer.metaClient, startKey, endKey, split.ScanRegionPaginationLimit) + ctx, importer.metaClient, startKey, endKey, split.ScanRegionPaginationLimit) if errScanRegion != nil { return errors.Trace(errScanRegion) } @@ -541,7 +557,7 @@ func (importer *FileImporter) ImportSSTFiles( for _, regionInfo := range regionInfos { info := regionInfo // Try to download file. - downloadMetas, errDownload := importer.download(ctx, info, files, rewriteRules, cipher, apiVersion) + downloadMetas, errDownload := downloadFn(ctx, info, files, rewriteRules, cipher, apiVersion) if errDownload != nil { for _, e := range multierr.Errors(errDownload) { switch errors.Cause(e) { // nolint:errorlint @@ -569,7 +585,8 @@ func (importer *FileImporter) ImportSSTFiles( log.Debug("download file done", zap.String("file-sample", files[0].Name), zap.Stringer("take", time.Since(start)), logutil.Key("start", files[0].StartKey), logutil.Key("end", files[0].EndKey)) - if errIngest := importer.ingest(ctx, info, downloadMetas); errIngest != nil { + start = time.Now() + if errIngest := importer.ingest(ctx, files, info, downloadMetas); errIngest != nil { log.Warn("ingest file failed, retry later", logutil.Files(files), logutil.SSTMetas(downloadMetas), @@ -577,9 +594,9 @@ func (importer *FileImporter) ImportSSTFiles( zap.Error(errIngest)) return errors.Trace(errIngest) } + log.Debug("ingest file done", zap.String("file-sample", files[0].Name), zap.Stringer("take", time.Since(start))) } - log.Debug("ingest file done", zap.String("file-sample", files[0].Name), zap.Stringer("take", time.Since(start))) for _, f := range files { summary.CollectSuccessUnit(summary.TotalKV, 1, f.TotalKvs) summary.CollectSuccessUnit(summary.TotalBytes, 1, f.TotalBytes) @@ -714,7 +731,7 @@ func (importer *FileImporter) downloadSST( logutil.Leader(regionInfo.Leader), ) - var atomicResp atomic.Value + var atomicResp atomic.Pointer[import_sstpb.DownloadResponse] eg, ectx := errgroup.WithContext(ctx) for _, p := range regionInfo.Region.GetPeers() { peer := p @@ -746,7 +763,7 @@ func (importer *FileImporter) downloadSST( return nil, err } - downloadResp := atomicResp.Load().(*import_sstpb.DownloadResponse) + downloadResp := atomicResp.Load() sstMeta.Range.Start = TruncateTS(downloadResp.Range.GetStart()) sstMeta.Range.End = TruncateTS(downloadResp.Range.GetEnd()) sstMeta.ApiVersion = apiVersion @@ -799,7 +816,7 @@ func (importer *FileImporter) downloadRawKVSST( } log.Debug("download SST", logutil.SSTMeta(sstMeta), logutil.Region(regionInfo.Region)) - var atomicResp atomic.Value + var atomicResp atomic.Pointer[import_sstpb.DownloadResponse] eg, ectx := errgroup.WithContext(ctx) for _, p := range regionInfo.Region.GetPeers() { peer := p @@ -824,18 +841,302 @@ func (importer *FileImporter) downloadRawKVSST( return nil, err } - downloadResp := atomicResp.Load().(*import_sstpb.DownloadResponse) + downloadResp := atomicResp.Load() sstMeta.Range.Start = downloadResp.Range.GetStart() sstMeta.Range.End = downloadResp.Range.GetEnd() sstMeta.ApiVersion = apiVersion return sstMeta, nil } -func (importer *FileImporter) ingest( +// a new way to download ssts files +// 1. download write + default sst files at peer level. +// 2. control the download concurrency per store. +func (importer *FileImporter) downloadV2( + ctx context.Context, + regionInfo *split.RegionInfo, + files []*backuppb.File, + rewriteRules *RewriteRules, + cipher *backuppb.CipherInfo, + apiVersion kvrpcpb.APIVersion, +) ([]*import_sstpb.SSTMeta, error) { + var ( + downloadMetas = make([]*import_sstpb.SSTMeta, 0, len(files)) + ) + errDownload := utils.WithRetry(ctx, func() error { + var e error + // we treat Txn kv file as Raw kv file. because we don't have table id to decode + if importer.kvMode == Raw || importer.kvMode == Txn { + downloadMetas, e = importer.downloadRawKVSSTV2(ctx, regionInfo, files, cipher, apiVersion) + } else { + downloadMetas, e = importer.downloadSSTV2(ctx, regionInfo, files, rewriteRules, cipher, apiVersion) + } + + failpoint.Inject("restore-storage-error", func(val failpoint.Value) { + msg := val.(string) + log.Debug("failpoint restore-storage-error injected.", zap.String("msg", msg)) + e = errors.Annotate(e, msg) + }) + failpoint.Inject("restore-gRPC-error", func(_ failpoint.Value) { + log.Warn("the connection to TiKV has been cut by a neko, meow :3") + e = status.Error(codes.Unavailable, "the connection to TiKV has been cut by a neko, meow :3") + }) + if isDecryptSstErr(e) { + log.Info("fail to decrypt when download sst, try again with no-crypt", logutil.Files(files)) + if importer.kvMode == Raw || importer.kvMode == Txn { + downloadMetas, e = importer.downloadRawKVSSTV2(ctx, regionInfo, files, nil, apiVersion) + } else { + downloadMetas, e = importer.downloadSSTV2(ctx, regionInfo, files, rewriteRules, nil, apiVersion) + } + } + if e != nil { + return errors.Trace(e) + } + + return nil + }, utils.NewDownloadSSTBackoffer()) + + return downloadMetas, errDownload +} + +func (importer *FileImporter) buildDownloadRequest( + file *backuppb.File, + rewriteRules *RewriteRules, + regionInfo *split.RegionInfo, + cipher *backuppb.CipherInfo, +) (*import_sstpb.DownloadRequest, import_sstpb.SSTMeta, error) { + uid := uuid.New() + id := uid[:] + // Get the rewrite rule for the file. + fileRule := findMatchedRewriteRule(file, rewriteRules) + if fileRule == nil { + return nil, import_sstpb.SSTMeta{}, errors.Trace(berrors.ErrKVRewriteRuleNotFound) + } + + // For the legacy version of TiKV, we need to encode the key prefix, since in the legacy + // version, the TiKV will rewrite the key with the encoded prefix without decoding the keys in + // the SST file. For the new version of TiKV that support keyspace rewrite, we don't need to + // encode the key prefix. The TiKV will decode the keys in the SST file and rewrite the keys + // with the plain prefix and encode the keys before writing to SST. + + // for the keyspace rewrite mode + rule := *fileRule + // for the legacy rewrite mode + if importer.rewriteMode == RewriteModeLegacy { + rule.OldKeyPrefix = encodeKeyPrefix(fileRule.GetOldKeyPrefix()) + rule.NewKeyPrefix = encodeKeyPrefix(fileRule.GetNewKeyPrefix()) + } + + sstMeta, err := GetSSTMetaFromFile(id, file, regionInfo.Region, &rule, importer.rewriteMode) + if err != nil { + return nil, import_sstpb.SSTMeta{}, err + } + + req := &import_sstpb.DownloadRequest{ + Sst: *sstMeta, + StorageBackend: importer.backend, + Name: file.GetName(), + RewriteRule: rule, + CipherInfo: cipher, + StorageCacheId: importer.cacheKey, + // For the older version of TiDB, the request type will be default to `import_sstpb.RequestType_Legacy` + RequestType: import_sstpb.DownloadRequestType_Keyspace, + Context: &kvrpcpb.Context{ + ResourceControlContext: &kvrpcpb.ResourceControlContext{ + ResourceGroupName: "", // TODO, + }, + RequestSource: kvutil.BuildRequestSource(true, kv.InternalTxnBR, kvutil.ExplicitTypeBR), + }, + } + return req, *sstMeta, nil +} + +func (importer *FileImporter) downloadSSTV2( ctx context.Context, + regionInfo *split.RegionInfo, + files []*backuppb.File, + rewriteRules *RewriteRules, + cipher *backuppb.CipherInfo, + apiVersion kvrpcpb.APIVersion, +) ([]*import_sstpb.SSTMeta, error) { + var mu sync.Mutex + downloadMetasMap := make(map[string]import_sstpb.SSTMeta) + resultMetasMap := make(map[string]*import_sstpb.SSTMeta) + downloadReqsMap := make(map[string]*import_sstpb.DownloadRequest) + for _, file := range files { + req, sstMeta, err := importer.buildDownloadRequest(file, rewriteRules, regionInfo, cipher) + if err != nil { + return nil, errors.Trace(err) + } + downloadMetasMap[file.Name] = sstMeta + downloadReqsMap[file.Name] = req + } + + eg, ectx := errgroup.WithContext(ctx) + for _, p := range regionInfo.Region.GetPeers() { + peer := p + eg.Go(func() error { + importer.storeWorkerPoolRWLock.RLock() + workerCh, ok := importer.storeWorkerPoolMap[peer.GetStoreId()] + // handle the case that the store is new-scaled in the cluster + if !ok { + importer.storeWorkerPoolRWLock.RUnlock() + importer.storeWorkerPoolRWLock.Lock() + // Notice: worker channel can't replaced, because it is still used after unlock. + if workerCh, ok = importer.storeWorkerPoolMap[peer.GetStoreId()]; !ok { + workerCh = utils.BuildWorkerTokenChannel(importer.concurrencyPerStore) + importer.storeWorkerPoolMap[peer.GetStoreId()] = workerCh + } + importer.storeWorkerPoolRWLock.Unlock() + } else { + importer.storeWorkerPoolRWLock.RUnlock() + } + select { + case <-ectx.Done(): + return ectx.Err() + case <-workerCh: + } + defer func() { + workerCh <- struct{}{} + }() + for _, file := range files { + req, ok := downloadReqsMap[file.Name] + if !ok { + return errors.New("not found file key for download request") + } + var err error + var resp *import_sstpb.DownloadResponse + resp, err = utils.WithRetryV2(ectx, utils.NewDownloadSSTBackoffer(), func(ctx context.Context) (*import_sstpb.DownloadResponse, error) { + dctx, cancel := context.WithTimeout(ctx, gRPCTimeOut) + defer cancel() + return importer.importClient.DownloadSST(dctx, peer.GetStoreId(), req) + }) + if err != nil { + return errors.Trace(err) + } + if resp.GetError() != nil { + return errors.Annotate(berrors.ErrKVDownloadFailed, resp.GetError().GetMessage()) + } + if resp.GetIsEmpty() { + return errors.Trace(berrors.ErrKVRangeIsEmpty) + } + + mu.Lock() + sstMeta, ok := downloadMetasMap[file.Name] + if !ok { + mu.Unlock() + return errors.Errorf("not found file %s for download sstMeta", file.Name) + } + sstMeta.Range = &import_sstpb.Range{ + Start: TruncateTS(resp.Range.GetStart()), + End: TruncateTS(resp.Range.GetEnd()), + } + resultMetasMap[file.Name] = &sstMeta + mu.Unlock() + + log.Debug("download from peer", + logutil.Region(regionInfo.Region), + logutil.File(file), + logutil.Peer(peer), + logutil.Key("resp-range-start", resp.Range.Start), + logutil.Key("resp-range-end", resp.Range.End), + zap.Bool("resp-isempty", resp.IsEmpty), + zap.Uint32("resp-crc32", resp.Crc32), + zap.Int("len files", len(files)), + ) + } + return nil + }) + } + if err := eg.Wait(); err != nil { + return nil, err + } + return maps.Values(resultMetasMap), nil +} + +func (importer *FileImporter) downloadRawKVSSTV2( + ctx context.Context, + regionInfo *split.RegionInfo, + files []*backuppb.File, + cipher *backuppb.CipherInfo, + apiVersion kvrpcpb.APIVersion, +) ([]*import_sstpb.SSTMeta, error) { + downloadMetas := make([]*import_sstpb.SSTMeta, 0, len(files)) + for _, file := range files { + uid := uuid.New() + id := uid[:] + // Empty rule + var rule import_sstpb.RewriteRule + sstMeta, err := GetSSTMetaFromFile(id, file, regionInfo.Region, &rule, RewriteModeLegacy) + if err != nil { + return nil, err + } + + // Cut the SST file's range to fit in the restoring range. + if bytes.Compare(importer.rawStartKey, sstMeta.Range.GetStart()) > 0 { + sstMeta.Range.Start = importer.rawStartKey + } + if len(importer.rawEndKey) > 0 && + (len(sstMeta.Range.GetEnd()) == 0 || bytes.Compare(importer.rawEndKey, sstMeta.Range.GetEnd()) <= 0) { + sstMeta.Range.End = importer.rawEndKey + sstMeta.EndKeyExclusive = true + } + if bytes.Compare(sstMeta.Range.GetStart(), sstMeta.Range.GetEnd()) > 0 { + return nil, errors.Trace(berrors.ErrKVRangeIsEmpty) + } + + req := &import_sstpb.DownloadRequest{ + Sst: *sstMeta, + StorageBackend: importer.backend, + Name: file.GetName(), + RewriteRule: rule, + IsRawKv: true, + CipherInfo: cipher, + StorageCacheId: importer.cacheKey, + } + log.Debug("download SST", logutil.SSTMeta(sstMeta), logutil.Region(regionInfo.Region)) + + var atomicResp atomic.Value + eg, ectx := errgroup.WithContext(ctx) + for _, p := range regionInfo.Region.GetPeers() { + peer := p + eg.Go(func() error { + resp, err := importer.importClient.DownloadSST(ectx, peer.GetStoreId(), req) + if err != nil { + return errors.Trace(err) + } + if resp.GetError() != nil { + return errors.Annotate(berrors.ErrKVDownloadFailed, resp.GetError().GetMessage()) + } + if resp.GetIsEmpty() { + return errors.Trace(berrors.ErrKVRangeIsEmpty) + } + + atomicResp.Store(resp) + return nil + }) + } + + if err := eg.Wait(); err != nil { + return nil, err + } + + downloadResp := atomicResp.Load().(*import_sstpb.DownloadResponse) + sstMeta.Range.Start = downloadResp.Range.GetStart() + sstMeta.Range.End = downloadResp.Range.GetEnd() + sstMeta.ApiVersion = apiVersion + downloadMetas = append(downloadMetas, sstMeta) + } + return downloadMetas, nil +} + +func (importer *FileImporter) ingest( + c context.Context, + files []*backuppb.File, info *split.RegionInfo, downloadMetas []*import_sstpb.SSTMeta, ) error { + ctx, cancel := context.WithTimeout(c, gRPCTimeOut) + defer cancel() for { ingestResp, errIngest := importer.ingestSSTs(ctx, downloadMetas, info) if errIngest != nil { @@ -866,7 +1167,10 @@ func (importer *FileImporter) ingest( break } // do not get region info, wait a second and GetRegion() again. - log.Warn("get region by key return nil", logutil.Region(info.Region)) + log.Warn("ingest get region by key return nil", logutil.Region(info.Region), + logutil.Files(files), + logutil.SSTMetas(downloadMetas), + ) time.Sleep(time.Second) } } @@ -875,6 +1179,8 @@ func (importer *FileImporter) ingest( return errors.Trace(berrors.ErrKVEpochNotMatch) } log.Debug("ingest sst returns not leader error, retry it", + logutil.Files(files), + logutil.SSTMetas(downloadMetas), logutil.Region(info.Region), zap.Stringer("newLeader", newInfo.Leader)) info = newInfo diff --git a/br/pkg/restore/import_retry.go b/br/pkg/restore/import_retry.go index 4a6bdf1b8afcf..3ce16f4816310 100644 --- a/br/pkg/restore/import_retry.go +++ b/br/pkg/restore/import_retry.go @@ -257,7 +257,7 @@ func (r *RPCResult) StrategyForRetryGoError() RetryStrategy { // we should unwrap the error or we cannot get the write gRPC status. if gRPCErr, ok := status.FromError(errors.Cause(r.Err)); ok { switch gRPCErr.Code() { - case codes.Unavailable, codes.Aborted, codes.ResourceExhausted: + case codes.Unavailable, codes.Aborted, codes.ResourceExhausted, codes.DeadlineExceeded: return StrategyFromThisRegion } } diff --git a/br/pkg/restore/ingestrec/ingest_recorder.go b/br/pkg/restore/ingestrec/ingest_recorder.go index 277a031b050d3..2a2deed34cb1d 100644 --- a/br/pkg/restore/ingestrec/ingest_recorder.go +++ b/br/pkg/restore/ingestrec/ingest_recorder.go @@ -83,8 +83,8 @@ func notSynced(job *model.Job, isSubJob bool) bool { return (job.State != model.JobStateSynced) && !(isSubJob && job.State == model.JobStateDone) } -// AddJob firstly filters the ingest index add operation job, and records it into IngestRecorder. -func (i *IngestRecorder) AddJob(job *model.Job, isSubJob bool) error { +// TryAddJob firstly filters the ingest index add operation job, and records it into IngestRecorder. +func (i *IngestRecorder) TryAddJob(job *model.Job, isSubJob bool) error { if job == nil || notIngestJob(job) || notAddIndexJob(job) || notSynced(job, isSubJob) { return nil } diff --git a/br/pkg/restore/ingestrec/ingest_recorder_test.go b/br/pkg/restore/ingestrec/ingest_recorder_test.go index eaacde6e73c1c..71a6ada559569 100644 --- a/br/pkg/restore/ingestrec/ingest_recorder_test.go +++ b/br/pkg/restore/ingestrec/ingest_recorder_test.go @@ -138,7 +138,7 @@ func TestAddIngestRecorder(t *testing.T) { } recorder := ingestrec.New() // no ingest job, should ignore it - err := recorder.AddJob(fakeJob( + err := recorder.TryAddJob(fakeJob( model.ReorgTypeTxn, model.ActionAddIndex, model.JobStateSynced, @@ -154,7 +154,7 @@ func TestAddIngestRecorder(t *testing.T) { require.NoError(t, err) // no add-index job, should ignore it - err = recorder.AddJob(fakeJob( + err = recorder.TryAddJob(fakeJob( model.ReorgTypeLitMerge, model.ActionDropIndex, model.JobStateSynced, @@ -170,7 +170,7 @@ func TestAddIngestRecorder(t *testing.T) { require.NoError(t, err) // no synced job, should ignore it - err = recorder.AddJob(fakeJob( + err = recorder.TryAddJob(fakeJob( model.ReorgTypeLitMerge, model.ActionAddIndex, model.JobStateRollbackDone, @@ -188,7 +188,7 @@ func TestAddIngestRecorder(t *testing.T) { { recorder := ingestrec.New() // a normal ingest add index job - err = recorder.AddJob(fakeJob( + err = recorder.TryAddJob(fakeJob( model.ReorgTypeLitMerge, model.ActionAddIndex, model.JobStateSynced, @@ -209,7 +209,7 @@ func TestAddIngestRecorder(t *testing.T) { { recorder := ingestrec.New() // a normal ingest add primary index job - err = recorder.AddJob(fakeJob( + err = recorder.TryAddJob(fakeJob( model.ReorgTypeLitMerge, model.ActionAddPrimaryKey, model.JobStateSynced, @@ -229,7 +229,7 @@ func TestAddIngestRecorder(t *testing.T) { { // a sub job as add primary index job - err = recorder.AddJob(fakeJob( + err = recorder.TryAddJob(fakeJob( model.ReorgTypeLitMerge, model.ActionAddPrimaryKey, model.JobStateDone, @@ -304,7 +304,7 @@ func TestIndexesKind(t *testing.T) { } recorder := ingestrec.New() - err := recorder.AddJob(fakeJob( + err := recorder.TryAddJob(fakeJob( model.ReorgTypeLitMerge, model.ActionAddIndex, model.JobStateSynced, @@ -382,7 +382,7 @@ func TestRewriteTableID(t *testing.T) { }, } recorder := ingestrec.New() - err := recorder.AddJob(fakeJob( + err := recorder.TryAddJob(fakeJob( model.ReorgTypeLitMerge, model.ActionAddIndex, model.JobStateSynced, diff --git a/br/pkg/restore/main_test.go b/br/pkg/restore/main_test.go index 7f22f2e41d7af..c566b421500d9 100644 --- a/br/pkg/restore/main_test.go +++ b/br/pkg/restore/main_test.go @@ -28,6 +28,7 @@ func TestMain(m *testing.M) { testsetup.SetupForCommonTest() opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("github.com/klauspost/compress/zstd.(*blockDec).startDecoder"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), diff --git a/br/pkg/restore/merge.go b/br/pkg/restore/merge.go index c9b072a2184cc..0aa1fdd5d1353 100644 --- a/br/pkg/restore/merge.go +++ b/br/pkg/restore/merge.go @@ -119,10 +119,15 @@ func MergeFileRanges( rangeTree := rtree.NewRangeTree() for key := range filesMap { files := filesMap[key] + rangeSize := uint64(0) + for _, f := range filesMap[key] { + rangeSize += f.Size_ + } if out := rangeTree.InsertRange(rtree.Range{ StartKey: files[0].GetStartKey(), EndKey: files[0].GetEndKey(), Files: files, + Size: rangeSize, }); out != nil { return nil, nil, errors.Annotatef(berrors.ErrRestoreInvalidRange, "duplicate range %s files %+v", out, files) @@ -136,6 +141,7 @@ func MergeFileRanges( continue } sortedRanges[i-1].EndKey = sortedRanges[i].EndKey + sortedRanges[i-1].Size += sortedRanges[i].Size sortedRanges[i-1].Files = append(sortedRanges[i-1].Files, sortedRanges[i].Files...) // TODO: this is slow when there are lots of ranges need to merge. sortedRanges = append(sortedRanges[:i], sortedRanges[i+1:]...) diff --git a/br/pkg/restore/pipeline_items.go b/br/pkg/restore/pipeline_items.go index 2d8fe440e34bc..4eaea8cc98dbf 100644 --- a/br/pkg/restore/pipeline_items.go +++ b/br/pkg/restore/pipeline_items.go @@ -243,6 +243,7 @@ func NewTiKVSender( cli TiKVRestorer, updateCh glue.Progress, splitConcurrency uint, + granularity string, ) (BatchSender, error) { inCh := make(chan DrainResult, defaultChannelSize) midCh := make(chan drainResultAndDone, defaultChannelSize) @@ -257,7 +258,17 @@ func NewTiKVSender( sender.wg.Add(2) go sender.splitWorker(ctx, inCh, midCh, splitConcurrency) - go sender.restoreWorker(ctx, midCh) + if granularity == string(CoarseGrained) { + outCh := make(chan drainResultAndDone, defaultChannelSize) + // block on splitting and scattering regions. + // in coarse-grained mode, wait all regions are split and scattered is + // no longer a time-consuming operation, then we can batch download files + // as much as enough and reduce the time of blocking restore. + go sender.blockPipelineWorker(ctx, midCh, outCh) + go sender.restoreWorker(ctx, outCh) + } else { + go sender.restoreWorker(ctx, midCh) + } return sender, nil } @@ -272,6 +283,26 @@ type drainResultAndDone struct { done func() } +func (b *tikvSender) blockPipelineWorker(ctx context.Context, + inCh <-chan drainResultAndDone, + outCh chan<- drainResultAndDone, +) { + defer close(outCh) + res := make([]drainResultAndDone, 0, defaultChannelSize) + for dr := range inCh { + res = append(res, dr) + } + + for _, dr := range res { + select { + case <-ctx.Done(): + return + default: + outCh <- dr + } + } +} + func (b *tikvSender) splitWorker(ctx context.Context, ranges <-chan DrainResult, next chan<- drainResultAndDone, @@ -385,6 +416,7 @@ func (b *tikvSender) restoreWorker(ctx context.Context, ranges <-chan drainResul if !ok { return } + files := r.result.Files() // There has been a worker in the `RestoreSSTFiles` procedure. // Spawning a raw goroutine won't make too many requests to TiKV. diff --git a/br/pkg/restore/split.go b/br/pkg/restore/split.go index 565254e830ddf..171370fff27ae 100644 --- a/br/pkg/restore/split.go +++ b/br/pkg/restore/split.go @@ -26,6 +26,7 @@ import ( "github.com/pingcap/tidb/br/pkg/utils/iter" "github.com/pingcap/tidb/pkg/tablecodec" "github.com/pingcap/tidb/pkg/util/codec" + "github.com/pingcap/tidb/pkg/util/mathutil" "go.uber.org/multierr" "go.uber.org/zap" "golang.org/x/sync/errgroup" @@ -33,6 +34,30 @@ import ( "google.golang.org/grpc/status" ) +type retryTimeKey struct{} + +var retryTimes = new(retryTimeKey) + +type Granularity string + +const ( + FineGrained Granularity = "fine-grained" + CoarseGrained Granularity = "coarse-grained" +) + +const ( + splitRegionKeysConcurrency = 8 + splitRegionRangesConcurrency = 32 +) + +type SplitContext struct { + isRawKv bool + needScatter bool + waitScatter bool + storeCount int + onSplit OnSplitFunc +} + // RegionSplitter is a executor of region split by rules. type RegionSplitter struct { client split.SplitClient @@ -48,15 +73,18 @@ func NewRegionSplitter(client split.SplitClient) *RegionSplitter { // OnSplitFunc is called before split a range. type OnSplitFunc func(key [][]byte) -// Split executes a region split. It will split regions by the rewrite rules, +// ExecuteSplit executes regions split and make sure new splitted regions are balance. +// It will split regions by the rewrite rules, // then it will split regions by the end key of each range. // tableRules includes the prefix of a table, since some ranges may have // a prefix with record sequence or index sequence. // note: all ranges and rewrite rules must have raw key. -func (rs *RegionSplitter) Split( +func (rs *RegionSplitter) ExecuteSplit( ctx context.Context, ranges []rtree.Range, rewriteRules *RewriteRules, + storeCount int, + granularity string, isRawKv bool, onSplit OnSplitFunc, ) error { @@ -71,95 +99,443 @@ func (rs *RegionSplitter) Split( ctx = opentracing.ContextWithSpan(ctx, span1) } - startTime := time.Now() // Sort the range for getting the min and max key of the ranges + // TODO: this sort may not needed if we sort tables after creatation outside. sortedRanges, errSplit := SortRanges(ranges, rewriteRules) if errSplit != nil { return errors.Trace(errSplit) } - minKey := codec.EncodeBytesExt(nil, sortedRanges[0].StartKey, isRawKv) - maxKey := codec.EncodeBytesExt(nil, sortedRanges[len(sortedRanges)-1].EndKey, isRawKv) - interval := split.SplitRetryInterval - scatterRegions := make([]*split.RegionInfo, 0) -SplitRegions: - for i := 0; i < split.SplitRetryTimes; i++ { - regions, errScan := split.PaginateScanRegion(ctx, rs.client, minKey, maxKey, split.ScanRegionPaginationLimit) - if errScan != nil { - if berrors.ErrPDBatchScanRegion.Equal(errScan) { - log.Warn("inconsistent region info get.", logutil.ShortError(errScan)) - time.Sleep(time.Second) - continue SplitRegions + if len(sortedRanges) == 0 { + log.Info("skip split regions after sorted, no range") + return nil + } + sortedKeys := make([][]byte, 0, len(sortedRanges)) + totalRangeSize := uint64(0) + for _, r := range sortedRanges { + sortedKeys = append(sortedKeys, r.EndKey) + totalRangeSize += r.Size + } + // need use first range's start key to scan region + // and the range size must be greater than 0 here + scanStartKey := sortedRanges[0].StartKey + sctx := SplitContext{ + isRawKv: isRawKv, + needScatter: true, + waitScatter: false, + onSplit: onSplit, + storeCount: storeCount, + } + if granularity == string(CoarseGrained) { + return rs.executeSplitByRanges(ctx, sctx, sortedRanges) + } + return rs.executeSplitByKeys(ctx, sctx, scanStartKey, sortedKeys) +} + +func (rs *RegionSplitter) executeSplitByRanges( + ctx context.Context, + splitContext SplitContext, + sortedRanges []rtree.Range, +) error { + startTime := time.Now() + minKey := codec.EncodeBytesExt(nil, sortedRanges[0].StartKey, splitContext.isRawKv) + maxKey := codec.EncodeBytesExt(nil, sortedRanges[len(sortedRanges)-1].EndKey, splitContext.isRawKv) + + err := utils.WithRetry(ctx, func() error { + regions, err := split.PaginateScanRegion(ctx, rs.client, minKey, maxKey, split.ScanRegionPaginationLimit) + if err != nil { + return err + } + lastSortedIndex := 0 + sortedIndex := 0 + splitRangeMap := make(map[uint64][]rtree.Range) + regionMap := make(map[uint64]*split.RegionInfo) + loop: + for _, region := range regions { + regionMap[region.Region.GetId()] = region + // collect all sortedKeys belong to this region + if len(region.Region.GetEndKey()) == 0 { + splitRangeMap[region.Region.GetId()] = sortedRanges[lastSortedIndex:] + break + } + for { + encodeKey := codec.EncodeBytesExt(nil, sortedRanges[sortedIndex].StartKey, splitContext.isRawKv) + if bytes.Compare(encodeKey, region.Region.GetEndKey()) >= 0 { + // start end + // range: |--------| + // region: |---------| + // pick up this range due to region end key is exclusive. + splitRangeMap[region.Region.GetId()] = sortedRanges[lastSortedIndex:sortedIndex] + lastSortedIndex = sortedIndex + // reach the region end key and break for next region + break + } + sortedIndex += 1 + if sortedIndex >= len(sortedRanges) { + splitRangeMap[region.Region.GetId()] = sortedRanges[lastSortedIndex:] + // has reach the region files' end + break loop + } } - return errors.Trace(errScan) } - splitKeyMap := getSplitKeys(rewriteRules, sortedRanges, regions, isRawKv) + // pd cannot handling too many scan regions requests. + poolSize := mathutil.Clamp(uint(splitContext.storeCount), 1, splitRegionRangesConcurrency) + workerPool := utils.NewWorkerPool(poolSize, "split ranges") + eg, ectx := errgroup.WithContext(ctx) + for rID, rgs := range splitRangeMap { + region := regionMap[rID] + ranges := rgs + sctx := splitContext + sctx.waitScatter = true + workerPool.ApplyOnErrorGroup(eg, func() error { + var newRegions []*split.RegionInfo + rangeSize := uint64(0) + allKeys := make([][]byte, 0, len(ranges)) + if len(ranges) <= 1 { + // we may have splitted in last restore run. + return nil + } + for _, rg := range ranges { + rangeSize += rg.Size + allKeys = append(allKeys, rg.EndKey) + } + // need use first range's start key to scan region + // and the range size must be greater than 0 here + scanStartKey := ranges[0].StartKey + // if ranges is less than store count, we can't split it by range + if len(ranges) <= sctx.storeCount { + log.Info("no enouth ranges for split region, fallback to split by keys", logutil.Region(region.Region)) + return rs.executeSplitByKeys(ectx, sctx, scanStartKey, allKeys) + } + keys, expectSplitSize := ChooseSplitKeysBySize(rangeSize, sctx.storeCount, ranges) + if len(keys) == 0 { + // no need split by ranges, fallback to split by keys + log.Info("no keys are chosen for region, fallback to split by keys", logutil.Region(region.Region)) + return rs.executeSplitByKeys(ectx, sctx, scanStartKey, allKeys) + } + log.Info("get split ranges for region", + zap.Int("keys", len(keys)), + zap.Uint64("expect split size", expectSplitSize), + zap.Uint64("total range size", rangeSize), + zap.Bool("need scatter", sctx.needScatter), + zap.Bool("wait scatter", sctx.waitScatter), + logutil.Keys(keys), + logutil.Region(region.Region)) + newRegions, err := rs.splitAndScatterRegions(ectx, sctx, region, keys) + if err != nil { + return err + } + if len(newRegions) != len(keys) { + log.Warn("split key count and new region count mismatch", + zap.Int("new region count", len(newRegions)), + zap.Int("split key count", len(keys))) + } + sctx.onSplit(keys) + sctx.needScatter = false + return rs.executeSplitByKeys(ectx, sctx, scanStartKey, allKeys) + }) + } + return eg.Wait() + }, newSplitBackoffer()) + if err != nil { + return errors.Trace(err) + } + log.Info("finish splitting and scattering regions by ranges", + zap.Duration("take", time.Since(startTime))) + return nil +} + +// executeSplitByKeys will split regions by **sorted** keys with following steps. +// 1. locate regions with correspond keys. +// 2. split these regions with correspond keys. +// 3. make sure new splitted regions are balanced. +func (rs *RegionSplitter) executeSplitByKeys( + ctx context.Context, + splitContext SplitContext, + scanStartKey []byte, + sortedKeys [][]byte, +) error { + var mutex sync.Mutex + startTime := time.Now() + minKey := codec.EncodeBytesExt(nil, scanStartKey, splitContext.isRawKv) + maxKey := codec.EncodeBytesExt(nil, sortedKeys[len(sortedKeys)-1], splitContext.isRawKv) + scatterRegions := make([]*split.RegionInfo, 0) + regionsMap := make(map[uint64]*split.RegionInfo) + + err := utils.WithRetry(ctx, func() error { + clear(regionsMap) + regions, err := split.PaginateScanRegion(ctx, rs.client, minKey, maxKey, split.ScanRegionPaginationLimit) + if err != nil { + return err + } + splitKeyMap := getSplitKeys(splitContext, sortedKeys, regions) regionMap := make(map[uint64]*split.RegionInfo) for _, region := range regions { regionMap[region.Region.GetId()] = region } - for regionID, keys := range splitKeyMap { - log.Info("get split keys for region", zap.Int("len", len(keys)), zap.Uint64("region", regionID)) - var newRegions []*split.RegionInfo + workerPool := utils.NewWorkerPool(splitRegionKeysConcurrency, "split keys") + eg, ectx := errgroup.WithContext(ctx) + for regionID, splitKeys := range splitKeyMap { region := regionMap[regionID] - log.Info("split regions", - logutil.Region(region.Region), logutil.Keys(keys), rtree.ZapRanges(ranges)) - newRegions, errSplit = rs.splitAndScatterRegions(ctx, region, keys) - if errSplit != nil { - if strings.Contains(errSplit.Error(), "no valid key") { - for _, key := range keys { - // Region start/end keys are encoded. split_region RPC - // requires raw keys (without encoding). - log.Error("split regions no valid key", - logutil.Key("startKey", region.Region.StartKey), - logutil.Key("endKey", region.Region.EndKey), - logutil.Key("key", codec.EncodeBytesExt(nil, key, isRawKv)), - rtree.ZapRanges(ranges)) - } - return errors.Trace(errSplit) + keys := splitKeys + sctx := splitContext + workerPool.ApplyOnErrorGroup(eg, func() error { + log.Info("get split keys for split regions", + logutil.Region(region.Region), logutil.Keys(keys), + zap.Bool("need scatter", sctx.needScatter)) + newRegions, err := rs.splitAndScatterRegions(ectx, sctx, region, keys) + if err != nil { + return err } - interval = 2 * interval - if interval > split.SplitMaxRetryInterval { - interval = split.SplitMaxRetryInterval + if len(newRegions) != len(keys) { + log.Warn("split key count and new region count mismatch", + zap.Int("new region count", len(newRegions)), + zap.Int("split key count", len(keys))) } - time.Sleep(interval) - log.Warn("split regions failed, retry", - zap.Error(errSplit), - logutil.Region(region.Region), - logutil.Leader(region.Leader), - logutil.Keys(keys), rtree.ZapRanges(ranges)) - continue SplitRegions - } - log.Info("scattered regions", zap.Int("count", len(newRegions))) - if len(newRegions) != len(keys) { - log.Warn("split key count and new region count mismatch", - zap.Int("new region count", len(newRegions)), - zap.Int("split key count", len(keys))) + if sctx.needScatter { + log.Info("scattered regions", zap.Int("count", len(newRegions))) + mutex.Lock() + for _, r := range newRegions { + regionsMap[r.Region.Id] = r + } + mutex.Unlock() + } + sctx.onSplit(keys) + return nil + }) + } + err = eg.Wait() + if err != nil { + return err + } + for _, r := range regionsMap { + // merge all scatter regions + scatterRegions = append(scatterRegions, r) + } + return nil + }, newSplitBackoffer()) + if err != nil { + return errors.Trace(err) + } + if len(scatterRegions) > 0 { + log.Info("finish splitting and scattering regions. and starts to wait", zap.Int("regions", len(scatterRegions)), + zap.Duration("take", time.Since(startTime))) + rs.waitRegionsScattered(ctx, scatterRegions, split.ScatterWaitUpperInterval) + } else { + log.Info("finish splitting regions.", zap.Duration("take", time.Since(startTime))) + } + return nil +} + +func (rs *RegionSplitter) splitAndScatterRegions( + ctx context.Context, splitContext SplitContext, regionInfo *split.RegionInfo, keys [][]byte, +) ([]*split.RegionInfo, error) { + if len(keys) < 1 { + return []*split.RegionInfo{regionInfo}, nil + } + + newRegions, err := rs.splitRegionsSync(ctx, regionInfo, keys) + if err != nil { + if strings.Contains(err.Error(), "no valid key") { + for _, key := range keys { + // Region start/end keys are encoded. split_region RPC + // requires raw keys (without encoding). + log.Error("split regions no valid key", + logutil.Key("startKey", regionInfo.Region.StartKey), + logutil.Key("endKey", regionInfo.Region.EndKey), + logutil.Key("key", codec.EncodeBytesExt(nil, key, splitContext.isRawKv))) } - scatterRegions = append(scatterRegions, newRegions...) - onSplit(keys) } - break + return nil, errors.Trace(err) } - if errSplit != nil { - return errors.Trace(errSplit) + if splitContext.needScatter { + // To make region leader balanced. need scatter origin one too + if splitContext.waitScatter { + rs.ScatterRegionsSync(ctx, append(newRegions, regionInfo)) + } else { + rs.ScatterRegionsAsync(ctx, append(newRegions, regionInfo)) + } } - log.Info("start to wait for scattering regions", - zap.Int("regions", len(scatterRegions)), zap.Duration("take", time.Since(startTime))) + return newRegions, nil +} - leftCnt := rs.WaitForScatterRegions(ctx, scatterRegions, split.ScatterWaitUpperInterval) - if leftCnt == 0 { +// splitRegionsSync perform batchSplit on a region by keys +// and then check the batch split success or not. +func (rs *RegionSplitter) splitRegionsSync( + ctx context.Context, regionInfo *split.RegionInfo, keys [][]byte, +) ([]*split.RegionInfo, error) { + if len(keys) == 0 { + return []*split.RegionInfo{regionInfo}, nil + } + newRegions, err := rs.client.BatchSplitRegions(ctx, regionInfo, keys) + if err != nil { + return nil, errors.Trace(err) + } + rs.waitRegionsSplitted(ctx, newRegions) + return newRegions, nil +} + +// ScatterRegionsAsync scatter the regions. +// for same reason just log and ignore error. +// See the comments of function waitRegionScattered. +func (rs *RegionSplitter) ScatterRegionsAsync(ctx context.Context, newRegions []*split.RegionInfo) { + log.Info("start to scatter regions", zap.Int("regions", len(newRegions))) + // the retry is for the temporary network errors during sending request. + err := utils.WithRetry(ctx, func() error { + err := rs.client.ScatterRegions(ctx, newRegions) + if isUnsupportedError(err) { + log.Warn("batch scatter isn't supported, rollback to old method", logutil.ShortError(err)) + rs.ScatterRegionsSequentially( + ctx, newRegions, + // backoff about 6s, or we give up scattering this region. + &split.ExponentialBackoffer{ + Attempts: 7, + BaseBackoff: 100 * time.Millisecond, + }) + return nil + } + return err + }, &split.ExponentialBackoffer{Attempts: 3, BaseBackoff: 500 * time.Millisecond}) + if err != nil { + log.Warn("failed to scatter regions", logutil.ShortError(err)) + } +} + +// ScatterRegionsSync scatter the regions and wait these region scattered from PD. +// for same reason just log and ignore error. +// See the comments of function waitRegionScattered. +func (rs *RegionSplitter) ScatterRegionsSync(ctx context.Context, newRegions []*split.RegionInfo) { + rs.ScatterRegionsAsync(ctx, newRegions) + rs.waitRegionsScattered(ctx, newRegions, split.ScatterWaitUpperInterval) +} + +// waitRegionsSplitted check multiple regions have finished the split. +func (rs *RegionSplitter) waitRegionsSplitted(ctx context.Context, splitRegions []*split.RegionInfo) { + // Wait for a while until the regions successfully split. + for _, region := range splitRegions { + rs.waitRegionSplitted(ctx, region.Region.Id) + } +} + +// waitRegionSplitted check single region has finished the split. +func (rs *RegionSplitter) waitRegionSplitted(ctx context.Context, regionID uint64) { + state := utils.InitialRetryState( + split.SplitCheckMaxRetryTimes, + split.SplitCheckInterval, + split.SplitMaxCheckInterval, + ) + err := utils.WithRetry(ctx, func() error { //nolint: errcheck + ok, err := rs.hasHealthyRegion(ctx, regionID) + if err != nil { + log.Warn("wait for split failed", zap.Uint64("regionID", regionID), zap.Error(err)) + return err + } + if ok { + return nil + } + return errors.Annotate(berrors.ErrPDSplitFailed, "wait region splitted failed") + }, &state) + if err != nil { + log.Warn("failed to split regions", logutil.ShortError(err)) + } +} + +// waitRegionsScattered try to wait mutilple regions scatterd in 3 minutes. +// this could timeout, but if many regions scatterd the restore could continue +// so we don't wait long time here. +func (rs *RegionSplitter) waitRegionsScattered(ctx context.Context, scatterRegions []*split.RegionInfo, timeout time.Duration) { + log.Info("start to wait for scattering regions", zap.Int("regions", len(scatterRegions))) + startTime := time.Now() + scatterCount := 0 + for _, region := range scatterRegions { + rs.waitRegionScattered(ctx, region) + if time.Since(startTime) > timeout { + break + } + scatterCount++ + } + if scatterCount == len(scatterRegions) { log.Info("waiting for scattering regions done", - zap.Int("regions", len(scatterRegions)), zap.Duration("take", time.Since(startTime))) + zap.Int("regions", len(scatterRegions)), + zap.Duration("take", time.Since(startTime))) } else { log.Warn("waiting for scattering regions timeout", - zap.Int("NotScatterCount", leftCnt), - zap.Int("TotalScatterCount", len(scatterRegions)), + zap.Int("scatterCount", scatterCount), zap.Int("regions", len(scatterRegions)), zap.Duration("take", time.Since(startTime))) } - return nil } +// waitRegionsScattered try to wait single region scatterd +// because we may not get the accurate result of scatter region. +// even we got error here the scatter could also succeed. +// so add a warn log and ignore error does make sense here. +func (rs *RegionSplitter) waitRegionScattered(ctx context.Context, regionInfo *split.RegionInfo) { + state := utils.InitialRetryState(split.ScatterWaitMaxRetryTimes, split.ScatterWaitInterval, split.ScatterMaxWaitInterval) + retryCount := 0 + err := utils.WithRetry(ctx, func() error { + ctx1 := context.WithValue(ctx, retryTimes, retryCount) + ok, _, err := rs.isScatterRegionFinished(ctx1, regionInfo.Region.Id) + if err != nil { + log.Warn("scatter region failed: do not have the region", + logutil.Region(regionInfo.Region)) + return err + } + if ok { + return nil + } + retryCount++ + return errors.Annotatef(berrors.ErrPDUnknownScatterResult, "try wait region scatter") + }, &state) + if err != nil { + log.Warn("wait scatter region meet error", logutil.Region(regionInfo.Region), logutil.ShortError(err)) + } +} + +// ScatterRegionsSequentially scatter the region with some backoffer. +// This function is for testing the retry mechanism. +// For a real cluster, directly use ScatterRegions would be fine. +func (rs *RegionSplitter) ScatterRegionsSequentially(ctx context.Context, newRegions []*split.RegionInfo, backoffer utils.Backoffer) { + newRegionSet := make(map[uint64]*split.RegionInfo, len(newRegions)) + for _, newRegion := range newRegions { + newRegionSet[newRegion.Region.Id] = newRegion + } + + if err := utils.WithRetry(ctx, func() error { + log.Info("trying to scatter regions...", zap.Int("remain", len(newRegionSet))) + var errs error + for _, region := range newRegionSet { + err := rs.client.ScatterRegion(ctx, region) + if err == nil { + // it is safe according to the Go language spec. + delete(newRegionSet, region.Region.Id) + } else if !split.PdErrorCanRetry(err) { + log.Warn("scatter meet error cannot be retried, skipping", + logutil.ShortError(err), + logutil.Region(region.Region), + ) + delete(newRegionSet, region.Region.Id) + } + errs = multierr.Append(errs, err) + } + return errs + }, backoffer); err != nil { + log.Warn("Some regions haven't been scattered because errors.", + zap.Int("count", len(newRegionSet)), + // if all region are failed to scatter, the short error might also be verbose... + logutil.ShortError(err), + logutil.AbbreviatedArray("failed-regions", newRegionSet, func(i interface{}) []string { + m := i.(map[uint64]*split.RegionInfo) + result := make([]string, 0, len(m)) + for id := range m { + result = append(result, strconv.Itoa(int(id))) + } + return result + }), + ) + } +} + +// hasHealthyRegion is used to check whether region splitted success func (rs *RegionSplitter) hasHealthyRegion(ctx context.Context, regionID uint64) (bool, error) { regionInfo, err := rs.client.GetRegionByID(ctx, regionID) if err != nil { @@ -212,7 +588,6 @@ func (rs *RegionSplitter) isScatterRegionFinished(ctx context.Context, regionID if retryTimes > 3 { log.Info("get operator", zap.Uint64("regionID", regionID), zap.Stringer("resp", resp)) } - // If the current operator of the region is not 'scatter-region', we could assume // that 'scatter-operator' has finished if string(resp.GetDesc()) != "scatter-region" { return true, false, nil @@ -227,39 +602,7 @@ func (rs *RegionSplitter) isScatterRegionFinished(ctx context.Context, regionID } } -func (rs *RegionSplitter) waitForSplit(ctx context.Context, regionID uint64) { - interval := split.SplitCheckInterval - for i := 0; i < split.SplitCheckMaxRetryTimes; i++ { - ok, err := rs.hasHealthyRegion(ctx, regionID) - if err != nil { - log.Warn("wait for split failed", zap.Error(err)) - return - } - if ok { - break - } - interval = 2 * interval - if interval > split.SplitMaxCheckInterval { - interval = split.SplitMaxCheckInterval - } - time.Sleep(interval) - } -} - -type retryTimeKey struct{} - -var retryTimes = new(retryTimeKey) - -func mapRegionInfoSlice(regionInfos []*split.RegionInfo) map[uint64]*split.RegionInfo { - regionInfoMap := make(map[uint64]*split.RegionInfo) - for _, info := range regionInfos { - regionID := info.Region.GetId() - regionInfoMap[regionID] = info - } - return regionInfoMap -} - -func (rs *RegionSplitter) WaitForScatterRegions(ctx context.Context, regionInfos []*split.RegionInfo, timeout time.Duration) int { +func (rs *RegionSplitter) WaitForScatterRegionsTimeout(ctx context.Context, regionInfos []*split.RegionInfo, timeout time.Duration) int { var ( startTime = time.Now() interval = split.ScatterWaitInterval @@ -294,13 +637,12 @@ func (rs *RegionSplitter) WaitForScatterRegions(ctx context.Context, regionInfos } if len(reScatterRegions) > 0 { - rs.ScatterRegions(ctx1, reScatterRegions) + rs.ScatterRegionsAsync(ctx1, reScatterRegions) } if time.Since(startTime) > timeout { break } - retryCnt += 1 interval = 2 * interval if interval > split.ScatterMaxWaitInterval { @@ -312,141 +654,48 @@ func (rs *RegionSplitter) WaitForScatterRegions(ctx context.Context, regionInfos return len(leftRegions) } -func (rs *RegionSplitter) splitAndScatterRegions( - ctx context.Context, regionInfo *split.RegionInfo, keys [][]byte, -) ([]*split.RegionInfo, error) { - if len(keys) == 0 { - return []*split.RegionInfo{regionInfo}, nil +func ChooseSplitKeysBySize(totalSize uint64, storeCount int, ranges []rtree.Range) ([][]byte, uint64) { + if storeCount <= 0 { + return nil, 0 } - - newRegions, err := rs.client.BatchSplitRegions(ctx, regionInfo, keys) - if err != nil { - return nil, errors.Trace(err) - } - // There would be some regions be scattered twice, e.g.: - // |--1-|--2-+----|-3--| - // | +(t1)| - // +(t1_r4) | - // +(t2_r42) - // When spliting at `t1_r4`, we would scatter region 1, 2. - // When spliting at `t2_r42`, we would scatter region 2, 3. - // Because we don't split at t1 anymore. - // The trick here is a pinky promise: never scatter regions you haven't imported any data. - // In this scenario, it is the last region after spliting (applying to >= 5.0). - if bytes.Equal(newRegions[len(newRegions)-1].Region.StartKey, keys[len(keys)-1]) { - newRegions = newRegions[:len(newRegions)-1] - } - rs.ScatterRegions(ctx, newRegions) - return newRegions, nil -} - -// ScatterRegionsWithBackoffer scatter the region with some backoffer. -// This function is for testing the retry mechanism. -// For a real cluster, directly use ScatterRegions would be fine. -func (rs *RegionSplitter) ScatterRegionsWithBackoffer(ctx context.Context, newRegions []*split.RegionInfo, backoffer utils.Backoffer) { - newRegionSet := make(map[uint64]*split.RegionInfo, len(newRegions)) - for _, newRegion := range newRegions { - newRegionSet[newRegion.Region.Id] = newRegion + expectSplitSize := totalSize / uint64(storeCount) + if expectSplitSize <= 0 { + return nil, 0 } - - if err := utils.WithRetry(ctx, func() error { - log.Info("trying to scatter regions...", zap.Int("remain", len(newRegionSet))) - var errs error - for _, region := range newRegionSet { - err := rs.client.ScatterRegion(ctx, region) - if err == nil { - // it is safe according to the Go language spec. - delete(newRegionSet, region.Region.Id) - } else if !split.PdErrorCanRetry(err) { - log.Warn("scatter meet error cannot be retried, skipping", - logutil.ShortError(err), - logutil.Region(region.Region), - ) - delete(newRegionSet, region.Region.Id) - } - errs = multierr.Append(errs, err) + size := uint64(0) + keys := make([][]byte, 0, storeCount) + for _, rg := range ranges { + size += rg.Size + if size >= expectSplitSize { + // collect enough ranges, choose this one + keys = append(keys, rg.EndKey) + log.Info("choose the split key", zap.Uint64("split size", size), logutil.Key("key", rg.EndKey)) + size = 0 } - return errs - }, backoffer); err != nil { - log.Warn("Some regions haven't been scattered because errors.", - zap.Int("count", len(newRegionSet)), - // if all region are failed to scatter, the short error might also be verbose... - logutil.ShortError(err), - logutil.AbbreviatedArray("failed-regions", newRegionSet, func(i interface{}) []string { - m := i.(map[uint64]*split.RegionInfo) - result := make([]string, 0, len(m)) - for id := range m { - result = append(result, strconv.Itoa(int(id))) - } - return result - }), - ) } + // we only use the first storeCount-1 ranges to split + // because we want have storeCount regions after split + // but in some case we should try best effort to split + // even the keys not reach the storeCount + keys = keys[:min(len(keys), storeCount-1)] + return keys, expectSplitSize } -// isUnsupportedError checks whether we should fallback to ScatterRegion API when meeting the error. -func isUnsupportedError(err error) bool { - s, ok := status.FromError(errors.Cause(err)) - if !ok { - // Not a gRPC error. Something other went wrong. - return false - } - // In two conditions, we fallback to ScatterRegion: - // (1) If the RPC endpoint returns UNIMPLEMENTED. (This is just for making test cases not be so magic.) - // (2) If the Message is "region 0 not found": - // In fact, PD reuses the gRPC endpoint `ScatterRegion` for the batch version of scattering. - // When the request contains the field `regionIDs`, it would use the batch version, - // Otherwise, it uses the old version and scatter the region with `regionID` in the request. - // When facing 4.x, BR(which uses v5.x PD clients and call `ScatterRegions`!) would set `regionIDs` - // which would be ignored by protocol buffers, and leave the `regionID` be zero. - // Then the older version of PD would try to search the region with ID 0. - // (Then it consistently fails, and returns "region 0 not found".) - return s.Code() == codes.Unimplemented || - strings.Contains(s.Message(), "region 0 not found") -} - -// ScatterRegions scatter the regions. -func (rs *RegionSplitter) ScatterRegions(ctx context.Context, newRegions []*split.RegionInfo) { - for _, region := range newRegions { - // Wait for a while until the regions successfully split. - rs.waitForSplit(ctx, region.Region.Id) - } - - // the retry is for the temporary network errors during sending request. - err := utils.WithRetry(ctx, func() error { - err := rs.client.ScatterRegions(ctx, newRegions) - if isUnsupportedError(err) { - log.Warn("batch scatter isn't supported, rollback to old method", logutil.ShortError(err)) - rs.ScatterRegionsWithBackoffer( - ctx, newRegions, - // backoff about 6s, or we give up scattering this region. - &split.ExponentialBackoffer{ - Attempts: 7, - BaseBackoff: 100 * time.Millisecond, - }) - return nil - } - if err != nil { - log.Warn("scatter region meet error", logutil.ShortError(err)) - } - return err - }, &split.ExponentialBackoffer{Attempts: 3, BaseBackoff: 500 * time.Millisecond}) - - if err != nil { - log.Warn("failed to batch scatter region", logutil.ShortError(err)) +func mapRegionInfoSlice(regionInfos []*split.RegionInfo) map[uint64]*split.RegionInfo { + regionInfoMap := make(map[uint64]*split.RegionInfo) + for _, info := range regionInfos { + regionID := info.Region.GetId() + regionInfoMap[regionID] = info } + return regionInfoMap } // getSplitKeys checks if the regions should be split by the end key of // the ranges, groups the split keys by region id. -func getSplitKeys(rewriteRules *RewriteRules, ranges []rtree.Range, regions []*split.RegionInfo, isRawKv bool) map[uint64][][]byte { +func getSplitKeys(splitContext SplitContext, keys [][]byte, regions []*split.RegionInfo) map[uint64][][]byte { splitKeyMap := make(map[uint64][][]byte) - checkKeys := make([][]byte, 0) - for _, rg := range ranges { - checkKeys = append(checkKeys, rg.EndKey) - } - for _, key := range checkKeys { - if region := NeedSplit(key, regions, isRawKv); region != nil { + for _, key := range keys { + if region := NeedSplit(key, regions, splitContext.isRawKv); region != nil { splitKeys, ok := splitKeyMap[region.Region.GetId()] if !ok { splitKeys = make([][]byte, 0, 1) @@ -641,8 +890,12 @@ func (helper *LogSplitHelper) splitRegionByPoints( return nil } + sctx := SplitContext{ + storeCount: 0, + } + helper.pool.ApplyOnErrorGroup(helper.eg, func() error { - newRegions, errSplit := regionSplitter.splitAndScatterRegions(ctx, region, splitPoints) + newRegions, errSplit := regionSplitter.splitAndScatterRegions(ctx, sctx, region, splitPoints) if errSplit != nil { log.Warn("failed to split the scaned region", zap.Error(errSplit)) _, startKey, _ := codec.DecodeBytes(region.Region.StartKey, nil) @@ -652,7 +905,7 @@ func (helper *LogSplitHelper) splitRegionByPoints( startKey = point } - return regionSplitter.Split(ctx, ranges, nil, false, func([][]byte) {}) + return regionSplitter.ExecuteSplit(ctx, ranges, nil, 0, "", false, func([][]byte) {}) } select { case <-ctx.Done(): @@ -840,7 +1093,7 @@ func (helper *LogSplitHelper) Split(ctx context.Context) error { regionSplitter := NewRegionSplitter(helper.client) // It is too expensive to stop recovery and wait for a small number of regions // to complete scatter, so the maximum waiting time is reduced to 1 minute. - _ = regionSplitter.WaitForScatterRegions(ctx, scatterRegions, time.Minute) + _ = regionSplitter.WaitForScatterRegionsTimeout(ctx, scatterRegions, time.Minute) }() iter := helper.iterator() @@ -908,3 +1161,53 @@ func (splitIter *LogFilesIterWithSplitHelper) TryNext(ctx context.Context) iter. splitIter.next += 1 return res } + +// isUnsupportedError checks whether we should fallback to ScatterRegion API when meeting the error. +func isUnsupportedError(err error) bool { + s, ok := status.FromError(errors.Cause(err)) + if !ok { + // Not a gRPC error. Something other went wrong. + return false + } + // In two conditions, we fallback to ScatterRegion: + // (1) If the RPC endpoint returns UNIMPLEMENTED. (This is just for making test cases not be so magic.) + // (2) If the Message is "region 0 not found": + // In fact, PD reuses the gRPC endpoint `ScatterRegion` for the batch version of scattering. + // When the request contains the field `regionIDs`, it would use the batch version, + // Otherwise, it uses the old version and scatter the region with `regionID` in the request. + // When facing 4.x, BR(which uses v5.x PD clients and call `ScatterRegions`!) would set `regionIDs` + // which would be ignored by protocol buffers, and leave the `regionID` be zero. + // Then the older version of PD would try to search the region with ID 0. + // (Then it consistently fails, and returns "region 0 not found".) + return s.Code() == codes.Unimplemented || + strings.Contains(s.Message(), "region 0 not found") +} + +type splitBackoffer struct { + state utils.RetryState +} + +func newSplitBackoffer() *splitBackoffer { + return &splitBackoffer{ + state: utils.InitialRetryState(split.SplitRetryTimes, split.SplitRetryInterval, split.SplitMaxRetryInterval), + } +} + +func (bo *splitBackoffer) NextBackoff(err error) time.Duration { + switch { + case berrors.ErrPDBatchScanRegion.Equal(err): + log.Warn("inconsistent region info get.", logutil.ShortError(err)) + return time.Second + case strings.Contains(err.Error(), "no valid key"): + bo.state.GiveUp() + return 0 + case berrors.ErrRestoreInvalidRange.Equal(err): + bo.state.GiveUp() + return 0 + } + return bo.state.ExponentialBackoff() +} + +func (bo *splitBackoffer) Attempt() int { + return bo.state.Attempt() +} diff --git a/br/pkg/restore/split/BUILD.bazel b/br/pkg/restore/split/BUILD.bazel index b8a595f5239fc..2b685914c4dcf 100644 --- a/br/pkg/restore/split/BUILD.bazel +++ b/br/pkg/restore/split/BUILD.bazel @@ -13,13 +13,11 @@ go_library( deps = [ "//br/pkg/conn/util", "//br/pkg/errors", - "//br/pkg/httputil", "//br/pkg/lightning/config", "//br/pkg/logutil", "//br/pkg/redact", "//br/pkg/utils", "//pkg/kv", - "//pkg/store/pdtypes", "@com_github_google_btree//:btree", "@com_github_pingcap_errors//:errors", "@com_github_pingcap_failpoint//:failpoint", diff --git a/br/pkg/restore/split/client.go b/br/pkg/restore/split/client.go index c558e410ea632..3f6271813db37 100644 --- a/br/pkg/restore/split/client.go +++ b/br/pkg/restore/split/client.go @@ -6,11 +6,6 @@ import ( "bytes" "context" "crypto/tls" - "encoding/json" - "fmt" - "io" - "net/http" - "path" "strings" "sync" "time" @@ -25,10 +20,8 @@ import ( "github.com/pingcap/log" "github.com/pingcap/tidb/br/pkg/conn/util" berrors "github.com/pingcap/tidb/br/pkg/errors" - "github.com/pingcap/tidb/br/pkg/httputil" "github.com/pingcap/tidb/br/pkg/lightning/config" "github.com/pingcap/tidb/br/pkg/logutil" - "github.com/pingcap/tidb/pkg/store/pdtypes" pd "github.com/tikv/pd/client" pdhttp "github.com/tikv/pd/client/http" "go.uber.org/multierr" @@ -72,9 +65,9 @@ type SplitClient interface { // Limit limits the maximum number of regions returned. ScanRegions(ctx context.Context, key, endKey []byte, limit int) ([]*RegionInfo, error) // GetPlacementRule loads a placement rule from PD. - GetPlacementRule(ctx context.Context, groupID, ruleID string) (pdtypes.Rule, error) + GetPlacementRule(ctx context.Context, groupID, ruleID string) (*pdhttp.Rule, error) // SetPlacementRule insert or update a placement rule to PD. - SetPlacementRule(ctx context.Context, rule pdtypes.Rule) error + SetPlacementRule(ctx context.Context, rule *pdhttp.Rule) error // DeletePlacementRule removes a placement rule from PD. DeletePlacementRule(ctx context.Context, groupID, ruleID string) error // SetStoresLabel add or update specified label of stores. If labelValue @@ -86,6 +79,7 @@ type SplitClient interface { type pdClient struct { mu sync.Mutex client pd.Client + httpCli pdhttp.Client tlsConf *tls.Config storeCache map[uint64]*metapb.Store @@ -98,9 +92,15 @@ type pdClient struct { } // NewSplitClient returns a client used by RegionSplitter. -func NewSplitClient(client pd.Client, tlsConf *tls.Config, isRawKv bool) SplitClient { +func NewSplitClient( + client pd.Client, + httpCli pdhttp.Client, + tlsConf *tls.Config, + isRawKv bool, +) SplitClient { cli := &pdClient{ client: client, + httpCli: httpCli, tlsConf: tlsConf, storeCache: make(map[uint64]*metapb.Store), isRawKv: isRawKv, @@ -365,6 +365,7 @@ func sendSplitRegionRequest(ctx context.Context, c *pdClient, regionInfo *Region if resp.RegionError != nil { log.Warn("fail to split region", logutil.Region(regionInfo.Region), + logutil.Keys(keys), zap.Stringer("regionErr", resp.RegionError)) *splitErrors = multierr.Append(*splitErrors, errors.Annotatef(berrors.ErrRestoreSplitFailed, "split region failed: err=%v", resp.RegionError)) @@ -462,25 +463,16 @@ func (c *pdClient) getStoreCount(ctx context.Context) (int, error) { } func (c *pdClient) getMaxReplica(ctx context.Context) (int, error) { - api := c.getPDAPIAddr() - req, err := http.NewRequestWithContext(ctx, "GET", fmt.Sprintf("%s%s", api, pdhttp.ReplicateConfig), nil) + resp, err := c.httpCli.GetReplicateConfig(ctx) if err != nil { return 0, errors.Trace(err) } - res, err := httputil.NewClient(c.tlsConf).Do(req) - if err != nil { - return 0, errors.Trace(err) + key := "max-replicas" + val, ok := resp[key] + if !ok { + return 0, errors.Errorf("key %s not found in response %v", key, resp) } - defer func() { - if err = res.Body.Close(); err != nil { - log.Error("Response fail to close", zap.Error(err)) - } - }() - var conf pdtypes.ReplicationConfig - if err := json.NewDecoder(res.Body).Decode(&conf); err != nil { - return 0, errors.Trace(err) - } - return int(conf.MaxReplicas), nil + return int(val.(float64)), nil } func (c *pdClient) checkNeedScatter(ctx context.Context) (bool, error) { @@ -533,94 +525,25 @@ func (c *pdClient) ScanRegions(ctx context.Context, key, endKey []byte, limit in return regionInfos, nil } -func (c *pdClient) GetPlacementRule(ctx context.Context, groupID, ruleID string) (pdtypes.Rule, error) { - var rule pdtypes.Rule - addr := c.getPDAPIAddr() - if addr == "" { - return rule, errors.Annotate(berrors.ErrRestoreSplitFailed, "failed to add stores labels: no leader") - } - req, err := http.NewRequestWithContext(ctx, "GET", - addr+path.Join(pdhttp.PlacementRule, groupID, ruleID), nil) - if err != nil { - return rule, errors.Trace(err) - } - res, err := httputil.NewClient(c.tlsConf).Do(req) - if err != nil { - return rule, errors.Trace(err) - } - defer func() { - if err = res.Body.Close(); err != nil { - log.Error("Response fail to close", zap.Error(err)) - } - }() - b, err := io.ReadAll(res.Body) - if err != nil { - return rule, errors.Trace(err) - } - err = json.Unmarshal(b, &rule) - if err != nil { - return rule, errors.Trace(err) - } - return rule, nil +func (c *pdClient) GetPlacementRule(ctx context.Context, groupID, ruleID string) (*pdhttp.Rule, error) { + resp, err := c.httpCli.GetPlacementRule(ctx, groupID, ruleID) + return resp, errors.Trace(err) } -func (c *pdClient) SetPlacementRule(ctx context.Context, rule pdtypes.Rule) error { - addr := c.getPDAPIAddr() - if addr == "" { - return errors.Annotate(berrors.ErrPDLeaderNotFound, "failed to add stores labels") - } - m, _ := json.Marshal(rule) - req, err := http.NewRequestWithContext(ctx, "POST", - addr+path.Join(pdhttp.PlacementRule), bytes.NewReader(m)) - if err != nil { - return errors.Trace(err) - } - res, err := httputil.NewClient(c.tlsConf).Do(req) - if err != nil { - return errors.Trace(err) - } - return errors.Trace(res.Body.Close()) +func (c *pdClient) SetPlacementRule(ctx context.Context, rule *pdhttp.Rule) error { + return c.httpCli.SetPlacementRule(ctx, rule) } func (c *pdClient) DeletePlacementRule(ctx context.Context, groupID, ruleID string) error { - addr := c.getPDAPIAddr() - if addr == "" { - return errors.Annotate(berrors.ErrPDLeaderNotFound, "failed to add stores labels") - } - req, err := http.NewRequestWithContext(ctx, "DELETE", addr+path.Join(pdhttp.PlacementRule, groupID, ruleID), nil) - if err != nil { - return errors.Trace(err) - } - res, err := httputil.NewClient(c.tlsConf).Do(req) - if err != nil { - return errors.Trace(err) - } - return errors.Trace(res.Body.Close()) + return c.httpCli.DeletePlacementRule(ctx, groupID, ruleID) } func (c *pdClient) SetStoresLabel( ctx context.Context, stores []uint64, labelKey, labelValue string, ) error { - b := []byte(fmt.Sprintf(`{"%s": "%s"}`, labelKey, labelValue)) - addr := c.getPDAPIAddr() - if addr == "" { - return errors.Annotate(berrors.ErrPDLeaderNotFound, "failed to add stores labels") - } - httpCli := httputil.NewClient(c.tlsConf) + m := map[string]string{labelKey: labelValue} for _, id := range stores { - req, err := http.NewRequestWithContext( - ctx, "POST", - addr+pdhttp.StoreLabelByID(id), - bytes.NewReader(b), - ) - if err != nil { - return errors.Trace(err) - } - res, err := httpCli.Do(req) - if err != nil { - return errors.Trace(err) - } - err = res.Body.Close() + err := c.httpCli.SetStoreLabels(ctx, int64(id), m) if err != nil { return errors.Trace(err) } diff --git a/br/pkg/restore/split/split.go b/br/pkg/restore/split/split.go index 95704383582d9..99d804aa07170 100644 --- a/br/pkg/restore/split/split.go +++ b/br/pkg/restore/split/split.go @@ -27,7 +27,7 @@ var ( const ( SplitRetryTimes = 32 SplitRetryInterval = 50 * time.Millisecond - SplitMaxRetryInterval = time.Second + SplitMaxRetryInterval = 4 * time.Second SplitCheckMaxRetryTimes = 64 SplitCheckInterval = 8 * time.Millisecond diff --git a/br/pkg/restore/split_test.go b/br/pkg/restore/split_test.go index c48d056be2589..583847bf6e2a3 100644 --- a/br/pkg/restore/split_test.go +++ b/br/pkg/restore/split_test.go @@ -29,6 +29,7 @@ import ( "github.com/pingcap/tidb/pkg/tablecodec" "github.com/pingcap/tidb/pkg/util/codec" "github.com/stretchr/testify/require" + pdhttp "github.com/tikv/pd/client/http" "go.uber.org/multierr" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" @@ -229,6 +230,9 @@ func (c *TestClient) ScanRegions(ctx context.Context, key, endKey []byte, limit c.InjectTimes -= 1 return nil, status.Error(codes.Unavailable, "not leader") } + if len(key) != 0 && bytes.Equal(key, endKey) { + return nil, status.Error(codes.Internal, "key and endKey are the same") + } infos := c.regionsInfo.ScanRange(key, endKey, limit) regions := make([]*split.RegionInfo, 0, len(infos)) @@ -241,11 +245,11 @@ func (c *TestClient) ScanRegions(ctx context.Context, key, endKey []byte, limit return regions, nil } -func (c *TestClient) GetPlacementRule(ctx context.Context, groupID, ruleID string) (r pdtypes.Rule, err error) { +func (c *TestClient) GetPlacementRule(ctx context.Context, groupID, ruleID string) (r *pdhttp.Rule, err error) { return } -func (c *TestClient) SetPlacementRule(ctx context.Context, rule pdtypes.Rule) error { +func (c *TestClient) SetPlacementRule(ctx context.Context, rule *pdhttp.Rule) error { return nil } @@ -285,6 +289,19 @@ func (b *assertRetryLessThanBackoffer) NextBackoff(err error) time.Duration { func (b *assertRetryLessThanBackoffer) Attempt() int { return b.max - b.already } +func TestScanEmptyRegion(t *testing.T) { + client := initTestClient(false) + ranges := initRanges() + // make ranges has only one + ranges = ranges[0:1] + rewriteRules := initRewriteRules() + regionSplitter := restore.NewRegionSplitter(client) + + ctx := context.Background() + err := regionSplitter.ExecuteSplit(ctx, ranges, rewriteRules, 0, "", false, func(key [][]byte) {}) + // should not return error with only one range entry + require.NoError(t, err) +} func TestScatterFinishInTime(t *testing.T) { client := initTestClient(false) @@ -293,7 +310,7 @@ func TestScatterFinishInTime(t *testing.T) { regionSplitter := restore.NewRegionSplitter(client) ctx := context.Background() - err := regionSplitter.Split(ctx, ranges, rewriteRules, false, func(key [][]byte) {}) + err := regionSplitter.ExecuteSplit(ctx, ranges, rewriteRules, 0, "", false, func(key [][]byte) {}) require.NoError(t, err) regions := client.GetAllRegions() if !validateRegions(regions) { @@ -319,7 +336,7 @@ func TestScatterFinishInTime(t *testing.T) { // When using a exponential backoffer, if we try to backoff more than 40 times in 10 regions, // it would cost time unacceptable. - regionSplitter.ScatterRegionsWithBackoffer(ctx, + regionSplitter.ScatterRegionsSequentially(ctx, regionInfos, assertRetryLessThan(t, 40)) } @@ -348,12 +365,6 @@ func TestSplitAndScatter(t *testing.T) { }) } -func TestXXX(t *testing.T) { - client := initTestClient(false) - client.InstallBatchScatterSupport() - runWaitScatter(t, client) -} - // +------------+---------------------------- // | region | states // +------------+---------------------------- @@ -447,7 +458,7 @@ func runWaitScatter(t *testing.T, client *TestClient) { regions = append(regions, info) } regionSplitter := restore.NewRegionSplitter(client) - leftCnt := regionSplitter.WaitForScatterRegions(ctx, regions, 2000*time.Second) + leftCnt := regionSplitter.WaitForScatterRegionsTimeout(ctx, regions, 2000*time.Second) require.Equal(t, leftCnt, 0) } @@ -457,7 +468,7 @@ func runTestSplitAndScatterWith(t *testing.T, client *TestClient) { regionSplitter := restore.NewRegionSplitter(client) ctx := context.Background() - err := regionSplitter.Split(ctx, ranges, rewriteRules, false, func(key [][]byte) {}) + err := regionSplitter.ExecuteSplit(ctx, ranges, rewriteRules, 0, "", false, func(key [][]byte) {}) require.NoError(t, err) regions := client.GetAllRegions() if !validateRegions(regions) { @@ -481,7 +492,7 @@ func runTestSplitAndScatterWith(t *testing.T, client *TestClient) { scattered[regionInfo.Region.Id] = true return nil } - regionSplitter.ScatterRegions(ctx, regionInfos) + regionSplitter.ScatterRegionsSync(ctx, regionInfos) for key := range regions { if key == alwaysFailedRegionID { require.Falsef(t, scattered[key], "always failed region %d was scattered successfully", key) @@ -503,7 +514,7 @@ func TestRawSplit(t *testing.T) { ctx := context.Background() regionSplitter := restore.NewRegionSplitter(client) - err := regionSplitter.Split(ctx, ranges, nil, true, func(key [][]byte) {}) + err := regionSplitter.ExecuteSplit(ctx, ranges, nil, 0, "", true, func(key [][]byte) {}) require.NoError(t, err) regions := client.GetAllRegions() expectedKeys := []string{"", "aay", "bba", "bbh", "cca", ""} @@ -624,6 +635,94 @@ FindRegion: return true } +func TestChooseSplitKeysBySize(t *testing.T) { + // case #0 store count is zero, return nil + keys, _ := restore.ChooseSplitKeysBySize(0, 0, nil) + require.Len(t, keys, 0) + + // case #1 choose the first two keys as split keys + rg := rtree.NewRangeTree() + firstEndKey := []byte("2") + SecondEndKey := []byte("3") + rg.InsertRange(rtree.Range{ + StartKey: []byte("1"), + EndKey: firstEndKey, + Size: 3, + }) + rg.InsertRange(rtree.Range{ + StartKey: []byte("2"), + EndKey: SecondEndKey, + Size: 3, + }) + rg.InsertRange(rtree.Range{ + StartKey: []byte("3"), + EndKey: []byte("4"), + Size: 4, + }) + + keys, size := restore.ChooseSplitKeysBySize(10, 3, rg.GetSortedRanges()) + require.Len(t, keys, 2) + require.EqualValues(t, size, 3) + require.ElementsMatch(t, keys, [][]byte{firstEndKey, SecondEndKey}) + + // case #2 choose the first key as split key, because the first range is large enough + rg = rtree.NewRangeTree() + rg.InsertRange(rtree.Range{ + StartKey: []byte("1"), + EndKey: firstEndKey, + Size: 8, + }) + rg.InsertRange(rtree.Range{ + StartKey: []byte("2"), + EndKey: SecondEndKey, + Size: 1, + }) + rg.InsertRange(rtree.Range{ + StartKey: []byte("3"), + EndKey: []byte("4"), + Size: 1, + }) + + keys, size = restore.ChooseSplitKeysBySize(10, 3, rg.GetSortedRanges()) + require.Len(t, keys, 1) + require.ElementsMatch(t, keys, [][]byte{firstEndKey}) + require.EqualValues(t, size, 3) + + // case #3 choose the second key as split key, because the first+second range is large enough + rg = rtree.NewRangeTree() + rg.InsertRange(rtree.Range{ + StartKey: []byte("1"), + EndKey: firstEndKey, + Size: 1, + }) + rg.InsertRange(rtree.Range{ + StartKey: []byte("3"), + EndKey: SecondEndKey, + Size: 8, + }) + rg.InsertRange(rtree.Range{ + StartKey: []byte("4"), + EndKey: []byte("5"), + Size: 1, + }) + + keys, size = restore.ChooseSplitKeysBySize(10, 3, rg.GetSortedRanges()) + require.Len(t, keys, 1) + require.ElementsMatch(t, keys, [][]byte{SecondEndKey}) + require.EqualValues(t, size, 3) + + // case #4 too many stores, no need to split + rg = rtree.NewRangeTree() + rg.InsertRange(rtree.Range{ + StartKey: []byte("1"), + EndKey: []byte("2"), + Size: 8, + }) + keys, size = restore.ChooseSplitKeysBySize(10, 100, rg.GetSortedRanges()) + require.Len(t, keys, 0) + require.EqualValues(t, size, 0) +} + func TestNeedSplit(t *testing.T) { testNeedSplit(t, false) testNeedSplit(t, true) @@ -828,7 +927,7 @@ func TestRestoreFailed(t *testing.T) { r := &fakeRestorer{ tableIDIsInsequence: true, } - sender, err := restore.NewTiKVSender(context.TODO(), r, nil, 1) + sender, err := restore.NewTiKVSender(context.TODO(), r, nil, 1, string(restore.FineGrained)) require.NoError(t, err) dctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) defer cancel() @@ -851,7 +950,7 @@ func TestSplitFailed(t *testing.T) { fakeRanges("bcy", "cad", "xxy"), } r := &fakeRestorer{errorInSplit: true, tableIDIsInsequence: true} - sender, err := restore.NewTiKVSender(context.TODO(), r, nil, 1) + sender, err := restore.NewTiKVSender(context.TODO(), r, nil, 1, string(restore.FineGrained)) require.NoError(t, err) dctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) defer cancel() @@ -1052,10 +1151,10 @@ func (f *fakeSplitClient) ScanRegions(ctx context.Context, startKey, endKey []by } return result, nil } -func (*fakeSplitClient) GetPlacementRule(ctx context.Context, groupID, ruleID string) (pdtypes.Rule, error) { - return pdtypes.Rule{}, nil +func (*fakeSplitClient) GetPlacementRule(ctx context.Context, groupID, ruleID string) (*pdhttp.Rule, error) { + return nil, nil } -func (*fakeSplitClient) SetPlacementRule(ctx context.Context, rule pdtypes.Rule) error { return nil } +func (*fakeSplitClient) SetPlacementRule(ctx context.Context, rule *pdhttp.Rule) error { return nil } func (*fakeSplitClient) DeletePlacementRule(ctx context.Context, groupID, ruleID string) error { return nil } diff --git a/br/pkg/restore/stream_metas.go b/br/pkg/restore/stream_metas.go index 6d2889111a74e..d4f8e6d6cbb08 100644 --- a/br/pkg/restore/stream_metas.go +++ b/br/pkg/restore/stream_metas.go @@ -222,13 +222,13 @@ func (ms *StreamMetadataSet) removeDataFilesAndUpdateMetadata(ctx context.Contex num = int64(len(removed)) if ms.DryRun { - log.Debug("dry run, skip deletion ...") + log.Info("dry run, skip deletion ...") return num, notDeleted, nil } // remove data file groups for _, f := range removed { - log.Debug("Deleting file", zap.String("path", f.Path)) + log.Info("Deleting file", zap.String("path", f.Path)) if err := storage.DeleteFile(ctx, f.Path); err != nil { log.Warn("File not deleted.", zap.String("path", f.Path), logutil.ShortError(err)) notDeleted = append(notDeleted, f.Path) @@ -249,6 +249,7 @@ func (ms *StreamMetadataSet) removeDataFilesAndUpdateMetadata(ctx context.Contex ReplaceMetadata(meta, remainedDataFiles) if ms.BeforeDoWriteBack != nil && ms.BeforeDoWriteBack(metaPath, meta) { + log.Info("Skipped writeback meta by the hook.", zap.String("meta", metaPath)) return num, notDeleted, nil } diff --git a/br/pkg/restore/stream_metas_test.go b/br/pkg/restore/stream_metas_test.go index d0c7d65e8a93d..f1ee34feb66e4 100644 --- a/br/pkg/restore/stream_metas_test.go +++ b/br/pkg/restore/stream_metas_test.go @@ -19,6 +19,7 @@ import ( "github.com/pingcap/tidb/br/pkg/restore" "github.com/pingcap/tidb/br/pkg/storage" "github.com/pingcap/tidb/br/pkg/stream" + "github.com/pingcap/tidb/pkg/util/intest" "github.com/stretchr/testify/require" "go.uber.org/zap" ) @@ -302,6 +303,7 @@ func TestTruncateSafepoint(t *testing.T) { } func TestTruncateSafepointForGCS(t *testing.T) { + require.True(t, intest.InTest) ctx := context.Background() opts := fakestorage.Options{ NoListener: true, diff --git a/br/pkg/restore/systable_restore.go b/br/pkg/restore/systable_restore.go index 409a4243c7121..8dd62e309d44b 100644 --- a/br/pkg/restore/systable_restore.go +++ b/br/pkg/restore/systable_restore.go @@ -12,6 +12,7 @@ import ( berrors "github.com/pingcap/tidb/br/pkg/errors" "github.com/pingcap/tidb/br/pkg/logutil" "github.com/pingcap/tidb/br/pkg/utils" + "github.com/pingcap/tidb/pkg/bindinfo" "github.com/pingcap/tidb/pkg/parser/model" "github.com/pingcap/tidb/pkg/parser/mysql" filter "github.com/pingcap/tidb/pkg/util/table-filter" @@ -20,19 +21,20 @@ import ( ) const ( - rootUser = "root" sysUserTableName = "user" - cloudAdminUser = "cloud_admin" ) var statsTables = map[string]struct{}{ - "stats_buckets": {}, - "stats_extended": {}, - "stats_feedback": {}, - "stats_fm_sketch": {}, - "stats_histograms": {}, - "stats_meta": {}, - "stats_top_n": {}, + "stats_buckets": {}, + "stats_extended": {}, + "stats_feedback": {}, + "stats_fm_sketch": {}, + "stats_histograms": {}, + "stats_history": {}, + "stats_meta": {}, + "stats_meta_history": {}, + "stats_table_locked": {}, + "stats_top_n": {}, } var unRecoverableTable = map[string]struct{}{ @@ -48,21 +50,9 @@ var unRecoverableTable = map[string]struct{}{ // schema_index_usage has table id need to be rewrite. "schema_index_usage": {}, -} -// tables in this map is restored when fullClusterRestore=true -// the value part is the filter in SQL where clause which is used to -// skip clearing or restoring 'cloud_admin'@'%' which is a special -// user on TiDB Cloud -var sysPrivilegeTableMap = map[string]string{ - "user": "(user = '%s' and host = '%%')", // since v1.0.0 - "db": "(user = '%s' and host = '%%')", // since v1.0.0 - "tables_priv": "(user = '%s' and host = '%%')", // since v1.0.0 - "columns_priv": "(user = '%s' and host = '%%')", // since v1.0.0 - "default_roles": "(user = '%s' and host = '%%')", // since v3.0.0 - "role_edges": "(to_user = '%s' and to_host = '%%')", // since v3.0.0 - "global_priv": "(user = '%s' and host = '%%')", // since v3.0.8 - "global_grants": "(user = '%s' and host = '%%')", // since v5.0.3 + // replace into view is not supported now + "tidb_mdl_view": {}, } func isUnrecoverableTable(tableName string) bool { @@ -75,99 +65,33 @@ func isStatsTable(tableName string) bool { return ok } -func generateResetSQLs(db *database, resetUsers []string) []string { - if db.Name.L != mysql.SystemDB { - return nil - } - sqls := make([]string, 0, 10) - // we only need reset root password once - rootReset := false - for tableName := range db.ExistingTables { - if sysPrivilegeTableMap[tableName] != "" { - for _, name := range resetUsers { - if strings.ToLower(name) == rootUser { - if rootReset { - continue - } - updateSQL := fmt.Sprintf("UPDATE %s.%s SET authentication_string='',"+ - " Shutdown_priv='Y',"+ - " Config_priv='Y'"+ - " WHERE USER='root' AND Host='%%';", - db.Name.L, sysUserTableName) - sqls = append(sqls, updateSQL) - rootReset = true - } else { - /* #nosec G202: SQL string concatenation */ - whereClause := fmt.Sprintf("WHERE "+sysPrivilegeTableMap[tableName], name) - deleteSQL := fmt.Sprintf("DELETE FROM %s %s;", - utils.EncloseDBAndTable(db.Name.L, tableName), whereClause) - sqls = append(sqls, deleteSQL) - } - } - } - } - return sqls -} - -// ClearSystemUsers is used for volume-snapshot restoration. -// because we can not support restore user in some scenarios, for example in cloud. -// we'd better use this function to drop cloud_admin user after volume-snapshot restore. -func (rc *Client) ClearSystemUsers(ctx context.Context, resetUsers []string) error { - sysDB := mysql.SystemDB - db, ok := rc.getDatabaseByName(sysDB) - if !ok { - log.Warn("target database not exist, aborting", zap.String("database", sysDB)) - return nil - } - execSQL := func(sql string) error { - // SQLs here only contain table name and database name, seems it is no need to redact them. - if err := rc.db.se.Execute(ctx, sql); err != nil { - log.Warn("failed to clear system users", - zap.Stringer("database", db.Name), - zap.String("sql", sql), - zap.Error(err), - ) - return berrors.ErrUnknown.Wrap(err).GenWithStack("failed to execute %s", sql) - } - log.Info("successfully clear system users after restoration", - zap.Stringer("database", db.Name), - zap.String("sql", sql), - ) - return nil - } - - sqls := generateResetSQLs(db, resetUsers) - for _, sql := range sqls { - log.Info("reset system user for cloud", zap.String("sql", sql)) - if err := execSQL(sql); err != nil { - return err - } - } - return nil -} - // RestoreSystemSchemas restores the system schema(i.e. the `mysql` schema). // Detail see https://github.com/pingcap/br/issues/679#issuecomment-762592254. -func (rc *Client) RestoreSystemSchemas(ctx context.Context, f filter.Filter) { +func (rc *Client) RestoreSystemSchemas(ctx context.Context, f filter.Filter) (rerr error) { sysDB := mysql.SystemDB temporaryDB := utils.TemporaryDBName(sysDB) - defer rc.cleanTemporaryDatabase(ctx, sysDB) + defer func() { + // Don't clean the temporary database for next restore with checkpoint. + if rerr == nil { + rc.cleanTemporaryDatabase(ctx, sysDB) + } + }() if !f.MatchSchema(sysDB) || !rc.withSysTable { log.Debug("system database filtered out", zap.String("database", sysDB)) - return + return nil } originDatabase, ok := rc.databases[temporaryDB.O] if !ok { log.Info("system database not backed up, skipping", zap.String("database", sysDB)) - return + return nil } db, ok := rc.getDatabaseByName(sysDB) if !ok { // Or should we create the database here? log.Warn("target database not exist, aborting", zap.String("database", sysDB)) - return + return nil } tablesRestored := make([]string, 0, len(originDatabase.Tables)) @@ -179,15 +103,15 @@ func (rc *Client) RestoreSystemSchemas(ctx context.Context, f filter.Filter) { logutil.ShortError(err), zap.Stringer("table", tableName), ) + return errors.Annotatef(err, "error during merging temporary tables into system tables, table: %s", tableName) } tablesRestored = append(tablesRestored, tableName.L) } } - if err := rc.afterSystemTablesReplaced(tablesRestored); err != nil { - for _, e := range multierr.Errors(err) { - log.Warn("error during reconfigurating the system tables", zap.String("database", sysDB), logutil.ShortError(e)) - } + if err := rc.afterSystemTablesReplaced(ctx, tablesRestored); err != nil { + return errors.Annotate(err, "error during extra works after system tables replaced") } + return nil } // database is a record of a database. @@ -218,19 +142,23 @@ func (rc *Client) getDatabaseByName(name string) (*database, bool) { // afterSystemTablesReplaced do some extra work for special system tables. // e.g. after inserting to the table mysql.user, we must execute `FLUSH PRIVILEGES` to allow it take effect. -func (rc *Client) afterSystemTablesReplaced(tables []string) error { +func (rc *Client) afterSystemTablesReplaced(ctx context.Context, tables []string) error { var err error for _, table := range tables { if table == "user" { - if rc.fullClusterRestore { + if serr := rc.dom.NotifyUpdatePrivilege(); serr != nil { + log.Warn("failed to flush privileges, please manually execute `FLUSH PRIVILEGES`") + err = multierr.Append(err, berrors.ErrUnknown.Wrap(serr).GenWithStack("failed to flush privileges")) + } else { log.Info("privilege system table restored, please reconnect to make it effective") - err = rc.dom.NotifyUpdatePrivilege() + } + } else if table == "bind_info" { + if serr := rc.db.se.Execute(ctx, bindinfo.StmtRemoveDuplicatedPseudoBinding); serr != nil { + log.Warn("failed to delete duplicated pseudo binding", zap.Error(serr)) + err = multierr.Append(err, + berrors.ErrUnknown.Wrap(serr).GenWithStack("failed to delete duplicated pseudo binding %s", bindinfo.StmtRemoveDuplicatedPseudoBinding)) } else { - // to make it compatible with older version - // todo: should we allow restore system table in non-fresh cluster in later br version? - // if we don't, we can check it at first place. - err = multierr.Append(err, errors.Annotatef(berrors.ErrUnsupportedSystemTable, - "restored user info may not take effect, until you should execute `FLUSH PRIVILEGES` manually")) + log.Info("success to remove duplicated pseudo binding") } } } @@ -268,12 +196,11 @@ func (rc *Client) replaceTemporaryTableToSystable(ctx context.Context, ti *model // 1.5 ) (Optional) The UPDATE statement sometimes costs, the whole system tables restore step can be place into the restore pipeline. // 2 ) Deprecate the origin interface for backing up statistics. if isStatsTable(tableName) { - return berrors.ErrUnsupportedSystemTable.GenWithStack("restoring stats via `mysql` schema isn't support yet: " + - "the table ID is out-of-date and may corrupt existing statistics") + return nil } if isUnrecoverableTable(tableName) { - return berrors.ErrUnsupportedSystemTable.GenWithStack("restoring unsupported `mysql` schema table") + return nil } // Currently, we don't support restore resource group metadata, so we need to @@ -293,19 +220,6 @@ func (rc *Client) replaceTemporaryTableToSystable(ctx context.Context, ti *model } if db.ExistingTables[tableName] != nil { - whereNotClause := "" - if rc.fullClusterRestore && sysPrivilegeTableMap[tableName] != "" { - // cloud_admin is a special user on tidb cloud, need to skip it. - /* #nosec G202: SQL string concatenation */ - whereNotClause = fmt.Sprintf("WHERE NOT "+sysPrivilegeTableMap[tableName], cloudAdminUser) - log.Info("full cluster restore, delete existing data", - zap.String("table", tableName), zap.Stringer("schema", db.Name)) - deleteSQL := fmt.Sprintf("DELETE FROM %s %s;", - utils.EncloseDBAndTable(db.Name.L, tableName), whereNotClause) - if err := execSQL(deleteSQL); err != nil { - return err - } - } log.Info("replace into existing table", zap.String("table", tableName), zap.Stringer("schema", db.Name)) @@ -315,11 +229,10 @@ func (rc *Client) replaceTemporaryTableToSystable(ctx context.Context, ti *model columnNames = append(columnNames, utils.EncloseName(col.Name.L)) } colListStr := strings.Join(columnNames, ",") - replaceIntoSQL := fmt.Sprintf("REPLACE INTO %s(%s) SELECT %s FROM %s %s;", + replaceIntoSQL := fmt.Sprintf("REPLACE INTO %s(%s) SELECT %s FROM %s;", utils.EncloseDBAndTable(db.Name.L, tableName), colListStr, colListStr, - utils.EncloseDBAndTable(db.TemporaryName.L, tableName), - whereNotClause) + utils.EncloseDBAndTable(db.TemporaryName.L, tableName)) return execSQL(replaceIntoSQL) } diff --git a/br/pkg/restore/systable_restore_test.go b/br/pkg/restore/systable_restore_test.go deleted file mode 100644 index 0b1c089048297..0000000000000 --- a/br/pkg/restore/systable_restore_test.go +++ /dev/null @@ -1,72 +0,0 @@ -// Copyright 2020 PingCAP, Inc. Licensed under Apache-2.0. - -package restore - -import ( - "regexp" - "testing" - - "github.com/pingcap/tidb/br/pkg/utils" - "github.com/pingcap/tidb/pkg/parser/model" - "github.com/stretchr/testify/require" -) - -func testTableInfo(name string) *model.TableInfo { - return &model.TableInfo{ - Name: model.NewCIStr(name), - } -} - -func TestGenerateResetSQL(t *testing.T) { - // case #1: ignore non-mysql databases - mockDB := &database{ - ExistingTables: map[string]*model.TableInfo{}, - Name: model.NewCIStr("non-mysql"), - TemporaryName: utils.TemporaryDBName("non-mysql"), - } - for name := range sysPrivilegeTableMap { - mockDB.ExistingTables[name] = testTableInfo(name) - } - resetUsers := []string{"cloud_admin", "root"} - require.Equal(t, 0, len(generateResetSQLs(mockDB, resetUsers))) - - // case #2: ignore non expected table - mockDB = &database{ - ExistingTables: map[string]*model.TableInfo{}, - Name: model.NewCIStr("mysql"), - TemporaryName: utils.TemporaryDBName("mysql"), - } - for name := range sysPrivilegeTableMap { - name += "non_available" - mockDB.ExistingTables[name] = testTableInfo(name) - } - resetUsers = []string{"cloud_admin", "root"} - require.Equal(t, 0, len(generateResetSQLs(mockDB, resetUsers))) - - // case #3: only reset cloud admin account - for name := range sysPrivilegeTableMap { - mockDB.ExistingTables[name] = testTableInfo(name) - } - resetUsers = []string{"cloud_admin"} - sqls := generateResetSQLs(mockDB, resetUsers) - require.Equal(t, 8, len(sqls)) - for _, sql := range sqls { - // for cloud_admin we only generate DELETE sql - require.Regexp(t, regexp.MustCompile("DELETE*"), sql) - } - - // case #4: reset cloud admin/other account - resetUsers = []string{"cloud_admin", "cloud_other"} - sqls = generateResetSQLs(mockDB, resetUsers) - require.Equal(t, 16, len(sqls)) - for _, sql := range sqls { - // for cloud_admin/cloud_other we only generate DELETE sql - require.Regexp(t, regexp.MustCompile("DELETE*"), sql) - } - - // case #5: reset cloud admin && root account - resetUsers = []string{"cloud_admin", "root"} - sqls = generateResetSQLs(mockDB, resetUsers) - // 8 DELETE sqls for cloud admin and 1 UPDATE sql for root - require.Equal(t, 9, len(sqls)) -} diff --git a/br/pkg/restore/util.go b/br/pkg/restore/util.go index a94aa4f24f29c..f71d1616d5397 100644 --- a/br/pkg/restore/util.go +++ b/br/pkg/restore/util.go @@ -43,8 +43,8 @@ type AppliedFile interface { GetEndKey() []byte } -// getTableIDMap creates a map maping old tableID to new tableID. -func getTableIDMap(newTable, oldTable *model.TableInfo) map[int64]int64 { +// getPartitionIDMap creates a map maping old physical ID to new physical ID. +func getPartitionIDMap(newTable, oldTable *model.TableInfo) map[int64]int64 { tableIDMap := make(map[int64]int64) if oldTable.Partition != nil && newTable.Partition != nil { @@ -60,6 +60,12 @@ func getTableIDMap(newTable, oldTable *model.TableInfo) map[int64]int64 { } } + return tableIDMap +} + +// getTableIDMap creates a map maping old tableID to new tableID. +func getTableIDMap(newTable, oldTable *model.TableInfo) map[int64]int64 { + tableIDMap := getPartitionIDMap(newTable, oldTable) tableIDMap[oldTable.ID] = newTable.ID return tableIDMap } @@ -249,6 +255,7 @@ func GetSSTMetaFromFile( } log.Debug("get sstMeta", + logutil.Region(region), logutil.File(file), logutil.Key("startKey", rangeStart), logutil.Key("endKey", rangeEnd)) @@ -275,7 +282,9 @@ func makeDBPool(size uint, dbFactory func() (*DB, error)) ([]*DB, error) { if e != nil { return dbPool, e } - dbPool = append(dbPool, db) + if db != nil { + dbPool = append(dbPool, db) + } } return dbPool, nil } @@ -502,9 +511,14 @@ func SplitRanges( updateCh glue.Progress, isRawKv bool, ) error { - splitter := NewRegionSplitter(split.NewSplitClient(client.GetPDClient(), client.GetTLSConfig(), isRawKv)) - - return splitter.Split(ctx, ranges, rewriteRules, isRawKv, func(keys [][]byte) { + splitter := NewRegionSplitter(split.NewSplitClient( + client.GetPDClient(), + client.pdHTTPClient, + client.GetTLSConfig(), + isRawKv, + )) + + return splitter.ExecuteSplit(ctx, ranges, rewriteRules, client.GetStoreCount(), client.GetGranularity(), isRawKv, func(keys [][]byte) { for range keys { updateCh.Inc() } diff --git a/br/pkg/restore/util_test.go b/br/pkg/restore/util_test.go index 43c16a656ed73..2740594a79cf1 100644 --- a/br/pkg/restore/util_test.go +++ b/br/pkg/restore/util_test.go @@ -282,6 +282,10 @@ func TestPaginateScanRegion(t *testing.T) { require.NoError(t, err) require.Equal(t, regions[1:2], batch) + _, err = split.PaginateScanRegion( + ctx, NewTestClient(stores, regionMap, 0), regions[1].Region.EndKey, regions[1].Region.EndKey, 3) + require.Error(t, err) + _, err = split.PaginateScanRegion(ctx, NewTestClient(stores, regionMap, 0), []byte{2}, []byte{1}, 3) require.Error(t, err) require.True(t, berrors.ErrRestoreInvalidRange.Equal(err)) diff --git a/br/pkg/rtree/main_test.go b/br/pkg/rtree/main_test.go index 8a562ca4ee33a..b0ed04a7f30af 100644 --- a/br/pkg/rtree/main_test.go +++ b/br/pkg/rtree/main_test.go @@ -25,6 +25,7 @@ func TestMain(m *testing.M) { testsetup.SetupForCommonTest() opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), diff --git a/br/pkg/rtree/rtree.go b/br/pkg/rtree/rtree.go index 27f2684d5482f..ac0f69648eb17 100644 --- a/br/pkg/rtree/rtree.go +++ b/br/pkg/rtree/rtree.go @@ -16,6 +16,7 @@ type Range struct { StartKey []byte EndKey []byte Files []*backuppb.File + Size uint64 } // BytesAndKeys returns total bytes and keys in a range. diff --git a/br/pkg/storage/BUILD.bazel b/br/pkg/storage/BUILD.bazel index ad58e18200e58..532d523f596e0 100644 --- a/br/pkg/storage/BUILD.bazel +++ b/br/pkg/storage/BUILD.bazel @@ -7,12 +7,14 @@ go_library( "compress.go", "flags.go", "gcs.go", + "gcs_extra.go", "hdfs.go", "helper.go", "ks3.go", "local.go", "local_unix.go", "local_windows.go", + "locking.go", "memstore.go", "noop.go", "parse.go", @@ -28,6 +30,7 @@ go_library( "//br/pkg/logutil", "//pkg/sessionctx/variable", "//pkg/util/intest", + "//pkg/util/prefetch", "@com_github_aliyun_alibaba_cloud_sdk_go//sdk/auth/credentials", "@com_github_aliyun_alibaba_cloud_sdk_go//sdk/auth/credentials/providers", "@com_github_aws_aws_sdk_go//aws", @@ -48,6 +51,7 @@ go_library( "@com_github_azure_azure_sdk_for_go_sdk_storage_azblob//bloberror", "@com_github_azure_azure_sdk_for_go_sdk_storage_azblob//blockblob", "@com_github_azure_azure_sdk_for_go_sdk_storage_azblob//container", + "@com_github_go_resty_resty_v2//:resty", "@com_github_google_uuid//:uuid", "@com_github_klauspost_compress//gzip", "@com_github_klauspost_compress//snappy", @@ -63,8 +67,10 @@ go_library( "@com_github_pingcap_log//:log", "@com_github_spf13_pflag//:pflag", "@com_google_cloud_go_storage//:storage", + "@org_golang_google_api//googleapi", "@org_golang_google_api//iterator", "@org_golang_google_api//option", + "@org_golang_google_api//transport/http", "@org_golang_x_oauth2//google", "@org_uber_go_atomic//:atomic", "@org_uber_go_zap//:zap", @@ -79,6 +85,7 @@ go_test( "compress_test.go", "gcs_test.go", "local_test.go", + "locking_test.go", "memstore_test.go", "parse_test.go", "s3_test.go", @@ -90,6 +97,7 @@ go_test( shard_count = 50, deps = [ "//br/pkg/mock", + "//pkg/util/intest", "@com_github_aws_aws_sdk_go//aws", "@com_github_aws_aws_sdk_go//aws/awserr", "@com_github_aws_aws_sdk_go//aws/request", diff --git a/br/pkg/storage/gcs.go b/br/pkg/storage/gcs.go index 5ee83f286155f..cd21f0e43450a 100644 --- a/br/pkg/storage/gcs.go +++ b/br/pkg/storage/gcs.go @@ -5,7 +5,9 @@ package storage import ( "bytes" "context" + goerrors "errors" "io" + "net/http" "os" "path" "strings" @@ -15,11 +17,14 @@ import ( backuppb "github.com/pingcap/kvproto/pkg/brpb" "github.com/pingcap/log" berrors "github.com/pingcap/tidb/br/pkg/errors" + "github.com/pingcap/tidb/pkg/util/intest" "github.com/spf13/pflag" "go.uber.org/zap" "golang.org/x/oauth2/google" + "google.golang.org/api/googleapi" "google.golang.org/api/iterator" "google.golang.org/api/option" + htransport "google.golang.org/api/transport/http" ) const ( @@ -96,6 +101,7 @@ func (options *GCSBackendOptions) parseFromFlags(flags *pflag.FlagSet) error { type GCSStorage struct { gcs *backuppb.GCS bucket *storage.BucketHandle + cli *storage.Client } // GetBucketHandle gets the handle to the GCS API on the bucket. @@ -269,12 +275,29 @@ func (s *GCSStorage) URI() string { } // Create implements ExternalStorage interface. -func (s *GCSStorage) Create(ctx context.Context, name string, _ *WriterOption) (ExternalFileWriter, error) { - object := s.objectName(name) - wc := s.bucket.Object(object).NewWriter(ctx) - wc.StorageClass = s.gcs.StorageClass - wc.PredefinedACL = s.gcs.PredefinedAcl - return newFlushStorageWriter(wc, &emptyFlusher{}, wc), nil +func (s *GCSStorage) Create(ctx context.Context, name string, wo *WriterOption) (ExternalFileWriter, error) { + // NewGCSWriter requires real testing environment on Google Cloud. + mockGCS := intest.InTest && strings.Contains(s.gcs.GetEndpoint(), "127.0.0.1") + if wo == nil || wo.Concurrency <= 1 || mockGCS { + object := s.objectName(name) + wc := s.bucket.Object(object).NewWriter(ctx) + wc.StorageClass = s.gcs.StorageClass + wc.PredefinedACL = s.gcs.PredefinedAcl + return newFlushStorageWriter(wc, &emptyFlusher{}, wc), nil + } + uri := s.objectName(name) + // 5MB is the minimum part size for GCS. + partSize := int64(gcsMinimumChunkSize) + if wo.PartSize > partSize { + partSize = wo.PartSize + } + w, err := NewGCSWriter(ctx, s.cli, uri, partSize, wo.Concurrency, s.gcs.Bucket) + if err != nil { + return nil, errors.Trace(err) + } + fw := newFlushStorageWriter(w, &emptyFlusher{}, w) + bw := newBufferedWriter(fw, int(partSize), NoCompression) + return bw, nil } // Rename file name from oldFileName to newFileName. @@ -290,6 +313,9 @@ func (s *GCSStorage) Rename(ctx context.Context, oldFileName, newFileName string return s.DeleteFile(ctx, oldFileName) } +// used in tests +var mustReportCredErr = false + // NewGCSStorage creates a GCS external storage implementation. func NewGCSStorage(ctx context.Context, gcs *backuppb.GCS, opts *ExternalStorageOptions) (*GCSStorage, error) { var clientOps []option.ClientOption @@ -299,6 +325,10 @@ func NewGCSStorage(ctx context.Context, gcs *backuppb.GCS, opts *ExternalStorage if gcs.CredentialsBlob == "" { creds, err := google.FindDefaultCredentials(ctx, storage.ScopeReadWrite) if err != nil { + if intest.InTest && !mustReportCredErr { + clientOps = append(clientOps, option.WithoutAuthentication()) + goto skipHandleCred + } return nil, errors.Annotatef(berrors.ErrStorageInvalidConfig, "%v Or you should provide '--gcs.credentials_file'", err) } if opts.SendCredentials { @@ -315,20 +345,34 @@ func NewGCSStorage(ctx context.Context, gcs *backuppb.GCS, opts *ExternalStorage clientOps = append(clientOps, option.WithCredentialsJSON([]byte(gcs.GetCredentialsBlob()))) } } +skipHandleCred: if gcs.Endpoint != "" { clientOps = append(clientOps, option.WithEndpoint(gcs.Endpoint)) } - // the HTTPClient should has credential, currently the HTTPClient only has the http.Transport. - // So we remove the HTTPClient in the storage.New(). - // Issue: https: //github.com/pingcap/tidb/issues/47022 + if opts.HTTPClient != nil { + // see https://github.com/pingcap/tidb/issues/47022#issuecomment-1722913455 + // https://www.googleapis.com/auth/cloud-platform must be set to use service_account + // type of credential-file. + newTransport, err := htransport.NewTransport(ctx, opts.HTTPClient.Transport, + append(clientOps, option.WithScopes(storage.ScopeFullControl, "https://www.googleapis.com/auth/cloud-platform"))...) + if err != nil { + if intest.InTest && !mustReportCredErr { + goto skipHandleTransport + } + return nil, errors.Trace(err) + } + opts.HTTPClient.Transport = newTransport + skipHandleTransport: clientOps = append(clientOps, option.WithHTTPClient(opts.HTTPClient)) } + client, err := storage.NewClient(ctx, clientOps...) if err != nil { return nil, errors.Trace(err) } + client.SetRetry(storage.WithErrorFunc(shouldRetry)) if !opts.SendCredentials { // Clear the credentials if exists so that they will not be sent to TiKV @@ -336,39 +380,22 @@ func NewGCSStorage(ctx context.Context, gcs *backuppb.GCS, opts *ExternalStorage } bucket := client.Bucket(gcs.Bucket) - // check whether it's a bug before #647, to solve case #2 - // If the storage is set as gcs://bucket/prefix/, - // the backupmeta is written correctly to gcs://bucket/prefix/backupmeta, - // but the SSTs are written wrongly to gcs://bucket/prefix//*.sst (note the extra slash). - // see details about case 2 at https://github.com/pingcap/br/issues/675#issuecomment-753780742 - sstInPrefix := hasSSTFiles(ctx, bucket, gcs.Prefix) - sstInPrefixSlash := hasSSTFiles(ctx, bucket, gcs.Prefix+"//") - if sstInPrefixSlash && !sstInPrefix { - // This is a old bug, but we must make it compatible. - // so we need find sst in slash directory - gcs.Prefix += "//" - } - return &GCSStorage{gcs: gcs, bucket: bucket}, nil + return &GCSStorage{gcs: gcs, bucket: bucket, cli: client}, nil } -func hasSSTFiles(ctx context.Context, bucket *storage.BucketHandle, prefix string) bool { - query := storage.Query{Prefix: prefix} - _ = query.SetAttrSelection([]string{"Name"}) - it := bucket.Objects(ctx, &query) - for { - attrs, err := it.Next() - if err == iterator.Done { // nolint:errorlint - break - } - if err != nil { - log.Warn("failed to list objects on gcs, will use default value for `prefix`", zap.Error(err)) - break - } - if strings.HasSuffix(attrs.Name, ".sst") { - log.Info("sst file found in prefix slash", zap.String("file", attrs.Name)) +func shouldRetry(err error) bool { + if storage.ShouldRetry(err) { + return true + } + + // workaround for https://github.com/googleapis/google-cloud-go/issues/9262 + if e := (&googleapi.Error{}); goerrors.As(err, &e) { + if e.Code == 401 && strings.Contains(e.Message, "Authentication required.") { + log.Warn("retrying gcs request due to internal authentication error", zap.Error(err)) return true } } + return false } @@ -465,3 +492,16 @@ func (r *gcsObjectReader) Seek(offset int64, whence int) (int64, error) { func (r *gcsObjectReader) GetFileSize() (int64, error) { return r.totalSize, nil } + +// gcsHttpClientForThroughput returns a base http client for GCS that is optimized +// for throughput. +func gcsHttpClientForThroughput() *http.Client { + // http2 will reuse the connection to read multiple files, which is + // very slow, the speed of reading multiple files concurrently is about the + // same speed as reading a single file. + // So we disable keepalive here to use multiple connections to read files. + // open a new connection takes about 20~50ms, which is acceptable. + transport, _ := CloneDefaultHttpTransport() + transport.DisableKeepAlives = true + return &http.Client{Transport: transport} +} diff --git a/br/pkg/storage/gcs_extra.go b/br/pkg/storage/gcs_extra.go new file mode 100644 index 0000000000000..0a8c5763fff62 --- /dev/null +++ b/br/pkg/storage/gcs_extra.go @@ -0,0 +1,419 @@ +// Copyright 2023 PingCAP, 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. + +// Learned from https://github.com/liqiuqing/gcsmpu + +package storage + +import ( + "bytes" + "context" + "encoding/xml" + "fmt" + "net" + "net/http" + "net/url" + "runtime" + "slices" + "strconv" + "sync" + "time" + + "cloud.google.com/go/storage" + "github.com/go-resty/resty/v2" + "go.uber.org/atomic" +) + +// GCSWriter uses XML multipart upload API to upload a single file. +// https://cloud.google.com/storage/docs/multipart-uploads. +// GCSWriter will attempt to cancel uploads that fail due to an exception. +// If the upload fails in a way that precludes cancellation, such as a +// hardware failure, process termination, or power outage, then the incomplete +// upload may persist indefinitely. To mitigate this, set the +// `AbortIncompleteMultipartUpload` with a nonzero `Age` in bucket lifecycle +// rules, or refer to the XML API documentation linked above to learn more +// about how to list and delete individual downloads. +type GCSWriter struct { + uploadBase + mutex sync.Mutex + xmlMPUParts []*xmlMPUPart + wg sync.WaitGroup + err atomic.Error + chunkSize int64 + workers int + totalSize int64 + uploadID string + chunkCh chan chunk + curPart int +} + +// NewGCSWriter returns a GCSWriter which uses GCS multipart upload API behind the scene. +func NewGCSWriter( + ctx context.Context, + cli *storage.Client, + uri string, + partSize int64, + parallelCnt int, + bucketName string, +) (*GCSWriter, error) { + if partSize < gcsMinimumChunkSize || partSize > gcsMaximumChunkSize { + return nil, fmt.Errorf( + "invalid chunk size: %d. Chunk size must be between %d and %d", + partSize, gcsMinimumChunkSize, gcsMaximumChunkSize, + ) + } + + w := &GCSWriter{ + uploadBase: uploadBase{ + ctx: ctx, + cli: cli, + bucket: bucketName, + blob: uri, + retry: defaultRetry, + signedURLExpiry: defaultSignedURLExpiry, + }, + chunkSize: partSize, + workers: parallelCnt, + } + if err := w.init(); err != nil { + return nil, fmt.Errorf("failed to initiate GCSWriter: %w", err) + } + + return w, nil +} + +func (w *GCSWriter) init() error { + opts := &storage.SignedURLOptions{ + Scheme: storage.SigningSchemeV4, + Method: "POST", + Expires: time.Now().Add(w.signedURLExpiry), + QueryParameters: url.Values{mpuInitiateQuery: []string{""}}, + } + u, err := w.cli.Bucket(w.bucket).SignedURL(w.blob, opts) + if err != nil { + return fmt.Errorf("Bucket(%q).SignedURL: %s", w.bucket, err) + } + + client := resty.New() + resp, err := client.R().Post(u) + if err != nil { + return fmt.Errorf("POST request failed: %s", err) + } + + if resp.StatusCode() != http.StatusOK { + return fmt.Errorf("POST request returned non-OK status: %d", resp.StatusCode()) + } + body := resp.Body() + + result := InitiateMultipartUploadResult{} + err = xml.Unmarshal(body, &result) + if err != nil { + return fmt.Errorf("failed to unmarshal response body: %s", err) + } + + uploadID := result.UploadId + w.uploadID = uploadID + w.chunkCh = make(chan chunk) + for i := 0; i < w.workers; i++ { + w.wg.Add(1) + go w.readChunk(w.chunkCh) + } + w.curPart = 1 + return nil +} + +func (w *GCSWriter) readChunk(ch chan chunk) { + defer w.wg.Done() + for { + data, ok := <-ch + if !ok { + break + } + + select { + case <-w.ctx.Done(): + data.cleanup() + w.err.CompareAndSwap(nil, w.ctx.Err()) + default: + part := &xmlMPUPart{ + uploadBase: w.uploadBase, + uploadID: w.uploadID, + buf: data.buf, + partNumber: data.num, + } + if w.err.Load() == nil { + if err := part.Upload(); err != nil { + w.err.Store(err) + } + } + part.buf = nil + w.appendMPUPart(part) + data.cleanup() + } + } +} + +// Write uploads given bytes as a part to Google Cloud Storage. Write is not +// concurrent safe. +func (w *GCSWriter) Write(p []byte) (n int, err error) { + if w.curPart > gcsMaximumParts { + err = fmt.Errorf("exceed maximum parts %d", gcsMaximumParts) + if w.err.Load() == nil { + w.err.Store(err) + } + return 0, err + } + buf := make([]byte, len(p)) + copy(buf, p) + w.chunkCh <- chunk{ + buf: buf, + num: w.curPart, + cleanup: func() {}, + } + w.curPart++ + return len(p), nil +} + +// Close finishes the upload. +func (w *GCSWriter) Close() error { + close(w.chunkCh) + w.wg.Wait() + + if err := w.err.Load(); err != nil { + return err + } + + err := w.finalizeXMLMPU() + if err == nil { + return nil + } + errC := w.cancel() + if errC != nil { + return fmt.Errorf("failed to finalize multipart upload: %s, Failed to cancel multipart upload: %s", err, errC) + } + return fmt.Errorf("failed to finalize multipart upload: %s", err) +} + +const ( + mpuInitiateQuery = "uploads" + mpuPartNumberQuery = "partNumber" + mpuUploadIDQuery = "uploadId" +) + +type uploadBase struct { + cli *storage.Client + ctx context.Context + bucket string + blob string + retry int + signedURLExpiry time.Duration +} + +const ( + defaultRetry = 3 + defaultSignedURLExpiry = 6 * time.Hour + + gcsMinimumChunkSize = 5 * 1024 * 1024 // 5 MB + gcsMaximumChunkSize = 5 * 1024 * 1024 * 1024 // 5 GB + gcsMaximumParts = 10000 +) + +type InitiateMultipartUploadResult struct { + XMLName xml.Name `xml:"InitiateMultipartUploadResult"` + Text string `xml:",chardata"` + Xmlns string `xml:"xmlns,attr"` + Bucket string `xml:"Bucket"` + Key string `xml:"Key"` + UploadId string `xml:"UploadId"` +} + +type Part struct { + Text string `xml:",chardata"` + PartNumber int `xml:"PartNumber"` + ETag string `xml:"ETag"` +} + +type CompleteMultipartUpload struct { + XMLName xml.Name `xml:"CompleteMultipartUpload"` + Text string `xml:",chardata"` + Parts []Part `xml:"Part"` +} + +func (w *GCSWriter) finalizeXMLMPU() error { + finalXMLRoot := CompleteMultipartUpload{ + Parts: make([]Part, 0, len(w.xmlMPUParts)), + } + slices.SortFunc(w.xmlMPUParts, func(a, b *xmlMPUPart) int { + return a.partNumber - b.partNumber + }) + for _, part := range w.xmlMPUParts { + part := Part{ + PartNumber: part.partNumber, + ETag: part.etag, + } + finalXMLRoot.Parts = append(finalXMLRoot.Parts, part) + } + + xmlBytes, err := xml.Marshal(finalXMLRoot) + if err != nil { + return fmt.Errorf("failed to encode XML: %v", err) + } + + opts := &storage.SignedURLOptions{ + Scheme: storage.SigningSchemeV4, + Method: "POST", + Expires: time.Now().Add(w.signedURLExpiry), + QueryParameters: url.Values{mpuUploadIDQuery: []string{w.uploadID}}, + } + u, err := w.cli.Bucket(w.bucket).SignedURL(w.blob, opts) + if err != nil { + return fmt.Errorf("Bucket(%q).SignedURL: %s", w.bucket, err) + } + + client := resty.New() + resp, err := client.R().SetBody(xmlBytes).Post(u) + if err != nil { + return fmt.Errorf("POST request failed: %s", err) + } + + if resp.StatusCode() != http.StatusOK { + return fmt.Errorf("POST request returned non-OK status: %d, body: %s", resp.StatusCode(), resp.String()) + } + return nil +} + +type chunk struct { + buf []byte + num int + cleanup func() +} + +func (w *GCSWriter) appendMPUPart(part *xmlMPUPart) { + w.mutex.Lock() + defer w.mutex.Unlock() + + w.xmlMPUParts = append(w.xmlMPUParts, part) +} + +func (w *GCSWriter) cancel() error { + opts := &storage.SignedURLOptions{ + Scheme: storage.SigningSchemeV4, + Method: "DELETE", + Expires: time.Now().Add(w.signedURLExpiry), + QueryParameters: url.Values{mpuUploadIDQuery: []string{w.uploadID}}, + } + u, err := w.cli.Bucket(w.bucket).SignedURL(w.blob, opts) + if err != nil { + return fmt.Errorf("Bucket(%q).SignedURL: %s", w.bucket, err) + } + + client := resty.New() + resp, err := client.R().Delete(u) + if err != nil { + return fmt.Errorf("DELETE request failed: %s", err) + } + + if resp.StatusCode() != http.StatusNoContent { + return fmt.Errorf("DELETE request returned non-204 status: %d", resp.StatusCode()) + } + + return nil +} + +type xmlMPUPart struct { + uploadBase + buf []byte + uploadID string + partNumber int + etag string +} + +func (p *xmlMPUPart) Clone() *xmlMPUPart { + return &xmlMPUPart{ + uploadBase: p.uploadBase, + uploadID: p.uploadID, + buf: p.buf, + partNumber: p.partNumber, + } +} + +func (p *xmlMPUPart) Upload() error { + var err error + for i := 0; i < p.retry; i++ { + err = p.upload() + if err == nil { + return nil + } + } + + return fmt.Errorf("failed to upload part %d: %w", p.partNumber, err) +} + +func (p *xmlMPUPart) upload() error { + opts := &storage.SignedURLOptions{ + Scheme: storage.SigningSchemeV4, + Method: "PUT", + Expires: time.Now().Add(p.signedURLExpiry), + QueryParameters: url.Values{ + mpuUploadIDQuery: []string{p.uploadID}, + mpuPartNumberQuery: []string{strconv.Itoa(p.partNumber)}, + }, + } + + u, err := p.cli.Bucket(p.bucket).SignedURL(p.blob, opts) + if err != nil { + return fmt.Errorf("Bucket(%q).SignedURL: %s", p.bucket, err) + } + + req, err := http.NewRequest("PUT", u, bytes.NewReader(p.buf)) + if err != nil { + return fmt.Errorf("PUT request failed: %s", err) + } + req = req.WithContext(p.ctx) + + client := &http.Client{ + Transport: createTransport(nil), + } + resp, err := client.Do(req) + if err != nil { + return fmt.Errorf("PUT request failed: %s", err) + } + defer resp.Body.Close() + + p.etag = resp.Header.Get("ETag") + + if resp.StatusCode != http.StatusOK { + return fmt.Errorf("PUT request returned non-OK status: %d", resp.StatusCode) + } + return nil +} + +func createTransport(localAddr net.Addr) *http.Transport { + dialer := &net.Dialer{ + Timeout: 30 * time.Second, + KeepAlive: 30 * time.Second, + } + if localAddr != nil { + dialer.LocalAddr = localAddr + } + return &http.Transport{ + Proxy: http.ProxyFromEnvironment, + DialContext: dialer.DialContext, + MaxIdleConns: 100, + IdleConnTimeout: 90 * time.Second, + TLSHandshakeTimeout: 10 * time.Second, + ExpectContinueTimeout: 1 * time.Second, + MaxIdleConnsPerHost: runtime.GOMAXPROCS(0) + 1, + } +} diff --git a/br/pkg/storage/gcs_test.go b/br/pkg/storage/gcs_test.go index 4b299adcdb760..6f9cbfa7ef687 100644 --- a/br/pkg/storage/gcs_test.go +++ b/br/pkg/storage/gcs_test.go @@ -3,7 +3,10 @@ package storage import ( + "bytes" "context" + "crypto/rand" + "flag" "fmt" "io" "os" @@ -11,10 +14,12 @@ import ( "github.com/fsouza/fake-gcs-server/fakestorage" backuppb "github.com/pingcap/kvproto/pkg/brpb" + "github.com/pingcap/tidb/pkg/util/intest" "github.com/stretchr/testify/require" ) func TestGCS(t *testing.T) { + require.True(t, intest.InTest) ctx := context.Background() opts := fakestorage.Options{ @@ -255,6 +260,7 @@ func TestGCS(t *testing.T) { } func TestNewGCSStorage(t *testing.T) { + require.True(t, intest.InTest) ctx := context.Background() opts := fakestorage.Options{ @@ -299,7 +305,7 @@ func TestNewGCSStorage(t *testing.T) { require.NoError(t, err) require.Equal(t, "", gcs.CredentialsBlob) } - + mustReportCredErr = true { fakeCredentialsFile, err := os.CreateTemp(testDir, "fakeCredentialsFile") require.NoError(t, err) @@ -379,7 +385,22 @@ func TestNewGCSStorage(t *testing.T) { }) require.Error(t, err) } - + // without http client + { + gcs := &backuppb.GCS{ + Bucket: bucketName, + Prefix: "a/b", + StorageClass: "NEARLINE", + PredefinedAcl: "private", + CredentialsBlob: `{"type": "service_account"}`, + } + _, err := NewGCSStorage(ctx, gcs, &ExternalStorageOptions{ + SendCredentials: false, + CheckPermissions: []Permission{AccessBuckets}, + }) + require.NoError(t, err) + } + mustReportCredErr = false { gcs := &backuppb.GCS{ Bucket: bucketName, @@ -400,6 +421,7 @@ func TestNewGCSStorage(t *testing.T) { } func TestReadRange(t *testing.T) { + require.True(t, intest.InTest) ctx := context.Background() opts := fakestorage.Options{ @@ -441,3 +463,39 @@ func TestReadRange(t *testing.T) { require.NoError(t, err) require.Equal(t, []byte("234"), content[:n]) } + +var testingStorageURI = flag.String("testing-storage-uri", "", "the URI of the storage used for testing") + +func openTestingStorage(t *testing.T) ExternalStorage { + if *testingStorageURI == "" { + t.Skip("testingStorageURI is not set") + } + s, err := NewFromURL(context.Background(), *testingStorageURI) + require.NoError(t, err) + return s +} + +func TestMultiPartUpload(t *testing.T) { + ctx := context.Background() + + s := openTestingStorage(t) + if _, ok := s.(*GCSStorage); !ok { + t.Skipf("only test GCSStorage, got %T", s) + } + + filename := "TestMultiPartUpload" + // just get some random content, use any seed is enough + data := make([]byte, 100*1024*1024) + rand.Read(data) + w, err := s.Create(ctx, filename, &WriterOption{Concurrency: 10}) + require.NoError(t, err) + _, err = w.Write(ctx, data) + require.NoError(t, err) + err = w.Close(ctx) + require.NoError(t, err) + + got, err := s.ReadFile(ctx, filename) + require.NoError(t, err) + cmp := bytes.Compare(data, got) + require.Zero(t, cmp) +} diff --git a/br/pkg/storage/helper.go b/br/pkg/storage/helper.go index 4f09e341e0067..e93292a3a6191 100644 --- a/br/pkg/storage/helper.go +++ b/br/pkg/storage/helper.go @@ -6,7 +6,6 @@ import ( "context" "github.com/pingcap/tidb/pkg/sessionctx/variable" - "github.com/pingcap/tidb/pkg/util/intest" ) func init() { @@ -25,7 +24,6 @@ func ValidateCloudStorageURI(ctx context.Context, uri string) error { GetObject, AccessBuckets, }, - NoCredentials: intest.InTest, }) return err } diff --git a/br/pkg/storage/ks3.go b/br/pkg/storage/ks3.go index 798340c21f244..83e42f0d094d3 100644 --- a/br/pkg/storage/ks3.go +++ b/br/pkg/storage/ks3.go @@ -22,7 +22,6 @@ import ( "path" "strings" "sync" - "time" "github.com/google/uuid" "github.com/ks3sdklib/aws-sdk-go/aws" @@ -40,8 +39,7 @@ import ( const ( // ks3 sdk does not expose context, we use hardcoded timeout for network request - ks3HTTPDeadline = 5 * time.Minute - ks3SDKProvider = "ks3-sdk" + ks3SDKProvider = "ks3-sdk" ) // KS3Storage acts almost same as S3Storage except it's used for kingsoft s3. @@ -52,7 +50,7 @@ type KS3Storage struct { // NewKS3Storage initialize a new s3 storage for metadata. func NewKS3Storage( - _ context.Context, + ctx context.Context, backend *backuppb.S3, opts *ExternalStorageOptions, ) (obj *KS3Storage, errRet error) { @@ -71,10 +69,6 @@ func NewKS3Storage( awsConfig.HTTPClient = opts.HTTPClient } - // due to ks3 does not use context API, we should manually set the deadline - // for HTTP client - awsConfig.HTTPClient.Timeout = ks3HTTPDeadline - if qs.AccessKey != "" && qs.SecretAccessKey != "" { awsConfig.Credentials = credentials.NewStaticCredentials( qs.AccessKey, @@ -109,7 +103,7 @@ func NewKS3Storage( } for _, p := range opts.CheckPermissions { - err := permissionCheckFnKS3[p](c, &qs) + err := permissionCheckFnKS3[p](ctx, c, &qs) if err != nil { return nil, errors.Annotatef(berrors.ErrStorageInvalidPermission, "check permission %s failed due to %v", p, err) } @@ -121,14 +115,14 @@ func NewKS3Storage( }, nil } -var permissionCheckFnKS3 = map[Permission]func(*s3.S3, *backuppb.S3) error{ +var permissionCheckFnKS3 = map[Permission]func(context.Context, *s3.S3, *backuppb.S3) error{ AccessBuckets: s3BucketExistenceCheckKS3, ListObjects: listObjectsCheckKS3, GetObject: getObjectCheckKS3, PutAndDeleteObject: putAndDeleteObjectCheckKS3, } -func s3BucketExistenceCheckKS3(svc *s3.S3, qs *backuppb.S3) error { +func s3BucketExistenceCheckKS3(_ context.Context, svc *s3.S3, qs *backuppb.S3) error { input := &s3.HeadBucketInput{ Bucket: aws.String(qs.Bucket), } @@ -136,7 +130,7 @@ func s3BucketExistenceCheckKS3(svc *s3.S3, qs *backuppb.S3) error { return errors.Trace(err) } -func listObjectsCheckKS3(svc *s3.S3, qs *backuppb.S3) error { +func listObjectsCheckKS3(_ context.Context, svc *s3.S3, qs *backuppb.S3) error { input := &s3.ListObjectsInput{ Bucket: aws.String(qs.Bucket), Prefix: aws.String(qs.Prefix), @@ -149,7 +143,7 @@ func listObjectsCheckKS3(svc *s3.S3, qs *backuppb.S3) error { return nil } -func getObjectCheckKS3(svc *s3.S3, qs *backuppb.S3) error { +func getObjectCheckKS3(_ context.Context, svc *s3.S3, qs *backuppb.S3) error { input := &s3.GetObjectInput{ Bucket: aws.String(qs.Bucket), Key: aws.String("not-exists"), @@ -167,7 +161,7 @@ func getObjectCheckKS3(svc *s3.S3, qs *backuppb.S3) error { return nil } -func putAndDeleteObjectCheckKS3(svc *s3.S3, options *backuppb.S3) (err error) { +func putAndDeleteObjectCheckKS3(ctx context.Context, svc *s3.S3, options *backuppb.S3) (err error) { file := fmt.Sprintf("access-check/%s", uuid.New().String()) defer func() { // we always delete the object used for permission check, @@ -177,7 +171,7 @@ func putAndDeleteObjectCheckKS3(svc *s3.S3, options *backuppb.S3) (err error) { Bucket: aws.String(options.Bucket), Key: aws.String(options.Prefix + file), } - _, err2 := svc.DeleteObject(input) + _, err2 := svc.DeleteObjectWithContext(ctx, input) if aerr, ok := err2.(awserr.Error); ok { if aerr.Code() != "NoSuchKey" { log.Warn("failed to delete object used for permission check", @@ -191,7 +185,7 @@ func putAndDeleteObjectCheckKS3(svc *s3.S3, options *backuppb.S3) (err error) { }() // when no permission, aws returns err with code "AccessDenied" input := buildPutObjectInputKS3(options, file, []byte("check")) - _, err = svc.PutObject(input) + _, err = svc.PutObjectWithContext(ctx, input) return errors.Trace(err) } @@ -225,7 +219,7 @@ type KS3Uploader struct { // UploadPart update partial data to s3, we should call CreateMultipartUpload to start it, // and call CompleteMultipartUpload to finish it. -func (u *KS3Uploader) Write(_ context.Context, data []byte) (int, error) { +func (u *KS3Uploader) Write(ctx context.Context, data []byte) (int, error) { partInput := &s3.UploadPartInput{ Body: bytes.NewReader(data), Bucket: u.createOutput.Bucket, @@ -235,7 +229,7 @@ func (u *KS3Uploader) Write(_ context.Context, data []byte) (int, error) { ContentLength: int64p(int64(len(data))), } - uploadResult, err := u.svc.UploadPart(partInput) + uploadResult, err := u.svc.UploadPartWithContext(ctx, partInput) if err != nil { return 0, errors.Trace(err) } @@ -247,7 +241,7 @@ func (u *KS3Uploader) Write(_ context.Context, data []byte) (int, error) { } // Close complete multi upload request. -func (u *KS3Uploader) Close(_ context.Context) error { +func (u *KS3Uploader) Close(ctx context.Context) error { completeInput := &s3.CompleteMultipartUploadInput{ Bucket: u.createOutput.Bucket, Key: u.createOutput.Key, @@ -256,7 +250,7 @@ func (u *KS3Uploader) Close(_ context.Context) error { Parts: u.completeParts, }, } - _, err := u.svc.CompleteMultipartUpload(completeInput) + _, err := u.svc.CompleteMultipartUploadWithContext(ctx, completeInput) return errors.Trace(err) } @@ -265,22 +259,22 @@ func int64p(i int64) *int64 { } // WriteFile writes data to a file to storage. -func (rs *KS3Storage) WriteFile(_ context.Context, file string, data []byte) error { +func (rs *KS3Storage) WriteFile(ctx context.Context, file string, data []byte) error { input := buildPutObjectInputKS3(rs.options, file, data) // we don't need to calculate contentMD5 if s3 object lock enabled. // since aws-go-sdk already did it in #computeBodyHashes // https://github.com/aws/aws-sdk-go/blob/bcb2cf3fc2263c8c28b3119b07d2dbb44d7c93a0/service/s3/body_hash.go#L30 - _, err := rs.svc.PutObject(input) + _, err := rs.svc.PutObjectWithContext(ctx, input) return errors.Trace(err) } // ReadFile reads the file from the storage and returns the contents. -func (rs *KS3Storage) ReadFile(_ context.Context, file string) ([]byte, error) { +func (rs *KS3Storage) ReadFile(ctx context.Context, file string) ([]byte, error) { input := &s3.GetObjectInput{ Bucket: aws.String(rs.options.Bucket), Key: aws.String(rs.options.Prefix + file), } - result, err := rs.svc.GetObject(input) + result, err := rs.svc.GetObjectWithContext(ctx, input) if err != nil { return nil, errors.Annotatef(err, "failed to read s3 file, file info: input.bucket='%s', input.key='%s'", @@ -295,18 +289,18 @@ func (rs *KS3Storage) ReadFile(_ context.Context, file string) ([]byte, error) { } // DeleteFile delete the file in s3 storage -func (rs *KS3Storage) DeleteFile(_ context.Context, file string) error { +func (rs *KS3Storage) DeleteFile(ctx context.Context, file string) error { input := &s3.DeleteObjectInput{ Bucket: aws.String(rs.options.Bucket), Key: aws.String(rs.options.Prefix + file), } - _, err := rs.svc.DeleteObject(input) + _, err := rs.svc.DeleteObjectWithContext(ctx, input) return errors.Trace(err) } // DeleteFiles delete the files in batch in s3 storage. -func (rs *KS3Storage) DeleteFiles(_ context.Context, files []string) error { +func (rs *KS3Storage) DeleteFiles(ctx context.Context, files []string) error { for len(files) > 0 { batch := files if len(batch) > s3DeleteObjectsLimit { @@ -325,7 +319,7 @@ func (rs *KS3Storage) DeleteFiles(_ context.Context, files []string) error { Quiet: boolP(false), }, } - _, err := rs.svc.DeleteObjects(input) + _, err := rs.svc.DeleteObjectsWithContext(ctx, input) if err != nil { return errors.Trace(err) } @@ -339,13 +333,13 @@ func boolP(b bool) *bool { } // FileExists check if file exists on s3 storage. -func (rs *KS3Storage) FileExists(_ context.Context, file string) (bool, error) { +func (rs *KS3Storage) FileExists(ctx context.Context, file string) (bool, error) { input := &s3.HeadObjectInput{ Bucket: aws.String(rs.options.Bucket), Key: aws.String(rs.options.Prefix + file), } - _, err := rs.svc.HeadObject(input) + _, err := rs.svc.HeadObjectWithContext(ctx, input) if err != nil { if aerr, ok := errors.Cause(err).(awserr.Error); ok { // nolint:errorlint switch aerr.Code() { @@ -364,7 +358,7 @@ func (rs *KS3Storage) FileExists(_ context.Context, file string) (bool, error) { // The first argument is the file path that can be used in `Open` // function; the second argument is the size in byte of the file determined // by path. -func (rs *KS3Storage) WalkDir(_ context.Context, opt *WalkOption, fn func(string, int64) error) error { +func (rs *KS3Storage) WalkDir(ctx context.Context, opt *WalkOption, fn func(string, int64) error) error { if opt == nil { opt = &WalkOption{} } @@ -388,7 +382,7 @@ func (rs *KS3Storage) WalkDir(_ context.Context, opt *WalkOption, fn func(string } for { - res, err := rs.svc.ListObjects(req) + res, err := rs.svc.ListObjectsWithContext(ctx, req) if err != nil { return errors.Trace(err) } @@ -426,7 +420,7 @@ func (rs *KS3Storage) URI() string { } // Open a Reader by file path. -func (rs *KS3Storage) Open(_ context.Context, path string, o *ReaderOption) (ExternalFileReader, error) { +func (rs *KS3Storage) Open(ctx context.Context, path string, o *ReaderOption) (ExternalFileReader, error) { start := int64(0) end := int64(0) if o != nil { @@ -437,11 +431,12 @@ func (rs *KS3Storage) Open(_ context.Context, path string, o *ReaderOption) (Ext end = *o.EndOffset } } - reader, r, err := rs.open(path, start, end) + reader, r, err := rs.open(ctx, path, start, end) if err != nil { return nil, errors.Trace(err) } return &ks3ObjectReader{ + ctx: ctx, storage: rs, name: path, reader: reader, @@ -451,6 +446,7 @@ func (rs *KS3Storage) Open(_ context.Context, path string, o *ReaderOption) (Ext // if endOffset > startOffset, should return reader for bytes in [startOffset, endOffset). func (rs *KS3Storage) open( + ctx context.Context, path string, startOffset, endOffset int64, ) (io.ReadCloser, RangeInfo, error) { @@ -477,7 +473,7 @@ func (rs *KS3Storage) open( rangeOffset = aws.String(fmt.Sprintf("bytes=%d-", startOffset)) } input.Range = rangeOffset - result, err := rs.svc.GetObject(input) + result, err := rs.svc.GetObjectWithContext(ctx, input) if err != nil { return nil, RangeInfo{}, errors.Trace(err) } @@ -514,6 +510,7 @@ func (rs *KS3Storage) open( // ks3ObjectReader wrap GetObjectOutput.Body and add the `Seek` method. type ks3ObjectReader struct { + ctx context.Context storage *KS3Storage name string reader io.ReadCloser @@ -539,7 +536,7 @@ func (r *ks3ObjectReader) Read(p []byte) (n int, err error) { } _ = r.reader.Close() - newReader, _, err1 := r.storage.open(r.name, r.pos, end) + newReader, _, err1 := r.storage.open(r.ctx, r.name, r.pos, end) if err1 != nil { log.Warn("open new s3 reader failed", zap.String("file", r.name), zap.Error(err1)) return @@ -609,7 +606,7 @@ func (r *ks3ObjectReader) Seek(offset int64, whence int) (int64, error) { return 0, errors.Trace(err) } - newReader, info, err := r.storage.open(r.name, realOffset, 0) + newReader, info, err := r.storage.open(r.ctx, r.name, realOffset, 0) if err != nil { return 0, errors.Trace(err) } @@ -624,7 +621,7 @@ func (r *ks3ObjectReader) GetFileSize() (int64, error) { } // createUploader create multi upload request. -func (rs *KS3Storage) createUploader(_ context.Context, name string) (ExternalFileWriter, error) { +func (rs *KS3Storage) createUploader(ctx context.Context, name string) (ExternalFileWriter, error) { input := &s3.CreateMultipartUploadInput{ Bucket: aws.String(rs.options.Bucket), Key: aws.String(rs.options.Prefix + name), @@ -642,7 +639,7 @@ func (rs *KS3Storage) createUploader(_ context.Context, name string) (ExternalFi input.StorageClass = aws.String(rs.options.StorageClass) } - resp, err := rs.svc.CreateMultipartUpload(input) + resp, err := rs.svc.CreateMultipartUploadWithContext(ctx, input) if err != nil { return nil, errors.Trace(err) } @@ -677,7 +674,7 @@ func (rs *KS3Storage) Create(ctx context.Context, name string, option *WriterOpt s3Writer := &s3ObjectWriter{wd: wd, wg: &sync.WaitGroup{}} s3Writer.wg.Add(1) go func() { - _, err := up.Upload(upParams) + _, err := up.UploadWithContext(ctx, upParams) // like a channel we only let sender close the pipe in happy path if err != nil { log.Warn("upload to ks3 failed", zap.String("filename", name), zap.Error(err)) @@ -688,7 +685,11 @@ func (rs *KS3Storage) Create(ctx context.Context, name string, option *WriterOpt }() uploader = s3Writer } - uploaderWriter := newBufferedWriter(uploader, WriteBufferSize, NoCompression) + bufSize := WriteBufferSize + if option != nil && option.PartSize > 0 { + bufSize = int(option.PartSize) + } + uploaderWriter := newBufferedWriter(uploader, bufSize, NoCompression) return uploaderWriter, nil } diff --git a/br/pkg/storage/locking.go b/br/pkg/storage/locking.go new file mode 100644 index 0000000000000..09486a032c88e --- /dev/null +++ b/br/pkg/storage/locking.go @@ -0,0 +1,124 @@ +// Copyright 2023 PingCAP, Inc. Licensed under Apache-2.0. + +package storage + +import ( + "context" + "encoding/json" + "fmt" + "os" + "time" + + "github.com/pingcap/errors" + "github.com/pingcap/log" + "github.com/pingcap/tidb/br/pkg/logutil" + "go.uber.org/zap" +) + +// LockMeta is the meta information of a lock. +type LockMeta struct { + LockedAt time.Time `json:"locked_at"` + LockerHost string `json:"locker_host"` + LockerPID int `json:"locker_pid"` + Hint string `json:"hint"` +} + +func (l LockMeta) String() string { + return fmt.Sprintf("Locked(at: %s, host: %s, pid: %d, hint: %s)", l.LockedAt.Format(time.DateTime), l.LockerHost, l.LockerPID, l.Hint) +} + +// ErrLocked is the error returned when the lock is held by others. +type ErrLocked struct { + Meta LockMeta +} + +func (e ErrLocked) Error() string { + return fmt.Sprintf("locked, meta = %s", e.Meta) +} + +// MakeLockMeta creates a LockMeta by the current node's metadata. +// Including current time and hostname, etc.. +func MakeLockMeta(hint string) LockMeta { + hname, err := os.Hostname() + if err != nil { + hname = fmt.Sprintf("UnknownHost(err=%s)", err) + } + now := time.Now() + meta := LockMeta{ + LockedAt: now, + LockerHost: hname, + Hint: hint, + LockerPID: os.Getpid(), + } + return meta +} + +func readLockMeta(ctx context.Context, storage ExternalStorage, path string) (LockMeta, error) { + file, err := storage.ReadFile(ctx, path) + if err != nil { + return LockMeta{}, errors.Annotatef(err, "failed to read existed lock file %s", path) + } + meta := LockMeta{} + err = json.Unmarshal(file, &meta) + if err != nil { + return meta, errors.Annotatef(err, "failed to parse lock file %s", path) + } + + return meta, nil +} + +func putLockMeta(ctx context.Context, storage ExternalStorage, path string, meta LockMeta) error { + file, err := json.Marshal(meta) + if err != nil { + return errors.Annotatef(err, "failed to marshal lock meta %s", path) + } + err = storage.WriteFile(ctx, path, file) + if err != nil { + return errors.Annotatef(err, "failed to write lock meta at %s", path) + } + return nil +} + +// TryLockRemote tries to create a "lock file" at the external storage. +// If success, we will create a file at the path provided. So others may not access the file then. +// Will return a `ErrLocked` if there is another process already creates the lock file. +// This isn't a strict lock like flock in linux: that means, the lock might be forced removed by +// manually deleting the "lock file" in external storage. +func TryLockRemote(ctx context.Context, storage ExternalStorage, path, hint string) (err error) { + defer func() { + log.Info("Trying lock remote file.", zap.String("path", path), zap.String("hint", hint), logutil.ShortError(err)) + }() + exists, err := storage.FileExists(ctx, path) + if err != nil { + return errors.Annotatef(err, "failed to check lock file %s exists", path) + } + if exists { + meta, err := readLockMeta(ctx, storage, path) + if err != nil { + return err + } + return ErrLocked{Meta: meta} + } + + meta := MakeLockMeta(hint) + return putLockMeta(ctx, storage, path, meta) +} + +// UnlockRemote removes the lock file at the specified path. +// Removing that file will release the lock. +func UnlockRemote(ctx context.Context, storage ExternalStorage, path string) error { + meta, err := readLockMeta(ctx, storage, path) + if err != nil { + return err + } + // NOTE: this is for debug usage. For now, there isn't an Compare-And-Swap + // operation in our ExternalStorage abstraction. + // So, once our lock has been overwritten or we are overwriting other's lock, + // this information will be useful for troubleshooting. + log.Info("Releasing lock.", zap.Stringer("meta", meta), zap.String("path", path)) + err = storage.DeleteFile(ctx, path) + if err != nil { + return errors.Annotatef(err, "failed to delete lock file %s", path) + } + return nil +} diff --git a/br/pkg/storage/locking_test.go b/br/pkg/storage/locking_test.go new file mode 100644 index 0000000000000..ab6056c324714 --- /dev/null +++ b/br/pkg/storage/locking_test.go @@ -0,0 +1,61 @@ +// Copyright 2023 PingCAP, Inc. Licensed under Apache-2.0. + +package storage_test + +import ( + "context" + "os" + "path/filepath" + "testing" + + backup "github.com/pingcap/kvproto/pkg/brpb" + "github.com/pingcap/tidb/br/pkg/storage" + "github.com/stretchr/testify/require" +) + +func createMockStorage(t *testing.T) (storage.ExternalStorage, string) { + tempdir := t.TempDir() + storage, err := storage.New(context.Background(), &backup.StorageBackend{ + Backend: &backup.StorageBackend_Local{ + Local: &backup.Local{ + Path: tempdir, + }, + }, + }, nil) + require.NoError(t, err) + return storage, tempdir +} + +func requireFileExists(t *testing.T, path string) { + _, err := os.Stat(path) + require.NoError(t, err) +} + +func requireFileNotExists(t *testing.T, path string) { + _, err := os.Stat(path) + require.True(t, os.IsNotExist(err)) +} + +func TestTryLockRemote(t *testing.T) { + ctx := context.Background() + strg, pth := createMockStorage(t) + err := storage.TryLockRemote(ctx, strg, "test.lock", "This file is mine!") + require.NoError(t, err) + requireFileExists(t, filepath.Join(pth, "test.lock")) + err = storage.UnlockRemote(ctx, strg, "test.lock") + require.NoError(t, err) + requireFileNotExists(t, filepath.Join(pth, "test.lock")) +} + +func TestConflictLock(t *testing.T) { + ctx := context.Background() + strg, pth := createMockStorage(t) + err := storage.TryLockRemote(ctx, strg, "test.lock", "This file is mine!") + require.NoError(t, err) + err = storage.TryLockRemote(ctx, strg, "test.lock", "This file is mine!") + require.ErrorContains(t, err, "locked, meta = Locked") + requireFileExists(t, filepath.Join(pth, "test.lock")) + err = storage.UnlockRemote(ctx, strg, "test.lock") + require.NoError(t, err) + requireFileNotExists(t, filepath.Join(pth, "test.lock")) +} diff --git a/br/pkg/storage/memstore.go b/br/pkg/storage/memstore.go index c90597063b93d..2338a62959384 100644 --- a/br/pkg/storage/memstore.go +++ b/br/pkg/storage/memstore.go @@ -27,15 +27,14 @@ import ( ) type memFile struct { - Data atomic.Value // the atomic value is a byte slice, which can only be get/set atomically + Data atomic.Pointer[[]byte] } -// GetData gets the underlying byte slice of the atomic value +// GetData gets the underlying byte slice of the atomic pointer func (f *memFile) GetData() []byte { var fileData []byte - fileDataVal := f.Data.Load() - if fileDataVal != nil { - fileData = fileDataVal.([]byte) + if p := f.Data.Load(); p != nil { + fileData = *p } return fileData } @@ -110,10 +109,10 @@ func (s *MemStorage) WriteFile(ctx context.Context, name string, data []byte) er defer s.rwm.Unlock() theFile, ok := s.dataStore[name] if ok { - theFile.Data.Store(fileData) + theFile.Data.Store(&fileData) } else { theFile := new(memFile) - theFile.Data.Store(fileData) + theFile.Data.Store(&fileData) s.dataStore[name] = theFile } return nil @@ -352,7 +351,7 @@ func (w *memFileWriter) Close(ctx context.Context) error { // continue on } fileData := append([]byte{}, w.buf.Bytes()...) - w.file.Data.Store(fileData) + w.file.Data.Store(&fileData) w.isClosed.Store(true) return nil } diff --git a/br/pkg/storage/memstore_test.go b/br/pkg/storage/memstore_test.go index 793907499cf4b..4ef51b8b4fd81 100644 --- a/br/pkg/storage/memstore_test.go +++ b/br/pkg/storage/memstore_test.go @@ -195,13 +195,13 @@ func TestMemStoreManipulateBytes(t *testing.T) { testBytes := []byte(testStr) require.Nil(t, store.WriteFile(ctx, "/aaa.txt", testBytes)) testBytes[3] = '2' - require.Equal(t, testStr, string(store.dataStore["/aaa.txt"].Data.Load().([]byte))) + require.Equal(t, testStr, string(*store.dataStore["/aaa.txt"].Data.Load())) readBytes, err := store.ReadFile(ctx, "/aaa.txt") require.Nil(t, err) require.Equal(t, testStr, string(readBytes)) readBytes[3] = '2' - require.Equal(t, testStr, string(store.dataStore["/aaa.txt"].Data.Load().([]byte))) + require.Equal(t, testStr, string(*store.dataStore["/aaa.txt"].Data.Load())) } func TestMemStoreWriteDuringWalkDir(t *testing.T) { diff --git a/br/pkg/storage/parse_test.go b/br/pkg/storage/parse_test.go index 4e8884b557961..0669564961c77 100644 --- a/br/pkg/storage/parse_test.go +++ b/br/pkg/storage/parse_test.go @@ -147,6 +147,12 @@ func TestCreateStorage(t *testing.T) { require.Equal(t, "https://gcs.example.com/", gcs.Endpoint) require.Equal(t, "fakeCredentials", gcs.CredentialsBlob) + s, err = ParseBackend("gcs://bucket?endpoint=http://127.0.0.1/", gcsOpt) + require.NoError(t, err) + gcs = s.GetGcs() + require.NotNil(t, gcs) + require.Equal(t, "http://127.0.0.1/", gcs.Endpoint) + err = os.WriteFile(fakeCredentialsFile, []byte("fakeCreds2"), credFilePerm) require.NoError(t, err) s, err = ParseBackend("gs://bucket4/backup/?credentials-file="+url.QueryEscape(fakeCredentialsFile), nil) diff --git a/br/pkg/storage/s3.go b/br/pkg/storage/s3.go index cfb3e8b5bba1a..a81e2b7dcd45d 100644 --- a/br/pkg/storage/s3.go +++ b/br/pkg/storage/s3.go @@ -34,6 +34,7 @@ import ( "github.com/pingcap/log" berrors "github.com/pingcap/tidb/br/pkg/errors" "github.com/pingcap/tidb/br/pkg/logutil" + "github.com/pingcap/tidb/pkg/util/prefetch" "github.com/spf13/pflag" "go.uber.org/zap" ) @@ -735,6 +736,9 @@ func (rs *S3Storage) Open(ctx context.Context, path string, o *ReaderOption) (Ex if err != nil { return nil, errors.Trace(err) } + if o != nil && o.PrefetchSize > 0 { + reader = prefetch.NewReader(reader, o.PrefetchSize) + } return &s3ObjectReader{ storage: rs, name: path, @@ -874,6 +878,9 @@ func (r *s3ObjectReader) Read(p []byte) (n int, err error) { if maxCnt > int64(len(p)) { maxCnt = int64(len(p)) } + if maxCnt == 0 { + return 0, io.EOF + } n, err = r.reader.Read(p[:maxCnt]) // TODO: maybe we should use !errors.Is(err, io.EOF) here to avoid error lint, but currently, pingcap/errors // doesn't implement this method yet. @@ -1055,7 +1062,11 @@ func (rs *S3Storage) Create(ctx context.Context, name string, option *WriterOpti }() uploader = s3Writer } - uploaderWriter := newBufferedWriter(uploader, WriteBufferSize, NoCompression) + bufSize := WriteBufferSize + if option != nil && option.PartSize > 0 { + bufSize = int(option.PartSize) + } + uploaderWriter := newBufferedWriter(uploader, bufSize, NoCompression) return uploaderWriter, nil } diff --git a/br/pkg/storage/storage.go b/br/pkg/storage/storage.go index 348bbd32a5a26..c848b1af76281 100644 --- a/br/pkg/storage/storage.go +++ b/br/pkg/storage/storage.go @@ -12,7 +12,6 @@ import ( backuppb "github.com/pingcap/kvproto/pkg/brpb" berrors "github.com/pingcap/tidb/br/pkg/errors" "github.com/pingcap/tidb/br/pkg/lightning/log" - "github.com/pingcap/tidb/pkg/util/intest" "go.uber.org/zap" ) @@ -98,6 +97,8 @@ type ReaderOption struct { StartOffset *int64 // EndOffset is exclusive. And it's incompatible with Seek. EndOffset *int64 + // PrefetchSize will switch to NewPrefetchReader if value is positive. + PrefetchSize int } // ExternalStorage represents a kind of file system storage. @@ -159,9 +160,9 @@ type ExternalStorageOptions struct { NoCredentials bool // HTTPClient to use. The created storage may ignore this field if it is not - // directly using HTTP (e.g. the local storage) or use self-design HTTP client - // with credential (e.g. the gcs). - // NOTICE: the HTTPClient is only used by s3 storage and azure blob storage. + // directly using HTTP (e.g. the local storage). + // NOTICE: the HTTPClient is only used by s3/azure/gcs. + // For GCS, we will use this as base client to init a client with credentials. HTTPClient *http.Client // CheckPermissions check the given permission in New() function. @@ -190,12 +191,31 @@ func Create(ctx context.Context, backend *backuppb.StorageBackend, sendCreds boo // NewWithDefaultOpt creates ExternalStorage with default options. func NewWithDefaultOpt(ctx context.Context, backend *backuppb.StorageBackend) (ExternalStorage, error) { var opts ExternalStorageOptions - if intest.InTest { - opts.NoCredentials = true + if gcs := backend.GetGcs(); gcs != nil { + opts.HTTPClient = gcsHttpClientForThroughput() } return New(ctx, backend, &opts) } +// NewFromURL creates an ExternalStorage from URL. +func NewFromURL(ctx context.Context, uri string) (ExternalStorage, error) { + if len(uri) == 0 { + return nil, errors.Annotate(berrors.ErrStorageInvalidConfig, "empty store is not allowed") + } + u, err := ParseRawURL(uri) + if err != nil { + return nil, errors.Trace(err) + } + if u.Scheme == "memstore" { + return NewMemStorage(), nil + } + b, err := parseBackend(u, uri, nil) + if err != nil { + return nil, errors.Trace(err) + } + return NewWithDefaultOpt(ctx, b) +} + // New creates an ExternalStorage with options. func New(ctx context.Context, backend *backuppb.StorageBackend, opts *ExternalStorageOptions) (ExternalStorage, error) { if opts == nil { @@ -226,9 +246,6 @@ func New(ctx context.Context, backend *backuppb.StorageBackend, opts *ExternalSt if backend.Gcs == nil { return nil, errors.Annotate(berrors.ErrStorageInvalidConfig, "GCS config not found") } - // the HTTPClient should has credential, currently the HTTPClient only has the http.Transport. - // Issue: https: //github.com/pingcap/tidb/issues/47022 - opts.HTTPClient = nil return NewGCSStorage(ctx, backend.Gcs, opts) case *backuppb.StorageBackend_AzureBlobStorage: return newAzureBlobStorage(ctx, backend.AzureBlobStorage, opts) diff --git a/br/pkg/storage/storage_test.go b/br/pkg/storage/storage_test.go index c6ca5c39b6a02..d52d8b6768d3e 100644 --- a/br/pkg/storage/storage_test.go +++ b/br/pkg/storage/storage_test.go @@ -3,6 +3,7 @@ package storage_test import ( + "context" "net/http" "testing" @@ -24,3 +25,10 @@ func TestDefaultHttpClient(t *testing.T) { require.Equal(t, int(concurrency), transport.MaxIdleConnsPerHost) require.Equal(t, int(concurrency), transport.MaxIdleConns) } + +func TestNewMemStorage(t *testing.T) { + url := "memstore://" + s, err := storage.NewFromURL(context.Background(), url) + require.NoError(t, err) + require.IsType(t, (*storage.MemStorage)(nil), s) +} diff --git a/br/pkg/stream/BUILD.bazel b/br/pkg/stream/BUILD.bazel index fc013f01bd3a1..c1d82edfee336 100644 --- a/br/pkg/stream/BUILD.bazel +++ b/br/pkg/stream/BUILD.bazel @@ -22,6 +22,7 @@ go_library( "//br/pkg/storage", "//br/pkg/streamhelper", "//br/pkg/utils", + "//pkg/ddl", "//pkg/kv", "//pkg/meta", "//pkg/parser/model", @@ -54,10 +55,11 @@ go_test( ], embed = [":stream"], flaky = True, - shard_count = 24, + shard_count = 26, deps = [ "//br/pkg/storage", "//br/pkg/streamhelper", + "//pkg/ddl", "//pkg/meta", "//pkg/parser/ast", "//pkg/parser/model", diff --git a/br/pkg/stream/rewrite_meta_rawkv.go b/br/pkg/stream/rewrite_meta_rawkv.go index 5366b60150d40..5cdfaa2975eba 100644 --- a/br/pkg/stream/rewrite_meta_rawkv.go +++ b/br/pkg/stream/rewrite_meta_rawkv.go @@ -23,9 +23,9 @@ import ( backuppb "github.com/pingcap/kvproto/pkg/brpb" "github.com/pingcap/log" berrors "github.com/pingcap/tidb/br/pkg/errors" - "github.com/pingcap/tidb/br/pkg/logutil" "github.com/pingcap/tidb/br/pkg/restore/ingestrec" "github.com/pingcap/tidb/br/pkg/restore/tiflashrec" + "github.com/pingcap/tidb/pkg/ddl" "github.com/pingcap/tidb/pkg/kv" "github.com/pingcap/tidb/pkg/meta" "github.com/pingcap/tidb/pkg/parser/model" @@ -71,15 +71,14 @@ type SchemasReplace struct { globalTableIdMap map[UpstreamID]DownstreamID needConstructIdMap bool - ingestRecorder *ingestrec.IngestRecorder - TiflashRecorder *tiflashrec.TiFlashRecorder - RewriteTS uint64 // used to rewrite commit ts in meta kv. - TableFilter filter.Filter // used to filter schema/table + delRangeRecorder *brDelRangeExecWrapper + ingestRecorder *ingestrec.IngestRecorder + TiflashRecorder *tiflashrec.TiFlashRecorder + RewriteTS uint64 // used to rewrite commit ts in meta kv. + TableFilter filter.Filter // used to filter schema/table - genGenGlobalID func(ctx context.Context) (int64, error) - genGenGlobalIDs func(ctx context.Context, n int) ([]int64, error) - insertDeleteRangeForTable func(jobID int64, tableIDs []int64) - insertDeleteRangeForIndex func(jobID int64, elementID *int64, tableID int64, indexIDs []int64) + genGenGlobalID func(ctx context.Context) (int64, error) + genGenGlobalIDs func(ctx context.Context, n int) ([]int64, error) AfterTableRewritten func(deleted bool, tableInfo *model.TableInfo) } @@ -112,8 +111,7 @@ func NewSchemasReplace( tableFilter filter.Filter, genID func(ctx context.Context) (int64, error), genIDs func(ctx context.Context, n int) ([]int64, error), - insertDeleteRangeForTable func(jobID int64, tableIDs []int64), - insertDeleteRangeForIndex func(jobID int64, elementID *int64, tableID int64, indexIDs []int64), + recordDeleteRange func(*PreDelRangeQuery), ) *SchemasReplace { globalTableIdMap := make(map[UpstreamID]DownstreamID) for _, dr := range dbMap { @@ -126,17 +124,16 @@ func NewSchemasReplace( } return &SchemasReplace{ - DbMap: dbMap, - globalTableIdMap: globalTableIdMap, - needConstructIdMap: needConstructIdMap, - ingestRecorder: ingestrec.New(), - TiflashRecorder: tiflashRecorder, - RewriteTS: restoreTS, - TableFilter: tableFilter, - genGenGlobalID: genID, - genGenGlobalIDs: genIDs, - insertDeleteRangeForTable: insertDeleteRangeForTable, - insertDeleteRangeForIndex: insertDeleteRangeForIndex, + DbMap: dbMap, + globalTableIdMap: globalTableIdMap, + needConstructIdMap: needConstructIdMap, + delRangeRecorder: newDelRangeExecWrapper(globalTableIdMap, recordDeleteRange), + ingestRecorder: ingestrec.New(), + TiflashRecorder: tiflashRecorder, + RewriteTS: restoreTS, + TableFilter: tableFilter, + genGenGlobalID: genID, + genGenGlobalIDs: genIDs, } } @@ -650,7 +647,7 @@ func (sr *SchemasReplace) RewriteKvEntry(e *kv.Entry, cf string) (*kv.Entry, err return nil, nil } - return nil, sr.restoreFromHistory(job, false) + return nil, sr.restoreFromHistory(job) } return nil, nil } @@ -679,349 +676,90 @@ func (sr *SchemasReplace) RewriteKvEntry(e *kv.Entry, cf string) (*kv.Entry, err return nil, nil } -func (sr *SchemasReplace) restoreFromHistory(job *model.Job, isSubJob bool) error { - if !job.IsCancelled() { - switch job.Type { - case model.ActionAddIndex, model.ActionAddPrimaryKey: - if job.State == model.JobStateRollbackDone { - return sr.deleteRange(job) - } - err := sr.ingestRecorder.AddJob(job, isSubJob) - return errors.Trace(err) - case model.ActionDropSchema, model.ActionDropTable, model.ActionTruncateTable, model.ActionDropIndex, model.ActionDropPrimaryKey, - model.ActionDropTablePartition, model.ActionTruncateTablePartition, model.ActionDropColumn, - model.ActionDropColumns, model.ActionModifyColumn, model.ActionDropIndexes: - return sr.deleteRange(job) - case model.ActionMultiSchemaChange: - for i, sub := range job.MultiSchemaInfo.SubJobs { - proxyJob := sub.ToProxyJob(job, i) - // ASSERT: the proxyJob can not be MultiSchemaInfo anymore - if err := sr.restoreFromHistory(&proxyJob, true); err != nil { - return err - } - } +func (sr *SchemasReplace) tryRecordIngestIndex(job *model.Job) error { + if job.Type != model.ActionMultiSchemaChange { + return sr.ingestRecorder.TryAddJob(job, false) + } + + for i, sub := range job.MultiSchemaInfo.SubJobs { + proxyJob := sub.ToProxyJob(job, i) + // ASSERT: the proxyJob can not be MultiSchemaInfo anymore + if err := sr.ingestRecorder.TryAddJob(&proxyJob, true); err != nil { + return err } } return nil } -func (sr *SchemasReplace) deleteRange(job *model.Job) error { - lctx := logutil.ContextWithField(context.Background(), logutil.RedactAny("category", "ddl: rewrite delete range")) - dbReplace, exist := sr.DbMap[job.SchemaID] - if !exist { - // skip this mddljob, the same below - logutil.CL(lctx).Warn("try to drop a non-existent range, missing oldDBID", zap.Int64("oldDBID", job.SchemaID)) - return nil - } - - // allocate a new fake job id to avoid row conflicts in table `gc_delete_range` - newJobID, err := sr.genGenGlobalID(context.Background()) - if err != nil { - return errors.Trace(err) - } - - switch job.Type { - case model.ActionDropSchema: - var tableIDs []int64 - if err := job.DecodeArgs(&tableIDs); err != nil { - return errors.Trace(err) - } - // Note: tableIDs contains partition ids, cannot directly use dbReplace.TableMap - /* TODO: use global ID replace map - * - * for i := 0; i < len(tableIDs); i++ { - * tableReplace, exist := dbReplace.TableMap[tableIDs[i]] - * if !exist { - * return errors.Errorf("DropSchema: try to drop a non-existent table, missing oldTableID") - * } - * tableIDs[i] = tableReplace.NewTableID - * } - */ - - argsSet := make(map[int64]struct{}, len(tableIDs)) - for _, tableID := range tableIDs { - argsSet[tableID] = struct{}{} - } - - newTableIDs := make([]int64, 0, len(tableIDs)) - for tableID, tableReplace := range dbReplace.TableMap { - if _, exist := argsSet[tableID]; !exist { - logutil.CL(lctx).Warn("DropSchema: record a table, but it doesn't exist in job args", - zap.Int64("oldTableID", tableID)) - continue - } - newTableIDs = append(newTableIDs, tableReplace.TableID) - for partitionID, newPartitionID := range tableReplace.PartitionMap { - if _, exist := argsSet[partitionID]; !exist { - logutil.CL(lctx).Warn("DropSchema: record a partition, but it doesn't exist in job args", - zap.Int64("oldPartitionID", partitionID)) - continue - } - newTableIDs = append(newTableIDs, newPartitionID) - } - } - - if len(newTableIDs) != len(tableIDs) { - logutil.CL(lctx).Warn( - "DropSchema: try to drop a non-existent table/partition, whose oldID doesn't exist in tableReplace") - // only drop newTableIDs' ranges - } - - if len(newTableIDs) > 0 { - sr.insertDeleteRangeForTable(newJobID, newTableIDs) - } - - return nil - // Truncate will generates new id for table or partition, so ts can be large enough - case model.ActionDropTable, model.ActionTruncateTable: - tableReplace, exist := dbReplace.TableMap[job.TableID] - if !exist { - logutil.CL(lctx).Warn("DropTable/TruncateTable: try to drop a non-existent table, missing oldTableID", - zap.Int64("oldTableID", job.TableID)) - return nil - } - - // The startKey here is for compatibility with previous versions, old version did not endKey so don't have to deal with. - var startKey kv.Key // unused - var physicalTableIDs []int64 - var ruleIDs []string // unused - if err := job.DecodeArgs(&startKey, &physicalTableIDs, &ruleIDs); err != nil { - return errors.Trace(err) - } - if len(physicalTableIDs) > 0 { - newPhysicalTableIDs := make([]int64, 0, len(physicalTableIDs)) - // delete partition id - for _, oldPid := range physicalTableIDs { - newPid, exist := tableReplace.PartitionMap[oldPid] - if !exist { - logutil.CL(lctx).Warn("DropTable/TruncateTable: try to drop a non-existent table, missing oldPartitionID", - zap.Int64("oldPartitionID", oldPid)) - continue - } - newPhysicalTableIDs = append(newPhysicalTableIDs, newPid) - } - if len(newPhysicalTableIDs) > 0 { - sr.insertDeleteRangeForTable(newJobID, newPhysicalTableIDs) - } - return nil +func (sr *SchemasReplace) restoreFromHistory(job *model.Job) error { + if ddl.JobNeedGC(job) { + if err := ddl.AddDelRangeJobInternal(context.TODO(), sr.delRangeRecorder, job); err != nil { + return err } + } - sr.insertDeleteRangeForTable(newJobID, []int64{tableReplace.TableID}) - return nil - case model.ActionDropTablePartition, model.ActionTruncateTablePartition: - tableReplace, exist := dbReplace.TableMap[job.TableID] - if !exist { - logutil.CL(lctx).Warn( - "DropTablePartition/TruncateTablePartition: try to drop a non-existent table, missing oldTableID", - zap.Int64("oldTableID", job.TableID)) - return nil - } - var physicalTableIDs []int64 - if err := job.DecodeArgs(&physicalTableIDs); err != nil { - return errors.Trace(err) - } + return sr.tryRecordIngestIndex(job) +} - newPhysicalTableIDs := make([]int64, 0, len(physicalTableIDs)) - for _, oldPid := range physicalTableIDs { - newPid, exist := tableReplace.PartitionMap[oldPid] - if !exist { - logutil.CL(lctx).Warn( - "DropTablePartition/TruncateTablePartition: try to drop a non-existent table, missing oldPartitionID", - zap.Int64("oldPartitionID", oldPid)) - continue - } - newPhysicalTableIDs = append(newPhysicalTableIDs, newPid) - } - if len(newPhysicalTableIDs) > 0 { - sr.insertDeleteRangeForTable(newJobID, newPhysicalTableIDs) - } - return nil - // ActionAddIndex, ActionAddPrimaryKey needs do it, because it needs to be rolled back when it's canceled. - case model.ActionAddIndex, model.ActionAddPrimaryKey: - // iff job.State = model.JobStateRollbackDone - tableReplace, exist := dbReplace.TableMap[job.TableID] - if !exist { - logutil.CL(lctx).Warn("AddIndex/AddPrimaryKey roll-back: try to drop a non-existent table, missing oldTableID", - zap.Int64("oldTableID", job.TableID)) - return nil - } - indexIDs := make([]int64, 1) - ifExists := make([]bool, 1) - var partitionIDs []int64 - if err := job.DecodeArgs(&indexIDs[0], &ifExists[0], &partitionIDs); err != nil { - if err = job.DecodeArgs(&indexIDs, &ifExists, &partitionIDs); err != nil { - return errors.Trace(err) - } - } +type DelRangeParams struct { + JobID int64 + ElemID int64 + StartKey string + EndKey string +} - var elementID int64 = 1 +type PreDelRangeQuery struct { + Sql string + ParamsList []DelRangeParams +} - if len(partitionIDs) > 0 { - for _, oldPid := range partitionIDs { - newPid, exist := tableReplace.PartitionMap[oldPid] - if !exist { - logutil.CL(lctx).Warn( - "AddIndex/AddPrimaryKey roll-back: try to drop a non-existent table, missing oldPartitionID", - zap.Int64("oldPartitionID", oldPid)) - continue - } +type brDelRangeExecWrapper struct { + globalTableIdMap map[UpstreamID]DownstreamID - sr.insertDeleteRangeForIndex(newJobID, &elementID, newPid, indexIDs) - } - } else { - sr.insertDeleteRangeForIndex(newJobID, &elementID, tableReplace.TableID, indexIDs) - } - return nil - case model.ActionDropIndex, model.ActionDropPrimaryKey: - tableReplace, exist := dbReplace.TableMap[job.TableID] - if !exist { - logutil.CL(lctx).Warn("DropIndex/DropPrimaryKey: try to drop a non-existent table, missing oldTableID", zap.Int64("oldTableID", job.TableID)) - return nil - } + recordDeleteRange func(*PreDelRangeQuery) - var indexName interface{} - var ifExists bool - var indexID int64 - var partitionIDs []int64 - if err := job.DecodeArgs(&indexName, &ifExists, &indexID, &partitionIDs); err != nil { - return errors.Trace(err) - } + // temporary values + query *PreDelRangeQuery +} - var elementID int64 = 1 - indexIDs := []int64{indexID} +func newDelRangeExecWrapper( + globalTableIdMap map[UpstreamID]DownstreamID, + recordDeleteRange func(*PreDelRangeQuery), +) *brDelRangeExecWrapper { + return &brDelRangeExecWrapper{ + globalTableIdMap: globalTableIdMap, + recordDeleteRange: recordDeleteRange, - if len(partitionIDs) > 0 { - for _, oldPid := range partitionIDs { - newPid, exist := tableReplace.PartitionMap[oldPid] - if !exist { - logutil.CL(lctx).Warn("DropIndex/DropPrimaryKey: try to drop a non-existent table, missing oldPartitionID", zap.Int64("oldPartitionID", oldPid)) - continue - } - // len(indexIDs) = 1 - sr.insertDeleteRangeForIndex(newJobID, &elementID, newPid, indexIDs) - } - } else { - sr.insertDeleteRangeForIndex(newJobID, &elementID, tableReplace.TableID, indexIDs) - } - return nil - case model.ActionDropIndexes: // // Deprecated, we use ActionMultiSchemaChange instead. - var indexIDs []int64 - var partitionIDs []int64 - if err := job.DecodeArgs(&[]model.CIStr{}, &[]bool{}, &indexIDs, &partitionIDs); err != nil { - return errors.Trace(err) - } - // Remove data in TiKV. - if len(indexIDs) == 0 { - return nil - } + query: nil, + } +} - tableReplace, exist := dbReplace.TableMap[job.TableID] - if !exist { - logutil.CL(lctx).Warn("DropIndexes: try to drop a non-existent table, missing oldTableID", zap.Int64("oldTableID", job.TableID)) - return nil - } +// UpdateTSOForJob just does nothing. BR would generate ts after log restore done. +func (bdr *brDelRangeExecWrapper) UpdateTSOForJob() error { + return nil +} - var elementID int64 = 1 - if len(partitionIDs) > 0 { - for _, oldPid := range partitionIDs { - newPid, exist := tableReplace.PartitionMap[oldPid] - if !exist { - logutil.CL(lctx).Warn("DropIndexes: try to drop a non-existent table, missing oldPartitionID", zap.Int64("oldPartitionID", oldPid)) - continue - } - sr.insertDeleteRangeForIndex(newJobID, &elementID, newPid, indexIDs) - } - } else { - sr.insertDeleteRangeForIndex(newJobID, &elementID, tableReplace.TableID, indexIDs) - } - return nil - case model.ActionDropColumn: - var colName model.CIStr - var ifExists bool - var indexIDs []int64 - var partitionIDs []int64 - if err := job.DecodeArgs(&colName, &ifExists, &indexIDs, &partitionIDs); err != nil { - return errors.Trace(err) - } - if len(indexIDs) > 0 { - tableReplace, exist := dbReplace.TableMap[job.TableID] - if !exist { - logutil.CL(lctx).Warn("DropColumn: try to drop a non-existent table, missing oldTableID", zap.Int64("oldTableID", job.TableID)) - return nil - } +func (bdr *brDelRangeExecWrapper) PrepareParamsList(sz int) { + bdr.query = &PreDelRangeQuery{ + ParamsList: make([]DelRangeParams, 0, sz), + } +} - var elementID int64 = 1 - if len(partitionIDs) > 0 { - for _, oldPid := range partitionIDs { - newPid, exist := tableReplace.PartitionMap[oldPid] - if !exist { - logutil.CL(lctx).Warn("DropColumn: try to drop a non-existent table, missing oldPartitionID", zap.Int64("oldPartitionID", oldPid)) - continue - } - sr.insertDeleteRangeForIndex(newJobID, &elementID, newPid, indexIDs) - } - } else { - sr.insertDeleteRangeForIndex(newJobID, &elementID, tableReplace.TableID, indexIDs) - } - } - return nil - case model.ActionDropColumns: // Deprecated, we use ActionMultiSchemaChange instead. - var colNames []model.CIStr - var ifExists []bool - var indexIDs []int64 - var partitionIDs []int64 - if err := job.DecodeArgs(&colNames, &ifExists, &indexIDs, &partitionIDs); err != nil { - return errors.Trace(err) - } - if len(indexIDs) > 0 { - tableReplace, exist := dbReplace.TableMap[job.TableID] - if !exist { - logutil.CL(lctx).Warn("DropColumns: try to drop a non-existent table, missing oldTableID", zap.Int64("oldTableID", job.TableID)) - return nil - } +func (bdr *brDelRangeExecWrapper) RewriteTableID(tableID int64) (int64, bool) { + newTableID, exists := bdr.globalTableIdMap[tableID] + if !exists { + log.Warn("failed to find the downstream id when rewrite delete range", zap.Int64("old tableID", tableID)) + } + return newTableID, exists +} - var elementID int64 = 1 - if len(partitionIDs) > 0 { - for _, oldPid := range partitionIDs { - newPid, exist := tableReplace.PartitionMap[oldPid] - if !exist { - logutil.CL(lctx).Warn("DropColumns: try to drop a non-existent table, missing oldPartitionID", zap.Int64("oldPartitionID", oldPid)) - continue - } - sr.insertDeleteRangeForIndex(newJobID, &elementID, newPid, indexIDs) - } - } else { - sr.insertDeleteRangeForIndex(newJobID, &elementID, tableReplace.TableID, indexIDs) - } - } - case model.ActionModifyColumn: - var indexIDs []int64 - var partitionIDs []int64 - if err := job.DecodeArgs(&indexIDs, &partitionIDs); err != nil { - return errors.Trace(err) - } - if len(indexIDs) == 0 { - return nil - } - tableReplace, exist := dbReplace.TableMap[job.TableID] - if !exist { - logutil.CL(lctx).Warn("DropColumn: try to drop a non-existent table, missing oldTableID", zap.Int64("oldTableID", job.TableID)) - return nil - } +func (bdr *brDelRangeExecWrapper) AppendParamsList(jobID, elemID int64, startKey, endKey string) { + bdr.query.ParamsList = append(bdr.query.ParamsList, DelRangeParams{jobID, elemID, startKey, endKey}) +} - var elementID int64 = 1 - if len(partitionIDs) > 0 { - for _, oldPid := range partitionIDs { - newPid, exist := tableReplace.PartitionMap[oldPid] - if !exist { - logutil.CL(lctx).Warn("DropColumn: try to drop a non-existent table, missing oldPartitionID", zap.Int64("oldPartitionID", oldPid)) - continue - } - sr.insertDeleteRangeForIndex(newJobID, &elementID, newPid, indexIDs) - } - } else { - sr.insertDeleteRangeForIndex(newJobID, &elementID, tableReplace.TableID, indexIDs) - } - } +func (bdr *brDelRangeExecWrapper) ConsumeDeleteRange(ctx context.Context, sql string) error { + bdr.query.Sql = sql + bdr.recordDeleteRange(bdr.query) + bdr.query = nil return nil } diff --git a/br/pkg/stream/rewrite_meta_rawkv_test.go b/br/pkg/stream/rewrite_meta_rawkv_test.go index d09e137ddae61..b7581e0a3eab1 100644 --- a/br/pkg/stream/rewrite_meta_rawkv_test.go +++ b/br/pkg/stream/rewrite_meta_rawkv_test.go @@ -4,13 +4,16 @@ package stream import ( "context" + "encoding/hex" "encoding/json" "testing" + "github.com/pingcap/tidb/pkg/ddl" "github.com/pingcap/tidb/pkg/meta" "github.com/pingcap/tidb/pkg/parser/ast" "github.com/pingcap/tidb/pkg/parser/model" "github.com/pingcap/tidb/pkg/parser/mysql" + "github.com/pingcap/tidb/pkg/tablecodec" "github.com/pingcap/tidb/pkg/types" filter "github.com/pingcap/tidb/pkg/util/table-filter" "github.com/stretchr/testify/require" @@ -23,8 +26,10 @@ func mockGenGenGlobalID(ctx context.Context) (int64, error) { return increaseID, nil } -func MockEmptySchemasReplace(midr *mockInsertDeleteRange) *SchemasReplace { - dbMap := make(map[UpstreamID]*DBReplace) +func MockEmptySchemasReplace(midr *mockInsertDeleteRange, dbMap map[UpstreamID]*DBReplace) *SchemasReplace { + if dbMap == nil { + dbMap = make(map[UpstreamID]*DBReplace) + } if midr == nil { midr = newMockInsertDeleteRange() } @@ -36,8 +41,7 @@ func MockEmptySchemasReplace(midr *mockInsertDeleteRange) *SchemasReplace { filter.All(), mockGenGenGlobalID, nil, - midr.mockInsertDeleteRangeForTable, - midr.mockInsertDeleteRangeForIndex, + midr.mockRecordDeleteRange, ) } @@ -79,7 +83,7 @@ func TestTidySchemaMaps(t *testing.T) { drs[oldDBID] = dr // create schemas replace and test TidySchemaMaps(). - sr := NewSchemasReplace(drs, true, nil, 0, filter.All(), nil, nil, nil, nil) + sr := NewSchemasReplace(drs, true, nil, 0, filter.All(), nil, nil, nil) globalTableIdMap := sr.globalTableIdMap require.Equal(t, len(globalTableIdMap), 3) require.Equal(t, globalTableIdMap[oldTblID], newTblID) @@ -126,7 +130,7 @@ func TestRewriteKeyForDB(t *testing.T) { encodedKey := encodeTxnMetaKey(mDbs, meta.DBkey(dbID), ts) // create schemasReplace. - sr := MockEmptySchemasReplace(nil) + sr := MockEmptySchemasReplace(nil, nil) // preConstruct Map information. sr.SetPreConstructMapStatus() @@ -169,7 +173,7 @@ func TestRewriteDBInfo(t *testing.T) { require.Nil(t, err) // create schemasReplace. - sr := MockEmptySchemasReplace(nil) + sr := MockEmptySchemasReplace(nil, nil) // rewrite it directly without preConstruct Map, it will get failed result. sr.SetRestoreKVStatus() @@ -237,7 +241,7 @@ func TestRewriteKeyForTable(t *testing.T) { for _, ca := range cases { encodedKey := encodeTxnMetaKey(meta.DBkey(dbID), ca.encodeTableFn(tableID), ts) // create schemasReplace. - sr := MockEmptySchemasReplace(nil) + sr := MockEmptySchemasReplace(nil, nil) // set preConstruct status and construct map information. sr.SetPreConstructMapStatus() @@ -292,7 +296,7 @@ func TestRewriteTableInfo(t *testing.T) { require.Nil(t, err) // create schemasReplace. - sr := MockEmptySchemasReplace(nil) + sr := MockEmptySchemasReplace(nil, nil) tableCount := 0 sr.AfterTableRewritten = func(deleted bool, tableInfo *model.TableInfo) { tableCount++ @@ -370,7 +374,7 @@ func TestRewriteTableInfoForPartitionTable(t *testing.T) { require.Nil(t, err) // create schemasReplace, and preConstructMap. - sr := MockEmptySchemasReplace(nil) + sr := MockEmptySchemasReplace(nil, nil) sr.SetPreConstructMapStatus() newValue, err := sr.rewriteTableInfo(value, dbId) require.Nil(t, err) @@ -496,7 +500,6 @@ func TestRewriteTableInfoForExchangePartition(t *testing.T) { mockGenGenGlobalID, nil, nil, - nil, ) sr.SetRestoreKVStatus() //exchange partition, t1 parition0 with the t2 @@ -557,7 +560,7 @@ func TestRewriteTableInfoForTTLTable(t *testing.T) { require.Nil(t, err) // create empty schemasReplace - sr := MockEmptySchemasReplace(nil) + sr := MockEmptySchemasReplace(nil, nil) // preConsutruct Map information. sr.SetPreConstructMapStatus() @@ -583,7 +586,7 @@ func TestRewriteTableInfoForTTLTable(t *testing.T) { func TestIsPreConsturctMapStatus(t *testing.T) { // create empty schemasReplace - sr := MockEmptySchemasReplace(nil) + sr := MockEmptySchemasReplace(nil, nil) sr.SetPreConstructMapStatus() require.True(t, sr.IsPreConsturctMapStatus()) require.False(t, sr.IsRestoreKVStatus()) @@ -626,35 +629,67 @@ var ( mDDLJobPartition2NewID: {}, mDDLJobTable1NewID: {}, } + mDDLJobALLNewTableKeySet = map[string]struct{}{ + encodeTableKey(mDDLJobTable0NewID): {}, + encodeTableKey(mDDLJobPartition0NewID): {}, + encodeTableKey(mDDLJobPartition1NewID): {}, + encodeTableKey(mDDLJobPartition2NewID): {}, + encodeTableKey(mDDLJobTable1NewID): {}, + } mDDLJobALLNewPartitionIDSet = map[int64]struct{}{ mDDLJobPartition0NewID: {}, mDDLJobPartition1NewID: {}, mDDLJobPartition2NewID: {}, } + mDDLJobALLNewPartitionKeySet = map[string]struct{}{ + encodeTableKey(mDDLJobPartition0NewID): {}, + encodeTableKey(mDDLJobPartition1NewID): {}, + encodeTableKey(mDDLJobPartition2NewID): {}, + } + mDDLJobALLNewPartitionIndex2KeySet = map[string]struct{}{ + encodeTableIndexKey(mDDLJobPartition0NewID, 2): {}, + encodeTableIndexKey(mDDLJobPartition1NewID, 2): {}, + encodeTableIndexKey(mDDLJobPartition2NewID, 2): {}, + } + mDDLJobALLNewPartitionIndex3KeySet = map[string]struct{}{ + encodeTableIndexKey(mDDLJobPartition0NewID, 3): {}, + encodeTableIndexKey(mDDLJobPartition1NewID, 3): {}, + encodeTableIndexKey(mDDLJobPartition2NewID, 3): {}, + } + tempIndex2 = tablecodec.TempIndexPrefix | int64(2) + mDDLJobALLNewPartitionTempIndex2KeySet = map[string]struct{}{ + encodeTableIndexKey(mDDLJobPartition0NewID, tempIndex2): {}, + encodeTableIndexKey(mDDLJobPartition1NewID, tempIndex2): {}, + encodeTableIndexKey(mDDLJobPartition2NewID, tempIndex2): {}, + } mDDLJobALLIndexesIDSet = map[int64]struct{}{ 2: {}, 3: {}, } + mDDLJobAllIndexesKeySet = []map[string]struct{}{ + mDDLJobALLNewPartitionIndex2KeySet, mDDLJobALLNewPartitionIndex3KeySet, + } ) var ( - dropSchemaJob = &model.Job{Type: model.ActionDropSchema, SchemaID: mDDLJobDBOldID, RawArgs: json.RawMessage(`[[71,72,73,74,75]]`)} - dropTable0Job = &model.Job{Type: model.ActionDropTable, SchemaID: mDDLJobDBOldID, TableID: mDDLJobTable0OldID, RawArgs: json.RawMessage(`["",[72,73,74],[""]]`)} - dropTable1Job = &model.Job{Type: model.ActionDropTable, SchemaID: mDDLJobDBOldID, TableID: mDDLJobTable1OldID, RawArgs: json.RawMessage(`["",[],[""]]`)} - dropTable0Partition1Job = &model.Job{Type: model.ActionDropTablePartition, SchemaID: mDDLJobDBOldID, TableID: mDDLJobTable0OldID, RawArgs: json.RawMessage(`[[73]]`)} - rollBackTable0IndexJob = &model.Job{Type: model.ActionAddIndex, SchemaID: mDDLJobDBOldID, TableID: mDDLJobTable0OldID, RawArgs: json.RawMessage(`[2,false,[72,73,74]]`)} - rollBackTable1IndexJob = &model.Job{Type: model.ActionAddIndex, SchemaID: mDDLJobDBOldID, TableID: mDDLJobTable1OldID, RawArgs: json.RawMessage(`[2,false,[]]`)} - dropTable0IndexJob = &model.Job{Type: model.ActionDropIndex, SchemaID: mDDLJobDBOldID, TableID: mDDLJobTable0OldID, RawArgs: json.RawMessage(`["",false,2,[72,73,74]]`)} - dropTable1IndexJob = &model.Job{Type: model.ActionDropIndex, SchemaID: mDDLJobDBOldID, TableID: mDDLJobTable1OldID, RawArgs: json.RawMessage(`["",false,2,[]]`)} - dropTable0IndexesJob = &model.Job{Type: model.ActionDropIndexes, SchemaID: mDDLJobDBOldID, TableID: mDDLJobTable0OldID, RawArgs: json.RawMessage(`[[],[],[2,3],[72,73,74]]`)} - dropTable1IndexesJob = &model.Job{Type: model.ActionDropIndexes, SchemaID: mDDLJobDBOldID, TableID: mDDLJobTable1OldID, RawArgs: json.RawMessage(`[[],[],[2,3],[]]`)} - dropTable0ColumnJob = &model.Job{Type: model.ActionDropColumn, SchemaID: mDDLJobDBOldID, TableID: mDDLJobTable0OldID, RawArgs: json.RawMessage(`["",false,[2,3],[72,73,74]]`)} - dropTable1ColumnJob = &model.Job{Type: model.ActionDropColumn, SchemaID: mDDLJobDBOldID, TableID: mDDLJobTable1OldID, RawArgs: json.RawMessage(`["",false,[2,3],[]]`)} - dropTable0ColumnsJob = &model.Job{Type: model.ActionDropColumns, SchemaID: mDDLJobDBOldID, TableID: mDDLJobTable0OldID, RawArgs: json.RawMessage(`[[],[],[2,3],[72,73,74]]`)} - dropTable1ColumnsJob = &model.Job{Type: model.ActionDropColumns, SchemaID: mDDLJobDBOldID, TableID: mDDLJobTable1OldID, RawArgs: json.RawMessage(`[[],[],[2,3],[]]`)} - modifyTable0ColumnJob = &model.Job{Type: model.ActionModifyColumn, SchemaID: mDDLJobDBOldID, TableID: mDDLJobTable0OldID, RawArgs: json.RawMessage(`[[2,3],[72,73,74]]`)} - modifyTable1ColumnJob = &model.Job{Type: model.ActionModifyColumn, SchemaID: mDDLJobDBOldID, TableID: mDDLJobTable1OldID, RawArgs: json.RawMessage(`[[2,3],[]]`)} - multiSchemaChangeJob0 = &model.Job{ + dropSchemaJob = &model.Job{Type: model.ActionDropSchema, SchemaID: mDDLJobDBOldID, RawArgs: json.RawMessage(`[[71,72,73,74,75]]`)} + dropTable0Job = &model.Job{Type: model.ActionDropTable, SchemaID: mDDLJobDBOldID, TableID: mDDLJobTable0OldID, RawArgs: json.RawMessage(`["",[72,73,74],[""]]`)} + dropTable1Job = &model.Job{Type: model.ActionDropTable, SchemaID: mDDLJobDBOldID, TableID: mDDLJobTable1OldID, RawArgs: json.RawMessage(`["",[],[""]]`)} + dropTable0Partition1Job = &model.Job{Type: model.ActionDropTablePartition, SchemaID: mDDLJobDBOldID, TableID: mDDLJobTable0OldID, RawArgs: json.RawMessage(`[[73]]`)} + reorganizeTable0Partition1Job = &model.Job{Type: model.ActionReorganizePartition, SchemaID: mDDLJobDBOldID, TableID: mDDLJobTable0OldID, RawArgs: json.RawMessage(`[[73]]`)} + removeTable0Partition1Job = &model.Job{Type: model.ActionRemovePartitioning, SchemaID: mDDLJobDBOldID, TableID: mDDLJobTable0OldID, RawArgs: json.RawMessage(`[[73]]`)} + alterTable0Partition1Job = &model.Job{Type: model.ActionAlterTablePartitioning, SchemaID: mDDLJobDBOldID, TableID: mDDLJobTable0OldID, RawArgs: json.RawMessage(`[[73]]`)} + rollBackTable0IndexJob = &model.Job{Type: model.ActionAddIndex, State: model.JobStateRollbackDone, SchemaID: mDDLJobDBOldID, TableID: mDDLJobTable0OldID, RawArgs: json.RawMessage(`[2,false,[72,73,74]]`)} + rollBackTable1IndexJob = &model.Job{Type: model.ActionAddIndex, State: model.JobStateRollbackDone, SchemaID: mDDLJobDBOldID, TableID: mDDLJobTable1OldID, RawArgs: json.RawMessage(`[2,false,[]]`)} + addTable0IndexJob = &model.Job{Type: model.ActionAddIndex, State: model.JobStateSynced, SchemaID: mDDLJobDBOldID, TableID: mDDLJobTable0OldID, RawArgs: json.RawMessage(`[2,false,[72,73,74]]`)} + addTable1IndexJob = &model.Job{Type: model.ActionAddIndex, State: model.JobStateSynced, SchemaID: mDDLJobDBOldID, TableID: mDDLJobTable1OldID, RawArgs: json.RawMessage(`[2,false,[]]`)} + dropTable0IndexJob = &model.Job{Type: model.ActionDropIndex, SchemaID: mDDLJobDBOldID, TableID: mDDLJobTable0OldID, RawArgs: json.RawMessage(`["",false,2,[72,73,74]]`)} + dropTable1IndexJob = &model.Job{Type: model.ActionDropIndex, SchemaID: mDDLJobDBOldID, TableID: mDDLJobTable1OldID, RawArgs: json.RawMessage(`["",false,2,[]]`)} + dropTable0ColumnJob = &model.Job{Type: model.ActionDropColumn, SchemaID: mDDLJobDBOldID, TableID: mDDLJobTable0OldID, RawArgs: json.RawMessage(`["",false,[2,3],[72,73,74]]`)} + dropTable1ColumnJob = &model.Job{Type: model.ActionDropColumn, SchemaID: mDDLJobDBOldID, TableID: mDDLJobTable1OldID, RawArgs: json.RawMessage(`["",false,[2,3],[]]`)} + modifyTable0ColumnJob = &model.Job{Type: model.ActionModifyColumn, SchemaID: mDDLJobDBOldID, TableID: mDDLJobTable0OldID, RawArgs: json.RawMessage(`[[2,3],[72,73,74]]`)} + modifyTable1ColumnJob = &model.Job{Type: model.ActionModifyColumn, SchemaID: mDDLJobDBOldID, TableID: mDDLJobTable1OldID, RawArgs: json.RawMessage(`[[2,3],[]]`)} + multiSchemaChangeJob0 = &model.Job{ Type: model.ActionMultiSchemaChange, SchemaID: mDDLJobDBOldID, TableID: mDDLJobTable0OldID, @@ -662,11 +697,11 @@ var ( SubJobs: []*model.SubJob{ { Type: model.ActionDropIndex, - RawArgs: json.RawMessage(`[{"O":"k1","L":"k1"},false,1,[72,73,74]]`), + RawArgs: json.RawMessage(`[{"O":"k1","L":"k1"},false,2,[72,73,74]]`), }, { Type: model.ActionDropIndex, - RawArgs: json.RawMessage(`[{"O":"k2","L":"k2"},false,2,[72,73,74]]`), + RawArgs: json.RawMessage(`[{"O":"k2","L":"k2"},false,3,[72,73,74]]`), }, }, }, @@ -679,55 +714,44 @@ var ( SubJobs: []*model.SubJob{ { Type: model.ActionDropIndex, - RawArgs: json.RawMessage(`[{"O":"k1","L":"k1"},false,1,[]]`), + RawArgs: json.RawMessage(`[{"O":"k1","L":"k1"},false,2,[]]`), }, { Type: model.ActionDropIndex, - RawArgs: json.RawMessage(`[{"O":"k2","L":"k2"},false,2,[]]`), + RawArgs: json.RawMessage(`[{"O":"k2","L":"k2"},false,3,[]]`), }, }, }, } ) -type TableDeletQueryArgs struct { - tableIDs []int64 -} - -type IndexDeleteQueryArgs struct { - tableID int64 - indexIDs []int64 -} - type mockInsertDeleteRange struct { - tableCh chan TableDeletQueryArgs - indexCh chan IndexDeleteQueryArgs + queryCh chan *PreDelRangeQuery } func newMockInsertDeleteRange() *mockInsertDeleteRange { // Since there is only single thread, we need to set the channel buf large enough. return &mockInsertDeleteRange{ - tableCh: make(chan TableDeletQueryArgs, 10), - indexCh: make(chan IndexDeleteQueryArgs, 10), + queryCh: make(chan *PreDelRangeQuery, 10), } } -func (midr *mockInsertDeleteRange) mockInsertDeleteRangeForTable(jobID int64, tableIDs []int64) { - midr.tableCh <- TableDeletQueryArgs{ - tableIDs: tableIDs, - } +func (midr *mockInsertDeleteRange) mockRecordDeleteRange(query *PreDelRangeQuery) { + midr.queryCh <- query } -func (midr *mockInsertDeleteRange) mockInsertDeleteRangeForIndex(jobID int64, elementID *int64, tableID int64, indexIDs []int64) { - midr.indexCh <- IndexDeleteQueryArgs{ - tableID: tableID, - indexIDs: indexIDs, - } +func encodeTableKey(tableID int64) string { + key := tablecodec.EncodeTablePrefix(tableID) + return hex.EncodeToString(key) +} + +func encodeTableIndexKey(tableID, indexID int64) string { + key := tablecodec.EncodeTableIndexPrefix(tableID, indexID) + return hex.EncodeToString(key) } func TestDeleteRangeForMDDLJob(t *testing.T) { midr := newMockInsertDeleteRange() - schemaReplace := MockEmptySchemasReplace(midr) partitionMap := map[int64]int64{ mDDLJobPartition0OldID: mDDLJobPartition0NewID, mDDLJobPartition1OldID: mDDLJobPartition1NewID, @@ -748,203 +772,289 @@ func TestDeleteRangeForMDDLJob(t *testing.T) { DbID: mDDLJobDBNewID, TableMap: tableMap, } - schemaReplace.DbMap[mDDLJobDBOldID] = dbReplace + schemaReplace := MockEmptySchemasReplace(midr, map[int64]*DBReplace{ + mDDLJobDBOldID: dbReplace, + }) - var targs TableDeletQueryArgs - var iargs IndexDeleteQueryArgs - var err error + var qargs *PreDelRangeQuery // drop schema - err = schemaReplace.deleteRange(dropSchemaJob) + err := schemaReplace.restoreFromHistory(dropSchemaJob) require.NoError(t, err) - targs = <-midr.tableCh - require.Equal(t, len(targs.tableIDs), len(mDDLJobALLNewTableIDSet)) - for _, tableID := range targs.tableIDs { - _, exist := mDDLJobALLNewTableIDSet[tableID] + qargs = <-midr.queryCh + require.Equal(t, len(qargs.ParamsList), len(mDDLJobALLNewTableIDSet)) + for _, params := range qargs.ParamsList { + _, exist := mDDLJobALLNewTableKeySet[params.StartKey] require.True(t, exist) } // drop table0 - err = schemaReplace.deleteRange(dropTable0Job) + err = schemaReplace.restoreFromHistory(dropTable0Job) require.NoError(t, err) - targs = <-midr.tableCh - require.Equal(t, len(targs.tableIDs), len(mDDLJobALLNewPartitionIDSet)) - for _, tableID := range targs.tableIDs { - _, exist := mDDLJobALLNewPartitionIDSet[tableID] + qargs = <-midr.queryCh + require.Equal(t, len(qargs.ParamsList), len(mDDLJobALLNewPartitionIDSet)) + for _, params := range qargs.ParamsList { + _, exist := mDDLJobALLNewPartitionKeySet[params.StartKey] require.True(t, exist) } + qargs = <-midr.queryCh + require.Equal(t, len(qargs.ParamsList), 1) + require.Equal(t, qargs.ParamsList[0].StartKey, encodeTableKey(mDDLJobTable0NewID)) // drop table1 - err = schemaReplace.deleteRange(dropTable1Job) + err = schemaReplace.restoreFromHistory(dropTable1Job) require.NoError(t, err) - targs = <-midr.tableCh - require.Equal(t, len(targs.tableIDs), 1) - require.Equal(t, targs.tableIDs[0], mDDLJobTable1NewID) + qargs = <-midr.queryCh + require.Equal(t, len(qargs.ParamsList), 1) + require.Equal(t, qargs.ParamsList[0].StartKey, encodeTableKey(mDDLJobTable1NewID)) // drop table partition1 - err = schemaReplace.deleteRange(dropTable0Partition1Job) + err = schemaReplace.restoreFromHistory(dropTable0Partition1Job) require.NoError(t, err) - targs = <-midr.tableCh - require.Equal(t, len(targs.tableIDs), 1) - require.Equal(t, targs.tableIDs[0], mDDLJobPartition1NewID) + qargs = <-midr.queryCh + require.Equal(t, len(qargs.ParamsList), 1) + require.Equal(t, qargs.ParamsList[0].StartKey, encodeTableKey(mDDLJobPartition1NewID)) + + // reorganize table partition1 + err = schemaReplace.restoreFromHistory(reorganizeTable0Partition1Job) + require.NoError(t, err) + qargs = <-midr.queryCh + require.Equal(t, len(qargs.ParamsList), 1) + require.Equal(t, encodeTableKey(mDDLJobPartition1NewID), qargs.ParamsList[0].StartKey) + + // remove table partition1 + err = schemaReplace.restoreFromHistory(removeTable0Partition1Job) + require.NoError(t, err) + qargs = <-midr.queryCh + require.Equal(t, len(qargs.ParamsList), 1) + require.Equal(t, encodeTableKey(mDDLJobPartition1NewID), qargs.ParamsList[0].StartKey) + + // alter table partition1 + err = schemaReplace.restoreFromHistory(alterTable0Partition1Job) + require.NoError(t, err) + qargs = <-midr.queryCh + require.Equal(t, len(qargs.ParamsList), 1) + require.Equal(t, encodeTableKey(mDDLJobPartition1NewID), qargs.ParamsList[0].StartKey) // roll back add index for table0 - err = schemaReplace.deleteRange(rollBackTable0IndexJob) + err = schemaReplace.restoreFromHistory(rollBackTable0IndexJob) require.NoError(t, err) + oldPartitionIDMap := make(map[string]struct{}) for i := 0; i < len(mDDLJobALLNewPartitionIDSet); i++ { - iargs = <-midr.indexCh - _, exist := mDDLJobALLNewPartitionIDSet[iargs.tableID] + qargs = <-midr.queryCh + require.Equal(t, len(qargs.ParamsList), 2) + for _, params := range qargs.ParamsList { + _, exist := oldPartitionIDMap[params.StartKey] + require.False(t, exist) + oldPartitionIDMap[params.StartKey] = struct{}{} + } + + // index ID + _, exist := mDDLJobALLNewPartitionIndex2KeySet[qargs.ParamsList[0].StartKey] + require.True(t, exist) + // temp index ID + _, exist = mDDLJobALLNewPartitionTempIndex2KeySet[qargs.ParamsList[1].StartKey] require.True(t, exist) - require.Equal(t, len(iargs.indexIDs), 1) - require.Equal(t, iargs.indexIDs[0], int64(2)) } // roll back add index for table1 - err = schemaReplace.deleteRange(rollBackTable1IndexJob) + err = schemaReplace.restoreFromHistory(rollBackTable1IndexJob) require.NoError(t, err) - iargs = <-midr.indexCh - require.Equal(t, iargs.tableID, mDDLJobTable1NewID) - require.Equal(t, len(iargs.indexIDs), 1) - require.Equal(t, iargs.indexIDs[0], int64(2)) + qargs = <-midr.queryCh + require.Equal(t, len(qargs.ParamsList), 2) + // index ID + require.Equal(t, encodeTableIndexKey(mDDLJobTable1NewID, int64(2)), qargs.ParamsList[0].StartKey) + // temp index ID + require.Equal(t, encodeTableIndexKey(mDDLJobTable1NewID, int64(tablecodec.TempIndexPrefix|2)), qargs.ParamsList[1].StartKey) // drop index for table0 - err = schemaReplace.deleteRange(dropTable0IndexJob) + err = schemaReplace.restoreFromHistory(dropTable0IndexJob) require.NoError(t, err) + oldPartitionIDMap = make(map[string]struct{}) for i := 0; i < len(mDDLJobALLNewPartitionIDSet); i++ { - iargs = <-midr.indexCh - _, exist := mDDLJobALLNewPartitionIDSet[iargs.tableID] + qargs = <-midr.queryCh + require.Equal(t, len(qargs.ParamsList), 1) + _, exist := oldPartitionIDMap[qargs.ParamsList[0].StartKey] + require.False(t, exist) + oldPartitionIDMap[qargs.ParamsList[0].StartKey] = struct{}{} + _, exist = mDDLJobALLNewPartitionIndex2KeySet[qargs.ParamsList[0].StartKey] require.True(t, exist) - require.Equal(t, len(iargs.indexIDs), 1) - require.Equal(t, iargs.indexIDs[0], int64(2)) } // drop index for table1 - err = schemaReplace.deleteRange(dropTable1IndexJob) + err = schemaReplace.restoreFromHistory(dropTable1IndexJob) require.NoError(t, err) - iargs = <-midr.indexCh - require.Equal(t, iargs.tableID, mDDLJobTable1NewID) - require.Equal(t, len(iargs.indexIDs), 1) - require.Equal(t, iargs.indexIDs[0], int64(2)) + qargs = <-midr.queryCh + require.Equal(t, len(qargs.ParamsList), 1) + require.Equal(t, encodeTableIndexKey(mDDLJobTable1NewID, int64(2)), qargs.ParamsList[0].StartKey) - // drop indexes for table0 - err = schemaReplace.deleteRange(dropTable0IndexesJob) + // add index for table 0 + err = schemaReplace.restoreFromHistory(addTable0IndexJob) require.NoError(t, err) + oldPartitionIDMap = make(map[string]struct{}) for i := 0; i < len(mDDLJobALLNewPartitionIDSet); i++ { - iargs = <-midr.indexCh - _, exist := mDDLJobALLNewPartitionIDSet[iargs.tableID] + qargs = <-midr.queryCh + require.Equal(t, len(qargs.ParamsList), 1) + _, exist := oldPartitionIDMap[qargs.ParamsList[0].StartKey] + require.False(t, exist) + oldPartitionIDMap[qargs.ParamsList[0].StartKey] = struct{}{} + _, exist = mDDLJobALLNewPartitionTempIndex2KeySet[qargs.ParamsList[0].StartKey] require.True(t, exist) - require.Equal(t, len(iargs.indexIDs), len(mDDLJobALLIndexesIDSet)) - for _, indexID := range iargs.indexIDs { - _, exist := mDDLJobALLIndexesIDSet[indexID] - require.True(t, exist) - } } - // drop indexes for table1 - err = schemaReplace.deleteRange(dropTable1IndexesJob) + // add index for table 1 + err = schemaReplace.restoreFromHistory(addTable1IndexJob) require.NoError(t, err) - iargs = <-midr.indexCh - require.Equal(t, iargs.tableID, mDDLJobTable1NewID) - require.Equal(t, len(iargs.indexIDs), len(mDDLJobALLIndexesIDSet)) - for _, indexID := range iargs.indexIDs { - _, exist := mDDLJobALLIndexesIDSet[indexID] - require.True(t, exist) - } + qargs = <-midr.queryCh + require.Equal(t, len(qargs.ParamsList), 1) + require.Equal(t, encodeTableIndexKey(mDDLJobTable1NewID, tempIndex2), qargs.ParamsList[0].StartKey) // drop column for table0 - err = schemaReplace.deleteRange(dropTable0ColumnJob) + err = schemaReplace.restoreFromHistory(dropTable0ColumnJob) require.NoError(t, err) + oldPartitionIDMap = make(map[string]struct{}) for i := 0; i < len(mDDLJobALLNewPartitionIDSet); i++ { - iargs = <-midr.indexCh - _, exist := mDDLJobALLNewPartitionIDSet[iargs.tableID] - require.True(t, exist) - require.Equal(t, len(iargs.indexIDs), len(mDDLJobALLIndexesIDSet)) - for _, indexID := range iargs.indexIDs { - _, exist := mDDLJobALLIndexesIDSet[indexID] - require.True(t, exist) + qargs = <-midr.queryCh + require.Equal(t, len(qargs.ParamsList), 2) + for _, params := range qargs.ParamsList { + _, exist := oldPartitionIDMap[params.StartKey] + require.False(t, exist) + oldPartitionIDMap[params.StartKey] = struct{}{} } - } - // drop column for table1 - err = schemaReplace.deleteRange(dropTable1ColumnJob) - require.NoError(t, err) - iargs = <-midr.indexCh - require.Equal(t, iargs.tableID, mDDLJobTable1NewID) - require.Equal(t, len(iargs.indexIDs), len(mDDLJobALLIndexesIDSet)) - for _, indexID := range iargs.indexIDs { - _, exist := mDDLJobALLIndexesIDSet[indexID] + // index ID 2 + _, exist := mDDLJobALLNewPartitionIndex2KeySet[qargs.ParamsList[0].StartKey] + require.True(t, exist) + // index ID 3 + _, exist = mDDLJobALLNewPartitionIndex3KeySet[qargs.ParamsList[1].StartKey] require.True(t, exist) } - // drop columns for table0 - err = schemaReplace.deleteRange(dropTable0ColumnsJob) + // drop column for table1 + err = schemaReplace.restoreFromHistory(dropTable1ColumnJob) + require.NoError(t, err) + qargs = <-midr.queryCh + require.Equal(t, len(qargs.ParamsList), len(mDDLJobALLIndexesIDSet)) + // index ID 2 + require.Equal(t, encodeTableIndexKey(mDDLJobTable1NewID, int64(2)), qargs.ParamsList[0].StartKey) + // index ID 3 + require.Equal(t, encodeTableIndexKey(mDDLJobTable1NewID, int64(3)), qargs.ParamsList[1].StartKey) + + // modify column for table0 + err = schemaReplace.restoreFromHistory(modifyTable0ColumnJob) require.NoError(t, err) + oldPartitionIDMap = make(map[string]struct{}) for i := 0; i < len(mDDLJobALLNewPartitionIDSet); i++ { - iargs = <-midr.indexCh - _, exist := mDDLJobALLNewPartitionIDSet[iargs.tableID] - require.True(t, exist) - require.Equal(t, len(iargs.indexIDs), len(mDDLJobALLIndexesIDSet)) - for _, indexID := range iargs.indexIDs { - _, exist := mDDLJobALLIndexesIDSet[indexID] - require.True(t, exist) + qargs = <-midr.queryCh + require.Equal(t, len(qargs.ParamsList), 2) + for _, params := range qargs.ParamsList { + _, exist := oldPartitionIDMap[params.StartKey] + require.False(t, exist) + oldPartitionIDMap[params.StartKey] = struct{}{} } - } - // drop columns for table1 - err = schemaReplace.deleteRange(dropTable1ColumnsJob) - require.NoError(t, err) - iargs = <-midr.indexCh - require.Equal(t, iargs.tableID, mDDLJobTable1NewID) - require.Equal(t, len(iargs.indexIDs), len(mDDLJobALLIndexesIDSet)) - for _, indexID := range iargs.indexIDs { - _, exist := mDDLJobALLIndexesIDSet[indexID] + // index ID 2 + _, exist := mDDLJobALLNewPartitionIndex2KeySet[qargs.ParamsList[0].StartKey] require.True(t, exist) - } - - // drop columns for table0 - err = schemaReplace.deleteRange(modifyTable0ColumnJob) - require.NoError(t, err) - for i := 0; i < len(mDDLJobALLNewPartitionIDSet); i++ { - iargs = <-midr.indexCh - _, exist := mDDLJobALLNewPartitionIDSet[iargs.tableID] + // index ID 3 + _, exist = mDDLJobALLNewPartitionIndex3KeySet[qargs.ParamsList[1].StartKey] require.True(t, exist) - require.Equal(t, len(iargs.indexIDs), len(mDDLJobALLIndexesIDSet)) - for _, indexID := range iargs.indexIDs { - _, exist := mDDLJobALLIndexesIDSet[indexID] - require.True(t, exist) - } } - // drop columns for table1 - err = schemaReplace.deleteRange(modifyTable1ColumnJob) + // modify column for table1 + err = schemaReplace.restoreFromHistory(modifyTable1ColumnJob) require.NoError(t, err) - iargs = <-midr.indexCh - require.Equal(t, iargs.tableID, mDDLJobTable1NewID) - require.Equal(t, len(iargs.indexIDs), len(mDDLJobALLIndexesIDSet)) - for _, indexID := range iargs.indexIDs { - _, exist := mDDLJobALLIndexesIDSet[indexID] - require.True(t, exist) - } + qargs = <-midr.queryCh + require.Equal(t, len(qargs.ParamsList), len(mDDLJobALLIndexesIDSet)) + // index ID 2 + require.Equal(t, encodeTableIndexKey(mDDLJobTable1NewID, int64(2)), qargs.ParamsList[0].StartKey) + // index ID 3 + require.Equal(t, encodeTableIndexKey(mDDLJobTable1NewID, int64(3)), qargs.ParamsList[1].StartKey) // drop indexes(multi-schema-change) for table0 - err = schemaReplace.restoreFromHistory(multiSchemaChangeJob0, false) + err = schemaReplace.restoreFromHistory(multiSchemaChangeJob0) require.NoError(t, err) + oldPartitionIDMap = make(map[string]struct{}) for l := 0; l < 2; l++ { for i := 0; i < len(mDDLJobALLNewPartitionIDSet); i++ { - iargs = <-midr.indexCh - _, exist := mDDLJobALLNewPartitionIDSet[iargs.tableID] + qargs = <-midr.queryCh + require.Equal(t, len(qargs.ParamsList), 1) + _, exist := oldPartitionIDMap[qargs.ParamsList[0].StartKey] + require.False(t, exist) + oldPartitionIDMap[qargs.ParamsList[0].StartKey] = struct{}{} + _, exist = mDDLJobAllIndexesKeySet[l][qargs.ParamsList[0].StartKey] require.True(t, exist) - require.Equal(t, len(iargs.indexIDs), 1) - require.Equal(t, iargs.indexIDs[0], int64(l+1)) } } // drop indexes(multi-schema-change) for table1 - err = schemaReplace.restoreFromHistory(multiSchemaChangeJob1, false) + err = schemaReplace.restoreFromHistory(multiSchemaChangeJob1) require.NoError(t, err) - for l := 0; l < 2; l++ { - iargs = <-midr.indexCh - require.Equal(t, iargs.tableID, mDDLJobTable1NewID) - require.Equal(t, len(iargs.indexIDs), 1) - require.Equal(t, iargs.indexIDs[0], int64(l+1)) + qargs = <-midr.queryCh + require.Equal(t, len(qargs.ParamsList), 1) + require.Equal(t, encodeTableIndexKey(mDDLJobTable1NewID, int64(2)), qargs.ParamsList[0].StartKey) + + qargs = <-midr.queryCh + require.Equal(t, len(qargs.ParamsList), 1) + require.Equal(t, encodeTableIndexKey(mDDLJobTable1NewID, int64(3)), qargs.ParamsList[0].StartKey) +} + +func TestDeleteRangeForMDDLJob2(t *testing.T) { + midr := newMockInsertDeleteRange() + partitionMap := map[int64]int64{ + mDDLJobPartition0OldID: mDDLJobPartition0NewID, + mDDLJobPartition1OldID: mDDLJobPartition1NewID, + mDDLJobPartition2OldID: mDDLJobPartition2NewID, } + tableReplace0 := &TableReplace{ + TableID: mDDLJobTable0NewID, + PartitionMap: partitionMap, + } + tableReplace1 := &TableReplace{ + TableID: mDDLJobTable1NewID, + } + tableMap := map[int64]*TableReplace{ + mDDLJobTable0OldID: tableReplace0, + mDDLJobTable1OldID: tableReplace1, + } + dbReplace := &DBReplace{ + DbID: mDDLJobDBNewID, + TableMap: tableMap, + } + schemaReplace := MockEmptySchemasReplace(midr, map[int64]*DBReplace{ + mDDLJobDBOldID: dbReplace, + }) + var qargs *PreDelRangeQuery + // drop schema + err := schemaReplace.restoreFromHistory(dropSchemaJob) + require.NoError(t, err) + qargs = <-midr.queryCh + require.Equal(t, len(qargs.ParamsList), len(mDDLJobALLNewTableIDSet)) + for _, params := range qargs.ParamsList { + _, exist := mDDLJobALLNewTableKeySet[params.StartKey] + require.True(t, exist) + } + require.Equal(t, "INSERT IGNORE INTO mysql.gc_delete_range VALUES (%?, %?, %?, %?, %?),(%?, %?, %?, %?, %?),(%?, %?, %?, %?, %?),(%?, %?, %?, %?, %?),(%?, %?, %?, %?, %?)", qargs.Sql) + + // drop schema - lose rewrite rule of table 1 + tableMap_incomplete := map[int64]*TableReplace{ + mDDLJobTable0OldID: tableReplace0, + } + dbReplace.TableMap = tableMap_incomplete + schemaReplace = MockEmptySchemasReplace(midr, map[int64]*DBReplace{ + mDDLJobDBOldID: dbReplace, + }) + err = schemaReplace.restoreFromHistory(dropSchemaJob) + require.NoError(t, err) + qargs = <-midr.queryCh + require.Equal(t, len(qargs.ParamsList), len(mDDLJobALLNewPartitionIDSet)+1) + for _, params := range qargs.ParamsList { + _, exist := mDDLJobALLNewTableKeySet[params.StartKey] + require.True(t, exist) + } + require.Equal(t, "INSERT IGNORE INTO mysql.gc_delete_range VALUES (%?, %?, %?, %?, %?),(%?, %?, %?, %?, %?),(%?, %?, %?, %?, %?),(%?, %?, %?, %?, %?),", qargs.Sql) +} + +func TestCompatibleAlert(t *testing.T) { + require.Equal(t, ddl.BRInsertDeleteRangeSQLPrefix, `INSERT IGNORE INTO mysql.gc_delete_range VALUES `) + require.Equal(t, ddl.BRInsertDeleteRangeSQLValue, `(%?, %?, %?, %?, %?)`) } diff --git a/br/pkg/streamhelper/BUILD.bazel b/br/pkg/streamhelper/BUILD.bazel index 7e57de9888316..0c0f76828b58a 100644 --- a/br/pkg/streamhelper/BUILD.bazel +++ b/br/pkg/streamhelper/BUILD.bazel @@ -50,6 +50,7 @@ go_library( "@org_golang_google_grpc//keepalive", "@org_golang_google_grpc//status", "@org_golang_x_sync//errgroup", + "@org_uber_go_atomic//:atomic", "@org_uber_go_multierr//:multierr", "@org_uber_go_zap//:zap", ], diff --git a/br/pkg/streamhelper/basic_lib_for_test.go b/br/pkg/streamhelper/basic_lib_for_test.go index 59490e32ec7b9..ca9624ec45ccd 100644 --- a/br/pkg/streamhelper/basic_lib_for_test.go +++ b/br/pkg/streamhelper/basic_lib_for_test.go @@ -712,7 +712,7 @@ type mockPDClient struct { fakeRegions []*region } -func (p *mockPDClient) ScanRegions(ctx context.Context, key, endKey []byte, limit int) ([]*pd.Region, error) { +func (p *mockPDClient) ScanRegions(ctx context.Context, key, endKey []byte, limit int, _ ...pd.GetRegionOption) ([]*pd.Region, error) { sort.Slice(p.fakeRegions, func(i, j int) bool { return bytes.Compare(p.fakeRegions[i].rng.StartKey, p.fakeRegions[j].rng.StartKey) < 0 }) diff --git a/br/pkg/streamhelper/collector.go b/br/pkg/streamhelper/collector.go index 8f11e419678fa..7f54fa9e26bed 100644 --- a/br/pkg/streamhelper/collector.go +++ b/br/pkg/streamhelper/collector.go @@ -8,7 +8,6 @@ import ( "strconv" "strings" "sync" - "sync/atomic" "github.com/pingcap/errors" logbackup "github.com/pingcap/kvproto/pkg/logbackuppb" @@ -17,6 +16,7 @@ import ( "github.com/pingcap/tidb/br/pkg/utils" "github.com/pingcap/tidb/pkg/kv" "github.com/pingcap/tidb/pkg/metrics" + "go.uber.org/atomic" "go.uber.org/zap" ) @@ -38,7 +38,7 @@ type storeCollector struct { input chan RegionWithLeader // the oneshot error reporter. - err *atomic.Value + err *atomic.Error // whether the recv and send loop has exited. doneMessenger chan struct{} onSuccess onSuccessHook @@ -58,28 +58,20 @@ func newStoreCollector(storeID uint64, srv LogBackupService) *storeCollector { batchSize: defaultBatchSize, service: srv, input: make(chan RegionWithLeader, defaultBatchSize), - err: new(atomic.Value), + err: new(atomic.Error), doneMessenger: make(chan struct{}), regionMap: make(map[uint64]kv.KeyRange), } } func (c *storeCollector) reportErr(err error) { - if oldErr := c.Err(); oldErr != nil { + if oldErr := c.err.Load(); oldErr != nil { log.Warn("reporting error twice, ignoring", logutil.AShortError("old", err), logutil.AShortError("new", oldErr)) return } c.err.Store(err) } -func (c *storeCollector) Err() error { - err, ok := c.err.Load().(error) - if !ok { - return nil - } - return err -} - func (c *storeCollector) setOnSuccessHook(hook onSuccessHook) { c.onSuccess = hook } @@ -166,7 +158,7 @@ func (c *storeCollector) spawn(ctx context.Context) func(context.Context) (Store return StoreCheckpoints{}, cx.Err() case <-c.doneMessenger: } - if err := c.Err(); err != nil { + if err := c.err.Load(); err != nil { return StoreCheckpoints{}, err } sc := StoreCheckpoints{ @@ -302,7 +294,7 @@ func (c *clusterCollector) CollectRegion(r RegionWithLeader) error { case sc.input <- r: return nil case <-sc.doneMessenger: - err := sc.Err() + err := sc.err.Load() if err != nil { c.cancel() } diff --git a/br/pkg/summary/main_test.go b/br/pkg/summary/main_test.go index 68a1a8afad13d..6193fa3b2d75c 100644 --- a/br/pkg/summary/main_test.go +++ b/br/pkg/summary/main_test.go @@ -25,6 +25,7 @@ func TestMain(m *testing.M) { testsetup.SetupForCommonTest() opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), diff --git a/br/pkg/task/BUILD.bazel b/br/pkg/task/BUILD.bazel index cac5b33d9d0bc..bd381b38a2c7a 100644 --- a/br/pkg/task/BUILD.bazel +++ b/br/pkg/task/BUILD.bazel @@ -20,6 +20,7 @@ go_library( deps = [ "//br/pkg/aws", "//br/pkg/backup", + "//br/pkg/backup/prepare_snap", "//br/pkg/checkpoint", "//br/pkg/checksum", "//br/pkg/common", @@ -99,7 +100,7 @@ go_test( ], embed = [":task"], flaky = True, - shard_count = 21, + shard_count = 22, deps = [ "//br/pkg/conn", "//br/pkg/errors", diff --git a/br/pkg/task/backup_ebs.go b/br/pkg/task/backup_ebs.go index 982d732b714be..1394e64bb1ae9 100644 --- a/br/pkg/task/backup_ebs.go +++ b/br/pkg/task/backup_ebs.go @@ -21,12 +21,12 @@ import ( "github.com/pingcap/log" "github.com/pingcap/tidb/br/pkg/aws" "github.com/pingcap/tidb/br/pkg/backup" + preparesnap "github.com/pingcap/tidb/br/pkg/backup/prepare_snap" "github.com/pingcap/tidb/br/pkg/common" "github.com/pingcap/tidb/br/pkg/config" "github.com/pingcap/tidb/br/pkg/conn" "github.com/pingcap/tidb/br/pkg/conn/util" "github.com/pingcap/tidb/br/pkg/glue" - "github.com/pingcap/tidb/br/pkg/logutil" "github.com/pingcap/tidb/br/pkg/metautil" "github.com/pingcap/tidb/br/pkg/pdutil" "github.com/pingcap/tidb/br/pkg/storage" @@ -34,6 +34,8 @@ import ( "github.com/pingcap/tidb/br/pkg/utils" "github.com/pingcap/tidb/br/pkg/version" "github.com/spf13/pflag" + "github.com/tikv/client-go/v2/tikv" + "go.uber.org/multierr" "go.uber.org/zap" "golang.org/x/sync/errgroup" "google.golang.org/grpc" @@ -136,43 +138,38 @@ func RunBackupEBS(c context.Context, g glue.Glue, cfg *BackupConfig) error { // Step.1.1 stop scheduler as much as possible. log.Info("starting to remove some PD schedulers and pausing GC", zap.Bool("already-paused-by-operator", cfg.SkipPauseGCAndScheduler)) - var restoreFunc pdutil.UndoFunc + var ( + restoreFunc pdutil.UndoFunc + finalizeOnce sync.Once + preparer = preparesnap.New(preparesnap.CliEnv{ + Cache: tikv.NewRegionCache(mgr.PDClient()), + Mgr: mgr.StoreManager, + }) + goBackupToNormal = func(ctx context.Context) error { + var err error + finalizeOnce.Do(func() { + var restoreE error + if restoreFunc != nil { + restoreE = restoreFunc(ctx) + } + err = multierr.Combine(preparer.Finalize(ctx), restoreE) + }) + return err + } + ) + // NOTE: we need to use the same technique as the `operator` command did. + // But it is impossible for now due to importing cycle. if !cfg.SkipPauseGCAndScheduler { var e error restoreFunc, e = mgr.RemoveAllPDSchedulers(ctx) if e != nil { return errors.Trace(err) } - denyLightning := utils.NewSuspendImporting("backup_ebs_command", mgr.StoreManager) - _, err := denyLightning.DenyAllStores(ctx, utils.DefaultBRGCSafePointTTL) - if err != nil { - return errors.Annotate(err, "lightning from running") + if err := preparer.DriveLoopAndWaitPrepare(ctx); err != nil { + return err } - go func() { - if err := denyLightning.Keeper(ctx, utils.DefaultBRGCSafePointTTL); err != nil { - log.Warn("cannot keep deny importing, the backup archive may not be useable if there were importing.", logutil.ShortError(err)) - } - }() - defer func() { - if ctx.Err() != nil { - log.Warn("context canceled, doing clean work with background context") - ctx = context.Background() - } - if restoreFunc == nil { - return - } - if restoreE := restoreFunc(ctx); restoreE != nil { - log.Warn("failed to restore removed schedulers, you may need to restore them manually", zap.Error(restoreE)) - } - res, err := denyLightning.AllowAllStores(ctx) - if err != nil { - log.Warn("failed to restore importing, you may need to wait until you are able to start importing", zap.Duration("wait_for", utils.DefaultBRGCSafePointTTL)) - } - if err := denyLightning.ConsistentWithPrev(res); err != nil { - log.Warn("lightning hasn't been denied, the backup archive may not be usable.", logutil.ShortError(err)) - } - }() + defer utils.WithCleanUp(nil, 2*time.Minute, goBackupToNormal) } if err := waitAllScheduleStoppedAndNoRegionHole(ctx, cfg.Config, mgr); err != nil { @@ -248,11 +245,8 @@ func RunBackupEBS(c context.Context, g glue.Glue, cfg *BackupConfig) error { if !cfg.SkipPauseGCAndScheduler { log.Info("snapshot started, restore schedule") - if restoreE := restoreFunc(ctx); restoreE != nil { + if restoreE := goBackupToNormal(ctx); restoreE != nil { log.Warn("failed to restore removed schedulers, you may need to restore them manually", zap.Error(restoreE)) - } else { - // Clear the restore func, so we won't execute it many times. - restoreFunc = nil } } diff --git a/br/pkg/task/common_test.go b/br/pkg/task/common_test.go index a5d43d3f2e7a9..5db9d638a1658 100644 --- a/br/pkg/task/common_test.go +++ b/br/pkg/task/common_test.go @@ -207,12 +207,14 @@ func expectedDefaultRestoreConfig() RestoreConfig { return RestoreConfig{ Config: defaultConfig, RestoreCommonConfig: RestoreCommonConfig{Online: false, + Granularity: "fine-grained", MergeSmallRegionSizeBytes: 0x6000000, MergeSmallRegionKeyCount: 0xea600, - WithSysTable: false, + WithSysTable: true, ResetSysUsers: []string{"cloud_admin", "root"}}, NoSchema: false, PDConcurrency: 0x1, + StatsConcurrency: 0xc, BatchFlushInterval: 16000000000, DdlBatchSize: 0x80, WithPlacementPolicy: "STRICT", diff --git a/br/pkg/task/operator/BUILD.bazel b/br/pkg/task/operator/BUILD.bazel index 5ce85cbd1313f..52c99c845b57b 100644 --- a/br/pkg/task/operator/BUILD.bazel +++ b/br/pkg/task/operator/BUILD.bazel @@ -9,6 +9,8 @@ go_library( importpath = "github.com/pingcap/tidb/br/pkg/task/operator", visibility = ["//visibility:public"], deps = [ + "//br/pkg/backup/prepare_snap", + "//br/pkg/errors", "//br/pkg/logutil", "//br/pkg/pdutil", "//br/pkg/task", @@ -16,8 +18,10 @@ go_library( "@com_github_pingcap_errors//:errors", "@com_github_pingcap_log//:log", "@com_github_spf13_pflag//:pflag", + "@com_github_tikv_client_go_v2//tikv", "@org_golang_google_grpc//keepalive", "@org_golang_x_sync//errgroup", + "@org_uber_go_multierr//:multierr", "@org_uber_go_zap//:zap", ], ) diff --git a/br/pkg/task/operator/cmd.go b/br/pkg/task/operator/cmd.go index 909d18911c8d0..86fddb668d701 100644 --- a/br/pkg/task/operator/cmd.go +++ b/br/pkg/task/operator/cmd.go @@ -5,16 +5,24 @@ package operator import ( "context" "crypto/tls" + "fmt" + "math/rand" + "os" + "runtime/debug" "strings" "sync" "time" "github.com/pingcap/errors" "github.com/pingcap/log" + preparesnap "github.com/pingcap/tidb/br/pkg/backup/prepare_snap" + berrors "github.com/pingcap/tidb/br/pkg/errors" "github.com/pingcap/tidb/br/pkg/logutil" "github.com/pingcap/tidb/br/pkg/pdutil" "github.com/pingcap/tidb/br/pkg/task" "github.com/pingcap/tidb/br/pkg/utils" + "github.com/tikv/client-go/v2/tikv" + "go.uber.org/multierr" "go.uber.org/zap" "golang.org/x/sync/errgroup" "google.golang.org/grpc/keepalive" @@ -38,13 +46,28 @@ func dialPD(ctx context.Context, cfg *task.Config) (*pdutil.PdController, error) } func (cx *AdaptEnvForSnapshotBackupContext) cleanUpWith(f func(ctx context.Context)) { - _ = cx.cleanUpWithErr(func(ctx context.Context) error { f(ctx); return nil }) + cx.cleanUpWithRetErr(nil, func(ctx context.Context) error { f(ctx); return nil }) } -func (cx *AdaptEnvForSnapshotBackupContext) cleanUpWithErr(f func(ctx context.Context) error) error { +func (cx *AdaptEnvForSnapshotBackupContext) cleanUpWithRetErr(errOut *error, f func(ctx context.Context) error) { ctx, cancel := context.WithTimeout(context.Background(), cx.cfg.TTL) defer cancel() - return f(ctx) + err := f(ctx) + if errOut != nil { + *errOut = multierr.Combine(*errOut, err) + } +} + +func (cx *AdaptEnvForSnapshotBackupContext) run(f func() error) { + cx.rdGrp.Add(1) + buf := debug.Stack() + cx.runGrp.Go(func() error { + err := f() + if err != nil { + log.Error("A task failed.", zap.Error(err), zap.ByteString("task-created-at", buf)) + } + return err + }) } type AdaptEnvForSnapshotBackupContext struct { @@ -58,6 +81,18 @@ type AdaptEnvForSnapshotBackupContext struct { runGrp *errgroup.Group } +func (cx *AdaptEnvForSnapshotBackupContext) Close() { + cx.pdMgr.Close() + cx.kvMgr.Close() +} + +func (cx *AdaptEnvForSnapshotBackupContext) GetBackOffer(operation string) utils.Backoffer { + state := utils.InitialRetryState(64, 1*time.Second, 10*time.Second) + bo := utils.GiveUpRetryOn(&state, berrors.ErrPossibleInconsistency) + bo = utils.VerboseRetry(bo, logutil.CL(cx).With(zap.String("operation", operation))) + return bo +} + func (cx *AdaptEnvForSnapshotBackupContext) ReadyL(name string, notes ...zap.Field) { logutil.CL(cx).Info("Stage ready.", append(notes, zap.String("component", name))...) cx.rdGrp.Done() @@ -77,6 +112,7 @@ func AdaptEnvForSnapshotBackup(ctx context.Context, cfg *PauseGcConfig) error { if err != nil { return errors.Annotate(err, "failed to dial PD") } + mgr.SchedulerPauseTTL = cfg.TTL var tconf *tls.Config if cfg.TLS.IsEnabled() { tconf, err = cfg.TLS.ToTLSConfig() @@ -97,73 +133,94 @@ func AdaptEnvForSnapshotBackup(ctx context.Context, cfg *PauseGcConfig) error { rdGrp: sync.WaitGroup{}, runGrp: eg, } - cx.rdGrp.Add(3) + defer cx.Close() - eg.Go(func() error { return pauseGCKeeper(cx) }) - eg.Go(func() error { return pauseSchedulerKeeper(cx) }) - eg.Go(func() error { return pauseImporting(cx) }) + cx.run(func() error { return pauseGCKeeper(cx) }) + cx.run(func() error { return pauseSchedulerKeeper(cx) }) + cx.run(func() error { return pauseAdminAndWaitApply(cx) }) go func() { cx.rdGrp.Wait() + if cfg.OnAllReady != nil { + cfg.OnAllReady() + } hintAllReady() }() + defer func() { + if cfg.OnExit != nil { + cfg.OnExit() + } + }() return eg.Wait() } -func pauseImporting(cx *AdaptEnvForSnapshotBackupContext) error { - denyLightning := utils.NewSuspendImporting("prepare_for_snapshot_backup", cx.kvMgr) - if _, err := denyLightning.DenyAllStores(cx, cx.cfg.TTL); err != nil { - return errors.Trace(err) +func pauseAdminAndWaitApply(cx *AdaptEnvForSnapshotBackupContext) error { + env := preparesnap.CliEnv{ + Cache: tikv.NewRegionCache(cx.pdMgr.GetPDClient()), + Mgr: cx.kvMgr, } - cx.ReadyL("pause_lightning") - cx.runGrp.Go(func() error { - err := denyLightning.Keeper(cx, cx.cfg.TTL) - if errors.Cause(err) != context.Canceled { - logutil.CL(cx).Warn("keeper encounters error.", logutil.ShortError(err)) + defer env.Cache.Close() + retryEnv := preparesnap.RetryAndSplitRequestEnv{Env: env} + begin := time.Now() + prep := preparesnap.New(retryEnv) + prep.LeaseDuration = cx.cfg.TTL + + defer cx.cleanUpWith(func(ctx context.Context) { + if err := prep.Finalize(ctx); err != nil { + logutil.CL(ctx).Warn("failed to finalize the prepare stream", logutil.ShortError(err)) } - return cx.cleanUpWithErr(func(ctx context.Context) error { - for { - if ctx.Err() != nil { - return errors.Annotate(ctx.Err(), "cleaning up timed out") - } - res, err := denyLightning.AllowAllStores(ctx) - if err != nil { - logutil.CL(ctx).Warn("Failed to restore lightning, will retry.", logutil.ShortError(err)) - // Retry for 10 times. - time.Sleep(cx.cfg.TTL / 10) - continue - } - return denyLightning.ConsistentWithPrev(res) - } - }) }) + + // We must use our own context here, or once we are cleaning up the client will be invalid. + myCtx := logutil.ContextWithField(context.Background(), zap.String("category", "pause_admin_and_wait_apply")) + if err := prep.DriveLoopAndWaitPrepare(myCtx); err != nil { + return err + } + + cx.ReadyL("pause_admin_and_wait_apply", zap.Stringer("take", time.Since(begin))) + <-cx.Done() return nil } -func pauseGCKeeper(ctx *AdaptEnvForSnapshotBackupContext) error { +func getCallerName() string { + name, err := os.Hostname() + if err != nil { + name = fmt.Sprintf("UNKNOWN-%d", rand.Int63()) + } + return fmt.Sprintf("operator@%sT%d#%d", name, time.Now().Unix(), os.Getpid()) +} + +func pauseGCKeeper(cx *AdaptEnvForSnapshotBackupContext) (err error) { // Note: should we remove the service safepoint as soon as this exits? sp := utils.BRServiceSafePoint{ ID: utils.MakeSafePointID(), - TTL: int64(ctx.cfg.TTL.Seconds()), - BackupTS: ctx.cfg.SafePoint, + TTL: int64(cx.cfg.TTL.Seconds()), + BackupTS: cx.cfg.SafePoint, } if sp.BackupTS == 0 { - rts, err := ctx.pdMgr.GetMinResolvedTS(ctx) + rts, err := cx.pdMgr.GetMinResolvedTS(cx) if err != nil { return err } - logutil.CL(ctx).Info("No service safepoint provided, using the minimal resolved TS.", zap.Uint64("min-resolved-ts", rts)) + logutil.CL(cx).Info("No service safepoint provided, using the minimal resolved TS.", zap.Uint64("min-resolved-ts", rts)) sp.BackupTS = rts } - err := utils.StartServiceSafePointKeeper(ctx, ctx.pdMgr.GetPDClient(), sp) + err = utils.StartServiceSafePointKeeper(cx, cx.pdMgr.GetPDClient(), sp) if err != nil { return err } - ctx.ReadyL("pause_gc", zap.Object("safepoint", sp)) + cx.ReadyL("pause_gc", zap.Object("safepoint", sp)) + defer cx.cleanUpWithRetErr(&err, func(ctx context.Context) error { + cancelSP := utils.BRServiceSafePoint{ + ID: sp.ID, + TTL: 0, + } + return utils.UpdateServiceSafePoint(ctx, cx.pdMgr.GetPDClient(), cancelSP) + }) // Note: in fact we can directly return here. // But the name `keeper` implies once the function exits, // the GC should be resume, so let's block here. - <-ctx.Done() + <-cx.Done() return nil } diff --git a/br/pkg/task/operator/config.go b/br/pkg/task/operator/config.go index 998fdc64d961e..693d4908bdee6 100644 --- a/br/pkg/task/operator/config.go +++ b/br/pkg/task/operator/config.go @@ -14,10 +14,13 @@ type PauseGcConfig struct { SafePoint uint64 `json:"safepoint" yaml:"safepoint"` TTL time.Duration `json:"ttl" yaml:"ttl"` + + OnAllReady func() `json:"-" yaml:"-"` + OnExit func() `json:"-" yaml:"-"` } func DefineFlagsForPrepareSnapBackup(f *pflag.FlagSet) { - _ = f.DurationP("ttl", "i", 5*time.Minute, "The time-to-live of the safepoint.") + _ = f.DurationP("ttl", "i", 2*time.Minute, "The time-to-live of the safepoint.") _ = f.Uint64P("safepoint", "t", 0, "The GC safepoint to be kept.") } diff --git a/br/pkg/task/restore.go b/br/pkg/task/restore.go index f51f3cacd8a81..bc60b155ec101 100644 --- a/br/pkg/task/restore.go +++ b/br/pkg/task/restore.go @@ -5,6 +5,7 @@ package task import ( "context" "fmt" + "sort" "strings" "time" @@ -40,8 +41,10 @@ import ( ) const ( - flagOnline = "online" - flagNoSchema = "no-schema" + flagOnline = "online" + flagNoSchema = "no-schema" + flagGranularity = "granularity" + flagConcurrencyPerStore = "tikv-max-restore-concurrency" // FlagMergeRegionSizeBytes is the flag name of merge small regions by size FlagMergeRegionSizeBytes = "merge-region-size-bytes" @@ -49,6 +52,8 @@ const ( FlagMergeRegionKeyCount = "merge-region-key-count" // FlagPDConcurrency controls concurrency pd-relative operations like split & scatter. FlagPDConcurrency = "pd-concurrency" + // FlagStatsConcurrency controls concurrency to restore statistic. + FlagStatsConcurrency = "stats-concurrency" // FlagBatchFlushInterval controls after how long the restore batch would be auto sended. FlagBatchFlushInterval = "batch-flush-interval" // FlagDdlBatchSize controls batch ddl size to create a batch of tables @@ -78,11 +83,12 @@ const ( defaultPiTRBatchSize = 16 * 1024 * 1024 defaultRestoreConcurrency = 128 defaultPiTRConcurrency = 16 - maxRestoreBatchSizeLimit = 10240 defaultPDConcurrency = 1 + defaultStatsConcurrency = 12 defaultBatchFlushInterval = 16 * time.Second defaultFlagDdlBatchSize = 128 resetSpeedLimitRetryTimes = 3 + maxRestoreBatchSizeLimit = 10240 ) const ( @@ -96,7 +102,9 @@ const ( // RestoreCommonConfig is the common configuration for all BR restore tasks. type RestoreCommonConfig struct { - Online bool `json:"online" toml:"online"` + Online bool `json:"online" toml:"online"` + Granularity string `json:"granularity" toml:"granularity"` + ConcurrencyPerStore uint `json:"tikv-max-restore-concurrency" toml:"tikv-max-restore-concurrency"` // MergeSmallRegionSizeBytes is the threshold of merging small regions (Default 96MB, region split size). // MergeSmallRegionKeyCount is the threshold of merging smalle regions (Default 960_000, region split key count). @@ -119,13 +127,21 @@ func (cfg *RestoreCommonConfig) adjust() { if cfg.MergeSmallRegionSizeBytes == 0 { cfg.MergeSmallRegionSizeBytes = conn.DefaultMergeRegionSizeBytes } + if len(cfg.Granularity) == 0 { + cfg.Granularity = string(restore.FineGrained) + } + if cfg.ConcurrencyPerStore == 0 { + cfg.ConcurrencyPerStore = 128 + } } // DefineRestoreCommonFlags defines common flags for the restore command. func DefineRestoreCommonFlags(flags *pflag.FlagSet) { // TODO remove experimental tag if it's stable flags.Bool(flagOnline, false, "(experimental) Whether online when restore") - flags.Uint32(flagConcurrency, 128, "The size of thread pool on BR that executes tasks, "+ + flags.String(flagGranularity, string(restore.FineGrained), "(experimental) Whether split & scatter regions using fine-grained way during restore") + flags.Uint(flagConcurrencyPerStore, 128, "(experimental) The size of thread pool on each store that executes tasks") + flags.Uint32(flagConcurrency, 128, "(deprecated) The size of thread pool on BR that executes tasks, "+ "where each task restores one SST file to TiKV") flags.Uint64(FlagMergeRegionSizeBytes, conn.DefaultMergeRegionSizeBytes, "the threshold of merging small regions (Default 96MB, region split size)") @@ -133,17 +149,20 @@ func DefineRestoreCommonFlags(flags *pflag.FlagSet) { "the threshold of merging small regions (Default 960_000, region split key count)") flags.Uint(FlagPDConcurrency, defaultPDConcurrency, "concurrency pd-relative operations like split & scatter.") + flags.Uint(FlagStatsConcurrency, defaultStatsConcurrency, + "concurrency to restore statistic") flags.Duration(FlagBatchFlushInterval, defaultBatchFlushInterval, "after how long a restore batch would be auto sent.") flags.Uint(FlagDdlBatchSize, defaultFlagDdlBatchSize, "batch size for ddl to create a batch of tables once.") - flags.Bool(flagWithSysTable, false, "whether restore system privilege tables on default setting") + flags.Bool(flagWithSysTable, true, "whether restore system privilege tables on default setting") flags.StringArrayP(FlagResetSysUsers, "", []string{"cloud_admin", "root"}, "whether reset these users after restoration") flags.Bool(flagUseFSR, false, "whether enable FSR for AWS snapshots") _ = flags.MarkHidden(FlagResetSysUsers) _ = flags.MarkHidden(FlagMergeRegionSizeBytes) _ = flags.MarkHidden(FlagMergeRegionKeyCount) _ = flags.MarkHidden(FlagPDConcurrency) + _ = flags.MarkHidden(FlagStatsConcurrency) _ = flags.MarkHidden(FlagBatchFlushInterval) _ = flags.MarkHidden(FlagDdlBatchSize) } @@ -155,6 +174,10 @@ func (cfg *RestoreCommonConfig) ParseFromFlags(flags *pflag.FlagSet) error { if err != nil { return errors.Trace(err) } + cfg.Granularity, err = flags.GetString(flagGranularity) + if err != nil { + return errors.Trace(err) + } cfg.MergeSmallRegionKeyCount, err = flags.GetUint64(FlagMergeRegionKeyCount) if err != nil { return errors.Trace(err) @@ -184,6 +207,7 @@ type RestoreConfig struct { NoSchema bool `json:"no-schema" toml:"no-schema"` PDConcurrency uint `json:"pd-concurrency" toml:"pd-concurrency"` + StatsConcurrency uint `json:"stats-concurrency" toml:"stats-concurrency"` BatchFlushInterval time.Duration `json:"batch-flush-interval" toml:"batch-flush-interval"` // DdlBatchSize use to define the size of batch ddl to create tables DdlBatchSize uint `json:"ddl-batch-size" toml:"ddl-batch-size"` @@ -217,6 +241,7 @@ type RestoreConfig struct { VolumeType pconfig.EBSVolumeType `json:"volume-type" toml:"volume-type"` VolumeIOPS int64 `json:"volume-iops" toml:"volume-iops"` VolumeThroughput int64 `json:"volume-throughput" toml:"volume-throughput"` + VolumeEncrypted bool `json:"volume-encrypted" toml:"volume-encrypted"` ProgressFile string `json:"progress-file" toml:"progress-file"` TargetAZ string `json:"target-az" toml:"target-az"` UseFSR bool `json:"use-fsr" toml:"use-fsr"` @@ -315,6 +340,10 @@ func (cfg *RestoreConfig) ParseFromFlags(flags *pflag.FlagSet) error { if err != nil { return errors.Annotatef(err, "failed to get flag %s", FlagPDConcurrency) } + cfg.StatsConcurrency, err = flags.GetUint(FlagStatsConcurrency) + if err != nil { + return errors.Annotatef(err, "failed to get flag %s", FlagStatsConcurrency) + } cfg.BatchFlushInterval, err = flags.GetDuration(FlagBatchFlushInterval) if err != nil { return errors.Annotatef(err, "failed to get flag %s", FlagBatchFlushInterval) @@ -382,6 +411,9 @@ func (cfg *RestoreConfig) ParseFromFlags(flags *pflag.FlagSet) error { if cfg.VolumeThroughput, err = flags.GetInt64(flagVolumeThroughput); err != nil { return errors.Trace(err) } + if cfg.VolumeEncrypted, err = flags.GetBool(flagVolumeEncrypted); err != nil { + return errors.Trace(err) + } cfg.ProgressFile, err = flags.GetString(flagProgressFile) if err != nil { @@ -426,6 +458,9 @@ func (cfg *RestoreConfig) Adjust() { if cfg.PDConcurrency == 0 { cfg.PDConcurrency = defaultPDConcurrency } + if cfg.StatsConcurrency == 0 { + cfg.StatsConcurrency = defaultStatsConcurrency + } if cfg.BatchFlushInterval == 0 { cfg.BatchFlushInterval = defaultBatchFlushInterval } @@ -469,7 +504,7 @@ func (cfg *RestoreConfig) generateSnapshotRestoreTaskName(clusterID uint64) stri func configureRestoreClient(ctx context.Context, client *restore.Client, cfg *RestoreConfig) error { client.SetRateLimit(cfg.RateLimit) client.SetCrypter(&cfg.CipherInfo) - client.SetConcurrency(uint(cfg.Concurrency)) + client.SetGranularity(cfg.Granularity) if cfg.Online { client.EnableOnline() } @@ -493,7 +528,8 @@ func configureRestoreClient(ctx context.Context, client *restore.Client, cfg *Re if err != nil { return errors.Trace(err) } - + client.SetConcurrency(uint(cfg.Concurrency)) + client.SetConcurrencyPerStore(cfg.ConcurrencyPerStore) return nil } @@ -681,7 +717,13 @@ func runRestore(c context.Context, g glue.Glue, cmdName string, cfg *RestoreConf } keepaliveCfg.PermitWithoutStream = true - client := restore.NewRestoreClient(mgr.GetPDClient(), mgr.GetTLSConfig(), keepaliveCfg, false) + client := restore.NewRestoreClient( + mgr.GetPDClient(), + mgr.GetPDHTTPClient(), + mgr.GetTLSConfig(), + keepaliveCfg, + false, + ) err = configureRestoreClient(ctx, client, cfg) if err != nil { return errors.Trace(err) @@ -697,13 +739,14 @@ func runRestore(c context.Context, g glue.Glue, cmdName string, cfg *RestoreConf if err != nil { return errors.Trace(err) } + backupVersion := version.NormalizeBackupVersion(backupMeta.ClusterVersion) if cfg.CheckRequirements && backupVersion != nil { if versionErr := version.CheckClusterVersion(ctx, mgr.GetPDClient(), version.CheckVersionForBackup(backupVersion)); versionErr != nil { return errors.Trace(versionErr) } } - if err = restore.CheckNewCollationEnable(backupMeta.GetNewCollationsEnabled(), g, mgr.GetStorage(), cfg.CheckRequirements); err != nil { + if _, err = restore.CheckNewCollationEnable(backupMeta.GetNewCollationsEnabled(), g, mgr.GetStorage(), cfg.CheckRequirements); err != nil { return errors.Trace(err) } @@ -932,6 +975,9 @@ func runRestore(c context.Context, g glue.Glue, cmdName string, cfg *RestoreConf }) } + // Block on creating tables before restore starts. since create table is no longer a heavy operation any more. + tableStream = GoBlockCreateTablesPipeline(ctx, maxRestoreBatchSizeLimit, tableStream) + tableFileMap := restore.MapTableToFiles(files) log.Debug("mapped table to files", zap.Any("result map", tableFileMap)) @@ -953,6 +999,9 @@ func runRestore(c context.Context, g glue.Glue, cmdName string, cfg *RestoreConf // Restore sst files in batch. batchSize := mathutil.Clamp(int(cfg.Concurrency), defaultRestoreConcurrency, maxRestoreBatchSizeLimit) + if client.GetGranularity() == string(restore.CoarseGrained) { + batchSize = mathutil.Max(int(client.GetTotalDownloadConcurrency()), maxRestoreBatchSizeLimit) + } failpoint.Inject("small-batch-size", func(v failpoint.Value) { log.Info("failpoint small batch size is on", zap.Int("size", v.(int))) batchSize = v.(int) @@ -973,7 +1022,7 @@ func runRestore(c context.Context, g glue.Glue, cmdName string, cfg *RestoreConf progressLen, !cfg.LogProgress) defer updateCh.Close() - sender, err := restore.NewTiKVSender(ctx, client, updateCh, cfg.PDConcurrency) + sender, err := restore.NewTiKVSender(ctx, client, updateCh, cfg.PDConcurrency, cfg.Granularity) if err != nil { return errors.Trace(err) } @@ -991,7 +1040,7 @@ func runRestore(c context.Context, g glue.Glue, cmdName string, cfg *RestoreConf if cfg.Checksum { afterTableCheckesumedCh := client.GoValidateChecksum( ctx, afterTableRestoredCh, mgr.GetStorage().GetClient(), errCh, updateCh, cfg.ChecksumConcurrency) - afterTableLoadStatsCh := client.GoUpdateMetaAndLoadStats(ctx, afterTableCheckesumedCh, errCh) + afterTableLoadStatsCh := client.GoUpdateMetaAndLoadStats(ctx, s, &cfg.CipherInfo, afterTableCheckesumedCh, errCh, cfg.StatsConcurrency) postHandleCh = afterTableLoadStatsCh } @@ -1034,7 +1083,10 @@ func runRestore(c context.Context, g glue.Glue, cmdName string, cfg *RestoreConf // The cost of rename user table / replace into system table wouldn't be so high. // So leave it out of the pipeline for easier implementation. - client.RestoreSystemSchemas(ctx, cfg.TableFilter) + err = client.RestoreSystemSchemas(ctx, cfg.TableFilter) + if err != nil { + return errors.Trace(err) + } schedulersRemovable = true @@ -1075,7 +1127,7 @@ func dropToBlackhole( func filterRestoreFiles( client *restore.Client, cfg *RestoreConfig, -) (files []*backuppb.File, tables []*metautil.Table, dbs []*utils.Database) { +) (files []*backuppb.File, tables []*metautil.Table, dbs []*metautil.Database) { for _, db := range client.GetDatabases() { dbName := db.Info.Name.O if name, ok := utils.GetSysDBName(db.Info.Name); utils.IsSysDB(name) && ok { @@ -1181,3 +1233,29 @@ func restoreTableStream( } } } + +func GoBlockCreateTablesPipeline(ctx context.Context, sz int, inCh <-chan restore.CreatedTable) <-chan restore.CreatedTable { + outCh := make(chan restore.CreatedTable, sz) + + go func() { + defer close(outCh) + cachedTables := make([]restore.CreatedTable, 0, sz) + for tbl := range inCh { + cachedTables = append(cachedTables, tbl) + } + + sort.Slice(cachedTables, func(a, b int) bool { + return cachedTables[a].Table.ID < cachedTables[b].Table.ID + }) + + for _, tbl := range cachedTables { + select { + case <-ctx.Done(): + return + default: + outCh <- tbl + } + } + }() + return outCh +} diff --git a/br/pkg/task/restore_data.go b/br/pkg/task/restore_data.go index 3276a0f2af101..8fb40a05b47c9 100644 --- a/br/pkg/task/restore_data.go +++ b/br/pkg/task/restore_data.go @@ -77,7 +77,13 @@ func RunResolveKvData(c context.Context, g glue.Glue, cmdName string, cfg *Resto tc.EnableGlobalKill = false tidbconfig.StoreGlobalConfig(tc) - client := restore.NewRestoreClient(mgr.GetPDClient(), mgr.GetTLSConfig(), keepaliveCfg, false) + client := restore.NewRestoreClient( + mgr.GetPDClient(), + mgr.GetPDHTTPClient(), + mgr.GetTLSConfig(), + keepaliveCfg, + false, + ) restoreTS, err := client.GetTS(ctx) if err != nil { diff --git a/br/pkg/task/restore_ebs_meta.go b/br/pkg/task/restore_ebs_meta.go index cbb5d509f6133..2835e5e5a64f3 100644 --- a/br/pkg/task/restore_ebs_meta.go +++ b/br/pkg/task/restore_ebs_meta.go @@ -41,6 +41,7 @@ const ( flagVolumeType = "volume-type" flagVolumeIOPS = "volume-iops" flagVolumeThroughput = "volume-throughput" + flagVolumeEncrypted = "volume-encrypted" flagTargetAZ = "target-az" ) @@ -54,6 +55,7 @@ func DefineRestoreSnapshotFlags(command *cobra.Command) { command.Flags().String(flagVolumeType, string(config.GP3Volume), "volume type: gp3, io1, io2") command.Flags().Int64(flagVolumeIOPS, 0, "volume iops(0 means default for that volume type)") command.Flags().Int64(flagVolumeThroughput, 0, "volume throughout in MiB/s(0 means default for that volume type)") + command.Flags().Bool(flagVolumeEncrypted, false, "whether encryption is enabled for the volume") command.Flags().String(flagProgressFile, "progress.txt", "the file name of progress file") command.Flags().String(flagTargetAZ, "", "the target AZ for restored volumes") @@ -65,6 +67,7 @@ func DefineRestoreSnapshotFlags(command *cobra.Command) { _ = command.Flags().MarkHidden(flagVolumeType) _ = command.Flags().MarkHidden(flagVolumeIOPS) _ = command.Flags().MarkHidden(flagVolumeThroughput) + _ = command.Flags().MarkHidden(flagVolumeEncrypted) _ = command.Flags().MarkHidden(flagProgressFile) _ = command.Flags().MarkHidden(flagTargetAZ) } @@ -256,7 +259,7 @@ func (h *restoreEBSMetaHelper) restoreVolumes(progress glue.Progress) (map[strin } volumeIDMap, err = ec2Session.CreateVolumes(h.metaInfo, - string(h.cfg.VolumeType), h.cfg.VolumeIOPS, h.cfg.VolumeThroughput, h.cfg.TargetAZ) + string(h.cfg.VolumeType), h.cfg.VolumeIOPS, h.cfg.VolumeThroughput, h.cfg.VolumeEncrypted, h.cfg.TargetAZ) if err != nil { return nil, 0, errors.Trace(err) } diff --git a/br/pkg/task/restore_raw.go b/br/pkg/task/restore_raw.go index d90c1d9d27cbf..31763a9a9a638 100644 --- a/br/pkg/task/restore_raw.go +++ b/br/pkg/task/restore_raw.go @@ -87,7 +87,13 @@ func RunRestoreRaw(c context.Context, g glue.Glue, cmdName string, cfg *RestoreR // sometimes we have pooled the connections. // sending heartbeats in idle times is useful. keepaliveCfg.PermitWithoutStream = true - client := restore.NewRestoreClient(mgr.GetPDClient(), mgr.GetTLSConfig(), keepaliveCfg, true) + client := restore.NewRestoreClient( + mgr.GetPDClient(), + mgr.GetPDHTTPClient(), + mgr.GetTLSConfig(), + keepaliveCfg, + true, + ) client.SetRateLimit(cfg.RateLimit) client.SetCrypter(&cfg.CipherInfo) client.SetConcurrency(uint(cfg.Concurrency)) diff --git a/br/pkg/task/restore_test.go b/br/pkg/task/restore_test.go index 178135193f7e0..f279aaea65061 100644 --- a/br/pkg/task/restore_test.go +++ b/br/pkg/task/restore_test.go @@ -55,7 +55,7 @@ func TestConfigureRestoreClient(t *testing.T) { RestoreCommonConfig: restoreComCfg, DdlBatchSize: 128, } - client := restore.NewRestoreClient(mockPDClient{}, nil, keepalive.ClientParameters{}, false) + client := restore.NewRestoreClient(mockPDClient{}, nil, nil, keepalive.ClientParameters{}, false) ctx := context.Background() err := configureRestoreClient(ctx, client, restoreCfg) require.NoError(t, err) @@ -77,7 +77,7 @@ func TestCheckRestoreDBAndTable(t *testing.T) { cases := []struct { cfgSchemas map[string]struct{} cfgTables map[string]struct{} - backupDBs map[string]*utils.Database + backupDBs map[string]*metautil.Database }{ { cfgSchemas: map[string]struct{}{ @@ -167,7 +167,7 @@ func TestCheckRestoreDBAndTable(t *testing.T) { } } -func mockReadSchemasFromBackupMeta(t *testing.T, db2Tables map[string][]string) map[string]*utils.Database { +func mockReadSchemasFromBackupMeta(t *testing.T, db2Tables map[string][]string) map[string]*metautil.Database { testDir := t.TempDir() store, err := storage.NewLocalStorage(testDir) require.NoError(t, err) @@ -236,7 +236,7 @@ func mockReadSchemasFromBackupMeta(t *testing.T, db2Tables map[string][]string) err = store.WriteFile(ctx, metautil.MetaFile, data) require.NoError(t, err) - dbs, err := utils.LoadBackupTables( + dbs, err := metautil.LoadBackupTables( ctx, metautil.NewMetaReader( meta, diff --git a/br/pkg/task/restore_txn.go b/br/pkg/task/restore_txn.go index 7fe38c2bb7f32..15086e7ca72b5 100644 --- a/br/pkg/task/restore_txn.go +++ b/br/pkg/task/restore_txn.go @@ -38,7 +38,13 @@ func RunRestoreTxn(c context.Context, g glue.Glue, cmdName string, cfg *Config) // sometimes we have pooled the connections. // sending heartbeats in idle times is useful. keepaliveCfg.PermitWithoutStream = true - client := restore.NewRestoreClient(mgr.GetPDClient(), mgr.GetTLSConfig(), keepaliveCfg, true) + client := restore.NewRestoreClient( + mgr.GetPDClient(), + mgr.GetPDHTTPClient(), + mgr.GetTLSConfig(), + keepaliveCfg, + true, + ) client.SetRateLimit(cfg.RateLimit) client.SetCrypter(&cfg.CipherInfo) client.SetConcurrency(uint(cfg.Concurrency)) diff --git a/br/pkg/task/show/cmd_test.go b/br/pkg/task/show/cmd_test.go index 6e70dba899078..558978b612ab2 100644 --- a/br/pkg/task/show/cmd_test.go +++ b/br/pkg/task/show/cmd_test.go @@ -178,6 +178,7 @@ func TestShowViaSQL(t *testing.T) { err := os.WriteFile(metaPath, FullMeta, 0o444) req.NoError(err) + tk.MustExec("set @@time_zone='+08:00'") res := tk.MustQuery(fmt.Sprintf("SHOW BACKUP METADATA FROM 'local://%s'", tempBackup)) fmt.Printf("%#v", res.Sort().Rows()) res.Sort().Check([][]interface{}{ @@ -191,4 +192,20 @@ func TestShowViaSQL(t *testing.T) { {"tpcc", "stock", "0", "0", "", "2023-04-10 11:18:21"}, {"tpcc", "warehouse", "0", "0", "", "2023-04-10 11:18:21"}, }) + + // Test result in different time_zone + tk.MustExec("set @@time_zone='-08:00'") + res = tk.MustQuery(fmt.Sprintf("SHOW BACKUP METADATA FROM 'local://%s'", tempBackup)) + fmt.Printf("%#v", res.Sort().Rows()) + res.Sort().Check([][]interface{}{ + {"tpcc", "customer", "0", "0", "", "2023-04-09 19:18:21"}, + {"tpcc", "district", "0", "0", "", "2023-04-09 19:18:21"}, + {"tpcc", "history", "0", "0", "", "2023-04-09 19:18:21"}, + {"tpcc", "item", "0", "0", "", "2023-04-09 19:18:21"}, + {"tpcc", "new_order", "0", "0", "", "2023-04-09 19:18:21"}, + {"tpcc", "order_line", "0", "0", "", "2023-04-09 19:18:21"}, + {"tpcc", "orders", "0", "0", "", "2023-04-09 19:18:21"}, + {"tpcc", "stock", "0", "0", "", "2023-04-09 19:18:21"}, + {"tpcc", "warehouse", "0", "0", "", "2023-04-09 19:18:21"}, + }) } diff --git a/br/pkg/task/stream.go b/br/pkg/task/stream.go index 6fa3e243bc3ec..80dcf0470e8d8 100644 --- a/br/pkg/task/stream.go +++ b/br/pkg/task/stream.go @@ -68,6 +68,10 @@ const ( flagStreamStartTS = "start-ts" flagStreamEndTS = "end-ts" flagGCSafePointTTS = "gc-ttl" + + truncateLockPath = "truncating.lock" + hintOnTruncateLock = "There might be another truncate task running, or a truncate task that didn't exit properly. " + + "You may check the metadata and continue by wait other task finish or manually delete the lock file " + truncateLockPath + " at the external storage." ) var ( @@ -131,11 +135,7 @@ func (cfg *StreamConfig) makeStorage(ctx context.Context) (storage.ExternalStora if err != nil { return nil, errors.Trace(err) } - opts := storage.ExternalStorageOptions{ - NoCredentials: cfg.NoCreds, - SendCredentials: cfg.SendCreds, - HTTPClient: storage.GetDefaultHttpClient(cfg.MetadataDownloadBatchSize), - } + opts := getExternalStorageOptions(&cfg.Config, u) storage, err := storage.New(ctx, u, &opts) if err != nil { return nil, errors.Trace(err) @@ -950,7 +950,7 @@ func RunStreamStatus( } // RunStreamTruncate truncates the log that belong to (0, until-ts) -func RunStreamTruncate(c context.Context, g glue.Glue, cmdName string, cfg *StreamConfig) error { +func RunStreamTruncate(c context.Context, g glue.Glue, cmdName string, cfg *StreamConfig) (err error) { console := glue.GetConsole(g) em := color.New(color.Bold).SprintFunc() warn := color.New(color.Bold, color.FgHiRed).SprintFunc() @@ -964,12 +964,18 @@ func RunStreamTruncate(c context.Context, g glue.Glue, cmdName string, cfg *Stre ctx, cancelFn := context.WithCancel(c) defer cancelFn() - storage, err := cfg.makeStorage(ctx) + extStorage, err := cfg.makeStorage(ctx) if err != nil { return err } + if err := storage.TryLockRemote(ctx, extStorage, truncateLockPath, hintOnTruncateLock); err != nil { + return err + } + defer utils.WithCleanUp(&err, 10*time.Second, func(ctx context.Context) error { + return storage.UnlockRemote(ctx, extStorage, truncateLockPath) + }) - sp, err := restore.GetTSFromFile(ctx, storage, restore.TruncateSafePointFileName) + sp, err := restore.GetTSFromFile(ctx, extStorage, restore.TruncateSafePointFileName) if err != nil { return err } @@ -987,7 +993,7 @@ func RunStreamTruncate(c context.Context, g glue.Glue, cmdName string, cfg *Stre Helper: stream.NewMetadataHelper(), DryRun: cfg.DryRun, } - shiftUntilTS, err := metas.LoadUntilAndCalculateShiftTS(ctx, storage, cfg.Until) + shiftUntilTS, err := metas.LoadUntilAndCalculateShiftTS(ctx, extStorage, cfg.Until) if err != nil { return err } @@ -1015,7 +1021,7 @@ func RunStreamTruncate(c context.Context, g glue.Glue, cmdName string, cfg *Stre if cfg.Until > sp && !cfg.DryRun { if err := restore.SetTSToFile( - ctx, storage, cfg.Until, restore.TruncateSafePointFileName); err != nil { + ctx, extStorage, cfg.Until, restore.TruncateSafePointFileName); err != nil { return err } } @@ -1029,7 +1035,7 @@ func RunStreamTruncate(c context.Context, g glue.Glue, cmdName string, cfg *Stre ) defer p.Close() - notDeleted, err := metas.RemoveDataFilesAndUpdateMetadataInBatch(ctx, shiftUntilTS, storage, p.IncBy) + notDeleted, err := metas.RemoveDataFilesAndUpdateMetadataInBatch(ctx, shiftUntilTS, extStorage, p.IncBy) if err != nil { return err } @@ -1454,7 +1460,13 @@ func createRestoreClient(ctx context.Context, g glue.Glue, cfg *RestoreConfig, m var err error keepaliveCfg := GetKeepalive(&cfg.Config) keepaliveCfg.PermitWithoutStream = true - client := restore.NewRestoreClient(mgr.GetPDClient(), mgr.GetTLSConfig(), keepaliveCfg, false) + client := restore.NewRestoreClient( + mgr.GetPDClient(), + mgr.GetPDHTTPClient(), + mgr.GetTLSConfig(), + keepaliveCfg, + false, + ) err = client.Init(g, mgr.GetStorage()) if err != nil { return nil, errors.Trace(err) @@ -1470,11 +1482,7 @@ func createRestoreClient(ctx context.Context, g glue.Glue, cfg *RestoreConfig, m return nil, errors.Trace(err) } - opts := storage.ExternalStorageOptions{ - NoCredentials: cfg.NoCreds, - SendCredentials: cfg.SendCreds, - HTTPClient: storage.GetDefaultHttpClient(cfg.MetadataDownloadBatchSize), - } + opts := getExternalStorageOptions(&cfg.Config, u) if err = client.SetStorage(ctx, u, &opts); err != nil { return nil, errors.Trace(err) } @@ -1482,7 +1490,7 @@ func createRestoreClient(ctx context.Context, g glue.Glue, cfg *RestoreConfig, m client.SetCrypter(&cfg.CipherInfo) client.SetConcurrency(uint(cfg.Concurrency)) client.SetSwitchModeInterval(cfg.SwitchModeInterval) - client.InitClients(u, false, false) + client.InitClients(ctx, u, false, false) rawKVClient, err := newRawBatchClient(ctx, cfg.PD, cfg.TLS) if err != nil { @@ -1498,6 +1506,18 @@ func createRestoreClient(ctx context.Context, g glue.Glue, cfg *RestoreConfig, m return client, nil } +func getExternalStorageOptions(cfg *Config, u *backuppb.StorageBackend) storage.ExternalStorageOptions { + var httpClient *http.Client + if u.GetGcs() == nil { + httpClient = storage.GetDefaultHttpClient(cfg.MetadataDownloadBatchSize) + } + return storage.ExternalStorageOptions{ + NoCredentials: cfg.NoCreds, + SendCredentials: cfg.SendCreds, + HTTPClient: httpClient, + } +} + func checkLogRange(restoreFrom, restoreTo, logMinTS, logMaxTS uint64) error { // serveral ts constraint: // logMinTS <= restoreFrom <= restoreTo <= logMaxTS diff --git a/br/pkg/task/stream_test.go b/br/pkg/task/stream_test.go index 8d2ecb35c9247..627924e8239cc 100644 --- a/br/pkg/task/stream_test.go +++ b/br/pkg/task/stream_test.go @@ -248,3 +248,16 @@ func TestGetLogRangeWithLogBackupDir(t *testing.T) { require.Nil(t, err) require.Equal(t, logInfo.logMinTS, startLogBackupTS) } + +func TestGetExternalStorageOptions(t *testing.T) { + cfg := Config{} + u, err := storage.ParseBackend("s3://bucket/path", nil) + require.NoError(t, err) + options := getExternalStorageOptions(&cfg, u) + require.NotNil(t, options.HTTPClient) + + u, err = storage.ParseBackend("gs://bucket/path", nil) + require.NoError(t, err) + options = getExternalStorageOptions(&cfg, u) + require.Nil(t, options.HTTPClient) +} diff --git a/br/pkg/trace/main_test.go b/br/pkg/trace/main_test.go index 07c5102202deb..df22d1ba5eeb7 100644 --- a/br/pkg/trace/main_test.go +++ b/br/pkg/trace/main_test.go @@ -25,6 +25,7 @@ func TestMain(m *testing.M) { testsetup.SetupForCommonTest() opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), diff --git a/br/pkg/utils/BUILD.bazel b/br/pkg/utils/BUILD.bazel index 092bd33e33366..6dc2f2a7420f8 100644 --- a/br/pkg/utils/BUILD.bazel +++ b/br/pkg/utils/BUILD.bazel @@ -22,7 +22,6 @@ go_library( "schema.go", "sensitive.go", "store_manager.go", - "suspend_importing.go", "worker.go", ], importpath = "github.com/pingcap/tidb/br/pkg/utils", @@ -30,7 +29,6 @@ go_library( deps = [ "//br/pkg/errors", "//br/pkg/logutil", - "//br/pkg/metautil", "//pkg/errno", "//pkg/kv", "//pkg/parser/model", @@ -39,7 +37,6 @@ go_library( "//pkg/parser/types", "//pkg/sessionctx", "//pkg/util", - "//pkg/util/engine", "//pkg/util/sqlexec", "@com_github_cheggaaa_pb_v3//:pb", "@com_github_docker_go_units//:go-units", @@ -47,7 +44,6 @@ go_library( "@com_github_pingcap_errors//:errors", "@com_github_pingcap_failpoint//:failpoint", "@com_github_pingcap_kvproto//pkg/brpb", - "@com_github_pingcap_kvproto//pkg/import_sstpb", "@com_github_pingcap_kvproto//pkg/metapb", "@com_github_pingcap_log//:log", "@com_github_tikv_client_go_v2//oracle", @@ -87,44 +83,33 @@ go_test( "register_test.go", "retry_test.go", "safe_point_test.go", - "schema_test.go", "sensitive_test.go", - "suspend_importing_test.go", ], embed = [":utils"], flaky = True, - shard_count = 34, + shard_count = 33, deps = [ "//br/pkg/errors", - "//br/pkg/metautil", - "//br/pkg/storage", "//pkg/kv", "//pkg/parser/ast", "//pkg/parser/model", "//pkg/parser/mysql", "//pkg/parser/types", - "//pkg/statistics/handle/util", - "//pkg/tablecodec", "//pkg/testkit/testsetup", "//pkg/types", "//pkg/util/chunk", "//pkg/util/sqlexec", - "@com_github_golang_protobuf//proto", "@com_github_pingcap_errors//:errors", "@com_github_pingcap_failpoint//:failpoint", "@com_github_pingcap_kvproto//pkg/brpb", - "@com_github_pingcap_kvproto//pkg/encryptionpb", - "@com_github_pingcap_kvproto//pkg/import_sstpb", - "@com_github_pingcap_kvproto//pkg/metapb", + "@com_github_pingcap_kvproto//pkg/errorpb", "@com_github_stretchr_testify//require", "@com_github_tikv_client_go_v2//tikv", "@com_github_tikv_pd_client//:client", "@io_etcd_go_etcd_client_v3//:client", "@io_etcd_go_etcd_tests_v3//integration", - "@org_golang_google_grpc//:grpc", "@org_golang_google_grpc//codes", "@org_golang_google_grpc//status", - "@org_golang_x_sync//errgroup", "@org_uber_go_goleak//:goleak", "@org_uber_go_multierr//:multierr", ], diff --git a/br/pkg/utils/backoff.go b/br/pkg/utils/backoff.go index 8c7712ecb1b1d..7f2f04cca9db5 100644 --- a/br/pkg/utils/backoff.go +++ b/br/pkg/utils/backoff.go @@ -120,28 +120,34 @@ type importerBackoffer struct { attempt int delayTime time.Duration maxDelayTime time.Duration + errContext *ErrorContext } // NewBackoffer creates a new controller regulating a truncated exponential backoff. -func NewBackoffer(attempt int, delayTime, maxDelayTime time.Duration) Backoffer { +func NewBackoffer(attempt int, delayTime, maxDelayTime time.Duration, errContext *ErrorContext) Backoffer { return &importerBackoffer{ attempt: attempt, delayTime: delayTime, maxDelayTime: maxDelayTime, + errContext: errContext, } } func NewImportSSTBackoffer() Backoffer { - return NewBackoffer(importSSTRetryTimes, importSSTWaitInterval, importSSTMaxWaitInterval) + errContext := NewErrorContext("import sst", 3) + return NewBackoffer(importSSTRetryTimes, importSSTWaitInterval, importSSTMaxWaitInterval, errContext) } func NewDownloadSSTBackoffer() Backoffer { - return NewBackoffer(downloadSSTRetryTimes, downloadSSTWaitInterval, downloadSSTMaxWaitInterval) + errContext := NewErrorContext("download sst", 3) + return NewBackoffer(downloadSSTRetryTimes, downloadSSTWaitInterval, downloadSSTMaxWaitInterval, errContext) } func (bo *importerBackoffer) NextBackoff(err error) time.Duration { log.Warn("retry to import ssts", zap.Int("attempt", bo.attempt), zap.Error(err)) - if MessageIsRetryableStorageError(err.Error()) { + // we don't care storeID here. + res := bo.errContext.HandleErrorMsg(err.Error(), 0) + if res.Strategy == RetryStrategy { bo.delayTime = 2 * bo.delayTime bo.attempt-- } else { @@ -151,19 +157,19 @@ func (bo *importerBackoffer) NextBackoff(err error) time.Duration { bo.delayTime = 2 * bo.delayTime bo.attempt-- case berrors.ErrKVRangeIsEmpty, berrors.ErrKVRewriteRuleNotFound: - // Excepted error, finish the operation + // Expected error, finish the operation bo.delayTime = 0 bo.attempt = 0 default: switch status.Code(e) { - case codes.Unavailable, codes.Aborted: + case codes.Unavailable, codes.Aborted, codes.DeadlineExceeded: bo.delayTime = 2 * bo.delayTime bo.attempt-- default: - // Unexcepted error + // Unexpected error bo.delayTime = 0 bo.attempt = 0 - log.Warn("unexcepted error, stop to retry", zap.Error(err)) + log.Warn("unexpected error, stop retrying", zap.Error(err)) } } } diff --git a/br/pkg/utils/backoff_test.go b/br/pkg/utils/backoff_test.go index bd0675007f6e4..857010bfc871a 100644 --- a/br/pkg/utils/backoff_test.go +++ b/br/pkg/utils/backoff_test.go @@ -8,6 +8,7 @@ import ( "testing" "time" + "github.com/pingcap/errors" berrors "github.com/pingcap/tidb/br/pkg/errors" "github.com/pingcap/tidb/br/pkg/utils" "github.com/stretchr/testify/require" @@ -18,7 +19,7 @@ import ( func TestBackoffWithSuccess(t *testing.T) { var counter int - backoffer := utils.NewBackoffer(10, time.Nanosecond, time.Nanosecond) + backoffer := utils.NewBackoffer(10, time.Nanosecond, time.Nanosecond, utils.NewDefaultContext()) err := utils.WithRetry(context.Background(), func() error { defer func() { counter++ }() switch counter { @@ -35,9 +36,26 @@ func TestBackoffWithSuccess(t *testing.T) { require.NoError(t, err) } +func TestBackoffWithUnknowneErrorSuccess(t *testing.T) { + var counter int + backoffer := utils.NewBackoffer(10, time.Nanosecond, time.Nanosecond, utils.NewDefaultContext()) + err := utils.WithRetry(context.Background(), func() error { + defer func() { counter++ }() + switch counter { + case 0: + return errors.New("unknown error: not in the allow list") + case 1: + return berrors.ErrKVEpochNotMatch + } + return nil + }, backoffer) + require.Equal(t, 3, counter) + require.NoError(t, err) +} + func TestBackoffWithFatalError(t *testing.T) { var counter int - backoffer := utils.NewBackoffer(10, time.Nanosecond, time.Nanosecond) + backoffer := utils.NewBackoffer(10, time.Nanosecond, time.Nanosecond, utils.NewDefaultContext()) gRPCError := status.Error(codes.Unavailable, "transport is closing") err := utils.WithRetry(context.Background(), func() error { defer func() { counter++ }() @@ -65,7 +83,7 @@ func TestBackoffWithFatalError(t *testing.T) { func TestBackoffWithFatalRawGRPCError(t *testing.T) { var counter int canceledError := status.Error(codes.Canceled, "context canceled") - backoffer := utils.NewBackoffer(10, time.Nanosecond, time.Nanosecond) + backoffer := utils.NewBackoffer(10, time.Nanosecond, time.Nanosecond, utils.NewDefaultContext()) err := utils.WithRetry(context.Background(), func() error { defer func() { counter++ }() return canceledError // nolint:wrapcheck @@ -76,7 +94,7 @@ func TestBackoffWithFatalRawGRPCError(t *testing.T) { func TestBackoffWithRetryableError(t *testing.T) { var counter int - backoffer := utils.NewBackoffer(10, time.Nanosecond, time.Nanosecond) + backoffer := utils.NewBackoffer(10, time.Nanosecond, time.Nanosecond, utils.NewDefaultContext()) err := utils.WithRetry(context.Background(), func() error { defer func() { counter++ }() return berrors.ErrKVEpochNotMatch diff --git a/br/pkg/utils/main_test.go b/br/pkg/utils/main_test.go index f0f7ff871ae91..0c534a7a899b2 100644 --- a/br/pkg/utils/main_test.go +++ b/br/pkg/utils/main_test.go @@ -24,6 +24,7 @@ import ( func TestMain(m *testing.M) { opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), } diff --git a/br/pkg/utils/misc.go b/br/pkg/utils/misc.go index ec2d05156f1f4..84774af0906a1 100644 --- a/br/pkg/utils/misc.go +++ b/br/pkg/utils/misc.go @@ -20,9 +20,12 @@ import ( "github.com/pingcap/errors" "github.com/pingcap/kvproto/pkg/metapb" + "github.com/pingcap/log" berrors "github.com/pingcap/tidb/br/pkg/errors" "github.com/pingcap/tidb/pkg/parser/mysql" "github.com/pingcap/tidb/pkg/parser/types" + "go.uber.org/multierr" + "go.uber.org/zap" "google.golang.org/grpc" "google.golang.org/grpc/credentials" "google.golang.org/grpc/credentials/insecure" @@ -34,7 +37,9 @@ const ( // (How about network partition between TiKV and PD? Even that is rare.) // Also note that the offline threshold in PD is 20s, see // https://github.com/tikv/pd/blob/c40e319f50822678cda71ae62ee2fd70a9cac010/pkg/core/store.go#L523 - storeDisconnectionDuration = 100 * time.Second + + // After talk to PD members 100s is not a safe number. set it to 600s + storeDisconnectionDuration = 600 * time.Second ) // IsTypeCompatible checks whether type target is compatible with type src @@ -131,3 +136,24 @@ func CheckStoreLiveness(s *metapb.Store) error { } return nil } + +// WithCleanUp runs a function with a timeout, and register its error to its argument if there is one. +// This is useful while you want to run some must run but error-prone code in a defer context. +// Simple usage: +// +// func foo() (err error) { +// defer WithCleanUp(&err, time.Second, func(ctx context.Context) error { +// // do something +// return nil +// }) +// } +func WithCleanUp(errOut *error, timeout time.Duration, fn func(context.Context) error) { + ctx, cancel := context.WithTimeout(context.Background(), timeout) + defer cancel() + err := fn(ctx) + if errOut != nil { + *errOut = multierr.Combine(err, *errOut) + } else if err != nil { + log.Warn("Encountered but ignored error while cleaning up.", zap.Error(err)) + } +} diff --git a/br/pkg/utils/misc_test.go b/br/pkg/utils/misc_test.go index 6d243625b3e5b..a7678d7785d57 100644 --- a/br/pkg/utils/misc_test.go +++ b/br/pkg/utils/misc_test.go @@ -14,11 +14,15 @@ package utils import ( + "context" "testing" + "time" + "github.com/pingcap/errors" "github.com/pingcap/tidb/pkg/parser/mysql" "github.com/pingcap/tidb/pkg/parser/types" "github.com/stretchr/testify/require" + "go.uber.org/multierr" ) func TestIsTypeCompatible(t *testing.T) { @@ -136,3 +140,32 @@ func TestIsTypeCompatible(t *testing.T) { require.True(t, IsTypeCompatible(*src, *target)) } } + +func TestWithCleanUp(t *testing.T) { + err1 := errors.New("meow?") + err2 := errors.New("nya?") + + case1 := func() (err error) { + defer WithCleanUp(&err, time.Second, func(ctx context.Context) error { + return err1 + }) + return nil + } + require.ErrorIs(t, case1(), err1) + + case2 := func() (err error) { + defer WithCleanUp(&err, time.Second, func(ctx context.Context) error { + return err1 + }) + return err2 + } + require.ElementsMatch(t, []error{err1, err2}, multierr.Errors(case2())) + + case3 := func() (err error) { + defer WithCleanUp(&err, time.Second, func(ctx context.Context) error { + return nil + }) + return nil + } + require.NoError(t, case3()) +} diff --git a/br/pkg/utils/permission.go b/br/pkg/utils/permission.go index e18c28dbbbe1c..3c0795db11c47 100644 --- a/br/pkg/utils/permission.go +++ b/br/pkg/utils/permission.go @@ -7,14 +7,14 @@ var ( permissionDeniedMsg = "permissiondenied" ) -// MessageIsNotFoundStorageError checks whether the message returning from TiKV is "NotFound" storage I/O error -func MessageIsNotFoundStorageError(msg string) bool { +// messageIsNotFoundStorageError checks whether the message returning from TiKV is "NotFound" storage I/O error +func messageIsNotFoundStorageError(msg string) bool { msgLower := strings.ToLower(msg) return strings.Contains(msgLower, "io") && strings.Contains(msgLower, ioNotFoundMsg) } // MessageIsPermissionDeniedStorageError checks whether the message returning from TiKV is "PermissionDenied" storage I/O error -func MessageIsPermissionDeniedStorageError(msg string) bool { +func messageIsPermissionDeniedStorageError(msg string) bool { msgLower := strings.ToLower(msg) return strings.Contains(msgLower, permissionDeniedMsg) } diff --git a/br/pkg/utils/retry.go b/br/pkg/utils/retry.go index 670521fc94c02..559a11d978274 100644 --- a/br/pkg/utils/retry.go +++ b/br/pkg/utils/retry.go @@ -4,15 +4,21 @@ package utils import ( "context" + stderrs "errors" + "fmt" "strings" "sync" "time" + "github.com/google/uuid" "github.com/pingcap/errors" + backuppb "github.com/pingcap/kvproto/pkg/brpb" + "github.com/pingcap/log" tmysql "github.com/pingcap/tidb/pkg/errno" "github.com/pingcap/tidb/pkg/parser/terror" "github.com/tikv/client-go/v2/tikv" "go.uber.org/multierr" + "go.uber.org/zap" ) var retryableServerError = []string{ @@ -32,6 +38,157 @@ var retryableServerError = []string{ "end of file before message length reached", } +type ErrorResult struct { + Strategy ErrorStrategy + Reason string +} + +type ErrorStrategy int + +const ( + // This type can be retry but consume the backoffer attempts. + RetryStrategy ErrorStrategy = iota + // This type means unrecoverable error and the whole progress should exits + // for example: + // 1. permission not valid. + // 2. data has not found. + // 3. retry too many times + GiveUpStrategy + // This type represents Unknown error + UnknownStrategy +) + +type ErrorContext struct { + mu sync.Mutex + // encounter times for one context on a store + // we may use this value to determine the retry policy + encounterTimes map[uint64]int + // unknown error retry limitation. + // encouter many times error makes Retry to GiveUp. + encounterTimesLimitation int + // whether in backup or restore + scenario string +} + +func NewErrorContext(scenario string, limitation int) *ErrorContext { + return &ErrorContext{ + scenario: scenario, + encounterTimes: make(map[uint64]int), + encounterTimesLimitation: limitation, + } +} + +func NewDefaultContext() *ErrorContext { + return &ErrorContext{ + scenario: "default", + encounterTimes: make(map[uint64]int), + encounterTimesLimitation: 1, + } +} + +func (ec *ErrorContext) HandleError(err *backuppb.Error, uuid uint64) ErrorResult { + if err == nil { + return ErrorResult{RetryStrategy, "unreachable retry"} + } + res := ec.handleErrorPb(err, uuid) + // try the best effort to save progress from error here + if res.Strategy == UnknownStrategy && len(err.Msg) != 0 { + return ec.HandleErrorMsg(err.Msg, uuid) + } + return res +} + +func (ec *ErrorContext) HandleIgnorableError(err *backuppb.Error, uuid uint64) ErrorResult { + if err == nil { + return ErrorResult{RetryStrategy, "unreachable retry"} + } + res := ec.handleIgnorableErrorPb(err, uuid) + // try the best effort to save progress from error here + if res.Strategy == UnknownStrategy && len(err.Msg) != 0 { + return ec.HandleErrorMsg(err.Msg, uuid) + } + return res +} + +func (ec *ErrorContext) HandleErrorMsg(msg string, uuid uint64) ErrorResult { + // UNSAFE! TODO: use meaningful error code instead of unstructured message to find failed to write error. + logger := log.L().With(zap.String("scenario", ec.scenario)) + if messageIsNotFoundStorageError(msg) { + reason := fmt.Sprintf("File or directory not found on TiKV Node (store id: %v). "+ + "work around:please ensure br and tikv nodes share a same storage and the user of br and tikv has same uid.", + uuid) + return ErrorResult{GiveUpStrategy, reason} + } + if messageIsPermissionDeniedStorageError(msg) { + reason := fmt.Sprintf("I/O permission denied error occurs on TiKV Node(store id: %v). "+ + "work around:please ensure tikv has permission to read from & write to the storage.", + uuid) + return ErrorResult{GiveUpStrategy, reason} + } + msgLower := strings.ToLower(msg) + if strings.Contains(msgLower, "context canceled") { + return ErrorResult{GiveUpStrategy, "context canceled, give up"} + } + + if MessageIsRetryableStorageError(msg) { + logger.Warn("occur storage error", zap.String("error", msg)) + return ErrorResult{RetryStrategy, "retrable error"} + } + // retry enough on same store + ec.mu.Lock() + defer ec.mu.Unlock() + ec.encounterTimes[uuid]++ + if ec.encounterTimes[uuid] <= ec.encounterTimesLimitation { + return ErrorResult{RetryStrategy, "unknown error, retry it for few times"} + } + return ErrorResult{GiveUpStrategy, "unknown error and retry too many times, give up"} +} + +func (ec *ErrorContext) handleIgnorableErrorPb(e *backuppb.Error, uuid uint64) ErrorResult { + switch e.Detail.(type) { + case *backuppb.Error_KvError: + return ErrorResult{RetryStrategy, "retry outside because the error can be ignored"} + case *backuppb.Error_RegionError: + return ErrorResult{RetryStrategy, "retry outside because the error can be ignored"} + case *backuppb.Error_ClusterIdError: + return ErrorResult{GiveUpStrategy, "cluster ID mismatch"} + } + return ErrorResult{UnknownStrategy, "unreachable code"} +} + +func (ec *ErrorContext) handleErrorPb(e *backuppb.Error, uuid uint64) ErrorResult { + logger := log.L().With(zap.String("scenario", ec.scenario)) + switch v := e.Detail.(type) { + case *backuppb.Error_KvError: + // should not meet error other than KeyLocked. + return ErrorResult{GiveUpStrategy, "unknown kv error"} + + case *backuppb.Error_RegionError: + regionErr := v.RegionError + // Ignore following errors. + if !(regionErr.EpochNotMatch != nil || + regionErr.NotLeader != nil || + regionErr.RegionNotFound != nil || + regionErr.ServerIsBusy != nil || + regionErr.StaleCommand != nil || + regionErr.StoreNotMatch != nil || + regionErr.ReadIndexNotReady != nil || + regionErr.ProposalInMergingMode != nil) { + logger.Error("unexpect region error", zap.Reflect("RegionError", regionErr)) + return ErrorResult{GiveUpStrategy, "unknown kv error"} + } + logger.Warn("occur region error", + zap.Reflect("RegionError", regionErr), + zap.Uint64("uuid", uuid)) + return ErrorResult{RetryStrategy, "retrable error"} + + case *backuppb.Error_ClusterIdError: + logger.Error("occur cluster ID error", zap.Reflect("error", v), zap.Uint64("uuid", uuid)) + return ErrorResult{GiveUpStrategy, "cluster ID mismatch"} + } + return ErrorResult{UnknownStrategy, "unreachable code"} +} + // RetryableFunc presents a retryable operation. type RetryableFunc func() error @@ -179,3 +336,77 @@ func (r *RetryWithBackoffer) RequestBackOff(ms int) { func (r *RetryWithBackoffer) Inner() *tikv.Backoffer { return r.bo } + +type verboseBackoffer struct { + inner Backoffer + logger *zap.Logger + groupID uuid.UUID +} + +func (v *verboseBackoffer) NextBackoff(err error) time.Duration { + nextBackoff := v.inner.NextBackoff(err) + v.logger.Warn("Encountered err, retrying.", + zap.Stringer("nextBackoff", nextBackoff), + zap.String("err", err.Error()), + zap.Stringer("gid", v.groupID)) + return nextBackoff +} + +// Attempt returns the remain attempt times +func (v *verboseBackoffer) Attempt() int { + attempt := v.inner.Attempt() + if attempt > 0 { + v.logger.Debug("Retry attempt hint.", zap.Int("attempt", attempt), zap.Stringer("gid", v.groupID)) + } else { + v.logger.Warn("Retry limit exceeded.", zap.Stringer("gid", v.groupID)) + } + return attempt +} + +func VerboseRetry(bo Backoffer, logger *zap.Logger) Backoffer { + if logger == nil { + logger = log.L() + } + vlog := &verboseBackoffer{ + inner: bo, + logger: logger, + groupID: uuid.New(), + } + return vlog +} + +type failedOnErr struct { + inner Backoffer + failed bool + failedOn []error +} + +// NextBackoff returns a duration to wait before retrying again +func (f *failedOnErr) NextBackoff(err error) time.Duration { + for _, fatalErr := range f.failedOn { + if stderrs.Is(errors.Cause(err), fatalErr) { + f.failed = true + return 0 + } + } + if !f.failed { + return f.inner.NextBackoff(err) + } + return 0 +} + +// Attempt returns the remain attempt times +func (f *failedOnErr) Attempt() int { + if f.failed { + return 0 + } + return f.inner.Attempt() +} + +func GiveUpRetryOn(bo Backoffer, errs ...error) Backoffer { + return &failedOnErr{ + inner: bo, + failed: false, + failedOn: errs, + } +} diff --git a/br/pkg/utils/retry_test.go b/br/pkg/utils/retry_test.go index eeef8c61c0480..605b59fadd8b8 100644 --- a/br/pkg/utils/retry_test.go +++ b/br/pkg/utils/retry_test.go @@ -9,6 +9,9 @@ import ( "time" "github.com/pingcap/errors" + backuppb "github.com/pingcap/kvproto/pkg/brpb" + "github.com/pingcap/kvproto/pkg/errorpb" + berrors "github.com/pingcap/tidb/br/pkg/errors" "github.com/pingcap/tidb/br/pkg/utils" "github.com/stretchr/testify/require" "github.com/tikv/client-go/v2/tikv" @@ -47,3 +50,97 @@ func TestRetryAdapter(t *testing.T) { req.Greater(time.Since(begin), 200*time.Millisecond) } + +func TestFailNowIf(t *testing.T) { + mockBO := utils.InitialRetryState(100, time.Second, time.Second) + err1 := errors.New("error1") + err2 := errors.New("error2") + assert := require.New(t) + + bo := utils.GiveUpRetryOn(&mockBO, err1) + + // Test NextBackoff with an error that is not in failedOn + assert.Equal(time.Second, bo.NextBackoff(err2)) + assert.NotEqualValues(0, bo.Attempt()) + + annotatedErr := errors.Annotate(errors.Annotate(err1, "meow?"), "nya?") + assert.Equal(time.Duration(0), bo.NextBackoff(annotatedErr)) + assert.Equal(0, bo.Attempt()) + + mockBO = utils.InitialRetryState(100, time.Second, time.Second) + bo = utils.GiveUpRetryOn(&mockBO, berrors.ErrBackupNoLeader) + annotatedErr = berrors.ErrBackupNoLeader.FastGen("leader is taking an adventure") + assert.Equal(time.Duration(0), bo.NextBackoff(annotatedErr)) + assert.Equal(0, bo.Attempt()) +} + +func TestHandleError(t *testing.T) { + ec := utils.NewErrorContext("test", 3) + // Test case 1: Error is nil + result := ec.HandleError(nil, 123) + require.Equal(t, utils.ErrorResult{utils.RetryStrategy, "unreachable retry"}, result) + + // Test case 2: Error is KvError and can be ignored + kvError := &backuppb.Error_KvError{} + result = ec.HandleIgnorableError(&backuppb.Error{Detail: kvError}, 123) + require.Equal(t, utils.ErrorResult{utils.RetryStrategy, "retry outside because the error can be ignored"}, result) + + // Test case 3: Error is KvError and cannot be ignored + result = ec.HandleError(&backuppb.Error{Detail: kvError}, 123) + require.Equal(t, utils.ErrorResult{utils.GiveUpStrategy, "unknown kv error"}, result) + + // Test case 4: Error is RegionError and can be ignored + regionError := &backuppb.Error_RegionError{ + RegionError: &errorpb.Error{NotLeader: &errorpb.NotLeader{RegionId: 1}}} + result = ec.HandleIgnorableError(&backuppb.Error{Detail: regionError}, 123) + require.Equal(t, utils.ErrorResult{utils.RetryStrategy, "retry outside because the error can be ignored"}, result) + + // Test case 5: Error is RegionError and cannot be ignored + regionError = &backuppb.Error_RegionError{ + RegionError: &errorpb.Error{DiskFull: &errorpb.DiskFull{}}} + result = ec.HandleError(&backuppb.Error{Detail: regionError}, 123) + require.Equal(t, utils.ErrorResult{utils.GiveUpStrategy, "unknown kv error"}, result) + + // Test case 6: Error is ClusterIdError + clusterIdError := &backuppb.Error_ClusterIdError{} + result = ec.HandleError(&backuppb.Error{Detail: clusterIdError}, 123) + require.Equal(t, utils.ErrorResult{utils.GiveUpStrategy, "cluster ID mismatch"}, result) +} + +func TestHandleErrorMsg(t *testing.T) { + ec := utils.NewErrorContext("test", 3) + + // Test messageIsNotFoundStorageError + msg := "IO: files Notfound error" + uuid := uint64(456) + expectedReason := "File or directory not found on TiKV Node (store id: 456). work around:please ensure br and tikv nodes share a same storage and the user of br and tikv has same uid." + expectedResult := utils.ErrorResult{utils.GiveUpStrategy, expectedReason} + actualResult := ec.HandleErrorMsg(msg, uuid) + require.Equal(t, expectedResult, actualResult) + + // Test messageIsPermissionDeniedStorageError + msg = "I/O permissiondenied error occurs on TiKV Node(store id: 456)." + expectedReason = "I/O permission denied error occurs on TiKV Node(store id: 456). work around:please ensure tikv has permission to read from & write to the storage." + expectedResult = utils.ErrorResult{utils.GiveUpStrategy, expectedReason} + actualResult = ec.HandleErrorMsg(msg, uuid) + require.Equal(t, expectedResult, actualResult) + + // Test MessageIsRetryableStorageError + msg = "server closed" + expectedResult = utils.ErrorResult{utils.RetryStrategy, "retrable error"} + actualResult = ec.HandleErrorMsg(msg, uuid) + require.Equal(t, expectedResult, actualResult) + + // Test unknown error + msg = "unknown error" + expectedResult = utils.ErrorResult{utils.RetryStrategy, "unknown error, retry it for few times"} + actualResult = ec.HandleErrorMsg(msg, uuid) + require.Equal(t, expectedResult, actualResult) + + // Test retry too many times + _ = ec.HandleErrorMsg(msg, uuid) + _ = ec.HandleErrorMsg(msg, uuid) + expectedResult = utils.ErrorResult{utils.GiveUpStrategy, "unknown error and retry too many times, give up"} + actualResult = ec.HandleErrorMsg(msg, uuid) + require.Equal(t, expectedResult, actualResult) +} diff --git a/br/pkg/utils/schema.go b/br/pkg/utils/schema.go index 94a1dd01887fe..c1041a07aa696 100644 --- a/br/pkg/utils/schema.go +++ b/br/pkg/utils/schema.go @@ -3,13 +3,9 @@ package utils import ( - "context" "fmt" "strings" - "github.com/pingcap/errors" - backuppb "github.com/pingcap/kvproto/pkg/brpb" - "github.com/pingcap/tidb/br/pkg/metautil" "github.com/pingcap/tidb/pkg/parser/model" "github.com/pingcap/tidb/pkg/parser/mysql" ) @@ -25,68 +21,6 @@ func NeedAutoID(tblInfo *model.TableInfo) bool { return hasRowID || hasAutoIncID } -// Database wraps the schema and tables of a database. -type Database struct { - Info *model.DBInfo - Tables []*metautil.Table -} - -// GetTable returns a table of the database by name. -func (db *Database) GetTable(name string) *metautil.Table { - for _, table := range db.Tables { - if table.Info.Name.String() == name { - return table - } - } - return nil -} - -// LoadBackupTables loads schemas from BackupMeta. -func LoadBackupTables(ctx context.Context, reader *metautil.MetaReader) (map[string]*Database, error) { - ch := make(chan *metautil.Table) - errCh := make(chan error) - go func() { - if err := reader.ReadSchemasFiles(ctx, ch); err != nil { - errCh <- errors.Trace(err) - } - close(ch) - }() - - databases := make(map[string]*Database) - for { - select { - case <-ctx.Done(): - return nil, ctx.Err() - case err := <-errCh: - return nil, errors.Trace(err) - case table, ok := <-ch: - if !ok { - close(errCh) - return databases, nil - } - dbName := table.DB.Name.String() - db, ok := databases[dbName] - if !ok { - db = &Database{ - Info: table.DB, - Tables: make([]*metautil.Table, 0), - } - databases[dbName] = db - } - db.Tables = append(db.Tables, table) - } - } -} - -// ArchiveSize returns the total size of the backup archive. -func ArchiveSize(meta *backuppb.BackupMeta) uint64 { - total := uint64(meta.Size()) - for _, file := range meta.Files { - total += file.Size_ - } - return total -} - // EncloseName formats name in sql. func EncloseName(name string) string { return "`" + strings.ReplaceAll(name, "`", "``") + "`" diff --git a/br/pkg/utils/store_manager.go b/br/pkg/utils/store_manager.go index 430d1394b0037..084cb5801102c 100644 --- a/br/pkg/utils/store_manager.go +++ b/br/pkg/utils/store_manager.go @@ -164,7 +164,7 @@ func (mgr *StoreManager) getGrpcConnLocked(ctx context.Context, storeID uint64) return conn, nil } -func (mgr *StoreManager) WithConn(ctx context.Context, storeID uint64, f func(*grpc.ClientConn)) error { +func (mgr *StoreManager) TryWithConn(ctx context.Context, storeID uint64, f func(*grpc.ClientConn) error) error { if ctx.Err() != nil { return errors.Trace(ctx.Err()) } @@ -174,8 +174,7 @@ func (mgr *StoreManager) WithConn(ctx context.Context, storeID uint64, f func(*g if conn, ok := mgr.grpcClis.clis[storeID]; ok { // Find a cached backup client. - f(conn) - return nil + return f(conn) } conn, err := mgr.getGrpcConnLocked(ctx, storeID) @@ -184,8 +183,11 @@ func (mgr *StoreManager) WithConn(ctx context.Context, storeID uint64, f func(*g } // Cache the conn. mgr.grpcClis.clis[storeID] = conn - f(conn) - return nil + return f(conn) +} + +func (mgr *StoreManager) WithConn(ctx context.Context, storeID uint64, f func(*grpc.ClientConn)) error { + return mgr.TryWithConn(ctx, storeID, func(cc *grpc.ClientConn) error { f(cc); return nil }) } // ResetBackupClient reset the connection for backup client. diff --git a/br/pkg/utils/suspend_importing.go b/br/pkg/utils/suspend_importing.go deleted file mode 100644 index 60693e7c00fff..0000000000000 --- a/br/pkg/utils/suspend_importing.go +++ /dev/null @@ -1,144 +0,0 @@ -package utils - -import ( - "context" - "time" - - "github.com/pingcap/errors" - "github.com/pingcap/kvproto/pkg/import_sstpb" - "github.com/pingcap/kvproto/pkg/metapb" - berrors "github.com/pingcap/tidb/br/pkg/errors" - "github.com/pingcap/tidb/br/pkg/logutil" - "github.com/pingcap/tidb/pkg/util/engine" - pd "github.com/tikv/pd/client" - "go.uber.org/zap" - "google.golang.org/grpc" -) - -const ( - DenyLightningUpdateFrequency = 5 -) - -func (mgr *StoreManager) GetAllStores(ctx context.Context) ([]*metapb.Store, error) { - return mgr.PDClient().GetAllStores(ctx, pd.WithExcludeTombstone()) -} - -func (mgr *StoreManager) GetDenyLightningClient(ctx context.Context, storeID uint64) (SuspendImportingClient, error) { - var cli import_sstpb.ImportSSTClient - err := mgr.WithConn(ctx, storeID, func(cc *grpc.ClientConn) { - cli = import_sstpb.NewImportSSTClient(cc) - }) - if err != nil { - return nil, err - } - return cli, nil -} - -type SuspendImportingEnv interface { - GetAllStores(ctx context.Context) ([]*metapb.Store, error) - GetDenyLightningClient(ctx context.Context, storeID uint64) (SuspendImportingClient, error) -} - -type SuspendImportingClient interface { - // Temporarily disable ingest / download / write for data listeners don't support catching import data. - SuspendImportRPC(ctx context.Context, in *import_sstpb.SuspendImportRPCRequest, opts ...grpc.CallOption) (*import_sstpb.SuspendImportRPCResponse, error) -} - -type SuspendImporting struct { - env SuspendImportingEnv - name string -} - -func NewSuspendImporting(name string, env SuspendImportingEnv) *SuspendImporting { - return &SuspendImporting{ - env: env, - name: name, - } -} - -// DenyAllStores tries to deny all current stores' lightning execution for the period of time. -// Returns a map mapping store ID to whether they are already denied to import tasks. -func (d *SuspendImporting) DenyAllStores(ctx context.Context, dur time.Duration) (map[uint64]bool, error) { - return d.forEachStores(ctx, func() *import_sstpb.SuspendImportRPCRequest { - return &import_sstpb.SuspendImportRPCRequest{ - ShouldSuspendImports: true, - DurationInSecs: uint64(dur.Seconds()), - Caller: d.name, - } - }) -} - -func (d *SuspendImporting) AllowAllStores(ctx context.Context) (map[uint64]bool, error) { - return d.forEachStores(ctx, func() *import_sstpb.SuspendImportRPCRequest { - return &import_sstpb.SuspendImportRPCRequest{ - ShouldSuspendImports: false, - Caller: d.name, - } - }) -} - -// forEachStores send the request to each stores reachable. -// Returns a map mapping store ID to whether they are already denied to import tasks. -func (d *SuspendImporting) forEachStores(ctx context.Context, makeReq func() *import_sstpb.SuspendImportRPCRequest) (map[uint64]bool, error) { - stores, err := d.env.GetAllStores(ctx) - if err != nil { - return nil, errors.Annotate(err, "failed to get all stores") - } - - result := map[uint64]bool{} - for _, store := range stores { - logutil.CL(ctx).Info("Handling store.", zap.Stringer("store", store)) - if engine.IsTiFlash(store) { - logutil.CL(ctx).Info("Store is tiflash, skipping.", zap.Stringer("store", store)) - continue - } - cli, err := d.env.GetDenyLightningClient(ctx, store.Id) - if err != nil { - return nil, errors.Annotatef(err, "failed to get client for store %d", store.Id) - } - req := makeReq() - resp, err := cli.SuspendImportRPC(ctx, req) - if err != nil { - return nil, errors.Annotatef(err, "failed to deny lightning rpc for store %d", store.Id) - } - result[store.Id] = resp.AlreadySuspended - } - return result, nil -} - -// HasKeptDenying checks whether a result returned by `DenyAllStores` is able to keep the consistency with last request. -// i.e. Whether the store has some holes of pausing the import requests. -func (d *SuspendImporting) ConsistentWithPrev(result map[uint64]bool) error { - for storeId, denied := range result { - if !denied { - return errors.Annotatef(berrors.ErrPossibleInconsistency, "failed to keep importing to store %d being denied, the state might be inconsistency", storeId) - } - } - return nil -} - -func (d *SuspendImporting) Keeper(ctx context.Context, ttl time.Duration) error { - lastSuccess := time.Now() - t := time.NewTicker(ttl / DenyLightningUpdateFrequency) - defer t.Stop() - for { - select { - case <-ctx.Done(): - return ctx.Err() - case <-t.C: - res, err := d.DenyAllStores(ctx, ttl) - if err != nil { - if time.Since(lastSuccess) < ttl { - logutil.CL(ctx).Warn("Failed to send deny one of the stores.", logutil.ShortError(err)) - continue - } - return err - } - if err := d.ConsistentWithPrev(res); err != nil { - return err - } - - lastSuccess = time.Now() - } - } -} diff --git a/br/pkg/utils/suspend_importing_test.go b/br/pkg/utils/suspend_importing_test.go deleted file mode 100644 index 8ee04af072048..0000000000000 --- a/br/pkg/utils/suspend_importing_test.go +++ /dev/null @@ -1,209 +0,0 @@ -package utils_test - -import ( - "context" - "fmt" - "sync" - "testing" - "time" - - "github.com/pingcap/errors" - "github.com/pingcap/kvproto/pkg/import_sstpb" - "github.com/pingcap/kvproto/pkg/metapb" - "github.com/pingcap/tidb/br/pkg/utils" - "github.com/stretchr/testify/require" - "golang.org/x/sync/errgroup" - "google.golang.org/grpc" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/status" -) - -type ImportTargetStore struct { - mu sync.Mutex - Id uint64 - LastSuccessDenyCall time.Time - SuspendImportFor time.Duration - SuspendedImport bool - - ErrGen func() error -} - -type ImportTargetStores struct { - mu sync.Mutex - items map[uint64]*ImportTargetStore -} - -func initWithIDs(ids []int) *ImportTargetStores { - ss := &ImportTargetStores{ - items: map[uint64]*ImportTargetStore{}, - } - for _, id := range ids { - store := new(ImportTargetStore) - store.Id = uint64(id) - ss.items[uint64(id)] = store - } - return ss -} - -func (s *ImportTargetStores) GetAllStores(ctx context.Context) ([]*metapb.Store, error) { - s.mu.Lock() - defer s.mu.Unlock() - - stores := make([]*metapb.Store, 0, len(s.items)) - for _, store := range s.items { - stores = append(stores, &metapb.Store{Id: store.Id}) - } - return stores, nil -} - -func (s *ImportTargetStores) GetDenyLightningClient(ctx context.Context, storeID uint64) (utils.SuspendImportingClient, error) { - s.mu.Lock() - defer s.mu.Unlock() - - store, ok := s.items[storeID] - if !ok { - return nil, errors.Trace(fmt.Errorf("store %d not found", storeID)) - } - - return store, nil -} - -// Temporarily disable ingest / download / write for data listeners don't support catching import data. -func (s *ImportTargetStore) SuspendImportRPC(ctx context.Context, in *import_sstpb.SuspendImportRPCRequest, opts ...grpc.CallOption) (*import_sstpb.SuspendImportRPCResponse, error) { - s.mu.Lock() - defer s.mu.Unlock() - - if s.ErrGen != nil { - if err := s.ErrGen(); err != nil { - return nil, s.ErrGen() - } - } - - suspended := s.SuspendedImport - if in.ShouldSuspendImports { - s.SuspendedImport = true - s.SuspendImportFor = time.Duration(in.DurationInSecs) * time.Second - s.LastSuccessDenyCall = time.Now() - } else { - s.SuspendedImport = false - } - return &import_sstpb.SuspendImportRPCResponse{ - AlreadySuspended: suspended, - }, nil -} - -func (s *ImportTargetStores) assertAllStoresDenied(t *testing.T) { - s.mu.Lock() - defer s.mu.Unlock() - - for _, store := range s.items { - func() { - store.mu.Lock() - defer store.mu.Unlock() - - require.True(t, store.SuspendedImport, "ID = %d", store.Id) - require.Less(t, time.Since(store.LastSuccessDenyCall), store.SuspendImportFor, "ID = %d", store.Id) - }() - } -} - -func TestBasic(t *testing.T) { - req := require.New(t) - - ss := initWithIDs([]int{1, 4, 5}) - deny := utils.NewSuspendImporting(t.Name(), ss) - - ctx := context.Background() - res, err := deny.DenyAllStores(ctx, 10*time.Second) - req.NoError(err) - req.Error(deny.ConsistentWithPrev(res)) - for id, inner := range ss.items { - req.True(inner.SuspendedImport, "at %d", id) - req.Equal(inner.SuspendImportFor, 10*time.Second, "at %d", id) - } - - res, err = deny.DenyAllStores(ctx, 10*time.Second) - req.NoError(err) - req.NoError(deny.ConsistentWithPrev(res)) - - res, err = deny.AllowAllStores(ctx) - req.NoError(err) - req.NoError(deny.ConsistentWithPrev(res)) -} - -func TestKeeperError(t *testing.T) { - req := require.New(t) - - ctx := context.Background() - ss := initWithIDs([]int{1, 4, 5}) - deny := utils.NewSuspendImporting(t.Name(), ss) - ttl := time.Second - - now := time.Now() - triggeredErr := uint32(0) - _, err := deny.DenyAllStores(ctx, ttl) - req.NoError(err) - - ss.items[4].ErrGen = func() error { - if time.Since(now) > 600*time.Millisecond { - return nil - } - triggeredErr += 1 - return status.Error(codes.Unavailable, "the store is slacking.") - } - - cx, cancel := context.WithCancel(ctx) - - wg := new(errgroup.Group) - wg.Go(func() error { return deny.Keeper(cx, ttl) }) - time.Sleep(ttl) - cancel() - req.ErrorIs(wg.Wait(), context.Canceled) - req.Positive(triggeredErr) -} - -func TestKeeperErrorExit(t *testing.T) { - req := require.New(t) - - ctx := context.Background() - ss := initWithIDs([]int{1, 4, 5}) - deny := utils.NewSuspendImporting(t.Name(), ss) - ttl := time.Second - - triggeredErr := uint32(0) - _, err := deny.DenyAllStores(ctx, ttl) - req.NoError(err) - - ss.items[4].ErrGen = func() error { - triggeredErr += 1 - return status.Error(codes.Unavailable, "the store is slacking.") - } - - wg := new(errgroup.Group) - wg.Go(func() error { return deny.Keeper(ctx, ttl) }) - time.Sleep(ttl) - req.Error(wg.Wait()) - req.Positive(triggeredErr) -} - -func TestKeeperCalled(t *testing.T) { - req := require.New(t) - - ctx := context.Background() - ss := initWithIDs([]int{1, 4, 5}) - deny := utils.NewSuspendImporting(t.Name(), ss) - ttl := 1 * time.Second - - _, err := deny.DenyAllStores(ctx, ttl) - req.NoError(err) - - cx, cancel := context.WithCancel(ctx) - wg := new(errgroup.Group) - wg.Go(func() error { return deny.Keeper(cx, ttl) }) - for i := 0; i < 20; i++ { - ss.assertAllStoresDenied(t) - time.Sleep(ttl / 10) - } - cancel() - req.ErrorIs(wg.Wait(), context.Canceled) -} diff --git a/br/pkg/utils/worker.go b/br/pkg/utils/worker.go index ba69752ca5d23..2adb42ee88bb2 100644 --- a/br/pkg/utils/worker.go +++ b/br/pkg/utils/worker.go @@ -130,3 +130,32 @@ func PanicToErr(err *error) { log.Warn("PanicToErr: panicked, recovering and returning error", zap.StackSkip("stack", 1), logutil.ShortError(*err)) } } + +type Result[T any] struct { + Err error + Item T +} + +func AsyncStreamBy[T any](generator func() (T, error)) <-chan Result[T] { + out := make(chan Result[T]) + go func() { + defer close(out) + for { + item, err := generator() + if err != nil { + out <- Result[T]{Err: err} + return + } + out <- Result[T]{Item: item} + } + }() + return out +} + +func BuildWorkerTokenChannel(size uint) chan struct{} { + ch := make(chan struct{}, size) + for i := 0; i < int(size); i += 1 { + ch <- struct{}{} + } + return ch +} diff --git a/br/pkg/version/build/info.go b/br/pkg/version/build/info.go index 6c011b6d79e9d..9049faa4f5912 100644 --- a/br/pkg/version/build/info.go +++ b/br/pkg/version/build/info.go @@ -16,18 +16,21 @@ import ( // Version information. var ( - ReleaseVersion = getReleaseVersion() - BuildTS = versioninfo.TiDBBuildTS - GitHash = versioninfo.TiDBGitHash - GitBranch = versioninfo.TiDBGitBranch - goVersion = runtime.Version() + ReleaseVersion = getReleaseVersion() + BuildTS = versioninfo.TiDBBuildTS + GitHash = versioninfo.TiDBGitHash + GitBranch = versioninfo.TiDBGitBranch + goVersion = runtime.Version() + ReleaseVersionForTest = "nightly-dirty" ) func getReleaseVersion() string { if mysql.TiDBReleaseVersion != "None" { return mysql.TiDBReleaseVersion } - return "v7.0.0-master" + // it's unreachable for normal path, only for realtikv tests + // we need to set the ReleaseVersion manually. + return ReleaseVersionForTest } // AppName is a name of a built binary. diff --git a/br/pkg/version/version.go b/br/pkg/version/version.go index d11b728d6515e..d3a6b788919b6 100644 --- a/br/pkg/version/version.go +++ b/br/pkg/version/version.go @@ -132,6 +132,9 @@ func CheckVersionForBackup(backupVersion *semver.Version) VerChecker { // CheckVersionForBRPiTR checks whether version of the cluster and BR-pitr itself is compatible. // Note: BR'version >= 6.1.0 at least in this function func CheckVersionForBRPiTR(s *metapb.Store, tikvVersion *semver.Version) error { + if build.ReleaseVersion == build.ReleaseVersionForTest { + return nil + } BRVersion, err := semver.NewVersion(removeVAndHash(build.ReleaseVersion)) if err != nil { return errors.Annotatef(berrors.ErrVersionMismatch, "%s: invalid version, please recompile using `git fetch origin --tags && make build`", err) @@ -186,6 +189,9 @@ func CheckVersionForKeyspaceBR(_ *metapb.Store, tikvVersion *semver.Version) err // CheckVersionForBR checks whether version of the cluster and BR itself is compatible. func CheckVersionForBR(s *metapb.Store, tikvVersion *semver.Version) error { + if build.ReleaseVersion == build.ReleaseVersionForTest { + return nil + } BRVersion, err := semver.NewVersion(removeVAndHash(build.ReleaseVersion)) if err != nil { return errors.Annotatef(berrors.ErrVersionMismatch, "%s: invalid version, please recompile using `git fetch origin --tags && make build`", err) diff --git a/br/pkg/version/version_test.go b/br/pkg/version/version_test.go index 6e986791d49e1..a4f302ea8ace9 100644 --- a/br/pkg/version/version_test.go +++ b/br/pkg/version/version_test.go @@ -45,6 +45,13 @@ func TestCheckClusterVersion(t *testing.T) { mock := mockPDClient{ Client: nil, } + { + mock.getAllStores = func() []*metapb.Store { + return []*metapb.Store{{Version: `v5.4.2`}} + } + err := CheckClusterVersion(context.Background(), &mock, CheckVersionForBRPiTR) + require.NoError(t, err) + } { build.ReleaseVersion = "v6.2.0" diff --git a/br/tests/README.md b/br/tests/README.md index 12739433e098b..4c93237b88535 100644 --- a/br/tests/README.md +++ b/br/tests/README.md @@ -89,8 +89,8 @@ After executing the tests, run `make br_coverage` to get a coverage report at 1. New integration tests can be written as shell scripts in `tests/TEST_NAME/run.sh`. The script should exit with a nonzero error code on failure. -2. Add TEST_NAME to existing group in [run_group.sh](./run_group.sh)(Recommended), or add a new group for it. -3. If you add a new group, the name of the new group must be added to CI [br-integration-test](https://github.com/PingCAP-QE/ci/blob/main/pipelines/pingcap/tidb/latest/pull_br_integration_test.groovy). +2. Add TEST_NAME to existing group in [run_group_br_tests.sh](./run_group_br_tests.sh)(Recommended) or [run_group_lightning_tests.sh](./run_group_lightning_tests.sh)(Recommended), or add a new group for it. +3. If you add a new group, the name of the new group must be added to CI [br-integration-test](https://github.com/PingCAP-QE/ci/blob/main/pipelines/pingcap/tidb/latest/pull_br_integration_test.groovy) or [lightning-integration-test](https://github.com/PingCAP-QE/ci/blob/main/pipelines/pingcap/tidb/latest/pull_lightning_integration_test.groovy). Several convenient commands are provided: diff --git a/br/tests/_utils/generate_certs b/br/tests/_utils/generate_certs index a968e8a7d2263..f7343f153d78f 100755 --- a/br/tests/_utils/generate_certs +++ b/br/tests/_utils/generate_certs @@ -21,7 +21,7 @@ mkdir -p $TEST_DIR/certs openssl ecparam -out "$TEST_DIR/certs/ca.key" -name prime256v1 -genkey # CA's Common Name must not be the same as signed certificate. openssl req -new -batch -sha256 -subj '/CN=br_tests' -key "$TEST_DIR/certs/ca.key" -out "$TEST_DIR/certs/ca.csr" -openssl x509 -req -sha256 -days 2 -in "$TEST_DIR/certs/ca.csr" -signkey "$TEST_DIR/certs/ca.key" -out "$TEST_DIR/certs/ca.pem" +openssl x509 -req -sha256 -days 2 -in "$TEST_DIR/certs/ca.csr" -extfile "${cur_dir}/../config/rootca.conf" -extensions ext -signkey "$TEST_DIR/certs/ca.key" -out "$TEST_DIR/certs/ca.pem" for cluster in tidb pd tikv lightning tiflash curl ticdc br; do openssl ecparam -out "$TEST_DIR/certs/$cluster.key" -name prime256v1 -genkey openssl req -new -batch -sha256 -subj '/CN=localhost' -key "$TEST_DIR/certs/$cluster.key" -out "$TEST_DIR/certs/$cluster.csr" diff --git a/br/tests/br_full/run.sh b/br/tests/br_full/run.sh index e68fb6b39c871..dcfb236a85fe0 100755 --- a/br/tests/br_full/run.sh +++ b/br/tests/br_full/run.sh @@ -104,6 +104,37 @@ for ct in limit lz4 zstd; do fi done +for granularity in "fine-grained" "coarse-grained"; do + for i in $(seq $DB_COUNT); do + run_sql "DROP DATABASE $DB${i};" + done + + # restore full + echo "restore with $ct backup start..." + export GO_FAILPOINTS="github.com/pingcap/tidb/br/pkg/restore/restore-storage-error=1*return(\"connection refused\");github.com/pingcap/tidb/br/pkg/restore/restore-gRPC-error=1*return(true)" + export GO_FAILPOINTS="${GO_FAILPOINTS};github.com/pingcap/tidb/br/pkg/restore/no-leader-error=3*return(true)" + run_br restore full -s "local://$TEST_DIR/$DB-$ct" --pd $PD_ADDR --ratelimit 1024 --granularity=$granularity + export GO_FAILPOINTS="" + + for i in $(seq $DB_COUNT); do + row_count_new[${i}]=$(run_sql "SELECT COUNT(*) FROM $DB${i}.$TABLE;" | awk '/COUNT/{print $2}') + done + + fail=false + for i in $(seq $DB_COUNT); do + if [ "${row_count_ori[i]}" != "${row_count_new[i]}" ];then + fail=true + echo "TEST: [$TEST_NAME] fail on database $DB${i}" + fi + echo "database $DB${i} [original] row count: ${row_count_ori[i]}, [after br] row count: ${row_count_new[i]}" + done + + if $fail; then + echo "TEST: [$TEST_NAME] [$granularity] failed!" + exit 1 + fi +done + for i in $(seq $DB_COUNT); do run_sql "DROP DATABASE $DB${i};" done diff --git a/br/tests/br_full_cluster_restore/run.sh b/br/tests/br_full_cluster_restore/run.sh index de5b41fb47c9c..f05b28deeabdc 100644 --- a/br/tests/br_full_cluster_restore/run.sh +++ b/br/tests/br_full_cluster_restore/run.sh @@ -40,17 +40,17 @@ run_br backup full --log-file $br_log_file --lastbackupts $LAST_BACKUP_TS -s "lo run_sql "drop database db2" echo "--> cluster is not fresh" -run_br restore full --with-sys-table --log-file $br_log_file -s "local://$backup_dir" > $res_file 2>&1 || true +run_br restore full --log-file $br_log_file -s "local://$backup_dir" > $res_file 2>&1 || true check_contains "the target cluster is not fresh" echo "--> non full backup data" -run_br restore full --with-sys-table --log-file $br_log_file -s "local://$incr_backup_dir" +run_br restore full --log-file $br_log_file -s "local://$incr_backup_dir" run_sql "select count(*) from db2.t1" check_contains "count(*): 3" echo "--> restore using filter" run_sql "drop database db1; drop database db2" -run_br restore full --with-sys-table --log-file $br_log_file --filter '*.*' --filter '!mysql.*' -s "local://$backup_dir" +run_br restore full --log-file $br_log_file --filter '*.*' --filter '!mysql.*' -s "local://$backup_dir" run_sql "select count(*) from db2.t1" check_contains "count(*): 2" @@ -58,9 +58,9 @@ echo "--> incompatible system table: more column on target cluster" restart_services # mock incompatible manually run_sql "alter table mysql.user add column xx int;" -run_br restore full --with-sys-table --log-file $br_log_file -s "local://$backup_dir" > $res_file 2>&1 || true +run_br restore full --log-file $br_log_file -s "local://$backup_dir" > $res_file 2>&1 || true run_sql "select count(*) from mysql.user" -check_contains "count(*): 6" +check_contains "count(*): 7" # check resource group user_attributes is cleaned. run_sql "SELECT user FROM mysql.user WHERE JSON_EXTRACT(user_attributes, '$.resource_group') != '';" check_not_contains 'user: user1' @@ -69,27 +69,27 @@ echo "--> incompatible system table: less column on target cluster" restart_services # mock incompatible manually run_sql "alter table mysql.user drop column Reload_priv" -run_br restore full --with-sys-table --log-file $br_log_file -s "local://$backup_dir" > $res_file 2>&1 || true +run_br restore full --log-file $br_log_file -s "local://$backup_dir" > $res_file 2>&1 || true check_contains "the target cluster is not compatible with the backup data" echo "--> incompatible system table: column type incompatible" restart_services # mock incompatible manually run_sql "alter table mysql.tables_priv modify column Table_priv set('Select') DEFAULT NULL;" -run_br restore full --with-sys-table --log-file $br_log_file -s "local://$backup_dir" > $res_file 2>&1 || true +run_br restore full --log-file $br_log_file -s "local://$backup_dir" > $res_file 2>&1 || true check_contains "the target cluster is not compatible with the backup data" restart_services echo "--> restore without with-sys-table flag, only restore data" -run_br restore full --log-file $br_log_file -s "local://$backup_dir" +run_br restore full --with-sys-table=false --log-file $br_log_file -s "local://$backup_dir" run_sql "select count(*) from mysql.user" check_contains "count(*): 1" echo "--> restore without with-sys-table flag and set explicit mysql.* filter, will not restore priv data" run_sql "drop database db1;" run_sql "drop database db2;" -run_br restore full --log-file $br_log_file -s "local://$backup_dir" -f 'mysql.*' +run_br restore full --with-sys-table=false --log-file $br_log_file -s "local://$backup_dir" -f 'mysql.*' run_sql "select count(*) from mysql.user" check_contains "count(*): 1" @@ -97,18 +97,18 @@ echo "--> full cluster restore, will not clear cloud_admin@'%'" restart_services # create cloud_admin on target cluster manually, this user will **not** be cleared run_sql "create user cloud_admin identified by 'xxxxxxxx'" -run_br restore full --with-sys-table --log-file $br_log_file -s "local://$backup_dir" +run_br restore full --log-file $br_log_file -s "local://$backup_dir" # cloud_admin@'127.0.0.1' is restored run_sql "select count(*) from mysql.user where user='cloud_admin'" check_contains "count(*): 2" run_sql "select count(*) from mysql.tables_priv where user='cloud_admin'" -check_contains "count(*): 0" +check_contains "count(*): 2" run_sql "select count(*) from mysql.columns_priv where user='cloud_admin'" -check_contains "count(*): 0" +check_contains "count(*): 1" run_sql "select count(*) from mysql.global_priv where user='cloud_admin'" check_contains "count(*): 2" run_sql "select priv from mysql.global_priv where user='cloud_admin' and host='%'" -check_contains "priv: {}" +check_contains 'priv: {"ssl_type":1}' run_sql "select priv from mysql.global_priv where user='cloud_admin' and host='127.0.0.1'" check_contains "priv: {}" @@ -116,7 +116,7 @@ echo "--> full cluster restore" restart_services # create cloud_admin on target cluster manually, this user will be cleared run_sql "create user cloud_admin@'1.1.1.1' identified by 'xxxxxxxx'" -run_br restore full --with-sys-table --log-file $br_log_file -s "local://$backup_dir" +run_br restore full --log-file $br_log_file -s "local://$backup_dir" run_sql_as user1 "123456" "select count(*) from db1.t1" check_contains "count(*): 2" run_sql_as user1 "123456" "select count(*) from db2.t1" @@ -134,33 +134,41 @@ run_sql_as user3 "123456" "select count(*) from db1.t1" --ssl check_contains "count(*): 2" run_sql_as user3 "123456" "select count(*) from db1.t2" --ssl || true check_contains "SELECT command denied to user" -# we don't clear or restore data about user cloud_admin@'%' -# but other cloud_admin@'any-other-host' will be cleared and restored -# so cloud_admin@'1.1.1.1' is cleared, cloud_admin@'127.0.0.1' is restored -run_sql_as cloud_admin "000000" "show grants" -check_contains ": GRANT USAGE" run_sql "select count(*) from mysql.user where user='cloud_admin'" -check_contains "count(*): 1" +check_contains "count(*): 3" run_sql "select count(*) from mysql.user where user='cloud_admin' and host='127.0.0.1'" check_contains "count(*): 1" run_sql "select count(*) from mysql.db where user='cloud_admin'" -check_contains "count(*): 0" +check_contains "count(*): 1" run_sql "select count(*) from mysql.tables_priv where user='cloud_admin'" -check_contains "count(*): 0" +check_contains "count(*): 2" run_sql "select count(*) from mysql.columns_priv where user='cloud_admin'" -check_contains "count(*): 0" -run_sql "select count(*) from mysql.global_priv where user='cloud_admin'" check_contains "count(*): 1" -run_sql "select priv from mysql.global_priv where user='cloud_admin'" +run_sql "select count(*) from mysql.global_priv where user='cloud_admin'" +check_contains "count(*): 3" +run_sql "select priv from mysql.global_priv where user='cloud_admin' and host='%'" +check_contains 'priv: {"ssl_type":1}' +run_sql "select priv from mysql.global_priv where user='cloud_admin' and host='127.0.0.1'" +check_contains "priv: {}" +run_sql "select priv from mysql.global_priv where user='cloud_admin' and host='1.1.1.1'" check_contains "priv: {}" run_sql "select count(*) from mysql.global_grants where user='cloud_admin'" -check_contains "count(*): 0" +check_contains "count(*): 1" run_sql "select count(*) from mysql.default_roles where user='cloud_admin'" -check_contains "count(*): 0" +check_contains "count(*): 1" run_sql "select count(*) from mysql.role_edges where from_user='cloud_admin'" check_contains "count(*): 0" run_sql "select count(*) from mysql.role_edges where to_user='cloud_admin'" -check_contains "count(*): 0" +check_contains "count(*): 1" + +echo "--> full cluster restore with --filter, need to flush privileges" +restart_services +run_br restore full --filter "*.*" --filter "!__TiDB_BR_Temporary*.*" --filter "!mysql.*" --filter "mysql.bind_info" --filter "mysql.user" --filter "mysql.db" --filter "mysql.tables_priv" --filter "mysql.columns_priv" --filter "mysql.global_priv" --filter "mysql.global_grants" --filter "mysql.default_roles" --filter "mysql.role_edges" --filter "!sys.*" --filter "!INFORMATION_SCHEMA.*" --filter "!PERFORMANCE_SCHEMA.*" --filter "!METRICS_SCHEMA.*" --filter "!INSPECTION_SCHEMA.*" --log-file $br_log_file -s "local://$backup_dir" +# BR executes `FLUSH PRIVILEGES` already +run_sql_as user1 "123456" "select count(*) from db1.t1" +check_contains "count(*): 2" +run_sql_as user1 "123456" "select count(*) from db2.t1" +check_contains "count(*): 2" echo "clean up kept backup" rm -rf $backup_dir $incr_backup_dir diff --git a/br/tests/br_full_ddl/run.sh b/br/tests/br_full_ddl/run.sh index 92b845e7313fe..370d77dca66dd 100755 --- a/br/tests/br_full_ddl/run.sh +++ b/br/tests/br_full_ddl/run.sh @@ -204,8 +204,8 @@ then else echo "TEST: [$TEST_NAME] fail due to stats are not equal" grep ERROR $LOG - cat $BACKUP_STAT | head -n 1000 - cat $RESOTRE_STAT | head -n 1000 + cat $BACKUP_STAT | tail -n 1000 + cat $RESOTRE_STAT | tail -n 1000 exit 1 fi diff --git a/br/tests/br_key_locked/codec.go b/br/tests/br_key_locked/codec.go index 9ed40d2677ef5..df95491e3b028 100644 --- a/br/tests/br_key_locked/codec.go +++ b/br/tests/br_key_locked/codec.go @@ -56,13 +56,14 @@ func (c *codecPDClient) ScanRegions( startKey []byte, endKey []byte, limit int, + opts ...pd.GetRegionOption, ) ([]*pd.Region, error) { startKey = codec.EncodeBytes(nil, startKey) if len(endKey) > 0 { endKey = codec.EncodeBytes(nil, endKey) } - regions, err := c.Client.ScanRegions(ctx, startKey, endKey, limit) + regions, err := c.Client.ScanRegions(ctx, startKey, endKey, limit, opts...) if err != nil { return nil, errors.Trace(err) } diff --git a/br/tests/br_pitr/incremental_data/delete_range.sql b/br/tests/br_pitr/incremental_data/delete_range.sql index f5afde943649e..180a7cd1d0e62 100644 --- a/br/tests/br_pitr/incremental_data/delete_range.sql +++ b/br/tests/br_pitr/incremental_data/delete_range.sql @@ -5,14 +5,23 @@ drop table table_to_be_dropped_or_truncated.t0_dropped; drop table table_to_be_dropped_or_truncated.t1_dropped; truncate table table_to_be_dropped_or_truncated.t0_truncated; truncate table table_to_be_dropped_or_truncated.t1_truncated; --- 3. Drop/Truncate Table Partition +-- 3.1. Drop/Truncate Table Partition alter table partition_to_be_dropped_or_truncated.t1_dropped drop partition p0; alter table partition_to_be_dropped_or_truncated.t1_truncated truncate partition p0; +alter table partition_to_be_dropped_or_truncated.t1_truncated reorganize partition p2 INTO (PARTITION p2 VALUES LESS THAN (20), PARTITION p3 VALUES LESS THAN MAXVALUE); +-- 3.2. Remove/Alter Table Partitioning +alter table partition_to_be_removed_or_altered.t_removed remove partitioning; +alter table partition_to_be_removed_or_altered.t_altered partition by range(id) ( PARTITION p0 VALUES LESS THAN (0), PARTITION p1 VALUES LESS THAN (100), PARTITION p2 VALUES LESS THAN MAXVALUE ); +alter table partition_to_be_removed_or_altered.t_altered partition by key(id) partitions 3; -- 4. Drop Table Index/PrimaryKey alter table index_or_primarykey_to_be_dropped.t0 drop index k1; alter table index_or_primarykey_to_be_dropped.t1 drop index k1; alter table index_or_primarykey_to_be_dropped.t0 drop primary key; alter table index_or_primarykey_to_be_dropped.t1 drop primary key; +create index k1 on index_or_primarykey_to_be_dropped.t0 (name); +create index k1 on index_or_primarykey_to_be_dropped.t1 (name); +alter table index_or_primarykey_to_be_dropped.t0 add primary key (id); +alter table index_or_primarykey_to_be_dropped.t1 add primary key (id); -- 5. Drop Table Indexes alter table indexes_to_be_dropped.t0 drop index k1, drop index k2; alter table indexes_to_be_dropped.t1 drop index k1, drop index k2; @@ -23,3 +32,184 @@ alter table column_s_to_be_dropped.t0_columns drop column name, drop column c; alter table column_s_to_be_dropped.t1_columns drop column name, drop column c; -- 7. Modify Table Column alter table column_to_be_modified.t0 modify column name varchar(25); + + +-- CREATE TABLE IN THE LOR RESTORE STAGE +-- 1. Drop Schema +create database db_to_be_dropped_2; +create table db_to_be_dropped_2.t0(id int primary key, c int, name char(20)); +create table db_to_be_dropped_2.t1(id int primary key, c int, name char(20)) PARTITION BY RANGE(id) ( PARTITION p0 VALUES LESS THAN (0), PARTITION p1 VALUES LESS THAN (10), PARTITION p2 VALUES LESS THAN MAXVALUE ); + +create index k1 on db_to_be_dropped_2.t0 (name); +create index k2 on db_to_be_dropped_2.t0(c); +create index k1 on db_to_be_dropped_2.t1(name); +create index k2 on db_to_be_dropped_2.t1(c); +create index k3 on db_to_be_dropped_2.t1 (id, c); + +insert into db_to_be_dropped_2.t0 values (1, 2, "123"), (2, 3, "123"); +insert into db_to_be_dropped_2.t1 values (1, 2, "123"), (2, 3, "123"); +-- 2. Drop/Truncate Table +create database table_to_be_dropped_or_truncated_2; +create table table_to_be_dropped_or_truncated_2.t0_dropped(id int primary key, c int, name char(20)); +create table table_to_be_dropped_or_truncated_2.t1_dropped(id int primary key, c int, name char(20)) PARTITION BY RANGE(id) ( PARTITION p0 VALUES LESS THAN (0), PARTITION p1 VALUES LESS THAN (10), PARTITION p2 VALUES LESS THAN MAXVALUE ); +create table table_to_be_dropped_or_truncated_2.t0_truncated(id int primary key, c int, name char(20)); +create table table_to_be_dropped_or_truncated_2.t1_truncated(id int primary key, c int, name char(20)) PARTITION BY RANGE(id) ( PARTITION p0 VALUES LESS THAN (0), PARTITION p1 VALUES LESS THAN (10), PARTITION p2 VALUES LESS THAN MAXVALUE ); + +create index k1 on table_to_be_dropped_or_truncated_2.t0_dropped (name); +create index k2 on table_to_be_dropped_or_truncated_2.t0_dropped (c); +create index k1 on table_to_be_dropped_or_truncated_2.t1_dropped (name); +create index k2 on table_to_be_dropped_or_truncated_2.t1_dropped (c); +create index k3 on table_to_be_dropped_or_truncated_2.t1_dropped (id, c); + +create index k1 on table_to_be_dropped_or_truncated_2.t0_truncated (name); +create index k2 on table_to_be_dropped_or_truncated_2.t0_truncated (c); +create index k1 on table_to_be_dropped_or_truncated_2.t1_truncated (name); +create index k2 on table_to_be_dropped_or_truncated_2.t1_truncated (c); +create index k3 on table_to_be_dropped_or_truncated_2.t1_truncated (id, c); + +insert into table_to_be_dropped_or_truncated_2.t0_dropped values (1, 2, "123"), (2, 3, "123"); +insert into table_to_be_dropped_or_truncated_2.t1_dropped values (1, 2, "123"), (2, 3, "123"); + +insert into table_to_be_dropped_or_truncated_2.t0_truncated values (1, 2, "123"), (2, 3, "123"); +insert into table_to_be_dropped_or_truncated_2.t1_truncated values (1, 2, "123"), (2, 3, "123"); + +-- 3.1. Drop/Truncate Table Partition +create database partition_to_be_dropped_or_truncated_2; +create table partition_to_be_dropped_or_truncated_2.t0_dropped(id int primary key, c int, name char(20)); +create table partition_to_be_dropped_or_truncated_2.t1_dropped(id int primary key, c int, name char(20)) PARTITION BY RANGE(id) ( PARTITION p0 VALUES LESS THAN (0), PARTITION p1 VALUES LESS THAN (10), PARTITION p2 VALUES LESS THAN MAXVALUE ); +create table partition_to_be_dropped_or_truncated_2.t0_truncated(id int primary key, c int, name char(20)); +create table partition_to_be_dropped_or_truncated_2.t1_truncated(id int primary key, c int, name char(20)) PARTITION BY RANGE(id) ( PARTITION p0 VALUES LESS THAN (0), PARTITION p1 VALUES LESS THAN (10), PARTITION p2 VALUES LESS THAN MAXVALUE ); + +create index k1 on partition_to_be_dropped_or_truncated_2.t0_dropped (name); +create index k2 on partition_to_be_dropped_or_truncated_2.t0_dropped (c); +create index k1 on partition_to_be_dropped_or_truncated_2.t1_dropped (name); +create index k2 on partition_to_be_dropped_or_truncated_2.t1_dropped (c); +create index k3 on partition_to_be_dropped_or_truncated_2.t1_dropped (id, c); + +create index k1 on partition_to_be_dropped_or_truncated_2.t0_truncated (name); +create index k2 on partition_to_be_dropped_or_truncated_2.t0_truncated (c); +create index k1 on partition_to_be_dropped_or_truncated_2.t1_truncated (name); +create index k2 on partition_to_be_dropped_or_truncated_2.t1_truncated (c); +create index k3 on partition_to_be_dropped_or_truncated_2.t1_truncated (id, c); + +insert into partition_to_be_dropped_or_truncated_2.t0_dropped values (1, 2, "123"), (2, 3, "123"); +insert into partition_to_be_dropped_or_truncated_2.t1_dropped values (1, 2, "123"), (2, 3, "123"); + +insert into partition_to_be_dropped_or_truncated_2.t0_truncated values (1, 2, "123"), (2, 3, "123"); +insert into partition_to_be_dropped_or_truncated_2.t1_truncated values (1, 2, "123"), (2, 3, "123"); + +-- 3.2. Remove/Alter Table Partitioning +create database partition_to_be_removed_or_altered_2; +create table partition_to_be_removed_or_altered_2.t_removed(id int primary key, c int, name char(20)) PARTITION BY RANGE(id) ( PARTITION p0 VALUES LESS THAN (0), PARTITION p1 VALUES LESS THAN (10), PARTITION p2 VALUES LESS THAN MAXVALUE ); +create table partition_to_be_removed_or_altered_2.t_altered(id int primary key, c int, name char(20)) PARTITION BY RANGE(id) ( PARTITION p0 VALUES LESS THAN (0), PARTITION p1 VALUES LESS THAN (10), PARTITION p2 VALUES LESS THAN MAXVALUE ); + +create index k1 on partition_to_be_removed_or_altered_2.t_removed (name); +create index k2 on partition_to_be_removed_or_altered_2.t_removed (c); +create index k3 on partition_to_be_removed_or_altered_2.t_removed (id, c); + +create index k1 on partition_to_be_removed_or_altered_2.t_altered (name); +create index k2 on partition_to_be_removed_or_altered_2.t_altered (c); +create index k3 on partition_to_be_removed_or_altered_2.t_altered (id, c); + +insert into partition_to_be_removed_or_altered_2.t_removed values (1, 2, "123"), (2, 3, "123"); + +insert into partition_to_be_removed_or_altered_2.t_altered values (1, 2, "123"), (2, 3, "123"); + +-- 4. Drop Table Index/PrimaryKey +create database index_or_primarykey_to_be_dropped_2; +create table index_or_primarykey_to_be_dropped_2.t0(id int primary key nonclustered, c int, name char(20)); +create table index_or_primarykey_to_be_dropped_2.t1(id int primary key nonclustered, c int, name char(20)) PARTITION BY RANGE(id) ( PARTITION p0 VALUES LESS THAN (0), PARTITION p1 VALUES LESS THAN (10), PARTITION p2 VALUES LESS THAN MAXVALUE ); + +create index k1 on index_or_primarykey_to_be_dropped_2.t0 (name); +create index k2 on index_or_primarykey_to_be_dropped_2.t0 (c); +create index k1 on index_or_primarykey_to_be_dropped_2.t1 (name); +create index k2 on index_or_primarykey_to_be_dropped_2.t1 (c); +create index k3 on index_or_primarykey_to_be_dropped_2.t1 (id, c); + +insert into index_or_primarykey_to_be_dropped_2.t0 values (1, 2, "123"), (2, 3, "123"); +insert into index_or_primarykey_to_be_dropped_2.t1 values (1, 2, "123"), (2, 3, "123"); +-- 5. Drop Table INDEXES +create database indexes_to_be_dropped_2; +create table indexes_to_be_dropped_2.t0(id int primary key nonclustered, c int, name char(20)); +create table indexes_to_be_dropped_2.t1(id int primary key nonclustered, c int, name char(20)) PARTITION BY RANGE(id) ( PARTITION p0 VALUES LESS THAN (0), PARTITION p1 VALUES LESS THAN (10), PARTITION p2 VALUES LESS THAN MAXVALUE ); + +create index k1 on indexes_to_be_dropped_2.t0 (name); +create index k2 on indexes_to_be_dropped_2.t0 (c); +create index k1 on indexes_to_be_dropped_2.t1 (name); +create index k2 on indexes_to_be_dropped_2.t1 (c); +create index k3 on indexes_to_be_dropped_2.t1 (id, c); + +insert into indexes_to_be_dropped_2.t0 values (1, 2, "123"), (2, 3, "123"); +insert into indexes_to_be_dropped_2.t1 values (1, 2, "123"), (2, 3, "123"); +-- 6. Drop Table Column/Columns +create database column_s_to_be_dropped_2; +create table column_s_to_be_dropped_2.t0_column(id int primary key nonclustered, c int, name char(20)); +create table column_s_to_be_dropped_2.t1_column(id int primary key nonclustered, c int, name char(20)) PARTITION BY RANGE(id) ( PARTITION p0 VALUES LESS THAN (0), PARTITION p1 VALUES LESS THAN (10), PARTITION p2 VALUES LESS THAN MAXVALUE ); +create table column_s_to_be_dropped_2.t0_columns(id int primary key nonclustered, c int, name char(20)); +create table column_s_to_be_dropped_2.t1_columns(id int primary key nonclustered, c int, name char(20)) PARTITION BY RANGE(id) ( PARTITION p0 VALUES LESS THAN (0), PARTITION p1 VALUES LESS THAN (10), PARTITION p2 VALUES LESS THAN MAXVALUE ); + +create index k1 on column_s_to_be_dropped_2.t0_column (name); +create index k2 on column_s_to_be_dropped_2.t0_column (c); +create index k1 on column_s_to_be_dropped_2.t1_column (name); +create index k2 on column_s_to_be_dropped_2.t1_column (c); +create index k3 on column_s_to_be_dropped_2.t1_column (id, c); + +create index k1 on column_s_to_be_dropped_2.t0_columns (name); +create index k2 on column_s_to_be_dropped_2.t0_columns (c); +create index k1 on column_s_to_be_dropped_2.t1_columns (name); +create index k2 on column_s_to_be_dropped_2.t1_columns (c); +-- create index k3 on column_s_to_be_dropped_2.t1_columns (id, c); + +insert into column_s_to_be_dropped_2.t0_column values (1, 2, "123"), (2, 3, "123"); +insert into column_s_to_be_dropped_2.t1_column values (1, 2, "123"), (2, 3, "123"); +insert into column_s_to_be_dropped_2.t0_columns values (1, 2, "123"), (2, 3, "123"); +insert into column_s_to_be_dropped_2.t1_columns values (1, 2, "123"), (2, 3, "123"); +-- 7. Modify Table Column +create database column_to_be_modified_2; +create table column_to_be_modified_2.t0(id int primary key nonclustered, c int, name char(20)); +create table column_to_be_modified_2.t1(id int primary key nonclustered, c int, name char(20)) PARTITION BY RANGE(id) ( PARTITION p0 VALUES LESS THAN (0), PARTITION p1 VALUES LESS THAN (10), PARTITION p2 VALUES LESS THAN MAXVALUE ); + +create index k1 on column_to_be_modified_2.t0 (name); +create index k2 on column_to_be_modified_2.t0 (c); +create index k1 on column_to_be_modified_2.t1 (name); +create index k2 on column_to_be_modified_2.t1 (c); +create index k3 on column_to_be_modified_2.t1 (id, c); + +insert into column_to_be_modified_2.t0 values (1, 2, "123"), (2, 3, "123"); +insert into column_to_be_modified_2.t1 values (1, 2, "123"), (2, 3, "123"); + +-- 1. Drop Schema +drop database db_to_be_dropped_2; +-- 2. Drop/Truncate Table +drop table table_to_be_dropped_or_truncated_2.t0_dropped; +drop table table_to_be_dropped_or_truncated_2.t1_dropped; +truncate table table_to_be_dropped_or_truncated_2.t0_truncated; +truncate table table_to_be_dropped_or_truncated_2.t1_truncated; +-- 3.1. Drop/Truncate Table Partition +alter table partition_to_be_dropped_or_truncated_2.t1_dropped drop partition p0; +alter table partition_to_be_dropped_or_truncated_2.t1_truncated truncate partition p0; +alter table partition_to_be_dropped_or_truncated_2.t1_truncated reorganize partition p2 INTO (PARTITION p2 VALUES LESS THAN (20), PARTITION p3 VALUES LESS THAN MAXVALUE); +-- 3.2. Remove/Alter Table Partitioning +alter table partition_to_be_removed_or_altered_2.t_removed remove partitioning; +alter table partition_to_be_removed_or_altered_2.t_altered partition by range(id) ( PARTITION p0 VALUES LESS THAN (0), PARTITION p1 VALUES LESS THAN (100), PARTITION p2 VALUES LESS THAN MAXVALUE ); +alter table partition_to_be_removed_or_altered_2.t_altered partition by key(id) partitions 3; +-- 4. Drop Table Index/PrimaryKey +alter table index_or_primarykey_to_be_dropped_2.t0 drop index k1; +alter table index_or_primarykey_to_be_dropped_2.t1 drop index k1; +alter table index_or_primarykey_to_be_dropped_2.t0 drop primary key; +alter table index_or_primarykey_to_be_dropped_2.t1 drop primary key; +create index k1 on index_or_primarykey_to_be_dropped_2.t0 (name); +create index k1 on index_or_primarykey_to_be_dropped_2.t1 (name); +alter table index_or_primarykey_to_be_dropped_2.t0 add primary key (id); +alter table index_or_primarykey_to_be_dropped_2.t1 add primary key (id); +-- 5. Drop Table Indexes +alter table indexes_to_be_dropped_2.t0 drop index k1, drop index k2; +alter table indexes_to_be_dropped_2.t1 drop index k1, drop index k2; +-- 6. Drop Table Column/Columns +alter table column_s_to_be_dropped_2.t0_column drop column name; +alter table column_s_to_be_dropped_2.t1_column drop column name; +alter table column_s_to_be_dropped_2.t0_columns drop column name, drop column c; +alter table column_s_to_be_dropped_2.t1_columns drop column name, drop column c; +-- 7. Modify Table Column +alter table column_to_be_modified_2.t0 modify column name varchar(25); + diff --git a/br/tests/br_pitr/prepare_data/delete_range.sql b/br/tests/br_pitr/prepare_data/delete_range.sql index e2a20be9e45fa..4abb9422c432a 100644 --- a/br/tests/br_pitr/prepare_data/delete_range.sql +++ b/br/tests/br_pitr/prepare_data/delete_range.sql @@ -36,7 +36,7 @@ insert into table_to_be_dropped_or_truncated.t1_dropped values (1, 2, "123"), (2 insert into table_to_be_dropped_or_truncated.t0_truncated values (1, 2, "123"), (2, 3, "123"); insert into table_to_be_dropped_or_truncated.t1_truncated values (1, 2, "123"), (2, 3, "123"); --- 3. Drop/Truncate Table Partition +-- 3.1. Drop/Truncate Table Partition create database partition_to_be_dropped_or_truncated; create table partition_to_be_dropped_or_truncated.t0_dropped(id int primary key, c int, name char(20)); create table partition_to_be_dropped_or_truncated.t1_dropped(id int primary key, c int, name char(20)) PARTITION BY RANGE(id) ( PARTITION p0 VALUES LESS THAN (0), PARTITION p1 VALUES LESS THAN (10), PARTITION p2 VALUES LESS THAN MAXVALUE ); @@ -60,6 +60,24 @@ insert into partition_to_be_dropped_or_truncated.t1_dropped values (1, 2, "123") insert into partition_to_be_dropped_or_truncated.t0_truncated values (1, 2, "123"), (2, 3, "123"); insert into partition_to_be_dropped_or_truncated.t1_truncated values (1, 2, "123"), (2, 3, "123"); + +-- 3.2. Remove/Alter Table Partitioning +create database partition_to_be_removed_or_altered; +create table partition_to_be_removed_or_altered.t_removed(id int primary key, c int, name char(20)) PARTITION BY RANGE(id) ( PARTITION p0 VALUES LESS THAN (0), PARTITION p1 VALUES LESS THAN (10), PARTITION p2 VALUES LESS THAN MAXVALUE ); +create table partition_to_be_removed_or_altered.t_altered(id int primary key, c int, name char(20)) PARTITION BY RANGE(id) ( PARTITION p0 VALUES LESS THAN (0), PARTITION p1 VALUES LESS THAN (10), PARTITION p2 VALUES LESS THAN MAXVALUE ); + +create index k1 on partition_to_be_removed_or_altered.t_removed (name); +create index k2 on partition_to_be_removed_or_altered.t_removed (c); +create index k3 on partition_to_be_removed_or_altered.t_removed (id, c); + +create index k1 on partition_to_be_removed_or_altered.t_altered (name); +create index k2 on partition_to_be_removed_or_altered.t_altered (c); +create index k3 on partition_to_be_removed_or_altered.t_altered (id, c); + +insert into partition_to_be_removed_or_altered.t_removed values (1, 2, "123"), (2, 3, "123"); + +insert into partition_to_be_removed_or_altered.t_altered values (1, 2, "123"), (2, 3, "123"); + -- 4. Drop Table Index/PrimaryKey create database index_or_primarykey_to_be_dropped; create table index_or_primarykey_to_be_dropped.t0(id int primary key nonclustered, c int, name char(20)); diff --git a/br/tests/br_pitr/run.sh b/br/tests/br_pitr/run.sh index 25a7fda5588f2..afe400820eb7e 100644 --- a/br/tests/br_pitr/run.sh +++ b/br/tests/br_pitr/run.sh @@ -31,6 +31,10 @@ echo "prepare the data" run_sql_file $CUR/prepare_data/delete_range.sql # ... +# check something after prepare the data +prepare_delete_range_count=$(run_sql "select count(*) DELETE_RANGE_CNT from (select * from mysql.gc_delete_range union all select * from mysql.gc_delete_range_done) del_range;" | tail -n 1 | awk '{print $2}') +echo "prepare_delete_range_count: $prepare_delete_range_count" + # start the log backup task echo "start log task" run_br --pd $PD_ADDR log start --task-name integration_test -s "local://$TEST_DIR/$PREFIX/log" @@ -44,6 +48,10 @@ echo "load the incremental data" run_sql_file $CUR/incremental_data/delete_range.sql # ... +# check something after load the incremental data +incremental_delete_range_count=$(run_sql "select count(*) DELETE_RANGE_CNT from (select * from mysql.gc_delete_range union all select * from mysql.gc_delete_range_done) del_range;" | tail -n 1 | awk '{print $2}') +echo "incremental_delete_range_count: $incremental_delete_range_count" + # wait checkpoint advance echo "wait checkpoint advance" sleep 10 @@ -93,8 +101,9 @@ run_br --pd $PD_ADDR restore point -s "local://$TEST_DIR/$PREFIX/log" --full-bac # check something in downstream cluster echo "check br log" check_contains "restore log success summary" -# check_not_contains "rewrite delete range" +check_not_contains "rewrite delete range" echo "" > $res_file echo "check sql result" -run_sql "select count(*) DELETE_RANGE_CNT from mysql.gc_delete_range group by ts order by DELETE_RANGE_CNT desc limit 1;" -check_contains "DELETE_RANGE_CNT: 46" +run_sql "select count(*) DELETE_RANGE_CNT from (select * from mysql.gc_delete_range union all select * from mysql.gc_delete_range_done) del_range group by ts order by DELETE_RANGE_CNT desc limit 1;" +expect_delete_range=$(($incremental_delete_range_count-$prepare_delete_range_count)) +check_contains "DELETE_RANGE_CNT: $expect_delete_range" diff --git a/br/tests/br_stats/run.sh b/br/tests/br_stats/run.sh index 6082d4ca1b434..1e867a12f4421 100644 --- a/br/tests/br_stats/run.sh +++ b/br/tests/br_stats/run.sh @@ -46,13 +46,13 @@ done rm -f $LOG run_br --pd $PD_ADDR restore full -s "local://$TEST_DIR/$DB" --log-file $LOG --filter "${DB}1.*" || cat $LOG -load_cnt=$(cat $LOG | grep "restore stat done" | wc -l) -load_db1_cnt=$(cat $LOG | grep "restore stat done" | grep "${DB}1" | wc -l) +load_cnt=$(cat $LOG | grep "restore statistic data done" | wc -l) +load_db1_cnt=$(cat $LOG | grep "restore statistic data done" | grep "${DB}1" | wc -l) load_mark=$((${load_cnt}+10*${load_db1_cnt})) echo "load stats count: ${load_cnt}; db1 count: ${load_db1_cnt}; load mark: ${load_mark}" if [ "${load_mark}" -ne "11" ]; then echo "TEST: [$TEST_NAME] fail on load stats" - echo $(cat $LOG | grep "restore stat done") + echo $(cat $LOG | grep "restore statistic data done") exit 1 fi diff --git a/br/tests/br_systables/run.sh b/br/tests/br_systables/run.sh index c0d74ae369960..3b2485f933d5c 100644 --- a/br/tests/br_systables/run.sh +++ b/br/tests/br_systables/run.sh @@ -79,14 +79,14 @@ check2() { modify_systables run_br backup full -s "local://$backup_dir" rollback_modify -run_br restore full -f '*.*' -f '!mysql.bar' -s "local://$backup_dir" --with-sys-table +run_br restore full -f '*.*' -f '!mysql.bar' -s "local://$backup_dir" check -run_br restore full -f 'mysql.bar' -s "local://$backup_dir" --with-sys-table +run_br restore full -f 'mysql.bar' -s "local://$backup_dir" run_sql "SELECT count(*) from mysql.bar;" | grep 11 rollback_modify -run_br restore full -f "mysql*.*" -f '!mysql.bar' -s "local://$backup_dir" --with-sys-table +run_br restore full -f "mysql*.*" -f '!mysql.bar' -s "local://$backup_dir" check add_user diff --git a/br/tests/config/rootca.conf b/br/tests/config/rootca.conf new file mode 100644 index 0000000000000..b4ca5d22ab5da --- /dev/null +++ b/br/tests/config/rootca.conf @@ -0,0 +1,2 @@ +[ext] +basicConstraints=CA:TRUE,pathlen:0 diff --git a/br/tests/lightning_checkpoint_chunks/file.toml b/br/tests/lightning_checkpoint_chunks/file.toml index 4b2a4083bf9ea..fc919f637bb5b 100644 --- a/br/tests/lightning_checkpoint_chunks/file.toml +++ b/br/tests/lightning_checkpoint_chunks/file.toml @@ -10,3 +10,6 @@ schema = "tidb_lightning_checkpoint_test_cpch" driver = "file" dsn = "/tmp/backup_restore_test/cpch.pb" keep-after-success = true + +[post-restore] +analyze = false diff --git a/br/tests/lightning_checkpoint_chunks/run.sh b/br/tests/lightning_checkpoint_chunks/run.sh index c8346f4d0c5d6..6bba5d308ca17 100755 --- a/br/tests/lightning_checkpoint_chunks/run.sh +++ b/br/tests/lightning_checkpoint_chunks/run.sh @@ -114,3 +114,10 @@ check_contains "count(i): $(($ROW_COUNT*$CHUNK_COUNT))" check_contains "sum(i): $(( $ROW_COUNT*$CHUNK_COUNT*(($CHUNK_COUNT+2)*$ROW_COUNT + 1)/2 ))" [ ! -e "$TEST_DIR/cpch.pb" ] [ -e "$TEST_DIR/cpch.pb.1234567890.bak" ] + +# default auto analyze tick is 3s +sleep 6 +run_sql "SHOW STATS_META WHERE Table_name = 'tbl';" +check_contains "Row_count: 5000" +check_contains "Modify_count: 0" + diff --git a/br/tests/lightning_compress/config.toml b/br/tests/lightning_compress/config.toml index f4452fe7664a6..27185933ec9b5 100644 --- a/br/tests/lightning_compress/config.toml +++ b/br/tests/lightning_compress/config.toml @@ -7,6 +7,9 @@ null = '\N' backslash-escape = true trim-last-separator = false +[conflict] +strategy = 'ignore' + [checkpoint] enable = true schema = "tidb_lightning_checkpoint_test" diff --git a/br/tests/lightning_local_backend/config.toml b/br/tests/lightning_local_backend/config.toml index 73c54882430c7..3b13d5d27751d 100644 --- a/br/tests/lightning_local_backend/config.toml +++ b/br/tests/lightning_local_backend/config.toml @@ -9,6 +9,8 @@ schema = "tidb_lightning_checkpoint_local_backend_test" [tikv-importer] send-kv-pairs = 2 +# if we use "table" level pause, PD will trigger a region split and intefere with our failpoint `failToSplit` +pause-pd-scheduler-scope = "global" [mydumper] batch-size = 50 # force splitting the data into 4 batches diff --git a/br/tests/lightning_pd_leader_switch/run.sh b/br/tests/lightning_pd_leader_switch/run.sh index fc43bad254feb..35aa1c54728cf 100644 --- a/br/tests/lightning_pd_leader_switch/run.sh +++ b/br/tests/lightning_pd_leader_switch/run.sh @@ -15,7 +15,7 @@ # limitations under the License. # -set -eux +set -eu cur=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd ) . $cur/../_utils/run_services @@ -48,7 +48,7 @@ sleep 5 start_tidb export GO_FAILPOINTS='github.com/pingcap/tidb/br/pkg/lightning/importer/beforeRun=sleep(60000)' -run_lightning --backend local --enable-checkpoint=0 & +run_lightning --backend local --enable-checkpoint=0 --pd-urls '127.0.0.1:9999,127.0.0.1:2379' & lightning_pid=$! # in many libraries, etcd client's auto-sync-interval is 30s, so we need to wait at least 30s before kill PD leader sleep 45 diff --git a/br/tests/lightning_write_limit/config.toml b/br/tests/lightning_write_limit/config.toml index e45e694126964..b56a6fce474ee 100644 --- a/br/tests/lightning_write_limit/config.toml +++ b/br/tests/lightning_write_limit/config.toml @@ -1,5 +1,5 @@ [tikv-importer] -store-write-bwlimit = "1Mi" +store-write-bwlimit = "1MiB" [mydumper.csv] header = false diff --git a/br/tests/run_group_br_tests.sh b/br/tests/run_group_br_tests.sh new file mode 100755 index 0000000000000..42dfd4ef8b7bb --- /dev/null +++ b/br/tests/run_group_br_tests.sh @@ -0,0 +1,70 @@ +#!/usr/bin/env bash + +# This script split the integration tests into 9 groups to support parallel group tests execution. +# all the integration tests are located in br/tests directory. only the directories +# containing run.sh will be considered as valid br integration tests. the script will print the total case number + +set -eo pipefail + +# Step 1 +CUR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) +group=$1 +export COV_DIR="/tmp/group_cover" +rm -rf $COV_DIR +mkdir -p $COV_DIR + +# Define groups +# Note: If new group is added, the group name must also be added to CI +# * https://github.com/PingCAP-QE/ci/blob/main/pipelines/pingcap/tidb/latest/pull_br_integration_test.groovy +# Each group of tests consumes as much time as possible, thus reducing CI waiting time. +# Putting multiple light tests together and heavy tests in a separate group. +declare -A groups +groups=( + ["G00"]="br_300_small_tables br_backup_empty br_backup_version br_cache_table br_case_sensitive br_charset_gbk br_check_new_collocation_enable" + ["G01"]="br_autoid br_crypter2 br_db br_db_online br_db_online_newkv br_db_skip br_debug_meta br_ebs br_foreign_key br_full" + ["G02"]="br_full_cluster_restore br_full_ddl br_full_index br_gcs br_history" + ["G03"]='br_incompatible_tidb_config br_incremental br_incremental_ddl br_incremental_index br_pitr' + ["G04"]='br_incremental_only_ddl br_incremental_same_table br_insert_after_restore br_key_locked br_log_test br_move_backup br_mv_index br_other br_partition_add_index' + ["G05"]='br_range br_rawkv br_replica_read br_restore_TDE_enable br_restore_log_task_enable br_s3 br_shuffle_leader br_shuffle_region br_single_table' + ["G06"]='br_skip_checksum br_small_batch_size br_split_region_fail br_systables br_table_filter br_txn br_stats' + ["G07"]='br_clustered_index br_crypter br_table_partition br_tidb_placement_policy br_tiflash br_tikv_outage' + ["G08"]='br_tikv_outage2 br_ttl br_views_and_sequences br_z_gc_safepoint' +) + +# Get other cases not in groups, to avoid missing any case +others=() +for script in "$CUR"/*/run.sh; do + test_name="$(basename "$(dirname "$script")")" + if [[ $test_name != br* ]]; then + continue + fi + # shellcheck disable=SC2076 + if [[ ! " ${groups[*]} " =~ " ${test_name} " ]]; then + others=("${others[@]} ${test_name}") + fi +done + +if [[ "$group" == "others" ]]; then + if [[ -z $others ]]; then + echo "All br integration test cases have been added to groups" + exit 0 + fi + echo "Error: "$others" is not added to any group in br/tests/run_group_br_tests.sh" + exit 1 +elif [[ " ${!groups[*]} " =~ " ${group} " ]]; then + test_names="${groups[${group}]}" + # Run test cases + if [[ -n $test_names ]]; then + echo "" + echo "Run cases: ${test_names}" + for case_name in $test_names; do + echo "Run cases: ${case_name}" + rm -rf /tmp/backup_restore_test + mkdir -p /tmp/backup_restore_test + TEST_NAME=${case_name} ${CUR}/run.sh + done + fi +else + echo "Error: invalid group name: ${group}" + exit 1 +fi diff --git a/br/tests/run_group.sh b/br/tests/run_group_lightning_tests.sh similarity index 63% rename from br/tests/run_group.sh rename to br/tests/run_group_lightning_tests.sh index d04b91eb31d1a..e84cb75a5317e 100755 --- a/br/tests/run_group.sh +++ b/br/tests/run_group_lightning_tests.sh @@ -1,8 +1,8 @@ #!/usr/bin/env bash -# This script split the integration tests into 16 groups to support parallel group tests execution. +# This script split the integration tests into 9 groups to support parallel group tests execution. # all the integration tests are located in br/tests directory. only the directories -# containing run.sh will be considered as integration tests. the script will print the total # # # number +# containing run.sh will be considered as valid lightning integration tests. the script will print the total case number set -eo pipefail @@ -10,40 +10,34 @@ set -eo pipefail CUR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) group=$1 export COV_DIR="/tmp/group_cover" -rm -rf COV_DIR -mkdir $COV_DIR +rm -rf $COV_DIR +mkdir -p $COV_DIR # Define groups # Note: If new group is added, the group name must also be added to CI -# * https://github.com/PingCAP-QE/ci/blob/main/pipelines/pingcap/tidb/latest/pull_br_integration_test.groovy +# * https://github.com/PingCAP-QE/ci/blob/main/pipelines/pingcap/tidb/latest/pull_lightning_integration_test.groovy # Each group of tests consumes as much time as possible, thus reducing CI waiting time. # Putting multiple light tests together and heavy tests in a separate group. declare -A groups groups=( - ["G00"]="br_300_small_tables br_backup_empty br_backup_version br_cache_table br_case_sensitive br_charset_gbk br_check_new_collocation_enable" - ["G01"]="br_autoid br_crypter2 br_db br_db_online br_db_online_newkv br_db_skip br_debug_meta br_ebs br_foreign_key br_full" - ["G02"]="br_full_cluster_restore br_full_ddl br_full_index br_gcs br_history" - ["G03"]='br_incompatible_tidb_config br_incremental br_incremental_ddl br_incremental_index br_pitr' - ["G04"]='br_incremental_only_ddl br_incremental_same_table br_insert_after_restore br_key_locked br_log_test br_move_backup br_mv_index br_other br_partition_add_index' - ["G05"]='br_range br_rawkv br_replica_read br_restore_TDE_enable br_restore_log_task_enable br_s3 br_shuffle_leader br_shuffle_region br_single_table' - ["G06"]='br_skip_checksum br_small_batch_size br_split_region_fail br_systables br_table_filter br_txn br_stats' - ["G07"]='br_clustered_index br_crypter br_table_partition br_tidb_placement_policy br_tiflash br_tikv_outage' - ["G08"]='br_tikv_outage2 br_ttl br_views_and_sequences br_z_gc_safepoint lightning_add_index lightning_alter_random lightning_auto_columns' - ["G09"]='lightning_auto_random_default lightning_bom_file lightning_character_sets lightning_check_partial_imported lightning_checkpoint lightning_checkpoint_chunks lightning_checkpoint_columns lightning_checkpoint_dirty_tableid' - ["G10"]='lightning_checkpoint_engines lightning_checkpoint_engines_order lightning_checkpoint_error_destroy lightning_checkpoint_parquet lightning_checkpoint_timestamp lightning_checksum_mismatch lightning_cmdline_override lightning_column_permutation lightning_common_handle lightning_compress lightning_concurrent-restore' - ["G11"]='lightning_config_max_error lightning_config_skip_csv_header lightning_csv lightning_default-columns lightning_disable_scheduler_by_key_range lightning_disk_quota lightning_distributed_import lightning_drop_other_tables_halfway lightning_duplicate_detection lightning_duplicate_detection_new lightning_duplicate_resolution_incremental lightning_duplicate_resolution_remove lightning_duplicate_resolution_replace_multiple_keys_clustered_pk' - ["G12"]='lightning_duplicate_resolution_replace_multiple_keys_nonclustered_pk lightning_duplicate_resolution_replace_multiple_unique_keys_clustered_pk lightning_duplicate_resolution_replace_multiple_unique_keys_nonclustered_pk lightning_duplicate_resolution_replace_one_key lightning_duplicate_resolution_replace_one_key_multiple_conflicts_clustered_pk lightning_duplicate_resolution_replace_one_key_multiple_conflicts_nonclustered_pk' - ["G13"]='lightning_duplicate_resolution_replace_one_unique_key_clustered_pk lightning_duplicate_resolution_replace_one_unique_key_multiple_conflicts_clustered_pk lightning_duplicate_resolution_replace_one_unique_key_multiple_conflicts_nonclustered_pk lightning_duplicate_resolution_replace_one_unique_key_nonclustered_varchar_pk lightning_error_summary lightning_examples lightning_exotic_filenames lightning_extend_routes' - ["G14"]='lightning_fail_fast lightning_fail_fast_on_nonretry_err lightning_file_routing lightning_foreign_key lightning_gcs lightning_generated_columns lightning_ignore_columns lightning_import_compress lightning_incremental lightning_issue_282 lightning_issue_40657 lightning_issue_410 lightning_issue_519 lightning_local_backend lightning_max_incr' - ["G15"]='lightning_max_random lightning_multi_valued_index lightning_new_collation lightning_no_schema lightning_parquet lightning_partition_incremental lightning_partitioned-table lightning_record_network lightning_reload_cert lightning_restore lightning_routes lightning_routes_panic lightning_row-format-v2 lightning_s3' - ["G16"]='lightning_shard_rowid lightning_source_linkfile lightning_sqlmode lightning_tidb_duplicate_data lightning_tidb_rowid lightning_tiflash lightning_tikv_multi_rocksdb lightning_too_many_columns lightning_tool_135' - ["G17"]='lightning_tool_1420 lightning_tool_1472 lightning_tool_241 lightning_ttl lightning_unused_config_keys lightning_various_types lightning_view lightning_write_batch lightning_write_limit lightning_pd_leader_switch' + ["G00"]='lightning_auto_random_default lightning_bom_file lightning_character_sets lightning_check_partial_imported lightning_checkpoint lightning_checkpoint_chunks lightning_checkpoint_columns lightning_checkpoint_dirty_tableid' + ["G01"]='lightning_checkpoint_engines lightning_checkpoint_engines_order lightning_checkpoint_error_destroy lightning_checkpoint_parquet lightning_checkpoint_timestamp lightning_checksum_mismatch lightning_cmdline_override lightning_column_permutation lightning_common_handle lightning_compress lightning_concurrent-restore' + ["G02"]='lightning_config_max_error lightning_config_skip_csv_header lightning_csv lightning_default-columns lightning_disable_scheduler_by_key_range lightning_disk_quota lightning_distributed_import lightning_drop_other_tables_halfway lightning_duplicate_detection lightning_duplicate_detection_new lightning_duplicate_resolution_incremental lightning_duplicate_resolution_remove lightning_duplicate_resolution_replace_multiple_keys_clustered_pk' + ["G03"]='lightning_duplicate_resolution_replace_multiple_keys_nonclustered_pk lightning_duplicate_resolution_replace_multiple_unique_keys_clustered_pk lightning_duplicate_resolution_replace_multiple_unique_keys_nonclustered_pk lightning_duplicate_resolution_replace_one_key lightning_duplicate_resolution_replace_one_key_multiple_conflicts_clustered_pk lightning_duplicate_resolution_replace_one_key_multiple_conflicts_nonclustered_pk' + ["G04"]='lightning_duplicate_resolution_replace_one_unique_key_clustered_pk lightning_duplicate_resolution_replace_one_unique_key_multiple_conflicts_clustered_pk lightning_duplicate_resolution_replace_one_unique_key_multiple_conflicts_nonclustered_pk lightning_duplicate_resolution_replace_one_unique_key_nonclustered_varchar_pk lightning_error_summary lightning_examples lightning_exotic_filenames lightning_extend_routes' + ["G05"]='lightning_fail_fast lightning_fail_fast_on_nonretry_err lightning_file_routing lightning_foreign_key lightning_gcs lightning_generated_columns lightning_ignore_columns lightning_import_compress lightning_incremental lightning_issue_282 lightning_issue_40657 lightning_issue_410 lightning_issue_519 lightning_local_backend lightning_max_incr' + ["G06"]='lightning_max_random lightning_multi_valued_index lightning_new_collation lightning_no_schema lightning_parquet lightning_partition_incremental lightning_partitioned-table lightning_record_network lightning_reload_cert lightning_restore lightning_routes lightning_routes_panic lightning_row-format-v2 lightning_s3' + ["G07"]='lightning_shard_rowid lightning_source_linkfile lightning_sqlmode lightning_tidb_duplicate_data lightning_tidb_rowid lightning_tiflash lightning_tikv_multi_rocksdb lightning_too_many_columns lightning_tool_135' + ["G08"]='lightning_tool_1420 lightning_tool_1472 lightning_tool_241 lightning_ttl lightning_unused_config_keys lightning_various_types lightning_view lightning_write_batch lightning_write_limit lightning_pd_leader_switch lightning_add_index lightning_alter_random lightning_auto_columns' ) -# Get other cases not in groups, to avoid missing any case +# Get other lightning cases not in groups, to avoid missing any case others=() for script in "$CUR"/*/run.sh; do test_name="$(basename "$(dirname "$script")")" + if [[ $test_name != lightning_* ]]; then + continue + fi # shellcheck disable=SC2076 if [[ ! " ${groups[*]} " =~ " ${test_name} " ]]; then others=("${others[@]} ${test_name}") @@ -52,10 +46,10 @@ done if [[ "$group" == "others" ]]; then if [[ -z $others ]]; then - echo "All br&lightning integration test cases have been added to groups" + echo "All lightning test cases have been added to groups" exit 0 fi - echo "Error: "$others" is not added to any group in br/tests/run_group.sh" + echo "Error: "$others" is not added to any group in br/tests/run_group_lightning_tests.sh" exit 1 elif [[ " ${!groups[*]} " =~ " ${group} " ]]; then test_names="${groups[${group}]}" diff --git a/build/image/base b/build/image/base index 56c9764639c1c..cc39ae6b9efd5 100644 --- a/build/image/base +++ b/build/image/base @@ -17,7 +17,7 @@ FROM hub.pingcap.net/jenkins/centos7_jenkins USER root WORKDIR /root -ENV GOLANG_VERSION 1.21.1 +ENV GOLANG_VERSION 1.21.6 ENV GOLANG_DOWNLOAD_URL https://dl.google.com/go/go$GOLANG_VERSION.linux-amd64.tar.gz ENV GOLANG_DOWNLOAD_SHA256 b3075ae1ce5dab85f89bc7905d1632de23ca196bd8336afd93fa97434cfa55ae ENV GOPATH /go diff --git a/build/linter/bootstrap/analyzer.go b/build/linter/bootstrap/analyzer.go index c12b52caebecb..6f0f63efaeed1 100644 --- a/build/linter/bootstrap/analyzer.go +++ b/build/linter/bootstrap/analyzer.go @@ -89,20 +89,49 @@ func run(pass *analysis.Pass) (interface{}, error) { continue } case v.Tok == token.CONST && len(v.Specs) > 1: - lastSpec := v.Specs[len(v.Specs)-1] - v2, ok := lastSpec.(*ast.ValueSpec) - if !ok { - continue - } - if len(v2.Names) != 1 { - continue - } - name := v2.Names[0].Name - maxVerVariable, err = strconv.Atoi(name[len("version"):]) - if err != nil { - continue + for _, spec := range v.Specs { + v2, ok := spec.(*ast.ValueSpec) + if !ok { + continue + } + if len(v2.Names) != 1 { + continue + } + name := v2.Names[0].Name + if !strings.HasPrefix(name, "version") { + continue + } + + valInName, err := strconv.Atoi(name[len("version"):]) + if err != nil { + continue + } + + if valInName < maxVerVariable { + pass.Reportf(spec.Pos(), "version variable %q is not valid, we should have a increment list of version variables", name) + continue + } + + maxVerVariable = valInName + maxVerVariablePos = v2.Names[0].Pos() + + if len(v2.Values) != 1 { + pass.Reportf(spec.Pos(), "the value of version variable %q must be specified explicitly", name) + continue + } + + valStr := v2.Values[0].(*ast.BasicLit).Value + val, err := strconv.Atoi(valStr) + if err != nil { + pass.Reportf(spec.Pos(), "unexpected value of version variable %q: %q", name, valStr) + continue + } + + if val != valInName { + pass.Reportf(spec.Pos(), "the value of version variable %q must be '%d', but now is '%d'", name, valInName, val) + continue + } } - maxVerVariablePos = v2.Names[0].Pos() } case *ast.FuncDecl: name := v.Name.Name diff --git a/build/linter/util/exclude.go b/build/linter/util/exclude.go index 6990aed28375d..2fd98a8838a40 100644 --- a/build/linter/util/exclude.go +++ b/build/linter/util/exclude.go @@ -29,7 +29,7 @@ func shouldRun(passName string, fileName string) bool { } if config.OnlyFiles != nil { - for _, f := range config.OnlyFiles { + for f := range config.OnlyFiles { matched, err := regexp.MatchString(f, fileName) if err != nil { panic(fmt.Sprintf("regex is wrong: %s", f)) diff --git a/build/linter/util/exclude_test.go b/build/linter/util/exclude_test.go index 69d2ac2076ee4..599dd59590568 100644 --- a/build/linter/util/exclude_test.go +++ b/build/linter/util/exclude_test.go @@ -23,4 +23,5 @@ import ( func TestShouldRun(t *testing.T) { require.True(t, shouldRun("gofmt", "some.go")) require.False(t, shouldRun("gofmt", "uca_generated.go")) + require.True(t, shouldRun("revive", "/pkg/meta/distributed_lock.go")) } diff --git a/build/nogo_config.json b/build/nogo_config.json index ceafdfa6e83ef..b5764e8270c65 100644 --- a/build/nogo_config.json +++ b/build/nogo_config.json @@ -4,6 +4,7 @@ "pkg/parser/parser.go": "parser/parser.go code", "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code", + ".*mock.go$": "ignore generated code", "/rules_go_work-*": "ignore generated code", ".*_/testmain\\.go$": "ignore code", "pkg/extension/enterprise/audit/entry.go": "pkg/extension/enterprise/audit/entry.go", @@ -15,6 +16,7 @@ "pkg/parser/parser.go": "parser/parser.go code", "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code", + ".*mock.go$": "ignore generated code", "br/pkg/lightning/web/res_vfsdata.go": "ignore code" } }, @@ -86,6 +88,7 @@ "pkg/parser/parser.go": "parser/parser.go code", "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code", + ".*mock.go$": "ignore generated code", "br/pkg/glue/console_glue_test.go": "ignore code", "br/pkg/restore/db_test.go": "ignore code", ".*_/testmain\\.go$": "ignore code" @@ -96,6 +99,7 @@ "pkg/parser/parser.go": "parser/parser.go code", "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code", + ".*mock.go$": "ignore generated code", "/cgo/": "ignore cgo code" } }, @@ -139,6 +143,7 @@ "exclude_files": { "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code", + ".*mock.go$": "ignore generated code", ".*_test\\.go$": "ignore generated code", "pkg/util/logutil": "ignore util/logutil code", "tools/": "ignore tools code", @@ -163,6 +168,7 @@ "external/": "no need to vet third party code", ".cgo/": "no need to cgo code", ".*_generated\\.go$": "ignore generated code", + ".*mock.go$": "ignore generated code", ".*_/testmain\\.go$": "ignore code" } }, @@ -171,6 +177,7 @@ "pkg/parser/parser.go": "parser/parser.go code", "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code", + ".*mock.go$": "ignore generated code", ".*_/testmain\\.go$": "ignore code", ".*_test\\.go$": "ignore test code" }, @@ -254,6 +261,7 @@ "pkg/parser/parser.go": "parser/parser.go code", "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code", + ".*mock.go$": "ignore generated code", "/cgo/": "ignore cgo code", "/rules_go_work-*": "ignore generated code", ".*test_/testmain\\.go$": "ignore generated code", @@ -264,6 +272,7 @@ "exclude_files": { "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code", + ".*mock.go$": "ignore generated code", "/cgo/": "ignore cgo code", ".*\\.pb\\.go$": "generated code", "/rules_go_work-*": "ignore generated code", @@ -312,6 +321,7 @@ "pkg/parser/parser.go": "parser/parser.go code", "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code", + ".*mock.go$": "ignore generated code", "/cgo/": "no need to vet cgo code" } }, @@ -342,6 +352,7 @@ "/cgo/": "ignore cgo code", "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code", + ".*mock.go$": "ignore generated code", ".*pb\\.go$": "ignore generated code", "br/pkg/streamhelper/.*_test\\.go$": "ignore test code", "br/pkg/errors/errors.go": "ignore error", @@ -464,6 +475,7 @@ "pkg/parser/parser.go": "parser/parser.go code", "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code", + ".*mock.go$": "ignore generated code", "/cgo/": "ignore cgo" } }, @@ -503,6 +515,7 @@ "dumpling/export/sql_type.go": "please fix it", ".*_test\\.go$": "ignore generated code", ".*_generated\\.go$": "ignore generated code", + ".*mock.go$": "ignore generated code", "pkg/plugin/conn_ip_example/": "plugin/conn_ip_example/" }, "only_files": { @@ -535,7 +548,8 @@ "pkg/resourcemanager/": "resourcemanager code", "pkg/keyspace/": "keyspace code", "pkg/owner/": "owner code", - "pkg/timer/": "timer code" + "pkg/timer/": "timer code", + "pkg/domain": "domain code" } }, "shift": { @@ -592,6 +606,7 @@ "pkg/parser/parser.go": "parser/parser.go code", "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code", + ".*mock.go$": "ignore generated code", "/cgo/": "ignore cgo code", "/rules_go_work-*": "ignore generated code", ".*test_/testmain\\.go$": "ignore generated code", @@ -699,6 +714,7 @@ "pkg/parser/parser.go": "parser/parser.go code", "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code", + ".*mock.go$": "ignore generated code", "pkg/parser/digester.go": "ignore code" } }, @@ -707,6 +723,7 @@ "pkg/parser/parser.go": "parser/parser.go code", "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code", + ".*mock.go$": "ignore generated code", "pkg/parser/digester_test.go": "ignore code" } }, @@ -715,6 +732,7 @@ "pkg/parser/parser.go": "parser/parser.go code", "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code", + ".*mock.go$": "ignore generated code", "pkg/server/tidb_test.go": "ignore test code", "pkg/server/tests/tidb_test.go": "ignore test code", "pkg/server/tests/tidb_serial_test.go": "ignore test code", @@ -866,6 +884,7 @@ "exclude_files": { "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code", + ".*mock.go$": "ignore generated code", "pkg/parser/parser.go": "ignore code" } }, @@ -881,6 +900,7 @@ "pkg/parser/parser.go": "parser/parser.go code", "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code", + ".*mock.go$": "ignore generated code", "tools/check/ut.go": "ignore code" } }, @@ -895,6 +915,7 @@ "exclude_files": { "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code", + ".*mock.go$": "ignore generated code", "pkg/parser/parser.go": "ignore code" } }, @@ -1014,6 +1035,7 @@ "exclude_files": { "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code", + ".*mock.go$": "ignore generated code", "pkg/parser/parser.go": "ignore generated code" } }, @@ -1023,6 +1045,7 @@ "/build/": "no need to linter code", "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code", + ".*mock.go$": "ignore generated code", ".*_test\\.go$": "ignore test code", "br/pkg/restore/split/client.go": "github.com/golang/protobuf deprecated", "br/pkg/streamhelper/advancer_cliext.go": "github.com/golang/protobuf deprecated", @@ -1050,7 +1073,8 @@ "pkg/server/": "server code", "pkg/owner/": "owner code", "pkg/meta": "meta code", - "pkg/timer/": "timer code" + "pkg/timer/": "timer code", + "pkg/statistics/": "statistics code" } }, "SA1029": { @@ -1058,6 +1082,7 @@ "pkg/parser/parser.go": "parser/parser.go code", "/external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code", + ".*mock.go$": "ignore generated code", ".*_test\\.go$": "ignore test code" } }, @@ -1237,6 +1262,7 @@ "cmd/mirror": "cmd/mirror code", "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code", + ".*mock.go$": "ignore generated code", "pkg/parser/yy_parser.go": "ignore generated code", "/cgo/": "no need to vet third party code for cgo" } @@ -1246,6 +1272,7 @@ "external/": "no need to vet third party code", "cmd/mirror": "no need to mirror", ".*_generated\\.go$": "ignore generated code", + ".*mock.go$": "ignore generated code", "pkg/parser/yy_parser.go": "ignore generated code", "pkg/parser/parser.go": "ignore generated code", "/cgo/": "no need to vet third party code for cgo" @@ -1263,6 +1290,7 @@ "pkg/parser/parser.go": "parser/parser.go code", ".*_test.go": "ignore test code", ".*_generated\\.go$": "ignore generated code", + ".*mock.go$": "ignore generated code", "external/": "no need to vet third party code" } }, @@ -1270,6 +1298,7 @@ "exclude_files": { "parser/parser.go": "parser/parser.go code", ".*_generated\\.go$": "ignore generated code", + ".*mock.go$": "ignore generated code", "external/": "no need to vet third party code", "build/linter/constructor/testdata/": "no need to vet the test inside the linter" } @@ -1279,6 +1308,7 @@ "pkg/parser/parser.go": "parser/parser.go code", ".*_test.go": "ignore test code", ".*_generated\\.go$": "ignore generated code", + ".*mock.go$": "ignore generated code", "external/": "no need to vet third party code" } }, @@ -1287,6 +1317,7 @@ "pkg/parser/parser.go": "parser/parser.go code", ".*_test.go": "ignore test code", ".*_generated\\.go$": "ignore generated code", + ".*mock.go$": "ignore generated code", "external/": "no need to vet third party code" } }, @@ -1296,6 +1327,7 @@ ".*_test.go": "ignore test code", "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code", + ".*mock.go$": "ignore generated code", "/cgo/": "no need to vet third party code for cgo" } }, @@ -1305,6 +1337,7 @@ ".*_test.go": "ignore test code", "external/": "no need to vet third party code", ".*_generated\\.go$": "ignore generated code", + ".*mock.go$": "ignore generated code", "/cgo/": "no need to vet third party code for cgo" } }, diff --git a/build/patches/com_github_grpc_ecosystem_grpc_gateway_v2.patch b/build/patches/com_github_grpc_ecosystem_grpc_gateway_v2.patch new file mode 100644 index 0000000000000..35ecc70d9a889 --- /dev/null +++ b/build/patches/com_github_grpc_ecosystem_grpc_gateway_v2.patch @@ -0,0 +1,11 @@ +--- a/runtime/BUILD.bazel 2023-11-24 16:35:19 ++++ b/runtime/BUILD.bazel 2023-11-24 16:36:24 +@@ -26,7 +26,7 @@ + deps = [ + "//internal/httprule", + "//utilities", +- "@go_googleapis//google/api:httpbody_go_proto", ++ "@@org_golang_google_genproto_googleapis_api//httpbody", + "@org_golang_google_grpc//codes", + "@org_golang_google_grpc//grpclog", + "@org_golang_google_grpc//health/grpc_health_v1", diff --git a/ci.md b/ci.md index f7ebabd7a1331..6d68ffdcc378f 100644 --- a/ci.md +++ b/ci.md @@ -2,24 +2,28 @@ ## Guide -ci pipeline will be triggered when your comment on pull request matched command. But we have some task that will be triggered manually. +The CI pipeline will automatically trigger when you submit a PR or push new commits. There are also some CI pipelines that support manual triggering, usually for integration testing, which will give you more confidence in the quality of PR. You can obtain the trigger command for all supported CI pipelines by commenting `/test ?` in a PR. ## Commands -| ci pipeline | Commands | -| ---------------------------------------- |-----------------------------------------------------------------| -| tidb_ghpr_coverage | /run-coverage | -| tidb_ghpr_build_arm64 | /run-build-arm64 comment=true | -| tidb_ghpr_common_test | /run-common-test
/run-integration-tests | -| tidb_ghpr_integration_br_test | /run-integration-br-test
/run-integration-tests | -| tidb_ghpr_integration_campatibility_test | /run-integration-compatibility-test
/run-integration-tests | -| tidb_ghpr_integration_common_test | /run-integration-common-test
/run-integration-tests | -| tidb_ghpr_integration_copr_test | /run-integration-copr-test
/run-integration-tests | -| tidb_ghpr_integration_ddl_test | /run-integration-ddl-test
/run-integration-tests | -| tidb_ghpr_monitor_test | /run-monitor-test | -| tidb_ghpr_mybatis | /run-mybatis-test
/run-integration-tests | -| tidb_ghpr_sqllogic_test_1 | /run-sqllogic-test
/run-integration-tests | -| tidb_ghpr_sqllogic_test_2 | /run-sqllogic-test
/run-integration-tests | -| tidb_ghpr_tics_test | /run-tics-test
/run-integration-tests | -| tidb_ghpr_unit_test | /run-unit-test
/run-all-tests
/merge | +| ci pipeline | Commands | Tests | Auto Trigger | +| ------------------------------- | --------------------------------------- | ------------------------------------------------------------ | ------------ | +| build | `/test build` | Build binaries. | Yes | +| check-dev | `/test check-dev` | Some common check tasks including `lint`, `tidy` etc | Yes | +| check-dev2 | `/test check-dev2` | All realtikv tests in `tests/realtikvtest` | Yes | +| mysql-test | `/test mysql-test` | All mysql tests in PingCAP-QE/tidb-test `mysql_test` | Yes | +| unit-test | `/test unit-test` | All unit tests | Yes | +| pull-integration-ddl-test | `/test pull-integration-ddl-test` | All ddl tests in PingCAP-QE/tidb-test `ddl_test` | Yes | +| pull-mysql-client-test | `/test pull-mysql-client-test` | MySQL client tests in PingCAP-QE/tidb-test | Yes | +| pull-br-integration-test | `/test pull-br-integration-test` | All br integration test in `br/tests` | No | +| pull-lightning-integration-test | `/test pull-lightning-integration-test` | All lightning integration tests in `br/tests` | No | +| pull-common-test | `/test pull-common-test` | Some ORM tests performed through the unistore. | No | +| pull-e2e-test | `/test pull-e2e-test` | E2e tests in `tests/globalkilltest` and `tests/graceshutdown` | No | +| pull-integration-common-test | `/test pull-integration-common-test` | Some ORM tests performed through the tikv | No | +| pull-integration-copr-test | `/test pull-integration-copr-test` | Coprocessor tests in [tikv/copr-test](https://github.com/tikv/copr-test) | No | +| pull-integration-nodejs-test | `/test pull-integration-nodejs-test` | Node.js ORM tests in PingCAP-QE/tidb-test | No | +| pull-integration-jdbc-test | `/test pull-integration-jdbc-test` | All JDBC tests in PingCAP-QE/tidb-test | No | +| pull-integration-mysql-test | `/test pull-integration-mysql-test` | All mysql tests in PingCAP-QE/tidb-test performed through the tikv | No | +| pull-sqllogic-test | `/test pull-sqllogic-test` | SQL logic tests in PingCAP-QE/tidb-test | No | +| pull-tiflash-test | `/test pull-tiflash-test` | TiFlash tests in pingcap/tiflash `tests/docker/` | No | diff --git a/cmd/ddltest/main_test.go b/cmd/ddltest/main_test.go index 55262fcc77b4f..9ca5c3633ca92 100644 --- a/cmd/ddltest/main_test.go +++ b/cmd/ddltest/main_test.go @@ -34,6 +34,7 @@ func TestMain(m *testing.M) { } opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), diff --git a/cmd/mirror/mirror.go b/cmd/mirror/mirror.go index 70c901ce04a6c..07cd182274588 100644 --- a/cmd/mirror/mirror.go +++ b/cmd/mirror/mirror.go @@ -481,6 +481,10 @@ func mirror() error { func main() { flag.Parse() if err := mirror(); err != nil { + var exitErr *exec.ExitError + if errors.As(err, &exitErr) { + panic("subprocess exited with stderr:\n" + string(exitErr.Stderr)) + } panic(err) } } diff --git a/cmd/tidb-server/fips.go b/cmd/tidb-server/fips.go index 5b18f7bee023e..228261f45998f 100644 --- a/cmd/tidb-server/fips.go +++ b/cmd/tidb-server/fips.go @@ -18,9 +18,3 @@ package main import _ "crypto/tls/fipsonly" - -import "github.com/pingcap/tidb/pkg/parser/mysql" - -func init() { - mysql.TiDBReleaseVersion += "-fips" -} diff --git a/cmd/tidb-server/main.go b/cmd/tidb-server/main.go index 81908fd04a825..83af840afc10d 100644 --- a/cmd/tidb-server/main.go +++ b/cmd/tidb-server/main.go @@ -758,7 +758,7 @@ func setGlobalVars() { if cfg.Performance.TxnEntrySizeLimit > config.MaxTxnEntrySizeLimit { log.Fatal("cannot set txn entry size limit larger than 120M") } - kv.TxnEntrySizeLimit = cfg.Performance.TxnEntrySizeLimit + kv.TxnEntrySizeLimit.Store(cfg.Performance.TxnEntrySizeLimit) priority := mysql.Str2Priority(cfg.Instance.ForcePriority) variable.ForcePriority = int32(priority) diff --git a/cmd/tidb-server/main_test.go b/cmd/tidb-server/main_test.go index 15510b3156a4c..dad9e00373a13 100644 --- a/cmd/tidb-server/main_test.go +++ b/cmd/tidb-server/main_test.go @@ -33,6 +33,7 @@ func TestMain(m *testing.M) { testsetup.SetupForCommonTest() opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), diff --git a/docs/design/2023-08-24-background-tasks-control.md b/docs/design/2023-08-24-background-tasks-control.md index b9d8d65cc48d8..2bee2437c8703 100644 --- a/docs/design/2023-08-24-background-tasks-control.md +++ b/docs/design/2023-08-24-background-tasks-control.md @@ -45,7 +45,7 @@ We also introduce a new session variable `tidb_request_source_type` to help tag SET @@tidb_request_source_type = "lightning"; ``` -The `tidb_request_source_type` variable is mostly used in the internal logic, but it's also possible to use this variable to allow other tasks be controlled as background jobs. For example, by setting this varialbe user can let `dumpling` or `TiSpark` tasks be control in the background mode. +The `tidb_request_source_type` variable is mostly used in the internal logic, but it's also possible to use this variable to allow other tasks be controlled as background jobs. For example, by setting this variable user can let `dumpling` or `TiSpark` tasks be control in the background mode. ## Implementation: Resource Limiter on TiKV for Background Task diff --git a/docs/design/2023-09-12-grouping-sets.md b/docs/design/2023-09-12-grouping-sets.md new file mode 100644 index 0000000000000..722c9be934fac --- /dev/null +++ b/docs/design/2023-09-12-grouping-sets.md @@ -0,0 +1,174 @@ +# Proposal: Grouping Sets + +- Author(s): [AilinKid](http://github.com/ailinkid), [windtalker](https://github.com/windtalker), [xzhangxian1008](http://github.com/xzhangxian1008), ... +- Tracking Issue: https://github.com/pingcap/tidb/issues/42631 + +## Introduction + +Grouping Sets is internal implementation mechanism for supporting Multi-Distinct-Aggregate MPP Optimization and Rollup/Cube syntax. Both scenarios need the underlying data to be grouped with different grouping layout, consequently feeding different aggregation function accordingly or feeding all the same aggregation functions continuously , while one replica of source data can rarely do that, that's why grouping sets is introduced and additional data replication is necessary even under our trade-off. + +## Motivation or Background + +**Multi-Distinct-Aggregate MPP Optimization** + +```sql +MySQL [test]> explain select count(distinct a), count(distinct b) from t; ++------------------------------------+----------+--------------+---------------+------------------------------------------------------------------------------------+ +| id | estRows | task | access object | operator info | ++------------------------------------+----------+--------------+---------------+------------------------------------------------------------------------------------+ +| TableReader_32 | 1.00 | root | | MppVersion: 2, data:ExchangeSender_31 | +| └─ExchangeSender_31 | 1.00 | mpp[tiflash] | | ExchangeType: PassThrough | +| └─Projection_27 | 1.00 | mpp[tiflash] | | Column#4, Column#5 | +| └─HashAgg_28 | 1.00 | mpp[tiflash] | | funcs:count(distinct test.t.a)->Column#4, funcs:count(distinct test.t.b)->Column#5 | +| └─ExchangeReceiver_30 | 1.00 | mpp[tiflash] | | | +| └─ExchangeSender_29 | 1.00 | mpp[tiflash] | | ExchangeType: PassThrough, Compression: FAST | +| └─HashAgg_26 | 1.00 | mpp[tiflash] | | group by:test.t.a, test.t.b, | +| └─TableFullScan_14 | 10000.00 | mpp[tiflash] | table:t | keep order:false, stats:pseudo | ++------------------------------------+----------+--------------+---------------+------------------------------------------------------------------------------------+ +8 rows in set (0.000 sec) +``` +As shown above, the source data will be pass through to single node, and all the intensive aggregation computation resides that node (especially on operator `HashAgg_28`). Once the number of rows on it is large, the single point bottleneck will appear to be obvious. + +**Rollup Syntax** +```sql +MySQL [test]> explain SELECT a, b, sum(1) FROM t GROUP BY a, b With Rollup; ++--------------------------------------+----------+--------------+---------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| id | estRows | task | access object | operator info | ++--------------------------------------+----------+--------------+---------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| TableReader_43 | 8000.00 | root | | MppVersion: 2, data:ExchangeSender_42 | +| └─ExchangeSender_42 | 8000.00 | mpp[tiflash] | | ExchangeType: PassThrough | +| └─Projection_7 | 8000.00 | mpp[tiflash] | | Column#4, Column#5, Column#7 | +| └─Projection_37 | 8000.00 | mpp[tiflash] | | Column#7, Column#4, Column#5 | +| └─HashAgg_35 | 8000.00 | mpp[tiflash] | | group by:Column#4, Column#5, gid, funcs:sum(1)->Column#7, funcs:firstrow(Column#4)->Column#4, funcs:firstrow(Column#5)->Column#5, stream_count: 10 | +| └─ExchangeReceiver_21 | 10000.00 | mpp[tiflash] | | stream_count: 10 | +| └─ExchangeSender_20 | 10000.00 | mpp[tiflash] | | ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: Column#4, collate: binary], [name: Column#5, collate: binary], [name: gid, collate: binary], stream_count: 10 | +| └─Expand_19 | 10000.00 | mpp[tiflash] | | level-projection:[->Column#4, ->Column#5, 0->gid],[Column#4, ->Column#5, 1->gid],[Column#4, Column#5, 3->gid]; schema: [Column#4,Column#5,gid] | +| └─TableFullScan_16 | 10000.00 | mpp[tiflash] | table:t | keep order:false, stats:pseudo | ++--------------------------------------+----------+--------------+---------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +9 rows in set (0.018 sec) +``` +Most modern databases with AP functionality always include multi-dimensional aggregate analysis. Rollup/Cute are two common syntax forms of them. MySQL also provides rollup syntax support after version 8.0, along with supporting implementation of the grouping function. Expand operator can supply underlying data replication, data being grouped with different dimensional grouping layout, and consequently outputting different dimensional aggregation results. + +Behind the realization of both phenomena, the essence is the application of grouping sets. We are going to discover and analyze the necessary requirements for data replication from different scenarios, replicate the underlying data via building Expand operator consuming grouping sets collected, and feedback the grouping function and grouping column related expressions in the upper layer by rewriting. + +## Detailed Design + +### Backend Implementation + +**Grouping Sets Brief** + +Grouping Sets is a union set of grouping layout requirements, generally speaking, normal group-by clause without rollup/cute suffix can produce only one grouping set. eg: group-by(a,b), and it's enough that the underlying data should only be grouped by {a,b}. + +For a more advanced syntax, like dimensional group-by --- rollup(a,b), it requires the several grouping layout: {{a,b}, {a},{}}, which means the underlying data should be grouped multi-time according to different group layout, among each of them, output current aggregation result, then regroup the data again. Note: all dimensional aggregated result are dispatched to client as a union. + +Expect for explicit syntax specification of grouping sets like rollup/cube, some implicit cases like: `select count(distinct a), count(distinct b) from t` also requires the underlying data to be grouped by a and b respectively. Rather than feeding all the aggregation function like rollup statement, here different grouped data only feed one specified aggregation function. In this case, two grouping sets {{a}, {b}} is generated, the underlying data replica grouped by a should feed `count(a)`, the other one should feed `count(b)`. You may have noticed that the `distinct` keyword is missing, that's because de-duplication work have been done by group action. + +**Expand Operator Brief** + +Intuitively, Grouping sets should be the direct input accepted by the Expand operator. Expand operator's data expansion logic is based on the analysis of grouping sets, coping each row several times and modifying special columns of each row accordingly. + +Currently, grouping sets analysis work is done by TiDB optimizer and expand operator execution logic can be seen as a leveled-projection composition. The N-th row expansion logic is analyzed and organized as a series of projection expressions, consequently being composed as a leveled-projection as a whole. + +Take the case above as an example, the operation info of expand operator show some details above the level-projection: `level-projection:[->Column#4, ->Column#5, 0->gid],[Column#4, ->Column#5, 1->gid],[Column#4, Column#5, 3->gid]`, each projection out of 3 can be seen as an independent projection respectively. Every original row should be projected 3 times when the data stream being pulled through expand operator. + +**Conclusion** + +In a words, grouping sets are the basic important logic concept through the entire optimization phase. After the physical optimization phase, the data replication logic are analyzed and organized as level-projection, which make the execution logic more general and clean. + +### Frontend Application Access + +**Rollup** + +```sql +MySQL [test]> explain SELECT a, b, grouping(a), sum(a) FROM t GROUP BY a, b With Rollup; ++------------------------------------------+----------+--------------+---------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| id | estRows | task | access object | operator info | ++------------------------------------------+----------+--------------+---------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| TableReader_43 | 8000.00 | root | | MppVersion: 2, data:ExchangeSender_42 | +| └─ExchangeSender_42 | 8000.00 | mpp[tiflash] | | ExchangeType: PassThrough | +| └─Projection_7 | 8000.00 | mpp[tiflash] | | Column#4, Column#5, grouping(gid)->Column#8, Column#7 | +| └─Projection_37 | 8000.00 | mpp[tiflash] | | Column#7, Column#4, Column#5, gid | +| └─HashAgg_35 | 8000.00 | mpp[tiflash] | | group by:Column#26, Column#27, Column#28, funcs:sum(Column#22)->Column#7, funcs:firstrow(Column#23)->Column#4, funcs:firstrow(Column#24)->Column#5, funcs:firstrow(Column#25)->gid, stream_count: 10 | +| └─Projection_44 | 10000.00 | mpp[tiflash] | | cast(test.t.a, decimal(10,0) BINARY)->Column#22, Column#4->Column#23, Column#5->Column#24, gid->Column#25, Column#4->Column#26, Column#5->Column#27, gid->Column#28, stream_count: 10 | +| └─ExchangeReceiver_21 | 10000.00 | mpp[tiflash] | | stream_count: 10 | +| └─ExchangeSender_20 | 10000.00 | mpp[tiflash] | | ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: Column#4, collate: binary], [name: Column#5, collate: binary], [name: gid, collate: binary], stream_count: 10 | +| └─Expand_19 | 10000.00 | mpp[tiflash] | | level-projection:[test.t.a, ->Column#4, ->Column#5, 0->gid],[test.t.a, Column#4, ->Column#5, 1->gid],[test.t.a, Column#4, Column#5, 3->gid]; schema: [test.t.a,Column#4,Column#5,gid] | +| └─Projection_15 | 10000.00 | mpp[tiflash] | | test.t.a, test.t.a->Column#4, test.t.b->Column#5 | +| └─TableFullScan_16 | 10000.00 | mpp[tiflash] | table:t | keep order:false, stats:pseudo | ++------------------------------------------+----------+--------------+---------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +11 rows in set (0.028 sec) +``` +Rollup syntax indicates the data replication is inevitable, so a logical expand operator is built under aggregation in advance, while it's level-projection expression generation is postponed into the last logical optimization rule because we should wait column pruning logic is all set about. + +To keep companies with rollup syntax, grouping-function/grouping-expression-ref analysis work is introduced in upper expression rewriter, because grouping-expression may be filled with null value, it may be no longer the same as what it was after expand operation. That's means name resolution logic of grouping expression above expand operation should be redirected to new generated column which should be respected and distinguished from original expression format. + +For example: +- the normal column-ref `a` in the select list should be name-resolved to grouping expression a', distinguished from base column a from original source table t. +- the column-ref `a` in the sum aggregation function should be name-resolved to original base column a from source table t. +- the column-ref `a` in the grouping function should be name-resolved to grouping expression a', distinguished from base column a from original source table t. + +Except for base column-ref, expression-ref will be more normal in producing environment. like: 'select a+b, grouping(a+b) from t group by a+b, c with rollup', here `a+b` in select list should also be name-resolved to the grouping expression `a+b` rather a scalar plus function with base column a and b as its parameters. Except for select list, having-clause/order-by clause should have this kind of special name resolution handle logic as well. + +```sql +MySQL [test]> SELECT count(1),grouping(a),grouping(b) FROM t GROUP BY a, b With Rollup; ++----------+-------------+-------------+ +| count(1) | grouping(a) | grouping(b) | ++----------+-------------+-------------+ +| 1 | 0 | 0 | +| 1 | 0 | 1 | +| 1 | 1 | 1 | ++----------+-------------+-------------+ +3 rows in set (0.027 sec) +``` + +Grouping function is used to indicate what kind of grouping dimension is, from which your aggregation result is aggregated from in current output line. eg: grouping(a) in the above case, there is only one row (1,1) in the table t, since rollup require the underlying data to be grouped 3 time as {a,b},{a},{}, so the final aggregation results will also be 3 lines. + +Let's go through these 3 lines: + +- for the first line, grouping(a)=0 and grouping(b)=0, that means the aggregation result count(1)=1 is aggregated from grouping layout {a,b} in which a,b is neither grouped. +- for the second line, grouping(a)=0 and grouping(b)=1, that means the aggregation result count(1)=1 is aggregated from grouping layout {a} in which a is not grouped while b does. +- for the third line, grouping(a)=1 and grouping(b)=1, that means the aggregation result count(1)=1 is aggregated from grouping layout {} in which a and b is both grouped. + +With the fine-grained help from grouping function, we can easily identify what the aggregation dimension current output result is from. In internal implementation of grouping function, we should be able to analyze out the relationship between parameter column/expression and grouping expressions, and convert this kind of relationship into computation logic with GID, finally embedding them into grouping function as metadata. + +**Multi Distinct Aggregate** + +```sql +MySQL [test]> explain select count(distinct a), count(distinct b) from t; ++--------------------------------------------+---------+--------------+---------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| id | estRows | task | access object | operator info | ++--------------------------------------------+---------+--------------+---------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| TableReader_35 | 1.00 | root | | MppVersion: 2, data:ExchangeSender_34 | +| └─ExchangeSender_34 | 1.00 | mpp[tiflash] | | ExchangeType: PassThrough | +| └─Projection_25 | 1.00 | mpp[tiflash] | | Column#4, Column#5 | +| └─HashAgg_26 | 1.00 | mpp[tiflash] | | funcs:sum(Column#10)->Column#4, funcs:sum(Column#11)->Column#5 | +| └─ExchangeReceiver_33 | 1.00 | mpp[tiflash] | | | +| └─ExchangeSender_32 | 1.00 | mpp[tiflash] | | ExchangeType: PassThrough, Compression: FAST | +| └─HashAgg_28 | 1.00 | mpp[tiflash] | | funcs:count(distinct test.t.a)->Column#10, funcs:count(distinct test.t.b)->Column#11, stream_count: 10 | +| └─ExchangeReceiver_31 | 2.00 | mpp[tiflash] | | stream_count: 10 | +| └─ExchangeSender_30 | 2.00 | mpp[tiflash] | | ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.a, collate: binary], [name: test.t.b, collate: binary], [name: Column#9, collate: binary], stream_count: 10 | +| └─HashAgg_24 | 2.00 | mpp[tiflash] | | group by:gid(Column#9), test.t.a, test.t.b, | +| └─Expand_27 | 2.00 | mpp[tiflash] | | level-projection:[test.t.a, ->test.t.b],[->test.t.a, test.t.b]; schema: [test.t.a,test.t.b,gid] | +| └─TableFullScan_12 | 1.00 | mpp[tiflash] | table:t | keep order:false, stats:pseudo | ++--------------------------------------------+---------+--------------+---------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +12 rows in set (0.021 sec) +``` +Multi Distinct Aggregation is not strong dependent on grouping sets and expand operator (data replication), we can still fallback to single node execution under MPP mode, or even do it by ourselves in TiDB side to avoid underlying data replication, it's cost based. + +From the explanation result above, we could find that, aggregation has been pull as long as 3 stages. + +- `HashAgg_24` is used to group underlying data with a unified group expressions (a,b), while actually for a specified data replica from level-projection expressions: like [a, null], group-by(a,b) is functioned as group(a), which is exactly what `count(distint a)` wants. +- `HashAgg_28` is used to firstly count(distinct x) partial result after data shuffled by [gid, a, b] +- `HashAgg_26` is used to secondly collect all partial result as final result after distributing intensive computation task out and data are pass through to single node again. + +We noticed that hash-agg has been extended as 3 stages to collect result, while for smaller set of data, distributing intensive computation task out is not that necessary because of shuffle/pass-through network consumption and hash-table mem/latency impact. Naturally and intuitively 2/3 stages should be adaptive in the execution layer, for now we could hardly do that. + +**Conclusion** + +Currently, Rollup and MDA are two basic upper application of grouping sets relatively. Smooth workflow need us first to derive basic grouping sets out from advanced rollup syntax or multi distinct aggregation, then utilizing the backend logic of grouping sets and converting the data replica logic implied by those grouping sets into Expand's level-projection. + +## Unresolved Questions + +- Currently, `Rollup` syntax is only supported under MPP engine, which means tiflash nodes are necessary. +- Currently, MDA optimization is only supported under MPP engine, which means tiflash nodes are necessary. +- Currently, MDA optimization is control by an internal variable `tidb_opt_enable_three_stage_multi_distinct_agg`, the 2/3 stages shift couldn't be self-adaptive in execution layer. diff --git a/docs/tidb_http_api.md b/docs/tidb_http_api.md index f3d77450141c8..98de466f0a491 100644 --- a/docs/tidb_http_api.md +++ b/docs/tidb_http_api.md @@ -251,6 +251,76 @@ } ``` + *Hint: The method to convert the Hex format key returned by TiDB API into the format recognized by [tikv-ctl](https://docs.pingcap.com/tidb/stable/tikv-control).* + + Step 1: Get the hex format of the key you need. For example you could find the key by the following TiDB API. + + ```shell + $curl http://127.0.0.1:10080/mvcc/key/test/t1/1 + { + "key": "7480000000000008C65F728000000000000001", + "region_id": 10, + "value": { + "info": { + "writes": [ + { + "start_ts": 445971968923271174, + "commit_ts": 445971968923271175, + "short_value": "gAACAAAAAgMIAAkAc2hpcmx5YTQi" + }, + { + "start_ts": 445971959499980803, + "commit_ts": 445971959499980804, + "short_value": "gAACAAAAAgMIAAkAc2hpcmx5YTQL" + } + ] + } + } + } + ``` + + Step 2: Convert the key from hex format to escaped format with [tikv-ctl](https://docs.pingcap.com/tidb/stable/tikv-control) + + ```shell + ./tikv-ctl --to-escaped '7480000000000008C65F728000000000000001' + t\200\000\000\000\000\000\010\306_r\200\000\000\000\000\000\000\001 + ``` + + Step 3: Encode the key to make it memcomparable in tikv with [tikv-ctl](https://docs.pingcap.com/tidb/stable/tikv-control) + + ``` + ./tikv-ctl --encode 't\200\000\000\000\000\000\010\306_r\200\000\000\000\000\000\000\001' + 7480000000000008FFC65F728000000000FF0000010000000000FA + ``` + + Step 4: Convert the key from hex format to escaped format again since most `tikv-ctl` commands only accept keys in escaped format while the `--encode` command outputs the key in hex format. + + ``` + ./tikv-ctl --to-escaped '7480000000000008FFC65F728000000000FF0000010000000000FA' + t\200\000\000\000\000\000\010\377\306_r\200\000\000\000\000\377\000\000\001\000\000\000\000\000\372 + ``` + + Step 5: Add a prefix "z" to the key. Then the key can be recognized by [tikv-ctl](https://docs.pingcap.com/tidb/stable/tikv-control). For example, use the following command to scan from tikv. + + ``` + ./tikv-ctl --host ":" scan --from 'zt\200\000\000\000\000\000\010\377\306_r\200\000\000\000\000\377\000\000\001\000\000\000\000\000\372' --limit 5 --show-cf write,lock,default + key: zt\200\000\000\000\000\000\010\377\306_r\200\000\000\000\000\377\000\000\001\000\000\000\000\000\372 + write cf value: start_ts: 445971968923271174 commit_ts: 445971968923271175 short_value: 800002000000020308000900736869726C79613422 + write cf value: start_ts: 445971959499980803 commit_ts: 445971959499980804 short_value: 800002000000020308000900736869726C7961340B + + key: zt\200\000\000\000\000\000\010\377\306_r\200\000\000\000\000\377\000\000\002\000\000\000\000\000\372 + write cf value: start_ts: 445971960836390913 commit_ts: 445971960836390914 short_value: 80000200000002030500060073686972340B + + key: zt\200\000\377\377\377\377\377\377\373_r\200\000\000\000\000\377\000\000\003\000\000\000\000\000\372 + write cf value: r_type: Del start_ts: 444068474890485761 commit_ts: 444068474890485762 + + key: zt\200\000\377\377\377\377\377\377\373_r\200\000\000\000\000\377\000\000\005\000\000\000\000\000\372 + write cf value: r_type: Del start_ts: 444068474929545217 commit_ts: 444068474929545218 + + key: zt\200\000\377\377\377\377\377\377\373_r\200\000\000\000\000\377\000\000\007\000\000\000\000\000\372 + write cf value: r_type: Del start_ts: 444068474981974017 commit_ts: 444068474981974018 + ``` + 1. Get MVCC Information of the first key in the table with a specified start ts ```shell diff --git a/dumpling/export/config.go b/dumpling/export/config.go index 78fb969e32d26..1708a4fe9680e 100644 --- a/dumpling/export/config.go +++ b/dumpling/export/config.go @@ -279,7 +279,7 @@ func (conf *Config) GetDriverConfig(db string) *mysql.Config { /* #nosec G402 */ driverCfg.TLS = &tls.Config{ InsecureSkipVerify: true, - MinVersion: tls.VersionTLS10, + MinVersion: tls.VersionTLS12, NextProtos: []string{"h2", "http/1.1"}, // specify `h2` to let Go use HTTP/2. } } diff --git a/dumpling/export/main_test.go b/dumpling/export/main_test.go index 9e99bb3f9ad95..7504699f4dab1 100644 --- a/dumpling/export/main_test.go +++ b/dumpling/export/main_test.go @@ -49,6 +49,7 @@ func TestMain(m *testing.M) { opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), } diff --git a/dumpling/tests/s3/import.go b/dumpling/tests/s3/import.go index 76b2c75932a68..d5ae518fd5608 100644 --- a/dumpling/tests/s3/import.go +++ b/dumpling/tests/s3/import.go @@ -66,7 +66,7 @@ func main() { return errors.Trace(err) } - query := fmt.Sprintf("insert into %s values('aaaaaaaaaa')", table) // nolint:gosec + query := fmt.Sprintf("insert into %s values('aaaaaaaaaa')", table) for i := 1; i < 10000; i++ { query += ",('aaaaaaaaaa')" } diff --git a/errors.toml b/errors.toml index 65b32c380192c..14f4898c02526 100644 --- a/errors.toml +++ b/errors.toml @@ -16,11 +16,21 @@ error = ''' backup range invalid ''' +["BR:Backup:ErrBackupKeyIsLocked"] +error = ''' +backup key is locked +''' + ["BR:Backup:ErrBackupNoLeader"] error = ''' backup no leader ''' +["BR:Backup:ErrBackupRegion"] +error = ''' +backup region error +''' + ["BR:Common:ErrEnvNotSpecified"] error = ''' environment variable not found @@ -166,6 +176,11 @@ error = ''' PD leader not found ''' +["BR:PD:ErrPDUknownScatterResult"] +error = ''' +failed to wait region splitted +''' + ["BR:PD:ErrPDUpdateFailed"] error = ''' failed to update PD @@ -1511,6 +1526,11 @@ error = ''' Job [%v] has already been paused ''' +["ddl:8263"] +error = ''' +The operation is not allowed while the bdr role of this cluster is set to %s. +''' + ["domain:8027"] error = ''' Information schema is out of date: schema failed to update in 1 lease, please make sure TiDB can connect to TiKV @@ -1813,7 +1833,7 @@ The FORMAT '%s' is not supported ["executor:8158"] error = ''' -The URI of %s is invalid. Reason: %s. Please provide a valid URI, such as 's3://import/test.csv?access_key_id={your_access_key_id ID}&secret_access_key={your_secret_access_key}&session_token={your_session_token}' +The URI of %s is invalid. Reason: %s. Please provide a valid URI, such as 's3://import/test.csv?access-key={your_access_key_id ID}&secret-access-key={your_secret_access_key}&session-token={your_session_token}' ''' ["executor:8159"] diff --git a/go.mod b/go.mod index b5ec3649aa102..be32ca310bcb7 100644 --- a/go.mod +++ b/go.mod @@ -3,9 +3,9 @@ module github.com/pingcap/tidb go 1.21 require ( - cloud.google.com/go/storage v1.30.1 - github.com/Azure/azure-sdk-for-go/sdk/azcore v1.6.0 - github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.1.0 + cloud.google.com/go/storage v1.36.0 + github.com/Azure/azure-sdk-for-go/sdk/azcore v1.8.0 + github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.4.0 github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.0.0 github.com/BurntSushi/toml v1.3.2 github.com/DATA-DOG/go-sqlmock v1.5.0 @@ -15,7 +15,7 @@ require ( github.com/aliyun/alibaba-cloud-sdk-go v1.61.1581 github.com/apache/skywalking-eyes v0.4.0 github.com/ashanbrown/makezero v1.1.1 - github.com/aws/aws-sdk-go v1.44.259 + github.com/aws/aws-sdk-go v1.45.25 github.com/bazelbuild/buildtools v0.0.0-20230926111657-7d855c59baeb github.com/bazelbuild/rules_go v0.42.1-0.20231101215950-df20c987afcb github.com/blacktear23/go-proxyprotocol v1.0.6 @@ -34,13 +34,15 @@ require ( github.com/danjacques/gofslock v0.0.0-20191023191349-0a45f885bc37 github.com/dgraph-io/ristretto v0.1.1 github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 - github.com/docker/go-units v0.4.0 + github.com/docker/go-units v0.5.0 github.com/dolthub/swiss v0.2.1 github.com/emirpasic/gods v1.18.1 github.com/fatanugraha/noloopclosure v0.1.1 github.com/fatih/color v1.15.0 + github.com/felixge/fgprof v0.9.3 github.com/fsouza/fake-gcs-server v1.44.0 github.com/go-ldap/ldap/v3 v3.4.4 + github.com/go-resty/resty/v2 v2.7.0 github.com/go-sql-driver/mysql v1.7.1 github.com/gogo/protobuf v1.3.2 github.com/golang/protobuf v1.5.3 @@ -51,13 +53,14 @@ require ( github.com/golangci/misspell v0.4.1 github.com/golangci/prealloc v0.0.0-20180630174525-215b22d4de21 github.com/google/btree v1.1.2 - github.com/google/pprof v0.0.0-20211122183932-1daafda22083 + github.com/google/pprof v0.0.0-20230926050212-f7f687d19a98 github.com/google/skylark v0.0.0-20181101142754-a5f7082aabed - github.com/google/uuid v1.4.0 + github.com/google/uuid v1.5.0 github.com/gordonklaus/ineffassign v0.0.0-20230610083614-0e73809eb601 github.com/gorilla/mux v1.8.0 github.com/gostaticanalysis/forcetypeassert v0.1.0 github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 + github.com/hashicorp/go-version v1.6.0 github.com/iancoleman/strcase v0.2.0 github.com/jedib0t/go-pretty/v6 v6.2.2 github.com/jellydator/ttlcache/v3 v3.0.1 @@ -67,29 +70,30 @@ require ( github.com/joho/sqltocsv v0.0.0-20210428211105-a6d6801d59df github.com/kisielk/errcheck v1.6.3 github.com/klauspost/compress v1.17.1 - github.com/ks3sdklib/aws-sdk-go v1.2.7 + github.com/ks3sdklib/aws-sdk-go v1.2.9 github.com/kyoh86/exportloopref v0.1.11 - github.com/lestrrat-go/jwx/v2 v2.0.11 + github.com/lestrrat-go/jwx/v2 v2.0.17 github.com/mgechev/revive v1.3.4 github.com/ngaut/pools v0.0.0-20180318154953-b7bc8c42aac7 github.com/ngaut/sync2 v0.0.0-20141008032647-7a24ed77b2ef github.com/nishanths/predeclared v0.2.2 github.com/opentracing/basictracer-go v1.0.0 github.com/opentracing/opentracing-go v1.2.0 + github.com/otiai10/copy v1.2.0 github.com/phayes/freeport v0.0.0-20180830031419-95f893ade6f2 github.com/pingcap/badger v1.5.1-0.20230103063557-828f39b09b6d - github.com/pingcap/errors v0.11.5-0.20221009092201-b66cddb77c32 + github.com/pingcap/errors v0.11.5-0.20231212100244-799fae176cfb github.com/pingcap/failpoint v0.0.0-20220801062533-2eaa32854a6c github.com/pingcap/fn v1.0.0 - github.com/pingcap/kvproto v0.0.0-20231122054644-fb0f5c2a0a10 + github.com/pingcap/kvproto v0.0.0-20240109063850-932639606bcf github.com/pingcap/log v1.1.1-0.20230317032135-a0d097d16e22 github.com/pingcap/sysutil v1.0.1-0.20230407040306-fb007c5aff21 github.com/pingcap/tidb/pkg/parser v0.0.0-20211011031125-9b13dc409c5e github.com/pingcap/tipb v0.0.0-20230919054518-dfd7d194838f - github.com/prometheus/client_golang v1.17.0 + github.com/prometheus/client_golang v1.18.0 github.com/prometheus/client_model v0.5.0 github.com/prometheus/common v0.45.0 - github.com/prometheus/prometheus v0.0.0-20190525122359-d20e84d0fb64 + github.com/prometheus/prometheus v0.48.1 github.com/robfig/cron/v3 v3.0.1 github.com/sasha-s/go-deadlock v0.2.0 github.com/shirou/gopsutil/v3 v3.23.10 @@ -102,8 +106,8 @@ require ( github.com/stretchr/testify v1.8.4 github.com/tdakkota/asciicheck v0.2.0 github.com/tiancaiamao/appdash v0.0.0-20181126055449-889f96f722a2 - github.com/tikv/client-go/v2 v2.0.8-0.20231116051730-1c2351c28173 - github.com/tikv/pd/client v0.0.0-20231121080541-8919bc11f770 + github.com/tikv/client-go/v2 v2.0.8-0.20231227070846-61c486af13a5 + github.com/tikv/pd/client v0.0.0-20240109100024-dd8df25316e9 github.com/timakin/bodyclose v0.0.0-20230421092635-574207250966 github.com/twmb/murmur3 v1.1.6 github.com/uber/jaeger-client-go v2.22.1+incompatible @@ -120,56 +124,62 @@ require ( go.uber.org/atomic v1.11.0 go.uber.org/automaxprocs v1.5.3 go.uber.org/goleak v1.3.0 - go.uber.org/mock v0.3.0 + go.uber.org/mock v0.4.0 go.uber.org/multierr v1.11.0 go.uber.org/zap v1.26.0 golang.org/x/exp v0.0.0-20231006140011-7918f672742d - golang.org/x/net v0.18.0 - golang.org/x/oauth2 v0.14.0 - golang.org/x/sync v0.5.0 - golang.org/x/sys v0.14.0 - golang.org/x/term v0.14.0 + golang.org/x/net v0.20.0 + golang.org/x/oauth2 v0.16.0 + golang.org/x/sync v0.6.0 + golang.org/x/sys v0.16.0 + golang.org/x/term v0.16.0 golang.org/x/text v0.14.0 - golang.org/x/time v0.4.0 - golang.org/x/tools v0.15.0 - google.golang.org/api v0.149.0 - google.golang.org/grpc v1.59.0 + golang.org/x/time v0.5.0 + golang.org/x/tools v0.17.0 + google.golang.org/api v0.156.0 + google.golang.org/grpc v1.60.1 gopkg.in/yaml.v2 v2.4.0 honnef.co/go/tools v0.4.6 - k8s.io/api v0.27.2 + k8s.io/api v0.28.2 sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0 sourcegraph.com/sourcegraph/appdash-data v0.0.0-20151005221446-73f23eafcf67 ) require ( - github.com/cenkalti/backoff/v4 v4.1.1 // indirect + github.com/cenkalti/backoff/v4 v4.2.1 // indirect + github.com/dennwc/varint v1.0.0 // indirect github.com/dolthub/maphash v0.1.0 // indirect + github.com/go-kit/log v0.2.1 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/golang-jwt/jwt/v4 v4.4.2 // indirect + github.com/golang-jwt/jwt/v5 v5.0.0 // indirect github.com/google/s2a-go v0.1.7 // indirect + github.com/grafana/regexp v0.0.0-20221122212121-6b5c0a4cb7fd // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 // indirect github.com/jfcg/sixb v1.3.8 // indirect github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/ryszard/goskiplist v0.0.0-20150312221310-2dfbae5fcf46 // indirect github.com/segmentio/asm v1.2.0 // indirect github.com/shabbyrobe/gocovmerge v0.0.0-20190829150210-3e036491d500 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.0.1 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.0.1 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.46.1 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.19.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.19.0 // indirect go.opentelemetry.io/otel/metric v1.21.0 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20231030173426-d783a09b4405 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20231120223509-83a465c0220f // indirect - k8s.io/utils v0.0.0-20230209194617-a36077c30491 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20240108191215-35c7eff3a6b1 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240108191215-35c7eff3a6b1 // indirect + k8s.io/utils v0.0.0-20230711102312-30195339c3c7 // indirect ) require ( - cloud.google.com/go v0.110.10 // indirect + cloud.google.com/go v0.112.0 // indirect cloud.google.com/go/compute v1.23.3 // indirect cloud.google.com/go/compute/metadata v0.2.3 // indirect cloud.google.com/go/iam v1.1.5 // indirect cloud.google.com/go/pubsub v1.33.0 // indirect github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0 // indirect github.com/Azure/go-ntlmssp v0.0.0-20221128193559-754e69321358 // indirect - github.com/AzureAD/microsoft-authentication-library-for-go v0.5.1 // indirect + github.com/AzureAD/microsoft-authentication-library-for-go v1.1.1 // indirect github.com/DataDog/zstd v1.4.5 // indirect github.com/HdrHistogram/hdrhistogram-go v1.1.2 // indirect github.com/Masterminds/goutils v1.1.1 // indirect @@ -177,11 +187,9 @@ require ( github.com/Masterminds/sprig/v3 v3.2.2 // indirect github.com/VividCortex/ewma v1.2.0 // indirect github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d // indirect - github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137 // indirect github.com/apache/thrift v0.13.1-0.20201008052519-daf620915714 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/bmatcuk/doublestar/v2 v2.0.4 // indirect - github.com/cespare/xxhash v1.1.0 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/chavacava/garif v0.1.0 // indirect github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f // indirect @@ -190,30 +198,28 @@ require ( github.com/coocood/bbloom v0.0.0-20190830030839-58deb6228d64 // indirect github.com/coocood/rtutil v0.0.0-20190304133409-c84515f646f2 // indirect github.com/coreos/go-systemd/v22 v22.5.0 // indirect - github.com/davecgh/go-spew v1.1.1 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 // indirect github.com/dustin/go-humanize v1.0.0 // indirect github.com/eapache/go-resiliency v1.2.0 // indirect github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21 // indirect github.com/eapache/queue v1.1.0 // indirect github.com/fatih/structtag v1.2.0 - github.com/felixge/httpsnoop v1.0.2 // indirect + github.com/felixge/httpsnoop v1.0.4 // indirect github.com/go-asn1-ber/asn1-ber v1.5.4 // indirect - github.com/go-kit/kit v0.9.0 // indirect - github.com/go-logfmt/logfmt v0.5.1 // indirect - github.com/go-logr/logr v1.3.0 // indirect + github.com/go-logfmt/logfmt v0.6.0 // indirect + github.com/go-logr/logr v1.4.1 // indirect github.com/go-ole/go-ole v1.3.0 // indirect github.com/goccy/go-json v0.10.2 // indirect - github.com/golang-jwt/jwt v3.2.1+incompatible // indirect github.com/golang/glog v1.1.2 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect - github.com/google/gofuzz v1.1.0 // indirect + github.com/google/gofuzz v1.2.0 // indirect github.com/google/licensecheck v0.3.1 // indirect github.com/google/renameio/v2 v2.0.0 // indirect github.com/googleapis/enterprise-certificate-proxy v0.3.2 // indirect github.com/googleapis/gax-go/v2 v2.12.0 // indirect github.com/gorilla/handlers v1.5.1 // indirect - github.com/gorilla/websocket v1.4.2 // indirect + github.com/gorilla/websocket v1.5.0 // indirect github.com/gostaticanalysis/analysisutil v0.7.1 // indirect github.com/gostaticanalysis/comment v1.4.2 // indirect github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 // indirect @@ -221,7 +227,7 @@ require ( github.com/hashicorp/go-uuid v1.0.2 // indirect github.com/hexops/gotextdiff v1.0.3 // indirect github.com/huandu/xstrings v1.3.1 // indirect - github.com/imdario/mergo v0.3.11 // indirect + github.com/imdario/mergo v0.3.16 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/influxdata/tdigest v0.0.1 github.com/jcmturner/aescts/v2 v2.0.0 // indirect @@ -236,14 +242,14 @@ require ( github.com/kr/pretty v0.3.1 // indirect github.com/kr/text v0.2.0 // indirect github.com/kylelemons/godebug v1.1.0 // indirect - github.com/lestrrat-go/blackmagic v1.0.1 // indirect + github.com/lestrrat-go/blackmagic v1.0.2 // indirect github.com/lestrrat-go/httpcc v1.0.1 // indirect github.com/lestrrat-go/httprc v1.0.4 // indirect github.com/lestrrat-go/iter v1.0.2 // indirect github.com/lestrrat-go/option v1.0.1 // indirect github.com/lufia/plan9stats v0.0.0-20230326075908-cb1d2100619a // indirect github.com/mattn/go-colorable v0.1.13 // indirect - github.com/mattn/go-isatty v0.0.18 // indirect + github.com/mattn/go-isatty v0.0.19 // indirect github.com/mattn/go-runewidth v0.0.14 // indirect github.com/mitchellh/copystructure v1.0.0 // indirect github.com/mitchellh/reflectwalk v1.0.1 // indirect @@ -251,27 +257,24 @@ require ( github.com/modern-go/reflect2 v1.0.2 // indirect github.com/nbutton23/zxcvbn-go v0.0.0-20210217022336-fa2cb2858354 // indirect github.com/ncw/directio v1.0.5 // indirect - github.com/oklog/ulid v1.3.1 // indirect github.com/olekukonko/tablewriter v0.0.5 // indirect github.com/petermattis/goid v0.0.0-20211229010228-4d14c490ee36 // indirect github.com/pierrec/lz4 v2.6.1+incompatible // indirect github.com/pingcap/goleveldb v0.0.0-20191226122134-f82aafb29989 // indirect - github.com/pkg/browser v0.0.0-20210115035449-ce105d075bb4 // indirect + github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 // indirect github.com/pkg/xattr v0.4.9 // indirect - github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/power-devops/perfstat v0.0.0-20221212215047-62379fc7944b // indirect github.com/prometheus/procfs v0.12.0 // indirect - github.com/prometheus/tsdb v0.10.0 // indirect github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect github.com/rivo/uniseg v0.4.4 // indirect github.com/rogpeppe/go-internal v1.11.0 // indirect github.com/shoenig/go-m1cpu v0.1.6 // indirect github.com/shopspring/decimal v1.2.0 // indirect - github.com/shurcooL/httpfs v0.0.0-20190707220628-8d4bc4ba7749 // indirect + github.com/shurcooL/httpfs v0.0.0-20230704072500-f1e31cf0ba5c // indirect github.com/shurcooL/vfsgen v0.0.0-20181202132449-6a9ea43bcacd // indirect github.com/sirupsen/logrus v1.9.3 // indirect - github.com/spaolacci/murmur3 v1.1.0 // indirect github.com/spf13/cast v1.5.0 // indirect github.com/stretchr/objx v0.5.0 // indirect github.com/tiancaiamao/gp v0.0.0-20221230034425-4025bc8a4d4a @@ -289,22 +292,22 @@ require ( go.opentelemetry.io/otel v1.21.0 // indirect go.opentelemetry.io/otel/sdk v1.21.0 // indirect go.opentelemetry.io/otel/trace v1.21.0 // indirect - go.opentelemetry.io/proto/otlp v0.9.0 // indirect - golang.org/x/crypto v0.15.0 // indirect + go.opentelemetry.io/proto/otlp v1.0.0 // indirect + golang.org/x/crypto v0.18.0 // indirect golang.org/x/exp/typeparams v0.0.0-20230307190834-24139beb5833 // indirect golang.org/x/mod v0.14.0 // indirect - golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect + golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect gonum.org/v1/gonum v0.8.2 // indirect - google.golang.org/appengine v1.6.7 // indirect - google.golang.org/genproto v0.0.0-20231106174013-bbf56f31fb17 // indirect - google.golang.org/protobuf v1.31.0 // indirect + google.golang.org/appengine v1.6.8 // indirect + google.golang.org/genproto v0.0.0-20240108191215-35c7eff3a6b1 // indirect + google.golang.org/protobuf v1.32.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - k8s.io/apimachinery v0.27.2 // indirect - k8s.io/klog/v2 v2.90.1 // indirect + k8s.io/apimachinery v0.28.2 // indirect + k8s.io/klog/v2 v2.100.1 // indirect sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect - sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect + sigs.k8s.io/structured-merge-diff/v4 v4.3.0 // indirect sigs.k8s.io/yaml v1.3.0 // indirect stathat.com/c/consistent v1.0.0 // indirect ) @@ -314,4 +317,9 @@ replace ( github.com/dgrijalva/jwt-go => github.com/form3tech-oss/jwt-go v3.2.6-0.20210809144907-32ab6a8243d7+incompatible github.com/go-ldap/ldap/v3 => github.com/YangKeao/ldap/v3 v3.4.5-0.20230421065457-369a3bab1117 github.com/pingcap/tidb/pkg/parser => ./pkg/parser + + // TODO: `sourcegraph.com/sourcegraph/appdash` has been archived, and the original host has been removed. + // Please remove these dependencies. + sourcegraph.com/sourcegraph/appdash => github.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0 + sourcegraph.com/sourcegraph/appdash-data => github.com/sourcegraph/appdash-data v0.0.0-20151005221446-73f23eafcf67 ) diff --git a/go.sum b/go.sum index c34867ec842bd..0e92e8a1622b9 100644 --- a/go.sum +++ b/go.sum @@ -13,8 +13,8 @@ cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKV cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go v0.110.10 h1:LXy9GEO+timppncPIAZoOj3l58LIU9k+kn48AN7IO3Y= -cloud.google.com/go v0.110.10/go.mod h1:v1OoFqYxiBkUrruItNM3eT4lLByNjxmJSV/xDKJNnic= +cloud.google.com/go v0.112.0 h1:tpFCD7hpHFlQ8yPwT3x+QeXqc2T6+n6T+hmABHfDUSM= +cloud.google.com/go v0.112.0/go.mod h1:3jEEVwZ/MHU4djK5t5RHuKOA/GbLddgTdVubX1qnPD4= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= @@ -42,25 +42,22 @@ cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0Zeo cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -cloud.google.com/go/storage v1.30.1 h1:uOdMxAs8HExqBlnLtnQyP0YkvbiDpdGShGKtx6U/oNM= -cloud.google.com/go/storage v1.30.1/go.mod h1:NfxhC0UJE1aXSx7CIIbCf7y9HKT7BiccwkR7+P7gN8E= -contrib.go.opencensus.io/exporter/ocagent v0.4.12/go.mod h1:450APlNTSR6FrvC3CTRqYosuDstRB9un7SOx2k/9ckA= +cloud.google.com/go/storage v1.36.0 h1:P0mOkAcaJxhCTvAkMhxMfrTKiNcub4YmmPBtlhAyTr8= +cloud.google.com/go/storage v1.36.0/go.mod h1:M6M/3V/D3KpzMTJyPOR/HU6n2Si5QdaXYEsng2xgOs8= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= -github.com/Azure/azure-sdk-for-go v23.2.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.6.0 h1:8kDqDngH+DmVBiCtIjCFTGa7MBnsIOkF9IccInFEbjk= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.6.0/go.mod h1:bjGvMhVMb+EEm3VRNQawDMUyMMjo+S5ewNjflkep/0Q= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.1.0 h1:QkAcEIAKbNL4KoFr4SathZPhDhF4mVwpBMFlYjyAqy8= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.1.0/go.mod h1:bhXu1AjYL+wutSL/kpSq6s7733q2Rb0yuot9Zgfqa/0= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.8.0 h1:9kDVnTz3vbfweTqAUmk/a/pH5pWFCHtvRpHYC0G/dcA= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.8.0/go.mod h1:3Ug6Qzto9anB6mGlEdgYMDF5zHQ+wwhEaYR4s17PHMw= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.4.0 h1:BMAjVKJM0U/CYF27gA0ZMmXGkOcvfFtD0oHVZ1TIPRI= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.4.0/go.mod h1:1fXstnBMas5kzG+S3q8UoJcmyU6nUeunJcMDHcRYHhs= github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0 h1:sXr+ck84g/ZlZUOZiNELInmMgOsuGwdjjVkEIde0OtY= github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0/go.mod h1:okt5dMMTOFjX/aovMlrjvvXoPMBVSPzk9185BT0+eZM= github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.0.0 h1:u/LLAOFgsMv7HmNL4Qufg58y+qElGOt5qv0z1mURkRY= github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.0.0/go.mod h1:2e8rMJtl2+2j+HXbTBwnyGpm5Nou7KhvSfxOq8JpTag= -github.com/Azure/go-autorest v11.2.8+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= github.com/Azure/go-ntlmssp v0.0.0-20221128193559-754e69321358 h1:mFRzDkZVAjdal+s7s0MwaRv9igoPqLRdzOLzw/8Xvq8= github.com/Azure/go-ntlmssp v0.0.0-20221128193559-754e69321358/go.mod h1:chxPXzSsl7ZWRAuOIE23GDNzjWuZquvFlgA8xmpunjU= -github.com/AzureAD/microsoft-authentication-library-for-go v0.5.1 h1:BWe8a+f/t+7KY7zH2mqygeUD0t8hNFXe08p1Pb3/jKE= -github.com/AzureAD/microsoft-authentication-library-for-go v0.5.1/go.mod h1:Vt9sXTKwMyGcOxSmLDMnGPgqsUg7m8pe215qMLrDXw4= +github.com/AzureAD/microsoft-authentication-library-for-go v1.1.1 h1:WpB/QDNLpMw72xHJc34BNNykqSOeEJDAWkhf0u12/Jk= +github.com/AzureAD/microsoft-authentication-library-for-go v1.1.1/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8= github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= @@ -85,16 +82,11 @@ github.com/Masterminds/semver/v3 v3.1.1 h1:hLg3sBzpNErnxhQtUy/mmLR2I9foDujNK030I github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= github.com/Masterminds/sprig/v3 v3.2.2 h1:17jRggJu518dr3QaafizSXOjKYp94wKfABxUmyxvxX8= github.com/Masterminds/sprig/v3 v3.2.2/go.mod h1:UoaO7Yp8KlPnJIYWTFkMaqPUYKTfGFPhxNuwnnxkKlk= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/OneOfOne/xxhash v1.2.5 h1:zl/OfRA6nftbBK9qTohYBJ5xvw6C/oNKizR7cZGl3cI= -github.com/OneOfOne/xxhash v1.2.5/go.mod h1:eZbhyaAYD41SGSSsnmcpxVoRiQ/MPUTjUdIIOT9Um7Q= github.com/Shopify/goreferrer v0.0.0-20181106222321-ec9c9a553398/go.mod h1:a1uqRtAwp2Xwc6WNPJEufxJ7fx3npB4UV/JOLmbu5I0= -github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= github.com/Shopify/sarama v1.29.0 h1:ARid8o8oieau9XrHI55f/L3EoRAhm9px6sonbD7yuUE= github.com/Shopify/sarama v1.29.0/go.mod h1:2QpgD79wpdAESqNQMxNc0KYMkycd4slxGdV3TWSVqrU= github.com/Shopify/toxiproxy v2.1.4+incompatible h1:TKdv8HiTLgE5wdJuEML90aBgNWsokNbMijUGhmcoBJc= github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= -github.com/StackExchange/wmi v0.0.0-20180725035823-b12b22c5341f/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= github.com/VividCortex/ewma v1.1.1/go.mod h1:2Tkkvm3sRDVXaiyucHiACn4cqf7DpdyLvmxzcbUokwA= github.com/VividCortex/ewma v1.2.0 h1:f58SaIzcDXrSy3kWaHNvuJgJ3Nmz59Zji6XoJR/q1ow= github.com/VividCortex/ewma v1.2.0/go.mod h1:nz4BbCtbLyFDeC9SUHbtcT5644juEuWfUAUnGx7j5l4= @@ -104,8 +96,6 @@ github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d h1:licZJFw2RwpH github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d/go.mod h1:asat636LX7Bqt5lYEZ27JNDcqxfjdBQuJ/MM4CN/Lzo= github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY= github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= -github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137 h1:s6gZFSlWYmbqAuRjVTiNNhvNRfY2Wxp9nhfyel4rklc= github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE= github.com/alexbrainman/sspi v0.0.0-20210105120005-909beea2cc74 h1:Kk6a4nehpJ3UuJRqlA3JxYxBZEqCeOmATOvrbT4p9RA= @@ -116,21 +106,16 @@ github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kd github.com/apache/skywalking-eyes v0.4.0 h1:O13kdRU6FCEZevfD01mdhTgCZLLfPZIQ0GXZrLl7FpQ= github.com/apache/skywalking-eyes v0.4.0/go.mod h1:WblDbBgOLsLN0FJEBa9xj6PhuUA/J6spKYVTG4/F8Ls= github.com/apache/thrift v0.0.0-20181112125854-24918abba929/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= -github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/apache/thrift v0.13.1-0.20201008052519-daf620915714 h1:Jz3KVLYY5+JO7rDiX0sAuRGtuv2vG01r17Y9nLMWNUw= github.com/apache/thrift v0.13.1-0.20201008052519-daf620915714/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= -github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= -github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= -github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/ashanbrown/makezero v1.1.1 h1:iCQ87C0V0vSyO+M9E/FZYbu65auqH0lnsOkf5FcB28s= github.com/ashanbrown/makezero v1.1.1/go.mod h1:i1bJLCRSCHOcOa9Y6MyF2FTfMZMFdHvxKHxgO5Z1axI= -github.com/aws/aws-sdk-go v1.15.24/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= github.com/aws/aws-sdk-go v1.30.19/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0= github.com/aws/aws-sdk-go v1.44.204/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= github.com/aws/aws-sdk-go v1.44.256/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= -github.com/aws/aws-sdk-go v1.44.259 h1:7yDn1dcv4DZFMKpu+2exIH5O6ipNj9qXrKfdMUaIJwY= -github.com/aws/aws-sdk-go v1.44.259/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= +github.com/aws/aws-sdk-go v1.45.25 h1:c4fLlh5sLdK2DCRTY1z0hyuJZU4ygxX8m1FswL6/nF4= +github.com/aws/aws-sdk-go v1.45.25/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g= github.com/bazelbuild/buildtools v0.0.0-20230926111657-7d855c59baeb h1:4k69c5E7Sa7jmNtv9itBHYA4Z5pfurInuRrtgohxZeA= github.com/bazelbuild/buildtools v0.0.0-20230926111657-7d855c59baeb/go.mod h1:689QdV3hBP7Vo9dJMmzhoYIyo/9iMhEmHkJcnaPRCbo= @@ -138,28 +123,21 @@ github.com/bazelbuild/rules_go v0.42.1-0.20231101215950-df20c987afcb h1:CPn7VHaV github.com/bazelbuild/rules_go v0.42.1-0.20231101215950-df20c987afcb/go.mod h1:TFLfii8e49kTgn329knh1lsJFKdxyp/hKlWObY66xwY= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/benbjohnson/clock v1.3.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= -github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/biogo/store v0.0.0-20160505134755-913427a1d5e8/go.mod h1:Iev9Q3MErcn+w3UOJD/DkEzllvugfdx7bGcMOFhvr/4= github.com/blacktear23/go-proxyprotocol v1.0.6 h1:eTt6UMpEnq59NjON49b3Cay8Dm0sCs1nDliwgkyEsRM= github.com/blacktear23/go-proxyprotocol v1.0.6/go.mod h1:FSCbgnRZrQXazBLL5snfBbrcFSMtcmUDhSRb9OfFA1o= github.com/bmatcuk/doublestar/v2 v2.0.4 h1:6I6oUiT/sU27eE2OFcWqBhL1SwjyvQuOssxT4a1yidI= github.com/bmatcuk/doublestar/v2 v2.0.4/go.mod h1:QMmcs3H2AUQICWhfzLXz+IYln8lRQmTZRptLie8RgRw= github.com/butuzov/mirror v1.1.0 h1:ZqX54gBVMXu78QLoiqdwpl2mgmoOJTk7s4p4o+0avZI= github.com/butuzov/mirror v1.1.0/go.mod h1:8Q0BdQU6rC6WILDiBM60DBfvV78OLJmMmixe7GF45AE= +github.com/cakturk/go-netstat v0.0.0-20200220111822-e5b49efee7a5 h1:BjkPE3785EwPhhyuFkbINB+2a1xATwk8SNDWnJiD41g= +github.com/cakturk/go-netstat v0.0.0-20200220111822-e5b49efee7a5/go.mod h1:jtAfVaU/2cu1+wdSRPWE2c1N2qeAA3K4RH9pYgqwets= github.com/carlmjohnson/flagext v0.21.0 h1:/c4uK3ie786Z7caXLcIMvePNSSiH3bQVGDvmGLMme60= github.com/carlmjohnson/flagext v0.21.0/go.mod h1:Eenv0epIUAr4NuedNmkzI8WmBmjIxZC239XcKxYS2ac= -github.com/cenk/backoff v2.0.0+incompatible/go.mod h1:7FtoeaSnHoZnmZzz47cM35Y9nSW7tNyaidugnHTaFDE= -github.com/cenkalti/backoff/v4 v4.1.1 h1:G2HAfAmvm/GcKan2oOQpBXOd2tT2G57ZnZGWa1PxPBQ= -github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= -github.com/census-instrumentation/opencensus-proto v0.2.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM= +github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/certifi/gocertifi v0.0.0-20180905225744-ee1a9a0726d2/go.mod h1:GJKEexRPVJrBSOjoqN5VNOIKJ5Q3RViH6eu3puDRwx4= -github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= @@ -179,14 +157,8 @@ github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDk github.com/cloudfoundry/gosigar v1.3.6 h1:gIc08FbB3QPb+nAQhINIK/qhf5REKkY0FTGgRGXkcVc= github.com/cloudfoundry/gosigar v1.3.6/go.mod h1:lNWstu5g5gw59O09Y+wsMNFzBSnU8a0u+Sfx4dq360E= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4 h1:/inchEIKaYC1Akx+H+gqO04wryn5h75LSazbRlnya1k= github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= -github.com/cockroachdb/cmux v0.0.0-20170110192607-30d10be49292/go.mod h1:qRiX68mZX1lGBkTWyp3CLcenw9I94W2dLeRvMzcn9N4= -github.com/cockroachdb/cockroach v0.0.0-20170608034007-84bc9597164f/go.mod h1:xeT/CQ0qZHangbYbWShlCGAx31aV4AjGswDUjhKS6HQ= -github.com/cockroachdb/cockroach-go v0.0.0-20181001143604-e0a95dfd547c/go.mod h1:XGLbWH/ujMcbPbhZq52Nv6UrCghb1yGn//133kEsvDk= github.com/cockroachdb/datadriven v1.0.0/go.mod h1:5Ib8Meh+jk1RlHIXej6Pzevx/NLlNvQB9pmSBZErGA4= github.com/cockroachdb/datadriven v1.0.2 h1:H9MtNqVoVhvd9nCBwOyDjUEdZCREqbIdCJD93PBm/jA= github.com/cockroachdb/datadriven v1.0.2/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= @@ -211,7 +183,6 @@ github.com/coocood/freecache v1.2.1/go.mod h1:RBUWa/Cy+OHdfTGFEhEuE1pMCMX51Ncizj github.com/coocood/rtutil v0.0.0-20190304133409-c84515f646f2 h1:NnLfQ77q0G4k2Of2c1ceQ0ec6MkLQyDp+IGdVM0D8XM= github.com/coocood/rtutil v0.0.0-20190304133409-c84515f646f2/go.mod h1:7qG7YFnOALvsx6tKTNmQot8d7cGFXM9TidzvRFLWYwM= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/etcd v3.3.12+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-semver v0.3.1 h1:yi21YpKnrx1gt5R+la8n5WgS0kCrsPp33dmEyHReZr4= @@ -229,11 +200,14 @@ github.com/daixiang0/gci v0.11.2/go.mod h1:xtHP9N7AHdNvtRNfcx9gwTDfw7FRJx4bZUsiE github.com/danjacques/gofslock v0.0.0-20191023191349-0a45f885bc37 h1:X6mKGhCFOxrKeeHAjv/3UvT6e5RRxW6wRdlqlV6/H4w= github.com/danjacques/gofslock v0.0.0-20191023191349-0a45f885bc37/go.mod h1:DC3JtzuG7kxMvJ6dZmf2ymjNyoXwgtklr7FN+Um2B0U= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/decred/dcrd/crypto/blake256 v1.0.1/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 h1:8UrgZ3GkP4i/CLijOJx79Yu+etlyjdBU4sfcs2WYQMs= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= +github.com/dennwc/varint v1.0.0 h1:kGNFFSSw8ToIy3obO/kKr8U9GZYUAxQEVuix4zfDWzE= +github.com/dennwc/varint v1.0.0/go.mod h1:hnItb35rvZvJrbTALZtY/iQfDs48JKRG1RPpgziApxA= github.com/dgraph-io/badger v1.6.0/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4= github.com/dgraph-io/ristretto v0.1.1 h1:6CWw5tJNgpegArSHpNHJKldNeq03FQCwYvfMVWajOK8= github.com/dgraph-io/ristretto v0.1.1/go.mod h1:S1GPSBCYCIhmVNfcth17y2zZtQT6wzkzgwUve0VDWWA= @@ -241,18 +215,16 @@ github.com/dgryski/go-farm v0.0.0-20190104051053-3adb47b1fb0f/go.mod h1:SqUrOPUn github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 h1:fAjc9m62+UWV/WAFKLNi6ZS0675eEUC9y3AlwSbQu1Y= github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= -github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= -github.com/dnaeon/go-vcr v1.1.0 h1:ReYa/UBrRyQdant9B4fNHGoCNKw6qh6P0fsdGmZpR7c= -github.com/dnaeon/go-vcr v1.1.0/go.mod h1:M7tiix8f0r6mKKJ3Yq/kqU1OYf3MnfmBWVbPx/yU9ko= -github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw= -github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/dnaeon/go-vcr v1.2.0 h1:zHCHvJYTMh1N7xnV7zf1m1GPBF9Ad0Jk/whtQ1663qI= +github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= +github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= +github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/dolthub/maphash v0.1.0 h1:bsQ7JsF4FkkWyrP3oCnFJgrCUAFbFf3kOl4L/QxPDyQ= github.com/dolthub/maphash v0.1.0/go.mod h1:gkg4Ch4CdCDu5h6PMriVLawB7koZ+5ijb9puGMV50a4= github.com/dolthub/swiss v0.2.1 h1:gs2osYs5SJkAaH5/ggVJqXQxRXtWshF6uE0lgR/Y3Gw= github.com/dolthub/swiss v0.2.1/go.mod h1:8AhKZZ1HK7g18j7v7k6c5cYIGEZJcPn0ARsai8cUrh0= github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= github.com/eapache/go-resiliency v1.2.0 h1:v7g92e/KSN71Rq7vSThKaWIq68fL4YHvWyiUKorFR1Q= github.com/eapache/go-resiliency v1.2.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21 h1:YEetp8/yCZMuEPMUDHG0CW/brkkEp8mzqk2+ODEitlw= @@ -260,35 +232,29 @@ github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1 github.com/eapache/queue v1.1.0 h1:YOEu7KNc61ntiQlcEeUIoDTJ2o8mQznoNvUhiigpIqc= github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385/go.mod h1:0vRUJqYpeSZifjYj7uP3BG/gKcuzL9xWVV/Y+cK33KM= -github.com/elastic/gosigar v0.9.0/go.mod h1:cdorVVzy1fhmEqmtgqkoE3bYtCfSCkVyjTyCIo22xvs= -github.com/elazarl/go-bindata-assetfs v1.0.0/go.mod h1:v+YaWX3bdea5J/mo8dSETolEo7R71Vk1u8bnjau5yw4= github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/envoyproxy/protoc-gen-validate v1.0.2 h1:QkIBuU5k+x7/QXPvPPnWXWlCdaBFApVqftFV6k087DA= github.com/envoyproxy/protoc-gen-validate v1.0.2/go.mod h1:GpiZQP3dDbg4JouG/NNS7QWXpgx6x8QiMKdmN72jogE= github.com/etcd-io/bbolt v1.3.3/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw= -github.com/evanphx/json-patch v4.1.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/facebookgo/clock v0.0.0-20150410010913-600d898af40a/go.mod h1:7Ga40egUymuWXxAe151lTNnCv97MddSOVsjpPPkityA= github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072/go.mod h1:duJ4Jxv5lDcvg4QuQr0oowTf7dz4/CR8NtyCooz9HL8= github.com/fatanugraha/noloopclosure v0.1.1 h1:AhepjAikNpk50qTZoipHZqeZtnyKT/C2Tk5dGn7nC+A= github.com/fatanugraha/noloopclosure v0.1.1/go.mod h1:Mi9CiG5QvEgvPLtZLsTzjYwjIDnWAbo10r0BG7JpJII= -github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs= github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw= github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= github.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4= github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= +github.com/felixge/fgprof v0.9.3 h1:VvyZxILNuCiUCSXtPtYmmtGvb65nqXh2QFWc0Wpf2/g= +github.com/felixge/fgprof v0.9.3/go.mod h1:RdbpDgzqYVh/T9fPELJyV7EYJuHB55UTEULNun8eiPw= github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/felixge/httpsnoop v1.0.2 h1:+nS9g82KMXccJ/wp0zyRW9ZBHFETmMGtkk+2CTTrW4o= -github.com/felixge/httpsnoop v1.0.2/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= +github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/flosch/pongo2 v0.0.0-20190707114632-bbf5a6c351f4/go.mod h1:T9YF2M40nIgbVgp3rreNmTged+9HrbNTIQf1PsaIiTA= github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= github.com/form3tech-oss/jwt-go v3.2.6-0.20210809144907-32ab6a8243d7+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= @@ -305,7 +271,6 @@ github.com/fsouza/fake-gcs-server v1.44.0 h1:Lw/mrvs45AfCUPVpry6qFkZnZPqe9thpLQH github.com/fsouza/fake-gcs-server v1.44.0/go.mod h1:M02aKoTv9Tnlf+gmWnTok1PWVCUHDntVbHxpd0krTfo= github.com/fzipp/gocyclo v0.3.1/go.mod h1:DJHO6AUmbdqj2ET4Z9iArSuwWgYDRryYt2wASxc7x3E= github.com/gavv/httpexpect v2.0.0+incompatible/go.mod h1:x+9tiU1YnrOvnB725RkpoLv1M62hOWzwo5OXotisrKc= -github.com/getsentry/raven-go v0.1.2/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ= github.com/ghemawat/stream v0.0.0-20171120220530-696b145b53b9/go.mod h1:106OIgooyS7OzLDOpUGgm9fA3bQENb/cFSyyBmMoJDs= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s= @@ -318,30 +283,27 @@ github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-ini/ini v1.25.4/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= -github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.9.0 h1:wDJmvq38kDhkVxi50ni9ykkdUr1PKgqKOoi01fa0Mdk= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= +github.com/go-kit/log v0.2.1 h1:MRVx0/zhvdseW+Gza6N9rVzU/IVzaeE1SFI4raAhmBU= +github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-logfmt/logfmt v0.5.1 h1:otpy5pqBCBZ1ng9RQ0dPu4PN7ba75Y/aA+UpowDyNVA= -github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= +github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4= +github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY= -github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= +github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab/go.mod h1:/P9AEU963A2AYjv4d1V5eVL1CQbEJq6aCNHDDjibzu8= -github.com/go-ole/go-ole v1.2.4/go.mod h1:XCwSNxSkXRo4vlyPy93sltvi/qJq0jqQhjqQNIwKuxM= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= -github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= +github.com/go-resty/resty/v2 v2.7.0 h1:me+K9p3uhSmXtrBZ4k9jcEAfJmuC8IivWHwaLZwPrFY= +github.com/go-resty/resty/v2 v2.7.0/go.mod h1:9PWDzw47qPphMRFfhsyk0NnSgvluHcljSMVIq3w7q0I= github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI= github.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= -github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= @@ -352,7 +314,6 @@ github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5x github.com/gogo/googleapis v0.0.0-20180223154316-0cd9801be74a/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= github.com/gogo/protobuf v0.0.0-20171007142547-342cbe0a0415/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v0.0.0-20180717141946-636bf0302bc9/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= @@ -360,15 +321,14 @@ github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/gogo/status v1.1.0/go.mod h1:BFv9nrluPLmrS0EmGVvLaPNmRosr9KapBYd5/hpY1WM= github.com/goji/httpauth v0.0.0-20160601135302-2da839ab0f4d/go.mod h1:nnjvkQ9ptGaCkuDUx6wNykzzlUixGxvkme+H/lnzb+A= -github.com/golang-jwt/jwt v3.2.1+incompatible h1:73Z+4BJcrTC+KczS6WvTPvRGOp1WmfEP4Q1lOd9Z/+c= -github.com/golang-jwt/jwt v3.2.1+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= github.com/golang-jwt/jwt/v4 v4.4.2 h1:rcc4lwaZgFMCZ5jxF9ABolDcIHdBytAFgqFPbSJQAYs= github.com/golang-jwt/jwt/v4 v4.4.2/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang-jwt/jwt/v5 v5.0.0 h1:1n1XNM9hk7O9mnQoNBGolZvzebBQ7p93ULHRc28XJUE= +github.com/golang-jwt/jwt/v5 v5.0.0/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/glog v1.1.2 h1:DVjP2PbBOzHyzA+dn3WhHIq4NdVu3Q+pvivFICf/7fo= github.com/golang/glog v1.1.2/go.mod h1:zR+okUeTbrL6EL3xHUDxZuEtGv04p5shwip1+mL/rLQ= -github.com/golang/groupcache v0.0.0-20180924190550-6f2cf27854a4/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -439,10 +399,9 @@ github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeN github.com/google/go-github/v33 v33.0.0/go.mod h1:GMdDnVZY/2TsWgp/lkYnpSAh6TrzhANBBwm6k6TTEXg= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= -github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gofuzz v1.1.0 h1:Hsa8mG0dQ46ij8Sl2AYJDUv1oA9/d6Vk+3LG99Oe02g= -github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/licensecheck v0.3.1 h1:QoxgoDkaeC4nFrtGN1jV7IPmDCHFNIVh54e5hSt6sPs= github.com/google/licensecheck v0.3.1/go.mod h1:ORkR35t/JjW+emNKtfJDII0zlciG9JgbT7SmsohlHmY= github.com/google/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no= @@ -450,7 +409,6 @@ github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXi github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/martian/v3 v3.3.2 h1:IqNFLAmvJOgVlpdEBiQbDc2EwKW77amAycfTuWKdfvw= github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= -github.com/google/pprof v0.0.0-20180605153948-8b03ce837f34/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= @@ -458,8 +416,9 @@ github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20211122183932-1daafda22083 h1:c8EUapQFi+kjzedr4c6WqbwMdmB95+oDBWZ5XFHFYxY= -github.com/google/pprof v0.0.0-20211122183932-1daafda22083/go.mod h1:KgnwoLYCZ8IQu3XUZ8Nc/bM9CCZFOyjUNOSygVozoDg= +github.com/google/pprof v0.0.0-20211214055906-6f57359322fd/go.mod h1:KgnwoLYCZ8IQu3XUZ8Nc/bM9CCZFOyjUNOSygVozoDg= +github.com/google/pprof v0.0.0-20230926050212-f7f687d19a98 h1:pUa4ghanp6q4IJHwE9RwLgmVFfReJN+KbQ8ExNEUUoQ= +github.com/google/pprof v0.0.0-20230926050212-f7f687d19a98/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/renameio/v2 v2.0.0 h1:UifI23ZTGY8Tt29JbYFiuyIU3eX+RNFtUwefq9qAhxg= github.com/google/renameio/v2 v2.0.0/go.mod h1:BtmJXm5YlszgC+TD4HOEEUFgkJP3nLxehU6hfe7jRt4= @@ -469,30 +428,26 @@ github.com/google/skylark v0.0.0-20181101142754-a5f7082aabed h1:rZdD1GeRTHD1aG+V github.com/google/skylark v0.0.0-20181101142754-a5f7082aabed/go.mod h1:CKSX6SxHW1vp20ZNaeGe3TFFBIwCG6vaYrpAiOzX+NA= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4= -github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.5.0 h1:1p67kYwdtXjb0gL0BPiP1Av9wiZPo5A8z2cWkTZ+eyU= +github.com/google/uuid v1.5.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/enterprise-certificate-proxy v0.3.2 h1:Vie5ybvEvT75RniqhfFxPRy3Bf7vr3h0cechB90XaQs= github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/gax-go/v2 v2.12.0 h1:A+gCJKdRfqXkr+BIRGtZLibNXf0m1f9E4HG56etFpas= github.com/googleapis/gax-go/v2 v2.12.0/go.mod h1:y+aIqrI5eb1YGMVJfuV3185Ts/D7qKpsEkdD5+I6QGU= -github.com/googleapis/gnostic v0.2.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= -github.com/gophercloud/gophercloud v0.0.0-20190301152420-fca40860790e/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gordonklaus/ineffassign v0.0.0-20230610083614-0e73809eb601 h1:mrEEilTAUmaAORhssPPkxj84TsHrPMLBGW2Z4SoTxm8= github.com/gordonklaus/ineffassign v0.0.0-20230610083614-0e73809eb601/go.mod h1:Qcp2HIAYhR7mNUVSIxZww3Guk4it82ghYcEXIAk+QT0= -github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= github.com/gorilla/handlers v1.5.1 h1:9lRY6j8DEeeBT10CvO9hGW0gmky0BprnvDI5vfhUHH4= github.com/gorilla/handlers v1.5.1/go.mod h1:t8XrUpc4KVXb7HGyJ4/cEnwQiaxrX/hz1Zv/4g96P1Q= -github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= github.com/gorilla/sessions v1.2.1/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= -github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= +github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gostaticanalysis/analysisutil v0.7.1 h1:ZMCjoue3DtDWQ5WyU16YbjbQEQ3VuzwxALrpYd+HeKk= github.com/gostaticanalysis/analysisutil v0.7.1/go.mod h1:v21E3hY37WKMGSnbsw2S/ojApNWb6C1//mXO48CXbVc= github.com/gostaticanalysis/comment v1.4.2 h1:hlnx5+S2fY9Zo9ePo4AhgYsYHbM2+eAv8m/s1JiCd6Q= @@ -502,43 +457,26 @@ github.com/gostaticanalysis/forcetypeassert v0.1.0/go.mod h1:qZEedyP/sY1lTGV1uJ3 github.com/gostaticanalysis/testutil v0.3.1-0.20210208050101-bfb5c8eec0e4/go.mod h1:D+FIZ+7OahH3ePw/izIEeH5I06eKs1IKI4Xr64/Am3M= github.com/gostaticanalysis/testutil v0.4.0 h1:nhdCmubdmDF6VEatUNjgUZBJKWRqugoISdUv3PPQgHY= github.com/gostaticanalysis/testutil v0.4.0/go.mod h1:bLIoPefWXrRi/ssLFWX1dx7Repi5x3CuviD3dgAZaBU= +github.com/grafana/regexp v0.0.0-20221122212121-6b5c0a4cb7fd h1:PpuIBO5P3e9hpqBD0O/HjhShYuM6XE0i/lbE6J94kww= +github.com/grafana/regexp v0.0.0-20221122212121-6b5c0a4cb7fd/go.mod h1:M5qHK+eWfAv8VR/265dIuEpL3fNfeC21tXXp9itM24A= github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 h1:+9834+KizmvFV7pXQGSXQTsaWhq2GjuNUt0aUU0YBYw= github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -github.com/grpc-ecosystem/grpc-gateway v1.8.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/grpc-ecosystem/grpc-opentracing v0.0.0-20180507213350-8e809c8a8645/go.mod h1:6iZfnjpejD4L/4DwD7NryNaJyCQdzwWwH2MWhCA90Kw= -github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= -github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= -github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-msgpack v0.5.4/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= -github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= -github.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A= -github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 h1:YBftPWNWd4WwGqtY2yeZL2ef8rHAxPBD8KFhJpmcqms= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0/go.mod h1:YN5jB8ie0yfIUg6VvR9Kz84aCaG7AsGZnLjhHbUqwPg= github.com/hashicorp/go-uuid v0.0.0-20180228145832-27454136f036/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.2 h1:cfejS+Tpcp13yd5nYHWDI6qVCny6wyX2Mt5SGur2IGE= github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mOkIeek= github.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= -github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= -github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= -github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= @@ -549,21 +487,19 @@ github.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHL github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20210905161508-09a460cdf81d/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w= -github.com/imdario/mergo v0.3.11 h1:3tnifQM4i+fbajXKBHXWEH+KvNHqojZ778UH75j3bGA= github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= +github.com/imdario/mergo v0.3.16 h1:wwQJbIsHYGMUyLSPrEq1CT16AhnhNJQ51+4fdHUnCl4= +github.com/imdario/mergo v0.3.16/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY= github.com/imkira/go-interpol v1.1.0/go.mod h1:z0h2/2T3XF8kyEPpRgJ3kmNv+C43p+I/CoI+jC3w2iA= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= -github.com/influxdata/influxdb v0.0.0-20170331210902-15e594fc09f1/go.mod h1:qZna6X/4elxqT3yI9iZYdZrWWdeFOOprn86kgg4+IzY= github.com/influxdata/tdigest v0.0.1 h1:XpFptwYmnEKUqmkcDjrzffswZ3nvNeevbUSLPP/ZzIY= github.com/influxdata/tdigest v0.0.1/go.mod h1:Z0kXnxzbTC2qrx4NaIzYkE1k66+6oEDQTvL95hQFh5Y= github.com/iris-contrib/blackfriday v2.0.0+incompatible/go.mod h1:UzZ2bDEoaSGPbkg6SAB4att1aAwTmVIx/5gCVqeyUdI= github.com/iris-contrib/go.uuid v2.0.0+incompatible/go.mod h1:iz2lgM/1UnEf1kP0L/+fafWORmlnuysV2EMP8MW+qe0= github.com/iris-contrib/i18n v0.0.0-20171121225848-987a633949d0/go.mod h1:pMCz62A0xJL6I+umB2YTlFRwWXaDFA0jy+5HzGiJjqI= github.com/iris-contrib/schema v0.0.1/go.mod h1:urYA3uvUNG1TIIjOSCzHr9/LmbQo8LrOcOqfqxa4hXw= -github.com/jackc/fake v0.0.0-20150926172116-812a484cc733/go.mod h1:WrMFNQdiFJ80sQsxDoMokWK1W5TQtxBFNpzWTD84ibQ= -github.com/jackc/pgx v3.2.0+incompatible/go.mod h1:0ZGrqGqkRlliWnWB4zKnWtjbSWbGkVEFm4TeybAXq+I= github.com/jcmturner/aescts/v2 v2.0.0 h1:9YKLH6ey7H4eDBXW8khjYslgyqG2xZikXP0EQFKrle8= github.com/jcmturner/aescts/v2 v2.0.0/go.mod h1:AiaICIRyfYg35RUkr8yESTqvSy7csK90qZ5xfvvsoNs= github.com/jcmturner/dnsutils/v2 v2.0.0 h1:lltnkeZGL0wILNvrNiVCR6Ro5PGU/SeBvVO/8c/iPbo= @@ -591,8 +527,6 @@ github.com/jfcg/sorty/v2 v2.1.0 h1:EjrVSL3cDRxBt/ehiYCIv10F7YHYbTzEmdv7WbkkN1k= github.com/jfcg/sorty/v2 v2.1.0/go.mod h1:JpcSKlmtGOOAGyTdWN2ErjvxeMSJVYBsylAKepIxmNg= github.com/jingyugao/rowserrcheck v1.1.1 h1:zibz55j/MJtLsjP1OF4bSdgXxwL1b+Vn7Tjzq7gFzUs= github.com/jingyugao/rowserrcheck v1.1.1/go.mod h1:4yvlZSDb3IyDTUZJUmpZfm2Hwok+Dtp+nu2qOq+er9c= -github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= -github.com/jmespath/go-jmespath v0.0.0-20160803190731-bd40a432e4c7/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.3.0/go.mod h1:9QtRXoHjLGCJ5IBSaohpXITPlowMeeYCZ7fLUTSywik= github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= @@ -613,12 +547,10 @@ github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnr github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/jtolds/gls v4.2.1+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/juju/errors v0.0.0-20181118221551-089d3ea4e4d5/go.mod h1:W54LbzXuIE0boCoNJfwqpmkKJ1O4TCTZMetAt6jGk7Q= github.com/juju/loggo v0.0.0-20180524022052-584905176618/go.mod h1:vgyd7OREkbtVEN/8IXZe5Ooef3LQePvuBm9UWj6ZL8U= github.com/juju/testing v0.0.0-20180920084828-472a3e8b2073/go.mod h1:63prj8cnj0tU0S9OHjGJn+b1h0ZghCndfnbQolrYTwA= -github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k= github.com/kataras/golog v0.0.9/go.mod h1:12HJgwBIZFNGL0EJnMRhmvGA0PQGx8VFwrZtM4CqbAk= @@ -643,7 +575,6 @@ github.com/klauspost/compress v1.17.1/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQs github.com/klauspost/cpuid v1.2.1/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= github.com/klauspost/cpuid v1.3.1 h1:5JNjFYYQrZeKRJ0734q51WCEEn2huer72Dc7K+R/b6s= github.com/klauspost/cpuid v1.3.1/go.mod h1:bYW4mA6ZgKPob1/Dlai2LviZJO7KGI3uoWLd42rAQw4= -github.com/knz/strtime v0.0.0-20181018220328-af2256ee352c/go.mod h1:4ZxfWkxwtc7dBeifERVVWRy9F9rTU9p0yCDgeCtlius= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= @@ -654,47 +585,42 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/ks3sdklib/aws-sdk-go v1.2.7 h1:qzdmSg2WqIqkFPIsviZhT9uyPV7fF/nXTEAaJpEeUHc= -github.com/ks3sdklib/aws-sdk-go v1.2.7/go.mod h1:xBNbOrxSnd36AQpZ8o99mGGu+blblUd9rI0MKGmeufo= +github.com/ks3sdklib/aws-sdk-go v1.2.9 h1:Eg0fM56r4Gjp9PiK1Bg9agJUxCAWCk236qq9DItfLcw= +github.com/ks3sdklib/aws-sdk-go v1.2.9/go.mod h1:xBNbOrxSnd36AQpZ8o99mGGu+blblUd9rI0MKGmeufo= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/kyoh86/exportloopref v0.1.11 h1:1Z0bcmTypkL3Q4k+IDHMWTcnCliEZcaPiIe0/ymEyhQ= github.com/kyoh86/exportloopref v0.1.11/go.mod h1:qkV4UF1zGl6EkF1ox8L5t9SwyeBAZ3qLMd6up458uqA= github.com/labstack/echo/v4 v4.1.11/go.mod h1:i541M3Fj6f76NZtHSj7TXnyM8n2gaodfvfxNnFqi74g= github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= -github.com/lestrrat-go/blackmagic v1.0.1 h1:lS5Zts+5HIC/8og6cGHb0uCcNCa3OUt1ygh3Qz2Fe80= -github.com/lestrrat-go/blackmagic v1.0.1/go.mod h1:UrEqBzIR2U6CnzVyUtfM6oZNMt/7O7Vohk2J0OGSAtU= +github.com/lestrrat-go/blackmagic v1.0.2 h1:Cg2gVSc9h7sz9NOByczrbUvLopQmXrfFx//N+AkAr5k= +github.com/lestrrat-go/blackmagic v1.0.2/go.mod h1:UrEqBzIR2U6CnzVyUtfM6oZNMt/7O7Vohk2J0OGSAtU= github.com/lestrrat-go/httpcc v1.0.1 h1:ydWCStUeJLkpYyjLDHihupbn2tYmZ7m22BGkcvZZrIE= github.com/lestrrat-go/httpcc v1.0.1/go.mod h1:qiltp3Mt56+55GPVCbTdM9MlqhvzyuL6W/NMDA8vA5E= github.com/lestrrat-go/httprc v1.0.4 h1:bAZymwoZQb+Oq8MEbyipag7iSq6YIga8Wj6GOiJGdI8= github.com/lestrrat-go/httprc v1.0.4/go.mod h1:mwwz3JMTPBjHUkkDv/IGJ39aALInZLrhBp0X7KGUZlo= github.com/lestrrat-go/iter v1.0.2 h1:gMXo1q4c2pHmC3dn8LzRhJfP1ceCbgSiT9lUydIzltI= github.com/lestrrat-go/iter v1.0.2/go.mod h1:Momfcq3AnRlRjI5b5O8/G5/BvpzrhoFTZcn06fEOPt4= -github.com/lestrrat-go/jwx/v2 v2.0.11 h1:ViHMnaMeaO0qV16RZWBHM7GTrAnX2aFLVKofc7FuKLQ= -github.com/lestrrat-go/jwx/v2 v2.0.11/go.mod h1:ZtPtMFlrfDrH2Y0iwfa3dRFn8VzwBrB+cyrm3IBWdDg= +github.com/lestrrat-go/jwx/v2 v2.0.17 h1:+WavkdKVWO90ECnIzUetOnjY+kcqqw4WXEUmil7sMCE= +github.com/lestrrat-go/jwx/v2 v2.0.17/go.mod h1:G8randPHLGAqhcNCqtt6/V/7E6fvJRl3Sf9z777eTQ0= github.com/lestrrat-go/option v1.0.0/go.mod h1:5ZHFbivi4xwXxhxY9XHDe2FHo6/Z7WWmtT7T5nBBp3I= github.com/lestrrat-go/option v1.0.1 h1:oAzP2fvZGQKWkvHa1/SAcFolBEca1oN+mQ7eooNBEYU= github.com/lestrrat-go/option v1.0.1/go.mod h1:5ZHFbivi4xwXxhxY9XHDe2FHo6/Z7WWmtT7T5nBBp3I= -github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/lightstep/lightstep-tracer-go v0.15.6/go.mod h1:6AMpwZpsyCFwSovxzM78e+AsYxE8sGwiM6C3TytaWeI= github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= github.com/lufia/plan9stats v0.0.0-20230326075908-cb1d2100619a h1:N9zuLhTvBSRt0gWSiJswwQ2HqDmtX/ZCDJURnKUt1Ik= github.com/lufia/plan9stats v0.0.0-20230326075908-cb1d2100619a/go.mod h1:JKx41uQRwqlTZabZc+kILPrO/3jlKnQ2Z8b7YiVw5cE= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= -github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-isatty v0.0.18 h1:DOKFKCQ7FNG2L1rbrmstDN4QVRdS89Nkh85u68Uwp98= -github.com/mattn/go-isatty v0.0.18/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= -github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= +github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= +github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.12/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= @@ -709,18 +635,9 @@ github.com/mediocregopher/radix/v3 v3.3.0/go.mod h1:EmfVyvspXz1uZEyPBMyGK+kjWiKQ github.com/mgechev/revive v1.3.4 h1:k/tO3XTaWY4DEHal9tWBkkUMJYO/dLDVyMmAQxmIMDc= github.com/mgechev/revive v1.3.4/go.mod h1:W+pZCMu9qj8Uhfs1iJMQsEFLRozUfvwFwqVvRbSNLVw= github.com/microcosm-cc/bluemonday v1.0.2/go.mod h1:iVP4YcDBq+n/5fb23BhYFvIMq/leAFZyRl6bYmGDlGc= -github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/miekg/dns v1.1.10/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= github.com/mitchellh/copystructure v1.0.0 h1:Laisrj+bAB6b/yJwB5Bt3ITZhGJdqmxquMKeZ+mmkFQ= github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= -github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= -github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= -github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= -github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= -github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/mitchellh/reflectwalk v1.0.1 h1:FVzMWA5RllMAKIdUSC8mdWo3XtwoecrH79BY70sEEpE= @@ -731,10 +648,7 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJ github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/montanaflynn/stats v0.0.0-20180911141734-db72e6cae808/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= -github.com/montanaflynn/stats v0.6.6/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= github.com/moul/http2curl v1.0.0/go.mod h1:8UbvGypXm98wA/IqH45anm5Y2Z6ep6O31QGOAZ3H0fQ= -github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f h1:KUppIJq7/+SVif2QVs3tOP0zanoHgBEVAwHxUSIzRqU= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/nats-io/nats.go v1.8.1/go.mod h1:BrFz9vVn0fU3AcH9Vn4Kd7W0NpJ651tD5omQ3M8LwxM= @@ -755,47 +669,37 @@ github.com/nishanths/predeclared v0.2.2/go.mod h1:RROzoN6TnGQupbC+lqggsOlcgysk3L github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= -github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= github.com/oklog/ulid v1.3.1 h1:EGfNDEx6MqHz8B3uNV6QAib1UR2Lm97sHi3ocA6ESJ4= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= -github.com/olekukonko/tablewriter v0.0.1/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/ginkgo v1.13.0/go.mod h1:+REjRxOmWfHCjfv9TTWB1jD1Frx4XydAD3zm1lskyM0= github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= -github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.27.4 h1:Z2AnStgsdSayCMDiCU42qIz+HLqEPcgiOCXjAU/w+8E= -github.com/onsi/gomega v1.27.4/go.mod h1:riYq/GJKh8hhoM01HN6Vmuy93AarCXCBGpvFDK3q3fQ= -github.com/opentracing-contrib/go-stdlib v0.0.0-20170113013457-1de4cc2120e7/go.mod h1:PLldrQSroqzH70Xl+1DQcGnefIbqsKR7UDaiux3zV+w= +github.com/onsi/gomega v1.20.1 h1:PA/3qinGoukvymdIDV8pii6tiZgC8kbmJO6Z5+b002Q= +github.com/onsi/gomega v1.20.1/go.mod h1:DtrZpjmvpn2mPm4YWQa0/ALMDj9v4YxLgojwPeREyVo= github.com/opentracing/basictracer-go v1.0.0 h1:YyUAhaEfjoWXclZVJ9sGoNct7j4TVk7lZWlQw5UXuoo= github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= -github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs= github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= -github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= github.com/otiai10/copy v1.2.0 h1:HvG945u96iNadPoG2/Ja2+AUJeW5YuFQMixq9yirC+k= github.com/otiai10/copy v1.2.0/go.mod h1:rrF5dJ5F0t/EWSYODDu4j9/vEeYHMkc8jt0zJChqQWw= github.com/otiai10/curr v0.0.0-20150429015615-9b4961190c95/go.mod h1:9qAhocn7zKJG+0mI8eUu6xqkFDYS2kb2saOteoSB3cE= github.com/otiai10/curr v1.0.0/go.mod h1:LskTG5wDwr8Rs+nNQ+1LlxRjAtTZZjtJW4rMXl6j4vs= github.com/otiai10/mint v1.3.0/go.mod h1:F5AjcsTsWUqX+Na9fpHb52P8pcRX2CI6A3ctIT91xUo= +github.com/otiai10/mint v1.3.1 h1:BCmzIS3n71sGfHB5NMNDB3lHYPz8fWSkCAErHed//qc= github.com/otiai10/mint v1.3.1/go.mod h1:/yxELlJQ0ufhjUwhshSj+wFjZ78CnZ48/1wtmBH1OTc= -github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pborman/getopt v0.0.0-20180729010549-6fdd0a2c7117/go.mod h1:85jBQOZwpVEaDAr341tbn15RS4fCAsIst0qp7i8ex1o= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/peterbourgon/g2s v0.0.0-20170223122336-d4e7ad98afea/go.mod h1:1VcHEd3ro4QMoHfiNl/j7Jkln9+KQuorp0PItHMJYNg= -github.com/petermattis/goid v0.0.0-20170504144140-0ded85884ba5/go.mod h1:jvVRKCrJTQWu0XVbaOlby/2lO20uSCHEMzzplHXte1o= github.com/petermattis/goid v0.0.0-20211229010228-4d14c490ee36 h1:64bxqeTEN0/xoEqhKGowgihNuzISS9rEG6YUMU4bzJo= github.com/petermattis/goid v0.0.0-20211229010228-4d14c490ee36/go.mod h1:pxMtw7cyUw6B2bRH0ZBANSPg+AoSud1I1iyJHI69jH4= github.com/phayes/freeport v0.0.0-20180830031419-95f893ade6f2 h1:JhzVVoYvbOACxoUmOs6V/G4D5nPVUW73rKvXxP4XUJc= github.com/phayes/freeport v0.0.0-20180830031419-95f893ade6f2/go.mod h1:iIss55rKnNBTvrwdmkUpLnDpZoAHvWaiq5+iMmen4AE= -github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pierrec/lz4 v2.6.0+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pierrec/lz4 v2.6.1+incompatible h1:9UY3+iC23yxF0UfGaYrGplQ+79Rg+h/q9FV9ix19jjM= github.com/pierrec/lz4 v2.6.1+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= @@ -804,8 +708,8 @@ github.com/pingcap/badger v1.5.1-0.20230103063557-828f39b09b6d/go.mod h1:p8QnkZn github.com/pingcap/errors v0.11.0/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= github.com/pingcap/errors v0.11.5-0.20190809092503-95897b64e011/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= -github.com/pingcap/errors v0.11.5-0.20221009092201-b66cddb77c32 h1:m5ZsBa5o/0CkzZXfXLaThzKuR85SnHHetqBCpzQ30h8= -github.com/pingcap/errors v0.11.5-0.20221009092201-b66cddb77c32/go.mod h1:X2r9ueLEUZgtx2cIogM0v4Zj5uvvzhuuiu7Pn8HzMPg= +github.com/pingcap/errors v0.11.5-0.20231212100244-799fae176cfb h1:yqyP+k0mgRPpXJQDOCrtaG2YZym0ZDD+vt5JzlBUkrw= +github.com/pingcap/errors v0.11.5-0.20231212100244-799fae176cfb/go.mod h1:X2r9ueLEUZgtx2cIogM0v4Zj5uvvzhuuiu7Pn8HzMPg= github.com/pingcap/failpoint v0.0.0-20220801062533-2eaa32854a6c h1:CgbKAHto5CQgWM9fSBIvaxsJHuGP0uM74HXtv3MyyGQ= github.com/pingcap/failpoint v0.0.0-20220801062533-2eaa32854a6c/go.mod h1:4qGtCB0QK0wBzKtFEGDhxXnSnbQApw1gc9siScUl8ew= github.com/pingcap/fn v1.0.0 h1:CyA6AxcOZkQh52wIqYlAmaVmF6EvrcqFywP463pjA8g= @@ -813,8 +717,8 @@ github.com/pingcap/fn v1.0.0/go.mod h1:u9WZ1ZiOD1RpNhcI42RucFh/lBuzTu6rw88a+oF2Z github.com/pingcap/goleveldb v0.0.0-20191226122134-f82aafb29989 h1:surzm05a8C9dN8dIUmo4Be2+pMRb6f55i+UIYrluu2E= github.com/pingcap/goleveldb v0.0.0-20191226122134-f82aafb29989/go.mod h1:O17XtbryoCJhkKGbT62+L2OlrniwqiGLSqrmdHCMzZw= github.com/pingcap/kvproto v0.0.0-20191211054548-3c6b38ea5107/go.mod h1:WWLmULLO7l8IOcQG+t+ItJ3fEcrL5FxF0Wu+HrMy26w= -github.com/pingcap/kvproto v0.0.0-20231122054644-fb0f5c2a0a10 h1:qnhfzwdWOy8oOSZYX7/aK9XKDs4hJ6P/Gg+s7Sr9VKY= -github.com/pingcap/kvproto v0.0.0-20231122054644-fb0f5c2a0a10/go.mod h1:rXxWk2UnwfUhLXha1jxRWPADw9eMZGWEWCg92Tgmb/8= +github.com/pingcap/kvproto v0.0.0-20240109063850-932639606bcf h1:n3FMveYjc2VuETjo6YhmsgkDx0P/yLJTvk96BJdCq6Y= +github.com/pingcap/kvproto v0.0.0-20240109063850-932639606bcf/go.mod h1:rXxWk2UnwfUhLXha1jxRWPADw9eMZGWEWCg92Tgmb/8= github.com/pingcap/log v0.0.0-20210625125904-98ed8e2eb1c7/go.mod h1:8AanEdAHATuRurdGxZXBz0At+9avep+ub7U1AGYLIMM= github.com/pingcap/log v1.1.0/go.mod h1:DWQW5jICDR7UJh4HtxXSM20Churx4CQL0fwL/SoOSA4= github.com/pingcap/log v1.1.1-0.20230317032135-a0d097d16e22 h1:2SOzvGvE8beiC1Y4g9Onkvu6UmuBBOeWRGQEjJaT/JY= @@ -823,57 +727,40 @@ github.com/pingcap/sysutil v1.0.1-0.20230407040306-fb007c5aff21 h1:QV6jqlfOkh8hq github.com/pingcap/sysutil v1.0.1-0.20230407040306-fb007c5aff21/go.mod h1:QYnjfA95ZaMefyl1NO8oPtKeb8pYUdnDVhQgf+qdpjM= github.com/pingcap/tipb v0.0.0-20230919054518-dfd7d194838f h1:NCiI4Wyu4GkViLGTu6cYcxt79LZ1SenBBQX1OwEV6Jg= github.com/pingcap/tipb v0.0.0-20230919054518-dfd7d194838f/go.mod h1:A7mrd7WHBl1o63LE2bIBGEJMTNWXqhgmYiOvMLxozfs= -github.com/pkg/browser v0.0.0-20210115035449-ce105d075bb4 h1:Qj1ukM4GlMWXNdMBuXcXfz/Kw9s1qm0CLY32QxuSImI= -github.com/pkg/browser v0.0.0-20210115035449-ce105d075bb4/go.mod h1:N6UoU20jOqggOuDwUaBQpluzLNDqif3kq9z2wpdYEfQ= +github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 h1:KoWmjvw+nsYOo29YJK9vDA65RGE3NrOnUtO7a+RF9HU= +github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= github.com/pkg/xattr v0.4.9 h1:5883YPCtkSd8LFbs13nXplj9g9tlrwoJRjgpgMu1/fE= github.com/pkg/xattr v0.4.9/go.mod h1:di8WF84zAKk8jzR1UBTEWh9AUlIZZ7M/JNt8e9B6ktU= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= github.com/power-devops/perfstat v0.0.0-20221212215047-62379fc7944b h1:0LFwY6Q3gMACTjAbMZBjXAqTOzOwFaj2Ld6cjeQ7Rig= github.com/power-devops/perfstat v0.0.0-20221212215047-62379fc7944b/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= github.com/prashantv/gostub v1.1.0 h1:BTyx3RfQjRHnUWaGF9oQos79AlQ5k8WNktv7VGvVH4g= github.com/prashantv/gostub v1.1.0/go.mod h1:A5zLQHz7ieHGG7is6LLXLz7I8+3LZzsrV0P1IAHhP5U= github.com/prometheus/client_golang v0.9.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= -github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= -github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.17.0 h1:rl2sfwZMtSthVU752MqfjQozy7blglC+1SOtjMAMh+Q= -github.com/prometheus/client_golang v1.17.0/go.mod h1:VeL+gMmOAxkS2IqfCq0ZmHSL+LjWfWDUmp1mBz9JgUY= +github.com/prometheus/client_golang v1.18.0 h1:HzFfmkOzH5Q8L8G+kSJKUx5dtG87sewO+FoDDqP5Tbk= +github.com/prometheus/client_golang v1.18.0/go.mod h1:T+GXkCk5wSJyOqMIzVgvvjFDlkOQntgjkJWKrN5txjA= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw= github.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI= github.com/prometheus/common v0.0.0-20181020173914-7e9e6cabbd39/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.45.0 h1:2BGz0eBc2hdMDLnO/8n0jeB3oPrt2D08CekT0lneoxM= github.com/prometheus/common v0.45.0/go.mod h1:YJmSTw9BoKxJplESWWxlbyttQR4uaEcGyv9MZjVOJsY= +github.com/prometheus/common/sigv4 v0.1.0 h1:qoVebwtwwEhS85Czm2dSROY5fTo2PAPEVdDeppTwGX4= +github.com/prometheus/common/sigv4 v0.1.0/go.mod h1:2Jkxxk9yYvCkE5G1sQT7GuEXm57JrvHu9k5YwTjsNtI= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= -github.com/prometheus/prometheus v0.0.0-20190525122359-d20e84d0fb64 h1:3DyLm+sTAJkfLyR/1pJ3L+fU2lFufWbpcgMFlGtqeyA= -github.com/prometheus/prometheus v0.0.0-20190525122359-d20e84d0fb64/go.mod h1:oYrT4Vs22/NcnoVYXt5m4cIHP+znvgyusahVpyETKTw= -github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= -github.com/prometheus/tsdb v0.8.0/go.mod h1:fSI0j+IUQrDd7+ZtR9WKIGtoYAYAJUKcKhYLG25tN4g= -github.com/prometheus/tsdb v0.10.0 h1:If5rVCMTp6W2SiRAQFlbpJNgVlgMEd+U2GZckwK38ic= -github.com/prometheus/tsdb v0.10.0/go.mod h1:oi49uRhEe9dPUTlS3JRZOwJuVi6tmh10QSgwXEyGCt4= -github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= +github.com/prometheus/prometheus v0.48.1 h1:CTszphSNTXkuCG6O0IfpKdHcJkvvnAAE1GbELKS+NFk= +github.com/prometheus/prometheus v0.48.1/go.mod h1:SRw624aMAxTfryAcP8rOjg4S/sHHaetx2lyJJ2nM83g= github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM= github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= @@ -882,29 +769,21 @@ github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJ github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= -github.com/rlmcpherson/s3gof3r v0.5.0/go.mod h1:s7vv7SMDPInkitQMuZzH615G7yWHdrU2r/Go7Bo71Rs= github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs= github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro= -github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= -github.com/rubyist/circuitbreaker v2.2.1+incompatible/go.mod h1:Ycs3JgJADPuzJDwffe12k6BZT8hxVi6lFK+gWYJLN4A= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/ryszard/goskiplist v0.0.0-20150312221310-2dfbae5fcf46 h1:GHRpF1pTW19a8tTFrMLUcfWwyC0pnifVo2ClaLq+hP8= github.com/ryszard/goskiplist v0.0.0-20150312221310-2dfbae5fcf46/go.mod h1:uAQ5PCi+MFsC7HjREoAz1BU+Mq60+05gifQSsHSDG/8= -github.com/samuel/go-zookeeper v0.0.0-20161028232340-1d7be4effb13/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= -github.com/sasha-s/go-deadlock v0.0.0-20161201235124-341000892f3d/go.mod h1:StQn567HiB1fF2yJ44N9au7wOhrPS3iZqiDbRupzT10= github.com/sasha-s/go-deadlock v0.2.0 h1:lMqc+fUb7RrFS3gQLtoQsJ7/6TV/pAIFvBsqX73DK8Y= github.com/sasha-s/go-deadlock v0.2.0/go.mod h1:StQn567HiB1fF2yJ44N9au7wOhrPS3iZqiDbRupzT10= -github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= github.com/sclevine/agouti v3.0.0+incompatible/go.mod h1:b4WX9W9L1sfQKXeJf1mUTLZKJ48R1S7H23Ji7oFO5Bw= -github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/segmentio/asm v1.2.0 h1:9BQrFxC+YOHJlTlHGkTrFWf59nbL3XnCoFLTwDCI7ys= github.com/segmentio/asm v1.2.0/go.mod h1:BqMnlJP91P8d+4ibuonYZw9mfnzI9HfxselHZr5aAcs= github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= @@ -917,32 +796,27 @@ github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFt github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ= github.com/shoenig/test v0.6.4 h1:kVTaSd7WLz5WZ2IaoM0RSzRsUD+m8wRR+5qvntpn4LU= github.com/shoenig/test v0.6.4/go.mod h1:byHiCGXqrVaflBLAMq/srcZIHynQPQgeyvkvXnjqq0k= -github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= github.com/shopspring/decimal v1.2.0 h1:abSATXmQEYyShuxI4/vyW3tV1MrKAJzCZ/0zLUXYbsQ= github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= -github.com/shurcooL/httpfs v0.0.0-20171119174359-809beceb2371/go.mod h1:ZY1cvUeJuFPAdZ/B6v7RHavJWZn2YPVFQ1OSXhCGOkg= -github.com/shurcooL/httpfs v0.0.0-20190707220628-8d4bc4ba7749 h1:bUGsEnyNbVPw06Bs80sCeARAlK8lhwqGyi6UT8ymuGk= -github.com/shurcooL/httpfs v0.0.0-20190707220628-8d4bc4ba7749/go.mod h1:ZY1cvUeJuFPAdZ/B6v7RHavJWZn2YPVFQ1OSXhCGOkg= +github.com/shurcooL/httpfs v0.0.0-20230704072500-f1e31cf0ba5c h1:aqg5Vm5dwtvL+YgDpBcK1ITf3o96N/K7/wsRXQnUTEs= +github.com/shurcooL/httpfs v0.0.0-20230704072500-f1e31cf0ba5c/go.mod h1:owqhoLW1qZoYLZzLnBw+QkPP9WZnjlSWihhxAJC1+/M= github.com/shurcooL/httpgzip v0.0.0-20190720172056-320755c1c1b0 h1:mj/nMDAwTBiaCqMEs4cYCqF7pO6Np7vhy1D1wcQGz+E= github.com/shurcooL/httpgzip v0.0.0-20190720172056-320755c1c1b0/go.mod h1:919LwcH0M7/W4fcZ0/jy0qGght1GIhqyS/EgWGH2j5Q= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/shurcooL/vfsgen v0.0.0-20180711163814-62bca832be04/go.mod h1:TrYk7fJVaAttu97ZZKrO9UbRa8izdowaMIZcxYMbVaw= github.com/shurcooL/vfsgen v0.0.0-20181202132449-6a9ea43bcacd h1:ug7PpSOB5RBPK1Kg6qskGBoP3Vnj/aNYFTznWvlkGo0= github.com/shurcooL/vfsgen v0.0.0-20181202132449-6a9ea43bcacd/go.mod h1:TrYk7fJVaAttu97ZZKrO9UbRa8izdowaMIZcxYMbVaw= -github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/goconvey v0.0.0-20180222194500-ef6db91d284a/go.mod h1:XDJAKZRPZ1CvBcN2aX5YOUTYGHki24fSF0Iv48Ibg0s= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= github.com/soheilhy/cmux v0.1.5 h1:jjzc5WVemNEDTLwv9tlmemhC73tI08BNOIGwBOo10Js= github.com/soheilhy/cmux v0.1.5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE1GqG0= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= -github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0 h1:IJ3DuWHPTJrsqtIqjfdmPTELdTFGefvrOa2eTeRBleQ= +github.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:V952P4GGl1v/MMynLwxVdWEbSZJx+n0oOO3ljnez+WU= +github.com/sourcegraph/appdash-data v0.0.0-20151005221446-73f23eafcf67 h1:8ZnTA26bBOoPkAbbitKPgNlpw0Bwt7ZlpYgZWHWJR/w= +github.com/sourcegraph/appdash-data v0.0.0-20151005221446-73f23eafcf67/go.mod h1:tNZjgbYncKL5HxvDULAr/mWDmFz4B7H8yrXEDlnoIiw= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/afero v1.2.1/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= @@ -990,10 +864,10 @@ github.com/tiancaiamao/appdash v0.0.0-20181126055449-889f96f722a2 h1:mbAskLJ0oJf github.com/tiancaiamao/appdash v0.0.0-20181126055449-889f96f722a2/go.mod h1:2PfKggNGDuadAa0LElHrByyrz4JPZ9fFx6Gs7nx7ZZU= github.com/tiancaiamao/gp v0.0.0-20221230034425-4025bc8a4d4a h1:J/YdBZ46WKpXsxsW93SG+q0F8KI+yFrcIDT4c/RNoc4= github.com/tiancaiamao/gp v0.0.0-20221230034425-4025bc8a4d4a/go.mod h1:h4xBhSNtOeEosLJ4P7JyKXX7Cabg7AVkWCK5gV2vOrM= -github.com/tikv/client-go/v2 v2.0.8-0.20231116051730-1c2351c28173 h1:lmJzX0kqrV7kO21wrZPbtjkidzwbDCfXeQrhDWEi5dE= -github.com/tikv/client-go/v2 v2.0.8-0.20231116051730-1c2351c28173/go.mod h1:BOGTSZtbMHEnGC4HOpbONdnTQF+E9nb2Io7c3P9sb7g= -github.com/tikv/pd/client v0.0.0-20231121080541-8919bc11f770 h1:YSXDKT9+KngRSAShoSQVKD/CK1kR4X/9hutKkSK9gn0= -github.com/tikv/pd/client v0.0.0-20231121080541-8919bc11f770/go.mod h1:cd6zBqRM9aogxf26K8NnFRPVtq9BnRE59tKEpX8IaWQ= +github.com/tikv/client-go/v2 v2.0.8-0.20231227070846-61c486af13a5 h1:UldBK/txpUdWwPlxfNJKLTrciZ8BUzhYtXj0RY0uliY= +github.com/tikv/client-go/v2 v2.0.8-0.20231227070846-61c486af13a5/go.mod h1:byff6zglNXgereADRRJmKQnurwy1Z9hthX2I5ObKMNE= +github.com/tikv/pd/client v0.0.0-20240109100024-dd8df25316e9 h1:LnNWRdtxryzxl31GmxOJEFKUmwiG8nph9f5Wqdv8olY= +github.com/tikv/pd/client v0.0.0-20240109100024-dd8df25316e9/go.mod h1:ZilHJZR8wgqENRi26gtnPoKIXAB1EqytFweUhzxetx0= github.com/timakin/bodyclose v0.0.0-20230421092635-574207250966 h1:quvGphlmUVU+nhpFa4gg4yJyTRJ13reZMDHrKwYw53M= github.com/timakin/bodyclose v0.0.0-20230421092635-574207250966/go.mod h1:27bSVNWSBOHm+qRp1T9qzaIpsWEP6TbUnei/43HK+PQ= github.com/tklauser/go-sysconf v0.3.9/go.mod h1:11DU/5sG7UexIrp/O6g35hrWzu0JxlwQ3LSFUzyeuhs= @@ -1068,8 +942,6 @@ go.etcd.io/etcd/server/v3 v3.5.10 h1:4NOGyOwD5sUZ22PiWYKmfxqoeh72z6EhYjNosKGLmZg go.etcd.io/etcd/server/v3 v3.5.10/go.mod h1:gBplPHfs6YI0L+RpGkTQO7buDbHv5HJGG/Bst0/zIPo= go.etcd.io/etcd/tests/v3 v3.5.10 h1:F1pbXwKxwZ58aBT2+CSL/r8WUCAVhob0y1y8OVJ204s= go.etcd.io/etcd/tests/v3 v3.5.10/go.mod h1:vVMWDv9OhopxfJCd+CMI4pih0zUDqlkJj6JcBNlUVXI= -go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= -go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= @@ -1079,24 +951,22 @@ go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.1 h1:SpGay3w+nEwMpfVnbqOLH5gY52/foP8RE8UzTZ1pdSE= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.1/go.mod h1:4UoMYEZOC0yN/sPGH76KPkkU7zgiEWYWL9vwmbnTJPE= -go.opentelemetry.io/otel v1.0.1/go.mod h1:OPEOD4jIT2SlZPMmwT6FqZz2C0ZNdQqiWcoK6M0SNFU= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.46.1 h1:aFJWCqJMNjENlcleuuOkGAPH82y0yULBScfXcIEdS24= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.46.1/go.mod h1:sEGXWArGqc3tVa+ekntsN65DmVbVeW+7lTKTjZF3/Fo= go.opentelemetry.io/otel v1.21.0 h1:hzLeKBZEL7Okw2mGzZ0cc4k/A7Fta0uoPgaJCr8fsFc= go.opentelemetry.io/otel v1.21.0/go.mod h1:QZzNPQPm1zLX4gZK4cMi+71eaorMSGT3A4znnUvNNEo= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.0.1 h1:ofMbch7i29qIUf7VtF+r0HRF6ac0SBaPSziSsKp7wkk= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.0.1/go.mod h1:Kv8liBeVNFkkkbilbgWRpV+wWuu+H5xdOT6HAgd30iw= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.0.1 h1:CFMFNoz+CGprjFAFy+RJFrfEe4GBia3RRm2a4fREvCA= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.0.1/go.mod h1:xOvWoTOrQjxjW61xtOmD/WKGRYb/P4NzRo3bs65U6Rk= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.19.0 h1:Mne5On7VWdx7omSrSSZvM4Kw7cS7NQkOOmLcgscI51U= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.19.0/go.mod h1:IPtUMKL4O3tH5y+iXVyAXqpAwMuzC1IrxVS81rummfE= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.19.0 h1:3d+S281UTjM+AbF31XSOYn1qXn3BgIdWl8HNEpx08Jk= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.19.0/go.mod h1:0+KuTDyKL4gjKCF75pHOX4wuzYDUZYfAQdSu43o+Z2I= go.opentelemetry.io/otel/metric v1.21.0 h1:tlYWfeo+Bocx5kLEloTjbcDwBuELRrIFxwdQ36PlJu4= go.opentelemetry.io/otel/metric v1.21.0/go.mod h1:o1p3CA8nNHW8j5yuQLdc1eeqEaPfzug24uvsyIEJRWM= -go.opentelemetry.io/otel/sdk v1.0.1/go.mod h1:HrdXne+BiwsOHYYkBE5ysIcv2bvdZstxzmCQhxTcZkI= go.opentelemetry.io/otel/sdk v1.21.0 h1:FTt8qirL1EysG6sTQRZ5TokkU8d0ugCj8htOgThZXQ8= go.opentelemetry.io/otel/sdk v1.21.0/go.mod h1:Nna6Yv7PWTdgJHVRD9hIYywQBRx7pbox6nwBnZIxl/E= -go.opentelemetry.io/otel/trace v1.0.1/go.mod h1:5g4i4fKLaX2BQpSBsxw8YYcgKpMMSW3x7ZTuYBr3sUk= go.opentelemetry.io/otel/trace v1.21.0 h1:WD9i5gzvoUPuXIXH24ZNBudiarZDKuekPqi/E8fpfLc= go.opentelemetry.io/otel/trace v1.21.0/go.mod h1:LGbsEB0f9LGjN+OZaQQ26sohbOmiMR+BaslueVtS/qQ= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.opentelemetry.io/proto/otlp v0.9.0 h1:C0g6TWmQYvjKRnljRULLWUVJGy8Uvu0NEL/5frY2/t4= -go.opentelemetry.io/proto/otlp v0.9.0/go.mod h1:1vKfU9rv61e9EVGthD1zNvUbiwPcimSsOPU9brfSHJg= +go.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I= +go.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM= go.starlark.net v0.0.0-20210223155950-e043a3d3c984/go.mod h1:t3mmBBPzAVvK0L0n1drDmrQsJ8FoIx4INCqVMTr/Zo0= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= @@ -1112,8 +982,8 @@ go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= -go.uber.org/mock v0.3.0 h1:3mUxI1No2/60yUYax92Pt8eNOEecx2D3lcXZh2NEZJo= -go.uber.org/mock v0.3.0/go.mod h1:a6FSlNadKUHUa9IP5Vyt1zh4fC7uAwxMutEAscFbkZc= +go.uber.org/mock v0.4.0 h1:VcM4ZOtdbR4f6VXfiOpwpVJDL6lCReaZ6mw31wqh7KU= +go.uber.org/mock v0.4.0/go.mod h1:a6FSlNadKUHUa9IP5Vyt1zh4fC7uAwxMutEAscFbkZc= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= go.uber.org/multierr v1.4.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= @@ -1131,12 +1001,8 @@ go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= go.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo= go.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so= golang.org/x/crypto v0.0.0-20180723164146-c126467f60eb/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= @@ -1149,9 +1015,9 @@ golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.0.0-20220518034528-6f7dac969898/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= -golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= -golang.org/x/crypto v0.15.0 h1:frVn1TEaCEaZcn3Tmd7Y2b5KKPaZ+I32Q2OA3kYp5TA= golang.org/x/crypto v0.15.0/go.mod h1:4ChreQoLWfG3xLDer1WdlH5NdlQ3+mwnQq1YTKY+72g= +golang.org/x/crypto v0.18.0 h1:PGVlW0xEltQnzFZ55hkuX5+KLyrMYhHld1YHO4AKcdc= +golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -1205,16 +1071,11 @@ golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73r golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181005035420-146acd28ed58/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190327091125-710a502c58a2/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190403144856-b630fd6fe46b/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= @@ -1245,6 +1106,7 @@ golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210427231257-85d9c07bbe3a/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211029224645-99673261e6eb/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220517181318-183a9ca12b87/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= @@ -1254,16 +1116,16 @@ golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= -golang.org/x/net v0.18.0 h1:mIYleuAkSbHh0tCv7RvjL3F6ZVbLjq4+R7zbOn3Kokg= -golang.org/x/net v0.18.0/go.mod h1:/czyP5RqHAH4odGYxBJ1qz0+CE5WZ+2j1YgoEo8F2jQ= +golang.org/x/net v0.20.0 h1:aCL9BSgETF1k+blQaYUBx9hJ9LOGP3gAVemcZlf1Kpo= +golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.14.0 h1:P0Vrf/2538nmC0H+pEQ3MNFRRnVR7RlqyVw+bvm26z0= -golang.org/x/oauth2 v0.14.0/go.mod h1:lAtNWgaWfL4cm7j2OV8TxGi9Qb7ECORx8DktCY74OwM= +golang.org/x/oauth2 v0.16.0 h1:aDkGMBSYxElaoP81NpoUoz2oo2R2wHdZpGToUxfyQrQ= +golang.org/x/oauth2 v0.16.0/go.mod h1:hqZ+0LWXsiVoZpeld6jVt06P3adbS2Uu911W1SsJv2o= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1276,23 +1138,15 @@ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE= -golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= +golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180816055513-1c9583448a9c/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190209173611-3b5209105503/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1332,9 +1186,9 @@ golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210616045830-e2b7044e8c71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210816074244-15123e1e1f71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210909193231-528a39cd75f3/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -1357,8 +1211,9 @@ golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.14.0 h1:Vz7Qs629MkJkGyHxUlRHizWJRG2j8fbQKjELVSNhy7Q= golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU= +golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= @@ -1366,8 +1221,9 @@ golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= -golang.org/x/term v0.14.0 h1:LGK9IlZ8T9jvdy6cTdfKUCltatMFOehAQo9SRC46UQ8= golang.org/x/term v0.14.0/go.mod h1:TySc+nGkYR6qt8km8wUhuFRTVSMIX3XPR58y2lC8vww= +golang.org/x/term v0.16.0 h1:m+B6fahuftsE9qjo0VWp2FW0mB3MTJvR0BaMQrq0pmE= +golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1375,21 +1231,20 @@ golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.4.0 h1:Z81tqI5ddIoXDPvVQ7/7CC9TnLM7ubaFG2qXYd5BbYY= -golang.org/x/time v0.4.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= +golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= +golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181221001348-537d06c36207/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -1453,15 +1308,15 @@ golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc golang.org/x/tools v0.2.0/go.mod h1:y4OqIKeOV/fWJetJ8bXPU1sEVniLMIyDAZWeHdV+NTA= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/tools v0.8.0/go.mod h1:JxBZ99ISMI5ViVkT1tr6tdNmXeTrcpVSD3vZ1RsRdN4= -golang.org/x/tools v0.15.0 h1:zdAyfUGbYmuVokhzVmghFl2ZJh5QhcfebBgmVPFYA+8= -golang.org/x/tools v0.15.0/go.mod h1:hpksKq4dtpQWS1uQ61JkdqWM3LscIS6Slf+VVkm+wQk= +golang.org/x/tools v0.17.0 h1:FvmRgNOcs3kOa+T20R1uhfP9F6HgG2mfxDv1vrx1Htc= +golang.org/x/tools v0.17.0/go.mod h1:xsh6VxdV005rRVaS6SSAf9oiAqljS7UZUacMZ8Bnsps= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 h1:H2TDz8ibqkAF6YGhCdN3jS9O0/s90v0rJh3X/OLHEUk= -golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= gonum.org/v1/gonum v0.0.0-20181121035319-3f7ecaa7e8ca/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= gonum.org/v1/gonum v0.8.2 h1:CCXrcPKiGGotvnN6jfUsKk4rRqm7q09/YbKb5xCEvtM= @@ -1469,8 +1324,6 @@ gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= gonum.org/v1/netlib v0.0.0-20181029234149-ec6d1f5cefe6/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= -google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= -google.golang.org/api v0.3.2/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= @@ -1487,16 +1340,17 @@ google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0M google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/api v0.149.0 h1:b2CqT6kG+zqJIVKRQ3ELJVLN1PwHZ6DJ3dW8yl82rgY= -google.golang.org/api v0.149.0/go.mod h1:Mwn1B7JTXrzXtnvmzQE2BD6bYZQ8DShKZDZbeN9I7qI= +google.golang.org/api v0.156.0 h1:yloYcGbBtVYjLKQe4enCunxvwn3s2w/XPrrhVf6MsvQ= +google.golang.org/api v0.156.0/go.mod h1:bUSmn4KFO0Q+69zo9CNIDp4Psi6BqM0np0CbzKRSiSY= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= google.golang.org/genproto v0.0.0-20180518175338-11a468237815/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20181004005441-af9cb2a35e7f/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= @@ -1530,17 +1384,15 @@ google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7Fc google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20231106174013-bbf56f31fb17 h1:wpZ8pe2x1Q3f2KyT5f8oP/fa9rHAKgFPr/HZdNuS+PQ= -google.golang.org/genproto v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:J7XzRzVy1+IPwWHZUzoD0IccYZIrXILAQpc+Qy9CMhY= -google.golang.org/genproto/googleapis/api v0.0.0-20231030173426-d783a09b4405 h1:HJMDndgxest5n2y77fnErkM62iUsptE/H8p0dC2Huo4= -google.golang.org/genproto/googleapis/api v0.0.0-20231030173426-d783a09b4405/go.mod h1:oT32Z4o8Zv2xPQTg0pbVaPr0MPOH6f14RgXt7zfIpwg= -google.golang.org/genproto/googleapis/rpc v0.0.0-20231120223509-83a465c0220f h1:ultW7fxlIvee4HYrtnaRPon9HpEgFk5zYpmfMgtKB5I= -google.golang.org/genproto/googleapis/rpc v0.0.0-20231120223509-83a465c0220f/go.mod h1:L9KNLi232K1/xB6f7AlSX692koaRnKaWSR0stBki0Yc= +google.golang.org/genproto v0.0.0-20240108191215-35c7eff3a6b1 h1:/IWabOtPziuXTEtI1KYCpM6Ss7vaAkeMxk+uXV/xvZs= +google.golang.org/genproto v0.0.0-20240108191215-35c7eff3a6b1/go.mod h1:+Rvu7ElI+aLzyDQhpHMFMMltsD6m7nqpuWDd2CwJw3k= +google.golang.org/genproto/googleapis/api v0.0.0-20240108191215-35c7eff3a6b1 h1:OPXtXn7fNMaXwO3JvOmF1QyTc00jsSFFz1vXXBOdCDo= +google.golang.org/genproto/googleapis/api v0.0.0-20240108191215-35c7eff3a6b1/go.mod h1:B5xPO//w8qmBDjGReYLpR6UJPnkldGkCSMoH/2vxJeg= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240108191215-35c7eff3a6b1 h1:gphdwh0npgs8elJ4T6J+DQJHPVF7RsuJHCfwztUb4J4= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240108191215-35c7eff3a6b1/go.mod h1:daQN87bsDqDoe316QbbvX60nMoJQa4r6Ds0ZuoAe5yA= google.golang.org/grpc v0.0.0-20180607172857-7a6a684ca69e/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.12.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= -google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.19.1/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= @@ -1555,11 +1407,10 @@ google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.41.0/go.mod h1:U3l9uK9J0sini8mHphKoXyaqDA/8VyGnDee1zzIUK6k= -google.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk= -google.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98= +google.golang.org/grpc v1.60.1 h1:26+wFr+cNqSGFcOXcabYC0lUVJVRa2Sb2ortSK7VrEU= +google.golang.org/grpc v1.60.1/go.mod h1:OlCHIeLYqSSsLi6i49B5QGdzaMZK9+M7LXN2FKz4eGM= +google.golang.org/grpc/examples v0.0.0-20231221225426-4f03f3ff32c9 h1:ATnmU8nL2NfIyTSiBvJVDIDIr3qBmeW+c7z7XU21eWs= +google.golang.org/grpc/examples v0.0.0-20231221225426-4f03f3ff32c9/go.mod h1:j5uROIAAgi3YmtiETMt1LW0d/lHqQ7wwrIY4uGRXLQ4= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -1572,11 +1423,9 @@ google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGj google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= -google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= +google.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I= +google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -1585,7 +1434,6 @@ gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntN gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/fsnotify/fsnotify.v1 v1.3.1/go.mod h1:Fyux9zXlo4rWoMSIzpn9fDAYjalPqJ/K1qJ27s+7ltE= gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= gopkg.in/go-playground/validator.v8 v8.18.2/go.mod h1:RX2a/7Ha8BgOhfk7j780h4/u/RRjR0eouCJSH80/M2Y= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= @@ -1600,11 +1448,8 @@ gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce/go.mod h1:yeKp02qBN3iKW1OzL3M gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc= gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc= -gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -1617,7 +1462,6 @@ gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C gopkg.in/yaml.v3 v3.0.0-20220512140231-539c8e751b99/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= @@ -1627,34 +1471,23 @@ honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9 honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.4.6 h1:oFEHCKeID7to/3autwsWfnuv69j3NsfcXbvJKuIcep8= honnef.co/go/tools v0.4.6/go.mod h1:+rnGS1THNh8zMwnd2oVOTL9QF6vmfyG6ZXBULae2uc0= -k8s.io/api v0.0.0-20190409021203-6e4e0e4f393b/go.mod h1:iuAfoD4hCxJ8Onx9kaTIt30j7jUFS00AXQi6QMi99vA= -k8s.io/api v0.27.2 h1:+H17AJpUMvl+clT+BPnKf0E3ksMAzoBBg7CntpSuADo= -k8s.io/api v0.27.2/go.mod h1:ENmbocXfBT2ADujUXcBhHV55RIT31IIEvkntP6vZKS4= -k8s.io/apimachinery v0.0.0-20190404173353-6a84e37a896d/go.mod h1:ccL7Eh7zubPUSh9A3USN90/OzHNSVN6zxzde07TDCL0= -k8s.io/apimachinery v0.27.2 h1:vBjGaKKieaIreI+oQwELalVG4d8f3YAMNpWLzDXkxeg= -k8s.io/apimachinery v0.27.2/go.mod h1:XNfZ6xklnMCOGGFNqXG7bUrQCoR04dh/E7FprV6pb+E= -k8s.io/client-go v11.0.1-0.20190409021438-1a26190bd76a+incompatible/go.mod h1:7vJpHMYJwNQCWgzmNV+VYUl1zCObLyodBc8nIyt8L5s= -k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= -k8s.io/klog/v2 v2.90.1 h1:m4bYOKall2MmOiRaR1J+We67Do7vm9KiQVlT96lnHUw= -k8s.io/klog/v2 v2.90.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= -k8s.io/kube-openapi v0.0.0-20180629012420-d83b052f768a/go.mod h1:BXM9ceUBTj2QnfH2MK1odQs778ajze1RxcmP6S8RVVc= -k8s.io/utils v0.0.0-20190308190857-21c4ce38f2a7/go.mod h1:8k8uAuAQ0rXslZKaEWd0c3oVhZz7sSzSiPnVZayjIX0= -k8s.io/utils v0.0.0-20230209194617-a36077c30491 h1:r0BAOLElQnnFhE/ApUsg3iHdVYYPBjNSSOMowRZxxsY= -k8s.io/utils v0.0.0-20230209194617-a36077c30491/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +k8s.io/api v0.28.2 h1:9mpl5mOb6vXZvqbQmankOfPIGiudghwCoLl1EYfUZbw= +k8s.io/api v0.28.2/go.mod h1:RVnJBsjU8tcMq7C3iaRSGMeaKt2TWEUXcpIt/90fjEg= +k8s.io/apimachinery v0.28.2 h1:KCOJLrc6gu+wV1BYgwik4AF4vXOlVJPdiqn0yAWWwXQ= +k8s.io/apimachinery v0.28.2/go.mod h1:RdzF87y/ngqk9H4z3EL2Rppv5jj95vGS/HaFXrLDApU= +k8s.io/klog/v2 v2.100.1 h1:7WCHKK6K8fNhTqfBhISHQ97KrnJNFZMcQvKp7gP/tmg= +k8s.io/klog/v2 v2.100.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= +k8s.io/utils v0.0.0-20230711102312-30195339c3c7 h1:ZgnF1KZsYxWIifwSNZFZgNtWE89WI5yiP5WwlfDoIyc= +k8s.io/utils v0.0.0-20230711102312-30195339c3c7/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= -sigs.k8s.io/structured-merge-diff/v4 v4.2.3 h1:PRbqxJClWWYMNV1dhaG4NsibJbArud9kFxnAMREiWFE= -sigs.k8s.io/structured-merge-diff/v4 v4.2.3/go.mod h1:qjx8mGObPmV2aSZepjQjbmb2ihdVs8cGKBraizNC69E= -sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= +sigs.k8s.io/structured-merge-diff/v4 v4.3.0 h1:UZbZAZfX0wV2zr7YZorDz6GXROfDFj6LvqCRm4VUVKk= +sigs.k8s.io/structured-merge-diff/v4 v4.3.0/go.mod h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08= sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= -sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0 h1:ucqkfpjg9WzSUubAO62csmucvxl4/JeW3F4I4909XkM= -sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= -sourcegraph.com/sourcegraph/appdash-data v0.0.0-20151005221446-73f23eafcf67 h1:e1sMhtVq9AfcEy8AXNb8eSg6gbzfdpYhoNqnPJa+GzI= -sourcegraph.com/sourcegraph/appdash-data v0.0.0-20151005221446-73f23eafcf67/go.mod h1:L5q+DGLGOQFpo1snNEkLOJT2d1YTW66rWNzatr3He1k= stathat.com/c/consistent v1.0.0 h1:ezyc51EGcRPJUxfHGSgJjWzJdj3NiMU9pNfLNGiXV0c= stathat.com/c/consistent v1.0.0/go.mod h1:QkzMWzcbB+yQBL2AttO6sgsQS/JSTapcDISJalmCDS0= diff --git a/pkg/bindinfo/BUILD.bazel b/pkg/bindinfo/BUILD.bazel index 671c7924bb0b9..aac506a9b45fc 100644 --- a/pkg/bindinfo/BUILD.bazel +++ b/pkg/bindinfo/BUILD.bazel @@ -4,14 +4,17 @@ go_library( name = "bindinfo", srcs = [ "bind_cache.go", - "bind_record.go", - "handle.go", + "binding.go", + "binding_match.go", + "capture.go", + "global_handle.go", "session_handle.go", - "stat.go", + "util.go", ], importpath = "github.com/pingcap/tidb/pkg/bindinfo", visibility = ["//visibility:public"], deps = [ + "//pkg/bindinfo/norm", "//pkg/kv", "//pkg/metrics", "//pkg/parser", @@ -33,12 +36,11 @@ go_library( "//pkg/util/mathutil", "//pkg/util/memory", "//pkg/util/parser", - "//pkg/util/sqlescape", "//pkg/util/sqlexec", "//pkg/util/stmtsummary/v2:stmtsummary", "//pkg/util/table-filter", - "//pkg/util/timeutil", - "@org_golang_x_exp//maps", + "@com_github_ngaut_pools//:pools", + "@com_github_pingcap_errors//:errors", "@org_uber_go_zap//:zap", ], ) @@ -48,8 +50,10 @@ go_test( timeout = "moderate", srcs = [ "bind_cache_test.go", + "binding_match_test.go", "capture_test.go", - "handle_test.go", + "fuzzy_binding_test.go", + "global_handle_test.go", "main_test.go", "optimize_test.go", "session_handle_test.go", @@ -57,22 +61,30 @@ go_test( embed = [":bindinfo"], flaky = True, race = "on", - shard_count = 40, + shard_count = 50, deps = [ "//pkg/bindinfo/internal", + "//pkg/bindinfo/norm", "//pkg/config", "//pkg/domain", "//pkg/metrics", "//pkg/parser", + "//pkg/parser/ast", "//pkg/parser/auth", + "//pkg/parser/format", "//pkg/parser/model", + "//pkg/parser/mysql", "//pkg/server", + "//pkg/session/types", "//pkg/sessionctx/variable", "//pkg/testkit", "//pkg/testkit/testsetup", + "//pkg/types", + "//pkg/util", "//pkg/util/hack", "//pkg/util/parser", "//pkg/util/stmtsummary", + "@com_github_ngaut_pools//:pools", "@com_github_pingcap_failpoint//:failpoint", "@com_github_prometheus_client_model//go", "@com_github_stretchr_testify//require", diff --git a/pkg/bindinfo/bind_cache.go b/pkg/bindinfo/bind_cache.go index 163961d007855..d0fad5e945faf 100644 --- a/pkg/bindinfo/bind_cache.go +++ b/pkg/bindinfo/bind_cache.go @@ -26,7 +26,7 @@ import ( ) // bindCache uses the LRU cache to store the bindRecord. -// The key of the LRU cache is original sql, the value is a slice of BindRecord. +// The key of the LRU cache is original sql, the value is a slice of Bindings. // Note: The bindCache should be accessed with lock. type bindCache struct { lock sync.Mutex @@ -41,11 +41,9 @@ func (key bindCacheKey) Hash() []byte { return hack.Slice(string(key)) } -func calcBindCacheKVMem(key bindCacheKey, value []*BindRecord) int64 { +func calcBindCacheKVMem(key bindCacheKey, value Bindings) int64 { var valMem int64 - for _, bindRecord := range value { - valMem += int64(bindRecord.size()) - } + valMem += int64(value.size()) return int64(len(key.Hash())) + valMem } @@ -65,35 +63,19 @@ func newBindCache() *bindCache { // Note: Only other functions of the bindCache file can use this function. // Don't use this function directly in other files in bindinfo package. // The return value is not read-only, but it is only can be used in other functions which are also in the bind_cache.go. -func (c *bindCache) get(key bindCacheKey) []*BindRecord { +func (c *bindCache) get(key bindCacheKey) Bindings { value, hit := c.cache.Get(key) if !hit { return nil } - typedValue := value.([]*BindRecord) + typedValue := value.(Bindings) return typedValue } -// getCopiedVal gets a copied cache item according to cache key. -// The return value can be modified. -// If you want to modify the return value, use the 'getCopiedVal' function rather than 'get' function. -// We use the copy on write way to operate the bindRecord in cache for safety and accuracy of memory usage. -func (c *bindCache) getCopiedVal(key bindCacheKey) []*BindRecord { - bindRecords := c.get(key) - if bindRecords != nil { - copiedRecords := make([]*BindRecord, len(bindRecords)) - for i, bindRecord := range bindRecords { - copiedRecords[i] = bindRecord.shallowCopy() - } - return copiedRecords - } - return bindRecords -} - // set inserts an item to the cache. It's not thread-safe. // Only other functions of the bindCache can use this function. // The set operation will return error message when the memory usage of binding_cache exceeds its capacity. -func (c *bindCache) set(key bindCacheKey, value []*BindRecord) (ok bool, err error) { +func (c *bindCache) set(key bindCacheKey, value Bindings) (ok bool, err error) { mem := calcBindCacheKVMem(key, value) if mem > c.memCapacity { // ignore this kv pair if its size is too large err = errors.New("The memory usage of all available bindings exceeds the cache's mem quota. As a result, all available bindings cannot be held on the cache. Please increase the value of the system variable 'tidb_mem_quota_binding_cache' and execute 'admin reload bindings' to ensure that all bindings exist in the cache and can be used normally") @@ -110,7 +92,7 @@ func (c *bindCache) set(key bindCacheKey, value []*BindRecord) (ok bool, err err if !evicted { return } - c.memTracker.Consume(-calcBindCacheKVMem(evictedKey.(bindCacheKey), evictedValue.([]*BindRecord))) + c.memTracker.Consume(-calcBindCacheKVMem(evictedKey.(bindCacheKey), evictedValue.(Bindings))) } c.memTracker.Consume(mem) c.cache.Put(key, value) @@ -131,94 +113,45 @@ func (c *bindCache) delete(key bindCacheKey) bool { return false } -// GetBindRecord gets the BindRecord from the cache. -// The return value is not read-only, but it shouldn't be changed in the caller functions. -// The function is thread-safe. -func (c *bindCache) GetBindRecord(hash, normdOrigSQL, _ string) *BindRecord { - c.lock.Lock() - defer c.lock.Unlock() - bindRecords := c.get(bindCacheKey(hash)) - for _, bindRecord := range bindRecords { - if bindRecord.OriginalSQL == normdOrigSQL { - return bindRecord - } - } - return nil -} - -// GetBindRecordBySQLDigest gets the BindRecord from the cache. +// GetBinding gets the Bindings from the cache. // The return value is not read-only, but it shouldn't be changed in the caller functions. // The function is thread-safe. -func (c *bindCache) GetBindRecordBySQLDigest(sqlDigest string) (*BindRecord, error) { +func (c *bindCache) GetBinding(sqlDigest string) Bindings { c.lock.Lock() defer c.lock.Unlock() - bindings := c.get(bindCacheKey(sqlDigest)) - if len(bindings) > 1 { - // currently, we only allow one binding for a sql - return nil, errors.New("more than 1 binding matched") - } - if len(bindings) == 0 || len(bindings[0].Bindings) == 0 { - return nil, errors.New("can't find any binding for '" + sqlDigest + "'") - } - return bindings[0], nil + return c.get(bindCacheKey(sqlDigest)) } -// GetAllBindRecords return all the bindRecords from the bindCache. +// GetAllBindings return all the bindRecords from the bindCache. // The return value is not read-only, but it shouldn't be changed in the caller functions. // The function is thread-safe. -func (c *bindCache) GetAllBindRecords() []*BindRecord { +func (c *bindCache) GetAllBindings() []Bindings { c.lock.Lock() defer c.lock.Unlock() values := c.cache.Values() - //nolint: prealloc - var bindRecords []*BindRecord + bindRecords := make([]Bindings, 0, len(values)) for _, vals := range values { - bindRecords = append(bindRecords, vals.([]*BindRecord)...) + bindRecords = append(bindRecords, vals.(Bindings)) } return bindRecords } -// SetBindRecord sets the BindRecord to the cache. +// SetBinding sets the Bindings to the cache. // The function is thread-safe. -func (c *bindCache) SetBindRecord(hash string, meta *BindRecord) (err error) { +func (c *bindCache) SetBinding(sqlDigest string, meta Bindings) (err error) { c.lock.Lock() defer c.lock.Unlock() - cacheKey := bindCacheKey(hash) - metas := c.getCopiedVal(cacheKey) - for i := range metas { - if metas[i].OriginalSQL == meta.OriginalSQL { - metas[i] = meta - } - } - _, err = c.set(cacheKey, []*BindRecord{meta}) + cacheKey := bindCacheKey(sqlDigest) + _, err = c.set(cacheKey, meta) return } -// RemoveBindRecord removes the BindRecord which has same originSQL with specified BindRecord. +// RemoveBinding removes the Bindings which has same originSQL with specified Bindings. // The function is thread-safe. -func (c *bindCache) RemoveBindRecord(hash string, meta *BindRecord) { +func (c *bindCache) RemoveBinding(sqlDigest string) { c.lock.Lock() defer c.lock.Unlock() - metas := c.getCopiedVal(bindCacheKey(hash)) - if metas == nil { - return - } - - for i := len(metas) - 1; i >= 0; i-- { - if metas[i].isSame(meta) { - metas[i] = metas[i].remove(meta) - if len(metas[i].Bindings) == 0 { - metas = append(metas[:i], metas[i+1:]...) - } - if len(metas) == 0 { - c.delete(bindCacheKey(hash)) - return - } - } - } - // This function can guarantee the memory usage for the cache will never grow up. - // So we don't need to handle the return value here. - _, _ = c.set(bindCacheKey(hash), metas) + c.delete(bindCacheKey(sqlDigest)) } // SetMemCapacity sets the memory capacity for the cache. @@ -259,11 +192,15 @@ func (c *bindCache) Copy() (newCache *bindCache, err error) { for _, key := range keys { cacheKey := key.(bindCacheKey) v := c.get(cacheKey) - bindRecords := make([]*BindRecord, len(v)) - copy(bindRecords, v) - // The memory usage of cache has been handled at the beginning of this function. - // So we don't need to handle the return value here. - _, _ = newCache.set(cacheKey, bindRecords) + if _, err := newCache.set(cacheKey, v); err != nil { + return nil, err + } } return newCache, err } + +func (c *bindCache) Size() int { + c.lock.Lock() + defer c.lock.Unlock() + return c.cache.Size() +} diff --git a/pkg/bindinfo/bind_cache_test.go b/pkg/bindinfo/bind_cache_test.go index ebf6e352590a6..c9ec09e1069fa 100644 --- a/pkg/bindinfo/bind_cache_test.go +++ b/pkg/bindinfo/bind_cache_test.go @@ -25,20 +25,19 @@ import ( ) func TestBindCache(t *testing.T) { - variable.MemQuotaBindingCache.Store(200) + variable.MemQuotaBindingCache.Store(250) bindCache := newBindCache() - value := make([][]*BindRecord, 3) + value := make([]Bindings, 3) key := make([]bindCacheKey, 3) var bigKey string for i := 0; i < 3; i++ { cacheKey := strings.Repeat(strconv.Itoa(i), 50) key[i] = bindCacheKey(hack.Slice(cacheKey)) - record := &BindRecord{OriginalSQL: cacheKey, Db: ""} - value[i] = []*BindRecord{record} + value[i] = []Binding{{OriginalSQL: cacheKey}} bigKey += cacheKey - require.Equal(t, int64(100), calcBindCacheKVMem(key[i], value[i])) + require.Equal(t, int64(116), calcBindCacheKVMem(key[i], value[i])) } ok, err := bindCache.set(key[0], value[0]) @@ -55,7 +54,7 @@ func TestBindCache(t *testing.T) { ok, err = bindCache.set(key[2], value[2]) require.True(t, ok) - require.NotNil(t, err) + require.NotNil(t, err) // exceed the memory limit result = bindCache.get(key[2]) require.NotNil(t, result) @@ -68,11 +67,10 @@ func TestBindCache(t *testing.T) { require.NotNil(t, result) bigBindCacheKey := bindCacheKey(hack.Slice(bigKey)) - bigRecord := &BindRecord{OriginalSQL: bigKey, Db: ""} - bigBindCacheValue := []*BindRecord{bigRecord} - require.Equal(t, int64(300), calcBindCacheKVMem(bigBindCacheKey, bigBindCacheValue)) + bigBindCacheValue := []Binding{{OriginalSQL: strings.Repeat("x", 100)}} + require.Equal(t, int64(266), calcBindCacheKVMem(bigBindCacheKey, bigBindCacheValue)) ok, err = bindCache.set(bigBindCacheKey, bigBindCacheValue) - require.False(t, ok) + require.False(t, ok) // the key-value pair is too big to be cached require.NotNil(t, err) result = bindCache.get(bigBindCacheKey) require.Nil(t, result) diff --git a/pkg/bindinfo/bind_record.go b/pkg/bindinfo/binding.go similarity index 50% rename from pkg/bindinfo/bind_record.go rename to pkg/bindinfo/binding.go index 279e430a5c91d..bf917c642b357 100644 --- a/pkg/bindinfo/bind_record.go +++ b/pkg/bindinfo/binding.go @@ -20,9 +20,9 @@ import ( "github.com/pingcap/tidb/pkg/metrics" "github.com/pingcap/tidb/pkg/parser" + "github.com/pingcap/tidb/pkg/parser/ast" "github.com/pingcap/tidb/pkg/sessionctx" "github.com/pingcap/tidb/pkg/types" - "github.com/pingcap/tidb/pkg/util/hack" "github.com/pingcap/tidb/pkg/util/hint" ) @@ -41,17 +41,10 @@ const ( deleted = "deleted" // Invalid is the bind info's invalid status. Invalid = "invalid" - // PendingVerify means the bind info needs to be verified. - PendingVerify = "pending verify" - // Rejected means that the bind has been rejected after verify process. - // We can retry it after certain time has passed. - Rejected = "rejected" // Manual indicates the binding is created by SQL like "create binding for ...". Manual = "manual" // Capture indicates the binding is captured by TiDB automatically. Capture = "capture" - // Evolve indicates the binding is evolved by TiDB from old bindings. - Evolve = "evolve" // Builtin indicates the binding is a builtin record for internal locking purpose. It is also the status for the builtin binding. Builtin = "builtin" // History indicate the binding is created from statement summary by plan digest @@ -60,9 +53,11 @@ const ( // Binding stores the basic bind hint info. type Binding struct { - BindSQL string + OriginalSQL string + Db string + BindSQL string // Status represents the status of the binding. It can only be one of the following values: - // 1. deleted: BindRecord is deleted, can not be used anymore. + // 1. deleted: Bindings is deleted, can not be used anymore. // 2. enabled, using: Binding is in the normal active mode. Status string CreateTime types.Time @@ -76,6 +71,9 @@ type Binding struct { ID string `json:"-"` SQLDigest string PlanDigest string + + // TableNames records all schema and table names in this binding statement, which are used for fuzzy matching. + TableNames []*ast.TableName `json:"-"` } func (b *Binding) isSame(rb *Binding) bool { @@ -107,40 +105,23 @@ func (b *Binding) SinceUpdateTime() (time.Duration, error) { return time.Since(updateTime), nil } -// BindRecord represents a sql bind record retrieved from the storage. -type BindRecord struct { - OriginalSQL string - Db string - - Bindings []Binding -} +// Bindings represents a sql bind record retrieved from the storage. +type Bindings []Binding // Copy get the copy of bindRecord -func (br *BindRecord) Copy() *BindRecord { - nbr := &BindRecord{ - OriginalSQL: br.OriginalSQL, - Db: br.Db, - } - nbr.Bindings = make([]Binding, len(br.Bindings)) - copy(nbr.Bindings, br.Bindings) +func (br Bindings) Copy() Bindings { + nbr := append(make(Bindings, 0, len(br)), br...) return nbr } -// HasEnabledBinding checks if there are any enabled bindings in bind record. -func (br *BindRecord) HasEnabledBinding() bool { - for _, binding := range br.Bindings { - if binding.IsBindingEnabled() { - return true - } - } - return false -} - // HasAvailableBinding checks if there are any available bindings in bind record. // The available means the binding can be used or can be converted into a usable status. // It includes the 'Enabled', 'Using' and 'Disabled' status. -func (br *BindRecord) HasAvailableBinding() bool { - for _, binding := range br.Bindings { +func HasAvailableBinding(br Bindings) bool { + if br == nil { + return false + } + for _, binding := range br { if binding.IsBindingAvailable() { return true } @@ -148,141 +129,94 @@ func (br *BindRecord) HasAvailableBinding() bool { return false } -// FindEnabledBinding gets the enabled binding. -// There is at most one binding that can be used now. -func (br *BindRecord) FindEnabledBinding() *Binding { - for _, binding := range br.Bindings { - if binding.IsBindingEnabled() { - return &binding - } +// prepareHints builds ID and Hint for Bindings. If sctx is not nil, we check if +// the BindSQL is still valid. +func prepareHints(sctx sessionctx.Context, binding *Binding) error { + p := parser.New() + if (binding.Hint != nil && binding.ID != "") || binding.Status == deleted { + return nil } - return nil -} - -// FindBinding find bindings in BindRecord. -func (br *BindRecord) FindBinding(hint string) *Binding { - for i := range br.Bindings { - binding := br.Bindings[i] - if binding.ID == hint { - return &binding - } + dbName := binding.Db + bindingStmt, err := p.ParseOneStmt(binding.BindSQL, binding.Charset, binding.Collation) + if err != nil { + return err + } + isFuzzy := isFuzzyBinding(bindingStmt) + if isFuzzy { + dbName = "*" // ues '*' for universal bindings } - return nil -} -// prepareHints builds ID and Hint for BindRecord. If sctx is not nil, we check if -// the BindSQL is still valid. -func (br *BindRecord) prepareHints(sctx sessionctx.Context) error { - p := parser.New() - for i, bind := range br.Bindings { - if (bind.Hint != nil && bind.ID != "") || bind.Status == deleted { - continue - } - hintsSet, stmt, warns, err := hint.ParseHintsSet(p, bind.BindSQL, bind.Charset, bind.Collation, br.Db) - if err != nil { - return err - } - if sctx != nil { - paramChecker := ¶mMarkerChecker{} - stmt.Accept(paramChecker) - if !paramChecker.hasParamMarker { - _, err = getHintsForSQL(sctx, bind.BindSQL) - if err != nil { - return err - } + hintsSet, stmt, warns, err := hint.ParseHintsSet(p, binding.BindSQL, binding.Charset, binding.Collation, dbName) + if err != nil { + return err + } + if sctx != nil && !isFuzzy { + paramChecker := ¶mMarkerChecker{} + stmt.Accept(paramChecker) + if !paramChecker.hasParamMarker { + _, err = getHintsForSQL(sctx, binding.BindSQL) + if err != nil { + return err } } - hintsStr, err := hintsSet.Restore() - if err != nil { - return err - } - // For `create global binding for select * from t using select * from t`, we allow it though hintsStr is empty. - // For `create global binding for select * from t using select /*+ non_exist_hint() */ * from t`, - // the hint is totally invalid, we escalate warning to error. - if hintsStr == "" && len(warns) > 0 { - return warns[0] - } - br.Bindings[i].Hint = hintsSet - br.Bindings[i].ID = hintsStr } + hintsStr, err := hintsSet.Restore() + if err != nil { + return err + } + // For `create global binding for select * from t using select * from t`, we allow it though hintsStr is empty. + // For `create global binding for select * from t using select /*+ non_exist_hint() */ * from t`, + // the hint is totally invalid, we escalate warning to error. + if hintsStr == "" && len(warns) > 0 { + return warns[0] + } + binding.Hint = hintsSet + binding.ID = hintsStr return nil } -// `merge` merges two BindRecord. It will replace old bindings with new bindings if there are new updates. -func merge(lBindRecord, rBindRecord *BindRecord) *BindRecord { - if lBindRecord == nil { - return rBindRecord +// `merge` merges two Bindings. It will replace old bindings with new bindings if there are new updates. +func merge(lBindings, rBindings Bindings) Bindings { + if lBindings == nil { + return rBindings } - if rBindRecord == nil { - return lBindRecord + if rBindings == nil { + return lBindings } - result := lBindRecord.shallowCopy() - for i := range rBindRecord.Bindings { - rbind := rBindRecord.Bindings[i] + result := lBindings.Copy() + for i := range rBindings { + rbind := rBindings[i] found := false - for j, lbind := range lBindRecord.Bindings { + for j, lbind := range lBindings { if lbind.isSame(&rbind) { found = true if rbind.UpdateTime.Compare(lbind.UpdateTime) >= 0 { - result.Bindings[j] = rbind + result[j] = rbind } break } } if !found { - result.Bindings = append(result.Bindings, rbind) - } - } - return result -} - -func (br *BindRecord) remove(deleted *BindRecord) *BindRecord { - // Delete all bindings. - if len(deleted.Bindings) == 0 { - return &BindRecord{OriginalSQL: br.OriginalSQL, Db: br.Db} - } - result := br.shallowCopy() - for j := range deleted.Bindings { - deletedBind := deleted.Bindings[j] - for i, bind := range result.Bindings { - if bind.isSame(&deletedBind) { - result.Bindings = append(result.Bindings[:i], result.Bindings[i+1:]...) - break - } + result = append(result, rbind) } } return result } -func (br *BindRecord) removeDeletedBindings() *BindRecord { - result := BindRecord{OriginalSQL: br.OriginalSQL, Db: br.Db, Bindings: make([]Binding, 0, len(br.Bindings))} - for _, binding := range br.Bindings { +func removeDeletedBindings(br Bindings) Bindings { + result := make(Bindings, 0, len(br)) + for _, binding := range br { if binding.Status != deleted { - result.Bindings = append(result.Bindings, binding) + result = append(result, binding) } } - return &result -} - -// shallowCopy shallow copies the BindRecord. -func (br *BindRecord) shallowCopy() *BindRecord { - result := BindRecord{ - OriginalSQL: br.OriginalSQL, - Db: br.Db, - Bindings: make([]Binding, len(br.Bindings)), - } - copy(result.Bindings, br.Bindings) - return &result -} - -func (br *BindRecord) isSame(other *BindRecord) bool { - return br.OriginalSQL == other.OriginalSQL + return result } -// size calculates the memory size of a BindRecord. -func (br *BindRecord) size() float64 { - mem := float64(len(hack.Slice(br.OriginalSQL)) + len(hack.Slice(br.Db))) - for _, binding := range br.Bindings { +// size calculates the memory size of a Bindings. +func (br Bindings) size() float64 { + mem := float64(0) + for _, binding := range br { mem += binding.size() } return mem @@ -294,22 +228,22 @@ var statusIndex = map[string]int{ Invalid: 2, } -func (br *BindRecord) metrics() ([]float64, []int) { +func bindingMetrics(br Bindings) ([]float64, []int) { sizes := make([]float64, len(statusIndex)) count := make([]int, len(statusIndex)) if br == nil { return sizes, count } - commonLength := float64(len(br.OriginalSQL) + len(br.Db)) + commonLength := float64(0) // We treat it as deleted if there are no bindings. It could only occur in session handles. - if len(br.Bindings) == 0 { + if len(br) == 0 { sizes[statusIndex[deleted]] = commonLength count[statusIndex[deleted]] = 1 return sizes, count } // Make the common length counted in the first binding. - sizes[statusIndex[br.Bindings[0].Status]] = commonLength - for _, binding := range br.Bindings { + sizes[statusIndex[br[0].Status]] = commonLength + for _, binding := range br { sizes[statusIndex[binding.Status]] += binding.size() count[statusIndex[binding.Status]]++ } @@ -318,13 +252,13 @@ func (br *BindRecord) metrics() ([]float64, []int) { // size calculates the memory size of a bind info. func (b *Binding) size() float64 { - res := len(b.BindSQL) + len(b.Status) + 2*int(unsafe.Sizeof(b.CreateTime)) + len(b.Charset) + len(b.Collation) + len(b.ID) + res := len(b.OriginalSQL) + len(b.Db) + len(b.BindSQL) + len(b.Status) + 2*int(unsafe.Sizeof(b.CreateTime)) + len(b.Charset) + len(b.Collation) + len(b.ID) return float64(res) } -func updateMetrics(scope string, before *BindRecord, after *BindRecord, sizeOnly bool) { - beforeSize, beforeCount := before.metrics() - afterSize, afterCount := after.metrics() +func updateMetrics(scope string, before Bindings, after Bindings, sizeOnly bool) { + beforeSize, beforeCount := bindingMetrics(before) + afterSize, afterCount := bindingMetrics(after) for status, index := range statusIndex { metrics.BindMemoryUsage.WithLabelValues(scope, status).Add(afterSize[index] - beforeSize[index]) if !sizeOnly { diff --git a/pkg/bindinfo/binding_match.go b/pkg/bindinfo/binding_match.go new file mode 100644 index 0000000000000..bb18ad47bf299 --- /dev/null +++ b/pkg/bindinfo/binding_match.go @@ -0,0 +1,172 @@ +// Copyright 2023 PingCAP, 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. + +package bindinfo + +import ( + "sync" + + "github.com/pingcap/tidb/pkg/bindinfo/norm" + "github.com/pingcap/tidb/pkg/metrics" + "github.com/pingcap/tidb/pkg/parser/ast" + "github.com/pingcap/tidb/pkg/sessionctx" + "github.com/pingcap/tidb/pkg/util/hint" +) + +var ( + // GetGlobalBindingHandle is a function to get the global binding handle. + // It is mainly used to resolve cycle import issue. + GetGlobalBindingHandle func(sctx sessionctx.Context) GlobalBindingHandle +) + +// BindingMatchInfo records necessary information for fuzzy binding matching. +// This is mainly for plan cache to avoid normalizing the same statement repeatedly. +type BindingMatchInfo struct { + FuzzyDigest string + TableNames []*ast.TableName +} + +// MatchSQLBindingForPlanCache matches binding for plan cache. +func MatchSQLBindingForPlanCache(sctx sessionctx.Context, stmtNode ast.StmtNode, info *BindingMatchInfo) (bindingSQL string, ignoreBinding bool) { + binding, matched, _ := matchSQLBinding(sctx, stmtNode, info) + if matched { + bindingSQL = binding.BindSQL + ignoreBinding = binding.Hint.ContainTableHint(hint.HintIgnorePlanCache) + } + return +} + +// MatchSQLBinding returns the matched binding for this statement. +func MatchSQLBinding(sctx sessionctx.Context, stmtNode ast.StmtNode) (binding Binding, matched bool, scope string) { + return matchSQLBinding(sctx, stmtNode, nil) +} + +func matchSQLBinding(sctx sessionctx.Context, stmtNode ast.StmtNode, info *BindingMatchInfo) (binding Binding, matched bool, scope string) { + useBinding := sctx.GetSessionVars().UsePlanBaselines + if !useBinding || stmtNode == nil { + return + } + // When the domain is initializing, the bind will be nil. + if sctx.Value(SessionBindInfoKeyType) == nil { + return + } + + // record the normalization result into info to avoid repeat normalization next time. + var fuzzyDigest string + var tableNames []*ast.TableName + if info == nil || info.TableNames == nil || info.FuzzyDigest == "" { + _, fuzzyDigest = norm.NormalizeStmtForBinding(stmtNode, norm.WithFuzz(true)) + tableNames = CollectTableNames(stmtNode) + if info != nil { + info.FuzzyDigest = fuzzyDigest + info.TableNames = tableNames + } + } else { + fuzzyDigest = info.FuzzyDigest + tableNames = info.TableNames + } + + sessionHandle := sctx.Value(SessionBindInfoKeyType).(SessionBindingHandle) + if binding, matched := sessionHandle.MatchSessionBinding(sctx, fuzzyDigest, tableNames); matched { + return binding, matched, metrics.ScopeSession + } + globalHandle := GetGlobalBindingHandle(sctx) + if globalHandle == nil { + return + } + if binding, matched := globalHandle.MatchGlobalBinding(sctx, fuzzyDigest, tableNames); matched { + return binding, matched, metrics.ScopeGlobal + } + return +} + +func fuzzyMatchBindingTableName(currentDB string, stmtTableNames, bindingTableNames []*ast.TableName) (numWildcards int, matched bool) { + if len(stmtTableNames) != len(bindingTableNames) { + return 0, false + } + for i := range stmtTableNames { + if stmtTableNames[i].Name.L != bindingTableNames[i].Name.L { + return 0, false + } + if bindingTableNames[i].Schema.L == "*" { + numWildcards++ + } + if bindingTableNames[i].Schema.L == stmtTableNames[i].Schema.L || // exactly same, or + (stmtTableNames[i].Schema.L == "" && bindingTableNames[i].Schema.L == currentDB) || // equal to the current DB, or + bindingTableNames[i].Schema.L == "*" { // fuzzy match successfully + continue + } + return 0, false + } + return numWildcards, true +} + +// isFuzzyBinding checks whether the stmtNode is a fuzzy binding. +func isFuzzyBinding(stmt ast.Node) bool { + for _, t := range CollectTableNames(stmt) { + if t.Schema.L == "*" { + return true + } + } + return false +} + +// CollectTableNames gets all table names from ast.Node. +// This function is mainly for binding fuzzy matching. +// ** the return is read-only. +// For example: +// +// `select * from t1 where a < 1` --> [t1] +// `select * from db1.t1, t2 where a < 1` --> [db1.t1, t2] +// +// You can see more example at the TestExtractTableName. +func CollectTableNames(in ast.Node) []*ast.TableName { + collector := tableNameCollectorPool.Get().(*tableNameCollector) + defer func() { + collector.tableNames = nil + tableNameCollectorPool.Put(collector) + }() + in.Accept(collector) + return collector.tableNames +} + +var tableNameCollectorPool = sync.Pool{ + New: func() any { + return newCollectTableName() + }, +} + +type tableNameCollector struct { + tableNames []*ast.TableName +} + +func newCollectTableName() *tableNameCollector { + return &tableNameCollector{ + tableNames: make([]*ast.TableName, 0, 4), + } +} + +// Enter implements Visitor interface. +func (c *tableNameCollector) Enter(in ast.Node) (out ast.Node, skipChildren bool) { + if node, ok := in.(*ast.TableName); ok { + c.tableNames = append(c.tableNames, node) + return in, true + } + return in, false +} + +// Leave implements Visitor interface. +func (*tableNameCollector) Leave(in ast.Node) (out ast.Node, ok bool) { + return in, true +} diff --git a/pkg/bindinfo/binding_match_test.go b/pkg/bindinfo/binding_match_test.go new file mode 100644 index 0000000000000..35f6993ecbd59 --- /dev/null +++ b/pkg/bindinfo/binding_match_test.go @@ -0,0 +1,76 @@ +// Copyright 2023 PingCAP, 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. + +package bindinfo + +import ( + "strings" + "testing" + + "github.com/pingcap/tidb/pkg/parser" + "github.com/pingcap/tidb/pkg/parser/ast" + "github.com/pingcap/tidb/pkg/parser/format" + "github.com/stretchr/testify/require" +) + +func getTableName(n []*ast.TableName) []string { + result := make([]string, 0, len(n)) + for _, v := range n { + var sb strings.Builder + restoreFlags := format.RestoreKeyWordLowercase + restoreCtx := format.NewRestoreCtx(restoreFlags, &sb) + v.Restore(restoreCtx) + result = append(result, sb.String()) + } + return result +} + +func TestExtractTableName(t *testing.T) { + tc := []struct { + sql string + tables []string + }{ + { + "select /*+ HASH_JOIN(t1, t2) */ * from t1 t1 join t1 t2 on t1.a=t2.a where t1.b is not null;", + []string{"t1", "t1"}, + }, + { + "select * from t", + []string{"t"}, + }, + { + "select * from t1, t2, t3;", + []string{"t1", "t2", "t3"}, + }, + { + "select * from t1 where t1.a > (select max(a) from t2);", + []string{"t1", "t2"}, + }, + { + "select * from t1 where t1.a > (select max(a) from t2 where t2.a > (select max(a) from t3));", + []string{"t1", "t2", "t3"}, + }, + { + "select a,b,c,d,* from t1 where t1.a > (select max(a) from t2 where t2.a > (select max(a) from t3));", + []string{"t1", "t2", "t3"}, + }, + } + for _, tt := range tc { + stmt, err := parser.New().ParseOneStmt(tt.sql, "", "") + require.NoError(t, err) + rs := CollectTableNames(stmt) + result := getTableName(rs) + require.Equal(t, tt.tables, result) + } +} diff --git a/pkg/bindinfo/capture.go b/pkg/bindinfo/capture.go new file mode 100644 index 0000000000000..f65db8b73d409 --- /dev/null +++ b/pkg/bindinfo/capture.go @@ -0,0 +1,203 @@ +// Copyright 2023 PingCAP, 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. + +package bindinfo + +import ( + "context" + "strconv" + "strings" + + "github.com/pingcap/tidb/pkg/parser" + "github.com/pingcap/tidb/pkg/parser/ast" + "github.com/pingcap/tidb/pkg/sessionctx" + "github.com/pingcap/tidb/pkg/sessionctx/stmtctx" + "github.com/pingcap/tidb/pkg/util/logutil" + utilparser "github.com/pingcap/tidb/pkg/util/parser" + stmtsummaryv2 "github.com/pingcap/tidb/pkg/util/stmtsummary/v2" + tablefilter "github.com/pingcap/tidb/pkg/util/table-filter" + "go.uber.org/zap" +) + +type captureFilter struct { + frequency int64 + tables []tablefilter.Filter // `schema.table` + users map[string]struct{} + + fail bool + currentDB string +} + +func (cf *captureFilter) Enter(in ast.Node) (out ast.Node, skipChildren bool) { + if x, ok := in.(*ast.TableName); ok { + tblEntry := stmtctx.TableEntry{ + DB: x.Schema.L, + Table: x.Name.L, + } + if x.Schema.L == "" { + tblEntry.DB = cf.currentDB + } + for _, tableFilter := range cf.tables { + if tableFilter.MatchTable(tblEntry.DB, tblEntry.Table) { + cf.fail = true // some filter is matched + } + } + } + return in, cf.fail +} + +func (*captureFilter) Leave(in ast.Node) (out ast.Node, ok bool) { + return in, true +} + +func (cf *captureFilter) isEmpty() bool { + return len(cf.tables) == 0 && len(cf.users) == 0 +} + +// ParseCaptureTableFilter checks whether this filter is valid and parses it. +func ParseCaptureTableFilter(tableFilter string) (f tablefilter.Filter, valid bool) { + // forbid wildcards '!' and '@' for safety, + // please see https://github.com/pingcap/tidb-tools/tree/master/pkg/table-filter for more details. + tableFilter = strings.TrimLeft(tableFilter, " \t") + if tableFilter == "" { + return nil, false + } + if tableFilter[0] == '!' || tableFilter[0] == '@' { + return nil, false + } + var err error + f, err = tablefilter.Parse([]string{tableFilter}) + if err != nil { + return nil, false + } + return f, true +} + +func (h *globalBindingHandle) extractCaptureFilterFromStorage() (filter *captureFilter) { + filter = &captureFilter{ + frequency: 1, + users: make(map[string]struct{}), + } + + _ = h.callWithSCtx(false, func(sctx sessionctx.Context) error { + // No need to acquire the session context lock for ExecRestrictedSQL, it + // uses another background session. + rows, _, err := execRows(sctx, `SELECT filter_type, filter_value FROM mysql.capture_plan_baselines_blacklist order by filter_type`) + if err != nil { + logutil.BgLogger().Warn("failed to load mysql.capture_plan_baselines_blacklist", zap.String("category", "sql-bind"), zap.Error(err)) + return err + } + for _, row := range rows { + filterTp := strings.ToLower(row.GetString(0)) + valStr := strings.ToLower(row.GetString(1)) + switch filterTp { + case "table": + tfilter, valid := ParseCaptureTableFilter(valStr) + if !valid { + logutil.BgLogger().Warn("capture table filter is invalid, ignore it", zap.String("category", "sql-bind"), zap.String("filter_value", valStr)) + continue + } + filter.tables = append(filter.tables, tfilter) + case "user": + filter.users[valStr] = struct{}{} + case "frequency": + f, err := strconv.ParseInt(valStr, 10, 64) + if err != nil { + logutil.BgLogger().Warn("failed to parse frequency type value, ignore it", zap.String("category", "sql-bind"), zap.String("filter_value", valStr), zap.Error(err)) + continue + } + if f < 1 { + logutil.BgLogger().Warn("frequency threshold is less than 1, ignore it", zap.String("category", "sql-bind"), zap.Int64("frequency", f)) + continue + } + if f > filter.frequency { + filter.frequency = f + } + default: + logutil.BgLogger().Warn("unknown capture filter type, ignore it", zap.String("category", "sql-bind"), zap.String("filter_type", filterTp)) + } + } + return nil + }) + return +} + +// CaptureBaselines is used to automatically capture plan baselines. +func (h *globalBindingHandle) CaptureBaselines() { + parser4Capture := parser.New() + captureFilter := h.extractCaptureFilterFromStorage() + emptyCaptureFilter := captureFilter.isEmpty() + bindableStmts := stmtsummaryv2.GetMoreThanCntBindableStmt(captureFilter.frequency) + for _, bindableStmt := range bindableStmts { + stmt, err := parser4Capture.ParseOneStmt(bindableStmt.Query, bindableStmt.Charset, bindableStmt.Collation) + if err != nil { + logutil.BgLogger().Debug("parse SQL failed in baseline capture", zap.String("category", "sql-bind"), zap.String("SQL", bindableStmt.Query), zap.Error(err)) + continue + } + if insertStmt, ok := stmt.(*ast.InsertStmt); ok && insertStmt.Select == nil { + continue + } + if !emptyCaptureFilter { + captureFilter.fail = false + captureFilter.currentDB = bindableStmt.Schema + stmt.Accept(captureFilter) + if captureFilter.fail { + continue + } + + if len(captureFilter.users) > 0 { + filteredByUser := true + for user := range bindableStmt.Users { + if _, ok := captureFilter.users[user]; !ok { + filteredByUser = false // some user not in the black-list has processed this stmt + break + } + } + if filteredByUser { + continue + } + } + } + dbName := utilparser.GetDefaultDB(stmt, bindableStmt.Schema) + normalizedSQL, digest := parser.NormalizeDigest(utilparser.RestoreWithDefaultDB(stmt, dbName, bindableStmt.Query)) + if r := h.getCache().GetBinding(digest.String()); HasAvailableBinding(r) { + continue + } + bindSQL := GenerateBindSQL(context.TODO(), stmt, bindableStmt.PlanHint, true, dbName) + if bindSQL == "" { + continue + } + + var charset, collation string + _ = h.callWithSCtx(false, func(sctx sessionctx.Context) error { + charset, collation = sctx.GetSessionVars().GetCharsetInfo() + return nil + }) + binding := Binding{ + OriginalSQL: normalizedSQL, + Db: dbName, + BindSQL: bindSQL, + Status: Enabled, + Charset: charset, + Collation: collation, + Source: Capture, + SQLDigest: digest.String(), + } + // We don't need to pass the `sctx` because the BindSQL has been validated already. + err = h.CreateGlobalBinding(nil, binding) + if err != nil { + logutil.BgLogger().Debug("create bind record failed in baseline capture", zap.String("category", "sql-bind"), zap.String("SQL", bindableStmt.Query), zap.Error(err)) + } + } +} diff --git a/pkg/bindinfo/capture_test.go b/pkg/bindinfo/capture_test.go index 3b9589a1a5240..c8e94ff3ef4b2 100644 --- a/pkg/bindinfo/capture_test.go +++ b/pkg/bindinfo/capture_test.go @@ -22,6 +22,7 @@ import ( "github.com/pingcap/tidb/pkg/bindinfo" "github.com/pingcap/tidb/pkg/bindinfo/internal" + "github.com/pingcap/tidb/pkg/bindinfo/norm" "github.com/pingcap/tidb/pkg/config" "github.com/pingcap/tidb/pkg/domain" "github.com/pingcap/tidb/pkg/parser" @@ -328,26 +329,12 @@ func TestBindingSource(t *testing.T) { // Test Source for SQL created sql tk.MustExec("create global binding for select * from t where a > 10 using select * from t ignore index(idx_a) where a > 10") bindHandle := dom.BindHandle() - sql, hash := internal.UtilNormalizeWithDefaultDB(t, "select * from t where a > ?") - bindData := bindHandle.GetBindRecord(hash, sql, "test") - require.NotNil(t, bindData) - require.Equal(t, "select * from `test` . `t` where `a` > ?", bindData.OriginalSQL) - require.Len(t, bindData.Bindings, 1) - bind := bindData.Bindings[0] - require.Equal(t, bindinfo.Manual, bind.Source) - - // Test Source for evolved sql - tk.MustExec("set @@tidb_evolve_plan_baselines=1") - tk.MustQuery("select * from t where a > 10") - bindHandle.SaveEvolveTasksToStore() - sql, hash = internal.UtilNormalizeWithDefaultDB(t, "select * from t where a > ?") - bindData = bindHandle.GetBindRecord(hash, sql, "test") - require.NotNil(t, bindData) - require.Equal(t, "select * from `test` . `t` where `a` > ?", bindData.OriginalSQL) - require.Len(t, bindData.Bindings, 2) - bind = bindData.Bindings[1] - require.Equal(t, bindinfo.Evolve, bind.Source) - tk.MustExec("set @@tidb_evolve_plan_baselines=0") + stmt, _, _ := internal.UtilNormalizeWithDefaultDB(t, "select * from t where a > ?") + _, fuzzyDigest := norm.NormalizeStmtForBinding(stmt, norm.WithFuzz(true)) + binding, matched := bindHandle.MatchGlobalBinding(tk.Session(), fuzzyDigest, bindinfo.CollectTableNames(stmt)) + require.True(t, matched) + require.Equal(t, "select * from `test` . `t` where `a` > ?", binding.OriginalSQL) + require.Equal(t, bindinfo.Manual, binding.Source) // Test Source for captured sqls stmtsummary.StmtSummaryByDigestMap.Clear() @@ -361,13 +348,12 @@ func TestBindingSource(t *testing.T) { tk.MustExec("select * from t ignore index(idx_a) where a < 10") tk.MustExec("admin capture bindings") bindHandle.CaptureBaselines() - sql, hash = internal.UtilNormalizeWithDefaultDB(t, "select * from t where a < ?") - bindData = bindHandle.GetBindRecord(hash, sql, "test") - require.NotNil(t, bindData) - require.Equal(t, "select * from `test` . `t` where `a` < ?", bindData.OriginalSQL) - require.Len(t, bindData.Bindings, 1) - bind = bindData.Bindings[0] - require.Equal(t, bindinfo.Capture, bind.Source) + stmt, _, _ = internal.UtilNormalizeWithDefaultDB(t, "select * from t where a < ?") + _, fuzzyDigest = norm.NormalizeStmtForBinding(stmt, norm.WithFuzz(true)) + binding, matched = bindHandle.MatchGlobalBinding(tk.Session(), fuzzyDigest, bindinfo.CollectTableNames(stmt)) + require.True(t, matched) + require.Equal(t, "select * from `test` . `t` where `a` < ?", binding.OriginalSQL) + require.Equal(t, bindinfo.Capture, binding.Source) } func TestCapturedBindingCharset(t *testing.T) { @@ -492,31 +478,6 @@ func TestIssue20417(t *testing.T) { require.Equal(t, "select * from `test` . `t` where `b` = ? and `c` = ?", rows[0][0]) require.Equal(t, "SELECT /*+ use_index(@`sel_1` `test`.`t` `idxb`), no_order_index(@`sel_1` `test`.`t` `idxb`)*/ * FROM `test`.`t` WHERE `b` = 2 AND `c` = 213124", rows[0][1]) tk.MustExec("SET GLOBAL tidb_capture_plan_baselines = off") - - // Test for evolve baseline - internal.UtilCleanBindingEnv(tk, dom) - tk.MustExec("set @@tidb_evolve_plan_baselines=1") - tk.MustExec("create global binding for select * from t WHERE c=3924541 using select /*+ use_index(@sel_1 test.t idxb) */ * from t WHERE c=3924541") - rows = tk.MustQuery("show global bindings").Rows() - require.Len(t, rows, 1) - require.Equal(t, "select * from `test` . `t` where `c` = ?", rows[0][0]) - require.Equal(t, "SELECT /*+ use_index(@`sel_1` `test`.`t` `idxb`)*/ * FROM `test`.`t` WHERE `c` = 3924541", rows[0][1]) - tk.MustExec("select /*+ use_index(t idxc)*/ * from t where c=3924541") - require.Equal(t, "t:idxb", tk.Session().GetSessionVars().StmtCtx.IndexNames[0]) - tk.MustExec("admin flush bindings") - rows = tk.MustQuery("show global bindings").Rows() - require.Len(t, rows, 2) - require.Equal(t, "select * from `test` . `t` where `c` = ?", rows[0][0]) - require.Equal(t, "SELECT /*+ use_index(@`sel_1` `test`.`t` `idxc`), no_order_index(@`sel_1` `test`.`t` `idxc`)*/ * FROM `test`.`t` WHERE `c` = 3924541", rows[0][1]) - require.Equal(t, "pending verify", rows[0][3]) - tk.MustExec("admin evolve bindings") - rows = tk.MustQuery("show global bindings").Rows() - require.Len(t, rows, 2) - require.Equal(t, "select * from `test` . `t` where `c` = ?", rows[0][0]) - require.Equal(t, "SELECT /*+ use_index(@`sel_1` `test`.`t` `idxc`), no_order_index(@`sel_1` `test`.`t` `idxc`)*/ * FROM `test`.`t` WHERE `c` = 3924541", rows[0][1]) - status := rows[0][3].(string) - require.True(t, status == bindinfo.Enabled || status == bindinfo.Rejected) - tk.MustExec("set @@tidb_evolve_plan_baselines=0") } func TestCaptureWithZeroSlowLogThreshold(t *testing.T) { @@ -961,6 +922,7 @@ func TestCaptureFilter(t *testing.T) { } func TestCaptureHints(t *testing.T) { + t.Skip("deprecated") store, dom := testkit.CreateMockStoreAndDomain(t) tk := testkit.NewTestKit(t, store) tk.MustExec("SET GLOBAL tidb_capture_plan_baselines = on") diff --git a/pkg/bindinfo/fuzzy_binding_test.go b/pkg/bindinfo/fuzzy_binding_test.go new file mode 100644 index 0000000000000..94f2034f68d11 --- /dev/null +++ b/pkg/bindinfo/fuzzy_binding_test.go @@ -0,0 +1,510 @@ +// Copyright 2023 PingCAP, 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. + +package bindinfo_test + +import ( + "fmt" + "strings" + "testing" + "time" + + "github.com/pingcap/tidb/pkg/bindinfo" + "github.com/pingcap/tidb/pkg/parser/mysql" + "github.com/pingcap/tidb/pkg/testkit" + "github.com/pingcap/tidb/pkg/types" + "github.com/pingcap/tidb/pkg/util" + "github.com/stretchr/testify/require" +) + +// for testing, only returns Original_sql, Bind_sql, Default_db, Status, Source, Type, Sql_digest +func showBinding(tk *testkit.TestKit, showStmt string) [][]interface{} { + rows := tk.MustQuery(showStmt).Sort().Rows() + result := make([][]interface{}, len(rows)) + for i, r := range rows { + result[i] = append(result[i], r[:4]...) + result[i] = append(result[i], r[8:10]...) + } + return result +} + +func removeAllBindings(tk *testkit.TestKit, global bool) { + scope := "session" + if global { + scope = "global" + } + res := showBinding(tk, fmt.Sprintf("show %v bindings", scope)) + for _, r := range res { + if r[4] == "builtin" { + continue + } + tk.MustExec(fmt.Sprintf("drop %v binding for sql digest '%v'", scope, r[5])) + } + tk.MustQuery(fmt.Sprintf("show %v bindings", scope)).Check(testkit.Rows()) // empty +} + +func TestFuzzyBindingBasic(t *testing.T) { + store := testkit.CreateMockStore(t) + tk1 := testkit.NewTestKit(t, store) + + tk1.MustExec(`use test`) + tk1.MustExec(`create table t (a int, b int, c int, d int, e int, key(a), key(b), key(c), key(d), key(e))`) + tk1.MustExec(`create database test1`) + tk1.MustExec(`use test1`) + tk1.MustExec(`create table t (a int, b int, c int, d int, e int, key(a), key(b), key(c), key(d), key(e))`) + tk1.MustExec(`create database test2`) + tk1.MustExec(`use test2`) + tk1.MustExec(`create table t (a int, b int, c int, d int, e int, key(a), key(b), key(c), key(d), key(e))`) + + for _, scope := range []string{"", "session", "global"} { + tk := testkit.NewTestKit(t, store) + for _, idx := range []string{"a", "b", "c", "d", "e"} { + tk.MustExec("use test") + tk.MustExec(fmt.Sprintf(`create %v binding using select /*+ use_index(t, %v) */ * from *.t`, scope, idx)) + for _, useDB := range []string{"test", "test1", "test2"} { + tk.MustExec("use " + useDB) + for _, testDB := range []string{"", "test.", "test1.", "test2."} { + tk.MustExec(`set @@tidb_opt_enable_fuzzy_binding=1`) // enabled + require.True(t, tk.MustUseIndex(fmt.Sprintf("select * from %vt", testDB), idx)) + tk.MustQuery(`select @@last_plan_from_binding`).Check(testkit.Rows("1")) + require.True(t, tk.MustUseIndex(fmt.Sprintf("select * from %vt", testDB), idx)) + tk.MustQuery(`show warnings`).Check(testkit.Rows()) // no warning + tk.MustExec(`set @@tidb_opt_enable_fuzzy_binding=0`) // disabled + tk.MustQuery(fmt.Sprintf("select * from %vt", testDB)) + tk.MustQuery(`select @@last_plan_from_binding`).Check(testkit.Rows("0")) + } + } + } + } +} + +func TestFuzzyDuplicatedBinding(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec(`use test`) + tk.MustExec(`create table t (a int, b int, c int, d int, e int, key(a), key(b), key(c), key(d), key(e))`) + + tk.MustExec(`create global binding using select * from *.t`) + require.Equal(t, showBinding(tk, "show global bindings"), + [][]interface{}{{"select * from `*` . `t`", "SELECT * FROM `*`.`t`", "", "enabled", "manual", "a17da0a38af0f1d75229c5cd064d5222a610c5e5ef59436be5da1564c16f1013"}}) + + // if duplicated, the old one will be replaced + tk.MustExec(`create global binding using select /*+ use_index(t, a) */ * from *.t`) + require.Equal(t, showBinding(tk, "show global bindings"), + [][]interface{}{{"select * from `*` . `t`", "SELECT /*+ use_index(`t` `a`)*/ * FROM `*`.`t`", "", "enabled", "manual", "a17da0a38af0f1d75229c5cd064d5222a610c5e5ef59436be5da1564c16f1013"}}) + + // if duplicated, the old one will be replaced + tk.MustExec(`create global binding using select /*+ use_index(t, b) */ * from *.t`) + require.Equal(t, showBinding(tk, "show global bindings"), + [][]interface{}{{"select * from `*` . `t`", "SELECT /*+ use_index(`t` `b`)*/ * FROM `*`.`t`", "", "enabled", "manual", "a17da0a38af0f1d75229c5cd064d5222a610c5e5ef59436be5da1564c16f1013"}}) +} + +func TestFuzzyBindingPriority(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + + tk.MustExec(`set @@tidb_opt_enable_fuzzy_binding=1`) + tk.MustExec(`use test`) + tk.MustExec(`create table t1 (a int)`) + tk.MustExec(`create table t2 (a int)`) + tk.MustExec(`create table t3 (a int)`) + tk.MustExec(`create table t4 (a int)`) + tk.MustExec(`create table t5 (a int)`) + + // The less wildcard number, the higher priority. + tk.MustExec(`create global binding using select /*+ leading(t1, t2, t3, t4, t5) */ * from *.t1, *.t2, *.t3, *.t4, *.t5`) + tk.MustExec(`explain format='verbose' select * from t1, t2, t3, t4, t5`) + tk.MustQuery(`show warnings`).Check(testkit.Rows("Note 1105 Using the bindSQL: SELECT /*+ leading(`t1`, `t2`, `t3`, `t4`, `t5`)*/ * FROM ((((`*`.`t1`) JOIN `*`.`t2`) JOIN `*`.`t3`) JOIN `*`.`t4`) JOIN `*`.`t5`")) + + tk.MustExec(`create global binding using select /*+ leading(t1, t2, t3, t4, t5) */ * from *.t1, *.t2, *.t3, *.t4, t5`) + tk.MustExec(`explain format='verbose' select * from t1, t2, t3, t4, t5`) + tk.MustQuery(`show warnings`).Check(testkit.Rows("Note 1105 Using the bindSQL: SELECT /*+ leading(`t1`, `t2`, `t3`, `t4`, `t5`)*/ * FROM ((((`*`.`t1`) JOIN `*`.`t2`) JOIN `*`.`t3`) JOIN `*`.`t4`) JOIN `test`.`t5`")) + + tk.MustExec(`create global binding using select /*+ leading(t1, t2, t3, t4, t5) */ * from *.t1, *.t2, *.t3, t4, t5`) + tk.MustExec(`explain format='verbose' select * from t1, t2, t3, t4, t5`) + tk.MustQuery(`show warnings`).Check(testkit.Rows("Note 1105 Using the bindSQL: SELECT /*+ leading(`t1`, `t2`, `t3`, `t4`, `t5`)*/ * FROM ((((`*`.`t1`) JOIN `*`.`t2`) JOIN `*`.`t3`) JOIN `test`.`t4`) JOIN `test`.`t5`")) + + tk.MustExec(`create global binding using select /*+ leading(t1, t2, t3, t4, t5) */ * from *.t1, *.t2, t3, t4, t5`) + tk.MustExec(`explain format='verbose' select * from t1, t2, t3, t4, t5`) + tk.MustQuery(`show warnings`).Check(testkit.Rows("Note 1105 Using the bindSQL: SELECT /*+ leading(`t1`, `t2`, `t3`, `t4`, `t5`)*/ * FROM ((((`*`.`t1`) JOIN `*`.`t2`) JOIN `test`.`t3`) JOIN `test`.`t4`) JOIN `test`.`t5`")) + + tk.MustExec(`create global binding using select /*+ leading(t1, t2, t3, t4, t5) */ * from *.t1, t2, t3, t4, t5`) + tk.MustExec(`explain format='verbose' select * from t1, t2, t3, t4, t5`) + tk.MustQuery(`show warnings`).Check(testkit.Rows("Note 1105 Using the bindSQL: SELECT /*+ leading(`t1`, `t2`, `t3`, `t4`, `t5`)*/ * FROM ((((`*`.`t1`) JOIN `test`.`t2`) JOIN `test`.`t3`) JOIN `test`.`t4`) JOIN `test`.`t5`")) + + tk.MustExec(`create global binding using select /*+ leading(t1, t2, t3, t4, t5) */ * from t1, t2, t3, t4, t5`) + tk.MustExec(`explain format='verbose' select * from t1, t2, t3, t4, t5`) + tk.MustQuery(`show warnings`).Check(testkit.Rows("Note 1105 Using the bindSQL: SELECT /*+ leading(`t1`, `t2`, `t3`, `t4`, `t5`)*/ * FROM ((((`test`.`t1`) JOIN `test`.`t2`) JOIN `test`.`t3`) JOIN `test`.`t4`) JOIN `test`.`t5`")) + + // Session binding's priority is higher than global binding's. + tk.MustExec(`create session binding using select /*+ leading(t1, t2, t3, t4, t5) */ * from *.t1, *.t2, *.t3, *.t4, *.t5`) + tk.MustExec(`explain format='verbose' select * from t1, t2, t3, t4, t5`) + tk.MustQuery(`show warnings`).Check(testkit.Rows("Note 1105 Using the bindSQL: SELECT /*+ leading(`t1`, `t2`, `t3`, `t4`, `t5`)*/ * FROM ((((`*`.`t1`) JOIN `*`.`t2`) JOIN `*`.`t3`) JOIN `*`.`t4`) JOIN `*`.`t5`")) +} + +func TestCreateUpdateFuzzyBinding(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + + tk.MustExec(`use test`) + tk.MustExec(`create table t (a int)`) + + // drop/show/update binding for sql digest can work for global universal bindings + tk.MustExec(`create global binding using select * from *.t`) + require.Equal(t, showBinding(tk, "show global bindings"), + [][]interface{}{{"select * from `*` . `t`", "SELECT * FROM `*`.`t`", "", "enabled", "manual", "a17da0a38af0f1d75229c5cd064d5222a610c5e5ef59436be5da1564c16f1013"}}) + require.Equal(t, showBinding(tk, "show global bindings"), [][]interface{}{ + {"select * from `*` . `t`", "SELECT * FROM `*`.`t`", "", "enabled", "manual", "a17da0a38af0f1d75229c5cd064d5222a610c5e5ef59436be5da1564c16f1013"}}) + tk.MustExec(`set binding disabled for sql digest 'a17da0a38af0f1d75229c5cd064d5222a610c5e5ef59436be5da1564c16f1013'`) + require.Equal(t, showBinding(tk, "show global bindings"), [][]interface{}{ + {"select * from `*` . `t`", "SELECT * FROM `*`.`t`", "", "disabled", "manual", "a17da0a38af0f1d75229c5cd064d5222a610c5e5ef59436be5da1564c16f1013"}}) + tk.MustExec(`set binding enabled for sql digest 'a17da0a38af0f1d75229c5cd064d5222a610c5e5ef59436be5da1564c16f1013'`) + require.Equal(t, showBinding(tk, "show global bindings"), [][]interface{}{ + {"select * from `*` . `t`", "SELECT * FROM `*`.`t`", "", "enabled", "manual", "a17da0a38af0f1d75229c5cd064d5222a610c5e5ef59436be5da1564c16f1013"}}) + tk.MustExec(`drop global binding for sql digest 'a17da0a38af0f1d75229c5cd064d5222a610c5e5ef59436be5da1564c16f1013'`) + require.Equal(t, showBinding(tk, "show global bindings"), [][]interface{}{}) + + // drop/show/update binding for sql digest can work for session universal bindings + tk.MustExec(`create session binding using select * from *.t`) + require.Equal(t, showBinding(tk, "show session bindings"), + [][]interface{}{{"select * from `*` . `t`", "SELECT * FROM `*`.`t`", "", "enabled", "manual", "a17da0a38af0f1d75229c5cd064d5222a610c5e5ef59436be5da1564c16f1013"}}) + require.Equal(t, showBinding(tk, "show session bindings"), [][]interface{}{ + {"select * from `*` . `t`", "SELECT * FROM `*`.`t`", "", "enabled", "manual", "a17da0a38af0f1d75229c5cd064d5222a610c5e5ef59436be5da1564c16f1013"}}) + tk.MustExec(`drop session binding for sql digest 'a17da0a38af0f1d75229c5cd064d5222a610c5e5ef59436be5da1564c16f1013'`) + require.Equal(t, showBinding(tk, "show session bindings"), [][]interface{}{}) +} + +func TestFuzzyBindingSwitch(t *testing.T) { + store := testkit.CreateMockStore(t) + tk1 := testkit.NewTestKit(t, store) + + tk1.MustExec(`use test`) + tk1.MustExec(`create table t (a int, b int, c int, d int, key(a), key(b), key(c), key(d))`) + tk1.MustExec(`create database test1`) + + // switch can work for both global and session universal bindings + // test for session bindings + tk1.MustExec(`create session binding using select /*+ use_index(t, b) */ * from *.t`) + tk1.MustExec(`use test1`) + tk1.MustQuery(`select * from test.t`).Check(testkit.Rows()) + tk1.MustQuery(`select @@last_plan_from_binding`).Check(testkit.Rows("0")) + tk1.MustExec(`set @@tidb_opt_enable_fuzzy_binding=1`) + tk1.MustUseIndex(`select * from test.t`, "b") + tk1.MustQuery(`select @@last_plan_from_binding`).Check(testkit.Rows("1")) + tk1.MustExec(`set @@tidb_opt_enable_fuzzy_binding=0`) + tk1.MustQuery(`select * from test.t`).Check(testkit.Rows()) + tk1.MustQuery(`select @@last_plan_from_binding`).Check(testkit.Rows("0")) + + // test for global bindings + tk2 := testkit.NewTestKit(t, store) + tk2.MustExec(`use test1`) + tk2.MustExec(`create global binding using select /*+ use_index(t, b) */ * from *.t`) + tk2.MustQuery(`select * from test.t`).Check(testkit.Rows()) + tk2.MustQuery(`select @@last_plan_from_binding`).Check(testkit.Rows("0")) + tk2.MustExec(`set @@tidb_opt_enable_fuzzy_binding=1`) + tk2.MustUseIndex(`select * from test.t`, "b") + tk2.MustQuery(`select @@last_plan_from_binding`).Check(testkit.Rows("1")) + tk2.MustExec(`set @@tidb_opt_enable_fuzzy_binding=0`) + tk2.MustQuery(`select * from test.t`).Check(testkit.Rows()) + tk2.MustQuery(`select @@last_plan_from_binding`).Check(testkit.Rows("0")) + + // the default value is off + tk3 := testkit.NewTestKit(t, store) + tk3.MustQuery(`select @@tidb_opt_enable_fuzzy_binding`).Check(testkit.Rows("0")) + tk3.MustQuery(`show session variables like 'tidb_opt_enable_fuzzy_binding'`).Check(testkit.Rows("tidb_opt_enable_fuzzy_binding OFF")) + tk3.MustQuery(`show global variables like 'tidb_opt_enable_fuzzy_binding'`).Check(testkit.Rows("tidb_opt_enable_fuzzy_binding OFF")) +} + +func TestFuzzyBindingSetVar(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec(`use test`) + tk.MustExec(`create table t (a int, b int, key(a), key(b))`) + tk.MustExec(`create global binding using select /*+ use_index(t, a) */ * from *.t`) + + tk.MustExec(`set @@tidb_opt_enable_fuzzy_binding=0`) + tk.MustExec(`select * from t`) + tk.MustQuery(`select @@last_plan_from_binding`).Check(testkit.Rows("0")) + tk.MustExec(`select /*+ set_var(tidb_opt_enable_fuzzy_binding=1) */ * from t`) + tk.MustQuery(`select @@last_plan_from_binding`).Check(testkit.Rows("1")) + tk.MustExec(`select /*+ set_var(tidb_opt_enable_fuzzy_binding=0) */ * from t`) + tk.MustQuery(`select @@last_plan_from_binding`).Check(testkit.Rows("0")) + + tk.MustExec(`set @@tidb_opt_enable_fuzzy_binding=1`) + tk.MustExec(`select * from t`) + tk.MustQuery(`select @@last_plan_from_binding`).Check(testkit.Rows("1")) + tk.MustExec(`select /*+ set_var(tidb_opt_enable_fuzzy_binding=0) */ * from t`) + tk.MustQuery(`select @@last_plan_from_binding`).Check(testkit.Rows("0")) + tk.MustExec(`select /*+ set_var(tidb_opt_enable_fuzzy_binding=1) */ * from t`) + tk.MustQuery(`select @@last_plan_from_binding`).Check(testkit.Rows("1")) +} + +func TestFuzzyBindingGC(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec(`use test`) + tk.MustExec(`create table t (a int, b int, c int, d int, key(a), key(b), key(c), key(d))`) + + tk.MustExec(`create global binding using select /*+ use_index(t, b) */ * from *.t`) + require.Equal(t, showBinding(tk, "show global bindings"), + [][]interface{}{{"select * from `*` . `t`", "SELECT /*+ use_index(`t` `b`)*/ * FROM `*`.`t`", "", "enabled", "manual", "a17da0a38af0f1d75229c5cd064d5222a610c5e5ef59436be5da1564c16f1013"}}) + tk.MustExec(`drop global binding for sql digest 'a17da0a38af0f1d75229c5cd064d5222a610c5e5ef59436be5da1564c16f1013'`) + require.Equal(t, showBinding(tk, "show global bindings"), [][]interface{}{}) // empty + tk.MustQuery(`select bind_sql, status from mysql.bind_info where source != 'builtin'`).Check( + testkit.Rows("SELECT /*+ use_index(`t` `b`)*/ * FROM `*`.`t` deleted")) // status=deleted + + updateTime := time.Now().Add(-(15 * bindinfo.Lease)) + updateTimeStr := types.NewTime(types.FromGoTime(updateTime), mysql.TypeTimestamp, 3).String() + tk.MustExec(fmt.Sprintf("update mysql.bind_info set update_time = '%v' where source != 'builtin'", updateTimeStr)) + bindHandle := bindinfo.NewGlobalBindingHandle(&mockSessionPool{tk.Session()}) + require.NoError(t, bindHandle.GCGlobalBinding()) + tk.MustQuery(`select bind_sql, status from mysql.bind_info where source != 'builtin'`).Check(testkit.Rows()) // empty after GC +} + +func TestFuzzyBindingInList(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec(`create database test1`) + tk.MustExec(`use test1`) + tk.MustExec(`create table t1 (a int)`) + tk.MustExec(`create table t2 (a int)`) + tk.MustExec(`create database test2`) + tk.MustExec(`use test2`) + tk.MustExec(`create table t1 (a int)`) + tk.MustExec(`create table t2 (a int)`) + + tk.MustExec(`use test`) + tk.MustExec(`set @@tidb_opt_enable_fuzzy_binding=1`) + tk.MustExec(`create global binding using select * from *.t1 where a in (1,2,3)`) + tk.MustExec(`explain format='verbose' select * from test1.t1 where a in (1)`) + tk.MustQuery(`show warnings`).Check(testkit.Rows("Note 1105 Using the bindSQL: SELECT * FROM `*`.`t1` WHERE `a` IN (1,2,3)")) + tk.MustExec(`explain format='verbose' select * from test2.t1 where a in (1,2,3,4,5)`) + tk.MustQuery(`show warnings`).Check(testkit.Rows("Note 1105 Using the bindSQL: SELECT * FROM `*`.`t1` WHERE `a` IN (1,2,3)")) + tk.MustExec(`use test1`) + tk.MustExec(`explain format='verbose' select * from t1 where a in (1)`) + tk.MustQuery(`show warnings`).Check(testkit.Rows("Note 1105 Using the bindSQL: SELECT * FROM `*`.`t1` WHERE `a` IN (1,2,3)")) + + tk.MustExec(`create global binding using select * from *.t1, *.t2 where t1.a in (1) and t2.a in (2)`) + for _, currentDB := range []string{"test1", "test2"} { + for _, t1DB := range []string{"", "test1.", "test2."} { + for _, t2DB := range []string{"", "test1.", "test2."} { + for _, t1Cond := range []string{"(1)", "(1,2,3)", "(1,1,1,1,1,1,2,2,2)"} { + for _, t2Cond := range []string{"(1)", "(1,2,3)", "(1,1,1,1,1,1,2,2,2)"} { + tk.MustExec(`use ` + currentDB) + sql := fmt.Sprintf(`explain format='verbose' select * from %st1, %st2 where t1.a in %s and t2.a in %s`, t1DB, t2DB, t1Cond, t2Cond) + tk.MustExec(sql) + tk.MustQuery(`show warnings`).Check(testkit.Rows("Note 1105 Using the bindSQL: SELECT * FROM (`*`.`t1`) JOIN `*`.`t2` WHERE `t1`.`a` IN (1) AND `t2`.`a` IN (2)")) + } + } + } + } + } +} + +func TestFuzzyBindingPlanCache(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec(`use test`) + tk.MustExec(`set @@tidb_opt_enable_fuzzy_binding=1`) + tk.MustExec(`create table t (a int, b int, c int, d int, e int, key(a), key(b), key(c), key(d))`) + + hasPlan := func(operator, accessInfo string) { + tkProcess := tk.Session().ShowProcess() + ps := []*util.ProcessInfo{tkProcess} + tk.Session().SetSessionManager(&testkit.MockSessionManager{PS: ps}) + rows := tk.MustQuery(fmt.Sprintf("explain for connection %d", tkProcess.ID)).Rows() + flag := false + for _, row := range rows { + op := row[0].(string) + info := row[4].(string) + if strings.Contains(op, operator) && strings.Contains(info, accessInfo) { + flag = true + break + } + } + require.Equal(t, flag, true) + } + + tk.MustExec(`prepare stmt from 'select * from t where e > ?'`) + tk.MustExec(`set @v=0`) + tk.MustExec(`execute stmt using @v`) + hasPlan("TableFullScan", "") + + tk.MustExec(`create database test2`) + tk.MustExec(`use test2`) + tk.MustExec(`create global binding using select /*+ use_index(t, a) */ * from *.t where e > 1`) + tk.MustExec(`execute stmt using @v`) + hasPlan("IndexFullScan", "index:a(a)") + + tk.MustExec(`create global binding using select /*+ use_index(t, b) */ * from *.t where e > 1`) + tk.MustExec(`execute stmt using @v`) + hasPlan("IndexFullScan", "index:b(b)") + + tk.MustExec(`create global binding using select /*+ use_index(t, c) */ * from *.t where e > 1`) + tk.MustExec(`execute stmt using @v`) + hasPlan("IndexFullScan", "index:c(c)") +} + +func TestFuzzyBindingHints(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec(`use test`) + + for _, db := range []string{"db1", "db2", "db3"} { + tk.MustExec(`create database ` + db) + tk.MustExec(`use ` + db) + tk.MustExec(`create table t1 (a int, b int, c int, d int, key(a), key(b), key(c), key(d))`) + tk.MustExec(`create table t2 (a int, b int, c int, d int, key(a), key(b), key(c), key(d))`) + tk.MustExec(`create table t3 (a int, b int, c int, d int, key(a), key(b), key(c), key(d))`) + } + tk.MustExec(`set @@tidb_opt_enable_fuzzy_binding=1`) + + for _, c := range []struct { + binding string + qTemplate string + }{ + // use index + {`create global binding using select /*+ use_index(t1, c) */ * from *.t1 where a=1`, + `select * from %st1 where a=1000`}, + {`create global binding using select /*+ use_index(t1, c) */ * from *.t1 where d<1`, + `select * from %st1 where d<10000`}, + {`create global binding using select /*+ use_index(t1, c) */ * from *.t1, *.t2 where t1.d<1`, + `select * from %st1, t2 where t1.d<100`}, + {`create global binding using select /*+ use_index(t1, c) */ * from *.t1, *.t2 where t1.d<1`, + `select * from t1, %st2 where t1.d<100`}, + {`create global binding using select /*+ use_index(t1, c), use_index(t2, a) */ * from *.t1, *.t2 where t1.d<1`, + `select * from %st1, t2 where t1.d<100`}, + {`create global binding using select /*+ use_index(t1, c), use_index(t2, a) */ * from *.t1, *.t2 where t1.d<1`, + `select * from t1, %st2 where t1.d<100`}, + {`create global binding using select /*+ use_index(t1, c), use_index(t2, a) */ * from *.t1, *.t2, *.t3 where t1.d<1`, + `select * from %st1, t2, t3 where t1.d<100`}, + {`create global binding using select /*+ use_index(t1, c), use_index(t2, a) */ * from *.t1, *.t2, *.t3 where t1.d<1`, + `select * from t1, t2, %st3 where t1.d<100`}, + + // ignore index + {`create global binding using select /*+ ignore_index(t1, b) */ * from *.t1 where b=1`, + `select * from %st1 where b=1000`}, + {`create global binding using select /*+ ignore_index(t1, b) */ * from *.t1 where b>1`, + `select * from %st1 where b>1000`}, + {`create global binding using select /*+ ignore_index(t1, b) */ * from *.t1 where b in (1,2)`, + `select * from %st1 where b in (1)`}, + {`create global binding using select /*+ ignore_index(t1, b) */ * from *.t1 where b in (1,2)`, + `select * from %st1 where b in (1,2,3,4,5)`}, + + // order index hint + {`create global binding using select /*+ order_index(t1, a) */ a from *.t1 where a<10 order by a limit 10`, + `select a from %st1 where a<10000 order by a limit 10`}, + {`create global binding using select /*+ order_index(t1, b) */ b from *.t1 where b>10 order by b limit 1111`, + `select b from %st1 where b>2 order by b limit 10`}, + + // no order index hint + {`create global binding using select /*+ no_order_index(t1, c) */ c from *.t1 where c<10 order by c limit 10`, + `select c from %st1 where c<10000 order by c limit 10`}, + {`create global binding using select /*+ no_order_index(t1, d) */ d from *.t1 where d>10 order by d limit 1111`, + `select d from %st1 where d>2 order by d limit 10`}, + + // agg hint + {`create global binding using select /*+ hash_agg() */ count(*) from *.t1 group by a`, + `select count(*) from %st1 group by a`}, + {`create global binding using select /*+ stream_agg() */ count(*) from *.t1 group by b`, + `select count(*) from %st1 group by b`}, + + // to_cop hint + {`create global binding using select /*+ agg_to_cop() */ sum(a) from *.t1`, + `select sum(a) from %st1`}, + {`create global binding using select /*+ limit_to_cop() */ a from *.t1 limit 10`, + `select a from %st1 limit 101`}, + + // index merge hint + {`create global binding using select /*+ use_index_merge(t1, c, d) */ * from *.t1 where c=1 or d=1`, + `select * from %st1 where c=1000 or d=1000`}, + {`create global binding using select /*+ no_index_merge() */ * from *.t1 where a=1 or b=1`, + `select * from %st1 where a=1000 or b=1000`}, + + // join type hint + {`create global binding using select /*+ hash_join(t1) */ * from *.t1, *.t2 where t1.a=t2.a`, + `select * from %st1, t2 where t1.a=t2.a`}, + {`create global binding using select /*+ hash_join(t2) */ * from *.t1, *.t2 where t1.a=t2.a`, + `select * from t1, %st2 where t1.a=t2.a`}, + {`create global binding using select /*+ hash_join(t2) */ * from *.t1, *.t2, *.t3 where t1.a=t2.a and t3.b=t2.b`, + `select * from t1, %st2, t3 where t1.a=t2.a and t3.b=t2.b`}, + {`create global binding using select /*+ hash_join_build(t1) */ * from *.t1, *.t2 where t1.a=t2.a`, + `select * from t1, %st2 where t1.a=t2.a`}, + {`create global binding using select /*+ hash_join_probe(t1) */ * from *.t1, *.t2 where t1.a=t2.a`, + `select * from t1, %st2 where t1.a=t2.a`}, + {`create global binding using select /*+ merge_join(t1) */ * from *.t1, *.t2 where t1.a=t2.a`, + `select * from %st1, t2 where t1.a=t2.a`}, + {`create global binding using select /*+ merge_join(t2) */ * from *.t1, *.t2 where t1.a=t2.a`, + `select * from t1, %st2 where t1.a=t2.a`}, + {`create global binding using select /*+ merge_join(t2) */ * from *.t1, *.t2, *.t3 where t1.a=t2.a and t3.b=t2.b`, + `select * from t1, %st2, t3 where t1.a=t2.a and t3.b=t2.b`}, + {`create global binding using select /*+ inl_join(t1) */ * from *.t1, *.t2 where t1.a=t2.a`, + `select * from %st1, t2 where t1.a=t2.a`}, + {`create global binding using select /*+ inl_join(t2) */ * from *.t1, *.t2 where t1.a=t2.a`, + `select * from t1, %st2 where t1.a=t2.a`}, + {`create global binding using select /*+ inl_join(t2) */ * from *.t1, *.t2, *.t3 where t1.a=t2.a and t3.b=t2.b`, + `select * from t1, %st2, t3 where t1.a=t2.a and t3.b=t2.b`}, + + // no join type hint + {`create global binding using select /*+ no_hash_join(t1) */ * from *.t1, *.t2 where t1.b=t2.b`, + `select * from %st1, t2 where t1.b=t2.b`}, + {`create global binding using select /*+ no_hash_join(t2) */ * from *.t1, *.t2 where t1.c=t2.c`, + `select * from t1, %st2 where t1.c=t2.c`}, + {`create global binding using select /*+ no_hash_join(t2) */ * from *.t1, *.t2, *.t3 where t1.a=t2.a and t3.b=t2.b`, + `select * from t1, %st2, t3 where t1.a=t2.a and t3.b=t2.b`}, + {`create global binding using select /*+ no_merge_join(t1) */ * from *.t1, *.t2 where t1.b=t2.b`, + `select * from %st1, t2 where t1.b=t2.b`}, + {`create global binding using select /*+ no_merge_join(t2) */ * from *.t1, *.t2 where t1.c=t2.c`, + `select * from t1, %st2 where t1.c=t2.c`}, + {`create global binding using select /*+ no_merge_join(t2) */ * from *.t1, *.t2, *.t3 where t1.a=t2.a and t3.b=t2.b`, + `select * from t1, %st2, t3 where t1.a=t2.a and t3.b=t2.b`}, + {`create global binding using select /*+ no_index_join(t1) */ * from *.t1, *.t2 where t1.b=t2.b`, + `select * from %st1, t2 where t1.b=t2.b`}, + {`create global binding using select /*+ no_index_join(t2) */ * from *.t1, *.t2 where t1.c=t2.c`, + `select * from t1, %st2 where t1.c=t2.c`}, + {`create global binding using select /*+ no_index_join(t2) */ * from *.t1, *.t2, *.t3 where t1.a=t2.a and t3.b=t2.b`, + `select * from t1, %st2, t3 where t1.a=t2.a and t3.b=t2.b`}, + + // join order hint + {`create global binding using select /*+ leading(t2) */ * from *.t1, *.t2 where t1.b=t2.b`, + `select * from %st1, t2 where t1.b=t2.b`}, + {`create global binding using select /*+ leading(t2) */ * from *.t1, *.t2 where t1.c=t2.c`, + `select * from t1, %st2 where t1.c=t2.c`}, + {`create global binding using select /*+ leading(t2, t1) */ * from *.t1, *.t2 where t1.c=t2.c`, + `select * from t1, %st2 where t1.c=t2.c`}, + {`create global binding using select /*+ leading(t1, t2) */ * from *.t1, *.t2 where t1.c=t2.c`, + `select * from t1, %st2 where t1.c=t2.c`}, + {`create global binding using select /*+ leading(t1) */ * from *.t1, *.t2, *.t3 where t1.a=t2.a and t3.b=t2.b`, + `select * from t1, %st2, t3 where t1.a=t2.a and t3.b=t2.b`}, + {`create global binding using select /*+ leading(t2) */ * from *.t1, *.t2, *.t3 where t1.a=t2.a and t3.b=t2.b`, + `select * from t1, %st2, t3 where t1.a=t2.a and t3.b=t2.b`}, + {`create global binding using select /*+ leading(t2,t3) */ * from *.t1, *.t2, *.t3 where t1.a=t2.a and t3.b=t2.b`, + `select * from t1, %st2, t3 where t1.a=t2.a and t3.b=t2.b`}, + {`create global binding using select /*+ leading(t2,t3,t1) */ * from *.t1, *.t2, *.t3 where t1.a=t2.a and t3.b=t2.b`, + `select * from t1, %st2, t3 where t1.a=t2.a and t3.b=t2.b`}, + } { + removeAllBindings(tk, true) + tk.MustExec(c.binding) + for _, currentDB := range []string{"db1", "db2", "db3"} { + tk.MustExec(`use ` + currentDB) + for _, db := range []string{"db1.", "db2.", "db3.", ""} { + query := fmt.Sprintf(c.qTemplate, db) + tk.MustExec(query) + tk.MustQuery(`show warnings`).Check(testkit.Rows()) // no warning + tk.MustExec(query) + tk.MustQuery(`select @@last_plan_from_binding`).Check(testkit.Rows("1")) + } + } + } +} diff --git a/pkg/bindinfo/global_handle.go b/pkg/bindinfo/global_handle.go new file mode 100644 index 0000000000000..07208a9daafe3 --- /dev/null +++ b/pkg/bindinfo/global_handle.go @@ -0,0 +1,758 @@ +// Copyright 2019 PingCAP, 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. + +package bindinfo + +import ( + "context" + "fmt" + "strings" + "sync" + "sync/atomic" + "time" + + "github.com/pingcap/errors" + "github.com/pingcap/tidb/pkg/bindinfo/norm" + "github.com/pingcap/tidb/pkg/metrics" + "github.com/pingcap/tidb/pkg/parser" + "github.com/pingcap/tidb/pkg/parser/ast" + "github.com/pingcap/tidb/pkg/parser/format" + "github.com/pingcap/tidb/pkg/parser/mysql" + "github.com/pingcap/tidb/pkg/parser/terror" + "github.com/pingcap/tidb/pkg/sessionctx" + "github.com/pingcap/tidb/pkg/sessionctx/variable" + "github.com/pingcap/tidb/pkg/types" + driver "github.com/pingcap/tidb/pkg/types/parser_driver" + "github.com/pingcap/tidb/pkg/util/chunk" + "github.com/pingcap/tidb/pkg/util/hint" + "github.com/pingcap/tidb/pkg/util/logutil" + utilparser "github.com/pingcap/tidb/pkg/util/parser" + "go.uber.org/zap" +) + +// GlobalBindingHandle is used to handle all global sql bind operations. +type GlobalBindingHandle interface { + // Methods for create, get, drop global sql bindings. + + // MatchGlobalBinding returns the matched binding for this statement. + MatchGlobalBinding(sctx sessionctx.Context, fuzzyDigest string, tableNames []*ast.TableName) (matchedBinding Binding, isMatched bool) + + // GetAllGlobalBindings returns all bind records in cache. + GetAllGlobalBindings() (bindings Bindings) + + // CreateGlobalBinding creates a Bindings to the storage and the cache. + // It replaces all the exists bindings for the same normalized SQL. + CreateGlobalBinding(sctx sessionctx.Context, binding Binding) (err error) + + // DropGlobalBinding drop Bindings to the storage and Bindings int the cache. + DropGlobalBinding(sqlDigest string) (deletedRows uint64, err error) + + // SetGlobalBindingStatus set a Bindings's status to the storage and bind cache. + SetGlobalBindingStatus(newStatus, sqlDigest string) (ok bool, err error) + + // AddInvalidGlobalBinding adds Bindings which needs to be deleted into invalidBindRecordMap. + AddInvalidGlobalBinding(invalidBinding Binding) + + // DropInvalidGlobalBinding executes the drop Bindings tasks. + DropInvalidGlobalBinding() + + // Methods for load and clear global sql bindings. + + // Reset is to reset the BindHandle and clean old info. + Reset() + + // LoadFromStorageToCache loads global bindings from storage to the memory cache. + LoadFromStorageToCache(fullLoad bool) (err error) + + // GCGlobalBinding physically removes the deleted bind records in mysql.bind_info. + GCGlobalBinding() (err error) + + // Methods for memory control. + + // Size returns the size of bind info cache. + Size() int + + // SetBindCacheCapacity reset the capacity for the bindCache. + SetBindCacheCapacity(capacity int64) + + // GetMemUsage returns the memory usage for the bind cache. + GetMemUsage() (memUsage int64) + + // GetMemCapacity returns the memory capacity for the bind cache. + GetMemCapacity() (memCapacity int64) + + // Clear resets the bind handle. It is only used for test. + Clear() + + // FlushGlobalBindings flushes the Bindings in temp maps to storage and loads them into cache. + FlushGlobalBindings() error + + // Methods for Auto Capture. + + // CaptureBaselines is used to automatically capture plan baselines. + CaptureBaselines() + + variable.Statistics +} + +// globalBindingHandle is used to handle all global sql bind operations. +type globalBindingHandle struct { + sPool SessionPool + + bindingCache atomic.Pointer[bindCache] + + // fuzzyDigestMap is used to support fuzzy matching. + // fuzzyDigest is the digest calculated after eliminating all DB names, e.g. `select * from test.t` -> `select * from t` -> fuzzyDigest. + // exactDigest is the digest where all DB names are kept, e.g. `select * from test.t` -> exactDigest. + fuzzyDigestMap atomic.Value // map[string][]string fuzzyDigest --> exactDigests + + // lastTaskTime records the last update time for the global sql bind cache. + // This value is used to avoid reload duplicated bindings from storage. + lastUpdateTime atomic.Value + + // invalidBindRecordMap indicates the invalid bindings found during querying. + // A binding will be deleted from this map, after 2 bind-lease, after it is dropped from the kv. + invalidBindings *invalidBindingCache +} + +// Lease influences the duration of loading bind info and handling invalid bind. +var Lease = 3 * time.Second + +const ( + // OwnerKey is the bindinfo owner path that is saved to etcd. + OwnerKey = "/tidb/bindinfo/owner" + // Prompt is the prompt for bindinfo owner manager. + Prompt = "bindinfo" + // BuiltinPseudoSQL4BindLock is used to simulate LOCK TABLE for mysql.bind_info. + BuiltinPseudoSQL4BindLock = "builtin_pseudo_sql_for_bind_lock" + + // LockBindInfoSQL simulates LOCK TABLE by updating a same row in each pessimistic transaction. + LockBindInfoSQL = `UPDATE mysql.bind_info SET source= 'builtin' WHERE original_sql= 'builtin_pseudo_sql_for_bind_lock'` + + // StmtRemoveDuplicatedPseudoBinding is used to remove duplicated pseudo binding. + // After using BR to sync bind_info between two clusters, the pseudo binding may be duplicated, and + // BR use this statement to remove duplicated rows, and this SQL should only be executed by BR. + StmtRemoveDuplicatedPseudoBinding = `DELETE FROM mysql.bind_info + WHERE original_sql='builtin_pseudo_sql_for_bind_lock' AND + _tidb_rowid NOT IN ( -- keep one arbitrary pseudo binding + SELECT _tidb_rowid FROM mysql.bind_info WHERE original_sql='builtin_pseudo_sql_for_bind_lock' limit 1)` +) + +// NewGlobalBindingHandle creates a new GlobalBindingHandle. +func NewGlobalBindingHandle(sPool SessionPool) GlobalBindingHandle { + handle := &globalBindingHandle{sPool: sPool} + handle.Reset() + return handle +} + +func (h *globalBindingHandle) getCache() *bindCache { + return h.bindingCache.Load() +} + +func (h *globalBindingHandle) setCache(c *bindCache) { + // TODO: update the global cache in-place instead of replacing it and remove this function. + h.bindingCache.Store(c) +} + +func (h *globalBindingHandle) getFuzzyDigestMap() map[string][]string { + return h.fuzzyDigestMap.Load().(map[string][]string) +} + +func (h *globalBindingHandle) setFuzzyDigestMap(m map[string][]string) { + h.fuzzyDigestMap.Store(m) +} + +func buildFuzzyDigestMap(bindRecords []Bindings) map[string][]string { + m := make(map[string][]string) + p := parser.New() + for _, bindRecord := range bindRecords { + for _, binding := range bindRecord { + stmt, err := p.ParseOneStmt(binding.BindSQL, binding.Charset, binding.Collation) + if err != nil { + logutil.BgLogger().Warn("parse bindSQL failed", zap.String("bindSQL", binding.BindSQL), zap.Error(err)) + p = parser.New() + continue + } + _, fuzzyDigest := norm.NormalizeStmtForBinding(stmt, norm.WithFuzz(true)) + m[fuzzyDigest] = append(m[fuzzyDigest], binding.SQLDigest) + } + } + return m +} + +// Reset is to reset the BindHandle and clean old info. +func (h *globalBindingHandle) Reset() { + h.lastUpdateTime.Store(types.ZeroTimestamp) + h.invalidBindings = newInvalidBindingCache() + h.setCache(newBindCache()) + variable.RegisterStatistics(h) +} + +func (h *globalBindingHandle) getLastUpdateTime() types.Time { + return h.lastUpdateTime.Load().(types.Time) +} + +func (h *globalBindingHandle) setLastUpdateTime(t types.Time) { + h.lastUpdateTime.Store(t) +} + +// LoadFromStorageToCache loads bindings from the storage into the cache. +func (h *globalBindingHandle) LoadFromStorageToCache(fullLoad bool) (err error) { + var lastUpdateTime types.Time + var timeCondition string + var newCache *bindCache + if fullLoad { + lastUpdateTime = types.ZeroTimestamp + timeCondition = "" + newCache = newBindCache() + } else { + lastUpdateTime = h.getLastUpdateTime() + timeCondition = fmt.Sprintf("WHERE update_time>'%s'", lastUpdateTime.String()) + newCache, err = h.getCache().Copy() + if err != nil { + return err + } + } + + selectStmt := fmt.Sprintf(`SELECT original_sql, bind_sql, default_db, status, create_time, + update_time, charset, collation, source, sql_digest, plan_digest FROM mysql.bind_info + %s ORDER BY update_time, create_time`, timeCondition) + + return h.callWithSCtx(false, func(sctx sessionctx.Context) error { + rows, _, err := execRows(sctx, selectStmt) + if err != nil { + return err + } + + defer func() { + h.setLastUpdateTime(lastUpdateTime) + h.setCache(newCache) // TODO: update it in place + h.setFuzzyDigestMap(buildFuzzyDigestMap(newCache.GetAllBindings())) + }() + + for _, row := range rows { + // Skip the builtin record which is designed for binding synchronization. + if row.GetString(0) == BuiltinPseudoSQL4BindLock { + continue + } + sqlDigest, binding, err := newBinding(sctx, row) + + // Update lastUpdateTime to the newest one. + // Even if this one is an invalid bind. + if binding.UpdateTime.Compare(lastUpdateTime) > 0 { + lastUpdateTime = binding.UpdateTime + } + + if err != nil { + logutil.BgLogger().Warn("failed to generate bind record from data row", zap.String("category", "sql-bind"), zap.Error(err)) + continue + } + + oldRecord := newCache.GetBinding(sqlDigest) + newRecord := removeDeletedBindings(merge(oldRecord, []Binding{binding})) + if len(newRecord) > 0 { + err = newCache.SetBinding(sqlDigest, newRecord) + if err != nil { + // When the memory capacity of bing_cache is not enough, + // there will be some memory-related errors in multiple places. + // Only needs to be handled once. + logutil.BgLogger().Warn("BindHandle.Update", zap.String("category", "sql-bind"), zap.Error(err)) + } + } else { + newCache.RemoveBinding(sqlDigest) + } + updateMetrics(metrics.ScopeGlobal, oldRecord, newCache.GetBinding(sqlDigest), true) + } + return nil + }) +} + +// CreateGlobalBinding creates a Bindings to the storage and the cache. +// It replaces all the exists bindings for the same normalized SQL. +func (h *globalBindingHandle) CreateGlobalBinding(sctx sessionctx.Context, binding Binding) (err error) { + if err := prepareHints(sctx, &binding); err != nil { + return err + } + defer func() { + if err == nil { + err = h.LoadFromStorageToCache(false) + } + }() + + return h.callWithSCtx(true, func(sctx sessionctx.Context) error { + // Lock mysql.bind_info to synchronize with CreateBindRecord / AddBindRecord / DropBindRecord on other tidb instances. + if err = lockBindInfoTable(sctx); err != nil { + return err + } + + now := types.NewTime(types.FromGoTime(time.Now()), mysql.TypeTimestamp, 3) + + updateTs := now.String() + _, err = exec(sctx, `UPDATE mysql.bind_info SET status = %?, update_time = %? WHERE original_sql = %? AND update_time < %?`, + deleted, updateTs, binding.OriginalSQL, updateTs) + if err != nil { + return err + } + + binding.CreateTime = now + binding.UpdateTime = now + + // Insert the Bindings to the storage. + _, err = exec(sctx, `INSERT INTO mysql.bind_info VALUES (%?,%?, %?, %?, %?, %?, %?, %?, %?, %?, %?)`, + binding.OriginalSQL, + binding.BindSQL, + strings.ToLower(binding.Db), + binding.Status, + binding.CreateTime.String(), + binding.UpdateTime.String(), + binding.Charset, + binding.Collation, + binding.Source, + binding.SQLDigest, + binding.PlanDigest, + ) + if err != nil { + return err + } + return nil + }) +} + +// dropGlobalBinding drops a Bindings to the storage and Bindings int the cache. +func (h *globalBindingHandle) dropGlobalBinding(sqlDigest string) (deletedRows uint64, err error) { + err = h.callWithSCtx(false, func(sctx sessionctx.Context) error { + // Lock mysql.bind_info to synchronize with CreateBindRecord / AddBindRecord / DropBindRecord on other tidb instances. + if err = lockBindInfoTable(sctx); err != nil { + return err + } + + updateTs := types.NewTime(types.FromGoTime(time.Now()), mysql.TypeTimestamp, 3).String() + + _, err = exec(sctx, `UPDATE mysql.bind_info SET status = %?, update_time = %? WHERE sql_digest = %? AND update_time < %? AND status != %?`, + deleted, updateTs, sqlDigest, updateTs, deleted) + if err != nil { + return err + } + deletedRows = sctx.GetSessionVars().StmtCtx.AffectedRows() + return nil + }) + return +} + +// DropGlobalBinding drop Bindings to the storage and Bindings int the cache. +func (h *globalBindingHandle) DropGlobalBinding(sqlDigest string) (deletedRows uint64, err error) { + if sqlDigest == "" { + return 0, errors.New("sql digest is empty") + } + defer func() { + if err == nil { + err = h.LoadFromStorageToCache(false) + } + }() + return h.dropGlobalBinding(sqlDigest) +} + +// SetGlobalBindingStatus set a Bindings's status to the storage and bind cache. +func (h *globalBindingHandle) SetGlobalBindingStatus(newStatus, sqlDigest string) (ok bool, err error) { + var ( + updateTs types.Time + oldStatus0, oldStatus1 string + ) + if newStatus == Disabled { + // For compatibility reasons, when we need to 'set binding disabled for ', + // we need to consider both the 'enabled' and 'using' status. + oldStatus0 = Using + oldStatus1 = Enabled + } else if newStatus == Enabled { + // In order to unify the code, two identical old statuses are set. + oldStatus0 = Disabled + oldStatus1 = Disabled + } + + defer func() { + if err == nil { + err = h.LoadFromStorageToCache(false) + } + }() + + err = h.callWithSCtx(true, func(sctx sessionctx.Context) error { + // Lock mysql.bind_info to synchronize with SetBindingStatus on other tidb instances. + if err = lockBindInfoTable(sctx); err != nil { + return err + } + + updateTs = types.NewTime(types.FromGoTime(time.Now()), mysql.TypeTimestamp, 3) + updateTsStr := updateTs.String() + + _, err = exec(sctx, `UPDATE mysql.bind_info SET status = %?, update_time = %? WHERE sql_digest = %? AND update_time < %? AND status IN (%?, %?)`, + newStatus, updateTsStr, sqlDigest, updateTsStr, oldStatus0, oldStatus1) + return err + }) + return +} + +// GCGlobalBinding physically removes the deleted bind records in mysql.bind_info. +func (h *globalBindingHandle) GCGlobalBinding() (err error) { + return h.callWithSCtx(true, func(sctx sessionctx.Context) error { + // Lock mysql.bind_info to synchronize with CreateBindRecord / AddBindRecord / DropBindRecord on other tidb instances. + if err = lockBindInfoTable(sctx); err != nil { + return err + } + + // To make sure that all the deleted bind records have been acknowledged to all tidb, + // we only garbage collect those records with update_time before 10 leases. + updateTime := time.Now().Add(-(10 * Lease)) + updateTimeStr := types.NewTime(types.FromGoTime(updateTime), mysql.TypeTimestamp, 3).String() + _, err = exec(sctx, `DELETE FROM mysql.bind_info WHERE status = 'deleted' and update_time < %?`, updateTimeStr) + return err + }) +} + +// lockBindInfoTable simulates `LOCK TABLE mysql.bind_info WRITE` by acquiring a pessimistic lock on a +// special builtin row of mysql.bind_info. Note that this function must be called with h.sctx.Lock() held. +// We can replace this implementation to normal `LOCK TABLE mysql.bind_info WRITE` if that feature is +// generally available later. +// This lock would enforce the CREATE / DROP GLOBAL BINDING statements to be executed sequentially, +// even if they come from different tidb instances. +func lockBindInfoTable(sctx sessionctx.Context) error { + // h.sctx already locked. + _, err := exec(sctx, LockBindInfoSQL) + return err +} + +// invalidBindingCache is used to store invalid bindings temporarily. +type invalidBindingCache struct { + mu sync.RWMutex + m map[string]Binding // key: sqlDigest +} + +func newInvalidBindingCache() *invalidBindingCache { + return &invalidBindingCache{ + m: make(map[string]Binding), + } +} + +func (c *invalidBindingCache) add(binding Binding) { + c.mu.Lock() + defer c.mu.Unlock() + c.m[binding.SQLDigest] = binding +} + +func (c *invalidBindingCache) getAll() Bindings { + c.mu.Lock() + defer c.mu.Unlock() + bindings := make(Bindings, 0, len(c.m)) + for _, binding := range c.m { + bindings = append(bindings, binding) + } + return bindings +} + +func (c *invalidBindingCache) reset() { + c.mu.Lock() + defer c.mu.Unlock() + c.m = make(map[string]Binding) +} + +// DropInvalidGlobalBinding executes the drop Bindings tasks. +func (h *globalBindingHandle) DropInvalidGlobalBinding() { + defer func() { + if err := h.LoadFromStorageToCache(false); err != nil { + logutil.BgLogger().Warn("drop invalid global binding error", zap.Error(err)) + } + }() + + invalidBindings := h.invalidBindings.getAll() + h.invalidBindings.reset() + for _, invalidBinding := range invalidBindings { + if _, err := h.dropGlobalBinding(invalidBinding.SQLDigest); err != nil { + logutil.BgLogger().Debug("flush bind record failed", zap.String("category", "sql-bind"), zap.Error(err)) + } + } +} + +// AddInvalidGlobalBinding adds Bindings which needs to be deleted into invalidBindRecordMap. +func (h *globalBindingHandle) AddInvalidGlobalBinding(invalidBinding Binding) { + h.invalidBindings.add(invalidBinding) +} + +// Size returns the size of bind info cache. +func (h *globalBindingHandle) Size() int { + size := len(h.getCache().GetAllBindings()) + return size +} + +// MatchGlobalBinding returns the matched binding for this statement. +func (h *globalBindingHandle) MatchGlobalBinding(sctx sessionctx.Context, fuzzyDigest string, tableNames []*ast.TableName) (matchedBinding Binding, isMatched bool) { + bindingCache := h.getCache() + if bindingCache.Size() == 0 { + return + } + fuzzyDigestMap := h.getFuzzyDigestMap() + if len(fuzzyDigestMap) == 0 { + return + } + + leastWildcards := len(tableNames) + 1 + for _, exactDigest := range fuzzyDigestMap[fuzzyDigest] { + sqlDigest := exactDigest + if bindings := bindingCache.GetBinding(sqlDigest); bindings != nil { + for _, binding := range bindings { + numWildcards, matched := fuzzyMatchBindingTableName(sctx.GetSessionVars().CurrentDB, tableNames, binding.TableNames) + if matched && numWildcards > 0 && sctx != nil && !sctx.GetSessionVars().EnableFuzzyBinding { + continue // fuzzy binding is disabled, skip this binding + } + if matched && numWildcards < leastWildcards { + matchedBinding = binding + isMatched = true + leastWildcards = numWildcards + break + } + } + } + } + return +} + +// GetAllGlobalBindings returns all bind records in cache. +func (h *globalBindingHandle) GetAllGlobalBindings() (bindings Bindings) { + for _, record := range h.getCache().GetAllBindings() { + bindings = append(bindings, record...) + } + return +} + +// SetBindCacheCapacity reset the capacity for the bindCache. +// It will not affect already cached BindRecords. +func (h *globalBindingHandle) SetBindCacheCapacity(capacity int64) { + h.getCache().SetMemCapacity(capacity) +} + +// GetMemUsage returns the memory usage for the bind cache. +func (h *globalBindingHandle) GetMemUsage() (memUsage int64) { + return h.getCache().GetMemUsage() +} + +// GetMemCapacity returns the memory capacity for the bind cache. +func (h *globalBindingHandle) GetMemCapacity() (memCapacity int64) { + return h.getCache().GetMemCapacity() +} + +// newBinding builds Bindings from a tuple in storage. +func newBinding(sctx sessionctx.Context, row chunk.Row) (string, Binding, error) { + status := row.GetString(3) + // For compatibility, the 'Using' status binding will be converted to the 'Enabled' status binding. + if status == Using { + status = Enabled + } + defaultDB := row.GetString(2) + + bindSQL := row.GetString(1) + charset, collation := row.GetString(6), row.GetString(7) + stmt, err := parser.New().ParseOneStmt(bindSQL, charset, collation) + if err != nil { + return "", Binding{}, err + } + tableNames := CollectTableNames(stmt) + + binding := Binding{ + OriginalSQL: row.GetString(0), + Db: strings.ToLower(defaultDB), + BindSQL: bindSQL, + Status: status, + CreateTime: row.GetTime(4), + UpdateTime: row.GetTime(5), + Charset: charset, + Collation: collation, + Source: row.GetString(8), + SQLDigest: row.GetString(9), + PlanDigest: row.GetString(10), + TableNames: tableNames, + } + sqlDigest := parser.DigestNormalized(binding.OriginalSQL) + err = prepareHints(sctx, &binding) + sctx.GetSessionVars().CurrentDB = binding.Db + return sqlDigest.String(), binding, err +} + +func getHintsForSQL(sctx sessionctx.Context, sql string) (string, error) { + origVals := sctx.GetSessionVars().UsePlanBaselines + sctx.GetSessionVars().UsePlanBaselines = false + + // Usually passing a sprintf to ExecuteInternal is not recommended, but in this case + // it is safe because ExecuteInternal does not permit MultiStatement execution. Thus, + // the statement won't be able to "break out" from EXPLAIN. + rs, err := exec(sctx, fmt.Sprintf("EXPLAIN FORMAT='hint' %s", sql)) + sctx.GetSessionVars().UsePlanBaselines = origVals + if rs != nil { + defer func() { + // Audit log is collected in Close(), set InRestrictedSQL to avoid 'create sql binding' been recorded as 'explain'. + origin := sctx.GetSessionVars().InRestrictedSQL + sctx.GetSessionVars().InRestrictedSQL = true + terror.Call(rs.Close) + sctx.GetSessionVars().InRestrictedSQL = origin + }() + } + if err != nil { + return "", err + } + chk := rs.NewChunk(nil) + err = rs.Next(context.TODO(), chk) + if err != nil { + return "", err + } + return chk.GetRow(0).GetString(0), nil +} + +// GenerateBindSQL generates binding sqls from stmt node and plan hints. +func GenerateBindSQL(ctx context.Context, stmtNode ast.StmtNode, planHint string, skipCheckIfHasParam bool, defaultDB string) string { + // If would be nil for very simple cases such as point get, we do not need to evolve for them. + if planHint == "" { + return "" + } + if !skipCheckIfHasParam { + paramChecker := ¶mMarkerChecker{} + stmtNode.Accept(paramChecker) + // We need to evolve on current sql, but we cannot restore values for paramMarkers yet, + // so just ignore them now. + if paramChecker.hasParamMarker { + return "" + } + } + // We need to evolve plan based on the current sql, not the original sql which may have different parameters. + // So here we would remove the hint and inject the current best plan hint. + hint.BindHint(stmtNode, &hint.HintsSet{}) + bindSQL := utilparser.RestoreWithDefaultDB(stmtNode, defaultDB, "") + if bindSQL == "" { + return "" + } + switch n := stmtNode.(type) { + case *ast.DeleteStmt: + deleteIdx := strings.Index(bindSQL, "DELETE") + // Remove possible `explain` prefix. + bindSQL = bindSQL[deleteIdx:] + return strings.Replace(bindSQL, "DELETE", fmt.Sprintf("DELETE /*+ %s*/", planHint), 1) + case *ast.UpdateStmt: + updateIdx := strings.Index(bindSQL, "UPDATE") + // Remove possible `explain` prefix. + bindSQL = bindSQL[updateIdx:] + return strings.Replace(bindSQL, "UPDATE", fmt.Sprintf("UPDATE /*+ %s*/", planHint), 1) + case *ast.SelectStmt: + var selectIdx int + if n.With != nil { + var withSb strings.Builder + withIdx := strings.Index(bindSQL, "WITH") + restoreCtx := format.NewRestoreCtx(format.RestoreStringSingleQuotes|format.RestoreSpacesAroundBinaryOperation|format.RestoreStringWithoutCharset|format.RestoreNameBackQuotes, &withSb) + restoreCtx.DefaultDB = defaultDB + if err := n.With.Restore(restoreCtx); err != nil { + logutil.BgLogger().Debug("restore SQL failed", zap.String("category", "sql-bind"), zap.Error(err)) + return "" + } + withEnd := withIdx + len(withSb.String()) + tmp := strings.Replace(bindSQL[withEnd:], "SELECT", fmt.Sprintf("SELECT /*+ %s*/", planHint), 1) + return strings.Join([]string{bindSQL[withIdx:withEnd], tmp}, "") + } + selectIdx = strings.Index(bindSQL, "SELECT") + // Remove possible `explain` prefix. + bindSQL = bindSQL[selectIdx:] + return strings.Replace(bindSQL, "SELECT", fmt.Sprintf("SELECT /*+ %s*/", planHint), 1) + case *ast.InsertStmt: + insertIdx := int(0) + if n.IsReplace { + insertIdx = strings.Index(bindSQL, "REPLACE") + } else { + insertIdx = strings.Index(bindSQL, "INSERT") + } + // Remove possible `explain` prefix. + bindSQL = bindSQL[insertIdx:] + return strings.Replace(bindSQL, "SELECT", fmt.Sprintf("SELECT /*+ %s*/", planHint), 1) + } + logutil.Logger(ctx).Debug("unexpected statement type when generating bind SQL", zap.String("category", "sql-bind"), zap.Any("statement", stmtNode)) + return "" +} + +type paramMarkerChecker struct { + hasParamMarker bool +} + +func (e *paramMarkerChecker) Enter(in ast.Node) (ast.Node, bool) { + if _, ok := in.(*driver.ParamMarkerExpr); ok { + e.hasParamMarker = true + return in, true + } + return in, false +} + +func (*paramMarkerChecker) Leave(in ast.Node) (ast.Node, bool) { + return in, true +} + +// Clear resets the bind handle. It is only used for test. +func (h *globalBindingHandle) Clear() { + h.setCache(newBindCache()) + h.setLastUpdateTime(types.ZeroTimestamp) + h.invalidBindings.reset() +} + +// FlushGlobalBindings flushes the Bindings in temp maps to storage and loads them into cache. +func (h *globalBindingHandle) FlushGlobalBindings() error { + h.DropInvalidGlobalBinding() + return h.LoadFromStorageToCache(false) +} + +func (h *globalBindingHandle) callWithSCtx(wrapTxn bool, f func(sctx sessionctx.Context) error) (err error) { + resource, err := h.sPool.Get() + if err != nil { + return err + } + defer func() { + if err == nil { // only recycle when no error + h.sPool.Put(resource) + } + }() + + sctx := resource.(sessionctx.Context) + if wrapTxn { + if _, err = exec(sctx, "BEGIN PESSIMISTIC"); err != nil { + return + } + defer func() { + if err == nil { + _, err = exec(sctx, "COMMIT") + } else { + _, err1 := exec(sctx, "ROLLBACK") + terror.Log(errors.Trace(err1)) + } + }() + } + + err = f(sctx) + return +} + +var ( + lastPlanBindingUpdateTime = "last_plan_binding_update_time" +) + +// GetScope gets the status variables scope. +func (*globalBindingHandle) GetScope(_ string) variable.ScopeFlag { + return variable.ScopeSession +} + +// Stats returns the server statistics. +func (h *globalBindingHandle) Stats(_ *variable.SessionVars) (map[string]interface{}, error) { + m := make(map[string]interface{}) + m[lastPlanBindingUpdateTime] = h.getLastUpdateTime().String() + return m, nil +} diff --git a/pkg/bindinfo/handle_test.go b/pkg/bindinfo/global_handle_test.go similarity index 76% rename from pkg/bindinfo/handle_test.go rename to pkg/bindinfo/global_handle_test.go index 984fdb0189be7..a381a72d15ba1 100644 --- a/pkg/bindinfo/handle_test.go +++ b/pkg/bindinfo/global_handle_test.go @@ -19,13 +19,14 @@ import ( "fmt" "testing" + "github.com/ngaut/pools" "github.com/pingcap/tidb/pkg/bindinfo" "github.com/pingcap/tidb/pkg/bindinfo/internal" - "github.com/pingcap/tidb/pkg/config" + "github.com/pingcap/tidb/pkg/bindinfo/norm" "github.com/pingcap/tidb/pkg/metrics" "github.com/pingcap/tidb/pkg/parser" + sessiontypes "github.com/pingcap/tidb/pkg/session/types" "github.com/pingcap/tidb/pkg/testkit" - dto "github.com/prometheus/client_model/go" "github.com/stretchr/testify/require" ) @@ -43,14 +44,14 @@ func TestBindingCache(t *testing.T) { tk.MustExec("create table t(a int, b int, index idx(a))") tk.MustExec("create global binding for select * from t using select * from t use index(idx);") - require.Nil(t, dom.BindHandle().Update(false)) - require.Nil(t, dom.BindHandle().Update(false)) + require.Nil(t, dom.BindHandle().LoadFromStorageToCache(false)) + require.Nil(t, dom.BindHandle().LoadFromStorageToCache(false)) res := tk.MustQuery("show global bindings") require.Equal(t, 2, len(res.Rows())) tk.MustExec("drop global binding for select * from t;") - require.Nil(t, dom.BindHandle().Update(false)) - require.Equal(t, 1, len(dom.BindHandle().GetAllBindRecord())) + require.Nil(t, dom.BindHandle().LoadFromStorageToCache(false)) + require.Equal(t, 1, len(dom.BindHandle().GetAllGlobalBindings())) } func TestBindingLastUpdateTime(t *testing.T) { @@ -64,14 +65,16 @@ func TestBindingLastUpdateTime(t *testing.T) { tk.MustExec("create global binding for select * from t0 using select * from t0 use index(a);") tk.MustExec("admin reload bindings;") - bindHandle := bindinfo.NewBindHandle(tk.Session()) - err := bindHandle.Update(true) + bindHandle := bindinfo.NewGlobalBindingHandle(&mockSessionPool{tk.Session()}) + err := bindHandle.LoadFromStorageToCache(true) require.NoError(t, err) - sql, hash := parser.NormalizeDigest("select * from test . t0") - bindData := bindHandle.GetBindRecord(hash.String(), sql, "test") - require.Equal(t, 1, len(bindData.Bindings)) - bind := bindData.Bindings[0] - updateTime := bind.UpdateTime.String() + stmt, err := parser.New().ParseOneStmt("select * from test . t0", "", "") + require.NoError(t, err) + + _, fuzzyDigest := norm.NormalizeStmtForBinding(stmt, norm.WithFuzz(true)) + binding, matched := bindHandle.MatchGlobalBinding(tk.Session(), fuzzyDigest, bindinfo.CollectTableNames(stmt)) + require.True(t, matched) + updateTime := binding.UpdateTime.String() rows1 := tk.MustQuery("show status like 'last_plan_binding_update_time';").Rows() updateTime1 := rows1[0][1] @@ -123,28 +126,30 @@ func TestBindParse(t *testing.T) { charset := "utf8mb4" collation := "utf8mb4_bin" source := bindinfo.Manual - mockDigest := "0f644e22c38ecc71d4592c52df127df7f86b6ca7f7c0ee899113b794578f9396" + _, digest := parser.NormalizeDigestForBinding(originSQL) + mockDigest := digest.String() sql := fmt.Sprintf(`INSERT INTO mysql.bind_info(original_sql,bind_sql,default_db,status,create_time,update_time,charset,collation,source, sql_digest, plan_digest) VALUES ('%s', '%s', '%s', '%s', NOW(), NOW(),'%s', '%s', '%s', '%s', '%s')`, originSQL, bindSQL, defaultDb, status, charset, collation, source, mockDigest, mockDigest) tk.MustExec(sql) - bindHandle := bindinfo.NewBindHandle(tk.Session()) - err := bindHandle.Update(true) + bindHandle := bindinfo.NewGlobalBindingHandle(&mockSessionPool{tk.Session()}) + err := bindHandle.LoadFromStorageToCache(true) require.NoError(t, err) require.Equal(t, 1, bindHandle.Size()) - sql, hash := parser.NormalizeDigest("select * from test . t") - bindData := bindHandle.GetBindRecord(hash.String(), sql, "test") - require.NotNil(t, bindData) - require.Equal(t, "select * from `test` . `t`", bindData.OriginalSQL) - bind := bindData.Bindings[0] - require.Equal(t, "select * from `test` . `t` use index(index_t)", bind.BindSQL) - require.Equal(t, "test", bindData.Db) - require.Equal(t, bindinfo.Enabled, bind.Status) - require.Equal(t, "utf8mb4", bind.Charset) - require.Equal(t, "utf8mb4_bin", bind.Collation) - require.NotNil(t, bind.CreateTime) - require.NotNil(t, bind.UpdateTime) - dur, err := bind.SinceUpdateTime() + stmt, err := parser.New().ParseOneStmt("select * from test . t", "", "") + require.NoError(t, err) + _, fuzzyDigest := norm.NormalizeStmtForBinding(stmt, norm.WithFuzz(true)) + binding, matched := bindHandle.MatchGlobalBinding(tk.Session(), fuzzyDigest, bindinfo.CollectTableNames(stmt)) + require.True(t, matched) + require.Equal(t, "select * from `test` . `t`", binding.OriginalSQL) + require.Equal(t, "select * from `test` . `t` use index(index_t)", binding.BindSQL) + require.Equal(t, "test", binding.Db) + require.Equal(t, bindinfo.Enabled, binding.Status) + require.Equal(t, "utf8mb4", binding.Charset) + require.Equal(t, "utf8mb4_bin", binding.Collation) + require.NotNil(t, binding.CreateTime) + require.NotNil(t, binding.UpdateTime) + dur, err := binding.SinceUpdateTime() require.NoError(t, err) require.GreaterOrEqual(t, int64(dur), int64(0)) @@ -191,48 +196,6 @@ func TestBindParse(t *testing.T) { require.NotNil(t, err, "err %v", err) } -func TestEvolveInvalidBindings(t *testing.T) { - originalVal := config.CheckTableBeforeDrop - config.CheckTableBeforeDrop = true - defer func() { - config.CheckTableBeforeDrop = originalVal - }() - - store, dom := testkit.CreateMockStoreAndDomain(t) - - tk := testkit.NewTestKit(t, store) - - tk.MustExec("use test") - tk.MustExec("drop table if exists t") - tk.MustExec("create table t(a int, b int, index idx_a(a))") - tk.MustExec("create global binding for select * from t where a > 10 using select /*+ USE_INDEX(t) */ * from t where a > 10") - // Manufacture a rejected binding by hacking mysql.bind_info. - tk.MustExec("insert into mysql.bind_info values('select * from test . t where a > ?', 'SELECT /*+ USE_INDEX(t,idx_a) */ * FROM test.t WHERE a > 10', 'test', 'rejected', '2000-01-01 09:00:00', '2000-01-01 09:00:00', '', '','" + - bindinfo.Manual + "', '', '')") - tk.MustQuery("select bind_sql, status from mysql.bind_info where source != 'builtin'").Sort().Check(testkit.Rows( - "SELECT /*+ USE_INDEX(`t` )*/ * FROM `test`.`t` WHERE `a` > 10 enabled", - "SELECT /*+ USE_INDEX(t,idx_a) */ * FROM test.t WHERE a > 10 rejected", - )) - // Reload cache from mysql.bind_info. - dom.BindHandle().Clear() - require.Nil(t, dom.BindHandle().Update(true)) - - tk.MustExec("alter table t drop index idx_a") - tk.MustExec("admin evolve bindings") - require.Nil(t, dom.BindHandle().Update(false)) - rows := tk.MustQuery("show global bindings").Sort().Rows() - require.Equal(t, 2, len(rows)) - // Make sure this "enabled" binding is not overrided. - require.Equal(t, "SELECT /*+ USE_INDEX(`t` )*/ * FROM `test`.`t` WHERE `a` > 10", rows[0][1]) - status := rows[0][3].(string) - require.True(t, status == bindinfo.Enabled) - require.Equal(t, "SELECT /*+ USE_INDEX(t,idx_a) */ * FROM test.t WHERE a > 10", rows[1][1]) - status = rows[1][3].(string) - require.True(t, status == bindinfo.Enabled || status == bindinfo.Rejected) - _, sqlDigestWithDB := parser.NormalizeDigest("select * from test.t where a > 10") // test sqlDigest if exists after add columns to mysql.bind_info - require.Equal(t, rows[0][9], sqlDigestWithDB.String()) -} - func TestSetBindingStatus(t *testing.T) { store := testkit.CreateMockStore(t) @@ -249,14 +212,6 @@ func TestSetBindingStatus(t *testing.T) { tk.MustExec("select * from t where a > 10") tk.MustQuery("select @@last_plan_from_binding").Check(testkit.Rows("1")) - tk.MustExec("set binding disabled for select * from t where a > 10 using select * from t where a > 10") - tk.MustQuery("show warnings").Check(testkit.Rows("Warning 1105 There are no bindings can be set the status. Please check the SQL text")) - rows = tk.MustQuery("show global bindings").Rows() - require.Len(t, rows, 1) - require.Equal(t, bindinfo.Enabled, rows[0][3]) - tk.MustExec("select * from t where a > 10") - tk.MustQuery("select @@last_plan_from_binding").Check(testkit.Rows("1")) - tk.MustExec("set binding disabled for select * from t where a > 10") rows = tk.MustQuery("show global bindings").Rows() require.Len(t, rows, 1) @@ -307,10 +262,11 @@ func TestSetBindingStatusWithoutBindingInCache(t *testing.T) { tk.MustQuery("show global bindings").Check(testkit.Rows()) // Simulate creating bindings on other machines + _, sqlDigest := parser.NormalizeDigestForBinding("select * from `test` . `t` where `a` > ?") tk.MustExec("insert into mysql.bind_info values('select * from `test` . `t` where `a` > ?', 'SELECT /*+ USE_INDEX(`t` `idx_a`)*/ * FROM `test`.`t` WHERE `a` > 10', 'test', 'deleted', '2000-01-01 09:00:00', '2000-01-01 09:00:00', '', '','" + - bindinfo.Manual + "', '', '')") + bindinfo.Manual + "', '" + sqlDigest.String() + "', '')") tk.MustExec("insert into mysql.bind_info values('select * from `test` . `t` where `a` > ?', 'SELECT /*+ USE_INDEX(`t` `idx_a`)*/ * FROM `test`.`t` WHERE `a` > 10', 'test', 'enabled', '2000-01-02 09:00:00', '2000-01-02 09:00:00', '', '','" + - bindinfo.Manual + "', '', '')") + bindinfo.Manual + "', '" + sqlDigest.String() + "', '')") dom.BindHandle().Clear() tk.MustExec("set binding disabled for select * from t where a > 10") tk.MustExec("admin reload bindings") @@ -323,9 +279,9 @@ func TestSetBindingStatusWithoutBindingInCache(t *testing.T) { // Simulate creating bindings on other machines tk.MustExec("insert into mysql.bind_info values('select * from `test` . `t` where `a` > ?', 'SELECT * FROM `test`.`t` WHERE `a` > 10', 'test', 'deleted', '2000-01-01 09:00:00', '2000-01-01 09:00:00', '', '','" + - bindinfo.Manual + "', '', '')") + bindinfo.Manual + "', '" + sqlDigest.String() + "', '')") tk.MustExec("insert into mysql.bind_info values('select * from `test` . `t` where `a` > ?', 'SELECT * FROM `test`.`t` WHERE `a` > 10', 'test', 'disabled', '2000-01-02 09:00:00', '2000-01-02 09:00:00', '', '','" + - bindinfo.Manual + "', '', '')") + bindinfo.Manual + "', '" + sqlDigest.String() + "', '')") dom.BindHandle().Clear() tk.MustExec("set binding enabled for select * from t where a > 10") tk.MustExec("admin reload bindings") @@ -480,27 +436,19 @@ func TestGlobalBinding(t *testing.T) { require.NoError(t, err) } - pb := &dto.Metric{} - err = metrics.BindTotalGauge.WithLabelValues(metrics.ScopeGlobal, bindinfo.Enabled).Write(pb) - require.NoError(t, err) - require.Equal(t, float64(1), pb.GetGauge().GetValue()) - err = metrics.BindMemoryUsage.WithLabelValues(metrics.ScopeGlobal, bindinfo.Enabled).Write(pb) - require.NoError(t, err) - require.Equal(t, testSQL.memoryUsage, pb.GetGauge().GetValue()) - - sql, hash := internal.UtilNormalizeWithDefaultDB(t, testSQL.querySQL) - - bindData := dom.BindHandle().GetBindRecord(hash, sql, "test") - require.NotNil(t, bindData) - require.Equal(t, testSQL.originSQL, bindData.OriginalSQL) - bind := bindData.Bindings[0] - require.Equal(t, testSQL.bindSQL, bind.BindSQL) - require.Equal(t, "test", bindData.Db) - require.Equal(t, bindinfo.Enabled, bind.Status) - require.NotNil(t, bind.Charset) - require.NotNil(t, bind.Collation) - require.NotNil(t, bind.CreateTime) - require.NotNil(t, bind.UpdateTime) + stmt, _, _ := internal.UtilNormalizeWithDefaultDB(t, testSQL.querySQL) + + _, fuzzyDigest := norm.NormalizeStmtForBinding(stmt, norm.WithFuzz(true)) + binding, matched := dom.BindHandle().MatchGlobalBinding(tk.Session(), fuzzyDigest, bindinfo.CollectTableNames(stmt)) + require.True(t, matched) + require.Equal(t, testSQL.originSQL, binding.OriginalSQL) + require.Equal(t, testSQL.bindSQL, binding.BindSQL) + require.Equal(t, "test", binding.Db) + require.Equal(t, bindinfo.Enabled, binding.Status) + require.NotNil(t, binding.Charset) + require.NotNil(t, binding.Collation) + require.NotNil(t, binding.CreateTime) + require.NotNil(t, binding.UpdateTime) rs, err := tk.Exec("show global bindings") require.NoError(t, err) @@ -518,44 +466,38 @@ func TestGlobalBinding(t *testing.T) { require.NotNil(t, row.GetString(6)) require.NotNil(t, row.GetString(7)) - bindHandle := bindinfo.NewBindHandle(tk.Session()) - err = bindHandle.Update(true) + bindHandle := bindinfo.NewGlobalBindingHandle(&mockSessionPool{tk.Session()}) + err = bindHandle.LoadFromStorageToCache(true) require.NoError(t, err) require.Equal(t, 1, bindHandle.Size()) - bindData = bindHandle.GetBindRecord(hash, sql, "test") - require.NotNil(t, bindData) - require.Equal(t, testSQL.originSQL, bindData.OriginalSQL) - bind = bindData.Bindings[0] - require.Equal(t, testSQL.bindSQL, bind.BindSQL) - require.Equal(t, "test", bindData.Db) - require.Equal(t, bindinfo.Enabled, bind.Status) - require.NotNil(t, bind.Charset) - require.NotNil(t, bind.Collation) - require.NotNil(t, bind.CreateTime) - require.NotNil(t, bind.UpdateTime) + _, fuzzyDigest = norm.NormalizeStmtForBinding(stmt, norm.WithFuzz(true)) + binding, matched = dom.BindHandle().MatchGlobalBinding(tk.Session(), fuzzyDigest, bindinfo.CollectTableNames(stmt)) + require.True(t, matched) + require.Equal(t, testSQL.originSQL, binding.OriginalSQL) + require.Equal(t, testSQL.bindSQL, binding.BindSQL) + require.Equal(t, "test", binding.Db) + require.Equal(t, bindinfo.Enabled, binding.Status) + require.NotNil(t, binding.Charset) + require.NotNil(t, binding.Collation) + require.NotNil(t, binding.CreateTime) + require.NotNil(t, binding.UpdateTime) _, err = tk.Exec("drop global " + testSQL.dropSQL) require.Equal(t, uint64(1), tk.Session().AffectedRows()) require.NoError(t, err) - bindData = dom.BindHandle().GetBindRecord(hash, sql, "test") - require.Nil(t, bindData) + _, fuzzyDigest = norm.NormalizeStmtForBinding(stmt, norm.WithFuzz(true)) + _, matched = dom.BindHandle().MatchGlobalBinding(tk.Session(), fuzzyDigest, bindinfo.CollectTableNames(stmt)) + require.False(t, matched) // dropped - err = metrics.BindTotalGauge.WithLabelValues(metrics.ScopeGlobal, bindinfo.Enabled).Write(pb) - require.NoError(t, err) - require.Equal(t, float64(0), pb.GetGauge().GetValue()) - err = metrics.BindMemoryUsage.WithLabelValues(metrics.ScopeGlobal, bindinfo.Enabled).Write(pb) - require.NoError(t, err) - // From newly created global bind handle. - require.Equal(t, testSQL.memoryUsage, pb.GetGauge().GetValue()) - - bindHandle = bindinfo.NewBindHandle(tk.Session()) - err = bindHandle.Update(true) + bindHandle = bindinfo.NewGlobalBindingHandle(&mockSessionPool{tk.Session()}) + err = bindHandle.LoadFromStorageToCache(true) require.NoError(t, err) require.Equal(t, 0, bindHandle.Size()) - bindData = bindHandle.GetBindRecord(hash, sql, "test") - require.Nil(t, bindData) + _, fuzzyDigest = norm.NormalizeStmtForBinding(stmt, norm.WithFuzz(true)) + _, matched = dom.BindHandle().MatchGlobalBinding(tk.Session(), fuzzyDigest, bindinfo.CollectTableNames(stmt)) + require.False(t, matched) // dropped rs, err = tk.Exec("show global bindings") require.NoError(t, err) @@ -578,7 +520,7 @@ func TestOutdatedInfoSchema(t *testing.T) { tk.MustExec("drop table if exists t") tk.MustExec("create table t(a int, b int, index idx(a))") tk.MustExec("create global binding for select * from t using select * from t use index(idx)") - require.Nil(t, dom.BindHandle().Update(false)) + require.Nil(t, dom.BindHandle().LoadFromStorageToCache(false)) internal.UtilCleanBindingEnv(tk, dom) tk.MustExec("create global binding for select * from t using select * from t use index(idx)") } @@ -597,13 +539,81 @@ func TestReloadBindings(t *testing.T) { rows = tk.MustQuery("select * from mysql.bind_info where source != 'builtin'").Rows() require.Equal(t, 1, len(rows)) tk.MustExec("delete from mysql.bind_info where source != 'builtin'") - require.Nil(t, dom.BindHandle().Update(false)) - rows = tk.MustQuery("show global bindings").Rows() - require.Equal(t, 1, len(rows)) - require.Nil(t, dom.BindHandle().Update(true)) + require.Nil(t, dom.BindHandle().LoadFromStorageToCache(false)) rows = tk.MustQuery("show global bindings").Rows() require.Equal(t, 1, len(rows)) tk.MustExec("admin reload bindings") rows = tk.MustQuery("show global bindings").Rows() require.Equal(t, 0, len(rows)) } + +func TestSetVarFixControlWithBinding(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + + tk.MustExec(`create table t(id int, a varchar(100), b int, c int, index idx_ab(a, b))`) + tk.MustQuery(`explain select * from t where c = 10 and (a = 'xx' or (a = 'kk' and b = 1))`).Check( + testkit.Rows( + `IndexLookUp_12 0.01 root `, + `├─Selection_10(Build) 0.02 cop[tikv] or(eq(test.t.a, "xx"), and(eq(test.t.a, "kk"), eq(test.t.b, 1)))`, + `│ └─IndexRangeScan_8 20.00 cop[tikv] table:t, index:idx_ab(a, b) range:["kk","kk"], ["xx","xx"], keep order:false, stats:pseudo`, + `└─Selection_11(Probe) 0.01 cop[tikv] eq(test.t.c, 10)`, + ` └─TableRowIDScan_9 0.02 cop[tikv] table:t keep order:false, stats:pseudo`)) + + tk.MustExec(`create global binding using select /*+ set_var(tidb_opt_fix_control='44389:ON') */ * from t where c = 10 and (a = 'xx' or (a = 'kk' and b = 1))`) + tk.MustQuery(`show warnings`).Check(testkit.Rows()) // no warning + + // the fix control can take effect + tk.MustQuery(`explain select * from t where c = 10 and (a = 'xx' or (a = 'kk' and b = 1))`).Check( + testkit.Rows(`IndexLookUp_11 0.01 root `, + `├─IndexRangeScan_8(Build) 10.10 cop[tikv] table:t, index:idx_ab(a, b) range:["kk" 1,"kk" 1], ["xx","xx"], keep order:false, stats:pseudo`, + `└─Selection_10(Probe) 0.01 cop[tikv] eq(test.t.c, 10)`, + ` └─TableRowIDScan_9 10.10 cop[tikv] table:t keep order:false, stats:pseudo`)) + tk.MustQuery(`select @@last_plan_from_binding`).Check(testkit.Rows("1")) +} + +func TestRemoveDuplicatedPseudoBinding(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + + checkPseudoBinding := func(num int) { + tk.MustQuery(fmt.Sprintf("select count(1) from mysql.bind_info where original_sql='%s'", + bindinfo.BuiltinPseudoSQL4BindLock)).Check(testkit.Rows(fmt.Sprintf("%d", num))) + } + insertPseudoBinding := func() { + tk.MustExec(fmt.Sprintf(`INSERT INTO mysql.bind_info(original_sql, bind_sql, default_db, status, create_time, update_time, charset, collation, source) + VALUES ('%v', '%v', "mysql", '%v', "2000-01-01 00:00:00", "2000-01-01 00:00:00", "", "", '%v')`, + bindinfo.BuiltinPseudoSQL4BindLock, bindinfo.BuiltinPseudoSQL4BindLock, bindinfo.Builtin, bindinfo.Builtin)) + } + removeDuplicated := func() { + tk.MustExec(bindinfo.StmtRemoveDuplicatedPseudoBinding) + } + + checkPseudoBinding(1) + insertPseudoBinding() + checkPseudoBinding(2) + removeDuplicated() + checkPseudoBinding(1) + + insertPseudoBinding() + insertPseudoBinding() + insertPseudoBinding() + checkPseudoBinding(4) + removeDuplicated() + checkPseudoBinding(1) + removeDuplicated() + checkPseudoBinding(1) +} + +type mockSessionPool struct { + se sessiontypes.Session +} + +func (p *mockSessionPool) Get() (pools.Resource, error) { + return p.se, nil +} + +func (p *mockSessionPool) Put(pools.Resource) { +} diff --git a/pkg/bindinfo/handle.go b/pkg/bindinfo/handle.go deleted file mode 100644 index 4c7ad623c1fda..0000000000000 --- a/pkg/bindinfo/handle.go +++ /dev/null @@ -1,1289 +0,0 @@ -// Copyright 2019 PingCAP, 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. - -package bindinfo - -import ( - "context" - "fmt" - "runtime" - "strconv" - "strings" - "sync" - "sync/atomic" - "time" - - "github.com/pingcap/tidb/pkg/kv" - "github.com/pingcap/tidb/pkg/metrics" - "github.com/pingcap/tidb/pkg/parser" - "github.com/pingcap/tidb/pkg/parser/ast" - "github.com/pingcap/tidb/pkg/parser/format" - "github.com/pingcap/tidb/pkg/parser/mysql" - "github.com/pingcap/tidb/pkg/parser/terror" - "github.com/pingcap/tidb/pkg/sessionctx" - "github.com/pingcap/tidb/pkg/sessionctx/stmtctx" - "github.com/pingcap/tidb/pkg/sessionctx/variable" - "github.com/pingcap/tidb/pkg/types" - driver "github.com/pingcap/tidb/pkg/types/parser_driver" - "github.com/pingcap/tidb/pkg/util/chunk" - "github.com/pingcap/tidb/pkg/util/hint" - "github.com/pingcap/tidb/pkg/util/logutil" - utilparser "github.com/pingcap/tidb/pkg/util/parser" - "github.com/pingcap/tidb/pkg/util/sqlescape" - "github.com/pingcap/tidb/pkg/util/sqlexec" - stmtsummaryv2 "github.com/pingcap/tidb/pkg/util/stmtsummary/v2" - tablefilter "github.com/pingcap/tidb/pkg/util/table-filter" - "github.com/pingcap/tidb/pkg/util/timeutil" - "go.uber.org/zap" - "golang.org/x/exp/maps" -) - -// BindHandle is used to handle all global sql bind operations. -type BindHandle struct { - sctx struct { - sync.Mutex - sessionctx.Context - } - - // bindInfo caches the sql bind info from storage. - // - // The Mutex protects that there is only one goroutine changes the content - // of atomic.Value. - // - // NOTE: Concurrent Value Write: - // - // bindInfo.Lock() - // newCache := bindInfo.Value.Load() - // do the write operation on the newCache - // bindInfo.Value.Store(newCache) - // bindInfo.Unlock() - // - // NOTE: Concurrent Value Read: - // - // cache := bindInfo.Load(). - // read the content - // - bindInfo struct { - sync.Mutex - atomic.Value - parser *parser.Parser - lastUpdateTime types.Time - } - - // invalidBindRecordMap indicates the invalid bind records found during querying. - // A record will be deleted from this map, after 2 bind-lease, after it is dropped from the kv. - invalidBindRecordMap tmpBindRecordMap - - // pendingVerifyBindRecordMap indicates the pending verify bind records that found during query. - pendingVerifyBindRecordMap tmpBindRecordMap -} - -// Lease influences the duration of loading bind info and handling invalid bind. -var Lease = 3 * time.Second - -const ( - // OwnerKey is the bindinfo owner path that is saved to etcd. - OwnerKey = "/tidb/bindinfo/owner" - // Prompt is the prompt for bindinfo owner manager. - Prompt = "bindinfo" - // BuiltinPseudoSQL4BindLock is used to simulate LOCK TABLE for mysql.bind_info. - BuiltinPseudoSQL4BindLock = "builtin_pseudo_sql_for_bind_lock" -) - -type bindRecordUpdate struct { - bindRecord *BindRecord - updateTime time.Time -} - -// NewBindHandle creates a new BindHandle. -func NewBindHandle(ctx sessionctx.Context) *BindHandle { - handle := &BindHandle{} - handle.Reset(ctx) - return handle -} - -// Reset is to reset the BindHandle and clean old info. -func (h *BindHandle) Reset(ctx sessionctx.Context) { - h.bindInfo.Lock() - defer h.bindInfo.Unlock() - h.sctx.Context = ctx - h.bindInfo.Value.Store(newBindCache()) - h.bindInfo.parser = parser.New() - h.invalidBindRecordMap.Value.Store(make(map[string]*bindRecordUpdate)) - h.invalidBindRecordMap.flushFunc = func(record *BindRecord) error { - _, err := h.DropBindRecord(record.OriginalSQL, record.Db, &record.Bindings[0]) - return err - } - h.pendingVerifyBindRecordMap.Value.Store(make(map[string]*bindRecordUpdate)) - h.pendingVerifyBindRecordMap.flushFunc = func(record *BindRecord) error { - // BindSQL has already been validated when coming here, so we use nil sctx parameter. - return h.AddBindRecord(nil, record) - } - variable.RegisterStatistics(h) -} - -// Update updates the global sql bind cache. -func (h *BindHandle) Update(fullLoad bool) (err error) { - h.bindInfo.Lock() - lastUpdateTime := h.bindInfo.lastUpdateTime - var timeCondition string - if !fullLoad { - timeCondition = fmt.Sprintf("WHERE update_time>'%s'", lastUpdateTime.String()) - } - - exec := h.sctx.Context.(sqlexec.RestrictedSQLExecutor) - - ctx := kv.WithInternalSourceType(context.Background(), kv.InternalTxnBindInfo) - // No need to acquire the session context lock for ExecRestrictedSQL, it - // uses another background session. - selectStmt := fmt.Sprintf(`SELECT original_sql, bind_sql, default_db, status, create_time, - update_time, charset, collation, source, sql_digest, plan_digest FROM mysql.bind_info - %s ORDER BY update_time, create_time`, timeCondition) - rows, _, err := exec.ExecRestrictedSQL(ctx, nil, selectStmt) - - if err != nil { - h.bindInfo.Unlock() - return err - } - - newCache, memExceededErr := h.bindInfo.Value.Load().(*bindCache).Copy() - defer func() { - h.bindInfo.lastUpdateTime = lastUpdateTime - h.bindInfo.Value.Store(newCache) - h.bindInfo.Unlock() - }() - - for _, row := range rows { - // If the memory usage of the binding_cache exceeds its capacity, we will break and do not handle. - if memExceededErr != nil { - break - } - // Skip the builtin record which is designed for binding synchronization. - if row.GetString(0) == BuiltinPseudoSQL4BindLock { - continue - } - hash, meta, err := h.newBindRecord(row) - - // Update lastUpdateTime to the newest one. - // Even if this one is an invalid bind. - if meta.Bindings[0].UpdateTime.Compare(lastUpdateTime) > 0 { - lastUpdateTime = meta.Bindings[0].UpdateTime - } - - if err != nil { - logutil.BgLogger().Debug("failed to generate bind record from data row", zap.String("category", "sql-bind"), zap.Error(err)) - continue - } - - oldRecord := newCache.GetBindRecord(hash, meta.OriginalSQL, meta.Db) - newRecord := merge(oldRecord, meta).removeDeletedBindings() - if len(newRecord.Bindings) > 0 { - err = newCache.SetBindRecord(hash, newRecord) - if err != nil { - memExceededErr = err - } - } else { - newCache.RemoveBindRecord(hash, newRecord) - } - updateMetrics(metrics.ScopeGlobal, oldRecord, newCache.GetBindRecord(hash, meta.OriginalSQL, meta.Db), true) - } - if memExceededErr != nil { - // When the memory capacity of bing_cache is not enough, - // there will be some memory-related errors in multiple places. - // Only needs to be handled once. - logutil.BgLogger().Warn("BindHandle.Update", zap.String("category", "sql-bind"), zap.Error(memExceededErr)) - } - return nil -} - -// CreateBindRecord creates a BindRecord to the storage and the cache. -// It replaces all the exists bindings for the same normalized SQL. -func (h *BindHandle) CreateBindRecord(sctx sessionctx.Context, record *BindRecord) (err error) { - err = record.prepareHints(sctx) - if err != nil { - return err - } - - record.Db = strings.ToLower(record.Db) - h.bindInfo.Lock() - h.sctx.Lock() - defer func() { - h.sctx.Unlock() - h.bindInfo.Unlock() - }() - ctx := kv.WithInternalSourceType(context.Background(), kv.InternalTxnBindInfo) - exec, _ := h.sctx.Context.(sqlexec.SQLExecutor) - _, err = exec.ExecuteInternal(ctx, "BEGIN PESSIMISTIC") - if err != nil { - return - } - - defer func() { - if err != nil { - _, err1 := exec.ExecuteInternal(ctx, "ROLLBACK") - terror.Log(err1) - return - } - - _, err = exec.ExecuteInternal(ctx, "COMMIT") - if err != nil { - return - } - - sqlDigest := parser.DigestNormalized(record.OriginalSQL) - h.setBindRecord(sqlDigest.String(), record) - }() - - // Lock mysql.bind_info to synchronize with CreateBindRecord / AddBindRecord / DropBindRecord on other tidb instances. - if err = h.lockBindInfoTable(); err != nil { - return err - } - - now := types.NewTime(types.FromGoTime(time.Now()), mysql.TypeTimestamp, 3) - - updateTs := now.String() - _, err = exec.ExecuteInternal(ctx, `UPDATE mysql.bind_info SET status = %?, update_time = %? WHERE original_sql = %? AND update_time < %?`, - deleted, updateTs, record.OriginalSQL, updateTs) - if err != nil { - return err - } - - for i := range record.Bindings { - record.Bindings[i].CreateTime = now - record.Bindings[i].UpdateTime = now - - // Insert the BindRecord to the storage. - _, err = exec.ExecuteInternal(ctx, `INSERT INTO mysql.bind_info VALUES (%?,%?, %?, %?, %?, %?, %?, %?, %?, %?, %?)`, - record.OriginalSQL, - record.Bindings[i].BindSQL, - record.Db, - record.Bindings[i].Status, - record.Bindings[i].CreateTime.String(), - record.Bindings[i].UpdateTime.String(), - record.Bindings[i].Charset, - record.Bindings[i].Collation, - record.Bindings[i].Source, - record.Bindings[i].SQLDigest, - record.Bindings[i].PlanDigest, - ) - if err != nil { - return err - } - } - return nil -} - -// AddBindRecord adds a BindRecord to the storage and BindRecord to the cache. -func (h *BindHandle) AddBindRecord(sctx sessionctx.Context, record *BindRecord) (err error) { - err = record.prepareHints(sctx) - if err != nil { - return err - } - - record.Db = strings.ToLower(record.Db) - oldRecord := h.GetBindRecord(parser.DigestNormalized(record.OriginalSQL).String(), record.OriginalSQL, record.Db) - var duplicateBinding *Binding - if oldRecord != nil { - binding := oldRecord.FindBinding(record.Bindings[0].ID) - if binding != nil { - // There is already a binding with status `Enabled`, `Disabled`, `PendingVerify` or `Rejected`, we could directly cancel the job. - if record.Bindings[0].Status == PendingVerify { - return nil - } - // Otherwise, we need to remove it before insert. - duplicateBinding = binding - } - } - - h.bindInfo.Lock() - h.sctx.Lock() - defer func() { - h.sctx.Unlock() - h.bindInfo.Unlock() - }() - ctx := kv.WithInternalSourceType(context.Background(), kv.InternalTxnBindInfo) - exec, _ := h.sctx.Context.(sqlexec.SQLExecutor) - _, err = exec.ExecuteInternal(ctx, "BEGIN PESSIMISTIC") - if err != nil { - return - } - - defer func() { - if err != nil { - _, err1 := exec.ExecuteInternal(ctx, "ROLLBACK") - terror.Log(err1) - return - } - - _, err = exec.ExecuteInternal(ctx, "COMMIT") - if err != nil { - return - } - - h.appendBindRecord(parser.DigestNormalized(record.OriginalSQL).String(), record) - }() - - // Lock mysql.bind_info to synchronize with CreateBindRecord / AddBindRecord / DropBindRecord on other tidb instances. - if err = h.lockBindInfoTable(); err != nil { - return err - } - if duplicateBinding != nil { - _, err = exec.ExecuteInternal(ctx, `DELETE FROM mysql.bind_info WHERE original_sql = %? AND bind_sql = %?`, record.OriginalSQL, duplicateBinding.BindSQL) - if err != nil { - return err - } - } - - now := types.NewTime(types.FromGoTime(time.Now()), mysql.TypeTimestamp, 3) - for i := range record.Bindings { - if duplicateBinding != nil { - record.Bindings[i].CreateTime = duplicateBinding.CreateTime - } else { - record.Bindings[i].CreateTime = now - } - record.Bindings[i].UpdateTime = now - - if record.Bindings[i].SQLDigest == "" { - parser4binding := parser.New() - var originNode ast.StmtNode - originNode, err = parser4binding.ParseOneStmt(record.OriginalSQL, record.Bindings[i].Charset, record.Bindings[i].Collation) - if err != nil { - return err - } - _, sqlDigestWithDB := parser.NormalizeDigest(utilparser.RestoreWithDefaultDB(originNode, record.Db, record.OriginalSQL)) - record.Bindings[i].SQLDigest = sqlDigestWithDB.String() - } - // Insert the BindRecord to the storage. - _, err = exec.ExecuteInternal(ctx, `INSERT INTO mysql.bind_info VALUES (%?, %?, %?, %?, %?, %?, %?, %?, %?, %?, %?)`, - record.OriginalSQL, - record.Bindings[i].BindSQL, - record.Db, - record.Bindings[i].Status, - record.Bindings[i].CreateTime.String(), - record.Bindings[i].UpdateTime.String(), - record.Bindings[i].Charset, - record.Bindings[i].Collation, - record.Bindings[i].Source, - record.Bindings[i].SQLDigest, - record.Bindings[i].PlanDigest, - ) - if err != nil { - return err - } - } - return nil -} - -// DropBindRecord drops a BindRecord to the storage and BindRecord int the cache. -func (h *BindHandle) DropBindRecord(originalSQL, db string, binding *Binding) (deletedRows uint64, err error) { - db = strings.ToLower(db) - h.bindInfo.Lock() - h.sctx.Lock() - defer func() { - h.sctx.Unlock() - h.bindInfo.Unlock() - }() - ctx := kv.WithInternalSourceType(context.Background(), kv.InternalTxnBindInfo) - exec, _ := h.sctx.Context.(sqlexec.SQLExecutor) - _, err = exec.ExecuteInternal(ctx, "BEGIN PESSIMISTIC") - if err != nil { - return 0, err - } - defer func() { - if err != nil { - _, err1 := exec.ExecuteInternal(ctx, "ROLLBACK") - terror.Log(err1) - return - } - - _, err = exec.ExecuteInternal(ctx, "COMMIT") - if err != nil || deletedRows == 0 { - return - } - - record := &BindRecord{OriginalSQL: originalSQL, Db: db} - if binding != nil { - record.Bindings = append(record.Bindings, *binding) - } - h.removeBindRecord(parser.DigestNormalized(originalSQL).String(), record) - }() - - // Lock mysql.bind_info to synchronize with CreateBindRecord / AddBindRecord / DropBindRecord on other tidb instances. - if err = h.lockBindInfoTable(); err != nil { - return 0, err - } - - updateTs := types.NewTime(types.FromGoTime(time.Now()), mysql.TypeTimestamp, 3).String() - - if binding == nil { - _, err = exec.ExecuteInternal(ctx, `UPDATE mysql.bind_info SET status = %?, update_time = %? WHERE original_sql = %? AND update_time < %? AND status != %?`, - deleted, updateTs, originalSQL, updateTs, deleted) - } else { - _, err = exec.ExecuteInternal(ctx, `UPDATE mysql.bind_info SET status = %?, update_time = %? WHERE original_sql = %? AND update_time < %? AND bind_sql = %? and status != %?`, - deleted, updateTs, originalSQL, updateTs, binding.BindSQL, deleted) - } - if err != nil { - return 0, err - } - - return h.sctx.Context.GetSessionVars().StmtCtx.AffectedRows(), nil -} - -// DropBindRecordByDigest drop BindRecord to the storage and BindRecord int the cache. -func (h *BindHandle) DropBindRecordByDigest(sqlDigest string) (deletedRows uint64, err error) { - oldRecord, err := h.GetBindRecordBySQLDigest(sqlDigest) - if err != nil { - return 0, err - } - return h.DropBindRecord(oldRecord.OriginalSQL, strings.ToLower(oldRecord.Db), nil) -} - -// SetBindRecordStatus set a BindRecord's status to the storage and bind cache. -func (h *BindHandle) SetBindRecordStatus(originalSQL string, binding *Binding, newStatus string) (ok bool, err error) { - h.bindInfo.Lock() - h.sctx.Lock() - defer func() { - h.sctx.Unlock() - h.bindInfo.Unlock() - }() - ctx := kv.WithInternalSourceType(context.Background(), kv.InternalTxnBindInfo) - exec, _ := h.sctx.Context.(sqlexec.SQLExecutor) - _, err = exec.ExecuteInternal(ctx, "BEGIN PESSIMISTIC") - if err != nil { - return - } - var ( - updateTs types.Time - oldStatus0, oldStatus1 string - affectRows int - ) - if newStatus == Disabled { - // For compatibility reasons, when we need to 'set binding disabled for ', - // we need to consider both the 'enabled' and 'using' status. - oldStatus0 = Using - oldStatus1 = Enabled - } else if newStatus == Enabled { - // In order to unify the code, two identical old statuses are set. - oldStatus0 = Disabled - oldStatus1 = Disabled - } - defer func() { - if err != nil { - _, err1 := exec.ExecuteInternal(ctx, "ROLLBACK") - terror.Log(err1) - return - } - - _, err = exec.ExecuteInternal(ctx, "COMMIT") - if err != nil { - return - } - if affectRows == 0 { - return - } - - // The set binding status operation is success. - ok = true - record := &BindRecord{OriginalSQL: originalSQL} - sqlDigest := parser.DigestNormalized(record.OriginalSQL) - oldRecord := h.GetBindRecord(sqlDigest.String(), originalSQL, "") - setBindingStatusInCacheSucc := false - if oldRecord != nil && len(oldRecord.Bindings) > 0 { - record.Bindings = make([]Binding, len(oldRecord.Bindings)) - copy(record.Bindings, oldRecord.Bindings) - for ind, oldBinding := range record.Bindings { - if oldBinding.Status == oldStatus0 || oldBinding.Status == oldStatus1 { - if binding == nil || (binding != nil && oldBinding.isSame(binding)) { - setBindingStatusInCacheSucc = true - record.Bindings[ind].Status = newStatus - record.Bindings[ind].UpdateTime = updateTs - } - } - } - } - if setBindingStatusInCacheSucc { - h.setBindRecord(sqlDigest.String(), record) - } - }() - - // Lock mysql.bind_info to synchronize with SetBindingStatus on other tidb instances. - if err = h.lockBindInfoTable(); err != nil { - return - } - - updateTs = types.NewTime(types.FromGoTime(time.Now()), mysql.TypeTimestamp, 3) - updateTsStr := updateTs.String() - - if binding == nil { - _, err = exec.ExecuteInternal(ctx, `UPDATE mysql.bind_info SET status = %?, update_time = %? WHERE original_sql = %? AND update_time < %? AND status IN (%?, %?)`, - newStatus, updateTsStr, originalSQL, updateTsStr, oldStatus0, oldStatus1) - } else { - _, err = exec.ExecuteInternal(ctx, `UPDATE mysql.bind_info SET status = %?, update_time = %? WHERE original_sql = %? AND update_time < %? AND bind_sql = %? AND status IN (%?, %?)`, - newStatus, updateTsStr, originalSQL, updateTsStr, binding.BindSQL, oldStatus0, oldStatus1) - } - affectRows = int(h.sctx.Context.GetSessionVars().StmtCtx.AffectedRows()) - return -} - -// SetBindRecordStatusByDigest set a BindRecord's status to the storage and bind cache. -func (h *BindHandle) SetBindRecordStatusByDigest(newStatus, sqlDigest string) (ok bool, err error) { - oldRecord, err := h.GetBindRecordBySQLDigest(sqlDigest) - if err != nil { - return false, err - } - return h.SetBindRecordStatus(oldRecord.OriginalSQL, nil, newStatus) -} - -// GCBindRecord physically removes the deleted bind records in mysql.bind_info. -func (h *BindHandle) GCBindRecord() (err error) { - h.bindInfo.Lock() - h.sctx.Lock() - defer func() { - h.sctx.Unlock() - h.bindInfo.Unlock() - }() - exec, _ := h.sctx.Context.(sqlexec.SQLExecutor) - ctx := kv.WithInternalSourceType(context.Background(), kv.InternalTxnBindInfo) - _, err = exec.ExecuteInternal(ctx, "BEGIN PESSIMISTIC") - if err != nil { - return err - } - defer func() { - if err != nil { - _, err1 := exec.ExecuteInternal(ctx, "ROLLBACK") - terror.Log(err1) - return - } - - _, err = exec.ExecuteInternal(ctx, "COMMIT") - if err != nil { - return - } - }() - - // Lock mysql.bind_info to synchronize with CreateBindRecord / AddBindRecord / DropBindRecord on other tidb instances. - if err = h.lockBindInfoTable(); err != nil { - return err - } - - // To make sure that all the deleted bind records have been acknowledged to all tidb, - // we only garbage collect those records with update_time before 10 leases. - updateTime := time.Now().Add(-(10 * Lease)) - updateTimeStr := types.NewTime(types.FromGoTime(updateTime), mysql.TypeTimestamp, 3).String() - _, err = exec.ExecuteInternal(ctx, `DELETE FROM mysql.bind_info WHERE status = 'deleted' and update_time < %?`, updateTimeStr) - return err -} - -// lockBindInfoTable simulates `LOCK TABLE mysql.bind_info WRITE` by acquiring a pessimistic lock on a -// special builtin row of mysql.bind_info. Note that this function must be called with h.sctx.Lock() held. -// We can replace this implementation to normal `LOCK TABLE mysql.bind_info WRITE` if that feature is -// generally available later. -// This lock would enforce the CREATE / DROP GLOBAL BINDING statements to be executed sequentially, -// even if they come from different tidb instances. -func (h *BindHandle) lockBindInfoTable() error { - // h.sctx already locked. - ctx := kv.WithInternalSourceType(context.Background(), kv.InternalTxnBindInfo) - exec, _ := h.sctx.Context.(sqlexec.SQLExecutor) - _, err := exec.ExecuteInternal(ctx, h.LockBindInfoSQL()) - return err -} - -// LockBindInfoSQL simulates LOCK TABLE by updating a same row in each pessimistic transaction. -func (*BindHandle) LockBindInfoSQL() string { - sql, err := sqlescape.EscapeSQL("UPDATE mysql.bind_info SET source= %? WHERE original_sql= %?", Builtin, BuiltinPseudoSQL4BindLock) - if err != nil { - return "" - } - return sql -} - -// tmpBindRecordMap is used to temporarily save bind record changes. -// Those changes will be flushed into store periodically. -type tmpBindRecordMap struct { - sync.Mutex - atomic.Value - flushFunc func(record *BindRecord) error -} - -// flushToStore calls flushFunc for items in tmpBindRecordMap and removes them with a delay. -func (tmpMap *tmpBindRecordMap) flushToStore() { - tmpMap.Lock() - defer tmpMap.Unlock() - newMap := copyBindRecordUpdateMap(tmpMap.Load().(map[string]*bindRecordUpdate)) - for key, bindRecord := range newMap { - if bindRecord.updateTime.IsZero() { - err := tmpMap.flushFunc(bindRecord.bindRecord) - if err != nil { - logutil.BgLogger().Debug("flush bind record failed", zap.String("category", "sql-bind"), zap.Error(err)) - } - bindRecord.updateTime = time.Now() - continue - } - - if time.Since(bindRecord.updateTime) > 6*time.Second { - delete(newMap, key) - updateMetrics(metrics.ScopeGlobal, bindRecord.bindRecord, nil, false) - } - } - tmpMap.Store(newMap) -} - -// Add puts a BindRecord into tmpBindRecordMap. -func (tmpMap *tmpBindRecordMap) Add(bindRecord *BindRecord) { - key := bindRecord.OriginalSQL + ":" + bindRecord.Db + ":" + bindRecord.Bindings[0].ID - if _, ok := tmpMap.Load().(map[string]*bindRecordUpdate)[key]; ok { - return - } - tmpMap.Lock() - defer tmpMap.Unlock() - if _, ok := tmpMap.Load().(map[string]*bindRecordUpdate)[key]; ok { - return - } - newMap := copyBindRecordUpdateMap(tmpMap.Load().(map[string]*bindRecordUpdate)) - newMap[key] = &bindRecordUpdate{ - bindRecord: bindRecord, - } - tmpMap.Store(newMap) - updateMetrics(metrics.ScopeGlobal, nil, bindRecord, false) -} - -// DropInvalidBindRecord executes the drop BindRecord tasks. -func (h *BindHandle) DropInvalidBindRecord() { - h.invalidBindRecordMap.flushToStore() -} - -// AddDropInvalidBindTask adds BindRecord which needs to be deleted into invalidBindRecordMap. -func (h *BindHandle) AddDropInvalidBindTask(invalidBindRecord *BindRecord) { - h.invalidBindRecordMap.Add(invalidBindRecord) -} - -// Size returns the size of bind info cache. -func (h *BindHandle) Size() int { - size := len(h.bindInfo.Load().(*bindCache).GetAllBindRecords()) - return size -} - -// GetBindRecord returns the BindRecord of the (normdOrigSQL,db) if BindRecord exist. -func (h *BindHandle) GetBindRecord(hash, normdOrigSQL, db string) *BindRecord { - return h.bindInfo.Load().(*bindCache).GetBindRecord(hash, normdOrigSQL, db) -} - -// GetBindRecordBySQLDigest returns the BindRecord of the sql digest. -func (h *BindHandle) GetBindRecordBySQLDigest(sqlDigest string) (*BindRecord, error) { - return h.bindInfo.Load().(*bindCache).GetBindRecordBySQLDigest(sqlDigest) -} - -// GetAllBindRecord returns all bind records in cache. -func (h *BindHandle) GetAllBindRecord() (bindRecords []*BindRecord) { - return h.bindInfo.Load().(*bindCache).GetAllBindRecords() -} - -// SetBindCacheCapacity reset the capacity for the bindCache. -// It will not affect already cached BindRecords. -func (h *BindHandle) SetBindCacheCapacity(capacity int64) { - h.bindInfo.Load().(*bindCache).SetMemCapacity(capacity) -} - -// GetMemUsage returns the memory usage for the bind cache. -func (h *BindHandle) GetMemUsage() (memUsage int64) { - return h.bindInfo.Load().(*bindCache).GetMemUsage() -} - -// GetMemCapacity returns the memory capacity for the bind cache. -func (h *BindHandle) GetMemCapacity() (memCapacity int64) { - return h.bindInfo.Load().(*bindCache).GetMemCapacity() -} - -// newBindRecord builds BindRecord from a tuple in storage. -func (h *BindHandle) newBindRecord(row chunk.Row) (string, *BindRecord, error) { - status := row.GetString(3) - // For compatibility, the 'Using' status binding will be converted to the 'Enabled' status binding. - if status == Using { - status = Enabled - } - hint := Binding{ - BindSQL: row.GetString(1), - Status: status, - CreateTime: row.GetTime(4), - UpdateTime: row.GetTime(5), - Charset: row.GetString(6), - Collation: row.GetString(7), - Source: row.GetString(8), - SQLDigest: row.GetString(9), - PlanDigest: row.GetString(10), - } - bindRecord := &BindRecord{ - OriginalSQL: row.GetString(0), - Db: strings.ToLower(row.GetString(2)), - Bindings: []Binding{hint}, - } - hash := parser.DigestNormalized(bindRecord.OriginalSQL) - h.sctx.Lock() - defer h.sctx.Unlock() - h.sctx.GetSessionVars().CurrentDB = bindRecord.Db - err := bindRecord.prepareHints(h.sctx.Context) - return hash.String(), bindRecord, err -} - -// setBindRecord sets the BindRecord to the cache, if there already exists a BindRecord, -// it will be overridden. -func (h *BindHandle) setBindRecord(hash string, meta *BindRecord) { - newCache, err0 := h.bindInfo.Value.Load().(*bindCache).Copy() - if err0 != nil { - logutil.BgLogger().Warn("BindHandle.setBindRecord", zap.String("category", "sql-bind"), zap.Error(err0)) - } - oldRecord := newCache.GetBindRecord(hash, meta.OriginalSQL, meta.Db) - err1 := newCache.SetBindRecord(hash, meta) - if err1 != nil && err0 == nil { - logutil.BgLogger().Warn("BindHandle.setBindRecord", zap.String("category", "sql-bind"), zap.Error(err1)) - } - h.bindInfo.Value.Store(newCache) - updateMetrics(metrics.ScopeGlobal, oldRecord, meta, false) -} - -// appendBindRecord adds the BindRecord to the cache, all the stale BindRecords are -// removed from the cache after this operation. -func (h *BindHandle) appendBindRecord(hash string, meta *BindRecord) { - newCache, err0 := h.bindInfo.Value.Load().(*bindCache).Copy() - if err0 != nil { - logutil.BgLogger().Warn("BindHandle.appendBindRecord", zap.String("category", "sql-bind"), zap.Error(err0)) - } - oldRecord := newCache.GetBindRecord(hash, meta.OriginalSQL, meta.Db) - newRecord := merge(oldRecord, meta) - err1 := newCache.SetBindRecord(hash, newRecord) - if err1 != nil && err0 == nil { - // Only need to handle the error once. - logutil.BgLogger().Warn("BindHandle.appendBindRecord", zap.String("category", "sql-bind"), zap.Error(err1)) - } - h.bindInfo.Value.Store(newCache) - updateMetrics(metrics.ScopeGlobal, oldRecord, newRecord, false) -} - -// removeBindRecord removes the BindRecord from the cache. -func (h *BindHandle) removeBindRecord(hash string, meta *BindRecord) { - newCache, err := h.bindInfo.Value.Load().(*bindCache).Copy() - if err != nil { - logutil.BgLogger().Warn("", zap.String("category", "sql-bind"), zap.Error(err)) - } - oldRecord := newCache.GetBindRecord(hash, meta.OriginalSQL, meta.Db) - newCache.RemoveBindRecord(hash, meta) - h.bindInfo.Value.Store(newCache) - updateMetrics(metrics.ScopeGlobal, oldRecord, newCache.GetBindRecord(hash, meta.OriginalSQL, meta.Db), false) -} - -func copyBindRecordUpdateMap(oldMap map[string]*bindRecordUpdate) map[string]*bindRecordUpdate { - newMap := make(map[string]*bindRecordUpdate, len(oldMap)) - maps.Copy(newMap, oldMap) - return newMap -} - -type captureFilter struct { - frequency int64 - tables []tablefilter.Filter // `schema.table` - users map[string]struct{} - - fail bool - currentDB string -} - -func (cf *captureFilter) Enter(in ast.Node) (out ast.Node, skipChildren bool) { - if x, ok := in.(*ast.TableName); ok { - tblEntry := stmtctx.TableEntry{ - DB: x.Schema.L, - Table: x.Name.L, - } - if x.Schema.L == "" { - tblEntry.DB = cf.currentDB - } - for _, tableFilter := range cf.tables { - if tableFilter.MatchTable(tblEntry.DB, tblEntry.Table) { - cf.fail = true // some filter is matched - } - } - } - return in, cf.fail -} - -func (*captureFilter) Leave(in ast.Node) (out ast.Node, ok bool) { - return in, true -} - -func (cf *captureFilter) isEmpty() bool { - return len(cf.tables) == 0 && len(cf.users) == 0 -} - -// ParseCaptureTableFilter checks whether this filter is valid and parses it. -func ParseCaptureTableFilter(tableFilter string) (f tablefilter.Filter, valid bool) { - // forbid wildcards '!' and '@' for safety, - // please see https://github.com/pingcap/tidb-tools/tree/master/pkg/table-filter for more details. - tableFilter = strings.TrimLeft(tableFilter, " \t") - if tableFilter == "" { - return nil, false - } - if tableFilter[0] == '!' || tableFilter[0] == '@' { - return nil, false - } - var err error - f, err = tablefilter.Parse([]string{tableFilter}) - if err != nil { - return nil, false - } - return f, true -} - -func (h *BindHandle) extractCaptureFilterFromStorage() (filter *captureFilter) { - filter = &captureFilter{ - frequency: 1, - users: make(map[string]struct{}), - } - exec := h.sctx.Context.(sqlexec.RestrictedSQLExecutor) - ctx := kv.WithInternalSourceType(context.Background(), kv.InternalTxnBindInfo) - // No need to acquire the session context lock for ExecRestrictedSQL, it - // uses another background session. - rows, _, err := exec.ExecRestrictedSQL(ctx, nil, `SELECT filter_type, filter_value FROM mysql.capture_plan_baselines_blacklist order by filter_type`) - if err != nil { - logutil.BgLogger().Warn("failed to load mysql.capture_plan_baselines_blacklist", zap.String("category", "sql-bind"), zap.Error(err)) - return - } - for _, row := range rows { - filterTp := strings.ToLower(row.GetString(0)) - valStr := strings.ToLower(row.GetString(1)) - switch filterTp { - case "table": - tfilter, valid := ParseCaptureTableFilter(valStr) - if !valid { - logutil.BgLogger().Warn("capture table filter is invalid, ignore it", zap.String("category", "sql-bind"), zap.String("filter_value", valStr)) - continue - } - filter.tables = append(filter.tables, tfilter) - case "user": - filter.users[valStr] = struct{}{} - case "frequency": - f, err := strconv.ParseInt(valStr, 10, 64) - if err != nil { - logutil.BgLogger().Warn("failed to parse frequency type value, ignore it", zap.String("category", "sql-bind"), zap.String("filter_value", valStr), zap.Error(err)) - continue - } - if f < 1 { - logutil.BgLogger().Warn("frequency threshold is less than 1, ignore it", zap.String("category", "sql-bind"), zap.Int64("frequency", f)) - continue - } - if f > filter.frequency { - filter.frequency = f - } - default: - logutil.BgLogger().Warn("unknown capture filter type, ignore it", zap.String("category", "sql-bind"), zap.String("filter_type", filterTp)) - } - } - return -} - -// CaptureBaselines is used to automatically capture plan baselines. -func (h *BindHandle) CaptureBaselines() { - parser4Capture := parser.New() - captureFilter := h.extractCaptureFilterFromStorage() - emptyCaptureFilter := captureFilter.isEmpty() - bindableStmts := stmtsummaryv2.GetMoreThanCntBindableStmt(captureFilter.frequency) - for _, bindableStmt := range bindableStmts { - stmt, err := parser4Capture.ParseOneStmt(bindableStmt.Query, bindableStmt.Charset, bindableStmt.Collation) - if err != nil { - logutil.BgLogger().Debug("parse SQL failed in baseline capture", zap.String("category", "sql-bind"), zap.String("SQL", bindableStmt.Query), zap.Error(err)) - continue - } - if insertStmt, ok := stmt.(*ast.InsertStmt); ok && insertStmt.Select == nil { - continue - } - if !emptyCaptureFilter { - captureFilter.fail = false - captureFilter.currentDB = bindableStmt.Schema - stmt.Accept(captureFilter) - if captureFilter.fail { - continue - } - - if len(captureFilter.users) > 0 { - filteredByUser := true - for user := range bindableStmt.Users { - if _, ok := captureFilter.users[user]; !ok { - filteredByUser = false // some user not in the black-list has processed this stmt - break - } - } - if filteredByUser { - continue - } - } - } - dbName := utilparser.GetDefaultDB(stmt, bindableStmt.Schema) - normalizedSQL, digest := parser.NormalizeDigest(utilparser.RestoreWithDefaultDB(stmt, dbName, bindableStmt.Query)) - if r := h.GetBindRecord(digest.String(), normalizedSQL, dbName); r != nil && r.HasAvailableBinding() { - continue - } - bindSQL := GenerateBindSQL(context.TODO(), stmt, bindableStmt.PlanHint, true, dbName) - if bindSQL == "" { - continue - } - h.sctx.Lock() - charset, collation := h.sctx.GetSessionVars().GetCharsetInfo() - h.sctx.Unlock() - binding := Binding{ - BindSQL: bindSQL, - Status: Enabled, - Charset: charset, - Collation: collation, - Source: Capture, - SQLDigest: digest.String(), - } - // We don't need to pass the `sctx` because the BindSQL has been validated already. - err = h.CreateBindRecord(nil, &BindRecord{OriginalSQL: normalizedSQL, Db: dbName, Bindings: []Binding{binding}}) - if err != nil { - logutil.BgLogger().Debug("create bind record failed in baseline capture", zap.String("category", "sql-bind"), zap.String("SQL", bindableStmt.Query), zap.Error(err)) - } - } -} - -func getHintsForSQL(sctx sessionctx.Context, sql string) (string, error) { - origVals := sctx.GetSessionVars().UsePlanBaselines - sctx.GetSessionVars().UsePlanBaselines = false - - // Usually passing a sprintf to ExecuteInternal is not recommended, but in this case - // it is safe because ExecuteInternal does not permit MultiStatement execution. Thus, - // the statement won't be able to "break out" from EXPLAIN. - ctx := kv.WithInternalSourceType(context.Background(), kv.InternalTxnBindInfo) - rs, err := sctx.(sqlexec.SQLExecutor).ExecuteInternal(ctx, fmt.Sprintf("EXPLAIN FORMAT='hint' %s", sql)) - sctx.GetSessionVars().UsePlanBaselines = origVals - if rs != nil { - defer func() { - // Audit log is collected in Close(), set InRestrictedSQL to avoid 'create sql binding' been recorded as 'explain'. - origin := sctx.GetSessionVars().InRestrictedSQL - sctx.GetSessionVars().InRestrictedSQL = true - terror.Call(rs.Close) - sctx.GetSessionVars().InRestrictedSQL = origin - }() - } - if err != nil { - return "", err - } - chk := rs.NewChunk(nil) - err = rs.Next(context.TODO(), chk) - if err != nil { - return "", err - } - return chk.GetRow(0).GetString(0), nil -} - -// GenerateBindSQL generates binding sqls from stmt node and plan hints. -func GenerateBindSQL(ctx context.Context, stmtNode ast.StmtNode, planHint string, skipCheckIfHasParam bool, defaultDB string) string { - // If would be nil for very simple cases such as point get, we do not need to evolve for them. - if planHint == "" { - return "" - } - if !skipCheckIfHasParam { - paramChecker := ¶mMarkerChecker{} - stmtNode.Accept(paramChecker) - // We need to evolve on current sql, but we cannot restore values for paramMarkers yet, - // so just ignore them now. - if paramChecker.hasParamMarker { - return "" - } - } - // We need to evolve plan based on the current sql, not the original sql which may have different parameters. - // So here we would remove the hint and inject the current best plan hint. - hint.BindHint(stmtNode, &hint.HintsSet{}) - bindSQL := utilparser.RestoreWithDefaultDB(stmtNode, defaultDB, "") - if bindSQL == "" { - return "" - } - switch n := stmtNode.(type) { - case *ast.DeleteStmt: - deleteIdx := strings.Index(bindSQL, "DELETE") - // Remove possible `explain` prefix. - bindSQL = bindSQL[deleteIdx:] - return strings.Replace(bindSQL, "DELETE", fmt.Sprintf("DELETE /*+ %s*/", planHint), 1) - case *ast.UpdateStmt: - updateIdx := strings.Index(bindSQL, "UPDATE") - // Remove possible `explain` prefix. - bindSQL = bindSQL[updateIdx:] - return strings.Replace(bindSQL, "UPDATE", fmt.Sprintf("UPDATE /*+ %s*/", planHint), 1) - case *ast.SelectStmt: - var selectIdx int - if n.With != nil { - var withSb strings.Builder - withIdx := strings.Index(bindSQL, "WITH") - restoreCtx := format.NewRestoreCtx(format.RestoreStringSingleQuotes|format.RestoreSpacesAroundBinaryOperation|format.RestoreStringWithoutCharset|format.RestoreNameBackQuotes, &withSb) - restoreCtx.DefaultDB = defaultDB - if err := n.With.Restore(restoreCtx); err != nil { - logutil.BgLogger().Debug("restore SQL failed", zap.String("category", "sql-bind"), zap.Error(err)) - return "" - } - withEnd := withIdx + len(withSb.String()) - tmp := strings.Replace(bindSQL[withEnd:], "SELECT", fmt.Sprintf("SELECT /*+ %s*/", planHint), 1) - return strings.Join([]string{bindSQL[withIdx:withEnd], tmp}, "") - } - selectIdx = strings.Index(bindSQL, "SELECT") - // Remove possible `explain` prefix. - bindSQL = bindSQL[selectIdx:] - return strings.Replace(bindSQL, "SELECT", fmt.Sprintf("SELECT /*+ %s*/", planHint), 1) - case *ast.InsertStmt: - insertIdx := int(0) - if n.IsReplace { - insertIdx = strings.Index(bindSQL, "REPLACE") - } else { - insertIdx = strings.Index(bindSQL, "INSERT") - } - // Remove possible `explain` prefix. - bindSQL = bindSQL[insertIdx:] - return strings.Replace(bindSQL, "SELECT", fmt.Sprintf("SELECT /*+ %s*/", planHint), 1) - } - logutil.Logger(ctx).Debug("unexpected statement type when generating bind SQL", zap.String("category", "sql-bind"), zap.Any("statement", stmtNode)) - return "" -} - -type paramMarkerChecker struct { - hasParamMarker bool -} - -func (e *paramMarkerChecker) Enter(in ast.Node) (ast.Node, bool) { - if _, ok := in.(*driver.ParamMarkerExpr); ok { - e.hasParamMarker = true - return in, true - } - return in, false -} - -func (*paramMarkerChecker) Leave(in ast.Node) (ast.Node, bool) { - return in, true -} - -// AddEvolvePlanTask adds the evolve plan task into memory cache. It would be flushed to store periodically. -func (h *BindHandle) AddEvolvePlanTask(originalSQL, db string, binding Binding) { - br := &BindRecord{ - OriginalSQL: originalSQL, - Db: db, - Bindings: []Binding{binding}, - } - h.pendingVerifyBindRecordMap.Add(br) -} - -// SaveEvolveTasksToStore saves the evolve task into store. -func (h *BindHandle) SaveEvolveTasksToStore() { - h.pendingVerifyBindRecordMap.flushToStore() -} - -func getEvolveParameters(sctx sessionctx.Context) (time.Duration, time.Time, time.Time, error) { - ctx := kv.WithInternalSourceType(context.Background(), kv.InternalTxnBindInfo) - rows, _, err := sctx.(sqlexec.RestrictedSQLExecutor).ExecRestrictedSQL( - ctx, - nil, - "SELECT variable_name, variable_value FROM mysql.global_variables WHERE variable_name IN (%?, %?, %?)", - variable.TiDBEvolvePlanTaskMaxTime, - variable.TiDBEvolvePlanTaskStartTime, - variable.TiDBEvolvePlanTaskEndTime, - ) - if err != nil { - return 0, time.Time{}, time.Time{}, err - } - maxTime, startTimeStr, endTimeStr := int64(variable.DefTiDBEvolvePlanTaskMaxTime), variable.DefTiDBEvolvePlanTaskStartTime, variable.DefAutoAnalyzeEndTime - for _, row := range rows { - switch row.GetString(0) { - case variable.TiDBEvolvePlanTaskMaxTime: - maxTime, err = strconv.ParseInt(row.GetString(1), 10, 64) - if err != nil { - return 0, time.Time{}, time.Time{}, err - } - case variable.TiDBEvolvePlanTaskStartTime: - startTimeStr = row.GetString(1) - case variable.TiDBEvolvePlanTaskEndTime: - endTimeStr = row.GetString(1) - } - } - startTime, err := time.ParseInLocation(variable.FullDayTimeFormat, startTimeStr, time.UTC) - if err != nil { - return 0, time.Time{}, time.Time{}, err - } - endTime, err := time.ParseInLocation(variable.FullDayTimeFormat, endTimeStr, time.UTC) - if err != nil { - return 0, time.Time{}, time.Time{}, err - } - return time.Duration(maxTime) * time.Second, startTime, endTime, nil -} - -const ( - // acceptFactor is the factor to decide should we accept the pending verified plan. - // A pending verified plan will be accepted if it performs at least `acceptFactor` times better than the accepted plans. - acceptFactor = 1.5 - // verifyTimeoutFactor is how long to wait to verify the pending plan. - // For debugging purposes it is useful to wait a few times longer than the current execution time so that - // an informative error can be written to the log. - verifyTimeoutFactor = 2.0 - // nextVerifyDuration is the duration that we will retry the rejected plans. - nextVerifyDuration = 7 * 24 * time.Hour -) - -func (h *BindHandle) getOnePendingVerifyJob() (originalSQL, db string, binding Binding) { - cache := h.bindInfo.Value.Load().(*bindCache) - for _, bindRecord := range cache.GetAllBindRecords() { - for _, bind := range bindRecord.Bindings { - if bind.Status == PendingVerify { - return bindRecord.OriginalSQL, bindRecord.Db, bind - } - if bind.Status != Rejected { - continue - } - dur, err := bind.SinceUpdateTime() - // Should not happen. - if err != nil { - continue - } - // Rejected and retry it now. - if dur > nextVerifyDuration { - return bindRecord.OriginalSQL, bindRecord.Db, bind - } - } - } - return "", "", Binding{} -} - -func (*BindHandle) getRunningDuration(sctx sessionctx.Context, db, sql string, maxTime time.Duration) (time.Duration, error) { - ctx := kv.WithInternalSourceType(context.Background(), kv.InternalTxnBindInfo) - if db != "" { - _, err := sctx.(sqlexec.SQLExecutor).ExecuteInternal(ctx, "use %n", db) - if err != nil { - return 0, err - } - } - ctx, cancelFunc := context.WithCancel(ctx) - timer := time.NewTimer(maxTime) - defer timer.Stop() - resultChan := make(chan error) - startTime := time.Now() - go runSQL(ctx, sctx, sql, resultChan) - select { - case err := <-resultChan: - cancelFunc() - if err != nil { - return 0, err - } - return time.Since(startTime), nil - case <-timer.C: - cancelFunc() - logutil.BgLogger().Debug("plan verification timed out", zap.String("category", "sql-bind"), zap.Duration("timeElapsed", time.Since(startTime)), zap.String("query", sql)) - } - <-resultChan - return -1, nil -} - -func runSQL(ctx context.Context, sctx sessionctx.Context, sql string, resultChan chan<- error) { - defer func() { - if r := recover(); r != nil { - buf := make([]byte, 4096) - stackSize := runtime.Stack(buf, false) - buf = buf[:stackSize] - resultChan <- fmt.Errorf("run sql panicked: %v", string(buf)) - } - }() - rs, err := sctx.(sqlexec.SQLExecutor).ExecuteInternal(ctx, sql) - if err != nil { - if rs != nil { - terror.Call(rs.Close) - } - resultChan <- err - return - } - chk := rs.NewChunk(nil) - for { - err = rs.Next(ctx, chk) - if err != nil || chk.NumRows() == 0 { - break - } - } - terror.Call(rs.Close) - resultChan <- err -} - -// HandleEvolvePlanTask tries to evolve one plan task. -// It only processes one task at a time because we want each task to use the latest parameters. -func (h *BindHandle) HandleEvolvePlanTask(sctx sessionctx.Context, adminEvolve bool) error { - originalSQL, db, binding := h.getOnePendingVerifyJob() - if originalSQL == "" { - return nil - } - maxTime, startTime, endTime, err := getEvolveParameters(sctx) - if err != nil { - return err - } - if maxTime == 0 || (!timeutil.WithinDayTimePeriod(startTime, endTime, time.Now()) && !adminEvolve) { - return nil - } - sctx.GetSessionVars().UsePlanBaselines = true - currentPlanTime, err := h.getRunningDuration(sctx, db, binding.BindSQL, maxTime) - // If we just return the error to the caller, this job will be retried again and again and cause endless logs, - // since it is still in the bind record. Now we just drop it and if it is actually retryable, - // we will hope for that we can capture this evolve task again. - if err != nil { - _, err = h.DropBindRecord(originalSQL, db, &binding) - return err - } - // If the accepted plan timeouts, it is hard to decide the timeout for verify plan. - // Currently we simply mark the verify plan as `using` if it could run successfully within maxTime. - if currentPlanTime > 0 { - maxTime = time.Duration(float64(currentPlanTime) * verifyTimeoutFactor) - } - sctx.GetSessionVars().UsePlanBaselines = false - verifyPlanTime, err := h.getRunningDuration(sctx, db, binding.BindSQL, maxTime) - if err != nil { - _, err = h.DropBindRecord(originalSQL, db, &binding) - return err - } - if verifyPlanTime == -1 || (float64(verifyPlanTime)*acceptFactor > float64(currentPlanTime)) { - binding.Status = Rejected - digestText, _ := parser.NormalizeDigest(binding.BindSQL) // for log desensitization - logutil.BgLogger().Debug("new plan rejected", zap.String("category", "sql-bind"), - zap.Duration("currentPlanTime", currentPlanTime), - zap.Duration("verifyPlanTime", verifyPlanTime), - zap.String("digestText", digestText), - ) - } else { - binding.Status = Enabled - } - // We don't need to pass the `sctx` because the BindSQL has been validated already. - return h.AddBindRecord(nil, &BindRecord{OriginalSQL: originalSQL, Db: db, Bindings: []Binding{binding}}) -} - -// Clear resets the bind handle. It is only used for test. -func (h *BindHandle) Clear() { - h.bindInfo.Lock() - h.bindInfo.Store(newBindCache()) - h.bindInfo.lastUpdateTime = types.ZeroTimestamp - h.bindInfo.Unlock() - h.invalidBindRecordMap.Store(make(map[string]*bindRecordUpdate)) - h.pendingVerifyBindRecordMap.Store(make(map[string]*bindRecordUpdate)) -} - -// FlushBindings flushes the BindRecord in temp maps to storage and loads them into cache. -func (h *BindHandle) FlushBindings() error { - h.DropInvalidBindRecord() - h.SaveEvolveTasksToStore() - return h.Update(false) -} - -// ReloadBindings clears existing binding cache and do a full load from mysql.bind_info. -// It is used to maintain consistency between cache and mysql.bind_info if the table is deleted or truncated. -func (h *BindHandle) ReloadBindings() error { - h.bindInfo.Lock() - h.bindInfo.Store(newBindCache()) - h.bindInfo.lastUpdateTime = types.ZeroTimestamp - h.bindInfo.Unlock() - return h.Update(true) -} diff --git a/pkg/bindinfo/internal/BUILD.bazel b/pkg/bindinfo/internal/BUILD.bazel index 17dd8231256dd..11798dd4cb1f5 100644 --- a/pkg/bindinfo/internal/BUILD.bazel +++ b/pkg/bindinfo/internal/BUILD.bazel @@ -8,6 +8,7 @@ go_library( deps = [ "//pkg/domain", "//pkg/parser", + "//pkg/parser/ast", "//pkg/testkit", "//pkg/util/parser", "@com_github_stretchr_testify//require", diff --git a/pkg/bindinfo/internal/testutil.go b/pkg/bindinfo/internal/testutil.go index 616acef986314..bddc8ce9ff997 100644 --- a/pkg/bindinfo/internal/testutil.go +++ b/pkg/bindinfo/internal/testutil.go @@ -19,6 +19,7 @@ import ( "github.com/pingcap/tidb/pkg/domain" "github.com/pingcap/tidb/pkg/parser" + "github.com/pingcap/tidb/pkg/parser/ast" "github.com/pingcap/tidb/pkg/testkit" utilparser "github.com/pingcap/tidb/pkg/util/parser" "github.com/stretchr/testify/require" @@ -31,10 +32,10 @@ func UtilCleanBindingEnv(tk *testkit.TestKit, dom *domain.Domain) { } // UtilNormalizeWithDefaultDB normalizes the SQL and returns the normalized SQL and its digest. -func UtilNormalizeWithDefaultDB(t *testing.T, sql string) (normalized, digest string) { +func UtilNormalizeWithDefaultDB(t *testing.T, sql string) (stmt ast.StmtNode, normalized, digest string) { testParser := parser.New() stmt, err := testParser.ParseOneStmt(sql, "", "") require.NoError(t, err) normalized, digestResult := parser.NormalizeDigestForBinding(utilparser.RestoreWithDefaultDB(stmt, "test", "")) - return normalized, digestResult.String() + return stmt, normalized, digestResult.String() } diff --git a/pkg/bindinfo/main_test.go b/pkg/bindinfo/main_test.go index e812dc23429d8..08e38ff87d666 100644 --- a/pkg/bindinfo/main_test.go +++ b/pkg/bindinfo/main_test.go @@ -25,6 +25,7 @@ func TestMain(m *testing.M) { testsetup.SetupForCommonTest() opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), diff --git a/pkg/bindinfo/norm/BUILD.bazel b/pkg/bindinfo/norm/BUILD.bazel new file mode 100644 index 0000000000000..8cc0b53f8f159 --- /dev/null +++ b/pkg/bindinfo/norm/BUILD.bazel @@ -0,0 +1,13 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library") + +go_library( + name = "norm", + srcs = ["normalize.go"], + importpath = "github.com/pingcap/tidb/pkg/bindinfo/norm", + visibility = ["//visibility:public"], + deps = [ + "//pkg/parser", + "//pkg/parser/ast", + "//pkg/util/parser", + ], +) diff --git a/pkg/bindinfo/norm/normalize.go b/pkg/bindinfo/norm/normalize.go new file mode 100644 index 0000000000000..4772c35cb3032 --- /dev/null +++ b/pkg/bindinfo/norm/normalize.go @@ -0,0 +1,127 @@ +// Copyright 2023 PingCAP, 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. + +package norm + +import ( + "strings" + + "github.com/pingcap/tidb/pkg/parser" + "github.com/pingcap/tidb/pkg/parser/ast" + utilparser "github.com/pingcap/tidb/pkg/util/parser" +) + +type option struct { + specifiedDB string + fuzz bool +} + +type optionFunc func(*option) + +// WithFuzz specifies whether to eliminate schema names. +func WithFuzz(fuzz bool) optionFunc { + return func(user *option) { + user.fuzz = fuzz + } +} + +// WithSpecifiedDB specifies the specified DB name. +func WithSpecifiedDB(specifiedDB string) optionFunc { + return func(user *option) { + user.specifiedDB = specifiedDB + } +} + +// NormalizeStmtForBinding normalizes a statement for binding. +// when fuzz is false, schema names will be completed automatically: `select * from t` --> `select * from db . t`. +// when fuzz is true, schema names will be eliminated automatically: `select * from db . t` --> `select * from t`. +func NormalizeStmtForBinding(stmtNode ast.StmtNode, options ...optionFunc) (normalizedStmt, exactSQLDigest string) { + opt := &option{} + for _, option := range options { + option(opt) + } + return normalizeStmt(stmtNode, opt.specifiedDB, opt.fuzz) +} + +// NormalizeStmtForBinding normalizes a statement for binding. +// This function skips Explain automatically, and literals in in-lists will be normalized as '...'. +// For normal bindings, DB name will be completed automatically: +// +// e.g. `select * from t where a in (1, 2, 3)` --> `select * from test.t where a in (...)` +func normalizeStmt(stmtNode ast.StmtNode, specifiedDB string, fuzzy bool) (normalizedStmt, sqlDigest string) { + normalize := func(n ast.StmtNode) (normalizedStmt, sqlDigest string) { + eraseLastSemicolon(n) + var digest *parser.Digest + var normalizedSQL string + if !fuzzy { + normalizedSQL = utilparser.RestoreWithDefaultDB(n, specifiedDB, n.Text()) + } else { + normalizedSQL = utilparser.RestoreWithoutDB(n) + } + normalizedStmt, digest = parser.NormalizeDigestForBinding(normalizedSQL) + return normalizedStmt, digest.String() + } + + switch x := stmtNode.(type) { + case *ast.ExplainStmt: + // This function is only used to find bind record. + // For some SQLs, such as `explain select * from t`, they will be entered here many times, + // but some of them do not want to obtain bind record. + // The difference between them is whether len(x.Text()) is empty. They cannot be distinguished by stmt.restore. + // For these cases, we need return "" as normalize SQL and hash. + if len(x.Text()) == 0 { + return "", "" + } + switch x.Stmt.(type) { + case *ast.SelectStmt, *ast.DeleteStmt, *ast.UpdateStmt, *ast.InsertStmt: + normalizeSQL, digest := normalize(x.Stmt) + return normalizeSQL, digest + case *ast.SetOprStmt: + normalizeExplainSQL, _ := normalize(x) + + idx := strings.Index(normalizeExplainSQL, "select") + parenthesesIdx := strings.Index(normalizeExplainSQL, "(") + if parenthesesIdx != -1 && parenthesesIdx < idx { + idx = parenthesesIdx + } + // If the SQL is `EXPLAIN ((VALUES ROW ()) ORDER BY 1);`, the idx will be -1. + if idx == -1 { + hash := parser.DigestNormalized(normalizeExplainSQL) + return normalizeExplainSQL, hash.String() + } + normalizeSQL := normalizeExplainSQL[idx:] + hash := parser.DigestNormalized(normalizeSQL) + return normalizeSQL, hash.String() + } + case *ast.SelectStmt, *ast.SetOprStmt, *ast.DeleteStmt, *ast.UpdateStmt, *ast.InsertStmt: + // This function is only used to find bind record. + // For some SQLs, such as `explain select * from t`, they will be entered here many times, + // but some of them do not want to obtain bind record. + // The difference between them is whether len(x.Text()) is empty. They cannot be distinguished by stmt.restore. + // For these cases, we need return "" as normalize SQL and hash. + if len(x.Text()) == 0 { + return "", "" + } + normalizedSQL, digest := normalize(x) + return normalizedSQL, digest + } + return "", "" +} + +func eraseLastSemicolon(stmt ast.StmtNode) { + sql := stmt.Text() + if len(sql) > 0 && sql[len(sql)-1] == ';' { + stmt.SetText(nil, sql[:len(sql)-1]) + } +} diff --git a/pkg/bindinfo/session_handle.go b/pkg/bindinfo/session_handle.go index ba34cf0b50c13..e88ce72d55f03 100644 --- a/pkg/bindinfo/session_handle.go +++ b/pkg/bindinfo/session_handle.go @@ -20,8 +20,11 @@ import ( "strings" "time" + "github.com/pingcap/errors" + "github.com/pingcap/tidb/pkg/bindinfo/norm" "github.com/pingcap/tidb/pkg/metrics" "github.com/pingcap/tidb/pkg/parser" + "github.com/pingcap/tidb/pkg/parser/ast" "github.com/pingcap/tidb/pkg/parser/mysql" "github.com/pingcap/tidb/pkg/sessionctx" "github.com/pingcap/tidb/pkg/sessionctx/sessionstates" @@ -31,99 +34,118 @@ import ( "go.uber.org/zap" ) -// SessionHandle is used to handle all session sql bind operations. -type SessionHandle struct { +// SessionBindingHandle is used to handle all session sql bind operations. +type SessionBindingHandle interface { + // CreateSessionBinding creates a binding to the cache. + CreateSessionBinding(sctx sessionctx.Context, binding Binding) (err error) + + // DropSessionBinding drops a binding by the sql digest. + DropSessionBinding(sqlDigest string) error + + // MatchSessionBinding returns the matched binding for this statement. + MatchSessionBinding(sctx sessionctx.Context, fuzzyDigest string, tableNames []*ast.TableName) (matchedBinding Binding, isMatched bool) + + // GetAllSessionBindings return all bindings. + GetAllSessionBindings() (bindings Bindings) + + // Close closes the SessionBindingHandle. + Close() + + sessionctx.SessionStatesHandler +} + +// sessionBindingHandle is used to handle all session sql bind operations. +type sessionBindingHandle struct { ch *bindCache } -// NewSessionBindHandle creates a new SessionBindHandle. -func NewSessionBindHandle() *SessionHandle { - sessionHandle := &SessionHandle{} +// NewSessionBindingHandle creates a new SessionBindingHandle. +func NewSessionBindingHandle() SessionBindingHandle { + sessionHandle := &sessionBindingHandle{} sessionHandle.ch = newBindCache() return sessionHandle } -// appendBindRecord adds the BindRecord to the cache, all the stale bindMetas are +// appendSessionBinding adds the Bindings to the cache, all the stale bindMetas are // removed from the cache after this operation. -func (h *SessionHandle) appendBindRecord(hash string, meta *BindRecord) { - oldRecord := h.ch.GetBindRecord(hash, meta.OriginalSQL, meta.Db) - err := h.ch.SetBindRecord(hash, meta) +func (h *sessionBindingHandle) appendSessionBinding(sqlDigest string, meta Bindings) { + oldBindings := h.ch.GetBinding(sqlDigest) + err := h.ch.SetBinding(sqlDigest, meta) if err != nil { logutil.BgLogger().Warn("SessionHandle.appendBindRecord", zap.String("category", "sql-bind"), zap.Error(err)) } - updateMetrics(metrics.ScopeSession, oldRecord, meta, false) + updateMetrics(metrics.ScopeSession, oldBindings, meta, false) } -// CreateBindRecord creates a BindRecord to the cache. +// CreateSessionBinding creates a Bindings to the cache. // It replaces all the exists bindings for the same normalized SQL. -func (h *SessionHandle) CreateBindRecord(sctx sessionctx.Context, record *BindRecord) (err error) { - err = record.prepareHints(sctx) - if err != nil { +func (h *sessionBindingHandle) CreateSessionBinding(sctx sessionctx.Context, binding Binding) (err error) { + if err := prepareHints(sctx, &binding); err != nil { return err } - record.Db = strings.ToLower(record.Db) + binding.Db = strings.ToLower(binding.Db) now := types.NewTime(types.FromGoTime(time.Now().In(sctx.GetSessionVars().StmtCtx.TimeZone())), mysql.TypeTimestamp, 3) - for i := range record.Bindings { - record.Bindings[i].CreateTime = now - record.Bindings[i].UpdateTime = now - } + binding.CreateTime = now + binding.UpdateTime = now // update the BindMeta to the cache. - h.appendBindRecord(parser.DigestNormalized(record.OriginalSQL).String(), record) + h.appendSessionBinding(parser.DigestNormalized(binding.OriginalSQL).String(), []Binding{binding}) return nil } -// DropBindRecord drops a BindRecord in the cache. -func (h *SessionHandle) DropBindRecord(originalSQL, db string, binding *Binding) error { - db = strings.ToLower(db) - hash := parser.DigestNormalized(originalSQL).String() - oldRecord := h.GetBindRecord(hash, originalSQL, db) - var newRecord *BindRecord - record := &BindRecord{OriginalSQL: originalSQL, Db: db} - if binding != nil { - record.Bindings = append(record.Bindings, *binding) +// DropSessionBinding drop Bindings in the cache. +func (h *sessionBindingHandle) DropSessionBinding(sqlDigest string) error { + if sqlDigest == "" { + return errors.New("sql digest is empty") } - if oldRecord != nil { - newRecord = oldRecord.remove(record) - } else { - newRecord = record - } - err := h.ch.SetBindRecord(hash, newRecord) - if err != nil { - // Should never reach here, just return an error for safety - return err - } - updateMetrics(metrics.ScopeSession, oldRecord, newRecord, false) + h.ch.RemoveBinding(sqlDigest) return nil } -// DropBindRecordByDigest drop BindRecord in the cache. -func (h *SessionHandle) DropBindRecordByDigest(sqlDigest string) error { - oldRecord, err := h.GetBindRecordBySQLDigest(sqlDigest) - if err != nil { - return err +// MatchSessionBinding returns the matched binding for this statement. +func (h *sessionBindingHandle) MatchSessionBinding(sctx sessionctx.Context, fuzzyDigest string, tableNames []*ast.TableName) (matchedBinding Binding, isMatched bool) { + // The current implementation is simplistic, but session binding is only for test purpose, so + // there shouldn't be many session bindings, and to keep it simple, this implementation is acceptable. + leastWildcards := len(tableNames) + 1 + bindRecords := h.ch.GetAllBindings() + for _, bindRecord := range bindRecords { + for _, binding := range bindRecord { + bindingStmt, err := parser.New().ParseOneStmt(binding.BindSQL, binding.Charset, binding.Collation) + if err != nil { + return + } + _, bindingFuzzyDigest := norm.NormalizeStmtForBinding(bindingStmt, norm.WithFuzz(true)) + if bindingFuzzyDigest != fuzzyDigest { + continue + } + bindingTableNames := CollectTableNames(bindingStmt) + + numWildcards, matched := fuzzyMatchBindingTableName(sctx.GetSessionVars().CurrentDB, tableNames, bindingTableNames) + if matched && numWildcards > 0 && sctx != nil && !sctx.GetSessionVars().EnableFuzzyBinding { + continue // fuzzy binding is disabled, skip this binding + } + if matched && numWildcards < leastWildcards { + matchedBinding = binding + isMatched = true + leastWildcards = numWildcards + break + } + } } - return h.DropBindRecord(oldRecord.OriginalSQL, strings.ToLower(oldRecord.Db), nil) + return } -// GetBindRecord return the BindMeta of the (normdOrigSQL,db) if BindMeta exist. -func (h *SessionHandle) GetBindRecord(hash, normdOrigSQL, db string) *BindRecord { - return h.ch.GetBindRecord(hash, normdOrigSQL, db) -} - -// GetBindRecordBySQLDigest return all BindMeta corresponding to sqlDigest. -func (h *SessionHandle) GetBindRecordBySQLDigest(sqlDigest string) (*BindRecord, error) { - return h.ch.GetBindRecordBySQLDigest(sqlDigest) -} - -// GetAllBindRecord return all session bind info. -func (h *SessionHandle) GetAllBindRecord() (bindRecords []*BindRecord) { - return h.ch.GetAllBindRecords() +// GetAllSessionBindings return all session bind info. +func (h *sessionBindingHandle) GetAllSessionBindings() (bindings Bindings) { + for _, record := range h.ch.GetAllBindings() { + bindings = append(bindings, record...) + } + return } // EncodeSessionStates implements SessionStatesHandler.EncodeSessionStates interface. -func (h *SessionHandle) EncodeSessionStates(_ context.Context, _ sessionctx.Context, sessionStates *sessionstates.SessionStates) error { - bindRecords := h.ch.GetAllBindRecords() +func (h *sessionBindingHandle) EncodeSessionStates(_ context.Context, _ sessionctx.Context, sessionStates *sessionstates.SessionStates) error { + bindRecords := h.ch.GetAllBindings() if len(bindRecords) == 0 { return nil } @@ -136,27 +158,29 @@ func (h *SessionHandle) EncodeSessionStates(_ context.Context, _ sessionctx.Cont } // DecodeSessionStates implements SessionStatesHandler.DecodeSessionStates interface. -func (h *SessionHandle) DecodeSessionStates(_ context.Context, sctx sessionctx.Context, sessionStates *sessionstates.SessionStates) error { +func (h *sessionBindingHandle) DecodeSessionStates(_ context.Context, sctx sessionctx.Context, sessionStates *sessionstates.SessionStates) error { if len(sessionStates.Bindings) == 0 { return nil } - var records []*BindRecord + var records []Bindings if err := json.Unmarshal(hack.Slice(sessionStates.Bindings), &records); err != nil { return err } for _, record := range records { // Restore hints and ID because hints are hard to encode. - if err := record.prepareHints(sctx); err != nil { - return err + for i := range record { + if err := prepareHints(sctx, &record[i]); err != nil { + return err + } } - h.appendBindRecord(parser.DigestNormalized(record.OriginalSQL).String(), record) + h.appendSessionBinding(parser.DigestNormalized(record[0].OriginalSQL).String(), record) } return nil } // Close closes the session handle. -func (h *SessionHandle) Close() { - for _, bindRecord := range h.ch.GetAllBindRecords() { +func (h *sessionBindingHandle) Close() { + for _, bindRecord := range h.ch.GetAllBindings() { updateMetrics(metrics.ScopeSession, bindRecord, nil, false) } } diff --git a/pkg/bindinfo/session_handle_test.go b/pkg/bindinfo/session_handle_test.go index 82633bb6c0eb5..1769164bf9c02 100644 --- a/pkg/bindinfo/session_handle_test.go +++ b/pkg/bindinfo/session_handle_test.go @@ -22,6 +22,7 @@ import ( "github.com/pingcap/tidb/pkg/bindinfo" "github.com/pingcap/tidb/pkg/bindinfo/internal" + "github.com/pingcap/tidb/pkg/bindinfo/norm" "github.com/pingcap/tidb/pkg/metrics" "github.com/pingcap/tidb/pkg/parser" "github.com/pingcap/tidb/pkg/parser/auth" @@ -74,13 +75,6 @@ func TestGlobalAndSessionBindingBothExist(t *testing.T) { tk.MustHavePlan("SELECT * from t1,t2 where t1.id = t2.id", "MergeJoin") tk.MustExec("drop global binding for SELECT * from t1,t2 where t1.id = t2.id") tk.MustHavePlan("SELECT * from t1,t2 where t1.id = t2.id", "MergeJoin") - - // PART2 : the dropped session binding should continue to block the effect of global binding - tk.MustExec("create global binding for SELECT * from t1,t2 where t1.id = t2.id using SELECT /*+ TIDB_SMJ(t1, t2) */ * from t1,t2 where t1.id = t2.id") - tk.MustExec("drop binding for SELECT * from t1,t2 where t1.id = t2.id") - tk.MustHavePlan("SELECT * from t1,t2 where t1.id = t2.id", "HashJoin") - tk.MustExec("drop global binding for SELECT * from t1,t2 where t1.id = t2.id") - tk.MustHavePlan("SELECT * from t1,t2 where t1.id = t2.id", "HashJoin") } func TestSessionBinding(t *testing.T) { @@ -116,19 +110,21 @@ func TestSessionBinding(t *testing.T) { require.NoError(t, err) require.Equal(t, testSQL.memoryUsage, pb.GetGauge().GetValue()) - handle := tk.Session().Value(bindinfo.SessionBindInfoKeyType).(*bindinfo.SessionHandle) - hash := parser.DigestNormalized(testSQL.originSQL).String() - bindData := handle.GetBindRecord(hash, testSQL.originSQL, "test") - require.NotNil(t, bindData) - require.Equal(t, testSQL.originSQL, bindData.OriginalSQL) - bind := bindData.Bindings[0] - require.Equal(t, testSQL.bindSQL, bind.BindSQL) - require.Equal(t, "test", bindData.Db) - require.Equal(t, bindinfo.Enabled, bind.Status) - require.NotNil(t, bind.Charset) - require.NotNil(t, bind.Collation) - require.NotNil(t, bind.CreateTime) - require.NotNil(t, bind.UpdateTime) + handle := tk.Session().Value(bindinfo.SessionBindInfoKeyType).(bindinfo.SessionBindingHandle) + stmt, err := parser.New().ParseOneStmt(testSQL.originSQL, "", "") + require.NoError(t, err) + + _, fuzzyDigest := norm.NormalizeStmtForBinding(stmt, norm.WithFuzz(true)) + binding, matched := handle.MatchSessionBinding(tk.Session(), fuzzyDigest, bindinfo.CollectTableNames(stmt)) + require.True(t, matched) + require.Equal(t, testSQL.originSQL, binding.OriginalSQL) + require.Equal(t, testSQL.bindSQL, binding.BindSQL) + require.Equal(t, "test", binding.Db) + require.Equal(t, bindinfo.Enabled, binding.Status) + require.NotNil(t, binding.Charset) + require.NotNil(t, binding.Collation) + require.NotNil(t, binding.CreateTime) + require.NotNil(t, binding.UpdateTime) rs, err := tk.Exec("show global bindings") require.NoError(t, err) @@ -155,17 +151,9 @@ func TestSessionBinding(t *testing.T) { _, err = tk.Exec("drop session " + testSQL.dropSQL) require.NoError(t, err) - bindData = handle.GetBindRecord(hash, testSQL.originSQL, "test") - require.NotNil(t, bindData) - require.Equal(t, testSQL.originSQL, bindData.OriginalSQL) - require.Len(t, bindData.Bindings, 0) - - err = metrics.BindTotalGauge.WithLabelValues(metrics.ScopeSession, bindinfo.Enabled).Write(pb) - require.NoError(t, err) - require.Equal(t, float64(0), pb.GetGauge().GetValue()) - err = metrics.BindMemoryUsage.WithLabelValues(metrics.ScopeSession, bindinfo.Enabled).Write(pb) - require.NoError(t, err) - require.Equal(t, float64(0), pb.GetGauge().GetValue()) + _, fuzzyDigest = norm.NormalizeStmtForBinding(stmt, norm.WithFuzz(true)) + _, matched = handle.MatchSessionBinding(tk.Session(), fuzzyDigest, bindinfo.CollectTableNames(stmt)) + require.False(t, matched) // dropped } } @@ -218,8 +206,9 @@ func TestBaselineDBLowerCase(t *testing.T) { internal.UtilCleanBindingEnv(tk, dom) // Simulate existing bindings with upper case default_db. + _, sqlDigest := parser.NormalizeDigestForBinding("select * from `spm` . `t`") tk.MustExec("insert into mysql.bind_info values('select * from `spm` . `t`', 'select * from `spm` . `t`', 'SPM', 'enabled', '2000-01-01 09:00:00', '2000-01-01 09:00:00', '', '','" + - bindinfo.Manual + "', '', '')") + bindinfo.Manual + "', '" + sqlDigest.String() + "', '')") tk.MustQuery("select original_sql, default_db from mysql.bind_info where original_sql = 'select * from `spm` . `t`'").Check(testkit.Rows( "select * from `spm` . `t` SPM", )) @@ -237,7 +226,7 @@ func TestBaselineDBLowerCase(t *testing.T) { internal.UtilCleanBindingEnv(tk, dom) // Simulate existing bindings with upper case default_db. tk.MustExec("insert into mysql.bind_info values('select * from `spm` . `t`', 'select * from `spm` . `t`', 'SPM', 'enabled', '2000-01-01 09:00:00', '2000-01-01 09:00:00', '', '','" + - bindinfo.Manual + "', '', '')") + bindinfo.Manual + "', '" + sqlDigest.String() + "', '')") tk.MustQuery("select original_sql, default_db from mysql.bind_info where original_sql = 'select * from `spm` . `t`'").Check(testkit.Rows( "select * from `spm` . `t` SPM", )) @@ -273,25 +262,16 @@ func TestShowGlobalBindings(t *testing.T) { rows := tk.MustQuery("show global bindings").Rows() require.Len(t, rows, 0) // Simulate existing bindings in the mysql.bind_info. - tk.MustExec("insert into mysql.bind_info values('select * from `spm` . `t`', 'select * from `spm` . `t` USE INDEX (`a`)', 'SPM', 'enabled', '2000-01-01 09:00:00', '2000-01-01 09:00:00', '', '','" + - bindinfo.Manual + "', '', '')") - tk.MustExec("insert into mysql.bind_info values('select * from `spm` . `t0`', 'select * from `spm` . `t0` USE INDEX (`a`)', 'SPM', 'enabled', '2000-01-02 09:00:00', '2000-01-02 09:00:00', '', '','" + - bindinfo.Manual + "', '', '')") - tk.MustExec("insert into mysql.bind_info values('select * from `spm` . `t`', 'select /*+ use_index(`t` `a`)*/ * from `spm` . `t`', 'SPM', 'enabled', '2000-01-03 09:00:00', '2000-01-03 09:00:00', '', '','" + - bindinfo.Manual + "', '', '')") - tk.MustExec("insert into mysql.bind_info values('select * from `spm` . `t0`', 'select /*+ use_index(`t0` `a`)*/ * from `spm` . `t0`', 'SPM', 'enabled', '2000-01-04 09:00:00', '2000-01-04 09:00:00', '', '','" + - bindinfo.Manual + "', '', '')") + tk.MustExec("create global binding using select * from `spm` . `t` USE INDEX (`a`)") + tk.MustExec("create global binding using select * from `spm` . `t0` USE INDEX (`a`)") + tk.MustExec("create global binding using select /*+ use_index(`t` `a`)*/ * from `spm` . `t`") + tk.MustExec("create global binding using select /*+ use_index(`t0` `a`)*/ * from `spm` . `t0`") + tk.MustExec("admin reload bindings") rows = tk.MustQuery("show global bindings").Rows() - require.Len(t, rows, 4) + require.Len(t, rows, 2) require.Equal(t, "select * from `spm` . `t0`", rows[0][0]) - require.Equal(t, "2000-01-04 09:00:00.000", rows[0][5]) - require.Equal(t, "select * from `spm` . `t0`", rows[1][0]) - require.Equal(t, "2000-01-02 09:00:00.000", rows[1][5]) - require.Equal(t, "select * from `spm` . `t`", rows[2][0]) - require.Equal(t, "2000-01-03 09:00:00.000", rows[2][5]) - require.Equal(t, "select * from `spm` . `t`", rows[3][0]) - require.Equal(t, "2000-01-01 09:00:00.000", rows[3][5]) + require.Equal(t, "select * from `spm` . `t`", rows[1][0]) rows = tk.MustQuery("show session bindings").Rows() require.Len(t, rows, 0) @@ -404,12 +384,8 @@ func TestDropSingleBindings(t *testing.T) { require.Equal(t, "SELECT * FROM `test`.`t` USE INDEX (`idx_b`)", rows[0][1]) tk.MustExec("drop binding for select * from t using select * from t use index(idx_a)") rows = tk.MustQuery("show bindings").Rows() - require.Len(t, rows, 1) - require.Equal(t, "SELECT * FROM `test`.`t` USE INDEX (`idx_b`)", rows[0][1]) - tk.MustExec("drop table t") - tk.MustExec("drop binding for select * from t using select * from t use index(idx_b)") - rows = tk.MustQuery("show bindings").Rows() require.Len(t, rows, 0) + tk.MustExec("drop table t") tk.MustExec("create table t(a int, b int, c int, index idx_a(a), index idx_b(b))") // Test drop global bindings. @@ -422,12 +398,8 @@ func TestDropSingleBindings(t *testing.T) { require.Equal(t, "SELECT * FROM `test`.`t` USE INDEX (`idx_b`)", rows[0][1]) tk.MustExec("drop global binding for select * from t using select * from t use index(idx_a)") rows = tk.MustQuery("show global bindings").Rows() - require.Len(t, rows, 1) - require.Equal(t, "SELECT * FROM `test`.`t` USE INDEX (`idx_b`)", rows[0][1]) - tk.MustExec("drop table t") - tk.MustExec("drop global binding for select * from t using select * from t use index(idx_b)") - rows = tk.MustQuery("show global bindings").Rows() require.Len(t, rows, 0) + tk.MustExec("drop table t") } func TestPreparedStmt(t *testing.T) { diff --git a/pkg/bindinfo/stat.go b/pkg/bindinfo/stat.go deleted file mode 100644 index 50bbbfca455ec..0000000000000 --- a/pkg/bindinfo/stat.go +++ /dev/null @@ -1,40 +0,0 @@ -// Copyright 2021 PingCAP, 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. - -package bindinfo - -import ( - "github.com/pingcap/tidb/pkg/sessionctx/variable" -) - -var ( - lastPlanBindingUpdateTime = "last_plan_binding_update_time" -) - -// GetScope gets the status variables scope. -func (*BindHandle) GetScope(_ string) variable.ScopeFlag { - return variable.ScopeSession -} - -// Stats returns the server statistics. -func (h *BindHandle) Stats(_ *variable.SessionVars) (map[string]interface{}, error) { - h.bindInfo.Lock() - defer func() { - h.bindInfo.Unlock() - }() - m := make(map[string]interface{}) - m[lastPlanBindingUpdateTime] = h.bindInfo.lastUpdateTime.String() - - return m, nil -} diff --git a/pkg/bindinfo/tests/BUILD.bazel b/pkg/bindinfo/tests/BUILD.bazel index c08c605becbd5..91b4b02588659 100644 --- a/pkg/bindinfo/tests/BUILD.bazel +++ b/pkg/bindinfo/tests/BUILD.bazel @@ -9,11 +9,11 @@ go_test( ], flaky = True, race = "on", - shard_count = 19, + shard_count = 14, deps = [ "//pkg/bindinfo", "//pkg/bindinfo/internal", - "//pkg/config", + "//pkg/bindinfo/norm", "//pkg/domain", "//pkg/parser", "//pkg/parser/model", diff --git a/pkg/bindinfo/tests/bind_test.go b/pkg/bindinfo/tests/bind_test.go index fe9ea2e232b0e..48f76227de998 100644 --- a/pkg/bindinfo/tests/bind_test.go +++ b/pkg/bindinfo/tests/bind_test.go @@ -22,7 +22,7 @@ import ( "github.com/pingcap/tidb/pkg/bindinfo" "github.com/pingcap/tidb/pkg/bindinfo/internal" - "github.com/pingcap/tidb/pkg/config" + "github.com/pingcap/tidb/pkg/bindinfo/norm" "github.com/pingcap/tidb/pkg/domain" "github.com/pingcap/tidb/pkg/parser" "github.com/pingcap/tidb/pkg/parser/model" @@ -318,19 +318,20 @@ func TestBindingSymbolList(t *testing.T) { require.True(t, tk.MustUseIndex("select a, b from t where a = 3 limit 1, 100", "ib(b)")) // Normalize - sql, hash := parser.NormalizeDigestForBinding("select a, b from test . t where a = 1 limit 0, 1") - - bindData := dom.BindHandle().GetBindRecord(hash.String(), sql, "test") - require.NotNil(t, bindData) - require.Equal(t, "select `a` , `b` from `test` . `t` where `a` = ? limit ...", bindData.OriginalSQL) - bind := bindData.Bindings[0] - require.Equal(t, "SELECT `a`,`b` FROM `test`.`t` USE INDEX (`ib`) WHERE `a` = 1 LIMIT 0,1", bind.BindSQL) - require.Equal(t, "test", bindData.Db) - require.Equal(t, bindinfo.Enabled, bind.Status) - require.NotNil(t, bind.Charset) - require.NotNil(t, bind.Collation) - require.NotNil(t, bind.CreateTime) - require.NotNil(t, bind.UpdateTime) + stmt, err := parser.New().ParseOneStmt("select a, b from test . t where a = 1 limit 0, 1", "", "") + require.NoError(t, err) + + _, fuzzyDigest := norm.NormalizeStmtForBinding(stmt, norm.WithFuzz(true)) + binding, matched := dom.BindHandle().MatchGlobalBinding(tk.Session(), fuzzyDigest, bindinfo.CollectTableNames(stmt)) + require.True(t, matched) + require.Equal(t, "select `a` , `b` from `test` . `t` where `a` = ? limit ...", binding.OriginalSQL) + require.Equal(t, "SELECT `a`,`b` FROM `test`.`t` USE INDEX (`ib`) WHERE `a` = 1 LIMIT 0,1", binding.BindSQL) + require.Equal(t, "test", binding.Db) + require.Equal(t, bindinfo.Enabled, binding.Status) + require.NotNil(t, binding.Charset) + require.NotNil(t, binding.Collation) + require.NotNil(t, binding.CreateTime) + require.NotNil(t, binding.UpdateTime) } // TestBindingInListWithSingleLiteral tests sql with "IN (Lit)", fixes #44298 @@ -345,14 +346,14 @@ func TestBindingInListWithSingleLiteral(t *testing.T) { // GIVEN sqlcmd := "select a, b from t where a in (1)" - binding := `create global binding for select a, b from t where a in (1, 2, 3) using select a, b from t use index (ib) where a in (1, 2, 3)` + bindingStmt := `create global binding for select a, b from t where a in (1, 2, 3) using select a, b from t use index (ib) where a in (1, 2, 3)` // before binding tk.MustQuery(sqlcmd) require.Equal(t, "t:ia", tk.Session().GetSessionVars().StmtCtx.IndexNames[0]) require.True(t, tk.MustUseIndex(sqlcmd, "ia(a)")) - tk.MustExec(binding) + tk.MustExec(bindingStmt) // after binding tk.MustQuery(sqlcmd) @@ -362,19 +363,20 @@ func TestBindingInListWithSingleLiteral(t *testing.T) { tk.MustQuery("select @@last_plan_from_binding").Check(testkit.Rows("1")) // Normalize - sql, hash := parser.NormalizeDigestForBinding("select a, b from test . t where a in (1)") - - bindData := dom.BindHandle().GetBindRecord(hash.String(), sql, "test") - require.NotNil(t, bindData) - require.Equal(t, "select `a` , `b` from `test` . `t` where `a` in ( ... )", bindData.OriginalSQL) - bind := bindData.Bindings[0] - require.Equal(t, "SELECT `a`,`b` FROM `test`.`t` USE INDEX (`ib`) WHERE `a` IN (1,2,3)", bind.BindSQL) - require.Equal(t, "test", bindData.Db) - require.Equal(t, bindinfo.Enabled, bind.Status) - require.NotNil(t, bind.Charset) - require.NotNil(t, bind.Collation) - require.NotNil(t, bind.CreateTime) - require.NotNil(t, bind.UpdateTime) + stmt, err := parser.New().ParseOneStmt("select a, b from test . t where a in (1)", "", "") + require.NoError(t, err) + + _, fuzzyDigest := norm.NormalizeStmtForBinding(stmt, norm.WithFuzz(true)) + binding, matched := dom.BindHandle().MatchGlobalBinding(tk.Session(), fuzzyDigest, bindinfo.CollectTableNames(stmt)) + require.True(t, matched) + require.Equal(t, "select `a` , `b` from `test` . `t` where `a` in ( ... )", binding.OriginalSQL) + require.Equal(t, "SELECT `a`,`b` FROM `test`.`t` USE INDEX (`ib`) WHERE `a` IN (1,2,3)", binding.BindSQL) + require.Equal(t, "test", binding.Db) + require.Equal(t, bindinfo.Enabled, binding.Status) + require.NotNil(t, binding.Charset) + require.NotNil(t, binding.Collation) + require.NotNil(t, binding.CreateTime) + require.NotNil(t, binding.UpdateTime) } func TestBestPlanInBaselines(t *testing.T) { @@ -398,14 +400,15 @@ func TestBestPlanInBaselines(t *testing.T) { tk.MustExec(`create global binding for select a, b from t where a = 1 limit 0, 1 using select /*+ use_index(@sel_1 test.t ia) */ a, b from t where a = 1 limit 0, 1`) tk.MustExec(`create global binding for select a, b from t where b = 1 limit 0, 1 using select /*+ use_index(@sel_1 test.t ib) */ a, b from t where b = 1 limit 0, 1`) - sql, hash := internal.UtilNormalizeWithDefaultDB(t, "select a, b from t where a = 1 limit 0, 1") - bindData := dom.BindHandle().GetBindRecord(hash, sql, "test") - require.NotNil(t, bindData) - require.Equal(t, "select `a` , `b` from `test` . `t` where `a` = ? limit ...", bindData.OriginalSQL) - bind := bindData.Bindings[0] - require.Equal(t, "SELECT /*+ use_index(@`sel_1` `test`.`t` `ia`)*/ `a`,`b` FROM `test`.`t` WHERE `a` = 1 LIMIT 0,1", bind.BindSQL) - require.Equal(t, "test", bindData.Db) - require.Equal(t, bindinfo.Enabled, bind.Status) + stmt, _, _ := internal.UtilNormalizeWithDefaultDB(t, "select a, b from t where a = 1 limit 0, 1") + + _, fuzzyDigest := norm.NormalizeStmtForBinding(stmt, norm.WithFuzz(true)) + binding, matched := dom.BindHandle().MatchGlobalBinding(tk.Session(), fuzzyDigest, bindinfo.CollectTableNames(stmt)) + require.True(t, matched) + require.Equal(t, "select `a` , `b` from `test` . `t` where `a` = ? limit ...", binding.OriginalSQL) + require.Equal(t, "SELECT /*+ use_index(@`sel_1` `test`.`t` `ia`)*/ `a`,`b` FROM `test`.`t` WHERE `a` = 1 LIMIT 0,1", binding.BindSQL) + require.Equal(t, "test", binding.Db) + require.Equal(t, bindinfo.Enabled, binding.Status) tk.MustQuery("select a, b from t where a = 3 limit 1, 10") require.Equal(t, "t:ia", tk.Session().GetSessionVars().StmtCtx.IndexNames[0]) @@ -431,25 +434,26 @@ func TestErrorBind(t *testing.T) { _, err := tk.Exec("create global binding for select * from t where i>100 using select * from t use index(index_t) where i>100") require.NoError(t, err, "err %v", err) - sql, hash := parser.NormalizeDigestForBinding("select * from test . t where i > ?") - bindData := dom.BindHandle().GetBindRecord(hash.String(), sql, "test") - require.NotNil(t, bindData) - require.Equal(t, "select * from `test` . `t` where `i` > ?", bindData.OriginalSQL) - bind := bindData.Bindings[0] - require.Equal(t, "SELECT * FROM `test`.`t` USE INDEX (`index_t`) WHERE `i` > 100", bind.BindSQL) - require.Equal(t, "test", bindData.Db) - require.Equal(t, bindinfo.Enabled, bind.Status) - require.NotNil(t, bind.Charset) - require.NotNil(t, bind.Collation) - require.NotNil(t, bind.CreateTime) - require.NotNil(t, bind.UpdateTime) + stmt, err := parser.New().ParseOneStmt("select * from test . t where i > ?", "", "") + require.NoError(t, err) + _, fuzzyDigest := norm.NormalizeStmtForBinding(stmt, norm.WithFuzz(true)) + binding, matched := dom.BindHandle().MatchGlobalBinding(tk.Session(), fuzzyDigest, bindinfo.CollectTableNames(stmt)) + require.True(t, matched) + require.Equal(t, "select * from `test` . `t` where `i` > ?", binding.OriginalSQL) + require.Equal(t, "SELECT * FROM `test`.`t` USE INDEX (`index_t`) WHERE `i` > 100", binding.BindSQL) + require.Equal(t, "test", binding.Db) + require.Equal(t, bindinfo.Enabled, binding.Status) + require.NotNil(t, binding.Charset) + require.NotNil(t, binding.Collation) + require.NotNil(t, binding.CreateTime) + require.NotNil(t, binding.UpdateTime) tk.MustExec("drop index index_t on t") rs, err := tk.Exec("select * from t where i > 10") require.NoError(t, err) rs.Close() - dom.BindHandle().DropInvalidBindRecord() + dom.BindHandle().DropInvalidGlobalBinding() rs, err = tk.Exec("show global bindings") require.NoError(t, err) @@ -459,129 +463,6 @@ func TestErrorBind(t *testing.T) { require.Equal(t, 0, chk.NumRows()) } -func TestDMLEvolveBaselines(t *testing.T) { - originalVal := config.CheckTableBeforeDrop - config.CheckTableBeforeDrop = true - defer func() { - config.CheckTableBeforeDrop = originalVal - }() - - store := testkit.CreateMockStore(t) - - tk := testkit.NewTestKit(t, store) - tk.MustExec("use test") - tk.MustExec("drop table if exists t") - tk.MustExec("create table t(a int, b int, c int, index idx_b(b), index idx_c(c))") - tk.MustExec("insert into t values (1,1,1), (2,2,2), (3,3,3), (4,4,4), (5,5,5)") - tk.MustExec("analyze table t") - tk.MustExec("set @@tidb_evolve_plan_baselines=1") - - tk.MustExec("create global binding for delete from t where b = 1 and c > 1 using delete /*+ use_index(t,idx_c) */ from t where b = 1 and c > 1") - rows := tk.MustQuery("show global bindings").Rows() - require.Len(t, rows, 1) - tk.MustExec("delete /*+ use_index(t,idx_b) */ from t where b = 2 and c > 1") - require.Equal(t, "t:idx_c", tk.Session().GetSessionVars().StmtCtx.IndexNames[0]) - tk.MustExec("admin flush bindings") - rows = tk.MustQuery("show global bindings").Rows() - require.Len(t, rows, 1) - tk.MustExec("admin evolve bindings") - rows = tk.MustQuery("show global bindings").Rows() - require.Len(t, rows, 1) - - tk.MustExec("create global binding for update t set a = 1 where b = 1 and c > 1 using update /*+ use_index(t,idx_c) */ t set a = 1 where b = 1 and c > 1") - rows = tk.MustQuery("show global bindings").Rows() - require.Len(t, rows, 2) - tk.MustExec("update /*+ use_index(t,idx_b) */ t set a = 2 where b = 2 and c > 1") - require.Equal(t, "t:idx_c", tk.Session().GetSessionVars().StmtCtx.IndexNames[0]) - tk.MustExec("admin flush bindings") - rows = tk.MustQuery("show global bindings").Rows() - require.Len(t, rows, 2) - tk.MustExec("admin evolve bindings") - rows = tk.MustQuery("show global bindings").Rows() - require.Len(t, rows, 2) - - tk.MustExec("create table t1 like t") - tk.MustExec("create global binding for insert into t1 select * from t where t.b = 1 and t.c > 1 using insert into t1 select /*+ use_index(t,idx_c) */ * from t where t.b = 1 and t.c > 1") - rows = tk.MustQuery("show global bindings").Rows() - require.Len(t, rows, 3) - tk.MustExec("insert into t1 select /*+ use_index(t,idx_b) */ * from t where t.b = 2 and t.c > 2") - require.Equal(t, "t:idx_c", tk.Session().GetSessionVars().StmtCtx.IndexNames[0]) - tk.MustExec("admin flush bindings") - rows = tk.MustQuery("show global bindings").Rows() - require.Len(t, rows, 3) - tk.MustExec("admin evolve bindings") - rows = tk.MustQuery("show global bindings").Rows() - require.Len(t, rows, 3) - - tk.MustExec("create global binding for replace into t1 select * from t where t.b = 1 and t.c > 1 using replace into t1 select /*+ use_index(t,idx_c) */ * from t where t.b = 1 and t.c > 1") - rows = tk.MustQuery("show global bindings").Rows() - require.Len(t, rows, 4) - tk.MustExec("replace into t1 select /*+ use_index(t,idx_b) */ * from t where t.b = 2 and t.c > 2") - require.Equal(t, "t:idx_c", tk.Session().GetSessionVars().StmtCtx.IndexNames[0]) - tk.MustExec("admin flush bindings") - rows = tk.MustQuery("show global bindings").Rows() - require.Len(t, rows, 4) - tk.MustExec("admin evolve bindings") - rows = tk.MustQuery("show global bindings").Rows() - require.Len(t, rows, 4) -} - -func TestAddEvolveTasks(t *testing.T) { - originalVal := config.CheckTableBeforeDrop - config.CheckTableBeforeDrop = true - defer func() { - config.CheckTableBeforeDrop = originalVal - }() - - store := testkit.CreateMockStore(t) - - tk := testkit.NewTestKit(t, store) - tk.MustExec("use test") - tk.MustExec("drop table if exists t") - tk.MustExec("create table t(a int, b int, c int, index idx_a(a), index idx_b(b), index idx_c(c))") - tk.MustExec("insert into t values (1,1,1), (2,2,2), (3,3,3), (4,4,4), (5,5,5)") - tk.MustExec("analyze table t") - tk.MustExec("create global binding for select * from t where a >= 1 and b >= 1 and c = 0 using select * from t use index(idx_a) where a >= 1 and b >= 1 and c = 0") - tk.MustExec("set @@tidb_evolve_plan_baselines=1") - // It cannot choose table path although it has lowest cost. - tk.MustQuery("select * from t where a >= 4 and b >= 1 and c = 0") - require.Equal(t, "t:idx_a", tk.Session().GetSessionVars().StmtCtx.IndexNames[0]) - tk.MustExec("admin flush bindings") - rows := tk.MustQuery("show global bindings").Rows() - require.Len(t, rows, 2) - require.Equal(t, "SELECT /*+ use_index(@`sel_1` `test`.`t` )*/ * FROM `test`.`t` WHERE `a` >= 4 AND `b` >= 1 AND `c` = 0", rows[0][1]) - require.Equal(t, "pending verify", rows[0][3]) - tk.MustExec("admin evolve bindings") - rows = tk.MustQuery("show global bindings").Rows() - require.Len(t, rows, 2) - require.Equal(t, "SELECT /*+ use_index(@`sel_1` `test`.`t` )*/ * FROM `test`.`t` WHERE `a` >= 4 AND `b` >= 1 AND `c` = 0", rows[0][1]) - status := rows[0][3].(string) - require.True(t, status == bindinfo.Enabled || status == bindinfo.Rejected) -} - -func TestRuntimeHintsInEvolveTasks(t *testing.T) { - originalVal := config.CheckTableBeforeDrop - config.CheckTableBeforeDrop = true - defer func() { - config.CheckTableBeforeDrop = originalVal - }() - - store := testkit.CreateMockStore(t) - - tk := testkit.NewTestKit(t, store) - tk.MustExec("use test") - tk.MustExec("drop table if exists t") - tk.MustExec("set @@tidb_evolve_plan_baselines=1") - tk.MustExec("create table t(a int, b int, c int, index idx_a(a), index idx_b(b), index idx_c(c))") - - tk.MustExec("create global binding for select * from t where a >= 1 and b >= 1 and c = 0 using select * from t use index(idx_a) where a >= 1 and b >= 1 and c = 0") - tk.MustQuery("select /*+ MAX_EXECUTION_TIME(5000), SET_VAR(TIKV_CLIENT_READ_TIMEOUT=20) */ * from t where a >= 4 and b >= 1 and c = 0") - tk.MustExec("admin flush bindings") - rows := tk.MustQuery("show global bindings").Rows() - require.Len(t, rows, 2) - require.Equal(t, "SELECT /*+ use_index(@`sel_1` `test`.`t` `idx_c`), no_order_index(@`sel_1` `test`.`t` `idx_c`), max_execution_time(5000), set_var(tikv_client_read_timeout = 20)*/ * FROM `test`.`t` WHERE `a` >= 4 AND `b` >= 1 AND `c` = 0", rows[0][1]) -} - func TestStmtHints(t *testing.T) { store := testkit.CreateMockStore(t) @@ -601,36 +482,6 @@ func TestStmtHints(t *testing.T) { //require.Equal(t, uint64(0), tk.Session().GetSessionVars().GetTiKVClientReadTimeout()) } -func TestHintsSetEvolveTask(t *testing.T) { - originalVal := config.CheckTableBeforeDrop - config.CheckTableBeforeDrop = true - defer func() { - config.CheckTableBeforeDrop = originalVal - }() - - store, dom := testkit.CreateMockStoreAndDomain(t) - - tk := testkit.NewTestKit(t, store) - tk.MustExec("use test") - tk.MustExec("drop table if exists t") - tk.MustExec("create table t(a int, index idx_a(a))") - tk.MustExec("create global binding for select * from t where a > 10 using select * from t ignore index(idx_a) where a > 10") - tk.MustExec("set @@tidb_evolve_plan_baselines=1") - tk.MustQuery("select * from t use index(idx_a) where a > 0") - bindHandle := dom.BindHandle() - bindHandle.SaveEvolveTasksToStore() - // Verify the added Binding for evolution contains valid ID and Hint, otherwise, panic may happen. - sql, hash := internal.UtilNormalizeWithDefaultDB(t, "select * from t where a > ?") - bindData := bindHandle.GetBindRecord(hash, sql, "test") - require.NotNil(t, bindData) - require.Equal(t, "select * from `test` . `t` where `a` > ?", bindData.OriginalSQL) - require.Len(t, bindData.Bindings, 2) - bind := bindData.Bindings[1] - require.Equal(t, bindinfo.PendingVerify, bind.Status) - require.NotEqual(t, "", bind.ID) - require.NotNil(t, bind.Hint) -} - func TestHintsSetID(t *testing.T) { store, dom := testkit.CreateMockStoreAndDomain(t) @@ -639,113 +490,56 @@ func TestHintsSetID(t *testing.T) { tk.MustExec("drop table if exists t") tk.MustExec("create table t(a int, index idx_a(a))") tk.MustExec("create global binding for select * from t where a > 10 using select /*+ use_index(test.t, idx_a) */ * from t where a > 10") - bindHandle := dom.BindHandle() // Verify the added Binding contains ID with restored query block. - sql, hash := internal.UtilNormalizeWithDefaultDB(t, "select * from t where a > ?") - bindData := bindHandle.GetBindRecord(hash, sql, "test") - require.NotNil(t, bindData) - require.Equal(t, "select * from `test` . `t` where `a` > ?", bindData.OriginalSQL) - require.Len(t, bindData.Bindings, 1) - bind := bindData.Bindings[0] - require.Equal(t, "use_index(@`sel_1` `test`.`t` `idx_a`)", bind.ID) + stmt, err := parser.New().ParseOneStmt("select * from t where a > ?", "", "") + require.NoError(t, err) + _, fuzzyDigest := norm.NormalizeStmtForBinding(stmt, norm.WithFuzz(true)) + binding, matched := dom.BindHandle().MatchGlobalBinding(tk.Session(), fuzzyDigest, bindinfo.CollectTableNames(stmt)) + require.True(t, matched) + require.Equal(t, "select * from `test` . `t` where `a` > ?", binding.OriginalSQL) + require.Equal(t, "use_index(@`sel_1` `test`.`t` `idx_a`)", binding.ID) internal.UtilCleanBindingEnv(tk, dom) tk.MustExec("create global binding for select * from t where a > 10 using select /*+ use_index(t, idx_a) */ * from t where a > 10") - bindData = bindHandle.GetBindRecord(hash, sql, "test") - require.NotNil(t, bindData) - require.Equal(t, "select * from `test` . `t` where `a` > ?", bindData.OriginalSQL) - require.Len(t, bindData.Bindings, 1) - bind = bindData.Bindings[0] - require.Equal(t, "use_index(@`sel_1` `test`.`t` `idx_a`)", bind.ID) + _, fuzzyDigest = norm.NormalizeStmtForBinding(stmt, norm.WithFuzz(true)) + binding, matched = dom.BindHandle().MatchGlobalBinding(tk.Session(), fuzzyDigest, bindinfo.CollectTableNames(stmt)) + require.True(t, matched) + require.Equal(t, "select * from `test` . `t` where `a` > ?", binding.OriginalSQL) + require.Equal(t, "use_index(@`sel_1` `test`.`t` `idx_a`)", binding.ID) internal.UtilCleanBindingEnv(tk, dom) tk.MustExec("create global binding for select * from t where a > 10 using select /*+ use_index(@sel_1 t, idx_a) */ * from t where a > 10") - bindData = bindHandle.GetBindRecord(hash, sql, "test") - require.NotNil(t, bindData) - require.Equal(t, "select * from `test` . `t` where `a` > ?", bindData.OriginalSQL) - require.Len(t, bindData.Bindings, 1) - bind = bindData.Bindings[0] - require.Equal(t, "use_index(@`sel_1` `test`.`t` `idx_a`)", bind.ID) + _, fuzzyDigest = norm.NormalizeStmtForBinding(stmt, norm.WithFuzz(true)) + binding, matched = dom.BindHandle().MatchGlobalBinding(tk.Session(), fuzzyDigest, bindinfo.CollectTableNames(stmt)) + require.True(t, matched) + require.Equal(t, "select * from `test` . `t` where `a` > ?", binding.OriginalSQL) + require.Equal(t, "use_index(@`sel_1` `test`.`t` `idx_a`)", binding.ID) internal.UtilCleanBindingEnv(tk, dom) tk.MustExec("create global binding for select * from t where a > 10 using select /*+ use_index(@qb1 t, idx_a) qb_name(qb1) */ * from t where a > 10") - bindData = bindHandle.GetBindRecord(hash, sql, "test") - require.NotNil(t, bindData) - require.Equal(t, "select * from `test` . `t` where `a` > ?", bindData.OriginalSQL) - require.Len(t, bindData.Bindings, 1) - bind = bindData.Bindings[0] - require.Equal(t, "use_index(@`sel_1` `test`.`t` `idx_a`)", bind.ID) + _, fuzzyDigest = norm.NormalizeStmtForBinding(stmt, norm.WithFuzz(true)) + binding, matched = dom.BindHandle().MatchGlobalBinding(tk.Session(), fuzzyDigest, bindinfo.CollectTableNames(stmt)) + require.True(t, matched) + require.Equal(t, "select * from `test` . `t` where `a` > ?", binding.OriginalSQL) + require.Equal(t, "use_index(@`sel_1` `test`.`t` `idx_a`)", binding.ID) internal.UtilCleanBindingEnv(tk, dom) tk.MustExec("create global binding for select * from t where a > 10 using select /*+ use_index(T, IDX_A) */ * from t where a > 10") - bindData = bindHandle.GetBindRecord(hash, sql, "test") - require.NotNil(t, bindData) - require.Equal(t, "select * from `test` . `t` where `a` > ?", bindData.OriginalSQL) - require.Len(t, bindData.Bindings, 1) - bind = bindData.Bindings[0] - require.Equal(t, "use_index(@`sel_1` `test`.`t` `idx_a`)", bind.ID) + _, fuzzyDigest = norm.NormalizeStmtForBinding(stmt, norm.WithFuzz(true)) + binding, matched = dom.BindHandle().MatchGlobalBinding(tk.Session(), fuzzyDigest, bindinfo.CollectTableNames(stmt)) + require.True(t, matched) + require.Equal(t, "select * from `test` . `t` where `a` > ?", binding.OriginalSQL) + require.Equal(t, "use_index(@`sel_1` `test`.`t` `idx_a`)", binding.ID) internal.UtilCleanBindingEnv(tk, dom) - err := tk.ExecToErr("create global binding for select * from t using select /*+ non_exist_hint() */ * from t") + err = tk.ExecToErr("create global binding for select * from t using select /*+ non_exist_hint() */ * from t") require.True(t, terror.ErrorEqual(err, parser.ErrParse)) tk.MustExec("create global binding for select * from t where a > 10 using select * from t where a > 10") - bindData = bindHandle.GetBindRecord(hash, sql, "test") - require.NotNil(t, bindData) - require.Equal(t, "select * from `test` . `t` where `a` > ?", bindData.OriginalSQL) - require.Len(t, bindData.Bindings, 1) - bind = bindData.Bindings[0] - require.Equal(t, "", bind.ID) -} - -func TestNotEvolvePlanForReadStorageHint(t *testing.T) { - originalVal := config.CheckTableBeforeDrop - config.CheckTableBeforeDrop = true - defer func() { - config.CheckTableBeforeDrop = originalVal - }() - - store := testkit.CreateMockStore(t) - - tk := testkit.NewTestKit(t, store) - tk.MustExec("use test") - tk.MustExec("set tidb_cost_model_version=2") - tk.MustExec("drop table if exists t") - tk.MustExec("create table t(a int, b int, index idx_a(a), index idx_b(b))") - tk.MustExec("insert into t values (1,1), (2,2), (3,3), (4,4), (5,5), (6,6), (7,7), (8,8), (9,9), (10,10)") - tk.MustExec("analyze table t") - // Create virtual tiflash replica info. - dom := domain.GetDomain(tk.Session()) - is := dom.InfoSchema() - db, exists := is.SchemaByName(model.NewCIStr("test")) - require.True(t, exists) - for _, tblInfo := range db.Tables { - if tblInfo.Name.L == "t" { - tblInfo.TiFlashReplica = &model.TiFlashReplicaInfo{ - Count: 1, - Available: true, - } - } - } - - // Make sure the best plan of the SQL is use TiKV index. - tk.MustExec("set @@session.tidb_executor_concurrency = 4; set @@tidb_allow_mpp=0;") - rows := tk.MustQuery("explain select * from t where a >= 11 and b >= 11").Rows() - require.Equal(t, "cop[tikv]", fmt.Sprintf("%v", rows[len(rows)-1][2])) - tk.MustExec("set @@tidb_allow_mpp=1") - - tk.MustExec("create global binding for select * from t where a >= 1 and b >= 1 using select /*+ read_from_storage(tiflash[t]) */ * from t where a >= 1 and b >= 1") - tk.MustExec("set @@tidb_evolve_plan_baselines=1") - - // Even if index of TiKV has lower cost, it chooses TiFlash. - rows = tk.MustQuery("explain select * from t where a >= 11 and b >= 11").Rows() - require.Equal(t, "mpp[tiflash]", fmt.Sprintf("%v", rows[len(rows)-1][2])) - - tk.MustExec("admin flush bindings") - rows = tk.MustQuery("show global bindings").Rows() - // None evolve task, because of the origin binding is a read_from_storage binding. - require.Len(t, rows, 1) - require.Equal(t, "SELECT /*+ read_from_storage(tiflash[`t`])*/ * FROM `test`.`t` WHERE `a` >= 1 AND `b` >= 1", rows[0][1]) - require.Equal(t, bindinfo.Enabled, rows[0][3]) + _, fuzzyDigest = norm.NormalizeStmtForBinding(stmt, norm.WithFuzz(true)) + binding, matched = dom.BindHandle().MatchGlobalBinding(tk.Session(), fuzzyDigest, bindinfo.CollectTableNames(stmt)) + require.True(t, matched) + require.Equal(t, "select * from `test` . `t` where `a` > ?", binding.OriginalSQL) + require.Equal(t, "", binding.ID) } func TestBindingWithIsolationRead(t *testing.T) { @@ -781,41 +575,6 @@ func TestBindingWithIsolationRead(t *testing.T) { require.Equal(t, "mpp[tiflash]", rows[len(rows)-1][2]) } -func TestReCreateBindAfterEvolvePlan(t *testing.T) { - originalVal := config.CheckTableBeforeDrop - config.CheckTableBeforeDrop = true - defer func() { - config.CheckTableBeforeDrop = originalVal - }() - - store := testkit.CreateMockStore(t) - - tk := testkit.NewTestKit(t, store) - tk.MustExec("use test") - tk.MustExec("drop table if exists t") - tk.MustExec("create table t(a int, b int, c int, index idx_a(a), index idx_b(b), index idx_c(c))") - tk.MustExec("insert into t values (1,1,1), (2,2,2), (3,3,3), (4,4,4), (5,5,5)") - tk.MustExec("analyze table t") - tk.MustExec("create global binding for select * from t where a >= 1 and b >= 1 using select * from t use index(idx_a) where a >= 1 and b >= 1") - tk.MustExec("set @@tidb_evolve_plan_baselines=1") - - // It cannot choose table path although it has lowest cost. - tk.MustQuery("select * from t where a >= 0 and b >= 0") - require.Equal(t, "t:idx_a", tk.Session().GetSessionVars().StmtCtx.IndexNames[0]) - - tk.MustExec("admin flush bindings") - rows := tk.MustQuery("show global bindings").Rows() - require.Len(t, rows, 2) - require.Equal(t, "SELECT /*+ use_index(@`sel_1` `test`.`t` )*/ * FROM `test`.`t` WHERE `a` >= 0 AND `b` >= 0", rows[0][1]) - require.Equal(t, "pending verify", rows[0][3]) - - tk.MustExec("create global binding for select * from t where a >= 1 and b >= 1 using select * from t use index(idx_b) where a >= 1 and b >= 1") - rows = tk.MustQuery("show global bindings").Rows() - require.Len(t, rows, 1) - tk.MustQuery("select * from t where a >= 4 and b >= 1") - require.Equal(t, "t:idx_b", tk.Session().GetSessionVars().StmtCtx.IndexNames[0]) -} - func TestInvisibleIndex(t *testing.T) { store := testkit.CreateMockStore(t) @@ -847,27 +606,7 @@ func TestInvisibleIndex(t *testing.T) { tk.MustExec("execute stmt1") require.Len(t, tk.Session().GetSessionVars().StmtCtx.IndexNames, 0) - tk.MustExec("drop binding for select * from t") -} - -func TestForbidEvolvePlanBaseLinesBeforeGA(t *testing.T) { - originalVal := config.CheckTableBeforeDrop - config.CheckTableBeforeDrop = false - defer func() { - config.CheckTableBeforeDrop = originalVal - }() - - store := testkit.CreateMockStore(t) - - tk := testkit.NewTestKit(t, store) - err := tk.ExecToErr("set @@tidb_evolve_plan_baselines=0") - require.Equal(t, nil, err) - err = tk.ExecToErr("set @@TiDB_Evolve_pLan_baselines=1") - require.EqualError(t, err, "Cannot enable baseline evolution feature, it is not generally available now") - err = tk.ExecToErr("set @@TiDB_Evolve_pLan_baselines=oN") - require.EqualError(t, err, "Cannot enable baseline evolution feature, it is not generally available now") - err = tk.ExecToErr("admin evolve bindings") - require.EqualError(t, err, "Cannot enable baseline evolution feature, it is not generally available now") + tk.MustExec("drop global binding for select * from t") } func TestGCBindRecord(t *testing.T) { @@ -896,7 +635,7 @@ func TestGCBindRecord(t *testing.T) { h := dom.BindHandle() // bindinfo.Lease is set to 0 for test env in SetUpSuite. - require.NoError(t, h.GCBindRecord()) + require.NoError(t, h.GCGlobalBinding()) rows = tk.MustQuery("show global bindings").Rows() require.Len(t, rows, 1) require.Equal(t, "select * from `test` . `t` where `a` = ?", rows[0][0]) @@ -910,7 +649,7 @@ func TestGCBindRecord(t *testing.T) { tk.MustQuery("select status from mysql.bind_info where original_sql = 'select * from `test` . `t` where `a` = ?'").Check(testkit.Rows( "deleted", )) - require.NoError(t, h.GCBindRecord()) + require.NoError(t, h.GCGlobalBinding()) tk.MustQuery("show global bindings").Check(testkit.Rows()) tk.MustQuery("select status from mysql.bind_info where original_sql = 'select * from `test` . `t` where `a` = ?'").Check(testkit.Rows()) } @@ -977,6 +716,33 @@ func TestBindSQLDigest(t *testing.T) { } } +func TestSimplifiedCreateBinding(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec(`use test`) + tk.MustExec(`create table t (a int, b int, key(a))`) + + check := func(scope, sql, binding string) { + r := tk.MustQuery(fmt.Sprintf("show %s bindings", scope)).Rows() + require.Equal(t, len(r), 1) + require.Equal(t, r[0][0].(string), sql) + require.Equal(t, r[0][1].(string), binding) + } + + tk.MustExec(`create binding using select /*+ use_index(t, a) */ * from t`) + check("", "select * from `test` . `t`", "SELECT /*+ use_index(`t` `a`)*/ * FROM `test`.`t`") + tk.MustExec(`drop binding for select * from t`) + tk.MustExec(`create binding using select /*+ use_index(t, a) */ * from t where a<10`) + check("", "select * from `test` . `t` where `a` < ?", "SELECT /*+ use_index(`t` `a`)*/ * FROM `test`.`t` WHERE `a` < 10") + tk.MustExec(`drop binding for select * from t where a<10`) + tk.MustExec(`create global binding using select /*+ use_index(t, a) */ * from t where a in (1)`) + check("global", "select * from `test` . `t` where `a` in ( ... )", "SELECT /*+ use_index(`t` `a`)*/ * FROM `test`.`t` WHERE `a` IN (1)") + tk.MustExec(`drop global binding for select * from t where a in (1)`) + tk.MustExec(`create global binding using select /*+ use_index(t, a) */ * from t where a in (1,2,3)`) + check("global", "select * from `test` . `t` where `a` in ( ... )", "SELECT /*+ use_index(`t` `a`)*/ * FROM `test`.`t` WHERE `a` IN (1,2,3)") + tk.MustExec(`drop global binding for select * from t where a in (1,2,3)`) +} + func TestDropBindBySQLDigest(t *testing.T) { store, dom := testkit.CreateMockStoreAndDomain(t) tk := testkit.NewTestKit(t, store) @@ -1030,15 +796,15 @@ func TestDropBindBySQLDigest(t *testing.T) { internal.UtilCleanBindingEnv(tk, dom) sql := "create global binding for " + c.origin + " using " + c.hint tk.MustExec(sql) - h.ReloadBindings() + h.LoadFromStorageToCache(true) res := tk.MustQuery(`show global bindings`).Rows() require.Equal(t, len(res), 1) require.Equal(t, len(res[0]), 11) drop := fmt.Sprintf("drop global binding for sql digest '%s'", res[0][9]) tk.MustExec(drop) - require.NoError(t, h.GCBindRecord()) - h.ReloadBindings() + require.NoError(t, h.GCGlobalBinding()) + h.LoadFromStorageToCache(true) tk.MustQuery("show global bindings").Check(testkit.Rows()) } @@ -1053,11 +819,30 @@ func TestDropBindBySQLDigest(t *testing.T) { require.Equal(t, len(res[0]), 11) drop := fmt.Sprintf("drop binding for sql digest '%s'", res[0][9]) tk.MustExec(drop) - require.NoError(t, h.GCBindRecord()) + require.NoError(t, h.GCGlobalBinding()) tk.MustQuery("show bindings").Check(testkit.Rows()) } // exception cases - tk.MustGetErrMsg(fmt.Sprintf("drop binding for sql digest '%s'", "1"), "can't find any binding for '1'") tk.MustGetErrMsg(fmt.Sprintf("drop binding for sql digest '%s'", ""), "sql digest is empty") } + +func TestJoinOrderHintWithBinding(t *testing.T) { + store := testkit.CreateMockStore(t) + + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t, t1, t2, t3;") + tk.MustExec("create table t(a int, b int, key(a));") + tk.MustExec("create table t1(a int, b int, key(a));") + tk.MustExec("create table t2(a int, b int, key(a));") + tk.MustExec("create table t3(a int, b int, key(a));") + + tk.MustExec("create global binding for select * from t1 join t2 on t1.a=t2.a left join t3 on t2.b=t3.b using select /*+ leading(t2) */ * from t1 join t2 on t1.a=t2.a left join t3 on t2.b=t3.b") + tk.MustExec("select * from t1 join t2 on t1.a=t2.a left join t3 on t2.b=t3.b") + tk.MustQuery("select @@last_plan_from_binding").Check(testkit.Rows("1")) + res := tk.MustQuery("show global bindings").Rows() + require.Equal(t, res[0][0], "select * from ( `test` . `t1` join `test` . `t2` on `t1` . `a` = `t2` . `a` ) left join `test` . `t3` on `t2` . `b` = `t3` . `b`") + + tk.MustExec("drop global binding for select * from t1 join t2 on t1.a=t2.a join t3 on t2.b=t3.b") +} diff --git a/pkg/bindinfo/tests/main_test.go b/pkg/bindinfo/tests/main_test.go index ff908964a031a..f001b48ddc541 100644 --- a/pkg/bindinfo/tests/main_test.go +++ b/pkg/bindinfo/tests/main_test.go @@ -25,6 +25,7 @@ func TestMain(m *testing.M) { testsetup.SetupForCommonTest() opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), diff --git a/pkg/bindinfo/util.go b/pkg/bindinfo/util.go new file mode 100644 index 0000000000000..dfe0e0605228f --- /dev/null +++ b/pkg/bindinfo/util.go @@ -0,0 +1,52 @@ +// Copyright 2023 PingCAP, 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. + +package bindinfo + +import ( + "context" + + "github.com/ngaut/pools" + "github.com/pingcap/errors" + "github.com/pingcap/tidb/pkg/kv" + "github.com/pingcap/tidb/pkg/parser/ast" + "github.com/pingcap/tidb/pkg/sessionctx" + "github.com/pingcap/tidb/pkg/util/chunk" + "github.com/pingcap/tidb/pkg/util/sqlexec" +) + +// exec is a helper function to execute sql and return RecordSet. +func exec(sctx sessionctx.Context, sql string, args ...interface{}) (sqlexec.RecordSet, error) { + sqlExec, ok := sctx.(sqlexec.SQLExecutor) + if !ok { + return nil, errors.Errorf("invalid sql executor") + } + return sqlExec.ExecuteInternal(kv.WithInternalSourceType(context.Background(), kv.InternalTxnBindInfo), sql, args...) +} + +// execRows is a helper function to execute sql and return rows and fields. +func execRows(sctx sessionctx.Context, sql string, args ...interface{}) (rows []chunk.Row, fields []*ast.ResultField, err error) { + sqlExec, ok := sctx.(sqlexec.RestrictedSQLExecutor) + if !ok { + return nil, nil, errors.Errorf("invalid sql executor") + } + return sqlExec.ExecRestrictedSQL(kv.WithInternalSourceType(context.Background(), kv.InternalTxnBindInfo), + []sqlexec.OptionFuncAlias{sqlexec.ExecOptionUseCurSession}, sql, args...) +} + +// SessionPool is used to recycle sessionctx. +type SessionPool interface { + Get() (pools.Resource, error) + Put(pools.Resource) +} diff --git a/pkg/config/config.go b/pkg/config/config.go index 6b29b8c5ee8b7..ec2b202a08949 100644 --- a/pkg/config/config.go +++ b/pkg/config/config.go @@ -241,8 +241,10 @@ type Config struct { // 2. 'zone' is a special key that indicates the DC location of this tidb-server. If it is set, the value for this // key will be the default value of the session variable `txn_scope` for this tidb-server. Labels map[string]string `toml:"labels" json:"labels"` - // EnableGlobalIndex enables creating global index. + + // EnableGlobalIndex is deprecated. EnableGlobalIndex bool `toml:"enable-global-index" json:"enable-global-index"` + // DeprecateIntegerDisplayWidth indicates whether deprecating the max display length for integer. DeprecateIntegerDisplayWidth bool `toml:"deprecate-integer-display-length" json:"deprecate-integer-display-length"` // EnableEnumLengthLimit indicates whether the enum/set element length is limited. @@ -732,6 +734,11 @@ type Performance struct { EnableLoadFMSketch bool `toml:"enable-load-fmsketch" json:"enable-load-fmsketch"` + // LiteInitStats indicates whether to use the lite version of stats. + // 1. Basic stats meta data is loaded.(count, modify count, etc.) + // 2. Column/index stats are loaded. (only histogram) + // 3. TopN, Bucket, FMSketch are not loaded. + // The lite version of stats is enabled by default. LiteInitStats bool `toml:"lite-init-stats" json:"lite-init-stats"` // If ForceInitStats is true, when tidb starts up, it doesn't provide service until init stats is finished. @@ -1154,6 +1161,7 @@ var removedConfig = map[string]struct{}{ "max-server-connections": {}, // use sysvar max_connections "run-ddl": {}, // use sysvar tidb_enable_ddl "instance.tidb_memory_usage_alarm_ratio": {}, // use sysvar tidb_memory_usage_alarm_ratio + "enable-global-index": {}, // use sysvar tidb_enable_global_index } // isAllRemovedConfigItems returns true if all the items that couldn't validate diff --git a/pkg/config/main_test.go b/pkg/config/main_test.go index 063e004864021..887c36c149a85 100644 --- a/pkg/config/main_test.go +++ b/pkg/config/main_test.go @@ -25,6 +25,7 @@ func TestMain(m *testing.M) { testsetup.SetupForCommonTest() opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), diff --git a/pkg/ddl/BUILD.bazel b/pkg/ddl/BUILD.bazel index 744be405f4dc5..23d556b27e446 100644 --- a/pkg/ddl/BUILD.bazel +++ b/pkg/ddl/BUILD.bazel @@ -13,7 +13,7 @@ go_library( srcs = [ "backfilling.go", "backfilling_clean_s3.go", - "backfilling_dispatcher.go", + "backfilling_dist_executor.go", "backfilling_dist_scheduler.go", "backfilling_import_cloud.go", "backfilling_merge_sort.go", @@ -21,6 +21,7 @@ go_library( "backfilling_proto.go", "backfilling_read_index.go", "backfilling_scheduler.go", + "bdr.go", "callback.go", "cluster.go", "column.go", @@ -29,6 +30,8 @@ go_library( "ddl.go", "ddl_algorithm.go", "ddl_api.go", + "ddl_history.go", + "ddl_running_jobs.go", "ddl_tiflash_api.go", "ddl_worker.go", "ddl_workerpool.go", @@ -65,6 +68,7 @@ go_library( deps = [ "//br/pkg/lightning/backend", "//br/pkg/lightning/backend/external", + "//br/pkg/lightning/backend/local", "//br/pkg/lightning/common", "//br/pkg/lightning/config", "//br/pkg/storage", @@ -78,15 +82,16 @@ go_library( "//pkg/ddl/syncer", "//pkg/ddl/util", "//pkg/distsql", - "//pkg/disttask/framework/dispatcher", "//pkg/disttask/framework/handle", "//pkg/disttask/framework/proto", "//pkg/disttask/framework/scheduler", - "//pkg/disttask/framework/scheduler/execute", "//pkg/disttask/framework/storage", + "//pkg/disttask/framework/taskexecutor", + "//pkg/disttask/framework/taskexecutor/execute", "//pkg/disttask/operator", "//pkg/domain/infosync", "//pkg/domain/resourcegroup", + "//pkg/errctx", "//pkg/expression", "//pkg/infoschema", "//pkg/kv", @@ -116,6 +121,7 @@ go_library( "//pkg/statistics/handle/util", "//pkg/store/copr", "//pkg/store/driver/backoff", + "//pkg/store/driver/txn", "//pkg/store/helper", "//pkg/table", "//pkg/table/tables", @@ -131,6 +137,7 @@ go_library( "//pkg/util/dbterror", "//pkg/util/dbterror/exeerrors", "//pkg/util/domainutil", + "//pkg/util/engine", "//pkg/util/filter", "//pkg/util/gcutil", "//pkg/util/hack", @@ -172,6 +179,7 @@ go_library( "@com_github_tikv_client_go_v2//util", "@com_github_tikv_pd_client//http", "@io_etcd_go_etcd_client_v3//:client", + "@io_etcd_go_etcd_client_v3//concurrency", "@org_golang_x_sync//errgroup", "@org_uber_go_atomic//:atomic", "@org_uber_go_zap//:zap", @@ -183,8 +191,9 @@ go_test( timeout = "moderate", srcs = [ "attributes_sql_test.go", - "backfilling_dispatcher_test.go", + "backfilling_dist_scheduler_test.go", "backfilling_test.go", + "bdr_test.go", "bench_test.go", "cancel_test.go", "cluster_test.go", @@ -203,6 +212,8 @@ go_test( "ddl_algorithm_test.go", "ddl_api_test.go", "ddl_error_test.go", + "ddl_history_test.go", + "ddl_running_jobs_test.go", "ddl_test.go", "ddl_worker_test.go", "ddl_workerpool_test.go", @@ -253,8 +264,8 @@ go_test( "//pkg/ddl/testutil", "//pkg/ddl/util", "//pkg/ddl/util/callback", - "//pkg/disttask/framework/dispatcher", "//pkg/disttask/framework/proto", + "//pkg/disttask/framework/scheduler", "//pkg/disttask/framework/storage", "//pkg/domain", "//pkg/domain/infosync", @@ -304,6 +315,7 @@ go_test( "//pkg/util/mock", "//pkg/util/sem", "//pkg/util/sqlexec", + "//pkg/util/timeutil", "@com_github_docker_go_units//:go-units", "@com_github_ngaut_pools//:pools", "@com_github_pingcap_errors//:errors", diff --git a/pkg/ddl/backfilling.go b/pkg/ddl/backfilling.go index 8c5ca71b0eed6..2ac76983d7c8d 100644 --- a/pkg/ddl/backfilling.go +++ b/pkg/ddl/backfilling.go @@ -171,6 +171,15 @@ func newBackfillCtx(ctx *ddlCtx, id int, sessCtx sessionctx.Context, } } +func updateTxnEntrySizeLimitIfNeeded(txn kv.Transaction) { + if entrySizeLimit := variable.TxnEntrySizeLimit.Load(); entrySizeLimit > 0 { + txn.SetOption(kv.SizeLimits, kv.TxnSizeLimits{ + Entry: entrySizeLimit, + Total: kv.TxnTotalSizeLimit.Load(), + }) + } +} + type backfiller interface { BackfillData(handleRange reorgBackfillTask) (taskCtx backfillTaskContext, err error) AddMetricInfo(float64) @@ -388,6 +397,11 @@ func splitTableRanges(t table.PhysicalTable, store kv.Storage, startKey, endKey zap.Int64("physicalTableID", t.GetPhysicalID()), zap.String("start key", hex.EncodeToString(startKey)), zap.String("end key", hex.EncodeToString(endKey))) + if len(startKey) == 0 && len(endKey) == 0 { + logutil.BgLogger().Info("split table range from PD, get noop table range", zap.String("category", "ddl"), zap.Int64("physicalTableID", t.GetPhysicalID())) + return []kv.KeyRange{}, nil + } + kvRange := kv.KeyRange{StartKey: startKey, EndKey: endKey} s, ok := store.(tikv.Storage) if !ok { @@ -673,9 +687,6 @@ func (dc *ddlCtx) writePhysicalTableRecord(sessPool *sess.Pool, t table.Physical if err := dc.isReorgRunnable(reorgInfo.Job.ID, false); err != nil { return errors.Trace(err) } - if startKey == nil && endKey == nil { - return nil - } failpoint.Inject("MockCaseWhenParseFailure", func(val failpoint.Value) { //nolint:forcetypeassert diff --git a/pkg/ddl/backfilling_clean_s3.go b/pkg/ddl/backfilling_clean_s3.go index 5238b14ec38e9..c7a73efeafd29 100644 --- a/pkg/ddl/backfilling_clean_s3.go +++ b/pkg/ddl/backfilling_clean_s3.go @@ -21,34 +21,34 @@ import ( "github.com/pingcap/tidb/br/pkg/lightning/backend/external" "github.com/pingcap/tidb/br/pkg/storage" - "github.com/pingcap/tidb/pkg/disttask/framework/dispatcher" "github.com/pingcap/tidb/pkg/disttask/framework/proto" + "github.com/pingcap/tidb/pkg/disttask/framework/scheduler" "github.com/pingcap/tidb/pkg/parser/ast" "github.com/pingcap/tidb/pkg/util/logutil" "go.uber.org/zap" ) -var _ dispatcher.CleanUpRoutine = (*BackfillCleanUpS3)(nil) +var _ scheduler.CleanUpRoutine = (*BackfillCleanUpS3)(nil) -// BackfillCleanUpS3 implements dispatcher.CleanUpRoutine. +// BackfillCleanUpS3 implements scheduler.CleanUpRoutine. type BackfillCleanUpS3 struct { } -func newBackfillCleanUpS3() dispatcher.CleanUpRoutine { +func newBackfillCleanUpS3() scheduler.CleanUpRoutine { return &BackfillCleanUpS3{} } // CleanUp implements the CleanUpRoutine.CleanUp interface. func (*BackfillCleanUpS3) CleanUp(ctx context.Context, task *proto.Task) error { - var gTaskMeta BackfillGlobalMeta - if err := json.Unmarshal(task.Meta, &gTaskMeta); err != nil { + var taskMeta BackfillTaskMeta + if err := json.Unmarshal(task.Meta, &taskMeta); err != nil { return err } // Not use cloud storage, no need to cleanUp. - if len(gTaskMeta.CloudStorageURI) == 0 { + if len(taskMeta.CloudStorageURI) == 0 { return nil } - backend, err := storage.ParseBackend(gTaskMeta.CloudStorageURI, nil) + backend, err := storage.ParseBackend(taskMeta.CloudStorageURI, nil) if err != nil { logutil.Logger(ctx).Warn("failed to parse cloud storage uri", zap.Error(err)) return err @@ -58,20 +58,20 @@ func (*BackfillCleanUpS3) CleanUp(ctx context.Context, task *proto.Task) error { logutil.Logger(ctx).Warn("failed to create cloud storage", zap.Error(err)) return err } - prefix := strconv.Itoa(int(gTaskMeta.Job.ID)) + prefix := strconv.Itoa(int(taskMeta.Job.ID)) err = external.CleanUpFiles(ctx, extStore, prefix) if err != nil { logutil.Logger(ctx).Warn("cannot cleanup cloud storage files", zap.Error(err)) return err } - redactCloudStorageURI(ctx, task, &gTaskMeta) + redactCloudStorageURI(ctx, task, &taskMeta) return nil } func redactCloudStorageURI( ctx context.Context, - gTask *proto.Task, - origin *BackfillGlobalMeta, + task *proto.Task, + origin *BackfillTaskMeta, ) { origin.CloudStorageURI = ast.RedactURL(origin.CloudStorageURI) metaBytes, err := json.Marshal(origin) @@ -79,5 +79,5 @@ func redactCloudStorageURI( logutil.Logger(ctx).Warn("failed to marshal task meta", zap.Error(err)) return } - gTask.Meta = metaBytes + task.Meta = metaBytes } diff --git a/pkg/ddl/backfilling_dispatcher.go b/pkg/ddl/backfilling_dispatcher.go deleted file mode 100644 index d8f9ff561eed0..0000000000000 --- a/pkg/ddl/backfilling_dispatcher.go +++ /dev/null @@ -1,576 +0,0 @@ -// Copyright 2023 PingCAP, 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. - -package ddl - -import ( - "bytes" - "context" - "encoding/hex" - "encoding/json" - "math" - "sort" - - "github.com/pingcap/errors" - "github.com/pingcap/failpoint" - "github.com/pingcap/tidb/br/pkg/lightning/backend/external" - "github.com/pingcap/tidb/br/pkg/lightning/config" - "github.com/pingcap/tidb/br/pkg/storage" - "github.com/pingcap/tidb/pkg/ddl/ingest" - "github.com/pingcap/tidb/pkg/disttask/framework/dispatcher" - "github.com/pingcap/tidb/pkg/disttask/framework/proto" - "github.com/pingcap/tidb/pkg/domain/infosync" - "github.com/pingcap/tidb/pkg/kv" - "github.com/pingcap/tidb/pkg/meta" - "github.com/pingcap/tidb/pkg/parser/model" - "github.com/pingcap/tidb/pkg/sessionctx/variable" - "github.com/pingcap/tidb/pkg/store/helper" - "github.com/pingcap/tidb/pkg/table" - "github.com/pingcap/tidb/pkg/util/logutil" - "github.com/tikv/client-go/v2/tikv" - "go.uber.org/zap" -) - -// BackfillingDispatcherExt is an extension of litBackfillDispatcher, exported for test. -type BackfillingDispatcherExt struct { - d *ddl - GlobalSort bool -} - -// NewBackfillingDispatcherExt creates a new backfillingDispatcherExt, only used for test now. -func NewBackfillingDispatcherExt(d DDL) (dispatcher.Extension, error) { - ddl, ok := d.(*ddl) - if !ok { - return nil, errors.New("The getDDL result should be the type of *ddl") - } - return &BackfillingDispatcherExt{ - d: ddl, - }, nil -} - -var _ dispatcher.Extension = (*BackfillingDispatcherExt)(nil) - -// OnTick implements dispatcher.Extension interface. -func (*BackfillingDispatcherExt) OnTick(_ context.Context, _ *proto.Task) { -} - -// OnNextSubtasksBatch generate batch of next step's plan. -func (dsp *BackfillingDispatcherExt) OnNextSubtasksBatch( - ctx context.Context, - taskHandle dispatcher.TaskHandle, - gTask *proto.Task, - serverInfo []*infosync.ServerInfo, - nextStep proto.Step, -) (taskMeta [][]byte, err error) { - logger := logutil.BgLogger().With( - zap.Stringer("type", gTask.Type), - zap.Int64("task-id", gTask.ID), - zap.String("curr-step", StepStr(gTask.Step)), - zap.String("next-step", StepStr(nextStep)), - ) - var backfillMeta BackfillGlobalMeta - if err := json.Unmarshal(gTask.Meta, &backfillMeta); err != nil { - return nil, err - } - job := &backfillMeta.Job - tblInfo, err := getTblInfo(dsp.d, job) - if err != nil { - return nil, err - } - logger.Info("on next subtasks batch") - - // TODO: use planner. - switch nextStep { - case StepReadIndex: - if tblInfo.Partition != nil { - return generatePartitionPlan(tblInfo) - } - return generateNonPartitionPlan(dsp.d, tblInfo, job, dsp.GlobalSort, len(serverInfo)) - case StepMergeSort: - res, err := generateMergePlan(taskHandle, gTask, logger) - if err != nil { - return nil, err - } - if len(res) > 0 { - backfillMeta.UseMergeSort = true - if err := updateMeta(gTask, &backfillMeta); err != nil { - return nil, err - } - } - return res, nil - case StepWriteAndIngest: - if dsp.GlobalSort { - prevStep := StepReadIndex - if backfillMeta.UseMergeSort { - prevStep = StepMergeSort - } - - failpoint.Inject("mockWriteIngest", func() { - m := &BackfillSubTaskMeta{ - SortedKVMeta: external.SortedKVMeta{}, - } - metaBytes, _ := json.Marshal(m) - metaArr := make([][]byte, 0, 16) - metaArr = append(metaArr, metaBytes) - failpoint.Return(metaArr, nil) - }) - return generateGlobalSortIngestPlan( - ctx, - taskHandle, - gTask, - job.ID, - backfillMeta.CloudStorageURI, - prevStep, - logger) - } - return nil, nil - default: - return nil, nil - } -} - -func updateMeta(gTask *proto.Task, taskMeta *BackfillGlobalMeta) error { - bs, err := json.Marshal(taskMeta) - if err != nil { - return errors.Trace(err) - } - gTask.Meta = bs - return nil -} - -// GetNextStep implements dispatcher.Extension interface. -func (dsp *BackfillingDispatcherExt) GetNextStep(task *proto.Task) proto.Step { - switch task.Step { - case proto.StepInit: - return StepReadIndex - case StepReadIndex: - if dsp.GlobalSort { - return StepMergeSort - } - return proto.StepDone - case StepMergeSort: - return StepWriteAndIngest - case StepWriteAndIngest: - return proto.StepDone - default: - return proto.StepDone - } -} - -func skipMergeSort(stats []external.MultipleFilesStat) bool { - failpoint.Inject("forceMergeSort", func() { - failpoint.Return(false) - }) - return external.GetMaxOverlappingTotal(stats) <= external.MergeSortOverlapThreshold -} - -// OnErrStage generate error handling stage's plan. -func (*BackfillingDispatcherExt) OnErrStage(_ context.Context, _ dispatcher.TaskHandle, task *proto.Task, receiveErrs []error) (meta []byte, err error) { - // We do not need extra meta info when rolling back - logger := logutil.BgLogger().With( - zap.Stringer("type", task.Type), - zap.Int64("task-id", task.ID), - zap.String("step", StepStr(task.Step)), - ) - logger.Info("on error stage", zap.Errors("errors", receiveErrs)) - firstErr := receiveErrs[0] - task.Error = firstErr - - return nil, nil -} - -// GetEligibleInstances implements dispatcher.Extension interface. -func (*BackfillingDispatcherExt) GetEligibleInstances(ctx context.Context, _ *proto.Task) ([]*infosync.ServerInfo, bool, error) { - serverInfos, err := dispatcher.GenerateSchedulerNodes(ctx) - if err != nil { - return nil, true, err - } - return serverInfos, true, nil -} - -// IsRetryableErr implements dispatcher.Extension.IsRetryableErr interface. -func (*BackfillingDispatcherExt) IsRetryableErr(error) bool { - return true -} - -// LitBackfillDispatcher wraps BaseDispatcher. -type LitBackfillDispatcher struct { - *dispatcher.BaseDispatcher - d *ddl -} - -func newLitBackfillDispatcher(ctx context.Context, d *ddl, taskMgr dispatcher.TaskManager, - serverID string, task *proto.Task) dispatcher.Dispatcher { - dsp := LitBackfillDispatcher{ - d: d, - BaseDispatcher: dispatcher.NewBaseDispatcher(ctx, taskMgr, serverID, task), - } - return &dsp -} - -// Init implements BaseDispatcher interface. -func (dsp *LitBackfillDispatcher) Init() (err error) { - taskMeta := &BackfillGlobalMeta{} - if err = json.Unmarshal(dsp.BaseDispatcher.Task.Meta, taskMeta); err != nil { - return errors.Annotate(err, "unmarshal task meta failed") - } - dsp.BaseDispatcher.Extension = &BackfillingDispatcherExt{ - d: dsp.d, - GlobalSort: len(taskMeta.CloudStorageURI) > 0} - return dsp.BaseDispatcher.Init() -} - -// Close implements BaseDispatcher interface. -func (dsp *LitBackfillDispatcher) Close() { - dsp.BaseDispatcher.Close() -} - -func getTblInfo(d *ddl, job *model.Job) (tblInfo *model.TableInfo, err error) { - err = kv.RunInNewTxn(d.ctx, d.store, true, func(ctx context.Context, txn kv.Transaction) error { - tblInfo, err = meta.NewMeta(txn).GetTable(job.SchemaID, job.TableID) - return err - }) - if err != nil { - return nil, err - } - - return tblInfo, nil -} - -func generatePartitionPlan(tblInfo *model.TableInfo) (metas [][]byte, err error) { - defs := tblInfo.Partition.Definitions - physicalIDs := make([]int64, len(defs)) - for i := range defs { - physicalIDs[i] = defs[i].ID - } - - subTaskMetas := make([][]byte, 0, len(physicalIDs)) - for _, physicalID := range physicalIDs { - subTaskMeta := &BackfillSubTaskMeta{ - PhysicalTableID: physicalID, - } - - metaBytes, err := json.Marshal(subTaskMeta) - if err != nil { - return nil, err - } - - subTaskMetas = append(subTaskMetas, metaBytes) - } - return subTaskMetas, nil -} - -func generateNonPartitionPlan( - d *ddl, - tblInfo *model.TableInfo, - job *model.Job, - useCloud bool, - instanceCnt int) (metas [][]byte, err error) { - tbl, err := getTable((*asAutoIDRequirement)(d.ddlCtx), job.SchemaID, tblInfo) - if err != nil { - return nil, err - } - ver, err := getValidCurrentVersion(d.store) - if err != nil { - return nil, errors.Trace(err) - } - - startKey, endKey, err := getTableRange(d.jobContext(job.ID, job.ReorgMeta), d.ddlCtx, tbl.(table.PhysicalTable), ver.Ver, job.Priority) - if startKey == nil && endKey == nil { - // Empty table. - return nil, nil - } - if err != nil { - return nil, errors.Trace(err) - } - regionCache := d.store.(helper.Storage).GetRegionCache() - recordRegionMetas, err := regionCache.LoadRegionsInKeyRange(tikv.NewBackofferWithVars(context.Background(), 20000, nil), startKey, endKey) - if err != nil { - return nil, err - } - - regionBatch := calculateRegionBatch(len(recordRegionMetas), instanceCnt, !useCloud) - - subTaskMetas := make([][]byte, 0, 4) - sort.Slice(recordRegionMetas, func(i, j int) bool { - return bytes.Compare(recordRegionMetas[i].StartKey(), recordRegionMetas[j].StartKey()) < 0 - }) - for i := 0; i < len(recordRegionMetas); i += regionBatch { - end := i + regionBatch - if end > len(recordRegionMetas) { - end = len(recordRegionMetas) - } - batch := recordRegionMetas[i:end] - subTaskMeta := &BackfillSubTaskMeta{ - SortedKVMeta: external.SortedKVMeta{ - StartKey: batch[0].StartKey(), - EndKey: batch[len(batch)-1].EndKey(), - }, - } - if i == 0 { - subTaskMeta.StartKey = startKey - } - if end == len(recordRegionMetas) { - subTaskMeta.EndKey = endKey - } - metaBytes, err := json.Marshal(subTaskMeta) - if err != nil { - return nil, err - } - subTaskMetas = append(subTaskMetas, metaBytes) - } - return subTaskMetas, nil -} - -func calculateRegionBatch(totalRegionCnt int, instanceCnt int, useLocalDisk bool) int { - var regionBatch int - avgTasksPerInstance := totalRegionCnt / instanceCnt - if useLocalDisk { - // Make subtask large enough to reduce the overhead of local/global flush. - avgTasksPerDisk := int(int64(variable.DDLDiskQuota.Load()) / int64(config.SplitRegionSize)) - regionBatch = min(avgTasksPerDisk, avgTasksPerInstance) - } else { - regionBatch = min(100, avgTasksPerInstance) - } - regionBatch = max(regionBatch, 1) - return regionBatch -} - -func generateGlobalSortIngestPlan( - ctx context.Context, - taskHandle dispatcher.TaskHandle, - task *proto.Task, - jobID int64, - cloudStorageURI string, - step proto.Step, - logger *zap.Logger, -) ([][]byte, error) { - startKeyFromSumm, endKeyFromSumm, totalSize, dataFiles, statFiles, err := getSummaryFromLastStep(taskHandle, task.ID, step) - if err != nil { - return nil, err - } - instanceIDs, err := dispatcher.GenerateSchedulerNodes(ctx) - if err != nil { - return nil, err - } - splitter, err := getRangeSplitter( - ctx, cloudStorageURI, jobID, int64(totalSize), int64(len(instanceIDs)), dataFiles, statFiles, logger) - if err != nil { - return nil, err - } - defer func() { - err := splitter.Close() - if err != nil { - logger.Error("failed to close range splitter", zap.Error(err)) - } - }() - - metaArr := make([][]byte, 0, 16) - startKey := startKeyFromSumm - var endKey kv.Key - for { - endKeyOfGroup, dataFiles, statFiles, rangeSplitKeys, err := splitter.SplitOneRangesGroup() - if err != nil { - return nil, err - } - if len(endKeyOfGroup) == 0 { - endKey = endKeyFromSumm - } else { - endKey = kv.Key(endKeyOfGroup).Clone() - } - logger.Info("split subtask range", - zap.String("startKey", hex.EncodeToString(startKey)), - zap.String("endKey", hex.EncodeToString(endKey))) - - if startKey.Cmp(endKey) >= 0 { - return nil, errors.Errorf("invalid range, startKey: %s, endKey: %s", - hex.EncodeToString(startKey), hex.EncodeToString(endKey)) - } - m := &BackfillSubTaskMeta{ - SortedKVMeta: external.SortedKVMeta{ - StartKey: startKey, - EndKey: endKey, - TotalKVSize: totalSize / uint64(len(instanceIDs)), - }, - DataFiles: dataFiles, - StatFiles: statFiles, - RangeSplitKeys: rangeSplitKeys, - } - metaBytes, err := json.Marshal(m) - if err != nil { - return nil, err - } - metaArr = append(metaArr, metaBytes) - if len(endKeyOfGroup) == 0 { - return metaArr, nil - } - startKey = endKey - } -} - -func generateMergePlan( - taskHandle dispatcher.TaskHandle, - task *proto.Task, - logger *zap.Logger, -) ([][]byte, error) { - // check data files overlaps, - // if data files overlaps too much, we need a merge step. - subTaskMetas, err := taskHandle.GetPreviousSubtaskMetas(task.ID, StepReadIndex) - if err != nil { - return nil, err - } - multiStats := make([]external.MultipleFilesStat, 0, 100) - for _, bs := range subTaskMetas { - var subtask BackfillSubTaskMeta - err = json.Unmarshal(bs, &subtask) - if err != nil { - return nil, err - } - multiStats = append(multiStats, subtask.MultipleFilesStats...) - } - if skipMergeSort(multiStats) { - logger.Info("skip merge sort") - return nil, nil - } - - // generate merge sort plan. - _, _, _, dataFiles, _, err := getSummaryFromLastStep(taskHandle, task.ID, StepReadIndex) - if err != nil { - return nil, err - } - - start := 0 - step := external.MergeSortFileCountStep - metaArr := make([][]byte, 0, 16) - for start < len(dataFiles) { - end := start + step - if end > len(dataFiles) { - end = len(dataFiles) - } - m := &BackfillSubTaskMeta{ - DataFiles: dataFiles[start:end], - } - metaBytes, err := json.Marshal(m) - if err != nil { - return nil, err - } - metaArr = append(metaArr, metaBytes) - - start = end - } - return metaArr, nil -} - -func getRangeSplitter( - ctx context.Context, - cloudStorageURI string, - jobID int64, - totalSize int64, - instanceCnt int64, - dataFiles, statFiles []string, - logger *zap.Logger, -) (*external.RangeSplitter, error) { - backend, err := storage.ParseBackend(cloudStorageURI, nil) - if err != nil { - return nil, err - } - extStore, err := storage.NewWithDefaultOpt(ctx, backend) - if err != nil { - return nil, err - } - - rangeGroupSize := totalSize / instanceCnt - rangeGroupKeys := int64(math.MaxInt64) - bcCtx, ok := ingest.LitBackCtxMgr.Load(jobID) - if !ok { - return nil, errors.Errorf("backend context not found") - } - - local := bcCtx.GetLocalBackend() - if local == nil { - return nil, errors.Errorf("local backend not found") - } - maxSizePerRange, maxKeysPerRange, err := local.GetRegionSplitSizeKeys(ctx) - if err != nil { - logger.Warn("fail to get region split keys and size", zap.Error(err)) - } - maxSizePerRange = max(maxSizePerRange, int64(config.SplitRegionSize)) - maxKeysPerRange = max(maxKeysPerRange, int64(config.SplitRegionKeys)) - - return external.NewRangeSplitter(ctx, dataFiles, statFiles, extStore, - rangeGroupSize, rangeGroupKeys, maxSizePerRange, maxKeysPerRange, true) -} - -func getSummaryFromLastStep( - taskHandle dispatcher.TaskHandle, - gTaskID int64, - step proto.Step, -) (startKey, endKey kv.Key, totalKVSize uint64, dataFiles, statFiles []string, err error) { - subTaskMetas, err := taskHandle.GetPreviousSubtaskMetas(gTaskID, step) - if err != nil { - return nil, nil, 0, nil, nil, errors.Trace(err) - } - allDataFiles := make([]string, 0, 16) - allStatFiles := make([]string, 0, 16) - for _, subTaskMeta := range subTaskMetas { - var subtask BackfillSubTaskMeta - err := json.Unmarshal(subTaskMeta, &subtask) - if err != nil { - return nil, nil, 0, nil, nil, errors.Trace(err) - } - // Skip empty subtask.StartKey/EndKey because it means - // no records need to be written in this subtask. - if subtask.StartKey == nil || subtask.EndKey == nil { - continue - } - - if len(startKey) == 0 { - startKey = subtask.StartKey - } else { - startKey = external.BytesMin(startKey, subtask.StartKey) - } - if len(endKey) == 0 { - endKey = subtask.EndKey - } else { - endKey = external.BytesMax(endKey, subtask.EndKey) - } - totalKVSize += subtask.TotalKVSize - - for _, stat := range subtask.MultipleFilesStats { - for i := range stat.Filenames { - allDataFiles = append(allDataFiles, stat.Filenames[i][0]) - allStatFiles = append(allStatFiles, stat.Filenames[i][1]) - } - } - } - return startKey, endKey, totalKVSize, allDataFiles, allStatFiles, nil -} - -// StepStr convert proto.Step to string. -func StepStr(step proto.Step) string { - switch step { - case proto.StepInit: - return "init" - case StepReadIndex: - return "read-index" - case StepMergeSort: - return "merge-sort" - case StepWriteAndIngest: - return "write&ingest" - case proto.StepDone: - return "done" - default: - return "unknown" - } -} diff --git a/pkg/ddl/backfilling_dist_executor.go b/pkg/ddl/backfilling_dist_executor.go new file mode 100644 index 0000000000000..e02612569bada --- /dev/null +++ b/pkg/ddl/backfilling_dist_executor.go @@ -0,0 +1,201 @@ +// Copyright 2023 PingCAP, 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. + +package ddl + +import ( + "context" + "encoding/json" + + "github.com/pingcap/errors" + "github.com/pingcap/tidb/br/pkg/lightning/backend/external" + "github.com/pingcap/tidb/br/pkg/lightning/common" + "github.com/pingcap/tidb/pkg/ddl/ingest" + "github.com/pingcap/tidb/pkg/disttask/framework/proto" + "github.com/pingcap/tidb/pkg/disttask/framework/taskexecutor" + "github.com/pingcap/tidb/pkg/disttask/framework/taskexecutor/execute" + "github.com/pingcap/tidb/pkg/parser/model" + "github.com/pingcap/tidb/pkg/parser/terror" + "github.com/pingcap/tidb/pkg/table" + "github.com/pingcap/tidb/pkg/util/dbterror" + "github.com/pingcap/tidb/pkg/util/logutil" + "github.com/tikv/client-go/v2/tikv" + "go.uber.org/zap" +) + +// BackfillTaskMeta is the dist task meta for backfilling index. +type BackfillTaskMeta struct { + Job model.Job `json:"job"` + // EleIDs stands for the index/column IDs to backfill with distributed framework. + EleIDs []int64 `json:"ele_ids"` + // EleTypeKey is the type of the element to backfill with distributed framework. + // For now, only index type is supported. + EleTypeKey []byte `json:"ele_type_key"` + + CloudStorageURI string `json:"cloud_storage_uri"` + // UseMergeSort indicate whether the backfilling task use merge sort step for global sort. + // Merge Sort step aims to support more data. + UseMergeSort bool `json:"use_merge_sort"` +} + +// BackfillSubTaskMeta is the sub-task meta for backfilling index. +type BackfillSubTaskMeta struct { + PhysicalTableID int64 `json:"physical_table_id"` + + RangeSplitKeys [][]byte `json:"range_split_keys"` + DataFiles []string `json:"data-files"` + StatFiles []string `json:"stat-files"` + external.SortedKVMeta `json:",inline"` +} + +// NewBackfillSubtaskExecutor creates a new backfill subtask executor. +func NewBackfillSubtaskExecutor(_ context.Context, taskMeta []byte, d *ddl, + bc ingest.BackendCtx, stage proto.Step, summary *execute.Summary) (execute.StepExecutor, error) { + bgm := &BackfillTaskMeta{} + err := json.Unmarshal(taskMeta, bgm) + if err != nil { + return nil, err + } + jobMeta := &bgm.Job + + _, tbl, err := d.getTableByTxn((*asAutoIDRequirement)(d.ddlCtx), jobMeta.SchemaID, jobMeta.TableID) + if err != nil { + return nil, err + } + indexInfos := make([]*model.IndexInfo, 0, len(bgm.EleIDs)) + for _, eid := range bgm.EleIDs { + indexInfo := model.FindIndexInfoByID(tbl.Meta().Indices, eid) + if indexInfo == nil { + logutil.BgLogger().Warn("index info not found", zap.String("category", "ddl-ingest"), + zap.Int64("table ID", tbl.Meta().ID), zap.Int64("index ID", eid)) + return nil, errors.Errorf("index info not found: %d", eid) + } + indexInfos = append(indexInfos, indexInfo) + } + + switch stage { + case StepReadIndex: + jc := d.jobContext(jobMeta.ID, jobMeta.ReorgMeta) + d.setDDLLabelForTopSQL(jobMeta.ID, jobMeta.Query) + d.setDDLSourceForDiagnosis(jobMeta.ID, jobMeta.Type) + return newReadIndexExecutor( + d, &bgm.Job, indexInfos, tbl.(table.PhysicalTable), jc, bc, summary, bgm.CloudStorageURI), nil + case StepMergeSort: + return newMergeSortExecutor(jobMeta.ID, len(indexInfos), tbl.(table.PhysicalTable), bc, bgm.CloudStorageURI) + case StepWriteAndIngest: + if len(bgm.CloudStorageURI) > 0 { + return newCloudImportExecutor(&bgm.Job, jobMeta.ID, indexInfos[0], tbl.(table.PhysicalTable), bc, bgm.CloudStorageURI) + } + return nil, errors.Errorf("local import does not have write & ingest step") + default: + return nil, errors.Errorf("unknown step %d for job %d", stage, jobMeta.ID) + } +} + +type backfillDistExecutor struct { + *taskexecutor.BaseTaskExecutor + d *ddl + task *proto.Task + taskTable taskexecutor.TaskTable + backendCtx ingest.BackendCtx + jobID int64 +} + +func newBackfillDistExecutor(ctx context.Context, id string, task *proto.Task, taskTable taskexecutor.TaskTable, d *ddl) taskexecutor.TaskExecutor { + s := &backfillDistExecutor{ + BaseTaskExecutor: taskexecutor.NewBaseTaskExecutor(ctx, id, task, taskTable), + d: d, + task: task, + taskTable: taskTable, + } + s.BaseTaskExecutor.Extension = s + return s +} + +func (s *backfillDistExecutor) Init(ctx context.Context) error { + err := s.BaseTaskExecutor.Init(ctx) + if err != nil { + return err + } + d := s.d + + bgm := &BackfillTaskMeta{} + err = json.Unmarshal(s.task.Meta, bgm) + if err != nil { + return errors.Trace(err) + } + job := &bgm.Job + + unique, err := decodeIndexUniqueness(job) + if err != nil { + return err + } + pdLeaderAddr := d.store.(tikv.Storage).GetRegionCache().PDClient().GetLeaderAddr() + bc, err := ingest.LitBackCtxMgr.Register(ctx, unique, job.ID, d.etcdCli, pdLeaderAddr, job.ReorgMeta.ResourceGroupName) + if err != nil { + return errors.Trace(err) + } + s.backendCtx = bc + s.jobID = job.ID + return nil +} + +func decodeIndexUniqueness(job *model.Job) (bool, error) { + unique := make([]bool, 1) + err := job.DecodeArgs(&unique[0]) + if err != nil { + err = job.DecodeArgs(&unique) + } + if err != nil { + return false, errors.Trace(err) + } + // We only support adding multiple unique indexes or multiple non-unique indexes, + // we use the first index uniqueness here. + return unique[0], nil +} + +func (s *backfillDistExecutor) GetStepExecutor(ctx context.Context, task *proto.Task, summary *execute.Summary, _ *proto.StepResource) (execute.StepExecutor, error) { + switch task.Step { + case StepReadIndex, StepMergeSort, StepWriteAndIngest: + return NewBackfillSubtaskExecutor(ctx, task.Meta, s.d, s.backendCtx, task.Step, summary) + default: + return nil, errors.Errorf("unknown backfill step %d for task %d", task.Step, task.ID) + } +} + +func (*backfillDistExecutor) IsIdempotent(*proto.Subtask) bool { + return true +} + +func isRetryableError(err error) bool { + originErr := errors.Cause(err) + if tErr, ok := originErr.(*terror.Error); ok { + sqlErr := terror.ToSQLError(tErr) + _, ok := dbterror.ReorgRetryableErrCodes[sqlErr.Code] + return ok + } + // can't retry Unknown err. + return false +} + +func (*backfillDistExecutor) IsRetryableError(err error) bool { + return common.IsRetryableError(err) || isRetryableError(err) +} + +func (s *backfillDistExecutor) Close() { + if s.backendCtx != nil { + ingest.LitBackCtxMgr.Unregister(s.jobID) + } + s.BaseTaskExecutor.Close() +} diff --git a/pkg/ddl/backfilling_dist_scheduler.go b/pkg/ddl/backfilling_dist_scheduler.go index d887bb0a5cf91..fd42cd303f7fe 100644 --- a/pkg/ddl/backfilling_dist_scheduler.go +++ b/pkg/ddl/backfilling_dist_scheduler.go @@ -4,7 +4,7 @@ // 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 +// 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, @@ -15,160 +15,553 @@ package ddl import ( + "bytes" "context" + "encoding/hex" "encoding/json" + "math" + "sort" "github.com/pingcap/errors" + "github.com/pingcap/failpoint" "github.com/pingcap/tidb/br/pkg/lightning/backend/external" + "github.com/pingcap/tidb/br/pkg/lightning/backend/local" + "github.com/pingcap/tidb/br/pkg/lightning/config" + "github.com/pingcap/tidb/br/pkg/storage" "github.com/pingcap/tidb/pkg/ddl/ingest" "github.com/pingcap/tidb/pkg/disttask/framework/proto" "github.com/pingcap/tidb/pkg/disttask/framework/scheduler" - "github.com/pingcap/tidb/pkg/disttask/framework/scheduler/execute" + diststorage "github.com/pingcap/tidb/pkg/disttask/framework/storage" + "github.com/pingcap/tidb/pkg/kv" + "github.com/pingcap/tidb/pkg/meta" "github.com/pingcap/tidb/pkg/parser/model" + "github.com/pingcap/tidb/pkg/sessionctx/variable" + "github.com/pingcap/tidb/pkg/store/helper" "github.com/pingcap/tidb/pkg/table" "github.com/pingcap/tidb/pkg/util/logutil" "github.com/tikv/client-go/v2/tikv" "go.uber.org/zap" ) -// BackfillGlobalMeta is the global task meta for backfilling index. -type BackfillGlobalMeta struct { - Job model.Job `json:"job"` - // EleIDs stands for the index/column IDs to backfill with distributed framework. - EleIDs []int64 `json:"ele_ids"` - // EleTypeKey is the type of the element to backfill with distributed framework. - // For now, only index type is supported. - EleTypeKey []byte `json:"ele_type_key"` +// BackfillingSchedulerExt is an extension of litBackfillScheduler, exported for test. +type BackfillingSchedulerExt struct { + d *ddl + GlobalSort bool +} - CloudStorageURI string `json:"cloud_storage_uri"` - // UseMergeSort indicate whether the backfilling task use merge sort step for global sort. - // Merge Sort step aims to support more data. - UseMergeSort bool `json:"use_merge_sort"` +// NewBackfillingSchedulerExt creates a new backfillingSchedulerExt, only used for test now. +func NewBackfillingSchedulerExt(d DDL) (scheduler.Extension, error) { + ddl, ok := d.(*ddl) + if !ok { + return nil, errors.New("The getDDL result should be the type of *ddl") + } + return &BackfillingSchedulerExt{ + d: ddl, + }, nil } -// BackfillSubTaskMeta is the sub-task meta for backfilling index. -type BackfillSubTaskMeta struct { - PhysicalTableID int64 `json:"physical_table_id"` +var _ scheduler.Extension = (*BackfillingSchedulerExt)(nil) - RangeSplitKeys [][]byte `json:"range_split_keys"` - DataFiles []string `json:"data-files"` - StatFiles []string `json:"stat-files"` - external.SortedKVMeta `json:",inline"` +// OnTick implements scheduler.Extension interface. +func (*BackfillingSchedulerExt) OnTick(_ context.Context, _ *proto.Task) { } -// NewBackfillSubtaskExecutor creates a new backfill subtask executor. -func NewBackfillSubtaskExecutor(_ context.Context, taskMeta []byte, d *ddl, - bc ingest.BackendCtx, stage proto.Step, summary *execute.Summary) (execute.SubtaskExecutor, error) { - bgm := &BackfillGlobalMeta{} - err := json.Unmarshal(taskMeta, bgm) +// OnNextSubtasksBatch generate batch of next step's plan. +func (sch *BackfillingSchedulerExt) OnNextSubtasksBatch( + ctx context.Context, + taskHandle diststorage.TaskHandle, + task *proto.Task, + execIDs []string, + nextStep proto.Step, +) (taskMeta [][]byte, err error) { + logger := logutil.BgLogger().With( + zap.Stringer("type", task.Type), + zap.Int64("task-id", task.ID), + zap.String("curr-step", StepStr(task.Step)), + zap.String("next-step", StepStr(nextStep)), + ) + var backfillMeta BackfillTaskMeta + if err := json.Unmarshal(task.Meta, &backfillMeta); err != nil { + return nil, err + } + job := &backfillMeta.Job + tblInfo, err := getTblInfo(sch.d, job) if err != nil { return nil, err } - jobMeta := &bgm.Job + logger.Info("on next subtasks batch") + + // TODO: use planner. + switch nextStep { + case StepReadIndex: + if tblInfo.Partition != nil { + return generatePartitionPlan(tblInfo) + } + return generateNonPartitionPlan(sch.d, tblInfo, job, sch.GlobalSort, len(execIDs)) + case StepMergeSort: + res, err := generateMergePlan(taskHandle, task, logger) + if err != nil { + return nil, err + } + if len(res) > 0 { + backfillMeta.UseMergeSort = true + if err := updateMeta(task, &backfillMeta); err != nil { + return nil, err + } + } + return res, nil + case StepWriteAndIngest: + if sch.GlobalSort { + prevStep := StepReadIndex + if backfillMeta.UseMergeSort { + prevStep = StepMergeSort + } - _, tbl, err := d.getTableByTxn((*asAutoIDRequirement)(d.ddlCtx), jobMeta.SchemaID, jobMeta.TableID) + failpoint.Inject("mockWriteIngest", func() { + m := &BackfillSubTaskMeta{ + SortedKVMeta: external.SortedKVMeta{}, + } + metaBytes, _ := json.Marshal(m) + metaArr := make([][]byte, 0, 16) + metaArr = append(metaArr, metaBytes) + failpoint.Return(metaArr, nil) + }) + return generateGlobalSortIngestPlan( + ctx, + sch.d.store.(kv.StorageWithPD), + taskHandle, + task, + backfillMeta.CloudStorageURI, + prevStep, + logger) + } + return nil, nil + default: + return nil, nil + } +} + +func updateMeta(task *proto.Task, taskMeta *BackfillTaskMeta) error { + bs, err := json.Marshal(taskMeta) if err != nil { - return nil, err + return errors.Trace(err) } - indexInfos := make([]*model.IndexInfo, 0, len(bgm.EleIDs)) - for _, eid := range bgm.EleIDs { - indexInfo := model.FindIndexInfoByID(tbl.Meta().Indices, eid) - if indexInfo == nil { - logutil.BgLogger().Warn("index info not found", zap.String("category", "ddl-ingest"), - zap.Int64("table ID", tbl.Meta().ID), zap.Int64("index ID", eid)) - return nil, errors.Errorf("index info not found: %d", eid) - } - indexInfos = append(indexInfos, indexInfo) - } - - switch stage { - case proto.StepOne: - jc := d.jobContext(jobMeta.ID, jobMeta.ReorgMeta) - d.setDDLLabelForTopSQL(jobMeta.ID, jobMeta.Query) - d.setDDLSourceForDiagnosis(jobMeta.ID, jobMeta.Type) - return newReadIndexExecutor( - d, &bgm.Job, indexInfos, tbl.(table.PhysicalTable), jc, bc, summary, bgm.CloudStorageURI), nil - case proto.StepTwo: - return newMergeSortExecutor(jobMeta.ID, len(indexInfos), tbl.(table.PhysicalTable), bc, bgm.CloudStorageURI) - case proto.StepThree: - if len(bgm.CloudStorageURI) > 0 { - return newCloudImportExecutor(&bgm.Job, jobMeta.ID, indexInfos[0], tbl.(table.PhysicalTable), bc, bgm.CloudStorageURI) - } - return nil, errors.Errorf("local import does not have write & ingest step") + task.Meta = bs + return nil +} + +// GetNextStep implements scheduler.Extension interface. +func (sch *BackfillingSchedulerExt) GetNextStep(task *proto.Task) proto.Step { + switch task.Step { + case proto.StepInit: + return StepReadIndex + case StepReadIndex: + if sch.GlobalSort { + return StepMergeSort + } + return proto.StepDone + case StepMergeSort: + return StepWriteAndIngest + case StepWriteAndIngest: + return proto.StepDone default: - return nil, errors.Errorf("unknown step %d for job %d", stage, jobMeta.ID) + return proto.StepDone } } -type backfillDistScheduler struct { +func skipMergeSort(stats []external.MultipleFilesStat) bool { + failpoint.Inject("forceMergeSort", func() { + failpoint.Return(false) + }) + return external.GetMaxOverlappingTotal(stats) <= external.MergeSortOverlapThreshold +} + +// OnDone implements scheduler.Extension interface. +func (*BackfillingSchedulerExt) OnDone(_ context.Context, _ diststorage.TaskHandle, _ *proto.Task) error { + return nil +} + +// GetEligibleInstances implements scheduler.Extension interface. +func (*BackfillingSchedulerExt) GetEligibleInstances(_ context.Context, _ *proto.Task) ([]string, error) { + return nil, nil +} + +// IsRetryableErr implements scheduler.Extension.IsRetryableErr interface. +func (*BackfillingSchedulerExt) IsRetryableErr(error) bool { + return true +} + +// LitBackfillScheduler wraps BaseScheduler. +type LitBackfillScheduler struct { *scheduler.BaseScheduler - d *ddl - task *proto.Task - taskTable scheduler.TaskTable - backendCtx ingest.BackendCtx - jobID int64 + d *ddl } -func newBackfillDistScheduler(ctx context.Context, id string, task *proto.Task, taskTable scheduler.TaskTable, d *ddl) scheduler.Scheduler { - s := &backfillDistScheduler{ - BaseScheduler: scheduler.NewBaseScheduler(ctx, id, task.ID, taskTable), +func newLitBackfillScheduler(ctx context.Context, d *ddl, task *proto.Task, param scheduler.Param) scheduler.Scheduler { + sch := LitBackfillScheduler{ d: d, - task: task, - taskTable: taskTable, + BaseScheduler: scheduler.NewBaseScheduler(ctx, task, param), } - s.BaseScheduler.Extension = s - return s + return &sch } -func (s *backfillDistScheduler) Init(ctx context.Context) error { - err := s.BaseScheduler.Init(ctx) - if err != nil { +// Init implements BaseScheduler interface. +func (sch *LitBackfillScheduler) Init() (err error) { + taskMeta := &BackfillTaskMeta{} + if err = json.Unmarshal(sch.BaseScheduler.GetTask().Meta, taskMeta); err != nil { + return errors.Annotate(err, "unmarshal task meta failed") + } + sch.BaseScheduler.Extension = &BackfillingSchedulerExt{ + d: sch.d, + GlobalSort: len(taskMeta.CloudStorageURI) > 0} + return sch.BaseScheduler.Init() +} + +// Close implements BaseScheduler interface. +func (sch *LitBackfillScheduler) Close() { + sch.BaseScheduler.Close() +} + +func getTblInfo(d *ddl, job *model.Job) (tblInfo *model.TableInfo, err error) { + err = kv.RunInNewTxn(d.ctx, d.store, true, func(ctx context.Context, txn kv.Transaction) error { + tblInfo, err = meta.NewMeta(txn).GetTable(job.SchemaID, job.TableID) return err + }) + if err != nil { + return nil, err } - d := s.d - bgm := &BackfillGlobalMeta{} - err = json.Unmarshal(s.task.Meta, bgm) + return tblInfo, nil +} + +func generatePartitionPlan(tblInfo *model.TableInfo) (metas [][]byte, err error) { + defs := tblInfo.Partition.Definitions + physicalIDs := make([]int64, len(defs)) + for i := range defs { + physicalIDs[i] = defs[i].ID + } + + subTaskMetas := make([][]byte, 0, len(physicalIDs)) + for _, physicalID := range physicalIDs { + subTaskMeta := &BackfillSubTaskMeta{ + PhysicalTableID: physicalID, + } + + metaBytes, err := json.Marshal(subTaskMeta) + if err != nil { + return nil, err + } + + subTaskMetas = append(subTaskMetas, metaBytes) + } + return subTaskMetas, nil +} + +func generateNonPartitionPlan( + d *ddl, + tblInfo *model.TableInfo, + job *model.Job, + useCloud bool, + instanceCnt int) (metas [][]byte, err error) { + tbl, err := getTable((*asAutoIDRequirement)(d.ddlCtx), job.SchemaID, tblInfo) if err != nil { - return errors.Trace(err) + return nil, err } - job := &bgm.Job - _, tbl, err := d.getTableByTxn((*asAutoIDRequirement)(d.ddlCtx), job.SchemaID, job.TableID) + ver, err := getValidCurrentVersion(d.store) if err != nil { - return errors.Trace(err) + return nil, errors.Trace(err) } - // We only support adding multiple unique indexes or multiple non-unique indexes, - // we use the first index uniqueness here. - idx := model.FindIndexInfoByID(tbl.Meta().Indices, bgm.EleIDs[0]) - if idx == nil { - return errors.Trace(errors.Errorf("index info not found: %d", bgm.EleIDs[0])) + + startKey, endKey, err := getTableRange(d.jobContext(job.ID, job.ReorgMeta), d.ddlCtx, tbl.(table.PhysicalTable), ver.Ver, job.Priority) + if startKey == nil && endKey == nil { + // Empty table. + return nil, nil } - pdLeaderAddr := d.store.(tikv.Storage).GetRegionCache().PDClient().GetLeaderAddr() - bc, err := ingest.LitBackCtxMgr.Register(ctx, idx.Unique, job.ID, d.etcdCli, pdLeaderAddr, job.ReorgMeta.ResourceGroupName) if err != nil { - return errors.Trace(err) + return nil, errors.Trace(err) } - s.backendCtx = bc - s.jobID = job.ID - return nil + regionCache := d.store.(helper.Storage).GetRegionCache() + recordRegionMetas, err := regionCache.LoadRegionsInKeyRange(tikv.NewBackofferWithVars(context.Background(), 20000, nil), startKey, endKey) + if err != nil { + return nil, err + } + regionBatch := calculateRegionBatch(len(recordRegionMetas), instanceCnt, !useCloud) + + subTaskMetas := make([][]byte, 0, 4) + sort.Slice(recordRegionMetas, func(i, j int) bool { + return bytes.Compare(recordRegionMetas[i].StartKey(), recordRegionMetas[j].StartKey()) < 0 + }) + for i := 0; i < len(recordRegionMetas); i += regionBatch { + end := i + regionBatch + if end > len(recordRegionMetas) { + end = len(recordRegionMetas) + } + batch := recordRegionMetas[i:end] + subTaskMeta := &BackfillSubTaskMeta{ + SortedKVMeta: external.SortedKVMeta{ + StartKey: batch[0].StartKey(), + EndKey: batch[len(batch)-1].EndKey(), + }, + } + if i == 0 { + subTaskMeta.StartKey = startKey + } + if end == len(recordRegionMetas) { + subTaskMeta.EndKey = endKey + } + metaBytes, err := json.Marshal(subTaskMeta) + if err != nil { + return nil, err + } + subTaskMetas = append(subTaskMetas, metaBytes) + } + return subTaskMetas, nil } -func (s *backfillDistScheduler) GetSubtaskExecutor(ctx context.Context, task *proto.Task, summary *execute.Summary) (execute.SubtaskExecutor, error) { - switch task.Step { - case proto.StepOne, proto.StepTwo, proto.StepThree: - return NewBackfillSubtaskExecutor(ctx, task.Meta, s.d, s.backendCtx, task.Step, summary) - default: - return nil, errors.Errorf("unknown backfill step %d for task %d", task.Step, task.ID) +func calculateRegionBatch(totalRegionCnt int, instanceCnt int, useLocalDisk bool) int { + var regionBatch int + avgTasksPerInstance := totalRegionCnt / instanceCnt + if useLocalDisk { + // Make subtask large enough to reduce the overhead of local/global flush. + avgTasksPerDisk := int(int64(variable.DDLDiskQuota.Load()) / int64(config.SplitRegionSize)) + regionBatch = min(avgTasksPerDisk, avgTasksPerInstance) + } else { + regionBatch = min(100, avgTasksPerInstance) } + regionBatch = max(regionBatch, 1) + return regionBatch } -func (*backfillDistScheduler) IsIdempotent(*proto.Subtask) bool { - return true +func generateGlobalSortIngestPlan( + ctx context.Context, + store kv.StorageWithPD, + taskHandle diststorage.TaskHandle, + task *proto.Task, + cloudStorageURI string, + step proto.Step, + logger *zap.Logger, +) ([][]byte, error) { + startKeyFromSumm, endKeyFromSumm, totalSize, multiFileStat, err := getSummaryFromLastStep(taskHandle, task.ID, step) + if err != nil { + return nil, err + } + if len(startKeyFromSumm) == 0 && len(endKeyFromSumm) == 0 { + // Skip global sort for empty table. + return nil, nil + } + instanceIDs, err := scheduler.GenerateTaskExecutorNodes(ctx) + if err != nil { + return nil, err + } + splitter, err := getRangeSplitter( + ctx, store, cloudStorageURI, int64(totalSize), int64(len(instanceIDs)), multiFileStat, logger) + if err != nil { + return nil, err + } + defer func() { + err := splitter.Close() + if err != nil { + logger.Error("failed to close range splitter", zap.Error(err)) + } + }() + + metaArr := make([][]byte, 0, 16) + startKey := startKeyFromSumm + var endKey kv.Key + for { + endKeyOfGroup, dataFiles, statFiles, rangeSplitKeys, err := splitter.SplitOneRangesGroup() + if err != nil { + return nil, err + } + if len(endKeyOfGroup) == 0 { + endKey = endKeyFromSumm + } else { + endKey = kv.Key(endKeyOfGroup).Clone() + } + logger.Info("split subtask range", + zap.String("startKey", hex.EncodeToString(startKey)), + zap.String("endKey", hex.EncodeToString(endKey))) + + if startKey.Cmp(endKey) >= 0 { + return nil, errors.Errorf("invalid range, startKey: %s, endKey: %s", + hex.EncodeToString(startKey), hex.EncodeToString(endKey)) + } + m := &BackfillSubTaskMeta{ + SortedKVMeta: external.SortedKVMeta{ + StartKey: startKey, + EndKey: endKey, + TotalKVSize: totalSize / uint64(len(instanceIDs)), + }, + DataFiles: dataFiles, + StatFiles: statFiles, + RangeSplitKeys: rangeSplitKeys, + } + metaBytes, err := json.Marshal(m) + if err != nil { + return nil, err + } + metaArr = append(metaArr, metaBytes) + if len(endKeyOfGroup) == 0 { + return metaArr, nil + } + startKey = endKey + } } -func (s *backfillDistScheduler) Close() { - if s.backendCtx != nil { - ingest.LitBackCtxMgr.Unregister(s.jobID) +func generateMergePlan( + taskHandle diststorage.TaskHandle, + task *proto.Task, + logger *zap.Logger, +) ([][]byte, error) { + // check data files overlaps, + // if data files overlaps too much, we need a merge step. + subTaskMetas, err := taskHandle.GetPreviousSubtaskMetas(task.ID, StepReadIndex) + if err != nil { + return nil, err + } + multiStats := make([]external.MultipleFilesStat, 0, 100) + for _, bs := range subTaskMetas { + var subtask BackfillSubTaskMeta + err = json.Unmarshal(bs, &subtask) + if err != nil { + return nil, err + } + multiStats = append(multiStats, subtask.MultipleFilesStats...) + } + if skipMergeSort(multiStats) { + logger.Info("skip merge sort") + return nil, nil + } + + // generate merge sort plan. + _, _, _, multiFileStat, err := getSummaryFromLastStep(taskHandle, task.ID, StepReadIndex) + if err != nil { + return nil, err + } + dataFiles := make([]string, 0, 1000) + for _, m := range multiFileStat { + for _, filePair := range m.Filenames { + dataFiles = append(dataFiles, filePair[0]) + } + } + + start := 0 + step := external.MergeSortFileCountStep + metaArr := make([][]byte, 0, 16) + for start < len(dataFiles) { + end := start + step + if end > len(dataFiles) { + end = len(dataFiles) + } + m := &BackfillSubTaskMeta{ + DataFiles: dataFiles[start:end], + } + metaBytes, err := json.Marshal(m) + if err != nil { + return nil, err + } + metaArr = append(metaArr, metaBytes) + + start = end + } + return metaArr, nil +} + +func getRangeSplitter( + ctx context.Context, + store kv.StorageWithPD, + cloudStorageURI string, + totalSize int64, + instanceCnt int64, + multiFileStat []external.MultipleFilesStat, + logger *zap.Logger, +) (*external.RangeSplitter, error) { + backend, err := storage.ParseBackend(cloudStorageURI, nil) + if err != nil { + return nil, err + } + extStore, err := storage.NewWithDefaultOpt(ctx, backend) + if err != nil { + return nil, err + } + + rangeGroupSize := totalSize / instanceCnt + rangeGroupKeys := int64(math.MaxInt64) + + var maxSizePerRange = int64(config.SplitRegionSize) + var maxKeysPerRange = int64(config.SplitRegionKeys) + if store != nil { + pdCli := store.GetPDClient() + tls, err := ingest.NewDDLTLS() + if err == nil { + size, keys, err := local.GetRegionSplitSizeKeys(ctx, pdCli, tls) + if err == nil { + maxSizePerRange = max(maxSizePerRange, size) + maxKeysPerRange = max(maxKeysPerRange, keys) + } else { + logger.Warn("fail to get region split keys and size", zap.Error(err)) + } + } else { + logger.Warn("fail to get region split keys and size", zap.Error(err)) + } + } + + return external.NewRangeSplitter(ctx, multiFileStat, extStore, + rangeGroupSize, rangeGroupKeys, maxSizePerRange, maxKeysPerRange, true) +} + +func getSummaryFromLastStep( + taskHandle diststorage.TaskHandle, + gTaskID int64, + step proto.Step, +) (startKey, endKey kv.Key, totalKVSize uint64, multiFileStat []external.MultipleFilesStat, err error) { + subTaskMetas, err := taskHandle.GetPreviousSubtaskMetas(gTaskID, step) + if err != nil { + return nil, nil, 0, nil, errors.Trace(err) + } + for _, subTaskMeta := range subTaskMetas { + var subtask BackfillSubTaskMeta + err := json.Unmarshal(subTaskMeta, &subtask) + if err != nil { + return nil, nil, 0, nil, errors.Trace(err) + } + // Skip empty subtask.StartKey/EndKey because it means + // no records need to be written in this subtask. + if subtask.StartKey == nil || subtask.EndKey == nil { + continue + } + + if len(startKey) == 0 { + startKey = subtask.StartKey + } else { + startKey = external.BytesMin(startKey, subtask.StartKey) + } + if len(endKey) == 0 { + endKey = subtask.EndKey + } else { + endKey = external.BytesMax(endKey, subtask.EndKey) + } + totalKVSize += subtask.TotalKVSize + + multiFileStat = append(multiFileStat, subtask.MultipleFilesStats...) + } + return startKey, endKey, totalKVSize, multiFileStat, nil +} + +// StepStr convert proto.Step to string. +func StepStr(step proto.Step) string { + switch step { + case proto.StepInit: + return "init" + case StepReadIndex: + return "read-index" + case StepMergeSort: + return "merge-sort" + case StepWriteAndIngest: + return "write&ingest" + case proto.StepDone: + return "done" + default: + return "unknown" } - s.BaseScheduler.Close() } diff --git a/pkg/ddl/backfilling_dispatcher_test.go b/pkg/ddl/backfilling_dist_scheduler_test.go similarity index 72% rename from pkg/ddl/backfilling_dispatcher_test.go rename to pkg/ddl/backfilling_dist_scheduler_test.go index 5da673b6625e5..3562e33b72fe4 100644 --- a/pkg/ddl/backfilling_dispatcher_test.go +++ b/pkg/ddl/backfilling_dist_scheduler_test.go @@ -22,12 +22,11 @@ import ( "github.com/docker/go-units" "github.com/ngaut/pools" - "github.com/pingcap/errors" "github.com/pingcap/failpoint" "github.com/pingcap/tidb/br/pkg/lightning/backend/external" "github.com/pingcap/tidb/pkg/ddl" - "github.com/pingcap/tidb/pkg/disttask/framework/dispatcher" "github.com/pingcap/tidb/pkg/disttask/framework/proto" + "github.com/pingcap/tidb/pkg/disttask/framework/scheduler" "github.com/pingcap/tidb/pkg/disttask/framework/storage" "github.com/pingcap/tidb/pkg/domain" "github.com/pingcap/tidb/pkg/meta" @@ -39,7 +38,7 @@ import ( "github.com/tikv/client-go/v2/util" ) -func TestBackfillingDispatcherLocalMode(t *testing.T) { +func TestBackfillingSchedulerLocalMode(t *testing.T) { /// test str require.Equal(t, "init", ddl.StepStr(proto.StepInit)) require.Equal(t, "read-index", ddl.StepStr(ddl.StepReadIndex)) @@ -49,7 +48,7 @@ func TestBackfillingDispatcherLocalMode(t *testing.T) { require.Equal(t, "unknown", ddl.StepStr(111)) store, dom := testkit.CreateMockStoreAndDomain(t) - dsp, err := ddl.NewBackfillingDispatcherExt(dom.DDL()) + sch, err := ddl.NewBackfillingSchedulerExt(dom.DDL()) require.NoError(t, err) tk := testkit.NewTestKit(t, store) tk.MustExec("use test") @@ -62,17 +61,16 @@ func TestBackfillingDispatcherLocalMode(t *testing.T) { "PARTITION p1 VALUES LESS THAN (100),\n" + "PARTITION p2 VALUES LESS THAN (1000),\n" + "PARTITION p3 VALUES LESS THAN MAXVALUE\n);") - gTask := createAddIndexGlobalTask(t, dom, "test", "tp1", proto.Backfill, false) + task := createAddIndexTask(t, dom, "test", "tp1", proto.Backfill, false) tbl, err := dom.InfoSchema().TableByName(model.NewCIStr("test"), model.NewCIStr("tp1")) require.NoError(t, err) tblInfo := tbl.Meta() // 1.1 OnNextSubtasksBatch - gTask.Step = dsp.GetNextStep(gTask) - require.Equal(t, ddl.StepReadIndex, gTask.Step) - serverInfos, _, err := dsp.GetEligibleInstances(context.Background(), gTask) - require.NoError(t, err) - metas, err := dsp.OnNextSubtasksBatch(context.Background(), nil, gTask, serverInfos, gTask.Step) + task.Step = sch.GetNextStep(task) + require.Equal(t, ddl.StepReadIndex, task.Step) + execIDs := []string{":4000"} + metas, err := sch.OnNextSubtasksBatch(context.Background(), nil, task, execIDs, task.Step) require.NoError(t, err) require.Equal(t, len(tblInfo.Partition.Definitions), len(metas)) for i, par := range tblInfo.Partition.Definitions { @@ -82,27 +80,22 @@ func TestBackfillingDispatcherLocalMode(t *testing.T) { } // 1.2 test partition table OnNextSubtasksBatch after StepReadIndex - gTask.State = proto.TaskStateRunning - gTask.Step = dsp.GetNextStep(gTask) - require.Equal(t, proto.StepDone, gTask.Step) - metas, err = dsp.OnNextSubtasksBatch(context.Background(), nil, gTask, serverInfos, gTask.Step) + task.State = proto.TaskStateRunning + task.Step = sch.GetNextStep(task) + require.Equal(t, proto.StepDone, task.Step) + metas, err = sch.OnNextSubtasksBatch(context.Background(), nil, task, execIDs, task.Step) require.NoError(t, err) require.Len(t, metas, 0) - // 1.3 test partition table OnErrStage. - errMeta, err := dsp.OnErrStage(context.Background(), nil, gTask, []error{errors.New("mockErr")}) - require.NoError(t, err) - require.Nil(t, errMeta) - - errMeta, err = dsp.OnErrStage(context.Background(), nil, gTask, []error{errors.New("mockErr")}) + // 1.3 test partition table OnDone. + err = sch.OnDone(context.Background(), nil, task) require.NoError(t, err) - require.Nil(t, errMeta) /// 2. test non partition table. // 2.1 empty table tk.MustExec("create table t1(id int primary key, v int)") - gTask = createAddIndexGlobalTask(t, dom, "test", "t1", proto.Backfill, false) - metas, err = dsp.OnNextSubtasksBatch(context.Background(), nil, gTask, serverInfos, gTask.Step) + task = createAddIndexTask(t, dom, "test", "t1", proto.Backfill, false) + metas, err = sch.OnNextSubtasksBatch(context.Background(), nil, task, execIDs, task.Step) require.NoError(t, err) require.Equal(t, 0, len(metas)) // 2.2 non empty table. @@ -111,18 +104,18 @@ func TestBackfillingDispatcherLocalMode(t *testing.T) { tk.MustExec("insert into t2 values (), (), (), (), (), ()") tk.MustExec("insert into t2 values (), (), (), (), (), ()") tk.MustExec("insert into t2 values (), (), (), (), (), ()") - gTask = createAddIndexGlobalTask(t, dom, "test", "t2", proto.Backfill, false) + task = createAddIndexTask(t, dom, "test", "t2", proto.Backfill, false) // 2.2.1 stepInit - gTask.Step = dsp.GetNextStep(gTask) - metas, err = dsp.OnNextSubtasksBatch(context.Background(), nil, gTask, serverInfos, gTask.Step) + task.Step = sch.GetNextStep(task) + metas, err = sch.OnNextSubtasksBatch(context.Background(), nil, task, execIDs, task.Step) require.NoError(t, err) require.Equal(t, 1, len(metas)) - require.Equal(t, ddl.StepReadIndex, gTask.Step) + require.Equal(t, ddl.StepReadIndex, task.Step) // 2.2.2 StepReadIndex - gTask.State = proto.TaskStateRunning - gTask.Step = dsp.GetNextStep(gTask) - require.Equal(t, proto.StepDone, gTask.Step) - metas, err = dsp.OnNextSubtasksBatch(context.Background(), nil, gTask, serverInfos, gTask.Step) + task.State = proto.TaskStateRunning + task.Step = sch.GetNextStep(task) + require.Equal(t, proto.StepDone, task.Step) + metas, err = sch.OnNextSubtasksBatch(context.Background(), nil, task, execIDs, task.Step) require.NoError(t, err) require.Equal(t, 0, len(metas)) } @@ -147,7 +140,7 @@ func TestCalculateRegionBatch(t *testing.T) { require.Equal(t, 2, batchCnt) } -func TestBackfillingDispatcherGlobalSortMode(t *testing.T) { +func TestBackfillingSchedulerGlobalSortMode(t *testing.T) { // init test env. store, dom := testkit.CreateMockStoreAndDomain(t) tk := testkit.NewTestKit(t, store) @@ -159,7 +152,7 @@ func TestBackfillingDispatcherGlobalSortMode(t *testing.T) { ctx = util.WithInternalSourceType(ctx, "handle") mgr := storage.NewTaskManager(pool) storage.SetTaskManager(mgr) - dspManager, err := dispatcher.NewManager(util.WithInternalSourceType(ctx, "dispatcher"), mgr, "host:port") + schManager, err := scheduler.NewManager(util.WithInternalSourceType(ctx, "scheduler"), mgr, "host:port") require.NoError(t, err) tk.MustExec("use test") @@ -168,22 +161,21 @@ func TestBackfillingDispatcherGlobalSortMode(t *testing.T) { tk.MustExec("insert into t1 values (), (), (), (), (), ()") tk.MustExec("insert into t1 values (), (), (), (), (), ()") tk.MustExec("insert into t1 values (), (), (), (), (), ()") - task := createAddIndexGlobalTask(t, dom, "test", "t1", proto.Backfill, true) + task := createAddIndexTask(t, dom, "test", "t1", proto.Backfill, true) - dsp := dspManager.MockDispatcher(task) - ext, err := ddl.NewBackfillingDispatcherExt(dom.DDL()) + sch := schManager.MockScheduler(task) + ext, err := ddl.NewBackfillingSchedulerExt(dom.DDL()) require.NoError(t, err) - ext.(*ddl.BackfillingDispatcherExt).GlobalSort = true - dsp.Extension = ext + ext.(*ddl.BackfillingSchedulerExt).GlobalSort = true + sch.Extension = ext - taskID, err := mgr.AddNewGlobalTask(ctx, task.Key, proto.Backfill, 1, task.Meta) + taskID, err := mgr.CreateTask(ctx, task.Key, proto.Backfill, 1, task.Meta) require.NoError(t, err) task.ID = taskID - serverInfos, _, err := dsp.GetEligibleInstances(context.Background(), task) - require.NoError(t, err) + execIDs := []string{":4000"} // 1. to read-index stage - subtaskMetas, err := dsp.OnNextSubtasksBatch(ctx, dsp, task, serverInfos, dsp.GetNextStep(task)) + subtaskMetas, err := sch.OnNextSubtasksBatch(ctx, sch, task, execIDs, sch.GetNextStep(task)) require.NoError(t, err) require.Len(t, subtaskMetas, 1) task.Step = ext.GetNextStep(task) @@ -191,11 +183,11 @@ func TestBackfillingDispatcherGlobalSortMode(t *testing.T) { // update task/subtask, and finish subtask, so we can go to next stage subtasks := make([]*proto.Subtask, 0, len(subtaskMetas)) for _, m := range subtaskMetas { - subtasks = append(subtasks, proto.NewSubtask(task.Step, task.ID, task.Type, "", m)) + subtasks = append(subtasks, proto.NewSubtask(task.Step, task.ID, task.Type, "", 1, m, 0)) } - _, err = mgr.UpdateGlobalTaskAndAddSubTasks(ctx, task, subtasks, proto.TaskStatePending) + _, err = mgr.UpdateTaskAndAddSubTasks(ctx, task, subtasks, proto.TaskStatePending) require.NoError(t, err) - gotSubtasks, err := mgr.GetSubtasksForImportInto(ctx, taskID, ddl.StepReadIndex) + gotSubtasks, err := mgr.GetSubtasksWithHistory(ctx, taskID, ddl.StepReadIndex) require.NoError(t, err) // update meta, same as import into. @@ -216,14 +208,14 @@ func TestBackfillingDispatcherGlobalSortMode(t *testing.T) { sortStepMetaBytes, err := json.Marshal(sortStepMeta) require.NoError(t, err) for _, s := range gotSubtasks { - require.NoError(t, mgr.FinishSubtask(ctx, s.SchedulerID, s.ID, sortStepMetaBytes)) + require.NoError(t, mgr.FinishSubtask(ctx, s.ExecID, s.ID, sortStepMetaBytes)) } // 2. to merge-sort stage. require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/ddl/forceMergeSort", `return()`)) t.Cleanup(func() { require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/ddl/forceMergeSort")) }) - subtaskMetas, err = ext.OnNextSubtasksBatch(ctx, dsp, task, serverInfos, ext.GetNextStep(task)) + subtaskMetas, err = ext.OnNextSubtasksBatch(ctx, sch, task, execIDs, ext.GetNextStep(task)) require.NoError(t, err) require.Len(t, subtaskMetas, 1) task.Step = ext.GetNextStep(task) @@ -232,11 +224,11 @@ func TestBackfillingDispatcherGlobalSortMode(t *testing.T) { // update meta, same as import into. subtasks = make([]*proto.Subtask, 0, len(subtaskMetas)) for _, m := range subtaskMetas { - subtasks = append(subtasks, proto.NewSubtask(task.Step, task.ID, task.Type, "", m)) + subtasks = append(subtasks, proto.NewSubtask(task.Step, task.ID, task.Type, "", 1, m, 0)) } - _, err = mgr.UpdateGlobalTaskAndAddSubTasks(ctx, task, subtasks, proto.TaskStatePending) + _, err = mgr.UpdateTaskAndAddSubTasks(ctx, task, subtasks, proto.TaskStatePending) require.NoError(t, err) - gotSubtasks, err = mgr.GetSubtasksForImportInto(ctx, taskID, task.Step) + gotSubtasks, err = mgr.GetSubtasksWithHistory(ctx, taskID, task.Step) require.NoError(t, err) mergeSortStepMeta := &ddl.BackfillSubTaskMeta{ SortedKVMeta: external.SortedKVMeta{ @@ -255,20 +247,20 @@ func TestBackfillingDispatcherGlobalSortMode(t *testing.T) { mergeSortStepMetaBytes, err := json.Marshal(mergeSortStepMeta) require.NoError(t, err) for _, s := range gotSubtasks { - require.NoError(t, mgr.FinishSubtask(ctx, s.SchedulerID, s.ID, mergeSortStepMetaBytes)) + require.NoError(t, mgr.FinishSubtask(ctx, s.ExecID, s.ID, mergeSortStepMetaBytes)) } // 3. to write&ingest stage. require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/ddl/mockWriteIngest", "return(true)")) t.Cleanup(func() { require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/ddl/mockWriteIngest")) }) - subtaskMetas, err = ext.OnNextSubtasksBatch(ctx, dsp, task, serverInfos, ext.GetNextStep(task)) + subtaskMetas, err = ext.OnNextSubtasksBatch(ctx, sch, task, execIDs, ext.GetNextStep(task)) require.NoError(t, err) require.Len(t, subtaskMetas, 1) task.Step = ext.GetNextStep(task) require.Equal(t, ddl.StepWriteAndIngest, task.Step) // 4. to done stage. - subtaskMetas, err = ext.OnNextSubtasksBatch(ctx, dsp, task, serverInfos, ext.GetNextStep(task)) + subtaskMetas, err = ext.OnNextSubtasksBatch(ctx, sch, task, execIDs, ext.GetNextStep(task)) require.NoError(t, err) require.Len(t, subtaskMetas, 0) task.Step = ext.GetNextStep(task) @@ -279,7 +271,7 @@ func TestGetNextStep(t *testing.T) { task := &proto.Task{ Step: proto.StepInit, } - ext := &ddl.BackfillingDispatcherExt{} + ext := &ddl.BackfillingSchedulerExt{} // 1. local mode for _, nextStep := range []proto.Step{ddl.StepReadIndex, proto.StepDone} { @@ -287,7 +279,7 @@ func TestGetNextStep(t *testing.T) { task.Step = nextStep } // 2. global sort mode - ext = &ddl.BackfillingDispatcherExt{GlobalSort: true} + ext = &ddl.BackfillingSchedulerExt{GlobalSort: true} task.Step = proto.StepInit for _, nextStep := range []proto.Step{ddl.StepReadIndex, ddl.StepMergeSort, ddl.StepWriteAndIngest} { require.Equal(t, nextStep, ext.GetNextStep(task)) @@ -295,7 +287,7 @@ func TestGetNextStep(t *testing.T) { } } -func createAddIndexGlobalTask(t *testing.T, +func createAddIndexTask(t *testing.T, dom *domain.Domain, dbName, tblName string, @@ -309,7 +301,7 @@ func createAddIndexGlobalTask(t *testing.T, defaultSQLMode, err := mysql.GetSQLMode(mysql.DefaultSQLMode) require.NoError(t, err) - taskMeta := &ddl.BackfillGlobalMeta{ + taskMeta := &ddl.BackfillTaskMeta{ Job: model.Job{ ID: time.Now().UnixNano(), SchemaID: db.ID, @@ -328,18 +320,18 @@ func createAddIndexGlobalTask(t *testing.T, taskMeta.CloudStorageURI = "gs://sort-bucket" } - gTaskMetaBytes, err := json.Marshal(taskMeta) + taskMetaBytes, err := json.Marshal(taskMeta) require.NoError(t, err) - gTask := &proto.Task{ + task := &proto.Task{ ID: time.Now().UnixMicro(), Type: taskType, Step: proto.StepInit, State: proto.TaskStatePending, - Meta: gTaskMetaBytes, + Meta: taskMetaBytes, StartTime: time.Now(), StateUpdateTime: time.Now(), } - return gTask + return task } diff --git a/pkg/ddl/backfilling_merge_sort.go b/pkg/ddl/backfilling_merge_sort.go index 6de8ee0d7b756..da8954d966060 100644 --- a/pkg/ddl/backfilling_merge_sort.go +++ b/pkg/ddl/backfilling_merge_sort.go @@ -28,7 +28,6 @@ import ( "github.com/pingcap/tidb/pkg/disttask/framework/proto" "github.com/pingcap/tidb/pkg/sessionctx/variable" "github.com/pingcap/tidb/pkg/table" - "github.com/pingcap/tidb/pkg/util/intest" "github.com/pingcap/tidb/pkg/util/logutil" "github.com/pingcap/tidb/pkg/util/size" "go.uber.org/zap" @@ -88,11 +87,7 @@ func (m *mergeSortExecutor) RunSubtask(ctx context.Context, subtask *proto.Subta if err != nil { return err } - opt := &storage.ExternalStorageOptions{} - if intest.InTest { - opt.NoCredentials = true - } - store, err := storage.New(ctx, storeBackend, opt) + store, err := storage.NewWithDefaultOpt(ctx, storeBackend) if err != nil { return err } @@ -112,6 +107,7 @@ func (m *mergeSortExecutor) RunSubtask(ctx context.Context, subtask *proto.Subta 64*1024, prefix, external.DefaultBlockSize, + external.DefaultMemSizeLimit, 8*1024, 1*size.MB, 8*1024, diff --git a/pkg/ddl/backfilling_read_index.go b/pkg/ddl/backfilling_read_index.go index f213e56b36443..e238abfaf19ab 100644 --- a/pkg/ddl/backfilling_read_index.go +++ b/pkg/ddl/backfilling_read_index.go @@ -26,7 +26,7 @@ import ( "github.com/pingcap/tidb/br/pkg/lightning/backend/external" "github.com/pingcap/tidb/pkg/ddl/ingest" "github.com/pingcap/tidb/pkg/disttask/framework/proto" - "github.com/pingcap/tidb/pkg/disttask/framework/scheduler/execute" + "github.com/pingcap/tidb/pkg/disttask/framework/taskexecutor/execute" "github.com/pingcap/tidb/pkg/disttask/operator" "github.com/pingcap/tidb/pkg/kv" "github.com/pingcap/tidb/pkg/metrics" diff --git a/pkg/ddl/backfilling_scheduler.go b/pkg/ddl/backfilling_scheduler.go index 958862f342e83..7d2a2cd515a10 100644 --- a/pkg/ddl/backfilling_scheduler.go +++ b/pkg/ddl/backfilling_scheduler.go @@ -24,6 +24,7 @@ import ( "github.com/pingcap/tidb/pkg/ddl/copr" "github.com/pingcap/tidb/pkg/ddl/ingest" sess "github.com/pingcap/tidb/pkg/ddl/internal/session" + "github.com/pingcap/tidb/pkg/errctx" "github.com/pingcap/tidb/pkg/kv" "github.com/pingcap/tidb/pkg/metrics" "github.com/pingcap/tidb/pkg/parser/model" @@ -164,9 +165,12 @@ func initSessCtx( return errors.Trace(err) } sessCtx.GetSessionVars().StmtCtx.SetTimeZone(sessCtx.GetSessionVars().Location()) - sessCtx.GetSessionVars().StmtCtx.BadNullAsWarning = !sqlMode.HasStrictMode() - sessCtx.GetSessionVars().StmtCtx.OverflowAsWarning = !sqlMode.HasStrictMode() - sessCtx.GetSessionVars().StmtCtx.DividedByZeroAsWarning = !sqlMode.HasStrictMode() + + errLevels := sessCtx.GetSessionVars().StmtCtx.ErrLevels() + errLevels[errctx.ErrGroupBadNull] = errctx.ResolveErrLevel(false, !sqlMode.HasStrictMode()) + errLevels[errctx.ErrGroupDividedByZero] = + errctx.ResolveErrLevel(!sqlMode.HasErrorForDivisionByZeroMode(), !sqlMode.HasStrictMode()) + sessCtx.GetSessionVars().StmtCtx.SetErrLevels(errLevels) typeFlags := types.StrictFlags. WithTruncateAsWarning(!sqlMode.HasStrictMode()). @@ -174,8 +178,7 @@ func initSessCtx( WithIgnoreZeroInDate(!sqlMode.HasStrictMode() || sqlMode.HasAllowInvalidDatesMode()). WithCastTimeToYearThroughConcat(true) sessCtx.GetSessionVars().StmtCtx.SetTypeFlags(typeFlags) - - sessCtx.GetSessionVars().ResourceGroupName = resGroupName + sessCtx.GetSessionVars().StmtCtx.ResourceGroupName = resGroupName // Prevent initializing the mock context in the workers concurrently. // For details, see https://github.com/pingcap/tidb/issues/40879. @@ -195,21 +198,17 @@ func restoreSessCtx(sessCtx sessionctx.Context) func(sessCtx sessionctx.Context) tz := *sv.TimeZone timezone = &tz } - badNullAsWarn := sv.StmtCtx.BadNullAsWarning - overflowAsWarn := sv.StmtCtx.OverflowAsWarning - dividedZeroAsWarn := sv.StmtCtx.DividedByZeroAsWarning typeFlags := sv.StmtCtx.TypeFlags() - resGroupName := sv.ResourceGroupName + errLevels := sv.StmtCtx.ErrLevels() + resGroupName := sv.StmtCtx.ResourceGroupName return func(usedSessCtx sessionctx.Context) { uv := usedSessCtx.GetSessionVars() uv.RowEncoder.Enable = rowEncoder uv.SQLMode = sqlMode uv.TimeZone = timezone - uv.StmtCtx.BadNullAsWarning = badNullAsWarn - uv.StmtCtx.OverflowAsWarning = overflowAsWarn - uv.StmtCtx.DividedByZeroAsWarning = dividedZeroAsWarn uv.StmtCtx.SetTypeFlags(typeFlags) - uv.ResourceGroupName = resGroupName + uv.StmtCtx.SetErrLevels(errLevels) + uv.StmtCtx.ResourceGroupName = resGroupName } } diff --git a/pkg/ddl/bdr.go b/pkg/ddl/bdr.go new file mode 100644 index 0000000000000..8271a79446e7b --- /dev/null +++ b/pkg/ddl/bdr.go @@ -0,0 +1,85 @@ +// Copyright 2024 PingCAP, 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. + +package ddl + +import ( + "github.com/pingcap/tidb/pkg/parser/ast" + "github.com/pingcap/tidb/pkg/types" +) + +// In BDR mode(primary role), we allow add a new column to table if it is nullable +// or not null with default value. +func deniedByBDRWhenAddColumn(options []*ast.ColumnOption) bool { + var ( + nullable bool + notNull bool + defaultValue bool + comment int + ) + for _, opt := range options { + if opt.Tp == ast.ColumnOptionNull { + nullable = true + } + if opt.Tp == ast.ColumnOptionNotNull { + notNull = true + } + if opt.Tp == ast.ColumnOptionDefaultValue { + defaultValue = true + } + if opt.Tp == ast.ColumnOptionComment { + comment = 1 + } + } + tpLen := len(options) - comment + + if tpLen == 0 || (tpLen == 1 && nullable) { + return false + } + if tpLen == 2 && notNull && defaultValue { + return false + } + + return true +} + +// In BDR mode(primary role), we allow add or update comment for column, change default +// value of one particular column. Other modify column operations are denied. +func deniedByBDRWhenModifyColumn(newFieldType, oldFieldType types.FieldType, options []*ast.ColumnOption) bool { + if !newFieldType.Equal(&oldFieldType) { + return true + } + var ( + defaultValue bool + comment bool + ) + for _, opt := range options { + if opt.Tp == ast.ColumnOptionDefaultValue { + defaultValue = true + } + if opt.Tp == ast.ColumnOptionComment { + comment = true + } + } + + if len(options) == 1 && defaultValue { + return false + } + + if len(options) == 2 && defaultValue && comment { + return false + } + + return true +} diff --git a/pkg/ddl/bdr_test.go b/pkg/ddl/bdr_test.go new file mode 100644 index 0000000000000..5d2a6d3adab11 --- /dev/null +++ b/pkg/ddl/bdr_test.go @@ -0,0 +1,106 @@ +// Copyright 2024 PingCAP, 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. + +package ddl + +import ( + "testing" + + "github.com/pingcap/tidb/pkg/parser/ast" + "github.com/pingcap/tidb/pkg/parser/mysql" + "github.com/pingcap/tidb/pkg/types" + "github.com/stretchr/testify/require" +) + +func TestDeniedByBDRWhenAddColumn(t *testing.T) { + tests := []struct { + name string + options []*ast.ColumnOption + expected bool + }{ + { + name: "Test with no options", + options: []*ast.ColumnOption{}, + expected: false, + }, + { + name: "Test with nullable option", + options: []*ast.ColumnOption{{Tp: ast.ColumnOptionNull}}, + expected: false, + }, + { + name: "Test with notNull and defaultValue options", + options: []*ast.ColumnOption{{Tp: ast.ColumnOptionNotNull}, {Tp: ast.ColumnOptionDefaultValue}}, + expected: false, + }, + { + name: "Test with other options", + options: []*ast.ColumnOption{{Tp: ast.ColumnOptionPrimaryKey}}, + expected: true, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + result := deniedByBDRWhenAddColumn(tt.options) + require.Equal(t, tt.expected, result) + }) + } +} + +func TestDeniedByBDRWhenModifyColumn(t *testing.T) { + tests := []struct { + name string + newFieldType types.FieldType + oldFieldType types.FieldType + options []*ast.ColumnOption + expected bool + }{ + { + name: "Test when newFieldType and oldFieldType are not equal", + newFieldType: *types.NewFieldType(mysql.TypeLong), + oldFieldType: *types.NewFieldType(mysql.TypeVarchar), + options: []*ast.ColumnOption{}, + expected: true, + }, + { + name: "Test when only defaultValue option is provided", + newFieldType: *types.NewFieldType(mysql.TypeLong), + oldFieldType: *types.NewFieldType(mysql.TypeLong), + options: []*ast.ColumnOption{{Tp: ast.ColumnOptionDefaultValue}}, + expected: false, + }, + { + name: "Test when defaultValue and comment options are provided", + newFieldType: *types.NewFieldType(mysql.TypeLong), + oldFieldType: *types.NewFieldType(mysql.TypeLong), + options: []*ast.ColumnOption{{Tp: ast.ColumnOptionDefaultValue}, {Tp: ast.ColumnOptionComment}}, + expected: false, + }, + { + name: "Test when other options are provided", + newFieldType: *types.NewFieldType(mysql.TypeLong), + oldFieldType: *types.NewFieldType(mysql.TypeLong), + options: []*ast.ColumnOption{{Tp: ast.ColumnOptionComment}}, + expected: true, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + result := deniedByBDRWhenModifyColumn(tt.newFieldType, tt.oldFieldType, tt.options) + require.Equal(t, tt.expected, result) + }) + } +} diff --git a/pkg/ddl/cluster.go b/pkg/ddl/cluster.go index 3a7093befb444..46a55598944ea 100644 --- a/pkg/ddl/cluster.go +++ b/pkg/ddl/cluster.go @@ -39,6 +39,7 @@ import ( "github.com/pingcap/tidb/pkg/sessionctx/variable" statsutil "github.com/pingcap/tidb/pkg/statistics/handle/util" "github.com/pingcap/tidb/pkg/tablecodec" + "github.com/pingcap/tidb/pkg/types" "github.com/pingcap/tidb/pkg/util/filter" "github.com/pingcap/tidb/pkg/util/gcutil" "github.com/pingcap/tidb/pkg/util/logutil" @@ -251,7 +252,7 @@ func checkAndSetFlashbackClusterInfo(se sessionctx.Context, d *ddlCtx, t *meta.M return errors.Trace(err) } - flashbackTSString := oracle.GetTimeFromTS(flashbackTS).String() + flashbackTSString := oracle.GetTimeFromTS(flashbackTS).Format(types.TimeFSPFormat) // Check if there is an upgrade during [flashbackTS, now) sql := fmt.Sprintf("select VARIABLE_VALUE from mysql.tidb as of timestamp '%s' where VARIABLE_NAME='tidb_server_version'", flashbackTSString) diff --git a/pkg/ddl/cluster_test.go b/pkg/ddl/cluster_test.go index d0fd1a7a1554c..8a486aaec072c 100644 --- a/pkg/ddl/cluster_test.go +++ b/pkg/ddl/cluster_test.go @@ -30,6 +30,7 @@ import ( "github.com/pingcap/tidb/pkg/sessionctx/variable" "github.com/pingcap/tidb/pkg/tablecodec" "github.com/pingcap/tidb/pkg/testkit" + "github.com/pingcap/tidb/pkg/types" "github.com/pingcap/tidb/pkg/util/dbterror" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -101,7 +102,7 @@ func TestFlashbackCloseAndResetPDSchedule(t *testing.T) { ts, err := tk.Session().GetStore().GetOracle().GetTimestamp(context.Background(), &oracle.Option{}) require.NoError(t, err) - tk.MustGetErrCode(fmt.Sprintf("flashback cluster to timestamp '%s'", oracle.GetTimeFromTS(ts)), errno.ErrCancelledDDLJob) + tk.MustGetErrCode(fmt.Sprintf("flashback cluster to timestamp '%s'", oracle.GetTimeFromTS(ts).Format(types.TimeFSPFormat)), errno.ErrCancelledDDLJob) dom.DDL().SetHook(originHook) finishValue, err := infosync.GetPDScheduleConfig(context.Background()) @@ -142,7 +143,7 @@ func TestAddDDLDuringFlashback(t *testing.T) { } } dom.DDL().SetHook(hook) - tk.MustExec(fmt.Sprintf("flashback cluster to timestamp '%s'", oracle.GetTimeFromTS(ts))) + tk.MustExec(fmt.Sprintf("flashback cluster to timestamp '%s'", oracle.GetTimeFromTS(ts).Format(types.TimeFSPFormat))) dom.DDL().SetHook(originHook) require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/ddl/mockFlashbackTest")) @@ -193,7 +194,7 @@ func TestGlobalVariablesOnFlashback(t *testing.T) { tk.MustExec("set global tidb_super_read_only = off") tk.MustExec("set global tidb_ttl_job_enable = on") - tk.MustExec(fmt.Sprintf("flashback cluster to timestamp '%s'", oracle.GetTimeFromTS(ts))) + tk.MustExec(fmt.Sprintf("flashback cluster to timestamp '%s'", oracle.GetTimeFromTS(ts).Format(types.TimeFSPFormat))) rs, err := tk.Exec("show variables like 'tidb_super_read_only'") require.NoError(t, err) @@ -212,7 +213,7 @@ func TestGlobalVariablesOnFlashback(t *testing.T) { ts, err = tk.Session().GetStore().GetOracle().GetTimestamp(context.Background(), &oracle.Option{}) require.NoError(t, err) - tk.MustExec(fmt.Sprintf("flashback cluster to timestamp '%s'", oracle.GetTimeFromTS(ts))) + tk.MustExec(fmt.Sprintf("flashback cluster to timestamp '%s'", oracle.GetTimeFromTS(ts).Format(types.TimeFSPFormat))) rs, err = tk.Exec("show variables like 'tidb_super_read_only'") require.NoError(t, err) require.Equal(t, tk.ResultSetToResult(rs, "").Rows()[0][1], variable.On) @@ -252,7 +253,7 @@ func TestCancelFlashbackCluster(t *testing.T) { }) dom.DDL().SetHook(hook) tk.MustExec("set global tidb_ttl_job_enable = on") - tk.MustGetErrCode(fmt.Sprintf("flashback cluster to timestamp '%s'", oracle.GetTimeFromTS(ts)), errno.ErrCancelledDDLJob) + tk.MustGetErrCode(fmt.Sprintf("flashback cluster to timestamp '%s'", oracle.GetTimeFromTS(ts).Format(types.TimeFSPFormat)), errno.ErrCancelledDDLJob) hook.MustCancelDone(t) rs, err := tk.Exec("show variables like 'tidb_ttl_job_enable'") @@ -264,7 +265,7 @@ func TestCancelFlashbackCluster(t *testing.T) { return job.SchemaState == model.StateWriteReorganization }) dom.DDL().SetHook(hook) - tk.MustExec(fmt.Sprintf("flashback cluster to timestamp '%s'", oracle.GetTimeFromTS(ts))) + tk.MustExec(fmt.Sprintf("flashback cluster to timestamp '%s'", oracle.GetTimeFromTS(ts).Format(types.TimeFSPFormat))) hook.MustCancelFailed(t) rs, err = tk.Exec("show variables like 'tidb_ttl_job_enable'") diff --git a/pkg/ddl/column.go b/pkg/ddl/column.go index 57e6d1cc4170a..5380ac82336c8 100644 --- a/pkg/ddl/column.go +++ b/pkg/ddl/column.go @@ -53,7 +53,6 @@ import ( "github.com/pingcap/tidb/pkg/util/rowcodec" "github.com/pingcap/tidb/pkg/util/sqlexec" kvutil "github.com/tikv/client-go/v2/util" - clientv3 "go.etcd.io/etcd/client/v3" "go.uber.org/zap" ) @@ -1462,6 +1461,7 @@ func (w *updateColumnWorker) BackfillData(handleRange reorgBackfillTask) (taskCt errInTxn = kv.RunInNewTxn(ctx, w.sessCtx.GetStore(), true, func(ctx context.Context, txn kv.Transaction) error { taskCtx.addedCount = 0 taskCtx.scanCount = 0 + updateTxnEntrySizeLimitIfNeeded(txn) // Because TiCDC do not want this kind of change, // so we set the lossy DDL reorg txn source to 1 to @@ -1705,8 +1705,8 @@ func (r *asAutoIDRequirement) Store() kv.Storage { return r.store } -func (r *asAutoIDRequirement) GetEtcdClient() *clientv3.Client { - return r.etcdCli +func (r *asAutoIDRequirement) AutoIDClient() *autoid.ClientDiscover { + return r.autoidCli } // applyNewAutoRandomBits set auto_random bits to TableInfo and diff --git a/pkg/ddl/column_modify_test.go b/pkg/ddl/column_modify_test.go index d733698203625..db96396970819 100644 --- a/pkg/ddl/column_modify_test.go +++ b/pkg/ddl/column_modify_test.go @@ -540,15 +540,16 @@ func TestColumnTypeChangeGenUniqueChangingName(t *testing.T) { onJobUpdatedExportedFunc := func(job *model.Job) { if job.SchemaState == model.StateDeleteOnly && job.Type == model.ActionModifyColumn { var ( - newCol *model.ColumnInfo - oldColName *model.CIStr - modifyColumnTp byte - updatedAutoRandomBits uint64 - changingCol *model.ColumnInfo - changingIdxs []*model.IndexInfo + _newCol *model.ColumnInfo + _oldColName *model.CIStr + _pos = &ast.ColumnPosition{} + _modifyColumnTp byte + _updatedAutoRandomBits uint64 + changingCol *model.ColumnInfo + changingIdxs []*model.IndexInfo ) - pos := &ast.ColumnPosition{} - err := job.DecodeArgs(&newCol, &oldColName, pos, &modifyColumnTp, &updatedAutoRandomBits, &changingCol, &changingIdxs) + + err := job.DecodeArgs(&_newCol, &_oldColName, _pos, &_modifyColumnTp, &_updatedAutoRandomBits, &changingCol, &changingIdxs) if err != nil { checkErr = err return @@ -596,15 +597,15 @@ func TestColumnTypeChangeGenUniqueChangingName(t *testing.T) { onJobUpdatedExportedFunc2 := func(job *model.Job) { if (job.Query == query1 || job.Query == query2) && job.SchemaState == model.StateDeleteOnly && job.Type == model.ActionModifyColumn { var ( - newCol *model.ColumnInfo - oldColName *model.CIStr - modifyColumnTp byte - updatedAutoRandomBits uint64 - changingCol *model.ColumnInfo - changingIdxs []*model.IndexInfo + _newCol *model.ColumnInfo + _oldColName *model.CIStr + _pos = &ast.ColumnPosition{} + _modifyColumnTp byte + _updatedAutoRandomBits uint64 + changingCol *model.ColumnInfo + changingIdxs []*model.IndexInfo ) - pos := &ast.ColumnPosition{} - err := job.DecodeArgs(&newCol, &oldColName, pos, &modifyColumnTp, &updatedAutoRandomBits, &changingCol, &changingIdxs) + err := job.DecodeArgs(&_newCol, &_oldColName, _pos, &_modifyColumnTp, &_updatedAutoRandomBits, &changingCol, &changingIdxs) if err != nil { checkErr = err return diff --git a/pkg/ddl/column_type_change_test.go b/pkg/ddl/column_type_change_test.go index 912e3790c216c..0296cd87c6430 100644 --- a/pkg/ddl/column_type_change_test.go +++ b/pkg/ddl/column_type_change_test.go @@ -388,6 +388,7 @@ func TestChangingColOriginDefaultValueAfterAddColAndCastSucc(t *testing.T) { tk1 := testkit.NewTestKit(t, store) tk1.MustExec("use test") + tk1.MustExec("set time_zone = 'UTC'") tk.MustExec("set time_zone = 'UTC'") tk.MustExec("drop table if exists t") diff --git a/pkg/ddl/constant.go b/pkg/ddl/constant.go index 8b3757bf6f7b9..7c11539e12a2d 100644 --- a/pkg/ddl/constant.go +++ b/pkg/ddl/constant.go @@ -40,11 +40,35 @@ const ( BackgroundSubtaskHistoryTableID = meta.MaxInt48 - 6 // JobTableSQL is the CREATE TABLE SQL of `tidb_ddl_job`. - JobTableSQL = "create table " + JobTable + "(job_id bigint not null, reorg int, schema_ids text(65535), table_ids text(65535), job_meta longblob, type int, processing int, primary key(job_id))" + JobTableSQL = "create table " + JobTable + `( + job_id bigint not null, + reorg int, + schema_ids text(65535), + table_ids text(65535), + job_meta longblob, + type int, + processing int, + primary key(job_id))` // ReorgTableSQL is the CREATE TABLE SQL of `tidb_ddl_reorg`. - ReorgTableSQL = "create table " + ReorgTable + "(job_id bigint not null, ele_id bigint, ele_type blob, start_key blob, end_key blob, physical_id bigint, reorg_meta longblob, unique key(job_id, ele_id, ele_type(20)))" + ReorgTableSQL = "create table " + ReorgTable + `( + job_id bigint not null, + ele_id bigint, + ele_type blob, + start_key blob, + end_key blob, + physical_id bigint, + reorg_meta longblob, + unique key(job_id, ele_id, ele_type(20)))` // HistoryTableSQL is the CREATE TABLE SQL of `tidb_ddl_history`. - HistoryTableSQL = "create table " + HistoryTable + "(job_id bigint not null, job_meta longblob, db_name char(64), table_name char(64), schema_ids text(65535), table_ids text(65535), create_time datetime, primary key(job_id))" + HistoryTableSQL = "create table " + HistoryTable + `( + job_id bigint not null, + job_meta longblob, + db_name char(64), + table_name char(64), + schema_ids text(65535), + table_ids text(65535), + create_time datetime, + primary key(job_id))` // BackgroundSubtaskTableSQL is the CREATE TABLE SQL of `tidb_background_subtask`. BackgroundSubtaskTableSQL = `create table tidb_background_subtask ( id bigint not null auto_increment primary key, @@ -57,12 +81,19 @@ const ( exec_expired timestamp, state varchar(64) not null, checkpoint longblob not null, + concurrency int, + create_time timestamp, start_time bigint, state_update_time bigint, + end_time TIMESTAMP, meta longblob, + ordinal int, error BLOB, summary json, - key idx_task_key(task_key))` + key idx_task_key(task_key), + key idx_exec_id(exec_id), + unique uk_task_key_step_ordinal(task_key, step, ordinal) + )` // BackgroundSubtaskHistoryTableSQL is the CREATE TABLE SQL of `tidb_background_subtask_history`. BackgroundSubtaskHistoryTableSQL = `create table tidb_background_subtask_history ( id bigint not null auto_increment primary key, @@ -75,9 +106,13 @@ const ( exec_expired timestamp, state varchar(64) not null, checkpoint longblob not null, + concurrency int, + create_time timestamp, start_time bigint, state_update_time bigint, + end_time TIMESTAMP, meta longblob, + ordinal int, error BLOB, summary json, key idx_task_key(task_key), diff --git a/pkg/ddl/constraint.go b/pkg/ddl/constraint.go index 1eaee3c618fa0..f8b28efb1ab6d 100644 --- a/pkg/ddl/constraint.go +++ b/pkg/ddl/constraint.go @@ -148,6 +148,13 @@ func checkAddCheckConstraint(t *meta.Meta, job *model.Job) (*model.DBInfo, *mode } // if not, that means constraint was in intermediate state. } + + err = checkConstraintNamesNotExists(t, schemaID, []*model.ConstraintInfo{constraintInfo1}) + if err != nil { + job.State = model.JobStateCancelled + return nil, nil, nil, nil, err + } + return dbInfo, tblInfo, constraintInfo2, constraintInfo1, nil } diff --git a/pkg/ddl/constraint_test.go b/pkg/ddl/constraint_test.go index 06d3c8abce514..e8ad736f21eb8 100644 --- a/pkg/ddl/constraint_test.go +++ b/pkg/ddl/constraint_test.go @@ -97,7 +97,6 @@ func TestAlterAddConstraintStateChange(t *testing.T) { tableCommon, ok := constraintTable.(*tables.TableCommon) require.True(t, ok) originCons := tableCommon.Constraints - tableCommon.WritableConstraints = []*table.Constraint{} tableCommon.Constraints = []*table.Constraint{} // insert data tk1.MustExec("insert into t values(1)") @@ -130,15 +129,11 @@ func TestAlterAddConstraintStateChange1(t *testing.T) { tk1.MustExec("use test") tk1.MustExec("insert into t values(12)") - var checkErr error d := dom.DDL() originalCallback := d.GetHook() callback := &callback.TestDDLCallback{} // StatNone -> StateWriteOnly onJobUpdatedExportedFunc1 := func(job *model.Job) { - if checkErr != nil { - return - } originalCallback.OnChanged(nil) if job.SchemaState == model.StateWriteOnly { // set constraint state @@ -146,7 +141,6 @@ func TestAlterAddConstraintStateChange1(t *testing.T) { tableCommon, ok := constraintTable.(*tables.TableCommon) require.True(t, ok) originCons := tableCommon.Constraints - tableCommon.WritableConstraints = []*table.Constraint{} tableCommon.Constraints = []*table.Constraint{} // insert data tk1.MustExec("insert into t values(1)") @@ -174,15 +168,11 @@ func TestAlterAddConstraintStateChange2(t *testing.T) { tk1.MustExec("use test") tk1.MustExec("insert into t values(12)") - var checkErr error d := dom.DDL() originalCallback := d.GetHook() callback := &callback.TestDDLCallback{} // StateWriteOnly -> StateWriteReorganization onJobUpdatedExportedFunc2 := func(job *model.Job) { - if checkErr != nil { - return - } originalCallback.OnChanged(nil) if job.SchemaState == model.StateWriteReorganization { // set constraint state @@ -190,7 +180,6 @@ func TestAlterAddConstraintStateChange2(t *testing.T) { tableCommon, ok := constraintTable.(*tables.TableCommon) require.True(t, ok) tableCommon.Constraints[0].State = model.StateWriteOnly - tableCommon.WritableConstraints = []*table.Constraint{} // insert data tk1.MustGetErrMsg("insert into t values(1)", "[table:3819]Check constraint 'c2' is violated.") // recover @@ -217,13 +206,13 @@ func TestAlterAddConstraintStateChange3(t *testing.T) { tk1.MustExec("use test") tk1.MustExec("insert into t values(12)") - var checkErr error + addCheckDone := false d := dom.DDL() originalCallback := d.GetHook() callback := &callback.TestDDLCallback{} // StateWriteReorganization -> StatePublic onJobUpdatedExportedFunc3 := func(job *model.Job) { - if checkErr != nil { + if job.Type != model.ActionAddCheckConstraint || job.TableName != "t" { return } originalCallback.OnChanged(nil) @@ -233,19 +222,24 @@ func TestAlterAddConstraintStateChange3(t *testing.T) { tableCommon, ok := constraintTable.(*tables.TableCommon) require.True(t, ok) tableCommon.Constraints[0].State = model.StateWriteReorganization - tableCommon.WritableConstraints = []*table.Constraint{} // insert data tk1.MustGetErrMsg("insert into t values(1)", "[table:3819]Check constraint 'c3' is violated.") // recover tableCommon.Constraints[0].State = model.StatePublic tableCommon.WritableConstraint() + addCheckDone = true } } callback.OnJobUpdatedExported.Store(&onJobUpdatedExportedFunc3) d.SetHook(callback) tk.MustExec("alter table t add constraint c3 check ( a > 10)") // Issue TiDB#48123. - time.Sleep(50 * time.Millisecond) + for i := 0; i <= 100; i++ { + if addCheckDone { + break + } + time.Sleep(10 * time.Millisecond) + } tk.MustQuery("select * from t").Check(testkit.Rows("12")) tk.MustQuery("show create table t").Check(testkit.Rows("t CREATE TABLE `t` (\n `a` int(11) DEFAULT NULL,\nCONSTRAINT `c3` CHECK ((`a` > 10))\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin")) } @@ -261,15 +255,11 @@ func TestAlterEnforcedConstraintStateChange(t *testing.T) { tk1.MustExec("use test") tk1.MustExec("insert into t values(12)") - var checkErr error d := dom.DDL() originalCallback := d.GetHook() callback := &callback.TestDDLCallback{} // StateWriteReorganization -> StatePublic onJobUpdatedExportedFunc3 := func(job *model.Job) { - if checkErr != nil { - return - } originalCallback.OnChanged(nil) if job.SchemaState == model.StateWriteReorganization { // set constraint state @@ -277,7 +267,6 @@ func TestAlterEnforcedConstraintStateChange(t *testing.T) { tableCommon, ok := constraintTable.(*tables.TableCommon) require.True(t, ok) tableCommon.Constraints[0].State = model.StateWriteOnly - tableCommon.WritableConstraints = []*table.Constraint{} // insert data tk1.MustGetErrMsg("insert into t values(1)", "[table:3819]Check constraint 'c1' is violated.") // recover diff --git a/pkg/ddl/db_change_failpoints_test.go b/pkg/ddl/db_change_failpoints_test.go index 434accce08496..6cfaf4885db7c 100644 --- a/pkg/ddl/db_change_failpoints_test.go +++ b/pkg/ddl/db_change_failpoints_test.go @@ -66,15 +66,15 @@ func TestModifyColumnTypeArgs(t *testing.T) { require.NotNil(t, historyJob) var ( - newCol *model.ColumnInfo - oldColName *model.CIStr - modifyColumnTp byte - updatedAutoRandomBits uint64 - changingCol *model.ColumnInfo - changingIdxs []*model.IndexInfo + _newCol *model.ColumnInfo + _oldColName *model.CIStr + _modifyColumnTp byte + _updatedAutoRandomBits uint64 + changingCol *model.ColumnInfo + changingIdxs []*model.IndexInfo ) - pos := &ast.ColumnPosition{} - err = historyJob.DecodeArgs(&newCol, &oldColName, pos, &modifyColumnTp, &updatedAutoRandomBits, &changingCol, &changingIdxs) + _pos := &ast.ColumnPosition{} + err = historyJob.DecodeArgs(&_newCol, &_oldColName, _pos, &_modifyColumnTp, &_updatedAutoRandomBits, &changingCol, &changingIdxs) require.NoError(t, err) require.Nil(t, changingCol) require.Nil(t, changingIdxs) diff --git a/pkg/ddl/db_integration_test.go b/pkg/ddl/db_integration_test.go index 5fcedeb4e2384..66cd9e9f9c2f7 100644 --- a/pkg/ddl/db_integration_test.go +++ b/pkg/ddl/db_integration_test.go @@ -1817,8 +1817,6 @@ func TestParserIssue284(t *testing.T) { func TestAddExpressionIndex(t *testing.T) { config.UpdateGlobal(func(conf *config.Config) { - // Test for table lock. - conf.EnableTableLock = true conf.Instance.SlowThreshold = 10000 conf.TiKVClient.AsyncCommit.SafeWindow = 0 conf.TiKVClient.AsyncCommit.AllowedClockDrift = 0 @@ -1897,60 +1895,6 @@ func TestAddExpressionIndex(t *testing.T) { }) } -func TestCreateExpressionIndexError(t *testing.T) { - config.UpdateGlobal(func(conf *config.Config) { - // Test for table lock. - conf.EnableTableLock = true - conf.Instance.SlowThreshold = 10000 - conf.TiKVClient.AsyncCommit.SafeWindow = 0 - conf.TiKVClient.AsyncCommit.AllowedClockDrift = 0 - conf.Experimental.AllowsExpressionIndex = true - }) - store := testkit.CreateMockStore(t) - tk := testkit.NewTestKit(t, store) - tk.MustExec("use test") - tk.MustExec("drop table if exists t;") - tk.MustExec("create table t (a int, b real);") - tk.MustGetErrCode("alter table t add primary key ((a+b)) nonclustered;", errno.ErrFunctionalIndexPrimaryKey) - - tk.MustGetErrCode("create table t(a int, index((cast(a as JSON))))", errno.ErrFunctionalIndexOnJSONOrGeometryFunction) - - // Test for error - tk.MustExec("drop table if exists t;") - tk.MustExec("create table t (a int, b real);") - tk.MustGetErrCode("alter table t add primary key ((a+b)) nonclustered;", errno.ErrFunctionalIndexPrimaryKey) - tk.MustGetErrCode("alter table t add index ((rand()));", errno.ErrFunctionalIndexFunctionIsNotAllowed) - tk.MustGetErrCode("alter table t add index ((now()+1));", errno.ErrFunctionalIndexFunctionIsNotAllowed) - - tk.MustExec("alter table t add column (_V$_idx_0 int);") - tk.MustGetErrCode("alter table t add index idx((a+1));", errno.ErrDupFieldName) - tk.MustExec("alter table t drop column _V$_idx_0;") - tk.MustExec("alter table t add index idx((a+1));") - tk.MustGetErrCode("alter table t add column (_V$_idx_0 int);", errno.ErrDupFieldName) - tk.MustExec("alter table t drop index idx;") - tk.MustExec("alter table t add column (_V$_idx_0 int);") - - tk.MustExec("alter table t add column (_V$_expression_index_0 int);") - tk.MustGetErrCode("alter table t add index ((a+1));", errno.ErrDupFieldName) - tk.MustExec("alter table t drop column _V$_expression_index_0;") - tk.MustExec("alter table t add index ((a+1));") - tk.MustGetErrCode("alter table t drop column _V$_expression_index_0;", errno.ErrCantDropFieldOrKey) - tk.MustGetErrCode("alter table t add column e int as (_V$_expression_index_0 + 1);", errno.ErrBadField) - - // NOTE (#18150): In creating expression index, row value is not allowed. - tk.MustExec("drop table if exists t;") - tk.MustGetErrCode("create table t (j json, key k (((j,j))))", errno.ErrFunctionalIndexRowValueIsNotAllowed) - tk.MustExec("create table t (j json, key k ((j+1),(j+1)))") - - tk.MustGetErrCode("create table t1 (col1 int, index ((concat(''))));", errno.ErrWrongKeyColumnFunctionalIndex) - tk.MustGetErrCode("CREATE TABLE t1 (col1 INT, PRIMARY KEY ((ABS(col1))) NONCLUSTERED);", errno.ErrFunctionalIndexPrimaryKey) - - // For issue 26349 - tk.MustExec("drop table if exists t;") - tk.MustExec("create table t(id char(10) primary key, short_name char(10), name char(10), key n((upper(`name`))));") - tk.MustExec("update t t1 set t1.short_name='a' where t1.id='1';") -} - func queryIndexOnTable(dbName, tableName string) string { return fmt.Sprintf("select distinct index_name, is_visible from information_schema.statistics where table_schema = '%s' and table_name = '%s' order by index_name", dbName, tableName) } @@ -2349,20 +2293,6 @@ func TestEnumAndSetDefaultValue(t *testing.T) { require.Equal(t, "a", tbl.Meta().Columns[1].DefaultValue) } -func TestStrictDoubleTypeCheck(t *testing.T) { - store := testkit.CreateMockStore(t) - tk := testkit.NewTestKit(t, store) - tk.MustExec("use test") - tk.MustExec("set @@tidb_enable_strict_double_type_check = 'ON'") - sql := "create table double_type_check(id int, c double(10));" - _, err := tk.Exec(sql) - require.Error(t, err) - require.Equal(t, "[parser:1149]You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use", err.Error()) - tk.MustExec("set @@tidb_enable_strict_double_type_check = 'OFF'") - defer tk.MustExec("set @@tidb_enable_strict_double_type_check = 'ON'") - tk.MustExec(sql) -} - func TestDuplicateErrorMessage(t *testing.T) { defer collate.SetNewCollationEnabledForTest(true) store := testkit.CreateMockStore(t) @@ -2384,10 +2314,7 @@ func TestDuplicateErrorMessage(t *testing.T) { for _, newCollate := range []bool{false, true} { collate.SetNewCollationEnabledForTest(newCollate) for _, globalIndex := range []bool{false, true} { - restoreConfig := config.RestoreFunc() - config.UpdateGlobal(func(conf *config.Config) { - conf.EnableGlobalIndex = globalIndex - }) + tk.MustExec(fmt.Sprintf("set tidb_enable_global_index=%t", globalIndex)) for _, clusteredIndex := range []variable.ClusteredIndexDefMode{variable.ClusteredIndexDefModeOn, variable.ClusteredIndexDefModeOff, variable.ClusteredIndexDefModeIntOnly} { tk.Session().GetSessionVars().EnableClusteredIndex = clusteredIndex for _, t := range tests { @@ -2414,7 +2341,7 @@ func TestDuplicateErrorMessage(t *testing.T) { fmt.Sprintf("[kv:1062]Duplicate entry '1-%s' for key 't.t_idx'", strings.Join(fields, "-"))) } } - restoreConfig() + tk.MustExec("set tidb_enable_global_index=default") } } } @@ -2669,8 +2596,6 @@ func TestAvoidCreateViewOnLocalTemporaryTable(t *testing.T) { func TestDropTemporaryTable(t *testing.T) { config.UpdateGlobal(func(conf *config.Config) { - // Test for table lock. - conf.EnableTableLock = true conf.Instance.SlowThreshold = 10000 conf.TiKVClient.AsyncCommit.SafeWindow = 0 conf.TiKVClient.AsyncCommit.AllowedClockDrift = 0 @@ -2936,42 +2861,6 @@ func TestIssue29282(t *testing.T) { } } -// See https://github.com/pingcap/tidb/issues/35644 -func TestCreateTempTableInTxn(t *testing.T) { - store := testkit.CreateMockStore(t) - tk := testkit.NewTestKit(t, store) - tk.MustExec("use test") - tk.MustExec("begin") - // new created temporary table should be visible - tk.MustExec("create temporary table t1(id int primary key, v int)") - tk.MustQuery("select * from t1").Check(testkit.Rows()) - // new inserted data should be visible - tk.MustExec("insert into t1 values(123, 456)") - tk.MustQuery("select * from t1 where id=123").Check(testkit.Rows("123 456")) - // truncate table will clear data but table still visible - tk.MustExec("truncate table t1") - tk.MustQuery("select * from t1 where id=123").Check(testkit.Rows()) - tk.MustExec("commit") - - tk1 := testkit.NewTestKit(t, store) - tk1.MustExec("use test") - tk1.MustExec("create table tt(id int)") - tk1.MustExec("begin") - tk1.MustExec("create temporary table t1(id int)") - tk1.MustExec("insert into tt select * from t1") - tk1.MustExec("drop table tt") - - tk2 := testkit.NewTestKit(t, store) - tk2.MustExec("use test") - tk2.MustExec("create table t2(id int primary key, v int)") - tk2.MustExec("insert into t2 values(234, 567)") - tk2.MustExec("begin") - // create a new temporary table with the same name will override physical table - tk2.MustExec("create temporary table t2(id int primary key, v int)") - tk2.MustQuery("select * from t2 where id=234").Check(testkit.Rows()) - tk2.MustExec("commit") -} - // See https://github.com/pingcap/tidb/issues/29327 func TestEnumDefaultValue(t *testing.T) { store := testkit.CreateMockStore(t, mockstore.WithDDLChecker()) @@ -3066,3 +2955,9 @@ func TestDefaultCollationForUTF8MB4(t *testing.T) { tk.MustQuery("show create database dby").Check(testkit.Rows( "dby CREATE DATABASE `dby` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci */")) } + +func TestOptimizeTable(t *testing.T) { + store := testkit.CreateMockStore(t, mockstore.WithDDLChecker()) + tk := testkit.NewTestKit(t, store) + tk.MustGetErrMsg("optimize table t", "[ddl:8200]OPTIMIZE TABLE is not supported") +} diff --git a/pkg/ddl/db_rename_test.go b/pkg/ddl/db_rename_test.go index 2d8afc38a21c4..4484996796f10 100644 --- a/pkg/ddl/db_rename_test.go +++ b/pkg/ddl/db_rename_test.go @@ -17,6 +17,7 @@ package ddl_test import ( "fmt" "testing" + gotime "time" "github.com/pingcap/tidb/pkg/config" "github.com/pingcap/tidb/pkg/domain" @@ -24,7 +25,9 @@ import ( "github.com/pingcap/tidb/pkg/parser/model" "github.com/pingcap/tidb/pkg/store/mockstore" "github.com/pingcap/tidb/pkg/testkit" + "github.com/pingcap/tidb/pkg/util/logutil" "github.com/stretchr/testify/require" + "go.uber.org/zap" ) // See issue: https://github.com/pingcap/tidb/issues/29752 @@ -281,3 +284,199 @@ func TestRenameMultiTablesIssue47064(t *testing.T) { tk.MustExec("rename table test.t1 to test1.t1, test.t2 to test1.t2") tk.MustQuery("select column_name from information_schema.columns where table_name = 't1'").Check(testkit.Rows("a")) } + +func TestRenameConcurrentAutoID(t *testing.T) { + store := testkit.CreateMockStore(t, mockstore.WithDDLChecker()) + + tk1 := testkit.NewTestKit(t, store) + tk1.MustExec("use test") + // Use first client session, tidb1 + tk1.MustExec(`create schema if not exists test1`) + tk1.MustExec(`create schema if not exists test2`) + tk1.MustExec(`drop table if exists test1.t1, test2.t2`) + tk1.MustExec(`CREATE TABLE test1.t1 (a int auto_increment primary key nonclustered, b varchar(255), key (b)) auto_id_cache 5`) + tk1.MustExec(`begin`) + tk1.MustExec(`insert into test1.t1 values (null, "t1 first null")`) + tk1.MustQuery(`select _tidb_rowid, a, b from test1.t1`).Sort().Check(testkit.Rows("2 1 t1 first null")) + + ctx := tk1.Session() + is := domain.GetDomain(ctx).InfoSchema() + tblInfo, err := is.TableByName(model.NewCIStr("test1"), model.NewCIStr("t1")) + require.NoError(t, err) + require.Equal(t, int64(0), tblInfo.Meta().AutoIDSchemaID) + origAllocs := tblInfo.Allocators(nil) + require.Equal(t, int64(5), origAllocs.Allocs[0].End()) + + // Switch to a new client (tidb2) + tk2 := testkit.NewTestKit(t, store) + tk2.MustExec(`use test`) + alterChan := make(chan error) + go func() { + // will wait for tidb1 + alterChan <- tk2.ExecToErr(`rename table test1.t1 to test2.t2`) + }() + tk3 := testkit.NewTestKit(t, store) + waitFor := func(tableName, s string, pos int) { + for { + select { + case alterErr := <-alterChan: + require.Fail(t, "Alter completed unexpectedly", "With error %v", alterErr) + default: + // Alter still running + } + res := tk3.MustQuery(`admin show ddl jobs where table_name = '` + tableName + `' and job_type = 'rename table'`).Rows() + if len(res) == 1 && res[0][pos] == s { + logutil.BgLogger().Info("Got state", zap.String("State", s)) + break + } + gotime.Sleep(50 * gotime.Millisecond) + } + // Sleep 50ms to wait load InforSchema finish, issue #46815. + gotime.Sleep(50 * gotime.Millisecond) + } + + // Switch to new client (tidb3) + waitFor("t1", "public", 4) + tk3.MustExec(`use test`) + tk3.MustExec(`begin`) + tk3.MustExec(`insert into test2.t2 values (null, "t2 first null")`) + tk3.MustQuery(`select _tidb_rowid, a, b from test2.t2`).Sort().Check(testkit.Rows("4 3 t2 first null")) + + // Switch back to tidb1 + // instead of generating 30k inserts with null + tk1.MustExec(`insert into test1.t1 values (null, "t1 second null")`) + // Bug was that this gave: + // ERROR 1146 (42S02): table doesn't exist + // Due to AutoID does no-longer exists. + tk1.MustExec(`insert into test1.t1 values (null, "t1 third null")`) + tk1.MustExec(`commit`) + tk3.MustExec(`insert into test2.t2 values (null, "t2 second null")`) + tk3.MustExec(`insert into test2.t2 values (null, "t2 third null")`) + tk3.MustExec(`commit`) + require.NoError(t, <-alterChan) + tk1.MustQuery(`select _tidb_rowid, a, b from test2.t2`).Sort().Check(testkit.Rows(""+ + "10 9 t2 second null", + "12 11 t2 third null", + "2 1 t1 first null", + "4 3 t2 first null", + "6 5 t1 second null", + "8 7 t1 third null")) + + // Unit test part for checking what happens when you rename back to the old schema (it should reset the 'AutoIDSchemaID' variable) + // and if you rename multiple time (so it does not lose the autoID). + ctx = tk1.Session() + is = domain.GetDomain(ctx).InfoSchema() + tblInfo, err = is.TableByName(model.NewCIStr("test2"), model.NewCIStr("t2")) + require.NoError(t, err) + originalSchemaID := tblInfo.Meta().AutoIDSchemaID + require.NotEqual(t, int64(0), originalSchemaID) + origAllocs = tblInfo.Allocators(nil) + require.Equal(t, int64(15), origAllocs.Allocs[0].End()) + + // Plan: + // - Rename to new table name in same Schema + // - Rename to new table name in new Schema + // - Rename to new table name in original Schema + // - Rename to new table name in new Schema + // - Drop original schema (verify that it does not clean up AutoIDs or hides them!) + // - Recreate original schema (by name) (Original Schema ID will not be used by anything else, ever!) + // - Rename to new table name in original Schema (should keep its AutoIDSchemaID) + + tk1.MustExec(`use test`) + tk1.MustExec(`rename table test2.t2 to test2.t1`) + tk1.MustExec(`insert into test2.t1 values (null, "Now t1 again")`) + tk1.MustQuery(`select _tidb_rowid, a, b from test2.t1`).Sort().Check(testkit.Rows(""+ + "10 9 t2 second null", + "12 11 t2 third null", + "14 13 Now t1 again", + "2 1 t1 first null", + "4 3 t2 first null", + "6 5 t1 second null", + "8 7 t1 third null")) + + ctx = tk1.Session() + is = domain.GetDomain(ctx).InfoSchema() + tblInfo, err = is.TableByName(model.NewCIStr("test2"), model.NewCIStr("t1")) + require.NoError(t, err) + require.Equal(t, originalSchemaID, tblInfo.Meta().AutoIDSchemaID) + origAllocs = tblInfo.Allocators(nil) + require.Equal(t, int64(15), origAllocs.Allocs[0].End()) + + tk1.MustExec(`insert into test2.t1 values (15, "Now t1, Explicit 15")`) + tk1.MustExec(`insert into test2.t1 values (null, "Is it 17?")`) + tk1.MustQuery(`select _tidb_rowid, a, b from test2.t1`).Sort().Check(testkit.Rows(""+ + "10 9 t2 second null", + "12 11 t2 third null", + "14 13 Now t1 again", + "16 15 Now t1, Explicit 15", + "18 17 Is it 17?", + "2 1 t1 first null", + "4 3 t2 first null", + "6 5 t1 second null", + "8 7 t1 third null")) + + tk1.MustExec(`rename table test2.t1 to test1.t1`) + + tk1.MustExec(`insert into test1.t1 values (null, "Is it 19?")`) + tk1.MustExec(`insert into test1.t1 values (22, "Now test1, Explicit 22")`) + tk1.MustExec(`insert into test1.t1 values (null, "Is it 24?")`) + tk1.MustQuery(`select _tidb_rowid, a, b from test1.t1`).Sort().Check(testkit.Rows(""+ + "10 9 t2 second null", + "12 11 t2 third null", + "14 13 Now t1 again", + "16 15 Now t1, Explicit 15", + "18 17 Is it 17?", + "2 1 t1 first null", + "20 19 Is it 19?", + "23 22 Now test1, Explicit 22", + "25 24 Is it 24?", + "4 3 t2 first null", + "6 5 t1 second null", + "8 7 t1 third null")) + + ctx = tk1.Session() + is = domain.GetDomain(ctx).InfoSchema() + tblInfo, err = is.TableByName(model.NewCIStr("test1"), model.NewCIStr("t1")) + require.NoError(t, err) + // Should be cleared when moved back to the original SchemaID + require.Equal(t, int64(0), tblInfo.Meta().AutoIDSchemaID) + + tk1.MustExec(`rename table test1.t1 to test2.t2`) + tk1.MustExec(`drop schema test1`) + tk1.MustExec(`insert into test2.t2 values (30, "Now test2 again, Explicit 30")`) + tk1.MustExec(`insert into test2.t2 values (null, "Is it 32?")`) + tk1.MustExec(`rename table test2.t2 to test2.t1`) + tk1.MustExec(`insert into test2.t1 values (35, "Now t1 again, Explicit 35")`) + tk1.MustExec(`insert into test2.t1 values (null, "Is it 37?")`) + tk1.MustExec(`create schema test1`) + tk1.MustExec(`rename table test2.t1 to test1.t1`) + + ctx = tk1.Session() + is = domain.GetDomain(ctx).InfoSchema() + tblInfo, err = is.TableByName(model.NewCIStr("test1"), model.NewCIStr("t1")) + require.NoError(t, err) + require.NotEqual(t, int64(0), tblInfo.Meta().AutoIDSchemaID) + origAllocs = tblInfo.Allocators(nil) + require.Equal(t, int64(40), origAllocs.Allocs[0].End()) + + tk1.MustExec(`insert into test1.t1 values (null, "Is it 39?")`) + + tk1.MustQuery(`select _tidb_rowid, a, b from test1.t1`).Sort().Check(testkit.Rows(""+ + "10 9 t2 second null", + "12 11 t2 third null", + "14 13 Now t1 again", + "16 15 Now t1, Explicit 15", + "18 17 Is it 17?", + "2 1 t1 first null", + "20 19 Is it 19?", + "23 22 Now test1, Explicit 22", + "25 24 Is it 24?", + "31 30 Now test2 again, Explicit 30", + "33 32 Is it 32?", + "36 35 Now t1 again, Explicit 35", + "38 37 Is it 37?", + "4 3 t2 first null", + "40 39 Is it 39?", + "6 5 t1 second null", + "8 7 t1 third null")) +} diff --git a/pkg/ddl/db_table_test.go b/pkg/ddl/db_table_test.go index 800fc54704219..46a8536886540 100644 --- a/pkg/ddl/db_table_test.go +++ b/pkg/ddl/db_table_test.go @@ -858,3 +858,27 @@ func TestDropTables(t *testing.T) { failedSQL = "show create table t1;" tk.MustGetErrCode(failedSQL, errno.ErrNoSuchTable) } + +func TestCreateConstraintForTable(t *testing.T) { + store := testkit.CreateMockStore(t, mockstore.WithDDLChecker()) + + tk := testkit.NewTestKit(t, store) + + tk.MustExec("use test") + tk.MustExec("DROP TABLE IF EXISTS t1, t2") + tk.MustExec("set @@global.tidb_enable_check_constraint = 1") + tk.MustExec("CREATE TABLE t1 (id INT PRIMARY KEY, CONSTRAINT c1 CHECK (id<50))") + failedSQL := "CREATE TABLE t2 (id INT PRIMARY KEY, CONSTRAINT c1 CHECK (id<50))" + tk.MustGetErrCode(failedSQL, errno.ErrCheckConstraintDupName) + + tk.MustExec("CREATE TABLE t2 (id INT PRIMARY KEY)") + failedSQL = "ALTER TABLE t2 ADD CONSTRAINT c1 CHECK (id<50)" + tk.MustGetErrCode(failedSQL, errno.ErrCheckConstraintDupName) + + tk.MustExec("DROP DATABASE IF EXISTS test2") + tk.MustExec("CREATE DATABASE test2") + tk.MustExec("CREATE TABLE test2.t1 (id INT PRIMARY KEY, CONSTRAINT c1 CHECK (id<50))") + rs, err := tk.Exec("SHOW TABLES FROM test2 LIKE 't1'") + require.NoError(t, err) + require.Equal(t, tk.ResultSetToResult(rs, "").Rows()[0][0], "t1") +} diff --git a/pkg/ddl/db_test.go b/pkg/ddl/db_test.go index 8bfd211ad1fb9..b8ee1736969f3 100644 --- a/pkg/ddl/db_test.go +++ b/pkg/ddl/db_test.go @@ -47,6 +47,7 @@ import ( "github.com/pingcap/tidb/pkg/util" "github.com/pingcap/tidb/pkg/util/mock" "github.com/pingcap/tidb/pkg/util/sqlexec" + "github.com/pingcap/tidb/pkg/util/timeutil" "github.com/stretchr/testify/require" "github.com/tikv/client-go/v2/oracle" "github.com/tikv/client-go/v2/tikv" @@ -69,6 +70,8 @@ func TestGetTimeZone(t *testing.T) { tk := testkit.NewTestKit(t, store) tk.MustExec("use test") + systemTimeZone := timeutil.SystemLocation().String() + testCases := []struct { tzSQL string tzStr string @@ -83,8 +86,8 @@ func TestGetTimeZone(t *testing.T) { {"set time_zone = '-08:00'", "", "", -28800, ""}, {"set time_zone = '+08:00'", "", "", 28800, ""}, {"set time_zone = 'Asia/Shanghai'", "Asia/Shanghai", "Asia/Shanghai", 0, ""}, - {"set time_zone = 'SYSTEM'", "Asia/Shanghai", "Asia/Shanghai", 0, ""}, - {"set time_zone = DEFAULT", "Asia/Shanghai", "Asia/Shanghai", 0, ""}, + {"set time_zone = 'SYSTEM'", systemTimeZone, systemTimeZone, 0, ""}, + {"set time_zone = DEFAULT", systemTimeZone, systemTimeZone, 0, ""}, {"set time_zone = 'GMT'", "GMT", "GMT", 0, ""}, {"set time_zone = 'GMT+1'", "GMT", "GMT", 0, "[variable:1298]Unknown or incorrect time zone: 'GMT+1'"}, {"set time_zone = 'Etc/GMT+12'", "Etc/GMT+12", "Etc/GMT+12", 0, ""}, diff --git a/pkg/ddl/ddl.go b/pkg/ddl/ddl.go index d1b83d940626d..e06118992226e 100644 --- a/pkg/ddl/ddl.go +++ b/pkg/ddl/ddl.go @@ -19,11 +19,9 @@ package ddl import ( - "cmp" "context" "fmt" "runtime" - "slices" "strconv" "strings" "sync" @@ -40,13 +38,14 @@ import ( sess "github.com/pingcap/tidb/pkg/ddl/internal/session" "github.com/pingcap/tidb/pkg/ddl/syncer" "github.com/pingcap/tidb/pkg/ddl/util" - "github.com/pingcap/tidb/pkg/disttask/framework/dispatcher" "github.com/pingcap/tidb/pkg/disttask/framework/proto" "github.com/pingcap/tidb/pkg/disttask/framework/scheduler" + "github.com/pingcap/tidb/pkg/disttask/framework/taskexecutor" "github.com/pingcap/tidb/pkg/domain/infosync" "github.com/pingcap/tidb/pkg/infoschema" "github.com/pingcap/tidb/pkg/kv" "github.com/pingcap/tidb/pkg/meta" + "github.com/pingcap/tidb/pkg/meta/autoid" "github.com/pingcap/tidb/pkg/metrics" "github.com/pingcap/tidb/pkg/owner" "github.com/pingcap/tidb/pkg/parser/ast" @@ -56,7 +55,6 @@ import ( "github.com/pingcap/tidb/pkg/sessionctx" "github.com/pingcap/tidb/pkg/sessionctx/binloginfo" "github.com/pingcap/tidb/pkg/sessionctx/variable" - "github.com/pingcap/tidb/pkg/sessiontxn" "github.com/pingcap/tidb/pkg/statistics/handle" statsutil "github.com/pingcap/tidb/pkg/statistics/handle/util" "github.com/pingcap/tidb/pkg/table" @@ -69,6 +67,7 @@ import ( "github.com/pingcap/tidb/pkg/util/syncutil" "github.com/tikv/client-go/v2/tikvrpc" clientv3 "go.etcd.io/etcd/client/v3" + "go.etcd.io/etcd/client/v3/concurrency" atomicutil "go.uber.org/atomic" "go.uber.org/zap" ) @@ -77,7 +76,8 @@ const ( // currentVersion is for all new DDL jobs. currentVersion = 1 // DDLOwnerKey is the ddl owner path that is saved to etcd, and it's exported for testing. - DDLOwnerKey = "/tidb/ddl/fg/owner" + DDLOwnerKey = "/tidb/ddl/fg/owner" + ddlSchemaVersionKeyLock = "/tidb/ddl/schema_version_lock" // addingDDLJobPrefix is the path prefix used to record the newly added DDL job, and it's saved to etcd. addingDDLJobPrefix = "/tidb/ddl/add_ddl_job_" ddlPrompt = "ddl" @@ -88,6 +88,7 @@ const ( reorgWorkerCnt = 10 generalWorkerCnt = 1 + localWorkerCnt = 10 // checkFlagIndexInJobArgs is the recoverCheckFlag index used in RecoverTable/RecoverSchema job arg list. checkFlagIndexInJobArgs = 1 @@ -264,16 +265,26 @@ type DDL interface { } type limitJobTask struct { - job *model.Job - err chan error + job *model.Job + // when we combine multiple jobs into one task, + // append the errChs to this slice. + errChs []chan error cacheErr error } +func (t *limitJobTask) NotifyError(err error) { + for _, errCh := range t.errChs { + errCh <- err + } +} + // ddl is used to handle the statements that define the structure or schema of the database. type ddl struct { m sync.RWMutex wg tidbutil.WaitGroupWrapper // It's only used to deal with data race in restart_test. limitJobCh chan *limitJobTask + // limitJobChV2 is used to limit the number of jobs being executed in local worker. + limitJobChV2 chan *limitJobTask *ddlCtx sessPool *sess.Pool @@ -282,8 +293,14 @@ type ddl struct { // used in the concurrency ddl. reorgWorkerPool *workerPool generalDDLWorkerPool *workerPool + localWorkerPool *workerPool // get notification if any DDL coming. ddlJobCh chan struct{} + + // localJobCh is used to delivery job in local TiDB nodes. + localJobCh chan *limitJobTask + // globalIDLocal locks global id to reduce write conflict. + globalIDLock sync.Mutex } // waitSchemaSyncedController is to control whether to waitSchemaSynced or not. @@ -357,16 +374,13 @@ type ddlCtx struct { statsHandle *handle.Handle tableLockCkr util.DeadTableLockChecker etcdCli *clientv3.Client + autoidCli *autoid.ClientDiscover *waitSchemaSyncedController *schemaVersionManager - // recording the running jobs. - runningJobs struct { - sync.RWMutex - ids map[int64]struct{} - } - // It holds the running DDL jobs ID. - runningJobIDs []string + + runningJobs *runningJobs + // reorgCtx is used for reorganization. reorgCtx reorgContexts // backfillCtx is used for backfill workers. @@ -394,20 +408,39 @@ type ddlCtx struct { } } +// the schema synchronization mechanism now requires strict incremental schema versions. +// Therefore, we require a distributed lock to ensure the sequential commit of schema diffs from different TiDB nodes. +type etcdLockInfo struct { + se *concurrency.Session + mu *concurrency.Mutex +} + // schemaVersionManager is used to manage the schema version. To prevent the conflicts on this key between different DDL job, // we use another transaction to update the schema version, so that we need to lock the schema version and unlock it until the job is committed. +// for version2, we use etcd lock to lock the schema version between TiDB nodes now. type schemaVersionManager struct { schemaVersionMu sync.Mutex // lockOwner stores the job ID that is holding the lock. lockOwner atomicutil.Int64 + + ctx context.Context + etcdClient *clientv3.Client + lockInfoMaps map[int64]*etcdLockInfo } -func newSchemaVersionManager() *schemaVersionManager { - return &schemaVersionManager{} +func newSchemaVersionManager(ctx context.Context, etcdClient *clientv3.Client) *schemaVersionManager { + return &schemaVersionManager{ + ctx: ctx, + etcdClient: etcdClient, + lockInfoMaps: make(map[int64]*etcdLockInfo), + } } func (sv *schemaVersionManager) setSchemaVersion(job *model.Job, store kv.Storage) (schemaVersion int64, err error) { - sv.lockSchemaVersion(job.ID) + err = sv.lockSchemaVersion(job.ID) + if err != nil { + return schemaVersion, errors.Trace(err) + } err = kv.RunInNewTxn(kv.WithInternalSourceType(context.Background(), kv.InternalTxnDDL), store, true, func(ctx context.Context, txn kv.Transaction) error { var err error m := meta.NewMeta(txn) @@ -418,20 +451,50 @@ func (sv *schemaVersionManager) setSchemaVersion(job *model.Job, store kv.Storag } // lockSchemaVersion gets the lock to prevent the schema version from being updated. -func (sv *schemaVersionManager) lockSchemaVersion(jobID int64) { +func (sv *schemaVersionManager) lockSchemaVersion(jobID int64) error { ownerID := sv.lockOwner.Load() // There may exist one job update schema version many times in multiple-schema-change, so we do not lock here again // if they are the same job. if ownerID != jobID { sv.schemaVersionMu.Lock() sv.lockOwner.Store(jobID) + if sv.etcdClient != nil && variable.DDLVersion.Load() == model.TiDBDDLV2 { + se, err := concurrency.NewSession(sv.etcdClient) + if err != nil { + return errors.Trace(err) + } + mu := concurrency.NewMutex(se, ddlSchemaVersionKeyLock) + if err := mu.Lock(sv.ctx); err != nil { + return errors.Trace(err) + } + sv.lockInfoMaps[jobID] = &etcdLockInfo{se: se, mu: mu} + } } + return nil } // unlockSchemaVersion releases the lock. func (sv *schemaVersionManager) unlockSchemaVersion(jobID int64) { ownerID := sv.lockOwner.Load() if ownerID == jobID { + if lockInfo, ok := sv.lockInfoMaps[jobID]; ok { + delete(sv.lockInfoMaps, jobID) + err := lockInfo.mu.Unlock(sv.ctx) + outer: + for err != nil { + logutil.BgLogger().Error("unlock schema version", zap.Error(err)) + select { + case <-sv.ctx.Done(): + break outer + case <-time.After(time.Second): + } + // retry unlock + err = lockInfo.mu.Unlock(sv.ctx) + } + if err := lockInfo.se.Close(); err != nil { + logutil.BgLogger().Error("close etcd session", zap.Error(err)) + } + } sv.lockOwner.Store(0) sv.schemaVersionMu.Unlock() } @@ -655,9 +718,9 @@ func newDDL(ctx context.Context, options ...Option) *ddl { infoCache: opt.InfoCache, tableLockCkr: deadLockCkr, etcdCli: opt.EtcdCli, - schemaVersionManager: newSchemaVersionManager(), + autoidCli: opt.AutoIDClient, waitSchemaSyncedController: newWaitSchemaSyncedController(), - runningJobIDs: make([]string, 0, jobRecordCapacity), + runningJobs: newRunningJobs(), } ddlCtx.reorgCtx.reorgCtxMap = make(map[int64]*reorgCtx) ddlCtx.jobCtx.jobCtxMap = make(map[int64]*JobContext) @@ -665,30 +728,33 @@ func newDDL(ctx context.Context, options ...Option) *ddl { ddlCtx.mu.interceptor = &BaseInterceptor{} ctx = kv.WithInternalSourceType(ctx, kv.InternalTxnDDL) ddlCtx.ctx, ddlCtx.cancel = context.WithCancel(ctx) - ddlCtx.runningJobs.ids = make(map[int64]struct{}) + ddlCtx.schemaVersionManager = newSchemaVersionManager(ddlCtx.ctx, opt.EtcdCli) d := &ddl{ ddlCtx: ddlCtx, limitJobCh: make(chan *limitJobTask, batchAddingJobs), + limitJobChV2: make(chan *limitJobTask, batchAddingJobs), enableTiFlashPoll: atomicutil.NewBool(true), ddlJobCh: make(chan struct{}, 100), + localJobCh: make(chan *limitJobTask, 1), } - scheduler.RegisterTaskType(proto.Backfill, - func(ctx context.Context, id string, task *proto.Task, taskTable scheduler.TaskTable) scheduler.Scheduler { - return newBackfillDistScheduler(ctx, id, task, taskTable, d) - }, scheduler.WithSummary, + taskexecutor.RegisterTaskType(proto.Backfill, + func(ctx context.Context, id string, task *proto.Task, taskTable taskexecutor.TaskTable) taskexecutor.TaskExecutor { + return newBackfillDistExecutor(ctx, id, task, taskTable, d) + }, taskexecutor.WithSummary, ) - dispatcher.RegisterDispatcherFactory(proto.Backfill, - func(ctx context.Context, taskMgr dispatcher.TaskManager, serverID string, task *proto.Task) dispatcher.Dispatcher { - return newLitBackfillDispatcher(ctx, d, taskMgr, serverID, task) + scheduler.RegisterSchedulerFactory(proto.Backfill, + func(ctx context.Context, task *proto.Task, param scheduler.Param) scheduler.Scheduler { + return newLitBackfillScheduler(ctx, d, task, param) }) - dispatcher.RegisterDispatcherCleanUpFactory(proto.Backfill, newBackfillCleanUpS3) + scheduler.RegisterSchedulerCleanUpFactory(proto.Backfill, newBackfillCleanUpS3) // Register functions for enable/disable ddl when changing system variable `tidb_enable_ddl`. variable.EnableDDL = d.EnableDDL variable.DisableDDL = d.DisableDDL variable.SwitchMDL = d.SwitchMDL + variable.SwitchDDLVersion = d.SwitchDDLVersion return d } @@ -732,21 +798,30 @@ func (d *ddl) prepareWorkers4ConcurrencyDDL() { } // reorg worker count at least 1 at most 10. reorgCnt := min(max(runtime.GOMAXPROCS(0)/4, 1), reorgWorkerCnt) - d.reorgWorkerPool = newDDLWorkerPool(pools.NewResourcePool(workerFactory(addIdxWorker), reorgCnt, reorgCnt, 0), reorg) - d.generalDDLWorkerPool = newDDLWorkerPool(pools.NewResourcePool(workerFactory(generalWorker), generalWorkerCnt, generalWorkerCnt, 0), general) + // local worker count at least 2 at most 10. + localCnt := min(max(runtime.GOMAXPROCS(0)/4, 2), localWorkerCnt) + d.reorgWorkerPool = newDDLWorkerPool(pools.NewResourcePool(workerFactory(addIdxWorker), reorgCnt, reorgCnt, 0), jobTypeReorg) + d.generalDDLWorkerPool = newDDLWorkerPool(pools.NewResourcePool(workerFactory(generalWorker), generalWorkerCnt, generalWorkerCnt, 0), jobTypeGeneral) + d.localWorkerPool = newDDLWorkerPool(pools.NewResourcePool(workerFactory(localWorker), localCnt, localCnt, 0), jobTypeLocal) failpoint.Inject("NoDDLDispatchLoop", func(val failpoint.Value) { if val.(bool) { failpoint.Return() } }) d.wg.Run(d.startDispatchLoop) + d.wg.Run(d.startLocalWorkerLoop) } // Start implements DDL.Start interface. func (d *ddl) Start(ctxPool *pools.ResourcePool) error { logutil.BgLogger().Info("start DDL", zap.String("category", "ddl"), zap.String("ID", d.uuid), zap.Bool("runWorker", config.GetGlobalConfig().Instance.TiDBEnableDDL.Load())) - d.wg.Run(d.limitDDLJobs) + d.wg.Run(func() { + d.limitDDLJobs(d.limitJobCh, d.addBatchDDLJobsV1) + }) + d.wg.Run(func() { + d.limitDDLJobs(d.limitJobChV2, d.addBatchDDLJobsV2) + }) d.sessPool = sess.NewSessionPool(ctxPool, d.store) d.ownerManager.SetBeOwnerHook(func() { var err error @@ -794,6 +869,12 @@ func (d *ddl) Start(ctxPool *pools.ResourcePool) error { defer d.sessPool.Put(ctx) ingest.InitGlobalLightningEnv() + d.ownerManager.SetRetireOwnerHook(func() { + // Since this instance is not DDL owner anymore, we clean up the processing job info. + if ingest.LitBackCtxMgr != nil { + ingest.LitBackCtxMgr.MarkJobFinish() + } + }) return nil } @@ -856,6 +937,9 @@ func (d *ddl) close() { if d.generalDDLWorkerPool != nil { d.generalDDLWorkerPool.close() } + if d.localWorkerPool != nil { + d.localWorkerPool.close() + } // d.delRangeMgr using sessions from d.sessPool. // Put it before d.sessPool.close to reduce the time spent by d.sessPool.close. @@ -890,6 +974,9 @@ func (d *ddl) GetInfoSchemaWithInterceptor(ctx sessionctx.Context) infoschema.In func (d *ddl) genGlobalIDs(count int) ([]int64, error) { var ret []int64 ctx := kv.WithInternalSourceType(context.Background(), kv.InternalTxnDDL) + // lock to reduce conflict + d.globalIDLock.Lock() + defer d.globalIDLock.Unlock() err := kv.RunInNewTxn(ctx, d.store, true, func(ctx context.Context, txn kv.Transaction) error { failpoint.Inject("mockGenGlobalIDFail", func(val failpoint.Value) { if val.(bool) { @@ -1019,6 +1106,38 @@ func setDDLJobQuery(ctx sessionctx.Context, job *model.Job) { } } +func setDDLJobMode(job *model.Job) { + if variable.DDLVersion.Load() != model.TiDBDDLV2 { + job.LocalMode = false + return + } + + switch job.Type { + // currently, v2 only support CreateTable without foreign keys. + case model.ActionCreateTable: + tbInfo, ok := job.Args[0].(*model.TableInfo) + if ok && len(tbInfo.ForeignKeys) == 0 { + job.LocalMode = true + return + } + default: + } + job.LocalMode = false +} + +func (d *ddl) deliverJobTask(task *limitJobTask) { + if task.job.LocalMode { + d.limitJobChV2 <- task + } else { + d.limitJobCh <- task + } +} + +func (*ddl) shouldCheckHistoryJob(job *model.Job) bool { + // for local mode job, we add the history job directly now, so no need to check it. + return !job.LocalMode +} + // DoDDLJob will return // - nil: found in history DDL job and no job error // - context.Cancel: job has been sent to worker, but not found in history DDL job before cancel @@ -1035,23 +1154,24 @@ func (d *ddl) DoDDLJob(ctx sessionctx.Context, job *model.Job) error { } // Get a global job ID and put the DDL job in the queue. setDDLJobQuery(ctx, job) - task := &limitJobTask{job, make(chan error), nil} - d.limitJobCh <- task + setDDLJobMode(job) + task := &limitJobTask{job, []chan error{make(chan error)}, nil} + d.deliverJobTask(task) failpoint.Inject("mockParallelSameDDLJobTwice", func(val failpoint.Value) { if val.(bool) { - <-task.err + <-task.errChs[0] // The same job will be put to the DDL queue twice. job = job.Clone() - task1 := &limitJobTask{job, make(chan error), nil} - d.limitJobCh <- task1 + task1 := &limitJobTask{job, []chan error{make(chan error)}, nil} + d.deliverJobTask(task1) // The second job result is used for test. task = task1 } }) // worker should restart to continue handling tasks in limitJobCh, and send back through task.err - err := <-task.err + err := <-task.errChs[0] if err != nil { // The transaction of enqueuing job is failed. return errors.Trace(err) @@ -1063,6 +1183,9 @@ func (d *ddl) DoDDLJob(ctx sessionctx.Context, job *model.Job) error { // Notice worker that we push a new job and wait the job done. d.asyncNotifyWorker(d.ddlJobCh, addingDDLJobConcurrent, job.ID, job.Type.String()) logutil.BgLogger().Info("start DDL job", zap.String("category", "ddl"), zap.String("job", job.String()), zap.String("query", job.Query)) + if !d.shouldCheckHistoryJob(job) { + return nil + } var historyJob *model.Job jobID := job.ID @@ -1287,6 +1410,106 @@ func (d *ddl) SwitchMDL(enable bool) error { return nil } +// SwitchDDLVersion switch ddl version. +func (d *ddl) SwitchDDLVersion(version int64) error { + oldVersion := variable.DDLVersion.Load() + if oldVersion == version { + return nil + } + ctx, cancel := context.WithTimeout(context.Background(), time.Second*30) + defer cancel() + + // Check if there is any DDL running. + // This check can not cover every corner cases, so users need to guarantee that there is no DDL running by themselves. + sessCtx, err := d.sessPool.Get() + if err != nil { + return errors.Trace(err) + } + defer d.sessPool.Put(sessCtx) + se := sess.NewSession(sessCtx) + rows, err := se.Execute(ctx, "select 1 from mysql.tidb_ddl_job", "check job") + if err != nil { + return errors.Trace(err) + } + if len(rows) != 0 { + return errors.New("please wait for all jobs done") + } + + if err := d.migration2DDLVersion(version); err != nil { + return errors.Trace(err) + } + + variable.DDLVersion.Store(version) + logutil.BgLogger().Info("switch ddl version", zap.String("category", "ddl"), zap.Int64("version", version)) + return nil +} + +// migration2DDLV1 migration ddl version to v1. +func (*ddl) migration2DDLV1(m *meta.Meta) error { + ddlV2Initialized, err := m.GetDDLV2Initialized() + if err != nil { + return errors.Trace(err) + } + if !ddlV2Initialized { + return nil + } + // clear all table names when we switch to v1. + if err := m.ClearAllTableNames(); err != nil { + return errors.Trace(err) + } + return errors.Trace(m.SetDDLV2Initialized(false)) +} + +// migration2DDLV2 migration ddl version to v2. +func (*ddl) migration2DDLV2(m *meta.Meta) error { + ddlV2Initialized, err := m.GetDDLV2Initialized() + if err != nil { + return errors.Trace(err) + } + if ddlV2Initialized { + return nil + } + + if err := m.ClearAllTableNames(); err != nil { + return errors.Trace(err) + } + + dbs, err := m.ListDatabases() + if err != nil { + return errors.Trace(err) + } + + for _, dbInfo := range dbs { + tables, err := m.ListTables(dbInfo.ID) + if err != nil { + return errors.Trace(err) + } + for _, tableInfo := range tables { + if err := m.CreateTableName(dbInfo.Name.L, tableInfo.Name.L, tableInfo.ID); err != nil { + return errors.Trace(err) + } + } + } + + return errors.Trace(m.SetDDLV2Initialized(true)) +} + +func (d *ddl) migration2DDLVersion(ver int64) (err error) { + return kv.RunInNewTxn(kv.WithInternalSourceType(d.ctx, kv.InternalTxnDDL), d.store, true, func(ctx context.Context, txn kv.Transaction) error { + m := meta.NewMeta(txn) + + switch ver { + case model.TiDBDDLV1, 0: + err = d.migration2DDLV1(m) + case model.TiDBDDLV2: + err = d.migration2DDLV2(m) + default: + err = errors.Errorf("unknown ddl version %d", ver) + } + return errors.Trace(err) + }) +} + // RecoverInfo contains information needed by DDL.RecoverTable. type RecoverInfo struct { SchemaID int64 @@ -1694,41 +1917,6 @@ func GetAllDDLJobs(se sessionctx.Context) ([]*model.Job, error) { return getJobsBySQL(sess.NewSession(se), JobTable, "1 order by job_id") } -// DefNumHistoryJobs is default value of the default number of history job -const DefNumHistoryJobs = 10 - -const batchNumHistoryJobs = 128 - -// GetLastNHistoryDDLJobs returns the DDL history jobs and an error. -// The maximum count of history jobs is num. -func GetLastNHistoryDDLJobs(t *meta.Meta, maxNumJobs int) ([]*model.Job, error) { - iterator, err := GetLastHistoryDDLJobsIterator(t) - if err != nil { - return nil, errors.Trace(err) - } - return iterator.GetLastJobs(maxNumJobs, nil) -} - -// IterHistoryDDLJobs iterates history DDL jobs until the `finishFn` return true or error. -func IterHistoryDDLJobs(txn kv.Transaction, finishFn func([]*model.Job) (bool, error)) error { - txnMeta := meta.NewMeta(txn) - iter, err := GetLastHistoryDDLJobsIterator(txnMeta) - if err != nil { - return err - } - cacheJobs := make([]*model.Job, 0, DefNumHistoryJobs) - for { - cacheJobs, err = iter.GetLastJobs(DefNumHistoryJobs, cacheJobs) - if err != nil || len(cacheJobs) == 0 { - return err - } - finish, err := finishFn(cacheJobs) - if err != nil || finish { - return err - } - } -} - // IterAllDDLJobs will iterates running DDL jobs first, return directly if `finishFn` return true or error, // then iterates history DDL jobs until the `finishFn` return true or error. func IterAllDDLJobs(ctx sessionctx.Context, txn kv.Transaction, finishFn func([]*model.Job) (bool, error)) error { @@ -1743,97 +1931,3 @@ func IterAllDDLJobs(ctx sessionctx.Context, txn kv.Transaction, finishFn func([] } return IterHistoryDDLJobs(txn, finishFn) } - -// GetLastHistoryDDLJobsIterator gets latest N history DDL jobs iterator. -func GetLastHistoryDDLJobsIterator(m *meta.Meta) (meta.LastJobIterator, error) { - return m.GetLastHistoryDDLJobsIterator() -} - -// GetAllHistoryDDLJobs get all the done DDL jobs. -func GetAllHistoryDDLJobs(m *meta.Meta) ([]*model.Job, error) { - iterator, err := GetLastHistoryDDLJobsIterator(m) - if err != nil { - return nil, errors.Trace(err) - } - allJobs := make([]*model.Job, 0, batchNumHistoryJobs) - for { - jobs, err := iterator.GetLastJobs(batchNumHistoryJobs, nil) - if err != nil { - return nil, errors.Trace(err) - } - allJobs = append(allJobs, jobs...) - if len(jobs) < batchNumHistoryJobs { - break - } - } - // sort job. - slices.SortFunc(allJobs, func(i, j *model.Job) int { - return cmp.Compare(i.ID, j.ID) - }) - return allJobs, nil -} - -// ScanHistoryDDLJobs get some of the done DDL jobs. -// When the DDL history is quite large, GetAllHistoryDDLJobs() API can't work well, because it makes the server OOM. -// The result is in descending order by job ID. -func ScanHistoryDDLJobs(m *meta.Meta, startJobID int64, limit int) ([]*model.Job, error) { - var iter meta.LastJobIterator - var err error - if startJobID == 0 { - iter, err = m.GetLastHistoryDDLJobsIterator() - } else { - if limit == 0 { - return nil, errors.New("when 'start_job_id' is specified, it must work with a 'limit'") - } - iter, err = m.GetHistoryDDLJobsIterator(startJobID) - } - if err != nil { - return nil, errors.Trace(err) - } - return iter.GetLastJobs(limit, nil) -} - -// GetHistoryJobByID return history DDL job by ID. -func GetHistoryJobByID(sess sessionctx.Context, id int64) (*model.Job, error) { - err := sessiontxn.NewTxn(context.Background(), sess) - if err != nil { - return nil, err - } - defer func() { - // we can ignore the commit error because this txn is readonly. - _ = sess.CommitTxn(context.Background()) - }() - txn, err := sess.Txn(true) - if err != nil { - return nil, err - } - t := meta.NewMeta(txn) - job, err := t.GetHistoryDDLJob(id) - return job, errors.Trace(err) -} - -// AddHistoryDDLJob record the history job. -func AddHistoryDDLJob(sess *sess.Session, t *meta.Meta, job *model.Job, updateRawArgs bool) error { - err := addHistoryDDLJob2Table(sess, job, updateRawArgs) - if err != nil { - logutil.BgLogger().Info("failed to add DDL job to history table", zap.String("category", "ddl"), zap.Error(err)) - } - // we always add history DDL job to job list at this moment. - return t.AddHistoryDDLJob(job, updateRawArgs) -} - -// addHistoryDDLJob2Table adds DDL job to history table. -func addHistoryDDLJob2Table(sess *sess.Session, job *model.Job, updateRawArgs bool) error { - b, err := job.Encode(updateRawArgs) - if err != nil { - return err - } - _, err = sess.Execute(context.Background(), - fmt.Sprintf("insert ignore into mysql.tidb_ddl_history(job_id, job_meta, db_name, table_name, schema_ids, table_ids, create_time) values (%d, %s, %s, %s, %s, %s, %v)", - job.ID, util.WrapKey2String(b), strconv.Quote(job.SchemaName), strconv.Quote(job.TableName), - strconv.Quote(strconv.FormatInt(job.SchemaID, 10)), - strconv.Quote(strconv.FormatInt(job.TableID, 10)), - strconv.Quote(model.TSConvert2Time(job.StartTS).String())), - "insert_history") - return errors.Trace(err) -} diff --git a/pkg/ddl/ddl_api.go b/pkg/ddl/ddl_api.go index 0c7738b6b0a21..2874fa2217608 100644 --- a/pkg/ddl/ddl_api.go +++ b/pkg/ddl/ddl_api.go @@ -40,6 +40,7 @@ import ( "github.com/pingcap/tidb/pkg/expression" "github.com/pingcap/tidb/pkg/infoschema" "github.com/pingcap/tidb/pkg/kv" + "github.com/pingcap/tidb/pkg/meta" "github.com/pingcap/tidb/pkg/meta/autoid" "github.com/pingcap/tidb/pkg/parser" "github.com/pingcap/tidb/pkg/parser/ast" @@ -181,6 +182,7 @@ func (d *ddl) CreateSchemaWithInfo( is := d.GetInfoSchemaWithInterceptor(ctx) _, ok := is.SchemaByName(dbInfo.Name) if ok { + // since this error may be seen as error, keep it stack info. err := infoschema.ErrDatabaseExists.GenWithStackByArgs(dbInfo.Name) switch onExist { case OnExistIgnore: @@ -212,11 +214,12 @@ func (d *ddl) CreateSchemaWithInfo( dbInfo.ID = genIDs[0] job := &model.Job{ - SchemaID: dbInfo.ID, - SchemaName: dbInfo.Name.L, - Type: model.ActionCreateSchema, - BinlogInfo: &model.HistoryInfo{}, - Args: []interface{}{dbInfo}, + SchemaID: dbInfo.ID, + SchemaName: dbInfo.Name.L, + Type: model.ActionCreateSchema, + BinlogInfo: &model.HistoryInfo{}, + Args: []interface{}{dbInfo}, + CDCWriteSource: ctx.GetSessionVars().CDCWriteSource, } err = d.DoDDLJob(ctx, job) @@ -249,11 +252,12 @@ func (d *ddl) ModifySchemaCharsetAndCollate(ctx sessionctx.Context, stmt *ast.Al } // Do the DDL job. job := &model.Job{ - SchemaID: dbInfo.ID, - SchemaName: dbInfo.Name.L, - Type: model.ActionModifySchemaCharsetAndCollate, - BinlogInfo: &model.HistoryInfo{}, - Args: []interface{}{toCharset, toCollate}, + SchemaID: dbInfo.ID, + SchemaName: dbInfo.Name.L, + Type: model.ActionModifySchemaCharsetAndCollate, + BinlogInfo: &model.HistoryInfo{}, + Args: []interface{}{toCharset, toCollate}, + CDCWriteSource: ctx.GetSessionVars().CDCWriteSource, } err = d.DoDDLJob(ctx, job) err = d.callHookOnChanged(job, err) @@ -279,11 +283,12 @@ func (d *ddl) ModifySchemaDefaultPlacement(ctx sessionctx.Context, stmt *ast.Alt // Do the DDL job. job := &model.Job{ - SchemaID: dbInfo.ID, - SchemaName: dbInfo.Name.L, - Type: model.ActionModifySchemaDefaultPlacement, - BinlogInfo: &model.HistoryInfo{}, - Args: []interface{}{placementPolicyRef}, + SchemaID: dbInfo.ID, + SchemaName: dbInfo.Name.L, + Type: model.ActionModifySchemaDefaultPlacement, + BinlogInfo: &model.HistoryInfo{}, + Args: []interface{}{placementPolicyRef}, + CDCWriteSource: ctx.GetSessionVars().CDCWriteSource, } err = d.DoDDLJob(ctx, job) err = d.callHookOnChanged(job, err) @@ -436,12 +441,13 @@ func (d *ddl) ModifySchemaSetTiFlashReplica(sctx sessionctx.Context, stmt *ast.A } job := &model.Job{ - SchemaID: dbInfo.ID, - SchemaName: dbInfo.Name.L, - TableID: tbl.ID, - Type: model.ActionSetTiFlashReplica, - BinlogInfo: &model.HistoryInfo{}, - Args: []interface{}{*tiflashReplica}, + SchemaID: dbInfo.ID, + SchemaName: dbInfo.Name.L, + TableID: tbl.ID, + Type: model.ActionSetTiFlashReplica, + BinlogInfo: &model.HistoryInfo{}, + Args: []interface{}{*tiflashReplica}, + CDCWriteSource: sctx.GetSessionVars().CDCWriteSource, } err := d.DoDDLJob(sctx, job) err = d.callHookOnChanged(job, err) @@ -479,7 +485,8 @@ func (d *ddl) AlterTablePlacement(ctx sessionctx.Context, ident ast.Ident, place return nil } - if tb.Meta().TempTableType != model.TempTableNone { + tblInfo := tb.Meta() + if tblInfo.TempTableType != model.TempTableNone { return errors.Trace(dbterror.ErrOptOnTemporaryTable.GenWithStackByArgs("placement")) } @@ -489,13 +496,14 @@ func (d *ddl) AlterTablePlacement(ctx sessionctx.Context, ident ast.Ident, place } job := &model.Job{ - SchemaID: schema.ID, - TableID: tb.Meta().ID, - SchemaName: schema.Name.L, - TableName: tb.Meta().Name.L, - Type: model.ActionAlterTablePlacement, - BinlogInfo: &model.HistoryInfo{}, - Args: []interface{}{placementPolicyRef}, + SchemaID: schema.ID, + TableID: tblInfo.ID, + SchemaName: schema.Name.L, + TableName: tblInfo.Name.L, + Type: model.ActionAlterTablePlacement, + BinlogInfo: &model.HistoryInfo{}, + CDCWriteSource: ctx.GetSessionVars().CDCWriteSource, + Args: []interface{}{placementPolicyRef}, } err = d.DoDDLJob(ctx, job) @@ -615,12 +623,13 @@ func (d *ddl) DropSchema(ctx sessionctx.Context, stmt *ast.DropDatabaseStmt) (er return err } job := &model.Job{ - SchemaID: old.ID, - SchemaName: old.Name.L, - SchemaState: old.State, - Type: model.ActionDropSchema, - BinlogInfo: &model.HistoryInfo{}, - Args: []interface{}{fkCheck}, + SchemaID: old.ID, + SchemaName: old.Name.L, + SchemaState: old.State, + Type: model.ActionDropSchema, + BinlogInfo: &model.HistoryInfo{}, + Args: []interface{}{fkCheck}, + CDCWriteSource: ctx.GetSessionVars().CDCWriteSource, } err = d.DoDDLJob(ctx, job) @@ -652,9 +661,14 @@ func (d *ddl) DropSchema(ctx sessionctx.Context, stmt *ast.DropDatabaseStmt) (er func (d *ddl) RecoverSchema(ctx sessionctx.Context, recoverSchemaInfo *RecoverSchemaInfo) error { recoverSchemaInfo.State = model.StateNone job := &model.Job{ - Type: model.ActionRecoverSchema, - BinlogInfo: &model.HistoryInfo{}, - Args: []interface{}{recoverSchemaInfo, recoverCheckFlagNone}, + Type: model.ActionRecoverSchema, + BinlogInfo: &model.HistoryInfo{}, + CDCWriteSource: ctx.GetSessionVars().CDCWriteSource, + Args: []interface{}{recoverSchemaInfo, recoverCheckFlagNone}, + InvolvingSchemaInfo: []model.InvolvingSchemaInfo{{ + Database: recoverSchemaInfo.Name.L, + Table: model.InvolvingAll, + }}, } err := d.DoDDLJob(ctx, job) err = d.callHookOnChanged(job, err) @@ -775,13 +789,13 @@ func buildColumnsAndConstraints( // No warning for BOOL-like tinyint(1) if colDef.Tp.GetFlen() != types.UnspecifiedLength && colDef.Tp.GetFlen() != 1 { ctx.GetSessionVars().StmtCtx.AppendWarning( - dbterror.ErrWarnDeprecatedIntegerDisplayWidth.GenWithStackByArgs(), + dbterror.ErrWarnDeprecatedIntegerDisplayWidth.FastGenByArgs(), ) } case mysql.TypeShort, mysql.TypeInt24, mysql.TypeLong, mysql.TypeLonglong: if colDef.Tp.GetFlen() != types.UnspecifiedLength { ctx.GetSessionVars().StmtCtx.AppendWarning( - dbterror.ErrWarnDeprecatedIntegerDisplayWidth.GenWithStackByArgs(), + dbterror.ErrWarnDeprecatedIntegerDisplayWidth.FastGenByArgs(), ) } } @@ -793,7 +807,7 @@ func buildColumnsAndConstraints( col.State = model.StatePublic if mysql.HasZerofillFlag(col.GetFlag()) { ctx.GetSessionVars().StmtCtx.AppendWarning( - dbterror.ErrWarnDeprecatedZerofill.GenWithStackByArgs(), + dbterror.ErrWarnDeprecatedZerofill.FastGenByArgs(), ) } constraints = append(constraints, cts...) @@ -1009,7 +1023,7 @@ func checkColumnDefaultValue(ctx sessionctx.Context, col *table.Column, value in value = `null` } sc := ctx.GetSessionVars().StmtCtx - sc.AppendWarning(dbterror.ErrBlobCantHaveDefault.GenWithStackByArgs(col.Name.O)) + sc.AppendWarning(dbterror.ErrBlobCantHaveDefault.FastGenByArgs(col.Name.O)) return hasDefaultValue, value, nil } // In strict SQL mode or default value is not an empty string. @@ -1223,10 +1237,10 @@ func columnDefToCol(ctx sessionctx.Context, offset int, colDef *ast.ColumnDef, o col.FieldType.SetCollate(v.StrValue) } case ast.ColumnOptionFulltext: - ctx.GetSessionVars().StmtCtx.AppendWarning(dbterror.ErrTableCantHandleFt.GenWithStackByArgs()) + ctx.GetSessionVars().StmtCtx.AppendWarning(dbterror.ErrTableCantHandleFt.FastGenByArgs()) case ast.ColumnOptionCheck: if !variable.EnableCheckConstraint.Load() { - ctx.GetSessionVars().StmtCtx.AppendWarning(errors.New("the switch of check constraint is off")) + ctx.GetSessionVars().StmtCtx.AppendWarning(errors.NewNoStackError("the switch of check constraint is off")) } else { // Check the column CHECK constraint dependency lazily, after fill all the name. // Extract column constraint from column option. @@ -1274,7 +1288,7 @@ func getFuncCallDefaultValue(col *table.Column, option *ast.ColumnOption, expr * return nil, false, errors.Trace(err) } return str, true, nil - case ast.Rand, ast.UUID: + case ast.Rand, ast.UUID, ast.UUIDToBin: if err := expression.VerifyArgsWrapper(expr.FnName.L, len(expr.Args)); err != nil { return nil, false, errors.Trace(err) } @@ -1922,7 +1936,7 @@ func setTableAutoRandomBits(ctx sessionctx.Context, tbInfo *model.TableInfo, col return dbterror.ErrInvalidAutoRandom.FastGenByArgs(autoid.AutoRandomIncrementalBitsTooSmall) } msg := fmt.Sprintf(autoid.AutoRandomAvailableAllocTimesNote, shardFmt.IncrementalBitsCapacity()) - ctx.GetSessionVars().StmtCtx.AppendNote(errors.Errorf(msg)) + ctx.GetSessionVars().StmtCtx.AppendNote(errors.NewNoStackError(msg)) } } return nil @@ -2033,7 +2047,7 @@ func BuildTableInfo( } if constr.Tp == ast.ConstraintFulltext { - ctx.GetSessionVars().StmtCtx.AppendWarning(dbterror.ErrTableCantHandleFt.GenWithStackByArgs()) + ctx.GetSessionVars().StmtCtx.AppendWarning(dbterror.ErrTableCantHandleFt.FastGenByArgs()) continue } @@ -2055,7 +2069,7 @@ func BuildTableInfo( // check constraint if constr.Tp == ast.ConstraintCheck { if !variable.EnableCheckConstraint.Load() { - ctx.GetSessionVars().StmtCtx.AppendWarning(errors.New("the switch of check constraint is off")) + ctx.GetSessionVars().StmtCtx.AppendWarning(errors.NewNoStackError("the switch of check constraint is off")) continue } // Since column check constraint dependency has been done in columnDefToCol. @@ -2663,13 +2677,14 @@ func (d *ddl) createTableWithInfoJob( } job = &model.Job{ - SchemaID: schema.ID, - TableID: tbInfo.ID, - SchemaName: schema.Name.L, - TableName: tbInfo.Name.L, - Type: actionType, - BinlogInfo: &model.HistoryInfo{}, - Args: args, + SchemaID: schema.ID, + TableID: tbInfo.ID, + SchemaName: schema.Name.L, + TableName: tbInfo.Name.L, + Type: actionType, + BinlogInfo: &model.HistoryInfo{}, + Args: args, + CDCWriteSource: ctx.GetSessionVars().CDCWriteSource, } return job, nil } @@ -2759,7 +2774,8 @@ func (d *ddl) BatchCreateTableWithInfo(ctx sessionctx.Context, c := GetCreateTableWithInfoConfig(cs) jobs := &model.Job{ - BinlogInfo: &model.HistoryInfo{}, + BinlogInfo: &model.HistoryInfo{}, + CDCWriteSource: ctx.GetSessionVars().CDCWriteSource, } args := make([]*model.TableInfo, 0, len(infos)) @@ -2828,6 +2844,11 @@ func (d *ddl) BatchCreateTableWithInfo(ctx sessionctx.Context, return errors.Trace(fmt.Errorf("except table info")) } args = append(args, info) + jobs.InvolvingSchemaInfo = append(jobs.InvolvingSchemaInfo, + model.InvolvingSchemaInfo{ + Database: dbName.L, + Table: info.Name.L, + }) } if len(args) == 0 { return nil @@ -2854,6 +2875,55 @@ func (d *ddl) BatchCreateTableWithInfo(ctx sessionctx.Context, return nil } +// BatchCreateTableWithJobs combine CreateTableJobs to BatchCreateTableJob. +func (*ddl) BatchCreateTableWithJobs(jobs []*model.Job) (*model.Job, error) { + if len(jobs) == 0 { + return nil, errors.Trace(fmt.Errorf("expect non-empty jobs")) + } + + var combinedJob *model.Job + + args := make([]*model.TableInfo, 0, len(jobs)) + involvingSchemaInfo := make([]model.InvolvingSchemaInfo, 0, len(jobs)) + var foreignKeyChecks bool + + // if there is any duplicated table name + duplication := make(map[string]struct{}) + for _, job := range jobs { + if combinedJob == nil { + combinedJob = job.Clone() + combinedJob.Type = model.ActionCreateTables + combinedJob.Args = combinedJob.Args[:0] + foreignKeyChecks = job.Args[1].(bool) + } + // append table job args + info, ok := job.Args[0].(*model.TableInfo) + if !ok { + return nil, errors.Trace(fmt.Errorf("expect model.TableInfo, but got %T", job.Args[0])) + } + args = append(args, info) + + if _, ok := duplication[info.Name.L]; ok { + // return err even if create table if not exists + return nil, infoschema.ErrTableExists.FastGenByArgs("can not batch create tables with same name") + } + + duplication[info.Name.L] = struct{}{} + + involvingSchemaInfo = append(involvingSchemaInfo, + model.InvolvingSchemaInfo{ + Database: job.SchemaName, + Table: info.Name.L, + }) + } + + combinedJob.Args = append(combinedJob.Args, args) + combinedJob.Args = append(combinedJob.Args, foreignKeyChecks) + combinedJob.InvolvingSchemaInfo = involvingSchemaInfo + + return combinedJob, nil +} + func (d *ddl) CreatePlacementPolicyWithInfo(ctx sessionctx.Context, policy *model.PolicyInfo, onExist OnExist) error { if checkIgnorePlacementDDL(ctx) { return nil @@ -2892,6 +2962,12 @@ func (d *ddl) CreatePlacementPolicyWithInfo(ctx sessionctx.Context, policy *mode Type: model.ActionCreatePlacementPolicy, BinlogInfo: &model.HistoryInfo{}, Args: []interface{}{policy, onExist == OnExistReplace}, + // CREATE PLACEMENT does not affect any schemas or tables. + InvolvingSchemaInfo: []model.InvolvingSchemaInfo{{ + Database: model.InvolvingNone, + Table: model.InvolvingNone, + }}, + CDCWriteSource: ctx.GetSessionVars().CDCWriteSource, } err = d.DoDDLJob(ctx, job) err = d.callHookOnChanged(job, err) @@ -2938,7 +3014,7 @@ func (d *ddl) FlashbackCluster(ctx sessionctx.Context, flashbackTS uint64) error } gap := time.Until(oracle.GetTimeFromTS(nowTS)).Abs() if gap > 1*time.Second { - ctx.GetSessionVars().StmtCtx.AppendWarning(errors.Errorf("Gap between local time and PD TSO is %s, please check PD/system time", gap)) + ctx.GetSessionVars().StmtCtx.AppendWarning(errors.NewNoStackErrorf("Gap between local time and PD TSO is %s, please check PD/system time", gap)) } job := &model.Job{ Type: model.ActionFlashbackCluster, @@ -2955,6 +3031,12 @@ func (d *ddl) FlashbackCluster(ctx sessionctx.Context, flashbackTS uint64) error 0, /* commitTS */ variable.On, /* tidb_ttl_job_enable */ []kv.KeyRange{} /* flashback key_ranges */}, + CDCWriteSource: ctx.GetSessionVars().CDCWriteSource, + // FLASHBACK CLUSTER affects all schemas and tables. + InvolvingSchemaInfo: []model.InvolvingSchemaInfo{{ + Database: model.InvolvingAll, + Table: model.InvolvingAll, + }}, } err = d.DoDDLJob(ctx, job) err = d.callHookOnChanged(job, err) @@ -2983,9 +3065,10 @@ func (d *ddl) RecoverTable(ctx sessionctx.Context, recoverInfo *RecoverInfo) (er SchemaName: schema.Name.L, TableName: tbInfo.Name.L, - Type: model.ActionRecoverTable, - BinlogInfo: &model.HistoryInfo{}, - Args: []interface{}{recoverInfo, recoverCheckFlagNone}, + Type: model.ActionRecoverTable, + BinlogInfo: &model.HistoryInfo{}, + Args: []interface{}{recoverInfo, recoverCheckFlagNone}, + CDCWriteSource: ctx.GetSessionVars().CDCWriteSource, } err = d.DoDDLJob(ctx, job) err = d.callHookOnChanged(job, err) @@ -3729,7 +3812,7 @@ func (d *ddl) AlterTable(ctx context.Context, sctx sessionctx.Context, stmt *ast sctx.GetSessionVars().StmtCtx.AppendWarning(dbterror.ErrTableCantHandleFt) case ast.ConstraintCheck: if !variable.EnableCheckConstraint.Load() { - sctx.GetSessionVars().StmtCtx.AppendWarning(errors.New("the switch of check constraint is off")) + sctx.GetSessionVars().StmtCtx.AppendWarning(errors.NewNoStackError("the switch of check constraint is off")) } else { err = d.CreateCheckConstraint(sctx, ident, model.NewCIStr(constr.Name), spec.Constraint) } @@ -3830,13 +3913,13 @@ func (d *ddl) AlterTable(ctx context.Context, sctx sessionctx.Context, stmt *ast err = d.AlterIndexVisibility(sctx, ident, spec.IndexName, spec.Visibility) case ast.AlterTableAlterCheck: if !variable.EnableCheckConstraint.Load() { - sctx.GetSessionVars().StmtCtx.AppendWarning(errors.New("the switch of check constraint is off")) + sctx.GetSessionVars().StmtCtx.AppendWarning(errors.NewNoStackError("the switch of check constraint is off")) } else { err = d.AlterCheckConstraint(sctx, ident, model.NewCIStr(spec.Constraint.Name), spec.Constraint.Enforced) } case ast.AlterTableDropCheck: if !variable.EnableCheckConstraint.Load() { - sctx.GetSessionVars().StmtCtx.AppendWarning(errors.New("the switch of check constraint is off")) + sctx.GetSessionVars().StmtCtx.AppendWarning(errors.NewNoStackError("the switch of check constraint is off")) } else { err = d.DropCheckConstraint(sctx, ident, model.NewCIStr(spec.Constraint.Name)) } @@ -3888,10 +3971,10 @@ func (d *ddl) RebaseAutoID(ctx sessionctx.Context, ident ast.Ident, newBase int6 if err != nil { return errors.Trace(err) } + tbInfo := t.Meta() var actionType model.ActionType switch tp { case autoid.AutoRandomType: - tbInfo := t.Meta() pkCol := tbInfo.GetPkColInfo() if tbInfo.AutoRandomBits == 0 || pkCol == nil { return errors.Trace(dbterror.ErrInvalidAutoRandom.GenWithStackByArgs(autoid.AutoRandomRebaseNotApplicable)) @@ -3917,20 +4000,21 @@ func (d *ddl) RebaseAutoID(ctx sessionctx.Context, ident ast.Ident, newBase int6 } if newBase != newBaseTemp { ctx.GetSessionVars().StmtCtx.AppendWarning( - fmt.Errorf("Can't reset AUTO_INCREMENT to %d without FORCE option, using %d instead", + errors.NewNoStackErrorf("Can't reset AUTO_INCREMENT to %d without FORCE option, using %d instead", newBase, newBaseTemp, )) } newBase = newBaseTemp } job := &model.Job{ - SchemaID: schema.ID, - TableID: t.Meta().ID, - SchemaName: schema.Name.L, - TableName: t.Meta().Name.L, - Type: actionType, - BinlogInfo: &model.HistoryInfo{}, - Args: []interface{}{newBase, force}, + SchemaID: schema.ID, + TableID: tbInfo.ID, + SchemaName: schema.Name.L, + TableName: tbInfo.Name.L, + Type: actionType, + BinlogInfo: &model.HistoryInfo{}, + Args: []interface{}{newBase, force}, + CDCWriteSource: ctx.GetSessionVars().CDCWriteSource, } err = d.DoDDLJob(ctx, job) err = d.callHookOnChanged(job, err) @@ -3960,14 +4044,15 @@ func (d *ddl) ShardRowID(ctx sessionctx.Context, tableIdent ast.Ident, uVal uint if err != nil { return errors.Trace(err) } - if t.Meta().TempTableType != model.TempTableNone { + tbInfo := t.Meta() + if tbInfo.TempTableType != model.TempTableNone { return dbterror.ErrOptOnTemporaryTable.GenWithStackByArgs("shard_row_id_bits") } - if uVal == t.Meta().ShardRowIDBits { + if uVal == tbInfo.ShardRowIDBits { // Nothing need to do. return nil } - if uVal > 0 && t.Meta().HasClusteredIndex() { + if uVal > 0 && tbInfo.HasClusteredIndex() { return dbterror.ErrUnsupportedShardRowIDBits } err = verifyNoOverflowShardBits(d.sessPool, t, uVal) @@ -3975,13 +4060,14 @@ func (d *ddl) ShardRowID(ctx sessionctx.Context, tableIdent ast.Ident, uVal uint return err } job := &model.Job{ - Type: model.ActionShardRowID, - SchemaID: schema.ID, - TableID: t.Meta().ID, - SchemaName: schema.Name.L, - TableName: t.Meta().Name.L, - BinlogInfo: &model.HistoryInfo{}, - Args: []interface{}{uVal}, + Type: model.ActionShardRowID, + SchemaID: schema.ID, + TableID: tbInfo.ID, + SchemaName: schema.Name.L, + TableName: tbInfo.Name.L, + BinlogInfo: &model.HistoryInfo{}, + Args: []interface{}{uVal}, + CDCWriteSource: ctx.GetSessionVars().CDCWriteSource, } err = d.DoDDLJob(ctx, job) err = d.callHookOnChanged(job, err) @@ -4096,7 +4182,7 @@ func CreateNewColumn(ctx sessionctx.Context, schema *model.DBInfo, spec *ast.Alt return nil, errors.Trace(err) } return nil, errors.Trace(dbterror.ErrAddColumnWithSequenceAsDefault.GenWithStackByArgs(specNewColumn.Name.Name.O)) - case ast.Rand, ast.UUID: + case ast.Rand, ast.UUID, ast.UUIDToBin: return nil, errors.Trace(dbterror.ErrBinlogUnsafeSystemFunction.GenWithStackByArgs()) } } @@ -4140,6 +4226,7 @@ func (d *ddl) AddColumn(ctx sessionctx.Context, ti ast.Ident, spec *ast.AlterTab if err != nil { return errors.Trace(err) } + tbInfo := t.Meta() if err = checkAddColumnTooManyColumns(len(t.Cols()) + 1); err != nil { return errors.Trace(err) } @@ -4151,19 +4238,32 @@ func (d *ddl) AddColumn(ctx sessionctx.Context, ti ast.Ident, spec *ast.AlterTab if col == nil { return nil } - err = CheckAfterPositionExists(t.Meta(), spec.Position) + err = CheckAfterPositionExists(tbInfo, spec.Position) + if err != nil { + return errors.Trace(err) + } + + txn, err := ctx.Txn(true) if err != nil { return errors.Trace(err) } + bdrRole, err := meta.NewMeta(txn).GetBDRRole() + if err != nil { + return errors.Trace(err) + } + if bdrRole == string(ast.BDRRolePrimary) && deniedByBDRWhenAddColumn(specNewColumn.Options) { + return dbterror.ErrBDRRestrictedDDL.FastGenByArgs(bdrRole) + } job := &model.Job{ - SchemaID: schema.ID, - TableID: t.Meta().ID, - SchemaName: schema.Name.L, - TableName: t.Meta().Name.L, - Type: model.ActionAddColumn, - BinlogInfo: &model.HistoryInfo{}, - Args: []interface{}{col, spec.Position, 0, spec.IfNotExists}, + SchemaID: schema.ID, + TableID: tbInfo.ID, + SchemaName: schema.Name.L, + TableName: tbInfo.Name.L, + Type: model.ActionAddColumn, + BinlogInfo: &model.HistoryInfo{}, + Args: []interface{}{col, spec.Position, 0, spec.IfNotExists}, + CDCWriteSource: ctx.GetSessionVars().CDCWriteSource, } err = d.DoDDLJob(ctx, job) @@ -4236,13 +4336,14 @@ func (d *ddl) AddTablePartitions(ctx sessionctx.Context, ident ast.Ident, spec * } job := &model.Job{ - SchemaID: schema.ID, - TableID: meta.ID, - SchemaName: schema.Name.L, - TableName: t.Meta().Name.L, - Type: model.ActionAddTablePartition, - BinlogInfo: &model.HistoryInfo{}, - Args: []interface{}{partInfo}, + SchemaID: schema.ID, + TableID: meta.ID, + SchemaName: schema.Name.L, + TableName: t.Meta().Name.L, + Type: model.ActionAddTablePartition, + BinlogInfo: &model.HistoryInfo{}, + Args: []interface{}{partInfo}, + CDCWriteSource: ctx.GetSessionVars().CDCWriteSource, } if spec.Tp == ast.AlterTableAddLastPartition && spec.Partition != nil { @@ -4397,21 +4498,22 @@ func (d *ddl) AlterTablePartitioning(ctx sessionctx.Context, ident ast.Ident, sp newPartInfo.DDLType = piOld.Type job := &model.Job{ - SchemaID: schema.ID, - TableID: meta.ID, - SchemaName: schema.Name.L, - TableName: t.Meta().Name.L, - Type: model.ActionAlterTablePartitioning, - BinlogInfo: &model.HistoryInfo{}, - Args: []interface{}{partNames, newPartInfo}, - ReorgMeta: NewDDLReorgMeta(ctx), + SchemaID: schema.ID, + TableID: meta.ID, + SchemaName: schema.Name.L, + TableName: t.Meta().Name.L, + Type: model.ActionAlterTablePartitioning, + BinlogInfo: &model.HistoryInfo{}, + Args: []interface{}{partNames, newPartInfo}, + ReorgMeta: NewDDLReorgMeta(ctx), + CDCWriteSource: ctx.GetSessionVars().CDCWriteSource, } // No preSplitAndScatter here, it will be done by the worker in onReorganizePartition instead. err = d.DoDDLJob(ctx, job) err = d.callHookOnChanged(job, err) if err == nil { - ctx.GetSessionVars().StmtCtx.AppendWarning(errors.New("The statistics of new partitions will be outdated after reorganizing partitions. Please use 'ANALYZE TABLE' statement if you want to update it now")) + ctx.GetSessionVars().StmtCtx.AppendWarning(errors.NewNoStackError("The statistics of new partitions will be outdated after reorganizing partitions. Please use 'ANALYZE TABLE' statement if you want to update it now")) } return errors.Trace(err) } @@ -4461,21 +4563,22 @@ func (d *ddl) ReorganizePartitions(ctx sessionctx.Context, ident ast.Ident, spec } job := &model.Job{ - SchemaID: schema.ID, - TableID: meta.ID, - SchemaName: schema.Name.L, - TableName: t.Meta().Name.L, - Type: model.ActionReorganizePartition, - BinlogInfo: &model.HistoryInfo{}, - Args: []interface{}{partNames, partInfo}, - ReorgMeta: NewDDLReorgMeta(ctx), + SchemaID: schema.ID, + TableID: meta.ID, + SchemaName: schema.Name.L, + TableName: t.Meta().Name.L, + Type: model.ActionReorganizePartition, + BinlogInfo: &model.HistoryInfo{}, + Args: []interface{}{partNames, partInfo}, + ReorgMeta: NewDDLReorgMeta(ctx), + CDCWriteSource: ctx.GetSessionVars().CDCWriteSource, } // No preSplitAndScatter here, it will be done by the worker in onReorganizePartition instead. err = d.DoDDLJob(ctx, job) err = d.callHookOnChanged(job, err) if err == nil { - ctx.GetSessionVars().StmtCtx.AppendWarning(errors.New("The statistics of related partitions will be outdated after reorganizing partitions. Please use 'ANALYZE TABLE' statement if you want to update it now")) + ctx.GetSessionVars().StmtCtx.AppendWarning(errors.NewNoStackError("The statistics of related partitions will be outdated after reorganizing partitions. Please use 'ANALYZE TABLE' statement if you want to update it now")) } return errors.Trace(err) } @@ -4525,14 +4628,15 @@ func (d *ddl) RemovePartitioning(ctx sessionctx.Context, ident ast.Ident, spec * partInfo.NewTableID = partInfo.Definitions[0].ID job := &model.Job{ - SchemaID: schema.ID, - TableID: meta.ID, - SchemaName: schema.Name.L, - TableName: meta.Name.L, - Type: model.ActionRemovePartitioning, - BinlogInfo: &model.HistoryInfo{}, - Args: []interface{}{partNames, partInfo}, - ReorgMeta: NewDDLReorgMeta(ctx), + SchemaID: schema.ID, + TableID: meta.ID, + SchemaName: schema.Name.L, + TableName: meta.Name.L, + Type: model.ActionRemovePartitioning, + BinlogInfo: &model.HistoryInfo{}, + Args: []interface{}{partNames, partInfo}, + ReorgMeta: NewDDLReorgMeta(ctx), + CDCWriteSource: ctx.GetSessionVars().CDCWriteSource, } // No preSplitAndScatter here, it will be done by the worker in onReorganizePartition instead. @@ -4732,14 +4836,15 @@ func (d *ddl) TruncateTablePartition(ctx sessionctx.Context, ident ast.Ident, sp } job := &model.Job{ - SchemaID: schema.ID, - TableID: meta.ID, - SchemaName: schema.Name.L, - SchemaState: model.StatePublic, - TableName: t.Meta().Name.L, - Type: model.ActionTruncateTablePartition, - BinlogInfo: &model.HistoryInfo{}, - Args: []interface{}{pids, genIDs}, + SchemaID: schema.ID, + TableID: meta.ID, + SchemaName: schema.Name.L, + SchemaState: model.StatePublic, + TableName: t.Meta().Name.L, + Type: model.ActionTruncateTablePartition, + BinlogInfo: &model.HistoryInfo{}, + Args: []interface{}{pids, genIDs}, + CDCWriteSource: ctx.GetSessionVars().CDCWriteSource, } err = d.DoDDLJob(ctx, job) @@ -4827,14 +4932,15 @@ func (d *ddl) DropTablePartition(ctx sessionctx.Context, ident ast.Ident, spec * } job := &model.Job{ - SchemaID: schema.ID, - TableID: meta.ID, - SchemaName: schema.Name.L, - SchemaState: model.StatePublic, - TableName: meta.Name.L, - Type: model.ActionDropTablePartition, - BinlogInfo: &model.HistoryInfo{}, - Args: []interface{}{partNames}, + SchemaID: schema.ID, + TableID: meta.ID, + SchemaName: schema.Name.L, + SchemaState: model.StatePublic, + TableName: meta.Name.L, + Type: model.ActionDropTablePartition, + BinlogInfo: &model.HistoryInfo{}, + Args: []interface{}{partNames}, + CDCWriteSource: ctx.GetSessionVars().CDCWriteSource, } err = d.DoDDLJob(ctx, job) @@ -5035,21 +5141,26 @@ func (d *ddl) ExchangeTablePartition(ctx sessionctx.Context, ident ast.Ident, sp } job := &model.Job{ - SchemaID: ntSchema.ID, - TableID: ntMeta.ID, - SchemaName: ntSchema.Name.L, - TableName: ntMeta.Name.L, - Type: model.ActionExchangeTablePartition, - BinlogInfo: &model.HistoryInfo{}, - Args: []interface{}{defID, ptSchema.ID, ptMeta.ID, partName, spec.WithValidation}, - CtxVars: []interface{}{[]int64{ntSchema.ID, ptSchema.ID}, []int64{ntMeta.ID, ptMeta.ID}}, + SchemaID: ntSchema.ID, + TableID: ntMeta.ID, + SchemaName: ntSchema.Name.L, + TableName: ntMeta.Name.L, + Type: model.ActionExchangeTablePartition, + BinlogInfo: &model.HistoryInfo{}, + Args: []interface{}{defID, ptSchema.ID, ptMeta.ID, partName, spec.WithValidation}, + CtxVars: []interface{}{[]int64{ntSchema.ID, ptSchema.ID}, []int64{ntMeta.ID, ptMeta.ID}}, + CDCWriteSource: ctx.GetSessionVars().CDCWriteSource, + InvolvingSchemaInfo: []model.InvolvingSchemaInfo{ + {Database: ptSchema.Name.L, Table: ptMeta.Name.L}, + {Database: ntSchema.Name.L, Table: ntMeta.Name.L}, + }, } err = d.DoDDLJob(ctx, job) if err != nil { return errors.Trace(err) } - ctx.GetSessionVars().StmtCtx.AppendWarning(fmt.Errorf("after the exchange, please analyze related table of the exchange to update statistics")) + ctx.GetSessionVars().StmtCtx.AppendWarning(errors.NewNoStackError("after the exchange, please analyze related table of the exchange to update statistics")) err = d.callHookOnChanged(job, err) return errors.Trace(err) } @@ -5075,14 +5186,15 @@ func (d *ddl) DropColumn(ctx sessionctx.Context, ti ast.Ident, spec *ast.AlterTa } job := &model.Job{ - SchemaID: schema.ID, - TableID: t.Meta().ID, - SchemaName: schema.Name.L, - SchemaState: model.StatePublic, - TableName: t.Meta().Name.L, - Type: model.ActionDropColumn, - BinlogInfo: &model.HistoryInfo{}, - Args: []interface{}{colName, spec.IfExists}, + SchemaID: schema.ID, + TableID: t.Meta().ID, + SchemaName: schema.Name.L, + SchemaState: model.StatePublic, + TableName: t.Meta().Name.L, + Type: model.ActionDropColumn, + BinlogInfo: &model.HistoryInfo{}, + Args: []interface{}{colName, spec.IfExists}, + CDCWriteSource: ctx.GetSessionVars().CDCWriteSource, } err = d.DoDDLJob(ctx, job) @@ -5334,7 +5446,8 @@ func ProcessColumnOptions(ctx sessionctx.Context, col *table.Column, options []* col.GeneratedExprString = sb.String() col.GeneratedStored = opt.Stored col.Dependences = make(map[string]struct{}) - col.GeneratedExpr = opt.Expr + // Only used by checkModifyGeneratedColumn, there is no need to set a ctor for it. + col.GeneratedExpr = table.NewClonableExprNode(nil, opt.Expr) for _, colName := range FindColumnNamesInExpr(opt.Expr) { col.Dependences[colName.Name.L] = struct{}{} } @@ -5400,7 +5513,7 @@ func checkModifyColumnWithGeneratedColumnsConstraint(allCols []*table.Column, ol if col.GeneratedExpr == nil { continue } - dependedColNames := FindColumnNamesInExpr(col.GeneratedExpr) + dependedColNames := FindColumnNamesInExpr(col.GeneratedExpr.Internal()) for _, name := range dependedColNames { if name.Name.L == oldColName.L { if col.Hidden { @@ -5688,16 +5801,30 @@ func GetModifiableColumnJob( return nil, errors.Trace(err) } + txn, err := sctx.Txn(true) + if err != nil { + return nil, errors.Trace(err) + } + bdrRole, err := meta.NewMeta(txn).GetBDRRole() + if err != nil { + return nil, errors.Trace(err) + } + if bdrRole == string(ast.BDRRolePrimary) && + deniedByBDRWhenModifyColumn(newCol.FieldType, col.FieldType, specNewColumn.Options) { + return nil, dbterror.ErrBDRRestrictedDDL.FastGenByArgs(bdrRole) + } + job := &model.Job{ - SchemaID: schema.ID, - TableID: t.Meta().ID, - SchemaName: schema.Name.L, - TableName: t.Meta().Name.L, - Type: model.ActionModifyColumn, - BinlogInfo: &model.HistoryInfo{}, - ReorgMeta: NewDDLReorgMeta(sctx), - CtxVars: []interface{}{needChangeColData}, - Args: []interface{}{&newCol.ColumnInfo, originalColName, spec.Position, modifyColumnTp, newAutoRandBits}, + SchemaID: schema.ID, + TableID: t.Meta().ID, + SchemaName: schema.Name.L, + TableName: t.Meta().Name.L, + Type: model.ActionModifyColumn, + BinlogInfo: &model.HistoryInfo{}, + ReorgMeta: NewDDLReorgMeta(sctx), + CtxVars: []interface{}{needChangeColData}, + Args: []interface{}{&newCol.ColumnInfo, originalColName, spec.Position, modifyColumnTp, newAutoRandBits}, + CDCWriteSource: sctx.GetSessionVars().CDCWriteSource, } return job, nil } @@ -5889,7 +6016,7 @@ func (d *ddl) ChangeColumn(ctx context.Context, sctx sessionctx.Context, ident a job, err := d.getModifiableColumnJob(ctx, sctx, ident, spec.OldColumnName.Name, spec) if err != nil { if infoschema.ErrColumnNotExists.Equal(err) && spec.IfExists { - sctx.GetSessionVars().StmtCtx.AppendNote(infoschema.ErrColumnNotExists.GenWithStackByArgs(spec.OldColumnName.Name, ident.Name)) + sctx.GetSessionVars().StmtCtx.AppendNote(infoschema.ErrColumnNotExists.FastGenByArgs(spec.OldColumnName.Name, ident.Name)) return nil } return errors.Trace(err) @@ -5951,14 +6078,15 @@ func (d *ddl) RenameColumn(ctx sessionctx.Context, ident ast.Ident, spec *ast.Al newCol := oldCol.Clone() newCol.Name = newColName job := &model.Job{ - SchemaID: schema.ID, - TableID: tbl.Meta().ID, - SchemaName: schema.Name.L, - TableName: tbl.Meta().Name.L, - Type: model.ActionModifyColumn, - BinlogInfo: &model.HistoryInfo{}, - ReorgMeta: NewDDLReorgMeta(ctx), - Args: []interface{}{&newCol, oldColName, spec.Position, 0, 0}, + SchemaID: schema.ID, + TableID: tbl.Meta().ID, + SchemaName: schema.Name.L, + TableName: tbl.Meta().Name.L, + Type: model.ActionModifyColumn, + BinlogInfo: &model.HistoryInfo{}, + ReorgMeta: NewDDLReorgMeta(ctx), + Args: []interface{}{&newCol, oldColName, spec.Position, 0, 0}, + CDCWriteSource: ctx.GetSessionVars().CDCWriteSource, } err = d.DoDDLJob(ctx, job) err = d.callHookOnChanged(job, err) @@ -5980,7 +6108,7 @@ func (d *ddl) ModifyColumn(ctx context.Context, sctx sessionctx.Context, ident a job, err := d.getModifiableColumnJob(ctx, sctx, ident, originalColName, spec) if err != nil { if infoschema.ErrColumnNotExists.Equal(err) && spec.IfExists { - sctx.GetSessionVars().StmtCtx.AppendNote(infoschema.ErrColumnNotExists.GenWithStackByArgs(originalColName, ident.Name)) + sctx.GetSessionVars().StmtCtx.AppendNote(infoschema.ErrColumnNotExists.FastGenByArgs(originalColName, ident.Name)) return nil } return errors.Trace(err) @@ -6039,13 +6167,14 @@ func (d *ddl) AlterColumn(ctx sessionctx.Context, ident ast.Ident, spec *ast.Alt } job := &model.Job{ - SchemaID: schema.ID, - TableID: t.Meta().ID, - SchemaName: schema.Name.L, - TableName: t.Meta().Name.L, - Type: model.ActionSetDefaultValue, - BinlogInfo: &model.HistoryInfo{}, - Args: []interface{}{col}, + SchemaID: schema.ID, + TableID: t.Meta().ID, + SchemaName: schema.Name.L, + TableName: t.Meta().Name.L, + Type: model.ActionSetDefaultValue, + BinlogInfo: &model.HistoryInfo{}, + Args: []interface{}{col}, + CDCWriteSource: ctx.GetSessionVars().CDCWriteSource, } err = d.DoDDLJob(ctx, job) @@ -6070,13 +6199,14 @@ func (d *ddl) AlterTableComment(ctx sessionctx.Context, ident ast.Ident, spec *a } job := &model.Job{ - SchemaID: schema.ID, - TableID: tb.Meta().ID, - SchemaName: schema.Name.L, - TableName: tb.Meta().Name.L, - Type: model.ActionModifyTableComment, - BinlogInfo: &model.HistoryInfo{}, - Args: []interface{}{spec.Comment}, + SchemaID: schema.ID, + TableID: tb.Meta().ID, + SchemaName: schema.Name.L, + TableName: tb.Meta().Name.L, + Type: model.ActionModifyTableComment, + BinlogInfo: &model.HistoryInfo{}, + Args: []interface{}{spec.Comment}, + CDCWriteSource: ctx.GetSessionVars().CDCWriteSource, } err = d.DoDDLJob(ctx, job) @@ -6097,13 +6227,14 @@ func (d *ddl) AlterTableAutoIDCache(ctx sessionctx.Context, ident ast.Ident, new } job := &model.Job{ - SchemaID: schema.ID, - TableID: tb.Meta().ID, - SchemaName: schema.Name.L, - TableName: tb.Meta().Name.L, - Type: model.ActionModifyTableAutoIdCache, - BinlogInfo: &model.HistoryInfo{}, - Args: []interface{}{newCache}, + SchemaID: schema.ID, + TableID: tb.Meta().ID, + SchemaName: schema.Name.L, + TableName: tb.Meta().Name.L, + Type: model.ActionModifyTableAutoIdCache, + BinlogInfo: &model.HistoryInfo{}, + Args: []interface{}{newCache}, + CDCWriteSource: ctx.GetSessionVars().CDCWriteSource, } err = d.DoDDLJob(ctx, job) @@ -6150,13 +6281,14 @@ func (d *ddl) AlterTableCharsetAndCollate(ctx sessionctx.Context, ident ast.Iden } job := &model.Job{ - SchemaID: schema.ID, - TableID: tb.Meta().ID, - SchemaName: schema.Name.L, - TableName: tb.Meta().Name.L, - Type: model.ActionModifyTableCharsetAndCollate, - BinlogInfo: &model.HistoryInfo{}, - Args: []interface{}{toCharset, toCollate, needsOverwriteCols}, + SchemaID: schema.ID, + TableID: tb.Meta().ID, + SchemaName: schema.Name.L, + TableName: tb.Meta().Name.L, + Type: model.ActionModifyTableCharsetAndCollate, + BinlogInfo: &model.HistoryInfo{}, + Args: []interface{}{toCharset, toCollate, needsOverwriteCols}, + CDCWriteSource: ctx.GetSessionVars().CDCWriteSource, } err = d.DoDDLJob(ctx, job) err = d.callHookOnChanged(job, err) @@ -6220,13 +6352,14 @@ func (d *ddl) AlterTableSetTiFlashReplica(ctx sessionctx.Context, ident ast.Iden } job := &model.Job{ - SchemaID: schema.ID, - TableID: tb.Meta().ID, - SchemaName: schema.Name.L, - TableName: tb.Meta().Name.L, - Type: model.ActionSetTiFlashReplica, - BinlogInfo: &model.HistoryInfo{}, - Args: []interface{}{*replicaInfo}, + SchemaID: schema.ID, + TableID: tb.Meta().ID, + SchemaName: schema.Name.L, + TableName: tb.Meta().Name.L, + Type: model.ActionSetTiFlashReplica, + BinlogInfo: &model.HistoryInfo{}, + Args: []interface{}{*replicaInfo}, + CDCWriteSource: ctx.GetSessionVars().CDCWriteSource, } err = d.DoDDLJob(ctx, job) err = d.callHookOnChanged(job, err) @@ -6275,13 +6408,14 @@ func (d *ddl) AlterTableTTLInfoOrEnable(ctx sessionctx.Context, ident ast.Ident, } job = &model.Job{ - SchemaID: schema.ID, - TableID: tableID, - SchemaName: schema.Name.L, - TableName: tableName, - Type: model.ActionAlterTTLInfo, - BinlogInfo: &model.HistoryInfo{}, - Args: []interface{}{ttlInfo, ttlEnable, ttlCronJobSchedule}, + SchemaID: schema.ID, + TableID: tableID, + SchemaName: schema.Name.L, + TableName: tableName, + Type: model.ActionAlterTTLInfo, + BinlogInfo: &model.HistoryInfo{}, + Args: []interface{}{ttlInfo, ttlEnable, ttlCronJobSchedule}, + CDCWriteSource: ctx.GetSessionVars().CDCWriteSource, } err = d.DoDDLJob(ctx, job) @@ -6308,12 +6442,13 @@ func (d *ddl) AlterTableRemoveTTL(ctx sessionctx.Context, ident ast.Ident) error if tblInfo.TTLInfo != nil { job := &model.Job{ - SchemaID: schema.ID, - TableID: tableID, - SchemaName: schema.Name.L, - TableName: tableName, - Type: model.ActionAlterTTLRemove, - BinlogInfo: &model.HistoryInfo{}, + SchemaID: schema.ID, + TableID: tableID, + SchemaName: schema.Name.L, + TableName: tableName, + Type: model.ActionAlterTTLRemove, + BinlogInfo: &model.HistoryInfo{}, + CDCWriteSource: ctx.GetSessionVars().CDCWriteSource, } err = d.DoDDLJob(ctx, job) err = d.callHookOnChanged(job, err) @@ -6380,7 +6515,7 @@ func (d *ddl) AlterTableAddStatistics(ctx sessionctx.Context, ident ast.Ident, s return infoschema.ErrColumnNotExists.GenWithStackByArgs(colName.Name, ident.Name) } if stats.StatsType == ast.StatsTypeCorrelation && tblInfo.PKIsHandle && mysql.HasPriKeyFlag(col.GetFlag()) { - ctx.GetSessionVars().StmtCtx.AppendWarning(errors.New("No need to create correlation statistics on the integer primary key column")) + ctx.GetSessionVars().StmtCtx.AppendWarning(errors.NewNoStackError("No need to create correlation statistics on the integer primary key column")) return nil } if _, exist := colIDSet[col.ID]; exist { @@ -6439,13 +6574,14 @@ func (d *ddl) UpdateTableReplicaInfo(ctx sessionctx.Context, physicalID int64, a } job := &model.Job{ - SchemaID: db.ID, - TableID: tb.Meta().ID, - SchemaName: db.Name.L, - TableName: tb.Meta().Name.L, - Type: model.ActionUpdateTiFlashReplicaStatus, - BinlogInfo: &model.HistoryInfo{}, - Args: []interface{}{available, physicalID}, + SchemaID: db.ID, + TableID: tb.Meta().ID, + SchemaName: db.Name.L, + TableName: tb.Meta().Name.L, + Type: model.ActionUpdateTiFlashReplicaStatus, + BinlogInfo: &model.HistoryInfo{}, + Args: []interface{}{available, physicalID}, + CDCWriteSource: ctx.GetSessionVars().CDCWriteSource, } err := d.DoDDLJob(ctx, job) err = d.callHookOnChanged(job, err) @@ -6544,13 +6680,14 @@ func (d *ddl) RenameIndex(ctx sessionctx.Context, ident ast.Ident, spec *ast.Alt } job := &model.Job{ - SchemaID: schema.ID, - TableID: tb.Meta().ID, - SchemaName: schema.Name.L, - TableName: tb.Meta().Name.L, - Type: model.ActionRenameIndex, - BinlogInfo: &model.HistoryInfo{}, - Args: []interface{}{spec.FromKey, spec.ToKey}, + SchemaID: schema.ID, + TableID: tb.Meta().ID, + SchemaName: schema.Name.L, + TableName: tb.Meta().Name.L, + Type: model.ActionRenameIndex, + BinlogInfo: &model.HistoryInfo{}, + Args: []interface{}{spec.FromKey, spec.ToKey}, + CDCWriteSource: ctx.GetSessionVars().CDCWriteSource, } err = d.DoDDLJob(ctx, job) @@ -6686,14 +6823,15 @@ func (d *ddl) dropTableObject( } job := &model.Job{ - SchemaID: schema.ID, - TableID: tableInfo.Meta().ID, - SchemaName: schema.Name.L, - SchemaState: schema.State, - TableName: tableInfo.Meta().Name.L, - Type: jobType, - BinlogInfo: &model.HistoryInfo{}, - Args: jobArgs, + SchemaID: schema.ID, + TableID: tableInfo.Meta().ID, + SchemaName: schema.Name.L, + SchemaState: schema.State, + TableName: tableInfo.Meta().Name.L, + Type: jobType, + BinlogInfo: &model.HistoryInfo{}, + Args: jobArgs, + CDCWriteSource: ctx.GetSessionVars().CDCWriteSource, } err = d.DoDDLJob(ctx, job) @@ -6766,13 +6904,14 @@ func (d *ddl) TruncateTable(ctx sessionctx.Context, ti ast.Ident) error { } newTableID := genIDs[0] job := &model.Job{ - SchemaID: schema.ID, - TableID: tb.Meta().ID, - SchemaName: schema.Name.L, - TableName: tb.Meta().Name.L, - Type: model.ActionTruncateTable, - BinlogInfo: &model.HistoryInfo{}, - Args: []interface{}{newTableID, fkCheck, genIDs[1:]}, + SchemaID: schema.ID, + TableID: tb.Meta().ID, + SchemaName: schema.Name.L, + TableName: tb.Meta().Name.L, + Type: model.ActionTruncateTable, + BinlogInfo: &model.HistoryInfo{}, + Args: []interface{}{newTableID, fkCheck, genIDs[1:]}, + CDCWriteSource: ctx.GetSessionVars().CDCWriteSource, } if ok, _ := ctx.CheckTableLocked(tb.Meta().ID); ok && config.TableLockEnabled() { // AddTableLock here to avoid this ddl job was executed successfully but the session was been kill before return. @@ -6839,14 +6978,19 @@ func (d *ddl) renameTable(ctx sessionctx.Context, oldIdent, newIdent ast.Ident, } job := &model.Job{ - SchemaID: schemas[1].ID, - TableID: tableID, - SchemaName: schemas[1].Name.L, - TableName: oldIdent.Name.L, - Type: model.ActionRenameTable, - BinlogInfo: &model.HistoryInfo{}, - Args: []interface{}{schemas[0].ID, newIdent.Name, schemas[0].Name}, - CtxVars: []interface{}{[]int64{schemas[0].ID, schemas[1].ID}, []int64{tableID}}, + SchemaID: schemas[1].ID, + TableID: tableID, + SchemaName: schemas[1].Name.L, + TableName: oldIdent.Name.L, + Type: model.ActionRenameTable, + BinlogInfo: &model.HistoryInfo{}, + CDCWriteSource: ctx.GetSessionVars().CDCWriteSource, + Args: []interface{}{schemas[0].ID, newIdent.Name, schemas[0].Name}, + CtxVars: []interface{}{[]int64{schemas[0].ID, schemas[1].ID}, []int64{tableID}}, + InvolvingSchemaInfo: []model.InvolvingSchemaInfo{ + {Database: schemas[0].Name.L, Table: oldIdent.Name.L}, + {Database: schemas[1].Name.L, Table: newIdent.Name.L}, + }, } err = d.DoDDLJob(ctx, job) @@ -6862,6 +7006,7 @@ func (d *ddl) renameTables(ctx sessionctx.Context, oldIdents, newIdents []ast.Id newSchemaIDs := make([]int64, 0, len(oldIdents)) tableIDs := make([]int64, 0, len(oldIdents)) oldSchemaNames := make([]*model.CIStr, 0, len(oldIdents)) + involveSchemaInfo := make([]model.InvolvingSchemaInfo, 0, len(oldIdents)*2) var schemas []*model.DBInfo var tableID int64 @@ -6886,16 +7031,23 @@ func (d *ddl) renameTables(ctx sessionctx.Context, oldIdents, newIdents []ast.Id oldSchemaIDs = append(oldSchemaIDs, schemas[0].ID) newSchemaIDs = append(newSchemaIDs, schemas[1].ID) oldSchemaNames = append(oldSchemaNames, &schemas[0].Name) + involveSchemaInfo = append(involveSchemaInfo, model.InvolvingSchemaInfo{ + Database: schemas[0].Name.L, Table: oldIdents[i].Name.L, + }, model.InvolvingSchemaInfo{ + Database: schemas[1].Name.L, Table: newIdents[i].Name.L, + }) } job := &model.Job{ - SchemaID: schemas[1].ID, - TableID: tableIDs[0], - SchemaName: schemas[1].Name.L, - Type: model.ActionRenameTables, - BinlogInfo: &model.HistoryInfo{}, - Args: []interface{}{oldSchemaIDs, newSchemaIDs, tableNames, tableIDs, oldSchemaNames, oldTableNames}, - CtxVars: []interface{}{append(oldSchemaIDs, newSchemaIDs...), tableIDs}, + SchemaID: schemas[1].ID, + TableID: tableIDs[0], + SchemaName: schemas[1].Name.L, + Type: model.ActionRenameTables, + BinlogInfo: &model.HistoryInfo{}, + CDCWriteSource: ctx.GetSessionVars().CDCWriteSource, + Args: []interface{}{oldSchemaIDs, newSchemaIDs, tableNames, tableIDs, oldSchemaNames, oldTableNames}, + CtxVars: []interface{}{append(oldSchemaIDs, newSchemaIDs...), tableIDs}, + InvolvingSchemaInfo: involveSchemaInfo, } err = d.DoDDLJob(ctx, job) @@ -7063,7 +7215,7 @@ func (d *ddl) CreatePrimaryKey(ctx sessionctx.Context, ti ast.Ident, indexName m return err } if !ck { - if !config.GetGlobalConfig().EnableGlobalIndex { + if !ctx.GetSessionVars().EnableGlobalIndex { return dbterror.ErrUniqueKeyNeedAllFieldsInPf.GenWithStackByArgs("PRIMARY") } // index columns does not contain all partition columns, must set global @@ -7081,17 +7233,18 @@ func (d *ddl) CreatePrimaryKey(ctx sessionctx.Context, ti ast.Ident, indexName m unique := true sqlMode := ctx.GetSessionVars().SQLMode job := &model.Job{ - SchemaID: schema.ID, - TableID: t.Meta().ID, - SchemaName: schema.Name.L, - TableName: t.Meta().Name.L, - Type: model.ActionAddPrimaryKey, - BinlogInfo: &model.HistoryInfo{}, - ReorgMeta: nil, - Args: []interface{}{unique, indexName, indexPartSpecifications, indexOption, sqlMode, nil, global}, - Priority: ctx.GetSessionVars().DDLReorgPriority, - } - reorgMeta, err := newReorgMetaFromVariables(d, job, ctx) + SchemaID: schema.ID, + TableID: t.Meta().ID, + SchemaName: schema.Name.L, + TableName: t.Meta().Name.L, + Type: model.ActionAddPrimaryKey, + BinlogInfo: &model.HistoryInfo{}, + ReorgMeta: nil, + Args: []interface{}{unique, indexName, indexPartSpecifications, indexOption, sqlMode, nil, global}, + Priority: ctx.GetSessionVars().DDLReorgPriority, + CDCWriteSource: ctx.GetSessionVars().CDCWriteSource, + } + reorgMeta, err := newReorgMetaFromVariables(job, ctx) if err != nil { return err } @@ -7311,7 +7464,7 @@ func (d *ddl) createIndex(ctx sessionctx.Context, ti ast.Ident, keyType ast.Inde return err } if !ck { - if !config.GetGlobalConfig().EnableGlobalIndex { + if !ctx.GetSessionVars().EnableGlobalIndex { return dbterror.ErrUniqueKeyNeedAllFieldsInPf.GenWithStackByArgs("UNIQUE INDEX") } // index columns does not contain all partition columns, must set global @@ -7336,19 +7489,20 @@ func (d *ddl) createIndex(ctx sessionctx.Context, ti ast.Ident, keyType ast.Inde chs, coll := ctx.GetSessionVars().GetCharsetInfo() job := &model.Job{ - SchemaID: schema.ID, - TableID: t.Meta().ID, - SchemaName: schema.Name.L, - TableName: t.Meta().Name.L, - Type: model.ActionAddIndex, - BinlogInfo: &model.HistoryInfo{}, - ReorgMeta: nil, - Args: []interface{}{unique, indexName, indexPartSpecifications, indexOption, hiddenCols, global}, - Priority: ctx.GetSessionVars().DDLReorgPriority, - Charset: chs, - Collate: coll, - } - reorgMeta, err := newReorgMetaFromVariables(d, job, ctx) + SchemaID: schema.ID, + TableID: t.Meta().ID, + SchemaName: schema.Name.L, + TableName: t.Meta().Name.L, + Type: model.ActionAddIndex, + BinlogInfo: &model.HistoryInfo{}, + ReorgMeta: nil, + Args: []interface{}{unique, indexName, indexPartSpecifications, indexOption, hiddenCols, global}, + Priority: ctx.GetSessionVars().DDLReorgPriority, + Charset: chs, + Collate: coll, + CDCWriteSource: ctx.GetSessionVars().CDCWriteSource, + } + reorgMeta, err := newReorgMetaFromVariables(job, ctx) if err != nil { return err } @@ -7364,24 +7518,30 @@ func (d *ddl) createIndex(ctx sessionctx.Context, ti ast.Ident, keyType ast.Inde return errors.Trace(err) } -func newReorgMetaFromVariables(d *ddl, job *model.Job, sctx sessionctx.Context) (*model.DDLReorgMeta, error) { +func newReorgMetaFromVariables(job *model.Job, sctx sessionctx.Context) (*model.DDLReorgMeta, error) { reorgMeta := NewDDLReorgMeta(sctx) reorgMeta.IsDistReorg = variable.EnableDistTask.Load() reorgMeta.IsFastReorg = variable.EnableFastReorg.Load() if reorgMeta.IsDistReorg && !reorgMeta.IsFastReorg { return nil, dbterror.ErrUnsupportedDistTask } - isUpgradingSysDB := d.stateSyncer.IsUpgradingState() && hasSysDB(job) - if isUpgradingSysDB { + if hasSysDB(job) { if reorgMeta.IsDistReorg { - logutil.BgLogger().Info("cannot use distributed task execution because the job on system DB is in upgrade state", + logutil.BgLogger().Info("cannot use distributed task execution on system DB", zap.String("category", "ddl"), zap.Stringer("job", job)) } reorgMeta.IsDistReorg = false + reorgMeta.IsFastReorg = false + failpoint.Inject("reorgMetaRecordFastReorgDisabled", func(_ failpoint.Value) { + LastReorgMetaFastReorgDisabled = true + }) } return reorgMeta, nil } +// LastReorgMetaFastReorgDisabled is used for test. +var LastReorgMetaFastReorgDisabled bool + func buildFKInfo(fkName model.CIStr, keys []*ast.IndexPartSpecification, refer *ast.ReferenceDef, cols []*table.Column) (*model.FKInfo, error) { if len(keys) != len(refer.IndexPartSpecifications) { return nil, infoschema.ErrForeignKeyNotMatch.GenWithStackByArgs(fkName, "Key reference and table reference don't match") @@ -7529,13 +7689,14 @@ func (d *ddl) CreateForeignKey(ctx sessionctx.Context, ti ast.Ident, fkName mode } job := &model.Job{ - SchemaID: schema.ID, - TableID: t.Meta().ID, - SchemaName: schema.Name.L, - TableName: t.Meta().Name.L, - Type: model.ActionAddForeignKey, - BinlogInfo: &model.HistoryInfo{}, - Args: []interface{}{fkInfo, fkCheck}, + SchemaID: schema.ID, + TableID: t.Meta().ID, + SchemaName: schema.Name.L, + TableName: t.Meta().Name.L, + Type: model.ActionAddForeignKey, + BinlogInfo: &model.HistoryInfo{}, + Args: []interface{}{fkInfo, fkCheck}, + CDCWriteSource: ctx.GetSessionVars().CDCWriteSource, } err = d.DoDDLJob(ctx, job) @@ -7556,14 +7717,15 @@ func (d *ddl) DropForeignKey(ctx sessionctx.Context, ti ast.Ident, fkName model. } job := &model.Job{ - SchemaID: schema.ID, - TableID: t.Meta().ID, - SchemaName: schema.Name.L, - SchemaState: model.StatePublic, - TableName: t.Meta().Name.L, - Type: model.ActionDropForeignKey, - BinlogInfo: &model.HistoryInfo{}, - Args: []interface{}{fkName}, + SchemaID: schema.ID, + TableID: t.Meta().ID, + SchemaName: schema.Name.L, + SchemaState: model.StatePublic, + TableName: t.Meta().Name.L, + Type: model.ActionDropForeignKey, + BinlogInfo: &model.HistoryInfo{}, + Args: []interface{}{fkName}, + CDCWriteSource: ctx.GetSessionVars().CDCWriteSource, } err = d.DoDDLJob(ctx, job) @@ -7647,14 +7809,15 @@ func (d *ddl) dropIndex(ctx sessionctx.Context, ti ast.Ident, indexName model.CI } job := &model.Job{ - SchemaID: schema.ID, - TableID: t.Meta().ID, - SchemaName: schema.Name.L, - SchemaState: indexInfo.State, - TableName: t.Meta().Name.L, - Type: jobTp, - BinlogInfo: &model.HistoryInfo{}, - Args: []interface{}{indexName, ifExists}, + SchemaID: schema.ID, + TableID: t.Meta().ID, + SchemaName: schema.Name.L, + SchemaState: indexInfo.State, + TableName: t.Meta().Name.L, + Type: jobTp, + BinlogInfo: &model.HistoryInfo{}, + Args: []interface{}{indexName, ifExists}, + CDCWriteSource: ctx.GetSessionVars().CDCWriteSource, } err = d.DoDDLJob(ctx, job) @@ -7728,6 +7891,7 @@ func validateCommentLength(vars *variable.SessionVars, name string, comment *str if len(*comment) > maxLen { err := errTooLongComment.GenWithStackByArgs(name, maxLen) if vars.StrictSQLMode { + // may be treated like an error. return "", err } vars.StmtCtx.AppendWarning(err) @@ -7892,6 +8056,7 @@ func (d *ddl) LockTables(ctx sessionctx.Context, stmt *ast.LockTablesStmt) error SessionID: ctx.GetSessionVars().ConnectionID, } uniqueTableID := make(map[int64]struct{}) + involveSchemaInfo := make([]model.InvolvingSchemaInfo, 0, len(stmt.TableLocks)) // Check whether the table was already locked by another. for _, tl := range stmt.TableLocks { tb := tl.Table @@ -7916,6 +8081,10 @@ func (d *ddl) LockTables(ctx sessionctx.Context, stmt *ast.LockTablesStmt) error } uniqueTableID[t.Meta().ID] = struct{}{} lockTables = append(lockTables, model.TableLockTpInfo{SchemaID: schema.ID, TableID: t.Meta().ID, Tp: tl.Type}) + involveSchemaInfo = append(involveSchemaInfo, model.InvolvingSchemaInfo{ + Database: schema.Name.L, + Table: t.Meta().Name.L, + }) } unlockTables := ctx.GetAllTableLocks() @@ -7925,11 +8094,14 @@ func (d *ddl) LockTables(ctx sessionctx.Context, stmt *ast.LockTablesStmt) error SessionInfo: sessionInfo, } job := &model.Job{ - SchemaID: lockTables[0].SchemaID, - TableID: lockTables[0].TableID, - Type: model.ActionLockTable, - BinlogInfo: &model.HistoryInfo{}, - Args: []interface{}{arg}, + SchemaID: lockTables[0].SchemaID, + TableID: lockTables[0].TableID, + Type: model.ActionLockTable, + BinlogInfo: &model.HistoryInfo{}, + Args: []interface{}{arg}, + CDCWriteSource: ctx.GetSessionVars().CDCWriteSource, + + InvolvingSchemaInfo: involveSchemaInfo, } // AddTableLock here is avoiding this job was executed successfully but the session was killed before return. ctx.AddTableLock(lockTables) @@ -7955,11 +8127,12 @@ func (d *ddl) UnlockTables(ctx sessionctx.Context, unlockTables []model.TableLoc }, } job := &model.Job{ - SchemaID: unlockTables[0].SchemaID, - TableID: unlockTables[0].TableID, - Type: model.ActionUnlockTable, - BinlogInfo: &model.HistoryInfo{}, - Args: []interface{}{arg}, + SchemaID: unlockTables[0].SchemaID, + TableID: unlockTables[0].TableID, + Type: model.ActionUnlockTable, + BinlogInfo: &model.HistoryInfo{}, + Args: []interface{}{arg}, + CDCWriteSource: ctx.GetSessionVars().CDCWriteSource, } err := d.DoDDLJob(ctx, job) @@ -8047,11 +8220,12 @@ func (d *ddl) CleanupTableLock(ctx sessionctx.Context, tables []*ast.TableName) IsCleanup: true, } job := &model.Job{ - SchemaID: cleanupTables[0].SchemaID, - TableID: cleanupTables[0].TableID, - Type: model.ActionUnlockTable, - BinlogInfo: &model.HistoryInfo{}, - Args: []interface{}{arg}, + SchemaID: cleanupTables[0].SchemaID, + TableID: cleanupTables[0].TableID, + Type: model.ActionUnlockTable, + BinlogInfo: &model.HistoryInfo{}, + Args: []interface{}{arg}, + CDCWriteSource: ctx.GetSessionVars().CDCWriteSource, } err := d.DoDDLJob(ctx, job) if err == nil { @@ -8133,13 +8307,14 @@ func (d *ddl) RepairTable(ctx sessionctx.Context, createStmt *ast.CreateTableStm newTableInfo.State = model.StateNone job := &model.Job{ - SchemaID: oldDBInfo.ID, - TableID: newTableInfo.ID, - SchemaName: oldDBInfo.Name.L, - TableName: newTableInfo.Name.L, - Type: model.ActionRepairTable, - BinlogInfo: &model.HistoryInfo{}, - Args: []interface{}{newTableInfo}, + SchemaID: oldDBInfo.ID, + TableID: newTableInfo.ID, + SchemaName: oldDBInfo.Name.L, + TableName: newTableInfo.Name.L, + Type: model.ActionRepairTable, + BinlogInfo: &model.HistoryInfo{}, + Args: []interface{}{newTableInfo}, + CDCWriteSource: ctx.GetSessionVars().CDCWriteSource, } err = d.DoDDLJob(ctx, job) if err == nil { @@ -8156,7 +8331,7 @@ func (d *ddl) OrderByColumns(ctx sessionctx.Context, ident ast.Ident) error { return errors.Trace(err) } if tb.Meta().GetPkColInfo() != nil { - ctx.GetSessionVars().StmtCtx.AppendWarning(errors.Errorf("ORDER BY ignored as there is a user-defined clustered index in the table '%s'", ident.Name)) + ctx.GetSessionVars().StmtCtx.AppendWarning(errors.NewNoStackErrorf("ORDER BY ignored as there is a user-defined clustered index in the table '%s'", ident.Name)) } return nil } @@ -8212,13 +8387,14 @@ func (d *ddl) AlterSequence(ctx sessionctx.Context, stmt *ast.AlterSequenceStmt) } job := &model.Job{ - SchemaID: db.ID, - TableID: tbl.Meta().ID, - SchemaName: db.Name.L, - TableName: tbl.Meta().Name.L, - Type: model.ActionAlterSequence, - BinlogInfo: &model.HistoryInfo{}, - Args: []interface{}{ident, stmt.SeqOptions}, + SchemaID: db.ID, + TableID: tbl.Meta().ID, + SchemaName: db.Name.L, + TableName: tbl.Meta().Name.L, + Type: model.ActionAlterSequence, + BinlogInfo: &model.HistoryInfo{}, + Args: []interface{}{ident, stmt.SeqOptions}, + CDCWriteSource: ctx.GetSessionVars().CDCWriteSource, } err = d.DoDDLJob(ctx, job) @@ -8250,13 +8426,14 @@ func (d *ddl) AlterIndexVisibility(ctx sessionctx.Context, ident ast.Ident, inde } job := &model.Job{ - SchemaID: schema.ID, - TableID: tb.Meta().ID, - SchemaName: schema.Name.L, - TableName: tb.Meta().Name.L, - Type: model.ActionAlterIndexVisibility, - BinlogInfo: &model.HistoryInfo{}, - Args: []interface{}{indexName, invisible}, + SchemaID: schema.ID, + TableID: tb.Meta().ID, + SchemaName: schema.Name.L, + TableName: tb.Meta().Name.L, + Type: model.ActionAlterIndexVisibility, + BinlogInfo: &model.HistoryInfo{}, + Args: []interface{}{indexName, invisible}, + CDCWriteSource: ctx.GetSessionVars().CDCWriteSource, } err = d.DoDDLJob(ctx, job) @@ -8280,13 +8457,14 @@ func (d *ddl) AlterTableAttributes(ctx sessionctx.Context, ident ast.Ident, spec rule.Reset(schema.Name.L, meta.Name.L, "", ids...) job := &model.Job{ - SchemaID: schema.ID, - TableID: meta.ID, - SchemaName: schema.Name.L, - TableName: meta.Name.L, - Type: model.ActionAlterTableAttributes, - BinlogInfo: &model.HistoryInfo{}, - Args: []interface{}{rule}, + SchemaID: schema.ID, + TableID: meta.ID, + SchemaName: schema.Name.L, + TableName: meta.Name.L, + Type: model.ActionAlterTableAttributes, + BinlogInfo: &model.HistoryInfo{}, + Args: []interface{}{rule}, + CDCWriteSource: ctx.GetSessionVars().CDCWriteSource, } err = d.DoDDLJob(ctx, job) @@ -8322,13 +8500,14 @@ func (d *ddl) AlterTablePartitionAttributes(ctx sessionctx.Context, ident ast.Id rule.Reset(schema.Name.L, meta.Name.L, spec.PartitionNames[0].L, partitionID) job := &model.Job{ - SchemaID: schema.ID, - TableID: meta.ID, - SchemaName: schema.Name.L, - TableName: meta.Name.L, - Type: model.ActionAlterTablePartitionAttributes, - BinlogInfo: &model.HistoryInfo{}, - Args: []interface{}{partitionID, rule}, + SchemaID: schema.ID, + TableID: meta.ID, + SchemaName: schema.Name.L, + TableName: meta.Name.L, + Type: model.ActionAlterTablePartitionAttributes, + BinlogInfo: &model.HistoryInfo{}, + Args: []interface{}{partitionID, rule}, + CDCWriteSource: ctx.GetSessionVars().CDCWriteSource, } err = d.DoDDLJob(ctx, job) @@ -8391,13 +8570,14 @@ func (d *ddl) AlterTablePartitionPlacement(ctx sessionctx.Context, tableIdent as } job := &model.Job{ - SchemaID: schema.ID, - TableID: tblInfo.ID, - SchemaName: schema.Name.L, - TableName: tblInfo.Name.L, - Type: model.ActionAlterTablePartitionPlacement, - BinlogInfo: &model.HistoryInfo{}, - Args: []interface{}{partitionID, policyRefInfo}, + SchemaID: schema.ID, + TableID: tblInfo.ID, + SchemaName: schema.Name.L, + TableName: tblInfo.Name.L, + Type: model.ActionAlterTablePartitionPlacement, + BinlogInfo: &model.HistoryInfo{}, + Args: []interface{}{partitionID, policyRefInfo}, + CDCWriteSource: ctx.GetSessionVars().CDCWriteSource, } err = d.DoDDLJob(ctx, job) @@ -8456,7 +8636,7 @@ func handleDatabasePlacement(ctx sessionctx.Context, dbInfo *model.DBInfo) error if sessVars.PlacementMode == variable.PlacementModeIgnore { dbInfo.PlacementPolicyRef = nil sessVars.StmtCtx.AppendNote( - fmt.Errorf("Placement is ignored when TIDB_PLACEMENT_MODE is '%s'", variable.PlacementModeIgnore), + errors.NewNoStackErrorf("Placement is ignored when TIDB_PLACEMENT_MODE is '%s'", variable.PlacementModeIgnore), ) return nil } @@ -8470,7 +8650,7 @@ func handleTablePlacement(ctx sessionctx.Context, tbInfo *model.TableInfo) error sessVars := ctx.GetSessionVars() if sessVars.PlacementMode == variable.PlacementModeIgnore && removeTablePlacement(tbInfo) { sessVars.StmtCtx.AppendNote( - fmt.Errorf("Placement is ignored when TIDB_PLACEMENT_MODE is '%s'", variable.PlacementModeIgnore), + errors.NewNoStackErrorf("Placement is ignored when TIDB_PLACEMENT_MODE is '%s'", variable.PlacementModeIgnore), ) return nil } @@ -8497,7 +8677,7 @@ func handlePartitionPlacement(ctx sessionctx.Context, partInfo *model.PartitionI sessVars := ctx.GetSessionVars() if sessVars.PlacementMode == variable.PlacementModeIgnore && removePartitionPlacement(partInfo) { sessVars.StmtCtx.AppendNote( - fmt.Errorf("Placement is ignored when TIDB_PLACEMENT_MODE is '%s'", variable.PlacementModeIgnore), + errors.NewNoStackErrorf("Placement is ignored when TIDB_PLACEMENT_MODE is '%s'", variable.PlacementModeIgnore), ) return nil } @@ -8517,7 +8697,7 @@ func checkIgnorePlacementDDL(ctx sessionctx.Context) bool { sessVars := ctx.GetSessionVars() if sessVars.PlacementMode == variable.PlacementModeIgnore { sessVars.StmtCtx.AppendNote( - fmt.Errorf("Placement is ignored when TIDB_PLACEMENT_MODE is '%s'", variable.PlacementModeIgnore), + errors.NewNoStackErrorf("Placement is ignored when TIDB_PLACEMENT_MODE is '%s'", variable.PlacementModeIgnore), ) return true } @@ -8535,7 +8715,7 @@ func (d *ddl) AddResourceGroup(ctx sessionctx.Context, stmt *ast.CreateResourceG if _, ok := d.GetInfoSchemaWithInterceptor(ctx).ResourceGroupByName(groupName); ok { if stmt.IfNotExists { - err = infoschema.ErrResourceGroupExists.GenWithStackByArgs(groupName) + err = infoschema.ErrResourceGroupExists.FastGenByArgs(groupName) ctx.GetSessionVars().StmtCtx.AppendNote(err) return nil } @@ -8554,10 +8734,15 @@ func (d *ddl) AddResourceGroup(ctx sessionctx.Context, stmt *ast.CreateResourceG groupInfo.ID = groupIDs[0] job := &model.Job{ - SchemaName: groupName.L, - Type: model.ActionCreateResourceGroup, - BinlogInfo: &model.HistoryInfo{}, - Args: []interface{}{groupInfo, false}, + SchemaName: groupName.L, + Type: model.ActionCreateResourceGroup, + BinlogInfo: &model.HistoryInfo{}, + CDCWriteSource: ctx.GetSessionVars().CDCWriteSource, + Args: []interface{}{groupInfo, false}, + InvolvingSchemaInfo: []model.InvolvingSchemaInfo{{ + Database: model.InvolvingNone, + Table: model.InvolvingNone, + }}, } err = d.DoDDLJob(ctx, job) err = d.callHookOnChanged(job, err) @@ -8599,11 +8784,16 @@ func (d *ddl) DropResourceGroup(ctx sessionctx.Context, stmt *ast.DropResourceGr } job := &model.Job{ - SchemaID: group.ID, - SchemaName: group.Name.L, - Type: model.ActionDropResourceGroup, - BinlogInfo: &model.HistoryInfo{}, - Args: []interface{}{groupName}, + SchemaID: group.ID, + SchemaName: group.Name.L, + Type: model.ActionDropResourceGroup, + BinlogInfo: &model.HistoryInfo{}, + CDCWriteSource: ctx.GetSessionVars().CDCWriteSource, + Args: []interface{}{groupName}, + InvolvingSchemaInfo: []model.InvolvingSchemaInfo{{ + Database: model.InvolvingNone, + Table: model.InvolvingNone, + }}, } err = d.DoDDLJob(ctx, job) err = d.callHookOnChanged(job, err) @@ -8651,11 +8841,16 @@ func (d *ddl) AlterResourceGroup(ctx sessionctx.Context, stmt *ast.AlterResource logutil.BgLogger().Debug("alter resource group", zap.String("name", groupName.L), zap.Stringer("new resource group settings", newGroupInfo.ResourceGroupSettings)) job := &model.Job{ - SchemaID: newGroupInfo.ID, - SchemaName: newGroupInfo.Name.L, - Type: model.ActionAlterResourceGroup, - BinlogInfo: &model.HistoryInfo{}, - Args: []interface{}{newGroupInfo}, + SchemaID: newGroupInfo.ID, + SchemaName: newGroupInfo.Name.L, + Type: model.ActionAlterResourceGroup, + BinlogInfo: &model.HistoryInfo{}, + CDCWriteSource: ctx.GetSessionVars().CDCWriteSource, + Args: []interface{}{newGroupInfo}, + InvolvingSchemaInfo: []model.InvolvingSchemaInfo{{ + Database: model.InvolvingNone, + Table: model.InvolvingNone, + }}, } err = d.DoDDLJob(ctx, job) err = d.callHookOnChanged(job, err) @@ -8711,11 +8906,16 @@ func (d *ddl) DropPlacementPolicy(ctx sessionctx.Context, stmt *ast.DropPlacemen } job := &model.Job{ - SchemaID: policy.ID, - SchemaName: policy.Name.L, - Type: model.ActionDropPlacementPolicy, - BinlogInfo: &model.HistoryInfo{}, - Args: []interface{}{policyName}, + SchemaID: policy.ID, + SchemaName: policy.Name.L, + Type: model.ActionDropPlacementPolicy, + BinlogInfo: &model.HistoryInfo{}, + CDCWriteSource: ctx.GetSessionVars().CDCWriteSource, + Args: []interface{}{policyName}, + InvolvingSchemaInfo: []model.InvolvingSchemaInfo{{ + Database: model.InvolvingNone, + Table: model.InvolvingNone, + }}, } err = d.DoDDLJob(ctx, job) err = d.callHookOnChanged(job, err) @@ -8745,11 +8945,16 @@ func (d *ddl) AlterPlacementPolicy(ctx sessionctx.Context, stmt *ast.AlterPlacem } job := &model.Job{ - SchemaID: policy.ID, - SchemaName: policy.Name.L, - Type: model.ActionAlterPlacementPolicy, - BinlogInfo: &model.HistoryInfo{}, - Args: []interface{}{newPolicyInfo}, + SchemaID: policy.ID, + SchemaName: policy.Name.L, + Type: model.ActionAlterPlacementPolicy, + BinlogInfo: &model.HistoryInfo{}, + CDCWriteSource: ctx.GetSessionVars().CDCWriteSource, + Args: []interface{}{newPolicyInfo}, + InvolvingSchemaInfo: []model.InvolvingSchemaInfo{{ + Database: model.InvolvingNone, + Table: model.InvolvingNone, + }}, } err = d.DoDDLJob(ctx, job) err = d.callHookOnChanged(job, err) @@ -8799,13 +9004,14 @@ func (d *ddl) AlterTableCache(sctx sessionctx.Context, ti ast.Ident) (err error) sctx.SetValue(sessionctx.QueryString, ddlQuery) job := &model.Job{ - SchemaID: schema.ID, - SchemaName: schema.Name.L, - TableName: t.Meta().Name.L, - TableID: t.Meta().ID, - Type: model.ActionAlterCacheTable, - BinlogInfo: &model.HistoryInfo{}, - Args: []interface{}{}, + SchemaID: schema.ID, + SchemaName: schema.Name.L, + TableName: t.Meta().Name.L, + TableID: t.Meta().ID, + Type: model.ActionAlterCacheTable, + BinlogInfo: &model.HistoryInfo{}, + Args: []interface{}{}, + CDCWriteSource: sctx.GetSessionVars().CDCWriteSource, } err = d.DoDDLJob(sctx, job) @@ -8858,13 +9064,14 @@ func (d *ddl) AlterTableNoCache(ctx sessionctx.Context, ti ast.Ident) (err error } job := &model.Job{ - SchemaID: schema.ID, - SchemaName: schema.Name.L, - TableName: t.Meta().Name.L, - TableID: t.Meta().ID, - Type: model.ActionAlterNoCacheTable, - BinlogInfo: &model.HistoryInfo{}, - Args: []interface{}{}, + SchemaID: schema.ID, + SchemaName: schema.Name.L, + TableName: t.Meta().Name.L, + TableID: t.Meta().ID, + Type: model.ActionAlterNoCacheTable, + BinlogInfo: &model.HistoryInfo{}, + Args: []interface{}{}, + CDCWriteSource: ctx.GetSessionVars().CDCWriteSource, } err = d.DoDDLJob(ctx, job) @@ -8882,9 +9089,9 @@ func checkTooBigFieldLengthAndTryAutoConvert(tp *types.FieldType, colName string return err } if tp.GetCharset() == charset.CharsetBin { - sessVars.StmtCtx.AppendWarning(dbterror.ErrAutoConvert.GenWithStackByArgs(colName, "VARBINARY", "BLOB")) + sessVars.StmtCtx.AppendWarning(dbterror.ErrAutoConvert.FastGenByArgs(colName, "VARBINARY", "BLOB")) } else { - sessVars.StmtCtx.AppendWarning(dbterror.ErrAutoConvert.GenWithStackByArgs(colName, "VARCHAR", "TEXT")) + sessVars.StmtCtx.AppendWarning(dbterror.ErrAutoConvert.FastGenByArgs(colName, "VARCHAR", "TEXT")) } } } @@ -8948,13 +9155,15 @@ func (d *ddl) CreateCheckConstraint(ctx sessionctx.Context, ti ast.Ident, constr return err } job := &model.Job{ - SchemaID: schema.ID, - TableID: t.Meta().ID, - SchemaName: schema.Name.L, - Type: model.ActionAddCheckConstraint, - BinlogInfo: &model.HistoryInfo{}, - Args: []interface{}{constraintInfo}, - Priority: ctx.GetSessionVars().DDLReorgPriority, + SchemaID: schema.ID, + TableID: tblInfo.ID, + SchemaName: schema.Name.L, + TableName: tblInfo.Name.L, + Type: model.ActionAddCheckConstraint, + BinlogInfo: &model.HistoryInfo{}, + CDCWriteSource: ctx.GetSessionVars().CDCWriteSource, + Args: []interface{}{constraintInfo}, + Priority: ctx.GetSessionVars().DDLReorgPriority, } err = d.DoDDLJob(ctx, job) @@ -8972,19 +9181,22 @@ func (d *ddl) DropCheckConstraint(ctx sessionctx.Context, ti ast.Ident, constrNa if err != nil { return errors.Trace(infoschema.ErrTableNotExists.GenWithStackByArgs(ti.Schema, ti.Name)) } + tblInfo := t.Meta() - constraintInfo := t.Meta().FindConstraintInfoByName(constrName.L) + constraintInfo := tblInfo.FindConstraintInfoByName(constrName.L) if constraintInfo == nil { return dbterror.ErrConstraintNotFound.GenWithStackByArgs(constrName) } job := &model.Job{ - SchemaID: schema.ID, - TableID: t.Meta().ID, - SchemaName: schema.Name.L, - Type: model.ActionDropCheckConstraint, - BinlogInfo: &model.HistoryInfo{}, - Args: []interface{}{constrName}, + SchemaID: schema.ID, + TableID: tblInfo.ID, + SchemaName: schema.Name.L, + TableName: tblInfo.Name.L, + Type: model.ActionDropCheckConstraint, + BinlogInfo: &model.HistoryInfo{}, + CDCWriteSource: ctx.GetSessionVars().CDCWriteSource, + Args: []interface{}{constrName}, } err = d.DoDDLJob(ctx, job) @@ -9002,19 +9214,22 @@ func (d *ddl) AlterCheckConstraint(ctx sessionctx.Context, ti ast.Ident, constrN if err != nil { return errors.Trace(infoschema.ErrTableNotExists.GenWithStackByArgs(ti.Schema, ti.Name)) } + tblInfo := t.Meta() - constraintInfo := t.Meta().FindConstraintInfoByName(constrName.L) + constraintInfo := tblInfo.FindConstraintInfoByName(constrName.L) if constraintInfo == nil { return dbterror.ErrConstraintNotFound.GenWithStackByArgs(constrName) } job := &model.Job{ - SchemaID: schema.ID, - TableID: t.Meta().ID, - SchemaName: schema.Name.L, - Type: model.ActionAlterCheckConstraint, - BinlogInfo: &model.HistoryInfo{}, - Args: []interface{}{constrName, enforced}, + SchemaID: schema.ID, + TableID: tblInfo.ID, + SchemaName: schema.Name.L, + TableName: tblInfo.Name.L, + Type: model.ActionAlterCheckConstraint, + BinlogInfo: &model.HistoryInfo{}, + CDCWriteSource: ctx.GetSessionVars().CDCWriteSource, + Args: []interface{}{constrName, enforced}, } err = d.DoDDLJob(ctx, job) @@ -9030,7 +9245,7 @@ func NewDDLReorgMeta(ctx sessionctx.Context) *model.DDLReorgMeta { Warnings: make(map[errors.ErrorID]*terror.Error), WarningsCount: make(map[errors.ErrorID]int64), Location: &model.TimeZoneLocation{Name: tzName, Offset: tzOffset}, - ResourceGroupName: ctx.GetSessionVars().ResourceGroupName, + ResourceGroupName: ctx.GetSessionVars().StmtCtx.ResourceGroupName, Version: model.CurrentReorgMetaVersion, } } diff --git a/pkg/ddl/ddl_api_test.go b/pkg/ddl/ddl_api_test.go index 9426844e43ae4..e849b43b3ff17 100644 --- a/pkg/ddl/ddl_api_test.go +++ b/pkg/ddl/ddl_api_test.go @@ -17,14 +17,19 @@ package ddl_test import ( "cmp" "context" + "fmt" "slices" + "sync" "testing" + "github.com/pingcap/failpoint" "github.com/pingcap/tidb/pkg/ddl" + "github.com/pingcap/tidb/pkg/ddl/util/callback" "github.com/pingcap/tidb/pkg/kv" "github.com/pingcap/tidb/pkg/parser/model" sessiontypes "github.com/pingcap/tidb/pkg/session/types" "github.com/pingcap/tidb/pkg/testkit" + "github.com/pingcap/tidb/pkg/util/chunk" "github.com/stretchr/testify/require" ) @@ -145,3 +150,66 @@ func enQueueDDLJobs(t *testing.T, sess sessiontypes.Session, txn kv.Transaction, require.NoError(t, err) } } + +func TestCreateDropCreateTable(t *testing.T) { + store, dom := testkit.CreateMockStoreAndDomain(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk1 := testkit.NewTestKit(t, store) + tk1.MustExec("use test") + + tk.MustExec("create table t (a int);") + + wg := sync.WaitGroup{} + var createErr error + var fpErr error + var createTable bool + + originHook := dom.DDL().GetHook() + onJobUpdated := func(job *model.Job) { + if job.Type == model.ActionDropTable && job.SchemaState == model.StateWriteOnly && !createTable { + fpErr = failpoint.Enable("github.com/pingcap/tidb/pkg/ddl/mockOwnerCheckAllVersionSlow", fmt.Sprintf("return(%d)", job.ID)) + wg.Add(1) + go func() { + _, createErr = tk1.Exec("create table t (b int);") + wg.Done() + }() + createTable = true + } + } + hook := &callback.TestDDLCallback{} + hook.OnJobUpdatedExported.Store(&onJobUpdated) + dom.DDL().SetHook(hook) + tk.MustExec("drop table t;") + dom.DDL().SetHook(originHook) + + wg.Wait() + require.NoError(t, createErr) + require.NoError(t, fpErr) + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/ddl/mockOwnerCheckAllVersionSlow")) + + rs := tk.MustQuery("admin show ddl jobs 3;").Rows() + create1JobID := rs[0][0].(string) + dropJobID := rs[1][0].(string) + create0JobID := rs[2][0].(string) + jobRecordSet, err := tk.Exec("select job_meta from mysql.tidb_ddl_history where job_id in (?, ?, ?);", + create1JobID, dropJobID, create0JobID) + require.NoError(t, err) + + var finishTSs []uint64 + req := jobRecordSet.NewChunk(nil) + err = jobRecordSet.Next(context.Background(), req) + require.Greater(t, req.NumRows(), 0) + require.NoError(t, err) + iter := chunk.NewIterator4Chunk(req.CopyConstruct()) + for row := iter.Begin(); row != iter.End(); row = iter.Next() { + jobMeta := row.GetBytes(0) + job := model.Job{} + err = job.Decode(jobMeta) + require.NoError(t, err) + finishTSs = append(finishTSs, job.BinlogInfo.FinishedTS) + } + create1TS, dropTS, create0TS := finishTSs[0], finishTSs[1], finishTSs[2] + require.Less(t, create0TS, dropTS, "first create should finish before drop") + require.Less(t, dropTS, create1TS, "second create should finish after drop") +} diff --git a/pkg/ddl/ddl_history.go b/pkg/ddl/ddl_history.go new file mode 100644 index 0000000000000..f0c35a256288a --- /dev/null +++ b/pkg/ddl/ddl_history.go @@ -0,0 +1,165 @@ +// Copyright 2024 PingCAP, 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. + +package ddl + +import ( + "cmp" + "context" + "fmt" + "slices" + "strconv" + + "github.com/pingcap/errors" + sess "github.com/pingcap/tidb/pkg/ddl/internal/session" + "github.com/pingcap/tidb/pkg/ddl/util" + "github.com/pingcap/tidb/pkg/kv" + "github.com/pingcap/tidb/pkg/meta" + "github.com/pingcap/tidb/pkg/parser/model" + "github.com/pingcap/tidb/pkg/sessionctx" + "github.com/pingcap/tidb/pkg/sessiontxn" + "github.com/pingcap/tidb/pkg/util/logutil" + "go.uber.org/zap" +) + +// DefNumHistoryJobs is default value of the default number of history job +const ( + DefNumHistoryJobs = 10 + batchNumHistoryJobs = 128 +) + +// AddHistoryDDLJob record the history job. +func AddHistoryDDLJob(sess *sess.Session, t *meta.Meta, job *model.Job, updateRawArgs bool) error { + err := addHistoryDDLJob2Table(sess, job, updateRawArgs) + if err != nil { + logutil.BgLogger().Info("failed to add DDL job to history table", zap.String("category", "ddl"), zap.Error(err)) + } + // we always add history DDL job to job list at this moment. + return t.AddHistoryDDLJob(job, updateRawArgs) +} + +// addHistoryDDLJob2Table adds DDL job to history table. +func addHistoryDDLJob2Table(sess *sess.Session, job *model.Job, updateRawArgs bool) error { + b, err := job.Encode(updateRawArgs) + if err != nil { + return err + } + _, err = sess.Execute(context.Background(), + fmt.Sprintf("insert ignore into mysql.tidb_ddl_history(job_id, job_meta, db_name, table_name, schema_ids, table_ids, create_time) values (%d, %s, %s, %s, %s, %s, %v)", + job.ID, util.WrapKey2String(b), strconv.Quote(job.SchemaName), strconv.Quote(job.TableName), + strconv.Quote(strconv.FormatInt(job.SchemaID, 10)), + strconv.Quote(strconv.FormatInt(job.TableID, 10)), + strconv.Quote(model.TSConvert2Time(job.StartTS).String()), + ), + "insert_history") + return errors.Trace(err) +} + +// GetHistoryJobByID return history DDL job by ID. +func GetHistoryJobByID(sess sessionctx.Context, id int64) (*model.Job, error) { + err := sessiontxn.NewTxn(context.Background(), sess) + if err != nil { + return nil, err + } + defer func() { + // we can ignore the commit error because this txn is readonly. + _ = sess.CommitTxn(context.Background()) + }() + txn, err := sess.Txn(true) + if err != nil { + return nil, err + } + t := meta.NewMeta(txn) + job, err := t.GetHistoryDDLJob(id) + return job, errors.Trace(err) +} + +// GetLastNHistoryDDLJobs returns the DDL history jobs and an error. +// The maximum count of history jobs is num. +func GetLastNHistoryDDLJobs(t *meta.Meta, maxNumJobs int) ([]*model.Job, error) { + iterator, err := GetLastHistoryDDLJobsIterator(t) + if err != nil { + return nil, errors.Trace(err) + } + return iterator.GetLastJobs(maxNumJobs, nil) +} + +// IterHistoryDDLJobs iterates history DDL jobs until the `finishFn` return true or error. +func IterHistoryDDLJobs(txn kv.Transaction, finishFn func([]*model.Job) (bool, error)) error { + txnMeta := meta.NewMeta(txn) + iter, err := GetLastHistoryDDLJobsIterator(txnMeta) + if err != nil { + return err + } + cacheJobs := make([]*model.Job, 0, DefNumHistoryJobs) + for { + cacheJobs, err = iter.GetLastJobs(DefNumHistoryJobs, cacheJobs) + if err != nil || len(cacheJobs) == 0 { + return err + } + finish, err := finishFn(cacheJobs) + if err != nil || finish { + return err + } + } +} + +// GetLastHistoryDDLJobsIterator gets latest N history DDL jobs iterator. +func GetLastHistoryDDLJobsIterator(m *meta.Meta) (meta.LastJobIterator, error) { + return m.GetLastHistoryDDLJobsIterator() +} + +// GetAllHistoryDDLJobs get all the done DDL jobs. +func GetAllHistoryDDLJobs(m *meta.Meta) ([]*model.Job, error) { + iterator, err := GetLastHistoryDDLJobsIterator(m) + if err != nil { + return nil, errors.Trace(err) + } + allJobs := make([]*model.Job, 0, batchNumHistoryJobs) + for { + jobs, err := iterator.GetLastJobs(batchNumHistoryJobs, nil) + if err != nil { + return nil, errors.Trace(err) + } + allJobs = append(allJobs, jobs...) + if len(jobs) < batchNumHistoryJobs { + break + } + } + // sort job. + slices.SortFunc(allJobs, func(i, j *model.Job) int { + return cmp.Compare(i.ID, j.ID) + }) + return allJobs, nil +} + +// ScanHistoryDDLJobs get some of the done DDL jobs. +// When the DDL history is quite large, GetAllHistoryDDLJobs() API can't work well, because it makes the server OOM. +// The result is in descending order by job ID. +func ScanHistoryDDLJobs(m *meta.Meta, startJobID int64, limit int) ([]*model.Job, error) { + var iter meta.LastJobIterator + var err error + if startJobID == 0 { + iter, err = m.GetLastHistoryDDLJobsIterator() + } else { + if limit == 0 { + return nil, errors.New("when 'start_job_id' is specified, it must work with a 'limit'") + } + iter, err = m.GetHistoryDDLJobsIterator(startJobID) + } + if err != nil { + return nil, errors.Trace(err) + } + return iter.GetLastJobs(limit, nil) +} diff --git a/pkg/ddl/ddl_history_test.go b/pkg/ddl/ddl_history_test.go new file mode 100644 index 0000000000000..87c7ef9b81d53 --- /dev/null +++ b/pkg/ddl/ddl_history_test.go @@ -0,0 +1,99 @@ +// Copyright 2023 PingCAP, 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. + +// Copyright 2013 The ql Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSES/QL-LICENSE file. + +package ddl_test + +import ( + "context" + "testing" + + "github.com/ngaut/pools" + "github.com/pingcap/tidb/pkg/ddl" + "github.com/pingcap/tidb/pkg/ddl/internal/session" + "github.com/pingcap/tidb/pkg/kv" + "github.com/pingcap/tidb/pkg/meta" + "github.com/pingcap/tidb/pkg/parser/model" + "github.com/pingcap/tidb/pkg/testkit" + "github.com/stretchr/testify/require" +) + +func TestDDLHistoryBasic(t *testing.T) { + store := testkit.CreateMockStore(t) + rs := pools.NewResourcePool(func() (pools.Resource, error) { + newTk := testkit.NewTestKit(t, store) + return newTk.Session(), nil + }, 8, 8, 0) + sessPool := session.NewSessionPool(rs, store) + sessCtx, err := sessPool.Get() + require.NoError(t, err) + sess := session.NewSession(sessCtx) + + ctx := kv.WithInternalSourceType(context.Background(), kv.InternalTxnLightning) + err = kv.RunInNewTxn(ctx, store, false, func(ctx context.Context, txn kv.Transaction) error { + t := meta.NewMeta(txn) + return ddl.AddHistoryDDLJob(sess, t, &model.Job{ + ID: 1, + }, false) + }) + + require.NoError(t, err) + + err = kv.RunInNewTxn(ctx, store, false, func(ctx context.Context, txn kv.Transaction) error { + t := meta.NewMeta(txn) + return ddl.AddHistoryDDLJob(sess, t, &model.Job{ + ID: 2, + }, false) + }) + + require.NoError(t, err) + + job, err := ddl.GetHistoryJobByID(sessCtx, 1) + require.NoError(t, err) + require.Equal(t, int64(1), job.ID) + + err = kv.RunInNewTxn(ctx, store, false, func(ctx context.Context, txn kv.Transaction) error { + m := meta.NewMeta(txn) + jobs, err := ddl.GetLastNHistoryDDLJobs(m, 2) + require.NoError(t, err) + require.Equal(t, 2, len(jobs)) + return nil + }) + + require.NoError(t, err) + + err = kv.RunInNewTxn(ctx, store, false, func(ctx context.Context, txn kv.Transaction) error { + m := meta.NewMeta(txn) + _, err := ddl.GetAllHistoryDDLJobs(m) + require.NoError(t, err) + return nil + }) + + require.NoError(t, err) + + err = kv.RunInNewTxn(ctx, store, false, func(ctx context.Context, txn kv.Transaction) error { + m := meta.NewMeta(txn) + jobs, err := ddl.ScanHistoryDDLJobs(m, 2, 2) + require.NoError(t, err) + require.Equal(t, 2, len(jobs)) + require.Equal(t, int64(2), jobs[0].ID) + require.Equal(t, int64(1), jobs[1].ID) + return nil + }) + + require.NoError(t, err) +} diff --git a/pkg/ddl/ddl_running_jobs.go b/pkg/ddl/ddl_running_jobs.go new file mode 100644 index 0000000000000..95faa765bee6e --- /dev/null +++ b/pkg/ddl/ddl_running_jobs.go @@ -0,0 +1,113 @@ +// Copyright 2023 PingCAP, 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. + +// Copyright 2013 The ql Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSES/QL-LICENSE file. + +package ddl + +import ( + "strconv" + "strings" + "sync" + + "github.com/pingcap/tidb/pkg/parser/model" +) + +type runningJobs struct { + sync.RWMutex + ids map[int64]struct{} + runningSchema map[string]map[string]struct{} // database -> table -> struct{} + runningJobIDs string +} + +func newRunningJobs() *runningJobs { + return &runningJobs{ + ids: make(map[int64]struct{}), + runningSchema: make(map[string]map[string]struct{}), + } +} + +func (j *runningJobs) add(job *model.Job) { + j.Lock() + defer j.Unlock() + j.ids[job.ID] = struct{}{} + j.updateInternalRunningJobIDs() + for _, info := range job.GetInvolvingSchemaInfo() { + if _, ok := j.runningSchema[info.Database]; !ok { + j.runningSchema[info.Database] = make(map[string]struct{}) + } + j.runningSchema[info.Database][info.Table] = struct{}{} + } +} + +func (j *runningJobs) remove(job *model.Job) { + j.Lock() + defer j.Unlock() + delete(j.ids, job.ID) + j.updateInternalRunningJobIDs() + for _, info := range job.GetInvolvingSchemaInfo() { + if db, ok := j.runningSchema[info.Database]; ok { + delete(db, info.Table) + } + if len(j.runningSchema[info.Database]) == 0 { + delete(j.runningSchema, info.Database) + } + } +} + +func (j *runningJobs) checkRunnable(job *model.Job) bool { + j.RLock() + defer j.RUnlock() + for _, info := range job.GetInvolvingSchemaInfo() { + if _, ok := j.runningSchema[model.InvolvingAll]; ok { + return false + } + if info.Database == model.InvolvingNone { + continue + } + if tbls, ok := j.runningSchema[info.Database]; ok { + if _, ok := tbls[model.InvolvingAll]; ok { + return false + } + if info.Table == model.InvolvingNone { + continue + } + if _, ok := tbls[info.Table]; ok { + return false + } + } + } + return true +} + +func (j *runningJobs) allIDs() string { + j.RLock() + defer j.RUnlock() + return j.runningJobIDs +} + +func (j *runningJobs) updateInternalRunningJobIDs() { + var sb strings.Builder + i := 0 + for id := range j.ids { + sb.WriteString(strconv.Itoa(int(id))) + if i != len(j.ids)-1 { + sb.WriteString(",") + } + i++ + } + j.runningJobIDs = sb.String() +} diff --git a/pkg/ddl/ddl_running_jobs_test.go b/pkg/ddl/ddl_running_jobs_test.go new file mode 100644 index 0000000000000..7fe2f5c46a7b0 --- /dev/null +++ b/pkg/ddl/ddl_running_jobs_test.go @@ -0,0 +1,112 @@ +// Copyright 2023 PingCAP, 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. + +// Copyright 2013 The ql Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSES/QL-LICENSE file. + +package ddl + +import ( + "sort" + "strconv" + "strings" + "testing" + + "github.com/pingcap/tidb/pkg/parser/model" + "github.com/stretchr/testify/require" +) + +func TestRunningJobs(t *testing.T) { + mkJob := func(id int64, schemaTableNames ...string) *model.Job { + var schemaInfos []model.InvolvingSchemaInfo + for _, schemaTableName := range schemaTableNames { + ss := strings.Split(schemaTableName, ".") + schemaInfos = append(schemaInfos, model.InvolvingSchemaInfo{ + Database: ss[0], + Table: ss[1], + }) + } + return &model.Job{ + ID: id, + InvolvingSchemaInfo: schemaInfos, + } + } + orderedAllIDs := func(ids string) string { + ss := strings.Split(ids, ",") + ssid := make([]int, len(ss)) + for i := range ss { + id, err := strconv.Atoi(ss[i]) + require.NoError(t, err) + ssid[i] = id + } + sort.Ints(ssid) + for i := range ssid { + ss[i] = strconv.Itoa(ssid[i]) + } + return strings.Join(ss, ",") + } + + j := newRunningJobs() + require.Equal(t, "", j.allIDs()) + + runnable := j.checkRunnable(mkJob(0, "db1.t1")) + require.True(t, runnable) + job1 := mkJob(1, "db1.t1", "db1.t2") + job2 := mkJob(2, "db2.t3") + j.add(job1) + j.add(job2) + require.Equal(t, "1,2", orderedAllIDs(j.allIDs())) + runnable = j.checkRunnable(mkJob(0, "db1.t1")) + require.False(t, runnable) + runnable = j.checkRunnable(mkJob(0, "db1.t2")) + require.False(t, runnable) + runnable = j.checkRunnable(mkJob(0, "db3.t4", "db1.t1")) + require.False(t, runnable) + runnable = j.checkRunnable(mkJob(0, "db3.t4", "db4.t5")) + require.True(t, runnable) + + job3 := mkJob(3, "db1.*") + j.add(job3) + require.Equal(t, "1,2,3", orderedAllIDs(j.allIDs())) + runnable = j.checkRunnable(mkJob(0, "db1.t100")) + require.False(t, runnable) + + job4 := mkJob(4, "db4.") + j.add(job4) + require.Equal(t, "1,2,3,4", orderedAllIDs(j.allIDs())) + runnable = j.checkRunnable(mkJob(0, "db4.t100")) + require.True(t, runnable) + + job5 := mkJob(5, "*.*") + j.add(job5) + require.Equal(t, "1,2,3,4,5", orderedAllIDs(j.allIDs())) + runnable = j.checkRunnable(mkJob(0, "db100.t100")) + require.False(t, runnable) + + j.remove(job5) + require.Equal(t, "1,2,3,4", orderedAllIDs(j.allIDs())) + runnable = j.checkRunnable(mkJob(0, "db100.t100")) + require.True(t, runnable) + + j.remove(job3) + require.Equal(t, "1,2,4", orderedAllIDs(j.allIDs())) + runnable = j.checkRunnable(mkJob(0, "db1.t100")) + require.True(t, runnable) + + j.remove(job1) + require.Equal(t, "2,4", orderedAllIDs(j.allIDs())) + runnable = j.checkRunnable(mkJob(0, "db1.t1")) + require.True(t, runnable) +} diff --git a/pkg/ddl/ddl_test.go b/pkg/ddl/ddl_test.go index a59c58833fc88..cb0120e3f4718 100644 --- a/pkg/ddl/ddl_test.go +++ b/pkg/ddl/ddl_test.go @@ -73,9 +73,6 @@ func (d *ddl) RemoveReorgCtx(id int64) { d.removeReorgCtx(id) } -// JobNeedGCForTest is only used for test. -var JobNeedGCForTest = jobNeedGC - func createMockStore(t *testing.T) kv.Storage { store, err := mockstore.NewMockStore() require.NoError(t, err) diff --git a/pkg/ddl/ddl_tiflash_api.go b/pkg/ddl/ddl_tiflash_api.go index a16502ee04ae6..d1b76a8da0d7f 100644 --- a/pkg/ddl/ddl_tiflash_api.go +++ b/pkg/ddl/ddl_tiflash_api.go @@ -37,6 +37,7 @@ import ( "github.com/pingcap/tidb/pkg/sessionctx" "github.com/pingcap/tidb/pkg/table" "github.com/pingcap/tidb/pkg/util" + "github.com/pingcap/tidb/pkg/util/engine" "github.com/pingcap/tidb/pkg/util/intest" "github.com/pingcap/tidb/pkg/util/logutil" pd "github.com/tikv/pd/client/http" @@ -340,11 +341,8 @@ func updateTiFlashStores(pollTiFlashContext *TiFlashManagementContext) error { } pollTiFlashContext.TiFlashStores = make(map[int64]pd.StoreInfo) for _, store := range tikvStats.Stores { - for _, l := range store.Store.Labels { - if l.Key == "engine" && l.Value == "tiflash" { - pollTiFlashContext.TiFlashStores[store.Store.ID] = store - logutil.BgLogger().Debug("Found tiflash store", zap.Int64("id", store.Store.ID), zap.String("Address", store.Store.Address), zap.String("StatusAddress", store.Store.StatusAddress)) - } + if engine.IsTiFlashHTTPResp(&store.Store) { + pollTiFlashContext.TiFlashStores[store.Store.ID] = store } } logutil.BgLogger().Debug("updateTiFlashStores finished", zap.Int("TiFlash store count", len(pollTiFlashContext.TiFlashStores))) diff --git a/pkg/ddl/ddl_worker.go b/pkg/ddl/ddl_worker.go index 25e5acd4db155..948b6496096d1 100644 --- a/pkg/ddl/ddl_worker.go +++ b/pkg/ddl/ddl_worker.go @@ -33,6 +33,7 @@ import ( "github.com/pingcap/tidb/pkg/meta" "github.com/pingcap/tidb/pkg/metrics" "github.com/pingcap/tidb/pkg/parser" + "github.com/pingcap/tidb/pkg/parser/ast" "github.com/pingcap/tidb/pkg/parser/model" "github.com/pingcap/tidb/pkg/parser/terror" "github.com/pingcap/tidb/pkg/sessionctx" @@ -83,6 +84,9 @@ const ( generalWorker workerType = 0 // addIdxWorker is the worker who handles the operation of adding indexes. addIdxWorker workerType = 1 + // loaclWorker is the worker who handles the operation in local TiDB. + // currently it only handle CreateTable job of TiDBDDLV2. + localWorker workerType = 2 // waitDependencyJobInterval is the interval when the dependency job doesn't be done. waitDependencyJobInterval = 200 * time.Millisecond // noneDependencyJob means a job has no dependency-job. @@ -165,6 +169,8 @@ func (w *worker) typeStr() string { str = "general" case addIdxWorker: str = "add index" + case localWorker: + str = "local worker" default: str = "unknown" } @@ -206,34 +212,34 @@ func asyncNotify(ch chan struct{}) { } } -func (d *ddl) limitDDLJobs() { +func (d *ddl) limitDDLJobs(ch chan *limitJobTask, handler func(tasks []*limitJobTask)) { defer tidbutil.Recover(metrics.LabelDDL, "limitDDLJobs", nil, true) tasks := make([]*limitJobTask, 0, batchAddingJobs) for { select { - case task := <-d.limitJobCh: + case task := <-ch: tasks = tasks[:0] - jobLen := len(d.limitJobCh) + jobLen := len(ch) tasks = append(tasks, task) for i := 0; i < jobLen; i++ { - tasks = append(tasks, <-d.limitJobCh) + tasks = append(tasks, <-ch) } - d.addBatchDDLJobs(tasks) + handler(tasks) case <-d.ctx.Done(): return } } } -// addBatchDDLJobs gets global job IDs and puts the DDL jobs in the DDL queue. -func (d *ddl) addBatchDDLJobs(tasks []*limitJobTask) { +// addBatchDDLJobsV1 gets global job IDs and puts the DDL jobs in the DDL queue. +func (d *ddl) addBatchDDLJobsV1(tasks []*limitJobTask) { startTime := time.Now() var err error // DDLForce2Queue is a flag to tell DDL worker to always push the job to the DDL queue. toTable := !variable.DDLForce2Queue.Load() if toTable { - err = d.addBatchDDLJobs2Table(tasks) + err = d.addBatchDDLJobs(tasks) } else { err = d.addBatchDDLJobs2Queue(tasks) } @@ -242,7 +248,7 @@ func (d *ddl) addBatchDDLJobs(tasks []*limitJobTask) { if err == nil { err = task.cacheErr } - task.err <- err + task.NotifyError(err) jobs += task.job.String() + "; " metrics.DDLWorkerHistogram.WithLabelValues(metrics.WorkerAddDDLJob, task.job.Type.String(), metrics.RetLabel(err)).Observe(time.Since(startTime).Seconds()) @@ -254,6 +260,19 @@ func (d *ddl) addBatchDDLJobs(tasks []*limitJobTask) { } } +// addBatchDDLJobsV2 gets global job IDs and delivery the DDL jobs to local TiDB +func (d *ddl) addBatchDDLJobsV2(tasks []*limitJobTask) { + err := d.addBatchDDLJobs(tasks) + if err != nil { + for _, task := range tasks { + task.NotifyError(err) + } + logutil.BgLogger().Error("add DDL jobs failed", zap.String("category", "ddl"), zap.Bool("local_mode", true), zap.Error(err)) + } else { + logutil.BgLogger().Info("add DDL jobs", zap.String("category", "ddl"), zap.Bool("local_mode", true), zap.Int("batch count", len(tasks))) + } +} + // buildJobDependence sets the curjob's dependency-ID. // The dependency-job's ID must less than the current job's ID, and we need the largest one in the list. func buildJobDependence(t *meta.Meta, curJob *model.Job) error { @@ -287,6 +306,9 @@ func buildJobDependence(t *meta.Meta, curJob *model.Job) error { func (d *ddl) addBatchDDLJobs2Queue(tasks []*limitJobTask) error { ctx := kv.WithInternalSourceType(context.Background(), kv.InternalTxnDDL) + // lock to reduce conflict + d.globalIDLock.Lock() + defer d.globalIDLock.Unlock() return kv.RunInNewTxn(ctx, d.store, true, func(ctx context.Context, txn kv.Transaction) error { t := meta.NewMeta(txn) ids, err := t.GenGlobalIDs(len(tasks)) @@ -294,15 +316,9 @@ func (d *ddl) addBatchDDLJobs2Queue(tasks []*limitJobTask) error { return errors.Trace(err) } - jobs, err := t.GetAllDDLJobsInQueue(meta.DefaultJobListKey) - if err != nil { + if err := d.checkFlashbackJobInQueue(t); err != nil { return errors.Trace(err) } - for _, job := range jobs { - if job.Type == model.ActionFlashbackCluster { - return errors.Errorf("Can't add ddl job, have flashback cluster job") - } - } for i, task := range tasks { job := task.job @@ -331,6 +347,19 @@ func (d *ddl) addBatchDDLJobs2Queue(tasks []*limitJobTask) error { }) } +func (*ddl) checkFlashbackJobInQueue(t *meta.Meta) error { + jobs, err := t.GetAllDDLJobsInQueue(meta.DefaultJobListKey) + if err != nil { + return errors.Trace(err) + } + for _, job := range jobs { + if job.Type == model.ActionFlashbackCluster { + return errors.Errorf("Can't add ddl job, have flashback cluster job") + } + } + return nil +} + func injectModifyJobArgFailPoint(job *model.Job) { failpoint.Inject("MockModifyJobArg", func(val failpoint.Value) { if val.(bool) { @@ -355,11 +384,15 @@ func setJobStateToQueueing(job *model.Job) { job.State = model.JobStateQueueing } -// addBatchDDLJobs2Table gets global job IDs and puts the DDL jobs in the DDL job table. -func (d *ddl) addBatchDDLJobs2Table(tasks []*limitJobTask) error { +// addBatchDDLJobs gets global job IDs and puts the DDL jobs in the DDL job table or local worker. +func (d *ddl) addBatchDDLJobs(tasks []*limitJobTask) error { var ids []int64 var err error + if len(tasks) == 0 { + return nil + } + se, err := d.sessPool.Get() if err != nil { return errors.Trace(err) @@ -373,17 +406,42 @@ func (d *ddl) addBatchDDLJobs2Table(tasks []*limitJobTask) error { return errors.Errorf("Can't add ddl job, have flashback cluster job") } - startTS := uint64(0) + var ( + startTS = uint64(0) + bdrRole = string(ast.BDRRoleNone) + ) + + if newTasks, err := d.combineBatchCreateTableJobs(tasks); err == nil { + tasks = newTasks + } + ctx := kv.WithInternalSourceType(context.Background(), kv.InternalTxnDDL) + // lock to reduce conflict + d.globalIDLock.Lock() err = kv.RunInNewTxn(ctx, d.store, true, func(ctx context.Context, txn kv.Transaction) error { t := meta.NewMeta(txn) ids, err = t.GenGlobalIDs(len(tasks)) if err != nil { return errors.Trace(err) } + + bdrRole, err = t.GetBDRRole() + if err != nil { + return errors.Trace(err) + } + startTS = txn.StartTS() + + // for localmode, we still need to check this variable if upgrading below v6.2. + if variable.DDLForce2Queue.Load() { + if err := d.checkFlashbackJobInQueue(t); err != nil { + return err + } + } + return nil }) + d.globalIDLock.Unlock() if err != nil { return errors.Trace(err) } @@ -394,9 +452,25 @@ func (d *ddl) addBatchDDLJobs2Table(tasks []*limitJobTask) error { job.Version = currentVersion job.StartTS = startTS job.ID = ids[i] + job.BDRRole = bdrRole + + // BDR mode only affects the DDL not from CDC + if job.CDCWriteSource == 0 && bdrRole != string(ast.BDRRoleNone) { + if job.Type == model.ActionMultiSchemaChange && job.MultiSchemaInfo != nil { + for _, subJob := range job.MultiSchemaInfo.SubJobs { + if ast.DeniedByBDR(ast.BDRRole(bdrRole), subJob.Type, job) { + return dbterror.ErrBDRRestrictedDDL.FastGenByArgs(bdrRole) + } + } + } else if ast.DeniedByBDR(ast.BDRRole(bdrRole), job.Type, job) { + return dbterror.ErrBDRRestrictedDDL.FastGenByArgs(bdrRole) + } + } + setJobStateToQueueing(job) - if d.stateSyncer.IsUpgradingState() && !hasSysDB(job) { + // currently doesn't support pause job in local mode. + if d.stateSyncer.IsUpgradingState() && !hasSysDB(job) && !job.LocalMode { if err = pauseRunningJob(sess.NewSession(se), job, model.AdminCommandBySystem); err != nil { logutil.BgLogger().Warn("pause user DDL by system failed", zap.String("category", "ddl-upgrading"), zap.Stringer("job", job), zap.Error(err)) task.cacheErr = err @@ -405,15 +479,59 @@ func (d *ddl) addBatchDDLJobs2Table(tasks []*limitJobTask) error { logutil.BgLogger().Info("pause user DDL by system successful", zap.String("category", "ddl-upgrading"), zap.Stringer("job", job)) } + if _, err := job.Encode(true); err != nil { + return err + } + jobTasks = append(jobTasks, job) injectModifyJobArgFailPoint(job) } se.SetDiskFullOpt(kvrpcpb.DiskFullOpt_AllowedOnAlmostFull) + if tasks[0].job.LocalMode { + for _, task := range tasks { + d.localJobCh <- task + } + return nil + } return errors.Trace(insertDDLJobs2Table(sess.NewSession(se), true, jobTasks...)) } +// combineBatchCreateTableJobs combine batch jobs to another batch jobs. +// currently it only support combine CreateTable to CreateTables. +func (d *ddl) combineBatchCreateTableJobs(tasks []*limitJobTask) ([]*limitJobTask, error) { + if len(tasks) <= 1 || !tasks[0].job.LocalMode { + return tasks, nil + } + var schemaName string + jobs := make([]*model.Job, 0, len(tasks)) + for i, task := range tasks { + if task.job.Type != model.ActionCreateTable { + return tasks, nil + } + if i == 0 { + schemaName = task.job.SchemaName + } else if task.job.SchemaName != schemaName { + return tasks, nil + } + jobs = append(jobs, task.job) + } + + job, err := d.BatchCreateTableWithJobs(jobs) + if err != nil { + return tasks, err + } + logutil.BgLogger().Info("combine jobs to batch create table job", zap.String("category", "ddl"), zap.Int("len", len(tasks))) + + jobTask := &limitJobTask{job, []chan error{}, nil} + // combine the error chans. + for _, j := range tasks { + jobTask.errChs = append(jobTask.errChs, j.errChs...) + } + return []*limitJobTask{jobTask}, nil +} + func injectFailPointForGetJob(job *model.Job) { if job == nil { return @@ -440,6 +558,7 @@ func (w *worker) handleUpdateJobError(t *meta.Meta, job *model.Job, err error) e } // Reduce this txn entry size. job.BinlogInfo.Clean() + job.InvolvingSchemaInfo = nil job.Error = toTError(err) job.ErrorCount++ job.SchemaState = model.StateNone @@ -538,7 +657,11 @@ func needUpdateRawArgs(job *model.Job, meetErr bool) bool { return true } -func jobNeedGC(job *model.Job) bool { +// JobNeedGC is called to determine whether delete-ranges need to be generated for the provided job. +// +// NOTICE: BR also uses jobNeedGC to determine whether delete-ranges need to be generated for the provided job. +// Therefore, please make sure any modification is compatible with BR. +func JobNeedGC(job *model.Job) bool { if !job.IsCancelled() { if job.Warning != nil && dbterror.ErrCantDropFieldOrKey.Equal(job.Warning) { // For the field/key not exists warnings, there is no need to @@ -558,7 +681,7 @@ func jobNeedGC(job *model.Job) bool { case model.ActionMultiSchemaChange: for i, sub := range job.MultiSchemaInfo.SubJobs { proxyJob := sub.ToProxyJob(job, i) - needGC := jobNeedGC(&proxyJob) + needGC := JobNeedGC(&proxyJob) if needGC { return true } @@ -578,7 +701,7 @@ func (w *worker) finishDDLJob(t *meta.Meta, job *model.Job) (err error) { markJobFinish(job) }() - if jobNeedGC(job) { + if JobNeedGC(job) { err = w.delRangeManager.addDelRangeJob(w.ctx, job) if err != nil { return errors.Trace(err) @@ -602,9 +725,13 @@ func (w *worker) finishDDLJob(t *meta.Meta, job *model.Job) (err error) { if err != nil { return errors.Trace(err) } - err = w.deleteDDLJob(job) - if err != nil { - return errors.Trace(err) + // for local mode job, we didn't insert the job to ddl table now. + // so no need to delete it. + if !job.LocalMode { + err = w.deleteDDLJob(job) + if err != nil { + return errors.Trace(err) + } } job.BinlogInfo.FinishedTS = t.StartTS @@ -722,6 +849,9 @@ func (w *JobContext) setDDLLabelForDiagnosis(jobType model.ActionType) { } func (w *worker) HandleJobDone(d *ddlCtx, job *model.Job, t *meta.Meta) error { + if err := w.checkOwnerBeforeCommit(); err != nil { + return err + } err := w.finishDDLJob(t, job) if err != nil { w.sess.Rollback() @@ -737,19 +867,10 @@ func (w *worker) HandleJobDone(d *ddlCtx, job *model.Job, t *meta.Meta) error { return nil } -func (w *worker) HandleDDLJobTable(d *ddlCtx, job *model.Job) (int64, error) { - var ( - err error - schemaVer int64 - runJobErr error - ) - defer func() { - w.unlockSeqNum(err) - }() - - err = w.sess.Begin() +func (w *worker) prepareTxn(job *model.Job) (kv.Transaction, error) { + err := w.sess.Begin() if err != nil { - return 0, err + return nil, err } failpoint.Inject("mockRunJobTime", func(val failpoint.Value) { if val.(bool) { @@ -759,7 +880,7 @@ func (w *worker) HandleDDLJobTable(d *ddlCtx, job *model.Job) (int64, error) { txn, err := w.sess.Txn() if err != nil { w.sess.Rollback() - return 0, err + return txn, err } // Only general DDLs are allowed to be executed when TiKV is disk full. if w.tp == addIdxWorker && job.IsRunning() { @@ -772,8 +893,32 @@ func (w *worker) HandleDDLJobTable(d *ddlCtx, job *model.Job) (int64, error) { txn.SetOption(kv.ResourceGroupTagger, tagger) } txn.SetOption(kv.ResourceGroupName, jobContext.resourceGroupName) + // set request source type to DDL type + txn.SetOption(kv.RequestSourceType, jobContext.ddlJobSourceType()) + return txn, err +} - t := meta.NewMeta(txn) +func (w *worker) HandleDDLJobTable(d *ddlCtx, job *model.Job) (int64, error) { + var ( + err error + schemaVer int64 + runJobErr error + ) + defer func() { + w.unlockSeqNum(err) + }() + + txn, err := w.prepareTxn(job) + if err != nil { + return 0, err + } + + var t *meta.Meta + if variable.DDLVersion.Load() == model.TiDBDDLV2 { + t = meta.NewMeta(txn, meta.WithUpdateTableName()) + } else { + t = meta.NewMeta(txn) + } if job.IsDone() || job.IsRollbackDone() { if job.IsDone() { job.State = model.JobStateSynced @@ -785,9 +930,6 @@ func (w *worker) HandleDDLJobTable(d *ddlCtx, job *model.Job) (int64, error) { d.mu.hook.OnJobRunBefore(job) d.mu.RUnlock() - // set request source type to DDL type - txn.SetOption(kv.RequestSourceType, jobContext.ddlJobSourceType()) - // If running job meets error, we will save this error in job Error // and retry later if the job is not cancelled. schemaVer, runJobErr = w.runDDLJob(d, t, job) @@ -803,6 +945,11 @@ func (w *worker) HandleDDLJobTable(d *ddlCtx, job *model.Job) (int64, error) { return 0, err } + if err = w.checkOwnerBeforeCommit(); err != nil { + d.unlockSchemaVersion(job.ID) + return 0, err + } + if runJobErr != nil && !job.IsRollingback() && !job.IsRollbackDone() { // If the running job meets an error // and the job state is rolling back, it means that we have already handled this error. @@ -850,6 +997,54 @@ func (w *worker) HandleDDLJobTable(d *ddlCtx, job *model.Job) (int64, error) { return schemaVer, nil } +func (w *worker) checkOwnerBeforeCommit() error { + if !w.ddlCtx.isOwner() && w.tp != localWorker { + // Since this TiDB instance is not a DDL owner anymore, + // it should not commit any transaction. + w.sess.Rollback() + return dbterror.ErrNotOwner + } + return nil +} + +// HandleDDLJobV2 handles v2 ddl job. +// Compare with v1: +// 1. directly insert the job to history job table(incompatible with CDC). +// 2. no need to wait schema version(only support create table now). +// 3. no register mdl info(only support create table now). +func (w *worker) HandleDDLJobV2(d *ddlCtx, job *model.Job) (err error) { + defer func() { + w.unlockSeqNum(err) + }() + + txn, err := w.prepareTxn(job) + if err != nil { + return err + } + + t := meta.NewMeta(txn, meta.WithUpdateTableName()) + d.mu.RLock() + d.mu.hook.OnJobRunBefore(job) + d.mu.RUnlock() + + _, err = w.runDDLJob(d, t, job) + defer d.unlockSchemaVersion(job.ID) + if err != nil { + return err + } + + d.mu.RLock() + d.mu.hook.OnJobRunAfter(job) + d.mu.RUnlock() + + writeBinlog(d.binlogCli, txn, job) + // reset the SQL digest to make topsql work right. + w.sess.GetSessionVars().StmtCtx.ResetSQLDigest(job.Query) + + job.State = model.JobStateSynced + return w.HandleJobDone(d, job, t) +} + func (w *JobContext) getResourceGroupTaggerForTopSQL() tikvrpc.ResourceGroupTagger { if !topsqlstate.TopSQLEnabled() || w.cacheDigest == nil { return nil @@ -895,23 +1090,6 @@ func writeBinlog(binlogCli *pumpcli.PumpsClient, txn kv.Transaction, job *model. } } -// waitDependencyJobFinished waits for the dependency-job to be finished. -// If the dependency job isn't finished yet, we'd better wait a moment. -func (w *worker) waitDependencyJobFinished(job *model.Job, cnt *int) { - if job.DependencyID != noneDependencyJob { - intervalCnt := int(3 * time.Second / waitDependencyJobInterval) - if *cnt%intervalCnt == 0 { - w.jobLogger(job).Info("DDL job need to wait dependent job, sleeps a while, then retries it.", - zap.Int64("dependentJobID", job.DependencyID), - zap.Duration("waitTime", waitDependencyJobInterval)) - } - time.Sleep(waitDependencyJobInterval) - *cnt++ - } else { - *cnt = 0 - } -} - func chooseLeaseTime(t, max time.Duration) time.Duration { if t == 0 || t > max { return max diff --git a/pkg/ddl/ddl_worker_test.go b/pkg/ddl/ddl_worker_test.go index 9d6abc20dece7..4fe7026959b4a 100644 --- a/pkg/ddl/ddl_worker_test.go +++ b/pkg/ddl/ddl_worker_test.go @@ -263,46 +263,46 @@ func TestParallelDDL(t *testing.T) { func TestJobNeedGC(t *testing.T) { job := &model.Job{Type: model.ActionAddIndex, State: model.JobStateCancelled} - require.False(t, ddl.JobNeedGCForTest(job)) + require.False(t, ddl.JobNeedGC(job)) job = &model.Job{Type: model.ActionAddColumn, State: model.JobStateDone} - require.False(t, ddl.JobNeedGCForTest(job)) + require.False(t, ddl.JobNeedGC(job)) job = &model.Job{Type: model.ActionAddIndex, State: model.JobStateDone} - require.True(t, ddl.JobNeedGCForTest(job)) + require.True(t, ddl.JobNeedGC(job)) job = &model.Job{Type: model.ActionAddPrimaryKey, State: model.JobStateDone} - require.True(t, ddl.JobNeedGCForTest(job)) + require.True(t, ddl.JobNeedGC(job)) job = &model.Job{Type: model.ActionAddIndex, State: model.JobStateRollbackDone} - require.True(t, ddl.JobNeedGCForTest(job)) + require.True(t, ddl.JobNeedGC(job)) job = &model.Job{Type: model.ActionAddPrimaryKey, State: model.JobStateRollbackDone} - require.True(t, ddl.JobNeedGCForTest(job)) + require.True(t, ddl.JobNeedGC(job)) job = &model.Job{Type: model.ActionMultiSchemaChange, State: model.JobStateDone, MultiSchemaInfo: &model.MultiSchemaInfo{ SubJobs: []*model.SubJob{ {Type: model.ActionAddColumn, State: model.JobStateDone}, {Type: model.ActionRebaseAutoID, State: model.JobStateDone}, }}} - require.False(t, ddl.JobNeedGCForTest(job)) + require.False(t, ddl.JobNeedGC(job)) job = &model.Job{Type: model.ActionMultiSchemaChange, State: model.JobStateDone, MultiSchemaInfo: &model.MultiSchemaInfo{ SubJobs: []*model.SubJob{ {Type: model.ActionAddIndex, State: model.JobStateDone}, {Type: model.ActionAddColumn, State: model.JobStateDone}, {Type: model.ActionRebaseAutoID, State: model.JobStateDone}, }}} - require.True(t, ddl.JobNeedGCForTest(job)) + require.True(t, ddl.JobNeedGC(job)) job = &model.Job{Type: model.ActionMultiSchemaChange, State: model.JobStateDone, MultiSchemaInfo: &model.MultiSchemaInfo{ SubJobs: []*model.SubJob{ {Type: model.ActionAddIndex, State: model.JobStateDone}, {Type: model.ActionDropColumn, State: model.JobStateDone}, {Type: model.ActionRebaseAutoID, State: model.JobStateDone}, }}} - require.True(t, ddl.JobNeedGCForTest(job)) + require.True(t, ddl.JobNeedGC(job)) job = &model.Job{Type: model.ActionMultiSchemaChange, State: model.JobStateRollbackDone, MultiSchemaInfo: &model.MultiSchemaInfo{ SubJobs: []*model.SubJob{ {Type: model.ActionAddIndex, State: model.JobStateRollbackDone}, {Type: model.ActionAddColumn, State: model.JobStateRollbackDone}, {Type: model.ActionRebaseAutoID, State: model.JobStateCancelled}, }}} - require.True(t, ddl.JobNeedGCForTest(job)) + require.True(t, ddl.JobNeedGC(job)) } func TestUsingReorgCtx(t *testing.T) { diff --git a/pkg/ddl/ddl_workerpool_test.go b/pkg/ddl/ddl_workerpool_test.go index 5a6e9418b7798..80bdf6cd3f13a 100644 --- a/pkg/ddl/ddl_workerpool_test.go +++ b/pkg/ddl/ddl_workerpool_test.go @@ -27,7 +27,7 @@ func TestDDLWorkerPool(t *testing.T) { return wk, nil } } - pool := newDDLWorkerPool(pools.NewResourcePool(f(), 1, 2, 0), reorg) + pool := newDDLWorkerPool(pools.NewResourcePool(f(), 1, 2, 0), jobTypeReorg) pool.close() pool.put(nil) } diff --git a/pkg/ddl/delete_range.go b/pkg/ddl/delete_range.go index c06ebe4a62432..572c9dd35c7f6 100644 --- a/pkg/ddl/delete_range.go +++ b/pkg/ddl/delete_range.go @@ -17,7 +17,6 @@ package ddl import ( "context" "encoding/hex" - "fmt" "math" "strings" "sync" @@ -41,12 +40,17 @@ import ( const ( insertDeleteRangeSQLPrefix = `INSERT IGNORE INTO mysql.gc_delete_range VALUES ` insertDeleteRangeSQLValue = `(%?, %?, %?, %?, %?)` - insertDeleteRangeSQL = insertDeleteRangeSQLPrefix + insertDeleteRangeSQLValue delBatchSize = 65536 delBackLog = 128 ) +// Only used in the BR unit test. Once these const variables modified, please make sure compatible with BR. +const ( + BRInsertDeleteRangeSQLPrefix = insertDeleteRangeSQLPrefix + BRInsertDeleteRangeSQLValue = insertDeleteRangeSQLValue +) + var ( // batchInsertDeleteRangeSize is the maximum size for each batch insert statement in the delete-range. batchInsertDeleteRangeSize = 256 @@ -96,11 +100,9 @@ func (dr *delRange) addDelRangeJob(ctx context.Context, job *model.Job) error { } defer dr.sessPool.Put(sctx) - if job.MultiSchemaInfo != nil { - err = insertJobIntoDeleteRangeTableMultiSchema(ctx, sctx, job) - } else { - err = insertJobIntoDeleteRangeTable(ctx, sctx, job, &elementIDAlloc{}) - } + // The same Job ID uses the same element ID allocator + wrapper := newDelRangeExecWrapper(sctx) + err = AddDelRangeJobInternal(ctx, wrapper, job) if err != nil { logutil.BgLogger().Error("add job into delete-range table failed", zap.String("category", "ddl"), zap.Int64("jobID", job.ID), zap.String("jobType", job.Type.String()), zap.Error(err)) return errors.Trace(err) @@ -112,12 +114,23 @@ func (dr *delRange) addDelRangeJob(ctx context.Context, job *model.Job) error { return nil } -func insertJobIntoDeleteRangeTableMultiSchema(ctx context.Context, sctx sessionctx.Context, job *model.Job) error { +// AddDelRangeJobInternal implements the generation the delete ranges for the provided job and consumes the delete ranges through delRangeExecWrapper. +func AddDelRangeJobInternal(ctx context.Context, wrapper DelRangeExecWrapper, job *model.Job) error { + var err error var ea elementIDAlloc + if job.MultiSchemaInfo != nil { + err = insertJobIntoDeleteRangeTableMultiSchema(ctx, wrapper, job, &ea) + } else { + err = insertJobIntoDeleteRangeTable(ctx, wrapper, job, &ea) + } + return errors.Trace(err) +} + +func insertJobIntoDeleteRangeTableMultiSchema(ctx context.Context, wrapper DelRangeExecWrapper, job *model.Job, ea *elementIDAlloc) error { for i, sub := range job.MultiSchemaInfo.SubJobs { proxyJob := sub.ToProxyJob(job, i) - if jobNeedGC(&proxyJob) { - err := insertJobIntoDeleteRangeTable(ctx, sctx, &proxyJob, &ea) + if JobNeedGC(&proxyJob) { + err := insertJobIntoDeleteRangeTable(ctx, wrapper, &proxyJob, ea) if err != nil { return errors.Trace(err) } @@ -262,14 +275,12 @@ func (dr *delRange) doTask(sctx sessionctx.Context, r util.DelRangeTask) error { // insertJobIntoDeleteRangeTable parses the job into delete-range arguments, // and inserts a new record into gc_delete_range table. The primary key is // (job ID, element ID), so we ignore key conflict error. -func insertJobIntoDeleteRangeTable(ctx context.Context, sctx sessionctx.Context, job *model.Job, ea *elementIDAlloc) error { - now, err := getNowTSO(sctx) - if err != nil { +func insertJobIntoDeleteRangeTable(ctx context.Context, wrapper DelRangeExecWrapper, job *model.Job, ea *elementIDAlloc) error { + if err := wrapper.UpdateTSOForJob(); err != nil { return errors.Trace(err) } ctx = kv.WithInternalSourceType(ctx, getDDLRequestSource(job.Type)) - s := sctx.(sqlexec.SQLExecutor) switch job.Type { case model.ActionDropSchema: var tableIDs []int64 @@ -281,7 +292,7 @@ func insertJobIntoDeleteRangeTable(ctx context.Context, sctx sessionctx.Context, if batchEnd > i+batchInsertDeleteRangeSize { batchEnd = i + batchInsertDeleteRangeSize } - if err := doBatchInsert(ctx, s, job.ID, tableIDs[i:batchEnd], now, ea); err != nil { + if err := doBatchDeleteTablesRange(ctx, wrapper, job.ID, tableIDs[i:batchEnd], ea, "drop schema: table IDs"); err != nil { return errors.Trace(err) } } @@ -295,24 +306,13 @@ func insertJobIntoDeleteRangeTable(ctx context.Context, sctx sessionctx.Context, return errors.Trace(err) } if len(physicalTableIDs) > 0 { - for _, pid := range physicalTableIDs { - startKey = tablecodec.EncodeTablePrefix(pid) - endKey := tablecodec.EncodeTablePrefix(pid + 1) - elemID := ea.allocForPhysicalID(pid) - if err := doInsert(ctx, s, job.ID, elemID, startKey, endKey, now, fmt.Sprintf("partition ID is %d", pid)); err != nil { - return errors.Trace(err) - } + if err := doBatchDeleteTablesRange(ctx, wrapper, job.ID, physicalTableIDs, ea, "drop table: partition table IDs"); err != nil { + return errors.Trace(err) } // logical table may contain global index regions, so delete the logical table range. - startKey = tablecodec.EncodeTablePrefix(tableID) - endKey := tablecodec.EncodeTablePrefix(tableID + 1) - elemID := ea.allocForPhysicalID(tableID) - return doInsert(ctx, s, job.ID, elemID, startKey, endKey, now, fmt.Sprintf("table ID is %d", tableID)) + return errors.Trace(doBatchDeleteTablesRange(ctx, wrapper, job.ID, []int64{tableID}, ea, "drop table: table ID")) } - startKey = tablecodec.EncodeTablePrefix(tableID) - endKey := tablecodec.EncodeTablePrefix(tableID + 1) - elemID := ea.allocForPhysicalID(tableID) - return doInsert(ctx, s, job.ID, elemID, startKey, endKey, now, fmt.Sprintf("table ID is %d", tableID)) + return errors.Trace(doBatchDeleteTablesRange(ctx, wrapper, job.ID, []int64{tableID}, ea, "drop table: table ID")) case model.ActionDropTablePartition, model.ActionTruncateTablePartition, model.ActionReorganizePartition, model.ActionRemovePartitioning, model.ActionAlterTablePartitioning: @@ -324,14 +324,7 @@ func insertJobIntoDeleteRangeTable(ctx context.Context, sctx sessionctx.Context, if err := job.DecodeArgs(&physicalTableIDs, &partInfo); err != nil { return errors.Trace(err) } - for _, physicalTableID := range physicalTableIDs { - startKey := tablecodec.EncodeTablePrefix(physicalTableID) - endKey := tablecodec.EncodeTablePrefix(physicalTableID + 1) - elemID := ea.allocForPhysicalID(physicalTableID) - if err := doInsert(ctx, s, job.ID, elemID, startKey, endKey, now, fmt.Sprintf("partition table ID is %d", physicalTableID)); err != nil { - return errors.Trace(err) - } - } + return errors.Trace(doBatchDeleteTablesRange(ctx, wrapper, job.ID, physicalTableIDs, ea, "drop partition: physical table ID(s)")) // ActionAddIndex, ActionAddPrimaryKey needs do it, because it needs to be rolled back when it's canceled. case model.ActionAddIndex, model.ActionAddPrimaryKey: allIndexIDs := make([]int64, 1) @@ -357,13 +350,8 @@ func insertJobIntoDeleteRangeTable(ctx context.Context, sctx sessionctx.Context, indexIDs = []int64{tempIdxID} } for _, pid := range physicalIDs { - for _, iid := range indexIDs { - startKey := tablecodec.EncodeTableIndexPrefix(pid, iid) - endKey := tablecodec.EncodeTableIndexPrefix(pid, iid+1) - elemID := ea.allocForIndexID(pid, iid) - if err := doInsert(ctx, s, job.ID, elemID, startKey, endKey, now, fmt.Sprintf("physical ID is %d", pid)); err != nil { - return errors.Trace(err) - } + if err := doBatchDeleteIndiceRange(ctx, wrapper, job.ID, pid, indexIDs, ea, "add index: physical table ID(s)"); err != nil { + return errors.Trace(err) } } } @@ -378,29 +366,18 @@ func insertJobIntoDeleteRangeTable(ctx context.Context, sctx sessionctx.Context, return errors.Trace(err) } } - for _, indexID := range allIndexIDs { - // partitionIDs len is 0 if the dropped index is a global index, even if it is a partitioned table. - if len(partitionIDs) == 0 { - startKey := tablecodec.EncodeTableIndexPrefix(tableID, indexID) - endKey := tablecodec.EncodeTableIndexPrefix(tableID, indexID+1) - elemID := ea.allocForIndexID(tableID, indexID) - if err := doInsert(ctx, s, job.ID, elemID, startKey, endKey, now, fmt.Sprintf("index ID is %d", indexID)); err != nil { - return errors.Trace(err) - } - continue + // partitionIDs len is 0 if the dropped index is a global index, even if it is a partitioned table. + if len(partitionIDs) == 0 { + return errors.Trace(doBatchDeleteIndiceRange(ctx, wrapper, job.ID, tableID, allIndexIDs, ea, "drop index: table ID")) + } + failpoint.Inject("checkDropGlobalIndex", func(val failpoint.Value) { + if val.(bool) { + panic("drop global index must not delete partition index range") } - failpoint.Inject("checkDropGlobalIndex", func(val failpoint.Value) { - if val.(bool) { - panic("drop global index must not delete partition index range") - } - }) - for _, pid := range partitionIDs { - startKey := tablecodec.EncodeTableIndexPrefix(pid, indexID) - endKey := tablecodec.EncodeTableIndexPrefix(pid, indexID+1) - elemID := ea.allocForIndexID(pid, indexID) - if err := doInsert(ctx, s, job.ID, elemID, startKey, endKey, now, fmt.Sprintf("partition table ID is %d", pid)); err != nil { - return errors.Trace(err) - } + }) + for _, pid := range partitionIDs { + if err := doBatchDeleteIndiceRange(ctx, wrapper, job.ID, pid, allIndexIDs, ea, "drop index: partition table ID"); err != nil { + return errors.Trace(err) } } case model.ActionDropColumn: @@ -413,10 +390,10 @@ func insertJobIntoDeleteRangeTable(ctx context.Context, sctx sessionctx.Context, } if len(indexIDs) > 0 { if len(partitionIDs) == 0 { - return doBatchDeleteIndiceRange(ctx, s, job.ID, job.TableID, indexIDs, now, ea) + return errors.Trace(doBatchDeleteIndiceRange(ctx, wrapper, job.ID, job.TableID, indexIDs, ea, "drop column: table ID")) } for _, pid := range partitionIDs { - if err := doBatchDeleteIndiceRange(ctx, s, job.ID, pid, indexIDs, now, ea); err != nil { + if err := doBatchDeleteIndiceRange(ctx, wrapper, job.ID, pid, indexIDs, ea, "drop column: partition table ID"); err != nil { return errors.Trace(err) } } @@ -431,10 +408,10 @@ func insertJobIntoDeleteRangeTable(ctx context.Context, sctx sessionctx.Context, return nil } if len(partitionIDs) == 0 { - return doBatchDeleteIndiceRange(ctx, s, job.ID, job.TableID, indexIDs, now, ea) + return doBatchDeleteIndiceRange(ctx, wrapper, job.ID, job.TableID, indexIDs, ea, "modify column: table ID") } for _, pid := range partitionIDs { - if err := doBatchDeleteIndiceRange(ctx, s, job.ID, pid, indexIDs, now, ea); err != nil { + if err := doBatchDeleteIndiceRange(ctx, wrapper, job.ID, pid, indexIDs, ea, "modify column: partition table ID"); err != nil { return errors.Trace(err) } } @@ -442,11 +419,15 @@ func insertJobIntoDeleteRangeTable(ctx context.Context, sctx sessionctx.Context, return nil } -func doBatchDeleteIndiceRange(ctx context.Context, s sqlexec.SQLExecutor, jobID, tableID int64, indexIDs []int64, ts uint64, ea *elementIDAlloc) error { - logutil.BgLogger().Info("batch insert into delete-range indices", zap.String("category", "ddl"), zap.Int64("jobID", jobID), zap.Int64("tableID", tableID), zap.Int64s("indexIDs", indexIDs)) - paramsList := make([]interface{}, 0, len(indexIDs)*5) +func doBatchDeleteIndiceRange(ctx context.Context, wrapper DelRangeExecWrapper, jobID, tableID int64, indexIDs []int64, ea *elementIDAlloc, comment string) error { + logutil.BgLogger().Info("insert into delete-range indices", zap.String("category", "ddl"), zap.Int64("jobID", jobID), zap.Int64("tableID", tableID), zap.Int64s("indexIDs", indexIDs), zap.String("comment", comment)) var buf strings.Builder buf.WriteString(insertDeleteRangeSQLPrefix) + wrapper.PrepareParamsList(len(indexIDs) * 5) + tableID, ok := wrapper.RewriteTableID(tableID) + if !ok { + return nil + } for i, indexID := range indexIDs { startKey := tablecodec.EncodeTableIndexPrefix(tableID, indexID) endKey := tablecodec.EncodeTableIndexPrefix(tableID, indexID+1) @@ -457,31 +438,22 @@ func doBatchDeleteIndiceRange(ctx context.Context, s sqlexec.SQLExecutor, jobID, buf.WriteString(",") } elemID := ea.allocForIndexID(tableID, indexID) - paramsList = append(paramsList, jobID, elemID, startKeyEncoded, endKeyEncoded, ts) + wrapper.AppendParamsList(jobID, elemID, startKeyEncoded, endKeyEncoded) } - _, err := s.ExecuteInternal(ctx, buf.String(), paramsList...) - return errors.Trace(err) -} -func doInsert(ctx context.Context, s sqlexec.SQLExecutor, jobID, elementID int64, startKey, endKey kv.Key, ts uint64, comment string) error { - logutil.BgLogger().Info("insert into delete-range table", zap.String("category", "ddl"), zap.Int64("jobID", jobID), zap.Int64("elementID", elementID), zap.String("comment", comment)) - startKeyEncoded := hex.EncodeToString(startKey) - endKeyEncoded := hex.EncodeToString(endKey) - // set session disk full opt - // TODO ddl txn func including an session pool txn, there may be a problem? - s.SetDiskFullOpt(kvrpcpb.DiskFullOpt_AllowedOnAlmostFull) - _, err := s.ExecuteInternal(ctx, insertDeleteRangeSQL, jobID, elementID, startKeyEncoded, endKeyEncoded, ts) - // clear session disk full opt - s.ClearDiskFullOpt() - return errors.Trace(err) + return errors.Trace(wrapper.ConsumeDeleteRange(ctx, buf.String())) } -func doBatchInsert(ctx context.Context, s sqlexec.SQLExecutor, jobID int64, tableIDs []int64, ts uint64, ea *elementIDAlloc) error { - logutil.BgLogger().Info("batch insert into delete-range table", zap.String("category", "ddl"), zap.Int64("jobID", jobID), zap.Int64s("tableIDs", tableIDs)) +func doBatchDeleteTablesRange(ctx context.Context, wrapper DelRangeExecWrapper, jobID int64, tableIDs []int64, ea *elementIDAlloc, comment string) error { + logutil.BgLogger().Info("insert into delete-range table", zap.String("category", "ddl"), zap.Int64("jobID", jobID), zap.Int64s("tableIDs", tableIDs), zap.String("comment", comment)) var buf strings.Builder buf.WriteString(insertDeleteRangeSQLPrefix) - paramsList := make([]interface{}, 0, len(tableIDs)*5) + wrapper.PrepareParamsList(len(tableIDs) * 5) for i, tableID := range tableIDs { + tableID, ok := wrapper.RewriteTableID(tableID) + if !ok { + continue + } startKey := tablecodec.EncodeTablePrefix(tableID) endKey := tablecodec.EncodeTablePrefix(tableID + 1) startKeyEncoded := hex.EncodeToString(startKey) @@ -491,13 +463,79 @@ func doBatchInsert(ctx context.Context, s sqlexec.SQLExecutor, jobID int64, tabl buf.WriteString(",") } elemID := ea.allocForPhysicalID(tableID) - paramsList = append(paramsList, jobID, elemID, startKeyEncoded, endKeyEncoded, ts) + wrapper.AppendParamsList(jobID, elemID, startKeyEncoded, endKeyEncoded) } + + return errors.Trace(wrapper.ConsumeDeleteRange(ctx, buf.String())) +} + +// DelRangeExecWrapper consumes the delete ranges with the provided table ID(s) and index ID(s). +type DelRangeExecWrapper interface { + // generate a new tso for the next job + UpdateTSOForJob() error + + // initialize the paramsList + PrepareParamsList(sz int) + + // rewrite table id if necessary, used for BR + RewriteTableID(tableID int64) (int64, bool) + + // (job_id, element_id, start_key, end_key, ts) + // ts is generated by delRangeExecWrapper itself + AppendParamsList(jobID, elemID int64, startKey, endKey string) + + // consume the delete range. For TiDB Server, it insert rows into mysql.gc_delete_range. + ConsumeDeleteRange(ctx context.Context, sql string) error +} + +// sessionDelRangeExecWrapper is a lightweight wrapper that implements the DelRangeExecWrapper interface and used for TiDB Server. +// It consumes the delete ranges by directly insert rows into mysql.gc_delete_range. +type sessionDelRangeExecWrapper struct { + sctx sessionctx.Context + s sqlexec.SQLExecutor + ts uint64 + + // temporary values + paramsList []interface{} +} + +func newDelRangeExecWrapper(sctx sessionctx.Context) DelRangeExecWrapper { + return &sessionDelRangeExecWrapper{ + sctx: sctx, + s: sctx.(sqlexec.SQLExecutor), + + paramsList: nil, + } +} + +func (sdr *sessionDelRangeExecWrapper) UpdateTSOForJob() error { + now, err := getNowTSO(sdr.sctx) + if err != nil { + return errors.Trace(err) + } + sdr.ts = now + return nil +} + +func (sdr *sessionDelRangeExecWrapper) PrepareParamsList(sz int) { + sdr.paramsList = make([]interface{}, 0, sz) +} + +func (*sessionDelRangeExecWrapper) RewriteTableID(tableID int64) (int64, bool) { + return tableID, true +} + +func (sdr *sessionDelRangeExecWrapper) AppendParamsList(jobID, elemID int64, startKey, endKey string) { + sdr.paramsList = append(sdr.paramsList, jobID, elemID, startKey, endKey, sdr.ts) +} + +func (sdr *sessionDelRangeExecWrapper) ConsumeDeleteRange(ctx context.Context, sql string) error { // set session disk full opt - s.SetDiskFullOpt(kvrpcpb.DiskFullOpt_AllowedOnAlmostFull) - _, err := s.ExecuteInternal(ctx, buf.String(), paramsList...) + sdr.s.SetDiskFullOpt(kvrpcpb.DiskFullOpt_AllowedOnAlmostFull) + _, err := sdr.s.ExecuteInternal(ctx, sql, sdr.paramsList...) // clear session disk full opt - s.ClearDiskFullOpt() + sdr.s.ClearDiskFullOpt() + sdr.paramsList = nil return errors.Trace(err) } diff --git a/pkg/ddl/foreign_key.go b/pkg/ddl/foreign_key.go index ce3f17d1353cc..bcb26bb08e6df 100644 --- a/pkg/ddl/foreign_key.go +++ b/pkg/ddl/foreign_key.go @@ -325,8 +325,7 @@ func checkModifyColumnWithForeignKeyConstraint(is infoschema.InfoSchema, dbName if newCol.GetType() != referCol.GetType() { return dbterror.ErrFKIncompatibleColumns.GenWithStackByArgs(originalCol.Name, fkInfo.RefCols[i], fkInfo.Name) } - if newCol.GetFlen() < referCol.GetFlen() || newCol.GetFlen() < originalCol.GetFlen() || - (newCol.GetType() == mysql.TypeNewDecimal && (newCol.GetFlen() != originalCol.GetFlen() || newCol.GetDecimal() != originalCol.GetDecimal())) { + if !isAcceptableForeignKeyColumnChange(newCol, originalCol, referCol) { return dbterror.ErrForeignKeyColumnCannotChange.GenWithStackByArgs(originalCol.Name, fkInfo.Name) } } @@ -351,8 +350,7 @@ func checkModifyColumnWithForeignKeyConstraint(is infoschema.InfoSchema, dbName if newCol.GetType() != childCol.GetType() { return dbterror.ErrFKIncompatibleColumns.GenWithStackByArgs(childCol.Name, originalCol.Name, referredFK.ChildFKName) } - if newCol.GetFlen() < childCol.GetFlen() || newCol.GetFlen() < originalCol.GetFlen() || - (newCol.GetType() == mysql.TypeNewDecimal && (newCol.GetFlen() != childCol.GetFlen() || newCol.GetDecimal() != childCol.GetDecimal())) { + if !isAcceptableForeignKeyColumnChange(newCol, originalCol, childCol) { return dbterror.ErrForeignKeyColumnCannotChangeChild.GenWithStackByArgs(originalCol.Name, referredFK.ChildFKName, referredFK.ChildSchema.L+"."+referredFK.ChildTable.L) } } @@ -362,6 +360,29 @@ func checkModifyColumnWithForeignKeyConstraint(is infoschema.InfoSchema, dbName return nil } +func isAcceptableForeignKeyColumnChange(newCol, originalCol, relatedCol *model.ColumnInfo) bool { + switch newCol.GetType() { + case mysql.TypeTiny, mysql.TypeShort, mysql.TypeInt24, mysql.TypeLong, mysql.TypeLonglong: + // For integer data types, value from GetFlen indicates the minimum display width and is unrelated to the range of values a type can store. + // We don't have to prevent the length change. See: https://dev.mysql.com/doc/refman/8.0/en/numeric-type-syntax.html + return true + } + + if newCol.GetFlen() < relatedCol.GetFlen() { + return false + } + if newCol.GetFlen() < originalCol.GetFlen() { + return false + } + if newCol.GetType() == mysql.TypeNewDecimal { + if newCol.GetFlen() != originalCol.GetFlen() || newCol.GetDecimal() != originalCol.GetDecimal() { + return false + } + } + + return true +} + func checkTableHasForeignKeyReferred(is infoschema.InfoSchema, schema, tbl string, ignoreTables []ast.Ident, fkCheck bool) *model.ReferredFKInfo { if !fkCheck { return nil diff --git a/pkg/ddl/generated_column.go b/pkg/ddl/generated_column.go index 098e3609af9ce..13d508f02bd2e 100644 --- a/pkg/ddl/generated_column.go +++ b/pkg/ddl/generated_column.go @@ -252,7 +252,7 @@ func checkModifyGeneratedColumn(sctx sessionctx.Context, schemaName model.CIStr, if newCol.IsGenerated() { // rule 3. - if err := checkIllegalFn4Generated(newCol.Name.L, typeColumn, newCol.GeneratedExpr); err != nil { + if err := checkIllegalFn4Generated(newCol.Name.L, typeColumn, newCol.GeneratedExpr.Internal()); err != nil { return errors.Trace(err) } diff --git a/pkg/ddl/index.go b/pkg/ddl/index.go index cd7c897a08dd6..dd37461bf8c98 100644 --- a/pkg/ddl/index.go +++ b/pkg/ddl/index.go @@ -36,9 +36,9 @@ import ( "github.com/pingcap/tidb/pkg/ddl/copr" "github.com/pingcap/tidb/pkg/ddl/ingest" sess "github.com/pingcap/tidb/pkg/ddl/internal/session" - "github.com/pingcap/tidb/pkg/disttask/framework/dispatcher" "github.com/pingcap/tidb/pkg/disttask/framework/handle" "github.com/pingcap/tidb/pkg/disttask/framework/proto" + "github.com/pingcap/tidb/pkg/disttask/framework/scheduler" "github.com/pingcap/tidb/pkg/disttask/framework/storage" "github.com/pingcap/tidb/pkg/infoschema" "github.com/pingcap/tidb/pkg/kv" @@ -1883,6 +1883,7 @@ func (w *addIndexTxnWorker) BackfillData(handleRange reorgBackfillTask) (taskCtx taskCtx.finishTS = txn.StartTS() taskCtx.addedCount = 0 taskCtx.scanCount = 0 + updateTxnEntrySizeLimitIfNeeded(txn) txn.SetOption(kv.Priority, handleRange.priority) if tagger := w.GetCtx().getResourceGroupTaggerForTopSQL(jobID); tagger != nil { txn.SetOption(kv.ResourceGroupTagger, tagger) @@ -1966,7 +1967,7 @@ func (w *worker) addTableIndex(t table.Table, reorgInfo *reorgInfo) error { // TODO: Support typeAddIndexMergeTmpWorker. if reorgInfo.ReorgMeta.IsDistReorg && !reorgInfo.mergingTmpIdx { if reorgInfo.ReorgMeta.ReorgTp == model.ReorgTypeLitMerge { - err := w.executeDistGlobalTask(reorgInfo) + err := w.executeDistTask(reorgInfo) if err != nil { return err } @@ -2048,7 +2049,7 @@ var MockDMLExecutionOnDDLPaused func() // TestSyncChan is used to sync the test. var TestSyncChan = make(chan struct{}) -func (w *worker) executeDistGlobalTask(reorgInfo *reorgInfo) error { +func (w *worker) executeDistTask(reorgInfo *reorgInfo) error { if reorgInfo.mergingTmpIdx { return errors.New("do not support merge index") } @@ -2066,16 +2067,16 @@ func (w *worker) executeDistGlobalTask(reorgInfo *reorgInfo) error { } // For resuming add index task. - // Need to fetch global task by taskKey in tidb_global_task and tidb_global_task_history tables. - // When pausing the related ddl job, it is possible that the global task with taskKey is succeed and in tidb_global_task_history. + // Need to fetch task by taskKey in tidb_global_task and tidb_global_task_history tables. + // When pausing the related ddl job, it is possible that the task with taskKey is succeed and in tidb_global_task_history. // As a result, when resuming the related ddl job, // it is necessary to check task exits in tidb_global_task and tidb_global_task_history tables. taskManager, err := storage.GetTaskManager() if err != nil { return err } - task, err := taskManager.GetGlobalTaskByKeyWithHistory(w.ctx, taskKey) - if err != nil { + task, err := taskManager.GetTaskByKeyWithHistory(w.ctx, taskKey) + if err != nil && err != storage.ErrTaskNotFound { return err } if task != nil { @@ -2083,15 +2084,15 @@ func (w *worker) executeDistGlobalTask(reorgInfo *reorgInfo) error { // When task in succeed state, we can skip the dist task execution/scheduing process. if task.State == proto.TaskStateSucceed { logutil.BgLogger().Info( - "global task succeed, start to resume the ddl job", + "task succeed, start to resume the ddl job", zap.String("category", "ddl"), zap.String("task-key", taskKey)) return nil } g.Go(func() error { defer close(done) - backoffer := backoff.NewExponential(dispatcher.RetrySQLInterval, 2, dispatcher.RetrySQLMaxInterval) - err := handle.RunWithRetry(ctx, dispatcher.RetrySQLTimes, backoffer, logutil.BgLogger(), + backoffer := backoff.NewExponential(scheduler.RetrySQLInterval, 2, scheduler.RetrySQLMaxInterval) + err := handle.RunWithRetry(ctx, scheduler.RetrySQLTimes, backoffer, logutil.BgLogger(), func(ctx context.Context) (bool, error) { return true, handle.ResumeTask(w.ctx, taskKey) }, @@ -2099,7 +2100,7 @@ func (w *worker) executeDistGlobalTask(reorgInfo *reorgInfo) error { if err != nil { return err } - err = handle.WaitGlobalTask(ctx, task) + err = handle.WaitTaskDoneOrPaused(ctx, task.ID) if err := w.isReorgRunnable(reorgInfo.Job.ID, true); err != nil { if dbterror.ErrPausedDDLJob.Equal(err) { logutil.BgLogger().Warn("job paused by user", zap.String("category", "ddl"), zap.Error(err)) @@ -2115,8 +2116,17 @@ func (w *worker) executeDistGlobalTask(reorgInfo *reorgInfo) error { } job := reorgInfo.Job - taskMeta := &BackfillGlobalMeta{ - Job: *reorgInfo.Job.Clone(), + workerCntLimit := int(variable.GetDDLReorgWorkerCounter()) + cpuCount, err := handle.GetCPUCountOfManagedNode(ctx) + if err != nil { + return err + } + concurrency := min(workerCntLimit, cpuCount) + logutil.BgLogger().Info("adjusted add-index task concurrency", + zap.Int("worker-cnt", workerCntLimit), zap.Int("task-concurrency", concurrency), + zap.String("task-key", taskKey)) + taskMeta := &BackfillTaskMeta{ + Job: *job.Clone(), EleIDs: elemIDs, EleTypeKey: reorgInfo.currElement.TypeKey, CloudStorageURI: w.jobContext(job.ID, job.ReorgMeta).cloudStorageURI, @@ -2129,7 +2139,7 @@ func (w *worker) executeDistGlobalTask(reorgInfo *reorgInfo) error { g.Go(func() error { defer close(done) - err := handle.SubmitAndRunGlobalTask(ctx, taskKey, taskType, distPhysicalTableConcurrency, metaData) + err := submitAndWaitTask(ctx, taskKey, taskType, concurrency, metaData) failpoint.Inject("pauseAfterDistTaskFinished", func() { MockDMLExecutionOnTaskFinished() }) @@ -2157,7 +2167,7 @@ func (w *worker) executeDistGlobalTask(reorgInfo *reorgInfo) error { if err = w.isReorgRunnable(reorgInfo.Job.ID, true); err != nil { if dbterror.ErrPausedDDLJob.Equal(err) { if err = handle.PauseTask(w.ctx, taskKey); err != nil { - logutil.BgLogger().Error("pause global task error", zap.String("category", "ddl"), zap.String("task_key", taskKey), zap.Error(err)) + logutil.BgLogger().Error("pause task error", zap.String("category", "ddl"), zap.String("task_key", taskKey), zap.Error(err)) continue } failpoint.Inject("syncDDLTaskPause", func() { @@ -2168,9 +2178,9 @@ func (w *worker) executeDistGlobalTask(reorgInfo *reorgInfo) error { if !dbterror.ErrCancelledDDLJob.Equal(err) { return errors.Trace(err) } - if err = handle.CancelGlobalTask(w.ctx, taskKey); err != nil { - logutil.BgLogger().Error("cancel global task error", zap.String("category", "ddl"), zap.String("task_key", taskKey), zap.Error(err)) - // continue to cancel global task. + if err = handle.CancelTask(w.ctx, taskKey); err != nil { + logutil.BgLogger().Error("cancel task error", zap.String("category", "ddl"), zap.String("task_key", taskKey), zap.Error(err)) + // continue to cancel task. continue } } @@ -2189,12 +2199,12 @@ func (w *worker) updateJobRowCount(taskKey string, jobID int64) { logutil.BgLogger().Warn("cannot get task manager", zap.String("category", "ddl"), zap.String("task_key", taskKey), zap.Error(err)) return } - gTask, err := taskMgr.GetGlobalTaskByKey(w.ctx, taskKey) - if err != nil || gTask == nil { - logutil.BgLogger().Warn("cannot get global task", zap.String("category", "ddl"), zap.String("task_key", taskKey), zap.Error(err)) + task, err := taskMgr.GetTaskByKey(w.ctx, taskKey) + if err != nil { + logutil.BgLogger().Warn("cannot get task", zap.String("category", "ddl"), zap.String("task_key", taskKey), zap.Error(err)) return } - rowCount, err := taskMgr.GetSubtaskRowCount(w.ctx, gTask.ID, proto.StepOne) + rowCount, err := taskMgr.GetSubtaskRowCount(w.ctx, task.ID, StepReadIndex) if err != nil { logutil.BgLogger().Warn("cannot get subtask row count", zap.String("category", "ddl"), zap.String("task_key", taskKey), zap.Error(err)) return @@ -2202,6 +2212,15 @@ func (w *worker) updateJobRowCount(taskKey string, jobID int64) { w.getReorgCtx(jobID).setRowCount(rowCount) } +// submitAndWaitTask submits a task and wait for it to finish. +func submitAndWaitTask(ctx context.Context, taskKey string, taskType proto.TaskType, concurrency int, taskMeta []byte) error { + task, err := handle.SubmitTask(ctx, taskKey, taskType, concurrency, taskMeta) + if err != nil { + return err + } + return handle.WaitTaskDoneOrPaused(ctx, task.ID) +} + func getNextPartitionInfo(reorg *reorgInfo, t table.PartitionedTable, currPhysicalTableID int64) (int64, kv.Key, kv.Key, error) { pi := t.Meta().GetPartitionInfo() if pi == nil { @@ -2364,6 +2383,7 @@ func (w *cleanUpIndexWorker) BackfillData(handleRange reorgBackfillTask) (taskCt errInTxn = kv.RunInNewTxn(ctx, w.sessCtx.GetStore(), true, func(ctx context.Context, txn kv.Transaction) error { taskCtx.addedCount = 0 taskCtx.scanCount = 0 + updateTxnEntrySizeLimitIfNeeded(txn) txn.SetOption(kv.Priority, handleRange.priority) if tagger := w.GetCtx().getResourceGroupTaggerForTopSQL(handleRange.getJobID()); tagger != nil { txn.SetOption(kv.ResourceGroupTagger, tagger) diff --git a/pkg/ddl/index_change_test.go b/pkg/ddl/index_change_test.go index 9c65c56b918a1..b24f47050642b 100644 --- a/pkg/ddl/index_change_test.go +++ b/pkg/ddl/index_change_test.go @@ -55,6 +55,9 @@ func TestIndexChange(t *testing.T) { publicTable table.Table ) onJobUpdatedExportedFunc := func(job *model.Job) { + if job.Type != model.ActionAddIndex || job.TableName != "t" { + return + } if job.SchemaState == prevState { return } @@ -87,11 +90,11 @@ func TestIndexChange(t *testing.T) { // We need to make sure onJobUpdated is called in the first hook. // After testCreateIndex(), onJobUpdated() may not be called when job.state is Sync. // If we skip this check, prevState may wrongly set to StatePublic. - for i := 0; i <= 10; i++ { + for i := 0; i <= 100; i++ { if addIndexDone { break } - time.Sleep(50 * time.Millisecond) + time.Sleep(10 * time.Millisecond) } v := getSchemaVer(t, tk.Session()) checkHistoryJobArgs(t, tk.Session(), jobID.Load(), &historyJobArgs{ver: v, tbl: publicTable.Meta()}) diff --git a/pkg/ddl/index_merge_tmp.go b/pkg/ddl/index_merge_tmp.go index 7c0504e1ebf1e..52bac245e4e35 100644 --- a/pkg/ddl/index_merge_tmp.go +++ b/pkg/ddl/index_merge_tmp.go @@ -24,6 +24,7 @@ import ( "github.com/pingcap/tidb/pkg/kv" "github.com/pingcap/tidb/pkg/meta" "github.com/pingcap/tidb/pkg/parser/model" + driver "github.com/pingcap/tidb/pkg/store/driver/txn" "github.com/pingcap/tidb/pkg/table" "github.com/pingcap/tidb/pkg/table/tables" "github.com/pingcap/tidb/pkg/tablecodec" @@ -53,6 +54,9 @@ func (w *mergeIndexWorker) batchCheckTemporaryUniqueKey( // Found a value in the original index key. err := checkTempIndexKey(txn, idxRecords[i], val, w.table) if err != nil { + if kv.ErrKeyExists.Equal(err) { + return driver.ExtractKeyExistsErrFromIndex(key, val, w.table.Meta(), idxInfo.ID) + } return errors.Trace(err) } } else if idxRecords[i].distinct { @@ -114,7 +118,6 @@ type temporaryIndexRecord struct { unique bool distinct bool handle kv.Handle - rowKey kv.Key } type mergeIndexWorker struct { @@ -150,6 +153,7 @@ func (w *mergeIndexWorker) BackfillData(taskRange reorgBackfillTask) (taskCtx ba errInTxn = kv.RunInNewTxn(ctx, w.sessCtx.GetStore(), true, func(ctx context.Context, txn kv.Transaction) error { taskCtx.addedCount = 0 taskCtx.scanCount = 0 + updateTxnEntrySizeLimitIfNeeded(txn) txn.SetOption(kv.Priority, taskRange.priority) if tagger := w.GetCtx().getResourceGroupTaggerForTopSQL(taskRange.getJobID()); tagger != nil { txn.SetOption(kv.ResourceGroupTagger, tagger) diff --git a/pkg/ddl/index_modify_test.go b/pkg/ddl/index_modify_test.go index ffc5491d72761..95c4c41c77161 100644 --- a/pkg/ddl/index_modify_test.go +++ b/pkg/ddl/index_modify_test.go @@ -26,7 +26,6 @@ import ( "time" "github.com/pingcap/errors" - "github.com/pingcap/tidb/pkg/config" "github.com/pingcap/tidb/pkg/ddl" testddlutil "github.com/pingcap/tidb/pkg/ddl/testutil" "github.com/pingcap/tidb/pkg/errno" @@ -679,13 +678,13 @@ func TestAddIndexWithPK(t *testing.T) { } func TestAddGlobalIndex(t *testing.T) { - defer config.RestoreFunc()() - config.UpdateGlobal(func(conf *config.Config) { - conf.EnableGlobalIndex = true - }) store := testkit.CreateMockStoreWithSchemaLease(t, indexModifyLease) tk := testkit.NewTestKit(t, store) tk.MustExec("use test") + tk.MustExec("set tidb_enable_global_index=true") + defer func() { + tk.MustExec("set tidb_enable_global_index=default") + }() tk.MustExec("create table test_t1 (a int, b int) partition by range (b)" + " (partition p0 values less than (10), " + " partition p1 values less than (maxvalue));") diff --git a/pkg/ddl/ingest/BUILD.bazel b/pkg/ddl/ingest/BUILD.bazel index b1423b74116ee..3ba3ef213bfc4 100644 --- a/pkg/ddl/ingest/BUILD.bazel +++ b/pkg/ddl/ingest/BUILD.bazel @@ -66,7 +66,7 @@ go_test( embed = [":ingest"], flaky = True, race = "on", - shard_count = 15, + shard_count = 16, deps = [ "//pkg/config", "//pkg/ddl", diff --git a/pkg/ddl/ingest/backend.go b/pkg/ddl/ingest/backend.go index 130faa466156c..c17b045c6ea97 100644 --- a/pkg/ddl/ingest/backend.go +++ b/pkg/ddl/ingest/backend.go @@ -269,8 +269,15 @@ func (bc *litBackendCtx) ShouldSync(mode FlushMode) (shouldFlush bool, shouldImp if mode == FlushModeForceLocalAndCheckDiskQuota { shouldFlush = true } else { + interval := bc.updateInterval + // This failpoint will be manually set through HTTP status port. + failpoint.Inject("mockSyncIntervalMs", func(val failpoint.Value) { + if v, ok := val.(int); ok { + interval = time.Duration(v) * time.Millisecond + } + }) shouldFlush = shouldImport || - time.Since(bc.timeOfLastFlush.Load()) >= bc.updateInterval + time.Since(bc.timeOfLastFlush.Load()) >= interval } return shouldFlush, shouldImport } diff --git a/pkg/ddl/ingest/config.go b/pkg/ddl/ingest/config.go index 27351a0668c19..66f5ec60e8101 100644 --- a/pkg/ddl/ingest/config.go +++ b/pkg/ddl/ingest/config.go @@ -17,11 +17,14 @@ package ingest import ( "context" "math" + "net" "path/filepath" + "strconv" "sync/atomic" "github.com/pingcap/tidb/br/pkg/lightning/backend" "github.com/pingcap/tidb/br/pkg/lightning/checkpoints" + "github.com/pingcap/tidb/br/pkg/lightning/common" lightning "github.com/pingcap/tidb/br/pkg/lightning/config" tidb "github.com/pingcap/tidb/pkg/config" "github.com/pingcap/tidb/pkg/util/logutil" @@ -80,6 +83,19 @@ func genConfig(ctx context.Context, memRoot MemRoot, jobID int64, unique bool) ( return c, err } +// NewDDLTLS creates a common.TLS from the tidb config for DDL. +func NewDDLTLS() (*common.TLS, error) { + tidbCfg := tidb.GetGlobalConfig() + hostPort := net.JoinHostPort("127.0.0.1", strconv.Itoa(int(tidbCfg.Status.StatusPort))) + return common.NewTLS( + tidbCfg.Security.ClusterSSLCA, + tidbCfg.Security.ClusterSSLCert, + tidbCfg.Security.ClusterSSLKey, + hostPort, + nil, nil, nil, + ) +} + var ( compactMemory = 1 * size.GB compactConcurrency = 4 @@ -91,6 +107,7 @@ func generateLocalEngineConfig(id int64, dbName, tbName string) *backend.EngineC Compact: true, CompactThreshold: int64(compactMemory), CompactConcurrency: compactConcurrency, + BlockSize: 16 * 1024, // using default for DDL }, TableInfo: &checkpoints.TidbTableInfo{ ID: id, diff --git a/pkg/ddl/ingest/integration_test.go b/pkg/ddl/ingest/integration_test.go index d7b91579befa4..c7dde01c84dbf 100644 --- a/pkg/ddl/ingest/integration_test.go +++ b/pkg/ddl/ingest/integration_test.go @@ -309,3 +309,34 @@ func TestAddIndexIngestMultiSchemaChange(t *testing.T) { tk.MustExec("alter table t add index idx_a(a), add index idx_ab(a, b), add index idx_d(d);") tk.MustExec("admin check table t;") } + +func TestAddIndexDuplicateMessage(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + defer ingesttestutil.InjectMockBackendMgr(t, store)() + + tk.MustExec("create table t(id int primary key, b int, k int);") + tk.MustExec("insert into t values (1, 1, 1);") + + tk1 := testkit.NewTestKit(t, store) + tk1.MustExec("use test") + + var runDML bool + var errDML error + + ingest.MockExecAfterWriteRow = func() { + if runDML { + return + } + _, errDML = tk1.Exec("insert into t values (2, 1, 2);") + runDML = true + } + + tk.MustGetErrMsg("alter table t add unique index idx(b);", "[kv:1062]Duplicate entry '1' for key 't.idx'") + + require.NoError(t, errDML) + require.True(t, runDML) + tk.MustExec("admin check table t;") + tk.MustQuery("select * from t;").Check(testkit.Rows("1 1 1", "2 1 2")) +} diff --git a/pkg/ddl/ingest/main_test.go b/pkg/ddl/ingest/main_test.go index a05300495dccf..8c6fe9dac60ca 100644 --- a/pkg/ddl/ingest/main_test.go +++ b/pkg/ddl/ingest/main_test.go @@ -23,6 +23,7 @@ import ( func TestMain(m *testing.M) { opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("github.com/tikv/client-go/v2/txnkv/transaction.keepAlive"), diff --git a/pkg/ddl/ingest/mock.go b/pkg/ddl/ingest/mock.go index 257175b6bbcb6..c6fb06e006ee5 100644 --- a/pkg/ddl/ingest/mock.go +++ b/pkg/ddl/ingest/mock.go @@ -229,7 +229,14 @@ func (m *MockWriter) WriteRow(_ context.Context, key, idxVal []byte, _ kv.Handle if err != nil { return err } - return txn.Set(key, idxVal) + err = txn.Set(key, idxVal) + if err != nil { + return err + } + if MockExecAfterWriteRow != nil { + MockExecAfterWriteRow() + } + return nil } // LockForWrite implements Writer.LockForWrite interface. @@ -241,3 +248,6 @@ func (*MockWriter) LockForWrite() func() { func (*MockWriter) Close(_ context.Context) error { return nil } + +// MockExecAfterWriteRow is only used for test. +var MockExecAfterWriteRow func() diff --git a/pkg/ddl/ingest/tests/partition_table_test.go b/pkg/ddl/ingest/tests/partition_table_test.go index 10d7ffbc43ebe..585e08e09a1db 100644 --- a/pkg/ddl/ingest/tests/partition_table_test.go +++ b/pkg/ddl/ingest/tests/partition_table_test.go @@ -42,7 +42,7 @@ func TestAddIndexIngestRecoverPartition(t *testing.T) { tc.SetOwner(1) // TODO(tangenta): mock multiple backends in a better way. //nolint: forcetypeassert - // TODO(tangenta): When owner changes, wait last ddl owner's DDL dispatching loop exits. + // TODO(tangenta): When owner changes, wait last ddl owner's DDL scheduling loop exits. ingest.LitBackCtxMgr.(*ingest.MockBackendCtxMgr).ResetSessCtx() bc, _ := ingest.LitBackCtxMgr.Load(job.ID) bc.GetCheckpointManager().Close() diff --git a/pkg/ddl/job_table.go b/pkg/ddl/job_table.go index 10c7f4d7f0bcd..a43152db15f8a 100644 --- a/pkg/ddl/job_table.go +++ b/pkg/ddl/job_table.go @@ -51,6 +51,7 @@ import ( var ( addingDDLJobConcurrent = "/tidb/ddl/add_ddl_job_general" dispatchLoopWaitingDuration = 1 * time.Second + localWorkerWaitingDuration = 10 * time.Millisecond ) func init() { @@ -60,60 +61,41 @@ func init() { } } -func (dc *ddlCtx) insertRunningDDLJobMap(id int64) { - dc.runningJobs.Lock() - defer dc.runningJobs.Unlock() - dc.runningJobs.ids[id] = struct{}{} -} - -func (dc *ddlCtx) deleteRunningDDLJobMap(id int64) { - dc.runningJobs.Lock() - defer dc.runningJobs.Unlock() - delete(dc.runningJobs.ids, id) -} - -func (dc *ddlCtx) excludeJobIDs() string { - dc.runningJobs.RLock() - defer dc.runningJobs.RUnlock() - if len(dc.runningJobs.ids) == 0 { - return "" - } - dc.runningJobIDs = dc.runningJobIDs[:0] - for id := range dc.runningJobs.ids { - dc.runningJobIDs = append(dc.runningJobIDs, strconv.Itoa(int(id))) - } - return fmt.Sprintf("and job_id not in (%s)", strings.Join(dc.runningJobIDs, ",")) -} - -const ( - getJobSQL = "select job_meta, processing from mysql.tidb_ddl_job where job_id in (select min(job_id) from mysql.tidb_ddl_job group by schema_ids, table_ids, processing) and %s reorg %s order by processing desc, job_id" -) - type jobType int func (t jobType) String() string { switch t { - case general: + case jobTypeGeneral: return "general" - case reorg: + case jobTypeReorg: return "reorg" + case jobTypeLocal: + return "local" } return "unknown job type: " + strconv.Itoa(int(t)) } const ( - general jobType = iota - reorg + jobTypeGeneral jobType = iota + jobTypeReorg + jobTypeLocal ) func (d *ddl) getJob(se *sess.Session, tp jobType, filter func(*model.Job) (bool, error)) (*model.Job, error) { not := "not" label := "get_job_general" - if tp == reorg { + if tp == jobTypeReorg { not = "" label = "get_job_reorg" } - sql := fmt.Sprintf(getJobSQL, not, d.excludeJobIDs()) + const getJobSQL = `select job_meta, processing from mysql.tidb_ddl_job where job_id in + (select min(job_id) from mysql.tidb_ddl_job group by schema_ids, table_ids, processing) + and %s reorg %s order by processing desc, job_id` + var excludedJobIDs string + if ids := d.runningJobs.allIDs(); len(ids) > 0 { + excludedJobIDs = fmt.Sprintf("and job_id not in (%s)", ids) + } + sql := fmt.Sprintf(getJobSQL, not, excludedJobIDs) rows, err := se.Execute(context.Background(), sql, label) if err != nil { return nil, errors.Trace(err) @@ -160,10 +142,8 @@ func (d *ddl) getJob(se *sess.Session, tp jobType, filter func(*model.Job) (bool } func hasSysDB(job *model.Job) bool { - sNames := job2SchemaNames(job) - // TODO: Handle for the name is empty, like ActionCreatePlacementPolicy. - for _, name := range sNames { - if tidb_util.IsSysDB(name) { + for _, info := range job.GetInvolvingSchemaInfo() { + if tidb_util.IsSysDB(info.Database) { return true } } @@ -224,28 +204,32 @@ func (d *ddl) processJobDuringUpgrade(sess *sess.Session, job *model.Job) (isRun } func (d *ddl) getGeneralJob(sess *sess.Session) (*model.Job, error) { - return d.getJob(sess, general, func(job *model.Job) (bool, error) { + return d.getJob(sess, jobTypeGeneral, func(job *model.Job) (bool, error) { + if !d.runningJobs.checkRunnable(job) { + return false, nil + } if job.Type == model.ActionDropSchema { // Check if there is any reorg job on this schema. sql := fmt.Sprintf("select job_id from mysql.tidb_ddl_job where CONCAT(',', schema_ids, ',') REGEXP CONCAT(',', %s, ',') != 0 and processing limit 1", strconv.Quote(strconv.FormatInt(job.SchemaID, 10))) - return d.NoConflictJob(sess, sql) + rows, err := sess.Execute(d.ctx, sql, "check conflict jobs") + return len(rows) == 0, err } // Check if there is any running job works on the same table. sql := fmt.Sprintf("select job_id from mysql.tidb_ddl_job t1, (select table_ids from mysql.tidb_ddl_job where job_id = %d) t2 where "+ "(processing and CONCAT(',', t2.table_ids, ',') REGEXP CONCAT(',', REPLACE(t1.table_ids, ',', '|'), ',') != 0)"+ "or (type = %d and processing)", job.ID, model.ActionFlashbackCluster) - return d.NoConflictJob(sess, sql) + rows, err := sess.Execute(d.ctx, sql, "check conflict jobs") + return len(rows) == 0, err }) } -func (*ddl) NoConflictJob(se *sess.Session, sql string) (bool, error) { - rows, err := se.Execute(context.Background(), sql, "check conflict jobs") - return len(rows) == 0, err -} - func (d *ddl) getReorgJob(sess *sess.Session) (*model.Job, error) { - return d.getJob(sess, reorg, func(job *model.Job) (bool, error) { + return d.getJob(sess, jobTypeReorg, func(job *model.Job) (bool, error) { + if !d.runningJobs.checkRunnable(job) { + return false, nil + } if (job.Type == model.ActionAddIndex || job.Type == model.ActionAddPrimaryKey) && + job.State == model.JobStateQueueing && job.ReorgMeta != nil && job.ReorgMeta.IsFastReorg && ingest.LitBackCtxMgr != nil { @@ -261,10 +245,26 @@ func (d *ddl) getReorgJob(sess *sess.Session) (*model.Job, error) { "or (CONCAT(',', table_ids, ',') REGEXP CONCAT(',', %s, ',') != 0 and processing) "+ "or (type = %d and processing) limit 1", strconv.Quote(strconv.FormatInt(job.SchemaID, 10)), model.ActionDropSchema, strconv.Quote(strconv.FormatInt(job.TableID, 10)), model.ActionFlashbackCluster) - return d.NoConflictJob(sess, sql) + rows, err := sess.Execute(d.ctx, sql, "check conflict jobs") + return len(rows) == 0, err }) } +// startLocalWorkerLoop starts the local worker loop to run the DDL job of v2. +func (d *ddl) startLocalWorkerLoop() { + for { + select { + case <-d.ctx.Done(): + return + case task, ok := <-d.localJobCh: + if !ok { + return + } + d.delivery2LocalWorker(d.localWorkerPool, task) + } + } +} + func (d *ddl) startDispatchLoop() { sessCtx, err := d.sessPool.Get() if err != nil { @@ -377,14 +377,51 @@ func (d *ddl) loadDDLJobAndRun(se *sess.Session, pool *workerPool, getJob func(* d.delivery2worker(wk, pool, job) } +// delivery2LocalWorker runs the DDL job of v2 in local. +// send the result to the error channels in the task. +// delivery2Localworker owns the worker, need to put it back to the pool in this function. +func (d *ddl) delivery2LocalWorker(pool *workerPool, task *limitJobTask) { + job := task.job + wk, err := pool.get() + if err != nil { + task.NotifyError(err) + return + } + for wk == nil { + select { + case <-d.ctx.Done(): + return + case <-time.After(localWorkerWaitingDuration): + } + wk, err = pool.get() + if err != nil { + task.NotifyError(err) + return + } + } + d.wg.Run(func() { + metrics.DDLRunningJobCount.WithLabelValues(pool.tp().String()).Inc() + defer func() { + metrics.DDLRunningJobCount.WithLabelValues(pool.tp().String()).Dec() + }() + + err := wk.HandleDDLJobV2(d.ddlCtx, job) + pool.put(wk) + if err != nil { + logutil.BgLogger().Info("handle ddl job failed", zap.String("category", "ddl"), zap.Error(err), zap.String("job", job.String())) + } + task.NotifyError(err) + }) +} + // delivery2worker owns the worker, need to put it back to the pool in this function. func (d *ddl) delivery2worker(wk *worker, pool *workerPool, job *model.Job) { injectFailPointForGetJob(job) - d.insertRunningDDLJobMap(job.ID) + d.runningJobs.add(job) d.wg.Run(func() { metrics.DDLRunningJobCount.WithLabelValues(pool.tp().String()).Inc() defer func() { - d.deleteRunningDDLJobMap(job.ID) + d.runningJobs.remove(job) asyncNotify(d.ddlJobCh) metrics.DDLRunningJobCount.WithLabelValues(pool.tp().String()).Dec() }() @@ -560,23 +597,6 @@ func job2UniqueIDs(job *model.Job, schema bool) string { return strconv.FormatInt(job.TableID, 10) } -func job2SchemaNames(job *model.Job) []string { - if job.Type == model.ActionRenameTable { - var oldSchemaID int64 - var oldSchemaName model.CIStr - var tableName model.CIStr - // TODO: Handle this error - _ = job.DecodeArgs(&oldSchemaID, &tableName, &oldSchemaName) - names := make([]string, 0, 2) - names = append(names, strings.ToLower(job.SchemaName)) - names = append(names, oldSchemaName.O) - return names - } - // TODO: consider about model.ActionRenameTables and model.ActionExchangeTablePartition, which need to get the schema names. - - return []string{job.SchemaName} -} - func (w *worker) deleteDDLJob(job *model.Job) error { sql := fmt.Sprintf("delete from mysql.tidb_ddl_job where job_id = %d", job.ID) _, err := w.sess.Execute(context.Background(), sql, "delete_job") diff --git a/pkg/ddl/label/main_test.go b/pkg/ddl/label/main_test.go index ef7a39bb4a235..aa8bef08d69a6 100644 --- a/pkg/ddl/label/main_test.go +++ b/pkg/ddl/label/main_test.go @@ -25,6 +25,7 @@ func TestMain(m *testing.M) { testsetup.SetupForCommonTest() opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), diff --git a/pkg/ddl/main_test.go b/pkg/ddl/main_test.go index 405ea5594706a..c031d9f2b8ce2 100644 --- a/pkg/ddl/main_test.go +++ b/pkg/ddl/main_test.go @@ -62,6 +62,7 @@ func TestMain(m *testing.M) { opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("github.com/tikv/client-go/v2/txnkv/transaction.keepAlive"), diff --git a/pkg/ddl/mock.go b/pkg/ddl/mock.go index 95071ad080133..edfe2abaa7eba 100644 --- a/pkg/ddl/mock.go +++ b/pkg/ddl/mock.go @@ -115,6 +115,12 @@ func (s *MockSchemaSyncer) OwnerCheckAllVersions(ctx context.Context, jobID int6 ticker := time.NewTicker(mockCheckVersInterval) defer ticker.Stop() + failpoint.Inject("mockOwnerCheckAllVersionSlow", func(val failpoint.Value) { + if v, ok := val.(int); ok && v == int(jobID) { + time.Sleep(2 * time.Second) + } + }) + for { select { case <-ctx.Done(): diff --git a/pkg/ddl/modify_column_test.go b/pkg/ddl/modify_column_test.go index 87e2e5f4cb12f..7084692fefa5b 100644 --- a/pkg/ddl/modify_column_test.go +++ b/pkg/ddl/modify_column_test.go @@ -93,15 +93,15 @@ func TestModifyColumnReorgInfo(t *testing.T) { } currJob = job var ( - newCol *model.ColumnInfo - oldColName *model.CIStr - modifyColumnTp byte - updatedAutoRandomBits uint64 - changingCol *model.ColumnInfo - changingIdxs []*model.IndexInfo + _newCol *model.ColumnInfo + _oldColName *model.CIStr + _pos = &ast.ColumnPosition{} + _modifyColumnTp byte + _updatedAutoRandomBits uint64 + changingCol *model.ColumnInfo + changingIdxs []*model.IndexInfo ) - pos := &ast.ColumnPosition{} - checkErr = job.DecodeArgs(&newCol, &oldColName, pos, &modifyColumnTp, &updatedAutoRandomBits, &changingCol, &changingIdxs) + checkErr = job.DecodeArgs(&_newCol, &_oldColName, _pos, &_modifyColumnTp, &_updatedAutoRandomBits, &changingCol, &changingIdxs) elements = ddl.BuildElements(changingCol, changingIdxs) } if job.Type == model.ActionAddIndex { diff --git a/pkg/ddl/multi_schema_change.go b/pkg/ddl/multi_schema_change.go index 90cc38721e971..36f369ff616be 100644 --- a/pkg/ddl/multi_schema_change.go +++ b/pkg/ddl/multi_schema_change.go @@ -45,9 +45,10 @@ func (d *ddl) MultiSchemaChange(ctx sessionctx.Context, ti ast.Ident) error { Args: nil, MultiSchemaInfo: ctx.GetSessionVars().StmtCtx.MultiSchemaInfo, ReorgMeta: nil, + CDCWriteSource: ctx.GetSessionVars().CDCWriteSource, } if containsDistTaskSubJob(subJobs) { - job.ReorgMeta, err = newReorgMetaFromVariables(d, job, ctx) + job.ReorgMeta, err = newReorgMetaFromVariables(job, ctx) if err != nil { return err } diff --git a/pkg/ddl/options.go b/pkg/ddl/options.go index df458747bb10c..6e30ce8e3a260 100644 --- a/pkg/ddl/options.go +++ b/pkg/ddl/options.go @@ -19,6 +19,7 @@ import ( "github.com/pingcap/tidb/pkg/infoschema" "github.com/pingcap/tidb/pkg/kv" + "github.com/pingcap/tidb/pkg/meta/autoid" clientv3 "go.etcd.io/etcd/client/v3" ) @@ -27,11 +28,12 @@ type Option func(*Options) // Options represents all the options of the DDL module needs type Options struct { - EtcdCli *clientv3.Client - Store kv.Storage - InfoCache *infoschema.InfoCache - Hook Callback - Lease time.Duration + EtcdCli *clientv3.Client + Store kv.Storage + AutoIDClient *autoid.ClientDiscover + InfoCache *infoschema.InfoCache + Hook Callback + Lease time.Duration } // WithEtcdClient specifies the `clientv3.Client` of DDL used to request the etcd service @@ -55,6 +57,13 @@ func WithInfoCache(ic *infoschema.InfoCache) Option { } } +// WithAutoIDClient specifies the autoid client used by the autoid service for those AUTO_ID_CACHE=1 tables. +func WithAutoIDClient(cli *autoid.ClientDiscover) Option { + return func(options *Options) { + options.AutoIDClient = cli + } +} + // WithHook specifies the `Callback` of DDL used to notify the outer module when events are triggered func WithHook(callback Callback) Option { return func(options *Options) { diff --git a/pkg/ddl/partition.go b/pkg/ddl/partition.go index bb3c4d932a6a3..eb1bcd88f2431 100644 --- a/pkg/ddl/partition.go +++ b/pkg/ddl/partition.go @@ -27,7 +27,6 @@ import ( "github.com/pingcap/errors" "github.com/pingcap/failpoint" "github.com/pingcap/kvproto/pkg/metapb" - "github.com/pingcap/tidb/pkg/config" sess "github.com/pingcap/tidb/pkg/ddl/internal/session" "github.com/pingcap/tidb/pkg/ddl/label" "github.com/pingcap/tidb/pkg/ddl/placement" @@ -535,7 +534,7 @@ func buildTablePartitionInfo(ctx sessionctx.Context, s *ast.PartitionOptions, tb } // Note that linear hash is simply ignored, and creates non-linear hash/key. if s.Linear { - ctx.GetSessionVars().StmtCtx.AppendWarning(dbterror.ErrUnsupportedCreatePartition.GenWithStack(fmt.Sprintf("LINEAR %s is not supported, using non-linear %s instead", s.Tp.String(), s.Tp.String()))) + ctx.GetSessionVars().StmtCtx.AppendWarning(dbterror.ErrUnsupportedCreatePartition.FastGen(fmt.Sprintf("LINEAR %s is not supported, using non-linear %s instead", s.Tp.String(), s.Tp.String()))) } if s.Tp == model.PartitionTypeHash || len(s.ColumnNames) != 0 { enable = true @@ -543,11 +542,11 @@ func buildTablePartitionInfo(ctx sessionctx.Context, s *ast.PartitionOptions, tb } if !enable { - ctx.GetSessionVars().StmtCtx.AppendWarning(dbterror.ErrUnsupportedCreatePartition.GenWithStack(fmt.Sprintf("Unsupported partition type %v, treat as normal table", s.Tp))) + ctx.GetSessionVars().StmtCtx.AppendWarning(dbterror.ErrUnsupportedCreatePartition.FastGen(fmt.Sprintf("Unsupported partition type %v, treat as normal table", s.Tp))) return nil } if s.Sub != nil { - ctx.GetSessionVars().StmtCtx.AppendWarning(dbterror.ErrUnsupportedCreatePartition.GenWithStack(fmt.Sprintf("Unsupported subpartitioning, only using %v partitioning", s.Tp))) + ctx.GetSessionVars().StmtCtx.AppendWarning(dbterror.ErrUnsupportedCreatePartition.FastGen(fmt.Sprintf("Unsupported subpartitioning, only using %v partitioning", s.Tp))) } pi := &model.PartitionInfo{ @@ -611,7 +610,7 @@ func buildTablePartitionInfo(ctx sessionctx.Context, s *ast.PartitionOptions, tb for _, index := range tbInfo.Indices { if index.Unique && !checkUniqueKeyIncludePartKey(partCols, index.Columns) { - index.Global = config.GetGlobalConfig().EnableGlobalIndex + index.Global = ctx.GetSessionVars().EnableGlobalIndex } } return nil @@ -2588,13 +2587,16 @@ func (w *worker) onExchangeTablePartition(d *ddlCtx, t *meta.Meta, job *model.Jo // Recreate non-partition table meta info, // by first delete it with the old table id - err = t.DropTableOrView(job.SchemaID, nt.ID) + err = t.DropTableOrView(job.SchemaID, job.SchemaName, nt.ID, nt.Name.L) if err != nil { return ver, errors.Trace(err) } // exchange table meta id pt.ExchangePartitionInfo = nil + // Used below to update the partitioned table's stats meta. + originalPartitionDef := partDef.Clone() + originalNt := nt.Clone() partDef.ID, nt.ID = nt.ID, partDef.ID err = t.UpdateTable(ptSchemaID, pt) @@ -2602,7 +2604,7 @@ func (w *worker) onExchangeTablePartition(d *ddlCtx, t *meta.Meta, job *model.Jo return ver, errors.Trace(err) } - err = t.CreateTableOrView(job.SchemaID, nt) + err = t.CreateTableOrView(job.SchemaID, job.SchemaName, nt) if err != nil { return ver, errors.Trace(err) } @@ -2698,6 +2700,12 @@ func (w *worker) onExchangeTablePartition(d *ddlCtx, t *meta.Meta, job *model.Jo } job.FinishTableJob(model.JobStateDone, model.StateNone, ver, pt) + exchangePartitionEvent := statsutil.NewExchangePartitionEvent( + pt, + &model.PartitionInfo{Definitions: []model.PartitionDefinition{originalPartitionDef}}, + originalNt, + ) + asyncNotifyEvent(d, exchangePartitionEvent) return ver, nil } @@ -2992,14 +3000,12 @@ func (w *worker) onReorganizePartition(d *ddlCtx, t *meta.Meta, job *model.Job) tblInfo.Partition.AddingDefinitions = nil tblInfo.Partition.DDLState = model.StateNone + var oldTblID int64 if job.Type != model.ActionReorganizePartition { // ALTER TABLE ... PARTITION BY // REMOVE PARTITIONING - // New Table ID, so needs to recreate the table by drop+create. - oldTblID := tblInfo.ID - // Overloading the NewTableID here with the oldTblID instead, - // for keeping the old global statistics - statisticsPartInfo.NewTableID = oldTblID + // Storing the old table ID, used for updating statistics. + oldTblID = tblInfo.ID // TODO: Handle bundles? // TODO: Add concurrent test! // TODO: Will this result in big gaps? @@ -3010,7 +3016,7 @@ func (w *worker) onReorganizePartition(d *ddlCtx, t *meta.Meta, job *model.Job) job.State = model.JobStateCancelled return ver, errors.Trace(err) } - err = t.DropTableOrView(job.SchemaID, tblInfo.ID) + err = t.DropTableOrView(job.SchemaID, job.SchemaName, tblInfo.ID, tblInfo.Name.L) if err != nil { job.State = model.JobStateCancelled return ver, errors.Trace(err) @@ -3036,7 +3042,7 @@ func (w *worker) onReorganizePartition(d *ddlCtx, t *meta.Meta, job *model.Job) return ver, errors.Trace(err) } // TODO: Add failpoint here? - err = t.CreateTableOrView(job.SchemaID, tblInfo) + err = t.CreateTableOrView(job.SchemaID, job.SchemaName, tblInfo) if err != nil { job.State = model.JobStateCancelled return ver, errors.Trace(err) @@ -3059,7 +3065,7 @@ func (w *worker) onReorganizePartition(d *ddlCtx, t *meta.Meta, job *model.Job) // Include the old table ID, if changed, which may contain global statistics, // so it can be reused for the new (non)partitioned table. event, err := newStatsDDLEventForJob( - job.Type, tblInfo, statisticsPartInfo, droppedPartInfo, + job.Type, oldTblID, tblInfo, statisticsPartInfo, droppedPartInfo, ) if err != nil { return ver, errors.Trace(err) @@ -3079,6 +3085,7 @@ func (w *worker) onReorganizePartition(d *ddlCtx, t *meta.Meta, job *model.Job) // It is used for reorganize partition, add partitioning and remove partitioning. func newStatsDDLEventForJob( jobType model.ActionType, + oldTblID int64, tblInfo *model.TableInfo, addedPartInfo *model.PartitionInfo, droppedPartInfo *model.PartitionInfo, @@ -3093,13 +3100,15 @@ func newStatsDDLEventForJob( ) case model.ActionAlterTablePartitioning: event = statsutil.NewAddPartitioningEvent( + oldTblID, tblInfo, addedPartInfo, ) case model.ActionRemovePartitioning: event = statsutil.NewRemovePartitioningEvent( + oldTblID, tblInfo, - addedPartInfo, + droppedPartInfo, ) default: return nil, errors.Errorf("unknown job type: %s", jobType.String()) @@ -3205,6 +3214,7 @@ func (w *reorgPartitionWorker) BackfillData(handleRange reorgBackfillTask) (task errInTxn = kv.RunInNewTxn(ctx, w.sessCtx.GetStore(), true, func(ctx context.Context, txn kv.Transaction) error { taskCtx.addedCount = 0 taskCtx.scanCount = 0 + updateTxnEntrySizeLimitIfNeeded(txn) txn.SetOption(kv.Priority, handleRange.priority) if tagger := w.GetCtx().getResourceGroupTaggerForTopSQL(handleRange.getJobID()); tagger != nil { txn.SetOption(kv.ResourceGroupTagger, tagger) @@ -3808,11 +3818,11 @@ func checkPartitioningKeysConstraints(sctx sessionctx.Context, s *ast.CreateTabl if tblInfo.IsCommonHandle { return dbterror.ErrUniqueKeyNeedAllFieldsInPf.GenWithStackByArgs("CLUSTERED INDEX") } - if !config.GetGlobalConfig().EnableGlobalIndex { + if !sctx.GetSessionVars().EnableGlobalIndex { return dbterror.ErrUniqueKeyNeedAllFieldsInPf.GenWithStackByArgs("PRIMARY KEY") } } - if !config.GetGlobalConfig().EnableGlobalIndex { + if !sctx.GetSessionVars().EnableGlobalIndex { return dbterror.ErrUniqueKeyNeedAllFieldsInPf.GenWithStackByArgs("UNIQUE INDEX") } } diff --git a/pkg/ddl/placement/BUILD.bazel b/pkg/ddl/placement/BUILD.bazel index 894d93ab0a3c8..32914e98ab5a1 100644 --- a/pkg/ddl/placement/BUILD.bazel +++ b/pkg/ddl/placement/BUILD.bazel @@ -17,6 +17,7 @@ go_library( "//pkg/tablecodec", "//pkg/util/codec", "@com_github_pingcap_failpoint//:failpoint", + "@com_github_tikv_pd_client//http", "@in_gopkg_yaml_v2//:yaml_v2", ], ) @@ -45,5 +46,6 @@ go_test( "//pkg/util/codec", "@com_github_pingcap_failpoint//:failpoint", "@com_github_stretchr_testify//require", + "@com_github_tikv_pd_client//http", ], ) diff --git a/pkg/ddl/placement/bundle.go b/pkg/ddl/placement/bundle.go index e9331571c6d2c..891365249b37e 100644 --- a/pkg/ddl/placement/bundle.go +++ b/pkg/ddl/placement/bundle.go @@ -29,21 +29,13 @@ import ( "github.com/pingcap/tidb/pkg/parser/model" "github.com/pingcap/tidb/pkg/tablecodec" "github.com/pingcap/tidb/pkg/util/codec" + pd "github.com/tikv/pd/client/http" "gopkg.in/yaml.v2" ) -// Refer to https://github.com/tikv/pd/issues/2701 . -// IMO, it is indeed not bad to have a copy of definition. -// After all, placement rules are communicated using an HTTP API. Loose -// coupling is a good feature. - // Bundle is a group of all rules and configurations. It is used to support rule cache. -type Bundle struct { - ID string `json:"group_id"` - Index int `json:"group_index"` - Override bool `json:"group_override"` - Rules []*Rule `json:"rules"` -} +// Alias `pd.GroupBundle` is to wrap more methods. +type Bundle pd.GroupBundle // NewBundle will create a bundle with the provided ID. // Note that you should never pass negative id. @@ -70,7 +62,7 @@ func NewBundleFromConstraintsOptions(options *model.PlacementSettings) (*Bundle, explicitFollowerCount := options.Followers explicitLearnerCount := options.Learners - rules := []*Rule{} + rules := []*pd.Rule{} commonConstraints, err := NewConstraintsFromYaml([]byte(constraints)) if err != nil { // If it's not in array format, attempt to parse it as a dictionary for more detailed definitions. @@ -78,7 +70,7 @@ func NewBundleFromConstraintsOptions(options *model.PlacementSettings) (*Bundle, // replicas that should act as voters. // For example: CONSTRAINTS='{ "+region=us-east-1":2, "+region=us-east-2": 2, "+region=us-west-1": 1}' normalReplicasRules, err := NewRuleBuilder(). - SetRole(Voter). + SetRole(pd.Voter). SetConstraintStr(constraints). BuildRulesWithDictConstraintsOnly() if err != nil { @@ -92,7 +84,7 @@ func NewBundleFromConstraintsOptions(options *model.PlacementSettings) (*Bundle, return nil, fmt.Errorf("%w: 'LeaderConstraints' should be [constraint1, ...] or any yaml compatible array representation", err) } for _, cnst := range commonConstraints { - if err := leaderConstraints.Add(cnst); err != nil { + if err := AddConstraint(&leaderConstraints, cnst); err != nil { return nil, fmt.Errorf("%w: LeaderConstraints conflicts with Constraints", err) } } @@ -101,7 +93,7 @@ func NewBundleFromConstraintsOptions(options *model.PlacementSettings) (*Bundle, followerReplicas = explicitFollowerCount } if !needCreateDefault { - if len(leaderConstraints) == 0 { + if len(leaderConst) == 0 { leaderReplicas = 0 } if len(followerConstraints) == 0 { @@ -115,7 +107,7 @@ func NewBundleFromConstraintsOptions(options *model.PlacementSettings) (*Bundle, // create leader rule. // if no constraints, we need create default leader rule. if leaderReplicas > 0 { - leaderRule := NewRule(Leader, leaderReplicas, leaderConstraints) + leaderRule := NewRule(pd.Leader, leaderReplicas, leaderConstraints) rules = append(rules, leaderRule) } @@ -123,7 +115,7 @@ func NewBundleFromConstraintsOptions(options *model.PlacementSettings) (*Bundle, // if no constraints, we need create default follower rules. if followerReplicas > 0 { builder := NewRuleBuilder(). - SetRole(Voter). + SetRole(pd.Voter). SetReplicasNum(followerReplicas). SetSkipCheckReplicasConsistent(needCreateDefault && (explicitFollowerCount == 0)). SetConstraintStr(followerConstraints) @@ -133,7 +125,7 @@ func NewBundleFromConstraintsOptions(options *model.PlacementSettings) (*Bundle, } for _, followerRule := range followerRules { for _, cnst := range commonConstraints { - if err := followerRule.Constraints.Add(cnst); err != nil { + if err := AddConstraint(&followerRule.LabelConstraints, cnst); err != nil { return nil, fmt.Errorf("%w: FollowerConstraints conflicts with Constraints", err) } } @@ -143,7 +135,7 @@ func NewBundleFromConstraintsOptions(options *model.PlacementSettings) (*Bundle, // create learner rules. builder := NewRuleBuilder(). - SetRole(Learner). + SetRole(pd.Learner). SetReplicasNum(explicitLearnerCount). SetConstraintStr(learnerConstraints) learnerRules, err := builder.BuildRules() @@ -152,7 +144,7 @@ func NewBundleFromConstraintsOptions(options *model.PlacementSettings) (*Bundle, } for _, rule := range learnerRules { for _, cnst := range commonConstraints { - if err := rule.Constraints.Add(cnst); err != nil { + if err := AddConstraint(&rule.LabelConstraints, cnst); err != nil { return nil, fmt.Errorf("%w: LearnerConstraints conflicts with Constraints", err) } } @@ -194,7 +186,7 @@ func NewBundleFromSugarOptions(options *model.PlacementSettings) (*Bundle, error } schedule := options.Schedule - var rules []*Rule + var rules []*pd.Rule locationLabels, err := newLocationLabelsFromSurvivalPreferences(options.SurvivalPreferences) if err != nil { @@ -203,7 +195,7 @@ func NewBundleFromSugarOptions(options *model.PlacementSettings) (*Bundle, error // in case empty primaryRegion and regions, just return an empty bundle if primaryRegion == "" && len(regions) == 0 { - rules = append(rules, NewRule(Voter, followers+1, NewConstraintsDirect())) + rules = append(rules, NewRule(pd.Voter, followers+1, NewConstraintsDirect())) for _, rule := range rules { rule.LocationLabels = locationLabels } @@ -230,17 +222,17 @@ func NewBundleFromSugarOptions(options *model.PlacementSettings) (*Bundle, error return nil, fmt.Errorf("%w: unsupported schedule %s", ErrInvalidPlacementOptions, schedule) } - rules = append(rules, NewRule(Leader, 1, NewConstraintsDirect(NewConstraintDirect("region", In, primaryRegion)))) + rules = append(rules, NewRule(pd.Leader, 1, NewConstraintsDirect(NewConstraintDirect("region", pd.In, primaryRegion)))) if primaryCount > 1 { - rules = append(rules, NewRule(Voter, primaryCount-1, NewConstraintsDirect(NewConstraintDirect("region", In, primaryRegion)))) + rules = append(rules, NewRule(pd.Voter, primaryCount-1, NewConstraintsDirect(NewConstraintDirect("region", pd.In, primaryRegion)))) } if cnt := followers + 1 - primaryCount; cnt > 0 { // delete primary from regions regions = regions[:primaryIndex+copy(regions[primaryIndex:], regions[primaryIndex+1:])] if len(regions) > 0 { - rules = append(rules, NewRule(Voter, cnt, NewConstraintsDirect(NewConstraintDirect("region", In, regions...)))) + rules = append(rules, NewRule(pd.Voter, cnt, NewConstraintsDirect(NewConstraintDirect("region", pd.In, regions...)))) } else { - rules = append(rules, NewRule(Voter, cnt, NewConstraintsDirect())) + rules = append(rules, NewRule(pd.Voter, cnt, NewConstraintsDirect())) } } @@ -332,8 +324,8 @@ func (b *Bundle) Tidy() error { // refer to tidb#22065. // add -engine=tiflash to every rule to avoid schedules to tiflash instances. // placement rules in SQL is not compatible with `set tiflash replica` yet - err := rule.Constraints.Add(Constraint{ - Op: NotIn, + err := AddConstraint(&rule.LabelConstraints, pd.LabelConstraint{ + Op: pd.NotIn, Key: EngineLabelKey, Values: []string{EngineLabelTiFlash}, }) @@ -348,10 +340,10 @@ func (b *Bundle) Tidy() error { groups := make(map[string]*constraintsGroup) finalRules := tempRules[:0] for _, rule := range tempRules { - key := rule.Constraints.FingerPrint() + key := ConstraintsFingerPrint(&rule.LabelConstraints) existing, ok := groups[key] if !ok { - groups[key] = &constraintsGroup{rules: []*Rule{rule}} + groups[key] = &constraintsGroup{rules: []*pd.Rule{rule}} continue } existing.rules = append(existing.rules, rule) @@ -375,7 +367,7 @@ func (b *Bundle) Tidy() error { // constraintsGroup is a group of rules with the same constraints. type constraintsGroup struct { - rules []*Rule + rules []*pd.Rule // canBecameLeader means the group has leader/voter role, // it's valid if it has leader. canBecameLeader bool @@ -411,16 +403,16 @@ func transformableLeaderConstraint(groups map[string]*constraintsGroup) error { // MergeRulesByRole merges the rules with the same role. func (c *constraintsGroup) MergeRulesByRole() { // Create a map to store rules by role - rulesByRole := make(map[PeerRoleType][]*Rule) + rulesByRole := make(map[pd.PeerRoleType][]*pd.Rule) // Iterate through each rule for _, rule := range c.rules { // Add the rule to the map based on its role rulesByRole[rule.Role] = append(rulesByRole[rule.Role], rule) - if rule.Role == Leader || rule.Role == Voter { + if rule.Role == pd.Leader || rule.Role == pd.Voter { c.canBecameLeader = true } - if rule.Role == Leader { + if rule.Role == pd.Leader { c.isLeaderGroup = true } } @@ -449,11 +441,11 @@ func (c *constraintsGroup) MergeTransformableRoles() { if len(c.rules) == 0 || len(c.rules) == 1 { return } - var mergedRule *Rule - newRules := make([]*Rule, 0, len(c.rules)) + var mergedRule *pd.Rule + newRules := make([]*pd.Rule, 0, len(c.rules)) for _, rule := range c.rules { // Learner is not transformable, it should be promote by PD. - if rule.Role == Learner { + if rule.Role == pd.Learner { newRules = append(newRules, rule) continue } @@ -467,7 +459,7 @@ func (c *constraintsGroup) MergeTransformableRoles() { } } if mergedRule != nil { - mergedRule.Role = Voter + mergedRule.Role = pd.Voter newRules = append(newRules, mergedRule) } c.rules = newRules @@ -491,7 +483,7 @@ func (b *Bundle) RebuildForRange(rangeName string, policyName string) *Bundle { } b.Override = true - newRules := make([]*Rule, 0, len(rule)) + newRules := make([]*pd.Rule, 0, len(rule)) for i, r := range b.Rules { cp := r.Clone() cp.ID = fmt.Sprintf("%s_rule_%d", strings.ToLower(policyName), i) @@ -508,7 +500,7 @@ func (b *Bundle) RebuildForRange(rangeName string, policyName string) *Bundle { // Reset resets the bundle ID and keyrange of all rules. func (b *Bundle) Reset(ruleIndex int, newIDs []int64) *Bundle { // eliminate the redundant rules. - var basicRules []*Rule + var basicRules []*pd.Rule if len(b.Rules) != 0 { // Make priority for rules with RuleIndexTable cause of duplication rules existence with RuleIndexPartition. // If RuleIndexTable doesn't exist, bundle itself is a independent series of rules for a partition. @@ -526,7 +518,7 @@ func (b *Bundle) Reset(ruleIndex int, newIDs []int64) *Bundle { b.ID = GroupID(newIDs[0]) b.Index = ruleIndex b.Override = true - newRules := make([]*Rule, 0, len(basicRules)*len(newIDs)) + newRules := make([]*pd.Rule, 0, len(basicRules)*len(newIDs)) for i, newID := range newIDs { // rule.id should be distinguished with each other, otherwise it will be de-duplicated in pd http api. var ruleID string @@ -566,7 +558,7 @@ func (b *Bundle) Clone() *Bundle { newBundle := &Bundle{} *newBundle = *b if len(b.Rules) > 0 { - newBundle.Rules = make([]*Rule, 0, len(b.Rules)) + newBundle.Rules = make([]*pd.Rule, 0, len(b.Rules)) for i := range b.Rules { newBundle.Rules = append(newBundle.Rules, b.Rules[i].Clone()) } @@ -595,10 +587,10 @@ func (b *Bundle) ObjectID() (int64, error) { return id, nil } -func isValidLeaderRule(rule *Rule, dcLabelKey string) bool { - if rule.Role == Leader && rule.Count == 1 { - for _, con := range rule.Constraints { - if con.Op == In && con.Key == dcLabelKey && len(con.Values) == 1 { +func isValidLeaderRule(rule *pd.Rule, dcLabelKey string) bool { + if rule.Role == pd.Leader && rule.Count == 1 { + for _, con := range rule.LabelConstraints { + if con.Op == pd.In && con.Key == dcLabelKey && len(con.Values) == 1 { return true } } @@ -610,7 +602,7 @@ func isValidLeaderRule(rule *Rule, dcLabelKey string) bool { func (b *Bundle) GetLeaderDC(dcLabelKey string) (string, bool) { for _, rule := range b.Rules { if isValidLeaderRule(rule, dcLabelKey) { - return rule.Constraints[0].Values[0], true + return rule.LabelConstraints[0].Values[0], true } } return "", false diff --git a/pkg/ddl/placement/bundle_test.go b/pkg/ddl/placement/bundle_test.go index c1b7c067c774b..0f75bf50fd69f 100644 --- a/pkg/ddl/placement/bundle_test.go +++ b/pkg/ddl/placement/bundle_test.go @@ -25,6 +25,7 @@ import ( "github.com/pingcap/tidb/pkg/tablecodec" "github.com/pingcap/tidb/pkg/util/codec" "github.com/stretchr/testify/require" + pd "github.com/tikv/pd/client/http" ) func TestEmpty(t *testing.T) { @@ -37,7 +38,7 @@ func TestEmpty(t *testing.T) { bundle = &Bundle{ID: GroupID(1), Override: true} require.False(t, bundle.IsEmpty()) - bundle = &Bundle{ID: GroupID(1), Rules: []*Rule{{ID: "434"}}} + bundle = &Bundle{ID: GroupID(1), Rules: []*pd.Rule{{ID: "434"}}} require.False(t, bundle.IsEmpty()) bundle = &Bundle{ID: GroupID(1), Index: 1, Override: true} @@ -45,14 +46,14 @@ func TestEmpty(t *testing.T) { } func TestCloneBundle(t *testing.T) { - bundle := &Bundle{ID: GroupID(1), Rules: []*Rule{{ID: "434"}}} + bundle := &Bundle{ID: GroupID(1), Rules: []*pd.Rule{{ID: "434"}}} newBundle := bundle.Clone() newBundle.ID = GroupID(2) - newBundle.Rules[0] = &Rule{ID: "121"} + newBundle.Rules[0] = &pd.Rule{ID: "121"} - require.Equal(t, &Bundle{ID: GroupID(1), Rules: []*Rule{{ID: "434"}}}, bundle) - require.Equal(t, &Bundle{ID: GroupID(2), Rules: []*Rule{{ID: "121"}}}, newBundle) + require.Equal(t, &Bundle{ID: GroupID(1), Rules: []*pd.Rule{{ID: "434"}}}, bundle) + require.Equal(t, &Bundle{ID: GroupID(2), Rules: []*pd.Rule{{ID: "121"}}}, newBundle) } func TestObjectID(t *testing.T) { @@ -92,14 +93,14 @@ func TestGetLeaderDCByBundle(t *testing.T) { name: "only leader", bundle: &Bundle{ ID: GroupID(1), - Rules: []*Rule{ + Rules: []*pd.Rule{ { ID: "12", - Role: Leader, - Constraints: Constraints{ + Role: pd.Leader, + LabelConstraints: []pd.LabelConstraint{ { Key: "zone", - Op: In, + Op: pd.In, Values: []string{"bj"}, }, }, @@ -113,14 +114,14 @@ func TestGetLeaderDCByBundle(t *testing.T) { name: "no leader", bundle: &Bundle{ ID: GroupID(1), - Rules: []*Rule{ + Rules: []*pd.Rule{ { ID: "12", - Role: Voter, - Constraints: Constraints{ + Role: pd.Voter, + LabelConstraints: []pd.LabelConstraint{ { Key: "zone", - Op: In, + Op: pd.In, Values: []string{"bj"}, }, }, @@ -134,14 +135,14 @@ func TestGetLeaderDCByBundle(t *testing.T) { name: "voter and leader", bundle: &Bundle{ ID: GroupID(1), - Rules: []*Rule{ + Rules: []*pd.Rule{ { ID: "11", - Role: Leader, - Constraints: Constraints{ + Role: pd.Leader, + LabelConstraints: []pd.LabelConstraint{ { Key: "zone", - Op: In, + Op: pd.In, Values: []string{"sh"}, }, }, @@ -149,11 +150,11 @@ func TestGetLeaderDCByBundle(t *testing.T) { }, { ID: "12", - Role: Voter, - Constraints: Constraints{ + Role: pd.Voter, + LabelConstraints: []pd.LabelConstraint{ { Key: "zone", - Op: In, + Op: pd.In, Values: []string{"bj"}, }, }, @@ -167,14 +168,14 @@ func TestGetLeaderDCByBundle(t *testing.T) { name: "wrong label key", bundle: &Bundle{ ID: GroupID(1), - Rules: []*Rule{ + Rules: []*pd.Rule{ { ID: "11", - Role: Leader, - Constraints: Constraints{ + Role: pd.Leader, + LabelConstraints: []pd.LabelConstraint{ { Key: "fake", - Op: In, + Op: pd.In, Values: []string{"sh"}, }, }, @@ -188,14 +189,14 @@ func TestGetLeaderDCByBundle(t *testing.T) { name: "wrong operator", bundle: &Bundle{ ID: GroupID(1), - Rules: []*Rule{ + Rules: []*pd.Rule{ { ID: "11", - Role: Leader, - Constraints: Constraints{ + Role: pd.Leader, + LabelConstraints: []pd.LabelConstraint{ { Key: "zone", - Op: NotIn, + Op: pd.NotIn, Values: []string{"sh"}, }, }, @@ -209,14 +210,14 @@ func TestGetLeaderDCByBundle(t *testing.T) { name: "leader have multi values", bundle: &Bundle{ ID: GroupID(1), - Rules: []*Rule{ + Rules: []*pd.Rule{ { ID: "11", - Role: Leader, - Constraints: Constraints{ + Role: pd.Leader, + LabelConstraints: []pd.LabelConstraint{ { Key: "zone", - Op: In, + Op: pd.In, Values: []string{"sh", "bj"}, }, }, @@ -230,14 +231,14 @@ func TestGetLeaderDCByBundle(t *testing.T) { name: "irrelvant rules", bundle: &Bundle{ ID: GroupID(1), - Rules: []*Rule{ + Rules: []*pd.Rule{ { ID: "15", - Role: Leader, - Constraints: Constraints{ + Role: pd.Leader, + LabelConstraints: []pd.LabelConstraint{ { Key: EngineLabelKey, - Op: NotIn, + Op: pd.NotIn, Values: []string{EngineLabelTiFlash}, }, }, @@ -245,11 +246,11 @@ func TestGetLeaderDCByBundle(t *testing.T) { }, { ID: "14", - Role: Leader, - Constraints: Constraints{ + Role: pd.Leader, + LabelConstraints: []pd.LabelConstraint{ { Key: "disk", - Op: NotIn, + Op: pd.NotIn, Values: []string{"ssd", "hdd"}, }, }, @@ -257,11 +258,11 @@ func TestGetLeaderDCByBundle(t *testing.T) { }, { ID: "13", - Role: Leader, - Constraints: Constraints{ + Role: pd.Leader, + LabelConstraints: []pd.LabelConstraint{ { Key: "zone", - Op: In, + Op: pd.In, Values: []string{"bj"}, }, }, @@ -275,14 +276,14 @@ func TestGetLeaderDCByBundle(t *testing.T) { name: "multi leaders 1", bundle: &Bundle{ ID: GroupID(1), - Rules: []*Rule{ + Rules: []*pd.Rule{ { ID: "16", - Role: Leader, - Constraints: Constraints{ + Role: pd.Leader, + LabelConstraints: []pd.LabelConstraint{ { Key: "zone", - Op: In, + Op: pd.In, Values: []string{"sh"}, }, }, @@ -296,14 +297,14 @@ func TestGetLeaderDCByBundle(t *testing.T) { name: "multi leaders 2", bundle: &Bundle{ ID: GroupID(1), - Rules: []*Rule{ + Rules: []*pd.Rule{ { ID: "17", - Role: Leader, - Constraints: Constraints{ + Role: pd.Leader, + LabelConstraints: []pd.LabelConstraint{ { Key: "zone", - Op: In, + Op: pd.In, Values: []string{"sh"}, }, }, @@ -311,11 +312,11 @@ func TestGetLeaderDCByBundle(t *testing.T) { }, { ID: "18", - Role: Leader, - Constraints: Constraints{ + Role: pd.Leader, + LabelConstraints: []pd.LabelConstraint{ { Key: "zone", - Op: In, + Op: pd.In, Values: []string{"bj"}, }, }, @@ -342,13 +343,13 @@ func TestString(t *testing.T) { ID: GroupID(1), } - rules1, err := newRules(Voter, 3, `["+zone=sh", "+zone=sh"]`) + rules1, err := newRules(pd.Voter, 3, `["+zone=sh", "+zone=sh"]`) require.NoError(t, err) - rules2, err := newRules(Voter, 4, `["-zone=sh", "+zone=bj"]`) + rules2, err := newRules(pd.Voter, 4, `["-zone=sh", "+zone=bj"]`) require.NoError(t, err) bundle.Rules = append(rules1, rules2...) - require.Equal(t, "{\"group_id\":\"TiDB_DDL_1\",\"group_index\":0,\"group_override\":false,\"rules\":[{\"group_id\":\"\",\"id\":\"\",\"start_key\":\"\",\"end_key\":\"\",\"role\":\"voter\",\"count\":3,\"label_constraints\":[{\"key\":\"zone\",\"op\":\"in\",\"values\":[\"sh\"]}]},{\"group_id\":\"\",\"id\":\"\",\"start_key\":\"\",\"end_key\":\"\",\"role\":\"voter\",\"count\":4,\"label_constraints\":[{\"key\":\"zone\",\"op\":\"notIn\",\"values\":[\"sh\"]},{\"key\":\"zone\",\"op\":\"in\",\"values\":[\"bj\"]}]}]}", bundle.String()) + require.Equal(t, "{\"group_id\":\"TiDB_DDL_1\",\"group_index\":0,\"group_override\":false,\"rules\":[{\"group_id\":\"\",\"id\":\"\",\"start_key\":\"\",\"end_key\":\"\",\"role\":\"voter\",\"is_witness\":false,\"count\":3,\"label_constraints\":[{\"key\":\"zone\",\"op\":\"in\",\"values\":[\"sh\"]}]},{\"group_id\":\"\",\"id\":\"\",\"start_key\":\"\",\"end_key\":\"\",\"role\":\"voter\",\"is_witness\":false,\"count\":4,\"label_constraints\":[{\"key\":\"zone\",\"op\":\"notIn\",\"values\":[\"sh\"]},{\"key\":\"zone\",\"op\":\"in\",\"values\":[\"bj\"]}]}]}", bundle.String()) require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/ddl/placement/MockMarshalFailure", `return(true)`)) defer func() { @@ -372,7 +373,7 @@ func TestNewBundleFromOptions(t *testing.T) { type TestCase struct { name string input *model.PlacementSettings - output []*Rule + output []*pd.Rule err error } var tests []TestCase @@ -380,8 +381,8 @@ func TestNewBundleFromOptions(t *testing.T) { tests = append(tests, TestCase{ name: "empty 1", input: &model.PlacementSettings{}, - output: []*Rule{ - NewRule(Voter, 3, NewConstraintsDirect()), + output: []*pd.Rule{ + NewRule(pd.Voter, 3, NewConstraintsDirect()), }, }) @@ -405,12 +406,12 @@ func TestNewBundleFromOptions(t *testing.T) { PrimaryRegion: "us", Regions: "us", }, - output: []*Rule{ - NewRule(Leader, 1, NewConstraintsDirect( - NewConstraintDirect("region", In, "us"), + output: []*pd.Rule{ + NewRule(pd.Leader, 1, NewConstraintsDirect( + NewConstraintDirect("region", pd.In, "us"), )), - NewRule(Voter, 2, NewConstraintsDirect( - NewConstraintDirect("region", In, "us"), + NewRule(pd.Voter, 2, NewConstraintsDirect( + NewConstraintDirect("region", pd.In, "us"), )), }, }) @@ -422,14 +423,14 @@ func TestNewBundleFromOptions(t *testing.T) { Regions: "us", Schedule: "majority_in_primary", }, - output: []*Rule{ - NewRule(Leader, 1, NewConstraintsDirect( - NewConstraintDirect("region", In, "us"), + output: []*pd.Rule{ + NewRule(pd.Leader, 1, NewConstraintsDirect( + NewConstraintDirect("region", pd.In, "us"), )), - NewRule(Voter, 1, NewConstraintsDirect( - NewConstraintDirect("region", In, "us"), + NewRule(pd.Voter, 1, NewConstraintsDirect( + NewConstraintDirect("region", pd.In, "us"), )), - NewRule(Voter, 1, NewConstraintsDirect()), + NewRule(pd.Voter, 1, NewConstraintsDirect()), }, }) @@ -440,12 +441,12 @@ func TestNewBundleFromOptions(t *testing.T) { Regions: "bj,sh,us", Followers: 1, }, - output: []*Rule{ - NewRule(Leader, 1, NewConstraintsDirect( - NewConstraintDirect("region", In, "us"), + output: []*pd.Rule{ + NewRule(pd.Leader, 1, NewConstraintsDirect( + NewConstraintDirect("region", pd.In, "us"), )), - NewRule(Voter, 1, NewConstraintsDirect( - NewConstraintDirect("region", In, "bj", "sh"), + NewRule(pd.Voter, 1, NewConstraintsDirect( + NewConstraintDirect("region", pd.In, "bj", "sh"), )), }, }) @@ -456,8 +457,8 @@ func TestNewBundleFromOptions(t *testing.T) { Followers: 2, Schedule: "even", }, - output: []*Rule{ - NewRule(Voter, 3, NewConstraintsDirect()), + output: []*pd.Rule{ + NewRule(pd.Voter, 3, NewConstraintsDirect()), }, }) @@ -467,8 +468,8 @@ func TestNewBundleFromOptions(t *testing.T) { Followers: 2, Schedule: "majority_in_primary", }, - output: []*Rule{ - NewRule(Voter, 3, NewConstraintsDirect()), + output: []*pd.Rule{ + NewRule(pd.Voter, 3, NewConstraintsDirect()), }, }) @@ -516,15 +517,15 @@ func TestNewBundleFromOptions(t *testing.T) { Regions: "sh,us", Followers: 5, }, - output: []*Rule{ - NewRule(Leader, 1, NewConstraintsDirect( - NewConstraintDirect("region", In, "us"), + output: []*pd.Rule{ + NewRule(pd.Leader, 1, NewConstraintsDirect( + NewConstraintDirect("region", pd.In, "us"), )), - NewRule(Voter, 2, NewConstraintsDirect( - NewConstraintDirect("region", In, "us"), + NewRule(pd.Voter, 2, NewConstraintsDirect( + NewConstraintDirect("region", pd.In, "us"), )), - NewRule(Voter, 3, NewConstraintsDirect( - NewConstraintDirect("region", In, "sh"), + NewRule(pd.Voter, 3, NewConstraintsDirect( + NewConstraintDirect("region", pd.In, "sh"), )), }, }) @@ -540,15 +541,15 @@ func TestNewBundleFromOptions(t *testing.T) { Followers: 4, Schedule: "majority_in_primary", }, - output: []*Rule{ - NewRule(Leader, 1, NewConstraintsDirect( - NewConstraintDirect("region", In, "sh"), + output: []*pd.Rule{ + NewRule(pd.Leader, 1, NewConstraintsDirect( + NewConstraintDirect("region", pd.In, "sh"), )), - NewRule(Voter, 2, NewConstraintsDirect( - NewConstraintDirect("region", In, "sh"), + NewRule(pd.Voter, 2, NewConstraintsDirect( + NewConstraintDirect("region", pd.In, "sh"), )), - NewRule(Voter, 2, NewConstraintsDirect( - NewConstraintDirect("region", In, "bj"), + NewRule(pd.Voter, 2, NewConstraintsDirect( + NewConstraintDirect("region", pd.In, "bj"), )), }, }) @@ -558,12 +559,12 @@ func TestNewBundleFromOptions(t *testing.T) { input: &model.PlacementSettings{ Constraints: "[+region=us]", }, - output: []*Rule{ - NewRule(Leader, 1, NewConstraintsDirect( - NewConstraintDirect("region", In, "us"), + output: []*pd.Rule{ + NewRule(pd.Leader, 1, NewConstraintsDirect( + NewConstraintDirect("region", pd.In, "us"), )), - NewRule(Voter, 2, NewConstraintsDirect( - NewConstraintDirect("region", In, "us"), + NewRule(pd.Voter, 2, NewConstraintsDirect( + NewConstraintDirect("region", pd.In, "us"), )), }, }) @@ -575,15 +576,15 @@ func TestNewBundleFromOptions(t *testing.T) { Followers: 2, Learners: 2, }, - output: []*Rule{ - NewRule(Leader, 1, NewConstraintsDirect( - NewConstraintDirect("region", In, "us"), + output: []*pd.Rule{ + NewRule(pd.Leader, 1, NewConstraintsDirect( + NewConstraintDirect("region", pd.In, "us"), )), - NewRule(Voter, 2, NewConstraintsDirect( - NewConstraintDirect("region", In, "us"), + NewRule(pd.Voter, 2, NewConstraintsDirect( + NewConstraintDirect("region", pd.In, "us"), )), - NewRule(Learner, 2, NewConstraintsDirect( - NewConstraintDirect("region", In, "us"), + NewRule(pd.Learner, 2, NewConstraintsDirect( + NewConstraintDirect("region", pd.In, "us"), )), }, }) @@ -593,9 +594,9 @@ func TestNewBundleFromOptions(t *testing.T) { input: &model.PlacementSettings{ LeaderConstraints: "[+region=as]", }, - output: []*Rule{ - NewRule(Leader, 1, NewConstraintsDirect(NewConstraintDirect("region", In, "as"))), - NewRule(Voter, 2, NewConstraintsDirect()), + output: []*pd.Rule{ + NewRule(pd.Leader, 1, NewConstraintsDirect(NewConstraintDirect("region", pd.In, "as"))), + NewRule(pd.Voter, 2, NewConstraintsDirect()), }, }) @@ -605,9 +606,9 @@ func TestNewBundleFromOptions(t *testing.T) { LeaderConstraints: "[+region=as]", Followers: 4, }, - output: []*Rule{ - NewRule(Leader, 1, NewConstraintsDirect(NewConstraintDirect("region", In, "as"))), - NewRule(Voter, 4, NewConstraintsDirect()), + output: []*pd.Rule{ + NewRule(pd.Leader, 1, NewConstraintsDirect(NewConstraintDirect("region", pd.In, "as"))), + NewRule(pd.Voter, 4, NewConstraintsDirect()), }, }) tests = append(tests, TestCase{ @@ -616,9 +617,9 @@ func TestNewBundleFromOptions(t *testing.T) { LeaderConstraints: "[+region=as]", FollowerConstraints: `{"+region=us": 2}`, }, - output: []*Rule{ - NewRule(Leader, 1, NewConstraintsDirect(NewConstraintDirect("region", In, "as"))), - NewRule(Voter, 2, NewConstraintsDirect(NewConstraintDirect("region", In, "us"))), + output: []*pd.Rule{ + NewRule(pd.Leader, 1, NewConstraintsDirect(NewConstraintDirect("region", pd.In, "as"))), + NewRule(pd.Voter, 2, NewConstraintsDirect(NewConstraintDirect("region", pd.In, "us"))), }, }) @@ -628,9 +629,9 @@ func TestNewBundleFromOptions(t *testing.T) { LeaderConstraints: "[+region=as]", FollowerConstraints: "[-region=us]", }, - output: []*Rule{ - NewRule(Leader, 1, NewConstraintsDirect(NewConstraintDirect("region", In, "as"))), - NewRule(Voter, 2, NewConstraintsDirect(NewConstraintDirect("region", NotIn, "us"))), + output: []*pd.Rule{ + NewRule(pd.Leader, 1, NewConstraintsDirect(NewConstraintDirect("region", pd.In, "as"))), + NewRule(pd.Voter, 2, NewConstraintsDirect(NewConstraintDirect("region", pd.NotIn, "us"))), }, }) @@ -649,9 +650,9 @@ func TestNewBundleFromOptions(t *testing.T) { Followers: 2, FollowerConstraints: "[+region=bj]", }, - output: []*Rule{ - NewRule(Leader, 1, NewConstraintsDirect()), - NewRule(Voter, 2, NewConstraintsDirect(NewConstraintDirect("region", In, "bj"))), + output: []*pd.Rule{ + NewRule(pd.Leader, 1, NewConstraintsDirect()), + NewRule(pd.Voter, 2, NewConstraintsDirect(NewConstraintDirect("region", pd.In, "bj"))), }, }) @@ -732,9 +733,9 @@ func TestNewBundleFromOptions(t *testing.T) { input: &model.PlacementSettings{ FollowerConstraints: "{+disk=ssd: 1}", }, - output: []*Rule{ - NewRule(Leader, 1, NewConstraintsDirect()), - NewRule(Voter, 1, NewConstraintsDirect(NewConstraintDirect("disk", In, "ssd"))), + output: []*pd.Rule{ + NewRule(pd.Leader, 1, NewConstraintsDirect()), + NewRule(pd.Voter, 1, NewConstraintsDirect(NewConstraintDirect("disk", pd.In, "ssd"))), }, }) @@ -752,10 +753,10 @@ func TestNewBundleFromOptions(t *testing.T) { input: &model.PlacementSettings{ LearnerConstraints: `{"+region=us": 2}`, }, - output: []*Rule{ - NewRule(Leader, 1, NewConstraintsDirect()), - NewRule(Voter, 2, NewConstraintsDirect()), - NewRule(Learner, 2, NewConstraintsDirect(NewConstraintDirect("region", In, "us"))), + output: []*pd.Rule{ + NewRule(pd.Leader, 1, NewConstraintsDirect()), + NewRule(pd.Voter, 2, NewConstraintsDirect()), + NewRule(pd.Learner, 2, NewConstraintsDirect(NewConstraintDirect("region", pd.In, "us"))), }, }) @@ -773,8 +774,8 @@ func TestNewBundleFromOptions(t *testing.T) { input: &model.PlacementSettings{ Constraints: `{"+region=us": 3}`, }, - output: []*Rule{ - NewRule(Voter, 3, NewConstraintsDirect(NewConstraintDirect("region", In, "us"))), + output: []*pd.Rule{ + NewRule(pd.Voter, 3, NewConstraintsDirect(NewConstraintDirect("region", pd.In, "us"))), }, }) @@ -783,10 +784,10 @@ func TestNewBundleFromOptions(t *testing.T) { input: &model.PlacementSettings{ Constraints: `{ "+region=us-east-1":2, "+region=us-east-2": 2, "+region=us-west-1": 1}`, }, - output: []*Rule{ - NewRule(Voter, 2, NewConstraintsDirect(NewConstraintDirect("region", In, "us-east-1"))), - NewRule(Voter, 2, NewConstraintsDirect(NewConstraintDirect("region", In, "us-east-2"))), - NewRule(Voter, 1, NewConstraintsDirect(NewConstraintDirect("region", In, "us-west-1"))), + output: []*pd.Rule{ + NewRule(pd.Voter, 2, NewConstraintsDirect(NewConstraintDirect("region", pd.In, "us-east-1"))), + NewRule(pd.Voter, 2, NewConstraintsDirect(NewConstraintDirect("region", pd.In, "us-east-2"))), + NewRule(pd.Voter, 1, NewConstraintsDirect(NewConstraintDirect("region", pd.In, "us-west-1"))), }, }) @@ -796,9 +797,9 @@ func TestNewBundleFromOptions(t *testing.T) { Constraints: `{"+region=us-east": 3}`, LearnerConstraints: `{"+region=us-west": 1}`, }, - output: []*Rule{ - NewRule(Voter, 3, NewConstraintsDirect(NewConstraintDirect("region", In, "us-east"))), - NewRule(Learner, 1, NewConstraintsDirect(NewConstraintDirect("region", In, "us-west"))), + output: []*pd.Rule{ + NewRule(pd.Voter, 3, NewConstraintsDirect(NewConstraintDirect("region", pd.In, "us-east"))), + NewRule(pd.Learner, 1, NewConstraintsDirect(NewConstraintDirect("region", pd.In, "us-west"))), }, }) @@ -819,7 +820,7 @@ func TestResetBundleWithSingleRule(t *testing.T) { ID: GroupID(1), } - rules, err := newRules(Voter, 3, `["+zone=sh", "+zone=sh"]`) + rules, err := newRules(pd.Voter, 3, `["+zone=sh", "+zone=sh"]`) require.NoError(t, err) bundle.Rules = rules @@ -936,15 +937,15 @@ func TestTidy(t *testing.T) { ID: GroupID(1), } - rules0, err := newRules(Voter, 1, `["+zone=sh", "+zone=sh"]`) + rules0, err := newRules(pd.Voter, 1, `["+zone=sh", "+zone=sh"]`) require.NoError(t, err) require.Len(t, rules0, 1) rules0[0].Count = 0 // test prune useless rules - rules1, err := newRules(Voter, 4, `["-zone=sh", "+zone=bj"]`) + rules1, err := newRules(pd.Voter, 4, `["-zone=sh", "+zone=bj"]`) require.NoError(t, err) require.Len(t, rules1, 1) - rules2, err := newRules(Voter, 0, `{"-zone=sh,+zone=bj": 4}}`) + rules2, err := newRules(pd.Voter, 0, `{"-zone=sh,+zone=bj": 4}}`) require.NoError(t, err) bundle.Rules = append(bundle.Rules, rules0...) bundle.Rules = append(bundle.Rules, rules1...) @@ -955,23 +956,23 @@ func TestTidy(t *testing.T) { require.NoError(t, err) require.Len(t, bundle.Rules, 1) require.Equal(t, "0", bundle.Rules[0].ID) - require.Len(t, bundle.Rules[0].Constraints, 3) - require.Equal(t, Constraint{ - Op: NotIn, + require.Len(t, bundle.Rules[0].LabelConstraints, 3) + require.Equal(t, pd.LabelConstraint{ + Op: pd.NotIn, Key: EngineLabelKey, Values: []string{EngineLabelTiFlash}, - }, bundle.Rules[0].Constraints[2]) + }, bundle.Rules[0].LabelConstraints[2]) // merge - rules3, err := newRules(Follower, 4, "") + rules3, err := newRules(pd.Follower, 4, "") require.NoError(t, err) require.Len(t, rules3, 1) - rules4, err := newRules(Follower, 5, "") + rules4, err := newRules(pd.Follower, 5, "") require.NoError(t, err) require.Len(t, rules4, 1) - rules0[0].Role = Voter + rules0[0].Role = pd.Voter bundle.Rules = append(bundle.Rules, rules0...) bundle.Rules = append(bundle.Rules, rules3...) bundle.Rules = append(bundle.Rules, rules4...) @@ -985,13 +986,13 @@ func TestTidy(t *testing.T) { require.Equal(t, "0", bundle.Rules[0].ID) require.Equal(t, "1", bundle.Rules[1].ID) require.Equal(t, 9, bundle.Rules[1].Count) - require.Equal(t, Constraints{ + require.Equal(t, []pd.LabelConstraint{ { - Op: NotIn, + Op: pd.NotIn, Key: EngineLabelKey, Values: []string{EngineLabelTiFlash}, }, - }, bundle.Rules[1].Constraints) + }, bundle.Rules[1].LabelConstraints) require.Equal(t, []string{"zone", "host"}, bundle.Rules[1].LocationLabels) } err = bundle.Tidy() @@ -1009,8 +1010,8 @@ func TestTidy(t *testing.T) { require.NoError(t, err) require.Equal(t, bundle, bundle2) - bundle.Rules[1].Constraints = append(bundle.Rules[1].Constraints, Constraint{ - Op: In, + bundle.Rules[1].LabelConstraints = append(bundle.Rules[1].LabelConstraints, pd.LabelConstraint{ + Op: pd.In, Key: EngineLabelKey, Values: []string{EngineLabelTiFlash}, }) @@ -1026,40 +1027,40 @@ func TestTidy2(t *testing.T) { { name: "Empty bundle", bundle: Bundle{ - Rules: []*Rule{}, + Rules: []*pd.Rule{}, }, expected: Bundle{ - Rules: []*Rule{}, + Rules: []*pd.Rule{}, }, }, { name: "Rules with empty constraints are merged", bundle: Bundle{ - Rules: []*Rule{ + Rules: []*pd.Rule{ { - ID: "1", - Role: Leader, - Count: 1, - Constraints: Constraints{}, - LocationLabels: []string{"region"}, + ID: "1", + Role: pd.Leader, + Count: 1, + LabelConstraints: []pd.LabelConstraint{}, + LocationLabels: []string{"region"}, }, { - ID: "2", - Role: Voter, - Count: 2, - Constraints: Constraints{}, - LocationLabels: []string{"region"}, + ID: "2", + Role: pd.Voter, + Count: 2, + LabelConstraints: []pd.LabelConstraint{}, + LocationLabels: []string{"region"}, }, }, }, expected: Bundle{ - Rules: []*Rule{ + Rules: []*pd.Rule{ { - ID: "0", - Role: Voter, - Count: 3, - Constraints: Constraints{}, - LocationLabels: []string{"region"}, + ID: "0", + Role: pd.Voter, + Count: 3, + LabelConstraints: []pd.LabelConstraint{}, + LocationLabels: []string{"region"}, }, }, }, @@ -1067,21 +1068,21 @@ func TestTidy2(t *testing.T) { { name: "Rules with same constraints are merged, Leader + Follower", bundle: Bundle{ - Rules: []*Rule{ + Rules: []*pd.Rule{ { ID: "1", - Role: Leader, - Constraints: Constraints{ - {Op: In, Key: "rack", Values: []string{"1"}}, + Role: pd.Leader, + LabelConstraints: []pd.LabelConstraint{ + {Op: pd.In, Key: "rack", Values: []string{"1"}}, }, Count: 1, LocationLabels: []string{"region"}, }, { ID: "2", - Role: Follower, - Constraints: Constraints{ - {Op: In, Key: "rack", Values: []string{"1"}}, + Role: pd.Follower, + LabelConstraints: []pd.LabelConstraint{ + {Op: pd.In, Key: "rack", Values: []string{"1"}}, }, Count: 2, LocationLabels: []string{"region"}, @@ -1089,12 +1090,12 @@ func TestTidy2(t *testing.T) { }, }, expected: Bundle{ - Rules: []*Rule{ + Rules: []*pd.Rule{ { ID: "0", - Role: Voter, - Constraints: Constraints{ - {Op: In, Key: "rack", Values: []string{"1"}}, + Role: pd.Voter, + LabelConstraints: []pd.LabelConstraint{ + {Op: pd.In, Key: "rack", Values: []string{"1"}}, }, Count: 3, LocationLabels: []string{"region"}, @@ -1105,21 +1106,21 @@ func TestTidy2(t *testing.T) { { name: "Rules with same constraints are merged, Leader + Voter", bundle: Bundle{ - Rules: []*Rule{ + Rules: []*pd.Rule{ { ID: "1", - Role: Leader, - Constraints: Constraints{ - {Op: In, Key: "rack", Values: []string{"1"}}, + Role: pd.Leader, + LabelConstraints: []pd.LabelConstraint{ + {Op: pd.In, Key: "rack", Values: []string{"1"}}, }, Count: 1, LocationLabels: []string{"region"}, }, { ID: "2", - Role: Voter, - Constraints: Constraints{ - {Op: In, Key: "rack", Values: []string{"1"}}, + Role: pd.Voter, + LabelConstraints: []pd.LabelConstraint{ + {Op: pd.In, Key: "rack", Values: []string{"1"}}, }, Count: 2, LocationLabels: []string{"region"}, @@ -1127,12 +1128,12 @@ func TestTidy2(t *testing.T) { }, }, expected: Bundle{ - Rules: []*Rule{ + Rules: []*pd.Rule{ { ID: "0", - Role: Voter, - Constraints: Constraints{ - {Op: In, Key: "rack", Values: []string{"1"}}, + Role: pd.Voter, + LabelConstraints: []pd.LabelConstraint{ + {Op: pd.In, Key: "rack", Values: []string{"1"}}, }, Count: 3, LocationLabels: []string{"region"}, @@ -1143,30 +1144,30 @@ func TestTidy2(t *testing.T) { { name: "Rules with same constraints and role are merged, Leader + Follower + Voter", bundle: Bundle{ - Rules: []*Rule{ + Rules: []*pd.Rule{ { ID: "1", - Role: Leader, - Constraints: Constraints{ - {Op: In, Key: "rack", Values: []string{"1"}}, + Role: pd.Leader, + LabelConstraints: []pd.LabelConstraint{ + {Op: pd.In, Key: "rack", Values: []string{"1"}}, }, Count: 1, LocationLabels: []string{"region"}, }, { ID: "2", - Role: Follower, - Constraints: Constraints{ - {Op: In, Key: "rack", Values: []string{"1"}}, + Role: pd.Follower, + LabelConstraints: []pd.LabelConstraint{ + {Op: pd.In, Key: "rack", Values: []string{"1"}}, }, Count: 1, LocationLabels: []string{"region"}, }, { ID: "3", - Role: Voter, - Constraints: Constraints{ - {Op: In, Key: "rack", Values: []string{"1"}}, + Role: pd.Voter, + LabelConstraints: []pd.LabelConstraint{ + {Op: pd.In, Key: "rack", Values: []string{"1"}}, }, Count: 1, LocationLabels: []string{"region"}, @@ -1174,12 +1175,12 @@ func TestTidy2(t *testing.T) { }, }, expected: Bundle{ - Rules: []*Rule{ + Rules: []*pd.Rule{ { ID: "0", - Role: Voter, - Constraints: Constraints{ - {Op: In, Key: "rack", Values: []string{"1"}}, + Role: pd.Voter, + LabelConstraints: []pd.LabelConstraint{ + {Op: pd.In, Key: "rack", Values: []string{"1"}}, }, Count: 3, LocationLabels: []string{"region"}, @@ -1190,39 +1191,39 @@ func TestTidy2(t *testing.T) { { name: "Rules with same constraints and role are merged, Leader + Follower + Voter + Learner", bundle: Bundle{ - Rules: []*Rule{ + Rules: []*pd.Rule{ { ID: "1", - Role: Leader, - Constraints: Constraints{ - {Op: In, Key: "rack", Values: []string{"1"}}, + Role: pd.Leader, + LabelConstraints: []pd.LabelConstraint{ + {Op: pd.In, Key: "rack", Values: []string{"1"}}, }, Count: 1, LocationLabels: []string{"region"}, }, { ID: "2", - Role: Follower, - Constraints: Constraints{ - {Op: In, Key: "rack", Values: []string{"1"}}, + Role: pd.Follower, + LabelConstraints: []pd.LabelConstraint{ + {Op: pd.In, Key: "rack", Values: []string{"1"}}, }, Count: 1, LocationLabels: []string{"region"}, }, { ID: "3", - Role: Voter, - Constraints: Constraints{ - {Op: In, Key: "rack", Values: []string{"1"}}, + Role: pd.Voter, + LabelConstraints: []pd.LabelConstraint{ + {Op: pd.In, Key: "rack", Values: []string{"1"}}, }, Count: 1, LocationLabels: []string{"region"}, }, { ID: "4", - Role: Learner, - Constraints: Constraints{ - {Op: In, Key: "rack", Values: []string{"1"}}, + Role: pd.Learner, + LabelConstraints: []pd.LabelConstraint{ + {Op: pd.In, Key: "rack", Values: []string{"1"}}, }, Count: 2, LocationLabels: []string{"region"}, @@ -1230,21 +1231,21 @@ func TestTidy2(t *testing.T) { }, }, expected: Bundle{ - Rules: []*Rule{ + Rules: []*pd.Rule{ { ID: "0", - Role: Voter, - Constraints: Constraints{ - {Op: In, Key: "rack", Values: []string{"1"}}, + Role: pd.Voter, + LabelConstraints: []pd.LabelConstraint{ + {Op: pd.In, Key: "rack", Values: []string{"1"}}, }, Count: 3, LocationLabels: []string{"region"}, }, { ID: "3", - Role: Learner, - Constraints: Constraints{ - {Op: In, Key: "rack", Values: []string{"1"}}, + Role: pd.Learner, + LabelConstraints: []pd.LabelConstraint{ + {Op: pd.In, Key: "rack", Values: []string{"1"}}, }, Count: 2, LocationLabels: []string{"region"}, @@ -1255,39 +1256,39 @@ func TestTidy2(t *testing.T) { { name: "Rules with same constraints and role are merged, Leader + Follower + Learner | Follower", bundle: Bundle{ - Rules: []*Rule{ + Rules: []*pd.Rule{ { ID: "1", - Role: Leader, - Constraints: Constraints{ - {Op: In, Key: "rack", Values: []string{"1"}}, + Role: pd.Leader, + LabelConstraints: []pd.LabelConstraint{ + {Op: pd.In, Key: "rack", Values: []string{"1"}}, }, Count: 1, LocationLabels: []string{"region"}, }, { ID: "2", - Role: Follower, - Constraints: Constraints{ - {Op: In, Key: "rack", Values: []string{"1"}}, + Role: pd.Follower, + LabelConstraints: []pd.LabelConstraint{ + {Op: pd.In, Key: "rack", Values: []string{"1"}}, }, Count: 1, LocationLabels: []string{"region"}, }, { ID: "3", - Role: Learner, - Constraints: Constraints{ - {Op: In, Key: "rack", Values: []string{"1"}}, + Role: pd.Learner, + LabelConstraints: []pd.LabelConstraint{ + {Op: pd.In, Key: "rack", Values: []string{"1"}}, }, Count: 1, LocationLabels: []string{"region"}, }, { ID: "4", - Role: Follower, - Constraints: Constraints{ - {Op: In, Key: "rack", Values: []string{"2"}}, + Role: pd.Follower, + LabelConstraints: []pd.LabelConstraint{ + {Op: pd.In, Key: "rack", Values: []string{"2"}}, }, Count: 1, LocationLabels: []string{"region"}, @@ -1295,30 +1296,30 @@ func TestTidy2(t *testing.T) { }, }, expected: Bundle{ - Rules: []*Rule{ + Rules: []*pd.Rule{ { ID: "0", - Role: Voter, - Constraints: Constraints{ - {Op: In, Key: "rack", Values: []string{"1"}}, + Role: pd.Voter, + LabelConstraints: []pd.LabelConstraint{ + {Op: pd.In, Key: "rack", Values: []string{"1"}}, }, Count: 2, LocationLabels: []string{"region"}, }, { ID: "2", - Role: Learner, - Constraints: Constraints{ - {Op: In, Key: "rack", Values: []string{"1"}}, + Role: pd.Learner, + LabelConstraints: []pd.LabelConstraint{ + {Op: pd.In, Key: "rack", Values: []string{"1"}}, }, Count: 1, LocationLabels: []string{"region"}, }, { ID: "3", - Role: Follower, - Constraints: Constraints{ - {Op: In, Key: "rack", Values: []string{"2"}}, + Role: pd.Follower, + LabelConstraints: []pd.LabelConstraint{ + {Op: pd.In, Key: "rack", Values: []string{"2"}}, }, Count: 1, LocationLabels: []string{"region"}, @@ -1329,39 +1330,39 @@ func TestTidy2(t *testing.T) { { name: "Rules with same constraints and role are merged, Leader + Follower + Learner | Voter", bundle: Bundle{ - Rules: []*Rule{ + Rules: []*pd.Rule{ { ID: "1", - Role: Leader, - Constraints: Constraints{ - {Op: In, Key: "rack", Values: []string{"1"}}, + Role: pd.Leader, + LabelConstraints: []pd.LabelConstraint{ + {Op: pd.In, Key: "rack", Values: []string{"1"}}, }, Count: 1, LocationLabels: []string{"region"}, }, { ID: "2", - Role: Follower, - Constraints: Constraints{ - {Op: In, Key: "rack", Values: []string{"1"}}, + Role: pd.Follower, + LabelConstraints: []pd.LabelConstraint{ + {Op: pd.In, Key: "rack", Values: []string{"1"}}, }, Count: 1, LocationLabels: []string{"region"}, }, { ID: "3", - Role: Learner, - Constraints: Constraints{ - {Op: In, Key: "rack", Values: []string{"1"}}, + Role: pd.Learner, + LabelConstraints: []pd.LabelConstraint{ + {Op: pd.In, Key: "rack", Values: []string{"1"}}, }, Count: 1, LocationLabels: []string{"region"}, }, { ID: "4", - Role: Voter, - Constraints: Constraints{ - {Op: In, Key: "rack", Values: []string{"2"}}, + Role: pd.Voter, + LabelConstraints: []pd.LabelConstraint{ + {Op: pd.In, Key: "rack", Values: []string{"2"}}, }, Count: 1, LocationLabels: []string{"region"}, @@ -1369,39 +1370,39 @@ func TestTidy2(t *testing.T) { }, }, expected: Bundle{ - Rules: []*Rule{ + Rules: []*pd.Rule{ { ID: "0", - Role: Leader, - Constraints: Constraints{ - {Op: In, Key: "rack", Values: []string{"1"}}, + Role: pd.Leader, + LabelConstraints: []pd.LabelConstraint{ + {Op: pd.In, Key: "rack", Values: []string{"1"}}, }, Count: 1, LocationLabels: []string{"region"}, }, { ID: "1", - Role: Follower, - Constraints: Constraints{ - {Op: In, Key: "rack", Values: []string{"1"}}, + Role: pd.Follower, + LabelConstraints: []pd.LabelConstraint{ + {Op: pd.In, Key: "rack", Values: []string{"1"}}, }, Count: 1, LocationLabels: []string{"region"}, }, { ID: "2", - Role: Learner, - Constraints: Constraints{ - {Op: In, Key: "rack", Values: []string{"1"}}, + Role: pd.Learner, + LabelConstraints: []pd.LabelConstraint{ + {Op: pd.In, Key: "rack", Values: []string{"1"}}, }, Count: 1, LocationLabels: []string{"region"}, }, { ID: "3", - Role: Voter, - Constraints: Constraints{ - {Op: In, Key: "rack", Values: []string{"2"}}, + Role: pd.Voter, + LabelConstraints: []pd.LabelConstraint{ + {Op: pd.In, Key: "rack", Values: []string{"2"}}, }, Count: 1, LocationLabels: []string{"region"}, @@ -1412,21 +1413,21 @@ func TestTidy2(t *testing.T) { { name: "Rules with different constraints are kept separate", bundle: Bundle{ - Rules: []*Rule{ + Rules: []*pd.Rule{ { ID: "1", - Role: Leader, - Constraints: Constraints{ - {Op: In, Key: "rack", Values: []string{"1"}}, + Role: pd.Leader, + LabelConstraints: []pd.LabelConstraint{ + {Op: pd.In, Key: "rack", Values: []string{"1"}}, }, Count: 1, LocationLabels: []string{"region"}, }, { ID: "2", - Role: Follower, - Constraints: Constraints{ - {Op: In, Key: "rack", Values: []string{"2"}}, + Role: pd.Follower, + LabelConstraints: []pd.LabelConstraint{ + {Op: pd.In, Key: "rack", Values: []string{"2"}}, }, Count: 1, LocationLabels: []string{"region"}, @@ -1434,21 +1435,21 @@ func TestTidy2(t *testing.T) { }, }, expected: Bundle{ - Rules: []*Rule{ + Rules: []*pd.Rule{ { ID: "0", - Role: Leader, - Constraints: Constraints{ - {Op: In, Key: "rack", Values: []string{"1"}}, + Role: pd.Leader, + LabelConstraints: []pd.LabelConstraint{ + {Op: pd.In, Key: "rack", Values: []string{"1"}}, }, Count: 1, LocationLabels: []string{"region"}, }, { ID: "1", - Role: Follower, - Constraints: Constraints{ - {Op: In, Key: "rack", Values: []string{"2"}}, + Role: pd.Follower, + LabelConstraints: []pd.LabelConstraint{ + {Op: pd.In, Key: "rack", Values: []string{"2"}}, }, Count: 1, LocationLabels: []string{"region"}, @@ -1468,8 +1469,8 @@ func TestTidy2(t *testing.T) { for i, rule := range tt.bundle.Rules { expectedRule := tt.expected.Rules[i] // Tiflash is always excluded from the constraints. - expectedRule.Constraints.Add(Constraint{ - Op: NotIn, + AddConstraint(&expectedRule.LabelConstraints, pd.LabelConstraint{ + Op: pd.NotIn, Key: EngineLabelKey, Values: []string{EngineLabelTiFlash}, }) diff --git a/pkg/ddl/placement/constraint.go b/pkg/ddl/placement/constraint.go index 49970eb31570d..a7463cd897f56 100644 --- a/pkg/ddl/placement/constraint.go +++ b/pkg/ddl/placement/constraint.go @@ -17,45 +17,24 @@ package placement import ( "fmt" "strings" -) - -// ConstraintOp defines how a Constraint matches a store. -type ConstraintOp string -const ( - // In restricts the store label value should in the value list. - // If label does not exist, `in` is always false. - In ConstraintOp = "in" - // NotIn restricts the store label value should not in the value list. - // If label does not exist, `notIn` is always true. - NotIn ConstraintOp = "notIn" - // Exists restricts the store should have the label. - Exists ConstraintOp = "exists" - // NotExists restricts the store should not have the label. - NotExists ConstraintOp = "notExists" + pd "github.com/tikv/pd/client/http" ) -// Constraint is used to filter store when trying to place peer of a region. -type Constraint struct { - Key string `json:"key,omitempty"` - Op ConstraintOp `json:"op,omitempty"` - Values []string `json:"values,omitempty"` -} - // NewConstraint will create a Constraint from a string. -func NewConstraint(label string) (Constraint, error) { - r := Constraint{} +func NewConstraint(label string) (pd.LabelConstraint, error) { + r := pd.LabelConstraint{} if len(label) < 4 { return r, fmt.Errorf("%w: %s", ErrInvalidConstraintFormat, label) } - var op ConstraintOp + var op pd.LabelConstraintOp switch label[0] { case '+': - op = In + op = pd.In case '-': - op = NotIn + op = pd.NotIn default: return r, fmt.Errorf("%w: %s", ErrInvalidConstraintFormat, label) } @@ -75,7 +54,7 @@ func NewConstraint(label string) (Constraint, error) { return r, fmt.Errorf("%w: %s", ErrInvalidConstraintFormat, label) } - if op == In && key == EngineLabelKey && strings.ToLower(val) == EngineLabelTiFlash { + if op == pd.In && key == EngineLabelKey && strings.ToLower(val) == EngineLabelTiFlash { return r, fmt.Errorf("%w: %s", ErrUnsupportedConstraint, label) } @@ -86,24 +65,24 @@ func NewConstraint(label string) (Constraint, error) { } // NewConstraintDirect will create a Constraint from argument directly. -func NewConstraintDirect(key string, op ConstraintOp, val ...string) Constraint { - return Constraint{ +func NewConstraintDirect(key string, op pd.LabelConstraintOp, val ...string) pd.LabelConstraint { + return pd.LabelConstraint{ Key: key, Op: op, Values: val, } } -// Restore converts a Constraint to a string. -func (c *Constraint) Restore() (string, error) { +// RestoreConstraint converts a Constraint to a string. +func RestoreConstraint(c *pd.LabelConstraint) (string, error) { var sb strings.Builder if len(c.Values) != 1 { return "", fmt.Errorf("%w: constraint should have exactly one label value, got %v", ErrInvalidConstraintFormat, c.Values) } switch c.Op { - case In: + case pd.In: sb.WriteString("+") - case NotIn: + case pd.NotIn: sb.WriteString("-") default: return "", fmt.Errorf("%w: disallowed operation '%s'", ErrInvalidConstraintFormat, c.Op) @@ -126,9 +105,9 @@ const ( ConstraintDuplicated ) -// CompatibleWith will check if two constraints are compatible. +// ConstraintCompatibleWith will check if two constraints are compatible. // Return (compatible, duplicated). -func (c *Constraint) CompatibleWith(o *Constraint) ConstraintCompatibility { +func ConstraintCompatibleWith(c *pd.LabelConstraint, o *pd.LabelConstraint) ConstraintCompatibility { sameKey := c.Key == o.Key if !sameKey { return ConstraintCompatible @@ -148,7 +127,7 @@ func (c *Constraint) CompatibleWith(o *Constraint) ConstraintCompatibility { // 3. can not match multiple instances: +dc=sh, +dc=bj if sameOp && sameVal { return ConstraintDuplicated - } else if (!sameOp && sameVal) || (sameOp && !sameVal && c.Op == In) { + } else if (!sameOp && sameVal) || (sameOp && !sameVal && c.Op == pd.In) { return ConstraintIncompatible } diff --git a/pkg/ddl/placement/constraint_test.go b/pkg/ddl/placement/constraint_test.go index 739d7bf6b5ba6..577cbf0d0f837 100644 --- a/pkg/ddl/placement/constraint_test.go +++ b/pkg/ddl/placement/constraint_test.go @@ -19,6 +19,7 @@ import ( "testing" "github.com/stretchr/testify/require" + pd "github.com/tikv/pd/client/http" ) func TestNewFromYaml(t *testing.T) { @@ -32,34 +33,34 @@ func TestNewConstraint(t *testing.T) { type TestCase struct { name string input string - label Constraint + label pd.LabelConstraint err error } tests := []TestCase{ { name: "normal", input: "+zone=bj", - label: Constraint{ + label: pd.LabelConstraint{ Key: "zone", - Op: In, + Op: pd.In, Values: []string{"bj"}, }, }, { name: "normal with spaces", input: "- dc = sh ", - label: Constraint{ + label: pd.LabelConstraint{ Key: "dc", - Op: NotIn, + Op: pd.NotIn, Values: []string{"sh"}, }, }, { name: "not tiflash", input: "-engine = tiflash ", - label: Constraint{ + label: pd.LabelConstraint{ Key: "engine", - Op: NotIn, + Op: pd.NotIn, Values: []string{"tiflash"}, }, }, @@ -126,7 +127,7 @@ func TestNewConstraint(t *testing.T) { func TestRestoreConstraint(t *testing.T) { type TestCase struct { name string - input Constraint + input pd.LabelConstraint output string err error } @@ -158,8 +159,8 @@ func TestRestoreConstraint(t *testing.T) { tests = append(tests, TestCase{ name: "no values", - input: Constraint{ - Op: In, + input: pd.LabelConstraint{ + Op: pd.In, Key: "dc", Values: []string{}, }, @@ -168,8 +169,8 @@ func TestRestoreConstraint(t *testing.T) { tests = append(tests, TestCase{ name: "multiple values", - input: Constraint{ - Op: In, + input: pd.LabelConstraint{ + Op: pd.In, Key: "dc", Values: []string{"dc1", "dc2"}, }, @@ -178,7 +179,7 @@ func TestRestoreConstraint(t *testing.T) { tests = append(tests, TestCase{ name: "invalid op", - input: Constraint{ + input: pd.LabelConstraint{ Op: "[", Key: "dc", Values: []string{}, @@ -187,7 +188,7 @@ func TestRestoreConstraint(t *testing.T) { }) for _, test := range tests { - output, err := test.input.Restore() + output, err := RestoreConstraint(&test.input) comment := fmt.Sprintf("%s: %v", test.name, err) if test.err == nil { require.NoError(t, err, comment) @@ -201,8 +202,8 @@ func TestRestoreConstraint(t *testing.T) { func TestCompatibleWith(t *testing.T) { type TestCase struct { name string - i1 Constraint - i2 Constraint + i1 pd.LabelConstraint + i2 pd.LabelConstraint output ConstraintCompatibility } var tests []TestCase @@ -258,6 +259,6 @@ func TestCompatibleWith(t *testing.T) { }) for _, test := range tests { - require.Equal(t, test.output, test.i1.CompatibleWith(&test.i2), test.name) + require.Equal(t, test.output, ConstraintCompatibleWith(&test.i1, &test.i2), test.name) } } diff --git a/pkg/ddl/placement/constraints.go b/pkg/ddl/placement/constraints.go index a62d2265c36fd..adb830adb034d 100644 --- a/pkg/ddl/placement/constraints.go +++ b/pkg/ddl/placement/constraints.go @@ -23,26 +23,24 @@ import ( "sort" "strings" + pd "github.com/tikv/pd/client/http" "gopkg.in/yaml.v2" ) -// Constraints is a slice of constraints. -type Constraints []Constraint - // NewConstraints will check each labels, and build the Constraints. -func NewConstraints(labels []string) (Constraints, error) { +func NewConstraints(labels []string) ([]pd.LabelConstraint, error) { if len(labels) == 0 { return nil, nil } - constraints := make(Constraints, 0, len(labels)) + constraints := make([]pd.LabelConstraint, 0, len(labels)) for _, str := range labels { label, err := NewConstraint(strings.TrimSpace(str)) if err != nil { return constraints, err } - err = constraints.Add(label) + err = AddConstraint(&constraints, label) if err != nil { return constraints, err } @@ -52,7 +50,7 @@ func NewConstraints(labels []string) (Constraints, error) { // preCheckDictConstraintStr will check the label string, and return the new labels and role. // role maybe be override by the label string, eg `#evict-leader`. -func preCheckDictConstraintStr(labelStr string, role PeerRoleType) ([]string, PeerRoleType, error) { +func preCheckDictConstraintStr(labelStr string, role pd.PeerRoleType) ([]string, pd.PeerRoleType, error) { innerLabels := strings.Split(labelStr, ",") overrideRole := role newLabels := make([]string, 0, len(innerLabels)) @@ -60,8 +58,8 @@ func preCheckDictConstraintStr(labelStr string, role PeerRoleType) ([]string, Pe if strings.HasPrefix(str, attributePrefix) { switch str[1:] { case attributeEvictLeader: - if role == Voter { - overrideRole = Follower + if role == pd.Voter { + overrideRole = pd.Follower } default: return newLabels, overrideRole, fmt.Errorf("%w: unsupported attribute '%s'", ErrUnsupportedConstraint, str) @@ -75,7 +73,7 @@ func preCheckDictConstraintStr(labelStr string, role PeerRoleType) ([]string, Pe // NewConstraintsFromYaml will transform parse the raw 'array' constraints and call NewConstraints. // Refer to https://github.com/pingcap/tidb/blob/master/docs/design/2020-06-24-placement-rules-in-sql.md. -func NewConstraintsFromYaml(c []byte) (Constraints, error) { +func NewConstraintsFromYaml(c []byte) ([]pd.LabelConstraint, error) { constraints := []string{} err := yaml.UnmarshalStrict(c, &constraints) if err != nil { @@ -85,19 +83,19 @@ func NewConstraintsFromYaml(c []byte) (Constraints, error) { } // NewConstraintsDirect is a helper for creating new constraints from individual constraint. -func NewConstraintsDirect(c ...Constraint) Constraints { +func NewConstraintsDirect(c ...pd.LabelConstraint) []pd.LabelConstraint { return c } -// Restore converts label constraints to a string. -func (constraints *Constraints) Restore() (string, error) { +// RestoreConstraints converts label constraints to a string. +func RestoreConstraints(constraints *[]pd.LabelConstraint) (string, error) { var sb strings.Builder for i, constraint := range *constraints { if i > 0 { sb.WriteByte(',') } sb.WriteByte('"') - conStr, err := constraint.Restore() + conStr, err := RestoreConstraint(&constraint) if err != nil { return "", err } @@ -107,14 +105,14 @@ func (constraints *Constraints) Restore() (string, error) { return sb.String(), nil } -// Add will add a new label constraint, with validation of all constraints. +// AddConstraint will add a new label constraint, with validation of all constraints. // Note that Add does not validate one single constraint. -func (constraints *Constraints) Add(label Constraint) error { +func AddConstraint(constraints *[]pd.LabelConstraint, label pd.LabelConstraint) error { pass := true for i := range *constraints { cnst := (*constraints)[i] - res := label.CompatibleWith(&cnst) + res := ConstraintCompatibleWith(&label, &cnst) if res == ConstraintCompatible { continue } @@ -122,11 +120,11 @@ func (constraints *Constraints) Add(label Constraint) error { pass = false continue } - s1, err := label.Restore() + s1, err := RestoreConstraint(&label) if err != nil { s1 = err.Error() } - s2, err := cnst.Restore() + s2, err := RestoreConstraint(&cnst) if err != nil { s2 = err.Error() } @@ -139,11 +137,11 @@ func (constraints *Constraints) Add(label Constraint) error { return nil } -// FingerPrint returns a unique string for the constraints. -func (constraints *Constraints) FingerPrint() string { - copied := make(Constraints, len(*constraints)) +// ConstraintsFingerPrint returns a unique string for the constraints. +func ConstraintsFingerPrint(constraints *[]pd.LabelConstraint) string { + copied := make([]pd.LabelConstraint, len(*constraints)) copy(copied, *constraints) - slices.SortStableFunc(copied, func(i, j Constraint) int { + slices.SortStableFunc(copied, func(i, j pd.LabelConstraint) int { a, b := constraintToString(&i), constraintToString(&j) return cmp.Compare(a, b) }) @@ -161,7 +159,7 @@ func (constraints *Constraints) FingerPrint() string { return hashStr } -func constraintToString(c *Constraint) string { +func constraintToString(c *pd.LabelConstraint) string { // Sort the values in the constraint sortedValues := make([]string, len(c.Values)) copy(sortedValues, c.Values) diff --git a/pkg/ddl/placement/constraints_test.go b/pkg/ddl/placement/constraints_test.go index 17a4b03843255..a8d9899999d2c 100644 --- a/pkg/ddl/placement/constraints_test.go +++ b/pkg/ddl/placement/constraints_test.go @@ -19,6 +19,7 @@ import ( "testing" "github.com/stretchr/testify/require" + pd "github.com/tikv/pd/client/http" ) func TestNewConstraints(t *testing.T) { @@ -38,8 +39,8 @@ func TestNewConstraints(t *testing.T) { func TestAdd(t *testing.T) { type TestCase struct { name string - labels Constraints - label Constraint + labels []pd.LabelConstraint + label pd.LabelConstraint err error } var tests []TestCase @@ -66,8 +67,8 @@ func TestAdd(t *testing.T) { tests = append(tests, TestCase{ "duplicated constraints should not stop conflicting constraints check", - append(labels, Constraint{ - Op: NotIn, + append(labels, pd.LabelConstraint{ + Op: pd.NotIn, Key: "zone", Values: []string{"sh"}, }), label, @@ -78,19 +79,19 @@ func TestAdd(t *testing.T) { require.NoError(t, err) tests = append(tests, TestCase{ "invalid label in operand", - labels, Constraint{Op: "["}, + labels, pd.LabelConstraint{Op: "["}, nil, }) tests = append(tests, TestCase{ "invalid label in operator", - Constraints{{Op: "["}}, label, + []pd.LabelConstraint{{Op: "["}}, label, nil, }) tests = append(tests, TestCase{ "invalid label in both, same key", - Constraints{{Op: "[", Key: "dc"}}, Constraint{Op: "]", Key: "dc"}, + []pd.LabelConstraint{{Op: "[", Key: "dc"}}, pd.LabelConstraint{Op: "]", Key: "dc"}, ErrConflictingConstraints, }) @@ -105,7 +106,7 @@ func TestAdd(t *testing.T) { }) for _, test := range tests { - err := test.labels.Add(test.label) + err := AddConstraint(&test.labels, test.label) comment := fmt.Sprintf("%s: %v", test.name, err) if test.err == nil { require.NoError(t, err, comment) @@ -119,7 +120,7 @@ func TestAdd(t *testing.T) { func TestRestoreConstraints(t *testing.T) { type TestCase struct { name string - input Constraints + input []pd.LabelConstraint output string err error } @@ -127,7 +128,7 @@ func TestRestoreConstraints(t *testing.T) { tests = append(tests, TestCase{ "normal1", - Constraints{}, + []pd.LabelConstraint{}, "", nil, }) @@ -138,14 +139,14 @@ func TestRestoreConstraints(t *testing.T) { require.NoError(t, err) tests = append(tests, TestCase{ "normal2", - Constraints{input1, input2}, + []pd.LabelConstraint{input1, input2}, `"+zone=bj","-zone=sh"`, nil, }) tests = append(tests, TestCase{ "error", - Constraints{{ + []pd.LabelConstraint{{ Op: "[", Key: "dc", Values: []string{"dc1"}, @@ -155,7 +156,7 @@ func TestRestoreConstraints(t *testing.T) { }) for _, test := range tests { - res, err := test.input.Restore() + res, err := RestoreConstraints(&test.input) comment := fmt.Sprintf("%s: %v", test.name, err) if test.err == nil { require.NoError(t, err, comment) diff --git a/pkg/ddl/placement/meta_bundle_test.go b/pkg/ddl/placement/meta_bundle_test.go index 093a3651e7f23..8af316db0d45a 100644 --- a/pkg/ddl/placement/meta_bundle_test.go +++ b/pkg/ddl/placement/meta_bundle_test.go @@ -29,6 +29,7 @@ import ( "github.com/pingcap/tidb/pkg/tablecodec" "github.com/pingcap/tidb/pkg/util/codec" "github.com/stretchr/testify/require" + pd "github.com/tikv/pd/client/http" ) type metaBundleSuite struct { @@ -342,9 +343,9 @@ func (s *metaBundleSuite) checkPartitionBundle(t *testing.T, def model.Partition s.checkTwoJSONObjectEquals(t, expected, got) } -func (s *metaBundleSuite) expectedRules(t *testing.T, ref *model.PolicyRefInfo) []*placement.Rule { +func (s *metaBundleSuite) expectedRules(t *testing.T, ref *model.PolicyRefInfo) []*pd.Rule { if ref == nil { - return []*placement.Rule{} + return []*pd.Rule{} } var policy *model.PolicyInfo diff --git a/pkg/ddl/placement/rule.go b/pkg/ddl/placement/rule.go index c52839c37bb32..ab15e5f582e91 100644 --- a/pkg/ddl/placement/rule.go +++ b/pkg/ddl/placement/rule.go @@ -15,147 +15,23 @@ package placement import ( - "encoding/hex" - "encoding/json" "fmt" "regexp" "strings" - "github.com/pingcap/tidb/pkg/util/codec" + pd "github.com/tikv/pd/client/http" "gopkg.in/yaml.v2" ) -// PeerRoleType is the expected peer type of the placement rule. -type PeerRoleType string - -const ( - // Voter can either match a leader peer or follower peer. - Voter PeerRoleType = "voter" - // Leader matches a leader. - Leader PeerRoleType = "leader" - // Follower matches a follower. - Follower PeerRoleType = "follower" - // Learner matches a learner. - Learner PeerRoleType = "learner" -) - const ( attributePrefix = "#" // AttributeEvictLeader is used to evict leader from a store. attributeEvictLeader = "evict-leader" ) -// RuleGroupConfig defines basic config of rule group -type RuleGroupConfig struct { - ID string `json:"id"` - Index int `json:"index"` - Override bool `json:"override"` -} - -// Rule is the core placement rule struct. Check https://github.com/tikv/pd/blob/master/server/schedule/placement/rule.go. -type Rule struct { - GroupID string `json:"group_id"` - ID string `json:"id"` - Index int `json:"index,omitempty"` - Override bool `json:"override,omitempty"` - StartKeyHex string `json:"start_key"` - EndKeyHex string `json:"end_key"` - Role PeerRoleType `json:"role"` - Count int `json:"count"` - Constraints Constraints `json:"label_constraints,omitempty"` - LocationLabels []string `json:"location_labels,omitempty"` -} - -var _ json.Marshaler = (*TiFlashRule)(nil) -var _ json.Unmarshaler = (*TiFlashRule)(nil) - -// TiFlashRule extends Rule with other necessary fields. -type TiFlashRule struct { - GroupID string - ID string - Index int - Override bool - Role PeerRoleType - Count int - Constraints Constraints - LocationLabels []string - IsolationLevel string - StartKey []byte - EndKey []byte -} - -type tiFlashRule struct { - GroupID string `json:"group_id"` - ID string `json:"id"` - Index int `json:"index,omitempty"` - Override bool `json:"override,omitempty"` - Role PeerRoleType `json:"role"` - Count int `json:"count"` - Constraints Constraints `json:"label_constraints,omitempty"` - LocationLabels []string `json:"location_labels,omitempty"` - IsolationLevel string `json:"isolation_level,omitempty"` - StartKeyHex string `json:"start_key"` - EndKeyHex string `json:"end_key"` -} - -// MarshalJSON implements json.Marshaler interface for TiFlashRule. -func (r *TiFlashRule) MarshalJSON() ([]byte, error) { - return json.Marshal(&tiFlashRule{ - GroupID: r.GroupID, - ID: r.ID, - Index: r.Index, - Override: r.Override, - Role: r.Role, - Count: r.Count, - Constraints: r.Constraints, - LocationLabels: r.LocationLabels, - IsolationLevel: r.IsolationLevel, - StartKeyHex: hex.EncodeToString(codec.EncodeBytes(nil, r.StartKey)), - EndKeyHex: hex.EncodeToString(codec.EncodeBytes(nil, r.EndKey)), - }) -} - -// UnmarshalJSON implements json.Unmarshaler interface for TiFlashRule. -func (r *TiFlashRule) UnmarshalJSON(bytes []byte) error { - var rule tiFlashRule - if err := json.Unmarshal(bytes, &rule); err != nil { - return err - } - *r = TiFlashRule{ - GroupID: rule.GroupID, - ID: rule.ID, - Index: rule.Index, - Override: rule.Override, - Role: rule.Role, - Count: rule.Count, - Constraints: rule.Constraints, - LocationLabels: rule.LocationLabels, - IsolationLevel: rule.IsolationLevel, - } - - startKey, err := hex.DecodeString(rule.StartKeyHex) - if err != nil { - return err - } - - endKey, err := hex.DecodeString(rule.EndKeyHex) - if err != nil { - return err - } - - _, r.StartKey, err = codec.DecodeBytes(startKey, nil) - if err != nil { - return err - } - - _, r.EndKey, err = codec.DecodeBytes(endKey, nil) - - return err -} - // RuleBuilder is used to build the Rules from a constraint string. type RuleBuilder struct { - role PeerRoleType + role pd.PeerRoleType replicasNum uint64 skipCheckReplicasConsistent bool constraintStr string @@ -167,7 +43,7 @@ func NewRuleBuilder() *RuleBuilder { } // SetRole sets the role of the rule. -func (b *RuleBuilder) SetRole(role PeerRoleType) *RuleBuilder { +func (b *RuleBuilder) SetRole(role pd.PeerRoleType) *RuleBuilder { b.role = role return b } @@ -192,14 +68,14 @@ func (b *RuleBuilder) SetConstraintStr(constraintStr string) *RuleBuilder { // BuildRulesWithDictConstraintsOnly constructs []*Rule from a yaml-compatible representation of // 'dict' constraints. -func (b *RuleBuilder) BuildRulesWithDictConstraintsOnly() ([]*Rule, error) { +func (b *RuleBuilder) BuildRulesWithDictConstraintsOnly() ([]*pd.Rule, error) { return newRulesWithDictConstraints(b.role, b.constraintStr) } // BuildRules constructs []*Rule from a yaml-compatible representation of // 'array' or 'dict' constraints. // Refer to https://github.com/pingcap/tidb/blob/master/docs/design/2020-06-24-placement-rules-in-sql.md. -func (b *RuleBuilder) BuildRules() ([]*Rule, error) { +func (b *RuleBuilder) BuildRules() ([]*pd.Rule, error) { rules, err := newRules(b.role, b.replicasNum, b.constraintStr) // check if replicas is consistent if err == nil { @@ -219,11 +95,11 @@ func (b *RuleBuilder) BuildRules() ([]*Rule, error) { // NewRule constructs *Rule from role, count, and constraints. It is here to // consistent the behavior of creating new rules. -func NewRule(role PeerRoleType, replicas uint64, cnst Constraints) *Rule { - return &Rule{ - Role: role, - Count: int(replicas), - Constraints: cnst, +func NewRule(role pd.PeerRoleType, replicas uint64, cnst []pd.LabelConstraint) *pd.Rule { + return &pd.Rule{ + Role: role, + Count: int(replicas), + LabelConstraints: cnst, } } @@ -242,7 +118,7 @@ func getYamlMapFormatError(str string) error { // newRules constructs []*Rule from a yaml-compatible representation of // 'array' or 'dict' constraints. // Refer to https://github.com/pingcap/tidb/blob/master/docs/design/2020-06-24-placement-rules-in-sql.md. -func newRules(role PeerRoleType, replicas uint64, cnstr string) (rules []*Rule, err error) { +func newRules(role pd.PeerRoleType, replicas uint64, cnstr string) (rules []*pd.Rule, err error) { cnstbytes := []byte(cnstr) constraints1, err1 := NewConstraintsFromYaml(cnstbytes) if err1 == nil { @@ -268,8 +144,8 @@ func newRules(role PeerRoleType, replicas uint64, cnstr string) (rules []*Rule, // newRulesWithDictConstraints constructs []*Rule from a yaml-compatible representation of // 'dict' constraints. -func newRulesWithDictConstraints(role PeerRoleType, cnstr string) ([]*Rule, error) { - rules := []*Rule{} +func newRulesWithDictConstraints(role pd.PeerRoleType, cnstr string) ([]*pd.Rule, error) { + rules := []*pd.Rule{} cnstbytes := []byte(cnstr) constraints2 := map[string]int{} err2 := yaml.UnmarshalStrict(cnstbytes, &constraints2) @@ -302,15 +178,3 @@ func newRulesWithDictConstraints(role PeerRoleType, cnstr string) ([]*Rule, erro return nil, fmt.Errorf("%w: should be [constraint1, ...] or {constraint1: cnt1, ...}, error %s, or any yaml compatible representation", ErrInvalidConstraintsFormat, err2) } - -// Clone is used to duplicate a RuleOp for safe modification. -// Note that it is a shallow copy: Constraints is not cloned. -func (r *Rule) Clone() *Rule { - n := &Rule{} - *n = *r - return n -} - -func (r *Rule) String() string { - return fmt.Sprintf("%+v", *r) -} diff --git a/pkg/ddl/placement/rule_test.go b/pkg/ddl/placement/rule_test.go index dd6eadf4d29c5..89232e44fc759 100644 --- a/pkg/ddl/placement/rule_test.go +++ b/pkg/ddl/placement/rule_test.go @@ -21,18 +21,19 @@ import ( "testing" "github.com/stretchr/testify/require" + pd "github.com/tikv/pd/client/http" ) func TestClone(t *testing.T) { - rule := &Rule{ID: "434"} + rule := &pd.Rule{ID: "434"} newRule := rule.Clone() newRule.ID = "121" - require.Equal(t, &Rule{ID: "434"}, rule) - require.Equal(t, &Rule{ID: "121"}, newRule) + require.Equal(t, &pd.Rule{ID: "434"}, rule) + require.Equal(t, &pd.Rule{ID: "121"}, newRule) } -func matchRules(t1, t2 []*Rule, prefix string, t *testing.T) { +func matchRules(t1, t2 []*pd.Rule, prefix string, t *testing.T) { require.Equal(t, len(t2), len(t1), prefix) for i := range t1 { found := false @@ -52,7 +53,7 @@ func TestNewRuleAndNewRules(t *testing.T) { name string input string replicas uint64 - output []*Rule + output []*pd.Rule err error } var tests []TestCase @@ -61,8 +62,8 @@ func TestNewRuleAndNewRules(t *testing.T) { name: "empty constraints", input: "", replicas: 3, - output: []*Rule{ - NewRule(Voter, 3, NewConstraintsDirect()), + output: []*pd.Rule{ + NewRule(pd.Voter, 3, NewConstraintsDirect()), }, }) @@ -77,10 +78,10 @@ func TestNewRuleAndNewRules(t *testing.T) { name: "normal list constraints", input: `["+zone=sh", "+region=sh"]`, replicas: 3, - output: []*Rule{ - NewRule(Voter, 3, NewConstraintsDirect( - NewConstraintDirect("zone", In, "sh"), - NewConstraintDirect("region", In, "sh"), + output: []*pd.Rule{ + NewRule(pd.Voter, 3, NewConstraintsDirect( + NewConstraintDirect("zone", pd.In, "sh"), + NewConstraintDirect("region", pd.In, "sh"), )), }, }) @@ -88,13 +89,13 @@ func TestNewRuleAndNewRules(t *testing.T) { tests = append(tests, TestCase{ name: "normal dict constraints", input: `{"+zone=sh,-zone=bj":2, "+zone=sh": 1}`, - output: []*Rule{ - NewRule(Voter, 2, NewConstraintsDirect( - NewConstraintDirect("zone", In, "sh"), - NewConstraintDirect("zone", NotIn, "bj"), + output: []*pd.Rule{ + NewRule(pd.Voter, 2, NewConstraintsDirect( + NewConstraintDirect("zone", pd.In, "sh"), + NewConstraintDirect("zone", pd.NotIn, "bj"), )), - NewRule(Voter, 1, NewConstraintsDirect( - NewConstraintDirect("zone", In, "sh"), + NewRule(pd.Voter, 1, NewConstraintsDirect( + NewConstraintDirect("zone", pd.In, "sh"), )), }, }) @@ -102,13 +103,13 @@ func TestNewRuleAndNewRules(t *testing.T) { tests = append(tests, TestCase{ name: "normal dict constraints, with count", input: "{'+zone=sh,-zone=bj':2, '+zone=sh': 1}", - output: []*Rule{ - NewRule(Voter, 2, NewConstraintsDirect( - NewConstraintDirect("zone", In, "sh"), - NewConstraintDirect("zone", NotIn, "bj"), + output: []*pd.Rule{ + NewRule(pd.Voter, 2, NewConstraintsDirect( + NewConstraintDirect("zone", pd.In, "sh"), + NewConstraintDirect("zone", pd.NotIn, "bj"), )), - NewRule(Voter, 1, NewConstraintsDirect( - NewConstraintDirect("zone", In, "sh"), + NewRule(pd.Voter, 1, NewConstraintsDirect( + NewConstraintDirect("zone", pd.In, "sh"), )), }, }) @@ -147,13 +148,13 @@ func TestNewRuleAndNewRules(t *testing.T) { tests = append(tests, TestCase{ name: "normal dict constraint with evict leader attribute", input: `{"+zone=sh,-zone=bj":2, "+zone=sh,#evict-leader": 1}`, - output: []*Rule{ - NewRule(Voter, 2, NewConstraintsDirect( - NewConstraintDirect("zone", In, "sh"), - NewConstraintDirect("zone", NotIn, "bj"), + output: []*pd.Rule{ + NewRule(pd.Voter, 2, NewConstraintsDirect( + NewConstraintDirect("zone", pd.In, "sh"), + NewConstraintDirect("zone", pd.NotIn, "bj"), )), - NewRule(Follower, 1, NewConstraintsDirect( - NewConstraintDirect("zone", In, "sh"), + NewRule(pd.Follower, 1, NewConstraintsDirect( + NewConstraintDirect("zone", pd.In, "sh"), )), }, }) @@ -172,7 +173,7 @@ func TestNewRuleAndNewRules(t *testing.T) { for _, tt := range tests { comment := fmt.Sprintf("[%s]", tt.name) - output, err := newRules(Voter, tt.replicas, tt.input) + output, err := newRules(pd.Voter, tt.replicas, tt.input) if tt.err == nil { require.NoError(t, err, comment) matchRules(tt.output, output, comment, t) diff --git a/pkg/ddl/sanity_check.go b/pkg/ddl/sanity_check.go index d8108e71869cd..afb074161e15a 100644 --- a/pkg/ddl/sanity_check.go +++ b/pkg/ddl/sanity_check.go @@ -194,7 +194,7 @@ func (d *ddl) checkHistoryJobInTest(ctx sessionctx.Context, historyJob *model.Jo } // Check delete range. - if jobNeedGC(historyJob) { + if JobNeedGC(historyJob) { d.checkDeleteRangeCnt(historyJob) } diff --git a/pkg/ddl/schema.go b/pkg/ddl/schema.go index e0425a5a9c618..3be32a14a26de 100644 --- a/pkg/ddl/schema.go +++ b/pkg/ddl/schema.go @@ -236,7 +236,7 @@ func onDropSchema(d *ddlCtx, t *meta.Meta, job *model.Job) (ver int64, _ error) if err != nil { return ver, errors.Trace(err) } - if err = t.DropDatabase(dbInfo.ID); err != nil { + if err = t.DropDatabase(dbInfo.ID, dbInfo.Name.L); err != nil { break } diff --git a/pkg/ddl/schema_test.go b/pkg/ddl/schema_test.go index ea93743b5cef4..9b9929438f6be 100644 --- a/pkg/ddl/schema_test.go +++ b/pkg/ddl/schema_test.go @@ -355,7 +355,7 @@ func TestRenameTableAutoIDs(t *testing.T) { tk1.MustExec(`create schema ` + dbName) tk1.MustExec(`create schema ` + dbName + "2") tk1.MustExec(`use ` + dbName) - tk1.MustExec(`CREATE TABLE t (a int auto_increment primary key nonclustered, b varchar(255), key (b))`) + tk1.MustExec(`CREATE TABLE t (a int auto_increment primary key nonclustered, b varchar(255), key (b)) AUTO_ID_CACHE 100`) tk1.MustExec(`insert into t values (11,11),(2,2),(null,12)`) tk1.MustExec(`insert into t values (null,18)`) tk1.MustQuery(`select _tidb_rowid, a, b from t`).Sort().Check(testkit.Rows("13 11 11", "14 2 2", "15 12 12", "17 16 18")) @@ -373,6 +373,8 @@ func TestRenameTableAutoIDs(t *testing.T) { if len(res) == 1 && res[0][col] == s { break } + logutil.BgLogger().Info("Could not find match", zap.String("tableName", tableName), zap.String("s", s), zap.Int("colNum", col)) + for i := range res { strs := make([]string, 0, len(res[i])) for j := range res[i] { @@ -393,41 +395,57 @@ func TestRenameTableAutoIDs(t *testing.T) { waitFor(11, "t", "running") waitFor(4, "t", "public") tk3.MustExec(`BEGIN`) + tk3.MustExec(`insert into ` + dbName + `2.t2 values (50, 5)`) + + tk2.MustExec(`insert into t values (null, 6)`) tk3.MustExec(`insert into ` + dbName + `2.t2 values (20, 5)`) - // TODO: Fix https://github.com/pingcap/tidb/issues/46904 - tk2.MustContainErrMsg(`insert into t values (null, 6)`, "[tikv:1205]Lock wait timeout exceeded; try restarting transaction") - tk2.MustExec(`rollback`) - tk3.MustExec(`rollback`) - /* - tk3.MustExec(`insert into ` + dbName + `2.t2 values (null, 7)`) - tk2.MustExec(`COMMIT`) - - waitFor(11, "t", "done") - tk2.MustExec(`BEGIN`) - tk2.MustExec(`insert into ` + dbName + `2.t2 values (null, 8)`) - - tk3.MustExec(`insert into ` + dbName + `2.t2 values (null, 9)`) - tk2.MustExec(`insert into ` + dbName + `2.t2 values (null, 10)`) - tk3.MustExec(`COMMIT`) - - waitFor(11, "t", "synced") - tk2.MustExec(`COMMIT`) - tk3.MustQuery(`select _tidb_rowid, a, b from ` + dbName + `2.t2`).Sort().Check(testkit.Rows(""+ - "13 11 11", - "14 2 2", - "15 12 12", - "17 16 18", - "19 18 4", - "21 20 6", - "5013 5012 5", - "5015 5014 7", - )) - - require.NoError(t, <-alterChan) - tk2.MustQuery(`select _tidb_rowid, a, b from ` + dbName + `2.t2`).Sort().Check(testkit.Rows( - "13 11 11", "14 2 2", "15 12 12", "17 16 18", - "19 18 4", "21 20 6", "5013 5012 5", "5015 5014 7")) - */ + // Done: Fix https://github.com/pingcap/tidb/issues/46904 + //tk2.MustContainErrMsg(`insert into t values (null, 6)`, "[tikv:1205]Lock wait timeout exceeded; try restarting transaction") + tk2.MustExec(`insert into t values (null, 6)`) + tk3.MustExec(`insert into ` + dbName + `2.t2 values (null, 7)`) + tk2.MustExec(`COMMIT`) + + waitFor(11, "t", "done") + tk2.MustExec(`BEGIN`) + tk2.MustExec(`insert into ` + dbName + `2.t2 values (null, 8)`) + + tk3.MustExec(`insert into ` + dbName + `2.t2 values (null, 9)`) + tk2.MustExec(`insert into ` + dbName + `2.t2 values (null, 10)`) + tk3.MustExec(`COMMIT`) + + waitFor(11, "t", "synced") + tk2.MustExec(`COMMIT`) + tk3.MustQuery(`select _tidb_rowid, a, b from ` + dbName + `2.t2`).Sort().Check(testkit.Rows(""+ + "13 11 11", + "14 2 2", + "15 12 12", + "17 16 18", + "19 18 4", + "51 50 5", + "53 52 6", + "54 20 5", + "56 55 6", + "58 57 7", + "60 59 8", + "62 61 9", + "64 63 10", + )) + require.NoError(t, <-alterChan) + tk2.MustQuery(`select _tidb_rowid, a, b from ` + dbName + `2.t2`).Sort().Check(testkit.Rows(""+ + "13 11 11", + "14 2 2", + "15 12 12", + "17 16 18", + "19 18 4", + "51 50 5", + "53 52 6", + "54 20 5", + "56 55 6", + "58 57 7", + "60 59 8", + "62 61 9", + "64 63 10", + )) } diff --git a/pkg/ddl/schematracker/BUILD.bazel b/pkg/ddl/schematracker/BUILD.bazel index 3df075c1c3a17..5b30ff5659a22 100644 --- a/pkg/ddl/schematracker/BUILD.bazel +++ b/pkg/ddl/schematracker/BUILD.bazel @@ -53,6 +53,8 @@ go_test( "//pkg/parser/ast", "//pkg/parser/model", "//pkg/sessionctx", + "//pkg/sessiontxn", + "//pkg/testkit", "//pkg/util/chunk", "//pkg/util/mock", "//pkg/util/sqlexec", diff --git a/pkg/ddl/schematracker/dm_tracker.go b/pkg/ddl/schematracker/dm_tracker.go index e25b623210077..eb8076c4be0dd 100644 --- a/pkg/ddl/schematracker/dm_tracker.go +++ b/pkg/ddl/schematracker/dm_tracker.go @@ -613,7 +613,7 @@ func (d SchemaTracker) renameColumn(_ sessionctx.Context, ident ast.Ident, spec if col.GeneratedExpr == nil { continue } - dependedColNames := ddl.FindColumnNamesInExpr(col.GeneratedExpr) + dependedColNames := ddl.FindColumnNamesInExpr(col.GeneratedExpr.Internal()) for _, name := range dependedColNames { if name.Name.L == oldColName.L { if col.Hidden { @@ -714,7 +714,7 @@ func (d SchemaTracker) handleModifyColumn( job, err := ddl.GetModifiableColumnJob(ctx, sctx, nil, ident, originalColName, schema, t, spec) if err != nil { if infoschema.ErrColumnNotExists.Equal(err) && spec.IfExists { - sctx.GetSessionVars().StmtCtx.AppendNote(infoschema.ErrColumnNotExists.GenWithStackByArgs(originalColName, ident.Name)) + sctx.GetSessionVars().StmtCtx.AppendNote(infoschema.ErrColumnNotExists.FastGenByArgs(originalColName, ident.Name)) return nil } return errors.Trace(err) diff --git a/pkg/ddl/schematracker/dm_tracker_test.go b/pkg/ddl/schematracker/dm_tracker_test.go index 227bfa6f52f67..113d5db617a3e 100644 --- a/pkg/ddl/schematracker/dm_tracker_test.go +++ b/pkg/ddl/schematracker/dm_tracker_test.go @@ -32,6 +32,8 @@ import ( "github.com/pingcap/tidb/pkg/parser/ast" "github.com/pingcap/tidb/pkg/parser/model" "github.com/pingcap/tidb/pkg/sessionctx" + "github.com/pingcap/tidb/pkg/sessiontxn" + "github.com/pingcap/tidb/pkg/testkit" "github.com/pingcap/tidb/pkg/util/chunk" "github.com/pingcap/tidb/pkg/util/mock" "github.com/pingcap/tidb/pkg/util/sqlexec" @@ -494,12 +496,15 @@ func TestModifyFromNullToNotNull(t *testing.T) { sql = "alter table test.t modify column a int not null;" ctx := context.Background() - sctx := mock.NewContext() + store := testkit.CreateMockStore(t) + sess := testkit.NewTestKit(t, store).Session() + err := sessiontxn.NewTxn(context.Background(), sess) + require.NoError(t, err) p := parser.New() stmt, err := p.ParseOneStmt(sql, "", "") require.NoError(t, err) // converting from NULL to NOT NULL needs to check data, so caller should provide a RestrictedSQLExecutor - executorCtx := mockRestrictedSQLExecutor{sctx} + executorCtx := mockRestrictedSQLExecutor{sess} err = tracker.AlterTable(ctx, executorCtx, stmt.(*ast.AlterTableStmt)) require.NoError(t, err) diff --git a/pkg/ddl/sequence.go b/pkg/ddl/sequence.go index 07595872dbee4..efd0b698fada0 100644 --- a/pkg/ddl/sequence.go +++ b/pkg/ddl/sequence.go @@ -79,7 +79,7 @@ func createSequenceWithCheck(t *meta.Meta, job *model.Job, schemaID int64, tbInf } else { sequenceBase = tbInfo.Sequence.Start + 1 } - return t.CreateSequenceAndSetSeqValue(schemaID, tbInfo, sequenceBase) + return t.CreateSequenceAndSetSeqValue(schemaID, job.SchemaName, tbInfo, sequenceBase) } func handleSequenceOptions(seqOptions []*ast.SequenceOption, sequenceInfo *model.SequenceInfo) { diff --git a/pkg/ddl/table.go b/pkg/ddl/table.go index efee1b9f21bed..c8876583c215d 100644 --- a/pkg/ddl/table.go +++ b/pkg/ddl/table.go @@ -58,13 +58,27 @@ func createTable(d *ddlCtx, t *meta.Meta, job *model.Job, fkCheck bool) (*model. tbInfo := job.Args[0].(*model.TableInfo) tbInfo.State = model.StateNone - err := checkTableNotExists(d, t, schemaID, tbInfo.Name.L) + var err error + if variable.DDLVersion.Load() == model.TiDBDDLV2 { + err = checkTableNotExistsByName(d, t, schemaID, job.SchemaName, tbInfo.Name.L) + } else { + err = checkTableNotExists(d, t, schemaID, tbInfo.Name.L) + } if err != nil { if infoschema.ErrDatabaseNotExists.Equal(err) || infoschema.ErrTableExists.Equal(err) { job.State = model.JobStateCancelled } return tbInfo, errors.Trace(err) } + + err = checkConstraintNamesNotExists(t, schemaID, tbInfo.Constraints) + if err != nil { + if infoschema.ErrCheckConstraintDupName.Equal(err) { + job.State = model.JobStateCancelled + } + return tbInfo, errors.Trace(err) + } + retryable, err := checkTableForeignKeyValidInOwner(d, t, job, tbInfo, fkCheck) if err != nil { if !retryable { @@ -260,7 +274,7 @@ func createTableOrViewWithCheck(t *meta.Meta, job *model.Job, schemaID int64, tb job.State = model.JobStateCancelled return errors.Trace(err) } - return t.CreateTableOrView(schemaID, tbInfo) + return t.CreateTableOrView(schemaID, job.SchemaName, tbInfo) } func repairTableOrViewWithCheck(t *meta.Meta, job *model.Job, schemaID int64, tbInfo *model.TableInfo) error { @@ -306,7 +320,7 @@ func onCreateView(d *ddlCtx, t *meta.Meta, job *model.Job) (ver int64, _ error) tbInfo.State = model.StatePublic tbInfo.UpdateTS = t.StartTS if oldTbInfoID > 0 && orReplace { - err = t.DropTableOrView(schemaID, oldTbInfoID) + err = t.DropTableOrView(schemaID, job.SchemaName, oldTbInfoID, tbInfo.Name.L) if err != nil { job.State = model.JobStateCancelled return ver, errors.Trace(err) @@ -369,11 +383,11 @@ func onDropTableOrView(d *ddlCtx, t *meta.Meta, job *model.Job) (ver int64, _ er return ver, errors.Trace(err) } if tblInfo.IsSequence() { - if err = t.DropSequence(job.SchemaID, job.TableID); err != nil { + if err = t.DropSequence(job.SchemaID, job.SchemaName, job.TableID, job.TableName); err != nil { return ver, errors.Trace(err) } } else { - if err = t.DropTableOrView(job.SchemaID, job.TableID); err != nil { + if err = t.DropTableOrView(job.SchemaID, job.SchemaName, job.TableID, job.TableName); err != nil { return ver, errors.Trace(err) } if err = t.GetAutoIDAccessors(job.SchemaID, job.TableID).Del(); err != nil { @@ -540,7 +554,7 @@ func (w *worker) recoverTable(t *meta.Meta, job *model.Job, recoverInfo *Recover tableInfo := recoverInfo.TableInfo.Clone() tableInfo.State = model.StatePublic tableInfo.UpdateTS = t.StartTS - err = t.CreateTableAndSetAutoID(recoverInfo.SchemaID, tableInfo, recoverInfo.AutoIDs.RowID, recoverInfo.AutoIDs.RandomID) + err = t.CreateTableAndSetAutoID(recoverInfo.SchemaID, recoverInfo.OldSchemaName, tableInfo, recoverInfo.AutoIDs.RowID, recoverInfo.AutoIDs.RandomID) if err != nil { return ver, errors.Trace(err) } @@ -718,7 +732,7 @@ func (w *worker) onTruncateTable(d *ddlCtx, t *meta.Meta, job *model.Job) (ver i if err != nil { return ver, err } - err = t.DropTableOrView(schemaID, tblInfo.ID) + err = t.DropTableOrView(schemaID, job.SchemaName, tblInfo.ID, tblInfo.Name.L) if err != nil { job.State = model.JobStateCancelled return ver, errors.Trace(err) @@ -815,7 +829,7 @@ func (w *worker) onTruncateTable(d *ddlCtx, t *meta.Meta, job *model.Job) (ver i return 0, errors.Wrapf(err, "failed to notify PD the placement rules") } - err = t.CreateTableOrView(schemaID, tblInfo) + err = t.CreateTableOrView(schemaID, job.SchemaName, tblInfo) if err != nil { job.State = model.JobStateCancelled return ver, errors.Trace(err) @@ -1063,7 +1077,6 @@ func onRenameTables(d *ddlCtx, t *meta.Meta, job *model.Job) (ver int64, _ error return finishJobRenameTables(d, t, job, tableNames, tableIDs, newSchemaIDs) } - var tblInfos = make([]*model.TableInfo, 0, len(tableNames)) var err error fkh := newForeignKeyHelper() for i, oldSchemaID := range oldSchemaIDs { @@ -1081,7 +1094,6 @@ func onRenameTables(d *ddlCtx, t *meta.Meta, job *model.Job) (ver int64, _ error if err != nil { return ver, errors.Trace(err) } - tblInfos = append(tblInfos, tblInfo) } ver, err = updateSchemaVersion(d, t, job, fkh.getLoadedTables()...) @@ -1093,7 +1105,7 @@ func onRenameTables(d *ddlCtx, t *meta.Meta, job *model.Job) (ver int64, _ error } func checkAndRenameTables(t *meta.Meta, job *model.Job, tblInfo *model.TableInfo, oldSchemaID, newSchemaID int64, oldSchemaName, tableName *model.CIStr) (ver int64, _ error) { - err := t.DropTableOrView(oldSchemaID, tblInfo.ID) + err := t.DropTableOrView(oldSchemaID, oldSchemaName.L, tblInfo.ID, tblInfo.Name.L) if err != nil { job.State = model.JobStateCancelled return ver, errors.Trace(err) @@ -1115,25 +1127,25 @@ func checkAndRenameTables(t *meta.Meta, job *model.Job, tblInfo *model.TableInfo return ver, errors.Wrapf(err, "failed to get old label rules from PD") } + if tblInfo.AutoIDSchemaID == 0 && newSchemaID != oldSchemaID { + // The auto id is referenced by a schema id + table id + // Table ID is not changed between renames, but schema id can change. + // To allow concurrent use of the auto id during rename, keep the auto id + // by always reference it with the schema id it was originally created in. + tblInfo.AutoIDSchemaID = oldSchemaID + } + if newSchemaID == tblInfo.AutoIDSchemaID { + // Back to the original schema id, no longer needed. + tblInfo.AutoIDSchemaID = 0 + } + tblInfo.Name = *tableName - err = t.CreateTableOrView(newSchemaID, tblInfo) + err = t.CreateTableOrView(newSchemaID, job.SchemaName, tblInfo) if err != nil { job.State = model.JobStateCancelled return ver, errors.Trace(err) } - if newSchemaID != oldSchemaID { - oldDBID := tblInfo.GetDBID(oldSchemaID) - err := meta.BackupAndRestoreAutoIDs(t, oldDBID, tblInfo.ID, newSchemaID, tblInfo.ID) - if err != nil { - job.State = model.JobStateCancelled - return ver, errors.Trace(err) - } - // It's compatible with old version. - // TODO: Remove it. - tblInfo.OldSchemaID = 0 - } - err = updateLabelRules(job, tblInfo, oldRules, tableRuleID, partRuleIDs, oldRuleIDs, tblInfo.ID) if err != nil { job.State = model.JobStateCancelled @@ -1488,6 +1500,41 @@ func checkTableNotExists(d *ddlCtx, t *meta.Meta, schemaID int64, tableName stri return checkTableNotExistsFromStore(t, schemaID, tableName) } +func checkTableNotExistsByName(d *ddlCtx, t *meta.Meta, schemaID int64, schemaName, tableName string) error { + // Try to use memory schema info to check first. + currVer, err := t.GetSchemaVersion() + if err != nil { + return err + } + is := d.infoCache.GetLatest() + if is.SchemaMetaVersion() == currVer { + return checkTableNotExistsFromInfoSchema(is, schemaID, tableName) + } + return t.CheckTableNameNotExists(t.TableNameKey(schemaName, tableName)) +} + +func checkConstraintNamesNotExists(t *meta.Meta, schemaID int64, constraints []*model.ConstraintInfo) error { + if len(constraints) == 0 { + return nil + } + tbInfos, err := t.ListTables(schemaID) + if err != nil { + return err + } + + for _, tb := range tbInfos { + for _, constraint := range constraints { + if constraint.State != model.StateWriteOnly { + if constraintInfo := tb.FindConstraintInfoByName(constraint.Name.L); constraintInfo != nil { + return infoschema.ErrCheckConstraintDupName.GenWithStackByArgs(constraint.Name.L) + } + } + } + } + + return nil +} + func checkTableIDNotExists(t *meta.Meta, schemaID, tableID int64) error { tbl, err := t.GetTable(schemaID, tableID) if err != nil { @@ -1516,7 +1563,7 @@ func checkTableNotExistsFromInfoSchema(is infoschema.InfoSchema, schemaID int64, func checkTableNotExistsFromStore(t *meta.Meta, schemaID int64, tableName string) error { // Check this table's database. - tbls, err := t.ListTables(schemaID) + tbls, err := t.ListSimpleTables(schemaID) if err != nil { if meta.ErrDBNotExists.Equal(err) { return infoschema.ErrDatabaseNotExists.GenWithStackByArgs("") diff --git a/pkg/ddl/table_split_test.go b/pkg/ddl/table_split_test.go index 0540f481f5e67..c65c8592841c1 100644 --- a/pkg/ddl/table_split_test.go +++ b/pkg/ddl/table_split_test.go @@ -31,7 +31,7 @@ import ( ) func TestTableSplit(t *testing.T) { - store, err := mockstore.NewMockStore() + store, err := mockstore.NewMockStore(mockstore.WithStoreType(mockstore.EmbedUnistore)) require.NoError(t, err) defer func() { err := store.Close() diff --git a/pkg/ddl/table_test.go b/pkg/ddl/table_test.go index 17e2f8698288b..ea1017d19ae70 100644 --- a/pkg/ddl/table_test.go +++ b/pkg/ddl/table_test.go @@ -549,20 +549,31 @@ func TestRenameTableIntermediateState(t *testing.T) { {"rename table db2.t to db1.t;", "insert into db1.t values(1);", "", "db1.t"}, } + var finishedJobID int64 for _, tc := range testCases { hook := &callback.TestDDLCallback{Do: dom} runInsert := false + var jobID int64 = 0 fn := func(job *model.Job) { + if job.ID <= finishedJobID { + // The job has been done, OnJobUpdated may be invoked later asynchronously. + // We should skip the done job. + return + } if job.Type == model.ActionRenameTable && job.SchemaState == model.StatePublic && !runInsert && !t.Failed() { _, err := tk2.Exec(tc.insertSQL) + // In rename table intermediate state, new table is public. if len(tc.errMsg) > 0 { + // Old table should not be visible to DML. assert.NotNil(t, err) assert.Equal(t, tc.errMsg, err.Error()) } else { + // New table should be visible to DML. assert.NoError(t, err) } runInsert = true + jobID = job.ID } } hook.OnJobUpdatedExported.Store(&fn) @@ -575,6 +586,7 @@ func TestRenameTableIntermediateState(t *testing.T) { result.Check(testkit.Rows("1")) } tk.MustExec(fmt.Sprintf("delete from %s;", tc.finalDB)) + finishedJobID = jobID } dom.DDL().SetHook(originHook) } diff --git a/pkg/ddl/tests/adminpause/main_test.go b/pkg/ddl/tests/adminpause/main_test.go index a51ffa9e80dc7..33c4ab833d52c 100644 --- a/pkg/ddl/tests/adminpause/main_test.go +++ b/pkg/ddl/tests/adminpause/main_test.go @@ -36,6 +36,7 @@ func TestMain(m *testing.M) { opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), diff --git a/pkg/planner/core/tests/prepare/issue/BUILD.bazel b/pkg/ddl/tests/ddlv2/BUILD.bazel similarity index 67% rename from pkg/planner/core/tests/prepare/issue/BUILD.bazel rename to pkg/ddl/tests/ddlv2/BUILD.bazel index bdfc796445bc9..a920ece1308a0 100644 --- a/pkg/planner/core/tests/prepare/issue/BUILD.bazel +++ b/pkg/ddl/tests/ddlv2/BUILD.bazel @@ -1,18 +1,19 @@ load("@io_bazel_rules_go//go:def.bzl", "go_test") go_test( - name = "issue_test", + name = "ddlv2_test", timeout = "short", srcs = [ - "issue_test.go", + "ddlv2_test.go", "main_test.go", ], flaky = True, deps = [ - "//pkg/parser/auth", + "//pkg/config", + "//pkg/ddl", + "//pkg/server", "//pkg/testkit", "//pkg/testkit/testsetup", - "@com_github_stretchr_testify//require", "@org_uber_go_goleak//:goleak", ], ) diff --git a/pkg/ddl/tests/ddlv2/ddlv2_test.go b/pkg/ddl/tests/ddlv2/ddlv2_test.go new file mode 100644 index 0000000000000..81ed41ec7f72b --- /dev/null +++ b/pkg/ddl/tests/ddlv2/ddlv2_test.go @@ -0,0 +1,89 @@ +// Copyright 2024 PingCAP, 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. + +package ddlv2test + +import ( + "testing" + + "github.com/pingcap/tidb/pkg/server" + "github.com/pingcap/tidb/pkg/testkit" +) + +func TestSwitchDDLVersion(t *testing.T) { + store, dom := testkit.CreateMockStoreAndDomain(t) + sv := server.CreateMockServer(t, store) + + sv.SetDomain(dom) + dom.InfoSyncer().SetSessionManager(sv) + defer sv.Close() + + conn := server.CreateMockConn(t, sv) + tk := testkit.NewTestKitWithSession(t, store, conn.Context().Session) + + tk.MustQuery("show global variables like 'tidb_ddl_version'").Check(testkit.Rows("tidb_ddl_version 1")) + + tk.MustExec("create database db1;") + tk.MustExec("create database db2;") + tk.MustExec("create table db1.tb1(id int);") + tk.MustExec("create table db1.tb2(id int);") + tk.MustExec("create table db2.tb1(id int);") + + tk.MustExec("set global tidb_ddl_version=2") + tk.MustQuery("show global variables like 'tidb_ddl_version'").Check(testkit.Rows("tidb_ddl_version 2")) + + tk.MustExec("set global tidb_ddl_version=1") + tk.MustQuery("show global variables like 'tidb_ddl_version'").Check(testkit.Rows("tidb_ddl_version 1")) + + tk.MustGetErrMsg("set global tidb_ddl_version=3", "[variable:1231]Variable 'tidb_ddl_version' can't be set to the value of '3'") +} + +func TestDDL(t *testing.T) { + store, dom := testkit.CreateMockStoreAndDomain(t) + sv := server.CreateMockServer(t, store) + + sv.SetDomain(dom) + dom.InfoSyncer().SetSessionManager(sv) + defer sv.Close() + + conn := server.CreateMockConn(t, sv) + tk := testkit.NewTestKitWithSession(t, store, conn.Context().Session) + + tk.MustExec("set global tidb_ddl_version=2") + + tk.MustExec("create database db") + // Create Table + tk.MustExec("create table db.tb1(id int)") + tk.MustExec("create table db.tb2(id int)") + // create table twice + tk.MustGetErrMsg("create table db.tb1(id int)", "[schema:1050]Table 'db.tb1' already exists") + + // Truncate Table + tk.MustExec("truncate table db.tb1") + + // Drop Table + tk.MustExec("drop table db.tb1") + + // Rename Table + tk.MustExec("rename table db.tb2 to db.tb3") + + // Drop Database + tk.MustExec("drop database db") + + // create again + tk.MustExec("create database db") + // Create Table + tk.MustExec("create table db.tb1(id int)") + tk.MustExec("create table db.tb2(id int)") +} diff --git a/pkg/ddl/tests/ddlv2/main_test.go b/pkg/ddl/tests/ddlv2/main_test.go new file mode 100644 index 0000000000000..351e305867443 --- /dev/null +++ b/pkg/ddl/tests/ddlv2/main_test.go @@ -0,0 +1,46 @@ +// Copyright 2024 PingCAP, 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. + +package ddlv2test + +import ( + "testing" + "time" + + "github.com/pingcap/tidb/pkg/config" + "github.com/pingcap/tidb/pkg/ddl" + "github.com/pingcap/tidb/pkg/testkit/testsetup" + "go.uber.org/goleak" +) + +func TestMain(m *testing.M) { + testsetup.SetupForCommonTest() + + config.UpdateGlobal(func(conf *config.Config) { + conf.TiKVClient.AsyncCommit.SafeWindow = 0 + conf.TiKVClient.AsyncCommit.AllowedClockDrift = 0 + }) + + ddl.SetWaitTimeWhenErrorOccurred(time.Microsecond) + + opts := []goleak.Option{ + goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), + goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), + goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), + goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), + } + + goleak.VerifyTestMain(m, opts...) +} diff --git a/pkg/ddl/tests/fail/main_test.go b/pkg/ddl/tests/fail/main_test.go index f30c742849f03..c26ff32102732 100644 --- a/pkg/ddl/tests/fail/main_test.go +++ b/pkg/ddl/tests/fail/main_test.go @@ -36,6 +36,7 @@ func TestMain(m *testing.M) { opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), diff --git a/pkg/ddl/tests/fk/main_test.go b/pkg/ddl/tests/fk/main_test.go index 63b5889afb3ca..8ddf234eaa293 100644 --- a/pkg/ddl/tests/fk/main_test.go +++ b/pkg/ddl/tests/fk/main_test.go @@ -46,6 +46,7 @@ func TestMain(m *testing.M) { opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("github.com/tikv/client-go/v2/txnkv/transaction.keepAlive"), diff --git a/pkg/ddl/tests/indexmerge/main_test.go b/pkg/ddl/tests/indexmerge/main_test.go index 6208e106b9793..cabf8697de988 100644 --- a/pkg/ddl/tests/indexmerge/main_test.go +++ b/pkg/ddl/tests/indexmerge/main_test.go @@ -46,6 +46,7 @@ func TestMain(m *testing.M) { opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("github.com/tikv/client-go/v2/txnkv/transaction.keepAlive"), diff --git a/pkg/ddl/tests/metadatalock/main_test.go b/pkg/ddl/tests/metadatalock/main_test.go index 93d3d794dbb8c..cebc9ec8fa936 100644 --- a/pkg/ddl/tests/metadatalock/main_test.go +++ b/pkg/ddl/tests/metadatalock/main_test.go @@ -36,6 +36,7 @@ func TestMain(m *testing.M) { opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), diff --git a/pkg/ddl/tests/multivaluedindex/main_test.go b/pkg/ddl/tests/multivaluedindex/main_test.go index 7a7880f7bac16..56f5e20392a45 100644 --- a/pkg/ddl/tests/multivaluedindex/main_test.go +++ b/pkg/ddl/tests/multivaluedindex/main_test.go @@ -26,6 +26,7 @@ func TestMain(m *testing.M) { opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), diff --git a/pkg/ddl/tests/partition/BUILD.bazel b/pkg/ddl/tests/partition/BUILD.bazel index c3db6c4abdd25..9210838a31f58 100644 --- a/pkg/ddl/tests/partition/BUILD.bazel +++ b/pkg/ddl/tests/partition/BUILD.bazel @@ -8,7 +8,7 @@ go_test( "main_test.go", ], flaky = True, - shard_count = 48, + shard_count = 44, deps = [ "//pkg/config", "//pkg/ddl", diff --git a/pkg/ddl/tests/partition/db_partition_test.go b/pkg/ddl/tests/partition/db_partition_test.go index f315d3c5d25cd..7573d994c6b93 100644 --- a/pkg/ddl/tests/partition/db_partition_test.go +++ b/pkg/ddl/tests/partition/db_partition_test.go @@ -27,7 +27,6 @@ import ( "time" "github.com/pingcap/failpoint" - "github.com/pingcap/tidb/pkg/config" "github.com/pingcap/tidb/pkg/ddl" "github.com/pingcap/tidb/pkg/ddl/testutil" "github.com/pingcap/tidb/pkg/ddl/util/callback" @@ -1261,63 +1260,14 @@ func TestCreateTableWithKeyPartition(t *testing.T) { tk.MustExec(`create table tm2 (a char(5), unique key(a(5))) partition by key() partitions 5;`) } -func TestCreatePartitionTableWithGlobalIndex(t *testing.T) { - defer config.RestoreFunc()() - config.UpdateGlobal(func(conf *config.Config) { - conf.EnableGlobalIndex = true - }) - - store := testkit.CreateMockStore(t) - tk := testkit.NewTestKit(t, store) - tk.MustExec("use test") - tk.MustExec("drop table if exists test_global") - tk.MustExec(`create table test_global ( a int, b int, c int, unique key p_b(b)) - partition by range( a ) ( - partition p1 values less than (10), - partition p2 values less than (20) - );`) - - tk.MustExec("insert into test_global values (1,2,2)") - tk.MustGetErrCode("insert into test_global values (11,2,2)", errno.ErrDupEntry) - tk.MustGetErrMsg("insert into test_global values (11,2,2)", "[kv:1062]Duplicate entry '2' for key 'test_global.p_b'") - - // NULL will not get 'duplicate key' error here - tk.MustExec("insert into test_global(a,c) values (1,2)") - tk.MustExec("insert into test_global(a,c) values (11,2)") - - tk.MustExec("drop table if exists test_global") - tk.MustGetErrMsg(`create table test_global ( a int, b int, c int, primary key p_b(b) /*T![clustered_index] CLUSTERED */) - partition by range( a ) ( - partition p1 values less than (10), - partition p2 values less than (20) - );`, "[ddl:1503]A CLUSTERED INDEX must include all columns in the table's partitioning function") - - tk.MustExec("drop table if exists test_global") - tk.MustGetErrMsg(`create table test_global ( a int, b int, c int, primary key p_b_c(b, c) /*T![clustered_index] CLUSTERED */) - partition by range( a ) ( - partition p1 values less than (10), - partition p2 values less than (20) - );`, "[ddl:1503]A CLUSTERED INDEX must include all columns in the table's partitioning function") - - tk.MustExec("drop table if exists test_global") - tk.MustExec(`create table test_global ( a int, b int, c int, primary key (b) /*T![clustered_index] NONCLUSTERED */) - partition by range( a ) ( - partition p1 values less than (10), - partition p2 values less than (20) - );`) - tk.MustExec("insert into test_global values (1,2,2)") - tk.MustGetErrCode("insert into test_global values (11,2,2)", errno.ErrDupEntry) - tk.MustGetErrMsg("insert into test_global values (11,2,2)", "[kv:1062]Duplicate entry '2' for key 'test_global.PRIMARY'") -} - func TestDropPartitionWithGlobalIndex(t *testing.T) { - defer config.RestoreFunc()() - config.UpdateGlobal(func(conf *config.Config) { - conf.EnableGlobalIndex = true - }) store := testkit.CreateMockStore(t) tk := testkit.NewTestKit(t, store) tk.MustExec("use test") + tk.MustExec("set tidb_enable_global_index=true") + defer func() { + tk.MustExec("set tidb_enable_global_index=default") + }() tk.MustExec("drop table if exists test_global") tk.MustExec(`create table test_global ( a int, b int, c int) partition by range( a ) ( @@ -1348,13 +1298,13 @@ func TestDropPartitionWithGlobalIndex(t *testing.T) { } func TestDropMultiPartitionWithGlobalIndex(t *testing.T) { - defer config.RestoreFunc()() - config.UpdateGlobal(func(conf *config.Config) { - conf.EnableGlobalIndex = true - }) store := testkit.CreateMockStore(t) tk := testkit.NewTestKit(t, store) tk.MustExec("use test") + tk.MustExec("set tidb_enable_global_index=true") + defer func() { + tk.MustExec("set tidb_enable_global_index=default") + }() tk.MustExec("drop table if exists test_global") tk.MustExec(`create table test_global ( a int, b int, c int) partition by range( a ) ( @@ -1386,14 +1336,13 @@ func TestDropMultiPartitionWithGlobalIndex(t *testing.T) { } func TestGlobalIndexInsertInDropPartition(t *testing.T) { - defer config.RestoreFunc()() - config.UpdateGlobal(func(conf *config.Config) { - conf.EnableGlobalIndex = true - }) - store, dom := testkit.CreateMockStoreAndDomain(t) tk := testkit.NewTestKit(t, store) tk.MustExec("use test") + tk.MustExec("set tidb_enable_global_index=true") + defer func() { + tk.MustExec("set tidb_enable_global_index=default") + }() tk.MustExec("drop table if exists test_global") tk.MustExec(`create table test_global ( a int, b int, c int) partition by range( a ) ( @@ -1423,39 +1372,14 @@ func TestGlobalIndexInsertInDropPartition(t *testing.T) { tk.MustQuery("select * from test_global use index(idx_b) order by a").Check(testkit.Rows("9 9 9", "11 11 11", "12 12 12")) } -func TestUpdateGlobalIndex(t *testing.T) { - defer config.RestoreFunc()() - config.UpdateGlobal(func(conf *config.Config) { - conf.EnableGlobalIndex = true - }) - - store := testkit.CreateMockStore(t) - tk := testkit.NewTestKit(t, store) - tk.MustExec("use test") - tk.MustExec("drop table if exists test_global") - tk.MustExec(`create table test_global ( a int, b int, c int) - partition by range( a ) ( - partition p1 values less than (10), - partition p2 values less than (20), - partition p3 values less than (30) - );`) - tk.MustExec("alter table test_global add unique index idx_b (b);") - tk.MustExec("insert into test_global values (1, 1, 1), (8, 8, 8), (11, 11, 11), (12, 12, 12);") - tk.MustExec("update test_global set a = 2 where a = 11") - tk.MustExec("update test_global set a = 13 where a = 12") - tk.MustExec("analyze table test_global") - tk.MustQuery("select * from test_global use index(idx_b) order by a").Check(testkit.Rows("1 1 1", "2 11 11", "8 8 8", "13 12 12")) -} - func TestGlobalIndexUpdateInDropPartition(t *testing.T) { - defer config.RestoreFunc()() - config.UpdateGlobal(func(conf *config.Config) { - conf.EnableGlobalIndex = true - }) - store, dom := testkit.CreateMockStoreAndDomain(t) tk := testkit.NewTestKit(t, store) tk.MustExec("use test") + tk.MustExec("set tidb_enable_global_index=true") + defer func() { + tk.MustExec("set tidb_enable_global_index=default") + }() tk.MustExec("drop table if exists test_global") tk.MustExec(`create table test_global ( a int, b int, c int) partition by range( a ) ( @@ -1486,14 +1410,13 @@ func TestGlobalIndexUpdateInDropPartition(t *testing.T) { } func TestTruncatePartitionWithGlobalIndex(t *testing.T) { - defer config.RestoreFunc()() - config.UpdateGlobal(func(conf *config.Config) { - conf.EnableGlobalIndex = true - }) - store := testkit.CreateMockStore(t) tk := testkit.NewTestKit(t, store) tk.MustExec("use test") + tk.MustExec("set tidb_enable_global_index=true") + defer func() { + tk.MustExec("set tidb_enable_global_index=default") + }() tk.MustExec("drop table if exists test_global") tk.MustExec(`create table test_global ( a int, b int, c int) partition by range( a ) ( @@ -1556,13 +1479,13 @@ func TestTruncatePartitionWithGlobalIndex(t *testing.T) { } func TestGlobalIndexUpdateInTruncatePartition(t *testing.T) { - defer config.RestoreFunc()() - config.UpdateGlobal(func(conf *config.Config) { - conf.EnableGlobalIndex = true - }) store, dom := testkit.CreateMockStoreAndDomain(t) tk := testkit.NewTestKit(t, store) tk.MustExec("use test") + tk.MustExec("set tidb_enable_global_index=true") + defer func() { + tk.MustExec("set tidb_enable_global_index=default") + }() tk.MustExec("set @@tidb_partition_prune_mode='dynamic'") tk.MustExec("set @@session.tidb_analyze_version=2") tk.MustExec("drop table if exists test_global") @@ -1596,13 +1519,13 @@ func TestGlobalIndexUpdateInTruncatePartition(t *testing.T) { } func TestGlobalIndexUpdateInTruncatePartition4Hash(t *testing.T) { - defer config.RestoreFunc()() - config.UpdateGlobal(func(conf *config.Config) { - conf.EnableGlobalIndex = true - }) store, dom := testkit.CreateMockStoreAndDomain(t) tk := testkit.NewTestKit(t, store) tk.MustExec("use test") + tk.MustExec("set tidb_enable_global_index=true") + defer func() { + tk.MustExec("set tidb_enable_global_index=default") + }() tk.MustExec("set @@tidb_partition_prune_mode='dynamic'") tk.MustExec("set @@session.tidb_analyze_version=2") tk.MustExec("drop table if exists test_global") @@ -1632,13 +1555,13 @@ func TestGlobalIndexUpdateInTruncatePartition4Hash(t *testing.T) { } func TestGlobalIndexReaderInTruncatePartition(t *testing.T) { - defer config.RestoreFunc()() - config.UpdateGlobal(func(conf *config.Config) { - conf.EnableGlobalIndex = true - }) store, dom := testkit.CreateMockStoreAndDomain(t) tk := testkit.NewTestKit(t, store) tk.MustExec("use test") + tk.MustExec("set tidb_enable_global_index=true") + defer func() { + tk.MustExec("set tidb_enable_global_index=default") + }() tk.MustExec("drop table if exists test_global") tk.MustExec(`create table test_global ( a int, b int, c int) partition by range( a ) ( @@ -1666,12 +1589,13 @@ func TestGlobalIndexReaderInTruncatePartition(t *testing.T) { } func TestGlobalIndexInsertInTruncatePartition(t *testing.T) { - config.UpdateGlobal(func(conf *config.Config) { - conf.EnableGlobalIndex = true - }) store, dom := testkit.CreateMockStoreAndDomain(t) tk := testkit.NewTestKit(t, store) tk.MustExec("use test") + tk.MustExec("set tidb_enable_global_index=true") + defer func() { + tk.MustExec("set tidb_enable_global_index=default") + }() tk.MustExec("set @@tidb_partition_prune_mode='dynamic'") tk.MustExec("set @@session.tidb_analyze_version=2") tk.MustExec("drop table if exists test_global") @@ -1702,13 +1626,13 @@ func TestGlobalIndexInsertInTruncatePartition(t *testing.T) { } func TestGlobalIndexReaderInDropPartition(t *testing.T) { - defer config.RestoreFunc()() - config.UpdateGlobal(func(conf *config.Config) { - conf.EnableGlobalIndex = true - }) store, dom := testkit.CreateMockStoreAndDomain(t) tk := testkit.NewTestKit(t, store) tk.MustExec("use test") + tk.MustExec("set tidb_enable_global_index=true") + defer func() { + tk.MustExec("set tidb_enable_global_index=default") + }() tk.MustExec("drop table if exists test_global") tk.MustExec(`create table test_global ( a int, b int, c int) partition by range( a ) ( @@ -1738,14 +1662,13 @@ func TestGlobalIndexReaderInDropPartition(t *testing.T) { } func TestGlobalIndexLookUpInDropPartition(t *testing.T) { - defer config.RestoreFunc()() - config.UpdateGlobal(func(conf *config.Config) { - conf.EnableGlobalIndex = true - }) - store, dom := testkit.CreateMockStoreAndDomain(t) tk := testkit.NewTestKit(t, store) tk.MustExec("use test") + tk.MustExec("set tidb_enable_global_index=true") + defer func() { + tk.MustExec("set tidb_enable_global_index=default") + }() tk.MustExec("drop table if exists test_global") tk.MustExec(`create table test_global ( a int, b int, c int) partition by range( a ) ( @@ -1777,14 +1700,13 @@ func TestGlobalIndexLookUpInDropPartition(t *testing.T) { func TestGlobalIndexShowTableRegions(t *testing.T) { atomic.StoreUint32(&ddl.EnableSplitTableRegion, 1) defer atomic.StoreUint32(&ddl.EnableSplitTableRegion, 0) - defer config.RestoreFunc()() - config.UpdateGlobal(func(conf *config.Config) { - conf.EnableGlobalIndex = true - }) - store := testkit.CreateMockStore(t) tk := testkit.NewTestKit(t, store) tk.MustExec("use test") + tk.MustExec("set tidb_enable_global_index=true") + defer func() { + tk.MustExec("set tidb_enable_global_index=default") + }() tk.MustExec("drop table if exists p") tk.MustExec("set @@global.tidb_scatter_region = on") tk.MustExec(`create table p (id int, c int, d int, unique key uidx(c)) partition by range (c) ( @@ -2083,259 +2005,6 @@ func TestAlterTableExchangePartition(t *testing.T) { tk.MustGetErrCode("alter table e19 exchange partition p0 with table e20", errno.ErrPartitionExchangeTempTable) } -func TestExchangePartitionTableCompatiable(t *testing.T) { - store := testkit.CreateMockStore(t) - restoreConfig := config.RestoreFunc() - defer restoreConfig() - config.UpdateGlobal(func(conf *config.Config) { - conf.EnableGlobalIndex = true - }) - type testCase struct { - ptSQL string - ntSQL string - exchangeSQL string - err *terror.Error - } - cases := []testCase{ - { - "create table pt (id int not null) partition by hash (id) partitions 4;", - "create table nt (id int(1) not null);", - "alter table pt exchange partition p0 with table nt;", - nil, - }, - { - "create table pt1 (id int not null, fname varchar(3)) partition by hash (id) partitions 4;", - "create table nt1 (id int not null, fname varchar(4));", - "alter table pt1 exchange partition p0 with table nt1;", - dbterror.ErrTablesDifferentMetadata, - }, - { - "create table pt2 (id int not null, salary decimal) partition by hash(id) partitions 4;", - "create table nt2 (id int not null, salary decimal(3,2));", - "alter table pt2 exchange partition p0 with table nt2;", - dbterror.ErrTablesDifferentMetadata, - }, - { - "create table pt3 (id int not null, salary decimal) partition by hash(id) partitions 1;", - "create table nt3 (id int not null, salary decimal(10, 1));", - "alter table pt3 exchange partition p0 with table nt3", - dbterror.ErrTablesDifferentMetadata, - }, - { - "create table pt4 (id int not null) partition by hash(id) partitions 1;", - "create table nt4 (id1 int not null);", - "alter table pt4 exchange partition p0 with table nt4;", - dbterror.ErrTablesDifferentMetadata, - }, - { - "create table pt5 (id int not null, primary key (id)) partition by hash(id) partitions 1;", - "create table nt5 (id int not null);", - "alter table pt5 exchange partition p0 with table nt5;", - dbterror.ErrTablesDifferentMetadata, - }, - { - "create table pt6 (id int not null, salary decimal, index idx (id, salary)) partition by hash(id) partitions 1;", - "create table nt6 (id int not null, salary decimal, index idx (salary, id));", - "alter table pt6 exchange partition p0 with table nt6;", - dbterror.ErrTablesDifferentMetadata, - }, - { - "create table pt7 (id int not null, index idx (id) invisible) partition by hash(id) partitions 1;", - "create table nt7 (id int not null, index idx (id));", - "alter table pt7 exchange partition p0 with table nt7;", - nil, - }, - { - "create table pt8 (id int not null, index idx (id)) partition by hash(id) partitions 1;", - "create table nt8 (id int not null, index id_idx (id));", - "alter table pt8 exchange partition p0 with table nt8;", - dbterror.ErrTablesDifferentMetadata, - }, - { - // Generated column (virtual) - "create table pt10 (id int not null, lname varchar(30), fname varchar(100) generated always as (concat(lname,' ')) virtual) partition by hash(id) partitions 1;", - "create table nt10 (id int not null, lname varchar(30), fname varchar(100));", - "alter table pt10 exchange partition p0 with table nt10;", - dbterror.ErrUnsupportedOnGeneratedColumn, - }, - { - "create table pt11 (id int not null, lname varchar(30), fname varchar(100)) partition by hash(id) partitions 1;", - "create table nt11 (id int not null, lname varchar(30), fname varchar(100) generated always as (concat(lname, ' ')) virtual);", - "alter table pt11 exchange partition p0 with table nt11;", - dbterror.ErrUnsupportedOnGeneratedColumn, - }, - { - - "create table pt12 (id int not null, lname varchar(30), fname varchar(100) generated always as (concat(lname,' ')) stored) partition by hash(id) partitions 1;", - "create table nt12 (id int not null, lname varchar(30), fname varchar(100));", - "alter table pt12 exchange partition p0 with table nt12;", - dbterror.ErrTablesDifferentMetadata, - }, - { - "create table pt13 (id int not null, lname varchar(30), fname varchar(100)) partition by hash(id) partitions 1;", - "create table nt13 (id int not null, lname varchar(30), fname varchar(100) generated always as (concat(lname, ' ')) stored);", - "alter table pt13 exchange partition p0 with table nt13;", - dbterror.ErrTablesDifferentMetadata, - }, - { - "create table pt14 (id int not null, lname varchar(30), fname varchar(100) generated always as (concat(lname, ' ')) virtual) partition by hash(id) partitions 1;", - "create table nt14 (id int not null, lname varchar(30), fname varchar(100) generated always as (concat(lname, ' ')) virtual);", - "alter table pt14 exchange partition p0 with table nt14;", - nil, - }, - { - // unique index - "create table pt15 (id int not null, unique index uk_id (id)) partition by hash(id) partitions 1;", - "create table nt15 (id int not null, index uk_id (id));", - "alter table pt15 exchange partition p0 with table nt15", - dbterror.ErrTablesDifferentMetadata, - }, - { - // auto_increment - "create table pt16 (id int not null primary key auto_increment) partition by hash(id) partitions 1;", - "create table nt16 (id int not null primary key);", - "alter table pt16 exchange partition p0 with table nt16;", - dbterror.ErrTablesDifferentMetadata, - }, - { - // default - "create table pt17 (id int not null default 1) partition by hash(id) partitions 1;", - "create table nt17 (id int not null);", - "alter table pt17 exchange partition p0 with table nt17;", - nil, - }, - { - // view test - "create table pt18 (id int not null) partition by hash(id) partitions 1;", - "create view nt18 as select id from nt17;", - "alter table pt18 exchange partition p0 with table nt18", - dbterror.ErrCheckNoSuchTable, - }, - { - "create table pt19 (id int not null, lname varchar(30), fname varchar(100) generated always as (concat(lname, ' ')) stored) partition by hash(id) partitions 1;", - "create table nt19 (id int not null, lname varchar(30), fname varchar(100) generated always as (concat(lname, ' ')) virtual);", - "alter table pt19 exchange partition p0 with table nt19;", - dbterror.ErrUnsupportedOnGeneratedColumn, - }, - { - "create table pt20 (id int not null) partition by hash(id) partitions 1;", - "create table nt20 (id int default null);", - "alter table pt20 exchange partition p0 with table nt20;", - dbterror.ErrTablesDifferentMetadata, - }, - { - // unsigned - "create table pt21 (id int unsigned) partition by hash(id) partitions 1;", - "create table nt21 (id int);", - "alter table pt21 exchange partition p0 with table nt21;", - dbterror.ErrTablesDifferentMetadata, - }, - { - // zerofill - "create table pt22 (id int) partition by hash(id) partitions 1;", - "create table nt22 (id int zerofill);", - "alter table pt22 exchange partition p0 with table nt22;", - dbterror.ErrTablesDifferentMetadata, - }, - { - "create table pt23 (id int, lname varchar(10) charset binary) partition by hash(id) partitions 1;", - "create table nt23 (id int, lname varchar(10));", - "alter table pt23 exchange partition p0 with table nt23;", - dbterror.ErrTablesDifferentMetadata, - }, - { - "create table pt25 (id int, a datetime on update current_timestamp) partition by hash(id) partitions 1;", - "create table nt25 (id int, a datetime);", - "alter table pt25 exchange partition p0 with table nt25;", - nil, - }, - { - "create table pt26 (id int not null, lname varchar(30), fname varchar(100) generated always as (concat(lname, ' ')) virtual) partition by hash(id) partitions 1;", - "create table nt26 (id int not null, lname varchar(30), fname varchar(100) generated always as (concat(id, ' ')) virtual);", - "alter table pt26 exchange partition p0 with table nt26;", - dbterror.ErrTablesDifferentMetadata, - }, - { - "create table pt27 (a int key, b int, index(a)) partition by hash(a) partitions 1;", - "create table nt27 (a int not null, b int, index(a));", - "alter table pt27 exchange partition p0 with table nt27;", - dbterror.ErrTablesDifferentMetadata, - }, - { - "create table pt28 (a int primary key, b int, index(a)) partition by hash(a) partitions 1;", - "create table nt28 (a int not null, b int, index(a));", - "alter table pt28 exchange partition p0 with table nt28;", - dbterror.ErrTablesDifferentMetadata, - }, - { - "create table pt29 (a int primary key, b int) partition by hash(a) partitions 1;", - "create table nt29 (a int not null, b int, index(a));", - "alter table pt29 exchange partition p0 with table nt29;", - dbterror.ErrTablesDifferentMetadata, - }, - { - "create table pt30 (a int primary key, b int) partition by hash(a) partitions 1;", - "create table nt30 (a int, b int, unique index(a));", - "alter table pt30 exchange partition p0 with table nt30;", - dbterror.ErrTablesDifferentMetadata, - }, - { - // auto_increment - "create table pt31 (id bigint not null primary key auto_increment) partition by hash(id) partitions 1;", - "create table nt31 (id bigint not null primary key);", - "alter table pt31 exchange partition p0 with table nt31;", - dbterror.ErrTablesDifferentMetadata, - }, - { - // auto_random - "create table pt32 (id bigint not null primary key AUTO_RANDOM) partition by hash(id) partitions 1;", - "create table nt32 (id bigint not null primary key);", - "alter table pt32 exchange partition p0 with table nt32;", - dbterror.ErrTablesDifferentMetadata, - }, - { - // global temporary table - "create table pt33 (id int) partition by hash(id) partitions 1;", - "create global temporary table nt33 (id int) on commit delete rows;", - "alter table pt33 exchange partition p0 with table nt33;", - dbterror.ErrPartitionExchangeTempTable, - }, - { - // local temporary table - "create table pt34 (id int) partition by hash(id) partitions 1;", - "create temporary table nt34 (id int);", - "alter table pt34 exchange partition p0 with table nt34;", - dbterror.ErrPartitionExchangeTempTable, - }, - { - "create table pt35 (a int, b int, unique index(b)) partition by hash(a) partitions 1;", - "create table nt35 (a int, b int, unique index(b));", - "alter table pt35 exchange partition p0 with table nt35;", - dbterror.ErrPartitionExchangeDifferentOption, - }, - } - - tk := testkit.NewTestKit(t, store) - tk.MustExec("use test") - err := tk.Session().GetSessionVars().SetSystemVar("tidb_enable_exchange_partition", "1") - require.NoError(t, err) - for i, tt := range cases { - tk.MustExec(tt.ptSQL) - tk.MustExec(tt.ntSQL) - if tt.err != nil { - _, err := tk.Exec(tt.exchangeSQL) - require.Truef(t, terror.ErrorEqual(err, tt.err), - "case %d fail, sql = `%s`\nexpected error = `%v`\n actual error = `%v`", - i, tt.exchangeSQL, tt.err, err, - ) - } else { - tk.MustExec(tt.exchangeSQL) - } - } - err = tk.Session().GetSessionVars().SetSystemVar("tidb_enable_exchange_partition", "0") - require.NoError(t, err) -} - func TestExchangePartitionMultiTable(t *testing.T) { store := testkit.CreateMockStore(t) tk1 := testkit.NewTestKit(t, store) @@ -2454,49 +2123,6 @@ func TestExchangePartitionAutoID(t *testing.T) { tk.MustQuery("select count(*) from pt where a >= 4000000").Check(testkit.Rows("1")) } -func TestExchangePartitionExpressIndex(t *testing.T) { - restore := config.RestoreFunc() - defer restore() - config.UpdateGlobal(func(conf *config.Config) { - // Test for table lock. - conf.EnableTableLock = true - conf.Instance.SlowThreshold = 10000 - conf.TiKVClient.AsyncCommit.SafeWindow = 0 - conf.TiKVClient.AsyncCommit.AllowedClockDrift = 0 - conf.Experimental.AllowsExpressionIndex = true - }) - store := testkit.CreateMockStore(t) - tk := testkit.NewTestKit(t, store) - tk.MustExec("use test") - tk.MustExec("set @@tidb_enable_exchange_partition=1") - defer tk.MustExec("set @@tidb_enable_exchange_partition=0") - tk.MustExec("drop table if exists pt1;") - tk.MustExec("create table pt1(a int, b int, c int) PARTITION BY hash (a) partitions 1;") - tk.MustExec("alter table pt1 add index idx((a+c));") - - tk.MustExec("drop table if exists nt1;") - tk.MustExec("create table nt1(a int, b int, c int);") - tk.MustGetErrCode("alter table pt1 exchange partition p0 with table nt1;", errno.ErrTablesDifferentMetadata) - - tk.MustExec("alter table nt1 add column (`_V$_idx_0` bigint(20) generated always as (a+b) virtual);") - tk.MustGetErrCode("alter table pt1 exchange partition p0 with table nt1;", errno.ErrTablesDifferentMetadata) - - // test different expression index when expression returns same field type - tk.MustExec("alter table nt1 drop column `_V$_idx_0`;") - tk.MustExec("alter table nt1 add index idx((b-c));") - tk.MustGetErrCode("alter table pt1 exchange partition p0 with table nt1;", errno.ErrTablesDifferentMetadata) - - // test different expression index when expression returns different field type - tk.MustExec("alter table nt1 drop index idx;") - tk.MustExec("alter table nt1 add index idx((concat(a, b)));") - tk.MustGetErrCode("alter table pt1 exchange partition p0 with table nt1;", errno.ErrTablesDifferentMetadata) - - tk.MustExec("drop table if exists nt2;") - tk.MustExec("create table nt2 (a int, b int, c int)") - tk.MustExec("alter table nt2 add index idx((a+c))") - tk.MustExec("alter table pt1 exchange partition p0 with table nt2") -} - func TestAddPartitionTooManyPartitions(t *testing.T) { store := testkit.CreateMockStore(t) tk := testkit.NewTestKit(t, store) @@ -3036,14 +2662,6 @@ func TestPartitionErrorCode(t *testing.T) { } func TestCommitWhenSchemaChange(t *testing.T) { - restore := config.RestoreFunc() - defer restore() - config.UpdateGlobal(func(conf *config.Config) { - // Test for table lock. - conf.EnableTableLock = true - conf.Instance.SlowThreshold = 10000 - conf.Experimental.AllowsExpressionIndex = true - }) store := testkit.CreateMockStoreWithSchemaLease(t, time.Second) tk := testkit.NewTestKit(t, store) tk.MustExec("set global tidb_enable_metadata_lock=0") diff --git a/pkg/ddl/tests/partition/main_test.go b/pkg/ddl/tests/partition/main_test.go index 7bac6d15f2c99..27963eefaef27 100644 --- a/pkg/ddl/tests/partition/main_test.go +++ b/pkg/ddl/tests/partition/main_test.go @@ -47,6 +47,7 @@ func TestMain(m *testing.M) { opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), diff --git a/pkg/ddl/tests/resourcegroup/resource_group_test.go b/pkg/ddl/tests/resourcegroup/resource_group_test.go index a76b34f5532ff..dbf4e88010968 100644 --- a/pkg/ddl/tests/resourcegroup/resource_group_test.go +++ b/pkg/ddl/tests/resourcegroup/resource_group_test.go @@ -492,8 +492,10 @@ func TestBindHints(t *testing.T) { tk.MustExec("create global binding for select * from t using select /*+ resource_group(rg1) */ * from t") tk.MustQuery("select * from t") re.Equal("rg1", tk.Session().GetSessionVars().StmtCtx.ResourceGroup) + re.Equal("rg1", tk.Session().GetSessionVars().StmtCtx.ResourceGroupName) re.Equal("default", tk.Session().GetSessionVars().ResourceGroupName) tk.MustQuery("select a, b from t") re.Equal("", tk.Session().GetSessionVars().StmtCtx.ResourceGroup) + re.Equal("default", tk.Session().GetSessionVars().StmtCtx.ResourceGroupName) re.Equal("default", tk.Session().GetSessionVars().ResourceGroupName) } diff --git a/pkg/ddl/tests/serial/BUILD.bazel b/pkg/ddl/tests/serial/BUILD.bazel index b0c9469e57e28..a8169eea39895 100644 --- a/pkg/ddl/tests/serial/BUILD.bazel +++ b/pkg/ddl/tests/serial/BUILD.bazel @@ -8,7 +8,7 @@ go_test( "serial_test.go", ], flaky = True, - shard_count = 20, + shard_count = 19, deps = [ "//pkg/config", "//pkg/ddl", diff --git a/pkg/ddl/tests/serial/main_test.go b/pkg/ddl/tests/serial/main_test.go index 73100516be9f6..1695d665ca061 100644 --- a/pkg/ddl/tests/serial/main_test.go +++ b/pkg/ddl/tests/serial/main_test.go @@ -66,6 +66,7 @@ func TestMain(m *testing.M) { opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("github.com/tikv/client-go/v2/txnkv/transaction.keepAlive"), diff --git a/pkg/ddl/tests/serial/serial_test.go b/pkg/ddl/tests/serial/serial_test.go index 79818967e8e8c..5de7b59cbed93 100644 --- a/pkg/ddl/tests/serial/serial_test.go +++ b/pkg/ddl/tests/serial/serial_test.go @@ -830,7 +830,7 @@ func TestCanceledJobTakeTime(t *testing.T) { if err != nil { return err } - return m.DropTableOrView(job.SchemaID, job.TableID) + return m.DropTableOrView(job.SchemaID, job.SchemaName, job.TableID, job.TableName) }) require.NoError(t, err) }) @@ -846,13 +846,13 @@ func TestCanceledJobTakeTime(t *testing.T) { require.Less(t, sub, ddl.GetWaitTimeWhenErrorOccurred()) } -func TestTableLocksEnable(t *testing.T) { +func TestTableLocksDisable(t *testing.T) { store := testkit.CreateMockStore(t) tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("create table t1 (a int)") - // Test for enable table lock config. + // Test for disable table lock config. defer config.RestoreFunc()() config.UpdateGlobal(func(conf *config.Config) { conf.EnableTableLock = false @@ -1285,20 +1285,3 @@ func TestGetReverseKey(t *testing.T) { endKey = maxKey.Next() checkRet(startKey, endKey, endKey) } - -func TestLocalTemporaryTableBlockedDDL(t *testing.T) { - store := testkit.CreateMockStore(t) - tk := testkit.NewTestKit(t, store) - tk.MustExec("use test") - tk.MustExec("create table t1 (id int)") - tk.MustExec("create temporary table tmp1 (id int primary key, a int unique, b int)") - require.ErrorIs(t, tk.ExecToErr("rename table tmp1 to tmp2"), dbterror.ErrUnsupportedLocalTempTableDDL) - require.ErrorIs(t, tk.ExecToErr("alter table tmp1 add column c int"), dbterror.ErrUnsupportedLocalTempTableDDL) - require.ErrorIs(t, tk.ExecToErr("alter table tmp1 add index b(b)"), dbterror.ErrUnsupportedLocalTempTableDDL) - require.ErrorIs(t, tk.ExecToErr("create index a on tmp1(b)"), dbterror.ErrUnsupportedLocalTempTableDDL) - require.ErrorIs(t, tk.ExecToErr("drop index a on tmp1"), dbterror.ErrUnsupportedLocalTempTableDDL) - require.ErrorIs(t, tk.ExecToErr("lock tables tmp1 read"), dbterror.ErrUnsupportedLocalTempTableDDL) - require.ErrorIs(t, tk.ExecToErr("lock tables tmp1 write"), dbterror.ErrUnsupportedLocalTempTableDDL) - require.ErrorIs(t, tk.ExecToErr("lock tables t1 read, tmp1 read"), dbterror.ErrUnsupportedLocalTempTableDDL) - require.ErrorIs(t, tk.ExecToErr("admin cleanup table lock tmp1"), dbterror.ErrUnsupportedLocalTempTableDDL) -} diff --git a/pkg/ddl/tests/tiflash/BUILD.bazel b/pkg/ddl/tests/tiflash/BUILD.bazel index f0117788b0599..1668f154eaf30 100644 --- a/pkg/ddl/tests/tiflash/BUILD.bazel +++ b/pkg/ddl/tests/tiflash/BUILD.bazel @@ -28,6 +28,7 @@ go_test( "//pkg/testkit", "//pkg/testkit/external", "//pkg/testkit/testsetup", + "//pkg/types", "//pkg/util", "//pkg/util/logutil", "//pkg/util/sqlkiller", diff --git a/pkg/ddl/tests/tiflash/ddl_tiflash_test.go b/pkg/ddl/tests/tiflash/ddl_tiflash_test.go index 948b277a6f68c..06d850a8d9497 100644 --- a/pkg/ddl/tests/tiflash/ddl_tiflash_test.go +++ b/pkg/ddl/tests/tiflash/ddl_tiflash_test.go @@ -44,6 +44,7 @@ import ( "github.com/pingcap/tidb/pkg/tablecodec" "github.com/pingcap/tidb/pkg/testkit" "github.com/pingcap/tidb/pkg/testkit/external" + "github.com/pingcap/tidb/pkg/types" "github.com/pingcap/tidb/pkg/util" "github.com/pingcap/tidb/pkg/util/logutil" "github.com/pingcap/tidb/pkg/util/sqlkiller" @@ -471,8 +472,8 @@ func TestTiFlashFlashbackCluster(t *testing.T) { }() errorMsg := fmt.Sprintf("[ddl:-1]Detected unsupported DDL job type(%s) during [%s, now), can't do flashback", - model.ActionSetTiFlashReplica.String(), oracle.GetTimeFromTS(ts).String()) - tk.MustGetErrMsg(fmt.Sprintf("flashback cluster to timestamp '%s'", oracle.GetTimeFromTS(ts)), errorMsg) + model.ActionSetTiFlashReplica.String(), oracle.GetTimeFromTS(ts).Format(types.TimeFSPFormat)) + tk.MustGetErrMsg(fmt.Sprintf("flashback cluster to timestamp '%s'", oracle.GetTimeFromTS(ts).Format(types.TimeFSPFormat)), errorMsg) require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/ddl/mockFlashbackTest")) require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/ddl/injectSafeTS")) diff --git a/pkg/ddl/tests/tiflash/main_test.go b/pkg/ddl/tests/tiflash/main_test.go index d76564038e9de..83e13b146505b 100644 --- a/pkg/ddl/tests/tiflash/main_test.go +++ b/pkg/ddl/tests/tiflash/main_test.go @@ -40,6 +40,7 @@ func TestMain(m *testing.M) { opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), diff --git a/pkg/ddl/util/callback/callback.go b/pkg/ddl/util/callback/callback.go index c4dade9f55d49..0303d4077de42 100644 --- a/pkg/ddl/util/callback/callback.go +++ b/pkg/ddl/util/callback/callback.go @@ -124,6 +124,9 @@ func (tc *TestDDLCallback) OnJobUpdated(job *model.Job) { (*onJobUpdatedExportedFunc)(job) return } + if job.State == model.JobStateSynced { + return + } if tc.onJobUpdated != nil { tc.onJobUpdated(job) return diff --git a/pkg/ddl/util/main_test.go b/pkg/ddl/util/main_test.go index e5becaafd566e..54ab1870b3b47 100644 --- a/pkg/ddl/util/main_test.go +++ b/pkg/ddl/util/main_test.go @@ -25,6 +25,7 @@ func TestMain(m *testing.M) { testsetup.SetupForCommonTest() opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), diff --git a/pkg/distsql/distsql.go b/pkg/distsql/distsql.go index 6f913436ce2f1..12e86e8888a25 100644 --- a/pkg/distsql/distsql.go +++ b/pkg/distsql/distsql.go @@ -36,8 +36,8 @@ import ( "google.golang.org/grpc/metadata" ) -// GenSelectResultFromResponse generates an iterator from response. -func GenSelectResultFromResponse(sctx sessionctx.Context, fieldTypes []*types.FieldType, planIDs []int, rootID int, resp kv.Response) SelectResult { +// GenSelectResultFromMPPResponse generates an iterator from response. +func GenSelectResultFromMPPResponse(sctx sessionctx.Context, fieldTypes []*types.FieldType, planIDs []int, rootID int, resp kv.Response) SelectResult { // TODO: Add metric label and set open tracing. return &selectResult{ label: "mpp", diff --git a/pkg/distsql/main_test.go b/pkg/distsql/main_test.go index 42ebd76393c1f..9157877ba3b5e 100644 --- a/pkg/distsql/main_test.go +++ b/pkg/distsql/main_test.go @@ -25,6 +25,7 @@ func TestMain(m *testing.M) { testsetup.SetupForCommonTest() opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), diff --git a/pkg/distsql/request_builder.go b/pkg/distsql/request_builder.go index ddf61ae60f125..55edca8894dc2 100644 --- a/pkg/distsql/request_builder.go +++ b/pkg/distsql/request_builder.go @@ -309,7 +309,7 @@ func (builder *RequestBuilder) SetFromSessionVars(sv *variable.SessionVars) *Req builder.RequestSource.RequestSourceType = sv.RequestSourceType builder.RequestSource.ExplicitRequestSourceType = sv.ExplicitRequestSourceType builder.StoreBatchSize = sv.StoreBatchSize - builder.Request.ResourceGroupName = sv.ResourceGroupName + builder.Request.ResourceGroupName = sv.StmtCtx.ResourceGroupName builder.Request.StoreBusyThreshold = sv.LoadBasedReplicaReadThreshold builder.Request.RunawayChecker = sv.StmtCtx.RunawayChecker builder.Request.TiKVClientReadTimeout = sv.GetTiKVClientReadTimeout() diff --git a/pkg/distsql/request_builder_test.go b/pkg/distsql/request_builder_test.go index 096bb905f55f1..cde41664a470f 100644 --- a/pkg/distsql/request_builder_test.go +++ b/pkg/distsql/request_builder_test.go @@ -579,7 +579,7 @@ func TestRequestBuilder7(t *testing.T) { func TestRequestBuilder8(t *testing.T) { sv := variable.NewSessionVars(nil) - sv.ResourceGroupName = "test" + sv.StmtCtx.ResourceGroupName = "test" actual, err := (&RequestBuilder{}). SetFromSessionVars(sv). Build() diff --git a/pkg/disttask/framework/BUILD.bazel b/pkg/disttask/framework/BUILD.bazel index 067cac82e13f9..7e3b96e1a6bb0 100644 --- a/pkg/disttask/framework/BUILD.bazel +++ b/pkg/disttask/framework/BUILD.bazel @@ -4,29 +4,25 @@ go_test( name = "framework_test", timeout = "short", srcs = [ - "framework_dynamic_dispatch_test.go", "framework_err_handling_test.go", "framework_ha_test.go", "framework_pause_and_resume_test.go", + "framework_role_test.go", "framework_rollback_test.go", "framework_test.go", ], flaky = True, race = "off", - shard_count = 31, + shard_count = 26, deps = [ - "//pkg/disttask/framework/dispatcher", "//pkg/disttask/framework/handle", - "//pkg/disttask/framework/mock", - "//pkg/disttask/framework/mock/execute", "//pkg/disttask/framework/proto", "//pkg/disttask/framework/scheduler", "//pkg/disttask/framework/storage", - "//pkg/domain/infosync", + "//pkg/disttask/framework/testutil", "//pkg/testkit", + "//pkg/util", "@com_github_pingcap_failpoint//:failpoint", "@com_github_stretchr_testify//require", - "@com_github_tikv_client_go_v2//util", - "@org_uber_go_mock//gomock", ], ) diff --git a/pkg/disttask/framework/dispatcher/dispatcher.go b/pkg/disttask/framework/dispatcher/dispatcher.go deleted file mode 100644 index ebb7bfa86b0d6..0000000000000 --- a/pkg/disttask/framework/dispatcher/dispatcher.go +++ /dev/null @@ -1,736 +0,0 @@ -// Copyright 2023 PingCAP, 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. - -package dispatcher - -import ( - "context" - "math/rand" - "time" - - "github.com/pingcap/errors" - "github.com/pingcap/failpoint" - "github.com/pingcap/tidb/pkg/disttask/framework/proto" - "github.com/pingcap/tidb/pkg/disttask/framework/storage" - "github.com/pingcap/tidb/pkg/domain/infosync" - "github.com/pingcap/tidb/pkg/metrics" - "github.com/pingcap/tidb/pkg/sessionctx" - disttaskutil "github.com/pingcap/tidb/pkg/util/disttask" - "github.com/pingcap/tidb/pkg/util/intest" - "github.com/pingcap/tidb/pkg/util/logutil" - "go.uber.org/zap" -) - -const ( - // DefaultSubtaskConcurrency is the default concurrency for handling subtask. - DefaultSubtaskConcurrency = 16 - // MaxSubtaskConcurrency is the maximum concurrency for handling subtask. - MaxSubtaskConcurrency = 256 - // DefaultLiveNodesCheckInterval is the tick interval of fetching all server infos from etcd. - DefaultLiveNodesCheckInterval = 2 -) - -var ( - checkTaskFinishedInterval = 500 * time.Millisecond - nonRetrySQLTime = 1 - // RetrySQLTimes is the max retry times when executing SQL. - RetrySQLTimes = 30 - // RetrySQLInterval is the initial interval between two SQL retries. - RetrySQLInterval = 3 * time.Second - // RetrySQLMaxInterval is the max interval between two SQL retries. - RetrySQLMaxInterval = 30 * time.Second -) - -// TaskHandle provides the interface for operations needed by Dispatcher. -// Then we can use dispatcher's function in Dispatcher interface. -type TaskHandle interface { - // GetPreviousSchedulerIDs gets previous scheduler IDs. - GetPreviousSchedulerIDs(_ context.Context, taskID int64, step proto.Step) ([]string, error) - // GetPreviousSubtaskMetas gets previous subtask metas. - GetPreviousSubtaskMetas(taskID int64, step proto.Step) ([][]byte, error) - storage.SessionExecutor -} - -// Dispatcher manages the lifetime of a task -// including submitting subtasks and updating the status of a task. -type Dispatcher interface { - // Init initializes the dispatcher, should be called before ExecuteTask. - // if Init returns error, dispatcher manager will fail the task directly, - // so the returned error should be a fatal error. - Init() error - // ExecuteTask start to schedule a task. - ExecuteTask() - // Close closes the dispatcher, should be called if Init returns nil. - Close() -} - -// BaseDispatcher is the base struct for Dispatcher. -// each task type embed this struct and implement the Extension interface. -type BaseDispatcher struct { - ctx context.Context - taskMgr TaskManager - Task *proto.Task - logCtx context.Context - // serverID, it's value is ip:port now. - serverID string - // when RegisterDispatcherFactory, the factory MUST initialize this field. - Extension - - // for HA - // liveNodes will fetch and store all live nodes every liveNodeInterval ticks. - liveNodes []*infosync.ServerInfo - liveNodeFetchInterval int - // liveNodeFetchTick is the tick variable. - liveNodeFetchTick int - // taskNodes stores the id of current scheduler nodes. - taskNodes []string - // rand is for generating random selection of nodes. - rand *rand.Rand -} - -// MockOwnerChange mock owner change in tests. -var MockOwnerChange func() - -// NewBaseDispatcher creates a new BaseDispatcher. -func NewBaseDispatcher(ctx context.Context, taskMgr TaskManager, serverID string, task *proto.Task) *BaseDispatcher { - logCtx := logutil.WithFields(context.Background(), zap.Int64("task-id", task.ID), - zap.Stringer("task-type", task.Type)) - return &BaseDispatcher{ - ctx: ctx, - taskMgr: taskMgr, - Task: task, - logCtx: logCtx, - serverID: serverID, - liveNodes: nil, - liveNodeFetchInterval: DefaultLiveNodesCheckInterval, - liveNodeFetchTick: 0, - taskNodes: nil, - rand: rand.New(rand.NewSource(time.Now().UnixNano())), - } -} - -// Init implements the Dispatcher interface. -func (*BaseDispatcher) Init() error { - return nil -} - -// ExecuteTask implements the Dispatcher interface. -func (d *BaseDispatcher) ExecuteTask() { - logutil.Logger(d.logCtx).Info("execute one task", - zap.Stringer("state", d.Task.State), zap.Uint64("concurrency", d.Task.Concurrency)) - d.scheduleTask() -} - -// Close closes the dispatcher. -func (*BaseDispatcher) Close() { -} - -// refreshTask fetch task state from tidb_global_task table. -func (d *BaseDispatcher) refreshTask() error { - newTask, err := d.taskMgr.GetGlobalTaskByID(d.ctx, d.Task.ID) - if err != nil { - logutil.Logger(d.logCtx).Error("refresh task failed", zap.Error(err)) - return err - } - // newTask might be nil when GC routine move the task into history table. - if newTask != nil { - d.Task = newTask - } - return nil -} - -// scheduleTask schedule the task execution step by step. -func (d *BaseDispatcher) scheduleTask() { - ticker := time.NewTicker(checkTaskFinishedInterval) - defer ticker.Stop() - for { - select { - case <-d.ctx.Done(): - logutil.Logger(d.logCtx).Info("schedule task exits", zap.Error(d.ctx.Err())) - return - case <-ticker.C: - err := d.refreshTask() - if err != nil { - continue - } - failpoint.Inject("cancelTaskAfterRefreshTask", func(val failpoint.Value) { - if val.(bool) && d.Task.State == proto.TaskStateRunning { - err := d.taskMgr.CancelGlobalTask(d.ctx, d.Task.ID) - if err != nil { - logutil.Logger(d.logCtx).Error("cancel task failed", zap.Error(err)) - } - } - }) - - failpoint.Inject("pausePendingTask", func(val failpoint.Value) { - if val.(bool) && d.Task.State == proto.TaskStatePending { - _, err := d.taskMgr.PauseTask(d.ctx, d.Task.Key) - if err != nil { - logutil.Logger(d.logCtx).Error("pause task failed", zap.Error(err)) - } - d.Task.State = proto.TaskStatePausing - } - }) - - failpoint.Inject("pauseTaskAfterRefreshTask", func(val failpoint.Value) { - if val.(bool) && d.Task.State == proto.TaskStateRunning { - _, err := d.taskMgr.PauseTask(d.ctx, d.Task.Key) - if err != nil { - logutil.Logger(d.logCtx).Error("pause task failed", zap.Error(err)) - } - d.Task.State = proto.TaskStatePausing - } - }) - - switch d.Task.State { - case proto.TaskStateCancelling: - err = d.onCancelling() - case proto.TaskStatePausing: - err = d.onPausing() - case proto.TaskStatePaused: - err = d.onPaused() - // close the dispatcher. - if err == nil { - return - } - case proto.TaskStateResuming: - err = d.onResuming() - case proto.TaskStateReverting: - err = d.onReverting() - case proto.TaskStatePending: - err = d.onPending() - case proto.TaskStateRunning: - err = d.onRunning() - case proto.TaskStateSucceed, proto.TaskStateReverted, proto.TaskStateFailed: - if err := d.onFinished(); err != nil { - logutil.Logger(d.logCtx).Error("schedule task meet error", zap.Stringer("state", d.Task.State), zap.Error(err)) - } - return - } - if err != nil { - logutil.Logger(d.logCtx).Info("schedule task meet err, reschedule it", zap.Error(err)) - } - - failpoint.Inject("mockOwnerChange", func(val failpoint.Value) { - if val.(bool) { - logutil.Logger(d.logCtx).Info("mockOwnerChange called") - MockOwnerChange() - time.Sleep(time.Second) - } - }) - } - } -} - -// handle task in cancelling state, dispatch revert subtasks. -func (d *BaseDispatcher) onCancelling() error { - logutil.Logger(d.logCtx).Info("on cancelling state", zap.Stringer("state", d.Task.State), zap.Int64("stage", int64(d.Task.Step))) - errs := []error{errors.New("cancel")} - return d.onErrHandlingStage(errs) -} - -// handle task in pausing state, cancel all running subtasks. -func (d *BaseDispatcher) onPausing() error { - logutil.Logger(d.logCtx).Info("on pausing state", zap.Stringer("state", d.Task.State), zap.Int64("stage", int64(d.Task.Step))) - cnt, err := d.taskMgr.GetSubtaskInStatesCnt(d.ctx, d.Task.ID, proto.TaskStateRunning, proto.TaskStatePending) - if err != nil { - logutil.Logger(d.logCtx).Warn("check task failed", zap.Error(err)) - return err - } - if cnt == 0 { - logutil.Logger(d.logCtx).Info("all running subtasks paused, update the task to paused state") - return d.updateTask(proto.TaskStatePaused, nil, RetrySQLTimes) - } - logutil.Logger(d.logCtx).Debug("on pausing state, this task keeps current state", zap.Stringer("state", d.Task.State)) - return nil -} - -// MockDMLExecutionOnPausedState is used to mock DML execution when tasks paused. -var MockDMLExecutionOnPausedState func(task *proto.Task) - -// handle task in paused state -func (d *BaseDispatcher) onPaused() error { - logutil.Logger(d.logCtx).Info("on paused state", zap.Stringer("state", d.Task.State), zap.Int64("stage", int64(d.Task.Step))) - failpoint.Inject("mockDMLExecutionOnPausedState", func(val failpoint.Value) { - if val.(bool) { - MockDMLExecutionOnPausedState(d.Task) - } - }) - return nil -} - -// TestSyncChan is used to sync the test. -var TestSyncChan = make(chan struct{}) - -// handle task in resuming state -func (d *BaseDispatcher) onResuming() error { - logutil.Logger(d.logCtx).Info("on resuming state", zap.Stringer("state", d.Task.State), zap.Int64("stage", int64(d.Task.Step))) - cnt, err := d.taskMgr.GetSubtaskInStatesCnt(d.ctx, d.Task.ID, proto.TaskStatePaused) - if err != nil { - logutil.Logger(d.logCtx).Warn("check task failed", zap.Error(err)) - return err - } - if cnt == 0 { - // Finish the resuming process. - logutil.Logger(d.logCtx).Info("all paused tasks converted to pending state, update the task to running state") - err := d.updateTask(proto.TaskStateRunning, nil, RetrySQLTimes) - failpoint.Inject("syncAfterResume", func() { - TestSyncChan <- struct{}{} - }) - return err - } - - return d.taskMgr.ResumeSubtasks(d.ctx, d.Task.ID) -} - -// handle task in reverting state, check all revert subtasks finished. -func (d *BaseDispatcher) onReverting() error { - logutil.Logger(d.logCtx).Debug("on reverting state", zap.Stringer("state", d.Task.State), zap.Int64("stage", int64(d.Task.Step))) - cnt, err := d.taskMgr.GetSubtaskInStatesCnt(d.ctx, d.Task.ID, proto.TaskStateRevertPending, proto.TaskStateReverting) - if err != nil { - logutil.Logger(d.logCtx).Warn("check task failed", zap.Error(err)) - return err - } - if cnt == 0 { - // Finish the rollback step. - logutil.Logger(d.logCtx).Info("all reverting tasks finished, update the task to reverted state") - return d.updateTask(proto.TaskStateReverted, nil, RetrySQLTimes) - } - // Wait all subtasks in this stage finished. - d.OnTick(d.ctx, d.Task) - logutil.Logger(d.logCtx).Debug("on reverting state, this task keeps current state", zap.Stringer("state", d.Task.State)) - return nil -} - -// handle task in pending state, dispatch subtasks. -func (d *BaseDispatcher) onPending() error { - logutil.Logger(d.logCtx).Debug("on pending state", zap.Stringer("state", d.Task.State), zap.Int64("stage", int64(d.Task.Step))) - return d.onNextStage() -} - -// handle task in running state, check all running subtasks finished. -// If subtasks finished, run into the next stage. -func (d *BaseDispatcher) onRunning() error { - logutil.Logger(d.logCtx).Debug("on running state", zap.Stringer("state", d.Task.State), zap.Int64("stage", int64(d.Task.Step))) - subTaskErrs, err := d.taskMgr.CollectSubTaskError(d.ctx, d.Task.ID) - if err != nil { - logutil.Logger(d.logCtx).Warn("collect subtask error failed", zap.Error(err)) - return err - } - if len(subTaskErrs) > 0 { - logutil.Logger(d.logCtx).Warn("subtasks encounter errors") - return d.onErrHandlingStage(subTaskErrs) - } - // check current stage finished. - cnt, err := d.taskMgr.GetSubtaskInStatesCnt(d.ctx, d.Task.ID, proto.TaskStatePending, proto.TaskStateRunning) - if err != nil { - logutil.Logger(d.logCtx).Warn("check task failed", zap.Error(err)) - return err - } - - if cnt == 0 { - return d.onNextStage() - } - // Check if any node are down. - if err := d.replaceDeadNodesIfAny(); err != nil { - return err - } - // Wait all subtasks in this stage finished. - d.OnTick(d.ctx, d.Task) - logutil.Logger(d.logCtx).Debug("on running state, this task keeps current state", zap.Stringer("state", d.Task.State)) - return nil -} - -func (d *BaseDispatcher) onFinished() error { - metrics.UpdateMetricsForFinishTask(d.Task) - logutil.Logger(d.logCtx).Debug("schedule task, task is finished", zap.Stringer("state", d.Task.State)) - return d.taskMgr.TransferSubTasks2History(d.ctx, d.Task.ID) -} - -func (d *BaseDispatcher) replaceDeadNodesIfAny() error { - if len(d.taskNodes) == 0 { - var err error - d.taskNodes, err = d.taskMgr.GetSchedulerIDsByTaskIDAndStep(d.ctx, d.Task.ID, d.Task.Step) - if err != nil { - return err - } - } - d.liveNodeFetchTick++ - if d.liveNodeFetchTick == d.liveNodeFetchInterval { - d.liveNodeFetchTick = 0 - serverInfos, err := GenerateSchedulerNodes(d.ctx) - if err != nil { - return err - } - - eligibleServerInfos, filter, err := d.GetEligibleInstances(d.ctx, d.Task) - if err != nil { - return err - } - if filter { - eligibleServerInfos, err = d.filterByRole(eligibleServerInfos) - if err != nil { - return err - } - } - newInfos := serverInfos[:0] - for _, m := range serverInfos { - found := false - for _, n := range eligibleServerInfos { - if m.ID == n.ID { - found = true - break - } - } - if found { - newInfos = append(newInfos, m) - } - } - d.liveNodes = newInfos - } - if len(d.liveNodes) > 0 { - replaceNodes := make(map[string]string) - cleanNodes := make([]string, 0) - for _, nodeID := range d.taskNodes { - if ok := disttaskutil.MatchServerInfo(d.liveNodes, nodeID); !ok { - n := d.liveNodes[d.rand.Int()%len(d.liveNodes)] //nolint:gosec - replaceNodes[nodeID] = disttaskutil.GenerateExecID(n.IP, n.Port) - cleanNodes = append(cleanNodes, nodeID) - } - } - if len(replaceNodes) > 0 { - logutil.Logger(d.logCtx).Info("reschedule subtasks to other nodes", zap.Int("node-cnt", len(replaceNodes))) - if err := d.taskMgr.UpdateFailedSchedulerIDs(d.ctx, d.Task.ID, replaceNodes); err != nil { - return err - } - if err := d.taskMgr.CleanUpMeta(d.ctx, cleanNodes); err != nil { - return err - } - // replace local cache. - for k, v := range replaceNodes { - for m, n := range d.taskNodes { - if n == k { - d.taskNodes[m] = v - break - } - } - } - } - } - return nil -} - -// updateTask update the task in tidb_global_task table. -func (d *BaseDispatcher) updateTask(taskState proto.TaskState, newSubTasks []*proto.Subtask, retryTimes int) (err error) { - prevState := d.Task.State - d.Task.State = taskState - logutil.BgLogger().Info("task state transform", zap.Stringer("from", prevState), zap.Stringer("to", taskState)) - if !VerifyTaskStateTransform(prevState, taskState) { - return errors.Errorf("invalid task state transform, from %s to %s", prevState, taskState) - } - - failpoint.Inject("cancelBeforeUpdate", func() { - err := d.taskMgr.CancelGlobalTask(d.ctx, d.Task.ID) - if err != nil { - logutil.Logger(d.logCtx).Error("cancel task failed", zap.Error(err)) - } - }) - - var retryable bool - for i := 0; i < retryTimes; i++ { - retryable, err = d.taskMgr.UpdateGlobalTaskAndAddSubTasks(d.ctx, d.Task, newSubTasks, prevState) - if err == nil || !retryable { - break - } - if i%10 == 0 { - logutil.Logger(d.logCtx).Warn("updateTask first failed", zap.Stringer("from", prevState), zap.Stringer("to", d.Task.State), - zap.Int("retry times", i), zap.Error(err)) - } - time.Sleep(RetrySQLInterval) - } - if err != nil && retryTimes != nonRetrySQLTime { - logutil.Logger(d.logCtx).Warn("updateTask failed", - zap.Stringer("from", prevState), zap.Stringer("to", d.Task.State), zap.Int("retry times", retryTimes), zap.Error(err)) - } - return err -} - -func (d *BaseDispatcher) onErrHandlingStage(receiveErrs []error) error { - // 1. generate the needed task meta and subTask meta (dist-plan). - meta, err := d.OnErrStage(d.ctx, d, d.Task, receiveErrs) - if err != nil { - // OnErrStage must be retryable, if not, there will have resource leak for tasks. - logutil.Logger(d.logCtx).Warn("handle error failed", zap.Error(err)) - return err - } - - // 2. dispatch revert dist-plan to EligibleInstances. - return d.dispatchSubTask4Revert(meta) -} - -func (d *BaseDispatcher) dispatchSubTask4Revert(meta []byte) error { - instanceIDs, err := d.GetAllSchedulerIDs(d.ctx, d.Task) - if err != nil { - logutil.Logger(d.logCtx).Warn("get task's all instances failed", zap.Error(err)) - return err - } - - subTasks := make([]*proto.Subtask, 0, len(instanceIDs)) - for _, id := range instanceIDs { - // reverting subtasks belong to the same step as current active step. - subTasks = append(subTasks, proto.NewSubtask(d.Task.Step, d.Task.ID, d.Task.Type, id, meta)) - } - return d.updateTask(proto.TaskStateReverting, subTasks, RetrySQLTimes) -} - -func (*BaseDispatcher) nextStepSubtaskDispatched(*proto.Task) bool { - // TODO: will implement it when we we support dispatch subtask by batch. - // since subtask meta might be too large to save in one transaction. - return true -} - -func (d *BaseDispatcher) onNextStage() (err error) { - /// dynamic dispatch subtasks. - failpoint.Inject("mockDynamicDispatchErr", func() { - failpoint.Return(errors.New("mockDynamicDispatchErr")) - }) - - nextStep := d.GetNextStep(d.Task) - logutil.Logger(d.logCtx).Info("onNextStage", - zap.Int64("current-step", int64(d.Task.Step)), - zap.Int64("next-step", int64(nextStep))) - - // 1. Adjust the global task's concurrency. - if d.Task.State == proto.TaskStatePending { - if d.Task.Concurrency == 0 { - d.Task.Concurrency = DefaultSubtaskConcurrency - } - if d.Task.Concurrency > MaxSubtaskConcurrency { - d.Task.Concurrency = MaxSubtaskConcurrency - } - } - defer func() { - if err != nil { - return - } - // invariant: task.Step always means the most recent step that all - // corresponding subtasks have been saved to system table. - // - // when all subtasks of task.Step is finished, we call OnNextSubtasksBatch - // to generate subtasks of next step. after all subtasks of next step are - // saved to system table, we will update task.Step to next step, so the - // invariant hold. - // see nextStepSubtaskDispatched for why we don't update task and subtasks - // in a single transaction. - if d.nextStepSubtaskDispatched(d.Task) { - currStep := d.Task.Step - d.Task.Step = nextStep - // When all subtasks dispatched and processed, mark task as succeed. - taskState := proto.TaskStateRunning - if d.Task.Step == proto.StepDone { - taskState = proto.TaskStateSucceed - logutil.Logger(d.logCtx).Info("all subtasks dispatched and processed, finish the task") - } else { - logutil.Logger(d.logCtx).Info("move to next stage", - zap.Int64("from", int64(currStep)), zap.Int64("to", int64(d.Task.Step))) - } - d.Task.StateUpdateTime = time.Now().UTC() - err = d.updateTask(taskState, nil, RetrySQLTimes) - } - }() - - for { - // 3. generate a batch of subtasks. - /// select all available TiDB nodes for task. - serverNodes, filter, err := d.GetEligibleInstances(d.ctx, d.Task) - logutil.Logger(d.logCtx).Debug("eligible instances", zap.Int("num", len(serverNodes))) - - if err != nil { - return err - } - if filter { - serverNodes, err = d.filterByRole(serverNodes) - if err != nil { - return err - } - } - logutil.Logger(d.logCtx).Info("eligible instances", zap.Int("num", len(serverNodes))) - if len(serverNodes) == 0 { - return errors.New("no available TiDB node to dispatch subtasks") - } - - metas, err := d.OnNextSubtasksBatch(d.ctx, d, d.Task, serverNodes, nextStep) - if err != nil { - logutil.Logger(d.logCtx).Warn("generate part of subtasks failed", zap.Error(err)) - return d.handlePlanErr(err) - } - - failpoint.Inject("mockDynamicDispatchErr1", func() { - failpoint.Return(errors.New("mockDynamicDispatchErr1")) - }) - - // 4. dispatch batch of subtasks to EligibleInstances. - err = d.dispatchSubTask(nextStep, metas, serverNodes) - if err != nil { - return err - } - - if d.nextStepSubtaskDispatched(d.Task) { - break - } - - failpoint.Inject("mockDynamicDispatchErr2", func() { - failpoint.Return(errors.New("mockDynamicDispatchErr2")) - }) - } - return nil -} - -func (d *BaseDispatcher) dispatchSubTask( - subtaskStep proto.Step, - metas [][]byte, - serverNodes []*infosync.ServerInfo) error { - logutil.Logger(d.logCtx).Info("dispatch subtasks", zap.Stringer("state", d.Task.State), zap.Int64("step", int64(d.Task.Step)), zap.Uint64("concurrency", d.Task.Concurrency), zap.Int("subtasks", len(metas))) - d.taskNodes = make([]string, len(serverNodes)) - for i := range serverNodes { - d.taskNodes[i] = disttaskutil.GenerateExecID(serverNodes[i].IP, serverNodes[i].Port) - } - subTasks := make([]*proto.Subtask, 0, len(metas)) - for i, meta := range metas { - // we assign the subtask to the instance in a round-robin way. - // TODO: assign the subtask to the instance according to the system load of each nodes - pos := i % len(serverNodes) - instanceID := disttaskutil.GenerateExecID(serverNodes[pos].IP, serverNodes[pos].Port) - logutil.Logger(d.logCtx).Debug("create subtasks", zap.String("instanceID", instanceID)) - subTasks = append(subTasks, proto.NewSubtask(subtaskStep, d.Task.ID, d.Task.Type, instanceID, meta)) - } - return d.updateTask(d.Task.State, subTasks, RetrySQLTimes) -} - -func (d *BaseDispatcher) handlePlanErr(err error) error { - logutil.Logger(d.logCtx).Warn("generate plan failed", zap.Error(err), zap.Stringer("state", d.Task.State)) - if d.IsRetryableErr(err) { - return err - } - d.Task.Error = err - // state transform: pending -> failed. - return d.updateTask(proto.TaskStateFailed, nil, RetrySQLTimes) -} - -// MockServerInfo exported for dispatcher_test.go -var MockServerInfo []*infosync.ServerInfo - -// GenerateSchedulerNodes generate a eligible TiDB nodes. -func GenerateSchedulerNodes(ctx context.Context) (serverNodes []*infosync.ServerInfo, err error) { - failpoint.Inject("mockSchedulerNodes", func() { - failpoint.Return(MockServerInfo, nil) - }) - var serverInfos map[string]*infosync.ServerInfo - _, etcd := ctx.Value("etcd").(bool) - if intest.InTest && !etcd { - serverInfos = infosync.MockGlobalServerInfoManagerEntry.GetAllServerInfo() - } else { - serverInfos, err = infosync.GetAllServerInfo(ctx) - } - if err != nil { - return nil, err - } - if len(serverInfos) == 0 { - return nil, errors.New("not found instance") - } - - serverNodes = make([]*infosync.ServerInfo, 0, len(serverInfos)) - for _, serverInfo := range serverInfos { - serverNodes = append(serverNodes, serverInfo) - } - return serverNodes, nil -} - -func (d *BaseDispatcher) filterByRole(infos []*infosync.ServerInfo) ([]*infosync.ServerInfo, error) { - nodes, err := d.taskMgr.GetNodesByRole(d.ctx, "background") - if err != nil { - return nil, err - } - - if len(nodes) == 0 { - nodes, err = d.taskMgr.GetNodesByRole(d.ctx, "") - } - - if err != nil { - return nil, err - } - - res := make([]*infosync.ServerInfo, 0, len(nodes)) - for _, info := range infos { - _, ok := nodes[disttaskutil.GenerateExecID(info.IP, info.Port)] - if ok { - res = append(res, info) - } - } - return res, nil -} - -// GetAllSchedulerIDs gets all the scheduler IDs. -func (d *BaseDispatcher) GetAllSchedulerIDs(ctx context.Context, task *proto.Task) ([]string, error) { - // We get all servers instead of eligible servers here - // because eligible servers may change during the task execution. - serverInfos, err := GenerateSchedulerNodes(ctx) - if err != nil { - return nil, err - } - if len(serverInfos) == 0 { - return nil, nil - } - - schedulerIDs, err := d.taskMgr.GetSchedulerIDsByTaskID(d.ctx, task.ID) - if err != nil { - return nil, err - } - ids := make([]string, 0, len(schedulerIDs)) - for _, id := range schedulerIDs { - if ok := disttaskutil.MatchServerInfo(serverInfos, id); ok { - ids = append(ids, id) - } - } - return ids, nil -} - -// GetPreviousSubtaskMetas get subtask metas from specific step. -func (d *BaseDispatcher) GetPreviousSubtaskMetas(taskID int64, step proto.Step) ([][]byte, error) { - previousSubtasks, err := d.taskMgr.GetSucceedSubtasksByStep(d.ctx, taskID, step) - if err != nil { - logutil.Logger(d.logCtx).Warn("get previous succeed subtask failed", zap.Int64("step", int64(step))) - return nil, err - } - previousSubtaskMetas := make([][]byte, 0, len(previousSubtasks)) - for _, subtask := range previousSubtasks { - previousSubtaskMetas = append(previousSubtaskMetas, subtask.Meta) - } - return previousSubtaskMetas, nil -} - -// GetPreviousSchedulerIDs gets scheduler IDs that run previous step. -func (d *BaseDispatcher) GetPreviousSchedulerIDs(_ context.Context, taskID int64, step proto.Step) ([]string, error) { - return d.taskMgr.GetSchedulerIDsByTaskIDAndStep(d.ctx, taskID, step) -} - -// WithNewSession executes the function with a new session. -func (d *BaseDispatcher) WithNewSession(fn func(se sessionctx.Context) error) error { - return d.taskMgr.WithNewSession(fn) -} - -// WithNewTxn executes the fn in a new transaction. -func (d *BaseDispatcher) WithNewTxn(ctx context.Context, fn func(se sessionctx.Context) error) error { - return d.taskMgr.WithNewTxn(ctx, fn) -} diff --git a/pkg/disttask/framework/dispatcher/dispatcher_manager.go b/pkg/disttask/framework/dispatcher/dispatcher_manager.go deleted file mode 100644 index 0f147782153f6..0000000000000 --- a/pkg/disttask/framework/dispatcher/dispatcher_manager.go +++ /dev/null @@ -1,407 +0,0 @@ -// Copyright 2023 PingCAP, 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. - -package dispatcher - -import ( - "context" - "time" - - "github.com/pingcap/errors" - "github.com/pingcap/failpoint" - "github.com/pingcap/tidb/pkg/disttask/framework/proto" - "github.com/pingcap/tidb/pkg/metrics" - "github.com/pingcap/tidb/pkg/resourcemanager/pool/spool" - "github.com/pingcap/tidb/pkg/resourcemanager/util" - tidbutil "github.com/pingcap/tidb/pkg/util" - disttaskutil "github.com/pingcap/tidb/pkg/util/disttask" - "github.com/pingcap/tidb/pkg/util/logutil" - "github.com/pingcap/tidb/pkg/util/syncutil" - "go.uber.org/zap" -) - -var ( - // DefaultDispatchConcurrency is the default concurrency for dispatching task. - DefaultDispatchConcurrency = 4 - // checkTaskRunningInterval is the interval for loading tasks. - checkTaskRunningInterval = 3 * time.Second - // defaultHistorySubtaskTableGcInterval is the interval of gc history subtask table. - defaultHistorySubtaskTableGcInterval = 24 * time.Hour - // defaultCleanUpInterval is the interval of cleanUp routine. - defaultCleanUpInterval = 10 * time.Minute -) - -// WaitTaskFinished is used to sync the test. -var WaitTaskFinished = make(chan struct{}) - -func (dm *Manager) getRunningTaskCnt() int { - dm.runningTasks.RLock() - defer dm.runningTasks.RUnlock() - return len(dm.runningTasks.taskIDs) -} - -func (dm *Manager) setRunningTask(task *proto.Task, dispatcher Dispatcher) { - dm.runningTasks.Lock() - defer dm.runningTasks.Unlock() - dm.runningTasks.taskIDs[task.ID] = struct{}{} - dm.runningTasks.dispatchers[task.ID] = dispatcher - metrics.UpdateMetricsForRunTask(task) -} - -func (dm *Manager) isRunningTask(taskID int64) bool { - dm.runningTasks.Lock() - defer dm.runningTasks.Unlock() - _, ok := dm.runningTasks.taskIDs[taskID] - return ok -} - -func (dm *Manager) delRunningTask(taskID int64) { - dm.runningTasks.Lock() - defer dm.runningTasks.Unlock() - delete(dm.runningTasks.taskIDs, taskID) - delete(dm.runningTasks.dispatchers, taskID) -} - -func (dm *Manager) clearRunningTasks() { - dm.runningTasks.Lock() - defer dm.runningTasks.Unlock() - for id := range dm.runningTasks.dispatchers { - delete(dm.runningTasks.dispatchers, id) - } - for id := range dm.runningTasks.taskIDs { - delete(dm.runningTasks.taskIDs, id) - } -} - -// Manager manage a bunch of dispatchers. -// Dispatcher schedule and monitor tasks. -// The scheduling task number is limited by size of gPool. -type Manager struct { - ctx context.Context - cancel context.CancelFunc - taskMgr TaskManager - wg tidbutil.WaitGroupWrapper - gPool *spool.Pool - inited bool - // serverID, it's value is ip:port now. - serverID string - - finishCh chan struct{} - - runningTasks struct { - syncutil.RWMutex - taskIDs map[int64]struct{} - dispatchers map[int64]Dispatcher - } -} - -// NewManager creates a dispatcher struct. -func NewManager(ctx context.Context, taskMgr TaskManager, serverID string) (*Manager, error) { - dispatcherManager := &Manager{ - taskMgr: taskMgr, - serverID: serverID, - } - gPool, err := spool.NewPool("dispatch_pool", int32(DefaultDispatchConcurrency), util.DistTask, spool.WithBlocking(true)) - if err != nil { - return nil, err - } - dispatcherManager.gPool = gPool - dispatcherManager.ctx, dispatcherManager.cancel = context.WithCancel(ctx) - dispatcherManager.runningTasks.taskIDs = make(map[int64]struct{}) - dispatcherManager.runningTasks.dispatchers = make(map[int64]Dispatcher) - dispatcherManager.finishCh = make(chan struct{}, DefaultDispatchConcurrency) - - return dispatcherManager, nil -} - -// Start the dispatcherManager, start the dispatchTaskLoop to start multiple dispatchers. -func (dm *Manager) Start() { - failpoint.Inject("disableDispatcherManager", func() { - failpoint.Return() - }) - dm.wg.Run(dm.dispatchTaskLoop) - dm.wg.Run(dm.gcSubtaskHistoryTableLoop) - dm.wg.Run(dm.cleanUpLoop) - dm.inited = true -} - -// Stop the dispatcherManager. -func (dm *Manager) Stop() { - dm.cancel() - dm.gPool.ReleaseAndWait() - dm.wg.Wait() - dm.clearRunningTasks() - dm.inited = false - close(dm.finishCh) -} - -// Inited check the manager inited. -func (dm *Manager) Inited() bool { - return dm.inited -} - -// dispatchTaskLoop dispatches the global tasks. -func (dm *Manager) dispatchTaskLoop() { - logutil.BgLogger().Info("dispatch task loop start") - ticker := time.NewTicker(checkTaskRunningInterval) - defer ticker.Stop() - for { - select { - case <-dm.ctx.Done(): - logutil.BgLogger().Info("dispatch task loop exits", zap.Error(dm.ctx.Err()), zap.Int64("interval", int64(checkTaskRunningInterval)/1000000)) - return - case <-ticker.C: - cnt := dm.getRunningTaskCnt() - if dm.checkConcurrencyOverflow(cnt) { - break - } - - // TODO: Consider getting these tasks, in addition to the task being worked on.. - tasks, err := dm.taskMgr.GetGlobalTasksInStates( - dm.ctx, - proto.TaskStatePending, - proto.TaskStateRunning, - proto.TaskStateReverting, - proto.TaskStateCancelling, - proto.TaskStateResuming, - ) - if err != nil { - logutil.BgLogger().Warn("get unfinished(pending, running, reverting, cancelling, resuming) tasks failed", zap.Error(err)) - break - } - - // There are currently no global tasks to work on. - if len(tasks) == 0 { - break - } - for _, task := range tasks { - // This global task is running, so no need to reprocess it. - if dm.isRunningTask(task.ID) { - continue - } - metrics.DistTaskGauge.WithLabelValues(task.Type.String(), metrics.DispatchingStatus).Inc() - // we check it before start dispatcher, so no need to check it again. - // see startDispatcher. - // this should not happen normally, unless user modify system table - // directly. - if getDispatcherFactory(task.Type) == nil { - logutil.BgLogger().Warn("unknown task type", zap.Int64("task-id", task.ID), - zap.Stringer("task-type", task.Type)) - dm.failTask(task, errors.New("unknown task type")) - continue - } - // the task is not in runningTasks set when: - // owner changed or task is cancelled when status is pending. - if task.State == proto.TaskStateRunning || task.State == proto.TaskStateReverting || task.State == proto.TaskStateCancelling { - metrics.UpdateMetricsForDispatchTask(task) - dm.startDispatcher(task) - cnt++ - continue - } - if dm.checkConcurrencyOverflow(cnt) { - break - } - metrics.UpdateMetricsForDispatchTask(task) - dm.startDispatcher(task) - cnt++ - } - } - } -} - -func (dm *Manager) failTask(task *proto.Task, err error) { - prevState := task.State - task.State = proto.TaskStateFailed - task.Error = err - if _, err2 := dm.taskMgr.UpdateGlobalTaskAndAddSubTasks(dm.ctx, task, nil, prevState); err2 != nil { - logutil.BgLogger().Warn("failed to update task state to failed", - zap.Int64("task-id", task.ID), zap.Error(err2)) - } -} - -func (dm *Manager) gcSubtaskHistoryTableLoop() { - historySubtaskTableGcInterval := defaultHistorySubtaskTableGcInterval - failpoint.Inject("historySubtaskTableGcInterval", func(val failpoint.Value) { - if seconds, ok := val.(int); ok { - historySubtaskTableGcInterval = time.Second * time.Duration(seconds) - } - - <-WaitTaskFinished - }) - - logutil.Logger(dm.ctx).Info("subtask table gc loop start") - ticker := time.NewTicker(historySubtaskTableGcInterval) - defer ticker.Stop() - for { - select { - case <-dm.ctx.Done(): - logutil.BgLogger().Info("subtask history table gc loop exits", zap.Error(dm.ctx.Err())) - return - case <-ticker.C: - err := dm.taskMgr.GCSubtasks(dm.ctx) - if err != nil { - logutil.BgLogger().Warn("subtask history table gc failed", zap.Error(err)) - } else { - logutil.Logger(dm.ctx).Info("subtask history table gc success") - } - } - } -} - -func (*Manager) checkConcurrencyOverflow(cnt int) bool { - if cnt >= DefaultDispatchConcurrency { - logutil.BgLogger().Info("dispatch task loop, running task cnt is more than concurrency limitation", - zap.Int("running cnt", cnt), zap.Int("concurrency", DefaultDispatchConcurrency)) - return true - } - return false -} - -func (dm *Manager) startDispatcher(task *proto.Task) { - // Using the pool with block, so it wouldn't return an error. - _ = dm.gPool.Run(func() { - dispatcherFactory := getDispatcherFactory(task.Type) - dispatcher := dispatcherFactory(dm.ctx, dm.taskMgr, dm.serverID, task) - if err := dispatcher.Init(); err != nil { - logutil.BgLogger().Error("init dispatcher failed", zap.Error(err)) - dm.failTask(task, err) - return - } - defer func() { - dispatcher.Close() - dm.delRunningTask(task.ID) - }() - dm.setRunningTask(task, dispatcher) - dispatcher.ExecuteTask() - logutil.BgLogger().Info("task finished", zap.Int64("task-id", task.ID)) - dm.finishCh <- struct{}{} - }) -} - -func (dm *Manager) cleanUpLoop() { - logutil.Logger(dm.ctx).Info("cleanUp loop start") - ticker := time.NewTicker(defaultCleanUpInterval) - defer ticker.Stop() - for { - select { - case <-dm.ctx.Done(): - logutil.BgLogger().Info("cleanUp loop exits", zap.Error(dm.ctx.Err())) - return - case <-dm.finishCh: - dm.doCleanUpRoutine() - case <-ticker.C: - dm.doCleanUpRoutine() - } - } -} - -// WaitCleanUpFinished is used to sync the test. -var WaitCleanUpFinished = make(chan struct{}) - -// doCleanUpRoutine processes clean up routine defined by each type of tasks and cleanUpMeta. -// For example: -// -// tasks with global sort should clean up tmp files stored on S3. -func (dm *Manager) doCleanUpRoutine() { - cnt := dm.CleanUpMeta() - if cnt != 0 { - logutil.BgLogger().Info("clean up nodes in framework meta since nodes shutdown", zap.Int("cnt", cnt)) - } - tasks, err := dm.taskMgr.GetGlobalTasksInStates( - dm.ctx, - proto.TaskStateFailed, - proto.TaskStateReverted, - proto.TaskStateSucceed, - ) - if err != nil { - logutil.BgLogger().Warn("cleanUp routine failed", zap.Error(err)) - return - } - if len(tasks) == 0 { - return - } - logutil.Logger(dm.ctx).Info("cleanUp routine start") - err = dm.cleanUpFinishedTasks(tasks) - if err != nil { - logutil.BgLogger().Warn("cleanUp routine failed", zap.Error(err)) - return - } - failpoint.Inject("WaitCleanUpFinished", func() { - WaitCleanUpFinished <- struct{}{} - }) - logutil.Logger(dm.ctx).Info("cleanUp routine success") -} - -// CleanUpMeta clean up old node info in dist_framework_meta table. -func (dm *Manager) CleanUpMeta() int { - // Safe to discard errors since this function can be called at regular intervals. - serverInfos, err := GenerateSchedulerNodes(dm.ctx) - if err != nil { - logutil.BgLogger().Warn("generate scheduler nodes met error") - return 0 - } - - oldNodes, err := dm.taskMgr.GetAllNodes(dm.ctx) - if err != nil { - logutil.BgLogger().Warn("get all nodes met error") - return 0 - } - - cleanNodes := make([]string, 0) - for _, nodeID := range oldNodes { - if ok := disttaskutil.MatchServerInfo(serverInfos, nodeID); !ok { - cleanNodes = append(cleanNodes, nodeID) - } - } - if len(cleanNodes) == 0 { - return 0 - } - logutil.BgLogger().Info("start to clean up dist_framework_meta") - err = dm.taskMgr.CleanUpMeta(dm.ctx, cleanNodes) - if err != nil { - logutil.BgLogger().Warn("clean up dist_framework_meta met error") - return 0 - } - return len(cleanNodes) -} - -func (dm *Manager) cleanUpFinishedTasks(tasks []*proto.Task) error { - cleanedTasks := make([]*proto.Task, 0) - var firstErr error - for _, task := range tasks { - cleanUpFactory := getDispatcherCleanUpFactory(task.Type) - if cleanUpFactory != nil { - cleanUp := cleanUpFactory() - err := cleanUp.CleanUp(dm.ctx, task) - if err != nil { - firstErr = err - break - } - cleanedTasks = append(cleanedTasks, task) - } else { - // if task doesn't register cleanUp function, mark it as cleaned. - cleanedTasks = append(cleanedTasks, task) - } - } - if firstErr != nil { - logutil.BgLogger().Warn("cleanUp routine failed", zap.Error(errors.Trace(firstErr))) - } - - return dm.taskMgr.TransferTasks2History(dm.ctx, cleanedTasks) -} - -// MockDispatcher mock one dispatcher for one task, only used for tests. -func (dm *Manager) MockDispatcher(task *proto.Task) *BaseDispatcher { - return NewBaseDispatcher(dm.ctx, dm.taskMgr, dm.serverID, task) -} diff --git a/pkg/disttask/framework/dispatcher/dispatcher_manager_test.go b/pkg/disttask/framework/dispatcher/dispatcher_manager_test.go deleted file mode 100644 index 335b00f1dd4ad..0000000000000 --- a/pkg/disttask/framework/dispatcher/dispatcher_manager_test.go +++ /dev/null @@ -1,132 +0,0 @@ -// Copyright 2023 PingCAP, 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. - -package dispatcher_test - -import ( - "context" - "testing" - "time" - - "github.com/ngaut/pools" - "github.com/pingcap/tidb/pkg/disttask/framework/dispatcher" - "github.com/pingcap/tidb/pkg/disttask/framework/mock" - "github.com/pingcap/tidb/pkg/disttask/framework/proto" - "github.com/pingcap/tidb/pkg/testkit" - "github.com/stretchr/testify/require" - "github.com/tikv/client-go/v2/util" - "go.uber.org/mock/gomock" -) - -func TestCleanUpRoutine(t *testing.T) { - store := testkit.CreateMockStore(t) - gtk := testkit.NewTestKit(t, store) - pool := pools.NewResourcePool(func() (pools.Resource, error) { - return gtk.Session(), nil - }, 1, 1, time.Second) - defer pool.Close() - ctrl := gomock.NewController(t) - defer ctrl.Finish() - ctx := context.Background() - ctx = util.WithInternalSourceType(ctx, "dispatcher_manager") - - dsp, mgr := MockDispatcherManager(t, pool) - mockCleanupRountine := mock.NewMockCleanUpRoutine(ctrl) - mockCleanupRountine.EXPECT().CleanUp(gomock.Any(), gomock.Any()).Return(nil).AnyTimes() - dispatcher.RegisterDispatcherFactory(proto.TaskTypeExample, - func(ctx context.Context, taskMgr dispatcher.TaskManager, serverID string, task *proto.Task) dispatcher.Dispatcher { - mockDispatcher := dsp.MockDispatcher(task) - mockDispatcher.Extension = &numberExampleDispatcherExt{} - return mockDispatcher - }) - dispatcher.RegisterDispatcherCleanUpFactory(proto.TaskTypeExample, - func() dispatcher.CleanUpRoutine { - return mockCleanupRountine - }) - dsp.Start() - defer dsp.Stop() - require.NoError(t, mgr.StartManager(ctx, ":4000", "background")) - taskID, err := mgr.AddNewGlobalTask(ctx, "test", proto.TaskTypeExample, 1, nil) - require.NoError(t, err) - - checkTaskRunningCnt := func() []*proto.Task { - var tasks []*proto.Task - require.Eventually(t, func() bool { - var err error - tasks, err = mgr.GetGlobalTasksInStates(ctx, proto.TaskStateRunning) - require.NoError(t, err) - return len(tasks) == 1 - }, time.Second, 50*time.Millisecond) - return tasks - } - - checkSubtaskCnt := func(tasks []*proto.Task, taskID int64) { - require.Eventually(t, func() bool { - cnt, err := mgr.GetSubtaskInStatesCnt(ctx, taskID, proto.TaskStatePending) - require.NoError(t, err) - return int64(subtaskCnt) == cnt - }, time.Second, 50*time.Millisecond) - } - - tasks := checkTaskRunningCnt() - checkSubtaskCnt(tasks, taskID) - for i := 1; i <= subtaskCnt; i++ { - err = mgr.UpdateSubtaskStateAndError(ctx, ":4000", int64(i), proto.TaskStateSucceed, nil) - require.NoError(t, err) - } - dsp.DoCleanUpRoutine() - require.Eventually(t, func() bool { - tasks, err := mgr.GetGlobalTasksFromHistoryInStates(ctx, proto.TaskStateSucceed) - require.NoError(t, err) - return len(tasks) != 0 - }, time.Second*10, time.Millisecond*300) -} - -func TestCleanUpMeta(t *testing.T) { - store := testkit.CreateMockStore(t) - gtk := testkit.NewTestKit(t, store) - pool := pools.NewResourcePool(func() (pools.Resource, error) { - return gtk.Session(), nil - }, 1, 1, time.Second) - defer pool.Close() - ctrl := gomock.NewController(t) - defer ctrl.Finish() - mockTaskMgr := mock.NewMockTaskManager(ctrl) - mockCleanupRountine := mock.NewMockCleanUpRoutine(ctrl) - dspMgr := MockDispatcherManagerWithMockTaskMgr(t, pool, mockTaskMgr) - dispatcher.RegisterDispatcherFactory(proto.TaskTypeExample, - func(ctx context.Context, taskMgr dispatcher.TaskManager, serverID string, task *proto.Task) dispatcher.Dispatcher { - mockDispatcher := dspMgr.MockDispatcher(task) - mockDispatcher.Extension = &numberExampleDispatcherExt{} - return mockDispatcher - }) - dispatcher.RegisterDispatcherCleanUpFactory(proto.TaskTypeExample, - func() dispatcher.CleanUpRoutine { - return mockCleanupRountine - }) - - mockTaskMgr.EXPECT().GetAllNodes(gomock.Any()).Return([]string{":4000", ":4001"}, nil) - mockTaskMgr.EXPECT().CleanUpMeta(gomock.Any(), gomock.Any()).Return(nil) - mockCleanupRountine.EXPECT().CleanUp(gomock.Any(), gomock.Any()).Return(nil).AnyTimes() - require.Equal(t, 1, dspMgr.CleanUpMeta()) - - mockTaskMgr.EXPECT().GetAllNodes(gomock.Any()).Return([]string{":4000"}, nil) - mockCleanupRountine.EXPECT().CleanUp(gomock.Any(), gomock.Any()).Return(nil).AnyTimes() - require.Equal(t, 0, dspMgr.CleanUpMeta()) - - mockTaskMgr.EXPECT().GetAllNodes(gomock.Any()).Return([]string{":4000", ":4001", ":4003"}, nil) - mockTaskMgr.EXPECT().CleanUpMeta(gomock.Any(), gomock.Any()).Return(nil) - mockCleanupRountine.EXPECT().CleanUp(gomock.Any(), gomock.Any()).Return(nil).AnyTimes() - require.Equal(t, 2, dspMgr.CleanUpMeta()) -} diff --git a/pkg/disttask/framework/dispatcher/dispatcher_test.go b/pkg/disttask/framework/dispatcher/dispatcher_test.go deleted file mode 100644 index 2b82142489e91..0000000000000 --- a/pkg/disttask/framework/dispatcher/dispatcher_test.go +++ /dev/null @@ -1,515 +0,0 @@ -// Copyright 2023 PingCAP, 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. - -package dispatcher_test - -import ( - "context" - "fmt" - "strings" - "testing" - "time" - - "github.com/ngaut/pools" - "github.com/pingcap/errors" - "github.com/pingcap/failpoint" - "github.com/pingcap/tidb/pkg/disttask/framework/dispatcher" - "github.com/pingcap/tidb/pkg/disttask/framework/mock" - "github.com/pingcap/tidb/pkg/disttask/framework/proto" - "github.com/pingcap/tidb/pkg/disttask/framework/storage" - "github.com/pingcap/tidb/pkg/domain/infosync" - "github.com/pingcap/tidb/pkg/kv" - "github.com/pingcap/tidb/pkg/testkit" - "github.com/pingcap/tidb/pkg/util/logutil" - "github.com/stretchr/testify/require" - "github.com/tikv/client-go/v2/util" - "go.uber.org/mock/gomock" -) - -var ( - _ dispatcher.Extension = (*testDispatcherExt)(nil) - _ dispatcher.Extension = (*numberExampleDispatcherExt)(nil) -) - -const ( - subtaskCnt = 3 -) - -type testDispatcherExt struct{} - -func (*testDispatcherExt) OnTick(_ context.Context, _ *proto.Task) { -} - -func (*testDispatcherExt) OnNextSubtasksBatch(_ context.Context, _ dispatcher.TaskHandle, _ *proto.Task, _ []*infosync.ServerInfo, _ proto.Step) (metas [][]byte, err error) { - return nil, nil -} - -func (*testDispatcherExt) OnErrStage(_ context.Context, _ dispatcher.TaskHandle, _ *proto.Task, _ []error) (meta []byte, err error) { - return nil, nil -} - -var mockedAllServerInfos = []*infosync.ServerInfo{} - -func (*testDispatcherExt) GetEligibleInstances(_ context.Context, _ *proto.Task) ([]*infosync.ServerInfo, bool, error) { - return mockedAllServerInfos, true, nil -} - -func (*testDispatcherExt) IsRetryableErr(error) bool { - return true -} - -func (*testDispatcherExt) GetNextStep(*proto.Task) proto.Step { - return proto.StepDone -} - -type numberExampleDispatcherExt struct{} - -func (*numberExampleDispatcherExt) OnTick(_ context.Context, _ *proto.Task) { -} - -func (n *numberExampleDispatcherExt) OnNextSubtasksBatch(_ context.Context, _ dispatcher.TaskHandle, task *proto.Task, _ []*infosync.ServerInfo, _ proto.Step) (metas [][]byte, err error) { - switch task.Step { - case proto.StepInit: - for i := 0; i < subtaskCnt; i++ { - metas = append(metas, []byte{'1'}) - } - logutil.BgLogger().Info("progress step init") - case proto.StepOne: - logutil.BgLogger().Info("progress step one") - return nil, nil - default: - return nil, errors.New("unknown step") - } - return metas, nil -} - -func (n *numberExampleDispatcherExt) OnErrStage(_ context.Context, _ dispatcher.TaskHandle, _ *proto.Task, _ []error) (meta []byte, err error) { - // Don't handle not. - return nil, nil -} - -func (*numberExampleDispatcherExt) GetEligibleInstances(ctx context.Context, _ *proto.Task) ([]*infosync.ServerInfo, bool, error) { - serverInfo, err := dispatcher.GenerateSchedulerNodes(ctx) - return serverInfo, true, err -} - -func (*numberExampleDispatcherExt) IsRetryableErr(error) bool { - return true -} - -func (*numberExampleDispatcherExt) GetNextStep(task *proto.Task) proto.Step { - switch task.Step { - case proto.StepInit: - return proto.StepOne - default: - return proto.StepDone - } -} - -func MockDispatcherManager(t *testing.T, pool *pools.ResourcePool) (*dispatcher.Manager, *storage.TaskManager) { - ctx := context.WithValue(context.Background(), "etcd", true) - mgr := storage.NewTaskManager(pool) - storage.SetTaskManager(mgr) - dsp, err := dispatcher.NewManager(util.WithInternalSourceType(ctx, "dispatcher"), mgr, "host:port") - require.NoError(t, err) - dispatcher.RegisterDispatcherFactory(proto.TaskTypeExample, - func(ctx context.Context, taskMgr dispatcher.TaskManager, serverID string, task *proto.Task) dispatcher.Dispatcher { - mockDispatcher := dsp.MockDispatcher(task) - mockDispatcher.Extension = &testDispatcherExt{} - return mockDispatcher - }) - return dsp, mgr -} - -func MockDispatcherManagerWithMockTaskMgr(t *testing.T, pool *pools.ResourcePool, taskMgr *mock.MockTaskManager) *dispatcher.Manager { - ctx := context.WithValue(context.Background(), "etcd", true) - dsp, err := dispatcher.NewManager(util.WithInternalSourceType(ctx, "dispatcher"), taskMgr, "host:port") - require.NoError(t, err) - dispatcher.RegisterDispatcherFactory(proto.TaskTypeExample, - func(ctx context.Context, taskMgr dispatcher.TaskManager, serverID string, task *proto.Task) dispatcher.Dispatcher { - mockDispatcher := dsp.MockDispatcher(task) - mockDispatcher.Extension = &testDispatcherExt{} - return mockDispatcher - }) - return dsp -} - -func deleteTasks(t *testing.T, store kv.Storage, taskID int64) { - tk := testkit.NewTestKit(t, store) - tk.MustExec(fmt.Sprintf("delete from mysql.tidb_global_task where id = %d", taskID)) -} - -func TestGetInstance(t *testing.T) { - ctx := context.Background() - ctx = util.WithInternalSourceType(ctx, "dispatcher") - - store := testkit.CreateMockStore(t) - gtk := testkit.NewTestKit(t, store) - pool := pools.NewResourcePool(func() (pools.Resource, error) { - return gtk.Session(), nil - }, 1, 1, time.Second) - defer pool.Close() - require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/disttask/framework/dispatcher/mockSchedulerNodes", "return()")) - dspManager, mgr := MockDispatcherManager(t, pool) - // test no server - task := &proto.Task{ID: 1, Type: proto.TaskTypeExample} - dsp := dspManager.MockDispatcher(task) - dsp.Extension = &testDispatcherExt{} - instanceIDs, err := dsp.GetAllSchedulerIDs(ctx, task) - require.Lenf(t, instanceIDs, 0, "GetAllSchedulerIDs when there's no subtask") - require.NoError(t, err) - - // test 2 servers - // server ids: uuid0, uuid1 - // subtask instance ids: nil - uuids := []string{"ddl_id_1", "ddl_id_2"} - serverIDs := []string{"10.123.124.10:32457", "[ABCD:EF01:2345:6789:ABCD:EF01:2345:6789]:65535"} - - dispatcher.MockServerInfo = []*infosync.ServerInfo{ - { - ID: uuids[0], - IP: "10.123.124.10", - Port: 32457, - }, - { - ID: uuids[1], - IP: "ABCD:EF01:2345:6789:ABCD:EF01:2345:6789", - Port: 65535, - }, - } - instanceIDs, err = dsp.GetAllSchedulerIDs(ctx, task) - require.Lenf(t, instanceIDs, 0, "GetAllSchedulerIDs") - require.NoError(t, err) - - // server ids: uuid0, uuid1 - // subtask instance ids: uuid1 - subtask := &proto.Subtask{ - Type: proto.TaskTypeExample, - TaskID: task.ID, - SchedulerID: serverIDs[1], - } - err = mgr.AddNewSubTask(ctx, task.ID, proto.StepInit, subtask.SchedulerID, nil, subtask.Type, true) - require.NoError(t, err) - instanceIDs, err = dsp.GetAllSchedulerIDs(ctx, task) - require.NoError(t, err) - require.Equal(t, []string{serverIDs[1]}, instanceIDs) - // server ids: uuid0, uuid1 - // subtask instance ids: uuid0, uuid1 - subtask = &proto.Subtask{ - Type: proto.TaskTypeExample, - TaskID: task.ID, - SchedulerID: serverIDs[0], - } - err = mgr.AddNewSubTask(ctx, task.ID, proto.StepInit, subtask.SchedulerID, nil, subtask.Type, true) - require.NoError(t, err) - instanceIDs, err = dsp.GetAllSchedulerIDs(ctx, task) - require.NoError(t, err) - require.Len(t, instanceIDs, len(serverIDs)) - require.ElementsMatch(t, instanceIDs, serverIDs) - require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/disttask/framework/dispatcher/mockSchedulerNodes")) -} - -func TestTaskFailInManager(t *testing.T) { - store := testkit.CreateMockStore(t) - gtk := testkit.NewTestKit(t, store) - pool := pools.NewResourcePool(func() (pools.Resource, error) { - return gtk.Session(), nil - }, 1, 1, time.Second) - defer pool.Close() - ctrl := gomock.NewController(t) - defer ctrl.Finish() - ctx := context.Background() - ctx = util.WithInternalSourceType(ctx, "handle_test") - - mockDispatcher := mock.NewMockDispatcher(ctrl) - mockDispatcher.EXPECT().Init().Return(errors.New("mock dispatcher init error")) - - dspManager, mgr := MockDispatcherManager(t, pool) - dispatcher.RegisterDispatcherFactory(proto.TaskTypeExample, - func(ctx context.Context, taskMgr dispatcher.TaskManager, serverID string, task *proto.Task) dispatcher.Dispatcher { - return mockDispatcher - }) - dspManager.Start() - defer dspManager.Stop() - - // unknown task type - taskID, err := mgr.AddNewGlobalTask(ctx, "test", "test-type", 1, nil) - require.NoError(t, err) - require.Eventually(t, func() bool { - task, err := mgr.GetGlobalTaskByID(ctx, taskID) - require.NoError(t, err) - return task.State == proto.TaskStateFailed && - strings.Contains(task.Error.Error(), "unknown task type") - }, time.Second*10, time.Millisecond*300) - - // dispatcher init error - taskID, err = mgr.AddNewGlobalTask(ctx, "test2", proto.TaskTypeExample, 1, nil) - require.NoError(t, err) - require.Eventually(t, func() bool { - task, err := mgr.GetGlobalTaskByID(ctx, taskID) - require.NoError(t, err) - return task.State == proto.TaskStateFailed && - strings.Contains(task.Error.Error(), "mock dispatcher init error") - }, time.Second*10, time.Millisecond*300) -} - -func checkDispatch(t *testing.T, taskCnt int, isSucc, isCancel, isSubtaskCancel, isPauseAndResume bool) { - require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/domain/MockDisableDistTask", "return(true)")) - defer func() { - require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/domain/MockDisableDistTask")) - }() - // test DispatchTaskLoop - // test parallelism control - var originalConcurrency int - if taskCnt == 1 { - originalConcurrency = dispatcher.DefaultDispatchConcurrency - dispatcher.DefaultDispatchConcurrency = 1 - } - - store := testkit.CreateMockStore(t) - gtk := testkit.NewTestKit(t, store) - pool := pools.NewResourcePool(func() (pools.Resource, error) { - return gtk.Session(), nil - }, 1, 1, time.Second) - defer pool.Close() - - ctx := context.Background() - ctx = util.WithInternalSourceType(ctx, "dispatcher") - - dsp, mgr := MockDispatcherManager(t, pool) - dispatcher.RegisterDispatcherFactory(proto.TaskTypeExample, - func(ctx context.Context, taskMgr dispatcher.TaskManager, serverID string, task *proto.Task) dispatcher.Dispatcher { - mockDispatcher := dsp.MockDispatcher(task) - mockDispatcher.Extension = &numberExampleDispatcherExt{} - return mockDispatcher - }) - dsp.Start() - defer func() { - dsp.Stop() - // make data race happy - if taskCnt == 1 { - dispatcher.DefaultDispatchConcurrency = originalConcurrency - } - }() - - require.NoError(t, mgr.StartManager(ctx, ":4000", "background")) - - // 3s - cnt := 60 - checkGetRunningTaskCnt := func(expected int) { - require.Eventually(t, func() bool { - return dsp.GetRunningTaskCnt() == expected - }, time.Second, 50*time.Millisecond) - } - - checkTaskRunningCnt := func() []*proto.Task { - var tasks []*proto.Task - require.Eventually(t, func() bool { - var err error - tasks, err = mgr.GetGlobalTasksInStates(ctx, proto.TaskStateRunning) - require.NoError(t, err) - return len(tasks) == taskCnt - }, time.Second, 50*time.Millisecond) - return tasks - } - - checkSubtaskCnt := func(tasks []*proto.Task, taskIDs []int64) { - for i, taskID := range taskIDs { - require.Equal(t, int64(i+1), tasks[i].ID) - require.Eventually(t, func() bool { - cnt, err := mgr.GetSubtaskInStatesCnt(ctx, taskID, proto.TaskStatePending) - require.NoError(t, err) - return int64(subtaskCnt) == cnt - }, time.Second, 50*time.Millisecond) - } - } - - // Mock add tasks. - taskIDs := make([]int64, 0, taskCnt) - for i := 0; i < taskCnt; i++ { - taskID, err := mgr.AddNewGlobalTask(ctx, fmt.Sprintf("%d", i), proto.TaskTypeExample, 0, nil) - require.NoError(t, err) - taskIDs = append(taskIDs, taskID) - } - // test OnNextSubtasksBatch. - checkGetRunningTaskCnt(taskCnt) - tasks := checkTaskRunningCnt() - checkSubtaskCnt(tasks, taskIDs) - // test parallelism control - if taskCnt == 1 { - taskID, err := mgr.AddNewGlobalTask(ctx, fmt.Sprintf("%d", taskCnt), proto.TaskTypeExample, 0, nil) - require.NoError(t, err) - checkGetRunningTaskCnt(taskCnt) - // Clean the task. - deleteTasks(t, store, taskID) - dsp.DelRunningTask(taskID) - } - - // test DetectTaskLoop - checkGetTaskState := func(expectedState proto.TaskState) { - i := 0 - for ; i < cnt; i++ { - tasks, err := mgr.GetGlobalTasksInStates(ctx, expectedState) - require.NoError(t, err) - if len(tasks) == taskCnt { - break - } - historyTasks, err := mgr.GetGlobalTasksFromHistoryInStates(ctx, expectedState) - require.NoError(t, err) - if len(tasks)+len(historyTasks) == taskCnt { - break - } - time.Sleep(time.Millisecond * 50) - } - require.Less(t, i, cnt) - } - // Test all subtasks are successful. - var err error - if isSucc { - // Mock subtasks succeed. - for i := 1; i <= subtaskCnt*taskCnt; i++ { - err = mgr.UpdateSubtaskStateAndError(ctx, ":4000", int64(i), proto.TaskStateSucceed, nil) - require.NoError(t, err) - } - checkGetTaskState(proto.TaskStateSucceed) - require.Len(t, tasks, taskCnt) - - checkGetRunningTaskCnt(0) - return - } - - if isCancel { - for i := 1; i <= taskCnt; i++ { - err = mgr.CancelGlobalTask(ctx, int64(i)) - require.NoError(t, err) - } - } else if isPauseAndResume { - for i := 0; i < taskCnt; i++ { - found, err := mgr.PauseTask(ctx, fmt.Sprintf("%d", i)) - require.Equal(t, true, found) - require.NoError(t, err) - } - for i := 1; i <= subtaskCnt*taskCnt; i++ { - err = mgr.UpdateSubtaskStateAndError(ctx, ":4000", int64(i), proto.TaskStatePaused, nil) - require.NoError(t, err) - } - checkGetTaskState(proto.TaskStatePaused) - for i := 0; i < taskCnt; i++ { - found, err := mgr.ResumeTask(ctx, fmt.Sprintf("%d", i)) - require.Equal(t, true, found) - require.NoError(t, err) - } - - // Mock subtasks succeed. - for i := 1; i <= subtaskCnt*taskCnt; i++ { - err = mgr.UpdateSubtaskStateAndError(ctx, ":4000", int64(i), proto.TaskStateSucceed, nil) - require.NoError(t, err) - } - checkGetTaskState(proto.TaskStateSucceed) - return - } else { - // Test each task has a subtask failed. - require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/disttask/framework/storage/MockUpdateTaskErr", "1*return(true)")) - defer func() { - require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/disttask/framework/storage/MockUpdateTaskErr")) - }() - - if isSubtaskCancel { - // Mock a subtask canceled - for i := 1; i <= subtaskCnt*taskCnt; i += subtaskCnt { - err = mgr.UpdateSubtaskStateAndError(ctx, ":4000", int64(i), proto.TaskStateCanceled, nil) - require.NoError(t, err) - } - } else { - // Mock a subtask fails. - for i := 1; i <= subtaskCnt*taskCnt; i += subtaskCnt { - err = mgr.UpdateSubtaskStateAndError(ctx, ":4000", int64(i), proto.TaskStateFailed, nil) - require.NoError(t, err) - } - } - } - - checkGetTaskState(proto.TaskStateReverting) - require.Len(t, tasks, taskCnt) - // Mock all subtask reverted. - start := subtaskCnt * taskCnt - for i := start; i <= start+subtaskCnt*taskCnt; i++ { - err = mgr.UpdateSubtaskStateAndError(ctx, ":4000", int64(i), proto.TaskStateReverted, nil) - require.NoError(t, err) - } - checkGetTaskState(proto.TaskStateReverted) - require.Len(t, tasks, taskCnt) -} - -func TestSimple(t *testing.T) { - checkDispatch(t, 1, true, false, false, false) -} - -func TestSimpleErrStage(t *testing.T) { - checkDispatch(t, 1, false, false, false, false) -} - -func TestSimpleCancel(t *testing.T) { - checkDispatch(t, 1, false, true, false, false) -} - -func TestSimpleSubtaskCancel(t *testing.T) { - checkDispatch(t, 1, false, false, true, false) -} - -func TestParallel(t *testing.T) { - checkDispatch(t, 3, true, false, false, false) -} - -func TestParallelErrStage(t *testing.T) { - checkDispatch(t, 3, false, false, false, false) -} - -func TestParallelCancel(t *testing.T) { - checkDispatch(t, 3, false, true, false, false) -} - -func TestParallelSubtaskCancel(t *testing.T) { - checkDispatch(t, 3, false, false, true, false) -} - -func TestPause(t *testing.T) { - checkDispatch(t, 1, false, false, false, true) -} - -func TestParallelPause(t *testing.T) { - checkDispatch(t, 3, false, false, false, true) -} - -func TestVerifyTaskStateTransform(t *testing.T) { - testCases := []struct { - oldState proto.TaskState - newState proto.TaskState - expect bool - }{ - {proto.TaskStateRunning, proto.TaskStateRunning, true}, - {proto.TaskStatePending, proto.TaskStateRunning, true}, - {proto.TaskStatePending, proto.TaskStateReverting, false}, - {proto.TaskStateRunning, proto.TaskStateReverting, true}, - {proto.TaskStateReverting, proto.TaskStateReverted, true}, - {proto.TaskStateReverting, proto.TaskStateSucceed, false}, - {proto.TaskStateRunning, proto.TaskStatePausing, true}, - {proto.TaskStateRunning, proto.TaskStateResuming, false}, - {proto.TaskStateCancelling, proto.TaskStateRunning, false}, - {proto.TaskStateCanceled, proto.TaskStateRunning, false}, - } - for _, tc := range testCases { - require.Equal(t, tc.expect, dispatcher.VerifyTaskStateTransform(tc.oldState, tc.newState)) - } -} diff --git a/pkg/disttask/framework/dispatcher/interface.go b/pkg/disttask/framework/dispatcher/interface.go deleted file mode 100644 index 6fd5615ea47e6..0000000000000 --- a/pkg/disttask/framework/dispatcher/interface.go +++ /dev/null @@ -1,159 +0,0 @@ -// Copyright 2023 PingCAP, 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. - -package dispatcher - -import ( - "context" - - "github.com/pingcap/tidb/pkg/disttask/framework/proto" - "github.com/pingcap/tidb/pkg/domain/infosync" - "github.com/pingcap/tidb/pkg/sessionctx" - "github.com/pingcap/tidb/pkg/util/syncutil" -) - -// TaskManager defines the interface to access task table. -type TaskManager interface { - GetGlobalTasksInStates(ctx context.Context, states ...interface{}) (task []*proto.Task, err error) - GetGlobalTaskByID(ctx context.Context, taskID int64) (task *proto.Task, err error) - UpdateGlobalTaskAndAddSubTasks(ctx context.Context, gTask *proto.Task, subtasks []*proto.Subtask, prevState proto.TaskState) (bool, error) - GCSubtasks(ctx context.Context) error - GetAllNodes(ctx context.Context) ([]string, error) - CleanUpMeta(ctx context.Context, nodes []string) error - TransferTasks2History(ctx context.Context, tasks []*proto.Task) error - CancelGlobalTask(ctx context.Context, taskID int64) error - PauseTask(ctx context.Context, taskKey string) (bool, error) - GetSubtaskInStatesCnt(ctx context.Context, taskID int64, states ...interface{}) (int64, error) - ResumeSubtasks(ctx context.Context, taskID int64) error - CollectSubTaskError(ctx context.Context, taskID int64) ([]error, error) - TransferSubTasks2History(ctx context.Context, taskID int64) error - UpdateFailedSchedulerIDs(ctx context.Context, taskID int64, replaceNodes map[string]string) error - GetNodesByRole(ctx context.Context, role string) (map[string]bool, error) - GetSchedulerIDsByTaskID(ctx context.Context, taskID int64) ([]string, error) - GetSucceedSubtasksByStep(ctx context.Context, taskID int64, step proto.Step) ([]*proto.Subtask, error) - GetSchedulerIDsByTaskIDAndStep(ctx context.Context, taskID int64, step proto.Step) ([]string, error) - - WithNewSession(fn func(se sessionctx.Context) error) error - WithNewTxn(ctx context.Context, fn func(se sessionctx.Context) error) error -} - -// Extension is used to control the process operations for each task. -// it's used to extend functions of BaseDispatcher. -// as golang doesn't support inheritance, we embed this interface in Dispatcher -// to simulate abstract method as in other OO languages. -type Extension interface { - // OnTick is used to handle the ticker event, if business impl need to do some periodical work, you can - // do it here, but don't do too much work here, because the ticker interval is small, and it will block - // the event is generated every checkTaskRunningInterval, and only when the task NOT FINISHED and NO ERROR. - OnTick(ctx context.Context, task *proto.Task) - - // OnNextSubtasksBatch is used to generate batch of subtasks for next stage - // NOTE: don't change gTask.State inside, framework will manage it. - // it's called when: - // 1. task is pending and entering it's first step. - // 2. subtasks dispatched has all finished with no error. - // when next step is StepDone, it should return nil, nil. - OnNextSubtasksBatch(ctx context.Context, h TaskHandle, task *proto.Task, serverInfo []*infosync.ServerInfo, step proto.Step) (subtaskMetas [][]byte, err error) - - // OnErrStage is called when: - // 1. subtask is finished with error. - // 2. task is cancelled after we have dispatched some subtasks. - OnErrStage(ctx context.Context, h TaskHandle, task *proto.Task, receiveErrs []error) (subtaskMeta []byte, err error) - - // GetEligibleInstances is used to get the eligible instances for the task. - // on certain condition we may want to use some instances to do the task, such as instances with more disk. - // The bool return value indicates whether filter instances by role. - GetEligibleInstances(ctx context.Context, task *proto.Task) ([]*infosync.ServerInfo, bool, error) - - // IsRetryableErr is used to check whether the error occurred in dispatcher is retryable. - IsRetryableErr(err error) bool - - // GetNextStep is used to get the next step for the task. - // if task runs successfully, it should go from StepInit to business steps, - // then to StepDone, then dispatcher will mark it as finished. - GetNextStep(task *proto.Task) proto.Step -} - -// dispatcherFactoryFn is used to create a dispatcher. -type dispatcherFactoryFn func(ctx context.Context, taskMgr TaskManager, serverID string, task *proto.Task) Dispatcher - -var dispatcherFactoryMap = struct { - syncutil.RWMutex - m map[proto.TaskType]dispatcherFactoryFn -}{ - m: make(map[proto.TaskType]dispatcherFactoryFn), -} - -// RegisterDispatcherFactory is used to register the dispatcher factory. -// normally dispatcher ctor should be registered before the server start. -// and should be called in a single routine, such as in init(). -// after the server start, there's should be no write to the map. -// but for index backfill, the register call stack is so deep, not sure -// if it's safe to do so, so we use a lock here. -func RegisterDispatcherFactory(taskType proto.TaskType, ctor dispatcherFactoryFn) { - dispatcherFactoryMap.Lock() - defer dispatcherFactoryMap.Unlock() - dispatcherFactoryMap.m[taskType] = ctor -} - -// getDispatcherFactory is used to get the dispatcher factory. -func getDispatcherFactory(taskType proto.TaskType) dispatcherFactoryFn { - dispatcherFactoryMap.RLock() - defer dispatcherFactoryMap.RUnlock() - return dispatcherFactoryMap.m[taskType] -} - -// ClearDispatcherFactory is only used in test. -func ClearDispatcherFactory() { - dispatcherFactoryMap.Lock() - defer dispatcherFactoryMap.Unlock() - dispatcherFactoryMap.m = make(map[proto.TaskType]dispatcherFactoryFn) -} - -// CleanUpRoutine is used for the framework to do some clean up work if the task is finished. -type CleanUpRoutine interface { - // CleanUp do the clean up work. - CleanUp(ctx context.Context, task *proto.Task) error -} -type cleanUpFactoryFn func() CleanUpRoutine - -var cleanUpFactoryMap = struct { - syncutil.RWMutex - m map[proto.TaskType]cleanUpFactoryFn -}{ - m: make(map[proto.TaskType]cleanUpFactoryFn), -} - -// RegisterDispatcherCleanUpFactory is used to register the dispatcher clean up factory. -// normally dispatcher cleanup is used in the dispatcher_manager gcTaskLoop to do clean up -// works when tasks are finished. -func RegisterDispatcherCleanUpFactory(taskType proto.TaskType, ctor cleanUpFactoryFn) { - cleanUpFactoryMap.Lock() - defer cleanUpFactoryMap.Unlock() - cleanUpFactoryMap.m[taskType] = ctor -} - -// getDispatcherCleanUpFactory is used to get the dispatcher factory. -func getDispatcherCleanUpFactory(taskType proto.TaskType) cleanUpFactoryFn { - cleanUpFactoryMap.RLock() - defer cleanUpFactoryMap.RUnlock() - return cleanUpFactoryMap.m[taskType] -} - -// ClearDispatcherCleanUpFactory is only used in test. -func ClearDispatcherCleanUpFactory() { - cleanUpFactoryMap.Lock() - defer cleanUpFactoryMap.Unlock() - cleanUpFactoryMap.m = make(map[proto.TaskType]cleanUpFactoryFn) -} diff --git a/pkg/disttask/framework/framework_dynamic_dispatch_test.go b/pkg/disttask/framework/framework_dynamic_dispatch_test.go deleted file mode 100644 index 2f7d799ccdba6..0000000000000 --- a/pkg/disttask/framework/framework_dynamic_dispatch_test.go +++ /dev/null @@ -1,118 +0,0 @@ -// Copyright 2023 PingCAP, 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. - -package framework_test - -import ( - "context" - "fmt" - "sync" - "testing" - - "github.com/pingcap/failpoint" - "github.com/pingcap/tidb/pkg/disttask/framework/dispatcher" - "github.com/pingcap/tidb/pkg/disttask/framework/proto" - "github.com/pingcap/tidb/pkg/domain/infosync" - "github.com/pingcap/tidb/pkg/testkit" - "github.com/stretchr/testify/require" - "github.com/tikv/client-go/v2/util" - "go.uber.org/mock/gomock" -) - -type testDynamicDispatcherExt struct { - cnt int -} - -var _ dispatcher.Extension = (*testDynamicDispatcherExt)(nil) - -func (*testDynamicDispatcherExt) OnTick(_ context.Context, _ *proto.Task) {} - -func (dsp *testDynamicDispatcherExt) OnNextSubtasksBatch(_ context.Context, _ dispatcher.TaskHandle, gTask *proto.Task, _ []*infosync.ServerInfo, _ proto.Step) (metas [][]byte, err error) { - // step1 - if gTask.Step == proto.StepInit { - dsp.cnt++ - return [][]byte{ - []byte(fmt.Sprintf("task%d", dsp.cnt)), - []byte(fmt.Sprintf("task%d", dsp.cnt)), - }, nil - } - - // step2 - if gTask.Step == proto.StepOne { - dsp.cnt++ - return [][]byte{ - []byte(fmt.Sprintf("task%d", dsp.cnt)), - }, nil - } - return nil, nil -} - -func (*testDynamicDispatcherExt) OnErrStage(_ context.Context, _ dispatcher.TaskHandle, _ *proto.Task, _ []error) (meta []byte, err error) { - return nil, nil -} - -func (dsp *testDynamicDispatcherExt) GetNextStep(task *proto.Task) proto.Step { - switch task.Step { - case proto.StepInit: - return proto.StepOne - case proto.StepOne: - return proto.StepTwo - default: - return proto.StepDone - } -} - -func (*testDynamicDispatcherExt) GetEligibleInstances(_ context.Context, _ *proto.Task) ([]*infosync.ServerInfo, bool, error) { - return generateSchedulerNodes4Test() -} - -func (*testDynamicDispatcherExt) IsRetryableErr(error) bool { - return true -} - -func TestFrameworkDynamicBasic(t *testing.T) { - var m sync.Map - ctrl := gomock.NewController(t) - defer ctrl.Finish() - ctx := context.Background() - ctx = util.WithInternalSourceType(ctx, "dispatcher") - - RegisterTaskMeta(t, ctrl, &m, &testDynamicDispatcherExt{}) - distContext := testkit.NewDistExecutionContext(t, 3) - DispatchTaskAndCheckSuccess(ctx, "key1", t, &m) - distContext.Close() -} - -func TestFrameworkDynamicHA(t *testing.T) { - var m sync.Map - ctrl := gomock.NewController(t) - defer ctrl.Finish() - ctx := context.Background() - ctx = util.WithInternalSourceType(ctx, "dispatcher") - - RegisterTaskMeta(t, ctrl, &m, &testDynamicDispatcherExt{}) - distContext := testkit.NewDistExecutionContext(t, 3) - require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/disttask/framework/dispatcher/mockDynamicDispatchErr", "5*return()")) - DispatchTaskAndCheckSuccess(ctx, "key1", t, &m) - require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/disttask/framework/dispatcher/mockDynamicDispatchErr")) - - require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/disttask/framework/dispatcher/mockDynamicDispatchErr1", "5*return()")) - DispatchTaskAndCheckSuccess(ctx, "key2", t, &m) - require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/disttask/framework/dispatcher/mockDynamicDispatchErr1")) - - require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/disttask/framework/dispatcher/mockDynamicDispatchErr2", "5*return()")) - DispatchTaskAndCheckSuccess(ctx, "key3", t, &m) - require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/disttask/framework/dispatcher/mockDynamicDispatchErr2")) - distContext.Close() -} diff --git a/pkg/disttask/framework/framework_err_handling_test.go b/pkg/disttask/framework/framework_err_handling_test.go index 817903a768e32..fbd51ca1bf931 100644 --- a/pkg/disttask/framework/framework_err_handling_test.go +++ b/pkg/disttask/framework/framework_err_handling_test.go @@ -15,144 +15,27 @@ package framework_test import ( - "context" - "errors" - "sync" "testing" - "github.com/pingcap/tidb/pkg/disttask/framework/dispatcher" "github.com/pingcap/tidb/pkg/disttask/framework/proto" - "github.com/pingcap/tidb/pkg/domain/infosync" - "github.com/pingcap/tidb/pkg/testkit" - "github.com/tikv/client-go/v2/util" - "go.uber.org/mock/gomock" + "github.com/pingcap/tidb/pkg/disttask/framework/testutil" + "github.com/stretchr/testify/require" ) -type planErrDispatcherExt struct { - callTime int - cnt int -} - -var ( - _ dispatcher.Extension = (*planErrDispatcherExt)(nil) - _ dispatcher.Extension = (*planNotRetryableErrDispatcherExt)(nil) -) - -func (*planErrDispatcherExt) OnTick(_ context.Context, _ *proto.Task) { -} - -func (p *planErrDispatcherExt) OnNextSubtasksBatch(_ context.Context, _ dispatcher.TaskHandle, gTask *proto.Task, _ []*infosync.ServerInfo, _ proto.Step) (metas [][]byte, err error) { - if gTask.Step == proto.StepInit { - if p.callTime == 0 { - p.callTime++ - return nil, errors.New("retryable err") - } - p.cnt = 3 - return [][]byte{ - []byte("task1"), - []byte("task2"), - []byte("task3"), - }, nil - } - if gTask.Step == proto.StepOne { - p.cnt = 4 - return [][]byte{ - []byte("task4"), - }, nil - } - return nil, nil -} - -func (p *planErrDispatcherExt) OnErrStage(_ context.Context, _ dispatcher.TaskHandle, _ *proto.Task, _ []error) (meta []byte, err error) { - if p.callTime == 1 { - p.callTime++ - return nil, errors.New("not retryable err") - } - return []byte("planErrTask"), nil -} - -func (*planErrDispatcherExt) GetEligibleInstances(_ context.Context, _ *proto.Task) ([]*infosync.ServerInfo, bool, error) { - return generateSchedulerNodes4Test() -} - -func (*planErrDispatcherExt) IsRetryableErr(error) bool { - return true -} - -func (p *planErrDispatcherExt) GetNextStep(task *proto.Task) proto.Step { - switch task.Step { - case proto.StepInit: - return proto.StepOne - case proto.StepOne: - return proto.StepTwo - default: - return proto.StepDone - } -} - -type planNotRetryableErrDispatcherExt struct { - cnt int -} - -func (*planNotRetryableErrDispatcherExt) OnTick(_ context.Context, _ *proto.Task) { -} - -func (p *planNotRetryableErrDispatcherExt) OnNextSubtasksBatch(_ context.Context, _ dispatcher.TaskHandle, _ *proto.Task, _ []*infosync.ServerInfo, _ proto.Step) (metas [][]byte, err error) { - return nil, errors.New("not retryable err") -} - -func (*planNotRetryableErrDispatcherExt) OnErrStage(_ context.Context, _ dispatcher.TaskHandle, _ *proto.Task, _ []error) (meta []byte, err error) { - return nil, errors.New("not retryable err") -} - -func (*planNotRetryableErrDispatcherExt) GetEligibleInstances(_ context.Context, _ *proto.Task) ([]*infosync.ServerInfo, bool, error) { - return generateSchedulerNodes4Test() -} - -func (*planNotRetryableErrDispatcherExt) IsRetryableErr(error) bool { - return false -} - -func (p *planNotRetryableErrDispatcherExt) GetNextStep(*proto.Task) proto.Step { - return proto.StepDone -} - -func TestPlanErr(t *testing.T) { - m := sync.Map{} - ctrl := gomock.NewController(t) +func TestRetryErrOnNextSubtasksBatch(t *testing.T) { + ctx, ctrl, testContext, distContext := testutil.InitTestContext(t, 2) defer ctrl.Finish() - ctx := context.Background() - ctx = util.WithInternalSourceType(ctx, "dispatcher") - - RegisterTaskMeta(t, ctrl, &m, &planErrDispatcherExt{0, 0}) - distContext := testkit.NewDistExecutionContext(t, 2) - DispatchTaskAndCheckSuccess(ctx, "key1", t, &m) - distContext.Close() -} - -func TestRevertPlanErr(t *testing.T) { - m := sync.Map{} - - ctrl := gomock.NewController(t) - defer ctrl.Finish() - ctx := context.Background() - ctx = util.WithInternalSourceType(ctx, "dispatcher") - - RegisterTaskMeta(t, ctrl, &m, &planErrDispatcherExt{0, 0}) - distContext := testkit.NewDistExecutionContext(t, 2) - DispatchTaskAndCheckSuccess(ctx, "key1", t, &m) + testutil.RegisterTaskMeta(t, ctrl, testutil.GetPlanErrSchedulerExt(ctrl, testContext), testContext, nil) + submitTaskAndCheckSuccessForBasic(ctx, t, "key1", testContext) distContext.Close() } -func TestPlanNotRetryableErr(t *testing.T) { - m := sync.Map{} - ctrl := gomock.NewController(t) +func TestPlanNotRetryableOnNextSubtasksBatchErr(t *testing.T) { + ctx, ctrl, testContext, distContext := testutil.InitTestContext(t, 2) defer ctrl.Finish() - ctx := context.Background() - ctx = util.WithInternalSourceType(ctx, "dispatcher") - RegisterTaskMeta(t, ctrl, &m, &planNotRetryableErrDispatcherExt{}) - distContext := testkit.NewDistExecutionContext(t, 2) - DispatchTaskAndCheckState(ctx, "key1", t, &m, proto.TaskStateFailed) + testutil.RegisterTaskMeta(t, ctrl, testutil.GetPlanNotRetryableErrSchedulerExt(ctrl), testContext, nil) + task := testutil.SubmitAndWaitTask(ctx, t, "key1") + require.Equal(t, proto.TaskStateFailed, task.State) distContext.Close() } diff --git a/pkg/disttask/framework/framework_ha_test.go b/pkg/disttask/framework/framework_ha_test.go index fa8f7f0a30439..923fe12725334 100644 --- a/pkg/disttask/framework/framework_ha_test.go +++ b/pkg/disttask/framework/framework_ha_test.go @@ -16,195 +16,109 @@ package framework_test import ( "context" - "sync" "testing" "github.com/pingcap/failpoint" - "github.com/pingcap/tidb/pkg/disttask/framework/dispatcher" "github.com/pingcap/tidb/pkg/disttask/framework/proto" - "github.com/pingcap/tidb/pkg/domain/infosync" - "github.com/pingcap/tidb/pkg/testkit" + "github.com/pingcap/tidb/pkg/disttask/framework/testutil" "github.com/stretchr/testify/require" - "github.com/tikv/client-go/v2/util" - "go.uber.org/mock/gomock" ) -type haTestDispatcherExt struct { - cnt int -} - -var _ dispatcher.Extension = (*haTestDispatcherExt)(nil) - -func (*haTestDispatcherExt) OnTick(_ context.Context, _ *proto.Task) { -} - -func (dsp *haTestDispatcherExt) OnNextSubtasksBatch(_ context.Context, _ dispatcher.TaskHandle, gTask *proto.Task, _ []*infosync.ServerInfo, _ proto.Step) (metas [][]byte, err error) { - if gTask.Step == proto.StepInit { - dsp.cnt = 10 - return [][]byte{ - []byte("task1"), - []byte("task2"), - []byte("task3"), - []byte("task4"), - []byte("task5"), - []byte("task6"), - []byte("task7"), - []byte("task8"), - []byte("task9"), - []byte("task10"), - }, nil - } - if gTask.Step == proto.StepOne { - dsp.cnt = 15 - return [][]byte{ - []byte("task11"), - []byte("task12"), - []byte("task13"), - []byte("task14"), - []byte("task15"), - }, nil - } - return nil, nil -} - -func (*haTestDispatcherExt) OnErrStage(ctx context.Context, h dispatcher.TaskHandle, gTask *proto.Task, receiveErrs []error) (subtaskMeta []byte, err error) { - return nil, nil -} - -func (*haTestDispatcherExt) GetEligibleInstances(_ context.Context, _ *proto.Task) ([]*infosync.ServerInfo, bool, error) { - return generateSchedulerNodes4Test() -} - -func (*haTestDispatcherExt) IsRetryableErr(error) bool { - return true -} - -func (dsp *haTestDispatcherExt) GetNextStep(task *proto.Task) proto.Step { - switch task.Step { - case proto.StepInit: - return proto.StepOne - case proto.StepOne: - return proto.StepTwo - default: - return proto.StepDone - } +func submitTaskAndCheckSuccessForHA(ctx context.Context, t *testing.T, taskKey string, testContext *testutil.TestContext) { + submitTaskAndCheckSuccess(ctx, t, taskKey, testContext, map[proto.Step]int{ + proto.StepOne: 10, + proto.StepTwo: 5, + }) } func TestHABasic(t *testing.T) { - var m sync.Map - ctrl := gomock.NewController(t) + ctx, ctrl, testContext, distContext := testutil.InitTestContext(t, 4) defer ctrl.Finish() - ctx := context.Background() - ctx = util.WithInternalSourceType(ctx, "dispatcher") - - RegisterTaskMeta(t, ctrl, &m, &haTestDispatcherExt{}) - distContext := testkit.NewDistExecutionContext(t, 4) - require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/disttask/framework/scheduler/mockCleanScheduler", "return()")) - require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/disttask/framework/scheduler/mockStopManager", "4*return()")) - require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/disttask/framework/scheduler/mockTiDBDown", "return(\":4000\")")) - DispatchTaskAndCheckSuccess(ctx, "😊", t, &m) - require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/disttask/framework/scheduler/mockTiDBDown")) - require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/disttask/framework/scheduler/mockStopManager")) - require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/disttask/framework/scheduler/mockCleanScheduler")) + + testutil.RegisterTaskMeta(t, ctrl, testutil.GetMockHATestSchedulerExt(ctrl), testContext, nil) + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/disttask/framework/taskexecutor/mockCleanExecutor", "return()")) + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/disttask/framework/taskexecutor/mockStopManager", "4*return()")) + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/disttask/framework/taskexecutor/mockTiDBDown", "return(\":4000\")")) + submitTaskAndCheckSuccessForHA(ctx, t, "😊", testContext) + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/disttask/framework/taskexecutor/mockTiDBDown")) + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/disttask/framework/taskexecutor/mockStopManager")) + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/disttask/framework/taskexecutor/mockCleanExecutor")) distContext.Close() } func TestHAManyNodes(t *testing.T) { - var m sync.Map - ctrl := gomock.NewController(t) + ctx, ctrl, testContext, distContext := testutil.InitTestContext(t, 30) defer ctrl.Finish() - ctx := context.Background() - ctx = util.WithInternalSourceType(ctx, "dispatcher") - - RegisterTaskMeta(t, ctrl, &m, &haTestDispatcherExt{}) - distContext := testkit.NewDistExecutionContext(t, 30) - require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/disttask/framework/scheduler/mockCleanScheduler", "return()")) - require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/disttask/framework/scheduler/mockStopManager", "30*return()")) - require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/disttask/framework/scheduler/mockTiDBDown", "return(\":4000\")")) - DispatchTaskAndCheckSuccess(ctx, "😊", t, &m) - require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/disttask/framework/scheduler/mockTiDBDown")) - require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/disttask/framework/scheduler/mockStopManager")) - require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/disttask/framework/scheduler/mockCleanScheduler")) + + testutil.RegisterTaskMeta(t, ctrl, testutil.GetMockHATestSchedulerExt(ctrl), testContext, nil) + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/disttask/framework/taskexecutor/mockCleanExecutor", "return()")) + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/disttask/framework/taskexecutor/mockStopManager", "30*return()")) + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/disttask/framework/taskexecutor/mockTiDBDown", "return(\":4000\")")) + submitTaskAndCheckSuccessForHA(ctx, t, "😊", testContext) + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/disttask/framework/taskexecutor/mockTiDBDown")) + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/disttask/framework/taskexecutor/mockStopManager")) + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/disttask/framework/taskexecutor/mockCleanExecutor")) distContext.Close() } func TestHAFailInDifferentStage(t *testing.T) { - var m sync.Map - ctrl := gomock.NewController(t) + ctx, ctrl, testContext, distContext := testutil.InitTestContext(t, 6) defer ctrl.Finish() - ctx := context.Background() - ctx = util.WithInternalSourceType(ctx, "dispatcher") - RegisterTaskMeta(t, ctrl, &m, &haTestDispatcherExt{}) - distContext := testkit.NewDistExecutionContext(t, 6) + testutil.RegisterTaskMeta(t, ctrl, testutil.GetMockHATestSchedulerExt(ctrl), testContext, nil) // stage1 : server num from 6 to 3. // stage2 : server num from 3 to 2. - require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/disttask/framework/scheduler/mockCleanScheduler", "return()")) - require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/disttask/framework/scheduler/mockStopManager", "6*return()")) - require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/disttask/framework/scheduler/mockTiDBDown", "return(\":4000\")")) - require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/disttask/framework/scheduler/mockTiDBDown2", "return()")) - - DispatchTaskAndCheckSuccess(ctx, "😊", t, &m) - require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/disttask/framework/scheduler/mockTiDBDown")) - require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/disttask/framework/scheduler/mockTiDBDown2")) - require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/disttask/framework/scheduler/mockStopManager")) - require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/disttask/framework/scheduler/mockCleanScheduler")) + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/disttask/framework/taskexecutor/mockCleanExecutor", "return()")) + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/disttask/framework/taskexecutor/mockStopManager", "6*return()")) + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/disttask/framework/taskexecutor/mockTiDBDown", "return(\":4000\")")) + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/disttask/framework/taskexecutor/mockTiDBDown2", "return()")) + + submitTaskAndCheckSuccessForHA(ctx, t, "😊", testContext) + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/disttask/framework/taskexecutor/mockTiDBDown")) + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/disttask/framework/taskexecutor/mockTiDBDown2")) + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/disttask/framework/taskexecutor/mockStopManager")) + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/disttask/framework/taskexecutor/mockCleanExecutor")) distContext.Close() } func TestHAFailInDifferentStageManyNodes(t *testing.T) { - var m sync.Map - - ctrl := gomock.NewController(t) + ctx, ctrl, testContext, distContext := testutil.InitTestContext(t, 30) defer ctrl.Finish() - ctx := context.Background() - ctx = util.WithInternalSourceType(ctx, "dispatcher") - RegisterTaskMeta(t, ctrl, &m, &haTestDispatcherExt{}) - distContext := testkit.NewDistExecutionContext(t, 30) + testutil.RegisterTaskMeta(t, ctrl, testutil.GetMockHATestSchedulerExt(ctrl), testContext, nil) // stage1 : server num from 30 to 27. // stage2 : server num from 27 to 26. - require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/disttask/framework/scheduler/mockCleanScheduler", "return()")) - require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/disttask/framework/scheduler/mockStopManager", "30*return()")) - require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/disttask/framework/scheduler/mockTiDBDown", "return(\":4000\")")) - require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/disttask/framework/scheduler/mockTiDBDown2", "return()")) - - DispatchTaskAndCheckSuccess(ctx, "😊", t, &m) - require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/disttask/framework/scheduler/mockTiDBDown")) - require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/disttask/framework/scheduler/mockTiDBDown2")) - require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/disttask/framework/scheduler/mockStopManager")) - require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/disttask/framework/scheduler/mockCleanScheduler")) + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/disttask/framework/taskexecutor/mockCleanExecutor", "return()")) + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/disttask/framework/taskexecutor/mockStopManager", "30*return()")) + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/disttask/framework/taskexecutor/mockTiDBDown", "return(\":4000\")")) + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/disttask/framework/taskexecutor/mockTiDBDown2", "return()")) + + submitTaskAndCheckSuccessForHA(ctx, t, "😊", testContext) + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/disttask/framework/taskexecutor/mockTiDBDown")) + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/disttask/framework/taskexecutor/mockTiDBDown2")) + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/disttask/framework/taskexecutor/mockStopManager")) + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/disttask/framework/taskexecutor/mockCleanExecutor")) distContext.Close() } func TestHAReplacedButRunning(t *testing.T) { - var m sync.Map - - ctrl := gomock.NewController(t) + ctx, ctrl, testContext, distContext := testutil.InitTestContext(t, 4) defer ctrl.Finish() - ctx := context.Background() - ctx = util.WithInternalSourceType(ctx, "dispatcher") - - RegisterTaskMeta(t, ctrl, &m, &haTestDispatcherExt{}) - distContext := testkit.NewDistExecutionContext(t, 4) - require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/disttask/framework/scheduler/mockTiDBPartitionThenResume", "10*return(true)")) - DispatchTaskAndCheckSuccess(ctx, "😊", t, &m) - require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/disttask/framework/scheduler/mockTiDBPartitionThenResume")) + + testutil.RegisterTaskMeta(t, ctrl, testutil.GetMockHATestSchedulerExt(ctrl), testContext, nil) + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/disttask/framework/taskexecutor/mockTiDBPartitionThenResume", "10*return(true)")) + submitTaskAndCheckSuccessForHA(ctx, t, "😊", testContext) + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/disttask/framework/taskexecutor/mockTiDBPartitionThenResume")) distContext.Close() } func TestHAReplacedButRunningManyNodes(t *testing.T) { - var m sync.Map - - ctrl := gomock.NewController(t) + ctx, ctrl, testContext, distContext := testutil.InitTestContext(t, 30) defer ctrl.Finish() - ctx := context.Background() - ctx = util.WithInternalSourceType(ctx, "dispatcher") - - RegisterTaskMeta(t, ctrl, &m, &haTestDispatcherExt{}) - distContext := testkit.NewDistExecutionContext(t, 30) - require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/disttask/framework/scheduler/mockTiDBPartitionThenResume", "30*return(true)")) - DispatchTaskAndCheckSuccess(ctx, "😊", t, &m) - require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/disttask/framework/scheduler/mockTiDBPartitionThenResume")) + + testutil.RegisterTaskMeta(t, ctrl, testutil.GetMockHATestSchedulerExt(ctrl), testContext, nil) + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/disttask/framework/taskexecutor/mockTiDBPartitionThenResume", "30*return(true)")) + submitTaskAndCheckSuccessForHA(ctx, t, "😊", testContext) + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/disttask/framework/taskexecutor/mockTiDBPartitionThenResume")) distContext.Close() } diff --git a/pkg/disttask/framework/framework_pause_and_resume_test.go b/pkg/disttask/framework/framework_pause_and_resume_test.go index 28ba8b4cefaa3..2c5020014d452 100644 --- a/pkg/disttask/framework/framework_pause_and_resume_test.go +++ b/pkg/disttask/framework/framework_pause_and_resume_test.go @@ -16,72 +16,68 @@ package framework_test import ( "context" - "sync" "testing" "github.com/pingcap/failpoint" - "github.com/pingcap/tidb/pkg/disttask/framework/dispatcher" "github.com/pingcap/tidb/pkg/disttask/framework/handle" "github.com/pingcap/tidb/pkg/disttask/framework/proto" + "github.com/pingcap/tidb/pkg/disttask/framework/scheduler" "github.com/pingcap/tidb/pkg/disttask/framework/storage" - "github.com/pingcap/tidb/pkg/testkit" + "github.com/pingcap/tidb/pkg/disttask/framework/testutil" "github.com/stretchr/testify/require" - "github.com/tikv/client-go/v2/util" - "go.uber.org/mock/gomock" ) -func CheckSubtasksState(ctx context.Context, t *testing.T, taskID int64, state proto.TaskState, expectedCnt int64) { +func CheckSubtasksState(ctx context.Context, t *testing.T, taskID int64, state proto.SubtaskState, expectedCnt int64) { mgr, err := storage.GetTaskManager() require.NoError(t, err) - mgr.PrintSubtaskInfo(ctx, taskID) - cnt, err := mgr.GetSubtaskInStatesCnt(ctx, taskID, state) + testutil.PrintSubtaskInfo(ctx, mgr, taskID) + cntByStatesStepOne, err := mgr.GetSubtaskCntGroupByStates(ctx, taskID, proto.StepOne) require.NoError(t, err) - historySubTasksCnt, err := storage.GetSubtasksFromHistoryByTaskIDForTest(ctx, mgr, taskID) + cntByStatesStepTwo, err := mgr.GetSubtaskCntGroupByStates(ctx, taskID, proto.StepTwo) require.NoError(t, err) - require.Equal(t, expectedCnt, cnt+int64(historySubTasksCnt)) + historySubTasksCnt, err := testutil.GetSubtasksFromHistoryByTaskID(ctx, mgr, taskID) + require.NoError(t, err) + require.Equal(t, expectedCnt, cntByStatesStepOne[state]+cntByStatesStepTwo[state]+int64(historySubTasksCnt)) } func TestFrameworkPauseAndResume(t *testing.T) { - var m sync.Map - ctrl := gomock.NewController(t) + ctx, ctrl, testContext, distContext := testutil.InitTestContext(t, 3) defer ctrl.Finish() - ctx := context.Background() - ctx = util.WithInternalSourceType(ctx, "dispatcher") - RegisterTaskMeta(t, ctrl, &m, &testDispatcherExt{}) - distContext := testkit.NewDistExecutionContext(t, 3) - // 1. dispatch and pause one running task. - require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/disttask/framework/dispatcher/pauseTaskAfterRefreshTask", "2*return(true)")) - require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/disttask/framework/dispatcher/syncAfterResume", "return()")) - DispatchTaskAndCheckState(ctx, "key1", t, &m, proto.TaskStatePaused) - require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/disttask/framework/dispatcher/pauseTaskAfterRefreshTask")) - // 4 subtask dispatched. + testutil.RegisterTaskMeta(t, ctrl, testutil.GetMockBasicSchedulerExt(ctrl), testContext, nil) + // 1. schedule and pause one running task. + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/disttask/framework/scheduler/pauseTaskAfterRefreshTask", "2*return(true)")) + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/disttask/framework/scheduler/syncAfterResume", "return()")) + task1 := testutil.SubmitAndWaitTask(ctx, t, "key1") + require.Equal(t, proto.TaskStatePaused, task1.State) + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/disttask/framework/scheduler/pauseTaskAfterRefreshTask")) + // 4 subtask scheduled. require.NoError(t, handle.ResumeTask(ctx, "key1")) - <-dispatcher.TestSyncChan - WaitTaskExit(ctx, t, "key1") - CheckSubtasksState(ctx, t, 1, proto.TaskStateSucceed, 4) - require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/disttask/framework/dispatcher/syncAfterResume")) + <-scheduler.TestSyncChan + testutil.WaitTaskDoneOrPaused(ctx, t, task1.Key) + CheckSubtasksState(ctx, t, 1, proto.SubtaskStateSucceed, 4) + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/disttask/framework/scheduler/syncAfterResume")) mgr, err := storage.GetTaskManager() require.NoError(t, err) - errs, err := mgr.CollectSubTaskError(ctx, 1) + errs, err := mgr.GetSubtaskErrors(ctx, 1) require.NoError(t, err) require.Empty(t, errs) // 2. pause pending task. - require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/disttask/framework/dispatcher/pausePendingTask", "2*return(true)")) - require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/disttask/framework/dispatcher/syncAfterResume", "1*return()")) - DispatchTaskAndCheckState(ctx, "key2", t, &m, proto.TaskStatePaused) - - require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/disttask/framework/dispatcher/pausePendingTask")) - // 4 subtask dispatched. + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/disttask/framework/scheduler/pausePendingTask", "2*return(true)")) + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/disttask/framework/scheduler/syncAfterResume", "1*return()")) + task2 := testutil.SubmitAndWaitTask(ctx, t, "key2") + require.Equal(t, proto.TaskStatePaused, task2.State) + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/disttask/framework/scheduler/pausePendingTask")) + // 4 subtask scheduled. require.NoError(t, handle.ResumeTask(ctx, "key2")) - <-dispatcher.TestSyncChan - WaitTaskExit(ctx, t, "key2") - CheckSubtasksState(ctx, t, 1, proto.TaskStateSucceed, 4) - require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/disttask/framework/dispatcher/syncAfterResume")) + <-scheduler.TestSyncChan + testutil.WaitTaskDoneOrPaused(ctx, t, task2.Key) + CheckSubtasksState(ctx, t, 1, proto.SubtaskStateSucceed, 4) + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/disttask/framework/scheduler/syncAfterResume")) - errs, err = mgr.CollectSubTaskError(ctx, 1) + errs, err = mgr.GetSubtaskErrors(ctx, 1) require.NoError(t, err) require.Empty(t, errs) distContext.Close() diff --git a/pkg/disttask/framework/framework_role_test.go b/pkg/disttask/framework/framework_role_test.go new file mode 100644 index 0000000000000..337189c02cd82 --- /dev/null +++ b/pkg/disttask/framework/framework_role_test.go @@ -0,0 +1,96 @@ +// Copyright 2024 PingCAP, 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. + +package framework_test + +import ( + "context" + "slices" + "testing" + "time" + + "github.com/pingcap/failpoint" + "github.com/pingcap/tidb/pkg/disttask/framework/scheduler" + "github.com/pingcap/tidb/pkg/disttask/framework/storage" + "github.com/pingcap/tidb/pkg/disttask/framework/testutil" + "github.com/pingcap/tidb/pkg/testkit" + "github.com/stretchr/testify/require" +) + +func checkSubtaskOnNodes(ctx context.Context, t *testing.T, taskID int64, expectedNodes []string) { + mgr, err := storage.GetTaskManager() + require.NoError(t, err) + nodes, err := testutil.GetSubtaskNodes(ctx, mgr, taskID) + require.NoError(t, err) + slices.Sort(nodes) + slices.Sort(expectedNodes) + require.EqualValues(t, expectedNodes, nodes) +} + +func TestRoleBasic(t *testing.T) { + ctx, ctrl, testContext, distContext := testutil.InitTestContext(t, 3) + defer ctrl.Finish() + + testutil.RegisterTaskMeta(t, ctrl, testutil.GetMockBasicSchedulerExt(ctrl), testContext, nil) + tk := testkit.NewTestKit(t, distContext.Store) + + // 1. all "" role. + submitTaskAndCheckSuccessForBasic(ctx, t, "😁", testContext) + + checkSubtaskOnNodes(ctx, t, 1, []string{":4000", ":4001", ":4002"}) + tk.MustQuery(`select role from mysql.dist_framework_meta where host=":4000"`).Check(testkit.Rows("")) + tk.MustQuery(`select role from mysql.dist_framework_meta where host=":4001"`).Check(testkit.Rows("")) + tk.MustQuery(`select role from mysql.dist_framework_meta where host=":4002"`).Check(testkit.Rows("")) + + // 2. one "background" role. + tk.MustExec("set global tidb_service_scope=background") + tk.MustQuery("select @@global.tidb_service_scope").Check(testkit.Rows("background")) + tk.MustQuery("select @@tidb_service_scope").Check(testkit.Rows("background")) + + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/disttask/framework/scheduler/syncRefresh", "1*return()")) + <-scheduler.TestRefreshedChan + submitTaskAndCheckSuccessForBasic(ctx, t, "😊", testContext) + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/disttask/framework/scheduler/syncRefresh")) + + tk.MustQuery(`select role from mysql.dist_framework_meta where host=":4000"`).Check(testkit.Rows("background")) + tk.MustQuery(`select role from mysql.dist_framework_meta where host=":4001"`).Check(testkit.Rows("")) + tk.MustQuery(`select role from mysql.dist_framework_meta where host=":4002"`).Check(testkit.Rows("")) + + checkSubtaskOnNodes(ctx, t, 2, []string{":4000"}) + + // 3. 2 "background" role. + tk.MustExec("update mysql.dist_framework_meta set role = \"background\" where host = \":4001\"") + time.Sleep(5 * time.Second) + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/disttask/framework/scheduler/syncRefresh", "1*return()")) + <-scheduler.TestRefreshedChan + submitTaskAndCheckSuccessForBasic(ctx, t, "😆", testContext) + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/disttask/framework/scheduler/syncRefresh")) + + checkSubtaskOnNodes(ctx, t, 3, []string{":4000", ":4001"}) + tk.MustQuery(`select role from mysql.dist_framework_meta where host=":4000"`).Check(testkit.Rows("background")) + tk.MustQuery(`select role from mysql.dist_framework_meta where host=":4001"`).Check(testkit.Rows("background")) + tk.MustQuery(`select role from mysql.dist_framework_meta where host=":4002"`).Check(testkit.Rows("")) + + distContext.Close() +} + +func TestSetRole(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + // 1. set wrong sys var. + tk.MustMatchErrMsg("set global tidb_service_scope=wrong", `incorrect value: .*. tidb_service_scope options: "", background`) + // 2. set keyspace id. + tk.MustExec("update mysql.dist_framework_meta set keyspace_id = 16777216 where host = \":4000\"") + tk.MustQuery("select keyspace_id from mysql.dist_framework_meta where host = \":4000\"").Check(testkit.Rows("16777216")) +} diff --git a/pkg/disttask/framework/framework_rollback_test.go b/pkg/disttask/framework/framework_rollback_test.go index 3bb4d40f46576..39d4bf3ace8bc 100644 --- a/pkg/disttask/framework/framework_rollback_test.go +++ b/pkg/disttask/framework/framework_rollback_test.go @@ -15,107 +15,26 @@ package framework_test import ( - "context" - "sync" - "sync/atomic" "testing" "github.com/pingcap/failpoint" - "github.com/pingcap/tidb/pkg/disttask/framework/dispatcher" - "github.com/pingcap/tidb/pkg/disttask/framework/mock" - mockexecute "github.com/pingcap/tidb/pkg/disttask/framework/mock/execute" "github.com/pingcap/tidb/pkg/disttask/framework/proto" - "github.com/pingcap/tidb/pkg/domain/infosync" - "github.com/pingcap/tidb/pkg/testkit" + "github.com/pingcap/tidb/pkg/disttask/framework/testutil" "github.com/stretchr/testify/require" - "github.com/tikv/client-go/v2/util" - "go.uber.org/mock/gomock" ) -type rollbackDispatcherExt struct { - cnt int -} - -var _ dispatcher.Extension = (*rollbackDispatcherExt)(nil) -var rollbackCnt atomic.Int32 - -func (*rollbackDispatcherExt) OnTick(_ context.Context, _ *proto.Task) { -} - -func (dsp *rollbackDispatcherExt) OnNextSubtasksBatch(_ context.Context, _ dispatcher.TaskHandle, gTask *proto.Task, _ []*infosync.ServerInfo, _ proto.Step) (metas [][]byte, err error) { - if gTask.Step == proto.StepInit { - dsp.cnt = 3 - return [][]byte{ - []byte("task1"), - []byte("task2"), - []byte("task3"), - }, nil - } - return nil, nil -} - -func (*rollbackDispatcherExt) OnErrStage(_ context.Context, _ dispatcher.TaskHandle, _ *proto.Task, _ []error) (meta []byte, err error) { - return []byte("rollbacktask1"), nil -} - -func (*rollbackDispatcherExt) GetEligibleInstances(_ context.Context, _ *proto.Task) ([]*infosync.ServerInfo, bool, error) { - return generateSchedulerNodes4Test() -} - -func (*rollbackDispatcherExt) IsRetryableErr(error) bool { - return true -} - -func (dsp *rollbackDispatcherExt) GetNextStep(task *proto.Task) proto.Step { - switch task.Step { - case proto.StepInit: - return proto.StepOne - default: - return proto.StepDone - } -} - -func registerRollbackTaskMeta(t *testing.T, ctrl *gomock.Controller, m *sync.Map) { - mockExtension := mock.NewMockExtension(ctrl) - mockExecutor := mockexecute.NewMockSubtaskExecutor(ctrl) - mockCleanupRountine := mock.NewMockCleanUpRoutine(ctrl) - mockCleanupRountine.EXPECT().CleanUp(gomock.Any(), gomock.Any()).Return(nil).AnyTimes() - mockExecutor.EXPECT().Init(gomock.Any()).Return(nil).AnyTimes() - mockExecutor.EXPECT().Cleanup(gomock.Any()).Return(nil).AnyTimes() - mockExecutor.EXPECT().Rollback(gomock.Any()).DoAndReturn( - func(_ context.Context) error { - rollbackCnt.Add(1) - return nil - }, - ).AnyTimes() - mockExecutor.EXPECT().RunSubtask(gomock.Any(), gomock.Any()).DoAndReturn( - func(_ context.Context, _ *proto.Subtask) error { - m.Store("1", "1") - return nil - }).AnyTimes() - mockExecutor.EXPECT().OnFinished(gomock.Any(), gomock.Any()).Return(nil).AnyTimes() - mockExtension.EXPECT().GetSubtaskExecutor(gomock.Any(), gomock.Any(), gomock.Any()).Return(mockExecutor, nil).AnyTimes() - registerTaskMetaInner(t, proto.TaskTypeExample, mockExtension, mockCleanupRountine, &rollbackDispatcherExt{}) - rollbackCnt.Store(0) -} - func TestFrameworkRollback(t *testing.T) { - m := sync.Map{} - - ctrl := gomock.NewController(t) + ctx, ctrl, testContext, distContext := testutil.InitTestContext(t, 2) defer ctrl.Finish() - ctx := context.Background() - ctx = util.WithInternalSourceType(ctx, "dispatcher") - - registerRollbackTaskMeta(t, ctrl, &m) - distContext := testkit.NewDistExecutionContext(t, 2) - require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/disttask/framework/dispatcher/cancelTaskAfterRefreshTask", "2*return(true)")) + testutil.RegisterRollbackTaskMeta(t, ctrl, testutil.GetMockRollbackSchedulerExt(ctrl), testContext) + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/disttask/framework/scheduler/cancelTaskAfterRefreshTask", "2*return(true)")) defer func() { - require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/disttask/framework/dispatcher/cancelTaskAfterRefreshTask")) + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/disttask/framework/scheduler/cancelTaskAfterRefreshTask")) }() - DispatchTaskAndCheckState(ctx, "key1", t, &m, proto.TaskStateReverted) - require.Equal(t, int32(2), rollbackCnt.Load()) - rollbackCnt.Store(0) + task := testutil.SubmitAndWaitTask(ctx, t, "key1") + require.Equal(t, proto.TaskStateReverted, task.State) + require.Equal(t, int32(2), testContext.RollbackCnt.Load()) + testContext.RollbackCnt.Store(0) distContext.Close() } diff --git a/pkg/disttask/framework/framework_test.go b/pkg/disttask/framework/framework_test.go index e9c5f596601d2..b17854bf64c8c 100644 --- a/pkg/disttask/framework/framework_test.go +++ b/pkg/disttask/framework/framework_test.go @@ -16,401 +16,113 @@ package framework_test import ( "context" - "errors" "fmt" - "sync" + "math/rand" "testing" "time" "github.com/pingcap/failpoint" - "github.com/pingcap/tidb/pkg/disttask/framework/dispatcher" - "github.com/pingcap/tidb/pkg/disttask/framework/mock" - mockexecute "github.com/pingcap/tidb/pkg/disttask/framework/mock/execute" "github.com/pingcap/tidb/pkg/disttask/framework/proto" "github.com/pingcap/tidb/pkg/disttask/framework/scheduler" "github.com/pingcap/tidb/pkg/disttask/framework/storage" - "github.com/pingcap/tidb/pkg/domain/infosync" + "github.com/pingcap/tidb/pkg/disttask/framework/testutil" "github.com/pingcap/tidb/pkg/testkit" + "github.com/pingcap/tidb/pkg/util" "github.com/stretchr/testify/require" - "github.com/tikv/client-go/v2/util" - "go.uber.org/mock/gomock" ) -type testDispatcherExt struct { - cnt int -} - -var _ dispatcher.Extension = (*testDispatcherExt)(nil) - -func (*testDispatcherExt) OnTick(_ context.Context, _ *proto.Task) { -} - -func (dsp *testDispatcherExt) OnNextSubtasksBatch(_ context.Context, _ dispatcher.TaskHandle, gTask *proto.Task, _ []*infosync.ServerInfo, _ proto.Step) (metas [][]byte, err error) { - if gTask.Step == proto.StepInit { - dsp.cnt = 3 - return [][]byte{ - []byte("task1"), - []byte("task2"), - []byte("task3"), - }, nil - } - if gTask.Step == proto.StepOne { - dsp.cnt = 4 - return [][]byte{ - []byte("task4"), - }, nil - } - return nil, nil -} - -func (*testDispatcherExt) OnErrStage(_ context.Context, _ dispatcher.TaskHandle, _ *proto.Task, _ []error) (meta []byte, err error) { - return nil, nil -} - -func (dsp *testDispatcherExt) GetNextStep(task *proto.Task) proto.Step { - switch task.Step { - case proto.StepInit: - return proto.StepOne - case proto.StepOne: - return proto.StepTwo - default: - return proto.StepDone - } +func submitTaskAndCheckSuccessForBasic(ctx context.Context, t *testing.T, taskKey string, testContext *testutil.TestContext) { + submitTaskAndCheckSuccess(ctx, t, taskKey, testContext, map[proto.Step]int{ + proto.StepOne: 3, + proto.StepTwo: 1, + }) } -func generateSchedulerNodes4Test() ([]*infosync.ServerInfo, bool, error) { - serverInfos := infosync.MockGlobalServerInfoManagerEntry.GetAllServerInfo() - if len(serverInfos) == 0 { - return nil, true, errors.New("not found instance") - } - - serverNodes := make([]*infosync.ServerInfo, 0, len(serverInfos)) - for _, serverInfo := range serverInfos { - serverNodes = append(serverNodes, serverInfo) +func submitTaskAndCheckSuccess(ctx context.Context, t *testing.T, taskKey string, + testContext *testutil.TestContext, subtaskCnts map[proto.Step]int) { + task := testutil.SubmitAndWaitTask(ctx, t, taskKey) + require.Equal(t, proto.TaskStateSucceed, task.State) + for step, cnt := range subtaskCnts { + require.Equal(t, cnt, testContext.CollectedSubtaskCnt(task.ID, step)) } - return serverNodes, true, nil -} - -func (*testDispatcherExt) GetEligibleInstances(_ context.Context, _ *proto.Task) ([]*infosync.ServerInfo, bool, error) { - return generateSchedulerNodes4Test() -} - -func (*testDispatcherExt) IsRetryableErr(error) bool { - return true -} - -func getMockSubtaskExecutor(ctrl *gomock.Controller) *mockexecute.MockSubtaskExecutor { - executor := mockexecute.NewMockSubtaskExecutor(ctrl) - executor.EXPECT().Init(gomock.Any()).Return(nil).AnyTimes() - executor.EXPECT().Cleanup(gomock.Any()).Return(nil).AnyTimes() - executor.EXPECT().Rollback(gomock.Any()).Return(nil).AnyTimes() - executor.EXPECT().OnFinished(gomock.Any(), gomock.Any()).Return(nil).AnyTimes() - return executor -} - -func RegisterTaskMeta(t *testing.T, ctrl *gomock.Controller, m *sync.Map, dispatcherHandle dispatcher.Extension) { - mockExtension := mock.NewMockExtension(ctrl) - mockCleanupRountine := mock.NewMockCleanUpRoutine(ctrl) - mockCleanupRountine.EXPECT().CleanUp(gomock.Any(), gomock.Any()).Return(nil).AnyTimes() - mockSubtaskExecutor := getMockSubtaskExecutor(ctrl) - mockSubtaskExecutor.EXPECT().RunSubtask(gomock.Any(), gomock.Any()).DoAndReturn( - func(ctx context.Context, subtask *proto.Subtask) error { - switch subtask.Step { - case proto.StepOne: - m.Store("0", "0") - case proto.StepTwo: - m.Store("1", "1") - default: - panic("invalid step") - } - return nil - }).AnyTimes() - mockExtension.EXPECT().GetSubtaskExecutor(gomock.Any(), gomock.Any(), gomock.Any()).Return(mockSubtaskExecutor, nil).AnyTimes() - registerTaskMetaInner(t, proto.TaskTypeExample, mockExtension, mockCleanupRountine, dispatcherHandle) } -func registerTaskMetaInner(t *testing.T, taskType proto.TaskType, mockExtension scheduler.Extension, mockCleanup dispatcher.CleanUpRoutine, dispatcherHandle dispatcher.Extension) { - t.Cleanup(func() { - dispatcher.ClearDispatcherFactory() - dispatcher.ClearDispatcherCleanUpFactory() - scheduler.ClearSchedulers() - }) - dispatcher.RegisterDispatcherFactory(taskType, - func(ctx context.Context, taskMgr dispatcher.TaskManager, serverID string, task *proto.Task) dispatcher.Dispatcher { - baseDispatcher := dispatcher.NewBaseDispatcher(ctx, taskMgr, serverID, task) - baseDispatcher.Extension = dispatcherHandle - return baseDispatcher - }) - - dispatcher.RegisterDispatcherCleanUpFactory(taskType, - func() dispatcher.CleanUpRoutine { - return mockCleanup +func TestRandomOwnerChangeWithMultipleTasks(t *testing.T) { + nodeCnt := 5 + ctx, ctrl, testContext, distContext := testutil.InitTestContext(t, nodeCnt) + defer ctrl.Finish() + seed := time.Now().UnixNano() + t.Logf("seed: %d", seed) + random := rand.New(rand.NewSource(seed)) + + testutil.RegisterTaskMeta(t, ctrl, testutil.GetMockBasicSchedulerExt(ctrl), testContext, nil) + var wg util.WaitGroupWrapper + for i := 0; i < 10; i++ { + taskKey := fmt.Sprintf("key%d", i) + wg.Run(func() { + submitTaskAndCheckSuccessForBasic(ctx, t, taskKey, testContext) }) - - scheduler.RegisterTaskType(taskType, - func(ctx context.Context, id string, task *proto.Task, taskTable scheduler.TaskTable) scheduler.Scheduler { - s := scheduler.NewBaseScheduler(ctx, id, task.ID, taskTable) - s.Extension = mockExtension - return s - }, - ) -} - -func RegisterTaskMetaForExample2(t *testing.T, ctrl *gomock.Controller, m *sync.Map, dispatcherHandle dispatcher.Extension) { - mockExtension := mock.NewMockExtension(ctrl) - mockCleanupRountine := mock.NewMockCleanUpRoutine(ctrl) - mockCleanupRountine.EXPECT().CleanUp(gomock.Any(), gomock.Any()).Return(nil).AnyTimes() - mockSubtaskExecutor := getMockSubtaskExecutor(ctrl) - mockSubtaskExecutor.EXPECT().RunSubtask(gomock.Any(), gomock.Any()).DoAndReturn( - func(ctx context.Context, subtask *proto.Subtask) error { - switch subtask.Step { - case proto.StepOne: - m.Store("2", "2") - case proto.StepTwo: - m.Store("3", "3") - default: - panic("invalid step") - } - return nil - }).AnyTimes() - mockExtension.EXPECT().GetSubtaskExecutor(gomock.Any(), gomock.Any(), gomock.Any()).Return(mockSubtaskExecutor, nil).AnyTimes() - registerTaskMetaInner(t, proto.TaskTypeExample2, mockExtension, mockCleanupRountine, dispatcherHandle) -} - -func RegisterTaskMetaForExample3(t *testing.T, ctrl *gomock.Controller, m *sync.Map, dispatcherHandle dispatcher.Extension) { - mockExtension := mock.NewMockExtension(ctrl) - mockCleanupRountine := mock.NewMockCleanUpRoutine(ctrl) - mockCleanupRountine.EXPECT().CleanUp(gomock.Any(), gomock.Any()).Return(nil).AnyTimes() - mockSubtaskExecutor := getMockSubtaskExecutor(ctrl) - mockSubtaskExecutor.EXPECT().RunSubtask(gomock.Any(), gomock.Any()).DoAndReturn( - func(ctx context.Context, subtask *proto.Subtask) error { - switch subtask.Step { - case proto.StepOne: - m.Store("4", "4") - case proto.StepTwo: - m.Store("5", "5") - default: - panic("invalid step") - } - return nil - }).AnyTimes() - mockExtension.EXPECT().GetSubtaskExecutor(gomock.Any(), gomock.Any(), gomock.Any()).Return(mockSubtaskExecutor, nil).AnyTimes() - registerTaskMetaInner(t, proto.TaskTypeExample3, mockExtension, mockCleanupRountine, dispatcherHandle) -} - -func DispatchTask(ctx context.Context, taskKey string, t *testing.T) *proto.Task { - mgr, err := storage.GetTaskManager() - require.NoError(t, err) - _, err = mgr.AddNewGlobalTask(ctx, taskKey, proto.TaskTypeExample, 8, nil) - require.NoError(t, err) - return WaitTaskExit(ctx, t, taskKey) -} - -func WaitTaskExit(ctx context.Context, t *testing.T, taskKey string) *proto.Task { - mgr, err := storage.GetTaskManager() - require.NoError(t, err) - var task *proto.Task - start := time.Now() - for { - if time.Since(start) > 10*time.Minute { - require.FailNow(t, "timeout") - } - - time.Sleep(time.Second) - task, err = mgr.GetGlobalTaskByKeyWithHistory(ctx, taskKey) - require.NoError(t, err) - require.NotNil(t, task) - if task.State != proto.TaskStatePending && task.State != proto.TaskStateRunning && task.State != proto.TaskStateCancelling && task.State != proto.TaskStateReverting && task.State != proto.TaskStatePausing { - break - } } - return task -} - -func DispatchTaskAndCheckSuccess(ctx context.Context, taskKey string, t *testing.T, m *sync.Map) { - task := DispatchTask(ctx, taskKey, t) - require.Equal(t, proto.TaskStateSucceed, task.State) - v, ok := m.Load("1") - require.Equal(t, true, ok) - require.Equal(t, "1", v) - v, ok = m.Load("0") - require.Equal(t, true, ok) - require.Equal(t, "0", v) - m = &sync.Map{} -} - -func DispatchAndCancelTask(ctx context.Context, taskKey string, t *testing.T, m *sync.Map) { - require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/disttask/framework/scheduler/MockExecutorRunCancel", "1*return(1)")) - defer func() { - require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/disttask/framework/scheduler/MockExecutorRunCancel")) - }() - task := DispatchTask(ctx, taskKey, t) - require.Equal(t, proto.TaskStateReverted, task.State) - m.Range(func(key, value interface{}) bool { - m.Delete(key) - return true - }) -} - -func DispatchTaskAndCheckState(ctx context.Context, taskKey string, t *testing.T, m *sync.Map, state proto.TaskState) { - task := DispatchTask(ctx, taskKey, t) - require.Equal(t, state, task.State) - m.Range(func(key, value interface{}) bool { - m.Delete(key) - return true + wg.Run(func() { + for i := 0; i < 3; i++ { + time.Sleep(time.Duration(random.Intn(2000)) * time.Millisecond) + idx := int(random.Int31n(int32(nodeCnt))) + distContext.SetOwner(idx) + require.Eventually(t, func() bool { + return distContext.GetDomain(idx).DDL().OwnerManager().IsOwner() + }, 10*time.Second, 100*time.Millisecond) + } }) + wg.Wait() + distContext.Close() } -func DispatchMultiTasksAndOneFail(ctx context.Context, t *testing.T, num int, m []sync.Map) []*proto.Task { - var tasks []*proto.Task - var taskID []int64 - var start []time.Time - mgr, err := storage.GetTaskManager() - require.NoError(t, err) - taskID = make([]int64, num) - start = make([]time.Time, num) - tasks = make([]*proto.Task, num) - - for i := 0; i < num; i++ { - if i == 0 { - require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/disttask/framework/scheduler/MockExecutorRunErr", "1*return(true)")) - taskID[0], err = mgr.AddNewGlobalTask(ctx, "key0", "Example", 8, nil) - require.NoError(t, err) - start[0] = time.Now() - var task *proto.Task - for { - if time.Since(start[0]) > 2*time.Minute { - require.FailNow(t, "timeout") - } - time.Sleep(time.Second) - task, err = mgr.GetTaskByIDWithHistory(ctx, taskID[0]) - require.NoError(t, err) - require.NotNil(t, task) - tasks[0] = task - if task.State != proto.TaskStatePending && task.State != proto.TaskStateRunning && task.State != proto.TaskStateCancelling && task.State != proto.TaskStateReverting { - break - } - } - require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/disttask/framework/scheduler/MockExecutorRunErr")) - } else { - taskID[i], err = mgr.AddNewGlobalTask(ctx, fmt.Sprintf("key%d", i), proto.Int2Type(i+2), 8, nil) - require.NoError(t, err) - start[i] = time.Now() - } +func TestFrameworkScaleInAndOut(t *testing.T) { + ctx, ctrl, testContext, distContext := testutil.InitTestContext(t, 5) + defer ctrl.Finish() + seed := time.Now().UnixNano() + t.Logf("seed: %d", seed) + random := rand.New(rand.NewSource(seed)) + + testutil.RegisterTaskMeta(t, ctrl, testutil.GetMockBasicSchedulerExt(ctrl), testContext, nil) + var wg util.WaitGroupWrapper + for i := 0; i < 12; i++ { + taskKey := fmt.Sprintf("key%d", i) + wg.Run(func() { + submitTaskAndCheckSuccessForBasic(ctx, t, taskKey, testContext) + }) } - - for i := 1; i < num; i++ { - var task *proto.Task - for { - if time.Since(start[i]) > 2*time.Minute { - require.FailNow(t, "timeout") - } - time.Sleep(time.Second) - task, err = mgr.GetTaskByIDWithHistory(ctx, taskID[i]) - require.NoError(t, err) - require.NotNil(t, task) - tasks[i] = task - - if task.State != proto.TaskStatePending && task.State != proto.TaskStateRunning && task.State != proto.TaskStateCancelling && task.State != proto.TaskStateReverting { - break + wg.Run(func() { + for i := 0; i < 3; i++ { + if random.Intn(2) == 0 { + distContext.AddDomain() + } else { + // TODO: it's not real scale-in, delete domain doesn't stop task executor + // closing domain will reset storage.TaskManager which will cause + // test fail. + distContext.DeleteDomain(int(random.Int31n(int32(distContext.GetDomainCnt()-1))) + 1) } + time.Sleep(time.Duration(random.Intn(2000)) * time.Millisecond) + idx := int(random.Int31n(int32(distContext.GetDomainCnt()))) + distContext.SetOwner(idx) + require.Eventually(t, func() bool { + return distContext.GetDomain(idx).DDL().OwnerManager().IsOwner() + }, 10*time.Second, 100*time.Millisecond) } - } - m[0].Range(func(key, value interface{}) bool { - m[0].Delete(key) - return true }) - return tasks -} - -func TestFrameworkBasic(t *testing.T) { - var m sync.Map - ctrl := gomock.NewController(t) - defer ctrl.Finish() - ctx := context.Background() - ctx = util.WithInternalSourceType(ctx, "dispatcher") - - RegisterTaskMeta(t, ctrl, &m, &testDispatcherExt{}) - distContext := testkit.NewDistExecutionContext(t, 2) - DispatchTaskAndCheckSuccess(ctx, "key1", t, &m) - DispatchTaskAndCheckSuccess(ctx, "key2", t, &m) - distContext.SetOwner(0) - time.Sleep(2 * time.Second) // make sure owner changed - DispatchTaskAndCheckSuccess(ctx, "key3", t, &m) - DispatchTaskAndCheckSuccess(ctx, "key4", t, &m) - distContext.SetOwner(1) - time.Sleep(2 * time.Second) // make sure owner changed - DispatchTaskAndCheckSuccess(ctx, "key5", t, &m) - distContext.Close() -} - -func TestFramework3Server(t *testing.T) { - var m sync.Map - ctrl := gomock.NewController(t) - defer ctrl.Finish() - ctx := context.Background() - ctx = util.WithInternalSourceType(ctx, "dispatcher") - - RegisterTaskMeta(t, ctrl, &m, &testDispatcherExt{}) - distContext := testkit.NewDistExecutionContext(t, 3) - DispatchTaskAndCheckSuccess(ctx, "key1", t, &m) - DispatchTaskAndCheckSuccess(ctx, "key2", t, &m) - distContext.SetOwner(0) - time.Sleep(2 * time.Second) // make sure owner changed - DispatchTaskAndCheckSuccess(ctx, "key3", t, &m) - DispatchTaskAndCheckSuccess(ctx, "key4", t, &m) - distContext.Close() -} - -func TestFrameworkAddDomain(t *testing.T) { - var m sync.Map - - ctrl := gomock.NewController(t) - defer ctrl.Finish() - ctx := context.Background() - ctx = util.WithInternalSourceType(ctx, "dispatcher") - - RegisterTaskMeta(t, ctrl, &m, &testDispatcherExt{}) - distContext := testkit.NewDistExecutionContext(t, 2) - DispatchTaskAndCheckSuccess(ctx, "key1", t, &m) - distContext.AddDomain() - DispatchTaskAndCheckSuccess(ctx, "key2", t, &m) - distContext.SetOwner(1) - time.Sleep(2 * time.Second) // make sure owner changed - DispatchTaskAndCheckSuccess(ctx, "key3", t, &m) - distContext.Close() - distContext.AddDomain() - DispatchTaskAndCheckSuccess(ctx, "key4", t, &m) -} - -func TestFrameworkDeleteDomain(t *testing.T) { - var m sync.Map - - ctrl := gomock.NewController(t) - defer ctrl.Finish() - ctx := context.Background() - ctx = util.WithInternalSourceType(ctx, "dispatcher") - - RegisterTaskMeta(t, ctrl, &m, &testDispatcherExt{}) - distContext := testkit.NewDistExecutionContext(t, 2) - DispatchTaskAndCheckSuccess(ctx, "key1", t, &m) - distContext.DeleteDomain(1) - time.Sleep(2 * time.Second) // make sure the owner changed - DispatchTaskAndCheckSuccess(ctx, "key2", t, &m) + wg.Wait() distContext.Close() } func TestFrameworkWithQuery(t *testing.T) { - var m sync.Map - - ctrl := gomock.NewController(t) + ctx, ctrl, testContext, distContext := testutil.InitTestContext(t, 2) defer ctrl.Finish() - ctx := context.Background() - ctx = util.WithInternalSourceType(ctx, "dispatcher") - RegisterTaskMeta(t, ctrl, &m, &testDispatcherExt{}) - distContext := testkit.NewDistExecutionContext(t, 2) - DispatchTaskAndCheckSuccess(ctx, "key1", t, &m) + testutil.RegisterTaskMeta(t, ctrl, testutil.GetMockBasicSchedulerExt(ctrl), testContext, nil) + var wg util.WaitGroupWrapper + wg.Run(func() { + submitTaskAndCheckSuccessForBasic(ctx, t, "key1", testContext) + }) tk := testkit.NewTestKit(t, distContext.Store) @@ -423,249 +135,133 @@ func TestFrameworkWithQuery(t *testing.T) { require.Greater(t, len(fields), 0) require.Equal(t, "ifnull(a,b)", rs.Fields()[0].Column.Name.L) require.NoError(t, rs.Close()) + + wg.Wait() distContext.Close() } -func TestFrameworkCancelGTask(t *testing.T) { - var m sync.Map - - ctrl := gomock.NewController(t) +func TestFrameworkCancelTask(t *testing.T) { + ctx, ctrl, testContext, distContext := testutil.InitTestContext(t, 2) defer ctrl.Finish() - ctx := context.Background() - ctx = util.WithInternalSourceType(ctx, "dispatcher") - RegisterTaskMeta(t, ctrl, &m, &testDispatcherExt{}) - distContext := testkit.NewDistExecutionContext(t, 2) - DispatchAndCancelTask(ctx, "key1", t, &m) + testutil.RegisterTaskMeta(t, ctrl, testutil.GetMockBasicSchedulerExt(ctrl), testContext, nil) + + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/disttask/framework/taskexecutor/MockExecutorRunCancel", "1*return(1)")) + defer func() { + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/disttask/framework/taskexecutor/MockExecutorRunCancel")) + }() + task := testutil.SubmitAndWaitTask(ctx, t, "key1") + require.Equal(t, proto.TaskStateReverted, task.State) distContext.Close() } func TestFrameworkSubTaskFailed(t *testing.T) { - var m sync.Map - - ctrl := gomock.NewController(t) + ctx, ctrl, testContext, distContext := testutil.InitTestContext(t, 1) defer ctrl.Finish() - ctx := context.Background() - ctx = util.WithInternalSourceType(ctx, "dispatcher") - RegisterTaskMeta(t, ctrl, &m, &testDispatcherExt{}) - distContext := testkit.NewDistExecutionContext(t, 1) - require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/disttask/framework/scheduler/MockExecutorRunErr", "1*return(true)")) + testutil.RegisterTaskMeta(t, ctrl, testutil.GetMockBasicSchedulerExt(ctrl), testContext, nil) + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/disttask/framework/taskexecutor/MockExecutorRunErr", "1*return(true)")) defer func() { - require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/disttask/framework/scheduler/MockExecutorRunErr")) + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/disttask/framework/taskexecutor/MockExecutorRunErr")) }() - DispatchTaskAndCheckState(ctx, "key1", t, &m, proto.TaskStateReverted) + task := testutil.SubmitAndWaitTask(ctx, t, "key1") + require.Equal(t, proto.TaskStateReverted, task.State) distContext.Close() } func TestFrameworkSubTaskInitEnvFailed(t *testing.T) { - var m sync.Map - - ctrl := gomock.NewController(t) + ctx, ctrl, testContext, distContext := testutil.InitTestContext(t, 1) defer ctrl.Finish() - ctx := context.Background() - ctx = util.WithInternalSourceType(ctx, "dispatcher") - - RegisterTaskMeta(t, ctrl, &m, &testDispatcherExt{}) - distContext := testkit.NewDistExecutionContext(t, 1) - require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/disttask/framework/scheduler/mockExecSubtaskInitEnvErr", "return()")) + testutil.RegisterTaskMeta(t, ctrl, testutil.GetMockBasicSchedulerExt(ctrl), testContext, nil) + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/disttask/framework/taskexecutor/mockExecSubtaskInitEnvErr", "return()")) defer func() { - require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/disttask/framework/scheduler/mockExecSubtaskInitEnvErr")) + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/disttask/framework/taskexecutor/mockExecSubtaskInitEnvErr")) }() - DispatchTaskAndCheckState(ctx, "key1", t, &m, proto.TaskStateReverted) + task := testutil.SubmitAndWaitTask(ctx, t, "key1") + require.Equal(t, proto.TaskStateReverted, task.State) distContext.Close() } -func TestOwnerChange(t *testing.T) { - var m sync.Map - - ctrl := gomock.NewController(t) +func TestOwnerChangeWhenSchedule(t *testing.T) { + ctx, ctrl, testContext, distContext := testutil.InitTestContext(t, 3) defer ctrl.Finish() - ctx := context.Background() - ctx = util.WithInternalSourceType(ctx, "dispatcher") - - RegisterTaskMeta(t, ctrl, &m, &testDispatcherExt{}) - - distContext := testkit.NewDistExecutionContext(t, 3) - dispatcher.MockOwnerChange = func() { + testutil.RegisterTaskMeta(t, ctrl, testutil.GetMockBasicSchedulerExt(ctrl), testContext, nil) + scheduler.MockOwnerChange = func() { distContext.SetOwner(0) } - require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/disttask/framework/dispatcher/mockOwnerChange", "1*return(true)")) - DispatchTaskAndCheckSuccess(ctx, "😊", t, &m) - require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/disttask/framework/dispatcher/mockOwnerChange")) + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/disttask/framework/scheduler/mockOwnerChange", "1*return(true)")) + submitTaskAndCheckSuccessForBasic(ctx, t, "😊", testContext) + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/disttask/framework/scheduler/mockOwnerChange")) distContext.Close() } -func TestFrameworkCancelThenSubmitSubTask(t *testing.T) { - var m sync.Map - - ctrl := gomock.NewController(t) +func TestTaskExecutorDownBasic(t *testing.T) { + ctx, ctrl, testContext, distContext := testutil.InitTestContext(t, 4) defer ctrl.Finish() - ctx := context.Background() - ctx = util.WithInternalSourceType(ctx, "dispatcher") - - RegisterTaskMeta(t, ctrl, &m, &testDispatcherExt{}) - distContext := testkit.NewDistExecutionContext(t, 3) - require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/disttask/framework/dispatcher/cancelBeforeUpdate", "return()")) - DispatchTaskAndCheckState(ctx, "😊", t, &m, proto.TaskStateReverted) - require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/disttask/framework/dispatcher/cancelBeforeUpdate")) - distContext.Close() -} - -func TestSchedulerDownBasic(t *testing.T) { - var m sync.Map - - ctrl := gomock.NewController(t) - defer ctrl.Finish() - ctx := context.Background() - ctx = util.WithInternalSourceType(ctx, "dispatcher") - - RegisterTaskMeta(t, ctrl, &m, &testDispatcherExt{}) - - distContext := testkit.NewDistExecutionContext(t, 4) - require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/disttask/framework/scheduler/mockCleanScheduler", "return()")) - require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/disttask/framework/scheduler/mockStopManager", "4*return(\":4000\")")) - require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/disttask/framework/scheduler/mockTiDBDown", "return(\":4000\")")) - DispatchTaskAndCheckSuccess(ctx, "😊", t, &m) - require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/disttask/framework/scheduler/mockCleanScheduler")) - require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/disttask/framework/scheduler/mockTiDBDown")) - require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/disttask/framework/scheduler/mockStopManager")) - distContext.Close() -} - -func TestSchedulerDownManyNodes(t *testing.T) { - var m sync.Map - - ctrl := gomock.NewController(t) - defer ctrl.Finish() - ctx := context.Background() - ctx = util.WithInternalSourceType(ctx, "dispatcher") - - RegisterTaskMeta(t, ctrl, &m, &testDispatcherExt{}) - - distContext := testkit.NewDistExecutionContext(t, 30) - require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/disttask/framework/scheduler/mockCleanScheduler", "return()")) - require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/disttask/framework/scheduler/mockStopManager", "30*return(\":4000\")")) - require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/disttask/framework/scheduler/mockTiDBDown", "return(\":4000\")")) - DispatchTaskAndCheckSuccess(ctx, "😊", t, &m) - require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/disttask/framework/scheduler/mockCleanScheduler")) - require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/disttask/framework/scheduler/mockTiDBDown")) - require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/disttask/framework/scheduler/mockStopManager")) - distContext.Close() -} - -func TestFrameworkSetLabel(t *testing.T) { - var m sync.Map - ctrl := gomock.NewController(t) - defer ctrl.Finish() - ctx := context.Background() - ctx = util.WithInternalSourceType(ctx, "dispatcher") - - RegisterTaskMeta(t, ctrl, &m, &testDispatcherExt{}) - distContext := testkit.NewDistExecutionContext(t, 3) - tk := testkit.NewTestKit(t, distContext.Store) - - // 1. all "" role. - DispatchTaskAndCheckSuccess(ctx, "😁", t, &m) - - // 2. one "background" role. - tk.MustExec("set global tidb_service_scope=background") - tk.MustQuery("select @@global.tidb_service_scope").Check(testkit.Rows("background")) - tk.MustQuery("select @@tidb_service_scope").Check(testkit.Rows("background")) - DispatchTaskAndCheckSuccess(ctx, "😊", t, &m) - - // 3. 2 "background" role. - tk.MustExec("update mysql.dist_framework_meta set role = \"background\" where host = \":4001\"") - DispatchTaskAndCheckSuccess(ctx, "😆", t, &m) - - // 4. set wrong sys var. - tk.MustMatchErrMsg("set global tidb_service_scope=wrong", `incorrect value: .*. tidb_service_scope options: "", background`) - - // 5. set keyspace id. - tk.MustExec("update mysql.dist_framework_meta set keyspace_id = 16777216 where host = \":4001\"") - tk.MustQuery("select keyspace_id from mysql.dist_framework_meta where host = \":4001\"").Check(testkit.Rows("16777216")) + testutil.RegisterTaskMeta(t, ctrl, testutil.GetMockBasicSchedulerExt(ctrl), testContext, nil) + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/disttask/framework/taskexecutor/mockCleanExecutor", "return()")) + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/disttask/framework/taskexecutor/mockStopManager", "4*return(\":4000\")")) + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/disttask/framework/taskexecutor/mockTiDBDown", "return(\":4000\")")) + submitTaskAndCheckSuccess(ctx, t, "😊", testContext, map[proto.Step]int{ + proto.StepOne: 3, + proto.StepTwo: 1, + }) + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/disttask/framework/taskexecutor/mockCleanExecutor")) + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/disttask/framework/taskexecutor/mockTiDBDown")) + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/disttask/framework/taskexecutor/mockStopManager")) distContext.Close() } -func TestMultiTasks(t *testing.T) { - defer dispatcher.ClearDispatcherFactory() - defer scheduler.ClearSchedulers() - num := 3 - - m := make([]sync.Map, num) - ctrl := gomock.NewController(t) +func TestTaskExecutorDownManyNodes(t *testing.T) { + ctx, ctrl, testContext, distContext := testutil.InitTestContext(t, 30) defer ctrl.Finish() - ctx := context.Background() - ctx = util.WithInternalSourceType(ctx, "dispatcher") - - RegisterTaskMeta(t, ctrl, &(m[0]), &testDispatcherExt{}) - RegisterTaskMetaForExample2(t, ctrl, &(m[1]), &testDispatcherExt{}) - RegisterTaskMetaForExample3(t, ctrl, &(m[2]), &testDispatcherExt{}) - - distContext := testkit.NewDistExecutionContext(t, 3) - tasks := DispatchMultiTasksAndOneFail(ctx, t, num, m) - require.Equal(t, proto.TaskStateReverted, tasks[0].State) - v, ok := m[0].Load("0") - require.Equal(t, false, ok) - require.Equal(t, nil, v) - v, ok = m[0].Load("1") - require.Equal(t, false, ok) - require.Equal(t, nil, v) - require.Equal(t, proto.TaskStateSucceed, tasks[1].State) - v, ok = m[1].Load("2") - require.Equal(t, true, ok) - require.Equal(t, "2", v) - v, ok = m[1].Load("3") - require.Equal(t, true, ok) - require.Equal(t, "3", v) - require.Equal(t, proto.TaskStateSucceed, tasks[2].State) - v, ok = m[2].Load("4") - require.Equal(t, true, ok) - require.Equal(t, "4", v) - v, ok = m[2].Load("5") - require.Equal(t, true, ok) - require.Equal(t, "5", v) + testutil.RegisterTaskMeta(t, ctrl, testutil.GetMockBasicSchedulerExt(ctrl), testContext, nil) + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/disttask/framework/taskexecutor/mockCleanExecutor", "return()")) + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/disttask/framework/taskexecutor/mockStopManager", "30*return(\":4000\")")) + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/disttask/framework/taskexecutor/mockTiDBDown", "return(\":4000\")")) + submitTaskAndCheckSuccess(ctx, t, "😊", testContext, map[proto.Step]int{ + proto.StepOne: 3, + proto.StepTwo: 1, + }) + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/disttask/framework/taskexecutor/mockCleanExecutor")) + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/disttask/framework/taskexecutor/mockTiDBDown")) + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/disttask/framework/taskexecutor/mockStopManager")) distContext.Close() } func TestGC(t *testing.T) { - var m sync.Map - - ctrl := gomock.NewController(t) + ctx, ctrl, testContext, distContext := testutil.InitTestContext(t, 3) defer ctrl.Finish() - ctx := context.Background() - ctx = util.WithInternalSourceType(ctx, "dispatcher") - RegisterTaskMeta(t, ctrl, &m, &testDispatcherExt{}) + testutil.RegisterTaskMeta(t, ctrl, testutil.GetMockBasicSchedulerExt(ctrl), testContext, nil) require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/disttask/framework/storage/subtaskHistoryKeepSeconds", "return(1)")) - require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/disttask/framework/dispatcher/historySubtaskTableGcInterval", "return(1)")) + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/disttask/framework/scheduler/historySubtaskTableGcInterval", "return(1)")) defer func() { require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/disttask/framework/storage/subtaskHistoryKeepSeconds")) - require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/disttask/framework/dispatcher/historySubtaskTableGcInterval")) + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/disttask/framework/scheduler/historySubtaskTableGcInterval")) }() - distContext := testkit.NewDistExecutionContext(t, 3) - DispatchTaskAndCheckSuccess(ctx, "😊", t, &m) + submitTaskAndCheckSuccessForBasic(ctx, t, "😊", testContext) mgr, err := storage.GetTaskManager() require.NoError(t, err) var historySubTasksCnt int require.Eventually(t, func() bool { - historySubTasksCnt, err = storage.GetSubtasksFromHistoryForTest(ctx, mgr) + historySubTasksCnt, err = testutil.GetSubtasksFromHistory(ctx, mgr) if err != nil { return false } return historySubTasksCnt == 4 }, 10*time.Second, 500*time.Millisecond) - dispatcher.WaitTaskFinished <- struct{}{} + scheduler.WaitTaskFinished <- struct{}{} require.Eventually(t, func() bool { - historySubTasksCnt, err := storage.GetSubtasksFromHistoryForTest(ctx, mgr) + historySubTasksCnt, err := testutil.GetSubtasksFromHistory(ctx, mgr) if err != nil { return false } @@ -676,55 +272,80 @@ func TestGC(t *testing.T) { } func TestFrameworkSubtaskFinishedCancel(t *testing.T) { - var m sync.Map - - ctrl := gomock.NewController(t) + ctx, ctrl, testContext, distContext := testutil.InitTestContext(t, 3) defer ctrl.Finish() - ctx := context.Background() - ctx = util.WithInternalSourceType(ctx, "dispatcher") - RegisterTaskMeta(t, ctrl, &m, &testDispatcherExt{}) - distContext := testkit.NewDistExecutionContext(t, 3) - require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/disttask/framework/scheduler/MockSubtaskFinishedCancel", "1*return(true)")) + testutil.RegisterTaskMeta(t, ctrl, testutil.GetMockBasicSchedulerExt(ctrl), testContext, nil) + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/disttask/framework/taskexecutor/MockSubtaskFinishedCancel", "1*return(true)")) defer func() { - require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/disttask/framework/scheduler/MockSubtaskFinishedCancel")) + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/disttask/framework/taskexecutor/MockSubtaskFinishedCancel")) }() - DispatchTaskAndCheckState(ctx, "key1", t, &m, proto.TaskStateReverted) + task := testutil.SubmitAndWaitTask(ctx, t, "key1") + require.Equal(t, proto.TaskStateReverted, task.State) distContext.Close() } func TestFrameworkRunSubtaskCancel(t *testing.T) { - var m sync.Map - - ctrl := gomock.NewController(t) + ctx, ctrl, testContext, distContext := testutil.InitTestContext(t, 3) defer ctrl.Finish() - ctx := context.Background() - ctx = util.WithInternalSourceType(ctx, "dispatcher") - - RegisterTaskMeta(t, ctrl, &m, &testDispatcherExt{}) - distContext := testkit.NewDistExecutionContext(t, 3) - require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/disttask/framework/scheduler/MockRunSubtaskCancel", "1*return(true)")) - DispatchTaskAndCheckState(ctx, "key1", t, &m, proto.TaskStateReverted) - require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/disttask/framework/scheduler/MockRunSubtaskCancel")) + + testutil.RegisterTaskMeta(t, ctrl, testutil.GetMockBasicSchedulerExt(ctrl), testContext, nil) + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/disttask/framework/taskexecutor/MockRunSubtaskCancel", "1*return(true)")) + task := testutil.SubmitAndWaitTask(ctx, t, "key1") + require.Equal(t, proto.TaskStateReverted, task.State) + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/disttask/framework/taskexecutor/MockRunSubtaskCancel")) distContext.Close() } func TestFrameworkCleanUpRoutine(t *testing.T) { - var m sync.Map - ctrl := gomock.NewController(t) + bak := scheduler.DefaultCleanUpInterval + defer func() { + scheduler.DefaultCleanUpInterval = bak + }() + scheduler.DefaultCleanUpInterval = 500 * time.Millisecond + ctx, ctrl, testContext, distContext := testutil.InitTestContext(t, 3) defer ctrl.Finish() - ctx := context.Background() - ctx = util.WithInternalSourceType(ctx, "dispatcher") - - RegisterTaskMeta(t, ctrl, &m, &testDispatcherExt{}) - distContext := testkit.NewDistExecutionContext(t, 3) - require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/disttask/framework/dispatcher/WaitCleanUpFinished", "return()")) - DispatchTaskAndCheckSuccess(ctx, "key1", t, &m) - <-dispatcher.WaitCleanUpFinished + testutil.RegisterTaskMeta(t, ctrl, testutil.GetMockBasicSchedulerExt(ctrl), testContext, nil) + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/disttask/framework/scheduler/WaitCleanUpFinished", "return()")) + + // normal + submitTaskAndCheckSuccessForBasic(ctx, t, "key1", testContext) + <-scheduler.WaitCleanUpFinished mgr, err := storage.GetTaskManager() require.NoError(t, err) - tasks, err := mgr.GetGlobalTaskByKeyWithHistory(ctx, "key1") + tasks, err := mgr.GetTaskByKeyWithHistory(ctx, "key1") + require.NoError(t, err) + require.NotEmpty(t, tasks) + subtasks, err := testutil.GetSubtasksFromHistory(ctx, mgr) + require.NoError(t, err) + require.NotEmpty(t, subtasks) + + // transfer err + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/disttask/framework/scheduler/mockTransferErr", "1*return()")) + submitTaskAndCheckSuccessForBasic(ctx, t, "key2", testContext) + <-scheduler.WaitCleanUpFinished + mgr, err = storage.GetTaskManager() + require.NoError(t, err) + tasks, err = mgr.GetTaskByKeyWithHistory(ctx, "key1") require.NoError(t, err) require.NotEmpty(t, tasks) + subtasks, err = testutil.GetSubtasksFromHistory(ctx, mgr) + require.NoError(t, err) + require.NotEmpty(t, subtasks) + + distContext.Close() + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/disttask/framework/scheduler/mockTransferErr")) + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/disttask/framework/scheduler/WaitCleanUpFinished")) +} + +func TestTaskCancelledBeforeUpdateTask(t *testing.T) { + ctx, ctrl, testContext, distContext := testutil.InitTestContext(t, 1) + defer ctrl.Finish() + + testutil.RegisterTaskMeta(t, ctrl, testutil.GetMockBasicSchedulerExt(ctrl), testContext, nil) + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/disttask/framework/scheduler/cancelBeforeUpdateTask", "1*return(true)")) + task := testutil.SubmitAndWaitTask(ctx, t, "key1") + require.Equal(t, proto.TaskStateReverted, task.State) + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/disttask/framework/scheduler/cancelBeforeUpdateTask")) distContext.Close() } diff --git a/pkg/disttask/framework/handle/BUILD.bazel b/pkg/disttask/framework/handle/BUILD.bazel index dd0697e8d2f72..0d1b0f8355d9c 100644 --- a/pkg/disttask/framework/handle/BUILD.bazel +++ b/pkg/disttask/framework/handle/BUILD.bazel @@ -29,6 +29,7 @@ go_test( "//pkg/util/backoff", "@com_github_ngaut_pools//:pools", "@com_github_pingcap_errors//:errors", + "@com_github_pingcap_failpoint//:failpoint", "@com_github_pingcap_log//:log", "@com_github_stretchr_testify//require", "@com_github_tikv_client_go_v2//util", diff --git a/pkg/disttask/framework/handle/handle.go b/pkg/disttask/framework/handle/handle.go index 0f4d4630528a0..4c1605b4fb419 100644 --- a/pkg/disttask/framework/handle/handle.go +++ b/pkg/disttask/framework/handle/handle.go @@ -29,104 +29,145 @@ import ( var ( checkTaskFinishInterval = 300 * time.Millisecond + + // TaskChangedCh used to speed up task schedule, such as when task is submitted + // in the same node as the scheduler manager. + // put it here to avoid cyclic import. + TaskChangedCh = make(chan struct{}, 1) ) -// SubmitGlobalTask submits a global task. -func SubmitGlobalTask(ctx context.Context, taskKey string, taskType proto.TaskType, concurrency int, taskMeta []byte) (*proto.Task, error) { - globalTaskManager, err := storage.GetTaskManager() +// NotifyTaskChange is used to notify the scheduler manager that the task is changed, +// either a new task is submitted or a task is finished. +func NotifyTaskChange() { + select { + case TaskChangedCh <- struct{}{}: + default: + } +} + +// GetCPUCountOfManagedNode gets the CPU count of the managed node. +func GetCPUCountOfManagedNode(ctx context.Context) (int, error) { + manager, err := storage.GetTaskManager() + if err != nil { + return 0, err + } + return manager.GetCPUCountOfManagedNode(ctx) +} + +// SubmitTask submits a task. +func SubmitTask(ctx context.Context, taskKey string, taskType proto.TaskType, concurrency int, taskMeta []byte) (*proto.Task, error) { + taskManager, err := storage.GetTaskManager() + if err != nil { + return nil, err + } + task, err := taskManager.GetTaskByKeyWithHistory(ctx, taskKey) + if err != nil && err != storage.ErrTaskNotFound { + return nil, err + } + if task != nil { + return nil, storage.ErrTaskAlreadyExists + } + + taskID, err := taskManager.CreateTask(ctx, taskKey, taskType, concurrency, taskMeta) if err != nil { return nil, err } - globalTask, err := globalTaskManager.GetGlobalTaskByKey(ctx, taskKey) + + task, err = taskManager.GetTaskByID(ctx, taskID) if err != nil { return nil, err } + metrics.UpdateMetricsForAddTask(task) - if globalTask == nil { - taskID, err := globalTaskManager.AddNewGlobalTask(ctx, taskKey, taskType, concurrency, taskMeta) - if err != nil { - return nil, err - } + NotifyTaskChange() + return task, nil +} - globalTask, err = globalTaskManager.GetGlobalTaskByID(ctx, taskID) - if err != nil { - return nil, err - } +// WaitTaskDoneOrPaused waits for a task done or paused. +// this API returns error if task failed or cancelled. +func WaitTaskDoneOrPaused(ctx context.Context, id int64) error { + logger := logutil.Logger(ctx).With(zap.Int64("task-id", id)) + found, err := WaitTask(ctx, id, func(t *proto.Task) bool { + return t.IsDone() || t.State == proto.TaskStatePaused + }) + if err != nil { + return err + } - if globalTask == nil { - return nil, errors.Errorf("cannot find global task with ID %d", taskID) - } - metrics.UpdateMetricsForAddTask(globalTask) + switch found.State { + case proto.TaskStateSucceed: + return nil + case proto.TaskStateReverted: + logger.Error("task reverted", zap.Error(found.Error)) + return found.Error + case proto.TaskStatePaused: + logger.Error("task paused") + return nil + case proto.TaskStateFailed: + return errors.Errorf("task stopped with state %s, err %v", found.State, found.Error) } - return globalTask, nil + return nil } -// WaitGlobalTask waits for a global task to finish. -func WaitGlobalTask(ctx context.Context, globalTask *proto.Task) error { - globalTaskManager, err := storage.GetTaskManager() +// WaitTaskDoneByKey waits for a task done by task key. +func WaitTaskDoneByKey(ctx context.Context, taskKey string) error { + taskManager, err := storage.GetTaskManager() + if err != nil { + return err + } + task, err := taskManager.GetTaskByKeyWithHistory(ctx, taskKey) if err != nil { return err } + _, err = WaitTask(ctx, task.ID, func(t *proto.Task) bool { + return t.IsDone() + }) + return err +} + +// WaitTask waits for a task until it meets the matchFn. +func WaitTask(ctx context.Context, id int64, matchFn func(*proto.Task) bool) (*proto.Task, error) { + taskManager, err := storage.GetTaskManager() + if err != nil { + return nil, err + } ticker := time.NewTicker(checkTaskFinishInterval) defer ticker.Stop() + logger := logutil.Logger(ctx).With(zap.Int64("task-id", id)) for { select { case <-ctx.Done(): - return ctx.Err() + return nil, ctx.Err() case <-ticker.C: - found, err := globalTaskManager.GetTaskByIDWithHistory(ctx, globalTask.ID) + task, err := taskManager.GetTaskByIDWithHistory(ctx, id) if err != nil { - logutil.Logger(ctx).Error("cannot get global task during waiting", - zap.Int64("task-id", globalTask.ID), - zap.Error(err)) + logger.Error("cannot get task during waiting", zap.Error(err)) continue } - if found == nil { - return errors.Errorf("cannot find global task with ID %d", globalTask.ID) - } - switch found.State { - case proto.TaskStateSucceed: - return nil - case proto.TaskStateReverted: - logutil.BgLogger().Error("global task reverted", zap.Int64("task-id", globalTask.ID), zap.Error(found.Error)) - return found.Error - case proto.TaskStatePaused: - logutil.BgLogger().Error("global task paused", zap.Int64("task-id", globalTask.ID)) - return nil - case proto.TaskStateFailed, proto.TaskStateCanceled: - return errors.Errorf("task stopped with state %s, err %v", found.State, found.Error) + if matchFn(task) { + return task, nil } } } } -// SubmitAndRunGlobalTask submits a global task and wait for it to finish. -func SubmitAndRunGlobalTask(ctx context.Context, taskKey string, taskType proto.TaskType, concurrency int, taskMeta []byte) error { - globalTask, err := SubmitGlobalTask(ctx, taskKey, taskType, concurrency, taskMeta) - if err != nil { - return err - } - return WaitGlobalTask(ctx, globalTask) -} - -// CancelGlobalTask cancels a global task. -func CancelGlobalTask(ctx context.Context, taskKey string) error { +// CancelTask cancels a task. +func CancelTask(ctx context.Context, taskKey string) error { taskManager, err := storage.GetTaskManager() if err != nil { return err } - task, err := taskManager.GetGlobalTaskByKey(ctx, taskKey) + task, err := taskManager.GetTaskByKey(ctx, taskKey) if err != nil { + if err == storage.ErrTaskNotFound { + logutil.BgLogger().Info("task not exist", zap.String("taskKey", taskKey)) + return nil + } return err } - if task == nil { - logutil.BgLogger().Info("task not exist", zap.String("taskKey", taskKey)) - - return nil - } - return taskManager.CancelGlobalTask(ctx, task.ID) + return taskManager.CancelTask(ctx, task.ID) } // PauseTask pauses a task. diff --git a/pkg/disttask/framework/handle/handle_test.go b/pkg/disttask/framework/handle/handle_test.go index 65e2eaa52c42b..260cf05167a2a 100644 --- a/pkg/disttask/framework/handle/handle_test.go +++ b/pkg/disttask/framework/handle/handle_test.go @@ -23,6 +23,7 @@ import ( "github.com/ngaut/pools" "github.com/pingcap/errors" + "github.com/pingcap/failpoint" "github.com/pingcap/log" "github.com/pingcap/tidb/pkg/disttask/framework/handle" "github.com/pingcap/tidb/pkg/disttask/framework/proto" @@ -34,8 +35,12 @@ import ( ) func TestHandle(t *testing.T) { - ctx := context.Background() - ctx = util.WithInternalSourceType(ctx, "handle_test") + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/util/cpu/mockNumCpu", "return(8)")) + t.Cleanup(func() { + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/util/cpu/mockNumCpu")) + }) + + ctx := util.WithInternalSourceType(context.Background(), "handle_test") store := testkit.CreateMockStore(t) gtk := testkit.NewTestKit(t, store) @@ -46,27 +51,50 @@ func TestHandle(t *testing.T) { mgr := storage.NewTaskManager(pool) storage.SetTaskManager(mgr) - // no dispatcher registered - err := handle.SubmitAndRunGlobalTask(ctx, "1", proto.TaskTypeExample, 2, []byte("byte")) - require.Error(t, err) + // no scheduler registered + task, err := handle.SubmitTask(ctx, "1", proto.TaskTypeExample, 2, proto.EmptyMeta) + require.NoError(t, err) + waitedTask, err := handle.WaitTask(ctx, task.ID, func(task *proto.Task) bool { + return task.IsDone() + }) + require.NoError(t, err) + require.Equal(t, proto.TaskStateFailed, waitedTask.State) + require.ErrorContains(t, waitedTask.Error, "unknown task type") - task, err := mgr.GetGlobalTaskByID(ctx, 1) + task, err = mgr.GetTaskByID(ctx, 1) require.NoError(t, err) require.Equal(t, int64(1), task.ID) require.Equal(t, "1", task.Key) require.Equal(t, proto.TaskTypeExample, task.Type) - // no dispatcher registered + // no scheduler registered. require.Equal(t, proto.TaskStateFailed, task.State) require.Equal(t, proto.StepInit, task.Step) - require.Equal(t, uint64(2), task.Concurrency) - require.Equal(t, []byte("byte"), task.Meta) + require.Equal(t, 2, task.Concurrency) + require.Equal(t, proto.EmptyMeta, task.Meta) - require.NoError(t, handle.CancelGlobalTask(ctx, "1")) + require.NoError(t, handle.CancelTask(ctx, "1")) - task, err = handle.SubmitGlobalTask(ctx, "2", proto.TaskTypeExample, 2, []byte("byte")) + task, err = handle.SubmitTask(ctx, "2", proto.TaskTypeExample, 2, proto.EmptyMeta) require.NoError(t, err) + require.Equal(t, int64(2), task.ID) + require.Equal(t, "2", task.Key) + + // submit same task. + task, err = handle.SubmitTask(ctx, "2", proto.TaskTypeExample, 2, proto.EmptyMeta) + require.Nil(t, task) + require.Error(t, storage.ErrTaskAlreadyExists, err) + // pause and resume task. require.NoError(t, handle.PauseTask(ctx, "2")) require.NoError(t, handle.ResumeTask(ctx, "2")) + + // submit task with same key + task, err = handle.SubmitTask(ctx, "3", proto.TaskTypeExample, 2, proto.EmptyMeta) + require.NoError(t, err) + require.Equal(t, int64(3), task.ID) + require.NoError(t, mgr.TransferTasks2History(ctx, []*proto.Task{task})) + task, err = handle.SubmitTask(ctx, "3", proto.TaskTypeExample, 2, proto.EmptyMeta) + require.Nil(t, task) + require.Error(t, storage.ErrTaskAlreadyExists, err) } func TestRunWithRetry(t *testing.T) { @@ -93,9 +121,7 @@ func TestRunWithRetry(t *testing.T) { ) require.Error(t, err) }() - require.Eventually(t, func() bool { - return end.Load() - }, 5*time.Second, 100*time.Millisecond) + require.Eventually(t, end.Load, 5*time.Second, 100*time.Millisecond) // fail with retryable error once, then success end.Store(false) @@ -114,9 +140,7 @@ func TestRunWithRetry(t *testing.T) { ) require.NoError(t, err) }() - require.Eventually(t, func() bool { - return end.Load() - }, 5*time.Second, 100*time.Millisecond) + require.Eventually(t, end.Load, 5*time.Second, 100*time.Millisecond) // context done subctx, cancel := context.WithCancel(ctx) diff --git a/pkg/disttask/framework/mock/BUILD.bazel b/pkg/disttask/framework/mock/BUILD.bazel index cbf798512d97b..20b7f0379b257 100644 --- a/pkg/disttask/framework/mock/BUILD.bazel +++ b/pkg/disttask/framework/mock/BUILD.bazel @@ -3,16 +3,17 @@ load("@io_bazel_rules_go//go:def.bzl", "go_library") go_library( name = "mock", srcs = [ - "dispatcher_mock.go", "plan_mock.go", "scheduler_mock.go", + "task_executor_mock.go", ], importpath = "github.com/pingcap/tidb/pkg/disttask/framework/mock", visibility = ["//visibility:public"], deps = [ "//pkg/disttask/framework/planner", "//pkg/disttask/framework/proto", - "//pkg/disttask/framework/scheduler/execute", + "//pkg/disttask/framework/storage", + "//pkg/disttask/framework/taskexecutor/execute", "//pkg/sessionctx", "@org_uber_go_mock//gomock", ], diff --git a/pkg/disttask/framework/mock/dispatcher_mock.go b/pkg/disttask/framework/mock/dispatcher_mock.go deleted file mode 100644 index fc1e11f60a5e8..0000000000000 --- a/pkg/disttask/framework/mock/dispatcher_mock.go +++ /dev/null @@ -1,436 +0,0 @@ -// Code generated by MockGen. DO NOT EDIT. -// Source: github.com/pingcap/tidb/pkg/disttask/framework/dispatcher (interfaces: Dispatcher,CleanUpRoutine,TaskManager) - -// Package mock is a generated GoMock package. -package mock - -import ( - context "context" - reflect "reflect" - - proto "github.com/pingcap/tidb/pkg/disttask/framework/proto" - sessionctx "github.com/pingcap/tidb/pkg/sessionctx" - gomock "go.uber.org/mock/gomock" -) - -// MockDispatcher is a mock of Dispatcher interface. -type MockDispatcher struct { - ctrl *gomock.Controller - recorder *MockDispatcherMockRecorder -} - -// MockDispatcherMockRecorder is the mock recorder for MockDispatcher. -type MockDispatcherMockRecorder struct { - mock *MockDispatcher -} - -// NewMockDispatcher creates a new mock instance. -func NewMockDispatcher(ctrl *gomock.Controller) *MockDispatcher { - mock := &MockDispatcher{ctrl: ctrl} - mock.recorder = &MockDispatcherMockRecorder{mock} - return mock -} - -// EXPECT returns an object that allows the caller to indicate expected use. -func (m *MockDispatcher) EXPECT() *MockDispatcherMockRecorder { - return m.recorder -} - -// Close mocks base method. -func (m *MockDispatcher) Close() { - m.ctrl.T.Helper() - m.ctrl.Call(m, "Close") -} - -// Close indicates an expected call of Close. -func (mr *MockDispatcherMockRecorder) Close() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Close", reflect.TypeOf((*MockDispatcher)(nil).Close)) -} - -// ExecuteTask mocks base method. -func (m *MockDispatcher) ExecuteTask() { - m.ctrl.T.Helper() - m.ctrl.Call(m, "ExecuteTask") -} - -// ExecuteTask indicates an expected call of ExecuteTask. -func (mr *MockDispatcherMockRecorder) ExecuteTask() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ExecuteTask", reflect.TypeOf((*MockDispatcher)(nil).ExecuteTask)) -} - -// Init mocks base method. -func (m *MockDispatcher) Init() error { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Init") - ret0, _ := ret[0].(error) - return ret0 -} - -// Init indicates an expected call of Init. -func (mr *MockDispatcherMockRecorder) Init() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Init", reflect.TypeOf((*MockDispatcher)(nil).Init)) -} - -// MockCleanUpRoutine is a mock of CleanUpRoutine interface. -type MockCleanUpRoutine struct { - ctrl *gomock.Controller - recorder *MockCleanUpRoutineMockRecorder -} - -// MockCleanUpRoutineMockRecorder is the mock recorder for MockCleanUpRoutine. -type MockCleanUpRoutineMockRecorder struct { - mock *MockCleanUpRoutine -} - -// NewMockCleanUpRoutine creates a new mock instance. -func NewMockCleanUpRoutine(ctrl *gomock.Controller) *MockCleanUpRoutine { - mock := &MockCleanUpRoutine{ctrl: ctrl} - mock.recorder = &MockCleanUpRoutineMockRecorder{mock} - return mock -} - -// EXPECT returns an object that allows the caller to indicate expected use. -func (m *MockCleanUpRoutine) EXPECT() *MockCleanUpRoutineMockRecorder { - return m.recorder -} - -// CleanUp mocks base method. -func (m *MockCleanUpRoutine) CleanUp(arg0 context.Context, arg1 *proto.Task) error { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "CleanUp", arg0, arg1) - ret0, _ := ret[0].(error) - return ret0 -} - -// CleanUp indicates an expected call of CleanUp. -func (mr *MockCleanUpRoutineMockRecorder) CleanUp(arg0, arg1 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CleanUp", reflect.TypeOf((*MockCleanUpRoutine)(nil).CleanUp), arg0, arg1) -} - -// MockTaskManager is a mock of TaskManager interface. -type MockTaskManager struct { - ctrl *gomock.Controller - recorder *MockTaskManagerMockRecorder -} - -// MockTaskManagerMockRecorder is the mock recorder for MockTaskManager. -type MockTaskManagerMockRecorder struct { - mock *MockTaskManager -} - -// NewMockTaskManager creates a new mock instance. -func NewMockTaskManager(ctrl *gomock.Controller) *MockTaskManager { - mock := &MockTaskManager{ctrl: ctrl} - mock.recorder = &MockTaskManagerMockRecorder{mock} - return mock -} - -// EXPECT returns an object that allows the caller to indicate expected use. -func (m *MockTaskManager) EXPECT() *MockTaskManagerMockRecorder { - return m.recorder -} - -// CancelGlobalTask mocks base method. -func (m *MockTaskManager) CancelGlobalTask(arg0 context.Context, arg1 int64) error { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "CancelGlobalTask", arg0, arg1) - ret0, _ := ret[0].(error) - return ret0 -} - -// CancelGlobalTask indicates an expected call of CancelGlobalTask. -func (mr *MockTaskManagerMockRecorder) CancelGlobalTask(arg0, arg1 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CancelGlobalTask", reflect.TypeOf((*MockTaskManager)(nil).CancelGlobalTask), arg0, arg1) -} - -// CleanUpMeta mocks base method. -func (m *MockTaskManager) CleanUpMeta(arg0 context.Context, arg1 []string) error { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "CleanUpMeta", arg0, arg1) - ret0, _ := ret[0].(error) - return ret0 -} - -// CleanUpMeta indicates an expected call of CleanUpMeta. -func (mr *MockTaskManagerMockRecorder) CleanUpMeta(arg0, arg1 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CleanUpMeta", reflect.TypeOf((*MockTaskManager)(nil).CleanUpMeta), arg0, arg1) -} - -// CollectSubTaskError mocks base method. -func (m *MockTaskManager) CollectSubTaskError(arg0 context.Context, arg1 int64) ([]error, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "CollectSubTaskError", arg0, arg1) - ret0, _ := ret[0].([]error) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// CollectSubTaskError indicates an expected call of CollectSubTaskError. -func (mr *MockTaskManagerMockRecorder) CollectSubTaskError(arg0, arg1 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CollectSubTaskError", reflect.TypeOf((*MockTaskManager)(nil).CollectSubTaskError), arg0, arg1) -} - -// GCSubtasks mocks base method. -func (m *MockTaskManager) GCSubtasks(arg0 context.Context) error { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GCSubtasks", arg0) - ret0, _ := ret[0].(error) - return ret0 -} - -// GCSubtasks indicates an expected call of GCSubtasks. -func (mr *MockTaskManagerMockRecorder) GCSubtasks(arg0 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GCSubtasks", reflect.TypeOf((*MockTaskManager)(nil).GCSubtasks), arg0) -} - -// GetAllNodes mocks base method. -func (m *MockTaskManager) GetAllNodes(arg0 context.Context) ([]string, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetAllNodes", arg0) - ret0, _ := ret[0].([]string) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// GetAllNodes indicates an expected call of GetAllNodes. -func (mr *MockTaskManagerMockRecorder) GetAllNodes(arg0 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetAllNodes", reflect.TypeOf((*MockTaskManager)(nil).GetAllNodes), arg0) -} - -// GetGlobalTaskByID mocks base method. -func (m *MockTaskManager) GetGlobalTaskByID(arg0 context.Context, arg1 int64) (*proto.Task, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetGlobalTaskByID", arg0, arg1) - ret0, _ := ret[0].(*proto.Task) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// GetGlobalTaskByID indicates an expected call of GetGlobalTaskByID. -func (mr *MockTaskManagerMockRecorder) GetGlobalTaskByID(arg0, arg1 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetGlobalTaskByID", reflect.TypeOf((*MockTaskManager)(nil).GetGlobalTaskByID), arg0, arg1) -} - -// GetGlobalTasksInStates mocks base method. -func (m *MockTaskManager) GetGlobalTasksInStates(arg0 context.Context, arg1 ...interface{}) ([]*proto.Task, error) { - m.ctrl.T.Helper() - varargs := []interface{}{arg0} - for _, a := range arg1 { - varargs = append(varargs, a) - } - ret := m.ctrl.Call(m, "GetGlobalTasksInStates", varargs...) - ret0, _ := ret[0].([]*proto.Task) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// GetGlobalTasksInStates indicates an expected call of GetGlobalTasksInStates. -func (mr *MockTaskManagerMockRecorder) GetGlobalTasksInStates(arg0 interface{}, arg1 ...interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - varargs := append([]interface{}{arg0}, arg1...) - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetGlobalTasksInStates", reflect.TypeOf((*MockTaskManager)(nil).GetGlobalTasksInStates), varargs...) -} - -// GetNodesByRole mocks base method. -func (m *MockTaskManager) GetNodesByRole(arg0 context.Context, arg1 string) (map[string]bool, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetNodesByRole", arg0, arg1) - ret0, _ := ret[0].(map[string]bool) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// GetNodesByRole indicates an expected call of GetNodesByRole. -func (mr *MockTaskManagerMockRecorder) GetNodesByRole(arg0, arg1 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetNodesByRole", reflect.TypeOf((*MockTaskManager)(nil).GetNodesByRole), arg0, arg1) -} - -// GetSchedulerIDsByTaskID mocks base method. -func (m *MockTaskManager) GetSchedulerIDsByTaskID(arg0 context.Context, arg1 int64) ([]string, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetSchedulerIDsByTaskID", arg0, arg1) - ret0, _ := ret[0].([]string) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// GetSchedulerIDsByTaskID indicates an expected call of GetSchedulerIDsByTaskID. -func (mr *MockTaskManagerMockRecorder) GetSchedulerIDsByTaskID(arg0, arg1 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetSchedulerIDsByTaskID", reflect.TypeOf((*MockTaskManager)(nil).GetSchedulerIDsByTaskID), arg0, arg1) -} - -// GetSchedulerIDsByTaskIDAndStep mocks base method. -func (m *MockTaskManager) GetSchedulerIDsByTaskIDAndStep(arg0 context.Context, arg1 int64, arg2 proto.Step) ([]string, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetSchedulerIDsByTaskIDAndStep", arg0, arg1, arg2) - ret0, _ := ret[0].([]string) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// GetSchedulerIDsByTaskIDAndStep indicates an expected call of GetSchedulerIDsByTaskIDAndStep. -func (mr *MockTaskManagerMockRecorder) GetSchedulerIDsByTaskIDAndStep(arg0, arg1, arg2 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetSchedulerIDsByTaskIDAndStep", reflect.TypeOf((*MockTaskManager)(nil).GetSchedulerIDsByTaskIDAndStep), arg0, arg1, arg2) -} - -// GetSubtaskInStatesCnt mocks base method. -func (m *MockTaskManager) GetSubtaskInStatesCnt(arg0 context.Context, arg1 int64, arg2 ...interface{}) (int64, error) { - m.ctrl.T.Helper() - varargs := []interface{}{arg0, arg1} - for _, a := range arg2 { - varargs = append(varargs, a) - } - ret := m.ctrl.Call(m, "GetSubtaskInStatesCnt", varargs...) - ret0, _ := ret[0].(int64) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// GetSubtaskInStatesCnt indicates an expected call of GetSubtaskInStatesCnt. -func (mr *MockTaskManagerMockRecorder) GetSubtaskInStatesCnt(arg0, arg1 interface{}, arg2 ...interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - varargs := append([]interface{}{arg0, arg1}, arg2...) - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetSubtaskInStatesCnt", reflect.TypeOf((*MockTaskManager)(nil).GetSubtaskInStatesCnt), varargs...) -} - -// GetSucceedSubtasksByStep mocks base method. -func (m *MockTaskManager) GetSucceedSubtasksByStep(arg0 context.Context, arg1 int64, arg2 proto.Step) ([]*proto.Subtask, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetSucceedSubtasksByStep", arg0, arg1, arg2) - ret0, _ := ret[0].([]*proto.Subtask) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// GetSucceedSubtasksByStep indicates an expected call of GetSucceedSubtasksByStep. -func (mr *MockTaskManagerMockRecorder) GetSucceedSubtasksByStep(arg0, arg1, arg2 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetSucceedSubtasksByStep", reflect.TypeOf((*MockTaskManager)(nil).GetSucceedSubtasksByStep), arg0, arg1, arg2) -} - -// PauseTask mocks base method. -func (m *MockTaskManager) PauseTask(arg0 context.Context, arg1 string) (bool, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "PauseTask", arg0, arg1) - ret0, _ := ret[0].(bool) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// PauseTask indicates an expected call of PauseTask. -func (mr *MockTaskManagerMockRecorder) PauseTask(arg0, arg1 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PauseTask", reflect.TypeOf((*MockTaskManager)(nil).PauseTask), arg0, arg1) -} - -// ResumeSubtasks mocks base method. -func (m *MockTaskManager) ResumeSubtasks(arg0 context.Context, arg1 int64) error { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "ResumeSubtasks", arg0, arg1) - ret0, _ := ret[0].(error) - return ret0 -} - -// ResumeSubtasks indicates an expected call of ResumeSubtasks. -func (mr *MockTaskManagerMockRecorder) ResumeSubtasks(arg0, arg1 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ResumeSubtasks", reflect.TypeOf((*MockTaskManager)(nil).ResumeSubtasks), arg0, arg1) -} - -// TransferSubTasks2History mocks base method. -func (m *MockTaskManager) TransferSubTasks2History(arg0 context.Context, arg1 int64) error { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "TransferSubTasks2History", arg0, arg1) - ret0, _ := ret[0].(error) - return ret0 -} - -// TransferSubTasks2History indicates an expected call of TransferSubTasks2History. -func (mr *MockTaskManagerMockRecorder) TransferSubTasks2History(arg0, arg1 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "TransferSubTasks2History", reflect.TypeOf((*MockTaskManager)(nil).TransferSubTasks2History), arg0, arg1) -} - -// TransferTasks2History mocks base method. -func (m *MockTaskManager) TransferTasks2History(arg0 context.Context, arg1 []*proto.Task) error { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "TransferTasks2History", arg0, arg1) - ret0, _ := ret[0].(error) - return ret0 -} - -// TransferTasks2History indicates an expected call of TransferTasks2History. -func (mr *MockTaskManagerMockRecorder) TransferTasks2History(arg0, arg1 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "TransferTasks2History", reflect.TypeOf((*MockTaskManager)(nil).TransferTasks2History), arg0, arg1) -} - -// UpdateFailedSchedulerIDs mocks base method. -func (m *MockTaskManager) UpdateFailedSchedulerIDs(arg0 context.Context, arg1 int64, arg2 map[string]string) error { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "UpdateFailedSchedulerIDs", arg0, arg1, arg2) - ret0, _ := ret[0].(error) - return ret0 -} - -// UpdateFailedSchedulerIDs indicates an expected call of UpdateFailedSchedulerIDs. -func (mr *MockTaskManagerMockRecorder) UpdateFailedSchedulerIDs(arg0, arg1, arg2 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateFailedSchedulerIDs", reflect.TypeOf((*MockTaskManager)(nil).UpdateFailedSchedulerIDs), arg0, arg1, arg2) -} - -// UpdateGlobalTaskAndAddSubTasks mocks base method. -func (m *MockTaskManager) UpdateGlobalTaskAndAddSubTasks(arg0 context.Context, arg1 *proto.Task, arg2 []*proto.Subtask, arg3 proto.TaskState) (bool, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "UpdateGlobalTaskAndAddSubTasks", arg0, arg1, arg2, arg3) - ret0, _ := ret[0].(bool) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// UpdateGlobalTaskAndAddSubTasks indicates an expected call of UpdateGlobalTaskAndAddSubTasks. -func (mr *MockTaskManagerMockRecorder) UpdateGlobalTaskAndAddSubTasks(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateGlobalTaskAndAddSubTasks", reflect.TypeOf((*MockTaskManager)(nil).UpdateGlobalTaskAndAddSubTasks), arg0, arg1, arg2, arg3) -} - -// WithNewSession mocks base method. -func (m *MockTaskManager) WithNewSession(arg0 func(sessionctx.Context) error) error { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "WithNewSession", arg0) - ret0, _ := ret[0].(error) - return ret0 -} - -// WithNewSession indicates an expected call of WithNewSession. -func (mr *MockTaskManagerMockRecorder) WithNewSession(arg0 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WithNewSession", reflect.TypeOf((*MockTaskManager)(nil).WithNewSession), arg0) -} - -// WithNewTxn mocks base method. -func (m *MockTaskManager) WithNewTxn(arg0 context.Context, arg1 func(sessionctx.Context) error) error { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "WithNewTxn", arg0, arg1) - ret0, _ := ret[0].(error) - return ret0 -} - -// WithNewTxn indicates an expected call of WithNewTxn. -func (mr *MockTaskManagerMockRecorder) WithNewTxn(arg0, arg1 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WithNewTxn", reflect.TypeOf((*MockTaskManager)(nil).WithNewTxn), arg0, arg1) -} diff --git a/pkg/disttask/framework/mock/execute/execute_mock.go b/pkg/disttask/framework/mock/execute/execute_mock.go index b3e6b249c0e44..4aaeab1e2b77c 100644 --- a/pkg/disttask/framework/mock/execute/execute_mock.go +++ b/pkg/disttask/framework/mock/execute/execute_mock.go @@ -1,6 +1,10 @@ // Code generated by MockGen. DO NOT EDIT. -// Source: github.com/pingcap/tidb/pkg/disttask/framework/scheduler/execute (interfaces: SubtaskExecutor) - +// Source: github.com/pingcap/tidb/pkg/disttask/framework/taskexecutor/execute (interfaces: StepExecutor) +// +// Generated by this command: +// +// mockgen -package execute github.com/pingcap/tidb/pkg/disttask/framework/taskexecutor/execute StepExecutor +// // Package execute is a generated GoMock package. package execute @@ -12,31 +16,31 @@ import ( gomock "go.uber.org/mock/gomock" ) -// MockSubtaskExecutor is a mock of SubtaskExecutor interface. -type MockSubtaskExecutor struct { +// MockStepExecutor is a mock of StepExecutor interface. +type MockStepExecutor struct { ctrl *gomock.Controller - recorder *MockSubtaskExecutorMockRecorder + recorder *MockStepExecutorMockRecorder } -// MockSubtaskExecutorMockRecorder is the mock recorder for MockSubtaskExecutor. -type MockSubtaskExecutorMockRecorder struct { - mock *MockSubtaskExecutor +// MockStepExecutorMockRecorder is the mock recorder for MockStepExecutor. +type MockStepExecutorMockRecorder struct { + mock *MockStepExecutor } -// NewMockSubtaskExecutor creates a new mock instance. -func NewMockSubtaskExecutor(ctrl *gomock.Controller) *MockSubtaskExecutor { - mock := &MockSubtaskExecutor{ctrl: ctrl} - mock.recorder = &MockSubtaskExecutorMockRecorder{mock} +// NewMockStepExecutor creates a new mock instance. +func NewMockStepExecutor(ctrl *gomock.Controller) *MockStepExecutor { + mock := &MockStepExecutor{ctrl: ctrl} + mock.recorder = &MockStepExecutorMockRecorder{mock} return mock } // EXPECT returns an object that allows the caller to indicate expected use. -func (m *MockSubtaskExecutor) EXPECT() *MockSubtaskExecutorMockRecorder { +func (m *MockStepExecutor) EXPECT() *MockStepExecutorMockRecorder { return m.recorder } // Cleanup mocks base method. -func (m *MockSubtaskExecutor) Cleanup(arg0 context.Context) error { +func (m *MockStepExecutor) Cleanup(arg0 context.Context) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Cleanup", arg0) ret0, _ := ret[0].(error) @@ -44,13 +48,13 @@ func (m *MockSubtaskExecutor) Cleanup(arg0 context.Context) error { } // Cleanup indicates an expected call of Cleanup. -func (mr *MockSubtaskExecutorMockRecorder) Cleanup(arg0 interface{}) *gomock.Call { +func (mr *MockStepExecutorMockRecorder) Cleanup(arg0 any) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Cleanup", reflect.TypeOf((*MockSubtaskExecutor)(nil).Cleanup), arg0) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Cleanup", reflect.TypeOf((*MockStepExecutor)(nil).Cleanup), arg0) } // Init mocks base method. -func (m *MockSubtaskExecutor) Init(arg0 context.Context) error { +func (m *MockStepExecutor) Init(arg0 context.Context) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Init", arg0) ret0, _ := ret[0].(error) @@ -58,13 +62,13 @@ func (m *MockSubtaskExecutor) Init(arg0 context.Context) error { } // Init indicates an expected call of Init. -func (mr *MockSubtaskExecutorMockRecorder) Init(arg0 interface{}) *gomock.Call { +func (mr *MockStepExecutorMockRecorder) Init(arg0 any) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Init", reflect.TypeOf((*MockSubtaskExecutor)(nil).Init), arg0) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Init", reflect.TypeOf((*MockStepExecutor)(nil).Init), arg0) } // OnFinished mocks base method. -func (m *MockSubtaskExecutor) OnFinished(arg0 context.Context, arg1 *proto.Subtask) error { +func (m *MockStepExecutor) OnFinished(arg0 context.Context, arg1 *proto.Subtask) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "OnFinished", arg0, arg1) ret0, _ := ret[0].(error) @@ -72,13 +76,13 @@ func (m *MockSubtaskExecutor) OnFinished(arg0 context.Context, arg1 *proto.Subta } // OnFinished indicates an expected call of OnFinished. -func (mr *MockSubtaskExecutorMockRecorder) OnFinished(arg0, arg1 interface{}) *gomock.Call { +func (mr *MockStepExecutorMockRecorder) OnFinished(arg0, arg1 any) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "OnFinished", reflect.TypeOf((*MockSubtaskExecutor)(nil).OnFinished), arg0, arg1) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "OnFinished", reflect.TypeOf((*MockStepExecutor)(nil).OnFinished), arg0, arg1) } // Rollback mocks base method. -func (m *MockSubtaskExecutor) Rollback(arg0 context.Context) error { +func (m *MockStepExecutor) Rollback(arg0 context.Context) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Rollback", arg0) ret0, _ := ret[0].(error) @@ -86,13 +90,13 @@ func (m *MockSubtaskExecutor) Rollback(arg0 context.Context) error { } // Rollback indicates an expected call of Rollback. -func (mr *MockSubtaskExecutorMockRecorder) Rollback(arg0 interface{}) *gomock.Call { +func (mr *MockStepExecutorMockRecorder) Rollback(arg0 any) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Rollback", reflect.TypeOf((*MockSubtaskExecutor)(nil).Rollback), arg0) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Rollback", reflect.TypeOf((*MockStepExecutor)(nil).Rollback), arg0) } // RunSubtask mocks base method. -func (m *MockSubtaskExecutor) RunSubtask(arg0 context.Context, arg1 *proto.Subtask) error { +func (m *MockStepExecutor) RunSubtask(arg0 context.Context, arg1 *proto.Subtask) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "RunSubtask", arg0, arg1) ret0, _ := ret[0].(error) @@ -100,7 +104,7 @@ func (m *MockSubtaskExecutor) RunSubtask(arg0 context.Context, arg1 *proto.Subta } // RunSubtask indicates an expected call of RunSubtask. -func (mr *MockSubtaskExecutorMockRecorder) RunSubtask(arg0, arg1 interface{}) *gomock.Call { +func (mr *MockStepExecutorMockRecorder) RunSubtask(arg0, arg1 any) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RunSubtask", reflect.TypeOf((*MockSubtaskExecutor)(nil).RunSubtask), arg0, arg1) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RunSubtask", reflect.TypeOf((*MockStepExecutor)(nil).RunSubtask), arg0, arg1) } diff --git a/pkg/disttask/framework/mock/plan_mock.go b/pkg/disttask/framework/mock/plan_mock.go index f6ce74c24ee68..1192073675f11 100644 --- a/pkg/disttask/framework/mock/plan_mock.go +++ b/pkg/disttask/framework/mock/plan_mock.go @@ -1,6 +1,10 @@ // Code generated by MockGen. DO NOT EDIT. // Source: github.com/pingcap/tidb/pkg/disttask/framework/planner (interfaces: LogicalPlan,PipelineSpec) - +// +// Generated by this command: +// +// mockgen -package mock github.com/pingcap/tidb/pkg/disttask/framework/planner LogicalPlan,PipelineSpec +// // Package mock is a generated GoMock package. package mock @@ -43,7 +47,7 @@ func (m *MockLogicalPlan) FromTaskMeta(arg0 []byte) error { } // FromTaskMeta indicates an expected call of FromTaskMeta. -func (mr *MockLogicalPlanMockRecorder) FromTaskMeta(arg0 interface{}) *gomock.Call { +func (mr *MockLogicalPlanMockRecorder) FromTaskMeta(arg0 any) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FromTaskMeta", reflect.TypeOf((*MockLogicalPlan)(nil).FromTaskMeta), arg0) } @@ -58,7 +62,7 @@ func (m *MockLogicalPlan) ToPhysicalPlan(arg0 planner.PlanCtx) (*planner.Physica } // ToPhysicalPlan indicates an expected call of ToPhysicalPlan. -func (mr *MockLogicalPlanMockRecorder) ToPhysicalPlan(arg0 interface{}) *gomock.Call { +func (mr *MockLogicalPlanMockRecorder) ToPhysicalPlan(arg0 any) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ToPhysicalPlan", reflect.TypeOf((*MockLogicalPlan)(nil).ToPhysicalPlan), arg0) } @@ -111,7 +115,7 @@ func (m *MockPipelineSpec) ToSubtaskMeta(arg0 planner.PlanCtx) ([]byte, error) { } // ToSubtaskMeta indicates an expected call of ToSubtaskMeta. -func (mr *MockPipelineSpecMockRecorder) ToSubtaskMeta(arg0 interface{}) *gomock.Call { +func (mr *MockPipelineSpecMockRecorder) ToSubtaskMeta(arg0 any) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ToSubtaskMeta", reflect.TypeOf((*MockPipelineSpec)(nil).ToSubtaskMeta), arg0) } diff --git a/pkg/disttask/framework/mock/scheduler_mock.go b/pkg/disttask/framework/mock/scheduler_mock.go index 3639eb4f7a631..57002fbd44fcd 100644 --- a/pkg/disttask/framework/mock/scheduler_mock.go +++ b/pkg/disttask/framework/mock/scheduler_mock.go @@ -1,6 +1,10 @@ // Code generated by MockGen. DO NOT EDIT. -// Source: github.com/pingcap/tidb/pkg/disttask/framework/scheduler (interfaces: TaskTable,Pool,Scheduler,Extension) - +// Source: github.com/pingcap/tidb/pkg/disttask/framework/scheduler (interfaces: Scheduler,CleanUpRoutine,TaskManager) +// +// Generated by this command: +// +// mockgen -package mock github.com/pingcap/tidb/pkg/disttask/framework/scheduler Scheduler,CleanUpRoutine,TaskManager +// // Package mock is a generated GoMock package. package mock @@ -9,429 +13,622 @@ import ( reflect "reflect" proto "github.com/pingcap/tidb/pkg/disttask/framework/proto" - execute "github.com/pingcap/tidb/pkg/disttask/framework/scheduler/execute" + storage "github.com/pingcap/tidb/pkg/disttask/framework/storage" + sessionctx "github.com/pingcap/tidb/pkg/sessionctx" gomock "go.uber.org/mock/gomock" ) -// MockTaskTable is a mock of TaskTable interface. -type MockTaskTable struct { +// MockScheduler is a mock of Scheduler interface. +type MockScheduler struct { ctrl *gomock.Controller - recorder *MockTaskTableMockRecorder + recorder *MockSchedulerMockRecorder } -// MockTaskTableMockRecorder is the mock recorder for MockTaskTable. -type MockTaskTableMockRecorder struct { - mock *MockTaskTable +// MockSchedulerMockRecorder is the mock recorder for MockScheduler. +type MockSchedulerMockRecorder struct { + mock *MockScheduler } -// NewMockTaskTable creates a new mock instance. -func NewMockTaskTable(ctrl *gomock.Controller) *MockTaskTable { - mock := &MockTaskTable{ctrl: ctrl} - mock.recorder = &MockTaskTableMockRecorder{mock} +// NewMockScheduler creates a new mock instance. +func NewMockScheduler(ctrl *gomock.Controller) *MockScheduler { + mock := &MockScheduler{ctrl: ctrl} + mock.recorder = &MockSchedulerMockRecorder{mock} return mock } // EXPECT returns an object that allows the caller to indicate expected use. -func (m *MockTaskTable) EXPECT() *MockTaskTableMockRecorder { +func (m *MockScheduler) EXPECT() *MockSchedulerMockRecorder { return m.recorder } -// FinishSubtask mocks base method. -func (m *MockTaskTable) FinishSubtask(arg0 context.Context, arg1 string, arg2 int64, arg3 []byte) error { +// Close mocks base method. +func (m *MockScheduler) Close() { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "FinishSubtask", arg0, arg1, arg2, arg3) - ret0, _ := ret[0].(error) - return ret0 + m.ctrl.Call(m, "Close") } -// FinishSubtask indicates an expected call of FinishSubtask. -func (mr *MockTaskTableMockRecorder) FinishSubtask(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { +// Close indicates an expected call of Close. +func (mr *MockSchedulerMockRecorder) Close() *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FinishSubtask", reflect.TypeOf((*MockTaskTable)(nil).FinishSubtask), arg0, arg1, arg2, arg3) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Close", reflect.TypeOf((*MockScheduler)(nil).Close)) } -// GetFirstSubtaskInStates mocks base method. -func (m *MockTaskTable) GetFirstSubtaskInStates(arg0 context.Context, arg1 string, arg2 int64, arg3 proto.Step, arg4 ...interface{}) (*proto.Subtask, error) { +// GetEligibleInstances mocks base method. +func (m *MockScheduler) GetEligibleInstances(arg0 context.Context, arg1 *proto.Task) ([]string, error) { m.ctrl.T.Helper() - varargs := []interface{}{arg0, arg1, arg2, arg3} - for _, a := range arg4 { - varargs = append(varargs, a) - } - ret := m.ctrl.Call(m, "GetFirstSubtaskInStates", varargs...) - ret0, _ := ret[0].(*proto.Subtask) + ret := m.ctrl.Call(m, "GetEligibleInstances", arg0, arg1) + ret0, _ := ret[0].([]string) ret1, _ := ret[1].(error) return ret0, ret1 } -// GetFirstSubtaskInStates indicates an expected call of GetFirstSubtaskInStates. -func (mr *MockTaskTableMockRecorder) GetFirstSubtaskInStates(arg0, arg1, arg2, arg3 interface{}, arg4 ...interface{}) *gomock.Call { +// GetEligibleInstances indicates an expected call of GetEligibleInstances. +func (mr *MockSchedulerMockRecorder) GetEligibleInstances(arg0, arg1 any) *gomock.Call { mr.mock.ctrl.T.Helper() - varargs := append([]interface{}{arg0, arg1, arg2, arg3}, arg4...) - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetFirstSubtaskInStates", reflect.TypeOf((*MockTaskTable)(nil).GetFirstSubtaskInStates), varargs...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetEligibleInstances", reflect.TypeOf((*MockScheduler)(nil).GetEligibleInstances), arg0, arg1) } -// GetGlobalTaskByID mocks base method. -func (m *MockTaskTable) GetGlobalTaskByID(arg0 context.Context, arg1 int64) (*proto.Task, error) { +// GetNextStep mocks base method. +func (m *MockScheduler) GetNextStep(arg0 *proto.Task) proto.Step { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetGlobalTaskByID", arg0, arg1) - ret0, _ := ret[0].(*proto.Task) - ret1, _ := ret[1].(error) - return ret0, ret1 + ret := m.ctrl.Call(m, "GetNextStep", arg0) + ret0, _ := ret[0].(proto.Step) + return ret0 } -// GetGlobalTaskByID indicates an expected call of GetGlobalTaskByID. -func (mr *MockTaskTableMockRecorder) GetGlobalTaskByID(arg0, arg1 interface{}) *gomock.Call { +// GetNextStep indicates an expected call of GetNextStep. +func (mr *MockSchedulerMockRecorder) GetNextStep(arg0 any) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetGlobalTaskByID", reflect.TypeOf((*MockTaskTable)(nil).GetGlobalTaskByID), arg0, arg1) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetNextStep", reflect.TypeOf((*MockScheduler)(nil).GetNextStep), arg0) } -// GetGlobalTasksInStates mocks base method. -func (m *MockTaskTable) GetGlobalTasksInStates(arg0 context.Context, arg1 ...interface{}) ([]*proto.Task, error) { +// GetTask mocks base method. +func (m *MockScheduler) GetTask() *proto.Task { m.ctrl.T.Helper() - varargs := []interface{}{arg0} - for _, a := range arg1 { - varargs = append(varargs, a) - } - ret := m.ctrl.Call(m, "GetGlobalTasksInStates", varargs...) - ret0, _ := ret[0].([]*proto.Task) - ret1, _ := ret[1].(error) - return ret0, ret1 + ret := m.ctrl.Call(m, "GetTask") + ret0, _ := ret[0].(*proto.Task) + return ret0 } -// GetGlobalTasksInStates indicates an expected call of GetGlobalTasksInStates. -func (mr *MockTaskTableMockRecorder) GetGlobalTasksInStates(arg0 interface{}, arg1 ...interface{}) *gomock.Call { +// GetTask indicates an expected call of GetTask. +func (mr *MockSchedulerMockRecorder) GetTask() *gomock.Call { mr.mock.ctrl.T.Helper() - varargs := append([]interface{}{arg0}, arg1...) - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetGlobalTasksInStates", reflect.TypeOf((*MockTaskTable)(nil).GetGlobalTasksInStates), varargs...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetTask", reflect.TypeOf((*MockScheduler)(nil).GetTask)) } -// GetSubtasksInStates mocks base method. -func (m *MockTaskTable) GetSubtasksInStates(arg0 context.Context, arg1 string, arg2 int64, arg3 proto.Step, arg4 ...interface{}) ([]*proto.Subtask, error) { +// Init mocks base method. +func (m *MockScheduler) Init() error { m.ctrl.T.Helper() - varargs := []interface{}{arg0, arg1, arg2, arg3} - for _, a := range arg4 { - varargs = append(varargs, a) - } - ret := m.ctrl.Call(m, "GetSubtasksInStates", varargs...) - ret0, _ := ret[0].([]*proto.Subtask) - ret1, _ := ret[1].(error) - return ret0, ret1 + ret := m.ctrl.Call(m, "Init") + ret0, _ := ret[0].(error) + return ret0 } -// GetSubtasksInStates indicates an expected call of GetSubtasksInStates. -func (mr *MockTaskTableMockRecorder) GetSubtasksInStates(arg0, arg1, arg2, arg3 interface{}, arg4 ...interface{}) *gomock.Call { +// Init indicates an expected call of Init. +func (mr *MockSchedulerMockRecorder) Init() *gomock.Call { mr.mock.ctrl.T.Helper() - varargs := append([]interface{}{arg0, arg1, arg2, arg3}, arg4...) - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetSubtasksInStates", reflect.TypeOf((*MockTaskTable)(nil).GetSubtasksInStates), varargs...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Init", reflect.TypeOf((*MockScheduler)(nil).Init)) } -// HasSubtasksInStates mocks base method. -func (m *MockTaskTable) HasSubtasksInStates(arg0 context.Context, arg1 string, arg2 int64, arg3 proto.Step, arg4 ...interface{}) (bool, error) { +// IsRetryableErr mocks base method. +func (m *MockScheduler) IsRetryableErr(arg0 error) bool { m.ctrl.T.Helper() - varargs := []interface{}{arg0, arg1, arg2, arg3} - for _, a := range arg4 { - varargs = append(varargs, a) - } - ret := m.ctrl.Call(m, "HasSubtasksInStates", varargs...) + ret := m.ctrl.Call(m, "IsRetryableErr", arg0) ret0, _ := ret[0].(bool) - ret1, _ := ret[1].(error) - return ret0, ret1 + return ret0 } -// HasSubtasksInStates indicates an expected call of HasSubtasksInStates. -func (mr *MockTaskTableMockRecorder) HasSubtasksInStates(arg0, arg1, arg2, arg3 interface{}, arg4 ...interface{}) *gomock.Call { +// IsRetryableErr indicates an expected call of IsRetryableErr. +func (mr *MockSchedulerMockRecorder) IsRetryableErr(arg0 any) *gomock.Call { mr.mock.ctrl.T.Helper() - varargs := append([]interface{}{arg0, arg1, arg2, arg3}, arg4...) - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "HasSubtasksInStates", reflect.TypeOf((*MockTaskTable)(nil).HasSubtasksInStates), varargs...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IsRetryableErr", reflect.TypeOf((*MockScheduler)(nil).IsRetryableErr), arg0) } -// IsSchedulerCanceled mocks base method. -func (m *MockTaskTable) IsSchedulerCanceled(arg0 context.Context, arg1 string, arg2 int64) (bool, error) { +// OnDone mocks base method. +func (m *MockScheduler) OnDone(arg0 context.Context, arg1 storage.TaskHandle, arg2 *proto.Task) error { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "IsSchedulerCanceled", arg0, arg1, arg2) - ret0, _ := ret[0].(bool) + ret := m.ctrl.Call(m, "OnDone", arg0, arg1, arg2) + ret0, _ := ret[0].(error) + return ret0 +} + +// OnDone indicates an expected call of OnDone. +func (mr *MockSchedulerMockRecorder) OnDone(arg0, arg1, arg2 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "OnDone", reflect.TypeOf((*MockScheduler)(nil).OnDone), arg0, arg1, arg2) +} + +// OnNextSubtasksBatch mocks base method. +func (m *MockScheduler) OnNextSubtasksBatch(arg0 context.Context, arg1 storage.TaskHandle, arg2 *proto.Task, arg3 []string, arg4 proto.Step) ([][]byte, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "OnNextSubtasksBatch", arg0, arg1, arg2, arg3, arg4) + ret0, _ := ret[0].([][]byte) ret1, _ := ret[1].(error) return ret0, ret1 } -// IsSchedulerCanceled indicates an expected call of IsSchedulerCanceled. -func (mr *MockTaskTableMockRecorder) IsSchedulerCanceled(arg0, arg1, arg2 interface{}) *gomock.Call { +// OnNextSubtasksBatch indicates an expected call of OnNextSubtasksBatch. +func (mr *MockSchedulerMockRecorder) OnNextSubtasksBatch(arg0, arg1, arg2, arg3, arg4 any) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IsSchedulerCanceled", reflect.TypeOf((*MockTaskTable)(nil).IsSchedulerCanceled), arg0, arg1, arg2) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "OnNextSubtasksBatch", reflect.TypeOf((*MockScheduler)(nil).OnNextSubtasksBatch), arg0, arg1, arg2, arg3, arg4) } -// PauseSubtasks mocks base method. -func (m *MockTaskTable) PauseSubtasks(arg0 context.Context, arg1 string, arg2 int64) error { +// OnTick mocks base method. +func (m *MockScheduler) OnTick(arg0 context.Context, arg1 *proto.Task) { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "PauseSubtasks", arg0, arg1, arg2) + m.ctrl.Call(m, "OnTick", arg0, arg1) +} + +// OnTick indicates an expected call of OnTick. +func (mr *MockSchedulerMockRecorder) OnTick(arg0, arg1 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "OnTick", reflect.TypeOf((*MockScheduler)(nil).OnTick), arg0, arg1) +} + +// ScheduleTask mocks base method. +func (m *MockScheduler) ScheduleTask() { + m.ctrl.T.Helper() + m.ctrl.Call(m, "ScheduleTask") +} + +// ScheduleTask indicates an expected call of ScheduleTask. +func (mr *MockSchedulerMockRecorder) ScheduleTask() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ScheduleTask", reflect.TypeOf((*MockScheduler)(nil).ScheduleTask)) +} + +// MockCleanUpRoutine is a mock of CleanUpRoutine interface. +type MockCleanUpRoutine struct { + ctrl *gomock.Controller + recorder *MockCleanUpRoutineMockRecorder +} + +// MockCleanUpRoutineMockRecorder is the mock recorder for MockCleanUpRoutine. +type MockCleanUpRoutineMockRecorder struct { + mock *MockCleanUpRoutine +} + +// NewMockCleanUpRoutine creates a new mock instance. +func NewMockCleanUpRoutine(ctrl *gomock.Controller) *MockCleanUpRoutine { + mock := &MockCleanUpRoutine{ctrl: ctrl} + mock.recorder = &MockCleanUpRoutineMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockCleanUpRoutine) EXPECT() *MockCleanUpRoutineMockRecorder { + return m.recorder +} + +// CleanUp mocks base method. +func (m *MockCleanUpRoutine) CleanUp(arg0 context.Context, arg1 *proto.Task) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "CleanUp", arg0, arg1) ret0, _ := ret[0].(error) return ret0 } -// PauseSubtasks indicates an expected call of PauseSubtasks. -func (mr *MockTaskTableMockRecorder) PauseSubtasks(arg0, arg1, arg2 interface{}) *gomock.Call { +// CleanUp indicates an expected call of CleanUp. +func (mr *MockCleanUpRoutineMockRecorder) CleanUp(arg0, arg1 any) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PauseSubtasks", reflect.TypeOf((*MockTaskTable)(nil).PauseSubtasks), arg0, arg1, arg2) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CleanUp", reflect.TypeOf((*MockCleanUpRoutine)(nil).CleanUp), arg0, arg1) +} + +// MockTaskManager is a mock of TaskManager interface. +type MockTaskManager struct { + ctrl *gomock.Controller + recorder *MockTaskManagerMockRecorder +} + +// MockTaskManagerMockRecorder is the mock recorder for MockTaskManager. +type MockTaskManagerMockRecorder struct { + mock *MockTaskManager } -// StartManager mocks base method. -func (m *MockTaskTable) StartManager(arg0 context.Context, arg1, arg2 string) error { +// NewMockTaskManager creates a new mock instance. +func NewMockTaskManager(ctrl *gomock.Controller) *MockTaskManager { + mock := &MockTaskManager{ctrl: ctrl} + mock.recorder = &MockTaskManagerMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockTaskManager) EXPECT() *MockTaskManagerMockRecorder { + return m.recorder +} + +// CancelTask mocks base method. +func (m *MockTaskManager) CancelTask(arg0 context.Context, arg1 int64) error { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "StartManager", arg0, arg1, arg2) + ret := m.ctrl.Call(m, "CancelTask", arg0, arg1) ret0, _ := ret[0].(error) return ret0 } -// StartManager indicates an expected call of StartManager. -func (mr *MockTaskTableMockRecorder) StartManager(arg0, arg1, arg2 interface{}) *gomock.Call { +// CancelTask indicates an expected call of CancelTask. +func (mr *MockTaskManagerMockRecorder) CancelTask(arg0, arg1 any) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StartManager", reflect.TypeOf((*MockTaskTable)(nil).StartManager), arg0, arg1, arg2) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CancelTask", reflect.TypeOf((*MockTaskManager)(nil).CancelTask), arg0, arg1) } -// StartSubtask mocks base method. -func (m *MockTaskTable) StartSubtask(arg0 context.Context, arg1 int64) error { +// DeleteDeadNodes mocks base method. +func (m *MockTaskManager) DeleteDeadNodes(arg0 context.Context, arg1 []string) error { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "StartSubtask", arg0, arg1) + ret := m.ctrl.Call(m, "DeleteDeadNodes", arg0, arg1) ret0, _ := ret[0].(error) return ret0 } -// StartSubtask indicates an expected call of StartSubtask. -func (mr *MockTaskTableMockRecorder) StartSubtask(arg0, arg1 interface{}) *gomock.Call { +// DeleteDeadNodes indicates an expected call of DeleteDeadNodes. +func (mr *MockTaskManagerMockRecorder) DeleteDeadNodes(arg0, arg1 any) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StartSubtask", reflect.TypeOf((*MockTaskTable)(nil).StartSubtask), arg0, arg1) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteDeadNodes", reflect.TypeOf((*MockTaskManager)(nil).DeleteDeadNodes), arg0, arg1) } -// UpdateErrorToSubtask mocks base method. -func (m *MockTaskTable) UpdateErrorToSubtask(arg0 context.Context, arg1 string, arg2 int64, arg3 error) error { +// FailTask mocks base method. +func (m *MockTaskManager) FailTask(arg0 context.Context, arg1 int64, arg2 proto.TaskState, arg3 error) error { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "UpdateErrorToSubtask", arg0, arg1, arg2, arg3) + ret := m.ctrl.Call(m, "FailTask", arg0, arg1, arg2, arg3) ret0, _ := ret[0].(error) return ret0 } -// UpdateErrorToSubtask indicates an expected call of UpdateErrorToSubtask. -func (mr *MockTaskTableMockRecorder) UpdateErrorToSubtask(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { +// FailTask indicates an expected call of FailTask. +func (mr *MockTaskManagerMockRecorder) FailTask(arg0, arg1, arg2, arg3 any) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateErrorToSubtask", reflect.TypeOf((*MockTaskTable)(nil).UpdateErrorToSubtask), arg0, arg1, arg2, arg3) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FailTask", reflect.TypeOf((*MockTaskManager)(nil).FailTask), arg0, arg1, arg2, arg3) } -// UpdateSubtaskStateAndError mocks base method. -func (m *MockTaskTable) UpdateSubtaskStateAndError(arg0 context.Context, arg1 string, arg2 int64, arg3 proto.TaskState, arg4 error) error { +// GCSubtasks mocks base method. +func (m *MockTaskManager) GCSubtasks(arg0 context.Context) error { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "UpdateSubtaskStateAndError", arg0, arg1, arg2, arg3, arg4) + ret := m.ctrl.Call(m, "GCSubtasks", arg0) ret0, _ := ret[0].(error) return ret0 } -// UpdateSubtaskStateAndError indicates an expected call of UpdateSubtaskStateAndError. -func (mr *MockTaskTableMockRecorder) UpdateSubtaskStateAndError(arg0, arg1, arg2, arg3, arg4 interface{}) *gomock.Call { +// GCSubtasks indicates an expected call of GCSubtasks. +func (mr *MockTaskManagerMockRecorder) GCSubtasks(arg0 any) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateSubtaskStateAndError", reflect.TypeOf((*MockTaskTable)(nil).UpdateSubtaskStateAndError), arg0, arg1, arg2, arg3, arg4) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GCSubtasks", reflect.TypeOf((*MockTaskManager)(nil).GCSubtasks), arg0) } -// MockPool is a mock of Pool interface. -type MockPool struct { - ctrl *gomock.Controller - recorder *MockPoolMockRecorder +// GetActiveSubtasks mocks base method. +func (m *MockTaskManager) GetActiveSubtasks(arg0 context.Context, arg1 int64) ([]*proto.Subtask, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetActiveSubtasks", arg0, arg1) + ret0, _ := ret[0].([]*proto.Subtask) + ret1, _ := ret[1].(error) + return ret0, ret1 } -// MockPoolMockRecorder is the mock recorder for MockPool. -type MockPoolMockRecorder struct { - mock *MockPool +// GetActiveSubtasks indicates an expected call of GetActiveSubtasks. +func (mr *MockTaskManagerMockRecorder) GetActiveSubtasks(arg0, arg1 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetActiveSubtasks", reflect.TypeOf((*MockTaskManager)(nil).GetActiveSubtasks), arg0, arg1) } -// NewMockPool creates a new mock instance. -func NewMockPool(ctrl *gomock.Controller) *MockPool { - mock := &MockPool{ctrl: ctrl} - mock.recorder = &MockPoolMockRecorder{mock} - return mock +// GetAllNodes mocks base method. +func (m *MockTaskManager) GetAllNodes(arg0 context.Context) ([]proto.ManagedNode, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetAllNodes", arg0) + ret0, _ := ret[0].([]proto.ManagedNode) + ret1, _ := ret[1].(error) + return ret0, ret1 } -// EXPECT returns an object that allows the caller to indicate expected use. -func (m *MockPool) EXPECT() *MockPoolMockRecorder { - return m.recorder +// GetAllNodes indicates an expected call of GetAllNodes. +func (mr *MockTaskManagerMockRecorder) GetAllNodes(arg0 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetAllNodes", reflect.TypeOf((*MockTaskManager)(nil).GetAllNodes), arg0) } -// ReleaseAndWait mocks base method. -func (m *MockPool) ReleaseAndWait() { +// GetAllSubtasksByStepAndState mocks base method. +func (m *MockTaskManager) GetAllSubtasksByStepAndState(arg0 context.Context, arg1 int64, arg2 proto.Step, arg3 proto.SubtaskState) ([]*proto.Subtask, error) { m.ctrl.T.Helper() - m.ctrl.Call(m, "ReleaseAndWait") + ret := m.ctrl.Call(m, "GetAllSubtasksByStepAndState", arg0, arg1, arg2, arg3) + ret0, _ := ret[0].([]*proto.Subtask) + ret1, _ := ret[1].(error) + return ret0, ret1 } -// ReleaseAndWait indicates an expected call of ReleaseAndWait. -func (mr *MockPoolMockRecorder) ReleaseAndWait() *gomock.Call { +// GetAllSubtasksByStepAndState indicates an expected call of GetAllSubtasksByStepAndState. +func (mr *MockTaskManagerMockRecorder) GetAllSubtasksByStepAndState(arg0, arg1, arg2, arg3 any) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ReleaseAndWait", reflect.TypeOf((*MockPool)(nil).ReleaseAndWait)) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetAllSubtasksByStepAndState", reflect.TypeOf((*MockTaskManager)(nil).GetAllSubtasksByStepAndState), arg0, arg1, arg2, arg3) } -// Run mocks base method. -func (m *MockPool) Run(arg0 func()) error { +// GetManagedNodes mocks base method. +func (m *MockTaskManager) GetManagedNodes(arg0 context.Context) ([]proto.ManagedNode, error) { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Run", arg0) - ret0, _ := ret[0].(error) - return ret0 + ret := m.ctrl.Call(m, "GetManagedNodes", arg0) + ret0, _ := ret[0].([]proto.ManagedNode) + ret1, _ := ret[1].(error) + return ret0, ret1 } -// Run indicates an expected call of Run. -func (mr *MockPoolMockRecorder) Run(arg0 interface{}) *gomock.Call { +// GetManagedNodes indicates an expected call of GetManagedNodes. +func (mr *MockTaskManagerMockRecorder) GetManagedNodes(arg0 any) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Run", reflect.TypeOf((*MockPool)(nil).Run), arg0) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetManagedNodes", reflect.TypeOf((*MockTaskManager)(nil).GetManagedNodes), arg0) } -// RunWithConcurrency mocks base method. -func (m *MockPool) RunWithConcurrency(arg0 chan func(), arg1 uint32) error { +// GetSubtaskCntGroupByStates mocks base method. +func (m *MockTaskManager) GetSubtaskCntGroupByStates(arg0 context.Context, arg1 int64, arg2 proto.Step) (map[proto.SubtaskState]int64, error) { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "RunWithConcurrency", arg0, arg1) - ret0, _ := ret[0].(error) - return ret0 + ret := m.ctrl.Call(m, "GetSubtaskCntGroupByStates", arg0, arg1, arg2) + ret0, _ := ret[0].(map[proto.SubtaskState]int64) + ret1, _ := ret[1].(error) + return ret0, ret1 } -// RunWithConcurrency indicates an expected call of RunWithConcurrency. -func (mr *MockPoolMockRecorder) RunWithConcurrency(arg0, arg1 interface{}) *gomock.Call { +// GetSubtaskCntGroupByStates indicates an expected call of GetSubtaskCntGroupByStates. +func (mr *MockTaskManagerMockRecorder) GetSubtaskCntGroupByStates(arg0, arg1, arg2 any) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RunWithConcurrency", reflect.TypeOf((*MockPool)(nil).RunWithConcurrency), arg0, arg1) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetSubtaskCntGroupByStates", reflect.TypeOf((*MockTaskManager)(nil).GetSubtaskCntGroupByStates), arg0, arg1, arg2) } -// MockScheduler is a mock of Scheduler interface. -type MockScheduler struct { - ctrl *gomock.Controller - recorder *MockSchedulerMockRecorder +// GetSubtaskErrors mocks base method. +func (m *MockTaskManager) GetSubtaskErrors(arg0 context.Context, arg1 int64) ([]error, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetSubtaskErrors", arg0, arg1) + ret0, _ := ret[0].([]error) + ret1, _ := ret[1].(error) + return ret0, ret1 } -// MockSchedulerMockRecorder is the mock recorder for MockScheduler. -type MockSchedulerMockRecorder struct { - mock *MockScheduler +// GetSubtaskErrors indicates an expected call of GetSubtaskErrors. +func (mr *MockTaskManagerMockRecorder) GetSubtaskErrors(arg0, arg1 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetSubtaskErrors", reflect.TypeOf((*MockTaskManager)(nil).GetSubtaskErrors), arg0, arg1) } -// NewMockScheduler creates a new mock instance. -func NewMockScheduler(ctrl *gomock.Controller) *MockScheduler { - mock := &MockScheduler{ctrl: ctrl} - mock.recorder = &MockSchedulerMockRecorder{mock} - return mock +// GetTaskByID mocks base method. +func (m *MockTaskManager) GetTaskByID(arg0 context.Context, arg1 int64) (*proto.Task, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetTaskByID", arg0, arg1) + ret0, _ := ret[0].(*proto.Task) + ret1, _ := ret[1].(error) + return ret0, ret1 } -// EXPECT returns an object that allows the caller to indicate expected use. -func (m *MockScheduler) EXPECT() *MockSchedulerMockRecorder { - return m.recorder +// GetTaskByID indicates an expected call of GetTaskByID. +func (mr *MockTaskManagerMockRecorder) GetTaskByID(arg0, arg1 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetTaskByID", reflect.TypeOf((*MockTaskManager)(nil).GetTaskByID), arg0, arg1) } -// Close mocks base method. -func (m *MockScheduler) Close() { +// GetTaskExecutorIDsByTaskID mocks base method. +func (m *MockTaskManager) GetTaskExecutorIDsByTaskID(arg0 context.Context, arg1 int64) ([]string, error) { m.ctrl.T.Helper() - m.ctrl.Call(m, "Close") + ret := m.ctrl.Call(m, "GetTaskExecutorIDsByTaskID", arg0, arg1) + ret0, _ := ret[0].([]string) + ret1, _ := ret[1].(error) + return ret0, ret1 } -// Close indicates an expected call of Close. -func (mr *MockSchedulerMockRecorder) Close() *gomock.Call { +// GetTaskExecutorIDsByTaskID indicates an expected call of GetTaskExecutorIDsByTaskID. +func (mr *MockTaskManagerMockRecorder) GetTaskExecutorIDsByTaskID(arg0, arg1 any) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Close", reflect.TypeOf((*MockScheduler)(nil).Close)) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetTaskExecutorIDsByTaskID", reflect.TypeOf((*MockTaskManager)(nil).GetTaskExecutorIDsByTaskID), arg0, arg1) } -// Init mocks base method. -func (m *MockScheduler) Init(arg0 context.Context) error { +// GetTasksInStates mocks base method. +func (m *MockTaskManager) GetTasksInStates(arg0 context.Context, arg1 ...any) ([]*proto.Task, error) { + m.ctrl.T.Helper() + varargs := []any{arg0} + for _, a := range arg1 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "GetTasksInStates", varargs...) + ret0, _ := ret[0].([]*proto.Task) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetTasksInStates indicates an expected call of GetTasksInStates. +func (mr *MockTaskManagerMockRecorder) GetTasksInStates(arg0 any, arg1 ...any) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]any{arg0}, arg1...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetTasksInStates", reflect.TypeOf((*MockTaskManager)(nil).GetTasksInStates), varargs...) +} + +// GetTopUnfinishedTasks mocks base method. +func (m *MockTaskManager) GetTopUnfinishedTasks(arg0 context.Context) ([]*proto.Task, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetTopUnfinishedTasks", arg0) + ret0, _ := ret[0].([]*proto.Task) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetTopUnfinishedTasks indicates an expected call of GetTopUnfinishedTasks. +func (mr *MockTaskManagerMockRecorder) GetTopUnfinishedTasks(arg0 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetTopUnfinishedTasks", reflect.TypeOf((*MockTaskManager)(nil).GetTopUnfinishedTasks), arg0) +} + +// GetUsedSlotsOnNodes mocks base method. +func (m *MockTaskManager) GetUsedSlotsOnNodes(arg0 context.Context) (map[string]int, error) { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Init", arg0) + ret := m.ctrl.Call(m, "GetUsedSlotsOnNodes", arg0) + ret0, _ := ret[0].(map[string]int) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetUsedSlotsOnNodes indicates an expected call of GetUsedSlotsOnNodes. +func (mr *MockTaskManagerMockRecorder) GetUsedSlotsOnNodes(arg0 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetUsedSlotsOnNodes", reflect.TypeOf((*MockTaskManager)(nil).GetUsedSlotsOnNodes), arg0) +} + +// PauseTask mocks base method. +func (m *MockTaskManager) PauseTask(arg0 context.Context, arg1 string) (bool, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "PauseTask", arg0, arg1) + ret0, _ := ret[0].(bool) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// PauseTask indicates an expected call of PauseTask. +func (mr *MockTaskManagerMockRecorder) PauseTask(arg0, arg1 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PauseTask", reflect.TypeOf((*MockTaskManager)(nil).PauseTask), arg0, arg1) +} + +// PausedTask mocks base method. +func (m *MockTaskManager) PausedTask(arg0 context.Context, arg1 int64) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "PausedTask", arg0, arg1) ret0, _ := ret[0].(error) return ret0 } -// Init indicates an expected call of Init. -func (mr *MockSchedulerMockRecorder) Init(arg0 interface{}) *gomock.Call { +// PausedTask indicates an expected call of PausedTask. +func (mr *MockTaskManagerMockRecorder) PausedTask(arg0, arg1 any) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Init", reflect.TypeOf((*MockScheduler)(nil).Init), arg0) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PausedTask", reflect.TypeOf((*MockTaskManager)(nil).PausedTask), arg0, arg1) } -// Pause mocks base method. -func (m *MockScheduler) Pause(arg0 context.Context, arg1 *proto.Task) error { +// ResumeSubtasks mocks base method. +func (m *MockTaskManager) ResumeSubtasks(arg0 context.Context, arg1 int64) error { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Pause", arg0, arg1) + ret := m.ctrl.Call(m, "ResumeSubtasks", arg0, arg1) ret0, _ := ret[0].(error) return ret0 } -// Pause indicates an expected call of Pause. -func (mr *MockSchedulerMockRecorder) Pause(arg0, arg1 interface{}) *gomock.Call { +// ResumeSubtasks indicates an expected call of ResumeSubtasks. +func (mr *MockTaskManagerMockRecorder) ResumeSubtasks(arg0, arg1 any) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Pause", reflect.TypeOf((*MockScheduler)(nil).Pause), arg0, arg1) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ResumeSubtasks", reflect.TypeOf((*MockTaskManager)(nil).ResumeSubtasks), arg0, arg1) } -// Rollback mocks base method. -func (m *MockScheduler) Rollback(arg0 context.Context, arg1 *proto.Task) error { +// RevertedTask mocks base method. +func (m *MockTaskManager) RevertedTask(arg0 context.Context, arg1 int64) error { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Rollback", arg0, arg1) + ret := m.ctrl.Call(m, "RevertedTask", arg0, arg1) ret0, _ := ret[0].(error) return ret0 } -// Rollback indicates an expected call of Rollback. -func (mr *MockSchedulerMockRecorder) Rollback(arg0, arg1 interface{}) *gomock.Call { +// RevertedTask indicates an expected call of RevertedTask. +func (mr *MockTaskManagerMockRecorder) RevertedTask(arg0, arg1 any) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Rollback", reflect.TypeOf((*MockScheduler)(nil).Rollback), arg0, arg1) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RevertedTask", reflect.TypeOf((*MockTaskManager)(nil).RevertedTask), arg0, arg1) } -// Run mocks base method. -func (m *MockScheduler) Run(arg0 context.Context, arg1 *proto.Task) error { +// SucceedTask mocks base method. +func (m *MockTaskManager) SucceedTask(arg0 context.Context, arg1 int64) error { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Run", arg0, arg1) + ret := m.ctrl.Call(m, "SucceedTask", arg0, arg1) ret0, _ := ret[0].(error) return ret0 } -// Run indicates an expected call of Run. -func (mr *MockSchedulerMockRecorder) Run(arg0, arg1 interface{}) *gomock.Call { +// SucceedTask indicates an expected call of SucceedTask. +func (mr *MockTaskManagerMockRecorder) SucceedTask(arg0, arg1 any) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Run", reflect.TypeOf((*MockScheduler)(nil).Run), arg0, arg1) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SucceedTask", reflect.TypeOf((*MockTaskManager)(nil).SucceedTask), arg0, arg1) } -// MockExtension is a mock of Extension interface. -type MockExtension struct { - ctrl *gomock.Controller - recorder *MockExtensionMockRecorder +// SwitchTaskStep mocks base method. +func (m *MockTaskManager) SwitchTaskStep(arg0 context.Context, arg1 *proto.Task, arg2 proto.TaskState, arg3 proto.Step, arg4 []*proto.Subtask) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SwitchTaskStep", arg0, arg1, arg2, arg3, arg4) + ret0, _ := ret[0].(error) + return ret0 } -// MockExtensionMockRecorder is the mock recorder for MockExtension. -type MockExtensionMockRecorder struct { - mock *MockExtension +// SwitchTaskStep indicates an expected call of SwitchTaskStep. +func (mr *MockTaskManagerMockRecorder) SwitchTaskStep(arg0, arg1, arg2, arg3, arg4 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SwitchTaskStep", reflect.TypeOf((*MockTaskManager)(nil).SwitchTaskStep), arg0, arg1, arg2, arg3, arg4) } -// NewMockExtension creates a new mock instance. -func NewMockExtension(ctrl *gomock.Controller) *MockExtension { - mock := &MockExtension{ctrl: ctrl} - mock.recorder = &MockExtensionMockRecorder{mock} - return mock +// SwitchTaskStepInBatch mocks base method. +func (m *MockTaskManager) SwitchTaskStepInBatch(arg0 context.Context, arg1 *proto.Task, arg2 proto.TaskState, arg3 proto.Step, arg4 []*proto.Subtask) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SwitchTaskStepInBatch", arg0, arg1, arg2, arg3, arg4) + ret0, _ := ret[0].(error) + return ret0 } -// EXPECT returns an object that allows the caller to indicate expected use. -func (m *MockExtension) EXPECT() *MockExtensionMockRecorder { - return m.recorder +// SwitchTaskStepInBatch indicates an expected call of SwitchTaskStepInBatch. +func (mr *MockTaskManagerMockRecorder) SwitchTaskStepInBatch(arg0, arg1, arg2, arg3, arg4 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SwitchTaskStepInBatch", reflect.TypeOf((*MockTaskManager)(nil).SwitchTaskStepInBatch), arg0, arg1, arg2, arg3, arg4) +} + +// TransferTasks2History mocks base method. +func (m *MockTaskManager) TransferTasks2History(arg0 context.Context, arg1 []*proto.Task) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "TransferTasks2History", arg0, arg1) + ret0, _ := ret[0].(error) + return ret0 +} + +// TransferTasks2History indicates an expected call of TransferTasks2History. +func (mr *MockTaskManagerMockRecorder) TransferTasks2History(arg0, arg1 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "TransferTasks2History", reflect.TypeOf((*MockTaskManager)(nil).TransferTasks2History), arg0, arg1) +} + +// UpdateSubtasksExecIDs mocks base method. +func (m *MockTaskManager) UpdateSubtasksExecIDs(arg0 context.Context, arg1 []*proto.Subtask) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "UpdateSubtasksExecIDs", arg0, arg1) + ret0, _ := ret[0].(error) + return ret0 } -// GetSubtaskExecutor mocks base method. -func (m *MockExtension) GetSubtaskExecutor(arg0 context.Context, arg1 *proto.Task, arg2 *execute.Summary) (execute.SubtaskExecutor, error) { +// UpdateSubtasksExecIDs indicates an expected call of UpdateSubtasksExecIDs. +func (mr *MockTaskManagerMockRecorder) UpdateSubtasksExecIDs(arg0, arg1 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateSubtasksExecIDs", reflect.TypeOf((*MockTaskManager)(nil).UpdateSubtasksExecIDs), arg0, arg1) +} + +// UpdateTaskAndAddSubTasks mocks base method. +func (m *MockTaskManager) UpdateTaskAndAddSubTasks(arg0 context.Context, arg1 *proto.Task, arg2 []*proto.Subtask, arg3 proto.TaskState) (bool, error) { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetSubtaskExecutor", arg0, arg1, arg2) - ret0, _ := ret[0].(execute.SubtaskExecutor) + ret := m.ctrl.Call(m, "UpdateTaskAndAddSubTasks", arg0, arg1, arg2, arg3) + ret0, _ := ret[0].(bool) ret1, _ := ret[1].(error) return ret0, ret1 } -// GetSubtaskExecutor indicates an expected call of GetSubtaskExecutor. -func (mr *MockExtensionMockRecorder) GetSubtaskExecutor(arg0, arg1, arg2 interface{}) *gomock.Call { +// UpdateTaskAndAddSubTasks indicates an expected call of UpdateTaskAndAddSubTasks. +func (mr *MockTaskManagerMockRecorder) UpdateTaskAndAddSubTasks(arg0, arg1, arg2, arg3 any) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetSubtaskExecutor", reflect.TypeOf((*MockExtension)(nil).GetSubtaskExecutor), arg0, arg1, arg2) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateTaskAndAddSubTasks", reflect.TypeOf((*MockTaskManager)(nil).UpdateTaskAndAddSubTasks), arg0, arg1, arg2, arg3) } -// IsIdempotent mocks base method. -func (m *MockExtension) IsIdempotent(arg0 *proto.Subtask) bool { +// WithNewSession mocks base method. +func (m *MockTaskManager) WithNewSession(arg0 func(sessionctx.Context) error) error { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "IsIdempotent", arg0) - ret0, _ := ret[0].(bool) + ret := m.ctrl.Call(m, "WithNewSession", arg0) + ret0, _ := ret[0].(error) + return ret0 +} + +// WithNewSession indicates an expected call of WithNewSession. +func (mr *MockTaskManagerMockRecorder) WithNewSession(arg0 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WithNewSession", reflect.TypeOf((*MockTaskManager)(nil).WithNewSession), arg0) +} + +// WithNewTxn mocks base method. +func (m *MockTaskManager) WithNewTxn(arg0 context.Context, arg1 func(sessionctx.Context) error) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "WithNewTxn", arg0, arg1) + ret0, _ := ret[0].(error) return ret0 } -// IsIdempotent indicates an expected call of IsIdempotent. -func (mr *MockExtensionMockRecorder) IsIdempotent(arg0 interface{}) *gomock.Call { +// WithNewTxn indicates an expected call of WithNewTxn. +func (mr *MockTaskManagerMockRecorder) WithNewTxn(arg0, arg1 any) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IsIdempotent", reflect.TypeOf((*MockExtension)(nil).IsIdempotent), arg0) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WithNewTxn", reflect.TypeOf((*MockTaskManager)(nil).WithNewTxn), arg0, arg1) } diff --git a/pkg/disttask/framework/mock/task_executor_mock.go b/pkg/disttask/framework/mock/task_executor_mock.go new file mode 100644 index 0000000000000..b79b3c69d6005 --- /dev/null +++ b/pkg/disttask/framework/mock/task_executor_mock.go @@ -0,0 +1,482 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: github.com/pingcap/tidb/pkg/disttask/framework/taskexecutor (interfaces: TaskTable,Pool,TaskExecutor,Extension) +// +// Generated by this command: +// +// mockgen -package mock github.com/pingcap/tidb/pkg/disttask/framework/taskexecutor TaskTable,Pool,TaskExecutor,Extension +// +// Package mock is a generated GoMock package. +package mock + +import ( + context "context" + reflect "reflect" + + proto "github.com/pingcap/tidb/pkg/disttask/framework/proto" + execute "github.com/pingcap/tidb/pkg/disttask/framework/taskexecutor/execute" + gomock "go.uber.org/mock/gomock" +) + +// MockTaskTable is a mock of TaskTable interface. +type MockTaskTable struct { + ctrl *gomock.Controller + recorder *MockTaskTableMockRecorder +} + +// MockTaskTableMockRecorder is the mock recorder for MockTaskTable. +type MockTaskTableMockRecorder struct { + mock *MockTaskTable +} + +// NewMockTaskTable creates a new mock instance. +func NewMockTaskTable(ctrl *gomock.Controller) *MockTaskTable { + mock := &MockTaskTable{ctrl: ctrl} + mock.recorder = &MockTaskTableMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockTaskTable) EXPECT() *MockTaskTableMockRecorder { + return m.recorder +} + +// CancelSubtask mocks base method. +func (m *MockTaskTable) CancelSubtask(arg0 context.Context, arg1 string, arg2 int64) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "CancelSubtask", arg0, arg1, arg2) + ret0, _ := ret[0].(error) + return ret0 +} + +// CancelSubtask indicates an expected call of CancelSubtask. +func (mr *MockTaskTableMockRecorder) CancelSubtask(arg0, arg1, arg2 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CancelSubtask", reflect.TypeOf((*MockTaskTable)(nil).CancelSubtask), arg0, arg1, arg2) +} + +// FailSubtask mocks base method. +func (m *MockTaskTable) FailSubtask(arg0 context.Context, arg1 string, arg2 int64, arg3 error) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "FailSubtask", arg0, arg1, arg2, arg3) + ret0, _ := ret[0].(error) + return ret0 +} + +// FailSubtask indicates an expected call of FailSubtask. +func (mr *MockTaskTableMockRecorder) FailSubtask(arg0, arg1, arg2, arg3 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FailSubtask", reflect.TypeOf((*MockTaskTable)(nil).FailSubtask), arg0, arg1, arg2, arg3) +} + +// FinishSubtask mocks base method. +func (m *MockTaskTable) FinishSubtask(arg0 context.Context, arg1 string, arg2 int64, arg3 []byte) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "FinishSubtask", arg0, arg1, arg2, arg3) + ret0, _ := ret[0].(error) + return ret0 +} + +// FinishSubtask indicates an expected call of FinishSubtask. +func (mr *MockTaskTableMockRecorder) FinishSubtask(arg0, arg1, arg2, arg3 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FinishSubtask", reflect.TypeOf((*MockTaskTable)(nil).FinishSubtask), arg0, arg1, arg2, arg3) +} + +// GetFirstSubtaskInStates mocks base method. +func (m *MockTaskTable) GetFirstSubtaskInStates(arg0 context.Context, arg1 string, arg2 int64, arg3 proto.Step, arg4 ...proto.SubtaskState) (*proto.Subtask, error) { + m.ctrl.T.Helper() + varargs := []any{arg0, arg1, arg2, arg3} + for _, a := range arg4 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "GetFirstSubtaskInStates", varargs...) + ret0, _ := ret[0].(*proto.Subtask) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetFirstSubtaskInStates indicates an expected call of GetFirstSubtaskInStates. +func (mr *MockTaskTableMockRecorder) GetFirstSubtaskInStates(arg0, arg1, arg2, arg3 any, arg4 ...any) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]any{arg0, arg1, arg2, arg3}, arg4...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetFirstSubtaskInStates", reflect.TypeOf((*MockTaskTable)(nil).GetFirstSubtaskInStates), varargs...) +} + +// GetSubtasksByExecIDAndStepAndStates mocks base method. +func (m *MockTaskTable) GetSubtasksByExecIDAndStepAndStates(arg0 context.Context, arg1 string, arg2 int64, arg3 proto.Step, arg4 ...proto.SubtaskState) ([]*proto.Subtask, error) { + m.ctrl.T.Helper() + varargs := []any{arg0, arg1, arg2, arg3} + for _, a := range arg4 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "GetSubtasksByExecIDAndStepAndStates", varargs...) + ret0, _ := ret[0].([]*proto.Subtask) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetSubtasksByExecIDAndStepAndStates indicates an expected call of GetSubtasksByExecIDAndStepAndStates. +func (mr *MockTaskTableMockRecorder) GetSubtasksByExecIDAndStepAndStates(arg0, arg1, arg2, arg3 any, arg4 ...any) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]any{arg0, arg1, arg2, arg3}, arg4...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetSubtasksByExecIDAndStepAndStates", reflect.TypeOf((*MockTaskTable)(nil).GetSubtasksByExecIDAndStepAndStates), varargs...) +} + +// GetTaskByID mocks base method. +func (m *MockTaskTable) GetTaskByID(arg0 context.Context, arg1 int64) (*proto.Task, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetTaskByID", arg0, arg1) + ret0, _ := ret[0].(*proto.Task) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetTaskByID indicates an expected call of GetTaskByID. +func (mr *MockTaskTableMockRecorder) GetTaskByID(arg0, arg1 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetTaskByID", reflect.TypeOf((*MockTaskTable)(nil).GetTaskByID), arg0, arg1) +} + +// GetTasksInStates mocks base method. +func (m *MockTaskTable) GetTasksInStates(arg0 context.Context, arg1 ...any) ([]*proto.Task, error) { + m.ctrl.T.Helper() + varargs := []any{arg0} + for _, a := range arg1 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "GetTasksInStates", varargs...) + ret0, _ := ret[0].([]*proto.Task) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetTasksInStates indicates an expected call of GetTasksInStates. +func (mr *MockTaskTableMockRecorder) GetTasksInStates(arg0 any, arg1 ...any) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]any{arg0}, arg1...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetTasksInStates", reflect.TypeOf((*MockTaskTable)(nil).GetTasksInStates), varargs...) +} + +// HasSubtasksInStates mocks base method. +func (m *MockTaskTable) HasSubtasksInStates(arg0 context.Context, arg1 string, arg2 int64, arg3 proto.Step, arg4 ...proto.SubtaskState) (bool, error) { + m.ctrl.T.Helper() + varargs := []any{arg0, arg1, arg2, arg3} + for _, a := range arg4 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "HasSubtasksInStates", varargs...) + ret0, _ := ret[0].(bool) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// HasSubtasksInStates indicates an expected call of HasSubtasksInStates. +func (mr *MockTaskTableMockRecorder) HasSubtasksInStates(arg0, arg1, arg2, arg3 any, arg4 ...any) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]any{arg0, arg1, arg2, arg3}, arg4...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "HasSubtasksInStates", reflect.TypeOf((*MockTaskTable)(nil).HasSubtasksInStates), varargs...) +} + +// InitMeta mocks base method. +func (m *MockTaskTable) InitMeta(arg0 context.Context, arg1, arg2 string) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "InitMeta", arg0, arg1, arg2) + ret0, _ := ret[0].(error) + return ret0 +} + +// InitMeta indicates an expected call of InitMeta. +func (mr *MockTaskTableMockRecorder) InitMeta(arg0, arg1, arg2 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "InitMeta", reflect.TypeOf((*MockTaskTable)(nil).InitMeta), arg0, arg1, arg2) +} + +// PauseSubtasks mocks base method. +func (m *MockTaskTable) PauseSubtasks(arg0 context.Context, arg1 string, arg2 int64) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "PauseSubtasks", arg0, arg1, arg2) + ret0, _ := ret[0].(error) + return ret0 +} + +// PauseSubtasks indicates an expected call of PauseSubtasks. +func (mr *MockTaskTableMockRecorder) PauseSubtasks(arg0, arg1, arg2 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PauseSubtasks", reflect.TypeOf((*MockTaskTable)(nil).PauseSubtasks), arg0, arg1, arg2) +} + +// RecoverMeta mocks base method. +func (m *MockTaskTable) RecoverMeta(arg0 context.Context, arg1, arg2 string) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "RecoverMeta", arg0, arg1, arg2) + ret0, _ := ret[0].(error) + return ret0 +} + +// RecoverMeta indicates an expected call of RecoverMeta. +func (mr *MockTaskTableMockRecorder) RecoverMeta(arg0, arg1, arg2 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RecoverMeta", reflect.TypeOf((*MockTaskTable)(nil).RecoverMeta), arg0, arg1, arg2) +} + +// RunningSubtasksBack2Pending mocks base method. +func (m *MockTaskTable) RunningSubtasksBack2Pending(arg0 context.Context, arg1 []*proto.Subtask) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "RunningSubtasksBack2Pending", arg0, arg1) + ret0, _ := ret[0].(error) + return ret0 +} + +// RunningSubtasksBack2Pending indicates an expected call of RunningSubtasksBack2Pending. +func (mr *MockTaskTableMockRecorder) RunningSubtasksBack2Pending(arg0, arg1 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RunningSubtasksBack2Pending", reflect.TypeOf((*MockTaskTable)(nil).RunningSubtasksBack2Pending), arg0, arg1) +} + +// StartSubtask mocks base method. +func (m *MockTaskTable) StartSubtask(arg0 context.Context, arg1 int64, arg2 string) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StartSubtask", arg0, arg1, arg2) + ret0, _ := ret[0].(error) + return ret0 +} + +// StartSubtask indicates an expected call of StartSubtask. +func (mr *MockTaskTableMockRecorder) StartSubtask(arg0, arg1, arg2 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StartSubtask", reflect.TypeOf((*MockTaskTable)(nil).StartSubtask), arg0, arg1, arg2) +} + +// UpdateSubtaskStateAndError mocks base method. +func (m *MockTaskTable) UpdateSubtaskStateAndError(arg0 context.Context, arg1 string, arg2 int64, arg3 proto.SubtaskState, arg4 error) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "UpdateSubtaskStateAndError", arg0, arg1, arg2, arg3, arg4) + ret0, _ := ret[0].(error) + return ret0 +} + +// UpdateSubtaskStateAndError indicates an expected call of UpdateSubtaskStateAndError. +func (mr *MockTaskTableMockRecorder) UpdateSubtaskStateAndError(arg0, arg1, arg2, arg3, arg4 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateSubtaskStateAndError", reflect.TypeOf((*MockTaskTable)(nil).UpdateSubtaskStateAndError), arg0, arg1, arg2, arg3, arg4) +} + +// MockPool is a mock of Pool interface. +type MockPool struct { + ctrl *gomock.Controller + recorder *MockPoolMockRecorder +} + +// MockPoolMockRecorder is the mock recorder for MockPool. +type MockPoolMockRecorder struct { + mock *MockPool +} + +// NewMockPool creates a new mock instance. +func NewMockPool(ctrl *gomock.Controller) *MockPool { + mock := &MockPool{ctrl: ctrl} + mock.recorder = &MockPoolMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockPool) EXPECT() *MockPoolMockRecorder { + return m.recorder +} + +// ReleaseAndWait mocks base method. +func (m *MockPool) ReleaseAndWait() { + m.ctrl.T.Helper() + m.ctrl.Call(m, "ReleaseAndWait") +} + +// ReleaseAndWait indicates an expected call of ReleaseAndWait. +func (mr *MockPoolMockRecorder) ReleaseAndWait() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ReleaseAndWait", reflect.TypeOf((*MockPool)(nil).ReleaseAndWait)) +} + +// Run mocks base method. +func (m *MockPool) Run(arg0 func()) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Run", arg0) + ret0, _ := ret[0].(error) + return ret0 +} + +// Run indicates an expected call of Run. +func (mr *MockPoolMockRecorder) Run(arg0 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Run", reflect.TypeOf((*MockPool)(nil).Run), arg0) +} + +// RunWithConcurrency mocks base method. +func (m *MockPool) RunWithConcurrency(arg0 chan func(), arg1 uint32) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "RunWithConcurrency", arg0, arg1) + ret0, _ := ret[0].(error) + return ret0 +} + +// RunWithConcurrency indicates an expected call of RunWithConcurrency. +func (mr *MockPoolMockRecorder) RunWithConcurrency(arg0, arg1 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RunWithConcurrency", reflect.TypeOf((*MockPool)(nil).RunWithConcurrency), arg0, arg1) +} + +// MockTaskExecutor is a mock of TaskExecutor interface. +type MockTaskExecutor struct { + ctrl *gomock.Controller + recorder *MockTaskExecutorMockRecorder +} + +// MockTaskExecutorMockRecorder is the mock recorder for MockTaskExecutor. +type MockTaskExecutorMockRecorder struct { + mock *MockTaskExecutor +} + +// NewMockTaskExecutor creates a new mock instance. +func NewMockTaskExecutor(ctrl *gomock.Controller) *MockTaskExecutor { + mock := &MockTaskExecutor{ctrl: ctrl} + mock.recorder = &MockTaskExecutorMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockTaskExecutor) EXPECT() *MockTaskExecutorMockRecorder { + return m.recorder +} + +// Close mocks base method. +func (m *MockTaskExecutor) Close() { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Close") +} + +// Close indicates an expected call of Close. +func (mr *MockTaskExecutorMockRecorder) Close() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Close", reflect.TypeOf((*MockTaskExecutor)(nil).Close)) +} + +// Init mocks base method. +func (m *MockTaskExecutor) Init(arg0 context.Context) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Init", arg0) + ret0, _ := ret[0].(error) + return ret0 +} + +// Init indicates an expected call of Init. +func (mr *MockTaskExecutorMockRecorder) Init(arg0 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Init", reflect.TypeOf((*MockTaskExecutor)(nil).Init), arg0) +} + +// IsRetryableError mocks base method. +func (m *MockTaskExecutor) IsRetryableError(arg0 error) bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "IsRetryableError", arg0) + ret0, _ := ret[0].(bool) + return ret0 +} + +// IsRetryableError indicates an expected call of IsRetryableError. +func (mr *MockTaskExecutorMockRecorder) IsRetryableError(arg0 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IsRetryableError", reflect.TypeOf((*MockTaskExecutor)(nil).IsRetryableError), arg0) +} + +// Rollback mocks base method. +func (m *MockTaskExecutor) Rollback(arg0 context.Context, arg1 *proto.Task) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Rollback", arg0, arg1) + ret0, _ := ret[0].(error) + return ret0 +} + +// Rollback indicates an expected call of Rollback. +func (mr *MockTaskExecutorMockRecorder) Rollback(arg0, arg1 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Rollback", reflect.TypeOf((*MockTaskExecutor)(nil).Rollback), arg0, arg1) +} + +// RunStep mocks base method. +func (m *MockTaskExecutor) RunStep(arg0 context.Context, arg1 *proto.Task, arg2 *proto.StepResource) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "RunStep", arg0, arg1, arg2) + ret0, _ := ret[0].(error) + return ret0 +} + +// RunStep indicates an expected call of RunStep. +func (mr *MockTaskExecutorMockRecorder) RunStep(arg0, arg1, arg2 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RunStep", reflect.TypeOf((*MockTaskExecutor)(nil).RunStep), arg0, arg1, arg2) +} + +// MockExtension is a mock of Extension interface. +type MockExtension struct { + ctrl *gomock.Controller + recorder *MockExtensionMockRecorder +} + +// MockExtensionMockRecorder is the mock recorder for MockExtension. +type MockExtensionMockRecorder struct { + mock *MockExtension +} + +// NewMockExtension creates a new mock instance. +func NewMockExtension(ctrl *gomock.Controller) *MockExtension { + mock := &MockExtension{ctrl: ctrl} + mock.recorder = &MockExtensionMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockExtension) EXPECT() *MockExtensionMockRecorder { + return m.recorder +} + +// GetStepExecutor mocks base method. +func (m *MockExtension) GetStepExecutor(arg0 context.Context, arg1 *proto.Task, arg2 *execute.Summary, arg3 *proto.StepResource) (execute.StepExecutor, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetStepExecutor", arg0, arg1, arg2, arg3) + ret0, _ := ret[0].(execute.StepExecutor) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetStepExecutor indicates an expected call of GetStepExecutor. +func (mr *MockExtensionMockRecorder) GetStepExecutor(arg0, arg1, arg2, arg3 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetStepExecutor", reflect.TypeOf((*MockExtension)(nil).GetStepExecutor), arg0, arg1, arg2, arg3) +} + +// IsIdempotent mocks base method. +func (m *MockExtension) IsIdempotent(arg0 *proto.Subtask) bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "IsIdempotent", arg0) + ret0, _ := ret[0].(bool) + return ret0 +} + +// IsIdempotent indicates an expected call of IsIdempotent. +func (mr *MockExtensionMockRecorder) IsIdempotent(arg0 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IsIdempotent", reflect.TypeOf((*MockExtension)(nil).IsIdempotent), arg0) +} + +// IsRetryableError mocks base method. +func (m *MockExtension) IsRetryableError(arg0 error) bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "IsRetryableError", arg0) + ret0, _ := ret[0].(bool) + return ret0 +} + +// IsRetryableError indicates an expected call of IsRetryableError. +func (mr *MockExtensionMockRecorder) IsRetryableError(arg0 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IsRetryableError", reflect.TypeOf((*MockExtension)(nil).IsRetryableError), arg0) +} diff --git a/pkg/disttask/framework/planner/planner.go b/pkg/disttask/framework/planner/planner.go index eadd73208d630..e4b0ceaa4fa16 100644 --- a/pkg/disttask/framework/planner/planner.go +++ b/pkg/disttask/framework/planner/planner.go @@ -26,7 +26,7 @@ func NewPlanner() *Planner { // Run runs the distribute plan. func (*Planner) Run(planCtx PlanCtx, plan LogicalPlan) (int64, error) { - globalTaskManager, err := storage.GetTaskManager() + taskManager, err := storage.GetTaskManager() if err != nil { return 0, err } @@ -36,7 +36,7 @@ func (*Planner) Run(planCtx PlanCtx, plan LogicalPlan) (int64, error) { return 0, err } - return globalTaskManager.AddGlobalTaskWithSession( + return taskManager.CreateTaskWithSession( planCtx.Ctx, planCtx.SessionCtx, planCtx.TaskKey, diff --git a/pkg/disttask/framework/planner/planner_test.go b/pkg/disttask/framework/planner/planner_test.go index e515c3e0e266f..c5d3061153c82 100644 --- a/pkg/disttask/framework/planner/planner_test.go +++ b/pkg/disttask/framework/planner/planner_test.go @@ -45,7 +45,6 @@ func TestPlanner(t *testing.T) { defer pool.Close() mgr := storage.NewTaskManager(pool) storage.SetTaskManager(mgr) - p := &planner.Planner{} pCtx := planner.PlanCtx{ Ctx: ctx, diff --git a/pkg/disttask/framework/proto/BUILD.bazel b/pkg/disttask/framework/proto/BUILD.bazel index a03b24ec142c0..d635b13ad47a8 100644 --- a/pkg/disttask/framework/proto/BUILD.bazel +++ b/pkg/disttask/framework/proto/BUILD.bazel @@ -2,16 +2,27 @@ load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") go_library( name = "proto", - srcs = ["task.go"], + srcs = [ + "node.go", + "subtask.go", + "task.go", + "type.go", + ], importpath = "github.com/pingcap/tidb/pkg/disttask/framework/proto", visibility = ["//visibility:public"], + deps = ["@com_github_docker_go_units//:go-units"], ) go_test( name = "proto_test", timeout = "short", - srcs = ["task_test.go"], + srcs = [ + "subtask_test.go", + "task_test.go", + "type_test.go", + ], embed = [":proto"], flaky = True, + shard_count = 6, deps = ["@com_github_stretchr_testify//require"], ) diff --git a/pkg/disttask/framework/proto/node.go b/pkg/disttask/framework/proto/node.go new file mode 100644 index 0000000000000..aabe61479d464 --- /dev/null +++ b/pkg/disttask/framework/proto/node.go @@ -0,0 +1,25 @@ +// Copyright 2023 PingCAP, 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. + +package proto + +// ManagedNode is a TiDB node that is managed by the framework. +type ManagedNode struct { + // ID see GenerateExecID, it's named as host in the meta table. + ID string + // Role of the node, either "" or "background" + // all managed node should have the same role + Role string + CPUCount int +} diff --git a/pkg/disttask/framework/proto/subtask.go b/pkg/disttask/framework/proto/subtask.go new file mode 100644 index 0000000000000..e825aa3202300 --- /dev/null +++ b/pkg/disttask/framework/proto/subtask.go @@ -0,0 +1,189 @@ +// Copyright 2023 PingCAP, 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. + +package proto + +import ( + "fmt" + "sync/atomic" + "time" + + "github.com/docker/go-units" +) + +// subtask state machine for normal subtask: +// +// NOTE: `running` -> `pending` only happens when some node is taken as dead, so +// its running subtask is balanced to other node, and the subtask is idempotent, +// we do this to make the subtask can be scheduled to other node again, it's NOT +// a normal state transition. +// +// ┌──────────────┐ +// │ ┌───┴──┐ +// │ ┌───────►│paused│ +// ▼ │ └──────┘ +// ┌───────┐ ┌───┴───┐ ┌───────┐ +// │pending├───►│running├───►│succeed│ +// └───────┘ └┬──┬───┘ └───────┘ +// ▲ │ │ ┌──────┐ +// └────────┘ ├───────►│failed│ +// │ └──────┘ +// │ ┌────────┐ +// └───────►│canceled│ +// └────────┘ +// +// for reverting subtask: +// +// ┌──────────────┐ ┌─────────┐ ┌─────────┐ +// │revert_pending├───►│reverting├──►│ reverted│ +// └──────────────┘ └────┬────┘ └─────────┘ +// │ ┌─────────────┐ +// └────────►│revert_failed│ +// └─────────────┘ +// 1. succeed/failed: pending -> running -> succeed/failed +// 2. canceled: pending -> running -> canceled +// 3. rollback: revert_pending -> reverting -> reverted/revert_failed +// 4. pause/resume: pending -> running -> paused -> running +const ( + SubtaskStatePending SubtaskState = "pending" + SubtaskStateRunning SubtaskState = "running" + SubtaskStateSucceed SubtaskState = "succeed" + SubtaskStateFailed SubtaskState = "failed" + SubtaskStateCanceled SubtaskState = "canceled" + SubtaskStatePaused SubtaskState = "paused" + SubtaskStateRevertPending SubtaskState = "revert_pending" + SubtaskStateReverting SubtaskState = "reverting" + SubtaskStateReverted SubtaskState = "reverted" + SubtaskStateRevertFailed SubtaskState = "revert_failed" +) + +type ( + // SubtaskState is the state of subtask. + SubtaskState string +) + +func (s SubtaskState) String() string { + return string(s) +} + +// Subtask represents the subtask of distribute framework. +// Each task is divided into multiple subtasks by scheduler. +type Subtask struct { + ID int64 + Step Step + Type TaskType + // taken from task_key of the subtask table + TaskID int64 + State SubtaskState + // Concurrency is the concurrency of the subtask, should <= task's concurrency. + // some subtasks like post-process of import into, don't consume too many resources, + // can lower this value. + Concurrency int + // ExecID is the ID of target executor, right now it's the same as instance_id, + // its value is IP:PORT, see GenerateExecID + ExecID string + CreateTime time.Time + // StartTime is the time when the subtask is started. + // it's 0 if it hasn't started yet. + StartTime time.Time + // UpdateTime is the time when the subtask is updated. + // it can be used as subtask end time if the subtask is finished. + // it's 0 if it hasn't started yet. + UpdateTime time.Time + // Meta is the metadata of subtask, should not be nil. + // meta of different subtasks of same step must be different too. + Meta []byte + Summary string + // Ordinal is the ordinal of subtask, should be unique for some task and step. + // starts from 1, for reverting subtask, it's NULL in database. + Ordinal int +} + +func (t *Subtask) String() string { + return fmt.Sprintf("Subtask[ID=%d, Step=%d, Type=%s, TaskID=%d, State=%s, ExecID=%s]", + t.ID, t.Step, t.Type, t.TaskID, t.State, t.ExecID) +} + +// IsDone checks if the subtask is done. +func (t *Subtask) IsDone() bool { + return t.State == SubtaskStateSucceed || t.State == SubtaskStateReverted || t.State == SubtaskStateCanceled || + t.State == SubtaskStateFailed || t.State == SubtaskStateRevertFailed +} + +// NewSubtask create a new subtask. +func NewSubtask(step Step, taskID int64, tp TaskType, execID string, concurrency int, meta []byte, ordinal int) *Subtask { + s := &Subtask{ + Step: step, + Type: tp, + TaskID: taskID, + ExecID: execID, + Concurrency: concurrency, + Meta: meta, + Ordinal: ordinal, + } + return s +} + +// Allocatable is a resource with capacity that can be allocated, it's routine safe. +type Allocatable struct { + capacity int64 + used atomic.Int64 +} + +// NewAllocatable creates a new Allocatable. +func NewAllocatable(capacity int64) *Allocatable { + return &Allocatable{capacity: capacity} +} + +// Capacity returns the capacity of the Allocatable. +func (a *Allocatable) Capacity() int64 { + return a.capacity +} + +// Used returns the used resource of the Allocatable. +func (a *Allocatable) Used() int64 { + return a.used.Load() +} + +// Alloc allocates v from the Allocatable. +func (a *Allocatable) Alloc(n int64) bool { + for { + used := a.used.Load() + if used+n > a.capacity { + return false + } + if a.used.CompareAndSwap(used, used+n) { + return true + } + } +} + +// Free frees v from the Allocatable. +func (a *Allocatable) Free(n int64) { + a.used.Add(-n) +} + +// StepResource is the max resource that a task step can use. +// it's also the max resource that a subtask can use, as we run subtasks of task +// step in sequence. +type StepResource struct { + CPU *Allocatable + Mem *Allocatable +} + +// String implements Stringer interface. +func (s *StepResource) String() string { + return fmt.Sprintf("[CPU=%d, Mem=%s]", s.CPU.Capacity(), + units.BytesSize(float64(s.Mem.Capacity()))) +} diff --git a/pkg/disttask/framework/proto/subtask_test.go b/pkg/disttask/framework/proto/subtask_test.go new file mode 100644 index 0000000000000..09e01111428e4 --- /dev/null +++ b/pkg/disttask/framework/proto/subtask_test.go @@ -0,0 +1,78 @@ +// Copyright 2023 PingCAP, 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. + +package proto + +import ( + "math/rand" + "sync" + "testing" + "time" + + "github.com/stretchr/testify/require" +) + +func TestSubtaskIsDone(t *testing.T) { + cases := []struct { + state SubtaskState + done bool + }{ + {SubtaskStatePending, false}, + {SubtaskStateRunning, false}, + {SubtaskStateSucceed, true}, + {SubtaskStateReverting, false}, + {SubtaskStateRevertPending, false}, + {SubtaskStateFailed, true}, + {SubtaskStateRevertFailed, true}, + {SubtaskStatePaused, false}, + {SubtaskStateReverted, true}, + {SubtaskStateCanceled, true}, + } + for _, c := range cases { + require.Equal(t, c.done, (&Subtask{State: c.state}).IsDone()) + } +} + +func TestAllocatable(t *testing.T) { + allocatable := NewAllocatable(123456) + require.Equal(t, int64(123456), allocatable.Capacity()) + require.Equal(t, int64(0), allocatable.Used()) + + require.False(t, allocatable.Alloc(123457)) + require.Equal(t, int64(0), allocatable.Used()) + require.True(t, allocatable.Alloc(123)) + require.Equal(t, int64(123), allocatable.Used()) + allocatable.Free(123) + require.Equal(t, int64(0), allocatable.Used()) + + var wg sync.WaitGroup + for i := 0; i < 10; i++ { + i := i + wg.Add(1) + go func() { + defer wg.Done() + seed := time.Now().UnixNano() + t.Logf("routine: %d, seed: %d", i, seed) + rand.New(rand.NewSource(seed)) + for i := 0; i < 10000; i++ { + n := rand.Int63n(1000) + if allocatable.Alloc(n) { + allocatable.Free(n) + } + } + }() + } + wg.Wait() + require.Equal(t, int64(0), allocatable.Used()) +} diff --git a/pkg/disttask/framework/proto/task.go b/pkg/disttask/framework/proto/task.go index d2352a5974658..47952e3c8db8e 100644 --- a/pkg/disttask/framework/proto/task.go +++ b/pkg/disttask/framework/proto/task.go @@ -15,77 +15,45 @@ package proto import ( - "fmt" "time" ) // task state machine // -// ┌──────────────────────────────┐ -// │ ┌───────┐ ┌──┴───┐ -// │ ┌────────►│pausing├──────►│paused│ -// │ │ └───────┘ └──────┘ -// ▼ │ -// ┌───────┐ ┌───┴───┐ ┌────────┐ +// ┌────────┐ +// ┌───────────│resuming│◄────────┐ +// │ └────────┘ │ +// ┌──────┐ │ ┌───────┐ ┌──┴───┐ +// │failed│ │ ┌────────►│pausing├──────►│paused│ +// └──────┘ │ │ └───────┘ └──────┘ +// ▲ ▼ │ +// ┌──┴────┐ ┌───┴───┐ ┌────────┐ // │pending├────►│running├────►│succeed │ -// └──┬────┘ └───┬───┘ └────────┘ -// ▼ │ ┌──────────┐ -// ┌──────┐ ├────────►│cancelling│ -// │failed│ │ └────┬─────┘ -// └──────┘ │ ▼ -// │ ┌─────────┐ ┌────────┐ -// └────────►│reverting├────►│reverted│ -// └────┬────┘ └────────┘ -// │ ┌─────────────┐ -// └─────────►│revert_failed│ -// └─────────────┘ +// └──┬────┘ └──┬┬───┘ └────────┘ +// │ ││ ┌─────────┐ ┌────────┐ +// │ │└────────►│reverting├────►│reverted│ +// │ ▼ └────┬────┘ └────────┘ +// │ ┌──────────┐ ▲ │ ┌─────────────┐ +// └─────────►│cancelling├────┘ └─────────►│revert_failed│ +// └──────────┘ └─────────────┘ // 1. succeed: pending -> running -> succeed // 2. failed: pending -> running -> reverting -> reverted/revert_failed, pending -> failed // 3. canceled: pending -> running -> cancelling -> reverting -> reverted/revert_failed -// 3. pause/resume: pending -> running -> pausing -> paused -> running +// 4. pause/resume: pending -> running -> pausing -> paused -> running // -// subtask state machine for normal subtask: -// -// ┌──────────────┐ -// │ ┌───┴──┐ -// │ ┌───────►│paused│ -// ▼ │ └──────┘ -// ┌───────┐ ┌───┴───┐ ┌───────┐ -// │pending├───►│running├───►│succeed│ -// └───────┘ └───┬───┘ └───────┘ -// │ ┌──────┐ -// ├───────►│failed│ -// │ └──────┘ -// │ ┌────────┐ -// └───────►│canceled│ -// └────────┘ -// -// for reverting subtask: -// -// ┌──────────────┐ ┌─────────┐ ┌─────────┐ -// │revert_pending├───►│reverting├──►│ reverted│ -// └──────────────┘ └────┬────┘ └─────────┘ -// │ ┌─────────────┐ -// └────────►│revert_failed│ -// └─────────────┘ -// 1. succeed/failed: pending -> running -> succeed/failed -// 2. canceled: pending -> running -> canceled -// 3. rollback: revert_pending -> reverting -> reverted/revert_failed -// 4. pause/resume: pending -> running -> paused -> running +// TODO: we don't have revert_failed task for now. const ( - TaskStatePending TaskState = "pending" - TaskStateRunning TaskState = "running" - TaskStateSucceed TaskState = "succeed" - TaskStateReverting TaskState = "reverting" - TaskStateFailed TaskState = "failed" - TaskStateRevertFailed TaskState = "revert_failed" - TaskStateCancelling TaskState = "cancelling" - TaskStateCanceled TaskState = "canceled" - TaskStatePausing TaskState = "pausing" - TaskStatePaused TaskState = "paused" - TaskStateResuming TaskState = "resuming" - TaskStateRevertPending TaskState = "revert_pending" - TaskStateReverted TaskState = "reverted" + TaskStatePending TaskState = "pending" + TaskStateRunning TaskState = "running" + TaskStateSucceed TaskState = "succeed" + TaskStateFailed TaskState = "failed" + TaskStateReverting TaskState = "reverting" + TaskStateReverted TaskState = "reverted" + TaskStateRevertFailed TaskState = "revert_failed" + TaskStateCancelling TaskState = "cancelling" + TaskStatePausing TaskState = "pausing" + TaskStatePaused TaskState = "paused" + TaskStateResuming TaskState = "resuming" ) type ( @@ -116,119 +84,65 @@ const ( StepThree Step = 3 ) -// TaskIDLabelName is the label name of task id. -const TaskIDLabelName = "task_id" +const ( + // TaskIDLabelName is the label name of task id. + TaskIDLabelName = "task_id" + // NormalPriority represents the normal priority of task. + NormalPriority = 512 +) + +// MaxConcurrentTask is the max concurrency of task. +// TODO: remove this limit later. +var MaxConcurrentTask = 4 // Task represents the task of distributed framework. +// tasks are run in the order of: priority asc, create_time asc, id asc. type Task struct { ID int64 Key string Type TaskType State TaskState Step Step - // DispatcherID is not used now. - DispatcherID string - Concurrency uint64 + // Priority is the priority of task, the smaller value means the higher priority. + // valid range is [1, 1024], default is NormalPriority. + Priority int + // Concurrency controls the max resource usage of the task, i.e. the max number + // of slots the task can use on each node. + Concurrency int + CreateTime time.Time + + // depends on query, below fields might not be filled. + + // SchedulerID is not used now. + SchedulerID string StartTime time.Time StateUpdateTime time.Time Meta []byte Error error } -// IsFinished checks if the task is finished. -func (t *Task) IsFinished() bool { - return t.State == TaskStateSucceed || t.State == TaskStateReverted -} - -// Subtask represents the subtask of distribute framework. -// Each task is divided into multiple subtasks by dispatcher. -type Subtask struct { - ID int64 - Step Step - Type TaskType - // taken from task_key of the subtask table - TaskID int64 - State TaskState - // SchedulerID is the ID of scheduler, right now it's the same as instance_id, exec_id. - // its value is IP:PORT, see GenerateExecID - SchedulerID string - // StartTime is the time when the subtask is started. - // it's 0 if it hasn't started yet. - StartTime time.Time - // UpdateTime is the time when the subtask is updated. - // it can be used as subtask end time if the subtask is finished. - // it's 0 if it hasn't started yet. - UpdateTime time.Time - Meta []byte - Summary string -} - -// IsFinished checks if the subtask is finished. -func (t *Subtask) IsFinished() bool { - return t.State == TaskStateSucceed || t.State == TaskStateReverted || t.State == TaskStateCanceled || - t.State == TaskStateFailed || t.State == TaskStateRevertFailed +// IsDone checks if the task is done. +func (t *Task) IsDone() bool { + return t.State == TaskStateSucceed || t.State == TaskStateReverted || + t.State == TaskStateFailed } -// NewSubtask create a new subtask. -func NewSubtask(step Step, taskID int64, tp TaskType, schedulerID string, meta []byte) *Subtask { - return &Subtask{ - Step: step, - Type: tp, - TaskID: taskID, - SchedulerID: schedulerID, - Meta: meta, - } -} - -// MinimalTask is the minimal task of distribute framework. -// Each subtask is divided into multiple minimal tasks by scheduler. -type MinimalTask interface { - // IsMinimalTask is a marker to check if it is a minimal task for compiler. - IsMinimalTask() - fmt.Stringer -} - -const ( - // TaskTypeExample is TaskType of Example. - TaskTypeExample TaskType = "Example" - // TaskTypeExample2 is TaskType of Example. - TaskTypeExample2 TaskType = "Example1" - // TaskTypeExample3 is TaskType of Example. - TaskTypeExample3 TaskType = "Example2" - // ImportInto is TaskType of ImportInto. - ImportInto TaskType = "ImportInto" - // Backfill is TaskType of add index Backfilling process. - Backfill TaskType = "backfill" +var ( + // EmptyMeta is the empty meta of task/subtask. + EmptyMeta = []byte("{}") ) -// Type2Int converts task type to int. -func Type2Int(t TaskType) int { - switch t { - case TaskTypeExample: - return 1 - case ImportInto: - return 2 - case TaskTypeExample2: - return 3 - case TaskTypeExample3: - return 4 - default: - return 0 +// Compare compares two tasks by task order. +// returns < 0 represents priority of t is higher than other. +func (t *Task) Compare(other *Task) int { + if t.Priority != other.Priority { + return t.Priority - other.Priority } -} - -// Int2Type converts int to task type. -func Int2Type(i int) TaskType { - switch i { - case 1: - return TaskTypeExample - case 2: - return ImportInto - case 3: - return TaskTypeExample2 - case 4: - return TaskTypeExample3 - default: - return "" + if t.CreateTime != other.CreateTime { + if t.CreateTime.Before(other.CreateTime) { + return -1 + } + return 1 } + return int(t.ID - other.ID) } diff --git a/pkg/disttask/framework/proto/task_test.go b/pkg/disttask/framework/proto/task_test.go index b55c29ba4f7b2..a59981da333dd 100644 --- a/pkg/disttask/framework/proto/task_test.go +++ b/pkg/disttask/framework/proto/task_test.go @@ -16,6 +16,7 @@ package proto import ( "testing" + "time" "github.com/stretchr/testify/require" ) @@ -25,3 +26,50 @@ func TestTaskStep(t *testing.T) { require.Equal(t, int64(-1), int64(StepInit)) require.Equal(t, int64(-2), int64(StepDone)) } + +func TestTaskIsDone(t *testing.T) { + cases := []struct { + state TaskState + done bool + }{ + {TaskStatePending, false}, + {TaskStateRunning, false}, + {TaskStateSucceed, true}, + {TaskStateReverting, false}, + {TaskStateFailed, true}, + {TaskStateRevertFailed, false}, + {TaskStateCancelling, false}, + {TaskStatePausing, false}, + {TaskStatePaused, false}, + {TaskStateReverted, true}, + } + for _, c := range cases { + require.Equal(t, c.done, (&Task{State: c.state}).IsDone()) + } +} + +func TestTaskCompare(t *testing.T) { + taskA := Task{ + ID: 100, + Priority: NormalPriority, + CreateTime: time.Date(2023, time.December, 5, 15, 53, 30, 0, time.UTC), + } + taskB := taskA + require.Equal(t, 0, taskA.Compare(&taskB)) + taskB.Priority = 100 + require.Greater(t, taskA.Compare(&taskB), 0) + taskB.Priority = taskA.Priority + 100 + require.Less(t, taskA.Compare(&taskB), 0) + + taskB.Priority = taskA.Priority + taskB.CreateTime = time.Date(2023, time.December, 5, 15, 53, 10, 0, time.UTC) + require.Greater(t, taskA.Compare(&taskB), 0) + taskB.CreateTime = time.Date(2023, time.December, 5, 15, 53, 40, 0, time.UTC) + require.Less(t, taskA.Compare(&taskB), 0) + + taskB.CreateTime = taskA.CreateTime + taskB.ID = taskA.ID - 10 + require.Greater(t, taskA.Compare(&taskB), 0) + taskB.ID = taskA.ID + 10 + require.Less(t, taskA.Compare(&taskB), 0) +} diff --git a/pkg/disttask/framework/proto/type.go b/pkg/disttask/framework/proto/type.go new file mode 100644 index 0000000000000..b3283dc74947b --- /dev/null +++ b/pkg/disttask/framework/proto/type.go @@ -0,0 +1,52 @@ +// Copyright 2024 PingCAP, 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. + +package proto + +const ( + // TaskTypeExample is TaskType of Example. + TaskTypeExample TaskType = "Example" + // ImportInto is TaskType of ImportInto. + ImportInto TaskType = "ImportInto" + // Backfill is TaskType of add index Backfilling process. + Backfill TaskType = "backfill" +) + +// Type2Int converts task type to int. +func Type2Int(t TaskType) int { + switch t { + case TaskTypeExample: + return 1 + case ImportInto: + return 2 + case Backfill: + return 3 + default: + return 0 + } +} + +// Int2Type converts int to task type. +func Int2Type(i int) TaskType { + switch i { + case 1: + return TaskTypeExample + case 2: + return ImportInto + case 3: + return Backfill + default: + return "" + } +} diff --git a/pkg/disttask/framework/proto/type_test.go b/pkg/disttask/framework/proto/type_test.go new file mode 100644 index 0000000000000..5354e10e0d54f --- /dev/null +++ b/pkg/disttask/framework/proto/type_test.go @@ -0,0 +1,40 @@ +// Copyright 2024 PingCAP, 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. + +package proto + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func TestTaskType(t *testing.T) { + cases := []struct { + tp TaskType + val int + }{ + {TaskTypeExample, 1}, + {ImportInto, 2}, + {Backfill, 3}, + {"", 0}, + } + for _, c := range cases { + require.Equal(t, c.val, Type2Int(c.tp)) + } + + for _, c := range cases { + require.Equal(t, c.tp, Int2Type(c.val)) + } +} diff --git a/pkg/disttask/framework/scheduler/BUILD.bazel b/pkg/disttask/framework/scheduler/BUILD.bazel index 9ff3449a5411d..c721ddd939d19 100644 --- a/pkg/disttask/framework/scheduler/BUILD.bazel +++ b/pkg/disttask/framework/scheduler/BUILD.bazel @@ -3,35 +3,37 @@ load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") go_library( name = "scheduler", srcs = [ + "balancer.go", "interface.go", - "manager.go", - "register.go", + "nodes.go", "scheduler.go", + "scheduler_manager.go", + "slots.go", + "state_transform.go", ], importpath = "github.com/pingcap/tidb/pkg/disttask/framework/scheduler", visibility = ["//visibility:public"], deps = [ - "//br/pkg/lightning/common", "//br/pkg/lightning/log", - "//pkg/config", - "//pkg/disttask/framework/dispatcher", "//pkg/disttask/framework/handle", "//pkg/disttask/framework/proto", - "//pkg/disttask/framework/scheduler/execute", "//pkg/disttask/framework/storage", "//pkg/domain/infosync", + "//pkg/kv", "//pkg/metrics", - "//pkg/parser/terror", "//pkg/resourcemanager/pool/spool", "//pkg/resourcemanager/util", + "//pkg/sessionctx", "//pkg/util", "//pkg/util/backoff", - "//pkg/util/dbterror", - "//pkg/util/gctuner", + "//pkg/util/cpu", + "//pkg/util/disttask", + "//pkg/util/intest", "//pkg/util/logutil", - "//pkg/util/memory", + "//pkg/util/syncutil", "@com_github_pingcap_errors//:errors", "@com_github_pingcap_failpoint//:failpoint", + "@com_github_pingcap_log//:log", "@org_uber_go_zap//:zap", ], ) @@ -40,24 +42,41 @@ go_test( name = "scheduler_test", timeout = "short", srcs = [ - "manager_test.go", - "register_test.go", + "balancer_test.go", + "main_test.go", + "nodes_test.go", + "scheduler_manager_test.go", + "scheduler_nokit_test.go", "scheduler_test.go", + "slots_test.go", ], embed = [":scheduler"], flaky = True, - race = "on", - shard_count = 8, + race = "off", + shard_count = 30, deps = [ + "//pkg/config", "//pkg/disttask/framework/mock", - "//pkg/disttask/framework/mock/execute", "//pkg/disttask/framework/proto", - "//pkg/resourcemanager/pool/spool", - "//pkg/resourcemanager/util", + "//pkg/disttask/framework/scheduler/mock", + "//pkg/disttask/framework/storage", + "//pkg/disttask/framework/testutil", + "//pkg/domain/infosync", + "//pkg/kv", + "//pkg/sessionctx", + "//pkg/testkit", + "//pkg/testkit/testsetup", + "//pkg/util/cpu", + "//pkg/util/disttask", + "//pkg/util/logutil", + "//pkg/util/sqlexec", + "@com_github_ngaut_pools//:pools", "@com_github_pingcap_errors//:errors", + "@com_github_pingcap_failpoint//:failpoint", + "@com_github_stretchr_testify//assert", "@com_github_stretchr_testify//require", - "@org_golang_google_grpc//codes", - "@org_golang_google_grpc//status", + "@com_github_tikv_client_go_v2//util", + "@org_uber_go_goleak//:goleak", "@org_uber_go_mock//gomock", ], ) diff --git a/pkg/disttask/framework/scheduler/balancer.go b/pkg/disttask/framework/scheduler/balancer.go new file mode 100644 index 0000000000000..fcba934d14943 --- /dev/null +++ b/pkg/disttask/framework/scheduler/balancer.go @@ -0,0 +1,219 @@ +// Copyright 2023 PingCAP, 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. + +package scheduler + +import ( + "context" + "time" + + "github.com/pingcap/errors" + "github.com/pingcap/tidb/br/pkg/lightning/log" + "github.com/pingcap/tidb/pkg/disttask/framework/proto" + "github.com/pingcap/tidb/pkg/util/logutil" + "go.uber.org/zap" +) + +var ( + // balanceCheckInterval is the interval to check whether we need to balance the subtasks. + balanceCheckInterval = 3 * checkTaskFinishedInterval +) + +// balancer is used to balance subtasks on managed nodes +// it handles 2 cases: +// - managed node scale in/out. +// - nodes might run subtasks in different speed, the amount of data processed by subtasks varies, cause the subtasks are not balanced. +// +// we will try balance in task order, subtasks will be scheduled to the node with +// enough slots to run them, if there is no such node, we will skip balance for +// the task and try next one. +type balancer struct { + Param + + // a helper temporary map to record the used slots of each node during balance + // to avoid passing it around. + currUsedSlots map[string]int +} + +func newBalancer(param Param) *balancer { + return &balancer{ + Param: param, + currUsedSlots: make(map[string]int), + } +} + +func (b *balancer) balanceLoop(ctx context.Context, sm *Manager) { + for { + select { + case <-ctx.Done(): + return + case <-time.After(balanceCheckInterval): + } + b.balance(ctx, sm) + } +} + +func (b *balancer) balance(ctx context.Context, sm *Manager) { + // we will use currUsedSlots to calculate adjusted eligible nodes during balance, + // it's initial value depends on the managed nodes, to have a consistent view, + // DO NOT call getManagedNodes twice during 1 balance. + managedNodes := b.nodeMgr.getManagedNodes() + b.currUsedSlots = make(map[string]int, len(managedNodes)) + for _, n := range managedNodes { + b.currUsedSlots[n] = 0 + } + + schedulers := sm.getSchedulers() + for _, sch := range schedulers { + if err := b.balanceSubtasks(ctx, sch, managedNodes); err != nil { + logutil.Logger(ctx).Warn("failed to balance subtasks", + zap.Int64("task-id", sch.GetTask().ID), log.ShortError(err)) + return + } + } +} + +func (b *balancer) balanceSubtasks(ctx context.Context, sch Scheduler, managedNodes []string) error { + task := sch.GetTask() + eligibleNodes, err := getEligibleNodes(ctx, sch, managedNodes) + if err != nil { + return err + } + if len(eligibleNodes) == 0 { + return errors.New("no eligible nodes to balance subtasks") + } + return b.doBalanceSubtasks(ctx, task.ID, eligibleNodes) +} + +func (b *balancer) doBalanceSubtasks(ctx context.Context, taskID int64, eligibleNodes []string) (err error) { + subtasks, err := b.taskMgr.GetActiveSubtasks(ctx, taskID) + if err != nil { + return err + } + if len(subtasks) == 0 { + return nil + } + + // balance subtasks only to nodes with enough slots, from the view of all + // managed nodes, subtasks of task might not be balanced. + adjustedNodes := filterNodesWithEnoughSlots(b.currUsedSlots, b.slotMgr.getCapacity(), + eligibleNodes, subtasks[0].Concurrency) + if len(adjustedNodes) == 0 { + // no node has enough slots to run the subtasks, skip balance and skip + // update used slots. + return nil + } + adjustedNodeMap := make(map[string]struct{}, len(adjustedNodes)) + for _, n := range adjustedNodes { + adjustedNodeMap[n] = struct{}{} + } + + defer func() { + if err == nil { + b.updateUsedNodes(subtasks) + } + }() + + averageSubtaskCnt := len(subtasks) / len(adjustedNodes) + averageSubtaskRemainder := len(subtasks) - averageSubtaskCnt*len(adjustedNodes) + executorSubtasks := make(map[string][]*proto.Subtask, len(adjustedNodes)) + executorPendingCnts := make(map[string]int, len(adjustedNodes)) + for _, node := range adjustedNodes { + executorSubtasks[node] = make([]*proto.Subtask, 0, averageSubtaskCnt+1) + } + for _, subtask := range subtasks { + // put running subtask in the front of slice. + // if subtask fail-over, it's possible that there are multiple running + // subtasks for one task executor. + if subtask.State == proto.SubtaskStateRunning { + executorSubtasks[subtask.ExecID] = append([]*proto.Subtask{subtask}, executorSubtasks[subtask.ExecID]...) + } else { + executorSubtasks[subtask.ExecID] = append(executorSubtasks[subtask.ExecID], subtask) + executorPendingCnts[subtask.ExecID]++ + } + } + + subtasksNeedSchedule := make([]*proto.Subtask, 0) + remainder := averageSubtaskRemainder + executorWithOneMoreSubtask := make(map[string]struct{}, remainder) + for node, sts := range executorSubtasks { + if _, ok := adjustedNodeMap[node]; !ok { + // dead node or not have enough slots + subtasksNeedSchedule = append(subtasksNeedSchedule, sts...) + delete(executorSubtasks, node) + continue + } + if remainder > 0 { + // first remainder nodes will get 1 more subtask. + if len(sts) >= averageSubtaskCnt+1 { + needScheduleCnt := len(sts) - (averageSubtaskCnt + 1) + // running subtasks are never balanced. + needScheduleCnt = min(executorPendingCnts[node], needScheduleCnt) + subtasksNeedSchedule = append(subtasksNeedSchedule, sts[len(sts)-needScheduleCnt:]...) + executorSubtasks[node] = sts[:len(sts)-needScheduleCnt] + + executorWithOneMoreSubtask[node] = struct{}{} + remainder-- + } + } else if len(sts) > averageSubtaskCnt { + // running subtasks are never balanced. + cnt := min(executorPendingCnts[node], len(sts)-averageSubtaskCnt) + subtasksNeedSchedule = append(subtasksNeedSchedule, sts[len(sts)-cnt:]...) + executorSubtasks[node] = sts[:len(sts)-cnt] + } + } + if len(subtasksNeedSchedule) == 0 { + return nil + } + + for i := 0; i < len(adjustedNodes) && remainder > 0; i++ { + if _, ok := executorWithOneMoreSubtask[adjustedNodes[i]]; !ok { + executorWithOneMoreSubtask[adjustedNodes[i]] = struct{}{} + remainder-- + } + } + + fillIdx := 0 + for _, node := range adjustedNodes { + sts := executorSubtasks[node] + targetSubtaskCnt := averageSubtaskCnt + if _, ok := executorWithOneMoreSubtask[node]; ok { + targetSubtaskCnt = averageSubtaskCnt + 1 + } + for i := len(sts); i < targetSubtaskCnt && fillIdx < len(subtasksNeedSchedule); i++ { + subtasksNeedSchedule[fillIdx].ExecID = node + fillIdx++ + } + } + + if err = b.taskMgr.UpdateSubtasksExecIDs(ctx, subtasksNeedSchedule); err != nil { + return err + } + logutil.BgLogger().Info("balance subtasks", zap.Stringers("subtasks", subtasksNeedSchedule)) + return nil +} + +func (b *balancer) updateUsedNodes(subtasks []*proto.Subtask) { + used := make(map[string]int, len(b.currUsedSlots)) + // see slotManager.alloc in task executor. + for _, st := range subtasks { + if _, ok := used[st.ExecID]; !ok { + used[st.ExecID] = st.Concurrency + } + } + + for node, slots := range used { + b.currUsedSlots[node] += slots + } +} diff --git a/pkg/disttask/framework/scheduler/balancer_test.go b/pkg/disttask/framework/scheduler/balancer_test.go new file mode 100644 index 0000000000000..06f87c223ef73 --- /dev/null +++ b/pkg/disttask/framework/scheduler/balancer_test.go @@ -0,0 +1,433 @@ +// Copyright 2023 PingCAP, 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. + +package scheduler + +import ( + "context" + "fmt" + "testing" + + "github.com/pingcap/errors" + "github.com/pingcap/tidb/pkg/disttask/framework/mock" + "github.com/pingcap/tidb/pkg/disttask/framework/proto" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "go.uber.org/mock/gomock" +) + +type balanceTestCase struct { + subtasks []*proto.Subtask + eligibleNodes []string + initUsedSlots map[string]int + expectedSubtasks []*proto.Subtask + expectedUsedSlots map[string]int +} + +func TestBalanceOneTask(t *testing.T) { + ctrl := gomock.NewController(t) + defer ctrl.Finish() + testCases := []balanceTestCase{ + // no subtasks to balance, no need to do anything. + { + subtasks: []*proto.Subtask{}, + eligibleNodes: []string{"tidb1"}, + initUsedSlots: map[string]int{"tidb1": 0}, + expectedSubtasks: []*proto.Subtask{}, + expectedUsedSlots: map[string]int{"tidb1": 0}, + }, + // balanced, no need to do anything. + { + subtasks: []*proto.Subtask{ + {ID: 1, ExecID: "tidb1", Concurrency: 16, State: proto.SubtaskStateRunning}, + {ID: 2, ExecID: "tidb2", Concurrency: 16, State: proto.SubtaskStateRunning}, + {ID: 3, ExecID: "tidb2", Concurrency: 16, State: proto.SubtaskStatePending}, + }, + eligibleNodes: []string{"tidb1", "tidb2"}, + initUsedSlots: map[string]int{"tidb1": 0, "tidb2": 0}, + expectedSubtasks: []*proto.Subtask{ + {ID: 1, ExecID: "tidb1", Concurrency: 16, State: proto.SubtaskStateRunning}, + {ID: 2, ExecID: "tidb2", Concurrency: 16, State: proto.SubtaskStateRunning}, + {ID: 3, ExecID: "tidb2", Concurrency: 16, State: proto.SubtaskStatePending}, + }, + expectedUsedSlots: map[string]int{"tidb1": 16, "tidb2": 16}, + }, + // balanced case 2, make sure the remainder calculate part is right, so we don't + // balance subtasks to 2:2:0 + { + subtasks: []*proto.Subtask{ + {ID: 1, ExecID: "tidb2", Concurrency: 16, State: proto.SubtaskStateRunning}, + {ID: 2, ExecID: "tidb2", Concurrency: 16, State: proto.SubtaskStatePending}, + {ID: 3, ExecID: "tidb1", Concurrency: 16, State: proto.SubtaskStatePending}, + {ID: 4, ExecID: "tidb3", Concurrency: 16, State: proto.SubtaskStatePending}, + }, + eligibleNodes: []string{"tidb1", "tidb2", "tidb3"}, + initUsedSlots: map[string]int{"tidb1": 0, "tidb2": 0, "tidb3": 0}, + expectedSubtasks: []*proto.Subtask{ + {ID: 1, ExecID: "tidb2", Concurrency: 16, State: proto.SubtaskStateRunning}, + {ID: 2, ExecID: "tidb2", Concurrency: 16, State: proto.SubtaskStatePending}, + {ID: 3, ExecID: "tidb1", Concurrency: 16, State: proto.SubtaskStatePending}, + {ID: 4, ExecID: "tidb3", Concurrency: 16, State: proto.SubtaskStatePending}, + }, + expectedUsedSlots: map[string]int{"tidb1": 16, "tidb2": 16, "tidb3": 16}, + }, + // no eligible nodes to run those subtasks, leave it unbalanced. + // used slots will not be changed. + { + subtasks: []*proto.Subtask{ + {ID: 1, ExecID: "tidb1", Concurrency: 16, State: proto.SubtaskStateRunning}, + {ID: 2, ExecID: "tidb1", Concurrency: 16, State: proto.SubtaskStatePending}, + }, + eligibleNodes: []string{"tidb1", "tidb2"}, + initUsedSlots: map[string]int{"tidb1": 8, "tidb2": 8}, + expectedSubtasks: []*proto.Subtask{ + {ID: 1, ExecID: "tidb1", Concurrency: 16, State: proto.SubtaskStateRunning}, + {ID: 2, ExecID: "tidb1", Concurrency: 16, State: proto.SubtaskStatePending}, + }, + expectedUsedSlots: map[string]int{"tidb1": 8, "tidb2": 8}, + }, + // balance subtasks to eligible nodes, tidb1 has 8 used slots cannot run target subtasks. + // all subtasks will be balanced to tidb2. + { + subtasks: []*proto.Subtask{ + {ID: 1, ExecID: "tidb1", Concurrency: 16, State: proto.SubtaskStateRunning}, + {ID: 2, ExecID: "tidb1", Concurrency: 16, State: proto.SubtaskStatePending}, + }, + eligibleNodes: []string{"tidb1", "tidb2"}, + initUsedSlots: map[string]int{"tidb1": 8, "tidb2": 0}, + expectedSubtasks: []*proto.Subtask{ + {ID: 1, ExecID: "tidb2", Concurrency: 16, State: proto.SubtaskStateRunning}, + {ID: 2, ExecID: "tidb2", Concurrency: 16, State: proto.SubtaskStatePending}, + }, + expectedUsedSlots: map[string]int{"tidb1": 8, "tidb2": 16}, + }, + // running subtasks are not re-scheduled if the node is eligible, we leave it un-balanced. + // task executor should mark those subtasks as pending, then we can balance them. + { + subtasks: []*proto.Subtask{ + {ID: 1, ExecID: "tidb1", Concurrency: 16, State: proto.SubtaskStateRunning}, + {ID: 2, ExecID: "tidb1", Concurrency: 16, State: proto.SubtaskStateRunning}, + {ID: 3, ExecID: "tidb1", Concurrency: 16, State: proto.SubtaskStateRunning}, + }, + eligibleNodes: []string{"tidb1", "tidb2"}, + initUsedSlots: map[string]int{"tidb1": 0, "tidb2": 0}, + expectedSubtasks: []*proto.Subtask{ + {ID: 1, ExecID: "tidb1", Concurrency: 16, State: proto.SubtaskStateRunning}, + {ID: 2, ExecID: "tidb1", Concurrency: 16, State: proto.SubtaskStateRunning}, + {ID: 3, ExecID: "tidb1", Concurrency: 16, State: proto.SubtaskStateRunning}, + }, + expectedUsedSlots: map[string]int{"tidb1": 16, "tidb2": 0}, + }, + // balance from 1:4 to 2:3 + { + subtasks: []*proto.Subtask{ + {ID: 1, ExecID: "tidb1", Concurrency: 16, State: proto.SubtaskStateRunning}, + {ID: 2, ExecID: "tidb2", Concurrency: 16, State: proto.SubtaskStateRunning}, + {ID: 3, ExecID: "tidb2", Concurrency: 16, State: proto.SubtaskStatePending}, + {ID: 4, ExecID: "tidb2", Concurrency: 16, State: proto.SubtaskStatePending}, + {ID: 5, ExecID: "tidb2", Concurrency: 16, State: proto.SubtaskStatePending}, + }, + eligibleNodes: []string{"tidb1", "tidb2"}, + initUsedSlots: map[string]int{"tidb1": 0, "tidb2": 0}, + expectedSubtasks: []*proto.Subtask{ + {ID: 1, ExecID: "tidb1", Concurrency: 16, State: proto.SubtaskStateRunning}, + {ID: 2, ExecID: "tidb2", Concurrency: 16, State: proto.SubtaskStateRunning}, + {ID: 3, ExecID: "tidb2", Concurrency: 16, State: proto.SubtaskStatePending}, + {ID: 4, ExecID: "tidb2", Concurrency: 16, State: proto.SubtaskStatePending}, + {ID: 5, ExecID: "tidb1", Concurrency: 16, State: proto.SubtaskStatePending}, + }, + expectedUsedSlots: map[string]int{"tidb1": 16, "tidb2": 16}, + }, + // scale out, balance from 5 to 2:2:1 + { + subtasks: []*proto.Subtask{ + {ID: 1, ExecID: "tidb1", Concurrency: 16, State: proto.SubtaskStateRunning}, + {ID: 2, ExecID: "tidb1", Concurrency: 16, State: proto.SubtaskStatePending}, + {ID: 3, ExecID: "tidb1", Concurrency: 16, State: proto.SubtaskStatePending}, + {ID: 4, ExecID: "tidb1", Concurrency: 16, State: proto.SubtaskStatePending}, + {ID: 5, ExecID: "tidb1", Concurrency: 16, State: proto.SubtaskStatePending}, + }, + eligibleNodes: []string{"tidb1", "tidb2", "tidb3"}, + initUsedSlots: map[string]int{"tidb1": 0, "tidb2": 0, "tidb3": 0}, + expectedSubtasks: []*proto.Subtask{ + {ID: 1, ExecID: "tidb1", Concurrency: 16, State: proto.SubtaskStateRunning}, + {ID: 2, ExecID: "tidb1", Concurrency: 16, State: proto.SubtaskStatePending}, + {ID: 3, ExecID: "tidb2", Concurrency: 16, State: proto.SubtaskStatePending}, + {ID: 4, ExecID: "tidb2", Concurrency: 16, State: proto.SubtaskStatePending}, + {ID: 5, ExecID: "tidb3", Concurrency: 16, State: proto.SubtaskStatePending}, + }, + expectedUsedSlots: map[string]int{"tidb1": 16, "tidb2": 16, "tidb3": 16}, + }, + // scale out case 2: balance from 4 to 2:1:1 + // this case checks the remainder part is right, so we don't balance it as 2:2:0. + { + subtasks: []*proto.Subtask{ + {ID: 1, ExecID: "tidb2", Concurrency: 16, State: proto.SubtaskStateRunning}, + {ID: 2, ExecID: "tidb2", Concurrency: 16, State: proto.SubtaskStatePending}, + {ID: 3, ExecID: "tidb2", Concurrency: 16, State: proto.SubtaskStatePending}, + {ID: 4, ExecID: "tidb2", Concurrency: 16, State: proto.SubtaskStatePending}, + }, + eligibleNodes: []string{"tidb1", "tidb2", "tidb3"}, + initUsedSlots: map[string]int{"tidb1": 0, "tidb2": 0, "tidb3": 0}, + expectedSubtasks: []*proto.Subtask{ + {ID: 1, ExecID: "tidb2", Concurrency: 16, State: proto.SubtaskStateRunning}, + {ID: 2, ExecID: "tidb2", Concurrency: 16, State: proto.SubtaskStatePending}, + {ID: 3, ExecID: "tidb1", Concurrency: 16, State: proto.SubtaskStatePending}, + {ID: 4, ExecID: "tidb3", Concurrency: 16, State: proto.SubtaskStatePending}, + }, + expectedUsedSlots: map[string]int{"tidb1": 16, "tidb2": 16, "tidb3": 16}, + }, + // scale in, balance from 1:3:1 to 3:2 + { + subtasks: []*proto.Subtask{ + {ID: 1, ExecID: "tidb1", Concurrency: 16, State: proto.SubtaskStateRunning}, + {ID: 2, ExecID: "tidb2", Concurrency: 16, State: proto.SubtaskStateRunning}, + {ID: 3, ExecID: "tidb2", Concurrency: 16, State: proto.SubtaskStatePending}, + {ID: 4, ExecID: "tidb2", Concurrency: 16, State: proto.SubtaskStatePending}, + {ID: 5, ExecID: "tidb3", Concurrency: 16, State: proto.SubtaskStateRunning}, + }, + eligibleNodes: []string{"tidb1", "tidb3"}, + initUsedSlots: map[string]int{"tidb1": 0, "tidb3": 0}, + expectedSubtasks: []*proto.Subtask{ + {ID: 1, ExecID: "tidb1", Concurrency: 16, State: proto.SubtaskStateRunning}, + {ID: 2, ExecID: "tidb1", Concurrency: 16, State: proto.SubtaskStateRunning}, + {ID: 3, ExecID: "tidb1", Concurrency: 16, State: proto.SubtaskStatePending}, + {ID: 4, ExecID: "tidb3", Concurrency: 16, State: proto.SubtaskStatePending}, + {ID: 5, ExecID: "tidb3", Concurrency: 16, State: proto.SubtaskStateRunning}, + }, + expectedUsedSlots: map[string]int{"tidb1": 16, "tidb3": 16}, + }, + // scale in and out at the same time, balance from 2:1 to 2:1 + { + subtasks: []*proto.Subtask{ + {ID: 1, ExecID: "tidb1", Concurrency: 16, State: proto.SubtaskStateRunning}, + {ID: 2, ExecID: "tidb1", Concurrency: 16, State: proto.SubtaskStatePending}, + {ID: 3, ExecID: "tidb2", Concurrency: 16, State: proto.SubtaskStatePending}, + }, + eligibleNodes: []string{"tidb2", "tidb3"}, + initUsedSlots: map[string]int{"tidb2": 0, "tidb3": 0}, + expectedSubtasks: []*proto.Subtask{ + {ID: 1, ExecID: "tidb2", Concurrency: 16, State: proto.SubtaskStateRunning}, + {ID: 2, ExecID: "tidb3", Concurrency: 16, State: proto.SubtaskStatePending}, + {ID: 3, ExecID: "tidb2", Concurrency: 16, State: proto.SubtaskStatePending}, + }, + expectedUsedSlots: map[string]int{"tidb2": 16, "tidb3": 16}, + }, + } + + ctx := context.Background() + for i, c := range testCases { + t.Run(fmt.Sprintf("case %d", i), func(t *testing.T) { + mockTaskMgr := mock.NewMockTaskManager(ctrl) + mockTaskMgr.EXPECT().GetActiveSubtasks(gomock.Any(), gomock.Any()).Return(c.subtasks, nil) + if !assert.ObjectsAreEqual(c.subtasks, c.expectedSubtasks) { + mockTaskMgr.EXPECT().UpdateSubtasksExecIDs(gomock.Any(), gomock.Any()).Return(nil) + } + mockScheduler := mock.NewMockScheduler(ctrl) + mockScheduler.EXPECT().GetTask().Return(&proto.Task{ID: 1}).Times(2) + mockScheduler.EXPECT().GetEligibleInstances(gomock.Any(), gomock.Any()).Return(nil, nil) + + slotMgr := newSlotManager() + slotMgr.updateCapacity(16) + b := newBalancer(Param{ + taskMgr: mockTaskMgr, + nodeMgr: newNodeManager(), + slotMgr: slotMgr, + }) + b.currUsedSlots = c.initUsedSlots + require.NoError(t, b.balanceSubtasks(ctx, mockScheduler, c.eligibleNodes)) + require.Equal(t, c.expectedUsedSlots, b.currUsedSlots) + // c.subtasks is updated in-place + require.Equal(t, c.expectedSubtasks, c.subtasks) + require.True(t, ctrl.Satisfied()) + }) + } + + t.Run("scheduler err or no instance", func(t *testing.T) { + mockTaskMgr := mock.NewMockTaskManager(ctrl) + mockScheduler := mock.NewMockScheduler(ctrl) + mockScheduler.EXPECT().GetTask().Return(&proto.Task{ID: 1}).Times(2) + mockScheduler.EXPECT().GetEligibleInstances(gomock.Any(), gomock.Any()).Return(nil, errors.New("mock error")) + slotMgr := newSlotManager() + slotMgr.updateCapacity(16) + b := newBalancer(Param{ + taskMgr: mockTaskMgr, + nodeMgr: newNodeManager(), + slotMgr: slotMgr, + }) + require.ErrorContains(t, b.balanceSubtasks(ctx, mockScheduler, []string{"tidb1"}), "mock error") + require.True(t, ctrl.Satisfied()) + + mockScheduler.EXPECT().GetTask().Return(&proto.Task{ID: 1}).Times(2) + mockScheduler.EXPECT().GetEligibleInstances(gomock.Any(), gomock.Any()).Return(nil, nil) + require.ErrorContains(t, b.balanceSubtasks(ctx, mockScheduler, nil), "no eligible nodes to balance subtasks") + require.True(t, ctrl.Satisfied()) + }) + + t.Run("task mgr failed", func(t *testing.T) { + mockTaskMgr := mock.NewMockTaskManager(ctrl) + mockTaskMgr.EXPECT().GetActiveSubtasks(gomock.Any(), gomock.Any()).Return(nil, errors.New("mock error")) + mockScheduler := mock.NewMockScheduler(ctrl) + mockScheduler.EXPECT().GetTask().Return(&proto.Task{ID: 1}).Times(2) + mockScheduler.EXPECT().GetEligibleInstances(gomock.Any(), gomock.Any()).Return([]string{"tidb1"}, nil) + + slotMgr := newSlotManager() + slotMgr.updateCapacity(16) + b := newBalancer(Param{ + taskMgr: mockTaskMgr, + nodeMgr: newNodeManager(), + slotMgr: slotMgr, + }) + require.ErrorContains(t, b.balanceSubtasks(ctx, mockScheduler, []string{"tidb1"}), "mock error") + require.True(t, ctrl.Satisfied()) + + b.currUsedSlots = map[string]int{"tidb1": 0, "tidb2": 0} + mockTaskMgr.EXPECT().GetActiveSubtasks(gomock.Any(), gomock.Any()).Return( + []*proto.Subtask{ + {ID: 1, ExecID: "tidb1", Concurrency: 16, State: proto.SubtaskStateRunning}, + {ID: 2, ExecID: "tidb1", Concurrency: 16, State: proto.SubtaskStatePending}, + }, nil) + mockTaskMgr.EXPECT().UpdateSubtasksExecIDs(gomock.Any(), gomock.Any()).Return(errors.New("mock error2")) + mockScheduler.EXPECT().GetTask().Return(&proto.Task{ID: 1}).Times(2) + mockScheduler.EXPECT().GetEligibleInstances(gomock.Any(), gomock.Any()).Return(nil, nil) + require.ErrorContains(t, b.balanceSubtasks(ctx, mockScheduler, []string{"tidb1", "tidb2"}), "mock error2") + // not updated + require.Equal(t, map[string]int{"tidb1": 0, "tidb2": 0}, b.currUsedSlots) + require.True(t, ctrl.Satisfied()) + }) +} + +func TestBalanceMultipleTasks(t *testing.T) { + ctrl := gomock.NewController(t) + defer ctrl.Finish() + mockTaskMgr := mock.NewMockTaskManager(ctrl) + + taskCases := []struct { + subtasks, expectedSubtasks []*proto.Subtask + }{ + // task 1 is balanced + // used slots will be {tidb1: 8, tidb2: 8, tidb3: 0} + { + subtasks: []*proto.Subtask{ + {ID: 1, ExecID: "tidb1", Concurrency: 8, State: proto.SubtaskStateRunning}, + {ID: 2, ExecID: "tidb2", Concurrency: 8, State: proto.SubtaskStateRunning}, + }, + expectedSubtasks: []*proto.Subtask{ + {ID: 1, ExecID: "tidb1", Concurrency: 8, State: proto.SubtaskStateRunning}, + {ID: 2, ExecID: "tidb2", Concurrency: 8, State: proto.SubtaskStateRunning}, + }, + }, + // task 2 require balance + // used slots will be {tidb1: 16, tidb2: 16, tidb3: 8} + { + subtasks: []*proto.Subtask{ + {ID: 3, ExecID: "tidb1", Concurrency: 8, State: proto.SubtaskStateRunning}, + {ID: 4, ExecID: "tidb4", Concurrency: 8, State: proto.SubtaskStateRunning}, + {ID: 5, ExecID: "tidb4", Concurrency: 8, State: proto.SubtaskStatePending}, + }, + expectedSubtasks: []*proto.Subtask{ + {ID: 3, ExecID: "tidb1", Concurrency: 8, State: proto.SubtaskStateRunning}, + {ID: 4, ExecID: "tidb2", Concurrency: 8, State: proto.SubtaskStateRunning}, + {ID: 5, ExecID: "tidb3", Concurrency: 8, State: proto.SubtaskStatePending}, + }, + }, + // task 3 require balance, but no eligible node, so it's not balanced, and + // used slots are not updated + // used slots will be {tidb1: 16, tidb2: 16, tidb3: 8} + { + subtasks: []*proto.Subtask{ + {ID: 6, ExecID: "tidb4", Concurrency: 16, State: proto.SubtaskStatePending}, + {ID: 7, ExecID: "tidb4", Concurrency: 16, State: proto.SubtaskStatePending}, + }, + expectedSubtasks: []*proto.Subtask{ + {ID: 6, ExecID: "tidb4", Concurrency: 16, State: proto.SubtaskStatePending}, + {ID: 7, ExecID: "tidb4", Concurrency: 16, State: proto.SubtaskStatePending}, + }, + }, + // task 4 require balance + // used slots will be {tidb1: 16, tidb2: 16, tidb3: 16} + { + subtasks: []*proto.Subtask{ + {ID: 8, ExecID: "tidb1", Concurrency: 8, State: proto.SubtaskStatePending}, + }, + expectedSubtasks: []*proto.Subtask{ + {ID: 8, ExecID: "tidb3", Concurrency: 8, State: proto.SubtaskStatePending}, + }, + }, + } + ctx := context.Background() + + manager, err := NewManager(ctx, mockTaskMgr, "1") + require.NoError(t, err) + manager.slotMgr.updateCapacity(16) + manager.nodeMgr.managedNodes.Store(&[]string{"tidb1", "tidb2", "tidb3"}) + b := newBalancer(Param{ + taskMgr: manager.taskMgr, + nodeMgr: manager.nodeMgr, + slotMgr: manager.slotMgr, + }) + for i := range taskCases { + taskID := int64(i + 1) + sch := mock.NewMockScheduler(ctrl) + sch.EXPECT().GetTask().Return(&proto.Task{ID: taskID}).AnyTimes() + manager.addScheduler(taskID, sch) + } + require.Len(t, manager.getSchedulers(), 4) + + // fail fast if balance failed on some task + manager.getSchedulers()[0].(*mock.MockScheduler).EXPECT(). + GetEligibleInstances(gomock.Any(), gomock.Any()).Return(nil, errors.New("mock error")) + b.balance(ctx, manager) + require.True(t, ctrl.Satisfied()) + + // balance multiple tasks + for i, c := range taskCases { + taskID := int64(i + 1) + if !assert.ObjectsAreEqual(c.subtasks, c.expectedSubtasks) { + gomock.InOrder( + manager.getSchedulers()[i].(*mock.MockScheduler).EXPECT(). + GetEligibleInstances(gomock.Any(), gomock.Any()).Return(nil, nil), + mockTaskMgr.EXPECT().GetActiveSubtasks(gomock.Any(), taskID).Return(c.subtasks, nil), + mockTaskMgr.EXPECT().UpdateSubtasksExecIDs(gomock.Any(), gomock.Any()).Return(nil), + ) + } else { + gomock.InOrder( + manager.getSchedulers()[i].(*mock.MockScheduler).EXPECT(). + GetEligibleInstances(gomock.Any(), gomock.Any()).Return(nil, nil), + mockTaskMgr.EXPECT().GetActiveSubtasks(gomock.Any(), taskID).Return(c.subtasks, nil), + ) + } + } + b.balance(ctx, manager) + require.Equal(t, map[string]int{"tidb1": 16, "tidb2": 16, "tidb3": 16}, b.currUsedSlots) + require.True(t, ctrl.Satisfied()) + for _, c := range taskCases { + require.Equal(t, c.expectedSubtasks, c.subtasks) + } +} + +func TestBalancerUpdateUsedNodes(t *testing.T) { + b := newBalancer(Param{}) + b.updateUsedNodes([]*proto.Subtask{ + {ID: 1, ExecID: "tidb1", Concurrency: 16, State: proto.SubtaskStateRunning}, + {ID: 2, ExecID: "tidb1", Concurrency: 16, State: proto.SubtaskStatePending}, + }) + require.Equal(t, map[string]int{"tidb1": 16}, b.currUsedSlots) + b.updateUsedNodes([]*proto.Subtask{ + {ID: 3, ExecID: "tidb1", Concurrency: 4, State: proto.SubtaskStateRunning}, + {ID: 4, ExecID: "tidb2", Concurrency: 8, State: proto.SubtaskStatePending}, + {ID: 5, ExecID: "tidb3", Concurrency: 12, State: proto.SubtaskStatePending}, + }) + require.Equal(t, map[string]int{"tidb1": 20, "tidb2": 8, "tidb3": 12}, b.currUsedSlots) +} diff --git a/pkg/disttask/framework/scheduler/interface.go b/pkg/disttask/framework/scheduler/interface.go index dc2c4aa9375af..ec9b8f6d6992f 100644 --- a/pkg/disttask/framework/scheduler/interface.go +++ b/pkg/disttask/framework/scheduler/interface.go @@ -18,85 +18,195 @@ import ( "context" "github.com/pingcap/tidb/pkg/disttask/framework/proto" - "github.com/pingcap/tidb/pkg/disttask/framework/scheduler/execute" + "github.com/pingcap/tidb/pkg/disttask/framework/storage" + "github.com/pingcap/tidb/pkg/sessionctx" + "github.com/pingcap/tidb/pkg/util/syncutil" ) -// TaskTable defines the interface to access task table. -type TaskTable interface { - GetGlobalTasksInStates(ctx context.Context, states ...interface{}) (task []*proto.Task, err error) - GetGlobalTaskByID(ctx context.Context, taskID int64) (task *proto.Task, err error) - - GetSubtasksInStates(ctx context.Context, tidbID string, taskID int64, step proto.Step, states ...interface{}) ([]*proto.Subtask, error) - GetFirstSubtaskInStates(ctx context.Context, instanceID string, taskID int64, step proto.Step, states ...interface{}) (*proto.Subtask, error) - StartManager(ctx context.Context, tidbID string, role string) error - StartSubtask(ctx context.Context, subtaskID int64) error - UpdateSubtaskStateAndError(ctx context.Context, tidbID string, subtaskID int64, state proto.TaskState, err error) error - FinishSubtask(ctx context.Context, tidbID string, subtaskID int64, meta []byte) error - - HasSubtasksInStates(ctx context.Context, tidbID string, taskID int64, step proto.Step, states ...interface{}) (bool, error) - UpdateErrorToSubtask(ctx context.Context, tidbID string, taskID int64, err error) error - IsSchedulerCanceled(ctx context.Context, tidbID string, taskID int64) (bool, error) - PauseSubtasks(ctx context.Context, tidbID string, taskID int64) error +// TaskManager defines the interface to access task table. +type TaskManager interface { + // GetTopUnfinishedTasks returns unfinished tasks, limited by MaxConcurrentTask*2, + // to make sure lower priority tasks can be scheduled if resource is enough. + // The returned tasks are sorted by task order, see proto.Task, and only contains + // some fields, see row2TaskBasic. + GetTopUnfinishedTasks(ctx context.Context) ([]*proto.Task, error) + GetTasksInStates(ctx context.Context, states ...interface{}) (task []*proto.Task, err error) + GetTaskByID(ctx context.Context, taskID int64) (task *proto.Task, err error) + UpdateTaskAndAddSubTasks(ctx context.Context, task *proto.Task, subtasks []*proto.Subtask, prevState proto.TaskState) (bool, error) + GCSubtasks(ctx context.Context) error + GetAllNodes(ctx context.Context) ([]proto.ManagedNode, error) + DeleteDeadNodes(ctx context.Context, nodes []string) error + // TransferTask2History transfer tasks and it's related subtasks to history tables. + TransferTasks2History(ctx context.Context, tasks []*proto.Task) error + // CancelTask updated task state to canceling. + CancelTask(ctx context.Context, taskID int64) error + // FailTask updates task state to Failed and updates task error. + FailTask(ctx context.Context, taskID int64, currentState proto.TaskState, taskErr error) error + // RevertedTask updates task state to reverted. + RevertedTask(ctx context.Context, taskID int64) error + // PauseTask updated task state to pausing. + PauseTask(ctx context.Context, taskKey string) (bool, error) + // PausedTask updated task state to paused. + PausedTask(ctx context.Context, taskID int64) error + // SucceedTask updates a task to success state. + SucceedTask(ctx context.Context, taskID int64) error + // SwitchTaskStep switches the task to the next step and add subtasks in one + // transaction. It will change task state too if we're switch from InitStep to + // next step. + SwitchTaskStep(ctx context.Context, task *proto.Task, nextState proto.TaskState, nextStep proto.Step, subtasks []*proto.Subtask) error + // SwitchTaskStepInBatch similar to SwitchTaskStep, but it will insert subtasks + // in batch, and task step change will be in a separate transaction. + // Note: subtasks of this step must be stable, i.e. count, order and content + // should be the same on each try, else the subtasks inserted might be messed up. + // And each subtask of this step must be different, to handle the network + // partition or owner change. + SwitchTaskStepInBatch(ctx context.Context, task *proto.Task, nextState proto.TaskState, nextStep proto.Step, subtasks []*proto.Subtask) error + // GetUsedSlotsOnNodes returns the used slots on nodes that have subtask scheduled. + // subtasks of each task on one node is only accounted once as we don't support + // running them concurrently. + // we only consider pending/running subtasks, subtasks related to revert are + // not considered. + GetUsedSlotsOnNodes(ctx context.Context) (map[string]int, error) + // GetActiveSubtasks returns subtasks of the task that are in pending/running state. + // the returned subtasks only contains some fields, see row2SubtaskBasic. + GetActiveSubtasks(ctx context.Context, taskID int64) ([]*proto.Subtask, error) + // GetSubtaskCntGroupByStates returns the count of subtasks of some step group by state. + GetSubtaskCntGroupByStates(ctx context.Context, taskID int64, step proto.Step) (map[proto.SubtaskState]int64, error) + ResumeSubtasks(ctx context.Context, taskID int64) error + GetSubtaskErrors(ctx context.Context, taskID int64) ([]error, error) + UpdateSubtasksExecIDs(ctx context.Context, subtasks []*proto.Subtask) error + // GetManagedNodes returns the nodes managed by dist framework and can be used + // to execute tasks. If there are any nodes with background role, we use them, + // else we use nodes without role. + // returned nodes are sorted by node id(host:port). + GetManagedNodes(ctx context.Context) ([]proto.ManagedNode, error) + // GetTaskExecutorIDsByTaskID gets the task executor IDs of the given task ID. + GetTaskExecutorIDsByTaskID(ctx context.Context, taskID int64) ([]string, error) + + // GetAllSubtasksByStepAndState gets all subtasks by given states for one step. + GetAllSubtasksByStepAndState(ctx context.Context, taskID int64, step proto.Step, state proto.SubtaskState) ([]*proto.Subtask, error) + + WithNewSession(fn func(se sessionctx.Context) error) error + WithNewTxn(ctx context.Context, fn func(se sessionctx.Context) error) error } -// Pool defines the interface of a pool. -type Pool interface { - Run(func()) error - RunWithConcurrency(chan func(), uint32) error - ReleaseAndWait() +// Extension is used to control the process operations for each task. +// it's used to extend functions of BaseScheduler. +// as golang doesn't support inheritance, we embed this interface in Scheduler +// to simulate abstract method as in other OO languages. +type Extension interface { + // OnTick is used to handle the ticker event, if business impl need to do some periodical work, you can + // do it here, but don't do too much work here, because the ticker interval is small, and it will block + // the event is generated every checkTaskRunningInterval, and only when the task NOT FINISHED and NO ERROR. + OnTick(ctx context.Context, task *proto.Task) + + // OnNextSubtasksBatch is used to generate batch of subtasks for next stage + // NOTE: don't change task.State inside, framework will manage it. + // it's called when: + // 1. task is pending and entering it's first step. + // 2. subtasks scheduled has all finished with no error. + // when next step is StepDone, it should return nil, nil. + OnNextSubtasksBatch(ctx context.Context, h storage.TaskHandle, task *proto.Task, execIDs []string, step proto.Step) (subtaskMetas [][]byte, err error) + + // OnDone is called when task is done, either finished successfully or failed + // with error. + // if the task is failed when initializing scheduler, or it's an unknown task, + // we don't call this function. + OnDone(ctx context.Context, h storage.TaskHandle, task *proto.Task) error + + // GetEligibleInstances is used to get the eligible instances for the task. + // on certain condition we may want to use some instances to do the task, such as instances with more disk. + // if returned instances is empty, it means all instances are eligible. + // TODO: run import from server disk using framework makes this logic complicated, + // the instance might not be managed by framework. + GetEligibleInstances(ctx context.Context, task *proto.Task) ([]string, error) + + // IsRetryableErr is used to check whether the error occurred in scheduler is retryable. + IsRetryableErr(err error) bool + + // GetNextStep is used to get the next step for the task. + // if task runs successfully, it should go from StepInit to business steps, + // then to StepDone, then scheduler will mark it as finished. + GetNextStep(task *proto.Task) proto.Step } -// Scheduler is the subtask scheduler for a task. -// Each task type should implement this interface. -type Scheduler interface { - Init(context.Context) error - Run(context.Context, *proto.Task) error - Rollback(context.Context, *proto.Task) error - Pause(context.Context, *proto.Task) error - Close() +// Param is used to pass parameters when creating scheduler. +type Param struct { + taskMgr TaskManager + nodeMgr *NodeManager + slotMgr *SlotManager } -// Extension extends the scheduler. -// each task type should implement this interface. -type Extension interface { - // IsIdempotent returns whether the subtask is idempotent. - // when tidb restart, the subtask might be left in the running state. - // if it's idempotent, the scheduler can rerun the subtask, else - // the scheduler will mark the subtask as failed. - IsIdempotent(subtask *proto.Subtask) bool - // GetSubtaskExecutor returns the subtask executor for the subtask. - // Note: summary is the summary manager of all subtask of the same type now. - GetSubtaskExecutor(ctx context.Context, task *proto.Task, summary *execute.Summary) (execute.SubtaskExecutor, error) +// schedulerFactoryFn is used to create a scheduler. +type schedulerFactoryFn func(ctx context.Context, task *proto.Task, param Param) Scheduler + +var schedulerFactoryMap = struct { + syncutil.RWMutex + m map[proto.TaskType]schedulerFactoryFn +}{ + m: make(map[proto.TaskType]schedulerFactoryFn), } -// EmptySubtaskExecutor is an empty scheduler. -// it can be used for the task that does not need to split into subtasks. -type EmptySubtaskExecutor struct { +// RegisterSchedulerFactory is used to register the scheduler factory. +// normally scheduler ctor should be registered before the server start. +// and should be called in a single routine, such as in init(). +// after the server start, there's should be no write to the map. +// but for index backfill, the register call stack is so deep, not sure +// if it's safe to do so, so we use a lock here. +func RegisterSchedulerFactory(taskType proto.TaskType, ctor schedulerFactoryFn) { + schedulerFactoryMap.Lock() + defer schedulerFactoryMap.Unlock() + schedulerFactoryMap.m[taskType] = ctor } -var _ execute.SubtaskExecutor = &EmptySubtaskExecutor{} +// getSchedulerFactory is used to get the scheduler factory. +func getSchedulerFactory(taskType proto.TaskType) schedulerFactoryFn { + schedulerFactoryMap.RLock() + defer schedulerFactoryMap.RUnlock() + return schedulerFactoryMap.m[taskType] +} + +// ClearSchedulerFactory is only used in test. +func ClearSchedulerFactory() { + schedulerFactoryMap.Lock() + defer schedulerFactoryMap.Unlock() + schedulerFactoryMap.m = make(map[proto.TaskType]schedulerFactoryFn) +} -// Init implements the SubtaskExecutor interface. -func (*EmptySubtaskExecutor) Init(context.Context) error { - return nil +// CleanUpRoutine is used for the framework to do some clean up work if the task is finished. +type CleanUpRoutine interface { + // CleanUp do the cleanup work. + // task.Meta can be updated here, such as redacting some sensitive info. + CleanUp(ctx context.Context, task *proto.Task) error } +type cleanUpFactoryFn func() CleanUpRoutine -// RunSubtask implements the SubtaskExecutor interface. -func (*EmptySubtaskExecutor) RunSubtask(context.Context, *proto.Subtask) error { - return nil +var cleanUpFactoryMap = struct { + syncutil.RWMutex + m map[proto.TaskType]cleanUpFactoryFn +}{ + m: make(map[proto.TaskType]cleanUpFactoryFn), } -// Cleanup implements the SubtaskExecutor interface. -func (*EmptySubtaskExecutor) Cleanup(context.Context) error { - return nil +// RegisterSchedulerCleanUpFactory is used to register the scheduler clean up factory. +// normally scheduler cleanup is used in the scheduler_manager gcTaskLoop to do clean up +// works when tasks are finished. +func RegisterSchedulerCleanUpFactory(taskType proto.TaskType, ctor cleanUpFactoryFn) { + cleanUpFactoryMap.Lock() + defer cleanUpFactoryMap.Unlock() + cleanUpFactoryMap.m[taskType] = ctor } -// OnFinished implements the SubtaskExecutor interface. -func (*EmptySubtaskExecutor) OnFinished(_ context.Context, _ *proto.Subtask) error { - return nil +// getSchedulerCleanUpFactory is used to get the scheduler factory. +func getSchedulerCleanUpFactory(taskType proto.TaskType) cleanUpFactoryFn { + cleanUpFactoryMap.RLock() + defer cleanUpFactoryMap.RUnlock() + return cleanUpFactoryMap.m[taskType] } -// Rollback implements the SubtaskExecutor interface. -func (*EmptySubtaskExecutor) Rollback(context.Context) error { - return nil +// ClearSchedulerCleanUpFactory is only used in test. +func ClearSchedulerCleanUpFactory() { + cleanUpFactoryMap.Lock() + defer cleanUpFactoryMap.Unlock() + cleanUpFactoryMap.m = make(map[proto.TaskType]cleanUpFactoryFn) } diff --git a/pkg/disttask/framework/dispatcher/main_test.go b/pkg/disttask/framework/scheduler/main_test.go similarity index 60% rename from pkg/disttask/framework/dispatcher/main_test.go rename to pkg/disttask/framework/scheduler/main_test.go index 160acfeca215d..20e1f438ad003 100644 --- a/pkg/disttask/framework/dispatcher/main_test.go +++ b/pkg/disttask/framework/scheduler/main_test.go @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -package dispatcher +package scheduler import ( "testing" @@ -21,38 +21,40 @@ import ( "go.uber.org/goleak" ) -// DispatcherForTest exports for testing. -type DispatcherManagerForTest interface { - GetRunningTaskCnt() int - DelRunningTask(globalTaskID int64) - DoCleanUpRoutine() +// GetRunningTaskCnt implements Scheduler.GetRunningTaskCnt interface. +func (sm *Manager) GetRunningTaskCnt() int { + return sm.getSchedulerCount() } -// GetRunningGTaskCnt implements Dispatcher.GetRunningGTaskCnt interface. -func (dm *Manager) GetRunningTaskCnt() int { - return dm.getRunningTaskCnt() +// DelRunningTask implements Scheduler.DelRunningTask interface. +func (sm *Manager) DelRunningTask(id int64) { + sm.delScheduler(id) } -// DelRunningGTask implements Dispatcher.DelRunningGTask interface. -func (dm *Manager) DelRunningTask(globalTaskID int64) { - dm.delRunningTask(globalTaskID) +// DoCleanUpRoutine implements Scheduler.DoCleanUpRoutine interface. +func (sm *Manager) DoCleanUpRoutine() { + sm.doCleanupTask() } -// DoCleanUpRoutine implements Dispatcher.DoCleanUpRoutine interface. -func (dm *Manager) DoCleanUpRoutine() { - dm.doCleanUpRoutine() +func (s *BaseScheduler) Switch2NextStep() (err error) { + return s.switch2NextStep() +} + +func NewNodeManager() *NodeManager { + return newNodeManager() } func TestMain(m *testing.M) { testsetup.SetupForCommonTest() // Make test more fast. - checkTaskRunningInterval = checkTaskRunningInterval / 10 - checkTaskFinishedInterval = checkTaskFinishedInterval / 10 - RetrySQLInterval = RetrySQLInterval / 20 + checkTaskRunningInterval /= 10 + checkTaskFinishedInterval /= 10 + RetrySQLInterval /= 20 opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), diff --git a/pkg/disttask/framework/scheduler/manager.go b/pkg/disttask/framework/scheduler/manager.go deleted file mode 100644 index 32723622b1f16..0000000000000 --- a/pkg/disttask/framework/scheduler/manager.go +++ /dev/null @@ -1,441 +0,0 @@ -// Copyright 2023 PingCAP, 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. - -package scheduler - -import ( - "context" - "sync" - "sync/atomic" - "time" - - "github.com/pingcap/errors" - "github.com/pingcap/failpoint" - "github.com/pingcap/tidb/br/pkg/lightning/common" - "github.com/pingcap/tidb/pkg/config" - "github.com/pingcap/tidb/pkg/disttask/framework/proto" - "github.com/pingcap/tidb/pkg/domain/infosync" - "github.com/pingcap/tidb/pkg/metrics" - "github.com/pingcap/tidb/pkg/resourcemanager/pool/spool" - "github.com/pingcap/tidb/pkg/resourcemanager/util" - tidbutil "github.com/pingcap/tidb/pkg/util" - "github.com/pingcap/tidb/pkg/util/logutil" - "go.uber.org/zap" -) - -var ( - schedulerPoolSize int32 = 4 - // same as dispatcher - checkTime = 300 * time.Millisecond - recoverMetaInterval = 90 * time.Second - retrySQLTimes = 30 - retrySQLInterval = 500 * time.Millisecond -) - -// ManagerBuilder is used to build a Manager. -type ManagerBuilder struct { - newPool func(name string, size int32, component util.Component, options ...spool.Option) (Pool, error) -} - -// NewManagerBuilder creates a new ManagerBuilder. -func NewManagerBuilder() *ManagerBuilder { - return &ManagerBuilder{ - newPool: func(name string, size int32, component util.Component, options ...spool.Option) (Pool, error) { - return spool.NewPool(name, size, component, options...) - }, - } -} - -// setPoolFactory sets the poolFactory to mock the Pool in unit test. -func (b *ManagerBuilder) setPoolFactory(poolFactory func(name string, size int32, component util.Component, options ...spool.Option) (Pool, error)) { - b.newPool = poolFactory -} - -// Manager monitors the global task table and manages the schedulers. -type Manager struct { - taskTable TaskTable - schedulerPool Pool - mu struct { - sync.RWMutex - // taskID -> CancelCauseFunc. - // CancelCauseFunc is used to fast cancel the scheduler.Run. - handlingTasks map[int64]context.CancelCauseFunc - } - // id, it's the same as server id now, i.e. host:port. - id string - wg tidbutil.WaitGroupWrapper - ctx context.Context - cancel context.CancelFunc - logCtx context.Context - newPool func(name string, size int32, component util.Component, options ...spool.Option) (Pool, error) -} - -// BuildManager builds a Manager. -func (b *ManagerBuilder) BuildManager(ctx context.Context, id string, taskTable TaskTable) (*Manager, error) { - m := &Manager{ - id: id, - taskTable: taskTable, - logCtx: logutil.WithFields(context.Background()), - newPool: b.newPool, - } - m.ctx, m.cancel = context.WithCancel(ctx) - m.mu.handlingTasks = make(map[int64]context.CancelCauseFunc) - - schedulerPool, err := m.newPool("scheduler_pool", schedulerPoolSize, util.DistTask) - if err != nil { - return nil, err - } - m.schedulerPool = schedulerPool - - return m, nil -} - -func (m *Manager) initMeta() (err error) { - for i := 0; i < retrySQLTimes; i++ { - err = m.taskTable.StartManager(m.ctx, m.id, config.GetGlobalConfig().Instance.TiDBServiceScope) - if err == nil { - break - } - if i%10 == 0 { - logutil.Logger(m.logCtx).Warn("start manager failed", - zap.String("scope", config.GetGlobalConfig().Instance.TiDBServiceScope), - zap.Int("retry times", i), - zap.Error(err)) - } - time.Sleep(retrySQLInterval) - } - return err -} - -// Start starts the Manager. -func (m *Manager) Start() error { - logutil.Logger(m.logCtx).Debug("manager start") - if err := m.initMeta(); err != nil { - return err - } - - m.wg.Run(m.fetchAndHandleRunnableTasksLoop) - m.wg.Run(m.fetchAndFastCancelTasksLoop) - m.wg.Run(m.recoverMetaLoop) - return nil -} - -// Stop stops the Manager. -func (m *Manager) Stop() { - m.cancel() - m.schedulerPool.ReleaseAndWait() - m.wg.Wait() -} - -// fetchAndHandleRunnableTasks fetches the runnable tasks from the global task table and handles them. -func (m *Manager) fetchAndHandleRunnableTasksLoop() { - defer tidbutil.Recover(metrics.LabelDomain, "fetchAndHandleRunnableTasksLoop", m.fetchAndHandleRunnableTasksLoop, false) - ticker := time.NewTicker(checkTime) - for { - select { - case <-m.ctx.Done(): - logutil.Logger(m.logCtx).Info("fetchAndHandleRunnableTasksLoop done") - return - case <-ticker.C: - tasks, err := m.taskTable.GetGlobalTasksInStates(m.ctx, proto.TaskStateRunning, proto.TaskStateReverting) - if err != nil { - m.logErr(err) - continue - } - m.onRunnableTasks(tasks) - } - } -} - -// fetchAndFastCancelTasks fetches the reverting/pausing tasks from the global task table and fast cancels them. -func (m *Manager) fetchAndFastCancelTasksLoop() { - defer tidbutil.Recover(metrics.LabelDomain, "fetchAndFastCancelTasksLoop", m.fetchAndFastCancelTasksLoop, false) - - ticker := time.NewTicker(checkTime) - for { - select { - case <-m.ctx.Done(): - m.cancelAllRunningTasks() - logutil.Logger(m.logCtx).Info("fetchAndFastCancelTasksLoop done") - return - case <-ticker.C: - tasks, err := m.taskTable.GetGlobalTasksInStates(m.ctx, proto.TaskStateReverting) - if err != nil { - m.logErr(err) - continue - } - m.onCanceledTasks(m.ctx, tasks) - - // cancel pending/running subtasks, and mark them as paused. - pausingTasks, err := m.taskTable.GetGlobalTasksInStates(m.ctx, proto.TaskStatePausing) - if err != nil { - m.logErr(err) - continue - } - if err := m.onPausingTasks(pausingTasks); err != nil { - m.logErr(err) - continue - } - } - } -} - -// onRunnableTasks handles runnable tasks. -func (m *Manager) onRunnableTasks(tasks []*proto.Task) { - if len(tasks) == 0 { - return - } - tasks = m.filterAlreadyHandlingTasks(tasks) - for _, task := range tasks { - exist, err := m.taskTable.HasSubtasksInStates(m.ctx, m.id, task.ID, task.Step, - proto.TaskStatePending, proto.TaskStateRevertPending, - // for the case that the tidb is restarted when the subtask is running. - proto.TaskStateRunning, proto.TaskStateReverting) - if err != nil { - logutil.Logger(m.logCtx).Error("check subtask exist failed", zap.Error(err)) - m.logErr(err) - continue - } - if !exist { - continue - } - logutil.Logger(m.logCtx).Info("detect new subtask", zap.Int64("task-id", task.ID)) - m.addHandlingTask(task.ID) - t := task - err = m.schedulerPool.Run(func() { - m.onRunnableTask(t) - m.removeHandlingTask(t.ID) - }) - // pool closed. - if err != nil { - m.removeHandlingTask(task.ID) - m.logErr(err) - return - } - } -} - -// onCanceledTasks cancels the running subtasks. -func (m *Manager) onCanceledTasks(_ context.Context, tasks []*proto.Task) { - if len(tasks) == 0 { - return - } - m.mu.RLock() - defer m.mu.RUnlock() - for _, task := range tasks { - if cancel, ok := m.mu.handlingTasks[task.ID]; ok && cancel != nil { - logutil.Logger(m.logCtx).Info("onCanceledTasks", zap.Int64("task-id", task.ID)) - // subtask needs to change its state to canceled. - cancel(ErrCancelSubtask) - } - } -} - -// onPausingTasks pauses/cancels the pending/running subtasks. -func (m *Manager) onPausingTasks(tasks []*proto.Task) error { - if len(tasks) == 0 { - return nil - } - m.mu.RLock() - defer m.mu.RUnlock() - for _, task := range tasks { - logutil.Logger(m.logCtx).Info("onPausingTasks", zap.Any("task_id", task.ID)) - if cancel, ok := m.mu.handlingTasks[task.ID]; ok && cancel != nil { - // Pause all running subtasks, don't mark subtasks as canceled. - // Should not change the subtask's state. - cancel(nil) - } - if err := m.taskTable.PauseSubtasks(m.ctx, m.id, task.ID); err != nil { - return err - } - } - return nil -} - -// recoverMetaLoop inits and recovers dist_framework_meta for the tidb node running the scheduler manager. -// This is necessary when the TiDB node experiences a prolonged network partition -// and the dispatcher deletes `dist_framework_meta`. -// When the TiDB node recovers from the network partition, -// we need to re-insert the metadata. -func (m *Manager) recoverMetaLoop() { - defer tidbutil.Recover(metrics.LabelDomain, "recoverMetaLoop", m.recoverMetaLoop, false) - ticker := time.NewTicker(recoverMetaInterval) - for { - select { - case <-m.ctx.Done(): - logutil.Logger(m.logCtx).Info("recoverMetaLoop done") - return - case <-ticker.C: - if err := m.initMeta(); err != nil { - m.logErr(err) - continue - } - } - } -} - -// cancelAllRunningTasks cancels all running tasks. -func (m *Manager) cancelAllRunningTasks() { - m.mu.RLock() - defer m.mu.RUnlock() - for id, cancel := range m.mu.handlingTasks { - logutil.Logger(m.logCtx).Info("cancelAllRunningTasks", zap.Int64("task-id", id)) - if cancel != nil { - // tidb shutdown, don't mark subtask as canceled. - // Should not change the subtask's state. - cancel(nil) - } - } -} - -// filterAlreadyHandlingTasks filters the tasks that are already handled. -func (m *Manager) filterAlreadyHandlingTasks(tasks []*proto.Task) []*proto.Task { - m.mu.RLock() - defer m.mu.RUnlock() - - var i int - for _, task := range tasks { - if _, ok := m.mu.handlingTasks[task.ID]; !ok { - tasks[i] = task - i++ - } - } - return tasks[:i] -} - -// TestContext only used in tests. -type TestContext struct { - TestSyncSubtaskRun chan struct{} - mockDown atomic.Bool -} - -var testContexts sync.Map - -// onRunnableTask handles a runnable task. -func (m *Manager) onRunnableTask(task *proto.Task) { - logutil.Logger(m.logCtx).Info("onRunnableTask", zap.Int64("task-id", task.ID), zap.Stringer("type", task.Type)) - // runCtx only used in scheduler.Run, cancel in m.fetchAndFastCancelTasks. - factory := getSchedulerFactory(task.Type) - if factory == nil { - err := errors.Errorf("task type %s not found", task.Type) - m.logErrAndPersist(err, task.ID) - return - } - scheduler := factory(m.ctx, m.id, task, m.taskTable) - taskCtx, taskCancel := context.WithCancelCause(m.ctx) - m.registerCancelFunc(task.ID, taskCancel) - defer taskCancel(nil) - // scheduler should init before run()/pause()/rollback(). - err := scheduler.Init(taskCtx) - if err != nil { - m.logErrAndPersist(err, task.ID) - return - } - defer scheduler.Close() - for { - select { - case <-m.ctx.Done(): - logutil.Logger(m.logCtx).Info("onRunnableTask exit for cancel", zap.Int64("task-id", task.ID), zap.Stringer("type", task.Type)) - return - case <-time.After(checkTime): - } - failpoint.Inject("mockStopManager", func() { - testContexts.Store(m.id, &TestContext{make(chan struct{}), atomic.Bool{}}) - go func() { - v, ok := testContexts.Load(m.id) - if ok { - <-v.(*TestContext).TestSyncSubtaskRun - _ = infosync.MockGlobalServerInfoManagerEntry.DeleteByID(m.id) - m.Stop() - } - }() - }) - task, err := m.taskTable.GetGlobalTaskByID(m.ctx, task.ID) - if err != nil { - m.logErr(err) - return - } - if task == nil { - return - } - if task.State != proto.TaskStateRunning && task.State != proto.TaskStateReverting { - logutil.Logger(m.logCtx).Info("onRunnableTask exit", - zap.Int64("task-id", task.ID), zap.Int64("step", int64(task.Step)), zap.Stringer("state", task.State)) - return - } - if exist, err := m.taskTable.HasSubtasksInStates( - m.ctx, - m.id, task.ID, task.Step, - proto.TaskStatePending, proto.TaskStateRevertPending, - // for the case that the tidb is restarted when the subtask is running. - proto.TaskStateRunning, proto.TaskStateReverting); err != nil { - m.logErr(err) - return - } else if !exist { - continue - } - switch task.State { - case proto.TaskStateRunning: - // use taskCtx for canceling. - err = scheduler.Run(taskCtx, task) - case proto.TaskStatePausing: - // use m.ctx since this process should not be canceled. - err = scheduler.Pause(m.ctx, task) - case proto.TaskStateReverting: - // use m.ctx since this process should not be canceled. - err = scheduler.Rollback(m.ctx, task) - } - if err != nil { - logutil.Logger(m.logCtx).Error("failed to handle task", zap.Error(err)) - } - } -} - -// addHandlingTask adds a task to the handling task set. -func (m *Manager) addHandlingTask(id int64) { - m.mu.Lock() - defer m.mu.Unlock() - m.mu.handlingTasks[id] = nil -} - -// registerCancelFunc registers a cancel function for a task. -func (m *Manager) registerCancelFunc(id int64, cancel context.CancelCauseFunc) { - m.mu.Lock() - defer m.mu.Unlock() - m.mu.handlingTasks[id] = cancel -} - -// removeHandlingTask removes a task from the handling task set. -func (m *Manager) removeHandlingTask(id int64) { - m.mu.Lock() - defer m.mu.Unlock() - delete(m.mu.handlingTasks, id) -} - -func (m *Manager) logErr(err error) { - logutil.Logger(m.logCtx).Error("task manager met error", zap.Error(err), zap.Stack("stack")) -} - -func (m *Manager) logErrAndPersist(err error, taskID int64) { - m.logErr(err) - // TODO: use interface if each business to retry - if common.IsRetryableError(err) || isRetryableError(err) { - return - } - err1 := m.taskTable.UpdateErrorToSubtask(m.ctx, m.id, taskID, err) - if err1 != nil { - logutil.Logger(m.logCtx).Error("update to subtask failed", zap.Error(err1), zap.Stack("stack")) - } - logutil.Logger(m.logCtx).Error("update error to subtask", zap.Int64("task-id", taskID), zap.Error(err1), zap.Stack("stack")) -} diff --git a/pkg/disttask/framework/scheduler/manager_test.go b/pkg/disttask/framework/scheduler/manager_test.go deleted file mode 100644 index ab2727b06da93..0000000000000 --- a/pkg/disttask/framework/scheduler/manager_test.go +++ /dev/null @@ -1,252 +0,0 @@ -// Copyright 2023 PingCAP, 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. - -package scheduler - -import ( - "context" - "errors" - "sync" - "testing" - "time" - - "github.com/pingcap/tidb/pkg/disttask/framework/mock" - "github.com/pingcap/tidb/pkg/disttask/framework/proto" - "github.com/pingcap/tidb/pkg/resourcemanager/pool/spool" - "github.com/pingcap/tidb/pkg/resourcemanager/util" - "github.com/stretchr/testify/require" - "go.uber.org/mock/gomock" -) - -var unfinishedSubtaskStates = []interface{}{ - proto.TaskStatePending, proto.TaskStateRevertPending, - proto.TaskStateRunning, proto.TaskStateReverting, -} - -func getPoolRunFn() (*sync.WaitGroup, func(f func()) error) { - wg := &sync.WaitGroup{} - return wg, func(f func()) error { - wg.Add(1) - go func() { - defer wg.Done() - f() - }() - return nil - } -} - -func TestManageTask(t *testing.T) { - b := NewManagerBuilder() - ctrl := gomock.NewController(t) - defer ctrl.Finish() - mockTaskTable := mock.NewMockTaskTable(ctrl) - m, err := b.BuildManager(context.Background(), "test", mockTaskTable) - require.NoError(t, err) - tasks := []*proto.Task{{ID: 1}, {ID: 2}} - newTasks := m.filterAlreadyHandlingTasks(tasks) - require.Equal(t, tasks, newTasks) - - m.addHandlingTask(1) - tasks = []*proto.Task{{ID: 1}, {ID: 2}} - newTasks = m.filterAlreadyHandlingTasks(tasks) - require.Equal(t, []*proto.Task{{ID: 2}}, newTasks) - - m.addHandlingTask(2) - tasks = []*proto.Task{{ID: 1}, {ID: 2}} - newTasks = m.filterAlreadyHandlingTasks(tasks) - require.Equal(t, []*proto.Task{}, newTasks) - - m.removeHandlingTask(1) - tasks = []*proto.Task{{ID: 1}, {ID: 2}} - newTasks = m.filterAlreadyHandlingTasks(tasks) - require.Equal(t, []*proto.Task{{ID: 1}}, newTasks) - - ctx1, cancel1 := context.WithCancelCause(context.Background()) - m.registerCancelFunc(2, cancel1) - m.cancelAllRunningTasks() - require.Equal(t, context.Canceled, ctx1.Err()) - - // test cancel. - m.addHandlingTask(1) - ctx2, cancel2 := context.WithCancelCause(context.Background()) - m.registerCancelFunc(1, cancel2) - ctx3, cancel3 := context.WithCancelCause(context.Background()) - m.registerCancelFunc(2, cancel3) - m.onCanceledTasks(context.Background(), []*proto.Task{{ID: 1}}) - require.Equal(t, context.Canceled, ctx2.Err()) - require.NoError(t, ctx3.Err()) - - // test pause. - m.addHandlingTask(3) - ctx4, cancel4 := context.WithCancelCause(context.Background()) - m.registerCancelFunc(1, cancel4) - mockTaskTable.EXPECT().PauseSubtasks(m.ctx, "test", int64(1)).Return(nil) - m.onPausingTasks([]*proto.Task{{ID: 1}}) - require.Equal(t, context.Canceled, ctx4.Err()) -} - -func TestOnRunnableTasks(t *testing.T) { - ctrl := gomock.NewController(t) - defer ctrl.Finish() - mockTaskTable := mock.NewMockTaskTable(ctrl) - mockInternalScheduler := mock.NewMockScheduler(ctrl) - mockPool := mock.NewMockPool(ctrl) - ctx := context.Background() - - b := NewManagerBuilder() - b.setPoolFactory(func(name string, size int32, component util.Component, options ...spool.Option) (Pool, error) { - return mockPool, nil - }) - id := "test" - taskID := int64(1) - task := &proto.Task{ID: taskID, State: proto.TaskStateRunning, Step: proto.StepOne, Type: "type"} - - m, err := b.BuildManager(ctx, id, mockTaskTable) - require.NoError(t, err) - - // no task - m.onRunnableTasks(nil) - - RegisterTaskType("type", - func(ctx context.Context, id string, task *proto.Task, taskTable TaskTable) Scheduler { - return mockInternalScheduler - }) - - // get subtask failed - mockInternalScheduler.EXPECT().Init(gomock.Any()).Return(nil) - mockTaskTable.EXPECT().HasSubtasksInStates(m.ctx, id, taskID, proto.StepOne, - unfinishedSubtaskStates...). - Return(false, errors.New("get subtask failed")) - mockInternalScheduler.EXPECT().Close() - m.onRunnableTasks([]*proto.Task{task}) - - // no subtask - mockTaskTable.EXPECT().HasSubtasksInStates(m.ctx, id, taskID, proto.StepOne, - unfinishedSubtaskStates...).Return(false, nil) - m.onRunnableTasks([]*proto.Task{task}) - - // pool error - mockTaskTable.EXPECT().HasSubtasksInStates(m.ctx, id, taskID, proto.StepOne, - unfinishedSubtaskStates...).Return(true, nil) - mockPool.EXPECT().Run(gomock.Any()).Return(errors.New("pool error")) - m.onRunnableTasks([]*proto.Task{task}) - - // StepOne succeed - wg, runFn := getPoolRunFn() - mockTaskTable.EXPECT().HasSubtasksInStates(m.ctx, id, taskID, proto.StepOne, - unfinishedSubtaskStates...).Return(true, nil) - mockPool.EXPECT().Run(gomock.Any()).DoAndReturn(runFn) - mockTaskTable.EXPECT().GetGlobalTaskByID(m.ctx, taskID).Return(task, nil) - mockTaskTable.EXPECT().HasSubtasksInStates(m.ctx, id, taskID, proto.StepOne, - unfinishedSubtaskStates...).Return(true, nil) - mockInternalScheduler.EXPECT().Run(gomock.Any(), task).Return(nil) - - // StepTwo failed - task1 := &proto.Task{ID: taskID, State: proto.TaskStateRunning, Step: proto.StepTwo} - mockTaskTable.EXPECT().GetGlobalTaskByID(m.ctx, taskID).Return(task1, nil) - mockTaskTable.EXPECT().HasSubtasksInStates(m.ctx, id, taskID, proto.StepTwo, - unfinishedSubtaskStates...).Return(true, nil) - mockInternalScheduler.EXPECT().Run(gomock.Any(), task1).Return(errors.New("run err")) - - task2 := &proto.Task{ID: taskID, State: proto.TaskStateReverting, Step: proto.StepTwo} - mockTaskTable.EXPECT().GetGlobalTaskByID(m.ctx, taskID).Return(task2, nil) - mockTaskTable.EXPECT().HasSubtasksInStates(m.ctx, id, taskID, proto.StepTwo, - unfinishedSubtaskStates...).Return(true, nil) - mockInternalScheduler.EXPECT().Rollback(gomock.Any(), task2).Return(nil) - - task3 := &proto.Task{ID: taskID, State: proto.TaskStateReverted, Step: proto.StepTwo} - mockTaskTable.EXPECT().GetGlobalTaskByID(m.ctx, taskID).Return(task3, nil) - - m.onRunnableTasks([]*proto.Task{task}) - - wg.Wait() -} - -func TestManager(t *testing.T) { - ctrl := gomock.NewController(t) - defer ctrl.Finish() - mockTaskTable := mock.NewMockTaskTable(ctrl) - mockInternalScheduler := mock.NewMockScheduler(ctrl) - mockPool := mock.NewMockPool(ctrl) - b := NewManagerBuilder() - b.setPoolFactory(func(name string, size int32, component util.Component, options ...spool.Option) (Pool, error) { - return mockPool, nil - }) - RegisterTaskType("type", - func(ctx context.Context, id string, task *proto.Task, taskTable TaskTable) Scheduler { - return mockInternalScheduler - }) - id := "test" - - m, err := b.BuildManager(context.Background(), id, mockTaskTable) - require.NoError(t, err) - - taskID1 := int64(1) - taskID2 := int64(2) - taskID3 := int64(3) - task1 := &proto.Task{ID: taskID1, State: proto.TaskStateRunning, Step: proto.StepOne, Type: "type"} - task2 := &proto.Task{ID: taskID2, State: proto.TaskStateReverting, Step: proto.StepOne, Type: "type"} - task3 := &proto.Task{ID: taskID3, State: proto.TaskStatePausing, Step: proto.StepOne, Type: "type"} - - mockTaskTable.EXPECT().StartManager(m.ctx, "test", "").Return(nil).Times(1) - mockTaskTable.EXPECT().GetGlobalTasksInStates(m.ctx, proto.TaskStateRunning, proto.TaskStateReverting). - Return([]*proto.Task{task1, task2}, nil).AnyTimes() - mockTaskTable.EXPECT().GetGlobalTasksInStates(m.ctx, proto.TaskStateReverting). - Return([]*proto.Task{task2}, nil).AnyTimes() - mockTaskTable.EXPECT().GetGlobalTasksInStates(m.ctx, proto.TaskStatePausing). - Return([]*proto.Task{task3}, nil).AnyTimes() - mockInternalScheduler.EXPECT().Init(gomock.Any()).Return(nil) - // task1 - mockTaskTable.EXPECT().HasSubtasksInStates(m.ctx, id, taskID1, proto.StepOne, - unfinishedSubtaskStates...). - Return(true, nil) - wg, runFn := getPoolRunFn() - mockPool.EXPECT().Run(gomock.Any()).DoAndReturn(runFn) - mockTaskTable.EXPECT().GetGlobalTaskByID(m.ctx, taskID1).Return(task1, nil).AnyTimes() - mockTaskTable.EXPECT().HasSubtasksInStates(m.ctx, id, taskID1, proto.StepOne, - unfinishedSubtaskStates...). - Return(true, nil) - mockInternalScheduler.EXPECT().Run(gomock.Any(), task1).Return(nil) - - mockTaskTable.EXPECT().HasSubtasksInStates(m.ctx, id, taskID1, proto.StepOne, - unfinishedSubtaskStates...). - Return(false, nil).AnyTimes() - mockInternalScheduler.EXPECT().Close() - // task2 - mockTaskTable.EXPECT().HasSubtasksInStates(m.ctx, id, taskID2, proto.StepOne, - unfinishedSubtaskStates...). - Return(true, nil) - mockPool.EXPECT().Run(gomock.Any()).DoAndReturn(runFn) - mockTaskTable.EXPECT().GetGlobalTaskByID(m.ctx, taskID2).Return(task2, nil).AnyTimes() - mockTaskTable.EXPECT().HasSubtasksInStates(m.ctx, id, taskID2, proto.StepOne, - unfinishedSubtaskStates...). - Return(true, nil) - mockInternalScheduler.EXPECT().Init(gomock.Any()).Return(nil) - mockInternalScheduler.EXPECT().Rollback(gomock.Any(), task2).Return(nil) - mockTaskTable.EXPECT().HasSubtasksInStates(m.ctx, id, taskID2, proto.StepOne, - unfinishedSubtaskStates...). - Return(false, nil).AnyTimes() - mockInternalScheduler.EXPECT().Close() - // task3 - mockTaskTable.EXPECT().PauseSubtasks(m.ctx, id, taskID3).Return(nil).AnyTimes() - - // for scheduler pool - mockPool.EXPECT().ReleaseAndWait().Do(func() { - wg.Wait() - }) - - require.NoError(t, m.Start()) - time.Sleep(5 * time.Second) - m.Stop() -} diff --git a/pkg/disttask/framework/scheduler/mock/BUILD.bazel b/pkg/disttask/framework/scheduler/mock/BUILD.bazel new file mode 100644 index 0000000000000..76642e205e655 --- /dev/null +++ b/pkg/disttask/framework/scheduler/mock/BUILD.bazel @@ -0,0 +1,13 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library") + +go_library( + name = "mock", + srcs = ["scheduler_mock.go"], + importpath = "github.com/pingcap/tidb/pkg/disttask/framework/scheduler/mock", + visibility = ["//visibility:public"], + deps = [ + "//pkg/disttask/framework/proto", + "//pkg/disttask/framework/storage", + "@org_uber_go_mock//gomock", + ], +) diff --git a/pkg/disttask/framework/scheduler/mock/scheduler_mock.go b/pkg/disttask/framework/scheduler/mock/scheduler_mock.go new file mode 100644 index 0000000000000..a6b241273a43e --- /dev/null +++ b/pkg/disttask/framework/scheduler/mock/scheduler_mock.go @@ -0,0 +1,125 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: github.com/pingcap/tidb/pkg/disttask/framework/scheduler (interfaces: Extension) +// +// Generated by this command: +// +// mockgen -package mock github.com/pingcap/tidb/pkg/disttask/framework/scheduler Extension +// +// Package mock is a generated GoMock package. +package mock + +import ( + context "context" + reflect "reflect" + + proto "github.com/pingcap/tidb/pkg/disttask/framework/proto" + storage "github.com/pingcap/tidb/pkg/disttask/framework/storage" + gomock "go.uber.org/mock/gomock" +) + +// MockExtension is a mock of Extension interface. +type MockExtension struct { + ctrl *gomock.Controller + recorder *MockExtensionMockRecorder +} + +// MockExtensionMockRecorder is the mock recorder for MockExtension. +type MockExtensionMockRecorder struct { + mock *MockExtension +} + +// NewMockExtension creates a new mock instance. +func NewMockExtension(ctrl *gomock.Controller) *MockExtension { + mock := &MockExtension{ctrl: ctrl} + mock.recorder = &MockExtensionMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockExtension) EXPECT() *MockExtensionMockRecorder { + return m.recorder +} + +// GetEligibleInstances mocks base method. +func (m *MockExtension) GetEligibleInstances(arg0 context.Context, arg1 *proto.Task) ([]string, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetEligibleInstances", arg0, arg1) + ret0, _ := ret[0].([]string) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetEligibleInstances indicates an expected call of GetEligibleInstances. +func (mr *MockExtensionMockRecorder) GetEligibleInstances(arg0, arg1 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetEligibleInstances", reflect.TypeOf((*MockExtension)(nil).GetEligibleInstances), arg0, arg1) +} + +// GetNextStep mocks base method. +func (m *MockExtension) GetNextStep(arg0 *proto.Task) proto.Step { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetNextStep", arg0) + ret0, _ := ret[0].(proto.Step) + return ret0 +} + +// GetNextStep indicates an expected call of GetNextStep. +func (mr *MockExtensionMockRecorder) GetNextStep(arg0 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetNextStep", reflect.TypeOf((*MockExtension)(nil).GetNextStep), arg0) +} + +// IsRetryableErr mocks base method. +func (m *MockExtension) IsRetryableErr(arg0 error) bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "IsRetryableErr", arg0) + ret0, _ := ret[0].(bool) + return ret0 +} + +// IsRetryableErr indicates an expected call of IsRetryableErr. +func (mr *MockExtensionMockRecorder) IsRetryableErr(arg0 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IsRetryableErr", reflect.TypeOf((*MockExtension)(nil).IsRetryableErr), arg0) +} + +// OnDone mocks base method. +func (m *MockExtension) OnDone(arg0 context.Context, arg1 storage.TaskHandle, arg2 *proto.Task) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "OnDone", arg0, arg1, arg2) + ret0, _ := ret[0].(error) + return ret0 +} + +// OnDone indicates an expected call of OnDone. +func (mr *MockExtensionMockRecorder) OnDone(arg0, arg1, arg2 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "OnDone", reflect.TypeOf((*MockExtension)(nil).OnDone), arg0, arg1, arg2) +} + +// OnNextSubtasksBatch mocks base method. +func (m *MockExtension) OnNextSubtasksBatch(arg0 context.Context, arg1 storage.TaskHandle, arg2 *proto.Task, arg3 []string, arg4 proto.Step) ([][]byte, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "OnNextSubtasksBatch", arg0, arg1, arg2, arg3, arg4) + ret0, _ := ret[0].([][]byte) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// OnNextSubtasksBatch indicates an expected call of OnNextSubtasksBatch. +func (mr *MockExtensionMockRecorder) OnNextSubtasksBatch(arg0, arg1, arg2, arg3, arg4 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "OnNextSubtasksBatch", reflect.TypeOf((*MockExtension)(nil).OnNextSubtasksBatch), arg0, arg1, arg2, arg3, arg4) +} + +// OnTick mocks base method. +func (m *MockExtension) OnTick(arg0 context.Context, arg1 *proto.Task) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "OnTick", arg0, arg1) +} + +// OnTick indicates an expected call of OnTick. +func (mr *MockExtensionMockRecorder) OnTick(arg0, arg1 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "OnTick", reflect.TypeOf((*MockExtension)(nil).OnTick), arg0, arg1) +} diff --git a/pkg/disttask/framework/scheduler/nodes.go b/pkg/disttask/framework/scheduler/nodes.go new file mode 100644 index 0000000000000..7f9c2a8eb77af --- /dev/null +++ b/pkg/disttask/framework/scheduler/nodes.go @@ -0,0 +1,160 @@ +// Copyright 2023 PingCAP, 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. + +package scheduler + +import ( + "context" + "sync/atomic" + "time" + + "github.com/pingcap/failpoint" + "github.com/pingcap/tidb/br/pkg/lightning/log" + disttaskutil "github.com/pingcap/tidb/pkg/util/disttask" + "github.com/pingcap/tidb/pkg/util/logutil" + "go.uber.org/zap" +) + +var ( + // liveNodesCheckInterval is the tick interval of fetching all server infos from etcs. + nodesCheckInterval = 2 * checkTaskFinishedInterval +) + +// NodeManager maintains live TiDB nodes in the cluster, and maintains the nodes +// managed by the framework. +type NodeManager struct { + // prevLiveNodes is used to record the live nodes in last checking. + prevLiveNodes map[string]struct{} + // managedNodes is the cached nodes managed by the framework. + // see TaskManager.GetManagedNodes for more details. + managedNodes atomic.Pointer[[]string] +} + +func newNodeManager() *NodeManager { + nm := &NodeManager{ + prevLiveNodes: make(map[string]struct{}), + } + managedNodes := make([]string, 0, 10) + nm.managedNodes.Store(&managedNodes) + return nm +} + +func (nm *NodeManager) maintainLiveNodesLoop(ctx context.Context, taskMgr TaskManager) { + ticker := time.NewTicker(nodesCheckInterval) + defer ticker.Stop() + for { + select { + case <-ctx.Done(): + return + case <-ticker.C: + nm.maintainLiveNodes(ctx, taskMgr) + } + } +} + +// maintainLiveNodes manages live node info in dist_framework_meta table +// see recoverMetaLoop in task executor for when node is inserted into dist_framework_meta. +func (nm *NodeManager) maintainLiveNodes(ctx context.Context, taskMgr TaskManager) { + // Safe to discard errors since this function can be called at regular intervals. + serverInfos, err := GenerateTaskExecutorNodes(ctx) + if err != nil { + logutil.BgLogger().Warn("generate task executor nodes met error", log.ShortError(err)) + return + } + nodeChanged := len(serverInfos) != len(nm.prevLiveNodes) + currLiveNodes := make(map[string]struct{}, len(serverInfos)) + for _, info := range serverInfos { + execID := disttaskutil.GenerateExecID(info) + if _, ok := nm.prevLiveNodes[execID]; !ok { + nodeChanged = true + } + currLiveNodes[execID] = struct{}{} + } + if !nodeChanged { + return + } + + oldNodes, err := taskMgr.GetAllNodes(ctx) + if err != nil { + logutil.BgLogger().Warn("get all nodes met error", log.ShortError(err)) + return + } + + deadNodes := make([]string, 0) + for _, node := range oldNodes { + if _, ok := currLiveNodes[node.ID]; !ok { + deadNodes = append(deadNodes, node.ID) + } + } + if len(deadNodes) == 0 { + nm.prevLiveNodes = currLiveNodes + return + } + logutil.BgLogger().Info("delete dead nodes from dist_framework_meta", + zap.Int("dead-nodes", len(deadNodes))) + err = taskMgr.DeleteDeadNodes(ctx, deadNodes) + if err != nil { + logutil.BgLogger().Warn("delete dead nodes from dist_framework_meta failed", log.ShortError(err)) + return + } + nm.prevLiveNodes = currLiveNodes +} + +func (nm *NodeManager) refreshManagedNodesLoop(ctx context.Context, taskMgr TaskManager, slotMgr *SlotManager) { + ticker := time.NewTicker(nodesCheckInterval) + defer ticker.Stop() + for { + select { + case <-ctx.Done(): + return + case <-ticker.C: + nm.refreshManagedNodes(ctx, taskMgr, slotMgr) + } + } +} + +// TestRefreshedChan is used to sync the test. +var TestRefreshedChan = make(chan struct{}) + +// refreshManagedNodes maintains the nodes managed by the framework. +func (nm *NodeManager) refreshManagedNodes(ctx context.Context, taskMgr TaskManager, slotMgr *SlotManager) { + newNodes, err := taskMgr.GetManagedNodes(ctx) + if err != nil { + logutil.BgLogger().Warn("get managed nodes met error", log.ShortError(err)) + return + } + nodeIDs := make([]string, 0, len(newNodes)) + var cpuCount int + for _, node := range newNodes { + nodeIDs = append(nodeIDs, node.ID) + if node.CPUCount > 0 { + cpuCount = node.CPUCount + } + } + slotMgr.updateCapacity(cpuCount) + nm.managedNodes.Store(&nodeIDs) + + failpoint.Inject("syncRefresh", func() { + TestRefreshedChan <- struct{}{} + }) +} + +// GetManagedNodes returns the nodes managed by the framework. +// return a copy of the managed nodes. +func (nm *NodeManager) getManagedNodes() []string { + nodes := *nm.managedNodes.Load() + res := make([]string, len(nodes)) + copy(res, nodes) + return res +} diff --git a/pkg/disttask/framework/scheduler/nodes_test.go b/pkg/disttask/framework/scheduler/nodes_test.go new file mode 100644 index 0000000000000..04f4a52db0b1a --- /dev/null +++ b/pkg/disttask/framework/scheduler/nodes_test.go @@ -0,0 +1,128 @@ +// Copyright 2023 PingCAP, 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. + +package scheduler + +import ( + "context" + "testing" + + "github.com/pingcap/errors" + "github.com/pingcap/failpoint" + "github.com/pingcap/tidb/pkg/disttask/framework/mock" + "github.com/pingcap/tidb/pkg/disttask/framework/proto" + "github.com/pingcap/tidb/pkg/domain/infosync" + "github.com/pingcap/tidb/pkg/util/cpu" + "github.com/stretchr/testify/require" + "go.uber.org/mock/gomock" +) + +func TestMaintainLiveNodes(t *testing.T) { + ctrl := gomock.NewController(t) + defer ctrl.Finish() + mockTaskMgr := mock.NewMockTaskManager(ctrl) + + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/disttask/framework/scheduler/mockTaskExecutorNodes", "return()")) + t.Cleanup(func() { + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/disttask/framework/scheduler/mockTaskExecutorNodes")) + }) + + MockServerInfo = []*infosync.ServerInfo{ + {Port: 4000}, + } + + nodeMgr := newNodeManager() + ctx := context.Background() + mockTaskMgr.EXPECT().GetAllNodes(gomock.Any()).Return(nil, errors.New("mock error")) + nodeMgr.maintainLiveNodes(ctx, mockTaskMgr) + require.Empty(t, nodeMgr.prevLiveNodes) + require.True(t, ctrl.Satisfied()) + // no change + mockTaskMgr.EXPECT().GetAllNodes(gomock.Any()).Return([]proto.ManagedNode{{ID: ":4000"}}, nil) + nodeMgr.maintainLiveNodes(ctx, mockTaskMgr) + require.Equal(t, map[string]struct{}{":4000": {}}, nodeMgr.prevLiveNodes) + require.True(t, ctrl.Satisfied()) + // run again, return fast + nodeMgr.maintainLiveNodes(ctx, mockTaskMgr) + require.Equal(t, map[string]struct{}{":4000": {}}, nodeMgr.prevLiveNodes) + require.True(t, ctrl.Satisfied()) + + // scale out 1 node + MockServerInfo = []*infosync.ServerInfo{ + {Port: 4000}, + {Port: 4001}, + } + + // fail on clean + mockTaskMgr.EXPECT().GetAllNodes(gomock.Any()).Return([]proto.ManagedNode{{ID: ":4000"}, {ID: ":4001"}, {ID: ":4002"}}, nil) + mockTaskMgr.EXPECT().DeleteDeadNodes(gomock.Any(), gomock.Any()).Return(errors.New("mock error")) + nodeMgr.maintainLiveNodes(ctx, mockTaskMgr) + require.Equal(t, map[string]struct{}{":4000": {}}, nodeMgr.prevLiveNodes) + require.True(t, ctrl.Satisfied()) + // remove 1 node + mockTaskMgr.EXPECT().GetAllNodes(gomock.Any()).Return([]proto.ManagedNode{{ID: ":4000"}, {ID: ":4001"}, {ID: ":4002"}}, nil) + mockTaskMgr.EXPECT().DeleteDeadNodes(gomock.Any(), gomock.Any()).Return(nil) + nodeMgr.maintainLiveNodes(ctx, mockTaskMgr) + require.Equal(t, map[string]struct{}{":4000": {}, ":4001": {}}, nodeMgr.prevLiveNodes) + require.True(t, ctrl.Satisfied()) + // run again, return fast + nodeMgr.maintainLiveNodes(ctx, mockTaskMgr) + require.Equal(t, map[string]struct{}{":4000": {}, ":4001": {}}, nodeMgr.prevLiveNodes) + require.True(t, ctrl.Satisfied()) + + // scale in 1 node + MockServerInfo = []*infosync.ServerInfo{ + {Port: 4000}, + } + + mockTaskMgr.EXPECT().GetAllNodes(gomock.Any()).Return([]proto.ManagedNode{{ID: ":4000"}, {ID: ":4001"}, {ID: ":4002"}}, nil) + mockTaskMgr.EXPECT().DeleteDeadNodes(gomock.Any(), gomock.Any()).Return(nil) + nodeMgr.maintainLiveNodes(ctx, mockTaskMgr) + require.Equal(t, map[string]struct{}{":4000": {}}, nodeMgr.prevLiveNodes) + require.True(t, ctrl.Satisfied()) + // run again, return fast + nodeMgr.maintainLiveNodes(ctx, mockTaskMgr) + require.Equal(t, map[string]struct{}{":4000": {}}, nodeMgr.prevLiveNodes) + require.True(t, ctrl.Satisfied()) +} + +func TestMaintainManagedNodes(t *testing.T) { + ctrl := gomock.NewController(t) + defer ctrl.Finish() + ctx := context.Background() + mockTaskMgr := mock.NewMockTaskManager(ctrl) + nodeMgr := newNodeManager() + + slotMgr := newSlotManager() + mockTaskMgr.EXPECT().GetManagedNodes(gomock.Any()).Return(nil, errors.New("mock error")) + nodeMgr.refreshManagedNodes(ctx, mockTaskMgr, slotMgr) + require.Equal(t, cpu.GetCPUCount(), int(slotMgr.capacity.Load())) + require.Empty(t, nodeMgr.getManagedNodes()) + require.True(t, ctrl.Satisfied()) + + mockTaskMgr.EXPECT().GetManagedNodes(gomock.Any()).Return([]proto.ManagedNode{ + {ID: ":4000", CPUCount: 100}, + {ID: ":4001", CPUCount: 100}, + }, nil) + nodeMgr.refreshManagedNodes(ctx, mockTaskMgr, slotMgr) + require.Equal(t, []string{":4000", ":4001"}, nodeMgr.getManagedNodes()) + require.Equal(t, 100, int(slotMgr.capacity.Load())) + require.True(t, ctrl.Satisfied()) + mockTaskMgr.EXPECT().GetManagedNodes(gomock.Any()).Return(nil, nil) + nodeMgr.refreshManagedNodes(ctx, mockTaskMgr, slotMgr) + require.NotNil(t, nodeMgr.getManagedNodes()) + require.Empty(t, nodeMgr.getManagedNodes()) + require.Equal(t, 100, int(slotMgr.capacity.Load())) + require.True(t, ctrl.Satisfied()) +} diff --git a/pkg/disttask/framework/scheduler/scheduler.go b/pkg/disttask/framework/scheduler/scheduler.go index 6ad8835abeb4e..17d45e07b4d90 100644 --- a/pkg/disttask/framework/scheduler/scheduler.go +++ b/pkg/disttask/framework/scheduler/scheduler.go @@ -16,635 +16,624 @@ package scheduler import ( "context" - "sync" + "math/rand" + "strings" + "sync/atomic" "time" "github.com/pingcap/errors" "github.com/pingcap/failpoint" - "github.com/pingcap/tidb/br/pkg/lightning/common" - "github.com/pingcap/tidb/br/pkg/lightning/log" - "github.com/pingcap/tidb/pkg/disttask/framework/dispatcher" + "github.com/pingcap/log" "github.com/pingcap/tidb/pkg/disttask/framework/handle" "github.com/pingcap/tidb/pkg/disttask/framework/proto" - "github.com/pingcap/tidb/pkg/disttask/framework/scheduler/execute" "github.com/pingcap/tidb/pkg/disttask/framework/storage" "github.com/pingcap/tidb/pkg/domain/infosync" + "github.com/pingcap/tidb/pkg/kv" "github.com/pingcap/tidb/pkg/metrics" - "github.com/pingcap/tidb/pkg/parser/terror" + "github.com/pingcap/tidb/pkg/sessionctx" "github.com/pingcap/tidb/pkg/util/backoff" - "github.com/pingcap/tidb/pkg/util/dbterror" - "github.com/pingcap/tidb/pkg/util/gctuner" + disttaskutil "github.com/pingcap/tidb/pkg/util/disttask" + "github.com/pingcap/tidb/pkg/util/intest" "github.com/pingcap/tidb/pkg/util/logutil" - "github.com/pingcap/tidb/pkg/util/memory" "go.uber.org/zap" ) const ( - // DefaultCheckSubtaskCanceledInterval is the default check interval for cancel cancelled subtasks. - DefaultCheckSubtaskCanceledInterval = 2 * time.Second + // DefaultSubtaskConcurrency is the default concurrency for handling subtask. + DefaultSubtaskConcurrency = 16 + // MaxSubtaskConcurrency is the maximum concurrency for handling subtask. + MaxSubtaskConcurrency = 256 + // defaultBalanceSubtaskTicks is the tick interval of fetching all server infos from etcs. + defaultBalanceSubtaskTicks = 2 + // for a cancelled task, it's terminal state is reverted or reverted_failed, + // so we use a special error message to indicate that the task is cancelled + // by user. + taskCancelMsg = "cancelled by user" ) var ( - // ErrCancelSubtask is the cancel cause when cancelling subtasks. - ErrCancelSubtask = errors.New("cancel subtasks") - // ErrFinishSubtask is the cancel cause when scheduler successfully processed subtasks. - ErrFinishSubtask = errors.New("finish subtasks") - // ErrFinishRollback is the cancel cause when scheduler rollback successfully. - ErrFinishRollback = errors.New("finish rollback") - - // TestSyncChan is used to sync the test. - TestSyncChan = make(chan struct{}) + checkTaskFinishedInterval = 500 * time.Millisecond + nonRetrySQLTime = 1 + // RetrySQLTimes is the max retry times when executing SQL. + RetrySQLTimes = 30 + // RetrySQLInterval is the initial interval between two SQL retries. + RetrySQLInterval = 3 * time.Second + // RetrySQLMaxInterval is the max interval between two SQL retries. + RetrySQLMaxInterval = 30 * time.Second ) -// BaseScheduler is the base implementation of Scheduler. +// Scheduler manages the lifetime of a task +// including submitting subtasks and updating the status of a task. +type Scheduler interface { + // Init initializes the scheduler, should be called before ExecuteTask. + // if Init returns error, scheduler manager will fail the task directly, + // so the returned error should be a fatal error. + Init() error + // ScheduleTask schedules the task execution step by step. + ScheduleTask() + // Close closes the scheduler, should be called if Init returns nil. + Close() + // GetTask returns the task that the scheduler is managing. + GetTask() *proto.Task + Extension +} + +// BaseScheduler is the base struct for Scheduler. +// each task type embed this struct and implement the Extension interface. type BaseScheduler struct { - // id, it's the same as server id now, i.e. host:port. - id string - taskID int64 - taskTable TaskTable - logCtx context.Context - // ctx from manager ctx context.Context + Param + // task might be accessed by multiple goroutines, so don't change its fields + // directly, make a copy, update and store it back to the atomic pointer. + task atomic.Pointer[proto.Task] + logger *zap.Logger + // when RegisterSchedulerFactory, the factory MUST initialize this fields. Extension - mu struct { - sync.RWMutex - err error - // handled indicates whether the error has been updated to one of the subtask. - handled bool - // runtimeCancel is used to cancel the Run/Rollback when error occurs. - runtimeCancel context.CancelCauseFunc - } + balanceSubtaskTick int + // rand is for generating random selection of nodes. + rand *rand.Rand } -// NewBaseScheduler creates a new BaseScheduler. -func NewBaseScheduler(ctx context.Context, id string, taskID int64, taskTable TaskTable) *BaseScheduler { - schedulerImpl := &BaseScheduler{ - id: id, - taskID: taskID, - taskTable: taskTable, - ctx: ctx, - logCtx: logutil.WithFields(context.Background(), zap.Int64("task-id", taskID)), - } - return schedulerImpl -} +// MockOwnerChange mock owner change in tests. +var MockOwnerChange func() -func (s *BaseScheduler) startCancelCheck(ctx context.Context, wg *sync.WaitGroup, cancelFn context.CancelCauseFunc) { - wg.Add(1) - go func() { - defer wg.Done() - ticker := time.NewTicker(DefaultCheckSubtaskCanceledInterval) - defer ticker.Stop() - for { - select { - case <-ctx.Done(): - logutil.Logger(s.logCtx).Info("scheduler exits", zap.Error(ctx.Err())) - return - case <-ticker.C: - canceled, err := s.taskTable.IsSchedulerCanceled(ctx, s.id, s.taskID) - if err != nil { - continue - } - if canceled { - logutil.Logger(s.logCtx).Info("scheduler canceled") - if cancelFn != nil { - // subtask transferred to other tidb, don't mark subtask as canceled. - // Should not change the subtask's state. - cancelFn(nil) - } - } - } - } - }() +// NewBaseScheduler creates a new BaseScheduler. +func NewBaseScheduler(ctx context.Context, task *proto.Task, param Param) *BaseScheduler { + s := &BaseScheduler{ + ctx: ctx, + Param: param, + logger: log.L().With(zap.Int64("task-id", task.ID), + zap.Stringer("task-type", task.Type)), + rand: rand.New(rand.NewSource(time.Now().UnixNano())), + } + s.task.Store(task) + return s } // Init implements the Scheduler interface. -func (*BaseScheduler) Init(_ context.Context) error { +func (*BaseScheduler) Init() error { return nil } -// Run runs the scheduler task. -func (s *BaseScheduler) Run(ctx context.Context, task *proto.Task) (err error) { - defer func() { - if r := recover(); r != nil { - logutil.Logger(s.logCtx).Error("BaseScheduler panicked", zap.Any("recover", r), zap.Stack("stack")) - err4Panic := errors.Errorf("%v", r) - err1 := s.updateErrorToSubtask(ctx, task.ID, err4Panic) - if err == nil { - err = err1 - } - } - }() - err = s.run(ctx, task) - if s.mu.handled { - return err - } - if err == nil { - return nil - } - return s.updateErrorToSubtask(ctx, task.ID, err) +// ScheduleTask implements the Scheduler interface. +func (s *BaseScheduler) ScheduleTask() { + task := s.GetTask() + s.logger.Info("schedule task", + zap.Stringer("state", task.State), zap.Int("concurrency", task.Concurrency)) + s.scheduleTask() } -func (s *BaseScheduler) run(ctx context.Context, task *proto.Task) (resErr error) { - if ctx.Err() != nil { - s.onError(ctx.Err()) - return s.getError() - } - runCtx, runCancel := context.WithCancelCause(ctx) - defer runCancel(ErrFinishSubtask) - s.registerCancelFunc(runCancel) - s.resetError() - stepLogger := log.BeginTask(logutil.Logger(s.logCtx).With( - zap.Any("step", task.Step), - zap.Uint64("concurrency", task.Concurrency), - zap.Float64("mem-limit-percent", gctuner.GlobalMemoryLimitTuner.GetPercentage()), - zap.String("server-mem-limit", memory.ServerMemoryLimitOriginText.Load()), - ), "schedule step") - // log as info level, subtask might be cancelled, let caller check it. - defer func() { - stepLogger.End(zap.InfoLevel, resErr) - }() - - summary, cleanup, err := runSummaryCollectLoop(ctx, task, s.taskTable) - if err != nil { - s.onError(err) - return s.getError() - } - defer cleanup() - - executor, err := s.GetSubtaskExecutor(ctx, task, summary) - if err != nil { - s.onError(err) - return s.getError() - } - - failpoint.Inject("mockExecSubtaskInitEnvErr", func() { - failpoint.Return(errors.New("mockExecSubtaskInitEnvErr")) - }) - if err := executor.Init(runCtx); err != nil { - s.onError(err) - return s.getError() - } - - var wg sync.WaitGroup - cancelCtx, checkCancel := context.WithCancel(ctx) - s.startCancelCheck(cancelCtx, &wg, runCancel) +// Close closes the scheduler. +func (*BaseScheduler) Close() { +} - defer func() { - err := executor.Cleanup(runCtx) - if err != nil { - logutil.Logger(s.logCtx).Error("cleanup subtask exec env failed", zap.Error(err)) - } - checkCancel() - wg.Wait() - }() +// GetTask implements the Scheduler interface. +func (s *BaseScheduler) GetTask() *proto.Task { + return s.task.Load() +} - subtasks, err := s.taskTable.GetSubtasksInStates(runCtx, s.id, task.ID, task.Step, - proto.TaskStatePending, proto.TaskStateRunning) +// refreshTask fetch task state from tidb_global_task table. +func (s *BaseScheduler) refreshTask() error { + task := s.GetTask() + newTask, err := s.taskMgr.GetTaskByID(s.ctx, task.ID) if err != nil { - s.onError(err) - if common.IsRetryableError(err) { - logutil.Logger(s.logCtx).Warn("met retryable error", zap.Error(err)) - return nil - } - return s.getError() - } - for _, subtask := range subtasks { - metrics.IncDistTaskSubTaskCnt(subtask) - metrics.StartDistTaskSubTask(subtask) + s.logger.Error("refresh task failed", zap.Error(err)) + return err } + s.task.Store(newTask) + return nil +} +// scheduleTask schedule the task execution step by step. +func (s *BaseScheduler) scheduleTask() { + ticker := time.NewTicker(checkTaskFinishedInterval) + defer ticker.Stop() for { - // check if any error occurs. - if err := s.getError(); err != nil { - break - } - if runCtx.Err() != nil { - logutil.Logger(s.logCtx).Info("scheduler runSubtask loop exit") - break - } - - subtask, err := s.taskTable.GetFirstSubtaskInStates(runCtx, s.id, task.ID, task.Step, - proto.TaskStatePending, proto.TaskStateRunning) - if err != nil { - logutil.Logger(s.logCtx).Warn("GetFirstSubtaskInStates meets error", zap.Error(err)) - continue - } - if subtask == nil { - newTask, err := s.taskTable.GetGlobalTaskByID(runCtx, task.ID) + select { + case <-s.ctx.Done(): + s.logger.Info("schedule task exits", zap.Error(s.ctx.Err())) + return + case <-ticker.C: + err := s.refreshTask() if err != nil { - logutil.Logger(s.logCtx).Warn("GetGlobalTaskByID meets error", zap.Error(err)) continue } - // When the task move to next step or task state changes, the scheduler should exit. - if newTask.Step != task.Step || newTask.State != task.State { - break - } - time.Sleep(checkTime) - continue - } + task := *s.GetTask() + failpoint.Inject("cancelTaskAfterRefreshTask", func(val failpoint.Value) { + if val.(bool) && task.State == proto.TaskStateRunning { + err := s.taskMgr.CancelTask(s.ctx, task.ID) + if err != nil { + s.logger.Error("cancel task failed", zap.Error(err)) + } + } + }) + + failpoint.Inject("pausePendingTask", func(val failpoint.Value) { + if val.(bool) && task.State == proto.TaskStatePending { + _, err := s.taskMgr.PauseTask(s.ctx, task.Key) + if err != nil { + s.logger.Error("pause task failed", zap.Error(err)) + } + task.State = proto.TaskStatePausing + s.task.Store(&task) + } + }) - if subtask.State == proto.TaskStateRunning { - if !s.IsIdempotent(subtask) { - logutil.Logger(s.logCtx).Info("subtask in running state and is not idempotent, fail it", - zap.Int64("subtask-id", subtask.ID)) - subtaskErr := errors.New("subtask in running state and is not idempotent") - s.onError(subtaskErr) - s.updateSubtaskStateAndError(runCtx, subtask, proto.TaskStateFailed, subtaskErr) - s.markErrorHandled() - break + failpoint.Inject("pauseTaskAfterRefreshTask", func(val failpoint.Value) { + if val.(bool) && task.State == proto.TaskStateRunning { + _, err := s.taskMgr.PauseTask(s.ctx, task.Key) + if err != nil { + s.logger.Error("pause task failed", zap.Error(err)) + } + task.State = proto.TaskStatePausing + s.task.Store(&task) + } + }) + + switch task.State { + case proto.TaskStateCancelling: + err = s.onCancelling() + case proto.TaskStatePausing: + err = s.onPausing() + case proto.TaskStatePaused: + err = s.onPaused() + // close the scheduler. + if err == nil { + return + } + case proto.TaskStateResuming: + err = s.onResuming() + case proto.TaskStateReverting: + err = s.onReverting() + case proto.TaskStatePending: + err = s.onPending() + case proto.TaskStateRunning: + err = s.onRunning() + case proto.TaskStateSucceed, proto.TaskStateReverted, proto.TaskStateFailed: + s.onFinished() + return } - } else { - // subtask.State == proto.TaskStatePending - s.startSubtaskAndUpdateState(runCtx, subtask) - if err := s.getError(); err != nil { - logutil.Logger(s.logCtx).Warn("startSubtaskAndUpdateState meets error", zap.Error(err)) - continue + if err != nil { + s.logger.Info("schedule task meet err, reschedule it", zap.Error(err)) } - } - failpoint.Inject("mockCleanScheduler", func() { - v, ok := testContexts.Load(s.id) - if ok { - if v.(*TestContext).mockDown.Load() { - failpoint.Break() + failpoint.Inject("mockOwnerChange", func(val failpoint.Value) { + if val.(bool) { + s.logger.Info("mockOwnerChange called") + MockOwnerChange() + time.Sleep(time.Second) } - } - }) + }) + } + } +} - failpoint.Inject("cancelBeforeRunSubtask", func() { - runCancel(nil) - }) +// handle task in cancelling state, schedule revert subtasks. +func (s *BaseScheduler) onCancelling() error { + task := s.GetTask() + s.logger.Info("on cancelling state", zap.Stringer("state", task.State), zap.Int64("step", int64(task.Step))) + errs := []error{errors.New(taskCancelMsg)} + return s.onErrHandlingStage(errs) +} - s.runSubtask(runCtx, executor, subtask) +// handle task in pausing state, cancel all running subtasks. +func (s *BaseScheduler) onPausing() error { + task := s.GetTask() + s.logger.Info("on pausing state", zap.Stringer("state", task.State), zap.Int64("step", int64(task.Step))) + cntByStates, err := s.taskMgr.GetSubtaskCntGroupByStates(s.ctx, task.ID, task.Step) + if err != nil { + s.logger.Warn("check task failed", zap.Error(err)) + return err + } + runningPendingCnt := cntByStates[proto.SubtaskStateRunning] + cntByStates[proto.SubtaskStatePending] + if runningPendingCnt == 0 { + s.logger.Info("all running subtasks paused, update the task to paused state") + return s.taskMgr.PausedTask(s.ctx, task.ID) } - return s.getError() + s.logger.Debug("on pausing state, this task keeps current state", zap.Stringer("state", task.State)) + return nil } -func (s *BaseScheduler) runSubtask(ctx context.Context, executor execute.SubtaskExecutor, subtask *proto.Subtask) { - err := executor.RunSubtask(ctx, subtask) - failpoint.Inject("MockRunSubtaskCancel", func(val failpoint.Value) { - if val.(bool) { - err = ErrCancelSubtask - } - }) +// MockDMLExecutionOnPausedState is used to mock DML execution when tasks pauses. +var MockDMLExecutionOnPausedState func(task *proto.Task) - failpoint.Inject("MockRunSubtaskContextCanceled", func(val failpoint.Value) { +// handle task in paused state. +func (s *BaseScheduler) onPaused() error { + task := s.GetTask() + s.logger.Info("on paused state", zap.Stringer("state", task.State), zap.Int64("step", int64(task.Step))) + failpoint.Inject("mockDMLExecutionOnPausedState", func(val failpoint.Value) { if val.(bool) { - err = context.Canceled + MockDMLExecutionOnPausedState(task) } }) + return nil +} + +// TestSyncChan is used to sync the test. +var TestSyncChan = make(chan struct{}) +// handle task in resuming state. +func (s *BaseScheduler) onResuming() error { + task := s.GetTask() + s.logger.Info("on resuming state", zap.Stringer("state", task.State), zap.Int64("step", int64(task.Step))) + cntByStates, err := s.taskMgr.GetSubtaskCntGroupByStates(s.ctx, task.ID, task.Step) if err != nil { - s.onError(err) + s.logger.Warn("check task failed", zap.Error(err)) + return err } - - finished := s.markSubTaskCanceledOrFailed(ctx, subtask) - if finished { - return + if cntByStates[proto.SubtaskStatePaused] == 0 { + // Finish the resuming process. + s.logger.Info("all paused tasks converted to pending state, update the task to running state") + err := s.updateTask(proto.TaskStateRunning, nil, RetrySQLTimes) + failpoint.Inject("syncAfterResume", func() { + TestSyncChan <- struct{}{} + }) + return err } - failpoint.Inject("mockTiDBDown", func(val failpoint.Value) { - logutil.Logger(s.logCtx).Info("trigger mockTiDBDown") - if s.id == val.(string) || s.id == ":4001" || s.id == ":4002" { - v, ok := testContexts.Load(s.id) - if ok { - v.(*TestContext).TestSyncSubtaskRun <- struct{}{} - v.(*TestContext).mockDown.Store(true) - logutil.Logger(s.logCtx).Info("mockTiDBDown") - time.Sleep(2 * time.Second) - failpoint.Return() - } - } - }) - failpoint.Inject("mockTiDBDown2", func() { - if s.id == ":4003" && subtask.Step == proto.StepTwo { - v, ok := testContexts.Load(s.id) - if ok { - v.(*TestContext).TestSyncSubtaskRun <- struct{}{} - v.(*TestContext).mockDown.Store(true) - time.Sleep(2 * time.Second) - return - } - } - }) + return s.taskMgr.ResumeSubtasks(s.ctx, task.ID) +} - failpoint.Inject("mockTiDBPartitionThenResume", func(val failpoint.Value) { - if val.(bool) && (s.id == ":4000" || s.id == ":4001" || s.id == ":4002") { - _ = infosync.MockGlobalServerInfoManagerEntry.DeleteByID(s.id) - time.Sleep(20 * time.Second) +// handle task in reverting state, check all revert subtasks finishes. +func (s *BaseScheduler) onReverting() error { + task := s.GetTask() + s.logger.Debug("on reverting state", zap.Stringer("state", task.State), zap.Int64("step", int64(task.Step))) + cntByStates, err := s.taskMgr.GetSubtaskCntGroupByStates(s.ctx, task.ID, task.Step) + if err != nil { + s.logger.Warn("check task failed", zap.Error(err)) + return err + } + activeRevertCnt := cntByStates[proto.SubtaskStateRevertPending] + cntByStates[proto.SubtaskStateReverting] + if activeRevertCnt == 0 { + if err = s.OnDone(s.ctx, s, task); err != nil { + return errors.Trace(err) } - }) + return s.taskMgr.RevertedTask(s.ctx, task.ID) + } + // Wait all subtasks in this step finishes. + s.OnTick(s.ctx, task) + s.logger.Debug("on reverting state, this task keeps current state", zap.Stringer("state", task.State)) + return nil +} - failpoint.Inject("MockExecutorRunErr", func(val failpoint.Value) { - if val.(bool) { - s.onError(errors.New("MockExecutorRunErr")) - } - }) - failpoint.Inject("MockExecutorRunCancel", func(val failpoint.Value) { - if taskID, ok := val.(int); ok { - mgr, err := storage.GetTaskManager() - if err != nil { - logutil.BgLogger().Error("get task manager failed", zap.Error(err)) - } else { - err = mgr.CancelGlobalTask(ctx, int64(taskID)) - if err != nil { - logutil.BgLogger().Error("cancel global task failed", zap.Error(err)) - } - } - } - }) - s.onSubtaskFinished(ctx, executor, subtask) +// handle task in pending state, schedule subtasks. +func (s *BaseScheduler) onPending() error { + task := s.GetTask() + s.logger.Debug("on pending state", zap.Stringer("state", task.State), zap.Int64("step", int64(task.Step))) + return s.switch2NextStep() } -func (s *BaseScheduler) onSubtaskFinished(ctx context.Context, executor execute.SubtaskExecutor, subtask *proto.Subtask) { - if err := s.getError(); err == nil { - if err = executor.OnFinished(ctx, subtask); err != nil { - s.onError(err) - } +// handle task in running state, check all running subtasks finishes. +// If subtasks finished, run into the next step. +func (s *BaseScheduler) onRunning() error { + task := s.GetTask() + s.logger.Debug("on running state", + zap.Stringer("state", task.State), + zap.Int64("step", int64(task.Step))) + // check current step finishes. + cntByStates, err := s.taskMgr.GetSubtaskCntGroupByStates(s.ctx, task.ID, task.Step) + if err != nil { + s.logger.Warn("check task failed", zap.Error(err)) + return err } - failpoint.Inject("MockSubtaskFinishedCancel", func(val failpoint.Value) { - if val.(bool) { - s.onError(ErrCancelSubtask) + if cntByStates[proto.SubtaskStateFailed] > 0 || cntByStates[proto.SubtaskStateCanceled] > 0 { + subTaskErrs, err := s.taskMgr.GetSubtaskErrors(s.ctx, task.ID) + if err != nil { + s.logger.Warn("collect subtask error failed", zap.Error(err)) + return err } - }) - - finished := s.markSubTaskCanceledOrFailed(ctx, subtask) - if finished { - return + if len(subTaskErrs) > 0 { + s.logger.Warn("subtasks encounter errors") + return s.onErrHandlingStage(subTaskErrs) + } + } else if s.isStepSucceed(cntByStates) { + return s.switch2NextStep() } - s.finishSubtaskAndUpdateState(ctx, subtask) - - finished = s.markSubTaskCanceledOrFailed(ctx, subtask) - if finished { - return - } + // Wait all subtasks in this step finishes. + s.OnTick(s.ctx, task) + s.logger.Debug("on running state, this task keeps current state", zap.Stringer("state", task.State)) + return nil +} - failpoint.Inject("syncAfterSubtaskFinish", func() { - TestSyncChan <- struct{}{} - <-TestSyncChan - }) +func (s *BaseScheduler) onFinished() { + task := s.GetTask() + metrics.UpdateMetricsForFinishTask(task) + s.logger.Debug("schedule task, task is finished", zap.Stringer("state", task.State)) } -// Rollback rollbacks the scheduler task. -func (s *BaseScheduler) Rollback(ctx context.Context, task *proto.Task) error { - rollbackCtx, rollbackCancel := context.WithCancelCause(ctx) - defer rollbackCancel(ErrFinishRollback) - s.registerCancelFunc(rollbackCancel) +// updateTask update the task in tidb_global_task table. +func (s *BaseScheduler) updateTask(taskState proto.TaskState, newSubTasks []*proto.Subtask, retryTimes int) (err error) { + task := *s.GetTask() + prevState := task.State + task.State = taskState + s.task.Store(&task) + logutil.BgLogger().Info("task state transform", zap.Stringer("from", prevState), zap.Stringer("to", taskState)) + if !VerifyTaskStateTransform(prevState, taskState) { + return errors.Errorf("invalid task state transform, from %s to %s", prevState, taskState) + } + + var retryable bool + for i := 0; i < retryTimes; i++ { + retryable, err = s.taskMgr.UpdateTaskAndAddSubTasks(s.ctx, &task, newSubTasks, prevState) + if err == nil || !retryable { + break + } + if err1 := s.ctx.Err(); err1 != nil { + return err1 + } + if i%10 == 0 { + s.logger.Warn("updateTask first failed", zap.Stringer("from", prevState), zap.Stringer("to", task.State), + zap.Int("retry times", i), zap.Error(err)) + } + time.Sleep(RetrySQLInterval) + } + if err != nil && retryTimes != nonRetrySQLTime { + s.logger.Warn("updateTask failed", + zap.Stringer("from", prevState), zap.Stringer("to", task.State), zap.Int("retry times", retryTimes), zap.Error(err)) + } + return err +} - s.resetError() - logutil.Logger(s.logCtx).Info("scheduler rollback a step", zap.Any("step", task.Step)) +func (s *BaseScheduler) onErrHandlingStage(receiveErrs []error) error { + task := *s.GetTask() + // we only store the first error. + task.Error = receiveErrs[0] + s.task.Store(&task) - // We should cancel all subtasks before rolling back - for { - subtask, err := s.taskTable.GetFirstSubtaskInStates(ctx, s.id, task.ID, task.Step, - proto.TaskStatePending, proto.TaskStateRunning) + var subTasks []*proto.Subtask + // when step of task is `StepInit`, no need to do revert + if task.Step != proto.StepInit { + instanceIDs, err := s.GetAllTaskExecutorIDs(s.ctx, &task) if err != nil { - s.onError(err) - return s.getError() + s.logger.Warn("get task's all instances failed", zap.Error(err)) + return err } - if subtask == nil { - break + subTasks = make([]*proto.Subtask, 0, len(instanceIDs)) + for _, id := range instanceIDs { + // reverting subtasks belong to the same step as current active step. + subTasks = append(subTasks, proto.NewSubtask( + task.Step, task.ID, task.Type, id, + task.Concurrency, proto.EmptyMeta, 0)) } + } + return s.updateTask(proto.TaskStateReverting, subTasks, RetrySQLTimes) +} - s.updateSubtaskStateAndError(ctx, subtask, proto.TaskStateCanceled, nil) - if err = s.getError(); err != nil { - return err +func (s *BaseScheduler) switch2NextStep() (err error) { + task := *s.GetTask() + nextStep := s.GetNextStep(&task) + s.logger.Info("on next step", + zap.Int64("current-step", int64(task.Step)), + zap.Int64("next-step", int64(nextStep))) + + if nextStep == proto.StepDone { + task.Step = nextStep + task.StateUpdateTime = time.Now().UTC() + s.task.Store(&task) + if err = s.OnDone(s.ctx, s, &task); err != nil { + return errors.Trace(err) } + return s.taskMgr.SucceedTask(s.ctx, task.ID) } - executor, err := s.GetSubtaskExecutor(ctx, task, nil) - if err != nil { - s.onError(err) - return s.getError() - } - subtask, err := s.taskTable.GetFirstSubtaskInStates(ctx, s.id, task.ID, task.Step, - proto.TaskStateRevertPending, proto.TaskStateReverting) + eligibleNodes, err := getEligibleNodes(s.ctx, s, s.nodeMgr.getManagedNodes()) if err != nil { - s.onError(err) - return s.getError() - } - if subtask == nil { - logutil.BgLogger().Warn("scheduler rollback a step, but no subtask in revert_pending state", zap.Any("step", task.Step)) - return nil - } - if subtask.State == proto.TaskStateRevertPending { - s.updateSubtaskStateAndError(ctx, subtask, proto.TaskStateReverting, nil) - } - if err := s.getError(); err != nil { return err } - - // right now all impl of Rollback is empty, so we don't check idempotent here. - // will try to remove this rollback completely in the future. - err = executor.Rollback(rollbackCtx) - if err != nil { - s.updateSubtaskStateAndError(ctx, subtask, proto.TaskStateRevertFailed, nil) - s.onError(err) - } else { - s.updateSubtaskStateAndError(ctx, subtask, proto.TaskStateReverted, nil) + s.logger.Info("eligible instances", zap.Int("num", len(eligibleNodes))) + if len(eligibleNodes) == 0 { + return errors.New("no available TiDB node to dispatch subtasks") } - return s.getError() -} -// Pause pause the scheduler task. -func (s *BaseScheduler) Pause(ctx context.Context, task *proto.Task) error { - logutil.Logger(s.logCtx).Info("scheduler pause subtasks") - // pause all running subtasks. - if err := s.taskTable.PauseSubtasks(ctx, s.id, task.ID); err != nil { - s.onError(err) - return s.getError() + metas, err := s.OnNextSubtasksBatch(s.ctx, s, &task, eligibleNodes, nextStep) + if err != nil { + s.logger.Warn("generate part of subtasks failed", zap.Error(err)) + return s.handlePlanErr(err) } - return nil -} + // OnNextSubtasksBatch might change meta of task. + s.task.Store(&task) -// Close closes the scheduler when all the subtasks are complete. -func (*BaseScheduler) Close() { + return s.scheduleSubTask(nextStep, metas, eligibleNodes) } -func runSummaryCollectLoop( - ctx context.Context, - task *proto.Task, - taskTable TaskTable, -) (summary *execute.Summary, cleanup func(), err error) { - taskMgr, ok := taskTable.(*storage.TaskManager) - if !ok { - return nil, func() {}, nil - } - opt, ok := taskTypes[task.Type] - if !ok { - return nil, func() {}, errors.Errorf("scheduler option for type %s not found", task.Type) - } - if opt.Summary != nil { - go opt.Summary.UpdateRowCountLoop(ctx, taskMgr) - return opt.Summary, func() { - opt.Summary.PersistRowCount(ctx, taskMgr) - }, nil - } - return nil, func() {}, nil -} +func (s *BaseScheduler) scheduleSubTask( + subtaskStep proto.Step, + metas [][]byte, + eligibleNodes []string) error { + task := s.GetTask() + s.logger.Info("schedule subtasks", + zap.Stringer("state", task.State), + zap.Int64("step", int64(task.Step)), + zap.Int("concurrency", task.Concurrency), + zap.Int("subtasks", len(metas))) + + // the scheduled node of the subtask might not be optimal, as we run all + // scheduler in parallel, and update might be called too many times when + // multiple tasks are switching to next step. + if err := s.slotMgr.update(s.ctx, s.nodeMgr, s.taskMgr); err != nil { + return err + } + adjustedEligibleNodes := s.slotMgr.adjustEligibleNodes(eligibleNodes, task.Concurrency) + var size uint64 + subTasks := make([]*proto.Subtask, 0, len(metas)) + for i, meta := range metas { + // we assign the subtask to the instance in a round-robin way. + // TODO: assign the subtask to the instance according to the system load of each nodes + pos := i % len(adjustedEligibleNodes) + instanceID := adjustedEligibleNodes[pos] + s.logger.Debug("create subtasks", zap.String("instanceID", instanceID)) + subTasks = append(subTasks, proto.NewSubtask( + subtaskStep, task.ID, task.Type, instanceID, task.Concurrency, meta, i+1)) + + size += uint64(len(meta)) + } + failpoint.Inject("cancelBeforeUpdateTask", func() { + _ = s.taskMgr.CancelTask(s.ctx, task.ID) + }) -func (s *BaseScheduler) registerCancelFunc(cancel context.CancelCauseFunc) { - s.mu.Lock() - defer s.mu.Unlock() - s.mu.runtimeCancel = cancel + // as other fields and generated key and index KV takes space too, we limit + // the size of subtasks to 80% of the transaction limit. + limit := max(uint64(float64(kv.TxnTotalSizeLimit.Load())*0.8), 1) + fn := s.taskMgr.SwitchTaskStep + if size >= limit { + // On default, transaction size limit is controlled by tidb_mem_quota_query + // which is 1G on default, so it's unlikely to reach this limit, but in + // case user set txn-total-size-limit explicitly, we insert in batch. + s.logger.Info("subtasks size exceed limit, will insert in batch", + zap.Uint64("size", size), zap.Uint64("limit", limit)) + fn = s.taskMgr.SwitchTaskStepInBatch + } + + backoffer := backoff.NewExponential(RetrySQLInterval, 2, RetrySQLMaxInterval) + return handle.RunWithRetry(s.ctx, RetrySQLTimes, backoffer, s.logger, + func(ctx context.Context) (bool, error) { + err := fn(s.ctx, task, proto.TaskStateRunning, subtaskStep, subTasks) + if errors.Cause(err) == storage.ErrUnstableSubtasks { + return false, err + } + return true, err + }, + ) } -func (s *BaseScheduler) onError(err error) { - if err == nil { - return - } - err = errors.Trace(err) - logutil.Logger(s.logCtx).Error("onError", zap.Error(err), zap.Stack("stack")) - s.mu.Lock() - defer s.mu.Unlock() - - if s.mu.err == nil { - s.mu.err = err - logutil.Logger(s.logCtx).Error("scheduler met first error", zap.Error(err)) +func (s *BaseScheduler) handlePlanErr(err error) error { + task := *s.GetTask() + s.logger.Warn("generate plan failed", zap.Error(err), zap.Stringer("state", task.State)) + if s.IsRetryableErr(err) { + return err } + task.Error = err + s.task.Store(&task) - if s.mu.runtimeCancel != nil { - s.mu.runtimeCancel(err) + if err = s.OnDone(s.ctx, s, &task); err != nil { + return errors.Trace(err) } -} -func (s *BaseScheduler) markErrorHandled() { - s.mu.Lock() - defer s.mu.Unlock() - s.mu.handled = true + return s.taskMgr.FailTask(s.ctx, task.ID, task.State, task.Error) } -func (s *BaseScheduler) getError() error { - s.mu.RLock() - defer s.mu.RUnlock() - return s.mu.err -} +// MockServerInfo exported for scheduler_test.go +var MockServerInfo []*infosync.ServerInfo -func (s *BaseScheduler) resetError() { - s.mu.Lock() - defer s.mu.Unlock() - s.mu.err = nil - s.mu.handled = false -} +// GenerateTaskExecutorNodes generate a eligible TiDB nodes. +func GenerateTaskExecutorNodes(ctx context.Context) (serverNodes []*infosync.ServerInfo, err error) { + failpoint.Inject("mockTaskExecutorNodes", func() { + failpoint.Return(MockServerInfo, nil) + }) + var serverInfos map[string]*infosync.ServerInfo + _, etcd := ctx.Value("etcd").(bool) + if intest.InTest && !etcd { + serverInfos = infosync.MockGlobalServerInfoManagerEntry.GetAllServerInfo() + } else { + serverInfos, err = infosync.GetAllServerInfo(ctx) + } + if err != nil { + return nil, err + } + if len(serverInfos) == 0 { + return nil, errors.New("not found instance") + } -func (s *BaseScheduler) startSubtaskAndUpdateState(ctx context.Context, subtask *proto.Subtask) { - metrics.DecDistTaskSubTaskCnt(subtask) - metrics.EndDistTaskSubTask(subtask) - s.startSubtask(ctx, subtask.ID) - subtask.State = proto.TaskStateRunning - metrics.IncDistTaskSubTaskCnt(subtask) - metrics.StartDistTaskSubTask(subtask) + serverNodes = make([]*infosync.ServerInfo, 0, len(serverInfos)) + for _, serverInfo := range serverInfos { + serverNodes = append(serverNodes, serverInfo) + } + return serverNodes, nil } -func (s *BaseScheduler) updateSubtaskStateAndErrorImpl(ctx context.Context, tidbID string, subtaskID int64, state proto.TaskState, subTaskErr error) { - // retry for 3+6+12+24+(30-4)*30 ~= 825s ~= 14 minutes - logger := logutil.Logger(s.logCtx) - backoffer := backoff.NewExponential(dispatcher.RetrySQLInterval, 2, dispatcher.RetrySQLMaxInterval) - err := handle.RunWithRetry(ctx, dispatcher.RetrySQLTimes, backoffer, logger, - func(ctx context.Context) (bool, error) { - return true, s.taskTable.UpdateSubtaskStateAndError(ctx, tidbID, subtaskID, state, subTaskErr) - }, - ) +// GetAllTaskExecutorIDs gets all the task executor IDs. +func (s *BaseScheduler) GetAllTaskExecutorIDs(ctx context.Context, task *proto.Task) ([]string, error) { + // We get all servers instead of eligible servers here + // because eligible servers may change during the task execution. + serverInfos, err := GenerateTaskExecutorNodes(ctx) if err != nil { - s.onError(err) + return nil, err + } + if len(serverInfos) == 0 { + return nil, nil } -} -func (s *BaseScheduler) startSubtask(ctx context.Context, subtaskID int64) { - // retry for 3+6+12+24+(30-4)*30 ~= 825s ~= 14 minutes - logger := logutil.Logger(s.logCtx) - backoffer := backoff.NewExponential(dispatcher.RetrySQLInterval, 2, dispatcher.RetrySQLMaxInterval) - err := handle.RunWithRetry(ctx, dispatcher.RetrySQLTimes, backoffer, logger, - func(ctx context.Context) (bool, error) { - return true, s.taskTable.StartSubtask(ctx, subtaskID) - }, - ) + executorIDs, err := s.taskMgr.GetTaskExecutorIDsByTaskID(s.ctx, task.ID) if err != nil { - s.onError(err) + return nil, err } + ids := make([]string, 0, len(executorIDs)) + for _, id := range executorIDs { + if ok := disttaskutil.MatchServerInfo(serverInfos, id); ok { + ids = append(ids, id) + } + } + return ids, nil } -func (s *BaseScheduler) finishSubtask(ctx context.Context, subtask *proto.Subtask) { - logger := logutil.Logger(s.logCtx) - backoffer := backoff.NewExponential(dispatcher.RetrySQLInterval, 2, dispatcher.RetrySQLMaxInterval) - err := handle.RunWithRetry(ctx, dispatcher.RetrySQLTimes, backoffer, logger, - func(ctx context.Context) (bool, error) { - return true, s.taskTable.FinishSubtask(ctx, subtask.SchedulerID, subtask.ID, subtask.Meta) - }, - ) +// GetPreviousSubtaskMetas get subtask metas from specific step. +func (s *BaseScheduler) GetPreviousSubtaskMetas(taskID int64, step proto.Step) ([][]byte, error) { + previousSubtasks, err := s.taskMgr.GetAllSubtasksByStepAndState(s.ctx, taskID, step, proto.SubtaskStateSucceed) if err != nil { - s.onError(err) + s.logger.Warn("get previous succeed subtask failed", zap.Int64("step", int64(step))) + return nil, err + } + previousSubtaskMetas := make([][]byte, 0, len(previousSubtasks)) + for _, subtask := range previousSubtasks { + previousSubtaskMetas = append(previousSubtaskMetas, subtask.Meta) } + return previousSubtaskMetas, nil } -func (s *BaseScheduler) updateSubtaskStateAndError(ctx context.Context, subtask *proto.Subtask, state proto.TaskState, subTaskErr error) { - metrics.DecDistTaskSubTaskCnt(subtask) - metrics.EndDistTaskSubTask(subtask) - s.updateSubtaskStateAndErrorImpl(ctx, subtask.SchedulerID, subtask.ID, state, subTaskErr) - subtask.State = state - metrics.IncDistTaskSubTaskCnt(subtask) - if !subtask.IsFinished() { - metrics.StartDistTaskSubTask(subtask) - } +// WithNewSession executes the function with a new session. +func (s *BaseScheduler) WithNewSession(fn func(se sessionctx.Context) error) error { + return s.taskMgr.WithNewSession(fn) } -func (s *BaseScheduler) finishSubtaskAndUpdateState(ctx context.Context, subtask *proto.Subtask) { - metrics.DecDistTaskSubTaskCnt(subtask) - metrics.EndDistTaskSubTask(subtask) - s.finishSubtask(ctx, subtask) - subtask.State = proto.TaskStateSucceed - metrics.IncDistTaskSubTaskCnt(subtask) +// WithNewTxn executes the fn in a new transaction. +func (s *BaseScheduler) WithNewTxn(ctx context.Context, fn func(se sessionctx.Context) error) error { + return s.taskMgr.WithNewTxn(ctx, fn) } -// TODO: abstract interface for each business to implement it. -func isRetryableError(err error) bool { - originErr := errors.Cause(err) - if tErr, ok := originErr.(*terror.Error); ok { - sqlErr := terror.ToSQLError(tErr) - _, ok := dbterror.ReorgRetryableErrCodes[sqlErr.Code] - return ok - } - // can't retry Unknown err - return false +func (*BaseScheduler) isStepSucceed(cntByStates map[proto.SubtaskState]int64) bool { + _, ok := cntByStates[proto.SubtaskStateSucceed] + return len(cntByStates) == 0 || (len(cntByStates) == 1 && ok) } -// markSubTaskCanceledOrFailed check the error type and decide the subtasks' state. -// 1. Only cancel subtasks when meet ErrCancelSubtask. -// 2. Only fail subtasks when meet non retryable error. -// 3. When meet other errors, don't change subtasks' state. -func (s *BaseScheduler) markSubTaskCanceledOrFailed(ctx context.Context, subtask *proto.Subtask) bool { - if err := s.getError(); err != nil { - err := errors.Cause(err) - if ctx.Err() != nil && context.Cause(ctx) == ErrCancelSubtask { - logutil.Logger(s.logCtx).Warn("subtask canceled", zap.Error(err)) - s.updateSubtaskStateAndError(s.ctx, subtask, proto.TaskStateCanceled, nil) - } else if common.IsRetryableError(err) || isRetryableError(err) { - logutil.Logger(s.logCtx).Warn("met retryable error", zap.Error(err)) - } else if common.IsContextCanceledError(err) { - logutil.Logger(s.logCtx).Info("met context canceled for gracefully shutdown", zap.Error(err)) - } else { - logutil.Logger(s.logCtx).Warn("subtask failed", zap.Error(err)) - s.updateSubtaskStateAndError(s.ctx, subtask, proto.TaskStateFailed, err) - } - s.markErrorHandled() - return true - } - return false +// IsCancelledErr checks if the error is a cancelled error. +func IsCancelledErr(err error) bool { + return strings.Contains(err.Error(), taskCancelMsg) } -func (s *BaseScheduler) updateErrorToSubtask(ctx context.Context, taskID int64, err error) error { - logger := logutil.Logger(s.logCtx) - backoffer := backoff.NewExponential(dispatcher.RetrySQLInterval, 2, dispatcher.RetrySQLMaxInterval) - err1 := handle.RunWithRetry(s.logCtx, dispatcher.RetrySQLTimes, backoffer, logger, - func(_ context.Context) (bool, error) { - return true, s.taskTable.UpdateErrorToSubtask(ctx, s.id, taskID, err) - }, - ) - if err1 == nil { - logger.Warn("update error to subtask success", zap.Error(err)) +// getEligibleNodes returns the eligible(live) nodes for the task. +// if the task can only be scheduled to some specific nodes, return them directly, +// we don't care liveliness of them. +func getEligibleNodes(ctx context.Context, sch Scheduler, managedNodes []string) ([]string, error) { + serverNodes, err := sch.GetEligibleInstances(ctx, sch.GetTask()) + if err != nil { + return nil, err + } + logutil.BgLogger().Debug("eligible instances", zap.Int("num", len(serverNodes))) + if len(serverNodes) == 0 { + serverNodes = managedNodes } - return err1 + return serverNodes, nil } diff --git a/pkg/disttask/framework/scheduler/scheduler_manager.go b/pkg/disttask/framework/scheduler/scheduler_manager.go new file mode 100644 index 0000000000000..eb823e9d51208 --- /dev/null +++ b/pkg/disttask/framework/scheduler/scheduler_manager.go @@ -0,0 +1,413 @@ +// Copyright 2023 PingCAP, 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. + +package scheduler + +import ( + "context" + "slices" + "time" + + "github.com/pingcap/errors" + "github.com/pingcap/failpoint" + "github.com/pingcap/tidb/pkg/disttask/framework/handle" + "github.com/pingcap/tidb/pkg/disttask/framework/proto" + "github.com/pingcap/tidb/pkg/metrics" + "github.com/pingcap/tidb/pkg/resourcemanager/pool/spool" + "github.com/pingcap/tidb/pkg/resourcemanager/util" + tidbutil "github.com/pingcap/tidb/pkg/util" + "github.com/pingcap/tidb/pkg/util/logutil" + "github.com/pingcap/tidb/pkg/util/syncutil" + "go.uber.org/zap" +) + +var ( + // checkTaskRunningInterval is the interval for loading tasks. + checkTaskRunningInterval = 3 * time.Second + // defaultHistorySubtaskTableGcInterval is the interval of gc history subtask table. + defaultHistorySubtaskTableGcInterval = 24 * time.Hour + // DefaultCleanUpInterval is the interval of cleanUp routine. + DefaultCleanUpInterval = 10 * time.Minute +) + +// WaitTaskFinished is used to sync the test. +var WaitTaskFinished = make(chan struct{}) + +func (sm *Manager) getSchedulerCount() int { + sm.mu.RLock() + defer sm.mu.RUnlock() + return len(sm.mu.schedulerMap) +} + +func (sm *Manager) addScheduler(taskID int64, scheduler Scheduler) { + sm.mu.Lock() + defer sm.mu.Unlock() + sm.mu.schedulerMap[taskID] = scheduler + sm.mu.schedulers = append(sm.mu.schedulers, scheduler) + slices.SortFunc(sm.mu.schedulers, func(i, j Scheduler) int { + return i.GetTask().Compare(j.GetTask()) + }) +} + +func (sm *Manager) hasScheduler(taskID int64) bool { + sm.mu.Lock() + defer sm.mu.Unlock() + _, ok := sm.mu.schedulerMap[taskID] + return ok +} + +func (sm *Manager) delScheduler(taskID int64) { + sm.mu.Lock() + defer sm.mu.Unlock() + delete(sm.mu.schedulerMap, taskID) + for i, scheduler := range sm.mu.schedulers { + if scheduler.GetTask().ID == taskID { + sm.mu.schedulers = append(sm.mu.schedulers[:i], sm.mu.schedulers[i+1:]...) + break + } + } +} + +func (sm *Manager) clearSchedulers() { + sm.mu.Lock() + defer sm.mu.Unlock() + sm.mu.schedulerMap = make(map[int64]Scheduler) + sm.mu.schedulers = sm.mu.schedulers[:0] +} + +// getSchedulers returns a copy of schedulers. +func (sm *Manager) getSchedulers() []Scheduler { + sm.mu.RLock() + defer sm.mu.RUnlock() + res := make([]Scheduler, len(sm.mu.schedulers)) + copy(res, sm.mu.schedulers) + return res +} + +// Manager manage a bunch of schedulers. +// Scheduler schedule and monitor tasks. +// The scheduling task number is limited by size of gPool. +type Manager struct { + ctx context.Context + cancel context.CancelFunc + taskMgr TaskManager + wg tidbutil.WaitGroupWrapper + gPool *spool.Pool + slotMgr *SlotManager + nodeMgr *NodeManager + balancer *balancer + initialized bool + // serverID, it's value is ip:port now. + serverID string + + finishCh chan struct{} + + mu struct { + syncutil.RWMutex + schedulerMap map[int64]Scheduler + // in task order + schedulers []Scheduler + } +} + +// NewManager creates a scheduler struct. +func NewManager(ctx context.Context, taskMgr TaskManager, serverID string) (*Manager, error) { + schedulerManager := &Manager{ + taskMgr: taskMgr, + serverID: serverID, + slotMgr: newSlotManager(), + nodeMgr: newNodeManager(), + } + gPool, err := spool.NewPool("scheduler_pool", int32(proto.MaxConcurrentTask), util.DistTask, spool.WithBlocking(true)) + if err != nil { + return nil, err + } + schedulerManager.gPool = gPool + schedulerManager.ctx, schedulerManager.cancel = context.WithCancel(ctx) + schedulerManager.mu.schedulerMap = make(map[int64]Scheduler) + schedulerManager.finishCh = make(chan struct{}, proto.MaxConcurrentTask) + schedulerManager.balancer = newBalancer(Param{ + taskMgr: taskMgr, + nodeMgr: schedulerManager.nodeMgr, + slotMgr: schedulerManager.slotMgr, + }) + + return schedulerManager, nil +} + +// Start the schedulerManager, start the scheduleTaskLoop to start multiple schedulers. +func (sm *Manager) Start() { + failpoint.Inject("disableSchedulerManager", func() { + failpoint.Return() + }) + // init cached managed nodes + sm.nodeMgr.refreshManagedNodes(sm.ctx, sm.taskMgr, sm.slotMgr) + + sm.wg.Run(sm.scheduleTaskLoop) + sm.wg.Run(sm.gcSubtaskHistoryTableLoop) + sm.wg.Run(sm.cleanupTaskLoop) + sm.wg.Run(func() { + sm.nodeMgr.maintainLiveNodesLoop(sm.ctx, sm.taskMgr) + }) + sm.wg.Run(func() { + sm.nodeMgr.refreshManagedNodesLoop(sm.ctx, sm.taskMgr, sm.slotMgr) + }) + sm.wg.Run(func() { + sm.balancer.balanceLoop(sm.ctx, sm) + }) + sm.initialized = true +} + +// Stop the schedulerManager. +func (sm *Manager) Stop() { + sm.cancel() + sm.gPool.ReleaseAndWait() + sm.wg.Wait() + sm.clearSchedulers() + sm.initialized = false + close(sm.finishCh) +} + +// Initialized check the manager initialized. +func (sm *Manager) Initialized() bool { + return sm.initialized +} + +// scheduleTaskLoop schedules the tasks. +func (sm *Manager) scheduleTaskLoop() { + logutil.BgLogger().Info("schedule task loop start") + ticker := time.NewTicker(checkTaskRunningInterval) + defer ticker.Stop() + for { + select { + case <-sm.ctx.Done(): + logutil.BgLogger().Info("schedule task loop exits", zap.Error(sm.ctx.Err()), zap.Int64("interval", int64(checkTaskRunningInterval)/1000000)) + return + case <-ticker.C: + case <-handle.TaskChangedCh: + } + + taskCnt := sm.getSchedulerCount() + if taskCnt >= proto.MaxConcurrentTask { + logutil.BgLogger().Info("scheduled tasks reached limit", + zap.Int("current", taskCnt), zap.Int("max", proto.MaxConcurrentTask)) + continue + } + + tasks, err := sm.taskMgr.GetTopUnfinishedTasks(sm.ctx) + if err != nil { + logutil.BgLogger().Warn("get unfinished tasks failed", zap.Error(err)) + continue + } + + schedulableTasks := make([]*proto.Task, 0, len(tasks)) + for _, task := range tasks { + if sm.hasScheduler(task.ID) { + continue + } + // we check it before start scheduler, so no need to check it again. + // see startScheduler. + // this should not happen normally, unless user modify system table + // directly. + if getSchedulerFactory(task.Type) == nil { + logutil.BgLogger().Warn("unknown task type", zap.Int64("task-id", task.ID), + zap.Stringer("task-type", task.Type)) + sm.failTask(task.ID, task.State, errors.New("unknown task type")) + continue + } + schedulableTasks = append(schedulableTasks, task) + } + if len(schedulableTasks) == 0 { + continue + } + + if err = sm.slotMgr.update(sm.ctx, sm.nodeMgr, sm.taskMgr); err != nil { + logutil.BgLogger().Warn("update used slot failed", zap.Error(err)) + continue + } + for _, task := range schedulableTasks { + taskCnt = sm.getSchedulerCount() + if taskCnt >= proto.MaxConcurrentTask { + break + } + reservedExecID, ok := sm.slotMgr.canReserve(task) + if !ok { + // task of lower priority might be able to be scheduled. + continue + } + metrics.DistTaskGauge.WithLabelValues(task.Type.String(), metrics.SchedulingStatus).Inc() + metrics.UpdateMetricsForDispatchTask(task.ID, task.Type) + sm.startScheduler(task, reservedExecID) + } + } +} + +func (sm *Manager) failTask(id int64, currState proto.TaskState, err error) { + if err2 := sm.taskMgr.FailTask(sm.ctx, id, currState, err); err2 != nil { + logutil.BgLogger().Warn("failed to update task state to failed", + zap.Int64("task-id", id), zap.Error(err2)) + } +} + +func (sm *Manager) gcSubtaskHistoryTableLoop() { + historySubtaskTableGcInterval := defaultHistorySubtaskTableGcInterval + failpoint.Inject("historySubtaskTableGcInterval", func(val failpoint.Value) { + if seconds, ok := val.(int); ok { + historySubtaskTableGcInterval = time.Second * time.Duration(seconds) + } + + <-WaitTaskFinished + }) + + logutil.BgLogger().Info("subtask table gc loop start") + ticker := time.NewTicker(historySubtaskTableGcInterval) + defer ticker.Stop() + for { + select { + case <-sm.ctx.Done(): + logutil.BgLogger().Info("subtask history table gc loop exits", zap.Error(sm.ctx.Err())) + return + case <-ticker.C: + err := sm.taskMgr.GCSubtasks(sm.ctx) + if err != nil { + logutil.BgLogger().Warn("subtask history table gc failed", zap.Error(err)) + } else { + logutil.BgLogger().Info("subtask history table gc success") + } + } + } +} + +func (sm *Manager) startScheduler(basicTask *proto.Task, reservedExecID string) { + task, err := sm.taskMgr.GetTaskByID(sm.ctx, basicTask.ID) + if err != nil { + logutil.BgLogger().Error("get task failed", zap.Int64("task-id", basicTask.ID), zap.Error(err)) + return + } + + schedulerFactory := getSchedulerFactory(task.Type) + scheduler := schedulerFactory(sm.ctx, task, Param{ + taskMgr: sm.taskMgr, + nodeMgr: sm.nodeMgr, + slotMgr: sm.slotMgr, + }) + if err = scheduler.Init(); err != nil { + logutil.BgLogger().Error("init scheduler failed", zap.Error(err)) + sm.failTask(task.ID, task.State, err) + return + } + sm.addScheduler(task.ID, scheduler) + sm.slotMgr.reserve(basicTask, reservedExecID) + // Using the pool with block, so it wouldn't return an error. + _ = sm.gPool.Run(func() { + defer func() { + scheduler.Close() + sm.delScheduler(task.ID) + sm.slotMgr.unReserve(basicTask, reservedExecID) + handle.NotifyTaskChange() + }() + metrics.UpdateMetricsForRunTask(task) + scheduler.ScheduleTask() + logutil.BgLogger().Info("task finished", zap.Int64("task-id", task.ID)) + sm.finishCh <- struct{}{} + }) +} + +func (sm *Manager) cleanupTaskLoop() { + logutil.BgLogger().Info("cleanUp loop start") + ticker := time.NewTicker(DefaultCleanUpInterval) + defer ticker.Stop() + for { + select { + case <-sm.ctx.Done(): + logutil.BgLogger().Info("cleanUp loop exits", zap.Error(sm.ctx.Err())) + return + case <-sm.finishCh: + sm.doCleanupTask() + case <-ticker.C: + sm.doCleanupTask() + } + } +} + +// WaitCleanUpFinished is used to sync the test. +var WaitCleanUpFinished = make(chan struct{}, 1) + +// doCleanupTask processes clean up routine defined by each type of tasks and cleanUpMeta. +// For example: +// +// tasks with global sort should clean up tmp files stored on S3. +func (sm *Manager) doCleanupTask() { + tasks, err := sm.taskMgr.GetTasksInStates( + sm.ctx, + proto.TaskStateFailed, + proto.TaskStateReverted, + proto.TaskStateSucceed, + ) + if err != nil { + logutil.BgLogger().Warn("cleanUp routine failed", zap.Error(err)) + return + } + if len(tasks) == 0 { + return + } + logutil.BgLogger().Info("cleanUp routine start") + err = sm.cleanUpFinishedTasks(tasks) + if err != nil { + logutil.BgLogger().Warn("cleanUp routine failed", zap.Error(err)) + return + } + failpoint.Inject("WaitCleanUpFinished", func() { + WaitCleanUpFinished <- struct{}{} + }) + logutil.BgLogger().Info("cleanUp routine success") +} + +func (sm *Manager) cleanUpFinishedTasks(tasks []*proto.Task) error { + cleanedTasks := make([]*proto.Task, 0) + var firstErr error + for _, task := range tasks { + cleanUpFactory := getSchedulerCleanUpFactory(task.Type) + if cleanUpFactory != nil { + cleanUp := cleanUpFactory() + err := cleanUp.CleanUp(sm.ctx, task) + if err != nil { + firstErr = err + break + } + cleanedTasks = append(cleanedTasks, task) + } else { + // if task doesn't register cleanUp function, mark it as cleaned. + cleanedTasks = append(cleanedTasks, task) + } + } + if firstErr != nil { + logutil.BgLogger().Warn("cleanUp routine failed", zap.Error(errors.Trace(firstErr))) + } + + failpoint.Inject("mockTransferErr", func() { + failpoint.Return(errors.New("transfer err")) + }) + + return sm.taskMgr.TransferTasks2History(sm.ctx, cleanedTasks) +} + +// MockScheduler mock one scheduler for one task, only used for tests. +func (sm *Manager) MockScheduler(task *proto.Task) *BaseScheduler { + return NewBaseScheduler(sm.ctx, task, Param{ + taskMgr: sm.taskMgr, + nodeMgr: sm.nodeMgr, + slotMgr: sm.slotMgr, + }) +} diff --git a/pkg/disttask/framework/scheduler/scheduler_manager_test.go b/pkg/disttask/framework/scheduler/scheduler_manager_test.go new file mode 100644 index 0000000000000..7988920d47391 --- /dev/null +++ b/pkg/disttask/framework/scheduler/scheduler_manager_test.go @@ -0,0 +1,83 @@ +// Copyright 2023 PingCAP, 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. + +package scheduler_test + +import ( + "context" + "testing" + "time" + + "github.com/ngaut/pools" + "github.com/pingcap/tidb/pkg/disttask/framework/mock" + "github.com/pingcap/tidb/pkg/disttask/framework/proto" + "github.com/pingcap/tidb/pkg/disttask/framework/testutil" + "github.com/pingcap/tidb/pkg/testkit" + "github.com/stretchr/testify/require" + "github.com/tikv/client-go/v2/util" + "go.uber.org/mock/gomock" +) + +func TestCleanUpRoutine(t *testing.T) { + store := testkit.CreateMockStore(t) + gtk := testkit.NewTestKit(t, store) + pool := pools.NewResourcePool(func() (pools.Resource, error) { + return gtk.Session(), nil + }, 1, 1, time.Second) + defer pool.Close() + ctrl := gomock.NewController(t) + defer ctrl.Finish() + ctx := context.Background() + ctx = util.WithInternalSourceType(ctx, "scheduler_manager") + mockCleanupRoutine := mock.NewMockCleanUpRoutine(ctrl) + + sch, mgr := MockSchedulerManager(t, ctrl, pool, getNumberExampleSchedulerExt(ctrl), mockCleanupRoutine) + mockCleanupRoutine.EXPECT().CleanUp(gomock.Any(), gomock.Any()).Return(nil).AnyTimes() + sch.Start() + defer sch.Stop() + taskID, err := mgr.CreateTask(ctx, "test", proto.TaskTypeExample, 1, nil) + require.NoError(t, err) + + checkTaskRunningCnt := func() []*proto.Task { + var tasks []*proto.Task + require.Eventually(t, func() bool { + var err error + tasks, err = mgr.GetTasksInStates(ctx, proto.TaskStateRunning) + require.NoError(t, err) + return len(tasks) == 1 + }, 5*time.Second, 50*time.Millisecond) + return tasks + } + + checkSubtaskCnt := func(tasks []*proto.Task, taskID int64) { + require.Eventually(t, func() bool { + cntByStates, err := mgr.GetSubtaskCntGroupByStates(ctx, taskID, proto.StepOne) + require.NoError(t, err) + return int64(subtaskCnt) == cntByStates[proto.SubtaskStatePending] + }, 5*time.Second, 50*time.Millisecond) + } + + tasks := checkTaskRunningCnt() + checkSubtaskCnt(tasks, taskID) + for i := 1; i <= subtaskCnt; i++ { + err = mgr.UpdateSubtaskStateAndError(ctx, ":4000", int64(i), proto.SubtaskStateSucceed, nil) + require.NoError(t, err) + } + sch.DoCleanUpRoutine() + require.Eventually(t, func() bool { + tasks, err := testutil.GetTasksFromHistoryInStates(ctx, mgr, proto.TaskStateSucceed) + require.NoError(t, err) + return len(tasks) != 0 + }, 5*time.Second*10, time.Millisecond*300) +} diff --git a/pkg/disttask/framework/scheduler/scheduler_nokit_test.go b/pkg/disttask/framework/scheduler/scheduler_nokit_test.go new file mode 100644 index 0000000000000..2e67331c90e1b --- /dev/null +++ b/pkg/disttask/framework/scheduler/scheduler_nokit_test.go @@ -0,0 +1,270 @@ +// Copyright 2024 PingCAP, 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. + +package scheduler + +import ( + "context" + "testing" + "time" + + "github.com/pingcap/errors" + "github.com/pingcap/failpoint" + "github.com/pingcap/tidb/pkg/config" + "github.com/pingcap/tidb/pkg/disttask/framework/mock" + "github.com/pingcap/tidb/pkg/disttask/framework/proto" + mockDispatch "github.com/pingcap/tidb/pkg/disttask/framework/scheduler/mock" + "github.com/pingcap/tidb/pkg/disttask/framework/storage" + "github.com/pingcap/tidb/pkg/kv" + "github.com/stretchr/testify/require" + "github.com/tikv/client-go/v2/util" + "go.uber.org/mock/gomock" +) + +func TestDispatcherOnNextStage(t *testing.T) { + ctrl := gomock.NewController(t) + defer ctrl.Finish() + taskMgr := mock.NewMockTaskManager(ctrl) + schExt := mockDispatch.NewMockExtension(ctrl) + + ctx := context.Background() + ctx = util.WithInternalSourceType(ctx, "dispatcher") + task := proto.Task{ + ID: 1, + State: proto.TaskStatePending, + Step: proto.StepInit, + } + cloneTask := task + nodeMgr := NewNodeManager() + sch := NewBaseScheduler(ctx, &cloneTask, Param{ + taskMgr: taskMgr, + nodeMgr: nodeMgr, + slotMgr: newSlotManager(), + }) + sch.Extension = schExt + + // test next step is done + schExt.EXPECT().GetNextStep(gomock.Any()).Return(proto.StepDone) + schExt.EXPECT().OnDone(gomock.Any(), gomock.Any(), gomock.Any()).Return(errors.New("done err")) + require.ErrorContains(t, sch.Switch2NextStep(), "done err") + require.True(t, ctrl.Satisfied()) + // we update task step before OnDone + require.Equal(t, proto.StepDone, sch.GetTask().Step) + taskClone2 := task + sch.task.Store(&taskClone2) + schExt.EXPECT().GetNextStep(gomock.Any()).Return(proto.StepDone) + schExt.EXPECT().OnDone(gomock.Any(), gomock.Any(), gomock.Any()).Return(nil) + taskMgr.EXPECT().SucceedTask(gomock.Any(), gomock.Any()).Return(nil) + require.NoError(t, sch.Switch2NextStep()) + require.True(t, ctrl.Satisfied()) + + // GetEligibleInstances err + schExt.EXPECT().GetNextStep(gomock.Any()).Return(proto.StepOne) + schExt.EXPECT().GetEligibleInstances(gomock.Any(), gomock.Any()).Return(nil, errors.New("GetEligibleInstances err")) + require.ErrorContains(t, sch.Switch2NextStep(), "GetEligibleInstances err") + require.True(t, ctrl.Satisfied()) + // GetEligibleInstances no instance + schExt.EXPECT().GetNextStep(gomock.Any()).Return(proto.StepOne) + schExt.EXPECT().GetEligibleInstances(gomock.Any(), gomock.Any()).Return(nil, nil) + require.ErrorContains(t, sch.Switch2NextStep(), "no available TiDB node to dispatch subtasks") + require.True(t, ctrl.Satisfied()) + + serverNodes := []string{":4000"} + // OnNextSubtasksBatch err + schExt.EXPECT().GetNextStep(gomock.Any()).Return(proto.StepOne) + schExt.EXPECT().GetEligibleInstances(gomock.Any(), gomock.Any()).Return(serverNodes, nil) + schExt.EXPECT().OnNextSubtasksBatch(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()). + Return(nil, errors.New("OnNextSubtasksBatch err")) + schExt.EXPECT().IsRetryableErr(gomock.Any()).Return(true) + require.ErrorContains(t, sch.Switch2NextStep(), "OnNextSubtasksBatch err") + require.True(t, ctrl.Satisfied()) + + bak := kv.TxnTotalSizeLimit.Load() + t.Cleanup(func() { + kv.TxnTotalSizeLimit.Store(bak) + }) + + // dispatch in batch + subtaskMetas := [][]byte{ + []byte(`{"xx": "1"}`), + []byte(`{"xx": "2"}`), + } + schExt.EXPECT().GetNextStep(gomock.Any()).Return(proto.StepOne) + schExt.EXPECT().GetEligibleInstances(gomock.Any(), gomock.Any()).Return(serverNodes, nil) + schExt.EXPECT().OnNextSubtasksBatch(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()). + Return(subtaskMetas, nil) + taskMgr.EXPECT().GetUsedSlotsOnNodes(gomock.Any()).Return(nil, nil) + taskMgr.EXPECT().SwitchTaskStepInBatch(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(nil) + kv.TxnTotalSizeLimit.Store(1) + require.NoError(t, sch.Switch2NextStep()) + require.True(t, ctrl.Satisfied()) + // met unstable subtasks + schExt.EXPECT().GetNextStep(gomock.Any()).Return(proto.StepOne) + schExt.EXPECT().GetEligibleInstances(gomock.Any(), gomock.Any()).Return(serverNodes, nil) + schExt.EXPECT().OnNextSubtasksBatch(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()). + Return(subtaskMetas, nil) + taskMgr.EXPECT().GetUsedSlotsOnNodes(gomock.Any()).Return(nil, nil) + taskMgr.EXPECT().SwitchTaskStepInBatch(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()). + Return(errors.Annotatef(storage.ErrUnstableSubtasks, "expected %d, got %d", + 2, 100)) + kv.TxnTotalSizeLimit.Store(1) + startTime := time.Now() + err := sch.Switch2NextStep() + require.ErrorIs(t, err, storage.ErrUnstableSubtasks) + require.ErrorContains(t, err, "expected 2, got 100") + require.WithinDuration(t, startTime, time.Now(), 10*time.Second) + require.True(t, ctrl.Satisfied()) + + // dispatch in one txn + schExt.EXPECT().GetNextStep(gomock.Any()).Return(proto.StepOne) + schExt.EXPECT().GetEligibleInstances(gomock.Any(), gomock.Any()).Return(serverNodes, nil) + schExt.EXPECT().OnNextSubtasksBatch(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()). + Return(subtaskMetas, nil) + taskMgr.EXPECT().GetUsedSlotsOnNodes(gomock.Any()).Return(nil, nil) + taskMgr.EXPECT().SwitchTaskStep(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(nil) + kv.TxnTotalSizeLimit.Store(config.DefTxnTotalSizeLimit) + require.NoError(t, sch.Switch2NextStep()) + require.True(t, ctrl.Satisfied()) +} + +func TestManagerSchedulersOrdered(t *testing.T) { + ctrl := gomock.NewController(t) + defer ctrl.Finish() + mgr, err := NewManager(context.Background(), nil, "1") + require.NoError(t, err) + for i := 1; i <= 5; i++ { + task := &proto.Task{ + ID: int64(i * 10), + } + mockScheduler := mock.NewMockScheduler(ctrl) + mockScheduler.EXPECT().GetTask().Return(task).AnyTimes() + mgr.addScheduler(task.ID, mockScheduler) + } + ordered := func(schedulers []Scheduler) bool { + for i := 1; i < len(schedulers); i++ { + if schedulers[i-1].GetTask().Compare(schedulers[i].GetTask()) >= 0 { + return false + } + } + return true + } + require.Len(t, mgr.getSchedulers(), 5) + require.True(t, ordered(mgr.getSchedulers())) + + task35 := &proto.Task{ + ID: int64(35), + } + mockScheduler35 := mock.NewMockScheduler(ctrl) + mockScheduler35.EXPECT().GetTask().Return(task35).AnyTimes() + + mgr.delScheduler(30) + require.False(t, mgr.hasScheduler(30)) + mgr.addScheduler(task35.ID, mockScheduler35) + require.True(t, mgr.hasScheduler(35)) + require.Len(t, mgr.getSchedulers(), 5) + require.True(t, ordered(mgr.getSchedulers())) +} + +func TestGetEligibleNodes(t *testing.T) { + ctrl := gomock.NewController(t) + defer ctrl.Finish() + ctx := context.Background() + mockSch := mock.NewMockScheduler(ctrl) + mockSch.EXPECT().GetTask().Return(&proto.Task{ID: 1}).AnyTimes() + + mockSch.EXPECT().GetEligibleInstances(gomock.Any(), gomock.Any()).Return(nil, errors.New("mock err")) + _, err := getEligibleNodes(ctx, mockSch, []string{":4000"}) + require.ErrorContains(t, err, "mock err") + require.True(t, ctrl.Satisfied()) + + mockSch.EXPECT().GetEligibleInstances(gomock.Any(), gomock.Any()).Return([]string{":4000"}, nil) + nodes, err := getEligibleNodes(ctx, mockSch, []string{":4000", ":4001"}) + require.NoError(t, err) + require.Equal(t, []string{":4000"}, nodes) + require.True(t, ctrl.Satisfied()) + + mockSch.EXPECT().GetEligibleInstances(gomock.Any(), gomock.Any()).Return(nil, nil) + nodes, err = getEligibleNodes(ctx, mockSch, []string{":4000", ":4001"}) + require.NoError(t, err) + require.Equal(t, []string{":4000", ":4001"}, nodes) + require.True(t, ctrl.Satisfied()) +} + +func TestSchedulerIsStepSucceed(t *testing.T) { + s := &BaseScheduler{} + require.True(t, s.isStepSucceed(nil)) + require.True(t, s.isStepSucceed(map[proto.SubtaskState]int64{})) + require.True(t, s.isStepSucceed(map[proto.SubtaskState]int64{ + proto.SubtaskStateSucceed: 1, + })) + for _, state := range []proto.SubtaskState{ + proto.SubtaskStateCanceled, + proto.SubtaskStateFailed, + proto.SubtaskStateReverting, + } { + require.False(t, s.isStepSucceed(map[proto.SubtaskState]int64{ + state: 1, + })) + } +} + +func TestSchedulerCleanupTask(t *testing.T) { + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/domain/MockDisableDistTask", "return(true)")) + defer func() { + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/domain/MockDisableDistTask")) + }() + ctrl := gomock.NewController(t) + defer ctrl.Finish() + taskMgr := mock.NewMockTaskManager(ctrl) + ctx := context.Background() + mgr, err := NewManager(ctx, taskMgr, "1") + require.NoError(t, err) + + // normal + tasks := []*proto.Task{ + {ID: 1}, + } + taskMgr.EXPECT().GetTasksInStates( + mgr.ctx, + proto.TaskStateFailed, + proto.TaskStateReverted, + proto.TaskStateSucceed).Return(tasks, nil) + + taskMgr.EXPECT().TransferTasks2History(mgr.ctx, tasks).Return(nil) + mgr.doCleanupTask() + require.True(t, ctrl.Satisfied()) + + // fail in transfer + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/disttask/framework/scheduler/WaitCleanUpFinished", "1*return()")) + mockErr := errors.New("transfer err") + taskMgr.EXPECT().GetTasksInStates( + mgr.ctx, + proto.TaskStateFailed, + proto.TaskStateReverted, + proto.TaskStateSucceed).Return(tasks, nil) + taskMgr.EXPECT().TransferTasks2History(mgr.ctx, tasks).Return(mockErr) + mgr.doCleanupTask() + require.True(t, ctrl.Satisfied()) + + taskMgr.EXPECT().GetTasksInStates( + mgr.ctx, + proto.TaskStateFailed, + proto.TaskStateReverted, + proto.TaskStateSucceed).Return(tasks, nil) + taskMgr.EXPECT().TransferTasks2History(mgr.ctx, tasks).Return(nil) + mgr.doCleanupTask() + require.True(t, ctrl.Satisfied()) + + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/disttask/framework/scheduler/WaitCleanUpFinished")) +} diff --git a/pkg/disttask/framework/scheduler/scheduler_test.go b/pkg/disttask/framework/scheduler/scheduler_test.go index 508cdcfae1a13..752d499832f84 100644 --- a/pkg/disttask/framework/scheduler/scheduler_test.go +++ b/pkg/disttask/framework/scheduler/scheduler_test.go @@ -12,389 +12,594 @@ // See the License for the specific language governing permissions and // limitations under the License. -package scheduler +package scheduler_test import ( "context" + "fmt" + "slices" + "strings" "testing" + "time" + "github.com/ngaut/pools" "github.com/pingcap/errors" + "github.com/pingcap/failpoint" "github.com/pingcap/tidb/pkg/disttask/framework/mock" - mockexecute "github.com/pingcap/tidb/pkg/disttask/framework/mock/execute" "github.com/pingcap/tidb/pkg/disttask/framework/proto" + "github.com/pingcap/tidb/pkg/disttask/framework/scheduler" + mockDispatch "github.com/pingcap/tidb/pkg/disttask/framework/scheduler/mock" + "github.com/pingcap/tidb/pkg/disttask/framework/storage" + "github.com/pingcap/tidb/pkg/disttask/framework/testutil" + "github.com/pingcap/tidb/pkg/domain/infosync" + "github.com/pingcap/tidb/pkg/kv" + "github.com/pingcap/tidb/pkg/sessionctx" + "github.com/pingcap/tidb/pkg/testkit" + disttaskutil "github.com/pingcap/tidb/pkg/util/disttask" + "github.com/pingcap/tidb/pkg/util/logutil" + "github.com/pingcap/tidb/pkg/util/sqlexec" "github.com/stretchr/testify/require" + "github.com/tikv/client-go/v2/util" "go.uber.org/mock/gomock" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/status" ) -var ( - unfinishedNormalSubtaskStates = []interface{}{ - proto.TaskStatePending, proto.TaskStateRunning, - } - unfinishedRevertSubtaskStates = []interface{}{ - proto.TaskStateRevertPending, proto.TaskStateReverting, - } +const ( + subtaskCnt = 3 ) -func TestSchedulerRun(t *testing.T) { - var tp proto.TaskType = "test_scheduler_run" - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - runCtx, runCancel := context.WithCancel(ctx) - defer runCancel() +func getTestSchedulerExt(ctrl *gomock.Controller) scheduler.Extension { + mockScheduler := mockDispatch.NewMockExtension(ctrl) + mockScheduler.EXPECT().OnTick(gomock.Any(), gomock.Any()).Return().AnyTimes() + mockScheduler.EXPECT().GetEligibleInstances(gomock.Any(), gomock.Any()).DoAndReturn( + func(_ context.Context, _ *proto.Task) ([]string, error) { + return nil, nil + }, + ).AnyTimes() + mockScheduler.EXPECT().IsRetryableErr(gomock.Any()).Return(true).AnyTimes() + mockScheduler.EXPECT().GetNextStep(gomock.Any()).DoAndReturn( + func(task *proto.Task) proto.Step { + return proto.StepDone + }, + ).AnyTimes() + mockScheduler.EXPECT().OnNextSubtasksBatch(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).DoAndReturn( + func(_ context.Context, _ storage.TaskHandle, _ *proto.Task, _ []string, _ proto.Step) (metas [][]byte, err error) { + return nil, nil + }, + ).AnyTimes() + + mockScheduler.EXPECT().OnDone(gomock.Any(), gomock.Any(), gomock.Any()).Return(nil).AnyTimes() + return mockScheduler +} + +func getNumberExampleSchedulerExt(ctrl *gomock.Controller) scheduler.Extension { + mockScheduler := mockDispatch.NewMockExtension(ctrl) + mockScheduler.EXPECT().OnTick(gomock.Any(), gomock.Any()).Return().AnyTimes() + mockScheduler.EXPECT().GetEligibleInstances(gomock.Any(), gomock.Any()).DoAndReturn( + func(ctx context.Context, _ *proto.Task) ([]string, error) { + return nil, nil + }, + ).AnyTimes() + mockScheduler.EXPECT().IsRetryableErr(gomock.Any()).Return(true).AnyTimes() + mockScheduler.EXPECT().GetNextStep(gomock.Any()).DoAndReturn( + func(task *proto.Task) proto.Step { + switch task.Step { + case proto.StepInit: + return proto.StepOne + default: + return proto.StepDone + } + }, + ).AnyTimes() + mockScheduler.EXPECT().OnNextSubtasksBatch(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).DoAndReturn( + func(_ context.Context, _ storage.TaskHandle, task *proto.Task, _ []string, _ proto.Step) (metas [][]byte, err error) { + switch task.Step { + case proto.StepInit: + for i := 0; i < subtaskCnt; i++ { + metas = append(metas, []byte{'1'}) + } + logutil.BgLogger().Info("progress step init") + case proto.StepOne: + logutil.BgLogger().Info("progress step one") + return nil, nil + default: + return nil, errors.New("unknown step") + } + return metas, nil + }, + ).AnyTimes() + + mockScheduler.EXPECT().OnDone(gomock.Any(), gomock.Any(), gomock.Any()).Return(nil).AnyTimes() + return mockScheduler +} + +func MockSchedulerManager(t *testing.T, ctrl *gomock.Controller, pool *pools.ResourcePool, ext scheduler.Extension, cleanUp scheduler.CleanUpRoutine) (*scheduler.Manager, *storage.TaskManager) { + ctx := context.WithValue(context.Background(), "etcd", true) + mgr := storage.NewTaskManager(pool) + storage.SetTaskManager(mgr) + sch, err := scheduler.NewManager(util.WithInternalSourceType(ctx, "scheduler"), mgr, "host:port") + require.NoError(t, err) + scheduler.RegisterSchedulerFactory(proto.TaskTypeExample, + func(ctx context.Context, task *proto.Task, param scheduler.Param) scheduler.Scheduler { + mockScheduler := sch.MockScheduler(task) + mockScheduler.Extension = ext + return mockScheduler + }) + return sch, mgr +} + +func deleteTasks(t *testing.T, store kv.Storage, taskID int64) { + tk := testkit.NewTestKit(t, store) + tk.MustExec(fmt.Sprintf("delete from mysql.tidb_global_task where id = %d", taskID)) +} + +func TestGetInstance(t *testing.T) { + ctx := context.Background() + ctx = util.WithInternalSourceType(ctx, "scheduler") + + store := testkit.CreateMockStore(t) + gtk := testkit.NewTestKit(t, store) + pool := pools.NewResourcePool(func() (pools.Resource, error) { + return gtk.Session(), nil + }, 1, 1, time.Second) + defer pool.Close() ctrl := gomock.NewController(t) defer ctrl.Finish() - mockSubtaskTable := mock.NewMockTaskTable(ctrl) - mockSubtaskExecutor := mockexecute.NewMockSubtaskExecutor(ctrl) - mockExtension := mock.NewMockExtension(ctrl) - - // we don't test cancelCheck here, but in case the test is slow and trigger it. - mockSubtaskTable.EXPECT().IsSchedulerCanceled(ctx, gomock.Any(), gomock.Any()).Return(false, nil).AnyTimes() - - // 1. no scheduler constructor - schedulerRegisterErr := errors.Errorf("constructor of scheduler for key not found") - mockExtension.EXPECT().GetSubtaskExecutor(gomock.Any(), gomock.Any(), gomock.Any()).Return(nil, schedulerRegisterErr).Times(2) - scheduler := NewBaseScheduler(ctx, "id", 1, mockSubtaskTable) - scheduler.Extension = mockExtension - err := scheduler.run(runCtx, &proto.Task{Step: proto.StepOne, Type: tp}) - require.EqualError(t, err, schedulerRegisterErr.Error()) - mockSubtaskTable.EXPECT().UpdateErrorToSubtask(runCtx, gomock.Any(), gomock.Any(), gomock.Any()).Return(nil).AnyTimes() - err = scheduler.Run(runCtx, &proto.Task{Step: proto.StepOne, Type: tp}) + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/disttask/framework/scheduler/mockTaskExecutorNodes", "return()")) + schManager, mgr := MockSchedulerManager(t, ctrl, pool, getTestSchedulerExt(ctrl), nil) + // test no server + task := &proto.Task{ID: 1, Type: proto.TaskTypeExample} + sch := schManager.MockScheduler(task) + sch.Extension = getTestSchedulerExt(ctrl) + instanceIDs, err := sch.GetAllTaskExecutorIDs(ctx, task) + require.Lenf(t, instanceIDs, 0, "GetAllTaskExecutorIDs when there's no subtask") require.NoError(t, err) - // 2. init subtask exec env failed - mockExtension.EXPECT().GetSubtaskExecutor(gomock.Any(), gomock.Any(), gomock.Any()).Return(mockSubtaskExecutor, nil).AnyTimes() - - initErr := errors.New("init error") - mockSubtaskExecutor.EXPECT().Init(gomock.Any()).Return(initErr) - err = scheduler.run(runCtx, &proto.Task{Step: proto.StepOne, Type: tp}) - require.EqualError(t, err, initErr.Error()) - - var taskID int64 = 1 - var concurrency uint64 = 10 - task := &proto.Task{Step: proto.StepOne, Type: tp, ID: taskID, Concurrency: concurrency} - - // 3. run subtask failed - runSubtaskErr := errors.New("run subtask error") - mockSubtaskExecutor.EXPECT().Init(gomock.Any()).Return(nil) - mockSubtaskTable.EXPECT().GetSubtasksInStates(gomock.Any(), "id", taskID, proto.StepOne, - unfinishedNormalSubtaskStates...).Return([]*proto.Subtask{{ - ID: 1, Type: tp, Step: proto.StepOne, State: proto.TaskStatePending, SchedulerID: "id"}}, nil) - mockSubtaskTable.EXPECT().GetFirstSubtaskInStates(gomock.Any(), "id", taskID, proto.StepOne, - unfinishedNormalSubtaskStates...).Return(&proto.Subtask{ - ID: 1, Type: tp, Step: proto.StepOne, State: proto.TaskStatePending, SchedulerID: "id"}, nil) - mockSubtaskTable.EXPECT().StartSubtask(gomock.Any(), taskID).Return(nil) - mockSubtaskExecutor.EXPECT().RunSubtask(gomock.Any(), gomock.Any()).Return(runSubtaskErr) - mockSubtaskTable.EXPECT().UpdateSubtaskStateAndError(gomock.Any(), "id", taskID, proto.TaskStateFailed, gomock.Any()).Return(nil) - mockSubtaskExecutor.EXPECT().Cleanup(gomock.Any()).Return(nil) - - err = scheduler.Run(runCtx, task) - require.EqualError(t, err, runSubtaskErr.Error()) - - // 4. run subtask success - mockSubtaskExecutor.EXPECT().Init(gomock.Any()).Return(nil) - mockSubtaskTable.EXPECT().GetSubtasksInStates(gomock.Any(), "id", taskID, proto.StepOne, - unfinishedNormalSubtaskStates...).Return([]*proto.Subtask{{ - ID: 1, Type: tp, Step: proto.StepOne, State: proto.TaskStatePending, SchedulerID: "id"}}, nil) - mockSubtaskTable.EXPECT().GetFirstSubtaskInStates(gomock.Any(), "id", taskID, proto.StepOne, - unfinishedNormalSubtaskStates...).Return(&proto.Subtask{ - ID: 1, Type: tp, Step: proto.StepOne, State: proto.TaskStatePending, SchedulerID: "id"}, nil) - mockSubtaskTable.EXPECT().StartSubtask(gomock.Any(), taskID).Return(nil) - mockSubtaskExecutor.EXPECT().RunSubtask(gomock.Any(), gomock.Any()).Return(nil) - mockSubtaskExecutor.EXPECT().OnFinished(gomock.Any(), gomock.Any()).Return(nil) - mockSubtaskTable.EXPECT().FinishSubtask(gomock.Any(), "id", int64(1), gomock.Any()).Return(nil) - mockSubtaskTable.EXPECT().GetFirstSubtaskInStates(gomock.Any(), "id", taskID, proto.StepOne, - unfinishedNormalSubtaskStates...).Return(nil, nil) - mockSubtaskTable.EXPECT().GetGlobalTaskByID(gomock.Any(), gomock.Any()).Return(&proto.Task{ID: taskID, Step: proto.StepTwo}, nil) - mockSubtaskExecutor.EXPECT().Cleanup(gomock.Any()).Return(nil) - err = scheduler.Run(runCtx, task) + // test 2 servers + // server ids: uuid0, uuid1 + // subtask instance ids: nil + uuids := []string{"ddl_id_1", "ddl_id_2"} + serverIDs := []string{"10.123.124.10:32457", "[ABCD:EF01:2345:6789:ABCD:EF01:2345:6789]:65535"} + + scheduler.MockServerInfo = []*infosync.ServerInfo{ + { + ID: uuids[0], + IP: "10.123.124.10", + Port: 32457, + }, + { + ID: uuids[1], + IP: "ABCD:EF01:2345:6789:ABCD:EF01:2345:6789", + Port: 65535, + }, + } + instanceIDs, err = sch.GetAllTaskExecutorIDs(ctx, task) + require.Lenf(t, instanceIDs, 0, "GetAllTaskExecutorIDs") require.NoError(t, err) - // 5. run subtask one by one - mockSubtaskExecutor.EXPECT().Init(gomock.Any()).Return(nil) - mockSubtaskTable.EXPECT().GetSubtasksInStates(gomock.Any(), "id", taskID, proto.StepOne, - unfinishedNormalSubtaskStates...).Return( - []*proto.Subtask{ - {ID: 1, Type: tp, Step: proto.StepOne, State: proto.TaskStatePending, SchedulerID: "id"}, - {ID: 2, Type: tp, Step: proto.StepOne, State: proto.TaskStatePending, SchedulerID: "id"}, - }, nil) - // first round of the run loop - mockSubtaskTable.EXPECT().GetFirstSubtaskInStates(gomock.Any(), "id", taskID, proto.StepOne, - unfinishedNormalSubtaskStates...).Return(&proto.Subtask{ - ID: 1, Type: tp, Step: proto.StepOne, State: proto.TaskStatePending, SchedulerID: "id"}, nil) - mockSubtaskTable.EXPECT().StartSubtask(gomock.Any(), int64(1)).Return(nil) - mockSubtaskExecutor.EXPECT().RunSubtask(gomock.Any(), gomock.Any()).Return(nil) - mockSubtaskExecutor.EXPECT().OnFinished(gomock.Any(), gomock.Any()).Return(nil) - mockSubtaskTable.EXPECT().FinishSubtask(gomock.Any(), "id", int64(1), gomock.Any()).Return(nil) - // second round of the run loop - mockSubtaskTable.EXPECT().GetFirstSubtaskInStates(gomock.Any(), "id", taskID, proto.StepOne, - unfinishedNormalSubtaskStates...).Return(&proto.Subtask{ - ID: 2, Type: tp, Step: proto.StepOne, State: proto.TaskStatePending, SchedulerID: "id"}, nil) - mockSubtaskTable.EXPECT().StartSubtask(gomock.Any(), int64(2)).Return(nil) - mockSubtaskExecutor.EXPECT().RunSubtask(gomock.Any(), gomock.Any()).Return(nil) - mockSubtaskExecutor.EXPECT().OnFinished(gomock.Any(), gomock.Any()).Return(nil) - mockSubtaskTable.EXPECT().FinishSubtask(gomock.Any(), "id", int64(2), gomock.Any()).Return(nil) - // third round of the run loop - mockSubtaskTable.EXPECT().GetFirstSubtaskInStates(gomock.Any(), "id", taskID, proto.StepOne, - unfinishedNormalSubtaskStates...).Return(nil, nil) - mockSubtaskTable.EXPECT().GetGlobalTaskByID(gomock.Any(), gomock.Any()).Return(&proto.Task{ID: taskID, Step: proto.StepTwo}, nil) - mockSubtaskExecutor.EXPECT().Cleanup(gomock.Any()).Return(nil) - err = scheduler.Run(runCtx, task) + // server ids: uuid0, uuid1 + // subtask instance ids: uuid1 + subtask := &proto.Subtask{ + Type: proto.TaskTypeExample, + TaskID: task.ID, + ExecID: serverIDs[1], + } + testutil.CreateSubTask(t, mgr, task.ID, proto.StepInit, subtask.ExecID, nil, subtask.Type, 11, true) + instanceIDs, err = sch.GetAllTaskExecutorIDs(ctx, task) require.NoError(t, err) - - // run previous left subtask in running state again, but the subtask is not - // idempotent, so fail it. - subtaskID := int64(2) - theSubtask := &proto.Subtask{ID: subtaskID, Type: tp, Step: proto.StepOne, State: proto.TaskStateRunning, SchedulerID: "id"} - mockSubtaskTable.EXPECT().GetSubtasksInStates(gomock.Any(), "id", taskID, proto.StepOne, - unfinishedNormalSubtaskStates...).Return([]*proto.Subtask{theSubtask}, nil) - mockSubtaskExecutor.EXPECT().Init(gomock.Any()).Return(nil) - mockSubtaskTable.EXPECT().GetFirstSubtaskInStates(gomock.Any(), "id", taskID, proto.StepOne, - unfinishedNormalSubtaskStates...).Return(theSubtask, nil) - mockExtension.EXPECT().IsIdempotent(gomock.Any()).Return(false) - mockSubtaskTable.EXPECT().UpdateSubtaskStateAndError(gomock.Any(), "id", subtaskID, proto.TaskStateFailed, gomock.Any()).Return(nil) - mockSubtaskExecutor.EXPECT().Cleanup(gomock.Any()).Return(nil) - err = scheduler.Run(runCtx, task) - require.ErrorContains(t, err, "subtask in running state and is not idempotent") - - // run previous left subtask in running state again, but the subtask idempotent, - // run it again. - theSubtask = &proto.Subtask{ID: subtaskID, Type: tp, Step: proto.StepOne, State: proto.TaskStateRunning, SchedulerID: "id"} - mockSubtaskTable.EXPECT().GetSubtasksInStates(gomock.Any(), "id", taskID, proto.StepOne, - unfinishedNormalSubtaskStates...).Return([]*proto.Subtask{theSubtask}, nil) - mockSubtaskExecutor.EXPECT().Init(gomock.Any()).Return(nil) - // first round of the run loop - mockSubtaskTable.EXPECT().GetFirstSubtaskInStates(gomock.Any(), "id", taskID, proto.StepOne, - unfinishedNormalSubtaskStates...).Return(theSubtask, nil) - mockExtension.EXPECT().IsIdempotent(gomock.Any()).Return(true) - mockSubtaskExecutor.EXPECT().RunSubtask(gomock.Any(), gomock.Any()).Return(nil) - mockSubtaskExecutor.EXPECT().OnFinished(gomock.Any(), gomock.Any()).Return(nil) - mockSubtaskTable.EXPECT().FinishSubtask(gomock.Any(), "id", subtaskID, gomock.Any()).Return(nil) - // second round of the run loop - mockSubtaskTable.EXPECT().GetFirstSubtaskInStates(gomock.Any(), "id", taskID, proto.StepOne, - unfinishedNormalSubtaskStates...).Return(nil, nil) - mockSubtaskTable.EXPECT().GetGlobalTaskByID(gomock.Any(), gomock.Any()).Return(&proto.Task{ID: taskID, Step: proto.StepTwo}, nil) - mockSubtaskExecutor.EXPECT().Cleanup(gomock.Any()).Return(nil) - err = scheduler.Run(runCtx, task) + require.Equal(t, []string{serverIDs[1]}, instanceIDs) + // server ids: uuid0, uuid1 + // subtask instance ids: uuid0, uuid1 + subtask = &proto.Subtask{ + Type: proto.TaskTypeExample, + TaskID: task.ID, + ExecID: serverIDs[0], + } + testutil.CreateSubTask(t, mgr, task.ID, proto.StepInit, subtask.ExecID, nil, subtask.Type, 11, true) + instanceIDs, err = sch.GetAllTaskExecutorIDs(ctx, task) require.NoError(t, err) - - // 6. cancel - mockSubtaskTable.EXPECT().GetSubtasksInStates(gomock.Any(), "id", taskID, proto.StepOne, - unfinishedNormalSubtaskStates...).Return([]*proto.Subtask{{ - ID: 2, Type: tp, Step: proto.StepOne, State: proto.TaskStatePending, SchedulerID: "id"}}, nil) - mockSubtaskExecutor.EXPECT().Init(gomock.Any()).Return(nil) - mockSubtaskTable.EXPECT().GetFirstSubtaskInStates(gomock.Any(), "id", taskID, proto.StepOne, - unfinishedNormalSubtaskStates...).Return(&proto.Subtask{ - ID: 1, Type: tp, Step: proto.StepOne, State: proto.TaskStatePending, SchedulerID: "id"}, nil) - mockSubtaskTable.EXPECT().StartSubtask(gomock.Any(), taskID).Return(nil) - mockSubtaskExecutor.EXPECT().RunSubtask(gomock.Any(), gomock.Any()).Return(ErrCancelSubtask) - mockSubtaskTable.EXPECT().UpdateSubtaskStateAndError(gomock.Any(), "id", taskID, proto.TaskStateCanceled, gomock.Any()).Return(nil) - mockSubtaskExecutor.EXPECT().Cleanup(gomock.Any()).Return(nil) - err = scheduler.Run(runCtx, task) - require.EqualError(t, err, ErrCancelSubtask.Error()) - - // 7. RunSubtask return context.Canceled - mockSubtaskTable.EXPECT().GetSubtasksInStates(gomock.Any(), "id", taskID, proto.StepOne, - unfinishedNormalSubtaskStates...).Return([]*proto.Subtask{{ - ID: 2, Type: tp, Step: proto.StepOne, State: proto.TaskStatePending, SchedulerID: "id"}}, nil) - mockSubtaskExecutor.EXPECT().Init(gomock.Any()).Return(nil) - mockSubtaskTable.EXPECT().GetFirstSubtaskInStates(gomock.Any(), "id", taskID, proto.StepOne, - unfinishedNormalSubtaskStates...).Return(&proto.Subtask{ - ID: 1, Type: tp, Step: proto.StepOne, State: proto.TaskStatePending, SchedulerID: "id"}, nil) - mockSubtaskTable.EXPECT().StartSubtask(gomock.Any(), taskID).Return(nil) - mockSubtaskExecutor.EXPECT().RunSubtask(gomock.Any(), gomock.Any()).Return(context.Canceled) - mockSubtaskExecutor.EXPECT().Cleanup(gomock.Any()).Return(nil) - err = scheduler.Run(runCtx, task) - require.EqualError(t, err, context.Canceled.Error()) - - // 8. grpc cancel - mockSubtaskTable.EXPECT().GetSubtasksInStates(gomock.Any(), "id", taskID, proto.StepOne, - unfinishedNormalSubtaskStates...).Return([]*proto.Subtask{{ - ID: 2, Type: tp, Step: proto.StepOne, State: proto.TaskStatePending, SchedulerID: "id"}}, nil) - mockSubtaskExecutor.EXPECT().Init(gomock.Any()).Return(nil) - mockSubtaskTable.EXPECT().GetFirstSubtaskInStates(gomock.Any(), "id", taskID, proto.StepOne, - unfinishedNormalSubtaskStates...).Return(&proto.Subtask{ - ID: 1, Type: tp, Step: proto.StepOne, State: proto.TaskStatePending, SchedulerID: "id"}, nil) - mockSubtaskTable.EXPECT().StartSubtask(gomock.Any(), taskID).Return(nil) - grpcErr := status.Error(codes.Canceled, "test cancel") - mockSubtaskExecutor.EXPECT().RunSubtask(gomock.Any(), gomock.Any()).Return(grpcErr) - mockSubtaskExecutor.EXPECT().Cleanup(gomock.Any()).Return(nil) - err = scheduler.Run(runCtx, task) - require.EqualError(t, err, grpcErr.Error()) - - // 9. annotate grpc cancel - mockSubtaskTable.EXPECT().GetSubtasksInStates(gomock.Any(), "id", taskID, proto.StepOne, - unfinishedNormalSubtaskStates...).Return([]*proto.Subtask{{ - ID: 2, Type: tp, Step: proto.StepOne, State: proto.TaskStatePending, SchedulerID: "id"}}, nil) - mockSubtaskExecutor.EXPECT().Init(gomock.Any()).Return(nil) - mockSubtaskTable.EXPECT().GetFirstSubtaskInStates(gomock.Any(), "id", taskID, proto.StepOne, - unfinishedNormalSubtaskStates...).Return(&proto.Subtask{ - ID: 1, Type: tp, Step: proto.StepOne, State: proto.TaskStatePending, SchedulerID: "id"}, nil) - mockSubtaskTable.EXPECT().StartSubtask(gomock.Any(), taskID).Return(nil) - grpcErr = status.Error(codes.Canceled, "test cancel") - annotatedError := errors.Annotatef( - grpcErr, - " %s", - "test annotate", - ) - mockSubtaskExecutor.EXPECT().RunSubtask(gomock.Any(), gomock.Any()).Return(annotatedError) - mockSubtaskExecutor.EXPECT().Cleanup(gomock.Any()).Return(nil) - err = scheduler.Run(runCtx, task) - require.EqualError(t, err, annotatedError.Error()) - - runCancel() + require.Len(t, instanceIDs, len(serverIDs)) + require.ElementsMatch(t, instanceIDs, serverIDs) + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/disttask/framework/scheduler/mockTaskExecutorNodes")) } -func TestSchedulerRollback(t *testing.T) { - var tp proto.TaskType = "test_scheduler_rollback" - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - runCtx, runCancel := context.WithCancel(ctx) - defer runCancel() +func TestTaskFailInManager(t *testing.T) { + store := testkit.CreateMockStore(t) + gtk := testkit.NewTestKit(t, store) + pool := pools.NewResourcePool(func() (pools.Resource, error) { + return gtk.Session(), nil + }, 1, 1, time.Second) + defer pool.Close() ctrl := gomock.NewController(t) defer ctrl.Finish() - mockSubtaskTable := mock.NewMockTaskTable(ctrl) - mockSubtaskExecutor := mockexecute.NewMockSubtaskExecutor(ctrl) - mockExtension := mock.NewMockExtension(ctrl) - - // 1. no scheduler constructor - schedulerRegisterErr := errors.Errorf("constructor of scheduler for key not found") - mockExtension.EXPECT().GetSubtaskExecutor(gomock.Any(), gomock.Any(), gomock.Any()).Return(nil, schedulerRegisterErr) - scheduler := NewBaseScheduler(ctx, "id", 1, mockSubtaskTable) - scheduler.Extension = mockExtension - mockSubtaskTable.EXPECT().GetFirstSubtaskInStates(runCtx, "id", int64(1), proto.StepOne, - unfinishedNormalSubtaskStates...).Return(nil, nil) - err := scheduler.Rollback(runCtx, &proto.Task{Step: proto.StepOne, ID: 1, Type: tp}) - require.EqualError(t, err, schedulerRegisterErr.Error()) - - mockExtension.EXPECT().GetSubtaskExecutor(gomock.Any(), gomock.Any(), gomock.Any()).Return(mockSubtaskExecutor, nil).AnyTimes() - - // 2. get subtask failed - getSubtaskErr := errors.New("get subtask error") - var taskID int64 = 1 - mockSubtaskTable.EXPECT().GetFirstSubtaskInStates(runCtx, "id", taskID, proto.StepOne, - unfinishedNormalSubtaskStates...).Return(nil, nil) - mockSubtaskTable.EXPECT().GetFirstSubtaskInStates(runCtx, "id", taskID, proto.StepOne, - unfinishedRevertSubtaskStates...).Return(nil, getSubtaskErr) - err = scheduler.Rollback(runCtx, &proto.Task{Step: proto.StepOne, Type: tp, ID: taskID}) - require.EqualError(t, err, getSubtaskErr.Error()) - - // 3. no subtask - mockSubtaskTable.EXPECT().GetFirstSubtaskInStates(runCtx, "id", taskID, proto.StepOne, - unfinishedNormalSubtaskStates...).Return(nil, nil) - mockSubtaskTable.EXPECT().GetFirstSubtaskInStates(runCtx, "id", taskID, proto.StepOne, - unfinishedRevertSubtaskStates...).Return(nil, nil) - err = scheduler.Rollback(runCtx, &proto.Task{Step: proto.StepOne, Type: tp, ID: taskID}) + ctx := context.Background() + ctx = util.WithInternalSourceType(ctx, "handle_test") + + mockScheduler := mock.NewMockScheduler(ctrl) + mockScheduler.EXPECT().Init().Return(errors.New("mock scheduler init error")) + schManager, mgr := MockSchedulerManager(t, ctrl, pool, getTestSchedulerExt(ctrl), nil) + scheduler.RegisterSchedulerFactory(proto.TaskTypeExample, + func(ctx context.Context, task *proto.Task, param scheduler.Param) scheduler.Scheduler { + return mockScheduler + }) + schManager.Start() + defer schManager.Stop() + + // unknown task type + taskID, err := mgr.CreateTask(ctx, "test", "test-type", 1, nil) require.NoError(t, err) - - // 4. rollback failed - rollbackErr := errors.New("rollback error") - mockSubtaskTable.EXPECT().GetFirstSubtaskInStates(runCtx, "id", taskID, proto.StepOne, - unfinishedNormalSubtaskStates...).Return(nil, nil) - mockSubtaskTable.EXPECT().GetFirstSubtaskInStates(runCtx, "id", taskID, proto.StepOne, - unfinishedRevertSubtaskStates...).Return(&proto.Subtask{ID: 1, State: proto.TaskStateRevertPending, SchedulerID: "id"}, nil) - mockSubtaskTable.EXPECT().UpdateSubtaskStateAndError(runCtx, "id", taskID, proto.TaskStateReverting, nil).Return(nil) - mockSubtaskExecutor.EXPECT().Rollback(gomock.Any()).Return(rollbackErr) - mockSubtaskTable.EXPECT().UpdateSubtaskStateAndError(runCtx, "id", taskID, proto.TaskStateRevertFailed, nil).Return(nil) - err = scheduler.Rollback(runCtx, &proto.Task{Step: proto.StepOne, Type: tp, ID: taskID}) - require.EqualError(t, err, rollbackErr.Error()) - - // 5. rollback success - mockSubtaskTable.EXPECT().GetFirstSubtaskInStates(runCtx, "id", taskID, proto.StepOne, - unfinishedNormalSubtaskStates...).Return(&proto.Subtask{ID: 1, SchedulerID: "id"}, nil) - mockSubtaskTable.EXPECT().UpdateSubtaskStateAndError(runCtx, "id", int64(1), proto.TaskStateCanceled, nil).Return(nil) - mockSubtaskTable.EXPECT().GetFirstSubtaskInStates(runCtx, "id", taskID, proto.StepOne, - unfinishedNormalSubtaskStates...).Return(&proto.Subtask{ID: 2, SchedulerID: "id"}, nil) - mockSubtaskTable.EXPECT().UpdateSubtaskStateAndError(runCtx, "id", int64(2), proto.TaskStateCanceled, nil).Return(nil) - mockSubtaskTable.EXPECT().GetFirstSubtaskInStates(runCtx, "id", taskID, proto.StepOne, - unfinishedNormalSubtaskStates...).Return(nil, nil) - mockSubtaskTable.EXPECT().GetFirstSubtaskInStates(runCtx, "id", taskID, proto.StepOne, - unfinishedRevertSubtaskStates...).Return(&proto.Subtask{ID: 3, State: proto.TaskStateRevertPending, SchedulerID: "id"}, nil) - mockSubtaskTable.EXPECT().UpdateSubtaskStateAndError(runCtx, "id", int64(3), proto.TaskStateReverting, nil).Return(nil) - mockSubtaskExecutor.EXPECT().Rollback(gomock.Any()).Return(nil) - mockSubtaskTable.EXPECT().UpdateSubtaskStateAndError(runCtx, "id", int64(3), proto.TaskStateReverted, nil).Return(nil) - err = scheduler.Rollback(runCtx, &proto.Task{Step: proto.StepOne, Type: tp, ID: taskID}) - require.NoError(t, err) - - // rollback again for previous left subtask in TaskStateReverting state - mockSubtaskTable.EXPECT().GetFirstSubtaskInStates(runCtx, "id", taskID, proto.StepOne, - unfinishedNormalSubtaskStates...).Return(nil, nil) - mockSubtaskTable.EXPECT().GetFirstSubtaskInStates(runCtx, "id", taskID, proto.StepOne, - unfinishedRevertSubtaskStates...).Return(&proto.Subtask{ID: 3, State: proto.TaskStateReverting, SchedulerID: "id"}, nil) - mockSubtaskExecutor.EXPECT().Rollback(gomock.Any()).Return(nil) - mockSubtaskTable.EXPECT().UpdateSubtaskStateAndError(runCtx, "id", int64(3), proto.TaskStateReverted, nil).Return(nil) - err = scheduler.Rollback(runCtx, &proto.Task{Step: proto.StepOne, Type: tp, ID: taskID}) + require.Eventually(t, func() bool { + task, err := mgr.GetTaskByID(ctx, taskID) + require.NoError(t, err) + return task.State == proto.TaskStateFailed && + strings.Contains(task.Error.Error(), "unknown task type") + }, time.Second*10, time.Millisecond*300) + + // scheduler init error + taskID, err = mgr.CreateTask(ctx, "test2", proto.TaskTypeExample, 1, nil) require.NoError(t, err) + require.Eventually(t, func() bool { + task, err := mgr.GetTaskByID(ctx, taskID) + require.NoError(t, err) + return task.State == proto.TaskStateFailed && + strings.Contains(task.Error.Error(), "mock scheduler init error") + }, time.Second*10, time.Millisecond*300) } -func TestSchedulerPause(t *testing.T) { - var tp proto.TaskType = "test_scheduler_pause" - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - runCtx, runCancel := context.WithCancel(ctx) - defer runCancel() +func checkDispatch(t *testing.T, taskCnt int, isSucc, isCancel, isSubtaskCancel, isPauseAndResume bool) { + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/domain/MockDisableDistTask", "return(true)")) + defer func() { + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/domain/MockDisableDistTask")) + }() + // test DispatchTaskLoop + // test parallelism control + var originalConcurrency int + if taskCnt == 1 { + originalConcurrency = proto.MaxConcurrentTask + proto.MaxConcurrentTask = 1 + } + + store := testkit.CreateMockStore(t) + gtk := testkit.NewTestKit(t, store) + pool := pools.NewResourcePool(func() (pools.Resource, error) { + return gtk.Session(), nil + }, 1, 1, time.Second) + defer pool.Close() ctrl := gomock.NewController(t) defer ctrl.Finish() - mockSubtaskTable := mock.NewMockTaskTable(ctrl) - mockExtension := mock.NewMockExtension(ctrl) - - // pause success. - scheduler := NewBaseScheduler(ctx, "id", 1, mockSubtaskTable) - scheduler.Extension = mockExtension - mockSubtaskTable.EXPECT().PauseSubtasks(runCtx, "id", int64(1)).Return(nil) - require.NoError(t, scheduler.Pause(runCtx, &proto.Task{Step: proto.StepOne, ID: 1, Type: tp})) - - // pause error. - pauseErr := errors.New("pause error") - mockSubtaskTable.EXPECT().PauseSubtasks(runCtx, "id", int64(1)).Return(pauseErr) - err := scheduler.Pause(runCtx, &proto.Task{Step: proto.StepOne, ID: 1, Type: tp}) - require.EqualError(t, err, pauseErr.Error()) + + ctx := context.Background() + ctx = util.WithInternalSourceType(ctx, "scheduler") + + sch, mgr := MockSchedulerManager(t, ctrl, pool, getNumberExampleSchedulerExt(ctrl), nil) + require.NoError(t, mgr.InitMeta(ctx, ":4000", "background")) + sch.Start() + defer func() { + sch.Stop() + // make data race happy + if taskCnt == 1 { + proto.MaxConcurrentTask = originalConcurrency + } + }() + + // 3s + cnt := 60 + checkGetRunningTaskCnt := func(expected int) { + require.Eventually(t, func() bool { + return sch.GetRunningTaskCnt() == expected + }, 5*time.Second, 50*time.Millisecond) + } + + checkTaskRunningCnt := func() []*proto.Task { + var tasks []*proto.Task + require.Eventually(t, func() bool { + var err error + tasks, err = mgr.GetTasksInStates(ctx, proto.TaskStateRunning) + require.NoError(t, err) + return len(tasks) == taskCnt + }, 5*time.Second, 50*time.Millisecond) + return tasks + } + + checkSubtaskCnt := func(tasks []*proto.Task, taskIDs []int64) { + for i, taskID := range taskIDs { + require.Equal(t, int64(i+1), tasks[i].ID) + require.Eventually(t, func() bool { + cntByStates, err := mgr.GetSubtaskCntGroupByStates(ctx, taskID, proto.StepOne) + require.NoError(t, err) + return int64(subtaskCnt) == cntByStates[proto.SubtaskStatePending] + }, 5*time.Second, 50*time.Millisecond) + } + } + + // Mock add tasks. + taskIDs := make([]int64, 0, taskCnt) + for i := 0; i < taskCnt; i++ { + taskID, err := mgr.CreateTask(ctx, fmt.Sprintf("%d", i), proto.TaskTypeExample, 0, nil) + require.NoError(t, err) + taskIDs = append(taskIDs, taskID) + } + // test OnNextSubtasksBatch. + checkGetRunningTaskCnt(taskCnt) + tasks := checkTaskRunningCnt() + checkSubtaskCnt(tasks, taskIDs) + // test parallelism control + if taskCnt == 1 { + taskID, err := mgr.CreateTask(ctx, fmt.Sprintf("%d", taskCnt), proto.TaskTypeExample, 0, nil) + require.NoError(t, err) + checkGetRunningTaskCnt(taskCnt) + // Clean the task. + deleteTasks(t, store, taskID) + sch.DelRunningTask(taskID) + } + + // test DetectTaskLoop + checkGetTaskState := func(expectedState proto.TaskState) { + i := 0 + for ; i < cnt; i++ { + tasks, err := mgr.GetTasksInStates(ctx, expectedState) + require.NoError(t, err) + if len(tasks) == taskCnt { + break + } + historyTasks, err := testutil.GetTasksFromHistoryInStates(ctx, mgr, expectedState) + require.NoError(t, err) + if len(tasks)+len(historyTasks) == taskCnt { + break + } + time.Sleep(time.Millisecond * 50) + } + require.Less(t, i, cnt) + } + // Test all subtasks are successful. + var err error + if isSucc { + // Mock subtasks succeed. + for i := 1; i <= subtaskCnt*taskCnt; i++ { + err = mgr.UpdateSubtaskStateAndError(ctx, ":4000", int64(i), proto.SubtaskStateSucceed, nil) + require.NoError(t, err) + } + checkGetTaskState(proto.TaskStateSucceed) + require.Len(t, tasks, taskCnt) + + checkGetRunningTaskCnt(0) + return + } + + if isCancel { + for i := 1; i <= taskCnt; i++ { + err = mgr.CancelTask(ctx, int64(i)) + require.NoError(t, err) + } + } else if isPauseAndResume { + for i := 0; i < taskCnt; i++ { + found, err := mgr.PauseTask(ctx, fmt.Sprintf("%d", i)) + require.True(t, found) + require.NoError(t, err) + } + for i := 1; i <= subtaskCnt*taskCnt; i++ { + err = mgr.UpdateSubtaskStateAndError(ctx, ":4000", int64(i), proto.SubtaskStatePaused, nil) + require.NoError(t, err) + } + checkGetTaskState(proto.TaskStatePaused) + for i := 0; i < taskCnt; i++ { + found, err := mgr.ResumeTask(ctx, fmt.Sprintf("%d", i)) + require.True(t, found) + require.NoError(t, err) + } + + // Mock subtasks succeed. + for i := 1; i <= subtaskCnt*taskCnt; i++ { + err = mgr.UpdateSubtaskStateAndError(ctx, ":4000", int64(i), proto.SubtaskStateSucceed, nil) + require.NoError(t, err) + } + checkGetTaskState(proto.TaskStateSucceed) + return + } else { + // Test each task has a subtask failed. + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/disttask/framework/storage/MockUpdateTaskErr", "1*return(true)")) + defer func() { + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/disttask/framework/storage/MockUpdateTaskErr")) + }() + + if isSubtaskCancel { + // Mock a subtask canceled + for i := 1; i <= subtaskCnt*taskCnt; i += subtaskCnt { + err = mgr.UpdateSubtaskStateAndError(ctx, ":4000", int64(i), proto.SubtaskStateCanceled, nil) + require.NoError(t, err) + } + } else { + // Mock a subtask fails. + for i := 1; i <= subtaskCnt*taskCnt; i += subtaskCnt { + err = mgr.UpdateSubtaskStateAndError(ctx, ":4000", int64(i), proto.SubtaskStateFailed, nil) + require.NoError(t, err) + } + } + } + + checkGetTaskState(proto.TaskStateReverting) + require.Len(t, tasks, taskCnt) + // Mock all subtask reverted. + start := subtaskCnt * taskCnt + for i := start; i <= start+subtaskCnt*taskCnt; i++ { + err = mgr.UpdateSubtaskStateAndError(ctx, ":4000", int64(i), proto.SubtaskStateReverted, nil) + require.NoError(t, err) + } + checkGetTaskState(proto.TaskStateReverted) + require.Len(t, tasks, taskCnt) +} + +func TestSimple(t *testing.T) { + checkDispatch(t, 1, true, false, false, false) +} + +func TestSimpleErrStage(t *testing.T) { + checkDispatch(t, 1, false, false, false, false) +} + +func TestSimpleCancel(t *testing.T) { + checkDispatch(t, 1, false, true, false, false) +} + +func TestSimpleSubtaskCancel(t *testing.T) { + checkDispatch(t, 1, false, false, true, false) +} + +func TestParallel(t *testing.T) { + checkDispatch(t, 3, true, false, false, false) +} + +func TestParallelErrStage(t *testing.T) { + checkDispatch(t, 3, false, false, false, false) +} + +func TestParallelCancel(t *testing.T) { + checkDispatch(t, 3, false, true, false, false) +} + +func TestParallelSubtaskCancel(t *testing.T) { + checkDispatch(t, 3, false, false, true, false) +} + +func TestPause(t *testing.T) { + checkDispatch(t, 1, false, false, false, true) +} + +func TestParallelPause(t *testing.T) { + checkDispatch(t, 3, false, false, false, true) +} + +func TestVerifyTaskStateTransform(t *testing.T) { + testCases := []struct { + oldState proto.TaskState + newState proto.TaskState + expect bool + }{ + {proto.TaskStateRunning, proto.TaskStateRunning, true}, + {proto.TaskStatePending, proto.TaskStateRunning, true}, + {proto.TaskStatePending, proto.TaskStateReverting, false}, + {proto.TaskStateRunning, proto.TaskStateReverting, true}, + {proto.TaskStateReverting, proto.TaskStateReverted, true}, + {proto.TaskStateReverting, proto.TaskStateSucceed, false}, + {proto.TaskStateRunning, proto.TaskStatePausing, true}, + {proto.TaskStateRunning, proto.TaskStateResuming, false}, + {proto.TaskStateCancelling, proto.TaskStateRunning, false}, + } + for _, tc := range testCases { + require.Equal(t, tc.expect, scheduler.VerifyTaskStateTransform(tc.oldState, tc.newState)) + } } -func TestScheduler(t *testing.T) { - var tp proto.TaskType = "test_scheduler" - var taskID int64 = 1 - var concurrency uint64 = 10 - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - runCtx, runCancel := context.WithCancel(ctx) - defer runCancel() +func TestIsCancelledErr(t *testing.T) { + require.False(t, scheduler.IsCancelledErr(errors.New("some err"))) + require.False(t, scheduler.IsCancelledErr(context.Canceled)) + require.True(t, scheduler.IsCancelledErr(errors.New("cancelled by user"))) +} + +func TestManagerScheduleLoop(t *testing.T) { + // Mock 16 cpu node. + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/util/cpu/mockNumCpu", "return(16)")) + t.Cleanup(func() { + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/util/cpu/mockNumCpu")) + }) ctrl := gomock.NewController(t) defer ctrl.Finish() - mockSubtaskTable := mock.NewMockTaskTable(ctrl) - mockSubtaskExecutor := mockexecute.NewMockSubtaskExecutor(ctrl) - mockExtension := mock.NewMockExtension(ctrl) - mockSubtaskTable.EXPECT().IsSchedulerCanceled(gomock.Any(), gomock.Any(), gomock.Any()).Return(false, nil).AnyTimes() - mockSubtaskTable.EXPECT().UpdateSubtaskStateAndError(gomock.Any(), "id", taskID, proto.TaskStateFailed, gomock.Any()).Return(nil) - mockExtension.EXPECT().GetSubtaskExecutor(gomock.Any(), gomock.Any(), gomock.Any()).Return(mockSubtaskExecutor, nil).AnyTimes() - - scheduler := NewBaseScheduler(ctx, "id", 1, mockSubtaskTable) - scheduler.Extension = mockExtension - - // 1. run failed. - runSubtaskErr := errors.New("run subtask error") - mockSubtaskExecutor.EXPECT().Init(gomock.Any()).Return(nil) - mockSubtaskTable.EXPECT().GetSubtasksInStates(gomock.Any(), "id", taskID, proto.StepOne, - unfinishedNormalSubtaskStates...).Return([]*proto.Subtask{{ - ID: 1, Type: tp, Step: proto.StepOne, State: proto.TaskStatePending, SchedulerID: "id"}}, nil) - mockSubtaskTable.EXPECT().GetFirstSubtaskInStates(gomock.Any(), "id", taskID, proto.StepOne, - unfinishedNormalSubtaskStates...).Return(&proto.Subtask{ - ID: 1, Type: tp, Step: proto.StepOne, State: proto.TaskStatePending, SchedulerID: "id"}, nil) - mockSubtaskTable.EXPECT().StartSubtask(gomock.Any(), taskID).Return(nil) - mockSubtaskExecutor.EXPECT().RunSubtask(gomock.Any(), gomock.Any()).Return(runSubtaskErr) - mockSubtaskExecutor.EXPECT().Cleanup(gomock.Any()).Return(nil) - err := scheduler.run(runCtx, &proto.Task{Step: proto.StepOne, Type: tp, ID: taskID, Concurrency: concurrency}) - require.EqualError(t, err, runSubtaskErr.Error()) - - // 2. rollback success. - mockSubtaskTable.EXPECT().GetFirstSubtaskInStates(runCtx, "id", taskID, proto.StepOne, - unfinishedNormalSubtaskStates...).Return(nil, nil) - mockSubtaskTable.EXPECT().GetFirstSubtaskInStates(runCtx, "id", taskID, proto.StepOne, - unfinishedRevertSubtaskStates...).Return(&proto.Subtask{ID: 1, Type: tp, State: proto.TaskStateRevertPending, SchedulerID: "id"}, nil) - mockSubtaskTable.EXPECT().UpdateSubtaskStateAndError(runCtx, "id", taskID, proto.TaskStateReverting, nil).Return(nil) - mockSubtaskExecutor.EXPECT().Rollback(gomock.Any()).Return(nil) - mockSubtaskTable.EXPECT().UpdateSubtaskStateAndError(runCtx, "id", taskID, proto.TaskStateReverted, nil).Return(nil) - err = scheduler.Rollback(runCtx, &proto.Task{Step: proto.StepOne, Type: tp, ID: taskID}) + mockScheduler := mock.NewMockScheduler(ctrl) + + _ = testkit.CreateMockStore(t) + require.Eventually(t, func() bool { + taskMgr, err := storage.GetTaskManager() + return err == nil && taskMgr != nil + }, 10*time.Second, 100*time.Millisecond) + + ctx := context.Background() + ctx = util.WithInternalSourceType(ctx, "scheduler") + taskMgr, err := storage.GetTaskManager() + require.NoError(t, err) + require.NotNil(t, taskMgr) + + // in this test, we only test scheduler manager, so we add a subtask takes 16 + // slots to avoid reserve by slots, and make sure below test cases works. + serverInfos, err := infosync.GetAllServerInfo(ctx) require.NoError(t, err) + for _, s := range serverInfos { + execID := disttaskutil.GenerateExecID(s) + testutil.InsertSubtask(t, taskMgr, 1000000, proto.StepOne, execID, []byte(""), proto.SubtaskStatePending, proto.TaskTypeExample, 16) + } + concurrencies := []int{4, 6, 16, 2, 4, 4} + waitChannels := make(map[string](chan struct{})) + for i := 0; i < len(concurrencies); i++ { + waitChannels[fmt.Sprintf("key/%d", i)] = make(chan struct{}) + } + scheduler.RegisterSchedulerFactory(proto.TaskTypeExample, + func(ctx context.Context, task *proto.Task, param scheduler.Param) scheduler.Scheduler { + mockScheduler = mock.NewMockScheduler(ctrl) + // below 2 are for balancer loop, it's async, cannot determine how + // many times it will be called. + mockScheduler.EXPECT().GetTask().Return(task).AnyTimes() + mockScheduler.EXPECT().GetEligibleInstances(gomock.Any(), gomock.Any()).Return(nil, nil).AnyTimes() + mockScheduler.EXPECT().Init().Return(nil) + mockScheduler.EXPECT().ScheduleTask().Do(func() { + if task.IsDone() { + return + } + require.NoError(t, taskMgr.WithNewSession(func(se sessionctx.Context) error { + _, err := sqlexec.ExecSQL(ctx, se, "update mysql.tidb_global_task set state=%?, step=%? where id=%?", + proto.TaskStateRunning, proto.StepOne, task.ID) + return err + })) + <-waitChannels[task.Key] + require.NoError(t, taskMgr.WithNewSession(func(se sessionctx.Context) error { + _, err := sqlexec.ExecSQL(ctx, se, "update mysql.tidb_global_task set state=%?, step=%? where id=%?", + proto.TaskStateSucceed, proto.StepDone, task.ID) + return err + })) + }) + mockScheduler.EXPECT().Close() + return mockScheduler + }, + ) + for i := 0; i < len(concurrencies); i++ { + _, err := taskMgr.CreateTask(ctx, fmt.Sprintf("key/%d", i), proto.TaskTypeExample, concurrencies[i], []byte("{}")) + require.NoError(t, err) + } + getRunningTaskKeys := func() []string { + tasks, err := taskMgr.GetTasksInStates(ctx, proto.TaskStateRunning) + require.NoError(t, err) + taskKeys := make([]string, len(tasks)) + for i, task := range tasks { + taskKeys[i] = task.Key + } + slices.Sort(taskKeys) + return taskKeys + } + require.Eventually(t, func() bool { + taskKeys := getRunningTaskKeys() + return err == nil && len(taskKeys) == 4 && + taskKeys[0] == "key/0" && taskKeys[1] == "key/1" && + taskKeys[2] == "key/3" && taskKeys[3] == "key/4" + }, time.Second*10, time.Millisecond*100) + // finish the first task + close(waitChannels["key/0"]) + require.Eventually(t, func() bool { + taskKeys := getRunningTaskKeys() + return err == nil && len(taskKeys) == 4 && + taskKeys[0] == "key/1" && taskKeys[1] == "key/3" && + taskKeys[2] == "key/4" && taskKeys[3] == "key/5" + }, time.Second*10, time.Millisecond*100) + // finish the second task + close(waitChannels["key/1"]) + require.Eventually(t, func() bool { + taskKeys := getRunningTaskKeys() + return err == nil && len(taskKeys) == 4 && + taskKeys[0] == "key/2" && taskKeys[1] == "key/3" && + taskKeys[2] == "key/4" && taskKeys[3] == "key/5" + }, time.Second*10, time.Millisecond*100) + // close others + for i := 2; i < len(concurrencies); i++ { + close(waitChannels[fmt.Sprintf("key/%d", i)]) + } + require.Eventually(t, func() bool { + taskKeys := getRunningTaskKeys() + return err == nil && len(taskKeys) == 0 + }, time.Second*10, time.Millisecond*100) } diff --git a/pkg/disttask/framework/scheduler/slots.go b/pkg/disttask/framework/scheduler/slots.go new file mode 100644 index 0000000000000..c572c54eb5333 --- /dev/null +++ b/pkg/disttask/framework/scheduler/slots.go @@ -0,0 +1,228 @@ +// Copyright 2023 PingCAP, 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. + +package scheduler + +import ( + "context" + "slices" + "sync" + "sync/atomic" + + "github.com/pingcap/tidb/pkg/disttask/framework/proto" + "github.com/pingcap/tidb/pkg/util/cpu" + "github.com/pingcap/tidb/pkg/util/logutil" + "go.uber.org/zap" +) + +type taskStripes struct { + task *proto.Task + stripes int +} + +// SlotManager is used to manage the resource slots and stripes. +// +// Slot is the resource unit of dist framework on each node, each slot represents +// 1 cpu core, 1/total-core of memory, 1/total-core of disk, etc. +// +// Stripe is the resource unit of dist framework, regardless of the node, each +// stripe means 1 slot on all nodes managed by dist framework. +// Number of stripes is equal to number of slots on each node, as we assume that +// all nodes managed by dist framework are isomorphic. +// Stripes reserved for a task defines the maximum resource that a task can use +// but the task might not use all the resources. To maximize the resource utilization, +// we will try to schedule as many tasks as possible depends on the used slots +// on each node and the minimum resource required by the tasks, and in this case, +// we don't consider task order. +// +// Dist framework will try to allocate resource by slots and stripes, and give +// quota to subtask, but subtask can determine what to conform. +type SlotManager struct { + // Capacity is the total number of slots and stripes. + capacity atomic.Int32 + + mu sync.RWMutex + // represents the number of stripes reserved by task, when we reserve by the + // minimum resource required by the task, we still append into it, so it summed + // value might be larger than capacity + // this slice is in task order. + reservedStripes []taskStripes + // map of reservedStripes for fast delete + task2Index map[int64]int + // represents the number of slots reserved by task on each node, the execID + // is only used for reserve minimum resource when starting scheduler, the + // subtasks may or may not be scheduled on this node. + reservedSlots map[string]int + // represents the number of slots taken by task on each node + // on some cases it might be larger than capacity: + // current step of higher priority task A has little subtasks, so we start + // to schedule lower priority task, but next step of A has many subtasks. + // once initialized, the length of usedSlots should be equal to number of nodes + // managed by dist framework. + usedSlots atomic.Pointer[map[string]int] +} + +// newSlotManager creates a new SlotManager. +func newSlotManager() *SlotManager { + usedSlots := make(map[string]int) + s := &SlotManager{ + task2Index: make(map[int64]int), + reservedSlots: make(map[string]int), + } + s.usedSlots.Store(&usedSlots) + // this node might not be the managed node of the framework, but we initialize + // capacity with the cpu count of this node, it will be updated when node + // manager starts. + s.updateCapacity(cpu.GetCPUCount()) + return s +} + +// Update updates the used slots on each node. +// TODO: on concurrent call, update once. +func (sm *SlotManager) update(ctx context.Context, nodeMgr *NodeManager, taskMgr TaskManager) error { + nodes := nodeMgr.getManagedNodes() + slotsOnNodes, err := taskMgr.GetUsedSlotsOnNodes(ctx) + if err != nil { + return err + } + newUsedSlots := make(map[string]int, len(nodes)) + for _, node := range nodes { + newUsedSlots[node] = slotsOnNodes[node] + } + + sm.usedSlots.Store(&newUsedSlots) + return nil +} + +// CanReserve checks whether there are enough resources for a task. +// If the resource is reserved by slots, it returns the execID of the task. +// else if the resource is reserved by stripes, it returns "". +// as usedSlots is updated asynchronously, it might return false even if there +// are enough resources, or return true on resource shortage when some task +// scheduled subtasks. +func (sm *SlotManager) canReserve(task *proto.Task) (execID string, ok bool) { + usedSlots := *sm.usedSlots.Load() + capacity := int(sm.capacity.Load()) + sm.mu.RLock() + defer sm.mu.RUnlock() + if len(usedSlots) == 0 { + // no node managed by dist framework + return "", false + } + + reservedForHigherPriority := 0 + for _, s := range sm.reservedStripes { + if s.task.Compare(task) >= 0 { + break + } + reservedForHigherPriority += s.stripes + } + if task.Concurrency+reservedForHigherPriority <= capacity { + return "", true + } + + for id, count := range usedSlots { + if count+sm.reservedSlots[id]+task.Concurrency <= capacity { + return id, true + } + } + return "", false +} + +// Reserve reserves resources for a task. +// Reserve and UnReserve should be called in pair with same parameters. +func (sm *SlotManager) reserve(task *proto.Task, execID string) { + taskClone := *task + + sm.mu.Lock() + defer sm.mu.Unlock() + sm.reservedStripes = append(sm.reservedStripes, taskStripes{&taskClone, taskClone.Concurrency}) + slices.SortFunc(sm.reservedStripes, func(a, b taskStripes) int { + return a.task.Compare(b.task) + }) + for i, s := range sm.reservedStripes { + sm.task2Index[s.task.ID] = i + } + + if execID != "" { + sm.reservedSlots[execID] += taskClone.Concurrency + } +} + +// UnReserve un-reserve resources for a task. +func (sm *SlotManager) unReserve(task *proto.Task, execID string) { + sm.mu.Lock() + defer sm.mu.Unlock() + idx, ok := sm.task2Index[task.ID] + if !ok { + return + } + sm.reservedStripes = append(sm.reservedStripes[:idx], sm.reservedStripes[idx+1:]...) + delete(sm.task2Index, task.ID) + for i, s := range sm.reservedStripes { + sm.task2Index[s.task.ID] = i + } + + if execID != "" { + sm.reservedSlots[execID] -= task.Concurrency + if sm.reservedSlots[execID] == 0 { + delete(sm.reservedSlots, execID) + } + } +} + +func (sm *SlotManager) getCapacity() int { + return int(sm.capacity.Load()) +} + +// we schedule subtasks to the nodes with enough slots first, if no such nodes, +// schedule to all nodes. +func (sm *SlotManager) adjustEligibleNodes(eligibleNodes []string, concurrency int) []string { + usedSlots := *sm.usedSlots.Load() + nodes := filterNodesWithEnoughSlots(usedSlots, sm.getCapacity(), eligibleNodes, concurrency) + if len(nodes) == 0 { + nodes = eligibleNodes + } + return nodes +} + +func (sm *SlotManager) updateCapacity(cpuCount int) { + old := sm.capacity.Load() + if cpuCount > 0 && cpuCount != int(old) { + sm.capacity.Store(int32(cpuCount)) + if old == 0 { + logutil.BgLogger().Info("initialize slot capacity", zap.Int("capacity", cpuCount)) + } else { + logutil.BgLogger().Info("update slot capacity", + zap.Int("old", int(old)), zap.Int("new", cpuCount)) + } + } +} + +func filterNodesWithEnoughSlots(usedSlots map[string]int, capacity int, eligibleNodes []string, concurrency int) []string { + nodesOfEnoughSlots := make(map[string]struct{}, len(usedSlots)) + for node, slots := range usedSlots { + if slots+concurrency <= capacity { + nodesOfEnoughSlots[node] = struct{}{} + } + } + + result := make([]string, 0, len(eligibleNodes)) + for _, node := range eligibleNodes { + if _, ok := nodesOfEnoughSlots[node]; ok { + result = append(result, node) + } + } + return result +} diff --git a/pkg/disttask/framework/scheduler/slots_test.go b/pkg/disttask/framework/scheduler/slots_test.go new file mode 100644 index 0000000000000..135a233b5ce07 --- /dev/null +++ b/pkg/disttask/framework/scheduler/slots_test.go @@ -0,0 +1,249 @@ +// Copyright 2023 PingCAP, 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. + +package scheduler + +import ( + "context" + "testing" + "time" + + "github.com/pingcap/errors" + "github.com/pingcap/tidb/pkg/disttask/framework/mock" + "github.com/pingcap/tidb/pkg/disttask/framework/proto" + "github.com/stretchr/testify/require" + "go.uber.org/mock/gomock" +) + +func TestSlotManagerReserve(t *testing.T) { + sm := newSlotManager() + sm.updateCapacity(16) + // no node + _, ok := sm.canReserve(&proto.Task{Concurrency: 1}) + require.False(t, ok) + + // reserve by stripes + sm.usedSlots.Store(&map[string]int{ + "tidb-1": 16, + }) + task := proto.Task{ + Priority: proto.NormalPriority, + Concurrency: 16, + CreateTime: time.Now(), + } + task10 := task + task10.ID = 10 + task10.Concurrency = 4 + execID10, ok := sm.canReserve(&task10) + require.Equal(t, "", execID10) + require.True(t, ok) + sm.reserve(&task10, execID10) + + task20 := task + task20.ID = 20 + task20.Concurrency = 8 + execID20, ok := sm.canReserve(&task20) + require.Equal(t, "", execID20) + require.True(t, ok) + sm.reserve(&task20, execID20) + + task30 := task + task30.ID = 30 + task30.Concurrency = 8 + execID30, ok := sm.canReserve(&task30) + require.Equal(t, "", execID30) + require.False(t, ok) + require.Len(t, sm.reservedStripes, 2) + require.Equal(t, 4, sm.reservedStripes[0].stripes) + require.Equal(t, 8, sm.reservedStripes[1].stripes) + require.Equal(t, map[int64]int{10: 0, 20: 1}, sm.task2Index) + require.Empty(t, sm.reservedSlots) + // higher priority task can preempt lower priority task + task9 := task + task9.ID = 9 + task9.Concurrency = 16 + _, ok = sm.canReserve(&task9) + require.True(t, ok) + // 4 slots are reserved for high priority tasks, so cannot reserve. + task11 := task + task11.ID = 11 + _, ok = sm.canReserve(&task11) + require.False(t, ok) + // lower concurrency + task11.Concurrency = 12 + _, ok = sm.canReserve(&task11) + require.True(t, ok) + + // reserve by slots + sm.usedSlots.Store(&map[string]int{ + "tidb-1": 12, + "tidb-2": 8, + }) + task40 := task + task40.ID = 40 + task40.Concurrency = 16 + execID40, ok := sm.canReserve(&task40) + require.Equal(t, "", execID40) + require.False(t, ok) + task40.Concurrency = 8 + execID40, ok = sm.canReserve(&task40) + require.Equal(t, "tidb-2", execID40) + require.True(t, ok) + sm.reserve(&task40, execID40) + require.Len(t, sm.reservedStripes, 3) + require.Equal(t, 4, sm.reservedStripes[0].stripes) + require.Equal(t, 8, sm.reservedStripes[1].stripes) + require.Equal(t, 8, sm.reservedStripes[2].stripes) + require.Equal(t, map[int64]int{10: 0, 20: 1, 40: 2}, sm.task2Index) + require.Equal(t, map[string]int{"tidb-2": 8}, sm.reservedSlots) + // higher priority task stop task 15 to run + task15 := task + task15.ID = 15 + task15.Concurrency = 16 + execID15, ok := sm.canReserve(&task15) + require.Equal(t, "", execID15) + require.False(t, ok) + // finish task of id 10 + sm.unReserve(&task10, execID10) + require.Len(t, sm.reservedStripes, 2) + require.Equal(t, 8, sm.reservedStripes[0].stripes) + require.Equal(t, 8, sm.reservedStripes[1].stripes) + require.Equal(t, map[int64]int{20: 0, 40: 1}, sm.task2Index) + require.Equal(t, map[string]int{"tidb-2": 8}, sm.reservedSlots) + // now task 15 can run + execID15, ok = sm.canReserve(&task15) + require.Equal(t, "", execID15) + require.True(t, ok) + sm.reserve(&task15, execID15) + require.Len(t, sm.reservedStripes, 3) + require.Equal(t, 16, sm.reservedStripes[0].stripes) + require.Equal(t, 8, sm.reservedStripes[1].stripes) + require.Equal(t, 8, sm.reservedStripes[2].stripes) + require.Equal(t, map[int64]int{15: 0, 20: 1, 40: 2}, sm.task2Index) + require.Equal(t, map[string]int{"tidb-2": 8}, sm.reservedSlots) + // task 50 cannot run + task50 := task + task50.ID = 50 + task50.Concurrency = 8 + _, ok = sm.canReserve(&task50) + require.False(t, ok) + // finish task 40 + sm.unReserve(&task40, execID40) + require.Len(t, sm.reservedStripes, 2) + require.Equal(t, 16, sm.reservedStripes[0].stripes) + require.Equal(t, 8, sm.reservedStripes[1].stripes) + require.Equal(t, map[int64]int{15: 0, 20: 1}, sm.task2Index) + require.Empty(t, sm.reservedSlots) + // now task 50 can run + execID50, ok := sm.canReserve(&task50) + require.Equal(t, "tidb-2", execID50) + require.True(t, ok) + sm.reserve(&task50, execID50) + // task 60 can run too + task60 := task + task60.ID = 60 + task60.Concurrency = 4 + execID60, ok := sm.canReserve(&task60) + require.Equal(t, "tidb-1", execID60) + require.True(t, ok) + sm.reserve(&task60, execID60) + require.Len(t, sm.reservedStripes, 4) + require.Equal(t, 16, sm.reservedStripes[0].stripes) + require.Equal(t, 8, sm.reservedStripes[1].stripes) + require.Equal(t, 8, sm.reservedStripes[2].stripes) + require.Equal(t, 4, sm.reservedStripes[3].stripes) + require.Equal(t, map[int64]int{15: 0, 20: 1, 50: 2, 60: 3}, sm.task2Index) + require.Equal(t, map[string]int{"tidb-1": 4, "tidb-2": 8}, sm.reservedSlots) + + // un-reserve all tasks + sm.unReserve(&task15, execID15) + sm.unReserve(&task20, execID20) + sm.unReserve(&task50, execID50) + sm.unReserve(&task60, execID60) + require.Empty(t, sm.reservedStripes) + require.Empty(t, sm.task2Index) + require.Empty(t, sm.reservedSlots) +} + +func TestSlotManagerUpdate(t *testing.T) { + ctrl := gomock.NewController(t) + defer ctrl.Finish() + ctx := context.Background() + + nodeMgr := newNodeManager() + taskMgr := mock.NewMockTaskManager(ctrl) + nodeMgr.managedNodes.Store(&[]string{"tidb-1", "tidb-2", "tidb-3"}) + taskMgr.EXPECT().GetUsedSlotsOnNodes(gomock.Any()).Return(map[string]int{ + "tidb-1": 12, + "tidb-2": 8, + }, nil) + sm := newSlotManager() + sm.updateCapacity(16) + require.Empty(t, sm.usedSlots.Load()) + require.Empty(t, sm.reservedSlots) + require.NoError(t, sm.update(ctx, nodeMgr, taskMgr)) + require.Empty(t, sm.reservedSlots) + require.Equal(t, map[string]int{ + "tidb-1": 12, + "tidb-2": 8, + "tidb-3": 0, + }, *sm.usedSlots.Load()) + require.True(t, ctrl.Satisfied()) + + // some node scaled in, should be reflected + nodeMgr.managedNodes.Store(&[]string{"tidb-1"}) + taskMgr.EXPECT().GetUsedSlotsOnNodes(gomock.Any()).Return(map[string]int{ + "tidb-1": 12, + "tidb-2": 8, + }, nil) + require.NoError(t, sm.update(ctx, nodeMgr, taskMgr)) + require.Empty(t, sm.reservedSlots) + require.Equal(t, map[string]int{ + "tidb-1": 12, + }, *sm.usedSlots.Load()) + require.True(t, ctrl.Satisfied()) + // on error, the usedSlots should not be changed + taskMgr.EXPECT().GetUsedSlotsOnNodes(gomock.Any()).Return(nil, errors.New("mock err")) + require.ErrorContains(t, sm.update(ctx, nodeMgr, taskMgr), "mock err") + require.Empty(t, sm.reservedSlots) + require.Equal(t, map[string]int{ + "tidb-1": 12, + }, *sm.usedSlots.Load()) +} + +func TestSchedulerAdjustEligibleNodes(t *testing.T) { + slotMgr := newSlotManager() + slotMgr.updateCapacity(16) + + allNodes := []string{":4000", ":4001", ":4002"} + require.Equal(t, allNodes, slotMgr.adjustEligibleNodes(allNodes, 10)) + + usedSlots := map[string]int{ + ":4000": 12, + ":4001": 4, + ":4003": 0, // stale node + } + slotMgr.usedSlots.Store(&usedSlots) + require.Equal(t, []string{":4001"}, slotMgr.adjustEligibleNodes(allNodes, 10)) +} + +func TestSlotManagerUpdateCapacity(t *testing.T) { + sm := newSlotManager() + sm.updateCapacity(16) + require.Equal(t, 16, int(sm.capacity.Load())) + sm.updateCapacity(32) + require.Equal(t, 32, int(sm.capacity.Load())) + sm.updateCapacity(0) + require.Equal(t, 32, int(sm.capacity.Load())) +} diff --git a/pkg/disttask/framework/dispatcher/state_transform.go b/pkg/disttask/framework/scheduler/state_transform.go similarity index 91% rename from pkg/disttask/framework/dispatcher/state_transform.go rename to pkg/disttask/framework/scheduler/state_transform.go index 0c7ae1bca2847..1faaea344d396 100644 --- a/pkg/disttask/framework/dispatcher/state_transform.go +++ b/pkg/disttask/framework/scheduler/state_transform.go @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -package dispatcher +package scheduler import ( "github.com/pingcap/tidb/pkg/disttask/framework/proto" @@ -45,10 +45,7 @@ func VerifyTaskStateTransform(from, to proto.TaskState) bool { proto.TaskStateRevertFailed: {}, proto.TaskStateCancelling: { proto.TaskStateReverting, - // no canceled now - // proto.TaskStateCanceled, }, - proto.TaskStateCanceled: {}, proto.TaskStatePausing: { proto.TaskStatePaused, }, @@ -58,8 +55,7 @@ func VerifyTaskStateTransform(from, to proto.TaskState) bool { proto.TaskStateResuming: { proto.TaskStateRunning, }, - proto.TaskStateRevertPending: {}, - proto.TaskStateReverted: {}, + proto.TaskStateReverted: {}, } if from == to { diff --git a/pkg/disttask/framework/storage/BUILD.bazel b/pkg/disttask/framework/storage/BUILD.bazel index 5486695a078a4..d68d574ff4c97 100644 --- a/pkg/disttask/framework/storage/BUILD.bazel +++ b/pkg/disttask/framework/storage/BUILD.bazel @@ -3,21 +3,27 @@ load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") go_library( name = "storage", srcs = [ + "converter.go", + "history.go", + "nodes.go", + "subtask_state.go", + "task_state.go", "task_table.go", - "util.go", ], importpath = "github.com/pingcap/tidb/pkg/disttask/framework/storage", visibility = ["//visibility:public"], deps = [ "//pkg/disttask/framework/proto", "//pkg/kv", - "//pkg/parser/terror", "//pkg/sessionctx", + "//pkg/sessionctx/variable", "//pkg/util/chunk", + "//pkg/util/cpu", "//pkg/util/intest", "//pkg/util/logutil", "//pkg/util/sqlescape", "//pkg/util/sqlexec", + "@com_github_docker_go_units//:go-units", "@com_github_ngaut_pools//:pools", "@com_github_pingcap_errors//:errors", "@com_github_pingcap_failpoint//:failpoint", @@ -29,15 +35,25 @@ go_library( go_test( name = "storage_test", timeout = "short", - srcs = ["table_test.go"], + srcs = [ + "table_test.go", + "task_state_test.go", + "task_table_test.go", + ], + embed = [":storage"], flaky = True, race = "on", - shard_count = 8, + shard_count = 21, deps = [ - ":storage", + "//pkg/config", "//pkg/disttask/framework/proto", + "//pkg/disttask/framework/testutil", + "//pkg/kv", + "//pkg/sessionctx", + "//pkg/sessionctx/variable", "//pkg/testkit", "//pkg/testkit/testsetup", + "//pkg/util/sqlexec", "@com_github_ngaut_pools//:pools", "@com_github_pingcap_errors//:errors", "@com_github_pingcap_failpoint//:failpoint", diff --git a/pkg/disttask/framework/storage/converter.go b/pkg/disttask/framework/storage/converter.go new file mode 100644 index 0000000000000..4f43f27401be5 --- /dev/null +++ b/pkg/disttask/framework/storage/converter.go @@ -0,0 +1,115 @@ +// Copyright 2024 PingCAP, 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. + +package storage + +import ( + "strconv" + "time" + + "github.com/pingcap/errors" + "github.com/pingcap/tidb/pkg/disttask/framework/proto" + "github.com/pingcap/tidb/pkg/util/chunk" + "github.com/pingcap/tidb/pkg/util/logutil" + "go.uber.org/zap" +) + +func row2TaskBasic(r chunk.Row) *proto.Task { + task := &proto.Task{ + ID: r.GetInt64(0), + Key: r.GetString(1), + Type: proto.TaskType(r.GetString(2)), + State: proto.TaskState(r.GetString(3)), + Step: proto.Step(r.GetInt64(4)), + Priority: int(r.GetInt64(5)), + Concurrency: int(r.GetInt64(6)), + } + task.CreateTime, _ = r.GetTime(7).GoTime(time.Local) + return task +} + +// Row2Task converts a row to a task. +func Row2Task(r chunk.Row) *proto.Task { + task := row2TaskBasic(r) + var startTime, updateTime time.Time + if !r.IsNull(8) { + startTime, _ = r.GetTime(8).GoTime(time.Local) + } + if !r.IsNull(9) { + updateTime, _ = r.GetTime(9).GoTime(time.Local) + } + task.StartTime = startTime + task.StateUpdateTime = updateTime + task.Meta = r.GetBytes(10) + task.SchedulerID = r.GetString(11) + if !r.IsNull(12) { + errBytes := r.GetBytes(12) + stdErr := errors.Normalize("") + err := stdErr.UnmarshalJSON(errBytes) + if err != nil { + logutil.BgLogger().Error("unmarshal task error", zap.Error(err)) + task.Error = errors.New(string(errBytes)) + } else { + task.Error = stdErr + } + } + return task +} + +// row2BasicSubTask converts a row to a subtask with basic info +func row2BasicSubTask(r chunk.Row) *proto.Subtask { + taskIDStr := r.GetString(2) + tid, err := strconv.Atoi(taskIDStr) + if err != nil { + logutil.BgLogger().Warn("unexpected subtask id", zap.String("subtask-id", taskIDStr)) + } + createTime, _ := r.GetTime(7).GoTime(time.Local) + var ordinal int + if !r.IsNull(8) { + ordinal = int(r.GetInt64(8)) + } + subtask := &proto.Subtask{ + ID: r.GetInt64(0), + Step: proto.Step(r.GetInt64(1)), + TaskID: int64(tid), + Type: proto.Int2Type(int(r.GetInt64(3))), + ExecID: r.GetString(4), + State: proto.SubtaskState(r.GetString(5)), + Concurrency: int(r.GetInt64(6)), + CreateTime: createTime, + Ordinal: ordinal, + } + return subtask +} + +// Row2SubTask converts a row to a subtask. +func Row2SubTask(r chunk.Row) *proto.Subtask { + subtask := row2BasicSubTask(r) + // subtask defines start/update time as bigint, to ensure backward compatible, + // we keep it that way, and we convert it here. + var startTime, updateTime time.Time + if !r.IsNull(9) { + ts := r.GetInt64(9) + startTime = time.Unix(ts, 0) + } + if !r.IsNull(10) { + ts := r.GetInt64(10) + updateTime = time.Unix(ts, 0) + } + subtask.StartTime = startTime + subtask.UpdateTime = updateTime + subtask.Meta = r.GetBytes(11) + subtask.Summary = r.GetJSON(12).String() + return subtask +} diff --git a/pkg/disttask/framework/storage/history.go b/pkg/disttask/framework/storage/history.go new file mode 100644 index 0000000000000..75f4e8d0669d4 --- /dev/null +++ b/pkg/disttask/framework/storage/history.go @@ -0,0 +1,94 @@ +// Copyright 2024 PingCAP, 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. + +package storage + +import ( + "context" + "fmt" + "strings" + + "github.com/pingcap/failpoint" + "github.com/pingcap/tidb/pkg/disttask/framework/proto" + "github.com/pingcap/tidb/pkg/sessionctx" + "github.com/pingcap/tidb/pkg/util/sqlexec" +) + +// TransferSubtasks2HistoryWithSession transfer the selected subtasks into tidb_background_subtask_history table by taskID. +func (*TaskManager) TransferSubtasks2HistoryWithSession(ctx context.Context, se sessionctx.Context, taskID int64) error { + _, err := sqlexec.ExecSQL(ctx, se, `insert into mysql.tidb_background_subtask_history select * from mysql.tidb_background_subtask where task_key = %?`, taskID) + if err != nil { + return err + } + // delete taskID subtask + _, err = sqlexec.ExecSQL(ctx, se, "delete from mysql.tidb_background_subtask where task_key = %?", taskID) + return err +} + +// TransferTasks2History transfer the selected tasks into tidb_global_task_history table by taskIDs. +func (mgr *TaskManager) TransferTasks2History(ctx context.Context, tasks []*proto.Task) error { + if len(tasks) == 0 { + return nil + } + taskIDStrs := make([]string, 0, len(tasks)) + for _, task := range tasks { + taskIDStrs = append(taskIDStrs, fmt.Sprintf("%d", task.ID)) + } + return mgr.WithNewTxn(ctx, func(se sessionctx.Context) error { + // sensitive data in meta might be redacted, need update first. + for _, t := range tasks { + _, err := sqlexec.ExecSQL(ctx, se, ` + update mysql.tidb_global_task + set meta= %?, state_update_time = CURRENT_TIMESTAMP() + where id = %?`, t.Meta, t.ID) + if err != nil { + return err + } + } + _, err := sqlexec.ExecSQL(ctx, se, ` + insert into mysql.tidb_global_task_history + select * from mysql.tidb_global_task + where id in(`+strings.Join(taskIDStrs, `, `)+`)`) + if err != nil { + return err + } + + _, err = sqlexec.ExecSQL(ctx, se, ` + delete from mysql.tidb_global_task + where id in(`+strings.Join(taskIDStrs, `, `)+`)`) + + for _, t := range tasks { + err = mgr.TransferSubtasks2HistoryWithSession(ctx, se, t.ID) + if err != nil { + return err + } + } + return err + }) +} + +// GCSubtasks deletes the history subtask which is older than the given days. +func (mgr *TaskManager) GCSubtasks(ctx context.Context) error { + subtaskHistoryKeepSeconds := defaultSubtaskKeepDays * 24 * 60 * 60 + failpoint.Inject("subtaskHistoryKeepSeconds", func(val failpoint.Value) { + if val, ok := val.(int); ok { + subtaskHistoryKeepSeconds = val + } + }) + _, err := mgr.ExecuteSQLWithNewSession( + ctx, + fmt.Sprintf("DELETE FROM mysql.tidb_background_subtask_history WHERE state_update_time < UNIX_TIMESTAMP() - %d ;", subtaskHistoryKeepSeconds), + ) + return err +} diff --git a/pkg/disttask/framework/storage/nodes.go b/pkg/disttask/framework/storage/nodes.go new file mode 100644 index 0000000000000..a4b4eda4157f8 --- /dev/null +++ b/pkg/disttask/framework/storage/nodes.go @@ -0,0 +1,203 @@ +// Copyright 2024 PingCAP, 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. + +package storage + +import ( + "context" + "fmt" + "strings" + + "github.com/pingcap/errors" + "github.com/pingcap/tidb/pkg/disttask/framework/proto" + "github.com/pingcap/tidb/pkg/sessionctx" + "github.com/pingcap/tidb/pkg/util/cpu" + "github.com/pingcap/tidb/pkg/util/sqlescape" + "github.com/pingcap/tidb/pkg/util/sqlexec" +) + +// InitMeta insert the manager information into dist_framework_meta. +func (mgr *TaskManager) InitMeta(ctx context.Context, tidbID string, role string) error { + return mgr.WithNewSession(func(se sessionctx.Context) error { + return mgr.InitMetaSession(ctx, se, tidbID, role) + }) +} + +// InitMetaSession insert the manager information into dist_framework_meta. +// if the record exists, update the cpu_count and role. +func (*TaskManager) InitMetaSession(ctx context.Context, se sessionctx.Context, execID string, role string) error { + cpuCount := cpu.GetCPUCount() + _, err := sqlexec.ExecSQL(ctx, se, ` + insert into mysql.dist_framework_meta(host, role, cpu_count, keyspace_id) + values (%?, %?, %?, -1) + on duplicate key + update cpu_count = %?, role = %?`, + execID, role, cpuCount, cpuCount, role) + return err +} + +// RecoverMeta insert the manager information into dist_framework_meta. +// if the record exists, update the cpu_count. +// Don't update role for we only update it in `set global tidb_service_scope`. +// if not there might has a data race. +func (mgr *TaskManager) RecoverMeta(ctx context.Context, execID string, role string) error { + cpuCount := cpu.GetCPUCount() + _, err := mgr.ExecuteSQLWithNewSession(ctx, ` + insert into mysql.dist_framework_meta(host, role, cpu_count, keyspace_id) + values (%?, %?, %?, -1) + on duplicate key + update cpu_count = %?`, + execID, role, cpuCount, cpuCount) + return err +} + +// DeleteDeadNodes deletes the dead nodes from mysql.dist_framework_meta. +func (mgr *TaskManager) DeleteDeadNodes(ctx context.Context, nodes []string) error { + if len(nodes) == 0 { + return nil + } + return mgr.WithNewTxn(ctx, func(se sessionctx.Context) error { + deleteSQL := new(strings.Builder) + if err := sqlescape.FormatSQL(deleteSQL, "delete from mysql.dist_framework_meta where host in("); err != nil { + return err + } + deleteElems := make([]string, 0, len(nodes)) + for _, node := range nodes { + deleteElems = append(deleteElems, fmt.Sprintf(`"%s"`, node)) + } + + deleteSQL.WriteString(strings.Join(deleteElems, ", ")) + deleteSQL.WriteString(")") + _, err := sqlexec.ExecSQL(ctx, se, deleteSQL.String()) + return err + }) +} + +// GetManagedNodes implements scheduler.TaskManager interface. +func (mgr *TaskManager) GetManagedNodes(ctx context.Context) ([]proto.ManagedNode, error) { + var nodes []proto.ManagedNode + err := mgr.WithNewSession(func(se sessionctx.Context) error { + var err2 error + nodes, err2 = mgr.getManagedNodesWithSession(ctx, se) + return err2 + }) + return nodes, err +} + +func (mgr *TaskManager) getManagedNodesWithSession(ctx context.Context, se sessionctx.Context) ([]proto.ManagedNode, error) { + nodes, err := mgr.getAllNodesWithSession(ctx, se) + if err != nil { + return nil, err + } + nodeMap := make(map[string][]proto.ManagedNode, 2) + for _, node := range nodes { + nodeMap[node.Role] = append(nodeMap[node.Role], node) + } + if len(nodeMap["background"]) == 0 { + return nodeMap[""], nil + } + return nodeMap["background"], nil +} + +// GetAllNodes gets nodes in dist_framework_meta. +func (mgr *TaskManager) GetAllNodes(ctx context.Context) ([]proto.ManagedNode, error) { + var nodes []proto.ManagedNode + err := mgr.WithNewSession(func(se sessionctx.Context) error { + var err2 error + nodes, err2 = mgr.getAllNodesWithSession(ctx, se) + return err2 + }) + return nodes, err +} + +func (*TaskManager) getAllNodesWithSession(ctx context.Context, se sessionctx.Context) ([]proto.ManagedNode, error) { + rs, err := sqlexec.ExecSQL(ctx, se, ` + select host, role, cpu_count + from mysql.dist_framework_meta + order by host`) + if err != nil { + return nil, err + } + nodes := make([]proto.ManagedNode, 0, len(rs)) + for _, r := range rs { + nodes = append(nodes, proto.ManagedNode{ + ID: r.GetString(0), + Role: r.GetString(1), + CPUCount: int(r.GetInt64(2)), + }) + } + return nodes, nil +} + +// GetUsedSlotsOnNodes implements the scheduler.TaskManager interface. +func (mgr *TaskManager) GetUsedSlotsOnNodes(ctx context.Context) (map[string]int, error) { + // concurrency of subtasks of some step is the same, we use max(concurrency) + // to make group by works. + rs, err := mgr.ExecuteSQLWithNewSession(ctx, ` + select + exec_id, sum(concurrency) + from ( + select exec_id, task_key, max(concurrency) concurrency + from mysql.tidb_background_subtask + where state in (%?, %?) + group by exec_id, task_key + ) a + group by exec_id`, + proto.SubtaskStatePending, proto.SubtaskStateRunning, + ) + if err != nil { + return nil, err + } + + slots := make(map[string]int, len(rs)) + for _, r := range rs { + val, _ := r.GetMyDecimal(1).ToInt() + slots[r.GetString(0)] = int(val) + } + return slots, nil +} + +// GetCPUCountOfManagedNode gets the cpu count of managed node. +func (mgr *TaskManager) GetCPUCountOfManagedNode(ctx context.Context) (int, error) { + var cnt int + err := mgr.WithNewSession(func(se sessionctx.Context) error { + var err2 error + cnt, err2 = mgr.getCPUCountOfManagedNode(ctx, se) + return err2 + }) + return cnt, err +} + +// getCPUCountOfManagedNode gets the cpu count of managed node. +// returns error when there's no managed node or no node has valid cpu count. +func (mgr *TaskManager) getCPUCountOfManagedNode(ctx context.Context, se sessionctx.Context) (int, error) { + nodes, err := mgr.getManagedNodesWithSession(ctx, se) + if err != nil { + return 0, err + } + if len(nodes) == 0 { + return 0, errors.New("no managed nodes") + } + var cpuCount int + for _, n := range nodes { + if n.CPUCount > 0 { + cpuCount = n.CPUCount + break + } + } + if cpuCount == 0 { + return 0, errors.New("no managed node have enough resource for dist task") + } + return cpuCount, nil +} diff --git a/pkg/disttask/framework/storage/subtask_state.go b/pkg/disttask/framework/storage/subtask_state.go new file mode 100644 index 0000000000000..d3cd853fe551f --- /dev/null +++ b/pkg/disttask/framework/storage/subtask_state.go @@ -0,0 +1,147 @@ +// Copyright 2024 PingCAP, 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. + +package storage + +import ( + "context" + + "github.com/pingcap/tidb/pkg/disttask/framework/proto" + "github.com/pingcap/tidb/pkg/sessionctx" + "github.com/pingcap/tidb/pkg/util/sqlexec" +) + +// StartSubtask updates the subtask state to running. +func (mgr *TaskManager) StartSubtask(ctx context.Context, subtaskID int64, execID string) error { + err := mgr.WithNewTxn(ctx, func(se sessionctx.Context) error { + vars := se.GetSessionVars() + _, err := sqlexec.ExecSQL(ctx, + se, + `update mysql.tidb_background_subtask + set state = %?, start_time = unix_timestamp(), state_update_time = unix_timestamp() + where id = %? and exec_id = %?`, + proto.SubtaskStateRunning, + subtaskID, + execID) + if err != nil { + return err + } + if vars.StmtCtx.AffectedRows() == 0 { + return ErrSubtaskNotFound + } + return nil + }) + return err +} + +// FinishSubtask updates the subtask meta and mark state to succeed. +func (mgr *TaskManager) FinishSubtask(ctx context.Context, execID string, id int64, meta []byte) error { + _, err := mgr.ExecuteSQLWithNewSession(ctx, `update mysql.tidb_background_subtask + set meta = %?, state = %?, state_update_time = unix_timestamp(), end_time = CURRENT_TIMESTAMP() + where id = %? and exec_id = %?`, + meta, proto.SubtaskStateSucceed, id, execID) + return err +} + +// FailSubtask update the task's subtask state to failed and set the err. +func (mgr *TaskManager) FailSubtask(ctx context.Context, execID string, taskID int64, err error) error { + if err == nil { + return nil + } + _, err1 := mgr.ExecuteSQLWithNewSession(ctx, + `update mysql.tidb_background_subtask + set state = %?, + error = %?, + start_time = unix_timestamp(), + state_update_time = unix_timestamp(), + end_time = CURRENT_TIMESTAMP() + where exec_id = %? and + task_key = %? and + state in (%?, %?) + limit 1;`, + proto.SubtaskStateFailed, + serializeErr(err), + execID, + taskID, + proto.SubtaskStatePending, + proto.SubtaskStateRunning) + return err1 +} + +// CancelSubtask update the task's subtasks' state to canceled. +func (mgr *TaskManager) CancelSubtask(ctx context.Context, execID string, taskID int64) error { + _, err1 := mgr.ExecuteSQLWithNewSession(ctx, + `update mysql.tidb_background_subtask + set state = %?, + start_time = unix_timestamp(), + state_update_time = unix_timestamp(), + end_time = CURRENT_TIMESTAMP() + where exec_id = %? and + task_key = %? and + state in (%?, %?) + limit 1;`, + proto.SubtaskStateCanceled, + execID, + taskID, + proto.SubtaskStatePending, + proto.SubtaskStateRunning) + return err1 +} + +// PauseSubtasks update all running/pending subtasks to pasued state. +func (mgr *TaskManager) PauseSubtasks(ctx context.Context, execID string, taskID int64) error { + _, err := mgr.ExecuteSQLWithNewSession(ctx, + `update mysql.tidb_background_subtask set state = "paused" where task_key = %? and state in ("running", "pending") and exec_id = %?`, taskID, execID) + return err +} + +// ResumeSubtasks update all paused subtasks to pending state. +func (mgr *TaskManager) ResumeSubtasks(ctx context.Context, taskID int64) error { + _, err := mgr.ExecuteSQLWithNewSession(ctx, + `update mysql.tidb_background_subtask set state = "pending", error = null where task_key = %? and state = "paused"`, taskID) + return err +} + +// RunningSubtasksBack2Pending implements the taskexecutor.TaskTable interface. +func (mgr *TaskManager) RunningSubtasksBack2Pending(ctx context.Context, subtasks []*proto.Subtask) error { + // skip the update process. + if len(subtasks) == 0 { + return nil + } + err := mgr.WithNewTxn(ctx, func(se sessionctx.Context) error { + for _, subtask := range subtasks { + _, err := sqlexec.ExecSQL(ctx, se, ` + update mysql.tidb_background_subtask + set state = %?, state_update_time = CURRENT_TIMESTAMP() + where id = %? and exec_id = %? and state = %?`, + proto.SubtaskStatePending, subtask.ID, subtask.ExecID, proto.SubtaskStateRunning) + if err != nil { + return err + } + } + return nil + }) + return err +} + +// UpdateSubtaskStateAndError updates the subtask state. +func (mgr *TaskManager) UpdateSubtaskStateAndError( + ctx context.Context, + execID string, + id int64, state proto.SubtaskState, subTaskErr error) error { + _, err := mgr.ExecuteSQLWithNewSession(ctx, `update mysql.tidb_background_subtask + set state = %?, error = %?, state_update_time = unix_timestamp() where id = %? and exec_id = %?`, + state, serializeErr(subTaskErr), id, execID) + return err +} diff --git a/pkg/disttask/framework/storage/table_test.go b/pkg/disttask/framework/storage/table_test.go index c008cbab8848b..5e0050048f700 100644 --- a/pkg/disttask/framework/storage/table_test.go +++ b/pkg/disttask/framework/storage/table_test.go @@ -16,6 +16,9 @@ package storage_test import ( "context" + "fmt" + "slices" + "sort" "testing" "time" @@ -24,33 +27,16 @@ import ( "github.com/pingcap/failpoint" "github.com/pingcap/tidb/pkg/disttask/framework/proto" "github.com/pingcap/tidb/pkg/disttask/framework/storage" + "github.com/pingcap/tidb/pkg/disttask/framework/testutil" + "github.com/pingcap/tidb/pkg/kv" + "github.com/pingcap/tidb/pkg/sessionctx" + "github.com/pingcap/tidb/pkg/sessionctx/variable" "github.com/pingcap/tidb/pkg/testkit" - "github.com/pingcap/tidb/pkg/testkit/testsetup" + "github.com/pingcap/tidb/pkg/util/sqlexec" "github.com/stretchr/testify/require" "github.com/tikv/client-go/v2/util" - "go.uber.org/goleak" ) -func TestMain(m *testing.M) { - testsetup.SetupForCommonTest() - opts := []goleak.Option{ - goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), - goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), - goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), - } - goleak.VerifyTestMain(m, opts...) -} - -func GetResourcePool(t *testing.T) *pools.ResourcePool { - store := testkit.CreateMockStore(t) - - tk := testkit.NewTestKit(t, store) - pool := pools.NewResourcePool(func() (pools.Resource, error) { - return tk.Session(), nil - }, 1, 1, time.Second) - return pool -} - func GetTaskManager(t *testing.T, pool *pools.ResourcePool) *storage.TaskManager { manager := storage.NewTaskManager(pool) storage.SetTaskManager(manager) @@ -59,36 +45,49 @@ func GetTaskManager(t *testing.T, pool *pools.ResourcePool) *storage.TaskManager return manager } -func TestGlobalTaskTable(t *testing.T) { - pool := GetResourcePool(t) - gm := GetTaskManager(t, pool) - defer pool.Close() - ctx := context.Background() - ctx = util.WithInternalSourceType(ctx, "table_test") +func checkTaskStateStep(t *testing.T, task *proto.Task, state proto.TaskState, step proto.Step) { + require.Equal(t, state, task.State) + require.Equal(t, step, task.Step) +} + +func TestTaskTable(t *testing.T) { + _, gm, ctx := testutil.InitTableTest(t) - id, err := gm.AddNewGlobalTask(ctx, "key1", "test", 4, []byte("test")) + require.NoError(t, gm.InitMeta(ctx, ":4000", "")) + + _, err := gm.CreateTask(ctx, "key1", "test", 999, []byte("test")) + require.ErrorContains(t, err, "task concurrency(999) larger than cpu count") + + timeBeforeCreate := time.Unix(time.Now().Unix(), 0) + id, err := gm.CreateTask(ctx, "key1", "test", 4, []byte("test")) require.NoError(t, err) require.Equal(t, int64(1), id) - task, err := gm.GetNewGlobalTask(ctx) + task, err := testutil.GetOneTask(ctx, gm) require.NoError(t, err) require.Equal(t, int64(1), task.ID) require.Equal(t, "key1", task.Key) require.Equal(t, proto.TaskType("test"), task.Type) require.Equal(t, proto.TaskStatePending, task.State) - require.Equal(t, uint64(4), task.Concurrency) + require.Equal(t, proto.NormalPriority, task.Priority) + require.Equal(t, 4, task.Concurrency) + require.Equal(t, proto.StepInit, task.Step) require.Equal(t, []byte("test"), task.Meta) + require.GreaterOrEqual(t, task.CreateTime, timeBeforeCreate) + require.Zero(t, task.StartTime) + require.Zero(t, task.StateUpdateTime) + require.Nil(t, task.Error) - task2, err := gm.GetGlobalTaskByID(ctx, 1) + task2, err := gm.GetTaskByID(ctx, 1) require.NoError(t, err) require.Equal(t, task, task2) - task3, err := gm.GetGlobalTasksInStates(ctx, proto.TaskStatePending) + task3, err := gm.GetTasksInStates(ctx, proto.TaskStatePending) require.NoError(t, err) require.Len(t, task3, 1) require.Equal(t, task, task3[0]) - task4, err := gm.GetGlobalTasksInStates(ctx, proto.TaskStatePending, proto.TaskStateRunning) + task4, err := gm.GetTasksInStates(ctx, proto.TaskStatePending, proto.TaskStateRunning) require.NoError(t, err) require.Len(t, task4, 1) require.Equal(t, task, task4[0]) @@ -96,222 +95,569 @@ func TestGlobalTaskTable(t *testing.T) { prevState := task.State task.State = proto.TaskStateRunning - retryable, err := gm.UpdateGlobalTaskAndAddSubTasks(ctx, task, nil, prevState) + retryable, err := gm.UpdateTaskAndAddSubTasks(ctx, task, nil, prevState) require.NoError(t, err) - require.Equal(t, true, retryable) + require.True(t, retryable) - task5, err := gm.GetGlobalTasksInStates(ctx, proto.TaskStateRunning) + task5, err := gm.GetTasksInStates(ctx, proto.TaskStateRunning) require.NoError(t, err) require.Len(t, task5, 1) require.Equal(t, task.State, task5[0].State) - task6, err := gm.GetGlobalTaskByKey(ctx, "key1") + task6, err := gm.GetTaskByKey(ctx, "key1") require.NoError(t, err) require.Len(t, task5, 1) require.Equal(t, task.State, task6.State) // test cannot insert task with dup key - _, err = gm.AddNewGlobalTask(ctx, "key1", "test2", 4, []byte("test2")) + _, err = gm.CreateTask(ctx, "key1", "test2", 4, []byte("test2")) require.EqualError(t, err, "[kv:1062]Duplicate entry 'key1' for key 'tidb_global_task.task_key'") - // test cancel global task - id, err = gm.AddNewGlobalTask(ctx, "key2", "test", 4, []byte("test")) + // test cancel task + id, err = gm.CreateTask(ctx, "key2", "test", 4, []byte("test")) require.NoError(t, err) - cancelling, err := gm.IsGlobalTaskCancelling(ctx, id) + cancelling, err := testutil.IsTaskCancelling(ctx, gm, id) require.NoError(t, err) require.False(t, cancelling) - require.NoError(t, gm.CancelGlobalTask(ctx, id)) - cancelling, err = gm.IsGlobalTaskCancelling(ctx, id) + require.NoError(t, gm.CancelTask(ctx, id)) + cancelling, err = testutil.IsTaskCancelling(ctx, gm, id) require.NoError(t, err) require.True(t, cancelling) + + id, err = gm.CreateTask(ctx, "key-fail", "test2", 4, []byte("test2")) + require.NoError(t, err) + // state not right, update nothing + require.NoError(t, gm.FailTask(ctx, id, proto.TaskStateRunning, errors.New("test error"))) + task, err = gm.GetTaskByID(ctx, id) + require.NoError(t, err) + require.Equal(t, proto.TaskStatePending, task.State) + require.Nil(t, task.Error) + curTime := time.Unix(time.Now().Unix(), 0) + require.NoError(t, gm.FailTask(ctx, id, proto.TaskStatePending, errors.New("test error"))) + task, err = gm.GetTaskByID(ctx, id) + require.NoError(t, err) + require.Equal(t, proto.TaskStateFailed, task.State) + require.ErrorContains(t, task.Error, "test error") + endTime, err := testutil.GetTaskEndTime(ctx, gm, id) + require.NoError(t, err) + require.LessOrEqual(t, endTime.Sub(curTime), time.Since(curTime)) + require.GreaterOrEqual(t, endTime, curTime) + + // succeed a pending task, no effect + id, err = gm.CreateTask(ctx, "key-success", "test", 4, []byte("test")) + require.NoError(t, err) + require.NoError(t, gm.SucceedTask(ctx, id)) + task, err = gm.GetTaskByID(ctx, id) + require.NoError(t, err) + checkTaskStateStep(t, task, proto.TaskStatePending, proto.StepInit) + // succeed a running task + require.NoError(t, gm.SwitchTaskStep(ctx, task, proto.TaskStateRunning, proto.StepOne, nil)) + task, err = gm.GetTaskByID(ctx, id) + require.NoError(t, err) + checkTaskStateStep(t, task, proto.TaskStateRunning, proto.StepOne) + startTime := time.Unix(time.Now().Unix(), 0) + require.NoError(t, gm.SucceedTask(ctx, id)) + task, err = gm.GetTaskByID(ctx, id) + require.NoError(t, err) + checkTaskStateStep(t, task, proto.TaskStateSucceed, proto.StepDone) + require.GreaterOrEqual(t, task.StateUpdateTime, startTime) + + // reverted a pending task, no effect + id, err = gm.CreateTask(ctx, "key-reverted", "test", 4, []byte("test")) + require.NoError(t, err) + require.NoError(t, gm.RevertedTask(ctx, id)) + task, err = gm.GetTaskByID(ctx, id) + require.NoError(t, err) + checkTaskStateStep(t, task, proto.TaskStatePending, proto.StepInit) + // reverted a reverting task + task.State = proto.TaskStateReverting + _, err = gm.UpdateTaskAndAddSubTasks(ctx, task, nil, proto.TaskStatePending) + require.NoError(t, err) + task, err = gm.GetTaskByID(ctx, id) + require.NoError(t, err) + require.Equal(t, proto.TaskStateReverting, task.State) + require.NoError(t, gm.RevertedTask(ctx, task.ID)) + task, err = gm.GetTaskByID(ctx, id) + require.NoError(t, err) + require.Equal(t, proto.TaskStateReverted, task.State) + // paused + + id, err = gm.CreateTask(ctx, "key-paused", "test", 4, []byte("test")) + require.NoError(t, err) + require.NoError(t, gm.PausedTask(ctx, id)) + task, err = gm.GetTaskByID(ctx, id) + require.NoError(t, err) + checkTaskStateStep(t, task, proto.TaskStatePending, proto.StepInit) + // reverted a reverting task + task.State = proto.TaskStatePausing + _, err = gm.UpdateTaskAndAddSubTasks(ctx, task, nil, proto.TaskStatePending) + require.NoError(t, err) + task, err = gm.GetTaskByID(ctx, id) + require.NoError(t, err) + require.Equal(t, proto.TaskStatePausing, task.State) + require.NoError(t, gm.PausedTask(ctx, task.ID)) + task, err = gm.GetTaskByID(ctx, id) + require.NoError(t, err) + require.Equal(t, proto.TaskStatePaused, task.State) } -func TestSubTaskTable(t *testing.T) { - pool := GetResourcePool(t) - sm := GetTaskManager(t, pool) - defer pool.Close() +func checkAfterSwitchStep(t *testing.T, startTime time.Time, task *proto.Task, subtasks []*proto.Subtask, step proto.Step) { + tm, err := storage.GetTaskManager() + require.NoError(t, err) ctx := context.Background() ctx = util.WithInternalSourceType(ctx, "table_test") - err := sm.AddNewSubTask(ctx, 1, proto.StepInit, "tidb1", []byte("test"), proto.TaskTypeExample, false) + checkTaskStateStep(t, task, proto.TaskStateRunning, step) + require.GreaterOrEqual(t, task.StartTime, startTime) + require.GreaterOrEqual(t, task.StateUpdateTime, startTime) + gotSubtasks, err := tm.GetAllSubtasksByStepAndState(ctx, task.ID, task.Step, proto.SubtaskStatePending) + require.NoError(t, err) + require.Len(t, gotSubtasks, len(subtasks)) + sort.Slice(gotSubtasks, func(i, j int) bool { + return gotSubtasks[i].Ordinal < gotSubtasks[j].Ordinal + }) + for i := 0; i < len(gotSubtasks); i++ { + subtask := gotSubtasks[i] + require.Equal(t, []byte(fmt.Sprintf("%d", i)), subtask.Meta) + require.Equal(t, i+1, subtask.Ordinal) + require.Equal(t, 11, subtask.Concurrency) + require.Equal(t, ":4000", subtask.ExecID) + require.Equal(t, proto.TaskTypeExample, subtask.Type) + require.GreaterOrEqual(t, subtask.CreateTime, startTime) + } +} + +func TestSwitchTaskStep(t *testing.T) { + store, tm, ctx := testutil.InitTableTest(t) + tk := testkit.NewTestKit(t, store) + + require.NoError(t, tm.InitMeta(ctx, ":4000", "")) + taskID, err := tm.CreateTask(ctx, "key1", "test", 4, []byte("test")) + require.NoError(t, err) + task, err := tm.GetTaskByID(ctx, taskID) require.NoError(t, err) + checkTaskStateStep(t, task, proto.TaskStatePending, proto.StepInit) + subtasksStepOne := make([]*proto.Subtask, 3) + for i := 0; i < len(subtasksStepOne); i++ { + subtasksStepOne[i] = proto.NewSubtask(proto.StepOne, taskID, proto.TaskTypeExample, + ":4000", 11, []byte(fmt.Sprintf("%d", i)), i+1) + } + startTime := time.Unix(time.Now().Unix(), 0) + task.Meta = []byte("changed meta") + require.NoError(t, tm.SwitchTaskStep(ctx, task, proto.TaskStateRunning, proto.StepOne, subtasksStepOne)) + task, err = tm.GetTaskByID(ctx, taskID) + require.NoError(t, err) + require.Equal(t, []byte("changed meta"), task.Meta) + checkAfterSwitchStep(t, startTime, task, subtasksStepOne, proto.StepOne) + // switch step again, no effect + // some fields are changed in prev call, change back. + task.State = proto.TaskStatePending + task.Step = proto.StepInit + require.NoError(t, tm.SwitchTaskStep(ctx, task, proto.TaskStateRunning, proto.StepOne, subtasksStepOne)) + task, err = tm.GetTaskByID(ctx, taskID) + require.NoError(t, err) + checkAfterSwitchStep(t, startTime, task, subtasksStepOne, proto.StepOne) + // switch step to step two + time.Sleep(time.Second) + taskStartTime := task.StartTime + subtasksStepTwo := make([]*proto.Subtask, 3) + for i := 0; i < len(subtasksStepTwo); i++ { + subtasksStepTwo[i] = proto.NewSubtask(proto.StepTwo, taskID, proto.TaskTypeExample, + ":4000", 11, []byte(fmt.Sprintf("%d", i)), i+1) + } + require.NoError(t, tk.Session().GetSessionVars().SetSystemVar(variable.TiDBMemQuotaQuery, "1024")) + require.NoError(t, tm.SwitchTaskStep(ctx, task, proto.TaskStateRunning, proto.StepTwo, subtasksStepTwo)) + value, ok := tk.Session().GetSessionVars().GetSystemVar(variable.TiDBMemQuotaQuery) + require.True(t, ok) + require.Equal(t, "1024", value) + task, err = tm.GetTaskByID(ctx, taskID) + require.NoError(t, err) + // start time should not change + require.Equal(t, taskStartTime, task.StartTime) + checkAfterSwitchStep(t, startTime, task, subtasksStepTwo, proto.StepTwo) +} + +func TestSwitchTaskStepInBatch(t *testing.T) { + store, tm, ctx := testutil.InitTableTest(t) + tk := testkit.NewTestKit(t, store) + + require.NoError(t, tm.InitMeta(ctx, ":4000", "")) + // normal flow + prepare := func(taskKey string) (*proto.Task, []*proto.Subtask) { + taskID, err := tm.CreateTask(ctx, taskKey, "test", 4, []byte("test")) + require.NoError(t, err) + task, err := tm.GetTaskByID(ctx, taskID) + require.NoError(t, err) + checkTaskStateStep(t, task, proto.TaskStatePending, proto.StepInit) + subtasks := make([]*proto.Subtask, 3) + for i := 0; i < len(subtasks); i++ { + subtasks[i] = proto.NewSubtask(proto.StepOne, taskID, proto.TaskTypeExample, + ":4000", 11, []byte(fmt.Sprintf("%d", i)), i+1) + } + return task, subtasks + } + startTime := time.Unix(time.Now().Unix(), 0) + task1, subtasks1 := prepare("key1") + require.NoError(t, tm.SwitchTaskStepInBatch(ctx, task1, proto.TaskStateRunning, proto.StepOne, subtasks1)) + task1, err := tm.GetTaskByID(ctx, task1.ID) + require.NoError(t, err) + checkAfterSwitchStep(t, startTime, task1, subtasks1, proto.StepOne) + + // mock another dispatcher inserted some subtasks + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/disttask/framework/storage/waitBeforeInsertSubtasks", `1*return(true)`)) + t.Cleanup(func() { + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/disttask/framework/storage/waitBeforeInsertSubtasks")) + }) + task2, subtasks2 := prepare("key2") + go func() { + storage.TestChannel <- struct{}{} + tk2 := testkit.NewTestKit(t, store) + subtask := subtasks2[0] + _, err = sqlexec.ExecSQL(ctx, tk2.Session(), ` + insert into mysql.tidb_background_subtask( + step, task_key, exec_id, meta, state, type, concurrency, ordinal, create_time, checkpoint, summary) + values (%?, %?, %?, %?, %?, %?, %?, %?, CURRENT_TIMESTAMP(), '{}', '{}')`, + subtask.Step, subtask.TaskID, subtask.ExecID, subtask.Meta, + proto.TaskStatePending, proto.Type2Int(subtask.Type), subtask.Concurrency, subtask.Ordinal) + require.NoError(t, err) + storage.TestChannel <- struct{}{} + }() + err = tm.SwitchTaskStepInBatch(ctx, task2, proto.TaskStateRunning, proto.StepOne, subtasks2) + require.ErrorIs(t, err, kv.ErrKeyExists) + task2, err = tm.GetTaskByID(ctx, task2.ID) + require.NoError(t, err) + checkTaskStateStep(t, task2, proto.TaskStatePending, proto.StepInit) + gotSubtasks, err := tm.GetAllSubtasksByStepAndState(ctx, task2.ID, proto.StepOne, proto.SubtaskStatePending) + require.NoError(t, err) + require.Len(t, gotSubtasks, 1) + // run again, should success + require.NoError(t, tm.SwitchTaskStepInBatch(ctx, task2, proto.TaskStateRunning, proto.StepOne, subtasks2)) + task2, err = tm.GetTaskByID(ctx, task2.ID) + require.NoError(t, err) + checkAfterSwitchStep(t, startTime, task2, subtasks2, proto.StepOne) + + // mock subtasks unstable + task3, subtasks3 := prepare("key3") + for i := 0; i < 2; i++ { + subtask := subtasks3[i] + _, err = sqlexec.ExecSQL(ctx, tk.Session(), ` + insert into mysql.tidb_background_subtask( + step, task_key, exec_id, meta, state, type, concurrency, ordinal, create_time, checkpoint, summary) + values (%?, %?, %?, %?, %?, %?, %?, %?, CURRENT_TIMESTAMP(), '{}', '{}')`, + subtask.Step, subtask.TaskID, subtask.ExecID, subtask.Meta, + proto.TaskStatePending, proto.Type2Int(subtask.Type), subtask.Concurrency, subtask.Ordinal) + require.NoError(t, err) + } + err = tm.SwitchTaskStepInBatch(ctx, task3, proto.TaskStateRunning, proto.StepOne, subtasks3[:1]) + require.ErrorIs(t, err, storage.ErrUnstableSubtasks) + require.ErrorContains(t, err, "expected 1, got 2") +} - nilTask, err := sm.GetFirstSubtaskInStates(ctx, "tidb2", 1, proto.StepInit, proto.TaskStatePending) +func TestGetTopUnfinishedTasks(t *testing.T) { + _, gm, ctx := testutil.InitTableTest(t) + + require.NoError(t, gm.InitMeta(ctx, ":4000", "")) + taskStates := []proto.TaskState{ + proto.TaskStateSucceed, + proto.TaskStatePending, + proto.TaskStateRunning, + proto.TaskStateReverting, + proto.TaskStateCancelling, + proto.TaskStatePausing, + proto.TaskStateResuming, + proto.TaskStateFailed, + proto.TaskStatePending, + proto.TaskStatePending, + proto.TaskStatePending, + proto.TaskStatePending, + } + for i, state := range taskStates { + taskKey := fmt.Sprintf("key/%d", i) + _, err := gm.CreateTask(ctx, taskKey, "test", 4, []byte("test")) + require.NoError(t, err) + require.NoError(t, gm.WithNewSession(func(se sessionctx.Context) error { + _, err := se.(sqlexec.SQLExecutor).ExecuteInternal(ctx, ` + update mysql.tidb_global_task set state = %? where task_key = %?`, + state, taskKey) + return err + })) + } + // adjust task order + require.NoError(t, gm.WithNewSession(func(se sessionctx.Context) error { + _, err := se.(sqlexec.SQLExecutor).ExecuteInternal(ctx, ` + update mysql.tidb_global_task set create_time = current_timestamp`) + return err + })) + require.NoError(t, gm.WithNewSession(func(se sessionctx.Context) error { + _, err := se.(sqlexec.SQLExecutor).ExecuteInternal(ctx, ` + update mysql.tidb_global_task + set create_time = timestampadd(minute, -10, current_timestamp) + where task_key = 'key/5'`) + return err + })) + require.NoError(t, gm.WithNewSession(func(se sessionctx.Context) error { + _, err := se.(sqlexec.SQLExecutor).ExecuteInternal(ctx, ` + update mysql.tidb_global_task set priority = 100 where task_key = 'key/6'`) + return err + })) + require.NoError(t, gm.WithNewSession(func(se sessionctx.Context) error { + rs, err := sqlexec.ExecSQL(ctx, se, ` + select count(1) from mysql.tidb_global_task`) + require.Len(t, rs, 1) + require.Equal(t, int64(12), rs[0].GetInt64(0)) + return err + })) + tasks, err := gm.GetTopUnfinishedTasks(ctx) + require.NoError(t, err) + require.Len(t, tasks, 8) + taskKeys := make([]string, 0, len(tasks)) + for _, task := range tasks { + taskKeys = append(taskKeys, task.Key) + // not filled + require.Empty(t, task.Meta) + } + require.Equal(t, []string{"key/6", "key/5", "key/1", "key/2", "key/3", "key/4", "key/8", "key/9"}, taskKeys) +} + +func TestGetUsedSlotsOnNodes(t *testing.T) { + _, sm, ctx := testutil.InitTableTest(t) + + testutil.InsertSubtask(t, sm, 1, proto.StepOne, "tidb-1", []byte(""), proto.SubtaskStateRunning, "test", 12) + testutil.InsertSubtask(t, sm, 1, proto.StepOne, "tidb-2", []byte(""), proto.SubtaskStatePending, "test", 12) + testutil.InsertSubtask(t, sm, 2, proto.StepOne, "tidb-2", []byte(""), proto.SubtaskStatePending, "test", 8) + testutil.InsertSubtask(t, sm, 3, proto.StepOne, "tidb-3", []byte(""), proto.SubtaskStatePending, "test", 8) + testutil.InsertSubtask(t, sm, 4, proto.StepOne, "tidb-3", []byte(""), proto.SubtaskStateFailed, "test", 8) + slotsOnNodes, err := sm.GetUsedSlotsOnNodes(ctx) + require.NoError(t, err) + require.Equal(t, map[string]int{ + "tidb-1": 12, + "tidb-2": 20, + "tidb-3": 8, + }, slotsOnNodes) +} + +func TestGetActiveSubtasks(t *testing.T) { + _, tm, ctx := testutil.InitTableTest(t) + require.NoError(t, tm.InitMeta(ctx, ":4000", "")) + id, err := tm.CreateTask(ctx, "key1", "test", 4, []byte("test")) + require.NoError(t, err) + require.Equal(t, int64(1), id) + task, err := tm.GetTaskByID(ctx, id) + require.NoError(t, err) + + subtasks := make([]*proto.Subtask, 0, 3) + for i := 0; i < 3; i++ { + subtasks = append(subtasks, + proto.NewSubtask(proto.StepOne, id, "test", fmt.Sprintf("tidb%d", i), 8, []byte("{}}"), i+1), + ) + } + require.NoError(t, tm.SwitchTaskStep(ctx, task, proto.TaskStateRunning, proto.StepOne, subtasks)) + require.NoError(t, tm.FinishSubtask(ctx, "tidb0", 1, []byte("{}}"))) + require.NoError(t, tm.StartSubtask(ctx, 2, "tidb1")) + + activeSubtasks, err := tm.GetActiveSubtasks(ctx, task.ID) + require.NoError(t, err) + require.Len(t, activeSubtasks, 2) + slices.SortFunc(activeSubtasks, func(i, j *proto.Subtask) int { + return int(i.ID - j.ID) + }) + require.Equal(t, int64(2), activeSubtasks[0].ID) + require.Equal(t, proto.SubtaskStateRunning, activeSubtasks[0].State) + require.Equal(t, int64(3), activeSubtasks[1].ID) + require.Equal(t, proto.SubtaskStatePending, activeSubtasks[1].State) +} + +func TestSubTaskTable(t *testing.T) { + _, sm, ctx := testutil.InitTableTest(t) + timeBeforeCreate := time.Unix(time.Now().Unix(), 0) + require.NoError(t, sm.InitMeta(ctx, ":4000", "")) + id, err := sm.CreateTask(ctx, "key1", "test", 4, []byte("test")) + require.NoError(t, err) + require.Equal(t, int64(1), id) + _, err = sm.UpdateTaskAndAddSubTasks( + ctx, + &proto.Task{ + ID: 1, + State: proto.TaskStateRunning, + }, + []*proto.Subtask{ + { + Step: proto.StepInit, + Type: proto.TaskTypeExample, + Concurrency: 11, + ExecID: "tidb1", + Meta: []byte("test"), + Ordinal: 1, + }, + }, proto.TaskStatePending, + ) + require.NoError(t, err) + + nilTask, err := sm.GetFirstSubtaskInStates(ctx, "tidb2", 1, proto.StepInit, proto.SubtaskStatePending) require.NoError(t, err) require.Nil(t, nilTask) - subtask, err := sm.GetFirstSubtaskInStates(ctx, "tidb1", 1, proto.StepInit, proto.TaskStatePending) + subtask, err := sm.GetFirstSubtaskInStates(ctx, "tidb1", 1, proto.StepInit, proto.SubtaskStatePending) require.NoError(t, err) + require.Equal(t, proto.StepInit, subtask.Step) require.Equal(t, proto.TaskTypeExample, subtask.Type) require.Equal(t, int64(1), subtask.TaskID) - require.Equal(t, proto.TaskStatePending, subtask.State) - require.Equal(t, "tidb1", subtask.SchedulerID) + require.Equal(t, proto.SubtaskStatePending, subtask.State) + require.Equal(t, "tidb1", subtask.ExecID) require.Equal(t, []byte("test"), subtask.Meta) + require.Equal(t, 11, subtask.Concurrency) + require.GreaterOrEqual(t, subtask.CreateTime, timeBeforeCreate) + require.Equal(t, 0, subtask.Ordinal) require.Zero(t, subtask.StartTime) require.Zero(t, subtask.UpdateTime) + require.Equal(t, "{}", subtask.Summary) - subtask2, err := sm.GetFirstSubtaskInStates(ctx, "tidb1", 1, proto.StepInit, proto.TaskStatePending, proto.TaskStateReverted) + subtask2, err := sm.GetFirstSubtaskInStates(ctx, "tidb1", 1, proto.StepInit, proto.SubtaskStatePending, proto.SubtaskStateReverted) require.NoError(t, err) require.Equal(t, subtask, subtask2) - ids, err := sm.GetSchedulerIDsByTaskID(ctx, 1) + ids, err := sm.GetTaskExecutorIDsByTaskID(ctx, 1) require.NoError(t, err) require.Len(t, ids, 1) require.Equal(t, "tidb1", ids[0]) - ids, err = sm.GetSchedulerIDsByTaskID(ctx, 3) + ids, err = sm.GetTaskExecutorIDsByTaskID(ctx, 3) require.NoError(t, err) require.Len(t, ids, 0) - cnt, err := sm.GetSubtaskInStatesCnt(ctx, 1, proto.TaskStatePending) + cntByStates, err := sm.GetSubtaskCntGroupByStates(ctx, 1, proto.StepInit) require.NoError(t, err) - require.Equal(t, int64(1), cnt) + require.Equal(t, int64(1), cntByStates[proto.SubtaskStatePending]) - cnt, err = sm.GetSubtaskInStatesCnt(ctx, 1, proto.TaskStatePending, proto.TaskStateRevertPending) + cntByStates, err = sm.GetSubtaskCntGroupByStates(ctx, 1, proto.StepInit) require.NoError(t, err) - require.Equal(t, int64(1), cnt) + require.Equal(t, int64(1), cntByStates[proto.SubtaskStatePending]+cntByStates[proto.SubtaskStateRevertPending]) - ok, err := sm.HasSubtasksInStates(ctx, "tidb1", 1, proto.StepInit, proto.TaskStatePending) + ok, err := sm.HasSubtasksInStates(ctx, "tidb1", 1, proto.StepInit, proto.SubtaskStatePending) require.NoError(t, err) require.True(t, ok) ts := time.Now() time.Sleep(time.Second) - require.NoError(t, sm.StartSubtask(ctx, 1)) + require.NoError(t, sm.StartSubtask(ctx, 1, "tidb1")) + + err = sm.StartSubtask(ctx, 1, "tidb2") + require.Error(t, storage.ErrSubtaskNotFound, err) - subtask, err = sm.GetFirstSubtaskInStates(ctx, "tidb1", 1, proto.StepInit, proto.TaskStatePending) + subtask, err = sm.GetFirstSubtaskInStates(ctx, "tidb1", 1, proto.StepInit, proto.SubtaskStatePending) require.NoError(t, err) require.Nil(t, subtask) - subtask, err = sm.GetFirstSubtaskInStates(ctx, "tidb1", 1, proto.StepInit, proto.TaskStateRunning) + subtask, err = sm.GetFirstSubtaskInStates(ctx, "tidb1", 1, proto.StepInit, proto.SubtaskStateRunning) require.NoError(t, err) require.Equal(t, proto.TaskTypeExample, subtask.Type) require.Equal(t, int64(1), subtask.TaskID) - require.Equal(t, proto.TaskStateRunning, subtask.State) - require.Equal(t, "tidb1", subtask.SchedulerID) + require.Equal(t, proto.SubtaskStateRunning, subtask.State) + require.Equal(t, "tidb1", subtask.ExecID) require.Equal(t, []byte("test"), subtask.Meta) require.GreaterOrEqual(t, subtask.StartTime, ts) require.GreaterOrEqual(t, subtask.UpdateTime, ts) // check update time after state change to cancel time.Sleep(time.Second) - require.NoError(t, sm.UpdateSubtaskStateAndError(ctx, "tidb1", 1, proto.TaskStateCancelling, nil)) - subtask2, err = sm.GetFirstSubtaskInStates(ctx, "tidb1", 1, proto.StepInit, proto.TaskStateCancelling) + require.NoError(t, sm.UpdateSubtaskStateAndError(ctx, "tidb1", 1, proto.SubtaskStateReverting, nil)) + subtask2, err = sm.GetFirstSubtaskInStates(ctx, "tidb1", 1, proto.StepInit, proto.SubtaskStateReverting) require.NoError(t, err) - require.Equal(t, proto.TaskStateCancelling, subtask2.State) + require.Equal(t, proto.SubtaskStateReverting, subtask2.State) require.Greater(t, subtask2.UpdateTime, subtask.UpdateTime) - cnt, err = sm.GetSubtaskInStatesCnt(ctx, 1, proto.TaskStatePending) + cntByStates, err = sm.GetSubtaskCntGroupByStates(ctx, 1, proto.StepInit) require.NoError(t, err) - require.Equal(t, int64(0), cnt) + require.Equal(t, int64(0), cntByStates[proto.SubtaskStatePending]) - ok, err = sm.HasSubtasksInStates(ctx, "tidb1", 1, proto.StepInit, proto.TaskStatePending) + ok, err = sm.HasSubtasksInStates(ctx, "tidb1", 1, proto.StepInit, proto.SubtaskStatePending) require.NoError(t, err) require.False(t, ok) - err = sm.DeleteSubtasksByTaskID(ctx, 1) - require.NoError(t, err) + require.NoError(t, testutil.DeleteSubtasksByTaskID(ctx, sm, 1)) - ok, err = sm.HasSubtasksInStates(ctx, "tidb1", 1, proto.StepInit, proto.TaskStatePending, proto.TaskStateRunning) + ok, err = sm.HasSubtasksInStates(ctx, "tidb1", 1, proto.StepInit, proto.SubtaskStatePending, proto.SubtaskStateRunning) require.NoError(t, err) require.False(t, ok) - err = sm.AddNewSubTask(ctx, 2, proto.StepInit, "tidb1", []byte("test"), proto.TaskTypeExample, true) - require.NoError(t, err) + testutil.CreateSubTask(t, sm, 2, proto.StepInit, "tidb1", []byte("test"), proto.TaskTypeExample, 11, true) - cnt, err = sm.GetSubtaskInStatesCnt(ctx, 2, proto.TaskStateRevertPending) + cntByStates, err = sm.GetSubtaskCntGroupByStates(ctx, 2, proto.StepInit) require.NoError(t, err) - require.Equal(t, int64(1), cnt) + require.Equal(t, int64(1), cntByStates[proto.SubtaskStateRevertPending]) - subtasks, err := sm.GetSucceedSubtasksByStep(ctx, 2, proto.StepInit) + subtasks, err := sm.GetAllSubtasksByStepAndState(ctx, 2, proto.StepInit, proto.SubtaskStateSucceed) require.NoError(t, err) require.Len(t, subtasks, 0) - err = sm.FinishSubtask(ctx, "tidb1", 2, []byte{}) - require.NoError(t, err) + require.NoError(t, sm.FinishSubtask(ctx, "tidb1", 2, []byte{})) - subtasks, err = sm.GetSucceedSubtasksByStep(ctx, 2, proto.StepInit) + subtasks, err = sm.GetAllSubtasksByStepAndState(ctx, 2, proto.StepInit, proto.SubtaskStateSucceed) require.NoError(t, err) require.Len(t, subtasks, 1) rowCount, err := sm.GetSubtaskRowCount(ctx, 2, proto.StepInit) require.NoError(t, err) require.Equal(t, int64(0), rowCount) - err = sm.UpdateSubtaskRowCount(ctx, 2, 100) - require.NoError(t, err) + require.NoError(t, sm.UpdateSubtaskRowCount(ctx, 2, 100)) rowCount, err = sm.GetSubtaskRowCount(ctx, 2, proto.StepInit) require.NoError(t, err) require.Equal(t, int64(100), rowCount) - // test UpdateErrorToSubtask do update start/update time - err = sm.AddNewSubTask(ctx, 3, proto.StepInit, "for_test", []byte("test"), proto.TaskTypeExample, false) - require.NoError(t, err) - require.NoError(t, sm.UpdateErrorToSubtask(ctx, "for_test", 3, errors.New("fail"))) - subtask, err = sm.GetFirstSubtaskInStates(ctx, "for_test", 3, proto.StepInit, proto.TaskStateFailed) + // test UpdateSubtasksExecIDs + // 1. update one subtask + testutil.CreateSubTask(t, sm, 5, proto.StepInit, "tidb1", []byte("test"), proto.TaskTypeExample, 11, false) + subtasks, err = sm.GetAllSubtasksByStepAndState(ctx, 5, proto.StepInit, proto.SubtaskStatePending) require.NoError(t, err) - require.Equal(t, proto.TaskStateFailed, subtask.State) - require.Greater(t, subtask.StartTime, ts) - require.Greater(t, subtask.UpdateTime, ts) - - // test FinishSubtask do update update time - err = sm.AddNewSubTask(ctx, 4, proto.StepInit, "for_test1", []byte("test"), proto.TaskTypeExample, false) + subtasks[0].ExecID = "tidb2" + require.NoError(t, sm.UpdateSubtasksExecIDs(ctx, subtasks)) + subtasks, err = sm.GetAllSubtasksByStepAndState(ctx, 5, proto.StepInit, proto.SubtaskStatePending) require.NoError(t, err) - subtask, err = sm.GetFirstSubtaskInStates(ctx, "for_test1", 4, proto.StepInit, proto.TaskStatePending) - require.NoError(t, err) - require.NoError(t, sm.StartSubtask(ctx, subtask.ID)) - subtask, err = sm.GetFirstSubtaskInStates(ctx, "for_test1", 4, proto.StepInit, proto.TaskStateRunning) - require.NoError(t, err) - require.Greater(t, subtask.StartTime, ts) - require.Greater(t, subtask.UpdateTime, ts) - time.Sleep(time.Second) - require.NoError(t, sm.FinishSubtask(ctx, "for_test1", subtask.ID, []byte{})) - subtask2, err = sm.GetFirstSubtaskInStates(ctx, "for_test1", 4, proto.StepInit, proto.TaskStateSucceed) + require.Equal(t, "tidb2", subtasks[0].ExecID) + // 2. update 2 subtasks + testutil.CreateSubTask(t, sm, 5, proto.StepInit, "tidb1", []byte("test"), proto.TaskTypeExample, 11, false) + subtasks, err = sm.GetAllSubtasksByStepAndState(ctx, 5, proto.StepInit, proto.SubtaskStatePending) require.NoError(t, err) - require.Equal(t, subtask2.StartTime, subtask.StartTime) - require.Greater(t, subtask2.UpdateTime, subtask.UpdateTime) - - // test UpdateFailedSchedulerIDs and IsSchedulerCanceled - canceled, err := sm.IsSchedulerCanceled(ctx, "for_test999", 4) + subtasks[0].ExecID = "tidb3" + require.NoError(t, sm.UpdateSubtasksExecIDs(ctx, subtasks)) + subtasks, err = sm.GetAllSubtasksByStepAndState(ctx, 5, proto.StepInit, proto.SubtaskStatePending) require.NoError(t, err) - require.True(t, canceled) - canceled, err = sm.IsSchedulerCanceled(ctx, "for_test1", 4) + require.Equal(t, "tidb3", subtasks[0].ExecID) + require.Equal(t, "tidb1", subtasks[1].ExecID) + // update fail + require.NoError(t, sm.UpdateSubtaskStateAndError(ctx, "tidb1", subtasks[0].ID, proto.SubtaskStateRunning, nil)) + subtasks, err = sm.GetAllSubtasksByStepAndState(ctx, 5, proto.StepInit, proto.SubtaskStatePending) require.NoError(t, err) - require.False(t, canceled) - canceled, err = sm.IsSchedulerCanceled(ctx, "for_test2", 4) + require.Equal(t, "tidb3", subtasks[0].ExecID) + subtasks[0].ExecID = "tidb2" + // update success + require.NoError(t, sm.UpdateSubtasksExecIDs(ctx, subtasks)) + subtasks, err = sm.GetAllSubtasksByStepAndState(ctx, 5, proto.StepInit, proto.SubtaskStatePending) require.NoError(t, err) - require.True(t, canceled) - - require.NoError(t, sm.UpdateSubtaskStateAndError(ctx, "for_test1", 4, proto.TaskStateRunning, nil)) - require.NoError(t, sm.UpdateFailedSchedulerIDs(ctx, 4, map[string]string{ - "for_test1": "for_test999", - "for_test2": "for_test999", - })) + require.Equal(t, "tidb2", subtasks[0].ExecID) - canceled, err = sm.IsSchedulerCanceled(ctx, "for_test1", 4) + // test GetSubtaskErrors + testutil.CreateSubTask(t, sm, 7, proto.StepInit, "tidb1", []byte("test"), proto.TaskTypeExample, 11, false) + subtasks, err = sm.GetAllSubtasksByStepAndState(ctx, 7, proto.StepInit, proto.SubtaskStatePending) require.NoError(t, err) - require.True(t, canceled) - canceled, err = sm.IsSchedulerCanceled(ctx, "for_test2", 4) + require.Equal(t, 1, len(subtasks)) + require.NoError(t, sm.UpdateSubtaskStateAndError(ctx, "tidb1", subtasks[0].ID, proto.SubtaskStateFailed, errors.New("test err"))) + subtaskErrs, err := sm.GetSubtaskErrors(ctx, 7) require.NoError(t, err) - require.True(t, canceled) - canceled, err = sm.IsSchedulerCanceled(ctx, "for_test999", 4) - require.NoError(t, err) - require.False(t, canceled) + require.Equal(t, 1, len(subtaskErrs)) + require.ErrorContains(t, subtaskErrs[0], "test err") } -func TestBothGlobalAndSubTaskTable(t *testing.T) { - pool := GetResourcePool(t) - sm := GetTaskManager(t, pool) - defer pool.Close() - ctx := context.Background() - ctx = util.WithInternalSourceType(ctx, "table_test") - - id, err := sm.AddNewGlobalTask(ctx, "key1", "test", 4, []byte("test")) +func TestBothTaskAndSubTaskTable(t *testing.T) { + _, sm, ctx := testutil.InitTableTest(t) + require.NoError(t, sm.InitMeta(ctx, ":4000", "")) + id, err := sm.CreateTask(ctx, "key1", "test", 4, []byte("test")) require.NoError(t, err) require.Equal(t, int64(1), id) - task, err := sm.GetNewGlobalTask(ctx) + task, err := testutil.GetOneTask(ctx, sm) require.NoError(t, err) require.Equal(t, proto.TaskStatePending, task.State) @@ -320,152 +666,210 @@ func TestBothGlobalAndSubTaskTable(t *testing.T) { task.State = proto.TaskStateRunning subTasks := []*proto.Subtask{ { - Step: proto.StepInit, - Type: proto.TaskTypeExample, - SchedulerID: "instance1", - Meta: []byte("m1"), + Step: proto.StepInit, + Type: proto.TaskTypeExample, + ExecID: "instance1", + Meta: []byte("m1"), }, { - Step: proto.StepInit, - Type: proto.TaskTypeExample, - SchedulerID: "instance2", - Meta: []byte("m2"), + Step: proto.StepInit, + Type: proto.TaskTypeExample, + ExecID: "instance2", + Meta: []byte("m2"), }, } - retryable, err := sm.UpdateGlobalTaskAndAddSubTasks(ctx, task, subTasks, prevState) + retryable, err := sm.UpdateTaskAndAddSubTasks(ctx, task, subTasks, prevState) require.NoError(t, err) - require.Equal(t, true, retryable) + require.True(t, retryable) - task, err = sm.GetGlobalTaskByID(ctx, 1) + task, err = sm.GetTaskByID(ctx, 1) require.NoError(t, err) require.Equal(t, proto.TaskStateRunning, task.State) - subtask1, err := sm.GetFirstSubtaskInStates(ctx, "instance1", 1, proto.StepInit, proto.TaskStatePending) + subtask1, err := sm.GetFirstSubtaskInStates(ctx, "instance1", 1, proto.StepInit, proto.SubtaskStatePending) require.NoError(t, err) require.Equal(t, int64(1), subtask1.ID) require.Equal(t, proto.TaskTypeExample, subtask1.Type) require.Equal(t, []byte("m1"), subtask1.Meta) - subtask2, err := sm.GetFirstSubtaskInStates(ctx, "instance2", 1, proto.StepInit, proto.TaskStatePending) + subtask2, err := sm.GetFirstSubtaskInStates(ctx, "instance2", 1, proto.StepInit, proto.SubtaskStatePending) require.NoError(t, err) require.Equal(t, int64(2), subtask2.ID) require.Equal(t, proto.TaskTypeExample, subtask2.Type) require.Equal(t, []byte("m2"), subtask2.Meta) - cnt, err := sm.GetSubtaskInStatesCnt(ctx, 1, proto.TaskStatePending) + cntByStates, err := sm.GetSubtaskCntGroupByStates(ctx, 1, proto.StepInit) require.NoError(t, err) - require.Equal(t, int64(2), cnt) + require.Len(t, cntByStates, 1) + require.Equal(t, int64(2), cntByStates[proto.SubtaskStatePending]) // isSubTaskRevert: true prevState = task.State task.State = proto.TaskStateReverting subTasks = []*proto.Subtask{ { - Step: proto.StepInit, - Type: proto.TaskTypeExample, - SchedulerID: "instance3", - Meta: []byte("m3"), + Step: proto.StepInit, + Type: proto.TaskTypeExample, + ExecID: "instance3", + Meta: []byte("m3"), }, { - Step: proto.StepInit, - Type: proto.TaskTypeExample, - SchedulerID: "instance4", - Meta: []byte("m4"), + Step: proto.StepInit, + Type: proto.TaskTypeExample, + ExecID: "instance4", + Meta: []byte("m4"), }, } - retryable, err = sm.UpdateGlobalTaskAndAddSubTasks(ctx, task, subTasks, prevState) + retryable, err = sm.UpdateTaskAndAddSubTasks(ctx, task, subTasks, prevState) require.NoError(t, err) - require.Equal(t, true, retryable) + require.True(t, retryable) - task, err = sm.GetGlobalTaskByID(ctx, 1) + task, err = sm.GetTaskByID(ctx, 1) require.NoError(t, err) require.Equal(t, proto.TaskStateReverting, task.State) - subtask1, err = sm.GetFirstSubtaskInStates(ctx, "instance3", 1, proto.StepInit, proto.TaskStateRevertPending) + subtask1, err = sm.GetFirstSubtaskInStates(ctx, "instance3", 1, proto.StepInit, proto.SubtaskStateRevertPending) require.NoError(t, err) require.Equal(t, int64(3), subtask1.ID) require.Equal(t, proto.TaskTypeExample, subtask1.Type) require.Equal(t, []byte("m3"), subtask1.Meta) - subtask2, err = sm.GetFirstSubtaskInStates(ctx, "instance4", 1, proto.StepInit, proto.TaskStateRevertPending) + subtask2, err = sm.GetFirstSubtaskInStates(ctx, "instance4", 1, proto.StepInit, proto.SubtaskStateRevertPending) require.NoError(t, err) require.Equal(t, int64(4), subtask2.ID) require.Equal(t, proto.TaskTypeExample, subtask2.Type) require.Equal(t, []byte("m4"), subtask2.Meta) - cnt, err = sm.GetSubtaskInStatesCnt(ctx, 1, proto.TaskStateRevertPending) + cntByStates, err = sm.GetSubtaskCntGroupByStates(ctx, 1, proto.StepInit) require.NoError(t, err) - require.Equal(t, int64(2), cnt) + require.Equal(t, int64(2), cntByStates[proto.SubtaskStateRevertPending]) // test transactional - require.NoError(t, sm.DeleteSubtasksByTaskID(ctx, 1)) - failpoint.Enable("github.com/pingcap/tidb/pkg/disttask/framework/storage/MockUpdateTaskErr", "1*return(true)") + require.NoError(t, testutil.DeleteSubtasksByTaskID(ctx, sm, 1)) + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/disttask/framework/storage/MockUpdateTaskErr", "1*return(true)")) defer func() { require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/disttask/framework/storage/MockUpdateTaskErr")) }() prevState = task.State task.State = proto.TaskStateFailed - retryable, err = sm.UpdateGlobalTaskAndAddSubTasks(ctx, task, subTasks, prevState) + retryable, err = sm.UpdateTaskAndAddSubTasks(ctx, task, subTasks, prevState) require.EqualError(t, err, "updateTaskErr") - require.Equal(t, true, retryable) + require.True(t, retryable) - task, err = sm.GetGlobalTaskByID(ctx, 1) + task, err = sm.GetTaskByID(ctx, 1) require.NoError(t, err) require.Equal(t, proto.TaskStateReverting, task.State) - cnt, err = sm.GetSubtaskInStatesCnt(ctx, 1, proto.TaskStateRevertPending) + cntByStates, err = sm.GetSubtaskCntGroupByStates(ctx, 1, proto.StepInit) require.NoError(t, err) - require.Equal(t, int64(0), cnt) + require.Equal(t, int64(0), cntByStates[proto.SubtaskStateRevertPending]) +} + +func TestGetSubtaskCntByStates(t *testing.T) { + _, sm, ctx := testutil.InitTableTest(t) + testutil.InsertSubtask(t, sm, 1, proto.StepOne, "tidb1", nil, proto.SubtaskStatePending, "test", 1) + testutil.InsertSubtask(t, sm, 1, proto.StepOne, "tidb1", nil, proto.SubtaskStatePending, "test", 1) + testutil.InsertSubtask(t, sm, 1, proto.StepOne, "tidb1", nil, proto.SubtaskStateRunning, "test", 1) + testutil.InsertSubtask(t, sm, 1, proto.StepOne, "tidb1", nil, proto.SubtaskStateSucceed, "test", 1) + testutil.InsertSubtask(t, sm, 1, proto.StepOne, "tidb1", nil, proto.SubtaskStateFailed, "test", 1) + testutil.InsertSubtask(t, sm, 1, proto.StepTwo, "tidb1", nil, proto.SubtaskStateFailed, "test", 1) + cntByStates, err := sm.GetSubtaskCntGroupByStates(ctx, 1, proto.StepOne) + require.NoError(t, err) + require.Len(t, cntByStates, 4) + require.Equal(t, int64(2), cntByStates[proto.SubtaskStatePending]) + require.Equal(t, int64(1), cntByStates[proto.SubtaskStateRunning]) + require.Equal(t, int64(1), cntByStates[proto.SubtaskStateSucceed]) + require.Equal(t, int64(1), cntByStates[proto.SubtaskStateFailed]) + cntByStates, err = sm.GetSubtaskCntGroupByStates(ctx, 1, proto.StepTwo) + require.NoError(t, err) + require.Len(t, cntByStates, 1) + require.Equal(t, int64(1), cntByStates[proto.SubtaskStateFailed]) } func TestDistFrameworkMeta(t *testing.T) { - pool := GetResourcePool(t) - sm := GetTaskManager(t, pool) - defer pool.Close() - ctx := context.Background() - ctx = util.WithInternalSourceType(ctx, "table_test") + _, sm, ctx := testutil.InitTableTest(t) + + // when no node + _, err := sm.GetCPUCountOfManagedNode(ctx) + require.ErrorContains(t, err, "no managed nodes") + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/util/cpu/mockNumCpu", "return(0)")) + require.NoError(t, sm.InitMeta(ctx, ":4000", "background")) + _, err = sm.GetCPUCountOfManagedNode(ctx) + require.ErrorContains(t, err, "no managed node have enough resource") + + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/util/cpu/mockNumCpu", "return(100)")) + require.NoError(t, sm.InitMeta(ctx, ":4000", "background")) + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/util/cpu/mockNumCpu", "return(8)")) + require.NoError(t, sm.InitMeta(ctx, ":4001", "")) + require.NoError(t, sm.InitMeta(ctx, ":4002", "background")) + nodes, err := sm.GetAllNodes(ctx) + require.NoError(t, err) + require.Equal(t, []proto.ManagedNode{ + {ID: ":4000", Role: "background", CPUCount: 100}, + {ID: ":4001", Role: "", CPUCount: 8}, + {ID: ":4002", Role: "background", CPUCount: 8}, + }, nodes) - require.NoError(t, sm.StartManager(ctx, ":4000", "background")) - require.NoError(t, sm.StartManager(ctx, ":4001", "")) - require.NoError(t, sm.StartManager(ctx, ":4002", "")) - require.NoError(t, sm.StartManager(ctx, ":4002", "background")) + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/util/cpu/mockNumCpu", "return(100)")) + require.NoError(t, sm.InitMeta(ctx, ":4002", "")) + require.NoError(t, sm.InitMeta(ctx, ":4003", "background")) - allNodes, err := sm.GetAllNodes(ctx) + nodes, err = sm.GetAllNodes(ctx) + require.NoError(t, err) + require.Equal(t, []proto.ManagedNode{ + {ID: ":4000", Role: "background", CPUCount: 100}, + {ID: ":4001", Role: "", CPUCount: 8}, + {ID: ":4002", Role: "", CPUCount: 100}, + {ID: ":4003", Role: "background", CPUCount: 100}, + }, nodes) + cpuCount, err := sm.GetCPUCountOfManagedNode(ctx) require.NoError(t, err) - require.Equal(t, []string{":4000", ":4001", ":4002"}, allNodes) + require.Equal(t, 100, cpuCount) - nodes, err := sm.GetNodesByRole(ctx, "background") + require.NoError(t, sm.InitMeta(ctx, ":4002", "background")) + + require.NoError(t, sm.DeleteDeadNodes(ctx, []string{":4000"})) + nodes, err = sm.GetManagedNodes(ctx) require.NoError(t, err) - require.Equal(t, map[string]bool{ - ":4000": true, - ":4002": true, + require.Equal(t, []proto.ManagedNode{ + {ID: ":4002", Role: "background", CPUCount: 100}, + {ID: ":4003", Role: "background", CPUCount: 100}, }, nodes) - nodes, err = sm.GetNodesByRole(ctx, "") + require.NoError(t, sm.DeleteDeadNodes(ctx, []string{":4003"})) + nodes, err = sm.GetManagedNodes(ctx) require.NoError(t, err) - require.Equal(t, map[string]bool{ - ":4001": true, + require.Equal(t, []proto.ManagedNode{ + {ID: ":4002", Role: "background", CPUCount: 100}, }, nodes) - require.NoError(t, sm.CleanUpMeta(ctx, []string{":4000"})) - nodes, err = sm.GetNodesByRole(ctx, "background") + require.NoError(t, sm.DeleteDeadNodes(ctx, []string{":4002"})) + nodes, err = sm.GetManagedNodes(ctx) require.NoError(t, err) - require.Equal(t, map[string]bool{ - ":4002": true, + require.Equal(t, []proto.ManagedNode{ + {ID: ":4001", Role: "", CPUCount: 8}, }, nodes) + cpuCount, err = sm.GetCPUCountOfManagedNode(ctx) + require.NoError(t, err) + require.Equal(t, 8, cpuCount) - require.NoError(t, sm.CleanUpMeta(ctx, []string{":4002"})) - nodes, err = sm.GetNodesByRole(ctx, "background") + require.NoError(t, sm.RecoverMeta(ctx, ":4002", "background")) + nodes, err = sm.GetManagedNodes(ctx) require.NoError(t, err) - require.Equal(t, map[string]bool{}, nodes) + require.Equal(t, []proto.ManagedNode{ + {ID: ":4002", Role: "background", CPUCount: 100}, + }, nodes) + // should not reset role + require.NoError(t, sm.RecoverMeta(ctx, ":4002", "")) + nodes, err = sm.GetManagedNodes(ctx) + require.NoError(t, err) + require.Equal(t, []proto.ManagedNode{ + {ID: ":4002", Role: "background", CPUCount: 100}, + }, nodes) } func TestSubtaskHistoryTable(t *testing.T) { - pool := GetResourcePool(t) - sm := GetTaskManager(t, pool) - defer pool.Close() - ctx := context.Background() - ctx = util.WithInternalSourceType(ctx, "table_test") + _, sm, ctx := testutil.InitTableTest(t) const ( taskID = 1 @@ -481,161 +885,326 @@ func TestSubtaskHistoryTable(t *testing.T) { finishedMeta = "finished" ) - require.NoError(t, sm.AddNewSubTask(ctx, taskID, proto.StepInit, tidb1, []byte(meta), proto.TaskTypeExample, false)) + testutil.CreateSubTask(t, sm, taskID, proto.StepInit, tidb1, []byte(meta), proto.TaskTypeExample, 11, false) require.NoError(t, sm.FinishSubtask(ctx, tidb1, subTask1, []byte(finishedMeta))) - require.NoError(t, sm.AddNewSubTask(ctx, taskID, proto.StepInit, tidb2, []byte(meta), proto.TaskTypeExample, false)) - require.NoError(t, sm.UpdateSubtaskStateAndError(ctx, tidb2, subTask2, proto.TaskStateCanceled, nil)) - require.NoError(t, sm.AddNewSubTask(ctx, taskID, proto.StepInit, tidb3, []byte(meta), proto.TaskTypeExample, false)) - require.NoError(t, sm.UpdateSubtaskStateAndError(ctx, tidb3, subTask3, proto.TaskStateFailed, nil)) + testutil.CreateSubTask(t, sm, taskID, proto.StepInit, tidb2, []byte(meta), proto.TaskTypeExample, 11, false) + require.NoError(t, sm.UpdateSubtaskStateAndError(ctx, tidb2, subTask2, proto.SubtaskStateCanceled, nil)) + testutil.CreateSubTask(t, sm, taskID, proto.StepInit, tidb3, []byte(meta), proto.TaskTypeExample, 11, false) + require.NoError(t, sm.UpdateSubtaskStateAndError(ctx, tidb3, subTask3, proto.SubtaskStateFailed, nil)) - subTasks, err := storage.GetSubtasksByTaskIDForTest(ctx, sm, taskID) + subTasks, err := testutil.GetSubtasksByTaskID(ctx, sm, taskID) require.NoError(t, err) require.Len(t, subTasks, 3) - historySubTasksCnt, err := storage.GetSubtasksFromHistoryForTest(ctx, sm) + historySubTasksCnt, err := testutil.GetSubtasksFromHistory(ctx, sm) require.NoError(t, err) require.Equal(t, 0, historySubTasksCnt) - subTasks, err = sm.GetSubtasksForImportInto(ctx, taskID, proto.StepInit) + subTasks, err = sm.GetSubtasksWithHistory(ctx, taskID, proto.StepInit) require.NoError(t, err) require.Len(t, subTasks, 3) // test TransferSubTasks2History - require.NoError(t, sm.TransferSubTasks2History(ctx, taskID)) + require.NoError(t, testutil.TransferSubTasks2History(ctx, sm, taskID)) - subTasks, err = storage.GetSubtasksByTaskIDForTest(ctx, sm, taskID) + subTasks, err = testutil.GetSubtasksByTaskID(ctx, sm, taskID) require.NoError(t, err) require.Len(t, subTasks, 0) - historySubTasksCnt, err = storage.GetSubtasksFromHistoryForTest(ctx, sm) + historySubTasksCnt, err = testutil.GetSubtasksFromHistory(ctx, sm) require.NoError(t, err) require.Equal(t, 3, historySubTasksCnt) - subTasks, err = sm.GetSubtasksForImportInto(ctx, taskID, proto.StepInit) + subTasks, err = sm.GetSubtasksWithHistory(ctx, taskID, proto.StepInit) require.NoError(t, err) require.Len(t, subTasks, 3) // test GC history table. - failpoint.Enable("github.com/pingcap/tidb/pkg/disttask/framework/storage/subtaskHistoryKeepSeconds", "return(1)") + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/disttask/framework/storage/subtaskHistoryKeepSeconds", "return(1)")) defer func() { require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/disttask/framework/storage/subtaskHistoryKeepSeconds")) }() time.Sleep(2 * time.Second) - require.NoError(t, sm.AddNewSubTask(ctx, taskID2, proto.StepInit, tidb1, []byte(meta), proto.TaskTypeExample, false)) - require.NoError(t, sm.UpdateSubtaskStateAndError(ctx, tidb1, subTask4, proto.TaskStateFailed, nil)) - require.NoError(t, sm.TransferSubTasks2History(ctx, taskID2)) + testutil.CreateSubTask(t, sm, taskID2, proto.StepInit, tidb1, []byte(meta), proto.TaskTypeExample, 11, false) + require.NoError(t, sm.UpdateSubtaskStateAndError(ctx, tidb1, subTask4, proto.SubtaskStateFailed, nil)) + require.NoError(t, testutil.TransferSubTasks2History(ctx, sm, taskID2)) require.NoError(t, sm.GCSubtasks(ctx)) - historySubTasksCnt, err = storage.GetSubtasksFromHistoryForTest(ctx, sm) + historySubTasksCnt, err = testutil.GetSubtasksFromHistory(ctx, sm) require.NoError(t, err) require.Equal(t, 1, historySubTasksCnt) } func TestTaskHistoryTable(t *testing.T) { - pool := GetResourcePool(t) - gm := GetTaskManager(t, pool) - defer pool.Close() - ctx := context.Background() - ctx = util.WithInternalSourceType(ctx, "table_test") + _, gm, ctx := testutil.InitTableTest(t) - _, err := gm.AddNewGlobalTask(ctx, "1", proto.TaskTypeExample, 1, nil) + require.NoError(t, gm.InitMeta(ctx, ":4000", "")) + _, err := gm.CreateTask(ctx, "1", proto.TaskTypeExample, 1, nil) require.NoError(t, err) - taskID, err := gm.AddNewGlobalTask(ctx, "2", proto.TaskTypeExample, 1, nil) + taskID, err := gm.CreateTask(ctx, "2", proto.TaskTypeExample, 1, nil) require.NoError(t, err) - tasks, err := gm.GetGlobalTasksInStates(ctx, proto.TaskStatePending) + tasks, err := gm.GetTasksInStates(ctx, proto.TaskStatePending) require.NoError(t, err) require.Equal(t, 2, len(tasks)) - + testutil.InsertSubtask(t, gm, tasks[0].ID, proto.StepOne, "tidb1", proto.EmptyMeta, proto.SubtaskStateRunning, proto.TaskTypeExample, 1) + testutil.InsertSubtask(t, gm, tasks[1].ID, proto.StepOne, "tidb1", proto.EmptyMeta, proto.SubtaskStateRunning, proto.TaskTypeExample, 1) + oldTasks := tasks require.NoError(t, gm.TransferTasks2History(ctx, tasks)) - tasks, err = gm.GetGlobalTasksInStates(ctx, proto.TaskStatePending) + tasks, err = gm.GetTasksInStates(ctx, proto.TaskStatePending) require.NoError(t, err) require.Equal(t, 0, len(tasks)) - num, err := storage.GetTasksFromHistoryForTest(ctx, gm) + num, err := testutil.GetTasksFromHistory(ctx, gm) require.NoError(t, err) require.Equal(t, 2, num) + num, err = testutil.GetSubtasksFromHistoryByTaskID(ctx, gm, oldTasks[0].ID) + require.NoError(t, err) + require.Equal(t, 1, num) + num, err = testutil.GetSubtasksFromHistoryByTaskID(ctx, gm, oldTasks[1].ID) + require.NoError(t, err) + require.Equal(t, 1, num) task, err := gm.GetTaskByIDWithHistory(ctx, taskID) require.NoError(t, err) require.NotNil(t, task) - task, err = gm.GetGlobalTaskByKeyWithHistory(ctx, "1") + task, err = gm.GetTaskByKeyWithHistory(ctx, "1") require.NoError(t, err) require.NotNil(t, task) // task with fail transfer - _, err = gm.AddNewGlobalTask(ctx, "3", proto.TaskTypeExample, 1, nil) + _, err = gm.CreateTask(ctx, "3", proto.TaskTypeExample, 1, nil) require.NoError(t, err) - tasks, err = gm.GetGlobalTasksInStates(ctx, proto.TaskStatePending) + tasks, err = gm.GetTasksInStates(ctx, proto.TaskStatePending) require.NoError(t, err) require.Equal(t, 1, len(tasks)) tasks[0].Error = errors.New("mock err") require.NoError(t, gm.TransferTasks2History(ctx, tasks)) - num, err = storage.GetTasksFromHistoryForTest(ctx, gm) + num, err = testutil.GetTasksFromHistory(ctx, gm) require.NoError(t, err) require.Equal(t, 3, num) } func TestPauseAndResume(t *testing.T) { - pool := GetResourcePool(t) - sm := GetTaskManager(t, pool) - defer pool.Close() - ctx := context.Background() - ctx = util.WithInternalSourceType(ctx, "table_test") + _, sm, ctx := testutil.InitTableTest(t) - require.NoError(t, sm.AddNewSubTask(ctx, 1, proto.StepInit, "tidb1", []byte("test"), proto.TaskTypeExample, false)) - require.NoError(t, sm.AddNewSubTask(ctx, 1, proto.StepInit, "tidb1", []byte("test"), proto.TaskTypeExample, false)) - require.NoError(t, sm.AddNewSubTask(ctx, 1, proto.StepInit, "tidb1", []byte("test"), proto.TaskTypeExample, false)) + testutil.CreateSubTask(t, sm, 1, proto.StepInit, "tidb1", []byte("test"), proto.TaskTypeExample, 11, false) + testutil.CreateSubTask(t, sm, 1, proto.StepInit, "tidb1", []byte("test"), proto.TaskTypeExample, 11, false) + testutil.CreateSubTask(t, sm, 1, proto.StepInit, "tidb1", []byte("test"), proto.TaskTypeExample, 11, false) // 1.1 pause all subtasks. require.NoError(t, sm.PauseSubtasks(ctx, "tidb1", 1)) - cnt, err := sm.GetSubtaskInStatesCnt(ctx, 1, proto.TaskStatePaused) + cntByStates, err := sm.GetSubtaskCntGroupByStates(ctx, 1, proto.StepInit) require.NoError(t, err) - require.Equal(t, int64(3), cnt) + require.Equal(t, int64(3), cntByStates[proto.SubtaskStatePaused]) // 1.2 resume all subtasks. require.NoError(t, sm.ResumeSubtasks(ctx, 1)) - cnt, err = sm.GetSubtaskInStatesCnt(ctx, 1, proto.TaskStatePending) + cntByStates, err = sm.GetSubtaskCntGroupByStates(ctx, 1, proto.StepInit) require.NoError(t, err) - require.Equal(t, int64(3), cnt) + require.Equal(t, int64(3), cntByStates[proto.SubtaskStatePending]) // 2.1 pause 2 subtasks. - sm.UpdateSubtaskStateAndError(ctx, "tidb1", 1, proto.TaskStateSucceed, nil) + require.NoError(t, sm.UpdateSubtaskStateAndError(ctx, "tidb1", 1, proto.SubtaskStateSucceed, nil)) require.NoError(t, sm.PauseSubtasks(ctx, "tidb1", 1)) - cnt, err = sm.GetSubtaskInStatesCnt(ctx, 1, proto.TaskStatePaused) + cntByStates, err = sm.GetSubtaskCntGroupByStates(ctx, 1, proto.StepInit) require.NoError(t, err) - require.Equal(t, int64(2), cnt) + require.Equal(t, int64(2), cntByStates[proto.SubtaskStatePaused]) // 2.2 resume 2 subtasks. require.NoError(t, sm.ResumeSubtasks(ctx, 1)) - cnt, err = sm.GetSubtaskInStatesCnt(ctx, 1, proto.TaskStatePending) + cntByStates, err = sm.GetSubtaskCntGroupByStates(ctx, 1, proto.StepInit) require.NoError(t, err) - require.Equal(t, int64(2), cnt) + require.Equal(t, int64(2), cntByStates[proto.SubtaskStatePending]) } func TestCancelAndExecIdChanged(t *testing.T) { - pool := GetResourcePool(t) - sm := GetTaskManager(t, pool) - defer pool.Close() - ctx, cancel := context.WithCancel(context.Background()) - ctx = util.WithInternalSourceType(ctx, "table_test") + sm, ctx, cancel := testutil.InitTableTestWithCancel(t) - require.NoError(t, sm.AddNewSubTask(ctx, 1, proto.StepInit, "tidb1", []byte("test"), proto.TaskTypeExample, false)) - subtask, err := sm.GetFirstSubtaskInStates(ctx, "tidb1", 1, proto.StepInit, proto.TaskStatePending) + testutil.CreateSubTask(t, sm, 1, proto.StepInit, "tidb1", []byte("test"), proto.TaskTypeExample, 11, false) + subtask, err := sm.GetFirstSubtaskInStates(ctx, "tidb1", 1, proto.StepInit, proto.SubtaskStatePending) require.NoError(t, err) // 1. cancel the ctx, then update subtask state. cancel() - require.ErrorIs(t, sm.UpdateSubtaskStateAndError(ctx, "tidb1", subtask.ID, proto.TaskStateFailed, nil), context.Canceled) + require.ErrorIs(t, sm.UpdateSubtaskStateAndError(ctx, "tidb1", subtask.ID, proto.SubtaskStateFailed, nil), context.Canceled) ctx = context.Background() ctx = util.WithInternalSourceType(ctx, "table_test") - subtask, err = sm.GetFirstSubtaskInStates(ctx, "tidb1", 1, proto.StepInit, proto.TaskStatePending) + subtask, err = sm.GetFirstSubtaskInStates(ctx, "tidb1", 1, proto.StepInit, proto.SubtaskStatePending) // task state not changed require.NoError(t, err) - require.Equal(t, subtask.State, proto.TaskStatePending) + require.Equal(t, proto.SubtaskStatePending, subtask.State) // 2. change the exec_id // exec_id changed - require.NoError(t, sm.UpdateSubtaskExecID(ctx, "tidb2", subtask.ID)) + require.NoError(t, testutil.UpdateSubtaskExecID(ctx, sm, "tidb2", subtask.ID)) // exec_id in memory unchanged, call UpdateSubtaskStateAndError. - require.NoError(t, sm.UpdateSubtaskStateAndError(ctx, subtask.SchedulerID, subtask.ID, proto.TaskStateFailed, nil)) - subtask, err = sm.GetFirstSubtaskInStates(ctx, "tidb2", 1, proto.StepInit, proto.TaskStatePending) + require.NoError(t, sm.UpdateSubtaskStateAndError(ctx, subtask.ExecID, subtask.ID, proto.SubtaskStateFailed, nil)) + subtask, err = sm.GetFirstSubtaskInStates(ctx, "tidb2", 1, proto.StepInit, proto.SubtaskStatePending) require.NoError(t, err) // state unchanged require.NotNil(t, subtask) } + +func TestTaskNotFound(t *testing.T) { + _, gm, ctx := testutil.InitTableTest(t) + task, err := gm.GetTaskByID(ctx, 1) + require.Error(t, err, storage.ErrTaskNotFound) + require.Nil(t, task) + task, err = gm.GetTaskByIDWithHistory(ctx, 1) + require.Error(t, err, storage.ErrTaskNotFound) + require.Nil(t, task) + task, err = gm.GetTaskByKey(ctx, "key") + require.Error(t, err, storage.ErrTaskNotFound) + require.Nil(t, task) + task, err = gm.GetTaskByKeyWithHistory(ctx, "key") + require.Error(t, err, storage.ErrTaskNotFound) + require.Nil(t, task) +} + +func TestInitMeta(t *testing.T) { + store, sm, ctx := testutil.InitTableTest(t) + tk := testkit.NewTestKit(t, store) + require.NoError(t, sm.InitMeta(ctx, "tidb1", "")) + tk.MustQuery(`select role from mysql.dist_framework_meta where host="tidb1"`).Check(testkit.Rows("")) + require.NoError(t, sm.InitMeta(ctx, "tidb1", "background")) + tk.MustQuery(`select role from mysql.dist_framework_meta where host="tidb1"`).Check(testkit.Rows("background")) + tk.MustExec(`set global tidb_service_scope=""`) + tk.MustQuery("select @@global.tidb_service_scope").Check(testkit.Rows("")) + + // 1. delete then start. + require.NoError(t, sm.DeleteDeadNodes(ctx, []string{"tidb1"})) + require.NoError(t, sm.InitMeta(ctx, "tidb1", "")) + tk.MustQuery(`select role from mysql.dist_framework_meta where host="tidb1"`).Check(testkit.Rows("")) + + require.NoError(t, sm.DeleteDeadNodes(ctx, []string{"tidb1"})) + require.NoError(t, sm.InitMeta(ctx, "tidb1", "background")) + tk.MustQuery(`select role from mysql.dist_framework_meta where host="tidb1"`).Check(testkit.Rows("background")) + + // 2. delete then set. + require.NoError(t, sm.DeleteDeadNodes(ctx, []string{"tidb1"})) + tk.MustExec(`set global tidb_service_scope=""`) + tk.MustQuery("select @@global.tidb_service_scope").Check(testkit.Rows("")) + + require.NoError(t, sm.DeleteDeadNodes(ctx, []string{"tidb1"})) + tk.MustExec(`set global tidb_service_scope="background"`) + tk.MustQuery("select @@global.tidb_service_scope").Check(testkit.Rows("background")) +} + +func TestSubtaskType(t *testing.T) { + _, sm, ctx := testutil.InitTableTest(t) + cases := []proto.TaskType{ + proto.TaskTypeExample, + proto.ImportInto, + proto.Backfill, + "", + } + for i, c := range cases { + testutil.InsertSubtask(t, sm, int64(i+1), proto.StepOne, "tidb-1", []byte(""), proto.SubtaskStateRunning, c, 12) + subtask, err := sm.GetFirstSubtaskInStates(ctx, "tidb-1", int64(i+1), proto.StepOne, proto.SubtaskStateRunning) + require.NoError(t, err) + require.Equal(t, c, subtask.Type) + } +} + +func TestRunningSubtasksBack2Pending(t *testing.T) { + _, sm, ctx := testutil.InitTableTest(t) + subtasks := []*proto.Subtask{ + {TaskID: 1, ExecID: "tidb-1", State: proto.SubtaskStatePending}, + {TaskID: 1, ExecID: "tidb-1", State: proto.SubtaskStateRunning}, + {TaskID: 1, ExecID: "tidb-2", State: proto.SubtaskStatePending}, + {TaskID: 2, ExecID: "tidb-1", State: proto.SubtaskStatePending}, + } + for _, st := range subtasks { + testutil.InsertSubtask(t, sm, st.TaskID, proto.StepOne, st.ExecID, []byte(""), st.State, proto.TaskTypeExample, 12) + } + + getAllSubtasks := func() []*proto.Subtask { + res := make([]*proto.Subtask, 0, 3) + require.NoError(t, sm.WithNewSession(func(se sessionctx.Context) error { + rs, err := sqlexec.ExecSQL(ctx, se, ` + select cast(task_key as signed), exec_id, state, state_update_time + from mysql.tidb_background_subtask + order by task_key, exec_id, state`) + require.NoError(t, err) + for _, r := range rs { + var updateTime time.Time + if !r.IsNull(3) { + updateTime = time.Unix(r.GetInt64(3), 0) + } + res = append(res, &proto.Subtask{ + TaskID: r.GetInt64(0), + ExecID: r.GetString(1), + State: proto.SubtaskState(r.GetString(2)), + UpdateTime: updateTime, + }) + } + return nil + })) + return res + } + + require.Equal(t, subtasks, getAllSubtasks()) + require.NoError(t, sm.RunningSubtasksBack2Pending(ctx, nil)) + require.Equal(t, subtasks, getAllSubtasks()) + + activeSubtasks, err := sm.GetActiveSubtasks(ctx, 1) + require.NoError(t, err) + require.Len(t, activeSubtasks, 3) + startTime := time.Unix(time.Now().Unix(), 0) + // this list contains running and pending subtasks, just for test. + require.NoError(t, sm.RunningSubtasksBack2Pending(ctx, activeSubtasks)) + allSubtasks := getAllSubtasks() + require.GreaterOrEqual(t, allSubtasks[1].UpdateTime, startTime) + allSubtasks[1].UpdateTime = time.Time{} + subtasks[1].State = proto.SubtaskStatePending + require.Equal(t, subtasks, allSubtasks) +} + +func TestSubtasksState(t *testing.T) { + _, sm, ctx := testutil.InitTableTest(t) + ts := time.Now() + time.Sleep(1 * time.Second) + // 1. test FailSubtask do update start/update time + testutil.CreateSubTask(t, sm, 3, proto.StepInit, "for_test", []byte("test"), proto.TaskTypeExample, 11, false) + require.NoError(t, sm.FailSubtask(ctx, "for_test", 3, errors.New("fail"))) + subtask, err := sm.GetFirstSubtaskInStates(ctx, "for_test", 3, proto.StepInit, proto.SubtaskStateFailed) + require.NoError(t, err) + require.Equal(t, proto.SubtaskStateFailed, subtask.State) + require.Greater(t, subtask.StartTime, ts) + require.Greater(t, subtask.UpdateTime, ts) + + endTime, err := testutil.GetSubtaskEndTime(ctx, sm, subtask.ID) + require.NoError(t, err) + require.Greater(t, endTime, ts) + + // 2. test FinishSubtask do update update time + testutil.CreateSubTask(t, sm, 4, proto.StepInit, "for_test1", []byte("test"), proto.TaskTypeExample, 11, false) + subtask, err = sm.GetFirstSubtaskInStates(ctx, "for_test1", 4, proto.StepInit, proto.SubtaskStatePending) + require.NoError(t, err) + err = sm.StartSubtask(ctx, subtask.ID, "for_test1") + require.NoError(t, err) + + subtask, err = sm.GetFirstSubtaskInStates(ctx, "for_test1", 4, proto.StepInit, proto.SubtaskStateRunning) + require.NoError(t, err) + require.Greater(t, subtask.StartTime, ts) + require.Greater(t, subtask.UpdateTime, ts) + ts = time.Now() + time.Sleep(time.Second) + require.NoError(t, sm.FinishSubtask(ctx, "for_test1", subtask.ID, []byte{})) + subtask2, err := sm.GetFirstSubtaskInStates(ctx, "for_test1", 4, proto.StepInit, proto.SubtaskStateSucceed) + require.NoError(t, err) + require.Equal(t, subtask2.StartTime, subtask.StartTime) + require.Greater(t, subtask2.UpdateTime, subtask.UpdateTime) + endTime, err = testutil.GetSubtaskEndTime(ctx, sm, subtask.ID) + require.NoError(t, err) + require.Greater(t, endTime, ts) + + // 3. test CancelSubtask + testutil.CreateSubTask(t, sm, 3, proto.StepInit, "for_test", []byte("test"), proto.TaskTypeExample, 11, false) + require.NoError(t, sm.CancelSubtask(ctx, "for_test", 3)) + subtask, err = sm.GetFirstSubtaskInStates(ctx, "for_test", 3, proto.StepInit, proto.SubtaskStateCanceled) + require.NoError(t, err) + require.Equal(t, proto.SubtaskStateCanceled, subtask.State) + require.Greater(t, subtask.StartTime, ts) + require.Greater(t, subtask.UpdateTime, ts) + + endTime, err = testutil.GetSubtaskEndTime(ctx, sm, subtask.ID) + require.NoError(t, err) + require.Greater(t, endTime, ts) +} diff --git a/pkg/disttask/framework/storage/task_state.go b/pkg/disttask/framework/storage/task_state.go new file mode 100644 index 0000000000000..72761aaeb1b5f --- /dev/null +++ b/pkg/disttask/framework/storage/task_state.go @@ -0,0 +1,152 @@ +// Copyright 2024 PingCAP, 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. + +package storage + +import ( + "context" + + "github.com/pingcap/tidb/pkg/disttask/framework/proto" + "github.com/pingcap/tidb/pkg/sessionctx" + "github.com/pingcap/tidb/pkg/util/sqlexec" +) + +// CancelTask cancels task. +func (mgr *TaskManager) CancelTask(ctx context.Context, taskID int64) error { + _, err := mgr.ExecuteSQLWithNewSession(ctx, + `update mysql.tidb_global_task + set state = %?, + state_update_time = CURRENT_TIMESTAMP() + where id = %? and state in (%?, %?)`, + proto.TaskStateCancelling, taskID, proto.TaskStatePending, proto.TaskStateRunning, + ) + return err +} + +// CancelTaskByKeySession cancels task by key using input session. +func (*TaskManager) CancelTaskByKeySession(ctx context.Context, se sessionctx.Context, taskKey string) error { + _, err := sqlexec.ExecSQL(ctx, se, + `update mysql.tidb_global_task + set state = %?, + state_update_time = CURRENT_TIMESTAMP() + where task_key = %? and state in (%?, %?)`, + proto.TaskStateCancelling, taskKey, proto.TaskStatePending, proto.TaskStateRunning) + return err +} + +// FailTask implements the scheduler.TaskManager interface. +func (mgr *TaskManager) FailTask(ctx context.Context, taskID int64, currentState proto.TaskState, taskErr error) error { + _, err := mgr.ExecuteSQLWithNewSession(ctx, + `update mysql.tidb_global_task + set state = %?, + error = %?, + state_update_time = CURRENT_TIMESTAMP(), + end_time = CURRENT_TIMESTAMP() + where id = %? and state = %?`, + proto.TaskStateFailed, serializeErr(taskErr), taskID, currentState, + ) + return err +} + +// RevertedTask implements the scheduler.TaskManager interface. +func (mgr *TaskManager) RevertedTask(ctx context.Context, taskID int64) error { + _, err := mgr.ExecuteSQLWithNewSession(ctx, + `update mysql.tidb_global_task + set state = %?, + state_update_time = CURRENT_TIMESTAMP(), + end_time = CURRENT_TIMESTAMP() + where id = %? and state = %?`, + proto.TaskStateReverted, taskID, proto.TaskStateReverting, + ) + return err +} + +// PauseTask pauses the task. +func (mgr *TaskManager) PauseTask(ctx context.Context, taskKey string) (bool, error) { + found := false + err := mgr.WithNewSession(func(se sessionctx.Context) error { + _, err := sqlexec.ExecSQL(ctx, se, + `update mysql.tidb_global_task + set state = %?, + state_update_time = CURRENT_TIMESTAMP() + where task_key = %? and state in (%?, %?)`, + proto.TaskStatePausing, taskKey, proto.TaskStatePending, proto.TaskStateRunning, + ) + if err != nil { + return err + } + if se.GetSessionVars().StmtCtx.AffectedRows() != 0 { + found = true + } + return err + }) + if err != nil { + return found, err + } + return found, nil +} + +// PausedTask update the task state from pausing to paused. +func (mgr *TaskManager) PausedTask(ctx context.Context, taskID int64) error { + _, err := mgr.ExecuteSQLWithNewSession(ctx, + `update mysql.tidb_global_task + set state = %?, + state_update_time = CURRENT_TIMESTAMP(), + end_time = CURRENT_TIMESTAMP() + where id = %? and state = %?`, + proto.TaskStatePaused, taskID, proto.TaskStatePausing, + ) + return err +} + +// ResumeTask resumes the task. +func (mgr *TaskManager) ResumeTask(ctx context.Context, taskKey string) (bool, error) { + found := false + err := mgr.WithNewSession(func(se sessionctx.Context) error { + _, err := sqlexec.ExecSQL(ctx, se, + `update mysql.tidb_global_task + set state = %?, + state_update_time = CURRENT_TIMESTAMP() + where task_key = %? and state = %?`, + proto.TaskStateResuming, taskKey, proto.TaskStatePaused, + ) + if err != nil { + return err + } + if se.GetSessionVars().StmtCtx.AffectedRows() != 0 { + found = true + } + return err + }) + if err != nil { + return found, err + } + return found, nil +} + +// SucceedTask update task state from running to succeed. +func (mgr *TaskManager) SucceedTask(ctx context.Context, taskID int64) error { + return mgr.WithNewSession(func(se sessionctx.Context) error { + _, err := sqlexec.ExecSQL(ctx, se, ` + update mysql.tidb_global_task + set state = %?, + step = %?, + state_update_time = CURRENT_TIMESTAMP(), + end_time = CURRENT_TIMESTAMP() + where id = %? and state = %?`, + proto.TaskStateSucceed, proto.StepDone, taskID, proto.TaskStateRunning, + ) + return err + }) +} diff --git a/pkg/disttask/framework/storage/task_state_test.go b/pkg/disttask/framework/storage/task_state_test.go new file mode 100644 index 0000000000000..777d5477d1abe --- /dev/null +++ b/pkg/disttask/framework/storage/task_state_test.go @@ -0,0 +1,122 @@ +// Copyright 2023 PingCAP, 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. + +package storage_test + +import ( + "errors" + "testing" + + "github.com/pingcap/tidb/pkg/disttask/framework/proto" + "github.com/pingcap/tidb/pkg/disttask/framework/testutil" + "github.com/pingcap/tidb/pkg/kv" + "github.com/pingcap/tidb/pkg/sessionctx" + "github.com/stretchr/testify/require" + "github.com/tikv/client-go/v2/util" +) + +func TestTaskState(t *testing.T) { + _, gm, ctx := testutil.InitTableTest(t) + + require.NoError(t, gm.InitMeta(ctx, ":4000", "")) + + // 1. cancel task + id, err := gm.CreateTask(ctx, "key1", "test", 4, []byte("test")) + require.NoError(t, err) + require.Equal(t, int64(1), id) + require.NoError(t, gm.CancelTask(ctx, id)) + task, err := gm.GetTaskByID(ctx, id) + require.NoError(t, err) + require.Equal(t, proto.TaskStateCancelling, task.State) + + // 2. cancel task by key session + id, err = gm.CreateTask(ctx, "key2", "test", 4, []byte("test")) + require.NoError(t, err) + require.Equal(t, int64(2), id) + require.NoError(t, gm.WithNewTxn(ctx, func(se sessionctx.Context) error { + ctx = util.WithInternalSourceType(ctx, kv.InternalDistTask) + return gm.CancelTaskByKeySession(ctx, se, "key2") + })) + task, err = gm.GetTaskByID(ctx, id) + require.NoError(t, err) + require.Equal(t, proto.TaskStateCancelling, task.State) + + // 3. fail task + id, err = gm.CreateTask(ctx, "key3", "test", 4, []byte("test")) + require.NoError(t, err) + require.Equal(t, int64(3), id) + failedErr := errors.New("test err") + require.NoError(t, gm.FailTask(ctx, id, proto.TaskStatePending, failedErr)) + task, err = gm.GetTaskByID(ctx, id) + require.NoError(t, err) + require.Equal(t, proto.TaskStateFailed, task.State) + require.ErrorContains(t, task.Error, "test err") + + // 4. Reverted task + id, err = gm.CreateTask(ctx, "key4", "test", 4, []byte("test")) + require.NoError(t, err) + require.Equal(t, int64(4), id) + task, err = gm.GetTaskByID(ctx, 4) + require.NoError(t, err) + task.State = proto.TaskStateReverting + retryable, err := gm.UpdateTaskAndAddSubTasks(ctx, task, nil, proto.TaskStatePending) + require.NoError(t, err) + require.True(t, retryable) + + require.NoError(t, gm.RevertedTask(ctx, id)) + task, err = gm.GetTaskByID(ctx, id) + require.NoError(t, err) + require.Equal(t, proto.TaskStateReverted, task.State) + + // 5. pause task + id, err = gm.CreateTask(ctx, "key5", "test", 4, []byte("test")) + require.NoError(t, err) + require.Equal(t, int64(5), id) + found, err := gm.PauseTask(ctx, "key5") + require.NoError(t, err) + require.True(t, found) + task, err = gm.GetTaskByID(ctx, id) + require.NoError(t, err) + require.Equal(t, proto.TaskStatePausing, task.State) + + // 6. paused task + require.NoError(t, gm.PausedTask(ctx, id)) + task, err = gm.GetTaskByID(ctx, id) + require.NoError(t, err) + require.Equal(t, proto.TaskStatePaused, task.State) + + // 7. resume task + found, err = gm.ResumeTask(ctx, "key5") + require.NoError(t, err) + require.True(t, found) + task, err = gm.GetTaskByID(ctx, id) + require.NoError(t, err) + require.Equal(t, proto.TaskStateResuming, task.State) + + // 8. succeed task + id, err = gm.CreateTask(ctx, "key6", "test", 4, []byte("test")) + require.NoError(t, err) + require.Equal(t, int64(6), id) + task, err = gm.GetTaskByID(ctx, 6) + require.NoError(t, err) + task.State = proto.TaskStateRunning + retryable, err = gm.UpdateTaskAndAddSubTasks(ctx, task, nil, proto.TaskStatePending) + require.NoError(t, err) + require.True(t, retryable) + require.NoError(t, gm.SucceedTask(ctx, id)) + task, err = gm.GetTaskByID(ctx, id) + require.NoError(t, err) + require.Equal(t, proto.TaskStateSucceed, task.State) + require.Equal(t, proto.StepDone, task.Step) +} diff --git a/pkg/disttask/framework/storage/task_table.go b/pkg/disttask/framework/storage/task_table.go index 9a1d7ccc04959..524212b903c95 100644 --- a/pkg/disttask/framework/storage/task_table.go +++ b/pkg/disttask/framework/storage/task_table.go @@ -16,29 +16,61 @@ package storage import ( "context" - "fmt" "strconv" "strings" "sync/atomic" - "time" + "github.com/docker/go-units" "github.com/ngaut/pools" "github.com/pingcap/errors" "github.com/pingcap/failpoint" "github.com/pingcap/tidb/pkg/disttask/framework/proto" "github.com/pingcap/tidb/pkg/kv" - "github.com/pingcap/tidb/pkg/parser/terror" "github.com/pingcap/tidb/pkg/sessionctx" + "github.com/pingcap/tidb/pkg/sessionctx/variable" "github.com/pingcap/tidb/pkg/util/chunk" "github.com/pingcap/tidb/pkg/util/intest" - "github.com/pingcap/tidb/pkg/util/logutil" "github.com/pingcap/tidb/pkg/util/sqlescape" "github.com/pingcap/tidb/pkg/util/sqlexec" "github.com/tikv/client-go/v2/util" - "go.uber.org/zap" ) -const defaultSubtaskKeepDays = 14 +const ( + defaultSubtaskKeepDays = 14 + + basicTaskColumns = `id, task_key, type, state, step, priority, concurrency, create_time` + // TaskColumns is the columns for task. + // TODO: dispatcher_id will update to scheduler_id later + TaskColumns = basicTaskColumns + `, start_time, state_update_time, meta, dispatcher_id, error` + // InsertTaskColumns is the columns used in insert task. + InsertTaskColumns = `task_key, type, state, priority, concurrency, step, meta, create_time` + basicSubtaskColumns = `id, step, task_key, type, exec_id, state, concurrency, create_time, ordinal` + // SubtaskColumns is the columns for subtask. + SubtaskColumns = basicSubtaskColumns + `, start_time, state_update_time, meta, summary` + // InsertSubtaskColumns is the columns used in insert subtask. + InsertSubtaskColumns = `step, task_key, exec_id, meta, state, type, concurrency, ordinal, create_time, checkpoint, summary` +) + +var ( + maxSubtaskBatchSize = 16 * units.MiB + + // ErrUnstableSubtasks is the error when we detected that the subtasks are + // unstable, i.e. count, order and content of the subtasks are changed on + // different call. + ErrUnstableSubtasks = errors.New("unstable subtasks") + + // ErrTaskNotFound is the error when we can't found task. + // i.e. TransferTasks2History move task from tidb_global_task to tidb_global_task_history. + ErrTaskNotFound = errors.New("task not found") + + // ErrTaskAlreadyExists is the error when we submit a task with the same task key. + // i.e. SubmitTask in handle may submit a task twice. + ErrTaskAlreadyExists = errors.New("task already exists") + + // ErrSubtaskNotFound is the error when can't find subtask by subtask_id and execId, + // i.e. scheduler change the subtask's execId when subtask need to balance to other nodes. + ErrSubtaskNotFound = errors.New("subtask not found") +) // SessionExecutor defines the interface for executing SQLs in a session. type SessionExecutor interface { @@ -48,7 +80,15 @@ type SessionExecutor interface { WithNewTxn(ctx context.Context, fn func(se sessionctx.Context) error) error } -// TaskManager is the manager of global/sub task. +// TaskHandle provides the interface for operations needed by Scheduler. +// Then we can use scheduler's function in Scheduler interface. +type TaskHandle interface { + // GetPreviousSubtaskMetas gets previous subtask metas. + GetPreviousSubtaskMetas(taskID int64, step proto.Step) ([][]byte, error) + SessionExecutor +} + +// TaskManager is the manager of task and subtask. type TaskManager struct { sePool sessionPool } @@ -78,7 +118,7 @@ func NewTaskManager(sePool sessionPool) *TaskManager { func GetTaskManager() (*TaskManager, error) { v := taskManagerInstance.Load() if v == nil { - return nil, errors.New("global task manager is not initialized") + return nil, errors.New("task manager is not initialized") } return v, nil } @@ -88,64 +128,21 @@ func SetTaskManager(is *TaskManager) { taskManagerInstance.Store(is) } -// ExecSQL executes the sql and returns the result. -// TODO: consider retry. -func ExecSQL(ctx context.Context, se sessionctx.Context, sql string, args ...interface{}) ([]chunk.Row, error) { - rs, err := se.(sqlexec.SQLExecutor).ExecuteInternal(ctx, sql, args...) - if err != nil { - return nil, err - } - if rs != nil { - defer terror.Call(rs.Close) - return sqlexec.DrainRecordSet(ctx, rs, 1024) - } - return nil, nil -} - -// row2GlobeTask converts a row to a global task. -func row2GlobeTask(r chunk.Row) *proto.Task { - task := &proto.Task{ - ID: r.GetInt64(0), - Key: r.GetString(1), - Type: proto.TaskType(r.GetString(2)), - DispatcherID: r.GetString(3), - State: proto.TaskState(r.GetString(4)), - Meta: r.GetBytes(7), - Concurrency: uint64(r.GetInt64(8)), - Step: proto.Step(r.GetInt64(9)), - } - if !r.IsNull(10) { - errBytes := r.GetBytes(10) - stdErr := errors.Normalize("") - err := stdErr.UnmarshalJSON(errBytes) - if err != nil { - logutil.BgLogger().Error("unmarshal error", zap.Error(err)) - task.Error = err - } else { - task.Error = stdErr - } - } - // TODO: convert to local time. - task.StartTime, _ = r.GetTime(5).GoTime(time.UTC) - task.StateUpdateTime, _ = r.GetTime(6).GoTime(time.UTC) - return task -} - // WithNewSession executes the function with a new session. -func (stm *TaskManager) WithNewSession(fn func(se sessionctx.Context) error) error { - se, err := stm.sePool.Get() +func (mgr *TaskManager) WithNewSession(fn func(se sessionctx.Context) error) error { + se, err := mgr.sePool.Get() if err != nil { return err } - defer stm.sePool.Put(se) + defer mgr.sePool.Put(se) return fn(se.(sessionctx.Context)) } // WithNewTxn executes the fn in a new transaction. -func (stm *TaskManager) WithNewTxn(ctx context.Context, fn func(se sessionctx.Context) error) error { +func (mgr *TaskManager) WithNewTxn(ctx context.Context, fn func(se sessionctx.Context) error) error { ctx = util.WithInternalSourceType(ctx, kv.InternalDistTask) - return stm.WithNewSession(func(se sessionctx.Context) (err error) { - _, err = ExecSQL(ctx, se, "begin") + return mgr.WithNewSession(func(se sessionctx.Context) (err error) { + _, err = sqlexec.ExecSQL(ctx, se, "begin") if err != nil { return err } @@ -156,7 +153,7 @@ func (stm *TaskManager) WithNewTxn(ctx context.Context, fn func(se sessionctx.Co if success { sql = "commit" } - _, commitErr := ExecSQL(ctx, se, sql) + _, commitErr := sqlexec.ExecSQL(ctx, se, sql) if err == nil && commitErr != nil { err = commitErr } @@ -171,9 +168,10 @@ func (stm *TaskManager) WithNewTxn(ctx context.Context, fn func(se sessionctx.Co }) } -func (stm *TaskManager) executeSQLWithNewSession(ctx context.Context, sql string, args ...interface{}) (rs []chunk.Row, err error) { - err = stm.WithNewSession(func(se sessionctx.Context) error { - rs, err = ExecSQL(ctx, se, sql, args...) +// ExecuteSQLWithNewSession executes one SQL with new session. +func (mgr *TaskManager) ExecuteSQLWithNewSession(ctx context.Context, sql string, args ...interface{}) (rs []chunk.Row, err error) { + err = mgr.WithNewSession(func(se sessionctx.Context) error { + rs, err = sqlexec.ExecSQL(ctx, se, sql, args...) return err }) @@ -184,27 +182,34 @@ func (stm *TaskManager) executeSQLWithNewSession(ctx context.Context, sql string return } -// AddNewGlobalTask adds a new task to global task table. -func (stm *TaskManager) AddNewGlobalTask(ctx context.Context, key string, tp proto.TaskType, concurrency int, meta []byte) (taskID int64, err error) { - err = stm.WithNewSession(func(se sessionctx.Context) error { +// CreateTask adds a new task to task table. +func (mgr *TaskManager) CreateTask(ctx context.Context, key string, tp proto.TaskType, concurrency int, meta []byte) (taskID int64, err error) { + err = mgr.WithNewSession(func(se sessionctx.Context) error { var err2 error - taskID, err2 = stm.AddGlobalTaskWithSession(ctx, se, key, tp, concurrency, meta) + taskID, err2 = mgr.CreateTaskWithSession(ctx, se, key, tp, concurrency, meta) return err2 }) return } -// AddGlobalTaskWithSession adds a new task to global task table with session. -func (stm *TaskManager) AddGlobalTaskWithSession(ctx context.Context, se sessionctx.Context, key string, tp proto.TaskType, concurrency int, meta []byte) (taskID int64, err error) { - _, err = ExecSQL(ctx, se, - `insert into mysql.tidb_global_task(task_key, type, state, concurrency, step, meta, start_time, state_update_time) - values (%?, %?, %?, %?, %?, %?, CURRENT_TIMESTAMP(), CURRENT_TIMESTAMP())`, - key, tp, proto.TaskStatePending, concurrency, proto.StepInit, meta) +// CreateTaskWithSession adds a new task to task table with session. +func (mgr *TaskManager) CreateTaskWithSession(ctx context.Context, se sessionctx.Context, key string, tp proto.TaskType, concurrency int, meta []byte) (taskID int64, err error) { + cpuCount, err := mgr.getCPUCountOfManagedNode(ctx, se) + if err != nil { + return 0, err + } + if concurrency > cpuCount { + return 0, errors.Errorf("task concurrency(%d) larger than cpu count(%d) of managed node", concurrency, cpuCount) + } + _, err = sqlexec.ExecSQL(ctx, se, ` + insert into mysql.tidb_global_task(`+InsertTaskColumns+`) + values (%?, %?, %?, %?, %?, %?, %?, CURRENT_TIMESTAMP())`, + key, tp, proto.TaskStatePending, proto.NormalPriority, concurrency, proto.StepInit, meta) if err != nil { return 0, err } - rs, err := ExecSQL(ctx, se, "select @@last_insert_id") + rs, err := sqlexec.ExecSQL(ctx, se, "select @@last_insert_id") if err != nil { return 0, err } @@ -215,163 +220,112 @@ func (stm *TaskManager) AddGlobalTaskWithSession(ctx context.Context, se session return taskID, nil } -// GetNewGlobalTask get a new task from global task table, it's used by dispatcher only. -func (stm *TaskManager) GetNewGlobalTask(ctx context.Context) (task *proto.Task, err error) { - rs, err := stm.executeSQLWithNewSession(ctx, "select id, task_key, type, dispatcher_id, state, start_time, state_update_time, meta, concurrency, step, error from mysql.tidb_global_task where state = %? limit 1", proto.TaskStatePending) - if err != nil { - return task, err - } - - if len(rs) == 0 { - return nil, nil - } - - return row2GlobeTask(rs[0]), nil -} - -// GetGlobalTasksInStates gets the tasks in the states. -func (stm *TaskManager) GetGlobalTasksInStates(ctx context.Context, states ...interface{}) (task []*proto.Task, err error) { - if len(states) == 0 { - return task, nil - } - - rs, err := stm.executeSQLWithNewSession(ctx, "select id, task_key, type, dispatcher_id, state, start_time, state_update_time, meta, concurrency, step, error from mysql.tidb_global_task where state in ("+strings.Repeat("%?,", len(states)-1)+"%?)", states...) +// GetTopUnfinishedTasks implements the scheduler.TaskManager interface. +func (mgr *TaskManager) GetTopUnfinishedTasks(ctx context.Context) (task []*proto.Task, err error) { + rs, err := mgr.ExecuteSQLWithNewSession(ctx, + `select `+basicTaskColumns+` from mysql.tidb_global_task + where state in (%?, %?, %?, %?, %?, %?) + order by priority asc, create_time asc, id asc + limit %?`, + proto.TaskStatePending, + proto.TaskStateRunning, + proto.TaskStateReverting, + proto.TaskStateCancelling, + proto.TaskStatePausing, + proto.TaskStateResuming, + proto.MaxConcurrentTask*2, + ) if err != nil { return task, err } for _, r := range rs { - task = append(task, row2GlobeTask(r)) + task = append(task, row2TaskBasic(r)) } return task, nil } -// GetGlobalTasksFromHistoryInStates gets the tasks in history table in the states. -func (stm *TaskManager) GetGlobalTasksFromHistoryInStates(ctx context.Context, states ...interface{}) (task []*proto.Task, err error) { +// GetTasksInStates gets the tasks in the states(order by priority asc, create_time acs, id asc). +func (mgr *TaskManager) GetTasksInStates(ctx context.Context, states ...interface{}) (task []*proto.Task, err error) { if len(states) == 0 { return task, nil } - rs, err := stm.executeSQLWithNewSession(ctx, "select id, task_key, type, dispatcher_id, state, start_time, state_update_time, meta, concurrency, step, error from mysql.tidb_global_task_history where state in ("+strings.Repeat("%?,", len(states)-1)+"%?)", states...) + rs, err := mgr.ExecuteSQLWithNewSession(ctx, + "select "+TaskColumns+" from mysql.tidb_global_task "+ + "where state in ("+strings.Repeat("%?,", len(states)-1)+"%?)"+ + " order by priority asc, create_time asc, id asc", states...) if err != nil { return task, err } for _, r := range rs { - task = append(task, row2GlobeTask(r)) + task = append(task, Row2Task(r)) } return task, nil } -// GetGlobalTaskByID gets the task by the global task ID. -func (stm *TaskManager) GetGlobalTaskByID(ctx context.Context, taskID int64) (task *proto.Task, err error) { - rs, err := stm.executeSQLWithNewSession(ctx, "select id, task_key, type, dispatcher_id, state, start_time, state_update_time, meta, concurrency, step, error from mysql.tidb_global_task where id = %?", taskID) +// GetTaskByID gets the task by the task ID. +func (mgr *TaskManager) GetTaskByID(ctx context.Context, taskID int64) (task *proto.Task, err error) { + rs, err := mgr.ExecuteSQLWithNewSession(ctx, "select "+TaskColumns+" from mysql.tidb_global_task where id = %?", taskID) if err != nil { return task, err } if len(rs) == 0 { - return nil, nil + return nil, ErrTaskNotFound } - return row2GlobeTask(rs[0]), nil + return Row2Task(rs[0]), nil } -// GetTaskByIDWithHistory gets the task by the global task ID from both tidb_global_task and tidb_global_task_history. -func (stm *TaskManager) GetTaskByIDWithHistory(ctx context.Context, taskID int64) (task *proto.Task, err error) { - rs, err := stm.executeSQLWithNewSession(ctx, "select id, task_key, type, dispatcher_id, state, start_time, state_update_time, meta, concurrency, step, error from mysql.tidb_global_task where id = %? "+ - "union select id, task_key, type, dispatcher_id, state, start_time, state_update_time, meta, concurrency, step, error from mysql.tidb_global_task_history where id = %?", taskID, taskID) +// GetTaskByIDWithHistory gets the task by the task ID from both tidb_global_task and tidb_global_task_history. +func (mgr *TaskManager) GetTaskByIDWithHistory(ctx context.Context, taskID int64) (task *proto.Task, err error) { + rs, err := mgr.ExecuteSQLWithNewSession(ctx, "select "+TaskColumns+" from mysql.tidb_global_task where id = %? "+ + "union select "+TaskColumns+" from mysql.tidb_global_task_history where id = %?", taskID, taskID) if err != nil { return task, err } if len(rs) == 0 { - return nil, nil + return nil, ErrTaskNotFound } - return row2GlobeTask(rs[0]), nil + return Row2Task(rs[0]), nil } -// GetGlobalTaskByKey gets the task by the task key. -func (stm *TaskManager) GetGlobalTaskByKey(ctx context.Context, key string) (task *proto.Task, err error) { - rs, err := stm.executeSQLWithNewSession(ctx, "select id, task_key, type, dispatcher_id, state, start_time, state_update_time, meta, concurrency, step, error from mysql.tidb_global_task where task_key = %?", key) +// GetTaskByKey gets the task by the task key. +func (mgr *TaskManager) GetTaskByKey(ctx context.Context, key string) (task *proto.Task, err error) { + rs, err := mgr.ExecuteSQLWithNewSession(ctx, "select "+TaskColumns+" from mysql.tidb_global_task where task_key = %?", key) if err != nil { return task, err } if len(rs) == 0 { - return nil, nil + return nil, ErrTaskNotFound } - return row2GlobeTask(rs[0]), nil + return Row2Task(rs[0]), nil } -// GetGlobalTaskByKeyWithHistory gets the task from history table by the task key. -func (stm *TaskManager) GetGlobalTaskByKeyWithHistory(ctx context.Context, key string) (task *proto.Task, err error) { - rs, err := stm.executeSQLWithNewSession(ctx, "select id, task_key, type, dispatcher_id, state, start_time, state_update_time, meta, concurrency, step, error from mysql.tidb_global_task where task_key = %?"+ - "union select id, task_key, type, dispatcher_id, state, start_time, state_update_time, meta, concurrency, step, error from mysql.tidb_global_task_history where task_key = %?", key, key) +// GetTaskByKeyWithHistory gets the task from history table by the task key. +func (mgr *TaskManager) GetTaskByKeyWithHistory(ctx context.Context, key string) (task *proto.Task, err error) { + rs, err := mgr.ExecuteSQLWithNewSession(ctx, "select "+TaskColumns+" from mysql.tidb_global_task where task_key = %?"+ + "union select "+TaskColumns+" from mysql.tidb_global_task_history where task_key = %?", key, key) if err != nil { return task, err } if len(rs) == 0 { - return nil, nil + return nil, ErrTaskNotFound } - return row2GlobeTask(rs[0]), nil -} - -// row2SubTask converts a row to a subtask. -func row2SubTask(r chunk.Row) *proto.Subtask { - // subtask defines start/update time as bigint, to ensure backward compatible, - // we keep it that way, and we convert it here. - var startTime, updateTime time.Time - if !r.IsNull(10) { - ts := r.GetInt64(10) - startTime = time.Unix(ts, 0) - } - if !r.IsNull(11) { - ts := r.GetInt64(11) - updateTime = time.Unix(ts, 0) - } - task := &proto.Subtask{ - ID: r.GetInt64(0), - Step: proto.Step(r.GetInt64(1)), - Type: proto.Int2Type(int(r.GetInt64(5))), - SchedulerID: r.GetString(6), - State: proto.TaskState(r.GetString(8)), - Meta: r.GetBytes(12), - Summary: r.GetString(14), - StartTime: startTime, - UpdateTime: updateTime, - } - tid, err := strconv.Atoi(r.GetString(3)) - if err != nil { - logutil.BgLogger().Warn("unexpected task ID", zap.String("task ID", r.GetString(3))) - } - task.TaskID = int64(tid) - return task + return Row2Task(rs[0]), nil } -// AddNewSubTask adds a new task to subtask table. -func (stm *TaskManager) AddNewSubTask(ctx context.Context, globalTaskID int64, step proto.Step, designatedTiDBID string, meta []byte, tp proto.TaskType, isRevert bool) error { - st := proto.TaskStatePending - if isRevert { - st = proto.TaskStateRevertPending - } - - _, err := stm.executeSQLWithNewSession(ctx, `insert into mysql.tidb_background_subtask - (task_key, step, exec_id, meta, state, type, checkpoint, summary) - values (%?, %?, %?, %?, %?, %?, %?, %?)`, - globalTaskID, step, designatedTiDBID, meta, st, proto.Type2Int(tp), []byte{}, "{}") - if err != nil { - return err +// GetSubtasksByExecIDAndStepAndStates gets all subtasks by given states on one node. +func (mgr *TaskManager) GetSubtasksByExecIDAndStepAndStates(ctx context.Context, execID string, taskID int64, step proto.Step, states ...proto.SubtaskState) ([]*proto.Subtask, error) { + args := []interface{}{execID, taskID, step} + for _, state := range states { + args = append(args, state) } - - return nil -} - -// GetSubtasksInStates gets all subtasks by given states. -func (stm *TaskManager) GetSubtasksInStates(ctx context.Context, tidbID string, taskID int64, step proto.Step, states ...interface{}) ([]*proto.Subtask, error) { - args := []interface{}{tidbID, taskID, step} - args = append(args, states...) - rs, err := stm.executeSQLWithNewSession(ctx, `select * from mysql.tidb_background_subtask + rs, err := mgr.ExecuteSQLWithNewSession(ctx, `select `+SubtaskColumns+` from mysql.tidb_background_subtask where exec_id = %? and task_key = %? and step = %? and state in (`+strings.Repeat("%?,", len(states)-1)+"%?)", args...) if err != nil { @@ -380,16 +334,18 @@ func (stm *TaskManager) GetSubtasksInStates(ctx context.Context, tidbID string, subtasks := make([]*proto.Subtask, len(rs)) for i, row := range rs { - subtasks[i] = row2SubTask(row) + subtasks[i] = Row2SubTask(row) } return subtasks, nil } // GetFirstSubtaskInStates gets the first subtask by given states. -func (stm *TaskManager) GetFirstSubtaskInStates(ctx context.Context, tidbID string, taskID int64, step proto.Step, states ...interface{}) (*proto.Subtask, error) { +func (mgr *TaskManager) GetFirstSubtaskInStates(ctx context.Context, tidbID string, taskID int64, step proto.Step, states ...proto.SubtaskState) (*proto.Subtask, error) { args := []interface{}{tidbID, taskID, step} - args = append(args, states...) - rs, err := stm.executeSQLWithNewSession(ctx, `select * from mysql.tidb_background_subtask + for _, state := range states { + args = append(args, state) + } + rs, err := mgr.ExecuteSQLWithNewSession(ctx, `select `+SubtaskColumns+` from mysql.tidb_background_subtask where exec_id = %? and task_key = %? and step = %? and state in (`+strings.Repeat("%?,", len(states)-1)+"%?) limit 1", args...) if err != nil { @@ -399,58 +355,30 @@ func (stm *TaskManager) GetFirstSubtaskInStates(ctx context.Context, tidbID stri if len(rs) == 0 { return nil, nil } - return row2SubTask(rs[0]), nil + return Row2SubTask(rs[0]), nil } -// UpdateSubtaskExecID updates the subtask's exec_id, used for testing now. -func (stm *TaskManager) UpdateSubtaskExecID(ctx context.Context, tidbID string, subtaskID int64) error { - _, err := stm.executeSQLWithNewSession(ctx, `update mysql.tidb_background_subtask - set exec_id = %?, state_update_time = unix_timestamp() where id = %?`, - tidbID, subtaskID) - return err -} - -// UpdateErrorToSubtask updates the error to subtask. -func (stm *TaskManager) UpdateErrorToSubtask(ctx context.Context, tidbID string, taskID int64, err error) error { - if err == nil { - return nil +// GetActiveSubtasks implements TaskManager.GetActiveSubtasks. +func (mgr *TaskManager) GetActiveSubtasks(ctx context.Context, taskID int64) ([]*proto.Subtask, error) { + rs, err := mgr.ExecuteSQLWithNewSession(ctx, ` + select `+basicSubtaskColumns+` from mysql.tidb_background_subtask + where task_key = %? and state in (%?, %?)`, + taskID, proto.SubtaskStatePending, proto.SubtaskStateRunning) + if err != nil { + return nil, err } - _, err1 := stm.executeSQLWithNewSession(ctx, `update mysql.tidb_background_subtask - set state = %?, error = %?, start_time = unix_timestamp(), state_update_time = unix_timestamp() - where exec_id = %? and task_key = %? and state in (%?, %?) limit 1;`, - proto.TaskStateFailed, serializeErr(err), tidbID, taskID, proto.TaskStatePending, proto.TaskStateRunning) - return err1 -} - -// PrintSubtaskInfo log the subtask info by taskKey. Only used for UT. -func (stm *TaskManager) PrintSubtaskInfo(ctx context.Context, taskID int64) { - rs, _ := stm.executeSQLWithNewSession(ctx, - "select * from mysql.tidb_background_subtask_history where task_key = %?", taskID) - rs2, _ := stm.executeSQLWithNewSession(ctx, - "select * from mysql.tidb_background_subtask where task_key = %?", taskID) - rs = append(rs, rs2...) - + subtasks := make([]*proto.Subtask, 0, len(rs)) for _, r := range rs { - errBytes := r.GetBytes(13) - var err error - if len(errBytes) > 0 { - stdErr := errors.Normalize("") - err1 := stdErr.UnmarshalJSON(errBytes) - if err1 != nil { - err = err1 - } else { - err = stdErr - } - } - logutil.BgLogger().Info(fmt.Sprintf("subTask: %v\n", row2SubTask(r)), zap.Error(err)) + subtasks = append(subtasks, row2BasicSubTask(r)) } + return subtasks, nil } -// GetSucceedSubtasksByStep gets the subtask in the success state. -func (stm *TaskManager) GetSucceedSubtasksByStep(ctx context.Context, taskID int64, step proto.Step) ([]*proto.Subtask, error) { - rs, err := stm.executeSQLWithNewSession(ctx, `select * from mysql.tidb_background_subtask +// GetAllSubtasksByStepAndState gets the subtask by step and state. +func (mgr *TaskManager) GetAllSubtasksByStepAndState(ctx context.Context, taskID int64, step proto.Step, state proto.SubtaskState) ([]*proto.Subtask, error) { + rs, err := mgr.ExecuteSQLWithNewSession(ctx, `select `+SubtaskColumns+` from mysql.tidb_background_subtask where task_key = %? and state = %? and step = %?`, - taskID, proto.TaskStateSucceed, step) + taskID, state, step) if err != nil { return nil, err } @@ -459,14 +387,14 @@ func (stm *TaskManager) GetSucceedSubtasksByStep(ctx context.Context, taskID int } subtasks := make([]*proto.Subtask, 0, len(rs)) for _, r := range rs { - subtasks = append(subtasks, row2SubTask(r)) + subtasks = append(subtasks, Row2SubTask(r)) } return subtasks, nil } // GetSubtaskRowCount gets the subtask row count. -func (stm *TaskManager) GetSubtaskRowCount(ctx context.Context, taskID int64, step proto.Step) (int64, error) { - rs, err := stm.executeSQLWithNewSession(ctx, `select +func (mgr *TaskManager) GetSubtaskRowCount(ctx context.Context, taskID int64, step proto.Step) (int64, error) { + rs, err := mgr.ExecuteSQLWithNewSession(ctx, `select cast(sum(json_extract(summary, '$.row_count')) as signed) as row_count from mysql.tidb_background_subtask where task_key = %? and step = %?`, taskID, step) @@ -480,31 +408,40 @@ func (stm *TaskManager) GetSubtaskRowCount(ctx context.Context, taskID int64, st } // UpdateSubtaskRowCount updates the subtask row count. -func (stm *TaskManager) UpdateSubtaskRowCount(ctx context.Context, subtaskID int64, rowCount int64) error { - _, err := stm.executeSQLWithNewSession(ctx, `update mysql.tidb_background_subtask +func (mgr *TaskManager) UpdateSubtaskRowCount(ctx context.Context, subtaskID int64, rowCount int64) error { + _, err := mgr.ExecuteSQLWithNewSession(ctx, + `update mysql.tidb_background_subtask set summary = json_set(summary, '$.row_count', %?) where id = %?`, rowCount, subtaskID) return err } -// GetSubtaskInStatesCnt gets the subtask count in the states. -func (stm *TaskManager) GetSubtaskInStatesCnt(ctx context.Context, taskID int64, states ...interface{}) (int64, error) { - args := []interface{}{taskID} - args = append(args, states...) - rs, err := stm.executeSQLWithNewSession(ctx, `select count(*) from mysql.tidb_background_subtask - where task_key = %? and state in (`+strings.Repeat("%?,", len(states)-1)+"%?)", args...) +// GetSubtaskCntGroupByStates gets the subtask count by states. +func (mgr *TaskManager) GetSubtaskCntGroupByStates(ctx context.Context, taskID int64, step proto.Step) (map[proto.SubtaskState]int64, error) { + rs, err := mgr.ExecuteSQLWithNewSession(ctx, ` + select state, count(*) + from mysql.tidb_background_subtask + where task_key = %? and step = %? + group by state`, + taskID, step) if err != nil { - return 0, err + return nil, err } - return rs[0].GetInt64(0), nil + res := make(map[proto.SubtaskState]int64, len(rs)) + for _, r := range rs { + state := proto.SubtaskState(r.GetString(0)) + res[state] = r.GetInt64(1) + } + + return res, nil } -// CollectSubTaskError collects the subtask error. -func (stm *TaskManager) CollectSubTaskError(ctx context.Context, taskID int64) ([]error, error) { - rs, err := stm.executeSQLWithNewSession(ctx, +// GetSubtaskErrors gets subtasks' errors. +func (mgr *TaskManager) GetSubtaskErrors(ctx context.Context, taskID int64) ([]error, error) { + rs, err := mgr.ExecuteSQLWithNewSession(ctx, `select error from mysql.tidb_background_subtask - where task_key = %? AND state in (%?, %?)`, taskID, proto.TaskStateFailed, proto.TaskStateCanceled) + where task_key = %? AND state in (%?, %?)`, taskID, proto.SubtaskStateFailed, proto.SubtaskStateCanceled) if err != nil { return nil, err } @@ -531,10 +468,12 @@ func (stm *TaskManager) CollectSubTaskError(ctx context.Context, taskID int64) ( } // HasSubtasksInStates checks if there are subtasks in the states. -func (stm *TaskManager) HasSubtasksInStates(ctx context.Context, tidbID string, taskID int64, step proto.Step, states ...interface{}) (bool, error) { +func (mgr *TaskManager) HasSubtasksInStates(ctx context.Context, tidbID string, taskID int64, step proto.Step, states ...proto.SubtaskState) (bool, error) { args := []interface{}{tidbID, taskID, step} - args = append(args, states...) - rs, err := stm.executeSQLWithNewSession(ctx, `select 1 from mysql.tidb_background_subtask + for _, state := range states { + args = append(args, state) + } + rs, err := mgr.ExecuteSQLWithNewSession(ctx, `select 1 from mysql.tidb_background_subtask where exec_id = %? and task_key = %? and step = %? and state in (`+strings.Repeat("%?,", len(states)-1)+"%?) limit 1", args...) if err != nil { @@ -544,72 +483,10 @@ func (stm *TaskManager) HasSubtasksInStates(ctx context.Context, tidbID string, return len(rs) > 0, nil } -// StartSubtask updates the subtask state to running. -func (stm *TaskManager) StartSubtask(ctx context.Context, subtaskID int64) error { - _, err := stm.executeSQLWithNewSession(ctx, `update mysql.tidb_background_subtask - set state = %?, start_time = unix_timestamp(), state_update_time = unix_timestamp() - where id = %?`, - proto.TaskStateRunning, subtaskID) - return err -} - -// StartManager insert the manager information into dist_framework_meta. -func (stm *TaskManager) StartManager(ctx context.Context, tidbID string, role string) error { - _, err := stm.executeSQLWithNewSession(ctx, `replace into mysql.dist_framework_meta values(%?, %?, DEFAULT)`, tidbID, role) - return err -} - -// UpdateSubtaskStateAndError updates the subtask state. -func (stm *TaskManager) UpdateSubtaskStateAndError(ctx context.Context, tidbID string, id int64, state proto.TaskState, subTaskErr error) error { - _, err := stm.executeSQLWithNewSession(ctx, `update mysql.tidb_background_subtask - set state = %?, error = %?, state_update_time = unix_timestamp() where id = %? and exec_id = %?`, - state, serializeErr(subTaskErr), id, tidbID) - return err -} - -// FinishSubtask updates the subtask meta and mark state to succeed. -func (stm *TaskManager) FinishSubtask(ctx context.Context, tidbID string, id int64, meta []byte) error { - _, err := stm.executeSQLWithNewSession(ctx, `update mysql.tidb_background_subtask - set meta = %?, state = %?, state_update_time = unix_timestamp() where id = %? and exec_id = %?`, - meta, proto.TaskStateSucceed, id, tidbID) - return err -} - -// DeleteSubtasksByTaskID deletes the subtask of the given global task ID. -func (stm *TaskManager) DeleteSubtasksByTaskID(ctx context.Context, taskID int64) error { - _, err := stm.executeSQLWithNewSession(ctx, `delete from mysql.tidb_background_subtask +// GetTaskExecutorIDsByTaskID gets the task executor IDs of the given task ID. +func (mgr *TaskManager) GetTaskExecutorIDsByTaskID(ctx context.Context, taskID int64) ([]string, error) { + rs, err := mgr.ExecuteSQLWithNewSession(ctx, `select distinct(exec_id) from mysql.tidb_background_subtask where task_key = %?`, taskID) - if err != nil { - return err - } - - return nil -} - -// GetSchedulerIDsByTaskID gets the scheduler IDs of the given global task ID. -func (stm *TaskManager) GetSchedulerIDsByTaskID(ctx context.Context, taskID int64) ([]string, error) { - rs, err := stm.executeSQLWithNewSession(ctx, `select distinct(exec_id) from mysql.tidb_background_subtask - where task_key = %?`, taskID) - if err != nil { - return nil, err - } - if len(rs) == 0 { - return nil, nil - } - - instanceIDs := make([]string, 0, len(rs)) - for _, r := range rs { - id := r.GetString(0) - instanceIDs = append(instanceIDs, id) - } - - return instanceIDs, nil -} - -// GetSchedulerIDsByTaskIDAndStep gets the scheduler IDs of the given global task ID and step. -func (stm *TaskManager) GetSchedulerIDsByTaskIDAndStep(ctx context.Context, taskID int64, step proto.Step) ([]string, error) { - rs, err := stm.executeSQLWithNewSession(ctx, `select distinct(exec_id) from mysql.tidb_background_subtask - where task_key = %? and step = %?`, taskID, step) if err != nil { return nil, err } @@ -626,102 +503,175 @@ func (stm *TaskManager) GetSchedulerIDsByTaskIDAndStep(ctx context.Context, task return instanceIDs, nil } -// IsSchedulerCanceled checks if subtask 'execID' of task 'taskID' has been canceled somehow. -func (stm *TaskManager) IsSchedulerCanceled(ctx context.Context, execID string, taskID int64) (bool, error) { - rs, err := stm.executeSQLWithNewSession(ctx, "select 1 from mysql.tidb_background_subtask where task_key = %? and exec_id = %?", taskID, execID) - if err != nil { - return false, err - } - return len(rs) == 0, nil -} - -// UpdateFailedSchedulerIDs replace failed scheduler nodes with alive nodes. -func (stm *TaskManager) UpdateFailedSchedulerIDs(ctx context.Context, taskID int64, replaceNodes map[string]string) error { - // skip - if len(replaceNodes) == 0 { +// UpdateSubtasksExecIDs update subtasks' execID. +func (mgr *TaskManager) UpdateSubtasksExecIDs(ctx context.Context, subtasks []*proto.Subtask) error { + // skip the update process. + if len(subtasks) == 0 { return nil } - - sql := new(strings.Builder) - if err := sqlescape.FormatSQL(sql, "update mysql.tidb_background_subtask set state = %? ,exec_id = (case ", proto.TaskStatePending); err != nil { - return err - } - for k, v := range replaceNodes { - if err := sqlescape.FormatSQL(sql, "when exec_id = %? then %? ", k, v); err != nil { - return err + err := mgr.WithNewTxn(ctx, func(se sessionctx.Context) error { + for _, subtask := range subtasks { + _, err := sqlexec.ExecSQL(ctx, se, ` + update mysql.tidb_background_subtask + set exec_id = %? + where id = %? and state = %?`, + subtask.ExecID, subtask.ID, subtask.State) + if err != nil { + return err + } } - } - if err := sqlescape.FormatSQL(sql, " end) where task_key = %? and state != \"succeed\" and exec_id in (", taskID); err != nil { - return err - } - i := 0 - for k := range replaceNodes { - if i != 0 { - if err := sqlescape.FormatSQL(sql, ","); err != nil { + return nil + }) + return err +} + +// SwitchTaskStep implements the dispatcher.TaskManager interface. +func (mgr *TaskManager) SwitchTaskStep( + ctx context.Context, + task *proto.Task, + nextState proto.TaskState, + nextStep proto.Step, + subtasks []*proto.Subtask, +) error { + return mgr.WithNewTxn(ctx, func(se sessionctx.Context) error { + vars := se.GetSessionVars() + if vars.MemQuotaQuery < variable.DefTiDBMemQuotaQuery { + bak := vars.MemQuotaQuery + if err := vars.SetSystemVar(variable.TiDBMemQuotaQuery, + strconv.Itoa(variable.DefTiDBMemQuotaQuery)); err != nil { return err } + defer func() { + _ = vars.SetSystemVar(variable.TiDBMemQuotaQuery, strconv.Itoa(int(bak))) + }() } - if err := sqlescape.FormatSQL(sql, "%?", k); err != nil { + err := mgr.updateTaskStateStep(ctx, se, task, nextState, nextStep) + if err != nil { return err } - i++ - } - if err := sqlescape.FormatSQL(sql, ")"); err != nil { - return err - } + if vars.StmtCtx.AffectedRows() == 0 { + // on network partition or owner change, there might be multiple + // schedulers for the same task, if other scheduler has switched + // the task to next step, skip the update process. + // Or when there is no such task. + return nil + } + return mgr.insertSubtasks(ctx, se, subtasks) + }) +} - _, err := stm.executeSQLWithNewSession(ctx, sql.String()) +func (*TaskManager) updateTaskStateStep(ctx context.Context, se sessionctx.Context, + task *proto.Task, nextState proto.TaskState, nextStep proto.Step) error { + var extraUpdateStr string + if task.State == proto.TaskStatePending { + extraUpdateStr = `start_time = CURRENT_TIMESTAMP(),` + } + // TODO: during generating subtask, task meta might change, maybe move meta + // update to another place. + _, err := sqlexec.ExecSQL(ctx, se, ` + update mysql.tidb_global_task + set state = %?, + step = %?, `+extraUpdateStr+` + state_update_time = CURRENT_TIMESTAMP(), + meta = %? + where id = %? and state = %? and step = %?`, + nextState, nextStep, task.Meta, task.ID, task.State, task.Step) return err } -// CleanUpMeta cleanup the outdated row in dist_framework_meta when some tidb down. -func (stm *TaskManager) CleanUpMeta(ctx context.Context, nodes []string) error { - if len(nodes) == 0 { +// TestChannel is used for test. +var TestChannel = make(chan struct{}) + +func (*TaskManager) insertSubtasks(ctx context.Context, se sessionctx.Context, subtasks []*proto.Subtask) error { + if len(subtasks) == 0 { return nil } - return stm.WithNewTxn(ctx, func(se sessionctx.Context) error { - deleteSQL := new(strings.Builder) - if err := sqlescape.FormatSQL(deleteSQL, "delete from mysql.dist_framework_meta where host in("); err != nil { + failpoint.Inject("waitBeforeInsertSubtasks", func() { + <-TestChannel + <-TestChannel + }) + var ( + sb strings.Builder + markerList = make([]string, 0, len(subtasks)) + args = make([]interface{}, 0, len(subtasks)*7) + ) + sb.WriteString(`insert into mysql.tidb_background_subtask(` + InsertSubtaskColumns + `) values `) + for _, subtask := range subtasks { + markerList = append(markerList, "(%?, %?, %?, %?, %?, %?, %?, %?, CURRENT_TIMESTAMP(), '{}', '{}')") + args = append(args, subtask.Step, subtask.TaskID, subtask.ExecID, subtask.Meta, + proto.SubtaskStatePending, proto.Type2Int(subtask.Type), subtask.Concurrency, subtask.Ordinal) + } + sb.WriteString(strings.Join(markerList, ",")) + _, err := sqlexec.ExecSQL(ctx, se, sb.String(), args...) + return err +} + +// SwitchTaskStepInBatch implements the dispatcher.TaskManager interface. +func (mgr *TaskManager) SwitchTaskStepInBatch( + ctx context.Context, + task *proto.Task, + nextState proto.TaskState, + nextStep proto.Step, + subtasks []*proto.Subtask, +) error { + return mgr.WithNewSession(func(se sessionctx.Context) error { + // some subtasks may be inserted by other dispatchers, we can skip them. + rs, err := sqlexec.ExecSQL(ctx, se, ` + select count(1) from mysql.tidb_background_subtask + where task_key = %? and step = %?`, task.ID, nextStep) + if err != nil { return err } - deleteElems := make([]string, 0, len(nodes)) - for _, node := range nodes { - deleteElems = append(deleteElems, fmt.Sprintf(`"%s"`, node)) + existingTaskCnt := int(rs[0].GetInt64(0)) + if existingTaskCnt > len(subtasks) { + return errors.Annotatef(ErrUnstableSubtasks, "expected %d, got %d", + len(subtasks), existingTaskCnt) } - - deleteSQL.WriteString(strings.Join(deleteElems, ", ")) - deleteSQL.WriteString(")") - _, err := ExecSQL(ctx, se, deleteSQL.String()) - return err + subtaskBatches := mgr.splitSubtasks(subtasks[existingTaskCnt:]) + for _, batch := range subtaskBatches { + if err = mgr.insertSubtasks(ctx, se, batch); err != nil { + return err + } + } + return mgr.updateTaskStateStep(ctx, se, task, nextState, nextStep) }) } -// PauseSubtasks update all running/pending subtasks to pasued state. -func (stm *TaskManager) PauseSubtasks(ctx context.Context, tidbID string, taskID int64) error { - _, err := stm.executeSQLWithNewSession(ctx, - `update mysql.tidb_background_subtask set state = "paused" where task_key = %? and state in ("running", "pending") and exec_id = %?`, taskID, tidbID) - return err -} - -// ResumeSubtasks update all paused subtasks to pending state. -func (stm *TaskManager) ResumeSubtasks(ctx context.Context, taskID int64) error { - _, err := stm.executeSQLWithNewSession(ctx, - `update mysql.tidb_background_subtask set state = "pending", error = null where task_key = %? and state = "paused"`, taskID) - return err +func (*TaskManager) splitSubtasks(subtasks []*proto.Subtask) [][]*proto.Subtask { + var ( + res = make([][]*proto.Subtask, 0, 10) + currBatch = make([]*proto.Subtask, 0, 10) + size int + ) + maxSize := int(min(kv.TxnTotalSizeLimit.Load(), uint64(maxSubtaskBatchSize))) + for _, s := range subtasks { + if size+len(s.Meta) > maxSize { + res = append(res, currBatch) + currBatch = nil + size = 0 + } + currBatch = append(currBatch, s) + size += len(s.Meta) + } + if len(currBatch) > 0 { + res = append(res, currBatch) + } + return res } -// UpdateGlobalTaskAndAddSubTasks update the global task and add new subtasks -func (stm *TaskManager) UpdateGlobalTaskAndAddSubTasks(ctx context.Context, gTask *proto.Task, subtasks []*proto.Subtask, prevState proto.TaskState) (bool, error) { +// UpdateTaskAndAddSubTasks update the task and add new subtasks +// TODO: remove this when we remove reverting subtasks. +func (mgr *TaskManager) UpdateTaskAndAddSubTasks(ctx context.Context, task *proto.Task, subtasks []*proto.Subtask, prevState proto.TaskState) (bool, error) { retryable := true - err := stm.WithNewTxn(ctx, func(se sessionctx.Context) error { - _, err := ExecSQL(ctx, se, "update mysql.tidb_global_task "+ + err := mgr.WithNewTxn(ctx, func(se sessionctx.Context) error { + _, err := sqlexec.ExecSQL(ctx, se, "update mysql.tidb_global_task "+ "set state = %?, dispatcher_id = %?, step = %?, concurrency = %?, meta = %?, error = %?, state_update_time = CURRENT_TIMESTAMP()"+ "where id = %? and state = %?", - gTask.State, gTask.DispatcherID, gTask.Step, gTask.Concurrency, gTask.Meta, serializeErr(gTask.Error), gTask.ID, prevState) + task.State, task.SchedulerID, task.Step, task.Concurrency, task.Meta, serializeErr(task.Error), task.ID, prevState) if err != nil { return err } - // When AffectedRows == 0, means other admin command have changed the task state, it's illegal to dispatch subtasks. + // When AffectedRows == 0, means other admin command have changed the task state, it's illegal to schedule subtasks. if se.GetSessionVars().StmtCtx.AffectedRows() == 0 { if !intest.InTest { // task state have changed by other admin command @@ -730,14 +680,14 @@ func (stm *TaskManager) UpdateGlobalTaskAndAddSubTasks(ctx context.Context, gTas } // TODO: remove it, when OnNextSubtasksBatch returns subtasks, just insert subtasks without updating tidb_global_task. // Currently the business running on distributed task framework will update proto.Task in OnNextSubtasksBatch. - // So when dispatching subtasks, framework needs to update global task and insert subtasks in one Txn. + // So when scheduling subtasks, framework needs to update task and insert subtasks in one Txn. // // In future, it's needed to restrict changes of task in OnNextSubtasksBatch. // If OnNextSubtasksBatch won't update any fields in proto.Task, we can insert subtasks only. // // For now, we update nothing in proto.Task in UT's OnNextSubtasksBatch, so the AffectedRows will be 0. So UT can't fully compatible - // with current UpdateGlobalTaskAndAddSubTasks implementation. - rs, err := ExecSQL(ctx, se, "select id from mysql.tidb_global_task where id = %? and state = %?", gTask.ID, prevState) + // with current UpdateTaskAndAddSubTasks implementation. + rs, err := sqlexec.ExecSQL(ctx, se, "select id from mysql.tidb_global_task where id = %? and state = %?", task.ID, prevState) if err != nil { return err } @@ -754,14 +704,13 @@ func (stm *TaskManager) UpdateGlobalTaskAndAddSubTasks(ctx context.Context, gTas } }) if len(subtasks) > 0 { - subtaskState := proto.TaskStatePending - if gTask.State == proto.TaskStateReverting { - subtaskState = proto.TaskStateRevertPending + subtaskState := proto.SubtaskStatePending + if task.State == proto.TaskStateReverting { + subtaskState = proto.SubtaskStateRevertPending } sql := new(strings.Builder) - if err := sqlescape.FormatSQL(sql, "insert into mysql.tidb_background_subtask \n"+ - "(step, task_key, exec_id, meta, state, type, checkpoint, summary) values "); err != nil { + if err := sqlescape.FormatSQL(sql, `insert into mysql.tidb_background_subtask(`+InsertSubtaskColumns+`) values`); err != nil { return err } for i, subtask := range subtasks { @@ -770,12 +719,12 @@ func (stm *TaskManager) UpdateGlobalTaskAndAddSubTasks(ctx context.Context, gTas return err } } - if err := sqlescape.FormatSQL(sql, "(%?, %?, %?, %?, %?, %?, %?, %?)", - subtask.Step, gTask.ID, subtask.SchedulerID, subtask.Meta, subtaskState, proto.Type2Int(subtask.Type), []byte{}, "{}"); err != nil { + if err := sqlescape.FormatSQL(sql, "(%?, %?, %?, %?, %?, %?, %?, NULL, CURRENT_TIMESTAMP(), '{}', '{}')", + subtask.Step, task.ID, subtask.ExecID, subtask.Meta, subtaskState, proto.Type2Int(subtask.Type), subtask.Concurrency); err != nil { return err } } - _, err := ExecSQL(ctx, se, sql.String()) + _, err := sqlexec.ExecSQL(ctx, se, sql.String()) if err != nil { return nil } @@ -802,103 +751,25 @@ func serializeErr(err error) []byte { return errBytes } -// CancelGlobalTask cancels global task. -func (stm *TaskManager) CancelGlobalTask(ctx context.Context, taskID int64) error { - _, err := stm.executeSQLWithNewSession(ctx, - "update mysql.tidb_global_task set state=%?, state_update_time = CURRENT_TIMESTAMP() "+ - "where id=%? and state in (%?, %?)", - proto.TaskStateCancelling, taskID, proto.TaskStatePending, proto.TaskStateRunning, - ) - return err -} - -// CancelGlobalTaskByKeySession cancels global task by key using input session. -func (stm *TaskManager) CancelGlobalTaskByKeySession(ctx context.Context, se sessionctx.Context, taskKey string) error { - _, err := ExecSQL(ctx, se, - "update mysql.tidb_global_task set state=%?, state_update_time = CURRENT_TIMESTAMP() "+ - "where task_key=%? and state in (%?, %?)", - proto.TaskStateCancelling, taskKey, proto.TaskStatePending, proto.TaskStateRunning) - return err -} - -// IsGlobalTaskCancelling checks whether the task state is cancelling. -func (stm *TaskManager) IsGlobalTaskCancelling(ctx context.Context, taskID int64) (bool, error) { - rs, err := stm.executeSQLWithNewSession(ctx, "select 1 from mysql.tidb_global_task where id=%? and state = %?", - taskID, proto.TaskStateCancelling, - ) - - if err != nil { - return false, err - } - - return len(rs) > 0, nil -} - -// PauseTask pauses the task. -func (stm *TaskManager) PauseTask(ctx context.Context, taskKey string) (bool, error) { - found := false - err := stm.WithNewSession(func(se sessionctx.Context) error { - _, err := ExecSQL(ctx, se, - "update mysql.tidb_global_task set state=%?, state_update_time = CURRENT_TIMESTAMP() "+ - "where task_key = %? and state in (%?, %?)", - proto.TaskStatePausing, taskKey, proto.TaskStatePending, proto.TaskStateRunning, - ) - if err != nil { - return err - } - if se.GetSessionVars().StmtCtx.AffectedRows() != 0 { - found = true - } - return err - }) - if err != nil { - return found, err - } - return found, nil -} - -// ResumeTask resumes the task. -func (stm *TaskManager) ResumeTask(ctx context.Context, taskKey string) (bool, error) { - found := false - err := stm.WithNewSession(func(se sessionctx.Context) error { - _, err := ExecSQL(ctx, se, - "update mysql.tidb_global_task set state=%?, state_update_time = CURRENT_TIMESTAMP() "+ - "where task_key = %? and state = %?", - proto.TaskStateResuming, taskKey, proto.TaskStatePaused, - ) - if err != nil { - return err - } - if se.GetSessionVars().StmtCtx.AffectedRows() != 0 { - found = true - } - return err - }) - if err != nil { - return found, err - } - return found, nil -} - -// GetSubtasksForImportInto gets the subtasks for import into(show import jobs). -func (stm *TaskManager) GetSubtasksForImportInto(ctx context.Context, taskID int64, step proto.Step) ([]*proto.Subtask, error) { +// GetSubtasksWithHistory gets the subtasks from tidb_global_task and tidb_global_task_history. +func (mgr *TaskManager) GetSubtasksWithHistory(ctx context.Context, taskID int64, step proto.Step) ([]*proto.Subtask, error) { var ( rs []chunk.Row err error ) - err = stm.WithNewTxn(ctx, func(se sessionctx.Context) error { - rs, err = ExecSQL(ctx, se, - "select * from mysql.tidb_background_subtask where task_key = %? and step = %?", + err = mgr.WithNewTxn(ctx, func(se sessionctx.Context) error { + rs, err = sqlexec.ExecSQL(ctx, se, + `select `+SubtaskColumns+` from mysql.tidb_background_subtask where task_key = %? and step = %?`, taskID, step, ) if err != nil { return err } - // To avoid the situation that the subtasks has been `TransferSubTasks2History` + // To avoid the situation that the subtasks has been `TransferTasks2History` // when the user show import jobs, we need to check the history table. - rsFromHistory, err := ExecSQL(ctx, se, - "select * from mysql.tidb_background_subtask_history where task_key = %? and step = %?", + rsFromHistory, err := sqlexec.ExecSQL(ctx, se, + `select `+SubtaskColumns+` from mysql.tidb_background_subtask_history where task_key = %? and step = %?`, taskID, step, ) if err != nil { @@ -917,112 +788,7 @@ func (stm *TaskManager) GetSubtasksForImportInto(ctx context.Context, taskID int } subtasks := make([]*proto.Subtask, 0, len(rs)) for _, r := range rs { - subtasks = append(subtasks, row2SubTask(r)) + subtasks = append(subtasks, Row2SubTask(r)) } return subtasks, nil } - -// TransferSubTasks2History move all the finished subTask to tidb_background_subtask_history by taskID -func (stm *TaskManager) TransferSubTasks2History(ctx context.Context, taskID int64) error { - return stm.WithNewTxn(ctx, func(se sessionctx.Context) error { - _, err := ExecSQL(ctx, se, "insert into mysql.tidb_background_subtask_history select * from mysql.tidb_background_subtask where task_key = %?", taskID) - if err != nil { - return err - } - - // delete taskID subtask - _, err = ExecSQL(ctx, se, "delete from mysql.tidb_background_subtask where task_key = %?", taskID) - return err - }) -} - -// GCSubtasks deletes the history subtask which is older than the given days. -func (stm *TaskManager) GCSubtasks(ctx context.Context) error { - subtaskHistoryKeepSeconds := defaultSubtaskKeepDays * 24 * 60 * 60 - failpoint.Inject("subtaskHistoryKeepSeconds", func(val failpoint.Value) { - if val, ok := val.(int); ok { - subtaskHistoryKeepSeconds = val - } - }) - _, err := stm.executeSQLWithNewSession( - ctx, - fmt.Sprintf("DELETE FROM mysql.tidb_background_subtask_history WHERE state_update_time < UNIX_TIMESTAMP() - %d ;", subtaskHistoryKeepSeconds), - ) - return err -} - -// TransferTasks2History transfer the selected tasks into tidb_global_task_history table by taskIDs. -func (stm *TaskManager) TransferTasks2History(ctx context.Context, tasks []*proto.Task) error { - if len(tasks) == 0 { - return nil - } - return stm.WithNewTxn(ctx, func(se sessionctx.Context) error { - insertSQL := new(strings.Builder) - if err := sqlescape.FormatSQL(insertSQL, "replace into mysql.tidb_global_task_history"+ - "(id, task_key, type, dispatcher_id, state, start_time, state_update_time,"+ - "meta, concurrency, step, error) values"); err != nil { - return err - } - - for i, task := range tasks { - if i != 0 { - if err := sqlescape.FormatSQL(insertSQL, ","); err != nil { - return err - } - } - if err := sqlescape.FormatSQL(insertSQL, "(%?, %?, %?, %?, %?, %?, %?, %?, %?, %?, %?)", - task.ID, task.Key, task.Type, task.DispatcherID, - task.State, task.StartTime, task.StateUpdateTime, - task.Meta, task.Concurrency, task.Step, serializeErr(task.Error)); err != nil { - return err - } - } - _, err := ExecSQL(ctx, se, insertSQL.String()) - if err != nil { - return err - } - - // delete taskIDs tasks - deleteSQL := new(strings.Builder) - if err := sqlescape.FormatSQL(deleteSQL, "delete from mysql.tidb_global_task where id in("); err != nil { - return err - } - deleteElems := make([]string, 0, len(tasks)) - for _, task := range tasks { - deleteElems = append(deleteElems, fmt.Sprintf("%d", task.ID)) - } - - deleteSQL.WriteString(strings.Join(deleteElems, ", ")) - deleteSQL.WriteString(")") - _, err = ExecSQL(ctx, se, deleteSQL.String()) - return err - }) -} - -// GetNodesByRole gets nodes map from dist_framework_meta by role. -func (stm *TaskManager) GetNodesByRole(ctx context.Context, role string) (map[string]bool, error) { - rs, err := stm.executeSQLWithNewSession(ctx, - "select host from mysql.dist_framework_meta where role = %?", role) - if err != nil { - return nil, err - } - nodes := make(map[string]bool, len(rs)) - for _, r := range rs { - nodes[r.GetString(0)] = true - } - return nodes, nil -} - -// GetAllNodes gets nodes in dist_framework_meta. -func (stm *TaskManager) GetAllNodes(ctx context.Context) ([]string, error) { - rs, err := stm.executeSQLWithNewSession(ctx, - "select host from mysql.dist_framework_meta") - if err != nil { - return nil, err - } - nodes := make([]string, 0, len(rs)) - for _, r := range rs { - nodes = append(nodes, r.GetString(0)) - } - return nodes, nil -} diff --git a/pkg/disttask/framework/storage/task_table_test.go b/pkg/disttask/framework/storage/task_table_test.go new file mode 100644 index 0000000000000..dec57601a2af4 --- /dev/null +++ b/pkg/disttask/framework/storage/task_table_test.go @@ -0,0 +1,64 @@ +// Copyright 2023 PingCAP, 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. + +package storage + +import ( + "testing" + + "github.com/pingcap/tidb/pkg/config" + "github.com/pingcap/tidb/pkg/disttask/framework/proto" + "github.com/pingcap/tidb/pkg/kv" + "github.com/pingcap/tidb/pkg/testkit/testsetup" + "github.com/stretchr/testify/require" + "go.uber.org/goleak" +) + +func TestMain(m *testing.M) { + testsetup.SetupForCommonTest() + opts := []goleak.Option{ + goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), + goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), + goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), + goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), + } + goleak.VerifyTestMain(m, opts...) +} + +func TestSplitSubtasks(t *testing.T) { + tm := &TaskManager{} + subtasks := make([]*proto.Subtask, 0, 10) + metaBytes := make([]byte, 100) + for i := 0; i < 10; i++ { + subtasks = append(subtasks, &proto.Subtask{ID: int64(i), Meta: metaBytes}) + } + bak := kv.TxnTotalSizeLimit.Load() + t.Cleanup(func() { + kv.TxnTotalSizeLimit.Store(bak) + }) + + kv.TxnTotalSizeLimit.Store(config.SuperLargeTxnSize) + splitSubtasks := tm.splitSubtasks(subtasks) + require.Len(t, splitSubtasks, 1) + require.Equal(t, subtasks, splitSubtasks[0]) + + maxSubtaskBatchSize = 300 + splitSubtasks = tm.splitSubtasks(subtasks) + require.Len(t, splitSubtasks, 4) + require.Equal(t, subtasks[:3], splitSubtasks[0]) + require.Equal(t, subtasks[3:6], splitSubtasks[1]) + require.Equal(t, subtasks[6:9], splitSubtasks[2]) + require.Equal(t, subtasks[9:], splitSubtasks[3]) +} diff --git a/pkg/disttask/framework/storage/util.go b/pkg/disttask/framework/storage/util.go deleted file mode 100644 index 9784dfb121c28..0000000000000 --- a/pkg/disttask/framework/storage/util.go +++ /dev/null @@ -1,68 +0,0 @@ -// Copyright 2023 PingCAP, 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. - -package storage - -import ( - "context" - - "github.com/pingcap/tidb/pkg/disttask/framework/proto" -) - -// GetSubtasksFromHistoryForTest gets subtasks from history table for test. -func GetSubtasksFromHistoryForTest(ctx context.Context, stm *TaskManager) (int, error) { - rs, err := stm.executeSQLWithNewSession(ctx, - "select * from mysql.tidb_background_subtask_history") - if err != nil { - return 0, err - } - return len(rs), nil -} - -// GetSubtasksFromHistoryByTaskIDForTest gets subtasks by taskID from history table for test. -func GetSubtasksFromHistoryByTaskIDForTest(ctx context.Context, stm *TaskManager, taskID int64) (int, error) { - rs, err := stm.executeSQLWithNewSession(ctx, - "select * from mysql.tidb_background_subtask_history where task_key = %?", taskID) - if err != nil { - return 0, err - } - return len(rs), nil -} - -// GetSubtasksByTaskIDForTest gets subtasks by taskID for test. -func GetSubtasksByTaskIDForTest(ctx context.Context, stm *TaskManager, taskID int64) ([]*proto.Subtask, error) { - rs, err := stm.executeSQLWithNewSession(ctx, - "select * from mysql.tidb_background_subtask where task_key = %?", taskID) - if err != nil { - return nil, err - } - if len(rs) == 0 { - return nil, nil - } - subtasks := make([]*proto.Subtask, 0, len(rs)) - for _, r := range rs { - subtasks = append(subtasks, row2SubTask(r)) - } - return subtasks, nil -} - -// GetTasksFromHistoryForTest gets tasks from history table for test. -func GetTasksFromHistoryForTest(ctx context.Context, stm *TaskManager) (int, error) { - rs, err := stm.executeSQLWithNewSession(ctx, - "select * from mysql.tidb_global_task_history") - if err != nil { - return 0, err - } - return len(rs), nil -} diff --git a/pkg/disttask/framework/dispatcher/BUILD.bazel b/pkg/disttask/framework/taskexecutor/BUILD.bazel similarity index 54% rename from pkg/disttask/framework/dispatcher/BUILD.bazel rename to pkg/disttask/framework/taskexecutor/BUILD.bazel index 8a35bbc0c4d47..84de85776bd74 100644 --- a/pkg/disttask/framework/dispatcher/BUILD.bazel +++ b/pkg/disttask/framework/taskexecutor/BUILD.bazel @@ -1,60 +1,77 @@ load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") go_library( - name = "dispatcher", + name = "taskexecutor", srcs = [ - "dispatcher.go", - "dispatcher_manager.go", "interface.go", - "state_transform.go", + "manager.go", + "register.go", + "slot.go", + "task_executor.go", ], - importpath = "github.com/pingcap/tidb/pkg/disttask/framework/dispatcher", + importpath = "github.com/pingcap/tidb/pkg/disttask/framework/taskexecutor", visibility = ["//visibility:public"], deps = [ + "//br/pkg/lightning/common", + "//br/pkg/lightning/log", + "//pkg/config", + "//pkg/disttask/framework/handle", "//pkg/disttask/framework/proto", + "//pkg/disttask/framework/scheduler", "//pkg/disttask/framework/storage", + "//pkg/disttask/framework/taskexecutor/execute", "//pkg/domain/infosync", "//pkg/metrics", "//pkg/resourcemanager/pool/spool", "//pkg/resourcemanager/util", - "//pkg/sessionctx", "//pkg/util", - "//pkg/util/disttask", - "//pkg/util/intest", + "//pkg/util/backoff", + "//pkg/util/cpu", + "//pkg/util/gctuner", "//pkg/util/logutil", - "//pkg/util/syncutil", + "//pkg/util/memory", + "@com_github_docker_go_units//:go-units", "@com_github_pingcap_errors//:errors", "@com_github_pingcap_failpoint//:failpoint", + "@com_github_pingcap_log//:log", "@org_uber_go_zap//:zap", ], ) go_test( - name = "dispatcher_test", + name = "taskexecutor_test", timeout = "short", srcs = [ - "dispatcher_manager_test.go", - "dispatcher_test.go", "main_test.go", + "manager_test.go", + "register_test.go", + "slot_test.go", + "task_executor_test.go", + "task_executor_testkit_test.go", ], - embed = [":dispatcher"], + embed = [":taskexecutor"], flaky = True, - race = "off", - shard_count = 15, + shard_count = 16, deps = [ "//pkg/disttask/framework/mock", + "//pkg/disttask/framework/mock/execute", "//pkg/disttask/framework/proto", "//pkg/disttask/framework/storage", - "//pkg/domain/infosync", + "//pkg/disttask/framework/testutil", "//pkg/kv", + "//pkg/resourcemanager/pool/spool", + "//pkg/resourcemanager/util", "//pkg/testkit", "//pkg/testkit/testsetup", "//pkg/util/logutil", + "//pkg/util/memory", "@com_github_ngaut_pools//:pools", "@com_github_pingcap_errors//:errors", "@com_github_pingcap_failpoint//:failpoint", "@com_github_stretchr_testify//require", "@com_github_tikv_client_go_v2//util", + "@org_golang_google_grpc//codes", + "@org_golang_google_grpc//status", "@org_uber_go_goleak//:goleak", "@org_uber_go_mock//gomock", ], diff --git a/pkg/disttask/framework/scheduler/execute/BUILD.bazel b/pkg/disttask/framework/taskexecutor/execute/BUILD.bazel similarity index 94% rename from pkg/disttask/framework/scheduler/execute/BUILD.bazel rename to pkg/disttask/framework/taskexecutor/execute/BUILD.bazel index 92a3187687263..3049283bd4ac9 100644 --- a/pkg/disttask/framework/scheduler/execute/BUILD.bazel +++ b/pkg/disttask/framework/taskexecutor/execute/BUILD.bazel @@ -6,7 +6,7 @@ go_library( "interface.go", "summary.go", ], - importpath = "github.com/pingcap/tidb/pkg/disttask/framework/scheduler/execute", + importpath = "github.com/pingcap/tidb/pkg/disttask/framework/taskexecutor/execute", visibility = ["//visibility:public"], deps = [ "//pkg/disttask/framework/proto", diff --git a/pkg/disttask/framework/scheduler/execute/interface.go b/pkg/disttask/framework/taskexecutor/execute/interface.go similarity index 93% rename from pkg/disttask/framework/scheduler/execute/interface.go rename to pkg/disttask/framework/taskexecutor/execute/interface.go index d016dabc3c603..7bce5d2f49421 100644 --- a/pkg/disttask/framework/scheduler/execute/interface.go +++ b/pkg/disttask/framework/taskexecutor/execute/interface.go @@ -20,8 +20,8 @@ import ( "github.com/pingcap/tidb/pkg/disttask/framework/proto" ) -// SubtaskExecutor defines the executor of a subtask. -type SubtaskExecutor interface { +// StepExecutor defines the executor of a subtask. +type StepExecutor interface { // Init is used to initialize the environment for the subtask executor. Init(context.Context) error // RunSubtask is used to run the subtask. diff --git a/pkg/disttask/framework/scheduler/execute/summary.go b/pkg/disttask/framework/taskexecutor/execute/summary.go similarity index 100% rename from pkg/disttask/framework/scheduler/execute/summary.go rename to pkg/disttask/framework/taskexecutor/execute/summary.go diff --git a/pkg/disttask/framework/taskexecutor/interface.go b/pkg/disttask/framework/taskexecutor/interface.go new file mode 100644 index 0000000000000..bc405a160f683 --- /dev/null +++ b/pkg/disttask/framework/taskexecutor/interface.go @@ -0,0 +1,124 @@ +// Copyright 2023 PingCAP, 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. + +package taskexecutor + +import ( + "context" + + "github.com/pingcap/tidb/pkg/disttask/framework/proto" + "github.com/pingcap/tidb/pkg/disttask/framework/taskexecutor/execute" +) + +// TaskTable defines the interface to access the task table. +type TaskTable interface { + GetTasksInStates(ctx context.Context, states ...interface{}) (task []*proto.Task, err error) + GetTaskByID(ctx context.Context, taskID int64) (task *proto.Task, err error) + // GetSubtasksByExecIDAndStepAndStates gets all subtasks by given states and execID. + GetSubtasksByExecIDAndStepAndStates(ctx context.Context, execID string, taskID int64, step proto.Step, states ...proto.SubtaskState) ([]*proto.Subtask, error) + GetFirstSubtaskInStates(ctx context.Context, instanceID string, taskID int64, step proto.Step, states ...proto.SubtaskState) (*proto.Subtask, error) + // InitMeta insert the manager information into dist_framework_meta. + // Call it when starting task executor or in set variable operation. + InitMeta(ctx context.Context, execID string, role string) error + // RecoverMeta recover the manager information into dist_framework_meta. + // Call it periodically to recover deleted meta. + RecoverMeta(ctx context.Context, execID string, role string) error + // StartSubtask try to update the subtask's state to running if the subtask is owned by execID. + // If the update success, it means the execID's related task executor own the subtask. + StartSubtask(ctx context.Context, subtaskID int64, execID string) error + // UpdateSubtaskStateAndError update the subtask's state and error. + UpdateSubtaskStateAndError(ctx context.Context, execID string, subtaskID int64, state proto.SubtaskState, err error) error + // FailSubtask update the task's subtask state to failed and set the err. + FailSubtask(ctx context.Context, execID string, taskID int64, err error) error + // CancelSubtask update the task's subtasks' state to canceled. + CancelSubtask(ctx context.Context, exe string, taskID int64) error + // FinishSubtask updates the subtask meta and mark state to succeed. + FinishSubtask(ctx context.Context, execID string, subtaskID int64, meta []byte) error + // PauseSubtasks update subtasks state to paused. + PauseSubtasks(ctx context.Context, execID string, taskID int64) error + + HasSubtasksInStates(ctx context.Context, execID string, taskID int64, step proto.Step, states ...proto.SubtaskState) (bool, error) + // RunningSubtasksBack2Pending update the state of subtask which belongs to this + // node from running to pending. + // see subtask state machine for more detail. + RunningSubtasksBack2Pending(ctx context.Context, subtasks []*proto.Subtask) error +} + +// Pool defines the interface of a pool. +type Pool interface { + Run(func()) error + RunWithConcurrency(chan func(), uint32) error + ReleaseAndWait() +} + +// TaskExecutor is the subtask executor for a task. +// Each task type should implement this interface. +type TaskExecutor interface { + Init(context.Context) error + RunStep(context.Context, *proto.Task, *proto.StepResource) error + Rollback(context.Context, *proto.Task) error + Close() + IsRetryableError(err error) bool +} + +// Extension extends the TaskExecutor. +// each task type should implement this interface. +type Extension interface { + // IsIdempotent returns whether the subtask is idempotent. + // when tidb restart, the subtask might be left in the running state. + // if it's idempotent, the Executor can rerun the subtask, else + // the Executor will mark the subtask as failed. + IsIdempotent(subtask *proto.Subtask) bool + // GetStepExecutor returns the subtask executor for the subtask. + // Note: + // 1. summary is the summary manager of all subtask of the same type now. + // 2. should not retry the error from it. + GetStepExecutor(ctx context.Context, task *proto.Task, summary *execute.Summary, resource *proto.StepResource) (execute.StepExecutor, error) + // IsRetryableError returns whether the error is transient. + // When error is transient, the framework won't mark subtasks as failed, + // then the TaskExecutor can load the subtask again and redo it. + IsRetryableError(err error) bool +} + +// EmptyStepExecutor is an empty Executor. +// it can be used for the task that does not need to split into subtasks. +type EmptyStepExecutor struct { +} + +var _ execute.StepExecutor = &EmptyStepExecutor{} + +// Init implements the StepExecutor interface. +func (*EmptyStepExecutor) Init(context.Context) error { + return nil +} + +// RunSubtask implements the StepExecutor interface. +func (*EmptyStepExecutor) RunSubtask(context.Context, *proto.Subtask) error { + return nil +} + +// Cleanup implements the StepExecutor interface. +func (*EmptyStepExecutor) Cleanup(context.Context) error { + return nil +} + +// OnFinished implements the StepExecutor interface. +func (*EmptyStepExecutor) OnFinished(_ context.Context, _ *proto.Subtask) error { + return nil +} + +// Rollback implements the StepExecutor interface. +func (*EmptyStepExecutor) Rollback(context.Context) error { + return nil +} diff --git a/pkg/disttask/framework/taskexecutor/main_test.go b/pkg/disttask/framework/taskexecutor/main_test.go new file mode 100644 index 0000000000000..71f62d9f6dc2a --- /dev/null +++ b/pkg/disttask/framework/taskexecutor/main_test.go @@ -0,0 +1,35 @@ +// Copyright 2024 PingCAP, 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. + +package taskexecutor + +import ( + "testing" + + "github.com/pingcap/tidb/pkg/testkit/testsetup" + "go.uber.org/goleak" +) + +func TestMain(m *testing.M) { + testsetup.SetupForCommonTest() + opts := []goleak.Option{ + goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), + goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), + goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), + goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), + goleak.IgnoreTopFunction("syscall.syscall"), + } + goleak.VerifyTestMain(m, opts...) +} diff --git a/pkg/disttask/framework/taskexecutor/manager.go b/pkg/disttask/framework/taskexecutor/manager.go new file mode 100644 index 0000000000000..35ecdcaa433f3 --- /dev/null +++ b/pkg/disttask/framework/taskexecutor/manager.go @@ -0,0 +1,488 @@ +// Copyright 2023 PingCAP, 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. + +package taskexecutor + +import ( + "context" + "sync" + "sync/atomic" + "time" + + "github.com/docker/go-units" + "github.com/pingcap/errors" + "github.com/pingcap/failpoint" + "github.com/pingcap/tidb/pkg/config" + "github.com/pingcap/tidb/pkg/disttask/framework/proto" + "github.com/pingcap/tidb/pkg/domain/infosync" + "github.com/pingcap/tidb/pkg/metrics" + "github.com/pingcap/tidb/pkg/resourcemanager/pool/spool" + "github.com/pingcap/tidb/pkg/resourcemanager/util" + tidbutil "github.com/pingcap/tidb/pkg/util" + "github.com/pingcap/tidb/pkg/util/cpu" + "github.com/pingcap/tidb/pkg/util/logutil" + "github.com/pingcap/tidb/pkg/util/memory" + "go.uber.org/zap" +) + +var ( + executorPoolSize int32 = 4 + // same as scheduler + checkTime = 300 * time.Millisecond + recoverMetaInterval = 90 * time.Second + retrySQLTimes = 30 + retrySQLInterval = 500 * time.Millisecond + unfinishedSubtaskStates = []proto.SubtaskState{ + proto.SubtaskStatePending, proto.SubtaskStateRevertPending, + // for the case that the tidb is restarted when the subtask is running. + proto.SubtaskStateRunning, proto.SubtaskStateReverting, + } +) + +// ManagerBuilder is used to build a Manager. +type ManagerBuilder struct { + newPool func(name string, size int32, component util.Component, options ...spool.Option) (Pool, error) +} + +// NewManagerBuilder creates a new ManagerBuilder. +func NewManagerBuilder() *ManagerBuilder { + return &ManagerBuilder{ + newPool: func(name string, size int32, component util.Component, options ...spool.Option) (Pool, error) { + return spool.NewPool(name, size, component, options...) + }, + } +} + +// setPoolFactory sets the poolFactory to mock the Pool in unit test. +func (b *ManagerBuilder) setPoolFactory(poolFactory func(name string, size int32, component util.Component, options ...spool.Option) (Pool, error)) { + b.newPool = poolFactory +} + +// Manager monitors the task table and manages the taskExecutors. +type Manager struct { + taskTable TaskTable + executorPool Pool + mu struct { + sync.RWMutex + // taskID -> CancelCauseFunc. + // CancelCauseFunc is used to fast cancel the executor.Run. + handlingTasks map[int64]context.CancelCauseFunc + } + // id, it's the same as server id now, i.e. host:port. + id string + wg tidbutil.WaitGroupWrapper + ctx context.Context + cancel context.CancelFunc + logger *zap.Logger + newPool func(name string, size int32, component util.Component, options ...spool.Option) (Pool, error) + slotManager *slotManager + + totalCPU int + totalMem int64 +} + +// BuildManager builds a Manager. +func (b *ManagerBuilder) BuildManager(ctx context.Context, id string, taskTable TaskTable) (*Manager, error) { + totalMem, err := memory.MemTotal() + if err != nil { + // should not happen normally, as in main function of tidb-server, we assert + // that memory.MemTotal() will not fail. + return nil, err + } + totalCPU := cpu.GetCPUCount() + if totalCPU <= 0 || totalMem <= 0 { + return nil, errors.Errorf("invalid cpu or memory, cpu: %d, memory: %d", totalCPU, totalMem) + } + logutil.BgLogger().Info("build manager", zap.Int("total-cpu", totalCPU), + zap.String("total-mem", units.BytesSize(float64(totalMem)))) + m := &Manager{ + id: id, + taskTable: taskTable, + logger: logutil.BgLogger(), + newPool: b.newPool, + slotManager: &slotManager{ + taskID2Index: make(map[int64]int), + executorTasks: make([]*proto.Task, 0), + available: totalCPU, + }, + totalCPU: totalCPU, + totalMem: int64(totalMem), + } + m.ctx, m.cancel = context.WithCancel(ctx) + m.mu.handlingTasks = make(map[int64]context.CancelCauseFunc) + + executorPool, err := m.newPool("executor_pool", executorPoolSize, util.DistTask) + if err != nil { + return nil, err + } + m.executorPool = executorPool + + return m, nil +} + +// InitMeta initializes the meta of the Manager. +// not a must-success step before start manager, +// manager will try to recover meta periodically. +func (m *Manager) InitMeta() (err error) { + for i := 0; i < retrySQLTimes; i++ { + err = m.taskTable.InitMeta(m.ctx, m.id, config.GetGlobalConfig().Instance.TiDBServiceScope) + if err == nil { + break + } + if err1 := m.ctx.Err(); err1 != nil { + return err1 + } + if i%10 == 0 { + m.logger.Warn("start manager failed", + zap.String("scope", config.GetGlobalConfig().Instance.TiDBServiceScope), + zap.Int("retry times", i), + zap.Error(err)) + } + time.Sleep(retrySQLInterval) + } + return err +} + +func (m *Manager) recoverMeta() (err error) { + for i := 0; i < retrySQLTimes; i++ { + err = m.taskTable.RecoverMeta(m.ctx, m.id, config.GetGlobalConfig().Instance.TiDBServiceScope) + if err == nil { + break + } + if err1 := m.ctx.Err(); err1 != nil { + return err1 + } + if i%10 == 0 { + m.logger.Warn("recover meta failed", + zap.String("scope", config.GetGlobalConfig().Instance.TiDBServiceScope), + zap.Int("retry times", i), + zap.Error(err)) + } + time.Sleep(retrySQLInterval) + } + return err +} + +// Start starts the Manager. +func (m *Manager) Start() error { + m.logger.Debug("manager start") + m.wg.Run(m.handleTasksLoop) + m.wg.Run(m.recoverMetaLoop) + return nil +} + +// Stop stops the Manager. +func (m *Manager) Stop() { + m.cancel() + m.executorPool.ReleaseAndWait() + m.wg.Wait() +} + +// handleTasksLoop handle tasks of interested states, including: +// - pending/running: start the task executor. +// - reverting: cancel the task executor, and mark running subtasks as Canceled. +// - pausing: cancel the task executor, mark all pending/running subtasks of current +// node as paused. +// +// Pausing is handled on every executor to make sure all subtasks are +// NOT running by executor before mark the task as paused. +func (m *Manager) handleTasksLoop() { + defer tidbutil.Recover(metrics.LabelDomain, "handleTasksLoop", m.handleTasksLoop, false) + ticker := time.NewTicker(checkTime) + for { + select { + case <-m.ctx.Done(): + m.logger.Info("handle tasks loop done") + return + case <-ticker.C: + } + + m.handleTasks() + } +} + +func (m *Manager) handleTasks() { + tasks, err := m.taskTable.GetTasksInStates(m.ctx, proto.TaskStateRunning, + proto.TaskStateReverting, proto.TaskStatePausing) + if err != nil { + m.logErr(err) + return + } + + executableTasks := make([]*proto.Task, 0, len(tasks)) + for _, task := range tasks { + switch task.State { + case proto.TaskStateRunning, proto.TaskStateReverting: + if task.State == proto.TaskStateReverting { + m.cancelRunningSubtaskOf(task) + } + // TaskStateReverting require executor to run rollback logic. + if !m.isExecutorStarted(task.ID) { + executableTasks = append(executableTasks, task) + } + case proto.TaskStatePausing: + if err := m.handlePausingTask(task); err != nil { + m.logErr(err) + } + } + } + + if len(executableTasks) > 0 { + m.handleExecutableTasks(executableTasks) + } +} + +// handleExecutableTasks handles executable tasks. +func (m *Manager) handleExecutableTasks(tasks []*proto.Task) { + for _, task := range tasks { + exist, err := m.taskTable.HasSubtasksInStates(m.ctx, m.id, task.ID, task.Step, unfinishedSubtaskStates...) + if err != nil { + m.logger.Error("check subtask exist failed", zap.Error(err)) + m.logErr(err) + continue + } + if !exist { + continue + } + m.logger.Info("detect new subtask", zap.Int64("task-id", task.ID)) + + canAlloc, tasksNeedFree := m.slotManager.canAlloc(task) + if len(tasksNeedFree) > 0 { + m.cancelTaskExecutors(tasksNeedFree) + // do not handle the tasks with lower priority if current task is waiting tasks free. + break + } + + if !canAlloc { + m.logger.Debug("no enough slots to run task", zap.Int64("task-id", task.ID)) + continue + } + m.addHandlingTask(task.ID) + m.slotManager.alloc(task) + t := task + err = m.executorPool.Run(func() { + defer m.slotManager.free(t.ID) + m.handleExecutableTask(t) + m.removeHandlingTask(t.ID) + }) + // pool closed. + if err != nil { + m.slotManager.free(t.ID) + m.removeHandlingTask(task.ID) + m.logErr(err) + return + } + } +} + +// cancelRunningSubtaskOf cancels the running subtask of the task, the subtask +// will switch to `canceled` state. +func (m *Manager) cancelRunningSubtaskOf(task *proto.Task) { + m.mu.RLock() + defer m.mu.RUnlock() + if cancel, ok := m.mu.handlingTasks[task.ID]; ok && cancel != nil { + m.logger.Info("onCanceledTasks", zap.Int64("task-id", task.ID)) + // subtask needs to change its state to `canceled`. + cancel(ErrCancelSubtask) + } +} + +// onPausingTasks pauses/cancels the pending/running subtasks. +func (m *Manager) handlePausingTask(task *proto.Task) error { + m.mu.RLock() + defer m.mu.RUnlock() + m.logger.Info("handle pausing task", zap.Int64("task-id", task.ID)) + if cancel, ok := m.mu.handlingTasks[task.ID]; ok && cancel != nil { + // cancel the task executor + cancel(nil) + } + // we pause subtasks belongs to this exec node even when there's no executor running. + // as balancer might move subtasks to this node when the executor hasn't started. + return m.taskTable.PauseSubtasks(m.ctx, m.id, task.ID) +} + +// recoverMetaLoop recovers dist_framework_meta for the tidb node running the taskExecutor manager. +// This is necessary when the TiDB node experiences a prolonged network partition +// and the scheduler deletes `dist_framework_meta`. +// When the TiDB node recovers from the network partition, +// we need to re-insert the metadata. +func (m *Manager) recoverMetaLoop() { + defer tidbutil.Recover(metrics.LabelDomain, "recoverMetaLoop", m.recoverMetaLoop, false) + ticker := time.NewTicker(recoverMetaInterval) + for { + select { + case <-m.ctx.Done(): + m.logger.Info("recoverMetaLoop done") + return + case <-ticker.C: + if err := m.recoverMeta(); err != nil { + m.logErr(err) + continue + } + } + } +} + +// cancelTaskExecutors cancels the task executors. +// unlike cancelRunningSubtaskOf, this function doesn't change subtask state. +func (m *Manager) cancelTaskExecutors(tasks []*proto.Task) { + m.mu.RLock() + defer m.mu.RUnlock() + for _, task := range tasks { + m.logger.Info("cancelTasks", zap.Any("task_id", task.ID)) + if cancel, ok := m.mu.handlingTasks[task.ID]; ok && cancel != nil { + // only cancel the executor, subtask state is not changed. + cancel(nil) + } + } +} + +// TestContext only used in tests. +type TestContext struct { + TestSyncSubtaskRun chan struct{} + mockDown atomic.Bool +} + +var testContexts sync.Map + +// handleExecutableTask handles a runnable task. +func (m *Manager) handleExecutableTask(task *proto.Task) { + m.logger.Info("handleExecutableTask", zap.Int64("task-id", task.ID), zap.Stringer("type", task.Type)) + // runCtx only used in executor.Run, cancel in m.fetchAndFastCancelTasks. + factory := GetTaskExecutorFactory(task.Type) + if factory == nil { + err := errors.Errorf("task type %s not found", task.Type) + m.logErrAndPersist(err, task.ID, nil) + return + } + executor := factory(m.ctx, m.id, task, m.taskTable) + taskCtx, taskCancel := context.WithCancelCause(m.ctx) + m.registerCancelFunc(task.ID, taskCancel) + defer taskCancel(nil) + // executor should init before run()/pause()/rollback(). + err := executor.Init(taskCtx) + if err != nil { + m.logErrAndPersist(err, task.ID, executor) + return + } + defer executor.Close() + for { + select { + case <-m.ctx.Done(): + m.logger.Info("handleExecutableTask exit for cancel", zap.Int64("task-id", task.ID), zap.Stringer("type", task.Type)) + return + case <-time.After(checkTime): + } + failpoint.Inject("mockStopManager", func() { + testContexts.Store(m.id, &TestContext{make(chan struct{}), atomic.Bool{}}) + go func() { + v, ok := testContexts.Load(m.id) + if ok { + <-v.(*TestContext).TestSyncSubtaskRun + infosync.MockGlobalServerInfoManagerEntry.DeleteByExecID(m.id) + m.Stop() + } + }() + }) + task, err = m.taskTable.GetTaskByID(m.ctx, task.ID) + if err != nil { + m.logErr(err) + return + } + if task.State != proto.TaskStateRunning && task.State != proto.TaskStateReverting { + m.logger.Info("handleExecutableTask exit", + zap.Int64("task-id", task.ID), zap.Int64("step", int64(task.Step)), zap.Stringer("state", task.State)) + return + } + if exist, err := m.taskTable.HasSubtasksInStates(m.ctx, m.id, task.ID, task.Step, + unfinishedSubtaskStates...); err != nil { + m.logErr(err) + return + } else if !exist { + continue + } + stepResource := m.getStepResource(task.Concurrency) + m.logger.Info("execute task step with resource", + zap.Int64("task-id", task.ID), zap.Int64("step", int64(task.Step)), + zap.Stringer("resource", stepResource)) + switch task.State { + case proto.TaskStateRunning: + if taskCtx.Err() != nil { + return + } + // use taskCtx for canceling. + err = executor.RunStep(taskCtx, task, stepResource) + case proto.TaskStateReverting: + // use m.ctx since this process should not be canceled. + // TODO: will remove it later, leave it now. + err = executor.Rollback(m.ctx, task) + } + if err != nil { + m.logger.Error("failed to handle task", zap.Error(err)) + } + } +} + +func (m *Manager) getStepResource(concurrency int) *proto.StepResource { + return &proto.StepResource{ + CPU: proto.NewAllocatable(int64(concurrency)), + // same proportion as CPU + Mem: proto.NewAllocatable(int64(float64(concurrency) / float64(m.totalCPU) * float64(m.totalMem))), + } +} + +// addHandlingTask adds a task to the handling task set. +func (m *Manager) addHandlingTask(id int64) { + m.mu.Lock() + defer m.mu.Unlock() + m.mu.handlingTasks[id] = nil +} + +// registerCancelFunc registers a cancel function for a task. +func (m *Manager) registerCancelFunc(id int64, cancel context.CancelCauseFunc) { + m.mu.Lock() + defer m.mu.Unlock() + m.mu.handlingTasks[id] = cancel +} + +// removeHandlingTask removes a task from the handling task set. +func (m *Manager) removeHandlingTask(id int64) { + m.mu.Lock() + defer m.mu.Unlock() + delete(m.mu.handlingTasks, id) +} + +func (m *Manager) isExecutorStarted(taskID int64) bool { + m.mu.RLock() + defer m.mu.RUnlock() + _, ok := m.mu.handlingTasks[taskID] + return ok +} + +func (m *Manager) logErr(err error) { + m.logger.Error("task manager met error", zap.Error(err), zap.Stack("stack")) +} + +func (m *Manager) logErrAndPersist(err error, taskID int64, taskExecutor TaskExecutor) { + m.logErr(err) + if taskExecutor != nil && taskExecutor.IsRetryableError(err) { + m.logger.Error("met retryable err", zap.Error(err), zap.Stack("stack")) + return + } + err1 := m.taskTable.FailSubtask(m.ctx, m.id, taskID, err) + if err1 != nil { + m.logger.Error("update to subtask failed", zap.Error(err1), zap.Stack("stack")) + } + m.logger.Error("update error to subtask", zap.Int64("task-id", taskID), zap.Error(err1), zap.Stack("stack")) +} diff --git a/pkg/disttask/framework/taskexecutor/manager_test.go b/pkg/disttask/framework/taskexecutor/manager_test.go new file mode 100644 index 0000000000000..4c149484cda0d --- /dev/null +++ b/pkg/disttask/framework/taskexecutor/manager_test.go @@ -0,0 +1,624 @@ +// Copyright 2023 PingCAP, 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. + +package taskexecutor + +import ( + "context" + "errors" + "sync" + "testing" + "time" + + "github.com/pingcap/tidb/pkg/disttask/framework/mock" + "github.com/pingcap/tidb/pkg/disttask/framework/proto" + "github.com/pingcap/tidb/pkg/resourcemanager/pool/spool" + "github.com/pingcap/tidb/pkg/resourcemanager/util" + "github.com/pingcap/tidb/pkg/util/logutil" + "github.com/pingcap/tidb/pkg/util/memory" + "github.com/stretchr/testify/require" + "go.uber.org/mock/gomock" +) + +func getPoolRunFn() (*sync.WaitGroup, func(f func()) error) { + wg := &sync.WaitGroup{} + return wg, func(f func()) error { + wg.Add(1) + go func() { + defer wg.Done() + f() + }() + return nil + } +} + +func TestBuildManager(t *testing.T) { + b := NewManagerBuilder() + m, err := b.BuildManager(context.Background(), "test", nil) + require.NoError(t, err) + require.NotNil(t, m) + + bak := memory.MemTotal + defer func() { + memory.MemTotal = bak + }() + memory.MemTotal = func() (uint64, error) { + return 0, errors.New("mock error") + } + _, err = b.BuildManager(context.Background(), "test", nil) + require.ErrorContains(t, err, "mock error") + + memory.MemTotal = func() (uint64, error) { + return 0, nil + } + _, err = b.BuildManager(context.Background(), "test", nil) + require.ErrorContains(t, err, "invalid cpu or memory") +} + +func TestManageTask(t *testing.T) { + ctrl := gomock.NewController(t) + defer ctrl.Finish() + + b := NewManagerBuilder() + mockTaskTable := mock.NewMockTaskTable(ctrl) + m, err := b.BuildManager(context.Background(), "test", mockTaskTable) + require.NoError(t, err) + + m.addHandlingTask(1) + require.Len(t, m.mu.handlingTasks, 1) + require.True(t, m.isExecutorStarted(1)) + m.addHandlingTask(2) + require.True(t, m.isExecutorStarted(2)) + m.removeHandlingTask(1) + require.False(t, m.isExecutorStarted(1)) + + ctx1, cancel1 := context.WithCancelCause(context.Background()) + m.registerCancelFunc(2, cancel1) + m.cancelTaskExecutors([]*proto.Task{{ID: 2}}) + require.Equal(t, context.Canceled, ctx1.Err()) + + // test cancel. + m.addHandlingTask(1) + ctx2, cancel2 := context.WithCancelCause(context.Background()) + m.registerCancelFunc(1, cancel2) + ctx3, cancel3 := context.WithCancelCause(context.Background()) + m.registerCancelFunc(2, cancel3) + m.cancelRunningSubtaskOf(&proto.Task{ID: 1}) + require.Equal(t, context.Canceled, ctx2.Err()) + require.NoError(t, ctx3.Err()) + + // test pause. + m.addHandlingTask(3) + ctx4, cancel4 := context.WithCancelCause(context.Background()) + m.registerCancelFunc(1, cancel4) + mockTaskTable.EXPECT().PauseSubtasks(m.ctx, "test", int64(1)).Return(nil) + require.NoError(t, m.handlePausingTask(&proto.Task{ID: 1})) + require.Equal(t, context.Canceled, ctx4.Err()) + mockTaskTable.EXPECT().PauseSubtasks(m.ctx, "test", int64(1)).Return(errors.New("pause failed")) + require.ErrorContains(t, m.handlePausingTask(&proto.Task{ID: 1}), "pause failed") +} + +func TestHandleExecutableTasks(t *testing.T) { + ctrl := gomock.NewController(t) + defer ctrl.Finish() + mockTaskTable := mock.NewMockTaskTable(ctrl) + mockInternalExecutor := mock.NewMockTaskExecutor(ctrl) + mockPool := mock.NewMockPool(ctrl) + ctx := context.Background() + + b := NewManagerBuilder() + b.setPoolFactory(func(name string, size int32, component util.Component, options ...spool.Option) (Pool, error) { + return mockPool, nil + }) + id := "test" + taskID := int64(1) + task := &proto.Task{ID: taskID, State: proto.TaskStateRunning, Step: proto.StepOne, Type: "type"} + + m, err := b.BuildManager(ctx, id, mockTaskTable) + require.NoError(t, err) + + // no task + m.handleExecutableTasks(nil) + + // type not found + mockTaskTable.EXPECT().FailSubtask(m.ctx, id, taskID, gomock.Any()) + m.handleExecutableTask(task) + + RegisterTaskType("type", + func(ctx context.Context, id string, task *proto.Task, taskTable TaskTable) TaskExecutor { + return mockInternalExecutor + }) + + // executor init failed non retryable + executorErr := errors.New("executor init failed") + mockInternalExecutor.EXPECT().Init(gomock.Any()).Return(executorErr) + mockInternalExecutor.EXPECT().IsRetryableError(executorErr).Return(false) + mockTaskTable.EXPECT().FailSubtask(m.ctx, id, taskID, executorErr) + m.handleExecutableTask(task) + m.removeHandlingTask(taskID) + require.Equal(t, true, ctrl.Satisfied()) + + // executor init failed retryable + mockInternalExecutor.EXPECT().Init(gomock.Any()).Return(executorErr) + mockInternalExecutor.EXPECT().IsRetryableError(executorErr).Return(true) + m.handleExecutableTask(task) + m.removeHandlingTask(taskID) + + // get subtask failed + mockInternalExecutor.EXPECT().Init(gomock.Any()).Return(nil) + mockTaskTable.EXPECT().HasSubtasksInStates(m.ctx, id, taskID, proto.StepOne, + unfinishedSubtaskStates). + Return(false, errors.New("get subtask failed")) + mockInternalExecutor.EXPECT().Close() + m.handleExecutableTasks([]*proto.Task{task}) + + // no subtask + mockTaskTable.EXPECT().HasSubtasksInStates(m.ctx, id, taskID, proto.StepOne, + unfinishedSubtaskStates).Return(false, nil) + m.handleExecutableTasks([]*proto.Task{task}) + + // pool error + mockTaskTable.EXPECT().HasSubtasksInStates(m.ctx, id, taskID, proto.StepOne, + unfinishedSubtaskStates).Return(true, nil) + mockPool.EXPECT().Run(gomock.Any()).Return(errors.New("pool error")) + m.handleExecutableTasks([]*proto.Task{task}) + + // StepOne succeed + wg, runFn := getPoolRunFn() + mockTaskTable.EXPECT().HasSubtasksInStates(m.ctx, id, taskID, proto.StepOne, + unfinishedSubtaskStates).Return(true, nil) + mockPool.EXPECT().Run(gomock.Any()).DoAndReturn(runFn) + mockTaskTable.EXPECT().GetTaskByID(m.ctx, taskID).Return(task, nil) + mockTaskTable.EXPECT().HasSubtasksInStates(m.ctx, id, taskID, proto.StepOne, + unfinishedSubtaskStates).Return(true, nil) + mockInternalExecutor.EXPECT().RunStep(gomock.Any(), task, gomock.Any()).Return(nil) + + // StepTwo failed + task1 := &proto.Task{ID: taskID, State: proto.TaskStateRunning, Step: proto.StepTwo} + mockTaskTable.EXPECT().GetTaskByID(m.ctx, taskID).Return(task1, nil) + mockTaskTable.EXPECT().HasSubtasksInStates(m.ctx, id, taskID, proto.StepTwo, + unfinishedSubtaskStates).Return(true, nil) + mockInternalExecutor.EXPECT().RunStep(gomock.Any(), task1, gomock.Any()).Return(errors.New("run err")) + + task2 := &proto.Task{ID: taskID, State: proto.TaskStateReverting, Step: proto.StepTwo} + mockTaskTable.EXPECT().GetTaskByID(m.ctx, taskID).Return(task2, nil) + mockTaskTable.EXPECT().HasSubtasksInStates(m.ctx, id, taskID, proto.StepTwo, + unfinishedSubtaskStates).Return(true, nil) + mockInternalExecutor.EXPECT().Rollback(gomock.Any(), task2).Return(nil) + + task3 := &proto.Task{ID: taskID, State: proto.TaskStateReverted, Step: proto.StepTwo} + mockTaskTable.EXPECT().GetTaskByID(m.ctx, taskID).Return(task3, nil) + + m.handleExecutableTasks([]*proto.Task{task}) + + wg.Wait() +} + +func TestManager(t *testing.T) { + ctrl := gomock.NewController(t) + defer ctrl.Finish() + mockTaskTable := mock.NewMockTaskTable(ctrl) + mockInternalExecutor := mock.NewMockTaskExecutor(ctrl) + mockPool := mock.NewMockPool(ctrl) + b := NewManagerBuilder() + b.setPoolFactory(func(name string, size int32, component util.Component, options ...spool.Option) (Pool, error) { + return mockPool, nil + }) + RegisterTaskType("type", + func(ctx context.Context, id string, task *proto.Task, taskTable TaskTable) TaskExecutor { + return mockInternalExecutor + }) + id := "test" + + m, err := b.BuildManager(context.Background(), id, mockTaskTable) + require.NoError(t, err) + + taskID1 := int64(1) + taskID2 := int64(2) + taskID3 := int64(3) + task1 := &proto.Task{ID: taskID1, State: proto.TaskStateRunning, Step: proto.StepOne, Type: "type"} + task2 := &proto.Task{ID: taskID2, State: proto.TaskStateReverting, Step: proto.StepOne, Type: "type"} + task3 := &proto.Task{ID: taskID3, State: proto.TaskStatePausing, Step: proto.StepOne, Type: "type"} + + mockTaskTable.EXPECT().InitMeta(m.ctx, "test", "").Return(nil).Times(1) + mockTaskTable.EXPECT().GetTasksInStates(m.ctx, proto.TaskStateRunning, proto.TaskStateReverting, proto.TaskStatePausing). + Return([]*proto.Task{task1, task2, task3}, nil).AnyTimes() + mockInternalExecutor.EXPECT().Init(gomock.Any()).Return(nil) + // task1 + mockTaskTable.EXPECT().HasSubtasksInStates(m.ctx, id, taskID1, proto.StepOne, + unfinishedSubtaskStates). + Return(true, nil) + wg, runFn := getPoolRunFn() + mockPool.EXPECT().Run(gomock.Any()).DoAndReturn(runFn) + mockTaskTable.EXPECT().GetTaskByID(m.ctx, taskID1).Return(task1, nil).AnyTimes() + mockTaskTable.EXPECT().HasSubtasksInStates(m.ctx, id, taskID1, proto.StepOne, + unfinishedSubtaskStates). + Return(true, nil) + mockInternalExecutor.EXPECT().RunStep(gomock.Any(), task1, gomock.Any()).Return(nil) + + mockTaskTable.EXPECT().HasSubtasksInStates(m.ctx, id, taskID1, proto.StepOne, + unfinishedSubtaskStates). + Return(false, nil).AnyTimes() + mockInternalExecutor.EXPECT().Close() + // task2 + mockTaskTable.EXPECT().HasSubtasksInStates(m.ctx, id, taskID2, proto.StepOne, + unfinishedSubtaskStates). + Return(true, nil) + mockPool.EXPECT().Run(gomock.Any()).DoAndReturn(runFn) + mockTaskTable.EXPECT().GetTaskByID(m.ctx, taskID2).Return(task2, nil).AnyTimes() + mockTaskTable.EXPECT().HasSubtasksInStates(m.ctx, id, taskID2, proto.StepOne, + unfinishedSubtaskStates). + Return(true, nil) + mockInternalExecutor.EXPECT().Init(gomock.Any()).Return(nil) + mockInternalExecutor.EXPECT().Rollback(gomock.Any(), task2).Return(nil) + mockTaskTable.EXPECT().HasSubtasksInStates(m.ctx, id, taskID2, proto.StepOne, + unfinishedSubtaskStates). + Return(false, nil).AnyTimes() + mockInternalExecutor.EXPECT().Close() + // task3 + mockTaskTable.EXPECT().PauseSubtasks(m.ctx, id, taskID3).Return(nil).AnyTimes() + + // for taskExecutor pool + mockPool.EXPECT().ReleaseAndWait().Do(func() { + wg.Wait() + }) + + require.NoError(t, m.InitMeta()) + require.NoError(t, m.Start()) + time.Sleep(5 * time.Second) + m.Stop() +} + +func TestManagerHandleTasks(t *testing.T) { + ctrl := gomock.NewController(t) + defer ctrl.Finish() + mockTaskTable := mock.NewMockTaskTable(ctrl) + mockInternalExecutor := mock.NewMockTaskExecutor(ctrl) + mockPool := mock.NewMockPool(ctrl) + b := NewManagerBuilder() + b.setPoolFactory(func(name string, size int32, component util.Component, options ...spool.Option) (Pool, error) { + return mockPool, nil + }) + RegisterTaskType("type", + func(ctx context.Context, id string, task *proto.Task, taskTable TaskTable) TaskExecutor { + return mockInternalExecutor + }) + id := "test" + + m, err := b.BuildManager(context.Background(), id, mockTaskTable) + require.NoError(t, err) + m.slotManager.available = 16 + + // failed to get tasks + mockTaskTable.EXPECT().GetTasksInStates(m.ctx, proto.TaskStateRunning, proto.TaskStateReverting, proto.TaskStatePausing). + Return(nil, errors.New("mock err")) + require.Len(t, m.mu.handlingTasks, 0) + m.handleTasks() + require.Len(t, m.mu.handlingTasks, 0) + require.True(t, ctrl.Satisfied()) + + // handle pausing tasks + mockTaskTable.EXPECT().GetTasksInStates(m.ctx, proto.TaskStateRunning, proto.TaskStateReverting, proto.TaskStatePausing). + Return([]*proto.Task{{ID: 1, State: proto.TaskStatePausing}}, nil) + mockTaskTable.EXPECT().PauseSubtasks(m.ctx, id, int64(1)).Return(nil) + m.handleTasks() + require.True(t, ctrl.Satisfied()) + + ch := make(chan error) + defer close(ch) + wg, runFn := getPoolRunFn() + task1 := &proto.Task{ID: 1, State: proto.TaskStateRunning, Step: proto.StepOne, Type: "type", Concurrency: 1} + + // handle pending tasks + var task1Ctx context.Context + var mu sync.Mutex + mockTaskTable.EXPECT().GetTasksInStates(m.ctx, proto.TaskStateRunning, proto.TaskStateReverting, proto.TaskStatePausing). + Return([]*proto.Task{task1}, nil) + mockTaskTable.EXPECT().HasSubtasksInStates(m.ctx, id, task1.ID, proto.StepOne, + unfinishedSubtaskStates).Return(true, nil) + mockPool.EXPECT().Run(gomock.Any()).DoAndReturn(runFn) + mockInternalExecutor.EXPECT().Init(gomock.Any()).Return(nil) + mockTaskTable.EXPECT().GetTaskByID(m.ctx, task1.ID).Return(task1, nil) + mockTaskTable.EXPECT().HasSubtasksInStates(m.ctx, id, task1.ID, proto.StepOne, + unfinishedSubtaskStates).Return(true, nil) + mockInternalExecutor.EXPECT().RunStep(gomock.Any(), task1, gomock.Any()).DoAndReturn(func(ctx context.Context, _ *proto.Task, _ *proto.StepResource) error { + mu.Lock() + task1Ctx = ctx + mu.Unlock() + return <-ch + }) + m.handleTasks() + require.Eventually(t, func() bool { + mu.Lock() + defer mu.Unlock() + return task1Ctx != nil && ctrl.Satisfied() + }, 5*time.Second, 100*time.Millisecond) + require.True(t, m.isExecutorStarted(task1.ID)) + + // handle task1 again, no effects + mockTaskTable.EXPECT().GetTasksInStates(m.ctx, proto.TaskStateRunning, proto.TaskStateReverting, proto.TaskStatePausing). + Return([]*proto.Task{task1}, nil) + m.handleTasks() + require.True(t, ctrl.Satisfied()) + + // task1 changed to reverting, executor will keep running, but context canceled + task1.State = proto.TaskStateReverting + mockTaskTable.EXPECT().GetTasksInStates(m.ctx, proto.TaskStateRunning, proto.TaskStateReverting, proto.TaskStatePausing). + Return([]*proto.Task{task1}, nil) + m.handleTasks() + require.True(t, ctrl.Satisfied()) + require.True(t, m.isExecutorStarted(task1.ID)) + require.Error(t, task1Ctx.Err()) + require.ErrorIs(t, context.Cause(task1Ctx), ErrCancelSubtask) + + // finish task1, executor will be closed + task1.State = proto.TaskStateReverted + mockTaskTable.EXPECT().GetTaskByID(m.ctx, task1.ID).Return(task1, nil) + mockInternalExecutor.EXPECT().Close() + ch <- nil + require.Eventually(t, func() bool { + return ctrl.Satisfied() + }, 5*time.Second, 100*time.Millisecond) + require.False(t, m.isExecutorStarted(task1.ID)) + + wg.Wait() +} + +func TestSlotManagerInManager(t *testing.T) { + ctrl := gomock.NewController(t) + defer ctrl.Finish() + mockTaskTable := mock.NewMockTaskTable(ctrl) + mockInternalExecutor := mock.NewMockTaskExecutor(ctrl) + mockPool := mock.NewMockPool(ctrl) + b := NewManagerBuilder() + b.setPoolFactory(func(name string, size int32, component util.Component, options ...spool.Option) (Pool, error) { + return mockPool, nil + }) + RegisterTaskType("type", + func(ctx context.Context, id string, task *proto.Task, taskTable TaskTable) TaskExecutor { + return mockInternalExecutor + }) + id := "test" + + m, err := b.BuildManager(context.Background(), id, mockTaskTable) + require.NoError(t, err) + m.slotManager.available = 10 + + var ( + taskID1 = int64(1) + taskID2 = int64(2) + + task1 = &proto.Task{ + ID: taskID1, + State: proto.TaskStateRunning, + Concurrency: 10, + Step: proto.StepOne, + Type: "type", + } + task2 = &proto.Task{ + ID: taskID2, + State: proto.TaskStateRunning, + Concurrency: 1, + Step: proto.StepOne, + Type: "type", + } + ) + + ch := make(chan error) + defer close(ch) + wg, runFn := getPoolRunFn() + + // ******** Test task1 alloc success ******** + // 1. task1 alloc success + // 2. task2 alloc failed + // 3. task1 run success + mockTaskTable.EXPECT().HasSubtasksInStates(m.ctx, id, taskID1, proto.StepOne, + unfinishedSubtaskStates). + Return(true, nil) + mockPool.EXPECT().Run(gomock.Any()).DoAndReturn(runFn) + mockTaskTable.EXPECT().HasSubtasksInStates(m.ctx, id, taskID2, proto.StepOne, + unfinishedSubtaskStates). + Return(true, nil) + + // mock inside handleExecutableTask + mockInternalExecutor.EXPECT().Init(gomock.Any()).Return(nil) + mockTaskTable.EXPECT().GetTaskByID(m.ctx, taskID1).Return(task1, nil) + mockTaskTable.EXPECT().HasSubtasksInStates(m.ctx, id, taskID1, proto.StepOne, + unfinishedSubtaskStates). + Return(true, nil) + // task1 start running + mockInternalExecutor.EXPECT().RunStep(gomock.Any(), task1, gomock.Any()).DoAndReturn(func(_ context.Context, _ *proto.Task, _ *proto.StepResource) error { + return <-ch + }) + + m.handleExecutableTasks([]*proto.Task{task1, task2}) + // task1 alloc resource success + require.Eventually(t, func() bool { + if m.slotManager.available != 0 || len(m.slotManager.executorTasks) != 1 || + m.slotManager.executorTasks[0].ID != task1.ID { + return false + } + return ctrl.Satisfied() + }, 2*time.Second, 300*time.Millisecond) + ch <- nil + + // task1 succeed + task1.State = proto.TaskStateSucceed + mockTaskTable.EXPECT().GetTaskByID(m.ctx, taskID1).Return(task1, nil) + mockInternalExecutor.EXPECT().Close() + wg.Wait() + require.Equal(t, 10, m.slotManager.available) + require.Equal(t, 0, len(m.slotManager.executorTasks)) + require.True(t, ctrl.Satisfied()) + + // ******** Test task occupation ******** + task1.State = proto.TaskStateRunning + var ( + taskID3 = int64(3) + task3 = &proto.Task{ + ID: taskID3, + State: proto.TaskStateRunning, + Concurrency: 1, + Priority: -1, + Step: proto.StepOne, + Type: "type", + } + ) + // 1. task1 alloc success + mockTaskTable.EXPECT().HasSubtasksInStates(m.ctx, id, taskID1, proto.StepOne, + unfinishedSubtaskStates). + Return(true, nil) + mockPool.EXPECT().Run(gomock.Any()).DoAndReturn(runFn) + mockTaskTable.EXPECT().HasSubtasksInStates(m.ctx, id, taskID2, proto.StepOne, + unfinishedSubtaskStates). + Return(true, nil) + + // mock inside handleExecutableTask + mockInternalExecutor.EXPECT().Init(gomock.Any()).Return(nil) + mockTaskTable.EXPECT().GetTaskByID(m.ctx, taskID1).Return(task1, nil) + mockTaskTable.EXPECT().HasSubtasksInStates(m.ctx, id, taskID1, proto.StepOne, + unfinishedSubtaskStates). + Return(true, nil) + // task1 start running + mockInternalExecutor.EXPECT().RunStep(gomock.Any(), task1, gomock.Any()).DoAndReturn(func(_ context.Context, _ *proto.Task, _ *proto.StepResource) error { + return <-ch + }) + + m.handleExecutableTasks([]*proto.Task{task1, task2}) + // task1 alloc resource success + require.Eventually(t, func() bool { + if m.slotManager.available != 0 || len(m.slotManager.executorTasks) != 1 || + m.slotManager.executorTasks[0].ID != task1.ID { + return false + } + return ctrl.Satisfied() + }, 2*time.Second, 300*time.Millisecond) + + // 2. task1 is preempted by task3, task1 start to pausing + // 3. task3 is waiting for task1 to be released, and task2 can't be allocated + mockTaskTable.EXPECT().HasSubtasksInStates(m.ctx, id, taskID3, proto.StepOne, + unfinishedSubtaskStates). + Return(true, nil) + + // the priority of task3 is higher than task2, so task3 is in front of task2 + m.handleExecutableTasks([]*proto.Task{task3, task2}) + require.Equal(t, 0, m.slotManager.available) + require.Equal(t, []*proto.Task{task1}, m.slotManager.executorTasks) + require.True(t, ctrl.Satisfied()) + + mockTaskTable.EXPECT().GetTaskByID(m.ctx, taskID1).Return(task1, nil) + mockTaskTable.EXPECT().HasSubtasksInStates(m.ctx, id, taskID1, proto.StepOne, + unfinishedSubtaskStates). + Return(true, nil) + mockInternalExecutor.EXPECT().Close() + + // 4. task1 is released, task3 alloc success, start to run + ch <- context.Canceled + wg.Wait() + require.Equal(t, 10, m.slotManager.available) + require.Len(t, m.slotManager.executorTasks, 0) + require.True(t, ctrl.Satisfied()) + + mockTaskTable.EXPECT().HasSubtasksInStates(m.ctx, id, taskID3, proto.StepOne, + unfinishedSubtaskStates). + Return(true, nil) + mockPool.EXPECT().Run(gomock.Any()).DoAndReturn(runFn) + mockTaskTable.EXPECT().HasSubtasksInStates(m.ctx, id, taskID1, proto.StepOne, + unfinishedSubtaskStates). + Return(true, nil) + mockTaskTable.EXPECT().HasSubtasksInStates(m.ctx, id, taskID2, proto.StepOne, + unfinishedSubtaskStates). + Return(true, nil) + mockPool.EXPECT().Run(gomock.Any()).DoAndReturn(runFn) + + // mock inside handleExecutableTask + mockInternalExecutor.EXPECT().Init(gomock.Any()).Return(nil) + mockTaskTable.EXPECT().GetTaskByID(m.ctx, taskID3).Return(task3, nil) + mockTaskTable.EXPECT().HasSubtasksInStates(m.ctx, id, taskID3, proto.StepOne, + unfinishedSubtaskStates). + Return(true, nil) + mockInternalExecutor.EXPECT().RunStep(gomock.Any(), task3, gomock.Any()).DoAndReturn(func(_ context.Context, _ *proto.Task, _ *proto.StepResource) error { + return <-ch + }) + + // 5. available is enough, task2 alloc success, + mockInternalExecutor.EXPECT().Init(gomock.Any()).Return(nil) + mockTaskTable.EXPECT().GetTaskByID(m.ctx, taskID2).Return(task2, nil) + mockTaskTable.EXPECT().HasSubtasksInStates(m.ctx, id, taskID2, proto.StepOne, + unfinishedSubtaskStates). + Return(true, nil) + mockInternalExecutor.EXPECT().RunStep(gomock.Any(), task2, gomock.Any()).DoAndReturn(func(_ context.Context, _ *proto.Task, _ *proto.StepResource) error { + return <-ch + }) + + m.handleExecutableTasks([]*proto.Task{task3, task1, task2}) + time.Sleep(2 * time.Second) + require.Eventually(t, func() bool { + if m.slotManager.available != 8 || len(m.slotManager.executorTasks) != 2 { + return false + } + return ctrl.Satisfied() + }, 2*time.Second, 300*time.Millisecond) + + // 6. task3/task2 run success + task3.State = proto.TaskStateSucceed + mockTaskTable.EXPECT().GetTaskByID(m.ctx, taskID3).Return(task3, nil) + mockInternalExecutor.EXPECT().Close() + task2.State = proto.TaskStateSucceed + mockTaskTable.EXPECT().GetTaskByID(m.ctx, taskID2).Return(task2, nil) + mockInternalExecutor.EXPECT().Close() + ch <- nil + ch <- nil + wg.Wait() + require.Equal(t, 10, m.slotManager.available) + require.Equal(t, 0, len(m.slotManager.executorTasks)) + require.True(t, ctrl.Satisfied()) +} + +func TestManagerInitMeta(t *testing.T) { + ctrl := gomock.NewController(t) + defer ctrl.Finish() + + mockTaskTable := mock.NewMockTaskTable(ctrl) + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + m := &Manager{ + taskTable: mockTaskTable, + ctx: ctx, + logger: logutil.BgLogger(), + } + mockTaskTable.EXPECT().InitMeta(gomock.Any(), gomock.Any(), gomock.Any()).Return(nil) + require.NoError(t, m.InitMeta()) + require.True(t, ctrl.Satisfied()) + gomock.InOrder( + mockTaskTable.EXPECT().InitMeta(gomock.Any(), gomock.Any(), gomock.Any()).Return(errors.New("mock err")), + mockTaskTable.EXPECT().InitMeta(gomock.Any(), gomock.Any(), gomock.Any()).Return(nil), + ) + require.NoError(t, m.InitMeta()) + require.True(t, ctrl.Satisfied()) + + bak := retrySQLTimes + t.Cleanup(func() { + retrySQLTimes = bak + }) + retrySQLTimes = 1 + mockTaskTable.EXPECT().InitMeta(gomock.Any(), gomock.Any(), gomock.Any()).Return(errors.New("mock err")) + require.ErrorContains(t, m.InitMeta(), "mock err") + require.True(t, ctrl.Satisfied()) + + cancel() + mockTaskTable.EXPECT().InitMeta(gomock.Any(), gomock.Any(), gomock.Any()).Return(errors.New("mock err")) + require.ErrorIs(t, m.InitMeta(), context.Canceled) + require.True(t, ctrl.Satisfied()) +} diff --git a/pkg/disttask/framework/scheduler/register.go b/pkg/disttask/framework/taskexecutor/register.go similarity index 59% rename from pkg/disttask/framework/scheduler/register.go rename to pkg/disttask/framework/taskexecutor/register.go index 287858ee3410e..6d2f4efac022c 100644 --- a/pkg/disttask/framework/scheduler/register.go +++ b/pkg/disttask/framework/taskexecutor/register.go @@ -12,13 +12,13 @@ // See the License for the specific language governing permissions and // limitations under the License. -package scheduler +package taskexecutor import ( "context" "github.com/pingcap/tidb/pkg/disttask/framework/proto" - "github.com/pingcap/tidb/pkg/disttask/framework/scheduler/execute" + "github.com/pingcap/tidb/pkg/disttask/framework/taskexecutor/execute" ) type taskTypeOptions struct { @@ -32,33 +32,34 @@ type TaskTypeOption func(opts *taskTypeOptions) var ( // key is task type - taskTypes = make(map[proto.TaskType]taskTypeOptions) - taskSchedulerFactories = make(map[proto.TaskType]schedulerFactoryFn) + taskTypes = make(map[proto.TaskType]taskTypeOptions) + taskExecutorFactories = make(map[proto.TaskType]taskExecutorFactoryFn) ) -type schedulerFactoryFn func(ctx context.Context, id string, task *proto.Task, taskTable TaskTable) Scheduler +type taskExecutorFactoryFn func(ctx context.Context, id string, task *proto.Task, taskTable TaskTable) TaskExecutor // RegisterTaskType registers the task type. -func RegisterTaskType(taskType proto.TaskType, factory schedulerFactoryFn, opts ...TaskTypeOption) { +func RegisterTaskType(taskType proto.TaskType, factory taskExecutorFactoryFn, opts ...TaskTypeOption) { var option taskTypeOptions for _, opt := range opts { opt(&option) } taskTypes[taskType] = option - taskSchedulerFactories[taskType] = factory + taskExecutorFactories[taskType] = factory } -func getSchedulerFactory(taskType proto.TaskType) schedulerFactoryFn { - return taskSchedulerFactories[taskType] +// GetTaskExecutorFactory gets taskExecutorFactory by task type. +func GetTaskExecutorFactory(taskType proto.TaskType) taskExecutorFactoryFn { + return taskExecutorFactories[taskType] } -// ClearSchedulers is only used in test -func ClearSchedulers() { +// ClearTaskExecutors is only used in test +func ClearTaskExecutors() { taskTypes = make(map[proto.TaskType]taskTypeOptions) - taskSchedulerFactories = make(map[proto.TaskType]schedulerFactoryFn) + taskExecutorFactories = make(map[proto.TaskType]taskExecutorFactoryFn) } -// WithSummary is the option of Scheduler to set the summary. +// WithSummary is the option of TaskExecutor to set the summary. var WithSummary TaskTypeOption = func(opts *taskTypeOptions) { opts.Summary = execute.NewSummary() } diff --git a/pkg/disttask/framework/scheduler/register_test.go b/pkg/disttask/framework/taskexecutor/register_test.go similarity index 84% rename from pkg/disttask/framework/scheduler/register_test.go rename to pkg/disttask/framework/taskexecutor/register_test.go index 33fd626bf6440..d40d7fa49b86e 100644 --- a/pkg/disttask/framework/scheduler/register_test.go +++ b/pkg/disttask/framework/taskexecutor/register_test.go @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -package scheduler +package taskexecutor import ( "context" @@ -24,18 +24,18 @@ import ( func TestRegisterTaskType(t *testing.T) { // other case might add task types, so we need to clear it first - ClearSchedulers() - factoryFn := func(ctx context.Context, id string, task *proto.Task, taskTable TaskTable) Scheduler { + ClearTaskExecutors() + factoryFn := func(ctx context.Context, id string, task *proto.Task, taskTable TaskTable) TaskExecutor { return nil } RegisterTaskType("test1", factoryFn) require.Len(t, taskTypes, 1) - require.Len(t, taskSchedulerFactories, 1) + require.Len(t, taskExecutorFactories, 1) RegisterTaskType("test2", factoryFn) require.Len(t, taskTypes, 2) - require.Len(t, taskSchedulerFactories, 2) + require.Len(t, taskExecutorFactories, 2) // register again RegisterTaskType("test2", factoryFn) require.Len(t, taskTypes, 2) - require.Len(t, taskSchedulerFactories, 2) + require.Len(t, taskExecutorFactories, 2) } diff --git a/pkg/disttask/framework/taskexecutor/slot.go b/pkg/disttask/framework/taskexecutor/slot.go new file mode 100644 index 0000000000000..219ffce50851a --- /dev/null +++ b/pkg/disttask/framework/taskexecutor/slot.go @@ -0,0 +1,92 @@ +// Copyright 2023 PingCAP, 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. + +package taskexecutor + +import ( + "slices" + "sync" + + "github.com/pingcap/tidb/pkg/disttask/framework/proto" +) + +// slotManager is used to manage the slots of the executor. +type slotManager struct { + sync.RWMutex + // taskID2Index is the index of the task + taskID2Index map[int64]int + // executorTasks is used to record the tasks that is running on the executor, + // the slice is sorted in reverse task order. + executorTasks []*proto.Task + + // The number of slots that can be used by the executor. + // Its initial value is always equal to CPU cores of the instance. + available int +} + +// subtasks inside a task will be run in serial, so they takes task.Concurrency slots. +func (sm *slotManager) alloc(task *proto.Task) { + sm.Lock() + defer sm.Unlock() + + sm.executorTasks = append(sm.executorTasks, task) + slices.SortFunc(sm.executorTasks, func(a, b *proto.Task) int { + return b.Compare(a) + }) + for index, slotInfo := range sm.executorTasks { + sm.taskID2Index[slotInfo.ID] = index + } + sm.available -= task.Concurrency +} + +func (sm *slotManager) free(taskID int64) { + sm.Lock() + defer sm.Unlock() + + index, ok := sm.taskID2Index[taskID] + if !ok { + return + } + sm.available += sm.executorTasks[index].Concurrency + sm.executorTasks = append(sm.executorTasks[:index], sm.executorTasks[index+1:]...) + + delete(sm.taskID2Index, taskID) + for index, slotInfo := range sm.executorTasks { + sm.taskID2Index[slotInfo.ID] = index + } +} + +// canAlloc is used to check whether the instance has enough slots to run the task. +func (sm *slotManager) canAlloc(task *proto.Task) (canAlloc bool, tasksNeedFree []*proto.Task) { + sm.RLock() + defer sm.RUnlock() + + if sm.available >= task.Concurrency { + return true, nil + } + + usedSlots := 0 + for _, slotInfo := range sm.executorTasks { + if slotInfo.Compare(task) < 0 { + break + } + tasksNeedFree = append(tasksNeedFree, slotInfo) + usedSlots += slotInfo.Concurrency + if sm.available+usedSlots >= task.Concurrency { + return true, tasksNeedFree + } + } + + return false, nil +} diff --git a/pkg/disttask/framework/taskexecutor/slot_test.go b/pkg/disttask/framework/taskexecutor/slot_test.go new file mode 100644 index 0000000000000..d2c57d928e618 --- /dev/null +++ b/pkg/disttask/framework/taskexecutor/slot_test.go @@ -0,0 +1,137 @@ +// Copyright 2023 PingCAP, 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. + +package taskexecutor + +import ( + "testing" + + "github.com/pingcap/tidb/pkg/disttask/framework/proto" + "github.com/stretchr/testify/require" +) + +func TestSlotManager(t *testing.T) { + sm := slotManager{ + taskID2Index: make(map[int64]int), + executorTasks: make([]*proto.Task, 0), + available: 10, + } + + var ( + task = &proto.Task{ + ID: 1, + Priority: 1, + Concurrency: 1, + } + task2 = &proto.Task{ + ID: 2, + Priority: 2, + Concurrency: 10, + } + ) + + canAlloc, tasksNeedFree := sm.canAlloc(task) + require.True(t, canAlloc) + require.Nil(t, tasksNeedFree) + sm.alloc(task) + require.Len(t, sm.executorTasks, 1) + require.Equal(t, task, sm.executorTasks[sm.taskID2Index[task.ID]]) + require.Equal(t, 9, sm.available) + + // the available slots is not enough for task2 + canAlloc, tasksNeedFree = sm.canAlloc(task2) + require.False(t, canAlloc) + require.Nil(t, tasksNeedFree) + + // increase the priority of task2, task2 is waiting for allocation + task2.Priority = 0 + canAlloc, tasksNeedFree = sm.canAlloc(task2) + require.True(t, canAlloc) + require.Equal(t, []*proto.Task{task}, tasksNeedFree) + + // task with higher priority + task3 := &proto.Task{ + ID: 3, + Priority: -1, + Concurrency: 1, + } + + canAlloc, tasksNeedFree = sm.canAlloc(task3) + require.True(t, canAlloc) + require.Nil(t, tasksNeedFree) + // task2 is occupied by task3 + sm.alloc(task3) + require.Len(t, sm.executorTasks, 2) + require.Equal(t, task3, sm.executorTasks[sm.taskID2Index[task3.ID]]) + require.Equal(t, 8, sm.available) + + task4 := &proto.Task{ + ID: 4, + Priority: 1, + Concurrency: 1, + } + canAlloc, tasksNeedFree = sm.canAlloc(task4) + require.True(t, canAlloc) + require.Nil(t, tasksNeedFree) + sm.alloc(task4) + task5 := &proto.Task{ + ID: 5, + Priority: 0, + Concurrency: 1, + } + canAlloc, tasksNeedFree = sm.canAlloc(task5) + require.True(t, canAlloc) + require.Nil(t, tasksNeedFree) + sm.alloc(task5) + require.Len(t, sm.executorTasks, 4) + // test the order of executorTasks + require.Equal(t, []*proto.Task{task4, task, task5, task3}, sm.executorTasks) + require.Equal(t, 6, sm.available) + + task6 := &proto.Task{ + ID: 6, + Priority: 0, + Concurrency: 8, + } + canAlloc, tasksNeedFree = sm.canAlloc(task6) + require.True(t, canAlloc) + require.Equal(t, []*proto.Task{task4, task}, tasksNeedFree) + task6.Concurrency++ + canAlloc, tasksNeedFree = sm.canAlloc(task6) + require.False(t, canAlloc) + require.Nil(t, tasksNeedFree) + sm.free(task4.ID) + sm.free(task5.ID) + + sm.free(task3.ID) + require.Len(t, sm.executorTasks, 1) + require.Equal(t, task, sm.executorTasks[sm.taskID2Index[task.ID]]) + + // task2 is waiting for allocation again + canAlloc, tasksNeedFree = sm.canAlloc(task2) + require.True(t, canAlloc) + require.Equal(t, []*proto.Task{task}, tasksNeedFree) + + sm.free(task.ID) + require.Len(t, sm.executorTasks, 0) + require.Len(t, sm.taskID2Index, 0) + + sm.alloc(task2) + require.Len(t, sm.executorTasks, 1) + require.Equal(t, task2, sm.executorTasks[sm.taskID2Index[task2.ID]]) + require.Equal(t, 0, sm.available) + sm.free(task2.ID) + require.Len(t, sm.executorTasks, 0) + require.Len(t, sm.taskID2Index, 0) +} diff --git a/pkg/disttask/framework/taskexecutor/task_executor.go b/pkg/disttask/framework/taskexecutor/task_executor.go new file mode 100644 index 0000000000000..4aeaf48df9afd --- /dev/null +++ b/pkg/disttask/framework/taskexecutor/task_executor.go @@ -0,0 +1,736 @@ +// Copyright 2023 PingCAP, 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. + +package taskexecutor + +import ( + "context" + "sync" + "sync/atomic" + "time" + + "github.com/pingcap/errors" + "github.com/pingcap/failpoint" + "github.com/pingcap/log" + "github.com/pingcap/tidb/br/pkg/lightning/common" + llog "github.com/pingcap/tidb/br/pkg/lightning/log" + "github.com/pingcap/tidb/pkg/disttask/framework/handle" + "github.com/pingcap/tidb/pkg/disttask/framework/proto" + "github.com/pingcap/tidb/pkg/disttask/framework/scheduler" + "github.com/pingcap/tidb/pkg/disttask/framework/storage" + "github.com/pingcap/tidb/pkg/disttask/framework/taskexecutor/execute" + "github.com/pingcap/tidb/pkg/domain/infosync" + "github.com/pingcap/tidb/pkg/metrics" + "github.com/pingcap/tidb/pkg/util" + "github.com/pingcap/tidb/pkg/util/backoff" + "github.com/pingcap/tidb/pkg/util/gctuner" + "github.com/pingcap/tidb/pkg/util/logutil" + "github.com/pingcap/tidb/pkg/util/memory" + "go.uber.org/zap" +) + +var ( + // checkBalanceSubtaskInterval is the default check interval for checking + // subtasks balance to/away from this node. + checkBalanceSubtaskInterval = 2 * time.Second +) + +var ( + // ErrCancelSubtask is the cancel cause when cancelling subtasks. + ErrCancelSubtask = errors.New("cancel subtasks") + // ErrFinishSubtask is the cancel cause when TaskExecutor successfully processed subtasks. + ErrFinishSubtask = errors.New("finish subtasks") + // ErrFinishRollback is the cancel cause when TaskExecutor rollback successfully. + ErrFinishRollback = errors.New("finish rollback") + // ErrNonIdempotentSubtask means the subtask is left in running state and is not idempotent, + // so cannot be run again. + ErrNonIdempotentSubtask = errors.New("subtask in running state and is not idempotent") + + // TestSyncChan is used to sync the test. + TestSyncChan = make(chan struct{}) +) + +// BaseTaskExecutor is the base implementation of TaskExecutor. +type BaseTaskExecutor struct { + // id, it's the same as server id now, i.e. host:port. + id string + task atomic.Pointer[proto.Task] + taskTable TaskTable + logger *zap.Logger + // ctx from manager + ctx context.Context + Extension + + currSubtaskID atomic.Int64 + + mu struct { + sync.RWMutex + err error + // handled indicates whether the error has been updated to one of the subtask. + handled bool + // runtimeCancel is used to cancel the Run/Rollback when error occurs. + runtimeCancel context.CancelCauseFunc + } +} + +// NewBaseTaskExecutor creates a new BaseTaskExecutor. +func NewBaseTaskExecutor(ctx context.Context, id string, task *proto.Task, taskTable TaskTable) *BaseTaskExecutor { + taskExecutorImpl := &BaseTaskExecutor{ + id: id, + taskTable: taskTable, + ctx: ctx, + logger: log.L().With(zap.Int64("task-id", task.ID), + zap.String("task-type", string(task.Type))), + } + taskExecutorImpl.task.Store(task) + return taskExecutorImpl +} + +// checkBalanceSubtask check whether the subtasks are balanced to or away from this node. +// - If other subtask of `running` state is scheduled to this node, try changed to +// `pending` state, to make sure subtasks can be balanced later when node scale out. +// - If current running subtask are scheduled away from this node, i.e. this node +// is taken as down, cancel running. +func (e *BaseTaskExecutor) checkBalanceSubtask(ctx context.Context) { + ticker := time.NewTicker(checkBalanceSubtaskInterval) + defer ticker.Stop() + for { + select { + case <-ctx.Done(): + return + case <-ticker.C: + } + + task := e.task.Load() + subtasks, err := e.taskTable.GetSubtasksByExecIDAndStepAndStates(ctx, e.id, task.ID, task.Step, + proto.SubtaskStateRunning) + if err != nil { + e.logger.Error("get subtasks failed", zap.Error(err)) + continue + } + if len(subtasks) == 0 { + e.logger.Info("subtask is scheduled away, cancel running") + e.cancelRunStep() + return + } + + extraRunningSubtasks := make([]*proto.Subtask, 0, len(subtasks)) + for _, st := range subtasks { + if st.ID == e.currSubtaskID.Load() { + continue + } + if !e.IsIdempotent(st) { + e.updateSubtaskStateAndError(ctx, st, proto.SubtaskStateFailed, ErrNonIdempotentSubtask) + return + } + extraRunningSubtasks = append(extraRunningSubtasks, st) + } + if len(extraRunningSubtasks) > 0 { + if err = e.taskTable.RunningSubtasksBack2Pending(ctx, extraRunningSubtasks); err != nil { + e.logger.Error("update running subtasks back to pending failed", zap.Error(err)) + } + } + } +} + +// Init implements the TaskExecutor interface. +func (*BaseTaskExecutor) Init(_ context.Context) error { + return nil +} + +// RunStep start to fetch and run all subtasks for the step of task on the node. +func (e *BaseTaskExecutor) RunStep(ctx context.Context, task *proto.Task, resource *proto.StepResource) (err error) { + defer func() { + if r := recover(); r != nil { + e.logger.Error("BaseTaskExecutor panicked", zap.Any("recover", r), zap.Stack("stack")) + err4Panic := errors.Errorf("%v", r) + err1 := e.updateSubtask(ctx, task.ID, err4Panic) + if err == nil { + err = err1 + } + } + }() + // TODO: we can centralized this when we move handleExecutableTask loop here. + e.task.Store(task) + err = e.runStep(ctx, task, resource) + if e.mu.handled { + return err + } + if err == nil { + // may have error in + // 1. defer function in run(ctx, task) + // 2. cancel ctx + // TODO: refine onError/getError + if e.getError() != nil { + err = e.getError() + } else if ctx.Err() != nil { + err = ctx.Err() + } else { + return nil + } + } + + return e.updateSubtask(ctx, task.ID, err) +} + +func (e *BaseTaskExecutor) runStep(ctx context.Context, task *proto.Task, resource *proto.StepResource) (resErr error) { + if ctx.Err() != nil { + e.onError(ctx.Err()) + return e.getError() + } + runCtx, runCancel := context.WithCancelCause(ctx) + defer runCancel(ErrFinishSubtask) + e.registerCancelFunc(runCancel) + e.resetError() + stepLogger := llog.BeginTask(e.logger.With( + zap.Int64("task-step", int64(task.Step)), + zap.Int("concurrency", task.Concurrency), + zap.Float64("mem-limit-percent", gctuner.GlobalMemoryLimitTuner.GetPercentage()), + zap.String("server-mem-limit", memory.ServerMemoryLimitOriginText.Load()), + ), "execute task") + // log as info level, subtask might be cancelled, let caller check it. + defer func() { + stepLogger.End(zap.InfoLevel, resErr) + }() + + summary, cleanup, err := runSummaryCollectLoop(ctx, task, e.taskTable) + if err != nil { + e.onError(err) + return e.getError() + } + defer cleanup() + stepExecutor, err := e.GetStepExecutor(ctx, task, summary, resource) + if err != nil { + e.onError(err) + return e.getError() + } + + failpoint.Inject("mockExecSubtaskInitEnvErr", func() { + failpoint.Return(errors.New("mockExecSubtaskInitEnvErr")) + }) + if err := stepExecutor.Init(runCtx); err != nil { + e.onError(err) + return e.getError() + } + + defer func() { + err := stepExecutor.Cleanup(runCtx) + if err != nil { + e.logger.Error("cleanup subtask exec env failed", zap.Error(err)) + e.onError(err) + } + }() + + subtasks, err := e.taskTable.GetSubtasksByExecIDAndStepAndStates( + runCtx, e.id, task.ID, task.Step, + proto.SubtaskStatePending, proto.SubtaskStateRunning) + if err != nil { + e.onError(err) + return e.getError() + } + for _, subtask := range subtasks { + metrics.IncDistTaskSubTaskCnt(subtask) + metrics.StartDistTaskSubTask(subtask) + } + + for { + // check if any error occurs. + if err := e.getError(); err != nil { + break + } + if runCtx.Err() != nil { + e.logger.Info("taskExecutor runSubtask loop exit") + break + } + + subtask, err := e.taskTable.GetFirstSubtaskInStates(runCtx, e.id, task.ID, task.Step, + proto.SubtaskStatePending, proto.SubtaskStateRunning) + if err != nil { + e.logger.Warn("GetFirstSubtaskInStates meets error", zap.Error(err)) + continue + } + if subtask == nil { + failpoint.Inject("breakInTaskExecutorUT", func() { + failpoint.Break() + }) + newTask, err := e.taskTable.GetTaskByID(runCtx, task.ID) + // When the task move history table of not found, the task executor should exit. + if err == storage.ErrTaskNotFound { + break + } + if err != nil { + e.logger.Warn("GetTaskByID meets error", zap.Error(err)) + continue + } + // When the task move to next step or task state changes, the task executor should exit. + if newTask.Step != task.Step || newTask.State != task.State { + break + } + time.Sleep(checkTime) + continue + } + + if subtask.State == proto.SubtaskStateRunning { + if !e.IsIdempotent(subtask) { + e.logger.Info("subtask in running state and is not idempotent, fail it", + zap.Int64("subtask-id", subtask.ID)) + e.onError(ErrNonIdempotentSubtask) + e.updateSubtaskStateAndError(runCtx, subtask, proto.SubtaskStateFailed, ErrNonIdempotentSubtask) + e.markErrorHandled() + break + } + } else { + // subtask.State == proto.SubtaskStatePending + err := e.startSubtaskAndUpdateState(runCtx, subtask) + if err != nil { + e.logger.Warn("startSubtaskAndUpdateState meets error", zap.Error(err)) + // should ignore ErrSubtaskNotFound + // since the err only indicate that the subtask not owned by current task executor. + if err == storage.ErrSubtaskNotFound { + continue + } + e.onError(err) + continue + } + } + + failpoint.Inject("mockCleanExecutor", func() { + v, ok := testContexts.Load(e.id) + if ok { + if v.(*TestContext).mockDown.Load() { + failpoint.Break() + } + } + }) + + failpoint.Inject("cancelBeforeRunSubtask", func() { + runCancel(nil) + }) + + e.runSubtask(runCtx, stepExecutor, subtask) + } + return e.getError() +} + +func (e *BaseTaskExecutor) runSubtask(ctx context.Context, stepExecutor execute.StepExecutor, subtask *proto.Subtask) { + err := func() error { + e.currSubtaskID.Store(subtask.ID) + + var wg util.WaitGroupWrapper + checkCtx, checkCancel := context.WithCancel(ctx) + wg.Go(func() { + e.checkBalanceSubtask(checkCtx) + }) + defer func() { + checkCancel() + wg.Wait() + }() + + return stepExecutor.RunSubtask(ctx, subtask) + }() + failpoint.Inject("MockRunSubtaskCancel", func(val failpoint.Value) { + if val.(bool) { + err = ErrCancelSubtask + } + }) + + failpoint.Inject("MockRunSubtaskContextCanceled", func(val failpoint.Value) { + if val.(bool) { + err = context.Canceled + } + }) + + if err != nil { + e.onError(err) + } + + finished := e.markSubTaskCanceledOrFailed(ctx, subtask) + if finished { + return + } + + failpoint.Inject("mockTiDBDown", func(val failpoint.Value) { + e.logger.Info("trigger mockTiDBDown") + if e.id == val.(string) || e.id == ":4001" || e.id == ":4002" { + v, ok := testContexts.Load(e.id) + if ok { + v.(*TestContext).TestSyncSubtaskRun <- struct{}{} + v.(*TestContext).mockDown.Store(true) + e.logger.Info("mockTiDBDown") + time.Sleep(2 * time.Second) + failpoint.Return() + } + } + }) + failpoint.Inject("mockTiDBDown2", func() { + if e.id == ":4003" && subtask.Step == proto.StepTwo { + v, ok := testContexts.Load(e.id) + if ok { + v.(*TestContext).TestSyncSubtaskRun <- struct{}{} + v.(*TestContext).mockDown.Store(true) + time.Sleep(2 * time.Second) + return + } + } + }) + + failpoint.Inject("mockTiDBPartitionThenResume", func(val failpoint.Value) { + if val.(bool) && (e.id == ":4000" || e.id == ":4001" || e.id == ":4002") { + infosync.MockGlobalServerInfoManagerEntry.DeleteByExecID(e.id) + time.Sleep(20 * time.Second) + } + }) + + failpoint.Inject("MockExecutorRunErr", func(val failpoint.Value) { + if val.(bool) { + e.onError(errors.New("MockExecutorRunErr")) + } + }) + failpoint.Inject("MockExecutorRunCancel", func(val failpoint.Value) { + if taskID, ok := val.(int); ok { + mgr, err := storage.GetTaskManager() + if err != nil { + logutil.BgLogger().Error("get task manager failed", zap.Error(err)) + } else { + err = mgr.CancelTask(ctx, int64(taskID)) + if err != nil { + logutil.BgLogger().Error("cancel task failed", zap.Error(err)) + } + } + } + }) + e.onSubtaskFinished(ctx, stepExecutor, subtask) +} + +func (e *BaseTaskExecutor) onSubtaskFinished(ctx context.Context, executor execute.StepExecutor, subtask *proto.Subtask) { + if err := e.getError(); err == nil { + if err = executor.OnFinished(ctx, subtask); err != nil { + e.onError(err) + } + } + failpoint.Inject("MockSubtaskFinishedCancel", func(val failpoint.Value) { + if val.(bool) { + e.onError(ErrCancelSubtask) + } + }) + + finished := e.markSubTaskCanceledOrFailed(ctx, subtask) + if finished { + return + } + + e.finishSubtaskAndUpdateState(ctx, subtask) + + finished = e.markSubTaskCanceledOrFailed(ctx, subtask) + if finished { + return + } + + failpoint.Inject("syncAfterSubtaskFinish", func() { + TestSyncChan <- struct{}{} + <-TestSyncChan + }) +} + +// Rollback rollbacks the subtask. +func (e *BaseTaskExecutor) Rollback(ctx context.Context, task *proto.Task) error { + // TODO: we can centralized this when we move handleExecutableTask loop here. + e.task.Store(task) + rollbackCtx, rollbackCancel := context.WithCancelCause(ctx) + defer rollbackCancel(ErrFinishRollback) + e.registerCancelFunc(rollbackCancel) + + e.resetError() + e.logger.Info("taskExecutor rollback a step") + + // We should cancel all subtasks before rolling back + for { + subtask, err := e.taskTable.GetFirstSubtaskInStates(ctx, e.id, task.ID, task.Step, + proto.SubtaskStatePending, proto.SubtaskStateRunning) + if err != nil { + e.onError(err) + return e.getError() + } + + if subtask == nil { + break + } + + e.updateSubtaskStateAndError(ctx, subtask, proto.SubtaskStateCanceled, nil) + if err = e.getError(); err != nil { + return err + } + } + + executor, err := e.GetStepExecutor(ctx, task, nil, nil) + if err != nil { + e.onError(err) + return e.getError() + } + subtask, err := e.taskTable.GetFirstSubtaskInStates(ctx, e.id, task.ID, task.Step, + proto.SubtaskStateRevertPending, proto.SubtaskStateReverting) + if err != nil { + e.onError(err) + return e.getError() + } + if subtask == nil { + logutil.BgLogger().Warn("taskExecutor rollback a step, but no subtask in revert_pending state") + return nil + } + if subtask.State == proto.SubtaskStateRevertPending { + e.updateSubtaskStateAndError(ctx, subtask, proto.SubtaskStateReverting, nil) + } + if err := e.getError(); err != nil { + return err + } + + // right now all impl of Rollback is empty, so we don't check idempotent here. + // will try to remove this rollback completely in the future. + err = executor.Rollback(rollbackCtx) + if err != nil { + e.updateSubtaskStateAndError(ctx, subtask, proto.SubtaskStateRevertFailed, nil) + e.onError(err) + } else { + e.updateSubtaskStateAndError(ctx, subtask, proto.SubtaskStateReverted, nil) + } + return e.getError() +} + +// Close closes the TaskExecutor when all the subtasks are complete. +func (*BaseTaskExecutor) Close() { +} + +func runSummaryCollectLoop( + ctx context.Context, + task *proto.Task, + taskTable TaskTable, +) (summary *execute.Summary, cleanup func(), err error) { + failpoint.Inject("mockSummaryCollectErr", func() { + failpoint.Return(nil, func() {}, errors.New("summary collect err")) + }) + taskMgr, ok := taskTable.(*storage.TaskManager) + if !ok { + return nil, func() {}, nil + } + opt, ok := taskTypes[task.Type] + if !ok { + return nil, func() {}, errors.Errorf("taskExecutor option for type %s not found", task.Type) + } + if opt.Summary != nil { + go opt.Summary.UpdateRowCountLoop(ctx, taskMgr) + return opt.Summary, func() { + opt.Summary.PersistRowCount(ctx, taskMgr) + }, nil + } + return nil, func() {}, nil +} + +func (e *BaseTaskExecutor) registerCancelFunc(cancel context.CancelCauseFunc) { + e.mu.Lock() + defer e.mu.Unlock() + e.mu.runtimeCancel = cancel +} + +// cancelRunStep cancels runStep, i.e. the running process, but leave the subtask +// state unchanged. +func (e *BaseTaskExecutor) cancelRunStep() { + e.mu.Lock() + defer e.mu.Unlock() + if e.mu.runtimeCancel != nil { + e.mu.runtimeCancel(nil) + } +} + +func (e *BaseTaskExecutor) onError(err error) { + if err == nil { + return + } + err = errors.Trace(err) + e.logger.Error("onError", zap.Error(err), zap.Stack("stack")) + e.mu.Lock() + defer e.mu.Unlock() + + if e.mu.err == nil { + e.mu.err = err + e.logger.Error("taskExecutor met first error", zap.Error(err)) + } + + if e.mu.runtimeCancel != nil { + e.mu.runtimeCancel(err) + } +} + +func (e *BaseTaskExecutor) markErrorHandled() { + e.mu.Lock() + defer e.mu.Unlock() + e.mu.handled = true +} + +func (e *BaseTaskExecutor) getError() error { + e.mu.RLock() + defer e.mu.RUnlock() + return e.mu.err +} + +func (e *BaseTaskExecutor) resetError() { + e.mu.Lock() + defer e.mu.Unlock() + e.mu.err = nil + e.mu.handled = false +} + +func (e *BaseTaskExecutor) startSubtaskAndUpdateState(ctx context.Context, subtask *proto.Subtask) error { + err := e.startSubtask(ctx, subtask.ID) + if err == nil { + metrics.DecDistTaskSubTaskCnt(subtask) + metrics.EndDistTaskSubTask(subtask) + subtask.State = proto.SubtaskStateRunning + metrics.IncDistTaskSubTaskCnt(subtask) + metrics.StartDistTaskSubTask(subtask) + } + return err +} + +func (e *BaseTaskExecutor) updateSubtaskStateAndErrorImpl(ctx context.Context, execID string, subtaskID int64, state proto.SubtaskState, subTaskErr error) { + // retry for 3+6+12+24+(30-4)*30 ~= 825s ~= 14 minutes + backoffer := backoff.NewExponential(scheduler.RetrySQLInterval, 2, scheduler.RetrySQLMaxInterval) + err := handle.RunWithRetry(ctx, scheduler.RetrySQLTimes, backoffer, e.logger, + func(ctx context.Context) (bool, error) { + return true, e.taskTable.UpdateSubtaskStateAndError(ctx, execID, subtaskID, state, subTaskErr) + }, + ) + if err != nil { + e.onError(err) + } +} + +// startSubtask try to change the state of the subtask to running. +// If the subtask is not owned by the task executor, +// the update will fail and task executor should not run the subtask. +func (e *BaseTaskExecutor) startSubtask(ctx context.Context, subtaskID int64) error { + // retry for 3+6+12+24+(30-4)*30 ~= 825s ~= 14 minutes + backoffer := backoff.NewExponential(scheduler.RetrySQLInterval, 2, scheduler.RetrySQLMaxInterval) + return handle.RunWithRetry(ctx, scheduler.RetrySQLTimes, backoffer, e.logger, + func(ctx context.Context) (bool, error) { + err := e.taskTable.StartSubtask(ctx, subtaskID, e.id) + if err == storage.ErrSubtaskNotFound { + // No need to retry. + return false, err + } + return true, err + }, + ) +} + +func (e *BaseTaskExecutor) finishSubtask(ctx context.Context, subtask *proto.Subtask) { + backoffer := backoff.NewExponential(scheduler.RetrySQLInterval, 2, scheduler.RetrySQLMaxInterval) + err := handle.RunWithRetry(ctx, scheduler.RetrySQLTimes, backoffer, e.logger, + func(ctx context.Context) (bool, error) { + return true, e.taskTable.FinishSubtask(ctx, subtask.ExecID, subtask.ID, subtask.Meta) + }, + ) + if err != nil { + e.onError(err) + } +} + +func (e *BaseTaskExecutor) updateSubtaskStateAndError(ctx context.Context, subtask *proto.Subtask, state proto.SubtaskState, subTaskErr error) { + metrics.DecDistTaskSubTaskCnt(subtask) + metrics.EndDistTaskSubTask(subtask) + e.updateSubtaskStateAndErrorImpl(ctx, subtask.ExecID, subtask.ID, state, subTaskErr) + subtask.State = state + metrics.IncDistTaskSubTaskCnt(subtask) + if !subtask.IsDone() { + metrics.StartDistTaskSubTask(subtask) + } +} + +func (e *BaseTaskExecutor) finishSubtaskAndUpdateState(ctx context.Context, subtask *proto.Subtask) { + metrics.DecDistTaskSubTaskCnt(subtask) + metrics.EndDistTaskSubTask(subtask) + e.finishSubtask(ctx, subtask) + subtask.State = proto.SubtaskStateSucceed + metrics.IncDistTaskSubTaskCnt(subtask) +} + +// markSubTaskCanceledOrFailed check the error type and decide the subtasks' state. +// 1. Only cancel subtasks when meet ErrCancelSubtask. +// 2. Only fail subtasks when meet non retryable error. +// 3. When meet other errors, don't change subtasks' state. +func (e *BaseTaskExecutor) markSubTaskCanceledOrFailed(ctx context.Context, subtask *proto.Subtask) bool { + if err := e.getError(); err != nil { + err := errors.Cause(err) + if ctx.Err() != nil && context.Cause(ctx) == ErrCancelSubtask { + e.logger.Warn("subtask canceled", zap.Error(err)) + e.updateSubtaskStateAndError(e.ctx, subtask, proto.SubtaskStateCanceled, nil) + } else if e.IsRetryableError(err) { + e.logger.Warn("meet retryable error", zap.Error(err)) + } else if common.IsContextCanceledError(err) { + e.logger.Info("meet context canceled for gracefully shutdown", zap.Error(err)) + } else { + e.logger.Warn("subtask failed", zap.Error(err)) + e.updateSubtaskStateAndError(e.ctx, subtask, proto.SubtaskStateFailed, err) + } + e.markErrorHandled() + return true + } + return false +} + +func (e *BaseTaskExecutor) failSubtaskWithRetry(ctx context.Context, taskID int64, err error) error { + backoffer := backoff.NewExponential(scheduler.RetrySQLInterval, 2, scheduler.RetrySQLMaxInterval) + err1 := handle.RunWithRetry(e.ctx, scheduler.RetrySQLTimes, backoffer, e.logger, + func(_ context.Context) (bool, error) { + return true, e.taskTable.FailSubtask(ctx, e.id, taskID, err) + }, + ) + if err1 == nil { + e.logger.Info("failed one subtask succeed", zap.NamedError("subtask-err", err)) + } + return err1 +} + +func (e *BaseTaskExecutor) cancelSubtaskWithRetry(ctx context.Context, taskID int64, err error) error { + e.logger.Warn("subtask canceled", zap.NamedError("subtask-cancel", err)) + backoffer := backoff.NewExponential(scheduler.RetrySQLInterval, 2, scheduler.RetrySQLMaxInterval) + err1 := handle.RunWithRetry(e.ctx, scheduler.RetrySQLTimes, backoffer, e.logger, + func(_ context.Context) (bool, error) { + return true, e.taskTable.CancelSubtask(ctx, e.id, taskID) + }, + ) + if err1 == nil { + e.logger.Info("canceled one subtask succeed", zap.NamedError("subtask-cancel", err)) + } + return err1 +} + +// updateSubtask check the error type and decide the subtasks' state. +// 1. Only cancel subtasks when meet ErrCancelSubtask. +// 2. Only fail subtasks when meet non retryable error. +// 3. When meet other errors, don't change subtasks' state. +// Handled errors should not happened during subtasks execution. +// Only handle errors before subtasks execution and after subtasks execution. +func (e *BaseTaskExecutor) updateSubtask(ctx context.Context, taskID int64, err error) error { + err = errors.Cause(err) + if ctx.Err() != nil && context.Cause(ctx) == ErrCancelSubtask { + return e.cancelSubtaskWithRetry(ctx, taskID, ErrCancelSubtask) + } else if e.IsRetryableError(err) { + e.logger.Warn("meet retryable error", zap.Error(err)) + } else if common.IsContextCanceledError(err) { + e.logger.Info("meet context canceled for gracefully shutdown", zap.Error(err)) + } else { + return e.failSubtaskWithRetry(ctx, taskID, err) + } + return nil +} diff --git a/pkg/disttask/framework/taskexecutor/task_executor_test.go b/pkg/disttask/framework/taskexecutor/task_executor_test.go new file mode 100644 index 0000000000000..dbcad18762840 --- /dev/null +++ b/pkg/disttask/framework/taskexecutor/task_executor_test.go @@ -0,0 +1,710 @@ +// Copyright 2023 PingCAP, 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. + +package taskexecutor + +import ( + "context" + "testing" + "time" + + "github.com/pingcap/errors" + "github.com/pingcap/failpoint" + "github.com/pingcap/tidb/pkg/disttask/framework/mock" + mockexecute "github.com/pingcap/tidb/pkg/disttask/framework/mock/execute" + "github.com/pingcap/tidb/pkg/disttask/framework/proto" + "github.com/pingcap/tidb/pkg/disttask/framework/storage" + "github.com/stretchr/testify/require" + "go.uber.org/mock/gomock" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" +) + +var ( + unfinishedNormalSubtaskStates = []interface{}{ + proto.SubtaskStatePending, proto.SubtaskStateRunning, + } + unfinishedRevertSubtaskStates = []interface{}{ + proto.SubtaskStateRevertPending, proto.SubtaskStateReverting, + } +) + +func TestTaskExecutorRun(t *testing.T) { + var tp proto.TaskType = "test_task_executor_run" + var taskID int64 = 1 + var concurrency = 10 + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + runCtx, runCancel := context.WithCancel(ctx) + defer runCancel() + ctrl := gomock.NewController(t) + defer ctrl.Finish() + mockSubtaskTable := mock.NewMockTaskTable(ctrl) + mockStepExecutor := mockexecute.NewMockStepExecutor(ctrl) + mockExtension := mock.NewMockExtension(ctrl) + mockExtension.EXPECT().IsRetryableError(gomock.Any()).AnyTimes() + + // mock for checkBalanceSubtask + mockSubtaskTable.EXPECT().GetSubtasksByExecIDAndStepAndStates(gomock.Any(), "id", + taskID, proto.StepOne, proto.SubtaskStateRunning).Return([]*proto.Subtask{{ID: 1}}, nil).AnyTimes() + + task1 := &proto.Task{Step: proto.StepOne, Type: tp} + // 1. no taskExecutor constructor + taskExecutorRegisterErr := errors.Errorf("constructor of taskExecutor for key not found") + mockExtension.EXPECT().GetStepExecutor(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(nil, taskExecutorRegisterErr).Times(2) + taskExecutor := NewBaseTaskExecutor(ctx, "id", task1, mockSubtaskTable) + taskExecutor.Extension = mockExtension + err := taskExecutor.runStep(runCtx, task1, nil) + require.EqualError(t, err, taskExecutorRegisterErr.Error()) + mockSubtaskTable.EXPECT().FailSubtask(runCtx, gomock.Any(), gomock.Any(), gomock.Any()).Return(nil).AnyTimes() + err = taskExecutor.RunStep(runCtx, task1, nil) + require.NoError(t, err) + require.True(t, ctrl.Satisfied()) + + // 2. init subtask exec env failed + mockExtension.EXPECT().GetStepExecutor(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(mockStepExecutor, nil).AnyTimes() + + initErr := errors.New("init error") + mockStepExecutor.EXPECT().Init(gomock.Any()).Return(initErr) + err = taskExecutor.runStep(runCtx, task1, nil) + require.EqualError(t, err, initErr.Error()) + require.True(t, ctrl.Satisfied()) + + task := &proto.Task{Step: proto.StepOne, Type: tp, ID: taskID, Concurrency: concurrency} + // 3. run subtask failed + runSubtaskErr := errors.New("run subtask error") + mockStepExecutor.EXPECT().Init(gomock.Any()).Return(nil) + mockSubtaskTable.EXPECT().GetSubtasksByExecIDAndStepAndStates(gomock.Any(), "id", taskID, proto.StepOne, + unfinishedNormalSubtaskStates...).Return([]*proto.Subtask{{ + ID: 1, Type: tp, Step: proto.StepOne, State: proto.SubtaskStatePending, ExecID: "id"}}, nil) + mockSubtaskTable.EXPECT().GetFirstSubtaskInStates(gomock.Any(), "id", taskID, proto.StepOne, + unfinishedNormalSubtaskStates...).Return(&proto.Subtask{ + ID: 1, Type: tp, Step: proto.StepOne, State: proto.SubtaskStatePending, ExecID: "id"}, nil) + mockSubtaskTable.EXPECT().StartSubtask(gomock.Any(), taskID, "id").Return(nil) + mockStepExecutor.EXPECT().RunSubtask(gomock.Any(), gomock.Any()).Return(runSubtaskErr) + mockSubtaskTable.EXPECT().UpdateSubtaskStateAndError(gomock.Any(), "id", taskID, proto.SubtaskStateFailed, gomock.Any()).Return(nil) + mockStepExecutor.EXPECT().Cleanup(gomock.Any()).Return(nil) + + err = taskExecutor.RunStep(runCtx, task, nil) + require.EqualError(t, err, runSubtaskErr.Error()) + require.True(t, ctrl.Satisfied()) + + // 4. run subtask success + mockStepExecutor.EXPECT().Init(gomock.Any()).Return(nil) + mockSubtaskTable.EXPECT().GetSubtasksByExecIDAndStepAndStates(gomock.Any(), "id", taskID, proto.StepOne, + unfinishedNormalSubtaskStates...).Return([]*proto.Subtask{{ + ID: 1, Type: tp, Step: proto.StepOne, State: proto.SubtaskStatePending, ExecID: "id"}}, nil) + mockSubtaskTable.EXPECT().GetFirstSubtaskInStates(gomock.Any(), "id", taskID, proto.StepOne, + unfinishedNormalSubtaskStates...).Return(&proto.Subtask{ + ID: 1, Type: tp, Step: proto.StepOne, State: proto.SubtaskStatePending, ExecID: "id"}, nil) + mockSubtaskTable.EXPECT().StartSubtask(gomock.Any(), taskID, "id").Return(nil) + mockStepExecutor.EXPECT().RunSubtask(gomock.Any(), gomock.Any()).Return(nil) + mockStepExecutor.EXPECT().OnFinished(gomock.Any(), gomock.Any()).Return(nil) + mockSubtaskTable.EXPECT().FinishSubtask(gomock.Any(), "id", int64(1), gomock.Any()).Return(nil) + mockSubtaskTable.EXPECT().GetFirstSubtaskInStates(gomock.Any(), "id", taskID, proto.StepOne, + unfinishedNormalSubtaskStates...).Return(nil, nil) + mockSubtaskTable.EXPECT().GetTaskByID(gomock.Any(), gomock.Any()).Return(&proto.Task{ID: taskID, Step: proto.StepTwo}, nil) + mockStepExecutor.EXPECT().Cleanup(gomock.Any()).Return(nil) + err = taskExecutor.RunStep(runCtx, task, nil) + require.NoError(t, err) + require.True(t, ctrl.Satisfied()) + + // 5. run subtask one by one + mockStepExecutor.EXPECT().Init(gomock.Any()).Return(nil) + mockSubtaskTable.EXPECT().GetSubtasksByExecIDAndStepAndStates(gomock.Any(), "id", taskID, proto.StepOne, + unfinishedNormalSubtaskStates...).Return( + []*proto.Subtask{ + {ID: 1, Type: tp, Step: proto.StepOne, State: proto.SubtaskStatePending, ExecID: "id"}, + {ID: 2, Type: tp, Step: proto.StepOne, State: proto.SubtaskStatePending, ExecID: "id"}, + }, nil) + // first round of the run loop + mockSubtaskTable.EXPECT().GetFirstSubtaskInStates(gomock.Any(), "id", taskID, proto.StepOne, + unfinishedNormalSubtaskStates...).Return(&proto.Subtask{ + ID: 1, Type: tp, Step: proto.StepOne, State: proto.SubtaskStatePending, ExecID: "id"}, nil) + mockSubtaskTable.EXPECT().StartSubtask(gomock.Any(), int64(1), "id").Return(nil) + mockStepExecutor.EXPECT().RunSubtask(gomock.Any(), gomock.Any()).Return(nil) + mockStepExecutor.EXPECT().OnFinished(gomock.Any(), gomock.Any()).Return(nil) + mockSubtaskTable.EXPECT().FinishSubtask(gomock.Any(), "id", int64(1), gomock.Any()).Return(nil) + // second round of the run loop + mockSubtaskTable.EXPECT().GetFirstSubtaskInStates(gomock.Any(), "id", taskID, proto.StepOne, + unfinishedNormalSubtaskStates...).Return(&proto.Subtask{ + ID: 2, Type: tp, Step: proto.StepOne, State: proto.SubtaskStatePending, ExecID: "id"}, nil) + mockSubtaskTable.EXPECT().StartSubtask(gomock.Any(), int64(2), "id").Return(nil) + mockStepExecutor.EXPECT().RunSubtask(gomock.Any(), gomock.Any()).Return(nil) + mockStepExecutor.EXPECT().OnFinished(gomock.Any(), gomock.Any()).Return(nil) + mockSubtaskTable.EXPECT().FinishSubtask(gomock.Any(), "id", int64(2), gomock.Any()).Return(nil) + // third round of the run loop + mockSubtaskTable.EXPECT().GetFirstSubtaskInStates(gomock.Any(), "id", taskID, proto.StepOne, + unfinishedNormalSubtaskStates...).Return(nil, nil) + mockSubtaskTable.EXPECT().GetTaskByID(gomock.Any(), gomock.Any()).Return(&proto.Task{ID: taskID, Step: proto.StepTwo}, nil) + mockStepExecutor.EXPECT().Cleanup(gomock.Any()).Return(nil) + err = taskExecutor.RunStep(runCtx, task, nil) + require.NoError(t, err) + require.True(t, ctrl.Satisfied()) + + // run previous left subtask in running state again, but the subtask is not + // idempotent, so fail it. + subtaskID := int64(2) + theSubtask := &proto.Subtask{ID: subtaskID, Type: tp, Step: proto.StepOne, State: proto.SubtaskStateRunning, ExecID: "id"} + mockSubtaskTable.EXPECT().GetSubtasksByExecIDAndStepAndStates(gomock.Any(), "id", taskID, proto.StepOne, + unfinishedNormalSubtaskStates...).Return([]*proto.Subtask{theSubtask}, nil) + mockStepExecutor.EXPECT().Init(gomock.Any()).Return(nil) + mockSubtaskTable.EXPECT().GetFirstSubtaskInStates(gomock.Any(), "id", taskID, proto.StepOne, + unfinishedNormalSubtaskStates...).Return(theSubtask, nil) + mockExtension.EXPECT().IsIdempotent(gomock.Any()).Return(false) + mockSubtaskTable.EXPECT().UpdateSubtaskStateAndError(gomock.Any(), "id", subtaskID, proto.SubtaskStateFailed, gomock.Any()).Return(nil) + mockStepExecutor.EXPECT().Cleanup(gomock.Any()).Return(nil) + err = taskExecutor.RunStep(runCtx, task, nil) + require.ErrorContains(t, err, "subtask in running state and is not idempotent") + require.True(t, ctrl.Satisfied()) + + // run previous left subtask in running state again, but the subtask idempotent, + // run it again. + theSubtask = &proto.Subtask{ID: subtaskID, Type: tp, Step: proto.StepOne, State: proto.SubtaskStateRunning, ExecID: "id"} + mockSubtaskTable.EXPECT().GetSubtasksByExecIDAndStepAndStates(gomock.Any(), "id", taskID, proto.StepOne, + unfinishedNormalSubtaskStates...).Return([]*proto.Subtask{theSubtask}, nil) + mockStepExecutor.EXPECT().Init(gomock.Any()).Return(nil) + // first round of the run loop + mockSubtaskTable.EXPECT().GetFirstSubtaskInStates(gomock.Any(), "id", taskID, proto.StepOne, + unfinishedNormalSubtaskStates...).Return(theSubtask, nil) + mockExtension.EXPECT().IsIdempotent(gomock.Any()).Return(true) + mockStepExecutor.EXPECT().RunSubtask(gomock.Any(), gomock.Any()).Return(nil) + mockStepExecutor.EXPECT().OnFinished(gomock.Any(), gomock.Any()).Return(nil) + mockSubtaskTable.EXPECT().FinishSubtask(gomock.Any(), "id", subtaskID, gomock.Any()).Return(nil) + // second round of the run loop + mockSubtaskTable.EXPECT().GetFirstSubtaskInStates(gomock.Any(), "id", taskID, proto.StepOne, + unfinishedNormalSubtaskStates...).Return(nil, nil) + mockSubtaskTable.EXPECT().GetTaskByID(gomock.Any(), gomock.Any()).Return(&proto.Task{ID: taskID, Step: proto.StepTwo}, nil) + mockStepExecutor.EXPECT().Cleanup(gomock.Any()).Return(nil) + err = taskExecutor.RunStep(runCtx, task, nil) + require.NoError(t, err) + require.True(t, ctrl.Satisfied()) + + // 6. cancel + mockSubtaskTable.EXPECT().GetSubtasksByExecIDAndStepAndStates(gomock.Any(), "id", taskID, proto.StepOne, + unfinishedNormalSubtaskStates...).Return([]*proto.Subtask{{ + ID: 2, Type: tp, Step: proto.StepOne, State: proto.SubtaskStatePending, ExecID: "id"}}, nil) + mockStepExecutor.EXPECT().Init(gomock.Any()).Return(nil) + mockSubtaskTable.EXPECT().GetFirstSubtaskInStates(gomock.Any(), "id", taskID, proto.StepOne, + unfinishedNormalSubtaskStates...).Return(&proto.Subtask{ + ID: 1, Type: tp, Step: proto.StepOne, State: proto.SubtaskStatePending, ExecID: "id"}, nil) + mockSubtaskTable.EXPECT().StartSubtask(gomock.Any(), taskID, "id").Return(nil) + mockStepExecutor.EXPECT().RunSubtask(gomock.Any(), gomock.Any()).Return(ErrCancelSubtask) + mockSubtaskTable.EXPECT().UpdateSubtaskStateAndError(gomock.Any(), "id", taskID, proto.SubtaskStateCanceled, gomock.Any()).Return(nil) + mockStepExecutor.EXPECT().Cleanup(gomock.Any()).Return(nil) + err = taskExecutor.RunStep(runCtx, task, nil) + require.EqualError(t, err, ErrCancelSubtask.Error()) + require.True(t, ctrl.Satisfied()) + + // 7. RunSubtask return context.Canceled + mockSubtaskTable.EXPECT().GetSubtasksByExecIDAndStepAndStates(gomock.Any(), "id", taskID, proto.StepOne, + unfinishedNormalSubtaskStates...).Return([]*proto.Subtask{{ + ID: 2, Type: tp, Step: proto.StepOne, State: proto.SubtaskStatePending, ExecID: "id"}}, nil) + mockStepExecutor.EXPECT().Init(gomock.Any()).Return(nil) + mockSubtaskTable.EXPECT().GetFirstSubtaskInStates(gomock.Any(), "id", taskID, proto.StepOne, + unfinishedNormalSubtaskStates...).Return(&proto.Subtask{ + ID: 1, Type: tp, Step: proto.StepOne, State: proto.SubtaskStatePending, ExecID: "id"}, nil) + mockSubtaskTable.EXPECT().StartSubtask(gomock.Any(), taskID, "id").Return(nil) + mockStepExecutor.EXPECT().RunSubtask(gomock.Any(), gomock.Any()).Return(context.Canceled) + mockStepExecutor.EXPECT().Cleanup(gomock.Any()).Return(nil) + err = taskExecutor.RunStep(runCtx, task, nil) + require.EqualError(t, err, context.Canceled.Error()) + require.True(t, ctrl.Satisfied()) + + // 8. grpc cancel + mockSubtaskTable.EXPECT().GetSubtasksByExecIDAndStepAndStates(gomock.Any(), "id", taskID, proto.StepOne, + unfinishedNormalSubtaskStates...).Return([]*proto.Subtask{{ + ID: 2, Type: tp, Step: proto.StepOne, State: proto.SubtaskStatePending, ExecID: "id"}}, nil) + mockStepExecutor.EXPECT().Init(gomock.Any()).Return(nil) + mockSubtaskTable.EXPECT().GetFirstSubtaskInStates(gomock.Any(), "id", taskID, proto.StepOne, + unfinishedNormalSubtaskStates...).Return(&proto.Subtask{ + ID: 1, Type: tp, Step: proto.StepOne, State: proto.SubtaskStatePending, ExecID: "id"}, nil) + mockSubtaskTable.EXPECT().StartSubtask(gomock.Any(), taskID, "id").Return(nil) + grpcErr := status.Error(codes.Canceled, "test cancel") + mockStepExecutor.EXPECT().RunSubtask(gomock.Any(), gomock.Any()).Return(grpcErr) + mockStepExecutor.EXPECT().Cleanup(gomock.Any()).Return(nil) + err = taskExecutor.RunStep(runCtx, task, nil) + require.EqualError(t, err, grpcErr.Error()) + require.True(t, ctrl.Satisfied()) + + // 9. annotate grpc cancel + mockSubtaskTable.EXPECT().GetSubtasksByExecIDAndStepAndStates(gomock.Any(), "id", taskID, proto.StepOne, + unfinishedNormalSubtaskStates...).Return([]*proto.Subtask{{ + ID: 2, Type: tp, Step: proto.StepOne, State: proto.SubtaskStatePending, ExecID: "id"}}, nil) + mockStepExecutor.EXPECT().Init(gomock.Any()).Return(nil) + mockSubtaskTable.EXPECT().GetFirstSubtaskInStates(gomock.Any(), "id", taskID, proto.StepOne, + unfinishedNormalSubtaskStates...).Return(&proto.Subtask{ + ID: 1, Type: tp, Step: proto.StepOne, State: proto.SubtaskStatePending, ExecID: "id"}, nil) + mockSubtaskTable.EXPECT().StartSubtask(gomock.Any(), taskID, "id").Return(nil) + grpcErr = status.Error(codes.Canceled, "test cancel") + annotatedError := errors.Annotatef( + grpcErr, + " %s", + "test annotate", + ) + mockStepExecutor.EXPECT().RunSubtask(gomock.Any(), gomock.Any()).Return(annotatedError) + mockStepExecutor.EXPECT().Cleanup(gomock.Any()).Return(nil) + err = taskExecutor.RunStep(runCtx, task, nil) + require.EqualError(t, err, annotatedError.Error()) + require.True(t, ctrl.Satisfied()) + + // 10. subtask owned by other executor + mockStepExecutor.EXPECT().Init(gomock.Any()).Return(nil) + mockSubtaskTable.EXPECT().GetSubtasksByExecIDAndStepAndStates(gomock.Any(), "id", taskID, proto.StepOne, + unfinishedNormalSubtaskStates...).Return([]*proto.Subtask{{ + ID: 1, Type: tp, Step: proto.StepOne, State: proto.SubtaskStatePending, ExecID: "id"}}, nil) + mockSubtaskTable.EXPECT().GetFirstSubtaskInStates(gomock.Any(), "id", taskID, proto.StepOne, + unfinishedNormalSubtaskStates...).Return(&proto.Subtask{ + ID: 1, Type: tp, Step: proto.StepOne, State: proto.SubtaskStatePending, ExecID: "id"}, nil) + mockSubtaskTable.EXPECT().GetFirstSubtaskInStates(gomock.Any(), "id", taskID, proto.StepOne, + unfinishedNormalSubtaskStates...).Return(nil, nil) + mockSubtaskTable.EXPECT().StartSubtask(gomock.Any(), taskID, "id").Return(storage.ErrSubtaskNotFound) + mockSubtaskTable.EXPECT().GetTaskByID(gomock.Any(), gomock.Any()).Return(&proto.Task{ID: taskID, Step: proto.StepTwo}, nil) + mockStepExecutor.EXPECT().Cleanup(gomock.Any()).Return(nil) + err = taskExecutor.RunStep(runCtx, task, nil) + require.NoError(t, err) + runCancel() + require.True(t, ctrl.Satisfied()) +} + +func TestTaskExecutorRollback(t *testing.T) { + var tp proto.TaskType = "test_executor_rollback" + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + runCtx, runCancel := context.WithCancel(ctx) + defer runCancel() + ctrl := gomock.NewController(t) + defer ctrl.Finish() + mockSubtaskTable := mock.NewMockTaskTable(ctrl) + mockStepExecutor := mockexecute.NewMockStepExecutor(ctrl) + mockExtension := mock.NewMockExtension(ctrl) + + // 1. no taskExecutor constructor + task1 := &proto.Task{Step: proto.StepOne, ID: 1, Type: tp} + taskExecutorRegisterErr := errors.Errorf("constructor of taskExecutor for key not found") + mockExtension.EXPECT().GetStepExecutor(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(nil, taskExecutorRegisterErr) + taskExecutor := NewBaseTaskExecutor(ctx, "id", task1, mockSubtaskTable) + taskExecutor.Extension = mockExtension + mockSubtaskTable.EXPECT().GetFirstSubtaskInStates(runCtx, "id", int64(1), proto.StepOne, + unfinishedNormalSubtaskStates...).Return(nil, nil) + err := taskExecutor.Rollback(runCtx, task1) + require.EqualError(t, err, taskExecutorRegisterErr.Error()) + + mockExtension.EXPECT().GetStepExecutor(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(mockStepExecutor, nil).AnyTimes() + + // 2. get subtask failed + getSubtaskErr := errors.New("get subtask error") + var taskID int64 = 1 + mockSubtaskTable.EXPECT().GetFirstSubtaskInStates(runCtx, "id", taskID, proto.StepOne, + unfinishedNormalSubtaskStates...).Return(nil, nil) + mockSubtaskTable.EXPECT().GetFirstSubtaskInStates(runCtx, "id", taskID, proto.StepOne, + unfinishedRevertSubtaskStates...).Return(nil, getSubtaskErr) + err = taskExecutor.Rollback(runCtx, &proto.Task{Step: proto.StepOne, Type: tp, ID: taskID}) + require.EqualError(t, err, getSubtaskErr.Error()) + + // 3. no subtask + mockSubtaskTable.EXPECT().GetFirstSubtaskInStates(runCtx, "id", taskID, proto.StepOne, + unfinishedNormalSubtaskStates...).Return(nil, nil) + mockSubtaskTable.EXPECT().GetFirstSubtaskInStates(runCtx, "id", taskID, proto.StepOne, + unfinishedRevertSubtaskStates...).Return(nil, nil) + err = taskExecutor.Rollback(runCtx, &proto.Task{Step: proto.StepOne, Type: tp, ID: taskID}) + require.NoError(t, err) + + // 4. rollback failed + rollbackErr := errors.New("rollback error") + mockSubtaskTable.EXPECT().GetFirstSubtaskInStates(runCtx, "id", taskID, proto.StepOne, + unfinishedNormalSubtaskStates...).Return(nil, nil) + mockSubtaskTable.EXPECT().GetFirstSubtaskInStates(runCtx, "id", taskID, proto.StepOne, + unfinishedRevertSubtaskStates...).Return(&proto.Subtask{ID: 1, State: proto.SubtaskStateRevertPending, ExecID: "id"}, nil) + mockSubtaskTable.EXPECT().UpdateSubtaskStateAndError(runCtx, "id", taskID, proto.SubtaskStateReverting, nil).Return(nil) + mockStepExecutor.EXPECT().Rollback(gomock.Any()).Return(rollbackErr) + mockSubtaskTable.EXPECT().UpdateSubtaskStateAndError(runCtx, "id", taskID, proto.SubtaskStateRevertFailed, nil).Return(nil) + err = taskExecutor.Rollback(runCtx, &proto.Task{Step: proto.StepOne, Type: tp, ID: taskID}) + require.EqualError(t, err, rollbackErr.Error()) + + // 5. rollback success + mockSubtaskTable.EXPECT().GetFirstSubtaskInStates(runCtx, "id", taskID, proto.StepOne, + unfinishedNormalSubtaskStates...).Return(&proto.Subtask{ID: 1, ExecID: "id"}, nil) + mockSubtaskTable.EXPECT().UpdateSubtaskStateAndError(runCtx, "id", int64(1), proto.SubtaskStateCanceled, nil).Return(nil) + mockSubtaskTable.EXPECT().GetFirstSubtaskInStates(runCtx, "id", taskID, proto.StepOne, + unfinishedNormalSubtaskStates...).Return(&proto.Subtask{ID: 2, ExecID: "id"}, nil) + mockSubtaskTable.EXPECT().UpdateSubtaskStateAndError(runCtx, "id", int64(2), proto.SubtaskStateCanceled, nil).Return(nil) + mockSubtaskTable.EXPECT().GetFirstSubtaskInStates(runCtx, "id", taskID, proto.StepOne, + unfinishedNormalSubtaskStates...).Return(nil, nil) + mockSubtaskTable.EXPECT().GetFirstSubtaskInStates(runCtx, "id", taskID, proto.StepOne, + unfinishedRevertSubtaskStates...).Return(&proto.Subtask{ID: 3, State: proto.SubtaskStateRevertPending, ExecID: "id"}, nil) + mockSubtaskTable.EXPECT().UpdateSubtaskStateAndError(runCtx, "id", int64(3), proto.SubtaskStateReverting, nil).Return(nil) + mockStepExecutor.EXPECT().Rollback(gomock.Any()).Return(nil) + mockSubtaskTable.EXPECT().UpdateSubtaskStateAndError(runCtx, "id", int64(3), proto.SubtaskStateReverted, nil).Return(nil) + err = taskExecutor.Rollback(runCtx, &proto.Task{Step: proto.StepOne, Type: tp, ID: taskID}) + require.NoError(t, err) + + // rollback again for previous left subtask in TaskStateReverting state + mockSubtaskTable.EXPECT().GetFirstSubtaskInStates(runCtx, "id", taskID, proto.StepOne, + unfinishedNormalSubtaskStates...).Return(nil, nil) + mockSubtaskTable.EXPECT().GetFirstSubtaskInStates(runCtx, "id", taskID, proto.StepOne, + unfinishedRevertSubtaskStates...).Return(&proto.Subtask{ID: 3, State: proto.SubtaskStateReverting, ExecID: "id"}, nil) + mockStepExecutor.EXPECT().Rollback(gomock.Any()).Return(nil) + mockSubtaskTable.EXPECT().UpdateSubtaskStateAndError(runCtx, "id", int64(3), proto.SubtaskStateReverted, nil).Return(nil) + err = taskExecutor.Rollback(runCtx, &proto.Task{Step: proto.StepOne, Type: tp, ID: taskID}) + require.NoError(t, err) +} + +func TestTaskExecutor(t *testing.T) { + var tp proto.TaskType = "test_task_executor" + var taskID int64 = 1 + var concurrency = 10 + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + runCtx, runCancel := context.WithCancel(ctx) + defer runCancel() + ctrl := gomock.NewController(t) + defer ctrl.Finish() + mockSubtaskTable := mock.NewMockTaskTable(ctrl) + mockStepExecutor := mockexecute.NewMockStepExecutor(ctrl) + mockExtension := mock.NewMockExtension(ctrl) + mockSubtaskTable.EXPECT().UpdateSubtaskStateAndError(gomock.Any(), "id", taskID, proto.SubtaskStateFailed, gomock.Any()).Return(nil) + mockExtension.EXPECT().GetStepExecutor(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(mockStepExecutor, nil).AnyTimes() + mockExtension.EXPECT().IsRetryableError(gomock.Any()).Return(false).AnyTimes() + // mock for checkBalanceSubtask + mockSubtaskTable.EXPECT().GetSubtasksByExecIDAndStepAndStates(gomock.Any(), "id", + taskID, proto.StepOne, proto.SubtaskStateRunning).Return([]*proto.Subtask{{ID: 1}}, nil).AnyTimes() + + task := &proto.Task{Step: proto.StepOne, Type: tp, ID: taskID, Concurrency: concurrency} + taskExecutor := NewBaseTaskExecutor(ctx, "id", task, mockSubtaskTable) + taskExecutor.Extension = mockExtension + + // 1. run failed. + runSubtaskErr := errors.New("run subtask error") + mockStepExecutor.EXPECT().Init(gomock.Any()).Return(nil) + subtasks := []*proto.Subtask{ + {ID: 1, Type: tp, Step: proto.StepOne, State: proto.SubtaskStatePending, ExecID: "id"}, + } + mockSubtaskTable.EXPECT().GetSubtasksByExecIDAndStepAndStates(gomock.Any(), "id", taskID, proto.StepOne, + unfinishedNormalSubtaskStates...).Return(subtasks, nil) + mockSubtaskTable.EXPECT().GetFirstSubtaskInStates(gomock.Any(), "id", taskID, proto.StepOne, + unfinishedNormalSubtaskStates...).Return(subtasks[0], nil) + mockSubtaskTable.EXPECT().StartSubtask(gomock.Any(), taskID, "id").Return(nil) + mockStepExecutor.EXPECT().RunSubtask(gomock.Any(), gomock.Any()).Return(runSubtaskErr) + mockStepExecutor.EXPECT().Cleanup(gomock.Any()).Return(nil) + err := taskExecutor.runStep(runCtx, task, nil) + require.EqualError(t, err, runSubtaskErr.Error()) + require.True(t, ctrl.Satisfied()) + + // 2. rollback success. + mockSubtaskTable.EXPECT().GetFirstSubtaskInStates(runCtx, "id", taskID, proto.StepOne, + unfinishedNormalSubtaskStates...).Return(nil, nil) + mockSubtaskTable.EXPECT().GetFirstSubtaskInStates(runCtx, "id", taskID, proto.StepOne, + unfinishedRevertSubtaskStates...).Return(&proto.Subtask{ID: 1, Type: tp, State: proto.SubtaskStateRevertPending, ExecID: "id"}, nil) + mockSubtaskTable.EXPECT().UpdateSubtaskStateAndError(runCtx, "id", taskID, proto.SubtaskStateReverting, nil).Return(nil) + mockStepExecutor.EXPECT().Rollback(gomock.Any()).Return(nil) + mockSubtaskTable.EXPECT().UpdateSubtaskStateAndError(runCtx, "id", taskID, proto.SubtaskStateReverted, nil).Return(nil) + err = taskExecutor.Rollback(runCtx, &proto.Task{Step: proto.StepOne, Type: tp, ID: taskID}) + require.NoError(t, err) + require.True(t, ctrl.Satisfied()) + + // 3. run one subtask, then task moved to history(ErrTaskNotFound). + mockStepExecutor.EXPECT().Init(gomock.Any()).Return(nil) + mockSubtaskTable.EXPECT().GetSubtasksByExecIDAndStepAndStates(gomock.Any(), "id", taskID, proto.StepOne, + unfinishedNormalSubtaskStates...).Return(subtasks, nil) + mockSubtaskTable.EXPECT().GetFirstSubtaskInStates(gomock.Any(), "id", taskID, proto.StepOne, + unfinishedNormalSubtaskStates...).Return(subtasks[0], nil) + mockSubtaskTable.EXPECT().StartSubtask(gomock.Any(), taskID, "id").Return(nil) + mockStepExecutor.EXPECT().RunSubtask(gomock.Any(), gomock.Any()).Return(nil) + mockStepExecutor.EXPECT().OnFinished(gomock.Any(), gomock.Any()).Return(nil) + mockSubtaskTable.EXPECT().FinishSubtask(gomock.Any(), "id", int64(1), gomock.Any()).Return(nil) + mockSubtaskTable.EXPECT().GetFirstSubtaskInStates(gomock.Any(), "id", taskID, proto.StepOne, + unfinishedNormalSubtaskStates...).Return(nil, nil) + mockSubtaskTable.EXPECT().GetTaskByID(gomock.Any(), gomock.Any()).Return(nil, storage.ErrTaskNotFound) + mockStepExecutor.EXPECT().Cleanup(gomock.Any()).Return(nil) + err = taskExecutor.runStep(runCtx, task, nil) + require.NoError(t, err) + require.True(t, ctrl.Satisfied()) +} + +func TestRunStepCurrentSubtaskScheduledAway(t *testing.T) { + ctrl := gomock.NewController(t) + defer ctrl.Finish() + mockSubtaskTable := mock.NewMockTaskTable(ctrl) + mockStepExecutor := mockexecute.NewMockStepExecutor(ctrl) + mockExtension := mock.NewMockExtension(ctrl) + + task := &proto.Task{Step: proto.StepOne, Type: "example", ID: 1, Concurrency: 1} + subtasks := []*proto.Subtask{ + {ID: 1, Type: "example", Step: proto.StepOne, State: proto.SubtaskStatePending, ExecID: "tidb1"}, + } + ctx := context.Background() + taskExecutor := NewBaseTaskExecutor(ctx, "tidb1", task, mockSubtaskTable) + taskExecutor.Extension = mockExtension + + // mock for checkBalanceSubtask + mockSubtaskTable.EXPECT().GetSubtasksByExecIDAndStepAndStates(gomock.Any(), "tidb1", + task.ID, proto.StepOne, proto.SubtaskStateRunning).Return([]*proto.Subtask{}, nil) + // mock for runStep + mockExtension.EXPECT().GetStepExecutor(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(mockStepExecutor, nil) + mockExtension.EXPECT().IsRetryableError(gomock.Any()).Return(false) + mockSubtaskTable.EXPECT().GetSubtasksByExecIDAndStepAndStates(gomock.Any(), "tidb1", task.ID, proto.StepOne, + unfinishedNormalSubtaskStates...).Return(subtasks, nil) + mockSubtaskTable.EXPECT().GetFirstSubtaskInStates(gomock.Any(), "tidb1", task.ID, proto.StepOne, + unfinishedNormalSubtaskStates...).Return(subtasks[0], nil) + mockSubtaskTable.EXPECT().StartSubtask(gomock.Any(), task.ID, "tidb1").Return(nil) + mockStepExecutor.EXPECT().Init(gomock.Any()).Return(nil) + mockStepExecutor.EXPECT().RunSubtask(gomock.Any(), gomock.Any()).DoAndReturn(func(ctx context.Context, subtask *proto.Subtask) error { + <-ctx.Done() + return ctx.Err() + }) + mockStepExecutor.EXPECT().Cleanup(gomock.Any()).Return(nil) + require.ErrorIs(t, taskExecutor.runStep(ctx, task, nil), context.Canceled) + require.True(t, ctrl.Satisfied()) +} + +func TestCheckBalanceSubtask(t *testing.T) { + ctrl := gomock.NewController(t) + defer ctrl.Finish() + mockSubtaskTable := mock.NewMockTaskTable(ctrl) + mockExtension := mock.NewMockExtension(ctrl) + + ctx := context.Background() + task := &proto.Task{Step: proto.StepOne, Type: "type", ID: 1, Concurrency: 1} + taskExecutor := NewBaseTaskExecutor(ctx, "tidb1", task, mockSubtaskTable) + taskExecutor.Extension = mockExtension + + // context canceled + canceledCtx, cancel := context.WithCancel(ctx) + cancel() + taskExecutor.checkBalanceSubtask(canceledCtx) + + bak := checkBalanceSubtaskInterval + t.Cleanup(func() { + checkBalanceSubtaskInterval = bak + }) + checkBalanceSubtaskInterval = 100 * time.Millisecond + + // subtask scheduled away + mockSubtaskTable.EXPECT().GetSubtasksByExecIDAndStepAndStates(gomock.Any(), "tidb1", + task.ID, task.Step, proto.SubtaskStateRunning).Return(nil, errors.New("error")) + mockSubtaskTable.EXPECT().GetSubtasksByExecIDAndStepAndStates(gomock.Any(), "tidb1", + task.ID, task.Step, proto.SubtaskStateRunning).Return([]*proto.Subtask{}, nil) + runCtx, cancelCause := context.WithCancelCause(ctx) + taskExecutor.registerCancelFunc(cancelCause) + require.NoError(t, runCtx.Err()) + taskExecutor.checkBalanceSubtask(ctx) + require.ErrorIs(t, runCtx.Err(), context.Canceled) + require.True(t, ctrl.Satisfied()) + + subtasks := []*proto.Subtask{{ID: 1, ExecID: "tidb1"}} + // in-idempotent running subtask + mockSubtaskTable.EXPECT().GetSubtasksByExecIDAndStepAndStates(gomock.Any(), "tidb1", + task.ID, task.Step, proto.SubtaskStateRunning).Return(subtasks, nil) + mockSubtaskTable.EXPECT().UpdateSubtaskStateAndError(gomock.Any(), "tidb1", + subtasks[0].ID, proto.SubtaskStateFailed, ErrNonIdempotentSubtask).Return(nil) + mockExtension.EXPECT().IsIdempotent(subtasks[0]).Return(false) + taskExecutor.checkBalanceSubtask(ctx) + require.True(t, ctrl.Satisfied()) + + // current running subtask is skipped + require.Zero(t, taskExecutor.currSubtaskID.Load()) + taskExecutor.currSubtaskID.Store(1) + subtasks = []*proto.Subtask{{ID: 1, ExecID: "tidb1"}, {ID: 2, ExecID: "tidb1"}} + mockSubtaskTable.EXPECT().GetSubtasksByExecIDAndStepAndStates(gomock.Any(), "tidb1", + task.ID, task.Step, proto.SubtaskStateRunning).Return(subtasks, nil) + mockExtension.EXPECT().IsIdempotent(gomock.Any()).Return(true) + mockSubtaskTable.EXPECT().RunningSubtasksBack2Pending(gomock.Any(), []*proto.Subtask{{ID: 2, ExecID: "tidb1"}}).Return(nil) + // used to break the loop + mockSubtaskTable.EXPECT().GetSubtasksByExecIDAndStepAndStates(gomock.Any(), "tidb1", + task.ID, task.Step, proto.SubtaskStateRunning).Return(nil, nil) + taskExecutor.checkBalanceSubtask(ctx) + require.True(t, ctrl.Satisfied()) +} + +func TestExecutorErrHandling(t *testing.T) { + var tp proto.TaskType = "test_task_executor" + var taskID int64 = 1 + var concurrency = 10 + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + runCtx, runCancel := context.WithCancel(ctx) + defer runCancel() + ctrl := gomock.NewController(t) + defer ctrl.Finish() + mockSubtaskTable := mock.NewMockTaskTable(ctrl) + mockSubtaskExecutor := mockexecute.NewMockStepExecutor(ctrl) + mockExtension := mock.NewMockExtension(ctrl) + task := &proto.Task{Step: proto.StepOne, Type: tp} + taskExecutor := NewBaseTaskExecutor(ctx, "id", task, mockSubtaskTable) + taskExecutor.Extension = mockExtension + + // 1. GetStepExecutor meet retryable error. + getSubtaskExecutorErr := errors.New("get executor err") + mockExtension.EXPECT().GetStepExecutor(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(nil, getSubtaskExecutorErr) + mockExtension.EXPECT().IsRetryableError(gomock.Any()).Return(true) + require.NoError(t, taskExecutor.RunStep(runCtx, &proto.Task{Step: proto.StepOne, Type: tp, ID: taskID, Concurrency: concurrency}, nil)) + require.True(t, ctrl.Satisfied()) + + // 2. GetStepExecutor meet non retryable error. + mockExtension.EXPECT().GetStepExecutor(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(nil, getSubtaskExecutorErr) + mockExtension.EXPECT().IsRetryableError(gomock.Any()).Return(false) + mockSubtaskTable.EXPECT().FailSubtask(runCtx, taskExecutor.id, gomock.Any(), getSubtaskExecutorErr) + require.NoError(t, taskExecutor.RunStep(runCtx, &proto.Task{Step: proto.StepOne, Type: tp, ID: taskID, Concurrency: concurrency}, nil)) + require.True(t, ctrl.Satisfied()) + + // 3. Init meet retryable error. + initErr := errors.New("executor init err") + mockExtension.EXPECT().GetStepExecutor(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(mockSubtaskExecutor, nil) + mockSubtaskExecutor.EXPECT().Init(gomock.Any()).Return(initErr) + mockExtension.EXPECT().IsRetryableError(gomock.Any()).Return(true) + require.NoError(t, taskExecutor.RunStep(runCtx, &proto.Task{Step: proto.StepOne, Type: tp, ID: taskID, Concurrency: concurrency}, nil)) + require.True(t, ctrl.Satisfied()) + + // 4. Init meet non retryable error. + mockExtension.EXPECT().GetStepExecutor(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(mockSubtaskExecutor, nil) + mockSubtaskExecutor.EXPECT().Init(gomock.Any()).Return(initErr) + mockExtension.EXPECT().IsRetryableError(gomock.Any()).Return(false) + mockSubtaskTable.EXPECT().FailSubtask(runCtx, taskExecutor.id, gomock.Any(), initErr) + require.NoError(t, taskExecutor.RunStep(runCtx, &proto.Task{Step: proto.StepOne, Type: tp, ID: taskID, Concurrency: concurrency}, nil)) + require.True(t, ctrl.Satisfied()) + + // 5. GetSubtasksByStepAndStates meet retryable error. + getSubtasksByExecIDAndStepAndStatesErr := errors.New("get subtasks err") + mockExtension.EXPECT().GetStepExecutor(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(mockSubtaskExecutor, nil) + mockSubtaskExecutor.EXPECT().Init(gomock.Any()).Return(nil) + mockSubtaskTable.EXPECT().GetSubtasksByExecIDAndStepAndStates( + gomock.Any(), + taskExecutor.id, + gomock.Any(), + proto.StepOne, + unfinishedNormalSubtaskStates...).Return(nil, getSubtasksByExecIDAndStepAndStatesErr) + mockSubtaskExecutor.EXPECT().Cleanup(gomock.Any()).Return(nil) + mockExtension.EXPECT().IsRetryableError(gomock.Any()).Return(true) + require.NoError(t, taskExecutor.RunStep(runCtx, &proto.Task{Step: proto.StepOne, Type: tp, ID: taskID, Concurrency: concurrency}, nil)) + require.True(t, ctrl.Satisfied()) + + // 6. GetSubtasksByExecIDAndStepAndStates meet non retryable error. + mockExtension.EXPECT().GetStepExecutor(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(mockSubtaskExecutor, nil) + mockSubtaskExecutor.EXPECT().Init(gomock.Any()).Return(nil) + mockSubtaskTable.EXPECT().GetSubtasksByExecIDAndStepAndStates( + gomock.Any(), + taskExecutor.id, + gomock.Any(), + proto.StepOne, + unfinishedNormalSubtaskStates...).Return(nil, getSubtasksByExecIDAndStepAndStatesErr) + mockSubtaskExecutor.EXPECT().Cleanup(gomock.Any()).Return(nil) + mockExtension.EXPECT().IsRetryableError(gomock.Any()).Return(false) + mockSubtaskTable.EXPECT().FailSubtask(runCtx, taskExecutor.id, gomock.Any(), getSubtasksByExecIDAndStepAndStatesErr) + require.NoError(t, taskExecutor.RunStep(runCtx, &proto.Task{Step: proto.StepOne, Type: tp, ID: taskID, Concurrency: concurrency}, nil)) + require.True(t, ctrl.Satisfied()) + + // 7. Cleanup meet retryable error. + cleanupErr := errors.New("cleanup err") + mockExtension.EXPECT().GetStepExecutor(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(mockSubtaskExecutor, nil) + mockSubtaskExecutor.EXPECT().Init(gomock.Any()).Return(nil) + mockSubtaskTable.EXPECT().GetSubtasksByExecIDAndStepAndStates( + gomock.Any(), + taskExecutor.id, + gomock.Any(), + proto.StepOne, + unfinishedNormalSubtaskStates...).Return([]*proto.Subtask{{ + ID: 1, Type: tp, Step: proto.StepOne, State: proto.SubtaskStatePending, ExecID: "id"}}, nil) + mockSubtaskTable.EXPECT().GetFirstSubtaskInStates(gomock.Any(), "id", taskID, proto.StepOne, + unfinishedNormalSubtaskStates...).Return(&proto.Subtask{ + ID: 1, Type: tp, Step: proto.StepOne, State: proto.SubtaskStatePending, ExecID: "id"}, nil) + mockSubtaskTable.EXPECT().StartSubtask(gomock.Any(), taskID, "id").Return(nil) + mockSubtaskExecutor.EXPECT().RunSubtask(gomock.Any(), gomock.Any()).Return(nil) + mockSubtaskExecutor.EXPECT().OnFinished(gomock.Any(), gomock.Any()).Return(nil) + mockSubtaskTable.EXPECT().FinishSubtask(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(nil) + mockSubtaskTable.EXPECT().GetFirstSubtaskInStates(gomock.Any(), "id", taskID, proto.StepOne, + unfinishedNormalSubtaskStates...).Return(nil, nil) + mockSubtaskTable.EXPECT().GetTaskByID(gomock.Any(), gomock.Any()).Return(&proto.Task{ID: taskID, Step: proto.StepTwo}, nil) + mockSubtaskExecutor.EXPECT().Cleanup(gomock.Any()).Return(cleanupErr) + mockExtension.EXPECT().IsRetryableError(gomock.Any()).Return(true) + require.NoError(t, taskExecutor.RunStep(runCtx, &proto.Task{Step: proto.StepOne, Type: tp, ID: taskID, Concurrency: concurrency}, nil)) + require.True(t, ctrl.Satisfied()) + + // 8. Cleanup meet non retryable error. + mockExtension.EXPECT().GetStepExecutor(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(mockSubtaskExecutor, nil) + mockSubtaskExecutor.EXPECT().Init(gomock.Any()).Return(nil) + mockSubtaskTable.EXPECT().GetSubtasksByExecIDAndStepAndStates( + gomock.Any(), + taskExecutor.id, + gomock.Any(), + proto.StepOne, + unfinishedNormalSubtaskStates...).Return([]*proto.Subtask{{ + ID: 1, Type: tp, Step: proto.StepOne, State: proto.SubtaskStatePending, ExecID: "id"}}, nil) + mockSubtaskTable.EXPECT().GetFirstSubtaskInStates(gomock.Any(), "id", taskID, proto.StepOne, + unfinishedNormalSubtaskStates...).Return(&proto.Subtask{ + ID: 1, Type: tp, Step: proto.StepOne, State: proto.SubtaskStatePending, ExecID: "id"}, nil) + mockSubtaskTable.EXPECT().StartSubtask(gomock.Any(), taskID, "id").Return(nil) + mockSubtaskExecutor.EXPECT().RunSubtask(gomock.Any(), gomock.Any()).Return(nil) + mockSubtaskExecutor.EXPECT().OnFinished(gomock.Any(), gomock.Any()).Return(nil) + mockSubtaskTable.EXPECT().FinishSubtask(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(nil) + mockSubtaskTable.EXPECT().GetFirstSubtaskInStates(gomock.Any(), "id", taskID, proto.StepOne, + unfinishedNormalSubtaskStates...).Return(nil, nil) + mockSubtaskTable.EXPECT().GetTaskByID(gomock.Any(), gomock.Any()).Return(&proto.Task{ID: taskID, Step: proto.StepTwo}, nil) + mockSubtaskExecutor.EXPECT().Cleanup(gomock.Any()).Return(cleanupErr) + mockExtension.EXPECT().IsRetryableError(gomock.Any()).Return(false) + mockSubtaskTable.EXPECT().FailSubtask(runCtx, taskExecutor.id, gomock.Any(), cleanupErr) + require.NoError(t, taskExecutor.RunStep(runCtx, &proto.Task{Step: proto.StepOne, Type: tp, ID: taskID, Concurrency: concurrency}, nil)) + require.True(t, ctrl.Satisfied()) + + // 9. runSummaryCollectLoop meet retryable error. + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/disttask/framework/taskexecutor/mockSummaryCollectErr", "return()")) + mockExtension.EXPECT().IsRetryableError(gomock.Any()).Return(true) + require.NoError(t, taskExecutor.RunStep(runCtx, &proto.Task{Step: proto.StepOne, Type: tp, ID: taskID, Concurrency: concurrency}, nil)) + require.True(t, ctrl.Satisfied()) + + // 10. runSummaryCollectLoop meet non retryable error. + mockExtension.EXPECT().IsRetryableError(gomock.Any()).Return(false) + mockSubtaskTable.EXPECT().FailSubtask(runCtx, taskExecutor.id, gomock.Any(), gomock.Any()) + require.NoError(t, taskExecutor.RunStep(runCtx, &proto.Task{Step: proto.StepOne, Type: tp, ID: taskID, Concurrency: concurrency}, nil)) + require.True(t, ctrl.Satisfied()) + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/disttask/framework/taskexecutor/mockSummaryCollectErr")) + + // 11. meet cancel before register cancel. + runCtx1, runCancel1 := context.WithCancel(ctx) + runCancel1() + mockExtension.EXPECT().IsRetryableError(gomock.Any()).Return(true) + require.NoError(t, taskExecutor.RunStep(runCtx1, &proto.Task{Step: proto.StepOne, Type: tp, ID: taskID, Concurrency: concurrency}, nil)) + require.True(t, ctrl.Satisfied()) + + // 12. meet ErrCancelSubtask before register cancel. + runCtx2, runCancel2 := context.WithCancelCause(ctx) + runCancel2(ErrCancelSubtask) + mockSubtaskTable.EXPECT().CancelSubtask(runCtx2, taskExecutor.id, gomock.Any()) + require.NoError(t, taskExecutor.RunStep(runCtx2, &proto.Task{Step: proto.StepOne, Type: tp, ID: taskID, Concurrency: concurrency}, nil)) + require.True(t, ctrl.Satisfied()) + + // 13. subtask succeed. + mockExtension.EXPECT().GetStepExecutor(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(mockSubtaskExecutor, nil) + mockSubtaskExecutor.EXPECT().Init(gomock.Any()).Return(nil) + mockSubtaskTable.EXPECT().GetSubtasksByExecIDAndStepAndStates( + gomock.Any(), + taskExecutor.id, + gomock.Any(), + proto.StepOne, + unfinishedNormalSubtaskStates...).Return([]*proto.Subtask{{ + ID: 1, Type: tp, Step: proto.StepOne, State: proto.SubtaskStatePending, ExecID: "id"}}, nil) + mockSubtaskTable.EXPECT().GetFirstSubtaskInStates(gomock.Any(), "id", taskID, proto.StepOne, + unfinishedNormalSubtaskStates...).Return(&proto.Subtask{ + ID: 1, Type: tp, Step: proto.StepOne, State: proto.SubtaskStatePending, ExecID: "id"}, nil) + mockSubtaskTable.EXPECT().StartSubtask(gomock.Any(), taskID, "id").Return(nil) + mockSubtaskExecutor.EXPECT().RunSubtask(gomock.Any(), gomock.Any()).Return(nil) + mockSubtaskExecutor.EXPECT().OnFinished(gomock.Any(), gomock.Any()).Return(nil) + mockSubtaskTable.EXPECT().FinishSubtask(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(nil) + mockSubtaskTable.EXPECT().GetFirstSubtaskInStates(gomock.Any(), "id", taskID, proto.StepOne, + unfinishedNormalSubtaskStates...).Return(nil, nil) + mockSubtaskTable.EXPECT().GetTaskByID(gomock.Any(), gomock.Any()).Return(&proto.Task{ID: taskID, Step: proto.StepTwo}, nil) + mockSubtaskExecutor.EXPECT().Cleanup(gomock.Any()).Return(nil) + require.NoError(t, taskExecutor.RunStep(runCtx, &proto.Task{Step: proto.StepOne, Type: tp, ID: taskID, Concurrency: concurrency}, nil)) + require.True(t, ctrl.Satisfied()) +} diff --git a/pkg/disttask/framework/taskexecutor/task_executor_testkit_test.go b/pkg/disttask/framework/taskexecutor/task_executor_testkit_test.go new file mode 100644 index 0000000000000..cfef0c527490e --- /dev/null +++ b/pkg/disttask/framework/taskexecutor/task_executor_testkit_test.go @@ -0,0 +1,103 @@ +// Copyright 2023 PingCAP, 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. + +package taskexecutor_test + +import ( + "context" + "strconv" + "testing" + "time" + + "github.com/ngaut/pools" + "github.com/pingcap/failpoint" + "github.com/pingcap/tidb/pkg/disttask/framework/proto" + "github.com/pingcap/tidb/pkg/disttask/framework/storage" + "github.com/pingcap/tidb/pkg/disttask/framework/taskexecutor" + "github.com/pingcap/tidb/pkg/disttask/framework/testutil" + "github.com/pingcap/tidb/pkg/kv" + "github.com/pingcap/tidb/pkg/testkit" + "github.com/pingcap/tidb/pkg/util/logutil" + "github.com/stretchr/testify/require" + "github.com/tikv/client-go/v2/util" + "go.uber.org/mock/gomock" +) + +func runOneTask(ctx context.Context, t *testing.T, mgr *storage.TaskManager, taskKey string, subtaskCnt int) { + taskID, err := mgr.CreateTask(ctx, taskKey, proto.TaskTypeExample, 1, nil) + require.NoError(t, err) + task, err := mgr.GetTaskByID(ctx, taskID) + require.NoError(t, err) + // 1. stepOne + task.Step = proto.StepOne + task.State = proto.TaskStateRunning + _, err = mgr.UpdateTaskAndAddSubTasks(ctx, task, nil, proto.TaskStatePending) + require.NoError(t, err) + for i := 0; i < subtaskCnt; i++ { + testutil.CreateSubTask(t, mgr, taskID, proto.StepOne, "test", nil, proto.TaskTypeExample, 11, false) + } + task, err = mgr.GetTaskByID(ctx, taskID) + require.NoError(t, err) + factory := taskexecutor.GetTaskExecutorFactory(task.Type) + require.NotNil(t, factory) + executor := factory(ctx, "test", task, mgr) + require.NoError(t, executor.RunStep(ctx, task, nil)) + // 2. stepTwo + task.Step = proto.StepTwo + _, err = mgr.UpdateTaskAndAddSubTasks(ctx, task, nil, proto.TaskStateRunning) + require.NoError(t, err) + for i := 0; i < subtaskCnt; i++ { + testutil.CreateSubTask(t, mgr, taskID, proto.StepTwo, "test", nil, proto.TaskTypeExample, 11, false) + } + task, err = mgr.GetTaskByID(ctx, taskID) + require.NoError(t, err) + require.NoError(t, executor.RunStep(ctx, task, nil)) +} + +func TestTaskExecutorBasic(t *testing.T) { + // must disable disttask framework to ensure the test pure. + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/domain/MockDisableDistTask", "return(true)")) + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/disttask/framework/taskexecutor/breakInTaskExecutorUT", "return()")) + defer func() { + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/domain/MockDisableDistTask")) + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/disttask/framework/taskexecutor/breakInTaskExecutorUT")) + }() + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + pool := pools.NewResourcePool(func() (pools.Resource, error) { + return tk.Session(), nil + }, 1, 1, time.Second) + defer pool.Close() + ctx := context.Background() + ctx = util.WithInternalSourceType(ctx, kv.InternalDistTask) + ctrl := gomock.NewController(t) + defer ctrl.Finish() + mgr := storage.NewTaskManager(pool) + + testutil.InitTaskExecutor(ctrl, func(ctx context.Context, subtask *proto.Subtask) error { + switch subtask.Step { + case proto.StepOne: + logutil.BgLogger().Info("run step one") + case proto.StepTwo: + logutil.BgLogger().Info("run step two") + default: + panic("invalid step") + } + return nil + }) + require.NoError(t, mgr.InitMeta(ctx, ":4000", "")) + for i := 0; i < 10; i++ { + runOneTask(ctx, t, mgr, "key"+strconv.Itoa(i), i) + } +} diff --git a/pkg/disttask/framework/testutil/BUILD.bazel b/pkg/disttask/framework/testutil/BUILD.bazel new file mode 100644 index 0000000000000..f60efa966e5ef --- /dev/null +++ b/pkg/disttask/framework/testutil/BUILD.bazel @@ -0,0 +1,36 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library") + +go_library( + name = "testutil", + srcs = [ + "context.go", + "disttest_util.go", + "executor_util.go", + "scheduler_util.go", + "table_util.go", + "task_util.go", + ], + importpath = "github.com/pingcap/tidb/pkg/disttask/framework/testutil", + visibility = ["//visibility:public"], + deps = [ + "//pkg/disttask/framework/handle", + "//pkg/disttask/framework/mock", + "//pkg/disttask/framework/mock/execute", + "//pkg/disttask/framework/proto", + "//pkg/disttask/framework/scheduler", + "//pkg/disttask/framework/scheduler/mock", + "//pkg/disttask/framework/storage", + "//pkg/disttask/framework/taskexecutor", + "//pkg/kv", + "//pkg/sessionctx", + "//pkg/store/mockstore", + "//pkg/testkit", + "//pkg/util/logutil", + "//pkg/util/sqlexec", + "@com_github_ngaut_pools//:pools", + "@com_github_pingcap_failpoint//:failpoint", + "@com_github_stretchr_testify//require", + "@com_github_tikv_client_go_v2//util", + "@org_uber_go_mock//gomock", + ], +) diff --git a/pkg/disttask/framework/testutil/context.go b/pkg/disttask/framework/testutil/context.go new file mode 100644 index 0000000000000..0abf2fe5021f0 --- /dev/null +++ b/pkg/disttask/framework/testutil/context.go @@ -0,0 +1,85 @@ +// Copyright 2023 PingCAP, 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. + +package testutil + +import ( + "context" + "fmt" + "sync" + "sync/atomic" + "testing" + + "github.com/pingcap/failpoint" + "github.com/pingcap/tidb/pkg/disttask/framework/proto" + "github.com/pingcap/tidb/pkg/testkit" + "github.com/stretchr/testify/require" + "github.com/tikv/client-go/v2/util" + "go.uber.org/mock/gomock" +) + +// TestContext defines shared variables for disttask tests. +type TestContext struct { + sync.RWMutex + // taskID/step -> subtask map. + subtasksHasRun map[string]map[int64]struct{} + // for rollback tests. + RollbackCnt atomic.Int32 + // for plan err handling tests. + CallTime int +} + +// InitTestContext inits test context for disttask tests. +func InitTestContext(t *testing.T, nodeNum int) (context.Context, *gomock.Controller, *TestContext, *testkit.DistExecutionContext) { + ctrl := gomock.NewController(t) + defer ctrl.Finish() + ctx := context.Background() + ctx = util.WithInternalSourceType(ctx, "dispatcher") + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/util/cpu/mockNumCpu", "return(8)")) + t.Cleanup(func() { + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/util/cpu/mockNumCpu")) + }) + + executionContext := testkit.NewDistExecutionContext(t, nodeNum) + testCtx := &TestContext{ + subtasksHasRun: make(map[string]map[int64]struct{}), + } + return ctx, ctrl, testCtx, executionContext +} + +// CollectSubtask collects subtask info +func (c *TestContext) CollectSubtask(subtask *proto.Subtask) { + key := getTaskStepKey(subtask.TaskID, subtask.Step) + c.Lock() + defer c.Unlock() + m, ok := c.subtasksHasRun[key] + if !ok { + m = make(map[int64]struct{}) + c.subtasksHasRun[key] = m + } + m[subtask.ID] = struct{}{} +} + +// CollectedSubtaskCnt returns the collected subtask count. +func (c *TestContext) CollectedSubtaskCnt(taskID int64, step proto.Step) int { + key := getTaskStepKey(taskID, step) + c.RLock() + defer c.RUnlock() + return len(c.subtasksHasRun[key]) +} + +// getTaskStepKey returns the key of a task step. +func getTaskStepKey(id int64, step proto.Step) string { + return fmt.Sprintf("%d/%d", id, step) +} diff --git a/pkg/disttask/framework/testutil/disttest_util.go b/pkg/disttask/framework/testutil/disttest_util.go new file mode 100644 index 0000000000000..df22f3f05a5d6 --- /dev/null +++ b/pkg/disttask/framework/testutil/disttest_util.go @@ -0,0 +1,131 @@ +// Copyright 2023 PingCAP, 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. + +package testutil + +import ( + "context" + "testing" + + "github.com/pingcap/tidb/pkg/disttask/framework/handle" + "github.com/pingcap/tidb/pkg/disttask/framework/mock" + mockexecute "github.com/pingcap/tidb/pkg/disttask/framework/mock/execute" + "github.com/pingcap/tidb/pkg/disttask/framework/proto" + "github.com/pingcap/tidb/pkg/disttask/framework/scheduler" + "github.com/pingcap/tidb/pkg/disttask/framework/storage" + "github.com/pingcap/tidb/pkg/disttask/framework/taskexecutor" + "github.com/stretchr/testify/require" + "go.uber.org/mock/gomock" +) + +// RegisterTaskMeta initialize mock components for dist task. +func RegisterTaskMeta(t *testing.T, ctrl *gomock.Controller, schedulerHandle scheduler.Extension, testContext *TestContext, runSubtaskFn func(ctx context.Context, subtask *proto.Subtask) error) { + mockExtension := mock.NewMockExtension(ctrl) + mockCleanupRountine := mock.NewMockCleanUpRoutine(ctrl) + mockCleanupRountine.EXPECT().CleanUp(gomock.Any(), gomock.Any()).Return(nil).AnyTimes() + mockStepExecutor := GetMockStepExecutor(ctrl) + if runSubtaskFn == nil { + mockStepExecutor.EXPECT().RunSubtask(gomock.Any(), gomock.Any()).DoAndReturn( + func(ctx context.Context, subtask *proto.Subtask) error { + switch subtask.Step { + case proto.StepOne, proto.StepTwo: + testContext.CollectSubtask(subtask) + default: + panic("invalid step") + } + return nil + }).AnyTimes() + } else { + mockStepExecutor.EXPECT().RunSubtask(gomock.Any(), gomock.Any()).DoAndReturn(runSubtaskFn).AnyTimes() + } + mockExtension.EXPECT().IsIdempotent(gomock.Any()).Return(true).AnyTimes() + mockExtension.EXPECT().GetStepExecutor(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(mockStepExecutor, nil).AnyTimes() + mockExtension.EXPECT().IsRetryableError(gomock.Any()).Return(false).AnyTimes() + registerTaskMetaInner(t, proto.TaskTypeExample, mockExtension, mockCleanupRountine, schedulerHandle) +} + +func registerTaskMetaInner(t *testing.T, taskType proto.TaskType, mockExtension taskexecutor.Extension, mockCleanup scheduler.CleanUpRoutine, schedulerHandle scheduler.Extension) { + t.Cleanup(func() { + scheduler.ClearSchedulerFactory() + scheduler.ClearSchedulerCleanUpFactory() + taskexecutor.ClearTaskExecutors() + }) + scheduler.RegisterSchedulerFactory(taskType, + func(ctx context.Context, task *proto.Task, param scheduler.Param) scheduler.Scheduler { + baseScheduler := scheduler.NewBaseScheduler(ctx, task, param) + baseScheduler.Extension = schedulerHandle + return baseScheduler + }) + + scheduler.RegisterSchedulerCleanUpFactory(taskType, + func() scheduler.CleanUpRoutine { + return mockCleanup + }) + + taskexecutor.RegisterTaskType(taskType, + func(ctx context.Context, id string, task *proto.Task, taskTable taskexecutor.TaskTable) taskexecutor.TaskExecutor { + s := taskexecutor.NewBaseTaskExecutor(ctx, id, task, taskTable) + s.Extension = mockExtension + return s + }, + ) +} + +// RegisterRollbackTaskMeta register rollback task meta. +func RegisterRollbackTaskMeta(t *testing.T, ctrl *gomock.Controller, mockScheduler scheduler.Extension, testContext *TestContext) { + mockExtension := mock.NewMockExtension(ctrl) + mockExecutor := mockexecute.NewMockStepExecutor(ctrl) + mockCleanupRountine := mock.NewMockCleanUpRoutine(ctrl) + mockCleanupRountine.EXPECT().CleanUp(gomock.Any(), gomock.Any()).Return(nil).AnyTimes() + mockExecutor.EXPECT().Init(gomock.Any()).Return(nil).AnyTimes() + mockExecutor.EXPECT().Cleanup(gomock.Any()).Return(nil).AnyTimes() + mockExecutor.EXPECT().Rollback(gomock.Any()).DoAndReturn( + func(_ context.Context) error { + testContext.RollbackCnt.Add(1) + return nil + }, + ).AnyTimes() + mockExecutor.EXPECT().RunSubtask(gomock.Any(), gomock.Any()).DoAndReturn( + func(_ context.Context, subtask *proto.Subtask) error { + testContext.CollectSubtask(subtask) + return nil + }).AnyTimes() + mockExecutor.EXPECT().OnFinished(gomock.Any(), gomock.Any()).Return(nil).AnyTimes() + mockExtension.EXPECT().IsIdempotent(gomock.Any()).Return(true).AnyTimes() + mockExtension.EXPECT().GetStepExecutor(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(mockExecutor, nil).AnyTimes() + mockExtension.EXPECT().IsRetryableError(gomock.Any()).Return(false).AnyTimes() + + registerTaskMetaInner(t, proto.TaskTypeExample, mockExtension, mockCleanupRountine, mockScheduler) + testContext.RollbackCnt.Store(0) +} + +// SubmitAndWaitTask schedule one task. +func SubmitAndWaitTask(ctx context.Context, t *testing.T, taskKey string) *proto.Task { + _, err := handle.SubmitTask(ctx, taskKey, proto.TaskTypeExample, 1, nil) + require.NoError(t, err) + return WaitTaskDoneOrPaused(ctx, t, taskKey) +} + +// WaitTaskDoneOrPaused wait task done or paused. +func WaitTaskDoneOrPaused(ctx context.Context, t *testing.T, taskKey string) *proto.Task { + taskMgr, err := storage.GetTaskManager() + require.NoError(t, err) + gotTask, err := taskMgr.GetTaskByKeyWithHistory(ctx, taskKey) + require.NoError(t, err) + task, err := handle.WaitTask(ctx, gotTask.ID, func(task *proto.Task) bool { + return task.IsDone() || task.State == proto.TaskStatePaused + }) + require.NoError(t, err) + return task +} diff --git a/pkg/disttask/framework/testutil/executor_util.go b/pkg/disttask/framework/testutil/executor_util.go new file mode 100644 index 0000000000000..be34f9d04dc63 --- /dev/null +++ b/pkg/disttask/framework/testutil/executor_util.go @@ -0,0 +1,62 @@ +// Copyright 2023 PingCAP, 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. + +package testutil + +import ( + "context" + + "github.com/pingcap/tidb/pkg/disttask/framework/mock" + mockexecute "github.com/pingcap/tidb/pkg/disttask/framework/mock/execute" + "github.com/pingcap/tidb/pkg/disttask/framework/proto" + "github.com/pingcap/tidb/pkg/disttask/framework/taskexecutor" + "go.uber.org/mock/gomock" +) + +// GetMockStepExecutor returns one mock subtaskExecutor. +func GetMockStepExecutor(ctrl *gomock.Controller) *mockexecute.MockStepExecutor { + executor := mockexecute.NewMockStepExecutor(ctrl) + executor.EXPECT().Init(gomock.Any()).Return(nil).AnyTimes() + executor.EXPECT().Cleanup(gomock.Any()).Return(nil).AnyTimes() + executor.EXPECT().Rollback(gomock.Any()).Return(nil).AnyTimes() + executor.EXPECT().OnFinished(gomock.Any(), gomock.Any()).Return(nil).AnyTimes() + return executor +} + +// GetMockTaskExecutorExtension returns one mock TaskExecutorExtension. +func GetMockTaskExecutorExtension(ctrl *gomock.Controller, mockStepExecutor *mockexecute.MockStepExecutor) *mock.MockExtension { + mockExtension := mock.NewMockExtension(ctrl) + mockExtension.EXPECT(). + GetStepExecutor(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()). + Return(mockStepExecutor, nil).AnyTimes() + mockExtension.EXPECT().IsRetryableError(gomock.Any()).Return(false).AnyTimes() + return mockExtension +} + +// InitTaskExecutor inits all mock components for TaskExecutor. +func InitTaskExecutor(ctrl *gomock.Controller, runSubtaskFn func(ctx context.Context, subtask *proto.Subtask) error) { + mockStepExecutor := GetMockStepExecutor(ctrl) + mockStepExecutor.EXPECT().RunSubtask(gomock.Any(), gomock.Any()).DoAndReturn( + runSubtaskFn, + ).AnyTimes() + + mockExtension := GetMockTaskExecutorExtension(ctrl, mockStepExecutor) + taskexecutor.RegisterTaskType(proto.TaskTypeExample, + func(ctx context.Context, id string, task *proto.Task, taskTable taskexecutor.TaskTable) taskexecutor.TaskExecutor { + s := taskexecutor.NewBaseTaskExecutor(ctx, id, task, taskTable) + s.Extension = mockExtension + return s + }, + ) +} diff --git a/pkg/disttask/framework/testutil/scheduler_util.go b/pkg/disttask/framework/testutil/scheduler_util.go new file mode 100644 index 0000000000000..aab32f6eb7440 --- /dev/null +++ b/pkg/disttask/framework/testutil/scheduler_util.go @@ -0,0 +1,242 @@ +// Copyright 2023 PingCAP, 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. + +package testutil + +import ( + "context" + "errors" + + "github.com/pingcap/tidb/pkg/disttask/framework/proto" + "github.com/pingcap/tidb/pkg/disttask/framework/scheduler" + mockDispatch "github.com/pingcap/tidb/pkg/disttask/framework/scheduler/mock" + "github.com/pingcap/tidb/pkg/disttask/framework/storage" + "go.uber.org/mock/gomock" +) + +// GetMockBasicSchedulerExt returns mock scheduler.Extension with basic functionalities. +func GetMockBasicSchedulerExt(ctrl *gomock.Controller) scheduler.Extension { + mockScheduler := mockDispatch.NewMockExtension(ctrl) + mockScheduler.EXPECT().OnTick(gomock.Any(), gomock.Any()).Return().AnyTimes() + mockScheduler.EXPECT().GetEligibleInstances(gomock.Any(), gomock.Any()).DoAndReturn( + func(_ context.Context, _ *proto.Task) ([]string, error) { + return nil, nil + }, + ).AnyTimes() + mockScheduler.EXPECT().IsRetryableErr(gomock.Any()).Return(true).AnyTimes() + mockScheduler.EXPECT().GetNextStep(gomock.Any()).DoAndReturn( + func(task *proto.Task) proto.Step { + switch task.Step { + case proto.StepInit: + return proto.StepOne + case proto.StepOne: + return proto.StepTwo + default: + return proto.StepDone + } + }, + ).AnyTimes() + mockScheduler.EXPECT().OnNextSubtasksBatch(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).DoAndReturn( + func(_ context.Context, _ storage.TaskHandle, task *proto.Task, _ []string, _ proto.Step) (metas [][]byte, err error) { + if task.Step == proto.StepInit { + return [][]byte{ + []byte("task1"), + []byte("task2"), + []byte("task3"), + }, nil + } + if task.Step == proto.StepOne { + return [][]byte{ + []byte("task4"), + }, nil + } + return nil, nil + }, + ).AnyTimes() + + mockScheduler.EXPECT().OnDone(gomock.Any(), gomock.Any(), gomock.Any()).Return(nil).AnyTimes() + return mockScheduler +} + +// GetMockHATestSchedulerExt returns mock scheduler.Extension for HA testing with multiple steps. +func GetMockHATestSchedulerExt(ctrl *gomock.Controller) scheduler.Extension { + mockScheduler := mockDispatch.NewMockExtension(ctrl) + mockScheduler.EXPECT().OnTick(gomock.Any(), gomock.Any()).Return().AnyTimes() + mockScheduler.EXPECT().GetEligibleInstances(gomock.Any(), gomock.Any()).DoAndReturn( + func(_ context.Context, _ *proto.Task) ([]string, error) { + return nil, nil + }, + ).AnyTimes() + mockScheduler.EXPECT().IsRetryableErr(gomock.Any()).Return(true).AnyTimes() + mockScheduler.EXPECT().GetNextStep(gomock.Any()).DoAndReturn( + func(task *proto.Task) proto.Step { + switch task.Step { + case proto.StepInit: + return proto.StepOne + case proto.StepOne: + return proto.StepTwo + default: + return proto.StepDone + } + }, + ).AnyTimes() + mockScheduler.EXPECT().OnNextSubtasksBatch(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).DoAndReturn( + func(_ context.Context, _ storage.TaskHandle, task *proto.Task, _ []string, _ proto.Step) (metas [][]byte, err error) { + if task.Step == proto.StepInit { + return [][]byte{ + []byte("task1"), + []byte("task2"), + []byte("task3"), + []byte("task4"), + []byte("task5"), + []byte("task6"), + []byte("task7"), + []byte("task8"), + []byte("task9"), + []byte("task10"), + }, nil + } + if task.Step == proto.StepOne { + return [][]byte{ + []byte("task11"), + []byte("task12"), + []byte("task13"), + []byte("task14"), + []byte("task15"), + }, nil + } + return nil, nil + }, + ).AnyTimes() + + mockScheduler.EXPECT().OnDone(gomock.Any(), gomock.Any(), gomock.Any()).Return(nil).AnyTimes() + + return mockScheduler +} + +// GetPlanNotRetryableErrSchedulerExt returns mock scheduler.Extension which will generate non retryable error when planning. +func GetPlanNotRetryableErrSchedulerExt(ctrl *gomock.Controller) scheduler.Extension { + mockScheduler := mockDispatch.NewMockExtension(ctrl) + mockScheduler.EXPECT().OnTick(gomock.Any(), gomock.Any()).Return().AnyTimes() + mockScheduler.EXPECT().GetEligibleInstances(gomock.Any(), gomock.Any()).DoAndReturn( + func(_ context.Context, _ *proto.Task) ([]string, error) { + return nil, nil + }, + ).AnyTimes() + mockScheduler.EXPECT().IsRetryableErr(gomock.Any()).Return(false).AnyTimes() + mockScheduler.EXPECT().GetNextStep(gomock.Any()).DoAndReturn( + func(task *proto.Task) proto.Step { + if task.Step == proto.StepInit { + return proto.StepOne + } + return proto.StepDone + }, + ).AnyTimes() + mockScheduler.EXPECT().OnNextSubtasksBatch(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).DoAndReturn( + func(_ context.Context, _ storage.TaskHandle, _ *proto.Task, _ []string, _ proto.Step) (metas [][]byte, err error) { + return nil, errors.New("not retryable err") + }, + ).AnyTimes() + + mockScheduler.EXPECT().OnDone(gomock.Any(), gomock.Any(), gomock.Any()).Return(nil).AnyTimes() + return mockScheduler +} + +// GetPlanErrSchedulerExt returns mock scheduler.Extension which will generate error when planning. +func GetPlanErrSchedulerExt(ctrl *gomock.Controller, testContext *TestContext) scheduler.Extension { + mockScheduler := mockDispatch.NewMockExtension(ctrl) + mockScheduler.EXPECT().OnTick(gomock.Any(), gomock.Any()).Return().AnyTimes() + mockScheduler.EXPECT().GetEligibleInstances(gomock.Any(), gomock.Any()).DoAndReturn( + func(_ context.Context, _ *proto.Task) ([]string, error) { + return nil, nil + }, + ).AnyTimes() + mockScheduler.EXPECT().IsRetryableErr(gomock.Any()).Return(true).AnyTimes() + mockScheduler.EXPECT().GetNextStep(gomock.Any()).DoAndReturn( + func(task *proto.Task) proto.Step { + switch task.Step { + case proto.StepInit: + return proto.StepOne + case proto.StepOne: + return proto.StepTwo + default: + return proto.StepDone + } + }, + ).AnyTimes() + mockScheduler.EXPECT().OnNextSubtasksBatch(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).DoAndReturn( + func(_ context.Context, _ storage.TaskHandle, task *proto.Task, _ []string, _ proto.Step) (metas [][]byte, err error) { + if task.Step == proto.StepInit { + if testContext.CallTime == 0 { + testContext.CallTime++ + return nil, errors.New("retryable err") + } + return [][]byte{ + []byte("task1"), + []byte("task2"), + []byte("task3"), + }, nil + } + if task.Step == proto.StepOne { + return [][]byte{ + []byte("task4"), + }, nil + } + return nil, nil + }, + ).AnyTimes() + + gomock.InOrder( + mockScheduler.EXPECT().OnDone(gomock.Any(), gomock.Any(), gomock.Any()).Return(errors.New("not retryable err")), + mockScheduler.EXPECT().OnDone(gomock.Any(), gomock.Any(), gomock.Any()).Return(nil).AnyTimes(), + ) + return mockScheduler +} + +// GetMockRollbackSchedulerExt returns mock scheduler.Extension which will generate rollback subtasks. +func GetMockRollbackSchedulerExt(ctrl *gomock.Controller) scheduler.Extension { + mockScheduler := mockDispatch.NewMockExtension(ctrl) + mockScheduler.EXPECT().OnTick(gomock.Any(), gomock.Any()).Return().AnyTimes() + mockScheduler.EXPECT().GetEligibleInstances(gomock.Any(), gomock.Any()).DoAndReturn( + func(_ context.Context, _ *proto.Task) ([]string, error) { + return nil, nil + }, + ).AnyTimes() + mockScheduler.EXPECT().IsRetryableErr(gomock.Any()).Return(true).AnyTimes() + mockScheduler.EXPECT().GetNextStep(gomock.Any()).DoAndReturn( + func(task *proto.Task) proto.Step { + switch task.Step { + case proto.StepInit: + return proto.StepOne + default: + return proto.StepDone + } + }, + ).AnyTimes() + mockScheduler.EXPECT().OnNextSubtasksBatch(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).DoAndReturn( + func(_ context.Context, _ storage.TaskHandle, task *proto.Task, _ []string, _ proto.Step) (metas [][]byte, err error) { + if task.Step == proto.StepInit { + return [][]byte{ + []byte("task1"), + []byte("task2"), + []byte("task3"), + }, nil + } + return nil, nil + }, + ).AnyTimes() + + mockScheduler.EXPECT().OnDone(gomock.Any(), gomock.Any(), gomock.Any()).Return(nil).AnyTimes() + return mockScheduler +} diff --git a/pkg/disttask/framework/testutil/table_util.go b/pkg/disttask/framework/testutil/table_util.go new file mode 100644 index 0000000000000..1f2d9dfc24daf --- /dev/null +++ b/pkg/disttask/framework/testutil/table_util.go @@ -0,0 +1,261 @@ +// Copyright 2023 PingCAP, 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. + +package testutil + +import ( + "context" + "fmt" + "strings" + "testing" + "time" + + "github.com/ngaut/pools" + "github.com/pingcap/failpoint" + "github.com/pingcap/tidb/pkg/disttask/framework/proto" + "github.com/pingcap/tidb/pkg/disttask/framework/storage" + "github.com/pingcap/tidb/pkg/kv" + "github.com/pingcap/tidb/pkg/sessionctx" + "github.com/pingcap/tidb/pkg/store/mockstore" + "github.com/pingcap/tidb/pkg/testkit" + "github.com/pingcap/tidb/pkg/util/logutil" + "github.com/stretchr/testify/require" + "github.com/tikv/client-go/v2/util" +) + +// InitTableTest inits needed components for table_test. +// it disables disttask and mock cpu count to 8. +func InitTableTest(t *testing.T) (kv.Storage, *storage.TaskManager, context.Context) { + store, pool := getResourcePool(t) + ctx := context.Background() + ctx = util.WithInternalSourceType(ctx, "table_test") + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/util/cpu/mockNumCpu", "return(8)")) + t.Cleanup(func() { + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/util/cpu/mockNumCpu")) + }) + return store, getTaskManager(t, pool), ctx +} + +// InitTableTestWithCancel inits needed components with context.CancelFunc for table_test. +func InitTableTestWithCancel(t *testing.T) (*storage.TaskManager, context.Context, context.CancelFunc) { + _, pool := getResourcePool(t) + ctx, cancel := context.WithCancel(context.Background()) + ctx = util.WithInternalSourceType(ctx, "table_test") + return getTaskManager(t, pool), ctx, cancel +} + +func getResourcePool(t *testing.T) (kv.Storage, *pools.ResourcePool) { + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/domain/MockDisableDistTask", "return(true)")) + defer func() { + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/domain/MockDisableDistTask")) + }() + store := testkit.CreateMockStore(t, mockstore.WithStoreType(mockstore.EmbedUnistore)) + tk := testkit.NewTestKit(t, store) + pool := pools.NewResourcePool(func() (pools.Resource, error) { + return tk.Session(), nil + }, 1, 1, time.Second) + + t.Cleanup(func() { + pool.Close() + }) + return store, pool +} + +func getTaskManager(t *testing.T, pool *pools.ResourcePool) *storage.TaskManager { + manager := storage.NewTaskManager(pool) + storage.SetTaskManager(manager) + manager, err := storage.GetTaskManager() + require.NoError(t, err) + return manager +} + +// GetOneTask get a task from task table +func GetOneTask(ctx context.Context, mgr *storage.TaskManager) (task *proto.Task, err error) { + rs, err := mgr.ExecuteSQLWithNewSession(ctx, "select "+storage.TaskColumns+" from mysql.tidb_global_task where state = %? limit 1", proto.TaskStatePending) + if err != nil { + return task, err + } + + if len(rs) == 0 { + return nil, nil + } + + return storage.Row2Task(rs[0]), nil +} + +// GetSubtasksFromHistory gets subtasks from history table for test. +func GetSubtasksFromHistory(ctx context.Context, mgr *storage.TaskManager) (int, error) { + rs, err := mgr.ExecuteSQLWithNewSession(ctx, + "select * from mysql.tidb_background_subtask_history") + if err != nil { + return 0, err + } + return len(rs), nil +} + +// GetSubtasksFromHistoryByTaskID gets subtasks by taskID from history table for test. +func GetSubtasksFromHistoryByTaskID(ctx context.Context, mgr *storage.TaskManager, taskID int64) (int, error) { + rs, err := mgr.ExecuteSQLWithNewSession(ctx, + `select `+storage.SubtaskColumns+` from mysql.tidb_background_subtask_history where task_key = %?`, taskID) + if err != nil { + return 0, err + } + return len(rs), nil +} + +// GetSubtasksByTaskID gets subtasks by taskID for test. +func GetSubtasksByTaskID(ctx context.Context, mgr *storage.TaskManager, taskID int64) ([]*proto.Subtask, error) { + rs, err := mgr.ExecuteSQLWithNewSession(ctx, + `select `+storage.SubtaskColumns+` from mysql.tidb_background_subtask where task_key = %?`, taskID) + if err != nil { + return nil, err + } + if len(rs) == 0 { + return nil, nil + } + subtasks := make([]*proto.Subtask, 0, len(rs)) + for _, r := range rs { + subtasks = append(subtasks, storage.Row2SubTask(r)) + } + return subtasks, nil +} + +// GetTasksFromHistory gets tasks from history table for test. +func GetTasksFromHistory(ctx context.Context, mgr *storage.TaskManager) (int, error) { + rs, err := mgr.ExecuteSQLWithNewSession(ctx, + "select * from mysql.tidb_global_task_history") + if err != nil { + return 0, err + } + return len(rs), nil +} + +// GetTaskEndTime gets task's endTime for test. +func GetTaskEndTime(ctx context.Context, mgr *storage.TaskManager, taskID int64) (time.Time, error) { + rs, err := mgr.ExecuteSQLWithNewSession(ctx, + `select end_time + from mysql.tidb_global_task + where id = %?`, taskID) + + if err != nil { + return time.Time{}, nil + } + if !rs[0].IsNull(0) { + return rs[0].GetTime(0).GoTime(time.Local) + } + return time.Time{}, nil +} + +// GetSubtaskEndTime gets subtask's endTime for test. +func GetSubtaskEndTime(ctx context.Context, mgr *storage.TaskManager, subtaskID int64) (time.Time, error) { + rs, err := mgr.ExecuteSQLWithNewSession(ctx, + `select end_time + from mysql.tidb_background_subtask + where id = %?`, subtaskID) + + if err != nil { + return time.Time{}, nil + } + if !rs[0].IsNull(0) { + return rs[0].GetTime(0).GoTime(time.Local) + } + return time.Time{}, nil +} + +// GetSubtaskNodes gets subtasks running nodes for one task for test. +func GetSubtaskNodes(ctx context.Context, mgr *storage.TaskManager, taskID int64) ([]string, error) { + rs, err := mgr.ExecuteSQLWithNewSession(ctx, + `select distinct(exec_id) from mysql.tidb_background_subtask where task_key=%?`, taskID) + if err != nil { + return nil, err + } + nodes := make([]string, 0, len(rs)) + for _, r := range rs { + if !r.IsNull(0) { + nodes = append(nodes, r.GetString(0)) + } + } + return nodes, nil +} + +// UpdateSubtaskExecID updates the subtask's exec_id, used for testing now. +func UpdateSubtaskExecID(ctx context.Context, mgr *storage.TaskManager, tidbID string, subtaskID int64) error { + _, err := mgr.ExecuteSQLWithNewSession(ctx, + `update mysql.tidb_background_subtask + set exec_id = %?, state_update_time = unix_timestamp() + where id = %?`, + tidbID, subtaskID) + return err +} + +// TransferSubTasks2History move subtasks from tidb_background_subtask to tidb_background_subtask_history. +func TransferSubTasks2History(ctx context.Context, mgr *storage.TaskManager, taskID int64) error { + return mgr.WithNewSession(func(se sessionctx.Context) error { + return mgr.TransferSubtasks2HistoryWithSession(ctx, se, taskID) + }) +} + +// GetTasksFromHistoryInStates gets the tasks in history table in the states. +func GetTasksFromHistoryInStates(ctx context.Context, mgr *storage.TaskManager, states ...interface{}) (task []*proto.Task, err error) { + if len(states) == 0 { + return task, nil + } + + rs, err := mgr.ExecuteSQLWithNewSession(ctx, "select "+storage.TaskColumns+" from mysql.tidb_global_task_history where state in ("+strings.Repeat("%?,", len(states)-1)+"%?)", states...) + if err != nil { + return task, err + } + + for _, r := range rs { + task = append(task, storage.Row2Task(r)) + } + return task, nil +} + +// DeleteSubtasksByTaskID deletes the subtask of the given task ID. +func DeleteSubtasksByTaskID(ctx context.Context, mgr *storage.TaskManager, taskID int64) error { + _, err := mgr.ExecuteSQLWithNewSession(ctx, `delete from mysql.tidb_background_subtask + where task_key = %?`, taskID) + if err != nil { + return err + } + + return nil +} + +// IsTaskCancelling checks whether the task state is cancelling. +func IsTaskCancelling(ctx context.Context, mgr *storage.TaskManager, taskID int64) (bool, error) { + rs, err := mgr.ExecuteSQLWithNewSession(ctx, "select 1 from mysql.tidb_global_task where id=%? and state = %?", + taskID, proto.TaskStateCancelling, + ) + + if err != nil { + return false, err + } + + return len(rs) > 0, nil +} + +// PrintSubtaskInfo log the subtask info by taskKey for test. +func PrintSubtaskInfo(ctx context.Context, mgr *storage.TaskManager, taskID int64) { + rs, _ := mgr.ExecuteSQLWithNewSession(ctx, + `select `+storage.SubtaskColumns+` from mysql.tidb_background_subtask_history where task_key = %?`, taskID) + rs2, _ := mgr.ExecuteSQLWithNewSession(ctx, + `select `+storage.SubtaskColumns+` from mysql.tidb_background_subtask where task_key = %?`, taskID) + rs = append(rs, rs2...) + + for _, r := range rs { + logutil.BgLogger().Info(fmt.Sprintf("subTask: %v\n", storage.Row2SubTask(r))) + } +} diff --git a/pkg/disttask/framework/testutil/task_util.go b/pkg/disttask/framework/testutil/task_util.go new file mode 100644 index 0000000000000..0f8d92deac04e --- /dev/null +++ b/pkg/disttask/framework/testutil/task_util.go @@ -0,0 +1,50 @@ +// Copyright 2023 PingCAP, 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. + +package testutil + +import ( + "context" + "testing" + + "github.com/pingcap/tidb/pkg/disttask/framework/proto" + "github.com/pingcap/tidb/pkg/disttask/framework/storage" + "github.com/pingcap/tidb/pkg/sessionctx" + "github.com/pingcap/tidb/pkg/util/sqlexec" + "github.com/stretchr/testify/require" + "github.com/tikv/client-go/v2/util" +) + +// CreateSubTask adds a new task to subtask table. +// used for testing. +func CreateSubTask(t *testing.T, gm *storage.TaskManager, taskID int64, step proto.Step, execID string, meta []byte, tp proto.TaskType, concurrency int, isRevert bool) { + state := proto.SubtaskStatePending + if isRevert { + state = proto.SubtaskStateRevertPending + } + InsertSubtask(t, gm, taskID, step, execID, meta, state, tp, concurrency) +} + +// InsertSubtask adds a new subtask of any state to subtask table. +func InsertSubtask(t *testing.T, gm *storage.TaskManager, taskID int64, step proto.Step, execID string, meta []byte, state proto.SubtaskState, tp proto.TaskType, concurrency int) { + ctx := context.Background() + ctx = util.WithInternalSourceType(ctx, "table_test") + require.NoError(t, gm.WithNewSession(func(se sessionctx.Context) error { + _, err := sqlexec.ExecSQL(ctx, se, ` + insert into mysql.tidb_background_subtask(`+storage.InsertSubtaskColumns+`) values`+ + `(%?, %?, %?, %?, %?, %?, %?, NULL, CURRENT_TIMESTAMP(), '{}', '{}')`, + step, taskID, execID, meta, state, proto.Type2Int(tp), concurrency) + return err + })) +} diff --git a/pkg/disttask/importinto/BUILD.bazel b/pkg/disttask/importinto/BUILD.bazel index 92b5fa9f9f654..316c5942d1c9c 100644 --- a/pkg/disttask/importinto/BUILD.bazel +++ b/pkg/disttask/importinto/BUILD.bazel @@ -4,7 +4,6 @@ go_library( name = "importinto", srcs = [ "clean_s3.go", - "dispatcher.go", "encode_and_sort_operator.go", "job.go", "metrics.go", @@ -12,6 +11,7 @@ go_library( "proto.go", "scheduler.go", "subtask_executor.go", + "task_executor.go", "wrapper.go", ], importpath = "github.com/pingcap/tidb/pkg/disttask/importinto", @@ -20,7 +20,6 @@ go_library( "//br/pkg/lightning/backend", "//br/pkg/lightning/backend/external", "//br/pkg/lightning/backend/kv", - "//br/pkg/lightning/backend/local", "//br/pkg/lightning/checkpoints", "//br/pkg/lightning/common", "//br/pkg/lightning/config", @@ -30,20 +29,17 @@ go_library( "//br/pkg/lightning/verification", "//br/pkg/storage", "//br/pkg/utils", - "//pkg/config", - "//pkg/disttask/framework/dispatcher", "//pkg/disttask/framework/handle", "//pkg/disttask/framework/planner", "//pkg/disttask/framework/proto", "//pkg/disttask/framework/scheduler", - "//pkg/disttask/framework/scheduler/execute", "//pkg/disttask/framework/storage", + "//pkg/disttask/framework/taskexecutor", + "//pkg/disttask/framework/taskexecutor/execute", "//pkg/disttask/operator", "//pkg/domain/infosync", "//pkg/errno", - "//pkg/executor/asyncloaddata", "//pkg/executor/importer", - "//pkg/keyspace", "//pkg/kv", "//pkg/meta/autoid", "//pkg/metrics", @@ -53,14 +49,13 @@ go_library( "//pkg/resourcemanager/pool/workerpool", "//pkg/resourcemanager/util", "//pkg/sessionctx", - "//pkg/sessionctx/variable", "//pkg/table/tables", "//pkg/util", "//pkg/util/backoff", "//pkg/util/dbterror/exeerrors", + "//pkg/util/disttask", "//pkg/util/etcd", "//pkg/util/logutil", - "//pkg/util/mathutil", "//pkg/util/promutil", "//pkg/util/size", "//pkg/util/sqlexec", @@ -71,7 +66,6 @@ go_library( "@com_github_pingcap_failpoint//:failpoint", "@com_github_prometheus_client_golang//prometheus", "@com_github_tikv_client_go_v2//util", - "@io_etcd_go_etcd_client_v3//:client", "@org_uber_go_atomic//:atomic", "@org_uber_go_zap//:zap", "@org_uber_go_zap//zapcore", @@ -82,30 +76,33 @@ go_test( name = "importinto_test", timeout = "short", srcs = [ - "dispatcher_test.go", - "dispatcher_testkit_test.go", "encode_and_sort_operator_test.go", "job_testkit_test.go", "metrics_test.go", "planner_test.go", + "scheduler_test.go", + "scheduler_testkit_test.go", "subtask_executor_test.go", + "task_executor_test.go", + "task_executor_testkit_test.go", "wrapper_test.go", ], embed = [":importinto"], flaky = True, race = "on", - shard_count = 15, + shard_count = 16, deps = [ "//br/pkg/lightning/backend", "//br/pkg/lightning/backend/external", "//br/pkg/lightning/checkpoints", + "//br/pkg/lightning/config", "//br/pkg/lightning/mydump", - "//br/pkg/lightning/verification", "//pkg/ddl", - "//pkg/disttask/framework/dispatcher", "//pkg/disttask/framework/planner", "//pkg/disttask/framework/proto", + "//pkg/disttask/framework/scheduler", "//pkg/disttask/framework/storage", + "//pkg/disttask/framework/testutil", "//pkg/disttask/importinto/mock", "//pkg/disttask/operator", "//pkg/domain/infosync", @@ -115,8 +112,8 @@ go_test( "//pkg/parser", "//pkg/parser/ast", "//pkg/parser/model", + "//pkg/session", "//pkg/testkit", - "//pkg/util/logutil", "//pkg/util/mock", "//pkg/util/sqlexec", "@com_github_docker_go_units//:go-units", diff --git a/pkg/disttask/importinto/clean_s3.go b/pkg/disttask/importinto/clean_s3.go index 5ae75137c46e7..e935163871222 100644 --- a/pkg/disttask/importinto/clean_s3.go +++ b/pkg/disttask/importinto/clean_s3.go @@ -21,19 +21,19 @@ import ( "github.com/pingcap/tidb/br/pkg/lightning/backend/external" "github.com/pingcap/tidb/br/pkg/lightning/log" - "github.com/pingcap/tidb/pkg/disttask/framework/dispatcher" "github.com/pingcap/tidb/pkg/disttask/framework/proto" + "github.com/pingcap/tidb/pkg/disttask/framework/scheduler" "github.com/pingcap/tidb/pkg/util/logutil" "go.uber.org/zap" ) -var _ dispatcher.CleanUpRoutine = (*ImportCleanUpS3)(nil) +var _ scheduler.CleanUpRoutine = (*ImportCleanUpS3)(nil) -// ImportCleanUpS3 implements dispatcher.CleanUpRoutine. +// ImportCleanUpS3 implements scheduler.CleanUpRoutine. type ImportCleanUpS3 struct { } -func newImportCleanUpS3() dispatcher.CleanUpRoutine { +func newImportCleanUpS3() scheduler.CleanUpRoutine { return &ImportCleanUpS3{} } @@ -73,5 +73,5 @@ func (*ImportCleanUpS3) CleanUp(ctx context.Context, task *proto.Task) error { } func init() { - dispatcher.RegisterDispatcherCleanUpFactory(proto.ImportInto, newImportCleanUpS3) + scheduler.RegisterSchedulerCleanUpFactory(proto.ImportInto, newImportCleanUpS3) } diff --git a/pkg/disttask/importinto/dispatcher.go b/pkg/disttask/importinto/dispatcher.go deleted file mode 100644 index 4321f5a2a9747..0000000000000 --- a/pkg/disttask/importinto/dispatcher.go +++ /dev/null @@ -1,760 +0,0 @@ -// Copyright 2023 PingCAP, 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. - -package importinto - -import ( - "context" - "encoding/json" - "strconv" - "strings" - "sync" - "time" - - dmysql "github.com/go-sql-driver/mysql" - "github.com/pingcap/errors" - "github.com/pingcap/failpoint" - "github.com/pingcap/tidb/br/pkg/lightning/checkpoints" - "github.com/pingcap/tidb/br/pkg/lightning/common" - "github.com/pingcap/tidb/br/pkg/lightning/config" - "github.com/pingcap/tidb/br/pkg/lightning/metric" - "github.com/pingcap/tidb/br/pkg/utils" - "github.com/pingcap/tidb/pkg/disttask/framework/dispatcher" - "github.com/pingcap/tidb/pkg/disttask/framework/handle" - "github.com/pingcap/tidb/pkg/disttask/framework/planner" - "github.com/pingcap/tidb/pkg/disttask/framework/proto" - "github.com/pingcap/tidb/pkg/disttask/framework/storage" - "github.com/pingcap/tidb/pkg/domain/infosync" - "github.com/pingcap/tidb/pkg/errno" - "github.com/pingcap/tidb/pkg/executor/importer" - "github.com/pingcap/tidb/pkg/parser/ast" - "github.com/pingcap/tidb/pkg/sessionctx" - "github.com/pingcap/tidb/pkg/util/backoff" - "github.com/pingcap/tidb/pkg/util/etcd" - "github.com/pingcap/tidb/pkg/util/logutil" - "github.com/pingcap/tidb/pkg/util/sqlexec" - "go.uber.org/atomic" - "go.uber.org/zap" -) - -const ( - registerTaskTTL = 10 * time.Minute - refreshTaskTTLInterval = 3 * time.Minute - registerTimeout = 5 * time.Second -) - -// NewTaskRegisterWithTTL is the ctor for TaskRegister. -// It is exported for testing. -var NewTaskRegisterWithTTL = utils.NewTaskRegisterWithTTL - -type taskInfo struct { - taskID int64 - - // operation on taskInfo is run inside detect-task goroutine, so no need to synchronize. - lastRegisterTime time.Time - - // initialized lazily in register() - etcdClient *etcd.Client - taskRegister utils.TaskRegister -} - -func (t *taskInfo) register(ctx context.Context) { - if time.Since(t.lastRegisterTime) < refreshTaskTTLInterval { - return - } - - if time.Since(t.lastRegisterTime) < refreshTaskTTLInterval { - return - } - logger := logutil.BgLogger().With(zap.Int64("task-id", t.taskID)) - if t.taskRegister == nil { - client, err := importer.GetEtcdClient() - if err != nil { - logger.Warn("get etcd client failed", zap.Error(err)) - return - } - t.etcdClient = client - t.taskRegister = NewTaskRegisterWithTTL(client.GetClient(), registerTaskTTL, - utils.RegisterImportInto, strconv.FormatInt(t.taskID, 10)) - } - timeoutCtx, cancel := context.WithTimeout(ctx, registerTimeout) - defer cancel() - if err := t.taskRegister.RegisterTaskOnce(timeoutCtx); err != nil { - logger.Warn("register task failed", zap.Error(err)) - } else { - logger.Info("register task to pd or refresh lease success") - } - // we set it even if register failed, TTL is 10min, refresh interval is 3min, - // we can try 2 times before the lease is expired. - t.lastRegisterTime = time.Now() -} - -func (t *taskInfo) close(ctx context.Context) { - logger := logutil.BgLogger().With(zap.Int64("task-id", t.taskID)) - if t.taskRegister != nil { - timeoutCtx, cancel := context.WithTimeout(ctx, registerTimeout) - defer cancel() - if err := t.taskRegister.Close(timeoutCtx); err != nil { - logger.Warn("unregister task failed", zap.Error(err)) - } else { - logger.Info("unregister task success") - } - t.taskRegister = nil - } - if t.etcdClient != nil { - if err := t.etcdClient.Close(); err != nil { - logger.Warn("close etcd client failed", zap.Error(err)) - } - t.etcdClient = nil - } -} - -// ImportDispatcherExt is an extension of ImportDispatcher, exported for test. -type ImportDispatcherExt struct { - GlobalSort bool - mu sync.RWMutex - // NOTE: there's no need to sync for below 2 fields actually, since we add a restriction that only one - // task can be running at a time. but we might support task queuing in the future, leave it for now. - // the last time we switch TiKV into IMPORT mode, this is a global operation, do it for one task makes - // no difference to do it for all tasks. So we do not need to record the switch time for each task. - lastSwitchTime atomic.Time - // taskInfoMap is a map from taskID to taskInfo - taskInfoMap sync.Map - - // currTaskID is the taskID of the current running task. - // It may be changed when we switch to a new task or switch to a new owner. - currTaskID atomic.Int64 - disableTiKVImportMode atomic.Bool -} - -var _ dispatcher.Extension = (*ImportDispatcherExt)(nil) - -// OnTick implements dispatcher.Extension interface. -func (dsp *ImportDispatcherExt) OnTick(ctx context.Context, task *proto.Task) { - // only switch TiKV mode or register task when task is running - if task.State != proto.TaskStateRunning { - return - } - dsp.switchTiKVMode(ctx, task) - dsp.registerTask(ctx, task) -} - -func (*ImportDispatcherExt) isImporting2TiKV(task *proto.Task) bool { - return task.Step == StepImport || task.Step == StepWriteAndIngest -} - -func (dsp *ImportDispatcherExt) switchTiKVMode(ctx context.Context, task *proto.Task) { - dsp.updateCurrentTask(task) - // only import step need to switch to IMPORT mode, - // If TiKV is in IMPORT mode during checksum, coprocessor will time out. - if dsp.disableTiKVImportMode.Load() || !dsp.isImporting2TiKV(task) { - return - } - - if time.Since(dsp.lastSwitchTime.Load()) < config.DefaultSwitchTiKVModeInterval { - return - } - - dsp.mu.Lock() - defer dsp.mu.Unlock() - if time.Since(dsp.lastSwitchTime.Load()) < config.DefaultSwitchTiKVModeInterval { - return - } - - logger := logutil.BgLogger().With(zap.Int64("task-id", task.ID)) - pdCli, switcher, err := importer.GetTiKVModeSwitcherWithPDClient(ctx, logger) - if err != nil { - logger.Warn("get tikv mode switcher failed", zap.Error(err)) - return - } - switcher.ToImportMode(ctx) - pdCli.Close() - dsp.lastSwitchTime.Store(time.Now()) -} - -func (dsp *ImportDispatcherExt) registerTask(ctx context.Context, task *proto.Task) { - val, _ := dsp.taskInfoMap.LoadOrStore(task.ID, &taskInfo{taskID: task.ID}) - info := val.(*taskInfo) - info.register(ctx) -} - -func (dsp *ImportDispatcherExt) unregisterTask(ctx context.Context, task *proto.Task) { - if val, loaded := dsp.taskInfoMap.LoadAndDelete(task.ID); loaded { - info := val.(*taskInfo) - info.close(ctx) - } -} - -// OnNextSubtasksBatch generate batch of next stage's plan. -func (dsp *ImportDispatcherExt) OnNextSubtasksBatch( - ctx context.Context, - taskHandle dispatcher.TaskHandle, - gTask *proto.Task, - serverInfos []*infosync.ServerInfo, - nextStep proto.Step, -) ( - resSubtaskMeta [][]byte, err error) { - logger := logutil.BgLogger().With( - zap.Stringer("type", gTask.Type), - zap.Int64("task-id", gTask.ID), - zap.String("curr-step", stepStr(gTask.Step)), - zap.String("next-step", stepStr(nextStep)), - ) - taskMeta := &TaskMeta{} - err = json.Unmarshal(gTask.Meta, taskMeta) - if err != nil { - return nil, errors.Trace(err) - } - logger.Info("on next subtasks batch") - - defer func() { - taskFinished := err == nil && nextStep == proto.StepDone - if taskFinished { - // todo: we're not running in a transaction with task update - if err2 := dsp.finishJob(ctx, logger, taskHandle, gTask, taskMeta); err2 != nil { - err = err2 - } - } else if err != nil && !dsp.IsRetryableErr(err) { - if err2 := dsp.failJob(ctx, taskHandle, gTask, taskMeta, logger, err.Error()); err2 != nil { - // todo: we're not running in a transaction with task update, there might be case - // failJob return error, but task update succeed. - logger.Error("call failJob failed", zap.Error(err2)) - } - } - }() - - previousSubtaskMetas := make(map[proto.Step][][]byte, 1) - switch nextStep { - case StepImport, StepEncodeAndSort: - if metrics, ok := metric.GetCommonMetric(ctx); ok { - metrics.BytesCounter.WithLabelValues(metric.StateTotalRestore).Add(float64(taskMeta.Plan.TotalFileSize)) - } - jobStep := importer.JobStepImporting - if dsp.GlobalSort { - jobStep = importer.JobStepGlobalSorting - } - if err = startJob(ctx, logger, taskHandle, taskMeta, jobStep); err != nil { - return nil, err - } - case StepMergeSort: - sortAndEncodeMeta, err := taskHandle.GetPreviousSubtaskMetas(gTask.ID, StepEncodeAndSort) - if err != nil { - return nil, err - } - previousSubtaskMetas[StepEncodeAndSort] = sortAndEncodeMeta - case StepWriteAndIngest: - failpoint.Inject("failWhenDispatchWriteIngestSubtask", func() { - failpoint.Return(nil, errors.New("injected error")) - }) - // merge sort might be skipped for some kv groups, so we need to get all - // subtask metas of StepEncodeAndSort step too. - encodeAndSortMetas, err := taskHandle.GetPreviousSubtaskMetas(gTask.ID, StepEncodeAndSort) - if err != nil { - return nil, err - } - mergeSortMetas, err := taskHandle.GetPreviousSubtaskMetas(gTask.ID, StepMergeSort) - if err != nil { - return nil, err - } - previousSubtaskMetas[StepEncodeAndSort] = encodeAndSortMetas - previousSubtaskMetas[StepMergeSort] = mergeSortMetas - if err = job2Step(ctx, logger, taskMeta, importer.JobStepImporting); err != nil { - return nil, err - } - case StepPostProcess: - dsp.switchTiKV2NormalMode(ctx, gTask, logger) - failpoint.Inject("clearLastSwitchTime", func() { - dsp.lastSwitchTime.Store(time.Time{}) - }) - if err = job2Step(ctx, logger, taskMeta, importer.JobStepValidating); err != nil { - return nil, err - } - failpoint.Inject("failWhenDispatchPostProcessSubtask", func() { - failpoint.Return(nil, errors.New("injected error after StepImport")) - }) - // we need get metas where checksum is stored. - if err := updateResult(taskHandle, gTask, taskMeta, dsp.GlobalSort); err != nil { - return nil, err - } - step := getStepOfEncode(dsp.GlobalSort) - metas, err := taskHandle.GetPreviousSubtaskMetas(gTask.ID, step) - if err != nil { - return nil, err - } - previousSubtaskMetas[step] = metas - logger.Info("move to post-process step ", zap.Any("result", taskMeta.Result)) - case proto.StepDone: - return nil, nil - default: - return nil, errors.Errorf("unknown step %d", gTask.Step) - } - - planCtx := planner.PlanCtx{ - Ctx: ctx, - TaskID: gTask.ID, - PreviousSubtaskMetas: previousSubtaskMetas, - GlobalSort: dsp.GlobalSort, - NextTaskStep: nextStep, - ExecuteNodesCnt: len(serverInfos), - } - logicalPlan := &LogicalPlan{} - if err := logicalPlan.FromTaskMeta(gTask.Meta); err != nil { - return nil, err - } - physicalPlan, err := logicalPlan.ToPhysicalPlan(planCtx) - if err != nil { - return nil, err - } - metaBytes, err := physicalPlan.ToSubtaskMetas(planCtx, nextStep) - if err != nil { - return nil, err - } - logger.Info("generate subtasks", zap.Int("subtask-count", len(metaBytes))) - return metaBytes, nil -} - -// OnErrStage implements dispatcher.Extension interface. -func (dsp *ImportDispatcherExt) OnErrStage(ctx context.Context, handle dispatcher.TaskHandle, gTask *proto.Task, receiveErrs []error) ([]byte, error) { - logger := logutil.BgLogger().With( - zap.Stringer("type", gTask.Type), - zap.Int64("task-id", gTask.ID), - zap.String("step", stepStr(gTask.Step)), - ) - logger.Info("on error stage", zap.Errors("errors", receiveErrs)) - taskMeta := &TaskMeta{} - err := json.Unmarshal(gTask.Meta, taskMeta) - if err != nil { - return nil, errors.Trace(err) - } - errStrs := make([]string, 0, len(receiveErrs)) - for _, receiveErr := range receiveErrs { - errStrs = append(errStrs, receiveErr.Error()) - } - if err = dsp.failJob(ctx, handle, gTask, taskMeta, logger, strings.Join(errStrs, "; ")); err != nil { - return nil, err - } - - gTask.Error = receiveErrs[0] - - errStr := receiveErrs[0].Error() - // do nothing if the error is resumable - if isResumableErr(errStr) { - return nil, nil - } - - if gTask.Step == StepImport { - err = rollback(ctx, handle, gTask, logger) - if err != nil { - // TODO: add error code according to spec. - gTask.Error = errors.New(errStr + ", " + err.Error()) - } - } - return nil, err -} - -// GetEligibleInstances implements dispatcher.Extension interface. -func (*ImportDispatcherExt) GetEligibleInstances(ctx context.Context, gTask *proto.Task) ([]*infosync.ServerInfo, bool, error) { - taskMeta := &TaskMeta{} - err := json.Unmarshal(gTask.Meta, taskMeta) - if err != nil { - return nil, true, errors.Trace(err) - } - if len(taskMeta.EligibleInstances) > 0 { - return taskMeta.EligibleInstances, false, nil - } - serverInfo, err := dispatcher.GenerateSchedulerNodes(ctx) - return serverInfo, true, err -} - -// IsRetryableErr implements dispatcher.Extension interface. -func (*ImportDispatcherExt) IsRetryableErr(error) bool { - // TODO: check whether the error is retryable. - return false -} - -// GetNextStep implements dispatcher.Extension interface. -func (dsp *ImportDispatcherExt) GetNextStep(task *proto.Task) proto.Step { - switch task.Step { - case proto.StepInit: - if dsp.GlobalSort { - return StepEncodeAndSort - } - return StepImport - case StepEncodeAndSort: - return StepMergeSort - case StepMergeSort: - return StepWriteAndIngest - case StepImport, StepWriteAndIngest: - return StepPostProcess - default: - // current step must be StepPostProcess - return proto.StepDone - } -} - -func (dsp *ImportDispatcherExt) switchTiKV2NormalMode(ctx context.Context, task *proto.Task, logger *zap.Logger) { - dsp.updateCurrentTask(task) - if dsp.disableTiKVImportMode.Load() { - return - } - - dsp.mu.Lock() - defer dsp.mu.Unlock() - - pdCli, switcher, err := importer.GetTiKVModeSwitcherWithPDClient(ctx, logger) - if err != nil { - logger.Warn("get tikv mode switcher failed", zap.Error(err)) - return - } - switcher.ToNormalMode(ctx) - pdCli.Close() - - // clear it, so next task can switch TiKV mode again. - dsp.lastSwitchTime.Store(time.Time{}) -} - -func (dsp *ImportDispatcherExt) updateCurrentTask(task *proto.Task) { - if dsp.currTaskID.Swap(task.ID) != task.ID { - taskMeta := &TaskMeta{} - if err := json.Unmarshal(task.Meta, taskMeta); err == nil { - // for raftkv2, switch mode in local backend - dsp.disableTiKVImportMode.Store(taskMeta.Plan.DisableTiKVImportMode || taskMeta.Plan.IsRaftKV2) - } - } -} - -type importDispatcher struct { - *dispatcher.BaseDispatcher -} - -func newImportDispatcher(ctx context.Context, taskMgr dispatcher.TaskManager, - serverID string, task *proto.Task) dispatcher.Dispatcher { - metrics := metricsManager.getOrCreateMetrics(task.ID) - subCtx := metric.WithCommonMetric(ctx, metrics) - dsp := importDispatcher{ - BaseDispatcher: dispatcher.NewBaseDispatcher(subCtx, taskMgr, serverID, task), - } - return &dsp -} - -func (dsp *importDispatcher) Init() (err error) { - defer func() { - if err != nil { - // if init failed, close is not called, so we need to unregister here. - metricsManager.unregister(dsp.Task.ID) - } - }() - taskMeta := &TaskMeta{} - if err = json.Unmarshal(dsp.BaseDispatcher.Task.Meta, taskMeta); err != nil { - return errors.Annotate(err, "unmarshal task meta failed") - } - - dsp.BaseDispatcher.Extension = &ImportDispatcherExt{ - GlobalSort: taskMeta.Plan.CloudStorageURI != "", - } - return dsp.BaseDispatcher.Init() -} - -func (dsp *importDispatcher) Close() { - metricsManager.unregister(dsp.Task.ID) - dsp.BaseDispatcher.Close() -} - -// nolint:deadcode -func dropTableIndexes(ctx context.Context, handle dispatcher.TaskHandle, taskMeta *TaskMeta, logger *zap.Logger) error { - tblInfo := taskMeta.Plan.TableInfo - tableName := common.UniqueTable(taskMeta.Plan.DBName, tblInfo.Name.L) - - remainIndexes, dropIndexes := common.GetDropIndexInfos(tblInfo) - for _, idxInfo := range dropIndexes { - sqlStr := common.BuildDropIndexSQL(tableName, idxInfo) - if err := executeSQL(ctx, handle, logger, sqlStr); err != nil { - if merr, ok := errors.Cause(err).(*dmysql.MySQLError); ok { - switch merr.Number { - case errno.ErrCantDropFieldOrKey, errno.ErrDropIndexNeededInForeignKey: - remainIndexes = append(remainIndexes, idxInfo) - logger.Warn("can't drop index, skip", zap.String("index", idxInfo.Name.O), zap.Error(err)) - continue - } - } - return err - } - } - if len(remainIndexes) < len(tblInfo.Indices) { - taskMeta.Plan.TableInfo = taskMeta.Plan.TableInfo.Clone() - taskMeta.Plan.TableInfo.Indices = remainIndexes - } - return nil -} - -// nolint:deadcode -func createTableIndexes(ctx context.Context, executor storage.SessionExecutor, taskMeta *TaskMeta, logger *zap.Logger) error { - tableName := common.UniqueTable(taskMeta.Plan.DBName, taskMeta.Plan.TableInfo.Name.L) - singleSQL, multiSQLs := common.BuildAddIndexSQL(tableName, taskMeta.Plan.TableInfo, taskMeta.Plan.DesiredTableInfo) - logger.Info("build add index sql", zap.String("singleSQL", singleSQL), zap.Strings("multiSQLs", multiSQLs)) - if len(multiSQLs) == 0 { - return nil - } - - err := executeSQL(ctx, executor, logger, singleSQL) - if err == nil { - return nil - } - if !common.IsDupKeyError(err) { - // TODO: refine err msg and error code according to spec. - return errors.Errorf("Failed to create index: %v, please execute the SQL manually, sql: %s", err, singleSQL) - } - if len(multiSQLs) == 1 { - return nil - } - logger.Warn("cannot add all indexes in one statement, try to add them one by one", zap.Strings("sqls", multiSQLs), zap.Error(err)) - - for i, ddl := range multiSQLs { - err := executeSQL(ctx, executor, logger, ddl) - if err != nil && !common.IsDupKeyError(err) { - // TODO: refine err msg and error code according to spec. - return errors.Errorf("Failed to create index: %v, please execute the SQLs manually, sqls: %s", err, strings.Join(multiSQLs[i:], ";")) - } - } - return nil -} - -// TODO: return the result of sql. -func executeSQL(ctx context.Context, executor storage.SessionExecutor, logger *zap.Logger, sql string, args ...interface{}) (err error) { - logger.Info("execute sql", zap.String("sql", sql), zap.Any("args", args)) - return executor.WithNewSession(func(se sessionctx.Context) error { - _, err := se.(sqlexec.SQLExecutor).ExecuteInternal(ctx, sql, args...) - return err - }) -} - -func updateMeta(gTask *proto.Task, taskMeta *TaskMeta) error { - bs, err := json.Marshal(taskMeta) - if err != nil { - return errors.Trace(err) - } - gTask.Meta = bs - - return nil -} - -// todo: converting back and forth, we should unify struct and remove this function later. -func toChunkMap(engineCheckpoints map[int32]*checkpoints.EngineCheckpoint) map[int32][]Chunk { - chunkMap := make(map[int32][]Chunk, len(engineCheckpoints)) - for id, ecp := range engineCheckpoints { - chunkMap[id] = make([]Chunk, 0, len(ecp.Chunks)) - for _, chunkCheckpoint := range ecp.Chunks { - chunkMap[id] = append(chunkMap[id], toChunk(*chunkCheckpoint)) - } - } - return chunkMap -} - -func getStepOfEncode(globalSort bool) proto.Step { - if globalSort { - return StepEncodeAndSort - } - return StepImport -} - -// we will update taskMeta in place and make gTask.Meta point to the new taskMeta. -func updateResult(handle dispatcher.TaskHandle, gTask *proto.Task, taskMeta *TaskMeta, globalSort bool) error { - stepOfEncode := getStepOfEncode(globalSort) - metas, err := handle.GetPreviousSubtaskMetas(gTask.ID, stepOfEncode) - if err != nil { - return err - } - - subtaskMetas := make([]*ImportStepMeta, 0, len(metas)) - for _, bs := range metas { - var subtaskMeta ImportStepMeta - if err := json.Unmarshal(bs, &subtaskMeta); err != nil { - return errors.Trace(err) - } - subtaskMetas = append(subtaskMetas, &subtaskMeta) - } - columnSizeMap := make(map[int64]int64) - for _, subtaskMeta := range subtaskMetas { - taskMeta.Result.LoadedRowCnt += subtaskMeta.Result.LoadedRowCnt - for key, val := range subtaskMeta.Result.ColSizeMap { - columnSizeMap[key] += val - } - } - taskMeta.Result.ColSizeMap = columnSizeMap - - if globalSort { - taskMeta.Result.LoadedRowCnt, err = getLoadedRowCountOnGlobalSort(handle, gTask) - if err != nil { - return err - } - } - - return updateMeta(gTask, taskMeta) -} - -func getLoadedRowCountOnGlobalSort(handle dispatcher.TaskHandle, gTask *proto.Task) (uint64, error) { - metas, err := handle.GetPreviousSubtaskMetas(gTask.ID, StepWriteAndIngest) - if err != nil { - return 0, err - } - - var loadedRowCount uint64 - for _, bs := range metas { - var subtaskMeta WriteIngestStepMeta - if err = json.Unmarshal(bs, &subtaskMeta); err != nil { - return 0, errors.Trace(err) - } - loadedRowCount += subtaskMeta.Result.LoadedRowCnt - } - return loadedRowCount, nil -} - -func startJob(ctx context.Context, logger *zap.Logger, taskHandle dispatcher.TaskHandle, taskMeta *TaskMeta, jobStep string) error { - failpoint.Inject("syncBeforeJobStarted", func() { - TestSyncChan <- struct{}{} - <-TestSyncChan - }) - // retry for 3+6+12+24+(30-4)*30 ~= 825s ~= 14 minutes - // we consider all errors as retryable errors, except context done. - // the errors include errors happened when communicate with PD and TiKV. - // we didn't consider system corrupt cases like system table dropped/altered. - backoffer := backoff.NewExponential(dispatcher.RetrySQLInterval, 2, dispatcher.RetrySQLMaxInterval) - err := handle.RunWithRetry(ctx, dispatcher.RetrySQLTimes, backoffer, logger, - func(ctx context.Context) (bool, error) { - return true, taskHandle.WithNewSession(func(se sessionctx.Context) error { - exec := se.(sqlexec.SQLExecutor) - return importer.StartJob(ctx, exec, taskMeta.JobID, jobStep) - }) - }, - ) - failpoint.Inject("syncAfterJobStarted", func() { - TestSyncChan <- struct{}{} - }) - return err -} - -func job2Step(ctx context.Context, logger *zap.Logger, taskMeta *TaskMeta, step string) error { - globalTaskManager, err := storage.GetTaskManager() - if err != nil { - return err - } - // todo: use dispatcher.TaskHandle - // we might call this in scheduler later, there's no dispatcher.TaskHandle, so we use globalTaskManager here. - // retry for 3+6+12+24+(30-4)*30 ~= 825s ~= 14 minutes - backoffer := backoff.NewExponential(dispatcher.RetrySQLInterval, 2, dispatcher.RetrySQLMaxInterval) - return handle.RunWithRetry(ctx, dispatcher.RetrySQLTimes, backoffer, logger, - func(ctx context.Context) (bool, error) { - return true, globalTaskManager.WithNewSession(func(se sessionctx.Context) error { - exec := se.(sqlexec.SQLExecutor) - return importer.Job2Step(ctx, exec, taskMeta.JobID, step) - }) - }, - ) -} - -func (dsp *ImportDispatcherExt) finishJob(ctx context.Context, logger *zap.Logger, - taskHandle dispatcher.TaskHandle, gTask *proto.Task, taskMeta *TaskMeta) error { - dsp.unregisterTask(ctx, gTask) - summary := &importer.JobSummary{ImportedRows: taskMeta.Result.LoadedRowCnt} - // retry for 3+6+12+24+(30-4)*30 ~= 825s ~= 14 minutes - backoffer := backoff.NewExponential(dispatcher.RetrySQLInterval, 2, dispatcher.RetrySQLMaxInterval) - return handle.RunWithRetry(ctx, dispatcher.RetrySQLTimes, backoffer, logger, - func(ctx context.Context) (bool, error) { - return true, taskHandle.WithNewSession(func(se sessionctx.Context) error { - exec := se.(sqlexec.SQLExecutor) - return importer.FinishJob(ctx, exec, taskMeta.JobID, summary) - }) - }, - ) -} - -func (dsp *ImportDispatcherExt) failJob(ctx context.Context, taskHandle dispatcher.TaskHandle, gTask *proto.Task, - taskMeta *TaskMeta, logger *zap.Logger, errorMsg string) error { - dsp.switchTiKV2NormalMode(ctx, gTask, logger) - dsp.unregisterTask(ctx, gTask) - // retry for 3+6+12+24+(30-4)*30 ~= 825s ~= 14 minutes - backoffer := backoff.NewExponential(dispatcher.RetrySQLInterval, 2, dispatcher.RetrySQLMaxInterval) - return handle.RunWithRetry(ctx, dispatcher.RetrySQLTimes, backoffer, logger, - func(ctx context.Context) (bool, error) { - return true, taskHandle.WithNewSession(func(se sessionctx.Context) error { - exec := se.(sqlexec.SQLExecutor) - return importer.FailJob(ctx, exec, taskMeta.JobID, errorMsg) - }) - }, - ) -} - -func redactSensitiveInfo(gTask *proto.Task, taskMeta *TaskMeta) { - taskMeta.Stmt = "" - taskMeta.Plan.Path = ast.RedactURL(taskMeta.Plan.Path) - if taskMeta.Plan.CloudStorageURI != "" { - taskMeta.Plan.CloudStorageURI = ast.RedactURL(taskMeta.Plan.CloudStorageURI) - } - if err := updateMeta(gTask, taskMeta); err != nil { - // marshal failed, should not happen - logutil.BgLogger().Warn("failed to update task meta", zap.Error(err)) - } -} - -// isResumableErr checks whether it's possible to rely on checkpoint to re-import data after the error has been fixed. -func isResumableErr(string) bool { - // TODO: add more cases - return false -} - -func rollback(ctx context.Context, handle dispatcher.TaskHandle, gTask *proto.Task, logger *zap.Logger) (err error) { - taskMeta := &TaskMeta{} - err = json.Unmarshal(gTask.Meta, taskMeta) - if err != nil { - return errors.Trace(err) - } - - logger.Info("rollback") - - // // TODO: create table indexes depends on the option. - // // create table indexes even if the rollback is failed. - // defer func() { - // err2 := createTableIndexes(ctx, handle, taskMeta, logger) - // err = multierr.Append(err, err2) - // }() - - tableName := common.UniqueTable(taskMeta.Plan.DBName, taskMeta.Plan.TableInfo.Name.L) - // truncate the table - return executeSQL(ctx, handle, logger, "TRUNCATE "+tableName) -} - -func stepStr(step proto.Step) string { - switch step { - case proto.StepInit: - return "init" - case StepImport: - return "import" - case StepPostProcess: - return "post-process" - case StepEncodeAndSort: - return "encode&sort" - case StepMergeSort: - return "merge-sort" - case StepWriteAndIngest: - return "write&ingest" - case proto.StepDone: - return "done" - default: - return "unknown" - } -} - -func init() { - dispatcher.RegisterDispatcherFactory(proto.ImportInto, newImportDispatcher) -} diff --git a/pkg/disttask/importinto/encode_and_sort_operator.go b/pkg/disttask/importinto/encode_and_sort_operator.go index 651dfd0ac04a6..8bf03e911afa5 100644 --- a/pkg/disttask/importinto/encode_and_sort_operator.go +++ b/pkg/disttask/importinto/encode_and_sort_operator.go @@ -89,7 +89,7 @@ func newEncodeAndSortOperator(ctx context.Context, executor *importStepExecutor, pool := workerpool.NewWorkerPool( "encodeAndSortOperator", util.ImportInto, - int(executor.taskMeta.Plan.ThreadCnt), + executor.taskMeta.Plan.ThreadCnt, func() workerpool.Worker[*importStepMinimalTask, workerpool.None] { return newChunkWorker(ctx, op, indexMemorySizeLimit) }, diff --git a/pkg/disttask/importinto/job.go b/pkg/disttask/importinto/job.go index e0253a0a8778e..82f9b46f175c0 100644 --- a/pkg/disttask/importinto/job.go +++ b/pkg/disttask/importinto/job.go @@ -109,7 +109,7 @@ func (ti *DistImporter) ImportTask(task *proto.Task) { ti.Group.Go(func() error { defer close(ti.Done) // task is run using distribute framework, so we only wait for the task to finish. - return handle.WaitGlobalTask(ti.GroupCtx, task) + return handle.WaitTaskDoneOrPaused(ti.GroupCtx, task.ID) }) } @@ -138,8 +138,8 @@ func (ti *DistImporter) SubmitTask(ctx context.Context) (int64, *proto.Task, err if ti.instance != nil { instances = append(instances, ti.instance) } - // we use globalTaskManager to submit task, user might not have the privilege to system tables. - globalTaskManager, err := storage.GetTaskManager() + // we use taskManager to submit task, user might not have the privilege to system tables. + taskManager, err := storage.GetTaskManager() ctx = util.WithInternalSourceType(ctx, kv.InternalDistTask) if err != nil { return 0, nil, err @@ -147,7 +147,7 @@ func (ti *DistImporter) SubmitTask(ctx context.Context) (int64, *proto.Task, err var jobID, taskID int64 plan := ti.plan - if err = globalTaskManager.WithNewTxn(ctx, func(se sessionctx.Context) error { + if err = taskManager.WithNewTxn(ctx, func(se sessionctx.Context) error { var err2 error exec := se.(sqlexec.SQLExecutor) // If 2 client try to execute IMPORT INTO concurrently, there's chance that both of them will pass the check. @@ -182,7 +182,7 @@ func (ti *DistImporter) SubmitTask(ctx context.Context) (int64, *proto.Task, err SessionCtx: se, TaskKey: TaskKey(jobID), TaskType: proto.ImportInto, - ThreadCnt: int(plan.ThreadCnt), + ThreadCnt: plan.ThreadCnt, } p := planner.NewPlanner() taskID, err2 = p.Run(planCtx, logicalPlan) @@ -193,24 +193,22 @@ func (ti *DistImporter) SubmitTask(ctx context.Context) (int64, *proto.Task, err }); err != nil { return 0, nil, err } - globalTask, err := globalTaskManager.GetGlobalTaskByID(ctx, taskID) + handle.NotifyTaskChange() + task, err := taskManager.GetTaskByID(ctx, taskID) if err != nil { return 0, nil, err } - if globalTask == nil { - return 0, nil, errors.Errorf("cannot find global task with ID %d", taskID) - } - metrics.UpdateMetricsForAddTask(globalTask) + metrics.UpdateMetricsForAddTask(task) // update logger with task id. ti.jobID = jobID ti.taskID = taskID - ti.logger = ti.logger.With(zap.Int64("task-id", globalTask.ID)) + ti.logger = ti.logger.With(zap.Int64("task-id", task.ID)) - ti.logger.Info("job submitted to global task queue", - zap.Int64("job-id", jobID), zap.Int64("thread-cnt", plan.ThreadCnt)) + ti.logger.Info("job submitted to task queue", + zap.Int64("job-id", jobID), zap.Int("thread-cnt", plan.ThreadCnt)) - return jobID, globalTask, nil + return jobID, task, nil } func (*DistImporter) taskKey() string { @@ -224,21 +222,18 @@ func (ti *DistImporter) JobID() int64 { } func getTaskMeta(ctx context.Context, jobID int64) (*TaskMeta, error) { - globalTaskManager, err := storage.GetTaskManager() + taskManager, err := storage.GetTaskManager() ctx = util.WithInternalSourceType(ctx, kv.InternalDistTask) if err != nil { return nil, err } taskKey := TaskKey(jobID) - globalTask, err := globalTaskManager.GetGlobalTaskByKey(ctx, taskKey) + task, err := taskManager.GetTaskByKey(ctx, taskKey) if err != nil { return nil, err } - if globalTask == nil { - return nil, errors.Errorf("cannot find global task with key %s", taskKey) - } var taskMeta TaskMeta - if err := json.Unmarshal(globalTask.Meta, &taskMeta); err != nil { + if err := json.Unmarshal(task.Meta, &taskMeta); err != nil { return nil, errors.Trace(err) } return &taskMeta, nil @@ -247,26 +242,23 @@ func getTaskMeta(ctx context.Context, jobID int64) (*TaskMeta, error) { // GetTaskImportedRows gets the number of imported rows of a job. // Note: for finished job, we can get the number of imported rows from task meta. func GetTaskImportedRows(ctx context.Context, jobID int64) (uint64, error) { - globalTaskManager, err := storage.GetTaskManager() + taskManager, err := storage.GetTaskManager() ctx = util.WithInternalSourceType(ctx, kv.InternalDistTask) if err != nil { return 0, err } taskKey := TaskKey(jobID) - task, err := globalTaskManager.GetGlobalTaskByKey(ctx, taskKey) + task, err := taskManager.GetTaskByKeyWithHistory(ctx, taskKey) if err != nil { return 0, err } - if task == nil { - return 0, errors.Errorf("cannot find global task with key %s", taskKey) - } taskMeta := TaskMeta{} if err = json.Unmarshal(task.Meta, &taskMeta); err != nil { return 0, errors.Trace(err) } var importedRows uint64 if taskMeta.Plan.CloudStorageURI == "" { - subtasks, err := globalTaskManager.GetSubtasksForImportInto(ctx, task.ID, StepImport) + subtasks, err := taskManager.GetSubtasksWithHistory(ctx, task.ID, StepImport) if err != nil { return 0, err } @@ -278,7 +270,7 @@ func GetTaskImportedRows(ctx context.Context, jobID int64) (uint64, error) { importedRows += subtaskMeta.Result.LoadedRowCnt } } else { - subtasks, err := globalTaskManager.GetSubtasksForImportInto(ctx, task.ID, StepWriteAndIngest) + subtasks, err := taskManager.GetSubtasksWithHistory(ctx, task.ID, StepWriteAndIngest) if err != nil { return 0, err } diff --git a/pkg/disttask/importinto/job_testkit_test.go b/pkg/disttask/importinto/job_testkit_test.go index f9583b72e5989..3267bc8711a12 100644 --- a/pkg/disttask/importinto/job_testkit_test.go +++ b/pkg/disttask/importinto/job_testkit_test.go @@ -23,6 +23,7 @@ import ( "github.com/ngaut/pools" "github.com/pingcap/tidb/pkg/disttask/framework/proto" "github.com/pingcap/tidb/pkg/disttask/framework/storage" + "github.com/pingcap/tidb/pkg/disttask/framework/testutil" "github.com/pingcap/tidb/pkg/disttask/importinto" "github.com/pingcap/tidb/pkg/executor/importer" "github.com/pingcap/tidb/pkg/kv" @@ -52,7 +53,7 @@ func TestGetTaskImportedRows(t *testing.T) { } bytes, err := json.Marshal(taskMeta) require.NoError(t, err) - taskID, err := manager.AddNewGlobalTask(ctx, importinto.TaskKey(111), proto.ImportInto, 1, bytes) + taskID, err := manager.CreateTask(ctx, importinto.TaskKey(111), proto.ImportInto, 1, bytes) require.NoError(t, err) importStepMetas := []*importinto.ImportStepMeta{ { @@ -69,8 +70,8 @@ func TestGetTaskImportedRows(t *testing.T) { for _, m := range importStepMetas { bytes, err := json.Marshal(m) require.NoError(t, err) - require.NoError(t, manager.AddNewSubTask(ctx, taskID, importinto.StepImport, - "", bytes, proto.ImportInto, false)) + testutil.CreateSubTask(t, manager, taskID, importinto.StepImport, + "", bytes, proto.ImportInto, 11, false) } rows, err := importinto.GetTaskImportedRows(ctx, 111) require.NoError(t, err) @@ -84,7 +85,7 @@ func TestGetTaskImportedRows(t *testing.T) { } bytes, err = json.Marshal(taskMeta) require.NoError(t, err) - taskID, err = manager.AddNewGlobalTask(ctx, importinto.TaskKey(222), proto.ImportInto, 1, bytes) + taskID, err = manager.CreateTask(ctx, importinto.TaskKey(222), proto.ImportInto, 1, bytes) require.NoError(t, err) ingestStepMetas := []*importinto.WriteIngestStepMeta{ { @@ -101,8 +102,8 @@ func TestGetTaskImportedRows(t *testing.T) { for _, m := range ingestStepMetas { bytes, err := json.Marshal(m) require.NoError(t, err) - require.NoError(t, manager.AddNewSubTask(ctx, taskID, importinto.StepWriteAndIngest, - "", bytes, proto.ImportInto, false)) + testutil.CreateSubTask(t, manager, taskID, importinto.StepWriteAndIngest, + "", bytes, proto.ImportInto, 11, false) } rows, err = importinto.GetTaskImportedRows(ctx, 222) require.NoError(t, err) diff --git a/pkg/disttask/importinto/metrics.go b/pkg/disttask/importinto/metrics.go index 0d583d9e6ebe9..9c74a0e54de39 100644 --- a/pkg/disttask/importinto/metrics.go +++ b/pkg/disttask/importinto/metrics.go @@ -33,7 +33,7 @@ type taskMetrics struct { // taskMetricManager manages the metrics of IMPORT INTO tasks. // we have a set of metrics for each task, with different task_id const label. // metrics is passed by context value to avoid passing parameters everywhere. -// both dispatcher and scheduler might use it, to avoid registered again, +// both scheduler and taskExecutor might use it, to avoid registered again, // we add a manager to manage lifecycle of metrics for tasks. type taskMetricManager struct { sync.RWMutex diff --git a/pkg/disttask/importinto/mock/import_mock.go b/pkg/disttask/importinto/mock/import_mock.go index bf82a01bb63c3..2aa27848b5bb5 100644 --- a/pkg/disttask/importinto/mock/import_mock.go +++ b/pkg/disttask/importinto/mock/import_mock.go @@ -1,6 +1,10 @@ // Code generated by MockGen. DO NOT EDIT. // Source: github.com/pingcap/tidb/pkg/disttask/importinto (interfaces: MiniTaskExecutor) - +// +// Generated by this command: +// +// mockgen -package mock github.com/pingcap/tidb/pkg/disttask/importinto MiniTaskExecutor +// // Package mock is a generated GoMock package. package mock @@ -44,7 +48,7 @@ func (m *MockMiniTaskExecutor) Run(arg0 context.Context, arg1, arg2 backend.Engi } // Run indicates an expected call of Run. -func (mr *MockMiniTaskExecutorMockRecorder) Run(arg0, arg1, arg2 interface{}) *gomock.Call { +func (mr *MockMiniTaskExecutorMockRecorder) Run(arg0, arg1, arg2 any) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Run", reflect.TypeOf((*MockMiniTaskExecutor)(nil).Run), arg0, arg1, arg2) } diff --git a/pkg/disttask/importinto/planner.go b/pkg/disttask/importinto/planner.go index 53ffe2e8c3665..d976b07fabcd0 100644 --- a/pkg/disttask/importinto/planner.go +++ b/pkg/disttask/importinto/planner.go @@ -503,8 +503,7 @@ func getRangeSplitter(ctx context.Context, store storage.ExternalStorage, kvMeta return external.NewRangeSplitter( ctx, - kvMeta.GetDataFiles(), - kvMeta.GetStatFiles(), + kvMeta.MultipleFilesStats, store, int64(config.DefaultBatchSize), int64(math.MaxInt64), diff --git a/pkg/disttask/importinto/proto.go b/pkg/disttask/importinto/proto.go index ba5c13439cef0..dcd9d9ba48f16 100644 --- a/pkg/disttask/importinto/proto.go +++ b/pkg/disttask/importinto/proto.go @@ -24,7 +24,6 @@ import ( "github.com/pingcap/tidb/br/pkg/lightning/verification" "github.com/pingcap/tidb/pkg/disttask/framework/proto" "github.com/pingcap/tidb/pkg/domain/infosync" - "github.com/pingcap/tidb/pkg/executor/asyncloaddata" "github.com/pingcap/tidb/pkg/executor/importer" "github.com/pingcap/tidb/pkg/meta/autoid" ) @@ -65,14 +64,14 @@ type TaskMeta struct { // running on the instance that initiate the IMPORT INTO. EligibleInstances []*infosync.ServerInfo // the file chunks to import, when import from server file, we need to pass those - // files to the framework dispatcher which might run on another instance. + // files to the framework scheduler which might run on another instance. // we use a map from engine ID to chunks since we need support split_file for CSV, - // so need to split them into engines before passing to dispatcher. + // so need to split them into engines before passing to scheduler. ChunkMap map[int32][]Chunk } // ImportStepMeta is the meta of import step. -// Dispatcher will split the task into subtasks(FileInfos -> Chunks) +// Scheduler will split the task into subtasks(FileInfos -> Chunks) // All the field should be serializable. type ImportStepMeta struct { // this is the engine ID, not the id in tidb_background_subtask table. @@ -132,7 +131,7 @@ type SharedVars struct { TableImporter *importer.TableImporter DataEngine *backend.OpenedEngine IndexEngine *backend.OpenedEngine - Progress *asyncloaddata.Progress + Progress *importer.Progress mu sync.Mutex Checksum *verification.KVChecksum @@ -162,16 +161,13 @@ func (sv *SharedVars) mergeIndexSummary(indexID int64, summary *external.WriterS } // importStepMinimalTask is the minimal task of IMPORT INTO. -// Scheduler will split the subtask into minimal tasks(Chunks -> Chunk) +// TaskExecutor will split the subtask into minimal tasks(Chunks -> Chunk) type importStepMinimalTask struct { Plan importer.Plan Chunk Chunk SharedVars *SharedVars } -// IsMinimalTask implements the MinimalTask interface. -func (*importStepMinimalTask) IsMinimalTask() {} - func (t *importStepMinimalTask) String() string { return fmt.Sprintf("chunk:%s:%d", t.Chunk.Path, t.Chunk.Offset) } diff --git a/pkg/disttask/importinto/scheduler.go b/pkg/disttask/importinto/scheduler.go index 2afa6ea412960..5f91eaeb8f940 100644 --- a/pkg/disttask/importinto/scheduler.go +++ b/pkg/disttask/importinto/scheduler.go @@ -17,498 +17,699 @@ package importinto import ( "context" "encoding/json" + "strconv" + "strings" "sync" "time" - "github.com/docker/go-units" + dmysql "github.com/go-sql-driver/mysql" "github.com/pingcap/errors" "github.com/pingcap/failpoint" - "github.com/pingcap/tidb/br/pkg/lightning/backend" - "github.com/pingcap/tidb/br/pkg/lightning/backend/external" - "github.com/pingcap/tidb/br/pkg/lightning/backend/kv" + "github.com/pingcap/tidb/br/pkg/lightning/checkpoints" "github.com/pingcap/tidb/br/pkg/lightning/common" "github.com/pingcap/tidb/br/pkg/lightning/config" - "github.com/pingcap/tidb/br/pkg/lightning/log" "github.com/pingcap/tidb/br/pkg/lightning/metric" - "github.com/pingcap/tidb/br/pkg/lightning/verification" + "github.com/pingcap/tidb/br/pkg/utils" + "github.com/pingcap/tidb/pkg/disttask/framework/handle" + "github.com/pingcap/tidb/pkg/disttask/framework/planner" "github.com/pingcap/tidb/pkg/disttask/framework/proto" "github.com/pingcap/tidb/pkg/disttask/framework/scheduler" - "github.com/pingcap/tidb/pkg/disttask/framework/scheduler/execute" - "github.com/pingcap/tidb/pkg/disttask/operator" - "github.com/pingcap/tidb/pkg/executor/asyncloaddata" + "github.com/pingcap/tidb/pkg/disttask/framework/storage" + "github.com/pingcap/tidb/pkg/errno" "github.com/pingcap/tidb/pkg/executor/importer" - "github.com/pingcap/tidb/pkg/meta/autoid" - "github.com/pingcap/tidb/pkg/table/tables" + "github.com/pingcap/tidb/pkg/parser/ast" + "github.com/pingcap/tidb/pkg/sessionctx" + "github.com/pingcap/tidb/pkg/util/backoff" + disttaskutil "github.com/pingcap/tidb/pkg/util/disttask" + "github.com/pingcap/tidb/pkg/util/etcd" "github.com/pingcap/tidb/pkg/util/logutil" - "github.com/pingcap/tidb/pkg/util/size" + "github.com/pingcap/tidb/pkg/util/sqlexec" + "go.uber.org/atomic" "go.uber.org/zap" - "go.uber.org/zap/zapcore" ) -// importStepExecutor is a executor for import step. -// SubtaskExecutor is equivalent to a Lightning instance. -type importStepExecutor struct { - taskID int64 - taskMeta *TaskMeta - tableImporter *importer.TableImporter - sharedVars sync.Map - logger *zap.Logger +const ( + registerTaskTTL = 10 * time.Minute + refreshTaskTTLInterval = 3 * time.Minute + registerTimeout = 5 * time.Second +) + +// NewTaskRegisterWithTTL is the ctor for TaskRegister. +// It is exported for testing. +var NewTaskRegisterWithTTL = utils.NewTaskRegisterWithTTL - indexMemorySizeLimit uint64 +type taskInfo struct { + taskID int64 - importCtx context.Context - importCancel context.CancelFunc - wg sync.WaitGroup + // operation on taskInfo is run inside detect-task goroutine, so no need to synchronize. + lastRegisterTime time.Time + + // initialized lazily in register() + etcdClient *etcd.Client + taskRegister utils.TaskRegister } -func getTableImporter(ctx context.Context, taskID int64, taskMeta *TaskMeta) (*importer.TableImporter, error) { - idAlloc := kv.NewPanickingAllocators(0) - tbl, err := tables.TableFromMeta(idAlloc, taskMeta.Plan.TableInfo) - if err != nil { - return nil, err +func (t *taskInfo) register(ctx context.Context) { + if time.Since(t.lastRegisterTime) < refreshTaskTTLInterval { + return } - astArgs, err := importer.ASTArgsFromStmt(taskMeta.Stmt) - if err != nil { - return nil, err + + if time.Since(t.lastRegisterTime) < refreshTaskTTLInterval { + return } - controller, err := importer.NewLoadDataController(&taskMeta.Plan, tbl, astArgs) - if err != nil { - return nil, err + logger := logutil.BgLogger().With(zap.Int64("task-id", t.taskID)) + if t.taskRegister == nil { + client, err := importer.GetEtcdClient() + if err != nil { + logger.Warn("get etcd client failed", zap.Error(err)) + return + } + t.etcdClient = client + t.taskRegister = NewTaskRegisterWithTTL(client.GetClient(), registerTaskTTL, + utils.RegisterImportInto, strconv.FormatInt(t.taskID, 10)) + } + timeoutCtx, cancel := context.WithTimeout(ctx, registerTimeout) + defer cancel() + if err := t.taskRegister.RegisterTaskOnce(timeoutCtx); err != nil { + logger.Warn("register task failed", zap.Error(err)) + } else { + logger.Info("register task to pd or refresh lease success") + } + // we set it even if register failed, TTL is 10min, refresh interval is 3min, + // we can try 2 times before the lease is expired. + t.lastRegisterTime = time.Now() +} + +func (t *taskInfo) close(ctx context.Context) { + logger := logutil.BgLogger().With(zap.Int64("task-id", t.taskID)) + if t.taskRegister != nil { + timeoutCtx, cancel := context.WithTimeout(ctx, registerTimeout) + defer cancel() + if err := t.taskRegister.Close(timeoutCtx); err != nil { + logger.Warn("unregister task failed", zap.Error(err)) + } else { + logger.Info("unregister task success") + } + t.taskRegister = nil } - if err = controller.InitDataStore(ctx); err != nil { - return nil, err + if t.etcdClient != nil { + if err := t.etcdClient.Close(); err != nil { + logger.Warn("close etcd client failed", zap.Error(err)) + } + t.etcdClient = nil } +} - return importer.NewTableImporter(&importer.JobImportParam{ - GroupCtx: ctx, - Progress: asyncloaddata.NewProgress(false), - Job: &asyncloaddata.Job{}, - }, controller, taskID) +// ImportSchedulerExt is an extension of ImportScheduler, exported for test. +type ImportSchedulerExt struct { + GlobalSort bool + mu sync.RWMutex + // NOTE: there's no need to sync for below 2 fields actually, since we add a restriction that only one + // task can be running at a time. but we might support task queuing in the future, leave it for now. + // the last time we switch TiKV into IMPORT mode, this is a global operation, do it for one task makes + // no difference to do it for all tasks. So we do not need to record the switch time for each task. + lastSwitchTime atomic.Time + // taskInfoMap is a map from taskID to taskInfo + taskInfoMap sync.Map + + // currTaskID is the taskID of the current running task. + // It may be changed when we switch to a new task or switch to a new owner. + currTaskID atomic.Int64 + disableTiKVImportMode atomic.Bool } -func (s *importStepExecutor) Init(ctx context.Context) error { - s.logger.Info("init subtask env") - tableImporter, err := getTableImporter(ctx, s.taskID, s.taskMeta) - if err != nil { - return err +var _ scheduler.Extension = (*ImportSchedulerExt)(nil) + +// OnTick implements scheduler.Extension interface. +func (sch *ImportSchedulerExt) OnTick(ctx context.Context, task *proto.Task) { + // only switch TiKV mode or register task when task is running + if task.State != proto.TaskStateRunning { + return } - s.tableImporter = tableImporter - - // we need this sub context since Cleanup which wait on this routine is called - // before parent context is canceled in normal flow. - s.importCtx, s.importCancel = context.WithCancel(ctx) - // only need to check disk quota when we are using local sort. - if s.tableImporter.IsLocalSort() { - s.wg.Add(1) - go func() { - defer s.wg.Done() - s.tableImporter.CheckDiskQuota(s.importCtx) - }() - } - s.indexMemorySizeLimit = getWriterMemorySizeLimit(s.tableImporter.Plan) - s.logger.Info("index writer memory size limit", - zap.String("limit", units.BytesSize(float64(s.indexMemorySizeLimit)))) - return nil + sch.switchTiKVMode(ctx, task) + sch.registerTask(ctx, task) } -func (s *importStepExecutor) RunSubtask(ctx context.Context, subtask *proto.Subtask) (err error) { - logger := s.logger.With(zap.Int64("subtask-id", subtask.ID)) - task := log.BeginTask(logger, "run subtask") - defer func() { - task.End(zapcore.ErrorLevel, err) - }() - bs := subtask.Meta - var subtaskMeta ImportStepMeta - err = json.Unmarshal(bs, &subtaskMeta) - if err != nil { - return errors.Trace(err) +func (*ImportSchedulerExt) isImporting2TiKV(task *proto.Task) bool { + return task.Step == StepImport || task.Step == StepWriteAndIngest +} + +func (sch *ImportSchedulerExt) switchTiKVMode(ctx context.Context, task *proto.Task) { + sch.updateCurrentTask(task) + // only import step need to switch to IMPORT mode, + // If TiKV is in IMPORT mode during checksum, coprocessor will time out. + if sch.disableTiKVImportMode.Load() || !sch.isImporting2TiKV(task) { + return } - var dataEngine, indexEngine *backend.OpenedEngine - if s.tableImporter.IsLocalSort() { - dataEngine, err = s.tableImporter.OpenDataEngine(ctx, subtaskMeta.ID) - if err != nil { - return err - } - // Unlike in Lightning, we start an index engine for each subtask, - // whereas previously there was only a single index engine globally. - // This is because the scheduler currently does not have a post-processing mechanism. - // If we import the index in `cleanupSubtaskEnv`, the dispatcher will not wait for the import to complete. - // Multiple index engines may suffer performance degradation due to range overlap. - // These issues will be alleviated after we integrate s3 sorter. - // engineID = -1, -2, -3, ... - indexEngine, err = s.tableImporter.OpenIndexEngine(ctx, common.IndexEngineID-subtaskMeta.ID) - if err != nil { - return err - } + if time.Since(sch.lastSwitchTime.Load()) < config.DefaultSwitchTiKVModeInterval { + return } - sharedVars := &SharedVars{ - TableImporter: s.tableImporter, - DataEngine: dataEngine, - IndexEngine: indexEngine, - Progress: asyncloaddata.NewProgress(false), - Checksum: &verification.KVChecksum{}, - SortedDataMeta: &external.SortedKVMeta{}, - SortedIndexMetas: make(map[int64]*external.SortedKVMeta), - } - s.sharedVars.Store(subtaskMeta.ID, sharedVars) - - source := operator.NewSimpleDataChannel(make(chan *importStepMinimalTask)) - op := newEncodeAndSortOperator(ctx, s, sharedVars, subtask.ID, s.indexMemorySizeLimit) - op.SetSource(source) - pipeline := operator.NewAsyncPipeline(op) - if err = pipeline.Execute(); err != nil { - return err + + sch.mu.Lock() + defer sch.mu.Unlock() + if time.Since(sch.lastSwitchTime.Load()) < config.DefaultSwitchTiKVModeInterval { + return } -outer: - for _, chunk := range subtaskMeta.Chunks { - // TODO: current workpool impl doesn't drain the input channel, it will - // just return on context cancel(error happened), so we add this select. - select { - case source.Channel() <- &importStepMinimalTask{ - Plan: s.taskMeta.Plan, - Chunk: chunk, - SharedVars: sharedVars, - }: - case <-op.Done(): - break outer - } + logger := logutil.BgLogger().With(zap.Int64("task-id", task.ID)) + pdCli, switcher, err := importer.GetTiKVModeSwitcherWithPDClient(logger) + if err != nil { + logger.Warn("get tikv mode switcher failed", zap.Error(err)) + return } - source.Finish() + switcher.ToImportMode(ctx) + pdCli.Close() + sch.lastSwitchTime.Store(time.Now()) +} - return pipeline.Close() +func (sch *ImportSchedulerExt) registerTask(ctx context.Context, task *proto.Task) { + val, _ := sch.taskInfoMap.LoadOrStore(task.ID, &taskInfo{taskID: task.ID}) + info := val.(*taskInfo) + info.register(ctx) } -func (s *importStepExecutor) OnFinished(ctx context.Context, subtask *proto.Subtask) error { - var subtaskMeta ImportStepMeta - if err := json.Unmarshal(subtask.Meta, &subtaskMeta); err != nil { - return errors.Trace(err) +func (sch *ImportSchedulerExt) unregisterTask(ctx context.Context, task *proto.Task) { + if val, loaded := sch.taskInfoMap.LoadAndDelete(task.ID); loaded { + info := val.(*taskInfo) + info.close(ctx) } - s.logger.Info("on subtask finished", zap.Int32("engine-id", subtaskMeta.ID)) +} - val, ok := s.sharedVars.Load(subtaskMeta.ID) - if !ok { - return errors.Errorf("sharedVars %d not found", subtaskMeta.ID) - } - sharedVars, ok := val.(*SharedVars) - if !ok { - return errors.Errorf("sharedVars %d not found", subtaskMeta.ID) +// OnNextSubtasksBatch generate batch of next stage's plan. +func (sch *ImportSchedulerExt) OnNextSubtasksBatch( + ctx context.Context, + taskHandle storage.TaskHandle, + task *proto.Task, + execIDs []string, + nextStep proto.Step, +) ( + resSubtaskMeta [][]byte, err error) { + logger := logutil.BgLogger().With( + zap.Stringer("type", task.Type), + zap.Int64("task-id", task.ID), + zap.String("curr-step", stepStr(task.Step)), + zap.String("next-step", stepStr(nextStep)), + ) + taskMeta := &TaskMeta{} + err = json.Unmarshal(task.Meta, taskMeta) + if err != nil { + return nil, errors.Trace(err) } + logger.Info("on next subtasks batch") - var dataKVCount int64 - if s.tableImporter.IsLocalSort() { - // TODO: we should close and cleanup engine in all case, since there's no checkpoint. - s.logger.Info("import data engine", zap.Int32("engine-id", subtaskMeta.ID)) - closedDataEngine, err := sharedVars.DataEngine.Close(ctx) + previousSubtaskMetas := make(map[proto.Step][][]byte, 1) + switch nextStep { + case StepImport, StepEncodeAndSort: + if metrics, ok := metric.GetCommonMetric(ctx); ok { + metrics.BytesCounter.WithLabelValues(metric.StateTotalRestore).Add(float64(taskMeta.Plan.TotalFileSize)) + } + jobStep := importer.JobStepImporting + if sch.GlobalSort { + jobStep = importer.JobStepGlobalSorting + } + if err = startJob(ctx, logger, taskHandle, taskMeta, jobStep); err != nil { + return nil, err + } + case StepMergeSort: + sortAndEncodeMeta, err := taskHandle.GetPreviousSubtaskMetas(task.ID, StepEncodeAndSort) if err != nil { - return err + return nil, err } - dataKVCount, err = s.tableImporter.ImportAndCleanup(ctx, closedDataEngine) + previousSubtaskMetas[StepEncodeAndSort] = sortAndEncodeMeta + case StepWriteAndIngest: + failpoint.Inject("failWhenDispatchWriteIngestSubtask", func() { + failpoint.Return(nil, errors.New("injected error")) + }) + // merge sort might be skipped for some kv groups, so we need to get all + // subtask metas of StepEncodeAndSort step too. + encodeAndSortMetas, err := taskHandle.GetPreviousSubtaskMetas(task.ID, StepEncodeAndSort) if err != nil { - return err + return nil, err } - - s.logger.Info("import index engine", zap.Int32("engine-id", subtaskMeta.ID)) - if closedEngine, err := sharedVars.IndexEngine.Close(ctx); err != nil { - return err - } else if _, err := s.tableImporter.ImportAndCleanup(ctx, closedEngine); err != nil { - return err + mergeSortMetas, err := taskHandle.GetPreviousSubtaskMetas(task.ID, StepMergeSort) + if err != nil { + return nil, err + } + previousSubtaskMetas[StepEncodeAndSort] = encodeAndSortMetas + previousSubtaskMetas[StepMergeSort] = mergeSortMetas + if err = job2Step(ctx, logger, taskMeta, importer.JobStepImporting); err != nil { + return nil, err + } + case StepPostProcess: + sch.switchTiKV2NormalMode(ctx, task, logger) + failpoint.Inject("clearLastSwitchTime", func() { + sch.lastSwitchTime.Store(time.Time{}) + }) + if err = job2Step(ctx, logger, taskMeta, importer.JobStepValidating); err != nil { + return nil, err + } + failpoint.Inject("failWhenDispatchPostProcessSubtask", func() { + failpoint.Return(nil, errors.New("injected error after StepImport")) + }) + // we need get metas where checksum is stored. + if err := updateResult(taskHandle, task, taskMeta, sch.GlobalSort); err != nil { + return nil, err + } + step := getStepOfEncode(sch.GlobalSort) + metas, err := taskHandle.GetPreviousSubtaskMetas(task.ID, step) + if err != nil { + return nil, err } + previousSubtaskMetas[step] = metas + logger.Info("move to post-process step ", zap.Any("result", taskMeta.Result)) + case proto.StepDone: + return nil, nil + default: + return nil, errors.Errorf("unknown step %d", task.Step) + } + + planCtx := planner.PlanCtx{ + Ctx: ctx, + TaskID: task.ID, + PreviousSubtaskMetas: previousSubtaskMetas, + GlobalSort: sch.GlobalSort, + NextTaskStep: nextStep, + ExecuteNodesCnt: len(execIDs), } - // there's no imported dataKVCount on this stage when using global sort. - - sharedVars.mu.Lock() - defer sharedVars.mu.Unlock() - subtaskMeta.Checksum.Sum = sharedVars.Checksum.Sum() - subtaskMeta.Checksum.KVs = sharedVars.Checksum.SumKVS() - subtaskMeta.Checksum.Size = sharedVars.Checksum.SumSize() - subtaskMeta.Result = Result{ - LoadedRowCnt: uint64(dataKVCount), - ColSizeMap: sharedVars.Progress.GetColSize(), - } - allocators := sharedVars.TableImporter.Allocators() - subtaskMeta.MaxIDs = map[autoid.AllocatorType]int64{ - autoid.RowIDAllocType: allocators.Get(autoid.RowIDAllocType).Base(), - autoid.AutoIncrementType: allocators.Get(autoid.AutoIncrementType).Base(), - autoid.AutoRandomType: allocators.Get(autoid.AutoRandomType).Base(), - } - subtaskMeta.SortedDataMeta = sharedVars.SortedDataMeta - subtaskMeta.SortedIndexMetas = sharedVars.SortedIndexMetas - s.sharedVars.Delete(subtaskMeta.ID) - newMeta, err := json.Marshal(subtaskMeta) + logicalPlan := &LogicalPlan{} + if err := logicalPlan.FromTaskMeta(task.Meta); err != nil { + return nil, err + } + physicalPlan, err := logicalPlan.ToPhysicalPlan(planCtx) + if err != nil { + return nil, err + } + metaBytes, err := physicalPlan.ToSubtaskMetas(planCtx, nextStep) + if err != nil { + return nil, err + } + logger.Info("generate subtasks", zap.Int("subtask-count", len(metaBytes))) + return metaBytes, nil +} + +// OnDone implements scheduler.Extension interface. +func (sch *ImportSchedulerExt) OnDone(ctx context.Context, handle storage.TaskHandle, task *proto.Task) error { + logger := logutil.BgLogger().With( + zap.Stringer("type", task.Type), + zap.Int64("task-id", task.ID), + zap.String("step", stepStr(task.Step)), + ) + logger.Info("task done", zap.Stringer("state", task.State), zap.Error(task.Error)) + taskMeta := &TaskMeta{} + err := json.Unmarshal(task.Meta, taskMeta) if err != nil { return errors.Trace(err) } - subtask.Meta = newMeta - return nil + if task.Error == nil { + return sch.finishJob(ctx, logger, handle, task, taskMeta) + } + if scheduler.IsCancelledErr(task.Error) { + return sch.cancelJob(ctx, handle, task, taskMeta, logger) + } + return sch.failJob(ctx, handle, task, taskMeta, logger, task.Error.Error()) } -func (s *importStepExecutor) Cleanup(_ context.Context) (err error) { - s.logger.Info("cleanup subtask env") - s.importCancel() - s.wg.Wait() - return s.tableImporter.Close() +// GetEligibleInstances implements scheduler.Extension interface. +func (*ImportSchedulerExt) GetEligibleInstances(_ context.Context, task *proto.Task) ([]string, error) { + taskMeta := &TaskMeta{} + err := json.Unmarshal(task.Meta, taskMeta) + if err != nil { + return nil, errors.Trace(err) + } + res := make([]string, 0, len(taskMeta.EligibleInstances)) + for _, instance := range taskMeta.EligibleInstances { + res = append(res, disttaskutil.GenerateExecID(instance)) + } + return res, nil } -func (s *importStepExecutor) Rollback(context.Context) error { - // TODO: add rollback - s.logger.Info("rollback") - return nil +// IsRetryableErr implements scheduler.Extension interface. +func (*ImportSchedulerExt) IsRetryableErr(error) bool { + // TODO: check whether the error is retryable. + return false } -type mergeSortStepExecutor struct { - scheduler.EmptySubtaskExecutor - taskID int64 - taskMeta *TaskMeta - logger *zap.Logger - controller *importer.LoadDataController - // subtask of a task is run in serial now, so we don't need lock here. - // change to SyncMap when we support parallel subtask in the future. - subtaskSortedKVMeta *external.SortedKVMeta - partSize int64 +// GetNextStep implements scheduler.Extension interface. +func (sch *ImportSchedulerExt) GetNextStep(task *proto.Task) proto.Step { + switch task.Step { + case proto.StepInit: + if sch.GlobalSort { + return StepEncodeAndSort + } + return StepImport + case StepEncodeAndSort: + return StepMergeSort + case StepMergeSort: + return StepWriteAndIngest + case StepImport, StepWriteAndIngest: + return StepPostProcess + default: + // current step must be StepPostProcess + return proto.StepDone + } } -var _ execute.SubtaskExecutor = &mergeSortStepExecutor{} +func (sch *ImportSchedulerExt) switchTiKV2NormalMode(ctx context.Context, task *proto.Task, logger *zap.Logger) { + sch.updateCurrentTask(task) + if sch.disableTiKVImportMode.Load() { + return + } + + sch.mu.Lock() + defer sch.mu.Unlock() -func (m *mergeSortStepExecutor) Init(ctx context.Context) error { - controller, err := buildController(&m.taskMeta.Plan, m.taskMeta.Stmt) + pdCli, switcher, err := importer.GetTiKVModeSwitcherWithPDClient(logger) if err != nil { - return err + logger.Warn("get tikv mode switcher failed", zap.Error(err)) + return } - if err = controller.InitDataStore(ctx); err != nil { - return err + switcher.ToNormalMode(ctx) + pdCli.Close() + + // clear it, so next task can switch TiKV mode again. + sch.lastSwitchTime.Store(time.Time{}) +} + +func (sch *ImportSchedulerExt) updateCurrentTask(task *proto.Task) { + if sch.currTaskID.Swap(task.ID) != task.ID { + taskMeta := &TaskMeta{} + if err := json.Unmarshal(task.Meta, taskMeta); err == nil { + // for raftkv2, switch mode in local backend + sch.disableTiKVImportMode.Store(taskMeta.Plan.DisableTiKVImportMode || taskMeta.Plan.IsRaftKV2) + } } - m.controller = controller - // 10000 = max part num - m.partSize = int64(getWriterMemorySizeLimit(&m.taskMeta.Plan) / 10000 * uint64(external.MergeSortOverlapThreshold)) - return nil } -func (m *mergeSortStepExecutor) RunSubtask(ctx context.Context, subtask *proto.Subtask) (err error) { - logger := m.logger.With(zap.Int64("subtask-id", subtask.ID)) - task := log.BeginTask(logger, "run subtask") - defer func() { - task.End(zapcore.ErrorLevel, err) - }() +type importScheduler struct { + *scheduler.BaseScheduler +} - sm := &MergeSortStepMeta{} - err = json.Unmarshal(subtask.Meta, sm) - if err != nil { - return errors.Trace(err) +func newImportScheduler(ctx context.Context, task *proto.Task, param scheduler.Param) scheduler.Scheduler { + metrics := metricsManager.getOrCreateMetrics(task.ID) + subCtx := metric.WithCommonMetric(ctx, metrics) + sch := importScheduler{ + BaseScheduler: scheduler.NewBaseScheduler(subCtx, task, param), } + return &sch +} - var mu sync.Mutex - m.subtaskSortedKVMeta = &external.SortedKVMeta{} - onClose := func(summary *external.WriterSummary) { - mu.Lock() - defer mu.Unlock() - m.subtaskSortedKVMeta.MergeSummary(summary) +func (sch *importScheduler) Init() (err error) { + defer func() { + if err != nil { + // if init failed, close is not called, so we need to unregister here. + metricsManager.unregister(sch.GetTask().ID) + } + }() + taskMeta := &TaskMeta{} + if err = json.Unmarshal(sch.BaseScheduler.GetTask().Meta, taskMeta); err != nil { + return errors.Annotate(err, "unmarshal task meta failed") } - prefix := subtaskPrefix(m.taskID, subtask.ID) - - logger.Info("merge sort partSize", zap.String("size", units.BytesSize(float64(m.partSize)))) + sch.BaseScheduler.Extension = &ImportSchedulerExt{ + GlobalSort: taskMeta.Plan.CloudStorageURI != "", + } + return sch.BaseScheduler.Init() +} - return external.MergeOverlappingFiles(ctx, sm.DataFiles, m.controller.GlobalSortStore, m.partSize, 64*1024, - prefix, getKVGroupBlockSize(sm.KVGroup), 8*1024, 1*size.MB, 8*1024, - onClose, int(m.taskMeta.Plan.ThreadCnt), false) +func (sch *importScheduler) Close() { + metricsManager.unregister(sch.GetTask().ID) + sch.BaseScheduler.Close() } -func (m *mergeSortStepExecutor) OnFinished(_ context.Context, subtask *proto.Subtask) error { - var subtaskMeta MergeSortStepMeta - if err := json.Unmarshal(subtask.Meta, &subtaskMeta); err != nil { - return errors.Trace(err) +// nolint:deadcode +func dropTableIndexes(ctx context.Context, handle storage.TaskHandle, taskMeta *TaskMeta, logger *zap.Logger) error { + tblInfo := taskMeta.Plan.TableInfo + + remainIndexes, dropIndexes := common.GetDropIndexInfos(tblInfo) + for _, idxInfo := range dropIndexes { + sqlStr := common.BuildDropIndexSQL(taskMeta.Plan.DBName, tblInfo.Name.L, idxInfo) + if err := executeSQL(ctx, handle, logger, sqlStr); err != nil { + if merr, ok := errors.Cause(err).(*dmysql.MySQLError); ok { + switch merr.Number { + case errno.ErrCantDropFieldOrKey, errno.ErrDropIndexNeededInForeignKey: + remainIndexes = append(remainIndexes, idxInfo) + logger.Warn("can't drop index, skip", zap.String("index", idxInfo.Name.O), zap.Error(err)) + continue + } + } + return err + } } - subtaskMeta.SortedKVMeta = *m.subtaskSortedKVMeta - m.subtaskSortedKVMeta = nil - newMeta, err := json.Marshal(subtaskMeta) - if err != nil { - return errors.Trace(err) + if len(remainIndexes) < len(tblInfo.Indices) { + taskMeta.Plan.TableInfo = taskMeta.Plan.TableInfo.Clone() + taskMeta.Plan.TableInfo.Indices = remainIndexes } - subtask.Meta = newMeta return nil } -type writeAndIngestStepExecutor struct { - taskID int64 - taskMeta *TaskMeta - logger *zap.Logger - tableImporter *importer.TableImporter -} +// nolint:deadcode +func createTableIndexes(ctx context.Context, executor storage.SessionExecutor, taskMeta *TaskMeta, logger *zap.Logger) error { + tableName := common.UniqueTable(taskMeta.Plan.DBName, taskMeta.Plan.TableInfo.Name.L) + singleSQL, multiSQLs := common.BuildAddIndexSQL(tableName, taskMeta.Plan.TableInfo, taskMeta.Plan.DesiredTableInfo) + logger.Info("build add index sql", zap.String("singleSQL", singleSQL), zap.Strings("multiSQLs", multiSQLs)) + if len(multiSQLs) == 0 { + return nil + } -var _ execute.SubtaskExecutor = &writeAndIngestStepExecutor{} + err := executeSQL(ctx, executor, logger, singleSQL) + if err == nil { + return nil + } + if !common.IsDupKeyError(err) { + // TODO: refine err msg and error code according to spec. + return errors.Errorf("Failed to create index: %v, please execute the SQL manually, sql: %s", err, singleSQL) + } + if len(multiSQLs) == 1 { + return nil + } + logger.Warn("cannot add all indexes in one statement, try to add them one by one", zap.Strings("sqls", multiSQLs), zap.Error(err)) -func (e *writeAndIngestStepExecutor) Init(ctx context.Context) error { - tableImporter, err := getTableImporter(ctx, e.taskID, e.taskMeta) - if err != nil { - return err + for i, ddl := range multiSQLs { + err := executeSQL(ctx, executor, logger, ddl) + if err != nil && !common.IsDupKeyError(err) { + // TODO: refine err msg and error code according to spec. + return errors.Errorf("Failed to create index: %v, please execute the SQLs manually, sqls: %s", err, strings.Join(multiSQLs[i:], ";")) + } } - e.tableImporter = tableImporter return nil } -func (e *writeAndIngestStepExecutor) RunSubtask(ctx context.Context, subtask *proto.Subtask) (err error) { - sm := &WriteIngestStepMeta{} - err = json.Unmarshal(subtask.Meta, sm) +// TODO: return the result of sql. +func executeSQL(ctx context.Context, executor storage.SessionExecutor, logger *zap.Logger, sql string, args ...interface{}) (err error) { + logger.Info("execute sql", zap.String("sql", sql), zap.Any("args", args)) + return executor.WithNewSession(func(se sessionctx.Context) error { + _, err := se.(sqlexec.SQLExecutor).ExecuteInternal(ctx, sql, args...) + return err + }) +} + +func updateMeta(task *proto.Task, taskMeta *TaskMeta) error { + bs, err := json.Marshal(taskMeta) if err != nil { return errors.Trace(err) } + task.Meta = bs - logger := e.logger.With(zap.Int64("subtask-id", subtask.ID), - zap.String("kv-group", sm.KVGroup)) - task := log.BeginTask(logger, "run subtask") - defer func() { - task.End(zapcore.ErrorLevel, err) - }() + return nil +} - _, engineUUID := backend.MakeUUID("", subtask.ID) - localBackend := e.tableImporter.Backend() - err = localBackend.CloseEngine(ctx, &backend.EngineConfig{ - External: &backend.ExternalEngineConfig{ - StorageURI: e.taskMeta.Plan.CloudStorageURI, - DataFiles: sm.DataFiles, - StatFiles: sm.StatFiles, - StartKey: sm.StartKey, - EndKey: sm.EndKey, - SplitKeys: sm.RangeSplitKeys, - RegionSplitSize: sm.RangeSplitSize, - TotalFileSize: int64(sm.TotalKVSize), - TotalKVCount: 0, - CheckHotspot: false, - }, - }, engineUUID) - if err != nil { - return err +// todo: converting back and forth, we should unify struct and remove this function later. +func toChunkMap(engineCheckpoints map[int32]*checkpoints.EngineCheckpoint) map[int32][]Chunk { + chunkMap := make(map[int32][]Chunk, len(engineCheckpoints)) + for id, ecp := range engineCheckpoints { + chunkMap[id] = make([]Chunk, 0, len(ecp.Chunks)) + for _, chunkCheckpoint := range ecp.Chunks { + chunkMap[id] = append(chunkMap[id], toChunk(*chunkCheckpoint)) + } } - return localBackend.ImportEngine(ctx, engineUUID, int64(config.SplitRegionSize), int64(config.SplitRegionKeys)) + return chunkMap } -func (e *writeAndIngestStepExecutor) OnFinished(_ context.Context, subtask *proto.Subtask) error { - var subtaskMeta WriteIngestStepMeta - if err := json.Unmarshal(subtask.Meta, &subtaskMeta); err != nil { - return errors.Trace(err) +func getStepOfEncode(globalSort bool) proto.Step { + if globalSort { + return StepEncodeAndSort } - if subtaskMeta.KVGroup != dataKVGroup { - return nil - } - - // only data kv group has loaded row count - _, engineUUID := backend.MakeUUID("", subtask.ID) - localBackend := e.tableImporter.Backend() - _, kvCount := localBackend.GetExternalEngineKVStatistics(engineUUID) - subtaskMeta.Result.LoadedRowCnt = uint64(kvCount) + return StepImport +} - newMeta, err := json.Marshal(subtaskMeta) +// we will update taskMeta in place and make task.Meta point to the new taskMeta. +func updateResult(handle storage.TaskHandle, task *proto.Task, taskMeta *TaskMeta, globalSort bool) error { + stepOfEncode := getStepOfEncode(globalSort) + metas, err := handle.GetPreviousSubtaskMetas(task.ID, stepOfEncode) if err != nil { - return errors.Trace(err) + return err } - subtask.Meta = newMeta - return nil -} -func (e *writeAndIngestStepExecutor) Cleanup(_ context.Context) (err error) { - e.logger.Info("cleanup subtask env") - return e.tableImporter.Close() -} + subtaskMetas := make([]*ImportStepMeta, 0, len(metas)) + for _, bs := range metas { + var subtaskMeta ImportStepMeta + if err := json.Unmarshal(bs, &subtaskMeta); err != nil { + return errors.Trace(err) + } + subtaskMetas = append(subtaskMetas, &subtaskMeta) + } + columnSizeMap := make(map[int64]int64) + for _, subtaskMeta := range subtaskMetas { + taskMeta.Result.LoadedRowCnt += subtaskMeta.Result.LoadedRowCnt + for key, val := range subtaskMeta.Result.ColSizeMap { + columnSizeMap[key] += val + } + } + taskMeta.Result.ColSizeMap = columnSizeMap -func (e *writeAndIngestStepExecutor) Rollback(context.Context) error { - e.logger.Info("rollback") - return nil -} + if globalSort { + taskMeta.Result.LoadedRowCnt, err = getLoadedRowCountOnGlobalSort(handle, task) + if err != nil { + return err + } + } -type postStepExecutor struct { - scheduler.EmptySubtaskExecutor - taskID int64 - taskMeta *TaskMeta - logger *zap.Logger + return updateMeta(task, taskMeta) } -var _ execute.SubtaskExecutor = &postStepExecutor{} +func getLoadedRowCountOnGlobalSort(handle storage.TaskHandle, task *proto.Task) (uint64, error) { + metas, err := handle.GetPreviousSubtaskMetas(task.ID, StepWriteAndIngest) + if err != nil { + return 0, err + } -func (p *postStepExecutor) RunSubtask(ctx context.Context, subtask *proto.Subtask) (err error) { - logger := p.logger.With(zap.Int64("subtask-id", subtask.ID)) - task := log.BeginTask(logger, "run subtask") - defer func() { - task.End(zapcore.ErrorLevel, err) - }() - stepMeta := PostProcessStepMeta{} - if err = json.Unmarshal(subtask.Meta, &stepMeta); err != nil { - return errors.Trace(err) + var loadedRowCount uint64 + for _, bs := range metas { + var subtaskMeta WriteIngestStepMeta + if err = json.Unmarshal(bs, &subtaskMeta); err != nil { + return 0, errors.Trace(err) + } + loadedRowCount += subtaskMeta.Result.LoadedRowCnt } - failpoint.Inject("waitBeforePostProcess", func() { - time.Sleep(5 * time.Second) - }) - return postProcess(ctx, p.taskMeta, &stepMeta, logger) + return loadedRowCount, nil } -type importScheduler struct { - *scheduler.BaseScheduler +func startJob(ctx context.Context, logger *zap.Logger, taskHandle storage.TaskHandle, taskMeta *TaskMeta, jobStep string) error { + failpoint.Inject("syncBeforeJobStarted", func() { + TestSyncChan <- struct{}{} + <-TestSyncChan + }) + // retry for 3+6+12+24+(30-4)*30 ~= 825s ~= 14 minutes + // we consider all errors as retryable errors, except context done. + // the errors include errors happened when communicate with PD and TiKV. + // we didn't consider system corrupt cases like system table dropped/altered. + backoffer := backoff.NewExponential(scheduler.RetrySQLInterval, 2, scheduler.RetrySQLMaxInterval) + err := handle.RunWithRetry(ctx, scheduler.RetrySQLTimes, backoffer, logger, + func(ctx context.Context) (bool, error) { + return true, taskHandle.WithNewSession(func(se sessionctx.Context) error { + exec := se.(sqlexec.SQLExecutor) + return importer.StartJob(ctx, exec, taskMeta.JobID, jobStep) + }) + }, + ) + failpoint.Inject("syncAfterJobStarted", func() { + TestSyncChan <- struct{}{} + }) + return err } -func newImportScheduler(ctx context.Context, id string, task *proto.Task, taskTable scheduler.TaskTable) scheduler.Scheduler { - s := &importScheduler{ - BaseScheduler: scheduler.NewBaseScheduler(ctx, id, task.ID, taskTable), +func job2Step(ctx context.Context, logger *zap.Logger, taskMeta *TaskMeta, step string) error { + taskManager, err := storage.GetTaskManager() + if err != nil { + return err } - s.BaseScheduler.Extension = s - return s + // todo: use scheduler.TaskHandle + // we might call this in taskExecutor later, there's no scheduler.Extension, so we use taskManager here. + // retry for 3+6+12+24+(30-4)*30 ~= 825s ~= 14 minutes + backoffer := backoff.NewExponential(scheduler.RetrySQLInterval, 2, scheduler.RetrySQLMaxInterval) + return handle.RunWithRetry(ctx, scheduler.RetrySQLTimes, backoffer, logger, + func(ctx context.Context) (bool, error) { + return true, taskManager.WithNewSession(func(se sessionctx.Context) error { + exec := se.(sqlexec.SQLExecutor) + return importer.Job2Step(ctx, exec, taskMeta.JobID, step) + }) + }, + ) } -func (s *importScheduler) Run(ctx context.Context, task *proto.Task) error { - metrics := metricsManager.getOrCreateMetrics(task.ID) - defer metricsManager.unregister(task.ID) - subCtx := metric.WithCommonMetric(ctx, metrics) - return s.BaseScheduler.Run(subCtx, task) +func (sch *ImportSchedulerExt) finishJob(ctx context.Context, logger *zap.Logger, + taskHandle storage.TaskHandle, task *proto.Task, taskMeta *TaskMeta) error { + // we have already switch import-mode when switch to post-process step. + sch.unregisterTask(ctx, task) + summary := &importer.JobSummary{ImportedRows: taskMeta.Result.LoadedRowCnt} + // retry for 3+6+12+24+(30-4)*30 ~= 825s ~= 14 minutes + backoffer := backoff.NewExponential(scheduler.RetrySQLInterval, 2, scheduler.RetrySQLMaxInterval) + return handle.RunWithRetry(ctx, scheduler.RetrySQLTimes, backoffer, logger, + func(ctx context.Context) (bool, error) { + return true, taskHandle.WithNewSession(func(se sessionctx.Context) error { + exec := se.(sqlexec.SQLExecutor) + return importer.FinishJob(ctx, exec, taskMeta.JobID, summary) + }) + }, + ) } -func (*importScheduler) IsIdempotent(*proto.Subtask) bool { - // import don't have conflict detection and resolution now, so it's ok - // to import data twice. - return true +func (sch *ImportSchedulerExt) failJob(ctx context.Context, taskHandle storage.TaskHandle, task *proto.Task, + taskMeta *TaskMeta, logger *zap.Logger, errorMsg string) error { + sch.switchTiKV2NormalMode(ctx, task, logger) + sch.unregisterTask(ctx, task) + // retry for 3+6+12+24+(30-4)*30 ~= 825s ~= 14 minutes + backoffer := backoff.NewExponential(scheduler.RetrySQLInterval, 2, scheduler.RetrySQLMaxInterval) + return handle.RunWithRetry(ctx, scheduler.RetrySQLTimes, backoffer, logger, + func(ctx context.Context) (bool, error) { + return true, taskHandle.WithNewSession(func(se sessionctx.Context) error { + exec := se.(sqlexec.SQLExecutor) + return importer.FailJob(ctx, exec, taskMeta.JobID, errorMsg) + }) + }, + ) } -func (*importScheduler) GetSubtaskExecutor(_ context.Context, task *proto.Task, _ *execute.Summary) (execute.SubtaskExecutor, error) { - taskMeta := TaskMeta{} - if err := json.Unmarshal(task.Meta, &taskMeta); err != nil { - return nil, errors.Trace(err) - } - logger := logutil.BgLogger().With( - zap.Stringer("type", proto.ImportInto), - zap.Int64("task-id", task.ID), - zap.String("step", stepStr(task.Step)), +func (sch *ImportSchedulerExt) cancelJob(ctx context.Context, taskHandle storage.TaskHandle, task *proto.Task, + meta *TaskMeta, logger *zap.Logger) error { + sch.switchTiKV2NormalMode(ctx, task, logger) + sch.unregisterTask(ctx, task) + // retry for 3+6+12+24+(30-4)*30 ~= 825s ~= 14 minutes + backoffer := backoff.NewExponential(scheduler.RetrySQLInterval, 2, scheduler.RetrySQLMaxInterval) + return handle.RunWithRetry(ctx, scheduler.RetrySQLTimes, backoffer, logger, + func(ctx context.Context) (bool, error) { + return true, taskHandle.WithNewSession(func(se sessionctx.Context) error { + exec := se.(sqlexec.SQLExecutor) + return importer.CancelJob(ctx, exec, meta.JobID) + }) + }, ) - logger.Info("create step scheduler") +} - switch task.Step { - case StepImport, StepEncodeAndSort: - return &importStepExecutor{ - taskID: task.ID, - taskMeta: &taskMeta, - logger: logger, - }, nil +func redactSensitiveInfo(task *proto.Task, taskMeta *TaskMeta) { + taskMeta.Stmt = "" + taskMeta.Plan.Path = ast.RedactURL(taskMeta.Plan.Path) + if taskMeta.Plan.CloudStorageURI != "" { + taskMeta.Plan.CloudStorageURI = ast.RedactURL(taskMeta.Plan.CloudStorageURI) + } + if err := updateMeta(task, taskMeta); err != nil { + // marshal failed, should not happen + logutil.BgLogger().Warn("failed to update task meta", zap.Error(err)) + } +} + +func stepStr(step proto.Step) string { + switch step { + case proto.StepInit: + return "init" + case StepImport: + return "import" + case StepPostProcess: + return "post-process" + case StepEncodeAndSort: + return "encode&sort" case StepMergeSort: - return &mergeSortStepExecutor{ - taskID: task.ID, - taskMeta: &taskMeta, - logger: logger, - }, nil + return "merge-sort" case StepWriteAndIngest: - return &writeAndIngestStepExecutor{ - taskID: task.ID, - taskMeta: &taskMeta, - logger: logger, - }, nil - case StepPostProcess: - return &postStepExecutor{ - taskID: task.ID, - taskMeta: &taskMeta, - logger: logger, - }, nil + return "write&ingest" + case proto.StepDone: + return "done" default: - return nil, errors.Errorf("unknown step %d for import task %d", task.Step, task.ID) + return "unknown" } } func init() { - scheduler.RegisterTaskType(proto.ImportInto, newImportScheduler) + scheduler.RegisterSchedulerFactory(proto.ImportInto, newImportScheduler) } diff --git a/pkg/disttask/importinto/dispatcher_test.go b/pkg/disttask/importinto/scheduler_test.go similarity index 59% rename from pkg/disttask/importinto/dispatcher_test.go rename to pkg/disttask/importinto/scheduler_test.go index 59148930c4a23..00a082d21287a 100644 --- a/pkg/disttask/importinto/dispatcher_test.go +++ b/pkg/disttask/importinto/scheduler_test.go @@ -17,13 +17,11 @@ package importinto import ( "context" "encoding/json" - "fmt" "testing" "github.com/pingcap/failpoint" - "github.com/pingcap/tidb/pkg/disttask/framework/dispatcher" "github.com/pingcap/tidb/pkg/disttask/framework/proto" - "github.com/pingcap/tidb/pkg/domain/infosync" + "github.com/pingcap/tidb/pkg/disttask/framework/scheduler" "github.com/pingcap/tidb/pkg/executor/importer" "github.com/stretchr/testify/require" "github.com/stretchr/testify/suite" @@ -44,40 +42,19 @@ func (s *importIntoSuite) enableFailPoint(path, term string) { }) } -func (s *importIntoSuite) TestDispatcherGetEligibleInstances() { - makeFailpointRes := func(v interface{}) string { - bytes, err := json.Marshal(v) - s.NoError(err) - return fmt.Sprintf("return(`%s`)", string(bytes)) - } - uuids := []string{"ddl_id_1", "ddl_id_2"} - serverInfoMap := map[string]*infosync.ServerInfo{ - uuids[0]: { - ID: uuids[0], - }, - uuids[1]: { - ID: uuids[1], - }, - } - mockedAllServerInfos := makeFailpointRes(serverInfoMap) - - dsp := ImportDispatcherExt{} - gTask := &proto.Task{Meta: []byte("{}")} +func (s *importIntoSuite) TestSchedulerGetEligibleInstances() { + sch := ImportSchedulerExt{} + task := &proto.Task{Meta: []byte("{}")} ctx := context.WithValue(context.Background(), "etcd", true) - s.enableFailPoint("github.com/pingcap/tidb/pkg/domain/infosync/mockGetAllServerInfo", mockedAllServerInfos) - eligibleInstances, _, err := dsp.GetEligibleInstances(ctx, gTask) + eligibleInstances, err := sch.GetEligibleInstances(ctx, task) s.NoError(err) // order of slice is not stable, change to map - resultMap := map[string]*infosync.ServerInfo{} - for _, ins := range eligibleInstances { - resultMap[ins.ID] = ins - } - s.Equal(serverInfoMap, resultMap) + s.Empty(eligibleInstances) - gTask.Meta = []byte(`{"EligibleInstances":[{"ip": "1.1.1.1", "listening_port": 4000}]}`) - eligibleInstances, _, err = dsp.GetEligibleInstances(ctx, gTask) + task.Meta = []byte(`{"EligibleInstances":[{"ip": "1.1.1.1", "listening_port": 4000}]}`) + eligibleInstances, err = sch.GetEligibleInstances(ctx, task) s.NoError(err) - s.Equal([]*infosync.ServerInfo{{IP: "1.1.1.1", Port: 4000}}, eligibleInstances) + s.Equal([]string{"1.1.1.1:4000"}, eligibleInstances) } func (s *importIntoSuite) TestUpdateCurrentTask() { @@ -89,26 +66,26 @@ func (s *importIntoSuite) TestUpdateCurrentTask() { bs, err := json.Marshal(taskMeta) require.NoError(s.T(), err) - dsp := ImportDispatcherExt{} - require.Equal(s.T(), int64(0), dsp.currTaskID.Load()) - require.False(s.T(), dsp.disableTiKVImportMode.Load()) + sch := ImportSchedulerExt{} + require.Equal(s.T(), int64(0), sch.currTaskID.Load()) + require.False(s.T(), sch.disableTiKVImportMode.Load()) - dsp.updateCurrentTask(&proto.Task{ + sch.updateCurrentTask(&proto.Task{ ID: 1, Meta: bs, }) - require.Equal(s.T(), int64(1), dsp.currTaskID.Load()) - require.True(s.T(), dsp.disableTiKVImportMode.Load()) + require.Equal(s.T(), int64(1), sch.currTaskID.Load()) + require.True(s.T(), sch.disableTiKVImportMode.Load()) - dsp.updateCurrentTask(&proto.Task{ + sch.updateCurrentTask(&proto.Task{ ID: 1, Meta: bs, }) - require.Equal(s.T(), int64(1), dsp.currTaskID.Load()) - require.True(s.T(), dsp.disableTiKVImportMode.Load()) + require.Equal(s.T(), int64(1), sch.currTaskID.Load()) + require.True(s.T(), sch.disableTiKVImportMode.Load()) } -func (s *importIntoSuite) TestDispatcherInit() { +func (s *importIntoSuite) TestSchedulerInit() { meta := TaskMeta{ Plan: importer.Plan{ CloudStorageURI: "", @@ -116,42 +93,38 @@ func (s *importIntoSuite) TestDispatcherInit() { } bytes, err := json.Marshal(meta) s.NoError(err) - dsp := importDispatcher{ - BaseDispatcher: &dispatcher.BaseDispatcher{ - Task: &proto.Task{ - Meta: bytes, - }, - }, + sch := importScheduler{ + BaseScheduler: scheduler.NewBaseScheduler(context.Background(), &proto.Task{ + Meta: bytes, + }, scheduler.Param{}), } - s.NoError(dsp.Init()) - s.False(dsp.Extension.(*ImportDispatcherExt).GlobalSort) + s.NoError(sch.Init()) + s.False(sch.Extension.(*ImportSchedulerExt).GlobalSort) meta.Plan.CloudStorageURI = "s3://test" bytes, err = json.Marshal(meta) s.NoError(err) - dsp = importDispatcher{ - BaseDispatcher: &dispatcher.BaseDispatcher{ - Task: &proto.Task{ - Meta: bytes, - }, - }, + sch = importScheduler{ + BaseScheduler: scheduler.NewBaseScheduler(context.Background(), &proto.Task{ + Meta: bytes, + }, scheduler.Param{}), } - s.NoError(dsp.Init()) - s.True(dsp.Extension.(*ImportDispatcherExt).GlobalSort) + s.NoError(sch.Init()) + s.True(sch.Extension.(*ImportSchedulerExt).GlobalSort) } func (s *importIntoSuite) TestGetNextStep() { task := &proto.Task{ Step: proto.StepInit, } - ext := &ImportDispatcherExt{} + ext := &ImportSchedulerExt{} for _, nextStep := range []proto.Step{StepImport, StepPostProcess, proto.StepDone} { s.Equal(nextStep, ext.GetNextStep(task)) task.Step = nextStep } task.Step = proto.StepInit - ext = &ImportDispatcherExt{GlobalSort: true} + ext = &ImportSchedulerExt{GlobalSort: true} for _, nextStep := range []proto.Step{StepEncodeAndSort, StepMergeSort, StepWriteAndIngest, StepPostProcess, proto.StepDone} { s.Equal(nextStep, ext.GetNextStep(task)) @@ -176,7 +149,7 @@ func (s *importIntoSuite) TestGetStepOfEncode() { } func TestIsImporting2TiKV(t *testing.T) { - ext := &ImportDispatcherExt{} + ext := &ImportSchedulerExt{} require.False(t, ext.isImporting2TiKV(&proto.Task{Step: StepEncodeAndSort})) require.False(t, ext.isImporting2TiKV(&proto.Task{Step: StepMergeSort})) require.False(t, ext.isImporting2TiKV(&proto.Task{Step: StepPostProcess})) diff --git a/pkg/disttask/importinto/dispatcher_testkit_test.go b/pkg/disttask/importinto/scheduler_testkit_test.go similarity index 77% rename from pkg/disttask/importinto/dispatcher_testkit_test.go rename to pkg/disttask/importinto/scheduler_testkit_test.go index 5b3e6159a7bf4..ace752ee93991 100644 --- a/pkg/disttask/importinto/dispatcher_testkit_test.go +++ b/pkg/disttask/importinto/scheduler_testkit_test.go @@ -24,8 +24,8 @@ import ( "github.com/pingcap/errors" "github.com/pingcap/failpoint" "github.com/pingcap/tidb/br/pkg/lightning/backend/external" - "github.com/pingcap/tidb/pkg/disttask/framework/dispatcher" "github.com/pingcap/tidb/pkg/disttask/framework/proto" + "github.com/pingcap/tidb/pkg/disttask/framework/scheduler" "github.com/pingcap/tidb/pkg/disttask/framework/storage" "github.com/pingcap/tidb/pkg/disttask/importinto" "github.com/pingcap/tidb/pkg/domain/infosync" @@ -37,7 +37,7 @@ import ( "github.com/tikv/client-go/v2/util" ) -func TestDispatcherExtLocalSort(t *testing.T) { +func TestSchedulerExtLocalSort(t *testing.T) { store := testkit.CreateMockStore(t) tk := testkit.NewTestKit(t, store) pool := pools.NewResourcePool(func() (pools.Resource, error) { @@ -48,7 +48,7 @@ func TestDispatcherExtLocalSort(t *testing.T) { ctx = util.WithInternalSourceType(ctx, "taskManager") mgr := storage.NewTaskManager(pool) storage.SetTaskManager(mgr) - dsp, err := dispatcher.NewManager(util.WithInternalSourceType(ctx, "dispatcher"), mgr, "host:port") + sch, err := scheduler.NewManager(util.WithInternalSourceType(ctx, "scheduler"), mgr, "host:port") require.NoError(t, err) // create job @@ -85,16 +85,14 @@ func TestDispatcherExtLocalSort(t *testing.T) { require.NoError(t, err) taskMeta, err := json.Marshal(task) require.NoError(t, err) - taskID, err := manager.AddNewGlobalTask(ctx, importinto.TaskKey(jobID), proto.ImportInto, 1, taskMeta) + taskID, err := manager.CreateTask(ctx, importinto.TaskKey(jobID), proto.ImportInto, 1, taskMeta) require.NoError(t, err) task.ID = taskID // to import stage, job should be running - d := dsp.MockDispatcher(task) - ext := importinto.ImportDispatcherExt{} - serverInfos, _, err := ext.GetEligibleInstances(context.Background(), task) - require.NoError(t, err) - subtaskMetas, err := ext.OnNextSubtasksBatch(ctx, d, task, serverInfos, ext.GetNextStep(task)) + d := sch.MockScheduler(task) + ext := importinto.ImportSchedulerExt{} + subtaskMetas, err := ext.OnNextSubtasksBatch(ctx, d, task, []string{":4000"}, ext.GetNextStep(task)) require.NoError(t, err) require.Len(t, subtaskMetas, 1) task.Step = ext.GetNextStep(task) @@ -105,17 +103,17 @@ func TestDispatcherExtLocalSort(t *testing.T) { // update task/subtask, and finish subtask, so we can go to next stage subtasks := make([]*proto.Subtask, 0, len(subtaskMetas)) for _, m := range subtaskMetas { - subtasks = append(subtasks, proto.NewSubtask(task.Step, task.ID, task.Type, "", m)) + subtasks = append(subtasks, proto.NewSubtask(task.Step, task.ID, task.Type, "", 1, m, 0)) } - _, err = manager.UpdateGlobalTaskAndAddSubTasks(ctx, task, subtasks, proto.TaskStatePending) + _, err = manager.UpdateTaskAndAddSubTasks(ctx, task, subtasks, proto.TaskStatePending) require.NoError(t, err) - gotSubtasks, err := manager.GetSubtasksForImportInto(ctx, taskID, importinto.StepImport) + gotSubtasks, err := manager.GetSubtasksWithHistory(ctx, taskID, importinto.StepImport) require.NoError(t, err) for _, s := range gotSubtasks { - require.NoError(t, manager.FinishSubtask(ctx, s.SchedulerID, s.ID, []byte("{}"))) + require.NoError(t, manager.FinishSubtask(ctx, s.ExecID, s.ID, []byte("{}"))) } // to post-process stage, job should be running and in validating step - subtaskMetas, err = ext.OnNextSubtasksBatch(ctx, d, task, serverInfos, ext.GetNextStep(task)) + subtaskMetas, err = ext.OnNextSubtasksBatch(ctx, d, task, []string{":4000"}, ext.GetNextStep(task)) require.NoError(t, err) require.Len(t, subtaskMetas, 1) task.Step = ext.GetNextStep(task) @@ -125,11 +123,12 @@ func TestDispatcherExtLocalSort(t *testing.T) { require.Equal(t, "running", gotJobInfo.Status) require.Equal(t, "validating", gotJobInfo.Step) // on next stage, job should be finished - subtaskMetas, err = ext.OnNextSubtasksBatch(ctx, d, task, serverInfos, ext.GetNextStep(task)) + subtaskMetas, err = ext.OnNextSubtasksBatch(ctx, d, task, []string{":4000"}, ext.GetNextStep(task)) require.NoError(t, err) require.Len(t, subtaskMetas, 0) task.Step = ext.GetNextStep(task) require.Equal(t, proto.StepDone, task.Step) + require.NoError(t, ext.OnDone(ctx, d, task)) gotJobInfo, err = importer.GetJob(ctx, conn, jobID, "root", true) require.NoError(t, err) require.Equal(t, "finished", gotJobInfo.Status) @@ -142,22 +141,37 @@ func TestDispatcherExtLocalSort(t *testing.T) { bs, err = logicalPlan.ToTaskMeta() require.NoError(t, err) task.Meta = bs - // Set step to StepPostProcess to skip the rollback sql. - task.Step = importinto.StepPostProcess require.NoError(t, importer.StartJob(ctx, conn, jobID, importer.JobStepImporting)) - _, err = ext.OnErrStage(ctx, d, task, []error{errors.New("test")}) + task.Error = errors.New("met error") + require.NoError(t, ext.OnDone(ctx, d, task)) require.NoError(t, err) gotJobInfo, err = importer.GetJob(ctx, conn, jobID, "root", true) require.NoError(t, err) require.Equal(t, "failed", gotJobInfo.Status) + + // create another job, start it, and cancel it. + jobID, err = importer.CreateJob(ctx, conn, "test", "t", 1, + "root", &importer.ImportParameters{}, 123) + require.NoError(t, err) + logicalPlan.JobID = jobID + bs, err = logicalPlan.ToTaskMeta() + require.NoError(t, err) + task.Meta = bs + require.NoError(t, importer.StartJob(ctx, conn, jobID, importer.JobStepImporting)) + task.Error = errors.New("cancelled by user") + require.NoError(t, ext.OnDone(ctx, d, task)) + require.NoError(t, err) + gotJobInfo, err = importer.GetJob(ctx, conn, jobID, "root", true) + require.NoError(t, err) + require.Equal(t, "cancelled", gotJobInfo.Status) } -func TestDispatcherExtGlobalSort(t *testing.T) { - // Domain start dispatcher manager automatically, we need to disable it as +func TestSchedulerExtGlobalSort(t *testing.T) { + // Domain start scheduler manager automatically, we need to disable it as // we test import task management in this case. - require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/disttask/framework/dispatcher/disableDispatcherManager", "return(true)")) + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/disttask/framework/scheduler/disableSchedulerManager", "return(true)")) t.Cleanup(func() { - require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/disttask/framework/dispatcher/disableDispatcherManager")) + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/disttask/framework/scheduler/disableSchedulerManager")) }) store := testkit.CreateMockStore(t) tk := testkit.NewTestKit(t, store) @@ -169,7 +183,7 @@ func TestDispatcherExtGlobalSort(t *testing.T) { ctx = util.WithInternalSourceType(ctx, "taskManager") mgr := storage.NewTaskManager(pool) storage.SetTaskManager(mgr) - dsp, err := dispatcher.NewManager(util.WithInternalSourceType(ctx, "dispatcher"), mgr, "host:port") + sch, err := scheduler.NewManager(util.WithInternalSourceType(ctx, "scheduler"), mgr, "host:port") require.NoError(t, err) // create job @@ -214,18 +228,16 @@ func TestDispatcherExtGlobalSort(t *testing.T) { require.NoError(t, err) taskMeta, err := json.Marshal(task) require.NoError(t, err) - taskID, err := manager.AddNewGlobalTask(ctx, importinto.TaskKey(jobID), proto.ImportInto, 1, taskMeta) + taskID, err := manager.CreateTask(ctx, importinto.TaskKey(jobID), proto.ImportInto, 1, taskMeta) require.NoError(t, err) task.ID = taskID // to encode-sort stage, job should be running - d := dsp.MockDispatcher(task) - ext := importinto.ImportDispatcherExt{ + d := sch.MockScheduler(task) + ext := importinto.ImportSchedulerExt{ GlobalSort: true, } - serverInfos, _, err := ext.GetEligibleInstances(context.Background(), task) - require.NoError(t, err) - subtaskMetas, err := ext.OnNextSubtasksBatch(ctx, d, task, serverInfos, ext.GetNextStep(task)) + subtaskMetas, err := ext.OnNextSubtasksBatch(ctx, d, task, []string{":4000"}, ext.GetNextStep(task)) require.NoError(t, err) require.Len(t, subtaskMetas, 2) task.Step = ext.GetNextStep(task) @@ -237,11 +249,11 @@ func TestDispatcherExtGlobalSort(t *testing.T) { // update task/subtask, and finish subtask, so we can go to next stage subtasks := make([]*proto.Subtask, 0, len(subtaskMetas)) for _, m := range subtaskMetas { - subtasks = append(subtasks, proto.NewSubtask(task.Step, task.ID, task.Type, "", m)) + subtasks = append(subtasks, proto.NewSubtask(task.Step, task.ID, task.Type, "", 1, m, 0)) } - _, err = manager.UpdateGlobalTaskAndAddSubTasks(ctx, task, subtasks, proto.TaskStatePending) + _, err = manager.UpdateTaskAndAddSubTasks(ctx, task, subtasks, proto.TaskStatePending) require.NoError(t, err) - gotSubtasks, err := manager.GetSubtasksForImportInto(ctx, taskID, task.Step) + gotSubtasks, err := manager.GetSubtasksWithHistory(ctx, taskID, task.Step) require.NoError(t, err) sortStepMeta := &importinto.ImportStepMeta{ SortedDataMeta: &external.SortedKVMeta{ @@ -274,7 +286,7 @@ func TestDispatcherExtGlobalSort(t *testing.T) { sortStepMetaBytes, err := json.Marshal(sortStepMeta) require.NoError(t, err) for _, s := range gotSubtasks { - require.NoError(t, manager.FinishSubtask(ctx, s.SchedulerID, s.ID, sortStepMetaBytes)) + require.NoError(t, manager.FinishSubtask(ctx, s.ExecID, s.ID, sortStepMetaBytes)) } // to merge-sort stage @@ -282,7 +294,7 @@ func TestDispatcherExtGlobalSort(t *testing.T) { t.Cleanup(func() { require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/disttask/importinto/forceMergeSort")) }) - subtaskMetas, err = ext.OnNextSubtasksBatch(ctx, d, task, serverInfos, ext.GetNextStep(task)) + subtaskMetas, err = ext.OnNextSubtasksBatch(ctx, d, task, []string{":4000"}, ext.GetNextStep(task)) require.NoError(t, err) require.Len(t, subtaskMetas, 1) task.Step = ext.GetNextStep(task) @@ -294,11 +306,11 @@ func TestDispatcherExtGlobalSort(t *testing.T) { // update task/subtask, and finish subtask, so we can go to next stage subtasks = make([]*proto.Subtask, 0, len(subtaskMetas)) for _, m := range subtaskMetas { - subtasks = append(subtasks, proto.NewSubtask(task.Step, task.ID, task.Type, "", m)) + subtasks = append(subtasks, proto.NewSubtask(task.Step, task.ID, task.Type, "", 1, m, 0)) } - _, err = manager.UpdateGlobalTaskAndAddSubTasks(ctx, task, subtasks, proto.TaskStatePending) + _, err = manager.UpdateTaskAndAddSubTasks(ctx, task, subtasks, proto.TaskStatePending) require.NoError(t, err) - gotSubtasks, err = manager.GetSubtasksForImportInto(ctx, taskID, task.Step) + gotSubtasks, err = manager.GetSubtasksWithHistory(ctx, taskID, task.Step) require.NoError(t, err) mergeSortStepMeta := &importinto.MergeSortStepMeta{ KVGroup: "data", @@ -312,7 +324,7 @@ func TestDispatcherExtGlobalSort(t *testing.T) { mergeSortStepMetaBytes, err := json.Marshal(mergeSortStepMeta) require.NoError(t, err) for _, s := range gotSubtasks { - require.NoError(t, manager.FinishSubtask(ctx, s.SchedulerID, s.ID, mergeSortStepMetaBytes)) + require.NoError(t, manager.FinishSubtask(ctx, s.ExecID, s.ID, mergeSortStepMetaBytes)) } // to write-and-ingest stage @@ -320,7 +332,7 @@ func TestDispatcherExtGlobalSort(t *testing.T) { t.Cleanup(func() { require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/disttask/importinto/mockWriteIngestSpecs")) }) - subtaskMetas, err = ext.OnNextSubtasksBatch(ctx, d, task, serverInfos, ext.GetNextStep(task)) + subtaskMetas, err = ext.OnNextSubtasksBatch(ctx, d, task, []string{":4000"}, ext.GetNextStep(task)) require.NoError(t, err) require.Len(t, subtaskMetas, 2) task.Step = ext.GetNextStep(task) @@ -330,7 +342,7 @@ func TestDispatcherExtGlobalSort(t *testing.T) { require.Equal(t, "running", gotJobInfo.Status) require.Equal(t, "importing", gotJobInfo.Step) // on next stage, to post-process stage - subtaskMetas, err = ext.OnNextSubtasksBatch(ctx, d, task, serverInfos, ext.GetNextStep(task)) + subtaskMetas, err = ext.OnNextSubtasksBatch(ctx, d, task, []string{":4000"}, ext.GetNextStep(task)) require.NoError(t, err) require.Len(t, subtaskMetas, 1) task.Step = ext.GetNextStep(task) @@ -340,12 +352,9 @@ func TestDispatcherExtGlobalSort(t *testing.T) { require.Equal(t, "running", gotJobInfo.Status) require.Equal(t, "validating", gotJobInfo.Step) // next stage, done - subtaskMetas, err = ext.OnNextSubtasksBatch(ctx, d, task, serverInfos, ext.GetNextStep(task)) + subtaskMetas, err = ext.OnNextSubtasksBatch(ctx, d, task, []string{":4000"}, ext.GetNextStep(task)) require.NoError(t, err) require.Len(t, subtaskMetas, 0) task.Step = ext.GetNextStep(task) require.Equal(t, proto.StepDone, task.Step) - gotJobInfo, err = importer.GetJob(ctx, conn, jobID, "root", true) - require.NoError(t, err) - require.Equal(t, "finished", gotJobInfo.Status) } diff --git a/pkg/disttask/importinto/subtask_executor.go b/pkg/disttask/importinto/subtask_executor.go index 0027fa0b12135..eaab3656d0b85 100644 --- a/pkg/disttask/importinto/subtask_executor.go +++ b/pkg/disttask/importinto/subtask_executor.go @@ -16,31 +16,20 @@ package importinto import ( "context" - "net" - "strconv" "time" "github.com/pingcap/errors" "github.com/pingcap/failpoint" "github.com/pingcap/tidb/br/pkg/lightning/backend" - "github.com/pingcap/tidb/br/pkg/lightning/backend/local" - "github.com/pingcap/tidb/br/pkg/lightning/common" - "github.com/pingcap/tidb/br/pkg/lightning/config" "github.com/pingcap/tidb/br/pkg/lightning/log" verify "github.com/pingcap/tidb/br/pkg/lightning/verification" - tidb "github.com/pingcap/tidb/pkg/config" "github.com/pingcap/tidb/pkg/disttask/framework/proto" "github.com/pingcap/tidb/pkg/disttask/framework/storage" "github.com/pingcap/tidb/pkg/executor/importer" - "github.com/pingcap/tidb/pkg/keyspace" "github.com/pingcap/tidb/pkg/kv" "github.com/pingcap/tidb/pkg/sessionctx" - "github.com/pingcap/tidb/pkg/sessionctx/variable" - "github.com/pingcap/tidb/pkg/util/etcd" "github.com/pingcap/tidb/pkg/util/logutil" - "github.com/pingcap/tidb/pkg/util/mathutil" "github.com/tikv/client-go/v2/util" - clientv3 "go.etcd.io/etcd/client/v3" "go.uber.org/zap" ) @@ -109,7 +98,7 @@ func postProcess(ctx context.Context, taskMeta *TaskMeta, subtaskMeta *PostProce callLog.End(zap.ErrorLevel, err) }() - if err = rebaseAllocatorBases(ctx, taskMeta, subtaskMeta, logger); err != nil { + if err = importer.RebaseAllocatorBases(ctx, subtaskMeta.MaxIDs, &taskMeta.Plan, logger); err != nil { return err } @@ -120,185 +109,13 @@ func postProcess(ctx context.Context, taskMeta *TaskMeta, subtaskMeta *PostProce // err = multierr.Append(err, err2) // }() - return verifyChecksum(ctx, taskMeta, subtaskMeta, logger) -} - -func verifyChecksum(ctx context.Context, taskMeta *TaskMeta, subtaskMeta *PostProcessStepMeta, logger *zap.Logger) error { - if taskMeta.Plan.Checksum == config.OpLevelOff { - return nil - } localChecksum := verify.MakeKVChecksum(subtaskMeta.Checksum.Size, subtaskMeta.Checksum.KVs, subtaskMeta.Checksum.Sum) - logger.Info("local checksum", zap.Object("checksum", &localChecksum)) - - failpoint.Inject("waitCtxDone", func() { - <-ctx.Done() - }) - - globalTaskManager, err := storage.GetTaskManager() + taskManager, err := storage.GetTaskManager() ctx = util.WithInternalSourceType(ctx, kv.InternalDistTask) if err != nil { return err } - remoteChecksum, err := checksumTable(ctx, globalTaskManager, taskMeta, logger) - if err != nil { - if taskMeta.Plan.Checksum != config.OpLevelOptional { - return err - } - logger.Warn("checksumTable failed, will skip this error and go on", zap.Error(err)) - } - if remoteChecksum != nil { - if !remoteChecksum.IsEqual(&localChecksum) { - err2 := common.ErrChecksumMismatch.GenWithStackByArgs( - remoteChecksum.Checksum, localChecksum.Sum(), - remoteChecksum.TotalKVs, localChecksum.SumKVS(), - remoteChecksum.TotalBytes, localChecksum.SumSize(), - ) - if taskMeta.Plan.Checksum == config.OpLevelOptional { - logger.Warn("verify checksum failed, but checksum is optional, will skip it", zap.Error(err2)) - err2 = nil - } - return err2 - } - logger.Info("checksum pass", zap.Object("local", &localChecksum)) - } - return nil -} - -func checksumTable(ctx context.Context, executor storage.SessionExecutor, taskMeta *TaskMeta, logger *zap.Logger) (*local.RemoteChecksum, error) { - var ( - tableName = common.UniqueTable(taskMeta.Plan.DBName, taskMeta.Plan.TableInfo.Name.L) - sql = "ADMIN CHECKSUM TABLE " + tableName - maxErrorRetryCount = 3 - distSQLScanConcurrencyFactor = 1 - remoteChecksum *local.RemoteChecksum - txnErr error - ) - - ctx = util.WithInternalSourceType(ctx, kv.InternalImportInto) - for i := 0; i < maxErrorRetryCount; i++ { - txnErr = executor.WithNewTxn(ctx, func(se sessionctx.Context) error { - // increase backoff weight - if err := setBackoffWeight(se, taskMeta, logger); err != nil { - logger.Warn("set tidb_backoff_weight failed", zap.Error(err)) - } - - distSQLScanConcurrency := se.GetSessionVars().DistSQLScanConcurrency() - se.GetSessionVars().SetDistSQLScanConcurrency(mathutil.Max(distSQLScanConcurrency/distSQLScanConcurrencyFactor, local.MinDistSQLScanConcurrency)) - defer func() { - se.GetSessionVars().SetDistSQLScanConcurrency(distSQLScanConcurrency) - }() - - // TODO: add resource group name - - rs, err := storage.ExecSQL(ctx, se, sql) - if err != nil { - return err - } - if len(rs) < 1 { - return errors.New("empty checksum result") - } - - failpoint.Inject("errWhenChecksum", func() { - if i == 0 { - failpoint.Return(errors.New("occur an error when checksum, coprocessor task terminated due to exceeding the deadline")) - } - }) - - // ADMIN CHECKSUM TABLE . example. - // mysql> admin checksum table test.t; - // +---------+------------+---------------------+-----------+-------------+ - // | Db_name | Table_name | Checksum_crc64_xor | Total_kvs | Total_bytes | - // +---------+------------+---------------------+-----------+-------------+ - // | test | t | 8520875019404689597 | 7296873 | 357601387 | - // +---------+------------+------------- - remoteChecksum = &local.RemoteChecksum{ - Schema: rs[0].GetString(0), - Table: rs[0].GetString(1), - Checksum: rs[0].GetUint64(2), - TotalKVs: rs[0].GetUint64(3), - TotalBytes: rs[0].GetUint64(4), - } - return nil - }) - if !common.IsRetryableError(txnErr) { - break - } - distSQLScanConcurrencyFactor *= 2 - logger.Warn("retry checksum table", zap.Int("retry count", i+1), zap.Error(txnErr)) - } - return remoteChecksum, txnErr -} - -// TestChecksumTable is used to test checksum table in unit test. -func TestChecksumTable(ctx context.Context, executor storage.SessionExecutor, taskMeta *TaskMeta, logger *zap.Logger) (*local.RemoteChecksum, error) { - return checksumTable(ctx, executor, taskMeta, logger) -} - -func setBackoffWeight(se sessionctx.Context, taskMeta *TaskMeta, logger *zap.Logger) error { - backoffWeight := local.DefaultBackoffWeight - if val, ok := taskMeta.Plan.ImportantSysVars[variable.TiDBBackOffWeight]; ok { - if weight, err := strconv.Atoi(val); err == nil && weight > backoffWeight { - backoffWeight = weight - } - } - logger.Info("set backoff weight", zap.Int("weight", backoffWeight)) - return se.GetSessionVars().SetSystemVar(variable.TiDBBackOffWeight, strconv.Itoa(backoffWeight)) -} - -type autoIDRequirement struct { - store kv.Storage - etcdCli *clientv3.Client -} - -func (r *autoIDRequirement) Store() kv.Storage { - return r.store -} - -func (r *autoIDRequirement) GetEtcdClient() *clientv3.Client { - return r.etcdCli -} - -func rebaseAllocatorBases(ctx context.Context, taskMeta *TaskMeta, subtaskMeta *PostProcessStepMeta, logger *zap.Logger) (err error) { - callLog := log.BeginTask(logger, "rebase allocators") - defer func() { - callLog.End(zap.ErrorLevel, err) - }() - - if !common.TableHasAutoID(taskMeta.Plan.DesiredTableInfo) { - return nil - } - - tidbCfg := tidb.GetGlobalConfig() - hostPort := net.JoinHostPort("127.0.0.1", strconv.Itoa(int(tidbCfg.Status.StatusPort))) - tls, err2 := common.NewTLS( - tidbCfg.Security.ClusterSSLCA, - tidbCfg.Security.ClusterSSLCert, - tidbCfg.Security.ClusterSSLKey, - hostPort, - nil, nil, nil, - ) - if err2 != nil { - return err2 - } - - // no need to close kvStore, since it's a cached store. - kvStore, err2 := importer.GetCachedKVStoreFrom(tidbCfg.Path, tls) - if err2 != nil { - return errors.Trace(err2) - } - etcdCli, err := clientv3.New(clientv3.Config{ - Endpoints: []string{tidbCfg.Path}, - AutoSyncInterval: 30 * time.Second, - TLS: tls.TLSConfig(), + return taskManager.WithNewSession(func(se sessionctx.Context) error { + return importer.VerifyChecksum(ctx, &taskMeta.Plan, localChecksum, se, logger) }) - if err != nil { - return errors.Trace(err) - } - etcd.SetEtcdCliByNamespace(etcdCli, keyspace.MakeKeyspaceEtcdNamespace(kvStore.GetCodec())) - r := autoIDRequirement{store: kvStore, etcdCli: etcdCli} - err = common.RebaseTableAllocators(ctx, subtaskMeta.MaxIDs, &r, taskMeta.Plan.DBID, taskMeta.Plan.DesiredTableInfo) - if err1 := etcdCli.Close(); err1 != nil { - logger.Info("close etcd client error", zap.Error(err1)) - } - return errors.Trace(err) } diff --git a/pkg/disttask/importinto/subtask_executor_test.go b/pkg/disttask/importinto/subtask_executor_test.go index 1dca40acba4ce..e17899a369100 100644 --- a/pkg/disttask/importinto/subtask_executor_test.go +++ b/pkg/disttask/importinto/subtask_executor_test.go @@ -13,60 +13,3 @@ // limitations under the License. package importinto_test - -import ( - "context" - "testing" - "time" - - "github.com/ngaut/pools" - "github.com/pingcap/failpoint" - verify "github.com/pingcap/tidb/br/pkg/lightning/verification" - "github.com/pingcap/tidb/pkg/disttask/framework/storage" - "github.com/pingcap/tidb/pkg/disttask/importinto" - "github.com/pingcap/tidb/pkg/executor/importer" - "github.com/pingcap/tidb/pkg/parser/model" - "github.com/pingcap/tidb/pkg/testkit" - "github.com/pingcap/tidb/pkg/util/logutil" - "github.com/stretchr/testify/require" -) - -func TestChecksumTable(t *testing.T) { - ctx := context.Background() - store := testkit.CreateMockStore(t) - gtk := testkit.NewTestKit(t, store) - pool := pools.NewResourcePool(func() (pools.Resource, error) { - return gtk.Session(), nil - }, 1, 1, time.Second) - defer pool.Close() - mgr := storage.NewTaskManager(pool) - - taskMeta := &importinto.TaskMeta{ - Plan: importer.Plan{ - DBName: "db", - TableInfo: &model.TableInfo{ - Name: model.NewCIStr("tb"), - }, - }, - } - // fake result - localChecksum := verify.MakeKVChecksum(1, 1, 1) - gtk.MustExec("create database db") - gtk.MustExec("create table db.tb(id int)") - gtk.MustExec("insert into db.tb values(1)") - remoteChecksum, err := importinto.TestChecksumTable(ctx, mgr, taskMeta, logutil.BgLogger()) - require.NoError(t, err) - require.True(t, remoteChecksum.IsEqual(&localChecksum)) - // again - remoteChecksum, err = importinto.TestChecksumTable(ctx, mgr, taskMeta, logutil.BgLogger()) - require.NoError(t, err) - require.True(t, remoteChecksum.IsEqual(&localChecksum)) - - _ = failpoint.Enable("github.com/pingcap/tidb/pkg/disttask/importinto/errWhenChecksum", `return(true)`) - defer func() { - _ = failpoint.Disable("github.com/pingcap/tidb/pkg/disttask/importinto/errWhenChecksum") - }() - remoteChecksum, err = importinto.TestChecksumTable(ctx, mgr, taskMeta, logutil.BgLogger()) - require.NoError(t, err) - require.True(t, remoteChecksum.IsEqual(&localChecksum)) -} diff --git a/pkg/disttask/importinto/task_executor.go b/pkg/disttask/importinto/task_executor.go new file mode 100644 index 0000000000000..c35cec3b1d02e --- /dev/null +++ b/pkg/disttask/importinto/task_executor.go @@ -0,0 +1,536 @@ +// Copyright 2023 PingCAP, 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. + +package importinto + +import ( + "context" + "encoding/json" + "strconv" + "sync" + "time" + + "github.com/docker/go-units" + "github.com/pingcap/errors" + "github.com/pingcap/failpoint" + "github.com/pingcap/tidb/br/pkg/lightning/backend" + "github.com/pingcap/tidb/br/pkg/lightning/backend/external" + "github.com/pingcap/tidb/br/pkg/lightning/backend/kv" + "github.com/pingcap/tidb/br/pkg/lightning/common" + "github.com/pingcap/tidb/br/pkg/lightning/config" + "github.com/pingcap/tidb/br/pkg/lightning/log" + "github.com/pingcap/tidb/br/pkg/lightning/metric" + "github.com/pingcap/tidb/br/pkg/lightning/verification" + "github.com/pingcap/tidb/pkg/disttask/framework/proto" + "github.com/pingcap/tidb/pkg/disttask/framework/taskexecutor" + "github.com/pingcap/tidb/pkg/disttask/framework/taskexecutor/execute" + "github.com/pingcap/tidb/pkg/disttask/operator" + "github.com/pingcap/tidb/pkg/executor/importer" + "github.com/pingcap/tidb/pkg/meta/autoid" + "github.com/pingcap/tidb/pkg/table/tables" + "github.com/pingcap/tidb/pkg/util/logutil" + "github.com/pingcap/tidb/pkg/util/size" + "go.uber.org/zap" + "go.uber.org/zap/zapcore" +) + +// importStepExecutor is a executor for import step. +// StepExecutor is equivalent to a Lightning instance. +type importStepExecutor struct { + taskID int64 + taskMeta *TaskMeta + tableImporter *importer.TableImporter + sharedVars sync.Map + logger *zap.Logger + + indexMemorySizeLimit uint64 + + importCtx context.Context + importCancel context.CancelFunc + wg sync.WaitGroup +} + +func getTableImporter(ctx context.Context, taskID int64, taskMeta *TaskMeta) (*importer.TableImporter, error) { + idAlloc := kv.NewPanickingAllocators(0) + tbl, err := tables.TableFromMeta(idAlloc, taskMeta.Plan.TableInfo) + if err != nil { + return nil, err + } + astArgs, err := importer.ASTArgsFromStmt(taskMeta.Stmt) + if err != nil { + return nil, err + } + controller, err := importer.NewLoadDataController(&taskMeta.Plan, tbl, astArgs) + if err != nil { + return nil, err + } + if err = controller.InitDataStore(ctx); err != nil { + return nil, err + } + + return importer.NewTableImporter(&importer.JobImportParam{ + GroupCtx: ctx, + Progress: importer.NewProgress(), + Job: &importer.Job{}, + }, controller, strconv.FormatInt(taskID, 10)) +} + +func (s *importStepExecutor) Init(ctx context.Context) error { + s.logger.Info("init subtask env") + tableImporter, err := getTableImporter(ctx, s.taskID, s.taskMeta) + if err != nil { + return err + } + s.tableImporter = tableImporter + + // we need this sub context since Cleanup which wait on this routine is called + // before parent context is canceled in normal flow. + s.importCtx, s.importCancel = context.WithCancel(ctx) + // only need to check disk quota when we are using local sort. + if s.tableImporter.IsLocalSort() { + s.wg.Add(1) + go func() { + defer s.wg.Done() + s.tableImporter.CheckDiskQuota(s.importCtx) + }() + } + s.indexMemorySizeLimit = getWriterMemorySizeLimit(s.tableImporter.Plan) + s.logger.Info("index writer memory size limit", + zap.String("limit", units.BytesSize(float64(s.indexMemorySizeLimit)))) + return nil +} + +func (s *importStepExecutor) RunSubtask(ctx context.Context, subtask *proto.Subtask) (err error) { + logger := s.logger.With(zap.Int64("subtask-id", subtask.ID)) + task := log.BeginTask(logger, "run subtask") + defer func() { + task.End(zapcore.ErrorLevel, err) + }() + bs := subtask.Meta + var subtaskMeta ImportStepMeta + err = json.Unmarshal(bs, &subtaskMeta) + if err != nil { + return errors.Trace(err) + } + + var dataEngine, indexEngine *backend.OpenedEngine + if s.tableImporter.IsLocalSort() { + dataEngine, err = s.tableImporter.OpenDataEngine(ctx, subtaskMeta.ID) + if err != nil { + return err + } + // Unlike in Lightning, we start an index engine for each subtask, + // whereas previously there was only a single index engine globally. + // This is because the executor currently does not have a post-processing mechanism. + // If we import the index in `cleanupSubtaskEnv`, the scheduler will not wait for the import to complete. + // Multiple index engines may suffer performance degradation due to range overlap. + // These issues will be alleviated after we integrate s3 sorter. + // engineID = -1, -2, -3, ... + indexEngine, err = s.tableImporter.OpenIndexEngine(ctx, common.IndexEngineID-subtaskMeta.ID) + if err != nil { + return err + } + } + sharedVars := &SharedVars{ + TableImporter: s.tableImporter, + DataEngine: dataEngine, + IndexEngine: indexEngine, + Progress: importer.NewProgress(), + Checksum: &verification.KVChecksum{}, + SortedDataMeta: &external.SortedKVMeta{}, + SortedIndexMetas: make(map[int64]*external.SortedKVMeta), + } + s.sharedVars.Store(subtaskMeta.ID, sharedVars) + + source := operator.NewSimpleDataChannel(make(chan *importStepMinimalTask)) + op := newEncodeAndSortOperator(ctx, s, sharedVars, subtask.ID, s.indexMemorySizeLimit) + op.SetSource(source) + pipeline := operator.NewAsyncPipeline(op) + if err = pipeline.Execute(); err != nil { + return err + } + +outer: + for _, chunk := range subtaskMeta.Chunks { + // TODO: current workpool impl doesn't drain the input channel, it will + // just return on context cancel(error happened), so we add this select. + select { + case source.Channel() <- &importStepMinimalTask{ + Plan: s.taskMeta.Plan, + Chunk: chunk, + SharedVars: sharedVars, + }: + case <-op.Done(): + break outer + } + } + source.Finish() + + return pipeline.Close() +} + +func (s *importStepExecutor) OnFinished(ctx context.Context, subtask *proto.Subtask) error { + var subtaskMeta ImportStepMeta + if err := json.Unmarshal(subtask.Meta, &subtaskMeta); err != nil { + return errors.Trace(err) + } + s.logger.Info("on subtask finished", zap.Int32("engine-id", subtaskMeta.ID)) + + val, ok := s.sharedVars.Load(subtaskMeta.ID) + if !ok { + return errors.Errorf("sharedVars %d not found", subtaskMeta.ID) + } + sharedVars, ok := val.(*SharedVars) + if !ok { + return errors.Errorf("sharedVars %d not found", subtaskMeta.ID) + } + + var dataKVCount int64 + if s.tableImporter.IsLocalSort() { + // TODO: we should close and cleanup engine in all case, since there's no checkpoint. + s.logger.Info("import data engine", zap.Int32("engine-id", subtaskMeta.ID)) + closedDataEngine, err := sharedVars.DataEngine.Close(ctx) + if err != nil { + return err + } + dataKVCount, err = s.tableImporter.ImportAndCleanup(ctx, closedDataEngine) + if err != nil { + return err + } + + s.logger.Info("import index engine", zap.Int32("engine-id", subtaskMeta.ID)) + if closedEngine, err := sharedVars.IndexEngine.Close(ctx); err != nil { + return err + } else if _, err := s.tableImporter.ImportAndCleanup(ctx, closedEngine); err != nil { + return err + } + } + // there's no imported dataKVCount on this stage when using global sort. + + sharedVars.mu.Lock() + defer sharedVars.mu.Unlock() + subtaskMeta.Checksum.Sum = sharedVars.Checksum.Sum() + subtaskMeta.Checksum.KVs = sharedVars.Checksum.SumKVS() + subtaskMeta.Checksum.Size = sharedVars.Checksum.SumSize() + subtaskMeta.Result = Result{ + LoadedRowCnt: uint64(dataKVCount), + ColSizeMap: sharedVars.Progress.GetColSize(), + } + allocators := sharedVars.TableImporter.Allocators() + subtaskMeta.MaxIDs = map[autoid.AllocatorType]int64{ + autoid.RowIDAllocType: allocators.Get(autoid.RowIDAllocType).Base(), + autoid.AutoIncrementType: allocators.Get(autoid.AutoIncrementType).Base(), + autoid.AutoRandomType: allocators.Get(autoid.AutoRandomType).Base(), + } + subtaskMeta.SortedDataMeta = sharedVars.SortedDataMeta + subtaskMeta.SortedIndexMetas = sharedVars.SortedIndexMetas + s.sharedVars.Delete(subtaskMeta.ID) + newMeta, err := json.Marshal(subtaskMeta) + if err != nil { + return errors.Trace(err) + } + subtask.Meta = newMeta + return nil +} + +func (s *importStepExecutor) Cleanup(_ context.Context) (err error) { + s.logger.Info("cleanup subtask env") + s.importCancel() + s.wg.Wait() + return s.tableImporter.Close() +} + +func (s *importStepExecutor) Rollback(context.Context) error { + // TODO: add rollback + s.logger.Info("rollback") + return nil +} + +type mergeSortStepExecutor struct { + taskexecutor.EmptyStepExecutor + taskID int64 + taskMeta *TaskMeta + logger *zap.Logger + controller *importer.LoadDataController + // subtask of a task is run in serial now, so we don't need lock here. + // change to SyncMap when we support parallel subtask in the future. + subtaskSortedKVMeta *external.SortedKVMeta + partSize int64 +} + +var _ execute.StepExecutor = &mergeSortStepExecutor{} + +func (m *mergeSortStepExecutor) Init(ctx context.Context) error { + controller, err := buildController(&m.taskMeta.Plan, m.taskMeta.Stmt) + if err != nil { + return err + } + if err = controller.InitDataStore(ctx); err != nil { + return err + } + m.controller = controller + // 10000 = max part num + m.partSize = int64(getWriterMemorySizeLimit(&m.taskMeta.Plan) / 10000 * uint64(external.MergeSortOverlapThreshold)) + return nil +} + +func (m *mergeSortStepExecutor) RunSubtask(ctx context.Context, subtask *proto.Subtask) (err error) { + logger := m.logger.With(zap.Int64("subtask-id", subtask.ID)) + task := log.BeginTask(logger, "run subtask") + defer func() { + task.End(zapcore.ErrorLevel, err) + }() + + sm := &MergeSortStepMeta{} + err = json.Unmarshal(subtask.Meta, sm) + if err != nil { + return errors.Trace(err) + } + + var mu sync.Mutex + m.subtaskSortedKVMeta = &external.SortedKVMeta{} + onClose := func(summary *external.WriterSummary) { + mu.Lock() + defer mu.Unlock() + m.subtaskSortedKVMeta.MergeSummary(summary) + } + + prefix := subtaskPrefix(m.taskID, subtask.ID) + + logger.Info("merge sort partSize", zap.String("size", units.BytesSize(float64(m.partSize)))) + + return external.MergeOverlappingFiles( + ctx, + sm.DataFiles, + m.controller.GlobalSortStore, + m.partSize, + 64*1024, + prefix, + getKVGroupBlockSize(sm.KVGroup), + external.DefaultMemSizeLimit, + 8*1024, + 1*size.MB, + 8*1024, + onClose, + m.taskMeta.Plan.ThreadCnt, + false) +} + +func (m *mergeSortStepExecutor) OnFinished(_ context.Context, subtask *proto.Subtask) error { + var subtaskMeta MergeSortStepMeta + if err := json.Unmarshal(subtask.Meta, &subtaskMeta); err != nil { + return errors.Trace(err) + } + subtaskMeta.SortedKVMeta = *m.subtaskSortedKVMeta + m.subtaskSortedKVMeta = nil + newMeta, err := json.Marshal(subtaskMeta) + if err != nil { + return errors.Trace(err) + } + subtask.Meta = newMeta + return nil +} + +type writeAndIngestStepExecutor struct { + taskID int64 + taskMeta *TaskMeta + logger *zap.Logger + tableImporter *importer.TableImporter +} + +var _ execute.StepExecutor = &writeAndIngestStepExecutor{} + +func (e *writeAndIngestStepExecutor) Init(ctx context.Context) error { + tableImporter, err := getTableImporter(ctx, e.taskID, e.taskMeta) + if err != nil { + return err + } + e.tableImporter = tableImporter + return nil +} + +func (e *writeAndIngestStepExecutor) RunSubtask(ctx context.Context, subtask *proto.Subtask) (err error) { + sm := &WriteIngestStepMeta{} + err = json.Unmarshal(subtask.Meta, sm) + if err != nil { + return errors.Trace(err) + } + + logger := e.logger.With(zap.Int64("subtask-id", subtask.ID), + zap.String("kv-group", sm.KVGroup)) + task := log.BeginTask(logger, "run subtask") + defer func() { + task.End(zapcore.ErrorLevel, err) + }() + + _, engineUUID := backend.MakeUUID("", subtask.ID) + localBackend := e.tableImporter.Backend() + err = localBackend.CloseEngine(ctx, &backend.EngineConfig{ + External: &backend.ExternalEngineConfig{ + StorageURI: e.taskMeta.Plan.CloudStorageURI, + DataFiles: sm.DataFiles, + StatFiles: sm.StatFiles, + StartKey: sm.StartKey, + EndKey: sm.EndKey, + SplitKeys: sm.RangeSplitKeys, + RegionSplitSize: sm.RangeSplitSize, + TotalFileSize: int64(sm.TotalKVSize), + TotalKVCount: 0, + CheckHotspot: false, + }, + }, engineUUID) + if err != nil { + return err + } + return localBackend.ImportEngine(ctx, engineUUID, int64(config.SplitRegionSize), int64(config.SplitRegionKeys)) +} + +func (e *writeAndIngestStepExecutor) OnFinished(_ context.Context, subtask *proto.Subtask) error { + var subtaskMeta WriteIngestStepMeta + if err := json.Unmarshal(subtask.Meta, &subtaskMeta); err != nil { + return errors.Trace(err) + } + if subtaskMeta.KVGroup != dataKVGroup { + return nil + } + + // only data kv group has loaded row count + _, engineUUID := backend.MakeUUID("", subtask.ID) + localBackend := e.tableImporter.Backend() + _, kvCount := localBackend.GetExternalEngineKVStatistics(engineUUID) + subtaskMeta.Result.LoadedRowCnt = uint64(kvCount) + + newMeta, err := json.Marshal(subtaskMeta) + if err != nil { + return errors.Trace(err) + } + subtask.Meta = newMeta + return nil +} + +func (e *writeAndIngestStepExecutor) Cleanup(_ context.Context) (err error) { + e.logger.Info("cleanup subtask env") + return e.tableImporter.Close() +} + +func (e *writeAndIngestStepExecutor) Rollback(context.Context) error { + e.logger.Info("rollback") + return nil +} + +type postProcessStepExecutor struct { + taskexecutor.EmptyStepExecutor + taskID int64 + taskMeta *TaskMeta + logger *zap.Logger +} + +var _ execute.StepExecutor = &postProcessStepExecutor{} + +// NewPostProcessStepExecutor creates a new post process step executor. +// exported for testing. +func NewPostProcessStepExecutor(taskID int64, taskMeta *TaskMeta, logger *zap.Logger) execute.StepExecutor { + return &postProcessStepExecutor{ + taskID: taskID, + taskMeta: taskMeta, + logger: logger, + } +} + +func (p *postProcessStepExecutor) RunSubtask(ctx context.Context, subtask *proto.Subtask) (err error) { + logger := p.logger.With(zap.Int64("subtask-id", subtask.ID)) + task := log.BeginTask(logger, "run subtask") + defer func() { + task.End(zapcore.ErrorLevel, err) + }() + stepMeta := PostProcessStepMeta{} + if err = json.Unmarshal(subtask.Meta, &stepMeta); err != nil { + return errors.Trace(err) + } + failpoint.Inject("waitBeforePostProcess", func() { + time.Sleep(5 * time.Second) + }) + return postProcess(ctx, p.taskMeta, &stepMeta, logger) +} + +type importExecutor struct { + *taskexecutor.BaseTaskExecutor +} + +func newImportExecutor(ctx context.Context, id string, task *proto.Task, taskTable taskexecutor.TaskTable) taskexecutor.TaskExecutor { + s := &importExecutor{ + BaseTaskExecutor: taskexecutor.NewBaseTaskExecutor(ctx, id, task, taskTable), + } + s.BaseTaskExecutor.Extension = s + return s +} + +func (s *importExecutor) RunStep(ctx context.Context, task *proto.Task, resource *proto.StepResource) error { + metrics := metricsManager.getOrCreateMetrics(task.ID) + defer metricsManager.unregister(task.ID) + subCtx := metric.WithCommonMetric(ctx, metrics) + return s.BaseTaskExecutor.RunStep(subCtx, task, resource) +} + +func (*importExecutor) IsIdempotent(*proto.Subtask) bool { + // import don't have conflict detection and resolution now, so it's ok + // to import data twice. + return true +} + +func (*importExecutor) IsRetryableError(err error) bool { + return common.IsRetryableError(err) +} + +func (*importExecutor) GetStepExecutor(_ context.Context, task *proto.Task, _ *execute.Summary, _ *proto.StepResource) (execute.StepExecutor, error) { + taskMeta := TaskMeta{} + if err := json.Unmarshal(task.Meta, &taskMeta); err != nil { + return nil, errors.Trace(err) + } + logger := logutil.BgLogger().With( + zap.Stringer("type", proto.ImportInto), + zap.Int64("task-id", task.ID), + zap.String("step", stepStr(task.Step)), + ) + logger.Info("create step executor") + + switch task.Step { + case StepImport, StepEncodeAndSort: + return &importStepExecutor{ + taskID: task.ID, + taskMeta: &taskMeta, + logger: logger, + }, nil + case StepMergeSort: + return &mergeSortStepExecutor{ + taskID: task.ID, + taskMeta: &taskMeta, + logger: logger, + }, nil + case StepWriteAndIngest: + return &writeAndIngestStepExecutor{ + taskID: task.ID, + taskMeta: &taskMeta, + logger: logger, + }, nil + case StepPostProcess: + return NewPostProcessStepExecutor(task.ID, &taskMeta, logger), nil + default: + return nil, errors.Errorf("unknown step %d for import task %d", task.Step, task.ID) + } +} + +func init() { + taskexecutor.RegisterTaskType(proto.ImportInto, newImportExecutor) +} diff --git a/pkg/disttask/importinto/task_executor_test.go b/pkg/disttask/importinto/task_executor_test.go new file mode 100644 index 0000000000000..35202646c7cee --- /dev/null +++ b/pkg/disttask/importinto/task_executor_test.go @@ -0,0 +1,54 @@ +// Copyright 2023 PingCAP, 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. + +package importinto + +import ( + "context" + "testing" + + "github.com/pingcap/tidb/pkg/disttask/framework/proto" + "github.com/stretchr/testify/require" +) + +func TestImportTaskExecutor(t *testing.T) { + ctx := context.Background() + executor := newImportExecutor( + ctx, + ":4000", + &proto.Task{ + ID: 1, + }, + nil, + ).(*importExecutor) + + require.NotNil(t, executor.BaseTaskExecutor.Extension) + require.True(t, executor.IsIdempotent(&proto.Subtask{})) + + for _, step := range []proto.Step{ + StepImport, + StepEncodeAndSort, + StepMergeSort, + StepWriteAndIngest, + StepPostProcess, + } { + exe, err := executor.GetStepExecutor(ctx, &proto.Task{Step: step, Meta: []byte("{}")}, nil, nil) + require.NoError(t, err) + require.NotNil(t, exe) + } + _, err := executor.GetStepExecutor(ctx, &proto.Task{Step: proto.StepInit, Meta: []byte("{}")}, nil, nil) + require.Error(t, err) + _, err = executor.GetStepExecutor(ctx, &proto.Task{Step: StepImport, Meta: []byte("")}, nil, nil) + require.Error(t, err) +} diff --git a/pkg/disttask/importinto/task_executor_testkit_test.go b/pkg/disttask/importinto/task_executor_testkit_test.go new file mode 100644 index 0000000000000..3458dbeef69a0 --- /dev/null +++ b/pkg/disttask/importinto/task_executor_testkit_test.go @@ -0,0 +1,91 @@ +// Copyright 2023 PingCAP, 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. + +package importinto_test + +import ( + "context" + "encoding/json" + "strconv" + "testing" + + "github.com/pingcap/tidb/br/pkg/lightning/config" + "github.com/pingcap/tidb/pkg/disttask/framework/proto" + "github.com/pingcap/tidb/pkg/disttask/importinto" + "github.com/pingcap/tidb/pkg/executor/importer" + "github.com/pingcap/tidb/pkg/parser/model" + "github.com/pingcap/tidb/pkg/session" + "github.com/pingcap/tidb/pkg/testkit" + "github.com/stretchr/testify/require" + "go.uber.org/zap" +) + +func TestPostProcessStepExecutor(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + + asInt := func(s string) int { + v, err := strconv.Atoi(s) + require.NoError(t, err) + return v + } + + tk.MustExec("use test") + tk.MustExec("create table t (a int primary key, b int)") + tk.MustExec("insert into t values (1, 2), (3, 4)") + res := tk.MustQuery("admin checksum table t").Rows() + stepMeta := &importinto.PostProcessStepMeta{ + Checksum: importinto.Checksum{ + Sum: uint64(asInt(res[0][2].(string))), + KVs: uint64(asInt(res[0][3].(string))), + Size: uint64(asInt(res[0][4].(string))), + }, + } + + dom, err := session.GetDomain(store) + require.NoError(t, err) + table, err := dom.InfoSchema().TableByName(model.NewCIStr("test"), model.NewCIStr("t")) + require.NoError(t, err) + taskMeta := &importinto.TaskMeta{ + Plan: importer.Plan{ + Checksum: config.OpLevelRequired, + TableInfo: table.Meta(), + DesiredTableInfo: table.Meta(), + DBName: "test", + }, + } + + bytes, err := json.Marshal(stepMeta) + require.NoError(t, err) + executor := importinto.NewPostProcessStepExecutor(1, taskMeta, zap.NewExample()) + err = executor.RunSubtask(context.Background(), &proto.Subtask{Meta: bytes}) + require.NoError(t, err) + + stepMeta.Checksum.Sum += 1 + bytes, err = json.Marshal(stepMeta) + require.NoError(t, err) + executor = importinto.NewPostProcessStepExecutor(1, taskMeta, zap.NewExample()) + err = executor.RunSubtask(context.Background(), &proto.Subtask{Meta: bytes}) + require.ErrorContains(t, err, "checksum mismatched remote vs local") + + taskMeta.Plan.Checksum = config.OpLevelOptional + executor = importinto.NewPostProcessStepExecutor(1, taskMeta, zap.NewExample()) + err = executor.RunSubtask(context.Background(), &proto.Subtask{Meta: bytes}) + require.NoError(t, err) + + taskMeta.Plan.Checksum = config.OpLevelOff + executor = importinto.NewPostProcessStepExecutor(1, taskMeta, zap.NewExample()) + err = executor.RunSubtask(context.Background(), &proto.Subtask{Meta: bytes}) + require.NoError(t, err) +} diff --git a/pkg/domain/BUILD.bazel b/pkg/domain/BUILD.bazel index 7f70278cf5dd6..8bd86d46c8785 100644 --- a/pkg/domain/BUILD.bazel +++ b/pkg/domain/BUILD.bazel @@ -11,6 +11,7 @@ go_library( "optimize_trace.go", "plan_replayer.go", "plan_replayer_dump.go", + "ru_stats.go", "runaway.go", "schema_checker.go", "schema_validator.go", @@ -29,9 +30,9 @@ go_library( "//pkg/ddl/placement", "//pkg/ddl/schematracker", "//pkg/ddl/util", - "//pkg/disttask/framework/dispatcher", "//pkg/disttask/framework/scheduler", "//pkg/disttask/framework/storage", + "//pkg/disttask/framework/taskexecutor", "//pkg/domain/globalconfigsync", "//pkg/domain/infosync", "//pkg/domain/metrics", @@ -43,8 +44,10 @@ go_library( "//pkg/keyspace", "//pkg/kv", "//pkg/meta", + "//pkg/meta/autoid", "//pkg/metrics", "//pkg/owner", + "//pkg/parser", "//pkg/parser/ast", "//pkg/parser/model", "//pkg/parser/mysql", @@ -103,7 +106,6 @@ go_library( "@org_golang_google_grpc//:grpc", "@org_golang_google_grpc//backoff", "@org_golang_google_grpc//keepalive", - "@org_golang_x_exp//maps", "@org_uber_go_atomic//:atomic", "@org_uber_go_zap//:zap", ], @@ -121,6 +123,7 @@ go_test( "main_test.go", "plan_replayer_handle_test.go", "plan_replayer_test.go", + "ru_stats_test.go", "schema_checker_test.go", "schema_validator_test.go", "session_pool_test.go", @@ -128,12 +131,13 @@ go_test( ], embed = [":domain"], flaky = True, - shard_count = 23, + shard_count = 27, deps = [ "//pkg/config", "//pkg/ddl", "//pkg/domain/infosync", "//pkg/errno", + "//pkg/infoschema", "//pkg/keyspace", "//pkg/kv", "//pkg/metrics", @@ -157,6 +161,7 @@ go_test( "@com_github_pingcap_errors//:errors", "@com_github_pingcap_failpoint//:failpoint", "@com_github_pingcap_kvproto//pkg/metapb", + "@com_github_pingcap_kvproto//pkg/resource_manager", "@com_github_prometheus_client_model//go", "@com_github_stretchr_testify//require", "@com_github_tikv_client_go_v2//oracle", diff --git a/pkg/domain/domain.go b/pkg/domain/domain.go index d9bd664fd036f..670e0cbb8a68a 100644 --- a/pkg/domain/domain.go +++ b/pkg/domain/domain.go @@ -40,9 +40,9 @@ import ( "github.com/pingcap/tidb/pkg/ddl/placement" "github.com/pingcap/tidb/pkg/ddl/schematracker" ddlutil "github.com/pingcap/tidb/pkg/ddl/util" - "github.com/pingcap/tidb/pkg/disttask/framework/dispatcher" "github.com/pingcap/tidb/pkg/disttask/framework/scheduler" "github.com/pingcap/tidb/pkg/disttask/framework/storage" + "github.com/pingcap/tidb/pkg/disttask/framework/taskexecutor" "github.com/pingcap/tidb/pkg/domain/globalconfigsync" "github.com/pingcap/tidb/pkg/domain/infosync" "github.com/pingcap/tidb/pkg/domain/resourcegroup" @@ -53,8 +53,10 @@ import ( "github.com/pingcap/tidb/pkg/keyspace" "github.com/pingcap/tidb/pkg/kv" "github.com/pingcap/tidb/pkg/meta" + "github.com/pingcap/tidb/pkg/meta/autoid" "github.com/pingcap/tidb/pkg/metrics" "github.com/pingcap/tidb/pkg/owner" + "github.com/pingcap/tidb/pkg/parser" "github.com/pingcap/tidb/pkg/parser/ast" "github.com/pingcap/tidb/pkg/parser/model" "github.com/pingcap/tidb/pkg/parser/mysql" @@ -130,7 +132,7 @@ type Domain struct { store kv.Storage infoCache *infoschema.InfoCache privHandle *privileges.Handle - bindHandle atomic.Pointer[bindinfo.BindHandle] + bindHandle atomic.Value statsHandle atomic.Pointer[handle.Handle] statsLease time.Duration ddl ddl.DDL @@ -142,6 +144,8 @@ type Domain struct { exit chan struct{} // `etcdClient` must be used when keyspace is not set, or when the logic to each etcd path needs to be separated by keyspace. etcdClient *clientv3.Client + // autoidClient is used when there are tables with AUTO_ID_CACHE=1, it is the client to the autoid service. + autoidClient *autoid.ClientDiscover // `unprefixedEtcdCli` will never set the etcd namespace prefix by keyspace. // It is only used in storeMinStartTS and RemoveMinStartTS now. // It must be used when the etcd path isn't needed to separate by keyspace. @@ -155,7 +159,7 @@ type Domain struct { // TODO: use Run for each process in future pr wg *util.WaitGroupEnhancedWrapper statsUpdating atomicutil.Int32 - cancel context.CancelFunc + cancelFns []context.CancelFunc indexUsageSyncLease time.Duration dumpFileGcChecker *dumpFileGcChecker planReplayerHandle *planReplayerHandle @@ -336,7 +340,7 @@ func (do *Domain) sysFacHack() (pools.Resource, error) { return do.sysExecutorFactory(do) } -func (do *Domain) fetchPolicies(m *meta.Meta) ([]*model.PolicyInfo, error) { +func (*Domain) fetchPolicies(m *meta.Meta) ([]*model.PolicyInfo, error) { allPolicies, err := m.ListPolicies() if err != nil { return nil, err @@ -344,7 +348,7 @@ func (do *Domain) fetchPolicies(m *meta.Meta) ([]*model.PolicyInfo, error) { return allPolicies, nil } -func (do *Domain) fetchResourceGroups(m *meta.Meta) ([]*model.ResourceGroupInfo, error) { +func (*Domain) fetchResourceGroups(m *meta.Meta) ([]*model.ResourceGroupInfo, error) { allResourceGroups, err := m.ListResourceGroups() if err != nil { return nil, err @@ -376,7 +380,7 @@ func (do *Domain) fetchAllSchemasWithTables(m *meta.Meta) ([]*model.DBInfo, erro // so we decrease the concurrency. const fetchSchemaConcurrency = 1 -func (do *Domain) splitForConcurrentFetch(schemas []*model.DBInfo) [][]*model.DBInfo { +func (*Domain) splitForConcurrentFetch(schemas []*model.DBInfo) [][]*model.DBInfo { groupSize := (len(schemas) + fetchSchemaConcurrency - 1) / fetchSchemaConcurrency splitted := make([][]*model.DBInfo, 0, fetchSchemaConcurrency) schemaCnt := len(schemas) @@ -390,7 +394,7 @@ func (do *Domain) splitForConcurrentFetch(schemas []*model.DBInfo) [][]*model.DB return splitted } -func (do *Domain) fetchSchemasWithTables(schemas []*model.DBInfo, m *meta.Meta, done chan error) { +func (*Domain) fetchSchemasWithTables(schemas []*model.DBInfo, m *meta.Meta, done chan error) { for _, di := range schemas { if di.State != model.StatePublic { // schema is not public, can't be used outside. @@ -452,7 +456,7 @@ func (do *Domain) tryLoadSchemaDiffs(m *meta.Meta, usedVersion, newVersion int64 if diff.RegenerateSchemaMap { return nil, nil, nil, errors.Errorf("Meets a schema diff with RegenerateSchemaMap flag") } - IDs, err := builder.ApplyDiff(m, diff) + ids, err := builder.ApplyDiff(m, diff) if err != nil { return nil, nil, nil, err } @@ -460,8 +464,8 @@ func (do *Domain) tryLoadSchemaDiffs(m *meta.Meta, usedVersion, newVersion int64 continue } diffTypes = append(diffTypes, diff.Type.String()) - phyTblIDs = append(phyTblIDs, IDs...) - for i := 0; i < len(IDs); i++ { + phyTblIDs = append(phyTblIDs, ids...) + for i := 0; i < len(ids); i++ { actions = append(actions, uint64(diff.Type)) } } @@ -550,7 +554,7 @@ func (do *Domain) Store() kv.Storage { } // GetScope gets the status variables scope. -func (do *Domain) GetScope(status string) variable.ScopeFlag { +func (*Domain) GetScope(string) variable.ScopeFlag { // Now domain status variables scope are all default scope. return variable.DefaultStatusVarScopeFlag } @@ -591,7 +595,7 @@ func (do *Domain) Reload() error { if err != nil { if version = getFlashbackStartTSFromErrorMsg(err); version != 0 { // use the lastest available version to create domain - version -= 1 + version-- is, hitCache, oldSchemaVersion, changes, err = do.loadInfoSchema(version) } } @@ -1032,12 +1036,12 @@ func (do *Domain) Close() { } do.slowQuery.Close() - if do.cancel != nil { - do.cancel() + for _, f := range do.cancelFns { + f() } do.wg.Wait() do.sysSessionPool.Close() - variable.UnregisterStatistics(do.bindHandle.Load()) + variable.UnregisterStatistics(do.BindHandle()) if do.onClose != nil { do.onClose() } @@ -1139,6 +1143,8 @@ func (do *Domain) Init( do.etcdClient = cli + do.autoidClient = autoid.NewClientDiscover(cli) + unprefixedEtcdCli, err := newEtcdCli(addrs, ebd) if err != nil { return errors.Trace(err) @@ -1158,7 +1164,7 @@ func (do *Domain) Init( } sysCtxPool := pools.NewResourcePool(sysFac, 128, 128, resourceIdleTimeout) ctx, cancelFunc := context.WithCancel(context.Background()) - do.cancel = cancelFunc + do.cancelFns = append(do.cancelFns, cancelFunc) var callback ddl.Callback newCallbackFunc, err := ddl.GetCustomizedHook("default_hook") if err != nil { @@ -1170,6 +1176,7 @@ func (do *Domain) Init( ctx, ddl.WithEtcdClient(do.etcdClient), ddl.WithStore(do.store), + ddl.WithAutoIDClient(do.autoidClient), ddl.WithInfoCache(do.infoCache), ddl.WithHook(callback), ddl.WithLease(ddlLease), @@ -1271,6 +1278,7 @@ func (do *Domain) Init( do.wg.Run(do.globalConfigSyncerKeeper, "globalConfigSyncerKeeper") do.wg.Run(do.runawayRecordFlushLoop, "runawayRecordFlushLoop") do.wg.Run(do.runawayWatchSyncLoop, "runawayWatchSyncLoop") + do.wg.Run(do.requestUnitsWriterLoop, "requestUnitsWriterLoop") if !skipRegisterToDashboard { do.wg.Run(do.topologySyncerKeeper, "topologySyncerKeeper") } @@ -1415,7 +1423,7 @@ func (do *Domain) checkReplicaRead(ctx context.Context, pdClient pd.Client) erro for _, s := range servers { if v, ok := s.Labels[placement.DCLabelKey]; ok && v != "" { if _, ok := storeZones[v]; ok { - storeZones[v] += 1 + storeZones[v]++ if v == zone { svrIdsInThisZone = append(svrIdsInThisZone, s.ID) } @@ -1451,7 +1459,8 @@ func (do *Domain) checkReplicaRead(ctx context.Context, pdClient pd.Client) erro } // InitDistTaskLoop initializes the distributed task framework. -func (do *Domain) InitDistTaskLoop(ctx context.Context) error { +func (do *Domain) InitDistTaskLoop() error { + ctx := kv.WithInternalSourceType(context.Background(), kv.InternalDistTask) failpoint.Inject("MockDisableDistTask", func(val failpoint.Value) { if val.(bool) { failpoint.Return(nil) @@ -1471,52 +1480,59 @@ func (do *Domain) InitDistTaskLoop(ctx context.Context) error { errMsg := fmt.Sprintf("TiDB node ID( = %s ) not found in available TiDB nodes list", do.ddl.GetID()) return errors.New(errMsg) } - schedulerManager, err := scheduler.NewManagerBuilder().BuildManager(ctx, serverID, taskManager) + managerCtx, cancel := context.WithCancel(ctx) + do.cancelFns = append(do.cancelFns, cancel) + executorManager, err := taskexecutor.NewManagerBuilder().BuildManager(managerCtx, serverID, taskManager) if err != nil { return err } storage.SetTaskManager(taskManager) + if err = executorManager.InitMeta(); err != nil { + // executor manager loop will try to recover meta repeatedly, so we can + // just log the error here. + logutil.BgLogger().Warn("init task executor manager meta failed", zap.Error(err)) + } do.wg.Run(func() { defer func() { storage.SetTaskManager(nil) }() - do.distTaskFrameworkLoop(ctx, taskManager, schedulerManager, serverID) + do.distTaskFrameworkLoop(ctx, taskManager, executorManager, serverID) }, "distTaskFrameworkLoop") return nil } -func (do *Domain) distTaskFrameworkLoop(ctx context.Context, taskManager *storage.TaskManager, schedulerManager *scheduler.Manager, serverID string) { - err := schedulerManager.Start() +func (do *Domain) distTaskFrameworkLoop(ctx context.Context, taskManager *storage.TaskManager, executorManager *taskexecutor.Manager, serverID string) { + err := executorManager.Start() if err != nil { - logutil.BgLogger().Error("dist task scheduler manager start failed", zap.Error(err)) + logutil.BgLogger().Error("dist task executor manager start failed", zap.Error(err)) return } - logutil.BgLogger().Info("dist task scheduler manager started") + logutil.BgLogger().Info("dist task executor manager started") defer func() { - logutil.BgLogger().Info("stopping dist task scheduler manager") - schedulerManager.Stop() - logutil.BgLogger().Info("dist task scheduler manager stopped") + logutil.BgLogger().Info("stopping dist task executor manager") + executorManager.Stop() + logutil.BgLogger().Info("dist task executor manager stopped") }() - var dispatcherManager *dispatcher.Manager - startDispatchIfNeeded := func() { - if dispatcherManager != nil && dispatcherManager.Inited() { + var schedulerManager *scheduler.Manager + startSchedulerMgrIfNeeded := func() { + if schedulerManager != nil && schedulerManager.Initialized() { return } var err error - dispatcherManager, err = dispatcher.NewManager(ctx, taskManager, serverID) + schedulerManager, err = scheduler.NewManager(ctx, taskManager, serverID) if err != nil { - logutil.BgLogger().Error("failed to create a dist task dispatcher manager", zap.Error(err)) + logutil.BgLogger().Error("failed to create a dist task scheduler manager", zap.Error(err)) return } - dispatcherManager.Start() + schedulerManager.Start() } - stopDispatchIfNeeded := func() { - if dispatcherManager != nil && dispatcherManager.Inited() { - logutil.BgLogger().Info("stopping dist task dispatcher manager because the current node is not DDL owner anymore", zap.String("id", do.ddl.GetID())) - dispatcherManager.Stop() - logutil.BgLogger().Info("dist task dispatcher manager stopped", zap.String("id", do.ddl.GetID())) + stopSchedulerMgrIfNeeded := func() { + if schedulerManager != nil && schedulerManager.Initialized() { + logutil.BgLogger().Info("stopping dist task scheduler manager because the current node is not DDL owner anymore", zap.String("id", do.ddl.GetID())) + schedulerManager.Stop() + logutil.BgLogger().Info("dist task scheduler manager stopped", zap.String("id", do.ddl.GetID())) } } @@ -1524,13 +1540,13 @@ func (do *Domain) distTaskFrameworkLoop(ctx context.Context, taskManager *storag for { select { case <-do.exit: - stopDispatchIfNeeded() + stopSchedulerMgrIfNeeded() return case <-ticker.C: if do.ddl.OwnerManager().IsOwner() { - startDispatchIfNeeded() + startSchedulerMgrIfNeeded() } else { - stopDispatchIfNeeded() + stopSchedulerMgrIfNeeded() } } } @@ -1622,6 +1638,11 @@ func (do *Domain) GetEtcdClient() *clientv3.Client { return do.etcdClient } +// AutoIDClient returns the autoid client. +func (do *Domain) AutoIDClient() *autoid.ClientDiscover { + return do.autoidClient +} + // GetPDClient returns the PD client. func (do *Domain) GetPDClient() pd.Client { if store, ok := do.store.(kv.StorageWithPD); ok { @@ -1821,8 +1842,12 @@ func (do *Domain) PrivilegeHandle() *privileges.Handle { } // BindHandle returns domain's bindHandle. -func (do *Domain) BindHandle() *bindinfo.BindHandle { - return do.bindHandle.Load() +func (do *Domain) BindHandle() bindinfo.GlobalBindingHandle { + v := do.bindHandle.Load() + if v == nil { + return nil + } + return v.(bindinfo.GlobalBindingHandle) } // LoadBindInfoLoop create a goroutine loads BindInfo in a loop, it should @@ -1830,18 +1855,17 @@ func (do *Domain) BindHandle() *bindinfo.BindHandle { func (do *Domain) LoadBindInfoLoop(ctxForHandle sessionctx.Context, ctxForEvolve sessionctx.Context) error { ctxForHandle.GetSessionVars().InRestrictedSQL = true ctxForEvolve.GetSessionVars().InRestrictedSQL = true - if !do.bindHandle.CompareAndSwap(nil, bindinfo.NewBindHandle(ctxForHandle)) { - do.bindHandle.Load().Reset(ctxForHandle) + if !do.bindHandle.CompareAndSwap(nil, bindinfo.NewGlobalBindingHandle(do.sysSessionPool)) { + do.BindHandle().Reset() } - err := do.bindHandle.Load().Update(true) + err := do.BindHandle().LoadFromStorageToCache(true) if err != nil || bindinfo.Lease == 0 { return err } owner := do.newOwnerManager(bindinfo.Prompt, bindinfo.OwnerKey) do.globalBindHandleWorkerLoop(owner) - do.handleEvolvePlanTasksLoop(ctxForEvolve, owner) return nil } @@ -1861,25 +1885,25 @@ func (do *Domain) globalBindHandleWorkerLoop(owner owner.Manager) { for { select { case <-do.exit: + owner.Cancel() return case <-bindWorkerTicker.C: - bindHandle := do.bindHandle.Load() - err := bindHandle.Update(false) + bindHandle := do.BindHandle() + err := bindHandle.LoadFromStorageToCache(false) if err != nil { logutil.BgLogger().Error("update bindinfo failed", zap.Error(err)) } - bindHandle.DropInvalidBindRecord() + bindHandle.DropInvalidGlobalBinding() // Get Global optVal, err := do.GetGlobalVar(variable.TiDBCapturePlanBaseline) if err == nil && variable.TiDBOptOn(optVal) { bindHandle.CaptureBaselines() } - bindHandle.SaveEvolveTasksToStore() case <-gcBindTicker.C: if !owner.IsOwner() { continue } - err := do.bindHandle.Load().GCBindRecord() + err := do.BindHandle().GCGlobalBinding() if err != nil { logutil.BgLogger().Error("GC bind record failed", zap.Error(err)) } @@ -1888,35 +1912,11 @@ func (do *Domain) globalBindHandleWorkerLoop(owner owner.Manager) { }, "globalBindHandleWorkerLoop") } -func (do *Domain) handleEvolvePlanTasksLoop(ctx sessionctx.Context, owner owner.Manager) { - do.wg.Run(func() { - defer func() { - logutil.BgLogger().Info("handleEvolvePlanTasksLoop exited.") - }() - defer util.Recover(metrics.LabelDomain, "handleEvolvePlanTasksLoop", nil, false) - - for { - select { - case <-do.exit: - owner.Cancel() - return - case <-time.After(bindinfo.Lease): - } - if owner.IsOwner() { - err := do.bindHandle.Load().HandleEvolvePlanTask(ctx, false) - if err != nil { - logutil.BgLogger().Info("evolve plan failed", zap.Error(err)) - } - } - } - }, "handleEvolvePlanTasksLoop") -} - // TelemetryReportLoop create a goroutine that reports usage data in a loop, it should be called only once // in BootstrapSession. func (do *Domain) TelemetryReportLoop(ctx sessionctx.Context) { ctx.GetSessionVars().InRestrictedSQL = true - err := telemetry.InitialRun(ctx, do.GetEtcdClient()) + err := telemetry.InitialRun(ctx, do.etcdClient) if err != nil { logutil.BgLogger().Warn("Initial telemetry run failed", zap.Error(err)) } @@ -1937,7 +1937,7 @@ func (do *Domain) TelemetryReportLoop(ctx sessionctx.Context) { if !owner.IsOwner() { continue } - err := telemetry.ReportUsageData(ctx, do.GetEtcdClient()) + err := telemetry.ReportUsageData(ctx, do.etcdClient) if err != nil { // Only status update errors will be printed out logutil.BgLogger().Warn("TelemetryReportLoop status update failed", zap.Error(err)) @@ -2272,7 +2272,7 @@ func (do *Domain) UpdateTableStatsLoop(ctx, initStatsCtx sessionctx.Context) err do.SetStatsUpdating(true) do.wg.Run(func() { do.updateStatsWorker(ctx, owner) }, "updateStatsWorker") do.wg.Run(func() { do.autoAnalyzeWorker(owner) }, "autoAnalyzeWorker") - do.wg.Run(func() { do.gcAnalyzeHistory(owner) }, "gcAnalyzeHistory") + do.wg.Run(func() { do.analyzeJobsCleanupWorker(owner) }, "analyzeJobsCleanupWorker") return nil } @@ -2285,6 +2285,9 @@ func quitStatsOwner(do *Domain, mgr owner.Manager) { func (do *Domain) StartLoadStatsSubWorkers(ctxList []sessionctx.Context) { statsHandle := do.StatsHandle() for i, ctx := range ctxList { + // The sync load will affect how optimizer choose the plan. + // We need to assign high priority to it so that we can get the stats as quick as we can. + ctx.GetSessionVars().StmtCtx.Priority = mysql.HighPriority statsHandle.SetSubCtxs(i, ctx) do.wg.Add(1) go statsHandle.SubLoadWorker(ctx, do.exit, do.wg) @@ -2385,13 +2388,13 @@ func (do *Domain) syncIndexUsageWorker(owner owner.Manager) { continue } if err := handle.GCIndexUsage(); err != nil { - statslogutil.StatsLogger.Error("gc index usage failed", zap.Error(err)) + statslogutil.StatsLogger().Error("gc index usage failed", zap.Error(err)) } } } } -func (do *Domain) updateStatsWorkerExitPreprocessing(statsHandle *handle.Handle, owner owner.Manager) { +func (*Domain) updateStatsWorkerExitPreprocessing(statsHandle *handle.Handle, owner owner.Manager) { ch := make(chan struct{}, 1) timeout, cancel := context.WithTimeout(context.Background(), 10*time.Second) defer cancel() @@ -2412,7 +2415,7 @@ func (do *Domain) updateStatsWorkerExitPreprocessing(statsHandle *handle.Handle, } } -func (do *Domain) updateStatsWorker(ctx sessionctx.Context, owner owner.Manager) { +func (do *Domain) updateStatsWorker(_ sessionctx.Context, owner owner.Manager) { defer util.Recover(metrics.LabelDomain, "updateStatsWorker", nil, false) logutil.BgLogger().Info("updateStatsWorker started.") lease := do.statsLease @@ -2481,7 +2484,7 @@ func (do *Domain) autoAnalyzeWorker(owner owner.Manager) { select { case <-analyzeTicker.C: if variable.RunAutoAnalyze.Load() && !do.stopAutoAnalyze.Load() && owner.IsOwner() { - statsHandle.HandleAutoAnalyze(do.InfoSchema()) + statsHandle.HandleAutoAnalyze() } case <-do.exit: return @@ -2489,32 +2492,82 @@ func (do *Domain) autoAnalyzeWorker(owner owner.Manager) { } } -func (do *Domain) gcAnalyzeHistory(owner owner.Manager) { - defer util.Recover(metrics.LabelDomain, "gcAnalyzeHistory", nil, false) +// analyzeJobsCleanupWorker is a background worker that periodically performs two main tasks: +// +// 1. Garbage Collection: It removes outdated analyze jobs from the statistics handle. +// This operation is performed every hour and only if the current instance is the owner. +// Analyze jobs older than 7 days are considered outdated and are removed. +// +// 2. Cleanup: It cleans up corrupted analyze jobs. +// A corrupted analyze job is one that is in a 'pending' or 'running' state, +// but is associated with a TiDB instance that is either not currently running or has been restarted. +// This operation is performed every 100 stats leases. +// It first retrieves the list of current analyze processes, then removes any analyze job +// that is not associated with a current process. Additionally, if the current instance is the owner, +// it also cleans up corrupted analyze jobs on dead instances. +func (do *Domain) analyzeJobsCleanupWorker(owner owner.Manager) { + defer util.Recover(metrics.LabelDomain, "analyzeJobsCleanupWorker", nil, false) + // For GC. const gcInterval = time.Hour - statsHandle := do.StatsHandle() + const daysToKeep = 7 gcTicker := time.NewTicker(gcInterval) + // For clean up. + // Default stats lease is 3 * time.Second. + // So cleanupInterval is 100 * 3 * time.Second = 5 * time.Minute. + var cleanupInterval = do.statsLease * 100 + cleanupTicker := time.NewTicker(cleanupInterval) defer func() { gcTicker.Stop() - logutil.BgLogger().Info("gcAnalyzeHistory exited.") + cleanupTicker.Stop() + logutil.BgLogger().Info("analyzeJobsCleanupWorker exited.") }() + statsHandle := do.StatsHandle() for { select { case <-gcTicker.C: + // Only the owner should perform this operation. if owner.IsOwner() { - const DaysToKeep = 7 - updateTime := time.Now().AddDate(0, 0, -DaysToKeep) + updateTime := time.Now().AddDate(0, 0, -daysToKeep) err := statsHandle.DeleteAnalyzeJobs(updateTime) if err != nil { logutil.BgLogger().Warn("gc analyze history failed", zap.Error(err)) } } + case <-cleanupTicker.C: + sm := do.InfoSyncer().GetSessionManager() + if sm == nil { + continue + } + analyzeProcessIDs := make(map[uint64]struct{}, 8) + for _, process := range sm.ShowProcessList() { + if isAnalyzeTableSQL(process.Info) { + analyzeProcessIDs[process.ID] = struct{}{} + } + } + + err := statsHandle.CleanupCorruptedAnalyzeJobsOnCurrentInstance(analyzeProcessIDs) + if err != nil { + logutil.BgLogger().Warn("cleanup analyze jobs on current instance failed", zap.Error(err)) + } + + if owner.IsOwner() { + err = statsHandle.CleanupCorruptedAnalyzeJobsOnDeadInstances() + if err != nil { + logutil.BgLogger().Warn("cleanup analyze jobs on dead instances failed", zap.Error(err)) + } + } case <-do.exit: return } } } +func isAnalyzeTableSQL(sql string) bool { + // Get rid of the comments. + normalizedSQL := parser.Normalize(sql) + return strings.HasPrefix(normalizedSQL, "analyze table") +} + // ExpensiveQueryHandle returns the expensive query handle. func (do *Domain) ExpensiveQueryHandle() *expensivequery.Handle { return do.expensiveQueryHandle @@ -2776,7 +2829,7 @@ func (do *Domain) acquireServerID(ctx context.Context) error { } } -func (do *Domain) releaseServerID(ctx context.Context) { +func (do *Domain) releaseServerID(context.Context) { serverID := do.ServerID() if serverID == 0 { return @@ -2796,7 +2849,7 @@ func (do *Domain) releaseServerID(ctx context.Context) { } // propose server ID by random. -func (do *Domain) proposeServerID(ctx context.Context, conflictCnt int) (uint64, error) { +func (*Domain) proposeServerID(ctx context.Context, conflictCnt int) (uint64, error) { // get a random server ID in range [min, max] randomServerID := func(min uint64, max uint64) uint64 { return uint64(rand.Int63n(int64(max-min+1)) + int64(min)) // #nosec G404 diff --git a/pkg/domain/domain_sysvars.go b/pkg/domain/domain_sysvars.go index fd60670e57e60..f1c32116fb978 100644 --- a/pkg/domain/domain_sysvars.go +++ b/pkg/domain/domain_sysvars.go @@ -69,10 +69,19 @@ func (do *Domain) setPDClientDynamicOption(name, sVal string) { break } variable.EnableTSOFollowerProxy.Store(val) + case variable.PDEnableFollowerHandleRegion: + val := variable.TiDBOptOn(sVal) + // Note: EnableFollowerHandle is only used for region API now. + // If pd support more APIs in follower, the pd option may be changed. + err := do.updatePDClient(pd.EnableFollowerHandle, val) + if err != nil { + break + } + variable.EnablePDFollowerHandleRegion.Store(val) } } -func (do *Domain) setGlobalResourceControl(enable bool) { +func (*Domain) setGlobalResourceControl(enable bool) { if enable { variable.EnableGlobalResourceControlFunc() } else { diff --git a/pkg/domain/domain_test.go b/pkg/domain/domain_test.go index 861b6b71b465e..8b026e4044ff6 100644 --- a/pkg/domain/domain_test.go +++ b/pkg/domain/domain_test.go @@ -58,6 +58,7 @@ func TestInfo(t *testing.T) { t.Skip("ETCD use ip:port as unix socket address, skip when it is unavailable.") } + // NOTICE: this failpoint has been REMOVED, be aware of this if you want to reopen this test. require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/domain/infosync/FailPlacement", `return(true)`)) s, err := mockstore.NewMockStore() @@ -423,3 +424,46 @@ type mockInfoPdClient struct { func (c *mockInfoPdClient) GetAllStores(context.Context, ...pd.GetStoreOption) ([]*metapb.Store, error) { return c.stores, c.err } + +func TestIsAnalyzeTableSQL(t *testing.T) { + tests := []struct { + name string + sql string + }{ + { + name: "normal sql", + sql: "analyze table test.t", + }, + { + name: "normal sql with extra space", + sql: " analyze table test.t ", + }, + { + name: "normal capital sql with extra space", + sql: " ANALYZE TABLE test.t ", + }, + { + name: "single line comment", + sql: "/* axxxx */ analyze table test.t", + }, + { + name: "multi-line comment", + sql: `/* + /*> this is a + /*> multiple-line comment + /*> */ analyze table test.t`, + }, + { + name: "hint comment", + sql: "/*+ hint */ analyze table test.t", + }, + { + name: "no space", + sql: "/*+ hint */analyze table test.t", + }, + } + + for _, tt := range tests { + require.True(t, isAnalyzeTableSQL(tt.sql)) + } +} diff --git a/pkg/domain/domainctx.go b/pkg/domain/domainctx.go index 67aeac5876bb5..c541b289365cb 100644 --- a/pkg/domain/domainctx.go +++ b/pkg/domain/domainctx.go @@ -22,7 +22,7 @@ import ( type domainKeyType int // String defines a Stringer function for debugging and pretty printing. -func (k domainKeyType) String() string { +func (domainKeyType) String() string { return "domain" } diff --git a/pkg/domain/extract.go b/pkg/domain/extract.go index 391adb46b6f42..7999a57c4afca 100644 --- a/pkg/domain/extract.go +++ b/pkg/domain/extract.go @@ -62,8 +62,7 @@ const ( ) func taskTypeToString(t ExtractType) string { - switch t { - case ExtractPlanType: + if t == ExtractPlanType { return "Plan" } return "Unknown" @@ -131,8 +130,7 @@ func newExtractWorker(sctx sessionctx.Context, isBackgroundWorker bool) *extract } func (w *extractWorker) extractTask(ctx context.Context, task *ExtractTask) (string, error) { - switch task.ExtractType { - case ExtractPlanType: + if task.ExtractType == ExtractPlanType { return w.extractPlanTask(ctx, task) } return "", errors.New("unknown extract task") @@ -453,8 +451,7 @@ func dumpExtractMeta(task *ExtractTask, zw *zip.Writer) error { } varMap := make(map[string]string) varMap[ExtractTaskType] = taskTypeToString(task.ExtractType) - switch task.ExtractType { - case ExtractPlanType: + if task.ExtractType == ExtractPlanType { varMap[ExtractPlanTaskSkipStats] = strconv.FormatBool(task.SkipStats) } diff --git a/pkg/domain/extract_test.go b/pkg/domain/extract_test.go index 02d0aa898238b..c0f9a6b76d72a 100644 --- a/pkg/domain/extract_test.go +++ b/pkg/domain/extract_test.go @@ -35,6 +35,7 @@ func TestExtractPlanWithoutHistoryView(t *testing.T) { task := domain.NewExtractPlanTask(time.Now(), time.Now()) task.UseHistoryView = false _, err := extractHandler.ExtractTask(context.Background(), task) + defer os.RemoveAll(domain.GetExtractTaskDirName()) require.NoError(t, err) } @@ -46,6 +47,7 @@ func TestExtractWithoutStmtSummaryPersistedEnabled(t *testing.T) { task := domain.NewExtractPlanTask(time.Now(), time.Now()) task.UseHistoryView = true _, err := extractHandler.ExtractTask(context.Background(), task) + defer os.RemoveAll(domain.GetExtractTaskDirName()) require.Error(t, err) } @@ -75,6 +77,7 @@ func TestExtractHandlePlanTask(t *testing.T) { task := domain.NewExtractPlanTask(startTime, end) task.UseHistoryView = true name, err := extractHandler.ExtractTask(context.Background(), task) + defer os.RemoveAll(domain.GetExtractTaskDirName()) require.NoError(t, err) require.True(t, len(name) > 0) } diff --git a/pkg/domain/globalconfigsync/globalconfig_test.go b/pkg/domain/globalconfigsync/globalconfig_test.go index 2ed7e341c8b07..7f3eedb07d0ac 100644 --- a/pkg/domain/globalconfigsync/globalconfig_test.go +++ b/pkg/domain/globalconfigsync/globalconfig_test.go @@ -36,6 +36,7 @@ func TestMain(m *testing.M) { testsetup.SetupForCommonTest() opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), } diff --git a/pkg/domain/infosync/BUILD.bazel b/pkg/domain/infosync/BUILD.bazel index 2680731b34312..2c34d101101d2 100644 --- a/pkg/domain/infosync/BUILD.bazel +++ b/pkg/domain/infosync/BUILD.bazel @@ -34,6 +34,7 @@ go_library( "//pkg/util", "//pkg/util/codec", "//pkg/util/dbterror", + "//pkg/util/engine", "//pkg/util/hack", "//pkg/util/logutil", "//pkg/util/syncutil", @@ -62,7 +63,7 @@ go_test( srcs = ["info_test.go"], embed = [":infosync"], flaky = True, - shard_count = 4, + shard_count = 3, deps = [ "//pkg/ddl/placement", "//pkg/ddl/util", diff --git a/pkg/domain/infosync/info.go b/pkg/domain/infosync/info.go index d60806c0f941b..7bb57a5d268d5 100644 --- a/pkg/domain/infosync/info.go +++ b/pkg/domain/infosync/info.go @@ -48,6 +48,7 @@ import ( "github.com/pingcap/tidb/pkg/sessionctx/variable" util2 "github.com/pingcap/tidb/pkg/util" "github.com/pingcap/tidb/pkg/util/dbterror" + "github.com/pingcap/tidb/pkg/util/engine" "github.com/pingcap/tidb/pkg/util/hack" "github.com/pingcap/tidb/pkg/util/logutil" "github.com/pingcap/tidb/pkg/util/versioninfo" @@ -105,6 +106,7 @@ type InfoSyncer struct { // It must be used when the etcd path isn't needed to separate by keyspace. // See keyspace RFC: https://github.com/pingcap/tidb/pull/39685 unprefixedEtcdCli *clientv3.Client + pdHTTPCli pdhttp.Client info *ServerInfo serverInfoPath string minStartTS uint64 @@ -198,9 +200,15 @@ func GlobalInfoSyncerInit( codec tikv.Codec, skipRegisterToDashBoard bool, ) (*InfoSyncer, error) { + if pdHTTPCli != nil { + pdHTTPCli = pdHTTPCli. + WithCallerID("tidb-info-syncer"). + WithRespHandler(pdResponseHandler) + } is := &InfoSyncer{ etcdCli: etcdCli, unprefixedEtcdCli: unprefixedEtcdCli, + pdHTTPCli: pdHTTPCli, info: getServerInfo(id, serverIDGetter), serverInfoPath: fmt.Sprintf("%s/%s", ServerInformationPath, id), minStartTSPath: fmt.Sprintf("%s/%s", ServerMinStartTSPath, id), @@ -209,14 +217,11 @@ func GlobalInfoSyncerInit( if err != nil { return nil, err } - if pdHTTPCli != nil { - pdHTTPCli = pdHTTPCli.WithRespHandler(pdResponseHandler) - } - is.labelRuleManager = initLabelRuleManager(pdHTTPCli) - is.placementManager = initPlacementManager(etcdCli) - is.scheduleManager = initScheduleManager(etcdCli) - is.tiflashReplicaManager = initTiFlashReplicaManager(etcdCli, codec) - is.resourceManagerClient = initResourceManagerClient(pdCli) + is.initLabelRuleManager() + is.initPlacementManager() + is.initScheduleManager() + is.initTiFlashReplicaManager(codec) + is.initResourceManagerClient(pdCli) setGlobalInfoSyncer(is) return is, nil } @@ -247,22 +252,24 @@ func (is *InfoSyncer) GetSessionManager() util2.SessionManager { return is.managerMu.SessionManager } -func initLabelRuleManager(pdHTTPCli pdhttp.Client) LabelRuleManager { - if pdHTTPCli == nil { - return &mockLabelManager{labelRules: map[string][]byte{}} +func (is *InfoSyncer) initLabelRuleManager() { + if is.pdHTTPCli == nil { + is.labelRuleManager = &mockLabelManager{labelRules: map[string][]byte{}} + return } - return &PDLabelManager{pdHTTPCli} + is.labelRuleManager = &PDLabelManager{is.pdHTTPCli} } -func initPlacementManager(etcdCli *clientv3.Client) PlacementManager { - if etcdCli == nil { - return &mockPlacementManager{} +func (is *InfoSyncer) initPlacementManager() { + if is.pdHTTPCli == nil { + is.placementManager = &mockPlacementManager{} + return } - return &PDPlacementManager{etcdCli: etcdCli} + is.placementManager = &PDPlacementManager{is.pdHTTPCli} } -func initResourceManagerClient(pdCli pd.Client) (cli pd.ResourceManagerClient) { - cli = pdCli +func (is *InfoSyncer) initResourceManagerClient(pdCli pd.Client) { + var cli pd.ResourceManagerClient = pdCli if pdCli == nil { cli = NewMockResourceManagerClient() } @@ -296,23 +303,24 @@ func initResourceManagerClient(pdCli pd.Client) (cli pd.ResourceManagerClient) { } } }) - return + is.resourceManagerClient = cli } -func initTiFlashReplicaManager(etcdCli *clientv3.Client, codec tikv.Codec) TiFlashReplicaManager { - if etcdCli == nil { - m := mockTiFlashReplicaManagerCtx{tiflashProgressCache: make(map[int64]float64)} - return &m +func (is *InfoSyncer) initTiFlashReplicaManager(codec tikv.Codec) { + if is.pdHTTPCli == nil { + is.tiflashReplicaManager = &mockTiFlashReplicaManagerCtx{tiflashProgressCache: make(map[int64]float64)} + return } - logutil.BgLogger().Warn("init TiFlashReplicaManager", zap.Strings("pd addrs", etcdCli.Endpoints())) - return &TiFlashReplicaManagerCtx{etcdCli: etcdCli, tiflashProgressCache: make(map[int64]float64), codec: codec} + logutil.BgLogger().Warn("init TiFlashReplicaManager") + is.tiflashReplicaManager = &TiFlashReplicaManagerCtx{pdHTTPCli: is.pdHTTPCli, tiflashProgressCache: make(map[int64]float64), codec: codec} } -func initScheduleManager(etcdCli *clientv3.Client) ScheduleManager { - if etcdCli == nil { - return &mockScheduleManager{} +func (is *InfoSyncer) initScheduleManager() { + if is.pdHTTPCli == nil { + is.scheduleManager = &mockScheduleManager{} + return } - return &PDScheduleManager{etcdCli: etcdCli} + is.scheduleManager = &PDScheduleManager{is.pdHTTPCli} } // GetMockTiFlash can only be used in tests to get MockTiFlash @@ -431,11 +439,8 @@ func MustGetTiFlashProgress(tableID int64, replicaCount uint64, tiFlashStores *m } stores := make(map[int64]pdhttp.StoreInfo) for _, store := range tikvStats.Stores { - for _, l := range store.Store.Labels { - if l.Key == "engine" && l.Value == "tiflash" { - stores[store.Store.ID] = store - logutil.BgLogger().Debug("Found tiflash store", zap.Int64("id", store.Store.ID), zap.String("Address", store.Store.Address), zap.String("StatusAddress", store.Store.StatusAddress)) - } + if engine.IsTiFlashHTTPResp(&store.Store) { + stores[store.Store.ID] = store } } *tiFlashStores = stores @@ -450,7 +455,7 @@ func MustGetTiFlashProgress(tableID int64, replicaCount uint64, tiFlashStores *m } // pdResponseHandler will be injected into the PD HTTP client to handle the response, -// this is to maintain consistency with the logic in the `doRequest`. +// this is to maintain consistency with the original logic without the PD HTTP client. func pdResponseHandler(resp *http.Response, res interface{}) error { defer func() { terror.Log(resp.Body.Close()) }() bodyBytes, err := io.ReadAll(resp.Body) @@ -475,77 +480,6 @@ func pdResponseHandler(resp *http.Response, res interface{}) error { return nil } -// TODO: replace with the unified PD HTTP client. -func doRequest(ctx context.Context, apiName string, addrs []string, route, method string, body io.Reader) ([]byte, error) { - var ( - err error - req *http.Request - res *http.Response - ) - for idx, addr := range addrs { - url := util2.ComposeURL(addr, route) - req, err = http.NewRequestWithContext(ctx, method, url, body) - if err != nil { - return nil, err - } - if body != nil { - req.Header.Set("Content-Type", "application/json") - } - start := time.Now() - res, err = doRequestWithFailpoint(req) - if err == nil { - metrics.PDAPIExecutionHistogram.WithLabelValues(apiName).Observe(time.Since(start).Seconds()) - metrics.PDAPIRequestCounter.WithLabelValues(apiName, res.Status).Inc() - bodyBytes, err := io.ReadAll(res.Body) - if err != nil { - terror.Log(res.Body.Close()) - return nil, err - } - if res.StatusCode != http.StatusOK { - logutil.BgLogger().Warn("response not 200", - zap.String("method", method), - zap.String("hosts", addr), - zap.String("url", url), - zap.Int("http status", res.StatusCode), - zap.Int("address order", idx), - ) - err = ErrHTTPServiceError.FastGen("%s", bodyBytes) - if res.StatusCode == http.StatusNotFound || res.StatusCode == http.StatusPreconditionFailed { - err = nil - bodyBytes = nil - } - } - terror.Log(res.Body.Close()) - return bodyBytes, err - } - metrics.PDAPIRequestCounter.WithLabelValues(apiName, "network error").Inc() - logutil.BgLogger().Warn("fail to doRequest", - zap.Error(err), - zap.Bool("retry next address", idx == len(addrs)-1), - zap.String("method", method), - zap.String("hosts", addr), - zap.String("url", url), - zap.Int("address order", idx), - ) - } - return nil, err -} - -func doRequestWithFailpoint(req *http.Request) (resp *http.Response, err error) { - fpEnabled := false - failpoint.Inject("FailPlacement", func(val failpoint.Value) { - if val.(bool) { - fpEnabled = true - resp = &http.Response{StatusCode: http.StatusNotFound, Body: http.NoBody} - err = nil - } - }) - if fpEnabled { - return - } - return util2.InternalHTTPClient().Do(req) -} - // GetAllRuleBundles is used to get all rule bundles from PD It is used to load full rules from PD while fullload infoschema. func GetAllRuleBundles(ctx context.Context) ([]*placement.Bundle, error) { is, err := getGlobalInfoSyncer() @@ -1127,12 +1061,12 @@ func GetLabelRules(ctx context.Context, ruleIDs []string) (map[string]*label.Rul } // CalculateTiFlashProgress calculates TiFlash replica progress -func CalculateTiFlashProgress(tableID int64, replicaCount uint64, TiFlashStores map[int64]pdhttp.StoreInfo) (float64, error) { +func CalculateTiFlashProgress(tableID int64, replicaCount uint64, tiFlashStores map[int64]pdhttp.StoreInfo) (float64, error) { is, err := getGlobalInfoSyncer() if err != nil { return 0, errors.Trace(err) } - return is.tiflashReplicaManager.CalculateTiFlashProgress(tableID, replicaCount, TiFlashStores) + return is.tiflashReplicaManager.CalculateTiFlashProgress(tableID, replicaCount, tiFlashStores) } // UpdateTiFlashProgressCache updates tiflashProgressCache @@ -1177,13 +1111,13 @@ func SetTiFlashGroupConfig(ctx context.Context) error { // SetTiFlashPlacementRule is a helper function to set placement rule. // It is discouraged to use SetTiFlashPlacementRule directly, // use `ConfigureTiFlashPDForTable`/`ConfigureTiFlashPDForPartitions` instead. -func SetTiFlashPlacementRule(ctx context.Context, rule placement.TiFlashRule) error { +func SetTiFlashPlacementRule(ctx context.Context, rule pdhttp.Rule) error { is, err := getGlobalInfoSyncer() if err != nil { return errors.Trace(err) } logutil.BgLogger().Info("SetTiFlashPlacementRule", zap.String("ruleID", rule.ID)) - return is.tiflashReplicaManager.SetPlacementRule(ctx, rule) + return is.tiflashReplicaManager.SetPlacementRule(ctx, &rule) } // DeleteTiFlashPlacementRule is to delete placement rule for certain group. @@ -1197,7 +1131,7 @@ func DeleteTiFlashPlacementRule(ctx context.Context, group string, ruleID string } // GetTiFlashGroupRules to get all placement rule in a certain group. -func GetTiFlashGroupRules(ctx context.Context, group string) ([]placement.TiFlashRule, error) { +func GetTiFlashGroupRules(ctx context.Context, group string) ([]*pdhttp.Rule, error) { is, err := getGlobalInfoSyncer() if err != nil { return nil, errors.Trace(err) @@ -1241,7 +1175,7 @@ func ConfigureTiFlashPDForTable(id int64, count uint64, locationLabels *[]string ctx := context.Background() logutil.BgLogger().Info("ConfigureTiFlashPDForTable", zap.Int64("tableID", id), zap.Uint64("count", count)) ruleNew := MakeNewRule(id, count, *locationLabels) - if e := is.tiflashReplicaManager.SetPlacementRule(ctx, ruleNew); e != nil { + if e := is.tiflashReplicaManager.SetPlacementRule(ctx, &ruleNew); e != nil { return errors.Trace(e) } return nil @@ -1254,12 +1188,12 @@ func ConfigureTiFlashPDForPartitions(accel bool, definitions *[]model.PartitionD return errors.Trace(err) } ctx := context.Background() - rules := make([]placement.TiFlashRule, 0, len(*definitions)) + rules := make([]*pdhttp.Rule, 0, len(*definitions)) pids := make([]int64, 0, len(*definitions)) for _, p := range *definitions { logutil.BgLogger().Info("ConfigureTiFlashPDForPartitions", zap.Int64("tableID", tableID), zap.Int64("partID", p.ID), zap.Bool("accel", accel), zap.Uint64("count", count)) ruleNew := MakeNewRule(p.ID, count, *locationLabels) - rules = append(rules, ruleNew) + rules = append(rules, &ruleNew) pids = append(pids, p.ID) } if e := is.tiflashReplicaManager.SetPlacementRuleBatch(ctx, rules); e != nil { @@ -1325,7 +1259,7 @@ func GetPDScheduleConfig(ctx context.Context) (map[string]interface{}, error) { if err != nil { return nil, errors.Trace(err) } - return is.scheduleManager.GetPDScheduleConfig(ctx) + return is.scheduleManager.GetScheduleConfig(ctx) } // SetPDScheduleConfig sets the schedule information for pd @@ -1334,7 +1268,7 @@ func SetPDScheduleConfig(ctx context.Context, config map[string]interface{}) err if err != nil { return errors.Trace(err) } - return is.scheduleManager.SetPDScheduleConfig(ctx, config) + return is.scheduleManager.SetScheduleConfig(ctx, config) } // TiProxyServerInfo is the server info for TiProxy. diff --git a/pkg/domain/infosync/info_test.go b/pkg/domain/infosync/info_test.go index 79c8ebf37e0a6..7896e6e582251 100644 --- a/pkg/domain/infosync/info_test.go +++ b/pkg/domain/infosync/info_test.go @@ -41,6 +41,7 @@ func TestMain(m *testing.M) { testsetup.SetupForCommonTest() opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), @@ -279,43 +280,3 @@ func TestTiFlashManager(t *testing.T) { CloseTiFlashManager(ctx) } - -func TestRuleOp(t *testing.T) { - rule := MakeNewRule(1, 2, []string{"a"}) - ruleOp := RuleOp{ - TiFlashRule: &rule, - Action: RuleOpAdd, - DeleteByIDPrefix: false, - } - j, err := json.Marshal(&ruleOp) - require.NoError(t, err) - ruleOpExpect := &RuleOp{} - json.Unmarshal(j, ruleOpExpect) - require.Equal(t, ruleOp.Action, ruleOpExpect.Action) - require.Equal(t, *ruleOp.TiFlashRule, *ruleOpExpect.TiFlashRule) - ruleOps := make([]RuleOp, 0, 2) - for i := 0; i < 10; i += 2 { - rule := MakeNewRule(int64(i), 2, []string{"a"}) - ruleOps = append(ruleOps, RuleOp{ - TiFlashRule: &rule, - Action: RuleOpAdd, - DeleteByIDPrefix: false, - }) - } - for i := 1; i < 10; i += 2 { - rule := MakeNewRule(int64(i), 2, []string{"b"}) - ruleOps = append(ruleOps, RuleOp{ - TiFlashRule: &rule, - Action: RuleOpDel, - DeleteByIDPrefix: false, - }) - } - j, err = json.Marshal(ruleOps) - require.NoError(t, err) - var ruleOpsExpect []RuleOp - json.Unmarshal(j, &ruleOpsExpect) - for i := 0; i < len(ruleOps); i++ { - require.Equal(t, ruleOps[i].Action, ruleOpsExpect[i].Action) - require.Equal(t, *ruleOps[i].TiFlashRule, *ruleOpsExpect[i].TiFlashRule) - } -} diff --git a/pkg/domain/infosync/label_manager.go b/pkg/domain/infosync/label_manager.go index 0c5d0296136a4..711a0a651ee0b 100644 --- a/pkg/domain/infosync/label_manager.go +++ b/pkg/domain/infosync/label_manager.go @@ -60,7 +60,7 @@ func (lm *PDLabelManager) GetAllLabelRules(ctx context.Context) ([]*label.Rule, } // GetLabelRules implements GetLabelRules -func (lm *PDLabelManager) GetLabelRules(ctx context.Context, ruleIDs []string) (map[string]*label.Rule, error) { +func (lm *PDLabelManager) GetLabelRules(ctx context.Context, _ []string) (map[string]*label.Rule, error) { labelRules, err := lm.pdHTTPCli.GetAllRegionLabelRules(ctx) if err != nil { return nil, err @@ -78,7 +78,7 @@ type mockLabelManager struct { } // PutLabelRule implements PutLabelRule -func (mm *mockLabelManager) PutLabelRule(ctx context.Context, rule *label.Rule) error { +func (mm *mockLabelManager) PutLabelRule(_ context.Context, rule *label.Rule) error { mm.Lock() defer mm.Unlock() if rule == nil { @@ -93,7 +93,7 @@ func (mm *mockLabelManager) PutLabelRule(ctx context.Context, rule *label.Rule) } // UpdateLabelRules implements UpdateLabelRules -func (mm *mockLabelManager) UpdateLabelRules(ctx context.Context, patch *pd.LabelRulePatch) error { +func (mm *mockLabelManager) UpdateLabelRules(_ context.Context, patch *pd.LabelRulePatch) error { mm.Lock() defer mm.Unlock() if patch == nil { @@ -116,7 +116,7 @@ func (mm *mockLabelManager) UpdateLabelRules(ctx context.Context, patch *pd.Labe } // mockLabelManager implements GetAllLabelRules -func (mm *mockLabelManager) GetAllLabelRules(ctx context.Context) ([]*label.Rule, error) { +func (mm *mockLabelManager) GetAllLabelRules(context.Context) ([]*label.Rule, error) { mm.RLock() defer mm.RUnlock() r := make([]*label.Rule, 0, len(mm.labelRules)) @@ -135,7 +135,7 @@ func (mm *mockLabelManager) GetAllLabelRules(ctx context.Context) ([]*label.Rule } // mockLabelManager implements GetLabelRules -func (mm *mockLabelManager) GetLabelRules(ctx context.Context, ruleIDs []string) (map[string]*label.Rule, error) { +func (mm *mockLabelManager) GetLabelRules(_ context.Context, ruleIDs []string) (map[string]*label.Rule, error) { mm.RLock() defer mm.RUnlock() r := make(map[string]*label.Rule, len(ruleIDs)) diff --git a/pkg/domain/infosync/mock_info.go b/pkg/domain/infosync/mock_info.go index 7e9dd2f057996..40a5d0880d726 100644 --- a/pkg/domain/infosync/mock_info.go +++ b/pkg/domain/infosync/mock_info.go @@ -56,23 +56,17 @@ func (m *MockGlobalServerInfoManager) Delete(idx int) error { return nil } -// DeleteByID delete ServerInfo by host:port. -func (m *MockGlobalServerInfoManager) DeleteByID(id string) error { +// DeleteByExecID delete ServerInfo by execID. +func (m *MockGlobalServerInfoManager) DeleteByExecID(execID string) { m.mu.Lock() defer m.mu.Unlock() - idx := -1 for i := 0; i < len(m.infos); i++ { name := fmt.Sprintf("%s:%d", m.infos[i].IP, m.infos[i].Port) - if name == id { - idx = i + if name == execID { + m.infos = append(m.infos[:i], m.infos[i+1:]...) break } } - if idx == -1 { - return nil - } - m.infos = append(m.infos[:idx], m.infos[idx+1:]...) - return nil } // GetAllServerInfo return all serverInfo in a map. diff --git a/pkg/domain/infosync/placement_manager.go b/pkg/domain/infosync/placement_manager.go index 2d1597bf8f0e3..2d9de6a24d3e4 100644 --- a/pkg/domain/infosync/placement_manager.go +++ b/pkg/domain/infosync/placement_manager.go @@ -15,18 +15,11 @@ package infosync import ( - "bytes" "context" - "encoding/json" - "net/http" - "path" "sync" - "github.com/pingcap/log" "github.com/pingcap/tidb/pkg/ddl/placement" pd "github.com/tikv/pd/client/http" - clientv3 "go.etcd.io/etcd/client/v3" - "go.uber.org/zap" ) // PlacementManager manages placement settings @@ -41,27 +34,30 @@ type PlacementManager interface { // PDPlacementManager manages placement with pd type PDPlacementManager struct { - etcdCli *clientv3.Client + pdHTTPCli pd.Client } // GetRuleBundle is used to get one specific rule bundle from PD. func (m *PDPlacementManager) GetRuleBundle(ctx context.Context, name string) (*placement.Bundle, error) { - bundle := &placement.Bundle{ID: name} - res, err := doRequest(ctx, "GetPlacementRule", m.etcdCli.Endpoints(), path.Join(pd.Config, "placement-rule", name), http.MethodGet, nil) - if err == nil && res != nil { - err = json.Unmarshal(res, bundle) + groupBundle, err := m.pdHTTPCli.GetPlacementRuleBundleByGroup(ctx, name) + if err != nil { + return nil, err } - return bundle, err + groupBundle.ID = name + return (*placement.Bundle)(groupBundle), err } // GetAllRuleBundles is used to get all rule bundles from PD. It is used to load full rules from PD while fullload infoschema. func (m *PDPlacementManager) GetAllRuleBundles(ctx context.Context) ([]*placement.Bundle, error) { - var bundles []*placement.Bundle - res, err := doRequest(ctx, "GetAllPlacementRules", m.etcdCli.Endpoints(), path.Join(pd.Config, "placement-rule"), http.MethodGet, nil) - if err == nil && res != nil { - err = json.Unmarshal(res, &bundles) + bundles, err := m.pdHTTPCli.GetAllPlacementRuleBundles(ctx) + if err != nil { + return nil, err + } + rules := make([]*placement.Bundle, 0, len(bundles)) + for _, bundle := range bundles { + rules = append(rules, (*placement.Bundle)(bundle)) } - return bundles, err + return rules, nil } // PutRuleBundles is used to post specific rule bundles to PD. @@ -69,15 +65,11 @@ func (m *PDPlacementManager) PutRuleBundles(ctx context.Context, bundles []*plac if len(bundles) == 0 { return nil } - - b, err := json.Marshal(bundles) - if err != nil { - return err + ruleBundles := make([]*pd.GroupBundle, 0, len(bundles)) + for _, bundle := range bundles { + ruleBundles = append(ruleBundles, (*pd.GroupBundle)(bundle)) } - - log.Debug("Put placement rule bundles", zap.String("rules", string(b))) - _, err = doRequest(ctx, "PutPlacementRules", m.etcdCli.Endpoints(), path.Join(pd.Config, "placement-rule")+"?partial=true", http.MethodPost, bytes.NewReader(b)) - return err + return m.pdHTTPCli.SetPlacementRuleBundles(ctx, ruleBundles, true) } type mockPlacementManager struct { diff --git a/pkg/domain/infosync/region.go b/pkg/domain/infosync/region.go index 17208ecb6e153..d31b8e415d1ad 100644 --- a/pkg/domain/infosync/region.go +++ b/pkg/domain/infosync/region.go @@ -16,11 +16,7 @@ package infosync import ( "context" - "encoding/hex" - "encoding/json" - "fmt" - "github.com/pingcap/errors" pd "github.com/tikv/pd/client/http" ) @@ -55,32 +51,21 @@ func GetReplicationState(ctx context.Context, startKey []byte, endKey []byte) (P if err != nil { return PlacementScheduleStatePending, err } - - if is.etcdCli == nil { + if is.pdHTTPCli == nil { return PlacementScheduleStatePending, nil } - - addrs := is.etcdCli.Endpoints() - - if len(addrs) == 0 { - return PlacementScheduleStatePending, errors.Errorf("pd unavailable") + state, err := is.pdHTTPCli.GetRegionsReplicatedStateByKeyRange(ctx, pd.NewKeyRange(startKey, endKey)) + if err != nil || len(state) == 0 { + return PlacementScheduleStatePending, err } - - res, err := doRequest(ctx, "GetReplicationState", addrs, fmt.Sprintf("%s/replicated?startKey=%s&endKey=%s", pd.Regions, hex.EncodeToString(startKey), hex.EncodeToString(endKey)), "GET", nil) - if err == nil && res != nil { - st := PlacementScheduleStatePending - // it should not fail - var state string - _ = json.Unmarshal(res, &state) - switch state { - case "REPLICATED": - st = PlacementScheduleStateScheduled - case "INPROGRESS": - st = PlacementScheduleStateInProgress - case "PENDING": - st = PlacementScheduleStatePending - } - return st, nil + st := PlacementScheduleStatePending + switch state { + case "REPLICATED": + st = PlacementScheduleStateScheduled + case "INPROGRESS": + st = PlacementScheduleStateInProgress + case "PENDING": + st = PlacementScheduleStatePending } - return PlacementScheduleStatePending, err + return st, nil } diff --git a/pkg/domain/infosync/resource_manager_client.go b/pkg/domain/infosync/resource_manager_client.go index 3cf1a2e51be68..c9afef835730d 100644 --- a/pkg/domain/infosync/resource_manager_client.go +++ b/pkg/domain/infosync/resource_manager_client.go @@ -58,7 +58,7 @@ func NewMockResourceManagerClient() pd.ResourceManagerClient { var _ pd.ResourceManagerClient = (*mockResourceManagerClient)(nil) -func (m *mockResourceManagerClient) ListResourceGroups(ctx context.Context) ([]*rmpb.ResourceGroup, error) { +func (m *mockResourceManagerClient) ListResourceGroups(context.Context, ...pd.GetResourceGroupOption) ([]*rmpb.ResourceGroup, error) { m.RLock() defer m.RUnlock() groups := make([]*rmpb.ResourceGroup, 0, len(m.groups)) @@ -68,7 +68,7 @@ func (m *mockResourceManagerClient) ListResourceGroups(ctx context.Context) ([]* return groups, nil } -func (m *mockResourceManagerClient) GetResourceGroup(ctx context.Context, name string) (*rmpb.ResourceGroup, error) { +func (m *mockResourceManagerClient) GetResourceGroup(_ context.Context, name string, _ ...pd.GetResourceGroupOption) (*rmpb.ResourceGroup, error) { m.RLock() defer m.RUnlock() group, ok := m.groups[name] @@ -78,7 +78,7 @@ func (m *mockResourceManagerClient) GetResourceGroup(ctx context.Context, name s return group, nil } -func (m *mockResourceManagerClient) AddResourceGroup(ctx context.Context, group *rmpb.ResourceGroup) (string, error) { +func (m *mockResourceManagerClient) AddResourceGroup(_ context.Context, group *rmpb.ResourceGroup) (string, error) { m.Lock() defer m.Unlock() if _, ok := m.groups[group.Name]; ok { @@ -98,7 +98,7 @@ func (m *mockResourceManagerClient) AddResourceGroup(ctx context.Context, group return "Success!", nil } -func (m *mockResourceManagerClient) ModifyResourceGroup(ctx context.Context, group *rmpb.ResourceGroup) (string, error) { +func (m *mockResourceManagerClient) ModifyResourceGroup(_ context.Context, group *rmpb.ResourceGroup) (string, error) { m.Lock() defer m.Unlock() @@ -115,7 +115,7 @@ func (m *mockResourceManagerClient) ModifyResourceGroup(ctx context.Context, gro return "Success!", nil } -func (m *mockResourceManagerClient) DeleteResourceGroup(ctx context.Context, name string) (string, error) { +func (m *mockResourceManagerClient) DeleteResourceGroup(_ context.Context, name string) (string, error) { m.Lock() defer m.Unlock() group := m.groups[name] @@ -132,19 +132,19 @@ func (m *mockResourceManagerClient) DeleteResourceGroup(ctx context.Context, nam return "Success!", nil } -func (m *mockResourceManagerClient) AcquireTokenBuckets(ctx context.Context, request *rmpb.TokenBucketsRequest) ([]*rmpb.TokenBucketResponse, error) { +func (*mockResourceManagerClient) AcquireTokenBuckets(context.Context, *rmpb.TokenBucketsRequest) ([]*rmpb.TokenBucketResponse, error) { return nil, nil } -func (m *mockResourceManagerClient) WatchResourceGroup(ctx context.Context, revision int64) (chan []*rmpb.ResourceGroup, error) { +func (*mockResourceManagerClient) WatchResourceGroup(context.Context, int64) (chan []*rmpb.ResourceGroup, error) { return nil, nil } -func (m *mockResourceManagerClient) LoadResourceGroups(ctx context.Context) ([]*rmpb.ResourceGroup, int64, error) { +func (*mockResourceManagerClient) LoadResourceGroups(context.Context) ([]*rmpb.ResourceGroup, int64, error) { return nil, 0, nil } -func (m *mockResourceManagerClient) Watch(ctx context.Context, key []byte, opts ...pd.OpOption) (chan []*meta_storagepb.Event, error) { +func (m *mockResourceManagerClient) Watch(_ context.Context, key []byte, _ ...pd.OpOption) (chan []*meta_storagepb.Event, error) { if bytes.Equal(pd.GroupSettingsPathPrefixBytes, key) { return m.eventCh, nil } diff --git a/pkg/domain/infosync/schedule_manager.go b/pkg/domain/infosync/schedule_manager.go index 1578007deb4d7..ab8626c93af5f 100644 --- a/pkg/domain/infosync/schedule_manager.go +++ b/pkg/domain/infosync/schedule_manager.go @@ -15,56 +15,21 @@ package infosync import ( - "bytes" "context" - "encoding/json" - "path" "sync" - "github.com/pingcap/errors" pd "github.com/tikv/pd/client/http" - clientv3 "go.etcd.io/etcd/client/v3" ) // ScheduleManager manages schedule configs type ScheduleManager interface { - GetPDScheduleConfig(ctx context.Context) (map[string]interface{}, error) - SetPDScheduleConfig(ctx context.Context, config map[string]interface{}) error + GetScheduleConfig(ctx context.Context) (map[string]any, error) + SetScheduleConfig(ctx context.Context, config map[string]any) error } // PDScheduleManager manages schedule with pd type PDScheduleManager struct { - etcdCli *clientv3.Client -} - -// GetPDScheduleConfig get schedule config from pd -func (sm *PDScheduleManager) GetPDScheduleConfig(ctx context.Context) (map[string]interface{}, error) { - ret, err := doRequest(ctx, "GetPDSchedule", sm.etcdCli.Endpoints(), path.Join(pd.Config, "schedule"), "GET", nil) - if err != nil { - return nil, errors.Trace(err) - } - - var schedule map[string]interface{} - if err = json.Unmarshal(ret, &schedule); err != nil { - return nil, errors.Trace(err) - } - - return schedule, nil -} - -// SetPDScheduleConfig set schedule config to pd -func (sm *PDScheduleManager) SetPDScheduleConfig(ctx context.Context, config map[string]interface{}) error { - configJSON, err := json.Marshal(config) - if err != nil { - return err - } - - _, err = doRequest(ctx, "SetPDSchedule", sm.etcdCli.Endpoints(), path.Join(pd.Config, "schedule"), "POST", bytes.NewReader(configJSON)) - if err != nil { - return errors.Trace(err) - } - - return nil + pd.Client } type mockScheduleManager struct { @@ -72,8 +37,8 @@ type mockScheduleManager struct { schedules map[string]interface{} } -// GetPDScheduleConfig get schedule config from schedules map -func (mm *mockScheduleManager) GetPDScheduleConfig(ctx context.Context) (map[string]interface{}, error) { +// GetScheduleConfig get schedule config from schedules map +func (mm *mockScheduleManager) GetScheduleConfig(context.Context) (map[string]interface{}, error) { mm.Lock() schedules := make(map[string]interface{}) @@ -85,12 +50,12 @@ func (mm *mockScheduleManager) GetPDScheduleConfig(ctx context.Context) (map[str return schedules, nil } -// SetPDScheduleConfig set schedule config to schedules map -func (mm *mockScheduleManager) SetPDScheduleConfig(ctx context.Context, config map[string]interface{}) error { +// SetScheduleConfig set schedule config to schedules map +func (mm *mockScheduleManager) SetScheduleConfig(_ context.Context, config map[string]interface{}) error { mm.Lock() if mm.schedules == nil { - mm.schedules = make(map[string]interface{}) + mm.schedules = make(map[string]any) } for key, value := range config { mm.schedules[key] = value diff --git a/pkg/domain/infosync/tiflash_manager.go b/pkg/domain/infosync/tiflash_manager.go index f1d93c024e39e..c03cf2c8815cb 100644 --- a/pkg/domain/infosync/tiflash_manager.go +++ b/pkg/domain/infosync/tiflash_manager.go @@ -18,11 +18,9 @@ import ( "bytes" "context" "encoding/hex" - "encoding/json" "fmt" "net/http" "net/http/httptest" - "path" "strconv" "strings" "sync" @@ -40,7 +38,6 @@ import ( "github.com/pingcap/tidb/pkg/util/syncutil" "github.com/tikv/client-go/v2/tikv" pd "github.com/tikv/pd/client/http" - clientv3 "go.etcd.io/etcd/client/v3" "go.uber.org/zap" ) @@ -54,13 +51,13 @@ type TiFlashReplicaManager interface { // SetTiFlashGroupConfig sets the group index of the tiflash placement rule SetTiFlashGroupConfig(ctx context.Context) error // SetPlacementRule is a helper function to set placement rule. - SetPlacementRule(ctx context.Context, rule placement.TiFlashRule) error + SetPlacementRule(ctx context.Context, rule *pd.Rule) error // SetPlacementRuleBatch is a helper function to set a batch of placement rules. - SetPlacementRuleBatch(ctx context.Context, rules []placement.TiFlashRule) error + SetPlacementRuleBatch(ctx context.Context, rules []*pd.Rule) error // DeletePlacementRule is to delete placement rule for certain group. DeletePlacementRule(ctx context.Context, group string, ruleID string) error // GetGroupRules to get all placement rule in a certain group. - GetGroupRules(ctx context.Context, group string) ([]placement.TiFlashRule, error) + GetGroupRules(ctx context.Context, group string) ([]*pd.Rule, error) // PostAccelerateScheduleBatch sends `regions/accelerate-schedule/batch` request. PostAccelerateScheduleBatch(ctx context.Context, tableIDs []int64) error // GetRegionCountFromPD is a helper function calling `/stats/region`. @@ -83,14 +80,14 @@ type TiFlashReplicaManager interface { // TiFlashReplicaManagerCtx manages placement with pd and replica progress for TiFlash. type TiFlashReplicaManagerCtx struct { - etcdCli *clientv3.Client + pdHTTPCli pd.Client sync.RWMutex // protect tiflashProgressCache tiflashProgressCache map[int64]float64 codec tikv.Codec } // Close is called to close TiFlashReplicaManagerCtx. -func (m *TiFlashReplicaManagerCtx) Close(context.Context) {} +func (*TiFlashReplicaManagerCtx) Close(context.Context) {} func getTiFlashPeerWithoutLagCount(tiFlashStores map[int64]pd.StoreInfo, keyspaceID tikv.KeyspaceID, tableID int64) (int, error) { // storeIDs -> regionID, PD will not create two peer on the same store @@ -151,10 +148,9 @@ func calculateTiFlashProgress(keyspaceID tikv.KeyspaceID, tableID int64, replica return progress, nil } -func encodeRule(c tikv.Codec, rule *placement.TiFlashRule) placement.TiFlashRule { +func encodeRule(c tikv.Codec, rule *pd.Rule) { rule.StartKey, rule.EndKey = c.EncodeRange(rule.StartKey, rule.EndKey) rule.ID = encodeRuleID(c, rule.ID) - return *rule } // encodeRule encodes the rule ID by the following way: @@ -204,259 +200,77 @@ func (m *TiFlashReplicaManagerCtx) CleanTiFlashProgressCache() { // SetTiFlashGroupConfig sets the tiflash's rule group config func (m *TiFlashReplicaManagerCtx) SetTiFlashGroupConfig(ctx context.Context) error { - res, err := doRequest(ctx, - "GetRuleGroupConfig", - m.etcdCli.Endpoints(), - path.Join(pd.Config, "rule_group", placement.TiFlashRuleGroupID), - "GET", - nil, - ) - + groupConfig, err := m.pdHTTPCli.GetPlacementRuleGroupByID(ctx, placement.TiFlashRuleGroupID) if err != nil { return errors.Trace(err) } - - var groupConfig placement.RuleGroupConfig - shouldUpdate := res == nil - if res != nil { - if err = json.Unmarshal(res, &groupConfig); err != nil { - return errors.Trace(err) - } - - if groupConfig.Index != placement.RuleIndexTiFlash || groupConfig.Override { - shouldUpdate = true - } + if groupConfig != nil && groupConfig.Index == placement.RuleIndexTiFlash && !groupConfig.Override { + return nil } - - if shouldUpdate { - groupConfig.ID = placement.TiFlashRuleGroupID - groupConfig.Index = placement.RuleIndexTiFlash - groupConfig.Override = false - - body, err := json.Marshal(&groupConfig) - if err != nil { - return errors.Trace(err) - } - - _, err = doRequest(ctx, - "SetRuleGroupConfig", - m.etcdCli.Endpoints(), - path.Join(pd.Config, "rule_group"), - "POST", - bytes.NewBuffer(body), - ) - - if err != nil { - return errors.Trace(err) - } + groupConfig = &pd.RuleGroup{ + ID: placement.TiFlashRuleGroupID, + Index: placement.RuleIndexTiFlash, + Override: false, } - return nil + return m.pdHTTPCli.SetPlacementRuleGroup(ctx, groupConfig) } // SetPlacementRule is a helper function to set placement rule. -func (m *TiFlashReplicaManagerCtx) SetPlacementRule(ctx context.Context, rule placement.TiFlashRule) error { - r := encodeRule(m.codec, &rule) - return m.doSetPlacementRule(ctx, r) +func (m *TiFlashReplicaManagerCtx) SetPlacementRule(ctx context.Context, rule *pd.Rule) error { + encodeRule(m.codec, rule) + return m.doSetPlacementRule(ctx, rule) } -func (m *TiFlashReplicaManagerCtx) doSetPlacementRule(ctx context.Context, rule placement.TiFlashRule) error { +func (m *TiFlashReplicaManagerCtx) doSetPlacementRule(ctx context.Context, rule *pd.Rule) error { if err := m.SetTiFlashGroupConfig(ctx); err != nil { return err } - if rule.Count == 0 { - return m.doDeletePlacementRule(ctx, rule.GroupID, rule.ID) - } - - j, err := rule.MarshalJSON() - if err != nil { - return errors.Trace(err) - } - buf := bytes.NewBuffer(j) - res, err := doRequest(ctx, "SetPlacementRule", m.etcdCli.Endpoints(), path.Join(pd.Config, "rule"), "POST", buf) - if err != nil { - return errors.Trace(err) + return m.pdHTTPCli.DeletePlacementRule(ctx, rule.GroupID, rule.ID) } - if res == nil { - return fmt.Errorf("TiFlashReplicaManagerCtx returns error in SetPlacementRule") - } - return nil + return m.pdHTTPCli.SetPlacementRule(ctx, rule) } // SetPlacementRuleBatch is a helper function to set a batch of placement rules. -func (m *TiFlashReplicaManagerCtx) SetPlacementRuleBatch(ctx context.Context, rules []placement.TiFlashRule) error { - r := make([]placement.TiFlashRule, 0, len(rules)) +func (m *TiFlashReplicaManagerCtx) SetPlacementRuleBatch(ctx context.Context, rules []*pd.Rule) error { + r := make([]*pd.Rule, 0, len(rules)) for _, rule := range rules { - r = append(r, encodeRule(m.codec, &rule)) + encodeRule(m.codec, rule) + r = append(r, rule) } return m.doSetPlacementRuleBatch(ctx, r) } -// RuleOpType indicates the operation type -type RuleOpType string - -const ( - // RuleOpAdd a placement rule, only need to specify the field *Rule - RuleOpAdd RuleOpType = "add" - // RuleOpDel a placement rule, only need to specify the field `GroupID`, `ID`, `MatchID` - RuleOpDel RuleOpType = "del" -) - -// RuleOp is for batching placement rule actions. The action type is -// distinguished by the field `Action`. -type RuleOp struct { - *placement.TiFlashRule // information of the placement rule to add/delete the operation type - Action RuleOpType - DeleteByIDPrefix bool // if action == delete, delete by the prefix of id -} - -var _ json.Marshaler = (*RuleOp)(nil) -var _ json.Unmarshaler = (*RuleOp)(nil) - -type ruleOp struct { - GroupID string `json:"group_id"` - ID string `json:"id"` - Index int `json:"index,omitempty"` - Override bool `json:"override,omitempty"` - Role placement.PeerRoleType `json:"role"` - Count int `json:"count"` - Constraints placement.Constraints `json:"label_constraints,omitempty"` - LocationLabels []string `json:"location_labels,omitempty"` - IsolationLevel string `json:"isolation_level,omitempty"` - StartKeyHex string `json:"start_key"` - EndKeyHex string `json:"end_key"` - Action RuleOpType `json:"action"` - DeleteByIDPrefix bool `json:"delete_by_id_prefix"` -} - -// MarshalJSON implements json.Marshaler interface for RuleOp. -func (r *RuleOp) MarshalJSON() ([]byte, error) { - return json.Marshal(&ruleOp{ - GroupID: r.GroupID, - ID: r.ID, - Index: r.Index, - Override: r.Override, - Role: r.Role, - Count: r.Count, - Constraints: r.Constraints, - LocationLabels: r.LocationLabels, - IsolationLevel: r.IsolationLevel, - StartKeyHex: hex.EncodeToString(codec.EncodeBytes(nil, r.StartKey)), - EndKeyHex: hex.EncodeToString(codec.EncodeBytes(nil, r.EndKey)), - Action: r.Action, - DeleteByIDPrefix: r.DeleteByIDPrefix, - }) -} - -// UnmarshalJSON implements json.Unmarshaler interface for RuleOp. -func (r *RuleOp) UnmarshalJSON(bytes []byte) error { - var rule ruleOp - if err := json.Unmarshal(bytes, &rule); err != nil { - return err - } - *r = RuleOp{ - TiFlashRule: &placement.TiFlashRule{ - GroupID: rule.GroupID, - ID: rule.ID, - Index: rule.Index, - Override: rule.Override, - Role: rule.Role, - Count: rule.Count, - Constraints: rule.Constraints, - LocationLabels: rule.LocationLabels, - IsolationLevel: rule.IsolationLevel, - }, - Action: rule.Action, - DeleteByIDPrefix: rule.DeleteByIDPrefix, - } - - startKey, err := hex.DecodeString(rule.StartKeyHex) - if err != nil { - return err - } - - endKey, err := hex.DecodeString(rule.EndKeyHex) - if err != nil { - return err - } - - _, r.StartKey, err = codec.DecodeBytes(startKey, nil) - if err != nil { - return err - } - - _, r.EndKey, err = codec.DecodeBytes(endKey, nil) - - return err -} - -func (m *TiFlashReplicaManagerCtx) doSetPlacementRuleBatch(ctx context.Context, rules []placement.TiFlashRule) error { +func (m *TiFlashReplicaManagerCtx) doSetPlacementRuleBatch(ctx context.Context, rules []*pd.Rule) error { if err := m.SetTiFlashGroupConfig(ctx); err != nil { return err } - ruleOps := make([]RuleOp, 0, len(rules)) + ruleOps := make([]*pd.RuleOp, 0, len(rules)) for i, r := range rules { if r.Count == 0 { - ruleOps = append(ruleOps, RuleOp{ - TiFlashRule: &rules[i], - Action: RuleOpDel, + ruleOps = append(ruleOps, &pd.RuleOp{ + Rule: rules[i], + Action: pd.RuleOpDel, }) } else { - ruleOps = append(ruleOps, RuleOp{ - TiFlashRule: &rules[i], - Action: RuleOpAdd, + ruleOps = append(ruleOps, &pd.RuleOp{ + Rule: rules[i], + Action: pd.RuleOpAdd, }) } } - j, err := json.Marshal(ruleOps) - if err != nil { - return errors.Trace(err) - } - buf := bytes.NewBuffer(j) - res, err := doRequest(ctx, "SetPlacementRuleBatch", m.etcdCli.Endpoints(), path.Join(pd.Config, "rules", "batch"), "POST", buf) - if err != nil { - return errors.Trace(err) - } - if res == nil { - return fmt.Errorf("TiFlashReplicaManagerCtx returns error in SetPlacementRuleBatch") - } - return nil + return m.pdHTTPCli.SetPlacementRuleInBatch(ctx, ruleOps) } // DeletePlacementRule is to delete placement rule for certain group. func (m *TiFlashReplicaManagerCtx) DeletePlacementRule(ctx context.Context, group string, ruleID string) error { ruleID = encodeRuleID(m.codec, ruleID) - return m.doDeletePlacementRule(ctx, group, ruleID) -} - -func (m *TiFlashReplicaManagerCtx) doDeletePlacementRule(ctx context.Context, group string, ruleID string) error { - res, err := doRequest(ctx, "DeletePlacementRule", m.etcdCli.Endpoints(), path.Join(pd.Config, "rule", group, ruleID), "DELETE", nil) - if err != nil { - return errors.Trace(err) - } - if res == nil { - return fmt.Errorf("TiFlashReplicaManagerCtx returns error in DeletePlacementRule") - } - return nil + return m.pdHTTPCli.DeletePlacementRule(ctx, group, ruleID) } // GetGroupRules to get all placement rule in a certain group. -func (m *TiFlashReplicaManagerCtx) GetGroupRules(ctx context.Context, group string) ([]placement.TiFlashRule, error) { - res, err := doRequest(ctx, "GetGroupRules", m.etcdCli.Endpoints(), path.Join(pd.Config, "rules", "group", group), "GET", nil) - if err != nil { - return nil, errors.Trace(err) - } - if res == nil { - return nil, fmt.Errorf("TiFlashReplicaManagerCtx returns error in GetGroupRules") - } - - var rules []placement.TiFlashRule - err = json.Unmarshal(res, &rules) - if err != nil { - return nil, errors.Trace(err) - } - - return rules, nil +func (m *TiFlashReplicaManagerCtx) GetGroupRules(ctx context.Context, group string) ([]*pd.Rule, error) { + return m.pdHTTPCli.GetPlacementRulesByGroup(ctx, group) } // PostAccelerateScheduleBatch sends `regions/batch-accelerate-schedule` request. @@ -464,29 +278,14 @@ func (m *TiFlashReplicaManagerCtx) PostAccelerateScheduleBatch(ctx context.Conte if len(tableIDs) == 0 { return nil } - input := make([]map[string]string, 0, len(tableIDs)) + input := make([]*pd.KeyRange, 0, len(tableIDs)) for _, tableID := range tableIDs { startKey := tablecodec.GenTableRecordPrefix(tableID) endKey := tablecodec.EncodeTablePrefix(tableID + 1) startKey, endKey = m.codec.EncodeRegionRange(startKey, endKey) - input = append(input, map[string]string{ - "start_key": hex.EncodeToString(startKey), - "end_key": hex.EncodeToString(endKey), - }) - } - j, err := json.Marshal(input) - if err != nil { - return errors.Trace(err) - } - buf := bytes.NewBuffer(j) - res, err := doRequest(ctx, "PostAccelerateScheduleBatch", m.etcdCli.Endpoints(), path.Join(pd.Regions, "accelerate-schedule", "batch"), http.MethodPost, buf) - if err != nil { - return errors.Trace(err) - } - if res == nil { - return fmt.Errorf("TiFlashReplicaManagerCtx returns error in PostAccelerateScheduleBatch") + input = append(input, pd.NewKeyRange(startKey, endKey)) } - return nil + return m.pdHTTPCli.AccelerateScheduleInBatch(ctx, input) } // GetRegionCountFromPD is a helper function calling `/stats/region`. @@ -494,19 +293,9 @@ func (m *TiFlashReplicaManagerCtx) GetRegionCountFromPD(ctx context.Context, tab startKey := tablecodec.GenTableRecordPrefix(tableID) endKey := tablecodec.EncodeTablePrefix(tableID + 1) startKey, endKey = m.codec.EncodeRegionRange(startKey, endKey) - - p := fmt.Sprintf("%s&count", pd.RegionStatsByKeyRange(startKey, endKey)) - res, err := doRequest(ctx, "GetPDRegionStats", m.etcdCli.Endpoints(), p, "GET", nil) - if err != nil { - return errors.Trace(err) - } - if res == nil { - return fmt.Errorf("TiFlashReplicaManagerCtx returns error in GetRegionCountFromPD") - } - var stats pd.RegionStats - err = json.Unmarshal(res, &stats) + stats, err := m.pdHTTPCli.GetRegionStatusByKeyRange(ctx, pd.NewKeyRange(startKey, endKey), true) if err != nil { - return errors.Trace(err) + return err } *regionCount = stats.Count return nil @@ -514,20 +303,7 @@ func (m *TiFlashReplicaManagerCtx) GetRegionCountFromPD(ctx context.Context, tab // GetStoresStat gets the TiKV store information by accessing PD's api. func (m *TiFlashReplicaManagerCtx) GetStoresStat(ctx context.Context) (*pd.StoresInfo, error) { - var storesStat pd.StoresInfo - res, err := doRequest(ctx, "GetStoresStat", m.etcdCli.Endpoints(), pd.Stores, "GET", nil) - if err != nil { - return nil, errors.Trace(err) - } - if res == nil { - return nil, fmt.Errorf("TiFlashReplicaManagerCtx returns error in GetStoresStat") - } - - err = json.Unmarshal(res, &storesStat) - if err != nil { - return nil, errors.Trace(err) - } - return &storesStat, err + return m.pdHTTPCli.GetStores(ctx) } type mockTiFlashReplicaManagerCtx struct { @@ -538,18 +314,18 @@ type mockTiFlashReplicaManagerCtx struct { tiflashProgressCache map[int64]float64 } -func makeBaseRule() placement.TiFlashRule { - return placement.TiFlashRule{ +func makeBaseRule() pd.Rule { + return pd.Rule{ GroupID: placement.TiFlashRuleGroupID, ID: "", Index: placement.RuleIndexTiFlash, Override: false, - Role: placement.Learner, + Role: pd.Learner, Count: 2, - Constraints: []placement.Constraint{ + LabelConstraints: []pd.LabelConstraint{ { Key: "engine", - Op: placement.In, + Op: pd.In, Values: []string{"tiflash"}, }, }, @@ -557,7 +333,7 @@ func makeBaseRule() placement.TiFlashRule { } // MakeNewRule creates a pd rule for TiFlash. -func MakeNewRule(id int64, count uint64, locationLabels []string) placement.TiFlashRule { +func MakeNewRule(id int64, count uint64, locationLabels []string) pd.Rule { ruleID := MakeRuleID(id) startKey := tablecodec.GenTableRecordPrefix(id) endKey := tablecodec.EncodeTablePrefix(id + 1) @@ -604,7 +380,7 @@ type MockTiFlash struct { StatusServer *httptest.Server SyncStatus map[int]mockTiFlashTableInfo StoreInfo map[uint64]pd.MetaStore - GlobalTiFlashPlacementRules map[string]placement.TiFlashRule + GlobalTiFlashPlacementRules map[string]*pd.Rule PdEnabled bool TiflashDelay time.Duration StartTime time.Time @@ -666,7 +442,7 @@ func NewMockTiFlash() *MockTiFlash { StatusServer: nil, SyncStatus: make(map[int]mockTiFlashTableInfo), StoreInfo: make(map[uint64]pd.MetaStore), - GlobalTiFlashPlacementRules: make(map[string]placement.TiFlashRule), + GlobalTiFlashPlacementRules: make(map[string]*pd.Rule), PdEnabled: true, TiflashDelay: 0, StartTime: time.Now(), @@ -677,7 +453,7 @@ func NewMockTiFlash() *MockTiFlash { } // HandleSetPlacementRule is mock function for SetTiFlashPlacementRule. -func (tiflash *MockTiFlash) HandleSetPlacementRule(rule placement.TiFlashRule) error { +func (tiflash *MockTiFlash) HandleSetPlacementRule(rule *pd.Rule) error { tiflash.Lock() defer tiflash.Unlock() tiflash.groupIndex = placement.RuleIndexTiFlash @@ -722,7 +498,7 @@ func (tiflash *MockTiFlash) HandleSetPlacementRule(rule placement.TiFlashRule) e } // HandleSetPlacementRuleBatch is mock function for batch SetTiFlashPlacementRule. -func (tiflash *MockTiFlash) HandleSetPlacementRuleBatch(rules []placement.TiFlashRule) error { +func (tiflash *MockTiFlash) HandleSetPlacementRuleBatch(rules []*pd.Rule) error { for _, r := range rules { if err := tiflash.HandleSetPlacementRule(r); err != nil { return err @@ -751,17 +527,17 @@ func (tiflash *MockTiFlash) ResetSyncStatus(tableID int, canAvailable bool) { } // HandleDeletePlacementRule is mock function for DeleteTiFlashPlacementRule. -func (tiflash *MockTiFlash) HandleDeletePlacementRule(group string, ruleID string) { +func (tiflash *MockTiFlash) HandleDeletePlacementRule(_ string, ruleID string) { tiflash.Lock() defer tiflash.Unlock() delete(tiflash.GlobalTiFlashPlacementRules, ruleID) } // HandleGetGroupRules is mock function for GetTiFlashGroupRules. -func (tiflash *MockTiFlash) HandleGetGroupRules(group string) ([]placement.TiFlashRule, error) { +func (tiflash *MockTiFlash) HandleGetGroupRules(_ string) ([]*pd.Rule, error) { tiflash.Lock() defer tiflash.Unlock() - var result = make([]placement.TiFlashRule, 0) + var result = make([]*pd.Rule, 0) for _, item := range tiflash.GlobalTiFlashPlacementRules { result = append(result, item) } @@ -789,7 +565,7 @@ func (tiflash *MockTiFlash) HandlePostAccelerateSchedule(endKey string) error { // HandleGetPDRegionRecordStats is mock function for GetRegionCountFromPD. // It currently always returns 1 Region for convenience. -func (tiflash *MockTiFlash) HandleGetPDRegionRecordStats(_ int64) pd.RegionStats { +func (*MockTiFlash) HandleGetPDRegionRecordStats(int64) pd.RegionStats { return pd.RegionStats{ Count: 1, } @@ -867,14 +643,14 @@ func (tiflash *MockTiFlash) GetRuleGroupIndex() int { } // Compare supposed rule, and we actually get from TableInfo -func isRuleMatch(rule placement.TiFlashRule, startKey []byte, endKey []byte, count int, labels []string) bool { +func isRuleMatch(rule pd.Rule, startKey []byte, endKey []byte, count int, labels []string) bool { // Compute startKey if !(bytes.Equal(rule.StartKey, startKey) && bytes.Equal(rule.EndKey, endKey)) { return false } ok := false - for _, c := range rule.Constraints { - if c.Key == "engine" && len(c.Values) == 1 && c.Values[0] == "tiflash" && c.Op == placement.In { + for _, c := range rule.LabelConstraints { + if c.Key == "engine" && len(c.Values) == 1 && c.Values[0] == "tiflash" && c.Op == pd.In { ok = true break } @@ -894,14 +670,14 @@ func isRuleMatch(rule placement.TiFlashRule, startKey []byte, endKey []byte, cou if rule.Count != count { return false } - if rule.Role != placement.Learner { + if rule.Role != pd.Learner { return false } return true } // CheckPlacementRule find if a given rule precisely matches already set rules. -func (tiflash *MockTiFlash) CheckPlacementRule(rule placement.TiFlashRule) bool { +func (tiflash *MockTiFlash) CheckPlacementRule(rule pd.Rule) bool { tiflash.Lock() defer tiflash.Unlock() for _, r := range tiflash.GlobalTiFlashPlacementRules { @@ -913,12 +689,12 @@ func (tiflash *MockTiFlash) CheckPlacementRule(rule placement.TiFlashRule) bool } // GetPlacementRule find a rule by name. -func (tiflash *MockTiFlash) GetPlacementRule(ruleName string) (*placement.TiFlashRule, bool) { +func (tiflash *MockTiFlash) GetPlacementRule(ruleName string) (*pd.Rule, bool) { tiflash.Lock() defer tiflash.Unlock() if r, ok := tiflash.GlobalTiFlashPlacementRules[ruleName]; ok { p := r - return &p, ok + return p, ok } return nil, false } @@ -927,7 +703,7 @@ func (tiflash *MockTiFlash) GetPlacementRule(ruleName string) (*placement.TiFlas func (tiflash *MockTiFlash) CleanPlacementRules() { tiflash.Lock() defer tiflash.Unlock() - tiflash.GlobalTiFlashPlacementRules = make(map[string]placement.TiFlashRule) + tiflash.GlobalTiFlashPlacementRules = make(map[string]*pd.Rule) } // PlacementRulesLen gets length of all currently set placement rules. @@ -963,7 +739,7 @@ func (tiflash *MockTiFlash) SetNetworkError(e bool) { } // CalculateTiFlashProgress return truncated string to avoid float64 comparison. -func (m *mockTiFlashReplicaManagerCtx) CalculateTiFlashProgress(tableID int64, replicaCount uint64, tiFlashStores map[int64]pd.StoreInfo) (float64, error) { +func (*mockTiFlashReplicaManagerCtx) CalculateTiFlashProgress(tableID int64, replicaCount uint64, tiFlashStores map[int64]pd.StoreInfo) (float64, error) { return calculateTiFlashProgress(tikv.NullspaceID, tableID, replicaCount, tiFlashStores) } @@ -1015,7 +791,7 @@ func (m *mockTiFlashReplicaManagerCtx) SetTiFlashGroupConfig(_ context.Context) } // SetPlacementRule is a helper function to set placement rule. -func (m *mockTiFlashReplicaManagerCtx) SetPlacementRule(ctx context.Context, rule placement.TiFlashRule) error { +func (m *mockTiFlashReplicaManagerCtx) SetPlacementRule(_ context.Context, rule *pd.Rule) error { m.Lock() defer m.Unlock() if m.tiflash == nil { @@ -1025,7 +801,7 @@ func (m *mockTiFlashReplicaManagerCtx) SetPlacementRule(ctx context.Context, rul } // SetPlacementRuleBatch is a helper function to set a batch of placement rules. -func (m *mockTiFlashReplicaManagerCtx) SetPlacementRuleBatch(ctx context.Context, rules []placement.TiFlashRule) error { +func (m *mockTiFlashReplicaManagerCtx) SetPlacementRuleBatch(_ context.Context, rules []*pd.Rule) error { m.Lock() defer m.Unlock() if m.tiflash == nil { @@ -1035,7 +811,7 @@ func (m *mockTiFlashReplicaManagerCtx) SetPlacementRuleBatch(ctx context.Context } // DeletePlacementRule is to delete placement rule for certain group. -func (m *mockTiFlashReplicaManagerCtx) DeletePlacementRule(ctx context.Context, group string, ruleID string) error { +func (m *mockTiFlashReplicaManagerCtx) DeletePlacementRule(_ context.Context, group string, ruleID string) error { m.Lock() defer m.Unlock() if m.tiflash == nil { @@ -1047,17 +823,17 @@ func (m *mockTiFlashReplicaManagerCtx) DeletePlacementRule(ctx context.Context, } // GetGroupRules to get all placement rule in a certain group. -func (m *mockTiFlashReplicaManagerCtx) GetGroupRules(ctx context.Context, group string) ([]placement.TiFlashRule, error) { +func (m *mockTiFlashReplicaManagerCtx) GetGroupRules(_ context.Context, group string) ([]*pd.Rule, error) { m.Lock() defer m.Unlock() if m.tiflash == nil { - return []placement.TiFlashRule{}, nil + return []*pd.Rule{}, nil } return m.tiflash.HandleGetGroupRules(group) } // PostAccelerateScheduleBatch sends `regions/batch-accelerate-schedule` request. -func (m *mockTiFlashReplicaManagerCtx) PostAccelerateScheduleBatch(ctx context.Context, tableIDs []int64) error { +func (m *mockTiFlashReplicaManagerCtx) PostAccelerateScheduleBatch(_ context.Context, tableIDs []int64) error { m.Lock() defer m.Unlock() if m.tiflash == nil { @@ -1074,7 +850,7 @@ func (m *mockTiFlashReplicaManagerCtx) PostAccelerateScheduleBatch(ctx context.C } // GetRegionCountFromPD is a helper function calling `/stats/region`. -func (m *mockTiFlashReplicaManagerCtx) GetRegionCountFromPD(ctx context.Context, tableID int64, regionCount *int) error { +func (m *mockTiFlashReplicaManagerCtx) GetRegionCountFromPD(_ context.Context, tableID int64, regionCount *int) error { m.Lock() defer m.Unlock() if m.tiflash == nil { @@ -1086,7 +862,7 @@ func (m *mockTiFlashReplicaManagerCtx) GetRegionCountFromPD(ctx context.Context, } // GetStoresStat gets the TiKV store information by accessing PD's api. -func (m *mockTiFlashReplicaManagerCtx) GetStoresStat(ctx context.Context) (*pd.StoresInfo, error) { +func (m *mockTiFlashReplicaManagerCtx) GetStoresStat(_ context.Context) (*pd.StoresInfo, error) { m.Lock() defer m.Unlock() if m.tiflash == nil { @@ -1096,7 +872,7 @@ func (m *mockTiFlashReplicaManagerCtx) GetStoresStat(ctx context.Context) (*pd.S } // Close is called to close mockTiFlashReplicaManager. -func (m *mockTiFlashReplicaManagerCtx) Close(ctx context.Context) { +func (m *mockTiFlashReplicaManagerCtx) Close(_ context.Context) { m.Lock() defer m.Unlock() if m.tiflash == nil { diff --git a/pkg/domain/main_test.go b/pkg/domain/main_test.go index fe07ac0592f6f..9d83ca803a26d 100644 --- a/pkg/domain/main_test.go +++ b/pkg/domain/main_test.go @@ -27,6 +27,7 @@ func TestMain(m *testing.M) { testsetup.SetupForCommonTest() opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), diff --git a/pkg/domain/plan_replayer.go b/pkg/domain/plan_replayer.go index 4f77d63b009f5..88b8f7512ea03 100644 --- a/pkg/domain/plan_replayer.go +++ b/pkg/domain/plan_replayer.go @@ -52,10 +52,6 @@ type dumpFileGcChecker struct { planReplayerTaskStatus *planReplayerDumpTaskStatus } -func parseType(s string) string { - return strings.Split(s, "_")[0] -} - func parseTime(s string) (time.Time, error) { startIdx := strings.LastIndex(s, "_") if startIdx == -1 { @@ -168,33 +164,54 @@ func insertPlanReplayerStatus(ctx context.Context, sctx sessionctx.Context, reco func insertPlanReplayerErrorStatusRecord(ctx context.Context, sctx sessionctx.Context, instance string, record PlanReplayerStatusRecord) { exec := sctx.(sqlexec.RestrictedSQLExecutor) - _, _, err := exec.ExecRestrictedSQL(ctx, nil, fmt.Sprintf( - "insert into mysql.plan_replayer_status (sql_digest, plan_digest, origin_sql, fail_reason, instance) values ('%s','%s','%s','%s','%s')", - record.SQLDigest, record.PlanDigest, record.OriginSQL, record.FailedReason, instance)) + _, _, err := exec.ExecRestrictedSQL( + ctx, nil, + "insert into mysql.plan_replayer_status (sql_digest, plan_digest, origin_sql, fail_reason, instance) values (%?,%?,%?,%?,%?)", + record.SQLDigest, record.PlanDigest, record.OriginSQL, record.FailedReason, instance, + ) if err != nil { logutil.BgLogger().Warn("insert mysql.plan_replayer_status record failed", + zap.String("sqlDigest", record.SQLDigest), + zap.String("planDigest", record.PlanDigest), + zap.String("sql", record.OriginSQL), + zap.String("failReason", record.FailedReason), + zap.String("instance", instance), zap.Error(err)) } } func insertPlanReplayerSuccessStatusRecord(ctx context.Context, sctx sessionctx.Context, instance string, record PlanReplayerStatusRecord) { exec := sctx.(sqlexec.RestrictedSQLExecutor) - _, _, err := exec.ExecRestrictedSQL(ctx, nil, fmt.Sprintf( - "insert into mysql.plan_replayer_status (sql_digest, plan_digest, origin_sql, token, instance) values ('%s','%s','%s','%s','%s')", - record.SQLDigest, record.PlanDigest, record.OriginSQL, record.Token, instance)) + _, _, err := exec.ExecRestrictedSQL( + ctx, + nil, + "insert into mysql.plan_replayer_status (sql_digest, plan_digest, origin_sql, token, instance) values (%?,%?,%?,%?,%?)", + record.SQLDigest, record.PlanDigest, record.OriginSQL, record.Token, instance, + ) if err != nil { logutil.BgLogger().Warn("insert mysql.plan_replayer_status record failed", + zap.String("sqlDigest", record.SQLDigest), + zap.String("planDigest", record.PlanDigest), zap.String("sql", record.OriginSQL), - zap.Error(err)) + zap.String("token", record.Token), + zap.String("instance", instance), + zap.Error(err), + ) // try insert record without original sql - _, _, err = exec.ExecRestrictedSQL(ctx, nil, fmt.Sprintf( - "insert into mysql.plan_replayer_status (sql_digest, plan_digest, token, instance) values ('%s','%s','%s','%s')", - record.SQLDigest, record.PlanDigest, record.Token, instance)) + _, _, err = exec.ExecRestrictedSQL( + ctx, + nil, + "insert into mysql.plan_replayer_status (sql_digest, plan_digest, token, instance) values (%?,%?,%?,%?)", + record.SQLDigest, record.PlanDigest, record.Token, instance, + ) if err != nil { logutil.BgLogger().Warn("insert mysql.plan_replayer_status record failed", zap.String("sqlDigest", record.SQLDigest), zap.String("planDigest", record.PlanDigest), - zap.Error(err)) + zap.String("token", record.Token), + zap.String("instance", instance), + zap.Error(err), + ) } } } @@ -554,7 +571,7 @@ type PlanReplayerDumpTask struct { // variables used to dump the plan StartTS uint64 - SessionBindings []*bindinfo.BindRecord + SessionBindings []bindinfo.Bindings EncodedPlan string SessionVars *variable.SessionVars ExecStmts []ast.StmtNode diff --git a/pkg/domain/plan_replayer_dump.go b/pkg/domain/plan_replayer_dump.go index bebc79c51044b..28ce9677b7241 100644 --- a/pkg/domain/plan_replayer_dump.go +++ b/pkg/domain/plan_replayer_dump.go @@ -112,7 +112,7 @@ func (tne *tableNameExtractor) getTablesAndViews() map[tableNamePair]struct{} { return r } -func (tne *tableNameExtractor) Enter(in ast.Node) (ast.Node, bool) { +func (*tableNameExtractor) Enter(in ast.Node) (ast.Node, bool) { if _, ok := in.(*ast.TableName); ok { return in, true } @@ -593,14 +593,14 @@ func dumpVariables(sctx sessionctx.Context, sessionVars *variable.SessionVars, z return nil } -func dumpSessionBindRecords(records []*bindinfo.BindRecord, zw *zip.Writer) error { +func dumpSessionBindRecords(records []bindinfo.Bindings, zw *zip.Writer) error { sRows := make([][]string, 0) for _, bindData := range records { - for _, hint := range bindData.Bindings { + for _, hint := range bindData { sRows = append(sRows, []string{ - bindData.OriginalSQL, + hint.OriginalSQL, hint.BindSQL, - bindData.Db, + hint.Db, hint.Status, hint.CreateTime.String(), hint.UpdateTime.String(), @@ -755,7 +755,7 @@ func dumpPlanReplayerExplain(ctx sessionctx.Context, zw *zip.Writer, task *PlanR } func extractTableNames(ctx context.Context, sctx sessionctx.Context, - ExecStmts []ast.StmtNode, curDB model.CIStr) (map[tableNamePair]struct{}, error) { + execStmts []ast.StmtNode, curDB model.CIStr) (map[tableNamePair]struct{}, error) { tableExtractor := &tableNameExtractor{ ctx: ctx, executor: sctx.(sqlexec.RestrictedSQLExecutor), @@ -764,7 +764,7 @@ func extractTableNames(ctx context.Context, sctx sessionctx.Context, names: make(map[tableNamePair]struct{}), cteNames: make(map[string]struct{}), } - for _, execStmt := range ExecStmts { + for _, execStmt := range execStmts { execStmt.Accept(tableExtractor) } if tableExtractor.err != nil { diff --git a/pkg/domain/plan_replayer_handle_test.go b/pkg/domain/plan_replayer_handle_test.go index 48e8b5a55f402..3a1a819126d30 100644 --- a/pkg/domain/plan_replayer_handle_test.go +++ b/pkg/domain/plan_replayer_handle_test.go @@ -95,6 +95,7 @@ func TestPlanReplayerHandleDumpTask(t *testing.T) { require.NotNil(t, task) worker := prHandle.GetWorker() success := worker.HandleTask(task) + defer os.RemoveAll(replayer.GetPlanReplayerDirName()) require.True(t, success) require.Equal(t, prHandle.GetTaskStatus().GetRunningTaskStatusLen(), 0) // assert memory task consumed @@ -147,3 +148,59 @@ func TestPlanReplayerGC(t *testing.T) { require.NotNil(t, err) require.True(t, os.IsNotExist(err)) } + +func TestInsertPlanReplayerStatus(t *testing.T) { + store, dom := testkit.CreateMockStoreAndDomain(t) + tk := testkit.NewTestKit(t, store) + prHandle := dom.GetPlanReplayerHandle() + tk.MustExec("use test") + tk.MustExec(` + CREATE TABLE tableA ( + columnA VARCHAR(255), + columnB DATETIME, + columnC VARCHAR(255) + )`) + + // This is a single quote in the sql. + // We should escape it correctly. + sql := ` +SELECT * from tableA where SUBSTRING_INDEX(tableA.columnC, '_', 1) = tableA.columnA +` + + tk.MustQuery(sql) + _, d := tk.Session().GetSessionVars().StmtCtx.SQLDigest() + _, pd := tk.Session().GetSessionVars().StmtCtx.GetPlanDigest() + sqlDigest := d.String() + planDigest := pd.String() + + // Register task + tk.MustExec("delete from mysql.plan_replayer_task") + tk.MustExec("delete from mysql.plan_replayer_status") + tk.MustExec(fmt.Sprintf("insert into mysql.plan_replayer_task (sql_digest, plan_digest) values ('%v','%v');", sqlDigest, planDigest)) + err := prHandle.CollectPlanReplayerTask() + require.NoError(t, err) + require.Len(t, prHandle.GetTasks(), 1) + + tk.MustExec("SET @@tidb_enable_plan_replayer_capture = ON;") + + // Capture task and dump + tk.MustQuery(sql) + task := prHandle.DrainTask() + require.NotNil(t, task) + worker := prHandle.GetWorker() + success := worker.HandleTask(task) + defer os.RemoveAll(replayer.GetPlanReplayerDirName()) + require.True(t, success) + require.Equal(t, prHandle.GetTaskStatus().GetRunningTaskStatusLen(), 0) + // assert memory task consumed + require.Len(t, prHandle.GetTasks(), 0) + + // Check the plan_replayer_status. + // We should store the origin sql correctly. + rows := tk.MustQuery( + "select * from mysql.plan_replayer_status where sql_digest = ? and plan_digest = ? and origin_sql is not null", + sqlDigest, + planDigest, + ).Rows() + require.Len(t, rows, 1) +} diff --git a/pkg/domain/plan_replayer_test.go b/pkg/domain/plan_replayer_test.go index 1298b89306ce9..f182be2c8907c 100644 --- a/pkg/domain/plan_replayer_test.go +++ b/pkg/domain/plan_replayer_test.go @@ -16,6 +16,7 @@ package domain import ( "fmt" + "os" "path/filepath" "testing" "time" @@ -31,6 +32,7 @@ func TestPlanReplayerDifferentGC(t *testing.T) { time1 := time.Now().Add(-7 * 25 * time.Hour).UnixNano() require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/util/replayer/InjectPlanReplayerFileNameTimeField", fmt.Sprintf("return(%d)", time1))) file1, fileName1, err := replayer.GeneratePlanReplayerFile(true, false, false) + defer os.RemoveAll(replayer.GetPlanReplayerDirName()) require.NoError(t, err) require.NoError(t, file1.Close()) filePath1 := filepath.Join(dirName, fileName1) diff --git a/pkg/domain/resourcegroup/BUILD.bazel b/pkg/domain/resourcegroup/BUILD.bazel index 8a088e524f9c1..44648b1ed4606 100644 --- a/pkg/domain/resourcegroup/BUILD.bazel +++ b/pkg/domain/resourcegroup/BUILD.bazel @@ -8,6 +8,7 @@ go_library( deps = [ "//pkg/metrics", "//pkg/util/dbterror/exeerrors", + "//pkg/util/generic", "//pkg/util/logutil", "@com_github_jellydator_ttlcache_v3//:ttlcache", "@com_github_pingcap_kvproto//pkg/resource_manager", diff --git a/pkg/domain/resourcegroup/runaway.go b/pkg/domain/resourcegroup/runaway.go index 94e57c6eb2d56..c8047891f1997 100644 --- a/pkg/domain/resourcegroup/runaway.go +++ b/pkg/domain/resourcegroup/runaway.go @@ -25,6 +25,7 @@ import ( rmpb "github.com/pingcap/kvproto/pkg/resource_manager" "github.com/pingcap/tidb/pkg/metrics" "github.com/pingcap/tidb/pkg/util/dbterror/exeerrors" + "github.com/pingcap/tidb/pkg/util/generic" "github.com/pingcap/tidb/pkg/util/logutil" "github.com/prometheus/client_golang/prometheus" "github.com/tikv/client-go/v2/tikv" @@ -191,7 +192,7 @@ type RunawayManager struct { // activeGroup is used to manage the active runaway watches of resource group activeGroup map[string]int64 activeLock sync.RWMutex - metricsMap map[string]prometheus.Counter + metricsMap generic.SyncMap[string, prometheus.Counter] resourceGroupCtl *rmclient.ResourceGroupsController serverID string @@ -225,7 +226,7 @@ func NewRunawayManager(resourceGroupCtl *rmclient.ResourceGroupsController, serv quarantineChan: make(chan *QuarantineRecord, maxWatchRecordChannelSize), staleQuarantineRecord: staleQuarantineChan, activeGroup: make(map[string]int64), - metricsMap: make(map[string]prometheus.Counter), + metricsMap: generic.NewSyncMap[string, prometheus.Counter](8), } m.insertionCancel = watchList.OnInsertion(func(ctx context.Context, i *ttlcache.Item[string, *QuarantineRecord]) { m.activeLock.Lock() @@ -256,10 +257,10 @@ func (rm *RunawayManager) DeriveChecker(resourceGroupName, originalSQL, sqlDiges if group.RunawaySettings == nil && rm.activeGroup[resourceGroupName] == 0 { return nil } - counter, ok := rm.metricsMap[resourceGroupName] + counter, ok := rm.metricsMap.Load(resourceGroupName) if !ok { counter = metrics.RunawayCheckerCounter.WithLabelValues(resourceGroupName, "hit", "") - rm.metricsMap[resourceGroupName] = counter + rm.metricsMap.Store(resourceGroupName, counter) } counter.Inc() return newRunawayChecker(rm, resourceGroupName, group.RunawaySettings, originalSQL, sqlDigest, planDigest) @@ -395,7 +396,7 @@ func (rm *RunawayManager) markRunaway(resourceGroupName, originalSQL, planDigest } // FlushThreshold specifies the threshold for the number of records in trigger flush -func (rm *RunawayManager) FlushThreshold() int { +func (*RunawayManager) FlushThreshold() int { return maxWatchRecordChannelSize / 2 } diff --git a/pkg/domain/ru_stats.go b/pkg/domain/ru_stats.go new file mode 100644 index 0000000000000..44c887137dd0b --- /dev/null +++ b/pkg/domain/ru_stats.go @@ -0,0 +1,279 @@ +// Copyright 2023 PingCAP, 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. + +package domain + +import ( + "context" + "fmt" + "strings" + "time" + + "github.com/pingcap/errors" + "github.com/pingcap/tidb/pkg/infoschema" + "github.com/pingcap/tidb/pkg/kv" + "github.com/pingcap/tidb/pkg/meta" + "github.com/pingcap/tidb/pkg/parser/model" + "github.com/pingcap/tidb/pkg/util/intest" + "github.com/pingcap/tidb/pkg/util/logutil" + pd "github.com/tikv/pd/client" + "go.uber.org/zap" +) + +const ( + maxRetryCount int = 10 + ruStatsInterval time.Duration = 24 * time.Hour + // only keep stats rows for last 3 monthes(92 days at most). + ruStatsGCDuration time.Duration = 92 * ruStatsInterval + gcBatchSize int64 = 1000 +) + +// RUStatsWriter represents a write to write ru historical data into mysql.request_unit_by_group. +type RUStatsWriter struct { + // make some fields public for unit test. + Interval time.Duration + RMClient pd.ResourceManagerClient + InfoCache *infoschema.InfoCache + store kv.Storage + sessPool *sessionPool + // current time, cache it here to make unit test easier. + StartTime time.Time +} + +// NewRUStatsWriter build a RUStatsWriter from Domain. +func NewRUStatsWriter(do *Domain) *RUStatsWriter { + return &RUStatsWriter{ + Interval: ruStatsInterval, + RMClient: do.GetPDClient(), + InfoCache: do.infoCache, + store: do.store, + sessPool: do.sysSessionPool, + } +} + +func (do *Domain) requestUnitsWriterLoop() { + // do not start flush loop in unit test. + if intest.InTest { + return + } + ruWriter := NewRUStatsWriter(do) + for { + start := time.Now() + count := 0 + lastTime := GetLastExpectedTime(start, ruWriter.Interval) + if do.DDL().OwnerManager().IsOwner() { + var err error + for { + ruWriter.StartTime = time.Now() + err = ruWriter.DoWriteRUStatistics(context.Background()) + if err == nil { + break + } + logutil.BgLogger().Error("failed to insert request_unit_by_group data", zap.Error(err), zap.Int("retry", count)) + count++ + if count > maxRetryCount { + break + } + time.Sleep(time.Second) + } + // try gc outdated rows + if err := ruWriter.GCOutdatedRecords(lastTime); err != nil { + logutil.BgLogger().Warn("[ru_stats] gc outdated rowd failed, will try next time.", zap.Error(err)) + } + + logutil.BgLogger().Info("[ru_stats] finish write ru historical data", zap.String("end_time", lastTime.Format(time.DateTime)), + zap.Stringer("interval", ruStatsInterval), zap.Stringer("cost", time.Since(start)), zap.Error(err)) + } + + nextTime := lastTime.Add(ruStatsInterval) + dur := time.Until(nextTime) + timer := time.NewTimer(dur) + select { + case <-do.exit: + return + case <-timer.C: + } + } +} + +// GetLastExpectedTime return the last written ru time. +func GetLastExpectedTime(now time.Time, interval time.Duration) time.Time { + nowTs := now.Unix() + intervalSecs := int64(interval / time.Second) + tzOffset := time.Date(1971, 1, 1, 0, 0, 0, 0, time.Local).Unix() + targetTs := nowTs - (nowTs+intervalSecs-tzOffset)%intervalSecs + return time.Unix(targetTs, 0) +} + +// DoWriteRUStatistics write ru historical data into mysql.request_unit_by_group. +func (r *RUStatsWriter) DoWriteRUStatistics(ctx context.Context) error { + // check if is already inserted + lastEndTime := GetLastExpectedTime(r.StartTime, r.Interval) + isInserted, err := r.isLatestDataInserted(lastEndTime) + if err != nil { + return err + } + if isInserted { + logutil.BgLogger().Info("[ru_stats] ru data is already inserted, skip", zap.Stringer("end_time", lastEndTime)) + return nil + } + + lastStats, err := r.loadLatestRUStats() + if err != nil { + return err + } + needFetchData := true + if lastStats != nil && lastStats.Latest != nil { + needFetchData = lastStats.Latest.EndTime != lastEndTime + } + + ruStats := lastStats + if needFetchData { + stats, err := r.fetchResourceGroupStats(ctx) + if err != nil { + return err + } + ruStats = &meta.RUStats{ + Latest: &meta.DailyRUStats{ + EndTime: lastEndTime, + Stats: stats, + }, + } + if lastStats != nil { + ruStats.Previous = lastStats.Latest + } + err = r.persistLatestRUStats(ruStats) + if err != nil { + return err + } + } + return r.insertRUStats(ruStats) +} + +func (r *RUStatsWriter) fetchResourceGroupStats(ctx context.Context) ([]meta.GroupRUStats, error) { + groups, err := r.RMClient.ListResourceGroups(ctx, pd.WithRUStats) + if err != nil { + return nil, errors.Trace(err) + } + infos := r.InfoCache.GetLatest() + res := make([]meta.GroupRUStats, 0, len(groups)) + for _, g := range groups { + groupInfo, exists := infos.ResourceGroupByName(model.NewCIStr(g.Name)) + if !exists { + continue + } + res = append(res, meta.GroupRUStats{ + ID: groupInfo.ID, + Name: groupInfo.Name.O, + RUConsumption: g.RUStats, + }) + } + return res, nil +} + +func (r *RUStatsWriter) loadLatestRUStats() (*meta.RUStats, error) { + snapshot := r.store.GetSnapshot(kv.MaxVersion) + metaStore := meta.NewSnapshotMeta(snapshot) + return metaStore.GetRUStats() +} + +func (r *RUStatsWriter) persistLatestRUStats(stats *meta.RUStats) error { + ctx := kv.WithInternalSourceType(context.Background(), kv.InternalTxnOthers) + return kv.RunInNewTxn(ctx, r.store, true, func(ctx context.Context, txn kv.Transaction) error { + return meta.NewMeta(txn).SetRUStats(stats) + }) +} + +func (r *RUStatsWriter) isLatestDataInserted(lastEndTime time.Time) (bool, error) { + end := lastEndTime.Format(time.DateTime) + start := lastEndTime.Add(-ruStatsInterval).Format(time.DateTime) + rows, sqlErr := execRestrictedSQL(r.sessPool, "SELECT 1 from mysql.request_unit_by_group where start_time = %? and end_time = %? limit 1", []interface{}{start, end}) + if sqlErr != nil { + return false, errors.Trace(sqlErr) + } + return len(rows) > 0, nil +} + +func (r *RUStatsWriter) insertRUStats(stats *meta.RUStats) error { + sql := generateSQL(stats) + if sql == "" { + return nil + } + + _, err := execRestrictedSQL(r.sessPool, sql, nil) + return err +} + +// GCOutdatedRecords delete outdated records from target table. +func (r *RUStatsWriter) GCOutdatedRecords(lastEndTime time.Time) error { + gcEndDate := lastEndTime.Add(-ruStatsGCDuration).Format(time.DateTime) + countSQL := fmt.Sprintf("SELECT count(*) FROM mysql.request_unit_by_group where end_time <= '%s'", gcEndDate) + rows, err := execRestrictedSQL(r.sessPool, countSQL, nil) + if err != nil { + return errors.Trace(err) + } + totalCount := rows[0].GetInt64(0) + + loopCount := (totalCount + gcBatchSize - 1) / gcBatchSize + for i := int64(0); i < loopCount; i++ { + sql := fmt.Sprintf("DELETE FROM mysql.request_unit_by_group where end_time <= '%s' order by end_time limit %d", gcEndDate, gcBatchSize) + _, err = execRestrictedSQL(r.sessPool, sql, nil) + if err != nil { + return errors.Trace(err) + } + } + + return nil +} + +func generateSQL(stats *meta.RUStats) string { + var buf strings.Builder + buf.WriteString("REPLACE INTO mysql.request_unit_by_group(start_time, end_time, resource_group, total_ru) VALUES ") + prevStats := make(map[string]meta.GroupRUStats) + if stats.Previous != nil { + for _, g := range stats.Previous.Stats { + if g.RUConsumption != nil { + prevStats[g.Name] = g + } + } + } + end := stats.Latest.EndTime.Format(time.DateTime) + start := stats.Latest.EndTime.Add(-ruStatsInterval).Format(time.DateTime) + count := 0 + for _, g := range stats.Latest.Stats { + if g.RUConsumption == nil { + logutil.BgLogger().Warn("group ru consumption statistics data is empty", zap.String("name", g.Name), zap.Int64("id", g.ID)) + continue + } + ru := g.RUConsumption.RRU + g.RUConsumption.WRU + if prev, ok := prevStats[g.Name]; ok && prev.RUConsumption != nil && g.ID == prev.ID { + ru -= prev.RUConsumption.RRU + prev.RUConsumption.WRU + } + // ignore too small delta value + if ru < 1.0 { + continue + } + if count > 0 { + buf.WriteRune(',') + } + rowData := fmt.Sprintf(`("%s", "%s", "%s", %d)`, start, end, g.Name, int64(ru)) + buf.WriteString(rowData) + count++ + } + if count == 0 { + return "" + } + buf.WriteRune(';') + return buf.String() +} diff --git a/pkg/domain/ru_stats_test.go b/pkg/domain/ru_stats_test.go new file mode 100644 index 0000000000000..8ea0d8df2cdd7 --- /dev/null +++ b/pkg/domain/ru_stats_test.go @@ -0,0 +1,149 @@ +// Copyright 2023 PingCAP, 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. + +package domain_test + +import ( + "context" + "testing" + "time" + + rmpb "github.com/pingcap/kvproto/pkg/resource_manager" + "github.com/pingcap/tidb/pkg/domain" + "github.com/pingcap/tidb/pkg/infoschema" + "github.com/pingcap/tidb/pkg/parser/model" + "github.com/pingcap/tidb/pkg/testkit" + "github.com/stretchr/testify/require" + pd "github.com/tikv/pd/client" +) + +func TestWriteRUStatistics(t *testing.T) { + store, dom := testkit.CreateMockStoreAndDomain(t) + tk := newTestKit(t, store) + + testRUWriter := domain.NewRUStatsWriter(dom) + testRMClient := &testRMClient{ + groups: []*rmpb.ResourceGroup{ + { + Name: "default", + RUStats: &rmpb.Consumption{ + RRU: 200.0, + WRU: 150.0, + }, + }, + { + Name: "test", + RUStats: &rmpb.Consumption{ + RRU: 100.0, + WRU: 50.0, + }, + }, + }, + } + infoGroups := make(map[string]*model.ResourceGroupInfo, 2) + infoGroups["default"] = &model.ResourceGroupInfo{ + ID: 1, + Name: model.NewCIStr("default"), + } + infoGroups["test"] = &model.ResourceGroupInfo{ + ID: 2, + Name: model.NewCIStr("test"), + } + testInfo := &testInfoschema{ + groups: infoGroups, + } + testInfoCache := infoschema.NewCache(1) + testInfoCache.Insert(testInfo, uint64(time.Now().Unix())) + testRUWriter.RMClient = testRMClient + testRUWriter.InfoCache = testInfoCache + + tk.MustQuery("SELECT count(*) from mysql.request_unit_by_group").Check(testkit.Rows("0")) + + testRUWriter.StartTime = time.Date(2023, 12, 26, 0, 0, 1, 0, time.Local) + require.NoError(t, testRUWriter.DoWriteRUStatistics(context.Background())) + tk.MustQuery("SELECT resource_group, total_ru from mysql.request_unit_by_group").Check(testkit.Rows("default 350", "test 150")) + + // after 1 day, only 1 group has delta ru. + testRMClient.groups[1].RUStats.RRU = 500 + testRUWriter.StartTime = time.Date(2023, 12, 27, 0, 0, 1, 0, time.Local) + require.NoError(t, testRUWriter.DoWriteRUStatistics(context.Background())) + tk.MustQuery("SELECT resource_group, total_ru from mysql.request_unit_by_group where end_time = '2023-12-27'").Check(testkit.Rows("test 400")) + + // test after 1 day with 0 delta ru, no data inserted. + testRUWriter.StartTime = time.Date(2023, 12, 28, 0, 0, 1, 0, time.Local) + require.NoError(t, testRUWriter.DoWriteRUStatistics(context.Background())) + tk.MustQuery("SELECT count(*) from mysql.request_unit_by_group where end_time = '2023-12-28'").Check(testkit.Rows("0")) + + testRUWriter.StartTime = time.Date(2023, 12, 29, 0, 0, 0, 0, time.Local) + testRMClient.groups[0].RUStats.WRU = 200 + require.NoError(t, testRUWriter.DoWriteRUStatistics(context.Background())) + tk.MustQuery("SELECT resource_group, total_ru from mysql.request_unit_by_group where end_time = '2023-12-29'").Check(testkit.Rows("default 50")) + + // after less than 1 day, even if ru changes, no new rows inserted. + // This is to test after restart, no unexpected data are inserted. + testRMClient.groups[0].RUStats.RRU = 1000 + testRMClient.groups[1].RUStats.WRU = 2000 + testRUWriter.StartTime = time.Date(2023, 12, 29, 1, 0, 0, 0, time.Local) + require.NoError(t, testRUWriter.DoWriteRUStatistics(context.Background())) + tk.MustQuery("SELECT resource_group, total_ru from mysql.request_unit_by_group where end_time = '2023-12-29'").Check(testkit.Rows("default 50")) + + // after 61 days, old record should be GCed. + testRUWriter.StartTime = time.Date(2023, 12, 26, 0, 0, 0, 0, time.Local).Add(92 * 24 * time.Hour) + tk.MustQuery("SELECT count(*) from mysql.request_unit_by_group where end_time = '2023-12-26'").Check(testkit.Rows("2")) + require.NoError(t, testRUWriter.GCOutdatedRecords(testRUWriter.StartTime)) + tk.MustQuery("SELECT count(*) from mysql.request_unit_by_group where end_time = '2023-12-26'").Check(testkit.Rows("0")) + tk.MustQuery("SELECT count(*) from mysql.request_unit_by_group where end_time = '2023-12-27'").Check(testkit.Rows("1")) +} + +type testRMClient struct { + pd.ResourceManagerClient + groups []*rmpb.ResourceGroup +} + +func (c *testRMClient) ListResourceGroups(ctx context.Context, opts ...pd.GetResourceGroupOption) ([]*rmpb.ResourceGroup, error) { + return c.groups, nil +} + +type testInfoschema struct { + infoschema.InfoSchema + groups map[string]*model.ResourceGroupInfo +} + +func (is *testInfoschema) ResourceGroupByName(name model.CIStr) (*model.ResourceGroupInfo, bool) { + g, ok := is.groups[name.L] + return g, ok +} + +func (is *testInfoschema) SchemaMetaVersion() int64 { + return 1 +} + +func TestGetLastExpectedTime(t *testing.T) { + // 2023-12-28 10:46:23.000 + now := time.Date(2023, 12, 28, 10, 46, 23, 0, time.Local) + newTime := func(hour, minute int) time.Time { + return time.Date(2023, 12, 28, hour, minute, 0, 0, time.Local) + } + + require.Equal(t, domain.GetLastExpectedTime(now, 5*time.Minute), newTime(10, 45)) + require.Equal(t, domain.GetLastExpectedTime(time.Date(2023, 12, 28, 10, 45, 0, 0, time.Local), 5*time.Minute), newTime(10, 45)) + require.Equal(t, domain.GetLastExpectedTime(now, 10*time.Minute), newTime(10, 40)) + require.Equal(t, domain.GetLastExpectedTime(now, 30*time.Minute), newTime(10, 30)) + require.Equal(t, domain.GetLastExpectedTime(now, time.Hour), newTime(10, 0)) + require.Equal(t, domain.GetLastExpectedTime(now, 3*time.Hour), newTime(9, 0)) + require.Equal(t, domain.GetLastExpectedTime(now, 4*time.Hour), newTime(8, 0)) + require.Equal(t, domain.GetLastExpectedTime(now, 12*time.Hour), newTime(0, 0)) + require.Equal(t, domain.GetLastExpectedTime(now, 24*time.Hour), newTime(0, 0)) + require.Equal(t, domain.GetLastExpectedTime(time.Date(2023, 12, 28, 0, 0, 0, 0, time.Local), 24*time.Hour), newTime(0, 0)) +} diff --git a/pkg/domain/runaway.go b/pkg/domain/runaway.go index 8c9f439f51fe7..e61f9f93c6ec3 100644 --- a/pkg/domain/runaway.go +++ b/pkg/domain/runaway.go @@ -100,7 +100,7 @@ func (do *Domain) deleteExpiredRows(tableName, colName string, expiredDuration t return } - rows, sqlErr := do.execRestrictedSQL(sql, nil) + rows, sqlErr := execRestrictedSQL(do.sysSessionPool, sql, nil) if sqlErr != nil { logutil.BgLogger().Error("delete system table failed", zap.String("table", tableName), zap.Error(err)) return @@ -129,7 +129,7 @@ func (do *Domain) deleteExpiredRows(tableName, colName string, expiredDuration t return } - _, err = do.execRestrictedSQL(sql, nil) + _, err = execRestrictedSQL(do.sysSessionPool, sql, nil) if err != nil { logutil.BgLogger().Error( "delete SQL failed when deleting system table", zap.Error(err), zap.String("SQL", sql), @@ -229,7 +229,7 @@ func (do *Domain) runawayRecordFlushLoop() { return } sql, params := resourcegroup.GenRunawayQueriesStmt(records) - if _, err := do.execRestrictedSQL(sql, params); err != nil { + if _, err := execRestrictedSQL(do.sysSessionPool, sql, params); err != nil { logutil.BgLogger().Error("flush runaway records failed", zap.Error(err), zap.Int("count", len(records))) } records = records[:0] @@ -404,10 +404,10 @@ func (do *Domain) handleRemoveStaleRunawayWatch(record *resourcegroup.Quarantine return err } -func (do *Domain) execRestrictedSQL(sql string, params []interface{}) ([]chunk.Row, error) { - se, err := do.sysSessionPool.Get() +func execRestrictedSQL(sessPool *sessionPool, sql string, params []interface{}) ([]chunk.Row, error) { + se, err := sessPool.Get() defer func() { - do.sysSessionPool.Put(se) + sessPool.Put(se) }() if err != nil { return nil, errors.Annotate(err, "get session failed") @@ -610,7 +610,7 @@ func (r *SystemTableReader) genSelectStmt() (string, []interface{}) { return builder.String(), params } -func (r *SystemTableReader) Read(exec sqlexec.RestrictedSQLExecutor, genFn func() (string, []interface{})) ([]chunk.Row, error) { +func (*SystemTableReader) Read(exec sqlexec.RestrictedSQLExecutor, genFn func() (string, []interface{})) ([]chunk.Row, error) { ctx := kv.WithInternalSourceType(context.Background(), kv.InternalTxnOthers) sql, params := genFn() rows, _, err := exec.ExecRestrictedSQL(ctx, []sqlexec.OptionFuncAlias{sqlexec.ExecOptionUseCurSession}, diff --git a/pkg/domain/schema_checker.go b/pkg/domain/schema_checker.go index e2a652372beb7..87f90b7e6bf42 100644 --- a/pkg/domain/schema_checker.go +++ b/pkg/domain/schema_checker.go @@ -64,8 +64,8 @@ func (s *SchemaChecker) CheckBySchemaVer(txnTS uint64, startSchemaVer tikv.Schem schemaOutOfDateRetryInterval := SchemaOutOfDateRetryInterval.Load() schemaOutOfDateRetryTimes := int(SchemaOutOfDateRetryTimes.Load()) for i := 0; i < schemaOutOfDateRetryTimes; i++ { - relatedChange, CheckResult := s.SchemaValidator.Check(txnTS, startSchemaVer.SchemaMetaVersion(), s.relatedTableIDs, s.needCheckSchema) - switch CheckResult { + relatedChange, checkResult := s.SchemaValidator.Check(txnTS, startSchemaVer.SchemaMetaVersion(), s.relatedTableIDs, s.needCheckSchema) + switch checkResult { case ResultSucc: return nil, nil case ResultFail: diff --git a/pkg/domain/schema_validator.go b/pkg/domain/schema_validator.go index df5f9f7beefcb..8696edd2a5ca4 100644 --- a/pkg/domain/schema_validator.go +++ b/pkg/domain/schema_validator.go @@ -70,6 +70,7 @@ type schemaValidator struct { mux sync.RWMutex lease time.Duration latestSchemaVer int64 + restartSchemaVer int64 latestInfoSchema infoschema.InfoSchema do *Domain latestSchemaExpire time.Time @@ -110,6 +111,12 @@ func (s *schemaValidator) Restart() { s.mux.Lock() defer s.mux.Unlock() s.isStarted = true + if s.do != nil { + // When this instance reconnects PD, we should record the latest schema verion after mustReload(), + // to prevent write txns using a stale schema version by aborting them before commit. + // However, the problem still exists for read-only txns. + s.restartSchemaVer = s.do.InfoSchema().SchemaMetaVersion() + } } func (s *schemaValidator) Reset() { @@ -119,6 +126,7 @@ func (s *schemaValidator) Reset() { s.isStarted = true s.latestSchemaVer = 0 s.deltaSchemaInfos = s.deltaSchemaInfos[:0] + s.restartSchemaVer = 0 } func (s *schemaValidator) Update(leaseGrantTS uint64, oldVer, currVer int64, change *transaction.RelatedSchemaChange) { @@ -228,6 +236,12 @@ func (s *schemaValidator) Check(txnTS uint64, schemaVer int64, relatedPhysicalTa logutil.BgLogger().Info("the schema validator stopped before checking") return nil, ResultUnknown } + + if schemaVer < s.restartSchemaVer { + logutil.BgLogger().Info("the schema version is too old, TiDB and PD maybe unhealthy after the transaction started", + zap.Int64("schemaVer", schemaVer)) + return nil, ResultFail + } if s.lease == 0 { return nil, ResultSucc } diff --git a/pkg/domain/sysvar_cache.go b/pkg/domain/sysvar_cache.go index 854a9fc820fb3..753100c42e440 100644 --- a/pkg/domain/sysvar_cache.go +++ b/pkg/domain/sysvar_cache.go @@ -17,6 +17,7 @@ package domain import ( "context" "fmt" + "maps" "github.com/pingcap/tidb/pkg/kv" "github.com/pingcap/tidb/pkg/sessionctx" @@ -25,7 +26,6 @@ import ( "github.com/pingcap/tidb/pkg/util/sqlexec" "github.com/pingcap/tidb/pkg/util/syncutil" "go.uber.org/zap" - "golang.org/x/exp/maps" ) // The sysvar cache replaces the GlobalVariableCache. @@ -85,7 +85,7 @@ func (do *Domain) GetGlobalVar(name string) (string, error) { return "", variable.ErrUnknownSystemVar.GenWithStackByArgs(name) } -func (do *Domain) fetchTableValues(sctx sessionctx.Context) (map[string]string, error) { +func (*Domain) fetchTableValues(sctx sessionctx.Context) (map[string]string, error) { tableContents := make(map[string]string) // Copy all variables from the table to tableContents exec := sctx.(sqlexec.RestrictedSQLExecutor) diff --git a/pkg/errctx/BUILD.bazel b/pkg/errctx/BUILD.bazel index ef0f7368ccd79..6fe6f78f5ee1a 100644 --- a/pkg/errctx/BUILD.bazel +++ b/pkg/errctx/BUILD.bazel @@ -7,6 +7,7 @@ go_library( visibility = ["//visibility:public"], deps = [ "//pkg/errno", + "//pkg/util/context", "//pkg/util/intest", "@com_github_pingcap_errors//:errors", ], @@ -20,6 +21,7 @@ go_test( deps = [ ":errctx", "//pkg/types", + "//pkg/util/context", "@com_github_pingcap_errors//:errors", "@com_github_stretchr_testify//require", "@org_uber_go_multierr//:multierr", diff --git a/pkg/errctx/context.go b/pkg/errctx/context.go index 18dd3e5b22c1a..7be4c20c59ec0 100644 --- a/pkg/errctx/context.go +++ b/pkg/errctx/context.go @@ -17,6 +17,7 @@ package errctx import ( "github.com/pingcap/errors" "github.com/pingcap/tidb/pkg/errno" + contextutil "github.com/pingcap/tidb/pkg/util/context" "github.com/pingcap/tidb/pkg/util/intest" ) @@ -32,16 +33,29 @@ const ( LevelIgnore ) +// LevelMap indicates the map from `ErrGroup` to `Level` +type LevelMap [errGroupCount]Level + // Context defines how to handle an error type Context struct { - levelMap [errGroupCount]Level - appendWarningFn func(err error) + levelMap LevelMap + warnHandler contextutil.WarnHandler +} + +// LevelMap returns the `levelMap` of the context. +func (ctx *Context) LevelMap() LevelMap { + return ctx.levelMap +} + +// LevelForGroup returns the level for a specified group. +func (ctx *Context) LevelForGroup(errGroup ErrGroup) Level { + return ctx.levelMap[errGroup] } // WithStrictErrGroupLevel makes the context to return the error directly for any kinds of errors. func (ctx *Context) WithStrictErrGroupLevel() Context { newCtx := Context{ - appendWarningFn: ctx.appendWarningFn, + warnHandler: ctx.warnHandler, } return newCtx @@ -50,24 +64,32 @@ func (ctx *Context) WithStrictErrGroupLevel() Context { // WithErrGroupLevel sets a `Level` for an `ErrGroup` func (ctx *Context) WithErrGroupLevel(eg ErrGroup, l Level) Context { newCtx := Context{ - levelMap: ctx.levelMap, - appendWarningFn: ctx.appendWarningFn, + levelMap: ctx.levelMap, + warnHandler: ctx.warnHandler, } newCtx.levelMap[eg] = l return newCtx } -// appendWarning appends the error to warning. If the inner `appendWarningFn` is nil, do nothing. +// WithErrGroupLevels sets `levelMap` for an `ErrGroup` +func (ctx *Context) WithErrGroupLevels(levels LevelMap) Context { + return Context{ + levelMap: levels, + warnHandler: ctx.warnHandler, + } +} + +// appendWarning appends the error to warning. If the inner `warnHandler` is nil, do nothing. func (ctx *Context) appendWarning(err error) { - intest.Assert(ctx.appendWarningFn != nil) - if fn := ctx.appendWarningFn; fn != nil { - // appendWarningFn should always not be nil, check fn != nil here to just make code safe. - fn(err) + intest.Assert(ctx.warnHandler != nil) + if w := ctx.warnHandler; w != nil { + // warnHandler should always not be nil, check fn != nil here to just make code safe. + w.AppendWarning(err) } } -// HandleError handles the error according to the context. See the comment of `HandleErrorWithAlias` for detailed logic. +// HandleError handles the error according to the contextutil. See the comment of `HandleErrorWithAlias` for detailed logic. // // It also allows using `errors.ErrorGroup`, in this case, it'll handle each error in order, and return the first error // it founds. @@ -92,7 +114,7 @@ func (ctx *Context) HandleError(err error) error { return ctx.HandleErrorWithAlias(err, err, err) } -// HandleErrorWithAlias handles the error according to the context. +// HandleErrorWithAlias handles the error according to the contextutil. // 1. If the `internalErr` is not `"pingcap/errors".Error`, or the error code is not defined in the `errGroupMap`, or the error // level is set to `LevelError`(0), the `err` will be returned directly. // 2. If the error level is set to `LevelWarn`, the `warnErr` will be appended as a warning. @@ -134,17 +156,21 @@ func (ctx *Context) HandleErrorWithAlias(internalErr error, err error, warnErr e } // NewContext creates an error context to handle the errors and warnings -func NewContext(appendWarningFn func(err error)) Context { - intest.Assert(appendWarningFn != nil) +func NewContext(handler contextutil.WarnHandler) Context { + return NewContextWithLevels(LevelMap{}, handler) +} + +// NewContextWithLevels creates an error context to handle the errors and warnings +func NewContextWithLevels(levels LevelMap, handler contextutil.WarnHandler) Context { + intest.Assert(handler != nil) return Context{ - appendWarningFn: appendWarningFn, + warnHandler: handler, + levelMap: levels, } } // StrictNoWarningContext returns all errors directly, and ignore all errors -var StrictNoWarningContext = NewContext(func(_ error) { - // the error is ignored -}) +var StrictNoWarningContext = NewContext(contextutil.IgnoreWarn) var errGroupMap = make(map[errors.ErrCode]ErrGroup) @@ -154,29 +180,70 @@ type ErrGroup int const ( // ErrGroupTruncate is the group of truncated errors ErrGroupTruncate ErrGroup = iota - // ErrGroupOverflow is the group of overflow errors - ErrGroupOverflow - + // ErrGroupDupKey is the group of duplicate key errors + ErrGroupDupKey + // ErrGroupBadNull is the group of bad null errors + ErrGroupBadNull + // ErrGroupDividedByZero is the group of divided by zero errors + ErrGroupDividedByZero + // ErrGroupAutoIncReadFailed is the group of auto increment read failed errors + ErrGroupAutoIncReadFailed + // ErrGroupNoMatchedPartition is the group of no partition is matched errors. + ErrGroupNoMatchedPartition // errGroupCount is the count of all `ErrGroup`. Please leave it at the end of the list. errGroupCount ) func init() { - truncateErrCodes := []errors.ErrCode{ - errno.ErrTruncatedWrongValue, - errno.ErrDataTooLong, - errno.ErrTruncatedWrongValueForField, - errno.ErrWarnDataOutOfRange, - errno.ErrDataOutOfRange, - errno.ErrBadNumber, - errno.ErrWrongValueForType, - errno.ErrDatetimeFunctionOverflow, - errno.WarnDataTruncated, - errno.ErrIncorrectDatetimeValue, + group2Errors := map[ErrGroup][]errors.ErrCode{ + ErrGroupTruncate: { + errno.ErrTruncatedWrongValue, + errno.ErrDataTooLong, + errno.ErrTruncatedWrongValueForField, + errno.ErrWarnDataOutOfRange, + errno.ErrDataOutOfRange, + errno.ErrBadNumber, + errno.ErrWrongValueForType, + errno.ErrDatetimeFunctionOverflow, + errno.WarnDataTruncated, + errno.ErrIncorrectDatetimeValue, + }, + ErrGroupBadNull: { + errno.ErrBadNull, + errno.ErrWarnNullToNotnull, + }, + ErrGroupDividedByZero: { + errno.ErrDivisionByZero, + }, + ErrGroupAutoIncReadFailed: { + errno.ErrAutoincReadFailed, + }, + ErrGroupNoMatchedPartition: { + errno.ErrNoPartitionForGivenValue, + errno.ErrRowDoesNotMatchGivenPartitionSet, + }, + ErrGroupDupKey: { + errno.ErrDupEntry, + }, } - for _, errCode := range truncateErrCodes { - errGroupMap[errCode] = ErrGroupTruncate + + for group, codes := range group2Errors { + for _, errCode := range codes { + errGroupMap[errCode] = group + } } +} - errGroupMap[errno.ErrDataOutOfRange] = ErrGroupOverflow +// ResolveErrLevel resolves the error level according to the `ignore` and `warn` flags +// if ignore is true, it will return `LevelIgnore` to ignore the error, +// otherwise, it will return `LevelWarn` or `LevelError` according to the `warn` flag +// Only one of `ignore` and `warn` can be true. +func ResolveErrLevel(ignore bool, warn bool) Level { + if ignore { + return LevelIgnore + } + if warn { + return LevelWarn + } + return LevelError } diff --git a/pkg/errctx/context_test.go b/pkg/errctx/context_test.go index e78cbb09c7640..1627853662a8a 100644 --- a/pkg/errctx/context_test.go +++ b/pkg/errctx/context_test.go @@ -20,15 +20,16 @@ import ( "github.com/pingcap/errors" "github.com/pingcap/tidb/pkg/errctx" "github.com/pingcap/tidb/pkg/types" + contextutil "github.com/pingcap/tidb/pkg/util/context" "github.com/stretchr/testify/require" "go.uber.org/multierr" ) func TestContext(t *testing.T) { var warn error - ctx := errctx.NewContext(func(err error) { + ctx := errctx.NewContext(contextutil.NewFuncWarnHandlerForTest(func(err error) { warn = err - }) + })) testInternalErr := types.ErrOverflow testErr := errors.New("error") @@ -37,12 +38,21 @@ func TestContext(t *testing.T) { require.Equal(t, ctx.HandleErrorWithAlias(testInternalErr, testErr, testWarn), testErr) // set level to "warn" - newCtx := ctx.WithErrGroupLevel(errctx.ErrGroupOverflow, errctx.LevelWarn) + newCtx := ctx.WithErrGroupLevel(errctx.ErrGroupTruncate, errctx.LevelWarn) // ctx is not affected require.Equal(t, ctx.HandleErrorWithAlias(testInternalErr, testErr, testWarn), testErr) // newCtx will handle the error as a warn require.NoError(t, newCtx.HandleErrorWithAlias(testInternalErr, testErr, testWarn)) require.Equal(t, warn, testWarn) + levels := newCtx.LevelMap() + for i := errctx.ErrGroup(0); i <= errctx.ErrGroup(len(levels)-1); i++ { + if i == errctx.ErrGroupTruncate { + require.Equal(t, errctx.LevelWarn, levels[i]) + } else { + require.Equal(t, errctx.LevelError, levels[i]) + require.Equal(t, levels[i], newCtx.LevelForGroup(i)) + } + } warn = nil newCtx2 := newCtx.WithStrictErrGroupLevel() @@ -51,6 +61,7 @@ func TestContext(t *testing.T) { require.Equal(t, warn, testWarn) // newCtx2 will return all errors require.Equal(t, newCtx2.HandleErrorWithAlias(testInternalErr, testErr, testWarn), testErr) + require.Equal(t, errctx.LevelMap{}, newCtx2.LevelMap()) // test `multierr` testErrs := multierr.Append(testInternalErr, testErr) @@ -60,4 +71,22 @@ func TestContext(t *testing.T) { // test nil require.Nil(t, ctx.HandleError(nil)) + + // test with a level map + levels = errctx.LevelMap{} + levels[errctx.ErrGroupAutoIncReadFailed] = errctx.LevelWarn + ctx = errctx.NewContextWithLevels(levels, contextutil.NewFuncWarnHandlerForTest(func(err error) { + warn = err + })) + require.Equal(t, levels, ctx.LevelMap()) + levels2 := errctx.LevelMap{} + levels2[errctx.ErrGroupAutoIncReadFailed] = errctx.LevelIgnore + ctx = ctx.WithErrGroupLevels(levels2) + require.Equal(t, levels2, ctx.LevelMap()) + + // original levels should not change + ctx = ctx.WithErrGroupLevels(errctx.LevelMap{}) + require.Equal(t, errctx.LevelMap{}, ctx.LevelMap()) + require.Equal(t, errctx.LevelWarn, levels[errctx.ErrGroupAutoIncReadFailed]) + require.Equal(t, errctx.LevelIgnore, levels2[errctx.ErrGroupAutoIncReadFailed]) } diff --git a/pkg/errno/errcode.go b/pkg/errno/errcode.go index 0a20b0be530f9..829f7682f4e3d 100644 --- a/pkg/errno/errcode.go +++ b/pkg/errno/errcode.go @@ -1135,6 +1135,7 @@ const ( ErrCannotPauseDDLJob = 8260 ErrCannotResumeDDLJob = 8261 ErrPausedDDLJob = 8262 + ErrBDRRestrictedDDL = 8263 // Resource group errors. ErrResourceGroupExists = 8248 diff --git a/pkg/errno/errname.go b/pkg/errno/errname.go index 631afe3d773b7..6327ab4a8f696 100644 --- a/pkg/errno/errname.go +++ b/pkg/errno/errname.go @@ -1059,7 +1059,7 @@ var MySQLErrName = map[uint16]*mysql.ErrMessage{ ErrLoadParquetFromLocal: mysql.Message("Do not support loading parquet files from local. Please try to load the parquet files from the cloud storage", nil), ErrLoadDataEmptyPath: mysql.Message("The value of INFILE must not be empty when LOAD DATA from LOCAL", nil), ErrLoadDataUnsupportedFormat: mysql.Message("The FORMAT '%s' is not supported", nil), - ErrLoadDataInvalidURI: mysql.Message("The URI of %s is invalid. Reason: %s. Please provide a valid URI, such as 's3://import/test.csv?access_key_id={your_access_key_id ID}&secret_access_key={your_secret_access_key}&session_token={your_session_token}'", nil), + ErrLoadDataInvalidURI: mysql.Message("The URI of %s is invalid. Reason: %s. Please provide a valid URI, such as 's3://import/test.csv?access-key={your_access_key_id ID}&secret-access-key={your_secret_access_key}&session-token={your_session_token}'", nil), ErrLoadDataCantAccess: mysql.Message("Access to the %s has been denied. Reason: %s. Please check the URI, access key and secret access key are correct", nil), ErrLoadDataCantRead: mysql.Message("Failed to read source files. Reason: %s. %s", nil), ErrLoadDataWrongFormatConfig: mysql.Message("", nil), @@ -1164,4 +1164,5 @@ var MySQLErrName = map[uint16]*mysql.ErrMessage{ ErrCannotPauseDDLJob: mysql.Message("Job [%v] can't be paused: %s", nil), ErrCannotResumeDDLJob: mysql.Message("Job [%v] can't be resumed: %s", nil), ErrPausedDDLJob: mysql.Message("Job [%v] has already been paused", nil), + ErrBDRRestrictedDDL: mysql.Message("The operation is not allowed while the bdr role of this cluster is set to %s.", nil), } diff --git a/pkg/executor/BUILD.bazel b/pkg/executor/BUILD.bazel index 5cf987f160f5b..801c5f4d7b7fa 100644 --- a/pkg/executor/BUILD.bazel +++ b/pkg/executor/BUILD.bazel @@ -18,6 +18,7 @@ go_library( "batch_point_get.go", "bind.go", "brie.go", + "brie_utils.go", "builder.go", "change.go", "checksum.go", @@ -91,6 +92,7 @@ go_library( visibility = ["//visibility:public"], deps = [ "//br/pkg/glue", + "//br/pkg/lightning/log", "//br/pkg/lightning/mydump", "//br/pkg/storage", "//br/pkg/task", @@ -103,16 +105,17 @@ go_library( "//pkg/ddl/placement", "//pkg/ddl/schematracker", "//pkg/distsql", + "//pkg/disttask/framework/handle", "//pkg/disttask/framework/proto", "//pkg/disttask/framework/storage", "//pkg/disttask/importinto", "//pkg/domain", "//pkg/domain/infosync", "//pkg/domain/resourcegroup", + "//pkg/errctx", "//pkg/errno", "//pkg/executor/aggfuncs", "//pkg/executor/aggregate", - "//pkg/executor/asyncloaddata", "//pkg/executor/importer", "//pkg/executor/internal/applycache", "//pkg/executor/internal/builder", @@ -126,7 +129,6 @@ go_library( "//pkg/executor/internal/vecgroupchecker", "//pkg/executor/lockstats", "//pkg/executor/metrics", - "//pkg/executor/mppcoordmanager", "//pkg/executor/sortexec", "//pkg/expression", "//pkg/expression/aggregation", @@ -150,6 +152,7 @@ go_library( "//pkg/planner/cardinality", "//pkg/planner/core", "//pkg/planner/util", + "//pkg/planner/util/fixcontrol", "//pkg/plugin", "//pkg/privilege", "//pkg/privilege/privileges", @@ -237,6 +240,7 @@ go_library( "@com_github_burntsushi_toml//:toml", "@com_github_docker_go_units//:go-units", "@com_github_gogo_protobuf//proto", + "@com_github_google_uuid//:uuid", "@com_github_ngaut_pools//:pools", "@com_github_opentracing_basictracer_go//:basictracer-go", "@com_github_opentracing_opentracing_go//:opentracing-go", @@ -295,6 +299,7 @@ go_test( "batch_point_get_test.go", "benchmark_test.go", "brie_test.go", + "brie_utils_test.go", "chunk_size_control_test.go", "cluster_table_test.go", "compact_table_test.go", @@ -374,6 +379,7 @@ go_test( "//pkg/distsql", "//pkg/domain", "//pkg/domain/infosync", + "//pkg/errctx", "//pkg/errno", "//pkg/executor/aggfuncs", "//pkg/executor/aggregate", @@ -450,6 +456,7 @@ go_test( "//pkg/util/tableutil", "//pkg/util/topsql/state", "@com_github_gorilla_mux//:mux", + "@com_github_hashicorp_go_version//:go-version", "@com_github_pingcap_errors//:errors", "@com_github_pingcap_failpoint//:failpoint", "@com_github_pingcap_fn//:fn", diff --git a/pkg/executor/adapter.go b/pkg/executor/adapter.go index 44bb8de5bf3b6..99bbd1f10deb3 100644 --- a/pkg/executor/adapter.go +++ b/pkg/executor/adapter.go @@ -22,6 +22,7 @@ import ( "runtime/trace" "strconv" "strings" + "sync" "sync/atomic" "time" @@ -48,6 +49,7 @@ import ( plannercore "github.com/pingcap/tidb/pkg/planner/core" "github.com/pingcap/tidb/pkg/plugin" "github.com/pingcap/tidb/pkg/sessionctx" + "github.com/pingcap/tidb/pkg/sessionctx/sessionstates" "github.com/pingcap/tidb/pkg/sessionctx/stmtctx" "github.com/pingcap/tidb/pkg/sessionctx/variable" "github.com/pingcap/tidb/pkg/sessiontxn" @@ -90,6 +92,7 @@ type recordSet struct { stmt *ExecStmt lastErr error txnStartTS uint64 + once sync.Once } func (a *recordSet) Fields() []*ast.ResultField { @@ -175,17 +178,34 @@ func (a *recordSet) NewChunk(alloc chunk.Allocator) *chunk.Chunk { return exec.NewFirstChunk(a.executor) } - base := a.executor.Base() - return alloc.Alloc(base.RetFieldTypes(), base.InitCap(), base.MaxChunkSize()) + return alloc.Alloc(a.executor.RetFieldTypes(), a.executor.InitCap(), a.executor.MaxChunkSize()) +} + +func (a *recordSet) Finish() error { + var err error + a.once.Do(func() { + err = exec.Close(a.executor) + cteErr := resetCTEStorageMap(a.stmt.Ctx) + if cteErr != nil { + logutil.BgLogger().Error("got error when reset cte storage, should check if the spill disk file deleted or not", zap.Error(cteErr)) + } + if err == nil { + err = cteErr + } + }) + if err != nil { + a.lastErr = err + } + return err } func (a *recordSet) Close() error { - err := a.executor.Close() - err1 := a.stmt.CloseRecordSet(a.txnStartTS, a.lastErr) + err := a.Finish() if err != nil { - return err + logutil.BgLogger().Error("close recordSet error", zap.Error(err)) } - return err1 + a.stmt.CloseRecordSet(a.txnStartTS, a.lastErr) + return err } // OnFetchReturned implements commandLifeCycle#OnFetchReturned @@ -333,7 +353,7 @@ func (a *ExecStmt) PointGet(ctx context.Context) (*recordSet, error) { } if err = exec.Open(ctx, pointExecutor); err != nil { - terror.Call(pointExecutor.Close) + terror.Log(exec.Close(pointExecutor)) return nil, err } @@ -511,9 +531,9 @@ func (a *ExecStmt) Exec(ctx context.Context) (_ sqlexec.RecordSet, err error) { terror.Log(err3) if err3 == nil { sctx.GetSessionVars().SetDistSQLScanConcurrency(int(concurrency)) + sctx.GetSessionVars().SetIndexSerialScanConcurrency(int(concurrency)) } } - sctx.GetSessionVars().SetIndexSerialScanConcurrency(1) terror.Log(sctx.GetSessionVars().SetSystemVar(variable.TxnIsolation, ast.ReadCommitted)) defer func() { terror.Log(sctx.GetSessionVars().SetSystemVar(variable.TiDBBuildStatsConcurrency, oriStats)) @@ -537,7 +557,7 @@ func (a *ExecStmt) Exec(ctx context.Context) (_ sqlexec.RecordSet, err error) { stmtCtx := sctx.GetSessionVars().StmtCtx _, planDigest := GetPlanDigest(stmtCtx) _, digest := stmtCtx.SQLDigest() - stmtCtx.RunawayChecker = domain.GetDomain(sctx).RunawayManager().DeriveChecker(sctx.GetSessionVars().ResourceGroupName, stmtCtx.OriginalSQL, digest.String(), planDigest.String()) + stmtCtx.RunawayChecker = domain.GetDomain(sctx).RunawayManager().DeriveChecker(sctx.GetSessionVars().StmtCtx.ResourceGroupName, stmtCtx.OriginalSQL, digest.String(), planDigest.String()) if err := stmtCtx.RunawayChecker.BeforeExecutor(); err != nil { return nil, err } @@ -545,7 +565,7 @@ func (a *ExecStmt) Exec(ctx context.Context) (_ sqlexec.RecordSet, err error) { breakpoint.Inject(a.Ctx, sessiontxn.BreakPointBeforeExecutorFirstRun) if err = a.openExecutor(ctx, e); err != nil { - terror.Call(e.Close) + terror.Log(exec.Close(e)) return nil, err } @@ -694,14 +714,20 @@ func (a *ExecStmt) handleForeignKeyCascade(ctx context.Context, fkc *FKCascadeEx return err } if err := exec.Open(ctx, e); err != nil { - terror.Call(e.Close) + terror.Log(exec.Close(e)) return err } err = exec.Next(ctx, e, exec.NewFirstChunk(e)) - if err != nil { - return err + failpoint.Inject("handleForeignKeyCascadeError", func(val failpoint.Value) { + // Next can recover panic and convert it to error. So we inject error directly here. + if val.(bool) && err == nil { + err = errors.New("handleForeignKeyCascadeError") + } + }) + closeErr := exec.Close(e) + if err == nil { + err = closeErr } - err = e.Close() if err != nil { return err } @@ -866,17 +892,17 @@ func (c *chunkRowRecordSet) NewChunk(alloc chunk.Allocator) *chunk.Chunk { return exec.NewFirstChunk(c.e) } - base := c.e.Base() - return alloc.Alloc(base.RetFieldTypes(), base.InitCap(), base.MaxChunkSize()) + return alloc.Alloc(c.e.RetFieldTypes(), c.e.InitCap(), c.e.MaxChunkSize()) } func (c *chunkRowRecordSet) Close() error { - return c.execStmt.CloseRecordSet(c.execStmt.Ctx.GetSessionVars().TxnCtx.StartTS, nil) + c.execStmt.CloseRecordSet(c.execStmt.Ctx.GetSessionVars().TxnCtx.StartTS, nil) + return nil } func (a *ExecStmt) handlePessimisticSelectForUpdate(ctx context.Context, e exec.Executor) (_ sqlexec.RecordSet, retErr error) { if snapshotTS := a.Ctx.GetSessionVars().SnapshotTS; snapshotTS != 0 { - terror.Log(e.Close()) + terror.Log(exec.Close(e)) return nil, errors.New("can not execute write statement when 'tidb_snapshot' is set") } @@ -920,7 +946,7 @@ func (a *ExecStmt) handlePessimisticSelectForUpdate(ctx context.Context, e exec. func (a *ExecStmt) runPessimisticSelectForUpdate(ctx context.Context, e exec.Executor) (sqlexec.RecordSet, error) { defer func() { - terror.Log(e.Close()) + terror.Log(exec.Close(e)) }() var rows []chunk.Row var err error @@ -950,7 +976,7 @@ func (a *ExecStmt) handleNoDelayExecutor(ctx context.Context, e exec.Executor) ( var err error defer func() { - terror.Log(e.Close()) + terror.Log(exec.Close(e)) a.logAudit() }() @@ -1385,7 +1411,7 @@ func (a *ExecStmt) FinishExecuteStmt(txnTS uint64, err error, hasMoreResults boo } } sessVars.PrevStmt = FormatSQL(a.GetTextToLog(false)) - + a.recordLastQueryInfo(err) a.observePhaseDurations(sessVars.InRestrictedSQL, execDetail.CommitDetail) executeDuration := time.Since(sessVars.StartTime) - sessVars.DurationCompile if sessVars.InRestrictedSQL { @@ -1430,6 +1456,38 @@ func (a *ExecStmt) FinishExecuteStmt(txnTS uint64, err error, hasMoreResults boo } } +func (a *ExecStmt) recordLastQueryInfo(err error) { + sessVars := a.Ctx.GetSessionVars() + // Record diagnostic information for DML statements + recordLastQuery := false + switch typ := a.StmtNode.(type) { + case *ast.ShowStmt: + recordLastQuery = typ.Tp != ast.ShowSessionStates + case *ast.ExecuteStmt, ast.DMLNode: + recordLastQuery = true + } + if recordLastQuery { + var lastRUConsumption float64 + if ruDetailRaw := a.GoCtx.Value(util.RUDetailsCtxKey); ruDetailRaw != nil { + ruDetail := ruDetailRaw.(*util.RUDetails) + lastRUConsumption = ruDetail.RRU() + ruDetail.WRU() + } + failpoint.Inject("mockRUConsumption", func(_ failpoint.Value) { + lastRUConsumption = float64(len(sessVars.StmtCtx.OriginalSQL)) + }) + // Keep the previous queryInfo for `show session_states` because the statement needs to encode it. + sessVars.LastQueryInfo = sessionstates.QueryInfo{ + TxnScope: sessVars.CheckAndGetTxnScope(), + StartTS: sessVars.TxnCtx.StartTS, + ForUpdateTS: sessVars.TxnCtx.GetForUpdateTS(), + RUConsumption: lastRUConsumption, + } + if err != nil { + sessVars.LastQueryInfo.ErrMsg = err.Error() + } + } +} + func (a *ExecStmt) checkPlanReplayerCapture(txnTS uint64) { if kv.GetInternalSourceType(a.GoCtx) == kv.InternalTxnStats { return @@ -1448,19 +1506,10 @@ func (a *ExecStmt) checkPlanReplayerCapture(txnTS uint64) { } // CloseRecordSet will finish the execution of current statement and do some record work -func (a *ExecStmt) CloseRecordSet(txnStartTS uint64, lastErr error) error { - cteErr := resetCTEStorageMap(a.Ctx) - if cteErr != nil { - logutil.BgLogger().Error("got error when reset cte storage, should check if the spill disk file deleted or not", zap.Error(cteErr)) - } - if lastErr == nil { - // Only overwrite err when it's nil. - lastErr = cteErr - } +func (a *ExecStmt) CloseRecordSet(txnStartTS uint64, lastErr error) { a.FinishExecuteStmt(txnStartTS, lastErr, false) a.logAudit() a.Ctx.GetSessionVars().StmtCtx.DetachMemDiskTracker() - return cteErr } // Clean CTE storage shared by different CTEFullScan executor within a SQL stmt. @@ -1542,6 +1591,11 @@ func (a *ExecStmt) LogSlowQuery(txnTS uint64, succ bool, hasMoreResults bool) { if tikvExecDetailRaw != nil { tikvExecDetail = *(tikvExecDetailRaw.(*util.ExecDetails)) } + ruDetails := util.NewRUDetails() + if ruDetailsVal := a.GoCtx.Value(util.RUDetailsCtxKey); ruDetailsVal != nil { + ruDetails = ruDetailsVal.(*util.RUDetails) + } + execDetail := stmtCtx.GetExecDetails() copTaskInfo := stmtCtx.CopTasksDetails() memMax := sessVars.MemTracker.MaxConsumed() @@ -1603,6 +1657,10 @@ func (a *ExecStmt) LogSlowQuery(txnTS uint64, succ bool, hasMoreResults bool) { UsedStats: stmtCtx.GetUsedStatsInfo(false), IsSyncStatsFailed: stmtCtx.IsSyncStatsFailed, Warnings: collectWarningsForSlowLog(stmtCtx), + ResourceGroupName: sessVars.StmtCtx.ResourceGroupName, + RRU: ruDetails.RRU(), + WRU: ruDetails.WRU(), + WaitRUDuration: ruDetails.RUWaitDuration(), } failpoint.Inject("assertSyncStatsFailed", func(val failpoint.Value) { if val.(bool) { @@ -1784,10 +1842,9 @@ func getEncodedPlan(stmtCtx *stmtctx.StatementContext, genHint bool) (encodedPla // some hints like 'memory_quota' cannot be extracted from the PhysicalPlan directly, // so we have to iterate all hints from the customer and keep some other necessary hints. switch tableHint.HintName.L { - case plannercore.HintMemoryQuota, plannercore.HintUseToja, plannercore.HintNoIndexMerge, - plannercore.HintMaxExecutionTime, - plannercore.HintIgnoreIndex, plannercore.HintReadFromStorage, plannercore.HintMerge, - plannercore.HintSemiJoinRewrite, plannercore.HintNoDecorrelate: + case hint.HintMemoryQuota, hint.HintUseToja, hint.HintNoIndexMerge, + hint.HintMaxExecutionTime, hint.HintIgnoreIndex, hint.HintReadFromStorage, + hint.HintMerge, hint.HintSemiJoinRewrite, hint.HintNoDecorrelate: hints = append(hints, tableHint) } } @@ -1876,6 +1933,10 @@ func (a *ExecStmt) SummaryStmt(succ bool) { if tikvExecDetailRaw != nil { tikvExecDetail = *(tikvExecDetailRaw.(*util.ExecDetails)) } + var ruDetail *util.RUDetails + if ruDetailRaw := a.GoCtx.Value(util.RUDetailsCtxKey); ruDetailRaw != nil { + ruDetail = ruDetailRaw.(*util.RUDetails) + } if stmtCtx.WaitLockLeaseTime > 0 { if execDetail.BackoffSleep == nil { @@ -1931,6 +1992,8 @@ func (a *ExecStmt) SummaryStmt(succ bool) { Prepared: a.isPreparedStmt, KeyspaceName: keyspaceName, KeyspaceID: keyspaceID, + RUDetail: ruDetail, + ResourceGroupName: sessVars.StmtCtx.ResourceGroupName, } if a.retryCount > 0 { stmtExecInfo.ExecRetryTime = costTime - sessVars.DurationParse - sessVars.DurationCompile - time.Since(a.retryStartTime) @@ -2094,12 +2157,17 @@ func checkPlanReplayerContinuesCapture(sctx sessionctx.Context, stmtNode ast.Stm func sendPlanReplayerDumpTask(key replayer.PlanReplayerTaskKey, sctx sessionctx.Context, stmtNode ast.StmtNode, startTS uint64, isContinuesCapture bool) { stmtCtx := sctx.GetSessionVars().StmtCtx - handle := sctx.Value(bindinfo.SessionBindInfoKeyType).(*bindinfo.SessionHandle) + handle := sctx.Value(bindinfo.SessionBindInfoKeyType).(bindinfo.SessionBindingHandle) + bindings := handle.GetAllSessionBindings() + bindRecords := make([]bindinfo.Bindings, 0, len(bindings)) + for _, binding := range bindings { + bindRecords = append(bindRecords, []bindinfo.Binding{binding}) + } dumpTask := &domain.PlanReplayerDumpTask{ PlanReplayerTaskKey: key, StartTS: startTS, TblStats: stmtCtx.TableStats, - SessionBindings: handle.GetAllBindRecord(), + SessionBindings: bindRecords, SessionVars: sctx.GetSessionVars(), ExecStmts: []ast.StmtNode{stmtNode}, DebugTrace: []interface{}{stmtCtx.OptimizerDebugTrace}, diff --git a/pkg/executor/admin.go b/pkg/executor/admin.go index a340de24058de..2ae551c1eced8 100644 --- a/pkg/executor/admin.go +++ b/pkg/executor/admin.go @@ -216,7 +216,7 @@ func (e *RecoverIndexExec) columnsTypes() []*types.FieldType { // Open implements the Executor Open interface. func (e *RecoverIndexExec) Open(ctx context.Context) error { - if err := exec.Open(ctx, e.BaseExecutor.Base()); err != nil { + if err := exec.Open(ctx, &e.BaseExecutor); err != nil { return err } diff --git a/pkg/executor/aggfuncs/BUILD.bazel b/pkg/executor/aggfuncs/BUILD.bazel index 9336517d7ecec..5fa60108574e1 100644 --- a/pkg/executor/aggfuncs/BUILD.bazel +++ b/pkg/executor/aggfuncs/BUILD.bazel @@ -27,6 +27,8 @@ go_library( "func_varpop.go", "func_varsamp.go", "row_number.go", + "spill_deserialize_helper.go", + "spill_serialize_helper.go", ], importpath = "github.com/pingcap/tidb/pkg/executor/aggfuncs", visibility = ["//visibility:public"], @@ -47,6 +49,7 @@ go_library( "//pkg/util/hack", "//pkg/util/logutil", "//pkg/util/selection", + "//pkg/util/serialization", "//pkg/util/set", "//pkg/util/stringutil", "@com_github_dgryski_go_farm//:go-farm", @@ -83,12 +86,13 @@ go_test( "func_varsamp_test.go", "main_test.go", "row_number_test.go", + "spill_helper_test.go", "window_func_test.go", ], embed = [":aggfuncs"], flaky = True, race = "on", - shard_count = 48, + shard_count = 50, deps = [ "//pkg/expression", "//pkg/expression/aggregation", diff --git a/pkg/executor/aggfuncs/aggfunc_test.go b/pkg/executor/aggfuncs/aggfunc_test.go index 4157adf9212ed..4b132ecc9b596 100644 --- a/pkg/executor/aggfuncs/aggfunc_test.go +++ b/pkg/executor/aggfuncs/aggfunc_test.go @@ -586,16 +586,6 @@ func testAggFunc(t *testing.T, p aggTest) { result, err = dt.Compare(ctx.GetSessionVars().StmtCtx.TypeCtx(), &p.results[1], ctor) require.NoError(t, err) require.Equalf(t, 0, result, "%v != %v", dt.String(), p.results[1]) - - // test the empty input - resultChk.Reset() - finalFunc.ResetPartialResult(finalPr) - err = finalFunc.AppendFinalResult2Chunk(ctx, finalPr, resultChk) - require.NoError(t, err) - dt = resultChk.GetRow(0).GetDatum(0, desc.RetTp) - result, err = dt.Compare(ctx.GetSessionVars().StmtCtx.TypeCtx(), &p.results[0], ctor) - require.NoError(t, err) - require.Equalf(t, 0, result, "%v != %v", dt.String(), p.results[0]) } func testAggFuncWithoutDistinct(t *testing.T, p aggTest) { diff --git a/pkg/executor/aggfuncs/aggfuncs.go b/pkg/executor/aggfuncs/aggfuncs.go index 344bacacb6339..9a9973369fbeb 100644 --- a/pkg/executor/aggfuncs/aggfuncs.go +++ b/pkg/executor/aggfuncs/aggfuncs.go @@ -139,8 +139,21 @@ const ( // to be any type. type PartialResult unsafe.Pointer +// AggPartialResultMapper contains aggregate function results +type AggPartialResultMapper map[string][]PartialResult + +type serializer interface { + // SerializePartialResult will serialize meta data of aggregate function into bytes and put them into chunk. + SerializePartialResult(partialResult PartialResult, chk *chunk.Chunk, spillHelper *SerializeHelper) + + // DeserializePartialResult deserializes from bytes to PartialResult. + DeserializePartialResult(src *chunk.Chunk) ([]PartialResult, int64) +} + // AggFunc is the interface to evaluate the aggregate functions. type AggFunc interface { + serializer + // AllocPartialResult allocates a specific data structure to store the // partial result, initializes it, and converts it to PartialResult to // return back. The second returned value is the memDelta used to trace @@ -196,6 +209,13 @@ func (*baseAggFunc) MergePartialResult(sessionctx.Context, PartialResult, Partia return 0, nil } +func (*baseAggFunc) SerializePartialResult(_ PartialResult, _ *chunk.Chunk, _ *SerializeHelper) { +} + +func (*baseAggFunc) DeserializePartialResult(_ *chunk.Chunk) ([]PartialResult, int64) { + return nil, 0 +} + // SlidingWindowAggFunc is the interface to evaluate the aggregate functions using sliding window. type SlidingWindowAggFunc interface { // Slide evaluates the aggregate functions using a sliding window. The input @@ -212,3 +232,27 @@ type MaxMinSlidingWindowAggFunc interface { // SetWindowStart sets the start position of window SetWindowStart(start uint64) } + +type deserializeFunc func(*deserializeHelper) (PartialResult, int64) + +func deserializePartialResultCommon(src *chunk.Chunk, ordinal int, deserializeFuncImpl deserializeFunc) ([]PartialResult, int64) { + dataCol := src.Column(ordinal) + totalMemDelta := int64(0) + spillHelper := newDeserializeHelper(dataCol, src.NumRows()) + partialResults := make([]PartialResult, 0, src.NumRows()) + + for { + pr, memDelta := deserializeFuncImpl(&spillHelper) + if pr == nil { + break + } + partialResults = append(partialResults, pr) + totalMemDelta += memDelta + } + + if len(partialResults) != src.NumRows() { + panic("Fail to deserialize partial result") + } + + return partialResults, totalMemDelta +} diff --git a/pkg/executor/aggfuncs/builder.go b/pkg/executor/aggfuncs/builder.go index 72ac5fadc08a5..df31ceaa58171 100644 --- a/pkg/executor/aggfuncs/builder.go +++ b/pkg/executor/aggfuncs/builder.go @@ -92,9 +92,9 @@ func BuildWindowFunctions(ctx sessionctx.Context, windowFuncDesc *aggregation.Ag case ast.WindowFuncCumeDist: return buildCumeDist(ordinal, orderByCols) case ast.WindowFuncNthValue: - return buildNthValue(windowFuncDesc, ordinal) + return buildNthValue(ctx, windowFuncDesc, ordinal) case ast.WindowFuncNtile: - return buildNtile(windowFuncDesc, ordinal) + return buildNtile(ctx, windowFuncDesc, ordinal) case ast.WindowFuncPercentRank: return buildPercentRank(ordinal, orderByCols) case ast.WindowFuncLead: @@ -144,6 +144,21 @@ func buildApproxCountDistinct(aggFuncDesc *aggregation.AggFuncDesc, ordinal int) return nil } +func getEvalTypeForApproxPercentile(aggFuncDesc *aggregation.AggFuncDesc) types.EvalType { + evalType := aggFuncDesc.Args[0].GetType().EvalType() + argType := aggFuncDesc.Args[0].GetType().GetType() + + // Sometimes `mysql.EnumSetAsIntFlag` may be set to true, such as when join, + // which is unexpected for `buildApproxPercentile` and `mysql.TypeEnum` and `mysql.TypeSet` will return unexpected `ETInt` here, + // so here `evalType` are forcibly set to `ETString`. + // For mysql.TypeBit, just same as other aggregate function. + if argType == mysql.TypeEnum || argType == mysql.TypeSet || argType == mysql.TypeBit { + evalType = types.ETString + } + + return evalType +} + func buildApproxPercentile(sctx sessionctx.Context, aggFuncDesc *aggregation.AggFuncDesc, ordinal int) AggFunc { if aggFuncDesc.Mode == aggregation.DedupMode { return nil @@ -159,10 +174,7 @@ func buildApproxPercentile(sctx sessionctx.Context, aggFuncDesc *aggregation.Agg base := basePercentile{percent: int(percent), baseAggFunc: baseAggFunc{args: aggFuncDesc.Args, ordinal: ordinal}} - evalType := aggFuncDesc.Args[0].GetType().EvalType() - if aggFuncDesc.Args[0].GetType().GetType() == mysql.TypeBit { - evalType = types.ETString // same as other aggregate function - } + evalType := getEvalTypeForApproxPercentile(aggFuncDesc) switch aggFuncDesc.Mode { case aggregation.CompleteMode, aggregation.Partial1Mode, aggregation.FinalMode: switch evalType { @@ -668,22 +680,22 @@ func buildCumeDist(ordinal int, orderByCols []*expression.Column) AggFunc { return r } -func buildNthValue(aggFuncDesc *aggregation.AggFuncDesc, ordinal int) AggFunc { +func buildNthValue(ctx sessionctx.Context, aggFuncDesc *aggregation.AggFuncDesc, ordinal int) AggFunc { base := baseAggFunc{ args: aggFuncDesc.Args, ordinal: ordinal, } // Already checked when building the function description. - nth, _, _ := expression.GetUint64FromConstant(aggFuncDesc.Args[1]) + nth, _, _ := expression.GetUint64FromConstant(ctx, aggFuncDesc.Args[1]) return &nthValue{baseAggFunc: base, tp: aggFuncDesc.RetTp, nth: nth} } -func buildNtile(aggFuncDes *aggregation.AggFuncDesc, ordinal int) AggFunc { +func buildNtile(ctx sessionctx.Context, aggFuncDes *aggregation.AggFuncDesc, ordinal int) AggFunc { base := baseAggFunc{ args: aggFuncDes.Args, ordinal: ordinal, } - n, _, _ := expression.GetUint64FromConstant(aggFuncDes.Args[0]) + n, _, _ := expression.GetUint64FromConstant(ctx, aggFuncDes.Args[0]) return &ntile{baseAggFunc: base, n: n} } @@ -697,7 +709,7 @@ func buildPercentRank(ordinal int, orderByCols []*expression.Column) AggFunc { func buildLeadLag(ctx sessionctx.Context, aggFuncDesc *aggregation.AggFuncDesc, ordinal int) baseLeadLag { offset := uint64(1) if len(aggFuncDesc.Args) >= 2 { - offset, _, _ = expression.GetUint64FromConstant(aggFuncDesc.Args[1]) + offset, _, _ = expression.GetUint64FromConstant(ctx, aggFuncDesc.Args[1]) } var defaultExpr expression.Expression defaultExpr = expression.NewNull() diff --git a/pkg/executor/aggfuncs/func_avg.go b/pkg/executor/aggfuncs/func_avg.go index af6969e6a3f03..ff5518e7bb42c 100644 --- a/pkg/executor/aggfuncs/func_avg.go +++ b/pkg/executor/aggfuncs/func_avg.go @@ -47,6 +47,26 @@ type baseAvgDecimal struct { baseAggFunc } +func (e *baseAvgDecimal) SerializePartialResult(partialResult PartialResult, chk *chunk.Chunk, spillHelper *SerializeHelper) { + pr := (*partialResult4AvgDecimal)(partialResult) + resBuf := spillHelper.serializePartialResult4AvgDecimal(*pr) + chk.AppendBytes(e.ordinal, resBuf) +} + +func (e *baseAvgDecimal) DeserializePartialResult(src *chunk.Chunk) ([]PartialResult, int64) { + return deserializePartialResultCommon(src, e.ordinal, e.deserializeForSpill) +} + +func (e *baseAvgDecimal) deserializeForSpill(helper *deserializeHelper) (PartialResult, int64) { + pr, memDelta := e.AllocPartialResult() + result := (*partialResult4AvgDecimal)(pr) + success := helper.deserializePartialResult4AvgDecimal(result) + if !success { + return nil, 0 + } + return pr, memDelta +} + type partialResult4AvgDecimal struct { sum types.MyDecimal count int64 @@ -320,6 +340,26 @@ func (e *baseAvgFloat64) AppendFinalResult2Chunk(_ sessionctx.Context, pr Partia return nil } +func (e *baseAvgFloat64) SerializePartialResult(partialResult PartialResult, chk *chunk.Chunk, spillHelper *SerializeHelper) { + pr := (*partialResult4AvgFloat64)(partialResult) + resBuf := spillHelper.serializePartialResult4AvgFloat64(*pr) + chk.AppendBytes(e.ordinal, resBuf) +} + +func (e *baseAvgFloat64) DeserializePartialResult(src *chunk.Chunk) ([]PartialResult, int64) { + return deserializePartialResultCommon(src, e.ordinal, e.deserializeForSpill) +} + +func (e *baseAvgFloat64) deserializeForSpill(helper *deserializeHelper) (PartialResult, int64) { + pr, memDelta := e.AllocPartialResult() + result := (*partialResult4AvgFloat64)(pr) + success := helper.deserializePartialResult4AvgFloat64(result) + if !success { + return nil, 0 + } + return pr, memDelta +} + type avgOriginal4Float64HighPrecision struct { baseAvgFloat64 } diff --git a/pkg/executor/aggfuncs/func_bitfuncs.go b/pkg/executor/aggfuncs/func_bitfuncs.go index d3ff75417a608..c7949f2bcdf02 100644 --- a/pkg/executor/aggfuncs/func_bitfuncs.go +++ b/pkg/executor/aggfuncs/func_bitfuncs.go @@ -48,6 +48,26 @@ func (e *baseBitAggFunc) AppendFinalResult2Chunk(_ sessionctx.Context, pr Partia return nil } +func (e *baseBitAggFunc) SerializePartialResult(partialResult PartialResult, chk *chunk.Chunk, spillHelper *SerializeHelper) { + pr := (*partialResult4BitFunc)(partialResult) + resBuf := spillHelper.serializePartialResult4BitFunc(*pr) + chk.AppendBytes(e.ordinal, resBuf) +} + +func (e *baseBitAggFunc) DeserializePartialResult(src *chunk.Chunk) ([]PartialResult, int64) { + return deserializePartialResultCommon(src, e.ordinal, e.deserializeForSpill) +} + +func (e *baseBitAggFunc) deserializeForSpill(helper *deserializeHelper) (PartialResult, int64) { + pr, memDelta := e.AllocPartialResult() + result := (*partialResult4BitFunc)(pr) + success := helper.deserializePartialResult4BitFunc(result) + if !success { + return nil, 0 + } + return pr, memDelta +} + type bitOrUint64 struct { baseBitAggFunc } diff --git a/pkg/executor/aggfuncs/func_count.go b/pkg/executor/aggfuncs/func_count.go index e24e373e172fd..92826afcaccc1 100644 --- a/pkg/executor/aggfuncs/func_count.go +++ b/pkg/executor/aggfuncs/func_count.go @@ -47,6 +47,26 @@ func (e *baseCount) AppendFinalResult2Chunk(_ sessionctx.Context, pr PartialResu return nil } +func (e *baseCount) SerializePartialResult(partialResult PartialResult, chk *chunk.Chunk, spillHelper *SerializeHelper) { + pr := (*partialResult4Count)(partialResult) + resBuf := spillHelper.serializePartialResult4Count(*pr) + chk.AppendBytes(e.ordinal, resBuf) +} + +func (e *baseCount) DeserializePartialResult(src *chunk.Chunk) ([]PartialResult, int64) { + return deserializePartialResultCommon(src, e.ordinal, e.deserializeForSpill) +} + +func (e *baseCount) deserializeForSpill(helper *deserializeHelper) (PartialResult, int64) { + pr, memDelta := e.AllocPartialResult() + result := *(*partialResult4Count)(pr) + success := helper.deserializePartialResult4Count(&result) + if !success { + return nil, 0 + } + return pr, memDelta +} + type countOriginal4Int struct { baseCount } diff --git a/pkg/executor/aggfuncs/func_first_row.go b/pkg/executor/aggfuncs/func_first_row.go index a4b2d7353a617..f2ad7f7145f02 100644 --- a/pkg/executor/aggfuncs/func_first_row.go +++ b/pkg/executor/aggfuncs/func_first_row.go @@ -163,6 +163,26 @@ func (e *firstRow4Int) AppendFinalResult2Chunk(_ sessionctx.Context, pr PartialR return nil } +func (e *firstRow4Int) SerializePartialResult(partialResult PartialResult, chk *chunk.Chunk, spillHelper *SerializeHelper) { + pr := (*partialResult4FirstRowInt)(partialResult) + resBuf := spillHelper.serializePartialResult4FirstRowInt(*pr) + chk.AppendBytes(e.ordinal, resBuf) +} + +func (e *firstRow4Int) DeserializePartialResult(src *chunk.Chunk) ([]PartialResult, int64) { + return deserializePartialResultCommon(src, e.ordinal, e.deserializeForSpill) +} + +func (e *firstRow4Int) deserializeForSpill(helper *deserializeHelper) (PartialResult, int64) { + pr, memDelta := e.AllocPartialResult() + result := (*partialResult4FirstRowInt)(pr) + success := helper.deserializePartialResult4FirstRowInt(result) + if !success { + return nil, 0 + } + return pr, memDelta +} + type firstRow4Float32 struct { baseAggFunc } @@ -209,6 +229,26 @@ func (e *firstRow4Float32) AppendFinalResult2Chunk(_ sessionctx.Context, pr Part return nil } +func (e *firstRow4Float32) SerializePartialResult(partialResult PartialResult, chk *chunk.Chunk, spillHelper *SerializeHelper) { + pr := (*partialResult4FirstRowFloat32)(partialResult) + resBuf := spillHelper.serializePartialResult4FirstRowFloat32(*pr) + chk.AppendBytes(e.ordinal, resBuf) +} + +func (e *firstRow4Float32) DeserializePartialResult(src *chunk.Chunk) ([]PartialResult, int64) { + return deserializePartialResultCommon(src, e.ordinal, e.deserializeForSpill) +} + +func (e *firstRow4Float32) deserializeForSpill(helper *deserializeHelper) (PartialResult, int64) { + pr, memDelta := e.AllocPartialResult() + result := (*partialResult4FirstRowFloat32)(pr) + success := helper.deserializePartialResult4FirstRowFloat32(result) + if !success { + return nil, 0 + } + return pr, memDelta +} + type firstRow4Float64 struct { baseAggFunc } @@ -255,6 +295,26 @@ func (e *firstRow4Float64) AppendFinalResult2Chunk(_ sessionctx.Context, pr Part return nil } +func (e *firstRow4Float64) SerializePartialResult(partialResult PartialResult, chk *chunk.Chunk, spillHelper *SerializeHelper) { + pr := (*partialResult4FirstRowFloat64)(partialResult) + resBuf := spillHelper.serializePartialResult4FirstRowFloat64(*pr) + chk.AppendBytes(e.ordinal, resBuf) +} + +func (e *firstRow4Float64) DeserializePartialResult(src *chunk.Chunk) ([]PartialResult, int64) { + return deserializePartialResultCommon(src, e.ordinal, e.deserializeForSpill) +} + +func (e *firstRow4Float64) deserializeForSpill(helper *deserializeHelper) (PartialResult, int64) { + pr, memDelta := e.AllocPartialResult() + result := (*partialResult4FirstRowFloat64)(pr) + success := helper.deserializePartialResult4FirstRowFloat64(result) + if !success { + return nil, 0 + } + return pr, memDelta +} + type firstRow4String struct { baseAggFunc } @@ -302,6 +362,26 @@ func (e *firstRow4String) AppendFinalResult2Chunk(_ sessionctx.Context, pr Parti return nil } +func (e *firstRow4String) SerializePartialResult(partialResult PartialResult, chk *chunk.Chunk, spillHelper *SerializeHelper) { + pr := (*partialResult4FirstRowString)(partialResult) + resBuf := spillHelper.serializePartialResult4FirstRowString(*pr) + chk.AppendBytes(e.ordinal, resBuf) +} + +func (e *firstRow4String) DeserializePartialResult(src *chunk.Chunk) ([]PartialResult, int64) { + return deserializePartialResultCommon(src, e.ordinal, e.deserializeForSpill) +} + +func (e *firstRow4String) deserializeForSpill(helper *deserializeHelper) (PartialResult, int64) { + pr, memDelta := e.AllocPartialResult() + result := (*partialResult4FirstRowString)(pr) + success := helper.deserializePartialResult4FirstRowString(result) + if !success { + return nil, 0 + } + return pr, memDelta +} + type firstRow4Time struct { baseAggFunc } @@ -348,6 +428,26 @@ func (e *firstRow4Time) AppendFinalResult2Chunk(_ sessionctx.Context, pr Partial return nil } +func (e *firstRow4Time) SerializePartialResult(partialResult PartialResult, chk *chunk.Chunk, spillHelper *SerializeHelper) { + pr := (*partialResult4FirstRowTime)(partialResult) + resBuf := spillHelper.serializePartialResult4FirstRowTime(*pr) + chk.AppendBytes(e.ordinal, resBuf) +} + +func (e *firstRow4Time) DeserializePartialResult(src *chunk.Chunk) ([]PartialResult, int64) { + return deserializePartialResultCommon(src, e.ordinal, e.deserializeForSpill) +} + +func (e *firstRow4Time) deserializeForSpill(helper *deserializeHelper) (PartialResult, int64) { + pr, memDelta := e.AllocPartialResult() + result := (*partialResult4FirstRowTime)(pr) + success := helper.deserializePartialResult4FirstRowTime(result) + if !success { + return nil, 0 + } + return pr, memDelta +} + type firstRow4Duration struct { baseAggFunc } @@ -394,6 +494,26 @@ func (e *firstRow4Duration) AppendFinalResult2Chunk(_ sessionctx.Context, pr Par return nil } +func (e *firstRow4Duration) SerializePartialResult(partialResult PartialResult, chk *chunk.Chunk, spillHelper *SerializeHelper) { + pr := (*partialResult4FirstRowDuration)(partialResult) + resBuf := spillHelper.serializePartialResult4FirstRowDuration(*pr) + chk.AppendBytes(e.ordinal, resBuf) +} + +func (e *firstRow4Duration) DeserializePartialResult(src *chunk.Chunk) ([]PartialResult, int64) { + return deserializePartialResultCommon(src, e.ordinal, e.deserializeForSpill) +} + +func (e *firstRow4Duration) deserializeForSpill(helper *deserializeHelper) (PartialResult, int64) { + pr, memDelta := e.AllocPartialResult() + result := (*partialResult4FirstRowDuration)(pr) + success := helper.deserializePartialResult4FirstRowDuration(result) + if !success { + return nil, 0 + } + return pr, memDelta +} + type firstRow4JSON struct { baseAggFunc } @@ -440,6 +560,26 @@ func (e *firstRow4JSON) AppendFinalResult2Chunk(_ sessionctx.Context, pr Partial return nil } +func (e *firstRow4JSON) SerializePartialResult(partialResult PartialResult, chk *chunk.Chunk, spillHelper *SerializeHelper) { + pr := (*partialResult4FirstRowJSON)(partialResult) + resBuf := spillHelper.serializePartialResult4FirstRowJSON(*pr) + chk.AppendBytes(e.ordinal, resBuf) +} + +func (e *firstRow4JSON) DeserializePartialResult(src *chunk.Chunk) ([]PartialResult, int64) { + return deserializePartialResultCommon(src, e.ordinal, e.deserializeForSpill) +} + +func (e *firstRow4JSON) deserializeForSpill(helper *deserializeHelper) (PartialResult, int64) { + pr, memDelta := e.AllocPartialResult() + result := (*partialResult4FirstRowJSON)(pr) + success := helper.deserializePartialResult4FirstRowJSON(result) + if !success { + return nil, 0 + } + return pr, memDelta +} + type firstRow4Decimal struct { baseAggFunc } @@ -500,6 +640,26 @@ func (*firstRow4Decimal) MergePartialResult(_ sessionctx.Context, src, dst Parti return memDelta, nil } +func (e *firstRow4Decimal) SerializePartialResult(partialResult PartialResult, chk *chunk.Chunk, spillHelper *SerializeHelper) { + pr := (*partialResult4FirstRowDecimal)(partialResult) + resBuf := spillHelper.serializePartialResult4FirstRowDecimal(*pr) + chk.AppendBytes(e.ordinal, resBuf) +} + +func (e *firstRow4Decimal) DeserializePartialResult(src *chunk.Chunk) ([]PartialResult, int64) { + return deserializePartialResultCommon(src, e.ordinal, e.deserializeForSpill) +} + +func (e *firstRow4Decimal) deserializeForSpill(helper *deserializeHelper) (PartialResult, int64) { + pr, memDelta := e.AllocPartialResult() + result := (*partialResult4FirstRowDecimal)(pr) + success := helper.deserializePartialResult4FirstRowDecimal(result) + if !success { + return nil, 0 + } + return pr, memDelta +} + type firstRow4Enum struct { baseAggFunc } @@ -547,6 +707,26 @@ func (e *firstRow4Enum) AppendFinalResult2Chunk(_ sessionctx.Context, pr Partial return nil } +func (e *firstRow4Enum) SerializePartialResult(partialResult PartialResult, chk *chunk.Chunk, spillHelper *SerializeHelper) { + pr := (*partialResult4FirstRowEnum)(partialResult) + resBuf := spillHelper.serializePartialResult4FirstRowEnum(*pr) + chk.AppendBytes(e.ordinal, resBuf) +} + +func (e *firstRow4Enum) DeserializePartialResult(src *chunk.Chunk) ([]PartialResult, int64) { + return deserializePartialResultCommon(src, e.ordinal, e.deserializeForSpill) +} + +func (e *firstRow4Enum) deserializeForSpill(helper *deserializeHelper) (PartialResult, int64) { + pr, memDelta := e.AllocPartialResult() + result := (*partialResult4FirstRowEnum)(pr) + success := helper.deserializePartialResult4FirstRowEnum(result) + if !success { + return nil, 0 + } + return pr, memDelta +} + type firstRow4Set struct { baseAggFunc } @@ -593,3 +773,23 @@ func (e *firstRow4Set) AppendFinalResult2Chunk(_ sessionctx.Context, pr PartialR chk.AppendSet(e.ordinal, p.val) return nil } + +func (e *firstRow4Set) SerializePartialResult(partialResult PartialResult, chk *chunk.Chunk, spillHelper *SerializeHelper) { + pr := (*partialResult4FirstRowSet)(partialResult) + resBuf := spillHelper.serializePartialResult4FirstRowSet(*pr) + chk.AppendBytes(e.ordinal, resBuf) +} + +func (e *firstRow4Set) DeserializePartialResult(src *chunk.Chunk) ([]PartialResult, int64) { + return deserializePartialResultCommon(src, e.ordinal, e.deserializeForSpill) +} + +func (e *firstRow4Set) deserializeForSpill(helper *deserializeHelper) (PartialResult, int64) { + pr, memDelta := e.AllocPartialResult() + result := (*partialResult4FirstRowSet)(pr) + success := helper.deserializePartialResult4FirstRowSet(result) + if !success { + return nil, 0 + } + return pr, memDelta +} diff --git a/pkg/executor/aggfuncs/func_group_concat.go b/pkg/executor/aggfuncs/func_group_concat.go index 4412c029ab26c..51228caf4688a 100644 --- a/pkg/executor/aggfuncs/func_group_concat.go +++ b/pkg/executor/aggfuncs/func_group_concat.go @@ -75,7 +75,7 @@ func (e *baseGroupConcat4String) handleTruncateError(sctx sessionctx.Context) (e if !sctx.GetSessionVars().StmtCtx.TypeFlags().TruncateAsWarning() { return expression.ErrCutValueGroupConcat.GenWithStackByArgs(e.args[0].String()) } - sctx.GetSessionVars().StmtCtx.AppendWarning(expression.ErrCutValueGroupConcat.GenWithStackByArgs(e.args[0].String())) + sctx.GetSessionVars().StmtCtx.AppendWarning(expression.ErrCutValueGroupConcat.FastGenByArgs(e.args[0].String())) } return nil } @@ -173,6 +173,26 @@ func (e *groupConcat) MergePartialResult(sctx sessionctx.Context, src, dst Parti return memDelta, e.truncatePartialResultIfNeed(sctx, p2.buffer) } +func (e *groupConcat) SerializePartialResult(partialResult PartialResult, chk *chunk.Chunk, spillHelper *SerializeHelper) { + pr := (*partialResult4GroupConcat)(partialResult) + resBuf := spillHelper.serializePartialResult4GroupConcat(*pr) + chk.AppendBytes(e.ordinal, resBuf) +} + +func (e *groupConcat) DeserializePartialResult(src *chunk.Chunk) ([]PartialResult, int64) { + return deserializePartialResultCommon(src, e.ordinal, e.deserializeForSpill) +} + +func (e *groupConcat) deserializeForSpill(helper *deserializeHelper) (PartialResult, int64) { + pr, memDelta := e.AllocPartialResult() + result := (*partialResult4GroupConcat)(pr) + success := helper.deserializePartialResult4GroupConcat(result) + if !success { + return nil, 0 + } + return pr, memDelta +} + // SetTruncated will be called in `executorBuilder#buildHashAgg` with duck-type. func (e *groupConcat) SetTruncated(t *int32) { e.truncated = t diff --git a/pkg/executor/aggfuncs/func_json_arrayagg.go b/pkg/executor/aggfuncs/func_json_arrayagg.go index ee73184bcb0d3..ba9b3e20d2731 100644 --- a/pkg/executor/aggfuncs/func_json_arrayagg.go +++ b/pkg/executor/aggfuncs/func_json_arrayagg.go @@ -91,3 +91,23 @@ func (*jsonArrayagg) MergePartialResult(_ sessionctx.Context, src, dst PartialRe p2.entries = append(p2.entries, p1.entries...) return 0, nil } + +func (e *jsonArrayagg) SerializePartialResult(partialResult PartialResult, chk *chunk.Chunk, spillHelper *SerializeHelper) { + pr := (*partialResult4JsonArrayagg)(partialResult) + resBuf := spillHelper.serializePartialResult4JsonArrayagg(*pr) + chk.AppendBytes(e.ordinal, resBuf) +} + +func (e *jsonArrayagg) DeserializePartialResult(src *chunk.Chunk) ([]PartialResult, int64) { + return deserializePartialResultCommon(src, e.ordinal, e.deserializeForSpill) +} + +func (e *jsonArrayagg) deserializeForSpill(helper *deserializeHelper) (PartialResult, int64) { + pr, memDelta := e.AllocPartialResult() + result := (*partialResult4JsonArrayagg)(pr) + success := helper.deserializePartialResult4JsonArrayagg(result) + if !success { + return nil, 0 + } + return pr, memDelta +} diff --git a/pkg/executor/aggfuncs/func_json_objectagg.go b/pkg/executor/aggfuncs/func_json_objectagg.go index 6c44e5f999eb7..85cf2d10bcea5 100644 --- a/pkg/executor/aggfuncs/func_json_objectagg.go +++ b/pkg/executor/aggfuncs/func_json_objectagg.go @@ -114,6 +114,26 @@ func (e *jsonObjectAgg) UpdatePartialResult(sctx sessionctx.Context, rowsInGroup return memDelta, nil } +func (e *jsonObjectAgg) SerializePartialResult(partialResult PartialResult, chk *chunk.Chunk, spillHelper *SerializeHelper) { + pr := (*partialResult4JsonObjectAgg)(partialResult) + resBuf := spillHelper.serializePartialResult4JsonObjectAgg(*pr) + chk.AppendBytes(e.ordinal, resBuf) +} + +func (e *jsonObjectAgg) DeserializePartialResult(src *chunk.Chunk) ([]PartialResult, int64) { + return deserializePartialResultCommon(src, e.ordinal, e.deserializeForSpill) +} + +func (e *jsonObjectAgg) deserializeForSpill(helper *deserializeHelper) (PartialResult, int64) { + pr, memDelta := e.AllocPartialResult() + result := (*partialResult4JsonObjectAgg)(pr) + success, deserializeMemDelta := helper.deserializePartialResult4JsonObjectAgg(result) + if !success { + return nil, 0 + } + return pr, memDelta + deserializeMemDelta +} + func getRealJSONValue(value types.Datum, ft *types.FieldType) (interface{}, error) { realVal := value.Clone().GetValue() switch value.Kind() { diff --git a/pkg/executor/aggfuncs/func_max_min.go b/pkg/executor/aggfuncs/func_max_min.go index 9240dfd385e6b..315f435a5d117 100644 --- a/pkg/executor/aggfuncs/func_max_min.go +++ b/pkg/executor/aggfuncs/func_max_min.go @@ -301,6 +301,26 @@ func (e *maxMin4Int) MergePartialResult(_ sessionctx.Context, src, dst PartialRe return 0, nil } +func (e *maxMin4Int) SerializePartialResult(partialResult PartialResult, chk *chunk.Chunk, spillHelper *SerializeHelper) { + pr := (*partialResult4MaxMinInt)(partialResult) + resBuf := spillHelper.serializePartialResult4MaxMinInt(*pr) + chk.AppendBytes(e.ordinal, resBuf) +} + +func (e *maxMin4Int) DeserializePartialResult(src *chunk.Chunk) ([]PartialResult, int64) { + return deserializePartialResultCommon(src, e.ordinal, e.deserializeForSpill) +} + +func (e *maxMin4Int) deserializeForSpill(helper *deserializeHelper) (PartialResult, int64) { + pr, memDelta := e.AllocPartialResult() + result := (*partialResult4MaxMinInt)(pr) + success := helper.deserializePartialResult4MaxMinInt(result) + if !success { + return nil, 0 + } + return pr, memDelta +} + type maxMin4IntSliding struct { maxMin4Int windowInfo @@ -443,6 +463,26 @@ func (e *maxMin4Uint) MergePartialResult(_ sessionctx.Context, src, dst PartialR return 0, nil } +func (e *maxMin4Uint) SerializePartialResult(partialResult PartialResult, chk *chunk.Chunk, spillHelper *SerializeHelper) { + pr := (*partialResult4MaxMinUint)(partialResult) + resBuf := spillHelper.serializePartialResult4MaxMinUint(*pr) + chk.AppendBytes(e.ordinal, resBuf) +} + +func (e *maxMin4Uint) DeserializePartialResult(src *chunk.Chunk) ([]PartialResult, int64) { + return deserializePartialResultCommon(src, e.ordinal, e.deserializeForSpill) +} + +func (e *maxMin4Uint) deserializeForSpill(helper *deserializeHelper) (PartialResult, int64) { + pr, memDelta := e.AllocPartialResult() + result := (*partialResult4MaxMinUint)(pr) + success := helper.deserializePartialResult4MaxMinUint(result) + if !success { + return nil, 0 + } + return pr, memDelta +} + type maxMin4UintSliding struct { maxMin4Uint windowInfo @@ -582,6 +622,26 @@ func (e *maxMin4Float32) MergePartialResult(_ sessionctx.Context, src, dst Parti return 0, nil } +func (e *maxMin4Float32) SerializePartialResult(partialResult PartialResult, chk *chunk.Chunk, spillHelper *SerializeHelper) { + pr := (*partialResult4MaxMinFloat32)(partialResult) + resBuf := spillHelper.serializePartialResult4MaxMinFloat32(*pr) + chk.AppendBytes(e.ordinal, resBuf) +} + +func (e *maxMin4Float32) DeserializePartialResult(src *chunk.Chunk) ([]PartialResult, int64) { + return deserializePartialResultCommon(src, e.ordinal, e.deserializeForSpill) +} + +func (e *maxMin4Float32) deserializeForSpill(helper *deserializeHelper) (PartialResult, int64) { + pr, memDelta := e.AllocPartialResult() + result := (*partialResult4MaxMinFloat32)(pr) + success := helper.deserializePartialResult4MaxMinFloat32(result) + if !success { + return nil, 0 + } + return pr, memDelta +} + type maxMin4Float32Sliding struct { maxMin4Float32 windowInfo @@ -719,6 +779,26 @@ func (e *maxMin4Float64) MergePartialResult(_ sessionctx.Context, src, dst Parti return 0, nil } +func (e *maxMin4Float64) SerializePartialResult(partialResult PartialResult, chk *chunk.Chunk, spillHelper *SerializeHelper) { + pr := (*partialResult4MaxMinFloat64)(partialResult) + resBuf := spillHelper.serializePartialResult4MaxMinFloat64(*pr) + chk.AppendBytes(e.ordinal, resBuf) +} + +func (e *maxMin4Float64) DeserializePartialResult(src *chunk.Chunk) ([]PartialResult, int64) { + return deserializePartialResultCommon(src, e.ordinal, e.deserializeForSpill) +} + +func (e *maxMin4Float64) deserializeForSpill(helper *deserializeHelper) (PartialResult, int64) { + pr, memDelta := e.AllocPartialResult() + result := (*partialResult4MaxMinFloat64)(pr) + success := helper.deserializePartialResult4MaxMinFloat64(result) + if !success { + return nil, 0 + } + return pr, memDelta +} + type maxMin4Float64Sliding struct { maxMin4Float64 windowInfo @@ -868,6 +948,26 @@ func (e *maxMin4Decimal) MergePartialResult(_ sessionctx.Context, src, dst Parti return 0, nil } +func (e *maxMin4Decimal) SerializePartialResult(partialResult PartialResult, chk *chunk.Chunk, spillHelper *SerializeHelper) { + pr := (*partialResult4MaxMinDecimal)(partialResult) + resBuf := spillHelper.serializePartialResult4MaxMinDecimal(*pr) + chk.AppendBytes(e.ordinal, resBuf) +} + +func (e *maxMin4Decimal) DeserializePartialResult(src *chunk.Chunk) ([]PartialResult, int64) { + return deserializePartialResultCommon(src, e.ordinal, e.deserializeForSpill) +} + +func (e *maxMin4Decimal) deserializeForSpill(helper *deserializeHelper) (PartialResult, int64) { + pr, memDelta := e.AllocPartialResult() + result := (*partialResult4MaxMinDecimal)(pr) + success := helper.deserializePartialResult4MaxMinDecimal(result) + if !success { + return nil, 0 + } + return pr, memDelta +} + type maxMin4DecimalSliding struct { maxMin4Decimal windowInfo @@ -1029,6 +1129,26 @@ func (e *maxMin4String) MergePartialResult(_ sessionctx.Context, src, dst Partia return 0, nil } +func (e *maxMin4String) SerializePartialResult(partialResult PartialResult, chk *chunk.Chunk, spillHelper *SerializeHelper) { + pr := (*partialResult4MaxMinString)(partialResult) + resBuf := spillHelper.serializePartialResult4MaxMinString(*pr) + chk.AppendBytes(e.ordinal, resBuf) +} + +func (e *maxMin4String) DeserializePartialResult(src *chunk.Chunk) ([]PartialResult, int64) { + return deserializePartialResultCommon(src, e.ordinal, e.deserializeForSpill) +} + +func (e *maxMin4String) deserializeForSpill(helper *deserializeHelper) (PartialResult, int64) { + pr, memDelta := e.AllocPartialResult() + result := (*partialResult4MaxMinString)(pr) + success := helper.deserializePartialResult4MaxMinString(result) + if !success { + return nil, 0 + } + return pr, memDelta +} + type maxMin4StringSliding struct { maxMin4String windowInfo @@ -1212,6 +1332,26 @@ func (e *maxMin4TimeSliding) UpdatePartialResult(sctx sessionctx.Context, rowsIn return 0, nil } +func (e *maxMin4TimeSliding) SerializePartialResult(partialResult PartialResult, chk *chunk.Chunk, spillHelper *SerializeHelper) { + pr := (*partialResult4MaxMinTime)(partialResult) + resBuf := spillHelper.serializePartialResult4MaxMinTime(*pr) + chk.AppendBytes(e.ordinal, resBuf) +} + +func (e *maxMin4TimeSliding) DeserializePartialResult(src *chunk.Chunk) ([]PartialResult, int64) { + return deserializePartialResultCommon(src, e.ordinal, e.deserializeForSpill) +} + +func (e *maxMin4TimeSliding) deserializeForSpill(helper *deserializeHelper) (PartialResult, int64) { + pr, memDelta := e.AllocPartialResult() + result := (*partialResult4MaxMinTime)(pr) + success := helper.deserializePartialResult4MaxMinTime(result) + if !success { + return nil, 0 + } + return pr, memDelta +} + var _ SlidingWindowAggFunc = &maxMin4DurationSliding{} func (e *maxMin4TimeSliding) Slide(sctx sessionctx.Context, getRow func(uint64) chunk.Row, lastStart, lastEnd uint64, shiftStart, shiftEnd uint64, pr PartialResult) error { @@ -1308,6 +1448,26 @@ func (e *maxMin4Duration) MergePartialResult(_ sessionctx.Context, src, dst Part return 0, nil } +func (e *maxMin4Duration) SerializePartialResult(partialResult PartialResult, chk *chunk.Chunk, spillHelper *SerializeHelper) { + pr := (*partialResult4MaxMinDuration)(partialResult) + resBuf := spillHelper.serializePartialResult4MaxMinDuration(*pr) + chk.AppendBytes(e.ordinal, resBuf) +} + +func (e *maxMin4Duration) DeserializePartialResult(src *chunk.Chunk) ([]PartialResult, int64) { + return deserializePartialResultCommon(src, e.ordinal, e.deserializeForSpill) +} + +func (e *maxMin4Duration) deserializeForSpill(helper *deserializeHelper) (PartialResult, int64) { + pr, memDelta := e.AllocPartialResult() + result := (*partialResult4MaxMinDuration)(pr) + success := helper.deserializePartialResult4MaxMinDuration(result) + if !success { + return nil, 0 + } + return pr, memDelta +} + type maxMin4DurationSliding struct { maxMin4Duration windowInfo @@ -1453,6 +1613,26 @@ func (e *maxMin4JSON) MergePartialResult(_ sessionctx.Context, src, dst PartialR return 0, nil } +func (e *maxMin4JSON) SerializePartialResult(partialResult PartialResult, chk *chunk.Chunk, spillHelper *SerializeHelper) { + pr := (*partialResult4MaxMinJSON)(partialResult) + resBuf := spillHelper.serializePartialResult4MaxMinJSON(*pr) + chk.AppendBytes(e.ordinal, resBuf) +} + +func (e *maxMin4JSON) DeserializePartialResult(src *chunk.Chunk) ([]PartialResult, int64) { + return deserializePartialResultCommon(src, e.ordinal, e.deserializeForSpill) +} + +func (e *maxMin4JSON) deserializeForSpill(helper *deserializeHelper) (PartialResult, int64) { + pr, memDelta := e.AllocPartialResult() + result := (*partialResult4MaxMinJSON)(pr) + success := helper.deserializePartialResult4MaxMinJSON(result) + if !success { + return nil, 0 + } + return pr, memDelta +} + type maxMin4Enum struct { baseMaxMinAggFunc } @@ -1520,6 +1700,26 @@ func (e *maxMin4Enum) MergePartialResult(_ sessionctx.Context, src, dst PartialR return 0, nil } +func (e *maxMin4Enum) SerializePartialResult(partialResult PartialResult, chk *chunk.Chunk, spillHelper *SerializeHelper) { + pr := (*partialResult4MaxMinEnum)(partialResult) + resBuf := spillHelper.serializePartialResult4MaxMinEnum(*pr) + chk.AppendBytes(e.ordinal, resBuf) +} + +func (e *maxMin4Enum) DeserializePartialResult(src *chunk.Chunk) ([]PartialResult, int64) { + return deserializePartialResultCommon(src, e.ordinal, e.deserializeForSpill) +} + +func (e *maxMin4Enum) deserializeForSpill(helper *deserializeHelper) (PartialResult, int64) { + pr, memDelta := e.AllocPartialResult() + result := (*partialResult4MaxMinEnum)(pr) + success := helper.deserializePartialResult4MaxMinEnum(result) + if !success { + return nil, 0 + } + return pr, memDelta +} + type maxMin4Set struct { baseMaxMinAggFunc } @@ -1586,3 +1786,23 @@ func (e *maxMin4Set) MergePartialResult(_ sessionctx.Context, src, dst PartialRe } return 0, nil } + +func (e *maxMin4Set) SerializePartialResult(partialResult PartialResult, chk *chunk.Chunk, spillHelper *SerializeHelper) { + pr := (*partialResult4MaxMinSet)(partialResult) + resBuf := spillHelper.serializePartialResult4MaxMinSet(*pr) + chk.AppendBytes(e.ordinal, resBuf) +} + +func (e *maxMin4Set) DeserializePartialResult(src *chunk.Chunk) ([]PartialResult, int64) { + return deserializePartialResultCommon(src, e.ordinal, e.deserializeForSpill) +} + +func (e *maxMin4Set) deserializeForSpill(helper *deserializeHelper) (PartialResult, int64) { + pr, memDelta := e.AllocPartialResult() + result := (*partialResult4MaxMinSet)(pr) + success := helper.deserializePartialResult4MaxMinSet(result) + if !success { + return nil, 0 + } + return pr, memDelta +} diff --git a/pkg/executor/aggfuncs/func_percentile_test.go b/pkg/executor/aggfuncs/func_percentile_test.go index 65f22466fd235..13f2800f9b9e2 100644 --- a/pkg/executor/aggfuncs/func_percentile_test.go +++ b/pkg/executor/aggfuncs/func_percentile_test.go @@ -46,7 +46,9 @@ func TestPercentile(t *testing.T) { testAggFunc(t, test) }) } +} +func TestFix26807(t *testing.T) { data := testSlice{} want := 28 for i := 1; i <= want; i++ { @@ -57,3 +59,12 @@ func TestPercentile(t *testing.T) { require.Equal(t, want, data[index]) } } + +func TestFix40463(t *testing.T) { + types := []byte{mysql.TypeEnum, mysql.TypeSet} + for _, tp := range types { + test := buildAggTester(ast.AggFuncApproxPercentile, tp, 5, nil, nil) + test.dataType.AddFlag(mysql.EnumSetAsIntFlag) + testAggFunc(t, test) + } +} diff --git a/pkg/executor/aggfuncs/func_sum.go b/pkg/executor/aggfuncs/func_sum.go index 32573eacc6fcd..23f39f26bce50 100644 --- a/pkg/executor/aggfuncs/func_sum.go +++ b/pkg/executor/aggfuncs/func_sum.go @@ -114,6 +114,26 @@ func (*baseSum4Float64) MergePartialResult(_ sessionctx.Context, src, dst Partia return 0, nil } +func (e *baseSum4Float64) SerializePartialResult(partialResult PartialResult, chk *chunk.Chunk, spillHelper *SerializeHelper) { + pr := (*partialResult4SumFloat64)(partialResult) + resBuf := spillHelper.serializePartialResult4SumFloat64(*pr) + chk.AppendBytes(e.ordinal, resBuf) +} + +func (e *baseSum4Float64) DeserializePartialResult(src *chunk.Chunk) ([]PartialResult, int64) { + return deserializePartialResultCommon(src, e.ordinal, e.deserializeForSpill) +} + +func (e *baseSum4Float64) deserializeForSpill(helper *deserializeHelper) (PartialResult, int64) { + pr, memDelta := e.AllocPartialResult() + result := (*partialResult4SumFloat64)(pr) + success := helper.deserializePartialResult4SumFloat64(result) + if !success { + return nil, 0 + } + return pr, memDelta +} + type sum4Float64 struct { baseSum4Float64 } @@ -155,6 +175,26 @@ type sum4Decimal struct { baseSumAggFunc } +func (e *sum4Decimal) SerializePartialResult(partialResult PartialResult, chk *chunk.Chunk, spillHelper *SerializeHelper) { + pr := (*partialResult4SumDecimal)(partialResult) + resBuf := spillHelper.serializePartialResult4SumDecimal(*pr) + chk.AppendBytes(e.ordinal, resBuf) +} + +func (e *sum4Decimal) DeserializePartialResult(src *chunk.Chunk) ([]PartialResult, int64) { + return deserializePartialResultCommon(src, e.ordinal, e.deserializeForSpill) +} + +func (e *sum4Decimal) deserializeForSpill(helper *deserializeHelper) (PartialResult, int64) { + pr, memDelta := e.AllocPartialResult() + result := (*partialResult4SumDecimal)(pr) + success := helper.deserializePartialResult4SumDecimal(result) + if !success { + return nil, 0 + } + return pr, memDelta +} + func (*sum4Decimal) AllocPartialResult() (pr PartialResult, memDelta int64) { p := new(partialResult4SumDecimal) return PartialResult(p), DefPartialResult4SumDecimalSize diff --git a/pkg/executor/aggfuncs/main_test.go b/pkg/executor/aggfuncs/main_test.go index 16c14822a421f..d322bf375efe9 100644 --- a/pkg/executor/aggfuncs/main_test.go +++ b/pkg/executor/aggfuncs/main_test.go @@ -25,6 +25,7 @@ func TestMain(m *testing.M) { testsetup.SetupForCommonTest() opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), diff --git a/pkg/executor/aggfuncs/spill_deserialize_helper.go b/pkg/executor/aggfuncs/spill_deserialize_helper.go new file mode 100644 index 0000000000000..83e9d44f32b16 --- /dev/null +++ b/pkg/executor/aggfuncs/spill_deserialize_helper.go @@ -0,0 +1,397 @@ +// Copyright 2023 PingCAP, 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. + +package aggfuncs + +import ( + "github.com/pingcap/tidb/pkg/util/chunk" + "github.com/pingcap/tidb/pkg/util/hack" + util "github.com/pingcap/tidb/pkg/util/serialization" +) + +type deserializeHelper struct { + column *chunk.Column + readRowIndex int + totalRowCnt int + pab *util.PosAndBuf +} + +func newDeserializeHelper(column *chunk.Column, rowNum int) deserializeHelper { + return deserializeHelper{ + column: column, + readRowIndex: 0, + totalRowCnt: rowNum, + pab: &util.PosAndBuf{ + Pos: 0, + }, + } +} + +func (s *deserializeHelper) deserializePartialResult4Count(dst *partialResult4Count) bool { + if s.readRowIndex < s.totalRowCnt { + s.pab.Reset(s.column, s.readRowIndex) + *dst = util.DeserializeInt64(s.pab) + s.readRowIndex++ + return true + } + return false +} + +func (s *deserializeHelper) deserializePartialResult4MaxMinInt(dst *partialResult4MaxMinInt) bool { + if s.readRowIndex < s.totalRowCnt { + s.pab.Reset(s.column, s.readRowIndex) + dst.isNull = util.DeserializeBool(s.pab) + dst.val = util.DeserializeInt64(s.pab) + s.readRowIndex++ + return true + } + return false +} + +func (s *deserializeHelper) deserializePartialResult4MaxMinUint(dst *partialResult4MaxMinUint) bool { + if s.readRowIndex < s.totalRowCnt { + s.pab.Reset(s.column, s.readRowIndex) + dst.isNull = util.DeserializeBool(s.pab) + dst.val = util.DeserializeUint64(s.pab) + s.readRowIndex++ + return true + } + return false +} + +func (s *deserializeHelper) deserializePartialResult4MaxMinDecimal(dst *partialResult4MaxMinDecimal) bool { + if s.readRowIndex < s.totalRowCnt { + s.pab.Reset(s.column, s.readRowIndex) + dst.isNull = util.DeserializeBool(s.pab) + dst.val = util.DeserializeMyDecimal(s.pab) + s.readRowIndex++ + return true + } + return false +} + +func (s *deserializeHelper) deserializePartialResult4MaxMinFloat32(dst *partialResult4MaxMinFloat32) bool { + if s.readRowIndex < s.totalRowCnt { + s.pab.Reset(s.column, s.readRowIndex) + dst.isNull = util.DeserializeBool(s.pab) + dst.val = util.DeserializeFloat32(s.pab) + s.readRowIndex++ + return true + } + return false +} + +func (s *deserializeHelper) deserializePartialResult4MaxMinFloat64(dst *partialResult4MaxMinFloat64) bool { + if s.readRowIndex < s.totalRowCnt { + s.pab.Reset(s.column, s.readRowIndex) + dst.isNull = util.DeserializeBool(s.pab) + dst.val = util.DeserializeFloat64(s.pab) + s.readRowIndex++ + return true + } + return false +} + +func (s *deserializeHelper) deserializePartialResult4MaxMinTime(dst *partialResult4MaxMinTime) bool { + if s.readRowIndex < s.totalRowCnt { + s.pab.Reset(s.column, s.readRowIndex) + dst.isNull = util.DeserializeBool(s.pab) + dst.val = util.DeserializeTime(s.pab) + s.readRowIndex++ + return true + } + return false +} + +func (s *deserializeHelper) deserializePartialResult4MaxMinDuration(dst *partialResult4MaxMinDuration) bool { + if s.readRowIndex < s.totalRowCnt { + s.pab.Reset(s.column, s.readRowIndex) + dst.isNull = util.DeserializeBool(s.pab) + dst.val = util.DeserializeTypesDuration(s.pab) + s.readRowIndex++ + return true + } + return false +} + +func (s *deserializeHelper) deserializePartialResult4MaxMinString(dst *partialResult4MaxMinString) bool { + if s.readRowIndex < s.totalRowCnt { + s.pab.Reset(s.column, s.readRowIndex) + dst.isNull = util.DeserializeBool(s.pab) + dst.val = util.DeserializeString(s.pab) + s.readRowIndex++ + return true + } + return false +} + +func (s *deserializeHelper) deserializePartialResult4MaxMinJSON(dst *partialResult4MaxMinJSON) bool { + if s.readRowIndex < s.totalRowCnt { + s.pab.Reset(s.column, s.readRowIndex) + dst.isNull = util.DeserializeBool(s.pab) + dst.val = util.DeserializeBinaryJSON(s.pab) + s.readRowIndex++ + return true + } + return false +} + +func (s *deserializeHelper) deserializePartialResult4MaxMinEnum(dst *partialResult4MaxMinEnum) bool { + if s.readRowIndex < s.totalRowCnt { + s.pab.Reset(s.column, s.readRowIndex) + dst.isNull = util.DeserializeBool(s.pab) + dst.val = util.DeserializeEnum(s.pab) + s.readRowIndex++ + return true + } + return false +} + +func (s *deserializeHelper) deserializePartialResult4MaxMinSet(dst *partialResult4MaxMinSet) bool { + if s.readRowIndex < s.totalRowCnt { + s.pab.Reset(s.column, s.readRowIndex) + dst.isNull = util.DeserializeBool(s.pab) + dst.val = util.DeserializeSet(s.pab) + s.readRowIndex++ + return true + } + return false +} + +func (s *deserializeHelper) deserializePartialResult4AvgDecimal(dst *partialResult4AvgDecimal) bool { + if s.readRowIndex < s.totalRowCnt { + s.pab.Reset(s.column, s.readRowIndex) + dst.sum = util.DeserializeMyDecimal(s.pab) + dst.count = util.DeserializeInt64(s.pab) + s.readRowIndex++ + return true + } + return false +} + +func (s *deserializeHelper) deserializePartialResult4AvgFloat64(dst *partialResult4AvgFloat64) bool { + if s.readRowIndex < s.totalRowCnt { + s.pab.Reset(s.column, s.readRowIndex) + dst.sum = util.DeserializeFloat64(s.pab) + dst.count = util.DeserializeInt64(s.pab) + s.readRowIndex++ + return true + } + return false +} + +func (s *deserializeHelper) deserializePartialResult4SumDecimal(dst *partialResult4SumDecimal) bool { + if s.readRowIndex < s.totalRowCnt { + s.pab.Reset(s.column, s.readRowIndex) + dst.val = util.DeserializeMyDecimal(s.pab) + dst.notNullRowCount = util.DeserializeInt64(s.pab) + s.readRowIndex++ + return true + } + return false +} + +func (s *deserializeHelper) deserializePartialResult4SumFloat64(dst *partialResult4SumFloat64) bool { + if s.readRowIndex < s.totalRowCnt { + s.pab.Reset(s.column, s.readRowIndex) + dst.val = util.DeserializeFloat64(s.pab) + dst.notNullRowCount = util.DeserializeInt64(s.pab) + s.readRowIndex++ + return true + } + return false +} + +func (s *deserializeHelper) deserializeBasePartialResult4GroupConcat(dst *basePartialResult4GroupConcat) bool { + if s.readRowIndex < s.totalRowCnt { + s.pab.Reset(s.column, s.readRowIndex) + dst.valsBuf = util.DeserializeBytesBuffer(s.pab) + dst.buffer = util.DeserializeBytesBuffer(s.pab) + s.readRowIndex++ + return true + } + return false +} + +func (s *deserializeHelper) deserializePartialResult4GroupConcat(dst *partialResult4GroupConcat) bool { + base := basePartialResult4GroupConcat{} + success := s.deserializeBasePartialResult4GroupConcat(&base) + dst.valsBuf = base.valsBuf + dst.buffer = base.buffer + return success +} + +func (s *deserializeHelper) deserializePartialResult4BitFunc(dst *partialResult4BitFunc) bool { + if s.readRowIndex < s.totalRowCnt { + s.pab.Reset(s.column, s.readRowIndex) + *dst = util.DeserializeUint64(s.pab) + s.readRowIndex++ + return true + } + return false +} + +func (s *deserializeHelper) deserializePartialResult4JsonArrayagg(dst *partialResult4JsonArrayagg) bool { + if s.readRowIndex < s.totalRowCnt { + s.pab.Reset(s.column, s.readRowIndex) + byteNum := int64(len(s.pab.Buf)) + for s.pab.Pos < byteNum { + value := util.DeserializeInterface(s.pab) + dst.entries = append(dst.entries, value) + } + s.readRowIndex++ + return true + } + return false +} + +func (s *deserializeHelper) deserializePartialResult4JsonObjectAgg(dst *partialResult4JsonObjectAgg) (bool, int64) { + memDelta := int64(0) + dst.bInMap = 0 + dst.entries = make(map[string]interface{}) + if s.readRowIndex < s.totalRowCnt { + s.pab.Reset(s.column, s.readRowIndex) + byteNum := int64(len(s.pab.Buf)) + for s.pab.Pos < byteNum { + key := util.DeserializeString(s.pab) + realVal := util.DeserializeInterface(s.pab) + if _, ok := dst.entries[key]; !ok { + memDelta += int64(len(key)) + getValMemDelta(realVal) + if len(dst.entries)+1 > (1< b.lastCap) + b.lastCap = newCap + return retVal +} + +func TestPartialResult4Count(t *testing.T) { + serializeHelper := NewSerializeHelper() + + // Initialize test data + expectData := []partialResult4Count{-123, 0, 123} + serializedPartialResults := make([]PartialResult, len(expectData)) + testDataNum := len(serializedPartialResults) + for i := range serializedPartialResults { + pr := new(partialResult4Count) + *pr = expectData[i] + serializedPartialResults[i] = PartialResult(pr) + } + + // Serialize test data + chunk := getChunk() + for _, pr := range serializedPartialResults { + serializedData := serializeHelper.serializePartialResult4Count(*(*partialResult4Count)(pr)) + chunk.AppendBytes(0, serializedData) + } + + // Deserialize test data + deserializeHelper := newDeserializeHelper(chunk.Column(0), testDataNum) + deserializedPartialResults := make([]partialResult4Count, testDataNum+1) + index := 0 + for { + success := deserializeHelper.deserializePartialResult4Count(&deserializedPartialResults[index]) + if !success { + break + } + index++ + } + + chunk.Column(0).DestroyDataForTest() + + // Check some results + require.Equal(t, testDataNum, index) + for i := 0; i < testDataNum; i++ { + require.Equal(t, *(*partialResult4Count)(serializedPartialResults[i]), deserializedPartialResults[i]) + } +} + +func TestPartialResult4MaxMinInt(t *testing.T) { + serializeHelper := NewSerializeHelper() + + // Initialize test data + expectData := []partialResult4MaxMinInt{ + {val: -123, isNull: true}, + {val: 0, isNull: false}, + {val: 123, isNull: true}, + } + serializedPartialResults := make([]PartialResult, len(expectData)) + testDataNum := len(serializedPartialResults) + for i := range serializedPartialResults { + pr := new(partialResult4MaxMinInt) + *pr = expectData[i] + serializedPartialResults[i] = PartialResult(pr) + } + + // Serialize test data + chunk := getChunk() + for _, pr := range serializedPartialResults { + serializedData := serializeHelper.serializePartialResult4MaxMinInt(*(*partialResult4MaxMinInt)(pr)) + chunk.AppendBytes(0, serializedData) + } + + // Deserialize test data + deserializeHelper := newDeserializeHelper(chunk.Column(0), testDataNum) + deserializedPartialResults := make([]partialResult4MaxMinInt, testDataNum+1) + index := 0 + for { + success := deserializeHelper.deserializePartialResult4MaxMinInt(&deserializedPartialResults[index]) + if !success { + break + } + index++ + } + + chunk.Column(0).DestroyDataForTest() + + // Check some results + require.Equal(t, testDataNum, index) + for i := 0; i < testDataNum; i++ { + require.Equal(t, *(*partialResult4MaxMinInt)(serializedPartialResults[i]), deserializedPartialResults[i]) + } +} + +func TestPartialResult4MaxMinUint(t *testing.T) { + serializeHelper := NewSerializeHelper() + + // Initialize test data + expectData := []partialResult4MaxMinUint{ + {val: 0, isNull: true}, + {val: 1, isNull: false}, + {val: 2, isNull: true}, + } + serializedPartialResults := make([]PartialResult, len(expectData)) + testDataNum := len(serializedPartialResults) + for i := range serializedPartialResults { + pr := new(partialResult4MaxMinUint) + *pr = expectData[i] + serializedPartialResults[i] = PartialResult(pr) + } + + // Serialize test data + chunk := getChunk() + for _, pr := range serializedPartialResults { + serializedData := serializeHelper.serializePartialResult4MaxMinUint(*(*partialResult4MaxMinUint)(pr)) + chunk.AppendBytes(0, serializedData) + } + + // Deserialize test data + deserializeHelper := newDeserializeHelper(chunk.Column(0), testDataNum) + deserializedPartialResults := make([]partialResult4MaxMinUint, testDataNum+1) + index := 0 + for { + success := deserializeHelper.deserializePartialResult4MaxMinUint(&deserializedPartialResults[index]) + if !success { + break + } + index++ + } + + chunk.Column(0).DestroyDataForTest() + + // Check some results + require.Equal(t, testDataNum, index) + for i := 0; i < testDataNum; i++ { + require.Equal(t, *(*partialResult4MaxMinUint)(serializedPartialResults[i]), deserializedPartialResults[i]) + } +} + +func TestPartialResult4MaxMinDecimal(t *testing.T) { + serializeHelper := NewSerializeHelper() + + // Initialize test data + expectData := []partialResult4MaxMinDecimal{ + {val: *types.NewDecFromInt(0), isNull: true}, + {val: *types.NewDecFromUint(123456), isNull: false}, + {val: *types.NewDecFromInt(99999), isNull: true}, + } + serializedPartialResults := make([]PartialResult, len(expectData)) + testDataNum := len(serializedPartialResults) + for i := range serializedPartialResults { + pr := new(partialResult4MaxMinDecimal) + *pr = expectData[i] + serializedPartialResults[i] = PartialResult(pr) + } + + // Serialize test data + chunk := getChunk() + for _, pr := range serializedPartialResults { + serializedData := serializeHelper.serializePartialResult4MaxMinDecimal(*(*partialResult4MaxMinDecimal)(pr)) + chunk.AppendBytes(0, serializedData) + } + + // Deserialize test data + deserializeHelper := newDeserializeHelper(chunk.Column(0), testDataNum) + deserializedPartialResults := make([]partialResult4MaxMinDecimal, testDataNum+1) + index := 0 + for { + success := deserializeHelper.deserializePartialResult4MaxMinDecimal(&deserializedPartialResults[index]) + if !success { + break + } + index++ + } + + chunk.Column(0).DestroyDataForTest() + + // Check some results + require.Equal(t, testDataNum, index) + for i := 0; i < testDataNum; i++ { + require.Equal(t, *(*partialResult4MaxMinDecimal)(serializedPartialResults[i]), deserializedPartialResults[i]) + } +} + +func TestPartialResult4MaxMinFloat32(t *testing.T) { + serializeHelper := NewSerializeHelper() + + // Initialize test data + expectData := []partialResult4MaxMinFloat32{ + {val: -123.123, isNull: true}, + {val: 0.0, isNull: false}, + {val: 123.123, isNull: true}, + } + serializedPartialResults := make([]PartialResult, len(expectData)) + testDataNum := len(serializedPartialResults) + for i := range serializedPartialResults { + pr := new(partialResult4MaxMinFloat32) + *pr = expectData[i] + serializedPartialResults[i] = PartialResult(pr) + } + + // Serialize test data + chunk := getChunk() + for _, pr := range serializedPartialResults { + serializedData := serializeHelper.serializePartialResult4MaxMinFloat32(*(*partialResult4MaxMinFloat32)(pr)) + chunk.AppendBytes(0, serializedData) + } + + // Deserialize test data + deserializeHelper := newDeserializeHelper(chunk.Column(0), testDataNum) + deserializedPartialResults := make([]partialResult4MaxMinFloat32, testDataNum+1) + index := 0 + for { + success := deserializeHelper.deserializePartialResult4MaxMinFloat32(&deserializedPartialResults[index]) + if !success { + break + } + index++ + } + + chunk.Column(0).DestroyDataForTest() + + // Check some results + require.Equal(t, testDataNum, index) + for i := 0; i < testDataNum; i++ { + require.Equal(t, *(*partialResult4MaxMinFloat32)(serializedPartialResults[i]), deserializedPartialResults[i]) + } +} + +func TestPartialResult4MaxMinFloat64(t *testing.T) { + serializeHelper := NewSerializeHelper() + + // Initialize test data + expectData := []partialResult4MaxMinFloat64{ + {val: -123.123, isNull: true}, + {val: 0.0, isNull: false}, + {val: 123.123, isNull: true}, + } + serializedPartialResults := make([]PartialResult, len(expectData)) + testDataNum := len(serializedPartialResults) + for i := range serializedPartialResults { + pr := new(partialResult4MaxMinFloat64) + *pr = expectData[i] + serializedPartialResults[i] = PartialResult(pr) + } + + // Serialize test data + chunk := getChunk() + for _, pr := range serializedPartialResults { + serializedData := serializeHelper.serializePartialResult4MaxMinFloat64(*(*partialResult4MaxMinFloat64)(pr)) + chunk.AppendBytes(0, serializedData) + } + + // Deserialize test data + deserializeHelper := newDeserializeHelper(chunk.Column(0), testDataNum) + deserializedPartialResults := make([]partialResult4MaxMinFloat64, testDataNum+1) + index := 0 + for { + success := deserializeHelper.deserializePartialResult4MaxMinFloat64(&deserializedPartialResults[index]) + if !success { + break + } + index++ + } + + chunk.Column(0).DestroyDataForTest() + + // Check some results + require.Equal(t, testDataNum, index) + for i := 0; i < testDataNum; i++ { + require.Equal(t, *(*partialResult4MaxMinFloat64)(serializedPartialResults[i]), deserializedPartialResults[i]) + } +} + +func TestPartialResult4MaxMinTime(t *testing.T) { + serializeHelper := NewSerializeHelper() + + // Initialize test data + expectData := []partialResult4MaxMinTime{ + {val: types.NewTime(123, 10, 9), isNull: true}, + {val: types.NewTime(0, 0, 0), isNull: false}, + {val: types.NewTime(9876, 12, 10), isNull: true}, + } + serializedPartialResults := make([]PartialResult, len(expectData)) + testDataNum := len(serializedPartialResults) + for i := range serializedPartialResults { + pr := new(partialResult4MaxMinTime) + *pr = expectData[i] + serializedPartialResults[i] = PartialResult(pr) + } + + // Serialize test data + chunk := getChunk() + for _, pr := range serializedPartialResults { + serializedData := serializeHelper.serializePartialResult4MaxMinTime(*(*partialResult4MaxMinTime)(pr)) + chunk.AppendBytes(0, serializedData) + } + + // Deserialize test data + deserializeHelper := newDeserializeHelper(chunk.Column(0), testDataNum) + deserializedPartialResults := make([]partialResult4MaxMinTime, testDataNum+1) + index := 0 + for { + success := deserializeHelper.deserializePartialResult4MaxMinTime(&deserializedPartialResults[index]) + if !success { + break + } + index++ + } + + chunk.Column(0).DestroyDataForTest() + + // Check some results + require.Equal(t, testDataNum, index) + for i := 0; i < testDataNum; i++ { + require.Equal(t, *(*partialResult4MaxMinTime)(serializedPartialResults[i]), deserializedPartialResults[i]) + } +} + +func TestPartialResult4MaxMinString(t *testing.T) { + serializeHelper := NewSerializeHelper() + bufSizeChecker := newBufferSizeChecker() + + // Initialize test data + expectData := []partialResult4MaxMinString{ + {val: string("12312412312"), isNull: true}, + {val: testLongStr1, isNull: false}, + } + serializedPartialResults := make([]PartialResult, len(expectData)) + testDataNum := len(serializedPartialResults) + for i := range serializedPartialResults { + pr := new(partialResult4MaxMinString) + *pr = expectData[i] + serializedPartialResults[i] = PartialResult(pr) + } + + // Serialize test data + chunk := getChunk() + for _, pr := range serializedPartialResults { + serializedData := serializeHelper.serializePartialResult4MaxMinString(*(*partialResult4MaxMinString)(pr)) + chunk.AppendBytes(0, serializedData) + require.True(t, bufSizeChecker.checkBufferCapacity(serializeHelper)) + } + + // Deserialize test data + deserializeHelper := newDeserializeHelper(chunk.Column(0), testDataNum) + deserializedPartialResults := make([]partialResult4MaxMinString, testDataNum+1) + index := 0 + for { + success := deserializeHelper.deserializePartialResult4MaxMinString(&deserializedPartialResults[index]) + if !success { + break + } + index++ + } + + chunk.Column(0).DestroyDataForTest() + + // Check some results + require.Equal(t, testDataNum, index) + for i := 0; i < testDataNum; i++ { + require.Equal(t, *(*partialResult4MaxMinString)(serializedPartialResults[i]), deserializedPartialResults[i]) + } +} + +func TestPartialResult4MaxMinJSON(t *testing.T) { + serializeHelper := NewSerializeHelper() + bufSizeChecker := newBufferSizeChecker() + + // Initialize test data + expectData := []partialResult4MaxMinJSON{ + {val: types.BinaryJSON{TypeCode: 3, Value: []byte{}}, isNull: false}, + {val: types.BinaryJSON{TypeCode: 6, Value: getLargeRandBuffer()}, isNull: true}, + } + serializedPartialResults := make([]PartialResult, len(expectData)) + testDataNum := len(serializedPartialResults) + for i := range serializedPartialResults { + pr := new(partialResult4MaxMinJSON) + *pr = expectData[i] + serializedPartialResults[i] = PartialResult(pr) + } + + // Serialize test data + chunk := getChunk() + for _, pr := range serializedPartialResults { + serializedData := serializeHelper.serializePartialResult4MaxMinJSON(*(*partialResult4MaxMinJSON)(pr)) + chunk.AppendBytes(0, serializedData) + require.True(t, bufSizeChecker.checkBufferCapacity(serializeHelper)) + } + + // Deserialize test data + deserializeHelper := newDeserializeHelper(chunk.Column(0), testDataNum) + deserializedPartialResults := make([]partialResult4MaxMinJSON, testDataNum+1) + index := 0 + for { + success := deserializeHelper.deserializePartialResult4MaxMinJSON(&deserializedPartialResults[index]) + if !success { + break + } + index++ + } + + chunk.Column(0).DestroyDataForTest() + + // Check some results + require.Equal(t, testDataNum, index) + for i := 0; i < testDataNum; i++ { + require.Equal(t, *(*partialResult4MaxMinJSON)(serializedPartialResults[i]), deserializedPartialResults[i]) + } +} + +func TestPartialResult4MaxMinEnum(t *testing.T) { + serializeHelper := NewSerializeHelper() + bufSizeChecker := newBufferSizeChecker() + + // Initialize test data + expectData := []partialResult4MaxMinEnum{ + {val: types.Enum{Name: string(""), Value: 123}, isNull: true}, + {val: types.Enum{Name: testLongStr1, Value: 0}, isNull: false}, + } + serializedPartialResults := make([]PartialResult, len(expectData)) + testDataNum := len(serializedPartialResults) + for i := range serializedPartialResults { + pr := new(partialResult4MaxMinEnum) + *pr = expectData[i] + serializedPartialResults[i] = PartialResult(pr) + } + + // Serialize test data + chunk := getChunk() + for _, pr := range serializedPartialResults { + serializedData := serializeHelper.serializePartialResult4MaxMinEnum(*(*partialResult4MaxMinEnum)(pr)) + chunk.AppendBytes(0, serializedData) + require.True(t, bufSizeChecker.checkBufferCapacity(serializeHelper)) + } + + // Deserialize test data + deserializeHelper := newDeserializeHelper(chunk.Column(0), testDataNum) + deserializedPartialResults := make([]partialResult4MaxMinEnum, testDataNum+1) + index := 0 + for { + success := deserializeHelper.deserializePartialResult4MaxMinEnum(&deserializedPartialResults[index]) + if !success { + break + } + index++ + } + + chunk.Column(0).DestroyDataForTest() + + // Check some results + require.Equal(t, testDataNum, index) + for i := 0; i < testDataNum; i++ { + require.Equal(t, *(*partialResult4MaxMinEnum)(serializedPartialResults[i]), deserializedPartialResults[i]) + } +} + +func TestPartialResult4MaxMinSet(t *testing.T) { + serializeHelper := NewSerializeHelper() + bufSizeChecker := newBufferSizeChecker() + + // Initialize test data + expectData := []partialResult4MaxMinSet{ + {val: types.Set{Name: string(""), Value: 123}, isNull: true}, + {val: types.Set{Name: testLongStr1, Value: 0}, isNull: false}, + } + serializedPartialResults := make([]PartialResult, len(expectData)) + testDataNum := len(serializedPartialResults) + for i := range serializedPartialResults { + pr := new(partialResult4MaxMinSet) + *pr = expectData[i] + serializedPartialResults[i] = PartialResult(pr) + } + + // Serialize test data + chunk := getChunk() + for _, pr := range serializedPartialResults { + serializedData := serializeHelper.serializePartialResult4MaxMinSet(*(*partialResult4MaxMinSet)(pr)) + chunk.AppendBytes(0, serializedData) + require.True(t, bufSizeChecker.checkBufferCapacity(serializeHelper)) + } + + // Deserialize test data + deserializeHelper := newDeserializeHelper(chunk.Column(0), testDataNum) + deserializedPartialResults := make([]partialResult4MaxMinSet, testDataNum+1) + index := 0 + for { + success := deserializeHelper.deserializePartialResult4MaxMinSet(&deserializedPartialResults[index]) + if !success { + break + } + index++ + } + + chunk.Column(0).DestroyDataForTest() + + // Check some results + require.Equal(t, testDataNum, index) + for i := 0; i < testDataNum; i++ { + require.Equal(t, *(*partialResult4MaxMinSet)(serializedPartialResults[i]), deserializedPartialResults[i]) + } +} + +func TestPartialResult4AvgDecimal(t *testing.T) { + serializeHelper := NewSerializeHelper() + + // Initialize test data + expectData := []partialResult4AvgDecimal{ + {sum: *types.NewDecFromInt(0), count: 0}, + {sum: *types.NewDecFromInt(12345), count: 123}, + {sum: *types.NewDecFromInt(87654), count: -123}, + } + serializedPartialResults := make([]PartialResult, len(expectData)) + testDataNum := len(serializedPartialResults) + for i := range serializedPartialResults { + pr := new(partialResult4AvgDecimal) + *pr = expectData[i] + serializedPartialResults[i] = PartialResult(pr) + } + + // Serialize test data + chunk := getChunk() + for _, pr := range serializedPartialResults { + serializedData := serializeHelper.serializePartialResult4AvgDecimal(*(*partialResult4AvgDecimal)(pr)) + chunk.AppendBytes(0, serializedData) + } + + // Deserialize test data + deserializeHelper := newDeserializeHelper(chunk.Column(0), testDataNum) + deserializedPartialResults := make([]partialResult4AvgDecimal, testDataNum+1) + index := 0 + for { + success := deserializeHelper.deserializePartialResult4AvgDecimal(&deserializedPartialResults[index]) + if !success { + break + } + index++ + } + + chunk.Column(0).DestroyDataForTest() + + // Check some results + require.Equal(t, testDataNum, index) + for i := 0; i < testDataNum; i++ { + require.Equal(t, *(*partialResult4AvgDecimal)(serializedPartialResults[i]), deserializedPartialResults[i]) + } +} + +func TestPartialResult4AvgFloat64(t *testing.T) { + serializeHelper := NewSerializeHelper() + + // Initialize test data + expectData := []partialResult4AvgFloat64{ + {sum: 0.0, count: 0}, + {sum: 123.123, count: 123}, + {sum: -123.123, count: -123}, + } + serializedPartialResults := make([]PartialResult, len(expectData)) + testDataNum := len(serializedPartialResults) + for i := range serializedPartialResults { + pr := new(partialResult4AvgFloat64) + *pr = expectData[i] + serializedPartialResults[i] = PartialResult(pr) + } + + // Serialize test data + chunk := getChunk() + for _, pr := range serializedPartialResults { + serializedData := serializeHelper.serializePartialResult4AvgFloat64(*(*partialResult4AvgFloat64)(pr)) + chunk.AppendBytes(0, serializedData) + } + + // Deserialize test data + deserializeHelper := newDeserializeHelper(chunk.Column(0), testDataNum) + deserializedPartialResults := make([]partialResult4AvgFloat64, testDataNum+1) + index := 0 + for { + success := deserializeHelper.deserializePartialResult4AvgFloat64(&deserializedPartialResults[index]) + if !success { + break + } + index++ + } + + chunk.Column(0).DestroyDataForTest() + + // Check some results + require.Equal(t, testDataNum, index) + for i := 0; i < testDataNum; i++ { + require.Equal(t, *(*partialResult4AvgFloat64)(serializedPartialResults[i]), deserializedPartialResults[i]) + } +} + +func TestPartialResult4SumDecimal(t *testing.T) { + serializeHelper := NewSerializeHelper() + + // Initialize test data + expectData := []partialResult4SumDecimal{ + {val: *types.NewDecFromInt(0), notNullRowCount: 0}, + {val: *types.NewDecFromInt(12345), notNullRowCount: 123}, + {val: *types.NewDecFromInt(87654), notNullRowCount: -123}, + } + serializedPartialResults := make([]PartialResult, len(expectData)) + testDataNum := len(serializedPartialResults) + for i := range serializedPartialResults { + pr := new(partialResult4SumDecimal) + *pr = expectData[i] + serializedPartialResults[i] = PartialResult(pr) + } + + // Serialize test data + chunk := getChunk() + for _, pr := range serializedPartialResults { + serializedData := serializeHelper.serializePartialResult4SumDecimal(*(*partialResult4SumDecimal)(pr)) + chunk.AppendBytes(0, serializedData) + } + + // Deserialize test data + deserializeHelper := newDeserializeHelper(chunk.Column(0), testDataNum) + deserializedPartialResults := make([]partialResult4SumDecimal, testDataNum+1) + index := 0 + for { + success := deserializeHelper.deserializePartialResult4SumDecimal(&deserializedPartialResults[index]) + if !success { + break + } + index++ + } + + chunk.Column(0).DestroyDataForTest() + + // Check some results + require.Equal(t, testDataNum, index) + for i := 0; i < testDataNum; i++ { + require.Equal(t, *(*partialResult4SumDecimal)(serializedPartialResults[i]), deserializedPartialResults[i]) + } +} + +func TestPartialResult4SumFloat64(t *testing.T) { + serializeHelper := NewSerializeHelper() + + // Initialize test data + expectData := []partialResult4SumFloat64{ + {val: 0.0, notNullRowCount: 0}, + {val: 123.123, notNullRowCount: 123}, + {val: -123.123, notNullRowCount: -123}, + } + serializedPartialResults := make([]PartialResult, len(expectData)) + testDataNum := len(serializedPartialResults) + for i := range serializedPartialResults { + pr := new(partialResult4SumFloat64) + *pr = expectData[i] + serializedPartialResults[i] = PartialResult(pr) + } + + // Serialize test data + chunk := getChunk() + for _, pr := range serializedPartialResults { + serializedData := serializeHelper.serializePartialResult4SumFloat64(*(*partialResult4SumFloat64)(pr)) + chunk.AppendBytes(0, serializedData) + } + + // Deserialize test data + deserializeHelper := newDeserializeHelper(chunk.Column(0), testDataNum) + deserializedPartialResults := make([]partialResult4SumFloat64, testDataNum+1) + index := 0 + for { + success := deserializeHelper.deserializePartialResult4SumFloat64(&deserializedPartialResults[index]) + if !success { + break + } + index++ + } + + chunk.Column(0).DestroyDataForTest() + + // Check some results + require.Equal(t, testDataNum, index) + for i := 0; i < testDataNum; i++ { + require.Equal(t, *(*partialResult4SumFloat64)(serializedPartialResults[i]), deserializedPartialResults[i]) + } +} + +func TestBasePartialResult4GroupConcat(t *testing.T) { + var serializeHelper = NewSerializeHelper() + bufSizeChecker := newBufferSizeChecker() + + // Initialize test data + expectData := []basePartialResult4GroupConcat{ + {valsBuf: bytes.NewBufferString(""), buffer: bytes.NewBufferString("")}, + {valsBuf: bytes.NewBufferString("xzxx"), buffer: bytes.NewBufferString(testLongStr2)}, + {valsBuf: bytes.NewBufferString(testLongStr1), buffer: bytes.NewBufferString(testLongStr2)}, + } + serializedPartialResults := make([]PartialResult, len(expectData)) + testDataNum := len(serializedPartialResults) + for i := range serializedPartialResults { + pr := new(basePartialResult4GroupConcat) + *pr = expectData[i] + serializedPartialResults[i] = PartialResult(pr) + } + + // Serialize test data + chunk := getChunk() + for _, pr := range serializedPartialResults { + serializedData := serializeHelper.serializeBasePartialResult4GroupConcat(*(*basePartialResult4GroupConcat)(pr)) + chunk.AppendBytes(0, serializedData) + require.True(t, bufSizeChecker.checkBufferCapacity(serializeHelper)) + } + + // Deserialize test data + deserializeHelper := newDeserializeHelper(chunk.Column(0), testDataNum) + deserializedPartialResults := make([]basePartialResult4GroupConcat, testDataNum+1) + index := 0 + for { + success := deserializeHelper.deserializeBasePartialResult4GroupConcat(&deserializedPartialResults[index]) + if !success { + break + } + index++ + } + + chunk.Column(0).DestroyDataForTest() + + // Check some results + require.Equal(t, testDataNum, index) + for i := 0; i < testDataNum; i++ { + require.Equal(t, (*basePartialResult4GroupConcat)(serializedPartialResults[i]).valsBuf.String(), deserializedPartialResults[i].valsBuf.String()) + require.Equal(t, (*basePartialResult4GroupConcat)(serializedPartialResults[i]).buffer.String(), deserializedPartialResults[i].buffer.String()) + } +} + +func TestPartialResult4BitFunc(t *testing.T) { + serializeHelper := NewSerializeHelper() + + // Initialize test data + expectData := []partialResult4BitFunc{0, 1, 2} + serializedPartialResults := make([]PartialResult, len(expectData)) + testDataNum := len(serializedPartialResults) + for i := range serializedPartialResults { + pr := new(partialResult4BitFunc) + *pr = expectData[i] + serializedPartialResults[i] = PartialResult(pr) + } + + // Serialize test data + chunk := getChunk() + for _, pr := range serializedPartialResults { + serializedData := serializeHelper.serializePartialResult4BitFunc(*(*partialResult4BitFunc)(pr)) + chunk.AppendBytes(0, serializedData) + } + + // Deserialize test data + deserializeHelper := newDeserializeHelper(chunk.Column(0), testDataNum) + deserializedPartialResults := make([]partialResult4BitFunc, testDataNum+1) + index := 0 + for { + success := deserializeHelper.deserializePartialResult4BitFunc(&deserializedPartialResults[index]) + if !success { + break + } + index++ + } + + chunk.Column(0).DestroyDataForTest() + + // Check some results + require.Equal(t, testDataNum, index) + for i := 0; i < testDataNum; i++ { + require.Equal(t, *(*partialResult4BitFunc)(serializedPartialResults[i]), deserializedPartialResults[i]) + } +} + +func TestPartialResult4JsonArrayagg(t *testing.T) { + serializeHelper := NewSerializeHelper() + bufSizeChecker := newBufferSizeChecker() + + // Initialize test data + expectData := []partialResult4JsonArrayagg{ + {entries: []interface{}{int64(1), float64(1.1), "", true, types.Opaque{TypeCode: 1, Buf: getLargeRandBuffer()}, types.NewTime(9876, 12, 10)}}, + {entries: []interface{}{int64(1), float64(1.1), false, types.NewDuration(1, 2, 3, 4, 5), testLongStr1}}, + {entries: []interface{}{"dw啊q", float64(-1.1), int64(0), types.NewDuration(1, 2, 3, 4, 5), types.NewTime(123, 1, 2), testLongStr1, types.BinaryJSON{TypeCode: 1, Value: []byte(testLongStr2)}, types.Opaque{TypeCode: 6, Buf: getLargeRandBuffer()}}}, + } + serializedPartialResults := make([]PartialResult, len(expectData)) + testDataNum := len(serializedPartialResults) + for i := range serializedPartialResults { + pr := new(partialResult4JsonArrayagg) + *pr = expectData[i] + serializedPartialResults[i] = PartialResult(pr) + } + + // Serialize test data + chunk := getChunk() + for _, pr := range serializedPartialResults { + serializedData := serializeHelper.serializePartialResult4JsonArrayagg(*(*partialResult4JsonArrayagg)(pr)) + chunk.AppendBytes(0, serializedData) + require.True(t, bufSizeChecker.checkBufferCapacity(serializeHelper)) + } + + // Deserialize test data + deserializeHelper := newDeserializeHelper(chunk.Column(0), testDataNum) + deserializedPartialResults := make([]partialResult4JsonArrayagg, testDataNum+1) + index := 0 + for { + success := deserializeHelper.deserializePartialResult4JsonArrayagg(&deserializedPartialResults[index]) + if !success { + break + } + index++ + } + + chunk.Column(0).DestroyDataForTest() + + // Check some results + require.Equal(t, testDataNum, index) + for i := 0; i < testDataNum; i++ { + require.Equal(t, *(*partialResult4JsonArrayagg)(serializedPartialResults[i]), deserializedPartialResults[i]) + } +} + +func TestPartialResult4JsonObjectAgg(t *testing.T) { + serializeHelper := NewSerializeHelper() + bufSizeChecker := newBufferSizeChecker() + + // Initialize test data + expectData := []partialResult4JsonObjectAgg{ + {entries: map[string]interface{}{"123": int64(1), "234": float64(1.1), "999": true, "235": "123"}, bInMap: 0}, + {entries: map[string]interface{}{"啊": testLongStr1, "我": float64(1.1), "反": int64(456)}, bInMap: 0}, + {entries: map[string]interface{}{"fe": testLongStr1, " ": int64(36798), "888": false, "": testLongStr2}, bInMap: 0}, + } + serializedPartialResults := make([]PartialResult, len(expectData)) + testDataNum := len(serializedPartialResults) + for i := range serializedPartialResults { + pr := new(partialResult4JsonObjectAgg) + *pr = expectData[i] + serializedPartialResults[i] = PartialResult(pr) + } + + // Serialize test data + chunk := getChunk() + for _, pr := range serializedPartialResults { + serializedData := serializeHelper.serializePartialResult4JsonObjectAgg(*(*partialResult4JsonObjectAgg)(pr)) + chunk.AppendBytes(0, serializedData) + require.True(t, bufSizeChecker.checkBufferCapacity(serializeHelper)) + } + + // Deserialize test data + deserializeHelper := newDeserializeHelper(chunk.Column(0), testDataNum) + deserializedPartialResults := make([]partialResult4JsonObjectAgg, testDataNum+1) + index := 0 + for { + success, _ := deserializeHelper.deserializePartialResult4JsonObjectAgg(&deserializedPartialResults[index]) + if !success { + break + } + index++ + } + + chunk.Column(0).DestroyDataForTest() + + // Check some results + require.Equal(t, testDataNum, index) + for i := 0; i < testDataNum; i++ { + require.Equal(t, *(*partialResult4JsonObjectAgg)(serializedPartialResults[i]), deserializedPartialResults[i]) + } +} + +func TestPartialResult4FirstRowDecimal(t *testing.T) { + serializeHelper := NewSerializeHelper() + + // Initialize test data + expectData := []partialResult4FirstRowDecimal{ + {basePartialResult4FirstRow: basePartialResult4FirstRow{isNull: true, gotFirstRow: false}, val: *types.NewDecFromInt(0)}, + {basePartialResult4FirstRow: basePartialResult4FirstRow{isNull: false, gotFirstRow: false}, val: *types.NewDecFromInt(123)}, + {basePartialResult4FirstRow: basePartialResult4FirstRow{isNull: true, gotFirstRow: true}, val: *types.NewDecFromInt(12345)}, + } + serializedPartialResults := make([]PartialResult, len(expectData)) + testDataNum := len(serializedPartialResults) + for i := range serializedPartialResults { + pr := new(partialResult4FirstRowDecimal) + *pr = expectData[i] + serializedPartialResults[i] = PartialResult(pr) + } + + // Serialize test data + chunk := getChunk() + for _, pr := range serializedPartialResults { + serializedData := serializeHelper.serializePartialResult4FirstRowDecimal(*(*partialResult4FirstRowDecimal)(pr)) + chunk.AppendBytes(0, serializedData) + } + + // Deserialize test data + deserializeHelper := newDeserializeHelper(chunk.Column(0), testDataNum) + deserializedPartialResults := make([]partialResult4FirstRowDecimal, testDataNum+1) + index := 0 + for { + success := deserializeHelper.deserializePartialResult4FirstRowDecimal(&deserializedPartialResults[index]) + if !success { + break + } + index++ + } + + chunk.Column(0).DestroyDataForTest() + + // Check some results + require.Equal(t, testDataNum, index) + for i := 0; i < testDataNum; i++ { + require.Equal(t, *(*partialResult4FirstRowDecimal)(serializedPartialResults[i]), deserializedPartialResults[i]) + } +} + +func TestPartialResult4FirstRowInt(t *testing.T) { + serializeHelper := NewSerializeHelper() + + // Initialize test data + expectData := []partialResult4FirstRowInt{ + {basePartialResult4FirstRow: basePartialResult4FirstRow{isNull: true, gotFirstRow: false}, val: -123}, + {basePartialResult4FirstRow: basePartialResult4FirstRow{isNull: false, gotFirstRow: false}, val: 0}, + {basePartialResult4FirstRow: basePartialResult4FirstRow{isNull: true, gotFirstRow: true}, val: 123}, + } + serializedPartialResults := make([]PartialResult, len(expectData)) + testDataNum := len(serializedPartialResults) + for i := range serializedPartialResults { + pr := new(partialResult4FirstRowInt) + *pr = expectData[i] + serializedPartialResults[i] = PartialResult(pr) + } + + // Serialize test data + chunk := getChunk() + for _, pr := range serializedPartialResults { + serializedData := serializeHelper.serializePartialResult4FirstRowInt(*(*partialResult4FirstRowInt)(pr)) + chunk.AppendBytes(0, serializedData) + } + + // Deserialize test data + deserializeHelper := newDeserializeHelper(chunk.Column(0), testDataNum) + deserializedPartialResults := make([]partialResult4FirstRowInt, testDataNum+1) + index := 0 + for { + success := deserializeHelper.deserializePartialResult4FirstRowInt(&deserializedPartialResults[index]) + if !success { + break + } + index++ + } + + chunk.Column(0).DestroyDataForTest() + + // Check some results + require.Equal(t, testDataNum, index) + for i := 0; i < testDataNum; i++ { + require.Equal(t, *(*partialResult4FirstRowInt)(serializedPartialResults[i]), deserializedPartialResults[i]) + } +} + +func TestPartialResult4FirstRowTime(t *testing.T) { + serializeHelper := NewSerializeHelper() + + // Initialize test data + expectData := []partialResult4FirstRowTime{ + {basePartialResult4FirstRow: basePartialResult4FirstRow{isNull: true, gotFirstRow: false}, val: types.NewTime(0, 0, 1)}, + {basePartialResult4FirstRow: basePartialResult4FirstRow{isNull: false, gotFirstRow: false}, val: types.NewTime(123, 0, 1)}, + {basePartialResult4FirstRow: basePartialResult4FirstRow{isNull: true, gotFirstRow: true}, val: types.NewTime(456, 0, 1)}, + } + serializedPartialResults := make([]PartialResult, len(expectData)) + testDataNum := len(serializedPartialResults) + for i := range serializedPartialResults { + pr := new(partialResult4FirstRowTime) + *pr = expectData[i] + serializedPartialResults[i] = PartialResult(pr) + } + + // Serialize test data + chunk := getChunk() + for _, pr := range serializedPartialResults { + serializedData := serializeHelper.serializePartialResult4FirstRowTime(*(*partialResult4FirstRowTime)(pr)) + chunk.AppendBytes(0, serializedData) + } + + // Deserialize test data + deserializeHelper := newDeserializeHelper(chunk.Column(0), testDataNum) + deserializedPartialResults := make([]partialResult4FirstRowTime, testDataNum+1) + index := 0 + for { + success := deserializeHelper.deserializePartialResult4FirstRowTime(&deserializedPartialResults[index]) + if !success { + break + } + index++ + } + + chunk.Column(0).DestroyDataForTest() + + // Check some results + require.Equal(t, testDataNum, index) + for i := 0; i < testDataNum; i++ { + require.Equal(t, *(*partialResult4FirstRowTime)(serializedPartialResults[i]), deserializedPartialResults[i]) + } +} + +func TestPartialResult4FirstRowString(t *testing.T) { + serializeHelper := NewSerializeHelper() + bufSizeChecker := newBufferSizeChecker() + + // Initialize test data + expectData := []partialResult4FirstRowString{ + {basePartialResult4FirstRow: basePartialResult4FirstRow{isNull: true, gotFirstRow: false}, val: ""}, + {basePartialResult4FirstRow: basePartialResult4FirstRow{isNull: false, gotFirstRow: false}, val: testLongStr1}, + } + serializedPartialResults := make([]PartialResult, len(expectData)) + testDataNum := len(serializedPartialResults) + for i := range serializedPartialResults { + pr := new(partialResult4FirstRowString) + *pr = expectData[i] + serializedPartialResults[i] = PartialResult(pr) + } + + // Serialize test data + chunk := getChunk() + for _, pr := range serializedPartialResults { + serializedData := serializeHelper.serializePartialResult4FirstRowString(*(*partialResult4FirstRowString)(pr)) + chunk.AppendBytes(0, serializedData) + require.True(t, bufSizeChecker.checkBufferCapacity(serializeHelper)) + } + + // Deserialize test data + deserializeHelper := newDeserializeHelper(chunk.Column(0), testDataNum) + deserializedPartialResults := make([]partialResult4FirstRowString, testDataNum+1) + index := 0 + for { + success := deserializeHelper.deserializePartialResult4FirstRowString(&deserializedPartialResults[index]) + if !success { + break + } + index++ + } + + chunk.Column(0).DestroyDataForTest() + + // Check some results + require.Equal(t, testDataNum, index) + for i := 0; i < testDataNum; i++ { + require.Equal(t, *(*partialResult4FirstRowString)(serializedPartialResults[i]), deserializedPartialResults[i]) + } +} + +func TestPartialResult4FirstRowFloat32(t *testing.T) { + serializeHelper := NewSerializeHelper() + + // Initialize test data + expectData := []partialResult4FirstRowFloat32{ + {basePartialResult4FirstRow: basePartialResult4FirstRow{isNull: true, gotFirstRow: false}, val: -1.1}, + {basePartialResult4FirstRow: basePartialResult4FirstRow{isNull: false, gotFirstRow: false}, val: 0}, + {basePartialResult4FirstRow: basePartialResult4FirstRow{isNull: true, gotFirstRow: true}, val: 1.1}, + } + serializedPartialResults := make([]PartialResult, len(expectData)) + testDataNum := len(serializedPartialResults) + for i := range serializedPartialResults { + pr := new(partialResult4FirstRowFloat32) + *pr = expectData[i] + serializedPartialResults[i] = PartialResult(pr) + } + + // Serialize test data + chunk := getChunk() + for _, pr := range serializedPartialResults { + serializedData := serializeHelper.serializePartialResult4FirstRowFloat32(*(*partialResult4FirstRowFloat32)(pr)) + chunk.AppendBytes(0, serializedData) + } + + // Deserialize test data + deserializeHelper := newDeserializeHelper(chunk.Column(0), testDataNum) + deserializedPartialResults := make([]partialResult4FirstRowFloat32, testDataNum+1) + index := 0 + for { + success := deserializeHelper.deserializePartialResult4FirstRowFloat32(&deserializedPartialResults[index]) + if !success { + break + } + index++ + } + + chunk.Column(0).DestroyDataForTest() + + // Check some results + require.Equal(t, testDataNum, index) + for i := 0; i < testDataNum; i++ { + require.Equal(t, *(*partialResult4FirstRowFloat32)(serializedPartialResults[i]), deserializedPartialResults[i]) + } +} + +func TestPartialResult4FirstRowFloat64(t *testing.T) { + serializeHelper := NewSerializeHelper() + + // Initialize test data + expectData := []partialResult4FirstRowFloat64{ + {basePartialResult4FirstRow: basePartialResult4FirstRow{isNull: true, gotFirstRow: false}, val: -1.1}, + {basePartialResult4FirstRow: basePartialResult4FirstRow{isNull: false, gotFirstRow: false}, val: 0}, + {basePartialResult4FirstRow: basePartialResult4FirstRow{isNull: true, gotFirstRow: true}, val: 1.1}, + } + serializedPartialResults := make([]PartialResult, len(expectData)) + testDataNum := len(serializedPartialResults) + for i := range serializedPartialResults { + pr := new(partialResult4FirstRowFloat64) + *pr = expectData[i] + serializedPartialResults[i] = PartialResult(pr) + } + + // Serialize test data + chunk := getChunk() + for _, pr := range serializedPartialResults { + serializedData := serializeHelper.serializePartialResult4FirstRowFloat64(*(*partialResult4FirstRowFloat64)(pr)) + chunk.AppendBytes(0, serializedData) + } + + // Deserialize test data + deserializeHelper := newDeserializeHelper(chunk.Column(0), testDataNum) + deserializedPartialResults := make([]partialResult4FirstRowFloat64, testDataNum+1) + index := 0 + for { + success := deserializeHelper.deserializePartialResult4FirstRowFloat64(&deserializedPartialResults[index]) + if !success { + break + } + index++ + } + + chunk.Column(0).DestroyDataForTest() + + // Check some results + require.Equal(t, testDataNum, index) + for i := 0; i < testDataNum; i++ { + require.Equal(t, *(*partialResult4FirstRowFloat64)(serializedPartialResults[i]), deserializedPartialResults[i]) + } +} + +func TestPartialResult4FirstRowDuration(t *testing.T) { + serializeHelper := NewSerializeHelper() + + // Initialize test data + expectData := []partialResult4FirstRowDuration{ + {basePartialResult4FirstRow: basePartialResult4FirstRow{isNull: true, gotFirstRow: false}, val: types.NewDuration(1, 2, 3, 4, 5)}, + {basePartialResult4FirstRow: basePartialResult4FirstRow{isNull: false, gotFirstRow: false}, val: types.NewDuration(0, 0, 0, 0, 0)}, + {basePartialResult4FirstRow: basePartialResult4FirstRow{isNull: true, gotFirstRow: true}, val: types.NewDuration(10, 20, 30, 40, 50)}, + } + serializedPartialResults := make([]PartialResult, len(expectData)) + testDataNum := len(serializedPartialResults) + for i := range serializedPartialResults { + pr := new(partialResult4FirstRowDuration) + *pr = expectData[i] + serializedPartialResults[i] = PartialResult(pr) + } + + // Serialize test data + chunk := getChunk() + for _, pr := range serializedPartialResults { + serializedData := serializeHelper.serializePartialResult4FirstRowDuration(*(*partialResult4FirstRowDuration)(pr)) + chunk.AppendBytes(0, serializedData) + } + + // Deserialize test data + deserializeHelper := newDeserializeHelper(chunk.Column(0), testDataNum) + deserializedPartialResults := make([]partialResult4FirstRowDuration, testDataNum+1) + index := 0 + for { + success := deserializeHelper.deserializePartialResult4FirstRowDuration(&deserializedPartialResults[index]) + if !success { + break + } + index++ + } + + chunk.Column(0).DestroyDataForTest() + + // Check some results + require.Equal(t, testDataNum, index) + for i := 0; i < testDataNum; i++ { + require.Equal(t, *(*partialResult4FirstRowDuration)(serializedPartialResults[i]), deserializedPartialResults[i]) + } +} + +func TestPartialResult4FirstRowJSON(t *testing.T) { + serializeHelper := NewSerializeHelper() + bufSizeChecker := newBufferSizeChecker() + + // Initialize test data + expectData := []partialResult4FirstRowJSON{ + {basePartialResult4FirstRow: basePartialResult4FirstRow{isNull: false, gotFirstRow: false}, val: types.BinaryJSON{TypeCode: 6, Value: []byte{}}}, + {basePartialResult4FirstRow: basePartialResult4FirstRow{isNull: true, gotFirstRow: false}, val: types.BinaryJSON{TypeCode: 8, Value: getLargeRandBuffer()}}, + } + serializedPartialResults := make([]PartialResult, len(expectData)) + testDataNum := len(serializedPartialResults) + for i := range serializedPartialResults { + pr := new(partialResult4FirstRowJSON) + *pr = expectData[i] + serializedPartialResults[i] = PartialResult(pr) + } + + // Serialize test data + chunk := getChunk() + for _, pr := range serializedPartialResults { + serializedData := serializeHelper.serializePartialResult4FirstRowJSON(*(*partialResult4FirstRowJSON)(pr)) + chunk.AppendBytes(0, serializedData) + require.True(t, bufSizeChecker.checkBufferCapacity(serializeHelper)) + } + + // Deserialize test data + deserializeHelper := newDeserializeHelper(chunk.Column(0), testDataNum) + deserializedPartialResults := make([]partialResult4FirstRowJSON, testDataNum+1) + index := 0 + for { + success := deserializeHelper.deserializePartialResult4FirstRowJSON(&deserializedPartialResults[index]) + if !success { + break + } + index++ + } + + chunk.Column(0).DestroyDataForTest() + + // Check some results + require.Equal(t, testDataNum, index) + for i := 0; i < testDataNum; i++ { + require.Equal(t, *(*partialResult4FirstRowJSON)(serializedPartialResults[i]), deserializedPartialResults[i]) + } +} + +func TestPartialResult4FirstRowEnum(t *testing.T) { + serializeHelper := NewSerializeHelper() + bufSizeChecker := newBufferSizeChecker() + + // Initialize test data + expectData := []partialResult4FirstRowEnum{ + {basePartialResult4FirstRow: basePartialResult4FirstRow{isNull: true, gotFirstRow: false}, val: types.Enum{Name: string(""), Value: 123}}, + {basePartialResult4FirstRow: basePartialResult4FirstRow{isNull: true, gotFirstRow: false}, val: types.Enum{Name: testLongStr2, Value: 999}}, + } + serializedPartialResults := make([]PartialResult, len(expectData)) + testDataNum := len(serializedPartialResults) + for i := range serializedPartialResults { + pr := new(partialResult4FirstRowEnum) + *pr = expectData[i] + serializedPartialResults[i] = PartialResult(pr) + } + + // Serialize test data + chunk := getChunk() + for _, pr := range serializedPartialResults { + serializedData := serializeHelper.serializePartialResult4FirstRowEnum(*(*partialResult4FirstRowEnum)(pr)) + chunk.AppendBytes(0, serializedData) + require.True(t, bufSizeChecker.checkBufferCapacity(serializeHelper)) + } + + // Deserialize test data + deserializeHelper := newDeserializeHelper(chunk.Column(0), testDataNum) + deserializedPartialResults := make([]partialResult4FirstRowEnum, testDataNum+1) + index := 0 + for { + success := deserializeHelper.deserializePartialResult4FirstRowEnum(&deserializedPartialResults[index]) + if !success { + break + } + index++ + } + + chunk.Column(0).DestroyDataForTest() + + // Check some results + require.Equal(t, testDataNum, index) + for i := 0; i < testDataNum; i++ { + require.Equal(t, *(*partialResult4FirstRowEnum)(serializedPartialResults[i]), deserializedPartialResults[i]) + } +} + +func TestPartialResult4FirstRowSet(t *testing.T) { + serializeHelper := NewSerializeHelper() + bufSizeChecker := newBufferSizeChecker() + + // Initialize test data + expectData := []partialResult4FirstRowSet{ + {basePartialResult4FirstRow: basePartialResult4FirstRow{isNull: true, gotFirstRow: false}, val: types.Set{Name: string(""), Value: 123}}, + {basePartialResult4FirstRow: basePartialResult4FirstRow{isNull: true, gotFirstRow: false}, val: types.Set{Name: testLongStr1, Value: 999}}, + } + serializedPartialResults := make([]PartialResult, len(expectData)) + testDataNum := len(serializedPartialResults) + for i := range serializedPartialResults { + pr := new(partialResult4FirstRowSet) + *pr = expectData[i] + serializedPartialResults[i] = PartialResult(pr) + } + + // Serialize test data + chunk := getChunk() + for _, pr := range serializedPartialResults { + serializedData := serializeHelper.serializePartialResult4FirstRowSet(*(*partialResult4FirstRowSet)(pr)) + chunk.AppendBytes(0, serializedData) + require.True(t, bufSizeChecker.checkBufferCapacity(serializeHelper)) + } + + // Deserialize test data + deserializeHelper := newDeserializeHelper(chunk.Column(0), testDataNum) + deserializedPartialResults := make([]partialResult4FirstRowSet, testDataNum+1) + index := 0 + for { + success := deserializeHelper.deserializePartialResult4FirstRowSet(&deserializedPartialResults[index]) + if !success { + break + } + index++ + } + + chunk.Column(0).DestroyDataForTest() + + // Check some results + require.Equal(t, testDataNum, index) + for i := 0; i < testDataNum; i++ { + require.Equal(t, *(*partialResult4FirstRowSet)(serializedPartialResults[i]), deserializedPartialResults[i]) + } +} diff --git a/pkg/executor/aggfuncs/spill_serialize_helper.go b/pkg/executor/aggfuncs/spill_serialize_helper.go new file mode 100644 index 0000000000000..7a5aef465b80c --- /dev/null +++ b/pkg/executor/aggfuncs/spill_serialize_helper.go @@ -0,0 +1,226 @@ +// Copyright 2023 PingCAP, 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. + +package aggfuncs + +import ( + util "github.com/pingcap/tidb/pkg/util/serialization" +) + +// SerializeHelper is the helper for serializing agg function meta data. +type SerializeHelper struct { + buf []byte +} + +// NewSerializeHelper creates a new SerializeHelper +func NewSerializeHelper() *SerializeHelper { + return &SerializeHelper{ + buf: make([]byte, 0, 64), + } +} + +func (s *SerializeHelper) serializePartialResult4Count(value partialResult4Count) []byte { + s.buf = s.buf[:0] + return util.SerializeInt64(value, s.buf) +} + +func (s *SerializeHelper) serializePartialResult4MaxMinInt(value partialResult4MaxMinInt) []byte { + s.buf = s.buf[:0] + s.buf = util.SerializeBool(value.isNull, s.buf) + return util.SerializeInt64(value.val, s.buf) +} + +func (s *SerializeHelper) serializePartialResult4MaxMinUint(value partialResult4MaxMinUint) []byte { + s.buf = s.buf[:0] + s.buf = util.SerializeBool(value.isNull, s.buf) + return util.SerializeUint64(value.val, s.buf) +} + +func (s *SerializeHelper) serializePartialResult4MaxMinDecimal(value partialResult4MaxMinDecimal) []byte { + s.buf = s.buf[:0] + s.buf = util.SerializeBool(value.isNull, s.buf) + return util.SerializeMyDecimal(&value.val, s.buf) +} + +func (s *SerializeHelper) serializePartialResult4MaxMinFloat32(value partialResult4MaxMinFloat32) []byte { + s.buf = s.buf[:0] + s.buf = util.SerializeBool(value.isNull, s.buf) + return util.SerializeFloat32(value.val, s.buf) +} + +func (s *SerializeHelper) serializePartialResult4MaxMinFloat64(value partialResult4MaxMinFloat64) []byte { + s.buf = s.buf[:0] + s.buf = util.SerializeBool(value.isNull, s.buf) + return util.SerializeFloat64(value.val, s.buf) +} + +func (s *SerializeHelper) serializePartialResult4MaxMinTime(value partialResult4MaxMinTime) []byte { + s.buf = s.buf[:0] + s.buf = util.SerializeBool(value.isNull, s.buf) + return util.SerializeTime(value.val, s.buf) +} + +func (s *SerializeHelper) serializePartialResult4MaxMinDuration(value partialResult4MaxMinDuration) []byte { + s.buf = s.buf[:0] + s.buf = util.SerializeBool(value.isNull, s.buf) + return util.SerializeTypesDuration(value.val, s.buf) +} + +func (s *SerializeHelper) serializePartialResult4MaxMinString(value partialResult4MaxMinString) []byte { + s.buf = s.buf[:0] + s.buf = util.SerializeBool(value.isNull, s.buf) + s.buf = util.SerializeString(value.val, s.buf) + return s.buf +} + +func (s *SerializeHelper) serializePartialResult4MaxMinJSON(value partialResult4MaxMinJSON) []byte { + s.buf = s.buf[:0] + s.buf = util.SerializeBool(value.isNull, s.buf) + s.buf = util.SerializeBinaryJSON(&value.val, s.buf) + return s.buf +} + +func (s *SerializeHelper) serializePartialResult4MaxMinEnum(value partialResult4MaxMinEnum) []byte { + s.buf = s.buf[:0] + s.buf = util.SerializeBool(value.isNull, s.buf) + s.buf = util.SerializeEnum(&value.val, s.buf) + return s.buf +} + +func (s *SerializeHelper) serializePartialResult4MaxMinSet(value partialResult4MaxMinSet) []byte { + s.buf = s.buf[:0] + s.buf = util.SerializeBool(value.isNull, s.buf) + s.buf = util.SerializeSet(&value.val, s.buf) + return s.buf +} + +func (s *SerializeHelper) serializePartialResult4AvgDecimal(value partialResult4AvgDecimal) []byte { + s.buf = s.buf[:0] + s.buf = util.SerializeMyDecimal(&value.sum, s.buf) + return util.SerializeInt64(value.count, s.buf) +} + +func (s *SerializeHelper) serializePartialResult4AvgFloat64(value partialResult4AvgFloat64) []byte { + s.buf = s.buf[:0] + s.buf = util.SerializeFloat64(value.sum, s.buf) + return util.SerializeInt64(value.count, s.buf) +} + +func (s *SerializeHelper) serializePartialResult4SumDecimal(value partialResult4SumDecimal) []byte { + s.buf = s.buf[:0] + s.buf = util.SerializeMyDecimal(&value.val, s.buf) + return util.SerializeInt64(value.notNullRowCount, s.buf) +} + +func (s *SerializeHelper) serializePartialResult4SumFloat64(value partialResult4SumFloat64) []byte { + s.buf = s.buf[:0] + s.buf = util.SerializeFloat64(value.val, s.buf) + return util.SerializeInt64(value.notNullRowCount, s.buf) +} + +func (s *SerializeHelper) serializeBasePartialResult4GroupConcat(value basePartialResult4GroupConcat) []byte { + s.buf = s.buf[:0] + s.buf = util.SerializeBytesBuffer(value.valsBuf, s.buf) + s.buf = util.SerializeBytesBuffer(value.buffer, s.buf) + return s.buf +} + +func (s *SerializeHelper) serializePartialResult4GroupConcat(value partialResult4GroupConcat) []byte { + return s.serializeBasePartialResult4GroupConcat(basePartialResult4GroupConcat{ + valsBuf: value.valsBuf, + buffer: value.buffer, + }) +} + +func (s *SerializeHelper) serializePartialResult4BitFunc(value partialResult4BitFunc) []byte { + return util.SerializeUint64(value, s.buf[:0]) +} + +func (s *SerializeHelper) serializePartialResult4JsonArrayagg(value partialResult4JsonArrayagg) []byte { + s.buf = s.buf[:0] + for _, value := range value.entries { + s.buf = util.SerializeInterface(value, s.buf) + } + return s.buf +} + +func (s *SerializeHelper) serializePartialResult4JsonObjectAgg(value partialResult4JsonObjectAgg) []byte { + s.buf = s.buf[:0] + for key, value := range value.entries { + s.buf = util.SerializeString(key, s.buf) + s.buf = util.SerializeInterface(value, s.buf) + } + return s.buf +} + +func (s *SerializeHelper) serializeBasePartialResult4FirstRow(value basePartialResult4FirstRow) []byte { + s.buf = s.buf[:0] + s.buf = util.SerializeBool(value.isNull, s.buf) + return util.SerializeBool(value.gotFirstRow, s.buf) +} + +func (s *SerializeHelper) serializePartialResult4FirstRowDecimal(value partialResult4FirstRowDecimal) []byte { + s.buf = s.serializeBasePartialResult4FirstRow(value.basePartialResult4FirstRow) + return util.SerializeMyDecimal(&value.val, s.buf) +} + +func (s *SerializeHelper) serializePartialResult4FirstRowInt(value partialResult4FirstRowInt) []byte { + s.buf = s.serializeBasePartialResult4FirstRow(value.basePartialResult4FirstRow) + return util.SerializeInt64(value.val, s.buf) +} + +func (s *SerializeHelper) serializePartialResult4FirstRowTime(value partialResult4FirstRowTime) []byte { + s.buf = s.serializeBasePartialResult4FirstRow(value.basePartialResult4FirstRow) + return util.SerializeTime(value.val, s.buf) +} + +func (s *SerializeHelper) serializePartialResult4FirstRowString(value partialResult4FirstRowString) []byte { + s.buf = s.serializeBasePartialResult4FirstRow(value.basePartialResult4FirstRow) + s.buf = util.SerializeString(value.val, s.buf) + return s.buf +} + +func (s *SerializeHelper) serializePartialResult4FirstRowFloat32(value partialResult4FirstRowFloat32) []byte { + s.buf = s.serializeBasePartialResult4FirstRow(value.basePartialResult4FirstRow) + return util.SerializeFloat32(value.val, s.buf) +} + +func (s *SerializeHelper) serializePartialResult4FirstRowFloat64(value partialResult4FirstRowFloat64) []byte { + s.buf = s.serializeBasePartialResult4FirstRow(value.basePartialResult4FirstRow) + return util.SerializeFloat64(value.val, s.buf) +} + +func (s *SerializeHelper) serializePartialResult4FirstRowDuration(value partialResult4FirstRowDuration) []byte { + s.buf = s.serializeBasePartialResult4FirstRow(value.basePartialResult4FirstRow) + s.buf = util.SerializeInt64(int64(value.val.Duration), s.buf) + return util.SerializeInt(value.val.Fsp, s.buf) +} + +func (s *SerializeHelper) serializePartialResult4FirstRowJSON(value partialResult4FirstRowJSON) []byte { + s.buf = s.serializeBasePartialResult4FirstRow(value.basePartialResult4FirstRow) + s.buf = util.SerializeBinaryJSON(&value.val, s.buf) + return s.buf +} + +func (s *SerializeHelper) serializePartialResult4FirstRowEnum(value partialResult4FirstRowEnum) []byte { + s.buf = s.serializeBasePartialResult4FirstRow(value.basePartialResult4FirstRow) + s.buf = util.SerializeEnum(&value.val, s.buf) + return s.buf +} + +func (s *SerializeHelper) serializePartialResult4FirstRowSet(value partialResult4FirstRowSet) []byte { + s.buf = s.serializeBasePartialResult4FirstRow(value.basePartialResult4FirstRow) + s.buf = util.SerializeSet(&value.val, s.buf) + return s.buf +} diff --git a/pkg/executor/aggregate/agg_hash_base_worker.go b/pkg/executor/aggregate/agg_hash_base_worker.go index b2ed73cd06f0a..e5551a9d450f7 100644 --- a/pkg/executor/aggregate/agg_hash_base_worker.go +++ b/pkg/executor/aggregate/agg_hash_base_worker.go @@ -23,9 +23,6 @@ import ( "github.com/pingcap/tidb/pkg/util/memory" ) -// AggPartialResultMapper contains aggregate function results -type AggPartialResultMapper map[string][]aggfuncs.PartialResult - // baseHashAggWorker stores the common attributes of HashAggFinalWorker and HashAggPartialWorker. // nolint:structcheck type baseHashAggWorker struct { @@ -52,7 +49,7 @@ func newBaseHashAggWorker(ctx sessionctx.Context, finishCh <-chan struct{}, aggF return baseWorker } -func (w *baseHashAggWorker) getPartialResult(_ *stmtctx.StatementContext, groupKey [][]byte, mapper AggPartialResultMapper) [][]aggfuncs.PartialResult { +func (w *baseHashAggWorker) getPartialResult(_ *stmtctx.StatementContext, groupKey [][]byte, mapper aggfuncs.AggPartialResultMapper) [][]aggfuncs.PartialResult { n := len(groupKey) partialResults := make([][]aggfuncs.PartialResult, n) allMemDelta := int64(0) diff --git a/pkg/executor/aggregate/agg_hash_executor.go b/pkg/executor/aggregate/agg_hash_executor.go index a3bc512ece2fb..8608890c8f415 100644 --- a/pkg/executor/aggregate/agg_hash_executor.go +++ b/pkg/executor/aggregate/agg_hash_executor.go @@ -94,7 +94,7 @@ type HashAggExec struct { Sc *stmtctx.StatementContext PartialAggFuncs []aggfuncs.AggFunc FinalAggFuncs []aggfuncs.AggFunc - partialResultMap AggPartialResultMapper + partialResultMap aggfuncs.AggPartialResultMapper bInMap int64 // indicate there are 2^bInMap buckets in partialResultMap groupSet set.StringSetWithMemoryUsage groupKeys []string @@ -104,7 +104,7 @@ type HashAggExec struct { finishCh chan struct{} finalOutputCh chan *AfFinalResult - partialOutputChs []chan *AggPartialResultMapper + partialOutputChs []chan *aggfuncs.AggPartialResultMapper inputCh chan *HashAggInput partialInputChs []chan *chunk.Chunk partialWorkers []HashAggPartialWorker @@ -126,9 +126,9 @@ type HashAggExec struct { stats *HashAggRuntimeStats - // listInDisk is the chunks to store row values for spilled data. + // dataInDisk is the chunks to store row values for spilled data. // The HashAggExec may be set to `spill mode` multiple times, and all spilled data will be appended to DataInDiskByRows. - listInDisk *chunk.DataInDiskByRows + dataInDisk *chunk.DataInDiskByChunks // numOfSpilledChks indicates the number of all the spilled chunks. numOfSpilledChks int // offsetOfSpilledChks indicates the offset of the chunk be read from the disk. @@ -152,21 +152,21 @@ func (e *HashAggExec) Close() error { defer e.Ctx().GetSessionVars().StmtCtx.RuntimeStatsColl.RegisterStats(e.ID(), e.stats) } if e.IsUnparallelExec { - var firstErr error e.childResult = nil e.groupSet, _ = set.NewStringSetWithMemoryUsage() e.partialResultMap = nil if e.memTracker != nil { e.memTracker.ReplaceBytesUsed(0) } - if e.listInDisk != nil { - firstErr = e.listInDisk.Close() + if e.dataInDisk != nil { + e.dataInDisk.Close() } e.spillAction, e.tmpChkForSpill = nil, nil - if err := e.BaseExecutor.Close(); firstErr == nil { - firstErr = err + err := e.BaseExecutor.Close() + if err != nil { + return err } - return firstErr + return nil } if e.parallelExecValid { // `Close` may be called after `Open` without calling `Next` in test. @@ -230,7 +230,7 @@ func (e *HashAggExec) Open(ctx context.Context) error { func (e *HashAggExec) initForUnparallelExec() { var setSize int64 e.groupSet, setSize = set.NewStringSetWithMemoryUsage() - e.partialResultMap = make(AggPartialResultMapper) + e.partialResultMap = make(aggfuncs.AggPartialResultMapper) e.bInMap = 0 failpoint.Inject("ConsumeRandomPanic", nil) e.memTracker.Consume(hack.DefBucketMemoryUsageForMapStrToSlice*(1< 0 && err == nil { - err = e.listInDisk.Add(e.tmpChkForSpill) + err = e.dataInDisk.Add(e.tmpChkForSpill) e.tmpChkForSpill.Reset() } }() @@ -633,12 +633,12 @@ func (e *HashAggExec) execute(ctx context.Context) (err error) { func (e *HashAggExec) spillUnprocessedData(isFullChk bool) (err error) { if isFullChk { - return e.listInDisk.Add(e.childResult) + return e.dataInDisk.Add(e.childResult) } for i := 0; i < e.childResult.NumRows(); i++ { e.tmpChkForSpill.AppendRow(e.childResult.GetRow(i)) if e.tmpChkForSpill.IsFull() { - err = e.listInDisk.Add(e.tmpChkForSpill) + err = e.dataInDisk.Add(e.tmpChkForSpill) if err != nil { return err } @@ -660,7 +660,7 @@ func (e *HashAggExec) getNextChunk(ctx context.Context) (err error) { e.isChildDrained = true } if e.offsetOfSpilledChks < e.numOfSpilledChks { - e.childResult, err = e.listInDisk.GetChunk(e.offsetOfSpilledChks) + e.childResult, err = e.dataInDisk.GetChunk(e.offsetOfSpilledChks) if err != nil { return err } diff --git a/pkg/executor/aggregate/agg_hash_final_worker.go b/pkg/executor/aggregate/agg_hash_final_worker.go index ab139f491508a..cb9a10ec005c6 100644 --- a/pkg/executor/aggregate/agg_hash_final_worker.go +++ b/pkg/executor/aggregate/agg_hash_final_worker.go @@ -19,6 +19,7 @@ import ( "time" "github.com/pingcap/failpoint" + "github.com/pingcap/tidb/pkg/executor/aggfuncs" "github.com/pingcap/tidb/pkg/sessionctx" "github.com/pingcap/tidb/pkg/types" "github.com/pingcap/tidb/pkg/util/chunk" @@ -42,17 +43,17 @@ type HashAggFinalWorker struct { rowBuffer []types.Datum mutableRow chunk.MutRow - partialResultMap AggPartialResultMapper + partialResultMap aggfuncs.AggPartialResultMapper BInMap int isFirstInput bool groupSet set.StringSetWithMemoryUsage - inputCh chan *AggPartialResultMapper + inputCh chan *aggfuncs.AggPartialResultMapper outputCh chan *AfFinalResult finalResultHolderCh chan *chunk.Chunk groupKeys [][]byte } -func (w *HashAggFinalWorker) getPartialInput() (input *AggPartialResultMapper, ok bool) { +func (w *HashAggFinalWorker) getPartialInput() (input *aggfuncs.AggPartialResultMapper, ok bool) { select { case <-w.finishCh: return nil, false diff --git a/pkg/executor/aggregate/agg_hash_partial_worker.go b/pkg/executor/aggregate/agg_hash_partial_worker.go index d41300bd2d2ac..9078d933059f5 100644 --- a/pkg/executor/aggregate/agg_hash_partial_worker.go +++ b/pkg/executor/aggregate/agg_hash_partial_worker.go @@ -33,7 +33,7 @@ type HashAggPartialWorker struct { baseHashAggWorker inputCh chan *chunk.Chunk - outputChs []chan *AggPartialResultMapper + outputChs []chan *aggfuncs.AggPartialResultMapper globalOutputCh chan *AfFinalResult giveBackCh chan<- *HashAggInput BInMaps []int @@ -42,7 +42,7 @@ type HashAggPartialWorker struct { partialResultNumInRow int // Length of this map is equal to the number of final workers - partialResultsMap []AggPartialResultMapper + partialResultsMap []aggfuncs.AggPartialResultMapper groupByItems []expression.Expression groupKey [][]byte // chk stores the input data from child, diff --git a/pkg/executor/analyze.go b/pkg/executor/analyze.go index ebaf7bfc3aa15..e6db425dae8a3 100644 --- a/pkg/executor/analyze.go +++ b/pkg/executor/analyze.go @@ -292,7 +292,7 @@ func warnLockedTableMsg(sessionVars *variable.SessionVars, needAnalyzeTableCnt u } else { msg = "skip analyze locked table: %s" } - sessionVars.StmtCtx.AppendWarning(errors.Errorf(msg, tables)) + sessionVars.StmtCtx.AppendWarning(errors.NewNoStackErrorf(msg, tables)) } } @@ -334,9 +334,9 @@ func (e *AnalyzeExec) saveV2AnalyzeOpts() error { topn = int64(val) } colChoice := opts.ColChoice.String() - colIDs := make([]string, len(opts.ColumnList)) - for i, colInfo := range opts.ColumnList { - colIDs[i] = strconv.FormatInt(colInfo.ID, 10) + colIDs := make([]string, 0, len(opts.ColumnList)) + for _, colInfo := range opts.ColumnList { + colIDs = append(colIDs, strconv.FormatInt(colInfo.ID, 10)) } colIDStrs := strings.Join(colIDs, ",") sqlescape.MustFormatSQL(sql, "(%?,%?,%?,%?,%?,%?,%?)", opts.PhyTableID, sampleNum, sampleRate, buckets, topn, colChoice, colIDStrs) diff --git a/pkg/executor/analyze_col.go b/pkg/executor/analyze_col.go index 3d592e1506bb8..99f9af2b44c76 100644 --- a/pkg/executor/analyze_col.go +++ b/pkg/executor/analyze_col.go @@ -122,7 +122,7 @@ func (e *AnalyzeColumnsExec) buildResp(ranges []*ranger.Range) (distsql.SelectRe SetKeepOrder(true). SetConcurrency(e.concurrency). SetMemTracker(e.memTracker). - SetResourceGroupName(e.ctx.GetSessionVars().ResourceGroupName). + SetResourceGroupName(e.ctx.GetSessionVars().StmtCtx.ResourceGroupName). SetExplicitRequestSourceType(e.ctx.GetSessionVars().ExplicitRequestSourceType). Build() if err != nil { @@ -249,15 +249,15 @@ func (e *AnalyzeColumnsExec) buildStats(ranges []*ranger.Range, needExtStats boo topNs = append(topNs, collectors[i].TopN) } for j, s := range collectors[i].Samples { - collectors[i].Samples[j].Ordinal = j - collectors[i].Samples[j].Value, err = tablecodec.DecodeColumnValue(s.Value.GetBytes(), &col.FieldType, timeZone) + s.Ordinal = j + s.Value, err = tablecodec.DecodeColumnValue(s.Value.GetBytes(), &col.FieldType, timeZone) if err != nil { return nil, nil, nil, nil, nil, err } // When collation is enabled, we store the Key representation of the sampling data. So we set it to kind `Bytes` here // to avoid to convert it to its Key representation once more. - if collectors[i].Samples[j].Value.Kind() == types.KindString { - collectors[i].Samples[j].Value.SetBytes(collectors[i].Samples[j].Value.GetBytes()) + if s.Value.Kind() == types.KindString { + s.Value.SetBytes(s.Value.GetBytes()) } } var hg *statistics.Histogram @@ -266,7 +266,7 @@ func (e *AnalyzeColumnsExec) buildStats(ranges []*ranger.Range, needExtStats boo if e.StatsVersion < 2 { hg, err = statistics.BuildColumn(e.ctx, int64(e.opts[ast.AnalyzeOptNumBuckets]), col.ID, collectors[i], &col.FieldType) } else { - hg, topn, err = statistics.BuildHistAndTopN(e.ctx, int(e.opts[ast.AnalyzeOptNumBuckets]), int(e.opts[ast.AnalyzeOptNumTopN]), col.ID, collectors[i], &col.FieldType, true, nil) + hg, topn, err = statistics.BuildHistAndTopN(e.ctx, int(e.opts[ast.AnalyzeOptNumBuckets]), int(e.opts[ast.AnalyzeOptNumTopN]), col.ID, collectors[i], &col.FieldType, true, nil, true) topNs = append(topNs, topn) } if err != nil { diff --git a/pkg/executor/analyze_col_v2.go b/pkg/executor/analyze_col_v2.go index f2a66118628a9..c734a9be9c32f 100644 --- a/pkg/executor/analyze_col_v2.go +++ b/pkg/executor/analyze_col_v2.go @@ -18,7 +18,7 @@ import ( "context" stderrors "errors" "math" - "sort" + "slices" "time" "github.com/pingcap/errors" @@ -200,11 +200,11 @@ func (e *AnalyzeColumnsExecV2) decodeSampleDataWithVirtualColumn( chk := chunk.NewChunkWithCapacity(totFts, len(collector.Base().Samples)) decoder := codec.NewDecoder(chk, e.ctx.GetSessionVars().Location()) for _, sample := range collector.Base().Samples { - for i := range sample.Columns { + for i, columns := range sample.Columns { if schema.Columns[i].VirtualExpr != nil { continue } - _, err := decoder.DecodeOne(sample.Columns[i].GetBytes(), i, e.schemaForVirtualColEval.Columns[i].RetType) + _, err := decoder.DecodeOne(columns.GetBytes(), i, e.schemaForVirtualColEval.Columns[i].RetType) if err != nil { return err } @@ -378,8 +378,8 @@ func (e *AnalyzeColumnsExecV2) buildSamplingStats( colLen := len(e.colsInfo) // The order of the samples are broken when merging samples from sub-collectors. // So now we need to sort the samples according to the handle in order to calculate correlation. - sort.Slice(rootRowCollector.Base().Samples, func(i, j int) bool { - return rootRowCollector.Base().Samples[i].Handle.Compare(rootRowCollector.Base().Samples[j].Handle) < 0 + slices.SortFunc(rootRowCollector.Base().Samples, func(i, j *statistics.ReservoirRowSampleItem) int { + return i.Handle.Compare(j.Handle) }) totalLen := len(e.colsInfo) + len(e.indexes) @@ -850,7 +850,7 @@ workLoop: e.memTracker.Release(collector.MemSize) } } - hist, topn, err := statistics.BuildHistAndTopN(e.ctx, int(e.opts[ast.AnalyzeOptNumBuckets]), int(e.opts[ast.AnalyzeOptNumTopN]), task.id, collector, task.tp, task.isColumn, e.memTracker) + hist, topn, err := statistics.BuildHistAndTopN(e.ctx, int(e.opts[ast.AnalyzeOptNumBuckets]), int(e.opts[ast.AnalyzeOptNumTopN]), task.id, collector, task.tp, task.isColumn, e.memTracker, e.ctx.GetSessionVars().EnableExtendedStats) if err != nil { resultCh <- err releaseCollectorMemory() diff --git a/pkg/executor/analyze_idx.go b/pkg/executor/analyze_idx.go index 67f18e45a317e..9bdf6a8455a68 100644 --- a/pkg/executor/analyze_idx.go +++ b/pkg/executor/analyze_idx.go @@ -159,7 +159,7 @@ func (e *AnalyzeIndexExec) fetchAnalyzeResult(ranges []*ranger.Range, isNullRang SetStartTS(startTS). SetKeepOrder(true). SetConcurrency(e.concurrency). - SetResourceGroupName(e.ctx.GetSessionVars().ResourceGroupName). + SetResourceGroupName(e.ctx.GetSessionVars().StmtCtx.ResourceGroupName). SetExplicitRequestSourceType(e.ctx.GetSessionVars().ExplicitRequestSourceType). Build() if err != nil { diff --git a/pkg/executor/asyncloaddata/BUILD.bazel b/pkg/executor/asyncloaddata/BUILD.bazel deleted file mode 100644 index c8b1906431eaa..0000000000000 --- a/pkg/executor/asyncloaddata/BUILD.bazel +++ /dev/null @@ -1,46 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "asyncloaddata", - srcs = [ - "progress.go", - "util.go", - ], - importpath = "github.com/pingcap/tidb/pkg/executor/asyncloaddata", - visibility = ["//visibility:public"], - deps = [ - "//pkg/kv", - "//pkg/parser/terror", - "//pkg/types", - "//pkg/util/chunk", - "//pkg/util/dbterror/exeerrors", - "//pkg/util/logutil", - "//pkg/util/sqlexec", - "@com_github_pingcap_errors//:errors", - "@com_github_pingcap_failpoint//:failpoint", - "@com_github_tikv_client_go_v2//util", - "@org_golang_x_exp//maps", - "@org_uber_go_atomic//:atomic", - "@org_uber_go_zap//:zap", - ], -) - -go_test( - name = "asyncloaddata_test", - timeout = "short", - srcs = [ - "main_test.go", - "progress_test.go", - "util_test.go", - ], - embed = [":asyncloaddata"], - flaky = True, - race = "on", - shard_count = 6, - deps = [ - "//pkg/testkit", - "//pkg/util/sqlexec", - "@com_github_stretchr_testify//require", - "@org_uber_go_goleak//:goleak", - ], -) diff --git a/pkg/executor/asyncloaddata/progress.go b/pkg/executor/asyncloaddata/progress.go deleted file mode 100644 index 4a2e40bbec547..0000000000000 --- a/pkg/executor/asyncloaddata/progress.go +++ /dev/null @@ -1,103 +0,0 @@ -// Copyright 2023 PingCAP, 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. - -package asyncloaddata - -import ( - "encoding/json" - "sync" - - "go.uber.org/atomic" - "golang.org/x/exp/maps" -) - -// LogicalImportProgress is the progress info of the logical import mode. -type LogicalImportProgress struct { - // LoadedFileSize is the size of the data that's loaded in bytes. It's - // larger than the actual loaded data size, but due to the fact that reading - // is once-a-block and a block may generate multiple tasks that are - // concurrently executed, we can't know the actual loaded data size easily. - LoadedFileSize atomic.Int64 -} - -// PhysicalImportProgress is the progress info of the physical import mode. -type PhysicalImportProgress struct { - colSizeMu sync.Mutex - colSizeMap map[int64]int64 -} - -// Progress is the progress of the LOAD DATA task. -type Progress struct { - // SourceFileSize is the size of the source file in bytes. When we can't get - // the size of the source file, it will be set to -1. - // Currently, the value is read by seek(0, end), when LOAD DATA LOCAL we wrap - // SimpleSeekerOnReadCloser on MySQL client connection which doesn't support - // it. - SourceFileSize int64 - *LogicalImportProgress `json:",inline"` - *PhysicalImportProgress `json:",inline"` - // LoadedRowCnt is the number of rows that has been loaded. - // for physical mode, it's the number of rows that has been imported into TiKV. - // in SHOW LOAD JOB we call it Imported_Rows, to make it compatible with 7.0, - // the variable name is not changed. - LoadedRowCnt atomic.Uint64 -} - -// NewProgress creates a new Progress. -// todo: better pass import mode, but it causes import cycle. -func NewProgress(logicalImport bool) *Progress { - var li *LogicalImportProgress - var pi *PhysicalImportProgress - if logicalImport { - li = &LogicalImportProgress{} - } else { - pi = &PhysicalImportProgress{ - colSizeMap: make(map[int64]int64), - } - } - return &Progress{ - SourceFileSize: -1, - LogicalImportProgress: li, - PhysicalImportProgress: pi, - } -} - -// AddColSize adds the size of the column to the progress. -func (p *Progress) AddColSize(colSizeMap map[int64]int64) { - p.colSizeMu.Lock() - defer p.colSizeMu.Unlock() - for key, value := range colSizeMap { - p.colSizeMap[key] += value - } -} - -// GetColSize returns the size of the column. -func (p *Progress) GetColSize() map[int64]int64 { - p.colSizeMu.Lock() - defer p.colSizeMu.Unlock() - return maps.Clone(p.colSizeMap) -} - -// String implements the fmt.Stringer interface. -func (p *Progress) String() string { - bs, _ := json.Marshal(p) - return string(bs) -} - -// ProgressFromJSON creates Progress from a JSON string. -func ProgressFromJSON(bs []byte) (*Progress, error) { - var p Progress - err := json.Unmarshal(bs, &p) - return &p, err -} diff --git a/pkg/executor/asyncloaddata/progress_test.go b/pkg/executor/asyncloaddata/progress_test.go deleted file mode 100644 index 89644c87df18f..0000000000000 --- a/pkg/executor/asyncloaddata/progress_test.go +++ /dev/null @@ -1,53 +0,0 @@ -// Copyright 2023 PingCAP, 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. - -package asyncloaddata - -import ( - "testing" - - "github.com/stretchr/testify/require" -) - -func TestProgressMarshalUnmarshal(t *testing.T) { - p := NewProgress(true) - require.Nil(t, p.PhysicalImportProgress) - p.SourceFileSize = 123 - p.LoadedFileSize.Store(456) - p.LoadedRowCnt.Store(789) - - s := p.String() - require.Equal(t, `{"SourceFileSize":123,"LoadedFileSize":456,"LoadedRowCnt":789}`, s) - - s2 := `{"SourceFileSize":111,"LoadedFileSize":222,"LoadedRowCnt":333}` - p2, err := ProgressFromJSON([]byte(s2)) - require.NoError(t, err) - require.Equal(t, int64(111), p2.SourceFileSize) - require.Equal(t, int64(222), p2.LoadedFileSize.Load()) - require.Equal(t, uint64(333), p2.LoadedRowCnt.Load()) - - p = NewProgress(false) - require.Nil(t, p.LogicalImportProgress) - p.SourceFileSize = 123 - p.LoadedRowCnt.Store(789) - - s = p.String() - require.Equal(t, `{"SourceFileSize":123,"LoadedRowCnt":789}`, s) - - s2 = `{"SourceFileSize":111,"LoadedRowCnt":333}` - p2, err = ProgressFromJSON([]byte(s2)) - require.NoError(t, err) - require.Equal(t, int64(111), p2.SourceFileSize) - require.Equal(t, uint64(333), p2.LoadedRowCnt.Load()) -} diff --git a/pkg/executor/asyncloaddata/util.go b/pkg/executor/asyncloaddata/util.go deleted file mode 100644 index 1b3681038a274..0000000000000 --- a/pkg/executor/asyncloaddata/util.go +++ /dev/null @@ -1,595 +0,0 @@ -// Copyright 2023 PingCAP, 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. - -package asyncloaddata - -import ( - "context" - "fmt" - "net/url" - "sync/atomic" - "time" - - "github.com/pingcap/errors" - "github.com/pingcap/failpoint" - "github.com/pingcap/tidb/pkg/kv" - "github.com/pingcap/tidb/pkg/parser/terror" - "github.com/pingcap/tidb/pkg/types" - "github.com/pingcap/tidb/pkg/util/chunk" - "github.com/pingcap/tidb/pkg/util/dbterror/exeerrors" - "github.com/pingcap/tidb/pkg/util/logutil" - "github.com/pingcap/tidb/pkg/util/sqlexec" - "github.com/tikv/client-go/v2/util" - "go.uber.org/zap" -) - -// vars used for test. -var ( - // TestSyncCh is used in unit test to synchronize the execution of LOAD DATA. - TestSyncCh = make(chan struct{}) - // TestLastLoadDataJobID last created job id, used in unit test. - TestLastLoadDataJobID atomic.Int64 -) - -// Job import job. -type Job struct { - ID int64 - // Job don't manage the life cycle of the connection. - Conn sqlexec.SQLExecutor - User string -} - -// NewJob returns new Job. -func NewJob(id int64, conn sqlexec.SQLExecutor, user string) *Job { - return &Job{ID: id, Conn: conn, User: user} -} - -// CreateLoadDataJob creates a load data job by insert a record to system table. -// The AUTO_INCREMENT value will be returned as jobID. -func CreateLoadDataJob( - ctx context.Context, - conn sqlexec.SQLExecutor, - dataSource, db, table string, - importMode string, - user string, -) (*Job, error) { - // remove the params in data source URI because it may contains AK/SK - u, err := url.Parse(dataSource) - if err == nil && u.Scheme != "" { - u.RawQuery = "" - u.Fragment = "" - dataSource = u.String() - } - ctx = util.WithInternalSourceType(ctx, kv.InternalLoadData) - _, err = conn.ExecuteInternal(ctx, - `INSERT INTO mysql.load_data_jobs - (data_source, table_schema, table_name, import_mode, create_user) - VALUES (%?, %?, %?, %?, %?);`, - dataSource, db, table, importMode, user) - if err != nil { - return nil, err - } - rs, err := conn.ExecuteInternal(ctx, `SELECT LAST_INSERT_ID();`) - if err != nil { - return nil, err - } - //nolint: errcheck - defer rs.Close() - rows, err := sqlexec.DrainRecordSet(ctx, rs, 1) - if err != nil { - return nil, err - } - if len(rows) != 1 { - return nil, errors.Errorf("unexpected result length: %d", len(rows)) - } - - failpoint.Inject("SaveLastLoadDataJobID", func() { - TestLastLoadDataJobID.Store(rows[0].GetInt64(0)) - }) - return NewJob(rows[0].GetInt64(0), conn, user), nil -} - -// StartJob tries to start a not-yet-started job with jobID. It will not return -// error when there's no matched job. -func (j *Job) StartJob(ctx context.Context) error { - failpoint.Inject("AfterCreateLoadDataJob", nil) - failpoint.Inject("SyncAfterCreateLoadDataJob", func() { - TestSyncCh <- struct{}{} - <-TestSyncCh - }) - - ctx = util.WithInternalSourceType(ctx, kv.InternalLoadData) - _, err := j.Conn.ExecuteInternal(ctx, - `UPDATE mysql.load_data_jobs - SET start_time = CURRENT_TIMESTAMP(6), update_time = CURRENT_TIMESTAMP(6) - WHERE job_id = %? AND start_time IS NULL AND end_time IS NULL;`, - j.ID) - if err != nil { - return err - } - - failpoint.Inject("AfterStartJob", nil) - failpoint.Inject("SyncAfterStartJob", func() { - TestSyncCh <- struct{}{} - <-TestSyncCh - }) - return nil -} - -var ( - // HeartBeatInSec is the interval of heartbeat. - HeartBeatInSec = 5 - // OfflineThresholdInSec means after failing to update heartbeat for 3 times, - // we treat the worker of the job as offline. - OfflineThresholdInSec = HeartBeatInSec * 3 -) - -// UpdateJobProgress updates the progress of a load data job. It should be called -// periodically as heartbeat after StartJob. -// The returned bool indicates whether the keepalive is succeeded. If not, the -// caller should call FailJob soon. -// TODO: Currently if the node is crashed after CreateLoadDataJob and before StartJob, -// it will always be in the status of pending. Maybe we should unify CreateLoadDataJob -// and StartJob. -func (j *Job) UpdateJobProgress(ctx context.Context, progress string) (bool, error) { - ctx = util.WithInternalSourceType(ctx, kv.InternalLoadData) - // let TiDB handle heartbeat check for concurrent SQL - // we tolerate 2 times of failure/timeout when updating heartbeat - _, err := j.Conn.ExecuteInternal(ctx, - `UPDATE mysql.load_data_jobs - SET progress = %?, update_time = CURRENT_TIMESTAMP(6) - WHERE job_id = %? - AND end_time IS NULL - AND (update_time >= DATE_SUB(CURRENT_TIMESTAMP(6), INTERVAL %? SECOND) - OR update_time IS NULL);`, - progress, j.ID, OfflineThresholdInSec) - if err != nil { - return false, err - } - return j.Conn.GetSessionVars().StmtCtx.AffectedRows() == 1, nil -} - -// FinishJob finishes a load data job. A job can only be finished once. -func (j *Job) FinishJob(ctx context.Context, result string) error { - ctx = util.WithInternalSourceType(ctx, kv.InternalLoadData) - _, err := j.Conn.ExecuteInternal(ctx, - `UPDATE mysql.load_data_jobs - SET end_time = CURRENT_TIMESTAMP(6), result_message = %? - WHERE job_id = %? AND result_message IS NULL AND error_message IS NULL;`, - result, j.ID) - return err -} - -// FailJob fails a load data job. A job can only be failed once. -func (j *Job) FailJob(ctx context.Context, result string) error { - ctx = util.WithInternalSourceType(ctx, kv.InternalLoadData) - _, err := j.Conn.ExecuteInternal(ctx, - `UPDATE mysql.load_data_jobs - SET end_time = CURRENT_TIMESTAMP(6), error_message = %? - WHERE job_id = %? AND result_message IS NULL AND error_message IS NULL;`, - result, j.ID) - return err -} - -// CancelJob cancels a load data job. Only a running/paused job can be canceled. -func (j *Job) CancelJob(ctx context.Context) (err error) { - ctx = util.WithInternalSourceType(ctx, kv.InternalLoadData) - _, err = j.Conn.ExecuteInternal(ctx, "BEGIN PESSIMISTIC;") - if err != nil { - return err - } - defer func() { - if err != nil { - _, err1 := j.Conn.ExecuteInternal(ctx, "ROLLBACK;") - terror.Log(err1) - return - } - - _, err = j.Conn.ExecuteInternal(ctx, "COMMIT;") - if err != nil { - return - } - }() - - var ( - rs sqlexec.RecordSet - rows []chunk.Row - ) - rs, err = j.Conn.ExecuteInternal(ctx, - `SELECT expected_status, end_time, error_message FROM mysql.load_data_jobs - WHERE job_id = %? AND create_user = %?;`, - j.ID, j.User) - if err != nil { - return err - } - defer terror.Call(rs.Close) - rows, err = sqlexec.DrainRecordSet(ctx, rs, 1) - if err != nil { - return err - } - - if len(rows) < 1 { - return exeerrors.ErrLoadDataJobNotFound.GenWithStackByArgs(j.ID) - } - status := rows[0].GetEnum(0).String() - if status != "running" && status != "paused" { - return exeerrors.ErrLoadDataInvalidOperation.GenWithStackByArgs(fmt.Sprintf("need status running or paused, but got %s", status)) - } - endTimeIsNull := rows[0].IsNull(1) - if !endTimeIsNull { - hasError := !rows[0].IsNull(2) - if hasError { - return exeerrors.ErrLoadDataInvalidOperation.GenWithStackByArgs("need status running or paused, but got failed") - } - return exeerrors.ErrLoadDataInvalidOperation.GenWithStackByArgs("need status running or paused, but got finished") - } - - _, err = j.Conn.ExecuteInternal(ctx, - `UPDATE mysql.load_data_jobs - SET expected_status = 'canceled', - end_time = CURRENT_TIMESTAMP(6), - error_message = 'canceled by user' - WHERE job_id = %?;`, - j.ID) - return err -} - -// DropJob drops a load data job. -func (j *Job) DropJob(ctx context.Context) error { - ctx = util.WithInternalSourceType(ctx, kv.InternalLoadData) - _, err := j.Conn.ExecuteInternal(ctx, - `DELETE FROM mysql.load_data_jobs - WHERE job_id = %? AND create_user = %?;`, - j.ID, j.User) - if err == nil { - return err - } - if j.Conn.GetSessionVars().StmtCtx.AffectedRows() < 1 { - return exeerrors.ErrLoadDataJobNotFound.GenWithStackByArgs(j.ID) - } - return nil -} - -// OnComplete is called when a job is finished or failed. -func (j *Job) OnComplete(inErr error, msg string) { - // write the ending status even if user context is canceled. - ctx2 := context.Background() - ctx2 = kv.WithInternalSourceType(ctx2, kv.InternalLoadData) - if inErr == nil { - err2 := j.FinishJob(ctx2, msg) - terror.Log(err2) - return - } - errMsg := inErr.Error() - if errImpl, ok := errors.Cause(inErr).(*errors.Error); ok { - b, marshalErr := errImpl.MarshalJSON() - if marshalErr == nil { - errMsg = string(b) - } - } - - err2 := j.FailJob(ctx2, errMsg) - terror.Log(err2) -} - -// ProgressUpdateRoutineFn job progress update routine. -func (j *Job) ProgressUpdateRoutineFn(ctx context.Context, finishCh chan struct{}, errCh <-chan struct{}, progress *Progress) error { - ticker := time.NewTicker(time.Duration(HeartBeatInSec) * time.Second) - defer ticker.Stop() - - for { - select { - case <-finishCh: - // When done, try to update progress to reach 100% - ok, err2 := j.UpdateJobProgress(ctx, progress.String()) - if !ok || err2 != nil { - logutil.Logger(ctx).Warn("failed to update job progress when finished", - zap.Bool("ok", ok), zap.Error(err2)) - } - return nil - case <-errCh: - return nil - case <-ticker.C: - ok, err2 := j.UpdateJobProgress(ctx, progress.String()) - if err2 != nil { - return err2 - } - if !ok { - return errors.Errorf("failed to update job progress, the job %d is interrupted by user or failed to keepalive", j.ID) - } - } - } -} - -// JobExpectedStatus is the expected status of a load data job. User can set the -// expected status of a job and worker will respect it. -type JobExpectedStatus int - -const ( - // JobExpectedRunning means the job is expected to be running. - JobExpectedRunning JobExpectedStatus = iota - // JobExpectedPaused means the job is expected to be paused. - JobExpectedPaused - // JobExpectedCanceled means the job is expected to be canceled. - JobExpectedCanceled -) - -// UpdateJobExpectedStatus updates the expected status of a load data job. -// TODO: remove it? -func UpdateJobExpectedStatus( - ctx context.Context, - conn sqlexec.SQLExecutor, - jobID int64, - status JobExpectedStatus, -) error { - ctx = util.WithInternalSourceType(ctx, kv.InternalLoadData) - var sql string - switch status { - case JobExpectedRunning: - sql = `UPDATE mysql.load_data_jobs - SET expected_status = 'running' - WHERE job_id = %? AND expected_status = 'paused';` - case JobExpectedPaused: - sql = `UPDATE mysql.load_data_jobs - SET expected_status = 'paused' - WHERE job_id = %? AND expected_status = 'running';` - case JobExpectedCanceled: - sql = `UPDATE mysql.load_data_jobs - SET expected_status = 'canceled' - WHERE job_id = %? AND expected_status != 'canceled';` - } - _, err := conn.ExecuteInternal(ctx, sql, jobID) - return err -} - -// JobStatus represents the status of a load data job. -type JobStatus int - -const ( - // JobFailed means the job is failed and can't be resumed. - JobFailed JobStatus = iota - // JobCanceled means the job is canceled by user and can't be resumed. It - // will finally convert to JobFailed with a message indicating the reason - // is canceled. - JobCanceled - // JobPaused means the job is paused by user and can be resumed. - JobPaused - // JobFinished means the job is finished. - JobFinished - // JobPending means the job is pending to be started. - JobPending - // JobRunning means the job is running. - JobRunning -) - -func (s JobStatus) String() string { - switch s { - case JobFailed: - return "failed" - case JobCanceled: - return "canceled" - case JobPaused: - return "paused" - case JobFinished: - return "finished" - case JobPending: - return "pending" - case JobRunning: - return "running" - default: - return "unknown JobStatus" - } -} - -// GetJobStatus gets the status of a load data job. The returned error means -// something wrong when querying the database. Other business logic errors are -// returned as JobFailed with message. -func (j *Job) GetJobStatus(ctx context.Context) (JobStatus, string, error) { - ctx = util.WithInternalSourceType(ctx, kv.InternalLoadData) - rs, err := j.Conn.ExecuteInternal(ctx, - `SELECT - expected_status, - update_time >= DATE_SUB(CURRENT_TIMESTAMP(6), INTERVAL %? SECOND) AS is_alive, - end_time, - result_message, - error_message, - start_time - FROM mysql.load_data_jobs - WHERE job_id = %?;`, - OfflineThresholdInSec, j.ID) - if err != nil { - return JobFailed, "", err - } - defer terror.Call(rs.Close) - rows, err := sqlexec.DrainRecordSet(ctx, rs, 1) - if err != nil { - return JobFailed, "", err - } - if len(rows) != 1 { - return JobFailed, exeerrors.ErrLoadDataJobNotFound.GenWithStackByArgs(j.ID).Error(), nil - } - - return getJobStatus(rows[0]) -} - -// getJobStatus expected the first 6 columns of input row is (expected_status, -// is_alive (derived from update_time), end_time, result_message, error_message, -// start_time). -func getJobStatus(row chunk.Row) (JobStatus, string, error) { - // ending status has the highest priority - expectedStatus := row.GetEnum(0).String() - endTimeIsNull := row.IsNull(2) - if !endTimeIsNull { - resultMsgIsNull := row.IsNull(3) - if !resultMsgIsNull { - resultMessage := row.GetString(3) - return JobFinished, resultMessage, nil - } - - errorMessage := row.GetString(4) - if expectedStatus == "canceled" { - return JobCanceled, errorMessage, nil - } - return JobFailed, errorMessage, nil - } - - isAlive := row.GetInt64(1) == 1 - startTimeIsNull := row.IsNull(5) - - switch expectedStatus { - case "canceled": - return JobCanceled, "", nil - case "paused": - if startTimeIsNull || isAlive { - return JobPaused, "", nil - } - return JobFailed, "job expected paused but the node is timeout", nil - case "running": - if startTimeIsNull { - return JobPending, "", nil - } - if isAlive { - return JobRunning, "", nil - } - return JobFailed, "job expected running but the node is timeout", nil - default: - return JobFailed, fmt.Sprintf("unexpected job status %s", expectedStatus), nil - } -} - -// JobInfo is the information of a load data job. -type JobInfo struct { - JobID int64 - User string - DataSource string - TableSchema string - TableName string - ImportMode string - Progress string - Status JobStatus - StatusMessage string - CreateTime types.Time - StartTime types.Time - EndTime types.Time -} - -// GetJobInfo gets all needed information of a load data job. -func (j *Job) GetJobInfo(ctx context.Context) (*JobInfo, error) { - ctx = util.WithInternalSourceType(ctx, kv.InternalLoadData) - rs, err := j.Conn.ExecuteInternal(ctx, - `SELECT - expected_status, - update_time >= DATE_SUB(CURRENT_TIMESTAMP(6), INTERVAL %? SECOND) AS is_alive, - end_time, - result_message, - error_message, - start_time, - - job_id, - data_source, - table_schema, - table_name, - import_mode, - progress, - create_user, - create_time - FROM mysql.load_data_jobs - WHERE job_id = %? AND create_user = %?;`, - OfflineThresholdInSec, j.ID, j.User) - if err != nil { - return nil, err - } - defer terror.Call(rs.Close) - rows, err := sqlexec.DrainRecordSet(ctx, rs, 1) - if err != nil { - return nil, err - } - if len(rows) != 1 { - return nil, exeerrors.ErrLoadDataJobNotFound.GenWithStackByArgs(j.ID) - } - - return getJobInfo(rows[0]) -} - -// getJobInfo expected the columns of input row is (expected_status, -// is_alive (derived from update_time), end_time, result_message, error_message, -// start_time, job_id, data_source, table_schema, table_name, import_mode, -// progress, create_user). -func getJobInfo(row chunk.Row) (*JobInfo, error) { - var err error - jobInfo := JobInfo{ - JobID: row.GetInt64(6), - DataSource: row.GetString(7), - TableSchema: row.GetString(8), - TableName: row.GetString(9), - ImportMode: row.GetString(10), - Progress: row.GetString(11), - User: row.GetString(12), - CreateTime: row.GetTime(13), - StartTime: row.GetTime(5), - EndTime: row.GetTime(2), - } - jobInfo.Status, jobInfo.StatusMessage, err = getJobStatus(row) - if err != nil { - return nil, err - } - return &jobInfo, nil -} - -// GetAllJobInfo gets all jobs status of a user. -func GetAllJobInfo( - ctx context.Context, - conn sqlexec.SQLExecutor, - user string, -) ([]*JobInfo, error) { - ctx = util.WithInternalSourceType(ctx, kv.InternalLoadData) - rs, err := conn.ExecuteInternal(ctx, - `SELECT - expected_status, - update_time >= DATE_SUB(CURRENT_TIMESTAMP(6), INTERVAL %? SECOND) AS is_alive, - end_time, - result_message, - error_message, - start_time, - - job_id, - data_source, - table_schema, - table_name, - import_mode, - progress, - create_user, - create_time - FROM mysql.load_data_jobs - WHERE create_user = %?;`, - OfflineThresholdInSec, user) - if err != nil { - return nil, err - } - defer terror.Call(rs.Close) - rows, err := sqlexec.DrainRecordSet(ctx, rs, 1) - if err != nil { - return nil, err - } - ret := make([]*JobInfo, 0, len(rows)) - for _, row := range rows { - jobInfo, err := getJobInfo(row) - if err != nil { - return nil, err - } - ret = append(ret, jobInfo) - } - - return ret, nil -} diff --git a/pkg/executor/asyncloaddata/util_test.go b/pkg/executor/asyncloaddata/util_test.go deleted file mode 100644 index 0f5a224ef2b08..0000000000000 --- a/pkg/executor/asyncloaddata/util_test.go +++ /dev/null @@ -1,345 +0,0 @@ -// Copyright 2023 PingCAP, 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. - -package asyncloaddata_test - -import ( - "context" - "testing" - "time" - - . "github.com/pingcap/tidb/pkg/executor/asyncloaddata" - "github.com/pingcap/tidb/pkg/testkit" - "github.com/pingcap/tidb/pkg/util/sqlexec" - "github.com/stretchr/testify/require" -) - -func checkEqualIgnoreTimes(t *testing.T, expected, got *JobInfo) { - cloned := *expected - cloned.CreateTime = got.CreateTime - cloned.StartTime = got.StartTime - cloned.EndTime = got.EndTime - require.Equal(t, &cloned, got) -} - -func createJob(t *testing.T, conn sqlexec.SQLExecutor, user string) (*Job, *JobInfo) { - job, err := CreateLoadDataJob(context.Background(), conn, "/tmp/test.csv", "test", "t", "logical", user) - require.NoError(t, err) - info, err := job.GetJobInfo(context.Background()) - require.NoError(t, err) - expected := &JobInfo{ - JobID: job.ID, - User: user, - DataSource: "/tmp/test.csv", - TableSchema: "test", - TableName: "t", - ImportMode: "logical", - Progress: "", - Status: JobPending, - StatusMessage: "", - } - checkEqualIgnoreTimes(t, expected, info) - return job, info -} - -func TestHappyPath(t *testing.T) { - store := testkit.CreateMockStore(t) - tk := testkit.NewTestKit(t, store) - ctx := context.Background() - - // job is created - - job, expected := createJob(t, tk.Session(), "user") - - // job is started by a worker - - backup := OfflineThresholdInSec - OfflineThresholdInSec = 1000 - t.Cleanup(func() { - OfflineThresholdInSec = backup - }) - err := job.StartJob(ctx) - require.NoError(t, err) - info, err := job.GetJobInfo(ctx) - require.NoError(t, err) - expected.Status = JobRunning - checkEqualIgnoreTimes(t, expected, info) - - // job is periodically updated by worker - - ok, err := job.UpdateJobProgress(ctx, "imported 10%") - require.NoError(t, err) - require.True(t, ok) - info, err = job.GetJobInfo(ctx) - require.NoError(t, err) - expected.Progress = "imported 10%" - checkEqualIgnoreTimes(t, expected, info) - - // job is paused - - err = UpdateJobExpectedStatus(ctx, tk.Session(), job.ID, JobExpectedPaused) - require.NoError(t, err) - info, err = job.GetJobInfo(ctx) - require.NoError(t, err) - expected.Status = JobPaused - checkEqualIgnoreTimes(t, expected, info) - - // worker still can update progress, maybe response to pausing is delayed - - ok, err = job.UpdateJobProgress(ctx, "imported 20%") - require.NoError(t, err) - require.True(t, ok) - info, err = job.GetJobInfo(ctx) - require.NoError(t, err) - expected.Progress = "imported 20%" - checkEqualIgnoreTimes(t, expected, info) - - // job is resumed - - err = UpdateJobExpectedStatus(ctx, tk.Session(), job.ID, JobExpectedRunning) - require.NoError(t, err) - info, err = job.GetJobInfo(ctx) - require.NoError(t, err) - expected.Status = JobRunning - checkEqualIgnoreTimes(t, expected, info) - - // job is finished - - err = job.FinishJob(ctx, "finished message") - require.NoError(t, err) - info, err = job.GetJobInfo(ctx) - require.NoError(t, err) - expected.Status = JobFinished - expected.StatusMessage = "finished message" - checkEqualIgnoreTimes(t, expected, info) -} - -func TestKeepAlive(t *testing.T) { - store := testkit.CreateMockStore(t) - tk := testkit.NewTestKit(t, store) - ctx := context.Background() - - // job is created - - job, expected := createJob(t, tk.Session(), "user") - - backup := OfflineThresholdInSec - OfflineThresholdInSec = 1 - t.Cleanup(func() { - OfflineThresholdInSec = backup - }) - - // before job is started, worker don't need to keepalive - // TODO:👆not correct! - - time.Sleep(2 * time.Second) - info, err := job.GetJobInfo(ctx) - require.NoError(t, err) - checkEqualIgnoreTimes(t, expected, info) - - err = job.StartJob(ctx) - require.NoError(t, err) - info, err = job.GetJobInfo(ctx) - require.NoError(t, err) - expected.Status = JobRunning - checkEqualIgnoreTimes(t, expected, info) - - // if worker failed to keepalive, job will fail - - time.Sleep(2 * time.Second) - info, err = job.GetJobInfo(ctx) - require.NoError(t, err) - expected.Status = JobFailed - expected.StatusMessage = "job expected running but the node is timeout" - checkEqualIgnoreTimes(t, expected, info) - - // after the worker is failed to keepalive, further keepalive will fail - - ok, err := job.UpdateJobProgress(ctx, "imported 20%") - require.NoError(t, err) - require.False(t, ok) - info, err = job.GetJobInfo(ctx) - require.NoError(t, err) - checkEqualIgnoreTimes(t, expected, info) - - // when worker fails to keepalive, before it calls FailJob, it still can - // change expected status to some extent. - - err = UpdateJobExpectedStatus(ctx, tk.Session(), job.ID, JobExpectedPaused) - require.NoError(t, err) - info, err = job.GetJobInfo(ctx) - require.NoError(t, err) - expected.StatusMessage = "job expected paused but the node is timeout" - checkEqualIgnoreTimes(t, expected, info) - err = UpdateJobExpectedStatus(ctx, tk.Session(), job.ID, JobExpectedRunning) - require.NoError(t, err) - info, err = job.GetJobInfo(ctx) - require.NoError(t, err) - expected.StatusMessage = "job expected running but the node is timeout" - checkEqualIgnoreTimes(t, expected, info) - err = UpdateJobExpectedStatus(ctx, tk.Session(), job.ID, JobExpectedCanceled) - require.NoError(t, err) - info, err = job.GetJobInfo(ctx) - require.NoError(t, err) - expected.Status = JobCanceled - expected.StatusMessage = "" - checkEqualIgnoreTimes(t, expected, info) - - // Now the worker calls FailJob, but the status should still be canceled, - // that's more friendly. - - err = job.FailJob(ctx, "failed to keepalive") - require.NoError(t, err) - info, err = job.GetJobInfo(ctx) - require.NoError(t, err) - expected.Status = JobCanceled - expected.StatusMessage = "failed to keepalive" - checkEqualIgnoreTimes(t, expected, info) -} - -func TestJobIsFailedAndGetAllJobs(t *testing.T) { - store := testkit.CreateMockStore(t) - tk := testkit.NewTestKit(t, store) - ctx := context.Background() - - // job is created - - job, expected := createJob(t, tk.Session(), "user") - - // job can be failed directly when it's pending - - err := job.FailJob(ctx, "failed message") - require.NoError(t, err) - info, err := job.GetJobInfo(ctx) - require.NoError(t, err) - expected.Status = JobFailed - expected.StatusMessage = "failed message" - checkEqualIgnoreTimes(t, expected, info) - - // create another job and fail it - - job, expected = createJob(t, tk.Session(), "user") - - err = job.StartJob(ctx) - require.NoError(t, err) - info, err = job.GetJobInfo(ctx) - require.NoError(t, err) - expected.Status = JobRunning - checkEqualIgnoreTimes(t, expected, info) - - err = job.FailJob(ctx, "failed message") - require.NoError(t, err) - info, err = job.GetJobInfo(ctx) - require.NoError(t, err) - expected.Status = JobFailed - expected.StatusMessage = "failed message" - checkEqualIgnoreTimes(t, expected, info) - - // test change expected status of a failed job. - - err = UpdateJobExpectedStatus(ctx, tk.Session(), job.ID, JobExpectedPaused) - require.NoError(t, err) - info, err = job.GetJobInfo(ctx) - require.NoError(t, err) - checkEqualIgnoreTimes(t, expected, info) - err = UpdateJobExpectedStatus(ctx, tk.Session(), job.ID, JobExpectedRunning) - require.NoError(t, err) - info, err = job.GetJobInfo(ctx) - require.NoError(t, err) - checkEqualIgnoreTimes(t, expected, info) - err = job.CancelJob(ctx) - require.ErrorContains(t, err, "The current job status cannot perform the operation. need status running or paused, but got failed") - - // add job of another user and test GetAllJobInfo - - job, _ = createJob(t, tk.Session(), "user2") - - jobs, err := GetAllJobInfo(ctx, tk.Session(), "user") - require.NoError(t, err) - require.Equal(t, 2, len(jobs)) - require.Equal(t, JobFailed, jobs[0].Status) - require.Equal(t, JobFailed, jobs[1].Status) - - jobs, err = GetAllJobInfo(ctx, tk.Session(), "user2") - require.NoError(t, err) - require.Equal(t, 1, len(jobs)) - require.Equal(t, JobPending, jobs[0].Status) - require.Equal(t, job.ID, jobs[0].JobID) - - job.User = "wrong_user" - _, err = job.GetJobInfo(ctx) - require.ErrorContains(t, err, "doesn't exist") -} - -func TestGetJobStatus(t *testing.T) { - store := testkit.CreateMockStore(t) - tk := testkit.NewTestKit(t, store) - ctx := context.Background() - - // job is created - - job, _ := createJob(t, tk.Session(), "user") - - // job is pending - - status, msg, err := job.GetJobStatus(ctx) - require.NoError(t, err) - require.Equal(t, JobPending, status) - require.Equal(t, "", msg) - - // job is running - - backup := OfflineThresholdInSec - OfflineThresholdInSec = 1000 - t.Cleanup(func() { - OfflineThresholdInSec = backup - }) - err = job.StartJob(ctx) - require.NoError(t, err) - status, msg, err = job.GetJobStatus(ctx) - require.NoError(t, err) - require.Equal(t, JobRunning, status) - require.Equal(t, "", msg) - - // job is finished - - err = job.FinishJob(ctx, "finished message") - require.NoError(t, err) - status, msg, err = job.GetJobStatus(ctx) - require.NoError(t, err) - require.Equal(t, JobFinished, status) - require.Equal(t, "finished message", msg) - - // wrong ID - - job.ID += 1 - status, msg, err = job.GetJobStatus(ctx) - require.NoError(t, err) - require.Equal(t, JobFailed, status) - require.Contains(t, msg, "doesn't exist") -} - -func TestCreateLoadDataJobRedact(t *testing.T) { - store := testkit.CreateMockStore(t) - tk := testkit.NewTestKit(t, store) - ctx := context.Background() - - _, err := CreateLoadDataJob(ctx, tk.Session(), - "s3://bucket/a.csv?access-key=hideme&secret-access-key=hideme", - "db", "table", "mode", "user") - require.NoError(t, err) - result := tk.MustQuery("SELECT * FROM mysql.load_data_jobs;") - result.CheckContain("a.csv") - result.CheckNotContain("hideme") -} diff --git a/pkg/executor/batch_checker.go b/pkg/executor/batch_checker.go index 29d48bf345d56..5d7d26a04b43d 100644 --- a/pkg/executor/batch_checker.go +++ b/pkg/executor/batch_checker.go @@ -100,8 +100,11 @@ func getKeysNeedCheckOneRow(ctx sessionctx.Context, t table.Table, row []types.D if p, ok := t.(table.PartitionedTable); ok { t, err = p.GetPartitionByRow(ctx, row) if err != nil { - if terr, ok := errors.Cause(err).(*terror.Error); ctx.GetSessionVars().StmtCtx.IgnoreNoPartition && ok && (terr.Code() == errno.ErrNoPartitionForGivenValue || terr.Code() == errno.ErrRowDoesNotMatchGivenPartitionSet) { - ctx.GetSessionVars().StmtCtx.AppendWarning(err) + if terr, ok := errors.Cause(err).(*terror.Error); ok && (terr.Code() == errno.ErrNoPartitionForGivenValue || terr.Code() == errno.ErrRowDoesNotMatchGivenPartitionSet) { + ec := ctx.GetSessionVars().StmtCtx.ErrCtx() + if err = ec.HandleError(terr); err != nil { + return nil, err + } result = append(result, toBeCheckedRow{ignored: true}) return result, nil } diff --git a/pkg/executor/batch_point_get.go b/pkg/executor/batch_point_get.go index 06afa7285fa8f..9de61a9b4f6fc 100644 --- a/pkg/executor/batch_point_get.go +++ b/pkg/executor/batch_point_get.go @@ -186,7 +186,7 @@ func (e *BatchPointGetExec) Next(ctx context.Context, req *chunk.Chunk) error { } for !req.IsFull() && e.index < len(e.values) { handle, val := e.handles[e.index], e.values[e.index] - err := DecodeRowValToChunk(e.Base().Ctx(), e.Schema(), e.tblInfo, handle, val, req, e.rowDecoder) + err := DecodeRowValToChunk(e.BaseExecutor.Ctx(), e.Schema(), e.tblInfo, handle, val, req, e.rowDecoder) if err != nil { return err } @@ -226,12 +226,16 @@ func (e *BatchPointGetExec) initialize(ctx context.Context) error { } var physID int64 - if len(e.planPhysIDs) > 0 { - physID = e.planPhysIDs[i] + if e.partPos == core.GlobalWithoutColumnPos { + physID = e.tblInfo.ID } else { - physID, err = core.GetPhysID(e.tblInfo, e.partExpr, e.partPos, idxVals[e.partPos]) - if err != nil { - continue + if len(e.planPhysIDs) > 0 { + physID = e.planPhysIDs[i] + } else { + physID, err = core.GetPhysID(e.tblInfo, e.partExpr, e.partPos, idxVals[e.partPos]) + if err != nil { + continue + } } } @@ -300,8 +304,18 @@ func (e *BatchPointGetExec) initialize(ctx context.Context) error { indexKeys = append(indexKeys, key) } if e.tblInfo.Partition != nil { - pid := tablecodec.DecodeTableID(key) - e.physIDs = append(e.physIDs, pid) + var pid int64 + if e.idxInfo.Global { + segs := tablecodec.SplitIndexValue(handleVal) + _, pid, err = codec.DecodeInt(segs.PartitionID) + if err != nil { + return err + } + e.physIDs = append(e.physIDs, pid) + } else { + pid = tablecodec.DecodeTableID(key) + e.physIDs = append(e.physIDs, pid) + } if e.lock { e.UpdateDeltaForTableID(pid) } diff --git a/pkg/executor/benchmark_test.go b/pkg/executor/benchmark_test.go index 9aab5de3c2a5d..031f46fb04a46 100644 --- a/pkg/executor/benchmark_test.go +++ b/pkg/executor/benchmark_test.go @@ -653,6 +653,7 @@ func prepare4HashJoin(testCase *hashJoinTestCase, innerExec, outerExec exec.Exec concurrency: uint(testCase.concurrency), probeTypes: exec.RetTypes(outerExec), buildTypes: exec.RetTypes(innerExec), + allocPool: chunk.NewEmptyAllocator(), }, probeSideTupleFetcher: &probeSideTupleFetcher{ probeSideExec: outerExec, @@ -1751,7 +1752,7 @@ func BenchmarkAggPartialResultMapperMemoryUsage(b *testing.B) { b.Run(fmt.Sprintf("MapRows %v", c.rowNum), func(b *testing.B) { b.ReportAllocs() for i := 0; i < b.N; i++ { - aggMap := make(aggregate.AggPartialResultMapper) + aggMap := make(aggfuncs.AggPartialResultMapper) tempSlice := make([]aggfuncs.PartialResult, 10) for num := 0; num < c.rowNum; num++ { aggMap[strconv.Itoa(num)] = tempSlice diff --git a/pkg/executor/bind.go b/pkg/executor/bind.go index d4d30e74a1362..fef5c9d7ad538 100644 --- a/pkg/executor/bind.go +++ b/pkg/executor/bind.go @@ -21,6 +21,7 @@ import ( "github.com/pingcap/tidb/pkg/bindinfo" "github.com/pingcap/tidb/pkg/domain" "github.com/pingcap/tidb/pkg/executor/internal/exec" + "github.com/pingcap/tidb/pkg/parser" "github.com/pingcap/tidb/pkg/parser/ast" plannercore "github.com/pingcap/tidb/pkg/planner/core" "github.com/pingcap/tidb/pkg/util/chunk" @@ -59,7 +60,7 @@ func (e *SQLBindExec) Next(_ context.Context, req *chunk.Chunk) error { case plannercore.OpCaptureBindings: e.captureBindings() case plannercore.OpEvolveBindings: - return e.evolveBindings() + return nil // not support yet case plannercore.OpReloadBindings: return e.reloadBindings() case plannercore.OpSetBindingStatus: @@ -73,20 +74,12 @@ func (e *SQLBindExec) Next(_ context.Context, req *chunk.Chunk) error { } func (e *SQLBindExec) dropSQLBind() error { - var bindInfo *bindinfo.Binding - if e.bindSQL != "" { - bindInfo = &bindinfo.Binding{ - BindSQL: e.bindSQL, - Charset: e.charset, - Collation: e.collation, - } - } if !e.isGlobal { - handle := e.Ctx().Value(bindinfo.SessionBindInfoKeyType).(*bindinfo.SessionHandle) - err := handle.DropBindRecord(e.normdOrigSQL, e.db, bindInfo) + handle := e.Ctx().Value(bindinfo.SessionBindInfoKeyType).(bindinfo.SessionBindingHandle) + err := handle.DropSessionBinding(e.sqlDigest) return err } - affectedRows, err := domain.GetDomain(e.Ctx()).BindHandle().DropBindRecord(e.normdOrigSQL, e.db, bindInfo) + affectedRows, err := domain.GetDomain(e.Ctx()).BindHandle().DropGlobalBinding(e.sqlDigest) e.Ctx().GetSessionVars().StmtCtx.AddAffectedRows(affectedRows) return err } @@ -96,36 +89,29 @@ func (e *SQLBindExec) dropSQLBindByDigest() error { return errors.New("sql digest is empty") } if !e.isGlobal { - handle := e.Ctx().Value(bindinfo.SessionBindInfoKeyType).(*bindinfo.SessionHandle) - err := handle.DropBindRecordByDigest(e.sqlDigest) + handle := e.Ctx().Value(bindinfo.SessionBindInfoKeyType).(bindinfo.SessionBindingHandle) + err := handle.DropSessionBinding(e.sqlDigest) return err } - affectedRows, err := domain.GetDomain(e.Ctx()).BindHandle().DropBindRecordByDigest(e.sqlDigest) + affectedRows, err := domain.GetDomain(e.Ctx()).BindHandle().DropGlobalBinding(e.sqlDigest) e.Ctx().GetSessionVars().StmtCtx.AddAffectedRows(affectedRows) return err } func (e *SQLBindExec) setBindingStatus() error { - var bindInfo *bindinfo.Binding - if e.bindSQL != "" { - bindInfo = &bindinfo.Binding{ - BindSQL: e.bindSQL, - Charset: e.charset, - Collation: e.collation, - } - } - ok, err := domain.GetDomain(e.Ctx()).BindHandle().SetBindRecordStatus(e.normdOrigSQL, bindInfo, e.newStatus) + _, sqlDigest := parser.NormalizeDigestForBinding(e.normdOrigSQL) + ok, err := domain.GetDomain(e.Ctx()).BindHandle().SetGlobalBindingStatus(e.newStatus, sqlDigest.String()) if err == nil && !ok { - warningMess := errors.New("There are no bindings can be set the status. Please check the SQL text") + warningMess := errors.NewNoStackError("There are no bindings can be set the status. Please check the SQL text") e.Ctx().GetSessionVars().StmtCtx.AppendWarning(warningMess) } return err } func (e *SQLBindExec) setBindingStatusByDigest() error { - ok, err := domain.GetDomain(e.Ctx()).BindHandle().SetBindRecordStatusByDigest(e.newStatus, e.sqlDigest) + ok, err := domain.GetDomain(e.Ctx()).BindHandle().SetGlobalBindingStatus(e.newStatus, e.sqlDigest) if err == nil && !ok { - warningMess := errors.New("There are no bindings can be set the status. Please check the SQL text") + warningMess := errors.NewNoStackError("There are no bindings can be set the status. Please check the SQL text") e.Ctx().GetSessionVars().StmtCtx.AppendWarning(warningMess) } return err @@ -143,39 +129,32 @@ func (e *SQLBindExec) createSQLBind() error { e.Ctx().GetSessionVars().StmtCtx = saveStmtCtx }() - bindInfo := bindinfo.Binding{ - BindSQL: e.bindSQL, - Charset: e.charset, - Collation: e.collation, - Status: bindinfo.Enabled, - Source: e.source, - SQLDigest: e.sqlDigest, - PlanDigest: e.planDigest, - } - record := &bindinfo.BindRecord{ + binding := bindinfo.Binding{ OriginalSQL: e.normdOrigSQL, Db: e.db, - Bindings: []bindinfo.Binding{bindInfo}, + BindSQL: e.bindSQL, + Charset: e.charset, + Collation: e.collation, + Status: bindinfo.Enabled, + Source: e.source, + SQLDigest: e.sqlDigest, + PlanDigest: e.planDigest, } if !e.isGlobal { - handle := e.Ctx().Value(bindinfo.SessionBindInfoKeyType).(*bindinfo.SessionHandle) - return handle.CreateBindRecord(e.Ctx(), record) + handle := e.Ctx().Value(bindinfo.SessionBindInfoKeyType).(bindinfo.SessionBindingHandle) + return handle.CreateSessionBinding(e.Ctx(), binding) } - return domain.GetDomain(e.Ctx()).BindHandle().CreateBindRecord(e.Ctx(), record) + return domain.GetDomain(e.Ctx()).BindHandle().CreateGlobalBinding(e.Ctx(), binding) } func (e *SQLBindExec) flushBindings() error { - return domain.GetDomain(e.Ctx()).BindHandle().FlushBindings() + return domain.GetDomain(e.Ctx()).BindHandle().FlushGlobalBindings() } func (e *SQLBindExec) captureBindings() { domain.GetDomain(e.Ctx()).BindHandle().CaptureBaselines() } -func (e *SQLBindExec) evolveBindings() error { - return domain.GetDomain(e.Ctx()).BindHandle().HandleEvolvePlanTask(e.Ctx(), true) -} - func (e *SQLBindExec) reloadBindings() error { - return domain.GetDomain(e.Ctx()).BindHandle().ReloadBindings() + return domain.GetDomain(e.Ctx()).BindHandle().LoadFromStorageToCache(true) } diff --git a/pkg/executor/brie.go b/pkg/executor/brie.go index b4c3577e0adff..8ff4a4e8d585d 100644 --- a/pkg/executor/brie.go +++ b/pkg/executor/brie.go @@ -38,7 +38,6 @@ import ( "github.com/pingcap/tidb/pkg/executor/internal/exec" "github.com/pingcap/tidb/pkg/expression" "github.com/pingcap/tidb/pkg/kv" - "github.com/pingcap/tidb/pkg/meta/autoid" "github.com/pingcap/tidb/pkg/parser/ast" "github.com/pingcap/tidb/pkg/parser/format" "github.com/pingcap/tidb/pkg/parser/model" @@ -101,7 +100,7 @@ func (p *brieTaskProgress) Close() { p.lock.Lock() current := atomic.LoadInt64(&p.current) if current < p.total { - p.cmd = fmt.Sprintf("%s Cacneled", p.cmd) + p.cmd = fmt.Sprintf("%s Canceled", p.cmd) } atomic.StoreInt64(&p.current, p.total) p.lock.Unlock() @@ -510,11 +509,11 @@ func (e *showMetaExec) Next(ctx context.Context, req *chunk.Chunk) error { req.AppendInt64(2, int64(table.KVCount)) req.AppendInt64(3, int64(table.KVSize)) if res.StartVersion > 0 { - req.AppendTime(4, types.NewTime(types.FromGoTime(startTime), mysql.TypeDatetime, 0)) + req.AppendTime(4, types.NewTime(types.FromGoTime(startTime.In(e.Ctx().GetSessionVars().Location())), mysql.TypeDatetime, 0)) } else { req.AppendNull(4) } - req.AppendTime(5, types.NewTime(types.FromGoTime(endTime), mysql.TypeDatetime, 0)) + req.AppendTime(5, types.NewTime(types.FromGoTime(endTime.In(e.Ctx().GetSessionVars().Location())), mysql.TypeDatetime, 0)) } return nil } @@ -564,7 +563,7 @@ func (e *BRIEExec) Next(ctx context.Context, req *chunk.Chunk) error { defer bq.releaseTask() e.info.execTime = types.CurrentTime(mysql.TypeDatetime) - glue := &tidbGlueSession{se: e.Ctx(), progress: progress, info: e.info} + glue := &tidbGlue{se: e.Ctx(), progress: progress, info: e.info} switch e.info.kind { case ast.BRIEKindBackup: @@ -632,25 +631,82 @@ func (e *ShowExec) fetchShowBRIE(kind ast.BRIEKind) error { return nil } -type tidbGlueSession struct { +type tidbGlue struct { + // the session context of the brie task se sessionctx.Context progress *brieTaskProgress info *brieTaskInfo } -// GetSessionCtx implements glue.Glue -func (gs *tidbGlueSession) GetSessionCtx() sessionctx.Context { - return gs.se -} - // GetDomain implements glue.Glue -func (gs *tidbGlueSession) GetDomain(_ kv.Storage) (*domain.Domain, error) { +func (gs *tidbGlue) GetDomain(_ kv.Storage) (*domain.Domain, error) { return domain.GetDomain(gs.se), nil } // CreateSession implements glue.Glue -func (gs *tidbGlueSession) CreateSession(_ kv.Storage) (glue.Session, error) { - return gs, nil +func (gs *tidbGlue) CreateSession(_ kv.Storage) (glue.Session, error) { + newSCtx, err := CreateSession(gs.se) + if err != nil { + return nil, err + } + return &tidbGlueSession{se: newSCtx}, nil +} + +// Open implements glue.Glue +func (gs *tidbGlue) Open(string, pd.SecurityOption) (kv.Storage, error) { + return gs.se.GetStore(), nil +} + +// OwnsStorage implements glue.Glue +func (*tidbGlue) OwnsStorage() bool { + return false +} + +// StartProgress implements glue.Glue +func (gs *tidbGlue) StartProgress(_ context.Context, cmdName string, total int64, _ bool) glue.Progress { + gs.progress.lock.Lock() + gs.progress.cmd = cmdName + gs.progress.total = total + atomic.StoreInt64(&gs.progress.current, 0) + gs.progress.lock.Unlock() + return gs.progress +} + +// Record implements glue.Glue +func (gs *tidbGlue) Record(name string, value uint64) { + switch name { + case "BackupTS": + gs.info.backupTS = value + case "RestoreTS": + gs.info.restoreTS = value + case "Size": + gs.info.archiveSize = value + } +} + +func (*tidbGlue) GetVersion() string { + return "TiDB\n" + printer.GetTiDBInfo() +} + +// UseOneShotSession implements glue.Glue +func (gs *tidbGlue) UseOneShotSession(_ kv.Storage, _ bool, fn func(se glue.Session) error) error { + // In SQL backup, we don't need to close domain, + // but need to create an new session. + newSCtx, err := CreateSession(gs.se) + if err != nil { + return err + } + glueSession := &tidbGlueSession{se: newSCtx} + defer func() { + CloseSession(newSCtx) + log.Info("one shot session from brie closed") + }() + return fn(glueSession) +} + +type tidbGlueSession struct { + // the session context of the brie task's subtask, such as `CREATE TABLE`. + se sessionctx.Context } // Execute implements glue.Session @@ -672,46 +728,24 @@ func (gs *tidbGlueSession) ExecuteInternal(ctx context.Context, sql string, args // CreateDatabase implements glue.Session func (gs *tidbGlueSession) CreateDatabase(_ context.Context, schema *model.DBInfo) error { - d := domain.GetDomain(gs.se).DDL() - // 512 is defaultCapOfCreateTable. - result := bytes.NewBuffer(make([]byte, 0, 512)) - if err := ConstructResultOfShowCreateDatabase(gs.se, schema, true, result); err != nil { - return err - } - gs.se.SetValue(sessionctx.QueryString, result.String()) - schema = schema.Clone() - if len(schema.Charset) == 0 { - schema.Charset = mysql.DefaultCharset - } - return d.CreateSchemaWithInfo(gs.se, schema, ddl.OnExistIgnore) + return BRIECreateDatabase(gs.se, schema, "") } // CreateTable implements glue.Session func (gs *tidbGlueSession) CreateTable(_ context.Context, dbName model.CIStr, table *model.TableInfo, cs ...ddl.CreateTableWithInfoConfigurier) error { - d := domain.GetDomain(gs.se).DDL() - - // 512 is defaultCapOfCreateTable. - result := bytes.NewBuffer(make([]byte, 0, 512)) - if err := ConstructResultOfShowCreateTable(gs.se, table, autoid.Allocators{}, result); err != nil { - return err - } - gs.se.SetValue(sessionctx.QueryString, result.String()) - // Disable foreign key check when batch create tables. - gs.se.GetSessionVars().ForeignKeyChecks = false - - // Clone() does not clone partitions yet :( - table = table.Clone() - if table.Partition != nil { - newPartition := *table.Partition - newPartition.Definitions = append([]model.PartitionDefinition{}, table.Partition.Definitions...) - table.Partition = &newPartition - } + return BRIECreateTable(gs.se, dbName, table, "", cs...) +} - return d.CreateTableWithInfo(gs.se, dbName, table, append(cs, ddl.OnExistIgnore)...) +// CreateTables implements glue.BatchCreateTableSession. +func (gs *tidbGlueSession) CreateTables(_ context.Context, + tables map[string][]*model.TableInfo, cs ...ddl.CreateTableWithInfoConfigurier) error { + return BRIECreateTables(gs.se, tables, "", cs...) } // CreatePlacementPolicy implements glue.Session func (gs *tidbGlueSession) CreatePlacementPolicy(_ context.Context, policy *model.PolicyInfo) error { + originQueryString := gs.se.Value(sessionctx.QueryString) + defer gs.se.SetValue(sessionctx.QueryString, originQueryString) gs.se.SetValue(sessionctx.QueryString, ConstructResultOfShowCreatePlacementPolicy(policy)) d := domain.GetDomain(gs.se).DDL() // the default behaviour is ignoring duplicated policy during restore. @@ -719,7 +753,8 @@ func (gs *tidbGlueSession) CreatePlacementPolicy(_ context.Context, policy *mode } // Close implements glue.Session -func (*tidbGlueSession) Close() { +func (gs *tidbGlueSession) Close() { + CloseSession(gs.se) } // GetGlobalVariables implements glue.Session. @@ -727,46 +762,9 @@ func (gs *tidbGlueSession) GetGlobalVariable(name string) (string, error) { return gs.se.GetSessionVars().GlobalVarsAccessor.GetTiDBTableValue(name) } -// Open implements glue.Glue -func (gs *tidbGlueSession) Open(string, pd.SecurityOption) (kv.Storage, error) { - return gs.se.GetStore(), nil -} - -// OwnsStorage implements glue.Glue -func (*tidbGlueSession) OwnsStorage() bool { - return false -} - -// StartProgress implements glue.Glue -func (gs *tidbGlueSession) StartProgress(_ context.Context, cmdName string, total int64, _ bool) glue.Progress { - gs.progress.lock.Lock() - gs.progress.cmd = cmdName - gs.progress.total = total - atomic.StoreInt64(&gs.progress.current, 0) - gs.progress.lock.Unlock() - return gs.progress -} - -// Record implements glue.Glue -func (gs *tidbGlueSession) Record(name string, value uint64) { - switch name { - case "BackupTS": - gs.info.backupTS = value - case "RestoreTS": - gs.info.restoreTS = value - case "Size": - gs.info.archiveSize = value - } -} - -func (*tidbGlueSession) GetVersion() string { - return "TiDB\n" + printer.GetTiDBInfo() -} - -// UseOneShotSession implements glue.Glue -func (gs *tidbGlueSession) UseOneShotSession(_ kv.Storage, _ bool, fn func(se glue.Session) error) error { - // in SQL backup. we don't need to close domain. - return fn(gs) +// GetSessionCtx implements glue.Glue +func (gs *tidbGlueSession) GetSessionCtx() sessionctx.Context { + return gs.se } func restoreQuery(stmt *ast.BRIEStmt) string { diff --git a/pkg/executor/brie_test.go b/pkg/executor/brie_test.go index fc72e98a13ce9..266144bcf2c10 100644 --- a/pkg/executor/brie_test.go +++ b/pkg/executor/brie_test.go @@ -36,7 +36,7 @@ import ( ) func TestGlueGetVersion(t *testing.T) { - g := tidbGlueSession{} + g := tidbGlue{} version := g.GetVersion() require.Contains(t, version, `Release Version`) require.Contains(t, version, `Git Commit Hash`) diff --git a/pkg/executor/brie_utils.go b/pkg/executor/brie_utils.go new file mode 100644 index 0000000000000..81ee8251add6b --- /dev/null +++ b/pkg/executor/brie_utils.go @@ -0,0 +1,183 @@ +// Copyright 2023 PingCAP, 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. + +package executor + +import ( + "bytes" + "strings" + + "github.com/pingcap/errors" + "github.com/pingcap/log" + "github.com/pingcap/tidb/pkg/ddl" + "github.com/pingcap/tidb/pkg/domain" + "github.com/pingcap/tidb/pkg/kv" + "github.com/pingcap/tidb/pkg/meta/autoid" + "github.com/pingcap/tidb/pkg/parser/model" + "github.com/pingcap/tidb/pkg/parser/mysql" + "github.com/pingcap/tidb/pkg/sessionctx" + "go.uber.org/zap" +) + +const ( + defaultCapOfCreateTable = 512 + defaultCapOfCreateDatabase = 64 +) + +// SplitBatchCreateTableForTest is only used for test. +var SplitBatchCreateTableForTest = splitBatchCreateTable + +// showRestoredCreateDatabase shows the result of SHOW CREATE DATABASE from a dbInfo. +func showRestoredCreateDatabase(sctx sessionctx.Context, db *model.DBInfo, brComment string) (string, error) { + result := bytes.NewBuffer(make([]byte, 0, defaultCapOfCreateDatabase)) + if len(brComment) > 0 { + // this can never fail. + _, _ = result.WriteString(brComment) + } + if err := ConstructResultOfShowCreateDatabase(sctx, db, true, result); err != nil { + return "", errors.Trace(err) + } + return result.String(), nil +} + +// BRIECreateDatabase creates the database with OnExistIgnore option +func BRIECreateDatabase(sctx sessionctx.Context, schema *model.DBInfo, brComment string) error { + d := domain.GetDomain(sctx).DDL() + query, err := showRestoredCreateDatabase(sctx, schema, brComment) + if err != nil { + return errors.Trace(err) + } + originQuery := sctx.Value(sessionctx.QueryString) + sctx.SetValue(sessionctx.QueryString, query) + defer func() { + sctx.SetValue(sessionctx.QueryString, originQuery) + }() + + schema = schema.Clone() + if len(schema.Charset) == 0 { + schema.Charset = mysql.DefaultCharset + } + return d.CreateSchemaWithInfo(sctx, schema, ddl.OnExistIgnore) +} + +// showRestoredCreateTable shows the result of SHOW CREATE TABLE from a tableInfo. +func showRestoredCreateTable(sctx sessionctx.Context, tbl *model.TableInfo, brComment string) (string, error) { + result := bytes.NewBuffer(make([]byte, 0, defaultCapOfCreateTable)) + if len(brComment) > 0 { + // this can never fail. + _, _ = result.WriteString(brComment) + } + if err := ConstructResultOfShowCreateTable(sctx, tbl, autoid.Allocators{}, result); err != nil { + return "", err + } + return result.String(), nil +} + +// BRIECreateTable creates the table with OnExistIgnore option +func BRIECreateTable( + sctx sessionctx.Context, + dbName model.CIStr, + table *model.TableInfo, + brComment string, + cs ...ddl.CreateTableWithInfoConfigurier, +) error { + d := domain.GetDomain(sctx).DDL() + query, err := showRestoredCreateTable(sctx, table, brComment) + if err != nil { + return err + } + originQuery := sctx.Value(sessionctx.QueryString) + sctx.SetValue(sessionctx.QueryString, query) + // Disable foreign key check when batch create tables. + originForeignKeyChecks := sctx.GetSessionVars().ForeignKeyChecks + sctx.GetSessionVars().ForeignKeyChecks = false + defer func() { + sctx.SetValue(sessionctx.QueryString, originQuery) + sctx.GetSessionVars().ForeignKeyChecks = originForeignKeyChecks + }() + + table = table.Clone() + + return d.CreateTableWithInfo(sctx, dbName, table, append(cs, ddl.OnExistIgnore)...) +} + +// BRIECreateTables creates the tables with OnExistIgnore option in batch +func BRIECreateTables( + sctx sessionctx.Context, + tables map[string][]*model.TableInfo, + brComment string, + cs ...ddl.CreateTableWithInfoConfigurier, +) error { + // Disable foreign key check when batch create tables. + originForeignKeyChecks := sctx.GetSessionVars().ForeignKeyChecks + sctx.GetSessionVars().ForeignKeyChecks = false + originQuery := sctx.Value(sessionctx.QueryString) + defer func() { + sctx.SetValue(sessionctx.QueryString, originQuery) + sctx.GetSessionVars().ForeignKeyChecks = originForeignKeyChecks + }() + for db, tablesInDB := range tables { + dbName := model.NewCIStr(db) + queryBuilder := strings.Builder{} + cloneTables := make([]*model.TableInfo, 0, len(tablesInDB)) + for _, table := range tablesInDB { + query, err := showRestoredCreateTable(sctx, table, brComment) + if err != nil { + return errors.Trace(err) + } + + queryBuilder.WriteString(query) + queryBuilder.WriteString(";") + + cloneTables = append(cloneTables, table.Clone()) + } + sctx.SetValue(sessionctx.QueryString, queryBuilder.String()) + if err := splitBatchCreateTable(sctx, dbName, cloneTables, cs...); err != nil { + //It is possible to failure when TiDB does not support model.ActionCreateTables. + //In this circumstance, BatchCreateTableWithInfo returns errno.ErrInvalidDDLJob, + //we fall back to old way that creating table one by one + log.Warn("batch create table from tidb failure", zap.Error(err)) + return err + } + } + + return nil +} + +// splitBatchCreateTable provide a way to split batch into small batch when batch size is large than 6 MB. +// The raft entry has limit size of 6 MB, a batch of CreateTables may hit this limitation +// TODO: shall query string be set for each split batch create, it looks does not matter if we set once for all. +func splitBatchCreateTable(sctx sessionctx.Context, schema model.CIStr, + infos []*model.TableInfo, cs ...ddl.CreateTableWithInfoConfigurier) error { + var err error + d := domain.GetDomain(sctx).DDL() + err = d.BatchCreateTableWithInfo(sctx, schema, infos, append(cs, ddl.OnExistIgnore)...) + if kv.ErrEntryTooLarge.Equal(err) { + log.Info("entry too large, split batch create table", zap.Int("num table", len(infos))) + if len(infos) == 1 { + return err + } + mid := len(infos) / 2 + err = splitBatchCreateTable(sctx, schema, infos[:mid], cs...) + if err != nil { + return err + } + err = splitBatchCreateTable(sctx, schema, infos[mid:], cs...) + if err != nil { + return err + } + return nil + } + return err +} diff --git a/pkg/executor/brie_utils_test.go b/pkg/executor/brie_utils_test.go new file mode 100644 index 0000000000000..4489c1d280158 --- /dev/null +++ b/pkg/executor/brie_utils_test.go @@ -0,0 +1,322 @@ +// Copyright 2023 PingCAP, 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. + +package executor_test + +import ( + "context" + "fmt" + "strconv" + "testing" + + "github.com/pingcap/failpoint" + "github.com/pingcap/tidb/pkg/ddl" + "github.com/pingcap/tidb/pkg/executor" + "github.com/pingcap/tidb/pkg/kv" + "github.com/pingcap/tidb/pkg/meta" + "github.com/pingcap/tidb/pkg/parser" + "github.com/pingcap/tidb/pkg/parser/ast" + "github.com/pingcap/tidb/pkg/parser/model" + "github.com/pingcap/tidb/pkg/sessionctx" + "github.com/pingcap/tidb/pkg/testkit" + "github.com/stretchr/testify/require" +) + +// batch create table with table id reused +func TestSplitBatchCreateTableWithTableId(t *testing.T) { + store, dom := testkit.CreateMockStoreAndDomain(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("drop table if exists table_id_resued1") + tk.MustExec("drop table if exists table_id_resued2") + tk.MustExec("drop table if exists table_id_new") + + d := dom.DDL() + require.NotNil(t, d) + + infos1 := []*model.TableInfo{} + infos1 = append(infos1, &model.TableInfo{ + ID: 124, + Name: model.NewCIStr("table_id_resued1"), + }) + infos1 = append(infos1, &model.TableInfo{ + ID: 125, + Name: model.NewCIStr("table_id_resued2"), + }) + + sctx := tk.Session() + + // keep/reused table id verification + sctx.SetValue(sessionctx.QueryString, "skip") + err := executor.SplitBatchCreateTableForTest(sctx, model.NewCIStr("test"), infos1, ddl.AllocTableIDIf(func(ti *model.TableInfo) bool { + return false + })) + require.NoError(t, err) + require.Equal(t, "skip", sctx.Value(sessionctx.QueryString)) + + tk.MustQuery("select tidb_table_id from information_schema.tables where table_name = 'table_id_resued1'"). + Check(testkit.Rows("124")) + tk.MustQuery("select tidb_table_id from information_schema.tables where table_name = 'table_id_resued2'"). + Check(testkit.Rows("125")) + ctx := kv.WithInternalSourceType(context.Background(), kv.InternalTxnOthers) + + // allocate new table id verification + // query the global id + var id int64 + err = kv.RunInNewTxn(ctx, store, true, func(_ context.Context, txn kv.Transaction) error { + m := meta.NewMeta(txn) + var err error + id, err = m.GenGlobalID() + return err + }) + + require.NoError(t, err) + + infos2 := []*model.TableInfo{} + infos2 = append(infos2, &model.TableInfo{ + ID: 124, + Name: model.NewCIStr("table_id_new"), + }) + + tk.Session().SetValue(sessionctx.QueryString, "skip") + err = executor.SplitBatchCreateTableForTest(sctx, model.NewCIStr("test"), infos2, ddl.AllocTableIDIf(func(ti *model.TableInfo) bool { + return true + })) + require.NoError(t, err) + require.Equal(t, "skip", sctx.Value(sessionctx.QueryString)) + + idGen, ok := tk.MustQuery( + "select tidb_table_id from information_schema.tables where table_name = 'table_id_new'"). + Rows()[0][0].(string) + require.True(t, ok) + idGenNum, err := strconv.ParseInt(idGen, 10, 64) + require.NoError(t, err) + require.Greater(t, idGenNum, id) + + // a empty table info with len(info3) = 0 + infos3 := []*model.TableInfo{} + + originQueryString := sctx.Value(sessionctx.QueryString) + err = executor.SplitBatchCreateTableForTest(sctx, model.NewCIStr("test"), infos3, ddl.AllocTableIDIf(func(ti *model.TableInfo) bool { + return false + })) + require.NoError(t, err) + require.Equal(t, originQueryString, sctx.Value(sessionctx.QueryString)) +} + +// batch create table with table id reused +func TestSplitBatchCreateTable(t *testing.T) { + store, dom := testkit.CreateMockStoreAndDomain(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("drop table if exists table_1") + tk.MustExec("drop table if exists table_2") + tk.MustExec("drop table if exists table_3") + + d := dom.DDL() + require.NotNil(t, d) + + infos := []*model.TableInfo{} + infos = append(infos, &model.TableInfo{ + ID: 1234, + Name: model.NewCIStr("tables_1"), + }) + infos = append(infos, &model.TableInfo{ + ID: 1235, + Name: model.NewCIStr("tables_2"), + }) + infos = append(infos, &model.TableInfo{ + ID: 1236, + Name: model.NewCIStr("tables_3"), + }) + + sctx := tk.Session() + + // keep/reused table id verification + tk.Session().SetValue(sessionctx.QueryString, "skip") + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/ddl/RestoreBatchCreateTableEntryTooLarge", "return(1)")) + err := executor.SplitBatchCreateTableForTest(sctx, model.NewCIStr("test"), infos, ddl.AllocTableIDIf(func(ti *model.TableInfo) bool { + return false + })) + require.NoError(t, err) + require.Equal(t, "skip", sctx.Value(sessionctx.QueryString)) + + tk.MustQuery("show tables like '%tables_%'").Check(testkit.Rows("tables_1", "tables_2", "tables_3")) + jobs := tk.MustQuery("admin show ddl jobs").Rows() + require.Greater(t, len(jobs), 3) + // check table_1 + job1 := jobs[0] + require.Equal(t, "test", job1[1]) + require.Equal(t, "tables_3", job1[2]) + require.Equal(t, "create tables", job1[3]) + require.Equal(t, "public", job1[4]) + + // check table_2 + job2 := jobs[1] + require.Equal(t, "test", job2[1]) + require.Equal(t, "tables_2", job2[2]) + require.Equal(t, "create tables", job2[3]) + require.Equal(t, "public", job2[4]) + + // check table_3 + job3 := jobs[2] + require.Equal(t, "test", job3[1]) + require.Equal(t, "tables_1", job3[2]) + require.Equal(t, "create tables", job3[3]) + require.Equal(t, "public", job3[4]) + + // check reused table id + tk.MustQuery("select tidb_table_id from information_schema.tables where table_name = 'tables_1'"). + Check(testkit.Rows("1234")) + tk.MustQuery("select tidb_table_id from information_schema.tables where table_name = 'tables_2'"). + Check(testkit.Rows("1235")) + tk.MustQuery("select tidb_table_id from information_schema.tables where table_name = 'tables_3'"). + Check(testkit.Rows("1236")) + + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/ddl/RestoreBatchCreateTableEntryTooLarge")) +} + +// batch create table with table id reused +func TestSplitBatchCreateTableFailWithEntryTooLarge(t *testing.T) { + store, dom := testkit.CreateMockStoreAndDomain(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("drop table if exists table_1") + tk.MustExec("drop table if exists table_2") + tk.MustExec("drop table if exists table_3") + + d := dom.DDL() + require.NotNil(t, d) + + infos := []*model.TableInfo{} + infos = append(infos, &model.TableInfo{ + Name: model.NewCIStr("tables_1"), + }) + infos = append(infos, &model.TableInfo{ + Name: model.NewCIStr("tables_2"), + }) + infos = append(infos, &model.TableInfo{ + Name: model.NewCIStr("tables_3"), + }) + + sctx := tk.Session() + + tk.Session().SetValue(sessionctx.QueryString, "skip") + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/ddl/RestoreBatchCreateTableEntryTooLarge", "return(0)")) + err := executor.SplitBatchCreateTableForTest(sctx, model.NewCIStr("test"), infos, ddl.AllocTableIDIf(func(ti *model.TableInfo) bool { + return true + })) + require.Equal(t, "skip", sctx.Value(sessionctx.QueryString)) + require.True(t, kv.ErrEntryTooLarge.Equal(err)) + + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/ddl/RestoreBatchCreateTableEntryTooLarge")) +} + +func TestBRIECreateDatabase(t *testing.T) { + store, dom := testkit.CreateMockStoreAndDomain(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("drop database if exists db_1") + tk.MustExec("drop database if exists db_1") + + d := dom.DDL() + require.NotNil(t, d) + + sctx := tk.Session() + originQueryString := sctx.Value(sessionctx.QueryString) + schema1 := &model.DBInfo{ + ID: 1230, + Name: model.NewCIStr("db_1"), + Charset: "utf8mb4", + Collate: "utf8mb4_bin", + State: model.StatePublic, + } + err := executor.BRIECreateDatabase(sctx, schema1, "/* from test */") + require.NoError(t, err) + + schema2 := &model.DBInfo{ + ID: 1240, + Name: model.NewCIStr("db_2"), + Charset: "utf8mb4", + Collate: "utf8mb4_bin", + State: model.StatePublic, + } + err = executor.BRIECreateDatabase(sctx, schema2, "") + require.NoError(t, err) + require.Equal(t, originQueryString, sctx.Value(sessionctx.QueryString)) + tk.MustExec("use db_1") + tk.MustExec("use db_2") +} + +func mockTableInfo(t *testing.T, sctx sessionctx.Context, createSQL string) *model.TableInfo { + node, err := parser.New().ParseOneStmt(createSQL, "", "") + require.NoError(t, err) + info, err := ddl.MockTableInfo(sctx, node.(*ast.CreateTableStmt), 1) + require.NoError(t, err) + info.State = model.StatePublic + return info +} + +func TestBRIECreateTable(t *testing.T) { + store, dom := testkit.CreateMockStoreAndDomain(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("drop table if exists table_1") + tk.MustExec("drop table if exists table_2") + + d := dom.DDL() + require.NotNil(t, d) + + sctx := tk.Session() + originQueryString := sctx.Value(sessionctx.QueryString) + dbName := model.NewCIStr("test") + tableInfo := mockTableInfo(t, sctx, "create table test.table_1 (a int primary key, b json, c varchar(20))") + tableInfo.ID = 1230 + err := executor.BRIECreateTable(sctx, dbName, tableInfo, "/* from test */") + require.NoError(t, err) + + tableInfo.ID = 1240 + tableInfo.Name = model.NewCIStr("table_2") + err = executor.BRIECreateTable(sctx, dbName, tableInfo, "") + require.NoError(t, err) + require.Equal(t, originQueryString, sctx.Value(sessionctx.QueryString)) + tk.MustExec("desc table_1") + tk.MustExec("desc table_2") +} + +func TestBRIECreateTables(t *testing.T) { + store, dom := testkit.CreateMockStoreAndDomain(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tableInfos := make([]*model.TableInfo, 100) + for i := range tableInfos { + tk.MustExec(fmt.Sprintf("drop table if exists table_%d", i)) + } + + d := dom.DDL() + require.NotNil(t, d) + + sctx := tk.Session() + originQueryString := sctx.Value(sessionctx.QueryString) + for i := range tableInfos { + tableInfos[i] = mockTableInfo(t, sctx, fmt.Sprintf("create table test.table_%d (a int primary key, b json, c varchar(20))", i)) + tableInfos[i].ID = 1230 + int64(i) + } + err := executor.BRIECreateTables(sctx, map[string][]*model.TableInfo{"test": tableInfos}, "/* from test */") + require.NoError(t, err) + + require.Equal(t, originQueryString, sctx.Value(sessionctx.QueryString)) + for i := range tableInfos { + tk.MustExec(fmt.Sprintf("desc table_%d", i)) + } +} diff --git a/pkg/executor/builder.go b/pkg/executor/builder.go index f2078aa6858f6..d367c0803eddd 100644 --- a/pkg/executor/builder.go +++ b/pkg/executor/builder.go @@ -84,7 +84,6 @@ import ( "github.com/tikv/client-go/v2/tikv" "github.com/tikv/client-go/v2/txnkv" "github.com/tikv/client-go/v2/txnkv/txnsnapshot" - clientutil "github.com/tikv/client-go/v2/util" ) // executorBuilder builds an Executor from a Plan. @@ -926,12 +925,6 @@ func (b *executorBuilder) buildSimple(v *plannercore.Simple) exec.Executor { BaseExecutor: exec.NewBaseExecutor(b.ctx, v.Schema(), 0), QueryWatchOptionList: s.QueryWatchOptionList, } - case *ast.LoadDataActionStmt: - return &LoadDataActionExec{ - BaseExecutor: exec.NewBaseExecutor(b.ctx, nil, 0), - tp: s.Tp, - jobID: s.JobID, - } case *ast.ImportIntoActionStmt: return &ImportIntoActionExec{ BaseExecutor: exec.NewBaseExecutor(b.ctx, nil, 0), @@ -1032,14 +1025,26 @@ func (b *executorBuilder) buildImportInto(v *plannercore.ImportInto) exec.Execut return nil } - base := exec.NewBaseExecutor(b.ctx, v.Schema(), v.ID()) - exec, err := newImportIntoExec(base, b.ctx, v, tbl) + var ( + selectExec exec.Executor + base exec.BaseExecutor + ) + if v.SelectPlan != nil { + selectExec = b.build(v.SelectPlan) + if b.err != nil { + return nil + } + base = exec.NewBaseExecutor(b.ctx, v.Schema(), v.ID(), selectExec) + } else { + base = exec.NewBaseExecutor(b.ctx, v.Schema(), v.ID()) + } + executor, err := newImportIntoExec(base, selectExec, b.ctx, v, tbl) if err != nil { b.err = err return nil } - return exec + return executor } func (b *executorBuilder) buildLoadData(v *plannercore.LoadData) exec.Executor { @@ -1318,22 +1323,6 @@ func (b *executorBuilder) buildExplain(v *plannercore.Explain) exec.Executor { if b.ctx.GetSessionVars().StmtCtx.RuntimeStatsColl == nil { b.ctx.GetSessionVars().StmtCtx.RuntimeStatsColl = execdetails.NewRuntimeStatsColl(nil) } - // If the resource group name is not empty, we could collect and display the RU - // runtime stats for analyze executor. - resourceGroupName := b.ctx.GetSessionVars().ResourceGroupName - // Try to register the RU runtime stats for analyze executor. - if store, ok := b.ctx.GetStore().(interface { - CreateRURuntimeStats(uint64) *clientutil.RURuntimeStats - }); len(resourceGroupName) > 0 && ok { - // StartTS will be used to identify this SQL, so that the runtime stats could - // aggregate the RU stats beneath the KV storage client. - startTS, err := b.getSnapshotTS() - if err != nil { - b.err = err - return nil - } - explainExec.ruRuntimeStats = store.CreateRURuntimeStats(startTS) - } explainExec.analyzeExec = b.build(v.TargetPlan) } return explainExec @@ -1776,7 +1765,7 @@ func (b *executorBuilder) buildHashAgg(v *plannercore.PhysicalHashAgg) exec.Exec e.DefaultVal = nil } else { if v.IsFinalAgg() { - e.DefaultVal = e.Ctx().GetSessionVars().GetNewChunkWithCapacity(exec.RetTypes(e), 1, 1, e.AllocPool) + e.DefaultVal = e.AllocPool.Alloc(exec.RetTypes(e), 1, 1) } } for _, aggDesc := range v.AggFuncs { @@ -1839,7 +1828,7 @@ func (b *executorBuilder) buildStreamAgg(v *plannercore.PhysicalStreamAgg) exec. } else { // Only do this for final agg, see issue #35295, #30923 if v.IsFinalAgg() { - e.DefaultVal = e.Ctx().GetSessionVars().GetNewChunkWithCapacity(exec.RetTypes(e), 1, 1, e.AllocPool) + e.DefaultVal = e.AllocPool.Alloc(exec.RetTypes(e), 1, 1) } } for i, aggDesc := range v.AggFuncs { @@ -1943,7 +1932,7 @@ func (b *executorBuilder) getSnapshot() (kv.Snapshot, error) { snapshot.SetOption(kv.ReadReplicaScope, b.readReplicaScope) snapshot.SetOption(kv.TaskID, sessVars.StmtCtx.TaskID) snapshot.SetOption(kv.TiKVClientReadTimeout, sessVars.GetTiKVClientReadTimeout()) - snapshot.SetOption(kv.ResourceGroupName, sessVars.ResourceGroupName) + snapshot.SetOption(kv.ResourceGroupName, sessVars.StmtCtx.ResourceGroupName) snapshot.SetOption(kv.ExplicitRequestSourceType, sessVars.ExplicitRequestSourceType) if replicaReadType.IsClosestRead() && b.readReplicaScope != kv.GlobalTxnScope { @@ -2120,7 +2109,8 @@ func (b *executorBuilder) buildMemTable(v *plannercore.PhysicalMemTable) exec.Ex strings.ToLower(infoschema.TableResourceGroups), strings.ToLower(infoschema.TableRunawayWatches), strings.ToLower(infoschema.TableCheckConstraints), - strings.ToLower(infoschema.TableTiDBCheckConstraints): + strings.ToLower(infoschema.TableTiDBCheckConstraints), + strings.ToLower(infoschema.TableKeywords): return &MemTableReaderExec{ BaseExecutor: exec.NewBaseExecutor(b.ctx, v.Schema(), v.ID()), table: v.Table, @@ -2673,7 +2663,7 @@ func (b *executorBuilder) buildAnalyzeSamplingPushdown( if *sampleRate < 0 { *sampleRate, sampleRateReason = b.getAdjustedSampleRate(task) if task.PartitionName != "" { - sc.AppendNote(errors.Errorf( + sc.AppendNote(errors.NewNoStackErrorf( `Analyze use auto adjusted sample rate %f for table %s.%s's partition %s, reason to use this rate is "%s"`, *sampleRate, task.DBName, @@ -2682,7 +2672,7 @@ func (b *executorBuilder) buildAnalyzeSamplingPushdown( sampleRateReason, )) } else { - sc.AppendNote(errors.Errorf( + sc.AppendNote(errors.NewNoStackErrorf( `Analyze use auto adjusted sample rate %f for table %s.%s, reason to use this rate is "%s"`, *sampleRate, task.DBName, @@ -2698,11 +2688,17 @@ func (b *executorBuilder) buildAnalyzeSamplingPushdown( PartitionName: task.PartitionName, SampleRateReason: sampleRateReason, } - + var concurrency int + if b.ctx.GetSessionVars().InRestrictedSQL { + // In restricted SQL, we use the default value of DistSQLScanConcurrency. it is copied from tidb_sysproc_scan_concurrency. + concurrency = b.ctx.GetSessionVars().DistSQLScanConcurrency() + } else { + concurrency = b.ctx.GetSessionVars().AnalyzeDistSQLScanConcurrency() + } base := baseAnalyzeExec{ ctx: b.ctx, tableID: task.TableID, - concurrency: b.ctx.GetSessionVars().DistSQLScanConcurrency(), + concurrency: concurrency, analyzePB: &tipb.AnalyzeReq{ Tp: tipb.AnalyzeType_TypeFullSampling, Flags: sc.PushDownFlags(), @@ -2832,11 +2828,17 @@ func (b *executorBuilder) buildAnalyzeColumnsPushdown( failpoint.Inject("injectAnalyzeSnapshot", func(val failpoint.Value) { startTS = uint64(val.(int)) }) - + var concurrency int + if b.ctx.GetSessionVars().InRestrictedSQL { + // In restricted SQL, we use the default value of DistSQLScanConcurrency. it is copied from tidb_sysproc_scan_concurrency. + concurrency = b.ctx.GetSessionVars().DistSQLScanConcurrency() + } else { + concurrency = b.ctx.GetSessionVars().AnalyzeDistSQLScanConcurrency() + } base := baseAnalyzeExec{ ctx: b.ctx, tableID: task.TableID, - concurrency: b.ctx.GetSessionVars().DistSQLScanConcurrency(), + concurrency: concurrency, analyzePB: &tipb.AnalyzeReq{ Tp: tipb.AnalyzeType_TypeColumn, Flags: sc.PushDownFlags(), @@ -2959,13 +2961,18 @@ func markChildrenUsedCols(outputCols []*expression.Column, childSchemas ...*expr func (*executorBuilder) corColInDistPlan(plans []plannercore.PhysicalPlan) bool { for _, p := range plans { - x, ok := p.(*plannercore.PhysicalSelection) - if !ok { - continue - } - for _, cond := range x.Conditions { - if len(expression.ExtractCorColumns(cond)) > 0 { - return true + switch x := p.(type) { + case *plannercore.PhysicalSelection: + for _, cond := range x.Conditions { + if len(expression.ExtractCorColumns(cond)) > 0 { + return true + } + } + case *plannercore.PhysicalTableScan: + for _, cond := range x.LateMaterializationFilterCondition { + if len(expression.ExtractCorColumns(cond)) > 0 { + return true + } } } } @@ -3409,12 +3416,16 @@ func (b *executorBuilder) buildTableReader(v *plannercore.PhysicalTableReader) e failpoint.Return(nil) } }) + // https://github.com/pingcap/tidb/issues/50358 + if len(v.Schema().Columns) == 0 && len(v.GetTablePlan().Schema().Columns) > 0 { + v.SetSchema(v.GetTablePlan().Schema()) + } useMPP := useMPPExecution(b.ctx, v) useTiFlashBatchCop := v.ReadReqType == plannercore.BatchCop useTiFlash := useMPP || useTiFlashBatchCop if useTiFlash { if _, isTiDBZoneLabelSet := config.GetGlobalConfig().Labels[placement.DCLabelKey]; b.ctx.GetSessionVars().TiFlashReplicaRead != tiflash.AllReplicas && !isTiDBZoneLabelSet { - b.ctx.GetSessionVars().StmtCtx.AppendWarning(errors.Errorf("the variable tiflash_replica_read is ignored, because the entry TiDB[%s] does not set the zone attribute and tiflash_replica_read is '%s'", config.GetGlobalConfig().AdvertiseAddress, tiflash.GetTiFlashReplicaRead(b.ctx.GetSessionVars().TiFlashReplicaRead))) + b.ctx.GetSessionVars().StmtCtx.AppendWarning(errors.NewNoStackErrorf("the variable tiflash_replica_read is ignored, because the entry TiDB[%s] does not set the zone attribute and tiflash_replica_read is '%s'", config.GetGlobalConfig().AdvertiseAddress, tiflash.GetTiFlashReplicaRead(b.ctx.GetSessionVars().TiFlashReplicaRead))) } } if useMPP { @@ -3458,7 +3469,7 @@ func (b *executorBuilder) buildTableReader(v *plannercore.PhysicalTableReader) e tmp, _ := b.is.TableByID(ts.Table.ID) tbl := tmp.(table.PartitionedTable) - partitions, err := partitionPruning(b.ctx, tbl, v.PartitionInfo.PruningConds, v.PartitionInfo.PartitionNames, v.PartitionInfo.Columns, v.PartitionInfo.ColumnNames) + partitions, err := partitionPruning(b.ctx, tbl, &v.PlanPartInfo) if err != nil { b.err = err return nil @@ -3468,7 +3479,7 @@ func (b *executorBuilder) buildTableReader(v *plannercore.PhysicalTableReader) e } if len(partitions) == 0 { - return &TableDualExec{BaseExecutor: *ret.Base()} + return &TableDualExec{BaseExecutor: ret.BaseExecutor} } // Sort the partition is necessary to make the final multiple partition key ranges ordered. @@ -3544,14 +3555,14 @@ func getPartitionKeyColOffsets(keyColIDs []int64, pt table.PartitionedTable) []i return keyColOffsets } -func (builder *dataReaderBuilder) prunePartitionForInnerExecutor(tbl table.Table, partitionInfo *plannercore.PartitionInfo, +func (builder *dataReaderBuilder) prunePartitionForInnerExecutor(tbl table.Table, physPlanPartInfo *plannercore.PhysPlanPartInfo, lookUpContent []*indexJoinLookUpContent) (usedPartition []table.PhysicalTable, canPrune bool, contentPos []int64, err error) { partitionTbl := tbl.(table.PartitionedTable) // In index join, this is called by multiple goroutines simultaneously, but partitionPruning is not thread-safe. // Use once.Do to avoid DATA RACE here. // TODO: condition based pruning can be do in advance. - condPruneResult, err := builder.partitionPruning(partitionTbl, partitionInfo.PruningConds, partitionInfo.PartitionNames, partitionInfo.Columns, partitionInfo.ColumnNames) + condPruneResult, err := builder.partitionPruning(partitionTbl, physPlanPartInfo) if err != nil { return nil, false, nil, err } @@ -3697,7 +3708,7 @@ func (b *executorBuilder) buildIndexReader(v *plannercore.PhysicalIndexReader) e b.err = exeerrors.ErrBuildExecutor return nil } - ret.partitionIDMap, err = getPartitionIdsAfterPruning(b.ctx, tbl, &v.PartitionInfo) + ret.partitionIDMap, err = getPartitionIdsAfterPruning(b.ctx, tbl, &v.PlanPartInfo) if err != nil { b.err = err return nil @@ -3707,7 +3718,7 @@ func (b *executorBuilder) buildIndexReader(v *plannercore.PhysicalIndexReader) e tmp, _ := b.is.TableByID(is.Table.ID) tbl := tmp.(table.PartitionedTable) - partitions, err := partitionPruning(b.ctx, tbl, v.PartitionInfo.PruningConds, v.PartitionInfo.PartitionNames, v.PartitionInfo.Columns, v.PartitionInfo.ColumnNames) + partitions, err := partitionPruning(b.ctx, tbl, &v.PlanPartInfo) if err != nil { b.err = err return nil @@ -3894,7 +3905,7 @@ func (b *executorBuilder) buildIndexLookUpReader(v *plannercore.PhysicalIndexLoo b.err = exeerrors.ErrBuildExecutor return nil } - ret.partitionIDMap, err = getPartitionIdsAfterPruning(b.ctx, tbl, &v.PartitionInfo) + ret.partitionIDMap, err = getPartitionIdsAfterPruning(b.ctx, tbl, &v.PlanPartInfo) if err != nil { b.err = err return nil @@ -3911,7 +3922,7 @@ func (b *executorBuilder) buildIndexLookUpReader(v *plannercore.PhysicalIndexLoo tmp, _ := b.is.TableByID(is.Table.ID) tbl := tmp.(table.PartitionedTable) - partitions, err := partitionPruning(b.ctx, tbl, v.PartitionInfo.PruningConds, v.PartitionInfo.PartitionNames, v.PartitionInfo.Columns, v.PartitionInfo.ColumnNames) + partitions, err := partitionPruning(b.ctx, tbl, &v.PlanPartInfo) if err != nil { b.err = err return nil @@ -4041,7 +4052,7 @@ func (b *executorBuilder) buildIndexMergeReader(v *plannercore.PhysicalIndexMerg } tmp, _ := b.is.TableByID(ts.Table.ID) - partitions, err := partitionPruning(b.ctx, tmp.(table.PartitionedTable), v.PartitionInfo.PruningConds, v.PartitionInfo.PartitionNames, v.PartitionInfo.Columns, v.PartitionInfo.ColumnNames) + partitions, err := partitionPruning(b.ctx, tmp.(table.PartitionedTable), &v.PlanPartInfo) if err != nil { b.err = err return nil @@ -4168,8 +4179,7 @@ func (builder *dataReaderBuilder) buildTableReaderForIndexJoin(ctx context.Conte } tbl, _ := builder.is.TableByID(tbInfo.ID) pt := tbl.(table.PartitionedTable) - partitionInfo := &v.PartitionInfo - usedPartitionList, err := builder.partitionPruning(pt, partitionInfo.PruningConds, partitionInfo.PartitionNames, partitionInfo.Columns, partitionInfo.ColumnNames) + usedPartitionList, err := builder.partitionPruning(pt, &v.PlanPartInfo) if err != nil { return nil, err } @@ -4433,7 +4443,7 @@ func (builder *dataReaderBuilder) buildIndexReaderForIndexJoin(ctx context.Conte if !ok { return nil, exeerrors.ErrBuildExecutor } - e.partitionIDMap, err = getPartitionIdsAfterPruning(builder.ctx, tbl, &v.PartitionInfo) + e.partitionIDMap, err = getPartitionIdsAfterPruning(builder.ctx, tbl, &v.PlanPartInfo) if err != nil { return nil, err } @@ -4448,7 +4458,7 @@ func (builder *dataReaderBuilder) buildIndexReaderForIndexJoin(ctx context.Conte } tbl, _ := builder.executorBuilder.is.TableByID(tbInfo.ID) - usedPartition, canPrune, contentPos, err := builder.prunePartitionForInnerExecutor(tbl, &v.PartitionInfo, lookUpContents) + usedPartition, canPrune, contentPos, err := builder.prunePartitionForInnerExecutor(tbl, &v.PlanPartInfo, lookUpContents) if err != nil { return nil, err } @@ -4472,7 +4482,7 @@ func (builder *dataReaderBuilder) buildIndexReaderForIndexJoin(ctx context.Conte } return e, nil } - ret := &TableDualExec{BaseExecutor: *e.Base()} + ret := &TableDualExec{BaseExecutor: e.BaseExecutor} err = exec.Open(ctx, ret) return ret, err } @@ -4508,7 +4518,7 @@ func (builder *dataReaderBuilder) buildIndexLookUpReaderForIndexJoin(ctx context if !ok { return nil, exeerrors.ErrBuildExecutor } - e.partitionIDMap, err = getPartitionIdsAfterPruning(builder.ctx, tbl, &v.PartitionInfo) + e.partitionIDMap, err = getPartitionIdsAfterPruning(builder.ctx, tbl, &v.PlanPartInfo) if err != nil { return nil, err } @@ -4523,7 +4533,7 @@ func (builder *dataReaderBuilder) buildIndexLookUpReaderForIndexJoin(ctx context } tbl, _ := builder.executorBuilder.is.TableByID(tbInfo.ID) - usedPartition, canPrune, contentPos, err := builder.prunePartitionForInnerExecutor(tbl, &v.PartitionInfo, lookUpContents) + usedPartition, canPrune, contentPos, err := builder.prunePartitionForInnerExecutor(tbl, &v.PlanPartInfo, lookUpContents) if err != nil { return nil, err } @@ -4549,7 +4559,7 @@ func (builder *dataReaderBuilder) buildIndexLookUpReaderForIndexJoin(ctx context } return e, err } - ret := &TableDualExec{BaseExecutor: *e.Base()} + ret := &TableDualExec{BaseExecutor: e.BaseExecutor} err = exec.Open(ctx, ret) return ret, err } @@ -4682,6 +4692,9 @@ func buildKvRangesForIndexJoin(ctx sessionctx.Context, tableID, indexID int64, l } } if len(kvRanges) != 0 && memTracker != nil { + failpoint.Inject("testIssue49033", func() { + panic("testIssue49033") + }) memTracker.Consume(int64(2 * cap(kvRanges[0].StartKey) * len(kvRanges))) } if len(tmpDatumRanges) != 0 && memTracker != nil { @@ -4864,7 +4877,7 @@ func (b *executorBuilder) buildShuffle(v *plannercore.PhysicalShuffle) *ShuffleE for _, dataSource := range v.DataSources { stub := plannercore.PhysicalShuffleReceiverStub{ DataSource: dataSource, - }.Init(b.ctx, dataSource.StatsInfo(), dataSource.SelectBlockOffset(), nil) + }.Init(b.ctx, dataSource.StatsInfo(), dataSource.QueryBlockOffset(), nil) stub.SetSchema(dataSource.Schema()) stubs = append(stubs, stub) } @@ -5115,8 +5128,8 @@ func (b *executorBuilder) buildBatchPointGet(plan *plannercore.BatchPointGetPlan } capacity = len(e.handles) } - e.Base().SetInitCap(capacity) - e.Base().SetMaxChunkSize(capacity) + e.SetInitCap(capacity) + e.SetMaxChunkSize(capacity) e.buildVirtualColumnInfo() return e } @@ -5155,19 +5168,17 @@ func (b *executorBuilder) buildAdminResetTelemetryID(v *plannercore.AdminResetTe return &AdminResetTelemetryIDExec{BaseExecutor: exec.NewBaseExecutor(b.ctx, v.Schema(), v.ID())} } -func (builder *dataReaderBuilder) partitionPruning(tbl table.PartitionedTable, conds []expression.Expression, partitionNames []model.CIStr, - columns []*expression.Column, columnNames types.NameSlice) ([]table.PhysicalTable, error) { +func (builder *dataReaderBuilder) partitionPruning(tbl table.PartitionedTable, planPartInfo *plannercore.PhysPlanPartInfo) ([]table.PhysicalTable, error) { builder.once.Do(func() { - condPruneResult, err := partitionPruning(builder.executorBuilder.ctx, tbl, conds, partitionNames, columns, columnNames) + condPruneResult, err := partitionPruning(builder.executorBuilder.ctx, tbl, planPartInfo) builder.once.condPruneResult = condPruneResult builder.once.err = err }) return builder.once.condPruneResult, builder.once.err } -func partitionPruning(ctx sessionctx.Context, tbl table.PartitionedTable, conds []expression.Expression, partitionNames []model.CIStr, - columns []*expression.Column, columnNames types.NameSlice) ([]table.PhysicalTable, error) { - idxArr, err := plannercore.PartitionPruning(ctx, tbl, conds, partitionNames, columns, columnNames) +func partitionPruning(ctx sessionctx.Context, tbl table.PartitionedTable, planPartInfo *plannercore.PhysPlanPartInfo) ([]table.PhysicalTable, error) { + idxArr, err := plannercore.PartitionPruning(ctx, tbl, planPartInfo.PruningConds, planPartInfo.PartitionNames, planPartInfo.Columns, planPartInfo.ColumnNames) if err != nil { return nil, err } @@ -5191,11 +5202,11 @@ func partitionPruning(ctx sessionctx.Context, tbl table.PartitionedTable, conds return ret, nil } -func getPartitionIdsAfterPruning(ctx sessionctx.Context, tbl table.PartitionedTable, partInfo *plannercore.PartitionInfo) (map[int64]struct{}, error) { - if partInfo == nil { - return nil, errors.New("partInfo in getPartitionIdsAfterPruning must not be nil") +func getPartitionIdsAfterPruning(ctx sessionctx.Context, tbl table.PartitionedTable, physPlanPartInfo *plannercore.PhysPlanPartInfo) (map[int64]struct{}, error) { + if physPlanPartInfo == nil { + return nil, errors.New("physPlanPartInfo in getPartitionIdsAfterPruning must not be nil") } - idxArr, err := plannercore.PartitionPruning(ctx, tbl, partInfo.PruningConds, partInfo.PartitionNames, partInfo.Columns, partInfo.ColumnNames) + idxArr, err := plannercore.PartitionPruning(ctx, tbl, physPlanPartInfo.PruningConds, physPlanPartInfo.PartitionNames, physPlanPartInfo.Columns, physPlanPartInfo.ColumnNames) if err != nil { return nil, err } @@ -5298,7 +5309,7 @@ func (b *executorBuilder) buildCTE(v *plannercore.PhysicalCTE) exec.Executor { } // Setup storages. - tps := seedExec.Base().RetFieldTypes() + tps := seedExec.RetFieldTypes() resTbl = cteutil.NewStorageRowContainer(tps, chkSize) if err := resTbl.OpenAndRef(); err != nil { b.err = err diff --git a/pkg/executor/checksum.go b/pkg/executor/checksum.go index 0db26a3da129e..7a48671d8b346 100644 --- a/pkg/executor/checksum.go +++ b/pkg/executor/checksum.go @@ -247,7 +247,7 @@ func (c *checksumContext) buildTableRequest(ctx sessionctx.Context, tableID int6 SetChecksumRequest(checksum). SetStartTS(c.StartTs). SetConcurrency(ctx.GetSessionVars().DistSQLScanConcurrency()). - SetResourceGroupName(ctx.GetSessionVars().ResourceGroupName). + SetResourceGroupName(ctx.GetSessionVars().StmtCtx.ResourceGroupName). SetExplicitRequestSourceType(ctx.GetSessionVars().ExplicitRequestSourceType). Build() } @@ -266,7 +266,7 @@ func (c *checksumContext) buildIndexRequest(ctx sessionctx.Context, tableID int6 SetChecksumRequest(checksum). SetStartTS(c.StartTs). SetConcurrency(ctx.GetSessionVars().DistSQLScanConcurrency()). - SetResourceGroupName(ctx.GetSessionVars().ResourceGroupName). + SetResourceGroupName(ctx.GetSessionVars().StmtCtx.ResourceGroupName). SetExplicitRequestSourceType(ctx.GetSessionVars().ExplicitRequestSourceType). Build() } diff --git a/pkg/executor/compact_table.go b/pkg/executor/compact_table.go index 966d5ca8265b1..110d03b54a4b2 100644 --- a/pkg/executor/compact_table.go +++ b/pkg/executor/compact_table.go @@ -87,7 +87,7 @@ func (e *CompactTableTiFlashExec) Next(ctx context.Context, chk *chunk.Chunk) er func (e *CompactTableTiFlashExec) doCompact(execCtx context.Context) error { vars := e.Ctx().GetSessionVars() if e.tableInfo.TiFlashReplica == nil || e.tableInfo.TiFlashReplica.Count == 0 { - vars.StmtCtx.AppendWarning(errors.Errorf("compact skipped: no tiflash replica in the table")) + vars.StmtCtx.AppendWarning(errors.NewNoStackErrorf("compact skipped: no tiflash replica in the table")) return nil } @@ -257,33 +257,38 @@ func (task *storeCompactTask) compactOnePhysicalTable(physicalTableID int64) (bo if err != nil { // Even after backoff, the request is still failed.., or the request is cancelled or timed out // For example, the store is down. Let's simply don't compact other partitions. - warn := errors.Errorf("compact on store %s failed: %v", task.targetStore.Address, err) + warn := errors.NewNoStackErrorf("compact on store %s failed: %v", task.targetStore.Address, err) task.parentExec.Ctx().GetSessionVars().StmtCtx.AppendWarning(warn) + newErr := errors.Trace(warn) task.logFailure( zap.Int64("physical-table-id", physicalTableID), zap.Error(err)) - return false, warn + return false, newErr } if resp.GetError() != nil { switch resp.GetError().GetError().(type) { case *kvrpcpb.CompactError_ErrCompactInProgress: - warn := errors.Errorf("compact on store %s failed: table is compacting in progress", task.targetStore.Address) + // warn is light stackless. + warn := errors.NewNoStackErrorf("compact on store %s failed: table is compacting in progress", task.targetStore.Address) task.parentExec.Ctx().GetSessionVars().StmtCtx.AppendWarning(warn) + err := errors.Trace(warn) task.logFailure( zap.Int64("physical-table-id", physicalTableID), - zap.Error(warn)) + zap.Error(err)) // TiFlash reported that there are existing compacting for the same table. // We should stop the whole SQL execution, including compacting requests to other stores, as repeatedly // compacting the same table is a waste of resource. - return true, warn + return true, err case *kvrpcpb.CompactError_ErrTooManyPendingTasks: // The store is already very busy, don't retry and don't compact other partitions. - warn := errors.Errorf("compact on store %s failed: store is too busy", task.targetStore.Address) + // warn is light stackless. + warn := errors.NewNoStackErrorf("compact on store %s failed: store is too busy", task.targetStore.Address) task.parentExec.Ctx().GetSessionVars().StmtCtx.AppendWarning(warn) + err := errors.Trace(warn) task.logFailure( zap.Int64("physical-table-id", physicalTableID), - zap.Error(warn)) - return false, warn + zap.Error(err)) + return false, err case *kvrpcpb.CompactError_ErrPhysicalTableNotExist: // The physical table does not exist, don't retry this partition, but other partitions should still be compacted. // This may happen when partition or table is dropped during the long compaction. @@ -296,12 +301,13 @@ func (task *storeCompactTask) compactOnePhysicalTable(physicalTableID int64) (bo return false, nil default: // Others are unexpected errors, don't retry and don't compact other partitions. - warn := errors.Errorf("compact on store %s failed: internal error (check logs for details)", task.targetStore.Address) + warn := errors.NewNoStackErrorf("compact on store %s failed: internal error (check logs for details)", task.targetStore.Address) task.parentExec.Ctx().GetSessionVars().StmtCtx.AppendWarning(warn) + err := errors.Trace(warn) task.logFailure( zap.Int64("physical-table-id", physicalTableID), zap.Any("response-error", resp.GetError().GetError())) - return false, warn + return false, err } } @@ -314,14 +320,15 @@ func (task *storeCompactTask) compactOnePhysicalTable(physicalTableID int64) (bo if len(lastEndKey) == 0 || bytes.Compare(lastEndKey, startKey) <= 0 { // The TiFlash server returned an invalid compacted end key. // This is unexpected... - warn := errors.Errorf("compact on store %s failed: internal error (check logs for details)", task.targetStore.Address) + warn := errors.NewNoStackErrorf("compact on store %s failed: internal error (check logs for details)", task.targetStore.Address) task.parentExec.Ctx().GetSessionVars().StmtCtx.AppendWarning(warn) + err := errors.Trace(warn) task.logFailure( zap.Int64("physical-table-id", physicalTableID), zap.String("compacted-start-key", hex.EncodeToString(resp.GetCompactedStartKey())), zap.String("compacted-end-key", hex.EncodeToString(resp.GetCompactedEndKey())), ) - return false, warn + return false, err } startKey = lastEndKey } diff --git a/pkg/executor/compiler.go b/pkg/executor/compiler.go index 1e4950e6d5a2b..f549846cceed1 100644 --- a/pkg/executor/compiler.go +++ b/pkg/executor/compiler.go @@ -111,9 +111,9 @@ func (c *Compiler) Compile(ctx context.Context, stmtNode ast.StmtNode) (_ *ExecS }) if preparedObj != nil { - CountStmtNode(preparedObj.PreparedAst.Stmt, sessVars.InRestrictedSQL) + CountStmtNode(preparedObj.PreparedAst.Stmt, sessVars.InRestrictedSQL, stmtCtx.ResourceGroupName) } else { - CountStmtNode(stmtNode, sessVars.InRestrictedSQL) + CountStmtNode(stmtNode, sessVars.InRestrictedSQL, stmtCtx.ResourceGroupName) } var lowerPriority bool if c.Ctx.GetSessionVars().StmtCtx.Priority == mysql.NoPriority { @@ -197,7 +197,7 @@ func isPhysicalPlanNeedLowerPriority(p plannercore.PhysicalPlan) bool { } // CountStmtNode records the number of statements with the same type. -func CountStmtNode(stmtNode ast.StmtNode, inRestrictedSQL bool) { +func CountStmtNode(stmtNode ast.StmtNode, inRestrictedSQL bool, resourceGroup string) { if inRestrictedSQL { return } @@ -213,11 +213,11 @@ func CountStmtNode(stmtNode ast.StmtNode, inRestrictedSQL bool) { } case config.GetGlobalConfig().Status.RecordDBLabel: for dbLabel := range dbLabels { - metrics.StmtNodeCounter.WithLabelValues(typeLabel, dbLabel).Inc() + metrics.StmtNodeCounter.WithLabelValues(typeLabel, dbLabel, resourceGroup).Inc() } } } else { - metrics.StmtNodeCounter.WithLabelValues(typeLabel, "").Inc() + metrics.StmtNodeCounter.WithLabelValues(typeLabel, "", resourceGroup).Inc() } } diff --git a/pkg/executor/concurrent_map_test.go b/pkg/executor/concurrent_map_test.go index 944d8f78259d6..f952a0c8590a8 100644 --- a/pkg/executor/concurrent_map_test.go +++ b/pkg/executor/concurrent_map_test.go @@ -70,7 +70,7 @@ func TestConcurrentMap(t *testing.T) { func TestConcurrentMapMemoryUsage(t *testing.T) { m := newConcurrentMap() - const iterations = 1024 * hack.LoadFactorNum / hack.LoadFactorDen + var iterations = 1024 * hack.LoadFactorNum / hack.LoadFactorDen var memUsage int64 wg := &sync.WaitGroup{} wg.Add(2) diff --git a/pkg/executor/coprocessor.go b/pkg/executor/coprocessor.go index 644c92e8fad15..c77565aa35181 100644 --- a/pkg/executor/coprocessor.go +++ b/pkg/executor/coprocessor.go @@ -82,7 +82,7 @@ func (h *CoprocessorDAGHandler) HandleRequest(ctx context.Context, req *coproces } chk := exec.TryNewCacheChunk(e) - tps := e.Base().RetFieldTypes() + tps := e.RetFieldTypes() var totalChunks, partChunks []tipb.Chunk memTracker := h.sctx.GetSessionVars().StmtCtx.MemTracker for { @@ -103,7 +103,7 @@ func (h *CoprocessorDAGHandler) HandleRequest(ctx context.Context, req *coproces } totalChunks = append(totalChunks, partChunks...) } - if err := e.Close(); err != nil { + if err := exec.Close(e); err != nil { return h.buildErrorResponse(err) } return h.buildUnaryResponse(totalChunks) @@ -125,7 +125,7 @@ func (h *CoprocessorDAGHandler) HandleStreamRequest(ctx context.Context, req *co } chk := exec.TryNewCacheChunk(e) - tps := e.Base().RetFieldTypes() + tps := e.RetFieldTypes() for { chk.Reset() if err = exec.Next(ctx, e, chk); err != nil { diff --git a/pkg/executor/cte.go b/pkg/executor/cte.go index 66835d53f1101..f820ea391b509 100644 --- a/pkg/executor/cte.go +++ b/pkg/executor/cte.go @@ -113,15 +113,24 @@ func (e *CTEExec) Next(ctx context.Context, req *chunk.Chunk) (err error) { // Close implements the Executor interface. func (e *CTEExec) Close() (err error) { - e.producer.resTbl.Lock() - if !e.producer.closed { - // closeProducer() only close seedExec and recursiveExec, will not touch resTbl. - // It means you can still read resTbl after call closeProducer(). - // You can even call all three functions(openProducer/produce/closeProducer) in CTEExec.Next(). - // Separating these three function calls is only to follow the abstraction of the volcano model. - err = e.producer.closeProducer() - } - e.producer.resTbl.Unlock() + func() { + e.producer.resTbl.Lock() + defer e.producer.resTbl.Unlock() + if !e.producer.closed { + failpoint.Inject("mock_cte_exec_panic_avoid_deadlock", func(v failpoint.Value) { + ok := v.(bool) + if ok { + // mock an oom panic, returning ErrMemoryExceedForQuery for error identification in recovery work. + panic(exeerrors.ErrMemoryExceedForQuery) + } + }) + // closeProducer() only close seedExec and recursiveExec, will not touch resTbl. + // It means you can still read resTbl after call closeProducer(). + // You can even call all three functions(openProducer/produce/closeProducer) in CTEExec.Next(). + // Separating these three function calls is only to follow the abstraction of the volcano model. + err = e.producer.closeProducer() + } + }() if err != nil { return err } @@ -195,7 +204,7 @@ func (p *cteProducer) openProducer(ctx context.Context, cteExec *CTEExec) (err e // For non-recursive CTE, the result will be put into resTbl directly. // So no need to build iterOutTbl. // Construct iterOutTbl in Open() instead of buildCTE(), because its destruct is in Close(). - recursiveTypes := p.recursiveExec.Base().RetFieldTypes() + recursiveTypes := p.recursiveExec.RetFieldTypes() p.iterOutTbl = cteutil.NewStorageRowContainer(recursiveTypes, cteExec.MaxChunkSize()) if err = p.iterOutTbl.OpenAndRef(); err != nil { return err @@ -205,7 +214,7 @@ func (p *cteProducer) openProducer(ctx context.Context, cteExec *CTEExec) (err e if p.isDistinct { p.hashTbl = newConcurrentMapHashTable() p.hCtx = &hashContext{ - allTypes: cteExec.Base().RetFieldTypes(), + allTypes: cteExec.RetFieldTypes(), } // We use all columns to compute hash. p.hCtx.keyColIdx = make([]int, len(p.hCtx.allTypes)) @@ -218,11 +227,11 @@ func (p *cteProducer) openProducer(ctx context.Context, cteExec *CTEExec) (err e } func (p *cteProducer) closeProducer() (err error) { - if err = p.seedExec.Close(); err != nil { + if err = exec.Close(p.seedExec); err != nil { return err } if p.recursiveExec != nil { - if err = p.recursiveExec.Close(); err != nil { + if err = exec.Close(p.recursiveExec); err != nil { return err } // `iterInTbl` and `resTbl` are shared by multiple operators, @@ -414,7 +423,7 @@ func (p *cteProducer) computeRecursivePart(ctx context.Context) (err error) { } // Make sure iterInTbl is setup before Close/Open, // because some executors will read iterInTbl in Open() (like IndexLookupJoin). - if err = p.recursiveExec.Close(); err != nil { + if err = exec.Close(p.recursiveExec); err != nil { return } if err = exec.Open(ctx, p.recursiveExec); err != nil { @@ -546,6 +555,16 @@ func (p *cteProducer) computeChunkHash(chk *chunk.Chunk) (sel []int, err error) hashBitMap[val] = true } } else { + // Length of p.sel is init as MaxChunkSize, but the row num of chunk may still exceeds MaxChunkSize. + // So needs to handle here to make sure len(p.sel) == chk.NumRows(). + if len(p.sel) < numRows { + tmpSel := make([]int, numRows-len(p.sel)) + for i := 0; i < len(tmpSel); i++ { + tmpSel[i] = i + len(p.sel) + } + p.sel = append(p.sel, tmpSel...) + } + // All rows is selected, sel will be [0....numRows). // e.sel is setup when building executor. sel = p.sel diff --git a/pkg/executor/cte_test.go b/pkg/executor/cte_test.go index 20295b4085034..cff82c0a51ed7 100644 --- a/pkg/executor/cte_test.go +++ b/pkg/executor/cte_test.go @@ -27,6 +27,35 @@ import ( "github.com/stretchr/testify/require" ) +func TestCTEIssue49096(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + + tk.MustExec("use test;") + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/executor/mock_cte_exec_panic_avoid_deadlock", "return(true)")) + defer func() { + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/executor/mock_cte_exec_panic_avoid_deadlock")) + }() + insertStr := "insert into t1 values(0)" + rowNum := 10 + vals := make([]int, rowNum) + vals[0] = 0 + for i := 1; i < rowNum; i++ { + v := rand.Intn(100) + vals[i] = v + insertStr += fmt.Sprintf(", (%d)", v) + } + tk.MustExec("drop table if exists t1, t2;") + tk.MustExec("create table t1(c1 int);") + tk.MustExec("create table t2(c1 int);") + tk.MustExec(insertStr) + // should be insert statement, otherwise it couldn't step int resetCTEStorageMap in handleNoDelay func. + sql := "insert into t2 with cte1 as ( " + + "select c1 from t1) " + + "select c1 from cte1 natural join (select * from cte1 where c1 > 0) cte2 order by c1;" + tk.MustExec(sql) // No deadlock +} + func TestSpillToDisk(t *testing.T) { store := testkit.CreateMockStore(t) diff --git a/pkg/executor/ddl.go b/pkg/executor/ddl.go index 6766742fbdab5..e88367878f241 100644 --- a/pkg/executor/ddl.go +++ b/pkg/executor/ddl.go @@ -119,12 +119,14 @@ func (e *DDLExec) Next(ctx context.Context, _ *chunk.Chunk) (err error) { for _, tn := range s.Tables { nonExistsTables = append(nonExistsTables, ast.Ident{Schema: tn.Schema, Name: tn.Name}.String()) } - err = infoschema.ErrTableDropExists.GenWithStackByArgs(strings.Join(nonExistsTables, ",")) + // stackless err once used like note. + err = infoschema.ErrTableDropExists.FastGenByArgs(strings.Join(nonExistsTables, ",")) if s.IfExists { e.Ctx().GetSessionVars().StmtCtx.AppendNote(err) return nil } - return err + // complete and trace stack info. + return errors.Trace(err) } // if all tables are local temporary, directly drop those tables. @@ -275,12 +277,12 @@ func (e *DDLExec) createSessionTemporaryTable(s *ast.CreateTableStmt) error { _, exists := e.getLocalTemporaryTable(s.Table.Schema, s.Table.Name) if exists { - err := infoschema.ErrTableExists.GenWithStackByArgs(ast.Ident{Schema: s.Table.Schema, Name: s.Table.Name}) + err := infoschema.ErrTableExists.FastGenByArgs(ast.Ident{Schema: s.Table.Schema, Name: s.Table.Name}) if s.IfNotExists { e.Ctx().GetSessionVars().StmtCtx.AppendNote(err) return nil } - return err + return errors.Trace(err) } tbInfo, err := ddl.BuildSessionTemporaryTableInfo(e.Ctx(), is, s, dbInfo.Charset, dbInfo.Collate, dbInfo.PlacementPolicyRef) @@ -696,7 +698,7 @@ func (e *DDLExec) getRecoverDBByName(schemaName model.CIStr) (recoverSchemaInfo func (e *DDLExec) executeLockTables(s *ast.LockTablesStmt) error { if !config.TableLockEnabled() { - e.Ctx().GetSessionVars().StmtCtx.AppendWarning(exeerrors.ErrFuncNotEnabled.GenWithStackByArgs("LOCK TABLES", "enable-table-lock")) + e.Ctx().GetSessionVars().StmtCtx.AppendWarning(exeerrors.ErrFuncNotEnabled.FastGenByArgs("LOCK TABLES", "enable-table-lock")) return nil } @@ -711,7 +713,7 @@ func (e *DDLExec) executeLockTables(s *ast.LockTablesStmt) error { func (e *DDLExec) executeUnlockTables(_ *ast.UnlockTablesStmt) error { if !config.TableLockEnabled() { - e.Ctx().GetSessionVars().StmtCtx.AppendWarning(exeerrors.ErrFuncNotEnabled.GenWithStackByArgs("UNLOCK TABLES", "enable-table-lock")) + e.Ctx().GetSessionVars().StmtCtx.AppendWarning(exeerrors.ErrFuncNotEnabled.FastGenByArgs("UNLOCK TABLES", "enable-table-lock")) return nil } lockedTables := e.Ctx().GetAllTableLocks() diff --git a/pkg/executor/delete.go b/pkg/executor/delete.go index 1d331625512c4..63bcc882fbdcc 100644 --- a/pkg/executor/delete.go +++ b/pkg/executor/delete.go @@ -276,7 +276,7 @@ func onRemoveRowForFK(ctx sessionctx.Context, data []types.Datum, fkChecks []*FK // Close implements the Executor Close interface. func (e *DeleteExec) Close() error { defer e.memTracker.ReplaceBytesUsed(0) - return e.Children(0).Close() + return exec.Close(e.Children(0)) } // Open implements the Executor Open interface. diff --git a/pkg/executor/distsql.go b/pkg/executor/distsql.go index 925049d40d61d..5568eee6767a3 100644 --- a/pkg/executor/distsql.go +++ b/pkg/executor/distsql.go @@ -151,7 +151,7 @@ func closeAll(objs ...Closeable) error { func rebuildIndexRanges(ctx sessionctx.Context, is *plannercore.PhysicalIndexScan, idxCols []*expression.Column, colLens []int) (ranges []*ranger.Range, err error) { access := make([]expression.Expression, 0, len(is.AccessCondition)) for _, cond := range is.AccessCondition { - newCond, err1 := expression.SubstituteCorCol2Constant(cond) + newCond, err1 := expression.SubstituteCorCol2Constant(ctx, cond) if err1 != nil { return nil, err1 } @@ -339,7 +339,7 @@ func (e *IndexReaderExecutor) open(ctx context.Context, kvRanges []kv.KeyRange) if err != nil { return err } - pbConditions, err := expression.ExpressionsToPBList(e.Ctx().GetSessionVars().StmtCtx, []expression.Expression{inCondition}, e.Ctx().GetClient()) + pbConditions, err := expression.ExpressionsToPBList(e.Ctx(), []expression.Expression{inCondition}, e.Ctx().GetClient()) if err != nil { return err } @@ -987,7 +987,7 @@ func (w *indexWorker) fetchHandles(ctx context.Context, results []distsql.Select } } }() - chk := w.idxLookup.Ctx().GetSessionVars().GetNewChunkWithCapacity(w.idxLookup.getRetTpsForIndexReader(), w.idxLookup.MaxChunkSize(), w.idxLookup.MaxChunkSize(), w.idxLookup.AllocPool) + chk := w.idxLookup.AllocPool.Alloc(w.idxLookup.getRetTpsForIndexReader(), w.idxLookup.MaxChunkSize(), w.idxLookup.MaxChunkSize()) idxID := w.idxLookup.getIndexPlanRootID() if w.idxLookup.Ctx().GetSessionVars().StmtCtx.RuntimeStatsColl != nil { if idxID != w.idxLookup.ID() && w.idxLookup.stats != nil { @@ -1455,7 +1455,7 @@ func (w *tableWorker) executeTask(ctx context.Context, task *lookupTableTask) er logutil.Logger(ctx).Error("build table reader failed", zap.Error(err)) return err } - defer terror.Call(tableReader.Close) + defer func() { terror.Log(exec.Close(tableReader)) }() if w.checkIndexValue != nil { return w.compareData(ctx, task, tableReader) diff --git a/pkg/executor/executor.go b/pkg/executor/executor.go index 09f7b62626d7d..abe6e8be19d9a 100644 --- a/pkg/executor/executor.go +++ b/pkg/executor/executor.go @@ -37,6 +37,7 @@ import ( "github.com/pingcap/tidb/pkg/ddl/schematracker" "github.com/pingcap/tidb/pkg/domain" "github.com/pingcap/tidb/pkg/domain/infosync" + "github.com/pingcap/tidb/pkg/errctx" "github.com/pingcap/tidb/pkg/executor/aggregate" "github.com/pingcap/tidb/pkg/executor/internal/exec" "github.com/pingcap/tidb/pkg/executor/internal/pdhelper" @@ -52,6 +53,7 @@ import ( "github.com/pingcap/tidb/pkg/parser/mysql" "github.com/pingcap/tidb/pkg/parser/terror" plannercore "github.com/pingcap/tidb/pkg/planner/core" + "github.com/pingcap/tidb/pkg/planner/util/fixcontrol" "github.com/pingcap/tidb/pkg/privilege" "github.com/pingcap/tidb/pkg/resourcemanager/pool/workerpool" poolutil "github.com/pingcap/tidb/pkg/resourcemanager/util" @@ -212,8 +214,7 @@ func (*globalPanicOnExceed) GetPriority() int64 { // newList creates a new List to buffer current executor's result. func newList(e exec.Executor) *chunk.List { - base := e.Base() - return chunk.NewList(base.RetFieldTypes(), base.InitCap(), base.MaxChunkSize()) + return chunk.NewList(e.RetFieldTypes(), e.InitCap(), e.MaxChunkSize()) } // CommandDDLJobsExec is the general struct for Cancel/Pause/Resume commands on @@ -873,7 +874,7 @@ func (e *CheckTableExec) Close() error { var firstErr error close(e.exitCh) for _, src := range e.srcs { - if err := src.Close(); err != nil && firstErr == nil { + if err := exec.Close(src); err != nil && firstErr == nil { firstErr = err } } @@ -1473,7 +1474,7 @@ func init() { return nil, e.err } err := exec.Open(ctx, executor) - defer terror.Call(executor.Close) + defer func() { terror.Log(exec.Close(executor)) }() if err != nil { return nil, err } @@ -1943,7 +1944,7 @@ func (e *UnionExec) Close() error { // promised to exit when reaching here (e.childIDChan been closed). var firstErr error for i := 0; i <= e.mu.maxOpenedChildID; i++ { - if err := e.Children(i).Close(); err != nil && firstErr == nil { + if err := exec.Close(e.Children(i)); err != nil && firstErr == nil { firstErr = err } } @@ -1989,6 +1990,7 @@ func ResetContextOfStmt(ctx sessionctx.Context, s ast.StmtNode) (err error) { sc.OptimizerCETrace = nil sc.IsSyncStatsFailed = false sc.IsExplainAnalyzeDML = false + sc.ResourceGroupName = vars.ResourceGroupName // Firstly we assume that UseDynamicPruneMode can be enabled according session variable, then we will check other conditions // in PlanBuilder.buildDataSource if ctx.GetSessionVars().IsDynamicPartitionPruneEnabled() { @@ -2103,22 +2105,32 @@ func ResetContextOfStmt(ctx sessionctx.Context, s ast.StmtNode) (err error) { // pushing them down to TiKV as flags. sc.InRestrictedSQL = vars.InRestrictedSQL + + errLevels := sc.ErrLevels() + errLevels[errctx.ErrGroupDividedByZero] = errctx.LevelWarn switch stmt := s.(type) { // `ResetUpdateStmtCtx` and `ResetDeleteStmtCtx` may modify the flags, so we'll need to store them. case *ast.UpdateStmt: ResetUpdateStmtCtx(sc, stmt, vars) + errLevels = sc.ErrLevels() case *ast.DeleteStmt: ResetDeleteStmtCtx(sc, stmt, vars) + errLevels = sc.ErrLevels() case *ast.InsertStmt: sc.InInsertStmt = true // For insert statement (not for update statement), disabling the StrictSQLMode // should make TruncateAsWarning and DividedByZeroAsWarning, // but should not make DupKeyAsWarning. - sc.DupKeyAsWarning = stmt.IgnoreErr - sc.BadNullAsWarning = !vars.StrictSQLMode || stmt.IgnoreErr - sc.IgnoreNoPartition = stmt.IgnoreErr - sc.ErrAutoincReadFailedAsWarning = stmt.IgnoreErr - sc.DividedByZeroAsWarning = !vars.StrictSQLMode || stmt.IgnoreErr + if stmt.IgnoreErr { + errLevels[errctx.ErrGroupDupKey] = errctx.LevelWarn + errLevels[errctx.ErrGroupAutoIncReadFailed] = errctx.LevelWarn + errLevels[errctx.ErrGroupNoMatchedPartition] = errctx.LevelWarn + } + errLevels[errctx.ErrGroupBadNull] = errctx.ResolveErrLevel(false, !vars.StrictSQLMode || stmt.IgnoreErr) + errLevels[errctx.ErrGroupDividedByZero] = errctx.ResolveErrLevel( + !vars.SQLMode.HasErrorForDivisionByZeroMode(), + !vars.StrictSQLMode || stmt.IgnoreErr, + ) sc.Priority = stmt.Priority sc.SetTypeFlags(sc.TypeFlags(). WithTruncateAsWarning(!vars.StrictSQLMode || stmt.IgnoreErr). @@ -2138,16 +2150,10 @@ func ResetContextOfStmt(ctx sessionctx.Context, s ast.StmtNode) (err error) { case *ast.LoadDataStmt: sc.InLoadDataStmt = true // return warning instead of error when load data meet no partition for value - sc.IgnoreNoPartition = true + errLevels[errctx.ErrGroupNoMatchedPartition] = errctx.LevelWarn case *ast.SelectStmt: sc.InSelectStmt = true - // see https://dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sql-mode-strict - // said "For statements such as SELECT that do not change data, invalid values - // generate a warning in strict mode, not an error." - // and https://dev.mysql.com/doc/refman/5.7/en/out-of-range-and-overflow.html - sc.OverflowAsWarning = true - // Return warning for truncate error in selection. sc.SetTypeFlags(sc.TypeFlags(). WithTruncateAsWarning(true). @@ -2160,7 +2166,6 @@ func ResetContextOfStmt(ctx sessionctx.Context, s ast.StmtNode) (err error) { sc.WeakConsistency = isWeakConsistencyRead(ctx, stmt) case *ast.SetOprStmt: sc.InSelectStmt = true - sc.OverflowAsWarning = true sc.SetTypeFlags(sc.TypeFlags(). WithTruncateAsWarning(true). WithIgnoreZeroInDate(true). @@ -2192,6 +2197,10 @@ func ResetContextOfStmt(ctx sessionctx.Context, s ast.StmtNode) (err error) { WithIgnoreInvalidDateErr(vars.SQLMode.HasAllowInvalidDatesMode())) } + if errLevels != sc.ErrLevels() { + sc.SetErrLevels(errLevels) + } + sc.SetTypeFlags(sc.TypeFlags(). WithSkipUTF8Check(vars.SkipUTF8Check). WithSkipSACIICheck(vars.SkipASCIICheck). @@ -2227,6 +2236,7 @@ func ResetContextOfStmt(ctx sessionctx.Context, s ast.StmtNode) (err error) { sc.RuntimeStatsColl = execdetails.NewRuntimeStatsColl(reuseObj) } + sc.ForcePlanCache = fixcontrol.GetBoolWithDefault(vars.OptimizerFixControl, fixcontrol.Fix49736, false) sc.TblInfo2UnionScan = make(map[*model.TableInfo]bool) errCount, warnCount := vars.StmtCtx.NumErrorWarnings() vars.SysErrorCount = errCount @@ -2248,11 +2258,16 @@ func ResetContextOfStmt(ctx sessionctx.Context, s ast.StmtNode) (err error) { // ResetUpdateStmtCtx resets statement context for UpdateStmt. func ResetUpdateStmtCtx(sc *stmtctx.StatementContext, stmt *ast.UpdateStmt, vars *variable.SessionVars) { sc.InUpdateStmt = true - sc.DupKeyAsWarning = stmt.IgnoreErr - sc.BadNullAsWarning = !vars.StrictSQLMode || stmt.IgnoreErr - sc.DividedByZeroAsWarning = !vars.StrictSQLMode || stmt.IgnoreErr + errLevels := sc.ErrLevels() + errLevels[errctx.ErrGroupDupKey] = errctx.ResolveErrLevel(false, stmt.IgnoreErr) + errLevels[errctx.ErrGroupBadNull] = errctx.ResolveErrLevel(false, !vars.StrictSQLMode || stmt.IgnoreErr) + errLevels[errctx.ErrGroupDividedByZero] = errctx.ResolveErrLevel( + !vars.SQLMode.HasErrorForDivisionByZeroMode(), + !vars.StrictSQLMode || stmt.IgnoreErr, + ) + errLevels[errctx.ErrGroupNoMatchedPartition] = errctx.ResolveErrLevel(false, stmt.IgnoreErr) + sc.SetErrLevels(errLevels) sc.Priority = stmt.Priority - sc.IgnoreNoPartition = stmt.IgnoreErr sc.SetTypeFlags(sc.TypeFlags(). WithTruncateAsWarning(!vars.StrictSQLMode || stmt.IgnoreErr). WithIgnoreInvalidDateErr(vars.SQLMode.HasAllowInvalidDatesMode()). @@ -2263,9 +2278,14 @@ func ResetUpdateStmtCtx(sc *stmtctx.StatementContext, stmt *ast.UpdateStmt, vars // ResetDeleteStmtCtx resets statement context for DeleteStmt. func ResetDeleteStmtCtx(sc *stmtctx.StatementContext, stmt *ast.DeleteStmt, vars *variable.SessionVars) { sc.InDeleteStmt = true - sc.DupKeyAsWarning = stmt.IgnoreErr - sc.BadNullAsWarning = !vars.StrictSQLMode || stmt.IgnoreErr - sc.DividedByZeroAsWarning = !vars.StrictSQLMode || stmt.IgnoreErr + errLevels := sc.ErrLevels() + errLevels[errctx.ErrGroupDupKey] = errctx.ResolveErrLevel(false, stmt.IgnoreErr) + errLevels[errctx.ErrGroupBadNull] = errctx.ResolveErrLevel(false, !vars.StrictSQLMode || stmt.IgnoreErr) + errLevels[errctx.ErrGroupDividedByZero] = errctx.ResolveErrLevel( + !vars.SQLMode.HasErrorForDivisionByZeroMode(), + !vars.StrictSQLMode || stmt.IgnoreErr, + ) + sc.SetErrLevels(errLevels) sc.Priority = stmt.Priority sc.SetTypeFlags(sc.TypeFlags(). WithTruncateAsWarning(!vars.StrictSQLMode || stmt.IgnoreErr). @@ -2359,6 +2379,19 @@ func getCheckSum(ctx context.Context, se sessionctx.Context, sql string) ([]grou return checksums, nil } +func (w *checkIndexWorker) initSessCtx(se sessionctx.Context) (restore func()) { + sessVars := se.GetSessionVars() + originOptUseInvisibleIdx := sessVars.OptimizerUseInvisibleIndexes + originMemQuotaQuery := sessVars.MemQuotaQuery + + sessVars.OptimizerUseInvisibleIndexes = true + sessVars.MemQuotaQuery = w.sctx.GetSessionVars().MemQuotaQuery + return func() { + sessVars.OptimizerUseInvisibleIndexes = originOptUseInvisibleIdx + sessVars.MemQuotaQuery = originMemQuotaQuery + } +} + // HandleTask implements the Worker interface. func (w *checkIndexWorker) HandleTask(task checkIndexTask, _ func(workerpool.None)) { defer w.e.wg.Done() @@ -2371,15 +2404,15 @@ func (w *checkIndexWorker) HandleTask(task checkIndexTask, _ func(workerpool.Non w.e.err.CompareAndSwap(nil, &err) } - se, err := w.e.Base().GetSysSession() + se, err := w.e.BaseExecutor.GetSysSession() if err != nil { trySaveErr(err) return } - se.GetSessionVars().OptimizerUseInvisibleIndexes = true + restoreCtx := w.initSessCtx(se) defer func() { - se.GetSessionVars().OptimizerUseInvisibleIndexes = false - w.e.Base().ReleaseSysSession(ctx, se) + restoreCtx() + w.e.BaseExecutor.ReleaseSysSession(ctx, se) }() var pkCols []string @@ -2775,10 +2808,6 @@ func (e *AdminShowBDRRoleExec) Next(ctx context.Context, req *chunk.Chunk) error return err } - if role == "" { - role = string(ast.BDRRoleNone) - } - req.AppendString(0, role) e.done = true return nil diff --git a/pkg/executor/executor_failpoint_test.go b/pkg/executor/executor_failpoint_test.go index 15d52ccec3dda..f791b1f0132a9 100644 --- a/pkg/executor/executor_failpoint_test.go +++ b/pkg/executor/executor_failpoint_test.go @@ -281,6 +281,7 @@ func TestCollectCopRuntimeStats(t *testing.T) { } func TestCoprocessorOOMTiCase(t *testing.T) { + t.Skip("skip") store := testkit.CreateMockStore(t) tk := testkit.NewTestKit(t, store) tk.MustExec("use test") @@ -342,18 +343,21 @@ func TestCoprocessorOOMTiCase(t *testing.T) { f() err = failpoint.Disable("github.com/pingcap/tidb/pkg/store/copr/ticase-4169") require.NoError(t, err) - // ticase-4170, trigger oom action twice after iterator receiving all the data. - err = failpoint.Enable("github.com/pingcap/tidb/pkg/store/copr/ticase-4170", `return(true)`) - require.NoError(t, err) - f() - err = failpoint.Disable("github.com/pingcap/tidb/pkg/store/copr/ticase-4170") - require.NoError(t, err) - // ticase-4171, trigger oom before reading or consuming any data - err = failpoint.Enable("github.com/pingcap/tidb/pkg/store/copr/ticase-4171", `return(true)`) - require.NoError(t, err) - f() - err = failpoint.Disable("github.com/pingcap/tidb/pkg/store/copr/ticase-4171") - require.NoError(t, err) + /* + // ticase-4170, trigger oom action twice after iterator receiving all the data. + err = failpoint.Enable("github.com/pingcap/tidb/pkg/store/copr/ticase-4170", `return(true)`) + require.NoError(t, err) + f() + err = failpoint.Disable("github.com/pingcap/tidb/pkg/store/copr/ticase-4170") + require.NoError(t, err) + // ticase-4171, trigger oom before reading or consuming any data + err = failpoint.Enable("github.com/pingcap/tidb/pkg/store/copr/ticase-4171", `return(true)`) + require.NoError(t, err) + f() + err = failpoint.Disable("github.com/pingcap/tidb/pkg/store/copr/ticase-4171") + require.NoError(t, err) + + */ } func TestIssue21441(t *testing.T) { @@ -653,3 +657,45 @@ func TestGetMvccByEncodedKeyRegionError(t *testing.T) { require.Equal(t, 1, len(resp.Info.Writes)) require.Equal(t, commitTs, resp.Info.Writes[0].CommitTs) } + +func TestShuffleExit(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t1;") + tk.MustExec("create table t1(i int, j int, k int);") + tk.MustExec("insert into t1 VALUES (1,1,1),(2,2,2),(3,3,3),(4,4,4);") + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/executor/shuffleError", "return(true)")) + defer func() { + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/executor/shuffleError")) + }() + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/executor/shuffleExecFetchDataAndSplit", "return(true)")) + defer func() { + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/executor/shuffleExecFetchDataAndSplit")) + }() + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/executor/shuffleWorkerRun", "panic(\"ShufflePanic\")")) + defer func() { + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/executor/shuffleWorkerRun")) + }() + err := tk.QueryToErr("SELECT SUM(i) OVER W FROM t1 WINDOW w AS (PARTITION BY j ORDER BY i) ORDER BY 1+SUM(i) OVER w;") + require.ErrorContains(t, err, "ShuffleExec.Next error") +} + +func TestHandleForeignKeyCascadePanic(t *testing.T) { + // Test no goroutine leak. + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t1, t2;") + tk.MustExec("create table t1 (id int key, a int, index (a));") + tk.MustExec("create table t2 (id int key, a int, index (a), constraint fk_1 foreign key (a) references t1(a));") + tk.MustExec("alter table t2 drop foreign key fk_1;") + tk.MustExec("alter table t2 add constraint fk_1 foreign key (a) references t1(a) on delete set null;") + tk.MustExec("replace into t1 values (1, 1);") + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/executor/handleForeignKeyCascadeError", "return(true)")) + defer func() { + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/executor/handleForeignKeyCascadeError")) + }() + err := tk.ExecToErr("replace into t1 values (1, 2);") + require.ErrorContains(t, err, "handleForeignKeyCascadeError") +} diff --git a/pkg/executor/executor_pkg_test.go b/pkg/executor/executor_pkg_test.go index f3e75088696f3..62400d70fd313 100644 --- a/pkg/executor/executor_pkg_test.go +++ b/pkg/executor/executor_pkg_test.go @@ -15,15 +15,21 @@ package executor import ( + "fmt" "runtime" "strconv" + "strings" "testing" "time" "unsafe" + "github.com/hashicorp/go-version" + "github.com/pingcap/tidb/pkg/domain" + "github.com/pingcap/tidb/pkg/errctx" "github.com/pingcap/tidb/pkg/executor/aggfuncs" - "github.com/pingcap/tidb/pkg/executor/aggregate" "github.com/pingcap/tidb/pkg/kv" + "github.com/pingcap/tidb/pkg/parser/ast" + "github.com/pingcap/tidb/pkg/parser/mysql" "github.com/pingcap/tidb/pkg/sessionctx/variable" "github.com/pingcap/tidb/pkg/tablecodec" "github.com/pingcap/tidb/pkg/types" @@ -159,61 +165,117 @@ func TestSlowQueryRuntimeStats(t *testing.T) { } // Test whether the actual buckets in Golang Map is same with the estimated number. -// The test relies the implement of Golang Map. ref https://github.com/golang/go/blob/go1.13/src/runtime/map.go#L114 +// The test relies on the implement of Golang Map. ref https://github.com/golang/go/blob/go1.13/src/runtime/map.go#L114 func TestAggPartialResultMapperB(t *testing.T) { - if runtime.Version() < `go1.13` { - t.Skip("Unsupported version") + // skip err, since we guarantee the success of execution + go113, _ := version.NewVersion(`1.13`) + // go version format is `gox.y.z foobar`, we only need x.y.z part + // The following is pretty hacky, but it only in test which is ok to do so. + actualVer, err := version.NewVersion(runtime.Version()[2:6]) + if err != nil { + t.Fatalf("Cannot get actual go version with error %v\n", err) + } + if actualVer.LessThan(go113) { + t.Fatalf("Unsupported version and should never use any version less than go1.13\n") } type testCase struct { rowNum int expectedB int expectedGrowing bool } - cases := []testCase{ - { - rowNum: 0, - expectedB: 0, - expectedGrowing: false, - }, - { - rowNum: 100, - expectedB: 5, - expectedGrowing: true, - }, - { - rowNum: 10000, - expectedB: 11, - expectedGrowing: false, - }, - { - rowNum: 1000000, - expectedB: 18, - expectedGrowing: false, - }, - { - rowNum: 851968, // 6.5 * (1 << 17) - expectedB: 18, - expectedGrowing: true, - }, - { - rowNum: 851969, // 6.5 * (1 << 17) + 1 - expectedB: 18, - expectedGrowing: true, - }, - { - rowNum: 425984, // 6.5 * (1 << 16) - expectedB: 17, - expectedGrowing: true, - }, - { - rowNum: 425985, // 6.5 * (1 << 16) + 1 - expectedB: 17, - expectedGrowing: true, - }, + var cases []testCase + // https://github.com/golang/go/issues/63438 + // in 1.21, the load factor of map is 6 rather than 6.5 and the go team refused to backport to 1.21. + if strings.Contains(runtime.Version(), `go1.21`) { + cases = []testCase{ + { + rowNum: 0, + expectedB: 0, + expectedGrowing: false, + }, + { + rowNum: 95, + expectedB: 4, + expectedGrowing: false, + }, + { + rowNum: 10000, // 6 * (1 << 11) is 12288 + expectedB: 11, + expectedGrowing: false, + }, + { + rowNum: 1000000, // 6 * (1 << 18) is 1572864 + expectedB: 18, + expectedGrowing: false, + }, + { + rowNum: 786432, // 6 * (1 << 17) + expectedB: 17, + expectedGrowing: false, + }, + { + rowNum: 786433, // 6 * (1 << 17) + 1 + expectedB: 18, + expectedGrowing: true, + }, + { + rowNum: 393216, // 6 * (1 << 16) + expectedB: 16, + expectedGrowing: false, + }, + { + rowNum: 393217, // 6 * (1 << 16) + 1 + expectedB: 17, + expectedGrowing: true, + }, + } + } else { + cases = []testCase{ + { + rowNum: 0, + expectedB: 0, + expectedGrowing: false, + }, + { + rowNum: 100, + expectedB: 4, + expectedGrowing: false, + }, + { + rowNum: 10000, + expectedB: 11, + expectedGrowing: false, + }, + { + rowNum: 1000000, + expectedB: 18, + expectedGrowing: false, + }, + { + rowNum: 851968, // 6.5 * (1 << 17) + expectedB: 17, + expectedGrowing: false, + }, + { + rowNum: 851969, // 6.5 * (1 << 17) + 1 + expectedB: 18, + expectedGrowing: true, + }, + { + rowNum: 425984, // 6.5 * (1 << 16) + expectedB: 16, + expectedGrowing: false, + }, + { + rowNum: 425985, // 6.5 * (1 << 16) + 1 + expectedB: 17, + expectedGrowing: true, + }, + } } for _, tc := range cases { - aggMap := make(aggregate.AggPartialResultMapper) + aggMap := make(aggfuncs.AggPartialResultMapper) tempSlice := make([]aggfuncs.PartialResult, 10) for num := 0; num < tc.rowNum; num++ { aggMap[strconv.Itoa(num)] = tempSlice @@ -240,13 +302,13 @@ type hmap struct { nevacuate uintptr // nolint:unused // progress counter for evacuation (buckets less than this have been evacuated) } -func getB(m aggregate.AggPartialResultMapper) int { +func getB(m aggfuncs.AggPartialResultMapper) int { point := (**hmap)(unsafe.Pointer(&m)) value := *point return int(value.B) } -func getGrowing(m aggregate.AggPartialResultMapper) bool { +func getGrowing(m aggfuncs.AggPartialResultMapper) bool { point := (**hmap)(unsafe.Pointer(&m)) value := *point return value.oldbuckets != nil @@ -264,3 +326,168 @@ func TestFilterTemporaryTableKeys(t *testing.T) { res := filterTemporaryTableKeys(vars, []kv.Key{tablecodec.EncodeTablePrefix(tableID), tablecodec.EncodeTablePrefix(42)}) require.Len(t, res, 1) } + +func TestErrLevelsForResetStmtContext(t *testing.T) { + ctx := mock.NewContext() + domain.BindDomain(ctx, &domain.Domain{}) + + cases := []struct { + name string + sqlMode mysql.SQLMode + stmt []ast.StmtNode + levels errctx.LevelMap + }{ + { + name: "strict,write", + sqlMode: mysql.ModeStrictAllTables | mysql.ModeErrorForDivisionByZero, + stmt: []ast.StmtNode{&ast.InsertStmt{}, &ast.UpdateStmt{}, &ast.DeleteStmt{}}, + levels: func() (l errctx.LevelMap) { + l[errctx.ErrGroupTruncate] = errctx.LevelError + l[errctx.ErrGroupDupKey] = errctx.LevelError + l[errctx.ErrGroupBadNull] = errctx.LevelError + l[errctx.ErrGroupDividedByZero] = errctx.LevelError + l[errctx.ErrGroupAutoIncReadFailed] = errctx.LevelError + l[errctx.ErrGroupNoMatchedPartition] = errctx.LevelError + return + }(), + }, + { + name: "non-strict,write", + sqlMode: mysql.ModeErrorForDivisionByZero, + stmt: []ast.StmtNode{&ast.InsertStmt{}, &ast.UpdateStmt{}, &ast.DeleteStmt{}}, + levels: func() (l errctx.LevelMap) { + l[errctx.ErrGroupTruncate] = errctx.LevelWarn + l[errctx.ErrGroupDupKey] = errctx.LevelError + l[errctx.ErrGroupBadNull] = errctx.LevelWarn + l[errctx.ErrGroupDividedByZero] = errctx.LevelWarn + l[errctx.ErrGroupAutoIncReadFailed] = errctx.LevelError + l[errctx.ErrGroupNoMatchedPartition] = errctx.LevelError + return + }(), + }, + { + name: "strict,insert ignore", + sqlMode: mysql.ModeStrictAllTables | mysql.ModeErrorForDivisionByZero, + stmt: []ast.StmtNode{&ast.InsertStmt{IgnoreErr: true}}, + levels: func() (l errctx.LevelMap) { + l[errctx.ErrGroupTruncate] = errctx.LevelWarn + l[errctx.ErrGroupDupKey] = errctx.LevelWarn + l[errctx.ErrGroupBadNull] = errctx.LevelWarn + l[errctx.ErrGroupDividedByZero] = errctx.LevelWarn + l[errctx.ErrGroupAutoIncReadFailed] = errctx.LevelWarn + l[errctx.ErrGroupNoMatchedPartition] = errctx.LevelWarn + return + }(), + }, + { + name: "strict,update ignore", + sqlMode: mysql.ModeStrictAllTables | mysql.ModeErrorForDivisionByZero, + stmt: []ast.StmtNode{&ast.UpdateStmt{IgnoreErr: true}}, + levels: func() (l errctx.LevelMap) { + l[errctx.ErrGroupTruncate] = errctx.LevelWarn + l[errctx.ErrGroupDupKey] = errctx.LevelWarn + l[errctx.ErrGroupBadNull] = errctx.LevelWarn + l[errctx.ErrGroupDividedByZero] = errctx.LevelWarn + l[errctx.ErrGroupAutoIncReadFailed] = errctx.LevelError + l[errctx.ErrGroupNoMatchedPartition] = errctx.LevelWarn + return + }(), + }, + { + name: "strict,delete ignore", + sqlMode: mysql.ModeStrictAllTables | mysql.ModeErrorForDivisionByZero, + stmt: []ast.StmtNode{&ast.DeleteStmt{IgnoreErr: true}}, + levels: func() (l errctx.LevelMap) { + l[errctx.ErrGroupTruncate] = errctx.LevelWarn + l[errctx.ErrGroupDupKey] = errctx.LevelWarn + l[errctx.ErrGroupBadNull] = errctx.LevelWarn + l[errctx.ErrGroupDividedByZero] = errctx.LevelWarn + l[errctx.ErrGroupAutoIncReadFailed] = errctx.LevelError + l[errctx.ErrGroupNoMatchedPartition] = errctx.LevelError + return + }(), + }, + { + name: "strict without error_for_division_by_zero,write", + sqlMode: mysql.ModeStrictAllTables, + stmt: []ast.StmtNode{&ast.InsertStmt{}, &ast.UpdateStmt{}, &ast.DeleteStmt{}}, + levels: func() (l errctx.LevelMap) { + l[errctx.ErrGroupTruncate] = errctx.LevelError + l[errctx.ErrGroupDupKey] = errctx.LevelError + l[errctx.ErrGroupBadNull] = errctx.LevelError + l[errctx.ErrGroupDividedByZero] = errctx.LevelIgnore + l[errctx.ErrGroupAutoIncReadFailed] = errctx.LevelError + l[errctx.ErrGroupNoMatchedPartition] = errctx.LevelError + return + }(), + }, + { + name: "strict,select/union", + sqlMode: mysql.ModeStrictAllTables | mysql.ModeErrorForDivisionByZero, + stmt: []ast.StmtNode{&ast.SelectStmt{}, &ast.SetOprStmt{}}, + levels: func() (l errctx.LevelMap) { + l[errctx.ErrGroupTruncate] = errctx.LevelWarn + l[errctx.ErrGroupDupKey] = errctx.LevelError + l[errctx.ErrGroupBadNull] = errctx.LevelError + l[errctx.ErrGroupDividedByZero] = errctx.LevelWarn + l[errctx.ErrGroupAutoIncReadFailed] = errctx.LevelError + l[errctx.ErrGroupNoMatchedPartition] = errctx.LevelError + return + }(), + }, + { + name: "non-strict,select/union", + sqlMode: mysql.ModeStrictAllTables | mysql.ModeErrorForDivisionByZero, + stmt: []ast.StmtNode{&ast.SelectStmt{}, &ast.SetOprStmt{}}, + levels: func() (l errctx.LevelMap) { + l[errctx.ErrGroupTruncate] = errctx.LevelWarn + l[errctx.ErrGroupDupKey] = errctx.LevelError + l[errctx.ErrGroupBadNull] = errctx.LevelError + l[errctx.ErrGroupDividedByZero] = errctx.LevelWarn + l[errctx.ErrGroupAutoIncReadFailed] = errctx.LevelError + l[errctx.ErrGroupNoMatchedPartition] = errctx.LevelError + return + }(), + }, + { + name: "strict,load_data", + sqlMode: mysql.ModeStrictAllTables | mysql.ModeErrorForDivisionByZero, + stmt: []ast.StmtNode{&ast.LoadDataStmt{}}, + levels: func() (l errctx.LevelMap) { + l[errctx.ErrGroupTruncate] = errctx.LevelError + l[errctx.ErrGroupDupKey] = errctx.LevelError + l[errctx.ErrGroupBadNull] = errctx.LevelError + l[errctx.ErrGroupDividedByZero] = errctx.LevelWarn + l[errctx.ErrGroupAutoIncReadFailed] = errctx.LevelError + l[errctx.ErrGroupNoMatchedPartition] = errctx.LevelWarn + return + }(), + }, + { + name: "non-strict,load_data", + sqlMode: mysql.SQLMode(0), + stmt: []ast.StmtNode{&ast.LoadDataStmt{}}, + levels: func() (l errctx.LevelMap) { + l[errctx.ErrGroupTruncate] = errctx.LevelError + l[errctx.ErrGroupDupKey] = errctx.LevelError + l[errctx.ErrGroupBadNull] = errctx.LevelError + l[errctx.ErrGroupDividedByZero] = errctx.LevelWarn + l[errctx.ErrGroupAutoIncReadFailed] = errctx.LevelError + l[errctx.ErrGroupNoMatchedPartition] = errctx.LevelWarn + return + }(), + }, + } + + for i, c := range cases { + require.NotEmpty(t, c.stmt, c.name) + for _, stmt := range c.stmt { + msg := fmt.Sprintf("%d: %s, stmt: %T", i, c.name, stmt) + ctx.GetSessionVars().SQLMode = c.sqlMode + ctx.GetSessionVars().StrictSQLMode = ctx.GetSessionVars().SQLMode.HasStrictMode() + require.NoError(t, ResetContextOfStmt(ctx, stmt), msg) + ec := ctx.GetSessionVars().StmtCtx.ErrCtx() + require.Equal(t, c.levels, ec.LevelMap(), msg) + } + } +} diff --git a/pkg/executor/explain.go b/pkg/executor/explain.go index ea635b5d0d090..b831f9da7e2d5 100644 --- a/pkg/executor/explain.go +++ b/pkg/executor/explain.go @@ -44,12 +44,11 @@ import ( type ExplainExec struct { exec.BaseExecutor - explain *core.Explain - analyzeExec exec.Executor - executed bool - ruRuntimeStats *clientutil.RURuntimeStats - rows [][]string - cursor int + explain *core.Explain + analyzeExec exec.Executor + executed bool + rows [][]string + cursor int } // Open implements the Executor Open interface. @@ -65,7 +64,7 @@ func (e *ExplainExec) Close() error { e.rows = nil if e.analyzeExec != nil && !e.executed { // Open(), but Next() is not called. - return e.analyzeExec.Close() + return exec.Close(e.analyzeExec) } return nil } @@ -98,7 +97,7 @@ func (e *ExplainExec) Next(ctx context.Context, req *chunk.Chunk) error { func (e *ExplainExec) executeAnalyzeExec(ctx context.Context) (err error) { if e.analyzeExec != nil && !e.executed { defer func() { - err1 := e.analyzeExec.Close() + err1 := exec.Close(e.analyzeExec) if err1 != nil { if err != nil { err = errors.New(err.Error() + ", " + err1.Error()) @@ -136,8 +135,10 @@ func (e *ExplainExec) executeAnalyzeExec(ctx context.Context) (err error) { } // Register the RU runtime stats to the runtime stats collection after the analyze executor has been executed. if e.analyzeExec != nil && e.executed { - if coll := e.Ctx().GetSessionVars().StmtCtx.RuntimeStatsColl; coll != nil { - coll.RegisterStats(e.explain.TargetPlan.ID(), &ruRuntimeStats{e.ruRuntimeStats}) + ruDetailsRaw := ctx.Value(clientutil.RUDetailsCtxKey) + if coll := e.Ctx().GetSessionVars().StmtCtx.RuntimeStatsColl; coll != nil && ruDetailsRaw != nil { + ruDetails := ruDetailsRaw.(*clientutil.RUDetails) + coll.RegisterStats(e.explain.TargetPlan.ID(), &ruRuntimeStats{ruDetails}) } } return err @@ -316,41 +317,33 @@ func getHeapProfile() (fileName string, err error) { return fileName, nil } -// ruRuntimeStats is a wrapper of clientutil.RURuntimeStats, +// ruRuntimeStats is a wrapper of clientutil.RUDetails, // which implements the RuntimeStats interface. type ruRuntimeStats struct { - *clientutil.RURuntimeStats + *clientutil.RUDetails } // String implements the RuntimeStats interface. func (e *ruRuntimeStats) String() string { - if e.RURuntimeStats != nil { - return fmt.Sprintf("RU:%f", e.RURuntimeStats.RRU()+e.RURuntimeStats.WRU()) + if e.RUDetails != nil { + return fmt.Sprintf("RU:%f", e.RRU()+e.WRU()) } return "" } // Clone implements the RuntimeStats interface. func (e *ruRuntimeStats) Clone() execdetails.RuntimeStats { - newRs := &ruRuntimeStats{} - if e.RURuntimeStats != nil { - newRs.RURuntimeStats = e.RURuntimeStats.Clone() - } - return newRs + return &ruRuntimeStats{RUDetails: e.RUDetails.Clone()} } // Merge implements the RuntimeStats interface. func (e *ruRuntimeStats) Merge(other execdetails.RuntimeStats) { - tmp, ok := other.(*ruRuntimeStats) - if !ok { - return - } - if tmp.RURuntimeStats != nil { - if e.RURuntimeStats == nil { - e.RURuntimeStats = tmp.RURuntimeStats.Clone() - return + if tmp, ok := other.(*ruRuntimeStats); ok { + if e.RUDetails != nil { + e.RUDetails.Merge(tmp.RUDetails) + } else { + e.RUDetails = tmp.RUDetails.Clone() } - e.RURuntimeStats.Merge(tmp.RURuntimeStats) } } diff --git a/pkg/executor/explain_test.go b/pkg/executor/explain_test.go index 1feaae20a5dbb..51c7fb5d468b4 100644 --- a/pkg/executor/explain_test.go +++ b/pkg/executor/explain_test.go @@ -83,57 +83,6 @@ func checkMemoryInfo(t *testing.T, tk *testkit.TestKit, sql string) { } } -func TestIssue47331(t *testing.T) { - store := testkit.CreateMockStore(t) - tk := testkit.NewTestKit(t, store) - tk.MustExec("use test") - tk.MustExec("drop table if exists t1") - tk.MustExec(`create table t1( - id1 varchar(2) DEFAULT '00', - id2 varchar(30) NOT NULL, - id3 datetime DEFAULT NULL, - id4 varchar(100) NOT NULL DEFAULT 'ecifdata', - id5 datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, - id6 int(11) DEFAULT NULL, - id7 int(11) DEFAULT NULL, - UNIQUE KEY UI_id2 (id2), - KEY ix_id1 (id1) - )`) - tk.MustExec("drop table if exists t2") - tk.MustExec(`create table t2( - id10 varchar(40) NOT NULL, - id2 varchar(30) NOT NULL, - KEY IX_id2 (id2), - PRIMARY KEY (id10) - )`) - tk.MustExec("drop table if exists t3") - tk.MustExec(`create table t3( - id20 varchar(40) DEFAULT NULL, - UNIQUE KEY IX_id20 (id20) - )`) - tk.MustExec(` - explain - UPDATE t1 a - SET a.id1 = '04', - a.id3 = CURRENT_TIMESTAMP, - a.id4 = SUBSTRING_INDEX(USER(), '@', 1), - a.id5 = CURRENT_TIMESTAMP - WHERE a.id1 = '03' - AND a.id6 - IFNULL(a.id7, 0) = - ( - SELECT COUNT(1) - FROM t2 b, t3 c - WHERE b.id10 = c.id20 - AND b.id2 = a.id2 - AND b.id2 in ( - SELECT rn.id2 - FROM t1 rn - WHERE rn.id1 = '03' - ) - ); - `) -} - func TestMemoryAndDiskUsageAfterClose(t *testing.T) { store := testkit.CreateMockStore(t) tk := testkit.NewTestKit(t, store) @@ -223,29 +172,6 @@ func checkExecutionInfo(t *testing.T, tk *testkit.TestKit, sql string) { } } -func TestExplainAnalyzeActRowsNotEmpty(t *testing.T) { - store := testkit.CreateMockStore(t) - tk := testkit.NewTestKit(t, store) - tk.MustExec("use test") - tk.MustExec("drop table if exists t") - tk.MustExec("create table t (a int, b int, index (a))") - tk.MustExec("insert into t values (1, 1)") - - checkActRowsNotEmpty(t, tk, "explain analyze select * from t t1, t t2 where t1.b = t2.a and t1.b = 2333") -} - -func checkActRowsNotEmpty(t *testing.T, tk *testkit.TestKit, sql string) { - actRowsCol := 2 - rows := tk.MustQuery(sql).Rows() - for _, row := range rows { - strs := make([]string, len(row)) - for i, c := range row { - strs[i] = c.(string) - } - require.NotEqual(t, "", strs[actRowsCol]) - } -} - func checkActRows(t *testing.T, tk *testkit.TestKit, sql string, expected []string) { actRowsCol := 2 rows := tk.MustQuery("explain analyze " + sql).Rows() @@ -545,3 +471,17 @@ func TestExplainFormatInCtx(t *testing.T) { } } } + +func TestExplainImportFromSelect(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t (a int primary key)") + tk.MustExec("create table t_o (a int primary key)") + tk.MustExec("insert into t values (2)") + rs := tk.MustQuery("explain import into t_o from select * from t").Rows() + require.Contains(t, rs[0][0], "ImportInto") + require.Contains(t, rs[1][0], "TableReader") + require.Contains(t, rs[2][0], "TableFullScan") +} diff --git a/pkg/executor/explain_unit_test.go b/pkg/executor/explain_unit_test.go index 897cbd3a6e0c5..6fa34fdcbdcfd 100644 --- a/pkg/executor/explain_unit_test.go +++ b/pkg/executor/explain_unit_test.go @@ -87,11 +87,7 @@ func TestExplainAnalyzeInvokeNextAndClose(t *testing.T) { } mockOpr = mockErrorOperator{baseExec, true, false} explainExec.analyzeExec = &mockOpr - defer func() { - panicErr := recover() - require.NotNil(t, panicErr) - require.True(t, mockOpr.closed) - }() - _, _ = explainExec.generateExplainInfo(tmpCtx) - require.FailNow(t, "generateExplainInfo should panic") + _, err = explainExec.generateExplainInfo(tmpCtx) + require.EqualError(t, err, "next panic, close error") + require.True(t, mockOpr.closed) } diff --git a/pkg/executor/hash_table_test.go b/pkg/executor/hash_table_test.go index 243f46295b0bc..d7382da929625 100644 --- a/pkg/executor/hash_table_test.go +++ b/pkg/executor/hash_table_test.go @@ -167,7 +167,7 @@ func testHashRowContainer(t *testing.T, hashFunc func() hash.Hash64, spill bool) func TestConcurrentMapHashTableMemoryUsage(t *testing.T) { m := newConcurrentMapHashTable() - const iterations = 1024 * hack.LoadFactorNum / hack.LoadFactorDen // 6656 + var iterations = 1024 * hack.LoadFactorNum / hack.LoadFactorDen // 6656 wg := &sync.WaitGroup{} wg.Add(2) // Note: Now concurrentMapHashTable doesn't support inserting in parallel. diff --git a/pkg/executor/historical_stats_test.go b/pkg/executor/historical_stats_test.go index 65e54f20f5140..7aadeb34b986d 100644 --- a/pkg/executor/historical_stats_test.go +++ b/pkg/executor/historical_stats_test.go @@ -138,7 +138,7 @@ func TestRecordHistoryStatsMetaAfterAnalyze(t *testing.T) { tk.MustExec("delete from test.t where test.t.a = 1") err = h.DumpStatsDeltaToKV(true) require.NoError(t, err) - tk.MustQuery(fmt.Sprintf("select modify_count, count from mysql.stats_meta where table_id = '%d' order by create_time desc", tableInfo.Meta().ID)).Sort().Check( + tk.MustQuery(fmt.Sprintf("select modify_count, count from mysql.stats_meta where table_id = '%d'", tableInfo.Meta().ID)).Sort().Check( testkit.Rows("40 20")) tk.MustQuery(fmt.Sprintf("select modify_count, count from mysql.stats_meta_history where table_id = '%d' order by create_time desc limit 1", tableInfo.Meta().ID)).Sort().Check( testkit.Rows("40 20")) @@ -147,7 +147,7 @@ func TestRecordHistoryStatsMetaAfterAnalyze(t *testing.T) { tk.MustExec("update test.t set test.t.b = 4 where test.t.a = 2") err = h.DumpStatsDeltaToKV(true) require.NoError(t, err) - tk.MustQuery(fmt.Sprintf("select modify_count, count from mysql.stats_meta where table_id = '%d' order by create_time desc", tableInfo.Meta().ID)).Sort().Check( + tk.MustQuery(fmt.Sprintf("select modify_count, count from mysql.stats_meta where table_id = '%d'", tableInfo.Meta().ID)).Sort().Check( testkit.Rows("50 20")) tk.MustQuery(fmt.Sprintf("select modify_count, count from mysql.stats_meta_history where table_id = '%d' order by create_time desc limit 1", tableInfo.Meta().ID)).Sort().Check( testkit.Rows("50 20")) diff --git a/pkg/executor/import_into.go b/pkg/executor/import_into.go index cc10e3aaa9e0f..bbbb1e6fccb88 100644 --- a/pkg/executor/import_into.go +++ b/pkg/executor/import_into.go @@ -16,15 +16,18 @@ package executor import ( "context" + "fmt" "sync/atomic" + "github.com/google/uuid" "github.com/pingcap/errors" "github.com/pingcap/failpoint" + "github.com/pingcap/tidb/br/pkg/lightning/log" "github.com/pingcap/tidb/br/pkg/storage" + "github.com/pingcap/tidb/pkg/disttask/framework/handle" "github.com/pingcap/tidb/pkg/disttask/framework/proto" fstorage "github.com/pingcap/tidb/pkg/disttask/framework/storage" "github.com/pingcap/tidb/pkg/disttask/importinto" - "github.com/pingcap/tidb/pkg/executor/asyncloaddata" "github.com/pingcap/tidb/pkg/executor/importer" "github.com/pingcap/tidb/pkg/executor/internal/exec" "github.com/pingcap/tidb/pkg/kv" @@ -57,11 +60,14 @@ const unknownImportedRowCount = -1 // ImportIntoExec represents a IMPORT INTO executor. type ImportIntoExec struct { exec.BaseExecutor + selectExec exec.Executor userSctx sessionctx.Context importPlan *importer.Plan controller *importer.LoadDataController stmt string + plan *plannercore.ImportInto + tbl table.Table dataFilled bool } @@ -69,23 +75,15 @@ var ( _ exec.Executor = (*ImportIntoExec)(nil) ) -func newImportIntoExec(b exec.BaseExecutor, userSctx sessionctx.Context, plan *plannercore.ImportInto, tbl table.Table) ( - *ImportIntoExec, error) { - importPlan, err := importer.NewImportPlan(userSctx, plan, tbl) - if err != nil { - return nil, err - } - astArgs := importer.ASTArgsFromImportPlan(plan) - controller, err := importer.NewLoadDataController(importPlan, tbl, astArgs) - if err != nil { - return nil, err - } +func newImportIntoExec(b exec.BaseExecutor, selectExec exec.Executor, userSctx sessionctx.Context, + plan *plannercore.ImportInto, tbl table.Table) (*ImportIntoExec, error) { return &ImportIntoExec{ BaseExecutor: b, + selectExec: selectExec, userSctx: userSctx, - importPlan: importPlan, - controller: controller, stmt: plan.Stmt, + plan: plan, + tbl: tbl, }, nil } @@ -97,6 +95,23 @@ func (e *ImportIntoExec) Next(ctx context.Context, req *chunk.Chunk) (err error) // need to return an empty req to indicate all results have been written return nil } + importPlan, err := importer.NewImportPlan(ctx, e.userSctx, e.plan, e.tbl) + if err != nil { + return err + } + astArgs := importer.ASTArgsFromImportPlan(e.plan) + controller, err := importer.NewLoadDataController(importPlan, e.tbl, astArgs) + if err != nil { + return err + } + e.importPlan = importPlan + e.controller = controller + + if e.selectExec != nil { + // `import from select` doesn't return rows, so no need to set dataFilled. + return e.importFromSelect(ctx) + } + if err2 := e.controller.InitDataFiles(ctx); err2 != nil { return err2 } @@ -131,11 +146,11 @@ func (e *ImportIntoExec) Next(ctx context.Context, req *chunk.Chunk) (err error) groupCtx = kv.WithInternalSourceType(groupCtx, kv.InternalDistTask) param := &importer.JobImportParam{ - Job: &asyncloaddata.Job{}, + Job: &importer.Job{}, Group: group, GroupCtx: groupCtx, Done: make(chan struct{}), - Progress: asyncloaddata.NewProgress(false), + Progress: importer.NewProgress(), } distImporter, err := e.getJobImporter(ctx, param) if err != nil { @@ -175,14 +190,14 @@ func (e *ImportIntoExec) Next(ctx context.Context, req *chunk.Chunk) (err error) func (e *ImportIntoExec) fillJobInfo(ctx context.Context, jobID int64, req *chunk.Chunk) error { e.dataFilled = true - // we use globalTaskManager to get job, user might not have the privilege to system tables. - globalTaskManager, err := fstorage.GetTaskManager() + // we use taskManager to get job, user might not have the privilege to system tables. + taskManager, err := fstorage.GetTaskManager() ctx = util.WithInternalSourceType(ctx, kv.InternalDistTask) if err != nil { return err } var info *importer.JobInfo - if err = globalTaskManager.WithNewSession(func(se sessionctx.Context) error { + if err = taskManager.WithNewSession(func(se sessionctx.Context) error { sqlExec := se.(sqlexec.SQLExecutor) var err2 error info, err2 = importer.GetJob(ctx, sqlExec, jobID, e.Ctx().GetSessionVars().User.String(), false) @@ -222,19 +237,114 @@ func (e *ImportIntoExec) doImport(ctx context.Context, se sessionctx.Context, di err := group.Wait() // when user KILL the connection, the ctx will be canceled, we need to cancel the import job. if errors.Cause(err) == context.Canceled { - globalTaskManager, err2 := fstorage.GetTaskManager() + taskManager, err2 := fstorage.GetTaskManager() if err2 != nil { return err2 } // use background, since ctx is canceled already. - return cancelImportJob(context.Background(), globalTaskManager, distImporter.JobID()) + return cancelAndWaitImportJob(context.Background(), taskManager, distImporter.JobID()) } - if err2 := flushStats(ctx, se, e.importPlan.TableInfo.ID, distImporter.Result(ctx)); err2 != nil { + importResult := distImporter.Result(ctx) + if err2 := flushStats(ctx, se, e.importPlan.TableInfo.ID, &importResult); err2 != nil { logutil.Logger(ctx).Error("flush stats failed", zap.Error(err2)) } return err } +func (e *ImportIntoExec) importFromSelect(ctx context.Context) error { + e.dataFilled = true + // must use a new session to pre-check, else the stmt in show processlist will be changed. + newSCtx, err2 := CreateSession(e.userSctx) + if err2 != nil { + return err2 + } + defer CloseSession(newSCtx) + + sqlExec := newSCtx.(sqlexec.SQLExecutor) + if err2 = e.controller.CheckRequirements(ctx, sqlExec); err2 != nil { + return err2 + } + if err := e.importPlan.InitTiKVConfigs(ctx, newSCtx); err != nil { + return err + } + + // TODO: we didn't use this `group` here, but have to init GroupCtx, refactor this later. + group, groupCtx := errgroup.WithContext(ctx) + param := &importer.JobImportParam{ + Job: &importer.Job{}, + Group: group, + GroupCtx: groupCtx, + Done: make(chan struct{}), + Progress: importer.NewProgress(), + } + importID := uuid.New().String() + logutil.Logger(ctx).Info("importing data from select statement", + zap.String("import-id", importID), zap.Int("concurrency", e.controller.ThreadCnt), + zap.String("target-table", e.controller.FullTableName()), + zap.Int64("target-table-id", e.controller.TableInfo.ID)) + ti, err2 := importer.NewTableImporter(param, e.controller, importID) + if err2 != nil { + return err2 + } + defer func() { + if err := ti.Close(); err != nil { + logutil.Logger(ctx).Error("close importer failed", zap.Error(err)) + } + }() + selectedRowCh := make(chan importer.QueryRow) + ti.SetSelectedRowCh(selectedRowCh) + + var importResult *importer.JobImportResult + eg, egCtx := errgroup.WithContext(ctx) + eg.Go(func() error { + var err error + importResult, err = ti.ImportSelectedRows(egCtx, newSCtx) + return err + }) + eg.Go(func() error { + defer close(selectedRowCh) + fields := exec.RetTypes(e.selectExec) + var idAllocator int64 + for { + // rows will be consumed concurrently, we cannot use chunk pool in session ctx. + chk := exec.NewFirstChunk(e.selectExec) + iter := chunk.NewIterator4Chunk(chk) + err := exec.Next(egCtx, e.selectExec, chk) + if err != nil { + return err + } + if chk.NumRows() == 0 { + break + } + for innerChunkRow := iter.Begin(); innerChunkRow != iter.End(); innerChunkRow = iter.Next() { + idAllocator++ + select { + case selectedRowCh <- importer.QueryRow{ + ID: idAllocator, + Data: innerChunkRow.GetDatumRow(fields), + }: + case <-egCtx.Done(): + return egCtx.Err() + } + } + } + return nil + }) + if err := eg.Wait(); err != nil { + return err + } + + if err2 = flushStats(ctx, e.userSctx, e.importPlan.TableInfo.ID, importResult); err2 != nil { + logutil.Logger(ctx).Error("flush stats failed", zap.Error(err2)) + } + + stmtCtx := e.userSctx.GetSessionVars().StmtCtx + stmtCtx.SetAffectedRows(importResult.Affected) + // TODO: change it after spec is ready. + stmtCtx.SetMessage(fmt.Sprintf("Records: %d, ID: %s", importResult.Affected, importID)) + return nil +} + // ImportIntoActionExec represents a import into action executor. type ImportIntoActionExec struct { exec.BaseExecutor @@ -247,7 +357,7 @@ var ( ) // Next implements the Executor Next interface. -func (e *ImportIntoActionExec) Next(ctx context.Context, _ *chunk.Chunk) error { +func (e *ImportIntoActionExec) Next(ctx context.Context, _ *chunk.Chunk) (err error) { ctx = kv.WithInternalSourceType(ctx, kv.InternalImportInto) var hasSuperPriv bool @@ -255,17 +365,21 @@ func (e *ImportIntoActionExec) Next(ctx context.Context, _ *chunk.Chunk) error { hasSuperPriv = pm.RequestVerification(e.Ctx().GetSessionVars().ActiveRoles, "", "", "", mysql.SuperPriv) } // we use sessionCtx from GetTaskManager, user ctx might not have enough privileges. - globalTaskManager, err := fstorage.GetTaskManager() + taskManager, err := fstorage.GetTaskManager() ctx = util.WithInternalSourceType(ctx, kv.InternalDistTask) if err != nil { return err } - if err = e.checkPrivilegeAndStatus(ctx, globalTaskManager, hasSuperPriv); err != nil { + if err = e.checkPrivilegeAndStatus(ctx, taskManager, hasSuperPriv); err != nil { return err } - logutil.Logger(ctx).Info("import into action", zap.Int64("jobID", e.jobID), zap.Any("action", e.tp)) - return cancelImportJob(ctx, globalTaskManager, e.jobID) + task := log.BeginTask(logutil.Logger(ctx).With(zap.Int64("jobID", e.jobID), + zap.Any("action", e.tp)), "import into action") + defer func() { + task.End(zap.ErrorLevel, err) + }() + return cancelAndWaitImportJob(ctx, taskManager, e.jobID) } func (e *ImportIntoActionExec) checkPrivilegeAndStatus(ctx context.Context, manager *fstorage.TaskManager, hasSuperPriv bool) error { @@ -285,7 +399,7 @@ func (e *ImportIntoActionExec) checkPrivilegeAndStatus(ctx context.Context, mana } // flushStats flushes the stats of the table. -func flushStats(ctx context.Context, se sessionctx.Context, tableID int64, result importer.JobImportResult) error { +func flushStats(ctx context.Context, se sessionctx.Context, tableID int64, result *importer.JobImportResult) error { if err := sessiontxn.NewTxn(ctx, se); err != nil { return err } @@ -297,16 +411,12 @@ func flushStats(ctx context.Context, se sessionctx.Context, tableID int64, resul return se.CommitTxn(ctx) } -func cancelImportJob(ctx context.Context, manager *fstorage.TaskManager, jobID int64) error { - // todo: cancel is async operation, we don't wait here now, maybe add a wait syntax later. - // todo: after CANCEL, user can see the job status is Canceled immediately, but the job might still running. - // todo: add a CANCELLING status? - return manager.WithNewTxn(ctx, func(se sessionctx.Context) error { - exec := se.(sqlexec.SQLExecutor) - if err2 := importer.CancelJob(ctx, exec, jobID); err2 != nil { - return err2 - } +func cancelAndWaitImportJob(ctx context.Context, manager *fstorage.TaskManager, jobID int64) error { + if err := manager.WithNewTxn(ctx, func(se sessionctx.Context) error { ctx = util.WithInternalSourceType(ctx, kv.InternalDistTask) - return manager.CancelGlobalTaskByKeySession(ctx, se, importinto.TaskKey(jobID)) - }) + return manager.CancelTaskByKeySession(ctx, se, importinto.TaskKey(jobID)) + }); err != nil { + return err + } + return handle.WaitTaskDoneByKey(ctx, importinto.TaskKey(jobID)) } diff --git a/pkg/executor/importer/BUILD.bazel b/pkg/executor/importer/BUILD.bazel index 5e1afc2d8332b..c7f89bf2694f0 100644 --- a/pkg/executor/importer/BUILD.bazel +++ b/pkg/executor/importer/BUILD.bazel @@ -9,6 +9,7 @@ go_library( "job.go", "kv_encode.go", "precheck.go", + "progress.go", "table_import.go", ], importpath = "github.com/pingcap/tidb/pkg/executor/importer", @@ -31,10 +32,13 @@ go_library( "//br/pkg/utils", "//pkg/config", "//pkg/ddl/util", - "//pkg/executor/asyncloaddata", + "//pkg/disttask/framework/handle", + "//pkg/disttask/framework/proto", "//pkg/expression", + "//pkg/keyspace", "//pkg/kv", "//pkg/meta/autoid", + "//pkg/metrics", "//pkg/parser", "//pkg/parser/ast", "//pkg/parser/format", @@ -51,12 +55,15 @@ go_library( "//pkg/types", "//pkg/util", "//pkg/util/chunk", + "//pkg/util/cpu", "//pkg/util/dbterror", "//pkg/util/dbterror/exeerrors", "//pkg/util/etcd", "//pkg/util/filter", "//pkg/util/intest", "//pkg/util/logutil", + "//pkg/util/mathutil", + "//pkg/util/promutil", "//pkg/util/sqlexec", "//pkg/util/stringutil", "//pkg/util/syncutil", @@ -69,6 +76,8 @@ go_library( "@com_github_tikv_client_go_v2//tikv", "@com_github_tikv_client_go_v2//util", "@com_github_tikv_pd_client//:client", + "@com_github_tikv_pd_client//http", + "@io_etcd_go_etcd_client_v3//:client", "@org_golang_x_sync//errgroup", "@org_uber_go_multierr//:multierr", "@org_uber_go_zap//:zap", @@ -81,25 +90,31 @@ go_test( srcs = [ "chunk_process_testkit_test.go", "import_test.go", + "importer_testkit_test.go", "job_test.go", + "main_test.go", "precheck_test.go", "table_import_test.go", + "table_import_testkit_test.go", ], embed = [":importer"], flaky = True, race = "on", - shard_count = 20, + shard_count = 24, deps = [ "//br/pkg/errors", "//br/pkg/lightning/backend/encode", + "//br/pkg/lightning/backend/local", "//br/pkg/lightning/checkpoints", "//br/pkg/lightning/config", "//br/pkg/lightning/log", "//br/pkg/lightning/mydump", + "//br/pkg/lightning/verification", "//br/pkg/mock", "//br/pkg/streamhelper", "//br/pkg/utils", "//pkg/config", + "//pkg/disttask/framework/testutil", "//pkg/expression", "//pkg/infoschema", "//pkg/kv", @@ -108,9 +123,12 @@ go_test( "//pkg/parser/model", "//pkg/planner/core", "//pkg/session", + "//pkg/sessionctx", "//pkg/sessionctx/variable", "//pkg/testkit", + "//pkg/testkit/testsetup", "//pkg/types", + "//pkg/util", "//pkg/util/dbterror/exeerrors", "//pkg/util/etcd", "//pkg/util/logutil", @@ -119,6 +137,7 @@ go_test( "//pkg/util/syncutil", "@com_github_johannesboyne_gofakes3//:gofakes3", "@com_github_johannesboyne_gofakes3//backend/s3mem", + "@com_github_ngaut_pools//:pools", "@com_github_pingcap_errors//:errors", "@com_github_pingcap_failpoint//:failpoint", "@com_github_pingcap_log//:log", @@ -127,6 +146,7 @@ go_test( "@com_github_tikv_client_go_v2//util", "@io_etcd_go_etcd_client_v3//:client", "@io_etcd_go_etcd_server_v3//embed", + "@org_uber_go_goleak//:goleak", "@org_uber_go_mock//gomock", "@org_uber_go_zap//:zap", ], diff --git a/pkg/executor/importer/chunk_process.go b/pkg/executor/importer/chunk_process.go index aa559475a4462..636f1048212f9 100644 --- a/pkg/executor/importer/chunk_process.go +++ b/pkg/executor/importer/chunk_process.go @@ -32,6 +32,7 @@ import ( "github.com/pingcap/tidb/br/pkg/lightning/mydump" verify "github.com/pingcap/tidb/br/pkg/lightning/verification" "github.com/pingcap/tidb/pkg/tablecodec" + "github.com/pingcap/tidb/pkg/types" "github.com/pingcap/tidb/pkg/util/syncutil" "github.com/prometheus/client_golang/prometheus" "github.com/tikv/client-go/v2/tikv" @@ -100,8 +101,14 @@ func (b *deliverKVBatch) add(kvs *kv.Pairs) { } } -// chunkEncoder encode data chunk(either a data file or part of a file). -type chunkEncoder struct { +type chunkEncoder interface { + init() error + encodeLoop(ctx context.Context) error + summaryFields() []zap.Field +} + +// fileChunkEncoder encode data chunk(either a data file or part of a file). +type fileChunkEncoder struct { parser mydump.Parser chunkInfo *checkpoints.ChunkCheckpoint logger *zap.Logger @@ -116,10 +123,11 @@ type chunkEncoder struct { // total duration takes by read/encode/deliver. readTotalDur time.Duration encodeTotalDur time.Duration - metrics *metric.Common } -func (p *chunkEncoder) initProgress() error { +var _ chunkEncoder = (*fileChunkEncoder)(nil) + +func (p *fileChunkEncoder) init() error { // we might skip N rows or start from checkpoint offset, err := p.parser.ScannedPos() if err != nil { @@ -129,16 +137,17 @@ func (p *chunkEncoder) initProgress() error { return nil } -func (p *chunkEncoder) encodeLoop(ctx context.Context) error { +func (p *fileChunkEncoder) encodeLoop(ctx context.Context) error { var err error reachEOF := false prevOffset, currOffset := p.startOffset, p.startOffset var encodedBytesCounter, encodedRowsCounter prometheus.Counter - if p.metrics != nil { - encodedBytesCounter = p.metrics.BytesCounter.WithLabelValues(metric.StateRestored) + metrics, _ := metric.GetCommonMetric(ctx) + if metrics != nil { + encodedBytesCounter = metrics.BytesCounter.WithLabelValues(metric.StateRestored) // table name doesn't matter here, all those metrics will have task-id label. - encodedRowsCounter = p.metrics.RowsCounter.WithLabelValues(metric.StateRestored, "") + encodedRowsCounter = metrics.RowsCounter.WithLabelValues(metric.StateRestored, "") } for !reachEOF { @@ -199,9 +208,9 @@ func (p *chunkEncoder) encodeLoop(ctx context.Context) error { p.encodeTotalDur += encodeDur p.readTotalDur += readDur - if p.metrics != nil { - p.metrics.RowEncodeSecondsHistogram.Observe(encodeDur.Seconds()) - p.metrics.RowReadSecondsHistogram.Observe(readDur.Seconds()) + if metrics != nil { + metrics.RowEncodeSecondsHistogram.Observe(encodeDur.Seconds()) + metrics.RowReadSecondsHistogram.Observe(readDur.Seconds()) // if we're using split_file, this metric might larger than total // source file size, as the offset we're using is the reader offset, // not parser offset, and we'll buffer data. @@ -219,6 +228,13 @@ func (p *chunkEncoder) encodeLoop(ctx context.Context) error { return nil } +func (p *fileChunkEncoder) summaryFields() []zap.Field { + return []zap.Field{ + zap.Duration("readDur", p.readTotalDur), + zap.Duration("encodeDur", p.encodeTotalDur), + } +} + // ChunkProcessor is used to process a chunk of data, include encode data to KV // and deliver KV to local or global storage. type ChunkProcessor interface { @@ -226,70 +242,44 @@ type ChunkProcessor interface { } type baseChunkProcessor struct { - enc *chunkEncoder - logger *zap.Logger - kvCodec tikv.Codec - deliverLoop func(ctx context.Context) error - encodeDone func(ctx context.Context) - - // initialized when Process - metrics *metric.Common - - checksum verify.KVChecksum - deliverTotalDur time.Duration + sourceType DataSourceType + enc chunkEncoder + deliver *dataDeliver + logger *zap.Logger + chunkInfo *checkpoints.ChunkCheckpoint } func (p *baseChunkProcessor) Process(ctx context.Context) (err error) { task := log.BeginTask(p.logger, "process chunk") defer func() { - task.End(zap.ErrorLevel, err, - zap.Duration("readDur", p.enc.readTotalDur), - zap.Duration("encodeDur", p.enc.encodeTotalDur), - zap.Duration("deliverDur", p.deliverTotalDur), - zap.Object("checksum", &p.checksum), - ) - if err == nil && p.metrics != nil { - p.metrics.ChunkCounter.WithLabelValues(metric.ChunkStateFinished).Inc() + logFields := append(p.enc.summaryFields(), p.deliver.logFields()...) + logFields = append(logFields, zap.Stringer("type", p.sourceType)) + task.End(zap.ErrorLevel, err, logFields...) + if metrics, ok := metric.GetCommonMetric(ctx); ok && err == nil { + metrics.ChunkCounter.WithLabelValues(metric.ChunkStateFinished).Inc() } }() - if err2 := p.enc.initProgress(); err2 != nil { + if err2 := p.enc.init(); err2 != nil { return err2 } - if metrics, ok := metric.GetCommonMetric(ctx); ok { - p.enc.metrics = metrics - p.metrics = p.enc.metrics - } - group, gCtx := errgroup.WithContext(ctx) group.Go(func() error { - return p.deliverLoop(gCtx) + return p.deliver.deliverLoop(gCtx) }) group.Go(func() error { - defer p.encodeDone(gCtx) + defer p.deliver.encodeDone() return p.enc.encodeLoop(gCtx) }) err2 := group.Wait() - p.enc.chunkInfo.Checksum.Add(&p.checksum) + p.chunkInfo.Checksum.Add(&p.deliver.checksum) return err2 } -// localSortChunkProcessor encode and sort kv, then write to local storage. -// each chunk processor will have a pair of encode and deliver routine. -type localSortChunkProcessor struct { - *baseChunkProcessor - kvsCh chan []deliveredRow - diskQuotaLock *syncutil.RWMutex - dataWriter backend.EngineWriter - indexWriter backend.EngineWriter -} - -var _ ChunkProcessor = &localSortChunkProcessor{} - -// NewLocalSortChunkProcessor creates a new local sort chunk processor. +// NewFileChunkProcessor creates a new local sort chunk processor. // exported for test. -func NewLocalSortChunkProcessor( +func NewFileChunkProcessor( parser mydump.Parser, encoder KVEncoder, kvCodec tikv.Codec, @@ -300,34 +290,47 @@ func NewLocalSortChunkProcessor( indexWriter backend.EngineWriter, ) ChunkProcessor { chunkLogger := logger.With(zap.String("key", chunk.GetKey())) - cp := &localSortChunkProcessor{ + deliver := &dataDeliver{ + logger: chunkLogger, + kvCodec: kvCodec, diskQuotaLock: diskQuotaLock, kvsCh: make(chan []deliveredRow, maxKVQueueSize), dataWriter: dataWriter, indexWriter: indexWriter, } - cp.baseChunkProcessor = &baseChunkProcessor{ - enc: &chunkEncoder{ + return &baseChunkProcessor{ + sourceType: DataSourceTypeFile, + deliver: deliver, + enc: &fileChunkEncoder{ parser: parser, chunkInfo: chunk, logger: chunkLogger, encoder: encoder, kvCodec: kvCodec, - sendFn: cp.sendEncodedData, + sendFn: deliver.sendEncodedData, }, - logger: chunkLogger, - kvCodec: kvCodec, - deliverLoop: cp.deliverLoop, - encodeDone: cp.encodeDone, + logger: chunkLogger, + chunkInfo: chunk, } - return cp } -func (p *localSortChunkProcessor) encodeDone(context.Context) { +type dataDeliver struct { + logger *zap.Logger + kvCodec tikv.Codec + kvsCh chan []deliveredRow + diskQuotaLock *syncutil.RWMutex + dataWriter backend.EngineWriter + indexWriter backend.EngineWriter + + checksum verify.KVChecksum + deliverTotalDur time.Duration +} + +func (p *dataDeliver) encodeDone() { close(p.kvsCh) } -func (p *localSortChunkProcessor) sendEncodedData(ctx context.Context, kvs []deliveredRow) error { +func (p *dataDeliver) sendEncodedData(ctx context.Context, kvs []deliveredRow) error { select { case p.kvsCh <- kvs: return nil @@ -336,7 +339,7 @@ func (p *localSortChunkProcessor) sendEncodedData(ctx context.Context, kvs []del } } -func (p *localSortChunkProcessor) deliverLoop(ctx context.Context) error { +func (p *dataDeliver) deliverLoop(ctx context.Context) error { kvBatch := newDeliverKVBatch(p.kvCodec) var ( @@ -344,12 +347,14 @@ func (p *localSortChunkProcessor) deliverLoop(ctx context.Context) error { dataKVPairsHist, indexKVPairsHist prometheus.Observer deliverBytesCounter prometheus.Counter ) - if p.metrics != nil { - dataKVBytesHist = p.metrics.BlockDeliverBytesHistogram.WithLabelValues(metric.BlockDeliverKindData) - indexKVBytesHist = p.metrics.BlockDeliverBytesHistogram.WithLabelValues(metric.BlockDeliverKindIndex) - dataKVPairsHist = p.metrics.BlockDeliverKVPairsHistogram.WithLabelValues(metric.BlockDeliverKindData) - indexKVPairsHist = p.metrics.BlockDeliverKVPairsHistogram.WithLabelValues(metric.BlockDeliverKindIndex) - deliverBytesCounter = p.metrics.BytesCounter.WithLabelValues(metric.StateRestoreWritten) + + metrics, _ := metric.GetCommonMetric(ctx) + if metrics != nil { + dataKVBytesHist = metrics.BlockDeliverBytesHistogram.WithLabelValues(metric.BlockDeliverKindData) + indexKVBytesHist = metrics.BlockDeliverBytesHistogram.WithLabelValues(metric.BlockDeliverKindIndex) + dataKVPairsHist = metrics.BlockDeliverKVPairsHistogram.WithLabelValues(metric.BlockDeliverKindData) + indexKVPairsHist = metrics.BlockDeliverKVPairsHistogram.WithLabelValues(metric.BlockDeliverKindIndex) + deliverBytesCounter = metrics.BytesCounter.WithLabelValues(metric.StateRestoreWritten) } for { @@ -392,8 +397,8 @@ func (p *localSortChunkProcessor) deliverLoop(ctx context.Context) error { deliverDur := time.Since(start) p.deliverTotalDur += deliverDur - if p.metrics != nil { - p.metrics.BlockDeliverSecondsHistogram.Observe(deliverDur.Seconds()) + if metrics != nil { + metrics.BlockDeliverSecondsHistogram.Observe(deliverDur.Seconds()) dataKVBytesHist.Observe(float64(kvBatch.dataChecksum.SumSize())) indexKVBytesHist.Observe(float64(kvBatch.indexChecksum.SumSize())) dataKVPairsHist.Observe(float64(kvBatch.dataChecksum.SumKVS())) @@ -405,7 +410,7 @@ func (p *localSortChunkProcessor) deliverLoop(ctx context.Context) error { return err } - if p.metrics != nil { + if metrics != nil { deliverBytesCounter.Add(float64(kvBatch.size())) } @@ -418,6 +423,154 @@ func (p *localSortChunkProcessor) deliverLoop(ctx context.Context) error { return nil } +func (p *dataDeliver) logFields() []zap.Field { + return []zap.Field{ + zap.Duration("deliverDur", p.deliverTotalDur), + zap.Object("checksum", &p.checksum), + } +} + +// fileChunkEncoder encode data chunk(either a data file or part of a file). +type queryChunkEncoder struct { + rowCh chan QueryRow + chunkInfo *checkpoints.ChunkCheckpoint + logger *zap.Logger + encoder KVEncoder + sendFn func(ctx context.Context, kvs []deliveredRow) error + + // total duration takes by read/encode/deliver. + readTotalDur time.Duration + encodeTotalDur time.Duration +} + +var _ chunkEncoder = (*queryChunkEncoder)(nil) + +func (*queryChunkEncoder) init() error { + return nil +} + +// TODO logic is very similar to fileChunkEncoder, consider merge them. +func (e *queryChunkEncoder) encodeLoop(ctx context.Context) error { + var err error + reachEOF := false + var encodedRowsCounter prometheus.Counter + metrics, _ := metric.GetCommonMetric(ctx) + if metrics != nil { + // table name doesn't matter here, all those metrics will have task-id label. + encodedRowsCounter = metrics.RowsCounter.WithLabelValues(metric.StateRestored, "") + } + + for !reachEOF { + var readDur, encodeDur time.Duration + canDeliver := false + rowBatch := make([]deliveredRow, 0, MinDeliverRowCnt) + var rowCount, kvSize uint64 + outLoop: + for !canDeliver { + readDurStart := time.Now() + var ( + lastRow QueryRow + rowID int64 + ok bool + ) + select { + case lastRow, ok = <-e.rowCh: + if !ok { + reachEOF = true + break outLoop + } + case <-ctx.Done(): + return ctx.Err() + } + readDur += time.Since(readDurStart) + encodeDurStart := time.Now() + // sql -> kv + kvs, encodeErr := e.encoder.Encode(lastRow.Data, lastRow.ID) + encodeDur += time.Since(encodeDurStart) + + if encodeErr != nil { + err = common.ErrEncodeKV.Wrap(encodeErr).GenWithStackByArgs(e.chunkInfo.GetKey(), rowID) + } + if err != nil { + return err + } + + rowBatch = append(rowBatch, deliveredRow{kvs: kvs}) + kvSize += kvs.Size() + rowCount++ + // pebble cannot allow > 4.0G kv in one batch. + // we will meet pebble panic when import sql file and each kv has the size larger than 4G / maxKvPairsCnt. + // so add this check. + if kvSize >= MinDeliverBytes || len(rowBatch) >= MinDeliverRowCnt { + canDeliver = true + } + } + + e.encodeTotalDur += encodeDur + e.readTotalDur += readDur + if metrics != nil { + metrics.RowEncodeSecondsHistogram.Observe(encodeDur.Seconds()) + metrics.RowReadSecondsHistogram.Observe(readDur.Seconds()) + encodedRowsCounter.Add(float64(rowCount)) + } + + if len(rowBatch) > 0 { + if err = e.sendFn(ctx, rowBatch); err != nil { + return err + } + } + } + + return nil +} + +func (e *queryChunkEncoder) summaryFields() []zap.Field { + return []zap.Field{ + zap.Duration("readDur", e.readTotalDur), + zap.Duration("encodeDur", e.encodeTotalDur), + } +} + +// QueryRow is a row from query result. +type QueryRow struct { + ID int64 + Data []types.Datum +} + +func newQueryChunkProcessor( + rowCh chan QueryRow, + encoder KVEncoder, + kvCodec tikv.Codec, + chunk *checkpoints.ChunkCheckpoint, + logger *zap.Logger, + diskQuotaLock *syncutil.RWMutex, + dataWriter backend.EngineWriter, + indexWriter backend.EngineWriter, +) ChunkProcessor { + chunkLogger := logger.With(zap.String("key", chunk.GetKey())) + deliver := &dataDeliver{ + logger: chunkLogger, + kvCodec: kvCodec, + diskQuotaLock: diskQuotaLock, + kvsCh: make(chan []deliveredRow, maxKVQueueSize), + dataWriter: dataWriter, + indexWriter: indexWriter, + } + return &baseChunkProcessor{ + sourceType: DataSourceTypeQuery, + deliver: deliver, + enc: &queryChunkEncoder{ + rowCh: rowCh, + chunkInfo: chunk, + logger: chunkLogger, + encoder: encoder, + sendFn: deliver.sendEncodedData, + }, + logger: chunkLogger, + chunkInfo: chunk, + } +} + // IndexRouteWriter is a writer for index when using global sort. // we route kvs of different index to different writer in order to make // merge sort easier, else kv data of all subtasks will all be overlapped. diff --git a/pkg/executor/importer/chunk_process_testkit_test.go b/pkg/executor/importer/chunk_process_testkit_test.go index cc3f18af27a93..4dabe52f7073a 100644 --- a/pkg/executor/importer/chunk_process_testkit_test.go +++ b/pkg/executor/importer/chunk_process_testkit_test.go @@ -111,7 +111,7 @@ func TestLocalSortChunkProcess(t *testing.T) { diskQuotaLock := &syncutil.RWMutex{} codec := tikv.NewCodecV1(tikv.ModeRaw) - processor := importer.NewLocalSortChunkProcessor( + processor := importer.NewFileChunkProcessor( csvParser, encoder, codec, chunkInfo, logger.Logger, diskQuotaLock, engineWriter, engineWriter, ) diff --git a/pkg/executor/importer/engine_process.go b/pkg/executor/importer/engine_process.go index e28daa75599da..51803023ac8fd 100644 --- a/pkg/executor/importer/engine_process.go +++ b/pkg/executor/importer/engine_process.go @@ -20,7 +20,7 @@ import ( "github.com/pingcap/tidb/br/pkg/lightning/backend" "github.com/pingcap/tidb/br/pkg/lightning/checkpoints" "github.com/pingcap/tidb/br/pkg/lightning/common" - "github.com/pingcap/tidb/pkg/executor/asyncloaddata" + "github.com/pingcap/tidb/br/pkg/lightning/mydump" "go.uber.org/zap" ) @@ -31,7 +31,7 @@ func ProcessChunk( tableImporter *TableImporter, dataEngine, indexEngine *backend.OpenedEngine, - progress *asyncloaddata.Progress, + progress *Progress, logger *zap.Logger, ) error { // if the key are ordered, LocalWrite can optimize the writing. @@ -75,18 +75,24 @@ func ProcessChunkWith( chunk *checkpoints.ChunkCheckpoint, tableImporter *TableImporter, dataWriter, indexWriter backend.EngineWriter, - progress *asyncloaddata.Progress, + progress *Progress, logger *zap.Logger, ) error { - parser, err := tableImporter.getParser(ctx, chunk) - if err != nil { - return err - } - defer func() { - if err2 := parser.Close(); err2 != nil { - logger.Warn("close parser failed", zap.Error(err2)) + var ( + err error + parser mydump.Parser + ) + if tableImporter.DataSourceType == DataSourceTypeFile { + parser, err = tableImporter.getParser(ctx, chunk) + if err != nil { + return err } - }() + defer func() { + if err2 := parser.Close(); err2 != nil { + logger.Warn("close parser failed", zap.Error(err2)) + } + }() + } encoder, err := tableImporter.getKVEncoder(chunk) if err != nil { return err @@ -99,10 +105,18 @@ func ProcessChunkWith( // TODO: right now we use this chunk processor for global sort too, will // impl another one for it later. - cp := NewLocalSortChunkProcessor( - parser, encoder, tableImporter.kvStore.GetCodec(), chunk, logger, - tableImporter.diskQuotaLock, dataWriter, indexWriter, - ) + var cp ChunkProcessor + if tableImporter.DataSourceType == DataSourceTypeQuery { + cp = newQueryChunkProcessor( + tableImporter.rowCh, encoder, tableImporter.kvStore.GetCodec(), chunk, logger, + tableImporter.diskQuotaLock, dataWriter, indexWriter, + ) + } else { + cp = NewFileChunkProcessor( + parser, encoder, tableImporter.kvStore.GetCodec(), chunk, logger, + tableImporter.diskQuotaLock, dataWriter, indexWriter, + ) + } err = cp.Process(ctx) if err != nil { return err diff --git a/pkg/executor/importer/import.go b/pkg/executor/importer/import.go index 2dd931e828658..e072c02e7f188 100644 --- a/pkg/executor/importer/import.go +++ b/pkg/executor/importer/import.go @@ -28,7 +28,6 @@ import ( "unicode/utf8" "github.com/pingcap/errors" - "github.com/pingcap/failpoint" "github.com/pingcap/log" "github.com/pingcap/tidb/br/pkg/lightning/backend/local" "github.com/pingcap/tidb/br/pkg/lightning/common" @@ -38,7 +37,7 @@ import ( "github.com/pingcap/tidb/br/pkg/storage" tidb "github.com/pingcap/tidb/pkg/config" "github.com/pingcap/tidb/pkg/ddl/util" - "github.com/pingcap/tidb/pkg/executor/asyncloaddata" + "github.com/pingcap/tidb/pkg/disttask/framework/handle" "github.com/pingcap/tidb/pkg/expression" tidbkv "github.com/pingcap/tidb/pkg/kv" "github.com/pingcap/tidb/pkg/parser" @@ -54,10 +53,10 @@ import ( "github.com/pingcap/tidb/pkg/table" tidbutil "github.com/pingcap/tidb/pkg/util" "github.com/pingcap/tidb/pkg/util/chunk" + "github.com/pingcap/tidb/pkg/util/cpu" "github.com/pingcap/tidb/pkg/util/dbterror" "github.com/pingcap/tidb/pkg/util/dbterror/exeerrors" "github.com/pingcap/tidb/pkg/util/filter" - "github.com/pingcap/tidb/pkg/util/intest" "github.com/pingcap/tidb/pkg/util/logutil" "github.com/pingcap/tidb/pkg/util/stringutil" kvconfig "github.com/tikv/client-go/v2/config" @@ -102,6 +101,7 @@ const ( ) var ( + // all supported options. // name -> whether the option has value supportedOptions = map[string]bool{ characterSetOption: true, @@ -134,6 +134,10 @@ var ( splitFileOption: {}, } + allowedOptionsOfImportFromQuery = map[string]struct{}{ + threadOption: {}, + } + // LoadDataReadBlockSize is exposed for test. LoadDataReadBlockSize = int64(config.ReadBlockSize) @@ -145,6 +149,21 @@ var ( } ) +// DataSourceType indicates the data source type of IMPORT INTO. +type DataSourceType string + +const ( + // DataSourceTypeFile represents the data source of IMPORT INTO is file. + // exported for test. + DataSourceTypeFile DataSourceType = "file" + // DataSourceTypeQuery represents the data source of IMPORT INTO is query. + DataSourceTypeQuery DataSourceType = "query" +) + +func (t DataSourceType) String() string { + return string(t) +} + // GetKVStore returns a kv.Storage. // kv encoder of physical mode needs it. var GetKVStore func(path string, tls kvconfig.Security) (tidbkv.Storage, error) @@ -175,7 +194,8 @@ type Plan struct { // after import. DesiredTableInfo *model.TableInfo - Path string + Path string + // only effective when data source is file. Format string // Data interpretation is restrictive if the SQL mode is restrictive and neither // the IGNORE nor the LOCAL modifier is specified. Errors terminate the load @@ -201,7 +221,7 @@ type Plan struct { DiskQuota config.ByteSize Checksum config.PostOpLevel - ThreadCnt int64 + ThreadCnt int MaxWriteSpeed config.ByteSize SplitFile bool MaxRecordedErrors int64 @@ -214,7 +234,8 @@ type Plan struct { DistSQLScanConcurrency int // todo: remove it when load data code is reverted. - InImportInto bool + InImportInto bool + DataSourceType DataSourceType // only initialized for IMPORT INTO, used when creating job. Parameters *ImportParameters `json:"-"` // the user who executes the statement, in the form of user@host @@ -345,11 +366,12 @@ func NewPlanFromLoadDataPlan(userSctx sessionctx.Context, plan *plannercore.Load ImportantSysVars: getImportantSysVars(userSctx), DistSQLScanConcurrency: userSctx.GetSessionVars().DistSQLScanConcurrency(), + DataSourceType: DataSourceTypeFile, }, nil } // NewImportPlan creates a new import into plan. -func NewImportPlan(userSctx sessionctx.Context, plan *plannercore.ImportInto, tbl table.Table) (*Plan, error) { +func NewImportPlan(ctx context.Context, userSctx sessionctx.Context, plan *plannercore.ImportInto, tbl table.Table) (*Plan, error) { var format string if plan.Format != nil { format = strings.ToLower(*plan.Format) @@ -386,9 +408,10 @@ func NewImportPlan(userSctx sessionctx.Context, plan *plannercore.ImportInto, tb DistSQLScanConcurrency: userSctx.GetSessionVars().DistSQLScanConcurrency(), InImportInto: true, + DataSourceType: getDataSourceType(plan), User: userSctx.GetSessionVars().User.String(), } - if err := p.initOptions(userSctx, plan.Options); err != nil { + if err := p.initOptions(ctx, userSctx, plan.Options); err != nil { return nil, err } if err := p.initParameters(plan); err != nil { @@ -472,7 +495,7 @@ func NewLoadDataController(plan *Plan, tbl table.Table, astArgs *ASTArgs) (*Load } func (e *LoadDataController) checkFieldParams() error { - if e.Path == "" { + if e.DataSourceType == DataSourceTypeFile && e.Path == "" { return exeerrors.ErrLoadDataEmptyPath } if e.InImportInto { @@ -501,15 +524,15 @@ func (e *LoadDataController) checkFieldParams() error { return nil } -func (p *Plan) initDefaultOptions() { - threadCnt := runtime.GOMAXPROCS(0) - failpoint.Inject("mockNumCpu", func(val failpoint.Value) { - threadCnt = val.(int) - }) - threadCnt = int(math.Max(1, float64(threadCnt)*0.5)) +func (p *Plan) initDefaultOptions(targetNodeCPUCnt int) { + threadCnt := int(math.Max(1, float64(targetNodeCPUCnt)*0.5)) + if p.DataSourceType == DataSourceTypeQuery { + // TODO: change after spec is ready. + threadCnt = 1 + } p.Checksum = config.OpLevelRequired - p.ThreadCnt = int64(threadCnt) + p.ThreadCnt = threadCnt p.MaxWriteSpeed = unlimitedWriteSpeed p.SplitFile = false p.MaxRecordedErrors = 100 @@ -522,8 +545,12 @@ func (p *Plan) initDefaultOptions() { p.Charset = &v } -func (p *Plan) initOptions(seCtx sessionctx.Context, options []*plannercore.LoadDataOpt) error { - p.initDefaultOptions() +func (p *Plan) initOptions(ctx context.Context, seCtx sessionctx.Context, options []*plannercore.LoadDataOpt) error { + targetNodeCPUCnt, err := GetTargetNodeCPUCnt(ctx, p.DataSourceType, p.Path) + if err != nil { + return err + } + p.initDefaultOptions(targetNodeCPUCnt) specifiedOptions := map[string]*plannercore.LoadDataOpt{} for _, opt := range options { @@ -547,6 +574,13 @@ func (p *Plan) initOptions(seCtx sessionctx.Context, options []*plannercore.Load } } } + if p.DataSourceType == DataSourceTypeQuery { + for k := range specifiedOptions { + if _, ok := allowedOptionsOfImportFromQuery[k]; !ok { + return exeerrors.ErrLoadDataUnsupportedOption.FastGenByArgs(k, "import from query") + } + } + } optAsString := func(opt *plannercore.LoadDataOpt) (string, error) { if opt.Value.GetType().GetType() != mysql.TypeVarString { @@ -640,7 +674,7 @@ func (p *Plan) initOptions(seCtx sessionctx.Context, options []*plannercore.Load if err != nil || vInt <= 0 { return exeerrors.ErrInvalidOptionVal.FastGenByArgs(opt.Name) } - p.ThreadCnt = vInt + p.ThreadCnt = int(vInt) } if opt, ok := specifiedOptions[maxWriteSpeedOption]; ok { v, err := optAsString(opt) @@ -711,16 +745,23 @@ func (p *Plan) initOptions(seCtx sessionctx.Context, options []*plannercore.Load return exeerrors.ErrInvalidOptionVal.FastGenByArgs("skip_rows, should be <= 1 when split-file is enabled") } - p.adjustOptions() + p.adjustOptions(targetNodeCPUCnt) return nil } -func (p *Plan) adjustOptions() { +func (p *Plan) adjustOptions(targetNodeCPUCnt int) { + limit := targetNodeCPUCnt + if p.DataSourceType == DataSourceTypeQuery { + // for query, row is produced using 1 thread, the max cpu used is much + // lower than import from file, so we set limit to 2*targetNodeCPUCnt. + // TODO: adjust after spec is ready. + limit *= 2 + } // max value is cpu-count - numCPU := int64(runtime.GOMAXPROCS(0)) - if p.ThreadCnt > numCPU { - log.L().Info("IMPORT INTO thread count is larger than cpu-count, set to cpu-count") - p.ThreadCnt = numCPU + if p.ThreadCnt > limit { + log.L().Info("adjust IMPORT INTO thread count", + zap.Int("before", p.ThreadCnt), zap.Int("after", limit)) + p.ThreadCnt = limit } } @@ -945,11 +986,7 @@ func (*LoadDataController) initExternalStore(ctx context.Context, u *url.URL, ta return nil, exeerrors.ErrLoadDataInvalidURI.GenWithStackByArgs(target, GetMsgFromBRError(err2)) } - opt := &storage.ExternalStorageOptions{} - if intest.InTest { - opt.NoCredentials = true - } - s, err := storage.New(ctx, b, opt) + s, err := storage.NewWithDefaultOpt(ctx, b) if err != nil { return nil, exeerrors.ErrLoadDataCantAccess.GenWithStackByArgs(target, GetMsgFromBRError(err)) } @@ -1259,7 +1296,7 @@ func (e *LoadDataController) getBackendWorkerConcurrency() int { // The real concurrency used is adjusted in external engine later. // when using local sort, use the default value as lightning. if e.IsGlobalSort() { - return int(e.ThreadCnt) * 2 + return e.ThreadCnt * 2 } return config.DefaultRangeConcurrency * 2 } @@ -1293,15 +1330,27 @@ func (e *LoadDataController) getLocalBackendCfg(pdAddr, dataDir string) local.Ba return backendConfig } +// FullTableName return FQDN of the table. +func (e *LoadDataController) FullTableName() string { + return common.UniqueTable(e.DBName, e.Table.Meta().Name.O) +} + +func getDataSourceType(p *plannercore.ImportInto) DataSourceType { + if p.SelectPlan != nil { + return DataSourceTypeQuery + } + return DataSourceTypeFile +} + // JobImportParam is the param of the job import. type JobImportParam struct { - Job *asyncloaddata.Job + Job *Job Group *errgroup.Group GroupCtx context.Context // should be closed in the end of the job. Done chan struct{} - Progress *asyncloaddata.Progress + Progress *Progress } // JobImportResult is the result of the job import. @@ -1342,5 +1391,27 @@ func GetMsgFromBRError(err error) string { return raw[:len(raw)-len(berrMsg)-len(": ")] } +// GetTargetNodeCPUCnt get cpu count of target node where the import into job will be executed. +// target node is current node if it's server-disk import, import from query or disttask is disabled, +// else it's the node managed by disttask. +// exported for testing. +func GetTargetNodeCPUCnt(ctx context.Context, sourceType DataSourceType, path string) (int, error) { + if sourceType == DataSourceTypeQuery { + return cpu.GetCPUCount(), nil + } + + u, err2 := storage.ParseRawURL(path) + if err2 != nil { + return 0, exeerrors.ErrLoadDataInvalidURI.GenWithStackByArgs(plannercore.ImportIntoDataSource, + err2.Error()) + } + + serverDiskImport := storage.IsLocal(u) + if serverDiskImport || !variable.EnableDistTask.Load() { + return cpu.GetCPUCount(), nil + } + return handle.GetCPUCountOfManagedNode(ctx) +} + // TestSyncCh is used in unit test to synchronize the execution. var TestSyncCh = make(chan struct{}) diff --git a/pkg/executor/importer/import_test.go b/pkg/executor/importer/import_test.go index 35860ae3f3d91..12a65805222e6 100644 --- a/pkg/executor/importer/import_test.go +++ b/pkg/executor/importer/import_test.go @@ -33,6 +33,7 @@ import ( "github.com/pingcap/tidb/br/pkg/lightning/config" "github.com/pingcap/tidb/br/pkg/lightning/mydump" "github.com/pingcap/tidb/pkg/expression" + tidbkv "github.com/pingcap/tidb/pkg/kv" "github.com/pingcap/tidb/pkg/parser" "github.com/pingcap/tidb/pkg/parser/ast" plannercore "github.com/pingcap/tidb/pkg/planner/core" @@ -42,20 +43,28 @@ import ( "github.com/pingcap/tidb/pkg/util/logutil" "github.com/pingcap/tidb/pkg/util/mock" "github.com/stretchr/testify/require" + tikvutil "github.com/tikv/client-go/v2/util" "go.uber.org/zap" ) func TestInitDefaultOptions(t *testing.T) { - plan := &Plan{} - require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/executor/importer/mockNumCpu", "return(1)")) + plan := &Plan{ + DataSourceType: DataSourceTypeQuery, + } + plan.initDefaultOptions(10) + require.Equal(t, 1, plan.ThreadCnt) + + plan = &Plan{ + DataSourceType: DataSourceTypeFile, + } variable.CloudStorageURI.Store("s3://bucket/path") t.Cleanup(func() { variable.CloudStorageURI.Store("") }) - plan.initDefaultOptions() + plan.initDefaultOptions(1) require.Equal(t, config.ByteSize(0), plan.DiskQuota) require.Equal(t, config.OpLevelRequired, plan.Checksum) - require.Equal(t, int64(1), plan.ThreadCnt) + require.Equal(t, 1, plan.ThreadCnt) require.Equal(t, unlimitedWriteSpeed, plan.MaxWriteSpeed) require.Equal(t, false, plan.SplitFile) require.Equal(t, int64(100), plan.MaxRecordedErrors) @@ -65,15 +74,15 @@ func TestInitDefaultOptions(t *testing.T) { require.Equal(t, config.ByteSize(defaultMaxEngineSize), plan.MaxEngineSize) require.Equal(t, "s3://bucket/path", plan.CloudStorageURI) - require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/executor/importer/mockNumCpu", "return(10)")) - plan.initDefaultOptions() - require.Equal(t, int64(5), plan.ThreadCnt) + plan.initDefaultOptions(10) + require.Equal(t, 5, plan.ThreadCnt) } // for negative case see TestImportIntoOptionsNegativeCase func TestInitOptionsPositiveCase(t *testing.T) { - ctx := mock.NewContext() - defer ctx.Close() + sctx := mock.NewContext() + defer sctx.Close() + ctx := tikvutil.WithInternalSourceType(context.Background(), tidbkv.InternalImportInto) convertOptions := func(inOptions []*ast.LoadDataOpt) []*plannercore.LoadDataOpt { options := []*plannercore.LoadDataOpt{} @@ -81,7 +90,7 @@ func TestInitOptionsPositiveCase(t *testing.T) { for _, opt := range inOptions { loadDataOpt := plannercore.LoadDataOpt{Name: opt.Name} if opt.Value != nil { - loadDataOpt.Value, err = expression.RewriteSimpleExprWithNames(ctx, opt.Value, nil, nil) + loadDataOpt.Value, err = expression.RewriteSimpleExprWithNames(sctx, opt.Value, nil, nil) require.NoError(t, err) } options = append(options, &loadDataOpt) @@ -111,7 +120,7 @@ func TestInitOptionsPositiveCase(t *testing.T) { stmt, err := p.ParseOneStmt(sql, "", "") require.NoError(t, err, sql) plan := &Plan{Format: DataFormatCSV} - err = plan.initOptions(ctx, convertOptions(stmt.(*ast.ImportIntoStmt).Options)) + err = plan.initOptions(ctx, sctx, convertOptions(stmt.(*ast.ImportIntoStmt).Options)) require.NoError(t, err, sql) require.Equal(t, "utf8", *plan.Charset, sql) require.Equal(t, "aaa", plan.FieldsTerminatedBy, sql) @@ -122,7 +131,7 @@ func TestInitOptionsPositiveCase(t *testing.T) { require.Equal(t, uint64(1), plan.IgnoreLines, sql) require.Equal(t, config.ByteSize(100<<30), plan.DiskQuota, sql) require.Equal(t, config.OpLevelOptional, plan.Checksum, sql) - require.Equal(t, int64(runtime.GOMAXPROCS(0)), plan.ThreadCnt, sql) // it's adjusted to the number of CPUs + require.Equal(t, runtime.GOMAXPROCS(0), plan.ThreadCnt, sql) // it's adjusted to the number of CPUs require.Equal(t, config.ByteSize(200<<20), plan.MaxWriteSpeed, sql) require.True(t, plan.SplitFile, sql) require.Equal(t, int64(123), plan.MaxRecordedErrors, sql) @@ -137,7 +146,7 @@ func TestInitOptionsPositiveCase(t *testing.T) { variable.CloudStorageURI.Store("") }) plan = &Plan{Format: DataFormatCSV} - err = plan.initOptions(ctx, convertOptions(stmt.(*ast.ImportIntoStmt).Options)) + err = plan.initOptions(ctx, sctx, convertOptions(stmt.(*ast.ImportIntoStmt).Options)) require.NoError(t, err, sql) require.Equal(t, "s3://bucket/path", plan.CloudStorageURI, sql) @@ -146,7 +155,7 @@ func TestInitOptionsPositiveCase(t *testing.T) { stmt, err = p.ParseOneStmt(sql2, "", "") require.NoError(t, err, sql2) plan = &Plan{Format: DataFormatCSV} - err = plan.initOptions(ctx, convertOptions(stmt.(*ast.ImportIntoStmt).Options)) + err = plan.initOptions(ctx, sctx, convertOptions(stmt.(*ast.ImportIntoStmt).Options)) require.NoError(t, err, sql2) require.Equal(t, "s3://bucket/path2", plan.CloudStorageURI, sql2) // override with gs @@ -154,7 +163,7 @@ func TestInitOptionsPositiveCase(t *testing.T) { stmt, err = p.ParseOneStmt(sql3, "", "") require.NoError(t, err, sql3) plan = &Plan{Format: DataFormatCSV} - err = plan.initOptions(ctx, convertOptions(stmt.(*ast.ImportIntoStmt).Options)) + err = plan.initOptions(ctx, sctx, convertOptions(stmt.(*ast.ImportIntoStmt).Options)) require.NoError(t, err, sql3) require.Equal(t, "gs://bucket/path2", plan.CloudStorageURI, sql3) // override with empty string, force use local sort @@ -162,20 +171,26 @@ func TestInitOptionsPositiveCase(t *testing.T) { stmt, err = p.ParseOneStmt(sql4, "", "") require.NoError(t, err, sql4) plan = &Plan{Format: DataFormatCSV} - err = plan.initOptions(ctx, convertOptions(stmt.(*ast.ImportIntoStmt).Options)) + err = plan.initOptions(ctx, sctx, convertOptions(stmt.(*ast.ImportIntoStmt).Options)) require.NoError(t, err, sql4) require.Equal(t, "", plan.CloudStorageURI, sql4) } func TestAdjustOptions(t *testing.T) { plan := &Plan{ - DiskQuota: 1, - ThreadCnt: 100000000, - MaxWriteSpeed: 10, + DiskQuota: 1, + ThreadCnt: 100000000, + MaxWriteSpeed: 10, + DataSourceType: DataSourceTypeFile, } - plan.adjustOptions() - require.Equal(t, int64(runtime.GOMAXPROCS(0)), plan.ThreadCnt) + plan.adjustOptions(16) + require.Equal(t, 16, plan.ThreadCnt) require.Equal(t, config.ByteSize(10), plan.MaxWriteSpeed) // not adjusted + + plan.ThreadCnt = 100000000 + plan.DataSourceType = DataSourceTypeQuery + plan.adjustOptions(16) + require.Equal(t, 32, plan.ThreadCnt) } func TestAdjustDiskQuota(t *testing.T) { @@ -397,3 +412,10 @@ func TestSupportedSuffixForServerDisk(t *testing.T) { c.Path = path.Join(tempDir, "server-*.csv") require.NoError(t, c.InitDataFiles(ctx)) } + +func TestGetDataSourceType(t *testing.T) { + require.Equal(t, DataSourceTypeQuery, getDataSourceType(&plannercore.ImportInto{ + SelectPlan: &plannercore.PhysicalSelection{}, + })) + require.Equal(t, DataSourceTypeFile, getDataSourceType(&plannercore.ImportInto{})) +} diff --git a/pkg/executor/importer/importer_testkit_test.go b/pkg/executor/importer/importer_testkit_test.go new file mode 100644 index 0000000000000..faa4b968cf146 --- /dev/null +++ b/pkg/executor/importer/importer_testkit_test.go @@ -0,0 +1,105 @@ +// Copyright 2023 PingCAP, 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. + +package importer_test + +import ( + "context" + "testing" + "time" + + "github.com/ngaut/pools" + "github.com/pingcap/failpoint" + verify "github.com/pingcap/tidb/br/pkg/lightning/verification" + "github.com/pingcap/tidb/pkg/disttask/framework/testutil" + "github.com/pingcap/tidb/pkg/executor/importer" + "github.com/pingcap/tidb/pkg/parser/model" + "github.com/pingcap/tidb/pkg/sessionctx/variable" + "github.com/pingcap/tidb/pkg/testkit" + "github.com/pingcap/tidb/pkg/util/dbterror/exeerrors" + "github.com/pingcap/tidb/pkg/util/logutil" + "github.com/stretchr/testify/require" +) + +func TestChecksumTable(t *testing.T) { + ctx := context.Background() + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + pool := pools.NewResourcePool(func() (pools.Resource, error) { + return tk.Session(), nil + }, 1, 1, time.Second) + defer pool.Close() + + plan := &importer.Plan{ + DBName: "db", + TableInfo: &model.TableInfo{ + Name: model.NewCIStr("tb"), + }, + } + // fake result + localChecksum := verify.MakeKVChecksum(1, 1, 1) + tk.MustExec("create database db") + tk.MustExec("create table db.tb(id int)") + tk.MustExec("insert into db.tb values(1)") + remoteChecksum, err := importer.ChecksumTable(ctx, tk.Session(), plan, logutil.BgLogger()) + require.NoError(t, err) + require.True(t, remoteChecksum.IsEqual(&localChecksum)) + // again + remoteChecksum, err = importer.ChecksumTable(ctx, tk.Session(), plan, logutil.BgLogger()) + require.NoError(t, err) + require.True(t, remoteChecksum.IsEqual(&localChecksum)) + + _ = failpoint.Enable("github.com/pingcap/tidb/pkg/executor/importer/errWhenChecksum", `return(true)`) + defer func() { + _ = failpoint.Disable("github.com/pingcap/tidb/pkg/executor/importer/errWhenChecksum") + }() + remoteChecksum, err = importer.ChecksumTable(ctx, tk.Session(), plan, logutil.BgLogger()) + require.NoError(t, err) + require.True(t, remoteChecksum.IsEqual(&localChecksum)) +} + +func TestGetTargetNodeCpuCnt(t *testing.T) { + _, tm, ctx := testutil.InitTableTest(t) + require.False(t, variable.EnableDistTask.Load()) + + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/util/cpu/mockNumCpu", "return(16)")) + t.Cleanup(func() { + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/util/cpu/mockNumCpu")) + variable.EnableDistTask.Store(false) + }) + require.NoError(t, tm.InitMeta(ctx, "tidb1", "")) + + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/util/cpu/mockNumCpu", "return(8)")) + targetNodeCPUCnt, err := importer.GetTargetNodeCPUCnt(ctx, importer.DataSourceTypeQuery, "") + require.NoError(t, err) + require.Equal(t, 8, targetNodeCPUCnt) + + // invalid path + _, err = importer.GetTargetNodeCPUCnt(ctx, importer.DataSourceTypeFile, ":xx") + require.ErrorIs(t, err, exeerrors.ErrLoadDataInvalidURI) + // server disk import + targetNodeCPUCnt, err = importer.GetTargetNodeCPUCnt(ctx, importer.DataSourceTypeFile, "/path/to/xxx.csv") + require.NoError(t, err) + require.Equal(t, 8, targetNodeCPUCnt) + // disttask disabled + targetNodeCPUCnt, err = importer.GetTargetNodeCPUCnt(ctx, importer.DataSourceTypeFile, "s3://path/to/xxx.csv") + require.NoError(t, err) + require.Equal(t, 8, targetNodeCPUCnt) + // disttask enabled + variable.EnableDistTask.Store(true) + + targetNodeCPUCnt, err = importer.GetTargetNodeCPUCnt(ctx, importer.DataSourceTypeFile, "s3://path/to/xxx.csv") + require.NoError(t, err) + require.Equal(t, 16, targetNodeCPUCnt) +} diff --git a/pkg/executor/importer/main_test.go b/pkg/executor/importer/main_test.go new file mode 100644 index 0000000000000..3a0a32f8d62ea --- /dev/null +++ b/pkg/executor/importer/main_test.go @@ -0,0 +1,36 @@ +// Copyright 2024 PingCAP, 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. + +package importer + +import ( + "testing" + + "github.com/pingcap/tidb/pkg/testkit/testsetup" + "go.uber.org/goleak" +) + +func TestMain(m *testing.M) { + testsetup.SetupForCommonTest() + + opts := []goleak.Option{ + goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), + goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), + goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), + goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), + goleak.IgnoreTopFunction("syscall.syscall"), + } + goleak.VerifyTestMain(m, opts...) +} diff --git a/pkg/executor/importer/precheck.go b/pkg/executor/importer/precheck.go index 1cb1c6f75a445..68b237197f56f 100644 --- a/pkg/executor/importer/precheck.go +++ b/pkg/executor/importer/precheck.go @@ -49,8 +49,10 @@ var GetEtcdClient = getEtcdClient // todo: check if there's running lightning tasks? // we check them one by one, and return the first error we meet. func (e *LoadDataController) CheckRequirements(ctx context.Context, conn sqlexec.SQLExecutor) error { - if err := e.checkTotalFileSize(); err != nil { - return err + if e.DataSourceType == DataSourceTypeFile { + if err := e.checkTotalFileSize(); err != nil { + return err + } } if err := e.checkTableEmpty(ctx, conn); err != nil { return err @@ -75,7 +77,7 @@ func (e *LoadDataController) checkTotalFileSize() error { } func (e *LoadDataController) checkTableEmpty(ctx context.Context, conn sqlexec.SQLExecutor) error { - sql := fmt.Sprintf("SELECT 1 FROM %s USE INDEX() LIMIT 1", common.UniqueTable(e.DBName, e.Table.Meta().Name.L)) + sql := common.SprintfWithIdentifiers("SELECT 1 FROM %s.%s USE INDEX() LIMIT 1", e.DBName, e.Table.Meta().Name.L) rs, err := conn.ExecuteInternal(ctx, sql) if err != nil { return err diff --git a/pkg/executor/importer/precheck_test.go b/pkg/executor/importer/precheck_test.go index 9645365fbf055..ade4bdc09fce2 100644 --- a/pkg/executor/importer/precheck_test.go +++ b/pkg/executor/importer/precheck_test.go @@ -81,7 +81,8 @@ func TestCheckRequirements(t *testing.T) { c := &importer.LoadDataController{ Plan: &importer.Plan{ - DBName: "test", + DBName: "test", + DataSourceType: importer.DataSourceTypeFile, }, Table: tableObj, } diff --git a/pkg/executor/importer/progress.go b/pkg/executor/importer/progress.go new file mode 100644 index 0000000000000..fc052add4f0c4 --- /dev/null +++ b/pkg/executor/importer/progress.go @@ -0,0 +1,63 @@ +// Copyright 2023 PingCAP, 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. + +package importer + +import ( + "maps" + "sync" + + "github.com/pingcap/tidb/pkg/util/sqlexec" +) + +// Job describes a import job. +type Job struct { + ID int64 + // Job don't manage the life cycle of the connection. + Conn sqlexec.SQLExecutor + User string +} + +// Progress is the progress of the IMPORT INTO task. +type Progress struct { + // SourceFileSize is the size of the source file in bytes. When we can't get + // the size of the source file, it will be set to -1. + SourceFileSize int64 + colSizeMu sync.Mutex + colSizeMap map[int64]int64 +} + +// NewProgress creates a new Progress. +func NewProgress() *Progress { + return &Progress{ + SourceFileSize: -1, + colSizeMap: make(map[int64]int64), + } +} + +// AddColSize adds the size of the column to the progress. +func (p *Progress) AddColSize(colSizeMap map[int64]int64) { + p.colSizeMu.Lock() + defer p.colSizeMu.Unlock() + for key, value := range colSizeMap { + p.colSizeMap[key] += value + } +} + +// GetColSize returns the size of the column. +func (p *Progress) GetColSize() map[int64]int64 { + p.colSizeMu.Lock() + defer p.colSizeMu.Unlock() + return maps.Clone(p.colSizeMap) +} diff --git a/pkg/executor/importer/table_import.go b/pkg/executor/importer/table_import.go index 016c688aeb1f4..d78d622ddf297 100644 --- a/pkg/executor/importer/table_import.go +++ b/pkg/executor/importer/table_import.go @@ -23,12 +23,14 @@ import ( "os" "path/filepath" "strconv" + "strings" "sync" "time" "unicode/utf8" "github.com/docker/go-units" "github.com/pingcap/errors" + "github.com/pingcap/failpoint" "github.com/pingcap/tidb/br/pkg/lightning/backend" "github.com/pingcap/tidb/br/pkg/lightning/backend/encode" "github.com/pingcap/tidb/br/pkg/lightning/backend/kv" @@ -37,15 +39,31 @@ import ( "github.com/pingcap/tidb/br/pkg/lightning/common" "github.com/pingcap/tidb/br/pkg/lightning/config" "github.com/pingcap/tidb/br/pkg/lightning/log" + "github.com/pingcap/tidb/br/pkg/lightning/metric" "github.com/pingcap/tidb/br/pkg/lightning/mydump" + verify "github.com/pingcap/tidb/br/pkg/lightning/verification" "github.com/pingcap/tidb/br/pkg/storage" tidb "github.com/pingcap/tidb/pkg/config" + "github.com/pingcap/tidb/pkg/disttask/framework/proto" + "github.com/pingcap/tidb/pkg/keyspace" tidbkv "github.com/pingcap/tidb/pkg/kv" "github.com/pingcap/tidb/pkg/meta/autoid" + tidbmetrics "github.com/pingcap/tidb/pkg/metrics" + "github.com/pingcap/tidb/pkg/sessionctx" + "github.com/pingcap/tidb/pkg/sessionctx/variable" "github.com/pingcap/tidb/pkg/table" "github.com/pingcap/tidb/pkg/table/tables" + tidbutil "github.com/pingcap/tidb/pkg/util" + "github.com/pingcap/tidb/pkg/util/etcd" + "github.com/pingcap/tidb/pkg/util/mathutil" + "github.com/pingcap/tidb/pkg/util/promutil" + "github.com/pingcap/tidb/pkg/util/sqlexec" "github.com/pingcap/tidb/pkg/util/syncutil" + "github.com/prometheus/client_golang/prometheus" + "github.com/tikv/client-go/v2/util" pd "github.com/tikv/pd/client" + pdhttp "github.com/tikv/pd/client/http" + clientv3 "go.etcd.io/etcd/client/v3" "go.uber.org/multierr" "go.uber.org/zap" ) @@ -71,10 +89,9 @@ var ( ) // prepareSortDir creates a new directory for import, remove previous sort directory if exists. -func prepareSortDir(e *LoadDataController, taskID int64, tidbCfg *tidb.Config) (string, error) { - sortPathSuffix := "import-" + strconv.Itoa(int(tidbCfg.Port)) - importDir := filepath.Join(tidbCfg.TempDir, sortPathSuffix) - sortDir := filepath.Join(importDir, strconv.FormatInt(taskID, 10)) +func prepareSortDir(e *LoadDataController, id string, tidbCfg *tidb.Config) (string, error) { + importDir := GetImportRootDir(tidbCfg) + sortDir := filepath.Join(importDir, id) if info, err := os.Stat(importDir); err != nil || !info.IsDir() { if err != nil && !os.IsNotExist(err) { @@ -110,7 +127,7 @@ func prepareSortDir(e *LoadDataController, taskID int64, tidbCfg *tidb.Config) ( } // GetTiKVModeSwitcherWithPDClient creates a new TiKV mode switcher with its pd Client. -func GetTiKVModeSwitcherWithPDClient(ctx context.Context, logger *zap.Logger) (pd.Client, local.TiKVModeSwitcher, error) { +func GetTiKVModeSwitcherWithPDClient(logger *zap.Logger) (pdhttp.Client, local.TiKVModeSwitcher, error) { tidbCfg := tidb.GetGlobalConfig() hostPort := net.JoinHostPort("127.0.0.1", strconv.Itoa(int(tidbCfg.Status.StatusPort))) tls, err := common.NewTLS( @@ -123,13 +140,14 @@ func GetTiKVModeSwitcherWithPDClient(ctx context.Context, logger *zap.Logger) (p if err != nil { return nil, nil, err } - tlsOpt := tls.ToPDSecurityOption() - pdCli, err := pd.NewClientWithContext(ctx, []string{tidbCfg.Path}, tlsOpt) - if err != nil { - return nil, nil, errors.Trace(err) + addrs := strings.Split(tidbCfg.Path, ",") + var opts []pdhttp.ClientOption + if o := tls.TLSConfig(); o != nil { + opts = append(opts, pdhttp.WithTLSConfig(o)) } - - return pdCli, NewTiKVModeSwitcher(tls, pdCli, logger), nil + pdHTTPCli := pdhttp.NewClient("dist-task", addrs, opts...) + // TODO: let disttask framework pass-in the PD HTTP client from domain + return pdHTTPCli, NewTiKVModeSwitcher(tls, pdHTTPCli, logger), nil } // GetCachedKVStoreFrom gets a cached kv store from PD address. @@ -159,7 +177,8 @@ func GetRegionSplitSizeKeys(ctx context.Context) (regionSplitSize int64, regionS return 0, 0, err } tlsOpt := tls.ToPDSecurityOption() - pdCli, err := pd.NewClientWithContext(ctx, []string{tidbCfg.Path}, tlsOpt) + addrs := strings.Split(tidbCfg.Path, ",") + pdCli, err := pd.NewClientWithContext(ctx, addrs, tlsOpt) if err != nil { return 0, 0, errors.Trace(err) } @@ -168,7 +187,7 @@ func GetRegionSplitSizeKeys(ctx context.Context) (regionSplitSize int64, regionS } // NewTableImporter creates a new table importer. -func NewTableImporter(param *JobImportParam, e *LoadDataController, taskID int64) (ti *TableImporter, err error) { +func NewTableImporter(param *JobImportParam, e *LoadDataController, id string) (ti *TableImporter, err error) { idAlloc := kv.NewPanickingAllocators(0) tbl, err := tables.TableFromMeta(idAlloc, e.Table.Meta()) if err != nil { @@ -177,7 +196,7 @@ func NewTableImporter(param *JobImportParam, e *LoadDataController, taskID int64 tidbCfg := tidb.GetGlobalConfig() // todo: we only need to prepare this once on each node(we might call it 3 times in distribution framework) - dir, err := prepareSortDir(e, taskID, tidbCfg) + dir, err := prepareSortDir(e, id, tidbCfg) if err != nil { return nil, err } @@ -212,6 +231,7 @@ func NewTableImporter(param *JobImportParam, e *LoadDataController, taskID int64 return &TableImporter{ JobImportParam: param, LoadDataController: e, + id: id, backend: localBackend, tableInfo: &checkpoints.TidbTableInfo{ ID: e.Table.Meta().ID, @@ -221,7 +241,7 @@ func NewTableImporter(param *JobImportParam, e *LoadDataController, taskID int64 encTable: tbl, dbID: e.DBID, kvStore: kvStore, - logger: e.logger, + logger: e.logger.With(zap.String("import-id", id)), // this is the value we use for 50TiB data parallel import. // this might not be the optimal value. // todo: use different default for single-node import and distributed import. @@ -236,6 +256,10 @@ func NewTableImporter(param *JobImportParam, e *LoadDataController, taskID int64 type TableImporter struct { *JobImportParam *LoadDataController + // id is the unique id for this importer. + // it's the task id if we are running in distributed framework, else it's an + // uuid. we use this id to create a unique directory for this importer. + id string backend *local.Backend tableInfo *checkpoints.TidbTableInfo // this table has a separate id allocator used to record the max row id allocated. @@ -249,6 +273,46 @@ type TableImporter struct { regionSplitKeys int64 diskQuota int64 diskQuotaLock *syncutil.RWMutex + + rowCh chan QueryRow +} + +// NewTableImporterForTest creates a new table importer for test. +func NewTableImporterForTest(param *JobImportParam, e *LoadDataController, id string, store tidbkv.Storage, helper local.StoreHelper) (*TableImporter, error) { + idAlloc := kv.NewPanickingAllocators(0) + tbl, err := tables.TableFromMeta(idAlloc, e.Table.Meta()) + if err != nil { + return nil, errors.Annotatef(err, "failed to tables.TableFromMeta %s", e.Table.Meta().Name) + } + + tidbCfg := tidb.GetGlobalConfig() + dir, err := prepareSortDir(e, id, tidbCfg) + if err != nil { + return nil, err + } + + backendConfig := e.getLocalBackendCfg(tidbCfg.Path, dir) + localBackend, err := local.NewBackendForTest(param.GroupCtx, backendConfig, helper) + if err != nil { + return nil, err + } + + return &TableImporter{ + JobImportParam: param, + LoadDataController: e, + id: id, + backend: localBackend, + tableInfo: &checkpoints.TidbTableInfo{ + ID: e.Table.Meta().ID, + Name: e.Table.Meta().Name.O, + Core: e.Table.Meta(), + }, + encTable: tbl, + dbID: e.DBID, + kvStore: store, + logger: e.logger.With(zap.String("import-id", id)), + diskQuotaLock: new(syncutil.RWMutex), + }, nil } func (ti *TableImporter) getParser(ctx context.Context, chunk *checkpoints.ChunkCheckpoint) (mydump.Parser, error) { @@ -364,7 +428,7 @@ func (e *LoadDataController) PopulateChunks(ctx context.Context) (ecp map[int32] ColumnCnt: len(e.Table.Meta().Columns), EngineDataSize: adjustedMaxEngineSize, MaxChunkSize: int64(config.MaxRegionSize), - Concurrency: int(e.ThreadCnt), + Concurrency: e.ThreadCnt, IOWorkers: nil, Store: e.dataStore, TableMeta: tableMeta, @@ -446,8 +510,9 @@ func (ti *TableImporter) OpenIndexEngine(ctx context.Context, engineID int32) (* Compact: threshold > 0, CompactConcurrency: 4, CompactThreshold: threshold, + BlockSize: 16 * 1024, } - fullTableName := ti.fullTableName() + fullTableName := ti.FullTableName() // todo: cleanup all engine data on any error since we don't support checkpoint for now // some return path, didn't make sure all data engine and index engine are cleaned up. // maybe we can add this in upper level to clean the whole local-sort directory @@ -468,7 +533,7 @@ func (ti *TableImporter) OpenDataEngine(ctx context.Context, engineID int32) (*b // dataEngineCfg.Local.CompactThreshold = local.CompactionUpperThreshold //} mgr := backend.MakeEngineManager(ti.backend) - return mgr.OpenEngine(ctx, dataEngineCfg, ti.fullTableName(), engineID) + return mgr.OpenEngine(ctx, dataEngineCfg, ti.FullTableName(), engineID) } // ImportAndCleanup imports the engine and cleanup the engine data. @@ -480,16 +545,10 @@ func (ti *TableImporter) ImportAndCleanup(ctx context.Context, closedEngine *bac // each row is encoded into 1 data key kvCount = ti.backend.GetImportedKVCount(closedEngine.GetUUID()) } - // todo: if we need support checkpoint, engine should not be cleanup if import failed. cleanupErr := closedEngine.Cleanup(ctx) return kvCount, multierr.Combine(importErr, cleanupErr) } -// FullTableName return FQDN of the table. -func (ti *TableImporter) fullTableName() string { - return common.UniqueTable(ti.DBName, ti.Table.Meta().Name.O) -} - // Backend returns the backend of the importer. func (ti *TableImporter) Backend() *local.Backend { return ti.backend @@ -580,6 +639,116 @@ func (ti *TableImporter) CheckDiskQuota(ctx context.Context) { } } +// SetSelectedRowCh sets the channel to receive selected rows. +func (ti *TableImporter) SetSelectedRowCh(ch chan QueryRow) { + ti.rowCh = ch +} + +func (ti *TableImporter) closeAndCleanupEngine(engine *backend.OpenedEngine) { + // outer context might be done, so we create a new context here. + ctx, cancel := context.WithTimeout(context.Background(), 5*time.Minute) + defer cancel() + closedEngine, err := engine.Close(ctx) + if err != nil { + ti.logger.Error("close engine failed", zap.Error(err)) + return + } + if err = closedEngine.Cleanup(ctx); err != nil { + ti.logger.Error("cleanup engine failed", zap.Error(err)) + } +} + +// ImportSelectedRows imports selected rows. +func (ti *TableImporter) ImportSelectedRows(ctx context.Context, se sessionctx.Context) (*JobImportResult, error) { + var ( + err error + dataEngine, indexEngine *backend.OpenedEngine + ) + metrics := tidbmetrics.GetRegisteredImportMetrics(promutil.NewDefaultFactory(), + prometheus.Labels{ + proto.TaskIDLabelName: ti.id, + }) + ctx = metric.WithCommonMetric(ctx, metrics) + defer func() { + tidbmetrics.UnregisterImportMetrics(metrics) + if dataEngine != nil { + ti.closeAndCleanupEngine(dataEngine) + } + if indexEngine != nil { + ti.closeAndCleanupEngine(indexEngine) + } + }() + + dataEngine, err = ti.OpenDataEngine(ctx, 1) + if err != nil { + return nil, err + } + indexEngine, err = ti.OpenIndexEngine(ctx, common.IndexEngineID) + if err != nil { + return nil, err + } + + var ( + mu sync.Mutex + checksum verify.KVChecksum + colSizeMap = make(map[int64]int64) + ) + eg, egCtx := tidbutil.NewErrorGroupWithRecoverWithCtx(ctx) + for i := 0; i < ti.ThreadCnt; i++ { + eg.Go(func() error { + chunkCheckpoint := checkpoints.ChunkCheckpoint{} + progress := NewProgress() + defer func() { + mu.Lock() + defer mu.Unlock() + checksum.Add(&chunkCheckpoint.Checksum) + for k, v := range progress.GetColSize() { + colSizeMap[k] += v + } + }() + return ProcessChunk(egCtx, &chunkCheckpoint, ti, dataEngine, indexEngine, progress, ti.logger) + }) + } + if err = eg.Wait(); err != nil { + return nil, err + } + + closedDataEngine, err := dataEngine.Close(ctx) + if err != nil { + return nil, err + } + failpoint.Inject("mockImportFromSelectErr", func() { + failpoint.Return(nil, errors.New("mock import from select error")) + }) + if err = closedDataEngine.Import(ctx, ti.regionSplitSize, ti.regionSplitKeys); err != nil { + return nil, err + } + dataKVCount := ti.backend.GetImportedKVCount(closedDataEngine.GetUUID()) + + closedIndexEngine, err := indexEngine.Close(ctx) + if err != nil { + return nil, err + } + if err = closedIndexEngine.Import(ctx, ti.regionSplitSize, ti.regionSplitKeys); err != nil { + return nil, err + } + + allocators := ti.Allocators() + maxIDs := map[autoid.AllocatorType]int64{ + autoid.RowIDAllocType: allocators.Get(autoid.RowIDAllocType).Base(), + autoid.AutoIncrementType: allocators.Get(autoid.AutoIncrementType).Base(), + autoid.AutoRandomType: allocators.Get(autoid.AutoRandomType).Base(), + } + if err = postProcess(ctx, se, maxIDs, ti.Plan, checksum, ti.logger); err != nil { + return nil, err + } + + return &JobImportResult{ + Affected: uint64(dataKVCount), + ColSizeMap: colSizeMap, + }, nil +} + func adjustDiskQuota(diskQuota int64, sortDir string, logger *zap.Logger) int64 { sz, err := common.GetStorageSize(sortDir) if err != nil { @@ -605,3 +774,211 @@ func adjustDiskQuota(diskQuota int64, sortDir string, logger *zap.Logger) int64 return diskQuota } } + +// postProcess does the post-processing for the task. +func postProcess( + ctx context.Context, + se sessionctx.Context, + maxIDs map[autoid.AllocatorType]int64, + plan *Plan, + localChecksum verify.KVChecksum, + logger *zap.Logger, +) (err error) { + callLog := log.BeginTask(logger.With(zap.Any("checksum", localChecksum)), "post process") + defer func() { + callLog.End(zap.ErrorLevel, err) + }() + + if err = RebaseAllocatorBases(ctx, maxIDs, plan, logger); err != nil { + return err + } + + return VerifyChecksum(ctx, plan, localChecksum, se, logger) +} + +type autoIDRequirement struct { + store tidbkv.Storage + autoidCli *autoid.ClientDiscover +} + +func (r *autoIDRequirement) Store() tidbkv.Storage { + return r.store +} + +func (r *autoIDRequirement) AutoIDClient() *autoid.ClientDiscover { + return r.autoidCli +} + +// RebaseAllocatorBases rebase the allocator bases. +func RebaseAllocatorBases(ctx context.Context, maxIDs map[autoid.AllocatorType]int64, plan *Plan, logger *zap.Logger) (err error) { + callLog := log.BeginTask(logger, "rebase allocators") + defer func() { + callLog.End(zap.ErrorLevel, err) + }() + + if !common.TableHasAutoID(plan.DesiredTableInfo) { + return nil + } + + tidbCfg := tidb.GetGlobalConfig() + hostPort := net.JoinHostPort("127.0.0.1", strconv.Itoa(int(tidbCfg.Status.StatusPort))) + tls, err2 := common.NewTLS( + tidbCfg.Security.ClusterSSLCA, + tidbCfg.Security.ClusterSSLCert, + tidbCfg.Security.ClusterSSLKey, + hostPort, + nil, nil, nil, + ) + if err2 != nil { + return err2 + } + + // no need to close kvStore, since it's a cached store. + kvStore, err2 := GetCachedKVStoreFrom(tidbCfg.Path, tls) + if err2 != nil { + return errors.Trace(err2) + } + etcdCli, err := clientv3.New(clientv3.Config{ + Endpoints: []string{tidbCfg.Path}, + AutoSyncInterval: 30 * time.Second, + TLS: tls.TLSConfig(), + }) + if err != nil { + return errors.Trace(err) + } + etcd.SetEtcdCliByNamespace(etcdCli, keyspace.MakeKeyspaceEtcdNamespace(kvStore.GetCodec())) + autoidCli := autoid.NewClientDiscover(etcdCli) + r := autoIDRequirement{store: kvStore, autoidCli: autoidCli} + err = common.RebaseTableAllocators(ctx, maxIDs, &r, plan.DBID, plan.DesiredTableInfo) + if err1 := etcdCli.Close(); err1 != nil { + logger.Info("close etcd client error", zap.Error(err1)) + } + autoidCli.ResetConn(nil) + return errors.Trace(err) +} + +// VerifyChecksum verify the checksum of the table. +func VerifyChecksum(ctx context.Context, plan *Plan, localChecksum verify.KVChecksum, se sessionctx.Context, logger *zap.Logger) error { + if plan.Checksum == config.OpLevelOff { + return nil + } + logger.Info("local checksum", zap.Object("checksum", &localChecksum)) + + failpoint.Inject("waitCtxDone", func() { + <-ctx.Done() + }) + + remoteChecksum, err := checksumTable(ctx, se, plan, logger) + if err != nil { + if plan.Checksum != config.OpLevelOptional { + return err + } + logger.Warn("checksumTable failed, will skip this error and go on", zap.Error(err)) + } + if remoteChecksum != nil { + if !remoteChecksum.IsEqual(&localChecksum) { + err2 := common.ErrChecksumMismatch.GenWithStackByArgs( + remoteChecksum.Checksum, localChecksum.Sum(), + remoteChecksum.TotalKVs, localChecksum.SumKVS(), + remoteChecksum.TotalBytes, localChecksum.SumSize(), + ) + if plan.Checksum == config.OpLevelOptional { + logger.Warn("verify checksum failed, but checksum is optional, will skip it", zap.Error(err2)) + err2 = nil + } + return err2 + } + logger.Info("checksum pass", zap.Object("local", &localChecksum)) + } + return nil +} + +func checksumTable(ctx context.Context, se sessionctx.Context, plan *Plan, logger *zap.Logger) (*local.RemoteChecksum, error) { + var ( + tableName = common.UniqueTable(plan.DBName, plan.TableInfo.Name.L) + sql = "ADMIN CHECKSUM TABLE " + tableName + maxErrorRetryCount = 3 + distSQLScanConcurrencyFactor = 1 + remoteChecksum *local.RemoteChecksum + txnErr error + ) + + ctx = util.WithInternalSourceType(ctx, tidbkv.InternalImportInto) + for i := 0; i < maxErrorRetryCount; i++ { + txnErr = func() error { + // increase backoff weight + if err := setBackoffWeight(se, plan, logger); err != nil { + logger.Warn("set tidb_backoff_weight failed", zap.Error(err)) + } + + distSQLScanConcurrency := se.GetSessionVars().DistSQLScanConcurrency() + se.GetSessionVars().SetDistSQLScanConcurrency(mathutil.Max(distSQLScanConcurrency/distSQLScanConcurrencyFactor, local.MinDistSQLScanConcurrency)) + defer func() { + se.GetSessionVars().SetDistSQLScanConcurrency(distSQLScanConcurrency) + }() + + // TODO: add resource group name + + rs, err := sqlexec.ExecSQL(ctx, se, sql) + if err != nil { + return err + } + if len(rs) < 1 { + return errors.New("empty checksum result") + } + + failpoint.Inject("errWhenChecksum", func() { + if i == 0 { + failpoint.Return(errors.New("occur an error when checksum, coprocessor task terminated due to exceeding the deadline")) + } + }) + + // ADMIN CHECKSUM TABLE .
example. + // mysql> admin checksum table test.t; + // +---------+------------+---------------------+-----------+-------------+ + // | Db_name | Table_name | Checksum_crc64_xor | Total_kvs | Total_bytes | + // +---------+------------+---------------------+-----------+-------------+ + // | test | t | 8520875019404689597 | 7296873 | 357601387 | + // +---------+------------+------------- + remoteChecksum = &local.RemoteChecksum{ + Schema: rs[0].GetString(0), + Table: rs[0].GetString(1), + Checksum: rs[0].GetUint64(2), + TotalKVs: rs[0].GetUint64(3), + TotalBytes: rs[0].GetUint64(4), + } + return nil + }() + if !common.IsRetryableError(txnErr) { + break + } + distSQLScanConcurrencyFactor *= 2 + logger.Warn("retry checksum table", zap.Int("retry count", i+1), zap.Error(txnErr)) + } + return remoteChecksum, txnErr +} + +func setBackoffWeight(se sessionctx.Context, plan *Plan, logger *zap.Logger) error { + backoffWeight := local.DefaultBackoffWeight + if val, ok := plan.ImportantSysVars[variable.TiDBBackOffWeight]; ok { + if weight, err := strconv.Atoi(val); err == nil && weight > backoffWeight { + backoffWeight = weight + } + } + logger.Info("set backoff weight", zap.Int("weight", backoffWeight)) + return se.GetSessionVars().SetSystemVar(variable.TiDBBackOffWeight, strconv.Itoa(backoffWeight)) +} + +// GetImportRootDir returns the root directory for import. +// The directory structure is like: +// +// -> /path/to/tidb-tmpdir +// -> import-4000 +// -> 1 +// -> some-uuid +// +// exported for testing. +func GetImportRootDir(tidbCfg *tidb.Config) string { + sortPathSuffix := "import-" + strconv.Itoa(int(tidbCfg.Port)) + return filepath.Join(tidbCfg.TempDir, sortPathSuffix) +} diff --git a/pkg/executor/importer/table_import_test.go b/pkg/executor/importer/table_import_test.go index e72b6c009f91c..9295764aae9cc 100644 --- a/pkg/executor/importer/table_import_test.go +++ b/pkg/executor/importer/table_import_test.go @@ -15,13 +15,16 @@ package importer import ( + "context" "fmt" "os" "path/filepath" "testing" + "github.com/pingcap/tidb/br/pkg/lightning/backend/local" "github.com/pingcap/tidb/br/pkg/lightning/config" tidb "github.com/pingcap/tidb/pkg/config" + "github.com/pingcap/tidb/pkg/sessionctx" "github.com/stretchr/testify/require" "go.uber.org/zap" ) @@ -38,7 +41,7 @@ func TestPrepareSortDir(t *testing.T) { importDir := filepath.Join(dir, "import-4000") // dir not exist, create it - sortDir, err := prepareSortDir(e, 1, tidbCfg) + sortDir, err := prepareSortDir(e, "1", tidbCfg) require.NoError(t, err) require.Equal(t, filepath.Join(importDir, "1"), sortDir) info, err := os.Stat(importDir) @@ -52,7 +55,7 @@ func TestPrepareSortDir(t *testing.T) { require.NoError(t, os.Remove(importDir)) _, err = os.Create(importDir) require.NoError(t, err) - sortDir, err = prepareSortDir(e, 2, tidbCfg) + sortDir, err = prepareSortDir(e, "2", tidbCfg) require.NoError(t, err) require.Equal(t, filepath.Join(importDir, "2"), sortDir) info, err = os.Stat(importDir) @@ -60,7 +63,7 @@ func TestPrepareSortDir(t *testing.T) { require.True(t, info.IsDir()) // dir already exist, do nothing - sortDir, err = prepareSortDir(e, 3, tidbCfg) + sortDir, err = prepareSortDir(e, "3", tidbCfg) require.NoError(t, err) require.Equal(t, filepath.Join(importDir, "3"), sortDir) info, err = os.Stat(importDir) @@ -69,7 +72,7 @@ func TestPrepareSortDir(t *testing.T) { // sortdir already exist, remove it require.NoError(t, os.Mkdir(sortDir, 0755)) - sortDir, err = prepareSortDir(e, 3, tidbCfg) + sortDir, err = prepareSortDir(e, "3", tidbCfg) require.NoError(t, err) require.Equal(t, filepath.Join(importDir, "3"), sortDir) info, err = os.Stat(importDir) @@ -173,3 +176,7 @@ func TestLoadDataControllerGetAdjustedMaxEngineSize(t *testing.T) { }) } } + +func ChecksumTable(ctx context.Context, executor sessionctx.Context, plan *Plan, logger *zap.Logger) (*local.RemoteChecksum, error) { + return checksumTable(ctx, executor, plan, logger) +} diff --git a/pkg/executor/importer/table_import_testkit_test.go b/pkg/executor/importer/table_import_testkit_test.go new file mode 100644 index 0000000000000..199952efc43d1 --- /dev/null +++ b/pkg/executor/importer/table_import_testkit_test.go @@ -0,0 +1,127 @@ +// Copyright 2024 PingCAP, 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. + +package importer_test + +import ( + "context" + "os" + "testing" + + "github.com/pingcap/failpoint" + "github.com/pingcap/tidb/br/pkg/lightning/backend/local" + tidb "github.com/pingcap/tidb/pkg/config" + "github.com/pingcap/tidb/pkg/executor/importer" + tidbkv "github.com/pingcap/tidb/pkg/kv" + "github.com/pingcap/tidb/pkg/parser/ast" + "github.com/pingcap/tidb/pkg/parser/model" + plannercore "github.com/pingcap/tidb/pkg/planner/core" + "github.com/pingcap/tidb/pkg/session" + "github.com/pingcap/tidb/pkg/testkit" + "github.com/pingcap/tidb/pkg/types" + "github.com/pingcap/tidb/pkg/util" + "github.com/stretchr/testify/require" + "github.com/tikv/client-go/v2/tikv" +) + +type storeHelper struct { + kvStore tidbkv.Storage +} + +func (*storeHelper) GetTS(_ context.Context) (physical, logical int64, err error) { + return 0, 0, nil +} + +func (s *storeHelper) GetTiKVCodec() tikv.Codec { + return s.kvStore.GetCodec() +} + +var _ local.StoreHelper = (*storeHelper)(nil) + +func checkImportDirEmpty(t *testing.T) { + tidbCfg := tidb.GetGlobalConfig() + importDir := importer.GetImportRootDir(tidbCfg) + if _, err := os.Stat(importDir); err != nil { + require.True(t, os.IsNotExist(err), importDir) + } else { + entries, err := os.ReadDir(importDir) + require.NoError(t, err) + require.Empty(t, entries) + } +} + +func TestImportFromSelectCleanup(t *testing.T) { + ctx := context.Background() + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tidbCfg := tidb.GetGlobalConfig() + tidbCfg.TempDir = t.TempDir() + checkImportDirEmpty(t) + + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/executor/importer/mockImportFromSelectErr", `return(true)`)) + t.Cleanup(func() { + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/executor/importer/mockImportFromSelectErr")) + }) + + tk.MustExec("use test") + tk.MustExec("create table t(a int)") + do, err := session.GetDomain(store) + require.NoError(t, err) + dbInfo, ok := do.InfoSchema().SchemaByName(model.NewCIStr("test")) + require.True(t, ok) + table, err := do.InfoSchema().TableByName(model.NewCIStr("test"), model.NewCIStr("t")) + require.NoError(t, err) + plan, err := importer.NewImportPlan(ctx, tk.Session(), &plannercore.ImportInto{ + Table: &ast.TableName{ + Name: model.NewCIStr("t"), + DBInfo: &model.DBInfo{ + Name: model.NewCIStr("test"), + ID: dbInfo.ID, + }, + }, + SelectPlan: &plannercore.PhysicalSelection{}, + }, table) + require.NoError(t, err) + controller, err := importer.NewLoadDataController(plan, table, &importer.ASTArgs{}) + require.NoError(t, err) + ti, err := importer.NewTableImporterForTest( + &importer.JobImportParam{ + GroupCtx: ctx, + }, + controller, + "11", + store, + &storeHelper{kvStore: store}, + ) + require.NoError(t, err) + ch := make(chan importer.QueryRow) + ti.SetSelectedRowCh(ch) + var wg util.WaitGroupWrapper + wg.Run(func() { + defer close(ch) + for i := 1; i <= 3; i++ { + ch <- importer.QueryRow{ + ID: int64(i), + Data: []types.Datum{ + types.NewIntDatum(int64(i)), + }, + } + } + }) + _, err = ti.ImportSelectedRows(ctx, tk.Session()) + require.ErrorContains(t, err, "mock import from select error") + wg.Wait() + ti.Backend().CloseEngineMgr() + checkImportDirEmpty(t) +} diff --git a/pkg/executor/index_lookup_hash_join.go b/pkg/executor/index_lookup_hash_join.go index 4e2b52a0da925..c4902b8eec5d5 100644 --- a/pkg/executor/index_lookup_hash_join.go +++ b/pkg/executor/index_lookup_hash_join.go @@ -75,6 +75,10 @@ type IndexNestedLoopHashJoin struct { stats *indexLookUpJoinRuntimeStats prepared bool + // panicErr records the error generated by panic recover. This is introduced to + // return the actual error message instead of `context cancelled` to the client. + panicErr error + ctxWithCancel context.Context } type indexHashJoinOuterWorker struct { @@ -149,7 +153,7 @@ func (e *IndexNestedLoopHashJoin) startWorkers(ctx context.Context) { e.stats.concurrency = concurrency } workerCtx, cancelFunc := context.WithCancel(ctx) - e.cancelFunc = cancelFunc + e.ctxWithCancel, e.cancelFunc = workerCtx, cancelFunc innerCh := make(chan *indexHashJoinTask, concurrency) if e.keepOuterOrder { e.taskCh = make(chan *indexHashJoinTask, concurrency) @@ -162,7 +166,7 @@ func (e *IndexNestedLoopHashJoin) startWorkers(ctx context.Context) { e.joinChkResourceCh = make([]chan *chunk.Chunk, concurrency) e.workerWg.Add(1) ow := e.newOuterWorker(innerCh) - go util.WithRecovery(func() { ow.run(workerCtx) }, e.finishJoinWorkers) + go util.WithRecovery(func() { ow.run(e.ctxWithCancel) }, e.finishJoinWorkers) for i := 0; i < concurrency; i++ { if !e.keepOuterOrder { @@ -179,7 +183,7 @@ func (e *IndexNestedLoopHashJoin) startWorkers(ctx context.Context) { e.workerWg.Add(concurrency) for i := 0; i < concurrency; i++ { workerID := i - go util.WithRecovery(func() { e.newInnerWorker(innerCh, workerID).run(workerCtx, cancelFunc) }, e.finishJoinWorkers) + go util.WithRecovery(func() { e.newInnerWorker(innerCh, workerID).run(e.ctxWithCancel, cancelFunc) }, e.finishJoinWorkers) } go e.wait4JoinWorkers() } @@ -197,6 +201,7 @@ func (e *IndexNestedLoopHashJoin) finishJoinWorkers(r interface{}) { task := &indexHashJoinTask{err: err} e.taskCh <- task } + e.panicErr = err if e.cancelFunc != nil { e.cancelFunc() } @@ -222,59 +227,39 @@ func (e *IndexNestedLoopHashJoin) Next(ctx context.Context, req *chunk.Chunk) er } req.Reset() if e.keepOuterOrder { - return e.runInOrder(ctx, req) + return e.runInOrder(e.ctxWithCancel, req) } - // unordered run - var ( - result *indexHashJoinResult - ok bool - ) - select { - case result, ok = <-e.resultCh: - if !ok { - return nil - } - if result.err != nil { - return result.err - } - case <-ctx.Done(): - return ctx.Err() - } - req.SwapColumns(result.chk) - result.src <- result.chk - return nil + return e.runUnordered(e.ctxWithCancel, req) } func (e *IndexNestedLoopHashJoin) runInOrder(ctx context.Context, req *chunk.Chunk) error { - var ( - result *indexHashJoinResult - ok bool - ) for { if e.isDryUpTasks(ctx) { - return nil + return e.panicErr } if e.curTask.err != nil { return e.curTask.err } - select { - case result, ok = <-e.curTask.resultCh: - if !ok { - e.curTask = nil - continue - } - if result.err != nil { - return result.err - } - case <-ctx.Done(): - return ctx.Err() + result, err := e.getResultFromChannel(ctx, e.curTask.resultCh) + if err != nil { + return err } - req.SwapColumns(result.chk) - result.src <- result.chk - return nil + if result == nil { + e.curTask = nil + continue + } + return e.handleResult(req, result) } } +func (e *IndexNestedLoopHashJoin) runUnordered(ctx context.Context, req *chunk.Chunk) error { + result, err := e.getResultFromChannel(ctx, e.resultCh) + if err != nil { + return err + } + return e.handleResult(req, result) +} + // isDryUpTasks indicates whether all the tasks have been processed. func (e *IndexNestedLoopHashJoin) isDryUpTasks(ctx context.Context) bool { if e.curTask != nil { @@ -292,6 +277,38 @@ func (e *IndexNestedLoopHashJoin) isDryUpTasks(ctx context.Context) bool { return false } +func (e *IndexNestedLoopHashJoin) getResultFromChannel(ctx context.Context, resultCh <-chan *indexHashJoinResult) (*indexHashJoinResult, error) { + var ( + result *indexHashJoinResult + ok bool + ) + select { + case result, ok = <-resultCh: + if !ok { + return nil, nil + } + if result.err != nil { + return nil, result.err + } + case <-ctx.Done(): + err := e.panicErr + if err == nil { + err = ctx.Err() + } + return nil, err + } + return result, nil +} + +func (*IndexNestedLoopHashJoin) handleResult(req *chunk.Chunk, result *indexHashJoinResult) error { + if result == nil { + return nil + } + req.SwapColumns(result.chk) + result.src <- result.chk + return nil +} + // Close implements the IndexNestedLoopHashJoin Executor interface. func (e *IndexNestedLoopHashJoin) Close() error { if e.stats != nil { @@ -314,6 +331,7 @@ func (e *IndexNestedLoopHashJoin) Close() error { e.joinChkResourceCh = nil e.finished.Store(false) e.prepared = false + e.ctxWithCancel = nil return e.BaseExecutor.Close() } @@ -427,7 +445,7 @@ func (e *IndexNestedLoopHashJoin) newInnerWorker(taskCh chan *indexHashJoinTask, innerCtx: e.innerCtx, outerCtx: e.outerCtx, ctx: e.Ctx(), - executorChk: e.Ctx().GetSessionVars().GetNewChunkWithCapacity(e.innerCtx.rowTypes, e.MaxChunkSize(), e.MaxChunkSize(), e.AllocPool), + executorChk: e.AllocPool.Alloc(e.innerCtx.rowTypes, e.MaxChunkSize(), e.MaxChunkSize()), indexRanges: copiedRanges, keyOff2IdxOff: e.keyOff2IdxOff, stats: innerStats, @@ -440,7 +458,7 @@ func (e *IndexNestedLoopHashJoin) newInnerWorker(taskCh chan *indexHashJoinTask, resultCh: e.resultCh, joinKeyBuf: make([]byte, 1), outerRowStatus: make([]outerRowStatusFlag, 0, e.MaxChunkSize()), - rowIter: chunk.NewIterator4Slice([]chunk.Row{}).(*chunk.Iterator4Slice), + rowIter: chunk.NewIterator4Slice([]chunk.Row{}), } iw.memTracker.AttachTo(e.memTracker) if len(copiedRanges) != 0 { diff --git a/pkg/executor/index_lookup_join.go b/pkg/executor/index_lookup_join.go index 93ac46d962328..9c40333ee8201 100644 --- a/pkg/executor/index_lookup_join.go +++ b/pkg/executor/index_lookup_join.go @@ -227,7 +227,7 @@ func (e *IndexLookUpJoin) newInnerWorker(taskCh chan *lookUpJoinTask) *innerWork outerCtx: e.outerCtx, taskCh: taskCh, ctx: e.Ctx(), - executorChk: e.Ctx().GetSessionVars().GetNewChunkWithCapacity(e.innerCtx.rowTypes, e.MaxChunkSize(), e.MaxChunkSize(), e.AllocPool), + executorChk: e.AllocPool.Alloc(e.innerCtx.rowTypes, e.MaxChunkSize(), e.MaxChunkSize()), indexRanges: copiedRanges, keyOff2IdxOff: e.keyOff2IdxOff, stats: innerStats, @@ -284,7 +284,7 @@ func (e *IndexLookUpJoin) Next(ctx context.Context, req *chunk.Chunk) error { if e.innerIter == nil || e.innerIter.Current() == e.innerIter.End() { e.lookUpMatchedInners(task, task.cursor) if e.innerIter == nil { - e.innerIter = chunk.NewIterator4Slice(task.matchedInners).(*chunk.Iterator4Slice) + e.innerIter = chunk.NewIterator4Slice(task.matchedInners) } e.innerIter.Reset(task.matchedInners) e.innerIter.Begin() @@ -437,7 +437,7 @@ func (ow *outerWorker) buildTask(ctx context.Context) (*lookUpJoinTask, error) { } maxChunkSize := ow.ctx.GetSessionVars().MaxChunkSize for requiredRows > task.outerResult.Len() { - chk := ow.ctx.GetSessionVars().GetNewChunkWithCapacity(ow.outerCtx.rowTypes, maxChunkSize, maxChunkSize, ow.executor.Base().AllocPool) + chk := ow.executor.NewChunkWithCapacity(ow.outerCtx.rowTypes, maxChunkSize, maxChunkSize) chk = chk.SetRequiredRows(requiredRows, maxChunkSize) err := exec.Next(ctx, ow.executor, chk) if err != nil { @@ -468,7 +468,11 @@ func (ow *outerWorker) buildTask(ctx context.Context) (*lookUpJoinTask, error) { } task.encodedLookUpKeys = make([]*chunk.Chunk, task.outerResult.NumChunks()) for i := range task.encodedLookUpKeys { - task.encodedLookUpKeys[i] = ow.ctx.GetSessionVars().GetNewChunkWithCapacity([]*types.FieldType{types.NewFieldType(mysql.TypeBlob)}, task.outerResult.GetChunk(i).NumRows(), task.outerResult.GetChunk(i).NumRows(), ow.executor.Base().AllocPool) + task.encodedLookUpKeys[i] = ow.executor.NewChunkWithCapacity( + []*types.FieldType{types.NewFieldType(mysql.TypeBlob)}, + task.outerResult.GetChunk(i).NumRows(), + task.outerResult.GetChunk(i).NumRows(), + ) } return task, nil } @@ -697,7 +701,7 @@ func (iw *innerWorker) fetchInnerResults(ctx context.Context, task *lookUpJoinTa } innerExec, err := iw.readerBuilder.buildExecutorForIndexJoin(ctx, lookUpContent, iw.indexRanges, iw.keyOff2IdxOff, iw.nextColCompareFilters, true, iw.memTracker, iw.lookup.finished) if innerExec != nil { - defer terror.Call(innerExec.Close) + defer func() { terror.Log(exec.Close(innerExec)) }() } if err != nil { return err diff --git a/pkg/executor/index_lookup_merge_join.go b/pkg/executor/index_lookup_merge_join.go index 01fc927897c73..f526058962998 100644 --- a/pkg/executor/index_lookup_merge_join.go +++ b/pkg/executor/index_lookup_merge_join.go @@ -343,7 +343,7 @@ func (*outerMergeWorker) pushToChan(ctx context.Context, task *lookUpMergeJoinTa func (omw *outerMergeWorker) buildTask(ctx context.Context) (*lookUpMergeJoinTask, error) { task := &lookUpMergeJoinTask{ results: make(chan *indexMergeJoinResult, numResChkHold), - outerResult: chunk.NewList(omw.rowTypes, omw.executor.Base().InitCap(), omw.executor.Base().MaxChunkSize()), + outerResult: chunk.NewList(omw.rowTypes, omw.executor.InitCap(), omw.executor.MaxChunkSize()), } task.memTracker = memory.NewTracker(memory.LabelForSimpleTask, -1) task.memTracker.AttachTo(omw.parentMemTracker) @@ -489,7 +489,7 @@ func (imw *innerMergeWorker) handleTask(ctx context.Context, task *lookUpMergeJo } imw.innerExec, err = imw.readerBuilder.buildExecutorForIndexJoin(ctx, dLookUpKeys, imw.indexRanges, imw.keyOff2IdxOff, imw.nextColCompareFilters, false, nil, nil) if imw.innerExec != nil { - defer terror.Call(imw.innerExec.Close) + defer func() { terror.Log(exec.Close(imw.innerExec)) }() } if err != nil { return err @@ -712,7 +712,7 @@ func (imw *innerMergeWorker) dedupDatumLookUpKeys(lookUpContents []*indexJoinLoo // fetchNextInnerResult collects a chunk of inner results from inner child executor. func (imw *innerMergeWorker) fetchNextInnerResult(ctx context.Context, task *lookUpMergeJoinTask) (beginRow chunk.Row, err error) { - task.innerResult = imw.ctx.GetSessionVars().GetNewChunkWithCapacity(exec.RetTypes(imw.innerExec), imw.ctx.GetSessionVars().MaxChunkSize, imw.ctx.GetSessionVars().MaxChunkSize, imw.innerExec.Base().AllocPool) + task.innerResult = imw.innerExec.NewChunkWithCapacity(imw.innerExec.RetFieldTypes(), imw.innerExec.MaxChunkSize(), imw.innerExec.MaxChunkSize()) err = exec.Next(ctx, imw.innerExec, task.innerResult) task.innerIter = chunk.NewIterator4Chunk(task.innerResult) beginRow = task.innerIter.Begin() diff --git a/pkg/executor/index_merge_reader.go b/pkg/executor/index_merge_reader.go index 20062fb1a719b..64077e7068c45 100644 --- a/pkg/executor/index_merge_reader.go +++ b/pkg/executor/index_merge_reader.go @@ -522,7 +522,7 @@ func (e *IndexMergeReaderExecutor) startPartialTableWorker(ctx context.Context, defer func() { // To make sure SelectResult.Close() is called even got panic in fetchHandles(). if !tableReaderClosed { - terror.Call(worker.tableReader.Close) + terror.Log(exec.Close(worker.tableReader)) } }() for parTblIdx, tbl := range tbls { @@ -555,7 +555,7 @@ func (e *IndexMergeReaderExecutor) startPartialTableWorker(ctx context.Context, // release related resources cancel() tableReaderClosed = true - if err = worker.tableReader.Close(); err != nil { + if err = exec.Close(worker.tableReader); err != nil { logutil.Logger(ctx).Error("close Select result failed:", zap.Error(err)) } // this error is reported in fetchHandles(), so ignore it here. @@ -631,7 +631,7 @@ func (w *partialTableWorker) needPartitionHandle() (bool, error) { func (w *partialTableWorker) fetchHandles(ctx context.Context, exitCh <-chan struct{}, fetchCh chan<- *indexMergeTableTask, finished <-chan struct{}, handleCols plannercore.HandleCols, parTblIdx int, partialPlanIndex int) (count int64, err error) { - chk := w.sc.GetSessionVars().GetNewChunkWithCapacity(w.getRetTpsForTableScan(), w.maxChunkSize, w.maxChunkSize, w.tableReader.Base().AllocPool) + chk := w.tableReader.NewChunkWithCapacity(w.getRetTpsForTableScan(), w.maxChunkSize, w.maxBatchSize) for { start := time.Now() handles, retChunk, err := w.extractTaskHandles(ctx, chk, handleCols) @@ -686,8 +686,8 @@ func (w *partialTableWorker) extractTaskHandles(ctx context.Context, chk *chunk. if err != nil { return nil, nil, err } - if be := w.tableReader.Base(); be != nil && be.RuntimeStats() != nil { - be.RuntimeStats().Record(time.Since(start), chk.NumRows()) + if w.tableReader != nil && w.tableReader.RuntimeStats() != nil { + w.tableReader.RuntimeStats().Record(time.Since(start), chk.NumRows()) } if chk.NumRows() == 0 { failpoint.Inject("testIndexMergeErrorPartialTableWorker", func(v failpoint.Value) { @@ -1899,7 +1899,7 @@ func (w *indexMergeTableScanWorker) executeTask(ctx context.Context, task *index logutil.Logger(ctx).Error("build table reader failed", zap.Error(err)) return err } - defer terror.Call(tableReader.Close) + defer func() { terror.Log(exec.Close(tableReader)) }() task.memTracker = w.memTracker memUsage := int64(cap(task.handles) * 8) task.memUsage = memUsage diff --git a/pkg/executor/infoschema_cluster_table_test.go b/pkg/executor/infoschema_cluster_table_test.go index 332bcfa52221f..aaed175f377b9 100644 --- a/pkg/executor/infoschema_cluster_table_test.go +++ b/pkg/executor/infoschema_cluster_table_test.go @@ -59,7 +59,7 @@ func createInfosSchemaClusterTableSuite(t *testing.T) *infosSchemaClusterTableSu s.httpServer, s.mockAddr = s.setUpMockPDHTTPServer() s.store, s.dom = testkit.CreateMockStoreAndDomain( t, - mockstore.WithTiKVOptions(tikv.WithPDHTTPClient([]string{s.mockAddr})), + mockstore.WithTiKVOptions(tikv.WithPDHTTPClient("infoschema-cluster-table-test", []string{s.mockAddr})), ) s.rpcServer, s.listenAddr = setUpRPCService(t, s.dom, "127.0.0.1:0") s.startTime = time.Now() @@ -225,9 +225,12 @@ func TestTiDBClusterInfo(t *testing.T) { row("tikv", "store1", "", "", ""), )) startTime := types.NewTime(types.FromGoTime(s.startTime), mysql.TypeDatetime, 0).String() - tk.MustQuery("select type, instance, start_time from information_schema.cluster_info where type != 'tidb'").Check(testkit.Rows( + tk.MustQuery("select type, instance, start_time from information_schema.cluster_info where type = 'pd'").Check(testkit.Rows( row("pd", mockAddr, startTime), - row("tikv", "store1", startTime), + )) + // The start_time is filled in `dataForTiDBClusterInfo` function not always same as `s.startTime`. + tk.MustQuery("select type, instance from information_schema.cluster_info where type = 'tikv'").Check(testkit.Rows( + row("tikv", "store1"), )) require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/infoschema/mockStoreTombstone", `return(true)`)) @@ -290,13 +293,12 @@ func TestTikvRegionStatus(t *testing.T) { mockAddr, } tk := testkit.NewTestKit(t, store) - restoreConfig := config.RestoreFunc() - defer restoreConfig() - config.UpdateGlobal(func(conf *config.Config) { - conf.EnableGlobalIndex = true - }) tk.MustExec("use test") + tk.MustExec("set tidb_enable_global_index=true") + defer func() { + tk.MustExec("set tidb_enable_global_index=default") + }() tk.MustExec("drop table if exists test_t1") tk.MustExec(`CREATE TABLE test_t1 ( a int(11) DEFAULT NULL, b int(11) DEFAULT NULL, c int(11) DEFAULT NULL)`) tk.MustQuery("select REGION_ID, DB_NAME, TABLE_NAME, IS_INDEX, INDEX_ID, INDEX_NAME, IS_PARTITION, PARTITION_NAME from information_schema.TIKV_REGION_STATUS where DB_NAME = 'test' and TABLE_NAME = 'test_t1'").Check(testkit.Rows( @@ -383,7 +385,7 @@ func TestTableStorageStats(t *testing.T) { "test 2", )) rows := tk.MustQuery("select TABLE_NAME from information_schema.TABLE_STORAGE_STATS where TABLE_SCHEMA = 'mysql';").Rows() - result := 55 + result := 56 require.Len(t, rows, result) // More tests about the privileges. diff --git a/pkg/executor/infoschema_reader.go b/pkg/executor/infoschema_reader.go index af79439a5eef7..5013669a05c6e 100644 --- a/pkg/executor/infoschema_reader.go +++ b/pkg/executor/infoschema_reader.go @@ -43,6 +43,7 @@ import ( "github.com/pingcap/tidb/pkg/infoschema" "github.com/pingcap/tidb/pkg/kv" "github.com/pingcap/tidb/pkg/meta/autoid" + "github.com/pingcap/tidb/pkg/parser" "github.com/pingcap/tidb/pkg/parser/charset" "github.com/pingcap/tidb/pkg/parser/model" "github.com/pingcap/tidb/pkg/parser/mysql" @@ -197,6 +198,8 @@ func (e *memtableRetriever) retrieve(ctx context.Context, sctx sessionctx.Contex err = e.setDataFromCheckConstraints(sctx, dbs) case infoschema.TableTiDBCheckConstraints: err = e.setDataFromTiDBCheckConstraints(sctx, dbs) + case infoschema.TableKeywords: + err = e.setDataFromKeywords() } if err != nil { return nil, err @@ -261,10 +264,14 @@ func (e *memtableRetriever) setDataForVariablesInfo(ctx sessionctx.Context) erro if sv.IsNoop { isNoop = "YES" } + defVal := sv.Value + if sv.HasGlobalScope() { + defVal = variable.GlobalSystemVariableInitialValue(sv.Name, defVal) + } row := types.MakeDatums( sv.Name, // VARIABLE_NAME sv.Scope.String(), // VARIABLE_SCOPE - sv.Value, // DEFAULT_VALUE + defVal, // DEFAULT_VALUE currentVal, // CURRENT_VALUE sv.MinValue, // MIN_VALUE sv.MaxValue, // MAX_VALUE @@ -735,7 +742,7 @@ func (e *hugeMemTableRetriever) dataForColumnsInTable(ctx context.Context, sctx internalCtx := kv.WithInternalSourceType(context.Background(), kv.InternalTxnOthers) // Build plan is not thread safe, there will be concurrency on sessionctx. if err := runWithSystemSession(internalCtx, sctx, func(s sessionctx.Context) error { - planBuilder, _ := plannercore.NewPlanBuilder().Init(s, is, &hint.BlockHintProcessor{}) + planBuilder, _ := plannercore.NewPlanBuilder().Init(s, is, hint.NewQBHintHandler(nil)) var err error viewLogicalPlan, err = planBuilder.BuildDataSourceFromView(ctx, schema.Name, tbl, nil, nil) return errors.Trace(err) @@ -1730,7 +1737,7 @@ func (*memtableRetriever) getRegionsInfoForSingleTable(ctx context.Context, help if err != nil { return nil, err } - return pdCli.GetRegionsByKeyRange(ctx, sk, ek, -1) + return pdCli.GetRegionsByKeyRange(ctx, pd.NewKeyRange(sk, ek), -1) } func (e *memtableRetriever) setNewTiKVRegionStatusCol(region *pd.RegionInfo, table *helper.TableInfo) { @@ -3435,6 +3442,16 @@ func (e *memtableRetriever) setDataFromResourceGroups() error { return nil } +func (e *memtableRetriever) setDataFromKeywords() error { + rows := make([][]types.Datum, 0, len(parser.Keywords)) + for _, kw := range parser.Keywords { + row := types.MakeDatums(kw.Word, kw.Reserved) + rows = append(rows, row) + } + e.rows = rows + return nil +} + func checkRule(rule *label.Rule) (dbName, tableName string, partitionName string, err error) { s := strings.Split(rule.ID, "/") if len(s) < 3 { diff --git a/pkg/executor/infoschema_reader_internal_test.go b/pkg/executor/infoschema_reader_internal_test.go index df9a0336c9dfd..aa58616404a93 100644 --- a/pkg/executor/infoschema_reader_internal_test.go +++ b/pkg/executor/infoschema_reader_internal_test.go @@ -123,3 +123,11 @@ func TestSetDataFromTiDBCheckConstraints(t *testing.T) { require.Equal(t, types.NewStringDatum("t2"), mt.rows[0][4]) require.Equal(t, types.NewIntDatum(2), mt.rows[0][5]) } + +func TestSetDataFromKeywords(t *testing.T) { + mt := memtableRetriever{} + err := mt.setDataFromKeywords() + require.NoError(t, err) + require.Equal(t, types.NewStringDatum("ADD"), mt.rows[0][0]) // Keyword: ADD + require.Equal(t, types.NewIntDatum(1), mt.rows[0][1]) // Reserved: true(1) +} diff --git a/pkg/executor/infoschema_reader_test.go b/pkg/executor/infoschema_reader_test.go index 4412db2021a52..386d1c2126cfe 100644 --- a/pkg/executor/infoschema_reader_test.go +++ b/pkg/executor/infoschema_reader_test.go @@ -285,7 +285,7 @@ func TestForAnalyzeStatus(t *testing.T) { " `FAIL_REASON` longtext DEFAULT NULL,\n" + " `INSTANCE` varchar(512) DEFAULT NULL,\n" + " `PROCESS_ID` bigint(64) unsigned DEFAULT NULL,\n" + - " `REMAINING_SECONDS` bigint(64) unsigned DEFAULT NULL,\n" + + " `REMAINING_SECONDS` varchar(512) DEFAULT NULL,\n" + " `PROGRESS` double(22,6) DEFAULT NULL,\n" + " `ESTIMATED_TOTAL_ROWS` bigint(64) unsigned DEFAULT NULL\n" + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin" diff --git a/pkg/executor/insert.go b/pkg/executor/insert.go index a1a5e8836c370..806a7c62b02d7 100644 --- a/pkg/executor/insert.go +++ b/pkg/executor/insert.go @@ -22,6 +22,7 @@ import ( "time" "github.com/pingcap/errors" + "github.com/pingcap/tidb/pkg/errctx" "github.com/pingcap/tidb/pkg/errno" "github.com/pingcap/tidb/pkg/executor/internal/exec" "github.com/pingcap/tidb/pkg/expression" @@ -65,7 +66,7 @@ func (e *InsertExec) exec(ctx context.Context, rows [][]types.Datum) error { // If tidb_batch_insert is ON and not in a transaction, we could use BatchInsert mode. sessVars := e.Ctx().GetSessionVars() defer sessVars.CleanBuffers() - ignoreErr := sessVars.StmtCtx.DupKeyAsWarning + ignoreErr := sessVars.StmtCtx.ErrGroupLevel(errctx.ErrGroupDupKey) != errctx.LevelError txn, err := e.Ctx().Txn(true) if err != nil { @@ -199,10 +200,9 @@ func (e *InsertExec) updateDupRow(ctx context.Context, idxInBatch int, txn kv.Tr } err = e.doDupRowUpdate(ctx, handle, oldRow, row.row, extraCols, e.OnDuplicate, idxInBatch) - if e.Ctx().GetSessionVars().StmtCtx.DupKeyAsWarning && (kv.ErrKeyExists.Equal(err) || - table.ErrCheckConstraintViolated.Equal(err)) { - e.Ctx().GetSessionVars().StmtCtx.AppendWarning(err) - return nil + if kv.ErrKeyExists.Equal(err) || table.ErrCheckConstraintViolated.Equal(err) { + ec := e.Ctx().GetSessionVars().StmtCtx.ErrCtx() + return ec.HandleErrorWithAlias(kv.ErrKeyExists, err, err) } return err } @@ -308,11 +308,9 @@ func (e *InsertExec) Next(ctx context.Context, req *chunk.Chunk) error { err := insertRows(ctx, e) if err != nil { terr, ok := errors.Cause(err).(*terror.Error) - if ok && len(e.OnDuplicate) == 0 && - e.Ctx().GetSessionVars().StmtCtx.ErrAutoincReadFailedAsWarning && - terr.Code() == errno.ErrAutoincReadFailed { - e.Ctx().GetSessionVars().StmtCtx.AppendWarning(err) - return nil + if ok && len(e.OnDuplicate) == 0 && terr.Code() == errno.ErrAutoincReadFailed { + ec := e.Ctx().GetSessionVars().StmtCtx.ErrCtx() + return ec.HandleError(err) } return err } @@ -327,7 +325,7 @@ func (e *InsertExec) Close() error { defer e.memTracker.ReplaceBytesUsed(0) e.setMessage() if e.SelectExec != nil { - return e.SelectExec.Close() + return exec.Close(e.SelectExec) } return nil } @@ -367,7 +365,7 @@ func (e *InsertExec) initEvalBuffer4Dup() { evalBufferTypes = append(evalBufferTypes, &(col.FieldType)) } if extraLen > 0 { - evalBufferTypes = append(evalBufferTypes, e.SelectExec.Base().RetFieldTypes()[e.rowLen:]...) + evalBufferTypes = append(evalBufferTypes, e.SelectExec.RetFieldTypes()[e.rowLen:]...) } for _, col := range e.Table.Cols() { evalBufferTypes = append(evalBufferTypes, &(col.FieldType)) @@ -442,7 +440,7 @@ func (e *InsertExec) setMessage() { if e.SelectExec != nil || numRecords > 1 { numWarnings := stmtCtx.WarningCount() var numDuplicates uint64 - if stmtCtx.DupKeyAsWarning { + if stmtCtx.ErrGroupLevel(errctx.ErrGroupDupKey) != errctx.LevelError { // if ignoreErr numDuplicates = numRecords - stmtCtx.CopiedRows() } else { diff --git a/pkg/executor/insert_common.go b/pkg/executor/insert_common.go index 35464cf7df89d..034515684a516 100644 --- a/pkg/executor/insert_common.go +++ b/pkg/executor/insert_common.go @@ -321,11 +321,11 @@ func (e *InsertValues) handleErr(col *table.Column, val *types.Datum, rowIdx int err = completeInsertErr(c, val, rowIdx, err) } - if !e.Ctx().GetSessionVars().StmtCtx.DupKeyAsWarning { - return err - } // TODO: should not filter all types of errors here. - e.handleWarning(err) + if err != nil { + ec := e.Ctx().GetSessionVars().StmtCtx.ErrCtx() + return ec.HandleErrorWithAlias(kv.ErrKeyExists, err, err) + } return nil } @@ -685,7 +685,7 @@ func (e *InsertValues) fillRow(ctx context.Context, row []types.Datum, hasValue return nil, err } if !e.lazyFillAutoID || (e.lazyFillAutoID && !mysql.HasAutoIncrementFlag(c.GetFlag())) { - if err = c.HandleBadNull(&row[i], e.Ctx().GetSessionVars().StmtCtx, rowCntInLoadData); err != nil { + if err = c.HandleBadNull(e.Ctx().GetSessionVars().StmtCtx.ErrCtx(), &row[i], rowCntInLoadData); err != nil { return nil, err } } @@ -724,7 +724,7 @@ func (e *InsertValues) fillRow(ctx context.Context, row []types.Datum, hasValue warnCnt += len(newWarnings) } // Handle the bad null error. - if err = gCol.HandleBadNull(&row[colIdx], sc, rowCntInLoadData); err != nil { + if err = gCol.HandleBadNull(sc.ErrCtx(), &row[colIdx], rowCntInLoadData); err != nil { return nil, err } } diff --git a/pkg/executor/internal/applycache/apply_cache.go b/pkg/executor/internal/applycache/apply_cache.go index cb5ee694f3bce..e3740b7601536 100644 --- a/pkg/executor/internal/applycache/apply_cache.go +++ b/pkg/executor/internal/applycache/apply_cache.go @@ -67,6 +67,12 @@ func (c *ApplyCache) put(key applyCacheKey, val kvcache.Value) { c.cache.Put(key, val) } +func (c *ApplyCache) removeOldest() (kvcache.Key, kvcache.Value, bool) { + c.lock.Lock() + defer c.lock.Unlock() + return c.cache.RemoveOldest() +} + // Get gets a cache item according to cache key. It's thread-safe. func (c *ApplyCache) Get(key applyCacheKey) (*chunk.List, error) { value, hit := c.get(key) @@ -84,7 +90,7 @@ func (c *ApplyCache) Set(key applyCacheKey, value *chunk.List) (bool, error) { return false, nil } for mem+c.memTracker.BytesConsumed() > c.memCapacity { - evictedKey, evictedValue, evicted := c.cache.RemoveOldest() + evictedKey, evictedValue, evicted := c.removeOldest() if !evicted { return false, nil } diff --git a/pkg/executor/internal/applycache/apply_cache_test.go b/pkg/executor/internal/applycache/apply_cache_test.go index b20495a2a7369..e40148fcc6528 100644 --- a/pkg/executor/internal/applycache/apply_cache_test.go +++ b/pkg/executor/internal/applycache/apply_cache_test.go @@ -17,6 +17,7 @@ package applycache import ( "strconv" "strings" + "sync" "testing" "github.com/pingcap/tidb/pkg/parser/mysql" @@ -77,3 +78,61 @@ func TestApplyCache(t *testing.T) { require.NoError(t, err) require.Nil(t, result) } + +func TestApplyCacheConcurrent(t *testing.T) { + ctx := mock.NewContext() + ctx.GetSessionVars().MemQuotaApplyCache = 100 + applyCache, err := NewApplyCache(ctx) + require.NoError(t, err) + + fields := []*types.FieldType{types.NewFieldType(mysql.TypeLonglong)} + value := make([]*chunk.List, 2) + key := make([][]byte, 2) + for i := 0; i < 2; i++ { + value[i] = chunk.NewList(fields, 1, 1) + srcChunk := chunk.NewChunkWithCapacity(fields, 1) + srcChunk.AppendInt64(0, int64(i)) + srcRow := srcChunk.GetRow(0) + value[i].AppendRow(srcRow) + key[i] = []byte(strings.Repeat(strconv.Itoa(i), 100)) + + // TODO: *chunk.List.GetMemTracker().BytesConsumed() is not accurate, fix it later. + require.Equal(t, int64(100), applyCacheKVMem(key[i], value[i])) + } + + applyCache.Set(key[0], value[0]) + var wg sync.WaitGroup + wg.Add(2) + var func1 = func() { + for i := 0; i < 100; i++ { + for { + result, err := applyCache.Get(key[0]) + require.NoError(t, err) + if result != nil { + applyCache.Set(key[1], value[1]) + break + } + } + } + wg.Done() + } + var func2 = func() { + for i := 0; i < 100; i++ { + for { + result, err := applyCache.Get(key[1]) + require.NoError(t, err) + if result != nil { + applyCache.Set(key[0], value[0]) + break + } + } + } + wg.Done() + } + go func1() + go func2() + wg.Wait() + result, err := applyCache.Get(key[0]) + require.NoError(t, err) + require.NotNil(t, result) +} diff --git a/pkg/executor/internal/applycache/main_test.go b/pkg/executor/internal/applycache/main_test.go index ef36cc3a4f59c..8fad2e6da7292 100644 --- a/pkg/executor/internal/applycache/main_test.go +++ b/pkg/executor/internal/applycache/main_test.go @@ -38,6 +38,7 @@ func TestMain(m *testing.M) { opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("gopkg.in/natefinch/lumberjack%2ev2.(*Logger).millRun"), diff --git a/pkg/executor/internal/calibrateresource/BUILD.bazel b/pkg/executor/internal/calibrateresource/BUILD.bazel index 579adff6fceab..c7ecb061ff33d 100644 --- a/pkg/executor/internal/calibrateresource/BUILD.bazel +++ b/pkg/executor/internal/calibrateresource/BUILD.bazel @@ -16,6 +16,7 @@ go_library( "//pkg/sessionctx", "//pkg/sessionctx/variable", "//pkg/sessiontxn/staleread", + "//pkg/util", "//pkg/util/chunk", "//pkg/util/sqlexec", "@com_github_docker_go_units//:go-units", diff --git a/pkg/executor/internal/calibrateresource/calibrate_resource.go b/pkg/executor/internal/calibrateresource/calibrate_resource.go index 1c8ddcd76fa82..a4dedeba6f44b 100644 --- a/pkg/executor/internal/calibrateresource/calibrate_resource.go +++ b/pkg/executor/internal/calibrateresource/calibrate_resource.go @@ -15,10 +15,17 @@ package calibrateresource import ( + "bufio" "context" + "encoding/base64" "fmt" + "io" "math" + "net/http" + "runtime" "sort" + "strconv" + "strings" "time" "github.com/docker/go-units" @@ -34,6 +41,7 @@ import ( "github.com/pingcap/tidb/pkg/sessionctx" "github.com/pingcap/tidb/pkg/sessionctx/variable" "github.com/pingcap/tidb/pkg/sessiontxn/staleread" + "github.com/pingcap/tidb/pkg/util" "github.com/pingcap/tidb/pkg/util/chunk" "github.com/pingcap/tidb/pkg/util/sqlexec" "github.com/tikv/client-go/v2/oracle" @@ -81,6 +89,15 @@ var ( } ) +const ( + // serverTypeTiDB is tidb's instance type name + serverTypeTiDB = "tidb" + // serverTypeTiKV is tikv's instance type name + serverTypeTiKV = "tikv" + // serverTypeTiFlash is tiflash's instance type name + serverTypeTiFlash = "tiflash" +) + // the resource cost rate of a specified workload per 1 tikv cpu. type baseResourceCost struct { // represents the average ratio of TiDB CPU time to TiKV CPU time, this is used to calculate whether tikv cpu @@ -235,13 +252,14 @@ func (e *Executor) Next(ctx context.Context, req *chunk.Chunk) error { return nil } e.done = true - - exec := e.Ctx().(sqlexec.RestrictedSQLExecutor) + if !variable.EnableResourceControl.Load() { + return infoschema.ErrResourceGroupSupportDisabled + } ctx = kv.WithInternalSourceType(ctx, kv.InternalTxnOthers) if len(e.OptionList) > 0 { - return e.dynamicCalibrate(ctx, req, exec) + return e.dynamicCalibrate(ctx, req) } - return e.staticCalibrate(ctx, req, exec) + return e.staticCalibrate(req) } var ( @@ -249,29 +267,40 @@ var ( errNoCPUQuotaMetrics = errors.Normalize("There is no CPU quota metrics, %v") ) -func (e *Executor) dynamicCalibrate(ctx context.Context, req *chunk.Chunk, exec sqlexec.RestrictedSQLExecutor) error { +func (e *Executor) dynamicCalibrate(ctx context.Context, req *chunk.Chunk) error { + exec := e.Ctx().(sqlexec.RestrictedSQLExecutor) startTs, endTs, err := e.parseCalibrateDuration(ctx) if err != nil { return err } - tidbQuota, err1 := e.getTiDBQuota(ctx, exec, startTs, endTs) - tiflashQuota, err2 := e.getTiFlashQuota(ctx, exec, startTs, endTs) + clusterInfo, err := infoschema.GetClusterServerInfo(e.Ctx()) + if err != nil { + return err + } + tidbQuota, err1 := e.getTiDBQuota(ctx, exec, clusterInfo, startTs, endTs) + tiflashQuota, err2 := e.getTiFlashQuota(ctx, exec, clusterInfo, startTs, endTs) if err1 != nil && err2 != nil { return err1 } + req.AppendUint64(0, uint64(tidbQuota+tiflashQuota)) return nil } -func (e *Executor) getTiDBQuota(ctx context.Context, exec sqlexec.RestrictedSQLExecutor, startTs, endTs time.Time) (float64, error) { +func (e *Executor) getTiDBQuota( + ctx context.Context, + exec sqlexec.RestrictedSQLExecutor, + serverInfos []infoschema.ServerInfo, + startTs, endTs time.Time, +) (float64, error) { startTime := startTs.In(e.Ctx().GetSessionVars().Location()).Format(time.DateTime) endTime := endTs.In(e.Ctx().GetSessionVars().Location()).Format(time.DateTime) - totalKVCPUQuota, err := getTiKVTotalCPUQuota(ctx, exec) + totalKVCPUQuota, err := getTiKVTotalCPUQuota(serverInfos) if err != nil { return 0, errNoCPUQuotaMetrics.FastGenByArgs(err.Error()) } - totalTiDBCPU, err := getTiDBTotalCPUQuota(ctx, exec) + totalTiDBCPU, err := getTiDBTotalCPUQuota(serverInfos) if err != nil { return 0, errNoCPUQuotaMetrics.FastGenByArgs(err.Error()) } @@ -368,12 +397,17 @@ func setupQuotas(quotas []float64) (float64, error) { return sum / float64(upperBound-lowerBound), nil } -func (e *Executor) getTiFlashQuota(ctx context.Context, exec sqlexec.RestrictedSQLExecutor, startTs, endTs time.Time) (float64, error) { +func (e *Executor) getTiFlashQuota( + ctx context.Context, + exec sqlexec.RestrictedSQLExecutor, + serverInfos []infoschema.ServerInfo, + startTs, endTs time.Time, +) (float64, error) { startTime := startTs.In(e.Ctx().GetSessionVars().Location()).Format(time.DateTime) endTime := endTs.In(e.Ctx().GetSessionVars().Location()).Format(time.DateTime) quotas := make([]float64, 0) - totalTiFlashLogicalCores, err := getTiFlashLogicalCores(ctx, exec) + totalTiFlashLogicalCores, err := getTiFlashLogicalCores(serverInfos) if err != nil { return 0, errNoCPUQuotaMetrics.FastGenByArgs(err.Error()) } @@ -407,25 +441,26 @@ func (e *Executor) getTiFlashQuota(ctx context.Context, exec sqlexec.RestrictedS return setupQuotas(quotas) } -func (e *Executor) staticCalibrate(ctx context.Context, req *chunk.Chunk, exec sqlexec.RestrictedSQLExecutor) error { - if !variable.EnableResourceControl.Load() { - return infoschema.ErrResourceGroupSupportDisabled - } +func (e *Executor) staticCalibrate(req *chunk.Chunk) error { resourceGroupCtl := domain.GetDomain(e.Ctx()).ResourceGroupsController() // first fetch the ru settings config. if resourceGroupCtl == nil { return errors.New("resource group controller is not initialized") } + clusterInfo, err := infoschema.GetClusterServerInfo(e.Ctx()) + if err != nil { + return err + } ruCfg := resourceGroupCtl.GetConfig() if e.WorkloadType == ast.TPCH10 { - return staticCalibrateTpch10(ctx, req, exec, ruCfg) + return staticCalibrateTpch10(req, clusterInfo, ruCfg) } - totalKVCPUQuota, err := getTiKVTotalCPUQuota(ctx, exec) + totalKVCPUQuota, err := getTiKVTotalCPUQuota(clusterInfo) if err != nil { return errNoCPUQuotaMetrics.FastGenByArgs(err.Error()) } - totalTiDBCPU, err := getTiDBTotalCPUQuota(ctx, exec) + totalTiDBCPUQuota, err := getTiDBTotalCPUQuota(clusterInfo) if err != nil { return errNoCPUQuotaMetrics.FastGenByArgs(err.Error()) } @@ -439,8 +474,8 @@ func (e *Executor) staticCalibrate(ctx context.Context, req *chunk.Chunk, exec s return errors.Errorf("unknown workload '%T'", e.WorkloadType) } - if totalTiDBCPU/baseCost.tidbToKVCPURatio < totalKVCPUQuota { - totalKVCPUQuota = totalTiDBCPU / baseCost.tidbToKVCPURatio + if totalTiDBCPUQuota/baseCost.tidbToKVCPURatio < totalKVCPUQuota { + totalKVCPUQuota = totalTiDBCPUQuota / baseCost.tidbToKVCPURatio } ruPerKVCPU := float64(ruCfg.ReadBaseCost)*float64(baseCost.readReqCount) + float64(ruCfg.CPUMsCost)*baseCost.kvCPU*1000 + // convert to ms @@ -452,14 +487,14 @@ func (e *Executor) staticCalibrate(ctx context.Context, req *chunk.Chunk, exec s return nil } -func staticCalibrateTpch10(ctx context.Context, req *chunk.Chunk, exec sqlexec.RestrictedSQLExecutor, ruCfg *resourceControlClient.RUConfig) error { +func staticCalibrateTpch10(req *chunk.Chunk, clusterInfo []infoschema.ServerInfo, ruCfg *resourceControlClient.RUConfig) error { // TPCH10 only considers the resource usage of the TiFlash including cpu and read bytes. Others are ignored. // cpu usage: 105494.666484 / 20 / 20 = 263.74 // read bytes: 401799161689.0 / 20 / 20 = 1004497904.22 const cpuTimePerCPUPerSec float64 = 263.74 const readBytesPerCPUPerSec float64 = 1004497904.22 ruPerCPU := float64(ruCfg.CPUMsCost)*cpuTimePerCPUPerSec + float64(ruCfg.ReadBytesCost)*readBytesPerCPUPerSec - totalTiFlashLogicalCores, err := getTiFlashLogicalCores(ctx, exec) + totalTiFlashLogicalCores, err := getTiFlashLogicalCores(clusterInfo) if err != nil { return err } @@ -468,19 +503,39 @@ func staticCalibrateTpch10(ctx context.Context, req *chunk.Chunk, exec sqlexec.R return nil } -func getTiKVTotalCPUQuota(ctx context.Context, exec sqlexec.RestrictedSQLExecutor) (float64, error) { - query := "SELECT SUM(value) FROM METRICS_SCHEMA.tikv_cpu_quota GROUP BY time ORDER BY time desc limit 1" - return getNumberFromMetrics(ctx, exec, query, "tikv_cpu_quota") +func getTiDBTotalCPUQuota(clusterInfo []infoschema.ServerInfo) (float64, error) { + cpuQuota := float64(runtime.GOMAXPROCS(0)) + failpoint.Inject("mockGOMAXPROCS", func(val failpoint.Value) { + if val != nil { + cpuQuota = float64(val.(int)) + } + }) + instanceNum := count(clusterInfo, serverTypeTiDB) + return cpuQuota * float64(instanceNum), nil } -func getTiDBTotalCPUQuota(ctx context.Context, exec sqlexec.RestrictedSQLExecutor) (float64, error) { - query := "SELECT SUM(value) FROM METRICS_SCHEMA.tidb_server_maxprocs GROUP BY time ORDER BY time desc limit 1" - return getNumberFromMetrics(ctx, exec, query, "tidb_server_maxprocs") +func getTiKVTotalCPUQuota(clusterInfo []infoschema.ServerInfo) (float64, error) { + instanceNum := count(clusterInfo, serverTypeTiKV) + if instanceNum == 0 { + return 0.0, errors.New("no server with type 'tikv' is found") + } + cpuQuota, err := fetchServerCPUQuota(clusterInfo, serverTypeTiKV, "tikv_server_cpu_cores_quota") + if err != nil { + return 0.0, err + } + return cpuQuota * float64(instanceNum), nil } -func getTiFlashLogicalCores(ctx context.Context, exec sqlexec.RestrictedSQLExecutor) (float64, error) { - query := "SELECT SUM(value) FROM METRICS_SCHEMA.tiflash_cpu_quota GROUP BY time ORDER BY time desc limit 1" - return getNumberFromMetrics(ctx, exec, query, "tiflash_cpu_quota") +func getTiFlashLogicalCores(clusterInfo []infoschema.ServerInfo) (float64, error) { + instanceNum := count(clusterInfo, serverTypeTiFlash) + if instanceNum == 0 { + return 0.0, nil + } + cpuQuota, err := fetchServerCPUQuota(clusterInfo, serverTypeTiFlash, "tiflash_proxy_tikv_server_cpu_cores_quota") + if err != nil { + return 0.0, err + } + return cpuQuota * float64(instanceNum), nil } func getTiFlashRUPerSec(ctx context.Context, sctx sessionctx.Context, exec sqlexec.RestrictedSQLExecutor, startTime, endTime string) (*timeSeriesValues, error) { @@ -540,18 +595,6 @@ func getComponentCPUUsagePerSec(ctx context.Context, sctx sessionctx.Context, ex return getValuesFromMetrics(ctx, sctx, exec, query) } -func getNumberFromMetrics(ctx context.Context, exec sqlexec.RestrictedSQLExecutor, query, metrics string) (float64, error) { - rows, _, err := exec.ExecRestrictedSQL(ctx, []sqlexec.OptionFuncAlias{sqlexec.ExecOptionUseCurSession}, query) - if err != nil { - return 0.0, errors.Trace(err) - } - if len(rows) == 0 { - return 0.0, errors.Errorf("metrics '%s' is empty", metrics) - } - - return rows[0].GetFloat64(0), nil -} - func getValuesFromMetrics(ctx context.Context, sctx sessionctx.Context, exec sqlexec.RestrictedSQLExecutor, query string) (*timeSeriesValues, error) { rows, _, err := exec.ExecRestrictedSQL(ctx, []sqlexec.OptionFuncAlias{sqlexec.ExecOptionUseCurSession}, query) if err != nil { @@ -568,3 +611,94 @@ func getValuesFromMetrics(ctx context.Context, sctx sessionctx.Context, exec sql } return &timeSeriesValues{idx: 0, vals: ret}, nil } + +func count(clusterInfo []infoschema.ServerInfo, ty string) int { + num := 0 + for _, e := range clusterInfo { + if e.ServerType == ty { + num++ + } + } + return num +} + +func fetchServerCPUQuota(serverInfos []infoschema.ServerInfo, serverType string, metricName string) (float64, error) { + var cpuQuota float64 + err := fetchStoreMetrics(serverInfos, serverType, func(addr string, resp *http.Response) error { + if resp.StatusCode != http.StatusOK { + return errors.Errorf("request %s failed: %s", addr, resp.Status) + } + scanner := bufio.NewScanner(resp.Body) + for scanner.Scan() { + line := scanner.Text() + if !strings.HasPrefix(line, metricName) { + continue + } + // the metrics format is like following: + // tikv_server_cpu_cores_quota 8 + quota, err := strconv.ParseFloat(line[len(metricName)+1:], 64) + if err == nil { + cpuQuota = quota + } + return errors.Trace(err) + } + return errors.Errorf("metrics '%s' not found from server '%s'", metricName, addr) + }) + return cpuQuota, err +} + +func fetchStoreMetrics(serversInfo []infoschema.ServerInfo, serverType string, onResp func(string, *http.Response) error) error { + var firstErr error + for _, srv := range serversInfo { + if srv.ServerType != serverType { + continue + } + if len(srv.StatusAddr) == 0 { + continue + } + url := fmt.Sprintf("%s://%s/metrics", util.InternalHTTPSchema(), srv.StatusAddr) + req, err := http.NewRequest(http.MethodGet, url, nil) + if err != nil { + return err + } + var resp *http.Response + failpoint.Inject("mockMetricsResponse", func(val failpoint.Value) { + if val != nil { + data, _ := base64.StdEncoding.DecodeString(val.(string)) + resp = &http.Response{ + StatusCode: http.StatusOK, + Body: noopCloserWrapper{ + Reader: strings.NewReader(string(data)), + }, + } + } + }) + if resp == nil { + var err1 error + // ignore false positive go line, can't use defer here because it's in a loop. + //nolint:bodyclose + resp, err1 = util.InternalHTTPClient().Do(req) + if err1 != nil { + if firstErr == nil { + firstErr = err1 + } + continue + } + } + err = onResp(srv.Address, resp) + resp.Body.Close() + return err + } + if firstErr == nil { + firstErr = errors.Errorf("no server with type '%s' is found", serverType) + } + return firstErr +} + +type noopCloserWrapper struct { + io.Reader +} + +func (noopCloserWrapper) Close() error { + return nil +} diff --git a/pkg/executor/internal/calibrateresource/calibrate_resource_test.go b/pkg/executor/internal/calibrateresource/calibrate_resource_test.go index 6fb9467454c7e..c0030b004ca08 100644 --- a/pkg/executor/internal/calibrateresource/calibrate_resource_test.go +++ b/pkg/executor/internal/calibrateresource/calibrate_resource_test.go @@ -17,7 +17,9 @@ package calibrateresource_test import ( "bytes" "context" + "encoding/base64" "encoding/json" + "strings" "testing" "time" @@ -73,12 +75,27 @@ func TestCalibrateResource(t *testing.T) { require.NoError(t, err) require.NotNil(t, rs) err = rs.Next(context.Background(), rs.NewChunk(nil)) - require.ErrorContains(t, err, "query metric error: pd unavailable") + require.ErrorContains(t, err, "no server with type 'tikv' is found") // error sql _, err = tk.Exec("CALIBRATE RESOURCE WORKLOAD tpcc START_TIME '2020-02-12 10:35:00'") require.Error(t, err) + // Mock for cluster info + // information_schema.cluster_config + instances := []string{ + "pd,127.0.0.1:32379,127.0.0.1:32380,mock-version,mock-githash,0", + "tidb,127.0.0.1:34000,30080,mock-version,mock-githash,1001", + "tikv,127.0.0.1:30160,30180,mock-version,mock-githash,0", + "tikv,127.0.0.1:30161,30181,mock-version,mock-githash,0", + "tikv,127.0.0.1:30162,30182,mock-version,mock-githash,0", + } + fpExpr := `return("` + strings.Join(instances, ";") + `")` + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/infoschema/mockClusterInfo", fpExpr)) + defer func() { + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/infoschema/mockClusterInfo")) + }() + // Mock for metric table data. fpName := "github.com/pingcap/tidb/pkg/executor/mockMetricsTableData" require.NoError(t, failpoint.Enable(fpName, "return")) @@ -99,30 +116,34 @@ func TestCalibrateResource(t *testing.T) { return time } + metricsData := `# HELP process_cpu_seconds_total Total user and system CPU time spent in seconds. +# TYPE process_cpu_seconds_total counter +process_cpu_seconds_total 49943 +# HELP tikv_server_cpu_cores_quota Total CPU cores quota for TiKV server +# TYPE tikv_server_cpu_cores_quota gauge +tikv_server_cpu_cores_quota 8 +# HELP tiflash_proxy_tikv_scheduler_write_flow The write flow passed through at scheduler level. +# TYPE tiflash_proxy_tikv_scheduler_write_flow gauge +tiflash_proxy_tikv_scheduler_write_flow 0 +# HELP tiflash_proxy_tikv_server_cpu_cores_quota Total CPU cores quota for TiKV server +# TYPE tiflash_proxy_tikv_server_cpu_cores_quota gauge +tiflash_proxy_tikv_server_cpu_cores_quota 20 +` + // failpoint doesn't support string contains whitespaces and newline + encodedData := base64.StdEncoding.EncodeToString([]byte(metricsData)) + fpExpr = `return("` + encodedData + `")` + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/executor/internal/calibrateresource/mockMetricsResponse", fpExpr)) + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/executor/internal/calibrateresource/mockGOMAXPROCS", "return(40)")) + defer func() { + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/executor/internal/calibrateresource/mockGOMAXPROCS")) + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/executor/internal/calibrateresource/mockMetricsResponse")) + }() mockData := make(map[string][][]types.Datum) ctx := context.WithValue(context.Background(), "__mockMetricsTableData", mockData) ctx = failpoint.WithHook(ctx, func(_ context.Context, fpname string) bool { return fpName == fpname }) - rs, err = tk.Exec("CALIBRATE RESOURCE") - require.NoError(t, err) - require.NotNil(t, rs) - err = rs.Next(ctx, rs.NewChunk(nil)) - // because when mock metrics is empty, error is always `pd unavailable`, don't check detail. - require.ErrorContains(t, err, "There is no CPU quota metrics, query metric error: pd unavailable") - - mockData["tikv_cpu_quota"] = [][]types.Datum{ - types.MakeDatums(datetime("2020-02-12 10:35:00"), "tikv-0", 8.0), - types.MakeDatums(datetime("2020-02-12 10:35:00"), "tikv-1", 8.0), - types.MakeDatums(datetime("2020-02-12 10:35:00"), "tikv-2", 8.0), - types.MakeDatums(datetime("2020-02-12 10:36:00"), "tikv-0", 8.0), - types.MakeDatums(datetime("2020-02-12 10:36:00"), "tikv-1", 8.0), - types.MakeDatums(datetime("2020-02-12 10:36:00"), "tikv-2", 8.0), - } - mockData["tidb_server_maxprocs"] = [][]types.Datum{ - types.MakeDatums(datetime("2020-02-12 10:35:00"), "tidb-0", 40.0), - types.MakeDatums(datetime("2020-02-12 10:36:00"), "tidb-0", 40.0), - } + tk.MustQueryWithContext(ctx, "CALIBRATE RESOURCE").Check(testkit.Rows("69768")) tk.MustQueryWithContext(ctx, "CALIBRATE RESOURCE WORKLOAD TPCC").Check(testkit.Rows("69768")) tk.MustQueryWithContext(ctx, "CALIBRATE RESOURCE WORKLOAD OLTP_READ_WRITE").Check(testkit.Rows("55823")) @@ -130,9 +151,7 @@ func TestCalibrateResource(t *testing.T) { tk.MustQueryWithContext(ctx, "CALIBRATE RESOURCE WORKLOAD OLTP_WRITE_ONLY").Check(testkit.Rows("109776")) // change total tidb cpu to less than tikv_cpu_quota - mockData["tidb_server_maxprocs"] = [][]types.Datum{ - types.MakeDatums(datetime("2020-02-12 10:35:00"), "tidb-0", 8.0), - } + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/executor/internal/calibrateresource/mockGOMAXPROCS", "return(8)")) tk.MustQueryWithContext(ctx, "CALIBRATE RESOURCE").Check(testkit.Rows("38760")) ru1 := [][]types.Datum{ @@ -707,19 +726,11 @@ func TestCalibrateResource(t *testing.T) { types.MakeDatums(datetime("2023-09-19 20:00:39.329000"), "127.0.0.1:10080", 20.0), } - mockData["tikv_cpu_quota"] = [][]types.Datum{ - types.MakeDatums(datetime("2023-09-19 19:50:39.330000"), "127.0.0.1:20180", 20.0), - types.MakeDatums(datetime("2023-09-19 19:51:39.330000"), "127.0.0.1:20180", 20.0), - types.MakeDatums(datetime("2023-09-19 19:52:39.330000"), "127.0.0.1:20180", 20.0), - types.MakeDatums(datetime("2023-09-19 19:53:39.330000"), "127.0.0.1:20180", 20.0), - types.MakeDatums(datetime("2023-09-19 19:54:39.330000"), "127.0.0.1:20180", 20.0), - types.MakeDatums(datetime("2023-09-19 19:55:39.330000"), "127.0.0.1:20180", 20.0), - types.MakeDatums(datetime("2023-09-19 19:56:39.330000"), "127.0.0.1:20180", 20.0), - types.MakeDatums(datetime("2023-09-19 19:57:39.330000"), "127.0.0.1:20180", 20.0), - types.MakeDatums(datetime("2023-09-19 19:58:39.330000"), "127.0.0.1:20180", 20.0), - types.MakeDatums(datetime("2023-09-19 19:59:39.330000"), "127.0.0.1:20180", 20.0), - types.MakeDatums(datetime("2023-09-19 20:00:39.330000"), "127.0.0.1:20180", 20.0), - } + // change mock for cluster info, add tiflash + instances = append(instances, "tiflash,127.0.0.1:3930,33940,mock-version,mock-githash,0") + fpExpr = `return("` + strings.Join(instances, ";") + `")` + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/infoschema/mockClusterInfo", fpExpr)) + rs, err = tk.Exec("CALIBRATE RESOURCE START_TIME '2023-09-19 19:50:39' DURATION '10m'") require.NoError(t, err) require.NotNil(t, rs) @@ -754,19 +765,6 @@ func TestCalibrateResource(t *testing.T) { types.MakeDatums(datetime("2023-09-19 20:00:39.318000"), 659167.0340155548), } - mockData["tiflash_cpu_quota"] = [][]types.Datum{ - types.MakeDatums(datetime("2023-09-19 19:50:39.502000"), "127.0.0.1:8234 ", 20.0), - types.MakeDatums(datetime("2023-09-19 19:51:39.502000"), "127.0.0.1:8234 ", 20.0), - types.MakeDatums(datetime("2023-09-19 19:52:39.502000"), "127.0.0.1:8234 ", 20.0), - types.MakeDatums(datetime("2023-09-19 19:53:39.502000"), "127.0.0.1:8234 ", 20.0), - types.MakeDatums(datetime("2023-09-19 19:54:39.502000"), "127.0.0.1:8234 ", 20.0), - types.MakeDatums(datetime("2023-09-19 19:55:39.502000"), "127.0.0.1:8234 ", 20.0), - types.MakeDatums(datetime("2023-09-19 19:56:39.502000"), "127.0.0.1:8234 ", 20.0), - types.MakeDatums(datetime("2023-09-19 19:57:39.502000"), "127.0.0.1:8234 ", 20.0), - types.MakeDatums(datetime("2023-09-19 19:58:39.502000"), "127.0.0.1:8234 ", 20.0), - types.MakeDatums(datetime("2023-09-19 19:59:39.502000"), "127.0.0.1:8234 ", 20.0), - types.MakeDatums(datetime("2023-09-19 20:00:39.502000"), "127.0.0.1:8234 ", 20.0), - } tk.MustQueryWithContext(ctx, "CALIBRATE RESOURCE START_TIME '2023-09-19 19:50:39' DURATION '10m'").Check(testkit.Rows("729439")) delete(mockData, "process_cpu_usage") diff --git a/pkg/executor/internal/calibrateresource/main_test.go b/pkg/executor/internal/calibrateresource/main_test.go index a450e9ccd4dcb..daa4c741bb051 100644 --- a/pkg/executor/internal/calibrateresource/main_test.go +++ b/pkg/executor/internal/calibrateresource/main_test.go @@ -38,6 +38,7 @@ func TestMain(m *testing.M) { opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("gopkg.in/natefinch/lumberjack%2ev2.(*Logger).millRun"), diff --git a/pkg/executor/internal/exec/executor.go b/pkg/executor/internal/exec/executor.go index 2f9c7f37dfb72..05049dfc5f558 100644 --- a/pkg/executor/internal/exec/executor.go +++ b/pkg/executor/internal/exec/executor.go @@ -45,7 +45,15 @@ import ( // return a batch of rows, other than a single row in Volcano. // NOTE: Executors must call "chk.Reset()" before appending their results to it. type Executor interface { - Base() *BaseExecutor + NewChunk() *chunk.Chunk + NewChunkWithCapacity(fields []*types.FieldType, capacity int, maxCachesize int) *chunk.Chunk + + RuntimeStats() *execdetails.BasicRuntimeStats + + HandleSQLKillerSignal() error + RegisterSQLAndPlanInExecForTopSQL() + + AllChildren() []Executor Open(context.Context) error Next(ctx context.Context, req *chunk.Chunk) error Close() error @@ -79,7 +87,7 @@ func NewBaseExecutor(ctx sessionctx.Context, schema *expression.Schema, id int, schema: schema, initCap: ctx.GetSessionVars().InitChunkSize, maxChunkSize: ctx.GetSessionVars().MaxChunkSize, - AllocPool: ctx.GetSessionVars().ChunkPool.Alloc, + AllocPool: ctx.GetSessionVars().GetChunkAllocator(), } if ctx.GetSessionVars().StmtCtx.RuntimeStatsColl != nil { if e.id > 0 { @@ -156,11 +164,6 @@ func (e *BaseExecutor) SetMaxChunkSize(size int) { e.maxChunkSize = size } -// Base returns the BaseExecutor of an executor, don't override this method! -func (e *BaseExecutor) Base() *BaseExecutor { - return e -} - // Open initializes children recursively and "childrenResults" according to children's schemas. func (e *BaseExecutor) Open(ctx context.Context) error { for _, child := range e.children { @@ -176,7 +179,7 @@ func (e *BaseExecutor) Open(ctx context.Context) error { func (e *BaseExecutor) Close() error { var firstErr error for _, src := range e.children { - if err := src.Close(); err != nil && firstErr == nil { + if err := Close(src); err != nil && firstErr == nil { firstErr = err } } @@ -239,23 +242,43 @@ func (e *BaseExecutor) ReleaseSysSession(ctx context.Context, sctx sessionctx.Co sysSessionPool.Put(sctx.(pools.Resource)) } +// NewChunk creates a new chunk according to the executor configuration +func (e *BaseExecutor) NewChunk() *chunk.Chunk { + return e.NewChunkWithCapacity(e.RetFieldTypes(), e.InitCap(), e.MaxChunkSize()) +} + +// NewChunkWithCapacity allows the caller to allocate the chunk with any types, capacity and max size in the pool +func (e *BaseExecutor) NewChunkWithCapacity(fields []*types.FieldType, capacity int, maxCachesize int) *chunk.Chunk { + return e.AllocPool.Alloc(fields, capacity, maxCachesize) +} + +// HandleSQLKillerSignal handles the signal sent by SQLKiller +func (e *BaseExecutor) HandleSQLKillerSignal() error { + return e.ctx.GetSessionVars().SQLKiller.HandleSignal() +} + +// RegisterSQLAndPlanInExecForTopSQL registers the current SQL and Plan on top sql +// TODO: consider whether it's appropriate to have this on executor +func (e *BaseExecutor) RegisterSQLAndPlanInExecForTopSQL() { + sessVars := e.ctx.GetSessionVars() + if topsqlstate.TopSQLEnabled() && sessVars.StmtCtx.IsSQLAndPlanRegistered.CompareAndSwap(false, true) { + RegisterSQLAndPlanInExecForTopSQL(sessVars) + } +} + // TryNewCacheChunk tries to get a cached chunk func TryNewCacheChunk(e Executor) *chunk.Chunk { - base := e.Base() - s := base.Ctx().GetSessionVars() - return s.GetNewChunkWithCapacity(base.RetFieldTypes(), base.InitCap(), base.MaxChunkSize(), base.AllocPool) + return e.NewChunk() } // RetTypes returns all output column types. func RetTypes(e Executor) []*types.FieldType { - base := e.Base() - return base.RetFieldTypes() + return e.RetFieldTypes() } // NewFirstChunk creates a new chunk to buffer current executor's result. func NewFirstChunk(e Executor) *chunk.Chunk { - base := e.Base() - return chunk.New(base.RetFieldTypes(), base.InitCap(), base.MaxChunkSize()) + return chunk.New(e.RetFieldTypes(), e.InitCap(), e.MaxChunkSize()) } // Open is a wrapper function on e.Open(), it handles some common codes. @@ -269,30 +292,42 @@ func Open(ctx context.Context, e Executor) (err error) { } // Next is a wrapper function on e.Next(), it handles some common codes. -func Next(ctx context.Context, e Executor, req *chunk.Chunk) error { - base := e.Base() - if base.RuntimeStats() != nil { +func Next(ctx context.Context, e Executor, req *chunk.Chunk) (err error) { + defer func() { + if r := recover(); r != nil { + err = util.GetRecoverError(r) + } + }() + if e.RuntimeStats() != nil { start := time.Now() - defer func() { base.RuntimeStats().Record(time.Since(start), req.NumRows()) }() + defer func() { e.RuntimeStats().Record(time.Since(start), req.NumRows()) }() } - sessVars := base.Ctx().GetSessionVars() - if err := sessVars.SQLKiller.HandleSignal(); err != nil { + + if err := e.HandleSQLKillerSignal(); err != nil { return err } r, ctx := tracing.StartRegionEx(ctx, fmt.Sprintf("%T.Next", e)) defer r.End() - if topsqlstate.TopSQLEnabled() && sessVars.StmtCtx.IsSQLAndPlanRegistered.CompareAndSwap(false, true) { - RegisterSQLAndPlanInExecForTopSQL(sessVars) - } - err := e.Next(ctx, req) + e.RegisterSQLAndPlanInExecForTopSQL() + err = e.Next(ctx, req) if err != nil { return err } // recheck whether the session/query is killed during the Next() - return sessVars.SQLKiller.HandleSignal() + return e.HandleSQLKillerSignal() +} + +// Close is a wrapper function on e.Close(), it handles some common codes. +func Close(e Executor) (err error) { + defer func() { + if r := recover(); r != nil { + err = util.GetRecoverError(r) + } + }() + return e.Close() } // RegisterSQLAndPlanInExecForTopSQL register the sql and plan information if it doesn't register before execution. diff --git a/pkg/executor/internal/mpp/BUILD.bazel b/pkg/executor/internal/mpp/BUILD.bazel index 7d7f48332963f..c1ba291956ead 100644 --- a/pkg/executor/internal/mpp/BUILD.bazel +++ b/pkg/executor/internal/mpp/BUILD.bazel @@ -2,7 +2,11 @@ load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") go_library( name = "mpp", - srcs = ["local_mpp_coordinator.go"], + srcs = [ + "executor_with_retry.go", + "local_mpp_coordinator.go", + "recovery_handler.go", + ], importpath = "github.com/pingcap/tidb/pkg/executor/internal/mpp", visibility = ["//pkg/executor:__subpackages__"], deps = [ @@ -11,6 +15,7 @@ go_library( "//pkg/executor/internal/builder", "//pkg/executor/internal/util", "//pkg/executor/metrics", + "//pkg/executor/mppcoordmanager", "//pkg/infoschema", "//pkg/kv", "//pkg/planner/core", @@ -23,11 +28,11 @@ go_library( "//pkg/util/execdetails", "//pkg/util/logutil", "//pkg/util/memory", + "//pkg/util/tiflashcompute", "@com_github_pingcap_errors//:errors", "@com_github_pingcap_failpoint//:failpoint", "@com_github_pingcap_kvproto//pkg/mpp", "@com_github_pingcap_tipb//go-tipb", - "@com_github_tikv_client_go_v2//tikv", "@org_uber_go_zap//:zap", ], ) diff --git a/pkg/executor/internal/mpp/executor_with_retry.go b/pkg/executor/internal/mpp/executor_with_retry.go new file mode 100644 index 0000000000000..c590d8a65e956 --- /dev/null +++ b/pkg/executor/internal/mpp/executor_with_retry.go @@ -0,0 +1,252 @@ +// Copyright 2023 PingCAP, 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. + +package mpp + +import ( + "context" + "fmt" + "strings" + + "github.com/pingcap/errors" + "github.com/pingcap/failpoint" + "github.com/pingcap/tidb/pkg/config" + "github.com/pingcap/tidb/pkg/executor/mppcoordmanager" + "github.com/pingcap/tidb/pkg/infoschema" + "github.com/pingcap/tidb/pkg/kv" + plannercore "github.com/pingcap/tidb/pkg/planner/core" + "github.com/pingcap/tidb/pkg/sessionctx" + "github.com/pingcap/tidb/pkg/util/logutil" + "github.com/pingcap/tidb/pkg/util/memory" + "go.uber.org/zap" +) + +// ExecutorWithRetry receive mppResponse from localMppCoordinator, +// and tries to recovery mpp err if necessary. +// The abstraction layer of reading mpp resp: +// 1. MPPGather: As part of the TiDB Volcano model executor, it is equivalent to a TableReader. +// 2. selectResult: Decode select result(mppResponse) into chunk. Also record runtime info. +// 3. ExecutorWithRetry: Recovery mpp err if possible and retry MPP Task. +// 4. localMppCoordinator: Generate MPP fragment and dispatch MPPTask. +// And receive MPP status for better err msg and correct stats for Limit. +// 5. mppIterator: Send or receive MPP RPC. +type ExecutorWithRetry struct { + coord kv.MppCoordinator + sctx sessionctx.Context + is infoschema.InfoSchema + plan plannercore.PhysicalPlan + ctx context.Context + memTracker *memory.Tracker + // mppErrRecovery is designed for the recovery of MPP errors. + // Basic idea: + // 1. It attempts to hold the results of MPP. During the holding process, if an error occurs, it starts error recovery. + // If the recovery is successful, it discards held results and reconstructs the respIter, then re-executes the MPP task. + // If the recovery fails, an error is reported directly. + // 2. If the held MPP results exceed the capacity, will starts returning results to caller. + // Once the results start being returned, error recovery cannot be performed anymore. + mppErrRecovery *RecoveryHandler + planIDs []int + // Expose to let MPPGather access. + KVRanges []kv.KeyRange + queryID kv.MPPQueryID + startTS uint64 + gatherID uint64 + nodeCnt int +} + +var _ kv.Response = &ExecutorWithRetry{} + +// NewExecutorWithRetry create ExecutorWithRetry. +func NewExecutorWithRetry(ctx context.Context, sctx sessionctx.Context, parentTracker *memory.Tracker, planIDs []int, + plan plannercore.PhysicalPlan, startTS uint64, queryID kv.MPPQueryID, + is infoschema.InfoSchema) (*ExecutorWithRetry, error) { + // TODO: After add row info in tipb.DataPacket, we can use row count as capacity. + // For now, use the number of tipb.DataPacket as capacity. + const holdCap = 2 + + disaggTiFlashWithAutoScaler := config.GetGlobalConfig().DisaggregatedTiFlash && config.GetGlobalConfig().UseAutoScaler + _, allowTiFlashFallback := sctx.GetSessionVars().AllowFallbackToTiKV[kv.TiFlash] + + // 1. For now, mpp err recovery only support MemLimit, which is only useful when AutoScaler is used. + // 2. When enable fallback to tikv, the returned mpp err will be ErrTiFlashServerTimeout, + // which we cannot handle for now. Also there is no need to recovery because tikv will retry the query. + // 3. For cached table, will not dispatch tasks to TiFlash, so no need to recovery. + enableMPPRecovery := disaggTiFlashWithAutoScaler && !allowTiFlashFallback + + failpoint.Inject("mpp_recovery_test_mock_enable", func() { + if !allowTiFlashFallback { + enableMPPRecovery = true + } + }) + + recoveryHandler := NewRecoveryHandler(disaggTiFlashWithAutoScaler, + uint64(holdCap), enableMPPRecovery, parentTracker) + memTracker := memory.NewTracker(parentTracker.Label(), 0) + memTracker.AttachTo(parentTracker) + retryer := &ExecutorWithRetry{ + ctx: ctx, + sctx: sctx, + memTracker: memTracker, + planIDs: planIDs, + is: is, + plan: plan, + startTS: startTS, + queryID: queryID, + mppErrRecovery: recoveryHandler, + } + + var err error + retryer.KVRanges, err = retryer.setupMPPCoordinator(ctx, false) + return retryer, err +} + +// Next implements kv.Response interface. +func (r *ExecutorWithRetry) Next(ctx context.Context) (resp kv.ResultSubset, err error) { + if err = r.nextWithRecovery(ctx); err != nil { + return nil, err + } + + if r.mppErrRecovery.NumHoldResp() != 0 { + if resp, err = r.mppErrRecovery.PopFrontResp(); err != nil { + return nil, err + } + } else if resp, err = r.coord.Next(ctx); err != nil { + return nil, err + } + return resp, nil +} + +// Close implements kv.Response interface. +func (r *ExecutorWithRetry) Close() error { + r.mppErrRecovery.ResetHolder() + r.memTracker.Detach() + mppcoordmanager.InstanceMPPCoordinatorManager.Unregister(r.getCoordUniqueID()) + return r.coord.Close() +} + +func (r *ExecutorWithRetry) setupMPPCoordinator(ctx context.Context, recoverying bool) ([]kv.KeyRange, error) { + if recoverying { + // Sanity check. + if r.coord == nil { + return nil, errors.New("mpp coordinator should not be nil when recoverying") + } + // Only report runtime stats when there is no error. + r.coord.(*localMppCoordinator).closeWithoutReport() + mppcoordmanager.InstanceMPPCoordinatorManager.Unregister(r.getCoordUniqueID()) + } + + // Make sure gatherID is updated before build coord. + r.gatherID = allocMPPGatherID(r.sctx) + + r.coord = r.buildCoordinator() + if err := mppcoordmanager.InstanceMPPCoordinatorManager.Register(r.getCoordUniqueID(), r.coord); err != nil { + return nil, err + } + + _, kvRanges, err := r.coord.Execute(ctx) + if err != nil { + return nil, err + } + + if r.nodeCnt = r.coord.GetNodeCnt(); r.nodeCnt <= 0 { + return nil, errors.Errorf("tiflash node count should be greater than zero: %v", r.nodeCnt) + } + return kvRanges, err +} + +func (r *ExecutorWithRetry) nextWithRecovery(ctx context.Context) error { + if !r.mppErrRecovery.Enabled() { + return nil + } + + for r.mppErrRecovery.CanHoldResult() { + resp, mppErr := r.coord.Next(ctx) + + // Mock recovery n times. + failpoint.Inject("mpp_recovery_test_max_err_times", func(forceErrCnt failpoint.Value) { + forceErrCntInt := forceErrCnt.(int) + if r.mppErrRecovery.RecoveryCnt() < uint32(forceErrCntInt) { + mppErr = errors.New("mock mpp error") + } + }) + + if mppErr != nil { + recoveryErr := r.mppErrRecovery.Recovery(&RecoveryInfo{ + MPPErr: mppErr, + NodeCnt: r.nodeCnt, + }) + + // Mock recovery succeed, ignore no recovery handler err. + failpoint.Inject("mpp_recovery_test_ignore_recovery_err", func() { + if recoveryErr == nil { + panic("mocked mpp err should got recovery err") + } + if strings.Contains(mppErr.Error(), "mock mpp error") && strings.Contains(recoveryErr.Error(), "no handler to recovery") { + recoveryErr = nil + } + }) + + if recoveryErr != nil { + logutil.BgLogger().Error("recovery mpp error failed", zap.Any("mppErr", mppErr), + zap.Any("recoveryErr", recoveryErr)) + return mppErr + } + + logutil.BgLogger().Info("recovery mpp error succeed, begin next retry", + zap.Any("mppErr", mppErr), zap.Any("recoveryCnt", r.mppErrRecovery.RecoveryCnt())) + + if _, err := r.setupMPPCoordinator(r.ctx, true); err != nil { + logutil.BgLogger().Error("setup resp iter when recovery mpp err failed", zap.Any("err", err)) + return mppErr + } + r.mppErrRecovery.ResetHolder() + + continue + } + + if resp == nil { + break + } + + r.mppErrRecovery.HoldResult(resp.(*mppResponse)) + } + + failpoint.Inject("mpp_recovery_test_hold_size", func(num failpoint.Value) { + // Note: this failpoint only execute once. + curRows := r.mppErrRecovery.NumHoldResp() + numInt := num.(int) + if curRows != numInt { + panic(fmt.Sprintf("unexpected holding rows, cur: %d", curRows)) + } + }) + return nil +} + +func allocMPPGatherID(ctx sessionctx.Context) uint64 { + mppQueryInfo := &ctx.GetSessionVars().StmtCtx.MPPQueryInfo + return mppQueryInfo.AllocatedMPPGatherID.Add(1) +} + +func (r *ExecutorWithRetry) buildCoordinator() kv.MppCoordinator { + _, serverAddr := mppcoordmanager.InstanceMPPCoordinatorManager.GetServerAddr() + return NewLocalMPPCoordinator(r.sctx, r.is, r.plan, r.planIDs, r.startTS, r.queryID, + r.gatherID, serverAddr, r.memTracker) +} + +func (r *ExecutorWithRetry) getCoordUniqueID() mppcoordmanager.CoordinatorUniqueID { + return mppcoordmanager.CoordinatorUniqueID{ + MPPQueryID: r.queryID, + GatherID: r.gatherID, + } +} diff --git a/pkg/executor/internal/mpp/local_mpp_coordinator.go b/pkg/executor/internal/mpp/local_mpp_coordinator.go index f18f48658cbad..354a2d1b655ec 100644 --- a/pkg/executor/internal/mpp/local_mpp_coordinator.go +++ b/pkg/executor/internal/mpp/local_mpp_coordinator.go @@ -44,7 +44,6 @@ import ( "github.com/pingcap/tidb/pkg/util/logutil" "github.com/pingcap/tidb/pkg/util/memory" "github.com/pingcap/tipb/go-tipb" - "github.com/tikv/client-go/v2/tikv" "go.uber.org/zap" ) @@ -145,6 +144,8 @@ type localMppCoordinator struct { enableCollectExecutionInfo bool reportExecutionInfo bool // if each mpp task needs to report execution info directly to coordinator through ReportMPPTaskStatus + // Record node cnt that involved in the mpp computation. + nodeCnt int } // NewLocalMPPCoordinator creates a new localMppCoordinator instance @@ -209,7 +210,7 @@ func (c *localMppCoordinator) appendMPPDispatchReq(pf *plannercore.Fragment) err return errors.Trace(err) } - rgName := c.sessionCtx.GetSessionVars().ResourceGroupName + rgName := c.sessionCtx.GetSessionVars().StmtCtx.ResourceGroupName if !variable.EnableResourceControl.Load() { rgName = "" } @@ -522,13 +523,9 @@ func (c *localMppCoordinator) receiveResults(req *kv.MPPDispatchRequest, taskMet return } - if err1 := bo.Backoff(tikv.BoTiKVRPC(), errors.Errorf("recv stream response error: %v", err)); err1 != nil { - if errors.Cause(err) == context.Canceled { - logutil.BgLogger().Info("stream recv timeout", zap.Error(err), zap.Uint64("timestamp", taskMeta.StartTs), zap.Int64("task", taskMeta.TaskId), zap.Int64("mpp-version", taskMeta.MppVersion)) - } else { - logutil.BgLogger().Info("stream unknown error", zap.Error(err), zap.Uint64("timestamp", taskMeta.StartTs), zap.Int64("task", taskMeta.TaskId), zap.Int64("mpp-version", taskMeta.MppVersion)) - } - } + logutil.BgLogger().Info("mpp stream recv got error", zap.Error(err), zap.Uint64("timestamp", taskMeta.StartTs), + zap.Int64("task", taskMeta.TaskId), zap.Int64("mpp-version", taskMeta.MppVersion)) + // if NeedTriggerFallback is true, we return timeout to trigger tikv's fallback if c.needTriggerFallback { c.sendError(derr.ErrTiFlashServerTimeout) @@ -616,13 +613,17 @@ func (c *localMppCoordinator) IsClosed() bool { // Close implements MppCoordinator interface // TODO: Test the case that user cancels the query. func (c *localMppCoordinator) Close() error { + c.closeWithoutReport() + c.handleAllReports() + return nil +} + +func (c *localMppCoordinator) closeWithoutReport() { if atomic.CompareAndSwapUint32(&c.closed, 0, 1) { close(c.finishCh) } c.cancelFunc() <-c.wgDoneChan - c.handleAllReports() - return nil } func (c *localMppCoordinator) handleMPPStreamResponse(bo *backoff.Backoffer, response *mpp.MPPDataPacket, req *kv.MPPDispatchRequest) (err error) { @@ -671,10 +672,17 @@ func (c *localMppCoordinator) nextImpl(ctx context.Context) (resp *mppResponse, case resp, ok = <-c.respChan: return case <-ticker.C: - if c.vars != nil && c.vars.Killed != nil && atomic.LoadUint32(c.vars.Killed) == 1 { - err = derr.ErrQueryInterrupted - exit = true - return + if c.vars != nil && c.vars.Killed != nil { + killed := atomic.LoadUint32(c.vars.Killed) + if killed != 0 { + logutil.Logger(ctx).Info( + "a killed signal is received", + zap.Uint32("signal", killed), + ) + err = derr.ErrQueryInterrupted + exit = true + return + } } case <-c.finishCh: exit = true @@ -715,10 +723,14 @@ func (c *localMppCoordinator) Execute(ctx context.Context) (kv.Response, []kv.Ke // TODO: Move the construct tasks logic to planner, so we can see the explain results. sender := c.originalPlan.(*plannercore.PhysicalExchangeSender) sctx := c.sessionCtx - frags, kvRanges, err := plannercore.GenerateRootMPPTasks(sctx, c.startTS, c.gatherID, c.mppQueryID, sender, c.is) + frags, kvRanges, nodeInfo, err := plannercore.GenerateRootMPPTasks(sctx, c.startTS, c.gatherID, c.mppQueryID, sender, c.is) if err != nil { return nil, nil, errors.Trace(err) } + if nodeInfo == nil { + return nil, nil, errors.New("node info should not be nil") + } + c.nodeCnt = len(nodeInfo) for _, frag := range frags { err = c.appendMPPDispatchReq(frag) @@ -744,3 +756,8 @@ func (c *localMppCoordinator) Execute(ctx context.Context) (kv.Response, []kv.Ke return c, kvRanges, nil } + +// GetNodeCnt returns the node count that involved in the mpp computation. +func (c *localMppCoordinator) GetNodeCnt() int { + return c.nodeCnt +} diff --git a/pkg/executor/internal/mpp/recovery_handler.go b/pkg/executor/internal/mpp/recovery_handler.go new file mode 100644 index 0000000000000..b4ac8cc7540f1 --- /dev/null +++ b/pkg/executor/internal/mpp/recovery_handler.go @@ -0,0 +1,191 @@ +// Copyright 2023 PingCAP, 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. + +package mpp + +import ( + "strings" + + "github.com/pingcap/errors" + "github.com/pingcap/tidb/pkg/util/memory" + "github.com/pingcap/tidb/pkg/util/tiflashcompute" +) + +// RecoveryHandler tries to recovery mpp error. +type RecoveryHandler struct { + holder *mppResultHolder + handlers []handlerImpl + maxRecoveryCnt uint32 + curRecoveryCnt uint32 + enable bool +} + +// RecoveryInfo contains info that can help recovery error. +type RecoveryInfo struct { + MPPErr error + + // Nodes that involved into MPP computation. + NodeCnt int +} + +const ( + memLimitErrPattern = "Memory limit" +) + +// NewRecoveryHandler returns new instance of RecoveryHandler. +func NewRecoveryHandler(useAutoScaler bool, holderCap uint64, enable bool, parent *memory.Tracker) *RecoveryHandler { + return &RecoveryHandler{ + enable: enable, + handlers: []handlerImpl{newMemLimitHandlerImpl(useAutoScaler)}, + holder: newMPPResultHolder(holderCap, parent), + // Default recovery 3 time. + maxRecoveryCnt: 3, + } +} + +// Enabled return true when mpp err recovery enabled. +func (m *RecoveryHandler) Enabled() bool { + return m.enable +} + +// CanHoldResult tells whether we can insert intermediate results. +func (m *RecoveryHandler) CanHoldResult() bool { + return m.holder.capacity > 0 && !m.holder.cannotHold +} + +// HoldResult tries to hold mpp result. You should call Enabled() and CanHoldResult() to check first. +func (m *RecoveryHandler) HoldResult(resp *mppResponse) { + m.holder.insert(resp) +} + +// NumHoldResp returns the number of resp holded. +func (m *RecoveryHandler) NumHoldResp() int { + return len(m.holder.resps) +} + +// PopFrontResp pop one resp. +func (m *RecoveryHandler) PopFrontResp() (*mppResponse, error) { + if !m.enable || len(m.holder.resps) == 0 { + return nil, errors.Errorf("pop resp failed. enable: %v, size: %v", m.enable, len(m.holder.resps)) + } + resp := m.holder.resps[0] + m.holder.resps = m.holder.resps[1:] + m.holder.memTracker.Consume(-resp.MemSize()) + m.holder.cannotHold = true + return resp, nil +} + +// ResetHolder reset the dynamic data, like resps and recovery cnt. +// Will not touch other metadata, like enable. +func (m *RecoveryHandler) ResetHolder() { + m.holder.reset() +} + +// RecoveryCnt returns the recovery count. +func (m *RecoveryHandler) RecoveryCnt() uint32 { + return m.curRecoveryCnt +} + +// Recovery tries to recovery error. Reasons that cannot recovery: +// 1. Already return result to client because holder is full. +// 2. Recovery method of this kind of error not implemented or error is not recoveryable. +// 3. Retry time exceeds maxRecoveryCnt. +func (m *RecoveryHandler) Recovery(info *RecoveryInfo) error { + if !m.enable { + return errors.New("mpp err recovery is not enabled") + } + + if info == nil || info.MPPErr == nil { + return errors.New("RecoveryInfo is nil or mppErr is nil") + } + + if m.curRecoveryCnt >= m.maxRecoveryCnt { + return errors.Errorf("exceeds max recovery cnt: cur: %v, max: %v", m.curRecoveryCnt, m.maxRecoveryCnt) + } + + m.curRecoveryCnt++ + + for _, h := range m.handlers { + if h.chooseHandlerImpl(info.MPPErr) { + return h.doRecovery(info) + } + } + return errors.New("no handler to recovery this type of mpp err") +} + +type handlerImpl interface { + chooseHandlerImpl(mppErr error) bool + doRecovery(info *RecoveryInfo) error +} + +var _ handlerImpl = &memLimitHandlerImpl{} + +type memLimitHandlerImpl struct { + useAutoScaler bool +} + +func newMemLimitHandlerImpl(useAutoScaler bool) *memLimitHandlerImpl { + return &memLimitHandlerImpl{ + useAutoScaler: useAutoScaler, + } +} + +func (h *memLimitHandlerImpl) chooseHandlerImpl(mppErr error) bool { + if strings.Contains(mppErr.Error(), memLimitErrPattern) && h.useAutoScaler { + return true + } + return false +} + +func (*memLimitHandlerImpl) doRecovery(info *RecoveryInfo) error { + // Ignore fetched topo, because AutoScaler will keep the topo for a while. + // And the new topo will be fetched when dispatch mpp task again. + if _, err := tiflashcompute.GetGlobalTopoFetcher().RecoveryAndGetTopo(tiflashcompute.RecoveryTypeMemLimit, info.NodeCnt); err != nil { + return err + } + return nil +} + +type mppResultHolder struct { + memTracker *memory.Tracker + resps []*mppResponse + capacity uint64 + cannotHold bool +} + +func newMPPResultHolder(holderCap uint64, parent *memory.Tracker) *mppResultHolder { + tracker := memory.NewTracker(parent.Label(), 0) + tracker.AttachTo(parent) + return &mppResultHolder{ + capacity: holderCap, + resps: make([]*mppResponse, 0, holderCap), + memTracker: tracker, + } +} + +func (h *mppResultHolder) insert(resp *mppResponse) { + h.resps = append(h.resps, resp) + + // TODO: Better use row number as threshold. Need to add row number info in tipb.MPPDataPacket. + if len(h.resps) >= int(h.capacity) { + h.cannotHold = true + } + h.memTracker.Consume(resp.MemSize()) +} + +func (h *mppResultHolder) reset() { + h.cannotHold = false + h.resps = h.resps[:0] + h.memTracker.Detach() +} diff --git a/pkg/executor/internal/pdhelper/main_test.go b/pkg/executor/internal/pdhelper/main_test.go index 909d20e2a3367..4725130c65edd 100644 --- a/pkg/executor/internal/pdhelper/main_test.go +++ b/pkg/executor/internal/pdhelper/main_test.go @@ -38,6 +38,7 @@ func TestMain(m *testing.M) { opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("gopkg.in/natefinch/lumberjack%2ev2.(*Logger).millRun"), diff --git a/pkg/executor/internal/querywatch/main_test.go b/pkg/executor/internal/querywatch/main_test.go index 326c42b520fa8..da8b63f17628e 100644 --- a/pkg/executor/internal/querywatch/main_test.go +++ b/pkg/executor/internal/querywatch/main_test.go @@ -38,6 +38,7 @@ func TestMain(m *testing.M) { opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("gopkg.in/natefinch/lumberjack%2ev2.(*Logger).millRun"), diff --git a/pkg/executor/internal/testutil/testutil.go b/pkg/executor/internal/testutil/testutil.go index 57aa75acb034a..82f6b929d54d1 100644 --- a/pkg/executor/internal/testutil/testutil.go +++ b/pkg/executor/internal/testutil/testutil.go @@ -21,6 +21,7 @@ import ( "fmt" "math/big" "sort" + "sync/atomic" "github.com/pingcap/tidb/pkg/executor/internal/exec" "github.com/pingcap/tidb/pkg/expression" @@ -30,6 +31,7 @@ import ( "github.com/pingcap/tidb/pkg/sessionctx" "github.com/pingcap/tidb/pkg/types" "github.com/pingcap/tidb/pkg/util/chunk" + "github.com/pingcap/tidb/pkg/util/memory" "github.com/pingcap/tidb/pkg/util/stringutil" ) @@ -45,9 +47,9 @@ type MockDataSourceParameters struct { // MockDataSource mocks data source type MockDataSource struct { - P MockDataSourceParameters GenData []*chunk.Chunk Chunks []*chunk.Chunk + P MockDataSourceParameters exec.BaseExecutor ChunkPtr int } @@ -159,6 +161,7 @@ func (mds *MockDataSource) Next(_ context.Context, req *chunk.Chunk) error { } dataChk := mds.Chunks[mds.ChunkPtr] dataChk.SwapColumns(req) + mds.ChunkPtr++ return nil } @@ -204,8 +207,8 @@ func (*MockDataPhysicalPlan) Stats() *property.StatsInfo { return nil } -// SelectBlockOffset returns 0 -func (*MockDataPhysicalPlan) SelectBlockOffset() int { +// QueryBlockOffset returns 0 +func (*MockDataPhysicalPlan) QueryBlockOffset() int { return 0 } @@ -230,7 +233,8 @@ func BuildMockDataSource(opt MockDataSourceParameters) *MockDataSource { ChunkPtr: 0, P: opt, GenData: nil, - Chunks: nil} + Chunks: nil, + } rTypes := exec.RetTypes(m) colData := make([][]interface{}, len(rTypes)) for i := 0; i < len(rTypes); i++ { @@ -273,3 +277,24 @@ func BuildMockDataSourceWithIndex(opt MockDataSourceParameters, index []int) *Mo } return BuildMockDataSource(opt) } + +// MockActionOnExceed is for test. +type MockActionOnExceed struct { + memory.BaseOOMAction + triggeredNum atomic.Int32 +} + +// Action add the triggered number. +func (m *MockActionOnExceed) Action(*memory.Tracker) { + m.triggeredNum.Add(1) +} + +// GetPriority get the priority of the Action. +func (*MockActionOnExceed) GetPriority() int64 { + return memory.DefLogPriority +} + +// GetTriggeredNum get the triggered number of the Action +func (m *MockActionOnExceed) GetTriggeredNum() int { + return int(m.triggeredNum.Load()) +} diff --git a/pkg/executor/internal/vecgroupchecker/main_test.go b/pkg/executor/internal/vecgroupchecker/main_test.go index 7dac8fefafa8d..0220b483f64d6 100644 --- a/pkg/executor/internal/vecgroupchecker/main_test.go +++ b/pkg/executor/internal/vecgroupchecker/main_test.go @@ -38,6 +38,7 @@ func TestMain(m *testing.M) { opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("gopkg.in/natefinch/lumberjack%2ev2.(*Logger).millRun"), diff --git a/pkg/executor/internal/vecgroupchecker/vec_group_checker.go b/pkg/executor/internal/vecgroupchecker/vec_group_checker.go index afa0c11a35b46..e50e35415e951 100644 --- a/pkg/executor/internal/vecgroupchecker/vec_group_checker.go +++ b/pkg/executor/internal/vecgroupchecker/vec_group_checker.go @@ -93,13 +93,13 @@ func (e *VecGroupChecker) SplitIntoGroups(chk *chunk.Chunk) (isFirstGroupSameAsP return false, err } } - e.firstGroupKey, err = codec.EncodeValue(e.ctx.GetSessionVars().StmtCtx.TimeZone(), e.firstGroupKey, e.firstRowDatums...) + e.firstGroupKey, err = codec.EncodeKey(e.ctx.GetSessionVars().StmtCtx.TimeZone(), e.firstGroupKey, e.firstRowDatums...) err = e.ctx.GetSessionVars().StmtCtx.HandleError(err) if err != nil { return false, err } - e.lastGroupKey, err = codec.EncodeValue(e.ctx.GetSessionVars().StmtCtx.TimeZone(), e.lastGroupKey, e.lastRowDatums...) + e.lastGroupKey, err = codec.EncodeKey(e.ctx.GetSessionVars().StmtCtx.TimeZone(), e.lastGroupKey, e.lastRowDatums...) err = e.ctx.GetSessionVars().StmtCtx.HandleError(err) if err != nil { return false, err diff --git a/pkg/executor/join.go b/pkg/executor/join.go index af8bbfbe66a98..5aab33e071d29 100644 --- a/pkg/executor/join.go +++ b/pkg/executor/join.go @@ -332,7 +332,7 @@ func (w *buildWorker) fetchBuildSideRows(ctx context.Context, chkCh chan<- *chun if w.hashJoinCtx.finished.Load() { return } - chk := sessVars.GetNewChunkWithCapacity(w.buildSideExec.Base().RetFieldTypes(), sessVars.MaxChunkSize, sessVars.MaxChunkSize, w.hashJoinCtx.allocPool) + chk := w.hashJoinCtx.allocPool.Alloc(w.buildSideExec.RetFieldTypes(), sessVars.MaxChunkSize, sessVars.MaxChunkSize) err = exec.Next(ctx, w.buildSideExec, chk) if err != nil { errCh <- errors.Trace(err) @@ -1141,7 +1141,7 @@ func (e *HashJoinExec) Next(ctx context.Context, req *chunk.Chunk) (err error) { } } for i := uint(0); i < e.concurrency; i++ { - e.probeWorkers[i].rowIters = chunk.NewIterator4Slice([]chunk.Row{}).(*chunk.Iterator4Slice) + e.probeWorkers[i].rowIters = chunk.NewIterator4Slice([]chunk.Row{}) } e.workerWg.RunWithRecover(func() { defer trace.StartRegion(ctx, "HashJoinHashTableBuilder").End() @@ -1319,7 +1319,7 @@ func (e *NestedLoopApplyExec) Close() error { runtimeStats.SetConcurrencyInfo(execdetails.NewConcurrencyInfo("Concurrency", 0)) defer e.Ctx().GetSessionVars().StmtCtx.RuntimeStatsColl.RegisterStats(e.ID(), runtimeStats) } - return e.outerExec.Close() + return exec.Close(e.outerExec) } // Open implements the Executor interface. @@ -1355,7 +1355,7 @@ func (e *NestedLoopApplyExec) Open(ctx context.Context) error { // aggExecutorTreeInputEmpty checks whether the executor tree returns empty if without aggregate operators. // Note that, the prerequisite is that this executor tree has been executed already and it returns one row. func aggExecutorTreeInputEmpty(e exec.Executor) bool { - children := e.Base().AllChildren() + children := e.AllChildren() if len(children) == 0 { return false } @@ -1426,7 +1426,7 @@ func (e *NestedLoopApplyExec) fetchSelectedOuterRow(ctx context.Context, chk *ch // fetchAllInners reads all data from the inner table and stores them in a List. func (e *NestedLoopApplyExec) fetchAllInners(ctx context.Context) error { err := exec.Open(ctx, e.innerExec) - defer terror.Call(e.innerExec.Close) + defer func() { terror.Log(exec.Close(e.innerExec)) }() if err != nil { return err } diff --git a/pkg/executor/load_data.go b/pkg/executor/load_data.go index c613324943a72..fb3482637dcf8 100644 --- a/pkg/executor/load_data.go +++ b/pkg/executor/load_data.go @@ -26,7 +26,7 @@ import ( "github.com/pingcap/failpoint" "github.com/pingcap/tidb/br/pkg/lightning/mydump" "github.com/pingcap/tidb/br/pkg/storage" - "github.com/pingcap/tidb/pkg/executor/asyncloaddata" + "github.com/pingcap/tidb/pkg/errctx" "github.com/pingcap/tidb/pkg/executor/importer" "github.com/pingcap/tidb/pkg/executor/internal/exec" "github.com/pingcap/tidb/pkg/expression" @@ -44,22 +44,69 @@ import ( "github.com/pingcap/tidb/pkg/util/chunk" "github.com/pingcap/tidb/pkg/util/dbterror/exeerrors" "github.com/pingcap/tidb/pkg/util/logutil" - "github.com/pingcap/tidb/pkg/util/sqlexec" "github.com/pingcap/tidb/pkg/util/sqlkiller" "go.uber.org/zap" "golang.org/x/sync/errgroup" ) +// LoadDataVarKey is a variable key for load data. +const LoadDataVarKey loadDataVarKeyType = 0 + +// LoadDataReaderBuilderKey stores the reader channel that reads from the connection. +const LoadDataReaderBuilderKey loadDataVarKeyType = 1 + var ( taskQueueSize = 16 // the maximum number of pending tasks to commit in queue ) +// LoadDataReaderBuilder is a function type that builds a reader from a file path. +type LoadDataReaderBuilder func(filepath string) ( + r io.ReadCloser, err error, +) + // LoadDataExec represents a load data executor. type LoadDataExec struct { exec.BaseExecutor FileLocRef ast.FileLocRefTp loadDataWorker *LoadDataWorker + + // fields for loading local file + infileReader io.ReadCloser +} + +// Open implements the Executor interface. +func (e *LoadDataExec) Open(_ context.Context) error { + if rb, ok := e.Ctx().Value(LoadDataReaderBuilderKey).(LoadDataReaderBuilder); ok { + var err error + e.infileReader, err = rb(e.loadDataWorker.GetInfilePath()) + if err != nil { + return err + } + } + return nil +} + +// Close implements the Executor interface. +func (e *LoadDataExec) Close() error { + return e.closeLocalReader(nil) +} + +func (e *LoadDataExec) closeLocalReader(originalErr error) error { + err := originalErr + if e.infileReader != nil { + if err2 := e.infileReader.Close(); err2 != nil { + logutil.BgLogger().Error( + "close local reader failed", zap.Error(err2), + zap.NamedError("original error", originalErr), + ) + if err == nil { + err = err2 + } + } + e.infileReader = nil + } + return err } // Next implements the Executor Next interface. @@ -68,14 +115,17 @@ func (e *LoadDataExec) Next(ctx context.Context, _ *chunk.Chunk) (err error) { case ast.FileLocServerOrRemote: return e.loadDataWorker.loadRemote(ctx) case ast.FileLocClient: - // let caller use handleFileTransInConn to read data in this connection + // This is for legacy test only + // TODO: adjust tests to remove LoadDataVarKey sctx := e.loadDataWorker.UserSctx - val := sctx.Value(LoadDataVarKey) - if val != nil { - sctx.SetValue(LoadDataVarKey, nil) - return errors.New("previous load data option wasn't closed normally") - } sctx.SetValue(LoadDataVarKey, e.loadDataWorker) + + err = e.loadDataWorker.LoadLocal(ctx, e.infileReader) + if err != nil { + logutil.Logger(ctx).Error("load local data failed", zap.Error(err)) + err = e.closeLocalReader(err) + return err + } } return nil } @@ -99,9 +149,10 @@ type LoadDataWorker struct { func setNonRestrictiveFlags(stmtCtx *stmtctx.StatementContext) { // TODO: DupKeyAsWarning represents too many "ignore error" paths, the // meaning of this flag is not clear. I can only reuse it here. - stmtCtx.DupKeyAsWarning = true - stmtCtx.BadNullAsWarning = true - + levels := stmtCtx.ErrLevels() + levels[errctx.ErrGroupDupKey] = errctx.LevelWarn + levels[errctx.ErrGroupBadNull] = errctx.LevelWarn + stmtCtx.SetErrLevels(levels) stmtCtx.SetTypeFlags(stmtCtx.TypeFlags().WithTruncateAsWarning(true)) } @@ -147,6 +198,10 @@ func (e *LoadDataWorker) loadRemote(ctx context.Context) error { // LoadLocal reads from client connection and do load data job. func (e *LoadDataWorker) LoadLocal(ctx context.Context, r io.ReadCloser) error { + if r == nil { + return errors.New("load local data, reader is nil") + } + compressTp := mydump.ParseCompressionOnFileExtension(e.GetInfilePath()) compressTp2, err := mydump.ToStorageCompressType(compressTp) if err != nil { @@ -174,11 +229,6 @@ func (e *LoadDataWorker) load(ctx context.Context, readerInfos []importer.LoadDa commitTaskCh := make(chan commitTask, taskQueueSize) // commitWork goroutines -> done -> UpdateJobProgress goroutine - // TODO: support explicit transaction and non-autocommit - if err = sessiontxn.NewTxn(groupCtx, e.UserSctx); err != nil { - return err - } - // processOneStream goroutines. group.Go(func() error { err2 := encoder.processStream(groupCtx, readerInfoCh, commitTaskCh) @@ -532,16 +582,6 @@ func (w *commitWorker) commitWork(ctx context.Context, inCh <-chan commitTask) ( zap.Stack("stack")) err = util.GetRecoverError(r) } - - if err != nil { - background := context.Background() - w.Ctx().StmtRollback(background, false) - w.Ctx().RollbackTxn(background) - } else { - if err = w.Ctx().CommitTxn(ctx); err != nil { - logutil.Logger(ctx).Error("commit error refresh", zap.Error(err)) - } - } }() var ( @@ -580,7 +620,6 @@ func (w *commitWorker) commitOneTask(ctx context.Context, task commitTask) error failpoint.Inject("commitOneTaskErr", func() { failpoint.Return(errors.New("mock commit one task error")) }) - w.Ctx().StmtCommit(ctx) return nil } @@ -736,34 +775,3 @@ type loadDataVarKeyType int func (loadDataVarKeyType) String() string { return "load_data_var" } - -// LoadDataVarKey is a variable key for load data. -const LoadDataVarKey loadDataVarKeyType = 0 - -var ( - _ exec.Executor = (*LoadDataActionExec)(nil) -) - -// LoadDataActionExec executes LoadDataActionStmt. -type LoadDataActionExec struct { - exec.BaseExecutor - - tp ast.LoadDataActionTp - jobID int64 -} - -// Next implements the Executor Next interface. -func (e *LoadDataActionExec) Next(ctx context.Context, _ *chunk.Chunk) error { - sqlExec := e.Ctx().(sqlexec.SQLExecutor) - user := e.Ctx().GetSessionVars().User.String() - job := asyncloaddata.NewJob(e.jobID, sqlExec, user) - - switch e.tp { - case ast.LoadDataCancel: - return job.CancelJob(ctx) - case ast.LoadDataDrop: - return job.DropJob(ctx) - default: - return errors.Errorf("not implemented LOAD DATA action %v", e.tp) - } -} diff --git a/pkg/executor/lockstats/lock_stats_executor.go b/pkg/executor/lockstats/lock_stats_executor.go index 2a59ee41fdb80..59b3108afc3f2 100644 --- a/pkg/executor/lockstats/lock_stats_executor.go +++ b/pkg/executor/lockstats/lock_stats_executor.go @@ -65,7 +65,7 @@ func (e *LockExec) Next(_ context.Context, _ *chunk.Chunk) error { return err } if msg != "" { - e.Ctx().GetSessionVars().StmtCtx.AppendWarning(errors.New(msg)) + e.Ctx().GetSessionVars().StmtCtx.AppendWarning(errors.NewNoStackError(msg)) } } else { tableWithPartitions, err := populateTableAndPartitionIDs(e.Tables, is) @@ -78,7 +78,7 @@ func (e *LockExec) Next(_ context.Context, _ *chunk.Chunk) error { return err } if msg != "" { - e.Ctx().GetSessionVars().StmtCtx.AppendWarning(errors.New(msg)) + e.Ctx().GetSessionVars().StmtCtx.AppendWarning(errors.NewNoStackError(msg)) } } diff --git a/pkg/executor/lockstats/unlock_stats_executor.go b/pkg/executor/lockstats/unlock_stats_executor.go index 499745ef65e75..2e339ef4327ff 100644 --- a/pkg/executor/lockstats/unlock_stats_executor.go +++ b/pkg/executor/lockstats/unlock_stats_executor.go @@ -60,7 +60,7 @@ func (e *UnlockExec) Next(context.Context, *chunk.Chunk) error { return err } if msg != "" { - e.Ctx().GetSessionVars().StmtCtx.AppendWarning(errors.New(msg)) + e.Ctx().GetSessionVars().StmtCtx.AppendWarning(errors.NewNoStackError(msg)) } } else { tableWithPartitions, err := populateTableAndPartitionIDs(e.Tables, is) @@ -72,7 +72,7 @@ func (e *UnlockExec) Next(context.Context, *chunk.Chunk) error { return err } if msg != "" { - e.Ctx().GetSessionVars().StmtCtx.AppendWarning(errors.New(msg)) + e.Ctx().GetSessionVars().StmtCtx.AppendWarning(errors.NewNoStackError(msg)) } } diff --git a/pkg/executor/main_test.go b/pkg/executor/main_test.go index 43223ccdc7234..8a2cf20bb83be 100644 --- a/pkg/executor/main_test.go +++ b/pkg/executor/main_test.go @@ -50,6 +50,7 @@ func TestMain(m *testing.M) { opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("gopkg.in/natefinch/lumberjack%2ev2.(*Logger).millRun"), diff --git a/pkg/executor/memtable_reader.go b/pkg/executor/memtable_reader.go index 2093a8c137be3..3406d8ab2766f 100644 --- a/pkg/executor/memtable_reader.go +++ b/pkg/executor/memtable_reader.go @@ -188,7 +188,7 @@ func fetchClusterConfig(sctx sessionctx.Context, nodeTypes, nodeAddrs set.String address := srv.Address statusAddr := srv.StatusAddr if len(statusAddr) == 0 { - sctx.GetSessionVars().StmtCtx.AppendWarning(errors.Errorf("%s node %s does not contain status address", typ, address)) + sctx.GetSessionVars().StmtCtx.AppendWarning(errors.NewNoStackErrorf("%s node %s does not contain status address", typ, address)) continue } wg.Add(1) @@ -456,7 +456,7 @@ func (e *clusterLogRetriever) startRetrieving( address := srv.Address statusAddr := srv.StatusAddr if len(statusAddr) == 0 { - sctx.GetSessionVars().StmtCtx.AppendWarning(errors.Errorf("%s node %s does not contain status address", typ, address)) + sctx.GetSessionVars().StmtCtx.AppendWarning(errors.NewNoStackErrorf("%s node %s does not contain status address", typ, address)) continue } ch := make(chan logStreamResult) diff --git a/pkg/executor/merge_join.go b/pkg/executor/merge_join.go index ef38c2486ee2e..2f129b1babeb0 100644 --- a/pkg/executor/merge_join.go +++ b/pkg/executor/merge_join.go @@ -90,7 +90,7 @@ func (t *mergeJoinTable) init(executor *MergeJoinExec) { t.groupRowsIter = chunk.NewIterator4Chunk(t.childChunk) if t.isInner { - t.rowContainer = chunk.NewRowContainer(child.Base().RetFieldTypes(), t.childChunk.Capacity()) + t.rowContainer = chunk.NewRowContainer(child.RetFieldTypes(), t.childChunk.Capacity()) t.rowContainer.GetMemTracker().AttachTo(executor.memTracker) t.rowContainer.GetMemTracker().SetLabel(memory.LabelForInnerTable) t.rowContainer.GetDiskTracker().AttachTo(executor.diskTracker) diff --git a/pkg/executor/mpp_gather.go b/pkg/executor/mpp_gather.go index a53c093611762..f4d838b86e0f4 100644 --- a/pkg/executor/mpp_gather.go +++ b/pkg/executor/mpp_gather.go @@ -22,7 +22,6 @@ import ( "github.com/pingcap/tidb/pkg/distsql" "github.com/pingcap/tidb/pkg/executor/internal/exec" "github.com/pingcap/tidb/pkg/executor/internal/mpp" - "github.com/pingcap/tidb/pkg/executor/mppcoordmanager" "github.com/pingcap/tidb/pkg/infoschema" "github.com/pingcap/tidb/pkg/kv" "github.com/pingcap/tidb/pkg/parser/model" @@ -34,6 +33,9 @@ import ( "github.com/pingcap/tidb/pkg/util/memory" ) +// For mpp err recovery, hold at most 4 * MaxChunkSize rows. +const mppErrRecoveryHoldChkCap = 4 + func useMPPExecution(ctx sessionctx.Context, tr *plannercore.PhysicalTableReader) bool { if !ctx.GetSessionVars().IsMPPAllowed() { return false @@ -54,15 +56,21 @@ func getMPPQueryTS(ctx sessionctx.Context) uint64 { return mppQueryInfo.QueryTS.Load() } +func collectPlanIDs(plan plannercore.PhysicalPlan, ids []int) []int { + ids = append(ids, plan.ID()) + for _, child := range plan.Children() { + ids = collectPlanIDs(child, ids) + } + return ids +} + // MPPGather dispatch MPP tasks and read data from root tasks. type MPPGather struct { - // following fields are construct needed exec.BaseExecutor is infoschema.InfoSchema originalPlan plannercore.PhysicalPlan startTS uint64 mppQueryID kv.MPPQueryID - gatherID uint64 // used for mpp_gather level retry, since each time should use different gatherIDs respIter distsql.SelectResult memTracker *memory.Tracker @@ -76,85 +84,53 @@ type MPPGather struct { table table.Table kvRanges []kv.KeyRange dummy bool -} - -func collectPlanIDS(plan plannercore.PhysicalPlan, ids []int) []int { - ids = append(ids, plan.ID()) - for _, child := range plan.Children() { - ids = collectPlanIDS(child, ids) - } - return ids -} -// allocMPPGatherID allocates mpp gather id for mpp gathers. It will reset the gather id when the query finished. -// To support mpp_gather level cancel/retry and mpp_gather under apply executors, need to generate incremental ids when Open function is invoked -func allocMPPGatherID(ctx sessionctx.Context) uint64 { - mppQueryInfo := &ctx.GetSessionVars().StmtCtx.MPPQueryInfo - return mppQueryInfo.AllocatedMPPGatherID.Add(1) + mppExec *mpp.ExecutorWithRetry } -// Open builds coordinator and invoke coordinator's Execute function to execute physical plan -// If any task fails, it would cancel the rest tasks. +// Open implements the Executor Open interface. func (e *MPPGather) Open(ctx context.Context) (err error) { if e.dummy { sender, ok := e.originalPlan.(*plannercore.PhysicalExchangeSender) if !ok { return errors.Errorf("unexpected plan type, expect: PhysicalExchangeSender, got: %s", e.originalPlan.TP()) } - _, e.kvRanges, err = plannercore.GenerateRootMPPTasks(e.Ctx(), e.startTS, e.gatherID, e.mppQueryID, sender, e.is) - return err + if _, e.kvRanges, _, err = plannercore.GenerateRootMPPTasks(e.Ctx(), e.startTS, 0, e.mppQueryID, sender, e.is); err != nil { + return nil + } } - planIDs := collectPlanIDS(e.originalPlan, nil) - e.gatherID = allocMPPGatherID(e.Ctx()) - coord := e.buildCoordinator(planIDs) - err = mppcoordmanager.InstanceMPPCoordinatorManager.Register(mppcoordmanager.CoordinatorUniqueID{MPPQueryID: e.mppQueryID, GatherID: e.gatherID}, coord) - if err != nil { + planIDs := collectPlanIDs(e.originalPlan, nil) + if e.mppExec, err = mpp.NewExecutorWithRetry(ctx, e.Ctx(), e.memTracker, planIDs, e.originalPlan, e.startTS, e.mppQueryID, e.is); err != nil { return err } - var resp kv.Response - resp, e.kvRanges, err = coord.Execute(ctx) - if err != nil { - return errors.Trace(err) - } - e.respIter = distsql.GenSelectResultFromResponse(e.Ctx(), e.RetFieldTypes(), planIDs, e.ID(), resp) + e.kvRanges = e.mppExec.KVRanges + e.respIter = distsql.GenSelectResultFromMPPResponse(e.Ctx(), e.RetFieldTypes(), planIDs, e.ID(), e.mppExec) return nil } -func (e *MPPGather) buildCoordinator(planIDs []int) kv.MppCoordinator { - _, serverAddr := mppcoordmanager.InstanceMPPCoordinatorManager.GetServerAddr() - coord := mpp.NewLocalMPPCoordinator(e.Ctx(), e.is, e.originalPlan, planIDs, e.startTS, e.mppQueryID, e.gatherID, serverAddr, e.memTracker) - return coord -} - // Next fills data into the chunk passed by its caller. func (e *MPPGather) Next(ctx context.Context, chk *chunk.Chunk) error { chk.Reset() if e.dummy { return nil } - err := e.respIter.Next(ctx, chk) - if err != nil { + if err := e.respIter.Next(ctx, chk); err != nil { return err } - err = table.FillVirtualColumnValue(e.virtualColumnRetFieldTypes, e.virtualColumnIndex, e.Schema().Columns, e.columns, e.Ctx(), chk) - if err != nil { - return err + if chk.NumRows() == 0 { + return nil } - return nil + + return table.FillVirtualColumnValue(e.virtualColumnRetFieldTypes, e.virtualColumnIndex, e.Schema().Columns, e.columns, e.Ctx(), chk) } // Close and release the used resources. func (e *MPPGather) Close() error { - var err error if e.dummy { return nil } if e.respIter != nil { - err = e.respIter.Close() - } - mppcoordmanager.InstanceMPPCoordinatorManager.Unregister(mppcoordmanager.CoordinatorUniqueID{MPPQueryID: e.mppQueryID, GatherID: e.gatherID}) - if err != nil { - return err + return e.respIter.Close() } return nil } diff --git a/pkg/executor/mppcoordmanager/mpp_coordinator_manager_test.go b/pkg/executor/mppcoordmanager/mpp_coordinator_manager_test.go index aa62196b633f3..724e8c0f047ca 100644 --- a/pkg/executor/mppcoordmanager/mpp_coordinator_manager_test.go +++ b/pkg/executor/mppcoordmanager/mpp_coordinator_manager_test.go @@ -52,6 +52,11 @@ func (*IdleCoordinator) IsClosed() bool { return true } +// GetNodeCnt implements MppCoordinator interface function. +func (*IdleCoordinator) GetNodeCnt() int { + return 0 +} + func TestDetectAndDelete(t *testing.T) { startTs := uint64(time.Now().UnixNano()) InstanceMPPCoordinatorManager.maxLifeTime = uint64(copr.TiFlashReadTimeoutUltraLong.Nanoseconds() + detectFrequency.Nanoseconds()) diff --git a/pkg/executor/parallel_apply.go b/pkg/executor/parallel_apply.go index a35ca4b3306fc..d697b4f4cf0f5 100644 --- a/pkg/executor/parallel_apply.go +++ b/pkg/executor/parallel_apply.go @@ -174,7 +174,7 @@ func (e *ParallelNestedLoopApplyExec) Close() error { } // Wait all workers to finish before Close() is called. // Otherwise we may got data race. - err := e.outerExec.Close() + err := exec.Close(e.outerExec) if e.RuntimeStats() != nil { runtimeStats := newJoinRuntimeStats() @@ -304,7 +304,7 @@ func (e *ParallelNestedLoopApplyExec) fetchAllInners(ctx context.Context, id int } err = exec.Open(ctx, e.innerExecs[id]) - defer terror.Call(e.innerExecs[id].Close) + defer func() { terror.Log(exec.Close(e.innerExecs[id])) }() if err != nil { return err } diff --git a/pkg/executor/partition_table_test.go b/pkg/executor/partition_table_test.go index 764c689f51364..2f69c1fc258a4 100644 --- a/pkg/executor/partition_table_test.go +++ b/pkg/executor/partition_table_test.go @@ -23,7 +23,6 @@ import ( "time" "github.com/pingcap/failpoint" - "github.com/pingcap/tidb/pkg/config" "github.com/pingcap/tidb/pkg/domain" "github.com/pingcap/tidb/pkg/infoschema" "github.com/pingcap/tidb/pkg/parser/model" @@ -1028,82 +1027,6 @@ func TestBatchGetforRangeandListPartitionTable(t *testing.T) { tk.MustQuery(queryRange).Sort().Check(tk.MustQuery(queryRegular).Sort().Rows()) } -func TestGlobalStatsAndSQLBinding(t *testing.T) { - store := testkit.CreateMockStore(t) - - tk := testkit.NewTestKit(t, store) - tk.MustExec("use test") - tk.MustExec("create database test_global_stats") - tk.MustExec("use test_global_stats") - tk.MustExec("set @@tidb_partition_prune_mode = 'dynamic'") - tk.MustExec("set tidb_cost_model_version=2") - - // hash and range and list partition - tk.MustExec("create table thash(a int, b int, key(a)) partition by hash(a) partitions 4") - tk.MustExec(`create table trange(a int, b int, key(a)) partition by range(a) ( - partition p0 values less than (200), - partition p1 values less than (400), - partition p2 values less than (600), - partition p3 values less than (800), - partition p4 values less than (1001))`) - tk.MustExec(`create table tlist (a int, b int, key(a)) partition by list (a) ( - partition p0 values in (0, 1, 2, 3, 4, 5, 6, 7, 8, 9), - partition p1 values in (10, 11, 12, 13, 14, 15, 16, 17, 18, 19), - partition p2 values in (20, 21, 22, 23, 24, 25, 26, 27, 28, 29), - partition p3 values in (30, 31, 32, 33, 34, 35, 36, 37, 38, 39), - partition p4 values in (40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50))`) - - // construct some special data distribution - vals := make([]string, 0, 1000) - listVals := make([]string, 0, 1000) - for i := 0; i < 1000; i++ { - if i < 10 { - // for hash and range partition, 1% of records are in [0, 100) - vals = append(vals, fmt.Sprintf("(%v, %v)", rand.Intn(100), rand.Intn(100))) - // for list partition, 1% of records are equal to 0 - listVals = append(listVals, "(0, 0)") - } else { - vals = append(vals, fmt.Sprintf("(%v, %v)", 100+rand.Intn(900), 100+rand.Intn(900))) - listVals = append(listVals, fmt.Sprintf("(%v, %v)", 1+rand.Intn(50), 1+rand.Intn(50))) - } - } - tk.MustExec("insert into thash values " + strings.Join(vals, ",")) - tk.MustExec("insert into trange values " + strings.Join(vals, ",")) - tk.MustExec("insert into tlist values " + strings.Join(listVals, ",")) - - // before analyzing, the planner will choose TableScan to access the 1% of records - tk.MustHavePlan("select * from thash where a<100", "TableFullScan") - tk.MustHavePlan("select * from trange where a<100", "TableFullScan") - tk.MustHavePlan("select * from tlist where a<1", "TableFullScan") - - tk.MustExec("analyze table thash") - tk.MustExec("analyze table trange") - tk.MustExec("analyze table tlist") - - tk.MustHavePlan("select * from thash where a<100", "TableFullScan") - tk.MustHavePlan("select * from trange where a<100", "TableFullScan") - tk.MustHavePlan("select * from tlist where a<1", "TableFullScan") - - // create SQL bindings - tk.MustExec("create session binding for select * from thash where a<100 using select * from thash ignore index(a) where a<100") - tk.MustExec("create session binding for select * from trange where a<100 using select * from trange ignore index(a) where a<100") - tk.MustExec("create session binding for select * from tlist where a<100 using select * from tlist ignore index(a) where a<100") - - // use TableScan again since the Index(a) is ignored - tk.MustHavePlan("select * from thash where a<100", "TableFullScan") - tk.MustHavePlan("select * from trange where a<100", "TableFullScan") - tk.MustHavePlan("select * from tlist where a<1", "TableFullScan") - - // drop SQL bindings - tk.MustExec("drop session binding for select * from thash where a<100") - tk.MustExec("drop session binding for select * from trange where a<100") - tk.MustExec("drop session binding for select * from tlist where a<100") - - tk.MustHavePlan("select * from thash where a<100", "TableFullScan") - tk.MustHavePlan("select * from trange where a<100", "TableFullScan") - tk.MustHavePlan("select * from tlist where a<1", "TableFullScan") -} - func TestPartitionTableWithDifferentJoin(t *testing.T) { failpoint.Enable("github.com/pingcap/tidb/pkg/planner/core/forceDynamicPrune", `return(true)`) defer failpoint.Disable("github.com/pingcap/tidb/pkg/planner/core/forceDynamicPrune") @@ -2160,80 +2083,14 @@ func TestIdexMerge(t *testing.T) { } } -func TestGlobalIndexScan(t *testing.T) { - store := testkit.CreateMockStore(t) - - tk := testkit.NewTestKit(t, store) - restoreConfig := config.RestoreFunc() - defer restoreConfig() - config.UpdateGlobal(func(conf *config.Config) { - conf.EnableGlobalIndex = true - }) - tk.MustExec("use test") - tk.MustExec("drop table if exists p") - tk.MustExec(`create table p (id int, c int) partition by range (c) ( -partition p0 values less than (4), -partition p1 values less than (7), -partition p2 values less than (10))`) - tk.MustExec("alter table p add unique idx(id)") - tk.MustExec("insert into p values (1,3), (3,4), (5,6), (7,9)") - tk.MustExec("analyze table p") - tk.MustQuery("select id from p use index (idx) order by id").Check(testkit.Rows("1", "3", "5", "7")) -} - -func TestAggWithGlobalIndex(t *testing.T) { - store := testkit.CreateMockStore(t) - - tk := testkit.NewTestKit(t, store) - restoreConfig := config.RestoreFunc() - defer restoreConfig() - config.UpdateGlobal(func(conf *config.Config) { - conf.EnableGlobalIndex = true - }) - tk.MustExec("use test") - tk.MustExec("drop table if exists p") - tk.MustExec(`create table p (id int, c int) partition by range (c) ( -partition p0 values less than (4), -partition p1 values less than (7), -partition p2 values less than (10))`) - tk.MustExec("alter table p add unique idx(id)") - tk.MustExec("insert into p values (1,3), (3,4), (5,6), (7,9)") - tk.MustExec("analyze table p") - tk.MustQuery("select count(*) from p use index (idx)").Check(testkit.Rows("4")) - tk.MustQuery("select count(*) from p partition(p0) use index (idx)").Check(testkit.Rows("1")) -} - -func TestGlobalIndexDoubleRead(t *testing.T) { - failpoint.Enable("github.com/pingcap/tidb/pkg/planner/core/forceDynamicPrune", `return(true)`) - defer failpoint.Disable("github.com/pingcap/tidb/pkg/planner/core/forceDynamicPrune") - store := testkit.CreateMockStore(t) - - tk := testkit.NewTestKit(t, store) - restoreConfig := config.RestoreFunc() - defer restoreConfig() - config.UpdateGlobal(func(conf *config.Config) { - conf.EnableGlobalIndex = true - }) - tk.MustExec("use test") - tk.MustExec("drop table if exists p") - tk.MustExec(`create table p (id int, c int) partition by range (c) ( -partition p0 values less than (4), -partition p1 values less than (7), -partition p2 values less than (10))`) - tk.MustExec("alter table p add unique idx(id)") - tk.MustExec("insert into p values (1,3), (3,4), (5,6), (7,9)") - tk.MustQuery("select * from p use index (idx)").Sort().Check(testkit.Rows("1 3", "3 4", "5 6", "7 9")) -} - func TestDropGlobalIndex(t *testing.T) { store := testkit.CreateMockStore(t) tk := testkit.NewTestKit(t, store) - restoreConfig := config.RestoreFunc() - defer restoreConfig() - config.UpdateGlobal(func(conf *config.Config) { - conf.EnableGlobalIndex = true - }) + tk.MustExec("set tidb_enable_global_index=true") + defer func() { + tk.MustExec("set tidb_enable_global_index=default") + }() tk.MustExec("use test") tk.MustExec("drop table if exists p") tk.MustExec(`create table p (id int, c int) partition by range (c) ( @@ -2384,11 +2241,10 @@ func TestIssue26251(t *testing.T) { store := testkit.CreateMockStore(t) tk1 := testkit.NewTestKit(t, store) - restoreConfig := config.RestoreFunc() - defer restoreConfig() - config.UpdateGlobal(func(conf *config.Config) { - conf.EnableGlobalIndex = true - }) + tk1.MustExec("set tidb_enable_global_index=true") + defer func() { + tk1.MustExec("set tidb_enable_global_index=default") + }() tk1.MustExec("use test") tk1.MustExec("create table tp (id int primary key) partition by range (id) (partition p0 values less than (100));") tk1.MustExec("create table tn (id int primary key);") @@ -2551,234 +2407,3 @@ func TestIssue31024(t *testing.T) { tk2.MustExec("rollback") } - -func TestIssue21732(t *testing.T) { - failpoint.Enable("github.com/pingcap/tidb/pkg/planner/core/forceDynamicPrune", `return(true)`) - defer failpoint.Disable("github.com/pingcap/tidb/pkg/planner/core/forceDynamicPrune") - restoreConfig := config.RestoreFunc() - defer restoreConfig() - config.UpdateGlobal(func(conf *config.Config) { - conf.EnableGlobalIndex = true - }) - - store := testkit.CreateMockStore(t) - - tk := testkit.NewTestKit(t, store) - tk.MustExec("create database TestIssue21732") - tk.MustExec("use TestIssue21732") - tk.MustExec("drop table if exists p") - tk.MustExec(`create table p (a int, b int GENERATED ALWAYS AS (3*a-2*a) VIRTUAL) partition by hash(b) partitions 2;`) - tk.MustExec("alter table p add unique index idx (a);") - tk.MustExec("insert into p (a) values (1),(2),(3);") - tk.MustQuery("select * from p use index (idx)").Sort().Check(testkit.Rows("1 1", "2 2", "3 3")) - tk.MustExec("drop database TestIssue21732") -} - -func TestGlobalIndexSelectSpecifiedPartition(t *testing.T) { - failpoint.Enable("github.com/pingcap/tidb/pkg/planner/core/forceDynamicPrune", `return(true)`) - defer failpoint.Disable("github.com/pingcap/tidb/pkg/planner/core/forceDynamicPrune") - restoreConfig := config.RestoreFunc() - defer restoreConfig() - config.UpdateGlobal(func(conf *config.Config) { - conf.EnableGlobalIndex = true - }) - - store := testkit.CreateMockStore(t) - - tk := testkit.NewTestKit(t, store) - tk.MustExec("use test") - tk.MustExec("drop table if exists p") - tk.MustExec(`create table p (id int, c int) partition by range (c) ( -partition p0 values less than (4), -partition p1 values less than (7), -partition p2 values less than (10))`) - tk.MustExec("alter table p add unique idx(id)") - tk.MustExec("insert into p values (1,3), (3,4), (5,6), (7,9)") - tk.MustQuery("select * from p partition(p0) use index (idx)").Sort().Check(testkit.Rows("1 3")) -} - -func TestGlobalIndexScanSpecifiedPartition(t *testing.T) { - restoreConfig := config.RestoreFunc() - defer restoreConfig() - config.UpdateGlobal(func(conf *config.Config) { - conf.EnableGlobalIndex = true - }) - - store := testkit.CreateMockStore(t) - - tk := testkit.NewTestKit(t, store) - tk.MustExec("use test") - tk.MustExec("drop table if exists p") - tk.MustExec(`create table p (id int, c int) partition by range (c) ( -partition p0 values less than (4), -partition p1 values less than (7), -partition p2 values less than (10))`) - tk.MustExec("alter table p add unique idx(id)") - tk.MustExec("insert into p values (1,3), (3,4), (5,6), (7,9)") - tk.MustExec("analyze table p") - tk.MustQuery("select id from p partition(p0) use index (idx)").Sort().Check(testkit.Rows("1")) -} - -func TestGlobalIndexScanForClusteredSpecifiedPartition(t *testing.T) { - restoreConfig := config.RestoreFunc() - defer restoreConfig() - config.UpdateGlobal(func(conf *config.Config) { - conf.EnableGlobalIndex = true - }) - - store := testkit.CreateMockStore(t) - - tk := testkit.NewTestKit(t, store) - tk.MustExec("use test") - tk.MustExec("drop table if exists p") - tk.MustExec(`create table p (id int, c int, d int, e int, primary key(d, c) clustered) partition by range (c) ( -partition p0 values less than (4), -partition p1 values less than (7), -partition p2 values less than (10))`) - tk.MustExec("alter table p add unique idx(id)") - tk.MustExec("insert into p values (1,3,1,1), (3,4,3,3), (5,6,5,5), (7,9,7,7)") - tk.MustExec("analyze table p") - tk.MustQuery("select id from p partition(p0) use index (idx)").Sort().Check(testkit.Rows("1")) -} - -func TestGlobalIndexJoin(t *testing.T) { - restoreConfig := config.RestoreFunc() - defer restoreConfig() - config.UpdateGlobal(func(conf *config.Config) { - conf.EnableGlobalIndex = true - }) - - store := testkit.CreateMockStore(t) - - tk := testkit.NewTestKit(t, store) - tk.MustExec("use test") - tk.MustExec("drop table if exists p") - tk.MustExec(`create table t1 (id int, c int) partition by range (c) ( -partition p0 values less than (4), -partition p1 values less than (7), -partition p2 values less than (10))`) - tk.MustExec("alter table t1 add unique idx(id)") - tk.MustExec("insert into t1 values (1,3), (3,4), (5,6), (7,9)") - - tk.MustExec(`create table t2 (id int, c int)`) - tk.MustExec("insert into t2 values (1, 3)") - - tk.MustExec("analyze table t1") - tk.MustExec("analyze table t2") - tk.MustQuery("select /*+ INL_JOIN(t1, t2) */ * from t1 inner join t2 on t1.id = t2.id").Sort().Check(testkit.Rows("1 3 1 3")) - tk.MustQuery("select /*+ INL_JOIN(t1, t2) */ t1.id from t1 inner join t2 on t1.id = t2.id").Sort().Check(testkit.Rows("1")) -} - -func TestGlobalIndexJoinSpecifiedPartition(t *testing.T) { - restoreConfig := config.RestoreFunc() - defer restoreConfig() - config.UpdateGlobal(func(conf *config.Config) { - conf.EnableGlobalIndex = true - }) - - store := testkit.CreateMockStore(t) - - tk := testkit.NewTestKit(t, store) - tk.MustExec("use test") - tk.MustExec("drop table if exists p") - tk.MustExec(`create table t1 (id int, c int) partition by range (c) ( -partition p0 values less than (4), -partition p1 values less than (7), -partition p2 values less than (10))`) - tk.MustExec("alter table t1 add unique idx(id)") - tk.MustExec("insert into t1 values (1,3), (3,4), (5,6), (7,9)") - - tk.MustExec(`create table t2 (id int, c int)`) - tk.MustExec("insert into t2 values (1, 3)") - - tk.MustExec("analyze table t1") - tk.MustExec("analyze table t2") - tk.MustQuery("select /*+ INL_JOIN(t1, t2) */ * from t1 partition(p0) inner join t2 on t1.id = t2.id").Sort().Check(testkit.Rows("1 3 1 3")) - tk.MustQuery("select /*+ INL_JOIN(t1, t2) */ t1.id from t1 partition(p0) inner join t2 on t1.id = t2.id").Sort().Check(testkit.Rows("1")) -} - -func TestGlobalIndexJoinForClusteredSpecifiedPartition(t *testing.T) { - restoreConfig := config.RestoreFunc() - defer restoreConfig() - config.UpdateGlobal(func(conf *config.Config) { - conf.EnableGlobalIndex = true - }) - - store := testkit.CreateMockStore(t) - - tk := testkit.NewTestKit(t, store) - tk.MustExec("use test") - tk.MustExec("drop table if exists p") - tk.MustExec(`create table t1 (id int, c int, d int, e int, primary key(d, c) clustered) partition by range (c) ( -partition p0 values less than (4), -partition p1 values less than (7), -partition p2 values less than (10))`) - tk.MustExec("alter table t1 add unique idx(id)") - tk.MustExec("insert into t1 values (1,3,1,1), (3,4,3,3), (5,6,5,5), (7,9,7,7)") - - tk.MustExec(`create table t2 (id int, c int)`) - tk.MustExec("insert into t2 values (1, 3)") - - tk.MustExec("analyze table t1") - tk.MustExec("analyze table t2") - tk.MustQuery("select /*+ INL_JOIN(t1, t2) */ * from t1 partition(p0) inner join t2 on t1.id = t2.id").Sort().Check(testkit.Rows("1 3 1 1 1 3")) - tk.MustQuery("select /*+ INL_JOIN(t1, t2) */ t1.id from t1 partition(p0) inner join t2 on t1.id = t2.id").Sort().Check(testkit.Rows("1")) -} - -func TestGlobalIndexForIssue40149(t *testing.T) { - restoreConfig := config.RestoreFunc() - defer restoreConfig() - config.UpdateGlobal(func(conf *config.Config) { - conf.EnableGlobalIndex = true - }) - - store := testkit.CreateMockStore(t) - - tk := testkit.NewTestKit(t, store) - for _, opt := range []string{"true", "false"} { - failpoint.Enable("github.com/pingcap/tidb/pkg/planner/core/forceDynamicPrune", `return(`+opt+`)`) - tk.MustExec("use test") - tk.MustExec("drop table if exists test_t1") - tk.MustExec(`CREATE TABLE test_t1 ( - a int(11) NOT NULL, - b int(11) DEFAULT NULL, - c int(11) DEFAULT NULL - ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin PARTITION BY RANGE (c) ( - PARTITION p0 VALUES LESS THAN (10), - PARTITION p1 VALUES LESS THAN (MAXVALUE));`) - tk.MustExec("alter table test_t1 add unique p_a (a);") - tk.MustExec("insert into test_t1 values (1,1,1);") - tk.MustQuery("select * from test_t1 where a = 1;").Sort().Check(testkit.Rows("1 1 1")) - failpoint.Disable("github.com/pingcap/tidb/pkg/planner/core/forceDynamicPrune") - } -} - -func TestGlobalIndexMerge(t *testing.T) { - restoreConfig := config.RestoreFunc() - defer restoreConfig() - config.UpdateGlobal(func(conf *config.Config) { - conf.EnableGlobalIndex = true - }) - - store := testkit.CreateMockStore(t) - tk := testkit.NewTestKit(t, store) - tk.MustExec("use test") - tk.MustExec("SET session tidb_enable_index_merge = ON;") - tk.MustExec("drop table if exists t") - tk.MustExec(`CREATE TABLE t ( - a int(11) NOT NULL, - b int(11) DEFAULT NULL, - c int(11) DEFAULT NULL, - d int(11) NOT NULL AUTO_INCREMENT, - KEY idx_bd (b, c), - UNIQUE KEY uidx_ac(a) - ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin PARTITION BY RANGE (c) ( - PARTITION p0 VALUES LESS THAN (10), - PARTITION p1 VALUES LESS THAN (MAXVALUE));`) - tk.MustExec("insert into t values (1,1,1,1),(2,2,2,2),(3,3,3,3),(4,4,4,4),(5,5,5,5),(6,6,6,6),(7,7,7,7),(8,8,8,8);") - tk.MustExec("analyze table t") - // when index_merge has global index as its partial path, ignore it. - require.False(t, tk.MustUseIndex("select /*+ use_index_merge(t, uidx_ac, idx_bc) */ * from t where a=1 or b=2", "uidx_ac")) - tk.MustQuery("select /*+ use_index_merge(t, uidx_ac, idx_bc) */ * from t where a=1 or b=2").Sort().Check( - testkit.Rows("1 1 1 1", "2 2 2 2")) -} diff --git a/pkg/executor/pipelined_window.go b/pkg/executor/pipelined_window.go index e63a4a59596d4..2b43349fcd6fa 100644 --- a/pkg/executor/pipelined_window.go +++ b/pkg/executor/pipelined_window.go @@ -218,7 +218,7 @@ func (e *PipelinedWindowExec) fetchChild(ctx context.Context) (eof bool, err err } // TODO: reuse chunks - resultChk := e.Ctx().GetSessionVars().GetNewChunkWithCapacity(e.RetFieldTypes(), 0, numRows, e.AllocPool) + resultChk := e.AllocPool.Alloc(e.RetFieldTypes(), 0, numRows) err = e.copyChk(childResult, resultChk) if err != nil { return false, err diff --git a/pkg/executor/plan_replayer.go b/pkg/executor/plan_replayer.go index 7ae5bbb571f8a..771a3baf9f47a 100644 --- a/pkg/executor/plan_replayer.go +++ b/pkg/executor/plan_replayer.go @@ -401,7 +401,7 @@ func loadVariables(ctx sessionctx.Context, z *zip.Reader) error { } } if len(unLoadVars) > 0 { - ctx.GetSessionVars().StmtCtx.AppendWarning(errors.Errorf("variables set failed:%s", strings.Join(unLoadVars, ","))) + ctx.GetSessionVars().StmtCtx.AppendWarning(errors.NewNoStackErrorf("variables set failed:%s", strings.Join(unLoadVars, ","))) } return nil } diff --git a/pkg/executor/point_get.go b/pkg/executor/point_get.go index c7f20258874d3..4250f15a8c47a 100644 --- a/pkg/executor/point_get.go +++ b/pkg/executor/point_get.go @@ -63,8 +63,8 @@ func (b *executorBuilder) buildPointGet(p *plannercore.PointGetPlan) exec.Execut isStaleness: b.isStaleness, } - e.Base().SetInitCap(1) - e.Base().SetMaxChunkSize(1) + e.SetInitCap(1) + e.SetMaxChunkSize(1) e.Init(p) e.snapshot, err = b.getSnapshot() @@ -120,7 +120,7 @@ type PointGetExecutor struct { tblInfo *model.TableInfo handle kv.Handle idxInfo *model.IndexInfo - partInfo *model.PartitionDefinition + partitionDef *model.PartitionDefinition idxKey kv.Key handleVal []byte idxVals []types.Datum @@ -162,7 +162,7 @@ func (e *PointGetExecutor) Init(p *plannercore.PointGetPlan) { e.lockWaitTime = 0 } e.rowDecoder = decoder - e.partInfo = p.PartitionInfo + e.partitionDef = p.PartitionDef e.columns = p.Columns e.buildVirtualColumnInfo() } @@ -221,8 +221,8 @@ func (e *PointGetExecutor) Next(ctx context.Context, req *chunk.Chunk) error { var tblID int64 var err error - if e.partInfo != nil { - tblID = e.partInfo.ID + if e.partitionDef != nil { + tblID = e.partitionDef.ID } else { tblID = e.tblInfo.ID } @@ -303,6 +303,14 @@ func (e *PointGetExecutor) Next(ctx context.Context, req *chunk.Chunk) error { // Wait `UPDATE` finished failpoint.InjectContext(ctx, "pointGetRepeatableReadTest-step2", nil) }) + if e.idxInfo.Global { + segs := tablecodec.SplitIndexValue(e.handleVal) + _, pid, err := codec.DecodeInt(segs.PartitionID) + if err != nil { + return err + } + tblID = pid + } } } @@ -333,7 +341,7 @@ func (e *PointGetExecutor) Next(ctx context.Context, req *chunk.Chunk) error { } return nil } - err = DecodeRowValToChunk(e.Base().Ctx(), e.Schema(), e.tblInfo, e.handle, val, req, e.rowDecoder) + err = DecodeRowValToChunk(e.BaseExecutor.Ctx(), e.Schema(), e.tblInfo, e.handle, val, req, e.rowDecoder) if err != nil { return err } @@ -502,8 +510,8 @@ func (e *PointGetExecutor) verifyTxnScope() error { var tblName string var partName string is := e.Ctx().GetInfoSchema().(infoschema.InfoSchema) - if e.partInfo != nil { - tblID = e.partInfo.ID + if e.partitionDef != nil { + tblID = e.partitionDef.ID tblInfo, _, partInfo := is.FindTableByPartitionID(tblID) tblName = tblInfo.Meta().Name.String() partName = partInfo.Name.String() @@ -540,11 +548,13 @@ func EncodeUniqueIndexValuesForKey(ctx sessionctx.Context, tblInfo *model.TableI colInfo := tblInfo.Columns[idxInfo.Columns[i].Offset] // table.CastValue will append 0x0 if the string value's length is smaller than the BINARY column's length. // So we don't use CastValue for string value for now. - // TODO: merge two if branch. + // TODO: The first if branch should have been removed, because the functionality of set the collation of the datum + // have been moved to util/ranger (normal path) and getNameValuePairs/getPointGetValue (fast path). But this change + // will be cherry-picked to a hotfix, so we choose to be a bit conservative and keep this for now. if colInfo.GetType() == mysql.TypeString || colInfo.GetType() == mysql.TypeVarString || colInfo.GetType() == mysql.TypeVarchar { var str string str, err = idxVals[i].ToString() - idxVals[i].SetString(str, colInfo.FieldType.GetCollate()) + idxVals[i].SetString(str, idxVals[i].Collation()) } else if colInfo.GetType() == mysql.TypeEnum && (idxVals[i].Kind() == types.KindString || idxVals[i].Kind() == types.KindBytes || idxVals[i].Kind() == types.KindBinaryLiteral) { var str string var e types.Enum diff --git a/pkg/executor/point_get_test.go b/pkg/executor/point_get_test.go index 1bd1cb476e49f..23995a4b168c0 100644 --- a/pkg/executor/point_get_test.go +++ b/pkg/executor/point_get_test.go @@ -228,39 +228,6 @@ func TestPartitionMemCacheReadLock(t *testing.T) { mustExecDDL(tk, t, "unlock tables", dom) } -func TestPointGetWriteLock(t *testing.T) { - defer config.RestoreFunc()() - config.UpdateGlobal(func(conf *config.Config) { - conf.EnableTableLock = true - }) - store := testkit.CreateMockStore(t) - tk := testkit.NewTestKit(t, store) - tk.MustExec("use test") - tk.MustExec("create table point (id int primary key, c int, d varchar(10), unique c_d (c, d))") - tk.MustExec("insert point values (1, 1, 'a')") - tk.MustExec("insert point values (2, 2, 'b')") - tk.MustExec("lock tables point write") - tk.MustQuery(`select * from point where id = 1;`).Check(testkit.Rows( - `1 1 a`, - )) - rows := tk.MustQuery("explain analyze select * from point where id = 1").Rows() - require.Len(t, rows, 1) - explain := fmt.Sprintf("%v", rows[0]) - require.Regexp(t, ".*num_rpc.*", explain) - tk.MustExec("unlock tables") - - tk.MustExec("update point set c = 3 where id = 1") - tk.MustExec("lock tables point write") - tk.MustQuery(`select * from point where id = 1;`).Check(testkit.Rows( - `1 3 a`, - )) - rows = tk.MustQuery("explain analyze select * from point where id = 1").Rows() - require.Len(t, rows, 1) - explain = fmt.Sprintf("%v", rows[0]) - require.Regexp(t, ".*num_rpc.*", explain) - tk.MustExec("unlock tables") -} - func TestPointGetLockExistKey(t *testing.T) { testLock := func(rc bool, key string, tableName string) { store := testkit.CreateMockStore(t) @@ -408,3 +375,39 @@ func TestWithTiDBSnapshot(t *testing.T) { tk.MustQuery("select * from xx").Check(testkit.Rows("1", "7")) } + +func TestGlobalIndexPointGet(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("set tidb_enable_global_index=true") + defer func() { + tk.MustExec("set tidb_enable_global_index=default") + }() + + tk.MustExec(`CREATE TABLE t ( a int, b int, c int default 0) + PARTITION BY RANGE (a) ( + PARTITION p0 VALUES LESS THAN (10), + PARTITION p1 VALUES LESS THAN (20), + PARTITION p2 VALUES LESS THAN (30), + PARTITION p3 VALUES LESS THAN (40))`) + tk.MustExec("INSERT INTO t(a, b) values(1, 1), (2, 2), (3, 3), (15, 15), (25, 25), (35, 35)") + tk.MustExec("ALTER TABLE t ADD UNIQUE INDEX idx(b)") + tk.MustExec("analyze table t") + + tk.MustQuery("select * from t use index(idx) where b in (15, 25, 35)").Sort().Check(testkit.Rows("15 15 0", "25 25 0", "35 35 0")) + tk.MustQuery("explain select * from t use index(idx) where b in (15, 25, 35)").Check( + testkit.Rows("Batch_Point_Get_1 3.00 root table:t, index:idx(b) keep order:false, desc:false")) + + tk.MustQuery("select * from t use index(idx) where b in (select b from t use index(idx) where b>10)").Sort().Check(testkit.Rows("15 15 0", "25 25 0", "35 35 0")) + + tk.MustQuery("select * from t use index(idx) where b = 15").Check(testkit.Rows("15 15 0")) + tk.MustQuery("explain select * from t use index(idx) where b = 15").Check( + testkit.Rows("Point_Get_1 1.00 root table:t, index:idx(b) ")) + + tk.MustQuery("select * from t use index(idx) where b in (select b from t use index(idx) where b > 10)").Sort().Check( + testkit.Rows("15 15 0", "25 25 0", "35 35 0")) + + tk.MustQuery("select * from t partition(p1) use index(idx) where b = 3").Check(testkit.Rows()) + tk.MustQuery("select * from t partition(p1) use index(idx) where b in (15, 25, 35)").Check(testkit.Rows("15 15 0")) +} diff --git a/pkg/executor/prepared.go b/pkg/executor/prepared.go index 3a002f3e8822f..8986bc25914ca 100644 --- a/pkg/executor/prepared.go +++ b/pkg/executor/prepared.go @@ -19,6 +19,7 @@ import ( "github.com/pingcap/errors" "github.com/pingcap/log" + "github.com/pingcap/tidb/pkg/bindinfo" "github.com/pingcap/tidb/pkg/executor/internal/exec" "github.com/pingcap/tidb/pkg/expression" "github.com/pingcap/tidb/pkg/infoschema" @@ -205,7 +206,7 @@ func (e *DeallocateExec) Next(context.Context, *chunk.Chunk) error { prepared := preparedObj.PreparedAst delete(vars.PreparedStmtNameToID, e.Name) if e.Ctx().GetSessionVars().EnablePreparedPlanCache { - bindSQL, _ := plannercore.GetBindSQL4PlanCache(e.Ctx(), preparedObj) + bindSQL, _ := bindinfo.MatchSQLBindingForPlanCache(e.Ctx(), preparedObj.PreparedAst.Stmt, &preparedObj.BindingInfo) cacheKey, err := plannercore.NewPlanCacheKey(vars, preparedObj.StmtText, preparedObj.StmtDB, prepared.SchemaVersion, 0, bindSQL, expression.ExprPushDownBlackListReloadTimeStamp.Load()) if err != nil { diff --git a/pkg/executor/prepared_test.go b/pkg/executor/prepared_test.go index c65e9151655ec..73ff91a6218bf 100644 --- a/pkg/executor/prepared_test.go +++ b/pkg/executor/prepared_test.go @@ -1086,7 +1086,6 @@ func TestPreparePC4Binding(t *testing.T) { tk.MustExec("prepare stmt from \"select * from t\"") require.Equal(t, 1, len(tk.Session().GetSessionVars().PreparedStmts)) - require.Equal(t, "select * from `test` . `t`", tk.Session().GetSessionVars().PreparedStmts[1].(*plannercore.PlanCacheStmt).NormalizedSQL4PC) tk.MustQuery("execute stmt") tk.MustQuery("select @@last_plan_from_binding").Check(testkit.Rows("0")) diff --git a/pkg/executor/recover_test.go b/pkg/executor/recover_test.go index c57c71dc61af9..ea9ede8bd7dbb 100644 --- a/pkg/executor/recover_test.go +++ b/pkg/executor/recover_test.go @@ -26,7 +26,9 @@ import ( "github.com/pingcap/tidb/pkg/infoschema" "github.com/pingcap/tidb/pkg/parser/auth" "github.com/pingcap/tidb/pkg/sessionctx/variable" + "github.com/pingcap/tidb/pkg/store/mockstore" "github.com/pingcap/tidb/pkg/testkit" + "github.com/pingcap/tidb/pkg/types" "github.com/pingcap/tidb/pkg/util/dbterror" "github.com/pingcap/tidb/pkg/util/gcutil" "github.com/stretchr/testify/require" @@ -135,7 +137,7 @@ func TestFlashbackTable(t *testing.T) { require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/meta/autoid/mockAutoIDChange")) }() - store := testkit.CreateMockStore(t) + store := testkit.CreateMockStore(t, mockstore.WithStoreType(mockstore.EmbedUnistore)) tk := testkit.NewTestKit(t, store) tk.MustExec("create database if not exists test_flashback") @@ -376,15 +378,15 @@ func TestRecoverClusterMeetError(t *testing.T) { nowTS, err := tk.Session().GetStore().GetOracle().GetTimestamp(context.Background(), &oracle.Option{}) require.NoError(t, err) tk.MustExec("truncate table mysql.stats_meta") - errorMsg := fmt.Sprintf("[ddl:-1]Detected modified system table during [%s, now), can't do flashback", oracle.GetTimeFromTS(nowTS).String()) - tk.MustGetErrMsg(fmt.Sprintf("flashback cluster to timestamp '%s'", oracle.GetTimeFromTS(nowTS)), errorMsg) + errorMsg := fmt.Sprintf("[ddl:-1]Detected modified system table during [%s, now), can't do flashback", oracle.GetTimeFromTS(nowTS).Format(types.TimeFSPFormat)) + tk.MustGetErrMsg(fmt.Sprintf("flashback cluster to timestamp '%s'", oracle.GetTimeFromTS(nowTS).Format(types.TimeFSPFormat)), errorMsg) // update tidb_server_version nowTS, err = tk.Session().GetStore().GetOracle().GetTimestamp(context.Background(), &oracle.Option{}) require.NoError(t, err) tk.MustExec("update mysql.tidb set VARIABLE_VALUE=VARIABLE_VALUE+1 where VARIABLE_NAME='tidb_server_version'") - errorMsg = fmt.Sprintf("[ddl:-1]Detected TiDB upgrade during [%s, now), can't do flashback", oracle.GetTimeFromTS(nowTS).String()) - tk.MustGetErrMsg(fmt.Sprintf("flashback cluster to timestamp '%s'", oracle.GetTimeFromTS(nowTS)), errorMsg) + errorMsg = fmt.Sprintf("[ddl:-1]Detected TiDB upgrade during [%s, now), can't do flashback", oracle.GetTimeFromTS(nowTS).Format(types.TimeFSPFormat)) + tk.MustGetErrMsg(fmt.Sprintf("flashback cluster to timestamp '%s'", oracle.GetTimeFromTS(nowTS).Format(types.TimeFSPFormat)), errorMsg) require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/ddl/injectSafeTS")) require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/ddl/mockFlashbackTest")) @@ -553,7 +555,7 @@ func TestFlashbackSchema(t *testing.T) { require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/meta/autoid/mockAutoIDChange")) }() - store := testkit.CreateMockStore(t) + store := testkit.CreateMockStore(t, mockstore.WithStoreType(mockstore.EmbedUnistore)) tk := testkit.NewTestKit(t, store) tk.MustExec("create database if not exists test_flashback") diff --git a/pkg/executor/replace.go b/pkg/executor/replace.go index 992ac06d74b2e..d2f30e4333c8c 100644 --- a/pkg/executor/replace.go +++ b/pkg/executor/replace.go @@ -44,7 +44,7 @@ func (e *ReplaceExec) Close() error { defer e.Ctx().GetSessionVars().StmtCtx.RuntimeStatsColl.RegisterStats(e.ID(), e.stats) } if e.SelectExec != nil { - return e.SelectExec.Close() + return exec.Close(e.SelectExec) } return nil } diff --git a/pkg/executor/revoke.go b/pkg/executor/revoke.go index dbeba1320987e..21dca529c6b97 100644 --- a/pkg/executor/revoke.go +++ b/pkg/executor/revoke.go @@ -203,7 +203,7 @@ func (e *RevokeExec) revokePriv(internalSession sessionctx.Context, priv *ast.Pr func (e *RevokeExec) revokeDynamicPriv(internalSession sessionctx.Context, privName string, user, host string) error { privName = strings.ToUpper(privName) if !privilege.GetPrivilegeManager(e.Ctx()).IsDynamicPrivilege(privName) { // for MySQL compatibility - e.Ctx().GetSessionVars().StmtCtx.AppendWarning(exeerrors.ErrDynamicPrivilegeNotRegistered.GenWithStackByArgs(privName)) + e.Ctx().GetSessionVars().StmtCtx.AppendWarning(exeerrors.ErrDynamicPrivilegeNotRegistered.FastGenByArgs(privName)) } ctx := kv.WithInternalSourceType(context.Background(), kv.InternalTxnPrivilege) _, err := internalSession.(sqlexec.SQLExecutor).ExecuteInternal(ctx, "DELETE FROM mysql.global_grants WHERE user = %? AND host = %? AND priv = %?", user, host, privName) diff --git a/pkg/executor/set.go b/pkg/executor/set.go index 60259a409a2b9..37d13806947b9 100644 --- a/pkg/executor/set.go +++ b/pkg/executor/set.go @@ -19,6 +19,8 @@ import ( "strings" "github.com/pingcap/errors" + "github.com/pingcap/tidb/pkg/config" + "github.com/pingcap/tidb/pkg/disttask/framework/storage" "github.com/pingcap/tidb/pkg/domain" "github.com/pingcap/tidb/pkg/executor/internal/exec" "github.com/pingcap/tidb/pkg/expression" @@ -38,7 +40,6 @@ import ( "github.com/pingcap/tidb/pkg/util/gcutil" "github.com/pingcap/tidb/pkg/util/logutil" "github.com/pingcap/tidb/pkg/util/sem" - "github.com/pingcap/tidb/pkg/util/sqlexec" "go.uber.org/zap" ) @@ -137,13 +138,13 @@ func (e *SetExecutor) setSysVariable(ctx context.Context, name string, v *expres // The variable is a noop. For compatibility we allow it to still // be changed, but we append a warning since users might be expecting // something that's not going to happen. - sessionVars.StmtCtx.AppendWarning(exeerrors.ErrSettingNoopVariable.GenWithStackByArgs(sysVar.Name)) + sessionVars.StmtCtx.AppendWarning(exeerrors.ErrSettingNoopVariable.FastGenByArgs(sysVar.Name)) } if sysVar.HasInstanceScope() && !v.IsGlobal && sessionVars.EnableLegacyInstanceScope { // For backward compatibility we will change the v.IsGlobal to true, // and append a warning saying this will not be supported in future. v.IsGlobal = true - sessionVars.StmtCtx.AppendWarning(exeerrors.ErrInstanceScope.GenWithStackByArgs(sysVar.Name)) + sessionVars.StmtCtx.AppendWarning(exeerrors.ErrInstanceScope.FastGenByArgs(sysVar.Name)) } if v.IsGlobal { @@ -169,9 +170,18 @@ func (e *SetExecutor) setSysVariable(ctx context.Context, name string, v *expres logutil.BgLogger().Info("set global var", zap.Uint64("conn", sessionVars.ConnectionID), zap.String("name", name), zap.String("val", showValStr)) if name == variable.TiDBServiceScope { dom := domain.GetDomain(e.Ctx()) + oldConfig := config.GetGlobalConfig() + if oldConfig.Instance.TiDBServiceScope != valStr { + newConfig := *oldConfig + newConfig.Instance.TiDBServiceScope = valStr + config.StoreGlobalConfig(&newConfig) + } serverID := disttaskutil.GenerateSubtaskExecID(ctx, dom.DDL().GetID()) - _, err = e.Ctx().(sqlexec.SQLExecutor).ExecuteInternal(ctx, - `replace into mysql.dist_framework_meta values(%?, %?, DEFAULT)`, serverID, valStr) + taskMgr, err := storage.GetTaskManager() + if err != nil { + return err + } + return taskMgr.InitMetaSession(ctx, e.Ctx(), serverID, valStr) } return err } @@ -291,7 +301,8 @@ func (e *SetExecutor) getVarValue(ctx context.Context, v *expression.VarAssignme // to the compiled-in MySQL default value, use the DEFAULT keyword. // See http://dev.mysql.com/doc/refman/5.7/en/set-statement.html if sysVar != nil { - return sysVar.Value, nil + defVal := variable.GlobalSystemVariableInitialValue(sysVar.Name, sysVar.Value) + return defVal, nil } return e.Ctx().GetSessionVars().GetGlobalSystemVar(ctx, v.Name) } diff --git a/pkg/executor/set_test.go b/pkg/executor/set_test.go index 2cb8d413cecdd..8da41ee078d90 100644 --- a/pkg/executor/set_test.go +++ b/pkg/executor/set_test.go @@ -652,6 +652,12 @@ func TestSetVar(t *testing.T) { tk.MustExec("set global tidb_enable_tso_follower_proxy = 0") tk.MustQuery("select @@tidb_enable_tso_follower_proxy").Check(testkit.Rows("0")) require.Error(t, tk.ExecToErr("set tidb_enable_tso_follower_proxy = 1")) + tk.MustQuery("select @@pd_enable_follower_handle_region").Check(testkit.Rows("0")) + tk.MustExec("set global pd_enable_follower_handle_region = 1") + tk.MustQuery("select @@pd_enable_follower_handle_region").Check(testkit.Rows("1")) + tk.MustExec("set global pd_enable_follower_handle_region = 0") + tk.MustQuery("select @@pd_enable_follower_handle_region").Check(testkit.Rows("0")) + require.Error(t, tk.ExecToErr("set pd_enable_follower_handle_region = 1")) tk.MustQuery("select @@tidb_enable_historical_stats").Check(testkit.Rows("1")) tk.MustExec("set global tidb_enable_historical_stats = 1") @@ -902,6 +908,54 @@ func TestSetVar(t *testing.T) { tk.MustQuery("select @@global.tidb_schema_version_cache_limit").Check(testkit.Rows("2")) tk.MustExec("set @@global.tidb_schema_version_cache_limit=64;") tk.MustQuery("select @@global.tidb_schema_version_cache_limit").Check(testkit.Rows("64")) + + // test tidb_idle_transaction_timeout + tk.MustQuery("select @@session.tidb_idle_transaction_timeout").Check(testkit.Rows("0")) + tk.MustExec("SET SESSION tidb_idle_transaction_timeout = 2") + tk.MustQuery("select @@session.tidb_idle_transaction_timeout").Check(testkit.Rows("2")) + tk.MustGetErrMsg("SET SESSION tidb_idle_transaction_timeout='x';", "[variable:1232]Incorrect argument type to variable 'tidb_idle_transaction_timeout'") + tk.MustExec("SET SESSION tidb_idle_transaction_timeout=31536001;") + tk.MustQuery("show warnings").Check(testkit.Rows("Warning 1292 Truncated incorrect tidb_idle_transaction_timeout value: '31536001'")) + tk.MustQuery("select @@session.tidb_idle_transaction_timeout").Check(testkit.Rows("31536000")) + tk.MustExec("SET SESSION tidb_idle_transaction_timeout = 0") + tk.MustQuery("select @@session.tidb_idle_transaction_timeout").Check(testkit.Rows("0")) + tk.MustExec("SET SESSION tidb_idle_transaction_timeout=31536000;") + tk.MustQuery("select @@session.tidb_idle_transaction_timeout").Check(testkit.Rows("31536000")) + tk.MustQuery("select @@global.tidb_idle_transaction_timeout").Check(testkit.Rows("0")) + tk.MustExec("SET GLOBAL tidb_idle_transaction_timeout = 1") + tk.MustQuery("select @@global.tidb_idle_transaction_timeout").Check(testkit.Rows("1")) + tk.MustGetErrMsg("SET GLOBAL tidb_idle_transaction_timeout='x';", "[variable:1232]Incorrect argument type to variable 'tidb_idle_transaction_timeout'") + tk.MustExec("SET GLOBAL tidb_idle_transaction_timeout=31536001;") + tk.MustQuery("show warnings").Check(testkit.Rows("Warning 1292 Truncated incorrect tidb_idle_transaction_timeout value: '31536001'")) + tk.MustQuery("select @@global.tidb_idle_transaction_timeout").Check(testkit.Rows("31536000")) + tk.MustExec("SET GLOBAL tidb_idle_transaction_timeout = 0") + tk.MustQuery("select @@global.tidb_idle_transaction_timeout").Check(testkit.Rows("0")) + tk.MustExec("SET GLOBAL tidb_idle_transaction_timeout=31536000;") + tk.MustQuery("select @@global.tidb_idle_transaction_timeout").Check(testkit.Rows("31536000")) + + // test tidb_txn_entry_size_limit + tk.MustQuery("select @@session.tidb_txn_entry_size_limit").Check(testkit.Rows("0")) + tk.MustExec("set session tidb_txn_entry_size_limit = 1024") + tk.MustQuery("select @@session.tidb_txn_entry_size_limit").Check(testkit.Rows("1024")) + tk.MustExec("set session tidb_txn_entry_size_limit = 125829120") + tk.MustQuery("select @@session.tidb_txn_entry_size_limit").Check(testkit.Rows("125829120")) + + tk.MustGetErrMsg("set session tidb_txn_entry_size_limit = 'x'", "[variable:1232]Incorrect argument type to variable 'tidb_txn_entry_size_limit'") + tk.MustGetErrMsg("set session tidb_txn_entry_size_limit = 18446744073709551616", "[variable:1232]Incorrect argument type to variable 'tidb_txn_entry_size_limit'") + + tk.MustExec("set session tidb_txn_entry_size_limit = 125829121") + tk.MustQuery("show warnings").Check(testkit.RowsWithSep("|", "Warning|1292|Truncated incorrect tidb_txn_entry_size_limit value: '125829121'")) + tk.MustQuery("select @@session.tidb_txn_entry_size_limit").Check(testkit.Rows("125829120")) + tk.MustExec("set session tidb_txn_entry_size_limit = -1") + tk.MustQuery("show warnings").Check(testkit.RowsWithSep("|", "Warning|1292|Truncated incorrect tidb_txn_entry_size_limit value: '-1'")) + tk.MustQuery("select @@session.tidb_txn_entry_size_limit").Check(testkit.Rows("0")) + + tk.MustExec("set session tidb_txn_entry_size_limit = 2048") + tk.MustQuery("select @@session.tidb_txn_entry_size_limit, @@global.tidb_txn_entry_size_limit").Check(testkit.Rows("2048 0")) + tk.MustExec("set global tidb_txn_entry_size_limit = 4096") + tk.MustQuery("select @@session.tidb_txn_entry_size_limit, @@global.tidb_txn_entry_size_limit").Check(testkit.Rows("2048 4096")) + tk.MustExec("set global tidb_txn_entry_size_limit = 0") + tk.MustQuery("select @@session.tidb_txn_entry_size_limit, @@global.tidb_txn_entry_size_limit").Check(testkit.Rows("2048 0")) } func TestSetCollationAndCharset(t *testing.T) { @@ -952,7 +1006,19 @@ func TestValidateSetVar(t *testing.T) { store := testkit.CreateMockStore(t) tk := testkit.NewTestKit(t, store) - err := tk.ExecToErr("set global tidb_distsql_scan_concurrency='fff';") + err := tk.ExecToErr("set global tidb_analyze_distsql_scan_concurrency='fff';") + require.True(t, terror.ErrorEqual(err, variable.ErrWrongTypeForVar), fmt.Sprintf("err %v", err)) + + tk.MustExec("set global tidb_analyze_distsql_scan_concurrency=-2;") + tk.MustQuery(`show warnings`).Check(testkit.Rows("Warning 1292 Truncated incorrect tidb_analyze_distsql_scan_concurrency value: '-2'")) + + err = tk.ExecToErr("set @@tidb_analyze_distsql_scan_concurrency='fff';") + require.True(t, terror.ErrorEqual(err, variable.ErrWrongTypeForVar), fmt.Sprintf("err %v", err)) + + tk.MustExec("set @@tidb_analyze_distsql_scan_concurrency=-2;") + tk.MustQuery(`show warnings`).Check(testkit.Rows("Warning 1292 Truncated incorrect tidb_analyze_distsql_scan_concurrency value: '-2'")) + + err = tk.ExecToErr("set global tidb_distsql_scan_concurrency='fff';") require.True(t, terror.ErrorEqual(err, variable.ErrWrongTypeForVar), fmt.Sprintf("err %v", err)) tk.MustExec("set global tidb_distsql_scan_concurrency=-2;") diff --git a/pkg/executor/show.go b/pkg/executor/show.go index 0ac276bbea05c..b8c2453079197 100644 --- a/pkg/executor/show.go +++ b/pkg/executor/show.go @@ -321,78 +321,53 @@ func (*visibleChecker) Leave(in ast.Node) (out ast.Node, ok bool) { } func (e *ShowExec) fetchShowBind() error { - var tmp []*bindinfo.BindRecord + var bindings []bindinfo.Binding if !e.GlobalScope { - handle := e.Ctx().Value(bindinfo.SessionBindInfoKeyType).(*bindinfo.SessionHandle) - tmp = handle.GetAllBindRecord() + handle := e.Ctx().Value(bindinfo.SessionBindInfoKeyType).(bindinfo.SessionBindingHandle) + bindings = handle.GetAllSessionBindings() } else { - tmp = domain.GetDomain(e.Ctx()).BindHandle().GetAllBindRecord() - } - bindRecords := make([]*bindinfo.BindRecord, 0) - for _, bindRecord := range tmp { - bindRecords = append(bindRecords, bindRecord.Copy()) + bindings = domain.GetDomain(e.Ctx()).BindHandle().GetAllGlobalBindings() } // Remove the invalid bindRecord. - ind := 0 - for _, bindData := range bindRecords { - if len(bindData.Bindings) > 0 { - bindRecords[ind] = bindData - ind++ - } - } - bindRecords = bindRecords[:ind] parser := parser.New() - for _, bindData := range bindRecords { - // For the same origin_sql, sort the bindings according to their update time. - sort.Slice(bindData.Bindings, func(i int, j int) bool { - cmpResult := bindData.Bindings[i].UpdateTime.Compare(bindData.Bindings[j].UpdateTime) - if cmpResult == 0 { - // Because the create time must be different, the result of sorting is stable. - cmpResult = bindData.Bindings[i].CreateTime.Compare(bindData.Bindings[j].CreateTime) - } - return cmpResult > 0 - }) - } // For the different origin_sql, sort the bindRecords according to their max update time. - sort.Slice(bindRecords, func(i int, j int) bool { - cmpResult := bindRecords[i].Bindings[0].UpdateTime.Compare(bindRecords[j].Bindings[0].UpdateTime) + sort.Slice(bindings, func(i int, j int) bool { + cmpResult := bindings[i].UpdateTime.Compare(bindings[j].UpdateTime) if cmpResult == 0 { // Because the create time must be different, the result of sorting is stable. - cmpResult = bindRecords[i].Bindings[0].CreateTime.Compare(bindRecords[j].Bindings[0].CreateTime) + cmpResult = bindings[i].CreateTime.Compare(bindings[j].CreateTime) } return cmpResult > 0 }) - for _, bindData := range bindRecords { - for _, hint := range bindData.Bindings { - stmt, err := parser.ParseOneStmt(hint.BindSQL, hint.Charset, hint.Collation) - if err != nil { - return err - } - checker := visibleChecker{ - defaultDB: bindData.Db, - ctx: e.Ctx(), - is: e.is, - manager: privilege.GetPrivilegeManager(e.Ctx()), - ok: true, - } - stmt.Accept(&checker) - if !checker.ok { - continue - } - e.appendRow([]any{ - bindData.OriginalSQL, - hint.BindSQL, - bindData.Db, - hint.Status, - hint.CreateTime, - hint.UpdateTime, - hint.Charset, - hint.Collation, - hint.Source, - hint.SQLDigest, - hint.PlanDigest, - }) + for _, hint := range bindings { + stmt, err := parser.ParseOneStmt(hint.BindSQL, hint.Charset, hint.Collation) + if err != nil { + return err + } + checker := visibleChecker{ + defaultDB: hint.Db, + ctx: e.Ctx(), + is: e.is, + manager: privilege.GetPrivilegeManager(e.Ctx()), + ok: true, + } + stmt.Accept(&checker) + if !checker.ok { + continue } + e.appendRow([]any{ + hint.OriginalSQL, + hint.BindSQL, + hint.Db, + hint.Status, + hint.CreateTime, + hint.UpdateTime, + hint.Charset, + hint.Collation, + hint.Source, + hint.SQLDigest, + hint.PlanDigest, + }) } return nil } @@ -408,13 +383,11 @@ func (e *ShowExec) fetchShowBindingCacheStatus(ctx context.Context) error { handle := domain.GetDomain(e.Ctx()).BindHandle() - bindRecords := handle.GetAllBindRecord() + bindings := handle.GetAllGlobalBindings() numBindings := 0 - for _, bindRecord := range bindRecords { - for _, binding := range bindRecord.Bindings { - if binding.IsBindingEnabled() { - numBindings++ - } + for _, binding := range bindings { + if binding.IsBindingEnabled() { + numBindings++ } } @@ -1294,6 +1267,10 @@ func constructResultOfShowCreateTable(ctx sessionctx.Context, dbName *model.CISt buf.WriteString("*/") } + if tableInfo.AutoRandomBits > 0 && tableInfo.PreSplitRegions > 0 { + fmt.Fprintf(buf, " /*T! PRE_SPLIT_REGIONS=%d */", tableInfo.PreSplitRegions) + } + if len(tableInfo.Comment) > 0 { fmt.Fprintf(buf, " COMMENT='%s'", format.OutputFormat(tableInfo.Comment)) } @@ -2254,6 +2231,7 @@ func (e *ShowExec) fetchShowSessionStates(ctx context.Context) error { e.appendRow([]interface{}{stateJSON, tokenJSON}) return nil } + func fillOneImportJobInfo(info *importer.JobInfo, result *chunk.Chunk, importedRowCount int64) { fullTableName := utils.EncloseDBAndTable(info.TableSchema, info.TableName) result.AppendInt64(0, info.ID) @@ -2309,14 +2287,14 @@ func (e *ShowExec) fetchShowImportJobs(ctx context.Context) error { hasSuperPriv = pm.RequestVerification(e.Ctx().GetSessionVars().ActiveRoles, "", "", "", mysql.SuperPriv) } // we use sessionCtx from GetTaskManager, user ctx might not have system table privileges. - globalTaskManager, err := fstorage.GetTaskManager() + taskManager, err := fstorage.GetTaskManager() ctx = kv.WithInternalSourceType(ctx, kv.InternalDistTask) if err != nil { return err } if e.ImportJobID != nil { var info *importer.JobInfo - if err = globalTaskManager.WithNewSession(func(se sessionctx.Context) error { + if err = taskManager.WithNewSession(func(se sessionctx.Context) error { exec := se.(sqlexec.SQLExecutor) var err2 error info, err2 = importer.GetJob(ctx, exec, *e.ImportJobID, e.Ctx().GetSessionVars().User.String(), hasSuperPriv) @@ -2327,7 +2305,7 @@ func (e *ShowExec) fetchShowImportJobs(ctx context.Context) error { return handleImportJobInfo(ctx, info, e.result) } var infos []*importer.JobInfo - if err = globalTaskManager.WithNewSession(func(se sessionctx.Context) error { + if err = taskManager.WithNewSession(func(se sessionctx.Context) error { exec := se.(sqlexec.SQLExecutor) var err2 error infos, err2 = importer.GetAllViewableJobs(ctx, exec, e.Ctx().GetSessionVars().User.String(), hasSuperPriv) @@ -2358,7 +2336,7 @@ func tryFillViewColumnType(ctx context.Context, sctx sessionctx.Context, is info return runWithSystemSession(ctx, sctx, func(s sessionctx.Context) error { // Retrieve view columns info. planBuilder, _ := plannercore.NewPlanBuilder( - plannercore.PlanBuilderOptNoExecution{}).Init(s, is, &hint.BlockHintProcessor{}) + plannercore.PlanBuilderOptNoExecution{}).Init(s, is, hint.NewQBHintHandler(nil)) viewLogicalPlan, err := planBuilder.BuildDataSourceFromView(ctx, dbName, tbl, nil, nil) if err != nil { return err diff --git a/pkg/executor/show_stats_test.go b/pkg/executor/show_stats_test.go index 673c63f76a21f..12c09e6dc89ef 100644 --- a/pkg/executor/show_stats_test.go +++ b/pkg/executor/show_stats_test.go @@ -142,6 +142,25 @@ func TestShowStatsBuckets(t *testing.T) { result.Check(testkit.Rows("test t idx 1 0 1 1 (2020-01-01 00:00:00, 1) (2020-01-01 00:00:00, 1) 0")) } +func TestShowStatsBucketWithDateNullValue(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a datetime, b int, index ia(a,b));") + tk.MustExec("insert into t value('2023-12-27',1),(null, 2),('2023-12-28',3),(null,4);") + tk.MustExec("analyze table t with 0 topn;") + tk.MustQuery("explain format=\"brief\" select * from t where a > 1;").Check(testkit.Rows( + "IndexReader 3.20 root index:Selection", + "└─Selection 3.20 cop[tikv] gt(cast(test.t.a, double BINARY), 1)", + " └─IndexFullScan 4.00 cop[tikv] table:t, index:ia(a, b) keep order:false")) + tk.MustQuery("show stats_buckets where db_name = 'test' and Column_name = 'ia';").Check(testkit.Rows( + "test t ia 1 0 1 1 (NULL, 2) (NULL, 2) 0", + "test t ia 1 1 2 1 (NULL, 4) (NULL, 4) 0", + "test t ia 1 2 3 1 (2023-12-27 00:00:00, 1) (2023-12-27 00:00:00, 1) 0", + "test t ia 1 3 4 1 (2023-12-28 00:00:00, 3) (2023-12-28 00:00:00, 3) 0")) +} + func TestShowStatsHasNullValue(t *testing.T) { store := testkit.CreateMockStore(t) diff --git a/pkg/executor/shuffle.go b/pkg/executor/shuffle.go index 3e1188868313e..cb7b02b6eac8b 100644 --- a/pkg/executor/shuffle.go +++ b/pkg/executor/shuffle.go @@ -17,6 +17,7 @@ package executor import ( "context" "sync" + "time" "github.com/pingcap/errors" "github.com/pingcap/failpoint" @@ -117,7 +118,7 @@ func (e *ShuffleExec) Open(ctx context.Context) error { e.prepared = false e.finishCh = make(chan struct{}, 1) - e.outputCh = make(chan *shuffleOutput, e.concurrency) + e.outputCh = make(chan *shuffleOutput, e.concurrency+len(e.dataSources)) for _, w := range e.workers { w.finishCh = e.finishCh @@ -174,7 +175,7 @@ func (e *ShuffleExec) Close() error { } } // close child executor of each worker - if err := w.childExec.Close(); err != nil && firstErr == nil { + if err := exec.Close(w.childExec); err != nil && firstErr == nil { firstErr = err } } @@ -191,7 +192,7 @@ func (e *ShuffleExec) Close() error { // close dataSources for _, dataSource := range e.dataSources { - if err := dataSource.Close(); err != nil && firstErr == nil { + if err := exec.Close(dataSource); err != nil && firstErr == nil { firstErr = err } } @@ -203,13 +204,13 @@ func (e *ShuffleExec) Close() error { } func (e *ShuffleExec) prepare4ParallelExec(ctx context.Context) { + waitGroup := &sync.WaitGroup{} + waitGroup.Add(len(e.workers) + len(e.dataSources)) // create a goroutine for each dataSource to fetch and split data for i := range e.dataSources { - go e.fetchDataAndSplit(ctx, i) + go e.fetchDataAndSplit(ctx, i, waitGroup) } - waitGroup := &sync.WaitGroup{} - waitGroup.Add(len(e.workers)) for _, w := range e.workers { go w.run(ctx, waitGroup) } @@ -260,7 +261,7 @@ func recoveryShuffleExec(output chan *shuffleOutput, r interface{}) { logutil.BgLogger().Error("shuffle panicked", zap.Error(err), zap.Stack("stack")) } -func (e *ShuffleExec) fetchDataAndSplit(ctx context.Context, dataSourceIndex int) { +func (e *ShuffleExec) fetchDataAndSplit(ctx context.Context, dataSourceIndex int, waitGroup *sync.WaitGroup) { var ( err error workerIndices []int @@ -275,8 +276,16 @@ func (e *ShuffleExec) fetchDataAndSplit(ctx context.Context, dataSourceIndex int for _, w := range e.workers { close(w.receivers[dataSourceIndex].inputCh) } + waitGroup.Done() }() + failpoint.Inject("shuffleExecFetchDataAndSplit", func(val failpoint.Value) { + if val.(bool) { + time.Sleep(100 * time.Millisecond) + panic("shuffleExecFetchDataAndSplitPanic") + } + }) + for { err = exec.Next(ctx, e.dataSources[dataSourceIndex], chk) if err != nil { @@ -391,6 +400,7 @@ func (e *shuffleWorker) run(ctx context.Context, waitGroup *sync.WaitGroup) { waitGroup.Done() }() + failpoint.Inject("shuffleWorkerRun", nil) for { select { case <-e.finishCh: diff --git a/pkg/executor/simple.go b/pkg/executor/simple.go index 8715d9d14f23b..a191697c33abd 100644 --- a/pkg/executor/simple.go +++ b/pkg/executor/simple.go @@ -615,9 +615,9 @@ func (e *SimpleExec) executeBegin(ctx context.Context, s *ast.BeginStmt) error { if s.ReadOnly { noopFuncsMode := e.Ctx().GetSessionVars().NoopFuncsMode if s.AsOf == nil && noopFuncsMode != variable.OnInt { - err := expression.ErrFunctionsNoopImpl.GenWithStackByArgs("READ ONLY") + err := expression.ErrFunctionsNoopImpl.FastGenByArgs("READ ONLY") if noopFuncsMode == variable.OffInt { - return err + return errors.Trace(err) } e.Ctx().GetSessionVars().StmtCtx.AppendWarning(err) } @@ -1144,7 +1144,7 @@ func (e *SimpleExec) executeCreateUser(ctx context.Context, s *ast.CreateUserStm } return exeerrors.ErrCannotUser.GenWithStackByArgs("CREATE USER", user) } - err := infoschema.ErrUserAlreadyExists.GenWithStackByArgs(user) + err := infoschema.ErrUserAlreadyExists.FastGenByArgs(user) e.Ctx().GetSessionVars().StmtCtx.AppendNote(err) continue } @@ -1916,7 +1916,7 @@ func (e *SimpleExec) executeAlterUser(ctx context.Context, s *ast.AlterUserStmt) switch authTokenOptionHandler { case noNeedAuthTokenOptions: if len(authTokenOptions) > 0 { - err := errors.New("TOKEN_ISSUER is not needed for the auth plugin") + err := errors.NewNoStackError("TOKEN_ISSUER is not needed for the auth plugin") e.Ctx().GetSessionVars().StmtCtx.AppendWarning(err) } case OptionalAuthTokenOptions: @@ -1931,7 +1931,7 @@ func (e *SimpleExec) executeAlterUser(ctx context.Context, s *ast.AlterUserStmt) fields = append(fields, alterField{authTokenOption.Type.String() + "=%?", authTokenOption.Value}) } } else { - err := errors.New("Auth plugin 'tidb_auth_plugin' needs TOKEN_ISSUER") + err := errors.NewNoStackError("Auth plugin 'tidb_auth_plugin' needs TOKEN_ISSUER") e.Ctx().GetSessionVars().StmtCtx.AppendWarning(err) } } @@ -1978,7 +1978,7 @@ func (e *SimpleExec) executeAlterUser(ctx context.Context, s *ast.AlterUserStmt) return exeerrors.ErrCannotUser.GenWithStackByArgs("ALTER USER", strings.Join(failedUsers, ",")) } for _, user := range failedUsers { - err := infoschema.ErrUserDropExists.GenWithStackByArgs(user) + err := infoschema.ErrUserDropExists.FastGenByArgs(user) e.Ctx().GetSessionVars().StmtCtx.AppendNote(err) } } @@ -2239,7 +2239,7 @@ func (e *SimpleExec) executeDropUser(ctx context.Context, s *ast.DropUserStmt) e failedUsers = append(failedUsers, user.String()) break } - e.Ctx().GetSessionVars().StmtCtx.AppendNote(infoschema.ErrUserDropExists.GenWithStackByArgs(user)) + e.Ctx().GetSessionVars().StmtCtx.AppendNote(infoschema.ErrUserDropExists.FastGenByArgs(user)) } // Certain users require additional privileges in order to be modified. @@ -2474,7 +2474,7 @@ func (e *SimpleExec) executeSetPwd(ctx context.Context, s *ast.SetPwdStmt) error case mysql.AuthCachingSha2Password, mysql.AuthTiDBSM3Password: pwd = auth.NewHashPassword(s.Password, authplugin) case mysql.AuthSocket: - e.Ctx().GetSessionVars().StmtCtx.AppendNote(exeerrors.ErrSetPasswordAuthPlugin.GenWithStackByArgs(u, h)) + e.Ctx().GetSessionVars().StmtCtx.AppendNote(exeerrors.ErrSetPasswordAuthPlugin.FastGenByArgs(u, h)) pwd = "" default: pwd = auth.EncodePassword(s.Password) @@ -2541,7 +2541,7 @@ func (e *SimpleExec) executeKillStmt(ctx context.Context, s *ast.KillStmt) error } sm.Kill(s.ConnectionID, s.Query, false) } else { - err := errors.New("Invalid operation. Please use 'KILL TIDB [CONNECTION | QUERY] [connectionID | CONNECTION_ID()]' instead") + err := errors.NewNoStackError("Invalid operation. Please use 'KILL TIDB [CONNECTION | QUERY] [connectionID | CONNECTION_ID()]' instead") e.Ctx().GetSessionVars().StmtCtx.AppendWarning(err) } return nil @@ -2560,7 +2560,7 @@ func (e *SimpleExec) executeKillStmt(ctx context.Context, s *ast.KillStmt) error gcid, isTruncated, err := globalconn.ParseConnID(s.ConnectionID) if err != nil { - err1 := errors.New("Parse ConnectionID failed: " + err.Error()) + err1 := errors.NewNoStackError("Parse ConnectionID failed: " + err.Error()) e.Ctx().GetSessionVars().StmtCtx.AppendWarning(err1) return nil } @@ -2569,14 +2569,14 @@ func (e *SimpleExec) executeKillStmt(ctx context.Context, s *ast.KillStmt) error logutil.BgLogger().Warn(message, zap.Uint64("conn", s.ConnectionID)) // Notice that this warning cannot be seen if KILL is triggered by "CTRL-C" of mysql client, // as the KILL is sent by a new connection. - err := errors.New(message) + err := errors.NewNoStackError(message) e.Ctx().GetSessionVars().StmtCtx.AppendWarning(err) return nil } if gcid.ServerID != sm.ServerID() { if err := killRemoteConn(ctx, e.Ctx(), &gcid, s.Query); err != nil { - err1 := errors.New("KILL remote connection failed: " + err.Error()) + err1 := errors.NewNoStackError("KILL remote connection failed: " + err.Error()) e.Ctx().GetSessionVars().StmtCtx.AppendWarning(err1) } } else { @@ -2789,6 +2789,8 @@ func (e *SimpleExec) executeAdmin(s *ast.AdminStmt) error { return e.executeAdminFlushPlanCache(s) case ast.AdminSetBDRRole: return e.executeAdminSetBDRRole(s) + case ast.AdminUnsetBDRRole: + return e.executeAdminUnsetBDRRole() } return nil } @@ -2811,7 +2813,7 @@ func (e *SimpleExec) executeAdminFlushPlanCache(s *ast.AdminStmt) error { return errors.New("Do not support the 'admin flush global scope.'") } if !e.Ctx().GetSessionVars().EnablePreparedPlanCache { - e.Ctx().GetSessionVars().StmtCtx.AppendWarning(errors.New("The plan cache is disable. So there no need to flush the plan cache")) + e.Ctx().GetSessionVars().StmtCtx.AppendWarning(errors.NewNoStackError("The plan cache is disable. So there no need to flush the plan cache")) return nil } now := types.NewTime(types.FromGoTime(time.Now().In(e.Ctx().GetSessionVars().StmtCtx.TimeZone())), mysql.TypeTimestamp, 3) @@ -2830,9 +2832,19 @@ func (e *SimpleExec) executeAdminSetBDRRole(s *ast.AdminStmt) error { return errors.New("This AdminStmt is not ADMIN SET BDR_ROLE") } - return kv.RunInNewTxn(kv.WithInternalSourceType(context.Background(), kv.InternalTxnAdmin), e.Ctx().GetStore(), true, func(ctx context.Context, txn kv.Transaction) error { - return errors.Trace(meta.NewMeta(txn).SetBDRRole(string(s.BDRRole))) - }) + txn, err := e.Ctx().Txn(true) + if err != nil { + return errors.Trace(err) + } + return errors.Trace(meta.NewMeta(txn).SetBDRRole(string(s.BDRRole))) +} + +func (e *SimpleExec) executeAdminUnsetBDRRole() error { + txn, err := e.Ctx().Txn(true) + if err != nil { + return errors.Trace(err) + } + return errors.Trace(meta.NewMeta(txn).ClearBDRRole()) } func (e *SimpleExec) executeSetResourceGroupName(s *ast.SetResourceGroupStmt) error { diff --git a/pkg/executor/slow_query.go b/pkg/executor/slow_query.go index 43416a23cea8d..1a10f08e12e1b 100644 --- a/pkg/executor/slow_query.go +++ b/pkg/executor/slow_query.go @@ -124,8 +124,8 @@ func (e *slowQueryRetriever) initialize(ctx context.Context, sctx sessionctx.Con if e.extractor != nil { e.checker.enableTimeCheck = e.extractor.Enable for _, tr := range e.extractor.TimeRanges { - startTime := types.NewTime(types.FromGoTime(tr.StartTime), mysql.TypeDatetime, types.MaxFsp) - endTime := types.NewTime(types.FromGoTime(tr.EndTime), mysql.TypeDatetime, types.MaxFsp) + startTime := types.NewTime(types.FromGoTime(tr.StartTime.In(sctx.GetSessionVars().Location())), mysql.TypeDatetime, types.MaxFsp) + endTime := types.NewTime(types.FromGoTime(tr.EndTime.In(sctx.GetSessionVars().Location())), mysql.TypeDatetime, types.MaxFsp) timeRange := &timeRange{ startTime: startTime, endTime: endTime, @@ -689,17 +689,13 @@ func getColumnValueFactoryByName(colName string, columnIdx int) (slowQueryColumn if err != nil { return false, err } - timeValue := types.NewTime(types.FromGoTime(t), mysql.TypeTimestamp, types.MaxFsp) + timeValue := types.NewTime(types.FromGoTime(t.In(tz)), mysql.TypeTimestamp, types.MaxFsp) if checker != nil { valid := checker.isTimeValid(timeValue) if !valid { return valid, nil } } - if t.Location() != tz { - t = t.In(tz) - timeValue = types.NewTime(types.FromGoTime(t), mysql.TypeTimestamp, types.MaxFsp) - } row[columnIdx] = types.NewTimeDatum(timeValue) return true, nil }, nil @@ -749,7 +745,8 @@ func getColumnValueFactoryByName(colName string, columnIdx int) (slowQueryColumn execdetails.CopTimeStr, execdetails.ProcessTimeStr, execdetails.WaitTimeStr, execdetails.BackoffTimeStr, execdetails.LockKeysTimeStr, variable.SlowLogCopProcAvg, variable.SlowLogCopProcP90, variable.SlowLogCopProcMax, variable.SlowLogCopWaitAvg, variable.SlowLogCopWaitP90, variable.SlowLogCopWaitMax, variable.SlowLogKVTotal, - variable.SlowLogPDTotal, variable.SlowLogBackoffTotal, variable.SlowLogWriteSQLRespTotal: + variable.SlowLogPDTotal, variable.SlowLogBackoffTotal, variable.SlowLogWriteSQLRespTotal, variable.SlowLogRRU, + variable.SlowLogWRU, variable.SlowLogWaitRUDuration: return func(row []types.Datum, value string, tz *time.Location, checker *slowLogChecker) (valid bool, err error) { v, err := strconv.ParseFloat(value, 64) if err != nil { @@ -760,7 +757,8 @@ func getColumnValueFactoryByName(colName string, columnIdx int) (slowQueryColumn }, nil case variable.SlowLogUserStr, variable.SlowLogHostStr, execdetails.BackoffTypesStr, variable.SlowLogDBStr, variable.SlowLogIndexNamesStr, variable.SlowLogDigestStr, variable.SlowLogStatsInfoStr, variable.SlowLogCopProcAddr, variable.SlowLogCopWaitAddr, variable.SlowLogPlanDigest, - variable.SlowLogPrevStmt, variable.SlowLogQuerySQLStr, variable.SlowLogWarnings, variable.SlowLogSessAliasStr: + variable.SlowLogPrevStmt, variable.SlowLogQuerySQLStr, variable.SlowLogWarnings, variable.SlowLogSessAliasStr, + variable.SlowLogResourceGroup: return func(row []types.Datum, value string, tz *time.Location, checker *slowLogChecker) (valid bool, err error) { row[columnIdx] = types.NewStringDatum(value) return true, nil diff --git a/pkg/executor/slow_query_sql_test.go b/pkg/executor/slow_query_sql_test.go index 417a3aa59f726..fb39ebfbbd320 100644 --- a/pkg/executor/slow_query_sql_test.go +++ b/pkg/executor/slow_query_sql_test.go @@ -278,6 +278,7 @@ SELECT original_sql, bind_sql, default_db, status, create_time, update_time, cha store := testkit.CreateMockStore(t) tk := testkit.NewTestKit(t, store) + tk.MustExec("set @@time_zone='+08:00'") tk.MustExec(fmt.Sprintf("set @@tidb_slow_query_file='%v'", f.Name())) tk.MustQuery("select count(*) from `information_schema`.`slow_query` where time > '2020-10-16 20:08:13' and time < '2020-10-16 21:08:13'").Check(testkit.Rows("1")) tk.MustQuery("select count(*) from `information_schema`.`slow_query` where time > '2019-10-13 20:08:13' and time < '2020-10-16 21:08:13'").Check(testkit.Rows("2")) diff --git a/pkg/executor/slow_query_test.go b/pkg/executor/slow_query_test.go index fa15d46b59689..8d6a1d19f17ec 100644 --- a/pkg/executor/slow_query_test.go +++ b/pkg/executor/slow_query_test.go @@ -138,6 +138,10 @@ func TestParseSlowLogFile(t *testing.T) { # Plan_from_binding: true # Succ: false # IsExplicitTxn: true +# Resource_group: default +# Request_unit_read: 2.158 +# Request_unit_write: 2.123 +# Time_queued_by_rc: 0.05 # Plan_digest: 60e9378c746d9a2be1c791047e008967cf252eb6de9167ad3aa6098fa2d523f4 # Prev_stmt: update t set i = 1; use test; @@ -164,7 +168,7 @@ select * from t;` `0,0,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,0,0,0.38,0.021,0,0,0,1,637,0,10,10,10,10,100,,,1,42a1c8aae6f133e934d4bf0147491709a8812ea05ff8819ec522780fe657b772,t1:1,t2:2,` + `0.1,0.2,0.03,127.0.0.1:20160,0.05,0.6,0.8,0.0.0.0:20160,70724,65536,0,0,0,0,0,,` + `Cop_backoff_regionMiss_total_times: 200 Cop_backoff_regionMiss_total_time: 0.2 Cop_backoff_regionMiss_max_time: 0.2 Cop_backoff_regionMiss_max_addr: 127.0.0.1 Cop_backoff_regionMiss_avg_time: 0.2 Cop_backoff_regionMiss_p90_time: 0.2 Cop_backoff_rpcPD_total_times: 200 Cop_backoff_rpcPD_total_time: 0.2 Cop_backoff_rpcPD_max_time: 0.2 Cop_backoff_rpcPD_max_addr: 127.0.0.1 Cop_backoff_rpcPD_avg_time: 0.2 Cop_backoff_rpcPD_p90_time: 0.2 Cop_backoff_rpcTiKV_total_times: 200 Cop_backoff_rpcTiKV_total_time: 0.2 Cop_backoff_rpcTiKV_max_time: 0.2 Cop_backoff_rpcTiKV_max_addr: 127.0.0.1 Cop_backoff_rpcTiKV_avg_time: 0.2 Cop_backoff_rpcTiKV_p90_time: 0.2,` + - `0,0,1,0,1,1,0,,60e9378c746d9a2be1c791047e008967cf252eb6de9167ad3aa6098fa2d523f4,` + + `0,0,1,0,1,1,0,default,2.158,2.123,0.05,,60e9378c746d9a2be1c791047e008967cf252eb6de9167ad3aa6098fa2d523f4,` + `,update t set i = 1;,select * from t;` require.Equal(t, expectRecordString, recordString) @@ -187,7 +191,7 @@ select * from t;` `0,0,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,0,0,0.38,0.021,0,0,0,1,637,0,10,10,10,10,100,,,1,42a1c8aae6f133e934d4bf0147491709a8812ea05ff8819ec522780fe657b772,t1:1,t2:2,` + `0.1,0.2,0.03,127.0.0.1:20160,0.05,0.6,0.8,0.0.0.0:20160,70724,65536,0,0,0,0,0,,` + `Cop_backoff_regionMiss_total_times: 200 Cop_backoff_regionMiss_total_time: 0.2 Cop_backoff_regionMiss_max_time: 0.2 Cop_backoff_regionMiss_max_addr: 127.0.0.1 Cop_backoff_regionMiss_avg_time: 0.2 Cop_backoff_regionMiss_p90_time: 0.2 Cop_backoff_rpcPD_total_times: 200 Cop_backoff_rpcPD_total_time: 0.2 Cop_backoff_rpcPD_max_time: 0.2 Cop_backoff_rpcPD_max_addr: 127.0.0.1 Cop_backoff_rpcPD_avg_time: 0.2 Cop_backoff_rpcPD_p90_time: 0.2 Cop_backoff_rpcTiKV_total_times: 200 Cop_backoff_rpcTiKV_total_time: 0.2 Cop_backoff_rpcTiKV_max_time: 0.2 Cop_backoff_rpcTiKV_max_addr: 127.0.0.1 Cop_backoff_rpcTiKV_avg_time: 0.2 Cop_backoff_rpcTiKV_p90_time: 0.2,` + - `0,0,1,0,1,1,0,,60e9378c746d9a2be1c791047e008967cf252eb6de9167ad3aa6098fa2d523f4,` + + `0,0,1,0,1,1,0,default,2.158,2.123,0.05,,60e9378c746d9a2be1c791047e008967cf252eb6de9167ad3aa6098fa2d523f4,` + `,update t set i = 1;,select * from t;` require.Equal(t, expectRecordString, recordString) diff --git a/pkg/executor/sortexec/BUILD.bazel b/pkg/executor/sortexec/BUILD.bazel index 5c1470e61c09e..1612b77907ee5 100644 --- a/pkg/executor/sortexec/BUILD.bazel +++ b/pkg/executor/sortexec/BUILD.bazel @@ -4,6 +4,9 @@ go_library( name = "sortexec", srcs = [ "sort.go", + "sort_partition.go", + "sort_spill.go", + "sort_util.go", "topn.go", ], importpath = "github.com/pingcap/tidb/pkg/executor/sortexec", @@ -14,11 +17,16 @@ go_library( "//pkg/planner/core", "//pkg/planner/util", "//pkg/sessionctx/variable", + "//pkg/types", + "//pkg/util", "//pkg/util/chunk", "//pkg/util/disk", + "//pkg/util/logutil", "//pkg/util/memory", "//pkg/util/sqlkiller", + "@com_github_pingcap_errors//:errors", "@com_github_pingcap_failpoint//:failpoint", + "@org_uber_go_zap//:zap", ], ) @@ -27,7 +35,7 @@ go_test( timeout = "short", srcs = ["sort_test.go"], flaky = True, - shard_count = 3, + shard_count = 4, deps = [ "//pkg/config", "//pkg/sessionctx/variable", @@ -54,7 +62,9 @@ go_test( "//pkg/planner/util", "//pkg/sessionctx/variable", "//pkg/testkit", + "//pkg/types", "//pkg/util", + "//pkg/util/chunk", "//pkg/util/memory", "//pkg/util/mock", "@com_github_pingcap_failpoint//:failpoint", diff --git a/pkg/executor/sortexec/sort.go b/pkg/executor/sortexec/sort.go index ce26bac26b802..1f46e164fc6af 100644 --- a/pkg/executor/sortexec/sort.go +++ b/pkg/executor/sortexec/sort.go @@ -17,13 +17,14 @@ package sortexec import ( "container/heap" "context" - "errors" + "time" "github.com/pingcap/failpoint" "github.com/pingcap/tidb/pkg/executor/internal/exec" "github.com/pingcap/tidb/pkg/expression" "github.com/pingcap/tidb/pkg/planner/util" "github.com/pingcap/tidb/pkg/sessionctx/variable" + "github.com/pingcap/tidb/pkg/types" "github.com/pingcap/tidb/pkg/util/chunk" "github.com/pingcap/tidb/pkg/util/disk" "github.com/pingcap/tidb/pkg/util/memory" @@ -35,7 +36,6 @@ type SortExec struct { exec.BaseExecutor ByItems []*util.ByItems - Idx int fetched bool ExecSchema *expression.Schema @@ -43,36 +43,37 @@ type SortExec struct { keyColumns []int // keyCmpFuncs is used to compare each ByItem. keyCmpFuncs []chunk.CompareFunc - // rowChunks is the chunks to store row values. - rowChunks *chunk.SortedRowContainer + + curPartition *sortPartition + + // We can't spill if size of data is lower than the limit + spillLimit int64 memTracker *memory.Tracker diskTracker *disk.Tracker - // PartitionList is the chunks to store row values for partitions. Every partition is a sorted list. - PartitionList []*chunk.SortedRowContainer + // sortPartitions is the chunks to store row values for partitions. Every partition is a sorted list. + sortPartitions []*sortPartition // multiWayMerge uses multi-way merge for spill disk. // The multi-way merge algorithm can refer to https://en.wikipedia.org/wiki/K-way_merge_algorithm multiWayMerge *multiWayMerge // spillAction save the Action for spill disk. - spillAction *chunk.SortAndSpillDiskAction + spillAction *sortPartitionSpillDiskAction + + enableTmpStorageOnOOM bool } // Close implements the Executor Close interface. func (e *SortExec) Close() error { - for _, container := range e.PartitionList { - err := container.Close() + for _, partition := range e.sortPartitions { + err := partition.close() if err != nil { return err } } - e.PartitionList = e.PartitionList[:0] + e.sortPartitions = e.sortPartitions[:0] - if e.rowChunks != nil { - e.memTracker.Consume(-e.rowChunks.GetMemTracker().BytesConsumed()) - e.rowChunks = nil - } e.memTracker = nil e.diskTracker = nil e.multiWayMerge = nil @@ -80,23 +81,24 @@ func (e *SortExec) Close() error { e.spillAction.SetFinished() } e.spillAction = nil - return e.Children(0).Close() + return exec.Close(e.Children(0)) } // Open implements the Executor Open interface. func (e *SortExec) Open(ctx context.Context) error { e.fetched = false - e.Idx = 0 + e.enableTmpStorageOnOOM = variable.EnableTmpStorageOnOOM.Load() // To avoid duplicated initialization for TopNExec. if e.memTracker == nil { e.memTracker = memory.NewTracker(e.ID(), -1) e.memTracker.AttachTo(e.Ctx().GetSessionVars().StmtCtx.MemTracker) + e.spillLimit = e.Ctx().GetSessionVars().MemTracker.GetBytesLimit() / 10 e.diskTracker = memory.NewTracker(e.ID(), -1) e.diskTracker.AttachTo(e.Ctx().GetSessionVars().StmtCtx.DiskTracker) } - e.PartitionList = e.PartitionList[:0] - return exec.Open(ctx, e.Children(0)) + e.sortPartitions = e.sortPartitions[:0] + return e.Children(0).Open(ctx) } // Next implements the Executor Next interface. @@ -119,57 +121,162 @@ func (e *SortExec) Next(ctx context.Context, req *chunk.Chunk) error { e.fetched = true } - if len(e.PartitionList) == 0 { + sortPartitionListLen := len(e.sortPartitions) + if sortPartitionListLen == 0 { return nil } - if len(e.PartitionList) > 1 { - if err := e.externalSorting(req); err != nil { + + if sortPartitionListLen == 1 { + if err := e.onePartitionSorting(req); err != nil { return err } } else { - for !req.IsFull() && e.Idx < e.PartitionList[0].NumRow() { - _, _, err := e.PartitionList[0].GetSortedRowAndAlwaysAppendToChunk(e.Idx, req) - if err != nil { - return err - } - e.Idx++ + if err := e.externalSorting(req); err != nil { + return err + } + } + return nil +} + +func (e *SortExec) initExternalSorting() error { + e.multiWayMerge = &multiWayMerge{e.lessRow, make([]rowWithPartition, 0, len(e.sortPartitions))} + for i := 0; i < len(e.sortPartitions); i++ { + // We should always get row here + row, err := e.sortPartitions[i].getNextSortedRow() + if err != nil { + return err } + + e.multiWayMerge.elements = append(e.multiWayMerge.elements, rowWithPartition{row: row, partitionID: i}) + } + heap.Init(e.multiWayMerge) + return nil +} + +func (e *SortExec) onePartitionSorting(req *chunk.Chunk) (err error) { + err = e.sortPartitions[0].checkError() + if err != nil { + return err + } + + for !req.IsFull() { + row, err := e.sortPartitions[0].getNextSortedRow() + if err != nil { + return err + } + + if row.IsEmpty() { + return nil + } + + req.AppendRow(row) } return nil } func (e *SortExec) externalSorting(req *chunk.Chunk) (err error) { - if e.multiWayMerge == nil { - e.multiWayMerge = &multiWayMerge{e.lessRow, e.compressRow, make([]partitionPointer, 0, len(e.PartitionList))} - for i := 0; i < len(e.PartitionList); i++ { - chk := chunk.New(exec.RetTypes(e), 1, 1) + // We only need to check error for the last partition as previous partitions + // have been checked when we call `switchToNewSortPartition` function. + err = e.sortPartitions[len(e.sortPartitions)-1].checkError() + if err != nil { + return err + } - row, _, err := e.PartitionList[i].GetSortedRowAndAlwaysAppendToChunk(0, chk) - if err != nil { - return err - } - e.multiWayMerge.elements = append(e.multiWayMerge.elements, partitionPointer{chk: chk, row: row, partitionID: i, consumed: 0}) + if e.multiWayMerge == nil { + err := e.initExternalSorting() + if err != nil { + return err } - heap.Init(e.multiWayMerge) } for !req.IsFull() && e.multiWayMerge.Len() > 0 { - partitionPtr := e.multiWayMerge.elements[0] - req.AppendRow(partitionPtr.row) - partitionPtr.consumed++ - partitionPtr.chk.Reset() - if partitionPtr.consumed >= e.PartitionList[partitionPtr.partitionID].NumRow() { + // Get and insert data + element := e.multiWayMerge.elements[0] + req.AppendRow(element.row) + + // Get a new row from that partition which inserted data belongs to + partitionID := element.partitionID + row, err := e.sortPartitions[partitionID].getNextSortedRow() + if err != nil { + return err + } + + if row.IsEmpty() { + // All data in this partition have been consumed heap.Remove(e.multiWayMerge, 0) continue } - partitionPtr.row, _, err = e.PartitionList[partitionPtr.partitionID]. - GetSortedRowAndAlwaysAppendToChunk(partitionPtr.consumed, partitionPtr.chk) + e.multiWayMerge.elements[0].row = row + heap.Fix(e.multiWayMerge, 0) + } + return nil +} + +func (e *SortExec) switchToNewSortPartition(fields []*types.FieldType, byItemsDesc []bool, appendPartition bool) error { + if appendPartition { + // Put the full partition into list + e.sortPartitions = append(e.sortPartitions, e.curPartition) + } + + if e.curPartition != nil { + err := e.curPartition.checkError() + if err != nil { + return err + } + } + + e.curPartition = newSortPartition(fields, byItemsDesc, e.keyColumns, e.keyCmpFuncs, e.spillLimit) + e.curPartition.getMemTracker().AttachTo(e.memTracker) + e.curPartition.getMemTracker().SetLabel(memory.LabelForRowChunks) + e.spillAction = e.curPartition.actionSpill() + if e.enableTmpStorageOnOOM { + e.curPartition.getDiskTracker().AttachTo(e.diskTracker) + e.curPartition.getDiskTracker().SetLabel(memory.LabelForRowChunks) + e.Ctx().GetSessionVars().MemTracker.FallbackOldAndSetNewAction(e.spillAction) + } + return nil +} + +func (e *SortExec) storeChunk(chk *chunk.Chunk, fields []*types.FieldType, byItemsDesc []bool) error { + err := e.curPartition.checkError() + if err != nil { + return err + } + + if !e.curPartition.add(chk) { + err := e.switchToNewSortPartition(fields, byItemsDesc, true) + if err != nil { + return err + } + + if !e.curPartition.add(chk) { + return errFailToAddChunk + } + } + return nil +} + +func (e *SortExec) handleCurrentPartitionBeforeExit() error { + err := e.checkError() + if err != nil { + return err + } + + err = e.curPartition.sort() + if err != nil { + return err + } + + return nil +} + +func (e *SortExec) checkError() error { + for _, partition := range e.sortPartitions { + err := partition.checkError() if err != nil { return err } - e.multiWayMerge.elements[0] = partitionPtr - heap.Fix(e.multiWayMerge, 0) } return nil } @@ -180,54 +287,42 @@ func (e *SortExec) fetchRowChunks(ctx context.Context) error { for i, byItem := range e.ByItems { byItemsDesc[i] = byItem.Desc } - e.rowChunks = chunk.NewSortedRowContainer(fields, e.MaxChunkSize(), byItemsDesc, e.keyColumns, e.keyCmpFuncs) - e.rowChunks.GetMemTracker().AttachTo(e.memTracker) - e.rowChunks.GetMemTracker().SetLabel(memory.LabelForRowChunks) - if variable.EnableTmpStorageOnOOM.Load() { - e.spillAction = e.rowChunks.ActionSpill() - failpoint.Inject("testSortedRowContainerSpill", func(val failpoint.Value) { - if val.(bool) { - e.spillAction = e.rowChunks.ActionSpillForTest() - defer e.spillAction.WaitForTest() - } - }) - e.Ctx().GetSessionVars().MemTracker.FallbackOldAndSetNewAction(e.spillAction) - e.rowChunks.GetDiskTracker().AttachTo(e.diskTracker) - e.rowChunks.GetDiskTracker().SetLabel(memory.LabelForRowChunks) + + err := e.switchToNewSortPartition(fields, byItemsDesc, false) + if err != nil { + return err } + for { chk := exec.TryNewCacheChunk(e.Children(0)) err := exec.Next(ctx, e.Children(0), chk) if err != nil { return err } - rowCount := chk.NumRows() - if rowCount == 0 { + if chk.NumRows() == 0 { break } - if err := e.rowChunks.Add(chk); err != nil { - if errors.Is(err, chunk.ErrCannotAddBecauseSorted) { - e.PartitionList = append(e.PartitionList, e.rowChunks) - e.rowChunks = chunk.NewSortedRowContainer(fields, e.MaxChunkSize(), byItemsDesc, e.keyColumns, e.keyCmpFuncs) - e.rowChunks.GetMemTracker().AttachTo(e.memTracker) - e.rowChunks.GetMemTracker().SetLabel(memory.LabelForRowChunks) - e.rowChunks.GetDiskTracker().AttachTo(e.diskTracker) - e.rowChunks.GetDiskTracker().SetLabel(memory.LabelForRowChunks) - e.spillAction = e.rowChunks.ActionSpill() - failpoint.Inject("testSortedRowContainerSpill", func(val failpoint.Value) { - if val.(bool) { - e.spillAction = e.rowChunks.ActionSpillForTest() - defer e.spillAction.WaitForTest() - } - }) - e.Ctx().GetSessionVars().MemTracker.FallbackOldAndSetNewAction(e.spillAction) - err = e.rowChunks.Add(chk) - } - if err != nil { - return err - } + + err = e.storeChunk(chk, fields, byItemsDesc) + if err != nil { + return err } + + failpoint.Inject("unholdSyncLock", func(val failpoint.Value) { + if val.(bool) { + // Ensure that spill can get `syncLock`. + time.Sleep(1 * time.Millisecond) + } + }) } + + failpoint.Inject("waitForSpill", func(val failpoint.Value) { + if val.(bool) { + // Ensure that spill is triggered before returning data. + time.Sleep(50 * time.Millisecond) + } + }) + failpoint.Inject("SignalCheckpointForSort", func(val failpoint.Value) { if val.(bool) { if e.Ctx().GetSessionVars().ConnectionID == 123456 { @@ -235,13 +330,14 @@ func (e *SortExec) fetchRowChunks(ctx context.Context) error { } } }) - if e.rowChunks.NumRow() > 0 { - err := e.rowChunks.Sort() - if err != nil { - return err - } - e.PartitionList = append(e.PartitionList, e.rowChunks) + + err = e.handleCurrentPartitionBeforeExit() + if err != nil { + return err } + + e.sortPartitions = append(e.sortPartitions, e.curPartition) + e.curPartition = nil return nil } @@ -291,38 +387,33 @@ func (e *SortExec) compressRow(rowI, rowJ chunk.Row) int { return 0 } -type partitionPointer struct { - chk *chunk.Chunk - row chunk.Row - partitionID int - consumed int -} - -type multiWayMerge struct { - lessRowFunction func(rowI chunk.Row, rowJ chunk.Row) bool - compressRowFunction func(rowI chunk.Row, rowJ chunk.Row) int - elements []partitionPointer +// IsSpillTriggeredInOnePartitionForTest tells if spill is triggered in a specific partition, it's only used in test. +func (e *SortExec) IsSpillTriggeredInOnePartitionForTest(idx int) bool { + return e.sortPartitions[idx].isSpillTriggered() } -func (h *multiWayMerge) Less(i, j int) bool { - rowI := h.elements[i].row - rowJ := h.elements[j].row - return h.lessRowFunction(rowI, rowJ) +// GetRowNumInOnePartitionDiskForTest returns number of rows a partition holds in disk, it's only used in test. +func (e *SortExec) GetRowNumInOnePartitionDiskForTest(idx int) int64 { + return e.sortPartitions[idx].numRowInDiskForTest() } -func (h *multiWayMerge) Len() int { - return len(h.elements) +// GetRowNumInOnePartitionMemoryForTest returns number of rows a partition holds in memory, it's only used in test. +func (e *SortExec) GetRowNumInOnePartitionMemoryForTest(idx int) int64 { + return e.sortPartitions[idx].numRowInMemoryForTest() } -func (*multiWayMerge) Push(interface{}) { - // Should never be called. +// GetSortPartitionListLenForTest returns the number of partitions, it's only used in test. +func (e *SortExec) GetSortPartitionListLenForTest() int { + return len(e.sortPartitions) } -func (h *multiWayMerge) Pop() interface{} { - h.elements = h.elements[:len(h.elements)-1] - return nil -} - -func (h *multiWayMerge) Swap(i, j int) { - h.elements[i], h.elements[j] = h.elements[j], h.elements[i] +// GetSortMetaForTest returns some sort meta, it's only used in test. +func (e *SortExec) GetSortMetaForTest() (keyColumns []int, keyCmpFuncs []chunk.CompareFunc, byItemsDesc []bool) { + keyColumns = e.keyColumns + keyCmpFuncs = e.keyCmpFuncs + byItemsDesc = make([]bool, len(e.ByItems)) + for i, byItem := range e.ByItems { + byItemsDesc[i] = byItem.Desc + } + return } diff --git a/pkg/executor/sortexec/sort_partition.go b/pkg/executor/sortexec/sort_partition.go new file mode 100644 index 0000000000000..c30be0d8651ed --- /dev/null +++ b/pkg/executor/sortexec/sort_partition.go @@ -0,0 +1,403 @@ +// Copyright 2023 PingCAP, 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. + +package sortexec + +import ( + "sort" + "sync" + + "github.com/pingcap/errors" + "github.com/pingcap/failpoint" + "github.com/pingcap/tidb/pkg/types" + "github.com/pingcap/tidb/pkg/util" + "github.com/pingcap/tidb/pkg/util/chunk" + "github.com/pingcap/tidb/pkg/util/disk" + "github.com/pingcap/tidb/pkg/util/logutil" + "github.com/pingcap/tidb/pkg/util/memory" + "go.uber.org/zap" +) + +var errSpillEmptyChunk = errors.New("can not spill empty chunk to disk") +var errFailToAddChunk = errors.New("fail to add chunk") + +// It should be const, but we need to modify it for test. +var spillChunkSize = 1024 + +// signalCheckpointForSort indicates the times of row comparation that a signal detection will be triggered. +const signalCheckpointForSort uint = 10240 + +const ( + notSpilled = iota + inSpilling + spillTriggered +) + +type sortPartition struct { + // cond is only used for protecting spillStatus + cond *sync.Cond + spillStatus int + + // syncLock is used to protect variables except `spillStatus` + syncLock sync.Mutex + + // Data are stored in savedRows + savedRows []chunk.Row + sliceIter *chunk.Iterator4Slice + isSorted bool + + // cursor iterates the spilled chunks. + cursor *dataCursor + inDisk *chunk.DataInDiskByChunks + + spillError error + closed bool + + fieldTypes []*types.FieldType + + memTracker *memory.Tracker + diskTracker *disk.Tracker + spillAction *sortPartitionSpillDiskAction + + // We can't spill if size of data is lower than the limit + spillLimit int64 + + byItemsDesc []bool + // keyColumns is the column index of the by items. + keyColumns []int + // keyCmpFuncs is used to compare each ByItem. + keyCmpFuncs []chunk.CompareFunc + + // Sort is a time-consuming operation, we need to set a checkpoint to detect + // the outside signal periodically. + timesOfRowCompare uint +} + +// Creates a new SortPartition in memory. +func newSortPartition(fieldTypes []*types.FieldType, byItemsDesc []bool, + keyColumns []int, keyCmpFuncs []chunk.CompareFunc, spillLimit int64) *sortPartition { + lock := new(sync.Mutex) + retVal := &sortPartition{ + cond: sync.NewCond(lock), + spillError: nil, + spillStatus: notSpilled, + fieldTypes: fieldTypes, + savedRows: make([]chunk.Row, 0), + isSorted: false, + inDisk: nil, // It's initialized only when spill is triggered + memTracker: memory.NewTracker(memory.LabelForSortPartition, -1), + diskTracker: disk.NewTracker(memory.LabelForSortPartition, -1), + spillAction: nil, // It's set in `actionSpill` function + spillLimit: spillLimit, + byItemsDesc: byItemsDesc, + keyColumns: keyColumns, + keyCmpFuncs: keyCmpFuncs, + cursor: NewDataCursor(), + closed: false, + } + + return retVal +} + +func (s *sortPartition) close() error { + s.syncLock.Lock() + defer s.syncLock.Unlock() + s.closed = true + if s.inDisk != nil { + s.inDisk.Close() + } + s.getMemTracker().ReplaceBytesUsed(0) + return nil +} + +func (s *sortPartition) reloadCursor() (bool, error) { + spilledChkNum := s.inDisk.NumChunks() + restoredChkID := s.cursor.getChkID() + 1 + if restoredChkID >= spilledChkNum { + // All data has been consumed + return false, nil + } + + chk, err := s.inDisk.GetChunk(restoredChkID) + if err != nil { + return false, err + } + s.cursor.setChunk(chk, restoredChkID) + return true, nil +} + +// Return false if the spill is triggered in this partition. +func (s *sortPartition) add(chk *chunk.Chunk) bool { + rowNum := chk.NumRows() + consumedBytesNum := chunk.RowSize*int64(rowNum) + chk.MemoryUsage() + + s.syncLock.Lock() + defer s.syncLock.Unlock() + if s.isSpillTriggered() { + return false + } + + // Convert chunk to rows + for i := 0; i < rowNum; i++ { + s.savedRows = append(s.savedRows, chk.GetRow(i)) + } + + s.getMemTracker().Consume(consumedBytesNum) + return true +} + +func (s *sortPartition) sort() error { + s.syncLock.Lock() + defer s.syncLock.Unlock() + return s.sortNoLock() +} + +func (s *sortPartition) sortNoLock() (ret error) { + ret = nil + defer func() { + if r := recover(); r != nil { + ret = util.GetRecoverError(r) + } + }() + + if s.isSorted { + return + } + + failpoint.Inject("errorDuringSortRowContainer", func(val failpoint.Value) { + if val.(bool) { + panic("sort meet error") + } + }) + + sort.Slice(s.savedRows, s.keyColumnsLess) + s.isSorted = true + s.sliceIter = chunk.NewIterator4Slice(s.savedRows) + return +} + +func (s *sortPartition) spillToDiskImpl() (err error) { + defer func() { + if r := recover(); r != nil { + err = util.GetRecoverError(r) + } + }() + + if s.closed { + return nil + } + + s.inDisk = chunk.NewDataInDiskByChunks(s.fieldTypes) + s.inDisk.GetDiskTracker().AttachTo(s.diskTracker) + tmpChk := chunk.NewChunkWithCapacity(s.fieldTypes, spillChunkSize) + + rowNum := len(s.savedRows) + if rowNum == 0 { + return errSpillEmptyChunk + } + + for row := s.sliceIter.Next(); !row.IsEmpty(); row = s.sliceIter.Next() { + tmpChk.AppendRow(row) + if tmpChk.IsFull() { + err := s.inDisk.Add(tmpChk) + if err != nil { + return err + } + tmpChk.Reset() + } + } + + // Spill the remaining data in tmpChk. + // Do not spill when tmpChk is empty as `Add` function requires a non-empty chunk + if tmpChk.NumRows() > 0 { + err := s.inDisk.Add(tmpChk) + if err != nil { + return err + } + } + + // Release memory as all data have been spilled to disk + s.savedRows = nil + s.sliceIter = nil + s.getMemTracker().ReplaceBytesUsed(0) + return nil +} + +// We can only call this function under the protection of `syncLock`. +func (s *sortPartition) spillToDisk(tracker *memory.Tracker) error { + s.syncLock.Lock() + defer s.syncLock.Unlock() + if s.isSpillTriggered() { + return nil + } + + err := s.sortNoLock() + if err != nil { + return err + } + + s.setIsSpilling() + defer s.cond.Broadcast() + defer s.setSpillTriggered() + + logutil.BgLogger().Info("memory exceeds quota, spill to disk now.", + zap.Int64("consumed", tracker.BytesConsumed()), zap.Int64("quota", tracker.GetBytesLimit())) + + err = s.spillToDiskImpl() + return err +} + +func (s *sortPartition) getNextSortedRow() (chunk.Row, error) { + s.syncLock.Lock() + defer s.syncLock.Unlock() + if s.isSpillTriggered() { + row := s.cursor.next() + if row.IsEmpty() { + success, err := s.reloadCursor() + if err != nil { + return chunk.Row{}, err + } + if !success { + // All data has been consumed + return chunk.Row{}, nil + } + + row = s.cursor.begin() + if row.IsEmpty() { + return chunk.Row{}, errors.New("Get an empty row") + } + } + return row, nil + } + + row := s.sliceIter.Next() + return row, nil +} + +func (s *sortPartition) actionSpill() *sortPartitionSpillDiskAction { + if s.spillAction == nil { + s.spillAction = &sortPartitionSpillDiskAction{ + partition: s, + } + } + return s.spillAction +} + +func (s *sortPartition) getMemTracker() *memory.Tracker { + return s.memTracker +} + +func (s *sortPartition) getDiskTracker() *disk.Tracker { + return s.diskTracker +} + +func (s *sortPartition) hasEnoughDataToSpill() bool { + // Guarantee that each partition size is not too small, to avoid opening too many files. + return s.getMemTracker().BytesConsumed() > s.spillLimit +} + +func (s *sortPartition) lessRow(rowI, rowJ chunk.Row) bool { + for i, colIdx := range s.keyColumns { + cmpFunc := s.keyCmpFuncs[i] + if cmpFunc != nil { + cmp := cmpFunc(rowI, colIdx, rowJ, colIdx) + if s.byItemsDesc[i] { + cmp = -cmp + } + if cmp < 0 { + return true + } else if cmp > 0 { + return false + } + } + } + return false +} + +// keyColumnsLess is the less function for key columns. +func (s *sortPartition) keyColumnsLess(i, j int) bool { + if s.timesOfRowCompare >= signalCheckpointForSort { + // Trigger Consume for checking the NeedKill signal + s.memTracker.Consume(1) + s.timesOfRowCompare = 0 + } + + failpoint.Inject("SignalCheckpointForSort", func(val failpoint.Value) { + if val.(bool) { + s.timesOfRowCompare += 1024 + } + }) + + s.timesOfRowCompare++ + return s.lessRow(s.savedRows[i], s.savedRows[j]) +} + +func (s *sortPartition) isSpillTriggered() bool { + s.cond.L.Lock() + defer s.cond.L.Unlock() + return s.spillStatus == spillTriggered +} + +func (s *sortPartition) isSpillTriggeredNoLock() bool { + return s.spillStatus == spillTriggered +} + +func (s *sortPartition) setSpillTriggered() { + s.cond.L.Lock() + defer s.cond.L.Unlock() + s.spillStatus = spillTriggered +} + +func (s *sortPartition) setIsSpilling() { + s.cond.L.Lock() + defer s.cond.L.Unlock() + s.spillStatus = inSpilling +} + +func (s *sortPartition) getIsSpillingNoLock() bool { + return s.spillStatus == inSpilling +} + +func (s *sortPartition) setError(err error) { + s.syncLock.Lock() + defer s.syncLock.Unlock() + s.spillError = err +} + +func (s *sortPartition) checkError() error { + s.syncLock.Lock() + defer s.syncLock.Unlock() + return s.spillError +} + +func (s *sortPartition) numRowInDiskForTest() int64 { + if s.inDisk != nil { + return s.inDisk.NumRows() + } + return 0 +} + +func (s *sortPartition) numRowInMemoryForTest() int64 { + if s.sliceIter != nil { + if s.sliceIter.Len() != len(s.savedRows) { + panic("length of sliceIter should be equal to savedRows") + } + } + return int64(len(s.savedRows)) +} + +// SetSmallSpillChunkSizeForTest set spill chunk size for test. +func SetSmallSpillChunkSizeForTest() { + spillChunkSize = 16 +} diff --git a/pkg/executor/sortexec/sort_spill.go b/pkg/executor/sortexec/sort_spill.go new file mode 100644 index 0000000000000..3f33b20a389ee --- /dev/null +++ b/pkg/executor/sortexec/sort_spill.go @@ -0,0 +1,107 @@ +// Copyright 2023 PingCAP, 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. + +package sortexec + +import ( + "sync" + + "github.com/pingcap/tidb/pkg/util/chunk" + "github.com/pingcap/tidb/pkg/util/memory" +) + +// sortPartitionSpillDiskAction implements memory.ActionOnExceed for chunk.List. If +// the memory quota of a query is exceeded, sortPartitionSpillDiskAction.Action is +// triggered. +type sortPartitionSpillDiskAction struct { + memory.BaseOOMAction + once sync.Once + partition *sortPartition +} + +// GetPriority get the priority of the Action. +func (*sortPartitionSpillDiskAction) GetPriority() int64 { + return memory.DefSpillPriority +} + +func (s *sortPartitionSpillDiskAction) Action(t *memory.Tracker) { + fallBack := s.executeAction(t) + if fallBack != nil { + fallBack.Action(t) + } +} + +func (s *sortPartitionSpillDiskAction) executeAction(t *memory.Tracker) memory.ActionOnExceed { + s.partition.cond.L.Lock() + defer s.partition.cond.L.Unlock() + + for s.partition.getIsSpillingNoLock() { + s.partition.cond.Wait() + } + + if !s.partition.isSpillTriggeredNoLock() && s.partition.hasEnoughDataToSpill() { + s.once.Do(func() { + go func() { + err := s.partition.spillToDisk(t) + if err != nil { + s.partition.setError(err) + } + }() + }) + + // Ideally, all goroutines entering this action should wait for the finish of spill once + // spill is triggered(we consider spill is triggered when the spill goroutine gets the syncLock). + // However, out of some reasons, we have to directly return the goroutine before the finish of + // sort operation which is executed in `s.partition.spillToDisk()` as sort will retrigger the action + // and lead to dead lock. + return nil + } + + if !t.CheckExceed() { + return nil + } + + return s.GetFallback() +} + +// It's used only when spill is triggered +type dataCursor struct { + chkID int + chunkIter *chunk.Iterator4Chunk +} + +// NewDataCursor creates a new dataCursor +func NewDataCursor() *dataCursor { + return &dataCursor{ + chkID: -1, + chunkIter: chunk.NewIterator4Chunk(nil), + } +} + +func (d *dataCursor) getChkID() int { + return d.chkID +} + +func (d *dataCursor) begin() chunk.Row { + return d.chunkIter.Begin() +} + +func (d *dataCursor) next() chunk.Row { + return d.chunkIter.Next() +} + +func (d *dataCursor) setChunk(chk *chunk.Chunk, chkID int) { + d.chkID = chkID + d.chunkIter = chunk.NewIterator4Chunk(chk) +} diff --git a/pkg/executor/sortexec/sort_spill_test.go b/pkg/executor/sortexec/sort_spill_test.go index 628032a5cb23f..6213545799d30 100644 --- a/pkg/executor/sortexec/sort_spill_test.go +++ b/pkg/executor/sortexec/sort_spill_test.go @@ -16,7 +16,9 @@ package sortexec_test import ( "context" + "sort" "testing" + "time" "github.com/pingcap/failpoint" "github.com/pingcap/tidb/pkg/executor/internal/exec" @@ -24,149 +26,343 @@ import ( "github.com/pingcap/tidb/pkg/executor/sortexec" "github.com/pingcap/tidb/pkg/expression" plannerutil "github.com/pingcap/tidb/pkg/planner/util" - "github.com/pingcap/tidb/pkg/sessionctx/variable" + "github.com/pingcap/tidb/pkg/types" + "github.com/pingcap/tidb/pkg/util/chunk" "github.com/pingcap/tidb/pkg/util/memory" "github.com/pingcap/tidb/pkg/util/mock" "github.com/stretchr/testify/require" ) -func TestSortSpillDisk(t *testing.T) { - require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/executor/sortexec/testSortedRowContainerSpill", "return(true)")) - defer func() { - require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/executor/sortexec/testSortedRowContainerSpill")) - }() - ctx := mock.NewContext() - ctx.GetSessionVars().MemQuota.MemQuotaQuery = 1 - ctx.GetSessionVars().InitChunkSize = variable.DefMaxChunkSize - ctx.GetSessionVars().MaxChunkSize = variable.DefMaxChunkSize - ctx.GetSessionVars().MemTracker = memory.NewTracker(memory.LabelForSession, -1) - ctx.GetSessionVars().StmtCtx.MemTracker = memory.NewTracker(memory.LabelForSQLText, -1) - ctx.GetSessionVars().StmtCtx.MemTracker.AttachTo(ctx.GetSessionVars().MemTracker) - cas := &testutil.SortCase{Rows: 2048, OrderByIdx: []int{0, 1}, Ndvs: []int{0, 0}, Ctx: ctx} +// It will sort values in memory and compare them with the results produced by sort executor. +type resultChecker struct { + schema *expression.Schema + keyColumns []int + keyCmpFuncs []chunk.CompareFunc + byItemsDesc []bool + + // Initially, savedChunks are not sorted + savedChunks []*chunk.Chunk + rowPtrs []chunk.RowPtr +} + +func newResultChecker(schema *expression.Schema, keyColumns []int, keyCmpFuncs []chunk.CompareFunc, byItemsDesc []bool, savedChunks []*chunk.Chunk) *resultChecker { + checker := resultChecker{} + checker.schema = schema + checker.keyColumns = keyColumns + checker.keyCmpFuncs = keyCmpFuncs + checker.byItemsDesc = byItemsDesc + checker.savedChunks = savedChunks + return &checker +} + +func (r *resultChecker) lessRow(rowI, rowJ chunk.Row) bool { + for i, colIdx := range r.keyColumns { + cmpFunc := r.keyCmpFuncs[i] + if cmpFunc != nil { + cmp := cmpFunc(rowI, colIdx, rowJ, colIdx) + if r.byItemsDesc[i] { + cmp = -cmp + } + if cmp < 0 { + return true + } else if cmp > 0 { + return false + } + } + } + return false +} + +func (r *resultChecker) keyColumnsLess(i, j int) bool { + rowI := r.savedChunks[r.rowPtrs[i].ChkIdx].GetRow(int(r.rowPtrs[i].RowIdx)) + rowJ := r.savedChunks[r.rowPtrs[j].ChkIdx].GetRow(int(r.rowPtrs[j].RowIdx)) + return r.lessRow(rowI, rowJ) +} + +func (r *resultChecker) getSavedChunksRowNumber() int { + rowNum := 0 + for _, chk := range r.savedChunks { + rowNum += chk.NumRows() + } + return rowNum +} + +func (r *resultChecker) initRowPtrs() { + r.rowPtrs = make([]chunk.RowPtr, 0, r.getSavedChunksRowNumber()) + chunkNum := len(r.savedChunks) + for chkIdx := 0; chkIdx < chunkNum; chkIdx++ { + chk := r.savedChunks[chkIdx] + for rowIdx := 0; rowIdx < chk.NumRows(); rowIdx++ { + r.rowPtrs = append(r.rowPtrs, chunk.RowPtr{ChkIdx: uint32(chkIdx), RowIdx: uint32(rowIdx)}) + } + } +} + +func (r *resultChecker) check(resultChunks []*chunk.Chunk) bool { + if r.rowPtrs == nil { + r.initRowPtrs() + sort.Slice(r.rowPtrs, r.keyColumnsLess) + } + + cursor := 0 + fieldTypes := make([]*types.FieldType, 0) + for _, col := range r.schema.Columns { + fieldTypes = append(fieldTypes, col.GetType()) + } + + // Check row number + totalResRowNum := 0 + for _, chk := range resultChunks { + totalResRowNum += chk.NumRows() + } + if totalResRowNum != len(r.rowPtrs) { + return false + } + + for _, chk := range resultChunks { + rowNum := chk.NumRows() + for i := 0; i < rowNum; i++ { + resRow := chk.GetRow(i) + res := resRow.ToString(fieldTypes) + + expectRow := r.savedChunks[r.rowPtrs[cursor].ChkIdx].GetRow(int(r.rowPtrs[cursor].RowIdx)) + expect := expectRow.ToString(fieldTypes) + + if res != expect { + return false + } + cursor++ + } + } + + return true +} + +func buildDataSource(ctx *mock.Context, sortCase *testutil.SortCase, schema *expression.Schema) *testutil.MockDataSource { opt := testutil.MockDataSourceParameters{ - DataSchema: expression.NewSchema(cas.Columns()...), - Rows: cas.Rows, - Ctx: cas.Ctx, - Ndvs: cas.Ndvs, + DataSchema: schema, + Rows: sortCase.Rows, + Ctx: sortCase.Ctx, + Ndvs: sortCase.Ndvs, } - dataSource := testutil.BuildMockDataSource(opt) + return testutil.BuildMockDataSource(opt) +} + +func buildSortExec(ctx *mock.Context, sortCase *testutil.SortCase, dataSource *testutil.MockDataSource) *sortexec.SortExec { + dataSource.PrepareChunks() exe := &sortexec.SortExec{ - BaseExecutor: exec.NewBaseExecutor(cas.Ctx, dataSource.Schema(), 0, dataSource), - ByItems: make([]*plannerutil.ByItems, 0, len(cas.OrderByIdx)), + BaseExecutor: exec.NewBaseExecutor(sortCase.Ctx, dataSource.Schema(), 0, dataSource), + ByItems: make([]*plannerutil.ByItems, 0, len(sortCase.OrderByIdx)), ExecSchema: dataSource.Schema(), } - for _, idx := range cas.OrderByIdx { - exe.ByItems = append(exe.ByItems, &plannerutil.ByItems{Expr: cas.Columns()[idx]}) + + for _, idx := range sortCase.OrderByIdx { + exe.ByItems = append(exe.ByItems, &plannerutil.ByItems{Expr: sortCase.Columns()[idx]}) } + + return exe +} + +func executeSortExecutor(t *testing.T, exe *sortexec.SortExec) []*chunk.Chunk { tmpCtx := context.Background() - chk := exec.NewFirstChunk(exe) - dataSource.PrepareChunks() err := exe.Open(tmpCtx) require.NoError(t, err) + + resultChunks := make([]*chunk.Chunk, 0) + chk := exec.NewFirstChunk(exe) for { err = exe.Next(tmpCtx, chk) require.NoError(t, err) if chk.NumRows() == 0 { break } + resultChunks = append(resultChunks, chk.CopyConstruct()) } - // Test only 1 partition and all data in memory. - require.Len(t, exe.PartitionList, 1) - require.Equal(t, false, exe.PartitionList[0].AlreadySpilledSafeForTest()) - require.Equal(t, 2048, exe.PartitionList[0].NumRow()) - err = exe.Close() - require.NoError(t, err) + return resultChunks +} - ctx.GetSessionVars().MemTracker = memory.NewTracker(memory.LabelForSession, 1) - ctx.GetSessionVars().StmtCtx.MemTracker = memory.NewTracker(memory.LabelForSQLText, -1) - ctx.GetSessionVars().StmtCtx.MemTracker.AttachTo(ctx.GetSessionVars().MemTracker) - dataSource.PrepareChunks() - err = exe.Open(tmpCtx) +func executeSortExecutorAndManullyTriggerSpill(t *testing.T, exe *sortexec.SortExec, hardLimit int64, tracker *memory.Tracker) []*chunk.Chunk { + tmpCtx := context.Background() + err := exe.Open(tmpCtx) require.NoError(t, err) - for { + + resultChunks := make([]*chunk.Chunk, 0) + chk := exec.NewFirstChunk(exe) + for i := 0; i >= 0; i++ { err = exe.Next(tmpCtx, chk) require.NoError(t, err) + + if i == 10 { + // Trigger the spill + tracker.Consume(hardLimit) + // Wait for spill + time.Sleep(10 * time.Millisecond) + } + if chk.NumRows() == 0 { break } + resultChunks = append(resultChunks, chk.CopyConstruct()) } - // Test 2 partitions and all data in disk. - // Now spilling is in parallel. - // Maybe the second add() will called before spilling, depends on - // Golang goroutine scheduling. So the result has two possibilities. - if len(exe.PartitionList) == 2 { - require.Len(t, exe.PartitionList, 2) - require.Equal(t, true, exe.PartitionList[0].AlreadySpilledSafeForTest()) - require.Equal(t, true, exe.PartitionList[1].AlreadySpilledSafeForTest()) - require.Equal(t, 1024, exe.PartitionList[0].NumRow()) - require.Equal(t, 1024, exe.PartitionList[1].NumRow()) - } else { - require.Len(t, exe.PartitionList, 1) - require.Equal(t, true, exe.PartitionList[0].AlreadySpilledSafeForTest()) - require.Equal(t, 2048, exe.PartitionList[0].NumRow()) - } - - err = exe.Close() + return resultChunks +} + +func checkCorrectness(schema *expression.Schema, exe *sortexec.SortExec, dataSource *testutil.MockDataSource, resultChunks []*chunk.Chunk) bool { + keyColumns, keyCmpFuncs, byItemsDesc := exe.GetSortMetaForTest() + checker := newResultChecker(schema, keyColumns, keyCmpFuncs, byItemsDesc, dataSource.GenData) + return checker.check(resultChunks) +} + +func onePartitionAndAllDataInMemoryCase(t *testing.T, ctx *mock.Context, sortCase *testutil.SortCase) { + ctx.GetSessionVars().InitChunkSize = 32 + ctx.GetSessionVars().MaxChunkSize = 32 + ctx.GetSessionVars().MemTracker = memory.NewTracker(memory.LabelForSQLText, 1048576) + ctx.GetSessionVars().StmtCtx.MemTracker = memory.NewTracker(memory.LabelForSQLText, -1) + ctx.GetSessionVars().StmtCtx.MemTracker.AttachTo(ctx.GetSessionVars().MemTracker) + schema := expression.NewSchema(sortCase.Columns()...) + dataSource := buildDataSource(ctx, sortCase, schema) + exe := buildSortExec(ctx, sortCase, dataSource) + resultChunks := executeSortExecutor(t, exe) + + require.Equal(t, exe.GetSortPartitionListLenForTest(), 1) + require.Equal(t, false, exe.IsSpillTriggeredInOnePartitionForTest(0)) + require.Equal(t, int64(2048), exe.GetRowNumInOnePartitionMemoryForTest(0)) + require.Equal(t, int64(0), exe.GetRowNumInOnePartitionDiskForTest(0)) + err := exe.Close() require.NoError(t, err) - ctx.GetSessionVars().MemTracker = memory.NewTracker(memory.LabelForSession, 28000) + require.True(t, checkCorrectness(schema, exe, dataSource, resultChunks)) +} + +func onePartitionAndAllDataInDiskCase(t *testing.T, ctx *mock.Context, sortCase *testutil.SortCase) { + ctx.GetSessionVars().InitChunkSize = 1024 + ctx.GetSessionVars().MaxChunkSize = 1024 + ctx.GetSessionVars().MemTracker = memory.NewTracker(memory.LabelForSQLText, 50000) ctx.GetSessionVars().StmtCtx.MemTracker = memory.NewTracker(memory.LabelForSQLText, -1) ctx.GetSessionVars().StmtCtx.MemTracker.AttachTo(ctx.GetSessionVars().MemTracker) - dataSource.PrepareChunks() - err = exe.Open(tmpCtx) + schema := expression.NewSchema(sortCase.Columns()...) + dataSource := buildDataSource(ctx, sortCase, schema) + exe := buildSortExec(ctx, sortCase, dataSource) + + // To ensure that spill has been trigger before getting chunk, or we may get chunk from memory. + failpoint.Enable("github.com/pingcap/tidb/pkg/executor/sortexec/waitForSpill", `return(true)`) + resultChunks := executeSortExecutor(t, exe) + failpoint.Enable("github.com/pingcap/tidb/pkg/executor/sortexec/waitForSpill", `return(false)`) + + require.Equal(t, exe.GetSortPartitionListLenForTest(), 1) + require.Equal(t, true, exe.IsSpillTriggeredInOnePartitionForTest(0)) + require.Equal(t, int64(0), exe.GetRowNumInOnePartitionMemoryForTest(0)) + require.Equal(t, int64(2048), exe.GetRowNumInOnePartitionDiskForTest(0)) + err := exe.Close() require.NoError(t, err) - for { - err = exe.Next(tmpCtx, chk) - require.NoError(t, err) - if chk.NumRows() == 0 { - break + + require.True(t, checkCorrectness(schema, exe, dataSource, resultChunks)) +} + +// When we enable the `unholdSyncLock` failpoint, we can ensure that there must be multi partitions. +// However, `unholdSyncLock` failpoint introduces sleep and this will hide some concurrent problems, +// so this failpoint needs to be disabled if we want to test concurrent problem. +func multiPartitionCase(t *testing.T, ctx *mock.Context, sortCase *testutil.SortCase, enableFailPoint bool) { + ctx.GetSessionVars().InitChunkSize = 32 + ctx.GetSessionVars().MaxChunkSize = 32 + ctx.GetSessionVars().MemTracker = memory.NewTracker(memory.LabelForSQLText, 10000) + ctx.GetSessionVars().StmtCtx.MemTracker = memory.NewTracker(memory.LabelForSQLText, -1) + ctx.GetSessionVars().StmtCtx.MemTracker.AttachTo(ctx.GetSessionVars().MemTracker) + schema := expression.NewSchema(sortCase.Columns()...) + dataSource := buildDataSource(ctx, sortCase, schema) + exe := buildSortExec(ctx, sortCase, dataSource) + if enableFailPoint { + failpoint.Enable("github.com/pingcap/tidb/pkg/executor/sortexec/unholdSyncLock", `return(true)`) + } + resultChunks := executeSortExecutor(t, exe) + if enableFailPoint { + failpoint.Enable("github.com/pingcap/tidb/pkg/executor/sortexec/unholdSyncLock", `return(false)`) + } + sortPartitionNum := exe.GetSortPartitionListLenForTest() + if enableFailPoint { + // If we disable the failpoint, there may be only one partition. + require.Greater(t, sortPartitionNum, 1) + + // Ensure all partitions are spilled + for i := 0; i < sortPartitionNum; i++ { + // The last partition may not be spilled. + if i < sortPartitionNum-1 { + require.Equal(t, true, exe.IsSpillTriggeredInOnePartitionForTest(i)) + } } } - // Test only 1 partition but spill disk. - require.Len(t, exe.PartitionList, 1) - require.Equal(t, true, exe.PartitionList[0].AlreadySpilledSafeForTest()) - require.Equal(t, 2048, exe.PartitionList[0].NumRow()) - err = exe.Close() + + err := exe.Close() require.NoError(t, err) - // Test partition nums. - ctx = mock.NewContext() - ctx.GetSessionVars().InitChunkSize = variable.DefMaxChunkSize - ctx.GetSessionVars().MaxChunkSize = variable.DefMaxChunkSize - ctx.GetSessionVars().MemTracker = memory.NewTracker(memory.LabelForSession, 16864*50) - ctx.GetSessionVars().MemTracker.Consume(16864 * 45) + require.True(t, checkCorrectness(schema, exe, dataSource, resultChunks)) +} + +// Data are all in memory and some of then are fetched, then the spill is triggered +func inMemoryThenSpillCase(t *testing.T, ctx *mock.Context, sortCase *testutil.SortCase) { + hardLimit := int64(100000) + ctx.GetSessionVars().InitChunkSize = 32 + ctx.GetSessionVars().MaxChunkSize = 32 + ctx.GetSessionVars().MemTracker = memory.NewTracker(memory.LabelForSQLText, hardLimit) ctx.GetSessionVars().StmtCtx.MemTracker = memory.NewTracker(memory.LabelForSQLText, -1) ctx.GetSessionVars().StmtCtx.MemTracker.AttachTo(ctx.GetSessionVars().MemTracker) - cas = &testutil.SortCase{Rows: 20480, OrderByIdx: []int{0, 1}, Ndvs: []int{0, 0}, Ctx: ctx} - opt = testutil.MockDataSourceParameters{ - DataSchema: expression.NewSchema(cas.Columns()...), - Rows: cas.Rows, - Ctx: cas.Ctx, - Ndvs: cas.Ndvs, - } - dataSource = testutil.BuildMockDataSource(opt) - exe = &sortexec.SortExec{ - BaseExecutor: exec.NewBaseExecutor(cas.Ctx, dataSource.Schema(), 0, dataSource), - ByItems: make([]*plannerutil.ByItems, 0, len(cas.OrderByIdx)), - ExecSchema: dataSource.Schema(), - } - for _, idx := range cas.OrderByIdx { - exe.ByItems = append(exe.ByItems, &plannerutil.ByItems{Expr: cas.Columns()[idx]}) - } - tmpCtx = context.Background() - chk = exec.NewFirstChunk(exe) - dataSource.PrepareChunks() - err = exe.Open(tmpCtx) + schema := expression.NewSchema(sortCase.Columns()...) + dataSource := buildDataSource(ctx, sortCase, schema) + exe := buildSortExec(ctx, sortCase, dataSource) + resultChunks := executeSortExecutorAndManullyTriggerSpill(t, exe, hardLimit, ctx.GetSessionVars().StmtCtx.MemTracker) + + require.Equal(t, exe.GetSortPartitionListLenForTest(), 1) + require.Equal(t, true, exe.IsSpillTriggeredInOnePartitionForTest(0)) + + rowNumInDisk := exe.GetRowNumInOnePartitionDiskForTest(0) + require.Equal(t, int64(0), exe.GetRowNumInOnePartitionMemoryForTest(0)) + require.Greater(t, int64(2048), rowNumInDisk) + require.Less(t, int64(0), rowNumInDisk) + err := exe.Close() require.NoError(t, err) - for { - err = exe.Next(tmpCtx, chk) - require.NoError(t, err) - if chk.NumRows() == 0 { - break - } + + require.True(t, checkCorrectness(schema, exe, dataSource, resultChunks)) +} + +func TestSortSpillDisk(t *testing.T) { + sortexec.SetSmallSpillChunkSizeForTest() + ctx := mock.NewContext() + sortCase := &testutil.SortCase{Rows: 2048, OrderByIdx: []int{0, 1}, Ndvs: []int{0, 0}, Ctx: ctx} + + failpoint.Enable("github.com/pingcap/tidb/pkg/executor/sortexec/SignalCheckpointForSort", `return(true)`) + + for i := 0; i < 50; i++ { + onePartitionAndAllDataInMemoryCase(t, ctx, sortCase) + onePartitionAndAllDataInDiskCase(t, ctx, sortCase) + multiPartitionCase(t, ctx, sortCase, false) + multiPartitionCase(t, ctx, sortCase, true) + inMemoryThenSpillCase(t, ctx, sortCase) } - // Don't spill too many partitions. - require.True(t, len(exe.PartitionList) <= 4) - err = exe.Close() +} + +func TestFallBackAction(t *testing.T) { + hardLimitBytesNum := int64(1000000) + newRootExceedAction := new(testutil.MockActionOnExceed) + sortexec.SetSmallSpillChunkSizeForTest() + ctx := mock.NewContext() + ctx.GetSessionVars().InitChunkSize = 32 + ctx.GetSessionVars().MaxChunkSize = 32 + ctx.GetSessionVars().MemTracker = memory.NewTracker(memory.LabelForSession, hardLimitBytesNum) + ctx.GetSessionVars().MemTracker.SetActionOnExceed(newRootExceedAction) + // Consume lots of memory in advance to help to trigger fallback action. + ctx.GetSessionVars().MemTracker.Consume(int64(float64(hardLimitBytesNum) * 0.99999)) + ctx.GetSessionVars().StmtCtx.MemTracker = memory.NewTracker(memory.LabelForSQLText, -1) + ctx.GetSessionVars().StmtCtx.MemTracker.AttachTo(ctx.GetSessionVars().MemTracker) + sortCase := &testutil.SortCase{Rows: 2048, OrderByIdx: []int{0, 1}, Ndvs: []int{0, 0}, Ctx: ctx} + + failpoint.Enable("github.com/pingcap/tidb/pkg/executor/sortexec/SignalCheckpointForSort", `return(true)`) + + schema := expression.NewSchema(sortCase.Columns()...) + dataSource := buildDataSource(ctx, sortCase, schema) + exe := buildSortExec(ctx, sortCase, dataSource) + executeSortExecutor(t, exe) + err := exe.Close() require.NoError(t, err) + + require.Less(t, 0, newRootExceedAction.GetTriggeredNum()) } diff --git a/pkg/executor/sortexec/sort_test.go b/pkg/executor/sortexec/sort_test.go index 1b2d0fa2a118b..522cc7535f24e 100644 --- a/pkg/executor/sortexec/sort_test.go +++ b/pkg/executor/sortexec/sort_test.go @@ -29,11 +29,14 @@ import ( "github.com/stretchr/testify/require" ) +// TODO remove spill as it should be tested in sort_spill_test.go +// TODO add some new fail points, as some fail point may be aborted after the refine func TestSortInDisk(t *testing.T) { testSortInDisk(t, false) testSortInDisk(t, true) } +// TODO remove failpoint func testSortInDisk(t *testing.T, removeDir bool) { restore := config.RestoreFunc() defer restore() diff --git a/pkg/executor/sortexec/sort_util.go b/pkg/executor/sortexec/sort_util.go new file mode 100644 index 0000000000000..a2149f20508ad --- /dev/null +++ b/pkg/executor/sortexec/sort_util.go @@ -0,0 +1,50 @@ +// Copyright 2023 PingCAP, 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. + +package sortexec + +import "github.com/pingcap/tidb/pkg/util/chunk" + +type rowWithPartition struct { + row chunk.Row + partitionID int +} + +type multiWayMerge struct { + lessRowFunction func(rowI chunk.Row, rowJ chunk.Row) bool + elements []rowWithPartition +} + +func (h *multiWayMerge) Less(i, j int) bool { + rowI := h.elements[i] + rowJ := h.elements[j] + return h.lessRowFunction(rowI.row, rowJ.row) +} + +func (h *multiWayMerge) Len() int { + return len(h.elements) +} + +func (*multiWayMerge) Push(interface{}) { + // Should never be called. +} + +func (h *multiWayMerge) Pop() interface{} { + h.elements = h.elements[:len(h.elements)-1] + return nil +} + +func (h *multiWayMerge) Swap(i, j int) { + h.elements[i], h.elements[j] = h.elements[j], h.elements[i] +} diff --git a/pkg/executor/sortexec/topn.go b/pkg/executor/sortexec/topn.go index a52de50c42f3c..5dd0e74449051 100644 --- a/pkg/executor/sortexec/topn.go +++ b/pkg/executor/sortexec/topn.go @@ -38,6 +38,7 @@ type TopNExec struct { rowPtrs []chunk.RowPtr chkHeap *topNChunkHeap + Idx int } // topNChunkHeap implements heap.Interface. @@ -87,13 +88,6 @@ func (h *topNChunkHeap) Swap(i, j int) { h.rowPtrs[i], h.rowPtrs[j] = h.rowPtrs[j], h.rowPtrs[i] } -// keyColumnsLess is the less function for key columns. -func (e *TopNExec) keyColumnsLess(i, j chunk.RowPtr) bool { - rowI := e.rowChunks.GetRow(i) - rowJ := e.rowChunks.GetRow(j) - return e.lessRow(rowI, rowJ) -} - func (e *TopNExec) keyColumnsCompare(i, j chunk.RowPtr) int { rowI := e.rowChunks.GetRow(i) rowJ := e.rowChunks.GetRow(j) diff --git a/pkg/executor/stale_txn_test.go b/pkg/executor/stale_txn_test.go index 8a880e31febb6..42caa25081a36 100644 --- a/pkg/executor/stale_txn_test.go +++ b/pkg/executor/stale_txn_test.go @@ -46,7 +46,7 @@ func TestExactStalenessTransaction(t *testing.T) { preSQL: "begin", sql: `START TRANSACTION READ ONLY AS OF TIMESTAMP '2020-09-06 00:00:00';`, IsStaleness: true, - expectPhysicalTS: 1599321600000, + expectPhysicalTS: time.Date(2020, 9, 6, 0, 0, 0, 0, time.Local).UnixMilli(), zone: "sh", }, { @@ -61,7 +61,7 @@ func TestExactStalenessTransaction(t *testing.T) { preSQL: "begin", sql: `START TRANSACTION READ ONLY AS OF TIMESTAMP tidb_bounded_staleness('2015-09-21 00:07:01', NOW());`, IsStaleness: true, - expectPhysicalTS: 1442765221000, + expectPhysicalTS: time.Date(2015, 9, 21, 0, 7, 1, 0, time.Local).UnixMilli(), zone: "bj", }, { @@ -539,7 +539,7 @@ func TestSetTransactionReadOnlyAsOf(t *testing.T) { }{ { sql: `SET TRANSACTION READ ONLY as of timestamp '2021-04-21 00:42:12'`, - expectedTS: 424394603102208000, + expectedTS: oracle.GoTimeToTS(time.Date(2021, 4, 21, 0, 42, 12, 0, time.Local)), injectSafeTS: 0, }, { @@ -580,7 +580,7 @@ func TestSetTransactionReadOnlyAsOf(t *testing.T) { require.Equal(t, "start transaction read only as of is forbidden after set transaction read only as of", err.Error()) tk.MustExec("begin") - require.Equal(t, uint64(424394603102208000), tk.Session().GetSessionVars().TxnReadTS.PeakTxnReadTS()) + require.Equal(t, oracle.GoTimeToTS(time.Date(2021, 4, 21, 0, 42, 12, 0, time.Local)), tk.Session().GetSessionVars().TxnReadTS.PeakTxnReadTS()) tk.MustExec("commit") tk.MustExec(`START TRANSACTION READ ONLY AS OF TIMESTAMP '2020-09-06 00:00:00'`) } diff --git a/pkg/executor/table_reader.go b/pkg/executor/table_reader.go index 61d82eae3ec48..4d87861c9511b 100644 --- a/pkg/executor/table_reader.go +++ b/pkg/executor/table_reader.go @@ -112,7 +112,8 @@ type TableReaderExecutor struct { byItems []*util.ByItems paging bool storeType kv.StoreType - // corColInFilter tells whether there's correlated column in filter. + // corColInFilter tells whether there's correlated column in filter (both conditions in PhysicalSelection and LateMaterializationFilterCondition in PhysicalTableScan) + // If true, we will need to revise the dagPB (fill correlated column value in filter) each time call Open(). corColInFilter bool // corColInAccess tells whether there's correlated column in access conditions. corColInAccess bool @@ -156,6 +157,7 @@ func (e *TableReaderExecutor) Open(ctx context.Context) error { var err error if e.corColInFilter { + // If there's correlated column in filter, need to rewrite dagPB if e.storeType == kv.TiFlash { execs, err := builder.ConstructTreeBasedDistExec(e.Ctx(), e.tablePlan) if err != nil { diff --git a/pkg/executor/test/admintest/main_test.go b/pkg/executor/test/admintest/main_test.go index de4c1237291a4..d7a54de4ee1c6 100644 --- a/pkg/executor/test/admintest/main_test.go +++ b/pkg/executor/test/admintest/main_test.go @@ -38,6 +38,7 @@ func TestMain(m *testing.M) { opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("gopkg.in/natefinch/lumberjack%2ev2.(*Logger).millRun"), diff --git a/pkg/executor/test/aggregate/main_test.go b/pkg/executor/test/aggregate/main_test.go index be61f9e975f64..8d4f9ce8fadf0 100644 --- a/pkg/executor/test/aggregate/main_test.go +++ b/pkg/executor/test/aggregate/main_test.go @@ -32,6 +32,7 @@ func TestMain(m *testing.M) { }) opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), } diff --git a/pkg/executor/test/analyzetest/analyze_test.go b/pkg/executor/test/analyzetest/analyze_test.go index 6fa02510e342b..cc2afed227808 100644 --- a/pkg/executor/test/analyzetest/analyze_test.go +++ b/pkg/executor/test/analyzetest/analyze_test.go @@ -732,7 +732,7 @@ func TestSavedAnalyzeOptions(t *testing.T) { tk.MustExec("insert into t values (10,10,10)") require.Nil(t, h.DumpStatsDeltaToKV(true)) require.Nil(t, h.Update(is)) - h.HandleAutoAnalyze(is) + h.HandleAutoAnalyze() tbl = h.GetTableStats(tableInfo) require.Greater(t, tbl.Version, lastVersion) lastVersion = tbl.Version @@ -1086,7 +1086,7 @@ func TestSavedAnalyzeColumnOptions(t *testing.T) { require.Nil(t, h.DumpStatsDeltaToKV(true)) require.Nil(t, h.Update(is)) // auto analyze uses the saved option(predicate columns). - h.HandleAutoAnalyze(is) + h.HandleAutoAnalyze() tblStats = h.GetTableStats(tblInfo) require.Less(t, lastVersion, tblStats.Version) lastVersion = tblStats.Version @@ -1939,7 +1939,7 @@ func testKillAutoAnalyze(t *testing.T, ver int) { require.NoError(t, failpoint.Disable(mockSlowAnalyze)) }() } - require.True(t, h.HandleAutoAnalyze(is), comment) + require.True(t, h.HandleAutoAnalyze(), comment) currentVersion := h.GetTableStats(tableInfo).Version if status == "finished" { // If we kill a finished job, after kill command the status is still finished and the table stats are updated. @@ -2011,7 +2011,7 @@ func TestKillAutoAnalyzeIndex(t *testing.T) { require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/executor/mockSlowAnalyzeIndex")) }() } - require.True(t, h.HandleAutoAnalyze(dom.InfoSchema()), comment) + require.True(t, h.HandleAutoAnalyze(), comment) currentVersion := h.GetTableStats(tblInfo).Version if status == "finished" { // If we kill a finished job, after kill command the status is still finished and the index stats are updated. @@ -2616,7 +2616,7 @@ PARTITION BY RANGE ( id ) ( h.SetLease(oriLease) }() is := dom.InfoSchema() - h.HandleAutoAnalyze(is) + h.HandleAutoAnalyze() tk.MustExec("create index idxa on t (a)") tk.MustExec("create index idxb on t (b)") table, err := is.TableByName(model.NewCIStr("test"), model.NewCIStr("t")) @@ -2651,7 +2651,7 @@ PARTITION BY RANGE ( id ) ( h.SetLease(oriLease) }() is := dom.InfoSchema() - h.HandleAutoAnalyze(is) + h.HandleAutoAnalyze() tk.MustExec("alter table t add column a int") tk.MustExec("alter table t add column b int") table, err := is.TableByName(model.NewCIStr("test"), model.NewCIStr("t")) @@ -2746,7 +2746,7 @@ func TestAutoAnalyzeAwareGlobalVariableChange(t *testing.T) { require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/executor/injectAnalyzeSnapshot", fmt.Sprintf("return(%d)", startTS))) require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/executor/injectBaseCount", "return(3)")) require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/executor/injectBaseModifyCount", "return(0)")) - require.True(t, h.HandleAutoAnalyze(dom.InfoSchema())) + require.True(t, h.HandleAutoAnalyze()) // Check the count / modify_count changes during the analyze are not lost. tk.MustQuery(fmt.Sprintf("select count, modify_count from mysql.stats_meta where table_id = %d", tid)).Check(testkit.Rows( "6 3", @@ -2774,10 +2774,12 @@ func TestAnalyzeColumnsSkipMVIndexJsonCol(t *testing.T) { tk.MustExec("analyze table t columns a") tk.MustQuery("show warnings").Sort().Check(testkit.Rows(""+ "Note 1105 Analyze use auto adjusted sample rate 1.000000 for table test.t, reason to use this rate is \"use min(1, 110000/10000) as the sample-rate=1\"", - "Warning 1105 Columns b are missing in ANALYZE but their stats are needed for calculating stats for indexes/primary key/extended stats", - "Warning 1105 analyzing multi-valued indexes is not supported, skip idx_c")) - tk.MustQuery("select job_info from mysql.analyze_jobs where table_schema = 'test' and table_name = 't'").Check(testkit.Rows( - "analyze table columns a, b with 256 buckets, 500 topn, 1 samplerate")) + "Warning 1105 Columns b are missing in ANALYZE but their stats are needed for calculating stats for indexes/primary key/extended stats")) + tk.MustQuery("select job_info from mysql.analyze_jobs where table_schema = 'test' and table_name = 't'").Sort().Check( + testkit.Rows( + "analyze index idx_c", + "analyze table columns a, b with 256 buckets, 500 topn, 1 samplerate", + )) is := dom.InfoSchema() tbl, err := is.TableByName(model.NewCIStr("test"), model.NewCIStr("t")) @@ -2788,13 +2790,12 @@ func TestAnalyzeColumnsSkipMVIndexJsonCol(t *testing.T) { require.True(t, stats.Columns[tblInfo.Columns[1].ID].IsStatsInitialized()) require.False(t, stats.Columns[tblInfo.Columns[2].ID].IsStatsInitialized()) require.True(t, stats.Indices[tblInfo.Indices[0].ID].IsStatsInitialized()) - require.False(t, stats.Indices[tblInfo.Indices[1].ID].IsStatsInitialized()) + require.True(t, stats.Indices[tblInfo.Indices[1].ID].IsStatsInitialized()) } // TestAnalyzeMVIndex tests analyzing the mv index use some real data in the table. // It checks the analyze jobs, async loading and the stats content in the memory. func TestAnalyzeMVIndex(t *testing.T) { - t.Skip() require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/executor/DebugAnalyzeJobOperations", "return(true)")) require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/statistics/handle/DebugAnalyzeJobOperations", "return(true)")) defer func() { @@ -2944,41 +2945,41 @@ func TestAnalyzeMVIndex(t *testing.T) { )) tk.MustQuery("explain format = brief select * from t where '1' member of (j->'$.bin')").Check(testkit.Rows( "IndexMerge 0.03 root type: union", - "├─IndexRangeScan(Build) 0.03 cop[tikv] table:t, index:ij_binary(cast(json_extract(`j`, _utf8mb4'$.bin') as binary(50) array)) range:[0x31,0x31], keep order:false, stats:partial[ia:allEvicted, ij_binary:allEvicted, j:unInitialized]", + "├─IndexRangeScan(Build) 0.03 cop[tikv] table:t, index:ij_binary(cast(json_extract(`j`, _utf8mb4'$.bin') as binary(50) array)) range:[\"1\",\"1\"], keep order:false, stats:partial[ia:allEvicted, ij_binary:allEvicted, j:unInitialized]", "└─TableRowIDScan(Probe) 0.03 cop[tikv] table:t keep order:false, stats:partial[ia:allEvicted, ij_binary:allEvicted, j:unInitialized]", )) tk.MustQuery("explain format = brief select * from t where '1' member of (j->'$.char')").Check(testkit.Rows( "IndexMerge 0.03 root type: union", - "├─IndexRangeScan(Build) 0.03 cop[tikv] table:t, index:ij_char(cast(json_extract(`j`, _utf8mb4'$.char') as char(50) array)) range:[0x31,0x31], keep order:false, stats:partial[ia:allEvicted, ij_char:allEvicted, j:unInitialized]", + "├─IndexRangeScan(Build) 0.03 cop[tikv] table:t, index:ij_char(cast(json_extract(`j`, _utf8mb4'$.char') as char(50) array)) range:[\"1\",\"1\"], keep order:false, stats:partial[ia:allEvicted, ij_char:allEvicted, j:unInitialized]", "└─TableRowIDScan(Probe) 0.03 cop[tikv] table:t keep order:false, stats:partial[ia:allEvicted, ij_char:allEvicted, j:unInitialized]", )) // 3.2. emulate the background async loading require.NoError(t, h.LoadNeededHistograms()) // 3.3. now, stats on all indexes should be loaded - tk.MustQuery("explain format = brief select * from t where 1 member of (j->'$.signed')").Check(testkit.Rows( - "IndexMerge 0.03 root type: union", - "├─IndexRangeScan(Build) 0.03 cop[tikv] table:t, index:ij_signed(cast(json_extract(`j`, _utf8mb4'$.signed') as signed array)) range:[1,1], keep order:false, stats:partial[j:unInitialized]", - "└─TableRowIDScan(Probe) 0.03 cop[tikv] table:t keep order:false, stats:partial[j:unInitialized]", + tk.MustQuery("explain format = brief select /*+ use_index_merge(t, ij_signed) */ * from t where 1 member of (j->'$.signed')").Check(testkit.Rows( + "IndexMerge 27.00 root type: union", + "├─IndexRangeScan(Build) 27.00 cop[tikv] table:t, index:ij_signed(cast(json_extract(`j`, _utf8mb4'$.signed') as signed array)) range:[1,1], keep order:false, stats:partial[j:unInitialized]", + "└─TableRowIDScan(Probe) 27.00 cop[tikv] table:t keep order:false, stats:partial[j:unInitialized]", )) - tk.MustQuery("explain format = brief select * from t where 1 member of (j->'$.unsigned')").Check(testkit.Rows( - "IndexMerge 0.03 root type: union", - "├─IndexRangeScan(Build) 0.03 cop[tikv] table:t, index:ij_unsigned(cast(json_extract(`j`, _utf8mb4'$.unsigned') as unsigned array)) range:[1,1], keep order:false, stats:partial[j:unInitialized]", - "└─TableRowIDScan(Probe) 0.03 cop[tikv] table:t keep order:false, stats:partial[j:unInitialized]", + tk.MustQuery("explain format = brief select /*+ use_index_merge(t, ij_unsigned) */* from t where 1 member of (j->'$.unsigned')").Check(testkit.Rows( + "IndexMerge 18.00 root type: union", + "├─IndexRangeScan(Build) 18.00 cop[tikv] table:t, index:ij_unsigned(cast(json_extract(`j`, _utf8mb4'$.unsigned') as unsigned array)) range:[1,1], keep order:false, stats:partial[j:unInitialized]", + "└─TableRowIDScan(Probe) 18.00 cop[tikv] table:t keep order:false, stats:partial[j:unInitialized]", )) - tk.MustQuery("explain format = brief select * from t where 10.01 member of (j->'$.dbl')").Check(testkit.Rows( + tk.MustQuery("explain format = brief select /*+ use_index_merge(t, ij_double) */ * from t where 10.01 member of (j->'$.dbl')").Check(testkit.Rows( "TableReader 21.60 root data:Selection", "└─Selection 21.60 cop[tikv] json_memberof(cast(10.01, json BINARY), json_extract(test.t.j, \"$.dbl\"))", " └─TableFullScan 27.00 cop[tikv] table:t keep order:false, stats:partial[j:unInitialized]", )) - tk.MustQuery("explain format = brief select * from t where '1' member of (j->'$.bin')").Check(testkit.Rows( - "IndexMerge 0.03 root type: union", - "├─IndexRangeScan(Build) 0.03 cop[tikv] table:t, index:ij_binary(cast(json_extract(`j`, _utf8mb4'$.bin') as binary(50) array)) range:[0x31,0x31], keep order:false, stats:partial[j:unInitialized]", - "└─TableRowIDScan(Probe) 0.03 cop[tikv] table:t keep order:false, stats:partial[j:unInitialized]", + tk.MustQuery("explain format = brief select /*+ use_index_merge(t, ij_binary) */ * from t where '1' member of (j->'$.bin')").Check(testkit.Rows( + "IndexMerge 14.83 root type: union", + "├─IndexRangeScan(Build) 14.83 cop[tikv] table:t, index:ij_binary(cast(json_extract(`j`, _utf8mb4'$.bin') as binary(50) array)) range:[\"1\",\"1\"], keep order:false, stats:partial[j:unInitialized]", + "└─TableRowIDScan(Probe) 14.83 cop[tikv] table:t keep order:false, stats:partial[j:unInitialized]", )) - tk.MustQuery("explain format = brief select * from t where '1' member of (j->'$.char')").Check(testkit.Rows( - "IndexMerge 0.03 root type: union", - "├─IndexRangeScan(Build) 0.03 cop[tikv] table:t, index:ij_char(cast(json_extract(`j`, _utf8mb4'$.char') as char(50) array)) range:[0x31,0x31], keep order:false, stats:partial[j:unInitialized]", - "└─TableRowIDScan(Probe) 0.03 cop[tikv] table:t keep order:false, stats:partial[j:unInitialized]", + tk.MustQuery("explain format = brief select /*+ use_index_merge(t, ij_char) */ * from t where '1' member of (j->'$.char')").Check(testkit.Rows( + "IndexMerge 13.50 root type: union", + "├─IndexRangeScan(Build) 13.50 cop[tikv] table:t, index:ij_char(cast(json_extract(`j`, _utf8mb4'$.char') as char(50) array)) range:[\"1\",\"1\"], keep order:false, stats:partial[j:unInitialized]", + "└─TableRowIDScan(Probe) 13.50 cop[tikv] table:t keep order:false, stats:partial[j:unInitialized]", )) // 3.4. clean up the stats and re-analyze the table @@ -2987,24 +2988,24 @@ func TestAnalyzeMVIndex(t *testing.T) { // 3.5. turn on the sync loading, stats on mv indexes should be loaded tk.MustExec("set session tidb_stats_load_sync_wait = 1000") tk.MustQuery("explain format = brief select * from t where 1 member of (j->'$.signed')").Check(testkit.Rows( - "IndexMerge 0.03 root type: union", - "├─IndexRangeScan(Build) 0.03 cop[tikv] table:t, index:ij_signed(cast(json_extract(`j`, _utf8mb4'$.signed') as signed array)) range:[1,1], keep order:false, stats:partial[ia:allEvicted, j:unInitialized]", - "└─TableRowIDScan(Probe) 0.03 cop[tikv] table:t keep order:false, stats:partial[ia:allEvicted, j:unInitialized]", + "IndexMerge 3.84 root type: union", + "├─IndexRangeScan(Build) 3.84 cop[tikv] table:t, index:ij_signed(cast(json_extract(`j`, _utf8mb4'$.signed') as signed array)) range:[1,1], keep order:false, stats:partial[ia:allEvicted, j:unInitialized]", + "└─TableRowIDScan(Probe) 3.84 cop[tikv] table:t keep order:false, stats:partial[ia:allEvicted, j:unInitialized]", )) tk.MustQuery("explain format = brief select * from t where 1 member of (j->'$.unsigned')").Check(testkit.Rows( - "IndexMerge 0.03 root type: union", - "├─IndexRangeScan(Build) 0.03 cop[tikv] table:t, index:ij_unsigned(cast(json_extract(`j`, _utf8mb4'$.unsigned') as unsigned array)) range:[1,1], keep order:false, stats:partial[ia:allEvicted, j:unInitialized]", - "└─TableRowIDScan(Probe) 0.03 cop[tikv] table:t keep order:false, stats:partial[ia:allEvicted, j:unInitialized]", + "IndexMerge 3.60 root type: union", + "├─IndexRangeScan(Build) 3.60 cop[tikv] table:t, index:ij_unsigned(cast(json_extract(`j`, _utf8mb4'$.unsigned') as unsigned array)) range:[1,1], keep order:false, stats:partial[ia:allEvicted, j:unInitialized]", + "└─TableRowIDScan(Probe) 3.60 cop[tikv] table:t keep order:false, stats:partial[ia:allEvicted, j:unInitialized]", )) tk.MustQuery("explain format = brief select * from t where '1' member of (j->'$.bin')").Check(testkit.Rows( - "IndexMerge 0.03 root type: union", - "├─IndexRangeScan(Build) 0.03 cop[tikv] table:t, index:ij_binary(cast(json_extract(`j`, _utf8mb4'$.bin') as binary(50) array)) range:[0x31,0x31], keep order:false, stats:partial[ia:allEvicted, j:unInitialized]", - "└─TableRowIDScan(Probe) 0.03 cop[tikv] table:t keep order:false, stats:partial[ia:allEvicted, j:unInitialized]", + "IndexMerge 1.55 root type: union", + "├─IndexRangeScan(Build) 1.55 cop[tikv] table:t, index:ij_binary(cast(json_extract(`j`, _utf8mb4'$.bin') as binary(50) array)) range:[\"1\",\"1\"], keep order:false, stats:partial[ia:allEvicted, j:unInitialized]", + "└─TableRowIDScan(Probe) 1.55 cop[tikv] table:t keep order:false, stats:partial[ia:allEvicted, j:unInitialized]", )) tk.MustQuery("explain format = brief select * from t where '1' member of (j->'$.char')").Check(testkit.Rows( - "IndexMerge 0.03 root type: union", - "├─IndexRangeScan(Build) 0.03 cop[tikv] table:t, index:ij_char(cast(json_extract(`j`, _utf8mb4'$.char') as char(50) array)) range:[0x31,0x31], keep order:false, stats:partial[ia:allEvicted, j:unInitialized]", - "└─TableRowIDScan(Probe) 0.03 cop[tikv] table:t keep order:false, stats:partial[ia:allEvicted, j:unInitialized]", + "IndexMerge 1.93 root type: union", + "├─IndexRangeScan(Build) 1.93 cop[tikv] table:t, index:ij_char(cast(json_extract(`j`, _utf8mb4'$.char') as char(50) array)) range:[\"1\",\"1\"], keep order:false, stats:partial[ia:allEvicted, j:unInitialized]", + "└─TableRowIDScan(Probe) 1.93 cop[tikv] table:t keep order:false, stats:partial[ia:allEvicted, j:unInitialized]", )) // 4. check stats content in the memory @@ -3023,59 +3024,59 @@ func TestAnalyzeMVIndex(t *testing.T) { tk.MustQuery("show stats_topn").Check(testkit.Rows( // db_name, table_name, partition_name, column_name, is_index, value, count "test t ia 1 1 27", - "test t ij_signed 1 -40000 16", - "test t ij_signed 1 -300 1", - "test t ij_signed 1 -5 11", + "test t ij_signed 1 0 27", + "test t ij_signed 1 1 27", + "test t ij_signed 1 2 27", "test t ij_unsigned 1 0 27", "test t ij_unsigned 1 3 27", "test t ij_unsigned 1 4 27", "test t ij_double 1 -21.5 27", - "test t ij_double 1 -12.000005 8", "test t ij_double 1 0 27", - "test t ij_binary 1 0000 26", - "test t ij_binary 1 1234 19", - "test t ij_binary 1 3796 1", - "test t ij_char 1 !@#$ 24", - "test t ij_char 1 %*$%#@qwe 2", - "test t ij_char 1 %*asdf@ 1", + "test t ij_double 1 2.15 27", + "test t ij_binary 1 aaaaaa 27", + "test t ij_binary 1 bbbb 27", + "test t ij_binary 1 ccc 27", + "test t ij_char 1 aaa 27", + "test t ij_char 1 asdf 27", + "test t ij_char 1 cccccc 27", )) tk.MustQuery("show stats_buckets").Check(testkit.Rows( // db_name, table_name, partition_name, column_name, is_index, bucket_id, count, repeats, lower_bound, upper_bound, ndv - "test t ij_signed 1 0 27 27 0 0 0", - "test t ij_signed 1 1 54 27 1 1 0", - "test t ij_signed 1 2 81 27 2 2 0", - "test t ij_signed 1 3 107 26 4 4 0", - "test t ij_signed 1 4 123 16 5 5 0", - "test t ij_signed 1 5 124 1 100 100 0", - "test t ij_signed 1 6 151 27 300 300 0", - "test t ij_signed 1 7 162 11 13245 13245 0", + "test t ij_signed 1 0 16 16 -40000 -40000 0", + "test t ij_signed 1 1 17 1 -300 -300 0", + "test t ij_signed 1 2 28 11 -5 -5 0", + "test t ij_signed 1 3 54 26 4 4 0", + "test t ij_signed 1 4 70 16 5 5 0", + "test t ij_signed 1 5 71 1 100 100 0", + "test t ij_signed 1 6 98 27 300 300 0", + "test t ij_signed 1 7 109 11 13245 13245 0", "test t ij_unsigned 1 0 16 16 12 12 0", "test t ij_unsigned 1 1 43 27 600 600 0", "test t ij_unsigned 1 2 54 11 3112 3112 0", - "test t ij_double 1 0 19 19 0.000005 0.000005 0", - "test t ij_double 1 1 46 27 2.15 2.15 0", - "test t ij_double 1 2 73 27 10.555555 10.555555 0", - "test t ij_double 1 3 92 19 10.9876 10.9876 0", - "test t ij_binary 1 0 8 8 5678 5678 0", - "test t ij_binary 1 1 35 27 aaaaaa aaaaaa 0", - "test t ij_binary 1 2 59 24 asdf asdf 0", - "test t ij_binary 1 3 86 27 bbbb bbbb 0", - "test t ij_binary 1 4 113 27 ccc ccc 0", - "test t ij_binary 1 5 116 3 egfb egfb 0", - "test t ij_binary 1 6 124 8 ghjk ghjk 0", - "test t ij_binary 1 7 127 3 nfre nfre 0", - "test t ij_binary 1 8 154 27 ppp ppp 0", - "test t ij_binary 1 9 178 24 qwer qwer 0", - "test t ij_binary 1 10 186 8 yuiop yuiop 0", - "test t ij_binary 1 11 213 27 zzzz zzzz 0", - "test t ij_char 1 0 27 27 aaa aaa 0", - "test t ij_char 1 1 54 27 asdf asdf 0", - "test t ij_char 1 2 81 27 cccccc cccccc 0", - "test t ij_char 1 3 108 27 eee eee 0", - "test t ij_char 1 4 110 2 k!@cvd k!@cvd 0", - "test t ij_char 1 5 111 1 kicvd kicvd 0", - "test t ij_char 1 6 135 24 qwer qwer 0", - "test t ij_char 1 7 162 27 yuiop yuiop 0", + "test t ij_double 1 0 8 8 -12.000005 -12.000005 0", + "test t ij_double 1 1 27 19 0.000005 0.000005 0", + "test t ij_double 1 2 54 27 10.555555 10.555555 0", + "test t ij_double 1 3 73 19 10.9876 10.9876 0", + "test t ij_binary 1 0 26 26 0000 0000 0", + "test t ij_binary 1 1 45 19 1234 1234 0", + "test t ij_binary 1 2 46 1 3796 3796 0", + "test t ij_binary 1 3 54 8 5678 5678 0", + "test t ij_binary 1 4 78 24 asdf asdf 0", + "test t ij_binary 1 5 81 3 egfb egfb 0", + "test t ij_binary 1 6 89 8 ghjk ghjk 0", + "test t ij_binary 1 7 92 3 nfre nfre 0", + "test t ij_binary 1 8 119 27 ppp ppp 0", + "test t ij_binary 1 9 143 24 qwer qwer 0", + "test t ij_binary 1 10 151 8 yuiop yuiop 0", + "test t ij_binary 1 11 178 27 zzzz zzzz 0", + "test t ij_char 1 0 24 24 !@#$ !@#$ 0", + "test t ij_char 1 1 26 2 %*$%#@qwe %*$%#@qwe 0", + "test t ij_char 1 2 27 1 %*asdf@ %*asdf@ 0", + "test t ij_char 1 3 54 27 eee eee 0", + "test t ij_char 1 4 56 2 k!@cvd k!@cvd 0", + "test t ij_char 1 5 57 1 kicvd kicvd 0", + "test t ij_char 1 6 81 24 qwer qwer 0", + "test t ij_char 1 7 108 27 yuiop yuiop 0", )) } diff --git a/pkg/executor/test/analyzetest/main_test.go b/pkg/executor/test/analyzetest/main_test.go index 1e2b58a7767d0..47e59508939f5 100644 --- a/pkg/executor/test/analyzetest/main_test.go +++ b/pkg/executor/test/analyzetest/main_test.go @@ -27,6 +27,7 @@ func TestMain(m *testing.M) { }) opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), } diff --git a/pkg/executor/test/analyzetest/memorycontrol/main_test.go b/pkg/executor/test/analyzetest/memorycontrol/main_test.go index 9afe586d1eeb5..d0c329bee4e63 100644 --- a/pkg/executor/test/analyzetest/memorycontrol/main_test.go +++ b/pkg/executor/test/analyzetest/memorycontrol/main_test.go @@ -29,6 +29,7 @@ func TestMain(m *testing.M) { variable.StatsCacheMemQuota.Store(1000000) opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), } diff --git a/pkg/executor/test/analyzetest/memorycontrol/memory_control_test.go b/pkg/executor/test/analyzetest/memorycontrol/memory_control_test.go index 6b74ae62b6cae..e2358304e6fe8 100644 --- a/pkg/executor/test/analyzetest/memorycontrol/memory_control_test.go +++ b/pkg/executor/test/analyzetest/memorycontrol/memory_control_test.go @@ -174,7 +174,7 @@ func TestGlobalMemoryControlForAutoAnalyze(t *testing.T) { childTrackers = executor.GlobalAnalyzeMemoryTracker.GetChildrenForTest() require.Len(t, childTrackers, 0) - h.HandleAutoAnalyze(dom.InfoSchema()) + h.HandleAutoAnalyze() rs := tk.MustQuery("select fail_reason from mysql.analyze_jobs where table_name=? and state=? limit 1", "t", "failed") failReason := rs.Rows()[0][0].(string) require.True(t, strings.Contains(failReason, "Your query has been cancelled due to exceeding the allowed memory limit for the tidb-server instance and this query is currently using the most memory. Please try narrowing your query scope or increase the tidb_server_memory_limit and try again.")) diff --git a/pkg/executor/test/analyzetest/panictest/main_test.go b/pkg/executor/test/analyzetest/panictest/main_test.go index b9444d91305ac..784e06514669b 100644 --- a/pkg/executor/test/analyzetest/panictest/main_test.go +++ b/pkg/executor/test/analyzetest/panictest/main_test.go @@ -27,6 +27,7 @@ func TestMain(m *testing.M) { }) opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), } diff --git a/pkg/executor/test/autoidtest/autoid_test.go b/pkg/executor/test/autoidtest/autoid_test.go index adfab9906f580..298989f60bb7b 100644 --- a/pkg/executor/test/autoidtest/autoid_test.go +++ b/pkg/executor/test/autoidtest/autoid_test.go @@ -87,7 +87,7 @@ func TestFilterDifferentAllocators(t *testing.T) { require.NoError(t, err) require.Equal(t, 1, len(allHandles)) orderedHandles = testutil.MaskSortHandles(allHandles, 5, mysql.TypeLonglong) - require.Greater(t, orderedHandles[0], int64(3000001)) + require.GreaterOrEqual(t, orderedHandles[0], int64(3000001)) tk.MustExec("drop table t1") } diff --git a/pkg/executor/test/autoidtest/main_test.go b/pkg/executor/test/autoidtest/main_test.go index f0dbd997a25ff..81d7daef98c61 100644 --- a/pkg/executor/test/autoidtest/main_test.go +++ b/pkg/executor/test/autoidtest/main_test.go @@ -35,6 +35,7 @@ func TestMain(m *testing.M) { opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("gopkg.in/natefinch/lumberjack%2ev2.(*Logger).millRun"), diff --git a/pkg/executor/test/ddl/ddl_test.go b/pkg/executor/test/ddl/ddl_test.go index 00a30d2bb4364..8646c4634ac97 100644 --- a/pkg/executor/test/ddl/ddl_test.go +++ b/pkg/executor/test/ddl/ddl_test.go @@ -919,11 +919,11 @@ func TestRenameTable(t *testing.T) { tk.MustExec("insert rename2.t values ()") tk.MustExec("rename table rename2.t to rename3.t") tk.MustExec("insert rename3.t values ()") - tk.MustQuery("select * from rename3.t").Check(testkit.Rows("1", "5001", "10001")) + tk.MustQuery("select * from rename3.t").Check(testkit.Rows("1", "2", "3")) // Make sure the drop old database doesn't affect the rename3.t's operations. tk.MustExec("drop database rename2") tk.MustExec("insert rename3.t values ()") - tk.MustQuery("select * from rename3.t").Check(testkit.Rows("1", "5001", "10001", "10002")) + tk.MustQuery("select * from rename3.t").Check(testkit.Rows("1", "2", "3", "4")) tk.MustExec("drop database rename3") tk.MustExec("create database rename1") @@ -942,7 +942,7 @@ func TestRenameTable(t *testing.T) { tk.MustExec("rename table rename2.t1 to rename2.t2") tk.MustExec("insert rename2.t2 values ()") result = tk.MustQuery("select * from rename2.t2") - result.Check(testkit.Rows("1", "2", "5001")) + result.Check(testkit.Rows("1", "2", "3")) tk.MustExec("drop database rename2") tk.MustExec("create database rename1") @@ -988,14 +988,14 @@ func TestRenameMultiTables(t *testing.T) { tk.MustExec("insert rename2.t2 values ()") tk.MustExec("drop database rename3") tk.MustExec("insert rename4.t4 values ()") - tk.MustQuery("select * from rename2.t2").Check(testkit.Rows("1", "5001")) - tk.MustQuery("select * from rename4.t4").Check(testkit.Rows("1", "5001")) + tk.MustQuery("select * from rename2.t2").Check(testkit.Rows("1", "2")) + tk.MustQuery("select * from rename4.t4").Check(testkit.Rows("1", "2")) // Rename a table to another table in the same database. tk.MustExec("rename table rename2.t2 to rename2.t1, rename4.t4 to rename4.t3") tk.MustExec("insert rename2.t1 values ()") - tk.MustQuery("select * from rename2.t1").Check(testkit.Rows("1", "5001", "10001")) + tk.MustQuery("select * from rename2.t1").Check(testkit.Rows("1", "2", "3")) tk.MustExec("insert rename4.t3 values ()") - tk.MustQuery("select * from rename4.t3").Check(testkit.Rows("1", "5001", "10001")) + tk.MustQuery("select * from rename4.t3").Check(testkit.Rows("1", "2", "3")) tk.MustExec("drop database rename2") tk.MustExec("drop database rename4") diff --git a/pkg/executor/test/ddl/main_test.go b/pkg/executor/test/ddl/main_test.go index 34aa611044890..f5f05d63d256f 100644 --- a/pkg/executor/test/ddl/main_test.go +++ b/pkg/executor/test/ddl/main_test.go @@ -35,6 +35,7 @@ func TestMain(m *testing.M) { opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("gopkg.in/natefinch/lumberjack%2ev2.(*Logger).millRun"), diff --git a/pkg/executor/test/distsqltest/main_test.go b/pkg/executor/test/distsqltest/main_test.go index 2992444fb0ca4..cdec2b8cbc7ba 100644 --- a/pkg/executor/test/distsqltest/main_test.go +++ b/pkg/executor/test/distsqltest/main_test.go @@ -35,6 +35,7 @@ func TestMain(m *testing.M) { opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("gopkg.in/natefinch/lumberjack%2ev2.(*Logger).millRun"), diff --git a/pkg/executor/test/executor/BUILD.bazel b/pkg/executor/test/executor/BUILD.bazel index ba040bee380cf..d32ec4ce32555 100644 --- a/pkg/executor/test/executor/BUILD.bazel +++ b/pkg/executor/test/executor/BUILD.bazel @@ -8,20 +8,20 @@ go_test( "main_test.go", ], flaky = True, - shard_count = 46, + shard_count = 50, deps = [ "//pkg/config", "//pkg/ddl", "//pkg/domain", "//pkg/domain/infosync", "//pkg/executor", + "//pkg/executor/internal/exec", "//pkg/expression", "//pkg/infoschema", "//pkg/kv", "//pkg/meta", "//pkg/meta/autoid", "//pkg/parser", - "//pkg/parser/auth", "//pkg/parser/model", "//pkg/parser/mysql", "//pkg/parser/terror", diff --git a/pkg/executor/test/executor/executor_test.go b/pkg/executor/test/executor/executor_test.go index b3ebaa566874e..a6a23b531f69f 100644 --- a/pkg/executor/test/executor/executor_test.go +++ b/pkg/executor/test/executor/executor_test.go @@ -18,6 +18,7 @@ import ( "archive/zip" "context" "fmt" + "os" "path/filepath" "reflect" "runtime" @@ -35,13 +36,13 @@ import ( "github.com/pingcap/tidb/pkg/domain" "github.com/pingcap/tidb/pkg/domain/infosync" "github.com/pingcap/tidb/pkg/executor" + "github.com/pingcap/tidb/pkg/executor/internal/exec" "github.com/pingcap/tidb/pkg/expression" "github.com/pingcap/tidb/pkg/infoschema" "github.com/pingcap/tidb/pkg/kv" "github.com/pingcap/tidb/pkg/meta" "github.com/pingcap/tidb/pkg/meta/autoid" "github.com/pingcap/tidb/pkg/parser" - "github.com/pingcap/tidb/pkg/parser/auth" "github.com/pingcap/tidb/pkg/parser/model" "github.com/pingcap/tidb/pkg/parser/mysql" "github.com/pingcap/tidb/pkg/parser/terror" @@ -109,6 +110,7 @@ func TestPlanReplayer(t *testing.T) { tk.MustExec("create table t(a int, b int, index idx_a(a))") tk.MustExec("alter table t set tiflash replica 1") tk.MustQuery("plan replayer dump explain select * from t where a=10") + defer os.RemoveAll(replayer.GetPlanReplayerDirName()) tk.MustQuery("plan replayer dump explain select /*+ read_from_storage(tiflash[t]) */ * from t") tk.MustExec("create table t1 (a int)") @@ -140,6 +142,7 @@ func TestPlanReplayerCaptureSEM(t *testing.T) { tk.MustExec("plan replayer capture '123' '123';") tk.MustExec("create table t(id int)") tk.MustQuery("plan replayer dump explain select * from t") + defer os.RemoveAll(replayer.GetPlanReplayerDirName()) tk.MustQuery("select count(*) from mysql.plan_replayer_status").Check(testkit.Rows("1")) } @@ -192,6 +195,7 @@ func TestPlanReplayerContinuesCapture(t *testing.T) { require.NotNil(t, task) worker := prHandle.GetWorker() success := worker.HandleTask(task) + defer os.RemoveAll(replayer.GetPlanReplayerDirName()) require.True(t, success) tk.MustQuery("select count(*) from mysql.plan_replayer_status").Check(testkit.Rows("1")) } @@ -203,6 +207,7 @@ func TestPlanReplayerDumpSingle(t *testing.T) { tk.MustExec("drop table if exists t_dump_single") tk.MustExec("create table t_dump_single(a int)") res := tk.MustQuery("plan replayer dump explain select * from t_dump_single") + defer os.RemoveAll(replayer.GetPlanReplayerDirName()) path := testdata.ConvertRowsToStrings(res.Rows()) reader, err := zip.OpenReader(filepath.Join(replayer.GetPlanReplayerDirName(), path[0])) @@ -843,6 +848,49 @@ func TestUnreasonablyClose(t *testing.T) { require.Equal(t, opsNeedsCoveredMask, opsAlreadyCoveredMask, fmt.Sprintf("these operators are not covered %s", commentBuf.String())) } +func TestTwiceCloseUnionExec(t *testing.T) { + store := testkit.CreateMockStore(t) + + is := infoschema.MockInfoSchema([]*model.TableInfo{plannercore.MockSignedTable(), plannercore.MockUnsignedTable()}) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("set tidb_cost_model_version=2") + // To enable the shuffleExec operator. + tk.MustExec("set @@tidb_merge_join_concurrency=4") + + p := parser.New() + for i, tc := range []string{ + "select /*+ stream_agg()*/ sum(a+1) from (select /*+ stream_agg()*/ sum(a+1) as a from t t1 union all select a from t t2) t1 union all select a from t t2", + } { + comment := fmt.Sprintf("case:%v sql:%s", i, tc) + stmt, err := p.ParseOneStmt(tc, "", "") + require.NoError(t, err, comment) + err = sessiontxn.NewTxn(context.Background(), tk.Session()) + require.NoError(t, err, comment) + + err = sessiontxn.GetTxnManager(tk.Session()).OnStmtStart(context.TODO(), stmt) + require.NoError(t, err, comment) + + executorBuilder := executor.NewMockExecutorBuilderForTest(tk.Session(), is, nil) + p, _, _ := planner.Optimize(context.TODO(), tk.Session(), stmt, is) + e := executorBuilder.Build(p) + chk := exec.NewFirstChunk(e) + require.NoError(t, exec.Open(context.Background(), e), comment) + require.NoError(t, e.Next(context.Background(), chk), comment) + require.NoError(t, exec.Close(e), comment) + chk.Reset() + + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/executor/aggregate/mockStreamAggExecBaseExecutorOpenReturnedError", `return(true)`)) + require.NoError(t, exec.Open(context.Background(), e), comment) + err = e.Next(context.Background(), chk) + require.EqualError(t, err, "mock StreamAggExec.baseExecutor.Open returned error") + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/executor/aggregate/mockStreamAggExecBaseExecutorOpenReturnedError")) + + exec.Close(e) + // No leak. + } +} + func TestPointGetPreparedPlan(t *testing.T) { store := testkit.CreateMockStore(t) @@ -1900,6 +1948,14 @@ func TestIsPointGet(t *testing.T) { } } +func TestPointGetOrderby(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("create table t (i int key)") + require.Equal(t, tk.ExecToErr("select * from t where i = 1 order by j limit 10;").Error(), "[planner:1054]Unknown column 'j' in 'order clause'") +} + func TestClusteredIndexIsPointGet(t *testing.T) { store := testkit.CreateMockStore(t) tk := testkit.NewTestKit(t, store) @@ -2011,8 +2067,8 @@ func TestColumnName(t *testing.T) { require.Equal(t, "1+1", fields[0].ColumnAsName.L) require.Equal(t, "num", fields[1].Column.Name.L) require.Equal(t, "num", fields[1].ColumnAsName.L) - tk.MustExec("set @@tidb_enable_window_function = 0") require.Nil(t, rs.Close()) + tk.MustExec("set @@tidb_enable_window_function = 0") rs, err = tk.Exec("select if(1,c,c) from t;") require.NoError(t, err) @@ -2576,33 +2632,6 @@ func TestIsFastPlan(t *testing.T) { } } -func TestTableLockPrivilege(t *testing.T) { - store := testkit.CreateMockStore(t) - tk := testkit.NewTestKit(t, store) - tk2 := testkit.NewTestKit(t, store) - tk.MustExec("use test") - tk.MustExec("create table t(a int)") - tk.MustExec("create user 'testuser'@'localhost'") - require.NoError(t, tk2.Session().Auth(&auth.UserIdentity{Username: "testuser", Hostname: "localhost"}, nil, nil, nil)) - tk2.MustGetErrMsg("LOCK TABLE test.t WRITE", "[planner:1044]Access denied for user 'testuser'@'localhost' to database 'test'") - tk.MustExec("GRANT LOCK TABLES ON test.* to 'testuser'@'localhost'") - tk2.MustGetErrMsg("LOCK TABLE test.t WRITE", "[planner:1142]SELECT command denied to user 'testuser'@'localhost' for table 't'") - tk.MustExec("REVOKE ALL ON test.* FROM 'testuser'@'localhost'") - tk.MustExec("GRANT SELECT ON test.* to 'testuser'@'localhost'") - tk2.MustGetErrMsg("LOCK TABLE test.t WRITE", "[planner:1044]Access denied for user 'testuser'@'localhost' to database 'test'") - tk.MustExec("GRANT LOCK TABLES ON test.* to 'testuser'@'localhost'") - tk2.MustExec("LOCK TABLE test.t WRITE") - - tk.MustExec("create database test2") - tk.MustExec("create table test2.t2(a int)") - tk2.MustGetErrMsg("LOCK TABLE test.t WRITE, test2.t2 WRITE", "[planner:1044]Access denied for user 'testuser'@'localhost' to database 'test2'") - tk.MustExec("GRANT LOCK TABLES ON test2.* to 'testuser'@'localhost'") - tk2.MustGetErrMsg("LOCK TABLE test.t WRITE, test2.t2 WRITE", "[planner:1142]SELECT command denied to user 'testuser'@'localhost' for table 't2'") - tk.MustExec("GRANT SELECT ON test2.* to 'testuser'@'localhost'") - tk2.MustExec("LOCK TABLE test.t WRITE, test2.t2 WRITE") - tk.MustExec("LOCK TABLE test.t WRITE, test2.t2 WRITE") -} - func TestGlobalMemoryControl2(t *testing.T) { store, dom := testkit.CreateMockStoreAndDomain(t) @@ -2703,3 +2732,66 @@ func TestProcessInfoOfSubQuery(t *testing.T) { tk2.MustQuery("select 1 from information_schema.processlist where TxnStart != '' and info like 'select%sleep% from t%'").Check(testkit.Rows("1")) wg.Wait() } + +func TestIssues49377(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("create table employee (employee_id int, name varchar(20), dept_id int)") + tk.MustExec("insert into employee values (1, 'Furina', 1), (2, 'Klee', 1), (3, 'Eula', 1), (4, 'Diluc', 2), (5, 'Tartaglia', 2)") + + tk.MustQuery("select 1,1,1 union all ( " + + "(select * from employee where dept_id = 1) " + + "union all " + + "(select * from employee where dept_id = 1 order by employee_id) " + + "order by 1 limit 1 " + + ");").Sort().Check(testkit.Rows("1 1 1", "1 Furina 1")) + + tk.MustQuery("select 1,1,1 union all ( " + + "(select * from employee where dept_id = 1) " + + "union all " + + "(select * from employee where dept_id = 1 order by employee_id) " + + "order by 1" + + ");").Sort().Check(testkit.Rows("1 1 1", "1 Furina 1", "1 Furina 1", "2 Klee 1", "2 Klee 1", "3 Eula 1", "3 Eula 1")) + + tk.MustQuery("select * from employee where dept_id = 1 " + + "union all " + + "(select * from employee where dept_id = 1 order by employee_id) " + + "union all" + + "(" + + "select * from employee where dept_id = 1 " + + "union all " + + "(select * from employee where dept_id = 1 order by employee_id) " + + "limit 1" + + ");").Sort().Check(testkit.Rows("1 Furina 1", "1 Furina 1", "1 Furina 1", "2 Klee 1", "2 Klee 1", "3 Eula 1", "3 Eula 1")) +} + +func TestIssues40463(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + + tk.MustExec("use test;") + tk.MustExec("CREATE TABLE `4f380f26-9af6-4df8-959d-ad6296eff914` (`f7a9a4be-3728-449b-a5ea-df9b957eec67` enum('bkdv0','9rqy','lw','neud','ym','4nbv','9a7','bpkfo','xtfl','59','6vjj') NOT NULL DEFAULT 'neud', `43ca0135-1650-429b-8887-9eabcae2a234` set('8','5x47','xc','o31','lnz','gs5s','6yam','1','20ea','i','e') NOT NULL DEFAULT 'e', PRIMARY KEY (`f7a9a4be-3728-449b-a5ea-df9b957eec67`,`43ca0135-1650-429b-8887-9eabcae2a234`) /*T![clustered_index] CLUSTERED */) ENGINE=InnoDB DEFAULT CHARSET=ascii COLLATE=ascii_bin;") + tk.MustExec("INSERT INTO `4f380f26-9af6-4df8-959d-ad6296eff914` VALUES ('bkdv0','gs5s'),('lw','20ea'),('neud','8'),('ym','o31'),('4nbv','o31'),('xtfl','e');") + + tk.MustExec("CREATE TABLE `ba35a09f-76f4-40aa-9b48-13154a24bdd2` (`9b2a7138-14a3-4e8f-b29a-720392aad22c` set('zgn','if8yo','e','k7','bav','xj6','lkag','m5','as','ia','l3') DEFAULT 'zgn,if8yo,e,k7,ia,l3',`a60d6b5c-08bd-4a6d-b951-716162d004a5` set('6li6','05jlu','w','l','m','e9r','5q','d0ol','i6ajr','csf','d32') DEFAULT '6li6,05jlu,w,l,m,d0ol,i6ajr,csf,d32',`fb753d37-6252-4bd3-9bd1-0059640e7861` year(4) DEFAULT '2065', UNIQUE KEY `51816c39-27df-4bbe-a0e7-d6b6f54be2a2` (`fb753d37-6252-4bd3-9bd1-0059640e7861`), KEY `b0dfda0a-ffed-4c5b-9a72-4113bc1cbc8e` (`9b2a7138-14a3-4e8f-b29a-720392aad22c`,`fb753d37-6252-4bd3-9bd1-0059640e7861`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin /*T! SHARD_ROW_ID_BITS=5 */;") + tk.MustExec("insert into `ba35a09f-76f4-40aa-9b48-13154a24bdd2` values ('if8yo', '6li6,05jlu,w,l,m,d0ol,i6ajr,csf,d32', 2065);") + + tk.MustExec("CREATE TABLE `07ccc74e-14c3-4685-bb41-c78a069b1a6d` (`8a93bdc5-2214-4f96-b5a7-1ba4c0d396ae` bigint(20) NOT NULL DEFAULT '-4604789462044748682',`30b19ecf-679f-4ca3-813f-d3c3b8f7da7e` date NOT NULL DEFAULT '5030-11-23',`1c52eaf2-1ebb-4486-9410-dfd00c7c835c` decimal(7,5) DEFAULT '-81.91307',`4b09dfdc-e688-41cb-9ffa-d03071a43077` float DEFAULT '1.7989023',PRIMARY KEY (`30b19ecf-679f-4ca3-813f-d3c3b8f7da7e`,`8a93bdc5-2214-4f96-b5a7-1ba4c0d396ae`) /*T![clustered_index] CLUSTERED */,KEY `ae7a7637-ca52-443b-8a3f-69694f730cc4` (`8a93bdc5-2214-4f96-b5a7-1ba4c0d396ae`),KEY `42640042-8a17-4145-9510-5bb419f83ed9` (`8a93bdc5-2214-4f96-b5a7-1ba4c0d396ae`),KEY `839f4f5a-83f3-449b-a7dd-c7d2974d351a` (`30b19ecf-679f-4ca3-813f-d3c3b8f7da7e`),KEY `c474cde1-6fe4-45df-9067-b4e479f84149` (`8a93bdc5-2214-4f96-b5a7-1ba4c0d396ae`),KEY `f834d0a9-709e-4ca8-925d-73f48322b70d` (`8a93bdc5-2214-4f96-b5a7-1ba4c0d396ae`)) ENGINE=InnoDB DEFAULT CHARSET=gbk COLLATE=gbk_chinese_ci;") + tk.MustExec("set sql_mode=``;") + tk.MustExec("INSERT INTO `07ccc74e-14c3-4685-bb41-c78a069b1a6d` VALUES (616295989348159438,'0000-00-00',1.00000,1.7989023),(2215857492573998768,'1970-02-02',0.00000,1.7989023),(2215857492573998768,'1983-05-13',0.00000,1.7989023),(-2840083604831267906,'1984-01-30',1.00000,1.7989023),(599388718360890339,'1986-09-09',1.00000,1.7989023),(3506764933630033073,'1987-11-22',1.00000,1.7989023),(3506764933630033073,'2002-02-26',1.00000,1.7989023),(3506764933630033073,'2003-05-14',1.00000,1.7989023),(3506764933630033073,'2007-05-16',1.00000,1.7989023),(3506764933630033073,'2017-02-20',1.00000,1.7989023),(3506764933630033073,'2017-08-06',1.00000,1.7989023),(2215857492573998768,'2019-02-18',1.00000,1.7989023),(3506764933630033073,'2020-08-11',1.00000,1.7989023),(3506764933630033073,'2028-06-07',1.00000,1.7989023),(3506764933630033073,'2036-08-16',1.00000,1.7989023);") + + tk.MustQuery("select /*+ use_index_merge( `4f380f26-9af6-4df8-959d-ad6296eff914` ) */ /*+ stream_agg() */ approx_percentile( `4f380f26-9af6-4df8-959d-ad6296eff914`.`f7a9a4be-3728-449b-a5ea-df9b957eec67` , 77 ) as r0 , `4f380f26-9af6-4df8-959d-ad6296eff914`.`f7a9a4be-3728-449b-a5ea-df9b957eec67` as r1 from `4f380f26-9af6-4df8-959d-ad6296eff914` where not( IsNull( `4f380f26-9af6-4df8-959d-ad6296eff914`.`f7a9a4be-3728-449b-a5ea-df9b957eec67` ) ) and not( `4f380f26-9af6-4df8-959d-ad6296eff914`.`f7a9a4be-3728-449b-a5ea-df9b957eec67` in ( select `8a93bdc5-2214-4f96-b5a7-1ba4c0d396ae` from `07ccc74e-14c3-4685-bb41-c78a069b1a6d` where `4f380f26-9af6-4df8-959d-ad6296eff914`.`f7a9a4be-3728-449b-a5ea-df9b957eec67` in ( select `a60d6b5c-08bd-4a6d-b951-716162d004a5` from `ba35a09f-76f4-40aa-9b48-13154a24bdd2` where not( `4f380f26-9af6-4df8-959d-ad6296eff914`.`f7a9a4be-3728-449b-a5ea-df9b957eec67` between 'bpkfo' and '59' ) and not( `4f380f26-9af6-4df8-959d-ad6296eff914`.`f7a9a4be-3728-449b-a5ea-df9b957eec67` in ( select `fb753d37-6252-4bd3-9bd1-0059640e7861` from `ba35a09f-76f4-40aa-9b48-13154a24bdd2` where IsNull( `4f380f26-9af6-4df8-959d-ad6296eff914`.`f7a9a4be-3728-449b-a5ea-df9b957eec67` ) or not( `4f380f26-9af6-4df8-959d-ad6296eff914`.`43ca0135-1650-429b-8887-9eabcae2a234` in ( select `8a93bdc5-2214-4f96-b5a7-1ba4c0d396ae` from `07ccc74e-14c3-4685-bb41-c78a069b1a6d` where IsNull( `4f380f26-9af6-4df8-959d-ad6296eff914`.`43ca0135-1650-429b-8887-9eabcae2a234` ) and not( `4f380f26-9af6-4df8-959d-ad6296eff914`.`f7a9a4be-3728-449b-a5ea-df9b957eec67` between 'neud' and 'bpkfo' ) ) ) ) ) ) ) ) group by `4f380f26-9af6-4df8-959d-ad6296eff914`.`f7a9a4be-3728-449b-a5ea-df9b957eec67`;") +} + +func TestIssue38756(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + + tk.MustExec("use test") + tk.MustExec("create table t (c1 int)") + tk.MustExec("insert into t values (1), (2), (3)") + tk.MustQuery("SELECT SQRT(1) FROM t").Check(testkit.Rows("1", "1", "1")) + tk.MustQuery("(SELECT DISTINCT SQRT(1) FROM t)").Check(testkit.Rows("1")) + tk.MustQuery("SELECT DISTINCT cast(1 as double) FROM t").Check(testkit.Rows("1")) +} diff --git a/pkg/executor/test/executor/main_test.go b/pkg/executor/test/executor/main_test.go index 5478aafb701ee..234a61ffa970d 100644 --- a/pkg/executor/test/executor/main_test.go +++ b/pkg/executor/test/executor/main_test.go @@ -39,6 +39,7 @@ func TestMain(m *testing.M) { view.Stop() }), goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("gopkg.in/natefinch/lumberjack%2ev2.(*Logger).millRun"), diff --git a/pkg/executor/test/fktest/BUILD.bazel b/pkg/executor/test/fktest/BUILD.bazel index f2e2472485900..4b12743c6c534 100644 --- a/pkg/executor/test/fktest/BUILD.bazel +++ b/pkg/executor/test/fktest/BUILD.bazel @@ -8,11 +8,10 @@ go_test( "main_test.go", ], flaky = True, - shard_count = 25, + shard_count = 24, deps = [ "//pkg/config", "//pkg/executor", - "//pkg/infoschema", "//pkg/kv", "//pkg/meta/autoid", "//pkg/parser", diff --git a/pkg/executor/test/fktest/foreign_key_test.go b/pkg/executor/test/fktest/foreign_key_test.go index a6ce72c17e978..8668e2c26d616 100644 --- a/pkg/executor/test/fktest/foreign_key_test.go +++ b/pkg/executor/test/fktest/foreign_key_test.go @@ -24,9 +24,7 @@ import ( "testing" "time" - "github.com/pingcap/tidb/pkg/config" "github.com/pingcap/tidb/pkg/executor" - "github.com/pingcap/tidb/pkg/infoschema" "github.com/pingcap/tidb/pkg/kv" "github.com/pingcap/tidb/pkg/parser" "github.com/pingcap/tidb/pkg/parser/ast" @@ -2339,36 +2337,6 @@ func TestPrivilegeCheckInForeignKeyCascade(t *testing.T) { } } -func TestTableLockInForeignKeyCascade(t *testing.T) { - store := testkit.CreateMockStore(t) - tk := testkit.NewTestKit(t, store) - tk.MustExec("set @@global.tidb_enable_foreign_key=1") - tk.MustExec("set @@foreign_key_checks=1") - tk.MustExec("use test") - tk2 := testkit.NewTestKit(t, store) - tk2.MustExec("use test") - tk2.MustExec("set @@foreign_key_checks=1") - // enable table lock - config.UpdateGlobal(func(conf *config.Config) { - conf.EnableTableLock = true - }) - defer func() { - config.UpdateGlobal(func(conf *config.Config) { - conf.EnableTableLock = false - }) - }() - tk.MustExec("create table t1 (id int key);") - tk.MustExec("create table t2 (id int key, foreign key fk (id) references t1(id) ON DELETE CASCADE ON UPDATE CASCADE);") - tk.MustExec("insert into t1 values (1), (2), (3);") - tk.MustExec("insert into t2 values (1), (2), (3);") - tk.MustExec("lock table t2 read;") - tk2.MustGetDBError("delete from t1 where id = 1", infoschema.ErrTableLocked) - tk.MustExec("unlock tables;") - tk2.MustExec("delete from t1 where id = 1") - tk.MustQuery("select * from t1 order by id").Check(testkit.Rows("2", "3")) - tk.MustQuery("select * from t2 order by id").Check(testkit.Rows("2", "3")) -} - func TestForeignKeyIssue39732(t *testing.T) { store := testkit.CreateMockStore(t) tk := testkit.NewTestKit(t, store) diff --git a/pkg/executor/test/fktest/main_test.go b/pkg/executor/test/fktest/main_test.go index 5dd68c2adf893..672d2470d1fc9 100644 --- a/pkg/executor/test/fktest/main_test.go +++ b/pkg/executor/test/fktest/main_test.go @@ -35,6 +35,7 @@ func TestMain(m *testing.M) { opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("gopkg.in/natefinch/lumberjack%2ev2.(*Logger).millRun"), diff --git a/pkg/executor/test/indexmergereadtest/index_merge_reader_test.go b/pkg/executor/test/indexmergereadtest/index_merge_reader_test.go index e16fb9f52df7a..56753578326a6 100644 --- a/pkg/executor/test/indexmergereadtest/index_merge_reader_test.go +++ b/pkg/executor/test/indexmergereadtest/index_merge_reader_test.go @@ -232,22 +232,26 @@ func TestPessimisticLockOnPartitionForIndexMerge(t *testing.T) { " ├─IndexReader(Build) 3.00 root index:IndexFullScan", " │ └─IndexFullScan 3.00 cop[tikv] table:t2, index:c_datetime(c_datetime) keep order:false", " └─PartitionUnion(Probe) 5545.21 root ", - " ├─IndexMerge 5542.21 root type: union", - " │ ├─IndexRangeScan(Build) 3323.33 cop[tikv] table:t1, partition:p0, index:c1(c1) range:[-inf,10), keep order:false, stats:pseudo", - " │ ├─IndexRangeScan(Build) 3323.33 cop[tikv] table:t1, partition:p0, index:c2(c2) range:[-inf,10), keep order:false, stats:pseudo", - " │ └─TableRowIDScan(Probe) 5542.21 cop[tikv] table:t1, partition:p0 keep order:false, stats:pseudo", - " ├─IndexMerge 1.00 root type: union", - " │ ├─IndexRangeScan(Build) 1.00 cop[tikv] table:t1, partition:p1, index:c1(c1) range:[-inf,10), keep order:false", - " │ ├─IndexRangeScan(Build) 1.00 cop[tikv] table:t1, partition:p1, index:c2(c2) range:[-inf,10), keep order:false", - " │ └─TableRowIDScan(Probe) 1.00 cop[tikv] table:t1, partition:p1 keep order:false", - " ├─IndexMerge 1.00 root type: union", - " │ ├─IndexRangeScan(Build) 1.00 cop[tikv] table:t1, partition:p2, index:c1(c1) range:[-inf,10), keep order:false", - " │ ├─IndexRangeScan(Build) 1.00 cop[tikv] table:t1, partition:p2, index:c2(c2) range:[-inf,10), keep order:false", - " │ └─TableRowIDScan(Probe) 1.00 cop[tikv] table:t1, partition:p2 keep order:false", - " └─IndexMerge 1.00 root type: union", - " ├─IndexRangeScan(Build) 1.00 cop[tikv] table:t1, partition:p3, index:c1(c1) range:[-inf,10), keep order:false", - " ├─IndexRangeScan(Build) 1.00 cop[tikv] table:t1, partition:p3, index:c2(c2) range:[-inf,10), keep order:false", - " └─TableRowIDScan(Probe) 1.00 cop[tikv] table:t1, partition:p3 keep order:false", + " ├─Projection 5542.21 root test.t1.c_datetime, test.t1.c1, test.t1._tidb_rowid, test.t1._tidb_tid", + " │ └─IndexMerge 5542.21 root type: union", + " │ ├─IndexRangeScan(Build) 3323.33 cop[tikv] table:t1, partition:p0, index:c1(c1) range:[-inf,10), keep order:false, stats:pseudo", + " │ ├─IndexRangeScan(Build) 3323.33 cop[tikv] table:t1, partition:p0, index:c2(c2) range:[-inf,10), keep order:false, stats:pseudo", + " │ └─TableRowIDScan(Probe) 5542.21 cop[tikv] table:t1, partition:p0 keep order:false, stats:pseudo", + " ├─Projection 1.00 root test.t1.c_datetime, test.t1.c1, test.t1._tidb_rowid, test.t1._tidb_tid", + " │ └─IndexMerge 1.00 root type: union", + " │ ├─IndexRangeScan(Build) 1.00 cop[tikv] table:t1, partition:p1, index:c1(c1) range:[-inf,10), keep order:false", + " │ ├─IndexRangeScan(Build) 1.00 cop[tikv] table:t1, partition:p1, index:c2(c2) range:[-inf,10), keep order:false", + " │ └─TableRowIDScan(Probe) 1.00 cop[tikv] table:t1, partition:p1 keep order:false", + " ├─Projection 1.00 root test.t1.c_datetime, test.t1.c1, test.t1._tidb_rowid, test.t1._tidb_tid", + " │ └─IndexMerge 1.00 root type: union", + " │ ├─IndexRangeScan(Build) 1.00 cop[tikv] table:t1, partition:p2, index:c1(c1) range:[-inf,10), keep order:false", + " │ ├─IndexRangeScan(Build) 1.00 cop[tikv] table:t1, partition:p2, index:c2(c2) range:[-inf,10), keep order:false", + " │ └─TableRowIDScan(Probe) 1.00 cop[tikv] table:t1, partition:p2 keep order:false", + " └─Projection 1.00 root test.t1.c_datetime, test.t1.c1, test.t1._tidb_rowid, test.t1._tidb_tid", + " └─IndexMerge 1.00 root type: union", + " ├─IndexRangeScan(Build) 1.00 cop[tikv] table:t1, partition:p3, index:c1(c1) range:[-inf,10), keep order:false", + " ├─IndexRangeScan(Build) 1.00 cop[tikv] table:t1, partition:p3, index:c2(c2) range:[-inf,10), keep order:false", + " └─TableRowIDScan(Probe) 1.00 cop[tikv] table:t1, partition:p3 keep order:false", )) tk.MustQuery(`select /*+ use_index_merge(t1) */ c1 from t1 join t2 on t1.c_datetime >= t2.c_datetime @@ -372,20 +376,21 @@ func TestIntersectionWithDifferentConcurrency(t *testing.T) { for _, concurrency := range execCon { tk.MustExec(fmt.Sprintf("set tidb_executor_concurrency = %d", concurrency)) for i := 0; i < 2; i++ { + sql := "select /*+ use_index_merge(t1, primary, c2, c3) */ c1 from t1 where c2 < 1024 and c3 > 1024" if i == 0 { // Dynamic mode. tk.MustExec("set tidb_partition_prune_mode = 'dynamic'") - res := tk.MustQuery("explain select /*+ use_index_merge(t1, primary, c2, c3) */ c1 from t1 where c2 < 1024 and c3 > 1024") - require.Contains(t, res.Rows()[1][0], "IndexMerge") + tk.MustHavePlan(sql, "IndexMerge") + tk.MustNotHavePlan(sql, "PartitionUnion") } else { tk.MustExec("set tidb_partition_prune_mode = 'static'") - res := tk.MustQuery("explain select /*+ use_index_merge(t1, primary, c2, c3) */ c1 from t1 where c2 < 1024 and c3 > 1024") if tblIdx == 0 { // partition table - require.Contains(t, res.Rows()[1][0], "PartitionUnion") - require.Contains(t, res.Rows()[2][0], "IndexMerge") + tk.MustHavePlan(sql, "IndexMerge") + tk.MustHavePlan(sql, "PartitionUnion") } else { - require.Contains(t, res.Rows()[1][0], "IndexMerge") + tk.MustHavePlan(sql, "IndexMerge") + tk.MustNotHavePlan(sql, "PartitionUnion") } } for i := 0; i < queryCnt; i++ { diff --git a/pkg/executor/test/indexmergereadtest/main_test.go b/pkg/executor/test/indexmergereadtest/main_test.go index fbdacc7fb573c..ba54eb04d08e3 100644 --- a/pkg/executor/test/indexmergereadtest/main_test.go +++ b/pkg/executor/test/indexmergereadtest/main_test.go @@ -35,6 +35,7 @@ func TestMain(m *testing.M) { opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), diff --git a/pkg/executor/test/issuetest/main_test.go b/pkg/executor/test/issuetest/main_test.go index 5abdfa76228db..9932c54ad8be8 100644 --- a/pkg/executor/test/issuetest/main_test.go +++ b/pkg/executor/test/issuetest/main_test.go @@ -35,6 +35,7 @@ func TestMain(m *testing.M) { opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), diff --git a/pkg/executor/test/jointest/BUILD.bazel b/pkg/executor/test/jointest/BUILD.bazel index f7023216ae36b..4f6cc3ff55bc1 100644 --- a/pkg/executor/test/jointest/BUILD.bazel +++ b/pkg/executor/test/jointest/BUILD.bazel @@ -9,7 +9,7 @@ go_test( ], flaky = True, race = "on", - shard_count = 7, + shard_count = 8, deps = [ "//pkg/config", "//pkg/meta/autoid", diff --git a/pkg/executor/test/jointest/hashjoin/main_test.go b/pkg/executor/test/jointest/hashjoin/main_test.go index aa9044d74c55e..305e3d63b2d99 100644 --- a/pkg/executor/test/jointest/hashjoin/main_test.go +++ b/pkg/executor/test/jointest/hashjoin/main_test.go @@ -35,6 +35,7 @@ func TestMain(m *testing.M) { opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), diff --git a/pkg/executor/test/jointest/join_test.go b/pkg/executor/test/jointest/join_test.go index 9af6b43a738fd..772019d77ad65 100644 --- a/pkg/executor/test/jointest/join_test.go +++ b/pkg/executor/test/jointest/join_test.go @@ -17,6 +17,7 @@ package jointest import ( "context" "fmt" + "runtime" "strings" "testing" "time" @@ -861,3 +862,40 @@ func TestIssue37932(t *testing.T) { } require.NoError(t, err) } + +func TestIssue49033(t *testing.T) { + val := runtime.GOMAXPROCS(1) + defer func() { + runtime.GOMAXPROCS(val) + }() + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test;") + tk.MustExec("drop table if exists t, s;") + tk.MustExec("create table t(a int, index(a));") + tk.MustExec("create table s(a int, index(a));") + tk.MustExec("insert into t values(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), (39), (40), (41), (42), (43), (44), (45), (46), (47), (48), (49), (50), (51), (52), (53), (54), (55), (56), (57), (58), (59), (60), (61), (62), (63), (64), (65), (66), (67), (68), (69), (70), (71), (72), (73), (74), (75), (76), (77), (78), (79), (80), (81), (82), (83), (84), (85), (86), (87), (88), (89), (90), (91), (92), (93), (94), (95), (96), (97), (98), (99), (100), (101), (102), (103), (104), (105), (106), (107), (108), (109), (110), (111), (112), (113), (114), (115), (116), (117), (118), (119), (120), (121), (122), (123), (124), (125), (126), (127), (128);") + tk.MustExec("insert into s values(1), (128);") + tk.MustExec("set @@tidb_max_chunk_size=32;") + tk.MustExec("set @@tidb_index_lookup_join_concurrency=1;") + tk.MustExec("set @@tidb_index_join_batch_size=32;") + tk.MustQuery("select /*+ INL_HASH_JOIN(s) */ * from t join s on t.a=s.a;") + tk.MustQuery("select /*+ INL_HASH_JOIN(s) */ * from t join s on t.a=s.a order by t.a;") + + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/executor/testIssue49033", "return")) + defer func() { + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/executor/testIssue49033")) + }() + + rs, err := tk.Exec("select /*+ INL_HASH_JOIN(s) */ * from t join s on t.a=s.a order by t.a;") + require.NoError(t, err) + _, err = session.GetRows4Test(context.Background(), nil, rs) + require.EqualError(t, err, "testIssue49033") + require.NoError(t, rs.Close()) + + rs, err = tk.Exec("select /*+ INL_HASH_JOIN(s) */ * from t join s on t.a=s.a") + require.NoError(t, err) + _, err = session.GetRows4Test(context.Background(), nil, rs) + require.EqualError(t, err, "testIssue49033") + require.NoError(t, rs.Close()) +} diff --git a/pkg/executor/test/jointest/main_test.go b/pkg/executor/test/jointest/main_test.go index d8d63318a83e1..631ca93ec9861 100644 --- a/pkg/executor/test/jointest/main_test.go +++ b/pkg/executor/test/jointest/main_test.go @@ -35,6 +35,7 @@ func TestMain(m *testing.M) { opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), diff --git a/pkg/executor/test/loaddatatest/BUILD.bazel b/pkg/executor/test/loaddatatest/BUILD.bazel index 4f0f27f54363e..7c42b26c4e066 100644 --- a/pkg/executor/test/loaddatatest/BUILD.bazel +++ b/pkg/executor/test/loaddatatest/BUILD.bazel @@ -9,7 +9,7 @@ go_test( ], flaky = True, race = "on", - shard_count = 10, + shard_count = 11, deps = [ "//br/pkg/lightning/mydump", "//pkg/config", diff --git a/pkg/executor/test/loaddatatest/load_data_test.go b/pkg/executor/test/loaddatatest/load_data_test.go index 1284475340815..bb9f03d7a32d5 100644 --- a/pkg/executor/test/loaddatatest/load_data_test.go +++ b/pkg/executor/test/loaddatatest/load_data_test.go @@ -15,7 +15,8 @@ package loaddatatest import ( - "context" + "fmt" + "io" "testing" "github.com/pingcap/tidb/br/pkg/lightning/mydump" @@ -34,25 +35,26 @@ type testCase struct { func checkCases( tests []testCase, - ld *executor.LoadDataWorker, + loadSQL string, t *testing.T, tk *testkit.TestKit, ctx sessionctx.Context, selectSQL, deleteSQL string, ) { for _, tt := range tests { - parser, err := mydump.NewCSVParser( - context.Background(), - ld.GetController().GenerateCSVConfig(), - mydump.NewStringReader(string(tt.data)), - 1, - nil, - false, - nil) - require.NoError(t, err) - - err = ld.TestLoadLocal(parser) - require.NoError(t, err) + var reader io.ReadCloser = mydump.NewStringReader(string(tt.data)) + var readerBuilder executor.LoadDataReaderBuilder = func(_ string) ( + r io.ReadCloser, err error, + ) { + return reader, nil + } + + ctx.SetValue(executor.LoadDataReaderBuilderKey, readerBuilder) + tk.MustExec(loadSQL) + warnings := tk.Session().GetSessionVars().StmtCtx.GetWarnings() + for _, w := range warnings { + fmt.Printf("warnnig: %#v\n", w.Err.Error()) + } require.Equal(t, tt.expectedMsg, tk.Session().LastMessage(), tt.expected) tk.MustQuery(selectSQL).Check(testkit.RowsWithSep("|", tt.expected...)) tk.MustExec(deleteSQL) @@ -80,7 +82,7 @@ func TestLoadDataInitParam(t *testing.T) { // null def values testFunc := func(sql string, expectedNullDef []string, expectedNullOptEnclosed bool) { - require.NoError(t, tk.ExecToErr(sql)) + require.ErrorContains(t, tk.ExecToErr(sql), "reader is nil") defer ctx.SetValue(executor.LoadDataVarKey, nil) ld, ok := ctx.Value(executor.LoadDataVarKey).(*executor.LoadDataWorker) require.True(t, ok) @@ -102,11 +104,26 @@ func TestLoadDataInitParam(t *testing.T) { []string{"NULL"}, false) // positive case - require.NoError(t, tk.ExecToErr("load data local infile '/a' format 'sql file' into table load_data_test")) + require.ErrorContains( + t, tk.ExecToErr( + "load data local infile '/a' format 'sql file' into table"+ + " load_data_test", + ), "reader is nil", + ) ctx.SetValue(executor.LoadDataVarKey, nil) - require.NoError(t, tk.ExecToErr("load data local infile '/a' into table load_data_test fields terminated by 'a'")) + require.ErrorContains( + t, tk.ExecToErr( + "load data local infile '/a' into table load_data_test fields"+ + " terminated by 'a'", + ), "reader is nil", + ) ctx.SetValue(executor.LoadDataVarKey, nil) - require.NoError(t, tk.ExecToErr("load data local infile '/a' format 'delimited data' into table load_data_test fields terminated by 'a'")) + require.ErrorContains( + t, tk.ExecToErr( + "load data local infile '/a' format 'delimited data' into"+ + " table load_data_test fields terminated by 'a'", + ), "reader is nil", + ) ctx.SetValue(executor.LoadDataVarKey, nil) // According to https://dev.mysql.com/doc/refman/8.0/en/load-data.html , fixed-row format should be used when fields @@ -130,12 +147,8 @@ func TestLoadData(t *testing.T) { tk.MustExec(createSQL) err = tk.ExecToErr("load data infile '/tmp/nonexistence.csv' into table load_data_test") require.Error(t, err) - tk.MustExec("load data local infile '/tmp/nonexistence.csv' ignore into table load_data_test") + loadSQL := "load data local infile '/tmp/nonexistence.csv' ignore into table load_data_test" ctx := tk.Session().(sessionctx.Context) - ld, ok := ctx.Value(executor.LoadDataVarKey).(*executor.LoadDataWorker) - require.True(t, ok) - defer ctx.SetValue(executor.LoadDataVarKey, nil) - require.NotNil(t, ld) deleteSQL := "delete from load_data_test" selectSQL := "select * from load_data_test;" @@ -164,10 +177,11 @@ func TestLoadData(t *testing.T) { {[]byte("\t2\t3\t4\t5\n"), []string{"10|2|3|4"}, "Records: 1 Deleted: 0 Skipped: 0 Warnings: 2"}, {[]byte("\t2\t34\t5\n"), []string{"11|2|34|5"}, "Records: 1 Deleted: 0 Skipped: 0 Warnings: 1"}, } - checkCases(tests, ld, t, tk, ctx, selectSQL, deleteSQL) + checkCases(tests, loadSQL, t, tk, ctx, selectSQL, deleteSQL) // lines starting symbol is "" and terminated symbol length is 2, ReadOneBatchRows returns data is nil - ld.GetController().LinesTerminatedBy = "||" + loadSQL = "load data local infile '/tmp/nonexistence." + + "csv' ignore into table load_data_test lines terminated by '||'" tests = []testCase{ {[]byte("0\t2\t3\t4\t5||"), []string{"12|2|3|4"}, "Records: 1 Deleted: 0 Skipped: 0 Warnings: 1"}, {[]byte("1\t2\t3\t4\t5||"), []string{"1|2|3|4"}, "Records: 1 Deleted: 0 Skipped: 0 Warnings: 1"}, @@ -179,12 +193,11 @@ func TestLoadData(t *testing.T) { []string{"4|2|3|4", "5|22|33|", "6|222||"}, "Records: 3 Deleted: 0 Skipped: 0 Warnings: 3"}, {[]byte("6\t2\t34\t5||"), []string{"6|2|34|5"}, trivialMsg}, } - checkCases(tests, ld, t, tk, ctx, selectSQL, deleteSQL) + checkCases(tests, loadSQL, t, tk, ctx, selectSQL, deleteSQL) // fields and lines aren't default, ReadOneBatchRows returns data is nil - ld.GetController().FieldsTerminatedBy = "\\" - ld.GetController().LinesStartingBy = "xxx" - ld.GetController().LinesTerminatedBy = "|!#^" + loadSQL = "load data local infile '/tmp/nonexistence.csv' " + + `ignore into table load_data_test fields terminated by '\\' lines starting by 'xxx' terminated by '|!#^'` tests = []testCase{ {[]byte("xxx|!#^"), []string{"13|||"}, "Records: 1 Deleted: 0 Skipped: 0 Warnings: 2"}, {[]byte("xxx\\|!#^"), []string{"14|0||"}, "Records: 1 Deleted: 0 Skipped: 0 Warnings: 3"}, @@ -219,7 +232,7 @@ func TestLoadData(t *testing.T) { []string{"25|2|3|4", "27|222||"}, "Records: 2 Deleted: 0 Skipped: 0 Warnings: 2"}, {[]byte("xxx\\2\\34\\5|!#^"), []string{"28|2|34|5"}, "Records: 1 Deleted: 0 Skipped: 0 Warnings: 1"}, } - checkCases(tests, ld, t, tk, ctx, selectSQL, deleteSQL) + checkCases(tests, loadSQL, t, tk, ctx, selectSQL, deleteSQL) // TODO: not support it now // lines starting symbol is the same as terminated symbol, ReadOneBatchRows returns data is nil @@ -258,21 +271,25 @@ func TestLoadData(t *testing.T) { //checkCases(tests, ld, t, tk, ctx, selectSQL, deleteSQL) // test line terminator in field quoter - ld.GetController().LinesTerminatedBy = "\n" - ld.GetController().FieldsEnclosedBy = `"` + loadSQL = "load data local infile '/tmp/nonexistence.csv' " + + "ignore into table load_data_test " + + "fields terminated by '\\\\' enclosed by '\\\"' " + + "lines starting by 'xxx' terminated by '\\n'" tests = []testCase{ {[]byte("xxx1\\1\\\"2\n\"\\3\nxxx4\\4\\\"5\n5\"\\6"), []string{"1|1|2\n|3", "4|4|5\n5|6"}, "Records: 2 Deleted: 0 Skipped: 0 Warnings: 0"}, } - checkCases(tests, ld, t, tk, ctx, selectSQL, deleteSQL) + checkCases(tests, loadSQL, t, tk, ctx, selectSQL, deleteSQL) - ld.GetController().LinesTerminatedBy = "#\n" - ld.GetController().FieldsTerminatedBy = "#" + loadSQL = "load data local infile '/tmp/nonexistence.csv' " + + "ignore into table load_data_test " + + "fields terminated by '#' enclosed by '\\\"' " + + "lines starting by 'xxx' terminated by '#\\n'" tests = []testCase{ {[]byte("xxx1#\nxxx2#\n"), []string{"1|||", "2|||"}, "Records: 2 Deleted: 0 Skipped: 0 Warnings: 2"}, {[]byte("xxx1#2#3#4#\nnxxx2#3#4#5#\n"), []string{"1|2|3|4", "2|3|4|5"}, "Records: 2 Deleted: 0 Skipped: 0 Warnings: 0"}, {[]byte("xxx1#2#\"3#\"#\"4\n\"#\nxxx2#3#\"#4#\n\"#5#\n"), []string{"1|2|3#|4", "2|3|#4#\n|5"}, "Records: 2 Deleted: 0 Skipped: 0 Warnings: 0"}, } - checkCases(tests, ld, t, tk, ctx, selectSQL, deleteSQL) + checkCases(tests, loadSQL, t, tk, ctx, selectSQL, deleteSQL) // TODO: now support it now //ld.LinesInfo.Terminated = "#" @@ -293,12 +310,8 @@ func TestLoadDataEscape(t *testing.T) { tk := testkit.NewTestKit(t, store) tk.MustExec("use test; drop table if exists load_data_test;") tk.MustExec("CREATE TABLE load_data_test (id INT NOT NULL PRIMARY KEY, value TEXT NOT NULL) CHARACTER SET utf8") - tk.MustExec("load data local infile '/tmp/nonexistence.csv' into table load_data_test") + loadSQL := "load data local infile '/tmp/nonexistence.csv' into table load_data_test" ctx := tk.Session().(sessionctx.Context) - ld, ok := ctx.Value(executor.LoadDataVarKey).(*executor.LoadDataWorker) - require.True(t, ok) - defer ctx.SetValue(executor.LoadDataVarKey, nil) - require.NotNil(t, ld) // test escape tests := []testCase{ // data1 = nil, data2 != nil @@ -314,7 +327,7 @@ func TestLoadDataEscape(t *testing.T) { } deleteSQL := "delete from load_data_test" selectSQL := "select * from load_data_test;" - checkCases(tests, ld, t, tk, ctx, selectSQL, deleteSQL) + checkCases(tests, loadSQL, t, tk, ctx, selectSQL, deleteSQL) } // TestLoadDataSpecifiedColumns reuse TestLoadDataEscape's test case :-) @@ -324,12 +337,8 @@ func TestLoadDataSpecifiedColumns(t *testing.T) { tk := testkit.NewTestKit(t, store) tk.MustExec("use test; drop table if exists load_data_test;") tk.MustExec(`create table load_data_test (id int PRIMARY KEY AUTO_INCREMENT, c1 int, c2 varchar(255) default "def", c3 int default 0);`) - tk.MustExec("load data local infile '/tmp/nonexistence.csv' into table load_data_test (c1, c2)") + loadSQL := "load data local infile '/tmp/nonexistence.csv' into table load_data_test (c1, c2)" ctx := tk.Session().(sessionctx.Context) - ld, ok := ctx.Value(executor.LoadDataVarKey).(*executor.LoadDataWorker) - require.True(t, ok) - defer ctx.SetValue(executor.LoadDataVarKey, nil) - require.NotNil(t, ld) // test tests := []testCase{ {[]byte("7\ta string\n"), []string{"1|7|a string|0"}, trivialMsg}, @@ -342,7 +351,7 @@ func TestLoadDataSpecifiedColumns(t *testing.T) { } deleteSQL := "delete from load_data_test" selectSQL := "select * from load_data_test;" - checkCases(tests, ld, t, tk, ctx, selectSQL, deleteSQL) + checkCases(tests, loadSQL, t, tk, ctx, selectSQL, deleteSQL) } func TestLoadDataIgnoreLines(t *testing.T) { @@ -350,19 +359,15 @@ func TestLoadDataIgnoreLines(t *testing.T) { tk := testkit.NewTestKit(t, store) tk.MustExec("use test; drop table if exists load_data_test;") tk.MustExec("CREATE TABLE load_data_test (id INT NOT NULL PRIMARY KEY, value TEXT NOT NULL) CHARACTER SET utf8") - tk.MustExec("load data local infile '/tmp/nonexistence.csv' into table load_data_test ignore 1 lines") + loadSQL := "load data local infile '/tmp/nonexistence.csv' into table load_data_test ignore 1 lines" ctx := tk.Session().(sessionctx.Context) - ld, ok := ctx.Value(executor.LoadDataVarKey).(*executor.LoadDataWorker) - require.True(t, ok) - defer ctx.SetValue(executor.LoadDataVarKey, nil) - require.NotNil(t, ld) tests := []testCase{ {[]byte("1\tline1\n2\tline2\n"), []string{"2|line2"}, "Records: 1 Deleted: 0 Skipped: 0 Warnings: 0"}, {[]byte("1\tline1\n2\tline2\n3\tline3\n"), []string{"2|line2", "3|line3"}, "Records: 2 Deleted: 0 Skipped: 0 Warnings: 0"}, } deleteSQL := "delete from load_data_test" selectSQL := "select * from load_data_test;" - checkCases(tests, ld, t, tk, ctx, selectSQL, deleteSQL) + checkCases(tests, loadSQL, t, tk, ctx, selectSQL, deleteSQL) } func TestLoadDataNULL(t *testing.T) { @@ -374,13 +379,9 @@ func TestLoadDataNULL(t *testing.T) { tk := testkit.NewTestKit(t, store) tk.MustExec("use test; drop table if exists load_data_test;") tk.MustExec("CREATE TABLE load_data_test (id VARCHAR(20), value VARCHAR(20)) CHARACTER SET utf8") - tk.MustExec(`load data local infile '/tmp/nonexistence.csv' into table load_data_test -FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n';`) + loadSQL := `load data local infile '/tmp/nonexistence.csv' into table load_data_test +FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n';` ctx := tk.Session().(sessionctx.Context) - ld, ok := ctx.Value(executor.LoadDataVarKey).(*executor.LoadDataWorker) - require.True(t, ok) - defer ctx.SetValue(executor.LoadDataVarKey, nil) - require.NotNil(t, ld) tests := []testCase{ { []byte(`NULL,"NULL" @@ -392,7 +393,7 @@ FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n';`) } deleteSQL := "delete from load_data_test" selectSQL := "select * from load_data_test;" - checkCases(tests, ld, t, tk, ctx, selectSQL, deleteSQL) + checkCases(tests, loadSQL, t, tk, ctx, selectSQL, deleteSQL) } func TestLoadDataReplace(t *testing.T) { @@ -401,19 +402,15 @@ func TestLoadDataReplace(t *testing.T) { tk.MustExec("USE test; DROP TABLE IF EXISTS load_data_replace;") tk.MustExec("CREATE TABLE load_data_replace (id INT NOT NULL PRIMARY KEY, value TEXT NOT NULL)") tk.MustExec("INSERT INTO load_data_replace VALUES(1,'val 1'),(2,'val 2')") - tk.MustExec("LOAD DATA LOCAL INFILE '/tmp/nonexistence.csv' REPLACE INTO TABLE load_data_replace") + loadSQL := "LOAD DATA LOCAL INFILE '/tmp/nonexistence.csv' REPLACE INTO TABLE load_data_replace" ctx := tk.Session().(sessionctx.Context) - ld, ok := ctx.Value(executor.LoadDataVarKey).(*executor.LoadDataWorker) - require.True(t, ok) - defer ctx.SetValue(executor.LoadDataVarKey, nil) - require.NotNil(t, ld) tests := []testCase{ {[]byte("1\tline1\n2\tline2\n"), []string{"1|line1", "2|line2"}, "Records: 2 Deleted: 2 Skipped: 0 Warnings: 0"}, {[]byte("2\tnew line2\n3\tnew line3\n"), []string{"1|line1", "2|new line2", "3|new line3"}, "Records: 2 Deleted: 1 Skipped: 0 Warnings: 0"}, } deleteSQL := "DO 1" selectSQL := "TABLE load_data_replace;" - checkCases(tests, ld, t, tk, ctx, selectSQL, deleteSQL) + checkCases(tests, loadSQL, t, tk, ctx, selectSQL, deleteSQL) } // TestLoadDataOverflowBigintUnsigned related to issue 6360 @@ -422,19 +419,15 @@ func TestLoadDataOverflowBigintUnsigned(t *testing.T) { tk := testkit.NewTestKit(t, store) tk.MustExec("use test; drop table if exists load_data_test;") tk.MustExec("CREATE TABLE load_data_test (a bigint unsigned);") - tk.MustExec("load data local infile '/tmp/nonexistence.csv' into table load_data_test") + loadSQL := "load data local infile '/tmp/nonexistence.csv' into table load_data_test" ctx := tk.Session().(sessionctx.Context) - ld, ok := ctx.Value(executor.LoadDataVarKey).(*executor.LoadDataWorker) - require.True(t, ok) - defer ctx.SetValue(executor.LoadDataVarKey, nil) - require.NotNil(t, ld) tests := []testCase{ {[]byte("-1\n-18446744073709551615\n-18446744073709551616\n"), []string{"0", "0", "0"}, "Records: 3 Deleted: 0 Skipped: 0 Warnings: 3"}, {[]byte("-9223372036854775809\n18446744073709551616\n"), []string{"0", "18446744073709551615"}, "Records: 2 Deleted: 0 Skipped: 0 Warnings: 2"}, } deleteSQL := "delete from load_data_test" selectSQL := "select * from load_data_test;" - checkCases(tests, ld, t, tk, ctx, selectSQL, deleteSQL) + checkCases(tests, loadSQL, t, tk, ctx, selectSQL, deleteSQL) } func TestLoadDataWithUppercaseUserVars(t *testing.T) { @@ -442,19 +435,15 @@ func TestLoadDataWithUppercaseUserVars(t *testing.T) { tk := testkit.NewTestKit(t, store) tk.MustExec("use test; drop table if exists load_data_test;") tk.MustExec("CREATE TABLE load_data_test (a int, b int);") - tk.MustExec("load data local infile '/tmp/nonexistence.csv' into table load_data_test (@V1)" + - " set a = @V1, b = @V1*100") + loadSQL := "load data local infile '/tmp/nonexistence.csv' into table load_data_test (@V1)" + + " set a = @V1, b = @V1*100" ctx := tk.Session().(sessionctx.Context) - ld, ok := ctx.Value(executor.LoadDataVarKey).(*executor.LoadDataWorker) - require.True(t, ok) - defer ctx.SetValue(executor.LoadDataVarKey, nil) - require.NotNil(t, ld) tests := []testCase{ {[]byte("1\n2\n"), []string{"1|100", "2|200"}, "Records: 2 Deleted: 0 Skipped: 0 Warnings: 0"}, } deleteSQL := "delete from load_data_test" selectSQL := "select * from load_data_test;" - checkCases(tests, ld, t, tk, ctx, selectSQL, deleteSQL) + checkCases(tests, loadSQL, t, tk, ctx, selectSQL, deleteSQL) } func TestLoadDataIntoPartitionedTable(t *testing.T) { @@ -465,14 +454,21 @@ func TestLoadDataIntoPartitionedTable(t *testing.T) { "partition p0 values less than (4)," + "partition p1 values less than (7)," + "partition p2 values less than (11))") - tk.MustExec("load data local infile '/tmp/nonexistence.csv' into table range_t fields terminated by ','") ctx := tk.Session().(sessionctx.Context) - ld := ctx.Value(executor.LoadDataVarKey).(*executor.LoadDataWorker) - + loadSQL := "load data local infile '/tmp/nonexistence.csv' into table range_t fields terminated by ','" tests := []testCase{ {[]byte("1,2\n3,4\n5,6\n7,8\n9,10\n"), []string{"1|2", "3|4", "5|6", "7|8", "9|10"}, "Records: 5 Deleted: 0 Skipped: 0 Warnings: 0"}, } deleteSQL := "delete from range_t" selectSQL := "select * from range_t order by a;" - checkCases(tests, ld, t, tk, ctx, selectSQL, deleteSQL) + checkCases(tests, loadSQL, t, tk, ctx, selectSQL, deleteSQL) +} + +func TestLoadDataFromServerFile(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("create table load_data_test (a int)") + err := tk.ExecToErr("load data infile 'remote.csv' into table load_data_test") + require.ErrorContains(t, err, "[executor:8154]Don't support load data from tidb-server's disk.") } diff --git a/pkg/executor/test/loaddatatest/main_test.go b/pkg/executor/test/loaddatatest/main_test.go index 3faf8fd44e2c4..7f9bd8bbff7b2 100644 --- a/pkg/executor/test/loaddatatest/main_test.go +++ b/pkg/executor/test/loaddatatest/main_test.go @@ -39,6 +39,7 @@ func TestMain(m *testing.M) { view.Stop() }), goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("gopkg.in/natefinch/lumberjack%2ev2.(*Logger).millRun"), diff --git a/pkg/executor/test/loadremotetest/error_test.go b/pkg/executor/test/loadremotetest/error_test.go index 1c542e47222f2..2fde8108b59ea 100644 --- a/pkg/executor/test/loadremotetest/error_test.go +++ b/pkg/executor/test/loadremotetest/error_test.go @@ -54,7 +54,7 @@ func (s *mockGCSSuite) TestErrorMessage() { checkClientErrorMessage(s.T(), err, "ERROR 1054 (42S22): Unknown column 'wrong' in 'field list'") err = s.tk.ExecToErr("LOAD DATA INFILE 'abc://1' INTO TABLE t;") checkClientErrorMessage(s.T(), err, - "ERROR 8158 (HY000): The URI of data source is invalid. Reason: storage abc not support yet. Please provide a valid URI, such as 's3://import/test.csv?access_key_id={your_access_key_id ID}&secret_access_key={your_secret_access_key}&session_token={your_session_token}'") + "ERROR 8158 (HY000): The URI of data source is invalid. Reason: storage abc not support yet. Please provide a valid URI, such as") err = s.tk.ExecToErr("LOAD DATA INFILE 's3://no-network' INTO TABLE t;") checkClientErrorMessage(s.T(), err, "ERROR 8159 (HY000): Access to the data source has been denied. Reason: failed to get region of bucket no-network. Please check the URI, access key and secret access key are correct") diff --git a/pkg/executor/test/loadremotetest/main_test.go b/pkg/executor/test/loadremotetest/main_test.go index 9d44db6a42d6f..f3efe797be145 100644 --- a/pkg/executor/test/loadremotetest/main_test.go +++ b/pkg/executor/test/loadremotetest/main_test.go @@ -23,6 +23,7 @@ import ( func TestMain(m *testing.M) { opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("github.com/tikv/client-go/v2/txnkv/transaction.keepAlive"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), diff --git a/pkg/executor/test/loadremotetest/one_csv_test.go b/pkg/executor/test/loadremotetest/one_csv_test.go index 4a021ecebbe56..2fefa018d63fa 100644 --- a/pkg/executor/test/loadremotetest/one_csv_test.go +++ b/pkg/executor/test/loadremotetest/one_csv_test.go @@ -85,6 +85,47 @@ func (s *mockGCSSuite) TestLoadCSV() { s.tk.MustContainErrMsg(sql, "Don't support load data from tidb-server's disk. Or if you want to load local data via client, the path of INFILE '/etc/passwd' needs to specify the clause of LOCAL first") } +func (s *mockGCSSuite) TestLoadCsvInTransaction() { + s.tk.MustExec("DROP DATABASE IF EXISTS load_csv;") + s.tk.MustExec("CREATE DATABASE load_csv;") + s.tk.MustExec("CREATE TABLE load_csv.t (i INT, s varchar(32));") + + s.server.CreateObject( + fakestorage.Object{ + ObjectAttrs: fakestorage.ObjectAttrs{ + BucketName: "test-load-csv", + Name: "data.csv", + }, + Content: []byte("100, test100\n101, hello\n102, 😄😄😄😄😄\n104, bye"), + }, + ) + + s.tk.MustExec("begin pessimistic") + sql := fmt.Sprintf( + `LOAD DATA INFILE 'gs://test-load-csv/data.csv?endpoint=%s' INTO TABLE load_csv.t `+ + "FIELDS TERMINATED BY ','", + gcsEndpoint, + ) + // test: load data stmt doesn't commit it + s.tk.MustExec("insert into load_csv.t values (1, 'a')") + s.tk.MustExec(sql) + s.tk.MustQuery("select i from load_csv.t order by i").Check( + testkit.Rows( + "1", "100", "101", + "102", "104", + ), + ) + // load data can be rolled back + s.tk.MustExec("rollback") + s.tk.MustQuery("select * from load_csv.t").Check(testkit.Rows()) + + // load data commit + s.tk.MustExec("begin pessimistic") + s.tk.MustExec(sql) + s.tk.MustExec("commit") + s.tk.MustQuery("select i from load_csv.t").Check(testkit.Rows("100", "101", "102", "104")) +} + func (s *mockGCSSuite) TestIgnoreNLines() { s.tk.MustExec("DROP DATABASE IF EXISTS load_csv;") s.tk.MustExec("CREATE DATABASE load_csv;") diff --git a/pkg/executor/test/memtest/main_test.go b/pkg/executor/test/memtest/main_test.go index 2e8510e089f7e..ace0c6cdfabf7 100644 --- a/pkg/executor/test/memtest/main_test.go +++ b/pkg/executor/test/memtest/main_test.go @@ -35,6 +35,7 @@ func TestMain(m *testing.M) { opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), diff --git a/pkg/executor/test/oomtest/oom_test.go b/pkg/executor/test/oomtest/oom_test.go index 1df45756c7446..203de6af4b084 100644 --- a/pkg/executor/test/oomtest/oom_test.go +++ b/pkg/executor/test/oomtest/oom_test.go @@ -38,6 +38,7 @@ func TestMain(m *testing.M) { registerHook() opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), } diff --git a/pkg/executor/test/passwordtest/main_test.go b/pkg/executor/test/passwordtest/main_test.go index 2604981c6e50a..12f90627c09b5 100644 --- a/pkg/executor/test/passwordtest/main_test.go +++ b/pkg/executor/test/passwordtest/main_test.go @@ -23,6 +23,7 @@ import ( func TestMain(m *testing.M) { opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("github.com/tikv/client-go/v2/txnkv/transaction.keepAlive"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), diff --git a/pkg/executor/test/seqtest/main_test.go b/pkg/executor/test/seqtest/main_test.go index 74a205d7509f1..d6fa430e636ef 100644 --- a/pkg/executor/test/seqtest/main_test.go +++ b/pkg/executor/test/seqtest/main_test.go @@ -30,6 +30,7 @@ func TestMain(m *testing.M) { }) opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("github.com/pingcap/tidb/pkg/executor.readProjection[...]"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), diff --git a/pkg/executor/test/seqtest/seq_executor_test.go b/pkg/executor/test/seqtest/seq_executor_test.go index 363f97c3b2ec4..821d144b8c632 100644 --- a/pkg/executor/test/seqtest/seq_executor_test.go +++ b/pkg/executor/test/seqtest/seq_executor_test.go @@ -808,9 +808,11 @@ func HelperTestAdminShowNextID(t *testing.T, store kv.Storage, str string) { tk.MustExec("use test1") r = tk.MustQuery(str + " tt next_row_id") r.Check(testkit.Rows("test1 tt id 31 _TIDB_ROWID", "test1 tt id 1 AUTO_INCREMENT")) + tk.MustQuery(`select * from tt`).Sort().Check(testkit.Rows("20 1")) tk.MustExec("insert test1.tt values ()") r = tk.MustQuery(str + " tt next_row_id") - r.Check(testkit.Rows("test1 tt id 41 _TIDB_ROWID", "test1 tt id 1 AUTO_INCREMENT")) + r.Check(testkit.Rows("test1 tt id 31 _TIDB_ROWID", "test1 tt id 1 AUTO_INCREMENT")) + tk.MustQuery(`select * from tt`).Sort().Check(testkit.Rows("20 1", "21 ")) tk.MustExec("drop table tt") tk.MustExec("drop table if exists t;") @@ -946,7 +948,7 @@ func TestBatchInsertDelete(t *testing.T) { kv.TxnTotalSizeLimit.Store(originLimit) }() // Set the limitation to a small value, make it easier to reach the limitation. - kv.TxnTotalSizeLimit.Store(6000) + kv.TxnTotalSizeLimit.Store(7000) tk := testkit.NewTestKit(t, store) tk.MustExec("use test") diff --git a/pkg/executor/test/showtest/main_test.go b/pkg/executor/test/showtest/main_test.go index a7ed167631652..7327f128c09f1 100644 --- a/pkg/executor/test/showtest/main_test.go +++ b/pkg/executor/test/showtest/main_test.go @@ -35,6 +35,7 @@ func TestMain(m *testing.M) { opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("gopkg.in/natefinch/lumberjack%2ev2.(*Logger).millRun"), diff --git a/pkg/executor/test/simpletest/main_test.go b/pkg/executor/test/simpletest/main_test.go index a0991c0832bb6..6528ec00969eb 100644 --- a/pkg/executor/test/simpletest/main_test.go +++ b/pkg/executor/test/simpletest/main_test.go @@ -23,6 +23,7 @@ import ( func TestMain(m *testing.M) { opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("github.com/tikv/client-go/v2/txnkv/transaction.keepAlive"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), diff --git a/pkg/executor/test/splittest/main_test.go b/pkg/executor/test/splittest/main_test.go index c0b378d04b9be..a5eb063330384 100644 --- a/pkg/executor/test/splittest/main_test.go +++ b/pkg/executor/test/splittest/main_test.go @@ -23,6 +23,7 @@ import ( func TestMain(m *testing.M) { opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), } diff --git a/pkg/executor/test/splittest/split_table_test.go b/pkg/executor/test/splittest/split_table_test.go index 4a81c5a93553e..0235aa8b75aa8 100644 --- a/pkg/executor/test/splittest/split_table_test.go +++ b/pkg/executor/test/splittest/split_table_test.go @@ -63,6 +63,11 @@ func TestClusterIndexShowTableRegion(t *testing.T) { // Check the region start key is int64. require.Regexp(t, fmt.Sprintf("t_%d_", tbl.Meta().ID), rows[0][1]) require.Regexp(t, fmt.Sprintf("t_%d_r_50000", tbl.Meta().ID), rows[1][1]) + + // test split regions boundary, it's too slow in TiKV env, move it here. + tk.MustExec("drop table if exists t") + tk.MustExec("create table t (a int, b int, c int, d int, primary key(a, c, d));") + tk.MustQuery("split table t between (0, 0, 0) and (0, 0, 1) regions 1000;").Check(testkit.Rows("999 1")) } func TestShowTableRegion(t *testing.T) { diff --git a/pkg/executor/test/tiflashtest/BUILD.bazel b/pkg/executor/test/tiflashtest/BUILD.bazel index 4afb61918b486..b60b56f408a9e 100644 --- a/pkg/executor/test/tiflashtest/BUILD.bazel +++ b/pkg/executor/test/tiflashtest/BUILD.bazel @@ -9,7 +9,7 @@ go_test( ], flaky = True, race = "on", - shard_count = 40, + shard_count = 42, deps = [ "//pkg/config", "//pkg/domain", diff --git a/pkg/executor/test/tiflashtest/main_test.go b/pkg/executor/test/tiflashtest/main_test.go index 61bfd1049122f..13bcef4fa6f61 100644 --- a/pkg/executor/test/tiflashtest/main_test.go +++ b/pkg/executor/test/tiflashtest/main_test.go @@ -39,6 +39,7 @@ func TestMain(m *testing.M) { view.Stop() }), goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("gopkg.in/natefinch/lumberjack%2ev2.(*Logger).millRun"), diff --git a/pkg/executor/test/tiflashtest/tiflash_test.go b/pkg/executor/test/tiflashtest/tiflash_test.go index 1502e54baf76b..1946fe25ddce4 100644 --- a/pkg/executor/test/tiflashtest/tiflash_test.go +++ b/pkg/executor/test/tiflashtest/tiflash_test.go @@ -1871,3 +1871,120 @@ func checkMPPInExplain(t *testing.T, tk *testkit.TestKit, sql string) { res := resBuff.String() require.Contains(t, res, "mpp[tiflash]") } + +func TestMPPRecovery(t *testing.T) { + store := testkit.CreateMockStore(t, withMockTiFlash(2)) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + + tk.MustExec("create table t(a int, b int)") + tk.MustExec("alter table t set tiflash replica 1") + tb := external.GetTableByName(t, tk, "test", "t") + err := domain.GetDomain(tk.Session()).DDL().UpdateTableReplicaInfo(tk.Session(), tb.Meta().ID, true) + require.NoError(t, err) + + checkStrs := []string{"0 0"} + insertStr := "insert into t values(0, 0)" + for i := 1; i < 1500; i++ { + insertStr += fmt.Sprintf(",(%d, %d)", i, i) + checkStrs = append(checkStrs, fmt.Sprintf("%d %d", i, i)) + } + tk.MustExec(insertStr) + tk.MustExec("set @@session.tidb_isolation_read_engines=\"tiflash\"") + sql := "select * from t order by 1, 2" + const packagePath = "github.com/pingcap/tidb/pkg/executor/internal/mpp/" + + require.NoError(t, failpoint.Enable(packagePath+"mpp_recovery_test_mock_enable", "return()")) + require.NoError(t, failpoint.Enable(packagePath+"mpp_recovery_test_ignore_recovery_err", "return()")) + // Test different chunk size. And force one mpp err. + { + require.NoError(t, failpoint.Enable(packagePath+"mpp_recovery_test_max_err_times", "return(1)")) + + tk.MustExec("set @@tidb_max_chunk_size = default") + tk.MustQuery(sql).Check(testkit.Rows(checkStrs...)) + tk.MustExec("set @@tidb_max_chunk_size = 32") + tk.MustQuery(sql).Check(testkit.Rows(checkStrs...)) + + require.NoError(t, failpoint.Disable(packagePath+"mpp_recovery_test_max_err_times")) + } + + // Test exceeds max recovery times. Default max times is 3. + { + require.NoError(t, failpoint.Enable(packagePath+"mpp_recovery_test_max_err_times", "return(5)")) + + tk.MustExec("set @@tidb_max_chunk_size = 32") + err := tk.QueryToErr(sql) + strings.Contains(err.Error(), "mock mpp err") + + require.NoError(t, failpoint.Disable(packagePath+"mpp_recovery_test_max_err_times")) + } + + { + // When AllowFallbackToTiKV, mpp err recovery should be disabled. + // So event we inject mock err multiple times, the query should be ok. + tk.MustExec("set @@tidb_allow_fallback_to_tikv = \"tiflash\"") + require.NoError(t, failpoint.Enable(packagePath+"mpp_recovery_test_max_err_times", "return(5)")) + + tk.MustExec("set @@tidb_max_chunk_size = 32") + tk.MustQuery(sql).Check(testkit.Rows(checkStrs...)) + + tk.MustExec("set @@tidb_allow_fallback_to_tikv = default") + require.NoError(t, failpoint.Disable(packagePath+"mpp_recovery_test_max_err_times")) + } + + // Test hold logic. Default hold 4 * MaxChunkSize rows. + { + require.NoError(t, failpoint.Enable(packagePath+"mpp_recovery_test_max_err_times", "return(0)")) + + tk.MustExec("set @@tidb_max_chunk_size = 32") + expectedHoldSize := 2 + require.NoError(t, failpoint.Enable(packagePath+"mpp_recovery_test_hold_size", fmt.Sprintf("1*return(%d)", expectedHoldSize))) + tk.MustQuery(sql).Check(testkit.Rows(checkStrs...)) + require.NoError(t, failpoint.Disable(packagePath+"mpp_recovery_test_hold_size")) + + require.NoError(t, failpoint.Disable(packagePath+"mpp_recovery_test_max_err_times")) + } + require.NoError(t, failpoint.Disable(packagePath+"mpp_recovery_test_ignore_recovery_err")) + require.NoError(t, failpoint.Disable(packagePath+"mpp_recovery_test_mock_enable")) + + { + // We have 2 mock tiflash, but the table is small, so only 1 tiflash node is in computation. + require.NoError(t, failpoint.Enable(packagePath+"mpp_recovery_test_check_node_cnt", "return(1)")) + + tk.MustExec("set @@tidb_max_chunk_size = 32") + tk.MustQuery(sql).Check(testkit.Rows(checkStrs...)) + + require.NoError(t, failpoint.Disable(packagePath+"mpp_recovery_test_check_node_cnt")) + } + + tk.MustExec("set @@tidb_max_chunk_size = default") +} + +func TestIssue50358(t *testing.T) { + store := testkit.CreateMockStore(t, withMockTiFlash(1)) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a int not null primary key, b int not null)") + tk.MustExec("alter table t set tiflash replica 1") + tb := external.GetTableByName(t, tk, "test", "t") + err := domain.GetDomain(tk.Session()).DDL().UpdateTableReplicaInfo(tk.Session(), tb.Meta().ID, true) + require.NoError(t, err) + tk.MustExec("insert into t values(1,0)") + tk.MustExec("insert into t values(2,0)") + + tk.MustExec("drop table if exists t1") + tk.MustExec("create table t1(c int not null primary key)") + tk.MustExec("alter table t1 set tiflash replica 1") + tb = external.GetTableByName(t, tk, "test", "t1") + err = domain.GetDomain(tk.Session()).DDL().UpdateTableReplicaInfo(tk.Session(), tb.Meta().ID, true) + require.NoError(t, err) + tk.MustExec("insert into t1 values(3)") + + tk.MustExec("set @@session.tidb_isolation_read_engines=\"tiflash\"") + tk.MustExec("set @@session.tidb_allow_mpp=ON") + for i := 0; i < 20; i++ { + // test if it is stable. + tk.MustQuery("select 8 from t join t1").Check(testkit.Rows("8", "8")) + } +} diff --git a/pkg/executor/test/unstabletest/main_test.go b/pkg/executor/test/unstabletest/main_test.go index 10e6939dcd9c8..b2be729c1e95d 100644 --- a/pkg/executor/test/unstabletest/main_test.go +++ b/pkg/executor/test/unstabletest/main_test.go @@ -39,6 +39,7 @@ func TestMain(m *testing.M) { view.Stop() }), goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("gopkg.in/natefinch/lumberjack%2ev2.(*Logger).millRun"), diff --git a/pkg/executor/test/writetest/BUILD.bazel b/pkg/executor/test/writetest/BUILD.bazel index 59e3023cb91fe..a18362e5ee062 100644 --- a/pkg/executor/test/writetest/BUILD.bazel +++ b/pkg/executor/test/writetest/BUILD.bazel @@ -8,10 +8,11 @@ go_test( "write_test.go", ], flaky = True, - shard_count = 10, + shard_count = 9, deps = [ "//br/pkg/lightning/mydump", "//pkg/config", + "//pkg/errctx", "//pkg/executor", "//pkg/kv", "//pkg/meta/autoid", @@ -26,7 +27,6 @@ go_test( "//pkg/types", "//pkg/util", "//pkg/util/mock", - "@com_github_pingcap_failpoint//:failpoint", "@com_github_stretchr_testify//require", "@com_github_tikv_client_go_v2//tikv", "@io_opencensus_go//stats/view", diff --git a/pkg/executor/test/writetest/main_test.go b/pkg/executor/test/writetest/main_test.go index e21407c88dbba..3507904b08d1b 100644 --- a/pkg/executor/test/writetest/main_test.go +++ b/pkg/executor/test/writetest/main_test.go @@ -39,6 +39,7 @@ func TestMain(m *testing.M) { view.Stop() }), goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("gopkg.in/natefinch/lumberjack%2ev2.(*Logger).millRun"), diff --git a/pkg/executor/test/writetest/write_test.go b/pkg/executor/test/writetest/write_test.go index d279259fc0636..3f7b5beab1324 100644 --- a/pkg/executor/test/writetest/write_test.go +++ b/pkg/executor/test/writetest/write_test.go @@ -18,11 +18,11 @@ import ( "context" "errors" "fmt" + "io" "testing" - "github.com/pingcap/failpoint" "github.com/pingcap/tidb/br/pkg/lightning/mydump" - "github.com/pingcap/tidb/pkg/config" + "github.com/pingcap/tidb/pkg/errctx" "github.com/pingcap/tidb/pkg/executor" "github.com/pingcap/tidb/pkg/kv" "github.com/pingcap/tidb/pkg/parser/model" @@ -167,25 +167,26 @@ type testCase struct { func checkCases( tests []testCase, - ld *executor.LoadDataWorker, + loadSQL string, t *testing.T, tk *testkit.TestKit, ctx sessionctx.Context, selectSQL, deleteSQL string, ) { for _, tt := range tests { - parser, err := mydump.NewCSVParser( - context.Background(), - ld.GetController().GenerateCSVConfig(), - mydump.NewStringReader(string(tt.data)), - 1, - nil, - false, - nil) - require.NoError(t, err) + var reader io.ReadCloser = mydump.NewStringReader(string(tt.data)) + var readerBuilder executor.LoadDataReaderBuilder = func(_ string) ( + r io.ReadCloser, err error, + ) { + return reader, nil + } - err = ld.TestLoadLocal(parser) - require.NoError(t, err) + ctx.SetValue(executor.LoadDataReaderBuilderKey, readerBuilder) + tk.MustExec(loadSQL) + warnings := tk.Session().GetSessionVars().StmtCtx.GetWarnings() + for _, w := range warnings { + fmt.Printf("warnnig: %#v\n", w.Err.Error()) + } require.Equal(t, tt.expectedMsg, tk.Session().LastMessage(), tt.expected) tk.MustQuery(selectSQL).Check(testkit.RowsWithSep("|", tt.expected...)) tk.MustExec(deleteSQL) @@ -198,12 +199,8 @@ func TestLoadDataMissingColumn(t *testing.T) { tk.MustExec("use test") createSQL := `create table load_data_missing (id int, t timestamp not null)` tk.MustExec(createSQL) - tk.MustExec("load data local infile '/tmp/nonexistence.csv' ignore into table load_data_missing") + loadSQL := "load data local infile '/tmp/nonexistence.csv' ignore into table load_data_missing" ctx := tk.Session().(sessionctx.Context) - ld, ok := ctx.Value(executor.LoadDataVarKey).(*executor.LoadDataWorker) - require.True(t, ok) - defer ctx.SetValue(executor.LoadDataVarKey, nil) - require.NotNil(t, ld) deleteSQL := "delete from load_data_missing" selectSQL := "select id, hour(t), minute(t) from load_data_missing;" @@ -215,7 +212,7 @@ func TestLoadDataMissingColumn(t *testing.T) { {[]byte(""), nil, "Records: 0 Deleted: 0 Skipped: 0 Warnings: 0"}, {[]byte("12\n"), []string{fmt.Sprintf("12|%v|%v", timeHour, timeMinute)}, "Records: 1 Deleted: 0 Skipped: 0 Warnings: 1"}, } - checkCases(tests, ld, t, tk, ctx, selectSQL, deleteSQL) + checkCases(tests, loadSQL, t, tk, ctx, selectSQL, deleteSQL) tk.MustExec("alter table load_data_missing add column t2 timestamp null") curTime = types.CurrentTime(mysql.TypeTimestamp) @@ -225,7 +222,7 @@ func TestLoadDataMissingColumn(t *testing.T) { tests = []testCase{ {[]byte("12\n"), []string{fmt.Sprintf("12|%v|%v|", timeHour, timeMinute)}, "Records: 1 Deleted: 0 Skipped: 0 Warnings: 1"}, } - checkCases(tests, ld, t, tk, ctx, selectSQL, deleteSQL) + checkCases(tests, loadSQL, t, tk, ctx, selectSQL, deleteSQL) } func TestIssue18681(t *testing.T) { @@ -235,17 +232,14 @@ func TestIssue18681(t *testing.T) { createSQL := `drop table if exists load_data_test; create table load_data_test (a bit(1),b bit(1),c bit(1),d bit(1));` tk.MustExec(createSQL) - tk.MustExec("load data local infile '/tmp/nonexistence.csv' ignore into table load_data_test") + loadSQL := "load data local infile '/tmp/nonexistence.csv' ignore into table load_data_test" ctx := tk.Session().(sessionctx.Context) - ld, ok := ctx.Value(executor.LoadDataVarKey).(*executor.LoadDataWorker) - require.True(t, ok) - defer ctx.SetValue(executor.LoadDataVarKey, nil) - require.NotNil(t, ld) deleteSQL := "delete from load_data_test" selectSQL := "select bin(a), bin(b), bin(c), bin(d) from load_data_test;" - ctx.GetSessionVars().StmtCtx.DupKeyAsWarning = true - ctx.GetSessionVars().StmtCtx.BadNullAsWarning = true + levels := ctx.GetSessionVars().StmtCtx.ErrLevels() + levels[errctx.ErrGroupDupKey] = errctx.LevelWarn + levels[errctx.ErrGroupBadNull] = errctx.LevelWarn sc := ctx.GetSessionVars().StmtCtx oldTypeFlags := sc.TypeFlags() @@ -256,7 +250,7 @@ func TestIssue18681(t *testing.T) { tests := []testCase{ {[]byte("true\tfalse\t0\t1\n"), []string{"1|0|0|1"}, "Records: 1 Deleted: 0 Skipped: 0 Warnings: 0"}, } - checkCases(tests, ld, t, tk, ctx, selectSQL, deleteSQL) + checkCases(tests, loadSQL, t, tk, ctx, selectSQL, deleteSQL) require.Equal(t, uint16(0), sc.WarningCount()) } @@ -270,13 +264,12 @@ func TestIssue34358(t *testing.T) { tk.MustExec("drop table if exists load_data_test") tk.MustExec("create table load_data_test (a varchar(10), b varchar(10))") - tk.MustExec("load data local infile '/tmp/nonexistence.csv' into table load_data_test ( @v1, @v2 ) set a = @v1, b = @v2") - ld, ok := ctx.Value(executor.LoadDataVarKey).(*executor.LoadDataWorker) - require.True(t, ok) - require.NotNil(t, ld) + loadSQL := "load data local infile '/tmp/nonexistence.csv' into table load_data_test ( @v1, " + + "@v2 ) set a = @v1, b = @v2" checkCases([]testCase{ {[]byte("\\N\n"), []string{"|"}, "Records: 1 Deleted: 0 Skipped: 0 Warnings: 1"}, - }, ld, t, tk, ctx, "select * from load_data_test", "delete from load_data_test") + }, loadSQL, t, tk, ctx, "select * from load_data_test", "delete from load_data_test", + ) } func TestLatch(t *testing.T) { @@ -560,47 +553,3 @@ func TestPessimisticDeleteYourWrites(t *testing.T) { session2.MustExec("commit;") session2.MustQuery("select * from x").Check(testkit.Rows("1 2")) } - -func TestListColumnsPartitionWithGlobalIndex(t *testing.T) { - failpoint.Enable("github.com/pingcap/tidb/pkg/planner/core/forceDynamicPrune", `return(true)`) - defer failpoint.Disable("github.com/pingcap/tidb/pkg/planner/core/forceDynamicPrune") - store := testkit.CreateMockStore(t) - tk := testkit.NewTestKit(t, store) - tk.MustExec("use test") - tk.MustExec("set @@session.tidb_enable_list_partition = ON") - // Test generated column with global index - restoreConfig := config.RestoreFunc() - defer restoreConfig() - config.UpdateGlobal(func(conf *config.Config) { - conf.EnableGlobalIndex = true - }) - tableDefs := []string{ - // Test for virtual generated column with global index - `create table t (a varchar(10), b varchar(1) GENERATED ALWAYS AS (substr(a,1,1)) VIRTUAL) partition by list columns(b) (partition p0 values in ('a','c'), partition p1 values in ('b','d'));`, - // Test for stored generated column with global index - `create table t (a varchar(10), b varchar(1) GENERATED ALWAYS AS (substr(a,1,1)) STORED) partition by list columns(b) (partition p0 values in ('a','c'), partition p1 values in ('b','d'));`, - } - for _, tbl := range tableDefs { - tk.MustExec("drop table if exists t") - tk.MustExec(tbl) - tk.MustExec("alter table t add unique index (a)") - tk.MustExec("insert into t (a) values ('aaa'),('abc'),('acd')") - tk.MustQuery("select a from t partition (p0) order by a").Check(testkit.Rows("aaa", "abc", "acd")) - tk.MustQuery("select * from t where a = 'abc' order by a").Check(testkit.Rows("abc a")) - tk.MustExec("update t set a='bbb' where a = 'aaa'") - tk.MustExec("admin check table t") - tk.MustQuery("select a from t order by a").Check(testkit.Rows("abc", "acd", "bbb")) - tk.MustQuery("select a from t partition (p0) order by a").Check(testkit.Rows("abc", "acd")) - tk.MustQuery("select a from t partition (p1) order by a").Check(testkit.Rows("bbb")) - tk.MustQuery("select * from t where a = 'bbb' order by a").Check(testkit.Rows("bbb b")) - // Test insert meet duplicate error. - err := tk.ExecToErr("insert into t (a) values ('abc')") - require.Error(t, err) - // Test insert on duplicate update - tk.MustExec("insert into t (a) values ('abc') on duplicate key update a='bbc'") - tk.MustQuery("select a from t order by a").Check(testkit.Rows("acd", "bbb", "bbc")) - tk.MustQuery("select * from t where a = 'bbc'").Check(testkit.Rows("bbc b")) - tk.MustQuery("select a from t partition (p0) order by a").Check(testkit.Rows("acd")) - tk.MustQuery("select a from t partition (p1) order by a").Check(testkit.Rows("bbb", "bbc")) - } -} diff --git a/pkg/executor/tikv_regions_peers_table_test.go b/pkg/executor/tikv_regions_peers_table_test.go index dd8ffb5757cca..5319960318b3f 100644 --- a/pkg/executor/tikv_regions_peers_table_test.go +++ b/pkg/executor/tikv_regions_peers_table_test.go @@ -112,7 +112,7 @@ func TestTikvRegionPeers(t *testing.T) { defer server.Close() store := testkit.CreateMockStore(t, - mockstore.WithTiKVOptions(tikv.WithPDHTTPClient([]string{mockAddr}))) + mockstore.WithTiKVOptions(tikv.WithPDHTTPClient("tikv-regions-peers-table-test", []string{mockAddr}))) store = &mockStore{ store.(helper.Storage), diff --git a/pkg/executor/union_scan.go b/pkg/executor/union_scan.go index e32112dbe443f..ce7e853c0d46a 100644 --- a/pkg/executor/union_scan.go +++ b/pkg/executor/union_scan.go @@ -188,7 +188,7 @@ func (us *UnionScanExec) Close() error { us.cursor4AddRows = nil us.cursor4SnapshotRows = 0 us.snapshotRows = us.snapshotRows[:0] - return us.Children(0).Close() + return exec.Close(us.Children(0)) } // getOneRow gets one result row from dirty table or child. diff --git a/pkg/executor/update.go b/pkg/executor/update.go index 01a995d45f5aa..44ae2c371ba9a 100644 --- a/pkg/executor/update.go +++ b/pkg/executor/update.go @@ -209,9 +209,11 @@ func (e *UpdateExec) exec(ctx context.Context, _ *expression.Schema, row, newDat continue } - sc := e.Ctx().GetSessionVars().StmtCtx - if (kv.ErrKeyExists.Equal(err1) || table.ErrCheckConstraintViolated.Equal(err1)) && sc.DupKeyAsWarning { - sc.AppendWarning(err1) + if kv.ErrKeyExists.Equal(err1) || table.ErrCheckConstraintViolated.Equal(err1) { + ec := e.Ctx().GetSessionVars().StmtCtx.ErrCtx() + if err1 = ec.HandleErrorWithAlias(kv.ErrKeyExists, err1, err1); err1 != nil { + return err1 + } continue } return err1 @@ -437,7 +439,7 @@ func (e *UpdateExec) Close() error { } defer e.Ctx().GetSessionVars().StmtCtx.RuntimeStatsColl.RegisterStats(e.ID(), e.stats) } - return e.Children(0).Close() + return exec.Close(e.Children(0)) } // Open implements the Executor Open interface. diff --git a/pkg/executor/window.go b/pkg/executor/window.go index ec089fa977f18..22f85b71a2129 100644 --- a/pkg/executor/window.go +++ b/pkg/executor/window.go @@ -163,7 +163,7 @@ func (e *WindowExec) fetchChild(ctx context.Context) (eof bool, err error) { return true, nil } - resultChk := e.Ctx().GetSessionVars().GetNewChunkWithCapacity(e.RetFieldTypes(), 0, numRows, e.AllocPool) + resultChk := e.AllocPool.Alloc(e.RetFieldTypes(), 0, numRows) err = e.copyChk(childResult, resultChk) if err != nil { return false, err diff --git a/pkg/executor/write.go b/pkg/executor/write.go index f609110d56b29..e535245e8318b 100644 --- a/pkg/executor/write.go +++ b/pkg/executor/write.go @@ -74,7 +74,7 @@ func updateRecord( // Handle the bad null error. for i, col := range t.Cols() { var err error - if err = col.HandleBadNull(&newData[i], sc, 0); err != nil { + if err = col.HandleBadNull(sc.ErrCtx(), &newData[i], 0); err != nil { return false, err } } @@ -186,16 +186,18 @@ func updateRecord( memBuffer.Release(sh) return true, nil }(); err != nil { - if terr, ok := errors.Cause(err).(*terror.Error); sctx.GetSessionVars().StmtCtx.IgnoreNoPartition && ok && terr.Code() == errno.ErrNoPartitionForGivenValue { - return false, nil + if terr, ok := errors.Cause(err).(*terror.Error); ok && (terr.Code() == errno.ErrNoPartitionForGivenValue || terr.Code() == errno.ErrRowDoesNotMatchGivenPartitionSet) { + ec := sctx.GetSessionVars().StmtCtx.ErrCtx() + return false, ec.HandleError(err) } return updated, err } } else { // Update record to new value and update index. if err := t.UpdateRecord(ctx, sctx, h, oldData, newData, modified); err != nil { - if terr, ok := errors.Cause(err).(*terror.Error); sctx.GetSessionVars().StmtCtx.IgnoreNoPartition && ok && terr.Code() == errno.ErrNoPartitionForGivenValue { - return false, nil + if terr, ok := errors.Cause(err).(*terror.Error); ok && (terr.Code() == errno.ErrNoPartitionForGivenValue || terr.Code() == errno.ErrRowDoesNotMatchGivenPartitionSet) { + ec := sctx.GetSessionVars().StmtCtx.ErrCtx() + return false, ec.HandleError(err) } return false, err } diff --git a/pkg/expression/BUILD.bazel b/pkg/expression/BUILD.bazel index 12af6d2573567..429cdf68d1c6d 100644 --- a/pkg/expression/BUILD.bazel +++ b/pkg/expression/BUILD.bazel @@ -50,6 +50,7 @@ go_library( "constant.go", "constant_fold.go", "constant_propagation.go", + "context.go", "distsql_builtin.go", "errors.go", "evaluator.go", @@ -60,6 +61,7 @@ go_library( "function_traits.go", "grouping_sets.go", "helper.go", + "infer_pushdown.go", "scalar_function.go", "schema.go", "simple_rewriter.go", @@ -70,6 +72,7 @@ go_library( visibility = ["//visibility:public"], deps = [ "//pkg/config", + "//pkg/errctx", "//pkg/errno", "//pkg/extension", "//pkg/kv", @@ -101,7 +104,6 @@ go_library( "//pkg/util/intset", "//pkg/util/logutil", "//pkg/util/mathutil", - "//pkg/util/mock", "//pkg/util/parser", "//pkg/util/password-validation", "//pkg/util/plancodec", @@ -192,6 +194,7 @@ go_test( shard_count = 50, deps = [ "//pkg/config", + "//pkg/errctx", "//pkg/errno", "//pkg/kv", "//pkg/parser", diff --git a/pkg/expression/aggregation/agg_to_pb.go b/pkg/expression/aggregation/agg_to_pb.go index 213dc72d5db65..5eab6be36b2fb 100644 --- a/pkg/expression/aggregation/agg_to_pb.go +++ b/pkg/expression/aggregation/agg_to_pb.go @@ -100,8 +100,8 @@ func (desc *baseFuncDesc) GetTiPBExpr(tryWindowDesc bool) (tp tipb.ExprType) { } // AggFuncToPBExpr converts aggregate function to pb. -func AggFuncToPBExpr(sctx sessionctx.Context, client kv.Client, aggFunc *AggFuncDesc, storeType kv.StoreType) (*tipb.Expr, error) { - pc := expression.NewPBConverter(client, sctx.GetSessionVars().StmtCtx) +func AggFuncToPBExpr(sctx expression.EvalContext, client kv.Client, aggFunc *AggFuncDesc, storeType kv.StoreType) (*tipb.Expr, error) { + pc := expression.NewPBConverter(client, sctx) tp := aggFunc.GetTiPBExpr(false) if !client.IsRequestTypeSupported(kv.ReqTypeSelect, int64(tp)) { return nil, errors.New("select request is not supported by client") @@ -122,9 +122,8 @@ func AggFuncToPBExpr(sctx sessionctx.Context, client kv.Client, aggFunc *AggFunc if tp == tipb.ExprType_GroupConcat { orderBy := make([]*tipb.ByItem, 0, len(aggFunc.OrderByItems)) - sc := sctx.GetSessionVars().StmtCtx for _, arg := range aggFunc.OrderByItems { - pbArg := expression.SortByItemToPB(sc, client, arg.Expr, arg.Desc) + pbArg := expression.SortByItemToPB(sctx, client, arg.Expr, arg.Desc) if pbArg == nil { return nil, errors.New(aggFunc.String() + " can't be converted to PB.") } @@ -214,7 +213,7 @@ func PBExprToAggFuncDesc(ctx sessionctx.Context, aggFunc *tipb.Expr, fieldTps [] return nil, errors.Errorf("unknown aggregation function type: %v", aggFunc.Tp) } - args, err := expression.PBToExprs(aggFunc.Children, fieldTps, ctx.GetSessionVars().StmtCtx) + args, err := expression.PBToExprs(ctx, aggFunc.Children, fieldTps) if err != nil { return nil, err } diff --git a/pkg/expression/aggregation/aggregation.go b/pkg/expression/aggregation/aggregation.go index cfdf2d1ecfd79..0455ba1b284f2 100644 --- a/pkg/expression/aggregation/aggregation.go +++ b/pkg/expression/aggregation/aggregation.go @@ -23,6 +23,7 @@ import ( "github.com/pingcap/tidb/pkg/kv" "github.com/pingcap/tidb/pkg/parser/ast" "github.com/pingcap/tidb/pkg/parser/mysql" + "github.com/pingcap/tidb/pkg/sessionctx" "github.com/pingcap/tidb/pkg/sessionctx/stmtctx" "github.com/pingcap/tidb/pkg/types" "github.com/pingcap/tidb/pkg/util/chunk" @@ -43,17 +44,17 @@ type Aggregation interface { GetResult(evalCtx *AggEvaluateContext) types.Datum // CreateContext creates a new AggEvaluateContext for the aggregation function. - CreateContext(sc *stmtctx.StatementContext) *AggEvaluateContext + CreateContext(ctx expression.EvalContext) *AggEvaluateContext // ResetContext resets the content of the evaluate context. - ResetContext(sc *stmtctx.StatementContext, evalCtx *AggEvaluateContext) + ResetContext(ctx expression.EvalContext, evalCtx *AggEvaluateContext) } // NewDistAggFunc creates new Aggregate function for mock tikv. -func NewDistAggFunc(expr *tipb.Expr, fieldTps []*types.FieldType, sc *stmtctx.StatementContext) (Aggregation, error) { +func NewDistAggFunc(expr *tipb.Expr, fieldTps []*types.FieldType, ctx sessionctx.Context) (Aggregation, error) { args := make([]expression.Expression, 0, len(expr.Children)) for _, child := range expr.Children { - arg, err := expression.PBToExpr(child, fieldTps, sc) + arg, err := expression.PBToExpr(ctx, child, fieldTps) if err != nil { return nil, err } @@ -86,6 +87,7 @@ func NewDistAggFunc(expr *tipb.Expr, fieldTps []*types.FieldType, sc *stmtctx.St // AggEvaluateContext is used to store intermediate result when calculating aggregate functions. type AggEvaluateContext struct { + Ctx expression.EvalContext DistinctChecker *distinctChecker Count int64 Value types.Datum @@ -125,24 +127,25 @@ func newAggFunc(funcName string, args []expression.Expression, hasDistinct bool) } // CreateContext implements Aggregation interface. -func (af *aggFunction) CreateContext(sc *stmtctx.StatementContext) *AggEvaluateContext { - evalCtx := &AggEvaluateContext{} +func (af *aggFunction) CreateContext(ctx expression.EvalContext) *AggEvaluateContext { + evalCtx := &AggEvaluateContext{Ctx: ctx} if af.HasDistinct { - evalCtx.DistinctChecker = createDistinctChecker(sc) + evalCtx.DistinctChecker = createDistinctChecker(ctx.GetSessionVars().StmtCtx) } return evalCtx } -func (af *aggFunction) ResetContext(sc *stmtctx.StatementContext, evalCtx *AggEvaluateContext) { +func (af *aggFunction) ResetContext(ctx expression.EvalContext, evalCtx *AggEvaluateContext) { if af.HasDistinct { - evalCtx.DistinctChecker = createDistinctChecker(sc) + evalCtx.DistinctChecker = createDistinctChecker(ctx.GetSessionVars().StmtCtx) } + evalCtx.Ctx = ctx evalCtx.Value.SetNull() } func (af *aggFunction) updateSum(ctx types.Context, evalCtx *AggEvaluateContext, row chunk.Row) error { a := af.Args[0] - value, err := a.EvalWithInnerCtx(row) + value, err := a.Eval(evalCtx.Ctx, row) if err != nil { return err } diff --git a/pkg/expression/aggregation/aggregation_test.go b/pkg/expression/aggregation/aggregation_test.go index a9a29b1c74c38..de7c3ad684a29 100644 --- a/pkg/expression/aggregation/aggregation_test.go +++ b/pkg/expression/aggregation/aggregation_test.go @@ -59,7 +59,7 @@ func TestAvg(t *testing.T) { desc, err := NewAggFuncDesc(s.ctx, ast.AggFuncAvg, []expression.Expression{col}, false) require.NoError(t, err) avgFunc := desc.GetAggFunc(ctx) - evalCtx := avgFunc.CreateContext(s.ctx.GetSessionVars().StmtCtx) + evalCtx := avgFunc.CreateContext(s.ctx) result := avgFunc.GetResult(evalCtx) require.True(t, result.IsNull()) @@ -79,7 +79,7 @@ func TestAvg(t *testing.T) { desc, err = NewAggFuncDesc(s.ctx, ast.AggFuncAvg, []expression.Expression{col}, true) require.NoError(t, err) distinctAvgFunc := desc.GetAggFunc(ctx) - evalCtx = distinctAvgFunc.CreateContext(s.ctx.GetSessionVars().StmtCtx) + evalCtx = distinctAvgFunc.CreateContext(s.ctx) for _, row := range s.rows { err := distinctAvgFunc.Update(evalCtx, s.ctx.GetSessionVars().StmtCtx, row) require.NoError(t, err) @@ -112,7 +112,7 @@ func TestAvgFinalMode(t *testing.T) { require.NoError(t, err) aggFunc.Mode = FinalMode avgFunc := aggFunc.GetAggFunc(ctx) - evalCtx := avgFunc.CreateContext(s.ctx.GetSessionVars().StmtCtx) + evalCtx := avgFunc.CreateContext(s.ctx) for _, row := range rows { err := avgFunc.Update(evalCtx, s.ctx.GetSessionVars().StmtCtx, chunk.MutRowFromDatums(row).ToRow()) @@ -133,7 +133,7 @@ func TestSum(t *testing.T) { desc, err := NewAggFuncDesc(s.ctx, ast.AggFuncSum, []expression.Expression{col}, false) require.NoError(t, err) sumFunc := desc.GetAggFunc(ctx) - evalCtx := sumFunc.CreateContext(s.ctx.GetSessionVars().StmtCtx) + evalCtx := sumFunc.CreateContext(s.ctx) result := sumFunc.GetResult(evalCtx) require.True(t, result.IsNull()) @@ -155,7 +155,7 @@ func TestSum(t *testing.T) { desc, err = NewAggFuncDesc(s.ctx, ast.AggFuncSum, []expression.Expression{col}, true) require.NoError(t, err) distinctSumFunc := desc.GetAggFunc(ctx) - evalCtx = distinctSumFunc.CreateContext(s.ctx.GetSessionVars().StmtCtx) + evalCtx = distinctSumFunc.CreateContext(s.ctx) for _, row := range s.rows { err := distinctSumFunc.Update(evalCtx, s.ctx.GetSessionVars().StmtCtx, row) require.NoError(t, err) @@ -175,7 +175,7 @@ func TestBitAnd(t *testing.T) { desc, err := NewAggFuncDesc(s.ctx, ast.AggFuncBitAnd, []expression.Expression{col}, false) require.NoError(t, err) bitAndFunc := desc.GetAggFunc(ctx) - evalCtx := bitAndFunc.CreateContext(s.ctx.GetSessionVars().StmtCtx) + evalCtx := bitAndFunc.CreateContext(s.ctx) result := bitAndFunc.GetResult(evalCtx) require.Equal(t, uint64(math.MaxUint64), result.GetUint64()) @@ -213,7 +213,7 @@ func TestBitAnd(t *testing.T) { // test bit_and( decimal ) col.RetType = types.NewFieldType(mysql.TypeNewDecimal) - bitAndFunc.ResetContext(s.ctx.GetSessionVars().StmtCtx, evalCtx) + bitAndFunc.ResetContext(s.ctx, evalCtx) result = bitAndFunc.GetResult(evalCtx) require.Equal(t, uint64(math.MaxUint64), result.GetUint64()) @@ -254,7 +254,7 @@ func TestBitOr(t *testing.T) { desc, err := NewAggFuncDesc(s.ctx, ast.AggFuncBitOr, []expression.Expression{col}, false) require.NoError(t, err) bitOrFunc := desc.GetAggFunc(ctx) - evalCtx := bitOrFunc.CreateContext(s.ctx.GetSessionVars().StmtCtx) + evalCtx := bitOrFunc.CreateContext(s.ctx) result := bitOrFunc.GetResult(evalCtx) require.Equal(t, uint64(0), result.GetUint64()) @@ -292,7 +292,7 @@ func TestBitOr(t *testing.T) { // test bit_or( decimal ) col.RetType = types.NewFieldType(mysql.TypeNewDecimal) - bitOrFunc.ResetContext(s.ctx.GetSessionVars().StmtCtx, evalCtx) + bitOrFunc.ResetContext(s.ctx, evalCtx) result = bitOrFunc.GetResult(evalCtx) require.Equal(t, uint64(0), result.GetUint64()) @@ -341,7 +341,7 @@ func TestBitXor(t *testing.T) { desc, err := NewAggFuncDesc(s.ctx, ast.AggFuncBitXor, []expression.Expression{col}, false) require.NoError(t, err) bitXorFunc := desc.GetAggFunc(ctx) - evalCtx := bitXorFunc.CreateContext(s.ctx.GetSessionVars().StmtCtx) + evalCtx := bitXorFunc.CreateContext(s.ctx) result := bitXorFunc.GetResult(evalCtx) require.Equal(t, uint64(0), result.GetUint64()) @@ -379,7 +379,7 @@ func TestBitXor(t *testing.T) { // test bit_xor( decimal ) col.RetType = types.NewFieldType(mysql.TypeNewDecimal) - bitXorFunc.ResetContext(s.ctx.GetSessionVars().StmtCtx, evalCtx) + bitXorFunc.ResetContext(s.ctx, evalCtx) result = bitXorFunc.GetResult(evalCtx) require.Equal(t, uint64(0), result.GetUint64()) @@ -420,7 +420,7 @@ func TestCount(t *testing.T) { desc, err := NewAggFuncDesc(s.ctx, ast.AggFuncCount, []expression.Expression{col}, false) require.NoError(t, err) countFunc := desc.GetAggFunc(ctx) - evalCtx := countFunc.CreateContext(s.ctx.GetSessionVars().StmtCtx) + evalCtx := countFunc.CreateContext(s.ctx) result := countFunc.GetResult(evalCtx) require.Equal(t, int64(0), result.GetInt64()) @@ -441,7 +441,7 @@ func TestCount(t *testing.T) { desc, err = NewAggFuncDesc(s.ctx, ast.AggFuncCount, []expression.Expression{col}, true) require.NoError(t, err) distinctCountFunc := desc.GetAggFunc(ctx) - evalCtx = distinctCountFunc.CreateContext(s.ctx.GetSessionVars().StmtCtx) + evalCtx = distinctCountFunc.CreateContext(s.ctx) for _, row := range s.rows { err := distinctCountFunc.Update(evalCtx, s.ctx.GetSessionVars().StmtCtx, row) @@ -465,7 +465,7 @@ func TestConcat(t *testing.T) { desc, err := NewAggFuncDesc(s.ctx, ast.AggFuncGroupConcat, []expression.Expression{col, sep}, false) require.NoError(t, err) concatFunc := desc.GetAggFunc(ctx) - evalCtx := concatFunc.CreateContext(s.ctx.GetSessionVars().StmtCtx) + evalCtx := concatFunc.CreateContext(s.ctx) result := concatFunc.GetResult(evalCtx) require.True(t, result.IsNull()) @@ -493,7 +493,7 @@ func TestConcat(t *testing.T) { desc, err = NewAggFuncDesc(s.ctx, ast.AggFuncGroupConcat, []expression.Expression{col, sep}, true) require.NoError(t, err) distinctConcatFunc := desc.GetAggFunc(ctx) - evalCtx = distinctConcatFunc.CreateContext(s.ctx.GetSessionVars().StmtCtx) + evalCtx = distinctConcatFunc.CreateContext(s.ctx) row.SetDatum(0, types.NewIntDatum(1)) err = distinctConcatFunc.Update(evalCtx, s.ctx.GetSessionVars().StmtCtx, row.ToRow()) @@ -519,7 +519,7 @@ func TestFirstRow(t *testing.T) { desc, err := NewAggFuncDesc(s.ctx, ast.AggFuncFirstRow, []expression.Expression{col}, false) require.NoError(t, err) firstRowFunc := desc.GetAggFunc(ctx) - evalCtx := firstRowFunc.CreateContext(s.ctx.GetSessionVars().StmtCtx) + evalCtx := firstRowFunc.CreateContext(s.ctx) row := chunk.MutRowFromDatums(types.MakeDatums(1)).ToRow() err = firstRowFunc.Update(evalCtx, s.ctx.GetSessionVars().StmtCtx, row) @@ -550,8 +550,8 @@ func TestMaxMin(t *testing.T) { desc, err = NewAggFuncDesc(s.ctx, ast.AggFuncMin, []expression.Expression{col}, false) require.NoError(t, err) minFunc := desc.GetAggFunc(ctx) - maxEvalCtx := maxFunc.CreateContext(s.ctx.GetSessionVars().StmtCtx) - minEvalCtx := minFunc.CreateContext(s.ctx.GetSessionVars().StmtCtx) + maxEvalCtx := maxFunc.CreateContext(s.ctx) + minEvalCtx := minFunc.CreateContext(s.ctx) result := maxFunc.GetResult(maxEvalCtx) require.True(t, result.IsNull()) diff --git a/pkg/expression/aggregation/avg.go b/pkg/expression/aggregation/avg.go index 22c8fa4c4b5b6..0fd5ffd172db0 100644 --- a/pkg/expression/aggregation/avg.go +++ b/pkg/expression/aggregation/avg.go @@ -15,6 +15,7 @@ package aggregation import ( + "github.com/pingcap/tidb/pkg/expression" "github.com/pingcap/tidb/pkg/parser/mysql" "github.com/pingcap/tidb/pkg/parser/terror" "github.com/pingcap/tidb/pkg/sessionctx/stmtctx" @@ -29,7 +30,7 @@ type avgFunction struct { func (af *avgFunction) updateAvg(ctx types.Context, evalCtx *AggEvaluateContext, row chunk.Row) error { a := af.Args[1] - value, err := a.EvalWithInnerCtx(row) + value, err := a.Eval(evalCtx.Ctx, row) if err != nil { return err } @@ -40,7 +41,7 @@ func (af *avgFunction) updateAvg(ctx types.Context, evalCtx *AggEvaluateContext, if err != nil { return err } - count, err := af.Args[0].EvalWithInnerCtx(row) + count, err := af.Args[0].Eval(evalCtx.Ctx, row) if err != nil { return err } @@ -48,10 +49,11 @@ func (af *avgFunction) updateAvg(ctx types.Context, evalCtx *AggEvaluateContext, return nil } -func (af *avgFunction) ResetContext(sc *stmtctx.StatementContext, evalCtx *AggEvaluateContext) { +func (af *avgFunction) ResetContext(ctx expression.EvalContext, evalCtx *AggEvaluateContext) { if af.HasDistinct { - evalCtx.DistinctChecker = createDistinctChecker(sc) + evalCtx.DistinctChecker = createDistinctChecker(ctx.GetSessionVars().StmtCtx) } + evalCtx.Ctx = ctx evalCtx.Value.SetNull() evalCtx.Count = 0 } diff --git a/pkg/expression/aggregation/base_func.go b/pkg/expression/aggregation/base_func.go index 3de4f3299d976..c2335cfbd86d5 100644 --- a/pkg/expression/aggregation/base_func.go +++ b/pkg/expression/aggregation/base_func.go @@ -145,7 +145,7 @@ func (a *baseFuncDesc) typeInfer4ApproxPercentile(ctx sessionctx.Context) error return errors.New("APPROX_PERCENTILE should take 2 arguments") } - if !a.Args[1].ConstItem(ctx.GetSessionVars().StmtCtx) { + if a.Args[1].ConstLevel() == expression.ConstNone { return errors.New("APPROX_PERCENTILE should take a constant expression as percentage argument") } percent, isNull, err := a.Args[1].EvalInt(ctx, chunk.Row{}) @@ -214,6 +214,11 @@ func (a *baseFuncDesc) TypeInfer4AvgSum(avgRetType *types.FieldType) { } } +// TypeInfer4FinalCount infers the type of sum agg which is rewritten from final count agg run on MPP mode. +func (a *baseFuncDesc) TypeInfer4FinalCount(finalCountRetType *types.FieldType) { + a.RetTp = finalCountRetType.Clone() +} + // typeInfer4Avg should returns a "decimal", otherwise it returns a "double". // Because child returns integer or decimal type. func (a *baseFuncDesc) typeInfer4Avg(sessionctx.Context) { diff --git a/pkg/expression/aggregation/bench_test.go b/pkg/expression/aggregation/bench_test.go index eb1fb72c67b9c..d7e2486cb499e 100644 --- a/pkg/expression/aggregation/bench_test.go +++ b/pkg/expression/aggregation/bench_test.go @@ -37,7 +37,7 @@ func BenchmarkCreateContext(b *testing.B) { fun := desc.GetAggFunc(ctx) b.StartTimer() for i := 0; i < b.N; i++ { - fun.CreateContext(ctx.GetSessionVars().StmtCtx) + fun.CreateContext(ctx) } b.ReportAllocs() } @@ -53,10 +53,10 @@ func BenchmarkResetContext(b *testing.B) { b.Fatal(err) } fun := desc.GetAggFunc(ctx) - evalCtx := fun.CreateContext(ctx.GetSessionVars().StmtCtx) + evalCtx := fun.CreateContext(ctx) b.StartTimer() for i := 0; i < b.N; i++ { - fun.ResetContext(ctx.GetSessionVars().StmtCtx, evalCtx) + fun.ResetContext(ctx, evalCtx) } b.ReportAllocs() } @@ -74,7 +74,7 @@ func BenchmarkCreateDistinctContext(b *testing.B) { fun := desc.GetAggFunc(ctx) b.StartTimer() for i := 0; i < b.N; i++ { - fun.CreateContext(ctx.GetSessionVars().StmtCtx) + fun.CreateContext(ctx) } b.ReportAllocs() } @@ -90,10 +90,10 @@ func BenchmarkResetDistinctContext(b *testing.B) { b.Fatal(err) } fun := desc.GetAggFunc(ctx) - evalCtx := fun.CreateContext(ctx.GetSessionVars().StmtCtx) + evalCtx := fun.CreateContext(ctx) b.StartTimer() for i := 0; i < b.N; i++ { - fun.ResetContext(ctx.GetSessionVars().StmtCtx, evalCtx) + fun.ResetContext(ctx, evalCtx) } b.ReportAllocs() } diff --git a/pkg/expression/aggregation/bit_and.go b/pkg/expression/aggregation/bit_and.go index 24e52d57aa231..01d0a3ef433cd 100644 --- a/pkg/expression/aggregation/bit_and.go +++ b/pkg/expression/aggregation/bit_and.go @@ -17,6 +17,7 @@ package aggregation import ( "math" + "github.com/pingcap/tidb/pkg/expression" "github.com/pingcap/tidb/pkg/sessionctx/stmtctx" "github.com/pingcap/tidb/pkg/types" "github.com/pingcap/tidb/pkg/util/chunk" @@ -26,20 +27,21 @@ type bitAndFunction struct { aggFunction } -func (bf *bitAndFunction) CreateContext(sc *stmtctx.StatementContext) *AggEvaluateContext { - evalCtx := bf.aggFunction.CreateContext(sc) +func (bf *bitAndFunction) CreateContext(ctx expression.EvalContext) *AggEvaluateContext { + evalCtx := bf.aggFunction.CreateContext(ctx) evalCtx.Value.SetUint64(math.MaxUint64) return evalCtx } -func (*bitAndFunction) ResetContext(_ *stmtctx.StatementContext, evalCtx *AggEvaluateContext) { +func (*bitAndFunction) ResetContext(ctx expression.EvalContext, evalCtx *AggEvaluateContext) { + evalCtx.Ctx = ctx evalCtx.Value.SetUint64(math.MaxUint64) } // Update implements Aggregation interface. func (bf *bitAndFunction) Update(evalCtx *AggEvaluateContext, sc *stmtctx.StatementContext, row chunk.Row) error { a := bf.Args[0] - value, err := a.EvalWithInnerCtx(row) + value, err := a.Eval(evalCtx.Ctx, row) if err != nil { return err } diff --git a/pkg/expression/aggregation/bit_or.go b/pkg/expression/aggregation/bit_or.go index 8333889e91e3b..2e609ef45bf3a 100644 --- a/pkg/expression/aggregation/bit_or.go +++ b/pkg/expression/aggregation/bit_or.go @@ -15,6 +15,7 @@ package aggregation import ( + "github.com/pingcap/tidb/pkg/expression" "github.com/pingcap/tidb/pkg/sessionctx/stmtctx" "github.com/pingcap/tidb/pkg/types" "github.com/pingcap/tidb/pkg/util/chunk" @@ -24,20 +25,21 @@ type bitOrFunction struct { aggFunction } -func (bf *bitOrFunction) CreateContext(sc *stmtctx.StatementContext) *AggEvaluateContext { - evalCtx := bf.aggFunction.CreateContext(sc) +func (bf *bitOrFunction) CreateContext(ctx expression.EvalContext) *AggEvaluateContext { + evalCtx := bf.aggFunction.CreateContext(ctx) evalCtx.Value.SetUint64(0) return evalCtx } -func (*bitOrFunction) ResetContext(_ *stmtctx.StatementContext, evalCtx *AggEvaluateContext) { +func (*bitOrFunction) ResetContext(ctx expression.EvalContext, evalCtx *AggEvaluateContext) { + evalCtx.Ctx = ctx evalCtx.Value.SetUint64(0) } // Update implements Aggregation interface. func (bf *bitOrFunction) Update(evalCtx *AggEvaluateContext, sc *stmtctx.StatementContext, row chunk.Row) error { a := bf.Args[0] - value, err := a.EvalWithInnerCtx(row) + value, err := a.Eval(evalCtx.Ctx, row) if err != nil { return err } diff --git a/pkg/expression/aggregation/bit_xor.go b/pkg/expression/aggregation/bit_xor.go index 405475c5a69be..6d9959163a670 100644 --- a/pkg/expression/aggregation/bit_xor.go +++ b/pkg/expression/aggregation/bit_xor.go @@ -15,6 +15,7 @@ package aggregation import ( + "github.com/pingcap/tidb/pkg/expression" "github.com/pingcap/tidb/pkg/sessionctx/stmtctx" "github.com/pingcap/tidb/pkg/types" "github.com/pingcap/tidb/pkg/util/chunk" @@ -24,20 +25,21 @@ type bitXorFunction struct { aggFunction } -func (bf *bitXorFunction) CreateContext(sc *stmtctx.StatementContext) *AggEvaluateContext { - evalCtx := bf.aggFunction.CreateContext(sc) +func (bf *bitXorFunction) CreateContext(ctx expression.EvalContext) *AggEvaluateContext { + evalCtx := bf.aggFunction.CreateContext(ctx) evalCtx.Value.SetUint64(0) return evalCtx } -func (*bitXorFunction) ResetContext(_ *stmtctx.StatementContext, evalCtx *AggEvaluateContext) { +func (*bitXorFunction) ResetContext(ctx expression.EvalContext, evalCtx *AggEvaluateContext) { + evalCtx.Ctx = ctx evalCtx.Value.SetUint64(0) } // Update implements Aggregation interface. func (bf *bitXorFunction) Update(evalCtx *AggEvaluateContext, sc *stmtctx.StatementContext, row chunk.Row) error { a := bf.Args[0] - value, err := a.EvalWithInnerCtx(row) + value, err := a.Eval(evalCtx.Ctx, row) if err != nil { return err } diff --git a/pkg/expression/aggregation/concat.go b/pkg/expression/aggregation/concat.go index 742dcdeb0e966..7ddfd5524235f 100644 --- a/pkg/expression/aggregation/concat.go +++ b/pkg/expression/aggregation/concat.go @@ -45,9 +45,9 @@ func (*concatFunction) writeValue(evalCtx *AggEvaluateContext, val types.Datum) } } -func (cf *concatFunction) initSeparator(_ *stmtctx.StatementContext, row chunk.Row) error { +func (cf *concatFunction) initSeparator(ctx expression.EvalContext, row chunk.Row) error { sepArg := cf.Args[len(cf.Args)-1] - sepDatum, err := sepArg.EvalWithInnerCtx(row) + sepDatum, err := sepArg.Eval(ctx, row) if err != nil { return err } @@ -62,7 +62,7 @@ func (cf *concatFunction) initSeparator(_ *stmtctx.StatementContext, row chunk.R func (cf *concatFunction) Update(evalCtx *AggEvaluateContext, sc *stmtctx.StatementContext, row chunk.Row) error { datumBuf := make([]types.Datum, 0, len(cf.Args)) if !cf.sepInited { - err := cf.initSeparator(sc, row) + err := cf.initSeparator(evalCtx.Ctx, row) if err != nil { return err } @@ -71,7 +71,7 @@ func (cf *concatFunction) Update(evalCtx *AggEvaluateContext, sc *stmtctx.Statem // The last parameter is the concat separator, we only concat the first "len(cf.Args)-1" parameters. for i, length := 0, len(cf.Args)-1; i < length; i++ { - value, err := cf.Args[i].EvalWithInnerCtx(row) + value, err := cf.Args[i].Eval(evalCtx.Ctx, row) if err != nil { return err } @@ -104,7 +104,7 @@ func (cf *concatFunction) Update(evalCtx *AggEvaluateContext, sc *stmtctx.Statem } evalCtx.Buffer.Truncate(i) if !cf.truncated { - sc.AppendWarning(expression.ErrCutValueGroupConcat.GenWithStackByArgs(cf.Args[0].String())) + sc.AppendWarning(expression.ErrCutValueGroupConcat.FastGenByArgs(cf.Args[0].String())) } cf.truncated = true } @@ -121,10 +121,11 @@ func (cf *concatFunction) GetResult(evalCtx *AggEvaluateContext) (d types.Datum) return d } -func (cf *concatFunction) ResetContext(sc *stmtctx.StatementContext, evalCtx *AggEvaluateContext) { +func (cf *concatFunction) ResetContext(ctx expression.EvalContext, evalCtx *AggEvaluateContext) { if cf.HasDistinct { - evalCtx.DistinctChecker = createDistinctChecker(sc) + evalCtx.DistinctChecker = createDistinctChecker(ctx.GetSessionVars().StmtCtx) } + evalCtx.Ctx = ctx evalCtx.Buffer = nil } diff --git a/pkg/expression/aggregation/count.go b/pkg/expression/aggregation/count.go index 1fc0c44a1499d..55eb207b1dc1b 100644 --- a/pkg/expression/aggregation/count.go +++ b/pkg/expression/aggregation/count.go @@ -15,6 +15,7 @@ package aggregation import ( + "github.com/pingcap/tidb/pkg/expression" "github.com/pingcap/tidb/pkg/sessionctx/stmtctx" "github.com/pingcap/tidb/pkg/types" "github.com/pingcap/tidb/pkg/util/chunk" @@ -31,7 +32,7 @@ func (cf *countFunction) Update(evalCtx *AggEvaluateContext, _ *stmtctx.Statemen datumBuf = make([]types.Datum, 0, len(cf.Args)) } for _, a := range cf.Args { - value, err := a.EvalWithInnerCtx(row) + value, err := a.Eval(evalCtx.Ctx, row) if err != nil { return err } @@ -60,10 +61,11 @@ func (cf *countFunction) Update(evalCtx *AggEvaluateContext, _ *stmtctx.Statemen return nil } -func (cf *countFunction) ResetContext(sc *stmtctx.StatementContext, evalCtx *AggEvaluateContext) { +func (cf *countFunction) ResetContext(ctx expression.EvalContext, evalCtx *AggEvaluateContext) { if cf.HasDistinct { - evalCtx.DistinctChecker = createDistinctChecker(sc) + evalCtx.DistinctChecker = createDistinctChecker(ctx.GetSessionVars().StmtCtx) } + evalCtx.Ctx = ctx evalCtx.Count = 0 } diff --git a/pkg/expression/aggregation/explain.go b/pkg/expression/aggregation/explain.go index 03328b18a06fa..dd28997d589a6 100644 --- a/pkg/expression/aggregation/explain.go +++ b/pkg/expression/aggregation/explain.go @@ -19,10 +19,11 @@ import ( "fmt" "github.com/pingcap/tidb/pkg/parser/ast" + "github.com/pingcap/tidb/pkg/sessionctx" ) // ExplainAggFunc generates explain information for a aggregation function. -func ExplainAggFunc(agg *AggFuncDesc, normalized bool) string { +func ExplainAggFunc(ctx sessionctx.Context, agg *AggFuncDesc, normalized bool) string { var buffer bytes.Buffer fmt.Fprintf(&buffer, "%s(", agg.Name) if agg.HasDistinct { @@ -37,13 +38,13 @@ func ExplainAggFunc(agg *AggFuncDesc, normalized bool) string { if normalized { fmt.Fprintf(&buffer, "%s desc", item.Expr.ExplainNormalizedInfo()) } else { - fmt.Fprintf(&buffer, "%s desc", item.Expr.ExplainInfo()) + fmt.Fprintf(&buffer, "%s desc", item.Expr.ExplainInfo(ctx)) } } else { if normalized { fmt.Fprintf(&buffer, "%s", item.Expr.ExplainNormalizedInfo()) } else { - fmt.Fprintf(&buffer, "%s", item.Expr.ExplainInfo()) + fmt.Fprintf(&buffer, "%s", item.Expr.ExplainInfo(ctx)) } } @@ -59,7 +60,7 @@ func ExplainAggFunc(agg *AggFuncDesc, normalized bool) string { if normalized { buffer.WriteString(arg.ExplainNormalizedInfo()) } else { - buffer.WriteString(arg.ExplainInfo()) + buffer.WriteString(arg.ExplainInfo(ctx)) } } buffer.WriteString(")") diff --git a/pkg/expression/aggregation/first_row.go b/pkg/expression/aggregation/first_row.go index 94e6277ea10f8..fba939b315bfc 100644 --- a/pkg/expression/aggregation/first_row.go +++ b/pkg/expression/aggregation/first_row.go @@ -16,6 +16,7 @@ package aggregation import ( "github.com/pingcap/errors" + "github.com/pingcap/tidb/pkg/expression" "github.com/pingcap/tidb/pkg/sessionctx/stmtctx" "github.com/pingcap/tidb/pkg/types" "github.com/pingcap/tidb/pkg/util/chunk" @@ -33,7 +34,7 @@ func (ff *firstRowFunction) Update(evalCtx *AggEvaluateContext, _ *stmtctx.State if len(ff.Args) != 1 { return errors.New("Wrong number of args for AggFuncFirstRow") } - value, err := ff.Args[0].EvalWithInnerCtx(row) + value, err := ff.Args[0].Eval(evalCtx.Ctx, row) if err != nil { return err } @@ -47,7 +48,8 @@ func (*firstRowFunction) GetResult(evalCtx *AggEvaluateContext) types.Datum { return evalCtx.Value } -func (*firstRowFunction) ResetContext(_ *stmtctx.StatementContext, evalCtx *AggEvaluateContext) { +func (*firstRowFunction) ResetContext(ctx expression.EvalContext, evalCtx *AggEvaluateContext) { + evalCtx.Ctx = ctx evalCtx.GotFirstRow = false } diff --git a/pkg/expression/aggregation/main_test.go b/pkg/expression/aggregation/main_test.go index 19582e7339882..8a188ad8028d6 100644 --- a/pkg/expression/aggregation/main_test.go +++ b/pkg/expression/aggregation/main_test.go @@ -25,6 +25,7 @@ func TestMain(m *testing.M) { testsetup.SetupForCommonTest() opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), } diff --git a/pkg/expression/aggregation/max_min.go b/pkg/expression/aggregation/max_min.go index 289fc53dcdcb4..968835e811b4c 100644 --- a/pkg/expression/aggregation/max_min.go +++ b/pkg/expression/aggregation/max_min.go @@ -40,7 +40,7 @@ func (mmf *maxMinFunction) GetPartialResult(evalCtx *AggEvaluateContext) []types // Update implements Aggregation interface. func (mmf *maxMinFunction) Update(evalCtx *AggEvaluateContext, sc *stmtctx.StatementContext, row chunk.Row) error { a := mmf.Args[0] - value, err := a.EvalWithInnerCtx(row) + value, err := a.Eval(evalCtx.Ctx, row) if err != nil { return err } diff --git a/pkg/expression/aggregation/window_func.go b/pkg/expression/aggregation/window_func.go index 1ce06b72d6d2a..897754f991562 100644 --- a/pkg/expression/aggregation/window_func.go +++ b/pkg/expression/aggregation/window_func.go @@ -36,13 +36,13 @@ func NewWindowFuncDesc(ctx sessionctx.Context, name string, args []expression.Ex if !skipCheckArgs { switch strings.ToLower(name) { case ast.WindowFuncNthValue: - val, isNull, ok := expression.GetUint64FromConstant(args[1]) + val, isNull, ok := expression.GetUint64FromConstant(ctx, args[1]) // nth_value does not allow `0`, but allows `null`. if !ok || (val == 0 && !isNull) { return nil, nil } case ast.WindowFuncNtile: - val, isNull, ok := expression.GetUint64FromConstant(args[0]) + val, isNull, ok := expression.GetUint64FromConstant(ctx, args[0]) // ntile does not allow `0`, but allows `null`. if !ok || (val == 0 && !isNull) { return nil, nil @@ -51,7 +51,7 @@ func NewWindowFuncDesc(ctx sessionctx.Context, name string, args []expression.Ex if len(args) < 2 { break } - _, isNull, ok := expression.GetUint64FromConstant(args[1]) + _, isNull, ok := expression.GetUint64FromConstant(ctx, args[1]) if !ok || isNull { return nil, nil } @@ -125,7 +125,7 @@ func (s *WindowFuncDesc) Clone() *WindowFuncDesc { // WindowFuncToPBExpr converts aggregate function to pb. func WindowFuncToPBExpr(sctx sessionctx.Context, client kv.Client, desc *WindowFuncDesc) *tipb.Expr { - pc := expression.NewPBConverter(client, sctx.GetSessionVars().StmtCtx) + pc := expression.NewPBConverter(client, sctx) tp := desc.GetTiPBExpr(true) if !client.IsRequestTypeSupported(kv.ReqTypeSelect, int64(tp)) { return nil @@ -145,7 +145,7 @@ func WindowFuncToPBExpr(sctx sessionctx.Context, client kv.Client, desc *WindowF // CanPushDownToTiFlash control whether a window function desc can be push down to tiflash. func (s *WindowFuncDesc) CanPushDownToTiFlash(ctx sessionctx.Context) bool { // args - if !expression.CanExprsPushDown(ctx.GetSessionVars().StmtCtx, s.Args, ctx.GetClient(), kv.TiFlash) { + if !expression.CanExprsPushDown(ctx, s.Args, ctx.GetClient(), kv.TiFlash) { return false } // window functions diff --git a/pkg/expression/bench_test.go b/pkg/expression/bench_test.go index f08453e84295e..f9a7665796719 100644 --- a/pkg/expression/bench_test.go +++ b/pkg/expression/bench_test.go @@ -1300,7 +1300,7 @@ func genVecExprBenchCase(ctx sessionctx.Context, funcName string, testCase vecEx // testVectorizedEvalOneVec is used to verify that the vectorized // expression is evaluated correctly during projection func testVectorizedEvalOneVec(t *testing.T, vecExprCases vecExprBenchCases) { - ctx := mock.NewContext() + ctx := createContext(t) for funcName, testCases := range vecExprCases { for _, testCase := range testCases { expr, fts, input, output := genVecExprBenchCase(ctx, funcName, testCase) @@ -1509,7 +1509,7 @@ func testVectorizedBuiltinFunc(t *testing.T, vecExprCases vecExprBenchCases) { } for funcName, testCases := range vecExprCases { for _, testCase := range testCases { - ctx := mock.NewContext() + ctx := createContext(t) if testCase.aesModes == "" { testCase.aesModes = "aes-128-ecb" } @@ -1675,6 +1675,13 @@ func testVectorizedBuiltinFunc(t *testing.T, vecExprCases vecExprBenchCases) { // check warnings totalWarns := ctx.GetSessionVars().StmtCtx.WarningCount() require.Equal(t, totalWarns, 2*vecWarnCnt) + + if _, ok := baseFunc.(*builtinAddSubDateAsStringSig); ok { + // skip check warnings for `builtinAddSubDateAsStringSig` for issue https://github.com/pingcap/tidb/issues/50197 + // TODO: fix this issue + continue + } + warns := ctx.GetSessionVars().StmtCtx.GetWarnings() for i := 0; i < int(vecWarnCnt); i++ { require.True(t, terror.ErrorEqual(warns[i].Err, warns[i+int(vecWarnCnt)].Err)) diff --git a/pkg/expression/builtin.go b/pkg/expression/builtin.go index ed7a8ccd0e2c2..0e2f8e007566c 100644 --- a/pkg/expression/builtin.go +++ b/pkg/expression/builtin.go @@ -28,6 +28,7 @@ import ( "slices" "strings" "sync" + "sync/atomic" "unsafe" "github.com/gogo/protobuf/proto" @@ -37,10 +38,10 @@ import ( "github.com/pingcap/tidb/pkg/parser/mysql" "github.com/pingcap/tidb/pkg/parser/opcode" "github.com/pingcap/tidb/pkg/sessionctx" - "github.com/pingcap/tidb/pkg/sessionctx/stmtctx" "github.com/pingcap/tidb/pkg/types" "github.com/pingcap/tidb/pkg/util/chunk" "github.com/pingcap/tidb/pkg/util/collate" + "github.com/pingcap/tidb/pkg/util/intest" "github.com/pingcap/tidb/pkg/util/set" "github.com/pingcap/tipb/go-tipb" ) @@ -53,11 +54,8 @@ type baseBuiltinFunc struct { pbCode tipb.ScalarFuncSig ctor collate.Collator - childrenVectorized bool - childrenReversed bool - + childrenVectorized bool childrenVectorizedOnce *sync.Once - childrenReversedOnce *sync.Once collationInfo } @@ -121,7 +119,6 @@ func newBaseBuiltinFunc(ctx sessionctx.Context, funcName string, args []Expressi bf := baseBuiltinFunc{ bufAllocator: newLocalColumnPool(), childrenVectorizedOnce: new(sync.Once), - childrenReversedOnce: new(sync.Once), args: args, tp: tp, @@ -208,7 +205,6 @@ func newBaseBuiltinFuncWithTp(ctx sessionctx.Context, funcName string, args []Ex bf = baseBuiltinFunc{ bufAllocator: newLocalColumnPool(), childrenVectorizedOnce: new(sync.Once), - childrenReversedOnce: new(sync.Once), args: args, tp: fieldType, @@ -270,7 +266,6 @@ func newBaseBuiltinFuncWithFieldTypes(ctx sessionctx.Context, funcName string, a bf = baseBuiltinFunc{ bufAllocator: newLocalColumnPool(), childrenVectorizedOnce: new(sync.Once), - childrenReversedOnce: new(sync.Once), args: args, tp: fieldType, @@ -286,14 +281,10 @@ func newBaseBuiltinFuncWithFieldTypes(ctx sessionctx.Context, funcName string, a // newBaseBuiltinFuncWithFieldType create BaseBuiltinFunc with FieldType charset and collation. // do not check and compute collation. -func newBaseBuiltinFuncWithFieldType(ctx sessionctx.Context, tp *types.FieldType, args []Expression) (baseBuiltinFunc, error) { - if ctx == nil { - return baseBuiltinFunc{}, errors.New("unexpected nil session ctx") - } +func newBaseBuiltinFuncWithFieldType(tp *types.FieldType, args []Expression) (baseBuiltinFunc, error) { bf := baseBuiltinFunc{ bufAllocator: newLocalColumnPool(), childrenVectorizedOnce: new(sync.Once), - childrenReversedOnce: new(sync.Once), args: args, tp: tp, @@ -307,59 +298,59 @@ func (b *baseBuiltinFunc) getArgs() []Expression { return b.args } -func (*baseBuiltinFunc) vecEvalInt(sessionctx.Context, *chunk.Chunk, *chunk.Column) error { +func (*baseBuiltinFunc) vecEvalInt(EvalContext, *chunk.Chunk, *chunk.Column) error { return errors.Errorf("baseBuiltinFunc.vecEvalInt() should never be called, please contact the TiDB team for help") } -func (*baseBuiltinFunc) vecEvalReal(sessionctx.Context, *chunk.Chunk, *chunk.Column) error { +func (*baseBuiltinFunc) vecEvalReal(EvalContext, *chunk.Chunk, *chunk.Column) error { return errors.Errorf("baseBuiltinFunc.vecEvalReal() should never be called, please contact the TiDB team for help") } -func (*baseBuiltinFunc) vecEvalString(sessionctx.Context, *chunk.Chunk, *chunk.Column) error { +func (*baseBuiltinFunc) vecEvalString(EvalContext, *chunk.Chunk, *chunk.Column) error { return errors.Errorf("baseBuiltinFunc.vecEvalString() should never be called, please contact the TiDB team for help") } -func (*baseBuiltinFunc) vecEvalDecimal(sessionctx.Context, *chunk.Chunk, *chunk.Column) error { +func (*baseBuiltinFunc) vecEvalDecimal(EvalContext, *chunk.Chunk, *chunk.Column) error { return errors.Errorf("baseBuiltinFunc.vecEvalDecimal() should never be called, please contact the TiDB team for help") } -func (*baseBuiltinFunc) vecEvalTime(sessionctx.Context, *chunk.Chunk, *chunk.Column) error { +func (*baseBuiltinFunc) vecEvalTime(EvalContext, *chunk.Chunk, *chunk.Column) error { return errors.Errorf("baseBuiltinFunc.vecEvalTime() should never be called, please contact the TiDB team for help") } -func (*baseBuiltinFunc) vecEvalDuration(sessionctx.Context, *chunk.Chunk, *chunk.Column) error { +func (*baseBuiltinFunc) vecEvalDuration(EvalContext, *chunk.Chunk, *chunk.Column) error { return errors.Errorf("baseBuiltinFunc.vecEvalDuration() should never be called, please contact the TiDB team for help") } -func (*baseBuiltinFunc) vecEvalJSON(sessionctx.Context, *chunk.Chunk, *chunk.Column) error { +func (*baseBuiltinFunc) vecEvalJSON(EvalContext, *chunk.Chunk, *chunk.Column) error { return errors.Errorf("baseBuiltinFunc.vecEvalJSON() should never be called, please contact the TiDB team for help") } -func (*baseBuiltinFunc) evalInt(sessionctx.Context, chunk.Row) (int64, bool, error) { +func (*baseBuiltinFunc) evalInt(EvalContext, chunk.Row) (int64, bool, error) { return 0, false, errors.Errorf("baseBuiltinFunc.evalInt() should never be called, please contact the TiDB team for help") } -func (*baseBuiltinFunc) evalReal(sessionctx.Context, chunk.Row) (float64, bool, error) { +func (*baseBuiltinFunc) evalReal(EvalContext, chunk.Row) (float64, bool, error) { return 0, false, errors.Errorf("baseBuiltinFunc.evalReal() should never be called, please contact the TiDB team for help") } -func (*baseBuiltinFunc) evalString(sessionctx.Context, chunk.Row) (string, bool, error) { +func (*baseBuiltinFunc) evalString(EvalContext, chunk.Row) (string, bool, error) { return "", false, errors.Errorf("baseBuiltinFunc.evalString() should never be called, please contact the TiDB team for help") } -func (*baseBuiltinFunc) evalDecimal(sessionctx.Context, chunk.Row) (*types.MyDecimal, bool, error) { +func (*baseBuiltinFunc) evalDecimal(EvalContext, chunk.Row) (*types.MyDecimal, bool, error) { return nil, false, errors.Errorf("baseBuiltinFunc.evalDecimal() should never be called, please contact the TiDB team for help") } -func (*baseBuiltinFunc) evalTime(sessionctx.Context, chunk.Row) (types.Time, bool, error) { +func (*baseBuiltinFunc) evalTime(EvalContext, chunk.Row) (types.Time, bool, error) { return types.ZeroTime, false, errors.Errorf("baseBuiltinFunc.evalTime() should never be called, please contact the TiDB team for help") } -func (*baseBuiltinFunc) evalDuration(sessionctx.Context, chunk.Row) (types.Duration, bool, error) { +func (*baseBuiltinFunc) evalDuration(EvalContext, chunk.Row) (types.Duration, bool, error) { return types.Duration{}, false, errors.Errorf("baseBuiltinFunc.evalDuration() should never be called, please contact the TiDB team for help") } -func (*baseBuiltinFunc) evalJSON(sessionctx.Context, chunk.Row) (types.BinaryJSON, bool, error) { +func (*baseBuiltinFunc) evalJSON(EvalContext, chunk.Row) (types.BinaryJSON, bool, error) { return types.BinaryJSON{}, false, errors.Errorf("baseBuiltinFunc.evalJSON() should never be called, please contact the TiDB team for help") } @@ -367,27 +358,6 @@ func (*baseBuiltinFunc) vectorized() bool { return false } -func (*baseBuiltinFunc) supportReverseEval() bool { - return false -} - -func (b *baseBuiltinFunc) isChildrenReversed() bool { - b.childrenReversedOnce.Do(func() { - b.childrenReversed = true - for _, arg := range b.args { - if !arg.SupportReverseEval() { - b.childrenReversed = false - break - } - } - }) - return b.childrenReversed -} - -func (*baseBuiltinFunc) reverseEval(*stmtctx.StatementContext, types.Datum, types.RoundingType) (types.Datum, error) { - return types.Datum{}, errors.Errorf("baseBuiltinFunc.reverseEvalInt() should never be called, please contact the TiDB team for help") -} - func (b *baseBuiltinFunc) isChildrenVectorized() bool { b.childrenVectorizedOnce.Do(func() { b.childrenVectorized = true @@ -417,7 +387,7 @@ func (b *baseBuiltinFunc) getRetTp() *types.FieldType { return b.tp } -func (b *baseBuiltinFunc) equal(ctx sessionctx.Context, fun builtinFunc) bool { +func (b *baseBuiltinFunc) equal(ctx EvalContext, fun builtinFunc) bool { funArgs := fun.getArgs() if len(funArgs) != len(b.args) { return false @@ -439,7 +409,6 @@ func (b *baseBuiltinFunc) cloneFrom(from *baseBuiltinFunc) { b.pbCode = from.pbCode b.bufAllocator = newLocalColumnPool() b.childrenVectorizedOnce = new(sync.Once) - b.childrenReversedOnce = new(sync.Once) b.ctor = from.ctor } @@ -484,62 +453,49 @@ type vecBuiltinFunc interface { isChildrenVectorized() bool // vecEvalInt evaluates this builtin function in a vectorized manner. - vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error + vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error // vecEvalReal evaluates this builtin function in a vectorized manner. - vecEvalReal(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error + vecEvalReal(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error // vecEvalString evaluates this builtin function in a vectorized manner. - vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error + vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error // vecEvalDecimal evaluates this builtin function in a vectorized manner. - vecEvalDecimal(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error + vecEvalDecimal(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error // vecEvalTime evaluates this builtin function in a vectorized manner. - vecEvalTime(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error + vecEvalTime(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error // vecEvalDuration evaluates this builtin function in a vectorized manner. - vecEvalDuration(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error + vecEvalDuration(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error // vecEvalJSON evaluates this builtin function in a vectorized manner. - vecEvalJSON(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error -} - -// reverseBuiltinFunc evaluates the exactly one column value in the function when given a result for expression. -// For example, the builtinFunc is builtinArithmeticPlusRealSig(2.3, builtinArithmeticMinusRealSig(Column, 3.4)) -// when given the result like 1.0, then the ReverseEval should evaluate the column value 1.0 - 2.3 + 3.4 = 2.1 -type reverseBuiltinFunc interface { - // supportReverseEval checks whether the builtinFunc support reverse evaluation. - supportReverseEval() bool - // isChildrenReversed checks whether the builtinFunc's children support reverse evaluation. - isChildrenReversed() bool - // reverseEval evaluates the only one column value with given function result. - reverseEval(sc *stmtctx.StatementContext, res types.Datum, rType types.RoundingType) (val types.Datum, err error) + vecEvalJSON(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error } // builtinFunc stands for a particular function signature. type builtinFunc interface { vecBuiltinFunc - reverseBuiltinFunc // evalInt evaluates int result of builtinFunc by given row. - evalInt(ctx sessionctx.Context, row chunk.Row) (val int64, isNull bool, err error) + evalInt(ctx EvalContext, row chunk.Row) (val int64, isNull bool, err error) // evalReal evaluates real representation of builtinFunc by given row. - evalReal(ctx sessionctx.Context, row chunk.Row) (val float64, isNull bool, err error) + evalReal(ctx EvalContext, row chunk.Row) (val float64, isNull bool, err error) // evalString evaluates string representation of builtinFunc by given row. - evalString(ctx sessionctx.Context, row chunk.Row) (val string, isNull bool, err error) + evalString(ctx EvalContext, row chunk.Row) (val string, isNull bool, err error) // evalDecimal evaluates decimal representation of builtinFunc by given row. - evalDecimal(ctx sessionctx.Context, row chunk.Row) (val *types.MyDecimal, isNull bool, err error) + evalDecimal(ctx EvalContext, row chunk.Row) (val *types.MyDecimal, isNull bool, err error) // evalTime evaluates DATE/DATETIME/TIMESTAMP representation of builtinFunc by given row. - evalTime(ctx sessionctx.Context, row chunk.Row) (val types.Time, isNull bool, err error) + evalTime(ctx EvalContext, row chunk.Row) (val types.Time, isNull bool, err error) // evalDuration evaluates duration representation of builtinFunc by given row. - evalDuration(ctx sessionctx.Context, row chunk.Row) (val types.Duration, isNull bool, err error) + evalDuration(ctx EvalContext, row chunk.Row) (val types.Duration, isNull bool, err error) // evalJSON evaluates JSON representation of builtinFunc by given row. - evalJSON(ctx sessionctx.Context, row chunk.Row) (val types.BinaryJSON, isNull bool, err error) + evalJSON(ctx EvalContext, row chunk.Row) (val types.BinaryJSON, isNull bool, err error) // getArgs returns the arguments expressions. getArgs() []Expression // equal check if this function equals to another function. - equal(sessionctx.Context, builtinFunc) bool + equal(EvalContext, builtinFunc) bool // getRetTp returns the return type of the built-in function. getRetTp() *types.FieldType // setPbCode sets pbCode for signature. @@ -1058,11 +1014,51 @@ func (b *baseBuiltinFunc) MemoryUsage() (sum int64) { if b.childrenVectorizedOnce != nil { sum += onceSize } - if b.childrenReversedOnce != nil { - sum += onceSize - } for _, e := range b.args { sum += e.MemoryUsage() } return } + +type builtinFuncCacheItem[T any] struct { + ctxID uint64 + item T +} + +type builtinFuncCache[T any] struct { + sync.Mutex + cached atomic.Pointer[builtinFuncCacheItem[T]] +} + +func (c *builtinFuncCache[T]) getCache(ctxID uint64) (v T, ok bool) { + if p := c.cached.Load(); p != nil && p.ctxID == ctxID { + return p.item, true + } + return v, false +} + +func (c *builtinFuncCache[T]) getOrInitCache(ctx EvalContext, constructCache func() (T, error)) (T, error) { + intest.Assert(constructCache != nil) + ctxID := ctx.GetSessionVars().StmtCtx.CtxID() + if item, ok := c.getCache(ctxID); ok { + return item, nil + } + + c.Lock() + defer c.Unlock() + if item, ok := c.getCache(ctxID); ok { + return item, nil + } + + item, err := constructCache() + if err != nil { + var def T + return def, err + } + + c.cached.Store(&builtinFuncCacheItem[T]{ + ctxID: ctxID, + item: item, + }) + return item, nil +} diff --git a/pkg/expression/builtin_arithmetic.go b/pkg/expression/builtin_arithmetic.go index 7192481ccc901..596e493414d13 100644 --- a/pkg/expression/builtin_arithmetic.go +++ b/pkg/expression/builtin_arithmetic.go @@ -213,7 +213,7 @@ func (s *builtinArithmeticPlusIntSig) Clone() builtinFunc { return newSig } -func (s *builtinArithmeticPlusIntSig) evalInt(ctx sessionctx.Context, row chunk.Row) (val int64, isNull bool, err error) { +func (s *builtinArithmeticPlusIntSig) evalInt(ctx EvalContext, row chunk.Row) (val int64, isNull bool, err error) { a, isNull, err := s.args[0].EvalInt(ctx, row) if isNull || err != nil { return 0, isNull, err @@ -265,7 +265,7 @@ func (s *builtinArithmeticPlusDecimalSig) Clone() builtinFunc { return newSig } -func (s *builtinArithmeticPlusDecimalSig) evalDecimal(ctx sessionctx.Context, row chunk.Row) (*types.MyDecimal, bool, error) { +func (s *builtinArithmeticPlusDecimalSig) evalDecimal(ctx EvalContext, row chunk.Row) (*types.MyDecimal, bool, error) { a, isNull, err := s.args[0].EvalDecimal(ctx, row) if isNull || err != nil { return nil, isNull, err @@ -295,7 +295,7 @@ func (s *builtinArithmeticPlusRealSig) Clone() builtinFunc { return newSig } -func (s *builtinArithmeticPlusRealSig) evalReal(ctx sessionctx.Context, row chunk.Row) (float64, bool, error) { +func (s *builtinArithmeticPlusRealSig) evalReal(ctx EvalContext, row chunk.Row) (float64, bool, error) { a, isLHSNull, err := s.args[0].EvalReal(ctx, row) if err != nil { return 0, isLHSNull, err @@ -363,7 +363,7 @@ func (s *builtinArithmeticMinusRealSig) Clone() builtinFunc { return newSig } -func (s *builtinArithmeticMinusRealSig) evalReal(ctx sessionctx.Context, row chunk.Row) (float64, bool, error) { +func (s *builtinArithmeticMinusRealSig) evalReal(ctx EvalContext, row chunk.Row) (float64, bool, error) { a, isNull, err := s.args[0].EvalReal(ctx, row) if isNull || err != nil { return 0, isNull, err @@ -388,7 +388,7 @@ func (s *builtinArithmeticMinusDecimalSig) Clone() builtinFunc { return newSig } -func (s *builtinArithmeticMinusDecimalSig) evalDecimal(ctx sessionctx.Context, row chunk.Row) (*types.MyDecimal, bool, error) { +func (s *builtinArithmeticMinusDecimalSig) evalDecimal(ctx EvalContext, row chunk.Row) (*types.MyDecimal, bool, error) { a, isNull, err := s.args[0].EvalDecimal(ctx, row) if isNull || err != nil { return nil, isNull, err @@ -418,7 +418,7 @@ func (s *builtinArithmeticMinusIntSig) Clone() builtinFunc { return newSig } -func (s *builtinArithmeticMinusIntSig) evalInt(ctx sessionctx.Context, row chunk.Row) (val int64, isNull bool, err error) { +func (s *builtinArithmeticMinusIntSig) evalInt(ctx EvalContext, row chunk.Row) (val int64, isNull bool, err error) { a, isNull, err := s.args[0].EvalInt(ctx, row) if isNull || err != nil { return 0, isNull, err @@ -572,7 +572,7 @@ func (s *builtinArithmeticMultiplyIntSig) Clone() builtinFunc { return newSig } -func (s *builtinArithmeticMultiplyRealSig) evalReal(ctx sessionctx.Context, row chunk.Row) (float64, bool, error) { +func (s *builtinArithmeticMultiplyRealSig) evalReal(ctx EvalContext, row chunk.Row) (float64, bool, error) { a, isNull, err := s.args[0].EvalReal(ctx, row) if isNull || err != nil { return 0, isNull, err @@ -588,7 +588,7 @@ func (s *builtinArithmeticMultiplyRealSig) evalReal(ctx sessionctx.Context, row return result, false, nil } -func (s *builtinArithmeticMultiplyDecimalSig) evalDecimal(ctx sessionctx.Context, row chunk.Row) (*types.MyDecimal, bool, error) { +func (s *builtinArithmeticMultiplyDecimalSig) evalDecimal(ctx EvalContext, row chunk.Row) (*types.MyDecimal, bool, error) { a, isNull, err := s.args[0].EvalDecimal(ctx, row) if isNull || err != nil { return nil, isNull, err @@ -608,7 +608,7 @@ func (s *builtinArithmeticMultiplyDecimalSig) evalDecimal(ctx sessionctx.Context return c, false, nil } -func (s *builtinArithmeticMultiplyIntUnsignedSig) evalInt(ctx sessionctx.Context, row chunk.Row) (val int64, isNull bool, err error) { +func (s *builtinArithmeticMultiplyIntUnsignedSig) evalInt(ctx EvalContext, row chunk.Row) (val int64, isNull bool, err error) { a, isNull, err := s.args[0].EvalInt(ctx, row) if isNull || err != nil { return 0, isNull, err @@ -626,7 +626,7 @@ func (s *builtinArithmeticMultiplyIntUnsignedSig) evalInt(ctx sessionctx.Context return int64(result), false, nil } -func (s *builtinArithmeticMultiplyIntSig) evalInt(ctx sessionctx.Context, row chunk.Row) (val int64, isNull bool, err error) { +func (s *builtinArithmeticMultiplyIntSig) evalInt(ctx EvalContext, row chunk.Row) (val int64, isNull bool, err error) { a, isNull, err := s.args[0].EvalInt(ctx, row) if isNull || err != nil { return 0, isNull, err @@ -688,7 +688,7 @@ func (s *builtinArithmeticDivideDecimalSig) Clone() builtinFunc { return newSig } -func (s *builtinArithmeticDivideRealSig) evalReal(ctx sessionctx.Context, row chunk.Row) (float64, bool, error) { +func (s *builtinArithmeticDivideRealSig) evalReal(ctx EvalContext, row chunk.Row) (float64, bool, error) { a, isNull, err := s.args[0].EvalReal(ctx, row) if isNull || err != nil { return 0, isNull, err @@ -707,7 +707,7 @@ func (s *builtinArithmeticDivideRealSig) evalReal(ctx sessionctx.Context, row ch return result, false, nil } -func (s *builtinArithmeticDivideDecimalSig) evalDecimal(ctx sessionctx.Context, row chunk.Row) (*types.MyDecimal, bool, error) { +func (s *builtinArithmeticDivideDecimalSig) evalDecimal(ctx EvalContext, row chunk.Row) (*types.MyDecimal, bool, error) { a, isNull, err := s.args[0].EvalDecimal(ctx, row) if isNull || err != nil { return nil, isNull, err @@ -786,15 +786,15 @@ func (s *builtinArithmeticIntDivideDecimalSig) Clone() builtinFunc { return newSig } -func (s *builtinArithmeticIntDivideIntSig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { - b, bIsNull, err := s.args[1].EvalInt(ctx, row) - if bIsNull || err != nil { - return 0, bIsNull, err - } +func (s *builtinArithmeticIntDivideIntSig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { a, aIsNull, err := s.args[0].EvalInt(ctx, row) if aIsNull || err != nil { return 0, aIsNull, err } + b, bIsNull, err := s.args[1].EvalInt(ctx, row) + if bIsNull || err != nil { + return 0, bIsNull, err + } if b == 0 { return 0, true, handleDivisionByZeroError(ctx) @@ -823,7 +823,7 @@ func (s *builtinArithmeticIntDivideIntSig) evalInt(ctx sessionctx.Context, row c return ret, err != nil, err } -func (s *builtinArithmeticIntDivideDecimalSig) evalInt(ctx sessionctx.Context, row chunk.Row) (ret int64, isNull bool, err error) { +func (s *builtinArithmeticIntDivideDecimalSig) evalInt(ctx EvalContext, row chunk.Row) (ret int64, isNull bool, err error) { sc := ctx.GetSessionVars().StmtCtx var num [2]*types.MyDecimal for i, arg := range s.args { @@ -843,7 +843,7 @@ func (s *builtinArithmeticIntDivideDecimalSig) evalInt(ctx sessionctx.Context, r } if err == types.ErrOverflow { newErr := errTruncatedWrongValue.GenWithStackByArgs("DECIMAL", c) - err = sc.HandleOverflow(newErr, newErr) + err = sc.HandleError(newErr) } if err != nil { return 0, true, err @@ -969,19 +969,23 @@ func (s *builtinArithmeticModRealSig) Clone() builtinFunc { return newSig } -func (s *builtinArithmeticModRealSig) evalReal(ctx sessionctx.Context, row chunk.Row) (float64, bool, error) { - b, isNull, err := s.args[1].EvalReal(ctx, row) - if isNull || err != nil { - return 0, isNull, err +func (s *builtinArithmeticModRealSig) evalReal(ctx EvalContext, row chunk.Row) (float64, bool, error) { + a, aIsNull, err := s.args[0].EvalReal(ctx, row) + if err != nil { + return 0, false, err } - if b == 0 { - return 0, true, handleDivisionByZeroError(ctx) + b, bIsNull, err := s.args[1].EvalReal(ctx, row) + if err != nil { + return 0, false, err } - a, isNull, err := s.args[0].EvalReal(ctx, row) - if isNull || err != nil { - return 0, isNull, err + if aIsNull || bIsNull { + return 0, true, nil + } + + if b == 0 { + return 0, true, handleDivisionByZeroError(ctx) } return math.Mod(a, b), false, nil @@ -997,7 +1001,7 @@ func (s *builtinArithmeticModDecimalSig) Clone() builtinFunc { return newSig } -func (s *builtinArithmeticModDecimalSig) evalDecimal(ctx sessionctx.Context, row chunk.Row) (*types.MyDecimal, bool, error) { +func (s *builtinArithmeticModDecimalSig) evalDecimal(ctx EvalContext, row chunk.Row) (*types.MyDecimal, bool, error) { a, isNull, err := s.args[0].EvalDecimal(ctx, row) if isNull || err != nil { return nil, isNull, err @@ -1024,19 +1028,23 @@ func (s *builtinArithmeticModIntUnsignedUnsignedSig) Clone() builtinFunc { return newSig } -func (s *builtinArithmeticModIntUnsignedUnsignedSig) evalInt(ctx sessionctx.Context, row chunk.Row) (val int64, isNull bool, err error) { - b, isNull, err := s.args[1].EvalInt(ctx, row) - if isNull || err != nil { - return 0, isNull, err +func (s *builtinArithmeticModIntUnsignedUnsignedSig) evalInt(ctx EvalContext, row chunk.Row) (val int64, isNull bool, err error) { + a, aIsNull, err := s.args[0].EvalInt(ctx, row) + if err != nil { + return 0, false, err } - if b == 0 { - return 0, true, handleDivisionByZeroError(ctx) + b, bIsNull, err := s.args[1].EvalInt(ctx, row) + if err != nil { + return 0, false, err } - a, isNull, err := s.args[0].EvalInt(ctx, row) - if isNull || err != nil { - return 0, isNull, err + if aIsNull || bIsNull { + return 0, true, nil + } + + if b == 0 { + return 0, true, handleDivisionByZeroError(ctx) } ret := int64(uint64(a) % uint64(b)) @@ -1054,18 +1062,24 @@ func (s *builtinArithmeticModIntUnsignedSignedSig) Clone() builtinFunc { return newSig } -func (s *builtinArithmeticModIntUnsignedSignedSig) evalInt(ctx sessionctx.Context, row chunk.Row) (val int64, isNull bool, err error) { - b, isNull, err := s.args[1].EvalInt(ctx, row) - if isNull || err != nil { - return 0, isNull, err +func (s *builtinArithmeticModIntUnsignedSignedSig) evalInt(ctx EvalContext, row chunk.Row) (val int64, isNull bool, err error) { + a, aIsNull, err := s.args[0].EvalInt(ctx, row) + if err != nil { + return 0, false, err } + + b, bIsNull, err := s.args[1].EvalInt(ctx, row) + if err != nil { + return 0, false, err + } + + if aIsNull || bIsNull { + return 0, true, nil + } + if b == 0 { return 0, true, handleDivisionByZeroError(ctx) } - a, isNull, err := s.args[0].EvalInt(ctx, row) - if isNull || err != nil { - return 0, isNull, err - } var ret int64 if b < 0 { @@ -1087,19 +1101,23 @@ func (s *builtinArithmeticModIntSignedUnsignedSig) Clone() builtinFunc { return newSig } -func (s *builtinArithmeticModIntSignedUnsignedSig) evalInt(ctx sessionctx.Context, row chunk.Row) (val int64, isNull bool, err error) { - b, isNull, err := s.args[1].EvalInt(ctx, row) - if isNull || err != nil { - return 0, isNull, err +func (s *builtinArithmeticModIntSignedUnsignedSig) evalInt(ctx EvalContext, row chunk.Row) (val int64, isNull bool, err error) { + a, aIsNull, err := s.args[0].EvalInt(ctx, row) + if err != nil { + return 0, false, err } - if b == 0 { - return 0, true, handleDivisionByZeroError(ctx) + b, bIsNull, err := s.args[1].EvalInt(ctx, row) + if err != nil { + return 0, false, err } - a, isNull, err := s.args[0].EvalInt(ctx, row) - if isNull || err != nil { - return 0, isNull, err + if aIsNull || bIsNull { + return 0, true, nil + } + + if b == 0 { + return 0, true, handleDivisionByZeroError(ctx) } var ret int64 @@ -1122,19 +1140,23 @@ func (s *builtinArithmeticModIntSignedSignedSig) Clone() builtinFunc { return newSig } -func (s *builtinArithmeticModIntSignedSignedSig) evalInt(ctx sessionctx.Context, row chunk.Row) (val int64, isNull bool, err error) { - b, isNull, err := s.args[1].EvalInt(ctx, row) - if isNull || err != nil { - return 0, isNull, err +func (s *builtinArithmeticModIntSignedSignedSig) evalInt(ctx EvalContext, row chunk.Row) (val int64, isNull bool, err error) { + a, aIsNull, err := s.args[0].EvalInt(ctx, row) + if err != nil { + return 0, false, err } - if b == 0 { - return 0, true, handleDivisionByZeroError(ctx) + b, bIsNull, err := s.args[1].EvalInt(ctx, row) + if err != nil { + return 0, false, err } - a, isNull, err := s.args[0].EvalInt(ctx, row) - if isNull || err != nil { - return 0, isNull, err + if aIsNull || bIsNull { + return 0, true, nil + } + + if b == 0 { + return 0, true, handleDivisionByZeroError(ctx) } return a % b, false, nil diff --git a/pkg/expression/builtin_arithmetic_vec.go b/pkg/expression/builtin_arithmetic_vec.go index 95afb8d583818..efffc82a6544e 100644 --- a/pkg/expression/builtin_arithmetic_vec.go +++ b/pkg/expression/builtin_arithmetic_vec.go @@ -20,7 +20,6 @@ import ( "github.com/pingcap/tidb/pkg/parser/mysql" "github.com/pingcap/tidb/pkg/parser/terror" - "github.com/pingcap/tidb/pkg/sessionctx" "github.com/pingcap/tidb/pkg/types" "github.com/pingcap/tidb/pkg/util/chunk" "github.com/pingcap/tidb/pkg/util/mathutil" @@ -31,7 +30,7 @@ func (b *builtinArithmeticMultiplyRealSig) vectorized() bool { return true } -func (b *builtinArithmeticMultiplyRealSig) vecEvalReal(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinArithmeticMultiplyRealSig) vecEvalReal(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { if err := b.args[0].VecEvalReal(ctx, input, result); err != nil { return err } @@ -64,7 +63,7 @@ func (b *builtinArithmeticDivideDecimalSig) vectorized() bool { return true } -func (b *builtinArithmeticDivideDecimalSig) vecEvalDecimal(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinArithmeticDivideDecimalSig) vecEvalDecimal(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { if err := b.args[0].VecEvalDecimal(ctx, input, result); err != nil { return err } @@ -120,7 +119,7 @@ func (b *builtinArithmeticModIntUnsignedUnsignedSig) vectorized() bool { return true } -func (b *builtinArithmeticModIntUnsignedUnsignedSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinArithmeticModIntUnsignedUnsignedSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { lh, err := b.bufAllocator.get() if err != nil { return err @@ -140,20 +139,17 @@ func (b *builtinArithmeticModIntUnsignedUnsignedSig) vecEvalInt(ctx sessionctx.C rhi64s := rh.Int64s() for i := 0; i < len(lhi64s); i++ { + if lh.IsNull(i) || rh.IsNull(i) { + result.SetNull(i, true) + continue + } if rhi64s[i] == 0 { - if rh.IsNull(i) { - continue - } if err := handleDivisionByZeroError(ctx); err != nil { return err } rh.SetNull(i, true) continue } - if lh.IsNull(i) { - rh.SetNull(i, true) - continue - } lhVar, rhVar := lhi64s[i], rhi64s[i] rhi64s[i] = int64(uint64(lhVar) % uint64(rhVar)) } @@ -164,7 +160,7 @@ func (b *builtinArithmeticModIntUnsignedSignedSig) vectorized() bool { return true } -func (b *builtinArithmeticModIntUnsignedSignedSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinArithmeticModIntUnsignedSignedSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { lh, err := b.bufAllocator.get() if err != nil { return err @@ -184,20 +180,17 @@ func (b *builtinArithmeticModIntUnsignedSignedSig) vecEvalInt(ctx sessionctx.Con rhi64s := rh.Int64s() for i := 0; i < len(lhi64s); i++ { + if lh.IsNull(i) || rh.IsNull(i) { + result.SetNull(i, true) + continue + } if rhi64s[i] == 0 { - if rh.IsNull(i) { - continue - } if err := handleDivisionByZeroError(ctx); err != nil { return err } rh.SetNull(i, true) continue } - if lh.IsNull(i) { - rh.SetNull(i, true) - continue - } lhVar, rhVar := lhi64s[i], rhi64s[i] if rhVar < 0 { rhi64s[i] = int64(uint64(lhVar) % uint64(-rhVar)) @@ -212,7 +205,7 @@ func (b *builtinArithmeticModIntSignedUnsignedSig) vectorized() bool { return true } -func (b *builtinArithmeticModIntSignedUnsignedSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinArithmeticModIntSignedUnsignedSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { lh, err := b.bufAllocator.get() if err != nil { return err @@ -232,20 +225,17 @@ func (b *builtinArithmeticModIntSignedUnsignedSig) vecEvalInt(ctx sessionctx.Con rhi64s := rh.Int64s() for i := 0; i < len(lhi64s); i++ { + if lh.IsNull(i) || rh.IsNull(i) { + result.SetNull(i, true) + continue + } if rhi64s[i] == 0 { - if rh.IsNull(i) { - continue - } if err := handleDivisionByZeroError(ctx); err != nil { return err } rh.SetNull(i, true) continue } - if lh.IsNull(i) { - rh.SetNull(i, true) - continue - } lhVar, rhVar := lhi64s[i], rhi64s[i] if lhVar < 0 { rhi64s[i] = -int64(uint64(-lhVar) % uint64(rhVar)) @@ -260,7 +250,7 @@ func (b *builtinArithmeticModIntSignedSignedSig) vectorized() bool { return true } -func (b *builtinArithmeticModIntSignedSignedSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinArithmeticModIntSignedSignedSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { lh, err := b.bufAllocator.get() if err != nil { return err @@ -280,20 +270,17 @@ func (b *builtinArithmeticModIntSignedSignedSig) vecEvalInt(ctx sessionctx.Conte rhi64s := rh.Int64s() for i := 0; i < len(lhi64s); i++ { + if lh.IsNull(i) || rh.IsNull(i) { + result.SetNull(i, true) + continue + } if rhi64s[i] == 0 { - if rh.IsNull(i) { - continue - } if err := handleDivisionByZeroError(ctx); err != nil { return err } rh.SetNull(i, true) continue } - if lh.IsNull(i) { - rh.SetNull(i, true) - continue - } lhVar, rhVar := lhi64s[i], rhi64s[i] rhi64s[i] = lhVar % rhVar } @@ -304,7 +291,7 @@ func (b *builtinArithmeticMinusRealSig) vectorized() bool { return true } -func (b *builtinArithmeticMinusRealSig) vecEvalReal(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinArithmeticMinusRealSig) vecEvalReal(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { if err := b.args[0].VecEvalReal(ctx, input, result); err != nil { return err } @@ -337,7 +324,7 @@ func (b *builtinArithmeticMinusDecimalSig) vectorized() bool { return true } -func (b *builtinArithmeticMinusDecimalSig) vecEvalDecimal(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinArithmeticMinusDecimalSig) vecEvalDecimal(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { if err := b.args[0].VecEvalDecimal(ctx, input, result); err != nil { return err } @@ -374,7 +361,7 @@ func (b *builtinArithmeticMinusIntSig) vectorized() bool { return true } -func (b *builtinArithmeticMinusIntSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinArithmeticMinusIntSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { lh, err := b.bufAllocator.get() if err != nil { return err @@ -426,24 +413,24 @@ func (b *builtinArithmeticModRealSig) vectorized() bool { return true } -func (b *builtinArithmeticModRealSig) vecEvalReal(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinArithmeticModRealSig) vecEvalReal(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { return err } defer b.bufAllocator.put(buf) - if err := b.args[1].VecEvalReal(ctx, input, buf); err != nil { + if err := b.args[0].VecEvalReal(ctx, input, result); err != nil { return err } - if err := b.args[0].VecEvalReal(ctx, input, result); err != nil { + if err := b.args[1].VecEvalReal(ctx, input, buf); err != nil { return err } result.MergeNulls(buf) x := result.Float64s() y := buf.Float64s() for i := 0; i < n; i++ { - if buf.IsNull(i) { + if buf.IsNull(i) || result.IsNull(i) { continue } if y[i] == 0 { @@ -463,7 +450,7 @@ func (b *builtinArithmeticModDecimalSig) vectorized() bool { return true } -func (b *builtinArithmeticModDecimalSig) vecEvalDecimal(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinArithmeticModDecimalSig) vecEvalDecimal(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { if err := b.args[0].VecEvalDecimal(ctx, input, result); err != nil { return err } @@ -482,7 +469,7 @@ func (b *builtinArithmeticModDecimalSig) vecEvalDecimal(ctx sessionctx.Context, y := buf.Decimals() var to types.MyDecimal for i := 0; i < n; i++ { - if result.IsNull(i) { + if result.IsNull(i) || buf.IsNull(i) { continue } err = types.DecimalMod(&x[i], &y[i], &to) @@ -505,7 +492,7 @@ func (b *builtinArithmeticPlusRealSig) vectorized() bool { return true } -func (b *builtinArithmeticPlusRealSig) vecEvalReal(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinArithmeticPlusRealSig) vecEvalReal(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { if err := b.args[0].VecEvalReal(ctx, input, result); err != nil { return err } @@ -538,7 +525,7 @@ func (b *builtinArithmeticMultiplyDecimalSig) vectorized() bool { return true } -func (b *builtinArithmeticMultiplyDecimalSig) vecEvalDecimal(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinArithmeticMultiplyDecimalSig) vecEvalDecimal(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { if err := b.args[0].VecEvalDecimal(ctx, input, result); err != nil { return err } @@ -576,7 +563,7 @@ func (b *builtinArithmeticIntDivideDecimalSig) vectorized() bool { return true } -func (b *builtinArithmeticIntDivideDecimalSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinArithmeticIntDivideDecimalSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { sc := ctx.GetSessionVars().StmtCtx n := input.NumRows() var err error @@ -621,7 +608,7 @@ func (b *builtinArithmeticIntDivideDecimalSig) vecEvalInt(ctx sessionctx.Context err = sc.HandleTruncate(errTruncatedWrongValue.GenWithStackByArgs("DECIMAL", c)) } else if err == types.ErrOverflow { newErr := errTruncatedWrongValue.GenWithStackByArgs("DECIMAL", c) - err = sc.HandleOverflow(newErr, newErr) + err = sc.HandleError(newErr) } if err != nil { return err @@ -655,7 +642,7 @@ func (b *builtinArithmeticMultiplyIntSig) vectorized() bool { return true } -func (b *builtinArithmeticMultiplyIntSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinArithmeticMultiplyIntSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { if err := b.args[0].VecEvalInt(ctx, input, result); err != nil { return err } @@ -694,7 +681,7 @@ func (b *builtinArithmeticDivideRealSig) vectorized() bool { return true } -func (b *builtinArithmeticDivideRealSig) vecEvalReal(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinArithmeticDivideRealSig) vecEvalReal(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { if err := b.args[0].VecEvalReal(ctx, input, result); err != nil { return err } @@ -735,7 +722,7 @@ func (b *builtinArithmeticIntDivideIntSig) vectorized() bool { return true } -func (b *builtinArithmeticIntDivideIntSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinArithmeticIntDivideIntSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { lhsBuf, err := b.bufAllocator.get() if err != nil { return err @@ -774,7 +761,7 @@ func (b *builtinArithmeticIntDivideIntSig) vecEvalInt(ctx sessionctx.Context, in return err } -func (b *builtinArithmeticIntDivideIntSig) divideUU(ctx sessionctx.Context, result *chunk.Column, lhsI64s, rhsI64s, resultI64s []int64) error { +func (b *builtinArithmeticIntDivideIntSig) divideUU(ctx EvalContext, result *chunk.Column, lhsI64s, rhsI64s, resultI64s []int64) error { for i := 0; i < len(lhsI64s); i++ { if result.IsNull(i) { continue @@ -793,7 +780,7 @@ func (b *builtinArithmeticIntDivideIntSig) divideUU(ctx sessionctx.Context, resu return nil } -func (b *builtinArithmeticIntDivideIntSig) divideUS(ctx sessionctx.Context, result *chunk.Column, lhsI64s, rhsI64s, resultI64s []int64) error { +func (b *builtinArithmeticIntDivideIntSig) divideUS(ctx EvalContext, result *chunk.Column, lhsI64s, rhsI64s, resultI64s []int64) error { for i := 0; i < len(lhsI64s); i++ { if result.IsNull(i) { continue @@ -815,7 +802,7 @@ func (b *builtinArithmeticIntDivideIntSig) divideUS(ctx sessionctx.Context, resu return nil } -func (b *builtinArithmeticIntDivideIntSig) divideSU(ctx sessionctx.Context, result *chunk.Column, lhsI64s, rhsI64s, resultI64s []int64) error { +func (b *builtinArithmeticIntDivideIntSig) divideSU(ctx EvalContext, result *chunk.Column, lhsI64s, rhsI64s, resultI64s []int64) error { for i := 0; i < len(lhsI64s); i++ { if result.IsNull(i) { continue @@ -838,7 +825,7 @@ func (b *builtinArithmeticIntDivideIntSig) divideSU(ctx sessionctx.Context, resu return nil } -func (b *builtinArithmeticIntDivideIntSig) divideSS(ctx sessionctx.Context, result *chunk.Column, lhsI64s, rhsI64s, resultI64s []int64) error { +func (b *builtinArithmeticIntDivideIntSig) divideSS(ctx EvalContext, result *chunk.Column, lhsI64s, rhsI64s, resultI64s []int64) error { for i := 0; i < len(lhsI64s); i++ { if result.IsNull(i) { continue @@ -865,7 +852,7 @@ func (b *builtinArithmeticPlusIntSig) vectorized() bool { return true } -func (b *builtinArithmeticPlusIntSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinArithmeticPlusIntSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { lh, err := b.bufAllocator.get() if err != nil { return err @@ -982,7 +969,7 @@ func (b *builtinArithmeticPlusDecimalSig) vectorized() bool { return true } -func (b *builtinArithmeticPlusDecimalSig) vecEvalDecimal(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinArithmeticPlusDecimalSig) vecEvalDecimal(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { if err := b.args[0].VecEvalDecimal(ctx, input, result); err != nil { return err } @@ -1019,7 +1006,7 @@ func (b *builtinArithmeticMultiplyIntUnsignedSig) vectorized() bool { return true } -func (b *builtinArithmeticMultiplyIntUnsignedSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinArithmeticMultiplyIntUnsignedSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { if err := b.args[0].VecEvalInt(ctx, input, result); err != nil { return err } diff --git a/pkg/expression/builtin_cast.go b/pkg/expression/builtin_cast.go index e9b81745b2aee..9e905136b13eb 100644 --- a/pkg/expression/builtin_cast.go +++ b/pkg/expression/builtin_cast.go @@ -484,7 +484,7 @@ func newFakeSctx() *stmtctx.StatementContext { return sc } -func (b *castJSONAsArrayFunctionSig) evalJSON(ctx sessionctx.Context, row chunk.Row) (res types.BinaryJSON, isNull bool, err error) { +func (b *castJSONAsArrayFunctionSig) evalJSON(ctx EvalContext, row chunk.Row) (res types.BinaryJSON, isNull bool, err error) { val, isNull, err := b.args[0].EvalJSON(ctx, row) if isNull || err != nil { return res, isNull, err @@ -542,7 +542,7 @@ func convertJSON2Tp(evalType types.EvalType) func(*stmtctx.StatementContext, typ return nil, ErrInvalidJSONForFuncIndex } jsonToInt, err := types.ConvertJSONToInt(sc.TypeCtx(), item, mysql.HasUnsignedFlag(tp.GetFlag()), tp.GetType()) - err = sc.HandleOverflow(err, err) + err = sc.HandleError(err) if mysql.HasUnsignedFlag(tp.GetFlag()) { return uint64(jsonToInt), err } @@ -634,7 +634,7 @@ func (b *builtinCastIntAsIntSig) Clone() builtinFunc { return newSig } -func (b *builtinCastIntAsIntSig) evalInt(ctx sessionctx.Context, row chunk.Row) (res int64, isNull bool, err error) { +func (b *builtinCastIntAsIntSig) evalInt(ctx EvalContext, row chunk.Row) (res int64, isNull bool, err error) { res, isNull, err = b.args[0].EvalInt(ctx, row) if isNull || err != nil { return @@ -655,7 +655,7 @@ func (b *builtinCastIntAsRealSig) Clone() builtinFunc { return newSig } -func (b *builtinCastIntAsRealSig) evalReal(ctx sessionctx.Context, row chunk.Row) (res float64, isNull bool, err error) { +func (b *builtinCastIntAsRealSig) evalReal(ctx EvalContext, row chunk.Row) (res float64, isNull bool, err error) { val, isNull, err := b.args[0].EvalInt(ctx, row) if isNull || err != nil { return res, isNull, err @@ -685,7 +685,7 @@ func (b *builtinCastIntAsDecimalSig) Clone() builtinFunc { return newSig } -func (b *builtinCastIntAsDecimalSig) evalDecimal(ctx sessionctx.Context, row chunk.Row) (res *types.MyDecimal, isNull bool, err error) { +func (b *builtinCastIntAsDecimalSig) evalDecimal(ctx EvalContext, row chunk.Row) (res *types.MyDecimal, isNull bool, err error) { val, isNull, err := b.args[0].EvalInt(ctx, row) if isNull || err != nil { return res, isNull, err @@ -705,7 +705,7 @@ func (b *builtinCastIntAsDecimalSig) evalDecimal(ctx sessionctx.Context, row chu } sc := ctx.GetSessionVars().StmtCtx res, err = types.ProduceDecWithSpecifiedTp(sc.TypeCtx(), res, b.tp) - err = sc.HandleOverflow(err, err) + err = sc.HandleError(err) return res, isNull, err } @@ -719,7 +719,7 @@ func (b *builtinCastIntAsStringSig) Clone() builtinFunc { return newSig } -func (b *builtinCastIntAsStringSig) evalString(ctx sessionctx.Context, row chunk.Row) (res string, isNull bool, err error) { +func (b *builtinCastIntAsStringSig) evalString(ctx EvalContext, row chunk.Row) (res string, isNull bool, err error) { val, isNull, err := b.args[0].EvalInt(ctx, row) if isNull || err != nil { return res, isNull, err @@ -750,7 +750,7 @@ func (b *builtinCastIntAsTimeSig) Clone() builtinFunc { return newSig } -func (b *builtinCastIntAsTimeSig) evalTime(ctx sessionctx.Context, row chunk.Row) (res types.Time, isNull bool, err error) { +func (b *builtinCastIntAsTimeSig) evalTime(ctx EvalContext, row chunk.Row) (res types.Time, isNull bool, err error) { val, isNull, err := b.args[0].EvalInt(ctx, row) if isNull || err != nil { return res, isNull, err @@ -782,7 +782,7 @@ func (b *builtinCastIntAsDurationSig) Clone() builtinFunc { return newSig } -func (b *builtinCastIntAsDurationSig) evalDuration(ctx sessionctx.Context, row chunk.Row) (res types.Duration, isNull bool, err error) { +func (b *builtinCastIntAsDurationSig) evalDuration(ctx EvalContext, row chunk.Row) (res types.Duration, isNull bool, err error) { val, isNull, err := b.args[0].EvalInt(ctx, row) if isNull || err != nil { return res, isNull, err @@ -790,7 +790,7 @@ func (b *builtinCastIntAsDurationSig) evalDuration(ctx sessionctx.Context, row c dur, err := types.NumberToDuration(val, b.tp.GetDecimal()) if err != nil { if types.ErrOverflow.Equal(err) { - err = ctx.GetSessionVars().StmtCtx.HandleOverflow(err, err) + err = ctx.GetSessionVars().StmtCtx.HandleError(err) } if types.ErrTruncatedWrongVal.Equal(err) { err = ctx.GetSessionVars().StmtCtx.HandleTruncate(err) @@ -810,7 +810,7 @@ func (b *builtinCastIntAsJSONSig) Clone() builtinFunc { return newSig } -func (b *builtinCastIntAsJSONSig) evalJSON(ctx sessionctx.Context, row chunk.Row) (res types.BinaryJSON, isNull bool, err error) { +func (b *builtinCastIntAsJSONSig) evalJSON(ctx EvalContext, row chunk.Row) (res types.BinaryJSON, isNull bool, err error) { val, isNull, err := b.args[0].EvalInt(ctx, row) if isNull || err != nil { return res, isNull, err @@ -835,7 +835,7 @@ func (b *builtinCastRealAsJSONSig) Clone() builtinFunc { return newSig } -func (b *builtinCastRealAsJSONSig) evalJSON(ctx sessionctx.Context, row chunk.Row) (res types.BinaryJSON, isNull bool, err error) { +func (b *builtinCastRealAsJSONSig) evalJSON(ctx EvalContext, row chunk.Row) (res types.BinaryJSON, isNull bool, err error) { val, isNull, err := b.args[0].EvalReal(ctx, row) // FIXME: `select json_type(cast(1111.11 as json))` should return `DECIMAL`, we return `DOUBLE` now. return types.CreateBinaryJSON(val), isNull, err @@ -851,7 +851,7 @@ func (b *builtinCastDecimalAsJSONSig) Clone() builtinFunc { return newSig } -func (b *builtinCastDecimalAsJSONSig) evalJSON(ctx sessionctx.Context, row chunk.Row) (types.BinaryJSON, bool, error) { +func (b *builtinCastDecimalAsJSONSig) evalJSON(ctx EvalContext, row chunk.Row) (types.BinaryJSON, bool, error) { val, isNull, err := b.args[0].EvalDecimal(ctx, row) if isNull || err != nil { return types.BinaryJSON{}, true, err @@ -874,7 +874,7 @@ func (b *builtinCastStringAsJSONSig) Clone() builtinFunc { return newSig } -func (b *builtinCastStringAsJSONSig) evalJSON(ctx sessionctx.Context, row chunk.Row) (res types.BinaryJSON, isNull bool, err error) { +func (b *builtinCastStringAsJSONSig) evalJSON(ctx EvalContext, row chunk.Row) (res types.BinaryJSON, isNull bool, err error) { val, isNull, err := b.args[0].EvalString(ctx, row) if isNull || err != nil { return res, isNull, err @@ -913,7 +913,7 @@ func (b *builtinCastDurationAsJSONSig) Clone() builtinFunc { return newSig } -func (b *builtinCastDurationAsJSONSig) evalJSON(ctx sessionctx.Context, row chunk.Row) (res types.BinaryJSON, isNull bool, err error) { +func (b *builtinCastDurationAsJSONSig) evalJSON(ctx EvalContext, row chunk.Row) (res types.BinaryJSON, isNull bool, err error) { val, isNull, err := b.args[0].EvalDuration(ctx, row) if isNull || err != nil { return res, isNull, err @@ -932,7 +932,7 @@ func (b *builtinCastTimeAsJSONSig) Clone() builtinFunc { return newSig } -func (b *builtinCastTimeAsJSONSig) evalJSON(ctx sessionctx.Context, row chunk.Row) (res types.BinaryJSON, isNull bool, err error) { +func (b *builtinCastTimeAsJSONSig) evalJSON(ctx EvalContext, row chunk.Row) (res types.BinaryJSON, isNull bool, err error) { val, isNull, err := b.args[0].EvalTime(ctx, row) if isNull || err != nil { return res, isNull, err @@ -953,7 +953,7 @@ func (b *builtinCastRealAsRealSig) Clone() builtinFunc { return newSig } -func (b *builtinCastRealAsRealSig) evalReal(ctx sessionctx.Context, row chunk.Row) (res float64, isNull bool, err error) { +func (b *builtinCastRealAsRealSig) evalReal(ctx EvalContext, row chunk.Row) (res float64, isNull bool, err error) { res, isNull, err = b.args[0].EvalReal(ctx, row) if b.inUnion && mysql.HasUnsignedFlag(b.tp.GetFlag()) && res < 0 { res = 0 @@ -971,7 +971,7 @@ func (b *builtinCastRealAsIntSig) Clone() builtinFunc { return newSig } -func (b *builtinCastRealAsIntSig) evalInt(ctx sessionctx.Context, row chunk.Row) (res int64, isNull bool, err error) { +func (b *builtinCastRealAsIntSig) evalInt(ctx EvalContext, row chunk.Row) (res int64, isNull bool, err error) { val, isNull, err := b.args[0].EvalReal(ctx, row) if isNull || err != nil { return res, isNull, err @@ -987,7 +987,7 @@ func (b *builtinCastRealAsIntSig) evalInt(ctx sessionctx.Context, row chunk.Row) res = int64(uintVal) } if types.ErrOverflow.Equal(err) { - err = ctx.GetSessionVars().StmtCtx.HandleOverflow(err, err) + err = ctx.GetSessionVars().StmtCtx.HandleError(err) } return res, isNull, err } @@ -1002,7 +1002,7 @@ func (b *builtinCastRealAsDecimalSig) Clone() builtinFunc { return newSig } -func (b *builtinCastRealAsDecimalSig) evalDecimal(ctx sessionctx.Context, row chunk.Row) (res *types.MyDecimal, isNull bool, err error) { +func (b *builtinCastRealAsDecimalSig) evalDecimal(ctx EvalContext, row chunk.Row) (res *types.MyDecimal, isNull bool, err error) { val, isNull, err := b.args[0].EvalReal(ctx, row) if isNull || err != nil { return res, isNull, err @@ -1012,7 +1012,7 @@ func (b *builtinCastRealAsDecimalSig) evalDecimal(ctx sessionctx.Context, row ch err = res.FromFloat64(val) if types.ErrOverflow.Equal(err) { warnErr := types.ErrTruncatedWrongVal.GenWithStackByArgs("DECIMAL", b.args[0]) - err = ctx.GetSessionVars().StmtCtx.HandleOverflow(err, warnErr) + err = ctx.GetSessionVars().StmtCtx.HandleErrorWithAlias(err, err, warnErr) } else if types.ErrTruncated.Equal(err) { // This behavior is consistent with MySQL. err = nil @@ -1023,7 +1023,7 @@ func (b *builtinCastRealAsDecimalSig) evalDecimal(ctx sessionctx.Context, row ch } sc := ctx.GetSessionVars().StmtCtx res, err = types.ProduceDecWithSpecifiedTp(sc.TypeCtx(), res, b.tp) - err = sc.HandleOverflow(err, err) + err = sc.HandleError(err) return res, false, err } @@ -1037,7 +1037,7 @@ func (b *builtinCastRealAsStringSig) Clone() builtinFunc { return newSig } -func (b *builtinCastRealAsStringSig) evalString(ctx sessionctx.Context, row chunk.Row) (res string, isNull bool, err error) { +func (b *builtinCastRealAsStringSig) evalString(ctx EvalContext, row chunk.Row) (res string, isNull bool, err error) { val, isNull, err := b.args[0].EvalReal(ctx, row) if isNull || err != nil { return res, isNull, err @@ -1067,7 +1067,7 @@ func (b *builtinCastRealAsTimeSig) Clone() builtinFunc { return newSig } -func (b *builtinCastRealAsTimeSig) evalTime(ctx sessionctx.Context, row chunk.Row) (types.Time, bool, error) { +func (b *builtinCastRealAsTimeSig) evalTime(ctx EvalContext, row chunk.Row) (types.Time, bool, error) { val, isNull, err := b.args[0].EvalReal(ctx, row) if isNull || err != nil { return types.ZeroTime, true, err @@ -1099,7 +1099,7 @@ func (b *builtinCastRealAsDurationSig) Clone() builtinFunc { return newSig } -func (b *builtinCastRealAsDurationSig) evalDuration(ctx sessionctx.Context, row chunk.Row) (res types.Duration, isNull bool, err error) { +func (b *builtinCastRealAsDurationSig) evalDuration(ctx EvalContext, row chunk.Row) (res types.Duration, isNull bool, err error) { val, isNull, err := b.args[0].EvalReal(ctx, row) if isNull || err != nil { return res, isNull, err @@ -1125,7 +1125,7 @@ func (b *builtinCastDecimalAsDecimalSig) Clone() builtinFunc { return newSig } -func (b *builtinCastDecimalAsDecimalSig) evalDecimal(ctx sessionctx.Context, row chunk.Row) (res *types.MyDecimal, isNull bool, err error) { +func (b *builtinCastDecimalAsDecimalSig) evalDecimal(ctx EvalContext, row chunk.Row) (res *types.MyDecimal, isNull bool, err error) { evalDecimal, isNull, err := b.args[0].EvalDecimal(ctx, row) if isNull || err != nil { return res, isNull, err @@ -1136,7 +1136,7 @@ func (b *builtinCastDecimalAsDecimalSig) evalDecimal(ctx sessionctx.Context, row } sc := ctx.GetSessionVars().StmtCtx res, err = types.ProduceDecWithSpecifiedTp(sc.TypeCtx(), res, b.tp) - err = sc.HandleOverflow(err, err) + err = sc.HandleError(err) return res, false, err } @@ -1150,7 +1150,7 @@ func (b *builtinCastDecimalAsIntSig) Clone() builtinFunc { return newSig } -func (b *builtinCastDecimalAsIntSig) evalInt(ctx sessionctx.Context, row chunk.Row) (res int64, isNull bool, err error) { +func (b *builtinCastDecimalAsIntSig) evalInt(ctx EvalContext, row chunk.Row) (res int64, isNull bool, err error) { val, isNull, err := b.args[0].EvalDecimal(ctx, row) if isNull || err != nil { return res, isNull, err @@ -1175,7 +1175,7 @@ func (b *builtinCastDecimalAsIntSig) evalInt(ctx sessionctx.Context, row chunk.R if types.ErrOverflow.Equal(err) { warnErr := types.ErrTruncatedWrongVal.GenWithStackByArgs("DECIMAL", val) - err = ctx.GetSessionVars().StmtCtx.HandleOverflow(err, warnErr) + err = ctx.GetSessionVars().StmtCtx.HandleErrorWithAlias(err, err, warnErr) } return res, false, err @@ -1191,7 +1191,7 @@ func (b *builtinCastDecimalAsStringSig) Clone() builtinFunc { return newSig } -func (b *builtinCastDecimalAsStringSig) evalString(ctx sessionctx.Context, row chunk.Row) (res string, isNull bool, err error) { +func (b *builtinCastDecimalAsStringSig) evalString(ctx EvalContext, row chunk.Row) (res string, isNull bool, err error) { val, isNull, err := b.args[0].EvalDecimal(ctx, row) if isNull || err != nil { return res, isNull, err @@ -1228,7 +1228,7 @@ func (b *builtinCastDecimalAsRealSig) Clone() builtinFunc { return newSig } -func (b *builtinCastDecimalAsRealSig) evalReal(ctx sessionctx.Context, row chunk.Row) (res float64, isNull bool, err error) { +func (b *builtinCastDecimalAsRealSig) evalReal(ctx EvalContext, row chunk.Row) (res float64, isNull bool, err error) { val, isNull, err := b.args[0].EvalDecimal(ctx, row) if isNull || err != nil { return res, isNull, err @@ -1251,7 +1251,7 @@ func (b *builtinCastDecimalAsTimeSig) Clone() builtinFunc { return newSig } -func (b *builtinCastDecimalAsTimeSig) evalTime(ctx sessionctx.Context, row chunk.Row) (res types.Time, isNull bool, err error) { +func (b *builtinCastDecimalAsTimeSig) evalTime(ctx EvalContext, row chunk.Row) (res types.Time, isNull bool, err error) { val, isNull, err := b.args[0].EvalDecimal(ctx, row) if isNull || err != nil { return res, isNull, err @@ -1278,7 +1278,7 @@ func (b *builtinCastDecimalAsDurationSig) Clone() builtinFunc { return newSig } -func (b *builtinCastDecimalAsDurationSig) evalDuration(ctx sessionctx.Context, row chunk.Row) (res types.Duration, isNull bool, err error) { +func (b *builtinCastDecimalAsDurationSig) evalDuration(ctx EvalContext, row chunk.Row) (res types.Duration, isNull bool, err error) { val, isNull, err := b.args[0].EvalDecimal(ctx, row) if isNull || err != nil { return res, true, err @@ -1302,7 +1302,7 @@ func (b *builtinCastStringAsStringSig) Clone() builtinFunc { return newSig } -func (b *builtinCastStringAsStringSig) evalString(ctx sessionctx.Context, row chunk.Row) (res string, isNull bool, err error) { +func (b *builtinCastStringAsStringSig) evalString(ctx EvalContext, row chunk.Row) (res string, isNull bool, err error) { res, isNull, err = b.args[0].EvalString(ctx, row) if isNull || err != nil { return res, isNull, err @@ -1328,7 +1328,7 @@ func (b *builtinCastStringAsIntSig) Clone() builtinFunc { // see https://dev.mysql.com/doc/refman/5.7/en/out-of-range-and-overflow.html. // When an out-of-range value is assigned to an integer column, MySQL stores the value representing the corresponding endpoint of the column data type range. If it is in select statement, it will return the // endpoint value with a warning. -func (*builtinCastStringAsIntSig) handleOverflow(ctx sessionctx.Context, origRes int64, origStr string, origErr error, isNegative bool) (res int64, err error) { +func (*builtinCastStringAsIntSig) handleOverflow(ctx EvalContext, origRes int64, origStr string, origErr error, isNegative bool) (res int64, err error) { res, err = origRes, origErr if err == nil { return @@ -1343,12 +1343,12 @@ func (*builtinCastStringAsIntSig) handleOverflow(ctx sessionctx.Context, origRes res = int64(uval) } warnErr := types.ErrTruncatedWrongVal.GenWithStackByArgs("INTEGER", origStr) - err = sc.HandleOverflow(origErr, warnErr) + err = sc.HandleErrorWithAlias(origErr, origErr, warnErr) } return } -func (b *builtinCastStringAsIntSig) evalInt(ctx sessionctx.Context, row chunk.Row) (res int64, isNull bool, err error) { +func (b *builtinCastStringAsIntSig) evalInt(ctx EvalContext, row chunk.Row) (res int64, isNull bool, err error) { if b.args[0].GetType().Hybrid() || IsBinaryLiteral(b.args[0]) { return b.args[0].EvalInt(ctx, row) } @@ -1402,7 +1402,7 @@ func (b *builtinCastStringAsRealSig) Clone() builtinFunc { return newSig } -func (b *builtinCastStringAsRealSig) evalReal(ctx sessionctx.Context, row chunk.Row) (res float64, isNull bool, err error) { +func (b *builtinCastStringAsRealSig) evalReal(ctx EvalContext, row chunk.Row) (res float64, isNull bool, err error) { if IsBinaryLiteral(b.args[0]) { return b.args[0].EvalReal(ctx, row) } @@ -1438,7 +1438,7 @@ func (b *builtinCastStringAsDecimalSig) Clone() builtinFunc { return newSig } -func (b *builtinCastStringAsDecimalSig) evalDecimal(ctx sessionctx.Context, row chunk.Row) (res *types.MyDecimal, isNull bool, err error) { +func (b *builtinCastStringAsDecimalSig) evalDecimal(ctx EvalContext, row chunk.Row) (res *types.MyDecimal, isNull bool, err error) { if IsBinaryLiteral(b.args[0]) { return b.args[0].EvalDecimal(ctx, row) } @@ -1461,7 +1461,7 @@ func (b *builtinCastStringAsDecimalSig) evalDecimal(ctx sessionctx.Context, row } } res, err = types.ProduceDecWithSpecifiedTp(sc.TypeCtx(), res, b.tp) - err = sc.HandleOverflow(err, err) + err = sc.HandleError(err) return res, false, err } @@ -1475,7 +1475,7 @@ func (b *builtinCastStringAsTimeSig) Clone() builtinFunc { return newSig } -func (b *builtinCastStringAsTimeSig) evalTime(ctx sessionctx.Context, row chunk.Row) (res types.Time, isNull bool, err error) { +func (b *builtinCastStringAsTimeSig) evalTime(ctx EvalContext, row chunk.Row) (res types.Time, isNull bool, err error) { val, isNull, err := b.args[0].EvalString(ctx, row) if isNull || err != nil { return res, isNull, err @@ -1505,7 +1505,7 @@ func (b *builtinCastStringAsDurationSig) Clone() builtinFunc { return newSig } -func (b *builtinCastStringAsDurationSig) evalDuration(ctx sessionctx.Context, row chunk.Row) (res types.Duration, isNull bool, err error) { +func (b *builtinCastStringAsDurationSig) evalDuration(ctx EvalContext, row chunk.Row) (res types.Duration, isNull bool, err error) { val, isNull, err := b.args[0].EvalString(ctx, row) if isNull || err != nil { return res, isNull, err @@ -1528,7 +1528,7 @@ func (b *builtinCastTimeAsTimeSig) Clone() builtinFunc { return newSig } -func (b *builtinCastTimeAsTimeSig) evalTime(ctx sessionctx.Context, row chunk.Row) (res types.Time, isNull bool, err error) { +func (b *builtinCastTimeAsTimeSig) evalTime(ctx EvalContext, row chunk.Row) (res types.Time, isNull bool, err error) { res, isNull, err = b.args[0].EvalTime(ctx, row) if isNull || err != nil { return res, isNull, err @@ -1557,7 +1557,7 @@ func (b *builtinCastTimeAsIntSig) Clone() builtinFunc { return newSig } -func (b *builtinCastTimeAsIntSig) evalInt(ctx sessionctx.Context, row chunk.Row) (res int64, isNull bool, err error) { +func (b *builtinCastTimeAsIntSig) evalInt(ctx EvalContext, row chunk.Row) (res int64, isNull bool, err error) { val, isNull, err := b.args[0].EvalTime(ctx, row) if isNull || err != nil { return res, isNull, err @@ -1581,7 +1581,7 @@ func (b *builtinCastTimeAsRealSig) Clone() builtinFunc { return newSig } -func (b *builtinCastTimeAsRealSig) evalReal(ctx sessionctx.Context, row chunk.Row) (res float64, isNull bool, err error) { +func (b *builtinCastTimeAsRealSig) evalReal(ctx EvalContext, row chunk.Row) (res float64, isNull bool, err error) { val, isNull, err := b.args[0].EvalTime(ctx, row) if isNull || err != nil { return res, isNull, err @@ -1600,14 +1600,14 @@ func (b *builtinCastTimeAsDecimalSig) Clone() builtinFunc { return newSig } -func (b *builtinCastTimeAsDecimalSig) evalDecimal(ctx sessionctx.Context, row chunk.Row) (res *types.MyDecimal, isNull bool, err error) { +func (b *builtinCastTimeAsDecimalSig) evalDecimal(ctx EvalContext, row chunk.Row) (res *types.MyDecimal, isNull bool, err error) { val, isNull, err := b.args[0].EvalTime(ctx, row) if isNull || err != nil { return res, isNull, err } sc := ctx.GetSessionVars().StmtCtx res, err = types.ProduceDecWithSpecifiedTp(sc.TypeCtx(), val.ToNumber(), b.tp) - err = sc.HandleOverflow(err, err) + err = sc.HandleError(err) return res, false, err } @@ -1621,7 +1621,7 @@ func (b *builtinCastTimeAsStringSig) Clone() builtinFunc { return newSig } -func (b *builtinCastTimeAsStringSig) evalString(ctx sessionctx.Context, row chunk.Row) (res string, isNull bool, err error) { +func (b *builtinCastTimeAsStringSig) evalString(ctx EvalContext, row chunk.Row) (res string, isNull bool, err error) { val, isNull, err := b.args[0].EvalTime(ctx, row) if isNull || err != nil { return res, isNull, err @@ -1644,7 +1644,7 @@ func (b *builtinCastTimeAsDurationSig) Clone() builtinFunc { return newSig } -func (b *builtinCastTimeAsDurationSig) evalDuration(ctx sessionctx.Context, row chunk.Row) (res types.Duration, isNull bool, err error) { +func (b *builtinCastTimeAsDurationSig) evalDuration(ctx EvalContext, row chunk.Row) (res types.Duration, isNull bool, err error) { val, isNull, err := b.args[0].EvalTime(ctx, row) if isNull || err != nil { return res, isNull, err @@ -1667,7 +1667,7 @@ func (b *builtinCastDurationAsDurationSig) Clone() builtinFunc { return newSig } -func (b *builtinCastDurationAsDurationSig) evalDuration(ctx sessionctx.Context, row chunk.Row) (res types.Duration, isNull bool, err error) { +func (b *builtinCastDurationAsDurationSig) evalDuration(ctx EvalContext, row chunk.Row) (res types.Duration, isNull bool, err error) { res, isNull, err = b.args[0].EvalDuration(ctx, row) if isNull || err != nil { return res, isNull, err @@ -1686,7 +1686,7 @@ func (b *builtinCastDurationAsIntSig) Clone() builtinFunc { return newSig } -func (b *builtinCastDurationAsIntSig) evalInt(ctx sessionctx.Context, row chunk.Row) (res int64, isNull bool, err error) { +func (b *builtinCastDurationAsIntSig) evalInt(ctx EvalContext, row chunk.Row) (res int64, isNull bool, err error) { val, isNull, err := b.args[0].EvalDuration(ctx, row) if isNull || err != nil { return res, isNull, err @@ -1715,7 +1715,7 @@ func (b *builtinCastDurationAsRealSig) Clone() builtinFunc { return newSig } -func (b *builtinCastDurationAsRealSig) evalReal(ctx sessionctx.Context, row chunk.Row) (res float64, isNull bool, err error) { +func (b *builtinCastDurationAsRealSig) evalReal(ctx EvalContext, row chunk.Row) (res float64, isNull bool, err error) { val, isNull, err := b.args[0].EvalDuration(ctx, row) if isNull || err != nil { return res, isNull, err @@ -1737,7 +1737,7 @@ func (b *builtinCastDurationAsDecimalSig) Clone() builtinFunc { return newSig } -func (b *builtinCastDurationAsDecimalSig) evalDecimal(ctx sessionctx.Context, row chunk.Row) (res *types.MyDecimal, isNull bool, err error) { +func (b *builtinCastDurationAsDecimalSig) evalDecimal(ctx EvalContext, row chunk.Row) (res *types.MyDecimal, isNull bool, err error) { val, isNull, err := b.args[0].EvalDuration(ctx, row) if isNull || err != nil { return res, isNull, err @@ -1747,7 +1747,7 @@ func (b *builtinCastDurationAsDecimalSig) evalDecimal(ctx sessionctx.Context, ro } sc := ctx.GetSessionVars().StmtCtx res, err = types.ProduceDecWithSpecifiedTp(sc.TypeCtx(), val.ToNumber(), b.tp) - err = sc.HandleOverflow(err, err) + err = sc.HandleError(err) return res, false, err } @@ -1761,7 +1761,7 @@ func (b *builtinCastDurationAsStringSig) Clone() builtinFunc { return newSig } -func (b *builtinCastDurationAsStringSig) evalString(ctx sessionctx.Context, row chunk.Row) (res string, isNull bool, err error) { +func (b *builtinCastDurationAsStringSig) evalString(ctx EvalContext, row chunk.Row) (res string, isNull bool, err error) { val, isNull, err := b.args[0].EvalDuration(ctx, row) if isNull || err != nil { return res, isNull, err @@ -1774,7 +1774,7 @@ func (b *builtinCastDurationAsStringSig) evalString(ctx sessionctx.Context, row return padZeroForBinaryType(res, b.tp, ctx) } -func padZeroForBinaryType(s string, tp *types.FieldType, ctx sessionctx.Context) (string, bool, error) { +func padZeroForBinaryType(s string, tp *types.FieldType, ctx EvalContext) (string, bool, error) { flen := tp.GetFlen() if tp.GetType() == mysql.TypeString && types.IsBinaryStr(tp) && len(s) < flen { valStr, _ := ctx.GetSessionVars().GetSystemVar(variable.MaxAllowedPacket) @@ -1801,7 +1801,7 @@ func (b *builtinCastDurationAsTimeSig) Clone() builtinFunc { return newSig } -func (b *builtinCastDurationAsTimeSig) evalTime(ctx sessionctx.Context, row chunk.Row) (res types.Time, isNull bool, err error) { +func (b *builtinCastDurationAsTimeSig) evalTime(ctx EvalContext, row chunk.Row) (res types.Time, isNull bool, err error) { val, isNull, err := b.args[0].EvalDuration(ctx, row) if isNull || err != nil { return res, isNull, err @@ -1829,7 +1829,7 @@ func (b *builtinCastJSONAsJSONSig) Clone() builtinFunc { return newSig } -func (b *builtinCastJSONAsJSONSig) evalJSON(ctx sessionctx.Context, row chunk.Row) (val types.BinaryJSON, isNull bool, err error) { +func (b *builtinCastJSONAsJSONSig) evalJSON(ctx EvalContext, row chunk.Row) (val types.BinaryJSON, isNull bool, err error) { return b.args[0].EvalJSON(ctx, row) } @@ -1843,14 +1843,14 @@ func (b *builtinCastJSONAsIntSig) Clone() builtinFunc { return newSig } -func (b *builtinCastJSONAsIntSig) evalInt(ctx sessionctx.Context, row chunk.Row) (res int64, isNull bool, err error) { +func (b *builtinCastJSONAsIntSig) evalInt(ctx EvalContext, row chunk.Row) (res int64, isNull bool, err error) { val, isNull, err := b.args[0].EvalJSON(ctx, row) if isNull || err != nil { return res, isNull, err } sc := ctx.GetSessionVars().StmtCtx res, err = types.ConvertJSONToInt64(sc.TypeCtx(), val, mysql.HasUnsignedFlag(b.tp.GetFlag())) - err = sc.HandleOverflow(err, err) + err = sc.HandleError(err) return } @@ -1864,7 +1864,7 @@ func (b *builtinCastJSONAsRealSig) Clone() builtinFunc { return newSig } -func (b *builtinCastJSONAsRealSig) evalReal(ctx sessionctx.Context, row chunk.Row) (res float64, isNull bool, err error) { +func (b *builtinCastJSONAsRealSig) evalReal(ctx EvalContext, row chunk.Row) (res float64, isNull bool, err error) { val, isNull, err := b.args[0].EvalJSON(ctx, row) if isNull || err != nil { return res, isNull, err @@ -1884,7 +1884,7 @@ func (b *builtinCastJSONAsDecimalSig) Clone() builtinFunc { return newSig } -func (b *builtinCastJSONAsDecimalSig) evalDecimal(ctx sessionctx.Context, row chunk.Row) (res *types.MyDecimal, isNull bool, err error) { +func (b *builtinCastJSONAsDecimalSig) evalDecimal(ctx EvalContext, row chunk.Row) (res *types.MyDecimal, isNull bool, err error) { val, isNull, err := b.args[0].EvalJSON(ctx, row) if isNull || err != nil { return res, isNull, err @@ -1895,7 +1895,7 @@ func (b *builtinCastJSONAsDecimalSig) evalDecimal(ctx sessionctx.Context, row ch return res, false, err } res, err = types.ProduceDecWithSpecifiedTp(sc.TypeCtx(), res, b.tp) - err = sc.HandleOverflow(err, err) + err = sc.HandleError(err) return res, false, err } @@ -1909,7 +1909,7 @@ func (b *builtinCastJSONAsStringSig) Clone() builtinFunc { return newSig } -func (b *builtinCastJSONAsStringSig) evalString(ctx sessionctx.Context, row chunk.Row) (res string, isNull bool, err error) { +func (b *builtinCastJSONAsStringSig) evalString(ctx EvalContext, row chunk.Row) (res string, isNull bool, err error) { val, isNull, err := b.args[0].EvalJSON(ctx, row) if isNull || err != nil { return res, isNull, err @@ -1931,7 +1931,7 @@ func (b *builtinCastJSONAsTimeSig) Clone() builtinFunc { return newSig } -func (b *builtinCastJSONAsTimeSig) evalTime(ctx sessionctx.Context, row chunk.Row) (res types.Time, isNull bool, err error) { +func (b *builtinCastJSONAsTimeSig) evalTime(ctx EvalContext, row chunk.Row) (res types.Time, isNull bool, err error) { val, isNull, err := b.args[0].EvalJSON(ctx, row) if isNull || err != nil { return res, isNull, err @@ -1991,7 +1991,7 @@ func (b *builtinCastJSONAsDurationSig) Clone() builtinFunc { return newSig } -func (b *builtinCastJSONAsDurationSig) evalDuration(ctx sessionctx.Context, row chunk.Row) (res types.Duration, isNull bool, err error) { +func (b *builtinCastJSONAsDurationSig) evalDuration(ctx EvalContext, row chunk.Row) (res types.Duration, isNull bool, err error) { val, isNull, err := b.args[0].EvalJSON(ctx, row) if isNull || err != nil { return res, isNull, err @@ -2147,13 +2147,12 @@ func BuildCastFunctionWithCheck(ctx sessionctx.Context, expr Expression, tp *typ FuncName: model.NewCIStr(ast.Cast), RetType: tp, Function: f, - ctx: ctx, } // We do not fold CAST if the eval type of this scalar function is ETJson // since we may reset the flag of the field type of CastAsJson later which // would affect the evaluation of it. if tp.EvalType() != types.ETJson && err == nil { - res = FoldConstant(res) + res = FoldConstant(ctx, res) } return res, err } @@ -2234,7 +2233,7 @@ func WrapWithCastAsDecimal(ctx sessionctx.Context, expr Expression) Expression { tp.AddFlag(expr.GetType().GetFlag() & (mysql.UnsignedFlag | mysql.NotNullFlag)) castExpr := BuildCastFunction(ctx, expr, tp) // For const item, we can use find-grained precision and scale by the result. - if castExpr.ConstItem(ctx.GetSessionVars().StmtCtx) { + if castExpr.ConstLevel() == ConstStrict { val, isnull, err := castExpr.EvalDecimal(ctx, chunk.Row{}) if !isnull && err == nil { precision, frac := val.PrecisionAndFrac() @@ -2394,7 +2393,7 @@ func TryPushCastIntoControlFunctionForHybridType(ctx sessionctx.Context, expr Ex if err != nil { return expr } - sf.RetType, sf.Function, sf.ctx = f.getRetTp(), f, ctx + sf.RetType, sf.Function = f.getRetTp(), f return sf } case ast.Case: @@ -2419,7 +2418,7 @@ func TryPushCastIntoControlFunctionForHybridType(ctx sessionctx.Context, expr Ex if err != nil { return expr } - sf.RetType, sf.Function, sf.ctx = f.getRetTp(), f, ctx + sf.RetType, sf.Function = f.getRetTp(), f return sf case ast.Elt: hasHybrid := false @@ -2437,7 +2436,7 @@ func TryPushCastIntoControlFunctionForHybridType(ctx sessionctx.Context, expr Ex if err != nil { return expr } - sf.RetType, sf.Function, sf.ctx = f.getRetTp(), f, ctx + sf.RetType, sf.Function = f.getRetTp(), f return sf default: return expr diff --git a/pkg/expression/builtin_cast_test.go b/pkg/expression/builtin_cast_test.go index 24b5816e86fe6..06fc231f493d5 100644 --- a/pkg/expression/builtin_cast_test.go +++ b/pkg/expression/builtin_cast_test.go @@ -98,7 +98,6 @@ func TestCastFunctions(t *testing.T) { defer func() { sc.InSelectStmt = oldInSelectStmt }() - sc.OverflowAsWarning = true // cast('18446744073709551616' as unsigned); tp1 := types.NewFieldTypeBuilder().SetType(mysql.TypeLonglong).SetFlag(mysql.BinaryFlag).SetFlen(mysql.MaxIntWidth).SetCharset(charset.CharsetBin).SetCollate(charset.CollationBin).BuildP() diff --git a/pkg/expression/builtin_cast_vec.go b/pkg/expression/builtin_cast_vec.go index 4202685791e32..37f0890195e13 100644 --- a/pkg/expression/builtin_cast_vec.go +++ b/pkg/expression/builtin_cast_vec.go @@ -22,12 +22,11 @@ import ( gotime "time" "github.com/pingcap/tidb/pkg/parser/mysql" - "github.com/pingcap/tidb/pkg/sessionctx" "github.com/pingcap/tidb/pkg/types" "github.com/pingcap/tidb/pkg/util/chunk" ) -func (b *builtinCastIntAsDurationSig) vecEvalDuration(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinCastIntAsDurationSig) vecEvalDuration(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -49,7 +48,7 @@ func (b *builtinCastIntAsDurationSig) vecEvalDuration(ctx sessionctx.Context, in dur, err := types.NumberToDuration(i64s[i], b.tp.GetDecimal()) if err != nil { if types.ErrOverflow.Equal(err) { - err = ctx.GetSessionVars().StmtCtx.HandleOverflow(err, err) + err = ctx.GetSessionVars().StmtCtx.HandleError(err) } if types.ErrTruncatedWrongVal.Equal(err) { err = ctx.GetSessionVars().StmtCtx.HandleTruncate(err) @@ -69,7 +68,7 @@ func (*builtinCastIntAsDurationSig) vectorized() bool { return true } -func (b *builtinCastIntAsIntSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinCastIntAsIntSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { if err := b.args[0].VecEvalInt(ctx, input, result); err != nil { return err } @@ -90,7 +89,7 @@ func (*builtinCastIntAsIntSig) vectorized() bool { return true } -func (b *builtinCastIntAsRealSig) vecEvalReal(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinCastIntAsRealSig) vecEvalReal(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -134,7 +133,7 @@ func (*builtinCastIntAsRealSig) vectorized() bool { return true } -func (b *builtinCastRealAsRealSig) vecEvalReal(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinCastRealAsRealSig) vecEvalReal(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { if err := b.args[0].VecEvalReal(ctx, input, result); err != nil { return err } @@ -163,7 +162,7 @@ func (*builtinCastTimeAsJSONSig) vectorized() bool { return true } -func (b *builtinCastTimeAsJSONSig) vecEvalJSON(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinCastTimeAsJSONSig) vecEvalJSON(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -195,7 +194,7 @@ func (*builtinCastRealAsStringSig) vectorized() bool { return true } -func (b *builtinCastRealAsStringSig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinCastRealAsStringSig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -245,7 +244,7 @@ func (*builtinCastDecimalAsStringSig) vectorized() bool { return true } -func (b *builtinCastDecimalAsStringSig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinCastDecimalAsStringSig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -285,7 +284,7 @@ func (*builtinCastTimeAsDecimalSig) vectorized() bool { return true } -func (b *builtinCastTimeAsDecimalSig) vecEvalDecimal(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinCastTimeAsDecimalSig) vecEvalDecimal(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -309,7 +308,7 @@ func (b *builtinCastTimeAsDecimalSig) vecEvalDecimal(ctx sessionctx.Context, inp *dec = types.MyDecimal{} times[i].FillNumber(dec) dec, err = types.ProduceDecWithSpecifiedTp(sc.TypeCtx(), dec, b.tp) - if err = sc.HandleOverflow(err, err); err != nil { + if err = sc.HandleError(err); err != nil { return err } decs[i] = *dec @@ -321,7 +320,7 @@ func (*builtinCastDurationAsIntSig) vectorized() bool { return true } -func (b *builtinCastDurationAsIntSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinCastDurationAsIntSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -369,7 +368,7 @@ func (*builtinCastIntAsTimeSig) vectorized() bool { return true } -func (b *builtinCastIntAsTimeSig) vecEvalTime(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinCastIntAsTimeSig) vecEvalTime(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -419,7 +418,7 @@ func (*builtinCastRealAsJSONSig) vectorized() bool { return true } -func (b *builtinCastRealAsJSONSig) vecEvalJSON(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinCastRealAsJSONSig) vecEvalJSON(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -446,7 +445,7 @@ func (*builtinCastJSONAsRealSig) vectorized() bool { return true } -func (b *builtinCastJSONAsRealSig) vecEvalReal(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinCastJSONAsRealSig) vecEvalReal(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -477,7 +476,7 @@ func (*builtinCastJSONAsTimeSig) vectorized() bool { return true } -func (b *builtinCastJSONAsTimeSig) vecEvalTime(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinCastJSONAsTimeSig) vecEvalTime(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -567,7 +566,7 @@ func (*builtinCastRealAsTimeSig) vectorized() bool { return true } -func (b *builtinCastRealAsTimeSig) vecEvalTime(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinCastRealAsTimeSig) vecEvalTime(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -614,7 +613,7 @@ func (*builtinCastDecimalAsDecimalSig) vectorized() bool { return true } -func (b *builtinCastDecimalAsDecimalSig) vecEvalDecimal(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinCastDecimalAsDecimalSig) vecEvalDecimal(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { if err := b.args[0].VecEvalDecimal(ctx, input, result); err != nil { return err } @@ -633,7 +632,7 @@ func (b *builtinCastDecimalAsDecimalSig) vecEvalDecimal(ctx sessionctx.Context, *dec = decs[i] } dec, err := types.ProduceDecWithSpecifiedTp(sc.TypeCtx(), dec, b.tp) - if err = sc.HandleOverflow(err, err); err != nil { + if err = sc.HandleError(err); err != nil { return err } decs[i] = *dec @@ -645,7 +644,7 @@ func (*builtinCastDurationAsTimeSig) vectorized() bool { return true } -func (b *builtinCastDurationAsTimeSig) vecEvalTime(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinCastDurationAsTimeSig) vecEvalTime(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -695,7 +694,7 @@ func (*builtinCastIntAsStringSig) vectorized() bool { return true } -func (b *builtinCastIntAsStringSig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinCastIntAsStringSig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -747,7 +746,7 @@ func (*builtinCastRealAsIntSig) vectorized() bool { return true } -func (b *builtinCastRealAsIntSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinCastRealAsIntSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -779,7 +778,7 @@ func (b *builtinCastRealAsIntSig) vecEvalInt(ctx sessionctx.Context, input *chun i64s[i] = int64(uintVal) } if types.ErrOverflow.Equal(err) { - err = ctx.GetSessionVars().StmtCtx.HandleOverflow(err, err) + err = ctx.GetSessionVars().StmtCtx.HandleError(err) } if err != nil { return err @@ -792,7 +791,7 @@ func (*builtinCastTimeAsRealSig) vectorized() bool { return true } -func (b *builtinCastTimeAsRealSig) vecEvalReal(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinCastTimeAsRealSig) vecEvalReal(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -813,7 +812,7 @@ func (b *builtinCastTimeAsRealSig) vecEvalReal(ctx sessionctx.Context, input *ch f64, err := times[i].ToNumber().ToFloat64() if err != nil { if types.ErrOverflow.Equal(err) { - err = ctx.GetSessionVars().StmtCtx.HandleOverflow(err, err) + err = ctx.GetSessionVars().StmtCtx.HandleError(err) } if err != nil { return err @@ -830,7 +829,7 @@ func (*builtinCastStringAsJSONSig) vectorized() bool { return true } -func (b *builtinCastStringAsJSONSig) vecEvalJSON(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinCastStringAsJSONSig) vecEvalJSON(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -894,7 +893,7 @@ func (*builtinCastRealAsDecimalSig) vectorized() bool { return true } -func (b *builtinCastRealAsDecimalSig) vecEvalDecimal(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinCastRealAsDecimalSig) vecEvalDecimal(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -917,7 +916,7 @@ func (b *builtinCastRealAsDecimalSig) vecEvalDecimal(ctx sessionctx.Context, inp if err = resdecimal[i].FromFloat64(bufreal[i]); err != nil { if types.ErrOverflow.Equal(err) { warnErr := types.ErrTruncatedWrongVal.GenWithStackByArgs("DECIMAL", b.args[0]) - err = ctx.GetSessionVars().StmtCtx.HandleOverflow(err, warnErr) + err = ctx.GetSessionVars().StmtCtx.HandleErrorWithAlias(err, err, warnErr) } else if types.ErrTruncated.Equal(err) { // This behavior is consistent with MySQL. err = nil @@ -928,7 +927,7 @@ func (b *builtinCastRealAsDecimalSig) vecEvalDecimal(ctx sessionctx.Context, inp } } dec, err := types.ProduceDecWithSpecifiedTp(sc.TypeCtx(), &resdecimal[i], b.tp) - if err = sc.HandleOverflow(err, err); err != nil { + if err = sc.HandleError(err); err != nil { return err } resdecimal[i] = *dec @@ -940,7 +939,7 @@ func (*builtinCastStringAsIntSig) vectorized() bool { return true } -func (b *builtinCastStringAsIntSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinCastStringAsIntSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() if b.args[0].GetType().Hybrid() || IsBinaryLiteral(b.args[0]) { return b.args[0].VecEvalInt(ctx, input, result) @@ -1003,7 +1002,7 @@ func (*builtinCastStringAsDurationSig) vectorized() bool { return true } -func (b *builtinCastStringAsDurationSig) vecEvalDuration(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinCastStringAsDurationSig) vecEvalDuration(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -1042,7 +1041,7 @@ func (*builtinCastDurationAsDecimalSig) vectorized() bool { return true } -func (b *builtinCastDurationAsDecimalSig) vecEvalDecimal(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinCastDurationAsDecimalSig) vecEvalDecimal(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -1069,7 +1068,7 @@ func (b *builtinCastDurationAsDecimalSig) vecEvalDecimal(ctx sessionctx.Context, duration.Duration = ds[i] duration.Fsp = fsp res, err := types.ProduceDecWithSpecifiedTp(sc.TypeCtx(), duration.ToNumber(), b.tp) - if err = sc.HandleOverflow(err, err); err != nil { + if err = sc.HandleError(err); err != nil { return err } d64s[i] = *res @@ -1081,7 +1080,7 @@ func (*builtinCastIntAsDecimalSig) vectorized() bool { return true } -func (b *builtinCastIntAsDecimalSig) vecEvalDecimal(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinCastIntAsDecimalSig) vecEvalDecimal(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -1115,7 +1114,7 @@ func (b *builtinCastIntAsDecimalSig) vecEvalDecimal(ctx sessionctx.Context, inpu } dec, err = types.ProduceDecWithSpecifiedTp(sc.TypeCtx(), dec, b.tp) - if err = sc.HandleOverflow(err, err); err != nil { + if err = sc.HandleError(err); err != nil { return err } decs[i] = *dec @@ -1127,7 +1126,7 @@ func (*builtinCastIntAsJSONSig) vectorized() bool { return true } -func (b *builtinCastIntAsJSONSig) vecEvalJSON(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinCastIntAsJSONSig) vecEvalJSON(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -1172,7 +1171,7 @@ func (*builtinCastJSONAsJSONSig) vectorized() bool { return true } -func (b *builtinCastJSONAsJSONSig) vecEvalJSON(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinCastJSONAsJSONSig) vecEvalJSON(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { return b.args[0].VecEvalJSON(ctx, input, result) } @@ -1180,7 +1179,7 @@ func (*builtinCastJSONAsStringSig) vectorized() bool { return true } -func (b *builtinCastJSONAsStringSig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinCastJSONAsStringSig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -1210,7 +1209,7 @@ func (*builtinCastDurationAsRealSig) vectorized() bool { return true } -func (b *builtinCastDurationAsRealSig) vecEvalReal(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinCastDurationAsRealSig) vecEvalReal(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -1249,7 +1248,7 @@ func (*builtinCastJSONAsIntSig) vectorized() bool { return true } -func (b *builtinCastJSONAsIntSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinCastJSONAsIntSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -1270,7 +1269,7 @@ func (b *builtinCastJSONAsIntSig) vecEvalInt(ctx sessionctx.Context, input *chun continue } i64s[i], err = types.ConvertJSONToInt64(tc, buf.GetJSON(i), mysql.HasUnsignedFlag(b.tp.GetFlag())) - if err = sc.HandleOverflow(err, err); err != nil { + if err = sc.HandleError(err); err != nil { return err } } @@ -1281,7 +1280,7 @@ func (*builtinCastRealAsDurationSig) vectorized() bool { return true } -func (b *builtinCastRealAsDurationSig) vecEvalDuration(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinCastRealAsDurationSig) vecEvalDuration(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -1321,7 +1320,7 @@ func (*builtinCastTimeAsDurationSig) vectorized() bool { return true } -func (b *builtinCastTimeAsDurationSig) vecEvalDuration(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinCastTimeAsDurationSig) vecEvalDuration(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() arg0, err := b.bufAllocator.get() if err != nil { @@ -1356,7 +1355,7 @@ func (*builtinCastDurationAsDurationSig) vectorized() bool { return true } -func (b *builtinCastDurationAsDurationSig) vecEvalDuration(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinCastDurationAsDurationSig) vecEvalDuration(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { var err error if err = b.args[0].VecEvalDuration(ctx, input, result); err != nil { return err @@ -1385,7 +1384,7 @@ func (*builtinCastDurationAsStringSig) vectorized() bool { return true } -func (b *builtinCastDurationAsStringSig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinCastDurationAsStringSig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -1427,7 +1426,7 @@ func (*builtinCastDecimalAsRealSig) vectorized() bool { return true } -func (b *builtinCastDecimalAsRealSig) vecEvalReal(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinCastDecimalAsRealSig) vecEvalReal(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -1456,7 +1455,7 @@ func (b *builtinCastDecimalAsRealSig) vecEvalReal(ctx sessionctx.Context, input res, err := d[i].ToFloat64() if err != nil { if types.ErrOverflow.Equal(err) { - err = ctx.GetSessionVars().StmtCtx.HandleOverflow(err, err) + err = ctx.GetSessionVars().StmtCtx.HandleError(err) } if err != nil { return err @@ -1473,7 +1472,7 @@ func (*builtinCastDecimalAsTimeSig) vectorized() bool { return true } -func (b *builtinCastDecimalAsTimeSig) vecEvalTime(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinCastDecimalAsTimeSig) vecEvalTime(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -1515,7 +1514,7 @@ func (*builtinCastTimeAsIntSig) vectorized() bool { return true } -func (b *builtinCastTimeAsIntSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinCastTimeAsIntSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -1551,7 +1550,7 @@ func (*builtinCastTimeAsTimeSig) vectorized() bool { return true } -func (b *builtinCastTimeAsTimeSig) vecEvalTime(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinCastTimeAsTimeSig) vecEvalTime(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() if err := b.args[0].VecEvalTime(ctx, input, result); err != nil { return err @@ -1590,7 +1589,7 @@ func (*builtinCastTimeAsStringSig) vectorized() bool { return true } -func (b *builtinCastTimeAsStringSig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinCastTimeAsStringSig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -1632,7 +1631,7 @@ func (*builtinCastJSONAsDecimalSig) vectorized() bool { return true } -func (b *builtinCastJSONAsDecimalSig) vecEvalDecimal(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinCastJSONAsDecimalSig) vecEvalDecimal(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -1655,7 +1654,7 @@ func (b *builtinCastJSONAsDecimalSig) vecEvalDecimal(ctx sessionctx.Context, inp return err } tempres, err = types.ProduceDecWithSpecifiedTp(sc.TypeCtx(), tempres, b.tp) - if err = sc.HandleOverflow(err, err); err != nil { + if err = sc.HandleError(err); err != nil { return err } res[i] = *tempres @@ -1667,7 +1666,7 @@ func (*builtinCastStringAsRealSig) vectorized() bool { return true } -func (b *builtinCastStringAsRealSig) vecEvalReal(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinCastStringAsRealSig) vecEvalReal(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { if IsBinaryLiteral(b.args[0]) { return b.args[0].VecEvalReal(ctx, input, result) } @@ -1716,7 +1715,7 @@ func (*builtinCastStringAsDecimalSig) vectorized() bool { return true } -func (b *builtinCastStringAsDecimalSig) vecEvalDecimal(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinCastStringAsDecimalSig) vecEvalDecimal(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { if IsBinaryLiteral(b.args[0]) { return b.args[0].VecEvalDecimal(ctx, input, result) } @@ -1745,7 +1744,7 @@ func (b *builtinCastStringAsDecimalSig) vecEvalDecimal(ctx sessionctx.Context, i return err } dec, err := types.ProduceDecWithSpecifiedTp(stmtCtx.TypeCtx(), dec, b.tp) - if err = stmtCtx.HandleOverflow(err, err); err != nil { + if err = stmtCtx.HandleError(err); err != nil { return err } res[i] = *dec @@ -1758,7 +1757,7 @@ func (*builtinCastStringAsTimeSig) vectorized() bool { return true } -func (b *builtinCastStringAsTimeSig) vecEvalTime(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinCastStringAsTimeSig) vecEvalTime(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -1810,7 +1809,7 @@ func (*builtinCastDecimalAsIntSig) vectorized() bool { return true } -func (b *builtinCastDecimalAsIntSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinCastDecimalAsIntSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -1849,7 +1848,7 @@ func (b *builtinCastDecimalAsIntSig) vecEvalInt(ctx sessionctx.Context, input *c if types.ErrOverflow.Equal(err) { warnErr := types.ErrTruncatedWrongVal.GenWithStackByArgs("DECIMAL", d64s[i]) - err = ctx.GetSessionVars().StmtCtx.HandleOverflow(err, warnErr) + err = ctx.GetSessionVars().StmtCtx.HandleErrorWithAlias(err, err, warnErr) } if err != nil { @@ -1863,7 +1862,7 @@ func (*builtinCastDecimalAsDurationSig) vectorized() bool { return true } -func (b *builtinCastDecimalAsDurationSig) vecEvalDuration(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinCastDecimalAsDurationSig) vecEvalDuration(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -1904,7 +1903,7 @@ func (*builtinCastStringAsStringSig) vectorized() bool { return true } -func (b *builtinCastStringAsStringSig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinCastStringAsStringSig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -1945,7 +1944,7 @@ func (*builtinCastJSONAsDurationSig) vectorized() bool { return true } -func (b *builtinCastJSONAsDurationSig) vecEvalDuration(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinCastJSONAsDurationSig) vecEvalDuration(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -2014,7 +2013,7 @@ func (*builtinCastDecimalAsJSONSig) vectorized() bool { return true } -func (b *builtinCastDecimalAsJSONSig) vecEvalJSON(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinCastDecimalAsJSONSig) vecEvalJSON(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -2047,7 +2046,7 @@ func (*builtinCastDurationAsJSONSig) vectorized() bool { return true } -func (b *builtinCastDurationAsJSONSig) vecEvalJSON(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinCastDurationAsJSONSig) vecEvalJSON(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { diff --git a/pkg/expression/builtin_cast_vec_test.go b/pkg/expression/builtin_cast_vec_test.go index ca61ad421616f..aeecc19b11e45 100644 --- a/pkg/expression/builtin_cast_vec_test.go +++ b/pkg/expression/builtin_cast_vec_test.go @@ -158,7 +158,7 @@ func TestVectorizedBuiltinCastFunc(t *testing.T) { func TestVectorizedCastRealAsTime(t *testing.T) { col := &Column{RetType: types.NewFieldType(mysql.TypeDouble), Index: 0} - ctx := mock.NewContext() + ctx := createContext(t) baseFunc, err := newBaseBuiltinFunc(ctx, "", []Expression{col}, types.NewFieldType(mysql.TypeDatetime)) if err != nil { panic(err) diff --git a/pkg/expression/builtin_compare.go b/pkg/expression/builtin_compare.go index 9b5ec318c828b..8f12b837e9050 100644 --- a/pkg/expression/builtin_compare.go +++ b/pkg/expression/builtin_compare.go @@ -185,7 +185,7 @@ func (b *builtinCoalesceIntSig) Clone() builtinFunc { return newSig } -func (b *builtinCoalesceIntSig) evalInt(ctx sessionctx.Context, row chunk.Row) (res int64, isNull bool, err error) { +func (b *builtinCoalesceIntSig) evalInt(ctx EvalContext, row chunk.Row) (res int64, isNull bool, err error) { for _, a := range b.getArgs() { res, isNull, err = a.EvalInt(ctx, row) if err != nil || !isNull { @@ -207,7 +207,7 @@ func (b *builtinCoalesceRealSig) Clone() builtinFunc { return newSig } -func (b *builtinCoalesceRealSig) evalReal(ctx sessionctx.Context, row chunk.Row) (res float64, isNull bool, err error) { +func (b *builtinCoalesceRealSig) evalReal(ctx EvalContext, row chunk.Row) (res float64, isNull bool, err error) { for _, a := range b.getArgs() { res, isNull, err = a.EvalReal(ctx, row) if err != nil || !isNull { @@ -229,7 +229,7 @@ func (b *builtinCoalesceDecimalSig) Clone() builtinFunc { return newSig } -func (b *builtinCoalesceDecimalSig) evalDecimal(ctx sessionctx.Context, row chunk.Row) (res *types.MyDecimal, isNull bool, err error) { +func (b *builtinCoalesceDecimalSig) evalDecimal(ctx EvalContext, row chunk.Row) (res *types.MyDecimal, isNull bool, err error) { for _, a := range b.getArgs() { res, isNull, err = a.EvalDecimal(ctx, row) if err != nil || !isNull { @@ -251,7 +251,7 @@ func (b *builtinCoalesceStringSig) Clone() builtinFunc { return newSig } -func (b *builtinCoalesceStringSig) evalString(ctx sessionctx.Context, row chunk.Row) (res string, isNull bool, err error) { +func (b *builtinCoalesceStringSig) evalString(ctx EvalContext, row chunk.Row) (res string, isNull bool, err error) { for _, a := range b.getArgs() { res, isNull, err = a.EvalString(ctx, row) if err != nil || !isNull { @@ -273,7 +273,7 @@ func (b *builtinCoalesceTimeSig) Clone() builtinFunc { return newSig } -func (b *builtinCoalesceTimeSig) evalTime(ctx sessionctx.Context, row chunk.Row) (res types.Time, isNull bool, err error) { +func (b *builtinCoalesceTimeSig) evalTime(ctx EvalContext, row chunk.Row) (res types.Time, isNull bool, err error) { fsp := b.tp.GetDecimal() for _, a := range b.getArgs() { res, isNull, err = a.EvalTime(ctx, row) @@ -297,7 +297,7 @@ func (b *builtinCoalesceDurationSig) Clone() builtinFunc { return newSig } -func (b *builtinCoalesceDurationSig) evalDuration(ctx sessionctx.Context, row chunk.Row) (res types.Duration, isNull bool, err error) { +func (b *builtinCoalesceDurationSig) evalDuration(ctx EvalContext, row chunk.Row) (res types.Duration, isNull bool, err error) { for _, a := range b.getArgs() { res, isNull, err = a.EvalDuration(ctx, row) res.Fsp = b.tp.GetDecimal() @@ -320,7 +320,7 @@ func (b *builtinCoalesceJSONSig) Clone() builtinFunc { return newSig } -func (b *builtinCoalesceJSONSig) evalJSON(ctx sessionctx.Context, row chunk.Row) (res types.BinaryJSON, isNull bool, err error) { +func (b *builtinCoalesceJSONSig) evalJSON(ctx EvalContext, row chunk.Row) (res types.BinaryJSON, isNull bool, err error) { for _, a := range b.getArgs() { res, isNull, err = a.EvalJSON(ctx, row) if err != nil || !isNull { @@ -532,7 +532,7 @@ func (b *builtinGreatestIntSig) Clone() builtinFunc { // evalInt evals a builtinGreatestIntSig. // See http://dev.mysql.com/doc/refman/5.7/en/comparison-operators.html#function_greatest -func (b *builtinGreatestIntSig) evalInt(ctx sessionctx.Context, row chunk.Row) (max int64, isNull bool, err error) { +func (b *builtinGreatestIntSig) evalInt(ctx EvalContext, row chunk.Row) (max int64, isNull bool, err error) { max, isNull, err = b.args[0].EvalInt(ctx, row) if isNull || err != nil { return max, isNull, err @@ -562,7 +562,7 @@ func (b *builtinGreatestRealSig) Clone() builtinFunc { // evalReal evals a builtinGreatestRealSig. // See http://dev.mysql.com/doc/refman/5.7/en/comparison-operators.html#function_greatest -func (b *builtinGreatestRealSig) evalReal(ctx sessionctx.Context, row chunk.Row) (max float64, isNull bool, err error) { +func (b *builtinGreatestRealSig) evalReal(ctx EvalContext, row chunk.Row) (max float64, isNull bool, err error) { max, isNull, err = b.args[0].EvalReal(ctx, row) if isNull || err != nil { return max, isNull, err @@ -592,7 +592,7 @@ func (b *builtinGreatestDecimalSig) Clone() builtinFunc { // evalDecimal evals a builtinGreatestDecimalSig. // See http://dev.mysql.com/doc/refman/5.7/en/comparison-operators.html#function_greatest -func (b *builtinGreatestDecimalSig) evalDecimal(ctx sessionctx.Context, row chunk.Row) (max *types.MyDecimal, isNull bool, err error) { +func (b *builtinGreatestDecimalSig) evalDecimal(ctx EvalContext, row chunk.Row) (max *types.MyDecimal, isNull bool, err error) { max, isNull, err = b.args[0].EvalDecimal(ctx, row) if isNull || err != nil { return max, isNull, err @@ -622,7 +622,7 @@ func (b *builtinGreatestStringSig) Clone() builtinFunc { // evalString evals a builtinGreatestStringSig. // See http://dev.mysql.com/doc/refman/5.7/en/comparison-operators.html#function_greatest -func (b *builtinGreatestStringSig) evalString(ctx sessionctx.Context, row chunk.Row) (max string, isNull bool, err error) { +func (b *builtinGreatestStringSig) evalString(ctx EvalContext, row chunk.Row) (max string, isNull bool, err error) { max, isNull, err = b.args[0].EvalString(ctx, row) if isNull || err != nil { return max, isNull, err @@ -654,7 +654,7 @@ func (b *builtinGreatestCmpStringAsTimeSig) Clone() builtinFunc { // evalString evals a builtinGreatestCmpStringAsTimeSig. // See http://dev.mysql.com/doc/refman/5.7/en/comparison-operators.html#function_greatest -func (b *builtinGreatestCmpStringAsTimeSig) evalString(ctx sessionctx.Context, row chunk.Row) (strRes string, isNull bool, err error) { +func (b *builtinGreatestCmpStringAsTimeSig) evalString(ctx EvalContext, row chunk.Row) (strRes string, isNull bool, err error) { sc := ctx.GetSessionVars().StmtCtx for i := 0; i < len(b.args); i++ { v, isNull, err := b.args[i].EvalString(ctx, row) @@ -673,7 +673,7 @@ func (b *builtinGreatestCmpStringAsTimeSig) evalString(ctx sessionctx.Context, r return strRes, false, nil } -func doTimeConversionForGL(cmpAsDate bool, ctx sessionctx.Context, sc *stmtctx.StatementContext, strVal string) (string, error) { +func doTimeConversionForGL(cmpAsDate bool, ctx EvalContext, sc *stmtctx.StatementContext, strVal string) (string, error) { var t types.Time var err error if cmpAsDate { @@ -709,7 +709,7 @@ func (b *builtinGreatestTimeSig) Clone() builtinFunc { return newSig } -func (b *builtinGreatestTimeSig) evalTime(ctx sessionctx.Context, row chunk.Row) (res types.Time, isNull bool, err error) { +func (b *builtinGreatestTimeSig) evalTime(ctx EvalContext, row chunk.Row) (res types.Time, isNull bool, err error) { for i := 0; i < len(b.args); i++ { v, isNull, err := b.args[i].EvalTime(ctx, row) if isNull || err != nil { @@ -738,7 +738,7 @@ func (b *builtinGreatestDurationSig) Clone() builtinFunc { return newSig } -func (b *builtinGreatestDurationSig) evalDuration(ctx sessionctx.Context, row chunk.Row) (res types.Duration, isNull bool, err error) { +func (b *builtinGreatestDurationSig) evalDuration(ctx EvalContext, row chunk.Row) (res types.Duration, isNull bool, err error) { for i := 0; i < len(b.args); i++ { v, isNull, err := b.args[i].EvalDuration(ctx, row) if isNull || err != nil { @@ -830,7 +830,7 @@ func (b *builtinLeastIntSig) Clone() builtinFunc { // evalInt evals a builtinLeastIntSig. // See http://dev.mysql.com/doc/refman/5.7/en/comparison-operators.html#function_least -func (b *builtinLeastIntSig) evalInt(ctx sessionctx.Context, row chunk.Row) (min int64, isNull bool, err error) { +func (b *builtinLeastIntSig) evalInt(ctx EvalContext, row chunk.Row) (min int64, isNull bool, err error) { min, isNull, err = b.args[0].EvalInt(ctx, row) if isNull || err != nil { return min, isNull, err @@ -860,7 +860,7 @@ func (b *builtinLeastRealSig) Clone() builtinFunc { // evalReal evals a builtinLeastRealSig. // See http://dev.mysql.com/doc/refman/5.7/en/comparison-operators.html#functionleast -func (b *builtinLeastRealSig) evalReal(ctx sessionctx.Context, row chunk.Row) (min float64, isNull bool, err error) { +func (b *builtinLeastRealSig) evalReal(ctx EvalContext, row chunk.Row) (min float64, isNull bool, err error) { min, isNull, err = b.args[0].EvalReal(ctx, row) if isNull || err != nil { return min, isNull, err @@ -890,7 +890,7 @@ func (b *builtinLeastDecimalSig) Clone() builtinFunc { // evalDecimal evals a builtinLeastDecimalSig. // See http://dev.mysql.com/doc/refman/5.7/en/comparison-operators.html#functionleast -func (b *builtinLeastDecimalSig) evalDecimal(ctx sessionctx.Context, row chunk.Row) (min *types.MyDecimal, isNull bool, err error) { +func (b *builtinLeastDecimalSig) evalDecimal(ctx EvalContext, row chunk.Row) (min *types.MyDecimal, isNull bool, err error) { min, isNull, err = b.args[0].EvalDecimal(ctx, row) if isNull || err != nil { return min, isNull, err @@ -920,7 +920,7 @@ func (b *builtinLeastStringSig) Clone() builtinFunc { // evalString evals a builtinLeastStringSig. // See http://dev.mysql.com/doc/refman/5.7/en/comparison-operators.html#functionleast -func (b *builtinLeastStringSig) evalString(ctx sessionctx.Context, row chunk.Row) (min string, isNull bool, err error) { +func (b *builtinLeastStringSig) evalString(ctx EvalContext, row chunk.Row) (min string, isNull bool, err error) { min, isNull, err = b.args[0].EvalString(ctx, row) if isNull || err != nil { return min, isNull, err @@ -952,7 +952,7 @@ func (b *builtinLeastCmpStringAsTimeSig) Clone() builtinFunc { // evalString evals a builtinLeastCmpStringAsTimeSig. // See http://dev.mysql.com/doc/refman/5.7/en/comparison-operators.html#functionleast -func (b *builtinLeastCmpStringAsTimeSig) evalString(ctx sessionctx.Context, row chunk.Row) (strRes string, isNull bool, err error) { +func (b *builtinLeastCmpStringAsTimeSig) evalString(ctx EvalContext, row chunk.Row) (strRes string, isNull bool, err error) { sc := ctx.GetSessionVars().StmtCtx for i := 0; i < len(b.args); i++ { v, isNull, err := b.args[i].EvalString(ctx, row) @@ -983,7 +983,7 @@ func (b *builtinLeastTimeSig) Clone() builtinFunc { return newSig } -func (b *builtinLeastTimeSig) evalTime(ctx sessionctx.Context, row chunk.Row) (res types.Time, isNull bool, err error) { +func (b *builtinLeastTimeSig) evalTime(ctx EvalContext, row chunk.Row) (res types.Time, isNull bool, err error) { for i := 0; i < len(b.args); i++ { v, isNull, err := b.args[i].EvalTime(ctx, row) if isNull || err != nil { @@ -1022,7 +1022,7 @@ func (b *builtinLeastDurationSig) Clone() builtinFunc { return newSig } -func (b *builtinLeastDurationSig) evalDuration(ctx sessionctx.Context, row chunk.Row) (res types.Duration, isNull bool, err error) { +func (b *builtinLeastDurationSig) evalDuration(ctx EvalContext, row chunk.Row) (res types.Duration, isNull bool, err error) { for i := 0; i < len(b.args); i++ { v, isNull, err := b.args[i].EvalDuration(ctx, row) if isNull || err != nil { @@ -1095,7 +1095,7 @@ func (b *builtinIntervalIntSig) Clone() builtinFunc { // evalInt evals a builtinIntervalIntSig. // See http://dev.mysql.com/doc/refman/5.7/en/comparison-operators.html#function_interval -func (b *builtinIntervalIntSig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinIntervalIntSig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { arg0, isNull, err := b.args[0].EvalInt(ctx, row) if err != nil { return 0, true, err @@ -1114,7 +1114,7 @@ func (b *builtinIntervalIntSig) evalInt(ctx sessionctx.Context, row chunk.Row) ( } // linearSearch linearly scans the argument least to find the position of the first value that is larger than the given target. -func (b *builtinIntervalIntSig) linearSearch(ctx sessionctx.Context, target int64, isUint1 bool, args []Expression, row chunk.Row) (i int, err error) { +func (b *builtinIntervalIntSig) linearSearch(ctx EvalContext, target int64, isUint1 bool, args []Expression, row chunk.Row) (i int, err error) { i = 0 for ; i < len(args); i++ { isUint2 := mysql.HasUnsignedFlag(args[i].GetType().GetFlag()) @@ -1146,7 +1146,7 @@ func (b *builtinIntervalIntSig) linearSearch(ctx sessionctx.Context, target int6 // All arguments are treated as integers. // It is required that arg[0] < args[1] < args[2] < ... < args[n] for this function to work correctly. // This is because a binary search is used (very fast). -func (b *builtinIntervalIntSig) binSearch(ctx sessionctx.Context, target int64, isUint1 bool, args []Expression, row chunk.Row) (_ int, err error) { +func (b *builtinIntervalIntSig) binSearch(ctx EvalContext, target int64, isUint1 bool, args []Expression, row chunk.Row) (_ int, err error) { i, j, cmp := 0, len(args), false for i < j { mid := i + (j-i)/2 @@ -1192,7 +1192,7 @@ func (b *builtinIntervalRealSig) Clone() builtinFunc { // evalInt evals a builtinIntervalRealSig. // See http://dev.mysql.com/doc/refman/5.7/en/comparison-operators.html#function_interval -func (b *builtinIntervalRealSig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinIntervalRealSig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { arg0, isNull, err := b.args[0].EvalReal(ctx, row) if err != nil { return 0, true, err @@ -1210,7 +1210,7 @@ func (b *builtinIntervalRealSig) evalInt(ctx sessionctx.Context, row chunk.Row) return int64(idx), err != nil, err } -func (b *builtinIntervalRealSig) linearSearch(ctx sessionctx.Context, target float64, args []Expression, row chunk.Row) (i int, err error) { +func (b *builtinIntervalRealSig) linearSearch(ctx EvalContext, target float64, args []Expression, row chunk.Row) (i int, err error) { i = 0 for ; i < len(args); i++ { arg, isNull, err := args[i].EvalReal(ctx, row) @@ -1224,7 +1224,7 @@ func (b *builtinIntervalRealSig) linearSearch(ctx sessionctx.Context, target flo return i, nil } -func (b *builtinIntervalRealSig) binSearch(ctx sessionctx.Context, target float64, args []Expression, row chunk.Row) (_ int, err error) { +func (b *builtinIntervalRealSig) binSearch(ctx EvalContext, target float64, args []Expression, row chunk.Row) (_ int, err error) { i, j := 0, len(args) for i < j { mid := i + (j-i)/2 @@ -1974,7 +1974,7 @@ func (b *builtinLTIntSig) Clone() builtinFunc { return newSig } -func (b *builtinLTIntSig) evalInt(ctx sessionctx.Context, row chunk.Row) (val int64, isNull bool, err error) { +func (b *builtinLTIntSig) evalInt(ctx EvalContext, row chunk.Row) (val int64, isNull bool, err error) { return resOfLT(CompareInt(ctx, b.args[0], b.args[1], row, row)) } @@ -1988,7 +1988,7 @@ func (b *builtinLTRealSig) Clone() builtinFunc { return newSig } -func (b *builtinLTRealSig) evalInt(ctx sessionctx.Context, row chunk.Row) (val int64, isNull bool, err error) { +func (b *builtinLTRealSig) evalInt(ctx EvalContext, row chunk.Row) (val int64, isNull bool, err error) { return resOfLT(CompareReal(ctx, b.args[0], b.args[1], row, row)) } @@ -2002,7 +2002,7 @@ func (b *builtinLTDecimalSig) Clone() builtinFunc { return newSig } -func (b *builtinLTDecimalSig) evalInt(ctx sessionctx.Context, row chunk.Row) (val int64, isNull bool, err error) { +func (b *builtinLTDecimalSig) evalInt(ctx EvalContext, row chunk.Row) (val int64, isNull bool, err error) { return resOfLT(CompareDecimal(ctx, b.args[0], b.args[1], row, row)) } @@ -2016,7 +2016,7 @@ func (b *builtinLTStringSig) Clone() builtinFunc { return newSig } -func (b *builtinLTStringSig) evalInt(ctx sessionctx.Context, row chunk.Row) (val int64, isNull bool, err error) { +func (b *builtinLTStringSig) evalInt(ctx EvalContext, row chunk.Row) (val int64, isNull bool, err error) { return resOfLT(CompareStringWithCollationInfo(ctx, b.args[0], b.args[1], row, row, b.collation)) } @@ -2030,7 +2030,7 @@ func (b *builtinLTDurationSig) Clone() builtinFunc { return newSig } -func (b *builtinLTDurationSig) evalInt(ctx sessionctx.Context, row chunk.Row) (val int64, isNull bool, err error) { +func (b *builtinLTDurationSig) evalInt(ctx EvalContext, row chunk.Row) (val int64, isNull bool, err error) { return resOfLT(CompareDuration(ctx, b.args[0], b.args[1], row, row)) } @@ -2044,7 +2044,7 @@ func (b *builtinLTTimeSig) Clone() builtinFunc { return newSig } -func (b *builtinLTTimeSig) evalInt(ctx sessionctx.Context, row chunk.Row) (val int64, isNull bool, err error) { +func (b *builtinLTTimeSig) evalInt(ctx EvalContext, row chunk.Row) (val int64, isNull bool, err error) { return resOfLT(CompareTime(ctx, b.args[0], b.args[1], row, row)) } @@ -2058,7 +2058,7 @@ func (b *builtinLTJSONSig) Clone() builtinFunc { return newSig } -func (b *builtinLTJSONSig) evalInt(ctx sessionctx.Context, row chunk.Row) (val int64, isNull bool, err error) { +func (b *builtinLTJSONSig) evalInt(ctx EvalContext, row chunk.Row) (val int64, isNull bool, err error) { return resOfLT(CompareJSON(ctx, b.args[0], b.args[1], row, row)) } @@ -2072,7 +2072,7 @@ func (b *builtinLEIntSig) Clone() builtinFunc { return newSig } -func (b *builtinLEIntSig) evalInt(ctx sessionctx.Context, row chunk.Row) (val int64, isNull bool, err error) { +func (b *builtinLEIntSig) evalInt(ctx EvalContext, row chunk.Row) (val int64, isNull bool, err error) { return resOfLE(CompareInt(ctx, b.args[0], b.args[1], row, row)) } @@ -2086,7 +2086,7 @@ func (b *builtinLERealSig) Clone() builtinFunc { return newSig } -func (b *builtinLERealSig) evalInt(ctx sessionctx.Context, row chunk.Row) (val int64, isNull bool, err error) { +func (b *builtinLERealSig) evalInt(ctx EvalContext, row chunk.Row) (val int64, isNull bool, err error) { return resOfLE(CompareReal(ctx, b.args[0], b.args[1], row, row)) } @@ -2100,7 +2100,7 @@ func (b *builtinLEDecimalSig) Clone() builtinFunc { return newSig } -func (b *builtinLEDecimalSig) evalInt(ctx sessionctx.Context, row chunk.Row) (val int64, isNull bool, err error) { +func (b *builtinLEDecimalSig) evalInt(ctx EvalContext, row chunk.Row) (val int64, isNull bool, err error) { return resOfLE(CompareDecimal(ctx, b.args[0], b.args[1], row, row)) } @@ -2114,7 +2114,7 @@ func (b *builtinLEStringSig) Clone() builtinFunc { return newSig } -func (b *builtinLEStringSig) evalInt(ctx sessionctx.Context, row chunk.Row) (val int64, isNull bool, err error) { +func (b *builtinLEStringSig) evalInt(ctx EvalContext, row chunk.Row) (val int64, isNull bool, err error) { return resOfLE(CompareStringWithCollationInfo(ctx, b.args[0], b.args[1], row, row, b.collation)) } @@ -2128,7 +2128,7 @@ func (b *builtinLEDurationSig) Clone() builtinFunc { return newSig } -func (b *builtinLEDurationSig) evalInt(ctx sessionctx.Context, row chunk.Row) (val int64, isNull bool, err error) { +func (b *builtinLEDurationSig) evalInt(ctx EvalContext, row chunk.Row) (val int64, isNull bool, err error) { return resOfLE(CompareDuration(ctx, b.args[0], b.args[1], row, row)) } @@ -2142,7 +2142,7 @@ func (b *builtinLETimeSig) Clone() builtinFunc { return newSig } -func (b *builtinLETimeSig) evalInt(ctx sessionctx.Context, row chunk.Row) (val int64, isNull bool, err error) { +func (b *builtinLETimeSig) evalInt(ctx EvalContext, row chunk.Row) (val int64, isNull bool, err error) { return resOfLE(CompareTime(ctx, b.args[0], b.args[1], row, row)) } @@ -2156,7 +2156,7 @@ func (b *builtinLEJSONSig) Clone() builtinFunc { return newSig } -func (b *builtinLEJSONSig) evalInt(ctx sessionctx.Context, row chunk.Row) (val int64, isNull bool, err error) { +func (b *builtinLEJSONSig) evalInt(ctx EvalContext, row chunk.Row) (val int64, isNull bool, err error) { return resOfLE(CompareJSON(ctx, b.args[0], b.args[1], row, row)) } @@ -2170,7 +2170,7 @@ func (b *builtinGTIntSig) Clone() builtinFunc { return newSig } -func (b *builtinGTIntSig) evalInt(ctx sessionctx.Context, row chunk.Row) (val int64, isNull bool, err error) { +func (b *builtinGTIntSig) evalInt(ctx EvalContext, row chunk.Row) (val int64, isNull bool, err error) { return resOfGT(CompareInt(ctx, b.args[0], b.args[1], row, row)) } @@ -2184,7 +2184,7 @@ func (b *builtinGTRealSig) Clone() builtinFunc { return newSig } -func (b *builtinGTRealSig) evalInt(ctx sessionctx.Context, row chunk.Row) (val int64, isNull bool, err error) { +func (b *builtinGTRealSig) evalInt(ctx EvalContext, row chunk.Row) (val int64, isNull bool, err error) { return resOfGT(CompareReal(ctx, b.args[0], b.args[1], row, row)) } @@ -2198,7 +2198,7 @@ func (b *builtinGTDecimalSig) Clone() builtinFunc { return newSig } -func (b *builtinGTDecimalSig) evalInt(ctx sessionctx.Context, row chunk.Row) (val int64, isNull bool, err error) { +func (b *builtinGTDecimalSig) evalInt(ctx EvalContext, row chunk.Row) (val int64, isNull bool, err error) { return resOfGT(CompareDecimal(ctx, b.args[0], b.args[1], row, row)) } @@ -2212,7 +2212,7 @@ func (b *builtinGTStringSig) Clone() builtinFunc { return newSig } -func (b *builtinGTStringSig) evalInt(ctx sessionctx.Context, row chunk.Row) (val int64, isNull bool, err error) { +func (b *builtinGTStringSig) evalInt(ctx EvalContext, row chunk.Row) (val int64, isNull bool, err error) { return resOfGT(CompareStringWithCollationInfo(ctx, b.args[0], b.args[1], row, row, b.collation)) } @@ -2226,7 +2226,7 @@ func (b *builtinGTDurationSig) Clone() builtinFunc { return newSig } -func (b *builtinGTDurationSig) evalInt(ctx sessionctx.Context, row chunk.Row) (val int64, isNull bool, err error) { +func (b *builtinGTDurationSig) evalInt(ctx EvalContext, row chunk.Row) (val int64, isNull bool, err error) { return resOfGT(CompareDuration(ctx, b.args[0], b.args[1], row, row)) } @@ -2240,7 +2240,7 @@ func (b *builtinGTTimeSig) Clone() builtinFunc { return newSig } -func (b *builtinGTTimeSig) evalInt(ctx sessionctx.Context, row chunk.Row) (val int64, isNull bool, err error) { +func (b *builtinGTTimeSig) evalInt(ctx EvalContext, row chunk.Row) (val int64, isNull bool, err error) { return resOfGT(CompareTime(ctx, b.args[0], b.args[1], row, row)) } @@ -2254,7 +2254,7 @@ func (b *builtinGTJSONSig) Clone() builtinFunc { return newSig } -func (b *builtinGTJSONSig) evalInt(ctx sessionctx.Context, row chunk.Row) (val int64, isNull bool, err error) { +func (b *builtinGTJSONSig) evalInt(ctx EvalContext, row chunk.Row) (val int64, isNull bool, err error) { return resOfGT(CompareJSON(ctx, b.args[0], b.args[1], row, row)) } @@ -2268,7 +2268,7 @@ func (b *builtinGEIntSig) Clone() builtinFunc { return newSig } -func (b *builtinGEIntSig) evalInt(ctx sessionctx.Context, row chunk.Row) (val int64, isNull bool, err error) { +func (b *builtinGEIntSig) evalInt(ctx EvalContext, row chunk.Row) (val int64, isNull bool, err error) { return resOfGE(CompareInt(ctx, b.args[0], b.args[1], row, row)) } @@ -2282,7 +2282,7 @@ func (b *builtinGERealSig) Clone() builtinFunc { return newSig } -func (b *builtinGERealSig) evalInt(ctx sessionctx.Context, row chunk.Row) (val int64, isNull bool, err error) { +func (b *builtinGERealSig) evalInt(ctx EvalContext, row chunk.Row) (val int64, isNull bool, err error) { return resOfGE(CompareReal(ctx, b.args[0], b.args[1], row, row)) } @@ -2296,7 +2296,7 @@ func (b *builtinGEDecimalSig) Clone() builtinFunc { return newSig } -func (b *builtinGEDecimalSig) evalInt(ctx sessionctx.Context, row chunk.Row) (val int64, isNull bool, err error) { +func (b *builtinGEDecimalSig) evalInt(ctx EvalContext, row chunk.Row) (val int64, isNull bool, err error) { return resOfGE(CompareDecimal(ctx, b.args[0], b.args[1], row, row)) } @@ -2310,7 +2310,7 @@ func (b *builtinGEStringSig) Clone() builtinFunc { return newSig } -func (b *builtinGEStringSig) evalInt(ctx sessionctx.Context, row chunk.Row) (val int64, isNull bool, err error) { +func (b *builtinGEStringSig) evalInt(ctx EvalContext, row chunk.Row) (val int64, isNull bool, err error) { return resOfGE(CompareStringWithCollationInfo(ctx, b.args[0], b.args[1], row, row, b.collation)) } @@ -2324,7 +2324,7 @@ func (b *builtinGEDurationSig) Clone() builtinFunc { return newSig } -func (b *builtinGEDurationSig) evalInt(ctx sessionctx.Context, row chunk.Row) (val int64, isNull bool, err error) { +func (b *builtinGEDurationSig) evalInt(ctx EvalContext, row chunk.Row) (val int64, isNull bool, err error) { return resOfGE(CompareDuration(ctx, b.args[0], b.args[1], row, row)) } @@ -2338,7 +2338,7 @@ func (b *builtinGETimeSig) Clone() builtinFunc { return newSig } -func (b *builtinGETimeSig) evalInt(ctx sessionctx.Context, row chunk.Row) (val int64, isNull bool, err error) { +func (b *builtinGETimeSig) evalInt(ctx EvalContext, row chunk.Row) (val int64, isNull bool, err error) { return resOfGE(CompareTime(ctx, b.args[0], b.args[1], row, row)) } @@ -2352,7 +2352,7 @@ func (b *builtinGEJSONSig) Clone() builtinFunc { return newSig } -func (b *builtinGEJSONSig) evalInt(ctx sessionctx.Context, row chunk.Row) (val int64, isNull bool, err error) { +func (b *builtinGEJSONSig) evalInt(ctx EvalContext, row chunk.Row) (val int64, isNull bool, err error) { return resOfGE(CompareJSON(ctx, b.args[0], b.args[1], row, row)) } @@ -2366,7 +2366,7 @@ func (b *builtinEQIntSig) Clone() builtinFunc { return newSig } -func (b *builtinEQIntSig) evalInt(ctx sessionctx.Context, row chunk.Row) (val int64, isNull bool, err error) { +func (b *builtinEQIntSig) evalInt(ctx EvalContext, row chunk.Row) (val int64, isNull bool, err error) { return resOfEQ(CompareInt(ctx, b.args[0], b.args[1], row, row)) } @@ -2380,7 +2380,7 @@ func (b *builtinEQRealSig) Clone() builtinFunc { return newSig } -func (b *builtinEQRealSig) evalInt(ctx sessionctx.Context, row chunk.Row) (val int64, isNull bool, err error) { +func (b *builtinEQRealSig) evalInt(ctx EvalContext, row chunk.Row) (val int64, isNull bool, err error) { return resOfEQ(CompareReal(ctx, b.args[0], b.args[1], row, row)) } @@ -2394,7 +2394,7 @@ func (b *builtinEQDecimalSig) Clone() builtinFunc { return newSig } -func (b *builtinEQDecimalSig) evalInt(ctx sessionctx.Context, row chunk.Row) (val int64, isNull bool, err error) { +func (b *builtinEQDecimalSig) evalInt(ctx EvalContext, row chunk.Row) (val int64, isNull bool, err error) { return resOfEQ(CompareDecimal(ctx, b.args[0], b.args[1], row, row)) } @@ -2408,7 +2408,7 @@ func (b *builtinEQStringSig) Clone() builtinFunc { return newSig } -func (b *builtinEQStringSig) evalInt(ctx sessionctx.Context, row chunk.Row) (val int64, isNull bool, err error) { +func (b *builtinEQStringSig) evalInt(ctx EvalContext, row chunk.Row) (val int64, isNull bool, err error) { return resOfEQ(CompareStringWithCollationInfo(ctx, b.args[0], b.args[1], row, row, b.collation)) } @@ -2422,7 +2422,7 @@ func (b *builtinEQDurationSig) Clone() builtinFunc { return newSig } -func (b *builtinEQDurationSig) evalInt(ctx sessionctx.Context, row chunk.Row) (val int64, isNull bool, err error) { +func (b *builtinEQDurationSig) evalInt(ctx EvalContext, row chunk.Row) (val int64, isNull bool, err error) { return resOfEQ(CompareDuration(ctx, b.args[0], b.args[1], row, row)) } @@ -2436,7 +2436,7 @@ func (b *builtinEQTimeSig) Clone() builtinFunc { return newSig } -func (b *builtinEQTimeSig) evalInt(ctx sessionctx.Context, row chunk.Row) (val int64, isNull bool, err error) { +func (b *builtinEQTimeSig) evalInt(ctx EvalContext, row chunk.Row) (val int64, isNull bool, err error) { return resOfEQ(CompareTime(ctx, b.args[0], b.args[1], row, row)) } @@ -2450,7 +2450,7 @@ func (b *builtinEQJSONSig) Clone() builtinFunc { return newSig } -func (b *builtinEQJSONSig) evalInt(ctx sessionctx.Context, row chunk.Row) (val int64, isNull bool, err error) { +func (b *builtinEQJSONSig) evalInt(ctx EvalContext, row chunk.Row) (val int64, isNull bool, err error) { return resOfEQ(CompareJSON(ctx, b.args[0], b.args[1], row, row)) } @@ -2464,7 +2464,7 @@ func (b *builtinNEIntSig) Clone() builtinFunc { return newSig } -func (b *builtinNEIntSig) evalInt(ctx sessionctx.Context, row chunk.Row) (val int64, isNull bool, err error) { +func (b *builtinNEIntSig) evalInt(ctx EvalContext, row chunk.Row) (val int64, isNull bool, err error) { return resOfNE(CompareInt(ctx, b.args[0], b.args[1], row, row)) } @@ -2478,7 +2478,7 @@ func (b *builtinNERealSig) Clone() builtinFunc { return newSig } -func (b *builtinNERealSig) evalInt(ctx sessionctx.Context, row chunk.Row) (val int64, isNull bool, err error) { +func (b *builtinNERealSig) evalInt(ctx EvalContext, row chunk.Row) (val int64, isNull bool, err error) { return resOfNE(CompareReal(ctx, b.args[0], b.args[1], row, row)) } @@ -2492,7 +2492,7 @@ func (b *builtinNEDecimalSig) Clone() builtinFunc { return newSig } -func (b *builtinNEDecimalSig) evalInt(ctx sessionctx.Context, row chunk.Row) (val int64, isNull bool, err error) { +func (b *builtinNEDecimalSig) evalInt(ctx EvalContext, row chunk.Row) (val int64, isNull bool, err error) { return resOfNE(CompareDecimal(ctx, b.args[0], b.args[1], row, row)) } @@ -2506,7 +2506,7 @@ func (b *builtinNEStringSig) Clone() builtinFunc { return newSig } -func (b *builtinNEStringSig) evalInt(ctx sessionctx.Context, row chunk.Row) (val int64, isNull bool, err error) { +func (b *builtinNEStringSig) evalInt(ctx EvalContext, row chunk.Row) (val int64, isNull bool, err error) { return resOfNE(CompareStringWithCollationInfo(ctx, b.args[0], b.args[1], row, row, b.collation)) } @@ -2520,7 +2520,7 @@ func (b *builtinNEDurationSig) Clone() builtinFunc { return newSig } -func (b *builtinNEDurationSig) evalInt(ctx sessionctx.Context, row chunk.Row) (val int64, isNull bool, err error) { +func (b *builtinNEDurationSig) evalInt(ctx EvalContext, row chunk.Row) (val int64, isNull bool, err error) { return resOfNE(CompareDuration(ctx, b.args[0], b.args[1], row, row)) } @@ -2534,7 +2534,7 @@ func (b *builtinNETimeSig) Clone() builtinFunc { return newSig } -func (b *builtinNETimeSig) evalInt(ctx sessionctx.Context, row chunk.Row) (val int64, isNull bool, err error) { +func (b *builtinNETimeSig) evalInt(ctx EvalContext, row chunk.Row) (val int64, isNull bool, err error) { return resOfNE(CompareTime(ctx, b.args[0], b.args[1], row, row)) } @@ -2548,7 +2548,7 @@ func (b *builtinNEJSONSig) Clone() builtinFunc { return newSig } -func (b *builtinNEJSONSig) evalInt(ctx sessionctx.Context, row chunk.Row) (val int64, isNull bool, err error) { +func (b *builtinNEJSONSig) evalInt(ctx EvalContext, row chunk.Row) (val int64, isNull bool, err error) { return resOfNE(CompareJSON(ctx, b.args[0], b.args[1], row, row)) } @@ -2562,7 +2562,7 @@ func (b *builtinNullEQIntSig) Clone() builtinFunc { return newSig } -func (b *builtinNullEQIntSig) evalInt(ctx sessionctx.Context, row chunk.Row) (val int64, isNull bool, err error) { +func (b *builtinNullEQIntSig) evalInt(ctx EvalContext, row chunk.Row) (val int64, isNull bool, err error) { arg0, isNull0, err := b.args[0].EvalInt(ctx, row) if err != nil { return 0, isNull0, err @@ -2578,22 +2578,8 @@ func (b *builtinNullEQIntSig) evalInt(ctx sessionctx.Context, row chunk.Row) (va res = 1 case isNull0 != isNull1: return res, false, nil - case isUnsigned0 && isUnsigned1 && cmp.Compare(uint64(arg0), uint64(arg1)) == 0: - res = 1 - case !isUnsigned0 && !isUnsigned1 && cmp.Compare(arg0, arg1) == 0: - res = 1 - case isUnsigned0 && !isUnsigned1: - if arg1 < 0 { - return res, false, nil - } - if cmp.Compare(arg0, arg1) == 0 { - res = 1 - } - case !isUnsigned0 && isUnsigned1: - if arg0 < 0 { - return res, false, nil - } - if cmp.Compare(arg0, arg1) == 0 { + default: + if types.CompareInt(arg0, isUnsigned0, arg1, isUnsigned1) == 0 { res = 1 } } @@ -2610,7 +2596,7 @@ func (b *builtinNullEQRealSig) Clone() builtinFunc { return newSig } -func (b *builtinNullEQRealSig) evalInt(ctx sessionctx.Context, row chunk.Row) (val int64, isNull bool, err error) { +func (b *builtinNullEQRealSig) evalInt(ctx EvalContext, row chunk.Row) (val int64, isNull bool, err error) { arg0, isNull0, err := b.args[0].EvalReal(ctx, row) if err != nil { return 0, true, err @@ -2641,7 +2627,7 @@ func (b *builtinNullEQDecimalSig) Clone() builtinFunc { return newSig } -func (b *builtinNullEQDecimalSig) evalInt(ctx sessionctx.Context, row chunk.Row) (val int64, isNull bool, err error) { +func (b *builtinNullEQDecimalSig) evalInt(ctx EvalContext, row chunk.Row) (val int64, isNull bool, err error) { arg0, isNull0, err := b.args[0].EvalDecimal(ctx, row) if err != nil { return 0, true, err @@ -2672,7 +2658,7 @@ func (b *builtinNullEQStringSig) Clone() builtinFunc { return newSig } -func (b *builtinNullEQStringSig) evalInt(ctx sessionctx.Context, row chunk.Row) (val int64, isNull bool, err error) { +func (b *builtinNullEQStringSig) evalInt(ctx EvalContext, row chunk.Row) (val int64, isNull bool, err error) { arg0, isNull0, err := b.args[0].EvalString(ctx, row) if err != nil { return 0, true, err @@ -2703,7 +2689,7 @@ func (b *builtinNullEQDurationSig) Clone() builtinFunc { return newSig } -func (b *builtinNullEQDurationSig) evalInt(ctx sessionctx.Context, row chunk.Row) (val int64, isNull bool, err error) { +func (b *builtinNullEQDurationSig) evalInt(ctx EvalContext, row chunk.Row) (val int64, isNull bool, err error) { arg0, isNull0, err := b.args[0].EvalDuration(ctx, row) if err != nil { return 0, true, err @@ -2734,7 +2720,7 @@ func (b *builtinNullEQTimeSig) Clone() builtinFunc { return newSig } -func (b *builtinNullEQTimeSig) evalInt(ctx sessionctx.Context, row chunk.Row) (val int64, isNull bool, err error) { +func (b *builtinNullEQTimeSig) evalInt(ctx EvalContext, row chunk.Row) (val int64, isNull bool, err error) { arg0, isNull0, err := b.args[0].EvalTime(ctx, row) if err != nil { return 0, true, err @@ -2765,7 +2751,7 @@ func (b *builtinNullEQJSONSig) Clone() builtinFunc { return newSig } -func (b *builtinNullEQJSONSig) evalInt(ctx sessionctx.Context, row chunk.Row) (val int64, isNull bool, err error) { +func (b *builtinNullEQJSONSig) evalInt(ctx EvalContext, row chunk.Row) (val int64, isNull bool, err error) { arg0, isNull0, err := b.args[0].EvalJSON(ctx, row) if err != nil { return 0, true, err @@ -2876,10 +2862,10 @@ func compareNull(lhsIsNull, rhsIsNull bool) int64 { } // CompareFunc defines the compare function prototype. -type CompareFunc = func(sctx sessionctx.Context, lhsArg, rhsArg Expression, lhsRow, rhsRow chunk.Row) (int64, bool, error) +type CompareFunc = func(sctx EvalContext, lhsArg, rhsArg Expression, lhsRow, rhsRow chunk.Row) (int64, bool, error) // CompareInt compares two integers. -func CompareInt(sctx sessionctx.Context, lhsArg, rhsArg Expression, lhsRow, rhsRow chunk.Row) (int64, bool, error) { +func CompareInt(sctx EvalContext, lhsArg, rhsArg Expression, lhsRow, rhsRow chunk.Row) (int64, bool, error) { arg0, isNull0, err := lhsArg.EvalInt(sctx, lhsRow) if err != nil { return 0, true, err @@ -2896,36 +2882,17 @@ func CompareInt(sctx sessionctx.Context, lhsArg, rhsArg Expression, lhsRow, rhsR } isUnsigned0, isUnsigned1 := mysql.HasUnsignedFlag(lhsArg.GetType().GetFlag()), mysql.HasUnsignedFlag(rhsArg.GetType().GetFlag()) - var res int - switch { - case isUnsigned0 && isUnsigned1: - res = cmp.Compare(uint64(arg0), uint64(arg1)) - case isUnsigned0 && !isUnsigned1: - if arg1 < 0 || uint64(arg0) > math.MaxInt64 { - res = 1 - } else { - res = cmp.Compare(arg0, arg1) - } - case !isUnsigned0 && isUnsigned1: - if arg0 < 0 || uint64(arg1) > math.MaxInt64 { - res = -1 - } else { - res = cmp.Compare(arg0, arg1) - } - case !isUnsigned0 && !isUnsigned1: - res = cmp.Compare(arg0, arg1) - } - return int64(res), false, nil + return int64(types.CompareInt(arg0, isUnsigned0, arg1, isUnsigned1)), false, nil } -func genCompareString(collation string) func(sctx sessionctx.Context, lhsArg Expression, rhsArg Expression, lhsRow chunk.Row, rhsRow chunk.Row) (int64, bool, error) { - return func(sctx sessionctx.Context, lhsArg, rhsArg Expression, lhsRow, rhsRow chunk.Row) (int64, bool, error) { +func genCompareString(collation string) func(sctx EvalContext, lhsArg Expression, rhsArg Expression, lhsRow chunk.Row, rhsRow chunk.Row) (int64, bool, error) { + return func(sctx EvalContext, lhsArg, rhsArg Expression, lhsRow, rhsRow chunk.Row) (int64, bool, error) { return CompareStringWithCollationInfo(sctx, lhsArg, rhsArg, lhsRow, rhsRow, collation) } } // CompareStringWithCollationInfo compares two strings with the specified collation information. -func CompareStringWithCollationInfo(sctx sessionctx.Context, lhsArg, rhsArg Expression, lhsRow, rhsRow chunk.Row, collation string) (int64, bool, error) { +func CompareStringWithCollationInfo(sctx EvalContext, lhsArg, rhsArg Expression, lhsRow, rhsRow chunk.Row, collation string) (int64, bool, error) { arg0, isNull0, err := lhsArg.EvalString(sctx, lhsRow) if err != nil { return 0, true, err @@ -2943,7 +2910,7 @@ func CompareStringWithCollationInfo(sctx sessionctx.Context, lhsArg, rhsArg Expr } // CompareReal compares two float-point values. -func CompareReal(sctx sessionctx.Context, lhsArg, rhsArg Expression, lhsRow, rhsRow chunk.Row) (int64, bool, error) { +func CompareReal(sctx EvalContext, lhsArg, rhsArg Expression, lhsRow, rhsRow chunk.Row) (int64, bool, error) { arg0, isNull0, err := lhsArg.EvalReal(sctx, lhsRow) if err != nil { return 0, true, err @@ -2961,7 +2928,7 @@ func CompareReal(sctx sessionctx.Context, lhsArg, rhsArg Expression, lhsRow, rhs } // CompareDecimal compares two decimals. -func CompareDecimal(sctx sessionctx.Context, lhsArg, rhsArg Expression, lhsRow, rhsRow chunk.Row) (int64, bool, error) { +func CompareDecimal(sctx EvalContext, lhsArg, rhsArg Expression, lhsRow, rhsRow chunk.Row) (int64, bool, error) { arg0, isNull0, err := lhsArg.EvalDecimal(sctx, lhsRow) if err != nil { return 0, true, err @@ -2979,7 +2946,7 @@ func CompareDecimal(sctx sessionctx.Context, lhsArg, rhsArg Expression, lhsRow, } // CompareTime compares two datetime or timestamps. -func CompareTime(sctx sessionctx.Context, lhsArg, rhsArg Expression, lhsRow, rhsRow chunk.Row) (int64, bool, error) { +func CompareTime(sctx EvalContext, lhsArg, rhsArg Expression, lhsRow, rhsRow chunk.Row) (int64, bool, error) { arg0, isNull0, err := lhsArg.EvalTime(sctx, lhsRow) if err != nil { return 0, true, err @@ -2997,7 +2964,7 @@ func CompareTime(sctx sessionctx.Context, lhsArg, rhsArg Expression, lhsRow, rhs } // CompareDuration compares two durations. -func CompareDuration(sctx sessionctx.Context, lhsArg, rhsArg Expression, lhsRow, rhsRow chunk.Row) (int64, bool, error) { +func CompareDuration(sctx EvalContext, lhsArg, rhsArg Expression, lhsRow, rhsRow chunk.Row) (int64, bool, error) { arg0, isNull0, err := lhsArg.EvalDuration(sctx, lhsRow) if err != nil { return 0, true, err @@ -3015,7 +2982,7 @@ func CompareDuration(sctx sessionctx.Context, lhsArg, rhsArg Expression, lhsRow, } // CompareJSON compares two JSONs. -func CompareJSON(sctx sessionctx.Context, lhsArg, rhsArg Expression, lhsRow, rhsRow chunk.Row) (int64, bool, error) { +func CompareJSON(sctx EvalContext, lhsArg, rhsArg Expression, lhsRow, rhsRow chunk.Row) (int64, bool, error) { arg0, isNull0, err := lhsArg.EvalJSON(sctx, lhsRow) if err != nil { return 0, true, err diff --git a/pkg/expression/builtin_compare_vec.go b/pkg/expression/builtin_compare_vec.go index 2de07e24f3776..cb4757a8635a7 100644 --- a/pkg/expression/builtin_compare_vec.go +++ b/pkg/expression/builtin_compare_vec.go @@ -18,14 +18,13 @@ import ( "strings" "github.com/pingcap/tidb/pkg/parser/mysql" - "github.com/pingcap/tidb/pkg/sessionctx" "github.com/pingcap/tidb/pkg/types" "github.com/pingcap/tidb/pkg/util/chunk" ) // vecEvalDecimal evals a builtinGreatestDecimalSig. // See http://dev.mysql.com/doc/refman/5.7/en/comparison-operators.html#function_greatest -func (b *builtinGreatestDecimalSig) vecEvalDecimal(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinGreatestDecimalSig) vecEvalDecimal(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -59,7 +58,7 @@ func (b *builtinGreatestDecimalSig) vectorized() bool { return true } -func (b *builtinLeastDecimalSig) vecEvalDecimal(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinLeastDecimalSig) vecEvalDecimal(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -94,7 +93,7 @@ func (b *builtinLeastDecimalSig) vectorized() bool { return true } -func (b *builtinLeastIntSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinLeastIntSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -129,7 +128,7 @@ func (b *builtinLeastIntSig) vectorized() bool { return true } -func (b *builtinGreatestIntSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinGreatestIntSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -168,7 +167,7 @@ func (b *builtinGEIntSig) vectorized() bool { return true } -func (b *builtinGEIntSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinGEIntSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() var err error var buf0, buf1 *chunk.Column @@ -200,7 +199,7 @@ func (b *builtinLeastRealSig) vectorized() bool { return true } -func (b *builtinLeastRealSig) vecEvalReal(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinLeastRealSig) vecEvalReal(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -235,7 +234,7 @@ func (b *builtinLeastStringSig) vectorized() bool { return true } -func (b *builtinLeastStringSig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinLeastStringSig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { if err := b.args[0].VecEvalString(ctx, input, result); err != nil { return err } @@ -288,7 +287,7 @@ func (b *builtinEQIntSig) vectorized() bool { return true } -func (b *builtinEQIntSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinEQIntSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() var err error var buf0, buf1 *chunk.Column @@ -320,7 +319,7 @@ func (b *builtinNEIntSig) vectorized() bool { return true } -func (b *builtinNEIntSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinNEIntSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() var err error var buf0, buf1 *chunk.Column @@ -352,7 +351,7 @@ func (b *builtinGTIntSig) vectorized() bool { return true } -func (b *builtinGTIntSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinGTIntSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() var err error var buf0, buf1 *chunk.Column @@ -384,7 +383,7 @@ func (b *builtinNullEQIntSig) vectorized() bool { return true } -func (b *builtinNullEQIntSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinNullEQIntSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf0, err := b.bufAllocator.get() if err != nil { @@ -423,7 +422,7 @@ func (b *builtinIntervalIntSig) vectorized() bool { return true } -func (b *builtinIntervalIntSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinIntervalIntSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { var err error if err = b.args[0].VecEvalInt(ctx, input, result); err != nil { return err @@ -453,7 +452,7 @@ func (b *builtinIntervalRealSig) vectorized() bool { return true } -func (b *builtinIntervalRealSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinIntervalRealSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -490,7 +489,7 @@ func (b *builtinLEIntSig) vectorized() bool { return true } -func (b *builtinLEIntSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinLEIntSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() var err error var buf0, buf1 *chunk.Column @@ -522,7 +521,7 @@ func (b *builtinLTIntSig) vectorized() bool { return true } -func (b *builtinLTIntSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinLTIntSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() var err error var buf0, buf1 *chunk.Column @@ -634,7 +633,7 @@ func (b *builtinGreatestCmpStringAsTimeSig) vectorized() bool { return true } -func (b *builtinGreatestCmpStringAsTimeSig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinGreatestCmpStringAsTimeSig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { sc := ctx.GetSessionVars().StmtCtx n := input.NumRows() @@ -680,7 +679,7 @@ func (b *builtinGreatestRealSig) vectorized() bool { return true } -func (b *builtinGreatestRealSig) vecEvalReal(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinGreatestRealSig) vecEvalReal(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -715,7 +714,7 @@ func (b *builtinLeastCmpStringAsTimeSig) vectorized() bool { return true } -func (b *builtinLeastCmpStringAsTimeSig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinLeastCmpStringAsTimeSig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { sc := ctx.GetSessionVars().StmtCtx n := input.NumRows() @@ -761,7 +760,7 @@ func (b *builtinGreatestStringSig) vectorized() bool { return true } -func (b *builtinGreatestStringSig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinGreatestStringSig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { if err := b.args[0].VecEvalString(ctx, input, result); err != nil { return err } @@ -813,7 +812,7 @@ func (b *builtinGreatestTimeSig) vectorized() bool { return true } -func (b *builtinGreatestTimeSig) vecEvalTime(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinGreatestTimeSig) vecEvalTime(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -854,7 +853,7 @@ func (b *builtinLeastTimeSig) vectorized() bool { return true } -func (b *builtinLeastTimeSig) vecEvalTime(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinLeastTimeSig) vecEvalTime(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -895,7 +894,7 @@ func (b *builtinGreatestDurationSig) vectorized() bool { return true } -func (b *builtinGreatestDurationSig) vecEvalDuration(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinGreatestDurationSig) vecEvalDuration(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -927,7 +926,7 @@ func (b *builtinLeastDurationSig) vectorized() bool { return true } -func (b *builtinLeastDurationSig) vecEvalDuration(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinLeastDurationSig) vecEvalDuration(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { diff --git a/pkg/expression/builtin_compare_vec_generated.go b/pkg/expression/builtin_compare_vec_generated.go index 79811d9447098..400d74c6b2e67 100644 --- a/pkg/expression/builtin_compare_vec_generated.go +++ b/pkg/expression/builtin_compare_vec_generated.go @@ -19,12 +19,11 @@ package expression import ( "cmp" - "github.com/pingcap/tidb/pkg/sessionctx" "github.com/pingcap/tidb/pkg/types" "github.com/pingcap/tidb/pkg/util/chunk" ) -func (b *builtinLTRealSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinLTRealSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf0, err := b.bufAllocator.get() if err != nil { @@ -62,7 +61,7 @@ func (b *builtinLTRealSig) vectorized() bool { return true } -func (b *builtinLTDecimalSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinLTDecimalSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf0, err := b.bufAllocator.get() if err != nil { @@ -100,7 +99,7 @@ func (b *builtinLTDecimalSig) vectorized() bool { return true } -func (b *builtinLTStringSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinLTStringSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf0, err := b.bufAllocator.get() if err != nil { @@ -136,7 +135,7 @@ func (b *builtinLTStringSig) vectorized() bool { return true } -func (b *builtinLTTimeSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinLTTimeSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf0, err := b.bufAllocator.get() if err != nil { @@ -174,7 +173,7 @@ func (b *builtinLTTimeSig) vectorized() bool { return true } -func (b *builtinLTDurationSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinLTDurationSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf0, err := b.bufAllocator.get() if err != nil { @@ -212,7 +211,7 @@ func (b *builtinLTDurationSig) vectorized() bool { return true } -func (b *builtinLTJSONSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinLTJSONSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf0, err := b.bufAllocator.get() if err != nil { @@ -248,7 +247,7 @@ func (b *builtinLTJSONSig) vectorized() bool { return true } -func (b *builtinLERealSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinLERealSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf0, err := b.bufAllocator.get() if err != nil { @@ -286,7 +285,7 @@ func (b *builtinLERealSig) vectorized() bool { return true } -func (b *builtinLEDecimalSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinLEDecimalSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf0, err := b.bufAllocator.get() if err != nil { @@ -324,7 +323,7 @@ func (b *builtinLEDecimalSig) vectorized() bool { return true } -func (b *builtinLEStringSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinLEStringSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf0, err := b.bufAllocator.get() if err != nil { @@ -360,7 +359,7 @@ func (b *builtinLEStringSig) vectorized() bool { return true } -func (b *builtinLETimeSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinLETimeSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf0, err := b.bufAllocator.get() if err != nil { @@ -398,7 +397,7 @@ func (b *builtinLETimeSig) vectorized() bool { return true } -func (b *builtinLEDurationSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinLEDurationSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf0, err := b.bufAllocator.get() if err != nil { @@ -436,7 +435,7 @@ func (b *builtinLEDurationSig) vectorized() bool { return true } -func (b *builtinLEJSONSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinLEJSONSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf0, err := b.bufAllocator.get() if err != nil { @@ -472,7 +471,7 @@ func (b *builtinLEJSONSig) vectorized() bool { return true } -func (b *builtinGTRealSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinGTRealSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf0, err := b.bufAllocator.get() if err != nil { @@ -510,7 +509,7 @@ func (b *builtinGTRealSig) vectorized() bool { return true } -func (b *builtinGTDecimalSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinGTDecimalSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf0, err := b.bufAllocator.get() if err != nil { @@ -548,7 +547,7 @@ func (b *builtinGTDecimalSig) vectorized() bool { return true } -func (b *builtinGTStringSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinGTStringSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf0, err := b.bufAllocator.get() if err != nil { @@ -584,7 +583,7 @@ func (b *builtinGTStringSig) vectorized() bool { return true } -func (b *builtinGTTimeSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinGTTimeSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf0, err := b.bufAllocator.get() if err != nil { @@ -622,7 +621,7 @@ func (b *builtinGTTimeSig) vectorized() bool { return true } -func (b *builtinGTDurationSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinGTDurationSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf0, err := b.bufAllocator.get() if err != nil { @@ -660,7 +659,7 @@ func (b *builtinGTDurationSig) vectorized() bool { return true } -func (b *builtinGTJSONSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinGTJSONSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf0, err := b.bufAllocator.get() if err != nil { @@ -696,7 +695,7 @@ func (b *builtinGTJSONSig) vectorized() bool { return true } -func (b *builtinGERealSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinGERealSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf0, err := b.bufAllocator.get() if err != nil { @@ -734,7 +733,7 @@ func (b *builtinGERealSig) vectorized() bool { return true } -func (b *builtinGEDecimalSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinGEDecimalSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf0, err := b.bufAllocator.get() if err != nil { @@ -772,7 +771,7 @@ func (b *builtinGEDecimalSig) vectorized() bool { return true } -func (b *builtinGEStringSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinGEStringSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf0, err := b.bufAllocator.get() if err != nil { @@ -808,7 +807,7 @@ func (b *builtinGEStringSig) vectorized() bool { return true } -func (b *builtinGETimeSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinGETimeSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf0, err := b.bufAllocator.get() if err != nil { @@ -846,7 +845,7 @@ func (b *builtinGETimeSig) vectorized() bool { return true } -func (b *builtinGEDurationSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinGEDurationSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf0, err := b.bufAllocator.get() if err != nil { @@ -884,7 +883,7 @@ func (b *builtinGEDurationSig) vectorized() bool { return true } -func (b *builtinGEJSONSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinGEJSONSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf0, err := b.bufAllocator.get() if err != nil { @@ -920,7 +919,7 @@ func (b *builtinGEJSONSig) vectorized() bool { return true } -func (b *builtinEQRealSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinEQRealSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf0, err := b.bufAllocator.get() if err != nil { @@ -958,7 +957,7 @@ func (b *builtinEQRealSig) vectorized() bool { return true } -func (b *builtinEQDecimalSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinEQDecimalSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf0, err := b.bufAllocator.get() if err != nil { @@ -996,7 +995,7 @@ func (b *builtinEQDecimalSig) vectorized() bool { return true } -func (b *builtinEQStringSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinEQStringSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf0, err := b.bufAllocator.get() if err != nil { @@ -1032,7 +1031,7 @@ func (b *builtinEQStringSig) vectorized() bool { return true } -func (b *builtinEQTimeSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinEQTimeSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf0, err := b.bufAllocator.get() if err != nil { @@ -1070,7 +1069,7 @@ func (b *builtinEQTimeSig) vectorized() bool { return true } -func (b *builtinEQDurationSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinEQDurationSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf0, err := b.bufAllocator.get() if err != nil { @@ -1108,7 +1107,7 @@ func (b *builtinEQDurationSig) vectorized() bool { return true } -func (b *builtinEQJSONSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinEQJSONSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf0, err := b.bufAllocator.get() if err != nil { @@ -1144,7 +1143,7 @@ func (b *builtinEQJSONSig) vectorized() bool { return true } -func (b *builtinNERealSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinNERealSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf0, err := b.bufAllocator.get() if err != nil { @@ -1182,7 +1181,7 @@ func (b *builtinNERealSig) vectorized() bool { return true } -func (b *builtinNEDecimalSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinNEDecimalSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf0, err := b.bufAllocator.get() if err != nil { @@ -1220,7 +1219,7 @@ func (b *builtinNEDecimalSig) vectorized() bool { return true } -func (b *builtinNEStringSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinNEStringSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf0, err := b.bufAllocator.get() if err != nil { @@ -1256,7 +1255,7 @@ func (b *builtinNEStringSig) vectorized() bool { return true } -func (b *builtinNETimeSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinNETimeSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf0, err := b.bufAllocator.get() if err != nil { @@ -1294,7 +1293,7 @@ func (b *builtinNETimeSig) vectorized() bool { return true } -func (b *builtinNEDurationSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinNEDurationSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf0, err := b.bufAllocator.get() if err != nil { @@ -1332,7 +1331,7 @@ func (b *builtinNEDurationSig) vectorized() bool { return true } -func (b *builtinNEJSONSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinNEJSONSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf0, err := b.bufAllocator.get() if err != nil { @@ -1368,7 +1367,7 @@ func (b *builtinNEJSONSig) vectorized() bool { return true } -func (b *builtinNullEQRealSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinNullEQRealSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf0, err := b.bufAllocator.get() if err != nil { @@ -1410,7 +1409,7 @@ func (b *builtinNullEQRealSig) vectorized() bool { return true } -func (b *builtinNullEQDecimalSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinNullEQDecimalSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf0, err := b.bufAllocator.get() if err != nil { @@ -1452,7 +1451,7 @@ func (b *builtinNullEQDecimalSig) vectorized() bool { return true } -func (b *builtinNullEQStringSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinNullEQStringSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf0, err := b.bufAllocator.get() if err != nil { @@ -1492,7 +1491,7 @@ func (b *builtinNullEQStringSig) vectorized() bool { return true } -func (b *builtinNullEQTimeSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinNullEQTimeSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf0, err := b.bufAllocator.get() if err != nil { @@ -1534,7 +1533,7 @@ func (b *builtinNullEQTimeSig) vectorized() bool { return true } -func (b *builtinNullEQDurationSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinNullEQDurationSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf0, err := b.bufAllocator.get() if err != nil { @@ -1576,7 +1575,7 @@ func (b *builtinNullEQDurationSig) vectorized() bool { return true } -func (b *builtinNullEQJSONSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinNullEQJSONSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf0, err := b.bufAllocator.get() if err != nil { @@ -1618,7 +1617,7 @@ func (b *builtinNullEQJSONSig) vectorized() bool { // NOTE: Coalesce just return the first non-null item, but vectorization do each item, which would incur additional errors. If this case happen, // the vectorization falls back to the scalar execution. -func (b *builtinCoalesceIntSig) fallbackEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinCoalesceIntSig) fallbackEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() x := result.Int64s() @@ -1638,7 +1637,7 @@ func (b *builtinCoalesceIntSig) fallbackEvalInt(ctx sessionctx.Context, input *c return nil } -func (b *builtinCoalesceIntSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinCoalesceIntSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() result.ResizeInt64(n, true) i64s := result.Int64s() @@ -1675,7 +1674,7 @@ func (b *builtinCoalesceIntSig) vectorized() bool { // NOTE: Coalesce just return the first non-null item, but vectorization do each item, which would incur additional errors. If this case happen, // the vectorization falls back to the scalar execution. -func (b *builtinCoalesceRealSig) fallbackEvalReal(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinCoalesceRealSig) fallbackEvalReal(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() x := result.Float64s() @@ -1695,7 +1694,7 @@ func (b *builtinCoalesceRealSig) fallbackEvalReal(ctx sessionctx.Context, input return nil } -func (b *builtinCoalesceRealSig) vecEvalReal(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinCoalesceRealSig) vecEvalReal(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() result.ResizeFloat64(n, true) i64s := result.Float64s() @@ -1732,7 +1731,7 @@ func (b *builtinCoalesceRealSig) vectorized() bool { // NOTE: Coalesce just return the first non-null item, but vectorization do each item, which would incur additional errors. If this case happen, // the vectorization falls back to the scalar execution. -func (b *builtinCoalesceDecimalSig) fallbackEvalDecimal(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinCoalesceDecimalSig) fallbackEvalDecimal(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() x := result.Decimals() @@ -1752,7 +1751,7 @@ func (b *builtinCoalesceDecimalSig) fallbackEvalDecimal(ctx sessionctx.Context, return nil } -func (b *builtinCoalesceDecimalSig) vecEvalDecimal(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinCoalesceDecimalSig) vecEvalDecimal(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() result.ResizeDecimal(n, true) i64s := result.Decimals() @@ -1789,7 +1788,7 @@ func (b *builtinCoalesceDecimalSig) vectorized() bool { // NOTE: Coalesce just return the first non-null item, but vectorization do each item, which would incur additional errors. If this case happen, // the vectorization falls back to the scalar execution. -func (b *builtinCoalesceStringSig) fallbackEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinCoalesceStringSig) fallbackEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() result.ReserveString(n) @@ -1807,7 +1806,7 @@ func (b *builtinCoalesceStringSig) fallbackEvalString(ctx sessionctx.Context, in return nil } -func (b *builtinCoalesceStringSig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinCoalesceStringSig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() argLen := len(b.args) @@ -1852,7 +1851,7 @@ func (b *builtinCoalesceStringSig) vectorized() bool { // NOTE: Coalesce just return the first non-null item, but vectorization do each item, which would incur additional errors. If this case happen, // the vectorization falls back to the scalar execution. -func (b *builtinCoalesceTimeSig) fallbackEvalTime(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinCoalesceTimeSig) fallbackEvalTime(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() x := result.Times() @@ -1872,7 +1871,7 @@ func (b *builtinCoalesceTimeSig) fallbackEvalTime(ctx sessionctx.Context, input return nil } -func (b *builtinCoalesceTimeSig) vecEvalTime(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinCoalesceTimeSig) vecEvalTime(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() result.ResizeTime(n, true) i64s := result.Times() @@ -1911,7 +1910,7 @@ func (b *builtinCoalesceTimeSig) vectorized() bool { // NOTE: Coalesce just return the first non-null item, but vectorization do each item, which would incur additional errors. If this case happen, // the vectorization falls back to the scalar execution. -func (b *builtinCoalesceDurationSig) fallbackEvalDuration(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinCoalesceDurationSig) fallbackEvalDuration(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() x := result.GoDurations() @@ -1931,7 +1930,7 @@ func (b *builtinCoalesceDurationSig) fallbackEvalDuration(ctx sessionctx.Context return nil } -func (b *builtinCoalesceDurationSig) vecEvalDuration(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinCoalesceDurationSig) vecEvalDuration(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() result.ResizeGoDuration(n, true) i64s := result.GoDurations() @@ -1968,7 +1967,7 @@ func (b *builtinCoalesceDurationSig) vectorized() bool { // NOTE: Coalesce just return the first non-null item, but vectorization do each item, which would incur additional errors. If this case happen, // the vectorization falls back to the scalar execution. -func (b *builtinCoalesceJSONSig) fallbackEvalJSON(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinCoalesceJSONSig) fallbackEvalJSON(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() result.ReserveJSON(n) @@ -1986,7 +1985,7 @@ func (b *builtinCoalesceJSONSig) fallbackEvalJSON(ctx sessionctx.Context, input return nil } -func (b *builtinCoalesceJSONSig) vecEvalJSON(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinCoalesceJSONSig) vecEvalJSON(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() argLen := len(b.args) diff --git a/pkg/expression/builtin_control.go b/pkg/expression/builtin_control.go index 628c100659348..abd051ff7dc94 100644 --- a/pkg/expression/builtin_control.go +++ b/pkg/expression/builtin_control.go @@ -389,7 +389,7 @@ func (b *builtinCaseWhenIntSig) Clone() builtinFunc { // evalInt evals a builtinCaseWhenIntSig. // See https://dev.mysql.com/doc/refman/5.7/en/control-flow-functions.html#operator_case -func (b *builtinCaseWhenIntSig) evalInt(ctx sessionctx.Context, row chunk.Row) (ret int64, isNull bool, err error) { +func (b *builtinCaseWhenIntSig) evalInt(ctx EvalContext, row chunk.Row) (ret int64, isNull bool, err error) { var condition int64 args, l := b.getArgs(), len(b.getArgs()) for i := 0; i < l-1; i += 2 { @@ -425,7 +425,7 @@ func (b *builtinCaseWhenRealSig) Clone() builtinFunc { // evalReal evals a builtinCaseWhenRealSig. // See https://dev.mysql.com/doc/refman/5.7/en/control-flow-functions.html#operator_case -func (b *builtinCaseWhenRealSig) evalReal(ctx sessionctx.Context, row chunk.Row) (ret float64, isNull bool, err error) { +func (b *builtinCaseWhenRealSig) evalReal(ctx EvalContext, row chunk.Row) (ret float64, isNull bool, err error) { var condition int64 args, l := b.getArgs(), len(b.getArgs()) for i := 0; i < l-1; i += 2 { @@ -461,7 +461,7 @@ func (b *builtinCaseWhenDecimalSig) Clone() builtinFunc { // evalDecimal evals a builtinCaseWhenDecimalSig. // See https://dev.mysql.com/doc/refman/5.7/en/control-flow-functions.html#operator_case -func (b *builtinCaseWhenDecimalSig) evalDecimal(ctx sessionctx.Context, row chunk.Row) (ret *types.MyDecimal, isNull bool, err error) { +func (b *builtinCaseWhenDecimalSig) evalDecimal(ctx EvalContext, row chunk.Row) (ret *types.MyDecimal, isNull bool, err error) { var condition int64 args, l := b.getArgs(), len(b.getArgs()) for i := 0; i < l-1; i += 2 { @@ -497,7 +497,7 @@ func (b *builtinCaseWhenStringSig) Clone() builtinFunc { // evalString evals a builtinCaseWhenStringSig. // See https://dev.mysql.com/doc/refman/5.7/en/control-flow-functions.html#operator_case -func (b *builtinCaseWhenStringSig) evalString(ctx sessionctx.Context, row chunk.Row) (ret string, isNull bool, err error) { +func (b *builtinCaseWhenStringSig) evalString(ctx EvalContext, row chunk.Row) (ret string, isNull bool, err error) { var condition int64 args, l := b.getArgs(), len(b.getArgs()) for i := 0; i < l-1; i += 2 { @@ -533,7 +533,7 @@ func (b *builtinCaseWhenTimeSig) Clone() builtinFunc { // evalTime evals a builtinCaseWhenTimeSig. // See https://dev.mysql.com/doc/refman/5.7/en/control-flow-functions.html#operator_case -func (b *builtinCaseWhenTimeSig) evalTime(ctx sessionctx.Context, row chunk.Row) (ret types.Time, isNull bool, err error) { +func (b *builtinCaseWhenTimeSig) evalTime(ctx EvalContext, row chunk.Row) (ret types.Time, isNull bool, err error) { var condition int64 args, l := b.getArgs(), len(b.getArgs()) for i := 0; i < l-1; i += 2 { @@ -569,7 +569,7 @@ func (b *builtinCaseWhenDurationSig) Clone() builtinFunc { // evalDuration evals a builtinCaseWhenDurationSig. // See https://dev.mysql.com/doc/refman/5.7/en/control-flow-functions.html#operator_case -func (b *builtinCaseWhenDurationSig) evalDuration(ctx sessionctx.Context, row chunk.Row) (ret types.Duration, isNull bool, err error) { +func (b *builtinCaseWhenDurationSig) evalDuration(ctx EvalContext, row chunk.Row) (ret types.Duration, isNull bool, err error) { var condition int64 args, l := b.getArgs(), len(b.getArgs()) for i := 0; i < l-1; i += 2 { @@ -605,7 +605,7 @@ func (b *builtinCaseWhenJSONSig) Clone() builtinFunc { // evalJSON evals a builtinCaseWhenJSONSig. // See https://dev.mysql.com/doc/refman/5.7/en/control-flow-functions.html#operator_case -func (b *builtinCaseWhenJSONSig) evalJSON(ctx sessionctx.Context, row chunk.Row) (ret types.BinaryJSON, isNull bool, err error) { +func (b *builtinCaseWhenJSONSig) evalJSON(ctx EvalContext, row chunk.Row) (ret types.BinaryJSON, isNull bool, err error) { var condition int64 args, l := b.getArgs(), len(b.getArgs()) for i := 0; i < l-1; i += 2 { @@ -688,7 +688,7 @@ func (b *builtinIfIntSig) Clone() builtinFunc { return newSig } -func (b *builtinIfIntSig) evalInt(ctx sessionctx.Context, row chunk.Row) (val int64, isNull bool, err error) { +func (b *builtinIfIntSig) evalInt(ctx EvalContext, row chunk.Row) (val int64, isNull bool, err error) { arg0, isNull0, err := b.args[0].EvalInt(ctx, row) if err != nil { return 0, true, err @@ -709,7 +709,7 @@ func (b *builtinIfRealSig) Clone() builtinFunc { return newSig } -func (b *builtinIfRealSig) evalReal(ctx sessionctx.Context, row chunk.Row) (val float64, isNull bool, err error) { +func (b *builtinIfRealSig) evalReal(ctx EvalContext, row chunk.Row) (val float64, isNull bool, err error) { arg0, isNull0, err := b.args[0].EvalInt(ctx, row) if err != nil { return 0, true, err @@ -730,7 +730,7 @@ func (b *builtinIfDecimalSig) Clone() builtinFunc { return newSig } -func (b *builtinIfDecimalSig) evalDecimal(ctx sessionctx.Context, row chunk.Row) (val *types.MyDecimal, isNull bool, err error) { +func (b *builtinIfDecimalSig) evalDecimal(ctx EvalContext, row chunk.Row) (val *types.MyDecimal, isNull bool, err error) { arg0, isNull0, err := b.args[0].EvalInt(ctx, row) if err != nil { return nil, true, err @@ -751,7 +751,7 @@ func (b *builtinIfStringSig) Clone() builtinFunc { return newSig } -func (b *builtinIfStringSig) evalString(ctx sessionctx.Context, row chunk.Row) (val string, isNull bool, err error) { +func (b *builtinIfStringSig) evalString(ctx EvalContext, row chunk.Row) (val string, isNull bool, err error) { arg0, isNull0, err := b.args[0].EvalInt(ctx, row) if err != nil { return "", true, err @@ -772,7 +772,7 @@ func (b *builtinIfTimeSig) Clone() builtinFunc { return newSig } -func (b *builtinIfTimeSig) evalTime(ctx sessionctx.Context, row chunk.Row) (ret types.Time, isNull bool, err error) { +func (b *builtinIfTimeSig) evalTime(ctx EvalContext, row chunk.Row) (ret types.Time, isNull bool, err error) { arg0, isNull0, err := b.args[0].EvalInt(ctx, row) if err != nil { return ret, true, err @@ -793,7 +793,7 @@ func (b *builtinIfDurationSig) Clone() builtinFunc { return newSig } -func (b *builtinIfDurationSig) evalDuration(ctx sessionctx.Context, row chunk.Row) (ret types.Duration, isNull bool, err error) { +func (b *builtinIfDurationSig) evalDuration(ctx EvalContext, row chunk.Row) (ret types.Duration, isNull bool, err error) { arg0, isNull0, err := b.args[0].EvalInt(ctx, row) if err != nil { return ret, true, err @@ -814,7 +814,7 @@ func (b *builtinIfJSONSig) Clone() builtinFunc { return newSig } -func (b *builtinIfJSONSig) evalJSON(ctx sessionctx.Context, row chunk.Row) (ret types.BinaryJSON, isNull bool, err error) { +func (b *builtinIfJSONSig) evalJSON(ctx EvalContext, row chunk.Row) (ret types.BinaryJSON, isNull bool, err error) { arg0, isNull0, err := b.args[0].EvalInt(ctx, row) if err != nil { return ret, true, err @@ -888,7 +888,7 @@ func (b *builtinIfNullIntSig) Clone() builtinFunc { return newSig } -func (b *builtinIfNullIntSig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinIfNullIntSig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { arg0, isNull, err := b.args[0].EvalInt(ctx, row) if !isNull || err != nil { return arg0, err != nil, err @@ -907,7 +907,7 @@ func (b *builtinIfNullRealSig) Clone() builtinFunc { return newSig } -func (b *builtinIfNullRealSig) evalReal(ctx sessionctx.Context, row chunk.Row) (float64, bool, error) { +func (b *builtinIfNullRealSig) evalReal(ctx EvalContext, row chunk.Row) (float64, bool, error) { arg0, isNull, err := b.args[0].EvalReal(ctx, row) if !isNull || err != nil { return arg0, err != nil, err @@ -926,7 +926,7 @@ func (b *builtinIfNullDecimalSig) Clone() builtinFunc { return newSig } -func (b *builtinIfNullDecimalSig) evalDecimal(ctx sessionctx.Context, row chunk.Row) (*types.MyDecimal, bool, error) { +func (b *builtinIfNullDecimalSig) evalDecimal(ctx EvalContext, row chunk.Row) (*types.MyDecimal, bool, error) { arg0, isNull, err := b.args[0].EvalDecimal(ctx, row) if !isNull || err != nil { return arg0, err != nil, err @@ -945,7 +945,7 @@ func (b *builtinIfNullStringSig) Clone() builtinFunc { return newSig } -func (b *builtinIfNullStringSig) evalString(ctx sessionctx.Context, row chunk.Row) (string, bool, error) { +func (b *builtinIfNullStringSig) evalString(ctx EvalContext, row chunk.Row) (string, bool, error) { arg0, isNull, err := b.args[0].EvalString(ctx, row) if !isNull || err != nil { return arg0, err != nil, err @@ -964,7 +964,7 @@ func (b *builtinIfNullTimeSig) Clone() builtinFunc { return newSig } -func (b *builtinIfNullTimeSig) evalTime(ctx sessionctx.Context, row chunk.Row) (types.Time, bool, error) { +func (b *builtinIfNullTimeSig) evalTime(ctx EvalContext, row chunk.Row) (types.Time, bool, error) { arg0, isNull, err := b.args[0].EvalTime(ctx, row) if !isNull || err != nil { return arg0, err != nil, err @@ -983,7 +983,7 @@ func (b *builtinIfNullDurationSig) Clone() builtinFunc { return newSig } -func (b *builtinIfNullDurationSig) evalDuration(ctx sessionctx.Context, row chunk.Row) (types.Duration, bool, error) { +func (b *builtinIfNullDurationSig) evalDuration(ctx EvalContext, row chunk.Row) (types.Duration, bool, error) { arg0, isNull, err := b.args[0].EvalDuration(ctx, row) if !isNull || err != nil { return arg0, err != nil, err @@ -1002,7 +1002,7 @@ func (b *builtinIfNullJSONSig) Clone() builtinFunc { return newSig } -func (b *builtinIfNullJSONSig) evalJSON(ctx sessionctx.Context, row chunk.Row) (types.BinaryJSON, bool, error) { +func (b *builtinIfNullJSONSig) evalJSON(ctx EvalContext, row chunk.Row) (types.BinaryJSON, bool, error) { arg0, isNull, err := b.args[0].EvalJSON(ctx, row) if !isNull { return arg0, err != nil, err diff --git a/pkg/expression/builtin_control_vec_generated.go b/pkg/expression/builtin_control_vec_generated.go index 783685278f7c0..25fa93e434972 100644 --- a/pkg/expression/builtin_control_vec_generated.go +++ b/pkg/expression/builtin_control_vec_generated.go @@ -19,7 +19,6 @@ package expression import ( "time" - "github.com/pingcap/tidb/pkg/sessionctx" "github.com/pingcap/tidb/pkg/types" "github.com/pingcap/tidb/pkg/util/chunk" ) @@ -28,7 +27,7 @@ import ( // branches, during which the unnecessary branches may return errors or warnings. To avoid this case, when branches // meet errors or warnings, the vectorization falls back the scalar execution. -func (b *builtinCaseWhenIntSig) fallbackEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinCaseWhenIntSig) fallbackEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() result.ResizeInt64(n, false) x := result.Int64s() @@ -48,7 +47,7 @@ func (b *builtinCaseWhenIntSig) fallbackEvalInt(ctx sessionctx.Context, input *c return nil } -func (b *builtinCaseWhenIntSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinCaseWhenIntSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() args, l := b.getArgs(), len(b.getArgs()) whens := make([]*chunk.Column, l/2) @@ -139,7 +138,7 @@ func (b *builtinCaseWhenIntSig) vectorized() bool { return true } -func (b *builtinCaseWhenRealSig) fallbackEvalReal(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinCaseWhenRealSig) fallbackEvalReal(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() result.ResizeFloat64(n, false) x := result.Float64s() @@ -159,7 +158,7 @@ func (b *builtinCaseWhenRealSig) fallbackEvalReal(ctx sessionctx.Context, input return nil } -func (b *builtinCaseWhenRealSig) vecEvalReal(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinCaseWhenRealSig) vecEvalReal(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() args, l := b.getArgs(), len(b.getArgs()) whens := make([]*chunk.Column, l/2) @@ -250,7 +249,7 @@ func (b *builtinCaseWhenRealSig) vectorized() bool { return true } -func (b *builtinCaseWhenDecimalSig) fallbackEvalDecimal(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinCaseWhenDecimalSig) fallbackEvalDecimal(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() result.ResizeDecimal(n, false) x := result.Decimals() @@ -270,7 +269,7 @@ func (b *builtinCaseWhenDecimalSig) fallbackEvalDecimal(ctx sessionctx.Context, return nil } -func (b *builtinCaseWhenDecimalSig) vecEvalDecimal(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinCaseWhenDecimalSig) vecEvalDecimal(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() args, l := b.getArgs(), len(b.getArgs()) whens := make([]*chunk.Column, l/2) @@ -361,7 +360,7 @@ func (b *builtinCaseWhenDecimalSig) vectorized() bool { return true } -func (b *builtinCaseWhenStringSig) fallbackEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinCaseWhenStringSig) fallbackEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() result.ReserveString(n) for i := 0; i < n; i++ { @@ -378,7 +377,7 @@ func (b *builtinCaseWhenStringSig) fallbackEvalString(ctx sessionctx.Context, in return nil } -func (b *builtinCaseWhenStringSig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinCaseWhenStringSig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() args, l := b.getArgs(), len(b.getArgs()) whens := make([]*chunk.Column, l/2) @@ -470,7 +469,7 @@ func (b *builtinCaseWhenStringSig) vectorized() bool { return true } -func (b *builtinCaseWhenTimeSig) fallbackEvalTime(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinCaseWhenTimeSig) fallbackEvalTime(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() result.ResizeTime(n, false) x := result.Times() @@ -490,7 +489,7 @@ func (b *builtinCaseWhenTimeSig) fallbackEvalTime(ctx sessionctx.Context, input return nil } -func (b *builtinCaseWhenTimeSig) vecEvalTime(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinCaseWhenTimeSig) vecEvalTime(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() args, l := b.getArgs(), len(b.getArgs()) whens := make([]*chunk.Column, l/2) @@ -581,7 +580,7 @@ func (b *builtinCaseWhenTimeSig) vectorized() bool { return true } -func (b *builtinCaseWhenDurationSig) fallbackEvalDuration(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinCaseWhenDurationSig) fallbackEvalDuration(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() result.ResizeGoDuration(n, false) x := result.GoDurations() @@ -601,7 +600,7 @@ func (b *builtinCaseWhenDurationSig) fallbackEvalDuration(ctx sessionctx.Context return nil } -func (b *builtinCaseWhenDurationSig) vecEvalDuration(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinCaseWhenDurationSig) vecEvalDuration(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() args, l := b.getArgs(), len(b.getArgs()) whens := make([]*chunk.Column, l/2) @@ -692,7 +691,7 @@ func (b *builtinCaseWhenDurationSig) vectorized() bool { return true } -func (b *builtinCaseWhenJSONSig) fallbackEvalJSON(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinCaseWhenJSONSig) fallbackEvalJSON(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() result.ReserveJSON(n) for i := 0; i < n; i++ { @@ -709,7 +708,7 @@ func (b *builtinCaseWhenJSONSig) fallbackEvalJSON(ctx sessionctx.Context, input return nil } -func (b *builtinCaseWhenJSONSig) vecEvalJSON(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinCaseWhenJSONSig) vecEvalJSON(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() args, l := b.getArgs(), len(b.getArgs()) whens := make([]*chunk.Column, l/2) @@ -801,7 +800,7 @@ func (b *builtinCaseWhenJSONSig) vectorized() bool { return true } -func (b *builtinIfNullIntSig) fallbackEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinIfNullIntSig) fallbackEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() result.ResizeInt64(n, false) x := result.Int64s() @@ -821,7 +820,7 @@ func (b *builtinIfNullIntSig) fallbackEvalInt(ctx sessionctx.Context, input *chu return nil } -func (b *builtinIfNullIntSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinIfNullIntSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() if err := b.args[0].VecEvalInt(ctx, input, result); err != nil { return err @@ -856,7 +855,7 @@ func (b *builtinIfNullIntSig) vectorized() bool { return true } -func (b *builtinIfNullRealSig) fallbackEvalReal(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinIfNullRealSig) fallbackEvalReal(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() result.ResizeFloat64(n, false) x := result.Float64s() @@ -876,7 +875,7 @@ func (b *builtinIfNullRealSig) fallbackEvalReal(ctx sessionctx.Context, input *c return nil } -func (b *builtinIfNullRealSig) vecEvalReal(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinIfNullRealSig) vecEvalReal(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() if err := b.args[0].VecEvalReal(ctx, input, result); err != nil { return err @@ -911,7 +910,7 @@ func (b *builtinIfNullRealSig) vectorized() bool { return true } -func (b *builtinIfNullDecimalSig) fallbackEvalDecimal(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinIfNullDecimalSig) fallbackEvalDecimal(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() result.ResizeDecimal(n, false) x := result.Decimals() @@ -931,7 +930,7 @@ func (b *builtinIfNullDecimalSig) fallbackEvalDecimal(ctx sessionctx.Context, in return nil } -func (b *builtinIfNullDecimalSig) vecEvalDecimal(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinIfNullDecimalSig) vecEvalDecimal(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() if err := b.args[0].VecEvalDecimal(ctx, input, result); err != nil { return err @@ -966,7 +965,7 @@ func (b *builtinIfNullDecimalSig) vectorized() bool { return true } -func (b *builtinIfNullStringSig) fallbackEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinIfNullStringSig) fallbackEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() result.ReserveString(n) for i := 0; i < n; i++ { @@ -983,7 +982,7 @@ func (b *builtinIfNullStringSig) fallbackEvalString(ctx sessionctx.Context, inpu return nil } -func (b *builtinIfNullStringSig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinIfNullStringSig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf0, err := b.bufAllocator.get() if err != nil { @@ -1026,7 +1025,7 @@ func (b *builtinIfNullStringSig) vectorized() bool { return true } -func (b *builtinIfNullTimeSig) fallbackEvalTime(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinIfNullTimeSig) fallbackEvalTime(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() result.ResizeTime(n, false) x := result.Times() @@ -1046,7 +1045,7 @@ func (b *builtinIfNullTimeSig) fallbackEvalTime(ctx sessionctx.Context, input *c return nil } -func (b *builtinIfNullTimeSig) vecEvalTime(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinIfNullTimeSig) vecEvalTime(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() if err := b.args[0].VecEvalTime(ctx, input, result); err != nil { return err @@ -1081,7 +1080,7 @@ func (b *builtinIfNullTimeSig) vectorized() bool { return true } -func (b *builtinIfNullDurationSig) fallbackEvalDuration(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinIfNullDurationSig) fallbackEvalDuration(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() result.ResizeGoDuration(n, false) x := result.GoDurations() @@ -1101,7 +1100,7 @@ func (b *builtinIfNullDurationSig) fallbackEvalDuration(ctx sessionctx.Context, return nil } -func (b *builtinIfNullDurationSig) vecEvalDuration(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinIfNullDurationSig) vecEvalDuration(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() if err := b.args[0].VecEvalDuration(ctx, input, result); err != nil { return err @@ -1136,7 +1135,7 @@ func (b *builtinIfNullDurationSig) vectorized() bool { return true } -func (b *builtinIfNullJSONSig) fallbackEvalJSON(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinIfNullJSONSig) fallbackEvalJSON(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() result.ReserveJSON(n) for i := 0; i < n; i++ { @@ -1153,7 +1152,7 @@ func (b *builtinIfNullJSONSig) fallbackEvalJSON(ctx sessionctx.Context, input *c return nil } -func (b *builtinIfNullJSONSig) vecEvalJSON(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinIfNullJSONSig) vecEvalJSON(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf0, err := b.bufAllocator.get() if err != nil { @@ -1196,7 +1195,7 @@ func (b *builtinIfNullJSONSig) vectorized() bool { return true } -func (b *builtinIfIntSig) fallbackEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinIfIntSig) fallbackEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() result.ResizeInt64(n, false) x := result.Int64s() @@ -1216,7 +1215,7 @@ func (b *builtinIfIntSig) fallbackEvalInt(ctx sessionctx.Context, input *chunk.C return nil } -func (b *builtinIfIntSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinIfIntSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf0, err := b.bufAllocator.get() if err != nil { @@ -1275,7 +1274,7 @@ func (b *builtinIfIntSig) vectorized() bool { return true } -func (b *builtinIfRealSig) fallbackEvalReal(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinIfRealSig) fallbackEvalReal(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() result.ResizeFloat64(n, false) x := result.Float64s() @@ -1295,7 +1294,7 @@ func (b *builtinIfRealSig) fallbackEvalReal(ctx sessionctx.Context, input *chunk return nil } -func (b *builtinIfRealSig) vecEvalReal(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinIfRealSig) vecEvalReal(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf0, err := b.bufAllocator.get() if err != nil { @@ -1354,7 +1353,7 @@ func (b *builtinIfRealSig) vectorized() bool { return true } -func (b *builtinIfDecimalSig) fallbackEvalDecimal(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinIfDecimalSig) fallbackEvalDecimal(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() result.ResizeDecimal(n, false) x := result.Decimals() @@ -1374,7 +1373,7 @@ func (b *builtinIfDecimalSig) fallbackEvalDecimal(ctx sessionctx.Context, input return nil } -func (b *builtinIfDecimalSig) vecEvalDecimal(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinIfDecimalSig) vecEvalDecimal(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf0, err := b.bufAllocator.get() if err != nil { @@ -1433,7 +1432,7 @@ func (b *builtinIfDecimalSig) vectorized() bool { return true } -func (b *builtinIfStringSig) fallbackEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinIfStringSig) fallbackEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() result.ReserveString(n) for i := 0; i < n; i++ { @@ -1450,7 +1449,7 @@ func (b *builtinIfStringSig) fallbackEvalString(ctx sessionctx.Context, input *c return nil } -func (b *builtinIfStringSig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinIfStringSig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf0, err := b.bufAllocator.get() if err != nil { @@ -1517,7 +1516,7 @@ func (b *builtinIfStringSig) vectorized() bool { return true } -func (b *builtinIfTimeSig) fallbackEvalTime(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinIfTimeSig) fallbackEvalTime(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() result.ResizeTime(n, false) x := result.Times() @@ -1537,7 +1536,7 @@ func (b *builtinIfTimeSig) fallbackEvalTime(ctx sessionctx.Context, input *chunk return nil } -func (b *builtinIfTimeSig) vecEvalTime(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinIfTimeSig) vecEvalTime(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf0, err := b.bufAllocator.get() if err != nil { @@ -1596,7 +1595,7 @@ func (b *builtinIfTimeSig) vectorized() bool { return true } -func (b *builtinIfDurationSig) fallbackEvalDuration(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinIfDurationSig) fallbackEvalDuration(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() result.ResizeGoDuration(n, false) x := result.GoDurations() @@ -1616,7 +1615,7 @@ func (b *builtinIfDurationSig) fallbackEvalDuration(ctx sessionctx.Context, inpu return nil } -func (b *builtinIfDurationSig) vecEvalDuration(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinIfDurationSig) vecEvalDuration(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf0, err := b.bufAllocator.get() if err != nil { @@ -1675,7 +1674,7 @@ func (b *builtinIfDurationSig) vectorized() bool { return true } -func (b *builtinIfJSONSig) fallbackEvalJSON(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinIfJSONSig) fallbackEvalJSON(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() result.ReserveJSON(n) for i := 0; i < n; i++ { @@ -1692,7 +1691,7 @@ func (b *builtinIfJSONSig) fallbackEvalJSON(ctx sessionctx.Context, input *chunk return nil } -func (b *builtinIfJSONSig) vecEvalJSON(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinIfJSONSig) vecEvalJSON(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf0, err := b.bufAllocator.get() if err != nil { diff --git a/pkg/expression/builtin_convert_charset.go b/pkg/expression/builtin_convert_charset.go index c515c19d20807..806ab3be5f9ee 100644 --- a/pkg/expression/builtin_convert_charset.go +++ b/pkg/expression/builtin_convert_charset.go @@ -90,7 +90,7 @@ func (b *builtinInternalToBinarySig) Clone() builtinFunc { return newSig } -func (b *builtinInternalToBinarySig) evalString(ctx sessionctx.Context, row chunk.Row) (res string, isNull bool, err error) { +func (b *builtinInternalToBinarySig) evalString(ctx EvalContext, row chunk.Row) (res string, isNull bool, err error) { val, isNull, err := b.args[0].EvalString(ctx, row) if isNull || err != nil { return res, isNull, err @@ -105,7 +105,7 @@ func (b *builtinInternalToBinarySig) vectorized() bool { return true } -func (b *builtinInternalToBinarySig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinInternalToBinarySig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -169,7 +169,7 @@ func (b *builtinInternalFromBinarySig) Clone() builtinFunc { return newSig } -func (b *builtinInternalFromBinarySig) evalString(ctx sessionctx.Context, row chunk.Row) (res string, isNull bool, err error) { +func (b *builtinInternalFromBinarySig) evalString(ctx EvalContext, row chunk.Row) (res string, isNull bool, err error) { val, isNull, err := b.args[0].EvalString(ctx, row) if isNull || err != nil { return val, isNull, err @@ -188,7 +188,7 @@ func (b *builtinInternalFromBinarySig) vectorized() bool { return true } -func (b *builtinInternalFromBinarySig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinInternalFromBinarySig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -228,9 +228,8 @@ func BuildToBinaryFunction(ctx sessionctx.Context, expr Expression) (res Express FuncName: model.NewCIStr(InternalFuncToBinary), RetType: f.getRetTp(), Function: f, - ctx: ctx, } - return FoldConstant(res) + return FoldConstant(ctx, res) } // BuildFromBinaryFunction builds from_binary function. @@ -244,9 +243,8 @@ func BuildFromBinaryFunction(ctx sessionctx.Context, expr Expression, tp *types. FuncName: model.NewCIStr(InternalFuncFromBinary), RetType: tp, Function: f, - ctx: ctx, } - return FoldConstant(res) + return FoldConstant(ctx, res) } type funcProp int8 @@ -324,7 +322,8 @@ func HandleBinaryLiteral(ctx sessionctx.Context, expr Expression, ec *ExprCollat return expr } return BuildToBinaryFunction(ctx, expr) - } else if argChs == charset.CharsetBin && dstChs != charset.CharsetBin { + } else if argChs == charset.CharsetBin && dstChs != charset.CharsetBin && + expr.GetType().GetType() != mysql.TypeNull { ft := expr.GetType().Clone() ft.SetCharset(ec.Charset) ft.SetCollate(ec.Collation) diff --git a/pkg/expression/builtin_encryption.go b/pkg/expression/builtin_encryption.go index ab3e30fb0e6ab..6cf884602ddf0 100644 --- a/pkg/expression/builtin_encryption.go +++ b/pkg/expression/builtin_encryption.go @@ -154,7 +154,7 @@ func (b *builtinAesDecryptSig) Clone() builtinFunc { // evalString evals AES_DECRYPT(crypt_str, key_key). // See https://dev.mysql.com/doc/refman/5.7/en/encryption-functions.html#function_aes-decrypt -func (b *builtinAesDecryptSig) evalString(ctx sessionctx.Context, row chunk.Row) (string, bool, error) { +func (b *builtinAesDecryptSig) evalString(ctx EvalContext, row chunk.Row) (string, bool, error) { // According to doc: If either function argument is NULL, the function returns NULL. cryptStr, isNull, err := b.args[0].EvalString(ctx, row) if isNull || err != nil { @@ -166,7 +166,7 @@ func (b *builtinAesDecryptSig) evalString(ctx sessionctx.Context, row chunk.Row) } if !b.ivRequired && len(b.args) == 3 { // For modes that do not require init_vector, it is ignored and a warning is generated if it is specified. - ctx.GetSessionVars().StmtCtx.AppendWarning(errWarnOptionIgnored.GenWithStackByArgs("IV")) + ctx.GetSessionVars().StmtCtx.AppendWarning(errWarnOptionIgnored.FastGenByArgs("IV")) } key := encrypt.DeriveKeyMySQL([]byte(keyStr), b.keySize) @@ -197,7 +197,7 @@ func (b *builtinAesDecryptIVSig) Clone() builtinFunc { // evalString evals AES_DECRYPT(crypt_str, key_key, iv). // See https://dev.mysql.com/doc/refman/5.7/en/encryption-functions.html#function_aes-decrypt -func (b *builtinAesDecryptIVSig) evalString(ctx sessionctx.Context, row chunk.Row) (string, bool, error) { +func (b *builtinAesDecryptIVSig) evalString(ctx EvalContext, row chunk.Row) (string, bool, error) { // According to doc: If either function argument is NULL, the function returns NULL. cryptStr, isNull, err := b.args[0].EvalString(ctx, row) if isNull || err != nil { @@ -288,7 +288,7 @@ func (b *builtinAesEncryptSig) Clone() builtinFunc { // evalString evals AES_ENCRYPT(str, key_str). // See https://dev.mysql.com/doc/refman/5.7/en/encryption-functions.html#function_aes-decrypt -func (b *builtinAesEncryptSig) evalString(ctx sessionctx.Context, row chunk.Row) (string, bool, error) { +func (b *builtinAesEncryptSig) evalString(ctx EvalContext, row chunk.Row) (string, bool, error) { // According to doc: If either function argument is NULL, the function returns NULL. str, isNull, err := b.args[0].EvalString(ctx, row) if isNull || err != nil { @@ -300,7 +300,7 @@ func (b *builtinAesEncryptSig) evalString(ctx sessionctx.Context, row chunk.Row) } if !b.ivRequired && len(b.args) == 3 { // For modes that do not require init_vector, it is ignored and a warning is generated if it is specified. - ctx.GetSessionVars().StmtCtx.AppendWarning(errWarnOptionIgnored.GenWithStackByArgs("IV")) + ctx.GetSessionVars().StmtCtx.AppendWarning(errWarnOptionIgnored.FastGenByArgs("IV")) } key := encrypt.DeriveKeyMySQL([]byte(keyStr), b.keySize) @@ -331,7 +331,7 @@ func (b *builtinAesEncryptIVSig) Clone() builtinFunc { // evalString evals AES_ENCRYPT(str, key_str, iv). // See https://dev.mysql.com/doc/refman/5.7/en/encryption-functions.html#function_aes-decrypt -func (b *builtinAesEncryptIVSig) evalString(ctx sessionctx.Context, row chunk.Row) (string, bool, error) { +func (b *builtinAesEncryptIVSig) evalString(ctx EvalContext, row chunk.Row) (string, bool, error) { // According to doc: If either function argument is NULL, the function returns NULL. str, isNull, err := b.args[0].EvalString(ctx, row) if isNull || err != nil { @@ -403,7 +403,7 @@ func (b *builtinDecodeSig) Clone() builtinFunc { // evalString evals DECODE(str, password_str). // See https://dev.mysql.com/doc/refman/5.7/en/encryption-functions.html#function_decode -func (b *builtinDecodeSig) evalString(ctx sessionctx.Context, row chunk.Row) (string, bool, error) { +func (b *builtinDecodeSig) evalString(ctx EvalContext, row chunk.Row) (string, bool, error) { dataStr, isNull, err := b.args[0].EvalString(ctx, row) if isNull || err != nil { return "", true, err @@ -466,7 +466,7 @@ func (b *builtinEncodeSig) Clone() builtinFunc { // evalString evals ENCODE(crypt_str, password_str). // See https://dev.mysql.com/doc/refman/5.7/en/encryption-functions.html#function_encode -func (b *builtinEncodeSig) evalString(ctx sessionctx.Context, row chunk.Row) (string, bool, error) { +func (b *builtinEncodeSig) evalString(ctx EvalContext, row chunk.Row) (string, bool, error) { decodeStr, isNull, err := b.args[0].EvalString(ctx, row) if isNull || err != nil { return "", true, err @@ -527,7 +527,7 @@ func (b *builtinPasswordSig) Clone() builtinFunc { // evalString evals a builtinPasswordSig. // See https://dev.mysql.com/doc/refman/5.7/en/encryption-functions.html#function_password -func (b *builtinPasswordSig) evalString(ctx sessionctx.Context, row chunk.Row) (val string, isNull bool, err error) { +func (b *builtinPasswordSig) evalString(ctx EvalContext, row chunk.Row) (val string, isNull bool, err error) { pass, isNull, err := b.args[0].EvalString(ctx, row) if isNull || err != nil { return "", isNull, err @@ -539,7 +539,7 @@ func (b *builtinPasswordSig) evalString(ctx sessionctx.Context, row chunk.Row) ( // We should append a warning here because function "PASSWORD" is deprecated since MySQL 5.7.6. // See https://dev.mysql.com/doc/refman/5.7/en/encryption-functions.html#function_password - ctx.GetSessionVars().StmtCtx.AppendWarning(errDeprecatedSyntaxNoReplacement.GenWithStackByArgs("PASSWORD")) + ctx.GetSessionVars().StmtCtx.AppendWarning(errDeprecatedSyntaxNoReplacement.FastGenByArgs("PASSWORD")) return auth.EncodePassword(pass), false, nil } @@ -574,7 +574,7 @@ func (b *builtinRandomBytesSig) Clone() builtinFunc { // evalString evals RANDOM_BYTES(len). // See https://dev.mysql.com/doc/refman/5.7/en/encryption-functions.html#function_random-bytes -func (b *builtinRandomBytesSig) evalString(ctx sessionctx.Context, row chunk.Row) (string, bool, error) { +func (b *builtinRandomBytesSig) evalString(ctx EvalContext, row chunk.Row) (string, bool, error) { val, isNull, err := b.args[0].EvalInt(ctx, row) if isNull || err != nil { return "", true, err @@ -625,7 +625,7 @@ func (b *builtinMD5Sig) Clone() builtinFunc { // evalString evals a builtinMD5Sig. // See https://dev.mysql.com/doc/refman/5.7/en/encryption-functions.html#function_md5 -func (b *builtinMD5Sig) evalString(ctx sessionctx.Context, row chunk.Row) (string, bool, error) { +func (b *builtinMD5Sig) evalString(ctx EvalContext, row chunk.Row) (string, bool, error) { arg, isNull, err := b.args[0].EvalString(ctx, row) if isNull || err != nil { return "", isNull, err @@ -669,7 +669,7 @@ func (b *builtinSHA1Sig) Clone() builtinFunc { // evalString evals SHA1(str). // See https://dev.mysql.com/doc/refman/5.7/en/encryption-functions.html#function_sha1 // The value is returned as a string of 40 hexadecimal digits, or NULL if the argument was NULL. -func (b *builtinSHA1Sig) evalString(ctx sessionctx.Context, row chunk.Row) (string, bool, error) { +func (b *builtinSHA1Sig) evalString(ctx EvalContext, row chunk.Row) (string, bool, error) { str, isNull, err := b.args[0].EvalString(ctx, row) if isNull || err != nil { return "", isNull, err @@ -745,7 +745,7 @@ func (b *builtinSM3Sig) Clone() builtinFunc { // evalString evals Sm3Hash(str). // The value is returned as a string of 70 hexadecimal digits, or NULL if the argument was NULL. -func (b *builtinSM3Sig) evalString(ctx sessionctx.Context, row chunk.Row) (string, bool, error) { +func (b *builtinSM3Sig) evalString(ctx EvalContext, row chunk.Row) (string, bool, error) { str, isNull, err := b.args[0].EvalString(ctx, row) if isNull || err != nil { return "", isNull, err @@ -769,7 +769,7 @@ const ( // evalString evals SHA2(str, hash_length). // See https://dev.mysql.com/doc/refman/5.7/en/encryption-functions.html#function_sha2 -func (b *builtinSHA2Sig) evalString(ctx sessionctx.Context, row chunk.Row) (string, bool, error) { +func (b *builtinSHA2Sig) evalString(ctx EvalContext, row chunk.Row) (string, bool, error) { str, isNull, err := b.args[0].EvalString(ctx, row) if isNull || err != nil { return "", isNull, err @@ -866,7 +866,7 @@ func (b *builtinCompressSig) Clone() builtinFunc { // evalString evals COMPRESS(str). // See https://dev.mysql.com/doc/refman/5.7/en/encryption-functions.html#function_compress -func (b *builtinCompressSig) evalString(ctx sessionctx.Context, row chunk.Row) (string, bool, error) { +func (b *builtinCompressSig) evalString(ctx EvalContext, row chunk.Row) (string, bool, error) { str, isNull, err := b.args[0].EvalString(ctx, row) if isNull || err != nil { return "", true, err @@ -932,7 +932,7 @@ func (b *builtinUncompressSig) Clone() builtinFunc { // evalString evals UNCOMPRESS(compressed_string). // See https://dev.mysql.com/doc/refman/5.7/en/encryption-functions.html#function_uncompress -func (b *builtinUncompressSig) evalString(ctx sessionctx.Context, row chunk.Row) (string, bool, error) { +func (b *builtinUncompressSig) evalString(ctx EvalContext, row chunk.Row) (string, bool, error) { sc := ctx.GetSessionVars().StmtCtx payload, isNull, err := b.args[0].EvalString(ctx, row) if isNull || err != nil { @@ -989,7 +989,7 @@ func (b *builtinUncompressedLengthSig) Clone() builtinFunc { // evalInt evals UNCOMPRESSED_LENGTH(str). // See https://dev.mysql.com/doc/refman/5.7/en/encryption-functions.html#function_uncompressed-length -func (b *builtinUncompressedLengthSig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinUncompressedLengthSig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { sc := ctx.GetSessionVars().StmtCtx payload, isNull, err := b.args[0].EvalString(ctx, row) if isNull || err != nil { @@ -1035,7 +1035,7 @@ func (b *builtinValidatePasswordStrengthSig) Clone() builtinFunc { // evalInt evals VALIDATE_PASSWORD_STRENGTH(str). // See https://dev.mysql.com/doc/refman/8.0/en/encryption-functions.html#function_validate-password-strength -func (b *builtinValidatePasswordStrengthSig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinValidatePasswordStrengthSig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { globalVars := ctx.GetSessionVars().GlobalVarsAccessor str, isNull, err := b.args[0].EvalString(ctx, row) if err != nil || isNull { @@ -1051,7 +1051,7 @@ func (b *builtinValidatePasswordStrengthSig) evalInt(ctx sessionctx.Context, row return b.validateStr(ctx, str, &globalVars) } -func (b *builtinValidatePasswordStrengthSig) validateStr(ctx sessionctx.Context, str string, globalVars *variable.GlobalVarAccessor) (int64, bool, error) { +func (b *builtinValidatePasswordStrengthSig) validateStr(ctx EvalContext, str string, globalVars *variable.GlobalVarAccessor) (int64, bool, error) { if warn, err := pwdValidator.ValidateUserNameInPassword(str, ctx.GetSessionVars()); err != nil { return 0, true, err } else if len(warn) > 0 { diff --git a/pkg/expression/builtin_encryption_vec.go b/pkg/expression/builtin_encryption_vec.go index 11e25782dfffa..daa9bd61589f9 100644 --- a/pkg/expression/builtin_encryption_vec.go +++ b/pkg/expression/builtin_encryption_vec.go @@ -29,7 +29,6 @@ import ( "github.com/pingcap/errors" "github.com/pingcap/tidb/pkg/parser/auth" - "github.com/pingcap/tidb/pkg/sessionctx" "github.com/pingcap/tidb/pkg/sessionctx/variable" "github.com/pingcap/tidb/pkg/types" "github.com/pingcap/tidb/pkg/util/chunk" @@ -42,7 +41,7 @@ func (b *builtinAesDecryptSig) vectorized() bool { return true } -func (b *builtinAesDecryptSig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinAesDecryptSig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() if n == 0 { // If chunk has 0 rows, just return an empty value. So we can simplify codes below it by ignoring 0 row case. @@ -73,7 +72,7 @@ func (b *builtinAesDecryptSig) vecEvalString(ctx sessionctx.Context, input *chun } isWarning := !b.ivRequired && len(b.args) == 3 - isConstKey := b.args[1].ConstItem(ctx.GetSessionVars().StmtCtx) + isConstKey := b.args[1].ConstLevel() >= ConstOnlyInContext var key []byte if isConstKey { @@ -90,7 +89,7 @@ func (b *builtinAesDecryptSig) vecEvalString(ctx sessionctx.Context, input *chun } if isWarning { // For modes that do not require init_vector, it is ignored and a warning is generated if it is specified. - stmtCtx.AppendWarning(errWarnOptionIgnored.GenWithStackByArgs("IV")) + stmtCtx.AppendWarning(errWarnOptionIgnored.FastGenByArgs("IV")) } if !isConstKey { key = encrypt.DeriveKeyMySQL(keyBuf.GetBytes(i), b.keySize) @@ -116,7 +115,7 @@ func (b *builtinAesEncryptIVSig) vectorized() bool { // evalString evals AES_ENCRYPT(str, key_str, iv). // See https://dev.mysql.com/doc/refman/5.7/en/encryption-functions.html#function_aes-decrypt -func (b *builtinAesEncryptIVSig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinAesEncryptIVSig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() strBuf, err := b.bufAllocator.get() if err != nil { @@ -159,7 +158,7 @@ func (b *builtinAesEncryptIVSig) vecEvalString(ctx sessionctx.Context, input *ch return errors.Errorf("unsupported block encryption mode - %v", b.modeName) } - isConst := b.args[1].ConstItem(ctx.GetSessionVars().StmtCtx) + isConst := b.args[1].ConstLevel() >= ConstOnlyInContext var key []byte if isConst { key = encrypt.DeriveKeyMySQL(keyBuf.GetBytes(0), b.keySize) @@ -209,7 +208,7 @@ func (b *builtinDecodeSig) vectorized() bool { return true } -func (b *builtinDecodeSig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinDecodeSig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -248,7 +247,7 @@ func (b *builtinEncodeSig) vectorized() bool { return true } -func (b *builtinEncodeSig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinEncodeSig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -289,7 +288,7 @@ func (b *builtinAesDecryptIVSig) vectorized() bool { // evalString evals AES_DECRYPT(crypt_str, key_key, iv). // See https://dev.mysql.com/doc/refman/5.7/en/encryption-functions.html#function_aes-decrypt -func (b *builtinAesDecryptIVSig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinAesDecryptIVSig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() strBuf, err := b.bufAllocator.get() if err != nil { @@ -332,7 +331,7 @@ func (b *builtinAesDecryptIVSig) vecEvalString(ctx sessionctx.Context, input *ch return errors.Errorf("unsupported block encryption mode - %v", b.modeName) } - isConst := b.args[1].ConstItem(ctx.GetSessionVars().StmtCtx) + isConst := b.args[1].ConstLevel() >= ConstOnlyInContext var key []byte if isConst { key = encrypt.DeriveKeyMySQL(keyBuf.GetBytes(0), b.keySize) @@ -382,7 +381,7 @@ func (b *builtinRandomBytesSig) vectorized() bool { return true } -func (b *builtinRandomBytesSig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinRandomBytesSig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -419,7 +418,7 @@ func (b *builtinMD5Sig) vectorized() bool { return true } -func (b *builtinMD5Sig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinMD5Sig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -454,7 +453,7 @@ func (b *builtinSHA2Sig) vectorized() bool { // vecEvalString evals SHA2(str, hash_length). // See https://dev.mysql.com/doc/refman/5.7/en/encryption-functions.html#function_sha2 -func (b *builtinSHA2Sig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinSHA2Sig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -530,7 +529,7 @@ func (b *builtinSM3Sig) vectorized() bool { } // vecEvalString evals Sm3Hash(str). -func (b *builtinSM3Sig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinSM3Sig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -584,7 +583,7 @@ func deallocateByteSlice(b []byte) { // evalString evals COMPRESS(str). // See https://dev.mysql.com/doc/refman/5.7/en/encryption-functions.html#function_compress -func (b *builtinCompressSig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinCompressSig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -647,7 +646,7 @@ func (b *builtinAesEncryptSig) vectorized() bool { // evalString evals AES_ENCRYPT(str, key_str). // See https://dev.mysql.com/doc/refman/5.7/en/encryption-functions.html#function_aes-decrypt -func (b *builtinAesEncryptSig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinAesEncryptSig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() strBuf, err := b.bufAllocator.get() if err != nil { @@ -673,7 +672,7 @@ func (b *builtinAesEncryptSig) vecEvalString(ctx sessionctx.Context, input *chun } isWarning := !b.ivRequired && len(b.args) == 3 - isConst := b.args[1].ConstItem(ctx.GetSessionVars().StmtCtx) + isConst := b.args[1].ConstLevel() >= ConstOnlyInContext var key []byte if isConst { key = encrypt.DeriveKeyMySQL(keyBuf.GetBytes(0), b.keySize) @@ -688,7 +687,7 @@ func (b *builtinAesEncryptSig) vecEvalString(ctx sessionctx.Context, input *chun continue } if isWarning { - sc.AppendWarning(errWarnOptionIgnored.GenWithStackByArgs("IV")) + sc.AppendWarning(errWarnOptionIgnored.FastGenByArgs("IV")) } if !isConst { key = encrypt.DeriveKeyMySQL(keyBuf.GetBytes(i), b.keySize) @@ -712,7 +711,7 @@ func (b *builtinPasswordSig) vectorized() bool { return true } -func (b *builtinPasswordSig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinPasswordSig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -737,7 +736,7 @@ func (b *builtinPasswordSig) vecEvalString(ctx sessionctx.Context, input *chunk. // We should append a warning here because function "PASSWORD" is deprecated since MySQL 5.7.6. // See https://dev.mysql.com/doc/refman/5.7/en/encryption-functions.html#function_password - ctx.GetSessionVars().StmtCtx.AppendWarning(errDeprecatedSyntaxNoReplacement.GenWithStackByArgs("PASSWORD")) + ctx.GetSessionVars().StmtCtx.AppendWarning(errDeprecatedSyntaxNoReplacement.FastGenByArgs("PASSWORD")) result.AppendString(auth.EncodePasswordBytes(passBytes)) } @@ -748,7 +747,7 @@ func (b *builtinSHA1Sig) vectorized() bool { return true } -func (b *builtinSHA1Sig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinSHA1Sig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -782,7 +781,7 @@ func (b *builtinUncompressSig) vectorized() bool { // evalString evals UNCOMPRESS(compressed_string). // See https://dev.mysql.com/doc/refman/5.7/en/encryption-functions.html#function_uncompress -func (b *builtinUncompressSig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinUncompressSig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -836,7 +835,7 @@ func (b *builtinUncompressedLengthSig) vectorized() bool { return true } -func (b *builtinUncompressedLengthSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinUncompressedLengthSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { sc := ctx.GetSessionVars().StmtCtx nr := input.NumRows() payloadBuf, err := b.bufAllocator.get() @@ -874,7 +873,7 @@ func (b *builtinValidatePasswordStrengthSig) vectorized() bool { return true } -func (b *builtinValidatePasswordStrengthSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinValidatePasswordStrengthSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { diff --git a/pkg/expression/builtin_func_param.go b/pkg/expression/builtin_func_param.go index 9e99cc0cf34f7..f8e5c77cc3cd9 100644 --- a/pkg/expression/builtin_func_param.go +++ b/pkg/expression/builtin_func_param.go @@ -15,7 +15,6 @@ package expression import ( - "github.com/pingcap/tidb/pkg/sessionctx" "github.com/pingcap/tidb/pkg/util/chunk" ) @@ -70,7 +69,7 @@ func (re *funcParam) getIntVal(id int) int64 { } // bool return value: return true when we get a const null parameter -func buildStringParam(ctx sessionctx.Context, bf *baseBuiltinFunc, idx int, input *chunk.Chunk, notProvided bool) (*funcParam, bool, error) { +func buildStringParam(ctx EvalContext, bf *baseBuiltinFunc, idx int, input *chunk.Chunk, notProvided bool) (*funcParam, bool, error) { var pa funcParam var err error @@ -79,8 +78,9 @@ func buildStringParam(ctx sessionctx.Context, bf *baseBuiltinFunc, idx int, inpu return &pa, false, nil } - // Check if this is a const value - if bf.args[idx].ConstItem(ctx.GetSessionVars().StmtCtx) { + // Check if this is a const value. + // funcParam will not be shared between evaluations, so we just need it to be const in one ctx. + if bf.args[idx].ConstLevel() >= ConstOnlyInContext { // Initialize the const var isConstNull bool pa.defaultStrVal, isConstNull, err = bf.args[idx].EvalString(ctx, chunk.Row{}) @@ -102,7 +102,7 @@ func buildStringParam(ctx sessionctx.Context, bf *baseBuiltinFunc, idx int, inpu } // bool return value: return true when we get a const null parameter -func buildIntParam(ctx sessionctx.Context, bf *baseBuiltinFunc, idx int, input *chunk.Chunk, notProvided bool, defaultIntVal int64) (*funcParam, bool, error) { +func buildIntParam(ctx EvalContext, bf *baseBuiltinFunc, idx int, input *chunk.Chunk, notProvided bool, defaultIntVal int64) (*funcParam, bool, error) { var pa funcParam var err error @@ -112,7 +112,8 @@ func buildIntParam(ctx sessionctx.Context, bf *baseBuiltinFunc, idx int, input * } // Check if this is a const value - if bf.args[idx].ConstItem(ctx.GetSessionVars().StmtCtx) { + // funcParam will not be shared between evaluations, so we just need it to be const in one ctx. + if bf.args[idx].ConstLevel() >= ConstOnlyInContext { // Initialize the const var isConstNull bool pa.defaultIntVal, isConstNull, err = bf.args[idx].EvalInt(ctx, chunk.Row{}) diff --git a/pkg/expression/builtin_grouping.go b/pkg/expression/builtin_grouping.go index 5cd646d58c165..0fb7281338d78 100644 --- a/pkg/expression/builtin_grouping.go +++ b/pkg/expression/builtin_grouping.go @@ -227,7 +227,7 @@ func (b *BuiltinGroupingImplSig) grouping(groupingID uint64) int64 { } // evalInt evals a builtinGroupingSig. -func (b *BuiltinGroupingImplSig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *BuiltinGroupingImplSig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { if !b.isMetaInited { return 0, false, errors.Errorf("Meta data is not initialized") } @@ -259,7 +259,7 @@ func (b *BuiltinGroupingImplSig) groupingVec(groupingIds *chunk.Column, rowNum i } } -func (b *BuiltinGroupingImplSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *BuiltinGroupingImplSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { if !b.isMetaInited { return errors.Errorf("Meta data is not initialized") } diff --git a/pkg/expression/builtin_grouping_test.go b/pkg/expression/builtin_grouping_test.go index 63620f9b993b6..83b7001ce90a1 100644 --- a/pkg/expression/builtin_grouping_test.go +++ b/pkg/expression/builtin_grouping_test.go @@ -18,7 +18,6 @@ import ( "fmt" "testing" - "github.com/pingcap/tidb/pkg/sessionctx" "github.com/pingcap/tidb/pkg/testkit/testutil" "github.com/pingcap/tidb/pkg/types" "github.com/pingcap/tidb/pkg/util/chunk" @@ -39,12 +38,12 @@ func constructFieldType() types.FieldType { return tp } -func createGroupingFunc(ctx sessionctx.Context, args []Expression) (*BuiltinGroupingImplSig, error) { +func createGroupingFunc(args []Expression) (*BuiltinGroupingImplSig, error) { // TODO We should use the commented codes after the completion of rollup // argTp := []types.EvalType{types.ETInt} tp := constructFieldType() // bf, err := newBaseBuiltinFuncWithTp(ctx, groupingImplName, args, types.ETInt, argTp...) - bf, err := newBaseBuiltinFuncWithFieldType(ctx, &tp, args) + bf, err := newBaseBuiltinFuncWithFieldType(&tp, args) if err != nil { return nil, err } @@ -92,7 +91,7 @@ func TestGrouping(t *testing.T) { comment := fmt.Sprintf(`for grouping = "%d", version = "%d", groupingIDs = "%v", expectRes = "%d"`, testCase.groupingID, testCase.mode, testCase.groupingIDs, testCase.expectResult) args := datumsToConstants(types.MakeDatums(testCase.groupingID)) - groupingFunc, err := createGroupingFunc(ctx, args) + groupingFunc, err := createGroupingFunc(args) require.NoError(t, err, comment) err = groupingFunc.SetMetadata(testCase.mode, []map[uint64]struct{}{testCase.groupingIDs}) diff --git a/pkg/expression/builtin_ilike.go b/pkg/expression/builtin_ilike.go index edb88fde01543..1b48e81e71ed6 100644 --- a/pkg/expression/builtin_ilike.go +++ b/pkg/expression/builtin_ilike.go @@ -15,12 +15,11 @@ package expression import ( - "sync" - "github.com/pingcap/tidb/pkg/sessionctx" "github.com/pingcap/tidb/pkg/types" "github.com/pingcap/tidb/pkg/util/chunk" "github.com/pingcap/tidb/pkg/util/collate" + "github.com/pingcap/tidb/pkg/util/intest" "github.com/pingcap/tidb/pkg/util/stringutil" "github.com/pingcap/tipb/go-tipb" ) @@ -47,30 +46,26 @@ func (c *ilikeFunctionClass) getFunction(ctx sessionctx.Context, args []Expressi return nil, err } bf.tp.SetFlen(1) - sig := &builtinIlikeSig{bf, nil, false, sync.Once{}} + sig := &builtinIlikeSig{baseBuiltinFunc: bf} sig.setPbCode(tipb.ScalarFuncSig_IlikeSig) return sig, nil } type builtinIlikeSig struct { baseBuiltinFunc - // pattern and isMemorizedPattern is not serialized with builtinIlikeSig, treat them as a cache to accelerate + // pattern is not serialized with builtinIlikeSig, treat them as a cache to accelerate // the evaluation of builtinIlikeSig. - pattern collate.WildcardPattern - isMemorizedPattern bool - once sync.Once + patternCache builtinFuncCache[collate.WildcardPattern] } func (b *builtinIlikeSig) Clone() builtinFunc { newSig := &builtinIlikeSig{} newSig.cloneFrom(&b.baseBuiltinFunc) - newSig.pattern = b.pattern - newSig.isMemorizedPattern = b.isMemorizedPattern return newSig } // evalInt evals a builtinIlikeSig. -func (b *builtinIlikeSig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinIlikeSig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { valStr, isNull, err := b.args[0].EvalString(ctx, row) if isNull || err != nil { return 0, isNull, err @@ -99,22 +94,21 @@ func (b *builtinIlikeSig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, valStr = string(valStrBytes) patternStr = string(patternStrBytes) - memorization := func() { - if b.pattern == nil { - b.pattern = collate.ConvertAndGetBinCollation(b.collation).Pattern() - if b.args[1].ConstItem(ctx.GetSessionVars().StmtCtx) && b.args[2].ConstItem(ctx.GetSessionVars().StmtCtx) { - b.pattern.Compile(patternStr, byte(escape)) - b.isMemorizedPattern = true - } + var pattern collate.WildcardPattern + if b.args[1].ConstLevel() >= ConstOnlyInContext && b.args[2].ConstLevel() >= ConstOnlyInContext { + pattern, err = b.patternCache.getOrInitCache(ctx, func() (collate.WildcardPattern, error) { + ret := collate.ConvertAndGetBinCollation(b.collation).Pattern() + ret.Compile(patternStr, byte(escape)) + return ret, nil + }) + + intest.AssertNoError(err) + if err != nil { + return 0, true, err } - } - // Only be executed once to achieve thread-safe - b.once.Do(memorization) - if !b.isMemorizedPattern { - // Must not use b.pattern to avoid data race - pattern := collate.ConvertAndGetBinCollation(b.collation).Pattern() + } else { + pattern = collate.ConvertAndGetBinCollation(b.collation).Pattern() pattern.Compile(patternStr, byte(escape)) - return boolToInt64(pattern.DoMatch(valStr)), false, nil } - return boolToInt64(b.pattern.DoMatch(valStr)), false, nil + return boolToInt64(pattern.DoMatch(valStr)), false, nil } diff --git a/pkg/expression/builtin_ilike_vec.go b/pkg/expression/builtin_ilike_vec.go index e17db24cea1b0..23ebeaa7e22bb 100644 --- a/pkg/expression/builtin_ilike_vec.go +++ b/pkg/expression/builtin_ilike_vec.go @@ -16,10 +16,10 @@ package expression import ( "github.com/pingcap/errors" - "github.com/pingcap/tidb/pkg/sessionctx" "github.com/pingcap/tidb/pkg/util/chunk" "github.com/pingcap/tidb/pkg/util/collate" "github.com/pingcap/tidb/pkg/util/hack" + "github.com/pingcap/tidb/pkg/util/intest" "github.com/pingcap/tidb/pkg/util/stringutil" ) @@ -53,28 +53,30 @@ func (b *builtinIlikeSig) canMemorize(param *funcParam) bool { return param.getCol() == nil } -func (b *builtinIlikeSig) tryToMemorize(param *funcParam, escape int64) { +func (b *builtinIlikeSig) tryToVecMemorize(ctx EvalContext, param *funcParam, escape int64) (collate.WildcardPattern, bool) { if !b.canMemorize(param) { - return + return nil, false } - memorization := func() { - if b.pattern == nil { - b.pattern = collate.ConvertAndGetBinCollation(b.collation).Pattern() - b.pattern.Compile(param.getStringVal(0), byte(escape)) - b.isMemorizedPattern = true - } + pattern, err := b.patternCache.getOrInitCache(ctx, func() (collate.WildcardPattern, error) { + pattern := collate.ConvertAndGetBinCollation(b.collation).Pattern() + pattern.Compile(param.getStringVal(0), byte(escape)) + return pattern, nil + }) + + intest.AssertNoError(err) + if err != nil { + return nil, false } - // Only be executed once to achieve thread-safe - b.once.Do(memorization) + return pattern, true } -func (b *builtinIlikeSig) getEscape(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) (int64, bool, error) { +func (b *builtinIlikeSig) getEscape(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) (int64, bool, error) { rowNum := input.NumRows() escape := int64('\\') - if !b.args[2].ConstItem(ctx.GetSessionVars().StmtCtx) { + if b.args[2].ConstLevel() != ConstStrict { return escape, true, errors.Errorf("escape should be const") } @@ -120,7 +122,7 @@ func (b *builtinIlikeSig) lowerPattern(param *funcParam, rowNum int, escape int6 return escape } -func (b *builtinIlikeSig) vecVec(params []*funcParam, rowNum int, escape int64, result *chunk.Column) error { +func (b *builtinIlikeSig) vecVec(pattern collate.WildcardPattern, params []*funcParam, rowNum int, escape int64, result *chunk.Column) error { result.ResizeInt64(rowNum, false) result.MergeNulls(params[0].getCol(), params[1].getCol()) i64s := result.Int64s() @@ -128,14 +130,14 @@ func (b *builtinIlikeSig) vecVec(params []*funcParam, rowNum int, escape int64, if result.IsNull(i) { continue } - b.pattern.Compile(params[1].getStringVal(i), byte(escape)) - match := b.pattern.DoMatch(params[0].getStringVal(i)) + pattern.Compile(params[1].getStringVal(i), byte(escape)) + match := pattern.DoMatch(params[0].getStringVal(i)) i64s[i] = boolToInt64(match) } return nil } -func (b *builtinIlikeSig) constVec(expr string, param *funcParam, rowNum int, escape int64, result *chunk.Column) error { +func (b *builtinIlikeSig) constVec(pattern collate.WildcardPattern, expr string, param *funcParam, rowNum int, escape int64, result *chunk.Column) error { result.ResizeInt64(rowNum, false) result.MergeNulls(param.getCol()) i64s := result.Int64s() @@ -143,14 +145,14 @@ func (b *builtinIlikeSig) constVec(expr string, param *funcParam, rowNum int, es if result.IsNull(i) { continue } - b.pattern.Compile(param.getStringVal(i), byte(escape)) - match := b.pattern.DoMatch(expr) + pattern.Compile(param.getStringVal(i), byte(escape)) + match := pattern.DoMatch(expr) i64s[i] = boolToInt64(match) } return nil } -func (b *builtinIlikeSig) ilikeWithMemorization(exprParam *funcParam, rowNum int, result *chunk.Column) error { +func (b *builtinIlikeSig) ilikeWithMemorization(pattern collate.WildcardPattern, exprParam *funcParam, rowNum int, result *chunk.Column) error { result.ResizeInt64(rowNum, false) result.MergeNulls(exprParam.getCol()) i64s := result.Int64s() @@ -158,21 +160,21 @@ func (b *builtinIlikeSig) ilikeWithMemorization(exprParam *funcParam, rowNum int if result.IsNull(i) { continue } - match := b.pattern.DoMatch(exprParam.getStringVal(i)) + match := pattern.DoMatch(exprParam.getStringVal(i)) i64s[i] = boolToInt64(match) } return nil } -func (b *builtinIlikeSig) ilikeWithoutMemorization(params []*funcParam, rowNum int, escape int64, result *chunk.Column) error { +func (b *builtinIlikeSig) ilikeWithoutMemorization(pattern collate.WildcardPattern, params []*funcParam, rowNum int, escape int64, result *chunk.Column) error { if params[0].getCol() == nil { - return b.constVec(params[0].getStringVal(0), params[1], rowNum, escape, result) + return b.constVec(pattern, params[0].getStringVal(0), params[1], rowNum, escape, result) } - return b.vecVec(params, rowNum, escape, result) + return b.vecVec(pattern, params, rowNum, escape, result) } -func (b *builtinIlikeSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinIlikeSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { rowNum := input.NumRows() params := make([]*funcParam, 0, 3) defer releaseBuffers(&b.baseBuiltinFunc, params) @@ -197,11 +199,11 @@ func (b *builtinIlikeSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, b.lowerExpr(params[0], rowNum) escape = b.lowerPattern(params[1], rowNum, escape) - b.tryToMemorize(params[1], escape) - if !b.isMemorizedPattern { - b.pattern = collate.ConvertAndGetBinCollation(b.collation).Pattern() - return b.ilikeWithoutMemorization(params, rowNum, escape, result) + pattern, ok := b.tryToVecMemorize(ctx, params[1], escape) + if !ok { + pattern = collate.ConvertAndGetBinCollation(b.collation).Pattern() + return b.ilikeWithoutMemorization(pattern, params, rowNum, escape, result) } - return b.ilikeWithMemorization(params[0], rowNum, result) + return b.ilikeWithMemorization(pattern, params[0], rowNum, result) } diff --git a/pkg/expression/builtin_info.go b/pkg/expression/builtin_info.go index 525a9e2024553..87d7e09c82553 100644 --- a/pkg/expression/builtin_info.go +++ b/pkg/expression/builtin_info.go @@ -32,6 +32,7 @@ import ( "github.com/pingcap/tidb/pkg/parser/mysql" "github.com/pingcap/tidb/pkg/privilege" "github.com/pingcap/tidb/pkg/sessionctx" + "github.com/pingcap/tidb/pkg/sessionctx/variable" "github.com/pingcap/tidb/pkg/types" "github.com/pingcap/tidb/pkg/util" "github.com/pingcap/tidb/pkg/util/chunk" @@ -117,7 +118,7 @@ func (b *builtinDatabaseSig) Clone() builtinFunc { // evalString evals a builtinDatabaseSig. // See https://dev.mysql.com/doc/refman/5.7/en/information-functions.html -func (b *builtinDatabaseSig) evalString(ctx sessionctx.Context, row chunk.Row) (string, bool, error) { +func (b *builtinDatabaseSig) evalString(ctx EvalContext, row chunk.Row) (string, bool, error) { currentDB := ctx.GetSessionVars().CurrentDB return currentDB, currentDB == "", nil } @@ -152,7 +153,7 @@ func (b *builtinFoundRowsSig) Clone() builtinFunc { // evalInt evals a builtinFoundRowsSig. // See https://dev.mysql.com/doc/refman/5.7/en/information-functions.html#function_found-rows // TODO: SQL_CALC_FOUND_ROWS and LIMIT not support for now, We will finish in another PR. -func (b *builtinFoundRowsSig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinFoundRowsSig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { data := ctx.GetSessionVars() if data == nil { return 0, true, errors.Errorf("Missing session variable when eval builtin") @@ -189,7 +190,7 @@ func (b *builtinCurrentUserSig) Clone() builtinFunc { // evalString evals a builtinCurrentUserSig. // See https://dev.mysql.com/doc/refman/5.7/en/information-functions.html#function_current-user -func (b *builtinCurrentUserSig) evalString(ctx sessionctx.Context, row chunk.Row) (string, bool, error) { +func (b *builtinCurrentUserSig) evalString(ctx EvalContext, row chunk.Row) (string, bool, error) { data := ctx.GetSessionVars() if data == nil || data.User == nil { return "", true, errors.Errorf("Missing session variable when eval builtin") @@ -226,7 +227,7 @@ func (b *builtinCurrentRoleSig) Clone() builtinFunc { // evalString evals a builtinCurrentUserSig. // See https://dev.mysql.com/doc/refman/8.0/en/information-functions.html#function_current-role -func (b *builtinCurrentRoleSig) evalString(ctx sessionctx.Context, row chunk.Row) (res string, isNull bool, err error) { +func (b *builtinCurrentRoleSig) evalString(ctx EvalContext, row chunk.Row) (res string, isNull bool, err error) { data := ctx.GetSessionVars() if data == nil || data.ActiveRoles == nil { return "", true, errors.Errorf("Missing session variable when eval builtin") @@ -275,12 +276,25 @@ func (b *builtinCurrentResourceGroupSig) Clone() builtinFunc { return newSig } -func (b *builtinCurrentResourceGroupSig) evalString(ctx sessionctx.Context, row chunk.Row) (val string, isNull bool, err error) { +func (b *builtinCurrentResourceGroupSig) evalString(ctx EvalContext, row chunk.Row) (val string, isNull bool, err error) { data := ctx.GetSessionVars() if data == nil { return "", true, errors.Errorf("Missing session variable when eval builtin") } - return data.ResourceGroupName, false, nil + + return getHintResourceGroupName(data), false, nil +} + +// get statement resource group name with hint in consideration +// NOTE: because function `CURRENT_RESOURCE_GROUP()` maybe evaluated in optimizer +// before we assign the hint value to StmtCtx.ResourceGroupName, so we have to +// explicitly check the hint here. +func getHintResourceGroupName(vars *variable.SessionVars) string { + groupName := vars.StmtCtx.ResourceGroupName + if vars.StmtCtx.HasResourceGroup { + groupName = vars.StmtCtx.StmtHints.ResourceGroup + } + return groupName } type userFunctionClass struct { @@ -312,7 +326,7 @@ func (b *builtinUserSig) Clone() builtinFunc { // evalString evals a builtinUserSig. // See https://dev.mysql.com/doc/refman/5.7/en/information-functions.html#function_user -func (b *builtinUserSig) evalString(ctx sessionctx.Context, row chunk.Row) (string, bool, error) { +func (b *builtinUserSig) evalString(ctx EvalContext, row chunk.Row) (string, bool, error) { data := ctx.GetSessionVars() if data == nil || data.User == nil { return "", true, errors.Errorf("Missing session variable when eval builtin") @@ -347,7 +361,7 @@ func (b *builtinConnectionIDSig) Clone() builtinFunc { return newSig } -func (b *builtinConnectionIDSig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinConnectionIDSig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { data := ctx.GetSessionVars() if data == nil { return 0, true, errors.Errorf("Missing session variable `builtinConnectionIDSig.evalInt`") @@ -396,7 +410,7 @@ func (b *builtinLastInsertIDSig) Clone() builtinFunc { // evalInt evals LAST_INSERT_ID(). // See https://dev.mysql.com/doc/refman/5.7/en/information-functions.html#function_last-insert-id. -func (b *builtinLastInsertIDSig) evalInt(ctx sessionctx.Context, row chunk.Row) (res int64, isNull bool, err error) { +func (b *builtinLastInsertIDSig) evalInt(ctx EvalContext, row chunk.Row) (res int64, isNull bool, err error) { res = int64(ctx.GetSessionVars().StmtCtx.PrevLastInsertID) return res, false, nil } @@ -413,7 +427,7 @@ func (b *builtinLastInsertIDWithIDSig) Clone() builtinFunc { // evalInt evals LAST_INSERT_ID(expr). // See https://dev.mysql.com/doc/refman/5.7/en/information-functions.html#function_last-insert-id. -func (b *builtinLastInsertIDWithIDSig) evalInt(ctx sessionctx.Context, row chunk.Row) (res int64, isNull bool, err error) { +func (b *builtinLastInsertIDWithIDSig) evalInt(ctx EvalContext, row chunk.Row) (res int64, isNull bool, err error) { res, isNull, err = b.args[0].EvalInt(ctx, row) if isNull || err != nil { return res, isNull, err @@ -452,7 +466,7 @@ func (b *builtinVersionSig) Clone() builtinFunc { // evalString evals a builtinVersionSig. // See https://dev.mysql.com/doc/refman/5.7/en/information-functions.html#function_version -func (b *builtinVersionSig) evalString(ctx sessionctx.Context, row chunk.Row) (string, bool, error) { +func (b *builtinVersionSig) evalString(ctx EvalContext, row chunk.Row) (string, bool, error) { return mysql.ServerVersion, false, nil } @@ -485,7 +499,7 @@ func (b *builtinTiDBVersionSig) Clone() builtinFunc { // evalString evals a builtinTiDBVersionSig. // This will show git hash and build time for tidb-server. -func (b *builtinTiDBVersionSig) evalString(ctx sessionctx.Context, row chunk.Row) (string, bool, error) { +func (b *builtinTiDBVersionSig) evalString(ctx EvalContext, row chunk.Row) (string, bool, error) { return printer.GetTiDBInfo(), false, nil } @@ -516,7 +530,7 @@ func (b *builtinTiDBIsDDLOwnerSig) Clone() builtinFunc { } // evalInt evals a builtinTiDBIsDDLOwnerSig. -func (b *builtinTiDBIsDDLOwnerSig) evalInt(ctx sessionctx.Context, row chunk.Row) (res int64, isNull bool, err error) { +func (b *builtinTiDBIsDDLOwnerSig) evalInt(ctx EvalContext, row chunk.Row) (res int64, isNull bool, err error) { if ctx.IsDDLOwner() { res = 1 } @@ -566,7 +580,7 @@ func (b *builtinBenchmarkSig) Clone() builtinFunc { // evalInt evals a builtinBenchmarkSig. It will execute expression repeatedly count times. // See https://dev.mysql.com/doc/refman/5.7/en/information-functions.html#function_benchmark -func (b *builtinBenchmarkSig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinBenchmarkSig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { // Get loop count. var loopCount int64 var isNull bool @@ -683,7 +697,7 @@ func (b *builtinCharsetSig) Clone() builtinFunc { return newSig } -func (b *builtinCharsetSig) evalString(ctx sessionctx.Context, row chunk.Row) (string, bool, error) { +func (b *builtinCharsetSig) evalString(ctx EvalContext, row chunk.Row) (string, bool, error) { return b.args[0].GetType().GetCharset(), false, nil } @@ -708,7 +722,7 @@ type builtinCoercibilitySig struct { baseBuiltinFunc } -func (c *builtinCoercibilitySig) evalInt(ctx sessionctx.Context, row chunk.Row) (val int64, isNull bool, err error) { +func (c *builtinCoercibilitySig) evalInt(ctx EvalContext, row chunk.Row) (val int64, isNull bool, err error) { return int64(c.args[0].Coercibility()), false, nil } @@ -752,7 +766,7 @@ func (b *builtinCollationSig) Clone() builtinFunc { return newSig } -func (b *builtinCollationSig) evalString(ctx sessionctx.Context, row chunk.Row) (string, bool, error) { +func (b *builtinCollationSig) evalString(ctx EvalContext, row chunk.Row) (string, bool, error) { return b.args[0].GetType().GetCollate(), false, nil } @@ -785,7 +799,7 @@ func (b *builtinRowCountSig) Clone() builtinFunc { // evalInt evals ROW_COUNT(). // See https://dev.mysql.com/doc/refman/5.7/en/information-functions.html#function_row-count. -func (b *builtinRowCountSig) evalInt(ctx sessionctx.Context, row chunk.Row) (res int64, isNull bool, err error) { +func (b *builtinRowCountSig) evalInt(ctx EvalContext, row chunk.Row) (res int64, isNull bool, err error) { res = ctx.GetSessionVars().StmtCtx.PrevAffectedRows return res, false, nil } @@ -817,14 +831,14 @@ func (b *builtinTiDBDecodeKeySig) Clone() builtinFunc { } // evalInt evals a builtinTiDBDecodeKeySig. -func (b *builtinTiDBDecodeKeySig) evalString(ctx sessionctx.Context, row chunk.Row) (string, bool, error) { +func (b *builtinTiDBDecodeKeySig) evalString(ctx EvalContext, row chunk.Row) (string, bool, error) { s, isNull, err := b.args[0].EvalString(ctx, row) if isNull || err != nil { return "", isNull, err } - decode := func(ctx sessionctx.Context, s string) string { return s } + decode := func(ctx EvalContext, s string) string { return s } if fn := ctx.Value(TiDBDecodeKeyFunctionKey); fn != nil { - decode = fn.(func(ctx sessionctx.Context, s string) string) + decode = fn.(func(ctx EvalContext, s string) string) } return decode(ctx, s), false, nil } @@ -878,7 +892,7 @@ func (b *builtinTiDBDecodeSQLDigestsSig) Clone() builtinFunc { return newSig } -func (b *builtinTiDBDecodeSQLDigestsSig) evalString(ctx sessionctx.Context, row chunk.Row) (string, bool, error) { +func (b *builtinTiDBDecodeSQLDigestsSig) evalString(ctx EvalContext, row chunk.Row) (string, bool, error) { args := b.getArgs() digestsStr, isNull, err := args[0].EvalString(ctx, row) if err != nil { @@ -906,7 +920,7 @@ func (b *builtinTiDBDecodeSQLDigestsSig) evalString(ctx sessionctx.Context, row if len(digestsStr) > errMsgMaxLength { digestsStr = digestsStr[:errMsgMaxLength] + "..." } - ctx.GetSessionVars().StmtCtx.AppendWarning(errIncorrectArgs.GenWithStack("The argument can't be unmarshalled as JSON array: '%s'", digestsStr)) + ctx.GetSessionVars().StmtCtx.AppendWarning(errIncorrectArgs.FastGen("The argument can't be unmarshalled as JSON array: '%s'", digestsStr)) return "", true, nil } @@ -935,7 +949,7 @@ func (b *builtinTiDBDecodeSQLDigestsSig) evalString(ctx sessionctx.Context, row return "", true, errUnknown.GenWithStack("Retrieving cancelled internally with error: %v", err) } - ctx.GetSessionVars().StmtCtx.AppendWarning(errUnknown.GenWithStack("Retrieving statements information failed with error: %v", err)) + ctx.GetSessionVars().StmtCtx.AppendWarning(errUnknown.FastGen("Retrieving statements information failed with error: %v", err)) return "", true, nil } @@ -958,7 +972,7 @@ func (b *builtinTiDBDecodeSQLDigestsSig) evalString(ctx sessionctx.Context, row resultStr, err := json.Marshal(result) if err != nil { - ctx.GetSessionVars().StmtCtx.AppendWarning(errUnknown.GenWithStack("Marshalling result as JSON failed with error: %v", err)) + ctx.GetSessionVars().StmtCtx.AppendWarning(errUnknown.FastGen("Marshalling result as JSON failed with error: %v", err)) return "", true, nil } @@ -993,7 +1007,7 @@ func (b *builtinTiDBEncodeSQLDigestSig) Clone() builtinFunc { return newSig } -func (b *builtinTiDBEncodeSQLDigestSig) evalString(ctx sessionctx.Context, row chunk.Row) (string, bool, error) { +func (b *builtinTiDBEncodeSQLDigestSig) evalString(ctx EvalContext, row chunk.Row) (string, bool, error) { orgSQLStr, isNull, err := b.getArgs()[0].EvalString(ctx, row) if err != nil { return "", true, err @@ -1034,7 +1048,7 @@ func (b *builtinTiDBDecodePlanSig) Clone() builtinFunc { return newSig } -func (b *builtinTiDBDecodePlanSig) evalString(ctx sessionctx.Context, row chunk.Row) (string, bool, error) { +func (b *builtinTiDBDecodePlanSig) evalString(ctx EvalContext, row chunk.Row) (string, bool, error) { planString, isNull, err := b.args[0].EvalString(ctx, row) if isNull || err != nil { return "", isNull, err @@ -1056,7 +1070,7 @@ func (b *builtinTiDBDecodeBinaryPlanSig) Clone() builtinFunc { return newSig } -func (b *builtinTiDBDecodeBinaryPlanSig) evalString(ctx sessionctx.Context, row chunk.Row) (string, bool, error) { +func (b *builtinTiDBDecodeBinaryPlanSig) evalString(ctx EvalContext, row chunk.Row) (string, bool, error) { planString, isNull, err := b.args[0].EvalString(ctx, row) if isNull || err != nil { return "", isNull, err @@ -1096,7 +1110,7 @@ func (b *builtinNextValSig) Clone() builtinFunc { return newSig } -func (b *builtinNextValSig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinNextValSig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { sequenceName, isNull, err := b.args[0].EvalString(ctx, row) if isNull || err != nil { return 0, isNull, err @@ -1152,7 +1166,7 @@ func (b *builtinLastValSig) Clone() builtinFunc { return newSig } -func (b *builtinLastValSig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinLastValSig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { sequenceName, isNull, err := b.args[0].EvalString(ctx, row) if isNull || err != nil { return 0, isNull, err @@ -1202,7 +1216,7 @@ func (b *builtinSetValSig) Clone() builtinFunc { return newSig } -func (b *builtinSetValSig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinSetValSig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { sequenceName, isNull, err := b.args[0].EvalString(ctx, row) if isNull || err != nil { return 0, isNull, err @@ -1268,7 +1282,7 @@ func (b *builtinFormatBytesSig) Clone() builtinFunc { // formatBytes evals a builtinFormatBytesSig. // See https://dev.mysql.com/doc/refman/8.0/en/performance-schema-functions.html#function_format-bytes -func (b *builtinFormatBytesSig) evalString(ctx sessionctx.Context, row chunk.Row) (string, bool, error) { +func (b *builtinFormatBytesSig) evalString(ctx EvalContext, row chunk.Row) (string, bool, error) { val, isNull, err := b.args[0].EvalReal(ctx, row) if isNull || err != nil { return "", isNull, err @@ -1307,7 +1321,7 @@ func (b *builtinFormatNanoTimeSig) Clone() builtinFunc { // formatNanoTime evals a builtinFormatNanoTimeSig, as time unit in TiDB is always nanosecond, not picosecond. // See https://dev.mysql.com/doc/refman/8.0/en/performance-schema-functions.html#function_format-pico-time -func (b *builtinFormatNanoTimeSig) evalString(ctx sessionctx.Context, row chunk.Row) (string, bool, error) { +func (b *builtinFormatNanoTimeSig) evalString(ctx EvalContext, row chunk.Row) (string, bool, error) { val, isNull, err := b.args[0].EvalReal(ctx, row) if isNull || err != nil { return "", isNull, err diff --git a/pkg/expression/builtin_info_test.go b/pkg/expression/builtin_info_test.go index 104c887bcaaa1..74df0df5dfed8 100644 --- a/pkg/expression/builtin_info_test.go +++ b/pkg/expression/builtin_info_test.go @@ -99,7 +99,7 @@ func TestCurrentUser(t *testing.T) { func TestCurrentResourceGroup(t *testing.T) { ctx := mock.NewContext() sessionVars := ctx.GetSessionVars() - sessionVars.ResourceGroupName = "rg1" + sessionVars.StmtCtx.ResourceGroupName = "rg1" fc := funcs[ast.CurrentResourceGroup] f, err := fc.getFunction(ctx, nil) diff --git a/pkg/expression/builtin_info_vec.go b/pkg/expression/builtin_info_vec.go index dc7dfd096506d..d8eb811a1ba8d 100644 --- a/pkg/expression/builtin_info_vec.go +++ b/pkg/expression/builtin_info_vec.go @@ -20,7 +20,6 @@ import ( "github.com/pingcap/errors" "github.com/pingcap/tidb/pkg/parser/mysql" - "github.com/pingcap/tidb/pkg/sessionctx" "github.com/pingcap/tidb/pkg/types" "github.com/pingcap/tidb/pkg/util/chunk" "github.com/pingcap/tidb/pkg/util/printer" @@ -32,7 +31,7 @@ func (b *builtinDatabaseSig) vectorized() bool { // evalString evals a builtinDatabaseSig. // See https://dev.mysql.com/doc/refman/5.7/en/information-functions.html -func (b *builtinDatabaseSig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinDatabaseSig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() currentDB := ctx.GetSessionVars().CurrentDB @@ -53,7 +52,7 @@ func (b *builtinConnectionIDSig) vectorized() bool { return true } -func (b *builtinConnectionIDSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinConnectionIDSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() data := ctx.GetSessionVars() if data == nil { @@ -72,7 +71,7 @@ func (b *builtinTiDBVersionSig) vectorized() bool { return true } -func (b *builtinTiDBVersionSig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinTiDBVersionSig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() result.ReserveString(n) info := printer.GetTiDBInfo() @@ -88,7 +87,7 @@ func (b *builtinRowCountSig) vectorized() bool { // evalInt evals ROW_COUNT(). // See https://dev.mysql.com/doc/refman/5.7/en/information-functions.html#function_row-count -func (b *builtinRowCountSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinRowCountSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() result.ResizeInt64(n, false) i64s := result.Int64s() @@ -105,7 +104,7 @@ func (b *builtinCurrentUserSig) vectorized() bool { // evalString evals a builtinCurrentUserSig. // See https://dev.mysql.com/doc/refman/5.7/en/information-functions.html#function_current-user -func (b *builtinCurrentUserSig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinCurrentUserSig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() data := ctx.GetSessionVars() @@ -123,15 +122,16 @@ func (b *builtinCurrentResourceGroupSig) vectorized() bool { return true } -func (b *builtinCurrentResourceGroupSig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinCurrentResourceGroupSig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { data := ctx.GetSessionVars() if data == nil { return errors.Errorf("Missing session variable when eval builtin") } n := input.NumRows() result.ReserveString(n) + groupName := getHintResourceGroupName(data) for i := 0; i < n; i++ { - result.AppendString(data.ResourceGroupName) + result.AppendString(groupName) } return nil } @@ -142,7 +142,7 @@ func (b *builtinCurrentRoleSig) vectorized() bool { // evalString evals a builtinCurrentUserSig. // See https://dev.mysql.com/doc/refman/8.0/en/information-functions.html#function_current-role -func (b *builtinCurrentRoleSig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinCurrentRoleSig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() data := ctx.GetSessionVars() @@ -176,7 +176,7 @@ func (b *builtinUserSig) vectorized() bool { // evalString evals a builtinUserSig. // See https://dev.mysql.com/doc/refman/5.7/en/information-functions.html#function_user -func (b *builtinUserSig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinUserSig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() data := ctx.GetSessionVars() if data == nil || data.User == nil { @@ -194,7 +194,7 @@ func (b *builtinTiDBIsDDLOwnerSig) vectorized() bool { return true } -func (b *builtinTiDBIsDDLOwnerSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinTiDBIsDDLOwnerSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() var res int64 if ctx.IsDDLOwner() { @@ -212,7 +212,7 @@ func (b *builtinFoundRowsSig) vectorized() bool { return true } -func (b *builtinFoundRowsSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinFoundRowsSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { data := ctx.GetSessionVars() if data == nil { return errors.Errorf("Missing session variable when eval builtin") @@ -231,7 +231,7 @@ func (b *builtinBenchmarkSig) vectorized() bool { return b.constLoopCount > 0 } -func (b *builtinBenchmarkSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinBenchmarkSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() loopCount := b.constLoopCount arg := b.args[1] @@ -301,7 +301,7 @@ func (b *builtinLastInsertIDSig) vectorized() bool { return true } -func (b *builtinLastInsertIDSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinLastInsertIDSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() result.ResizeInt64(n, false) i64s := result.Int64s() @@ -316,7 +316,7 @@ func (b *builtinLastInsertIDWithIDSig) vectorized() bool { return true } -func (b *builtinLastInsertIDWithIDSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinLastInsertIDWithIDSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { if err := b.args[0].VecEvalInt(ctx, input, result); err != nil { return err } @@ -334,7 +334,7 @@ func (b *builtinVersionSig) vectorized() bool { return true } -func (b *builtinVersionSig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinVersionSig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() result.ReserveString(n) for i := 0; i < n; i++ { @@ -347,7 +347,7 @@ func (b *builtinTiDBDecodeKeySig) vectorized() bool { return true } -func (b *builtinTiDBDecodeKeySig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinTiDBDecodeKeySig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -358,9 +358,9 @@ func (b *builtinTiDBDecodeKeySig) vecEvalString(ctx sessionctx.Context, input *c return err } result.ReserveString(n) - decode := func(ctx sessionctx.Context, s string) string { return s } + decode := func(ctx EvalContext, s string) string { return s } if fn := ctx.Value(TiDBDecodeKeyFunctionKey); fn != nil { - decode = fn.(func(ctx sessionctx.Context, s string) string) + decode = fn.(func(ctx EvalContext, s string) string) } for i := 0; i < n; i++ { if buf.IsNull(i) { diff --git a/pkg/expression/builtin_json.go b/pkg/expression/builtin_json.go index 7fe6ca0cb5fee..c689c2ba5c0e2 100644 --- a/pkg/expression/builtin_json.go +++ b/pkg/expression/builtin_json.go @@ -119,7 +119,7 @@ func (c *jsonTypeFunctionClass) getFunction(ctx sessionctx.Context, args []Expre return sig, nil } -func (b *builtinJSONTypeSig) evalString(ctx sessionctx.Context, row chunk.Row) (val string, isNull bool, err error) { +func (b *builtinJSONTypeSig) evalString(ctx EvalContext, row chunk.Row) (val string, isNull bool, err error) { var j types.BinaryJSON j, isNull, err = b.args[0].EvalJSON(ctx, row) if isNull || err != nil { @@ -170,7 +170,7 @@ func (c *jsonExtractFunctionClass) getFunction(ctx sessionctx.Context, args []Ex return sig, nil } -func (b *builtinJSONExtractSig) evalJSON(ctx sessionctx.Context, row chunk.Row) (res types.BinaryJSON, isNull bool, err error) { +func (b *builtinJSONExtractSig) evalJSON(ctx EvalContext, row chunk.Row) (res types.BinaryJSON, isNull bool, err error) { res, isNull, err = b.args[0].EvalJSON(ctx, row) if isNull || err != nil { return @@ -235,7 +235,7 @@ func (c *jsonUnquoteFunctionClass) getFunction(ctx sessionctx.Context, args []Ex return sig, nil } -func (b *builtinJSONUnquoteSig) evalString(ctx sessionctx.Context, row chunk.Row) (str string, isNull bool, err error) { +func (b *builtinJSONUnquoteSig) evalString(ctx EvalContext, row chunk.Row) (str string, isNull bool, err error) { str, isNull, err = b.args[0].EvalString(ctx, row) if isNull || err != nil { return "", isNull, err @@ -288,7 +288,7 @@ func (c *jsonSetFunctionClass) getFunction(ctx sessionctx.Context, args []Expres return sig, nil } -func (b *builtinJSONSetSig) evalJSON(ctx sessionctx.Context, row chunk.Row) (res types.BinaryJSON, isNull bool, err error) { +func (b *builtinJSONSetSig) evalJSON(ctx EvalContext, row chunk.Row) (res types.BinaryJSON, isNull bool, err error) { res, isNull, err = jsonModify(ctx, b.args, row, types.JSONModifySet) return res, isNull, err } @@ -331,7 +331,7 @@ func (c *jsonInsertFunctionClass) getFunction(ctx sessionctx.Context, args []Exp return sig, nil } -func (b *builtinJSONInsertSig) evalJSON(ctx sessionctx.Context, row chunk.Row) (res types.BinaryJSON, isNull bool, err error) { +func (b *builtinJSONInsertSig) evalJSON(ctx EvalContext, row chunk.Row) (res types.BinaryJSON, isNull bool, err error) { res, isNull, err = jsonModify(ctx, b.args, row, types.JSONModifyInsert) return res, isNull, err } @@ -374,7 +374,7 @@ func (c *jsonReplaceFunctionClass) getFunction(ctx sessionctx.Context, args []Ex return sig, nil } -func (b *builtinJSONReplaceSig) evalJSON(ctx sessionctx.Context, row chunk.Row) (res types.BinaryJSON, isNull bool, err error) { +func (b *builtinJSONReplaceSig) evalJSON(ctx EvalContext, row chunk.Row) (res types.BinaryJSON, isNull bool, err error) { res, isNull, err = jsonModify(ctx, b.args, row, types.JSONModifyReplace) return res, isNull, err } @@ -411,7 +411,7 @@ func (c *jsonRemoveFunctionClass) getFunction(ctx sessionctx.Context, args []Exp return sig, nil } -func (b *builtinJSONRemoveSig) evalJSON(ctx sessionctx.Context, row chunk.Row) (res types.BinaryJSON, isNull bool, err error) { +func (b *builtinJSONRemoveSig) evalJSON(ctx EvalContext, row chunk.Row) (res types.BinaryJSON, isNull bool, err error) { res, isNull, err = b.args[0].EvalJSON(ctx, row) if isNull || err != nil { return res, isNull, err @@ -480,7 +480,7 @@ func (c *jsonMergeFunctionClass) getFunction(ctx sessionctx.Context, args []Expr return sig, nil } -func (b *builtinJSONMergeSig) evalJSON(ctx sessionctx.Context, row chunk.Row) (res types.BinaryJSON, isNull bool, err error) { +func (b *builtinJSONMergeSig) evalJSON(ctx EvalContext, row chunk.Row) (res types.BinaryJSON, isNull bool, err error) { values := make([]types.BinaryJSON, 0, len(b.args)) for _, arg := range b.args { var value types.BinaryJSON @@ -494,7 +494,7 @@ func (b *builtinJSONMergeSig) evalJSON(ctx sessionctx.Context, row chunk.Row) (r // function "JSON_MERGE" is deprecated since MySQL 5.7.22. Synonym for function "JSON_MERGE_PRESERVE". // See https://dev.mysql.com/doc/refman/5.7/en/json-modification-functions.html#function_json-merge if b.pbCode == tipb.ScalarFuncSig_JsonMergeSig { - ctx.GetSessionVars().StmtCtx.AppendWarning(errDeprecatedSyntaxNoReplacement.GenWithStackByArgs("JSON_MERGE")) + ctx.GetSessionVars().StmtCtx.AppendWarning(errDeprecatedSyntaxNoReplacement.FastGenByArgs("JSON_MERGE")) } return res, false, nil } @@ -539,7 +539,7 @@ func (c *jsonObjectFunctionClass) getFunction(ctx sessionctx.Context, args []Exp return sig, nil } -func (b *builtinJSONObjectSig) evalJSON(ctx sessionctx.Context, row chunk.Row) (res types.BinaryJSON, isNull bool, err error) { +func (b *builtinJSONObjectSig) evalJSON(ctx EvalContext, row chunk.Row) (res types.BinaryJSON, isNull bool, err error) { if len(b.args)&1 == 1 { err = ErrIncorrectParameterCount.GenWithStackByArgs(ast.JSONObject) return res, true, err @@ -609,7 +609,7 @@ func (c *jsonArrayFunctionClass) getFunction(ctx sessionctx.Context, args []Expr return sig, nil } -func (b *builtinJSONArraySig) evalJSON(ctx sessionctx.Context, row chunk.Row) (res types.BinaryJSON, isNull bool, err error) { +func (b *builtinJSONArraySig) evalJSON(ctx EvalContext, row chunk.Row) (res types.BinaryJSON, isNull bool, err error) { jsons := make([]interface{}, 0, len(b.args)) for _, arg := range b.args { j, isNull, err := arg.EvalJSON(ctx, row) @@ -669,7 +669,7 @@ func (c *jsonContainsPathFunctionClass) getFunction(ctx sessionctx.Context, args return sig, nil } -func (b *builtinJSONContainsPathSig) evalInt(ctx sessionctx.Context, row chunk.Row) (res int64, isNull bool, err error) { +func (b *builtinJSONContainsPathSig) evalInt(ctx EvalContext, row chunk.Row) (res int64, isNull bool, err error) { obj, isNull, err := b.args[0].EvalJSON(ctx, row) if isNull || err != nil { return res, isNull, err @@ -705,7 +705,7 @@ func (b *builtinJSONContainsPathSig) evalInt(ctx sessionctx.Context, row chunk.R return contains, false, nil } -func jsonModify(ctx sessionctx.Context, args []Expression, row chunk.Row, mt types.JSONModifyType) (res types.BinaryJSON, isNull bool, err error) { +func jsonModify(ctx EvalContext, args []Expression, row chunk.Row, mt types.JSONModifyType) (res types.BinaryJSON, isNull bool, err error) { res, isNull, err = args[0].EvalJSON(ctx, row) if isNull || err != nil { return res, isNull, err @@ -783,7 +783,7 @@ func (c *jsonMemberOfFunctionClass) getFunction(ctx sessionctx.Context, args []E return sig, nil } -func (b *builtinJSONMemberOfSig) evalInt(ctx sessionctx.Context, row chunk.Row) (res int64, isNull bool, err error) { +func (b *builtinJSONMemberOfSig) evalInt(ctx EvalContext, row chunk.Row) (res int64, isNull bool, err error) { target, isNull, err := b.args[0].EvalJSON(ctx, row) if isNull || err != nil { return res, isNull, err @@ -852,7 +852,7 @@ func (c *jsonContainsFunctionClass) getFunction(ctx sessionctx.Context, args []E return sig, nil } -func (b *builtinJSONContainsSig) evalInt(ctx sessionctx.Context, row chunk.Row) (res int64, isNull bool, err error) { +func (b *builtinJSONContainsSig) evalInt(ctx EvalContext, row chunk.Row) (res int64, isNull bool, err error) { obj, isNull, err := b.args[0].EvalJSON(ctx, row) if isNull || err != nil { return res, isNull, err @@ -928,7 +928,7 @@ func (c *jsonOverlapsFunctionClass) getFunction(ctx sessionctx.Context, args []E return sig, nil } -func (b *builtinJSONOverlapsSig) evalInt(ctx sessionctx.Context, row chunk.Row) (res int64, isNull bool, err error) { +func (b *builtinJSONOverlapsSig) evalInt(ctx EvalContext, row chunk.Row) (res int64, isNull bool, err error) { obj, isNull, err := b.args[0].EvalJSON(ctx, row) if isNull || err != nil { return res, isNull, err @@ -992,7 +992,7 @@ func (b *builtinJSONValidJSONSig) Clone() builtinFunc { // evalInt evals a builtinJSONValidJSONSig. // See https://dev.mysql.com/doc/refman/5.7/en/json-attribute-functions.html#function_json-valid -func (b *builtinJSONValidJSONSig) evalInt(ctx sessionctx.Context, row chunk.Row) (val int64, isNull bool, err error) { +func (b *builtinJSONValidJSONSig) evalInt(ctx EvalContext, row chunk.Row) (val int64, isNull bool, err error) { _, isNull, err = b.args[0].EvalJSON(ctx, row) return 1, isNull, err } @@ -1009,7 +1009,7 @@ func (b *builtinJSONValidStringSig) Clone() builtinFunc { // evalInt evals a builtinJSONValidStringSig. // See https://dev.mysql.com/doc/refman/5.7/en/json-attribute-functions.html#function_json-valid -func (b *builtinJSONValidStringSig) evalInt(ctx sessionctx.Context, row chunk.Row) (res int64, isNull bool, err error) { +func (b *builtinJSONValidStringSig) evalInt(ctx EvalContext, row chunk.Row) (res int64, isNull bool, err error) { val, isNull, err := b.args[0].EvalString(ctx, row) if err != nil || isNull { return 0, isNull, err @@ -1034,7 +1034,7 @@ func (b *builtinJSONValidOthersSig) Clone() builtinFunc { // evalInt evals a builtinJSONValidOthersSig. // See https://dev.mysql.com/doc/refman/5.7/en/json-attribute-functions.html#function_json-valid -func (b *builtinJSONValidOthersSig) evalInt(ctx sessionctx.Context, row chunk.Row) (val int64, isNull bool, err error) { +func (b *builtinJSONValidOthersSig) evalInt(ctx EvalContext, row chunk.Row) (val int64, isNull bool, err error) { return 0, false, nil } @@ -1080,7 +1080,7 @@ func (b *builtinJSONArrayAppendSig) Clone() builtinFunc { return newSig } -func (b *builtinJSONArrayAppendSig) evalJSON(ctx sessionctx.Context, row chunk.Row) (res types.BinaryJSON, isNull bool, err error) { +func (b *builtinJSONArrayAppendSig) evalJSON(ctx EvalContext, row chunk.Row) (res types.BinaryJSON, isNull bool, err error) { res, isNull, err = b.args[0].EvalJSON(ctx, row) if err != nil || isNull { return res, true, err @@ -1177,7 +1177,7 @@ func (b *builtinJSONArrayInsertSig) Clone() builtinFunc { return newSig } -func (b *builtinJSONArrayInsertSig) evalJSON(ctx sessionctx.Context, row chunk.Row) (res types.BinaryJSON, isNull bool, err error) { +func (b *builtinJSONArrayInsertSig) evalJSON(ctx EvalContext, row chunk.Row) (res types.BinaryJSON, isNull bool, err error) { res, isNull, err = b.args[0].EvalJSON(ctx, row) if err != nil || isNull { return res, true, err @@ -1258,7 +1258,7 @@ func (b *builtinJSONMergePatchSig) Clone() builtinFunc { return newSig } -func (b *builtinJSONMergePatchSig) evalJSON(ctx sessionctx.Context, row chunk.Row) (res types.BinaryJSON, isNull bool, err error) { +func (b *builtinJSONMergePatchSig) evalJSON(ctx EvalContext, row chunk.Row) (res types.BinaryJSON, isNull bool, err error) { values := make([]*types.BinaryJSON, 0, len(b.args)) for _, arg := range b.args { var value types.BinaryJSON @@ -1347,7 +1347,7 @@ func (c *jsonPrettyFunctionClass) getFunction(ctx sessionctx.Context, args []Exp return sig, nil } -func (b *builtinJSONSPrettySig) evalString(ctx sessionctx.Context, row chunk.Row) (res string, isNull bool, err error) { +func (b *builtinJSONSPrettySig) evalString(ctx EvalContext, row chunk.Row) (res string, isNull bool, err error) { obj, isNull, err := b.args[0].EvalJSON(ctx, row) if isNull || err != nil { return res, isNull, err @@ -1404,7 +1404,7 @@ func (c *jsonQuoteFunctionClass) getFunction(ctx sessionctx.Context, args []Expr return sig, nil } -func (b *builtinJSONQuoteSig) evalString(ctx sessionctx.Context, row chunk.Row) (string, bool, error) { +func (b *builtinJSONQuoteSig) evalString(ctx EvalContext, row chunk.Row) (string, bool, error) { str, isNull, err := b.args[0].EvalString(ctx, row) if isNull || err != nil { return "", isNull, err @@ -1455,7 +1455,7 @@ func (c *jsonSearchFunctionClass) getFunction(ctx sessionctx.Context, args []Exp return sig, nil } -func (b *builtinJSONSearchSig) evalJSON(ctx sessionctx.Context, row chunk.Row) (res types.BinaryJSON, isNull bool, err error) { +func (b *builtinJSONSearchSig) evalJSON(ctx EvalContext, row chunk.Row) (res types.BinaryJSON, isNull bool, err error) { // json_doc var obj types.BinaryJSON obj, isNull, err = b.args[0].EvalJSON(ctx, row) @@ -1543,7 +1543,7 @@ func (c *jsonStorageFreeFunctionClass) getFunction(ctx sessionctx.Context, args return sig, nil } -func (b *builtinJSONStorageFreeSig) evalInt(ctx sessionctx.Context, row chunk.Row) (res int64, isNull bool, err error) { +func (b *builtinJSONStorageFreeSig) evalInt(ctx EvalContext, row chunk.Row) (res int64, isNull bool, err error) { _, isNull, err = b.args[0].EvalJSON(ctx, row) if isNull || err != nil { return res, isNull, err @@ -1580,7 +1580,7 @@ func (c *jsonStorageSizeFunctionClass) getFunction(ctx sessionctx.Context, args return sig, nil } -func (b *builtinJSONStorageSizeSig) evalInt(ctx sessionctx.Context, row chunk.Row) (res int64, isNull bool, err error) { +func (b *builtinJSONStorageSizeSig) evalInt(ctx EvalContext, row chunk.Row) (res int64, isNull bool, err error) { obj, isNull, err := b.args[0].EvalJSON(ctx, row) if isNull || err != nil { return res, isNull, err @@ -1618,7 +1618,7 @@ func (c *jsonDepthFunctionClass) getFunction(ctx sessionctx.Context, args []Expr return sig, nil } -func (b *builtinJSONDepthSig) evalInt(ctx sessionctx.Context, row chunk.Row) (res int64, isNull bool, err error) { +func (b *builtinJSONDepthSig) evalInt(ctx EvalContext, row chunk.Row) (res int64, isNull bool, err error) { // as TiDB doesn't support partial update json value, so only check the // json format and whether it's NULL. For NULL return NULL, for invalid json, return // an error, otherwise return 0 @@ -1679,7 +1679,7 @@ func (b *builtinJSONKeysSig) Clone() builtinFunc { return newSig } -func (b *builtinJSONKeysSig) evalJSON(ctx sessionctx.Context, row chunk.Row) (res types.BinaryJSON, isNull bool, err error) { +func (b *builtinJSONKeysSig) evalJSON(ctx EvalContext, row chunk.Row) (res types.BinaryJSON, isNull bool, err error) { res, isNull, err = b.args[0].EvalJSON(ctx, row) if isNull || err != nil { return res, isNull, err @@ -1700,7 +1700,7 @@ func (b *builtinJSONKeys2ArgsSig) Clone() builtinFunc { return newSig } -func (b *builtinJSONKeys2ArgsSig) evalJSON(ctx sessionctx.Context, row chunk.Row) (res types.BinaryJSON, isNull bool, err error) { +func (b *builtinJSONKeys2ArgsSig) evalJSON(ctx EvalContext, row chunk.Row) (res types.BinaryJSON, isNull bool, err error) { res, isNull, err = b.args[0].EvalJSON(ctx, row) if isNull || err != nil { return res, isNull, err @@ -1764,7 +1764,7 @@ func (c *jsonLengthFunctionClass) getFunction(ctx sessionctx.Context, args []Exp return sig, nil } -func (b *builtinJSONLengthSig) evalInt(ctx sessionctx.Context, row chunk.Row) (res int64, isNull bool, err error) { +func (b *builtinJSONLengthSig) evalInt(ctx EvalContext, row chunk.Row) (res int64, isNull bool, err error) { obj, isNull, err := b.args[0].EvalJSON(ctx, row) if isNull || err != nil { return res, isNull, err diff --git a/pkg/expression/builtin_json_vec.go b/pkg/expression/builtin_json_vec.go index f7d6627a282d3..f0fbb7afd38fb 100644 --- a/pkg/expression/builtin_json_vec.go +++ b/pkg/expression/builtin_json_vec.go @@ -22,14 +22,13 @@ import ( "github.com/pingcap/errors" "github.com/pingcap/tidb/pkg/parser/ast" - "github.com/pingcap/tidb/pkg/sessionctx" "github.com/pingcap/tidb/pkg/types" "github.com/pingcap/tidb/pkg/util/chunk" "github.com/pingcap/tipb/go-tipb" ) //revive:disable:defer -func vecJSONModify(ctx sessionctx.Context, args []Expression, bufAllocator columnBufferAllocator, input *chunk.Chunk, result *chunk.Column, mt types.JSONModifyType) error { +func vecJSONModify(ctx EvalContext, args []Expression, bufAllocator columnBufferAllocator, input *chunk.Chunk, result *chunk.Column, mt types.JSONModifyType) error { nr := input.NumRows() jsonBuf, err := bufAllocator.get() if err != nil { @@ -107,7 +106,7 @@ func (b *builtinJSONStorageFreeSig) vectorized() bool { return true } -func (b *builtinJSONStorageFreeSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinJSONStorageFreeSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -134,7 +133,7 @@ func (b *builtinJSONStorageSizeSig) vectorized() bool { return true } -func (b *builtinJSONStorageSizeSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinJSONStorageSizeSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -162,7 +161,7 @@ func (b *builtinJSONDepthSig) vectorized() bool { return true } -func (b *builtinJSONDepthSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinJSONDepthSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -189,7 +188,7 @@ func (b *builtinJSONKeysSig) vectorized() bool { return true } -func (b *builtinJSONKeysSig) vecEvalJSON(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinJSONKeysSig) vecEvalJSON(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -222,7 +221,7 @@ func (b *builtinJSONInsertSig) vectorized() bool { return true } -func (b *builtinJSONInsertSig) vecEvalJSON(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinJSONInsertSig) vecEvalJSON(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { err := vecJSONModify(ctx, b.args, b.bufAllocator, input, result, types.JSONModifyInsert) return err } @@ -231,7 +230,7 @@ func (b *builtinJSONReplaceSig) vectorized() bool { return true } -func (b *builtinJSONReplaceSig) vecEvalJSON(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinJSONReplaceSig) vecEvalJSON(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { err := vecJSONModify(ctx, b.args, b.bufAllocator, input, result, types.JSONModifyReplace) return err } @@ -240,7 +239,7 @@ func (b *builtinJSONArraySig) vectorized() bool { return true } -func (b *builtinJSONArraySig) vecEvalJSON(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinJSONArraySig) vecEvalJSON(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { nr := input.NumRows() jsons := make([][]interface{}, nr) for i := 0; i < nr; i++ { @@ -278,7 +277,7 @@ func (b *builtinJSONMemberOfSig) vectorized() bool { return true } -func (b *builtinJSONMemberOfSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinJSONMemberOfSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { nr := input.NumRows() targetCol, err := b.bufAllocator.get() @@ -331,7 +330,7 @@ func (b *builtinJSONContainsSig) vectorized() bool { return true } -func (b *builtinJSONContainsSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinJSONContainsSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { nr := input.NumRows() objCol, err := b.bufAllocator.get() @@ -416,7 +415,7 @@ func (b *builtinJSONOverlapsSig) vectorized() bool { return true } -func (b *builtinJSONOverlapsSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinJSONOverlapsSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { nr := input.NumRows() objCol, err := b.bufAllocator.get() @@ -461,7 +460,7 @@ func (b *builtinJSONQuoteSig) vectorized() bool { return true } -func (b *builtinJSONQuoteSig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinJSONQuoteSig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -487,7 +486,7 @@ func (b *builtinJSONSearchSig) vectorized() bool { return true } -func (b *builtinJSONSearchSig) vecEvalJSON(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinJSONSearchSig) vecEvalJSON(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { nr := input.NumRows() jsonBuf, err := b.bufAllocator.get() if err != nil { @@ -592,7 +591,7 @@ func (b *builtinJSONSetSig) vectorized() bool { return true } -func (b *builtinJSONSetSig) vecEvalJSON(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinJSONSetSig) vecEvalJSON(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { err := vecJSONModify(ctx, b.args, b.bufAllocator, input, result, types.JSONModifySet) return err } @@ -601,7 +600,7 @@ func (b *builtinJSONObjectSig) vectorized() bool { return true } -func (b *builtinJSONObjectSig) vecEvalJSON(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinJSONObjectSig) vecEvalJSON(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { nr := input.NumRows() if len(b.args)&1 == 1 { err := ErrIncorrectParameterCount.GenWithStackByArgs(ast.JSONObject) @@ -679,7 +678,7 @@ func (b *builtinJSONArrayInsertSig) vectorized() bool { return true } -func (b *builtinJSONArrayInsertSig) vecEvalJSON(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinJSONArrayInsertSig) vecEvalJSON(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { nr := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -758,7 +757,7 @@ func (b *builtinJSONKeys2ArgsSig) vectorized() bool { return true } -func (b *builtinJSONKeys2ArgsSig) vecEvalJSON(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinJSONKeys2ArgsSig) vecEvalJSON(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { nr := input.NumRows() jsonBuf, err := b.bufAllocator.get() if err != nil { @@ -812,7 +811,7 @@ func (b *builtinJSONLengthSig) vectorized() bool { return true } -func (b *builtinJSONLengthSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinJSONLengthSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { nr := input.NumRows() jsonBuf, err := b.bufAllocator.get() @@ -895,7 +894,7 @@ func (b *builtinJSONTypeSig) vectorized() bool { return true } -func (b *builtinJSONTypeSig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinJSONTypeSig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -921,7 +920,7 @@ func (b *builtinJSONExtractSig) vectorized() bool { return true } -func (b *builtinJSONExtractSig) vecEvalJSON(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinJSONExtractSig) vecEvalJSON(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { var err error nr := input.NumRows() @@ -988,7 +987,7 @@ func (b *builtinJSONRemoveSig) vectorized() bool { return true } -func (b *builtinJSONRemoveSig) vecEvalJSON(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinJSONRemoveSig) vecEvalJSON(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { nr := input.NumRows() jsonBuf, err := b.bufAllocator.get() if err != nil { @@ -1051,7 +1050,7 @@ func (b *builtinJSONMergeSig) vectorized() bool { return true } -func (b *builtinJSONMergeSig) vecEvalJSON(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinJSONMergeSig) vecEvalJSON(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { nr := input.NumRows() argBuffers := make([]*chunk.Column, len(b.args)) var err error @@ -1104,7 +1103,7 @@ func (b *builtinJSONMergeSig) vecEvalJSON(ctx sessionctx.Context, input *chunk.C if result.IsNull(i) { continue } - ctx.GetSessionVars().StmtCtx.AppendWarning(errDeprecatedSyntaxNoReplacement.GenWithStackByArgs("JSON_MERGE")) + ctx.GetSessionVars().StmtCtx.AppendWarning(errDeprecatedSyntaxNoReplacement.FastGenByArgs("JSON_MERGE")) } } @@ -1115,7 +1114,7 @@ func (b *builtinJSONContainsPathSig) vectorized() bool { return true } -func (b *builtinJSONContainsPathSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinJSONContainsPathSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() jsonBuf, err := b.bufAllocator.get() if err != nil { @@ -1198,7 +1197,7 @@ func (b *builtinJSONArrayAppendSig) vectorized() bool { return true } -func (b *builtinJSONArrayAppendSig) vecEvalJSON(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinJSONArrayAppendSig) vecEvalJSON(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() m := (len(b.args) - 1) / 2 @@ -1282,7 +1281,7 @@ func (b *builtinJSONUnquoteSig) vectorized() bool { return true } -func (b *builtinJSONUnquoteSig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinJSONUnquoteSig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -1316,7 +1315,7 @@ func (b *builtinJSONSPrettySig) vectorized() bool { return true } -func (b *builtinJSONSPrettySig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinJSONSPrettySig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -1352,7 +1351,7 @@ func (b *builtinJSONMergePatchSig) vectorized() bool { return true } -func (b *builtinJSONMergePatchSig) vecEvalJSON(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinJSONMergePatchSig) vecEvalJSON(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { nr := input.NumRows() argBuffers := make([]*chunk.Column, len(b.args)) var err error diff --git a/pkg/expression/builtin_like.go b/pkg/expression/builtin_like.go index 8a6c13798ba35..b18ad97f41cce 100644 --- a/pkg/expression/builtin_like.go +++ b/pkg/expression/builtin_like.go @@ -15,12 +15,11 @@ package expression import ( - "sync" - "github.com/pingcap/tidb/pkg/sessionctx" "github.com/pingcap/tidb/pkg/types" "github.com/pingcap/tidb/pkg/util/chunk" "github.com/pingcap/tidb/pkg/util/collate" + "github.com/pingcap/tidb/pkg/util/intest" "github.com/pingcap/tipb/go-tipb" ) @@ -46,31 +45,27 @@ func (c *likeFunctionClass) getFunction(ctx sessionctx.Context, args []Expressio return nil, err } bf.tp.SetFlen(1) - sig := &builtinLikeSig{bf, nil, false, sync.Once{}} + sig := &builtinLikeSig{baseBuiltinFunc: bf} sig.setPbCode(tipb.ScalarFuncSig_LikeSig) return sig, nil } type builtinLikeSig struct { baseBuiltinFunc - // pattern and isMemorizedPattern is not serialized with builtinLikeSig, treat them as a cache to accelerate + // pattern is not serialized with builtinLikeSig, treat them as a cache to accelerate // the evaluation of builtinLikeSig. - pattern collate.WildcardPattern - isMemorizedPattern bool - once sync.Once + patternCache builtinFuncCache[collate.WildcardPattern] } func (b *builtinLikeSig) Clone() builtinFunc { newSig := &builtinLikeSig{} newSig.cloneFrom(&b.baseBuiltinFunc) - newSig.pattern = b.pattern - newSig.isMemorizedPattern = b.isMemorizedPattern return newSig } // evalInt evals a builtinLikeSig. // See https://dev.mysql.com/doc/refman/5.7/en/string-comparison-functions.html#operator_like -func (b *builtinLikeSig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinLikeSig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { valStr, isNull, err := b.args[0].EvalString(ctx, row) if isNull || err != nil { return 0, isNull, err @@ -84,22 +79,20 @@ func (b *builtinLikeSig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, if isNull || err != nil { return 0, isNull, err } - memorization := func() { - if b.pattern == nil { - b.pattern = b.collator().Pattern() - if b.args[1].ConstItem(ctx.GetSessionVars().StmtCtx) && b.args[2].ConstItem(ctx.GetSessionVars().StmtCtx) { - b.pattern.Compile(patternStr, byte(escape)) - b.isMemorizedPattern = true - } + var pattern collate.WildcardPattern + if b.args[1].ConstLevel() >= ConstOnlyInContext && b.args[2].ConstLevel() >= ConstOnlyInContext { + pattern, err = b.patternCache.getOrInitCache(ctx, func() (collate.WildcardPattern, error) { + ret := b.collator().Pattern() + ret.Compile(patternStr, byte(escape)) + return ret, nil + }) + intest.AssertNoError(err) + if err != nil { + return 0, true, err } - } - // Only be executed once to achieve thread-safe - b.once.Do(memorization) - if !b.isMemorizedPattern { - // Must not use b.pattern to avoid data race - pattern := b.collator().Pattern() + } else { + pattern = b.collator().Pattern() pattern.Compile(patternStr, byte(escape)) - return boolToInt64(pattern.DoMatch(valStr)), false, nil } - return boolToInt64(b.pattern.DoMatch(valStr)), false, nil + return boolToInt64(pattern.DoMatch(valStr)), false, nil } diff --git a/pkg/expression/builtin_like_vec.go b/pkg/expression/builtin_like_vec.go index b3243d69d55b6..fbd9716f346a6 100644 --- a/pkg/expression/builtin_like_vec.go +++ b/pkg/expression/builtin_like_vec.go @@ -15,7 +15,6 @@ package expression import ( - "github.com/pingcap/tidb/pkg/sessionctx" "github.com/pingcap/tidb/pkg/util/chunk" ) @@ -23,7 +22,7 @@ func (b *builtinLikeSig) vectorized() bool { return true } -func (b *builtinLikeSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinLikeSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() bufVal, err := b.bufAllocator.get() if err != nil { diff --git a/pkg/expression/builtin_math.go b/pkg/expression/builtin_math.go index a08cb5104d1de..028c61fe4e98a 100644 --- a/pkg/expression/builtin_math.go +++ b/pkg/expression/builtin_math.go @@ -175,7 +175,7 @@ func (b *builtinAbsRealSig) Clone() builtinFunc { // evalReal evals ABS(value). // See https://dev.mysql.com/doc/refman/5.7/en/mathematical-functions.html#function_abs -func (b *builtinAbsRealSig) evalReal(ctx sessionctx.Context, row chunk.Row) (float64, bool, error) { +func (b *builtinAbsRealSig) evalReal(ctx EvalContext, row chunk.Row) (float64, bool, error) { val, isNull, err := b.args[0].EvalReal(ctx, row) if isNull || err != nil { return 0, isNull, err @@ -195,7 +195,7 @@ func (b *builtinAbsIntSig) Clone() builtinFunc { // evalInt evals ABS(value). // See https://dev.mysql.com/doc/refman/5.7/en/mathematical-functions.html#function_abs -func (b *builtinAbsIntSig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinAbsIntSig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { val, isNull, err := b.args[0].EvalInt(ctx, row) if isNull || err != nil { return 0, isNull, err @@ -221,7 +221,7 @@ func (b *builtinAbsUIntSig) Clone() builtinFunc { // evalInt evals ABS(value). // See https://dev.mysql.com/doc/refman/5.7/en/mathematical-functions.html#function_abs -func (b *builtinAbsUIntSig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinAbsUIntSig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { return b.args[0].EvalInt(ctx, row) } @@ -237,7 +237,7 @@ func (b *builtinAbsDecSig) Clone() builtinFunc { // evalDecimal evals ABS(value). // See https://dev.mysql.com/doc/refman/5.7/en/mathematical-functions.html#function_abs -func (b *builtinAbsDecSig) evalDecimal(ctx sessionctx.Context, row chunk.Row) (*types.MyDecimal, bool, error) { +func (b *builtinAbsDecSig) evalDecimal(ctx EvalContext, row chunk.Row) (*types.MyDecimal, bool, error) { val, isNull, err := b.args[0].EvalDecimal(ctx, row) if isNull || err != nil { return nil, isNull, err @@ -352,7 +352,7 @@ func (b *builtinRoundRealSig) Clone() builtinFunc { // evalReal evals ROUND(value). // See https://dev.mysql.com/doc/refman/5.7/en/mathematical-functions.html#function_round -func (b *builtinRoundRealSig) evalReal(ctx sessionctx.Context, row chunk.Row) (float64, bool, error) { +func (b *builtinRoundRealSig) evalReal(ctx EvalContext, row chunk.Row) (float64, bool, error) { val, isNull, err := b.args[0].EvalReal(ctx, row) if isNull || err != nil { return 0, isNull, err @@ -372,7 +372,7 @@ func (b *builtinRoundIntSig) Clone() builtinFunc { // evalInt evals ROUND(value). // See https://dev.mysql.com/doc/refman/5.7/en/mathematical-functions.html#function_round -func (b *builtinRoundIntSig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinRoundIntSig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { return b.args[0].EvalInt(ctx, row) } @@ -388,7 +388,7 @@ func (b *builtinRoundDecSig) Clone() builtinFunc { // evalDecimal evals ROUND(value). // See https://dev.mysql.com/doc/refman/5.7/en/mathematical-functions.html#function_round -func (b *builtinRoundDecSig) evalDecimal(ctx sessionctx.Context, row chunk.Row) (*types.MyDecimal, bool, error) { +func (b *builtinRoundDecSig) evalDecimal(ctx EvalContext, row chunk.Row) (*types.MyDecimal, bool, error) { val, isNull, err := b.args[0].EvalDecimal(ctx, row) if isNull || err != nil { return nil, isNull, err @@ -412,7 +412,7 @@ func (b *builtinRoundWithFracRealSig) Clone() builtinFunc { // evalReal evals ROUND(value, frac). // See https://dev.mysql.com/doc/refman/5.7/en/mathematical-functions.html#function_round -func (b *builtinRoundWithFracRealSig) evalReal(ctx sessionctx.Context, row chunk.Row) (float64, bool, error) { +func (b *builtinRoundWithFracRealSig) evalReal(ctx EvalContext, row chunk.Row) (float64, bool, error) { val, isNull, err := b.args[0].EvalReal(ctx, row) if isNull || err != nil { return 0, isNull, err @@ -436,7 +436,7 @@ func (b *builtinRoundWithFracIntSig) Clone() builtinFunc { // evalInt evals ROUND(value, frac). // See https://dev.mysql.com/doc/refman/5.7/en/mathematical-functions.html#function_round -func (b *builtinRoundWithFracIntSig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinRoundWithFracIntSig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { val, isNull, err := b.args[0].EvalInt(ctx, row) if isNull || err != nil { return 0, isNull, err @@ -460,7 +460,7 @@ func (b *builtinRoundWithFracDecSig) Clone() builtinFunc { // evalDecimal evals ROUND(value, frac). // See https://dev.mysql.com/doc/refman/5.7/en/mathematical-functions.html#function_round -func (b *builtinRoundWithFracDecSig) evalDecimal(ctx sessionctx.Context, row chunk.Row) (*types.MyDecimal, bool, error) { +func (b *builtinRoundWithFracDecSig) evalDecimal(ctx EvalContext, row chunk.Row) (*types.MyDecimal, bool, error) { val, isNull, err := b.args[0].EvalDecimal(ctx, row) if isNull || err != nil { return nil, isNull, err @@ -533,7 +533,7 @@ func (b *builtinCeilRealSig) Clone() builtinFunc { // evalReal evals a builtinCeilRealSig. // See https://dev.mysql.com/doc/refman/5.7/en/mathematical-functions.html#function_ceil -func (b *builtinCeilRealSig) evalReal(ctx sessionctx.Context, row chunk.Row) (float64, bool, error) { +func (b *builtinCeilRealSig) evalReal(ctx EvalContext, row chunk.Row) (float64, bool, error) { val, isNull, err := b.args[0].EvalReal(ctx, row) if isNull || err != nil { return 0, isNull, err @@ -553,7 +553,7 @@ func (b *builtinCeilIntToIntSig) Clone() builtinFunc { // evalInt evals a builtinCeilIntToIntSig. // See https://dev.mysql.com/doc/refman/5.7/en/mathematical-functions.html#function_ceil -func (b *builtinCeilIntToIntSig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinCeilIntToIntSig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { return b.args[0].EvalInt(ctx, row) } @@ -569,7 +569,7 @@ func (b *builtinCeilIntToDecSig) Clone() builtinFunc { // evalDecimal evals a builtinCeilIntToDecSig. // See https://dev.mysql.com/doc/refman/5.7/en/mathematical-functions.html#function_Ceil -func (b *builtinCeilIntToDecSig) evalDecimal(ctx sessionctx.Context, row chunk.Row) (*types.MyDecimal, bool, error) { +func (b *builtinCeilIntToDecSig) evalDecimal(ctx EvalContext, row chunk.Row) (*types.MyDecimal, bool, error) { val, isNull, err := b.args[0].EvalInt(ctx, row) if isNull || err != nil { return nil, true, err @@ -593,7 +593,7 @@ func (b *builtinCeilDecToIntSig) Clone() builtinFunc { // evalInt evals a builtinCeilDecToIntSig. // Ceil receives -func (b *builtinCeilDecToIntSig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinCeilDecToIntSig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { val, isNull, err := b.args[0].EvalDecimal(ctx, row) if isNull || err != nil { return 0, isNull, err @@ -620,7 +620,7 @@ func (b *builtinCeilDecToDecSig) Clone() builtinFunc { } // evalDecimal evals a builtinCeilDecToDecSig. -func (b *builtinCeilDecToDecSig) evalDecimal(ctx sessionctx.Context, row chunk.Row) (*types.MyDecimal, bool, error) { +func (b *builtinCeilDecToDecSig) evalDecimal(ctx EvalContext, row chunk.Row) (*types.MyDecimal, bool, error) { val, isNull, err := b.args[0].EvalDecimal(ctx, row) if isNull || err != nil { return nil, isNull, err @@ -724,7 +724,7 @@ func (b *builtinFloorRealSig) Clone() builtinFunc { // evalReal evals a builtinFloorRealSig. // See https://dev.mysql.com/doc/refman/5.7/en/mathematical-functions.html#function_floor -func (b *builtinFloorRealSig) evalReal(ctx sessionctx.Context, row chunk.Row) (float64, bool, error) { +func (b *builtinFloorRealSig) evalReal(ctx EvalContext, row chunk.Row) (float64, bool, error) { val, isNull, err := b.args[0].EvalReal(ctx, row) if isNull || err != nil { return 0, isNull, err @@ -744,7 +744,7 @@ func (b *builtinFloorIntToIntSig) Clone() builtinFunc { // evalInt evals a builtinFloorIntToIntSig. // See https://dev.mysql.com/doc/refman/5.7/en/mathematical-functions.html#function_floor -func (b *builtinFloorIntToIntSig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinFloorIntToIntSig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { return b.args[0].EvalInt(ctx, row) } @@ -760,7 +760,7 @@ func (b *builtinFloorIntToDecSig) Clone() builtinFunc { // evalDecimal evals a builtinFloorIntToDecSig. // See https://dev.mysql.com/doc/refman/5.7/en/mathematical-functions.html#function_floor -func (b *builtinFloorIntToDecSig) evalDecimal(ctx sessionctx.Context, row chunk.Row) (*types.MyDecimal, bool, error) { +func (b *builtinFloorIntToDecSig) evalDecimal(ctx EvalContext, row chunk.Row) (*types.MyDecimal, bool, error) { val, isNull, err := b.args[0].EvalInt(ctx, row) if isNull || err != nil { return nil, true, err @@ -784,7 +784,7 @@ func (b *builtinFloorDecToIntSig) Clone() builtinFunc { // evalInt evals a builtinFloorDecToIntSig. // floor receives -func (b *builtinFloorDecToIntSig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinFloorDecToIntSig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { val, isNull, err := b.args[0].EvalDecimal(ctx, row) if isNull || err != nil { return 0, isNull, err @@ -811,7 +811,7 @@ func (b *builtinFloorDecToDecSig) Clone() builtinFunc { } // evalDecimal evals a builtinFloorDecToDecSig. -func (b *builtinFloorDecToDecSig) evalDecimal(ctx sessionctx.Context, row chunk.Row) (*types.MyDecimal, bool, error) { +func (b *builtinFloorDecToDecSig) evalDecimal(ctx EvalContext, row chunk.Row) (*types.MyDecimal, bool, error) { val, isNull, err := b.args[0].EvalDecimal(ctx, row) if isNull || err != nil { return nil, true, err @@ -882,7 +882,7 @@ func (b *builtinLog1ArgSig) Clone() builtinFunc { // evalReal evals a builtinLog1ArgSig, corresponding to log(x). // See https://dev.mysql.com/doc/refman/5.7/en/mathematical-functions.html#function_log -func (b *builtinLog1ArgSig) evalReal(ctx sessionctx.Context, row chunk.Row) (float64, bool, error) { +func (b *builtinLog1ArgSig) evalReal(ctx EvalContext, row chunk.Row) (float64, bool, error) { val, isNull, err := b.args[0].EvalReal(ctx, row) if isNull || err != nil { return 0, isNull, err @@ -906,7 +906,7 @@ func (b *builtinLog2ArgsSig) Clone() builtinFunc { // evalReal evals a builtinLog2ArgsSig, corresponding to log(b, x). // See https://dev.mysql.com/doc/refman/5.7/en/mathematical-functions.html#function_log -func (b *builtinLog2ArgsSig) evalReal(ctx sessionctx.Context, row chunk.Row) (float64, bool, error) { +func (b *builtinLog2ArgsSig) evalReal(ctx EvalContext, row chunk.Row) (float64, bool, error) { val1, isNull, err := b.args[0].EvalReal(ctx, row) if isNull || err != nil { return 0, isNull, err @@ -954,7 +954,7 @@ func (b *builtinLog2Sig) Clone() builtinFunc { // evalReal evals a builtinLog2Sig. // See https://dev.mysql.com/doc/refman/5.7/en/mathematical-functions.html#function_log2 -func (b *builtinLog2Sig) evalReal(ctx sessionctx.Context, row chunk.Row) (float64, bool, error) { +func (b *builtinLog2Sig) evalReal(ctx EvalContext, row chunk.Row) (float64, bool, error) { val, isNull, err := b.args[0].EvalReal(ctx, row) if isNull || err != nil { return 0, isNull, err @@ -995,7 +995,7 @@ func (b *builtinLog10Sig) Clone() builtinFunc { // evalReal evals a builtinLog10Sig. // See https://dev.mysql.com/doc/refman/5.7/en/mathematical-functions.html#function_log10 -func (b *builtinLog10Sig) evalReal(ctx sessionctx.Context, row chunk.Row) (float64, bool, error) { +func (b *builtinLog10Sig) evalReal(ctx EvalContext, row chunk.Row) (float64, bool, error) { val, isNull, err := b.args[0].EvalReal(ctx, row) if isNull || err != nil { return 0, isNull, err @@ -1064,7 +1064,7 @@ func (b *builtinRandSig) Clone() builtinFunc { // evalReal evals RAND(). // See https://dev.mysql.com/doc/refman/5.7/en/mathematical-functions.html#function_rand -func (b *builtinRandSig) evalReal(ctx sessionctx.Context, row chunk.Row) (float64, bool, error) { +func (b *builtinRandSig) evalReal(ctx EvalContext, row chunk.Row) (float64, bool, error) { res := b.mysqlRng.Gen() return res, false, nil } @@ -1081,7 +1081,7 @@ func (b *builtinRandWithSeedFirstGenSig) Clone() builtinFunc { // evalReal evals RAND(N). // See https://dev.mysql.com/doc/refman/5.7/en/mathematical-functions.html#function_rand -func (b *builtinRandWithSeedFirstGenSig) evalReal(ctx sessionctx.Context, row chunk.Row) (float64, bool, error) { +func (b *builtinRandWithSeedFirstGenSig) evalReal(ctx EvalContext, row chunk.Row) (float64, bool, error) { seed, isNull, err := b.args[0].EvalInt(ctx, row) if err != nil { return 0, true, err @@ -1127,7 +1127,7 @@ func (b *builtinPowSig) Clone() builtinFunc { // evalReal evals POW(x, y). // See https://dev.mysql.com/doc/refman/5.7/en/mathematical-functions.html#function_pow -func (b *builtinPowSig) evalReal(ctx sessionctx.Context, row chunk.Row) (float64, bool, error) { +func (b *builtinPowSig) evalReal(ctx EvalContext, row chunk.Row) (float64, bool, error) { x, isNull, err := b.args[0].EvalReal(ctx, row) if isNull || err != nil { return 0, isNull, err @@ -1181,7 +1181,7 @@ func (b *builtinConvSig) Clone() builtinFunc { // evalString evals CONV(N,from_base,to_base). // See https://dev.mysql.com/doc/refman/5.7/en/mathematical-functions.html#function_conv. -func (b *builtinConvSig) evalString(ctx sessionctx.Context, row chunk.Row) (res string, isNull bool, err error) { +func (b *builtinConvSig) evalString(ctx EvalContext, row chunk.Row) (res string, isNull bool, err error) { var str string switch x := b.args[0].(type) { case *Constant: @@ -1317,7 +1317,7 @@ func (b *builtinCRC32Sig) Clone() builtinFunc { // evalInt evals a CRC32(expr). // See https://dev.mysql.com/doc/refman/5.7/en/mathematical-functions.html#function_crc32 -func (b *builtinCRC32Sig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinCRC32Sig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { x, isNull, err := b.args[0].EvalString(ctx, row) if isNull || err != nil { return 0, isNull, err @@ -1355,7 +1355,7 @@ func (b *builtinSignSig) Clone() builtinFunc { // evalInt evals SIGN(v). // See https://dev.mysql.com/doc/refman/5.7/en/mathematical-functions.html#function_sign -func (b *builtinSignSig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinSignSig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { val, isNull, err := b.args[0].EvalReal(ctx, row) if isNull || err != nil { return 0, isNull, err @@ -1397,7 +1397,7 @@ func (b *builtinSqrtSig) Clone() builtinFunc { // evalReal evals a SQRT(x). // See https://dev.mysql.com/doc/refman/5.7/en/mathematical-functions.html#function_sqrt -func (b *builtinSqrtSig) evalReal(ctx sessionctx.Context, row chunk.Row) (float64, bool, error) { +func (b *builtinSqrtSig) evalReal(ctx EvalContext, row chunk.Row) (float64, bool, error) { val, isNull, err := b.args[0].EvalReal(ctx, row) if isNull || err != nil { return 0, isNull, err @@ -1437,7 +1437,7 @@ func (b *builtinAcosSig) Clone() builtinFunc { // evalReal evals a builtinAcosSig. // See https://dev.mysql.com/doc/refman/5.7/en/mathematical-functions.html#function_acos -func (b *builtinAcosSig) evalReal(ctx sessionctx.Context, row chunk.Row) (float64, bool, error) { +func (b *builtinAcosSig) evalReal(ctx EvalContext, row chunk.Row) (float64, bool, error) { val, isNull, err := b.args[0].EvalReal(ctx, row) if isNull || err != nil { return 0, isNull, err @@ -1478,7 +1478,7 @@ func (b *builtinAsinSig) Clone() builtinFunc { // evalReal evals a builtinAsinSig. // See https://dev.mysql.com/doc/refman/5.7/en/mathematical-functions.html#function_asin -func (b *builtinAsinSig) evalReal(ctx sessionctx.Context, row chunk.Row) (float64, bool, error) { +func (b *builtinAsinSig) evalReal(ctx EvalContext, row chunk.Row) (float64, bool, error) { val, isNull, err := b.args[0].EvalReal(ctx, row) if isNull || err != nil { return 0, isNull, err @@ -1541,7 +1541,7 @@ func (b *builtinAtan1ArgSig) Clone() builtinFunc { // evalReal evals a builtinAtan1ArgSig, corresponding to atan(x). // See https://dev.mysql.com/doc/refman/5.7/en/mathematical-functions.html#function_atan -func (b *builtinAtan1ArgSig) evalReal(ctx sessionctx.Context, row chunk.Row) (float64, bool, error) { +func (b *builtinAtan1ArgSig) evalReal(ctx EvalContext, row chunk.Row) (float64, bool, error) { val, isNull, err := b.args[0].EvalReal(ctx, row) if isNull || err != nil { return 0, isNull, err @@ -1562,7 +1562,7 @@ func (b *builtinAtan2ArgsSig) Clone() builtinFunc { // evalReal evals a builtinAtan1ArgSig, corresponding to atan(y, x). // See https://dev.mysql.com/doc/refman/5.7/en/mathematical-functions.html#function_atan -func (b *builtinAtan2ArgsSig) evalReal(ctx sessionctx.Context, row chunk.Row) (float64, bool, error) { +func (b *builtinAtan2ArgsSig) evalReal(ctx EvalContext, row chunk.Row) (float64, bool, error) { val1, isNull, err := b.args[0].EvalReal(ctx, row) if isNull || err != nil { return 0, isNull, err @@ -1605,7 +1605,7 @@ func (b *builtinCosSig) Clone() builtinFunc { // evalReal evals a builtinCosSig. // See https://dev.mysql.com/doc/refman/5.7/en/mathematical-functions.html#function_cos -func (b *builtinCosSig) evalReal(ctx sessionctx.Context, row chunk.Row) (float64, bool, error) { +func (b *builtinCosSig) evalReal(ctx EvalContext, row chunk.Row) (float64, bool, error) { val, isNull, err := b.args[0].EvalReal(ctx, row) if isNull || err != nil { return 0, isNull, err @@ -1642,7 +1642,7 @@ func (b *builtinCotSig) Clone() builtinFunc { // evalReal evals a builtinCotSig. // See https://dev.mysql.com/doc/refman/5.7/en/mathematical-functions.html#function_cot -func (b *builtinCotSig) evalReal(ctx sessionctx.Context, row chunk.Row) (float64, bool, error) { +func (b *builtinCotSig) evalReal(ctx EvalContext, row chunk.Row) (float64, bool, error) { val, isNull, err := b.args[0].EvalReal(ctx, row) if isNull || err != nil { return 0, isNull, err @@ -1687,7 +1687,7 @@ func (b *builtinDegreesSig) Clone() builtinFunc { // evalReal evals a builtinDegreesSig. // See https://dev.mysql.com/doc/refman/5.7/en/mathematical-functions.html#function_degrees -func (b *builtinDegreesSig) evalReal(ctx sessionctx.Context, row chunk.Row) (float64, bool, error) { +func (b *builtinDegreesSig) evalReal(ctx EvalContext, row chunk.Row) (float64, bool, error) { val, isNull, err := b.args[0].EvalReal(ctx, row) if isNull || err != nil { return 0, isNull, err @@ -1725,7 +1725,7 @@ func (b *builtinExpSig) Clone() builtinFunc { // evalReal evals a builtinExpSig. // See https://dev.mysql.com/doc/refman/5.7/en/mathematical-functions.html#function_exp -func (b *builtinExpSig) evalReal(ctx sessionctx.Context, row chunk.Row) (float64, bool, error) { +func (b *builtinExpSig) evalReal(ctx EvalContext, row chunk.Row) (float64, bool, error) { val, isNull, err := b.args[0].EvalReal(ctx, row) if isNull || err != nil { return 0, isNull, err @@ -1775,7 +1775,7 @@ func (b *builtinPISig) Clone() builtinFunc { // evalReal evals a builtinPISig. // See https://dev.mysql.com/doc/refman/5.7/en/mathematical-functions.html#function_pi -func (b *builtinPISig) evalReal(ctx sessionctx.Context, row chunk.Row) (float64, bool, error) { +func (b *builtinPISig) evalReal(ctx EvalContext, row chunk.Row) (float64, bool, error) { return float64(math.Pi), false, nil } @@ -1808,7 +1808,7 @@ func (b *builtinRadiansSig) Clone() builtinFunc { // evalReal evals RADIANS(X). // See https://dev.mysql.com/doc/refman/5.7/en/mathematical-functions.html#function_radians -func (b *builtinRadiansSig) evalReal(ctx sessionctx.Context, row chunk.Row) (float64, bool, error) { +func (b *builtinRadiansSig) evalReal(ctx EvalContext, row chunk.Row) (float64, bool, error) { x, isNull, err := b.args[0].EvalReal(ctx, row) if isNull || err != nil { return 0, isNull, err @@ -1845,7 +1845,7 @@ func (b *builtinSinSig) Clone() builtinFunc { // evalReal evals a builtinSinSig. // See https://dev.mysql.com/doc/refman/5.7/en/mathematical-functions.html#function_sin -func (b *builtinSinSig) evalReal(ctx sessionctx.Context, row chunk.Row) (float64, bool, error) { +func (b *builtinSinSig) evalReal(ctx EvalContext, row chunk.Row) (float64, bool, error) { val, isNull, err := b.args[0].EvalReal(ctx, row) if isNull || err != nil { return 0, isNull, err @@ -1882,7 +1882,7 @@ func (b *builtinTanSig) Clone() builtinFunc { // evalReal evals a builtinTanSig. // See https://dev.mysql.com/doc/refman/5.7/en/mathematical-functions.html#function_tan -func (b *builtinTanSig) evalReal(ctx sessionctx.Context, row chunk.Row) (float64, bool, error) { +func (b *builtinTanSig) evalReal(ctx EvalContext, row chunk.Row) (float64, bool, error) { val, isNull, err := b.args[0].EvalReal(ctx, row) if isNull || err != nil { return 0, isNull, err @@ -1950,7 +1950,7 @@ func (b *builtinTruncateDecimalSig) Clone() builtinFunc { // evalDecimal evals a TRUNCATE(X,D). // See https://dev.mysql.com/doc/refman/5.7/en/mathematical-functions.html#function_truncate -func (b *builtinTruncateDecimalSig) evalDecimal(ctx sessionctx.Context, row chunk.Row) (*types.MyDecimal, bool, error) { +func (b *builtinTruncateDecimalSig) evalDecimal(ctx EvalContext, row chunk.Row) (*types.MyDecimal, bool, error) { x, isNull, err := b.args[0].EvalDecimal(ctx, row) if isNull || err != nil { return nil, isNull, err @@ -1980,7 +1980,7 @@ func (b *builtinTruncateRealSig) Clone() builtinFunc { // evalReal evals a TRUNCATE(X,D). // See https://dev.mysql.com/doc/refman/5.7/en/mathematical-functions.html#function_truncate -func (b *builtinTruncateRealSig) evalReal(ctx sessionctx.Context, row chunk.Row) (float64, bool, error) { +func (b *builtinTruncateRealSig) evalReal(ctx EvalContext, row chunk.Row) (float64, bool, error) { x, isNull, err := b.args[0].EvalReal(ctx, row) if isNull || err != nil { return 0, isNull, err @@ -2006,7 +2006,7 @@ func (b *builtinTruncateIntSig) Clone() builtinFunc { // evalInt evals a TRUNCATE(X,D). // See https://dev.mysql.com/doc/refman/5.7/en/mathematical-functions.html#function_truncate -func (b *builtinTruncateIntSig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinTruncateIntSig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { x, isNull, err := b.args[0].EvalInt(ctx, row) if isNull || err != nil { return 0, isNull, err @@ -2043,7 +2043,7 @@ type builtinTruncateUintSig struct { // evalInt evals a TRUNCATE(X,D). // See https://dev.mysql.com/doc/refman/5.7/en/mathematical-functions.html#function_truncate -func (b *builtinTruncateUintSig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinTruncateUintSig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { x, isNull, err := b.args[0].EvalInt(ctx, row) if isNull || err != nil { return 0, isNull, err diff --git a/pkg/expression/builtin_math_vec.go b/pkg/expression/builtin_math_vec.go index 48212309af233..41b85d8cc6bfd 100644 --- a/pkg/expression/builtin_math_vec.go +++ b/pkg/expression/builtin_math_vec.go @@ -21,13 +21,12 @@ import ( "strconv" "github.com/pingcap/tidb/pkg/parser/mysql" - "github.com/pingcap/tidb/pkg/sessionctx" "github.com/pingcap/tidb/pkg/types" "github.com/pingcap/tidb/pkg/util/chunk" "github.com/pingcap/tidb/pkg/util/mathutil" ) -func (b *builtinLog1ArgSig) vecEvalReal(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinLog1ArgSig) vecEvalReal(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { if err := b.args[0].VecEvalReal(ctx, input, result); err != nil { return err } @@ -50,7 +49,7 @@ func (b *builtinLog1ArgSig) vectorized() bool { return true } -func (b *builtinLog2Sig) vecEvalReal(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinLog2Sig) vecEvalReal(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { if err := b.args[0].VecEvalReal(ctx, input, result); err != nil { return err } @@ -73,7 +72,7 @@ func (b *builtinLog2Sig) vectorized() bool { return true } -func (b *builtinLog10Sig) vecEvalReal(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinLog10Sig) vecEvalReal(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { if err := b.args[0].VecEvalReal(ctx, input, result); err != nil { return err } @@ -96,7 +95,7 @@ func (b *builtinLog10Sig) vectorized() bool { return true } -func (b *builtinSqrtSig) vecEvalReal(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinSqrtSig) vecEvalReal(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { if err := b.args[0].VecEvalReal(ctx, input, result); err != nil { return err } @@ -118,7 +117,7 @@ func (b *builtinSqrtSig) vectorized() bool { return true } -func (b *builtinAcosSig) vecEvalReal(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinAcosSig) vecEvalReal(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { if err := b.args[0].VecEvalReal(ctx, input, result); err != nil { return err } @@ -140,7 +139,7 @@ func (b *builtinAcosSig) vectorized() bool { return true } -func (b *builtinAsinSig) vecEvalReal(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinAsinSig) vecEvalReal(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { if err := b.args[0].VecEvalReal(ctx, input, result); err != nil { return err } @@ -162,7 +161,7 @@ func (b *builtinAsinSig) vectorized() bool { return true } -func (b *builtinAtan1ArgSig) vecEvalReal(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinAtan1ArgSig) vecEvalReal(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { if err := b.args[0].VecEvalReal(ctx, input, result); err != nil { return err } @@ -180,7 +179,7 @@ func (b *builtinAtan1ArgSig) vectorized() bool { return true } -func (b *builtinAtan2ArgsSig) vecEvalReal(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinAtan2ArgsSig) vecEvalReal(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() if err := b.args[0].VecEvalReal(ctx, input, result); err != nil { return err @@ -213,7 +212,7 @@ func (b *builtinAtan2ArgsSig) vectorized() bool { return true } -func (b *builtinCosSig) vecEvalReal(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinCosSig) vecEvalReal(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { if err := b.args[0].VecEvalReal(ctx, input, result); err != nil { return err } @@ -231,7 +230,7 @@ func (b *builtinCosSig) vectorized() bool { return true } -func (b *builtinCotSig) vecEvalReal(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinCotSig) vecEvalReal(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { if err := b.args[0].VecEvalReal(ctx, input, result); err != nil { return err } @@ -259,7 +258,7 @@ func (b *builtinCotSig) vectorized() bool { return true } -func (b *builtinDegreesSig) vecEvalReal(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinDegreesSig) vecEvalReal(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { if err := b.args[0].VecEvalReal(ctx, input, result); err != nil { return err } @@ -277,7 +276,7 @@ func (b *builtinDegreesSig) vectorized() bool { return true } -func (b *builtinExpSig) vecEvalReal(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinExpSig) vecEvalReal(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { if err := b.args[0].VecEvalReal(ctx, input, result); err != nil { return err } @@ -302,7 +301,7 @@ func (b *builtinExpSig) vectorized() bool { return true } -func (b *builtinRadiansSig) vecEvalReal(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinRadiansSig) vecEvalReal(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { if err := b.args[0].VecEvalReal(ctx, input, result); err != nil { return err } @@ -320,7 +319,7 @@ func (b *builtinRadiansSig) vectorized() bool { return true } -func (b *builtinSinSig) vecEvalReal(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinSinSig) vecEvalReal(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { if err := b.args[0].VecEvalReal(ctx, input, result); err != nil { return err } @@ -338,7 +337,7 @@ func (b *builtinSinSig) vectorized() bool { return true } -func (b *builtinTanSig) vecEvalReal(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinTanSig) vecEvalReal(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { if err := b.args[0].VecEvalReal(ctx, input, result); err != nil { return err } @@ -356,7 +355,7 @@ func (b *builtinTanSig) vectorized() bool { return true } -func (b *builtinAbsDecSig) vecEvalDecimal(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinAbsDecSig) vecEvalDecimal(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { if err := b.args[0].VecEvalDecimal(ctx, input, result); err != nil { return err } @@ -381,7 +380,7 @@ func (b *builtinAbsDecSig) vectorized() bool { return true } -func (b *builtinRoundDecSig) vecEvalDecimal(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinRoundDecSig) vecEvalDecimal(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { if err := b.args[0].VecEvalDecimal(ctx, input, result); err != nil { return err } @@ -403,7 +402,7 @@ func (b *builtinRoundDecSig) vectorized() bool { return true } -func (b *builtinPowSig) vecEvalReal(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinPowSig) vecEvalReal(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf1, err := b.bufAllocator.get() if err != nil { @@ -439,7 +438,7 @@ func (b *builtinPowSig) vectorized() bool { return true } -func (b *builtinFloorRealSig) vecEvalReal(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinFloorRealSig) vecEvalReal(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { if err := b.args[0].VecEvalReal(ctx, input, result); err != nil { return err } @@ -457,7 +456,7 @@ func (b *builtinFloorRealSig) vectorized() bool { return true } -func (b *builtinLog2ArgsSig) vecEvalReal(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinLog2ArgsSig) vecEvalReal(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { if err := b.args[0].VecEvalReal(ctx, input, result); err != nil { return err } @@ -491,7 +490,7 @@ func (b *builtinLog2ArgsSig) vectorized() bool { return true } -func (b *builtinCeilRealSig) vecEvalReal(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinCeilRealSig) vecEvalReal(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { if err := b.args[0].VecEvalReal(ctx, input, result); err != nil { return err } @@ -509,7 +508,7 @@ func (b *builtinCeilRealSig) vectorized() bool { return true } -func (b *builtinRoundRealSig) vecEvalReal(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinRoundRealSig) vecEvalReal(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { if err := b.args[0].VecEvalReal(ctx, input, result); err != nil { return err } @@ -527,7 +526,7 @@ func (b *builtinRoundRealSig) vectorized() bool { return true } -func (b *builtinRoundWithFracRealSig) vecEvalReal(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinRoundWithFracRealSig) vecEvalReal(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { if err := b.args[0].VecEvalReal(ctx, input, result); err != nil { return err } @@ -557,7 +556,7 @@ func (b *builtinRoundWithFracRealSig) vectorized() bool { return true } -func (b *builtinTruncateRealSig) vecEvalReal(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinTruncateRealSig) vecEvalReal(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { if err := b.args[0].VecEvalReal(ctx, input, result); err != nil { return err } @@ -587,7 +586,7 @@ func (b *builtinTruncateRealSig) vectorized() bool { return true } -func (b *builtinAbsRealSig) vecEvalReal(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinAbsRealSig) vecEvalReal(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { if err := b.args[0].VecEvalReal(ctx, input, result); err != nil { return err } @@ -602,7 +601,7 @@ func (b *builtinAbsRealSig) vectorized() bool { return true } -func (b *builtinAbsIntSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinAbsIntSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { if err := b.args[0].VecEvalInt(ctx, input, result); err != nil { return err } @@ -625,7 +624,7 @@ func (b *builtinAbsIntSig) vectorized() bool { return true } -func (b *builtinRoundIntSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinRoundIntSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { return b.args[0].VecEvalInt(ctx, input, result) } @@ -633,7 +632,7 @@ func (b *builtinRoundIntSig) vectorized() bool { return true } -func (b *builtinRoundWithFracIntSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinRoundWithFracIntSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { if err := b.args[0].VecEvalInt(ctx, input, result); err != nil { return err } @@ -667,7 +666,7 @@ func (b *builtinCRC32Sig) vectorized() bool { return true } -func (b *builtinCRC32Sig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinCRC32Sig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -692,7 +691,7 @@ func (b *builtinPISig) vectorized() bool { return true } -func (b *builtinPISig) vecEvalReal(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinPISig) vecEvalReal(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() result.ResizeFloat64(n, false) f64s := result.Float64s() @@ -706,7 +705,7 @@ func (b *builtinRandSig) vectorized() bool { return true } -func (b *builtinRandSig) vecEvalReal(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinRandSig) vecEvalReal(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() result.ResizeFloat64(n, false) f64s := result.Float64s() @@ -720,7 +719,7 @@ func (b *builtinRandWithSeedFirstGenSig) vectorized() bool { return true } -func (b *builtinRandWithSeedFirstGenSig) vecEvalReal(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinRandWithSeedFirstGenSig) vecEvalReal(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -750,7 +749,7 @@ func (b *builtinCeilIntToDecSig) vectorized() bool { return true } -func (b *builtinCeilIntToDecSig) vecEvalDecimal(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinCeilIntToDecSig) vecEvalDecimal(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -784,7 +783,7 @@ func (b *builtinTruncateIntSig) vectorized() bool { return true } -func (b *builtinTruncateIntSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinTruncateIntSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { if err := b.args[0].VecEvalInt(ctx, input, result); err != nil { return err } @@ -827,7 +826,7 @@ func (b *builtinTruncateUintSig) vectorized() bool { return true } -func (b *builtinTruncateUintSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinTruncateUintSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { if err := b.args[0].VecEvalInt(ctx, input, result); err != nil { return err } @@ -872,7 +871,7 @@ func (b *builtinCeilDecToDecSig) vectorized() bool { return true } -func (b *builtinCeilDecToDecSig) vecEvalDecimal(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinCeilDecToDecSig) vecEvalDecimal(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() if err := b.args[0].VecEvalDecimal(ctx, input, result); err != nil { return err @@ -901,7 +900,7 @@ func (b *builtinFloorDecToDecSig) vectorized() bool { return true } -func (b *builtinFloorDecToDecSig) vecEvalDecimal(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinFloorDecToDecSig) vecEvalDecimal(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() if err := b.args[0].VecEvalDecimal(ctx, input, result); err != nil { return err @@ -936,7 +935,7 @@ func (b *builtinTruncateDecimalSig) vectorized() bool { return true } -func (b *builtinTruncateDecimalSig) vecEvalDecimal(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinTruncateDecimalSig) vecEvalDecimal(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() if err := b.args[0].VecEvalDecimal(ctx, input, result); err != nil { return err @@ -970,7 +969,7 @@ func (b *builtinRoundWithFracDecSig) vectorized() bool { return true } -func (b *builtinRoundWithFracDecSig) vecEvalDecimal(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinRoundWithFracDecSig) vecEvalDecimal(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() if err := b.args[0].VecEvalDecimal(ctx, input, result); err != nil { return err @@ -1005,7 +1004,7 @@ func (b *builtinFloorIntToDecSig) vectorized() bool { return true } -func (b *builtinFloorIntToDecSig) vecEvalDecimal(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinFloorIntToDecSig) vecEvalDecimal(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -1039,7 +1038,7 @@ func (b *builtinSignSig) vectorized() bool { return true } -func (b *builtinSignSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinSignSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -1073,7 +1072,7 @@ func (b *builtinConvSig) vectorized() bool { return false } -func (b *builtinConvSig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinConvSig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf1, err := b.bufAllocator.get() if err != nil { @@ -1124,7 +1123,7 @@ func (b *builtinAbsUIntSig) vectorized() bool { return true } -func (b *builtinAbsUIntSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinAbsUIntSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { return b.args[0].VecEvalInt(ctx, input, result) } @@ -1132,7 +1131,7 @@ func (b *builtinCeilDecToIntSig) vectorized() bool { return true } -func (b *builtinCeilDecToIntSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinCeilDecToIntSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -1170,7 +1169,7 @@ func (b *builtinCeilIntToIntSig) vectorized() bool { return true } -func (b *builtinCeilIntToIntSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinCeilIntToIntSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { return b.args[0].VecEvalInt(ctx, input, result) } @@ -1178,7 +1177,7 @@ func (b *builtinFloorIntToIntSig) vectorized() bool { return true } -func (b *builtinFloorIntToIntSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinFloorIntToIntSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { return b.args[0].VecEvalInt(ctx, input, result) } @@ -1186,7 +1185,7 @@ func (b *builtinFloorDecToIntSig) vectorized() bool { return true } -func (b *builtinFloorDecToIntSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinFloorDecToIntSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { diff --git a/pkg/expression/builtin_miscellaneous.go b/pkg/expression/builtin_miscellaneous.go index e086f78dc32e2..faa09a181323d 100644 --- a/pkg/expression/builtin_miscellaneous.go +++ b/pkg/expression/builtin_miscellaneous.go @@ -134,21 +134,21 @@ func (b *builtinSleepSig) Clone() builtinFunc { // evalInt evals a builtinSleepSig. // See https://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html#function_sleep -func (b *builtinSleepSig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinSleepSig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { val, isNull, err := b.args[0].EvalReal(ctx, row) if err != nil { return 0, isNull, err } sessVars := ctx.GetSessionVars() + ec := sessVars.StmtCtx.ErrCtx() if isNull || val < 0 { // for insert ignore stmt, the StrictSQLMode and ignoreErr should both be considered. - if !sessVars.StmtCtx.BadNullAsWarning { - return 0, false, errIncorrectArgs.GenWithStackByArgs("sleep") - } - err := errIncorrectArgs.GenWithStackByArgs("sleep") - sessVars.StmtCtx.AppendWarning(err) - return 0, false, nil + return 0, false, ec.HandleErrorWithAlias( + errBadNull, + errIncorrectArgs.GenWithStackByArgs("sleep"), + errIncorrectArgs.FastGenByArgs("sleep"), + ) } if val > math.MaxFloat64/float64(time.Second.Nanoseconds()) { @@ -191,7 +191,7 @@ func (b *builtinLockSig) Clone() builtinFunc { // evalInt evals a builtinLockSig. // See https://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html#function_get-lock -func (b *builtinLockSig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinLockSig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { lockName, isNull, err := b.args[0].EvalString(ctx, row) if err != nil { return 0, isNull, err @@ -216,7 +216,7 @@ func (b *builtinLockSig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, // We can't have a timeout greater than innodb_lock_wait_timeout. // So users are aware, we also attach a warning. if timeout < 0 || timeout > maxTimeout { - err := errTruncatedWrongValue.GenWithStackByArgs("get_lock", strconv.FormatInt(timeout, 10)) + err := errTruncatedWrongValue.FastGenByArgs("get_lock", strconv.FormatInt(timeout, 10)) ctx.GetSessionVars().StmtCtx.AppendWarning(err) timeout = maxTimeout } @@ -274,7 +274,7 @@ func (b *builtinReleaseLockSig) Clone() builtinFunc { // evalInt evals a builtinReleaseLockSig. // See https://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html#function_release-lock -func (b *builtinReleaseLockSig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinReleaseLockSig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { lockName, isNull, err := b.args[0].EvalString(ctx, row) if err != nil { return 0, isNull, err @@ -361,7 +361,7 @@ func (b *builtinDecimalAnyValueSig) Clone() builtinFunc { // evalDecimal evals a builtinDecimalAnyValueSig. // See https://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html#function_any-value -func (b *builtinDecimalAnyValueSig) evalDecimal(ctx sessionctx.Context, row chunk.Row) (*types.MyDecimal, bool, error) { +func (b *builtinDecimalAnyValueSig) evalDecimal(ctx EvalContext, row chunk.Row) (*types.MyDecimal, bool, error) { return b.args[0].EvalDecimal(ctx, row) } @@ -377,7 +377,7 @@ func (b *builtinDurationAnyValueSig) Clone() builtinFunc { // evalDuration evals a builtinDurationAnyValueSig. // See https://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html#function_any-value -func (b *builtinDurationAnyValueSig) evalDuration(ctx sessionctx.Context, row chunk.Row) (types.Duration, bool, error) { +func (b *builtinDurationAnyValueSig) evalDuration(ctx EvalContext, row chunk.Row) (types.Duration, bool, error) { return b.args[0].EvalDuration(ctx, row) } @@ -393,7 +393,7 @@ func (b *builtinIntAnyValueSig) Clone() builtinFunc { // evalInt evals a builtinIntAnyValueSig. // See https://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html#function_any-value -func (b *builtinIntAnyValueSig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinIntAnyValueSig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { return b.args[0].EvalInt(ctx, row) } @@ -409,7 +409,7 @@ func (b *builtinJSONAnyValueSig) Clone() builtinFunc { // evalJSON evals a builtinJSONAnyValueSig. // See https://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html#function_any-value -func (b *builtinJSONAnyValueSig) evalJSON(ctx sessionctx.Context, row chunk.Row) (types.BinaryJSON, bool, error) { +func (b *builtinJSONAnyValueSig) evalJSON(ctx EvalContext, row chunk.Row) (types.BinaryJSON, bool, error) { return b.args[0].EvalJSON(ctx, row) } @@ -425,7 +425,7 @@ func (b *builtinRealAnyValueSig) Clone() builtinFunc { // evalReal evals a builtinRealAnyValueSig. // See https://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html#function_any-value -func (b *builtinRealAnyValueSig) evalReal(ctx sessionctx.Context, row chunk.Row) (float64, bool, error) { +func (b *builtinRealAnyValueSig) evalReal(ctx EvalContext, row chunk.Row) (float64, bool, error) { return b.args[0].EvalReal(ctx, row) } @@ -441,7 +441,7 @@ func (b *builtinStringAnyValueSig) Clone() builtinFunc { // evalString evals a builtinStringAnyValueSig. // See https://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html#function_any-value -func (b *builtinStringAnyValueSig) evalString(ctx sessionctx.Context, row chunk.Row) (string, bool, error) { +func (b *builtinStringAnyValueSig) evalString(ctx EvalContext, row chunk.Row) (string, bool, error) { return b.args[0].EvalString(ctx, row) } @@ -457,7 +457,7 @@ func (b *builtinTimeAnyValueSig) Clone() builtinFunc { // evalTime evals a builtinTimeAnyValueSig. // See https://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html#function_any-value -func (b *builtinTimeAnyValueSig) evalTime(ctx sessionctx.Context, row chunk.Row) (types.Time, bool, error) { +func (b *builtinTimeAnyValueSig) evalTime(ctx EvalContext, row chunk.Row) (types.Time, bool, error) { return b.args[0].EvalTime(ctx, row) } @@ -500,7 +500,7 @@ func (b *builtinInetAtonSig) Clone() builtinFunc { // evalInt evals a builtinInetAtonSig. // See https://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html#function_inet-aton -func (b *builtinInetAtonSig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinInetAtonSig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { val, isNull, err := b.args[0].EvalString(ctx, row) if err != nil || isNull { return 0, true, err @@ -580,7 +580,7 @@ func (b *builtinInetNtoaSig) Clone() builtinFunc { // evalString evals a builtinInetNtoaSig. // See https://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html#function_inet-ntoa -func (b *builtinInetNtoaSig) evalString(ctx sessionctx.Context, row chunk.Row) (string, bool, error) { +func (b *builtinInetNtoaSig) evalString(ctx EvalContext, row chunk.Row) (string, bool, error) { val, isNull, err := b.args[0].EvalInt(ctx, row) if err != nil || isNull { return "", true, err @@ -633,7 +633,7 @@ func (b *builtinInet6AtonSig) Clone() builtinFunc { // evalString evals a builtinInet6AtonSig. // See https://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html#function_inet6-aton -func (b *builtinInet6AtonSig) evalString(ctx sessionctx.Context, row chunk.Row) (string, bool, error) { +func (b *builtinInet6AtonSig) evalString(ctx EvalContext, row chunk.Row) (string, bool, error) { val, isNull, err := b.args[0].EvalString(ctx, row) if err != nil || isNull { return "", true, err @@ -708,7 +708,7 @@ func (b *builtinInet6NtoaSig) Clone() builtinFunc { // evalString evals a builtinInet6NtoaSig. // See https://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html#function_inet6-ntoa -func (b *builtinInet6NtoaSig) evalString(ctx sessionctx.Context, row chunk.Row) (string, bool, error) { +func (b *builtinInet6NtoaSig) evalString(ctx EvalContext, row chunk.Row) (string, bool, error) { val, isNull, err := b.args[0].EvalString(ctx, row) if err != nil || isNull { return "", true, err @@ -753,7 +753,7 @@ func (b *builtinFreeLockSig) Clone() builtinFunc { } // See https://dev.mysql.com/doc/refman/8.0/en/locking-functions.html#function_is-free-lock -func (b *builtinFreeLockSig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinFreeLockSig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { lockName, isNull, err := b.args[0].EvalString(ctx, row) if err != nil { return 0, true, err @@ -809,7 +809,7 @@ func (b *builtinIsIPv4Sig) Clone() builtinFunc { // evalInt evals a builtinIsIPv4Sig. // See https://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html#function_is-ipv4 -func (b *builtinIsIPv4Sig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinIsIPv4Sig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { val, isNull, err := b.args[0].EvalString(ctx, row) if err != nil || isNull { return 0, err != nil, err @@ -877,7 +877,7 @@ func (b *builtinIsIPv4CompatSig) Clone() builtinFunc { // evalInt evals Is_IPv4_Compat // See https://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html#function_is-ipv4-compat -func (b *builtinIsIPv4CompatSig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinIsIPv4CompatSig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { val, isNull, err := b.args[0].EvalString(ctx, row) if err != nil || isNull { return 0, err != nil, err @@ -926,7 +926,7 @@ func (b *builtinIsIPv4MappedSig) Clone() builtinFunc { // evalInt evals Is_IPv4_Mapped // See https://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html#function_is-ipv4-mapped -func (b *builtinIsIPv4MappedSig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinIsIPv4MappedSig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { val, isNull, err := b.args[0].EvalString(ctx, row) if err != nil || isNull { return 0, err != nil, err @@ -975,7 +975,7 @@ func (b *builtinIsIPv6Sig) Clone() builtinFunc { // evalInt evals a builtinIsIPv6Sig. // See https://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html#function_is-ipv6 -func (b *builtinIsIPv6Sig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinIsIPv6Sig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { val, isNull, err := b.args[0].EvalString(ctx, row) if err != nil || isNull { return 0, err != nil, err @@ -1015,7 +1015,7 @@ func (b *builtinUsedLockSig) Clone() builtinFunc { } // See https://dev.mysql.com/doc/refman/8.0/en/locking-functions.html#function_is-used-lock -func (b *builtinUsedLockSig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinUsedLockSig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { lockName, isNull, err := b.args[0].EvalString(ctx, row) if err != nil { return 0, isNull, err @@ -1068,7 +1068,7 @@ func (b *builtinIsUUIDSig) Clone() builtinFunc { // evalInt evals a builtinIsUUIDSig. // See https://dev.mysql.com/doc/refman/8.0/en/miscellaneous-functions.html#function_is-uuid -func (b *builtinIsUUIDSig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinIsUUIDSig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { val, isNull, err := b.args[0].EvalString(ctx, row) if err != nil || isNull { return 0, isNull, err @@ -1138,7 +1138,7 @@ func (b *builtinNameConstDecimalSig) Clone() builtinFunc { return newSig } -func (b *builtinNameConstDecimalSig) evalDecimal(ctx sessionctx.Context, row chunk.Row) (*types.MyDecimal, bool, error) { +func (b *builtinNameConstDecimalSig) evalDecimal(ctx EvalContext, row chunk.Row) (*types.MyDecimal, bool, error) { return b.args[1].EvalDecimal(ctx, row) } @@ -1152,7 +1152,7 @@ func (b *builtinNameConstIntSig) Clone() builtinFunc { return newSig } -func (b *builtinNameConstIntSig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinNameConstIntSig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { return b.args[1].EvalInt(ctx, row) } @@ -1166,7 +1166,7 @@ func (b *builtinNameConstRealSig) Clone() builtinFunc { return newSig } -func (b *builtinNameConstRealSig) evalReal(ctx sessionctx.Context, row chunk.Row) (float64, bool, error) { +func (b *builtinNameConstRealSig) evalReal(ctx EvalContext, row chunk.Row) (float64, bool, error) { return b.args[1].EvalReal(ctx, row) } @@ -1180,7 +1180,7 @@ func (b *builtinNameConstStringSig) Clone() builtinFunc { return newSig } -func (b *builtinNameConstStringSig) evalString(ctx sessionctx.Context, row chunk.Row) (string, bool, error) { +func (b *builtinNameConstStringSig) evalString(ctx EvalContext, row chunk.Row) (string, bool, error) { return b.args[1].EvalString(ctx, row) } @@ -1194,7 +1194,7 @@ func (b *builtinNameConstJSONSig) Clone() builtinFunc { return newSig } -func (b *builtinNameConstJSONSig) evalJSON(ctx sessionctx.Context, row chunk.Row) (types.BinaryJSON, bool, error) { +func (b *builtinNameConstJSONSig) evalJSON(ctx EvalContext, row chunk.Row) (types.BinaryJSON, bool, error) { return b.args[1].EvalJSON(ctx, row) } @@ -1208,7 +1208,7 @@ func (b *builtinNameConstDurationSig) Clone() builtinFunc { return newSig } -func (b *builtinNameConstDurationSig) evalDuration(ctx sessionctx.Context, row chunk.Row) (types.Duration, bool, error) { +func (b *builtinNameConstDurationSig) evalDuration(ctx EvalContext, row chunk.Row) (types.Duration, bool, error) { return b.args[1].EvalDuration(ctx, row) } @@ -1222,7 +1222,7 @@ func (b *builtinNameConstTimeSig) Clone() builtinFunc { return newSig } -func (b *builtinNameConstTimeSig) evalTime(ctx sessionctx.Context, row chunk.Row) (types.Time, bool, error) { +func (b *builtinNameConstTimeSig) evalTime(ctx EvalContext, row chunk.Row) (types.Time, bool, error) { return b.args[1].EvalTime(ctx, row) } @@ -1255,7 +1255,7 @@ func (b *builtinReleaseAllLocksSig) Clone() builtinFunc { // evalInt evals a builtinReleaseAllLocksSig. // See https://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html#function_release-all-locks -func (b *builtinReleaseAllLocksSig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinReleaseAllLocksSig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { count := ctx.ReleaseAllAdvisoryLocks() return int64(count), false, nil } @@ -1293,7 +1293,7 @@ func (b *builtinUUIDSig) Clone() builtinFunc { // evalString evals a builtinUUIDSig. // See https://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html#function_uuid -func (b *builtinUUIDSig) evalString(ctx sessionctx.Context, row chunk.Row) (d string, isNull bool, err error) { +func (b *builtinUUIDSig) evalString(ctx EvalContext, row chunk.Row) (d string, isNull bool, err error) { var id uuid.UUID id, err = uuid.NewUUID() if err != nil { @@ -1344,7 +1344,7 @@ func (b *builtinVitessHashSig) Clone() builtinFunc { } // evalInt evals VITESS_HASH(int64). -func (b *builtinVitessHashSig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinVitessHashSig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { shardKeyInt, isNull, err := b.args[0].EvalInt(ctx, row) if isNull || err != nil { return 0, true, err @@ -1392,7 +1392,7 @@ func (b *builtinUUIDToBinSig) Clone() builtinFunc { // evalString evals UUID_TO_BIN(string_uuid, swap_flag). // See https://dev.mysql.com/doc/refman/8.0/en/miscellaneous-functions.html#function_uuid-to-bin -func (b *builtinUUIDToBinSig) evalString(ctx sessionctx.Context, row chunk.Row) (string, bool, error) { +func (b *builtinUUIDToBinSig) evalString(ctx EvalContext, row chunk.Row) (string, bool, error) { val, isNull, err := b.args[0].EvalString(ctx, row) if isNull || err != nil { return "", isNull, err @@ -1461,7 +1461,7 @@ func (b *builtinBinToUUIDSig) Clone() builtinFunc { // evalString evals BIN_TO_UUID(binary_uuid, swap_flag). // See https://dev.mysql.com/doc/refman/8.0/en/miscellaneous-functions.html#function_bin-to-uuid -func (b *builtinBinToUUIDSig) evalString(ctx sessionctx.Context, row chunk.Row) (string, bool, error) { +func (b *builtinBinToUUIDSig) evalString(ctx EvalContext, row chunk.Row) (string, bool, error) { val, isNull, err := b.args[0].EvalString(ctx, row) if isNull || err != nil { return "", isNull, err @@ -1544,7 +1544,7 @@ func (b *builtinTidbShardSig) Clone() builtinFunc { } // evalInt evals tidb_shard(int64). -func (b *builtinTidbShardSig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinTidbShardSig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { shardKeyInt, isNull, err := b.args[0].EvalInt(ctx, row) if isNull || err != nil { return 0, true, err diff --git a/pkg/expression/builtin_miscellaneous_vec.go b/pkg/expression/builtin_miscellaneous_vec.go index 9433fe9559271..64c5bdaf04d39 100644 --- a/pkg/expression/builtin_miscellaneous_vec.go +++ b/pkg/expression/builtin_miscellaneous_vec.go @@ -24,13 +24,12 @@ import ( "time" "github.com/google/uuid" - "github.com/pingcap/tidb/pkg/sessionctx" "github.com/pingcap/tidb/pkg/sessionctx/variable" "github.com/pingcap/tidb/pkg/util/chunk" "github.com/pingcap/tidb/pkg/util/vitess" ) -func (b *builtinInetNtoaSig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinInetNtoaSig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -66,7 +65,7 @@ func (b *builtinInetNtoaSig) vectorized() bool { return true } -func (b *builtinIsIPv4Sig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinIsIPv4Sig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -99,7 +98,7 @@ func (b *builtinJSONAnyValueSig) vectorized() bool { return true } -func (b *builtinJSONAnyValueSig) vecEvalJSON(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinJSONAnyValueSig) vecEvalJSON(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { return b.args[0].VecEvalJSON(ctx, input, result) } @@ -107,7 +106,7 @@ func (b *builtinRealAnyValueSig) vectorized() bool { return true } -func (b *builtinRealAnyValueSig) vecEvalReal(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinRealAnyValueSig) vecEvalReal(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { return b.args[0].VecEvalReal(ctx, input, result) } @@ -115,7 +114,7 @@ func (b *builtinStringAnyValueSig) vectorized() bool { return true } -func (b *builtinStringAnyValueSig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinStringAnyValueSig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { return b.args[0].VecEvalString(ctx, input, result) } @@ -123,7 +122,7 @@ func (b *builtinIsIPv6Sig) vectorized() bool { return true } -func (b *builtinIsIPv6Sig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinIsIPv6Sig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -158,7 +157,7 @@ func (b *builtinIsUUIDSig) vectorized() bool { return true } -func (b *builtinIsUUIDSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinIsUUIDSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -188,7 +187,7 @@ func (b *builtinNameConstStringSig) vectorized() bool { return true } -func (b *builtinNameConstStringSig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinNameConstStringSig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { return b.args[1].VecEvalString(ctx, input, result) } @@ -196,7 +195,7 @@ func (b *builtinDecimalAnyValueSig) vectorized() bool { return true } -func (b *builtinDecimalAnyValueSig) vecEvalDecimal(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinDecimalAnyValueSig) vecEvalDecimal(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { return b.args[0].VecEvalDecimal(ctx, input, result) } @@ -204,7 +203,7 @@ func (b *builtinUUIDSig) vectorized() bool { return true } -func (b *builtinUUIDSig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinUUIDSig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() result.ReserveString(n) var id uuid.UUID @@ -223,7 +222,7 @@ func (b *builtinNameConstDurationSig) vectorized() bool { return true } -func (b *builtinNameConstDurationSig) vecEvalDuration(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinNameConstDurationSig) vecEvalDuration(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { return b.args[1].VecEvalDuration(ctx, input, result) } @@ -231,7 +230,7 @@ func (b *builtinDurationAnyValueSig) vectorized() bool { return true } -func (b *builtinDurationAnyValueSig) vecEvalDuration(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinDurationAnyValueSig) vecEvalDuration(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { return b.args[0].VecEvalDuration(ctx, input, result) } @@ -239,7 +238,7 @@ func (b *builtinIntAnyValueSig) vectorized() bool { return true } -func (b *builtinIntAnyValueSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinIntAnyValueSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { return b.args[0].VecEvalInt(ctx, input, result) } @@ -247,7 +246,7 @@ func (b *builtinIsIPv4CompatSig) vectorized() bool { return true } -func (b *builtinIsIPv4CompatSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinIsIPv4CompatSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -284,7 +283,7 @@ func (b *builtinNameConstIntSig) vectorized() bool { return true } -func (b *builtinNameConstIntSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinNameConstIntSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { return b.args[1].VecEvalInt(ctx, input, result) } @@ -292,7 +291,7 @@ func (b *builtinNameConstTimeSig) vectorized() bool { return true } -func (b *builtinNameConstTimeSig) vecEvalTime(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinNameConstTimeSig) vecEvalTime(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { return b.args[1].VecEvalTime(ctx, input, result) } @@ -302,7 +301,7 @@ func (b *builtinSleepSig) vectorized() bool { // vecEvalInt evals a builtinSleepSig in a vectorized manner. // See https://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html#function_sleep -func (b *builtinSleepSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinSleepSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -318,6 +317,7 @@ func (b *builtinSleepSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result.ResizeInt64(n, false) i64s := result.Int64s() + ec := ctx.GetSessionVars().StmtCtx.ErrCtx() for i := 0; i < n; i++ { isNull := buf.IsNull(i) val := buf.GetFloat64(i) @@ -325,11 +325,13 @@ func (b *builtinSleepSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, sessVars := ctx.GetSessionVars() if isNull || val < 0 { // for insert ignore stmt, the StrictSQLMode and ignoreErr should both be considered. - if !sessVars.StmtCtx.BadNullAsWarning { - return errIncorrectArgs.GenWithStackByArgs("sleep") + err := ec.HandleErrorWithAlias(errBadNull, + errIncorrectArgs.GenWithStackByArgs("sleep"), + errIncorrectArgs.FastGenByArgs("sleep"), + ) + if err != nil { + return err } - err := errIncorrectArgs.GenWithStackByArgs("sleep") - sessVars.StmtCtx.AppendWarning(err) continue } @@ -378,7 +380,7 @@ func (b *builtinIsIPv4MappedSig) vectorized() bool { return true } -func (b *builtinIsIPv4MappedSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinIsIPv4MappedSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -415,7 +417,7 @@ func (b *builtinNameConstDecimalSig) vectorized() bool { return true } -func (b *builtinNameConstDecimalSig) vecEvalDecimal(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinNameConstDecimalSig) vecEvalDecimal(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { return b.args[1].VecEvalDecimal(ctx, input, result) } @@ -423,7 +425,7 @@ func (b *builtinNameConstJSONSig) vectorized() bool { return true } -func (b *builtinNameConstJSONSig) vecEvalJSON(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinNameConstJSONSig) vecEvalJSON(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { return b.args[1].VecEvalJSON(ctx, input, result) } @@ -433,7 +435,7 @@ func (b *builtinInet6AtonSig) vectorized() bool { // vecEvalString evals a builtinInet6AtonSig. // See https://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html#function_inet6-aton -func (b *builtinInet6AtonSig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinInet6AtonSig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -502,7 +504,7 @@ func (b *builtinTimeAnyValueSig) vectorized() bool { return true } -func (b *builtinTimeAnyValueSig) vecEvalTime(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinTimeAnyValueSig) vecEvalTime(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { return b.args[0].VecEvalTime(ctx, input, result) } @@ -510,7 +512,7 @@ func (b *builtinInetAtonSig) vectorized() bool { return true } -func (b *builtinInetAtonSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinInetAtonSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -583,7 +585,7 @@ func (b *builtinInet6NtoaSig) vectorized() bool { return true } -func (b *builtinInet6NtoaSig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinInet6NtoaSig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() val, err := b.bufAllocator.get() if err != nil { @@ -617,7 +619,7 @@ func (b *builtinNameConstRealSig) vectorized() bool { return true } -func (b *builtinNameConstRealSig) vecEvalReal(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinNameConstRealSig) vecEvalReal(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { return b.args[1].VecEvalReal(ctx, input, result) } @@ -625,7 +627,7 @@ func (b *builtinVitessHashSig) vectorized() bool { return true } -func (b *builtinVitessHashSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinVitessHashSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() column, err := b.bufAllocator.get() if err != nil { @@ -662,7 +664,7 @@ func (b *builtinUUIDToBinSig) vectorized() bool { // evalString evals UUID_TO_BIN(string_uuid, swap_flag). // See https://dev.mysql.com/doc/refman/8.0/en/miscellaneous-functions.html#function_uuid-to-bin -func (b *builtinUUIDToBinSig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinUUIDToBinSig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() valBuf, err := b.bufAllocator.get() if err != nil { @@ -720,7 +722,7 @@ func (b *builtinBinToUUIDSig) vectorized() bool { // evalString evals BIN_TO_UUID(binary_uuid, swap_flag). // See https://dev.mysql.com/doc/refman/8.0/en/miscellaneous-functions.html#function_bin-to-uuid -func (b *builtinBinToUUIDSig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinBinToUUIDSig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() valBuf, err := b.bufAllocator.get() if err != nil { diff --git a/pkg/expression/builtin_miscellaneous_vec_test.go b/pkg/expression/builtin_miscellaneous_vec_test.go index a7cf4ffd81026..4dc35f67bde21 100644 --- a/pkg/expression/builtin_miscellaneous_vec_test.go +++ b/pkg/expression/builtin_miscellaneous_vec_test.go @@ -18,6 +18,7 @@ import ( "testing" "time" + "github.com/pingcap/tidb/pkg/errctx" "github.com/pingcap/tidb/pkg/parser/ast" "github.com/pingcap/tidb/pkg/types" "github.com/pingcap/tidb/pkg/util/chunk" @@ -151,7 +152,9 @@ func TestSleepVectorized(t *testing.T) { warnCnt := counter{} // non-strict model - sessVars.StmtCtx.BadNullAsWarning = true + var levels errctx.LevelMap + levels[errctx.ErrGroupBadNull] = errctx.LevelWarn + sessVars.StmtCtx.SetErrLevels(levels) input.AppendFloat64(0, 1) err = f.vecEvalInt(ctx, input, result) require.NoError(t, err) @@ -184,7 +187,8 @@ func TestSleepVectorized(t *testing.T) { require.Equal(t, uint16(warnCnt.add(2)), sessVars.StmtCtx.WarningCount()) // for error case under the strict model - sessVars.StmtCtx.BadNullAsWarning = false + levels[errctx.ErrGroupBadNull] = errctx.LevelError + sessVars.StmtCtx.SetErrLevels(levels) input.Reset() input.AppendNull(0) err = f.vecEvalInt(ctx, input, result) diff --git a/pkg/expression/builtin_op.go b/pkg/expression/builtin_op.go index f03ef903e7db6..d7d8d4896c688 100644 --- a/pkg/expression/builtin_op.go +++ b/pkg/expression/builtin_op.go @@ -98,7 +98,7 @@ func (b *builtinLogicAndSig) Clone() builtinFunc { return newSig } -func (b *builtinLogicAndSig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinLogicAndSig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { arg0, isNull0, err := b.args[0].EvalInt(ctx, row) if err != nil || (!isNull0 && arg0 == 0) { return 0, err != nil, err @@ -151,7 +151,7 @@ func (b *builtinLogicOrSig) Clone() builtinFunc { return newSig } -func (b *builtinLogicOrSig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinLogicOrSig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { arg0, isNull0, err := b.args[0].EvalInt(ctx, row) if err != nil { return 0, true, err @@ -210,7 +210,7 @@ func (b *builtinLogicXorSig) Clone() builtinFunc { return newSig } -func (b *builtinLogicXorSig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinLogicXorSig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { arg0, isNull, err := b.args[0].EvalInt(ctx, row) if isNull || err != nil { return 0, isNull, err @@ -254,7 +254,7 @@ func (b *builtinBitAndSig) Clone() builtinFunc { return newSig } -func (b *builtinBitAndSig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinBitAndSig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { arg0, isNull, err := b.args[0].EvalInt(ctx, row) if isNull || err != nil { return 0, isNull, err @@ -295,7 +295,7 @@ func (b *builtinBitOrSig) Clone() builtinFunc { return newSig } -func (b *builtinBitOrSig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinBitOrSig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { arg0, isNull, err := b.args[0].EvalInt(ctx, row) if isNull || err != nil { return 0, isNull, err @@ -336,7 +336,7 @@ func (b *builtinBitXorSig) Clone() builtinFunc { return newSig } -func (b *builtinBitXorSig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinBitXorSig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { arg0, isNull, err := b.args[0].EvalInt(ctx, row) if isNull || err != nil { return 0, isNull, err @@ -377,7 +377,7 @@ func (b *builtinLeftShiftSig) Clone() builtinFunc { return newSig } -func (b *builtinLeftShiftSig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinLeftShiftSig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { arg0, isNull, err := b.args[0].EvalInt(ctx, row) if isNull || err != nil { return 0, isNull, err @@ -418,7 +418,7 @@ func (b *builtinRightShiftSig) Clone() builtinFunc { return newSig } -func (b *builtinRightShiftSig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinRightShiftSig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { arg0, isNull, err := b.args[0].EvalInt(ctx, row) if isNull || err != nil { return 0, isNull, err @@ -531,7 +531,7 @@ func (b *builtinRealIsTrueSig) Clone() builtinFunc { return newSig } -func (b *builtinRealIsTrueSig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinRealIsTrueSig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { input, isNull, err := b.args[0].EvalReal(ctx, row) if err != nil { return 0, true, err @@ -556,7 +556,7 @@ func (b *builtinDecimalIsTrueSig) Clone() builtinFunc { return newSig } -func (b *builtinDecimalIsTrueSig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinDecimalIsTrueSig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { input, isNull, err := b.args[0].EvalDecimal(ctx, row) if err != nil { return 0, true, err @@ -581,7 +581,7 @@ func (b *builtinIntIsTrueSig) Clone() builtinFunc { return newSig } -func (b *builtinIntIsTrueSig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinIntIsTrueSig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { input, isNull, err := b.args[0].EvalInt(ctx, row) if err != nil { return 0, true, err @@ -606,7 +606,7 @@ func (b *builtinRealIsFalseSig) Clone() builtinFunc { return newSig } -func (b *builtinRealIsFalseSig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinRealIsFalseSig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { input, isNull, err := b.args[0].EvalReal(ctx, row) if err != nil { return 0, true, err @@ -631,7 +631,7 @@ func (b *builtinDecimalIsFalseSig) Clone() builtinFunc { return newSig } -func (b *builtinDecimalIsFalseSig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinDecimalIsFalseSig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { input, isNull, err := b.args[0].EvalDecimal(ctx, row) if err != nil { return 0, true, err @@ -656,7 +656,7 @@ func (b *builtinIntIsFalseSig) Clone() builtinFunc { return newSig } -func (b *builtinIntIsFalseSig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinIntIsFalseSig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { input, isNull, err := b.args[0].EvalInt(ctx, row) if err != nil { return 0, true, err @@ -698,7 +698,7 @@ func (b *builtinBitNegSig) Clone() builtinFunc { return newSig } -func (b *builtinBitNegSig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinBitNegSig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { arg, isNull, err := b.args[0].EvalInt(ctx, row) if isNull || err != nil { return 0, isNull, err @@ -759,7 +759,7 @@ func (b *builtinUnaryNotRealSig) Clone() builtinFunc { return newSig } -func (b *builtinUnaryNotRealSig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinUnaryNotRealSig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { arg, isNull, err := b.args[0].EvalReal(ctx, row) if isNull || err != nil { return 0, true, err @@ -780,7 +780,7 @@ func (b *builtinUnaryNotDecimalSig) Clone() builtinFunc { return newSig } -func (b *builtinUnaryNotDecimalSig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinUnaryNotDecimalSig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { arg, isNull, err := b.args[0].EvalDecimal(ctx, row) if isNull || err != nil { return 0, true, err @@ -801,7 +801,7 @@ func (b *builtinUnaryNotIntSig) Clone() builtinFunc { return newSig } -func (b *builtinUnaryNotIntSig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinUnaryNotIntSig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { arg, isNull, err := b.args[0].EvalInt(ctx, row) if isNull || err != nil { return 0, true, err @@ -822,7 +822,7 @@ func (b *builtinUnaryNotJSONSig) Clone() builtinFunc { return newSig } -func (b *builtinUnaryNotJSONSig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinUnaryNotJSONSig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { arg, isNull, err := b.args[0].EvalJSON(ctx, row) if isNull || err != nil { return 0, true, err @@ -950,7 +950,7 @@ func (b *builtinUnaryMinusIntSig) Clone() builtinFunc { return newSig } -func (b *builtinUnaryMinusIntSig) evalInt(ctx sessionctx.Context, row chunk.Row) (res int64, isNull bool, err error) { +func (b *builtinUnaryMinusIntSig) evalInt(ctx EvalContext, row chunk.Row) (res int64, isNull bool, err error) { var val int64 val, isNull, err = b.args[0].EvalInt(ctx, row) if err != nil || isNull { @@ -982,7 +982,7 @@ func (b *builtinUnaryMinusDecimalSig) Clone() builtinFunc { return newSig } -func (b *builtinUnaryMinusDecimalSig) evalDecimal(ctx sessionctx.Context, row chunk.Row) (*types.MyDecimal, bool, error) { +func (b *builtinUnaryMinusDecimalSig) evalDecimal(ctx EvalContext, row chunk.Row) (*types.MyDecimal, bool, error) { dec, isNull, err := b.args[0].EvalDecimal(ctx, row) if err != nil || isNull { return dec, isNull, err @@ -1000,7 +1000,7 @@ func (b *builtinUnaryMinusRealSig) Clone() builtinFunc { return newSig } -func (b *builtinUnaryMinusRealSig) evalReal(ctx sessionctx.Context, row chunk.Row) (float64, bool, error) { +func (b *builtinUnaryMinusRealSig) evalReal(ctx EvalContext, row chunk.Row) (float64, bool, error) { val, isNull, err := b.args[0].EvalReal(ctx, row) return -val, isNull, err } @@ -1070,7 +1070,7 @@ func evalIsNull(isNull bool, err error) (int64, bool, error) { return 0, false, nil } -func (b *builtinDecimalIsNullSig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinDecimalIsNullSig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { _, isNull, err := b.args[0].EvalDecimal(ctx, row) return evalIsNull(isNull, err) } @@ -1085,7 +1085,7 @@ func (b *builtinDurationIsNullSig) Clone() builtinFunc { return newSig } -func (b *builtinDurationIsNullSig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinDurationIsNullSig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { _, isNull, err := b.args[0].EvalDuration(ctx, row) return evalIsNull(isNull, err) } @@ -1100,7 +1100,7 @@ func (b *builtinIntIsNullSig) Clone() builtinFunc { return newSig } -func (b *builtinIntIsNullSig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinIntIsNullSig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { _, isNull, err := b.args[0].EvalInt(ctx, row) return evalIsNull(isNull, err) } @@ -1115,7 +1115,7 @@ func (b *builtinRealIsNullSig) Clone() builtinFunc { return newSig } -func (b *builtinRealIsNullSig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinRealIsNullSig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { _, isNull, err := b.args[0].EvalReal(ctx, row) return evalIsNull(isNull, err) } @@ -1130,7 +1130,7 @@ func (b *builtinStringIsNullSig) Clone() builtinFunc { return newSig } -func (b *builtinStringIsNullSig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinStringIsNullSig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { _, isNull, err := b.args[0].EvalString(ctx, row) return evalIsNull(isNull, err) } @@ -1145,7 +1145,7 @@ func (b *builtinTimeIsNullSig) Clone() builtinFunc { return newSig } -func (b *builtinTimeIsNullSig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinTimeIsNullSig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { _, isNull, err := b.args[0].EvalTime(ctx, row) return evalIsNull(isNull, err) } diff --git a/pkg/expression/builtin_op_vec.go b/pkg/expression/builtin_op_vec.go index 609738a24d45a..7608725c67022 100644 --- a/pkg/expression/builtin_op_vec.go +++ b/pkg/expression/builtin_op_vec.go @@ -19,7 +19,6 @@ import ( "math" "github.com/pingcap/tidb/pkg/parser/mysql" - "github.com/pingcap/tidb/pkg/sessionctx" "github.com/pingcap/tidb/pkg/types" "github.com/pingcap/tidb/pkg/util/chunk" ) @@ -28,7 +27,7 @@ func (*builtinTimeIsNullSig) vectorized() bool { return true } -func (b *builtinTimeIsNullSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinTimeIsNullSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { numRows := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -56,7 +55,7 @@ func (b *builtinLogicOrSig) vectorized() bool { return true } -func (b *builtinLogicOrSig) fallbackEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinLogicOrSig) fallbackEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() result.ResizeInt64(n, false) x := result.Int64s() @@ -74,7 +73,7 @@ func (b *builtinLogicOrSig) fallbackEvalInt(ctx sessionctx.Context, input *chunk return nil } -func (b *builtinLogicOrSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinLogicOrSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { if err := b.args[0].VecEvalInt(ctx, input, result); err != nil { return err } @@ -127,7 +126,7 @@ func (b *builtinBitOrSig) vectorized() bool { return true } -func (b *builtinBitOrSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinBitOrSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { if err := b.args[0].VecEvalInt(ctx, input, result); err != nil { return err } @@ -153,7 +152,7 @@ func (b *builtinDecimalIsFalseSig) vectorized() bool { return true } -func (b *builtinDecimalIsFalseSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinDecimalIsFalseSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { numRows := input.NumRows() buf, err := b.bufAllocator.get() @@ -188,7 +187,7 @@ func (b *builtinIntIsFalseSig) vectorized() bool { return true } -func (b *builtinIntIsFalseSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinIntIsFalseSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { numRows := input.NumRows() if err := b.args[0].VecEvalInt(ctx, input, result); err != nil { return err @@ -215,7 +214,7 @@ func (b *builtinUnaryMinusRealSig) vectorized() bool { return true } -func (b *builtinUnaryMinusRealSig) vecEvalReal(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinUnaryMinusRealSig) vecEvalReal(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { var err error if err = b.args[0].VecEvalReal(ctx, input, result); err != nil { return err @@ -233,7 +232,7 @@ func (b *builtinBitNegSig) vectorized() bool { return true } -func (b *builtinBitNegSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinBitNegSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { if err := b.args[0].VecEvalInt(ctx, input, result); err != nil { return err } @@ -249,7 +248,7 @@ func (b *builtinUnaryMinusDecimalSig) vectorized() bool { return true } -func (b *builtinUnaryMinusDecimalSig) vecEvalDecimal(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinUnaryMinusDecimalSig) vecEvalDecimal(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { if err := b.args[0].VecEvalDecimal(ctx, input, result); err != nil { return err } @@ -269,7 +268,7 @@ func (b *builtinIntIsNullSig) vectorized() bool { return true } -func (b *builtinIntIsNullSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinIntIsNullSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { if err := b.args[0].VecEvalInt(ctx, input, result); err != nil { return err } @@ -290,7 +289,7 @@ func (b *builtinRealIsNullSig) vectorized() bool { return true } -func (b *builtinRealIsNullSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinRealIsNullSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { numRows := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -318,7 +317,7 @@ func (b *builtinUnaryNotRealSig) vectorized() bool { return true } -func (b *builtinUnaryNotRealSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinUnaryNotRealSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -350,7 +349,7 @@ func (b *builtinLogicAndSig) vectorized() bool { return true } -func (b *builtinLogicAndSig) fallbackEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinLogicAndSig) fallbackEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() result.ResizeInt64(n, false) x := result.Int64s() @@ -368,7 +367,7 @@ func (b *builtinLogicAndSig) fallbackEvalInt(ctx sessionctx.Context, input *chun return nil } -func (b *builtinLogicAndSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinLogicAndSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() if err := b.args[0].VecEvalInt(ctx, input, result); err != nil { @@ -424,7 +423,7 @@ func (b *builtinBitXorSig) vectorized() bool { return true } -func (b *builtinBitXorSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinBitXorSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { if err := b.args[0].VecEvalInt(ctx, input, result); err != nil { return err } @@ -450,7 +449,7 @@ func (b *builtinLogicXorSig) vectorized() bool { return true } -func (b *builtinLogicXorSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinLogicXorSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { if err := b.args[0].VecEvalInt(ctx, input, result); err != nil { return err } @@ -489,7 +488,7 @@ func (b *builtinBitAndSig) vectorized() bool { return true } -func (b *builtinBitAndSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinBitAndSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { if err := b.args[0].VecEvalInt(ctx, input, result); err != nil { return err } @@ -515,7 +514,7 @@ func (b *builtinRealIsFalseSig) vectorized() bool { return true } -func (b *builtinRealIsFalseSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinRealIsFalseSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { numRows := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -548,7 +547,7 @@ func (b *builtinUnaryMinusIntSig) vectorized() bool { return true } -func (b *builtinUnaryMinusIntSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinUnaryMinusIntSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { if err := b.args[0].VecEvalInt(ctx, input, result); err != nil { return err } @@ -582,7 +581,7 @@ func (b *builtinUnaryNotDecimalSig) vectorized() bool { return true } -func (b *builtinUnaryNotDecimalSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinUnaryNotDecimalSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -614,7 +613,7 @@ func (b *builtinUnaryNotIntSig) vectorized() bool { return true } -func (b *builtinUnaryNotIntSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinUnaryNotIntSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() if err := b.args[0].VecEvalInt(ctx, input, result); err != nil { return err @@ -638,7 +637,7 @@ func (b *builtinDecimalIsNullSig) vectorized() bool { return true } -func (b *builtinDecimalIsNullSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinDecimalIsNullSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { numRows := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -666,7 +665,7 @@ func (b *builtinLeftShiftSig) vectorized() bool { return true } -func (b *builtinLeftShiftSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinLeftShiftSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { if err := b.args[0].VecEvalInt(ctx, input, result); err != nil { return err } @@ -692,7 +691,7 @@ func (b *builtinRightShiftSig) vectorized() bool { return true } -func (b *builtinRightShiftSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinRightShiftSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { if err := b.args[0].VecEvalInt(ctx, input, result); err != nil { return err } @@ -718,7 +717,7 @@ func (b *builtinRealIsTrueSig) vectorized() bool { return true } -func (b *builtinRealIsTrueSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinRealIsTrueSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { numRows := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -751,7 +750,7 @@ func (b *builtinDecimalIsTrueSig) vectorized() bool { return true } -func (b *builtinDecimalIsTrueSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinDecimalIsTrueSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { numRows := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -785,7 +784,7 @@ func (b *builtinIntIsTrueSig) vectorized() bool { return true } -func (b *builtinIntIsTrueSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinIntIsTrueSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { numRows := input.NumRows() if err := b.args[0].VecEvalInt(ctx, input, result); err != nil { return err @@ -810,7 +809,7 @@ func (b *builtinDurationIsNullSig) vectorized() bool { return true } -func (b *builtinDurationIsNullSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinDurationIsNullSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { numRows := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { diff --git a/pkg/expression/builtin_other.go b/pkg/expression/builtin_other.go index 2f46eafc4c6bd..7f4a1c35b4501 100644 --- a/pkg/expression/builtin_other.go +++ b/pkg/expression/builtin_other.go @@ -197,7 +197,7 @@ func (b *builtinInIntSig) buildHashMapForConstArgs(ctx sessionctx.Context) error b.nonConstArgsIdx = make([]int, 0) b.hashSet = make(map[int64]bool, len(b.args)-1) for i := 1; i < len(b.args); i++ { - if b.args[i].ConstItem(ctx.GetSessionVars().StmtCtx) { + if b.args[i].ConstLevel() == ConstStrict { val, isNull, err := b.args[i].EvalInt(ctx, chunk.Row{}) if err != nil { return err @@ -224,7 +224,7 @@ func (b *builtinInIntSig) Clone() builtinFunc { return newSig } -func (b *builtinInIntSig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinInIntSig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { arg0, isNull0, err := b.args[0].EvalInt(ctx, row) if isNull0 || err != nil { return 0, isNull0, err @@ -290,7 +290,7 @@ func (b *builtinInStringSig) buildHashMapForConstArgs(ctx sessionctx.Context) er b.hashSet = set.NewStringSet() collator := collate.GetCollator(b.collation) for i := 1; i < len(b.args); i++ { - if b.args[i].ConstItem(ctx.GetSessionVars().StmtCtx) { + if b.args[i].ConstLevel() == ConstStrict { val, isNull, err := b.args[i].EvalString(ctx, chunk.Row{}) if err != nil { return err @@ -318,7 +318,7 @@ func (b *builtinInStringSig) Clone() builtinFunc { return newSig } -func (b *builtinInStringSig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinInStringSig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { arg0, isNull0, err := b.args[0].EvalString(ctx, row) if isNull0 || err != nil { return 0, isNull0, err @@ -363,7 +363,7 @@ func (b *builtinInRealSig) buildHashMapForConstArgs(ctx sessionctx.Context) erro b.nonConstArgsIdx = make([]int, 0) b.hashSet = set.NewFloat64Set() for i := 1; i < len(b.args); i++ { - if b.args[i].ConstItem(ctx.GetSessionVars().StmtCtx) { + if b.args[i].ConstLevel() == ConstStrict { val, isNull, err := b.args[i].EvalReal(ctx, chunk.Row{}) if err != nil { return err @@ -391,7 +391,7 @@ func (b *builtinInRealSig) Clone() builtinFunc { return newSig } -func (b *builtinInRealSig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinInRealSig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { arg0, isNull0, err := b.args[0].EvalReal(ctx, row) if isNull0 || err != nil { return 0, isNull0, err @@ -434,7 +434,7 @@ func (b *builtinInDecimalSig) buildHashMapForConstArgs(ctx sessionctx.Context) e b.nonConstArgsIdx = make([]int, 0) b.hashSet = set.NewStringSet() for i := 1; i < len(b.args); i++ { - if b.args[i].ConstItem(ctx.GetSessionVars().StmtCtx) { + if b.args[i].ConstLevel() == ConstStrict { val, isNull, err := b.args[i].EvalDecimal(ctx, chunk.Row{}) if err != nil { return err @@ -466,7 +466,7 @@ func (b *builtinInDecimalSig) Clone() builtinFunc { return newSig } -func (b *builtinInDecimalSig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinInDecimalSig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { arg0, isNull0, err := b.args[0].EvalDecimal(ctx, row) if isNull0 || err != nil { return 0, isNull0, err @@ -514,7 +514,7 @@ func (b *builtinInTimeSig) buildHashMapForConstArgs(ctx sessionctx.Context) erro b.nonConstArgsIdx = make([]int, 0) b.hashSet = make(map[types.CoreTime]struct{}, len(b.args)-1) for i := 1; i < len(b.args); i++ { - if b.args[i].ConstItem(ctx.GetSessionVars().StmtCtx) { + if b.args[i].ConstLevel() == ConstStrict { val, isNull, err := b.args[i].EvalTime(ctx, chunk.Row{}) if err != nil { return err @@ -542,7 +542,7 @@ func (b *builtinInTimeSig) Clone() builtinFunc { return newSig } -func (b *builtinInTimeSig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinInTimeSig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { arg0, isNull0, err := b.args[0].EvalTime(ctx, row) if isNull0 || err != nil { return 0, isNull0, err @@ -585,7 +585,7 @@ func (b *builtinInDurationSig) buildHashMapForConstArgs(ctx sessionctx.Context) b.nonConstArgsIdx = make([]int, 0) b.hashSet = make(map[time.Duration]struct{}, len(b.args)-1) for i := 1; i < len(b.args); i++ { - if b.args[i].ConstItem(ctx.GetSessionVars().StmtCtx) { + if b.args[i].ConstLevel() == ConstStrict { val, isNull, err := b.args[i].EvalDuration(ctx, chunk.Row{}) if err != nil { return err @@ -613,7 +613,7 @@ func (b *builtinInDurationSig) Clone() builtinFunc { return newSig } -func (b *builtinInDurationSig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinInDurationSig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { arg0, isNull0, err := b.args[0].EvalDuration(ctx, row) if isNull0 || err != nil { return 0, isNull0, err @@ -657,7 +657,7 @@ func (b *builtinInJSONSig) Clone() builtinFunc { return newSig } -func (b *builtinInJSONSig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinInJSONSig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { arg0, isNull0, err := b.args[0].EvalJSON(ctx, row) if isNull0 || err != nil { return 0, isNull0, err @@ -711,7 +711,7 @@ func (b *builtinRowSig) Clone() builtinFunc { } // evalString rowFunc should always be flattened in expression rewrite phrase. -func (b *builtinRowSig) evalString(ctx sessionctx.Context, row chunk.Row) (string, bool, error) { +func (b *builtinRowSig) evalString(ctx EvalContext, row chunk.Row) (string, bool, error) { panic("builtinRowSig.evalString() should never be called.") } @@ -759,7 +759,7 @@ func (b *builtinSetStringVarSig) Clone() builtinFunc { return newSig } -func (b *builtinSetStringVarSig) evalString(ctx sessionctx.Context, row chunk.Row) (res string, isNull bool, err error) { +func (b *builtinSetStringVarSig) evalString(ctx EvalContext, row chunk.Row) (res string, isNull bool, err error) { var varName string sessionVars := ctx.GetSessionVars() varName, isNull, err = b.args[0].EvalString(ctx, row) @@ -789,7 +789,7 @@ func (b *builtinSetRealVarSig) Clone() builtinFunc { return newSig } -func (b *builtinSetRealVarSig) evalReal(ctx sessionctx.Context, row chunk.Row) (res float64, isNull bool, err error) { +func (b *builtinSetRealVarSig) evalReal(ctx EvalContext, row chunk.Row) (res float64, isNull bool, err error) { var varName string sessionVars := ctx.GetSessionVars() varName, isNull, err = b.args[0].EvalString(ctx, row) @@ -817,7 +817,7 @@ func (b *builtinSetDecimalVarSig) Clone() builtinFunc { return newSig } -func (b *builtinSetDecimalVarSig) evalDecimal(ctx sessionctx.Context, row chunk.Row) (*types.MyDecimal, bool, error) { +func (b *builtinSetDecimalVarSig) evalDecimal(ctx EvalContext, row chunk.Row) (*types.MyDecimal, bool, error) { sessionVars := ctx.GetSessionVars() varName, isNull, err := b.args[0].EvalString(ctx, row) if isNull || err != nil { @@ -844,7 +844,7 @@ func (b *builtinSetIntVarSig) Clone() builtinFunc { return newSig } -func (b *builtinSetIntVarSig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinSetIntVarSig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { sessionVars := ctx.GetSessionVars() varName, isNull, err := b.args[0].EvalString(ctx, row) if isNull || err != nil { @@ -871,7 +871,7 @@ func (b *builtinSetTimeVarSig) Clone() builtinFunc { return newSig } -func (b *builtinSetTimeVarSig) evalTime(ctx sessionctx.Context, row chunk.Row) (types.Time, bool, error) { +func (b *builtinSetTimeVarSig) evalTime(ctx EvalContext, row chunk.Row) (types.Time, bool, error) { sessionVars := ctx.GetSessionVars() varName, isNull, err := b.args[0].EvalString(ctx, row) if isNull || err != nil { @@ -913,7 +913,6 @@ func BuildGetVarFunction(ctx sessionctx.Context, expr Expression, retType *types FuncName: model.NewCIStr(ast.GetVar), RetType: retType, Function: f, - ctx: ctx, }, nil } @@ -954,7 +953,7 @@ func (b *builtinGetStringVarSig) Clone() builtinFunc { return newSig } -func (b *builtinGetStringVarSig) evalString(ctx sessionctx.Context, row chunk.Row) (string, bool, error) { +func (b *builtinGetStringVarSig) evalString(ctx EvalContext, row chunk.Row) (string, bool, error) { sessionVars := ctx.GetSessionVars() varName, isNull, err := b.args[0].EvalString(ctx, row) if isNull || err != nil { @@ -1006,7 +1005,7 @@ func (b *builtinGetIntVarSig) Clone() builtinFunc { return newSig } -func (b *builtinGetIntVarSig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinGetIntVarSig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { sessionVars := ctx.GetSessionVars() varName, isNull, err := b.args[0].EvalString(ctx, row) if isNull || err != nil { @@ -1046,7 +1045,7 @@ func (b *builtinGetRealVarSig) Clone() builtinFunc { return newSig } -func (b *builtinGetRealVarSig) evalReal(ctx sessionctx.Context, row chunk.Row) (float64, bool, error) { +func (b *builtinGetRealVarSig) evalReal(ctx EvalContext, row chunk.Row) (float64, bool, error) { sessionVars := ctx.GetSessionVars() varName, isNull, err := b.args[0].EvalString(ctx, row) if isNull || err != nil { @@ -1086,7 +1085,7 @@ func (b *builtinGetDecimalVarSig) Clone() builtinFunc { return newSig } -func (b *builtinGetDecimalVarSig) evalDecimal(ctx sessionctx.Context, row chunk.Row) (*types.MyDecimal, bool, error) { +func (b *builtinGetDecimalVarSig) evalDecimal(ctx EvalContext, row chunk.Row) (*types.MyDecimal, bool, error) { sessionVars := ctx.GetSessionVars() varName, isNull, err := b.args[0].EvalString(ctx, row) if isNull || err != nil { @@ -1134,7 +1133,7 @@ func (b *builtinGetTimeVarSig) Clone() builtinFunc { return newSig } -func (b *builtinGetTimeVarSig) evalTime(ctx sessionctx.Context, row chunk.Row) (types.Time, bool, error) { +func (b *builtinGetTimeVarSig) evalTime(ctx EvalContext, row chunk.Row) (types.Time, bool, error) { sessionVars := ctx.GetSessionVars() varName, isNull, err := b.args[0].EvalString(ctx, row) if isNull || err != nil { @@ -1195,7 +1194,7 @@ func (b *builtinValuesIntSig) Clone() builtinFunc { // evalInt evals a builtinValuesIntSig. // See https://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html#function_values -func (b *builtinValuesIntSig) evalInt(ctx sessionctx.Context, _ chunk.Row) (int64, bool, error) { +func (b *builtinValuesIntSig) evalInt(ctx EvalContext, _ chunk.Row) (int64, bool, error) { row := ctx.GetSessionVars().CurrInsertValues if row.IsEmpty() { return 0, true, nil @@ -1236,7 +1235,7 @@ func (b *builtinValuesRealSig) Clone() builtinFunc { // evalReal evals a builtinValuesRealSig. // See https://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html#function_values -func (b *builtinValuesRealSig) evalReal(ctx sessionctx.Context, _ chunk.Row) (float64, bool, error) { +func (b *builtinValuesRealSig) evalReal(ctx EvalContext, _ chunk.Row) (float64, bool, error) { row := ctx.GetSessionVars().CurrInsertValues if row.IsEmpty() { return 0, true, nil @@ -1267,7 +1266,7 @@ func (b *builtinValuesDecimalSig) Clone() builtinFunc { // evalDecimal evals a builtinValuesDecimalSig. // See https://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html#function_values -func (b *builtinValuesDecimalSig) evalDecimal(ctx sessionctx.Context, _ chunk.Row) (*types.MyDecimal, bool, error) { +func (b *builtinValuesDecimalSig) evalDecimal(ctx EvalContext, _ chunk.Row) (*types.MyDecimal, bool, error) { row := ctx.GetSessionVars().CurrInsertValues if row.IsEmpty() { return &types.MyDecimal{}, true, nil @@ -1295,7 +1294,7 @@ func (b *builtinValuesStringSig) Clone() builtinFunc { // evalString evals a builtinValuesStringSig. // See https://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html#function_values -func (b *builtinValuesStringSig) evalString(ctx sessionctx.Context, _ chunk.Row) (string, bool, error) { +func (b *builtinValuesStringSig) evalString(ctx EvalContext, _ chunk.Row) (string, bool, error) { row := ctx.GetSessionVars().CurrInsertValues if row.IsEmpty() { return "", true, nil @@ -1332,7 +1331,7 @@ func (b *builtinValuesTimeSig) Clone() builtinFunc { // evalTime evals a builtinValuesTimeSig. // See https://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html#function_values -func (b *builtinValuesTimeSig) evalTime(ctx sessionctx.Context, _ chunk.Row) (types.Time, bool, error) { +func (b *builtinValuesTimeSig) evalTime(ctx EvalContext, _ chunk.Row) (types.Time, bool, error) { row := ctx.GetSessionVars().CurrInsertValues if row.IsEmpty() { return types.ZeroTime, true, nil @@ -1360,7 +1359,7 @@ func (b *builtinValuesDurationSig) Clone() builtinFunc { // evalDuration evals a builtinValuesDurationSig. // See https://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html#function_values -func (b *builtinValuesDurationSig) evalDuration(ctx sessionctx.Context, _ chunk.Row) (types.Duration, bool, error) { +func (b *builtinValuesDurationSig) evalDuration(ctx EvalContext, _ chunk.Row) (types.Duration, bool, error) { row := ctx.GetSessionVars().CurrInsertValues if row.IsEmpty() { return types.Duration{}, true, nil @@ -1389,7 +1388,7 @@ func (b *builtinValuesJSONSig) Clone() builtinFunc { // evalJSON evals a builtinValuesJSONSig. // See https://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html#function_values -func (b *builtinValuesJSONSig) evalJSON(ctx sessionctx.Context, _ chunk.Row) (types.BinaryJSON, bool, error) { +func (b *builtinValuesJSONSig) evalJSON(ctx EvalContext, _ chunk.Row) (types.BinaryJSON, bool, error) { row := ctx.GetSessionVars().CurrInsertValues if row.IsEmpty() { return types.BinaryJSON{}, true, nil @@ -1432,7 +1431,7 @@ func (b *builtinBitCountSig) Clone() builtinFunc { // evalInt evals BIT_COUNT(N). // See https://dev.mysql.com/doc/refman/5.7/en/bit-functions.html#function_bit-count -func (b *builtinBitCountSig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinBitCountSig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { n, isNull, err := b.args[0].EvalInt(ctx, row) if err != nil || isNull { if err != nil && types.ErrOverflow.Equal(err) { @@ -1473,7 +1472,7 @@ func (b *builtinGetParamStringSig) Clone() builtinFunc { return newSig } -func (b *builtinGetParamStringSig) evalString(ctx sessionctx.Context, row chunk.Row) (string, bool, error) { +func (b *builtinGetParamStringSig) evalString(ctx EvalContext, row chunk.Row) (string, bool, error) { sessionVars := ctx.GetSessionVars() idx, isNull, err := b.args[0].EvalInt(ctx, row) if isNull || err != nil { diff --git a/pkg/expression/builtin_other_vec.go b/pkg/expression/builtin_other_vec.go index 9e8a22bfcdabe..bbcf8b9783a26 100644 --- a/pkg/expression/builtin_other_vec.go +++ b/pkg/expression/builtin_other_vec.go @@ -18,7 +18,6 @@ import ( "strings" "github.com/pingcap/errors" - "github.com/pingcap/tidb/pkg/sessionctx" "github.com/pingcap/tidb/pkg/types" "github.com/pingcap/tidb/pkg/util/chunk" "github.com/pingcap/tidb/pkg/util/stringutil" @@ -28,7 +27,7 @@ func (b *builtinValuesIntSig) vectorized() bool { return false } -func (b *builtinValuesIntSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinValuesIntSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { return errors.Errorf("not implemented") } @@ -36,7 +35,7 @@ func (b *builtinValuesDurationSig) vectorized() bool { return false } -func (b *builtinValuesDurationSig) vecEvalDuration(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinValuesDurationSig) vecEvalDuration(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { return errors.Errorf("not implemented") } @@ -44,7 +43,7 @@ func (b *builtinRowSig) vectorized() bool { return true } -func (b *builtinRowSig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinRowSig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { panic("builtinRowSig.vecEvalString() should never be called.") } @@ -52,7 +51,7 @@ func (b *builtinValuesRealSig) vectorized() bool { return false } -func (b *builtinValuesRealSig) vecEvalReal(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinValuesRealSig) vecEvalReal(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { return errors.Errorf("not implemented") } @@ -60,7 +59,7 @@ func (b *builtinValuesStringSig) vectorized() bool { return false } -func (b *builtinValuesStringSig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinValuesStringSig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { return errors.Errorf("not implemented") } @@ -68,7 +67,7 @@ func (b *builtinValuesTimeSig) vectorized() bool { return false } -func (b *builtinValuesTimeSig) vecEvalTime(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinValuesTimeSig) vecEvalTime(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { return errors.Errorf("not implemented") } @@ -76,7 +75,7 @@ func (b *builtinValuesJSONSig) vectorized() bool { return false } -func (b *builtinValuesJSONSig) vecEvalJSON(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinValuesJSONSig) vecEvalJSON(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { return errors.Errorf("not implemented") } @@ -94,7 +93,7 @@ func bitCount(value int64) int64 { func (b *builtinBitCountSig) vectorized() bool { return true } -func (b *builtinBitCountSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinBitCountSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() if err := b.args[0].VecEvalInt(ctx, input, result); err != nil { if types.ErrOverflow.Equal(err) { @@ -126,7 +125,7 @@ func (b *builtinGetParamStringSig) vectorized() bool { return true } -func (b *builtinGetParamStringSig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinGetParamStringSig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { sessionVars := ctx.GetSessionVars() n := input.NumRows() idx, err := b.bufAllocator.get() @@ -160,7 +159,7 @@ func (b *builtinSetStringVarSig) vectorized() bool { return true } -func (b *builtinSetStringVarSig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinSetStringVarSig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf0, err := b.bufAllocator.get() if err != nil { @@ -198,7 +197,7 @@ func (b *builtinSetIntVarSig) vectorized() bool { return true } -func (b *builtinSetIntVarSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinSetIntVarSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf0, err := b.bufAllocator.get() if err != nil { @@ -236,7 +235,7 @@ func (b *builtinSetRealVarSig) vectorized() bool { return true } -func (b *builtinSetRealVarSig) vecEvalReal(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinSetRealVarSig) vecEvalReal(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf0, err := b.bufAllocator.get() if err != nil { @@ -274,7 +273,7 @@ func (b *builtinSetDecimalVarSig) vectorized() bool { return true } -func (b *builtinSetDecimalVarSig) vecEvalDecimal(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinSetDecimalVarSig) vecEvalDecimal(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf0, err := b.bufAllocator.get() if err != nil { @@ -312,7 +311,7 @@ func (b *builtinValuesDecimalSig) vectorized() bool { return false } -func (b *builtinValuesDecimalSig) vecEvalDecimal(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinValuesDecimalSig) vecEvalDecimal(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { return errors.Errorf("not implemented") } @@ -320,7 +319,7 @@ func (b *builtinGetStringVarSig) vectorized() bool { return true } -func (b *builtinGetStringVarSig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinGetStringVarSig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf0, err := b.bufAllocator.get() if err != nil { @@ -355,7 +354,7 @@ func (b *builtinGetIntVarSig) vectorized() bool { return true } -func (b *builtinGetIntVarSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinGetIntVarSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf0, err := b.bufAllocator.get() if err != nil { @@ -387,7 +386,7 @@ func (b *builtinGetRealVarSig) vectorized() bool { return true } -func (b *builtinGetRealVarSig) vecEvalReal(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinGetRealVarSig) vecEvalReal(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf0, err := b.bufAllocator.get() if err != nil { @@ -419,7 +418,7 @@ func (b *builtinGetDecimalVarSig) vectorized() bool { return true } -func (b *builtinGetDecimalVarSig) vecEvalDecimal(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinGetDecimalVarSig) vecEvalDecimal(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf0, err := b.bufAllocator.get() if err != nil { diff --git a/pkg/expression/builtin_other_vec_generated.go b/pkg/expression/builtin_other_vec_generated.go index c0e8920cb29db..85d637ef178c2 100644 --- a/pkg/expression/builtin_other_vec_generated.go +++ b/pkg/expression/builtin_other_vec_generated.go @@ -20,13 +20,12 @@ import ( "cmp" "github.com/pingcap/tidb/pkg/parser/mysql" - "github.com/pingcap/tidb/pkg/sessionctx" "github.com/pingcap/tidb/pkg/types" "github.com/pingcap/tidb/pkg/util/chunk" "github.com/pingcap/tidb/pkg/util/collate" ) -func (b *builtinInIntSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinInIntSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf0, err := b.bufAllocator.get() if err != nil { @@ -131,7 +130,7 @@ func (b *builtinInIntSig) vectorized() bool { return true } -func (b *builtinInStringSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinInStringSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf0, err := b.bufAllocator.get() if err != nil { @@ -212,7 +211,7 @@ func (b *builtinInStringSig) vectorized() bool { return true } -func (b *builtinInDecimalSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinInDecimalSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf0, err := b.bufAllocator.get() if err != nil { @@ -302,7 +301,7 @@ func (b *builtinInDecimalSig) vectorized() bool { return true } -func (b *builtinInRealSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinInRealSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf0, err := b.bufAllocator.get() if err != nil { @@ -385,7 +384,7 @@ func (b *builtinInRealSig) vectorized() bool { return true } -func (b *builtinInTimeSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinInTimeSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf0, err := b.bufAllocator.get() if err != nil { @@ -468,7 +467,7 @@ func (b *builtinInTimeSig) vectorized() bool { return true } -func (b *builtinInDurationSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinInDurationSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf0, err := b.bufAllocator.get() if err != nil { @@ -551,7 +550,7 @@ func (b *builtinInDurationSig) vectorized() bool { return true } -func (b *builtinInJSONSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinInJSONSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf0, err := b.bufAllocator.get() if err != nil { diff --git a/pkg/expression/builtin_regexp.go b/pkg/expression/builtin_regexp.go index 457e0f2bf07e0..c211fa0b84bf8 100644 --- a/pkg/expression/builtin_regexp.go +++ b/pkg/expression/builtin_regexp.go @@ -19,7 +19,6 @@ import ( "fmt" "regexp" "strings" - "sync" "unicode/utf8" "github.com/pingcap/tidb/pkg/parser/charset" @@ -28,6 +27,7 @@ import ( "github.com/pingcap/tidb/pkg/types" "github.com/pingcap/tidb/pkg/util/chunk" "github.com/pingcap/tidb/pkg/util/collate" + "github.com/pingcap/tidb/pkg/util/intest" "github.com/pingcap/tidb/pkg/util/set" "github.com/pingcap/tidb/pkg/util/stringutil" "github.com/pingcap/tipb/go-tipb" @@ -68,8 +68,7 @@ var validMatchType = set.NewStringSet( type regexpBaseFuncSig struct { baseBuiltinFunc - regexpMemorizedSig - once sync.Once + memorizedRegexp builtinFuncCache[regexpMemorizedSig] } // check binary collation, not xxx_bin collation! @@ -78,136 +77,123 @@ func (re *regexpBaseFuncSig) isBinaryCollation() bool { } func (re *regexpBaseFuncSig) clone() *regexpBaseFuncSig { - newSig := ®expBaseFuncSig{once: sync.Once{}} - if re.memorizedRegexp != nil { - newSig.memorizedRegexp = re.memorizedRegexp - } - newSig.memorizedErr = re.memorizedErr + newSig := ®expBaseFuncSig{} newSig.cloneFrom(&re.baseBuiltinFunc) return newSig } -// If characters specifying contradictory options are specified -// within match_type, the rightmost one takes precedence. -func (re *regexpBaseFuncSig) getMatchType(userInputMatchType string) (string, error) { - flag := "" - matchTypeSet := set.NewStringSet() +// we can memorize the regexp when: +// 1. pattern and match type are constant +// 2. pattern is const and there is no match type argument +// +// return true: need, false: needless +func (re *regexpBaseFuncSig) canMemorizeRegexp(matchTypeIdx int) bool { + // If the pattern and match type are both constants, we can cache the regexp into memory. + // Notice that the above two arguments are not required to be constant across contexts because the cache is only + // valid when the two context ids are the same. + return re.args[patternIdx].ConstLevel() >= ConstOnlyInContext && + (len(re.args) <= matchTypeIdx || re.args[matchTypeIdx].ConstLevel() >= ConstOnlyInContext) +} - if collate.IsCICollation(re.baseBuiltinFunc.collation) { - matchTypeSet.Insert(flagI) +// buildRegexp builds a new `*regexp.Regexp` from the pattern and matchType +func (re *regexpBaseFuncSig) buildRegexp(pattern string, matchType string) (reg *regexp.Regexp, err error) { + matchType, err = getRegexpMatchType(matchType, re.collation) + if err != nil { + return nil, err } - for _, val := range userInputMatchType { - c := string(val) - - // Check validation of the flag - _, err := validMatchType[c] - if !err { - return "", ErrRegexp.GenWithStackByArgs(invalidMatchType) - } - - if c == flagC { - // re2 is case-sensitive by default, so we only need to delete 'i' flag - // to enable the case-sensitive for the regexp - delete(matchTypeSet, flagI) - continue - } - - matchTypeSet[c] = empty{} // add this flag + if len(matchType) == 0 { + reg, err = regexp.Compile(pattern) + } else { + reg, err = regexp.Compile(fmt.Sprintf("(?%s)%s", matchType, pattern)) } - // generate flag - for key := range matchTypeSet { - flag += key + if err != nil { + return nil, ErrRegexp.GenWithStackByArgs(err) } - return flag, nil + return reg, nil } -// To get a unified compile interface in initMemoizedRegexp, we need to process many things in genCompile -func (re *regexpBaseFuncSig) genCompile(matchType string) (func(string) (*regexp.Regexp, error), error) { - matchType, err := re.getMatchType(matchType) +// getRegexp returns the Regexp which can be used by the current function. +// If the pattern and matchType arguments are both constant, the `*regexp.Regexp` object will be cached in memory. +// The next call of `getRegexp` will return the cached regexp if it is present and the context id is equal +func (re *regexpBaseFuncSig) getRegexp(ctx EvalContext, pattern string, matchType string, matchTypeIdx int) (*regexp.Regexp, error) { + if !re.canMemorizeRegexp(matchTypeIdx) { + return re.buildRegexp(pattern, matchType) + } + + sig, err := re.memorizedRegexp.getOrInitCache(ctx, func() (ret regexpMemorizedSig, err error) { + ret.memorizedRegexp, ret.memorizedErr = re.buildRegexp(pattern, matchType) + return + }) + if err != nil { return nil, err } - return func(pat string) (*regexp.Regexp, error) { - if len(matchType) == 0 { - return regexp.Compile(pat) - } - return regexp.Compile(fmt.Sprintf("(?%s)%s", matchType, pat)) - }, nil + return sig.memorizedRegexp, sig.memorizedErr } -func (re *regexpBaseFuncSig) genRegexp(pat string, matchType string) (*regexp.Regexp, error) { - if len(pat) == 0 { - return nil, ErrRegexp.GenWithStackByArgs(emptyPatternErr) +func (re *regexpBaseFuncSig) tryVecMemorizedRegexp(ctx EvalContext, params []*funcParam, matchTypeIdx int, nRows int) (*regexp.Regexp, bool, error) { + // Check memorization + if nRows == 0 || !re.canMemorizeRegexp(matchTypeIdx) { + return nil, false, nil } - if re.isMemorizedRegexpInitialized() { - return re.memorizedRegexp, re.memorizedErr + pattern := params[patternIdx].getStringVal(0) + if len(pattern) == 0 { + return nil, false, ErrRegexp.GenWithStackByArgs(emptyPatternErr) } - var err error + matchType := params[matchTypeIdx].getStringVal(0) + sig, err := re.memorizedRegexp.getOrInitCache(ctx, func() (ret regexpMemorizedSig, err error) { + ret.memorizedRegexp, ret.memorizedErr = re.buildRegexp(pattern, matchType) + return + }) - // Generate compiler first - compile, err := re.genCompile(matchType) if err != nil { - return nil, err + return nil, false, err } - return compile(pat) -} - -// we can memorize the regexp when: -// 1. pattern and match type are constant -// 2. pattern is const and there is no match type argument -// -// return true: need, false: needless -func (re *regexpBaseFuncSig) canMemorize(ctx sessionctx.Context, matchTypeIdx int) bool { - return re.args[patternIdx].ConstItem(ctx.GetSessionVars().StmtCtx) && (len(re.args) <= matchTypeIdx || re.args[matchTypeIdx].ConstItem(ctx.GetSessionVars().StmtCtx)) + return sig.memorizedRegexp, true, sig.memorizedErr } -func (re *regexpBaseFuncSig) initMemoizedRegexp(params []*funcParam, matchTypeIdx int) error { - pat := params[patternIdx].getStringVal(0) - if len(pat) == 0 { - return ErrRegexp.GenWithStackByArgs(emptyPatternErr) - } +// If characters specifying contradictory options are specified +// within match_type, the rightmost one takes precedence. +func getRegexpMatchType(userInputMatchType string, collation string) (string, error) { + flag := "" + matchTypeSet := set.NewStringSet() - // Generate compile - compile, err := re.genCompile(params[matchTypeIdx].getStringVal(0)) - if err != nil { - return ErrRegexp.GenWithStackByArgs(err) + if collate.IsCICollation(collation) { + matchTypeSet.Insert(flagI) } - // Compile this constant pattern, so that we can avoid this repeated work - re.memorize(compile, pat) - - return re.memorizedErr -} + for _, val := range userInputMatchType { + c := string(val) -// As multiple threads may memorize regexp and cause data race, only the first thread -// who gets the lock is permitted to do the memorization and others should wait for him -// until the memorization has been finished. -func (re *regexpBaseFuncSig) tryToMemorize(ctx sessionctx.Context, params []*funcParam, matchTypeIdx int, n int) error { - // Check memorization - if n == 0 || !re.canMemorize(ctx, matchTypeIdx) { - return nil - } + // Check validation of the flag + _, err := validMatchType[c] + if !err { + return "", ErrRegexp.GenWithStackByArgs(invalidMatchType) + } - var err error - memorize := func() { - if re.isMemorizedRegexpInitialized() { - err = nil - return + if c == flagC { + // re2 is case-sensitive by default, so we only need to delete 'i' flag + // to enable the case-sensitive for the regexp + delete(matchTypeSet, flagI) + continue } - err = re.initMemoizedRegexp(params, matchTypeIdx) + matchTypeSet[c] = empty{} // add this flag } - re.once.Do(memorize) + // generate flag + for key := range matchTypeSet { + flag += key + } - return err + return flag, nil } // https://dev.mysql.com/doc/refman/8.0/en/regexp.html#function_regexp-like @@ -254,7 +240,7 @@ func (re *builtinRegexpLikeFuncSig) vectorized() bool { return true } -func (re *builtinRegexpLikeFuncSig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (re *builtinRegexpLikeFuncSig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { expr, isNull, err := re.args[0].EvalString(ctx, row) if isNull || err != nil { return 0, true, err @@ -275,40 +261,16 @@ func (re *builtinRegexpLikeFuncSig) evalInt(ctx sessionctx.Context, row chunk.Ro } } - memorize := func() { - compile, err := re.genCompile(matchType) - if err != nil { - re.memorizedErr = err - return - } - re.memorize(compile, pat) - } - - if re.canMemorize(ctx, regexpLikeMatchTypeIdx) { - re.once.Do(memorize) // Avoid data race - } - - if !re.isMemorizedRegexpInitialized() { - compile, err := re.genCompile(matchType) - if err != nil { - return 0, true, ErrRegexp.GenWithStackByArgs(err) - } - reg, err := compile(pat) - if err != nil { - return 0, true, ErrRegexp.GenWithStackByArgs(err) - } - return boolToInt64(reg.MatchString(expr)), false, nil - } - - if re.memorizedErr != nil { - return 0, true, ErrRegexp.GenWithStackByArgs(re.memorizedErr) + reg, err := re.getRegexp(ctx, pat, matchType, regexpLikeMatchTypeIdx) + if err != nil { + return 0, true, err } - return boolToInt64(re.memorizedRegexp.MatchString(expr)), false, nil + return boolToInt64(reg.MatchString(expr)), false, nil } // REGEXP_LIKE(expr, pat[, match_type]) -func (re *builtinRegexpLikeFuncSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (re *builtinRegexpLikeFuncSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() params := make([]*funcParam, 0, 3) defer releaseBuffers(&re.baseBuiltinFunc, params) @@ -338,7 +300,7 @@ func (re *builtinRegexpLikeFuncSig) vecEvalInt(ctx sessionctx.Context, input *ch return nil } - err = re.tryToMemorize(ctx, params, regexpLikeMatchTypeIdx, n) + reg, memorized, err := re.tryVecMemorizedRegexp(ctx, params, regexpLikeMatchTypeIdx, n) if err != nil { return err } @@ -351,12 +313,14 @@ func (re *builtinRegexpLikeFuncSig) vecEvalInt(ctx sessionctx.Context, input *ch continue } - matchType := params[2].getStringVal(i) - re, err := re.genRegexp(params[1].getStringVal(i), matchType) - if err != nil { - return ErrRegexp.GenWithStackByArgs(err) + if !memorized { + matchType := params[2].getStringVal(i) + reg, err = re.buildRegexp(params[1].getStringVal(i), matchType) + if err != nil { + return err + } } - i64s[i] = boolToInt64(re.MatchString(params[0].getStringVal(i))) + i64s[i] = boolToInt64(reg.MatchString(params[0].getStringVal(i))) } return nil } @@ -433,7 +397,7 @@ func (re *builtinRegexpSubstrFuncSig) findBinString(reg *regexp.Regexp, bexpr [] return fmt.Sprintf("0x%s", strings.ToUpper(hex.EncodeToString(matches[occurrence-1]))), false, nil } -func (re *builtinRegexpSubstrFuncSig) evalString(ctx sessionctx.Context, row chunk.Row) (string, bool, error) { +func (re *builtinRegexpSubstrFuncSig) evalString(ctx EvalContext, row chunk.Row) (string, bool, error) { expr, isNull, err := re.args[0].EvalString(ctx, row) if isNull || err != nil { return "", true, err @@ -499,48 +463,19 @@ func (re *builtinRegexpSubstrFuncSig) evalString(ctx sessionctx.Context, row chu } } - memorize := func() { - compile, err := re.genCompile(matchType) - if err != nil { - re.memorizedErr = err - return - } - re.memorize(compile, pat) - } - - if re.canMemorize(ctx, regexpSubstrMatchTypeIdx) { - re.once.Do(memorize) // Avoid data race - } - - if !re.isMemorizedRegexpInitialized() { - compile, err := re.genCompile(matchType) - if err != nil { - return "", true, ErrRegexp.GenWithStackByArgs(err) - } - reg, err := compile(pat) - if err != nil { - return "", true, ErrRegexp.GenWithStackByArgs(err) - } - - if re.isBinaryCollation() { - return re.findBinString(reg, bexpr, occurrence) - } - return re.findString(reg, expr, occurrence) - } - - if re.memorizedErr != nil { - return "", true, ErrRegexp.GenWithStackByArgs(re.memorizedErr) + reg, err := re.getRegexp(ctx, pat, matchType, regexpSubstrMatchTypeIdx) + if err != nil { + return "", true, err } if re.isBinaryCollation() { - return re.findBinString(re.memorizedRegexp, bexpr, occurrence) + return re.findBinString(reg, bexpr, occurrence) } - - return re.findString(re.memorizedRegexp, expr, occurrence) + return re.findString(reg, expr, occurrence) } // REGEXP_SUBSTR(expr, pat[, pos[, occurrence[, match_type]]]) -func (re *builtinRegexpSubstrFuncSig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (re *builtinRegexpSubstrFuncSig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() params := make([]*funcParam, 0, 5) defer releaseBuffers(&re.baseBuiltinFunc, params) @@ -599,7 +534,7 @@ func (re *builtinRegexpSubstrFuncSig) vecEvalString(ctx sessionctx.Context, inpu } // Check memorization - err = re.tryToMemorize(ctx, params, regexpSubstrMatchTypeIdx, n) + reg, memorized, err := re.tryVecMemorizedRegexp(ctx, params, regexpSubstrMatchTypeIdx, n) if err != nil { return err } @@ -647,11 +582,13 @@ func (re *builtinRegexpSubstrFuncSig) vecEvalString(ctx sessionctx.Context, inpu occurrence = 1 } - // Get match type and generate regexp - matchType := params[4].getStringVal(i) - reg, err := re.genRegexp(params[1].getStringVal(i), matchType) - if err != nil { - return err + if !memorized { + // Get pattern and match type and then generate regexp + pattern := params[1].getStringVal(i) + matchType := params[4].getStringVal(i) + if reg, err = re.buildRegexp(pattern, matchType); err != nil { + return err + } } // Find string @@ -758,7 +695,7 @@ func (re *builtinRegexpInStrFuncSig) findIndex(reg *regexp.Regexp, expr string, return stringutil.ConvertPosInUtf8(&expr, int64(matches[occurrence-1][1])) + pos - 1, false, nil } -func (re *builtinRegexpInStrFuncSig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (re *builtinRegexpInStrFuncSig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { expr, isNull, err := re.args[0].EvalString(ctx, row) if isNull || err != nil { return 0, true, err @@ -839,48 +776,20 @@ func (re *builtinRegexpInStrFuncSig) evalInt(ctx sessionctx.Context, row chunk.R } } - memorize := func() { - compile, err := re.genCompile(matchType) - if err != nil { - re.memorizedErr = err - return - } - re.memorize(compile, pat) - } - - if re.canMemorize(ctx, regexpInstrMatchTypeIdx) { - re.once.Do(memorize) // Avoid data race - } - - if !re.isMemorizedRegexpInitialized() { - compile, err := re.genCompile(matchType) - if err != nil { - return 0, true, ErrRegexp.GenWithStackByArgs(err) - } - reg, err := compile(pat) - if err != nil { - return 0, true, ErrRegexp.GenWithStackByArgs(err) - } - - if re.isBinaryCollation() { - return re.findBinIndex(reg, bexpr, pos, occurrence, returnOption) - } - return re.findIndex(reg, expr, pos, occurrence, returnOption) - } - - if re.memorizedErr != nil { - return 0, true, ErrRegexp.GenWithStackByArgs(re.memorizedErr) + reg, err := re.getRegexp(ctx, pat, matchType, regexpInstrMatchTypeIdx) + if err != nil { + return 0, true, err } if re.isBinaryCollation() { - return re.findBinIndex(re.memorizedRegexp, bexpr, pos, occurrence, returnOption) + return re.findBinIndex(reg, bexpr, pos, occurrence, returnOption) } - return re.findIndex(re.memorizedRegexp, expr, pos, occurrence, returnOption) + return re.findIndex(reg, expr, pos, occurrence, returnOption) } // REGEXP_INSTR(expr, pat[, pos[, occurrence[, return_option[, match_type]]]]) -func (re *builtinRegexpInStrFuncSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (re *builtinRegexpInStrFuncSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() params := make([]*funcParam, 0, 5) defer releaseBuffers(&re.baseBuiltinFunc, params) @@ -951,7 +860,7 @@ func (re *builtinRegexpInStrFuncSig) vecEvalInt(ctx sessionctx.Context, input *c return nil } - err = re.tryToMemorize(ctx, params, regexpInstrMatchTypeIdx, n) + reg, memorized, err := re.tryVecMemorizedRegexp(ctx, params, regexpInstrMatchTypeIdx, n) if err != nil { return err } @@ -1005,10 +914,12 @@ func (re *builtinRegexpInStrFuncSig) vecEvalInt(ctx sessionctx.Context, input *c } // Get match type and generate regexp - matchType := params[5].getStringVal(i) - reg, err := re.genRegexp(params[1].getStringVal(i), matchType) - if err != nil { - return ErrRegexp.GenWithStackByArgs(err) + if !memorized { + matchType := params[5].getStringVal(i) + reg, err = re.buildRegexp(params[1].getStringVal(i), matchType) + if err != nil { + return err + } } // Find index @@ -1074,9 +985,6 @@ func (c *regexpReplaceFunctionClass) getFunction(ctx sessionctx.Context, args [] bf.tp.SetFlen(argType.GetFlen()) sig := builtinRegexpReplaceFuncSig{ regexpBaseFuncSig: regexpBaseFuncSig{baseBuiltinFunc: bf}, - instructions: make([]Instruction, 0), - instrMemorizedErr: nil, - isInstrMemorized: false, } sig.setPbCode(tipb.ScalarFuncSig_RegexpReplaceSig) @@ -1105,10 +1013,7 @@ func (ins *Instruction) getCaptureGroupStr(str []byte, matchedRes []int) ([]byte type builtinRegexpReplaceFuncSig struct { regexpBaseFuncSig - instructions []Instruction - instrMemorizedErr error - instrMemorizeOnce sync.Once - isInstrMemorized bool + instCache builtinFuncCache[[]Instruction] } func (re *builtinRegexpReplaceFuncSig) copyReplacement(replacedBStr *[]byte, matchedBexpr *[]byte, res []int, instructions []Instruction) error { @@ -1218,7 +1123,7 @@ func (re *builtinRegexpReplaceFuncSig) getReplacedStr(reg *regexp.Regexp, expr s return re.replaceOneMatchedStr(reg, expr, trimmedExpr, instructions, pos, occurrence) } -func getInstructions(repl []byte) ([]Instruction, error) { +func getInstructions(repl []byte) []Instruction { instructions := make([]Instruction, 0) var literals []byte @@ -1247,14 +1152,27 @@ func getInstructions(repl []byte) ([]Instruction, error) { if len(literals) != 0 { instructions = append(instructions, Instruction{SubstitutionNum: -1, Literal: literals}) } - return instructions, nil + return instructions +} + +func (re *builtinRegexpReplaceFuncSig) canInstructionsMemorized() bool { + return re.args[replacementIdx].ConstLevel() >= ConstOnlyInContext } -func (re *builtinRegexpReplaceFuncSig) canInstructionsMemorized(ctx sessionctx.Context) bool { - return re.args[replacementIdx].ConstItem(ctx.GetSessionVars().StmtCtx) +func (re *builtinRegexpReplaceFuncSig) getInstructions(ctx EvalContext, repl string) ([]Instruction, error) { + if !re.canInstructionsMemorized() { + return getInstructions([]byte(repl)), nil + } + + instructions, err := re.instCache.getOrInitCache(ctx, func() ([]Instruction, error) { + return getInstructions([]byte(repl)), nil + }) + + intest.AssertNoError(err) + return instructions, err } -func (re *builtinRegexpReplaceFuncSig) evalString(ctx sessionctx.Context, row chunk.Row) (string, bool, error) { +func (re *builtinRegexpReplaceFuncSig) evalString(ctx EvalContext, row chunk.Row) (string, bool, error) { expr, isNull, err := re.args[0].EvalString(ctx, row) trimmedExpr := expr if isNull || err != nil { @@ -1330,70 +1248,24 @@ func (re *builtinRegexpReplaceFuncSig) evalString(ctx sessionctx.Context, row ch } } - memorize := func() { - compile, err := re.genCompile(matchType) - if err != nil { - re.memorizedErr = err - return - } - re.memorize(compile, pat) - } - - if re.canMemorize(ctx, regexpReplaceMatchTypeIdx) { - re.once.Do(memorize) // Avoid data race - } - - memorizeInstructions := func() { - re.instructions, err = getInstructions([]byte(repl)) - if err != nil { - re.instrMemorizedErr = err - return - } - re.isInstrMemorized = true - } - - if re.canInstructionsMemorized(ctx) { - re.instrMemorizeOnce.Do(memorizeInstructions) // Avoid data race - } - - var instructions []Instruction - if re.isInstrMemorized { - instructions = re.instructions - } else { - instructions, err = getInstructions([]byte(repl)) - if err != nil { - return "", true, err - } - } - - if !re.isMemorizedRegexpInitialized() { - compile, err := re.genCompile(matchType) - if err != nil { - return "", true, ErrRegexp.GenWithStackByArgs(err) - } - reg, err := compile(pat) - if err != nil { - return "", true, ErrRegexp.GenWithStackByArgs(err) - } - - if re.isBinaryCollation() { - return re.getReplacedBinStr(reg, bexpr, trimmedBexpr, instructions, pos, occurrence) - } - return re.getReplacedStr(reg, expr, trimmedExpr, instructions, trimmedLen+1, occurrence) + reg, err := re.getRegexp(ctx, pat, matchType, regexpReplaceMatchTypeIdx) + if err != nil { + return "", true, err } - if re.memorizedErr != nil { - return "", true, ErrRegexp.GenWithStackByArgs(re.memorizedErr) + instructions, err := re.getInstructions(ctx, repl) + if err != nil { + return "", true, err } if re.isBinaryCollation() { - return re.getReplacedBinStr(re.memorizedRegexp, bexpr, trimmedBexpr, instructions, pos, occurrence) + return re.getReplacedBinStr(reg, bexpr, trimmedBexpr, instructions, pos, occurrence) } - return re.getReplacedStr(re.memorizedRegexp, expr, trimmedExpr, instructions, trimmedLen+1, occurrence) + return re.getReplacedStr(reg, expr, trimmedExpr, instructions, trimmedLen+1, occurrence) } // REGEXP_REPLACE(expr, pat, repl[, pos[, occurrence[, match_type]]]) -func (re *builtinRegexpReplaceFuncSig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (re *builtinRegexpReplaceFuncSig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() params := make([]*funcParam, 0, 6) defer releaseBuffers(&re.baseBuiltinFunc, params) @@ -1464,7 +1336,7 @@ func (re *builtinRegexpReplaceFuncSig) vecEvalString(ctx sessionctx.Context, inp return nil } - err = re.tryToMemorize(ctx, params, regexpReplaceMatchTypeIdx, n) + reg, memorized, err := re.tryVecMemorizedRegexp(ctx, params, regexpReplaceMatchTypeIdx, n) if err != nil { return err } @@ -1473,10 +1345,9 @@ func (re *builtinRegexpReplaceFuncSig) vecEvalString(ctx sessionctx.Context, inp buffers := getBuffers(params) instructions := make([]Instruction, 0) - isReplConst := re.baseBuiltinFunc.args[2].ConstItem(ctx.GetSessionVars().StmtCtx) - if isReplConst { - // repl is const - instructions, err = getInstructions([]byte(params[2].getStringVal(0))) + canMemorizeRepl := re.canInstructionsMemorized() && n > 0 + if canMemorizeRepl { + instructions, err = re.getInstructions(ctx, params[replacementIdx].getStringVal(0)) if err != nil { return err } @@ -1529,28 +1400,22 @@ func (re *builtinRegexpReplaceFuncSig) vecEvalString(ctx sessionctx.Context, inp } // Get match type and generate regexp - matchType := params[5].getStringVal(i) - reg, err := re.genRegexp(params[1].getStringVal(i), matchType) - if err != nil { - return ErrRegexp.GenWithStackByArgs(err) - } - - if !isReplConst { - instructions, err = getInstructions([]byte(repl)) + if !memorized { + matchType := params[5].getStringVal(i) + reg, err = re.buildRegexp(params[1].getStringVal(i), matchType) if err != nil { return err } } + if !canMemorizeRepl { + instructions = getInstructions([]byte(repl)) + } + // Start to replace if re.isBinaryCollation() { var replacedBStr string - if re.canMemorize(ctx, regexpReplaceMatchTypeIdx) { - replacedBStr, _, err = re.getReplacedBinStr(re.memorizedRegexp, bexpr, trimmedBexpr, instructions, pos, occurrence) - } else { - replacedBStr, _, err = re.getReplacedBinStr(reg, bexpr, trimmedBexpr, instructions, pos, occurrence) - } - + replacedBStr, _, err = re.getReplacedBinStr(reg, bexpr, trimmedBexpr, instructions, pos, occurrence) if err != nil { return ErrRegexp.GenWithStackByArgs(err) } @@ -1558,12 +1423,7 @@ func (re *builtinRegexpReplaceFuncSig) vecEvalString(ctx sessionctx.Context, inp result.AppendString(fmt.Sprintf("0x%s", strings.ToUpper(hex.EncodeToString([]byte(replacedBStr))))) } else { var replacedStr string - if re.canMemorize(ctx, regexpReplaceMatchTypeIdx) { - replacedStr, _, err = re.getReplacedStr(re.memorizedRegexp, expr, trimmedExpr, instructions, trimmedLen+1, occurrence) - } else { - replacedStr, _, err = re.getReplacedStr(reg, expr, trimmedExpr, instructions, trimmedLen+1, occurrence) - } - + replacedStr, _, err = re.getReplacedStr(reg, expr, trimmedExpr, instructions, trimmedLen+1, occurrence) if err != nil { return ErrRegexp.GenWithStackByArgs(err) } diff --git a/pkg/expression/builtin_regexp_test.go b/pkg/expression/builtin_regexp_test.go index 41665dfcf73ee..e58a3d4a32cd4 100644 --- a/pkg/expression/builtin_regexp_test.go +++ b/pkg/expression/builtin_regexp_test.go @@ -1224,3 +1224,80 @@ func TestRegexpReplaceVec(t *testing.T) { testVectorizedBuiltinFunc(t, vecBuiltinRegexpReplaceCases) } + +func TestRegexpCache(t *testing.T) { + ctx := createContext(t) + + // if the pattern or match type is not constant, it should not be cached + sig := regexpBaseFuncSig{} + sig.args = []Expression{&Column{}, &Column{}, &Constant{}} + reg, err := sig.getRegexp(ctx, "abc", "", 2) + require.NoError(t, err) + require.Equal(t, "abc", reg.String()) + + reg, err = sig.getRegexp(ctx, "def", "", 2) + require.NoError(t, err) + require.Equal(t, "def", reg.String()) + + reg, ok, err := sig.tryVecMemorizedRegexp(ctx, []*funcParam{ + {defaultStrVal: "x"}, + {defaultStrVal: "aaa"}, + {defaultStrVal: ""}, + }, 2, 1) + require.Nil(t, reg) + require.False(t, ok) + require.NoError(t, err) + + _, ok = sig.memorizedRegexp.getCache(ctx.GetSessionVars().StmtCtx.CtxID()) + require.False(t, ok) + + sig.args = []Expression{&Column{}, &Constant{}, &Column{}} + reg, err = sig.getRegexp(ctx, "bbb", "", 2) + require.NoError(t, err) + require.Equal(t, "bbb", reg.String()) + + reg, ok, err = sig.tryVecMemorizedRegexp(ctx, []*funcParam{ + {defaultStrVal: "x"}, + {defaultStrVal: "aaa"}, + {defaultStrVal: ""}, + }, 2, 1) + require.Nil(t, reg) + require.False(t, ok) + require.NoError(t, err) + + _, ok = sig.memorizedRegexp.getCache(ctx.GetSessionVars().StmtCtx.CtxID()) + require.False(t, ok) + + // if pattern and match type are both constant, it should be cached + sig = regexpBaseFuncSig{} + sig.args = []Expression{&Column{}, &Constant{ParamMarker: &ParamMarker{}}, &Constant{ParamMarker: &ParamMarker{}}} + reg, err = sig.getRegexp(ctx, "ccc", "", 2) + require.NoError(t, err) + require.Equal(t, "ccc", reg.String()) + + reg2, err := sig.getRegexp(ctx, "ddd", "", 2) + require.NoError(t, err) + require.Same(t, reg, reg2) + require.Equal(t, "ccc", reg2.String()) + + sig = regexpBaseFuncSig{} + sig.args = []Expression{&Column{}, &Constant{ParamMarker: &ParamMarker{}}, &Constant{ParamMarker: &ParamMarker{}}} + reg, ok, err = sig.tryVecMemorizedRegexp(ctx, []*funcParam{ + {defaultStrVal: "x"}, + {defaultStrVal: "ddd"}, + {defaultStrVal: ""}, + }, 2, 1) + require.Equal(t, "ddd", reg.String()) + require.True(t, ok) + require.NoError(t, err) + + reg2, ok, err = sig.tryVecMemorizedRegexp(ctx, []*funcParam{ + {defaultStrVal: "x"}, + {defaultStrVal: "eee"}, + {defaultStrVal: ""}, + }, 2, 1) + require.Same(t, reg, reg2) + require.Equal(t, "ddd", reg2.String()) + require.True(t, ok) + require.NoError(t, err) +} diff --git a/pkg/expression/builtin_string.go b/pkg/expression/builtin_string.go index 6b72a4bed6a23..eb78b9ecd9c21 100644 --- a/pkg/expression/builtin_string.go +++ b/pkg/expression/builtin_string.go @@ -218,7 +218,7 @@ func (b *builtinLengthSig) Clone() builtinFunc { // evalInt evaluates a builtinLengthSig. // See https://dev.mysql.com/doc/refman/5.7/en/string-functions.html -func (b *builtinLengthSig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinLengthSig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { val, isNull, err := b.args[0].EvalString(ctx, row) if isNull || err != nil { return 0, isNull, err @@ -256,7 +256,7 @@ func (b *builtinASCIISig) Clone() builtinFunc { // evalInt evals a builtinASCIISig. // See https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_ascii -func (b *builtinASCIISig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinASCIISig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { val, isNull, err := b.args[0].EvalString(ctx, row) if isNull || err != nil { return 0, isNull, err @@ -323,7 +323,7 @@ func (b *builtinConcatSig) Clone() builtinFunc { // evalString evals a builtinConcatSig // See https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_concat -func (b *builtinConcatSig) evalString(ctx sessionctx.Context, row chunk.Row) (d string, isNull bool, err error) { +func (b *builtinConcatSig) evalString(ctx EvalContext, row chunk.Row) (d string, isNull bool, err error) { //nolint: prealloc var s []byte for _, a := range b.getArgs() { @@ -405,7 +405,7 @@ func (b *builtinConcatWSSig) Clone() builtinFunc { // evalString evals a CONCAT_WS(separator,str1,str2,...). // See https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_concat-ws -func (b *builtinConcatWSSig) evalString(ctx sessionctx.Context, row chunk.Row) (string, bool, error) { +func (b *builtinConcatWSSig) evalString(ctx EvalContext, row chunk.Row) (string, bool, error) { args := b.getArgs() strs := make([]string, 0, len(args)) var sep string @@ -486,7 +486,7 @@ func (b *builtinLeftSig) Clone() builtinFunc { // evalString evals LEFT(str,len). // See https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_left -func (b *builtinLeftSig) evalString(ctx sessionctx.Context, row chunk.Row) (string, bool, error) { +func (b *builtinLeftSig) evalString(ctx EvalContext, row chunk.Row) (string, bool, error) { str, isNull, err := b.args[0].EvalString(ctx, row) if isNull || err != nil { return "", true, err @@ -516,7 +516,7 @@ func (b *builtinLeftUTF8Sig) Clone() builtinFunc { // evalString evals LEFT(str,len). // See https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_left -func (b *builtinLeftUTF8Sig) evalString(ctx sessionctx.Context, row chunk.Row) (string, bool, error) { +func (b *builtinLeftUTF8Sig) evalString(ctx EvalContext, row chunk.Row) (string, bool, error) { str, isNull, err := b.args[0].EvalString(ctx, row) if isNull || err != nil { return "", true, err @@ -571,7 +571,7 @@ func (b *builtinRightSig) Clone() builtinFunc { // evalString evals RIGHT(str,len). // See https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_right -func (b *builtinRightSig) evalString(ctx sessionctx.Context, row chunk.Row) (string, bool, error) { +func (b *builtinRightSig) evalString(ctx EvalContext, row chunk.Row) (string, bool, error) { str, isNull, err := b.args[0].EvalString(ctx, row) if isNull || err != nil { return "", true, err @@ -601,7 +601,7 @@ func (b *builtinRightUTF8Sig) Clone() builtinFunc { // evalString evals RIGHT(str,len). // See https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_right -func (b *builtinRightUTF8Sig) evalString(ctx sessionctx.Context, row chunk.Row) (string, bool, error) { +func (b *builtinRightUTF8Sig) evalString(ctx EvalContext, row chunk.Row) (string, bool, error) { str, isNull, err := b.args[0].EvalString(ctx, row) if isNull || err != nil { return "", true, err @@ -658,7 +658,7 @@ func (b *builtinRepeatSig) Clone() builtinFunc { // evalString evals a builtinRepeatSig. // See https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_repeat -func (b *builtinRepeatSig) evalString(ctx sessionctx.Context, row chunk.Row) (val string, isNull bool, err error) { +func (b *builtinRepeatSig) evalString(ctx EvalContext, row chunk.Row) (val string, isNull bool, err error) { str, isNull, err := b.args[0].EvalString(ctx, row) if isNull || err != nil { return "", isNull, err @@ -721,7 +721,7 @@ func (b *builtinLowerUTF8Sig) Clone() builtinFunc { // evalString evals a builtinLowerUTF8Sig. // See https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_lower -func (b *builtinLowerUTF8Sig) evalString(ctx sessionctx.Context, row chunk.Row) (d string, isNull bool, err error) { +func (b *builtinLowerUTF8Sig) evalString(ctx EvalContext, row chunk.Row) (d string, isNull bool, err error) { d, isNull, err = b.args[0].EvalString(ctx, row) if isNull || err != nil { return d, isNull, err @@ -742,7 +742,7 @@ func (b *builtinLowerSig) Clone() builtinFunc { // evalString evals a builtinLowerSig. // See https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_lower -func (b *builtinLowerSig) evalString(ctx sessionctx.Context, row chunk.Row) (d string, isNull bool, err error) { +func (b *builtinLowerSig) evalString(ctx EvalContext, row chunk.Row) (d string, isNull bool, err error) { d, isNull, err = b.args[0].EvalString(ctx, row) if isNull || err != nil { return d, isNull, err @@ -790,7 +790,7 @@ func (b *builtinReverseSig) Clone() builtinFunc { // evalString evals a REVERSE(str). // See https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_reverse -func (b *builtinReverseSig) evalString(ctx sessionctx.Context, row chunk.Row) (string, bool, error) { +func (b *builtinReverseSig) evalString(ctx EvalContext, row chunk.Row) (string, bool, error) { str, isNull, err := b.args[0].EvalString(ctx, row) if isNull || err != nil { return "", true, err @@ -811,7 +811,7 @@ func (b *builtinReverseUTF8Sig) Clone() builtinFunc { // evalString evals a REVERSE(str). // See https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_reverse -func (b *builtinReverseUTF8Sig) evalString(ctx sessionctx.Context, row chunk.Row) (string, bool, error) { +func (b *builtinReverseUTF8Sig) evalString(ctx EvalContext, row chunk.Row) (string, bool, error) { str, isNull, err := b.args[0].EvalString(ctx, row) if isNull || err != nil { return "", true, err @@ -860,7 +860,7 @@ func (b *builtinSpaceSig) Clone() builtinFunc { // evalString evals a builtinSpaceSig. // See https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_space -func (b *builtinSpaceSig) evalString(ctx sessionctx.Context, row chunk.Row) (d string, isNull bool, err error) { +func (b *builtinSpaceSig) evalString(ctx EvalContext, row chunk.Row) (d string, isNull bool, err error) { var x int64 x, isNull, err = b.args[0].EvalInt(ctx, row) @@ -917,7 +917,7 @@ func (b *builtinUpperUTF8Sig) Clone() builtinFunc { // evalString evals a builtinUpperUTF8Sig. // See https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_upper -func (b *builtinUpperUTF8Sig) evalString(ctx sessionctx.Context, row chunk.Row) (d string, isNull bool, err error) { +func (b *builtinUpperUTF8Sig) evalString(ctx EvalContext, row chunk.Row) (d string, isNull bool, err error) { d, isNull, err = b.args[0].EvalString(ctx, row) if isNull || err != nil { return d, isNull, err @@ -938,7 +938,7 @@ func (b *builtinUpperSig) Clone() builtinFunc { // evalString evals a builtinUpperSig. // See https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_upper -func (b *builtinUpperSig) evalString(ctx sessionctx.Context, row chunk.Row) (d string, isNull bool, err error) { +func (b *builtinUpperSig) evalString(ctx EvalContext, row chunk.Row) (d string, isNull bool, err error) { d, isNull, err = b.args[0].EvalString(ctx, row) if isNull || err != nil { return d, isNull, err @@ -978,7 +978,7 @@ func (b *builtinStrcmpSig) Clone() builtinFunc { // evalInt evals a builtinStrcmpSig. // See https://dev.mysql.com/doc/refman/5.7/en/string-comparison-functions.html -func (b *builtinStrcmpSig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinStrcmpSig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { var ( left, right string isNull bool @@ -1041,7 +1041,7 @@ func (b *builtinReplaceSig) Clone() builtinFunc { // evalString evals a builtinReplaceSig. // See https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_replace -func (b *builtinReplaceSig) evalString(ctx sessionctx.Context, row chunk.Row) (d string, isNull bool, err error) { +func (b *builtinReplaceSig) evalString(ctx EvalContext, row chunk.Row) (d string, isNull bool, err error) { var str, oldStr, newStr string str, isNull, err = b.args[0].EvalString(ctx, row) @@ -1127,7 +1127,7 @@ func (b *builtinConvertSig) Clone() builtinFunc { // evalString evals CONVERT(expr USING transcoding_name). // Syntax CONVERT(expr, type) is parsed as cast expr so not handled here. // See https://dev.mysql.com/doc/refman/5.7/en/cast-functions.html#function_convert -func (b *builtinConvertSig) evalString(ctx sessionctx.Context, row chunk.Row) (string, bool, error) { +func (b *builtinConvertSig) evalString(ctx EvalContext, row chunk.Row) (string, bool, error) { expr, isNull, err := b.args[0].EvalString(ctx, row) if isNull || err != nil { return "", true, err @@ -1209,7 +1209,7 @@ func (b *builtinSubstring2ArgsSig) Clone() builtinFunc { // evalString evals SUBSTR(str,pos), SUBSTR(str FROM pos), SUBSTR() is a synonym for SUBSTRING(). // See https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_substr -func (b *builtinSubstring2ArgsSig) evalString(ctx sessionctx.Context, row chunk.Row) (string, bool, error) { +func (b *builtinSubstring2ArgsSig) evalString(ctx EvalContext, row chunk.Row) (string, bool, error) { str, isNull, err := b.args[0].EvalString(ctx, row) if isNull || err != nil { return "", true, err @@ -1242,7 +1242,7 @@ func (b *builtinSubstring2ArgsUTF8Sig) Clone() builtinFunc { // evalString evals SUBSTR(str,pos), SUBSTR(str FROM pos), SUBSTR() is a synonym for SUBSTRING(). // See https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_substr -func (b *builtinSubstring2ArgsUTF8Sig) evalString(ctx sessionctx.Context, row chunk.Row) (string, bool, error) { +func (b *builtinSubstring2ArgsUTF8Sig) evalString(ctx EvalContext, row chunk.Row) (string, bool, error) { str, isNull, err := b.args[0].EvalString(ctx, row) if isNull || err != nil { return "", true, err @@ -1276,7 +1276,7 @@ func (b *builtinSubstring3ArgsSig) Clone() builtinFunc { // evalString evals SUBSTR(str,pos,len), SUBSTR(str FROM pos FOR len), SUBSTR() is a synonym for SUBSTRING(). // See https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_substr -func (b *builtinSubstring3ArgsSig) evalString(ctx sessionctx.Context, row chunk.Row) (string, bool, error) { +func (b *builtinSubstring3ArgsSig) evalString(ctx EvalContext, row chunk.Row) (string, bool, error) { str, isNull, err := b.args[0].EvalString(ctx, row) if isNull || err != nil { return "", true, err @@ -1319,7 +1319,7 @@ func (b *builtinSubstring3ArgsUTF8Sig) Clone() builtinFunc { // evalString evals SUBSTR(str,pos,len), SUBSTR(str FROM pos FOR len), SUBSTR() is a synonym for SUBSTRING(). // See https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_substr -func (b *builtinSubstring3ArgsUTF8Sig) evalString(ctx sessionctx.Context, row chunk.Row) (string, bool, error) { +func (b *builtinSubstring3ArgsUTF8Sig) evalString(ctx EvalContext, row chunk.Row) (string, bool, error) { str, isNull, err := b.args[0].EvalString(ctx, row) if isNull || err != nil { return "", true, err @@ -1383,7 +1383,7 @@ func (b *builtinSubstringIndexSig) Clone() builtinFunc { // evalString evals a builtinSubstringIndexSig. // See https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_substring-index -func (b *builtinSubstringIndexSig) evalString(ctx sessionctx.Context, row chunk.Row) (d string, isNull bool, err error) { +func (b *builtinSubstringIndexSig) evalString(ctx EvalContext, row chunk.Row) (d string, isNull bool, err error) { var ( str, delim string count int64 @@ -1479,7 +1479,7 @@ func (b *builtinLocate2ArgsSig) Clone() builtinFunc { // evalInt evals LOCATE(substr,str), case-sensitive. // See https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_locate -func (b *builtinLocate2ArgsSig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinLocate2ArgsSig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { subStr, isNull, err := b.args[0].EvalString(ctx, row) if isNull || err != nil { return 0, isNull, err @@ -1511,7 +1511,7 @@ func (b *builtinLocate2ArgsUTF8Sig) Clone() builtinFunc { // evalInt evals LOCATE(substr,str). // See https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_locate -func (b *builtinLocate2ArgsUTF8Sig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinLocate2ArgsUTF8Sig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { subStr, isNull, err := b.args[0].EvalString(ctx, row) if isNull || err != nil { return 0, isNull, err @@ -1539,7 +1539,7 @@ func (b *builtinLocate3ArgsSig) Clone() builtinFunc { // evalInt evals LOCATE(substr,str,pos), case-sensitive. // See https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_locate -func (b *builtinLocate3ArgsSig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinLocate3ArgsSig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { subStr, isNull, err := b.args[0].EvalString(ctx, row) if isNull || err != nil { return 0, isNull, err @@ -1580,7 +1580,7 @@ func (b *builtinLocate3ArgsUTF8Sig) Clone() builtinFunc { // evalInt evals LOCATE(substr,str,pos). // See https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_locate -func (b *builtinLocate3ArgsUTF8Sig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinLocate3ArgsUTF8Sig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { subStr, isNull, err := b.args[0].EvalString(ctx, row) if isNull || err != nil { return 0, isNull, err @@ -1665,7 +1665,7 @@ func (b *builtinHexStrArgSig) Clone() builtinFunc { // evalString evals a builtinHexStrArgSig, corresponding to hex(str) // See https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_hex -func (b *builtinHexStrArgSig) evalString(ctx sessionctx.Context, row chunk.Row) (string, bool, error) { +func (b *builtinHexStrArgSig) evalString(ctx EvalContext, row chunk.Row) (string, bool, error) { d, isNull, err := b.args[0].EvalString(ctx, row) if isNull || err != nil { return d, isNull, err @@ -1685,7 +1685,7 @@ func (b *builtinHexIntArgSig) Clone() builtinFunc { // evalString evals a builtinHexIntArgSig, corresponding to hex(N) // See https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_hex -func (b *builtinHexIntArgSig) evalString(ctx sessionctx.Context, row chunk.Row) (string, bool, error) { +func (b *builtinHexIntArgSig) evalString(ctx EvalContext, row chunk.Row) (string, bool, error) { x, isNull, err := b.args[0].EvalInt(ctx, row) if isNull || err != nil { return "", isNull, err @@ -1745,7 +1745,7 @@ func (b *builtinUnHexSig) Clone() builtinFunc { // evalString evals a builtinUnHexSig. // See https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_unhex -func (b *builtinUnHexSig) evalString(ctx sessionctx.Context, row chunk.Row) (string, bool, error) { +func (b *builtinUnHexSig) evalString(ctx EvalContext, row chunk.Row) (string, bool, error) { var bs []byte d, isNull, err := b.args[0].EvalString(ctx, row) @@ -1830,7 +1830,7 @@ func (b *builtinTrim1ArgSig) Clone() builtinFunc { // evalString evals a builtinTrim1ArgSig, corresponding to trim(str) // See https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_trim -func (b *builtinTrim1ArgSig) evalString(ctx sessionctx.Context, row chunk.Row) (d string, isNull bool, err error) { +func (b *builtinTrim1ArgSig) evalString(ctx EvalContext, row chunk.Row) (d string, isNull bool, err error) { d, isNull, err = b.args[0].EvalString(ctx, row) if isNull || err != nil { return d, isNull, err @@ -1850,7 +1850,7 @@ func (b *builtinTrim2ArgsSig) Clone() builtinFunc { // evalString evals a builtinTrim2ArgsSig, corresponding to trim(str, remstr) // See https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_trim -func (b *builtinTrim2ArgsSig) evalString(ctx sessionctx.Context, row chunk.Row) (d string, isNull bool, err error) { +func (b *builtinTrim2ArgsSig) evalString(ctx EvalContext, row chunk.Row) (d string, isNull bool, err error) { var str, remstr string str, isNull, err = b.args[0].EvalString(ctx, row) @@ -1878,7 +1878,7 @@ func (b *builtinTrim3ArgsSig) Clone() builtinFunc { // evalString evals a builtinTrim3ArgsSig, corresponding to trim(str, remstr, direction) // See https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_trim -func (b *builtinTrim3ArgsSig) evalString(ctx sessionctx.Context, row chunk.Row) (d string, isNull bool, err error) { +func (b *builtinTrim3ArgsSig) evalString(ctx EvalContext, row chunk.Row) (d string, isNull bool, err error) { var ( str, remstr string x int64 @@ -1942,7 +1942,7 @@ func (b *builtinLTrimSig) Clone() builtinFunc { // evalString evals a builtinLTrimSig // See https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_ltrim -func (b *builtinLTrimSig) evalString(ctx sessionctx.Context, row chunk.Row) (d string, isNull bool, err error) { +func (b *builtinLTrimSig) evalString(ctx EvalContext, row chunk.Row) (d string, isNull bool, err error) { d, isNull, err = b.args[0].EvalString(ctx, row) if isNull || err != nil { return d, isNull, err @@ -1982,7 +1982,7 @@ func (b *builtinRTrimSig) Clone() builtinFunc { // evalString evals a builtinRTrimSig // See https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_rtrim -func (b *builtinRTrimSig) evalString(ctx sessionctx.Context, row chunk.Row) (d string, isNull bool, err error) { +func (b *builtinRTrimSig) evalString(ctx EvalContext, row chunk.Row) (d string, isNull bool, err error) { d, isNull, err = b.args[0].EvalString(ctx, row) if isNull || err != nil { return d, isNull, err @@ -2072,7 +2072,7 @@ func (b *builtinLpadSig) Clone() builtinFunc { // evalString evals LPAD(str,len,padstr). // See https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_lpad -func (b *builtinLpadSig) evalString(ctx sessionctx.Context, row chunk.Row) (string, bool, error) { +func (b *builtinLpadSig) evalString(ctx EvalContext, row chunk.Row) (string, bool, error) { str, isNull, err := b.args[0].EvalString(ctx, row) if isNull || err != nil { return "", true, err @@ -2120,7 +2120,7 @@ func (b *builtinLpadUTF8Sig) Clone() builtinFunc { // evalString evals LPAD(str,len,padstr). // See https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_lpad -func (b *builtinLpadUTF8Sig) evalString(ctx sessionctx.Context, row chunk.Row) (string, bool, error) { +func (b *builtinLpadUTF8Sig) evalString(ctx EvalContext, row chunk.Row) (string, bool, error) { str, isNull, err := b.args[0].EvalString(ctx, row) if isNull || err != nil { return "", true, err @@ -2202,7 +2202,7 @@ func (b *builtinRpadSig) Clone() builtinFunc { // evalString evals RPAD(str,len,padstr). // See https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_rpad -func (b *builtinRpadSig) evalString(ctx sessionctx.Context, row chunk.Row) (string, bool, error) { +func (b *builtinRpadSig) evalString(ctx EvalContext, row chunk.Row) (string, bool, error) { str, isNull, err := b.args[0].EvalString(ctx, row) if isNull || err != nil { return "", true, err @@ -2249,7 +2249,7 @@ func (b *builtinRpadUTF8Sig) Clone() builtinFunc { // evalString evals RPAD(str,len,padstr). // See https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_rpad -func (b *builtinRpadUTF8Sig) evalString(ctx sessionctx.Context, row chunk.Row) (string, bool, error) { +func (b *builtinRpadUTF8Sig) evalString(ctx EvalContext, row chunk.Row) (string, bool, error) { str, isNull, err := b.args[0].EvalString(ctx, row) if isNull || err != nil { return "", true, err @@ -2313,7 +2313,7 @@ func (b *builtinBitLengthSig) Clone() builtinFunc { // evalInt evaluates a builtinBitLengthSig. // See https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_bit-length -func (b *builtinBitLengthSig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinBitLengthSig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { val, isNull, err := b.args[0].EvalString(ctx, row) if isNull || err != nil { return 0, isNull, err @@ -2393,7 +2393,7 @@ func (b *builtinCharSig) convertToBytes(ints []int64) []byte { // evalString evals CHAR(N,... [USING charset_name]). // See https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_char. -func (b *builtinCharSig) evalString(ctx sessionctx.Context, row chunk.Row) (string, bool, error) { +func (b *builtinCharSig) evalString(ctx EvalContext, row chunk.Row) (string, bool, error) { bigints := make([]int64, 0, len(b.args)-1) for i := 0; i < len(b.args)-1; i++ { @@ -2453,7 +2453,7 @@ func (b *builtinCharLengthBinarySig) Clone() builtinFunc { // evalInt evals a builtinCharLengthUTF8Sig for binary string type. // See https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_char-length -func (b *builtinCharLengthBinarySig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinCharLengthBinarySig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { val, isNull, err := b.args[0].EvalString(ctx, row) if isNull || err != nil { return 0, isNull, err @@ -2473,7 +2473,7 @@ func (b *builtinCharLengthUTF8Sig) Clone() builtinFunc { // evalInt evals a builtinCharLengthUTF8Sig for non-binary string type. // See https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_char-length -func (b *builtinCharLengthUTF8Sig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinCharLengthUTF8Sig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { val, isNull, err := b.args[0].EvalString(ctx, row) if isNull || err != nil { return 0, isNull, err @@ -2513,7 +2513,7 @@ func (b *builtinFindInSetSig) Clone() builtinFunc { // See https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_find-in-set // TODO: This function can be optimized by using bit arithmetic when the first argument is // a constant string and the second is a column of type SET. -func (b *builtinFindInSetSig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinFindInSetSig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { str, isNull, err := b.args[0].EvalString(ctx, row) if isNull || err != nil { return 0, isNull, err @@ -2593,7 +2593,7 @@ func (b *builtinFieldIntSig) Clone() builtinFunc { // evalInt evals FIELD(str,str1,str2,str3,...). // See https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_field -func (b *builtinFieldIntSig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinFieldIntSig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { str, isNull, err := b.args[0].EvalInt(ctx, row) if isNull || err != nil { return 0, err != nil, err @@ -2622,7 +2622,7 @@ func (b *builtinFieldRealSig) Clone() builtinFunc { // evalInt evals FIELD(str,str1,str2,str3,...). // See https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_field -func (b *builtinFieldRealSig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinFieldRealSig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { str, isNull, err := b.args[0].EvalReal(ctx, row) if isNull || err != nil { return 0, err != nil, err @@ -2651,7 +2651,7 @@ func (b *builtinFieldStringSig) Clone() builtinFunc { // evalInt evals FIELD(str,str1,str2,str3,...). // See https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_field -func (b *builtinFieldStringSig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinFieldStringSig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { str, isNull, err := b.args[0].EvalString(ctx, row) if isNull || err != nil { return 0, err != nil, err @@ -2730,7 +2730,7 @@ func (b *builtinMakeSetSig) Clone() builtinFunc { // evalString evals MAKE_SET(bits,str1,str2,...). // See https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_make-set -func (b *builtinMakeSetSig) evalString(ctx sessionctx.Context, row chunk.Row) (string, bool, error) { +func (b *builtinMakeSetSig) evalString(ctx EvalContext, row chunk.Row) (string, bool, error) { bits, isNull, err := b.args[0].EvalInt(ctx, row) if isNull || err != nil { return "", true, err @@ -2804,7 +2804,7 @@ func (b *builtinOctIntSig) Clone() builtinFunc { // evalString evals OCT(N). // See https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_oct -func (b *builtinOctIntSig) evalString(ctx sessionctx.Context, row chunk.Row) (string, bool, error) { +func (b *builtinOctIntSig) evalString(ctx EvalContext, row chunk.Row) (string, bool, error) { val, isNull, err := b.args[0].EvalInt(ctx, row) if isNull || err != nil { return "", isNull, err @@ -2825,7 +2825,7 @@ func (b *builtinOctStringSig) Clone() builtinFunc { // evalString evals OCT(N). // See https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_oct -func (b *builtinOctStringSig) evalString(ctx sessionctx.Context, row chunk.Row) (string, bool, error) { +func (b *builtinOctStringSig) evalString(ctx EvalContext, row chunk.Row) (string, bool, error) { val, isNull, err := b.args[0].EvalString(ctx, row) if isNull || err != nil { return "", isNull, err @@ -2884,7 +2884,7 @@ func (b *builtinOrdSig) Clone() builtinFunc { // evalInt evals a builtinOrdSig. // See https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_ord -func (b *builtinOrdSig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinOrdSig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { str, isNull, err := b.args[0].EvalString(ctx, row) if isNull || err != nil { return 0, isNull, err @@ -2946,7 +2946,7 @@ func (b *builtinQuoteSig) Clone() builtinFunc { // evalString evals QUOTE(str). // See https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_quote -func (b *builtinQuoteSig) evalString(ctx sessionctx.Context, row chunk.Row) (string, bool, error) { +func (b *builtinQuoteSig) evalString(ctx EvalContext, row chunk.Row) (string, bool, error) { str, isNull, err := b.args[0].EvalString(ctx, row) if err != nil { return "", true, err @@ -3016,7 +3016,7 @@ func (b *builtinBinSig) Clone() builtinFunc { // evalString evals BIN(N). // See https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_bin -func (b *builtinBinSig) evalString(ctx sessionctx.Context, row chunk.Row) (string, bool, error) { +func (b *builtinBinSig) evalString(ctx EvalContext, row chunk.Row) (string, bool, error) { val, isNull, err := b.args[0].EvalInt(ctx, row) if isNull || err != nil { return "", true, err @@ -3067,7 +3067,7 @@ func (b *builtinEltSig) Clone() builtinFunc { // evalString evals a ELT(N,str1,str2,str3,...). // See https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_elt -func (b *builtinEltSig) evalString(ctx sessionctx.Context, row chunk.Row) (string, bool, error) { +func (b *builtinEltSig) evalString(ctx EvalContext, row chunk.Row) (string, bool, error) { idx, isNull, err := b.args[0].EvalInt(ctx, row) if isNull || err != nil { return "", true, err @@ -3155,7 +3155,7 @@ func (b *builtinExportSet3ArgSig) Clone() builtinFunc { // evalString evals EXPORT_SET(bits,on,off). // See https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_export-set -func (b *builtinExportSet3ArgSig) evalString(ctx sessionctx.Context, row chunk.Row) (string, bool, error) { +func (b *builtinExportSet3ArgSig) evalString(ctx EvalContext, row chunk.Row) (string, bool, error) { bits, isNull, err := b.args[0].EvalInt(ctx, row) if isNull || err != nil { return "", true, err @@ -3186,7 +3186,7 @@ func (b *builtinExportSet4ArgSig) Clone() builtinFunc { // evalString evals EXPORT_SET(bits,on,off,separator). // See https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_export-set -func (b *builtinExportSet4ArgSig) evalString(ctx sessionctx.Context, row chunk.Row) (string, bool, error) { +func (b *builtinExportSet4ArgSig) evalString(ctx EvalContext, row chunk.Row) (string, bool, error) { bits, isNull, err := b.args[0].EvalInt(ctx, row) if isNull || err != nil { return "", true, err @@ -3222,7 +3222,7 @@ func (b *builtinExportSet5ArgSig) Clone() builtinFunc { // evalString evals EXPORT_SET(bits,on,off,separator,number_of_bits). // See https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_export-set -func (b *builtinExportSet5ArgSig) evalString(ctx sessionctx.Context, row chunk.Row) (string, bool, error) { +func (b *builtinExportSet5ArgSig) evalString(ctx EvalContext, row chunk.Row) (string, bool, error) { bits, isNull, err := b.args[0].EvalInt(ctx, row) if isNull || err != nil { return "", true, err @@ -3297,7 +3297,7 @@ func (c *formatFunctionClass) getFunction(ctx sessionctx.Context, args []Express const formatMaxDecimals int64 = 30 // evalNumDecArgsForFormat evaluates first 2 arguments, i.e, x and d, for function `format`. -func evalNumDecArgsForFormat(ctx sessionctx.Context, f builtinFunc, row chunk.Row) (string, string, bool, error) { +func evalNumDecArgsForFormat(ctx EvalContext, f builtinFunc, row chunk.Row) (string, string, bool, error) { var xStr string arg0, arg1 := f.getArgs()[0], f.getArgs()[1] if arg0.GetType().EvalType() == types.ETDecimal { @@ -3394,7 +3394,7 @@ func (b *builtinFormatWithLocaleSig) Clone() builtinFunc { // evalString evals FORMAT(X,D,locale). // See https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_format -func (b *builtinFormatWithLocaleSig) evalString(ctx sessionctx.Context, row chunk.Row) (string, bool, error) { +func (b *builtinFormatWithLocaleSig) evalString(ctx EvalContext, row chunk.Row) (string, bool, error) { x, d, isNull, err := evalNumDecArgsForFormat(ctx, b, row) if isNull || err != nil { return "", isNull, err @@ -3404,9 +3404,9 @@ func (b *builtinFormatWithLocaleSig) evalString(ctx sessionctx.Context, row chun return "", false, err } if isNull { - ctx.GetSessionVars().StmtCtx.AppendWarning(errUnknownLocale.GenWithStackByArgs("NULL")) + ctx.GetSessionVars().StmtCtx.AppendWarning(errUnknownLocale.FastGenByArgs("NULL")) } else if !strings.EqualFold(locale, "en_US") { // TODO: support other locales. - ctx.GetSessionVars().StmtCtx.AppendWarning(errUnknownLocale.GenWithStackByArgs(locale)) + ctx.GetSessionVars().StmtCtx.AppendWarning(errUnknownLocale.FastGenByArgs(locale)) } locale = "en_US" formatString, err := mysql.GetLocaleFormatFunction(locale)(x, d) @@ -3425,7 +3425,7 @@ func (b *builtinFormatSig) Clone() builtinFunc { // evalString evals FORMAT(X,D). // See https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_format -func (b *builtinFormatSig) evalString(ctx sessionctx.Context, row chunk.Row) (string, bool, error) { +func (b *builtinFormatSig) evalString(ctx EvalContext, row chunk.Row) (string, bool, error) { x, d, isNull, err := evalNumDecArgsForFormat(ctx, b, row) if isNull || err != nil { return "", isNull, err @@ -3494,7 +3494,7 @@ func (b *builtinFromBase64Sig) Clone() builtinFunc { // evalString evals FROM_BASE64(str). // See https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_from-base64 -func (b *builtinFromBase64Sig) evalString(ctx sessionctx.Context, row chunk.Row) (string, bool, error) { +func (b *builtinFromBase64Sig) evalString(ctx EvalContext, row chunk.Row) (string, bool, error) { str, isNull, err := b.args[0].EvalString(ctx, row) if isNull || err != nil { return "", true, err @@ -3588,7 +3588,7 @@ func base64NeededEncodedLength(n int) int { // evalString evals a builtinToBase64Sig. // See https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_to-base64 -func (b *builtinToBase64Sig) evalString(ctx sessionctx.Context, row chunk.Row) (val string, isNull bool, err error) { +func (b *builtinToBase64Sig) evalString(ctx EvalContext, row chunk.Row) (val string, isNull bool, err error) { str, isNull, err := b.args[0].EvalString(ctx, row) if isNull || err != nil { return "", isNull, err @@ -3673,7 +3673,7 @@ func (b *builtinInsertSig) Clone() builtinFunc { // evalString evals INSERT(str,pos,len,newstr). // See https://dev.mysql.com/doc/refman/5.6/en/string-functions.html#function_insert -func (b *builtinInsertSig) evalString(ctx sessionctx.Context, row chunk.Row) (string, bool, error) { +func (b *builtinInsertSig) evalString(ctx EvalContext, row chunk.Row) (string, bool, error) { str, isNull, err := b.args[0].EvalString(ctx, row) if isNull || err != nil { return "", true, err @@ -3723,7 +3723,7 @@ func (b *builtinInsertUTF8Sig) Clone() builtinFunc { // evalString evals INSERT(str,pos,len,newstr). // See https://dev.mysql.com/doc/refman/5.6/en/string-functions.html#function_insert -func (b *builtinInsertUTF8Sig) evalString(ctx sessionctx.Context, row chunk.Row) (string, bool, error) { +func (b *builtinInsertUTF8Sig) evalString(ctx EvalContext, row chunk.Row) (string, bool, error) { str, isNull, err := b.args[0].EvalString(ctx, row) if isNull || err != nil { return "", true, err @@ -3802,7 +3802,7 @@ func (b *builtinInstrSig) Clone() builtinFunc { // evalInt evals INSTR(str,substr). // See https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_instr -func (b *builtinInstrUTF8Sig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinInstrUTF8Sig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { str, IsNull, err := b.args[0].EvalString(ctx, row) if IsNull || err != nil { return 0, true, err @@ -3825,7 +3825,7 @@ func (b *builtinInstrUTF8Sig) evalInt(ctx sessionctx.Context, row chunk.Row) (in // evalInt evals INSTR(str,substr), case sensitive. // See https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_instr -func (b *builtinInstrSig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinInstrSig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { str, IsNull, err := b.args[0].EvalString(ctx, row) if IsNull || err != nil { return 0, true, err @@ -3867,7 +3867,7 @@ type builtinLoadFileSig struct { baseBuiltinFunc } -func (b *builtinLoadFileSig) evalString(ctx sessionctx.Context, row chunk.Row) (d string, isNull bool, err error) { +func (b *builtinLoadFileSig) evalString(ctx EvalContext, row chunk.Row) (d string, isNull bool, err error) { d, isNull, err = b.args[0].EvalString(ctx, row) if isNull || err != nil { return d, isNull, err @@ -3985,7 +3985,7 @@ func (b *builtinWeightStringNullSig) Clone() builtinFunc { // evalString evals a WEIGHT_STRING(expr [AS CHAR|BINARY]) when the expr is numeric types, it always returns null. // See https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_weight-string -func (b *builtinWeightStringNullSig) evalString(ctx sessionctx.Context, row chunk.Row) (string, bool, error) { +func (b *builtinWeightStringNullSig) evalString(ctx EvalContext, row chunk.Row) (string, bool, error) { return "", true, nil } @@ -4008,7 +4008,7 @@ func (b *builtinWeightStringSig) Clone() builtinFunc { // evalString evals a WEIGHT_STRING(expr [AS (CHAR|BINARY)]) when the expr is non-numeric types. // See https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_weight-string -func (b *builtinWeightStringSig) evalString(ctx sessionctx.Context, row chunk.Row) (string, bool, error) { +func (b *builtinWeightStringSig) evalString(ctx EvalContext, row chunk.Row) (string, bool, error) { str, isNull, err := b.args[0].EvalString(ctx, row) if err != nil { return "", false, err @@ -4036,7 +4036,7 @@ func (b *builtinWeightStringSig) evalString(ctx sessionctx.Context, row chunk.Ro lenStr := len(str) if b.length < lenStr { tpInfo := fmt.Sprintf("BINARY(%d)", b.length) - ctx.GetSessionVars().StmtCtx.AppendWarning(errTruncatedWrongValue.GenWithStackByArgs(tpInfo, str)) + ctx.GetSessionVars().StmtCtx.AppendWarning(errTruncatedWrongValue.FastGenByArgs(tpInfo, str)) str = str[:b.length] } else if b.length > lenStr { if uint64(b.length-lenStr) > b.maxAllowedPacket { @@ -4095,7 +4095,7 @@ func (b *builtinTranslateBinarySig) Clone() builtinFunc { // evalString evals a builtinTranslateSig, corresponding to translate(srcStr, fromStr, toStr) // See https://docs.oracle.com/cd/B19306_01/server.102/b14200/functions196.htm -func (b *builtinTranslateBinarySig) evalString(ctx sessionctx.Context, row chunk.Row) (d string, isNull bool, err error) { +func (b *builtinTranslateBinarySig) evalString(ctx EvalContext, row chunk.Row) (d string, isNull bool, err error) { var ( srcStr, fromStr, toStr string isFromStrNull, isToStrNull bool @@ -4138,7 +4138,7 @@ func (b *builtinTranslateUTF8Sig) Clone() builtinFunc { // evalString evals a builtinTranslateUTF8Sig, corresponding to translate(srcStr, fromStr, toStr) // See https://docs.oracle.com/cd/B19306_01/server.102/b14200/functions196.htm -func (b *builtinTranslateUTF8Sig) evalString(ctx sessionctx.Context, row chunk.Row) (d string, isNull bool, err error) { +func (b *builtinTranslateUTF8Sig) evalString(ctx EvalContext, row chunk.Row) (d string, isNull bool, err error) { var ( srcStr, fromStr, toStr string isFromStrNull, isToStrNull bool diff --git a/pkg/expression/builtin_string_vec.go b/pkg/expression/builtin_string_vec.go index 9c0b6ec965d11..d7142e414eedc 100644 --- a/pkg/expression/builtin_string_vec.go +++ b/pkg/expression/builtin_string_vec.go @@ -27,14 +27,13 @@ import ( "github.com/pingcap/tidb/pkg/parser/ast" "github.com/pingcap/tidb/pkg/parser/charset" "github.com/pingcap/tidb/pkg/parser/mysql" - "github.com/pingcap/tidb/pkg/sessionctx" "github.com/pingcap/tidb/pkg/types" "github.com/pingcap/tidb/pkg/util/chunk" "github.com/pingcap/tidb/pkg/util/collate" ) //revive:disable:defer -func (b *builtinLowerSig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinLowerSig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { // if error is not nil return error, or builtinLowerSig is for binary strings (do nothing) return b.args[0].VecEvalString(ctx, input, result) } @@ -43,7 +42,7 @@ func (b *builtinLowerSig) vectorized() bool { return true } -func (b *builtinLowerUTF8Sig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinLowerUTF8Sig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -69,7 +68,7 @@ func (b *builtinLowerUTF8Sig) vectorized() bool { return true } -func (b *builtinRepeatSig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinRepeatSig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -128,7 +127,7 @@ func (b *builtinRepeatSig) vectorized() bool { return true } -func (b *builtinStringIsNullSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinStringIsNullSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -155,7 +154,7 @@ func (b *builtinStringIsNullSig) vectorized() bool { return true } -func (b *builtinUpperUTF8Sig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinUpperUTF8Sig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -181,7 +180,7 @@ func (b *builtinUpperUTF8Sig) vectorized() bool { return true } -func (b *builtinUpperSig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinUpperSig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { return b.args[0].VecEvalString(ctx, input, result) } @@ -189,7 +188,7 @@ func (b *builtinUpperSig) vectorized() bool { return true } -func (b *builtinLeftUTF8Sig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinLeftUTF8Sig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -234,7 +233,7 @@ func (b *builtinLeftUTF8Sig) vectorized() bool { return true } -func (b *builtinRightUTF8Sig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinRightUTF8Sig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -282,7 +281,7 @@ func (b *builtinRightUTF8Sig) vectorized() bool { // vecEvalString evals a builtinSpaceSig. // See https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_space -func (b *builtinSpaceSig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinSpaceSig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -327,7 +326,7 @@ func (b *builtinSpaceSig) vectorized() bool { // vecEvalString evals a REVERSE(str). // See https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_reverse -func (b *builtinReverseUTF8Sig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinReverseUTF8Sig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { if err := b.args[0].VecEvalString(ctx, input, result); err != nil { return err } @@ -352,7 +351,7 @@ func (b *builtinConcatSig) vectorized() bool { // vecEvalString evals a CONCAT(str1,str2,...) // See https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_concat -func (b *builtinConcatSig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinConcatSig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -404,7 +403,7 @@ func (b *builtinLocate3ArgsUTF8Sig) vectorized() bool { // vecEvalInt evals LOCATE(substr,str,pos). // See https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_locate -func (b *builtinLocate3ArgsUTF8Sig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinLocate3ArgsUTF8Sig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -470,7 +469,7 @@ func (b *builtinHexStrArgSig) vectorized() bool { // vecEvalString evals a builtinHexStrArgSig, corresponding to hex(str) // See https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_hex -func (b *builtinHexStrArgSig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinHexStrArgSig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf0, err := b.bufAllocator.get() if err != nil { @@ -497,7 +496,7 @@ func (b *builtinLTrimSig) vectorized() bool { // vecEvalString evals a builtinLTrimSig // See https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_ltrim -func (b *builtinLTrimSig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinLTrimSig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -526,7 +525,7 @@ func (b *builtinQuoteSig) vectorized() bool { return true } -func (b *builtinQuoteSig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinQuoteSig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -553,7 +552,7 @@ func (b *builtinInsertSig) vectorized() bool { return true } -func (b *builtinInsertSig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinInsertSig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() str, err := b.bufAllocator.get() if err != nil { @@ -626,7 +625,7 @@ func (b *builtinConcatWSSig) vectorized() bool { // vecEvalString evals a CONCAT_WS(separator,str1,str2,...). // See https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_concat-ws -func (b *builtinConcatWSSig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinConcatWSSig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() argsLen := len(b.args) @@ -703,7 +702,7 @@ func (b *builtinConvertSig) vectorized() bool { return true } -func (b *builtinConvertSig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinConvertSig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() expr, err := b.bufAllocator.get() if err != nil { @@ -774,7 +773,7 @@ func (b *builtinSubstringIndexSig) vectorized() bool { // vecEvalString evals a builtinSubstringIndexSig. // See https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_substring-index -func (b *builtinSubstringIndexSig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinSubstringIndexSig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -857,7 +856,7 @@ func (b *builtinUnHexSig) vectorized() bool { return true } -func (b *builtinUnHexSig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinUnHexSig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -894,7 +893,7 @@ func (b *builtinExportSet3ArgSig) vectorized() bool { // vecEvalString evals EXPORT_SET(bits,on,off). // See https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_export-set -func (b *builtinExportSet3ArgSig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinExportSet3ArgSig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() bits, err := b.bufAllocator.get() if err != nil { @@ -939,7 +938,7 @@ func (b *builtinASCIISig) vectorized() bool { // vecEvalInt evals a builtinASCIISig. // See https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_ascii -func (b *builtinASCIISig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinASCIISig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -972,7 +971,7 @@ func (b *builtinLpadSig) vectorized() bool { // vecEvalString evals LPAD(str,len,padstr). // See https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_lpad -func (b *builtinLpadSig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinLpadSig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() strBuf, err := b.bufAllocator.get() if err != nil { @@ -1044,7 +1043,7 @@ func (b *builtinLpadUTF8Sig) vectorized() bool { // vecEvalString evals LPAD(str,len,padstr). // See https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_lpad -func (b *builtinLpadUTF8Sig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinLpadUTF8Sig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -1113,7 +1112,7 @@ func (b *builtinFindInSetSig) vectorized() bool { return true } -func (b *builtinFindInSetSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinFindInSetSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() str, err := b.bufAllocator.get() if err != nil { @@ -1156,7 +1155,7 @@ func (b *builtinLeftSig) vectorized() bool { return true } -func (b *builtinLeftSig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinLeftSig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -1196,7 +1195,7 @@ func (b *builtinReverseSig) vectorized() bool { return true } -func (b *builtinReverseSig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinReverseSig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { if err := b.args[0].VecEvalString(ctx, input, result); err != nil { return err } @@ -1216,7 +1215,7 @@ func (b *builtinRTrimSig) vectorized() bool { // vecEvalString evals a builtinRTrimSig // See https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_rtrim -func (b *builtinRTrimSig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinRTrimSig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -1245,7 +1244,7 @@ func (b *builtinStrcmpSig) vectorized() bool { return true } -func (b *builtinStrcmpSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinStrcmpSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() leftBuf, err := b.bufAllocator.get() if err != nil { @@ -1280,7 +1279,7 @@ func (b *builtinLocate2ArgsSig) vectorized() bool { return true } -func (b *builtinLocate2ArgsSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinLocate2ArgsSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf0, err := b.bufAllocator.get() if err != nil { @@ -1321,7 +1320,7 @@ func (b *builtinLocate3ArgsSig) vectorized() bool { // vecEvalInt evals LOCATE(substr,str,pos), case-sensitive. // See https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_locate -func (b *builtinLocate3ArgsSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinLocate3ArgsSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf0, err := b.bufAllocator.get() if err != nil { @@ -1380,7 +1379,7 @@ func (b *builtinExportSet4ArgSig) vectorized() bool { // vecEvalString evals EXPORT_SET(bits,on,off,separator). // See https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_export-set -func (b *builtinExportSet4ArgSig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinExportSet4ArgSig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() bits, err := b.bufAllocator.get() if err != nil { @@ -1433,7 +1432,7 @@ func (b *builtinRpadSig) vectorized() bool { // vecEvalString evals RPAD(str,len,padstr). // See https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_rpad -func (b *builtinRpadSig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinRpadSig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() strBuf, err := b.bufAllocator.get() if err != nil { @@ -1503,7 +1502,7 @@ func (b *builtinFormatWithLocaleSig) vectorized() bool { return true } -func (b *builtinFormatWithLocaleSig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinFormatWithLocaleSig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() dBuf, err := b.bufAllocator.get() @@ -1560,7 +1559,7 @@ func (b *builtinSubstring2ArgsSig) vectorized() bool { return true } -func (b *builtinSubstring2ArgsSig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinSubstring2ArgsSig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -1609,7 +1608,7 @@ func (b *builtinSubstring2ArgsUTF8Sig) vectorized() bool { // vecEvalString evals SUBSTR(str,pos), SUBSTR(str FROM pos), SUBSTR() is a synonym for SUBSTRING(). // See https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_substr -func (b *builtinSubstring2ArgsUTF8Sig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinSubstring2ArgsUTF8Sig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -1662,7 +1661,7 @@ func (b *builtinTrim2ArgsSig) vectorized() bool { // vecEvalString evals a builtinTrim2ArgsSig, corresponding to trim(str, remstr) // See https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_trim -func (b *builtinTrim2ArgsSig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinTrim2ArgsSig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -1700,7 +1699,7 @@ func (b *builtinInstrUTF8Sig) vectorized() bool { return true } -func (b *builtinInstrUTF8Sig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinInstrUTF8Sig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() str, err := b.bufAllocator.get() if err != nil { @@ -1749,7 +1748,7 @@ func (b *builtinOctStringSig) vectorized() bool { return true } -func (b *builtinOctStringSig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinOctStringSig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -1798,7 +1797,7 @@ func (b *builtinEltSig) vectorized() bool { // vecEvalString evals a ELT(N,str1,str2,str3,...). // See https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_elt -func (b *builtinEltSig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinEltSig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf0, err := b.bufAllocator.get() if err != nil { @@ -1848,7 +1847,7 @@ func (b *builtinInsertUTF8Sig) vectorized() bool { // vecEvalString evals INSERT(str,pos,len,newstr). // See https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_insert -func (b *builtinInsertUTF8Sig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinInsertUTF8Sig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -1928,7 +1927,7 @@ func (b *builtinExportSet5ArgSig) vectorized() bool { // vecEvalString evals EXPORT_SET(bits,on,off,separator,number_of_bits). // See https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_export-set -func (b *builtinExportSet5ArgSig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinExportSet5ArgSig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() bits, err := b.bufAllocator.get() if err != nil { @@ -1994,7 +1993,7 @@ func (b *builtinSubstring3ArgsUTF8Sig) vectorized() bool { // vecEvalString evals SUBSTR(str,pos,len), SUBSTR(str FROM pos FOR len), SUBSTR() is a synonym for SUBSTRING(). // See https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_substr -func (b *builtinSubstring3ArgsUTF8Sig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinSubstring3ArgsUTF8Sig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -2063,7 +2062,7 @@ func (b *builtinTrim3ArgsSig) vectorized() bool { return true } -func (b *builtinTrim3ArgsSig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinTrim3ArgsSig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf0, err := b.bufAllocator.get() if err != nil { @@ -2115,7 +2114,7 @@ func (b *builtinOrdSig) vectorized() bool { return true } -func (b *builtinOrdSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinOrdSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -2153,7 +2152,7 @@ func (b *builtinInstrSig) vectorized() bool { return true } -func (b *builtinInstrSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinInstrSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() str, err := b.bufAllocator.get() if err != nil { @@ -2192,7 +2191,7 @@ func (b *builtinLengthSig) vectorized() bool { // vecEvalInt evaluates a builtinLengthSig. // See https://dev.mysql.com/doc/refman/5.7/en/string-functions.html -func (b *builtinLengthSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinLengthSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -2222,7 +2221,7 @@ func (b *builtinLocate2ArgsUTF8Sig) vectorized() bool { // vecEvalInt evals LOCATE(substr,str). // See https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_locate -func (b *builtinLocate2ArgsUTF8Sig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinLocate2ArgsUTF8Sig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -2275,7 +2274,7 @@ func (b *builtinBitLengthSig) vectorized() bool { return true } -func (b *builtinBitLengthSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinBitLengthSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -2303,7 +2302,7 @@ func (b *builtinCharSig) vectorized() bool { return true } -func (b *builtinCharSig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinCharSig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() l := len(b.args) buf := make([]*chunk.Column, l-1) @@ -2360,7 +2359,7 @@ func (b *builtinReplaceSig) vectorized() bool { // vecEvalString evals a builtinReplaceSig. // See https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_replace -func (b *builtinReplaceSig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinReplaceSig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -2412,7 +2411,7 @@ func (b *builtinMakeSetSig) vectorized() bool { // vecEvalString evals MAKE_SET(bits,str1,str2,...). // See https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_make-set -func (b *builtinMakeSetSig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinMakeSetSig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { nr := input.NumRows() bitsBuf, err := b.bufAllocator.get() if err != nil { @@ -2460,7 +2459,7 @@ func (b *builtinOctIntSig) vectorized() bool { return true } -func (b *builtinOctIntSig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinOctIntSig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -2489,7 +2488,7 @@ func (b *builtinToBase64Sig) vectorized() bool { // vecEvalString evals a builtinToBase64Sig. // See https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_to-base64 -func (b *builtinToBase64Sig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinToBase64Sig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -2536,7 +2535,7 @@ func (b *builtinTrim1ArgSig) vectorized() bool { return true } -func (b *builtinTrim1ArgSig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinTrim1ArgSig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -2567,7 +2566,7 @@ func (b *builtinRpadUTF8Sig) vectorized() bool { // vecEvalString evals RPAD(str,len,padstr). // See https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_rpad -func (b *builtinRpadUTF8Sig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinRpadUTF8Sig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -2636,7 +2635,7 @@ func (b *builtinCharLengthBinarySig) vectorized() bool { return true } -func (b *builtinCharLengthBinarySig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinCharLengthBinarySig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -2663,7 +2662,7 @@ func (b *builtinBinSig) vectorized() bool { return true } -func (b *builtinBinSig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinBinSig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -2692,7 +2691,7 @@ func (b *builtinFormatSig) vectorized() bool { // vecEvalString evals FORMAT(X,D). // See https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_format -func (b *builtinFormatSig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinFormatSig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() dBuf, err := b.bufAllocator.get() @@ -2740,7 +2739,7 @@ func (b *builtinRightSig) vectorized() bool { return true } -func (b *builtinRightSig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinRightSig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -2783,7 +2782,7 @@ func (b *builtinSubstring3ArgsSig) vectorized() bool { // vecEvalString evals SUBSTR(str,pos,len), SUBSTR(str FROM pos FOR len), SUBSTR() is a synonym for SUBSTRING(). // See https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_substr -func (b *builtinSubstring3ArgsSig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinSubstring3ArgsSig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -2852,7 +2851,7 @@ func (b *builtinHexIntArgSig) vectorized() bool { return true } -func (b *builtinHexIntArgSig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinHexIntArgSig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -2880,7 +2879,7 @@ func (b *builtinFromBase64Sig) vectorized() bool { // vecEvalString evals FROM_BASE64(str). // See https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_from-base64 -func (b *builtinFromBase64Sig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinFromBase64Sig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -2928,7 +2927,7 @@ func (b *builtinCharLengthUTF8Sig) vectorized() bool { return true } -func (b *builtinCharLengthUTF8Sig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinCharLengthUTF8Sig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -2952,7 +2951,7 @@ func (b *builtinCharLengthUTF8Sig) vecEvalInt(ctx sessionctx.Context, input *chu return nil } -func formatDecimal(sctx sessionctx.Context, xBuf *chunk.Column, dInt64s []int64, result *chunk.Column, localeBuf *chunk.Column) error { +func formatDecimal(sctx EvalContext, xBuf *chunk.Column, dInt64s []int64, result *chunk.Column, localeBuf *chunk.Column) error { xDecimals := xBuf.Decimals() for i := range xDecimals { if xBuf.IsNull(i) { @@ -2973,10 +2972,10 @@ func formatDecimal(sctx sessionctx.Context, xBuf *chunk.Column, dInt64s []int64, // FORMAT(x, d) } else if localeBuf.IsNull(i) { // FORMAT(x, d, NULL) - sctx.GetSessionVars().StmtCtx.AppendWarning(errUnknownLocale.GenWithStackByArgs("NULL")) + sctx.GetSessionVars().StmtCtx.AppendWarning(errUnknownLocale.FastGenByArgs("NULL")) } else if !strings.EqualFold(localeBuf.GetString(i), "en_US") { // TODO: support other locales. - sctx.GetSessionVars().StmtCtx.AppendWarning(errUnknownLocale.GenWithStackByArgs(localeBuf.GetString(i))) + sctx.GetSessionVars().StmtCtx.AppendWarning(errUnknownLocale.FastGenByArgs(localeBuf.GetString(i))) } xStr := roundFormatArgs(x.String(), int(d)) @@ -2992,7 +2991,7 @@ func formatDecimal(sctx sessionctx.Context, xBuf *chunk.Column, dInt64s []int64, return nil } -func formatReal(sctx sessionctx.Context, xBuf *chunk.Column, dInt64s []int64, result *chunk.Column, localeBuf *chunk.Column) error { +func formatReal(sctx EvalContext, xBuf *chunk.Column, dInt64s []int64, result *chunk.Column, localeBuf *chunk.Column) error { xFloat64s := xBuf.Float64s() for i := range xFloat64s { if xBuf.IsNull(i) { @@ -3013,10 +3012,10 @@ func formatReal(sctx sessionctx.Context, xBuf *chunk.Column, dInt64s []int64, re // FORMAT(x, d) } else if localeBuf.IsNull(i) { // FORMAT(x, d, NULL) - sctx.GetSessionVars().StmtCtx.AppendWarning(errUnknownLocale.GenWithStackByArgs("NULL")) + sctx.GetSessionVars().StmtCtx.AppendWarning(errUnknownLocale.FastGenByArgs("NULL")) } else if !strings.EqualFold(localeBuf.GetString(i), "en_US") { // TODO: support other locales. - sctx.GetSessionVars().StmtCtx.AppendWarning(errUnknownLocale.GenWithStackByArgs(localeBuf.GetString(i))) + sctx.GetSessionVars().StmtCtx.AppendWarning(errUnknownLocale.FastGenByArgs(localeBuf.GetString(i))) } xStr := roundFormatArgs(strconv.FormatFloat(x, 'f', -1, 64), int(d)) @@ -3032,7 +3031,7 @@ func formatReal(sctx sessionctx.Context, xBuf *chunk.Column, dInt64s []int64, re return nil } -func (b *builtinTranslateBinarySig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinTranslateBinarySig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf0, err := b.bufAllocator.get() if err != nil { @@ -3105,7 +3104,7 @@ func (b *builtinTranslateBinarySig) vectorized() bool { return true } -func (b *builtinTranslateUTF8Sig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinTranslateUTF8Sig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf0, err := b.bufAllocator.get() if err != nil { diff --git a/pkg/expression/builtin_string_vec_generated.go b/pkg/expression/builtin_string_vec_generated.go index 696353dcd7a58..ef8e29dd0af43 100644 --- a/pkg/expression/builtin_string_vec_generated.go +++ b/pkg/expression/builtin_string_vec_generated.go @@ -17,13 +17,12 @@ package expression import ( - "github.com/pingcap/tidb/pkg/sessionctx" "github.com/pingcap/tidb/pkg/util/chunk" ) // vecEvalInt evals FIELD(str,str1,str2,str3,...). // See https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_field -func (b *builtinFieldIntSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinFieldIntSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf0, err := b.bufAllocator.get() if err != nil { @@ -73,7 +72,7 @@ func (b *builtinFieldIntSig) vectorized() bool { // vecEvalInt evals FIELD(str,str1,str2,str3,...). // See https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_field -func (b *builtinFieldRealSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinFieldRealSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf0, err := b.bufAllocator.get() if err != nil { @@ -123,7 +122,7 @@ func (b *builtinFieldRealSig) vectorized() bool { // vecEvalInt evals FIELD(str,str1,str2,str3,...). // See https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_field -func (b *builtinFieldStringSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinFieldStringSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf0, err := b.bufAllocator.get() if err != nil { diff --git a/pkg/expression/builtin_test.go b/pkg/expression/builtin_test.go index 703059a2b1b26..ca71c5af03b21 100644 --- a/pkg/expression/builtin_test.go +++ b/pkg/expression/builtin_test.go @@ -17,8 +17,11 @@ package expression import ( "reflect" "sync" + "sync/atomic" "testing" + "time" + "github.com/pingcap/errors" "github.com/pingcap/tidb/pkg/parser/ast" "github.com/pingcap/tidb/pkg/parser/charset" "github.com/pingcap/tidb/pkg/parser/model" @@ -30,7 +33,7 @@ import ( "github.com/stretchr/testify/require" ) -func evalBuiltinFuncConcurrent(f builtinFunc, ctx sessionctx.Context, row chunk.Row) (d types.Datum, err error) { +func evalBuiltinFuncConcurrent(f builtinFunc, ctx EvalContext, row chunk.Row) (d types.Datum, err error) { var wg util.WaitGroupWrapper concurrency := 10 var lock sync.Mutex @@ -49,7 +52,7 @@ func evalBuiltinFuncConcurrent(f builtinFunc, ctx sessionctx.Context, row chunk. return } -func evalBuiltinFunc(f builtinFunc, ctx sessionctx.Context, row chunk.Row) (d types.Datum, err error) { +func evalBuiltinFunc(f builtinFunc, ctx EvalContext, row chunk.Row) (d types.Datum, err error) { var ( res interface{} isNull bool @@ -161,6 +164,100 @@ func TestDisplayName(t *testing.T) { require.Equal(t, "other_unknown_func", GetDisplayName("other_unknown_func")) } +func TestBuiltinFuncCacheConcurrency(t *testing.T) { + cache := builtinFuncCache[int]{} + ctx := createContext(t) + + var invoked atomic.Int64 + construct := func() (int, error) { + invoked.Add(1) + time.Sleep(time.Millisecond) + return 100 + int(invoked.Load()), nil + } + + var wg sync.WaitGroup + concurrency := 8 + wg.Add(concurrency) + for i := 0; i < concurrency; i++ { + go func() { + defer wg.Done() + v, err := cache.getOrInitCache(ctx, construct) + // all goroutines should get the same value + require.NoError(t, err) + require.Equal(t, 101, v) + }() + } + + wg.Wait() + // construct will only be called once even in concurrency + require.Equal(t, int64(1), invoked.Load()) +} + +func TestBuiltinFuncCache(t *testing.T) { + cache := builtinFuncCache[int]{} + ctx := createContext(t) + + // ok should be false when no cache present + v, ok := cache.getCache(ctx.GetSessionVars().StmtCtx.CtxID()) + require.Equal(t, 0, v) + require.False(t, ok) + + // getCache should not init cache + v, ok = cache.getCache(ctx.GetSessionVars().StmtCtx.CtxID()) + require.Equal(t, 0, v) + require.False(t, ok) + + var invoked atomic.Int64 + returnError := false + construct := func() (int, error) { + invoked.Add(1) + if returnError { + return 128, errors.New("mockError") + } + return 100 + int(invoked.Load()), nil + } + + // the first getOrInitCache should init cache + v, err := cache.getOrInitCache(ctx, construct) + require.NoError(t, err) + require.Equal(t, 101, v) + require.Equal(t, int64(1), invoked.Load()) + + // get should return the cache + v, ok = cache.getCache(ctx.GetSessionVars().StmtCtx.CtxID()) + require.Equal(t, 101, v) + require.True(t, ok) + + // the second should use the cached one + v, err = cache.getOrInitCache(ctx, construct) + require.NoError(t, err) + require.Equal(t, 101, v) + require.Equal(t, int64(1), invoked.Load()) + + // if ctxID changed, should re-init cache + ctx = createContext(t) + v, err = cache.getOrInitCache(ctx, construct) + require.NoError(t, err) + require.Equal(t, 102, v) + require.Equal(t, int64(2), invoked.Load()) + v, ok = cache.getCache(ctx.GetSessionVars().StmtCtx.CtxID()) + require.Equal(t, 102, v) + require.True(t, ok) + + // error should be returned + ctx = createContext(t) + returnError = true + v, err = cache.getOrInitCache(ctx, construct) + require.Equal(t, 0, v) + require.EqualError(t, err, "mockError") + + // error should not be cached + returnError = false + v, err = cache.getOrInitCache(ctx, construct) + require.NoError(t, err) + require.Equal(t, 104, v) +} + // newFunctionForTest creates a new ScalarFunction using funcName and arguments, // it is different from expression.NewFunction which needs an additional retType argument. func newFunctionForTest(ctx sessionctx.Context, funcName string, args ...Expression) (Expression, error) { @@ -178,7 +275,6 @@ func newFunctionForTest(ctx sessionctx.Context, funcName string, args ...Express FuncName: model.NewCIStr(funcName), RetType: f.getRetTp(), Function: f, - ctx: ctx, }, nil } diff --git a/pkg/expression/builtin_time.go b/pkg/expression/builtin_time.go index 82f9708a34fdb..8104532d336c0 100644 --- a/pkg/expression/builtin_time.go +++ b/pkg/expression/builtin_time.go @@ -30,6 +30,7 @@ import ( "github.com/pingcap/errors" "github.com/pingcap/failpoint" "github.com/pingcap/tidb/pkg/config" + "github.com/pingcap/tidb/pkg/errctx" "github.com/pingcap/tidb/pkg/parser/ast" "github.com/pingcap/tidb/pkg/parser/mysql" "github.com/pingcap/tidb/pkg/parser/terror" @@ -270,7 +271,7 @@ func (b *builtinDateSig) Clone() builtinFunc { // evalTime evals DATE(expr). // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_date -func (b *builtinDateSig) evalTime(ctx sessionctx.Context, row chunk.Row) (types.Time, bool, error) { +func (b *builtinDateSig) evalTime(ctx EvalContext, row chunk.Row) (types.Time, bool, error) { expr, isNull, err := b.args[0].EvalTime(ctx, row) if isNull || err != nil { return types.ZeroTime, true, handleInvalidTimeError(ctx, err) @@ -331,7 +332,7 @@ func (b *builtinDateLiteralSig) Clone() builtinFunc { // evalTime evals DATE 'stringLit'. // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-literals.html -func (b *builtinDateLiteralSig) evalTime(ctx sessionctx.Context, row chunk.Row) (types.Time, bool, error) { +func (b *builtinDateLiteralSig) evalTime(ctx EvalContext, row chunk.Row) (types.Time, bool, error) { mode := ctx.GetSessionVars().SQLMode if mode.HasNoZeroDateMode() && b.literal.IsZero() { return b.literal, true, types.ErrWrongValue.GenWithStackByArgs(types.DateStr, b.literal.String()) @@ -371,7 +372,7 @@ func (b *builtinDateDiffSig) Clone() builtinFunc { // evalInt evals a builtinDateDiffSig. // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_datediff -func (b *builtinDateDiffSig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinDateDiffSig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { lhs, isNull, err := b.args[0].EvalTime(ctx, row) if isNull || err != nil { return 0, true, handleInvalidTimeError(ctx, err) @@ -482,7 +483,7 @@ func (b *builtinDurationDurationTimeDiffSig) Clone() builtinFunc { // evalDuration evals a builtinDurationDurationTimeDiffSig. // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_timediff -func (b *builtinDurationDurationTimeDiffSig) evalDuration(ctx sessionctx.Context, row chunk.Row) (d types.Duration, isNull bool, err error) { +func (b *builtinDurationDurationTimeDiffSig) evalDuration(ctx EvalContext, row chunk.Row) (d types.Duration, isNull bool, err error) { lhs, isNull, err := b.args[0].EvalDuration(ctx, row) if isNull || err != nil { return d, isNull, err @@ -509,7 +510,7 @@ func (b *builtinTimeTimeTimeDiffSig) Clone() builtinFunc { // evalDuration evals a builtinTimeTimeTimeDiffSig. // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_timediff -func (b *builtinTimeTimeTimeDiffSig) evalDuration(ctx sessionctx.Context, row chunk.Row) (d types.Duration, isNull bool, err error) { +func (b *builtinTimeTimeTimeDiffSig) evalDuration(ctx EvalContext, row chunk.Row) (d types.Duration, isNull bool, err error) { lhs, isNull, err := b.args[0].EvalTime(ctx, row) if isNull || err != nil { return d, isNull, err @@ -537,7 +538,7 @@ func (b *builtinDurationStringTimeDiffSig) Clone() builtinFunc { // evalDuration evals a builtinDurationStringTimeDiffSig. // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_timediff -func (b *builtinDurationStringTimeDiffSig) evalDuration(ctx sessionctx.Context, row chunk.Row) (d types.Duration, isNull bool, err error) { +func (b *builtinDurationStringTimeDiffSig) evalDuration(ctx EvalContext, row chunk.Row) (d types.Duration, isNull bool, err error) { lhs, isNull, err := b.args[0].EvalDuration(ctx, row) if isNull || err != nil { return d, isNull, err @@ -570,7 +571,7 @@ func (b *builtinStringDurationTimeDiffSig) Clone() builtinFunc { // evalDuration evals a builtinStringDurationTimeDiffSig. // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_timediff -func (b *builtinStringDurationTimeDiffSig) evalDuration(ctx sessionctx.Context, row chunk.Row) (d types.Duration, isNull bool, err error) { +func (b *builtinStringDurationTimeDiffSig) evalDuration(ctx EvalContext, row chunk.Row) (d types.Duration, isNull bool, err error) { lhsStr, isNull, err := b.args[0].EvalString(ctx, row) if isNull || err != nil { return d, isNull, err @@ -602,7 +603,7 @@ func calculateTimeDiff(sc *stmtctx.StatementContext, lhs, rhs types.Time) (d typ } // calculateDurationTimeDiff calculates interval difference of two types.Duration. -func calculateDurationTimeDiff(ctx sessionctx.Context, lhs, rhs types.Duration) (d types.Duration, isNull bool, err error) { +func calculateDurationTimeDiff(ctx EvalContext, lhs, rhs types.Duration) (d types.Duration, isNull bool, err error) { d, err = lhs.Sub(rhs) if err != nil { return d, true, err @@ -628,7 +629,7 @@ func (b *builtinTimeStringTimeDiffSig) Clone() builtinFunc { // evalDuration evals a builtinTimeStringTimeDiffSig. // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_timediff -func (b *builtinTimeStringTimeDiffSig) evalDuration(ctx sessionctx.Context, row chunk.Row) (d types.Duration, isNull bool, err error) { +func (b *builtinTimeStringTimeDiffSig) evalDuration(ctx EvalContext, row chunk.Row) (d types.Duration, isNull bool, err error) { lhs, isNull, err := b.args[0].EvalTime(ctx, row) if isNull || err != nil { return d, isNull, err @@ -661,7 +662,7 @@ func (b *builtinStringTimeTimeDiffSig) Clone() builtinFunc { // evalDuration evals a builtinStringTimeTimeDiffSig. // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_timediff -func (b *builtinStringTimeTimeDiffSig) evalDuration(ctx sessionctx.Context, row chunk.Row) (d types.Duration, isNull bool, err error) { +func (b *builtinStringTimeTimeDiffSig) evalDuration(ctx EvalContext, row chunk.Row) (d types.Duration, isNull bool, err error) { lhsStr, isNull, err := b.args[0].EvalString(ctx, row) if isNull || err != nil { return d, isNull, err @@ -694,7 +695,7 @@ func (b *builtinStringStringTimeDiffSig) Clone() builtinFunc { // evalDuration evals a builtinStringStringTimeDiffSig. // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_timediff -func (b *builtinStringStringTimeDiffSig) evalDuration(ctx sessionctx.Context, row chunk.Row) (d types.Duration, isNull bool, err error) { +func (b *builtinStringStringTimeDiffSig) evalDuration(ctx EvalContext, row chunk.Row) (d types.Duration, isNull bool, err error) { lhs, isNull, err := b.args[0].EvalString(ctx, row) if isNull || err != nil { return d, isNull, err @@ -742,7 +743,7 @@ func (b *builtinNullTimeDiffSig) Clone() builtinFunc { // evalDuration evals a builtinNullTimeDiffSig. // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_timediff -func (b *builtinNullTimeDiffSig) evalDuration(ctx sessionctx.Context, row chunk.Row) (d types.Duration, isNull bool, err error) { +func (b *builtinNullTimeDiffSig) evalDuration(ctx EvalContext, row chunk.Row) (d types.Duration, isNull bool, err error) { return d, true, nil } @@ -790,7 +791,7 @@ func (b *builtinDateFormatSig) Clone() builtinFunc { // evalString evals a builtinDateFormatSig. // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_date-format -func (b *builtinDateFormatSig) evalString(ctx sessionctx.Context, row chunk.Row) (string, bool, error) { +func (b *builtinDateFormatSig) evalString(ctx EvalContext, row chunk.Row) (string, bool, error) { t, isNull, err := b.args[0].EvalTime(ctx, row) if isNull || err != nil { return "", isNull, handleInvalidTimeError(ctx, err) @@ -852,7 +853,7 @@ func (b *builtinFromDaysSig) Clone() builtinFunc { // evalTime evals FROM_DAYS(N). // See https://dev.mysql.com/doc/refman/8.0/en/date-and-time-functions.html#function_from-days -func (b *builtinFromDaysSig) evalTime(ctx sessionctx.Context, row chunk.Row) (types.Time, bool, error) { +func (b *builtinFromDaysSig) evalTime(ctx EvalContext, row chunk.Row) (types.Time, bool, error) { n, isNull, err := b.args[0].EvalInt(ctx, row) if isNull || err != nil { return types.ZeroTime, true, err @@ -896,7 +897,7 @@ func (b *builtinHourSig) Clone() builtinFunc { // evalInt evals HOUR(time). // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_hour -func (b *builtinHourSig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinHourSig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { dur, isNull, err := b.args[0].EvalDuration(ctx, row) // ignore error and return NULL if isNull || err != nil { @@ -936,7 +937,7 @@ func (b *builtinMinuteSig) Clone() builtinFunc { // evalInt evals MINUTE(time). // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_minute -func (b *builtinMinuteSig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinMinuteSig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { dur, isNull, err := b.args[0].EvalDuration(ctx, row) // ignore error and return NULL if isNull || err != nil { @@ -976,7 +977,7 @@ func (b *builtinSecondSig) Clone() builtinFunc { // evalInt evals SECOND(time). // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_second -func (b *builtinSecondSig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinSecondSig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { dur, isNull, err := b.args[0].EvalDuration(ctx, row) // ignore error and return NULL if isNull || err != nil { @@ -1016,7 +1017,7 @@ func (b *builtinMicroSecondSig) Clone() builtinFunc { // evalInt evals MICROSECOND(expr). // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_microsecond -func (b *builtinMicroSecondSig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinMicroSecondSig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { dur, isNull, err := b.args[0].EvalDuration(ctx, row) // ignore error and return NULL if isNull || err != nil { @@ -1056,7 +1057,7 @@ func (b *builtinMonthSig) Clone() builtinFunc { // evalInt evals MONTH(date). // see: https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_month -func (b *builtinMonthSig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinMonthSig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { date, isNull, err := b.args[0].EvalTime(ctx, row) if isNull || err != nil { @@ -1098,7 +1099,7 @@ func (b *builtinMonthNameSig) Clone() builtinFunc { return newSig } -func (b *builtinMonthNameSig) evalString(ctx sessionctx.Context, row chunk.Row) (string, bool, error) { +func (b *builtinMonthNameSig) evalString(ctx EvalContext, row chunk.Row) (string, bool, error) { arg, isNull, err := b.args[0].EvalTime(ctx, row) if isNull || err != nil { return "", true, handleInvalidTimeError(ctx, err) @@ -1143,7 +1144,7 @@ func (b *builtinDayNameSig) Clone() builtinFunc { return newSig } -func (b *builtinDayNameSig) evalIndex(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinDayNameSig) evalIndex(ctx EvalContext, row chunk.Row) (int64, bool, error) { arg, isNull, err := b.args[0].EvalTime(ctx, row) if isNull || err != nil { return 0, isNull, err @@ -1160,7 +1161,7 @@ func (b *builtinDayNameSig) evalIndex(ctx sessionctx.Context, row chunk.Row) (in // evalString evals a builtinDayNameSig. // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_dayname -func (b *builtinDayNameSig) evalString(ctx sessionctx.Context, row chunk.Row) (string, bool, error) { +func (b *builtinDayNameSig) evalString(ctx EvalContext, row chunk.Row) (string, bool, error) { idx, isNull, err := b.evalIndex(ctx, row) if isNull || err != nil { return "", isNull, err @@ -1168,7 +1169,7 @@ func (b *builtinDayNameSig) evalString(ctx sessionctx.Context, row chunk.Row) (s return types.WeekdayNames[idx], false, nil } -func (b *builtinDayNameSig) evalReal(ctx sessionctx.Context, row chunk.Row) (float64, bool, error) { +func (b *builtinDayNameSig) evalReal(ctx EvalContext, row chunk.Row) (float64, bool, error) { idx, isNull, err := b.evalIndex(ctx, row) if isNull || err != nil { return 0, isNull, err @@ -1176,7 +1177,7 @@ func (b *builtinDayNameSig) evalReal(ctx sessionctx.Context, row chunk.Row) (flo return float64(idx), false, nil } -func (b *builtinDayNameSig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinDayNameSig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { idx, isNull, err := b.evalIndex(ctx, row) if isNull || err != nil { return 0, isNull, err @@ -1214,7 +1215,7 @@ func (b *builtinDayOfMonthSig) Clone() builtinFunc { // evalInt evals a builtinDayOfMonthSig. // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_dayofmonth -func (b *builtinDayOfMonthSig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinDayOfMonthSig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { arg, isNull, err := b.args[0].EvalTime(ctx, row) if isNull || err != nil { return 0, true, handleInvalidTimeError(ctx, err) @@ -1252,7 +1253,7 @@ func (b *builtinDayOfWeekSig) Clone() builtinFunc { // evalInt evals a builtinDayOfWeekSig. // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_dayofweek -func (b *builtinDayOfWeekSig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinDayOfWeekSig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { arg, isNull, err := b.args[0].EvalTime(ctx, row) if isNull || err != nil { return 0, true, handleInvalidTimeError(ctx, err) @@ -1294,7 +1295,7 @@ func (b *builtinDayOfYearSig) Clone() builtinFunc { // evalInt evals a builtinDayOfYearSig. // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_dayofyear -func (b *builtinDayOfYearSig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinDayOfYearSig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { arg, isNull, err := b.args[0].EvalTime(ctx, row) if isNull || err != nil { return 0, isNull, handleInvalidTimeError(ctx, err) @@ -1350,7 +1351,7 @@ func (b *builtinWeekWithModeSig) Clone() builtinFunc { // evalInt evals WEEK(date, mode). // see: https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_week -func (b *builtinWeekWithModeSig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinWeekWithModeSig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { date, isNull, err := b.args[0].EvalTime(ctx, row) if isNull || err != nil { @@ -1382,7 +1383,7 @@ func (b *builtinWeekWithoutModeSig) Clone() builtinFunc { // evalInt evals WEEK(date). // see: https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_week -func (b *builtinWeekWithoutModeSig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinWeekWithoutModeSig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { date, isNull, err := b.args[0].EvalTime(ctx, row) if isNull || err != nil { @@ -1437,7 +1438,7 @@ func (b *builtinWeekDaySig) Clone() builtinFunc { } // evalInt evals WEEKDAY(date). -func (b *builtinWeekDaySig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinWeekDaySig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { date, isNull, err := b.args[0].EvalTime(ctx, row) if isNull || err != nil { return 0, true, handleInvalidTimeError(ctx, err) @@ -1481,7 +1482,7 @@ func (b *builtinWeekOfYearSig) Clone() builtinFunc { // evalInt evals WEEKOFYEAR(date). // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_weekofyear -func (b *builtinWeekOfYearSig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinWeekOfYearSig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { date, isNull, err := b.args[0].EvalTime(ctx, row) if isNull || err != nil { @@ -1527,7 +1528,7 @@ func (b *builtinYearSig) Clone() builtinFunc { // evalInt evals YEAR(date). // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_year -func (b *builtinYearSig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinYearSig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { date, isNull, err := b.args[0].EvalTime(ctx, row) if isNull || err != nil { @@ -1580,7 +1581,7 @@ func (b *builtinYearWeekWithModeSig) Clone() builtinFunc { // evalInt evals YEARWEEK(date,mode). // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_yearweek -func (b *builtinYearWeekWithModeSig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinYearWeekWithModeSig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { date, isNull, err := b.args[0].EvalTime(ctx, row) if isNull || err != nil { return 0, isNull, handleInvalidTimeError(ctx, err) @@ -1617,7 +1618,7 @@ func (b *builtinYearWeekWithoutModeSig) Clone() builtinFunc { // evalInt evals YEARWEEK(date). // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_yearweek -func (b *builtinYearWeekWithoutModeSig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinYearWeekWithoutModeSig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { date, isNull, err := b.args[0].EvalTime(ctx, row) if isNull || err != nil { return 0, true, handleInvalidTimeError(ctx, err) @@ -1693,7 +1694,7 @@ func (c *fromUnixTimeFunctionClass) getFunction(ctx sessionctx.Context, args []E return sig, nil } -func evalFromUnixTime(ctx sessionctx.Context, fsp int, unixTimeStamp *types.MyDecimal) (res types.Time, isNull bool, err error) { +func evalFromUnixTime(ctx EvalContext, fsp int, unixTimeStamp *types.MyDecimal) (res types.Time, isNull bool, err error) { // 0 <= unixTimeStamp <= 32536771199.999999 if unixTimeStamp.IsNegative() { return res, true, nil @@ -1763,7 +1764,7 @@ func (b *builtinFromUnixTime1ArgSig) Clone() builtinFunc { // evalTime evals a builtinFromUnixTime1ArgSig. // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_from-unixtime -func (b *builtinFromUnixTime1ArgSig) evalTime(ctx sessionctx.Context, row chunk.Row) (res types.Time, isNull bool, err error) { +func (b *builtinFromUnixTime1ArgSig) evalTime(ctx EvalContext, row chunk.Row) (res types.Time, isNull bool, err error) { unixTimeStamp, isNull, err := b.args[0].EvalDecimal(ctx, row) if err != nil || isNull { return res, isNull, err @@ -1783,7 +1784,7 @@ func (b *builtinFromUnixTime2ArgSig) Clone() builtinFunc { // evalString evals a builtinFromUnixTime2ArgSig. // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_from-unixtime -func (b *builtinFromUnixTime2ArgSig) evalString(ctx sessionctx.Context, row chunk.Row) (res string, isNull bool, err error) { +func (b *builtinFromUnixTime2ArgSig) evalString(ctx EvalContext, row chunk.Row) (res string, isNull bool, err error) { format, isNull, err := b.args[1].EvalString(ctx, row) if isNull || err != nil { return "", true, err @@ -1830,7 +1831,7 @@ func (b *builtinGetFormatSig) Clone() builtinFunc { // evalString evals a builtinGetFormatSig. // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_get-format -func (b *builtinGetFormatSig) evalString(ctx sessionctx.Context, row chunk.Row) (string, bool, error) { +func (b *builtinGetFormatSig) evalString(ctx EvalContext, row chunk.Row) (string, bool, error) { t, isNull, err := b.args[0].EvalString(ctx, row) if isNull || err != nil { return "", isNull, err @@ -1916,7 +1917,7 @@ func (b *builtinStrToDateDateSig) Clone() builtinFunc { return newSig } -func (b *builtinStrToDateDateSig) evalTime(ctx sessionctx.Context, row chunk.Row) (types.Time, bool, error) { +func (b *builtinStrToDateDateSig) evalTime(ctx EvalContext, row chunk.Row) (types.Time, bool, error) { date, isNull, err := b.args[0].EvalString(ctx, row) if isNull || err != nil { return types.ZeroTime, isNull, err @@ -1949,7 +1950,7 @@ func (b *builtinStrToDateDatetimeSig) Clone() builtinFunc { return newSig } -func (b *builtinStrToDateDatetimeSig) evalTime(ctx sessionctx.Context, row chunk.Row) (types.Time, bool, error) { +func (b *builtinStrToDateDatetimeSig) evalTime(ctx EvalContext, row chunk.Row) (types.Time, bool, error) { date, isNull, err := b.args[0].EvalString(ctx, row) if isNull || err != nil { return types.ZeroTime, isNull, err @@ -1985,7 +1986,7 @@ func (b *builtinStrToDateDurationSig) Clone() builtinFunc { // evalDuration // TODO: If the NO_ZERO_DATE or NO_ZERO_IN_DATE SQL mode is enabled, zero dates or part of dates are disallowed. // In that case, STR_TO_DATE() returns NULL and generates a warning. -func (b *builtinStrToDateDurationSig) evalDuration(ctx sessionctx.Context, row chunk.Row) (types.Duration, bool, error) { +func (b *builtinStrToDateDurationSig) evalDuration(ctx EvalContext, row chunk.Row) (types.Duration, bool, error) { date, isNull, err := b.args[0].EvalString(ctx, row) if isNull || err != nil { return types.Duration{}, isNull, err @@ -2052,7 +2053,7 @@ func (b *builtinSysDateWithFspSig) Clone() builtinFunc { // evalTime evals SYSDATE(fsp). // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_sysdate -func (b *builtinSysDateWithFspSig) evalTime(ctx sessionctx.Context, row chunk.Row) (val types.Time, isNull bool, err error) { +func (b *builtinSysDateWithFspSig) evalTime(ctx EvalContext, row chunk.Row) (val types.Time, isNull bool, err error) { fsp, isNull, err := b.args[0].EvalInt(ctx, row) if isNull || err != nil { return types.ZeroTime, isNull, err @@ -2079,7 +2080,7 @@ func (b *builtinSysDateWithoutFspSig) Clone() builtinFunc { // evalTime evals SYSDATE(). // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_sysdate -func (b *builtinSysDateWithoutFspSig) evalTime(ctx sessionctx.Context, row chunk.Row) (val types.Time, isNull bool, err error) { +func (b *builtinSysDateWithoutFspSig) evalTime(ctx EvalContext, row chunk.Row) (val types.Time, isNull bool, err error) { tz := ctx.GetSessionVars().Location() now := time.Now().In(tz) result, err := convertTimeToMysqlTime(now, 0, types.ModeHalfUp) @@ -2118,7 +2119,7 @@ func (b *builtinCurrentDateSig) Clone() builtinFunc { // evalTime evals CURDATE(). // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_curdate -func (b *builtinCurrentDateSig) evalTime(ctx sessionctx.Context, row chunk.Row) (val types.Time, isNull bool, err error) { +func (b *builtinCurrentDateSig) evalTime(ctx EvalContext, row chunk.Row) (val types.Time, isNull bool, err error) { tz := ctx.GetSessionVars().Location() nowTs, err := getStmtTimestamp(ctx) if err != nil { @@ -2174,7 +2175,7 @@ func (b *builtinCurrentTime0ArgSig) Clone() builtinFunc { return newSig } -func (b *builtinCurrentTime0ArgSig) evalDuration(ctx sessionctx.Context, row chunk.Row) (types.Duration, bool, error) { +func (b *builtinCurrentTime0ArgSig) evalDuration(ctx EvalContext, row chunk.Row) (types.Duration, bool, error) { tz := ctx.GetSessionVars().Location() nowTs, err := getStmtTimestamp(ctx) if err != nil { @@ -2198,7 +2199,7 @@ func (b *builtinCurrentTime1ArgSig) Clone() builtinFunc { return newSig } -func (b *builtinCurrentTime1ArgSig) evalDuration(ctx sessionctx.Context, row chunk.Row) (types.Duration, bool, error) { +func (b *builtinCurrentTime1ArgSig) evalDuration(ctx EvalContext, row chunk.Row) (types.Duration, bool, error) { fsp, _, err := b.args[0].EvalInt(ctx, row) if err != nil { return types.Duration{}, true, err @@ -2251,7 +2252,7 @@ func (b *builtinTimeSig) Clone() builtinFunc { // evalDuration evals a builtinTimeSig. // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_time. -func (b *builtinTimeSig) evalDuration(ctx sessionctx.Context, row chunk.Row) (res types.Duration, isNull bool, err error) { +func (b *builtinTimeSig) evalDuration(ctx EvalContext, row chunk.Row) (res types.Duration, isNull bool, err error) { expr, isNull, err := b.args[0].EvalString(ctx, row) if isNull || err != nil { return res, isNull, err @@ -2322,7 +2323,7 @@ func (b *builtinTimeLiteralSig) Clone() builtinFunc { // evalDuration evals TIME 'stringLit'. // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-literals.html -func (b *builtinTimeLiteralSig) evalDuration(ctx sessionctx.Context, row chunk.Row) (types.Duration, bool, error) { +func (b *builtinTimeLiteralSig) evalDuration(ctx EvalContext, row chunk.Row) (types.Duration, bool, error) { return b.duration, false, nil } @@ -2355,7 +2356,7 @@ func (b *builtinUTCDateSig) Clone() builtinFunc { // evalTime evals UTC_DATE, UTC_DATE(). // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_utc-date -func (b *builtinUTCDateSig) evalTime(ctx sessionctx.Context, row chunk.Row) (types.Time, bool, error) { +func (b *builtinUTCDateSig) evalTime(ctx EvalContext, row chunk.Row) (types.Time, bool, error) { nowTs, err := getStmtTimestamp(ctx) if err != nil { return types.ZeroTime, true, err @@ -2398,7 +2399,7 @@ func (c *utcTimestampFunctionClass) getFunction(ctx sessionctx.Context, args []E return sig, nil } -func evalUTCTimestampWithFsp(ctx sessionctx.Context, fsp int) (types.Time, bool, error) { +func evalUTCTimestampWithFsp(ctx EvalContext, fsp int) (types.Time, bool, error) { nowTs, err := getStmtTimestamp(ctx) if err != nil { return types.ZeroTime, true, err @@ -2422,7 +2423,7 @@ func (b *builtinUTCTimestampWithArgSig) Clone() builtinFunc { // evalTime evals UTC_TIMESTAMP(fsp). // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_utc-timestamp -func (b *builtinUTCTimestampWithArgSig) evalTime(ctx sessionctx.Context, row chunk.Row) (types.Time, bool, error) { +func (b *builtinUTCTimestampWithArgSig) evalTime(ctx EvalContext, row chunk.Row) (types.Time, bool, error) { num, isNull, err := b.args[0].EvalInt(ctx, row) if err != nil { return types.ZeroTime, true, err @@ -2451,7 +2452,7 @@ func (b *builtinUTCTimestampWithoutArgSig) Clone() builtinFunc { // evalTime evals UTC_TIMESTAMP(). // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_utc-timestamp -func (b *builtinUTCTimestampWithoutArgSig) evalTime(ctx sessionctx.Context, row chunk.Row) (types.Time, bool, error) { +func (b *builtinUTCTimestampWithoutArgSig) evalTime(ctx EvalContext, row chunk.Row) (types.Time, bool, error) { result, isNull, err := evalUTCTimestampWithFsp(ctx, 0) return result, isNull, err } @@ -2500,7 +2501,7 @@ func GetStmtTimestamp(ctx sessionctx.Context) (time.Time, error) { return tVal.In(tz), nil } -func evalNowWithFsp(ctx sessionctx.Context, fsp int) (types.Time, bool, error) { +func evalNowWithFsp(ctx EvalContext, fsp int) (types.Time, bool, error) { nowTs, err := getStmtTimestamp(ctx) if err != nil { return types.ZeroTime, true, err @@ -2543,7 +2544,7 @@ func (b *builtinNowWithArgSig) Clone() builtinFunc { // evalTime evals NOW(fsp) // see: https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_now -func (b *builtinNowWithArgSig) evalTime(ctx sessionctx.Context, row chunk.Row) (types.Time, bool, error) { +func (b *builtinNowWithArgSig) evalTime(ctx EvalContext, row chunk.Row) (types.Time, bool, error) { fsp, isNull, err := b.args[0].EvalInt(ctx, row) if err != nil { @@ -2574,7 +2575,7 @@ func (b *builtinNowWithoutArgSig) Clone() builtinFunc { // evalTime evals NOW() // see: https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_now -func (b *builtinNowWithoutArgSig) evalTime(ctx sessionctx.Context, row chunk.Row) (types.Time, bool, error) { +func (b *builtinNowWithoutArgSig) evalTime(ctx EvalContext, row chunk.Row) (types.Time, bool, error) { result, isNull, err := evalNowWithFsp(ctx, 0) return result, isNull, err } @@ -2663,7 +2664,7 @@ func (b *builtinExtractDatetimeFromStringSig) Clone() builtinFunc { // evalInt evals a builtinExtractDatetimeFromStringSig. // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_extract -func (b *builtinExtractDatetimeFromStringSig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinExtractDatetimeFromStringSig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { unit, isNull, err := b.args[0].EvalString(ctx, row) if isNull || err != nil { return 0, isNull, err @@ -2707,7 +2708,7 @@ func (b *builtinExtractDatetimeSig) Clone() builtinFunc { // evalInt evals a builtinExtractDatetimeSig. // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_extract -func (b *builtinExtractDatetimeSig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinExtractDatetimeSig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { unit, isNull, err := b.args[0].EvalString(ctx, row) if isNull || err != nil { return 0, isNull, err @@ -2732,7 +2733,7 @@ func (b *builtinExtractDurationSig) Clone() builtinFunc { // evalInt evals a builtinExtractDurationSig. // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_extract -func (b *builtinExtractDurationSig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinExtractDurationSig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { unit, isNull, err := b.args[0].EvalString(ctx, row) if isNull || err != nil { return 0, isNull, err @@ -2754,11 +2755,11 @@ type baseDateArithmetical struct { func newDateArithmeticalUtil() baseDateArithmetical { return baseDateArithmetical{ - intervalRegexp: regexp.MustCompile(`-?[\d]+`), + intervalRegexp: regexp.MustCompile(`^[+-]?[\d]+`), } } -func (du *baseDateArithmetical) getDateFromString(ctx sessionctx.Context, args []Expression, row chunk.Row, unit string) (types.Time, bool, error) { +func (du *baseDateArithmetical) getDateFromString(ctx EvalContext, args []Expression, row chunk.Row, unit string) (types.Time, bool, error) { dateStr, isNull, err := args[0].EvalString(ctx, row) if isNull || err != nil { return types.ZeroTime, true, err @@ -2783,7 +2784,7 @@ func (du *baseDateArithmetical) getDateFromString(ctx sessionctx.Context, args [ return date, false, handleInvalidTimeError(ctx, err) } -func (du *baseDateArithmetical) getDateFromInt(ctx sessionctx.Context, args []Expression, row chunk.Row, unit string) (types.Time, bool, error) { +func (du *baseDateArithmetical) getDateFromInt(ctx EvalContext, args []Expression, row chunk.Row, unit string) (types.Time, bool, error) { dateInt, isNull, err := args[0].EvalInt(ctx, row) if isNull || err != nil { return types.ZeroTime, true, err @@ -2803,7 +2804,7 @@ func (du *baseDateArithmetical) getDateFromInt(ctx sessionctx.Context, args []Ex return date, false, nil } -func (du *baseDateArithmetical) getDateFromReal(ctx sessionctx.Context, args []Expression, row chunk.Row, unit string) (types.Time, bool, error) { +func (du *baseDateArithmetical) getDateFromReal(ctx EvalContext, args []Expression, row chunk.Row, unit string) (types.Time, bool, error) { dateReal, isNull, err := args[0].EvalReal(ctx, row) if isNull || err != nil { return types.ZeroTime, true, err @@ -2823,7 +2824,7 @@ func (du *baseDateArithmetical) getDateFromReal(ctx sessionctx.Context, args []E return date, false, nil } -func (du *baseDateArithmetical) getDateFromDecimal(ctx sessionctx.Context, args []Expression, row chunk.Row, unit string) (types.Time, bool, error) { +func (du *baseDateArithmetical) getDateFromDecimal(ctx EvalContext, args []Expression, row chunk.Row, unit string) (types.Time, bool, error) { dateDec, isNull, err := args[0].EvalDecimal(ctx, row) if isNull || err != nil { return types.ZeroTime, true, err @@ -2843,7 +2844,7 @@ func (du *baseDateArithmetical) getDateFromDecimal(ctx sessionctx.Context, args return date, false, nil } -func (du *baseDateArithmetical) getDateFromDatetime(ctx sessionctx.Context, args []Expression, row chunk.Row, unit string) (types.Time, bool, error) { +func (du *baseDateArithmetical) getDateFromDatetime(ctx EvalContext, args []Expression, row chunk.Row, unit string) (types.Time, bool, error) { date, isNull, err := args[0].EvalTime(ctx, row) if isNull || err != nil { return types.ZeroTime, true, err @@ -2859,25 +2860,66 @@ func (du *baseDateArithmetical) getDateFromDatetime(ctx sessionctx.Context, args return date, false, nil } -func (du *baseDateArithmetical) getIntervalFromString(ctx sessionctx.Context, args []Expression, row chunk.Row, unit string) (string, bool, error) { +func (du *baseDateArithmetical) getIntervalFromString(ctx EvalContext, args []Expression, row chunk.Row, unit string) (string, bool, error) { interval, isNull, err := args[1].EvalString(ctx, row) if isNull || err != nil { return "", true, err } - // unit "DAY" and "HOUR" has to be specially handled. - if toLower := strings.ToLower(unit); toLower == "day" || toLower == "hour" { - if strings.ToLower(interval) == "true" { - interval = "1" - } else if strings.ToLower(interval) == "false" { + + interval, err = du.intervalReformatString(ctx.GetSessionVars().StmtCtx.ErrCtx(), interval, unit) + return interval, false, err +} + +func (du *baseDateArithmetical) intervalReformatString(ec errctx.Context, str string, unit string) (interval string, err error) { + switch strings.ToUpper(unit) { + case "MICROSECOND", "MINUTE", "HOUR", "DAY", "WEEK", "MONTH", "QUARTER", "YEAR": + str = strings.TrimSpace(str) + // a single unit value has to be specially handled. + interval = du.intervalRegexp.FindString(str) + if interval == "" { interval = "0" - } else { - interval = du.intervalRegexp.FindString(interval) } + + if interval != str { + err = ec.HandleError(types.ErrTruncatedWrongVal.GenWithStackByArgs("DECIMAL", str)) + } + case "SECOND": + // The unit SECOND is specially handled, for example: + // date + INTERVAL "1e2" SECOND = date + INTERVAL 100 second + // date + INTERVAL "1.6" SECOND = date + INTERVAL 1.6 second + // But: + // date + INTERVAL "1e2" MINUTE = date + INTERVAL 1 MINUTE + // date + INTERVAL "1.6" MINUTE = date + INTERVAL 1 MINUTE + var dec types.MyDecimal + if err = dec.FromString([]byte(str)); err != nil { + truncatedErr := types.ErrTruncatedWrongVal.GenWithStackByArgs("DECIMAL", str) + err = ec.HandleErrorWithAlias(err, truncatedErr, truncatedErr) + } + interval = string(dec.ToString()) + default: + interval = str } - return interval, false, nil + return interval, err +} + +func (du *baseDateArithmetical) intervalDecimalToString(ec errctx.Context, dec *types.MyDecimal) (string, error) { + var rounded types.MyDecimal + err := dec.Round(&rounded, 0, types.ModeHalfUp) + if err != nil { + return "", err + } + + intVal, err := rounded.ToInt() + if err != nil { + if err = ec.HandleError(types.ErrTruncatedWrongVal.GenWithStackByArgs("DECIMAL", dec.String())); err != nil { + return "", err + } + } + + return strconv.FormatInt(intVal, 10), nil } -func (du *baseDateArithmetical) getIntervalFromDecimal(ctx sessionctx.Context, args []Expression, row chunk.Row, unit string) (string, bool, error) { +func (du *baseDateArithmetical) getIntervalFromDecimal(ctx EvalContext, args []Expression, row chunk.Row, unit string) (string, bool, error) { decimal, isNull, err := args[1].EvalDecimal(ctx, row) if isNull || err != nil { return "", true, err @@ -2921,9 +2963,8 @@ func (du *baseDateArithmetical) getIntervalFromDecimal(ctx sessionctx.Context, a // interval is already like the %f format. default: // YEAR, QUARTER, MONTH, WEEK, DAY, HOUR, MINUTE, MICROSECOND - castExpr := WrapWithCastAsString(ctx, WrapWithCastAsInt(ctx, args[1])) - interval, isNull, err = castExpr.EvalString(ctx, row) - if isNull || err != nil { + interval, err = du.intervalDecimalToString(ctx.GetSessionVars().StmtCtx.ErrCtx(), decimal) + if err != nil { return "", true, err } } @@ -2931,15 +2972,20 @@ func (du *baseDateArithmetical) getIntervalFromDecimal(ctx sessionctx.Context, a return interval, false, nil } -func (du *baseDateArithmetical) getIntervalFromInt(ctx sessionctx.Context, args []Expression, row chunk.Row, unit string) (string, bool, error) { +func (du *baseDateArithmetical) getIntervalFromInt(ctx EvalContext, args []Expression, row chunk.Row, unit string) (string, bool, error) { interval, isNull, err := args[1].EvalInt(ctx, row) if isNull || err != nil { return "", true, err } + + if mysql.HasUnsignedFlag(args[1].GetType().GetFlag()) { + return strconv.FormatUint(uint64(interval), 10), false, nil + } + return strconv.FormatInt(interval, 10), false, nil } -func (du *baseDateArithmetical) getIntervalFromReal(ctx sessionctx.Context, args []Expression, row chunk.Row, unit string) (string, bool, error) { +func (du *baseDateArithmetical) getIntervalFromReal(ctx EvalContext, args []Expression, row chunk.Row, unit string) (string, bool, error) { interval, isNull, err := args[1].EvalReal(ctx, row) if isNull || err != nil { return "", true, err @@ -2947,7 +2993,7 @@ func (du *baseDateArithmetical) getIntervalFromReal(ctx sessionctx.Context, args return strconv.FormatFloat(interval, 'f', args[1].GetType().GetDecimal(), 64), false, nil } -func (du *baseDateArithmetical) add(ctx sessionctx.Context, date types.Time, interval, unit string, resultFsp int) (types.Time, bool, error) { +func (du *baseDateArithmetical) add(ctx EvalContext, date types.Time, interval, unit string, resultFsp int) (types.Time, bool, error) { year, month, day, nano, _, err := types.ParseDurationValue(unit, interval) if err := handleInvalidTimeError(ctx, err); err != nil { return types.ZeroTime, true, err @@ -2955,14 +3001,17 @@ func (du *baseDateArithmetical) add(ctx sessionctx.Context, date types.Time, int return du.addDate(ctx, date, year, month, day, nano, resultFsp) } -func (du *baseDateArithmetical) addDate(ctx sessionctx.Context, date types.Time, year, month, day, nano int64, resultFsp int) (types.Time, bool, error) { +func (du *baseDateArithmetical) addDate(ctx EvalContext, date types.Time, year, month, day, nano int64, resultFsp int) (types.Time, bool, error) { goTime, err := date.GoTime(time.UTC) if err := handleInvalidTimeError(ctx, err); err != nil { return types.ZeroTime, true, err } goTime = goTime.Add(time.Duration(nano)) - goTime = types.AddDate(year, month, day, goTime) + goTime, err = types.AddDate(year, month, day, goTime) + if err != nil { + return types.ZeroTime, true, handleInvalidTimeError(ctx, types.ErrDatetimeFunctionOverflow.GenWithStackByArgs("datetime")) + } // Adjust fsp as required by outer - always respect type inference. date.SetFsp(resultFsp) @@ -2974,10 +3023,6 @@ func (du *baseDateArithmetical) addDate(ctx sessionctx.Context, date types.Time, return date, false, nil } - if goTime.Year() < 0 || goTime.Year() > 9999 { - return types.ZeroTime, true, handleInvalidTimeError(ctx, types.ErrDatetimeFunctionOverflow.GenWithStackByArgs("datetime")) - } - date.SetCoreTime(types.FromGoTime(goTime)) overflow, err := types.DateTimeIsOverflow(ctx.GetSessionVars().StmtCtx.TypeCtx(), date) if err := handleInvalidTimeError(ctx, err); err != nil { @@ -2991,7 +3036,7 @@ func (du *baseDateArithmetical) addDate(ctx sessionctx.Context, date types.Time, type funcDurationOp func(d, interval types.Duration) (types.Duration, error) -func (du *baseDateArithmetical) opDuration(ctx sessionctx.Context, op funcDurationOp, d types.Duration, interval string, unit string, resultFsp int) (types.Duration, bool, error) { +func (du *baseDateArithmetical) opDuration(ctx EvalContext, op funcDurationOp, d types.Duration, interval string, unit string, resultFsp int) (types.Duration, bool, error) { dur, err := types.ExtractDurationValue(unit, interval) if err != nil { return types.ZeroDuration, true, handleInvalidTimeError(ctx, err) @@ -3005,21 +3050,21 @@ func (du *baseDateArithmetical) opDuration(ctx sessionctx.Context, op funcDurati return retDur, false, nil } -func (du *baseDateArithmetical) addDuration(ctx sessionctx.Context, d types.Duration, interval string, unit string, resultFsp int) (types.Duration, bool, error) { +func (du *baseDateArithmetical) addDuration(ctx EvalContext, d types.Duration, interval string, unit string, resultFsp int) (types.Duration, bool, error) { add := func(d, interval types.Duration) (types.Duration, error) { return d.Add(interval) } return du.opDuration(ctx, add, d, interval, unit, resultFsp) } -func (du *baseDateArithmetical) subDuration(ctx sessionctx.Context, d types.Duration, interval string, unit string, resultFsp int) (types.Duration, bool, error) { +func (du *baseDateArithmetical) subDuration(ctx EvalContext, d types.Duration, interval string, unit string, resultFsp int) (types.Duration, bool, error) { sub := func(d, interval types.Duration) (types.Duration, error) { return d.Sub(interval) } return du.opDuration(ctx, sub, d, interval, unit, resultFsp) } -func (du *baseDateArithmetical) sub(ctx sessionctx.Context, date types.Time, interval string, unit string, resultFsp int) (types.Time, bool, error) { +func (du *baseDateArithmetical) sub(ctx EvalContext, date types.Time, interval string, unit string, resultFsp int) (types.Time, bool, error) { year, month, day, nano, _, err := types.ParseDurationValue(unit, interval) if err := handleInvalidTimeError(ctx, err); err != nil { return types.ZeroTime, true, err @@ -3027,7 +3072,7 @@ func (du *baseDateArithmetical) sub(ctx sessionctx.Context, date types.Time, int return du.addDate(ctx, date, -year, -month, -day, -nano, resultFsp) } -func (du *baseDateArithmetical) vecGetDateFromInt(b *baseBuiltinFunc, ctx sessionctx.Context, input *chunk.Chunk, unit string, result *chunk.Column) error { +func (du *baseDateArithmetical) vecGetDateFromInt(b *baseBuiltinFunc, ctx EvalContext, input *chunk.Chunk, unit string, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -3069,7 +3114,7 @@ func (du *baseDateArithmetical) vecGetDateFromInt(b *baseBuiltinFunc, ctx sessio return nil } -func (du *baseDateArithmetical) vecGetDateFromReal(b *baseBuiltinFunc, ctx sessionctx.Context, input *chunk.Chunk, unit string, result *chunk.Column) error { +func (du *baseDateArithmetical) vecGetDateFromReal(b *baseBuiltinFunc, ctx EvalContext, input *chunk.Chunk, unit string, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -3111,7 +3156,7 @@ func (du *baseDateArithmetical) vecGetDateFromReal(b *baseBuiltinFunc, ctx sessi return nil } -func (du *baseDateArithmetical) vecGetDateFromDecimal(b *baseBuiltinFunc, ctx sessionctx.Context, input *chunk.Chunk, unit string, result *chunk.Column) error { +func (du *baseDateArithmetical) vecGetDateFromDecimal(b *baseBuiltinFunc, ctx EvalContext, input *chunk.Chunk, unit string, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -3153,7 +3198,7 @@ func (du *baseDateArithmetical) vecGetDateFromDecimal(b *baseBuiltinFunc, ctx se return nil } -func (du *baseDateArithmetical) vecGetDateFromString(b *baseBuiltinFunc, ctx sessionctx.Context, input *chunk.Chunk, unit string, result *chunk.Column) error { +func (du *baseDateArithmetical) vecGetDateFromString(b *baseBuiltinFunc, ctx EvalContext, input *chunk.Chunk, unit string, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -3200,7 +3245,7 @@ func (du *baseDateArithmetical) vecGetDateFromString(b *baseBuiltinFunc, ctx ses return nil } -func (du *baseDateArithmetical) vecGetDateFromDatetime(b *baseBuiltinFunc, ctx sessionctx.Context, input *chunk.Chunk, unit string, result *chunk.Column) error { +func (du *baseDateArithmetical) vecGetDateFromDatetime(b *baseBuiltinFunc, ctx EvalContext, input *chunk.Chunk, unit string, result *chunk.Column) error { n := input.NumRows() result.ResizeTime(n, false) if err := b.args[0].VecEvalTime(ctx, input, result); err != nil { @@ -3225,7 +3270,7 @@ func (du *baseDateArithmetical) vecGetDateFromDatetime(b *baseBuiltinFunc, ctx s return nil } -func (du *baseDateArithmetical) vecGetIntervalFromString(b *baseBuiltinFunc, ctx sessionctx.Context, input *chunk.Chunk, unit string, result *chunk.Column) error { +func (du *baseDateArithmetical) vecGetIntervalFromString(b *baseBuiltinFunc, ctx EvalContext, input *chunk.Chunk, unit string, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -3236,20 +3281,7 @@ func (du *baseDateArithmetical) vecGetIntervalFromString(b *baseBuiltinFunc, ctx return err } - amendInterval := func(val string) string { - return val - } - if unitLower := strings.ToLower(unit); unitLower == "day" || unitLower == "hour" { - amendInterval = func(val string) string { - if intervalLower := strings.ToLower(val); intervalLower == "true" { - return "1" - } else if intervalLower == "false" { - return "0" - } - return du.intervalRegexp.FindString(val) - } - } - + ec := ctx.GetSessionVars().StmtCtx.ErrCtx() result.ReserveString(n) for i := 0; i < n; i++ { if buf.IsNull(i) { @@ -3257,12 +3289,16 @@ func (du *baseDateArithmetical) vecGetIntervalFromString(b *baseBuiltinFunc, ctx continue } - result.AppendString(amendInterval(buf.GetString(i))) + interval, err := du.intervalReformatString(ec, buf.GetString(i), unit) + if err != nil { + return err + } + result.AppendString(interval) } return nil } -func (du *baseDateArithmetical) vecGetIntervalFromDecimal(b *baseBuiltinFunc, ctx sessionctx.Context, input *chunk.Chunk, unit string, result *chunk.Column) error { +func (du *baseDateArithmetical) vecGetIntervalFromDecimal(b *baseBuiltinFunc, ctx EvalContext, input *chunk.Chunk, unit string, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -3325,10 +3361,18 @@ func (du *baseDateArithmetical) vecGetIntervalFromDecimal(b *baseBuiltinFunc, ct /* keep interval as original decimal */ default: // YEAR, QUARTER, MONTH, WEEK, DAY, HOUR, MINUTE, MICROSECOND - castExpr := WrapWithCastAsString(ctx, WrapWithCastAsInt(ctx, b.args[1])) amendInterval = func(_ string, row *chunk.Row) (string, bool, error) { - interval, isNull, err := castExpr.EvalString(ctx, *row) - return interval, isNull || err != nil, err + dec, isNull, err := b.args[1].EvalDecimal(ctx, *row) + if isNull || err != nil { + return "", true, err + } + + str, err := du.intervalDecimalToString(ctx.GetSessionVars().StmtCtx.ErrCtx(), dec) + if err != nil { + return "", true, err + } + + return str, false, nil } } @@ -3363,7 +3407,7 @@ func (du *baseDateArithmetical) vecGetIntervalFromDecimal(b *baseBuiltinFunc, ct return nil } -func (du *baseDateArithmetical) vecGetIntervalFromInt(b *baseBuiltinFunc, ctx sessionctx.Context, input *chunk.Chunk, unit string, result *chunk.Column) error { +func (du *baseDateArithmetical) vecGetIntervalFromInt(b *baseBuiltinFunc, ctx EvalContext, input *chunk.Chunk, unit string, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -3376,9 +3420,12 @@ func (du *baseDateArithmetical) vecGetIntervalFromInt(b *baseBuiltinFunc, ctx se result.ReserveString(n) i64s := buf.Int64s() + unsigned := mysql.HasUnsignedFlag(b.args[1].GetType().GetFlag()) for i := 0; i < n; i++ { if buf.IsNull(i) { result.AppendNull() + } else if unsigned { + result.AppendString(strconv.FormatUint(uint64(i64s[i]), 10)) } else { result.AppendString(strconv.FormatInt(i64s[i], 10)) } @@ -3386,7 +3433,7 @@ func (du *baseDateArithmetical) vecGetIntervalFromInt(b *baseBuiltinFunc, ctx se return nil } -func (du *baseDateArithmetical) vecGetIntervalFromReal(b *baseBuiltinFunc, ctx sessionctx.Context, input *chunk.Chunk, unit string, result *chunk.Column) error { +func (du *baseDateArithmetical) vecGetIntervalFromReal(b *baseBuiltinFunc, ctx EvalContext, input *chunk.Chunk, unit string, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -3410,23 +3457,23 @@ func (du *baseDateArithmetical) vecGetIntervalFromReal(b *baseBuiltinFunc, ctx s return nil } -type funcTimeOpForDateAddSub func(da *baseDateArithmetical, ctx sessionctx.Context, date types.Time, interval, unit string, resultFsp int) (types.Time, bool, error) +type funcTimeOpForDateAddSub func(da *baseDateArithmetical, ctx EvalContext, date types.Time, interval, unit string, resultFsp int) (types.Time, bool, error) -func addTime(da *baseDateArithmetical, ctx sessionctx.Context, date types.Time, interval, unit string, resultFsp int) (types.Time, bool, error) { +func addTime(da *baseDateArithmetical, ctx EvalContext, date types.Time, interval, unit string, resultFsp int) (types.Time, bool, error) { return da.add(ctx, date, interval, unit, resultFsp) } -func subTime(da *baseDateArithmetical, ctx sessionctx.Context, date types.Time, interval, unit string, resultFsp int) (types.Time, bool, error) { +func subTime(da *baseDateArithmetical, ctx EvalContext, date types.Time, interval, unit string, resultFsp int) (types.Time, bool, error) { return da.sub(ctx, date, interval, unit, resultFsp) } -type funcDurationOpForDateAddSub func(da *baseDateArithmetical, ctx sessionctx.Context, d types.Duration, interval, unit string, resultFsp int) (types.Duration, bool, error) +type funcDurationOpForDateAddSub func(da *baseDateArithmetical, ctx EvalContext, d types.Duration, interval, unit string, resultFsp int) (types.Duration, bool, error) -func addDuration(da *baseDateArithmetical, ctx sessionctx.Context, d types.Duration, interval, unit string, resultFsp int) (types.Duration, bool, error) { +func addDuration(da *baseDateArithmetical, ctx EvalContext, d types.Duration, interval, unit string, resultFsp int) (types.Duration, bool, error) { return da.addDuration(ctx, d, interval, unit, resultFsp) } -func subDuration(da *baseDateArithmetical, ctx sessionctx.Context, d types.Duration, interval, unit string, resultFsp int) (types.Duration, bool, error) { +func subDuration(da *baseDateArithmetical, ctx EvalContext, d types.Duration, interval, unit string, resultFsp int) (types.Duration, bool, error) { return da.subDuration(ctx, d, interval, unit, resultFsp) } @@ -3440,75 +3487,75 @@ func setSub(b builtinFunc, add, sub tipb.ScalarFuncSig) { b.setPbCode(sub) } -type funcGetDateForDateAddSub func(da *baseDateArithmetical, ctx sessionctx.Context, args []Expression, row chunk.Row, unit string) (types.Time, bool, error) +type funcGetDateForDateAddSub func(da *baseDateArithmetical, ctx EvalContext, args []Expression, row chunk.Row, unit string) (types.Time, bool, error) -func getDateFromString(da *baseDateArithmetical, ctx sessionctx.Context, args []Expression, row chunk.Row, unit string) (types.Time, bool, error) { +func getDateFromString(da *baseDateArithmetical, ctx EvalContext, args []Expression, row chunk.Row, unit string) (types.Time, bool, error) { return da.getDateFromString(ctx, args, row, unit) } -func getDateFromInt(da *baseDateArithmetical, ctx sessionctx.Context, args []Expression, row chunk.Row, unit string) (types.Time, bool, error) { +func getDateFromInt(da *baseDateArithmetical, ctx EvalContext, args []Expression, row chunk.Row, unit string) (types.Time, bool, error) { return da.getDateFromInt(ctx, args, row, unit) } -func getDateFromReal(da *baseDateArithmetical, ctx sessionctx.Context, args []Expression, row chunk.Row, unit string) (types.Time, bool, error) { +func getDateFromReal(da *baseDateArithmetical, ctx EvalContext, args []Expression, row chunk.Row, unit string) (types.Time, bool, error) { return da.getDateFromReal(ctx, args, row, unit) } -func getDateFromDecimal(da *baseDateArithmetical, ctx sessionctx.Context, args []Expression, row chunk.Row, unit string) (types.Time, bool, error) { +func getDateFromDecimal(da *baseDateArithmetical, ctx EvalContext, args []Expression, row chunk.Row, unit string) (types.Time, bool, error) { return da.getDateFromDecimal(ctx, args, row, unit) } -type funcVecGetDateForDateAddSub func(da *baseDateArithmetical, ctx sessionctx.Context, b *baseBuiltinFunc, input *chunk.Chunk, unit string, result *chunk.Column) error +type funcVecGetDateForDateAddSub func(da *baseDateArithmetical, ctx EvalContext, b *baseBuiltinFunc, input *chunk.Chunk, unit string, result *chunk.Column) error -func vecGetDateFromString(da *baseDateArithmetical, ctx sessionctx.Context, b *baseBuiltinFunc, input *chunk.Chunk, unit string, result *chunk.Column) error { +func vecGetDateFromString(da *baseDateArithmetical, ctx EvalContext, b *baseBuiltinFunc, input *chunk.Chunk, unit string, result *chunk.Column) error { return da.vecGetDateFromString(b, ctx, input, unit, result) } -func vecGetDateFromInt(da *baseDateArithmetical, ctx sessionctx.Context, b *baseBuiltinFunc, input *chunk.Chunk, unit string, result *chunk.Column) error { +func vecGetDateFromInt(da *baseDateArithmetical, ctx EvalContext, b *baseBuiltinFunc, input *chunk.Chunk, unit string, result *chunk.Column) error { return da.vecGetDateFromInt(b, ctx, input, unit, result) } -func vecGetDateFromReal(da *baseDateArithmetical, ctx sessionctx.Context, b *baseBuiltinFunc, input *chunk.Chunk, unit string, result *chunk.Column) error { +func vecGetDateFromReal(da *baseDateArithmetical, ctx EvalContext, b *baseBuiltinFunc, input *chunk.Chunk, unit string, result *chunk.Column) error { return da.vecGetDateFromReal(b, ctx, input, unit, result) } -func vecGetDateFromDecimal(da *baseDateArithmetical, ctx sessionctx.Context, b *baseBuiltinFunc, input *chunk.Chunk, unit string, result *chunk.Column) error { +func vecGetDateFromDecimal(da *baseDateArithmetical, ctx EvalContext, b *baseBuiltinFunc, input *chunk.Chunk, unit string, result *chunk.Column) error { return da.vecGetDateFromDecimal(b, ctx, input, unit, result) } -type funcGetIntervalForDateAddSub func(da *baseDateArithmetical, ctx sessionctx.Context, args []Expression, row chunk.Row, unit string) (string, bool, error) +type funcGetIntervalForDateAddSub func(da *baseDateArithmetical, ctx EvalContext, args []Expression, row chunk.Row, unit string) (string, bool, error) -func getIntervalFromString(da *baseDateArithmetical, ctx sessionctx.Context, args []Expression, row chunk.Row, unit string) (string, bool, error) { +func getIntervalFromString(da *baseDateArithmetical, ctx EvalContext, args []Expression, row chunk.Row, unit string) (string, bool, error) { return da.getIntervalFromString(ctx, args, row, unit) } -func getIntervalFromInt(da *baseDateArithmetical, ctx sessionctx.Context, args []Expression, row chunk.Row, unit string) (string, bool, error) { +func getIntervalFromInt(da *baseDateArithmetical, ctx EvalContext, args []Expression, row chunk.Row, unit string) (string, bool, error) { return da.getIntervalFromInt(ctx, args, row, unit) } -func getIntervalFromReal(da *baseDateArithmetical, ctx sessionctx.Context, args []Expression, row chunk.Row, unit string) (string, bool, error) { +func getIntervalFromReal(da *baseDateArithmetical, ctx EvalContext, args []Expression, row chunk.Row, unit string) (string, bool, error) { return da.getIntervalFromReal(ctx, args, row, unit) } -func getIntervalFromDecimal(da *baseDateArithmetical, ctx sessionctx.Context, args []Expression, row chunk.Row, unit string) (string, bool, error) { +func getIntervalFromDecimal(da *baseDateArithmetical, ctx EvalContext, args []Expression, row chunk.Row, unit string) (string, bool, error) { return da.getIntervalFromDecimal(ctx, args, row, unit) } -type funcVecGetIntervalForDateAddSub func(da *baseDateArithmetical, ctx sessionctx.Context, b *baseBuiltinFunc, input *chunk.Chunk, unit string, result *chunk.Column) error +type funcVecGetIntervalForDateAddSub func(da *baseDateArithmetical, ctx EvalContext, b *baseBuiltinFunc, input *chunk.Chunk, unit string, result *chunk.Column) error -func vecGetIntervalFromString(da *baseDateArithmetical, ctx sessionctx.Context, b *baseBuiltinFunc, input *chunk.Chunk, unit string, result *chunk.Column) error { +func vecGetIntervalFromString(da *baseDateArithmetical, ctx EvalContext, b *baseBuiltinFunc, input *chunk.Chunk, unit string, result *chunk.Column) error { return da.vecGetIntervalFromString(b, ctx, input, unit, result) } -func vecGetIntervalFromInt(da *baseDateArithmetical, ctx sessionctx.Context, b *baseBuiltinFunc, input *chunk.Chunk, unit string, result *chunk.Column) error { +func vecGetIntervalFromInt(da *baseDateArithmetical, ctx EvalContext, b *baseBuiltinFunc, input *chunk.Chunk, unit string, result *chunk.Column) error { return da.vecGetIntervalFromInt(b, ctx, input, unit, result) } -func vecGetIntervalFromReal(da *baseDateArithmetical, ctx sessionctx.Context, b *baseBuiltinFunc, input *chunk.Chunk, unit string, result *chunk.Column) error { +func vecGetIntervalFromReal(da *baseDateArithmetical, ctx EvalContext, b *baseBuiltinFunc, input *chunk.Chunk, unit string, result *chunk.Column) error { return da.vecGetIntervalFromReal(b, ctx, input, unit, result) } -func vecGetIntervalFromDecimal(da *baseDateArithmetical, ctx sessionctx.Context, b *baseBuiltinFunc, input *chunk.Chunk, unit string, result *chunk.Column) error { +func vecGetIntervalFromDecimal(da *baseDateArithmetical, ctx EvalContext, b *baseBuiltinFunc, input *chunk.Chunk, unit string, result *chunk.Column) error { return da.vecGetIntervalFromDecimal(b, ctx, input, unit, result) } @@ -3892,7 +3939,7 @@ func (b *builtinAddSubDateAsStringSig) Clone() builtinFunc { return newSig } -func (b *builtinAddSubDateAsStringSig) evalString(ctx sessionctx.Context, row chunk.Row) (string, bool, error) { +func (b *builtinAddSubDateAsStringSig) evalString(ctx EvalContext, row chunk.Row) (string, bool, error) { unit, isNull, err := b.args[2].EvalString(ctx, row) if isNull || err != nil { return types.ZeroTime.String(), true, err @@ -3940,7 +3987,7 @@ func (b *builtinAddSubDateDatetimeAnySig) Clone() builtinFunc { return newSig } -func (b *builtinAddSubDateDatetimeAnySig) evalTime(ctx sessionctx.Context, row chunk.Row) (types.Time, bool, error) { +func (b *builtinAddSubDateDatetimeAnySig) evalTime(ctx EvalContext, row chunk.Row) (types.Time, bool, error) { unit, isNull, err := b.args[2].EvalString(ctx, row) if isNull || err != nil { return types.ZeroTime, true, err @@ -3981,7 +4028,7 @@ func (b *builtinAddSubDateDurationAnySig) Clone() builtinFunc { return newSig } -func (b *builtinAddSubDateDurationAnySig) evalTime(ctx sessionctx.Context, row chunk.Row) (types.Time, bool, error) { +func (b *builtinAddSubDateDurationAnySig) evalTime(ctx EvalContext, row chunk.Row) (types.Time, bool, error) { unit, isNull, err := b.args[2].EvalString(ctx, row) if isNull || err != nil { return types.ZeroTime, true, err @@ -4006,7 +4053,7 @@ func (b *builtinAddSubDateDurationAnySig) evalTime(ctx sessionctx.Context, row c return result, isNull || err != nil, err } -func (b *builtinAddSubDateDurationAnySig) evalDuration(ctx sessionctx.Context, row chunk.Row) (types.Duration, bool, error) { +func (b *builtinAddSubDateDurationAnySig) evalDuration(ctx EvalContext, row chunk.Row) (types.Duration, bool, error) { unit, isNull, err := b.args[2].EvalString(ctx, row) if isNull || err != nil { return types.ZeroDuration, true, err @@ -4055,7 +4102,7 @@ func (b *builtinTimestampDiffSig) Clone() builtinFunc { // evalInt evals a builtinTimestampDiffSig. // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_timestampdiff -func (b *builtinTimestampDiffSig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinTimestampDiffSig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { unit, isNull, err := b.args[0].EvalString(ctx, row) if isNull || err != nil { return 0, isNull, err @@ -4199,7 +4246,7 @@ func (b *builtinUnixTimestampCurrentSig) Clone() builtinFunc { // evalInt evals a UNIX_TIMESTAMP(). // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_unix-timestamp -func (b *builtinUnixTimestampCurrentSig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinUnixTimestampCurrentSig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { nowTs, err := getStmtTimestamp(ctx) if err != nil { return 0, true, err @@ -4227,7 +4274,7 @@ func (b *builtinUnixTimestampIntSig) Clone() builtinFunc { // evalInt evals a UNIX_TIMESTAMP(time). // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_unix-timestamp -func (b *builtinUnixTimestampIntSig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinUnixTimestampIntSig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { val, isNull, err := b.args[0].EvalTime(ctx, row) if err != nil && terror.ErrorEqual(types.ErrWrongValue.GenWithStackByArgs(types.TimeStr, val), err) { // Return 0 for invalid date time. @@ -4265,7 +4312,7 @@ func (b *builtinUnixTimestampDecSig) Clone() builtinFunc { // evalDecimal evals a UNIX_TIMESTAMP(time). // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_unix-timestamp -func (b *builtinUnixTimestampDecSig) evalDecimal(ctx sessionctx.Context, row chunk.Row) (*types.MyDecimal, bool, error) { +func (b *builtinUnixTimestampDecSig) evalDecimal(ctx EvalContext, row chunk.Row) (*types.MyDecimal, bool, error) { val, isNull, err := b.args[0].EvalTime(ctx, row) if isNull || err != nil { // Return 0 for invalid date time. @@ -4339,7 +4386,7 @@ func (b *builtinTimestamp1ArgSig) Clone() builtinFunc { // evalTime evals a builtinTimestamp1ArgSig. // See https://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_timestamp -func (b *builtinTimestamp1ArgSig) evalTime(ctx sessionctx.Context, row chunk.Row) (types.Time, bool, error) { +func (b *builtinTimestamp1ArgSig) evalTime(ctx EvalContext, row chunk.Row) (types.Time, bool, error) { s, isNull, err := b.args[0].EvalString(ctx, row) if isNull || err != nil { return types.ZeroTime, isNull, err @@ -4371,7 +4418,7 @@ func (b *builtinTimestamp2ArgsSig) Clone() builtinFunc { // evalTime evals a builtinTimestamp2ArgsSig. // See https://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_timestamp -func (b *builtinTimestamp2ArgsSig) evalTime(ctx sessionctx.Context, row chunk.Row) (types.Time, bool, error) { +func (b *builtinTimestamp2ArgsSig) evalTime(ctx EvalContext, row chunk.Row) (types.Time, bool, error) { arg0, isNull, err := b.args[0].EvalString(ctx, row) if isNull || err != nil { return types.ZeroTime, isNull, err @@ -4458,7 +4505,7 @@ func (b *builtinTimestampLiteralSig) Clone() builtinFunc { // evalTime evals TIMESTAMP 'stringLit'. // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-literals.html -func (b *builtinTimestampLiteralSig) evalTime(ctx sessionctx.Context, row chunk.Row) (types.Time, bool, error) { +func (b *builtinTimestampLiteralSig) evalTime(ctx EvalContext, row chunk.Row) (types.Time, bool, error) { return b.tm, false, nil } @@ -4524,7 +4571,7 @@ func getBf4TimeAddSub(ctx sessionctx.Context, funcName string, args []Expression return } -func getTimeZone(ctx sessionctx.Context) *time.Location { +func getTimeZone(ctx EvalContext) *time.Location { ret := ctx.GetSessionVars().Location() if ret == nil { ret = time.Local @@ -4692,7 +4739,7 @@ func (b *builtinAddTimeDateTimeNullSig) Clone() builtinFunc { // evalTime evals a builtinAddTimeDateTimeNullSig. // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_addtime -func (b *builtinAddTimeDateTimeNullSig) evalTime(ctx sessionctx.Context, row chunk.Row) (types.Time, bool, error) { +func (b *builtinAddTimeDateTimeNullSig) evalTime(ctx EvalContext, row chunk.Row) (types.Time, bool, error) { return types.ZeroDatetime, true, nil } @@ -4708,7 +4755,7 @@ func (b *builtinAddDatetimeAndDurationSig) Clone() builtinFunc { // evalTime evals a builtinAddDatetimeAndDurationSig. // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_addtime -func (b *builtinAddDatetimeAndDurationSig) evalTime(ctx sessionctx.Context, row chunk.Row) (types.Time, bool, error) { +func (b *builtinAddDatetimeAndDurationSig) evalTime(ctx EvalContext, row chunk.Row) (types.Time, bool, error) { arg0, isNull, err := b.args[0].EvalTime(ctx, row) if isNull || err != nil { return types.ZeroDatetime, isNull, err @@ -4733,7 +4780,7 @@ func (b *builtinAddDatetimeAndStringSig) Clone() builtinFunc { // evalTime evals a builtinAddDatetimeAndStringSig. // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_addtime -func (b *builtinAddDatetimeAndStringSig) evalTime(ctx sessionctx.Context, row chunk.Row) (types.Time, bool, error) { +func (b *builtinAddDatetimeAndStringSig) evalTime(ctx EvalContext, row chunk.Row) (types.Time, bool, error) { arg0, isNull, err := b.args[0].EvalTime(ctx, row) if isNull || err != nil { return types.ZeroDatetime, isNull, err @@ -4770,7 +4817,7 @@ func (b *builtinAddTimeDurationNullSig) Clone() builtinFunc { // evalDuration evals a builtinAddTimeDurationNullSig. // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_addtime -func (b *builtinAddTimeDurationNullSig) evalDuration(ctx sessionctx.Context, row chunk.Row) (types.Duration, bool, error) { +func (b *builtinAddTimeDurationNullSig) evalDuration(ctx EvalContext, row chunk.Row) (types.Duration, bool, error) { return types.ZeroDuration, true, nil } @@ -4786,7 +4833,7 @@ func (b *builtinAddDurationAndDurationSig) Clone() builtinFunc { // evalDuration evals a builtinAddDurationAndDurationSig. // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_addtime -func (b *builtinAddDurationAndDurationSig) evalDuration(ctx sessionctx.Context, row chunk.Row) (types.Duration, bool, error) { +func (b *builtinAddDurationAndDurationSig) evalDuration(ctx EvalContext, row chunk.Row) (types.Duration, bool, error) { arg0, isNull, err := b.args[0].EvalDuration(ctx, row) if isNull || err != nil { return types.ZeroDuration, isNull, err @@ -4814,7 +4861,7 @@ func (b *builtinAddDurationAndStringSig) Clone() builtinFunc { // evalDuration evals a builtinAddDurationAndStringSig. // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_addtime -func (b *builtinAddDurationAndStringSig) evalDuration(ctx sessionctx.Context, row chunk.Row) (types.Duration, bool, error) { +func (b *builtinAddDurationAndStringSig) evalDuration(ctx EvalContext, row chunk.Row) (types.Duration, bool, error) { arg0, isNull, err := b.args[0].EvalDuration(ctx, row) if isNull || err != nil { return types.ZeroDuration, isNull, err @@ -4854,7 +4901,7 @@ func (b *builtinAddTimeStringNullSig) Clone() builtinFunc { // evalString evals a builtinAddDurationAndDurationSig. // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_addtime -func (b *builtinAddTimeStringNullSig) evalString(ctx sessionctx.Context, row chunk.Row) (string, bool, error) { +func (b *builtinAddTimeStringNullSig) evalString(ctx EvalContext, row chunk.Row) (string, bool, error) { return "", true, nil } @@ -4870,7 +4917,7 @@ func (b *builtinAddStringAndDurationSig) Clone() builtinFunc { // evalString evals a builtinAddStringAndDurationSig. // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_addtime -func (b *builtinAddStringAndDurationSig) evalString(ctx sessionctx.Context, row chunk.Row) (result string, isNull bool, err error) { +func (b *builtinAddStringAndDurationSig) evalString(ctx EvalContext, row chunk.Row) (result string, isNull bool, err error) { var ( arg0 string arg1 types.Duration @@ -4911,7 +4958,7 @@ func (b *builtinAddStringAndStringSig) Clone() builtinFunc { // evalString evals a builtinAddStringAndStringSig. // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_addtime -func (b *builtinAddStringAndStringSig) evalString(ctx sessionctx.Context, row chunk.Row) (result string, isNull bool, err error) { +func (b *builtinAddStringAndStringSig) evalString(ctx EvalContext, row chunk.Row) (result string, isNull bool, err error) { var ( arg0, arg1Str string arg1 types.Duration @@ -4974,7 +5021,7 @@ func (b *builtinAddDateAndDurationSig) Clone() builtinFunc { // evalString evals a builtinAddDurationAndDurationSig. // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_addtime -func (b *builtinAddDateAndDurationSig) evalString(ctx sessionctx.Context, row chunk.Row) (string, bool, error) { +func (b *builtinAddDateAndDurationSig) evalString(ctx EvalContext, row chunk.Row) (string, bool, error) { arg0, isNull, err := b.args[0].EvalDuration(ctx, row) if isNull || err != nil { return "", isNull, err @@ -4999,7 +5046,7 @@ func (b *builtinAddDateAndStringSig) Clone() builtinFunc { // evalString evals a builtinAddDateAndStringSig. // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_addtime -func (b *builtinAddDateAndStringSig) evalString(ctx sessionctx.Context, row chunk.Row) (string, bool, error) { +func (b *builtinAddDateAndStringSig) evalString(ctx EvalContext, row chunk.Row) (string, bool, error) { arg0, isNull, err := b.args[0].EvalDuration(ctx, row) if isNull || err != nil { return "", isNull, err @@ -5090,7 +5137,7 @@ func (b *builtinConvertTzSig) Clone() builtinFunc { // evalTime evals CONVERT_TZ(dt,from_tz,to_tz). // `CONVERT_TZ` function returns NULL if the arguments are invalid. // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_convert-tz -func (b *builtinConvertTzSig) evalTime(ctx sessionctx.Context, row chunk.Row) (types.Time, bool, error) { +func (b *builtinConvertTzSig) evalTime(ctx EvalContext, row chunk.Row) (types.Time, bool, error) { dt, isNull, err := b.args[0].EvalTime(ctx, row) if isNull || err != nil { return types.ZeroTime, true, nil @@ -5184,7 +5231,7 @@ func (b *builtinMakeDateSig) Clone() builtinFunc { // evalTime evaluates a builtinMakeDateSig. // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_makedate -func (b *builtinMakeDateSig) evalTime(ctx sessionctx.Context, row chunk.Row) (d types.Time, isNull bool, err error) { +func (b *builtinMakeDateSig) evalTime(ctx EvalContext, row chunk.Row) (d types.Time, isNull bool, err error) { args := b.getArgs() var year, dayOfYear int64 year, isNull, err = args[0].EvalInt(ctx, row) @@ -5284,7 +5331,7 @@ func (b *builtinMakeTimeSig) makeTime(ctx types.Context, hour int64, minute int6 // evalDuration evals a builtinMakeTimeIntSig. // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_maketime -func (b *builtinMakeTimeSig) evalDuration(ctx sessionctx.Context, row chunk.Row) (types.Duration, bool, error) { +func (b *builtinMakeTimeSig) evalDuration(ctx EvalContext, row chunk.Row) (types.Duration, bool, error) { dur := types.ZeroDuration dur.Fsp = types.MaxFsp hour, isNull, err := b.args[0].EvalInt(ctx, row) @@ -5380,7 +5427,7 @@ func (b *builtinPeriodAddSig) Clone() builtinFunc { // evalInt evals PERIOD_ADD(P,N). // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_period-add -func (b *builtinPeriodAddSig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinPeriodAddSig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { p, isNull, err := b.args[0].EvalInt(ctx, row) if isNull || err != nil { return 0, true, err @@ -5429,7 +5476,7 @@ func (b *builtinPeriodDiffSig) Clone() builtinFunc { // evalInt evals PERIOD_DIFF(P1,P2). // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_period-diff -func (b *builtinPeriodDiffSig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinPeriodDiffSig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { p1, isNull, err := b.args[0].EvalInt(ctx, row) if isNull || err != nil { return 0, isNull, err @@ -5483,7 +5530,7 @@ func (b *builtinQuarterSig) Clone() builtinFunc { // evalInt evals QUARTER(date). // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_quarter -func (b *builtinQuarterSig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinQuarterSig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { date, isNull, err := b.args[0].EvalTime(ctx, row) if isNull || err != nil { return 0, true, handleInvalidTimeError(ctx, err) @@ -5535,7 +5582,7 @@ func (b *builtinSecToTimeSig) Clone() builtinFunc { // evalDuration evals SEC_TO_TIME(seconds). // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_sec-to-time -func (b *builtinSecToTimeSig) evalDuration(ctx sessionctx.Context, row chunk.Row) (types.Duration, bool, error) { +func (b *builtinSecToTimeSig) evalDuration(ctx EvalContext, row chunk.Row) (types.Duration, bool, error) { secondsFloat, isNull, err := b.args[0].EvalReal(ctx, row) if isNull || err != nil { return types.Duration{}, isNull, err @@ -5660,7 +5707,7 @@ func (b *builtinSubDatetimeAndDurationSig) Clone() builtinFunc { // evalTime evals a builtinSubDatetimeAndDurationSig. // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_subtime -func (b *builtinSubDatetimeAndDurationSig) evalTime(ctx sessionctx.Context, row chunk.Row) (types.Time, bool, error) { +func (b *builtinSubDatetimeAndDurationSig) evalTime(ctx EvalContext, row chunk.Row) (types.Time, bool, error) { arg0, isNull, err := b.args[0].EvalTime(ctx, row) if isNull || err != nil { return types.ZeroDatetime, isNull, err @@ -5686,7 +5733,7 @@ func (b *builtinSubDatetimeAndStringSig) Clone() builtinFunc { // evalTime evals a builtinSubDatetimeAndStringSig. // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_subtime -func (b *builtinSubDatetimeAndStringSig) evalTime(ctx sessionctx.Context, row chunk.Row) (types.Time, bool, error) { +func (b *builtinSubDatetimeAndStringSig) evalTime(ctx EvalContext, row chunk.Row) (types.Time, bool, error) { arg0, isNull, err := b.args[0].EvalTime(ctx, row) if isNull || err != nil { return types.ZeroDatetime, isNull, err @@ -5723,7 +5770,7 @@ func (b *builtinSubTimeDateTimeNullSig) Clone() builtinFunc { // evalTime evals a builtinSubTimeDateTimeNullSig. // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_subtime -func (b *builtinSubTimeDateTimeNullSig) evalTime(ctx sessionctx.Context, row chunk.Row) (types.Time, bool, error) { +func (b *builtinSubTimeDateTimeNullSig) evalTime(ctx EvalContext, row chunk.Row) (types.Time, bool, error) { return types.ZeroDatetime, true, nil } @@ -5739,7 +5786,7 @@ func (b *builtinSubStringAndDurationSig) Clone() builtinFunc { // evalString evals a builtinSubStringAndDurationSig. // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_subtime -func (b *builtinSubStringAndDurationSig) evalString(ctx sessionctx.Context, row chunk.Row) (result string, isNull bool, err error) { +func (b *builtinSubStringAndDurationSig) evalString(ctx EvalContext, row chunk.Row) (result string, isNull bool, err error) { var ( arg0 string arg1 types.Duration @@ -5780,7 +5827,7 @@ func (b *builtinSubStringAndStringSig) Clone() builtinFunc { // evalString evals a builtinSubStringAndStringSig. // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_subtime -func (b *builtinSubStringAndStringSig) evalString(ctx sessionctx.Context, row chunk.Row) (result string, isNull bool, err error) { +func (b *builtinSubStringAndStringSig) evalString(ctx EvalContext, row chunk.Row) (result string, isNull bool, err error) { var ( s, arg0 string arg1 types.Duration @@ -5833,7 +5880,7 @@ func (b *builtinSubTimeStringNullSig) Clone() builtinFunc { // evalString evals a builtinSubTimeStringNullSig. // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_subtime -func (b *builtinSubTimeStringNullSig) evalString(ctx sessionctx.Context, row chunk.Row) (string, bool, error) { +func (b *builtinSubTimeStringNullSig) evalString(ctx EvalContext, row chunk.Row) (string, bool, error) { return "", true, nil } @@ -5849,7 +5896,7 @@ func (b *builtinSubDurationAndDurationSig) Clone() builtinFunc { // evalDuration evals a builtinSubDurationAndDurationSig. // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_subtime -func (b *builtinSubDurationAndDurationSig) evalDuration(ctx sessionctx.Context, row chunk.Row) (types.Duration, bool, error) { +func (b *builtinSubDurationAndDurationSig) evalDuration(ctx EvalContext, row chunk.Row) (types.Duration, bool, error) { arg0, isNull, err := b.args[0].EvalDuration(ctx, row) if isNull || err != nil { return types.ZeroDuration, isNull, err @@ -5877,7 +5924,7 @@ func (b *builtinSubDurationAndStringSig) Clone() builtinFunc { // evalDuration evals a builtinSubDurationAndStringSig. // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_subtime -func (b *builtinSubDurationAndStringSig) evalDuration(ctx sessionctx.Context, row chunk.Row) (types.Duration, bool, error) { +func (b *builtinSubDurationAndStringSig) evalDuration(ctx EvalContext, row chunk.Row) (types.Duration, bool, error) { arg0, isNull, err := b.args[0].EvalDuration(ctx, row) if isNull || err != nil { return types.ZeroDuration, isNull, err @@ -5914,7 +5961,7 @@ func (b *builtinSubTimeDurationNullSig) Clone() builtinFunc { // evalDuration evals a builtinSubTimeDurationNullSig. // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_subtime -func (b *builtinSubTimeDurationNullSig) evalDuration(ctx sessionctx.Context, row chunk.Row) (types.Duration, bool, error) { +func (b *builtinSubTimeDurationNullSig) evalDuration(ctx EvalContext, row chunk.Row) (types.Duration, bool, error) { return types.ZeroDuration, true, nil } @@ -5930,7 +5977,7 @@ func (b *builtinSubDateAndDurationSig) Clone() builtinFunc { // evalString evals a builtinSubDateAndDurationSig. // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_subtime -func (b *builtinSubDateAndDurationSig) evalString(ctx sessionctx.Context, row chunk.Row) (string, bool, error) { +func (b *builtinSubDateAndDurationSig) evalString(ctx EvalContext, row chunk.Row) (string, bool, error) { arg0, isNull, err := b.args[0].EvalDuration(ctx, row) if isNull || err != nil { return "", isNull, err @@ -5955,7 +6002,7 @@ func (b *builtinSubDateAndStringSig) Clone() builtinFunc { // evalString evals a builtinSubDateAndStringSig. // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_subtime -func (b *builtinSubDateAndStringSig) evalString(ctx sessionctx.Context, row chunk.Row) (string, bool, error) { +func (b *builtinSubDateAndStringSig) evalString(ctx EvalContext, row chunk.Row) (string, bool, error) { arg0, isNull, err := b.args[0].EvalDuration(ctx, row) if isNull || err != nil { return "", isNull, err @@ -6014,7 +6061,7 @@ func (b *builtinTimeFormatSig) Clone() builtinFunc { // evalString evals a builtinTimeFormatSig. // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_time-format -func (b *builtinTimeFormatSig) evalString(ctx sessionctx.Context, row chunk.Row) (string, bool, error) { +func (b *builtinTimeFormatSig) evalString(ctx EvalContext, row chunk.Row) (string, bool, error) { dur, isNull, err := b.args[0].EvalDuration(ctx, row) // if err != nil, then dur is ZeroDuration, outputs 00:00:00 in this case which follows the behavior of mysql. if err != nil { @@ -6027,12 +6074,12 @@ func (b *builtinTimeFormatSig) evalString(ctx sessionctx.Context, row chunk.Row) if err != nil || isNull { return "", isNull, err } - res, err := b.formatTime(ctx, dur, formatMask) + res, err := b.formatTime(dur, formatMask) return res, isNull, err } // formatTime see https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_time-format -func (b *builtinTimeFormatSig) formatTime(ctx sessionctx.Context, t types.Duration, formatMask string) (res string, err error) { +func (b *builtinTimeFormatSig) formatTime(t types.Duration, formatMask string) (res string, err error) { return t.DurationFormat(formatMask) } @@ -6066,7 +6113,7 @@ func (b *builtinTimeToSecSig) Clone() builtinFunc { // evalInt evals TIME_TO_SEC(time). // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_time-to-sec -func (b *builtinTimeToSecSig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinTimeToSecSig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { duration, isNull, err := b.args[0].EvalDuration(ctx, row) if isNull || err != nil { return 0, isNull, err @@ -6199,7 +6246,7 @@ func addUnitToTime(unit string, t time.Time, v float64) (time.Time, bool, error) // evalString evals a builtinTimestampAddSig. // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_timestampadd -func (b *builtinTimestampAddSig) evalString(ctx sessionctx.Context, row chunk.Row) (string, bool, error) { +func (b *builtinTimestampAddSig) evalString(ctx EvalContext, row chunk.Row) (string, bool, error) { unit, isNull, err := b.args[0].EvalString(ctx, row) if isNull || err != nil { return "", isNull, err @@ -6282,7 +6329,7 @@ func (b *builtinToDaysSig) Clone() builtinFunc { // evalInt evals a builtinToDaysSig. // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_to-days -func (b *builtinToDaysSig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinToDaysSig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { arg, isNull, err := b.args[0].EvalTime(ctx, row) if isNull || err != nil { @@ -6327,7 +6374,7 @@ func (b *builtinToSecondsSig) Clone() builtinFunc { // evalInt evals a builtinToSecondsSig. // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_to-seconds -func (b *builtinToSecondsSig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinToSecondsSig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { arg, isNull, err := b.args[0].EvalTime(ctx, row) if isNull || err != nil { return 0, true, handleInvalidTimeError(ctx, err) @@ -6390,7 +6437,7 @@ func (b *builtinUTCTimeWithoutArgSig) Clone() builtinFunc { // evalDuration evals a builtinUTCTimeWithoutArgSig. // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_utc-time -func (b *builtinUTCTimeWithoutArgSig) evalDuration(ctx sessionctx.Context, row chunk.Row) (types.Duration, bool, error) { +func (b *builtinUTCTimeWithoutArgSig) evalDuration(ctx EvalContext, row chunk.Row) (types.Duration, bool, error) { nowTs, err := getStmtTimestamp(ctx) if err != nil { return types.Duration{}, true, err @@ -6411,7 +6458,7 @@ func (b *builtinUTCTimeWithArgSig) Clone() builtinFunc { // evalDuration evals a builtinUTCTimeWithArgSig. // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_utc-time -func (b *builtinUTCTimeWithArgSig) evalDuration(ctx sessionctx.Context, row chunk.Row) (types.Duration, bool, error) { +func (b *builtinUTCTimeWithArgSig) evalDuration(ctx EvalContext, row chunk.Row) (types.Duration, bool, error) { fsp, isNull, err := b.args[0].EvalInt(ctx, row) if isNull || err != nil { return types.Duration{}, isNull, err @@ -6460,7 +6507,7 @@ func (b *builtinLastDaySig) Clone() builtinFunc { // evalTime evals a builtinLastDaySig. // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_last-day -func (b *builtinLastDaySig) evalTime(ctx sessionctx.Context, row chunk.Row) (types.Time, bool, error) { +func (b *builtinLastDaySig) evalTime(ctx EvalContext, row chunk.Row) (types.Time, bool, error) { arg, isNull, err := b.args[0].EvalTime(ctx, row) if isNull || err != nil { return types.ZeroTime, true, handleInvalidTimeError(ctx, err) @@ -6523,7 +6570,7 @@ func (b *builtinTidbParseTsoSig) Clone() builtinFunc { } // evalTime evals a builtinTidbParseTsoSig. -func (b *builtinTidbParseTsoSig) evalTime(ctx sessionctx.Context, row chunk.Row) (types.Time, bool, error) { +func (b *builtinTidbParseTsoSig) evalTime(ctx EvalContext, row chunk.Row) (types.Time, bool, error) { arg, isNull, err := b.args[0].EvalInt(ctx, row) if isNull || err != nil || arg <= 0 { return types.ZeroTime, true, handleInvalidTimeError(ctx, err) @@ -6567,7 +6614,7 @@ func (b *builtinTidbParseTsoLogicalSig) Clone() builtinFunc { } // evalTime evals a builtinTidbParseTsoLogicalSig. -func (b *builtinTidbParseTsoLogicalSig) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (b *builtinTidbParseTsoLogicalSig) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { arg, isNull, err := b.args[0].EvalInt(ctx, row) if isNull || err != nil || arg <= 0 { return 0, true, err @@ -6606,7 +6653,7 @@ func (b *builtinTiDBBoundedStalenessSig) Clone() builtinFunc { return newSig } -func (b *builtinTiDBBoundedStalenessSig) evalTime(ctx sessionctx.Context, row chunk.Row) (types.Time, bool, error) { +func (b *builtinTiDBBoundedStalenessSig) evalTime(ctx EvalContext, row chunk.Row) (types.Time, bool, error) { leftTime, isNull, err := b.args[0].EvalTime(ctx, row) if isNull || err != nil { return types.ZeroTime, true, handleInvalidTimeError(ctx, err) @@ -6641,14 +6688,14 @@ func (b *builtinTiDBBoundedStalenessSig) evalTime(ctx sessionctx.Context, row ch } // GetMinSafeTime get minSafeTime -func GetMinSafeTime(sessionCtx sessionctx.Context) time.Time { - return getMinSafeTime(sessionCtx, getTimeZone(sessionCtx)) +func GetMinSafeTime(ctx EvalContext) time.Time { + return getMinSafeTime(ctx, getTimeZone(ctx)) } -func getMinSafeTime(sessionCtx sessionctx.Context, timeZone *time.Location) time.Time { +func getMinSafeTime(ctx EvalContext, timeZone *time.Location) time.Time { var minSafeTS uint64 txnScope := config.GetTxnScopeFromConfig() - if store := sessionCtx.GetStore(); store != nil { + if store := ctx.GetStore(); store != nil { minSafeTS = store.GetMinSafeTS(txnScope) } // Inject mocked SafeTS for test. @@ -6657,7 +6704,7 @@ func getMinSafeTime(sessionCtx sessionctx.Context, timeZone *time.Location) time minSafeTS = uint64(injectTS) }) // Try to get from the stmt cache to make sure this function is deterministic. - stmtCtx := sessionCtx.GetSessionVars().StmtCtx + stmtCtx := ctx.GetSessionVars().StmtCtx minSafeTS = stmtCtx.GetOrStoreStmtCache(stmtctx.StmtSafeTSCacheKey, minSafeTS).(uint64) return oracle.GetTimeFromTS(minSafeTS).In(timeZone) } @@ -6746,7 +6793,7 @@ func (b *builtinTiDBCurrentTsoSig) Clone() builtinFunc { } // evalInt evals currentTSO(). -func (b *builtinTiDBCurrentTsoSig) evalInt(ctx sessionctx.Context, row chunk.Row) (val int64, isNull bool, err error) { +func (b *builtinTiDBCurrentTsoSig) evalInt(ctx EvalContext, row chunk.Row) (val int64, isNull bool, err error) { tso, _ := ctx.GetSessionVars().GetSessionOrGlobalSystemVar(context.Background(), "tidb_current_ts") itso, _ := strconv.ParseInt(tso, 10, 64) return itso, false, nil diff --git a/pkg/expression/builtin_time_vec.go b/pkg/expression/builtin_time_vec.go index 075f3965edc18..930bbb0b6f7dc 100644 --- a/pkg/expression/builtin_time_vec.go +++ b/pkg/expression/builtin_time_vec.go @@ -24,14 +24,13 @@ import ( "github.com/pingcap/errors" "github.com/pingcap/tidb/pkg/parser/mysql" "github.com/pingcap/tidb/pkg/parser/terror" - "github.com/pingcap/tidb/pkg/sessionctx" "github.com/pingcap/tidb/pkg/sessionctx/variable" "github.com/pingcap/tidb/pkg/types" "github.com/pingcap/tidb/pkg/util/chunk" "github.com/tikv/client-go/v2/oracle" ) -func (b *builtinMonthSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinMonthSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -59,7 +58,7 @@ func (b *builtinMonthSig) vectorized() bool { return true } -func (b *builtinYearSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinYearSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -87,7 +86,7 @@ func (b *builtinYearSig) vectorized() bool { return true } -func (b *builtinDateSig) vecEvalTime(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinDateSig) vecEvalTime(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { if err := b.args[0].VecEvalTime(ctx, input, result); err != nil { return err } @@ -117,7 +116,7 @@ func (b *builtinFromUnixTime2ArgSig) vectorized() bool { return true } -func (b *builtinFromUnixTime2ArgSig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinFromUnixTime2ArgSig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf1, err := b.bufAllocator.get() if err != nil { @@ -166,7 +165,7 @@ func (b *builtinSysDateWithoutFspSig) vectorized() bool { return true } -func (b *builtinSysDateWithoutFspSig) vecEvalTime(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinSysDateWithoutFspSig) vecEvalTime(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() loc := ctx.GetSessionVars().Location() now := time.Now().In(loc) @@ -188,7 +187,7 @@ func (b *builtinExtractDatetimeFromStringSig) vectorized() bool { return false } -func (b *builtinExtractDatetimeFromStringSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinExtractDatetimeFromStringSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -229,7 +228,7 @@ func (b *builtinDayNameSig) vectorized() bool { return true } -func (b *builtinDayNameSig) vecEvalIndex(ctx sessionctx.Context, input *chunk.Chunk, apply func(i int, res int), applyNull func(i int)) error { +func (b *builtinDayNameSig) vecEvalIndex(ctx EvalContext, input *chunk.Chunk, apply func(i int, res int), applyNull func(i int)) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -264,7 +263,7 @@ func (b *builtinDayNameSig) vecEvalIndex(ctx sessionctx.Context, input *chunk.Ch // vecEvalString evals a builtinDayNameSig. // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_dayname -func (b *builtinDayNameSig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinDayNameSig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() result.ReserveString(n) @@ -275,7 +274,7 @@ func (b *builtinDayNameSig) vecEvalString(ctx sessionctx.Context, input *chunk.C }) } -func (b *builtinDayNameSig) vecEvalReal(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinDayNameSig) vecEvalReal(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() result.ResizeFloat64(n, false) f64s := result.Float64s() @@ -287,7 +286,7 @@ func (b *builtinDayNameSig) vecEvalReal(ctx sessionctx.Context, input *chunk.Chu }) } -func (b *builtinDayNameSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinDayNameSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() result.ResizeInt64(n, false) i64s := result.Int64s() @@ -303,7 +302,7 @@ func (b *builtinWeekDaySig) vectorized() bool { return true } -func (b *builtinWeekDaySig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinWeekDaySig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -338,7 +337,7 @@ func (b *builtinTimeFormatSig) vectorized() bool { return true } -func (b *builtinTimeFormatSig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinTimeFormatSig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -367,7 +366,7 @@ func (b *builtinTimeFormatSig) vecEvalString(ctx sessionctx.Context, input *chun result.AppendNull() continue } - res, err := b.formatTime(ctx, buf.GetDuration(i, 0), buf1.GetString(i)) + res, err := b.formatTime(buf.GetDuration(i, 0), buf1.GetString(i)) if err != nil { return err } @@ -382,7 +381,7 @@ func (b *builtinUTCTimeWithArgSig) vectorized() bool { // vecEvalDuration evals a builtinUTCTimeWithArgSig. // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_utc-time -func (b *builtinUTCTimeWithArgSig) vecEvalDuration(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinUTCTimeWithArgSig) vecEvalDuration(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -426,7 +425,7 @@ func (b *builtinUnixTimestampCurrentSig) vectorized() bool { return true } -func (b *builtinUnixTimestampCurrentSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinUnixTimestampCurrentSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { nowTs, err := getStmtTimestamp(ctx) if err != nil { return err @@ -454,7 +453,7 @@ func (b *builtinYearWeekWithoutModeSig) vectorized() bool { // vecEvalInt evals YEARWEEK(date). // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_yearweek -func (b *builtinYearWeekWithoutModeSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinYearWeekWithoutModeSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -496,7 +495,7 @@ func (b *builtinPeriodDiffSig) vectorized() bool { // vecEvalInt evals PERIOD_DIFF(P1,P2). // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_period-diff -func (b *builtinPeriodDiffSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinPeriodDiffSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { if err := b.args[0].VecEvalInt(ctx, input, result); err != nil { return err } @@ -530,7 +529,7 @@ func (b *builtinNowWithArgSig) vectorized() bool { return true } -func (b *builtinNowWithArgSig) vecEvalTime(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinNowWithArgSig) vecEvalTime(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() bufFsp, err := b.bufAllocator.get() if err != nil { @@ -577,7 +576,7 @@ func (b *builtinGetFormatSig) vectorized() bool { // vecEvalString evals a builtinGetFormatSig. // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_get-format -func (b *builtinGetFormatSig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinGetFormatSig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf0, err := b.bufAllocator.get() if err != nil { @@ -660,7 +659,7 @@ func (b *builtinLastDaySig) vectorized() bool { return true } -func (b *builtinLastDaySig) vecEvalTime(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinLastDaySig) vecEvalTime(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() if err := b.args[0].VecEvalTime(ctx, input, result); err != nil { return err @@ -689,7 +688,7 @@ func (b *builtinStrToDateDateSig) vectorized() bool { return true } -func (b *builtinStrToDateDateSig) vecEvalTime(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinStrToDateDateSig) vecEvalTime(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() bufStrings, err := b.bufAllocator.get() if err != nil { @@ -744,7 +743,7 @@ func (b *builtinSysDateWithFspSig) vectorized() bool { return true } -func (b *builtinSysDateWithFspSig) vecEvalTime(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinSysDateWithFspSig) vecEvalTime(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -780,7 +779,7 @@ func (b *builtinTidbParseTsoSig) vectorized() bool { return true } -func (b *builtinTidbParseTsoSig) vecEvalTime(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinTidbParseTsoSig) vecEvalTime(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -816,7 +815,7 @@ func (b *builtinTiDBBoundedStalenessSig) vectorized() bool { return true } -func (b *builtinTiDBBoundedStalenessSig) vecEvalTime(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinTiDBBoundedStalenessSig) vecEvalTime(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf0, err := b.bufAllocator.get() if err != nil { @@ -880,7 +879,7 @@ func (b *builtinFromDaysSig) vectorized() bool { return true } -func (b *builtinFromDaysSig) vecEvalTime(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinFromDaysSig) vecEvalTime(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -908,7 +907,7 @@ func (b *builtinMicroSecondSig) vectorized() bool { return true } -func (b *builtinMicroSecondSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinMicroSecondSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -937,7 +936,7 @@ func (b *builtinQuarterSig) vectorized() bool { // vecEvalInt evals QUARTER(date). // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_quarter -func (b *builtinQuarterSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinQuarterSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -966,7 +965,7 @@ func (b *builtinWeekWithModeSig) vectorized() bool { return true } -func (b *builtinWeekWithModeSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinWeekWithModeSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf1, err := b.bufAllocator.get() if err != nil { @@ -1018,7 +1017,7 @@ func (b *builtinExtractDatetimeSig) vectorized() bool { return true } -func (b *builtinExtractDatetimeSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinExtractDatetimeSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() unit, err := b.bufAllocator.get() if err != nil { @@ -1059,7 +1058,7 @@ func (b *builtinExtractDurationSig) vectorized() bool { return true } -func (b *builtinExtractDurationSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinExtractDurationSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() unit, err := b.bufAllocator.get() if err != nil { @@ -1101,7 +1100,7 @@ func (b *builtinStrToDateDurationSig) vectorized() bool { return true } -func (b *builtinStrToDateDurationSig) vecEvalDuration(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinStrToDateDurationSig) vecEvalDuration(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() bufStrings, err := b.bufAllocator.get() if err != nil { @@ -1154,7 +1153,7 @@ func (b *builtinToSecondsSig) vectorized() bool { // vecEvalInt evals a builtinToSecondsSig. // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_to-seconds -func (b *builtinToSecondsSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinToSecondsSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -1191,7 +1190,7 @@ func (b *builtinMinuteSig) vectorized() bool { return true } -func (b *builtinMinuteSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinMinuteSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -1218,7 +1217,7 @@ func (b *builtinSecondSig) vectorized() bool { return true } -func (b *builtinSecondSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinSecondSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -1245,7 +1244,7 @@ func (b *builtinNowWithoutArgSig) vectorized() bool { return true } -func (b *builtinNowWithoutArgSig) vecEvalTime(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinNowWithoutArgSig) vecEvalTime(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() nowTs, isNull, err := evalNowWithFsp(ctx, 0) if err != nil { @@ -1267,7 +1266,7 @@ func (b *builtinTimestampLiteralSig) vectorized() bool { return true } -func (b *builtinTimestampLiteralSig) vecEvalTime(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinTimestampLiteralSig) vecEvalTime(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() result.ResizeTime(n, false) times := result.Times() @@ -1281,7 +1280,7 @@ func (b *builtinMakeDateSig) vectorized() bool { return true } -func (b *builtinMakeDateSig) vecEvalTime(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinMakeDateSig) vecEvalTime(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf1, err := b.bufAllocator.get() if err != nil { @@ -1344,7 +1343,7 @@ func (b *builtinWeekOfYearSig) vectorized() bool { return true } -func (b *builtinWeekOfYearSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinWeekOfYearSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -1381,7 +1380,7 @@ func (b *builtinUTCTimestampWithArgSig) vectorized() bool { // vecEvalTime evals UTC_TIMESTAMP(fsp). // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_utc-timestamp -func (b *builtinUTCTimestampWithArgSig) vecEvalTime(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinUTCTimestampWithArgSig) vecEvalTime(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -1425,7 +1424,7 @@ func (b *builtinTimeToSecSig) vectorized() bool { // vecEvalInt evals TIME_TO_SEC(time). // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_time-to-sec -func (b *builtinTimeToSecSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinTimeToSecSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -1460,7 +1459,7 @@ func (b *builtinStrToDateDatetimeSig) vectorized() bool { return true } -func (b *builtinStrToDateDatetimeSig) vecEvalTime(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinStrToDateDatetimeSig) vecEvalTime(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() dateBuf, err := b.bufAllocator.get() if err != nil { @@ -1518,7 +1517,7 @@ func (b *builtinUTCDateSig) vectorized() bool { return true } -func (b *builtinUTCDateSig) vecEvalTime(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinUTCDateSig) vecEvalTime(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { nowTs, err := getStmtTimestamp(ctx) if err != nil { return err @@ -1539,7 +1538,7 @@ func (b *builtinWeekWithoutModeSig) vectorized() bool { return true } -func (b *builtinWeekWithoutModeSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinWeekWithoutModeSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -1586,7 +1585,7 @@ func (b *builtinUnixTimestampDecSig) vectorized() bool { return true } -func (b *builtinUnixTimestampDecSig) vecEvalDecimal(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinUnixTimestampDecSig) vecEvalDecimal(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() result.ResizeDecimal(n, false) ts := result.Decimals() @@ -1633,7 +1632,7 @@ func (b *builtinPeriodAddSig) vectorized() bool { // vecEvalInt evals PERIOD_ADD(P,N). // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_period-add -func (b *builtinPeriodAddSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinPeriodAddSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { if err := b.args[0].VecEvalInt(ctx, input, result); err != nil { return err } @@ -1671,7 +1670,7 @@ func (b *builtinTimestampAddSig) vectorized() bool { // vecEvalString evals a builtinTimestampAddSig. // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_timestampadd -func (b *builtinTimestampAddSig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinTimestampAddSig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -1754,7 +1753,7 @@ func (b *builtinToDaysSig) vectorized() bool { // vecEvalInt evals a builtinToDaysSig. // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_to-days -func (b *builtinToDaysSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinToDaysSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -1791,7 +1790,7 @@ func (b *builtinDateFormatSig) vectorized() bool { return true } -func (b *builtinDateFormatSig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinDateFormatSig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() dateBuf, err := b.bufAllocator.get() @@ -1860,7 +1859,7 @@ func (b *builtinHourSig) vectorized() bool { return true } -func (b *builtinHourSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinHourSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -1887,7 +1886,7 @@ func (b *builtinSecToTimeSig) vectorized() bool { return true } -func (b *builtinSecToTimeSig) vecEvalDuration(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinSecToTimeSig) vecEvalDuration(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -1944,7 +1943,7 @@ func (b *builtinUTCTimeWithoutArgSig) vectorized() bool { // vecEvalDuration evals a builtinUTCTimeWithoutArgSig. // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_utc-time -func (b *builtinUTCTimeWithoutArgSig) vecEvalDuration(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinUTCTimeWithoutArgSig) vecEvalDuration(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() nowTs, err := getStmtTimestamp(ctx) if err != nil { @@ -1966,7 +1965,7 @@ func (b *builtinDateDiffSig) vectorized() bool { return true } -func (b *builtinDateDiffSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinDateDiffSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf0, err := b.bufAllocator.get() if err != nil { @@ -2015,7 +2014,7 @@ func (b *builtinCurrentDateSig) vectorized() bool { return true } -func (b *builtinCurrentDateSig) vecEvalTime(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinCurrentDateSig) vecEvalTime(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { nowTs, err := getStmtTimestamp(ctx) if err != nil { return err @@ -2038,7 +2037,7 @@ func (b *builtinMakeTimeSig) vectorized() bool { return true } -func (b *builtinMakeTimeSig) getVecIntParam(ctx sessionctx.Context, arg Expression, input *chunk.Chunk, col *chunk.Column) (err error) { +func (b *builtinMakeTimeSig) getVecIntParam(ctx EvalContext, arg Expression, input *chunk.Chunk, col *chunk.Column) (err error) { if arg.GetType().EvalType() == types.ETReal { err = arg.VecEvalReal(ctx, input, col) if err != nil { @@ -2056,7 +2055,7 @@ func (b *builtinMakeTimeSig) getVecIntParam(ctx sessionctx.Context, arg Expressi return err } -func (b *builtinMakeTimeSig) vecEvalDuration(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinMakeTimeSig) vecEvalDuration(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() result.ResizeInt64(n, false) hoursBuf := result @@ -2107,7 +2106,7 @@ func (b *builtinDayOfYearSig) vectorized() bool { return true } -func (b *builtinDayOfYearSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinDayOfYearSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -2141,7 +2140,7 @@ func (b *builtinFromUnixTime1ArgSig) vectorized() bool { return true } -func (b *builtinFromUnixTime1ArgSig) vecEvalTime(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinFromUnixTime1ArgSig) vecEvalTime(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -2179,7 +2178,7 @@ func (b *builtinYearWeekWithModeSig) vectorized() bool { // vecEvalInt evals YEARWEEK(date,mode). // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_yearweek -func (b *builtinYearWeekWithModeSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinYearWeekWithModeSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf1, err := b.bufAllocator.get() if err != nil { @@ -2232,7 +2231,7 @@ func (b *builtinTimestampDiffSig) vectorized() bool { // vecEvalInt evals a builtinTimestampDiffSig. // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_timestampdiff -func (b *builtinTimestampDiffSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinTimestampDiffSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() unitBuf, err := b.bufAllocator.get() if err != nil { @@ -2292,7 +2291,7 @@ func (b *builtinUnixTimestampIntSig) vectorized() bool { // vecEvalInt evals a UNIX_TIMESTAMP(time). // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_unix-timestamp -func (b *builtinUnixTimestampIntSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinUnixTimestampIntSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -2345,7 +2344,7 @@ func (b *builtinCurrentTime0ArgSig) vectorized() bool { return true } -func (b *builtinCurrentTime0ArgSig) vecEvalDuration(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinCurrentTime0ArgSig) vecEvalDuration(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() nowTs, err := getStmtTimestamp(ctx) if err != nil { @@ -2369,7 +2368,7 @@ func (b *builtinTimeSig) vectorized() bool { return true } -func (b *builtinTimeSig) vecEvalDuration(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinTimeSig) vecEvalDuration(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -2417,7 +2416,7 @@ func (b *builtinDateLiteralSig) vectorized() bool { return true } -func (b *builtinDateLiteralSig) vecEvalTime(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinDateLiteralSig) vecEvalTime(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() mode := ctx.GetSessionVars().SQLMode if mode.HasNoZeroDateMode() && b.literal.IsZero() { @@ -2439,7 +2438,7 @@ func (b *builtinTimeLiteralSig) vectorized() bool { return true } -func (b *builtinTimeLiteralSig) vecEvalDuration(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinTimeLiteralSig) vecEvalDuration(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() result.ResizeGoDuration(n, false) d64s := result.GoDurations() @@ -2449,7 +2448,7 @@ func (b *builtinTimeLiteralSig) vecEvalDuration(ctx sessionctx.Context, input *c return nil } -func (b *builtinMonthNameSig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinMonthNameSig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -2491,7 +2490,7 @@ func (b *builtinDayOfWeekSig) vectorized() bool { return true } -func (b *builtinDayOfWeekSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinDayOfWeekSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -2525,7 +2524,7 @@ func (b *builtinCurrentTime1ArgSig) vectorized() bool { return true } -func (b *builtinCurrentTime1ArgSig) vecEvalDuration(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinCurrentTime1ArgSig) vecEvalDuration(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -2562,7 +2561,7 @@ func (b *builtinUTCTimestampWithoutArgSig) vectorized() bool { // vecEvalTime evals UTC_TIMESTAMP(). // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_utc-timestamp -func (b *builtinUTCTimestampWithoutArgSig) vecEvalTime(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinUTCTimestampWithoutArgSig) vecEvalTime(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() res, isNull, err := evalUTCTimestampWithFsp(ctx, types.DefaultFsp) if err != nil { @@ -2584,7 +2583,7 @@ func (b *builtinConvertTzSig) vectorized() bool { return true } -func (b *builtinConvertTzSig) vecEvalTime(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinConvertTzSig) vecEvalTime(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() if err := b.args[0].VecEvalTime(ctx, input, result); err != nil { return err @@ -2627,7 +2626,7 @@ func (b *builtinConvertTzSig) vecEvalTime(ctx sessionctx.Context, input *chunk.C return nil } -func (b *builtinTimestamp1ArgSig) vecEvalTime(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinTimestamp1ArgSig) vecEvalTime(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -2670,7 +2669,7 @@ func (b *builtinTimestamp1ArgSig) vectorized() bool { return true } -func (b *builtinTimestamp2ArgsSig) vecEvalTime(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinTimestamp2ArgsSig) vecEvalTime(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf0, err := b.bufAllocator.get() if err != nil { @@ -2747,7 +2746,7 @@ func (b *builtinTimestamp2ArgsSig) vectorized() bool { return true } -func (b *builtinDayOfMonthSig) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinDayOfMonthSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() if err != nil { @@ -2774,7 +2773,7 @@ func (b *builtinDayOfMonthSig) vectorized() bool { return true } -func (b *builtinAddSubDateAsStringSig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinAddSubDateAsStringSig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() unit, isNull, err := b.args[2].EvalString(ctx, chunk.Row{}) if err != nil { @@ -2834,7 +2833,7 @@ func (b *builtinAddSubDateAsStringSig) vectorized() bool { return true } -func (b *builtinAddSubDateDatetimeAnySig) vecEvalTime(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinAddSubDateDatetimeAnySig) vecEvalTime(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() unit, isNull, err := b.args[2].EvalString(ctx, chunk.Row{}) if err != nil { @@ -2881,7 +2880,7 @@ func (b *builtinAddSubDateDatetimeAnySig) vectorized() bool { return true } -func (b *builtinAddSubDateDurationAnySig) vecEvalTime(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinAddSubDateDurationAnySig) vecEvalTime(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() unit, isNull, err := b.args[2].EvalString(ctx, chunk.Row{}) if err != nil { @@ -2938,7 +2937,7 @@ func (b *builtinAddSubDateDurationAnySig) vecEvalTime(ctx sessionctx.Context, in return nil } -func (b *builtinAddSubDateDurationAnySig) vecEvalDuration(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinAddSubDateDurationAnySig) vecEvalDuration(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() unit, isNull, err := b.args[2].EvalString(ctx, chunk.Row{}) if err != nil { diff --git a/pkg/expression/builtin_time_vec_generated.go b/pkg/expression/builtin_time_vec_generated.go index 0976e14a138be..28670e3299853 100644 --- a/pkg/expression/builtin_time_vec_generated.go +++ b/pkg/expression/builtin_time_vec_generated.go @@ -19,12 +19,11 @@ package expression import ( "github.com/pingcap/tidb/pkg/parser/mysql" "github.com/pingcap/tidb/pkg/parser/terror" - "github.com/pingcap/tidb/pkg/sessionctx" "github.com/pingcap/tidb/pkg/types" "github.com/pingcap/tidb/pkg/util/chunk" ) -func (b *builtinAddDatetimeAndDurationSig) vecEvalTime(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinAddDatetimeAndDurationSig) vecEvalTime(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() if err := b.args[0].VecEvalTime(ctx, input, result); err != nil { @@ -81,7 +80,7 @@ func (b *builtinAddDatetimeAndDurationSig) vectorized() bool { return true } -func (b *builtinAddDatetimeAndStringSig) vecEvalTime(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinAddDatetimeAndStringSig) vecEvalTime(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() if err := b.args[0].VecEvalTime(ctx, input, result); err != nil { @@ -151,7 +150,7 @@ func (b *builtinAddDatetimeAndStringSig) vectorized() bool { return true } -func (b *builtinAddDurationAndDurationSig) vecEvalDuration(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinAddDurationAndDurationSig) vecEvalDuration(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() if err := b.args[0].VecEvalDuration(ctx, input, result); err != nil { @@ -207,7 +206,7 @@ func (b *builtinAddDurationAndDurationSig) vectorized() bool { return true } -func (b *builtinAddDurationAndStringSig) vecEvalDuration(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinAddDurationAndStringSig) vecEvalDuration(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() if err := b.args[0].VecEvalDuration(ctx, input, result); err != nil { @@ -276,7 +275,7 @@ func (b *builtinAddDurationAndStringSig) vectorized() bool { return true } -func (b *builtinAddStringAndDurationSig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinAddStringAndDurationSig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf0, err := b.bufAllocator.get() @@ -359,7 +358,7 @@ func (b *builtinAddStringAndDurationSig) vectorized() bool { return true } -func (b *builtinAddStringAndStringSig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinAddStringAndStringSig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf0, err := b.bufAllocator.get() @@ -457,7 +456,7 @@ func (b *builtinAddStringAndStringSig) vectorized() bool { return true } -func (b *builtinAddDateAndDurationSig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinAddDateAndDurationSig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf0, err := b.bufAllocator.get() @@ -522,7 +521,7 @@ func (b *builtinAddDateAndDurationSig) vectorized() bool { return true } -func (b *builtinAddDateAndStringSig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinAddDateAndStringSig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf0, err := b.bufAllocator.get() @@ -598,7 +597,7 @@ func (b *builtinAddDateAndStringSig) vectorized() bool { return true } -func (b *builtinAddTimeDateTimeNullSig) vecEvalTime(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinAddTimeDateTimeNullSig) vecEvalTime(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() result.ResizeTime(n, true) @@ -610,7 +609,7 @@ func (b *builtinAddTimeDateTimeNullSig) vectorized() bool { return true } -func (b *builtinAddTimeStringNullSig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinAddTimeStringNullSig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() result.ReserveString(n) @@ -625,7 +624,7 @@ func (b *builtinAddTimeStringNullSig) vectorized() bool { return true } -func (b *builtinAddTimeDurationNullSig) vecEvalDuration(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinAddTimeDurationNullSig) vecEvalDuration(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() result.ResizeGoDuration(n, true) @@ -637,7 +636,7 @@ func (b *builtinAddTimeDurationNullSig) vectorized() bool { return true } -func (b *builtinSubDatetimeAndDurationSig) vecEvalTime(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinSubDatetimeAndDurationSig) vecEvalTime(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() if err := b.args[0].VecEvalTime(ctx, input, result); err != nil { @@ -696,7 +695,7 @@ func (b *builtinSubDatetimeAndDurationSig) vectorized() bool { return true } -func (b *builtinSubDatetimeAndStringSig) vecEvalTime(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinSubDatetimeAndStringSig) vecEvalTime(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() if err := b.args[0].VecEvalTime(ctx, input, result); err != nil { @@ -765,7 +764,7 @@ func (b *builtinSubDatetimeAndStringSig) vectorized() bool { return true } -func (b *builtinSubDurationAndDurationSig) vecEvalDuration(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinSubDurationAndDurationSig) vecEvalDuration(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() if err := b.args[0].VecEvalDuration(ctx, input, result); err != nil { @@ -821,7 +820,7 @@ func (b *builtinSubDurationAndDurationSig) vectorized() bool { return true } -func (b *builtinSubDurationAndStringSig) vecEvalDuration(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinSubDurationAndStringSig) vecEvalDuration(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() if err := b.args[0].VecEvalDuration(ctx, input, result); err != nil { @@ -890,7 +889,7 @@ func (b *builtinSubDurationAndStringSig) vectorized() bool { return true } -func (b *builtinSubStringAndDurationSig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinSubStringAndDurationSig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf0, err := b.bufAllocator.get() @@ -973,7 +972,7 @@ func (b *builtinSubStringAndDurationSig) vectorized() bool { return true } -func (b *builtinSubStringAndStringSig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinSubStringAndStringSig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf0, err := b.bufAllocator.get() @@ -1071,7 +1070,7 @@ func (b *builtinSubStringAndStringSig) vectorized() bool { return true } -func (b *builtinSubDateAndDurationSig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinSubDateAndDurationSig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf0, err := b.bufAllocator.get() @@ -1136,7 +1135,7 @@ func (b *builtinSubDateAndDurationSig) vectorized() bool { return true } -func (b *builtinSubDateAndStringSig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinSubDateAndStringSig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf0, err := b.bufAllocator.get() @@ -1212,7 +1211,7 @@ func (b *builtinSubDateAndStringSig) vectorized() bool { return true } -func (b *builtinSubTimeDateTimeNullSig) vecEvalTime(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinSubTimeDateTimeNullSig) vecEvalTime(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() result.ResizeTime(n, true) @@ -1224,7 +1223,7 @@ func (b *builtinSubTimeDateTimeNullSig) vectorized() bool { return true } -func (b *builtinSubTimeStringNullSig) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinSubTimeStringNullSig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() result.ReserveString(n) @@ -1239,7 +1238,7 @@ func (b *builtinSubTimeStringNullSig) vectorized() bool { return true } -func (b *builtinSubTimeDurationNullSig) vecEvalDuration(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinSubTimeDurationNullSig) vecEvalDuration(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() result.ResizeGoDuration(n, true) @@ -1251,7 +1250,7 @@ func (b *builtinSubTimeDurationNullSig) vectorized() bool { return true } -func (b *builtinNullTimeDiffSig) vecEvalDuration(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinNullTimeDiffSig) vecEvalDuration(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() result.ResizeGoDuration(n, true) return nil @@ -1261,7 +1260,7 @@ func (b *builtinNullTimeDiffSig) vectorized() bool { return true } -func (b *builtinTimeStringTimeDiffSig) vecEvalDuration(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinTimeStringTimeDiffSig) vecEvalDuration(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() result.ResizeGoDuration(n, false) r64s := result.GoDurations() @@ -1317,7 +1316,7 @@ func (b *builtinTimeStringTimeDiffSig) vectorized() bool { return true } -func (b *builtinDurationStringTimeDiffSig) vecEvalDuration(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinDurationStringTimeDiffSig) vecEvalDuration(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() result.ResizeGoDuration(n, false) r64s := result.GoDurations() @@ -1373,7 +1372,7 @@ func (b *builtinDurationStringTimeDiffSig) vectorized() bool { return true } -func (b *builtinDurationDurationTimeDiffSig) vecEvalDuration(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinDurationDurationTimeDiffSig) vecEvalDuration(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() result.ResizeGoDuration(n, false) r64s := result.GoDurations() @@ -1421,7 +1420,7 @@ func (b *builtinDurationDurationTimeDiffSig) vectorized() bool { return true } -func (b *builtinStringTimeTimeDiffSig) vecEvalDuration(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinStringTimeTimeDiffSig) vecEvalDuration(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() result.ResizeGoDuration(n, false) r64s := result.GoDurations() @@ -1477,7 +1476,7 @@ func (b *builtinStringTimeTimeDiffSig) vectorized() bool { return true } -func (b *builtinStringDurationTimeDiffSig) vecEvalDuration(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinStringDurationTimeDiffSig) vecEvalDuration(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() result.ResizeGoDuration(n, false) r64s := result.GoDurations() @@ -1533,7 +1532,7 @@ func (b *builtinStringDurationTimeDiffSig) vectorized() bool { return true } -func (b *builtinStringStringTimeDiffSig) vecEvalDuration(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinStringStringTimeDiffSig) vecEvalDuration(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() result.ResizeGoDuration(n, false) r64s := result.GoDurations() @@ -1599,7 +1598,7 @@ func (b *builtinStringStringTimeDiffSig) vectorized() bool { return true } -func (b *builtinTimeTimeTimeDiffSig) vecEvalDuration(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinTimeTimeTimeDiffSig) vecEvalDuration(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() result.ResizeGoDuration(n, false) r64s := result.GoDurations() diff --git a/pkg/expression/builtin_vectorized.go b/pkg/expression/builtin_vectorized.go index 328e885301a9e..f51f7eac2dee4 100644 --- a/pkg/expression/builtin_vectorized.go +++ b/pkg/expression/builtin_vectorized.go @@ -20,7 +20,6 @@ import ( "github.com/pingcap/errors" "github.com/pingcap/tidb/pkg/parser/mysql" - "github.com/pingcap/tidb/pkg/sessionctx" "github.com/pingcap/tidb/pkg/types" "github.com/pingcap/tidb/pkg/util/chunk" ) @@ -83,7 +82,7 @@ func (r *localColumnPool) MemoryUsage() (sum int64) { } // vecEvalIntByRows uses the non-vectorized(row-based) interface `evalInt` to eval the expression. -func vecEvalIntByRows(ctx sessionctx.Context, sig builtinFunc, input *chunk.Chunk, result *chunk.Column) error { +func vecEvalIntByRows(ctx EvalContext, sig builtinFunc, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() result.ResizeInt64(n, false) i64s := result.Int64s() @@ -99,7 +98,7 @@ func vecEvalIntByRows(ctx sessionctx.Context, sig builtinFunc, input *chunk.Chun } // vecEvalStringByRows uses the non-vectorized(row-based) interface `evalString` to eval the expression. -func vecEvalStringByRows(sig builtinFunc, ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func vecEvalStringByRows(sig builtinFunc, ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() result.ReserveString(n) for i := 0; i < n; i++ { diff --git a/pkg/expression/builtin_vectorized_test.go b/pkg/expression/builtin_vectorized_test.go index 47a7e87cce8e8..740736febea6f 100644 --- a/pkg/expression/builtin_vectorized_test.go +++ b/pkg/expression/builtin_vectorized_test.go @@ -53,7 +53,7 @@ func (p *mockVecPlusIntBuiltinFunc) releaseBuf(buf *chunk.Column) { } } -func (p *mockVecPlusIntBuiltinFunc) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (p *mockVecPlusIntBuiltinFunc) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := p.allocBuf(n) if err != nil { @@ -218,7 +218,7 @@ func (p *mockBuiltinDouble) vectorized() bool { return p.enableVec } -func (p *mockBuiltinDouble) vecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (p *mockBuiltinDouble) vecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { if err := p.args[0].VecEvalInt(ctx, input, result); err != nil { return err } @@ -229,7 +229,7 @@ func (p *mockBuiltinDouble) vecEvalInt(ctx sessionctx.Context, input *chunk.Chun return nil } -func (p *mockBuiltinDouble) vecEvalReal(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (p *mockBuiltinDouble) vecEvalReal(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { if err := p.args[0].VecEvalReal(ctx, input, result); err != nil { return err } @@ -240,7 +240,7 @@ func (p *mockBuiltinDouble) vecEvalReal(ctx sessionctx.Context, input *chunk.Chu return nil } -func (p *mockBuiltinDouble) vecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (p *mockBuiltinDouble) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { var buf *chunk.Column var err error if buf, err = p.baseBuiltinFunc.bufAllocator.get(); err != nil { @@ -258,7 +258,7 @@ func (p *mockBuiltinDouble) vecEvalString(ctx sessionctx.Context, input *chunk.C return nil } -func (p *mockBuiltinDouble) vecEvalDecimal(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (p *mockBuiltinDouble) vecEvalDecimal(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { if err := p.args[0].VecEvalDecimal(ctx, input, result); err != nil { return err } @@ -273,7 +273,7 @@ func (p *mockBuiltinDouble) vecEvalDecimal(ctx sessionctx.Context, input *chunk. return nil } -func (p *mockBuiltinDouble) vecEvalTime(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (p *mockBuiltinDouble) vecEvalTime(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { if err := p.args[0].VecEvalTime(ctx, input, result); err != nil { return err } @@ -290,7 +290,7 @@ func (p *mockBuiltinDouble) vecEvalTime(ctx sessionctx.Context, input *chunk.Chu return nil } -func (p *mockBuiltinDouble) vecEvalDuration(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (p *mockBuiltinDouble) vecEvalDuration(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { if err := p.args[0].VecEvalDuration(ctx, input, result); err != nil { return err } @@ -301,7 +301,7 @@ func (p *mockBuiltinDouble) vecEvalDuration(ctx sessionctx.Context, input *chunk return nil } -func (p *mockBuiltinDouble) vecEvalJSON(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (p *mockBuiltinDouble) vecEvalJSON(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { var buf *chunk.Column var err error if buf, err = p.baseBuiltinFunc.bufAllocator.get(); err != nil { @@ -330,7 +330,7 @@ func (p *mockBuiltinDouble) vecEvalJSON(ctx sessionctx.Context, input *chunk.Chu return nil } -func (p *mockBuiltinDouble) evalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (p *mockBuiltinDouble) evalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { v, isNull, err := p.args[0].EvalInt(ctx, row) if err != nil { return 0, false, err @@ -338,7 +338,7 @@ func (p *mockBuiltinDouble) evalInt(ctx sessionctx.Context, row chunk.Row) (int6 return v * 2, isNull, nil } -func (p *mockBuiltinDouble) evalReal(ctx sessionctx.Context, row chunk.Row) (float64, bool, error) { +func (p *mockBuiltinDouble) evalReal(ctx EvalContext, row chunk.Row) (float64, bool, error) { v, isNull, err := p.args[0].EvalReal(ctx, row) if err != nil { return 0, false, err @@ -346,7 +346,7 @@ func (p *mockBuiltinDouble) evalReal(ctx sessionctx.Context, row chunk.Row) (flo return v * 2, isNull, nil } -func (p *mockBuiltinDouble) evalString(ctx sessionctx.Context, row chunk.Row) (string, bool, error) { +func (p *mockBuiltinDouble) evalString(ctx EvalContext, row chunk.Row) (string, bool, error) { v, isNull, err := p.args[0].EvalString(ctx, row) if err != nil { return "", false, err @@ -354,7 +354,7 @@ func (p *mockBuiltinDouble) evalString(ctx sessionctx.Context, row chunk.Row) (s return v + v, isNull, nil } -func (p *mockBuiltinDouble) evalDecimal(ctx sessionctx.Context, row chunk.Row) (*types.MyDecimal, bool, error) { +func (p *mockBuiltinDouble) evalDecimal(ctx EvalContext, row chunk.Row) (*types.MyDecimal, bool, error) { v, isNull, err := p.args[0].EvalDecimal(ctx, row) if err != nil { return nil, false, err @@ -366,7 +366,7 @@ func (p *mockBuiltinDouble) evalDecimal(ctx sessionctx.Context, row chunk.Row) ( return r, isNull, nil } -func (p *mockBuiltinDouble) evalTime(ctx sessionctx.Context, row chunk.Row) (types.Time, bool, error) { +func (p *mockBuiltinDouble) evalTime(ctx EvalContext, row chunk.Row) (types.Time, bool, error) { v, isNull, err := p.args[0].EvalTime(ctx, row) if err != nil { return types.ZeroTime, false, err @@ -379,7 +379,7 @@ func (p *mockBuiltinDouble) evalTime(ctx sessionctx.Context, row chunk.Row) (typ return v, isNull, err } -func (p *mockBuiltinDouble) evalDuration(ctx sessionctx.Context, row chunk.Row) (types.Duration, bool, error) { +func (p *mockBuiltinDouble) evalDuration(ctx EvalContext, row chunk.Row) (types.Duration, bool, error) { v, isNull, err := p.args[0].EvalDuration(ctx, row) if err != nil { return types.Duration{}, false, err @@ -388,7 +388,7 @@ func (p *mockBuiltinDouble) evalDuration(ctx sessionctx.Context, row chunk.Row) return v, isNull, err } -func (p *mockBuiltinDouble) evalJSON(ctx sessionctx.Context, row chunk.Row) (types.BinaryJSON, bool, error) { +func (p *mockBuiltinDouble) evalJSON(ctx EvalContext, row chunk.Row) (types.BinaryJSON, bool, error) { j, isNull, err := p.args[0].EvalJSON(ctx, row) if err != nil { return types.BinaryJSON{}, false, err @@ -535,7 +535,7 @@ func checkVecEval(t *testing.T, eType types.EvalType, sel []int, result *chunk.C } } -func vecEvalType(ctx sessionctx.Context, f builtinFunc, eType types.EvalType, input *chunk.Chunk, result *chunk.Column) error { +func vecEvalType(ctx EvalContext, f builtinFunc, eType types.EvalType, input *chunk.Chunk, result *chunk.Column) error { switch eType { case types.ETInt: return f.vecEvalInt(ctx, input, result) @@ -624,7 +624,7 @@ func TestDoubleVec2Row(t *testing.T) { } } -func evalRows(b *testing.B, ctx sessionctx.Context, it *chunk.Iterator4Chunk, eType types.EvalType, result *chunk.Column, rowDouble builtinFunc) { +func evalRows(b *testing.B, ctx EvalContext, it *chunk.Iterator4Chunk, eType types.EvalType, result *chunk.Column, rowDouble builtinFunc) { switch eType { case types.ETInt: for i := 0; i < b.N; i++ { @@ -775,11 +775,11 @@ func TestVectorizedCheck(t *testing.T) { ctx := mock.NewContext() vecF, _, _, _ := genMockRowDouble(ctx, types.ETInt, true) - sf := &ScalarFunction{Function: vecF, ctx: ctx} + sf := &ScalarFunction{Function: vecF} require.True(t, sf.Vectorized()) rowF, _, _, _ := genMockRowDouble(ctx, types.ETInt, false) - sf = &ScalarFunction{Function: rowF, ctx: ctx} + sf = &ScalarFunction{Function: rowF} require.False(t, sf.Vectorized()) } diff --git a/pkg/expression/chunk_executor.go b/pkg/expression/chunk_executor.go index 92f260f7e7368..d675b0aa5d7e5 100644 --- a/pkg/expression/chunk_executor.go +++ b/pkg/expression/chunk_executor.go @@ -17,9 +17,10 @@ package expression import ( "github.com/pingcap/tidb/pkg/parser/ast" "github.com/pingcap/tidb/pkg/parser/mysql" - "github.com/pingcap/tidb/pkg/sessionctx" "github.com/pingcap/tidb/pkg/types" "github.com/pingcap/tidb/pkg/util/chunk" + "github.com/pingcap/tidb/pkg/util/logutil" + "go.uber.org/zap" ) // Vectorizable checks whether a list of expressions can employ vectorized execution. @@ -104,7 +105,7 @@ func HasAssignSetVarFunc(expr Expression) bool { } // VectorizedExecute evaluates a list of expressions column by column and append their results to "output" Chunk. -func VectorizedExecute(ctx sessionctx.Context, exprs []Expression, iterator *chunk.Iterator4Chunk, output *chunk.Chunk) error { +func VectorizedExecute(ctx EvalContext, exprs []Expression, iterator *chunk.Iterator4Chunk, output *chunk.Chunk) error { for colID, expr := range exprs { err := evalOneColumn(ctx, expr, iterator, output, colID) if err != nil { @@ -114,7 +115,7 @@ func VectorizedExecute(ctx sessionctx.Context, exprs []Expression, iterator *chu return nil } -func evalOneVec(ctx sessionctx.Context, expr Expression, input *chunk.Chunk, output *chunk.Chunk, colIdx int) error { +func evalOneVec(ctx EvalContext, expr Expression, input *chunk.Chunk, output *chunk.Chunk, colIdx int) error { ft := expr.GetType() result := output.Column(colIdx) switch ft.EvalType() { @@ -179,7 +180,15 @@ func evalOneVec(ctx sessionctx.Context, expr Expression, input *chunk.Chunk, out if result.IsNull(i) { buf.AppendNull() } else { - buf.AppendEnum(types.Enum{Value: 0, Name: result.GetString(i)}) + enum, err := types.ParseEnumName(ft.GetElems(), result.GetString(i), ft.GetCollate()) + if err != nil { + logutil.BgLogger().Debug("Wrong enum name parsed during evaluation", + zap.String("The name to be parsed in the ENUM", result.GetString(i)), + zap.Strings("The valid names in the ENUM", ft.GetElems()), + zap.Error(err), + ) + } + buf.AppendEnum(enum) } } output.SetCol(colIdx, buf) @@ -191,7 +200,15 @@ func evalOneVec(ctx sessionctx.Context, expr Expression, input *chunk.Chunk, out if result.IsNull(i) { buf.AppendNull() } else { - buf.AppendSet(types.Set{Value: 0, Name: result.GetString(i)}) + set, err := types.ParseSetName(ft.GetElems(), result.GetString(i), ft.GetCollate()) + if err != nil { + logutil.BgLogger().Debug("Wrong set name parsed during evaluation", + zap.String("The name to be parsed in the SET", result.GetString(i)), + zap.Strings("The valid names in the SET", ft.GetElems()), + zap.Error(err), + ) + } + buf.AppendSet(set) } } output.SetCol(colIdx, buf) @@ -200,7 +217,7 @@ func evalOneVec(ctx sessionctx.Context, expr Expression, input *chunk.Chunk, out return nil } -func evalOneColumn(ctx sessionctx.Context, expr Expression, iterator *chunk.Iterator4Chunk, output *chunk.Chunk, colID int) (err error) { +func evalOneColumn(ctx EvalContext, expr Expression, iterator *chunk.Iterator4Chunk, output *chunk.Chunk, colID int) (err error) { switch fieldType, evalType := expr.GetType(), expr.GetType().EvalType(); evalType { case types.ETInt: for row := iterator.Begin(); err == nil && row != iterator.End(); row = iterator.Next() { @@ -234,7 +251,7 @@ func evalOneColumn(ctx sessionctx.Context, expr Expression, iterator *chunk.Iter return err } -func evalOneCell(ctx sessionctx.Context, expr Expression, row chunk.Row, output *chunk.Chunk, colID int) (err error) { +func evalOneCell(ctx EvalContext, expr Expression, row chunk.Row, output *chunk.Chunk, colID int) (err error) { switch fieldType, evalType := expr.GetType(), expr.GetType().EvalType(); evalType { case types.ETInt: err = executeToInt(ctx, expr, fieldType, row, output, colID) @@ -254,7 +271,7 @@ func evalOneCell(ctx sessionctx.Context, expr Expression, row chunk.Row, output return err } -func executeToInt(ctx sessionctx.Context, expr Expression, fieldType *types.FieldType, row chunk.Row, output *chunk.Chunk, colID int) error { +func executeToInt(ctx EvalContext, expr Expression, fieldType *types.FieldType, row chunk.Row, output *chunk.Chunk, colID int) error { res, isNull, err := expr.EvalInt(ctx, row) if err != nil { return err @@ -284,7 +301,7 @@ func executeToInt(ctx sessionctx.Context, expr Expression, fieldType *types.Fiel return nil } -func executeToReal(ctx sessionctx.Context, expr Expression, fieldType *types.FieldType, row chunk.Row, output *chunk.Chunk, colID int) error { +func executeToReal(ctx EvalContext, expr Expression, fieldType *types.FieldType, row chunk.Row, output *chunk.Chunk, colID int) error { res, isNull, err := expr.EvalReal(ctx, row) if err != nil { return err @@ -301,7 +318,7 @@ func executeToReal(ctx sessionctx.Context, expr Expression, fieldType *types.Fie return nil } -func executeToDecimal(ctx sessionctx.Context, expr Expression, fieldType *types.FieldType, row chunk.Row, output *chunk.Chunk, colID int) error { +func executeToDecimal(ctx EvalContext, expr Expression, fieldType *types.FieldType, row chunk.Row, output *chunk.Chunk, colID int) error { res, isNull, err := expr.EvalDecimal(ctx, row) if err != nil { return err @@ -314,7 +331,7 @@ func executeToDecimal(ctx sessionctx.Context, expr Expression, fieldType *types. return nil } -func executeToDatetime(ctx sessionctx.Context, expr Expression, fieldType *types.FieldType, row chunk.Row, output *chunk.Chunk, colID int) error { +func executeToDatetime(ctx EvalContext, expr Expression, fieldType *types.FieldType, row chunk.Row, output *chunk.Chunk, colID int) error { res, isNull, err := expr.EvalTime(ctx, row) if err != nil { return err @@ -327,7 +344,7 @@ func executeToDatetime(ctx sessionctx.Context, expr Expression, fieldType *types return nil } -func executeToDuration(ctx sessionctx.Context, expr Expression, fieldType *types.FieldType, row chunk.Row, output *chunk.Chunk, colID int) error { +func executeToDuration(ctx EvalContext, expr Expression, fieldType *types.FieldType, row chunk.Row, output *chunk.Chunk, colID int) error { res, isNull, err := expr.EvalDuration(ctx, row) if err != nil { return err @@ -340,7 +357,7 @@ func executeToDuration(ctx sessionctx.Context, expr Expression, fieldType *types return nil } -func executeToJSON(ctx sessionctx.Context, expr Expression, fieldType *types.FieldType, row chunk.Row, output *chunk.Chunk, colID int) error { +func executeToJSON(ctx EvalContext, expr Expression, fieldType *types.FieldType, row chunk.Row, output *chunk.Chunk, colID int) error { res, isNull, err := expr.EvalJSON(ctx, row) if err != nil { return err @@ -353,7 +370,7 @@ func executeToJSON(ctx sessionctx.Context, expr Expression, fieldType *types.Fie return nil } -func executeToString(ctx sessionctx.Context, expr Expression, fieldType *types.FieldType, row chunk.Row, output *chunk.Chunk, colID int) error { +func executeToString(ctx EvalContext, expr Expression, fieldType *types.FieldType, row chunk.Row, output *chunk.Chunk, colID int) error { res, isNull, err := expr.EvalString(ctx, row) if err != nil { return err @@ -375,7 +392,7 @@ func executeToString(ctx sessionctx.Context, expr Expression, fieldType *types.F // VectorizedFilter applies a list of filters to a Chunk and // returns a bool slice, which indicates whether a row is passed the filters. // Filters is executed vectorized. -func VectorizedFilter(ctx sessionctx.Context, filters []Expression, iterator *chunk.Iterator4Chunk, selected []bool) (_ []bool, err error) { +func VectorizedFilter(ctx EvalContext, filters []Expression, iterator *chunk.Iterator4Chunk, selected []bool) (_ []bool, err error) { selected, _, err = VectorizedFilterConsiderNull(ctx, filters, iterator, selected, nil) return selected, err } @@ -384,7 +401,7 @@ func VectorizedFilter(ctx sessionctx.Context, filters []Expression, iterator *ch // returns two bool slices, `selected` indicates whether a row passed the // filters, `isNull` indicates whether the result of the filter is null. // Filters is executed vectorized. -func VectorizedFilterConsiderNull(ctx sessionctx.Context, filters []Expression, iterator *chunk.Iterator4Chunk, selected []bool, isNull []bool) ([]bool, []bool, error) { +func VectorizedFilterConsiderNull(ctx EvalContext, filters []Expression, iterator *chunk.Iterator4Chunk, selected []bool, isNull []bool) ([]bool, []bool, error) { // canVectorized used to check whether all of the filters can be vectorized evaluated canVectorized := true for _, filter := range filters { @@ -427,7 +444,7 @@ func VectorizedFilterConsiderNull(ctx sessionctx.Context, filters []Expression, } // rowBasedFilter filters by row. -func rowBasedFilter(ctx sessionctx.Context, filters []Expression, iterator *chunk.Iterator4Chunk, selected []bool, isNull []bool) ([]bool, []bool, error) { +func rowBasedFilter(ctx EvalContext, filters []Expression, iterator *chunk.Iterator4Chunk, selected []bool, isNull []bool) ([]bool, []bool, error) { // If input.Sel() != nil, we will call input.SetSel(nil) to clear the sel slice in input chunk. // After the function finished, then we reset the sel in input chunk. // Then the caller will handle the input.sel and selected slices. @@ -485,7 +502,7 @@ func rowBasedFilter(ctx sessionctx.Context, filters []Expression, iterator *chun } // vectorizedFilter filters by vector. -func vectorizedFilter(ctx sessionctx.Context, filters []Expression, iterator *chunk.Iterator4Chunk, selected []bool, isNull []bool) ([]bool, []bool, error) { +func vectorizedFilter(ctx EvalContext, filters []Expression, iterator *chunk.Iterator4Chunk, selected []bool, isNull []bool) ([]bool, []bool, error) { selected, isNull, err := VecEvalBool(ctx, filters, iterator.GetChunk(), selected, isNull) if err != nil { return nil, nil, err diff --git a/pkg/expression/column.go b/pkg/expression/column.go index 70915747d1cd5..928ac5135c243 100644 --- a/pkg/expression/column.go +++ b/pkg/expression/column.go @@ -26,8 +26,6 @@ import ( "github.com/pingcap/tidb/pkg/parser/charset" "github.com/pingcap/tidb/pkg/parser/model" "github.com/pingcap/tidb/pkg/parser/mysql" - "github.com/pingcap/tidb/pkg/sessionctx" - "github.com/pingcap/tidb/pkg/sessionctx/stmtctx" "github.com/pingcap/tidb/pkg/types" "github.com/pingcap/tidb/pkg/util/chunk" "github.com/pingcap/tidb/pkg/util/codec" @@ -50,37 +48,37 @@ func (col *CorrelatedColumn) Clone() Expression { } // VecEvalInt evaluates this expression in a vectorized manner. -func (col *CorrelatedColumn) VecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (col *CorrelatedColumn) VecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { return genVecFromConstExpr(ctx, col, types.ETInt, input, result) } // VecEvalReal evaluates this expression in a vectorized manner. -func (col *CorrelatedColumn) VecEvalReal(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (col *CorrelatedColumn) VecEvalReal(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { return genVecFromConstExpr(ctx, col, types.ETReal, input, result) } // VecEvalString evaluates this expression in a vectorized manner. -func (col *CorrelatedColumn) VecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (col *CorrelatedColumn) VecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { return genVecFromConstExpr(ctx, col, types.ETString, input, result) } // VecEvalDecimal evaluates this expression in a vectorized manner. -func (col *CorrelatedColumn) VecEvalDecimal(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (col *CorrelatedColumn) VecEvalDecimal(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { return genVecFromConstExpr(ctx, col, types.ETDecimal, input, result) } // VecEvalTime evaluates this expression in a vectorized manner. -func (col *CorrelatedColumn) VecEvalTime(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (col *CorrelatedColumn) VecEvalTime(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { return genVecFromConstExpr(ctx, col, types.ETTimestamp, input, result) } // VecEvalDuration evaluates this expression in a vectorized manner. -func (col *CorrelatedColumn) VecEvalDuration(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (col *CorrelatedColumn) VecEvalDuration(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { return genVecFromConstExpr(ctx, col, types.ETDuration, input, result) } // VecEvalJSON evaluates this expression in a vectorized manner. -func (col *CorrelatedColumn) VecEvalJSON(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (col *CorrelatedColumn) VecEvalJSON(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { return genVecFromConstExpr(ctx, col, types.ETJson, input, result) } @@ -90,19 +88,12 @@ func (col *CorrelatedColumn) Traverse(action TraverseAction) Expression { } // Eval implements Expression interface. -func (col *CorrelatedColumn) Eval(_ sessionctx.Context, _ chunk.Row) (types.Datum, error) { - return *col.Data, nil -} - -// EvalWithInnerCtx evaluates expression with inner ctx. -// Deprecated: This function is only used during refactoring, please do not use it in new code. -// TODO: remove this method after refactoring. -func (col *CorrelatedColumn) EvalWithInnerCtx(_ chunk.Row) (types.Datum, error) { +func (col *CorrelatedColumn) Eval(_ EvalContext, _ chunk.Row) (types.Datum, error) { return *col.Data, nil } // EvalInt returns int representation of CorrelatedColumn. -func (col *CorrelatedColumn) EvalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (col *CorrelatedColumn) EvalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { if col.Data.IsNull() { return 0, true, nil } @@ -114,7 +105,7 @@ func (col *CorrelatedColumn) EvalInt(ctx sessionctx.Context, row chunk.Row) (int } // EvalReal returns real representation of CorrelatedColumn. -func (col *CorrelatedColumn) EvalReal(ctx sessionctx.Context, row chunk.Row) (float64, bool, error) { +func (col *CorrelatedColumn) EvalReal(ctx EvalContext, row chunk.Row) (float64, bool, error) { if col.Data.IsNull() { return 0, true, nil } @@ -122,7 +113,7 @@ func (col *CorrelatedColumn) EvalReal(ctx sessionctx.Context, row chunk.Row) (fl } // EvalString returns string representation of CorrelatedColumn. -func (col *CorrelatedColumn) EvalString(ctx sessionctx.Context, row chunk.Row) (string, bool, error) { +func (col *CorrelatedColumn) EvalString(ctx EvalContext, row chunk.Row) (string, bool, error) { if col.Data.IsNull() { return "", true, nil } @@ -131,7 +122,7 @@ func (col *CorrelatedColumn) EvalString(ctx sessionctx.Context, row chunk.Row) ( } // EvalDecimal returns decimal representation of CorrelatedColumn. -func (col *CorrelatedColumn) EvalDecimal(ctx sessionctx.Context, row chunk.Row) (*types.MyDecimal, bool, error) { +func (col *CorrelatedColumn) EvalDecimal(ctx EvalContext, row chunk.Row) (*types.MyDecimal, bool, error) { if col.Data.IsNull() { return nil, true, nil } @@ -139,7 +130,7 @@ func (col *CorrelatedColumn) EvalDecimal(ctx sessionctx.Context, row chunk.Row) } // EvalTime returns DATE/DATETIME/TIMESTAMP representation of CorrelatedColumn. -func (col *CorrelatedColumn) EvalTime(ctx sessionctx.Context, row chunk.Row) (types.Time, bool, error) { +func (col *CorrelatedColumn) EvalTime(ctx EvalContext, row chunk.Row) (types.Time, bool, error) { if col.Data.IsNull() { return types.ZeroTime, true, nil } @@ -147,7 +138,7 @@ func (col *CorrelatedColumn) EvalTime(ctx sessionctx.Context, row chunk.Row) (ty } // EvalDuration returns Duration representation of CorrelatedColumn. -func (col *CorrelatedColumn) EvalDuration(ctx sessionctx.Context, row chunk.Row) (types.Duration, bool, error) { +func (col *CorrelatedColumn) EvalDuration(ctx EvalContext, row chunk.Row) (types.Duration, bool, error) { if col.Data.IsNull() { return types.Duration{}, true, nil } @@ -155,7 +146,7 @@ func (col *CorrelatedColumn) EvalDuration(ctx sessionctx.Context, row chunk.Row) } // EvalJSON returns JSON representation of CorrelatedColumn. -func (col *CorrelatedColumn) EvalJSON(ctx sessionctx.Context, row chunk.Row) (types.BinaryJSON, bool, error) { +func (col *CorrelatedColumn) EvalJSON(ctx EvalContext, row chunk.Row) (types.BinaryJSON, bool, error) { if col.Data.IsNull() { return types.BinaryJSON{}, true, nil } @@ -163,7 +154,7 @@ func (col *CorrelatedColumn) EvalJSON(ctx sessionctx.Context, row chunk.Row) (ty } // Equal implements Expression interface. -func (col *CorrelatedColumn) Equal(_ sessionctx.Context, expr Expression) bool { +func (col *CorrelatedColumn) Equal(_ EvalContext, expr Expression) bool { return col.EqualColumn(expr) } @@ -180,9 +171,9 @@ func (col *CorrelatedColumn) IsCorrelated() bool { return true } -// ConstItem implements Expression interface. -func (col *CorrelatedColumn) ConstItem(_ *stmtctx.StatementContext) bool { - return false +// ConstLevel returns the const level for the expression +func (col *CorrelatedColumn) ConstLevel() ConstLevel { + return ConstNone } // Decorrelate implements Expression interface. @@ -203,11 +194,11 @@ func (col *CorrelatedColumn) resolveIndices(_ *Schema) error { } // ResolveIndicesByVirtualExpr implements Expression interface. -func (col *CorrelatedColumn) ResolveIndicesByVirtualExpr(_ sessionctx.Context, _ *Schema) (Expression, bool) { +func (col *CorrelatedColumn) ResolveIndicesByVirtualExpr(_ EvalContext, _ *Schema) (Expression, bool) { return col, true } -func (col *CorrelatedColumn) resolveIndicesByVirtualExpr(_ sessionctx.Context, _ *Schema) bool { +func (col *CorrelatedColumn) resolveIndicesByVirtualExpr(_ EvalContext, _ *Schema) bool { return true } @@ -273,7 +264,7 @@ type Column struct { } // Equal implements Expression interface. -func (col *Column) Equal(_ sessionctx.Context, expr Expression) bool { +func (col *Column) Equal(_ EvalContext, expr Expression) bool { return col.EqualColumn(expr) } @@ -286,7 +277,7 @@ func (col *Column) EqualColumn(expr Expression) bool { } // EqualByExprAndID extends Equal by comparing virual expression -func (col *Column) EqualByExprAndID(ctx sessionctx.Context, expr Expression) bool { +func (col *Column) EqualByExprAndID(ctx EvalContext, expr Expression) bool { if newCol, ok := expr.(*Column); ok { expr, isOk := col.VirtualExpr.(*ScalarFunction) isVirExprMatched := isOk && expr.Equal(ctx, newCol.VirtualExpr) && col.RetType.Equal(newCol.RetType) @@ -296,7 +287,7 @@ func (col *Column) EqualByExprAndID(ctx sessionctx.Context, expr Expression) boo } // VecEvalInt evaluates this expression in a vectorized manner. -func (col *Column) VecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (col *Column) VecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { if col.RetType.Hybrid() { it := chunk.NewIterator4Chunk(input) result.ResizeInt64(0, false) @@ -318,7 +309,7 @@ func (col *Column) VecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result } // VecEvalReal evaluates this expression in a vectorized manner. -func (col *Column) VecEvalReal(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (col *Column) VecEvalReal(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() src := input.Column(col.Index) if col.GetType().GetType() == mysql.TypeFloat { @@ -350,7 +341,7 @@ func (col *Column) VecEvalReal(ctx sessionctx.Context, input *chunk.Chunk, resul } // VecEvalString evaluates this expression in a vectorized manner. -func (col *Column) VecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (col *Column) VecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { if col.RetType.Hybrid() { it := chunk.NewIterator4Chunk(input) result.ReserveString(input.NumRows()) @@ -372,25 +363,25 @@ func (col *Column) VecEvalString(ctx sessionctx.Context, input *chunk.Chunk, res } // VecEvalDecimal evaluates this expression in a vectorized manner. -func (col *Column) VecEvalDecimal(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (col *Column) VecEvalDecimal(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { input.Column(col.Index).CopyReconstruct(input.Sel(), result) return nil } // VecEvalTime evaluates this expression in a vectorized manner. -func (col *Column) VecEvalTime(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (col *Column) VecEvalTime(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { input.Column(col.Index).CopyReconstruct(input.Sel(), result) return nil } // VecEvalDuration evaluates this expression in a vectorized manner. -func (col *Column) VecEvalDuration(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (col *Column) VecEvalDuration(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { input.Column(col.Index).CopyReconstruct(input.Sel(), result) return nil } // VecEvalJSON evaluates this expression in a vectorized manner. -func (col *Column) VecEvalJSON(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (col *Column) VecEvalJSON(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { input.Column(col.Index).CopyReconstruct(input.Sel(), result) return nil } @@ -427,19 +418,12 @@ func (col *Column) Traverse(action TraverseAction) Expression { } // Eval implements Expression interface. -func (col *Column) Eval(_ sessionctx.Context, row chunk.Row) (types.Datum, error) { - return row.GetDatum(col.Index, col.RetType), nil -} - -// EvalWithInnerCtx evaluates expression with inner ctx. -// Deprecated: This function is only used during refactoring, please do not use it in new code. -// TODO: remove this method after refactoring. -func (col *Column) EvalWithInnerCtx(row chunk.Row) (types.Datum, error) { +func (col *Column) Eval(_ EvalContext, row chunk.Row) (types.Datum, error) { return row.GetDatum(col.Index, col.RetType), nil } // EvalInt returns int representation of Column. -func (col *Column) EvalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (col *Column) EvalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { if col.GetType().Hybrid() { val := row.GetDatum(col.Index, col.RetType) if val.IsNull() { @@ -459,7 +443,7 @@ func (col *Column) EvalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, } // EvalReal returns real representation of Column. -func (col *Column) EvalReal(ctx sessionctx.Context, row chunk.Row) (float64, bool, error) { +func (col *Column) EvalReal(ctx EvalContext, row chunk.Row) (float64, bool, error) { if row.IsNull(col.Index) { return 0, true, nil } @@ -470,7 +454,7 @@ func (col *Column) EvalReal(ctx sessionctx.Context, row chunk.Row) (float64, boo } // EvalString returns string representation of Column. -func (col *Column) EvalString(ctx sessionctx.Context, row chunk.Row) (string, bool, error) { +func (col *Column) EvalString(ctx EvalContext, row chunk.Row) (string, bool, error) { if row.IsNull(col.Index) { return "", true, nil } @@ -487,7 +471,7 @@ func (col *Column) EvalString(ctx sessionctx.Context, row chunk.Row) (string, bo } // EvalDecimal returns decimal representation of Column. -func (col *Column) EvalDecimal(ctx sessionctx.Context, row chunk.Row) (*types.MyDecimal, bool, error) { +func (col *Column) EvalDecimal(ctx EvalContext, row chunk.Row) (*types.MyDecimal, bool, error) { if row.IsNull(col.Index) { return nil, true, nil } @@ -495,7 +479,7 @@ func (col *Column) EvalDecimal(ctx sessionctx.Context, row chunk.Row) (*types.My } // EvalTime returns DATE/DATETIME/TIMESTAMP representation of Column. -func (col *Column) EvalTime(ctx sessionctx.Context, row chunk.Row) (types.Time, bool, error) { +func (col *Column) EvalTime(ctx EvalContext, row chunk.Row) (types.Time, bool, error) { if row.IsNull(col.Index) { return types.ZeroTime, true, nil } @@ -503,7 +487,7 @@ func (col *Column) EvalTime(ctx sessionctx.Context, row chunk.Row) (types.Time, } // EvalDuration returns Duration representation of Column. -func (col *Column) EvalDuration(ctx sessionctx.Context, row chunk.Row) (types.Duration, bool, error) { +func (col *Column) EvalDuration(ctx EvalContext, row chunk.Row) (types.Duration, bool, error) { if row.IsNull(col.Index) { return types.Duration{}, true, nil } @@ -512,7 +496,7 @@ func (col *Column) EvalDuration(ctx sessionctx.Context, row chunk.Row) (types.Du } // EvalJSON returns JSON representation of Column. -func (col *Column) EvalJSON(ctx sessionctx.Context, row chunk.Row) (types.BinaryJSON, bool, error) { +func (col *Column) EvalJSON(ctx EvalContext, row chunk.Row) (types.BinaryJSON, bool, error) { if row.IsNull(col.Index) { return types.BinaryJSON{}, true, nil } @@ -530,9 +514,9 @@ func (col *Column) IsCorrelated() bool { return false } -// ConstItem implements Expression interface. -func (col *Column) ConstItem(_ *stmtctx.StatementContext) bool { - return false +// ConstLevel returns the const level for the expression +func (col *Column) ConstLevel() ConstLevel { + return ConstNone } // Decorrelate implements Expression interface. @@ -577,13 +561,13 @@ func (col *Column) resolveIndices(schema *Schema) error { } // ResolveIndicesByVirtualExpr implements Expression interface. -func (col *Column) ResolveIndicesByVirtualExpr(ctx sessionctx.Context, schema *Schema) (Expression, bool) { +func (col *Column) ResolveIndicesByVirtualExpr(ctx EvalContext, schema *Schema) (Expression, bool) { newCol := col.Clone() isOk := newCol.resolveIndicesByVirtualExpr(ctx, schema) return newCol, isOk } -func (col *Column) resolveIndicesByVirtualExpr(ctx sessionctx.Context, schema *Schema) bool { +func (col *Column) resolveIndicesByVirtualExpr(ctx EvalContext, schema *Schema) bool { for i, c := range schema.Columns { if c.EqualByExprAndID(ctx, col) { col.Index = i @@ -716,25 +700,10 @@ idLoop: } // EvalVirtualColumn evals the virtual column -func (col *Column) EvalVirtualColumn(ctx sessionctx.Context, row chunk.Row) (types.Datum, error) { +func (col *Column) EvalVirtualColumn(ctx EvalContext, row chunk.Row) (types.Datum, error) { return col.VirtualExpr.Eval(ctx, row) } -// SupportReverseEval checks whether the builtinFunc support reverse evaluation. -func (col *Column) SupportReverseEval() bool { - switch col.RetType.GetType() { - case mysql.TypeShort, mysql.TypeLong, mysql.TypeLonglong, - mysql.TypeFloat, mysql.TypeDouble, mysql.TypeNewDecimal: - return true - } - return false -} - -// ReverseEval evaluates the only one column value with given function result. -func (col *Column) ReverseEval(sc *stmtctx.StatementContext, res types.Datum, rType types.RoundingType) (val types.Datum, err error) { - return types.ChangeReverseResultByUpperLowerBound(sc.TypeCtx(), col.RetType, res, rType) -} - // Coercibility returns the coercibility value which is used to check collations. func (col *Column) Coercibility() Coercibility { if !col.HasCoercibility() { diff --git a/pkg/expression/column_test.go b/pkg/expression/column_test.go index 8924ce7f2120f..03fe13b879cac 100644 --- a/pkg/expression/column_test.go +++ b/pkg/expression/column_test.go @@ -47,7 +47,7 @@ func TestColumn(t *testing.T) { require.True(t, corCol.EqualColumn(corCol)) require.False(t, corCol.EqualColumn(invalidCorCol)) require.True(t, corCol.IsCorrelated()) - require.False(t, corCol.ConstItem(nil)) + require.Equal(t, ConstNone, corCol.ConstLevel()) require.True(t, col.EqualColumn(corCol.Decorrelate(schema))) require.True(t, invalidCorCol.EqualColumn(invalidCorCol.Decorrelate(schema))) diff --git a/pkg/expression/constant.go b/pkg/expression/constant.go index b260db16a920d..74dfe379acd36 100644 --- a/pkg/expression/constant.go +++ b/pkg/expression/constant.go @@ -20,7 +20,6 @@ import ( "github.com/pingcap/tidb/pkg/parser/mysql" "github.com/pingcap/tidb/pkg/sessionctx" - "github.com/pingcap/tidb/pkg/sessionctx/stmtctx" "github.com/pingcap/tidb/pkg/types" "github.com/pingcap/tidb/pkg/util/chunk" "github.com/pingcap/tidb/pkg/util/codec" @@ -166,7 +165,7 @@ func (c *Constant) GetType() *types.FieldType { } // VecEvalInt evaluates this expression in a vectorized manner. -func (c *Constant) VecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (c *Constant) VecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { if c.DeferredExpr == nil { return genVecFromConstExpr(ctx, c, types.ETInt, input, result) } @@ -174,7 +173,7 @@ func (c *Constant) VecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result } // VecEvalReal evaluates this expression in a vectorized manner. -func (c *Constant) VecEvalReal(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (c *Constant) VecEvalReal(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { if c.DeferredExpr == nil { return genVecFromConstExpr(ctx, c, types.ETReal, input, result) } @@ -182,7 +181,7 @@ func (c *Constant) VecEvalReal(ctx sessionctx.Context, input *chunk.Chunk, resul } // VecEvalString evaluates this expression in a vectorized manner. -func (c *Constant) VecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (c *Constant) VecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { if c.DeferredExpr == nil { return genVecFromConstExpr(ctx, c, types.ETString, input, result) } @@ -190,7 +189,7 @@ func (c *Constant) VecEvalString(ctx sessionctx.Context, input *chunk.Chunk, res } // VecEvalDecimal evaluates this expression in a vectorized manner. -func (c *Constant) VecEvalDecimal(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (c *Constant) VecEvalDecimal(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { if c.DeferredExpr == nil { return genVecFromConstExpr(ctx, c, types.ETDecimal, input, result) } @@ -198,7 +197,7 @@ func (c *Constant) VecEvalDecimal(ctx sessionctx.Context, input *chunk.Chunk, re } // VecEvalTime evaluates this expression in a vectorized manner. -func (c *Constant) VecEvalTime(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (c *Constant) VecEvalTime(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { if c.DeferredExpr == nil { return genVecFromConstExpr(ctx, c, types.ETTimestamp, input, result) } @@ -206,7 +205,7 @@ func (c *Constant) VecEvalTime(ctx sessionctx.Context, input *chunk.Chunk, resul } // VecEvalDuration evaluates this expression in a vectorized manner. -func (c *Constant) VecEvalDuration(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (c *Constant) VecEvalDuration(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { if c.DeferredExpr == nil { return genVecFromConstExpr(ctx, c, types.ETDuration, input, result) } @@ -214,14 +213,14 @@ func (c *Constant) VecEvalDuration(ctx sessionctx.Context, input *chunk.Chunk, r } // VecEvalJSON evaluates this expression in a vectorized manner. -func (c *Constant) VecEvalJSON(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (c *Constant) VecEvalJSON(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { if c.DeferredExpr == nil { return genVecFromConstExpr(ctx, c, types.ETJson, input, result) } return c.DeferredExpr.VecEvalJSON(ctx, input, result) } -func (c *Constant) getLazyDatum(ctx sessionctx.Context, row chunk.Row) (dt types.Datum, isLazy bool, err error) { +func (c *Constant) getLazyDatum(ctx EvalContext, row chunk.Row) (dt types.Datum, isLazy bool, err error) { if c.ParamMarker != nil { return c.ParamMarker.GetUserVar(), true, nil } else if c.DeferredExpr != nil { @@ -236,21 +235,9 @@ func (c *Constant) Traverse(action TraverseAction) Expression { return action.Transform(c) } -// EvalWithInnerCtx evaluates expression with inner ctx. -// Deprecated: This function is only used during refactoring, please do not use it in new code. -// TODO: remove this method after refactoring. -func (c *Constant) EvalWithInnerCtx(row chunk.Row) (types.Datum, error) { - var ctx sessionctx.Context - if c.DeferredExpr != nil { - if sf, sfOk := c.DeferredExpr.(*ScalarFunction); sfOk { - ctx = sf.GetCtx() - } - } - return c.Eval(ctx, row) -} - // Eval implements Expression interface. -func (c *Constant) Eval(ctx sessionctx.Context, row chunk.Row) (types.Datum, error) { +func (c *Constant) Eval(ctx EvalContext, row chunk.Row) (types.Datum, error) { + intest.AssertNotNil(ctx) if dt, lazy, err := c.getLazyDatum(ctx, row); lazy { if err != nil { return c.Value, err @@ -260,18 +247,15 @@ func (c *Constant) Eval(ctx sessionctx.Context, row chunk.Row) (types.Datum, err return c.Value, nil } if c.DeferredExpr != nil { - if _, sfOk := c.DeferredExpr.(*ScalarFunction); sfOk { - intest.AssertNotNil(ctx) - if dt.Kind() != types.KindMysqlDecimal { - val, err := dt.ConvertTo(ctx.GetSessionVars().StmtCtx.TypeCtx(), c.RetType) - if err != nil { - return dt, err - } - return val, nil - } - if err := c.adjustDecimal(dt.GetMysqlDecimal()); err != nil { + if dt.Kind() != types.KindMysqlDecimal { + val, err := dt.ConvertTo(ctx.GetSessionVars().StmtCtx.TypeCtx(), c.RetType) + if err != nil { return dt, err } + return val, nil + } + if err := c.adjustDecimal(dt.GetMysqlDecimal()); err != nil { + return dt, err } } return dt, nil @@ -280,7 +264,7 @@ func (c *Constant) Eval(ctx sessionctx.Context, row chunk.Row) (types.Datum, err } // EvalInt returns int representation of Constant. -func (c *Constant) EvalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (c *Constant) EvalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { dt, lazy, err := c.getLazyDatum(ctx, row) if err != nil { return 0, false, err @@ -304,7 +288,7 @@ func (c *Constant) EvalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, } // EvalReal returns real representation of Constant. -func (c *Constant) EvalReal(ctx sessionctx.Context, row chunk.Row) (float64, bool, error) { +func (c *Constant) EvalReal(ctx EvalContext, row chunk.Row) (float64, bool, error) { dt, lazy, err := c.getLazyDatum(ctx, row) if err != nil { return 0, false, err @@ -323,7 +307,7 @@ func (c *Constant) EvalReal(ctx sessionctx.Context, row chunk.Row) (float64, boo } // EvalString returns string representation of Constant. -func (c *Constant) EvalString(ctx sessionctx.Context, row chunk.Row) (string, bool, error) { +func (c *Constant) EvalString(ctx EvalContext, row chunk.Row) (string, bool, error) { dt, lazy, err := c.getLazyDatum(ctx, row) if err != nil { return "", false, err @@ -339,7 +323,7 @@ func (c *Constant) EvalString(ctx sessionctx.Context, row chunk.Row) (string, bo } // EvalDecimal returns decimal representation of Constant. -func (c *Constant) EvalDecimal(ctx sessionctx.Context, row chunk.Row) (*types.MyDecimal, bool, error) { +func (c *Constant) EvalDecimal(ctx EvalContext, row chunk.Row) (*types.MyDecimal, bool, error) { dt, lazy, err := c.getLazyDatum(ctx, row) if err != nil { return nil, false, err @@ -370,7 +354,7 @@ func (c *Constant) adjustDecimal(d *types.MyDecimal) error { } // EvalTime returns DATE/DATETIME/TIMESTAMP representation of Constant. -func (c *Constant) EvalTime(ctx sessionctx.Context, row chunk.Row) (val types.Time, isNull bool, err error) { +func (c *Constant) EvalTime(ctx EvalContext, row chunk.Row) (val types.Time, isNull bool, err error) { dt, lazy, err := c.getLazyDatum(ctx, row) if err != nil { return types.ZeroTime, false, err @@ -385,7 +369,7 @@ func (c *Constant) EvalTime(ctx sessionctx.Context, row chunk.Row) (val types.Ti } // EvalDuration returns Duration representation of Constant. -func (c *Constant) EvalDuration(ctx sessionctx.Context, row chunk.Row) (val types.Duration, isNull bool, err error) { +func (c *Constant) EvalDuration(ctx EvalContext, row chunk.Row) (val types.Duration, isNull bool, err error) { dt, lazy, err := c.getLazyDatum(ctx, row) if err != nil { return types.Duration{}, false, err @@ -400,7 +384,7 @@ func (c *Constant) EvalDuration(ctx sessionctx.Context, row chunk.Row) (val type } // EvalJSON returns JSON representation of Constant. -func (c *Constant) EvalJSON(ctx sessionctx.Context, row chunk.Row) (types.BinaryJSON, bool, error) { +func (c *Constant) EvalJSON(ctx EvalContext, row chunk.Row) (types.BinaryJSON, bool, error) { dt, lazy, err := c.getLazyDatum(ctx, row) if err != nil { return types.BinaryJSON{}, false, err @@ -415,7 +399,7 @@ func (c *Constant) EvalJSON(ctx sessionctx.Context, row chunk.Row) (types.Binary } // Equal implements Expression interface. -func (c *Constant) Equal(ctx sessionctx.Context, b Expression) bool { +func (c *Constant) Equal(ctx EvalContext, b Expression) bool { y, ok := b.(*Constant) if !ok { return false @@ -437,9 +421,12 @@ func (c *Constant) IsCorrelated() bool { return false } -// ConstItem implements Expression interface. -func (c *Constant) ConstItem(sc *stmtctx.StatementContext) bool { - return !sc.UseCache || (c.DeferredExpr == nil && c.ParamMarker == nil) +// ConstLevel returns the const level for the expression +func (c *Constant) ConstLevel() ConstLevel { + if c.DeferredExpr != nil || c.ParamMarker != nil { + return ConstOnlyInContext + } + return ConstStrict } // Decorrelate implements Expression interface. @@ -493,11 +480,11 @@ func (c *Constant) resolveIndices(_ *Schema) error { } // ResolveIndicesByVirtualExpr implements Expression interface. -func (c *Constant) ResolveIndicesByVirtualExpr(_ sessionctx.Context, _ *Schema) (Expression, bool) { +func (c *Constant) ResolveIndicesByVirtualExpr(_ EvalContext, _ *Schema) (Expression, bool) { return c, true } -func (c *Constant) resolveIndicesByVirtualExpr(_ sessionctx.Context, _ *Schema) bool { +func (c *Constant) resolveIndicesByVirtualExpr(_ EvalContext, _ *Schema) bool { return true } @@ -514,19 +501,6 @@ func (c *Constant) Vectorized() bool { return true } -// SupportReverseEval checks whether the builtinFunc support reverse evaluation. -func (c *Constant) SupportReverseEval() bool { - if c.DeferredExpr != nil { - return c.DeferredExpr.SupportReverseEval() - } - return true -} - -// ReverseEval evaluates the only one column value with given function result. -func (c *Constant) ReverseEval(sc *stmtctx.StatementContext, res types.Datum, rType types.RoundingType) (val types.Datum, err error) { - return c.Value, nil -} - // Coercibility returns the coercibility value which is used to check collations. func (c *Constant) Coercibility() Coercibility { if !c.HasCoercibility() { diff --git a/pkg/expression/constant_fold.go b/pkg/expression/constant_fold.go index 70bd26577d37e..fe9d5b6b95d35 100644 --- a/pkg/expression/constant_fold.go +++ b/pkg/expression/constant_fold.go @@ -17,6 +17,7 @@ package expression import ( "github.com/pingcap/tidb/pkg/parser/ast" "github.com/pingcap/tidb/pkg/parser/mysql" + "github.com/pingcap/tidb/pkg/sessionctx" "github.com/pingcap/tidb/pkg/types" "github.com/pingcap/tidb/pkg/util/chunk" "github.com/pingcap/tidb/pkg/util/logutil" @@ -24,10 +25,10 @@ import ( ) // specialFoldHandler stores functions for special UDF to constant fold -var specialFoldHandler = map[string]func(*ScalarFunction) (Expression, bool){} +var specialFoldHandler = map[string]func(sessionctx.Context, *ScalarFunction) (Expression, bool){} func init() { - specialFoldHandler = map[string]func(*ScalarFunction) (Expression, bool){ + specialFoldHandler = map[string]func(sessionctx.Context, *ScalarFunction) (Expression, bool){ ast.If: ifFoldHandler, ast.Ifnull: ifNullFoldHandler, ast.Case: caseWhenHandler, @@ -36,8 +37,8 @@ func init() { } // FoldConstant does constant folding optimization on an expression excluding deferred ones. -func FoldConstant(expr Expression) Expression { - e, _ := foldConstant(expr) +func FoldConstant(ctx sessionctx.Context, expr Expression) Expression { + e, _ := foldConstant(ctx, expr) // keep the original coercibility, charset, collation and repertoire values after folding e.SetCoercibility(expr.Coercibility()) @@ -48,16 +49,16 @@ func FoldConstant(expr Expression) Expression { return e } -func isNullHandler(expr *ScalarFunction) (Expression, bool) { +func isNullHandler(ctx sessionctx.Context, expr *ScalarFunction) (Expression, bool) { arg0 := expr.GetArgs()[0] if constArg, isConst := arg0.(*Constant); isConst { isDeferredConst := constArg.DeferredExpr != nil || constArg.ParamMarker != nil - value, err := expr.EvalWithInnerCtx(chunk.Row{}) + value, err := expr.Eval(ctx, chunk.Row{}) if err != nil { // Failed to fold this expr to a constant, print the DEBUG log and // return the original expression to let the error to be evaluated // again, in that time, the error is returned to the client. - logutil.BgLogger().Debug("fold expression to constant", zap.String("expression", expr.ExplainInfo()), zap.Error(err)) + logutil.BgLogger().Debug("fold expression to constant", zap.String("expression", expr.ExplainInfo(ctx)), zap.Error(err)) return expr, isDeferredConst } if isDeferredConst { @@ -71,36 +72,36 @@ func isNullHandler(expr *ScalarFunction) (Expression, bool) { return expr, false } -func ifFoldHandler(expr *ScalarFunction) (Expression, bool) { +func ifFoldHandler(ctx sessionctx.Context, expr *ScalarFunction) (Expression, bool) { args := expr.GetArgs() - foldedArg0, _ := foldConstant(args[0]) + foldedArg0, _ := foldConstant(ctx, args[0]) if constArg, isConst := foldedArg0.(*Constant); isConst { - arg0, isNull0, err := constArg.EvalInt(expr.GetCtx(), chunk.Row{}) + arg0, isNull0, err := constArg.EvalInt(ctx, chunk.Row{}) if err != nil { // Failed to fold this expr to a constant, print the DEBUG log and // return the original expression to let the error to be evaluated // again, in that time, the error is returned to the client. - logutil.BgLogger().Debug("fold expression to constant", zap.String("expression", expr.ExplainInfo()), zap.Error(err)) + logutil.BgLogger().Debug("fold expression to constant", zap.String("expression", expr.ExplainInfo(ctx)), zap.Error(err)) return expr, false } if !isNull0 && arg0 != 0 { - return foldConstant(args[1]) + return foldConstant(ctx, args[1]) } - return foldConstant(args[2]) + return foldConstant(ctx, args[2]) } // if the condition is not const, which branch is unknown to run, so directly return. return expr, false } -func ifNullFoldHandler(expr *ScalarFunction) (Expression, bool) { +func ifNullFoldHandler(ctx sessionctx.Context, expr *ScalarFunction) (Expression, bool) { args := expr.GetArgs() - foldedArg0, isDeferred := foldConstant(args[0]) + foldedArg0, isDeferred := foldConstant(ctx, args[0]) if constArg, isConst := foldedArg0.(*Constant); isConst { // Only check constArg.Value here. Because deferred expression is // evaluated to constArg.Value after foldConstant(args[0]), it's not // needed to be checked. if constArg.Value.IsNull() { - return foldConstant(args[1]) + return foldConstant(ctx, args[1]) } return constArg, isDeferred } @@ -108,11 +109,11 @@ func ifNullFoldHandler(expr *ScalarFunction) (Expression, bool) { return expr, false } -func caseWhenHandler(expr *ScalarFunction) (Expression, bool) { +func caseWhenHandler(ctx sessionctx.Context, expr *ScalarFunction) (Expression, bool) { args, l := expr.GetArgs(), len(expr.GetArgs()) var isDeferred, isDeferredConst bool for i := 0; i < l-1; i += 2 { - expr.GetArgs()[i], isDeferred = foldConstant(args[i]) + expr.GetArgs()[i], isDeferred = foldConstant(ctx, args[i]) isDeferredConst = isDeferredConst || isDeferred if _, isConst := expr.GetArgs()[i].(*Constant); !isConst { // for no-const, here should return directly, because the following branches are unknown to be run or not @@ -121,12 +122,12 @@ func caseWhenHandler(expr *ScalarFunction) (Expression, bool) { // If the condition is const and true, and the previous conditions // has no expr, then the folded execution body is returned, otherwise // the arguments of the casewhen are folded and replaced. - val, isNull, err := args[i].EvalInt(expr.GetCtx(), chunk.Row{}) + val, isNull, err := args[i].EvalInt(ctx, chunk.Row{}) if err != nil { return expr, false } if val != 0 && !isNull { - foldedExpr, isDeferred := foldConstant(args[i+1]) + foldedExpr, isDeferred := foldConstant(ctx, args[i+1]) isDeferredConst = isDeferredConst || isDeferred if _, isConst := foldedExpr.(*Constant); isConst { foldedExpr.GetType().SetDecimal(expr.GetType().GetDecimal()) @@ -139,7 +140,7 @@ func caseWhenHandler(expr *ScalarFunction) (Expression, bool) { // is false, then the folded else execution body is returned. otherwise // the execution body of the else are folded and replaced. if l%2 == 1 { - foldedExpr, isDeferred := foldConstant(args[l-1]) + foldedExpr, isDeferred := foldConstant(ctx, args[l-1]) isDeferredConst = isDeferredConst || isDeferred if _, isConst := foldedExpr.(*Constant); isConst { foldedExpr.GetType().SetDecimal(expr.GetType().GetDecimal()) @@ -150,18 +151,18 @@ func caseWhenHandler(expr *ScalarFunction) (Expression, bool) { return expr, isDeferredConst } -func foldConstant(expr Expression) (Expression, bool) { +func foldConstant(ctx sessionctx.Context, expr Expression) (Expression, bool) { switch x := expr.(type) { case *ScalarFunction: if _, ok := unFoldableFunctions[x.FuncName.L]; ok { return expr, false } - if function := specialFoldHandler[x.FuncName.L]; function != nil && !MaybeOverOptimized4PlanCache(x.GetCtx(), []Expression{expr}) { - return function(x) + if function := specialFoldHandler[x.FuncName.L]; function != nil && !MaybeOverOptimized4PlanCache(ctx, []Expression{expr}) { + return function(ctx, x) } args := x.GetArgs() - sc := x.GetCtx().GetSessionVars().StmtCtx + sc := ctx.GetSessionVars().StmtCtx argIsConst := make([]bool, len(args)) hasNullArg := false allConstArg := true @@ -193,11 +194,11 @@ func foldConstant(expr Expression) (Expression, bool) { constArgs[i] = NewOne() } } - dummyScalarFunc, err := NewFunctionBase(x.GetCtx(), x.FuncName.L, x.GetType(), constArgs...) + dummyScalarFunc, err := NewFunctionBase(ctx, x.FuncName.L, x.GetType(), constArgs...) if err != nil { return expr, isDeferredConst } - value, err := dummyScalarFunc.EvalWithInnerCtx(chunk.Row{}) + value, err := dummyScalarFunc.Eval(ctx, chunk.Row{}) if err != nil { return expr, isDeferredConst } @@ -217,7 +218,7 @@ func foldConstant(expr Expression) (Expression, bool) { } return expr, isDeferredConst } - value, err := x.EvalWithInnerCtx(chunk.Row{}) + value, err := x.Eval(ctx, chunk.Row{}) retType := x.RetType.Clone() if !hasNullArg { // set right not null flag for constant value @@ -229,7 +230,7 @@ func foldConstant(expr Expression) (Expression, bool) { } } if err != nil { - logutil.BgLogger().Debug("fold expression to constant", zap.String("expression", x.ExplainInfo()), zap.Error(err)) + logutil.BgLogger().Debug("fold expression to constant", zap.String("expression", x.ExplainInfo(ctx)), zap.Error(err)) return expr, isDeferredConst } if isDeferredConst { @@ -245,9 +246,9 @@ func foldConstant(expr Expression) (Expression, bool) { ParamMarker: x.ParamMarker, }, true } else if x.DeferredExpr != nil { - value, err := x.DeferredExpr.EvalWithInnerCtx(chunk.Row{}) + value, err := x.DeferredExpr.Eval(ctx, chunk.Row{}) if err != nil { - logutil.BgLogger().Debug("fold expression to constant", zap.String("expression", x.ExplainInfo()), zap.Error(err)) + logutil.BgLogger().Debug("fold expression to constant", zap.String("expression", x.ExplainInfo(ctx)), zap.Error(err)) return expr, true } return &Constant{Value: value, RetType: x.RetType, DeferredExpr: x.DeferredExpr}, true diff --git a/pkg/expression/constant_propagation.go b/pkg/expression/constant_propagation.go index c69b2d3867717..5898b2b76b4a0 100644 --- a/pkg/expression/constant_propagation.go +++ b/pkg/expression/constant_propagation.go @@ -56,7 +56,7 @@ func (s *basePropConstSolver) insertCol(col *Column) { // tryToUpdateEQList tries to update the eqList. When the eqList has store this column with a different constant, like // a = 1 and a = 2, we set the second return value to false. func (s *basePropConstSolver) tryToUpdateEQList(col *Column, con *Constant) (bool, bool) { - if con.ConstItem(s.ctx.GetSessionVars().StmtCtx) && con.Value.IsNull() { + if con.Value.IsNull() && ConstExprConsiderPlanCache(con, s.ctx.GetSessionVars().StmtCtx.UseCache) { return false, true } id := s.getColID(col) @@ -212,7 +212,7 @@ func (s *propConstSolver) propagateConstantEQ() { } for i, cond := range s.conditions { if !visited[i] { - s.conditions[i] = ColumnSubstitute(cond, NewSchema(cols...), cons) + s.conditions[i] = ColumnSubstitute(s.ctx, cond, NewSchema(cols...), cons) } } } @@ -388,6 +388,52 @@ func (s *propOuterJoinConstSolver) setConds2ConstFalse(filterConds bool) { } } +func (s *basePropConstSolver) dealWithPossibleHybridType(col *Column, con *Constant) (*Constant, bool) { + if !col.GetType().Hybrid() { + return con, true + } + if col.GetType().GetType() == mysql.TypeEnum { + d, err := con.Eval(s.ctx, chunk.Row{}) + if err != nil { + return nil, false + } + if MaybeOverOptimized4PlanCache(s.ctx, []Expression{con}) { + s.ctx.GetSessionVars().StmtCtx.SetSkipPlanCache(errors.New("Skip plan cache since mutable constant is restored and propagated")) + } + switch d.Kind() { + case types.KindInt64: + enum, err := types.ParseEnumValue(col.GetType().GetElems(), uint64(d.GetInt64())) + if err != nil { + logutil.BgLogger().Debug("Invalid Enum parsed during constant propagation") + return nil, false + } + con = &Constant{ + Value: types.NewMysqlEnumDatum(enum), + RetType: col.RetType.Clone(), + collationInfo: col.collationInfo, + } + case types.KindString: + enum, err := types.ParseEnumName(col.GetType().GetElems(), d.GetString(), d.Collation()) + if err != nil { + logutil.BgLogger().Debug("Invalid Enum parsed during constant propagation") + return nil, false + } + con = &Constant{ + Value: types.NewMysqlEnumDatum(enum), + RetType: col.RetType.Clone(), + collationInfo: col.collationInfo, + } + case types.KindMysqlEnum, types.KindMysqlSet: + // It's already a hybrid type. Just use it. + default: + // We skip other cases first. + return nil, false + } + return con, true + } + return nil, false +} + // pickEQCondsOnOuterCol picks constant equal expression from specified conditions. func (s *propOuterJoinConstSolver) pickEQCondsOnOuterCol(retMapper map[int]*Constant, visited []bool, filterConds bool) map[int]*Constant { var conds []Expression @@ -422,6 +468,11 @@ func (s *propOuterJoinConstSolver) pickEQCondsOnOuterCol(retMapper map[int]*Cons } continue } + var valid bool + con, valid = s.dealWithPossibleHybridType(col, con) + if !valid { + continue + } // Only extract `outerCol = const` expressions. if !s.outerSchema.Contains(col) { continue @@ -470,7 +521,7 @@ func (s *propOuterJoinConstSolver) propagateConstantEQ() { } for i, cond := range s.joinConds { if !visited[i+lenFilters] { - s.joinConds[i] = ColumnSubstitute(cond, NewSchema(cols...), cons) + s.joinConds[i] = ColumnSubstitute(s.ctx, cond, NewSchema(cols...), cons) } } } diff --git a/pkg/expression/constant_test.go b/pkg/expression/constant_test.go index e3cee448792c3..9dc8f2f9aede9 100644 --- a/pkg/expression/constant_test.go +++ b/pkg/expression/constant_test.go @@ -23,6 +23,7 @@ import ( "github.com/pingcap/tidb/pkg/parser/ast" "github.com/pingcap/tidb/pkg/parser/mysql" + "github.com/pingcap/tidb/pkg/sessionctx" "github.com/pingcap/tidb/pkg/types" "github.com/pingcap/tidb/pkg/util/chunk" "github.com/pingcap/tidb/pkg/util/mock" @@ -54,12 +55,16 @@ func newString(value string, collation string) *Constant { } } -func newFunction(funcName string, args ...Expression) Expression { - return newFunctionWithType(funcName, types.NewFieldType(mysql.TypeLonglong), args...) +func newFunctionWithMockCtx(funcName string, args ...Expression) Expression { + return newFunction(mock.NewContext(), funcName, args...) } -func newFunctionWithType(funcName string, tp *types.FieldType, args ...Expression) Expression { - return NewFunctionInternal(mock.NewContext(), funcName, tp, args...) +func newFunction(ctx sessionctx.Context, funcName string, args ...Expression) Expression { + return newFunctionWithType(ctx, funcName, types.NewFieldType(mysql.TypeLonglong), args...) +} + +func newFunctionWithType(ctx sessionctx.Context, funcName string, tp *types.FieldType, args ...Expression) Expression { + return NewFunctionInternal(ctx, funcName, tp, args...) } func TestConstantPropagation(t *testing.T) { @@ -71,59 +76,59 @@ func TestConstantPropagation(t *testing.T) { { solver: []PropagateConstantSolver{newPropConstSolver()}, conditions: []Expression{ - newFunction(ast.EQ, newColumn(0), newColumn(1)), - newFunction(ast.EQ, newColumn(1), newColumn(2)), - newFunction(ast.EQ, newColumn(2), newColumn(3)), - newFunction(ast.EQ, newColumn(3), newLonglong(1)), - newFunction(ast.LogicOr, newLonglong(1), newColumn(0)), + newFunctionWithMockCtx(ast.EQ, newColumn(0), newColumn(1)), + newFunctionWithMockCtx(ast.EQ, newColumn(1), newColumn(2)), + newFunctionWithMockCtx(ast.EQ, newColumn(2), newColumn(3)), + newFunctionWithMockCtx(ast.EQ, newColumn(3), newLonglong(1)), + newFunctionWithMockCtx(ast.LogicOr, newLonglong(1), newColumn(0)), }, result: "1, eq(Column#0, 1), eq(Column#1, 1), eq(Column#2, 1), eq(Column#3, 1)", }, { solver: []PropagateConstantSolver{newPropConstSolver()}, conditions: []Expression{ - newFunction(ast.EQ, newColumn(0), newColumn(1)), - newFunction(ast.EQ, newColumn(1), newLonglong(1)), - newFunction(ast.NE, newColumn(2), newLonglong(2)), + newFunctionWithMockCtx(ast.EQ, newColumn(0), newColumn(1)), + newFunctionWithMockCtx(ast.EQ, newColumn(1), newLonglong(1)), + newFunctionWithMockCtx(ast.NE, newColumn(2), newLonglong(2)), }, result: "eq(Column#0, 1), eq(Column#1, 1), ne(Column#2, 2)", }, { solver: []PropagateConstantSolver{newPropConstSolver()}, conditions: []Expression{ - newFunction(ast.EQ, newColumn(0), newColumn(1)), - newFunction(ast.EQ, newColumn(1), newLonglong(1)), - newFunction(ast.EQ, newColumn(2), newColumn(3)), - newFunction(ast.GE, newColumn(2), newLonglong(2)), - newFunction(ast.NE, newColumn(2), newLonglong(4)), - newFunction(ast.NE, newColumn(3), newLonglong(5)), + newFunctionWithMockCtx(ast.EQ, newColumn(0), newColumn(1)), + newFunctionWithMockCtx(ast.EQ, newColumn(1), newLonglong(1)), + newFunctionWithMockCtx(ast.EQ, newColumn(2), newColumn(3)), + newFunctionWithMockCtx(ast.GE, newColumn(2), newLonglong(2)), + newFunctionWithMockCtx(ast.NE, newColumn(2), newLonglong(4)), + newFunctionWithMockCtx(ast.NE, newColumn(3), newLonglong(5)), }, result: "eq(Column#0, 1), eq(Column#1, 1), eq(Column#2, Column#3), ge(Column#2, 2), ge(Column#3, 2), ne(Column#2, 4), ne(Column#2, 5), ne(Column#3, 4), ne(Column#3, 5)", }, { solver: []PropagateConstantSolver{newPropConstSolver()}, conditions: []Expression{ - newFunction(ast.EQ, newColumn(0), newColumn(1)), - newFunction(ast.EQ, newColumn(0), newColumn(2)), - newFunction(ast.GE, newColumn(1), newLonglong(0)), + newFunctionWithMockCtx(ast.EQ, newColumn(0), newColumn(1)), + newFunctionWithMockCtx(ast.EQ, newColumn(0), newColumn(2)), + newFunctionWithMockCtx(ast.GE, newColumn(1), newLonglong(0)), }, result: "eq(Column#0, Column#1), eq(Column#0, Column#2), ge(Column#0, 0), ge(Column#1, 0), ge(Column#2, 0)", }, { solver: []PropagateConstantSolver{newPropConstSolver()}, conditions: []Expression{ - newFunction(ast.EQ, newColumn(0), newColumn(1)), - newFunction(ast.GT, newColumn(0), newLonglong(2)), - newFunction(ast.GT, newColumn(1), newLonglong(3)), - newFunction(ast.LT, newColumn(0), newLonglong(1)), - newFunction(ast.GT, newLonglong(2), newColumn(1)), + newFunctionWithMockCtx(ast.EQ, newColumn(0), newColumn(1)), + newFunctionWithMockCtx(ast.GT, newColumn(0), newLonglong(2)), + newFunctionWithMockCtx(ast.GT, newColumn(1), newLonglong(3)), + newFunctionWithMockCtx(ast.LT, newColumn(0), newLonglong(1)), + newFunctionWithMockCtx(ast.GT, newLonglong(2), newColumn(1)), }, result: "eq(Column#0, Column#1), gt(2, Column#0), gt(2, Column#1), gt(Column#0, 2), gt(Column#0, 3), gt(Column#1, 2), gt(Column#1, 3), lt(Column#0, 1), lt(Column#1, 1)", }, { solver: []PropagateConstantSolver{newPropConstSolver()}, conditions: []Expression{ - newFunction(ast.EQ, newLonglong(1), newColumn(0)), + newFunctionWithMockCtx(ast.EQ, newLonglong(1), newColumn(0)), newLonglong(0), }, result: "0", @@ -131,41 +136,41 @@ func TestConstantPropagation(t *testing.T) { { solver: []PropagateConstantSolver{newPropConstSolver()}, conditions: []Expression{ - newFunction(ast.EQ, newColumn(0), newColumn(1)), - newFunction(ast.In, newColumn(0), newLonglong(1), newLonglong(2)), - newFunction(ast.In, newColumn(1), newLonglong(3), newLonglong(4)), + newFunctionWithMockCtx(ast.EQ, newColumn(0), newColumn(1)), + newFunctionWithMockCtx(ast.In, newColumn(0), newLonglong(1), newLonglong(2)), + newFunctionWithMockCtx(ast.In, newColumn(1), newLonglong(3), newLonglong(4)), }, result: "eq(Column#0, Column#1), in(Column#0, 1, 2), in(Column#0, 3, 4), in(Column#1, 1, 2), in(Column#1, 3, 4)", }, { solver: []PropagateConstantSolver{newPropConstSolver()}, conditions: []Expression{ - newFunction(ast.EQ, newColumn(0), newColumn(1)), - newFunction(ast.EQ, newColumn(0), newFunction(ast.BitLength, newColumn(2))), + newFunctionWithMockCtx(ast.EQ, newColumn(0), newColumn(1)), + newFunctionWithMockCtx(ast.EQ, newColumn(0), newFunctionWithMockCtx(ast.BitLength, newColumn(2))), }, result: "eq(Column#0, Column#1), eq(Column#0, bit_length(cast(Column#2, var_string(20)))), eq(Column#1, bit_length(cast(Column#2, var_string(20))))", }, { solver: []PropagateConstantSolver{newPropConstSolver()}, conditions: []Expression{ - newFunction(ast.EQ, newColumn(0), newColumn(1)), - newFunction(ast.LE, newFunction(ast.Mul, newColumn(0), newColumn(0)), newLonglong(50)), + newFunctionWithMockCtx(ast.EQ, newColumn(0), newColumn(1)), + newFunctionWithMockCtx(ast.LE, newFunctionWithMockCtx(ast.Mul, newColumn(0), newColumn(0)), newLonglong(50)), }, result: "eq(Column#0, Column#1), le(mul(Column#0, Column#0), 50), le(mul(Column#1, Column#1), 50)", }, { solver: []PropagateConstantSolver{newPropConstSolver()}, conditions: []Expression{ - newFunction(ast.EQ, newColumn(0), newColumn(1)), - newFunction(ast.LE, newColumn(0), newFunction(ast.Plus, newColumn(1), newLonglong(1))), + newFunctionWithMockCtx(ast.EQ, newColumn(0), newColumn(1)), + newFunctionWithMockCtx(ast.LE, newColumn(0), newFunctionWithMockCtx(ast.Plus, newColumn(1), newLonglong(1))), }, result: "eq(Column#0, Column#1), le(Column#0, plus(Column#0, 1)), le(Column#0, plus(Column#1, 1)), le(Column#1, plus(Column#1, 1))", }, { solver: []PropagateConstantSolver{newPropConstSolver()}, conditions: []Expression{ - newFunction(ast.EQ, newColumn(0), newColumn(1)), - newFunction(ast.LE, newColumn(0), newFunction(ast.Rand)), + newFunctionWithMockCtx(ast.EQ, newColumn(0), newColumn(1)), + newFunctionWithMockCtx(ast.LE, newColumn(0), newFunctionWithMockCtx(ast.Rand)), }, result: "eq(Column#0, Column#1), le(cast(Column#0, double BINARY), rand())", }, @@ -175,7 +180,7 @@ func TestConstantPropagation(t *testing.T) { ctx := mock.NewContext() conds := make([]Expression, 0, len(tt.conditions)) for _, cd := range tt.conditions { - conds = append(conds, FoldConstant(cd)) + conds = append(conds, FoldConstant(ctx, cd)) } newConds := solver.PropagateConstant(ctx, conds) var result []string @@ -190,75 +195,93 @@ func TestConstantPropagation(t *testing.T) { func TestConstantFolding(t *testing.T) { tests := []struct { - condition Expression + condition func(ctx sessionctx.Context) Expression result string }{ { - condition: newFunction(ast.LT, newColumn(0), newFunction(ast.Plus, newLonglong(1), newLonglong(2))), - result: "lt(Column#0, 3)", + condition: func(ctx sessionctx.Context) Expression { + return newFunction(ctx, ast.LT, newColumn(0), newFunction(ctx, ast.Plus, newLonglong(1), newLonglong(2))) + }, + result: "lt(Column#0, 3)", }, { - condition: newFunction(ast.LT, newColumn(0), newFunction(ast.Greatest, newLonglong(1), newLonglong(2))), - result: "lt(Column#0, 2)", + condition: func(ctx sessionctx.Context) Expression { + return newFunction(ctx, ast.LT, newColumn(0), newFunction(ctx, ast.Greatest, newLonglong(1), newLonglong(2))) + }, + result: "lt(Column#0, 2)", }, { - condition: newFunction(ast.EQ, newColumn(0), newFunction(ast.Rand)), - result: "eq(cast(Column#0, double BINARY), rand())", + condition: func(ctx sessionctx.Context) Expression { + return newFunction(ctx, ast.EQ, newColumn(0), newFunction(ctx, ast.Rand)) + }, + result: "eq(cast(Column#0, double BINARY), rand())", }, { - condition: newFunction(ast.IsNull, newLonglong(1)), - result: "0", + condition: func(ctx sessionctx.Context) Expression { + return newFunction(ctx, ast.IsNull, newLonglong(1)) + }, + result: "0", }, { - condition: newFunction(ast.EQ, newColumn(0), newFunction(ast.UnaryNot, newFunction(ast.Plus, newLonglong(1), newLonglong(1)))), - result: "eq(Column#0, 0)", + condition: func(ctx sessionctx.Context) Expression { + return newFunction(ctx, ast.EQ, newColumn(0), newFunction(ctx, ast.UnaryNot, newFunctionWithMockCtx(ast.Plus, newLonglong(1), newLonglong(1)))) + }, + result: "eq(Column#0, 0)", }, { - condition: newFunction(ast.LT, newColumn(0), newFunction(ast.Plus, newColumn(1), newFunction(ast.Plus, newLonglong(2), newLonglong(1)))), - result: "lt(Column#0, plus(Column#1, 3))", + condition: func(ctx sessionctx.Context) Expression { + return newFunction(ctx, ast.LT, newColumn(0), newFunction(ctx, ast.Plus, newColumn(1), newFunctionWithMockCtx(ast.Plus, newLonglong(2), newLonglong(1)))) + }, + result: "lt(Column#0, plus(Column#1, 3))", }, { - condition: func() Expression { - expr := newFunction(ast.ConcatWS, newColumn(0), NewNull()) - function := expr.(*ScalarFunction) - function.GetCtx().GetSessionVars().StmtCtx.InNullRejectCheck = true - return function - }(), + condition: func(ctx sessionctx.Context) Expression { + expr := newFunction(ctx, ast.ConcatWS, newColumn(0), NewNull()) + ctx.GetSessionVars().StmtCtx.InNullRejectCheck = true + return expr + }, result: "concat_ws(cast(Column#0, var_string(20)), )", }, } for _, tt := range tests { - newConds := FoldConstant(tt.condition) + ctx := mock.NewContext() + expr := tt.condition(ctx) + newConds := FoldConstant(ctx, expr) require.Equalf(t, tt.result, newConds.String(), "different for expr %s", tt.condition) } } func TestConstantFoldingCharsetConvert(t *testing.T) { + ctx := mock.NewContext() tests := []struct { condition Expression result string }{ { - condition: newFunction(ast.Length, newFunctionWithType( + condition: newFunction(ctx, ast.Length, newFunctionWithType( + ctx, InternalFuncToBinary, types.NewFieldType(mysql.TypeVarchar), newString("中文", "gbk_bin"))), result: "4", }, { - condition: newFunction(ast.Length, newFunctionWithType( + condition: newFunction(ctx, ast.Length, newFunctionWithType( + ctx, InternalFuncToBinary, types.NewFieldType(mysql.TypeVarchar), newString("中文", "utf8mb4_bin"))), result: "6", }, { - condition: newFunction(ast.Concat, newFunctionWithType( + condition: newFunction(ctx, ast.Concat, newFunctionWithType( + ctx, InternalFuncFromBinary, types.NewFieldType(mysql.TypeVarchar), newString("中文", "binary"))), result: "中文", }, { - condition: newFunction(ast.Concat, + condition: newFunction(ctx, ast.Concat, newFunctionWithType( + ctx, InternalFuncFromBinary, types.NewFieldTypeWithCollation(mysql.TypeVarchar, "gbk_bin", -1), newString("\xd2\xbb", "binary")), newString("中文", "gbk_bin"), @@ -266,9 +289,10 @@ func TestConstantFoldingCharsetConvert(t *testing.T) { result: "一中文", }, { - condition: newFunction(ast.Concat, + condition: newFunction(ctx, ast.Concat, newString("中文", "gbk_bin"), newFunctionWithType( + ctx, InternalFuncFromBinary, types.NewFieldTypeWithCollation(mysql.TypeVarchar, "gbk_bin", -1), newString("\xd2\xbb", "binary")), ), @@ -276,7 +300,7 @@ func TestConstantFoldingCharsetConvert(t *testing.T) { }, // The result is binary charset, so gbk constant will convert to binary which is \xd6\xd0\xce\xc4. { - condition: newFunction(ast.Concat, + condition: newFunction(ctx, ast.Concat, newString("中文", "gbk_bin"), newString("\xd2\xbb", "binary"), ), @@ -284,7 +308,7 @@ func TestConstantFoldingCharsetConvert(t *testing.T) { }, } for _, tt := range tests { - newConds := FoldConstant(tt.condition) + newConds := FoldConstant(ctx, tt.condition) require.Equalf(t, tt.result, newConds.String(), "different for expr %s", tt.condition) } } diff --git a/pkg/expression/context.go b/pkg/expression/context.go new file mode 100644 index 0000000000000..22450c390aa43 --- /dev/null +++ b/pkg/expression/context.go @@ -0,0 +1,47 @@ +// Copyright 2023 PingCAP, 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. + +package expression + +import ( + "fmt" + + "github.com/pingcap/tidb/pkg/kv" + "github.com/pingcap/tidb/pkg/sessionctx" + "github.com/pingcap/tidb/pkg/sessionctx/variable" +) + +// EvalContext is used to evaluate an expression +type EvalContext interface { + // GetSessionVars gets the session variables. + GetSessionVars() *variable.SessionVars + // Value returns the value associated with this context for key. + Value(key fmt.Stringer) interface{} + // IsDDLOwner checks whether this session is DDL owner. + IsDDLOwner() bool + // GetAdvisoryLock acquires an advisory lock (aka GET_LOCK()). + GetAdvisoryLock(string, int64) error + // IsUsedAdvisoryLock checks for existing locks (aka IS_USED_LOCK()). + IsUsedAdvisoryLock(string) uint64 + // ReleaseAdvisoryLock releases an advisory lock (aka RELEASE_LOCK()). + ReleaseAdvisoryLock(string) bool + // ReleaseAllAdvisoryLocks releases all advisory locks that this session holds. + ReleaseAllAdvisoryLocks() int + // GetStore returns the store of session. + GetStore() kv.Storage + // GetInfoSchema returns the current infoschema + GetInfoSchema() sessionctx.InfoschemaMetaVersion + // GetDomainInfoSchema returns the latest information schema in domain + GetDomainInfoSchema() sessionctx.InfoschemaMetaVersion +} diff --git a/pkg/expression/distsql_builtin.go b/pkg/expression/distsql_builtin.go index acde4d514c403..3022b506c51d2 100644 --- a/pkg/expression/distsql_builtin.go +++ b/pkg/expression/distsql_builtin.go @@ -17,19 +17,16 @@ package expression import ( "fmt" "strconv" - "sync" "time" "github.com/pingcap/errors" "github.com/pingcap/tidb/pkg/parser/model" "github.com/pingcap/tidb/pkg/parser/mysql" "github.com/pingcap/tidb/pkg/sessionctx" - "github.com/pingcap/tidb/pkg/sessionctx/stmtctx" "github.com/pingcap/tidb/pkg/sessionctx/variable" "github.com/pingcap/tidb/pkg/types" "github.com/pingcap/tidb/pkg/util/codec" "github.com/pingcap/tidb/pkg/util/collate" - "github.com/pingcap/tidb/pkg/util/mock" "github.com/pingcap/tipb/go-tipb" ) @@ -43,7 +40,7 @@ func PbTypeToFieldType(tp *tipb.FieldType) *types.FieldType { func getSignatureByPB(ctx sessionctx.Context, sigCode tipb.ScalarFuncSig, tp *tipb.FieldType, args []Expression) (f builtinFunc, e error) { fieldTp := PbTypeToFieldType(tp) - base, err := newBaseBuiltinFuncWithFieldType(ctx, fieldTp, args) + base, err := newBaseBuiltinFuncWithFieldType(fieldTp, args) if err != nil { return nil, err } @@ -661,21 +658,21 @@ func getSignatureByPB(ctx sessionctx.Context, sigCode tipb.ScalarFuncSig, tp *ti case tipb.ScalarFuncSig_UUID: f = &builtinUUIDSig{base} case tipb.ScalarFuncSig_LikeSig: - f = &builtinLikeSig{base, nil, false, sync.Once{}} + f = &builtinLikeSig{baseBuiltinFunc: base} case tipb.ScalarFuncSig_IlikeSig: - f = &builtinIlikeSig{base, nil, false, sync.Once{}} + f = &builtinIlikeSig{baseBuiltinFunc: base} case tipb.ScalarFuncSig_RegexpSig: - f = &builtinRegexpLikeFuncSig{regexpBaseFuncSig{base, regexpMemorizedSig{nil, nil}, sync.Once{}}} + f = &builtinRegexpLikeFuncSig{regexpBaseFuncSig{baseBuiltinFunc: base}} case tipb.ScalarFuncSig_RegexpUTF8Sig: - f = &builtinRegexpLikeFuncSig{regexpBaseFuncSig{base, regexpMemorizedSig{nil, nil}, sync.Once{}}} + f = &builtinRegexpLikeFuncSig{regexpBaseFuncSig{baseBuiltinFunc: base}} case tipb.ScalarFuncSig_RegexpLikeSig: - f = &builtinRegexpLikeFuncSig{regexpBaseFuncSig{base, regexpMemorizedSig{nil, nil}, sync.Once{}}} + f = &builtinRegexpLikeFuncSig{regexpBaseFuncSig{baseBuiltinFunc: base}} case tipb.ScalarFuncSig_RegexpSubstrSig: - f = &builtinRegexpSubstrFuncSig{regexpBaseFuncSig{base, regexpMemorizedSig{nil, nil}, sync.Once{}}} + f = &builtinRegexpSubstrFuncSig{regexpBaseFuncSig{baseBuiltinFunc: base}} case tipb.ScalarFuncSig_RegexpInStrSig: - f = &builtinRegexpInStrFuncSig{regexpBaseFuncSig{base, regexpMemorizedSig{nil, nil}, sync.Once{}}} + f = &builtinRegexpInStrFuncSig{regexpBaseFuncSig{baseBuiltinFunc: base}} case tipb.ScalarFuncSig_RegexpReplaceSig: - f = &builtinRegexpReplaceFuncSig{regexpBaseFuncSig{base, regexpMemorizedSig{nil, nil}, sync.Once{}}, make([]Instruction, 0), nil, sync.Once{}, false} + f = &builtinRegexpReplaceFuncSig{regexpBaseFuncSig: regexpBaseFuncSig{baseBuiltinFunc: base}} case tipb.ScalarFuncSig_JsonExtractSig: f = &builtinJSONExtractSig{base} case tipb.ScalarFuncSig_JsonUnquoteSig: @@ -1093,9 +1090,7 @@ func getSignatureByPB(ctx sessionctx.Context, sigCode tipb.ScalarFuncSig, tp *ti return f, nil } -func newDistSQLFunctionBySig(sc *stmtctx.StatementContext, sigCode tipb.ScalarFuncSig, tp *tipb.FieldType, args []Expression) (Expression, error) { - ctx := mock.NewContext() - ctx.GetSessionVars().StmtCtx = sc +func newDistSQLFunctionBySig(ctx sessionctx.Context, sigCode tipb.ScalarFuncSig, tp *tipb.FieldType, args []Expression) (Expression, error) { f, err := getSignatureByPB(ctx, sigCode, tp, args) if err != nil { return nil, err @@ -1104,15 +1099,14 @@ func newDistSQLFunctionBySig(sc *stmtctx.StatementContext, sigCode tipb.ScalarFu FuncName: model.NewCIStr(fmt.Sprintf("sig_%T", f)), Function: f, RetType: f.getRetTp(), - ctx: ctx, }, nil } // PBToExprs converts pb structures to expressions. -func PBToExprs(pbExprs []*tipb.Expr, fieldTps []*types.FieldType, sc *stmtctx.StatementContext) ([]Expression, error) { +func PBToExprs(ctx sessionctx.Context, pbExprs []*tipb.Expr, fieldTps []*types.FieldType) ([]Expression, error) { exprs := make([]Expression, 0, len(pbExprs)) for _, expr := range pbExprs { - e, err := PBToExpr(expr, fieldTps, sc) + e, err := PBToExpr(ctx, expr, fieldTps) if err != nil { return nil, errors.Trace(err) } @@ -1125,7 +1119,8 @@ func PBToExprs(pbExprs []*tipb.Expr, fieldTps []*types.FieldType, sc *stmtctx.St } // PBToExpr converts pb structure to expression. -func PBToExpr(expr *tipb.Expr, tps []*types.FieldType, sc *stmtctx.StatementContext) (Expression, error) { +func PBToExpr(ctx sessionctx.Context, expr *tipb.Expr, tps []*types.FieldType) (Expression, error) { + sc := ctx.GetSessionVars().StmtCtx switch expr.Tp { case tipb.ExprType_ColumnRef: _, offset, err := codec.DecodeInt(expr.Val) @@ -1150,7 +1145,7 @@ func PBToExpr(expr *tipb.Expr, tps []*types.FieldType, sc *stmtctx.StatementCont case tipb.ExprType_Float64: return convertFloat(expr.Val, false) case tipb.ExprType_MysqlDecimal: - return convertDecimal(expr.Val) + return convertDecimal(expr.Val, expr.FieldType) case tipb.ExprType_MysqlDuration: return convertDuration(expr.Val) case tipb.ExprType_MysqlTime: @@ -1177,13 +1172,13 @@ func PBToExpr(expr *tipb.Expr, tps []*types.FieldType, sc *stmtctx.StatementCont args = append(args, results...) continue } - arg, err := PBToExpr(child, tps, sc) + arg, err := PBToExpr(ctx, child, tps) if err != nil { return nil, err } args = append(args, arg) } - sf, err := newDistSQLFunctionBySig(sc, expr.Sig, expr.FieldType, args) + sf, err := newDistSQLFunctionBySig(ctx, expr.Sig, expr.FieldType, args) if err != nil { return nil, err } @@ -1268,7 +1263,8 @@ func convertFloat(val []byte, f32 bool) (*Constant, error) { return &Constant{Value: d, RetType: types.NewFieldType(mysql.TypeDouble)}, nil } -func convertDecimal(val []byte) (*Constant, error) { +func convertDecimal(val []byte, ftPB *tipb.FieldType) (*Constant, error) { + ft := PbTypeToFieldType(ftPB) _, dec, precision, frac, err := codec.DecodeDecimal(val) var d types.Datum d.SetMysqlDecimal(dec) @@ -1277,7 +1273,7 @@ func convertDecimal(val []byte) (*Constant, error) { if err != nil { return nil, errors.Errorf("invalid decimal % x", val) } - return &Constant{Value: d, RetType: types.NewFieldType(mysql.TypeNewDecimal)}, nil + return &Constant{Value: d, RetType: ft}, nil } func convertDuration(val []byte) (*Constant, error) { diff --git a/pkg/expression/distsql_builtin_test.go b/pkg/expression/distsql_builtin_test.go index 308f4d9fd8b46..47214f4dd14e8 100644 --- a/pkg/expression/distsql_builtin_test.go +++ b/pkg/expression/distsql_builtin_test.go @@ -20,7 +20,6 @@ import ( "github.com/pingcap/tidb/pkg/parser/charset" "github.com/pingcap/tidb/pkg/parser/mysql" - "github.com/pingcap/tidb/pkg/sessionctx/stmtctx" "github.com/pingcap/tidb/pkg/types" "github.com/pingcap/tidb/pkg/util/chunk" "github.com/pingcap/tidb/pkg/util/codec" @@ -31,7 +30,7 @@ import ( ) func TestPBToExpr(t *testing.T) { - sc := stmtctx.NewStmtCtx() + ctx := mock.NewContext() fieldTps := make([]*types.FieldType, 1) ds := []types.Datum{types.NewIntDatum(1), types.NewUintDatum(1), types.NewFloat64Datum(1), types.NewDecimalDatum(newMyDecimal(t, "1")), types.NewDurationDatum(newDuration(time.Second))} @@ -39,7 +38,7 @@ func TestPBToExpr(t *testing.T) { for _, d := range ds { expr := datumExpr(t, d) expr.Val = expr.Val[:len(expr.Val)/2] - _, err := PBToExpr(expr, fieldTps, sc) + _, err := PBToExpr(ctx, expr, fieldTps) require.Error(t, err) } @@ -51,7 +50,7 @@ func TestPBToExpr(t *testing.T) { }, }, } - _, err := PBToExpr(expr, fieldTps, sc) + _, err := PBToExpr(ctx, expr, fieldTps) require.NoError(t, err) val := make([]byte, 0, 32) @@ -65,7 +64,7 @@ func TestPBToExpr(t *testing.T) { }, }, } - _, err = PBToExpr(expr, fieldTps, sc) + _, err = PBToExpr(ctx, expr, fieldTps) require.Error(t, err) expr = &tipb.Expr{ @@ -79,7 +78,7 @@ func TestPBToExpr(t *testing.T) { Sig: tipb.ScalarFuncSig_AbsInt, FieldType: ToPBFieldType(newIntFieldType()), } - _, err = PBToExpr(expr, fieldTps, sc) + _, err = PBToExpr(ctx, expr, fieldTps) require.Error(t, err) } @@ -779,14 +778,14 @@ func TestEval(t *testing.T) { types.NewIntDatum(1), }, } - sc := stmtctx.NewStmtCtx() + ctx := mock.NewContext() for _, tt := range tests { - expr, err := PBToExpr(tt.expr, fieldTps, sc) + expr, err := PBToExpr(ctx, tt.expr, fieldTps) require.NoError(t, err) - result, err := expr.Eval(mock.NewContext(), row) + result, err := expr.Eval(ctx, row) require.NoError(t, err) require.Equal(t, tt.result.Kind(), result.Kind()) - cmp, err := result.Compare(sc.TypeCtx(), &tt.result, collate.GetCollator(fieldTps[0].GetCollate())) + cmp, err := result.Compare(ctx.GetSessionVars().StmtCtx.TypeCtx(), &tt.result, collate.GetCollator(fieldTps[0].GetCollate())) require.NoError(t, err) require.Equal(t, 0, cmp) } @@ -794,7 +793,7 @@ func TestEval(t *testing.T) { func TestPBToExprWithNewCollation(t *testing.T) { collate.SetNewCollationEnabledForTest(false) - sc := stmtctx.NewStmtCtx() + ctx := mock.NewContext() fieldTps := make([]*types.FieldType, 1) cases := []struct { @@ -822,7 +821,7 @@ func TestPBToExprWithNewCollation(t *testing.T) { expr.FieldType = toPBFieldType(ft) require.Equal(t, cs.pbID, expr.FieldType.Collate) - e, err := PBToExpr(expr, fieldTps, sc) + e, err := PBToExpr(ctx, expr, fieldTps) require.NoError(t, err) cons, ok := e.(*Constant) require.True(t, ok) @@ -839,7 +838,7 @@ func TestPBToExprWithNewCollation(t *testing.T) { expr.FieldType = toPBFieldType(ft) require.Equal(t, -cs.pbID, expr.FieldType.Collate) - e, err := PBToExpr(expr, fieldTps, sc) + e, err := PBToExpr(ctx, expr, fieldTps) require.NoError(t, err) cons, ok := e.(*Constant) require.True(t, ok) @@ -849,7 +848,7 @@ func TestPBToExprWithNewCollation(t *testing.T) { // Test convert various scalar functions. func TestPBToScalarFuncExpr(t *testing.T) { - sc := stmtctx.NewStmtCtx() + ctx := mock.NewContext() fieldTps := make([]*types.FieldType, 1) exprs := []*tipb.Expr{ { @@ -864,7 +863,7 @@ func TestPBToScalarFuncExpr(t *testing.T) { }, } for _, expr := range exprs { - _, err := PBToExpr(expr, fieldTps, sc) + _, err := PBToExpr(ctx, expr, fieldTps) require.NoError(t, err) } } @@ -898,6 +897,7 @@ func datumExpr(t *testing.T, d types.Datum) *tipb.Expr { expr.Val = codec.EncodeInt(nil, int64(d.GetMysqlDuration().Duration)) case types.KindMysqlDecimal: expr.Tp = tipb.ExprType_MysqlDecimal + expr.FieldType = toPBFieldType(types.NewFieldType(mysql.TypeNewDecimal)) var err error expr.Val, err = codec.EncodeDecimal(nil, d.GetMysqlDecimal(), d.Length(), d.Frac()) require.NoError(t, err) diff --git a/pkg/expression/errors.go b/pkg/expression/errors.go index a259164682c59..9aa5c0b132253 100644 --- a/pkg/expression/errors.go +++ b/pkg/expression/errors.go @@ -15,9 +15,9 @@ package expression import ( + "github.com/pingcap/errors" mysql "github.com/pingcap/tidb/pkg/errno" pmysql "github.com/pingcap/tidb/pkg/parser/mysql" - "github.com/pingcap/tidb/pkg/sessionctx" "github.com/pingcap/tidb/pkg/types" "github.com/pingcap/tidb/pkg/util/dbterror" ) @@ -61,6 +61,7 @@ var ( errUserLockDeadlock = dbterror.ClassExpression.NewStd(mysql.ErrUserLockDeadlock) errUserLockWrongName = dbterror.ClassExpression.NewStd(mysql.ErrUserLockWrongName) errJSONInBooleanContext = dbterror.ClassExpression.NewStd(mysql.ErrJSONInBooleanContext) + errBadNull = dbterror.ClassExpression.NewStd(mysql.ErrBadNull) // Sequence usage privilege check. errSequenceAccessDenied = dbterror.ClassExpression.NewStd(mysql.ErrTableaccessDenied) @@ -69,49 +70,29 @@ var ( ) // handleInvalidTimeError reports error or warning depend on the context. -func handleInvalidTimeError(ctx sessionctx.Context, err error) error { +func handleInvalidTimeError(ctx EvalContext, err error) error { if err == nil || !(types.ErrWrongValue.Equal(err) || types.ErrWrongValueForType.Equal(err) || types.ErrTruncatedWrongVal.Equal(err) || types.ErrInvalidWeekModeFormat.Equal(err) || types.ErrDatetimeFunctionOverflow.Equal(err) || types.ErrIncorrectDatetimeValue.Equal(err)) { return err } - sc := ctx.GetSessionVars().StmtCtx - err = sc.HandleTruncate(err) - if ctx.GetSessionVars().StrictSQLMode && (sc.InInsertStmt || sc.InUpdateStmt || sc.InDeleteStmt) { - return err - } - return nil + ec := ctx.GetSessionVars().StmtCtx.ErrCtx() + return ec.HandleError(err) } // handleDivisionByZeroError reports error or warning depend on the context. -func handleDivisionByZeroError(ctx sessionctx.Context) error { - sc := ctx.GetSessionVars().StmtCtx - if sc.InInsertStmt || sc.InUpdateStmt || sc.InDeleteStmt { - if !ctx.GetSessionVars().SQLMode.HasErrorForDivisionByZeroMode() { - return nil - } - if ctx.GetSessionVars().StrictSQLMode && !sc.DividedByZeroAsWarning { - return ErrDivisionByZero - } - } - sc.AppendWarning(ErrDivisionByZero) - return nil +func handleDivisionByZeroError(ctx EvalContext) error { + ec := ctx.GetSessionVars().StmtCtx.ErrCtx() + return ec.HandleError(ErrDivisionByZero) } // handleAllowedPacketOverflowed reports error or warning depend on the context. -func handleAllowedPacketOverflowed(ctx sessionctx.Context, exprName string, maxAllowedPacketSize uint64) error { - err := errWarnAllowedPacketOverflowed.GenWithStackByArgs(exprName, maxAllowedPacketSize) - sc := ctx.GetSessionVars().StmtCtx - - // insert|update|delete ignore ... - if sc.TypeFlags().TruncateAsWarning() { - sc.AppendWarning(err) +func handleAllowedPacketOverflowed(ctx EvalContext, exprName string, maxAllowedPacketSize uint64) error { + err := errWarnAllowedPacketOverflowed.FastGenByArgs(exprName, maxAllowedPacketSize) + tc := ctx.GetSessionVars().StmtCtx.TypeCtx() + if f := tc.Flags(); f.TruncateAsWarning() || f.IgnoreTruncateErr() { + tc.AppendWarning(err) return nil } - - if ctx.GetSessionVars().StrictSQLMode && (sc.InInsertStmt || sc.InUpdateStmt || sc.InDeleteStmt) { - return err - } - sc.AppendWarning(err) - return nil + return errors.Trace(err) } diff --git a/pkg/expression/evaluator.go b/pkg/expression/evaluator.go index 0482b4f036a3a..df0d8f6f7bac1 100644 --- a/pkg/expression/evaluator.go +++ b/pkg/expression/evaluator.go @@ -15,7 +15,6 @@ package expression import ( - "github.com/pingcap/tidb/pkg/sessionctx" "github.com/pingcap/tidb/pkg/util/chunk" ) @@ -27,7 +26,7 @@ type columnEvaluator struct { // NOTE: It should be called after all the other expressions are evaluated // // since it will change the content of the input Chunk. -func (e *columnEvaluator) run(ctx sessionctx.Context, input, output *chunk.Chunk) error { +func (e *columnEvaluator) run(ctx EvalContext, input, output *chunk.Chunk) error { for inputIdx, outputIdxes := range e.inputIdxToOutputIdxes { if err := output.SwapColumn(outputIdxes[0], input, inputIdx); err != nil { return err @@ -45,7 +44,7 @@ type defaultEvaluator struct { vectorizable bool } -func (e *defaultEvaluator) run(ctx sessionctx.Context, input, output *chunk.Chunk) error { +func (e *defaultEvaluator) run(ctx EvalContext, input, output *chunk.Chunk) error { iter := chunk.NewIterator4Chunk(input) if e.vectorizable { for i := range e.outputIdxes { @@ -120,7 +119,7 @@ func (e *EvaluatorSuite) Vectorizable() bool { // Run evaluates all the expressions hold by this EvaluatorSuite. // NOTE: "defaultEvaluator" must be evaluated before "columnEvaluator". -func (e *EvaluatorSuite) Run(ctx sessionctx.Context, input, output *chunk.Chunk) error { +func (e *EvaluatorSuite) Run(ctx EvalContext, input, output *chunk.Chunk) error { if e.defaultEvaluator != nil { err := e.defaultEvaluator.run(ctx, input, output) if err != nil { diff --git a/pkg/expression/evaluator_test.go b/pkg/expression/evaluator_test.go index 6234c3b8fa780..2a802ae002ed1 100644 --- a/pkg/expression/evaluator_test.go +++ b/pkg/expression/evaluator_test.go @@ -18,6 +18,7 @@ import ( "testing" "time" + "github.com/pingcap/tidb/pkg/errctx" "github.com/pingcap/tidb/pkg/parser/ast" "github.com/pingcap/tidb/pkg/parser/charset" "github.com/pingcap/tidb/pkg/parser/mysql" @@ -104,7 +105,9 @@ func TestSleep(t *testing.T) { fc := funcs[ast.Sleep] // non-strict model - sessVars.StmtCtx.BadNullAsWarning = true + var levels errctx.LevelMap + levels[errctx.ErrGroupBadNull] = errctx.LevelWarn + sessVars.StmtCtx.SetErrLevels(levels) d := make([]types.Datum, 1) f, err := fc.getFunction(ctx, datumsToConstants(d)) require.NoError(t, err) @@ -121,7 +124,8 @@ func TestSleep(t *testing.T) { require.Equal(t, int64(0), ret) // for error case under the strict model - sessVars.StmtCtx.BadNullAsWarning = false + levels[errctx.ErrGroupBadNull] = errctx.LevelError + sessVars.StmtCtx.SetErrLevels(levels) d[0].SetNull() _, err = fc.getFunction(ctx, datumsToConstants(d)) require.NoError(t, err) @@ -438,9 +442,9 @@ func TestBinopNumeric(t *testing.T) { {types.NewDecFromInt(10), ast.Mod, 0}, } - ctx.GetSessionVars().StmtCtx.InSelectStmt = false - ctx.GetSessionVars().SQLMode |= mysql.ModeErrorForDivisionByZero - ctx.GetSessionVars().StmtCtx.InInsertStmt = true + levels := ctx.GetSessionVars().StmtCtx.ErrLevels() + levels[errctx.ErrGroupDividedByZero] = errctx.LevelError + ctx.GetSessionVars().StmtCtx.SetErrLevels(levels) for _, tt := range testcases { fc := funcs[tt.op] f, err := fc.getFunction(ctx, datumsToConstants(types.MakeDatums(tt.lhs, tt.rhs))) @@ -449,7 +453,8 @@ func TestBinopNumeric(t *testing.T) { require.Error(t, err) } - ctx.GetSessionVars().StmtCtx.DividedByZeroAsWarning = true + levels[errctx.ErrGroupDividedByZero] = errctx.LevelWarn + ctx.GetSessionVars().StmtCtx.SetErrLevels(levels) for _, tt := range testcases { fc := funcs[tt.op] f, err := fc.getFunction(ctx, datumsToConstants(types.MakeDatums(tt.lhs, tt.rhs))) diff --git a/pkg/expression/explain.go b/pkg/expression/explain.go index e8520d638671b..3813915c20ad7 100644 --- a/pkg/expression/explain.go +++ b/pkg/expression/explain.go @@ -23,14 +23,17 @@ import ( "github.com/pingcap/tidb/pkg/parser/ast" "github.com/pingcap/tidb/pkg/types" "github.com/pingcap/tidb/pkg/util/chunk" + "github.com/pingcap/tidb/pkg/util/intest" ) // ExplainInfo implements the Expression interface. -func (expr *ScalarFunction) ExplainInfo() string { - return expr.explainInfo(false) +func (expr *ScalarFunction) ExplainInfo(ctx EvalContext) string { + return expr.explainInfo(ctx, false) } -func (expr *ScalarFunction) explainInfo(normalized bool) string { +func (expr *ScalarFunction) explainInfo(ctx EvalContext, normalized bool) string { + // we only need ctx for non-normalized explain info. + intest.Assert(normalized || ctx != nil) var buffer bytes.Buffer fmt.Fprintf(&buffer, "%s(", expr.FuncName.L) switch expr.FuncName.L { @@ -39,7 +42,8 @@ func (expr *ScalarFunction) explainInfo(normalized bool) string { if normalized { buffer.WriteString(arg.ExplainNormalizedInfo()) } else { - buffer.WriteString(arg.ExplainInfo()) + intest.Assert(ctx != nil) + buffer.WriteString(arg.ExplainInfo(ctx)) } buffer.WriteString(", ") buffer.WriteString(expr.RetType.String()) @@ -49,7 +53,8 @@ func (expr *ScalarFunction) explainInfo(normalized bool) string { if normalized { buffer.WriteString(arg.ExplainNormalizedInfo()) } else { - buffer.WriteString(arg.ExplainInfo()) + intest.Assert(ctx != nil) + buffer.WriteString(arg.ExplainInfo(ctx)) } if i+1 < len(expr.GetArgs()) { buffer.WriteString(", ") @@ -62,7 +67,7 @@ func (expr *ScalarFunction) explainInfo(normalized bool) string { // ExplainNormalizedInfo implements the Expression interface. func (expr *ScalarFunction) ExplainNormalizedInfo() string { - return expr.explainInfo(true) + return expr.explainInfo(nil, true) } // ExplainNormalizedInfo4InList implements the Expression interface. @@ -90,30 +95,35 @@ func (expr *ScalarFunction) ExplainNormalizedInfo4InList() string { return buffer.String() } -// ExplainInfo implements the Expression interface. -func (col *Column) ExplainInfo() string { +// ColumnExplainInfo returns the explained info for column. +func (col *Column) ColumnExplainInfo(normalized bool) string { + if normalized { + if col.OrigName != "" { + return col.OrigName + } + return "?" + } return col.String() } +// ExplainInfo implements the Expression interface. +func (col *Column) ExplainInfo(ctx EvalContext) string { + return col.ColumnExplainInfo(false) +} + // ExplainNormalizedInfo implements the Expression interface. func (col *Column) ExplainNormalizedInfo() string { - if col.OrigName != "" { - return col.OrigName - } - return "?" + return col.ColumnExplainInfo(true) } // ExplainNormalizedInfo4InList implements the Expression interface. func (col *Column) ExplainNormalizedInfo4InList() string { - if col.OrigName != "" { - return col.OrigName - } - return "?" + return col.ColumnExplainInfo(true) } // ExplainInfo implements the Expression interface. -func (expr *Constant) ExplainInfo() string { - dt, err := expr.EvalWithInnerCtx(chunk.Row{}) +func (expr *Constant) ExplainInfo(ctx EvalContext) string { + dt, err := expr.Eval(ctx, chunk.Row{}) if err != nil { return "not recognized const value" } @@ -179,16 +189,17 @@ func ExplainExpressionList(exprs []Expression, schema *Schema) string { // SortedExplainExpressionList generates explain information for a list of expressions in order. // In some scenarios, the expr's order may not be stable when executing multiple times. // So we add a sort to make its explain result stable. -func SortedExplainExpressionList(exprs []Expression) []byte { - return sortedExplainExpressionList(exprs, false, false) +func SortedExplainExpressionList(ctx EvalContext, exprs []Expression) []byte { + return sortedExplainExpressionList(ctx, exprs, false, false) } // SortedExplainExpressionListIgnoreInlist generates explain information for a list of expressions in order. func SortedExplainExpressionListIgnoreInlist(exprs []Expression) []byte { - return sortedExplainExpressionList(exprs, false, true) + return sortedExplainExpressionList(nil, exprs, false, true) } -func sortedExplainExpressionList(exprs []Expression, normalized bool, ignoreInlist bool) []byte { +func sortedExplainExpressionList(ctx EvalContext, exprs []Expression, normalized bool, ignoreInlist bool) []byte { + intest.Assert(ignoreInlist || normalized || ctx != nil) buffer := bytes.NewBufferString("") exprInfos := make([]string, 0, len(exprs)) for _, expr := range exprs { @@ -197,7 +208,8 @@ func sortedExplainExpressionList(exprs []Expression, normalized bool, ignoreInli } else if normalized { exprInfos = append(exprInfos, expr.ExplainNormalizedInfo()) } else { - exprInfos = append(exprInfos, expr.ExplainInfo()) + intest.Assert(ctx != nil) + exprInfos = append(exprInfos, expr.ExplainInfo(ctx)) } } slices.Sort(exprInfos) @@ -212,7 +224,7 @@ func sortedExplainExpressionList(exprs []Expression, normalized bool, ignoreInli // SortedExplainNormalizedExpressionList is same like SortedExplainExpressionList, but use for generating normalized information. func SortedExplainNormalizedExpressionList(exprs []Expression) []byte { - return sortedExplainExpressionList(exprs, true, false) + return sortedExplainExpressionList(nil, exprs, true, false) } // SortedExplainNormalizedScalarFuncList is same like SortedExplainExpressionList, but use for generating normalized information. @@ -221,14 +233,14 @@ func SortedExplainNormalizedScalarFuncList(exprs []*ScalarFunction) []byte { for i := range exprs { expressions[i] = exprs[i] } - return sortedExplainExpressionList(expressions, true, false) + return sortedExplainExpressionList(nil, expressions, true, false) } // ExplainColumnList generates explain information for a list of columns. -func ExplainColumnList(cols []*Column) []byte { +func ExplainColumnList(ctx EvalContext, cols []*Column) []byte { buffer := bytes.NewBufferString("") for i, col := range cols { - buffer.WriteString(col.ExplainInfo()) + buffer.WriteString(col.ExplainInfo(ctx)) if i+1 < len(cols) { buffer.WriteString(", ") } diff --git a/pkg/expression/expr_to_pb.go b/pkg/expression/expr_to_pb.go index 70eba1fde8cb5..72ff385364cd8 100644 --- a/pkg/expression/expr_to_pb.go +++ b/pkg/expression/expr_to_pb.go @@ -23,7 +23,6 @@ import ( "github.com/pingcap/tidb/pkg/kv" "github.com/pingcap/tidb/pkg/parser/mysql" ast "github.com/pingcap/tidb/pkg/parser/types" - "github.com/pingcap/tidb/pkg/sessionctx/stmtctx" "github.com/pingcap/tidb/pkg/types" "github.com/pingcap/tidb/pkg/util/chunk" "github.com/pingcap/tidb/pkg/util/codec" @@ -34,8 +33,8 @@ import ( ) // ExpressionsToPBList converts expressions to tipb.Expr list for new plan. -func ExpressionsToPBList(sc *stmtctx.StatementContext, exprs []Expression, client kv.Client) (pbExpr []*tipb.Expr, err error) { - pc := PbConverter{client: client, sc: sc} +func ExpressionsToPBList(ctx EvalContext, exprs []Expression, client kv.Client) (pbExpr []*tipb.Expr, err error) { + pc := PbConverter{client: client, ctx: ctx} for _, expr := range exprs { v := pc.ExprToPB(expr) if v == nil { @@ -49,12 +48,12 @@ func ExpressionsToPBList(sc *stmtctx.StatementContext, exprs []Expression, clien // PbConverter supplies methods to convert TiDB expressions to TiPB. type PbConverter struct { client kv.Client - sc *stmtctx.StatementContext + ctx EvalContext } // NewPBConverter creates a PbConverter. -func NewPBConverter(client kv.Client, sc *stmtctx.StatementContext) PbConverter { - return PbConverter{client: client, sc: sc} +func NewPBConverter(client kv.Client, ctx EvalContext) PbConverter { + return PbConverter{client: client, ctx: ctx} } // ExprToPB converts Expression to TiPB. @@ -78,9 +77,9 @@ func (pc PbConverter) ExprToPB(expr Expression) *tipb.Expr { func (pc PbConverter) conOrCorColToPBExpr(expr Expression) *tipb.Expr { ft := expr.GetType() - d, err := expr.EvalWithInnerCtx(chunk.Row{}) + d, err := expr.Eval(pc.ctx, chunk.Row{}) if err != nil { - logutil.BgLogger().Error("eval constant or correlated column", zap.String("expression", expr.ExplainInfo()), zap.Error(err)) + logutil.BgLogger().Error("eval constant or correlated column", zap.String("expression", expr.ExplainInfo(pc.ctx)), zap.Error(err)) return nil } tp, val, ok := pc.encodeDatum(ft, d) @@ -143,8 +142,9 @@ func (pc *PbConverter) encodeDatum(ft *types.FieldType, d types.Datum) (tipb.Exp case types.KindMysqlTime: if pc.client.IsRequestTypeSupported(kv.ReqTypeDAG, int64(tipb.ExprType_MysqlTime)) { tp = tipb.ExprType_MysqlTime - val, err := codec.EncodeMySQLTime(pc.sc.TimeZone(), d.GetMysqlTime(), ft.GetType(), nil) - err = pc.sc.HandleError(err) + sc := pc.ctx.GetSessionVars().StmtCtx + val, err := codec.EncodeMySQLTime(sc.TimeZone(), d.GetMysqlTime(), ft.GetType(), nil) + err = sc.HandleError(err) if err != nil { logutil.BgLogger().Error("encode mysql time", zap.Error(err)) return tp, nil, false @@ -277,8 +277,8 @@ func (pc PbConverter) scalarFuncToPBExpr(expr *ScalarFunction) *tipb.Expr { } // GroupByItemToPB converts group by items to pb. -func GroupByItemToPB(sc *stmtctx.StatementContext, client kv.Client, expr Expression) *tipb.ByItem { - pc := PbConverter{client: client, sc: sc} +func GroupByItemToPB(ctx EvalContext, client kv.Client, expr Expression) *tipb.ByItem { + pc := PbConverter{client: client, ctx: ctx} e := pc.ExprToPB(expr) if e == nil { return nil @@ -287,8 +287,8 @@ func GroupByItemToPB(sc *stmtctx.StatementContext, client kv.Client, expr Expres } // SortByItemToPB converts order by items to pb. -func SortByItemToPB(sc *stmtctx.StatementContext, client kv.Client, expr Expression, desc bool) *tipb.ByItem { - pc := PbConverter{client: client, sc: sc} +func SortByItemToPB(ctx EvalContext, client kv.Client, expr Expression, desc bool) *tipb.ByItem { + pc := PbConverter{client: client, ctx: ctx} e := pc.ExprToPB(expr) if e == nil { return nil diff --git a/pkg/expression/expr_to_pb_test.go b/pkg/expression/expr_to_pb_test.go index c07f4bfa3d05a..86f3d170b8f9f 100644 --- a/pkg/expression/expr_to_pb_test.go +++ b/pkg/expression/expr_to_pb_test.go @@ -26,7 +26,6 @@ import ( "github.com/pingcap/tidb/pkg/parser/ast" "github.com/pingcap/tidb/pkg/parser/charset" "github.com/pingcap/tidb/pkg/parser/mysql" - "github.com/pingcap/tidb/pkg/sessionctx/stmtctx" "github.com/pingcap/tidb/pkg/types" "github.com/pingcap/tidb/pkg/util/mock" "github.com/pingcap/tipb/go-tipb" @@ -44,7 +43,7 @@ func genColumn(tp byte, id int64) *Column { func TestConstant2Pb(t *testing.T) { t.Skip("constant pb has changed") var constExprs []Expression - sc := stmtctx.NewStmtCtx() + ctx := mock.NewContext() client := new(mock.Client) // can be transformed @@ -99,11 +98,11 @@ func TestConstant2Pb(t *testing.T) { require.Equal(t, types.KindMysqlEnum, constValue.Value.Kind()) constExprs = append(constExprs, constValue) - pushed, remained := PushDownExprs(sc, constExprs, client, kv.UnSpecified) + pushed, remained := PushDownExprs(ctx, constExprs, client, kv.UnSpecified) require.Len(t, pushed, len(constExprs)-3) require.Len(t, remained, 3) - pbExprs, err := ExpressionsToPBList(sc, constExprs, client) + pbExprs, err := ExpressionsToPBList(ctx, constExprs, client) require.NoError(t, err) jsons := []string{ "{\"tp\":0,\"sig\":0}", @@ -127,19 +126,19 @@ func TestConstant2Pb(t *testing.T) { func TestColumn2Pb(t *testing.T) { var colExprs []Expression - sc := stmtctx.NewStmtCtx() + ctx := mock.NewContext() client := new(mock.Client) colExprs = append(colExprs, genColumn(mysql.TypeSet, 1)) colExprs = append(colExprs, genColumn(mysql.TypeGeometry, 2)) colExprs = append(colExprs, genColumn(mysql.TypeUnspecified, 3)) - pushed, remained := PushDownExprs(sc, colExprs, client, kv.UnSpecified) + pushed, remained := PushDownExprs(ctx, colExprs, client, kv.UnSpecified) require.Len(t, pushed, 0) require.Len(t, remained, len(colExprs)) for _, col := range colExprs { // cannot be pushed down - _, err := ExpressionsToPBList(sc, []Expression{col}, client) + _, err := ExpressionsToPBList(ctx, []Expression{col}, client) require.Error(t, err) } @@ -168,11 +167,11 @@ func TestColumn2Pb(t *testing.T) { colExprs = append(colExprs, genColumn(mysql.TypeString, 23)) colExprs = append(colExprs, genColumn(mysql.TypeEnum, 24)) colExprs = append(colExprs, genColumn(mysql.TypeBit, 25)) - pushed, remained = PushDownExprs(sc, colExprs, client, kv.UnSpecified) + pushed, remained = PushDownExprs(ctx, colExprs, client, kv.UnSpecified) require.Len(t, pushed, len(colExprs)) require.Len(t, remained, 0) - pbExprs, err := ExpressionsToPBList(sc, colExprs, client) + pbExprs, err := ExpressionsToPBList(ctx, colExprs, client) require.NoError(t, err) jsons := []string{ "{\"tp\":201,\"val\":\"gAAAAAAAAAE=\",\"sig\":0,\"field_type\":{\"tp\":1,\"flag\":0,\"flen\":4,\"decimal\":0,\"collate\":-63,\"charset\":\"binary\",\"array\":false},\"has_distinct\":false}", @@ -212,14 +211,14 @@ func TestColumn2Pb(t *testing.T) { expr.(*Column).Index = 0 } - pushed, remained = PushDownExprs(sc, colExprs, client, kv.UnSpecified) + pushed, remained = PushDownExprs(ctx, colExprs, client, kv.UnSpecified) require.Len(t, pushed, len(colExprs)) require.Len(t, remained, 0) } func TestCompareFunc2Pb(t *testing.T) { var compareExprs = make([]Expression, 0) - sc := stmtctx.NewStmtCtx() + ctx := mock.NewContext() client := new(mock.Client) funcNames := []string{ast.LT, ast.LE, ast.GT, ast.GE, ast.EQ, ast.NE, ast.NullEQ} @@ -229,11 +228,11 @@ func TestCompareFunc2Pb(t *testing.T) { compareExprs = append(compareExprs, fc) } - pushed, remained := PushDownExprs(sc, compareExprs, client, kv.UnSpecified) + pushed, remained := PushDownExprs(ctx, compareExprs, client, kv.UnSpecified) require.Len(t, pushed, len(compareExprs)) require.Len(t, remained, 0) - pbExprs, err := ExpressionsToPBList(sc, compareExprs, client) + pbExprs, err := ExpressionsToPBList(ctx, compareExprs, client) require.NoError(t, err) require.Len(t, pbExprs, len(compareExprs)) jsons := []string{ @@ -255,7 +254,7 @@ func TestCompareFunc2Pb(t *testing.T) { func TestLikeFunc2Pb(t *testing.T) { var likeFuncs []Expression - sc := stmtctx.NewStmtCtx() + ctx := mock.NewContext() client := new(mock.Client) retTp := types.NewFieldType(mysql.TypeString) @@ -268,7 +267,6 @@ func TestLikeFunc2Pb(t *testing.T) { &Constant{RetType: retTp, Value: types.NewDatum(`%abc%`)}, &Constant{RetType: retTp, Value: types.NewDatum("\\")}, } - ctx := mock.NewContext() retTp = types.NewFieldType(mysql.TypeUnspecified) fc, err := NewFunction(ctx, ast.Like, retTp, args[0], args[1], args[3]) require.NoError(t, err) @@ -278,7 +276,7 @@ func TestLikeFunc2Pb(t *testing.T) { require.NoError(t, err) likeFuncs = append(likeFuncs, fc) - pbExprs, err := ExpressionsToPBList(sc, likeFuncs, client) + pbExprs, err := ExpressionsToPBList(ctx, likeFuncs, client) require.NoError(t, err) results := []string{ `{"tp":10000,"children":[{"tp":5,"val":"c3RyaW5n","sig":0,"field_type":{"tp":254,"flag":1,"flen":-1,"decimal":-1,"collate":-83,"charset":"utf8","array":false},"has_distinct":false},{"tp":5,"val":"cGF0dGVybg==","sig":0,"field_type":{"tp":254,"flag":1,"flen":-1,"decimal":-1,"collate":-83,"charset":"utf8","array":false},"has_distinct":false},{"tp":10000,"val":"CAA=","children":[{"tp":5,"val":"XA==","sig":0,"field_type":{"tp":254,"flag":1,"flen":-1,"decimal":-1,"collate":-83,"charset":"utf8","array":false},"has_distinct":false}],"sig":30,"field_type":{"tp":8,"flag":129,"flen":-1,"decimal":0,"collate":-83,"charset":"binary","array":false},"has_distinct":false}],"sig":4310,"field_type":{"tp":8,"flag":524416,"flen":1,"decimal":0,"collate":-83,"charset":"binary","array":false},"has_distinct":false}`, @@ -293,7 +291,7 @@ func TestLikeFunc2Pb(t *testing.T) { func TestArithmeticalFunc2Pb(t *testing.T) { var arithmeticalFuncs = make([]Expression, 0) - sc := stmtctx.NewStmtCtx() + ctx := mock.NewContext() client := new(mock.Client) funcNames := []string{ast.Plus, ast.Minus, ast.Mul, ast.Div} @@ -315,7 +313,7 @@ func TestArithmeticalFunc2Pb(t *testing.T) { jsons[ast.Div] = "{\"tp\":10000,\"children\":[{\"tp\":201,\"val\":\"gAAAAAAAAAE=\",\"sig\":0,\"field_type\":{\"tp\":5,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":-63,\"charset\":\"binary\",\"array\":false},\"has_distinct\":false},{\"tp\":201,\"val\":\"gAAAAAAAAAI=\",\"sig\":0,\"field_type\":{\"tp\":5,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":-63,\"charset\":\"binary\",\"array\":false},\"has_distinct\":false}],\"sig\":211,\"field_type\":{\"tp\":5,\"flag\":128,\"flen\":23,\"decimal\":-1,\"collate\":-63,\"charset\":\"binary\",\"array\":false},\"has_distinct\":false}" jsons[ast.Mod] = "{\"tp\":10000,\"children\":[{\"tp\":201,\"val\":\"gAAAAAAAAAE=\",\"sig\":0,\"field_type\":{\"tp\":5,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":-63,\"charset\":\"binary\",\"array\":false},\"has_distinct\":false},{\"tp\":201,\"val\":\"gAAAAAAAAAI=\",\"sig\":0,\"field_type\":{\"tp\":5,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":-63,\"charset\":\"binary\",\"array\":false},\"has_distinct\":false}],\"sig\":215,\"field_type\":{\"tp\":5,\"flag\":128,\"flen\":23,\"decimal\":-1,\"collate\":-63,\"charset\":\"binary\",\"array\":false},\"has_distinct\":false}" - pbExprs, err := ExpressionsToPBList(sc, arithmeticalFuncs, client) + pbExprs, err := ExpressionsToPBList(ctx, arithmeticalFuncs, client) require.NoError(t, err) for i, pbExpr := range pbExprs { require.NotNil(t, pbExpr) @@ -324,22 +322,24 @@ func TestArithmeticalFunc2Pb(t *testing.T) { require.Equalf(t, jsons[funcNames[i]], string(js), "%v\n", funcNames[i]) } - funcNames = []string{ast.IntDiv} // cannot be pushed down - for _, funcName := range funcNames { - fc, err := NewFunction( - mock.NewContext(), - funcName, - types.NewFieldType(mysql.TypeUnspecified), - genColumn(mysql.TypeDouble, 1), - genColumn(mysql.TypeDouble, 2)) - require.NoError(t, err) - _, err = ExpressionsToPBList(sc, []Expression{fc}, client) - require.Error(t, err) - } + // IntDiv + fc, err := NewFunction( + mock.NewContext(), + ast.IntDiv, + types.NewFieldType(mysql.TypeUnspecified), + genColumn(mysql.TypeLonglong, 1), + genColumn(mysql.TypeLonglong, 2)) + require.NoError(t, err) + pbExprs, err = ExpressionsToPBList(ctx, []Expression{fc}, client) + require.NoError(t, err) + js, err := json.Marshal(pbExprs[0]) + require.NoError(t, err) + expectedJs := "{\"tp\":10000,\"children\":[{\"tp\":201,\"val\":\"gAAAAAAAAAE=\",\"sig\":0,\"field_type\":{\"tp\":8,\"flag\":0,\"flen\":20,\"decimal\":0,\"collate\":-63,\"charset\":\"binary\",\"array\":false},\"has_distinct\":false},{\"tp\":201,\"val\":\"gAAAAAAAAAI=\",\"sig\":0,\"field_type\":{\"tp\":8,\"flag\":0,\"flen\":20,\"decimal\":0,\"collate\":-63,\"charset\":\"binary\",\"array\":false},\"has_distinct\":false}],\"sig\":213,\"field_type\":{\"tp\":8,\"flag\":128,\"flen\":20,\"decimal\":0,\"collate\":-63,\"charset\":\"binary\",\"array\":false},\"has_distinct\":false}" + require.Equalf(t, expectedJs, string(js), "%v\n", ast.IntDiv) } func TestDateFunc2Pb(t *testing.T) { - sc := stmtctx.NewStmtCtx() + ctx := mock.NewContext() client := new(mock.Client) fc, err := NewFunction( @@ -350,7 +350,7 @@ func TestDateFunc2Pb(t *testing.T) { genColumn(mysql.TypeString, 2)) require.NoError(t, err) funcs := []Expression{fc} - pbExprs, err := ExpressionsToPBList(sc, funcs, client) + pbExprs, err := ExpressionsToPBList(ctx, funcs, client) require.NoError(t, err) require.NotNil(t, pbExprs[0]) js, err := json.Marshal(pbExprs[0]) @@ -360,7 +360,7 @@ func TestDateFunc2Pb(t *testing.T) { func TestLogicalFunc2Pb(t *testing.T) { var logicalFuncs = make([]Expression, 0) - sc := stmtctx.NewStmtCtx() + ctx := mock.NewContext() client := new(mock.Client) funcNames := []string{ast.LogicAnd, ast.LogicOr, ast.LogicXor, ast.UnaryNot} @@ -379,7 +379,7 @@ func TestLogicalFunc2Pb(t *testing.T) { logicalFuncs = append(logicalFuncs, fc) } - pbExprs, err := ExpressionsToPBList(sc, logicalFuncs, client) + pbExprs, err := ExpressionsToPBList(ctx, logicalFuncs, client) require.NoError(t, err) jsons := []string{ "{\"tp\":10000,\"children\":[{\"tp\":201,\"val\":\"gAAAAAAAAAE=\",\"sig\":0,\"field_type\":{\"tp\":1,\"flag\":0,\"flen\":4,\"decimal\":0,\"collate\":-63,\"charset\":\"binary\",\"array\":false},\"has_distinct\":false},{\"tp\":201,\"val\":\"gAAAAAAAAAI=\",\"sig\":0,\"field_type\":{\"tp\":1,\"flag\":0,\"flen\":4,\"decimal\":0,\"collate\":-63,\"charset\":\"binary\",\"array\":false},\"has_distinct\":false}],\"sig\":3101,\"field_type\":{\"tp\":8,\"flag\":524416,\"flen\":1,\"decimal\":0,\"collate\":-63,\"charset\":\"binary\",\"array\":false},\"has_distinct\":false}", @@ -396,7 +396,7 @@ func TestLogicalFunc2Pb(t *testing.T) { func TestBitwiseFunc2Pb(t *testing.T) { var bitwiseFuncs = make([]Expression, 0) - sc := stmtctx.NewStmtCtx() + ctx := mock.NewContext() client := new(mock.Client) funcNames := []string{ast.And, ast.Or, ast.Xor, ast.LeftShift, ast.RightShift, ast.BitNeg} @@ -415,7 +415,7 @@ func TestBitwiseFunc2Pb(t *testing.T) { bitwiseFuncs = append(bitwiseFuncs, fc) } - pbExprs, err := ExpressionsToPBList(sc, bitwiseFuncs, client) + pbExprs, err := ExpressionsToPBList(ctx, bitwiseFuncs, client) require.NoError(t, err) jsons := []string{ "{\"tp\":10000,\"children\":[{\"tp\":201,\"val\":\"gAAAAAAAAAE=\",\"sig\":0,\"field_type\":{\"tp\":3,\"flag\":0,\"flen\":11,\"decimal\":0,\"collate\":-63,\"charset\":\"binary\",\"array\":false},\"has_distinct\":false},{\"tp\":201,\"val\":\"gAAAAAAAAAI=\",\"sig\":0,\"field_type\":{\"tp\":3,\"flag\":0,\"flen\":11,\"decimal\":0,\"collate\":-63,\"charset\":\"binary\",\"array\":false},\"has_distinct\":false}],\"sig\":3118,\"field_type\":{\"tp\":8,\"flag\":160,\"flen\":20,\"decimal\":0,\"collate\":-63,\"charset\":\"binary\",\"array\":false},\"has_distinct\":false}", @@ -434,7 +434,7 @@ func TestBitwiseFunc2Pb(t *testing.T) { func TestControlFunc2Pb(t *testing.T) { var controlFuncs = make([]Expression, 0) - sc := stmtctx.NewStmtCtx() + ctx := mock.NewContext() client := new(mock.Client) funcNames := []string{ @@ -458,7 +458,7 @@ func TestControlFunc2Pb(t *testing.T) { controlFuncs = append(controlFuncs, fc) } - pbExprs, err := ExpressionsToPBList(sc, controlFuncs, client) + pbExprs, err := ExpressionsToPBList(ctx, controlFuncs, client) require.NoError(t, err) jsons := []string{ "{\"tp\":10000,\"children\":[{\"tp\":201,\"val\":\"gAAAAAAAAAE=\",\"sig\":0,\"field_type\":{\"tp\":3,\"flag\":0,\"flen\":11,\"decimal\":0,\"collate\":-63,\"charset\":\"binary\",\"array\":false},\"has_distinct\":false},{\"tp\":201,\"val\":\"gAAAAAAAAAI=\",\"sig\":0,\"field_type\":{\"tp\":3,\"flag\":0,\"flen\":11,\"decimal\":0,\"collate\":-63,\"charset\":\"binary\",\"array\":false},\"has_distinct\":false},{\"tp\":201,\"val\":\"gAAAAAAAAAM=\",\"sig\":0,\"field_type\":{\"tp\":3,\"flag\":0,\"flen\":11,\"decimal\":0,\"collate\":-63,\"charset\":\"binary\",\"array\":false},\"has_distinct\":false}],\"sig\":4208,\"field_type\":{\"tp\":3,\"flag\":128,\"flen\":11,\"decimal\":0,\"collate\":-63,\"charset\":\"binary\",\"array\":false},\"has_distinct\":false}", @@ -475,7 +475,6 @@ func TestControlFunc2Pb(t *testing.T) { func TestOtherFunc2Pb(t *testing.T) { var otherFuncs = make([]Expression, 0) - sc := stmtctx.NewStmtCtx() client := new(mock.Client) funcNames := []string{ast.Coalesce, ast.IsNull} @@ -490,7 +489,7 @@ func TestOtherFunc2Pb(t *testing.T) { otherFuncs = append(otherFuncs, fc) } - pbExprs, err := ExpressionsToPBList(sc, otherFuncs, client) + pbExprs, err := ExpressionsToPBList(mock.NewContext(), otherFuncs, client) require.NoError(t, err) jsons := map[string]string{ ast.Coalesce: "{\"tp\":10000,\"children\":[{\"tp\":201,\"val\":\"gAAAAAAAAAE=\",\"sig\":0,\"field_type\":{\"tp\":3,\"flag\":0,\"flen\":11,\"decimal\":0,\"collate\":-63,\"charset\":\"binary\",\"array\":false},\"has_distinct\":false}],\"sig\":4201,\"field_type\":{\"tp\":3,\"flag\":0,\"flen\":11,\"decimal\":0,\"collate\":-63,\"charset\":\"binary\",\"array\":false},\"has_distinct\":false}", @@ -504,7 +503,7 @@ func TestOtherFunc2Pb(t *testing.T) { } func TestExprPushDownToFlash(t *testing.T) { - sc := stmtctx.NewStmtCtx() + ctx := mock.NewContext() client := new(mock.Client) exprs := make([]Expression, 0) @@ -543,11 +542,50 @@ func TestExprPushDownToFlash(t *testing.T) { require.NoError(t, err) exprs = append(exprs, function) + // json_unquote's argument is not cast(json as string) + function, err = NewFunction(mock.NewContext(), ast.JSONUnquote, types.NewFieldType(mysql.TypeString), stringColumn) + require.NoError(t, err) + exprs = append(exprs, function) + // json_array function, err = NewFunction(mock.NewContext(), ast.JSONArray, types.NewFieldType(mysql.TypeJSON), jsonColumn, jsonColumn, jsonColumn, jsonColumn, jsonColumn) require.NoError(t, err) exprs = append(exprs, function) + // json_depth + function, err = NewFunction(mock.NewContext(), ast.JSONDepth, types.NewFieldType(mysql.TypeLonglong), jsonColumn) + require.NoError(t, err) + exprs = append(exprs, function) + + // json_contains_path + function, err = NewFunction(mock.NewContext(), ast.JSONContainsPath, types.NewFieldType(mysql.TypeLonglong), jsonColumn, stringColumn, stringColumn) + require.NoError(t, err) + exprs = append(exprs, function) + + // json_valid + /// json_valid_others + function, err = NewFunction(mock.NewContext(), ast.JSONValid, types.NewFieldType(mysql.TypeLonglong), intColumn) + require.NoError(t, err) + exprs = append(exprs, function) + /// json_valid_json + function, err = NewFunction(mock.NewContext(), ast.JSONValid, types.NewFieldType(mysql.TypeLonglong), jsonColumn) + require.NoError(t, err) + exprs = append(exprs, function) + /// json_valid_string + function, err = NewFunction(mock.NewContext(), ast.JSONValid, types.NewFieldType(mysql.TypeLonglong), stringColumn) + require.NoError(t, err) + exprs = append(exprs, function) + + // json_keys + /// 1 arg + function, err = NewFunction(mock.NewContext(), ast.JSONKeys, types.NewFieldType(mysql.TypeJSON), jsonColumn) + require.NoError(t, err) + exprs = append(exprs, function) + /// 2 args + function, err = NewFunction(mock.NewContext(), ast.JSONKeys, types.NewFieldType(mysql.TypeJSON), jsonColumn, stringColumn) + require.NoError(t, err) + exprs = append(exprs, function) + // lpad function, err = NewFunction(mock.NewContext(), ast.Lpad, types.NewFieldType(mysql.TypeString), stringColumn, int32Column, stringColumn) require.NoError(t, err) @@ -774,6 +812,11 @@ func TestExprPushDownToFlash(t *testing.T) { require.NoError(t, err) exprs = append(exprs, function) + // ScalarFuncSig_Pow, Power is a synonym for Pow + function, err = NewFunction(mock.NewContext(), ast.Power, types.NewFieldType(mysql.TypeDouble), realColumn, realColumn) + require.NoError(t, err) + exprs = append(exprs, function) + // ScalarFuncSig_Radians function, err = NewFunction(mock.NewContext(), ast.Radians, types.NewFieldType(mysql.TypeDouble), realColumn) require.NoError(t, err) @@ -978,16 +1021,11 @@ func TestExprPushDownToFlash(t *testing.T) { require.NoError(t, err) exprs = append(exprs, function) - canPush := CanExprsPushDown(sc, exprs, client, kv.TiFlash) + canPush := CanExprsPushDown(mock.NewContext(), exprs, client, kv.TiFlash) require.Equal(t, true, canPush) exprs = exprs[:0] - // json_unquote's argument is not cast(json as string) - function, err = NewFunction(mock.NewContext(), ast.JSONUnquote, types.NewFieldType(mysql.TypeString), stringColumn) - require.NoError(t, err) - exprs = append(exprs, function) - // Substring2Args: can not be pushed function, err = NewFunction(mock.NewContext(), ast.Substr, types.NewFieldType(mysql.TypeString), binaryStringColumn, intColumn) require.NoError(t, err) @@ -998,10 +1036,6 @@ func TestExprPushDownToFlash(t *testing.T) { require.NoError(t, err) exprs = append(exprs, function) - function, err = NewFunction(mock.NewContext(), ast.JSONDepth, types.NewFieldType(mysql.TypeLonglong), jsonColumn) - require.NoError(t, err) - exprs = append(exprs, function) - // ExtractDatetimeFromString: can not be pushed extractDatetimeFromStringUnitCol := new(Constant) extractDatetimeFromStringUnitCol.Value = types.NewStringDatum("day_microsecond") @@ -1037,11 +1071,11 @@ func TestExprPushDownToFlash(t *testing.T) { require.NoError(t, err) exprs = append(exprs, function) - pushed, remained := PushDownExprs(sc, exprs, client, kv.TiFlash) + pushed, remained := PushDownExprs(ctx, exprs, client, kv.TiFlash) require.Len(t, pushed, 0) require.Len(t, remained, len(exprs)) - pushed, remained = PushDownExprsWithExtraInfo(sc, exprs, client, kv.TiFlash, true) + pushed, remained = PushDownExprsWithExtraInfo(ctx, exprs, client, kv.TiFlash, true) require.Len(t, pushed, 0) require.Len(t, remained, len(exprs)) @@ -1294,18 +1328,55 @@ func TestExprPushDownToFlash(t *testing.T) { require.NoError(t, err) exprs = append(exprs, function) - pushed, remained = PushDownExprs(sc, exprs, client, kv.TiFlash) + // CastIntAsJson + function, err = NewFunction(mock.NewContext(), ast.Cast, types.NewFieldType(mysql.TypeJSON), intColumn) + require.NoError(t, err) + exprs = append(exprs, function) + + // CastRealAsJson + function, err = NewFunction(mock.NewContext(), ast.Cast, types.NewFieldType(mysql.TypeJSON), realColumn) + require.NoError(t, err) + exprs = append(exprs, function) + + // CastDecimalAsJson + function, err = NewFunction(mock.NewContext(), ast.Cast, types.NewFieldType(mysql.TypeJSON), decimalColumn) + require.NoError(t, err) + exprs = append(exprs, function) + + // CastStringAsJson + function, err = NewFunction(mock.NewContext(), ast.Cast, types.NewFieldType(mysql.TypeJSON), stringColumn) + require.NoError(t, err) + exprs = append(exprs, function) + function, err = NewFunction(mock.NewContext(), ast.Cast, types.NewFieldType(mysql.TypeJSON), binaryStringColumn) + require.NoError(t, err) + exprs = append(exprs, function) + + // CastTimeAsJson + function, err = NewFunction(mock.NewContext(), ast.Cast, types.NewFieldType(mysql.TypeJSON), datetimeColumn) + require.NoError(t, err) + exprs = append(exprs, function) + + // CastDurationAsJson + function, err = NewFunction(mock.NewContext(), ast.Cast, types.NewFieldType(mysql.TypeJSON), durationColumn) + require.NoError(t, err) + exprs = append(exprs, function) + + // CastJsonAsJson + function, err = NewFunction(mock.NewContext(), ast.Cast, types.NewFieldType(mysql.TypeJSON), jsonColumn) + require.NoError(t, err) + exprs = append(exprs, function) + + pushed, remained = PushDownExprs(ctx, exprs, client, kv.TiFlash) require.Len(t, pushed, len(exprs)) require.Len(t, remained, 0) - pushed, remained = PushDownExprsWithExtraInfo(sc, exprs, client, kv.TiFlash, true) + pushed, remained = PushDownExprsWithExtraInfo(ctx, exprs, client, kv.TiFlash, true) require.Len(t, pushed, len(exprs)) require.Len(t, remained, 0) } func TestExprOnlyPushDownToFlash(t *testing.T) { t.Skip("Skip this unstable test temporarily and bring it back before 2021-07-26") - sc := stmtctx.NewStmtCtx() client := new(mock.Client) exprs := make([]Expression, 0) @@ -1343,33 +1414,32 @@ func TestExprOnlyPushDownToFlash(t *testing.T) { require.NoError(t, err) exprs = append(exprs, function) - pushed, remained := PushDownExprs(sc, exprs, client, kv.UnSpecified) + pushed, remained := PushDownExprs(mock.NewContext(), exprs, client, kv.UnSpecified) require.Len(t, pushed, len(exprs)) require.Len(t, remained, 0) - canPush := CanExprsPushDown(sc, exprs, client, kv.TiFlash) + canPush := CanExprsPushDown(mock.NewContext(), exprs, client, kv.TiFlash) require.Equal(t, true, canPush) - canPush = CanExprsPushDown(sc, exprs, client, kv.TiKV) + canPush = CanExprsPushDown(mock.NewContext(), exprs, client, kv.TiKV) require.Equal(t, false, canPush) - pushed, remained = PushDownExprs(sc, exprs, client, kv.TiFlash) + pushed, remained = PushDownExprs(mock.NewContext(), exprs, client, kv.TiFlash) require.Len(t, pushed, len(exprs)) require.Len(t, remained, 0) - pushed, remained = PushDownExprs(sc, exprs, client, kv.TiKV) + pushed, remained = PushDownExprs(mock.NewContext(), exprs, client, kv.TiKV) require.Len(t, pushed, 0) require.Len(t, remained, len(exprs)) } func TestExprPushDownToTiKV(t *testing.T) { - sc := stmtctx.NewStmtCtx() client := new(mock.Client) exprs := make([]Expression, 0) //jsonColumn := genColumn(mysql.TypeJSON, 1) intColumn := genColumn(mysql.TypeLonglong, 2) - //realColumn := genColumn(mysql.TypeDouble, 3) + realColumn := genColumn(mysql.TypeDouble, 3) //decimalColumn := genColumn(mysql.TypeNewDecimal, 4) stringColumn := genColumn(mysql.TypeString, 5) //datetimeColumn := genColumn(mysql.TypeDatetime, 6) @@ -1410,7 +1480,7 @@ func TestExprPushDownToTiKV(t *testing.T) { require.NoError(t, err) exprs = append(exprs, function) - pushed, remained := PushDownExprs(sc, exprs, client, kv.TiKV) + pushed, remained := PushDownExprs(mock.NewContext(), exprs, client, kv.TiKV) require.Len(t, pushed, 0) require.Len(t, remained, len(exprs)) @@ -1536,97 +1606,118 @@ func TestExprPushDownToTiKV(t *testing.T) { retType: types.NewFieldType(mysql.TypeInt24), args: []Expression{intColumn, intColumn}, }, + { + functionName: ast.Upper, + retType: types.NewFieldType(mysql.TypeString), + args: []Expression{stringColumn}, + }, + { + functionName: ast.Lower, + retType: types.NewFieldType(mysql.TypeString), + args: []Expression{stringColumn}, + }, + { + functionName: ast.Pow, + retType: types.NewFieldType(mysql.TypeDouble), + args: []Expression{realColumn, realColumn}, + }, + { + functionName: ast.Power, + retType: types.NewFieldType(mysql.TypeDouble), + args: []Expression{realColumn, realColumn}, + }, } + ctx := mock.NewContext() for _, tc := range testcases { - function, err = NewFunction(mock.NewContext(), tc.functionName, tc.retType, tc.args...) + function, err = NewFunction(ctx, tc.functionName, tc.retType, tc.args...) require.NoError(t, err) exprs = append(exprs, function) } - pushed, remained = PushDownExprs(sc, exprs, client, kv.TiKV) + pushed, remained = PushDownExprs(ctx, exprs, client, kv.TiKV) require.Len(t, pushed, len(exprs)) require.Len(t, remained, 0) } func TestExprOnlyPushDownToTiKV(t *testing.T) { - sc := stmtctx.NewStmtCtx() + ctx := mock.NewContext() client := new(mock.Client) - function, err := NewFunction(mock.NewContext(), "uuid", types.NewFieldType(mysql.TypeLonglong)) + function, err := NewFunction(ctx, "uuid", types.NewFieldType(mysql.TypeLonglong)) require.NoError(t, err) var exprs = make([]Expression, 0) exprs = append(exprs, function) - pushed, remained := PushDownExprs(sc, exprs, client, kv.UnSpecified) + pushed, remained := PushDownExprs(ctx, exprs, client, kv.UnSpecified) require.Len(t, pushed, 1) require.Len(t, remained, 0) - canPush := CanExprsPushDown(sc, exprs, client, kv.TiFlash) + canPush := CanExprsPushDown(ctx, exprs, client, kv.TiFlash) require.Equal(t, false, canPush) - canPush = CanExprsPushDown(sc, exprs, client, kv.TiKV) + canPush = CanExprsPushDown(ctx, exprs, client, kv.TiKV) require.Equal(t, true, canPush) - pushed, remained = PushDownExprs(sc, exprs, client, kv.TiFlash) + pushed, remained = PushDownExprs(ctx, exprs, client, kv.TiFlash) require.Len(t, pushed, 0) require.Len(t, remained, 1) - pushed, remained = PushDownExprs(sc, exprs, client, kv.TiKV) + pushed, remained = PushDownExprs(ctx, exprs, client, kv.TiKV) require.Len(t, pushed, 1) require.Len(t, remained, 0) } func TestGroupByItem2Pb(t *testing.T) { - sc := stmtctx.NewStmtCtx() + ctx := mock.NewContext() client := new(mock.Client) item := genColumn(mysql.TypeDouble, 0) - pbByItem := GroupByItemToPB(sc, client, item) + pbByItem := GroupByItemToPB(ctx, client, item) js, err := json.Marshal(pbByItem) require.NoError(t, err) require.Equal(t, "{\"expr\":{\"tp\":201,\"val\":\"gAAAAAAAAAA=\",\"sig\":0,\"field_type\":{\"tp\":5,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":-63,\"charset\":\"binary\",\"array\":false},\"has_distinct\":false},\"desc\":false}", string(js)) item = genColumn(mysql.TypeDouble, 1) - pbByItem = GroupByItemToPB(sc, client, item) + pbByItem = GroupByItemToPB(ctx, client, item) js, err = json.Marshal(pbByItem) require.NoError(t, err) require.Equal(t, "{\"expr\":{\"tp\":201,\"val\":\"gAAAAAAAAAE=\",\"sig\":0,\"field_type\":{\"tp\":5,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":-63,\"charset\":\"binary\",\"array\":false},\"has_distinct\":false},\"desc\":false}", string(js)) } func TestSortByItem2Pb(t *testing.T) { - sc := stmtctx.NewStmtCtx() + ctx := mock.NewContext() client := new(mock.Client) item := genColumn(mysql.TypeDouble, 0) - pbByItem := SortByItemToPB(sc, client, item, false) + pbByItem := SortByItemToPB(ctx, client, item, false) js, err := json.Marshal(pbByItem) require.NoError(t, err) require.Equal(t, "{\"expr\":{\"tp\":201,\"val\":\"gAAAAAAAAAA=\",\"sig\":0,\"field_type\":{\"tp\":5,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":-63,\"charset\":\"binary\",\"array\":false},\"has_distinct\":false},\"desc\":false}", string(js)) item = genColumn(mysql.TypeDouble, 1) - pbByItem = SortByItemToPB(sc, client, item, false) + pbByItem = SortByItemToPB(ctx, client, item, false) js, err = json.Marshal(pbByItem) require.NoError(t, err) require.Equal(t, "{\"expr\":{\"tp\":201,\"val\":\"gAAAAAAAAAE=\",\"sig\":0,\"field_type\":{\"tp\":5,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":-63,\"charset\":\"binary\",\"array\":false},\"has_distinct\":false},\"desc\":false}", string(js)) item = genColumn(mysql.TypeDouble, 1) - pbByItem = SortByItemToPB(sc, client, item, true) + pbByItem = SortByItemToPB(ctx, client, item, true) js, err = json.Marshal(pbByItem) require.NoError(t, err) require.Equal(t, "{\"expr\":{\"tp\":201,\"val\":\"gAAAAAAAAAE=\",\"sig\":0,\"field_type\":{\"tp\":5,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":-63,\"charset\":\"binary\",\"array\":false},\"has_distinct\":false},\"desc\":true}", string(js)) } func TestPushCollationDown(t *testing.T) { - fc, err := NewFunction(mock.NewContext(), ast.EQ, types.NewFieldType(mysql.TypeUnspecified), genColumn(mysql.TypeVarchar, 0), genColumn(mysql.TypeVarchar, 1)) + ctx := mock.NewContext() + fc, err := NewFunction(ctx, ast.EQ, types.NewFieldType(mysql.TypeUnspecified), genColumn(mysql.TypeVarchar, 0), genColumn(mysql.TypeVarchar, 1)) require.NoError(t, err) client := new(mock.Client) - sc := stmtctx.NewStmtCtx() tps := []*types.FieldType{types.NewFieldType(mysql.TypeVarchar), types.NewFieldType(mysql.TypeVarchar)} for _, coll := range []string{charset.CollationBin, charset.CollationLatin1, charset.CollationUTF8, charset.CollationUTF8MB4} { fc.SetCharsetAndCollation("binary", coll) // only collation matters - pbExpr, err := ExpressionsToPBList(sc, []Expression{fc}, client) + pbExpr, err := ExpressionsToPBList(ctx, []Expression{fc}, client) require.NoError(t, err) - expr, err := PBToExpr(pbExpr[0], tps, sc) + expr, err := PBToExpr(ctx, pbExpr[0], tps) require.NoError(t, err) _, eColl := expr.CharsetAndCollation() require.Equal(t, coll, eColl) @@ -1641,7 +1732,7 @@ func columnCollation(c *Column, chs, coll string) *Column { func TestNewCollationsEnabled(t *testing.T) { var colExprs []Expression - sc := stmtctx.NewStmtCtx() + ctx := mock.NewContext() client := new(mock.Client) colExprs = colExprs[:0] @@ -1652,9 +1743,9 @@ func TestNewCollationsEnabled(t *testing.T) { colExprs = append(colExprs, columnCollation(genColumn(mysql.TypeVarchar, 5), "utf8", "utf8_bin")) colExprs = append(colExprs, columnCollation(genColumn(mysql.TypeVarchar, 6), "utf8", "utf8_unicode_ci")) colExprs = append(colExprs, columnCollation(genColumn(mysql.TypeVarchar, 7), "utf8mb4", "utf8mb4_zh_pinyin_tidb_as_cs")) - pushed, _ := PushDownExprs(sc, colExprs, client, kv.UnSpecified) + pushed, _ := PushDownExprs(ctx, colExprs, client, kv.UnSpecified) require.Equal(t, len(colExprs), len(pushed)) - pbExprs, err := ExpressionsToPBList(sc, colExprs, client) + pbExprs, err := ExpressionsToPBList(ctx, colExprs, client) require.NoError(t, err) jsons := []string{ "{\"tp\":201,\"val\":\"gAAAAAAAAAE=\",\"sig\":0,\"field_type\":{\"tp\":15,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":-46,\"charset\":\"utf8mb4\",\"array\":false},\"has_distinct\":false}", @@ -1673,14 +1764,14 @@ func TestNewCollationsEnabled(t *testing.T) { } item := columnCollation(genColumn(mysql.TypeDouble, 0), "utf8mb4", "utf8mb4_0900_ai_ci") - pbByItem := GroupByItemToPB(sc, client, item) + pbByItem := GroupByItemToPB(ctx, client, item) js, err := json.Marshal(pbByItem) require.NoError(t, err) require.Equal(t, "{\"expr\":{\"tp\":201,\"val\":\"gAAAAAAAAAA=\",\"sig\":0,\"field_type\":{\"tp\":5,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":-255,\"charset\":\"utf8mb4\",\"array\":false},\"has_distinct\":false},\"desc\":false}", string(js)) } func TestMetadata(t *testing.T) { - sc := stmtctx.NewStmtCtx() + ctx := mock.NewContext() client := new(mock.Client) require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/expression/PushDownTestSwitcher", `return("all")`)) @@ -1688,7 +1779,7 @@ func TestMetadata(t *testing.T) { require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/expression/PushDownTestSwitcher")) }() - pc := PbConverter{client: client, sc: sc} + pc := PbConverter{client: client, ctx: ctx} metadata := new(tipb.InUnionMetadata) var err error @@ -1722,7 +1813,7 @@ func TestMetadata(t *testing.T) { func TestPushDownSwitcher(t *testing.T) { var funcs = make([]Expression, 0) - sc := stmtctx.NewStmtCtx() + ctx := mock.NewContext() client := new(mock.Client) cases := []struct { @@ -1758,7 +1849,7 @@ func TestPushDownSwitcher(t *testing.T) { require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/expression/PushDownTestSwitcher")) }() - pbExprs, err := ExpressionsToPBList(sc, funcs, client) + pbExprs, err := ExpressionsToPBList(ctx, funcs, client) require.NoError(t, err) require.Equal(t, len(cases), len(pbExprs)) for i, pbExpr := range pbExprs { @@ -1767,7 +1858,7 @@ func TestPushDownSwitcher(t *testing.T) { // All disabled require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/expression/PushDownTestSwitcher", `return("")`)) - pc := PbConverter{client: client, sc: sc} + pc := PbConverter{client: client, ctx: ctx} for i := range funcs { pbExpr := pc.ExprToPB(funcs[i]) require.Nil(t, pbExpr) @@ -1803,6 +1894,6 @@ func TestPanicIfPbCodeUnspecified(t *testing.T) { defer func() { require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/expression/PanicIfPbCodeUnspecified")) }() - pc := PbConverter{client: new(mock.Client), sc: stmtctx.NewStmtCtx()} + pc := PbConverter{client: new(mock.Client), ctx: mock.NewContext()} require.PanicsWithError(t, "unspecified PbCode: *expression.builtinBitAndSig", func() { pc.ExprToPB(fn) }) } diff --git a/pkg/expression/expression.go b/pkg/expression/expression.go index ff48cae555dff..97c83bf45e033 100644 --- a/pkg/expression/expression.go +++ b/pkg/expression/expression.go @@ -17,16 +17,9 @@ package expression import ( goJSON "encoding/json" "fmt" - "strconv" - "strings" - "sync/atomic" - "github.com/gogo/protobuf/proto" "github.com/pingcap/errors" - "github.com/pingcap/failpoint" - "github.com/pingcap/tidb/pkg/kv" "github.com/pingcap/tidb/pkg/parser/ast" - "github.com/pingcap/tidb/pkg/parser/charset" "github.com/pingcap/tidb/pkg/parser/model" "github.com/pingcap/tidb/pkg/parser/mysql" "github.com/pingcap/tidb/pkg/parser/opcode" @@ -36,11 +29,8 @@ import ( "github.com/pingcap/tidb/pkg/types" "github.com/pingcap/tidb/pkg/util/chunk" "github.com/pingcap/tidb/pkg/util/generatedexpr" - "github.com/pingcap/tidb/pkg/util/logutil" "github.com/pingcap/tidb/pkg/util/size" "github.com/pingcap/tidb/pkg/util/zeropool" - "github.com/pingcap/tipb/go-tipb" - "go.uber.org/zap" ) // These are byte flags used for `HashCode()`. @@ -68,34 +58,25 @@ type VecExpr interface { Vectorized() bool // VecEvalInt evaluates this expression in a vectorized manner. - VecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error + VecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error // VecEvalReal evaluates this expression in a vectorized manner. - VecEvalReal(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error + VecEvalReal(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error // VecEvalString evaluates this expression in a vectorized manner. - VecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error + VecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error // VecEvalDecimal evaluates this expression in a vectorized manner. - VecEvalDecimal(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error + VecEvalDecimal(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error // VecEvalTime evaluates this expression in a vectorized manner. - VecEvalTime(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error + VecEvalTime(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error // VecEvalDuration evaluates this expression in a vectorized manner. - VecEvalDuration(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error + VecEvalDuration(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error // VecEvalJSON evaluates this expression in a vectorized manner. - VecEvalJSON(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error -} - -// ReverseExpr contains all resersed evaluation methods. -type ReverseExpr interface { - // SupportReverseEval checks whether the builtinFunc support reverse evaluation. - SupportReverseEval() bool - - // ReverseEval evaluates the only one column value with given function result. - ReverseEval(sc *stmtctx.StatementContext, res types.Datum, rType types.RoundingType) (val types.Datum, err error) + VecEvalJSON(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error } // TraverseAction define the interface for action when traversing down an expression. @@ -103,44 +84,56 @@ type TraverseAction interface { Transform(Expression) Expression } +// ConstLevel indicates the const level for an expression +type ConstLevel uint + +const ( + // ConstNone indicates the expression is not a constant expression. + // The evaluation result may be different for different input rows. + // e.g. `col_a * 2`, `substring(col_b, 5, 3)`. + ConstNone ConstLevel = iota + // ConstOnlyInContext indicates the expression is only a constant for a same context. + // This is mainly for Plan Cache, e.g. `prepare st from 'select * from t where a<1+?'`, where + // the value of `?` may change between different Contexts (executions). + ConstOnlyInContext + // ConstStrict indicates the expression is a constant expression. + // The evaluation result is always the same no matter the input context or rows. + // e.g. `1 + 2`, `substring("TiDB SQL Tutorial", 5, 3) + 'abcde'` + ConstStrict +) + // Expression represents all scalar expression in SQL. type Expression interface { fmt.Stringer goJSON.Marshaler VecExpr - ReverseExpr CollationInfo Traverse(TraverseAction) Expression - // EvalWithInnerCtx evaluates expression with inner ctx. - // Deprecated: This function is only used during refactoring, please do not use it in new code. - // TODO: remove this method after refactoring. - EvalWithInnerCtx(row chunk.Row) (types.Datum, error) - // Eval evaluates an expression through a row. - Eval(ctx sessionctx.Context, row chunk.Row) (types.Datum, error) + Eval(ctx EvalContext, row chunk.Row) (types.Datum, error) // EvalInt returns the int64 representation of expression. - EvalInt(ctx sessionctx.Context, row chunk.Row) (val int64, isNull bool, err error) + EvalInt(ctx EvalContext, row chunk.Row) (val int64, isNull bool, err error) // EvalReal returns the float64 representation of expression. - EvalReal(ctx sessionctx.Context, row chunk.Row) (val float64, isNull bool, err error) + EvalReal(ctx EvalContext, row chunk.Row) (val float64, isNull bool, err error) // EvalString returns the string representation of expression. - EvalString(ctx sessionctx.Context, row chunk.Row) (val string, isNull bool, err error) + EvalString(ctx EvalContext, row chunk.Row) (val string, isNull bool, err error) // EvalDecimal returns the decimal representation of expression. - EvalDecimal(ctx sessionctx.Context, row chunk.Row) (val *types.MyDecimal, isNull bool, err error) + EvalDecimal(ctx EvalContext, row chunk.Row) (val *types.MyDecimal, isNull bool, err error) // EvalTime returns the DATE/DATETIME/TIMESTAMP representation of expression. - EvalTime(ctx sessionctx.Context, row chunk.Row) (val types.Time, isNull bool, err error) + EvalTime(ctx EvalContext, row chunk.Row) (val types.Time, isNull bool, err error) // EvalDuration returns the duration representation of expression. - EvalDuration(ctx sessionctx.Context, row chunk.Row) (val types.Duration, isNull bool, err error) + EvalDuration(ctx EvalContext, row chunk.Row) (val types.Duration, isNull bool, err error) // EvalJSON returns the JSON representation of expression. - EvalJSON(ctx sessionctx.Context, row chunk.Row) (val types.BinaryJSON, isNull bool, err error) + EvalJSON(ctx EvalContext, row chunk.Row) (val types.BinaryJSON, isNull bool, err error) // GetType gets the type that the expression returns. GetType() *types.FieldType @@ -149,20 +142,13 @@ type Expression interface { Clone() Expression // Equal checks whether two expressions are equal. - Equal(ctx sessionctx.Context, e Expression) bool + Equal(ctx EvalContext, e Expression) bool // IsCorrelated checks if this expression has correlated key. IsCorrelated() bool - // ConstItem checks if this expression is constant item, regardless of query evaluation state. - // An expression is constant item if it: - // refers no tables. - // refers no correlated column. - // refers no subqueries that refers any tables. - // refers no non-deterministic functions. - // refers no statement parameters. - // refers no param markers when prepare plan cache is enabled. - ConstItem(sc *stmtctx.StatementContext) bool + // ConstLevel returns the const level of the expression. + ConstLevel() ConstLevel // Decorrelate try to decorrelate the expression by schema. Decorrelate(schema *Schema) Expression @@ -174,16 +160,16 @@ type Expression interface { resolveIndices(schema *Schema) error // ResolveIndicesByVirtualExpr resolves indices by the given schema in terms of virual expression. It will copy the original expression and return the copied one. - ResolveIndicesByVirtualExpr(ctx sessionctx.Context, schema *Schema) (Expression, bool) + ResolveIndicesByVirtualExpr(ctx EvalContext, schema *Schema) (Expression, bool) // resolveIndicesByVirtualExpr is called inside the `ResolveIndicesByVirtualExpr` It will perform on the expression itself. - resolveIndicesByVirtualExpr(ctx sessionctx.Context, schema *Schema) bool + resolveIndicesByVirtualExpr(ctx EvalContext, schema *Schema) bool // RemapColumn remaps columns with provided mapping and returns new expression RemapColumn(map[int64]*Column) (Expression, error) // ExplainInfo returns operator information to be explained. - ExplainInfo() string + ExplainInfo(ctx EvalContext) string // ExplainNormalizedInfo returns operator normalized information for generating digest. ExplainNormalizedInfo() string @@ -251,23 +237,11 @@ func ExprNotNull(expr Expression) bool { return mysql.HasNotNullFlag(expr.GetType().GetFlag()) } -// HandleOverflowOnSelection handles Overflow errors when evaluating selection filters. -// We should ignore overflow errors when evaluating selection conditions: -// -// INSERT INTO t VALUES ("999999999999999999"); -// SELECT * FROM t WHERE v; -func HandleOverflowOnSelection(sc *stmtctx.StatementContext, val int64, err error) (int64, error) { - if sc.InSelectStmt && err != nil && types.ErrOverflow.Equal(err) { - return -1, nil - } - return val, err -} - // EvalBool evaluates expression list to a boolean value. The first returned value // indicates bool result of the expression list, the second returned value indicates // whether the result of the expression list is null, it can only be true when the // first returned values is false. -func EvalBool(ctx sessionctx.Context, exprList CNFExprs, row chunk.Row) (bool, bool, error) { +func EvalBool(ctx EvalContext, exprList CNFExprs, row chunk.Row) (bool, bool, error) { hasNull := false for _, expr := range exprList { data, err := expr.Eval(ctx, row) @@ -289,10 +263,7 @@ func EvalBool(ctx sessionctx.Context, exprList CNFExprs, row chunk.Row) (bool, b i, err := data.ToBool(ctx.GetSessionVars().StmtCtx.TypeCtx()) if err != nil { - i, err = HandleOverflowOnSelection(ctx.GetSessionVars().StmtCtx, i, err) - if err != nil { - return false, false, err - } + return false, false, err } if i == 0 { return false, false, nil @@ -341,7 +312,7 @@ func deallocateZeroSlice(isZero []int8) { } // VecEvalBool does the same thing as EvalBool but it works in a vectorized manner. -func VecEvalBool(ctx sessionctx.Context, exprList CNFExprs, input *chunk.Chunk, selected, nulls []bool) ([]bool, []bool, error) { +func VecEvalBool(ctx EvalContext, exprList CNFExprs, input *chunk.Chunk, selected, nulls []bool) ([]bool, []bool, error) { // If input.Sel() != nil, we will call input.SetSel(nil) to clear the sel slice in input chunk. // After the function finished, then we reset the input.Sel(). // The caller will handle the input.Sel() and selected slices. @@ -555,7 +526,7 @@ func toBool(sc *stmtctx.StatementContext, tp *types.FieldType, eType types.EvalT return nil } -func implicitEvalReal(ctx sessionctx.Context, expr Expression, input *chunk.Chunk, result *chunk.Column) (err error) { +func implicitEvalReal(ctx EvalContext, expr Expression, input *chunk.Chunk, result *chunk.Column) (err error) { if expr.Vectorized() && ctx.GetSessionVars().EnableVectorizedExpression { err = expr.VecEvalReal(ctx, input, result) } else { @@ -584,7 +555,7 @@ func implicitEvalReal(ctx sessionctx.Context, expr Expression, input *chunk.Chun // the environment variables and whether the expression can be vectorized. // Note: the input argument `evalType` is needed because of that when `expr` is // of the hybrid type(ENUM/SET/BIT), we need the invoker decide the actual EvalType. -func EvalExpr(ctx sessionctx.Context, expr Expression, evalType types.EvalType, input *chunk.Chunk, result *chunk.Column) (err error) { +func EvalExpr(ctx EvalContext, expr Expression, evalType types.EvalType, input *chunk.Chunk, result *chunk.Column) (err error) { if expr.Vectorized() && ctx.GetSessionVars().EnableVectorizedExpression { switch evalType { case types.ETInt: @@ -857,7 +828,7 @@ func evaluateExprWithNull(ctx sessionctx.Context, schema *Schema, expr Expressio return &Constant{Value: types.Datum{}, RetType: types.NewFieldType(mysql.TypeNull)} case *Constant: if x.DeferredExpr != nil { - return FoldConstant(x) + return FoldConstant(ctx, x) } } return expr @@ -922,7 +893,7 @@ func evaluateExprWithNullInNullRejectCheck(ctx sessionctx.Context, schema *Schem return &Constant{Value: types.Datum{}, RetType: types.NewFieldType(mysql.TypeNull)}, true case *Constant: if x.DeferredExpr != nil { - return FoldConstant(x), false + return FoldConstant(ctx, x), false } } return expr, false @@ -1045,7 +1016,6 @@ func NewValuesFunc(ctx sessionctx.Context, offset int, retTp *types.FieldType) * FuncName: model.NewCIStr(ast.Values), RetType: retTp, Function: bt, - ctx: ctx, } } @@ -1055,440 +1025,6 @@ func IsBinaryLiteral(expr Expression) bool { return ok && con.Value.Kind() == types.KindBinaryLiteral } -// supported functions tracked by https://github.com/tikv/tikv/issues/5751 -func scalarExprSupportedByTiKV(sf *ScalarFunction) bool { - switch sf.FuncName.L { - case - // op functions. - ast.LogicAnd, ast.LogicOr, ast.LogicXor, ast.UnaryNot, ast.And, ast.Or, ast.Xor, ast.BitNeg, ast.LeftShift, ast.RightShift, ast.UnaryMinus, - - // compare functions. - ast.LT, ast.LE, ast.EQ, ast.NE, ast.GE, ast.GT, ast.NullEQ, ast.In, ast.IsNull, ast.Like, ast.IsTruthWithoutNull, ast.IsTruthWithNull, ast.IsFalsity, - // ast.Greatest, ast.Least, ast.Interval - - // arithmetical functions. - ast.PI, /* ast.Truncate */ - ast.Plus, ast.Minus, ast.Mul, ast.Div, ast.Abs, ast.Mod, - - // math functions. - ast.Ceil, ast.Ceiling, ast.Floor, ast.Sqrt, ast.Sign, ast.Ln, ast.Log, ast.Log2, ast.Log10, ast.Exp, ast.Pow, - - // Rust use the llvm math functions, which have different precision with Golang/MySQL(cmath) - // open the following switchers if we implement them in coprocessor via `cmath` - ast.Sin, ast.Asin, ast.Cos, ast.Acos /* ast.Tan */, ast.Atan, ast.Atan2, ast.Cot, - ast.Radians, ast.Degrees, ast.Conv, ast.CRC32, - - // control flow functions. - ast.Case, ast.If, ast.Ifnull, ast.Coalesce, - - // string functions. - // ast.Bin, ast.Unhex, ast.Locate, ast.Ord, ast.Lpad, ast.Rpad, - // ast.Trim, ast.FromBase64, ast.ToBase64, ast.Upper, ast.Lower, ast.InsertFunc, - // ast.MakeSet, ast.SubstringIndex, ast.Instr, ast.Quote, ast.Oct, - // ast.FindInSet, ast.Repeat, - ast.Length, ast.BitLength, ast.Concat, ast.ConcatWS, ast.Replace, ast.ASCII, ast.Hex, - ast.Reverse, ast.LTrim, ast.RTrim, ast.Strcmp, ast.Space, ast.Elt, ast.Field, - InternalFuncFromBinary, InternalFuncToBinary, ast.Mid, ast.Substring, ast.Substr, ast.CharLength, - ast.Right, /* ast.Left */ - - // json functions. - ast.JSONType, ast.JSONExtract, ast.JSONObject, ast.JSONArray, ast.JSONMerge, ast.JSONSet, - ast.JSONInsert /*ast.JSONReplace,*/, ast.JSONRemove, ast.JSONLength, - ast.JSONUnquote, ast.JSONContains, ast.JSONValid, ast.JSONMemberOf, - - // date functions. - ast.Date, ast.Week /* ast.YearWeek, ast.ToSeconds */, ast.DateDiff, - /* ast.TimeDiff, ast.AddTime, ast.SubTime, */ - ast.MonthName, ast.MakeDate, ast.TimeToSec, ast.MakeTime, - ast.DateFormat, - ast.Hour, ast.Minute, ast.Second, ast.MicroSecond, ast.Month, - /* ast.DayName */ ast.DayOfMonth, ast.DayOfWeek, ast.DayOfYear, - /* ast.Weekday */ ast.WeekOfYear, ast.Year, - ast.FromDays, /* ast.ToDays */ - ast.PeriodAdd, ast.PeriodDiff, /*ast.TimestampDiff, ast.DateAdd, ast.FromUnixTime,*/ - /* ast.LastDay */ - ast.Sysdate, - - // encryption functions. - ast.MD5, ast.SHA1, ast.UncompressedLength, - - ast.Cast, - - // misc functions. - // TODO(#26942): enable functions below after them are fully tested in TiKV. - /*ast.InetNtoa, ast.InetAton, ast.Inet6Ntoa, ast.Inet6Aton, ast.IsIPv4, ast.IsIPv4Compat, ast.IsIPv4Mapped, ast.IsIPv6,*/ - ast.UUID: - - return true - case ast.Round: - switch sf.Function.PbCode() { - case tipb.ScalarFuncSig_RoundReal, tipb.ScalarFuncSig_RoundInt, tipb.ScalarFuncSig_RoundDec: - // We don't push round with frac due to mysql's round with frac has its special behavior: - // https://dev.mysql.com/doc/refman/5.7/en/mathematical-functions.html#function_round - return true - } - case ast.Rand: - switch sf.Function.PbCode() { - case tipb.ScalarFuncSig_RandWithSeedFirstGen: - return true - } - case ast.Regexp, ast.RegexpLike, ast.RegexpSubstr, ast.RegexpInStr, ast.RegexpReplace: - funcCharset, funcCollation := sf.Function.CharsetAndCollation() - if funcCharset == charset.CharsetBin && funcCollation == charset.CollationBin { - return false - } - return true - } - return false -} - -func canEnumPushdownPreliminarily(scalarFunc *ScalarFunction) bool { - switch scalarFunc.FuncName.L { - case ast.Cast: - return scalarFunc.RetType.EvalType() == types.ETInt || scalarFunc.RetType.EvalType() == types.ETReal || scalarFunc.RetType.EvalType() == types.ETDecimal - default: - return false - } -} - -func scalarExprSupportedByFlash(function *ScalarFunction) bool { - switch function.FuncName.L { - case ast.Floor, ast.Ceil, ast.Ceiling: - switch function.Function.PbCode() { - case tipb.ScalarFuncSig_FloorIntToDec, tipb.ScalarFuncSig_CeilIntToDec: - return false - default: - return true - } - case - ast.LogicOr, ast.LogicAnd, ast.UnaryNot, ast.BitNeg, ast.Xor, ast.And, ast.Or, ast.RightShift, ast.LeftShift, - ast.GE, ast.LE, ast.EQ, ast.NE, ast.LT, ast.GT, ast.In, ast.IsNull, ast.Like, ast.Ilike, ast.Strcmp, - ast.Plus, ast.Minus, ast.Div, ast.Mul, ast.Abs, ast.Mod, - ast.If, ast.Ifnull, ast.Case, - ast.Concat, ast.ConcatWS, - ast.Date, ast.Year, ast.Month, ast.Day, ast.Quarter, ast.DayName, ast.MonthName, - ast.DateDiff, ast.TimestampDiff, ast.DateFormat, ast.FromUnixTime, - ast.DayOfWeek, ast.DayOfMonth, ast.DayOfYear, ast.LastDay, ast.WeekOfYear, ast.ToSeconds, - ast.FromDays, ast.ToDays, - - ast.Sqrt, ast.Log, ast.Log2, ast.Log10, ast.Ln, ast.Exp, ast.Pow, ast.Sign, - ast.Radians, ast.Degrees, ast.Conv, ast.CRC32, - ast.JSONLength, ast.JSONExtract, ast.JSONUnquote, ast.JSONArray, ast.Repeat, - ast.InetNtoa, ast.InetAton, ast.Inet6Ntoa, ast.Inet6Aton, - ast.Coalesce, ast.ASCII, ast.Length, ast.Trim, ast.Position, ast.Format, ast.Elt, - ast.LTrim, ast.RTrim, ast.Lpad, ast.Rpad, - ast.Hour, ast.Minute, ast.Second, ast.MicroSecond, - ast.TimeToSec: - switch function.Function.PbCode() { - case tipb.ScalarFuncSig_InDuration, - tipb.ScalarFuncSig_CoalesceDuration, - tipb.ScalarFuncSig_IfNullDuration, - tipb.ScalarFuncSig_IfDuration, - tipb.ScalarFuncSig_CaseWhenDuration: - return false - case tipb.ScalarFuncSig_JsonUnquoteSig: - // TiFlash json_unquote now only supports json string generated by cast(json as string) - if childFunc, ok := function.GetArgs()[0].(*ScalarFunction); ok { - return childFunc.Function.PbCode() == tipb.ScalarFuncSig_CastJsonAsString - } - return false - } - return true - case ast.Regexp, ast.RegexpLike, ast.RegexpInStr, ast.RegexpSubstr, ast.RegexpReplace: - funcCharset, funcCollation := function.Function.CharsetAndCollation() - if funcCharset == charset.CharsetBin && funcCollation == charset.CollationBin { - return false - } - return true - case ast.Substr, ast.Substring, ast.Left, ast.Right, ast.CharLength, ast.SubstringIndex, ast.Reverse: - switch function.Function.PbCode() { - case - tipb.ScalarFuncSig_LeftUTF8, - tipb.ScalarFuncSig_RightUTF8, - tipb.ScalarFuncSig_CharLengthUTF8, - tipb.ScalarFuncSig_Substring2ArgsUTF8, - tipb.ScalarFuncSig_Substring3ArgsUTF8, - tipb.ScalarFuncSig_SubstringIndex, - tipb.ScalarFuncSig_ReverseUTF8, - tipb.ScalarFuncSig_Reverse: - return true - } - case ast.Cast: - sourceType := function.GetArgs()[0].GetType() - retType := function.RetType - switch function.Function.PbCode() { - case tipb.ScalarFuncSig_CastDecimalAsInt, tipb.ScalarFuncSig_CastIntAsInt, tipb.ScalarFuncSig_CastRealAsInt, tipb.ScalarFuncSig_CastTimeAsInt, - tipb.ScalarFuncSig_CastStringAsInt /*, tipb.ScalarFuncSig_CastDurationAsInt, tipb.ScalarFuncSig_CastJsonAsInt*/ : - // TiFlash cast only support cast to Int64 or the source type is the same as the target type - return (sourceType.GetType() == retType.GetType() && mysql.HasUnsignedFlag(sourceType.GetFlag()) == mysql.HasUnsignedFlag(retType.GetFlag())) || retType.GetType() == mysql.TypeLonglong - case tipb.ScalarFuncSig_CastIntAsReal, tipb.ScalarFuncSig_CastRealAsReal, tipb.ScalarFuncSig_CastStringAsReal, tipb.ScalarFuncSig_CastTimeAsReal: /*, tipb.ScalarFuncSig_CastDecimalAsReal, - tipb.ScalarFuncSig_CastDurationAsReal, tipb.ScalarFuncSig_CastJsonAsReal*/ - // TiFlash cast only support cast to Float64 or the source type is the same as the target type - return sourceType.GetType() == retType.GetType() || retType.GetType() == mysql.TypeDouble - case tipb.ScalarFuncSig_CastDecimalAsDecimal, tipb.ScalarFuncSig_CastIntAsDecimal, tipb.ScalarFuncSig_CastRealAsDecimal, tipb.ScalarFuncSig_CastTimeAsDecimal, - tipb.ScalarFuncSig_CastStringAsDecimal /*, tipb.ScalarFuncSig_CastDurationAsDecimal, tipb.ScalarFuncSig_CastJsonAsDecimal*/ : - return function.RetType.IsDecimalValid() - case tipb.ScalarFuncSig_CastDecimalAsString, tipb.ScalarFuncSig_CastIntAsString, tipb.ScalarFuncSig_CastRealAsString, tipb.ScalarFuncSig_CastTimeAsString, - tipb.ScalarFuncSig_CastStringAsString, tipb.ScalarFuncSig_CastJsonAsString /*, tipb.ScalarFuncSig_CastDurationAsString*/ : - return true - case tipb.ScalarFuncSig_CastDecimalAsTime, tipb.ScalarFuncSig_CastIntAsTime, tipb.ScalarFuncSig_CastRealAsTime, tipb.ScalarFuncSig_CastTimeAsTime, - tipb.ScalarFuncSig_CastStringAsTime /*, tipb.ScalarFuncSig_CastDurationAsTime, tipb.ScalarFuncSig_CastJsonAsTime*/ : - // ban the function of casting year type as time type pushing down to tiflash because of https://github.com/pingcap/tidb/issues/26215 - return function.GetArgs()[0].GetType().GetType() != mysql.TypeYear - case tipb.ScalarFuncSig_CastTimeAsDuration: - return retType.GetType() == mysql.TypeDuration - } - case ast.DateAdd, ast.AddDate: - switch function.Function.PbCode() { - case tipb.ScalarFuncSig_AddDateDatetimeInt, tipb.ScalarFuncSig_AddDateStringInt, tipb.ScalarFuncSig_AddDateStringReal: - return true - } - case ast.DateSub, ast.SubDate: - switch function.Function.PbCode() { - case tipb.ScalarFuncSig_SubDateDatetimeInt, tipb.ScalarFuncSig_SubDateStringInt, tipb.ScalarFuncSig_SubDateStringReal: - return true - } - case ast.UnixTimestamp: - switch function.Function.PbCode() { - case tipb.ScalarFuncSig_UnixTimestampInt, tipb.ScalarFuncSig_UnixTimestampDec: - return true - } - case ast.Round: - switch function.Function.PbCode() { - case tipb.ScalarFuncSig_RoundInt, tipb.ScalarFuncSig_RoundReal, tipb.ScalarFuncSig_RoundDec, - tipb.ScalarFuncSig_RoundWithFracInt, tipb.ScalarFuncSig_RoundWithFracReal, tipb.ScalarFuncSig_RoundWithFracDec: - return true - } - case ast.Extract: - switch function.Function.PbCode() { - case tipb.ScalarFuncSig_ExtractDatetime, tipb.ScalarFuncSig_ExtractDuration: - return true - } - case ast.Replace: - switch function.Function.PbCode() { - case tipb.ScalarFuncSig_Replace: - return true - } - case ast.StrToDate: - switch function.Function.PbCode() { - case - tipb.ScalarFuncSig_StrToDateDate, - tipb.ScalarFuncSig_StrToDateDatetime: - return true - default: - return false - } - case ast.Upper, ast.Ucase, ast.Lower, ast.Lcase, ast.Space: - return true - case ast.Sysdate: - return true - case ast.Least, ast.Greatest: - switch function.Function.PbCode() { - case tipb.ScalarFuncSig_GreatestInt, tipb.ScalarFuncSig_GreatestReal, - tipb.ScalarFuncSig_LeastInt, tipb.ScalarFuncSig_LeastReal, tipb.ScalarFuncSig_LeastString, tipb.ScalarFuncSig_GreatestString: - return true - } - case ast.IsTruthWithNull, ast.IsTruthWithoutNull, ast.IsFalsity: - return true - case ast.Hex, ast.Unhex, ast.Bin: - return true - case ast.GetFormat: - return true - case ast.IsIPv4, ast.IsIPv6: - return true - case ast.Grouping: // grouping function for grouping sets identification. - return true - } - return false -} - -func scalarExprSupportedByTiDB(function *ScalarFunction) bool { - // TiDB can support all functions, but TiPB may not include some functions. - return scalarExprSupportedByTiKV(function) || scalarExprSupportedByFlash(function) -} - -func canFuncBePushed(sf *ScalarFunction, storeType kv.StoreType) bool { - // Use the failpoint to control whether to push down an expression in the integration test. - // Push down all expression if the `failpoint expression` is `all`, otherwise, check - // whether scalar function's name is contained in the enabled expression list (e.g.`ne,eq,lt`). - // If neither of the above is true, switch to original logic. - failpoint.Inject("PushDownTestSwitcher", func(val failpoint.Value) { - enabled := val.(string) - if enabled == "all" { - failpoint.Return(true) - } - exprs := strings.Split(enabled, ",") - for _, expr := range exprs { - if strings.ToLower(strings.TrimSpace(expr)) == sf.FuncName.L { - failpoint.Return(true) - } - } - failpoint.Return(false) - }) - - ret := false - - switch storeType { - case kv.TiFlash: - ret = scalarExprSupportedByFlash(sf) - case kv.TiKV: - ret = scalarExprSupportedByTiKV(sf) - case kv.TiDB: - ret = scalarExprSupportedByTiDB(sf) - case kv.UnSpecified: - ret = scalarExprSupportedByTiDB(sf) || scalarExprSupportedByTiKV(sf) || scalarExprSupportedByFlash(sf) - } - - if ret { - ret = IsPushDownEnabled(sf.FuncName.L, storeType) - } - return ret -} - -func storeTypeMask(storeType kv.StoreType) uint32 { - if storeType == kv.UnSpecified { - return 1< 10").Rows() + require.Equal(t, "root", fmt.Sprintf("%v", rows[0][2])) + require.Equal(t, "gt(hour(cast(test.t.b, time)), 10)", fmt.Sprintf("%v", rows[0][4])) + tk.MustExec("delete from mysql.expr_pushdown_blacklist where name = '<' and store_type = 'tikv,tiflash,tidb' and reason = 'for test'") tk.MustExec("delete from mysql.expr_pushdown_blacklist where name = 'date_format' and store_type = 'tikv' and reason = 'for test'") + tk.MustExec("delete from mysql.expr_pushdown_blacklist where name = 'Cast.CastTimeAsDuration' and store_type = 'tikv' and reason = 'for test'") tk.MustExec("admin reload expr_pushdown_blacklist") } @@ -2247,11 +2259,11 @@ func TestTimeBuiltin(t *testing.T) { {"\"2011-11-11 10:10:10\"", "\"20\"", "DAY", "2011-12-01 10:10:10", "2011-10-22 10:10:10"}, {"\"2011-11-11 10:10:10\"", "19.88", "DAY", "2011-12-01 10:10:10", "2011-10-22 10:10:10"}, {"\"2011-11-11 10:10:10\"", "\"19.88\"", "DAY", "2011-11-30 10:10:10", "2011-10-23 10:10:10"}, - {"\"2011-11-11 10:10:10\"", "\"prefix19suffix\"", "DAY", "2011-11-30 10:10:10", "2011-10-23 10:10:10"}, + {"\"2011-11-11 10:10:10\"", "\"prefix19suffix\"", "DAY", "2011-11-11 10:10:10", "2011-11-11 10:10:10"}, {"\"2011-11-11 10:10:10\"", "\"20-11\"", "DAY", "2011-12-01 10:10:10", "2011-10-22 10:10:10"}, {"\"2011-11-11 10:10:10\"", "\"20,11\"", "daY", "2011-12-01 10:10:10", "2011-10-22 10:10:10"}, {"\"2011-11-11 10:10:10\"", "\"1000\"", "dAy", "2014-08-07 10:10:10", "2009-02-14 10:10:10"}, - {"\"2011-11-11 10:10:10\"", "\"true\"", "Day", "2011-11-12 10:10:10", "2011-11-10 10:10:10"}, + {"\"2011-11-11 10:10:10\"", "\"true\"", "Day", "2011-11-11 10:10:10", "2011-11-11 10:10:10"}, {"\"2011-11-11 10:10:10\"", "true", "Day", "2011-11-12 10:10:10", "2011-11-10 10:10:10"}, {"\"2011-11-11\"", "1", "DAY", "2011-11-12", "2011-11-10"}, {"\"2011-11-11\"", "10", "HOUR", "2011-11-11 10:00:00", "2011-11-10 14:00:00"}, @@ -2329,8 +2341,8 @@ func TestTimeBuiltin(t *testing.T) { {"\"2009-01-01\"", "6/0", "HOUR_MINUTE", "", ""}, {"\"1970-01-01 12:00:00\"", "CAST(6/4 AS DECIMAL(3,1))", "HOUR_MINUTE", "1970-01-01 13:05:00", "1970-01-01 10:55:00"}, // for issue #8077 - {"\"2012-01-02\"", "\"prefix8\"", "HOUR", "2012-01-02 08:00:00", "2012-01-01 16:00:00"}, - {"\"2012-01-02\"", "\"prefix8prefix\"", "HOUR", "2012-01-02 08:00:00", "2012-01-01 16:00:00"}, + {"\"2012-01-02\"", "\"prefix8\"", "HOUR", "2012-01-02 00:00:00", "2012-01-02 00:00:00"}, + {"\"2012-01-02\"", "\"prefix8prefix\"", "HOUR", "2012-01-02 00:00:00", "2012-01-02 00:00:00"}, {"\"2012-01-02\"", "\"8:00\"", "HOUR", "2012-01-02 08:00:00", "2012-01-01 16:00:00"}, {"\"2012-01-02\"", "\"8:00:00\"", "HOUR", "2012-01-02 08:00:00", "2012-01-01 16:00:00"}, } diff --git a/pkg/expression/integration_test/main_test.go b/pkg/expression/integration_test/main_test.go index 3f9ebf8d7b0df..b5bb1a3b8a5f8 100644 --- a/pkg/expression/integration_test/main_test.go +++ b/pkg/expression/integration_test/main_test.go @@ -44,6 +44,7 @@ func TestMain(m *testing.M) { opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), diff --git a/pkg/expression/main_test.go b/pkg/expression/main_test.go index 8813cba966c88..bff6688b806d6 100644 --- a/pkg/expression/main_test.go +++ b/pkg/expression/main_test.go @@ -47,6 +47,7 @@ func TestMain(m *testing.M) { opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), diff --git a/pkg/expression/scalar_function.go b/pkg/expression/scalar_function.go index 27281648cb4a6..d452cb62c494c 100644 --- a/pkg/expression/scalar_function.go +++ b/pkg/expression/scalar_function.go @@ -26,7 +26,6 @@ import ( "github.com/pingcap/tidb/pkg/parser/mysql" "github.com/pingcap/tidb/pkg/parser/terror" "github.com/pingcap/tidb/pkg/sessionctx" - "github.com/pingcap/tidb/pkg/sessionctx/stmtctx" "github.com/pingcap/tidb/pkg/sessionctx/variable" "github.com/pingcap/tidb/pkg/types" "github.com/pingcap/tidb/pkg/util/chunk" @@ -42,49 +41,48 @@ type ScalarFunction struct { // TODO: Implement type inference here, now we use ast's return type temporarily. RetType *types.FieldType Function builtinFunc - ctx sessionctx.Context hashcode []byte canonicalhashcode []byte } // VecEvalInt evaluates this expression in a vectorized manner. -func (sf *ScalarFunction) VecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (sf *ScalarFunction) VecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { intest.Assert(ctx != nil) return sf.Function.vecEvalInt(ctx, input, result) } // VecEvalReal evaluates this expression in a vectorized manner. -func (sf *ScalarFunction) VecEvalReal(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (sf *ScalarFunction) VecEvalReal(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { intest.Assert(ctx != nil) return sf.Function.vecEvalReal(ctx, input, result) } // VecEvalString evaluates this expression in a vectorized manner. -func (sf *ScalarFunction) VecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (sf *ScalarFunction) VecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { intest.Assert(ctx != nil) return sf.Function.vecEvalString(ctx, input, result) } // VecEvalDecimal evaluates this expression in a vectorized manner. -func (sf *ScalarFunction) VecEvalDecimal(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (sf *ScalarFunction) VecEvalDecimal(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { intest.Assert(ctx != nil) return sf.Function.vecEvalDecimal(ctx, input, result) } // VecEvalTime evaluates this expression in a vectorized manner. -func (sf *ScalarFunction) VecEvalTime(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (sf *ScalarFunction) VecEvalTime(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { intest.Assert(ctx != nil) return sf.Function.vecEvalTime(ctx, input, result) } // VecEvalDuration evaluates this expression in a vectorized manner. -func (sf *ScalarFunction) VecEvalDuration(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (sf *ScalarFunction) VecEvalDuration(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { intest.Assert(ctx != nil) return sf.Function.vecEvalDuration(ctx, input, result) } // VecEvalJSON evaluates this expression in a vectorized manner. -func (sf *ScalarFunction) VecEvalJSON(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (sf *ScalarFunction) VecEvalJSON(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { intest.Assert(ctx != nil) return sf.Function.vecEvalJSON(ctx, input, result) } @@ -99,29 +97,6 @@ func (sf *ScalarFunction) Vectorized() bool { return sf.Function.vectorized() && sf.Function.isChildrenVectorized() } -// SupportReverseEval returns if this expression supports reversed evaluation. -func (sf *ScalarFunction) SupportReverseEval() bool { - switch sf.RetType.GetType() { - case mysql.TypeShort, mysql.TypeLong, mysql.TypeLonglong, - mysql.TypeFloat, mysql.TypeDouble, mysql.TypeNewDecimal: - return sf.Function.supportReverseEval() && sf.Function.isChildrenReversed() - } - return false -} - -// ReverseEval evaluates the only one column value with given function result. -func (sf *ScalarFunction) ReverseEval(sc *stmtctx.StatementContext, res types.Datum, rType types.RoundingType) (val types.Datum, err error) { - return sf.Function.reverseEval(sc, res, rType) -} - -// GetCtx returns the inner context -// Deprecated: we are going to remove ctx from expression completely. -// Do not use this method anymore. -func (sf *ScalarFunction) GetCtx() sessionctx.Context { - intest.Assert(sf.ctx != nil) - return sf.ctx -} - // String implements fmt.Stringer interface. func (sf *ScalarFunction) String() string { var buffer bytes.Buffer @@ -231,9 +206,9 @@ func newFunctionImpl(ctx sessionctx.Context, fold int, funcName string, retType noopFuncsMode := ctx.GetSessionVars().NoopFuncsMode if noopFuncsMode != variable.OnInt { if _, ok := noopFuncs[funcName]; ok { - err := ErrFunctionsNoopImpl.GenWithStackByArgs(funcName) + err := ErrFunctionsNoopImpl.FastGenByArgs(funcName) if noopFuncsMode == variable.OffInt { - return nil, err + return nil, errors.Trace(err) } // NoopFuncsMode is Warn, append an error ctx.GetSessionVars().StmtCtx.AppendWarning(err) @@ -244,6 +219,10 @@ func newFunctionImpl(ctx sessionctx.Context, fold int, funcName string, retType switch funcName { case ast.If, ast.Ifnull, ast.Nullif: // Do nothing. Because it will call InferType4ControlFuncs. + case ast.RowFunc: + // Do nothing. Because it shouldn't use ROW's args to infer null type. + // For example, expression ('abc', 1) = (null, 0). Null's type should be STRING, not INT. + // The type infer happens when converting the expression to ('abc' = null) and (1 = 0). default: typeInferForNull(funcArgs) } @@ -259,15 +238,14 @@ func newFunctionImpl(ctx sessionctx.Context, fold int, funcName string, retType FuncName: model.NewCIStr(funcName), RetType: retType, Function: f, - ctx: ctx, } if fold == 1 { - return FoldConstant(sf), nil + return FoldConstant(ctx, sf), nil } else if fold == -1 { // try to fold constants, and return the original function if errors/warnings occur sc := ctx.GetSessionVars().StmtCtx beforeWarns := sc.WarningCount() - newSf := FoldConstant(sf) + newSf := FoldConstant(ctx, sf) afterWarns := sc.WarningCount() if afterWarns > beforeWarns { sc.TruncateWarnings(int(beforeWarns)) @@ -339,7 +317,6 @@ func (sf *ScalarFunction) Clone() Expression { RetType: sf.RetType, Function: sf.Function.Clone(), hashcode: sf.hashcode, - ctx: sf.ctx, } c.SetCharsetAndCollation(sf.CharsetAndCollation()) c.SetCoercibility(sf.Coercibility()) @@ -353,7 +330,7 @@ func (sf *ScalarFunction) GetType() *types.FieldType { } // Equal implements Expression interface. -func (sf *ScalarFunction) Equal(ctx sessionctx.Context, e Expression) bool { +func (sf *ScalarFunction) Equal(ctx EvalContext, e Expression) bool { intest.Assert(ctx != nil) fun, ok := e.(*ScalarFunction) if !ok { @@ -375,18 +352,26 @@ func (sf *ScalarFunction) IsCorrelated() bool { return false } -// ConstItem implements Expression interface. -func (sf *ScalarFunction) ConstItem(sc *stmtctx.StatementContext) bool { +// ConstLevel returns the const level for the expression +func (sf *ScalarFunction) ConstLevel() ConstLevel { // Note: some unfoldable functions are deterministic, we use unFoldableFunctions here for simplification. if _, ok := unFoldableFunctions[sf.FuncName.L]; ok { - return false + return ConstNone } + + level := ConstStrict for _, arg := range sf.GetArgs() { - if !arg.ConstItem(sc) { - return false + argLevel := arg.ConstLevel() + if argLevel == ConstNone { + return ConstNone + } + + if argLevel < level { + level = argLevel } } - return true + + return level } // Decorrelate implements Expression interface. @@ -402,15 +387,8 @@ func (sf *ScalarFunction) Traverse(action TraverseAction) Expression { return action.Transform(sf) } -// EvalWithInnerCtx evaluates expression with inner ctx. -// Deprecated: This function is only used during refactoring, please do not use it in new code. -// TODO: remove this method after refactoring. -func (sf *ScalarFunction) EvalWithInnerCtx(row chunk.Row) (types.Datum, error) { - return sf.Eval(sf.ctx, row) -} - // Eval implements Expression interface. -func (sf *ScalarFunction) Eval(ctx sessionctx.Context, row chunk.Row) (d types.Datum, err error) { +func (sf *ScalarFunction) Eval(ctx EvalContext, row chunk.Row) (d types.Datum, err error) { var ( res interface{} isNull bool @@ -457,43 +435,43 @@ func (sf *ScalarFunction) Eval(ctx sessionctx.Context, row chunk.Row) (d types.D } // EvalInt implements Expression interface. -func (sf *ScalarFunction) EvalInt(ctx sessionctx.Context, row chunk.Row) (int64, bool, error) { +func (sf *ScalarFunction) EvalInt(ctx EvalContext, row chunk.Row) (int64, bool, error) { intest.Assert(ctx != nil) return sf.Function.evalInt(ctx, row) } // EvalReal implements Expression interface. -func (sf *ScalarFunction) EvalReal(ctx sessionctx.Context, row chunk.Row) (float64, bool, error) { +func (sf *ScalarFunction) EvalReal(ctx EvalContext, row chunk.Row) (float64, bool, error) { intest.Assert(ctx != nil) return sf.Function.evalReal(ctx, row) } // EvalDecimal implements Expression interface. -func (sf *ScalarFunction) EvalDecimal(ctx sessionctx.Context, row chunk.Row) (*types.MyDecimal, bool, error) { +func (sf *ScalarFunction) EvalDecimal(ctx EvalContext, row chunk.Row) (*types.MyDecimal, bool, error) { intest.Assert(ctx != nil) return sf.Function.evalDecimal(ctx, row) } // EvalString implements Expression interface. -func (sf *ScalarFunction) EvalString(ctx sessionctx.Context, row chunk.Row) (string, bool, error) { +func (sf *ScalarFunction) EvalString(ctx EvalContext, row chunk.Row) (string, bool, error) { intest.Assert(ctx != nil) return sf.Function.evalString(ctx, row) } // EvalTime implements Expression interface. -func (sf *ScalarFunction) EvalTime(ctx sessionctx.Context, row chunk.Row) (types.Time, bool, error) { +func (sf *ScalarFunction) EvalTime(ctx EvalContext, row chunk.Row) (types.Time, bool, error) { intest.Assert(ctx != nil) return sf.Function.evalTime(ctx, row) } // EvalDuration implements Expression interface. -func (sf *ScalarFunction) EvalDuration(ctx sessionctx.Context, row chunk.Row) (types.Duration, bool, error) { +func (sf *ScalarFunction) EvalDuration(ctx EvalContext, row chunk.Row) (types.Duration, bool, error) { intest.Assert(ctx != nil) return sf.Function.evalDuration(ctx, row) } // EvalJSON implements Expression interface. -func (sf *ScalarFunction) EvalJSON(ctx sessionctx.Context, row chunk.Row) (types.BinaryJSON, bool, error) { +func (sf *ScalarFunction) EvalJSON(ctx EvalContext, row chunk.Row) (types.BinaryJSON, bool, error) { intest.Assert(ctx != nil) return sf.Function.evalJSON(ctx, row) } @@ -654,13 +632,13 @@ func (sf *ScalarFunction) resolveIndices(schema *Schema) error { } // ResolveIndicesByVirtualExpr implements Expression interface. -func (sf *ScalarFunction) ResolveIndicesByVirtualExpr(ctx sessionctx.Context, schema *Schema) (Expression, bool) { +func (sf *ScalarFunction) ResolveIndicesByVirtualExpr(ctx EvalContext, schema *Schema) (Expression, bool) { newSf := sf.Clone() isOK := newSf.resolveIndicesByVirtualExpr(ctx, schema) return newSf, isOK } -func (sf *ScalarFunction) resolveIndicesByVirtualExpr(ctx sessionctx.Context, schema *Schema) bool { +func (sf *ScalarFunction) resolveIndicesByVirtualExpr(ctx EvalContext, schema *Schema) bool { for _, arg := range sf.GetArgs() { isOk := arg.resolveIndicesByVirtualExpr(ctx, schema) if !isOk { diff --git a/pkg/expression/scalar_function_test.go b/pkg/expression/scalar_function_test.go index 97fc0897479d5..a6e821b8626d7 100644 --- a/pkg/expression/scalar_function_test.go +++ b/pkg/expression/scalar_function_test.go @@ -36,57 +36,57 @@ func TestExpressionSemanticEqual(t *testing.T) { } // order sensitive cases // a < b; b > a - sf1 := newFunction(ast.LT, a, b) - sf2 := newFunction(ast.GT, b, a) + sf1 := newFunctionWithMockCtx(ast.LT, a, b) + sf2 := newFunctionWithMockCtx(ast.GT, b, a) require.True(t, ExpressionsSemanticEqual(sf1, sf2)) // a > b; b < a - sf3 := newFunction(ast.GT, a, b) - sf4 := newFunction(ast.LT, b, a) + sf3 := newFunctionWithMockCtx(ast.GT, a, b) + sf4 := newFunctionWithMockCtx(ast.LT, b, a) require.True(t, ExpressionsSemanticEqual(sf3, sf4)) // a<=b; b>=a - sf5 := newFunction(ast.LE, a, b) - sf6 := newFunction(ast.GE, b, a) + sf5 := newFunctionWithMockCtx(ast.LE, a, b) + sf6 := newFunctionWithMockCtx(ast.GE, b, a) require.True(t, ExpressionsSemanticEqual(sf5, sf6)) // a>=b; b<=a - sf7 := newFunction(ast.GE, a, b) - sf8 := newFunction(ast.LE, b, a) + sf7 := newFunctionWithMockCtx(ast.GE, a, b) + sf8 := newFunctionWithMockCtx(ast.LE, b, a) require.True(t, ExpressionsSemanticEqual(sf7, sf8)) // not(a= b - sf9 := newFunction(ast.UnaryNot, sf1) + sf9 := newFunctionWithMockCtx(ast.UnaryNot, sf1) require.True(t, ExpressionsSemanticEqual(sf9, sf7)) // a < b; not(a>=b) - sf10 := newFunction(ast.UnaryNot, sf7) + sf10 := newFunctionWithMockCtx(ast.UnaryNot, sf7) require.True(t, ExpressionsSemanticEqual(sf1, sf10)) // order insensitive cases // a + b; b + a - p1 := newFunction(ast.Plus, a, b) - p2 := newFunction(ast.Plus, b, a) + p1 := newFunctionWithMockCtx(ast.Plus, a, b) + p2 := newFunctionWithMockCtx(ast.Plus, b, a) require.True(t, ExpressionsSemanticEqual(p1, p2)) // a * b; b * a - m1 := newFunction(ast.Mul, a, b) - m2 := newFunction(ast.Mul, b, a) + m1 := newFunctionWithMockCtx(ast.Mul, a, b) + m2 := newFunctionWithMockCtx(ast.Mul, b, a) require.True(t, ExpressionsSemanticEqual(m1, m2)) // a = b; b = a - e1 := newFunction(ast.EQ, a, b) - e2 := newFunction(ast.EQ, b, a) + e1 := newFunctionWithMockCtx(ast.EQ, a, b) + e2 := newFunctionWithMockCtx(ast.EQ, b, a) require.True(t, ExpressionsSemanticEqual(e1, e2)) // a = b AND b + a; a + b AND b = a - a1 := newFunction(ast.LogicAnd, e1, p2) - a2 := newFunction(ast.LogicAnd, p1, e2) + a1 := newFunctionWithMockCtx(ast.LogicAnd, e1, p2) + a2 := newFunctionWithMockCtx(ast.LogicAnd, p1, e2) require.True(t, ExpressionsSemanticEqual(a1, a2)) // a * b OR a + b; b + a OR b * a - o1 := newFunction(ast.LogicOr, m1, p1) - o2 := newFunction(ast.LogicOr, p2, m2) + o1 := newFunctionWithMockCtx(ast.LogicOr, m1, p1) + o2 := newFunctionWithMockCtx(ast.LogicOr, p2, m2) require.True(t, ExpressionsSemanticEqual(o1, o2)) } @@ -96,12 +96,13 @@ func TestScalarFunction(t *testing.T) { UniqueID: 1, RetType: types.NewFieldType(mysql.TypeDouble), } - sf := newFunction(ast.LT, a, NewOne()) + + sf := newFunctionWithMockCtx(ast.LT, a, NewOne()) res, err := sf.MarshalJSON() require.NoError(t, err) require.EqualValues(t, []byte{0x22, 0x6c, 0x74, 0x28, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x23, 0x31, 0x2c, 0x20, 0x31, 0x29, 0x22}, res) require.False(t, sf.IsCorrelated()) - require.False(t, sf.ConstItem(ctx.GetSessionVars().StmtCtx)) + require.Equal(t, ConstNone, sf.ConstLevel()) require.True(t, sf.Decorrelate(nil).Equal(ctx, sf)) require.EqualValues(t, []byte{0x3, 0x4, 0x6c, 0x74, 0x1, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x5, 0xbf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, sf.HashCode()) @@ -125,7 +126,7 @@ func TestIssue23309(t *testing.T) { a.RetType.SetFlag(a.RetType.GetFlag() | mysql.NotNullFlag) null := NewNull() null.RetType = types.NewFieldType(mysql.TypeNull) - sf, _ := newFunction(ast.NE, a, null).(*ScalarFunction) + sf, _ := newFunctionWithMockCtx(ast.NE, a, null).(*ScalarFunction) v, err := sf.GetArgs()[1].Eval(mock.NewContext(), chunk.Row{}) require.NoError(t, err) require.True(t, v.IsNull()) @@ -138,8 +139,8 @@ func TestScalarFuncs2Exprs(t *testing.T) { UniqueID: 1, RetType: types.NewFieldType(mysql.TypeDouble), } - sf0, _ := newFunction(ast.LT, a, NewZero()).(*ScalarFunction) - sf1, _ := newFunction(ast.LT, a, NewOne()).(*ScalarFunction) + sf0, _ := newFunctionWithMockCtx(ast.LT, a, NewZero()).(*ScalarFunction) + sf1, _ := newFunctionWithMockCtx(ast.LT, a, NewOne()).(*ScalarFunction) funcs := []*ScalarFunction{sf0, sf1} exprs := ScalarFuncs2Exprs(funcs) diff --git a/pkg/expression/schema.go b/pkg/expression/schema.go index babb29ac6379c..2ff133cf61f40 100644 --- a/pkg/expression/schema.go +++ b/pkg/expression/schema.go @@ -19,7 +19,6 @@ import ( "unsafe" "github.com/pingcap/tidb/pkg/parser/model" - "github.com/pingcap/tidb/pkg/sessionctx" "github.com/pingcap/tidb/pkg/util/size" ) @@ -269,7 +268,7 @@ func MergeSchema(lSchema, rSchema *Schema) *Schema { } // GetUsedList shows whether each column in schema is contained in usedCols. -func GetUsedList(ctx sessionctx.Context, usedCols []*Column, schema *Schema) []bool { +func GetUsedList(ctx EvalContext, usedCols []*Column, schema *Schema) []bool { tmpSchema := NewSchema(usedCols...) used := make([]bool, schema.Len()) for i, col := range schema.Columns { diff --git a/pkg/expression/simple_rewriter.go b/pkg/expression/simple_rewriter.go index f19c0f021278d..ce4b6dcd0fcfa 100644 --- a/pkg/expression/simple_rewriter.go +++ b/pkg/expression/simple_rewriter.go @@ -94,7 +94,7 @@ func ParseSimpleExprsWithNames(ctx sessionctx.Context, exprStr string, schema *S stmts, warns, err = parser.New().ParseSQL(exprStr) } if err != nil { - return nil, util.SyntaxWarn(err) + return nil, errors.Trace(util.SyntaxWarn(err)) } for _, warn := range warns { ctx.GetSessionVars().StmtCtx.AppendWarning(util.SyntaxWarn(warn)) diff --git a/pkg/expression/test/multivaluedindex/main_test.go b/pkg/expression/test/multivaluedindex/main_test.go index 8ba2902142c88..dde2ffb4d188e 100644 --- a/pkg/expression/test/multivaluedindex/main_test.go +++ b/pkg/expression/test/multivaluedindex/main_test.go @@ -44,6 +44,7 @@ func TestMain(m *testing.M) { opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), diff --git a/pkg/expression/typeinfer_test.go b/pkg/expression/typeinfer_test.go index 23d7b3b1b4bf2..ce77470663757 100644 --- a/pkg/expression/typeinfer_test.go +++ b/pkg/expression/typeinfer_test.go @@ -205,11 +205,11 @@ func (s *InferTypeSuite) createTestCase4Cast() []typeInferTestCase { {"CAST(c_varchar AS DECIMAL)", mysql.TypeNewDecimal, charset.CharsetBin, mysql.BinaryFlag, 10, 0}, {"CAST(\"123456789.0123456789\" AS DECIMAL)", mysql.TypeNewDecimal, charset.CharsetBin, mysql.NotNullFlag | mysql.BinaryFlag, 10, 0}, // TODO: flen should be 11. {"CAST(\"123456789.0123456789\" AS DECIMAL(10,0))", mysql.TypeNewDecimal, charset.CharsetBin, mysql.NotNullFlag | mysql.BinaryFlag, 10, 0}, // TODO: flen should be 11. - {"CAST(\"123456789.0123456789\" AS DECIMAL(5,5))", mysql.TypeNewDecimal, charset.CharsetBin, mysql.BinaryFlag, 5, 5}, // TODO: flen should be 7. flag should be mysql.NotNullFlag | mysql.BinaryFlag. - {"CAST(\"123456789.0123456789\" AS DECIMAL(6,5))", mysql.TypeNewDecimal, charset.CharsetBin, mysql.BinaryFlag, 6, 5}, // TODO: flen should be 8. flag should be mysql.NotNullFlag | mysql.BinaryFlag. + {"CAST(\"123456789.0123456789\" AS DECIMAL(5,5))", mysql.TypeNewDecimal, charset.CharsetBin, mysql.NotNullFlag | mysql.BinaryFlag, 5, 5}, // TODO: flen should be 7. + {"CAST(\"123456789.0123456789\" AS DECIMAL(6,5))", mysql.TypeNewDecimal, charset.CharsetBin, mysql.NotNullFlag | mysql.BinaryFlag, 6, 5}, // TODO: flen should be 8. {"CAST(\"-123456789.0123456789\" AS DECIMAL(64,30))", mysql.TypeNewDecimal, charset.CharsetBin, mysql.NotNullFlag | mysql.BinaryFlag, 64, 30}, // TODO: flen should be 66. {"CAST(\"-123456789.0123456789\" AS DECIMAL(10,0))", mysql.TypeNewDecimal, charset.CharsetBin, mysql.NotNullFlag | mysql.BinaryFlag, 10, 0}, // TODO: flen should be 11. - {"CAST(\"-123456789.0123456789\" AS DECIMAL(5,5))", mysql.TypeNewDecimal, charset.CharsetBin, mysql.BinaryFlag, 5, 5}, // TODO: flen should be 7. flag should be mysql.NotNullFlag | mysql.BinaryFlag. + {"CAST(\"-123456789.0123456789\" AS DECIMAL(5,5))", mysql.TypeNewDecimal, charset.CharsetBin, mysql.NotNullFlag | mysql.BinaryFlag, 5, 5}, // TODO: flen should be 7. {"CAST(c_int_d AS JSON)", mysql.TypeJSON, charset.CharsetUTF8MB4, mysql.BinaryFlag | mysql.ParseToJSONFlag, 12582912 / 3, 0}, {"CAST(c_int_d AS SIGNED)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 22, 0}, // TODO: flen should be 11. {"CAST(c_int_d AS SIGNED INTEGER)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 22, 0}, // TODO: flen should be 11. diff --git a/pkg/expression/util.go b/pkg/expression/util.go index d8e47d5ef1f9d..1202434a3dce2 100644 --- a/pkg/expression/util.go +++ b/pkg/expression/util.go @@ -409,8 +409,8 @@ func SetExprColumnInOperand(expr Expression) Expression { // ColumnSubstitute substitutes the columns in filter to expressions in select fields. // e.g. select * from (select b as a from t) k where a < 10 => select * from (select b as a from t where b < 10) k. -func ColumnSubstitute(expr Expression, schema *Schema, newExprs []Expression) Expression { - _, _, resExpr := ColumnSubstituteImpl(expr, schema, newExprs, false) +func ColumnSubstitute(ctx sessionctx.Context, expr Expression, schema *Schema, newExprs []Expression) Expression { + _, _, resExpr := ColumnSubstituteImpl(ctx, expr, schema, newExprs, false) return resExpr } @@ -419,8 +419,8 @@ func ColumnSubstitute(expr Expression, schema *Schema, newExprs []Expression) Ex // // 1: substitute them all once find col in schema. // 2: nothing in expr can be substituted. -func ColumnSubstituteAll(expr Expression, schema *Schema, newExprs []Expression) (bool, Expression) { - _, hasFail, resExpr := ColumnSubstituteImpl(expr, schema, newExprs, true) +func ColumnSubstituteAll(ctx sessionctx.Context, expr Expression, schema *Schema, newExprs []Expression) (bool, Expression) { + _, hasFail, resExpr := ColumnSubstituteImpl(ctx, expr, schema, newExprs, true) return hasFail, resExpr } @@ -429,7 +429,7 @@ func ColumnSubstituteAll(expr Expression, schema *Schema, newExprs []Expression) // @return bool means whether the expr has changed. // @return bool means whether the expr should change (has the dependency in schema, while the corresponding expr has some compatibility), but finally fallback. // @return Expression, the original expr or the changed expr, it depends on the first @return bool. -func ColumnSubstituteImpl(expr Expression, schema *Schema, newExprs []Expression, fail1Return bool) (bool, bool, Expression) { +func ColumnSubstituteImpl(ctx sessionctx.Context, expr Expression, schema *Schema, newExprs []Expression, fail1Return bool) (bool, bool, Expression) { switch v := expr.(type) { case *Column: id := schema.ColumnIndex(v) @@ -446,7 +446,7 @@ func ColumnSubstituteImpl(expr Expression, schema *Schema, newExprs []Expression hasFail := false if v.FuncName.L == ast.Cast || v.FuncName.L == ast.Grouping { var newArg Expression - substituted, hasFail, newArg = ColumnSubstituteImpl(v.GetArgs()[0], schema, newExprs, fail1Return) + substituted, hasFail, newArg = ColumnSubstituteImpl(ctx, v.GetArgs()[0], schema, newExprs, fail1Return) if fail1Return && hasFail { return substituted, hasFail, v } @@ -454,7 +454,7 @@ func ColumnSubstituteImpl(expr Expression, schema *Schema, newExprs []Expression flag := v.RetType.GetFlag() var e Expression if v.FuncName.L == ast.Cast { - e = BuildCastFunction(v.GetCtx(), newArg, v.RetType) + e = BuildCastFunction(ctx, newArg, v.RetType) } else { // for grouping function recreation, use clone (meta included) instead of newFunction e = v.Clone() @@ -469,7 +469,7 @@ func ColumnSubstituteImpl(expr Expression, schema *Schema, newExprs []Expression // cowExprRef is a copy-on-write util, args array allocation happens only // when expr in args is changed refExprArr := cowExprRef{v.GetArgs(), nil} - oldCollEt, err := CheckAndDeriveCollationFromExprs(v.GetCtx(), v.FuncName.L, v.RetType.EvalType(), v.GetArgs()...) + oldCollEt, err := CheckAndDeriveCollationFromExprs(ctx, v.FuncName.L, v.RetType.EvalType(), v.GetArgs()...) if err != nil { logutil.BgLogger().Error("Unexpected error happened during ColumnSubstitution", zap.Stack("stack")) return false, false, v @@ -479,7 +479,7 @@ func ColumnSubstituteImpl(expr Expression, schema *Schema, newExprs []Expression tmpArgForCollCheck = make([]Expression, len(v.GetArgs())) } for idx, arg := range v.GetArgs() { - changed, failed, newFuncExpr := ColumnSubstituteImpl(arg, schema, newExprs, fail1Return) + changed, failed, newFuncExpr := ColumnSubstituteImpl(ctx, arg, schema, newExprs, fail1Return) if fail1Return && failed { return changed, failed, v } @@ -489,7 +489,7 @@ func ColumnSubstituteImpl(expr Expression, schema *Schema, newExprs []Expression changed = false copy(tmpArgForCollCheck, refExprArr.Result()) tmpArgForCollCheck[idx] = newFuncExpr - newCollEt, err := CheckAndDeriveCollationFromExprs(v.GetCtx(), v.FuncName.L, v.RetType.EvalType(), tmpArgForCollCheck...) + newCollEt, err := CheckAndDeriveCollationFromExprs(ctx, v.FuncName.L, v.RetType.EvalType(), tmpArgForCollCheck...) if err != nil { logutil.BgLogger().Error("Unexpected error happened during ColumnSubstitution", zap.Stack("stack")) return false, failed, v @@ -518,7 +518,7 @@ func ColumnSubstituteImpl(expr Expression, schema *Schema, newExprs []Expression } } if substituted { - return true, hasFail, NewFunctionInternal(v.GetCtx(), v.FuncName.L, v.RetType, refExprArr.Result()...) + return true, hasFail, NewFunctionInternal(ctx, v.FuncName.L, v.RetType, refExprArr.Result()...) } } return false, false, expr @@ -585,13 +585,13 @@ Loop: // SubstituteCorCol2Constant will substitute correlated column to constant value which it contains. // If the args of one scalar function are all constant, we will substitute it to constant. -func SubstituteCorCol2Constant(expr Expression) (Expression, error) { +func SubstituteCorCol2Constant(ctx sessionctx.Context, expr Expression) (Expression, error) { switch x := expr.(type) { case *ScalarFunction: allConstant := true newArgs := make([]Expression, 0, len(x.GetArgs())) for _, arg := range x.GetArgs() { - newArg, err := SubstituteCorCol2Constant(arg) + newArg, err := SubstituteCorCol2Constant(ctx, arg) if err != nil { return nil, err } @@ -600,7 +600,7 @@ func SubstituteCorCol2Constant(expr Expression) (Expression, error) { allConstant = allConstant && ok } if allConstant { - val, err := x.EvalWithInnerCtx(chunk.Row{}) + val, err := x.Eval(ctx, chunk.Row{}) if err != nil { return nil, err } @@ -611,19 +611,19 @@ func SubstituteCorCol2Constant(expr Expression) (Expression, error) { newSf Expression ) if x.FuncName.L == ast.Cast { - newSf = BuildCastFunction(x.GetCtx(), newArgs[0], x.RetType) + newSf = BuildCastFunction(ctx, newArgs[0], x.RetType) } else if x.FuncName.L == ast.Grouping { newSf = x.Clone() newSf.(*ScalarFunction).GetArgs()[0] = newArgs[0] } else { - newSf, err = NewFunction(x.GetCtx(), x.FuncName.L, x.GetType(), newArgs...) + newSf, err = NewFunction(ctx, x.FuncName.L, x.GetType(), newArgs...) } return newSf, err case *CorrelatedColumn: return &Constant{Value: *x.Data, RetType: x.GetType()}, nil case *Constant: if x.DeferredExpr != nil { - newExpr := FoldConstant(x) + newExpr := FoldConstant(ctx, x) return &Constant{Value: newExpr.(*Constant).Value, RetType: x.GetType()}, nil } } @@ -879,20 +879,20 @@ func pushNotAcrossExpr(ctx sessionctx.Context, expr Expression, not bool) (_ Exp return expr, false } var childExpr Expression - childExpr, changed = pushNotAcrossExpr(f.GetCtx(), child, !not) + childExpr, changed = pushNotAcrossExpr(ctx, child, !not) if !changed && !not { return expr, false } return childExpr, true case ast.LT, ast.GE, ast.GT, ast.LE, ast.EQ, ast.NE: if not { - return NewFunctionInternal(f.GetCtx(), oppositeOp[f.FuncName.L], f.GetType(), f.GetArgs()...), true + return NewFunctionInternal(ctx, oppositeOp[f.FuncName.L], f.GetType(), f.GetArgs()...), true } - newArgs, changed := pushNotAcrossArgs(f.GetCtx(), f.GetArgs(), false) + newArgs, changed := pushNotAcrossArgs(ctx, f.GetArgs(), false) if !changed { return f, false } - return NewFunctionInternal(f.GetCtx(), f.FuncName.L, f.GetType(), newArgs...), true + return NewFunctionInternal(ctx, f.FuncName.L, f.GetType(), newArgs...), true case ast.LogicAnd, ast.LogicOr: var ( newArgs []Expression @@ -900,16 +900,16 @@ func pushNotAcrossExpr(ctx sessionctx.Context, expr Expression, not bool) (_ Exp ) funcName := f.FuncName.L if not { - newArgs, _ = pushNotAcrossArgs(f.GetCtx(), f.GetArgs(), true) + newArgs, _ = pushNotAcrossArgs(ctx, f.GetArgs(), true) funcName = oppositeOp[f.FuncName.L] changed = true } else { - newArgs, changed = pushNotAcrossArgs(f.GetCtx(), f.GetArgs(), false) + newArgs, changed = pushNotAcrossArgs(ctx, f.GetArgs(), false) } if !changed { return f, false } - return NewFunctionInternal(f.GetCtx(), funcName, f.GetType(), newArgs...), true + return NewFunctionInternal(ctx, funcName, f.GetType(), newArgs...), true } } if not { @@ -1081,12 +1081,11 @@ func extractFiltersFromDNF(ctx sessionctx.Context, dnfFunc *ScalarFunction) ([]E // the original expression must satisfy the derived expression. Return nil when the derived expression is universal set. // A running example is: for schema of t1, `(t1.a=1 and t2.a=1) or (t1.a=2 and t2.a=2)` would be derived as // `t1.a=1 or t1.a=2`, while `t1.a=1 or t2.a=1` would get nil. -func DeriveRelaxedFiltersFromDNF(expr Expression, schema *Schema) Expression { +func DeriveRelaxedFiltersFromDNF(ctx sessionctx.Context, expr Expression, schema *Schema) Expression { sf, ok := expr.(*ScalarFunction) if !ok || sf.FuncName.L != ast.LogicOr { return nil } - ctx := sf.GetCtx() dnfItems := FlattenDNFConditions(sf) newDNFItems := make([]Expression, 0, len(dnfItems)) for _, dnfItem := range dnfItems { @@ -1094,7 +1093,7 @@ func DeriveRelaxedFiltersFromDNF(expr Expression, schema *Schema) Expression { newCNFItems := make([]Expression, 0, len(cnfItems)) for _, cnfItem := range cnfItems { if itemSF, ok := cnfItem.(*ScalarFunction); ok && itemSF.FuncName.L == ast.LogicOr { - relaxedCNFItem := DeriveRelaxedFiltersFromDNF(cnfItem, schema) + relaxedCNFItem := DeriveRelaxedFiltersFromDNF(ctx, cnfItem, schema) if relaxedCNFItem != nil { newCNFItems = append(newCNFItems, relaxedCNFItem) } @@ -1392,10 +1391,10 @@ func RemoveDupExprs(exprs []Expression) []Expression { } // GetUint64FromConstant gets a uint64 from constant expression. -func GetUint64FromConstant(expr Expression) (uint64, bool, bool) { +func GetUint64FromConstant(ctx sessionctx.Context, expr Expression) (uint64, bool, bool) { con, ok := expr.(*Constant) if !ok { - logutil.BgLogger().Warn("not a constant expression", zap.String("expression", expr.ExplainInfo())) + logutil.BgLogger().Warn("not a constant expression", zap.String("expression", expr.ExplainInfo(ctx))) return 0, false, false } dt := con.Value @@ -1403,7 +1402,7 @@ func GetUint64FromConstant(expr Expression) (uint64, bool, bool) { dt = con.ParamMarker.GetUserVar() } else if con.DeferredExpr != nil { var err error - dt, err = con.DeferredExpr.EvalWithInnerCtx(chunk.Row{}) + dt, err = con.DeferredExpr.Eval(ctx, chunk.Row{}) if err != nil { logutil.BgLogger().Warn("eval deferred expr failed", zap.Error(err)) return 0, false, false @@ -1468,7 +1467,7 @@ func ContainCorrelatedColumn(exprs []Expression) bool { // 2. Whether the statement can be cached. // 3. Whether the expressions contain a lazy constant. // TODO: Do more careful check here. -func MaybeOverOptimized4PlanCache(ctx sessionctx.Context, exprs []Expression) bool { +func MaybeOverOptimized4PlanCache(ctx EvalContext, exprs []Expression) bool { // If we do not enable plan cache, all the optimization can work correctly. if !ctx.GetSessionVars().StmtCtx.UseCache { return false @@ -1477,7 +1476,7 @@ func MaybeOverOptimized4PlanCache(ctx sessionctx.Context, exprs []Expression) bo } // containMutableConst checks if the expressions contain a lazy constant. -func containMutableConst(ctx sessionctx.Context, exprs []Expression) bool { +func containMutableConst(ctx EvalContext, exprs []Expression) bool { for _, expr := range exprs { switch v := expr.(type) { case *Constant: @@ -1655,7 +1654,7 @@ func (r *SQLDigestTextRetriever) runMockQuery(data map[string]string, inValues [ // of the given SQL digests, if `inValues` is given, or all these mappings otherwise. If `queryGlobal` is false, it // queries information_schema.statements_summary and information_schema.statements_summary_history; otherwise, it // queries the cluster version of these two tables. -func (r *SQLDigestTextRetriever) runFetchDigestQuery(ctx context.Context, sctx sessionctx.Context, queryGlobal bool, inValues []interface{}) (map[string]string, error) { +func (r *SQLDigestTextRetriever) runFetchDigestQuery(ctx context.Context, sctx EvalContext, queryGlobal bool, inValues []interface{}) (map[string]string, error) { ctx = kv.WithInternalSourceType(ctx, kv.InternalTxnOthers) // If mock data is set, query the mock data instead of the real statements_summary tables. if !queryGlobal && r.mockLocalData != nil { @@ -1708,7 +1707,7 @@ func (r *SQLDigestTextRetriever) updateDigestInfo(queryResult map[string]string) } // RetrieveLocal tries to retrieve the SQL text of the SQL digests from local information. -func (r *SQLDigestTextRetriever) RetrieveLocal(ctx context.Context, sctx sessionctx.Context) error { +func (r *SQLDigestTextRetriever) RetrieveLocal(ctx context.Context, sctx EvalContext) error { if len(r.SQLDigestsMap) == 0 { return nil } @@ -1742,7 +1741,7 @@ func (r *SQLDigestTextRetriever) RetrieveLocal(ctx context.Context, sctx session } // RetrieveGlobal tries to retrieve the SQL text of the SQL digests from the information of the whole cluster. -func (r *SQLDigestTextRetriever) RetrieveGlobal(ctx context.Context, sctx sessionctx.Context) error { +func (r *SQLDigestTextRetriever) RetrieveGlobal(ctx context.Context, sctx EvalContext) error { err := r.RetrieveLocal(ctx, sctx) if err != nil { return errors.Trace(err) @@ -1801,3 +1800,18 @@ func ExprsToStringsForDisplay(exprs []Expression) []string { } return strs } + +// ConstExprConsiderPlanCache indicates whether the expression can be considered as a constant expression considering planCache. +// If the expression is in plan cache, it should have a const level `ConstStrict` because it can be shared across statements. +// If the expression is not in plan cache, `ConstOnlyInContext` is enough because it is only used in one statement. +// Please notice that if the expression may be cached in other ways except plan cache, we should not use this function. +func ConstExprConsiderPlanCache(expr Expression, inPlanCache bool) bool { + switch expr.ConstLevel() { + case ConstStrict: + return true + case ConstOnlyInContext: + return !inPlanCache + default: + return false + } +} diff --git a/pkg/expression/util_test.go b/pkg/expression/util_test.go index 4a7198caf4a96..69881ff160a5d 100644 --- a/pkg/expression/util_test.go +++ b/pkg/expression/util_test.go @@ -22,7 +22,6 @@ import ( "github.com/pingcap/tidb/pkg/parser/ast" "github.com/pingcap/tidb/pkg/parser/model" "github.com/pingcap/tidb/pkg/parser/mysql" - "github.com/pingcap/tidb/pkg/sessionctx" "github.com/pingcap/tidb/pkg/sessionctx/stmtctx" "github.com/pingcap/tidb/pkg/types" "github.com/pingcap/tidb/pkg/util/chunk" @@ -154,37 +153,37 @@ func TestClone(t *testing.T) { } func TestGetUint64FromConstant(t *testing.T) { + ctx := mock.NewContext() con := &Constant{ Value: types.NewDatum(nil), } - _, isNull, ok := GetUint64FromConstant(con) + _, isNull, ok := GetUint64FromConstant(ctx, con) require.True(t, ok) require.True(t, isNull) con = &Constant{ Value: types.NewIntDatum(-1), } - _, _, ok = GetUint64FromConstant(con) + _, _, ok = GetUint64FromConstant(ctx, con) require.False(t, ok) con.Value = types.NewIntDatum(1) - num, isNull, ok := GetUint64FromConstant(con) + num, isNull, ok := GetUint64FromConstant(ctx, con) require.True(t, ok) require.False(t, isNull) require.Equal(t, uint64(1), num) con.Value = types.NewUintDatum(1) - num, _, _ = GetUint64FromConstant(con) + num, _, _ = GetUint64FromConstant(ctx, con) require.Equal(t, uint64(1), num) con.DeferredExpr = &Constant{Value: types.NewIntDatum(1)} - num, _, _ = GetUint64FromConstant(con) + num, _, _ = GetUint64FromConstant(ctx, con) require.Equal(t, uint64(1), num) - ctx := mock.NewContext() ctx.GetSessionVars().PlanCacheParams.Append(types.NewUintDatum(100)) con.ParamMarker = &ParamMarker{order: 0, ctx: ctx} - num, _, _ = GetUint64FromConstant(con) + num, _, _ = GetUint64FromConstant(ctx, con) require.Equal(t, uint64(100), num) } @@ -195,7 +194,7 @@ func TestSetExprColumnInOperand(t *testing.T) { ctx := mock.NewContext() f, err := funcs[ast.Abs].getFunction(ctx, []Expression{col}) require.NoError(t, err) - fun := &ScalarFunction{Function: f, ctx: ctx} + fun := &ScalarFunction{Function: f} SetExprColumnInOperand(fun) require.True(t, f.getArgs()[0].(*Column).InOperand) } @@ -205,7 +204,7 @@ func TestPopRowFirstArg(t *testing.T) { c1, c2, c3 := &Column{RetType: newIntFieldType()}, &Column{RetType: newIntFieldType()}, &Column{RetType: newIntFieldType()} f, err := funcs[ast.RowFunc].getFunction(ctx, []Expression{c1, c2, c3}) require.NoError(t, err) - fun := &ScalarFunction{Function: f, FuncName: model.NewCIStr(ast.RowFunc), RetType: newIntFieldType(), ctx: ctx} + fun := &ScalarFunction{Function: f, FuncName: model.NewCIStr(ast.RowFunc), RetType: newIntFieldType()} fun2, err := PopRowFirstArg(mock.NewContext(), fun) require.NoError(t, err) require.Len(t, fun2.(*ScalarFunction).GetArgs(), 2) @@ -245,21 +244,21 @@ func TestSubstituteCorCol2Constant(t *testing.T) { corCol2 := &CorrelatedColumn{Data: &NewOne().Value} corCol2.RetType = types.NewFieldType(mysql.TypeLonglong) cast := BuildCastFunction(ctx, corCol1, types.NewFieldType(mysql.TypeLonglong)) - plus := newFunction(ast.Plus, cast, corCol2) - plus2 := newFunction(ast.Plus, plus, NewOne()) + plus := newFunctionWithMockCtx(ast.Plus, cast, corCol2) + plus2 := newFunctionWithMockCtx(ast.Plus, plus, NewOne()) ans1 := &Constant{Value: types.NewIntDatum(3), RetType: types.NewFieldType(mysql.TypeLonglong)} - ret, err := SubstituteCorCol2Constant(plus2) + ret, err := SubstituteCorCol2Constant(ctx, plus2) require.NoError(t, err) require.True(t, ret.Equal(ctx, ans1)) col1 := &Column{Index: 1, RetType: types.NewFieldType(mysql.TypeLonglong)} - ret, err = SubstituteCorCol2Constant(col1) + ret, err = SubstituteCorCol2Constant(ctx, col1) require.NoError(t, err) ans2 := col1 require.True(t, ret.Equal(ctx, ans2)) - plus3 := newFunction(ast.Plus, plus2, col1) - ret, err = SubstituteCorCol2Constant(plus3) + plus3 := newFunctionWithMockCtx(ast.Plus, plus2, col1) + ret, err = SubstituteCorCol2Constant(ctx, plus3) require.NoError(t, err) - ans3 := newFunction(ast.Plus, ans1, col1) + ans3 := newFunctionWithMockCtx(ast.Plus, ans1, col1) require.True(t, ret.Equal(ctx, ans3)) } @@ -267,14 +266,14 @@ func TestPushDownNot(t *testing.T) { ctx := mock.NewContext() col := &Column{Index: 1, RetType: types.NewFieldType(mysql.TypeLonglong)} // !((a=1||a=1)&&a=1) - eqFunc := newFunction(ast.EQ, col, NewOne()) - orFunc := newFunction(ast.LogicOr, eqFunc, eqFunc) - andFunc := newFunction(ast.LogicAnd, orFunc, eqFunc) - notFunc := newFunction(ast.UnaryNot, andFunc) + eqFunc := newFunctionWithMockCtx(ast.EQ, col, NewOne()) + orFunc := newFunctionWithMockCtx(ast.LogicOr, eqFunc, eqFunc) + andFunc := newFunctionWithMockCtx(ast.LogicAnd, orFunc, eqFunc) + notFunc := newFunctionWithMockCtx(ast.UnaryNot, andFunc) // (a!=1&&a!=1)||a=1 - neFunc := newFunction(ast.NE, col, NewOne()) - andFunc2 := newFunction(ast.LogicAnd, neFunc, neFunc) - orFunc2 := newFunction(ast.LogicOr, andFunc2, neFunc) + neFunc := newFunctionWithMockCtx(ast.NE, col, NewOne()) + andFunc2 := newFunctionWithMockCtx(ast.LogicAnd, neFunc, neFunc) + orFunc2 := newFunctionWithMockCtx(ast.LogicOr, andFunc2, neFunc) notFuncCopy := notFunc.Clone() ret := PushDownNot(ctx, notFunc) require.True(t, ret.Equal(ctx, orFunc2)) @@ -282,37 +281,37 @@ func TestPushDownNot(t *testing.T) { // issue 15725 // (not not a) should be optimized to (a is true) - notFunc = newFunction(ast.UnaryNot, col) - notFunc = newFunction(ast.UnaryNot, notFunc) + notFunc = newFunctionWithMockCtx(ast.UnaryNot, col) + notFunc = newFunctionWithMockCtx(ast.UnaryNot, notFunc) ret = PushDownNot(ctx, notFunc) - require.True(t, ret.Equal(ctx, newFunction(ast.IsTruthWithNull, col))) + require.True(t, ret.Equal(ctx, newFunctionWithMockCtx(ast.IsTruthWithNull, col))) // (not not (a+1)) should be optimized to (a+1 is true) - plusFunc := newFunction(ast.Plus, col, NewOne()) - notFunc = newFunction(ast.UnaryNot, plusFunc) - notFunc = newFunction(ast.UnaryNot, notFunc) + plusFunc := newFunctionWithMockCtx(ast.Plus, col, NewOne()) + notFunc = newFunctionWithMockCtx(ast.UnaryNot, plusFunc) + notFunc = newFunctionWithMockCtx(ast.UnaryNot, notFunc) ret = PushDownNot(ctx, notFunc) - require.True(t, ret.Equal(ctx, newFunction(ast.IsTruthWithNull, plusFunc))) + require.True(t, ret.Equal(ctx, newFunctionWithMockCtx(ast.IsTruthWithNull, plusFunc))) // (not not not a) should be optimized to (not (a is true)) - notFunc = newFunction(ast.UnaryNot, col) - notFunc = newFunction(ast.UnaryNot, notFunc) - notFunc = newFunction(ast.UnaryNot, notFunc) + notFunc = newFunctionWithMockCtx(ast.UnaryNot, col) + notFunc = newFunctionWithMockCtx(ast.UnaryNot, notFunc) + notFunc = newFunctionWithMockCtx(ast.UnaryNot, notFunc) ret = PushDownNot(ctx, notFunc) - require.True(t, ret.Equal(ctx, newFunction(ast.UnaryNot, newFunction(ast.IsTruthWithNull, col)))) + require.True(t, ret.Equal(ctx, newFunctionWithMockCtx(ast.UnaryNot, newFunctionWithMockCtx(ast.IsTruthWithNull, col)))) // (not not not not a) should be optimized to (a is true) - notFunc = newFunction(ast.UnaryNot, col) - notFunc = newFunction(ast.UnaryNot, notFunc) - notFunc = newFunction(ast.UnaryNot, notFunc) - notFunc = newFunction(ast.UnaryNot, notFunc) + notFunc = newFunctionWithMockCtx(ast.UnaryNot, col) + notFunc = newFunctionWithMockCtx(ast.UnaryNot, notFunc) + notFunc = newFunctionWithMockCtx(ast.UnaryNot, notFunc) + notFunc = newFunctionWithMockCtx(ast.UnaryNot, notFunc) ret = PushDownNot(ctx, notFunc) - require.True(t, ret.Equal(ctx, newFunction(ast.IsTruthWithNull, col))) + require.True(t, ret.Equal(ctx, newFunctionWithMockCtx(ast.IsTruthWithNull, col))) } func TestFilter(t *testing.T) { conditions := []Expression{ - newFunction(ast.EQ, newColumn(0), newColumn(1)), - newFunction(ast.EQ, newColumn(1), newColumn(2)), - newFunction(ast.LogicOr, newLonglong(1), newColumn(0)), + newFunctionWithMockCtx(ast.EQ, newColumn(0), newColumn(1)), + newFunctionWithMockCtx(ast.EQ, newColumn(1), newColumn(2)), + newFunctionWithMockCtx(ast.LogicOr, newLonglong(1), newColumn(0)), } result := make([]Expression, 0, 5) result = Filter(result, conditions, isLogicOrFunction) @@ -321,9 +320,9 @@ func TestFilter(t *testing.T) { func TestFilterOutInPlace(t *testing.T) { conditions := []Expression{ - newFunction(ast.EQ, newColumn(0), newColumn(1)), - newFunction(ast.EQ, newColumn(1), newColumn(2)), - newFunction(ast.LogicOr, newLonglong(1), newColumn(0)), + newFunctionWithMockCtx(ast.EQ, newColumn(0), newColumn(1)), + newFunctionWithMockCtx(ast.EQ, newColumn(1), newColumn(2)), + newFunctionWithMockCtx(ast.LogicOr, newLonglong(1), newColumn(0)), } remained, filtered := FilterOutInPlace(conditions, isLogicOrFunction) require.Equal(t, 2, len(remained)) @@ -459,11 +458,11 @@ func TestSQLDigestTextRetriever(t *testing.T) { func BenchmarkExtractColumns(b *testing.B) { conditions := []Expression{ - newFunction(ast.EQ, newColumn(0), newColumn(1)), - newFunction(ast.EQ, newColumn(1), newColumn(2)), - newFunction(ast.EQ, newColumn(2), newColumn(3)), - newFunction(ast.EQ, newColumn(3), newLonglong(1)), - newFunction(ast.LogicOr, newLonglong(1), newColumn(0)), + newFunctionWithMockCtx(ast.EQ, newColumn(0), newColumn(1)), + newFunctionWithMockCtx(ast.EQ, newColumn(1), newColumn(2)), + newFunctionWithMockCtx(ast.EQ, newColumn(2), newColumn(3)), + newFunctionWithMockCtx(ast.EQ, newColumn(3), newLonglong(1)), + newFunctionWithMockCtx(ast.LogicOr, newLonglong(1), newColumn(0)), } expr := ComposeCNFCondition(mock.NewContext(), conditions...) @@ -476,11 +475,11 @@ func BenchmarkExtractColumns(b *testing.B) { func BenchmarkExprFromSchema(b *testing.B) { conditions := []Expression{ - newFunction(ast.EQ, newColumn(0), newColumn(1)), - newFunction(ast.EQ, newColumn(1), newColumn(2)), - newFunction(ast.EQ, newColumn(2), newColumn(3)), - newFunction(ast.EQ, newColumn(3), newLonglong(1)), - newFunction(ast.LogicOr, newLonglong(1), newColumn(0)), + newFunctionWithMockCtx(ast.EQ, newColumn(0), newColumn(1)), + newFunctionWithMockCtx(ast.EQ, newColumn(1), newColumn(2)), + newFunctionWithMockCtx(ast.EQ, newColumn(2), newColumn(3)), + newFunctionWithMockCtx(ast.EQ, newColumn(3), newLonglong(1)), + newFunctionWithMockCtx(ast.LogicOr, newLonglong(1), newColumn(0)), } expr := ComposeCNFCondition(mock.NewContext(), conditions...) schema := &Schema{Columns: ExtractColumns(expr)} @@ -499,103 +498,96 @@ type MockExpr struct { i interface{} } -func (m *MockExpr) VecEvalInt(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (m *MockExpr) VecEvalInt(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { return nil } -func (m *MockExpr) VecEvalReal(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (m *MockExpr) VecEvalReal(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { return nil } -func (m *MockExpr) VecEvalString(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (m *MockExpr) VecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { return nil } -func (m *MockExpr) VecEvalDecimal(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (m *MockExpr) VecEvalDecimal(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { return nil } -func (m *MockExpr) VecEvalTime(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (m *MockExpr) VecEvalTime(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { return nil } -func (m *MockExpr) VecEvalDuration(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (m *MockExpr) VecEvalDuration(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { return nil } -func (m *MockExpr) VecEvalJSON(ctx sessionctx.Context, input *chunk.Chunk, result *chunk.Column) error { +func (m *MockExpr) VecEvalJSON(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { return nil } func (m *MockExpr) String() string { return "" } func (m *MockExpr) MarshalJSON() ([]byte, error) { return nil, nil } -func (m *MockExpr) Eval(ctx sessionctx.Context, row chunk.Row) (types.Datum, error) { +func (m *MockExpr) Eval(ctx EvalContext, row chunk.Row) (types.Datum, error) { return types.NewDatum(m.i), m.err } -func (m *MockExpr) EvalWithInnerCtx(row chunk.Row) (types.Datum, error) { - return types.NewDatum(m.i), m.err -} -func (m *MockExpr) EvalInt(ctx sessionctx.Context, row chunk.Row) (val int64, isNull bool, err error) { +func (m *MockExpr) EvalInt(ctx EvalContext, row chunk.Row) (val int64, isNull bool, err error) { if x, ok := m.i.(int64); ok { return x, false, m.err } return 0, m.i == nil, m.err } -func (m *MockExpr) EvalReal(ctx sessionctx.Context, row chunk.Row) (val float64, isNull bool, err error) { +func (m *MockExpr) EvalReal(ctx EvalContext, row chunk.Row) (val float64, isNull bool, err error) { if x, ok := m.i.(float64); ok { return x, false, m.err } return 0, m.i == nil, m.err } -func (m *MockExpr) EvalString(ctx sessionctx.Context, row chunk.Row) (val string, isNull bool, err error) { +func (m *MockExpr) EvalString(ctx EvalContext, row chunk.Row) (val string, isNull bool, err error) { if x, ok := m.i.(string); ok { return x, false, m.err } return "", m.i == nil, m.err } -func (m *MockExpr) EvalDecimal(ctx sessionctx.Context, row chunk.Row) (val *types.MyDecimal, isNull bool, err error) { +func (m *MockExpr) EvalDecimal(ctx EvalContext, row chunk.Row) (val *types.MyDecimal, isNull bool, err error) { if x, ok := m.i.(*types.MyDecimal); ok { return x, false, m.err } return nil, m.i == nil, m.err } -func (m *MockExpr) EvalTime(ctx sessionctx.Context, row chunk.Row) (val types.Time, isNull bool, err error) { +func (m *MockExpr) EvalTime(ctx EvalContext, row chunk.Row) (val types.Time, isNull bool, err error) { if x, ok := m.i.(types.Time); ok { return x, false, m.err } return types.ZeroTime, m.i == nil, m.err } -func (m *MockExpr) EvalDuration(ctx sessionctx.Context, row chunk.Row) (val types.Duration, isNull bool, err error) { +func (m *MockExpr) EvalDuration(ctx EvalContext, row chunk.Row) (val types.Duration, isNull bool, err error) { if x, ok := m.i.(types.Duration); ok { return x, false, m.err } return types.Duration{}, m.i == nil, m.err } -func (m *MockExpr) EvalJSON(ctx sessionctx.Context, row chunk.Row) (val types.BinaryJSON, isNull bool, err error) { +func (m *MockExpr) EvalJSON(ctx EvalContext, row chunk.Row) (val types.BinaryJSON, isNull bool, err error) { if x, ok := m.i.(types.BinaryJSON); ok { return x, false, m.err } return types.BinaryJSON{}, m.i == nil, m.err } -func (m *MockExpr) ReverseEval(sc *stmtctx.StatementContext, res types.Datum, rType types.RoundingType) (val types.Datum, err error) { - return types.Datum{}, m.err -} func (m *MockExpr) GetType() *types.FieldType { return m.t } func (m *MockExpr) Clone() Expression { return nil } -func (m *MockExpr) Equal(ctx sessionctx.Context, e Expression) bool { return false } +func (m *MockExpr) Equal(ctx EvalContext, e Expression) bool { return false } func (m *MockExpr) IsCorrelated() bool { return false } -func (m *MockExpr) ConstItem(_ *stmtctx.StatementContext) bool { return false } +func (m *MockExpr) ConstLevel() ConstLevel { return ConstNone } func (m *MockExpr) Decorrelate(schema *Schema) Expression { return m } func (m *MockExpr) ResolveIndices(schema *Schema) (Expression, error) { return m, nil } func (m *MockExpr) resolveIndices(schema *Schema) error { return nil } -func (m *MockExpr) ResolveIndicesByVirtualExpr(ctx sessionctx.Context, schema *Schema) (Expression, bool) { +func (m *MockExpr) ResolveIndicesByVirtualExpr(ctx EvalContext, schema *Schema) (Expression, bool) { return m, true } -func (m *MockExpr) resolveIndicesByVirtualExpr(ctx sessionctx.Context, schema *Schema) bool { +func (m *MockExpr) resolveIndicesByVirtualExpr(ctx EvalContext, schema *Schema) bool { return true } func (m *MockExpr) RemapColumn(_ map[int64]*Column) (Expression, error) { return m, nil } -func (m *MockExpr) ExplainInfo() string { return "" } +func (m *MockExpr) ExplainInfo(EvalContext) string { return "" } func (m *MockExpr) ExplainNormalizedInfo() string { return "" } func (m *MockExpr) ExplainNormalizedInfo4InList() string { return "" } func (m *MockExpr) HashCode() []byte { return nil } func (m *MockExpr) CanonicalHashCode() []byte { return nil } func (m *MockExpr) Vectorized() bool { return false } -func (m *MockExpr) SupportReverseEval() bool { return false } func (m *MockExpr) HasCoercibility() bool { return false } func (m *MockExpr) Coercibility() Coercibility { return 0 } func (m *MockExpr) SetCoercibility(Coercibility) {} diff --git a/pkg/expression/vectorized.go b/pkg/expression/vectorized.go index 7417af68d9d78..8232b64873cc4 100644 --- a/pkg/expression/vectorized.go +++ b/pkg/expression/vectorized.go @@ -16,12 +16,11 @@ package expression import ( "github.com/pingcap/errors" - "github.com/pingcap/tidb/pkg/sessionctx" "github.com/pingcap/tidb/pkg/types" "github.com/pingcap/tidb/pkg/util/chunk" ) -func genVecFromConstExpr(ctx sessionctx.Context, expr Expression, targetType types.EvalType, input *chunk.Chunk, result *chunk.Column) error { +func genVecFromConstExpr(ctx EvalContext, expr Expression, targetType types.EvalType, input *chunk.Chunk, result *chunk.Column) error { n := 1 if input != nil { n = input.NumRows() diff --git a/pkg/extension/enterprise b/pkg/extension/enterprise index 227c9935e1a76..049c75c34858d 160000 --- a/pkg/extension/enterprise +++ b/pkg/extension/enterprise @@ -1 +1 @@ -Subproject commit 227c9935e1a76a4574a5321a58d19c2bff5f38f2 +Subproject commit 049c75c34858d264026db17048d17211c16dd731 diff --git a/pkg/extension/main_test.go b/pkg/extension/main_test.go index f613a3a66f26a..672316515b0b5 100644 --- a/pkg/extension/main_test.go +++ b/pkg/extension/main_test.go @@ -25,6 +25,7 @@ func TestMain(m *testing.M) { testsetup.SetupForCommonTest() opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), diff --git a/pkg/infoschema/BUILD.bazel b/pkg/infoschema/BUILD.bazel index c83b8841a2451..b88917fbca2a0 100644 --- a/pkg/infoschema/BUILD.bazel +++ b/pkg/infoschema/BUILD.bazel @@ -91,7 +91,7 @@ go_test( "//pkg/util", "//pkg/util/set", "@com_github_pingcap_errors//:errors", - "@com_github_prometheus_prometheus//promql", + "@com_github_prometheus_prometheus//promql/parser", "@com_github_stretchr_testify//require", "@org_uber_go_goleak//:goleak", ], diff --git a/pkg/infoschema/builder.go b/pkg/infoschema/builder.go index 41b3016e1d330..ac413cd0b108a 100644 --- a/pkg/infoschema/builder.go +++ b/pkg/infoschema/builder.go @@ -518,7 +518,9 @@ func (b *Builder) applyTableUpdate(m *meta.Meta, diff *model.SchemaDiff) ([]int6 // We try to reuse the old allocator, so the cached auto ID can be reused. var allocs autoid.Allocators if tableIDIsValid(oldTableID) { - if oldTableID == newTableID && (diff.Type != model.ActionRenameTable && diff.Type != model.ActionRenameTables) && + if oldTableID == newTableID && + // For rename table, keep the old alloc. + // For repairing table in TiDB cluster, given 2 normal node and 1 repair node. // For normal node's information schema, repaired table is existed. // For repair node's information schema, repaired table is filtered (couldn't find it in `is`). @@ -526,6 +528,9 @@ func (b *Builder) applyTableUpdate(m *meta.Meta, diff *model.SchemaDiff) ([]int6 diff.Type != model.ActionRepairTable && // Alter sequence will change the sequence info in the allocator, so the old allocator is not valid any more. diff.Type != model.ActionAlterSequence { + // TODO: Check how this would work with ADD/REMOVE Partitioning, + // which may have AutoID not connected to tableID + // TODO: can there be _tidb_rowid AutoID per partition? oldAllocs, _ := b.is.AllocByID(oldTableID) allocs = filterAllocators(diff, oldAllocs) } diff --git a/pkg/infoschema/infoschema_test.go b/pkg/infoschema/infoschema_test.go index 0e4461744270f..2c91f5562fef1 100644 --- a/pkg/infoschema/infoschema_test.go +++ b/pkg/infoschema/infoschema_test.go @@ -195,7 +195,7 @@ func TestBasic(t *testing.T) { require.NotNil(t, tb) err = kv.RunInNewTxn(ctx, store, true, func(ctx context.Context, txn kv.Transaction) error { - err := meta.NewMeta(txn).CreateTableOrView(dbID, tblInfo) + err := meta.NewMeta(txn).CreateTableOrView(dbID, dbName.L, tblInfo) require.NoError(t, err) return errors.Trace(err) }) @@ -344,7 +344,7 @@ func TestBuildSchemaWithGlobalTemporaryTable(t *testing.T) { createGlobalTemporaryTableChange := func(tblID int64) func(m *meta.Meta, builder *infoschema.Builder) { return func(m *meta.Meta, builder *infoschema.Builder) { - err := m.CreateTableOrView(db.ID, &model.TableInfo{ + err := m.CreateTableOrView(db.ID, db.Name.L, &model.TableInfo{ ID: tblID, TempTableType: model.TempTableGlobal, State: model.StatePublic, @@ -357,7 +357,7 @@ func TestBuildSchemaWithGlobalTemporaryTable(t *testing.T) { createNormalTableChange := func(tblID int64) func(m *meta.Meta, builder *infoschema.Builder) { return func(m *meta.Meta, builder *infoschema.Builder) { - err := m.CreateTableOrView(db.ID, &model.TableInfo{ + err := m.CreateTableOrView(db.ID, db.Name.L, &model.TableInfo{ ID: tblID, State: model.StatePublic, }) @@ -369,7 +369,7 @@ func TestBuildSchemaWithGlobalTemporaryTable(t *testing.T) { dropTableChange := func(tblID int64) func(m *meta.Meta, builder *infoschema.Builder) { return func(m *meta.Meta, builder *infoschema.Builder) { - err := m.DropTableOrView(db.ID, tblID) + err := m.DropTableOrView(db.ID, db.Name.L, tblID, "") require.NoError(t, err) _, err = builder.ApplyDiff(m, &model.SchemaDiff{Type: model.ActionDropTable, SchemaID: db.ID, TableID: tblID}) require.NoError(t, err) @@ -378,10 +378,10 @@ func TestBuildSchemaWithGlobalTemporaryTable(t *testing.T) { truncateGlobalTemporaryTableChange := func(tblID, newTblID int64) func(m *meta.Meta, builder *infoschema.Builder) { return func(m *meta.Meta, builder *infoschema.Builder) { - err := m.DropTableOrView(db.ID, tblID) + err := m.DropTableOrView(db.ID, db.Name.L, tblID, "") require.NoError(t, err) - err = m.CreateTableOrView(db.ID, &model.TableInfo{ + err = m.CreateTableOrView(db.ID, db.Name.L, &model.TableInfo{ ID: newTblID, TempTableType: model.TempTableGlobal, State: model.StatePublic, diff --git a/pkg/infoschema/internal/testkit.go b/pkg/infoschema/internal/testkit.go index 2afe472f98455..50eb91f7ac45a 100644 --- a/pkg/infoschema/internal/testkit.go +++ b/pkg/infoschema/internal/testkit.go @@ -55,6 +55,7 @@ func PrepareSlowLogfile(t *testing.T, slowLogFileName string) { # Plan: abcd # Plan_digest: 60e9378c746d9a2be1c791047e008967cf252eb6de9167ad3aa6098fa2d523f4 # Prev_stmt: update t set i = 2; +# Resource_group: default select * from t_slim; # Time: 2021-09-08T14:39:54.506967433+08:00 # Txn_start_ts: 427578666238083075 @@ -82,6 +83,9 @@ select * from t_slim; # Backoff_total: 100.054 # Write_sql_response_total: 0 # Succ: true +# Resource_group: rg1 +# Request_unit_read: 96.66703066666668 +# Request_unit_write: 3182.424414062492 INSERT INTO ...; `) require.NoError(t, f.Close()) diff --git a/pkg/infoschema/main_test.go b/pkg/infoschema/main_test.go index 579aa9f7bdd61..e6793eeca73a6 100644 --- a/pkg/infoschema/main_test.go +++ b/pkg/infoschema/main_test.go @@ -25,6 +25,7 @@ func TestMain(m *testing.M) { testsetup.SetupForCommonTest() opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), diff --git a/pkg/infoschema/metrics_schema_test.go b/pkg/infoschema/metrics_schema_test.go index c47f77a1b3a9b..c3579b54a7c7f 100644 --- a/pkg/infoschema/metrics_schema_test.go +++ b/pkg/infoschema/metrics_schema_test.go @@ -21,7 +21,7 @@ import ( "github.com/pingcap/tidb/pkg/infoschema" "github.com/pingcap/tidb/pkg/util/set" - "github.com/prometheus/prometheus/promql" + "github.com/prometheus/prometheus/promql/parser" "github.com/stretchr/testify/require" ) @@ -63,7 +63,7 @@ func TestMetricSchemaDef(t *testing.T) { require.Equalf(t, "instance", def.Labels[0], "metrics table %v: expect `instance`is the first label but got %v", name, def.Labels) } - _, err := promql.ParseExpr(mockGenPromQL(def.PromQL)) + _, err := parser.ParseExpr(mockGenPromQL(def.PromQL)) require.NoError(t, err, "fail to parser PromQL %s", def.PromQL) } } diff --git a/pkg/infoschema/perfschema/main_test.go b/pkg/infoschema/perfschema/main_test.go index 87f785f3390b7..889322315f08b 100644 --- a/pkg/infoschema/perfschema/main_test.go +++ b/pkg/infoschema/perfschema/main_test.go @@ -25,6 +25,7 @@ func TestMain(m *testing.M) { testsetup.SetupForCommonTest() opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), diff --git a/pkg/infoschema/perfschema/tables.go b/pkg/infoschema/perfschema/tables.go index 22ba0f1e07310..e369f21309bec 100644 --- a/pkg/infoschema/perfschema/tables.go +++ b/pkg/infoschema/perfschema/tables.go @@ -343,7 +343,7 @@ func dataForRemoteProfile(ctx sessionctx.Context, nodeType, uri string, isGorout for _, server := range servers { statusAddr := server.StatusAddr if len(statusAddr) == 0 { - ctx.GetSessionVars().StmtCtx.AppendWarning(errors.Errorf("TiKV node %s does not contain status address", server.Address)) + ctx.GetSessionVars().StmtCtx.AppendWarning(errors.NewNoStackErrorf("TiKV node %s does not contain status address", server.Address)) continue } diff --git a/pkg/infoschema/tables.go b/pkg/infoschema/tables.go index 5f0e2b86c70cb..a82a5a819ced7 100644 --- a/pkg/infoschema/tables.go +++ b/pkg/infoschema/tables.go @@ -211,6 +211,8 @@ const ( TableCheckConstraints = "CHECK_CONSTRAINTS" // TableTiDBCheckConstraints is the list of CHECK constraints, with non-standard TiDB extensions. TableTiDBCheckConstraints = "TIDB_CHECK_CONSTRAINTS" + // TableKeywords is the list of keywords. + TableKeywords = "KEYWORDS" ) const ( @@ -321,6 +323,7 @@ var tableIDMap = map[string]int64{ TableRunawayWatches: autoid.InformationSchemaDBID + 89, TableCheckConstraints: autoid.InformationSchemaDBID + 90, TableTiDBCheckConstraints: autoid.InformationSchemaDBID + 91, + TableKeywords: autoid.InformationSchemaDBID + 92, } // columnInfo represents the basic column information of all kinds of INFORMATION_SCHEMA tables @@ -927,6 +930,10 @@ var slowQueryCols = []columnInfo{ {name: variable.SlowLogPlanFromCache, tp: mysql.TypeTiny, size: 1}, {name: variable.SlowLogPlanFromBinding, tp: mysql.TypeTiny, size: 1}, {name: variable.SlowLogHasMoreResults, tp: mysql.TypeTiny, size: 1}, + {name: variable.SlowLogResourceGroup, tp: mysql.TypeVarchar, size: 64}, + {name: variable.SlowLogRRU, tp: mysql.TypeDouble, size: 22}, + {name: variable.SlowLogWRU, tp: mysql.TypeDouble, size: 22}, + {name: variable.SlowLogWaitRUDuration, tp: mysql.TypeDouble, size: 22}, {name: variable.SlowLogPlan, tp: mysql.TypeLongBlob, size: types.UnspecifiedLength}, {name: variable.SlowLogPlanDigest, tp: mysql.TypeVarchar, size: 128}, {name: variable.SlowLogBinaryPlan, tp: mysql.TypeLongBlob, size: types.UnspecifiedLength}, @@ -1011,7 +1018,7 @@ var tableAnalyzeStatusCols = []columnInfo{ {name: "FAIL_REASON", tp: mysql.TypeLongBlob, size: types.UnspecifiedLength}, {name: "INSTANCE", tp: mysql.TypeVarchar, size: 512}, {name: "PROCESS_ID", tp: mysql.TypeLonglong, size: 64, flag: mysql.UnsignedFlag}, - {name: "REMAINING_SECONDS", tp: mysql.TypeLonglong, size: 64, flag: mysql.UnsignedFlag}, + {name: "REMAINING_SECONDS", tp: mysql.TypeVarchar, size: 512}, {name: "PROGRESS", tp: mysql.TypeDouble, size: 22, decimal: 6}, {name: "ESTIMATED_TOTAL_ROWS", tp: mysql.TypeLonglong, size: 64, flag: mysql.UnsignedFlag}, } @@ -1361,6 +1368,13 @@ var tableStatementsSummaryCols = []columnInfo{ {name: stmtsummary.Charset, tp: mysql.TypeVarchar, size: 64, comment: "Sampled charset"}, {name: stmtsummary.Collation, tp: mysql.TypeVarchar, size: 64, comment: "Sampled collation"}, {name: stmtsummary.PlanHint, tp: mysql.TypeVarchar, size: 64, comment: "Sampled plan hint"}, + {name: stmtsummary.MaxRequestUnitReadStr, tp: mysql.TypeDouble, flag: mysql.NotNullFlag | mysql.UnsignedFlag, size: 22, comment: "Max read request-unit cost of these statements"}, + {name: stmtsummary.AvgRequestUnitReadStr, tp: mysql.TypeDouble, flag: mysql.NotNullFlag | mysql.UnsignedFlag, size: 22, comment: "Average read request-unit cost of these statements"}, + {name: stmtsummary.MaxRequestUnitWriteStr, tp: mysql.TypeDouble, flag: mysql.NotNullFlag | mysql.UnsignedFlag, size: 22, comment: "Max write request-unit cost of these statements"}, + {name: stmtsummary.AvgRequestUnitWriteStr, tp: mysql.TypeDouble, flag: mysql.NotNullFlag | mysql.UnsignedFlag, size: 22, comment: "Average write request-unit cost of these statements"}, + {name: stmtsummary.MaxQueuedRcTimeStr, tp: mysql.TypeLonglong, size: 22, flag: mysql.NotNullFlag | mysql.UnsignedFlag, comment: "Max time of waiting for available request-units"}, + {name: stmtsummary.AvgQueuedRcTimeStr, tp: mysql.TypeLonglong, size: 22, flag: mysql.NotNullFlag | mysql.UnsignedFlag, comment: "Max time of waiting for available request-units"}, + {name: stmtsummary.ResourceGroupName, tp: mysql.TypeVarchar, size: 64, comment: "Bind resource group name"}, } var tableStorageStatsCols = []columnInfo{ @@ -1651,6 +1665,11 @@ var tableTiDBCheckConstraintsCols = []columnInfo{ {name: "TABLE_ID", tp: mysql.TypeLonglong, size: 21}, } +var tableKeywords = []columnInfo{ + {name: "WORD", tp: mysql.TypeVarchar, size: 128}, + {name: "RESERVED", tp: mysql.TypeLong, size: 11}, +} + // GetShardingInfo returns a nil or description string for the sharding information of given TableInfo. // The returned description string may be: // - "NOT_SHARDED": for tables that SHARD_ROW_ID_BITS is not specified. @@ -2190,6 +2209,7 @@ var tableNameToColumns = map[string][]columnInfo{ TableRunawayWatches: tableRunawayWatchListCols, TableCheckConstraints: tableCheckConstraintsCols, TableTiDBCheckConstraints: tableTiDBCheckConstraintsCols, + TableKeywords: tableKeywords, } func createInfoSchemaTable(_ autoid.Allocators, meta *model.TableInfo) (table.Table, error) { diff --git a/pkg/infoschema/test/cachetest/main_test.go b/pkg/infoschema/test/cachetest/main_test.go index 98553b931416a..eed06ef58be79 100644 --- a/pkg/infoschema/test/cachetest/main_test.go +++ b/pkg/infoschema/test/cachetest/main_test.go @@ -25,6 +25,7 @@ func TestMain(m *testing.M) { testsetup.SetupForCommonTest() opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), diff --git a/pkg/infoschema/test/clustertablestest/BUILD.bazel b/pkg/infoschema/test/clustertablestest/BUILD.bazel index e992561b17378..3a8dd9de576e2 100644 --- a/pkg/infoschema/test/clustertablestest/BUILD.bazel +++ b/pkg/infoschema/test/clustertablestest/BUILD.bazel @@ -9,7 +9,7 @@ go_test( "tables_test.go", ], flaky = True, - shard_count = 46, + shard_count = 47, deps = [ "//pkg/config", "//pkg/domain", @@ -25,6 +25,7 @@ go_test( "//pkg/parser/mysql", "//pkg/parser/terror", "//pkg/planner/core", + "//pkg/privilege/privileges", "//pkg/server", "//pkg/session", "//pkg/session/txninfo", @@ -50,6 +51,7 @@ go_test( "@com_github_pingcap_kvproto//pkg/metapb", "@com_github_pingcap_tipb//go-tipb", "@com_github_stretchr_testify//require", + "@com_github_tikv_client_go_v2//oracle", "@com_github_tikv_client_go_v2//testutils", "@com_github_tikv_pd_client//http", "@org_golang_google_grpc//:grpc", diff --git a/pkg/infoschema/test/clustertablestest/cluster_tables_test.go b/pkg/infoschema/test/clustertablestest/cluster_tables_test.go index ffd50fb8e798d..307b930bcc13a 100644 --- a/pkg/infoschema/test/clustertablestest/cluster_tables_test.go +++ b/pkg/infoschema/test/clustertablestest/cluster_tables_test.go @@ -41,6 +41,7 @@ import ( "github.com/pingcap/tidb/pkg/parser" "github.com/pingcap/tidb/pkg/parser/auth" "github.com/pingcap/tidb/pkg/parser/mysql" + "github.com/pingcap/tidb/pkg/privilege/privileges" "github.com/pingcap/tidb/pkg/server" "github.com/pingcap/tidb/pkg/store/mockstore" "github.com/pingcap/tidb/pkg/store/mockstore/mockstorage" @@ -833,14 +834,21 @@ func (s *clusterTablesSuite) newTestKitWithRoot(t *testing.T) *testkit.TestKit { func TestMDLView(t *testing.T) { testCases := []struct { name string - createTable string + createTable []string ddl string queryInTxn []string sqlDigest string }{ - {"add column", "create table t(a int)", "alter table test.t add column b int", []string{"select 1", "select * from t"}, "[\"begin\",\"select ?\",\"select * from `t`\"]"}, - {"change column in 1 step", "create table t(a int)", "alter table test.t change column a b int", []string{"select 1", "select * from t"}, "[\"begin\",\"select ?\",\"select * from `t`\"]"}, + {"add column", []string{"create table t(a int)"}, "alter table test.t add column b int", []string{"select 1", "select * from t"}, "[\"begin\",\"select ?\",\"select * from `t`\"]"}, + {"change column in 1 step", []string{"create table t(a int)"}, "alter table test.t change column a b int", []string{"select 1", "select * from t"}, "[\"begin\",\"select ?\",\"select * from `t`\"]"}, + {"rename tables", []string{"create table t(a int)", "create table t1(a int)"}, "rename table test.t to test.t2, test.t1 to test.t3", []string{"select 1", "select * from t"}, "[\"begin\",\"select ?\",\"select * from `t`\"]"}, + {"err don't show rollbackdone ddl", []string{"create table t(a int)", "insert into t values (1);", "insert into t values (1);", "alter table t add unique idx(id);"}, "alter table test.t add column b int", []string{"select 1", "select * from t"}, "[\"begin\",\"select ?\",\"select * from `t`\"]"}, } + save := privileges.SkipWithGrant + privileges.SkipWithGrant = true + defer func() { + privileges.SkipWithGrant = save + }() for _, c := range testCases { t.Run(c.name, func(t *testing.T) { // setup suite @@ -855,7 +863,13 @@ func TestMDLView(t *testing.T) { tk3 := s.newTestKitWithRoot(t) tk.MustExec("use test") tk.MustExec("set global tidb_enable_metadata_lock=1") - tk.MustExec(c.createTable) + for _, cr := range c.createTable { + if strings.Contains(c.name, "err") { + _, _ = tk.Exec(cr) + } else { + tk.MustExec(cr) + } + } tk.MustExec("begin") for _, q := range c.queryInTxn { @@ -1080,6 +1094,57 @@ func TestQuickBinding(t *testing.T) { } } +// for testing, only returns Original_sql, Bind_sql, Default_db, Status, Source, Sql_digest +func showBinding(tk *testkit.TestKit, showStmt string) [][]interface{} { + rows := tk.MustQuery(showStmt).Sort().Rows() + result := make([][]interface{}, len(rows)) + for i, r := range rows { + result[i] = append(result[i], r[:4]...) + result[i] = append(result[i], r[8:10]...) + } + return result +} + +func TestUniversalBindingFromHistory(t *testing.T) { + t.Skip("skip it temporarily") + s := new(clusterTablesSuite) + s.store, s.dom = testkit.CreateMockStoreAndDomain(t) + s.rpcserver, s.listenAddr = s.setUpRPCService(t, "127.0.0.1:0", nil) + s.httpServer, s.mockAddr = s.setUpMockPDHTTPServer() + s.startTime = time.Now() + defer s.httpServer.Close() + defer s.rpcserver.Stop() + tk := s.newTestKitWithRoot(t) + require.NoError(t, tk.Session().Auth(&auth.UserIdentity{Username: "root", Hostname: "%"}, nil, nil, nil)) + + tk.MustExec(`use test`) + tk.MustExec(`create table t (a int, b int, c int, key(a), key(b), key(c))`) + tk.MustExec(`select /*+ use_index(t, b) */ a from t where a=1`) + tk.MustExec(`select /*+ use_index(t, c) */ b from t where b=1`) + + planDigest := tk.MustQuery(`select plan_digest from information_schema.statements_summary where query_sample_text='select /*+ use_index(t, b) */ a from t where a=1'`).Rows() + tk.MustExec(fmt.Sprintf("create global universal binding from history using plan digest '%s'", planDigest[0][0].(string))) + planDigest = tk.MustQuery(`select plan_digest from information_schema.statements_summary where query_sample_text='select /*+ use_index(t, c) */ b from t where b=1'`).Rows() + tk.MustExec(fmt.Sprintf("create global universal binding from history using plan digest '%s'", planDigest[0][0].(string))) + + require.Equal(t, showBinding(tk, `show global bindings`), [][]interface{}{ + {"select `a` from `t` where `a` = ?", "SELECT /*+ use_index(@`sel_1` `t` `b`) no_order_index(@`sel_1` `t` `b`)*/ `a` FROM `t` WHERE `a` = 1", "", "enabled", "history", "f8e294e078ed195998dee6717e71499d6a14b8e0f405952af8d0a5b24d0cae30"}, + {"select `b` from `t` where `b` = ?", "SELECT /*+ use_index(@`sel_1` `t` `c`) no_order_index(@`sel_1` `t` `c`)*/ `b` FROM `t` WHERE `b` = 1", "", "enabled", "history", "cfb4dd59c4c75ff1ee126236c6bd365f7d04f6120990d922e75aa47ae8bd94eb"}, + }) + + tk.MustExec(`admin reload bindings`) + tk.MustExec(`set @@tidb_opt_enable_fuzzy_binding=1`) + tk.MustExec(`create database test2`) + tk.MustExec(`use test2`) + tk.MustExec(`create table t (a int, b int, c int, key(a), key(b), key(c))`) + tk.MustExec(`select a from t where a=10`) + tk.MustQuery(`select @@last_plan_from_binding`).Check(testkit.Rows("1")) + tk.MustExec(`select b from t where b=10`) + tk.MustQuery(`select @@last_plan_from_binding`).Check(testkit.Rows("1")) + tk.MustExec(`select b from test.t where b=10`) + tk.MustQuery(`select @@last_plan_from_binding`).Check(testkit.Rows("1")) +} + func TestCreateBindingFromHistory(t *testing.T) { s := new(clusterTablesSuite) s.store, s.dom = testkit.CreateMockStoreAndDomain(t) @@ -1277,7 +1342,6 @@ func TestSetBindingStatusBySQLDigest(t *testing.T) { tk.MustExec(fmt.Sprintf("set binding enabled for sql digest '%s'", sqlDigest[0][9])) tk.MustExec(sql) tk.MustQuery("select @@last_plan_from_binding").Check(testkit.Rows("1")) - tk.MustGetErrMsg("set binding enabled for sql digest '2'", "can't find any binding for '2'") tk.MustGetErrMsg("set binding enabled for sql digest ''", "sql digest is empty") tk.MustGetErrMsg("set binding disabled for sql digest ''", "sql digest is empty") } diff --git a/pkg/infoschema/test/clustertablestest/main_test.go b/pkg/infoschema/test/clustertablestest/main_test.go index 2c38419f9519a..ed883c644c3e9 100644 --- a/pkg/infoschema/test/clustertablestest/main_test.go +++ b/pkg/infoschema/test/clustertablestest/main_test.go @@ -25,6 +25,7 @@ func TestMain(m *testing.M) { testsetup.SetupForCommonTest() opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), diff --git a/pkg/infoschema/test/clustertablestest/tables_test.go b/pkg/infoschema/test/clustertablestest/tables_test.go index 4f646173e65be..bcfb270b929cd 100644 --- a/pkg/infoschema/test/clustertablestest/tables_test.go +++ b/pkg/infoschema/test/clustertablestest/tables_test.go @@ -46,6 +46,7 @@ import ( "github.com/pingcap/tidb/pkg/util/gctuner" "github.com/pingcap/tidb/pkg/util/memory" "github.com/stretchr/testify/require" + "github.com/tikv/client-go/v2/oracle" ) func newTestKitWithRoot(t *testing.T, store kv.Storage) *testkit.TestKit { @@ -431,11 +432,16 @@ func TestSlowQuery(t *testing.T) { "1", "0", "0", + "default", + "0", + "0", + "0", "abcd", "60e9378c746d9a2be1c791047e008967cf252eb6de9167ad3aa6098fa2d523f4", "", "update t set i = 2;", - "select * from t_slim;"}, + "select * from t_slim;", + }, {"2021-09-08 14:39:54.506967", "427578666238083075", "root", @@ -506,6 +512,10 @@ func TestSlowQuery(t *testing.T) { "0", "0", "0", + "rg1", + "96.66703066666668", + "3182.424414062492", + "0", "", "", "", @@ -1001,39 +1011,6 @@ func TestStmtSummaryInternalQuery(t *testing.T) { // Disable refreshing summary. tk.MustExec("set global tidb_stmt_summary_refresh_interval = 999999999") tk.MustQuery("select @@global.tidb_stmt_summary_refresh_interval").Check(testkit.Rows("999999999")) - - // Test Internal - - // Create a new session to test. - tk = newTestKitWithRoot(t, store) - - tk.MustExec("select * from t where t.a = 1") - tk.MustQuery(`select exec_count, digest_text - from information_schema.statements_summary - where digest_text like "select original_sql , bind_sql , default_db , status%"`).Check(testkit.Rows()) - - // Enable internal query and evolve baseline. - tk.MustExec("set global tidb_stmt_summary_internal_query = 1") - defer tk.MustExec("set global tidb_stmt_summary_internal_query = false") - - // Create a new session to test. - tk = newTestKitWithRoot(t, store) - - tk.MustExec("admin flush bindings") - tk.MustExec("admin evolve bindings") - - // `exec_count` may be bigger than 1 because other cases are also running. - sql := "select digest_text " + - "from information_schema.statements_summary " + - "where digest_text like \"select `original_sql` , `bind_sql` , `default_db` , status%\"" - tk.MustQuery(sql).Check(testkit.Rows( - "select `original_sql` , `bind_sql` , `default_db` , status , `create_time` , `update_time` , charset , " + - "collation , source , `sql_digest` , `plan_digest` from `mysql` . `bind_info` where `update_time` > ? order by `update_time` , `create_time`")) - - // Test for issue #21642. - tk.MustQuery(`select tidb_version()`) - rows := tk.MustQuery("select plan from information_schema.statements_summary where digest_text like \"select `tidb_version`%\"").Rows() - require.Contains(t, rows[0][0].(string), "Projection") } // TestSimpleStmtSummaryEvictedCount test stmtSummaryEvictedCount @@ -1205,8 +1182,12 @@ func TestTiDBTrx(t *testing.T) { memDBTracker := memory.NewTracker(memory.LabelForMemDB, -1) memDBTracker.Consume(19) tk.Session().GetSessionVars().MemDBFootprint = memDBTracker + + t1 := time.Date(2021, 5, 7, 4, 56, 48, 1000000, time.UTC) + t2 := time.Date(2021, 5, 20, 13, 16, 35, 778000000, time.UTC) + sm.TxnInfo[0] = &txninfo.TxnInfo{ - StartTS: 424768545227014155, + StartTS: oracle.GoTimeToTS(t1), CurrentSQLDigest: digest.String(), State: txninfo.TxnIdle, EntriesCount: 1, @@ -1217,7 +1198,7 @@ func TestTiDBTrx(t *testing.T) { blockTime2 := time.Date(2021, 05, 20, 13, 18, 30, 123456000, time.Local) sm.TxnInfo[1] = &txninfo.TxnInfo{ - StartTS: 425070846483628033, + StartTS: oracle.GoTimeToTS(t2), CurrentSQLDigest: "", AllSQLDigests: []string{"sql1", "sql2", digest.String()}, State: txninfo.TxnLockAcquiring, @@ -1243,8 +1224,11 @@ func TestTiDBTrx(t *testing.T) { ALL_SQL_DIGESTS, RELATED_TABLE_IDS from information_schema.TIDB_TRX`).Check(testkit.Rows( - "424768545227014155 2021-05-07 12:56:48.001000 "+digest.String()+" update `test_tidb_trx` set `i` = `i` + ? Idle 1 19 2 root test [] ", - "425070846483628033 2021-05-20 21:16:35.778000 LockWaiting 2021-05-20 13:18:30.123456 0 19 10 user1 db1 [\"sql1\",\"sql2\",\""+digest.String()+"\"] ")) + "424768545227014144 "+t1.Local().Format(types.TimeFSPFormat)+" "+digest.String()+" update `test_tidb_trx` set `i` = `i` + ? Idle 1 19 2 root test [] ", + "425070846483628032 "+t2.Local().Format(types.TimeFSPFormat)+" LockWaiting "+ + // `WAITING_START_TIME` will not be affected by time_zone, it is in memory and we assume that the system time zone will not change. + blockTime2.Format(types.TimeFSPFormat)+ + " 0 19 10 user1 db1 [\"sql1\",\"sql2\",\""+digest.String()+"\"] ")) rows := tk.MustQuery(`select WAITING_TIME from information_schema.TIDB_TRX where WAITING_TIME is not null`) require.Len(t, rows.Rows(), 1) diff --git a/pkg/kv/kv.go b/pkg/kv/kv.go index f82c7919e5180..51503b04318f3 100644 --- a/pkg/kv/kv.go +++ b/pkg/kv/kv.go @@ -53,7 +53,7 @@ const UnCommitIndexKVFlag byte = '1' // Those limits is enforced to make sure the transaction can be well handled by TiKV. var ( // TxnEntrySizeLimit is limit of single entry size (len(key) + len(value)). - TxnEntrySizeLimit uint64 = config.DefTxnEntrySizeLimit + TxnEntrySizeLimit = atomic.NewUint64(config.DefTxnEntrySizeLimit) // TxnTotalSizeLimit is limit of the sum of all entry size. TxnTotalSizeLimit = atomic.NewUint64(config.DefTxnTotalSizeLimit) ) diff --git a/pkg/kv/main_test.go b/pkg/kv/main_test.go index 943837a8a9db5..d62d0f9f7bb83 100644 --- a/pkg/kv/main_test.go +++ b/pkg/kv/main_test.go @@ -26,6 +26,7 @@ func TestMain(m *testing.M) { opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), diff --git a/pkg/kv/mpp.go b/pkg/kv/mpp.go index bde0de12cbbcf..14ee3b95765c2 100644 --- a/pkg/kv/mpp.go +++ b/pkg/kv/mpp.go @@ -224,6 +224,8 @@ type MppCoordinator interface { Close() error // IsClosed returns whether mpp coordinator is closed or not IsClosed() bool + // GetComputationCnt returns the number of node cnt that involved in the MPP computation. + GetNodeCnt() int } // MPPBuildTasksRequest request the stores allocation for a mpp plan fragment. diff --git a/pkg/kv/option.go b/pkg/kv/option.go index 681940cc424da..21b7df2ada698 100644 --- a/pkg/kv/option.go +++ b/pkg/kv/option.go @@ -110,8 +110,16 @@ const ( LoadBasedReplicaReadThreshold // TiKVClientReadTimeout sets the timeout value for readonly kv request in milliseconds TiKVClientReadTimeout + // SizeLimits sets the size limits of membuf + SizeLimits ) +// TxnSizeLimits is the argument type for `SizeLimits` option +type TxnSizeLimits struct { + Entry uint64 + Total uint64 +} + // ReplicaReadType is the type of replica to read data from type ReplicaReadType byte diff --git a/pkg/meta/BUILD.bazel b/pkg/meta/BUILD.bazel index da1708f16099a..6f7b77051f643 100644 --- a/pkg/meta/BUILD.bazel +++ b/pkg/meta/BUILD.bazel @@ -19,6 +19,7 @@ go_library( "//pkg/util/dbterror", "@com_github_pingcap_errors//:errors", "@com_github_pingcap_kvproto//pkg/kvrpcpb", + "@com_github_pingcap_kvproto//pkg/resource_manager", ], ) diff --git a/pkg/meta/autoid/BUILD.bazel b/pkg/meta/autoid/BUILD.bazel index 586c4a54974c9..7a13113d39d81 100644 --- a/pkg/meta/autoid/BUILD.bazel +++ b/pkg/meta/autoid/BUILD.bazel @@ -62,7 +62,6 @@ go_test( "@com_github_pingcap_errors//:errors", "@com_github_pingcap_failpoint//:failpoint", "@com_github_stretchr_testify//require", - "@io_etcd_go_etcd_client_v3//:client", "@org_uber_go_goleak//:goleak", ], ) diff --git a/pkg/meta/autoid/autoid.go b/pkg/meta/autoid/autoid.go index afe0bb576613b..1492dd995d1e1 100644 --- a/pkg/meta/autoid/autoid.go +++ b/pkg/meta/autoid/autoid.go @@ -38,7 +38,6 @@ import ( "github.com/pingcap/tidb/pkg/util/tracing" "github.com/tikv/client-go/v2/txnkv/txnsnapshot" tikvutil "github.com/tikv/client-go/v2/util" - clientv3 "go.etcd.io/etcd/client/v3" "go.uber.org/zap" ) @@ -260,7 +259,7 @@ type allocator struct { base int64 end int64 store kv.Storage - // dbID is current database's ID. + // dbID is database ID where it was created. dbID int64 tbID int64 tbVersion uint16 @@ -574,12 +573,12 @@ func newSinglePointAlloc(r Requirement, dbID, tblID int64, isUnsigned bool) *sin isUnsigned: isUnsigned, keyspaceID: keyspaceID, } - if r.GetEtcdClient() == nil { + if r.AutoIDClient() == nil { // Only for test in mockstore - spa.clientDiscover = clientDiscover{} + spa.ClientDiscover = &ClientDiscover{} spa.mu.AutoIDAllocClient = MockForTest(r.Store()) } else { - spa.clientDiscover = clientDiscover{etcdCli: r.GetEtcdClient()} + spa.ClientDiscover = r.AutoIDClient() } // mockAutoIDChange failpoint is not implemented in this allocator, so fallback to use the default one. @@ -594,7 +593,7 @@ func newSinglePointAlloc(r Requirement, dbID, tblID int64, isUnsigned bool) *sin // Requirement is the parameter required by NewAllocator type Requirement interface { Store() kv.Storage - GetEtcdClient() *clientv3.Client + AutoIDClient() *ClientDiscover } // NewAllocator returns a new auto increment id generator on the store. @@ -654,7 +653,7 @@ func NewSequenceAllocator(store kv.Storage, dbID, tbID int64, info *model.Sequen // NewAllocatorsFromTblInfo creates an array of allocators of different types with the information of model.TableInfo. func NewAllocatorsFromTblInfo(r Requirement, schemaID int64, tblInfo *model.TableInfo) Allocators { var allocs []Allocator - dbID := tblInfo.GetDBID(schemaID) + dbID := tblInfo.GetAutoIDSchemaID(schemaID) idCacheOpt := CustomAutoIncCacheOption(tblInfo.AutoIdCache) tblVer := AllocOptionTableInfoVersion(tblInfo.Version) diff --git a/pkg/meta/autoid/autoid_service.go b/pkg/meta/autoid/autoid_service.go index 982fae84091ac..73f6857184e14 100644 --- a/pkg/meta/autoid/autoid_service.go +++ b/pkg/meta/autoid/autoid_service.go @@ -40,11 +40,12 @@ type singlePointAlloc struct { tblID int64 lastAllocated int64 isUnsigned bool - clientDiscover + *ClientDiscover keyspaceID uint32 } -type clientDiscover struct { +// ClientDiscover is used to get the AutoIDAllocClient, it creates the grpc connection with autoid service leader. +type ClientDiscover struct { // This the etcd client for service discover etcdCli *clientv3.Client // This is the real client for the AutoIDAlloc service @@ -61,7 +62,15 @@ const ( autoIDLeaderPath = "tidb/autoid/leader" ) -func (d *clientDiscover) GetClient(ctx context.Context) (autoid.AutoIDAllocClient, error) { +// NewClientDiscover creates a ClientDiscover object. +func NewClientDiscover(etcdCli *clientv3.Client) *ClientDiscover { + return &ClientDiscover{ + etcdCli: etcdCli, + } +} + +// GetClient gets the AutoIDAllocClient. +func (d *ClientDiscover) GetClient(ctx context.Context) (autoid.AutoIDAllocClient, error) { d.mu.RLock() cli := d.mu.AutoIDAllocClient if cli != nil { @@ -120,6 +129,7 @@ func (sp *singlePointAlloc) Alloc(ctx context.Context, n uint64, increment, offs return 0, 0, errInvalidIncrementAndOffset.GenWithStackByArgs(increment, offset) } + var bo backoffer retry: cli, err := sp.GetClient(ctx) if err != nil { @@ -139,12 +149,13 @@ retry: metrics.AutoIDHistogram.WithLabelValues(metrics.TableAutoIDAlloc, metrics.RetLabel(err)).Observe(time.Since(start).Seconds()) if err != nil { if strings.Contains(err.Error(), "rpc error") { - time.Sleep(backoffDuration) - sp.resetConn(err) + sp.ResetConn(err) + bo.Backoff() goto retry } return 0, 0, errors.Trace(err) } + bo.Reset() if len(resp.Errmsg) != 0 { return 0, 0, errors.Trace(errors.New(string(resp.Errmsg))) } @@ -155,17 +166,43 @@ retry: return resp.Min, resp.Max, err } -const backoffDuration = 200 * time.Millisecond +const backoffMin = 200 * time.Millisecond +const backoffMax = 5 * time.Second + +type backoffer struct { + time.Duration +} + +func (b *backoffer) Reset() { + b.Duration = backoffMin +} + +func (b *backoffer) Backoff() { + if b.Duration == 0 { + b.Duration = backoffMin + } + b.Duration *= 2 + if b.Duration > backoffMax { + b.Duration = backoffMax + } + time.Sleep(b.Duration) +} -func (sp *singlePointAlloc) resetConn(reason error) { - logutil.BgLogger().Info("reset grpc connection", zap.String("category", "autoid client"), - zap.String("reason", reason.Error())) +// ResetConn reset the AutoIDAllocClient and underlying grpc connection. +// The next GetClient() call will recreate the client connecting to the correct leader by querying etcd. +func (d *ClientDiscover) ResetConn(reason error) { + if reason != nil { + logutil.BgLogger().Info("reset grpc connection", zap.String("category", "autoid client"), + zap.String("reason", reason.Error())) + } + + metrics.ResetAutoIDConnCounter.Add(1) var grpcConn *grpc.ClientConn - sp.mu.Lock() - grpcConn = sp.mu.ClientConn - sp.mu.AutoIDAllocClient = nil - sp.mu.ClientConn = nil - sp.mu.Unlock() + d.mu.Lock() + grpcConn = d.mu.ClientConn + d.mu.AutoIDAllocClient = nil + d.mu.ClientConn = nil + d.mu.Unlock() // Close grpc.ClientConn to release resource. if grpcConn != nil { err := grpcConn.Close() @@ -196,6 +233,7 @@ func (sp *singlePointAlloc) Rebase(ctx context.Context, newBase int64, _ bool) e } func (sp *singlePointAlloc) rebase(ctx context.Context, newBase int64, force bool) error { + var bo backoffer retry: cli, err := sp.GetClient(ctx) if err != nil { @@ -211,12 +249,13 @@ retry: }) if err != nil { if strings.Contains(err.Error(), "rpc error") { - time.Sleep(backoffDuration) - sp.resetConn(err) + sp.ResetConn(err) + bo.Backoff() goto retry } return errors.Trace(err) } + bo.Reset() if len(resp.Errmsg) != 0 { return errors.Trace(errors.New(string(resp.Errmsg))) } diff --git a/pkg/meta/autoid/autoid_test.go b/pkg/meta/autoid/autoid_test.go index 6e5b85b7eb701..f6fa527db7d36 100644 --- a/pkg/meta/autoid/autoid_test.go +++ b/pkg/meta/autoid/autoid_test.go @@ -33,7 +33,6 @@ import ( "github.com/pingcap/tidb/pkg/store/mockstore" "github.com/pingcap/tidb/pkg/util" "github.com/stretchr/testify/require" - clientv3 "go.etcd.io/etcd/client/v3" ) type mockRequirement struct { @@ -44,7 +43,7 @@ func (r mockRequirement) Store() kv.Storage { return r.Storage } -func (r mockRequirement) GetEtcdClient() *clientv3.Client { +func (r mockRequirement) AutoIDClient() *autoid.ClientDiscover { return nil } @@ -54,7 +53,7 @@ func TestSignedAutoid(t *testing.T) { require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/meta/autoid/mockAutoIDChange")) }() - store, err := mockstore.NewMockStore() + store, err := mockstore.NewMockStore(mockstore.WithStoreType(mockstore.EmbedUnistore)) require.NoError(t, err) defer func() { err := store.Close() @@ -66,15 +65,15 @@ func TestSignedAutoid(t *testing.T) { m := meta.NewMeta(txn) err = m.CreateDatabase(&model.DBInfo{ID: 1, Name: model.NewCIStr("a")}) require.NoError(t, err) - err = m.CreateTableOrView(1, &model.TableInfo{ID: 1, Name: model.NewCIStr("t")}) + err = m.CreateTableOrView(1, "", &model.TableInfo{ID: 1, Name: model.NewCIStr("t")}) require.NoError(t, err) - err = m.CreateTableOrView(1, &model.TableInfo{ID: 2, Name: model.NewCIStr("t1")}) + err = m.CreateTableOrView(1, "", &model.TableInfo{ID: 2, Name: model.NewCIStr("t1")}) require.NoError(t, err) - err = m.CreateTableOrView(1, &model.TableInfo{ID: 3, Name: model.NewCIStr("t1")}) + err = m.CreateTableOrView(1, "", &model.TableInfo{ID: 3, Name: model.NewCIStr("t1")}) require.NoError(t, err) - err = m.CreateTableOrView(1, &model.TableInfo{ID: 4, Name: model.NewCIStr("t2")}) + err = m.CreateTableOrView(1, "", &model.TableInfo{ID: 4, Name: model.NewCIStr("t2")}) require.NoError(t, err) - err = m.CreateTableOrView(1, &model.TableInfo{ID: 5, Name: model.NewCIStr("t3")}) + err = m.CreateTableOrView(1, "", &model.TableInfo{ID: 5, Name: model.NewCIStr("t3")}) require.NoError(t, err) return nil }) @@ -259,7 +258,7 @@ func TestUnsignedAutoid(t *testing.T) { require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/meta/autoid/mockAutoIDChange")) }() - store, err := mockstore.NewMockStore() + store, err := mockstore.NewMockStore(mockstore.WithStoreType(mockstore.EmbedUnistore)) require.NoError(t, err) defer func() { err := store.Close() @@ -271,15 +270,15 @@ func TestUnsignedAutoid(t *testing.T) { m := meta.NewMeta(txn) err = m.CreateDatabase(&model.DBInfo{ID: 1, Name: model.NewCIStr("a")}) require.NoError(t, err) - err = m.CreateTableOrView(1, &model.TableInfo{ID: 1, Name: model.NewCIStr("t")}) + err = m.CreateTableOrView(1, "", &model.TableInfo{ID: 1, Name: model.NewCIStr("t")}) require.NoError(t, err) - err = m.CreateTableOrView(1, &model.TableInfo{ID: 2, Name: model.NewCIStr("t1")}) + err = m.CreateTableOrView(1, "", &model.TableInfo{ID: 2, Name: model.NewCIStr("t1")}) require.NoError(t, err) - err = m.CreateTableOrView(1, &model.TableInfo{ID: 3, Name: model.NewCIStr("t1")}) + err = m.CreateTableOrView(1, "", &model.TableInfo{ID: 3, Name: model.NewCIStr("t1")}) require.NoError(t, err) - err = m.CreateTableOrView(1, &model.TableInfo{ID: 4, Name: model.NewCIStr("t2")}) + err = m.CreateTableOrView(1, "", &model.TableInfo{ID: 4, Name: model.NewCIStr("t2")}) require.NoError(t, err) - err = m.CreateTableOrView(1, &model.TableInfo{ID: 5, Name: model.NewCIStr("t3")}) + err = m.CreateTableOrView(1, "", &model.TableInfo{ID: 5, Name: model.NewCIStr("t3")}) require.NoError(t, err) return nil }) @@ -417,7 +416,7 @@ func TestUnsignedAutoid(t *testing.T) { // TestConcurrentAlloc is used for the test that // multiple allocators allocate ID with the same table ID concurrently. func TestConcurrentAlloc(t *testing.T) { - store, err := mockstore.NewMockStore() + store, err := mockstore.NewMockStore(mockstore.WithStoreType(mockstore.EmbedUnistore)) require.NoError(t, err) defer func() { err := store.Close() @@ -435,7 +434,7 @@ func TestConcurrentAlloc(t *testing.T) { m := meta.NewMeta(txn) err = m.CreateDatabase(&model.DBInfo{ID: dbID, Name: model.NewCIStr("a")}) require.NoError(t, err) - err = m.CreateTableOrView(dbID, &model.TableInfo{ID: tblID, Name: model.NewCIStr("t")}) + err = m.CreateTableOrView(dbID, "a", &model.TableInfo{ID: tblID, Name: model.NewCIStr("t")}) require.NoError(t, err) return nil }) @@ -508,7 +507,7 @@ func TestConcurrentAlloc(t *testing.T) { // TestRollbackAlloc tests that when the allocation transaction commit failed, // the local variable base and end doesn't change. func TestRollbackAlloc(t *testing.T) { - store, err := mockstore.NewMockStore() + store, err := mockstore.NewMockStore(mockstore.WithStoreType(mockstore.EmbedUnistore)) require.NoError(t, err) defer func() { err := store.Close() @@ -521,7 +520,7 @@ func TestRollbackAlloc(t *testing.T) { m := meta.NewMeta(txn) err = m.CreateDatabase(&model.DBInfo{ID: dbID, Name: model.NewCIStr("a")}) require.NoError(t, err) - err = m.CreateTableOrView(dbID, &model.TableInfo{ID: tblID, Name: model.NewCIStr("t")}) + err = m.CreateTableOrView(dbID, "a", &model.TableInfo{ID: tblID, Name: model.NewCIStr("t")}) require.NoError(t, err) return nil }) @@ -559,7 +558,7 @@ func TestAllocComputationIssue(t *testing.T) { require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/meta/autoid/mockAutoIDCustomize")) }() - store, err := mockstore.NewMockStore() + store, err := mockstore.NewMockStore(mockstore.WithStoreType(mockstore.EmbedUnistore)) require.NoError(t, err) defer func() { err := store.Close() @@ -571,9 +570,9 @@ func TestAllocComputationIssue(t *testing.T) { m := meta.NewMeta(txn) err = m.CreateDatabase(&model.DBInfo{ID: 1, Name: model.NewCIStr("a")}) require.NoError(t, err) - err = m.CreateTableOrView(1, &model.TableInfo{ID: 1, Name: model.NewCIStr("t")}) + err = m.CreateTableOrView(1, "a", &model.TableInfo{ID: 1, Name: model.NewCIStr("t")}) require.NoError(t, err) - err = m.CreateTableOrView(1, &model.TableInfo{ID: 2, Name: model.NewCIStr("t1")}) + err = m.CreateTableOrView(1, "a", &model.TableInfo{ID: 2, Name: model.NewCIStr("t1")}) require.NoError(t, err) return nil }) @@ -610,7 +609,7 @@ func TestAllocComputationIssue(t *testing.T) { } func TestIssue40584(t *testing.T) { - store, err := mockstore.NewMockStore() + store, err := mockstore.NewMockStore(mockstore.WithStoreType(mockstore.EmbedUnistore)) require.NoError(t, err) defer func() { err := store.Close() @@ -622,7 +621,7 @@ func TestIssue40584(t *testing.T) { m := meta.NewMeta(txn) err = m.CreateDatabase(&model.DBInfo{ID: 1, Name: model.NewCIStr("a")}) require.NoError(t, err) - err = m.CreateTableOrView(1, &model.TableInfo{ID: 1, Name: model.NewCIStr("t")}) + err = m.CreateTableOrView(1, "a", &model.TableInfo{ID: 1, Name: model.NewCIStr("t")}) require.NoError(t, err) return nil }) diff --git a/pkg/meta/autoid/bench_test.go b/pkg/meta/autoid/bench_test.go index f2df4e67633c2..cd196440bb012 100644 --- a/pkg/meta/autoid/bench_test.go +++ b/pkg/meta/autoid/bench_test.go @@ -48,7 +48,7 @@ func BenchmarkAllocator_Alloc(b *testing.B) { if err != nil { return err } - err = m.CreateTableOrView(dbID, &model.TableInfo{ID: tblID, Name: model.NewCIStr("t")}) + err = m.CreateTableOrView(dbID, "a", &model.TableInfo{ID: tblID, Name: model.NewCIStr("t")}) if err != nil { return err } @@ -103,7 +103,7 @@ func BenchmarkAllocator_SequenceAlloc(b *testing.B) { Sequence: seq, } sequenceBase = seq.Start - 1 - err = m.CreateSequenceAndSetSeqValue(1, seqTable, sequenceBase) + err = m.CreateSequenceAndSetSeqValue(1, "a", seqTable, sequenceBase) return err }) if err != nil { diff --git a/pkg/meta/autoid/main_test.go b/pkg/meta/autoid/main_test.go index 4c65fd74fc3b1..52a91fdb2e00c 100644 --- a/pkg/meta/autoid/main_test.go +++ b/pkg/meta/autoid/main_test.go @@ -25,6 +25,7 @@ func TestMain(m *testing.M) { testsetup.SetupForCommonTest() opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), diff --git a/pkg/meta/autoid/seq_autoid_test.go b/pkg/meta/autoid/seq_autoid_test.go index 2d5f2f187818f..da3772ba9d5b6 100644 --- a/pkg/meta/autoid/seq_autoid_test.go +++ b/pkg/meta/autoid/seq_autoid_test.go @@ -31,7 +31,7 @@ import ( ) func TestSequenceAutoid(t *testing.T) { - store, err := mockstore.NewMockStore() + store, err := mockstore.NewMockStore(mockstore.WithStoreType(mockstore.EmbedUnistore)) require.NoError(t, err) defer func() { err := store.Close() @@ -60,7 +60,7 @@ func TestSequenceAutoid(t *testing.T) { Sequence: seq, } sequenceBase = seq.Start - 1 - err = m.CreateSequenceAndSetSeqValue(1, seqTable, sequenceBase) + err = m.CreateSequenceAndSetSeqValue(1, "a", seqTable, sequenceBase) require.NoError(t, err) return nil }) @@ -156,7 +156,7 @@ func TestSequenceAutoid(t *testing.T) { } func TestConcurrentAllocSequence(t *testing.T) { - store, err := mockstore.NewMockStore() + store, err := mockstore.NewMockStore(mockstore.WithStoreType(mockstore.EmbedUnistore)) require.NoError(t, err) defer func() { err := store.Close() @@ -189,7 +189,7 @@ func TestConcurrentAllocSequence(t *testing.T) { } else { sequenceBase = seq.Start + 1 } - err1 = m.CreateSequenceAndSetSeqValue(2, seqTable, sequenceBase) + err1 = m.CreateSequenceAndSetSeqValue(2, "a", seqTable, sequenceBase) require.NoError(t, err1) return nil }) diff --git a/pkg/meta/main_test.go b/pkg/meta/main_test.go index ac3615334189f..1d6e74741c2b7 100644 --- a/pkg/meta/main_test.go +++ b/pkg/meta/main_test.go @@ -25,6 +25,7 @@ func TestMain(m *testing.M) { testsetup.SetupForCommonTest() opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), diff --git a/pkg/meta/meta.go b/pkg/meta/meta.go index 79ac5085a7630..f1dbea16c6ed1 100644 --- a/pkg/meta/meta.go +++ b/pkg/meta/meta.go @@ -27,6 +27,7 @@ import ( "github.com/pingcap/errors" "github.com/pingcap/kvproto/pkg/kvrpcpb" + rmpb "github.com/pingcap/kvproto/pkg/resource_manager" "github.com/pingcap/tidb/pkg/domain/resourcegroup" "github.com/pingcap/tidb/pkg/errno" "github.com/pingcap/tidb/pkg/kv" @@ -56,14 +57,21 @@ var ( // TID:2 -> int64 // } // +// DDL version 2 +// Names -> { +// Name:DBname\x00tablename -> tableID +// } var ( mMetaPrefix = []byte("m") mNextGlobalIDKey = []byte("NextGlobalID") mSchemaVersionKey = []byte("SchemaVersionKey") mDBs = []byte("DBs") + mNames = []byte("Names") + mDDLV2Initialized = []byte("DDLV2Initialized") mDBPrefix = "DB" mTablePrefix = "Table" + mNameSep = []byte("\x00") mSequencePrefix = "SID" mSeqCyclePrefix = "SequenceCycle" mTableIDPrefix = "TID" @@ -80,6 +88,7 @@ var ( mDDLTableVersion = []byte("DDLTableVersion") mBDRRole = []byte("BDRRole") mMetaDataLock = []byte("metadataLock") + mRequestUnitStats = []byte("RequestUnitStats") // the id for 'default' group, the internal ddl can ensure // user created resource group won't duplicate with this id. defaultGroupID = int64(1) @@ -158,23 +167,39 @@ func (ver DDLTableVersion) Bytes() []byte { return []byte(strconv.Itoa(int(ver))) } +// Option is for Meta option. +type Option func(m *Meta) + +// WithUpdateTableName is for updating the name of the table. +// Only used for ddl v2. +func WithUpdateTableName() Option { + return func(m *Meta) { + m.needUpdateName = true + } +} + // Meta is for handling meta information in a transaction. type Meta struct { - txn *structure.TxStructure - StartTS uint64 // StartTS is the txn's start TS. - jobListKey JobListKeyType + txn *structure.TxStructure + StartTS uint64 // StartTS is the txn's start TS. + jobListKey JobListKeyType + needUpdateName bool } // NewMeta creates a Meta in transaction txn. // If the current Meta needs to handle a job, jobListKey is the type of the job's list. -func NewMeta(txn kv.Transaction) *Meta { +func NewMeta(txn kv.Transaction, options ...Option) *Meta { txn.SetOption(kv.Priority, kv.PriorityHigh) txn.SetDiskFullOpt(kvrpcpb.DiskFullOpt_AllowedOnAlmostFull) t := structure.NewStructure(txn, txn, mMetaPrefix) - return &Meta{txn: t, + m := &Meta{txn: t, StartTS: txn.StartTS(), jobListKey: DefaultJobListKey, } + for _, opt := range options { + opt(m) + } + return m } // NewSnapshotMeta creates a Meta with snapshot. @@ -660,7 +685,7 @@ func (m *Meta) UpdateDatabase(dbInfo *model.DBInfo) error { } // CreateTableOrView creates a table with tableInfo in database. -func (m *Meta) CreateTableOrView(dbID int64, tableInfo *model.TableInfo) error { +func (m *Meta) CreateTableOrView(dbID int64, dbName string, tableInfo *model.TableInfo) error { // Check if db exists. dbKey := m.dbKey(dbID) if err := m.checkDBExists(dbKey); err != nil { @@ -678,7 +703,13 @@ func (m *Meta) CreateTableOrView(dbID int64, tableInfo *model.TableInfo) error { return errors.Trace(err) } - return m.txn.HSet(dbKey, tableKey, data) + if err := m.txn.HSet(dbKey, tableKey, data); err != nil { + return errors.Trace(err) + } + if m.needUpdateName { + return errors.Trace(m.CreateTableName(dbName, tableInfo.Name.L, tableInfo.ID)) + } + return nil } // SetBDRRole write BDR role into storage. @@ -695,6 +726,11 @@ func (m *Meta) GetBDRRole() (string, error) { return string(v), nil } +// ClearBDRRole clear BDR role from storage. +func (m *Meta) ClearBDRRole() error { + return errors.Trace(m.txn.Clear(mBDRRole)) +} + // SetDDLTables write a key into storage. func (m *Meta) SetDDLTables(ddlTableVersion DDLTableVersion) error { return errors.Trace(m.txn.Set(mDDLTableVersion, ddlTableVersion.Bytes())) @@ -777,8 +813,8 @@ func (m *Meta) GetMetadataLock() (enable bool, isNull bool, err error) { // CreateTableAndSetAutoID creates a table with tableInfo in database, // and rebases the table autoID. -func (m *Meta) CreateTableAndSetAutoID(dbID int64, tableInfo *model.TableInfo, autoIncID, autoRandID int64) error { - err := m.CreateTableOrView(dbID, tableInfo) +func (m *Meta) CreateTableAndSetAutoID(dbID int64, dbName string, tableInfo *model.TableInfo, autoIncID, autoRandID int64) error { + err := m.CreateTableOrView(dbID, dbName, tableInfo) if err != nil { return errors.Trace(err) } @@ -796,8 +832,8 @@ func (m *Meta) CreateTableAndSetAutoID(dbID int64, tableInfo *model.TableInfo, a } // CreateSequenceAndSetSeqValue creates sequence with tableInfo in database, and rebase the sequence seqValue. -func (m *Meta) CreateSequenceAndSetSeqValue(dbID int64, tableInfo *model.TableInfo, seqValue int64) error { - err := m.CreateTableOrView(dbID, tableInfo) +func (m *Meta) CreateSequenceAndSetSeqValue(dbID int64, dbName string, tableInfo *model.TableInfo, seqValue int64) error { + err := m.CreateTableOrView(dbID, dbName, tableInfo) if err != nil { return errors.Trace(err) } @@ -835,7 +871,7 @@ func (m *Meta) DropPolicy(policyID int64) error { } // DropDatabase drops whole database. -func (m *Meta) DropDatabase(dbID int64) error { +func (m *Meta) DropDatabase(dbID int64, dbName string) error { // Check if db exists. dbKey := m.dbKey(dbID) if err := m.txn.HClear(dbKey); err != nil { @@ -846,13 +882,16 @@ func (m *Meta) DropDatabase(dbID int64) error { return errors.Trace(err) } + if m.needUpdateName { + return errors.Trace(m.DropDatabaseName(dbName)) + } return nil } // DropSequence drops sequence in database. // Sequence is made of table struct and kv value pair. -func (m *Meta) DropSequence(dbID int64, tblID int64) error { - err := m.DropTableOrView(dbID, tblID) +func (m *Meta) DropSequence(dbID int64, dbName string, tblID int64, tbName string) error { + err := m.DropTableOrView(dbID, dbName, tblID, tbName) if err != nil { return err } @@ -867,7 +906,7 @@ func (m *Meta) DropSequence(dbID int64, tblID int64) error { // DropTableOrView drops table in database. // If delAutoID is true, it will delete the auto_increment id key-value of the table. // For rename table, we do not need to rename auto_increment id key-value. -func (m *Meta) DropTableOrView(dbID int64, tblID int64) error { +func (m *Meta) DropTableOrView(dbID int64, dbName string, tblID int64, tbName string) error { // Check if db exists. dbKey := m.dbKey(dbID) if err := m.checkDBExists(dbKey); err != nil { @@ -883,6 +922,9 @@ func (m *Meta) DropTableOrView(dbID int64, tblID int64) error { if err := m.txn.HDel(dbKey, tableKey); err != nil { return errors.Trace(err) } + if m.needUpdateName { + return errors.Trace(m.DropTableName(dbName, tbName)) + } return nil } @@ -967,6 +1009,38 @@ func (m *Meta) ListTables(dbID int64) ([]*model.TableInfo, error) { return tables, nil } +// ListSimpleTables shows all simple tables in database. +func (m *Meta) ListSimpleTables(dbID int64) ([]*model.TableNameInfo, error) { + dbKey := m.dbKey(dbID) + if err := m.checkDBExists(dbKey); err != nil { + return nil, errors.Trace(err) + } + + res, err := m.txn.HGetAll(dbKey) + if err != nil { + return nil, errors.Trace(err) + } + + tables := make([]*model.TableNameInfo, 0, len(res)/2) + for _, r := range res { + // only handle table meta + tableKey := string(r.Field) + if !strings.HasPrefix(tableKey, mTablePrefix) { + continue + } + + tbInfo := &model.TableNameInfo{} + err = json.Unmarshal(r.Value, tbInfo) + if err != nil { + return nil, errors.Trace(err) + } + + tables = append(tables, tbInfo) + } + + return tables, nil +} + // ListDatabases shows all databases. func (m *Meta) ListDatabases() ([]*model.DBInfo, error) { res, err := m.txn.HGetAll(mDBs) @@ -1454,3 +1528,141 @@ func (m *Meta) SetSchemaDiff(diff *model.SchemaDiff) error { metrics.MetaHistogram.WithLabelValues(metrics.SetSchemaDiff, metrics.RetLabel(err)).Observe(time.Since(startTime).Seconds()) return errors.Trace(err) } + +// TableNameKey constructs the key for table name. +func (*Meta) TableNameKey(dbName string, tableName string) kv.Key { + var sb strings.Builder + sb.Write(mNames) + sb.WriteByte(':') + sb.WriteString(strings.ToLower(dbName)) + sb.Write(mNameSep) + sb.WriteString(strings.ToLower(tableName)) + return kv.Key(sb.String()) +} + +// CheckTableNameExists checks if the table name exists. +func (m *Meta) CheckTableNameExists(name []byte) error { + v, err := m.txn.Get(name) + if err == nil && v == nil { + err = ErrTableNotExists.FastGenByArgs(string(name)) + } + return errors.Trace(err) +} + +// CheckTableNameNotExists checks if the table name not exists. +func (m *Meta) CheckTableNameNotExists(name []byte) error { + v, err := m.txn.Get(name) + if err == nil && v != nil { + err = ErrTableExists.FastGenByArgs(string(name)) + } + return errors.Trace(err) +} + +// CreateTableName creates a table name. +// Used by CreateTable/RenameTable/TruncateTable/RecoverTable/RecoverSchema/CreateView... +func (m *Meta) CreateTableName(dbName string, tableName string, tableID int64) error { + // Check if table exists. + key := m.TableNameKey(dbName, tableName) + if err := m.CheckTableNameNotExists(key); err != nil { + return errors.Trace(err) + } + return m.txn.Set(key, []byte(strconv.FormatInt(tableID, 10))) +} + +// DropTableName drops a table name. +// Used by DropTable/RenameTable/TruncateTable/DropView... +func (m *Meta) DropTableName(dbName string, tableName string) error { + // Check if table exists. + key := m.TableNameKey(dbName, tableName) + if err := m.CheckTableNameExists(key); err != nil { + return errors.Trace(err) + } + return m.txn.Clear(key) +} + +// DropDatabaseName drops a database name. +// Used by DropDatabase. +func (m *Meta) DropDatabaseName(dbName string) error { + // iterate all tables + prefix := m.TableNameKey(dbName, "") + return m.txn.Iterate(prefix, prefix.PrefixNext(), func(key []byte, value []byte) error { + return m.txn.Clear(key) + }) +} + +// ClearAllTableNames clears all table names. +func (m *Meta) ClearAllTableNames() error { + prefix := kv.Key(fmt.Sprintf("%s:", mNames)) + return m.txn.Iterate(prefix, prefix.PrefixNext(), func(key []byte, value []byte) error { + return m.txn.Clear(key) + }) +} + +// SetDDLV2Initialized set DDLV2Initialized. +func (m *Meta) SetDDLV2Initialized(b bool) error { + var data []byte + if b { + data = []byte("1") + } else { + data = []byte("0") + } + return m.txn.Set(mDDLV2Initialized, data) +} + +// GetDDLV2Initialized gets DDLV2Initialized +func (m *Meta) GetDDLV2Initialized() (initialized bool, err error) { + val, err := m.txn.Get(mDDLV2Initialized) + if err != nil { + return false, errors.Trace(err) + } + if len(val) == 0 { + return false, nil + } + return bytes.Equal(val, []byte("1")), nil +} + +// GroupRUStats keeps the ru consumption statistics data. +type GroupRUStats struct { + ID int64 `json:"id"` + Name string `json:"name"` + RUConsumption *rmpb.Consumption `json:"ru_consumption"` +} + +// DailyRUStats keeps all the ru consumption statistics data. +type DailyRUStats struct { + EndTime time.Time `json:"date"` + Stats []GroupRUStats `json:"stats"` +} + +// RUStats keeps the lastest and second lastest DailyRUStats data. +type RUStats struct { + Latest *DailyRUStats `json:"latest"` + Previous *DailyRUStats `json:"previous"` +} + +// GetRUStats load the persisted RUStats data. +func (m *Meta) GetRUStats() (*RUStats, error) { + data, err := m.txn.Get(mRequestUnitStats) + if err != nil { + return nil, errors.Trace(err) + } + var ruStats *RUStats + if data != nil { + ruStats = &RUStats{} + if err = json.Unmarshal(data, &ruStats); err != nil { + return nil, errors.Trace(err) + } + } + return ruStats, nil +} + +// SetRUStats persist new ru stats data to meta storage. +func (m *Meta) SetRUStats(stats *RUStats) error { + data, err := json.Marshal(stats) + if err != nil { + return errors.Trace(err) + } + + err = m.txn.Set(mRequestUnitStats, data) + return errors.Trace(err) +} diff --git a/pkg/meta/meta_autoid.go b/pkg/meta/meta_autoid.go index 96d5088e2e7cb..cef5903c758b8 100644 --- a/pkg/meta/meta_autoid.go +++ b/pkg/meta/meta_autoid.go @@ -54,17 +54,17 @@ func (a *autoIDAccessor) Put(val int64) error { // Inc implements the interface AutoIDAccessor. func (a *autoIDAccessor) Inc(step int64) (int64, error) { m := a.m + // Note that the databaseID may not match the current table, + // it may come from the original schema id the table was created + // in, but to allow concurrent use across renames etc. we keep + // the full ID (Schema ID + Table ID) as is. + // Meaning we cannot verify only the schema id. + // And a rename may have happened before the first id is set, + // as well as dropping the original schema. + // So no Schema ID or Table ID verifications can be done. dbKey := m.dbKey(a.databaseID) - if err := m.checkDBExists(dbKey); err != nil { - return 0, errors.Trace(err) - } - // Check if table exists. - tableKey := m.tableKey(a.tableID) - if err := m.checkTableExists(dbKey, tableKey); err != nil { - return 0, errors.Trace(err) - } - - return m.txn.HInc(dbKey, a.idEncodeFn(a.tableID), step) + tblKey := a.idEncodeFn(a.tableID) + return m.txn.HInc(dbKey, tblKey, step) } // Del implements the interface AutoIDAccessor. @@ -192,25 +192,3 @@ type AutoIDGroup struct { IncrementID int64 RandomID int64 } - -// BackupAndRestoreAutoIDs changes the meta key-values to fetch & delete -// all the auto IDs from an old table, and set them to a new table. -func BackupAndRestoreAutoIDs(m *Meta, databaseID, tableID int64, newDatabaseID, newTableID int64) (err error) { - acc := NewAutoIDAccessors(m, databaseID, tableID) - autoIDs, err := acc.Get() - if err != nil { - return errors.Trace(err) - } - overwriteIDs := databaseID == newDatabaseID && tableID == newTableID - if !overwriteIDs { - err = acc.Del() - if err != nil { - return errors.Trace(err) - } - } - err = NewAutoIDAccessors(m, newDatabaseID, newTableID).Put(autoIDs) - if err != nil { - return errors.Trace(err) - } - return nil -} diff --git a/pkg/meta/meta_test.go b/pkg/meta/meta_test.go index 014f67d1433ea..56e1867b51ee9 100644 --- a/pkg/meta/meta_test.go +++ b/pkg/meta/meta_test.go @@ -32,7 +32,7 @@ import ( ) func TestPlacementPolicy(t *testing.T) { - store, err := mockstore.NewMockStore() + store, err := mockstore.NewMockStore(mockstore.WithStoreType(mockstore.EmbedUnistore)) require.NoError(t, err) defer func() { @@ -150,55 +150,8 @@ func TestResourceGroup(t *testing.T) { require.Error(t, err) } -func TestBackupAndRestoreAutoIDs(t *testing.T) { - store, err := mockstore.NewMockStore() - require.NoError(t, err) - defer func() { - err := store.Close() - require.NoError(t, err) - }() - - txn, err := store.Begin() - require.NoError(t, err) - m := meta.NewMeta(txn) - acc := m.GetAutoIDAccessors(1, 1) - require.NoError(t, acc.RowID().Put(100)) - require.NoError(t, acc.RandomID().Put(101)) - require.NoError(t, meta.BackupAndRestoreAutoIDs(m, 1, 1, 2, 2)) - require.NoError(t, txn.Commit(context.Background())) - - mustGet := func(acc meta.AutoIDAccessor) int { - v, err := acc.Get() - require.NoError(t, err) - return int(v) - } - txn, err = store.Begin() - require.NoError(t, err) - m = meta.NewMeta(txn) - acc = m.GetAutoIDAccessors(1, 1) - // Test old auto IDs are cleaned. - require.Equal(t, mustGet(acc.RowID()), 0) - require.Equal(t, mustGet(acc.RandomID()), 0) - - // Test new auto IDs are restored. - acc2 := m.GetAutoIDAccessors(2, 2) - require.Equal(t, mustGet(acc2.RowID()), 100) - require.Equal(t, mustGet(acc2.RandomID()), 101) - // Backup & restore with the same database & table ID. - require.NoError(t, meta.BackupAndRestoreAutoIDs(m, 2, 2, 2, 2)) - require.NoError(t, txn.Commit(context.Background())) - - txn, err = store.Begin() - require.NoError(t, err) - m = meta.NewMeta(txn) - // Test auto IDs are unchanged. - acc2 = m.GetAutoIDAccessors(2, 2) - require.Equal(t, mustGet(acc2.RowID()), 100) - require.Equal(t, mustGet(acc2.RandomID()), 101) -} - func TestMeta(t *testing.T) { - store, err := mockstore.NewMockStore() + store, err := mockstore.NewMockStore(mockstore.WithStoreType(mockstore.EmbedUnistore)) require.NoError(t, err) defer func() { @@ -276,7 +229,7 @@ func TestMeta(t *testing.T) { ID: 1, Name: model.NewCIStr("t"), } - err = m.CreateTableOrView(1, tbInfo) + err = m.CreateTableOrView(1, dbInfo.Name.L, tbInfo) require.NoError(t, err) n, err = m.GetAutoIDAccessors(1, 1).RowID().Inc(10) @@ -287,7 +240,7 @@ func TestMeta(t *testing.T) { require.NoError(t, err) require.Equal(t, int64(10), n) - err = m.CreateTableOrView(1, tbInfo) + err = m.CreateTableOrView(1, dbInfo.Name.L, tbInfo) require.NotNil(t, err) require.True(t, meta.ErrTableExists.Equal(err)) @@ -313,9 +266,14 @@ func TestMeta(t *testing.T) { ID: 2, Name: model.NewCIStr("bb"), } - err = m.CreateTableOrView(1, tbInfo2) + err = m.CreateTableOrView(1, dbInfo.Name.L, tbInfo2) require.NoError(t, err) + tblName := &model.TableNameInfo{ID: tbInfo.ID, Name: tbInfo.Name} + tblName2 := &model.TableNameInfo{ID: tbInfo2.ID, Name: tbInfo2.Name} + tableNames, err := m.ListSimpleTables(1) + require.NoError(t, err) + require.Equal(t, []*model.TableNameInfo{tblName, tblName2}, tableNames) tables, err := m.ListTables(1) require.NoError(t, err) require.Equal(t, []*model.TableInfo{tbInfo, tbInfo2}, tables) @@ -342,7 +300,7 @@ func TestMeta(t *testing.T) { require.NoError(t, err) require.Equal(t, int64(10), n) - err = m.DropTableOrView(1, tbInfo2.ID) + err = m.DropTableOrView(1, dbInfo.Name.L, tbInfo2.ID, tbInfo2.Name.L) require.NoError(t, err) err = m.GetAutoIDAccessors(1, tbInfo2.ID).Del() require.NoError(t, err) @@ -351,6 +309,9 @@ func TestMeta(t *testing.T) { require.NoError(t, err) require.Equal(t, int64(0), n) + tableNames, err = m.ListSimpleTables(1) + require.NoError(t, err) + require.Equal(t, []*model.TableNameInfo{tblName}, tableNames) tables, err = m.ListTables(1) require.NoError(t, err) require.Equal(t, []*model.TableInfo{tbInfo}, tables) @@ -371,31 +332,33 @@ func TestMeta(t *testing.T) { Name: model.NewCIStr("t_rename"), } // Create table. - err = m.CreateTableOrView(1, tbInfo100) + err = m.CreateTableOrView(1, dbInfo.Name.L, tbInfo100) require.NoError(t, err) // Update auto ID. currentDBID := int64(1) n, err = m.GetAutoIDAccessors(currentDBID, tid).RowID().Inc(10) require.NoError(t, err) require.Equal(t, int64(10), n) - // Fail to update auto ID. + // Test to update non-existing auto ID. // The table ID doesn't exist. + // We can no longer test for non-existing ids. nonExistentID := int64(1234) _, err = m.GetAutoIDAccessors(currentDBID, nonExistentID).RowID().Inc(10) - require.NotNil(t, err) - require.True(t, meta.ErrTableNotExists.Equal(err)) - // Fail to update auto ID. + require.NoError(t, err) + //require.True(t, meta.ErrTableNotExists.Equal(err)) + // Test to update non-existing auto ID. // The current database ID doesn't exist. + // We can no longer test for non-existing ids. currentDBID = nonExistentID _, err = m.GetAutoIDAccessors(currentDBID, tid).RowID().Inc(10) - require.NotNil(t, err) - require.True(t, meta.ErrDBNotExists.Equal(err)) + require.NoError(t, err) + //require.True(t, meta.ErrDBNotExists.Equal(err)) // Test case for CreateTableAndSetAutoID. tbInfo3 := &model.TableInfo{ ID: 3, Name: model.NewCIStr("tbl3"), } - err = m.CreateTableAndSetAutoID(1, tbInfo3, 123, 0) + err = m.CreateTableAndSetAutoID(1, dbInfo.Name.L, tbInfo3, 123, 0) require.NoError(t, err) id, err := m.GetAutoIDAccessors(1, tbInfo3.ID).RowID().Get() require.NoError(t, err) @@ -405,9 +368,9 @@ func TestMeta(t *testing.T) { require.Equal(t, []byte(strconv.FormatInt(1234, 10)), val) require.Equal(t, []byte{0x6d, 0x44, 0x42, 0x3a, 0x31, 0x0, 0x0, 0x0, 0x0, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x68, 0x54, 0x49, 0x44, 0x3a, 0x33, 0x0, 0x0, 0x0, 0xfc}, key) - err = m.DropDatabase(1) + err = m.DropDatabase(1, dbInfo.Name.L) require.NoError(t, err) - err = m.DropDatabase(currentDBID) + err = m.DropDatabase(currentDBID, dbInfo.Name.L) require.NoError(t, err) dbs, err = m.ListDatabases() @@ -455,6 +418,10 @@ func TestMeta(t *testing.T) { role, err = m.GetBDRRole() require.NoError(t, err) require.Equal(t, string(ast.BDRRolePrimary), role) + require.NoError(t, m.ClearBDRRole()) + role, err = m.GetBDRRole() + require.NoError(t, err) + require.Len(t, role, 0) err = txn.Commit(context.Background()) require.NoError(t, err) @@ -465,7 +432,7 @@ func TestMeta(t *testing.T) { } func TestSnapshot(t *testing.T) { - store, err := mockstore.NewMockStore() + store, err := mockstore.NewMockStore(mockstore.WithStoreType(mockstore.EmbedUnistore)) require.NoError(t, err) defer func() { err := store.Close() @@ -527,7 +494,7 @@ func TestElement(t *testing.T) { } func BenchmarkGenGlobalIDs(b *testing.B) { - store, err := mockstore.NewMockStore() + store, err := mockstore.NewMockStore(mockstore.WithStoreType(mockstore.EmbedUnistore)) require.NoError(b, err) defer func() { err := store.Close() @@ -678,3 +645,84 @@ func TestCreateMySQLDatabase(t *testing.T) { err = txn.Rollback() require.NoError(t, err) } + +func TestName(t *testing.T) { + store, err := mockstore.NewMockStore() + require.NoError(t, err) + defer func() { + require.NoError(t, store.Close()) + }() + + txn, err := store.Begin() + require.NoError(t, err) + + // TestTableNameKey + m := meta.NewMeta(txn) + key := m.TableNameKey("db", "tb") + require.Equal(t, string(key), "Names:db\x00tb") + + // TestCheckTableNameExists + err = m.CheckTableNameExists(m.TableNameKey("db", "tb")) + require.True(t, meta.ErrTableNotExists.Equal(err)) + // TestCheckTableNameNotExists + err = m.CheckTableNameNotExists(m.TableNameKey("db", "tb")) + require.NoError(t, err) + + // TestCreateTable + err = m.CreateTableName("db", "tb", 1) + require.NoError(t, err) + err = m.CheckTableNameExists(m.TableNameKey("db", "tb")) + require.NoError(t, err) + err = m.CheckTableNameNotExists(m.TableNameKey("db", "tb")) + require.True(t, meta.ErrTableExists.Equal(err)) + err = m.CreateTableName("db", "t", 2) + require.NoError(t, err) + + err = m.CreateTableName("db", "tb", 3) + require.True(t, meta.ErrTableExists.Equal(err)) + + err = m.CreateTableName("d", "btb", 3) + require.NoError(t, err) + err = m.CheckTableNameExists(m.TableNameKey("d", "btb")) + require.NoError(t, err) + + // TestDropTableName + err = m.DropTableName("db1", "b") + require.True(t, meta.ErrTableNotExists.Equal(err)) + err = m.DropTableName("db", "tb") + require.NoError(t, err) + + // TestDropDatabaseName + err = m.DropDatabaseName("xx") + require.NoError(t, err) + err = m.DropDatabaseName("d") + require.NoError(t, err) + err = m.CheckTableNameNotExists(m.TableNameKey("d", "btb")) + require.NoError(t, err) + err = m.CheckTableNameExists(m.TableNameKey("db", "t")) + require.NoError(t, err) + + // TestClearAllTableNames + err = m.ClearAllTableNames() + require.NoError(t, err) + err = m.CheckTableNameNotExists(m.TableNameKey("db1", "t")) + require.NoError(t, err) + + // TestDDLV2Initialized + v, err := m.GetDDLV2Initialized() + require.NoError(t, err) + require.Equal(t, v, false) + err = m.SetDDLV2Initialized(true) + require.NoError(t, err) + v, err = m.GetDDLV2Initialized() + require.NoError(t, err) + require.Equal(t, v, true) + err = m.SetDDLV2Initialized(false) + require.NoError(t, err) + v, err = m.GetDDLV2Initialized() + require.NoError(t, err) + require.Equal(t, v, false) + + err = txn.Rollback() + require.NoError(t, err) +} diff --git a/pkg/metrics/disttask.go b/pkg/metrics/disttask.go index cf916b5215c3d..dc8680d84846e 100644 --- a/pkg/metrics/disttask.go +++ b/pkg/metrics/disttask.go @@ -32,10 +32,10 @@ const ( // status for task const ( - DispatchingStatus = "dispatching" - WaitingStatus = "waiting" - RunningStatus = "running" - CompletedStatus = "completed" + SchedulingStatus = "scheduling" + WaitingStatus = "waiting" + RunningStatus = "running" + CompletedStatus = "completed" ) var ( @@ -129,16 +129,16 @@ func UpdateMetricsForAddTask(task *proto.Task) { } // UpdateMetricsForDispatchTask update metrics when a task is added -func UpdateMetricsForDispatchTask(task *proto.Task) { - DistTaskGauge.WithLabelValues(task.Type.String(), WaitingStatus).Dec() - DistTaskStarttimeGauge.DeleteLabelValues(task.Type.String(), WaitingStatus, fmt.Sprint(task.ID)) - DistTaskStarttimeGauge.WithLabelValues(task.Type.String(), DispatchingStatus, fmt.Sprint(task.ID)).SetToCurrentTime() +func UpdateMetricsForDispatchTask(id int64, taskType proto.TaskType) { + DistTaskGauge.WithLabelValues(taskType.String(), WaitingStatus).Dec() + DistTaskStarttimeGauge.DeleteLabelValues(taskType.String(), WaitingStatus, fmt.Sprint(id)) + DistTaskStarttimeGauge.WithLabelValues(taskType.String(), SchedulingStatus, fmt.Sprint(id)).SetToCurrentTime() } // UpdateMetricsForRunTask update metrics when a task starts running func UpdateMetricsForRunTask(task *proto.Task) { - DistTaskStarttimeGauge.DeleteLabelValues(task.Type.String(), DispatchingStatus, fmt.Sprint(task.ID)) - DistTaskGauge.WithLabelValues(task.Type.String(), DispatchingStatus).Dec() + DistTaskStarttimeGauge.DeleteLabelValues(task.Type.String(), SchedulingStatus, fmt.Sprint(task.ID)) + DistTaskGauge.WithLabelValues(task.Type.String(), SchedulingStatus).Dec() DistTaskGauge.WithLabelValues(task.Type.String(), RunningStatus).Inc() } diff --git a/pkg/metrics/executor.go b/pkg/metrics/executor.go index a364adf462515..b0295e6ae54d4 100644 --- a/pkg/metrics/executor.go +++ b/pkg/metrics/executor.go @@ -58,7 +58,7 @@ func InitExecutorMetrics() { Subsystem: "executor", Name: "statement_total", Help: "Counter of StmtNode.", - }, []string{LblType, LblDb}) + }, []string{LblType, LblDb, LblResourceGroup}) DbStmtNodeCounter = NewCounterVec( prometheus.CounterOpts{ diff --git a/pkg/metrics/grafana/overview.json b/pkg/metrics/grafana/overview.json index 13f99c0e229fe..92690f1b0ffed 100644 --- a/pkg/metrics/grafana/overview.json +++ b/pkg/metrics/grafana/overview.json @@ -1170,7 +1170,7 @@ }, "yaxes": [ { - "format": "short", + "format": "bytes", "label": null, "logBase": 1, "max": null, diff --git a/pkg/metrics/grafana/tidb.json b/pkg/metrics/grafana/tidb.json index ee481c8902f91..7ff82e29948b3 100644 --- a/pkg/metrics/grafana/tidb.json +++ b/pkg/metrics/grafana/tidb.json @@ -14621,10 +14621,10 @@ "targets": [ { "exemplar": true, - "expr": "tidb_disttask_task_status{k8s_cluster=\"$k8s_cluster\",tidb_cluster=\"$tidb_cluster\"}", + "expr": "sum(tidb_disttask_task_status{k8s_cluster=\"$k8s_cluster\",tidb_cluster=\"$tidb_cluster\"}) by (status, task_type)", "hide": false, "interval": "", - "legendFormat": "{{task_type}}_{{task_id}}_{{status}}", + "legendFormat": "{{task_type}}_{{status}}", "queryType": "randomWalk", "refId": "A" } @@ -16598,6 +16598,109 @@ "align": false, "alignLevel": null } + }, + { + "aliasColors": {}, + "dashLength": 10, + "datasource": "${DS_TEST-CLUSTER}", + "description": "TiDB auto id client connection reset counter", + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "fill": 1, + "gridPos": { + "h": 7, + "w": 12, + "x": 12, + "y": 22 + }, + "id": 23763571994, + "legend": { + "alignAsTable": true, + "avg": false, + "current": false, + "max": false, + "min": false, + "rightSide": true, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "pluginVersion": "7.5.11", + "pointradius": 5, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "targets": [ + { + "expr": "increase(tidb_meta_autoid_client_conn_reset_total{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\", instance=~\"$instance\"}[2m])", + "legendFormat": "", + "interval": "", + "exemplar": true, + "format": "time_series", + "intervalFactor": 2, + "refId": "B" + } + ], + "thresholds": [], + "timeRegions": [], + "title": "AutoID Client Conn Reset Counter", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": "1", + "show": true, + "$$hashKey": "object:259", + "decimals": null + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": "1", + "show": true, + "$$hashKey": "object:260" + } + ], + "yaxis": { + "align": false, + "alignLevel": null + }, + "bars": false, + "dashes": false, + "fillGradient": 0, + "hiddenSeries": false, + "percentage": false, + "points": false, + "stack": false, + "steppedLine": false, + "timeFrom": null, + "timeShift": null } ], "repeat": null, diff --git a/pkg/metrics/grafana/tidb_resource_control.json b/pkg/metrics/grafana/tidb_resource_control.json index 9c1b037fa5c2d..6d5f043d45dec 100644 --- a/pkg/metrics/grafana/tidb_resource_control.json +++ b/pkg/metrics/grafana/tidb_resource_control.json @@ -3073,7 +3073,7 @@ "format": "time_series", "interval": "", "intervalFactor": 2, - "legendFormat": "{{name}}-{{instance}}", + "legendFormat": "{{resource_group}}-{{instance}}", "metric": "scan_details", "refId": "B", "step": 4 @@ -3184,7 +3184,7 @@ "format": "time_series", "interval": "", "intervalFactor": 2, - "legendFormat": "{{name}}-{{instance}}", + "legendFormat": "{{resource_group}}-{{instance}}", "metric": "scan_details", "refId": "B", "step": 4 @@ -3295,7 +3295,7 @@ "format": "time_series", "interval": "", "intervalFactor": 2, - "legendFormat": "{{name}}-{{instance}}", + "legendFormat": "{{resource_group}}-{{instance}}", "metric": "scan_details", "refId": "B", "step": 4 @@ -3406,7 +3406,7 @@ "format": "time_series", "interval": "", "intervalFactor": 2, - "legendFormat": "{{name}}-{{instance}}", + "legendFormat": "{{resource_group}}-{{instance}}", "metric": "scan_details", "refId": "B", "step": 4 @@ -3517,7 +3517,7 @@ "format": "time_series", "interval": "", "intervalFactor": 2, - "legendFormat": "{{name}}-{{instance}}", + "legendFormat": "{{resource_group}}-{{instance}}", "metric": "scan_details", "refId": "B", "step": 4 @@ -3569,6 +3569,605 @@ ], "title": "Background Task Control", "type": "row" + }, + { + "collapsed": true, + "datasource": null, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 48 + }, + "id": 23763573756, + "panels": [ + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_TEST-CLUSTER}", + "description": "The Duration of sql execute for different resource group", + "editable": true, + "error": false, + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "grid": {}, + "gridPos": { + "h": 7, + "w": 12, + "x": 0, + "y": 1 + }, + "hiddenSeries": false, + "id": 23763573757, + "legend": { + "alignAsTable": true, + "avg": false, + "max": false, + "min": false, + "current": true, + "rightSide": true, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.5.10", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "exemplar": true, + "expr": "histogram_quantile(0.999, sum(rate(tidb_server_handle_query_duration_seconds_bucket{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\",instance=~\"$tidb_instance\",resource_group=~\"$resource_group\"}[1m])) by (le,resource_group))", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "{{resource_group}}-P999", + "refId": "A", + "step": 40 + }, + { + "exemplar": true, + "expr": "histogram_quantile(0.99, sum(rate(tidb_server_handle_query_duration_seconds_bucket{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\",instance=~\"$tidb_instance\",resource_group=~\"$resource_group\"}[1m])) by (le,resource_group))", + "hide": true, + "interval": "", + "intervalFactor": 2, + "legendFormat": "{{resource_group}}-P99", + "refId": "B" + }, + { + "exemplar": true, + "expr": "histogram_quantile(0.95, sum(rate(tidb_server_handle_query_duration_seconds_bucket{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\",instance=~\"$tidb_instance\",resource_group=~\"$resource_group\"}[1m])) by (le,resource_group))", + "hide": true, + "interval": "", + "intervalFactor": 2, + "legendFormat": "{{resource_group}}-P95", + "refId": "C" + }, + { + "exemplar": true, + "expr": "histogram_quantile(0.80, sum(rate(tidb_server_handle_query_duration_seconds_bucket{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\",instance=~\"$tidb_instance\",resource_group=~\"$resource_group\"}[1m])) by (le,resource_group))", + "hide": true, + "interval": "", + "intervalFactor": 2, + "legendFormat": "{{resource_group}}-P80", + "refId": "D" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Duration", + "tooltip": { + "msResolution": true, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "s", + "label": null, + "logBase": 2, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_TEST-CLUSTER}", + "description": "MySQL commands processing numbers per second. See https://dev.mysql.com/doc/internals/en/text-protocol.html and https://dev.mysql.com/doc/internals/en/prepared-statements.html", + "editable": true, + "error": false, + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "grid": {}, + "gridPos": { + "h": 7, + "w": 12, + "x": 12, + "y": 1 + }, + "hiddenSeries": false, + "id": 23763573758, + "legend": { + "alignAsTable": true, + "avg": false, + "current": true, + "max": false, + "min": false, + "rightSide": true, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "null as zero", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.5.10", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "exemplar": true, + "expr": "sum(rate(tidb_server_query_total{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\",instance=~\"$tidb_instance\",resource_group=~\"$resource_group\"}[1m])) by (result,resource_group)", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "{{resource_group}}--{{result}}", + "refId": "A", + "step": 40 + }, + { + "exemplar": true, + "expr": "sum(rate(tidb_server_query_total{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\",result=\"OK\",instance=~\"$tidb_instance\",resource_group=~\"$resource_group\"}[1m] offset 1d)) by (result,resource_group)", + "format": "time_series", + "hide": true, + "interval": "", + "intervalFactor": 2, + "legendFormat": "{{resource_group}}--yesterday", + "refId": "B", + "step": 40 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Command per second", + "tooltip": { + "msResolution": true, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 10, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_TEST-CLUSTER}", + "description": "TiDB statement statistics", + "editable": true, + "error": false, + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "grid": {}, + "gridPos": { + "h": 7, + "w": 12, + "x": 0, + "y": 8 + }, + "hiddenSeries": false, + "id": 23763573759, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": false, + "rightSide": true, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "null as zero", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.5.10", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "exemplar": true, + "expr": "sum(rate(tidb_executor_statement_total{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\",instance=~\"$tidb_instance\",resource_group=~\"$resource_group\"}[1m])) by (type,resource_group)", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "{{resource_group}}--{{type}}", + "refId": "A", + "step": 40 + }, + { + "exemplar": true, + "expr": "sum(rate(tidb_executor_statement_total{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\",instance=~\"$tidb_instance\",resource_group=~\"$resource_group\"}[1m])) by (resource_group)", + "hide": false, + "instant": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "{{resource_group}}--total", + "refId": "B" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "QPS", + "tooltip": { + "msResolution": true, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 2, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_TEST-CLUSTER}", + "description": "TiDB current connection counts", + "editable": true, + "error": false, + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "grid": {}, + "gridPos": { + "h": 7, + "w": 12, + "x": 12, + "y": 8 + }, + "hiddenSeries": false, + "id": 23763573760, + "legend": { + "alignAsTable": true, + "avg": false, + "current": true, + "max": false, + "min": false, + "rightSide": true, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.5.10", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "exemplar": true, + "expr": "tidb_server_connections{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\",instance=~\"$tidb_instance\",resource_group=~\"$resource_group\"}", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "{{instance}}--{{resource_group}}", + "refId": "A", + "step": 40 + }, + { + "exemplar": true, + "expr": "tidb_server_connections{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\",instance=~\"$tidb_instance\",resource_group=~\"$resource_group\"}", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "{{resource_group}}--total", + "refId": "B", + "step": 40 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Connection Count", + "tooltip": { + "msResolution": true, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_TEST-CLUSTER}", + "description": "TiDB failed query statistics by query type and resource group", + "editable": true, + "error": false, + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "grid": {}, + "gridPos": { + "h": 7, + "w": 12, + "x": 0, + "y": 16 + }, + "hiddenSeries": false, + "id": 23763573761, + "legend": { + "alignAsTable": true, + "avg": false, + "current": true, + "max": true, + "min": false, + "rightSide": true, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "null as zero", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.5.10", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "exemplar": true, + "expr": "sum(increase(tidb_server_execute_error_total{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\", instance=~\"$instance\",resource_group=~\"$resource_group\"}[1m])) by (type, instance,resource_group)", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "{{type}}--{{instance}}--{{resource_group}}", + "refId": "A", + "step": 40 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Failed Query OPM", + "tooltip": { + "msResolution": true, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 10, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + } + ], + "title": "Query Summary", + "type": "row" } ], "refresh": "30s", @@ -3684,6 +4283,33 @@ "tagsQuery": "", "type": "query", "useTags": false + }, + { + "allValue": ".*", + "current": {}, + "datasource": "${DS_TEST-CLUSTER}", + "definition": "", + "description": null, + "error": null, + "hide": 0, + "includeAll": true, + "label": "Resource Group", + "multi": true, + "name": "resource_group", + "options": [], + "query": { + "query": "label_values(tidb_server_connections{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\"}, resource_group)", + "refId": "quota-instance-Variable-Query" + }, + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "sort": 1, + "tagValuesQuery": "", + "tags": [], + "tagsQuery": "", + "type": "query", + "useTags": false } ] }, diff --git a/pkg/metrics/main_test.go b/pkg/metrics/main_test.go index 17413b535a234..8687e2cd2291e 100644 --- a/pkg/metrics/main_test.go +++ b/pkg/metrics/main_test.go @@ -25,6 +25,7 @@ func TestMain(m *testing.M) { testsetup.SetupForCommonTest() opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), diff --git a/pkg/metrics/meta.go b/pkg/metrics/meta.go index 45cbaf2559ddd..7636fedaae082 100644 --- a/pkg/metrics/meta.go +++ b/pkg/metrics/meta.go @@ -29,7 +29,8 @@ var ( SetSchemaDiff = "set_schema_diff" GetHistoryDDLJob = "get_history_ddl_job" - MetaHistogram *prometheus.HistogramVec + MetaHistogram *prometheus.HistogramVec + ResetAutoIDConnCounter prometheus.Counter ) // InitMetaMetrics initializes meta metrics. @@ -51,4 +52,12 @@ func InitMetaMetrics() { Help: "Bucketed histogram of processing time (s) of tidb meta data operations.", Buckets: prometheus.ExponentialBuckets(0.0005, 2, 29), // 0.5ms ~ 1.5days }, []string{LblType, LblResult}) + + ResetAutoIDConnCounter = NewCounter( + prometheus.CounterOpts{ + Namespace: "tidb", + Subsystem: "meta", + Name: "autoid_client_conn_reset_total", + Help: "Counter of resetting autoid client connection.", + }) } diff --git a/pkg/metrics/metrics.go b/pkg/metrics/metrics.go index e45e398b0d71a..febefcba69075 100644 --- a/pkg/metrics/metrics.go +++ b/pkg/metrics/metrics.go @@ -231,6 +231,7 @@ func RegisterMetrics() { prometheus.MustRegister(LoadTableCacheDurationHistogram) prometheus.MustRegister(NonTransactionalDMLCount) prometheus.MustRegister(PessimisticDMLDurationByAttempt) + prometheus.MustRegister(ResetAutoIDConnCounter) prometheus.MustRegister(ResourceGroupQueryTotalCounter) prometheus.MustRegister(MemoryUsage) prometheus.MustRegister(StatsCacheCounter) diff --git a/pkg/metrics/server.go b/pkg/metrics/server.go index 51864ba44ce53..68a0f25f9ffaa 100644 --- a/pkg/metrics/server.go +++ b/pkg/metrics/server.go @@ -31,7 +31,7 @@ var ( QueryDurationHistogram *prometheus.HistogramVec QueryTotalCounter *prometheus.CounterVec AffectedRowsCounter *prometheus.CounterVec - ConnGauge prometheus.Gauge + ConnGauge *prometheus.GaugeVec DisconnectionCounter *prometheus.CounterVec PreparedStmtGauge prometheus.Gauge ExecuteErrorCounter *prometheus.CounterVec @@ -97,7 +97,7 @@ func InitServerMetrics() { Subsystem: "server", Name: "query_total", Help: "Counter of queries.", - }, []string{LblType, LblResult}) + }, []string{LblType, LblResult, LblResourceGroup}) AffectedRowsCounter = NewCounterVec( prometheus.CounterOpts{ @@ -107,13 +107,13 @@ func InitServerMetrics() { Help: "Counters of server affected rows.", }, []string{LblSQLType}) - ConnGauge = NewGauge( + ConnGauge = NewGaugeVec( prometheus.GaugeOpts{ Namespace: "tidb", Subsystem: "server", Name: "connections", Help: "Number of connections.", - }) + }, []string{LblResourceGroup}) DisconnectionCounter = NewCounterVec( prometheus.CounterOpts{ @@ -136,7 +136,7 @@ func InitServerMetrics() { Subsystem: "server", Name: "execute_error_total", Help: "Counter of execute errors.", - }, []string{LblType, LblDb}) + }, []string{LblType, LblDb, LblResourceGroup}) CriticalErrorCounter = NewCounter( prometheus.CounterOpts{ diff --git a/pkg/metrics/session.go b/pkg/metrics/session.go index 712bd22974b1c..9a744155c8c6a 100644 --- a/pkg/metrics/session.go +++ b/pkg/metrics/session.go @@ -218,7 +218,7 @@ func InitSessionMetrics() { Subsystem: "session", Name: "resource_group_query_total", Help: "Counter of the total number of queries for the resource group", - }, []string{LblName}) + }, []string{LblName, LblResourceGroup}) FairLockingUsageCount = NewCounterVec( prometheus.CounterOpts{ diff --git a/pkg/metrics/telemetry.go b/pkg/metrics/telemetry.go index ea07b9b83e520..d2aba8dd6cc94 100644 --- a/pkg/metrics/telemetry.go +++ b/pkg/metrics/telemetry.go @@ -475,7 +475,7 @@ func GetNonTransactionalStmtCounter() NonTransactionalStmtCounter { // GetSavepointStmtCounter gets the savepoint statement executed counter. func GetSavepointStmtCounter() int64 { - return readCounter(StmtNodeCounter.With(prometheus.Labels{LblType: "Savepoint", LblDb: ""})) + return readCounter(StmtNodeCounter.WithLabelValues("Savepoint", "", "default")) } // GetLazyPessimisticUniqueCheckSetCounter returns the counter of setting tidb_constraint_check_in_place_pessimistic to false. diff --git a/pkg/owner/main_test.go b/pkg/owner/main_test.go index 46df290b5fa71..a2d3f5e6677d0 100644 --- a/pkg/owner/main_test.go +++ b/pkg/owner/main_test.go @@ -25,6 +25,7 @@ func TestMain(m *testing.M) { testsetup.SetupForCommonTest() opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), diff --git a/pkg/owner/manager.go b/pkg/owner/manager.go index b20051c1acf38..d5f7ddb46779f 100644 --- a/pkg/owner/manager.go +++ b/pkg/owner/manager.go @@ -65,6 +65,8 @@ type Manager interface { // SetBeOwnerHook sets a hook. The hook is called before becoming an owner. SetBeOwnerHook(hook func()) + // SetRetireOwnerHook will be called after retiring the owner. + SetRetireOwnerHook(hook func()) } const ( @@ -114,8 +116,10 @@ type ownerManager struct { elec unsafe.Pointer sessionLease *atomicutil.Int64 wg sync.WaitGroup - beOwnerHook func() campaignCancel context.CancelFunc + + beOwnerHook func() + retireOwnerHook func() } // NewOwnerManager creates a new Manager. @@ -160,6 +164,10 @@ func (m *ownerManager) SetBeOwnerHook(hook func()) { m.beOwnerHook = hook } +func (m *ownerManager) SetRetireOwnerHook(hook func()) { + m.retireOwnerHook = hook +} + // ManagerSessionTTL is the etcd session's TTL in seconds. It's exported for testing. var ManagerSessionTTL = 60 @@ -222,6 +230,9 @@ func (m *ownerManager) toBeOwner(elec *concurrency.Election) { // RetireOwner make the manager to be a not owner. func (m *ownerManager) RetireOwner() { + if m.retireOwnerHook != nil { + m.retireOwnerHook() + } atomic.StorePointer(&m.elec, nil) } @@ -411,11 +422,11 @@ func (m *ownerManager) SetOwnerOpValue(ctx context.Context, op OpType) error { If(clientv3.Compare(clientv3.ModRevision(ownerKey), "=", modRevision)). Then(clientv3.OpPut(ownerKey, string(newOwnerVal), leaseOp)). Commit() - logutil.BgLogger().Info("set owner op value", zap.String("owner key", ownerKey), zap.ByteString("ownerID", ownerID), - zap.Stringer("old Op", currOp), zap.Stringer("op", op), zap.Bool("isSuc", resp.Succeeded), zap.Error(err)) - if !resp.Succeeded { + if err == nil && !resp.Succeeded { err = errors.New("put owner key failed, cmp is false") } + logutil.BgLogger().Info("set owner op value", zap.String("owner key", ownerKey), zap.ByteString("ownerID", ownerID), + zap.Stringer("old Op", currOp), zap.Stringer("op", op), zap.Error(err)) metrics.WatchOwnerCounter.WithLabelValues(m.prompt, metrics.PutValue+"_"+metrics.RetLabel(err)).Inc() return errors.Trace(err) } diff --git a/pkg/owner/mock.go b/pkg/owner/mock.go index 20c61c9eccc41..2b625d225aee1 100644 --- a/pkg/owner/mock.go +++ b/pkg/owner/mock.go @@ -42,6 +42,7 @@ type mockManager struct { wg sync.WaitGroup cancel context.CancelFunc beOwnerHook func() + retireHook func() campaignDone chan struct{} resignDone chan struct{} } @@ -168,10 +169,16 @@ func (*mockManager) RequireOwner(context.Context) error { return nil } +// SetBeOwnerHook implements Manager.SetBeOwnerHook interface. func (m *mockManager) SetBeOwnerHook(hook func()) { m.beOwnerHook = hook } +// SetRetireOwnerHook implements Manager.SetRetireOwnerHook interface. +func (m *mockManager) SetRetireOwnerHook(hook func()) { + m.retireHook = hook +} + // CampaignCancel implements Manager.CampaignCancel interface func (m *mockManager) CampaignCancel() { m.campaignDone <- struct{}{} diff --git a/pkg/parser/BUILD.bazel b/pkg/parser/BUILD.bazel index 516fbc1dbf7cb..c1229045532ff 100644 --- a/pkg/parser/BUILD.bazel +++ b/pkg/parser/BUILD.bazel @@ -9,8 +9,10 @@ go_library( name = "parser", srcs = [ "digester.go", + "generate.go", "hintparser.go", "hintparserimpl.go", + "keywords.go", "lexer.go", "misc.go", "parser.go", @@ -41,6 +43,7 @@ go_test( "consistent_test.go", "digester_test.go", "hintparser_test.go", + "keywords_test.go", "lexer_test.go", "main_test.go", "parser_test.go", diff --git a/pkg/parser/Makefile b/pkg/parser/Makefile index 641b2fc7681d4..f7a203f03951b 100644 --- a/pkg/parser/Makefile +++ b/pkg/parser/Makefile @@ -1,12 +1,18 @@ .PHONY: all parser clean -all: fmt parser +all: fmt parser generate test: fmt parser sh test.sh parser: parser.go hintparser.go +genkeyword: generate_keyword/genkeyword.go + go build -C generate_keyword -o ../genkeyword + +generate: genkeyword parser.y + go generate + %arser.go: prefix = $(@:parser.go=) %arser.go: %arser.y bin/goyacc @echo "bin/goyacc -o $@ -p yy$(prefix) -t $(prefix)Parser $<" diff --git a/pkg/parser/ast/BUILD.bazel b/pkg/parser/ast/BUILD.bazel index e07c360c2cc16..249c3000de383 100644 --- a/pkg/parser/ast/BUILD.bazel +++ b/pkg/parser/ast/BUILD.bazel @@ -56,8 +56,10 @@ go_test( "//pkg/parser/auth", "//pkg/parser/charset", "//pkg/parser/format", + "//pkg/parser/model", "//pkg/parser/mysql", "//pkg/parser/test_driver", + "@com_github_stretchr_testify//assert", "@com_github_stretchr_testify//require", ], ) diff --git a/pkg/parser/ast/ast.go b/pkg/parser/ast/ast.go index bea8239541e62..de667c259f89f 100644 --- a/pkg/parser/ast/ast.go +++ b/pkg/parser/ast/ast.go @@ -253,6 +253,8 @@ func GetStmtLabel(stmtNode StmtNode) string { return "Shutdown" case *SavepointStmt: return "Savepoint" + case *OptimizeTableStmt: + return "Optimize" } return "other" } diff --git a/pkg/parser/ast/ddl.go b/pkg/parser/ast/ddl.go index 8211737d8ffd0..3fd598e22e575 100644 --- a/pkg/parser/ast/ddl.go +++ b/pkg/parser/ast/ddl.go @@ -46,6 +46,7 @@ var ( _ DDLNode = &DropSequenceStmt{} _ DDLNode = &DropPlacementPolicyStmt{} _ DDLNode = &DropResourceGroupStmt{} + _ DDLNode = &OptimizeTableStmt{} _ DDLNode = &RenameTableStmt{} _ DDLNode = &TruncateTableStmt{} _ DDLNode = &RepairTableStmt{} @@ -1322,6 +1323,40 @@ func (n *DropResourceGroupStmt) Accept(v Visitor) (Node, bool) { return v.Leave(n) } +type OptimizeTableStmt struct { + ddlNode + + NoWriteToBinLog bool + Tables []*TableName +} + +func (n *OptimizeTableStmt) Restore(ctx *format.RestoreCtx) error { + ctx.WriteKeyWord("OPTIMIZE ") + if n.NoWriteToBinLog { + ctx.WriteKeyWord("NO_WRITE_TO_BINLOG ") + } + ctx.WriteKeyWord("TABLE ") + + for index, table := range n.Tables { + if index != 0 { + ctx.WritePlain(", ") + } + if err := table.Restore(ctx); err != nil { + return errors.Annotatef(err, "An error occurred while restore OptimizeTableStmt.Tables[%d]", index) + } + } + return nil +} + +func (n *OptimizeTableStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*OptimizeTableStmt) + return v.Leave(n) +} + // DropSequenceStmt is a statement to drop a Sequence. type DropSequenceStmt struct { ddlNode diff --git a/pkg/parser/ast/ddl_test.go b/pkg/parser/ast/ddl_test.go index 9a67c9b796f06..b0907ba911c03 100644 --- a/pkg/parser/ast/ddl_test.go +++ b/pkg/parser/ast/ddl_test.go @@ -594,6 +594,21 @@ func TestAdminRepairTableRestore(t *testing.T) { runNodeRestoreTest(t, testCases, "%s", extractNodeFunc) } +func TestAdminOptimizeTableRestore(t *testing.T) { + testCases := []NodeRestoreTestCase{ + {"OPTIMIZE TABLE t", "OPTIMIZE TABLE `t`"}, + {"OPTIMIZE LOCAL TABLE t", "OPTIMIZE NO_WRITE_TO_BINLOG TABLE `t`"}, + {"OPTIMIZE NO_WRITE_TO_BINLOG TABLE t", "OPTIMIZE NO_WRITE_TO_BINLOG TABLE `t`"}, + {"OPTIMIZE TABLE t1, t2", "OPTIMIZE TABLE `t1`, `t2`"}, + {"optimize table t1,t2", "OPTIMIZE TABLE `t1`, `t2`"}, + {"optimize tables t1, t2", "OPTIMIZE TABLE `t1`, `t2`"}, + } + extractNodeFunc := func(node Node) Node { + return node + } + runNodeRestoreTest(t, testCases, "%s", extractNodeFunc) +} + func TestSequenceRestore(t *testing.T) { testCases := []NodeRestoreTestCase{ {"create sequence seq", "CREATE SEQUENCE `seq`"}, diff --git a/pkg/parser/ast/dml.go b/pkg/parser/ast/dml.go index 69ea4efb3dd6c..4647160ac9842 100644 --- a/pkg/parser/ast/dml.go +++ b/pkg/parser/ast/dml.go @@ -1557,6 +1557,8 @@ type SetOprSelectList struct { With *WithClause AfterSetOperator *SetOprType Selects []Node + Limit *Limit + OrderBy *OrderByClause } // Restore implements Node interface. @@ -1567,6 +1569,7 @@ func (n *SetOprSelectList) Restore(ctx *format.RestoreCtx) error { return errors.Annotate(err, "An error occurred while restore SetOprSelectList.With") } } + for i, stmt := range n.Selects { switch selectStmt := stmt.(type) { case *SelectStmt: @@ -1588,6 +1591,20 @@ func (n *SetOprSelectList) Restore(ctx *format.RestoreCtx) error { ctx.WritePlain(")") } } + + if n.OrderBy != nil { + ctx.WritePlain(" ") + if err := n.OrderBy.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore SetOprSelectList.OrderBy") + } + } + + if n.Limit != nil { + ctx.WritePlain(" ") + if err := n.Limit.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore SetOprSelectList.Limit") + } + } return nil } @@ -1612,6 +1629,20 @@ func (n *SetOprSelectList) Accept(v Visitor) (Node, bool) { } n.Selects[i] = node } + if n.OrderBy != nil { + node, ok := n.OrderBy.Accept(v) + if !ok { + return n, false + } + n.OrderBy = node.(*OrderByClause) + } + if n.Limit != nil { + node, ok := n.Limit.Accept(v) + if !ok { + return n, false + } + n.Limit = node.(*Limit) + } return v.Leave(n) } @@ -2077,6 +2108,7 @@ type ImportIntoStmt struct { Path string Format *string Options []*LoadDataOpt + Select ResultSetNode } var _ SensitiveStmtNode = &ImportIntoStmt{} @@ -2113,10 +2145,16 @@ func (n *ImportIntoStmt) Restore(ctx *format.RestoreCtx) error { } } ctx.WriteKeyWord(" FROM ") - ctx.WriteString(n.Path) - if n.Format != nil { - ctx.WriteKeyWord(" FORMAT ") - ctx.WriteString(*n.Format) + if n.Select != nil { + if err := n.Select.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore ImportIntoStmt.Select") + } + } else { + ctx.WriteString(n.Path) + if n.Format != nil { + ctx.WriteKeyWord(" FORMAT ") + ctx.WriteString(*n.Format) + } } if len(n.Options) > 0 { @@ -2163,6 +2201,13 @@ func (n *ImportIntoStmt) Accept(v Visitor) (Node, bool) { } n.ColumnAssignments[i] = node.(*Assignment) } + if n.Select != nil { + node, ok := n.Select.Accept(v) + if !ok { + return n, false + } + n.Select = node.(ResultSetNode) + } return v.Leave(n) } @@ -2979,6 +3024,7 @@ const ( ShowImportJobs ShowCreateProcedure ShowBinlogStatus + ShowReplicaStatus ) const ( @@ -3360,6 +3406,8 @@ func (n *ShowStmt) Restore(ctx *format.RestoreCtx) error { ctx.WriteKeyWord("PLACEMENT LABELS") case ShowSessionStates: ctx.WriteKeyWord("SESSION_STATES") + case ShowReplicaStatus: + ctx.WriteKeyWord("REPLICA STATUS") default: return errors.New("Unknown ShowStmt type") } diff --git a/pkg/parser/ast/dml_test.go b/pkg/parser/ast/dml_test.go index b8fd282c45e32..ee11bc38df24d 100644 --- a/pkg/parser/ast/dml_test.go +++ b/pkg/parser/ast/dml_test.go @@ -534,27 +534,6 @@ func TestImportActions(t *testing.T) { runNodeRestoreTest(t, testCases, "%s", extractNodeFunc) } -func TestLoadDataActions(t *testing.T) { - testCases := []NodeRestoreTestCase{ - { - sourceSQL: "pause load data job 123", - expectSQL: "PAUSE LOAD DATA JOB 123", - }, - { - sourceSQL: "resume load data job 123", - expectSQL: "RESUME LOAD DATA JOB 123", - }, - { - sourceSQL: "drop load data job 123", - expectSQL: "DROP LOAD DATA JOB 123", - }, - } - extractNodeFunc := func(node Node) Node { - return node - } - runNodeRestoreTest(t, testCases, "%s", extractNodeFunc) -} - func TestImportIntoRestore(t *testing.T) { testCases := []NodeRestoreTestCase{ { @@ -594,6 +573,31 @@ func TestImportIntoRestore(t *testing.T) { sourceSQL: "IMPORT INTO `t` from '/file.csv' with fields_terminated_by=_UTF8MB4'\t', detached, thread=1", expectSQL: "IMPORT INTO `t` FROM '/file.csv' WITH fields_terminated_by=_UTF8MB4'\t', detached, thread=1", }, + { + // SelectStmt + sourceSQL: "IMPORT INTO `t` from select * from xx", + expectSQL: "IMPORT INTO `t` FROM SELECT * FROM `xx`", + }, + { + // SelectStmtWithClause + sourceSQL: "IMPORT INTO `t` from with `c` as (select * from `xx`) select * from `c` with thread=1", + expectSQL: "IMPORT INTO `t` FROM WITH `c` AS (SELECT * FROM `xx`) SELECT * FROM `c` WITH thread=1", + }, + { + // SetOprStmt + sourceSQL: "IMPORT INTO `t` from select * from `xx` union select * from `yy` with thread=1", + expectSQL: "IMPORT INTO `t` FROM SELECT * FROM `xx` UNION SELECT * FROM `yy` WITH thread=1", + }, + { + // SetOprStmt + sourceSQL: "IMPORT INTO `t` from with `c` as (select * from `xx`) select * from `c` union select * from `c` with thread=1", + expectSQL: "IMPORT INTO `t` FROM WITH `c` AS (SELECT * FROM `xx`) SELECT * FROM `c` UNION SELECT * FROM `c` WITH thread=1", + }, + { + // SubSelect + sourceSQL: "IMPORT INTO `t` from (select * from xx)", + expectSQL: "IMPORT INTO `t` FROM (SELECT * FROM `xx`)", + }, } extractNodeFunc := func(node Node) Node { return node.(*ImportIntoStmt) @@ -632,3 +636,13 @@ func TestImportIntoSecureText(t *testing.T) { require.Regexp(t, tc.secured, n.SecureText(), comment) } } + +func TestImportIntoFromSelectInvalidStmt(t *testing.T) { + p := parser.New() + _, err := p.ParseOneStmt("IMPORT INTO t1(a, @1) FROM select * from t2;", "", "") + require.ErrorContains(t, err, "Cannot use user variable(1) in IMPORT INTO FROM SELECT statement") + _, err = p.ParseOneStmt("IMPORT INTO t1(a, @b) FROM select * from t2;", "", "") + require.ErrorContains(t, err, "Cannot use user variable(b) in IMPORT INTO FROM SELECT statement") + _, err = p.ParseOneStmt("IMPORT INTO t1(a) set a=1 FROM select a from t2;", "", "") + require.ErrorContains(t, err, "Cannot use SET clause in IMPORT INTO FROM SELECT statement.") +} diff --git a/pkg/parser/ast/misc.go b/pkg/parser/ast/misc.go index 0a909479cd019..0a927d586e36a 100644 --- a/pkg/parser/ast/misc.go +++ b/pkg/parser/ast/misc.go @@ -2334,6 +2334,7 @@ const ( AdminFlushPlanCache AdminSetBDRRole AdminShowBDRRole + AdminUnsetBDRRole ) // HandleRange represents a range where handle value >= Begin and < End. @@ -2346,12 +2347,45 @@ type HandleRange struct { type BDRRole string const ( - BDRRoleNone BDRRole = "none" BDRRolePrimary BDRRole = "primary" BDRRoleSecondary BDRRole = "secondary" - BDRRoleLocalOnly BDRRole = "local_only" + BDRRoleNone BDRRole = "" ) +// DeniedByBDR checks whether the DDL is denied by BDR. +func DeniedByBDR(role BDRRole, action model.ActionType, job *model.Job) (denied bool) { + ddlType, ok := model.ActionBDRMap[action] + switch role { + case BDRRolePrimary: + if !ok { + return true + } + + // Can't add unique index on primary role. + if job != nil && (action == model.ActionAddIndex || action == model.ActionAddPrimaryKey) && + len(job.Args) >= 1 && job.Args[0].(bool) { + // job.Args[0] is unique when job.Type is ActionAddIndex or ActionAddPrimaryKey. + return true + } + + if ddlType == model.SafeDDL || ddlType == model.UnmanagementDDL { + return false + } + case BDRRoleSecondary: + if !ok { + return true + } + if ddlType == model.UnmanagementDDL { + return false + } + default: + // if user do not set bdr role, we will not deny any ddl as `none` + return false + } + + return true +} + type StatementScope int const ( @@ -2596,19 +2630,17 @@ func (n *AdminStmt) Restore(ctx *format.RestoreCtx) error { } case AdminSetBDRRole: switch n.BDRRole { - case BDRRoleNone: - ctx.WriteKeyWord("SET BDR ROLE NONE") case BDRRolePrimary: ctx.WriteKeyWord("SET BDR ROLE PRIMARY") case BDRRoleSecondary: ctx.WriteKeyWord("SET BDR ROLE SECONDARY") - case BDRRoleLocalOnly: - ctx.WriteKeyWord("SET BDR ROLE LOCAL_ONLY") default: return errors.New("Unsupported BDR role") } case AdminShowBDRRole: ctx.WriteKeyWord("SHOW BDR ROLE") + case AdminUnsetBDRRole: + ctx.WriteKeyWord("UNSET BDR ROLE") default: return errors.New("Unsupported AdminStmt type") } @@ -3559,45 +3591,6 @@ func (n *BRIEStmt) SecureText() string { return sb.String() } -type LoadDataActionTp int - -const ( - LoadDataPause LoadDataActionTp = iota - LoadDataResume - LoadDataCancel - LoadDataDrop -) - -// LoadDataActionStmt represent PAUSE/RESUME/CANCEL/DROP LOAD DATA JOB statement. -type LoadDataActionStmt struct { - stmtNode - - Tp LoadDataActionTp - JobID int64 -} - -func (n *LoadDataActionStmt) Accept(v Visitor) (Node, bool) { - newNode, _ := v.Enter(n) - return v.Leave(newNode) -} - -func (n *LoadDataActionStmt) Restore(ctx *format.RestoreCtx) error { - switch n.Tp { - case LoadDataPause: - ctx.WriteKeyWord("PAUSE LOAD DATA JOB ") - case LoadDataResume: - ctx.WriteKeyWord("RESUME LOAD DATA JOB ") - case LoadDataCancel: - ctx.WriteKeyWord("CANCEL LOAD DATA JOB ") - case LoadDataDrop: - ctx.WriteKeyWord("DROP LOAD DATA JOB ") - default: - return errors.Errorf("invalid load data action type: %d", n.Tp) - } - ctx.WritePlainf("%d", n.JobID) - return nil -} - type ImportIntoActionTp string const ( @@ -3705,9 +3698,11 @@ type HintTable struct { } func (ht *HintTable) Restore(ctx *format.RestoreCtx) { - if ht.DBName.L != "" { - ctx.WriteName(ht.DBName.String()) - ctx.WriteKeyWord(".") + if !ctx.Flags.HasWithoutSchemaNameFlag() { + if ht.DBName.L != "" { + ctx.WriteName(ht.DBName.String()) + ctx.WriteKeyWord(".") + } } ctx.WriteName(ht.TableName.String()) if ht.QBName.L != "" { @@ -3758,7 +3753,9 @@ func (n *TableOptimizerHint) Restore(ctx *format.RestoreCtx) error { ctx.WriteName(n.HintData.(string)) case "nth_plan": ctx.WritePlainf("%d", n.HintData.(int64)) - case "tidb_hj", "tidb_smj", "tidb_inlj", "hash_join", "hash_join_build", "hash_join_probe", "merge_join", "inl_join", "broadcast_join", "shuffle_join", "inl_hash_join", "inl_merge_join", "leading": + case "tidb_hj", "tidb_smj", "tidb_inlj", "hash_join", "hash_join_build", "hash_join_probe", "merge_join", "inl_join", + "broadcast_join", "shuffle_join", "inl_hash_join", "inl_merge_join", "leading", "no_hash_join", "no_merge_join", + "no_index_join", "no_index_hash_join", "no_index_merge_join": for i, table := range n.Tables { if i != 0 { ctx.WritePlain(", ") @@ -3816,7 +3813,7 @@ func (n *TableOptimizerHint) Restore(ctx *format.RestoreCtx) error { hintData := n.HintData.(HintSetVar) ctx.WritePlain(hintData.VarName) ctx.WritePlain(" = ") - ctx.WritePlain(hintData.Value) + ctx.WriteString(hintData.Value) } ctx.WritePlain(")") return nil diff --git a/pkg/parser/ast/misc_test.go b/pkg/parser/ast/misc_test.go index e284704cefa7c..4bcb903366576 100644 --- a/pkg/parser/ast/misc_test.go +++ b/pkg/parser/ast/misc_test.go @@ -20,7 +20,9 @@ import ( "github.com/pingcap/tidb/pkg/parser" "github.com/pingcap/tidb/pkg/parser/ast" "github.com/pingcap/tidb/pkg/parser/auth" + "github.com/pingcap/tidb/pkg/parser/model" "github.com/pingcap/tidb/pkg/parser/mysql" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -424,3 +426,390 @@ func TestRedactURL(t *testing.T) { }) } } + +func TestDeniedByBDR(t *testing.T) { + testCases := []struct { + role ast.BDRRole + action model.ActionType + expected bool + }{ + // Roles for ActionCreateSchema + {ast.BDRRolePrimary, model.ActionCreateSchema, false}, + {ast.BDRRoleSecondary, model.ActionCreateSchema, true}, + {ast.BDRRoleNone, model.ActionCreateSchema, false}, + + // Roles for ActionDropSchema + {ast.BDRRolePrimary, model.ActionDropSchema, true}, + {ast.BDRRoleSecondary, model.ActionDropSchema, true}, + {ast.BDRRoleNone, model.ActionDropSchema, false}, + + // Roles for ActionCreateTable + {ast.BDRRolePrimary, model.ActionCreateTable, false}, + {ast.BDRRoleSecondary, model.ActionCreateTable, true}, + {ast.BDRRoleNone, model.ActionCreateTable, false}, + + // Roles for ActionDropTable + {ast.BDRRolePrimary, model.ActionDropTable, true}, + {ast.BDRRoleSecondary, model.ActionDropTable, true}, + {ast.BDRRoleNone, model.ActionDropTable, false}, + + // Roles for ActionAddColumn + {ast.BDRRolePrimary, model.ActionAddColumn, false}, + {ast.BDRRoleSecondary, model.ActionAddColumn, true}, + {ast.BDRRoleNone, model.ActionAddColumn, false}, + + // Roles for ActionDropColumn + {ast.BDRRolePrimary, model.ActionDropColumn, true}, + {ast.BDRRoleSecondary, model.ActionDropColumn, true}, + {ast.BDRRoleNone, model.ActionDropColumn, false}, + + // Roles for ActionAddIndex + {ast.BDRRolePrimary, model.ActionAddIndex, false}, + {ast.BDRRoleSecondary, model.ActionAddIndex, true}, + {ast.BDRRoleNone, model.ActionAddIndex, false}, + + // Roles for ActionDropIndex + {ast.BDRRolePrimary, model.ActionDropIndex, false}, + {ast.BDRRoleSecondary, model.ActionDropIndex, true}, + {ast.BDRRoleNone, model.ActionDropIndex, false}, + + // Roles for ActionAddForeignKey + {ast.BDRRolePrimary, model.ActionAddForeignKey, true}, + {ast.BDRRoleSecondary, model.ActionAddForeignKey, true}, + {ast.BDRRoleNone, model.ActionAddForeignKey, false}, + + // Roles for ActionDropForeignKey + {ast.BDRRolePrimary, model.ActionDropForeignKey, true}, + {ast.BDRRoleSecondary, model.ActionDropForeignKey, true}, + {ast.BDRRoleNone, model.ActionDropForeignKey, false}, + + // Roles for ActionTruncateTable + {ast.BDRRolePrimary, model.ActionTruncateTable, true}, + {ast.BDRRoleSecondary, model.ActionTruncateTable, true}, + {ast.BDRRoleNone, model.ActionTruncateTable, false}, + + // Roles for ActionModifyColumn + {ast.BDRRolePrimary, model.ActionModifyColumn, false}, + {ast.BDRRoleSecondary, model.ActionModifyColumn, true}, + {ast.BDRRoleNone, model.ActionModifyColumn, false}, + + // Roles for ActionRebaseAutoID + {ast.BDRRolePrimary, model.ActionRebaseAutoID, true}, + {ast.BDRRoleSecondary, model.ActionRebaseAutoID, true}, + {ast.BDRRoleNone, model.ActionRebaseAutoID, false}, + + // Roles for ActionRenameTable + {ast.BDRRolePrimary, model.ActionRenameTable, true}, + {ast.BDRRoleSecondary, model.ActionRenameTable, true}, + {ast.BDRRoleNone, model.ActionRenameTable, false}, + + // Roles for ActionSetDefaultValue + {ast.BDRRolePrimary, model.ActionSetDefaultValue, false}, + {ast.BDRRoleSecondary, model.ActionSetDefaultValue, true}, + {ast.BDRRoleNone, model.ActionSetDefaultValue, false}, + + // Roles for ActionShardRowID + {ast.BDRRolePrimary, model.ActionShardRowID, true}, + {ast.BDRRoleSecondary, model.ActionShardRowID, true}, + {ast.BDRRoleNone, model.ActionShardRowID, false}, + + // Roles for ActionModifyTableComment + {ast.BDRRolePrimary, model.ActionModifyTableComment, false}, + {ast.BDRRoleSecondary, model.ActionModifyTableComment, true}, + {ast.BDRRoleNone, model.ActionModifyTableComment, false}, + + // Roles for ActionRenameIndex + {ast.BDRRolePrimary, model.ActionRenameIndex, false}, + {ast.BDRRoleSecondary, model.ActionRenameIndex, true}, + {ast.BDRRoleNone, model.ActionRenameIndex, false}, + + // Roles for ActionAddTablePartition + {ast.BDRRolePrimary, model.ActionAddTablePartition, false}, + {ast.BDRRoleSecondary, model.ActionAddTablePartition, true}, + {ast.BDRRoleNone, model.ActionAddTablePartition, false}, + + // Roles for ActionDropTablePartition + {ast.BDRRolePrimary, model.ActionDropTablePartition, true}, + {ast.BDRRoleSecondary, model.ActionDropTablePartition, true}, + {ast.BDRRoleNone, model.ActionDropTablePartition, false}, + + // Roles for ActionCreateView + {ast.BDRRolePrimary, model.ActionCreateView, false}, + {ast.BDRRoleSecondary, model.ActionCreateView, true}, + {ast.BDRRoleNone, model.ActionCreateView, false}, + + // Roles for ActionModifyTableCharsetAndCollate + {ast.BDRRolePrimary, model.ActionModifyTableCharsetAndCollate, true}, + {ast.BDRRoleSecondary, model.ActionModifyTableCharsetAndCollate, true}, + {ast.BDRRoleNone, model.ActionModifyTableCharsetAndCollate, false}, + + // Roles for ActionTruncateTablePartition + {ast.BDRRolePrimary, model.ActionTruncateTablePartition, true}, + {ast.BDRRoleSecondary, model.ActionTruncateTablePartition, true}, + {ast.BDRRoleNone, model.ActionTruncateTablePartition, false}, + + // Roles for ActionDropView + {ast.BDRRolePrimary, model.ActionDropView, false}, + {ast.BDRRoleSecondary, model.ActionDropView, true}, + {ast.BDRRoleNone, model.ActionDropView, false}, + + // Roles for ActionRecoverTable + {ast.BDRRolePrimary, model.ActionRecoverTable, true}, + {ast.BDRRoleSecondary, model.ActionRecoverTable, true}, + {ast.BDRRoleNone, model.ActionRecoverTable, false}, + + // Roles for ActionModifySchemaCharsetAndCollate + {ast.BDRRolePrimary, model.ActionModifySchemaCharsetAndCollate, true}, + {ast.BDRRoleSecondary, model.ActionModifySchemaCharsetAndCollate, true}, + {ast.BDRRoleNone, model.ActionModifySchemaCharsetAndCollate, false}, + + // Roles for ActionLockTable + {ast.BDRRolePrimary, model.ActionLockTable, true}, + {ast.BDRRoleSecondary, model.ActionLockTable, true}, + {ast.BDRRoleNone, model.ActionLockTable, false}, + + // Roles for ActionUnlockTable + {ast.BDRRolePrimary, model.ActionUnlockTable, true}, + {ast.BDRRoleSecondary, model.ActionUnlockTable, true}, + {ast.BDRRoleNone, model.ActionUnlockTable, false}, + + // Roles for ActionRepairTable + {ast.BDRRolePrimary, model.ActionRepairTable, true}, + {ast.BDRRoleSecondary, model.ActionRepairTable, true}, + {ast.BDRRoleNone, model.ActionRepairTable, false}, + + // Roles for ActionSetTiFlashReplica + {ast.BDRRolePrimary, model.ActionSetTiFlashReplica, true}, + {ast.BDRRoleSecondary, model.ActionSetTiFlashReplica, true}, + {ast.BDRRoleNone, model.ActionSetTiFlashReplica, false}, + + // Roles for ActionUpdateTiFlashReplicaStatus + {ast.BDRRolePrimary, model.ActionUpdateTiFlashReplicaStatus, true}, + {ast.BDRRoleSecondary, model.ActionUpdateTiFlashReplicaStatus, true}, + {ast.BDRRoleNone, model.ActionUpdateTiFlashReplicaStatus, false}, + + // Roles for ActionAddPrimaryKey + {ast.BDRRolePrimary, model.ActionAddPrimaryKey, true}, + {ast.BDRRoleSecondary, model.ActionAddPrimaryKey, true}, + {ast.BDRRoleNone, model.ActionAddPrimaryKey, false}, + + // Roles for ActionDropPrimaryKey + {ast.BDRRolePrimary, model.ActionDropPrimaryKey, false}, + {ast.BDRRoleSecondary, model.ActionDropPrimaryKey, true}, + {ast.BDRRoleNone, model.ActionDropPrimaryKey, false}, + + // Roles for ActionCreateSequence + {ast.BDRRolePrimary, model.ActionCreateSequence, true}, + {ast.BDRRoleSecondary, model.ActionCreateSequence, true}, + {ast.BDRRoleNone, model.ActionCreateSequence, false}, + + // Roles for ActionAlterSequence + {ast.BDRRolePrimary, model.ActionAlterSequence, true}, + {ast.BDRRoleSecondary, model.ActionAlterSequence, true}, + {ast.BDRRoleNone, model.ActionAlterSequence, false}, + + // Roles for ActionDropSequence + {ast.BDRRolePrimary, model.ActionDropSequence, true}, + {ast.BDRRoleSecondary, model.ActionDropSequence, true}, + {ast.BDRRoleNone, model.ActionDropSequence, false}, + + // Roles for ActionModifyTableAutoIdCache + {ast.BDRRolePrimary, model.ActionModifyTableAutoIdCache, true}, + {ast.BDRRoleSecondary, model.ActionModifyTableAutoIdCache, true}, + {ast.BDRRoleNone, model.ActionModifyTableAutoIdCache, false}, + + // Roles for ActionRebaseAutoRandomBase + {ast.BDRRolePrimary, model.ActionRebaseAutoRandomBase, true}, + {ast.BDRRoleSecondary, model.ActionRebaseAutoRandomBase, true}, + {ast.BDRRoleNone, model.ActionRebaseAutoRandomBase, false}, + + // Roles for ActionAlterIndexVisibility + {ast.BDRRolePrimary, model.ActionAlterIndexVisibility, false}, + {ast.BDRRoleSecondary, model.ActionAlterIndexVisibility, true}, + {ast.BDRRoleNone, model.ActionAlterIndexVisibility, false}, + + // Roles for ActionExchangeTablePartition + {ast.BDRRolePrimary, model.ActionExchangeTablePartition, true}, + {ast.BDRRoleSecondary, model.ActionExchangeTablePartition, true}, + {ast.BDRRoleNone, model.ActionExchangeTablePartition, false}, + + // Roles for ActionAddCheckConstraint + {ast.BDRRolePrimary, model.ActionAddCheckConstraint, true}, + {ast.BDRRoleSecondary, model.ActionAddCheckConstraint, true}, + {ast.BDRRoleNone, model.ActionAddCheckConstraint, false}, + + // Roles for ActionDropCheckConstraint + {ast.BDRRolePrimary, model.ActionDropCheckConstraint, true}, + {ast.BDRRoleSecondary, model.ActionDropCheckConstraint, true}, + {ast.BDRRoleNone, model.ActionDropCheckConstraint, false}, + + // Roles for ActionAlterCheckConstraint + {ast.BDRRolePrimary, model.ActionAlterCheckConstraint, true}, + {ast.BDRRoleSecondary, model.ActionAlterCheckConstraint, true}, + {ast.BDRRoleNone, model.ActionAlterCheckConstraint, false}, + + // Roles for ActionRenameTables + {ast.BDRRolePrimary, model.ActionRenameTables, true}, + {ast.BDRRoleSecondary, model.ActionRenameTables, true}, + {ast.BDRRoleNone, model.ActionRenameTables, false}, + + // Roles for ActionAlterTableAttributes + {ast.BDRRolePrimary, model.ActionAlterTableAttributes, true}, + {ast.BDRRoleSecondary, model.ActionAlterTableAttributes, true}, + {ast.BDRRoleNone, model.ActionAlterTableAttributes, false}, + + // Roles for ActionAlterTablePartitionAttributes + {ast.BDRRolePrimary, model.ActionAlterTablePartitionAttributes, true}, + {ast.BDRRoleSecondary, model.ActionAlterTablePartitionAttributes, true}, + {ast.BDRRoleNone, model.ActionAlterTablePartitionAttributes, false}, + + // Roles for ActionCreatePlacementPolicy + {ast.BDRRolePrimary, model.ActionCreatePlacementPolicy, false}, + {ast.BDRRoleSecondary, model.ActionCreatePlacementPolicy, false}, + {ast.BDRRoleNone, model.ActionCreatePlacementPolicy, false}, + + // Roles for ActionAlterPlacementPolicy + {ast.BDRRolePrimary, model.ActionAlterPlacementPolicy, false}, + {ast.BDRRoleSecondary, model.ActionAlterPlacementPolicy, false}, + {ast.BDRRoleNone, model.ActionAlterPlacementPolicy, false}, + + // Roles for ActionDropPlacementPolicy + {ast.BDRRolePrimary, model.ActionDropPlacementPolicy, false}, + {ast.BDRRoleSecondary, model.ActionDropPlacementPolicy, false}, + {ast.BDRRoleNone, model.ActionDropPlacementPolicy, false}, + + // Roles for ActionAlterTablePartitionPlacement + {ast.BDRRolePrimary, model.ActionAlterTablePartitionPlacement, true}, + {ast.BDRRoleSecondary, model.ActionAlterTablePartitionPlacement, true}, + {ast.BDRRoleNone, model.ActionAlterTablePartitionPlacement, false}, + + // Roles for ActionModifySchemaDefaultPlacement + {ast.BDRRolePrimary, model.ActionModifySchemaDefaultPlacement, true}, + {ast.BDRRoleSecondary, model.ActionModifySchemaDefaultPlacement, true}, + {ast.BDRRoleNone, model.ActionModifySchemaDefaultPlacement, false}, + + // Roles for ActionAlterTablePlacement + {ast.BDRRolePrimary, model.ActionAlterTablePlacement, true}, + {ast.BDRRoleSecondary, model.ActionAlterTablePlacement, true}, + {ast.BDRRoleNone, model.ActionAlterTablePlacement, false}, + + // Roles for ActionAlterCacheTable + {ast.BDRRolePrimary, model.ActionAlterCacheTable, true}, + {ast.BDRRoleSecondary, model.ActionAlterCacheTable, true}, + {ast.BDRRoleNone, model.ActionAlterCacheTable, false}, + + // Roles for ActionAlterTableStatsOptions + {ast.BDRRolePrimary, model.ActionAlterTableStatsOptions, true}, + {ast.BDRRoleSecondary, model.ActionAlterTableStatsOptions, true}, + {ast.BDRRoleNone, model.ActionAlterTableStatsOptions, false}, + + // Roles for ActionAlterNoCacheTable + {ast.BDRRolePrimary, model.ActionAlterNoCacheTable, true}, + {ast.BDRRoleSecondary, model.ActionAlterNoCacheTable, true}, + {ast.BDRRoleNone, model.ActionAlterNoCacheTable, false}, + + // Roles for ActionCreateTables + {ast.BDRRolePrimary, model.ActionCreateTables, false}, + {ast.BDRRoleSecondary, model.ActionCreateTables, true}, + {ast.BDRRoleNone, model.ActionCreateTables, false}, + + // Roles for ActionMultiSchemaChange + {ast.BDRRolePrimary, model.ActionMultiSchemaChange, true}, + {ast.BDRRoleSecondary, model.ActionMultiSchemaChange, true}, + {ast.BDRRoleNone, model.ActionMultiSchemaChange, false}, + + // Roles for ActionFlashbackCluster + {ast.BDRRolePrimary, model.ActionFlashbackCluster, true}, + {ast.BDRRoleSecondary, model.ActionFlashbackCluster, true}, + {ast.BDRRoleNone, model.ActionFlashbackCluster, false}, + + // Roles for ActionRecoverSchema + {ast.BDRRolePrimary, model.ActionRecoverSchema, true}, + {ast.BDRRoleSecondary, model.ActionRecoverSchema, true}, + {ast.BDRRoleNone, model.ActionRecoverSchema, false}, + + // Roles for ActionReorganizePartition + {ast.BDRRolePrimary, model.ActionReorganizePartition, true}, + {ast.BDRRoleSecondary, model.ActionReorganizePartition, true}, + {ast.BDRRoleNone, model.ActionReorganizePartition, false}, + + // Roles for ActionAlterTTLInfo + {ast.BDRRolePrimary, model.ActionAlterTTLInfo, false}, + {ast.BDRRoleSecondary, model.ActionAlterTTLInfo, true}, + {ast.BDRRoleNone, model.ActionAlterTTLInfo, false}, + + // Roles for ActionAlterTTLRemove + {ast.BDRRolePrimary, model.ActionAlterTTLRemove, false}, + {ast.BDRRoleSecondary, model.ActionAlterTTLRemove, true}, + {ast.BDRRoleNone, model.ActionAlterTTLRemove, false}, + + // Roles for ActionCreateResourceGroup + {ast.BDRRolePrimary, model.ActionCreateResourceGroup, false}, + {ast.BDRRoleSecondary, model.ActionCreateResourceGroup, false}, + {ast.BDRRoleNone, model.ActionCreateResourceGroup, false}, + + // Roles for ActionAlterResourceGroup + {ast.BDRRolePrimary, model.ActionAlterResourceGroup, false}, + {ast.BDRRoleSecondary, model.ActionAlterResourceGroup, false}, + {ast.BDRRoleNone, model.ActionAlterResourceGroup, false}, + + // Roles for ActionDropResourceGroup + {ast.BDRRolePrimary, model.ActionDropResourceGroup, false}, + {ast.BDRRoleSecondary, model.ActionDropResourceGroup, false}, + {ast.BDRRoleNone, model.ActionDropResourceGroup, false}, + + // Roles for ActionAlterTablePartitioning + {ast.BDRRolePrimary, model.ActionAlterTablePartitioning, true}, + {ast.BDRRoleSecondary, model.ActionAlterTablePartitioning, true}, + {ast.BDRRoleNone, model.ActionAlterTablePartitioning, false}, + + // Roles for ActionRemovePartitioning + {ast.BDRRolePrimary, model.ActionRemovePartitioning, true}, + {ast.BDRRoleSecondary, model.ActionRemovePartitioning, true}, + {ast.BDRRoleNone, model.ActionRemovePartitioning, false}, + } + + for _, tc := range testCases { + assert.Equal(t, tc.expected, ast.DeniedByBDR(tc.role, tc.action, nil), fmt.Sprintf("role: %v, action: %v", tc.role, tc.action)) + } + + // test special cases + testCases2 := []struct { + role ast.BDRRole + action model.ActionType + job *model.Job + expected bool + }{ + { + role: ast.BDRRolePrimary, + action: model.ActionAddPrimaryKey, + job: &model.Job{ + Type: model.ActionAddPrimaryKey, + Args: []interface{}{true}, + }, + expected: true, + }, + { + role: ast.BDRRolePrimary, + action: model.ActionAddIndex, + job: &model.Job{ + Type: model.ActionAddIndex, + Args: []interface{}{true}, + }, + expected: true, + }, + { + role: ast.BDRRolePrimary, + action: model.ActionAddIndex, + job: &model.Job{ + Type: model.ActionAddIndex, + Args: []interface{}{false}, + }, + expected: false, + }, + } + + for _, tc := range testCases2 { + assert.Equal(t, tc.expected, ast.DeniedByBDR(tc.role, tc.action, tc.job), fmt.Sprintf("role: %v, action: %v", tc.role, tc.action)) + } +} diff --git a/pkg/parser/ast/stats.go b/pkg/parser/ast/stats.go index 38135457ed5c4..2c0a8c6beec48 100644 --- a/pkg/parser/ast/stats.go +++ b/pkg/parser/ast/stats.go @@ -35,8 +35,9 @@ type AnalyzeTableStmt struct { AnalyzeOpts []AnalyzeOpt // IndexFlag is true when we only analyze indices for a table. - IndexFlag bool - Incremental bool + IndexFlag bool + Incremental bool + NoWriteToBinLog bool // HistogramOperation is set in "ANALYZE TABLE ... UPDATE/DROP HISTOGRAM ..." statement. HistogramOperation HistogramOperationType // ColumnNames indicate the columns whose statistics need to be collected. @@ -97,10 +98,14 @@ type AnalyzeOpt struct { // Restore implements Node interface. func (n *AnalyzeTableStmt) Restore(ctx *format.RestoreCtx) error { + ctx.WriteKeyWord("ANALYZE ") + if n.NoWriteToBinLog { + ctx.WriteKeyWord("NO_WRITE_TO_BINLOG ") + } if n.Incremental { - ctx.WriteKeyWord("ANALYZE INCREMENTAL TABLE ") + ctx.WriteKeyWord("INCREMENTAL TABLE ") } else { - ctx.WriteKeyWord("ANALYZE TABLE ") + ctx.WriteKeyWord("TABLE ") } for i, table := range n.TableNames { if i != 0 { diff --git a/pkg/parser/docs/quickstart.md b/pkg/parser/docs/quickstart.md index 7418c4ef1644c..c728e740874ec 100644 --- a/pkg/parser/docs/quickstart.md +++ b/pkg/parser/docs/quickstart.md @@ -11,16 +11,18 @@ In this example, you will build a project, which can extract all the column name ## Create a Project ```bash -mkdir colx && cd colx -go mod init colx && touch main.go +mkdir colx +cd colx +go mod init colx +touch main.go ``` ## Import Dependencies -First, you need to use `go get` to fetch the dependencies through git hash. The git hashes are available in [release page](https://github.com/pingcap/tidb/releases). Take `v5.3.0` as an example: +First, you need to use `go get` to fetch the dependencies through git hash. The git hashes are available in [release page](https://github.com/pingcap/tidb/releases). Take `v7.5.0` as an example: ```bash -go get -v github.com/pingcap/tidb/parser@4a1b2e9 +go get -v github.com/pingcap/tidb/pkg/parser@069631e ``` > **NOTE** @@ -30,11 +32,11 @@ go get -v github.com/pingcap/tidb/parser@4a1b2e9 > You may want to use advanced API on expressions (a kind of AST node), such as numbers, string literals, booleans, nulls, etc. It is strongly recommended using the `types` package in TiDB repo with the following command: > > ```bash -> go get -v github.com/pingcap/tidb/types/parser_driver@4a1b2e9 +> go get -v github.com/pingcap/tidb/pkg/types/parser_driver@069631e > ``` > and import it in your golang source code: > ```go -> import _ "github.com/pingcap/tidb/types/parser_driver" +> import _ "github.com/pingcap/tidb/pkg/types/parser_driver" > ``` Your directory should contain the following three files: @@ -50,8 +52,8 @@ Now, open `main.go` with your favorite editor, and start coding! ## Parse SQL text To convert a SQL text to an AST tree, you need to: -1. Use the [`parser.New()`](https://pkg.go.dev/github.com/pingcap/tidb/parser?tab=doc#New) function to instantiate a parser, and -2. Invoke the method [`Parse(sql, charset, collation)`](https://pkg.go.dev/github.com/pingcap/tidb/parser?tab=doc#Parser.Parse) on the parser. +1. Use the [`parser.New()`](https://pkg.go.dev/github.com/pingcap/tidb/pkg/parser?tab=doc#New) function to instantiate a parser, and +2. Invoke the method [`Parse(sql, charset, collation)`](https://pkg.go.dev/github.com/pingcap/tidb/pkg/parser?tab=doc#Parser.Parse) on the parser. ```go package main @@ -59,15 +61,15 @@ package main import ( "fmt" - "github.com/pingcap/tidb/parser" - "github.com/pingcap/tidb/parser/ast" - _ "github.com/pingcap/tidb/parser/test_driver" + "github.com/pingcap/tidb/pkg/parser" + "github.com/pingcap/tidb/pkg/parser/ast" + _ "github.com/pingcap/tidb/pkg/parser/test_driver" ) func parse(sql string) (*ast.StmtNode, error) { p := parser.New() - stmtNodes, _, err := p.Parse(sql, "", "") + stmtNodes, _, err := p.ParseSQL(sql) if err != nil { return nil, err } @@ -83,7 +85,6 @@ func main() { } fmt.Printf("%v\n", *astNode) } - ``` Test the parser by running the following command: @@ -103,20 +104,17 @@ If the parser runs properly, you should get a result like this: > Here are a few things you might want to know: > - To use a parser, a `parser_driver` is required. It decides how to parse the basic data types in SQL. > -> You can use [`github.com/pingcap/tidb/parser/test_driver`](https://pkg.go.dev/github.com/pingcap/tidb/parser/test_driver) as the `parser_driver` for test. Again, if you need advanced features, please use the `parser_driver` in TiDB (run `go get -v github.com/pingcap/tidb/types/parser_driver@4a1b2e9` and import it). -> - The instantiated parser object is not goroutine safe. It is better to keep it in a single goroutine. -> - The instantiated parser object is not lightweight. It is better to reuse it if possible. -> - Warning: the 'parser.result' object is being reused without being properly reset or copied. This can cause unexpected behavior or errors if the object is used for multiple parsing operations or concurrently in multiple goroutines. To avoid these issues, make a copy of the 'parser.result' object before calling 'parser.Parse()' again or before using it in another goroutine, or create a new 'parser' object altogether for each new parsing operation. -> - The 2nd and 3rd arguments of [`parser.Parse()`](https://pkg.go.dev/github.com/pingcap/tidb/parser?tab=doc#Parser.Parse) are charset and collation respectively. If you pass an empty string into it, a default value is chosen. - +> You can use [`github.com/pingcap/tidb/pkg/parser/test_driver`](https://pkg.go.dev/github.com/pingcap/tidb/pkg/parser/test_driver) as the `parser_driver` for test. Again, if you need advanced features, please use the `parser_driver` in TiDB (run `go get -v github.com/pingcap/tidb/types/parser_driver@069631e` and import it). +> - The instantiated parser object is not goroutine safe and not lightweight. It is better to keep it in a single goroutine, and reuse it if possible. +> - Warning: the `parser.result` object is being reused without being properly reset or copied. This can cause unexpected behavior or errors if the object is used for multiple parsing operations or concurrently in multiple goroutines. To avoid these issues, make a copy of `parser.result` object before calling `parser.Parse()` again or before using it in another goroutine, or create a new `parser` object altogether for each new parsing operation. ## Traverse AST Nodes Now you get the AST tree root of a SQL statement. It is time to extract the column names by traverse. -Parser implements the interface [`ast.Node`](https://pkg.go.dev/github.com/pingcap/tidb/parser/ast?tab=doc#Node) for each kind of AST node, such as SelectStmt, TableName, ColumnName. [`ast.Node`](https://pkg.go.dev/github.com/pingcap/tidb/parser/ast?tab=doc#Node) provides a method `Accept(v Visitor) (node Node, ok bool)` to allow any struct that has implemented [`ast.Visitor`](https://pkg.go.dev/github.com/pingcap/tidb/parser/ast?tab=doc#Visitor) to traverse itself. +Parser implements the interface [`ast.Node`](https://pkg.go.dev/github.com/pingcap/tidb/pkg/parser/ast?tab=doc#Node) for each kind of AST node, such as `SelectStmt`, `TableName`, `ColumnName`, etc. [`ast.Node`](https://pkg.go.dev/github.com/pingcap/tidb/pkg/parser/ast?tab=doc#Node) provides a method `Accept(v Visitor) (node Node, ok bool)` to allow any struct that has implemented [`ast.Visitor`](https://pkg.go.dev/github.com/pingcap/tidb/pkg/parser/ast?tab=doc#Visitor) to traverse itself. -[`ast.Visitor`](https://pkg.go.dev/github.com/pingcap/tidb/parser/ast?tab=doc#Visitor) is defined as follows: +[`ast.Visitor`](https://pkg.go.dev/github.com/pingcap/tidb/pkg/parser/ast?tab=doc#Visitor) is defined as follows: ```go type Visitor interface { Enter(n Node) (node Node, skipChildren bool) @@ -174,7 +172,7 @@ func main() { Test your program: ```bash -go build && ./colx 'select a, b from t' +go run main.go 'select a, b from t' ``` ``` @@ -184,12 +182,10 @@ go build && ./colx 'select a, b from t' You can also try a different SQL statement as an input. For example: ```console -$ ./colx 'SELECT a, b FROM t GROUP BY (a, b) HAVING a > c ORDER BY b' +$ go run main.go 'SELECT a, b FROM t GROUP BY (a, b) HAVING a > c ORDER BY b' [a b a b a c b] -If necessary, you can deduplicate by yourself. - -$ ./colx 'SELECT a, b FROM t/invalid_str' +$ go run main.go 'SELECT a, b FROM t/invalid_str' parse error: line 1 column 19 near "/invalid_str" ``` diff --git a/pkg/parser/generate.go b/pkg/parser/generate.go new file mode 100644 index 0000000000000..5f2d38640cb27 --- /dev/null +++ b/pkg/parser/generate.go @@ -0,0 +1,4 @@ +package parser + +// Generate keywords.go +//go:generate ./genkeyword diff --git a/pkg/parser/generate_keyword/BUILD.bazel b/pkg/parser/generate_keyword/BUILD.bazel new file mode 100644 index 0000000000000..c37b690d6b1c3 --- /dev/null +++ b/pkg/parser/generate_keyword/BUILD.bazel @@ -0,0 +1,23 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_binary", "go_library", "go_test") + +go_library( + name = "generate_keyword_lib", + srcs = ["genkeyword.go"], + importpath = "github.com/pingcap/tidb/pkg/parser/generate_keyword", + visibility = ["//visibility:private"], +) + +go_binary( + name = "generate_keyword", + embed = [":generate_keyword_lib"], + visibility = ["//visibility:public"], +) + +go_test( + name = "generate_keyword_test", + timeout = "short", + srcs = ["genkeyword_test.go"], + embed = [":generate_keyword_lib"], + flaky = True, + deps = ["@com_github_stretchr_testify//require"], +) diff --git a/pkg/parser/generate_keyword/genkeyword.go b/pkg/parser/generate_keyword/genkeyword.go new file mode 100644 index 0000000000000..edfaa05dd5c8e --- /dev/null +++ b/pkg/parser/generate_keyword/genkeyword.go @@ -0,0 +1,146 @@ +// Copyright 2023 PingCAP, 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +package main + +import ( + "fmt" + "log" + "os" + "regexp" + "strings" +) + +const ( + reservedKeywordStart = "The following tokens belong to ReservedKeyword" + unreservedkeywordStart = "The following tokens belong to UnReservedKeyword" + notKeywordStart = "The following tokens belong to NotKeywordToken" + tiDBKeywordStart = "The following tokens belong to TiDBKeyword" +) + +const ( + sectionNone = iota + sectionReservedKeyword + sectionUnreservedKeyword + sectionTiDBKeyword +) + +const ( + fileStart = `// Copyright 2023 PingCAP, 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +package parser + +// WARNING: This file is generated by 'genkeyword' + +// KeywordsType defines the attributes of keywords +type KeywordsType struct { + Word string + Reserved bool + Section string +} + +// Keywords is used for all keywords in TiDB +var Keywords = []KeywordsType{ +` + fileEnd = `} +` +) + +var keywordRe *regexp.Regexp + +// parseLine extracts a keyword from a line of parser.y +// returns an empty string if there is no match. +// +// example data: +// +// add "ADD" +// +// Note that all keywords except `TiDB_CURRENT_TSO` are fully uppercase. +func parseLine(line string) string { + if keywordRe == nil { + keywordRe = regexp.MustCompile(`^\s+\w+\s+"(\w+)"$`) + } + m := keywordRe.FindStringSubmatch(line) + if len(m) != 2 { + return "" + } + return m[1] +} + +func main() { + parserData, err := os.ReadFile("parser.y") + if err != nil { + log.Fatalf("Failed to open parser.y: %s", err) + } + keywordsFile, err := os.OpenFile("keywords.go", os.O_CREATE|os.O_WRONLY, 0600) + if err != nil { + log.Fatalf("Failed to create keywords.go: %s", err) + } + err = keywordsFile.Truncate(0) + if err != nil { + log.Fatalf("Failed to create keywords.go: %s", err) + } + _, err = keywordsFile.WriteString(fileStart) + if err != nil { + log.Fatalf("Failed to write fileStart to keywords.go: %s", err) + } + + section := sectionNone + for _, line := range strings.Split(string(parserData), "\n") { + if line == "" { // Empty line indicates section end + section = sectionNone + } else if strings.Contains(line, reservedKeywordStart) { + section = sectionReservedKeyword + } else if strings.Contains(line, unreservedkeywordStart) { + section = sectionUnreservedKeyword + } else if strings.Contains(line, tiDBKeywordStart) { + section = sectionTiDBKeyword + } else if strings.Contains(line, notKeywordStart) { + section = sectionNone + } + + switch section { + case sectionReservedKeyword: + word := parseLine(line) + if len(word) > 0 { + fmt.Fprintf(keywordsFile, "\t{\"%s\", true, \"reserved\"},\n", word) + } + case sectionTiDBKeyword: + word := parseLine(line) + if len(word) > 0 { + fmt.Fprintf(keywordsFile, "\t{\"%s\", false, \"tidb\"},\n", word) + } + case sectionUnreservedKeyword: + word := parseLine(line) + if len(word) > 0 { + fmt.Fprintf(keywordsFile, "\t{\"%s\", false, \"unreserved\"},\n", word) + } + } + } + + _, err = keywordsFile.WriteString(fileEnd) + if err != nil { + log.Fatalf("Failed to write fileEnd to keywords.go: %s", err) + } +} diff --git a/pkg/parser/generate_keyword/genkeyword_test.go b/pkg/parser/generate_keyword/genkeyword_test.go new file mode 100644 index 0000000000000..2a7a7d5b24722 --- /dev/null +++ b/pkg/parser/generate_keyword/genkeyword_test.go @@ -0,0 +1,15 @@ +package main + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func TestParseLine(t *testing.T) { + add := parseLine(" add \"ADD\"") + require.Equal(t, add, "ADD") + + tso := parseLine(" tidbCurrentTSO \"TiDB_CURRENT_TSO\"") + require.Equal(t, tso, "TiDB_CURRENT_TSO") +} diff --git a/pkg/parser/hintparser.go b/pkg/parser/hintparser.go index b634df616ca17..16e468c764cdc 100644 --- a/pkg/parser/hintparser.go +++ b/pkg/parser/hintparser.go @@ -133,141 +133,141 @@ const ( hintUseToja = 57410 yyhintMaxDepth = 200 - yyhintTabOfs = -213 + yyhintTabOfs = -217 ) var ( yyhintXLAT = map[int]int{ - 41: 0, // ')' (157x) - 57379: 1, // hintAggToCop (142x) - 57401: 2, // hintBCJoin (142x) - 57355: 3, // hintBKA (142x) - 57357: 4, // hintBNL (142x) - 57415: 5, // hintForceIndex (142x) - 57381: 6, // hintHashAgg (142x) - 57359: 7, // hintHashJoin (142x) - 57360: 8, // hintHashJoinBuild (142x) - 57361: 9, // hintHashJoinProbe (142x) - 57384: 10, // hintIgnoreIndex (142x) - 57380: 11, // hintIgnorePlanCache (142x) - 57388: 12, // hintIndexHashJoin (142x) - 57385: 13, // hintIndexJoin (142x) - 57365: 14, // hintIndexMerge (142x) - 57392: 15, // hintIndexMergeJoin (142x) - 57387: 16, // hintInlHashJoin (142x) - 57390: 17, // hintInlJoin (142x) - 57391: 18, // hintInlMergeJoin (142x) - 57351: 19, // hintJoinFixedOrder (142x) - 57352: 20, // hintJoinOrder (142x) - 57353: 21, // hintJoinPrefix (142x) - 57354: 22, // hintJoinSuffix (142x) - 57417: 23, // hintLeading (142x) - 57414: 24, // hintLimitToCop (142x) - 57375: 25, // hintMaxExecutionTime (142x) - 57394: 26, // hintMemoryQuota (142x) - 57363: 27, // hintMerge (142x) - 57382: 28, // hintMpp1PhaseAgg (142x) - 57383: 29, // hintMpp2PhaseAgg (142x) - 57367: 30, // hintMRR (142x) - 57356: 31, // hintNoBKA (142x) - 57358: 32, // hintNoBNL (142x) - 57419: 33, // hintNoDecorrelate (142x) - 57362: 34, // hintNoHashJoin (142x) - 57369: 35, // hintNoICP (142x) - 57389: 36, // hintNoIndexHashJoin (142x) - 57386: 37, // hintNoIndexJoin (142x) - 57366: 38, // hintNoIndexMerge (142x) - 57393: 39, // hintNoIndexMergeJoin (142x) - 57364: 40, // hintNoMerge (142x) - 57368: 41, // hintNoMRR (142x) - 57408: 42, // hintNoOrderIndex (142x) - 57370: 43, // hintNoRangeOptimization (142x) - 57374: 44, // hintNoSemijoin (142x) - 57372: 45, // hintNoSkipScan (142x) - 57400: 46, // hintNoSMJoin (142x) - 57395: 47, // hintNoSwapJoinInputs (142x) - 57413: 48, // hintNthPlan (142x) - 57407: 49, // hintOrderIndex (142x) - 57378: 50, // hintQBName (142x) - 57396: 51, // hintQueryType (142x) - 57397: 52, // hintReadConsistentReplica (142x) - 57398: 53, // hintReadFromStorage (142x) - 57377: 54, // hintResourceGroup (142x) - 57373: 55, // hintSemijoin (142x) - 57418: 56, // hintSemiJoinRewrite (142x) - 57376: 57, // hintSetVar (142x) - 57402: 58, // hintShuffleJoin (142x) - 57371: 59, // hintSkipScan (142x) - 57399: 60, // hintSMJoin (142x) - 57416: 61, // hintStraightJoin (142x) - 57403: 62, // hintStreamAgg (142x) - 57404: 63, // hintSwapJoinInputs (142x) - 57411: 64, // hintTimeRange (142x) - 57412: 65, // hintUseCascades (142x) - 57406: 66, // hintUseIndex (142x) - 57405: 67, // hintUseIndexMerge (142x) - 57409: 68, // hintUsePlanCache (142x) - 57410: 69, // hintUseToja (142x) - 44: 70, // ',' (139x) - 57429: 71, // hintDupsWeedOut (119x) - 57430: 72, // hintFirstMatch (119x) - 57431: 73, // hintLooseScan (119x) - 57432: 74, // hintMaterialization (119x) - 57424: 75, // hintTiFlash (119x) - 57423: 76, // hintTiKV (119x) - 57425: 77, // hintFalse (118x) - 57420: 78, // hintOLAP (118x) - 57421: 79, // hintOLTP (118x) - 57426: 80, // hintTrue (118x) - 57428: 81, // hintGB (117x) - 57427: 82, // hintMB (117x) - 57347: 83, // hintIdentifier (116x) - 57349: 84, // hintSingleAtIdentifier (102x) - 93: 85, // ']' (93x) - 46: 86, // '.' (92x) - 57422: 87, // hintPartition (87x) - 61: 88, // '=' (83x) - 40: 89, // '(' (78x) - 57344: 90, // $end (25x) - 57453: 91, // QueryBlockOpt (20x) - 57445: 92, // Identifier (15x) - 57346: 93, // hintIntLit (10x) - 57350: 94, // hintStringLit (5x) - 57435: 95, // CommaOpt (4x) + 41: 0, // ')' (162x) + 57379: 1, // hintAggToCop (151x) + 57401: 2, // hintBCJoin (151x) + 57355: 3, // hintBKA (151x) + 57357: 4, // hintBNL (151x) + 57415: 5, // hintForceIndex (151x) + 57381: 6, // hintHashAgg (151x) + 57359: 7, // hintHashJoin (151x) + 57360: 8, // hintHashJoinBuild (151x) + 57361: 9, // hintHashJoinProbe (151x) + 57347: 10, // hintIdentifier (151x) + 57384: 11, // hintIgnoreIndex (151x) + 57380: 12, // hintIgnorePlanCache (151x) + 57388: 13, // hintIndexHashJoin (151x) + 57385: 14, // hintIndexJoin (151x) + 57365: 15, // hintIndexMerge (151x) + 57392: 16, // hintIndexMergeJoin (151x) + 57387: 17, // hintInlHashJoin (151x) + 57390: 18, // hintInlJoin (151x) + 57391: 19, // hintInlMergeJoin (151x) + 57351: 20, // hintJoinFixedOrder (151x) + 57352: 21, // hintJoinOrder (151x) + 57353: 22, // hintJoinPrefix (151x) + 57354: 23, // hintJoinSuffix (151x) + 57417: 24, // hintLeading (151x) + 57414: 25, // hintLimitToCop (151x) + 57375: 26, // hintMaxExecutionTime (151x) + 57394: 27, // hintMemoryQuota (151x) + 57363: 28, // hintMerge (151x) + 57382: 29, // hintMpp1PhaseAgg (151x) + 57383: 30, // hintMpp2PhaseAgg (151x) + 57367: 31, // hintMRR (151x) + 57356: 32, // hintNoBKA (151x) + 57358: 33, // hintNoBNL (151x) + 57419: 34, // hintNoDecorrelate (151x) + 57362: 35, // hintNoHashJoin (151x) + 57369: 36, // hintNoICP (151x) + 57389: 37, // hintNoIndexHashJoin (151x) + 57386: 38, // hintNoIndexJoin (151x) + 57366: 39, // hintNoIndexMerge (151x) + 57393: 40, // hintNoIndexMergeJoin (151x) + 57364: 41, // hintNoMerge (151x) + 57368: 42, // hintNoMRR (151x) + 57408: 43, // hintNoOrderIndex (151x) + 57370: 44, // hintNoRangeOptimization (151x) + 57374: 45, // hintNoSemijoin (151x) + 57372: 46, // hintNoSkipScan (151x) + 57400: 47, // hintNoSMJoin (151x) + 57395: 48, // hintNoSwapJoinInputs (151x) + 57413: 49, // hintNthPlan (151x) + 57407: 50, // hintOrderIndex (151x) + 57378: 51, // hintQBName (151x) + 57396: 52, // hintQueryType (151x) + 57397: 53, // hintReadConsistentReplica (151x) + 57398: 54, // hintReadFromStorage (151x) + 57377: 55, // hintResourceGroup (151x) + 57373: 56, // hintSemijoin (151x) + 57418: 57, // hintSemiJoinRewrite (151x) + 57376: 58, // hintSetVar (151x) + 57402: 59, // hintShuffleJoin (151x) + 57371: 60, // hintSkipScan (151x) + 57399: 61, // hintSMJoin (151x) + 57416: 62, // hintStraightJoin (151x) + 57403: 63, // hintStreamAgg (151x) + 57404: 64, // hintSwapJoinInputs (151x) + 57411: 65, // hintTimeRange (151x) + 57412: 66, // hintUseCascades (151x) + 57406: 67, // hintUseIndex (151x) + 57405: 68, // hintUseIndexMerge (151x) + 57409: 69, // hintUsePlanCache (151x) + 57410: 70, // hintUseToja (151x) + 44: 71, // ',' (145x) + 57429: 72, // hintDupsWeedOut (124x) + 57430: 73, // hintFirstMatch (124x) + 57431: 74, // hintLooseScan (124x) + 57432: 75, // hintMaterialization (124x) + 57424: 76, // hintTiFlash (124x) + 57423: 77, // hintTiKV (124x) + 57425: 78, // hintFalse (123x) + 57420: 79, // hintOLAP (123x) + 57421: 80, // hintOLTP (123x) + 57426: 81, // hintTrue (123x) + 57428: 82, // hintGB (122x) + 57427: 83, // hintMB (122x) + 57349: 84, // hintSingleAtIdentifier (103x) + 57346: 85, // hintIntLit (100x) + 93: 86, // ']' (93x) + 46: 87, // '.' (92x) + 57422: 88, // hintPartition (87x) + 61: 89, // '=' (84x) + 40: 90, // '(' (79x) + 57344: 91, // $end (29x) + 57453: 92, // QueryBlockOpt (21x) + 57445: 93, // Identifier (18x) + 57350: 94, // hintStringLit (6x) + 57435: 95, // CommaOpt (5x) 57441: 96, // HintTable (4x) 57442: 97, // HintTableList (4x) 91: 98, // '[' (3x) - 57434: 99, // BooleanHintName (2x) - 57436: 100, // HintIndexList (2x) - 57438: 101, // HintStorageType (2x) - 57439: 102, // HintStorageTypeAndTable (2x) - 57443: 103, // HintTableListOpt (2x) - 57448: 104, // JoinOrderOptimizerHintName (2x) - 57449: 105, // NullaryHintName (2x) - 57452: 106, // PartitionListOpt (2x) - 57455: 107, // StorageOptimizerHintOpt (2x) - 57456: 108, // SubqueryOptimizerHintName (2x) - 57459: 109, // SubqueryStrategy (2x) - 57460: 110, // SupportedIndexLevelOptimizerHintName (2x) - 57461: 111, // SupportedTableLevelOptimizerHintName (2x) - 57462: 112, // TableOptimizerHintOpt (2x) - 57464: 113, // UnsupportedIndexLevelOptimizerHintName (2x) - 57465: 114, // UnsupportedTableLevelOptimizerHintName (2x) - 57467: 115, // ViewName (2x) - 43: 116, // '+' (1x) - 45: 117, // '-' (1x) - 57437: 118, // HintQueryType (1x) - 57440: 119, // HintStorageTypeAndTableList (1x) - 57444: 120, // HintTrueOrFalse (1x) - 57446: 121, // IndexNameList (1x) - 57447: 122, // IndexNameListOpt (1x) - 57450: 123, // OptimizerHintList (1x) - 57451: 124, // PartitionList (1x) - 57454: 125, // Start (1x) - 57457: 126, // SubqueryStrategies (1x) - 57458: 127, // SubqueryStrategiesOpt (1x) - 57463: 128, // UnitOfBytes (1x) - 57466: 129, // Value (1x) + 43: 99, // '+' (2x) + 45: 100, // '-' (2x) + 57434: 101, // BooleanHintName (2x) + 57436: 102, // HintIndexList (2x) + 57438: 103, // HintStorageType (2x) + 57439: 104, // HintStorageTypeAndTable (2x) + 57443: 105, // HintTableListOpt (2x) + 57448: 106, // JoinOrderOptimizerHintName (2x) + 57449: 107, // NullaryHintName (2x) + 57451: 108, // PartitionList (2x) + 57452: 109, // PartitionListOpt (2x) + 57455: 110, // StorageOptimizerHintOpt (2x) + 57456: 111, // SubqueryOptimizerHintName (2x) + 57459: 112, // SubqueryStrategy (2x) + 57460: 113, // SupportedIndexLevelOptimizerHintName (2x) + 57461: 114, // SupportedTableLevelOptimizerHintName (2x) + 57462: 115, // TableOptimizerHintOpt (2x) + 57464: 116, // UnsupportedIndexLevelOptimizerHintName (2x) + 57465: 117, // UnsupportedTableLevelOptimizerHintName (2x) + 57466: 118, // Value (2x) + 57467: 119, // ViewName (2x) + 57437: 120, // HintQueryType (1x) + 57440: 121, // HintStorageTypeAndTableList (1x) + 57444: 122, // HintTrueOrFalse (1x) + 57446: 123, // IndexNameList (1x) + 57447: 124, // IndexNameListOpt (1x) + 57450: 125, // OptimizerHintList (1x) + 57454: 126, // Start (1x) + 57457: 127, // SubqueryStrategies (1x) + 57458: 128, // SubqueryStrategiesOpt (1x) + 57463: 129, // UnitOfBytes (1x) 57468: 130, // ViewNameList (1x) 57433: 131, // $default (0x) 57345: 132, // error (0x) @@ -285,6 +285,7 @@ var ( "hintHashJoin", "hintHashJoinBuild", "hintHashJoinProbe", + "hintIdentifier", "hintIgnoreIndex", "hintIgnorePlanCache", "hintIndexHashJoin", @@ -358,8 +359,8 @@ var ( "hintTrue", "hintGB", "hintMB", - "hintIdentifier", "hintSingleAtIdentifier", + "hintIntLit", "']'", "'.'", "hintPartition", @@ -368,12 +369,13 @@ var ( "$end", "QueryBlockOpt", "Identifier", - "hintIntLit", "hintStringLit", "CommaOpt", "HintTable", "HintTableList", "'['", + "'+'", + "'-'", "BooleanHintName", "HintIndexList", "HintStorageType", @@ -381,6 +383,7 @@ var ( "HintTableListOpt", "JoinOrderOptimizerHintName", "NullaryHintName", + "PartitionList", "PartitionListOpt", "StorageOptimizerHintOpt", "SubqueryOptimizerHintName", @@ -390,21 +393,18 @@ var ( "TableOptimizerHintOpt", "UnsupportedIndexLevelOptimizerHintName", "UnsupportedTableLevelOptimizerHintName", + "Value", "ViewName", - "'+'", - "'-'", "HintQueryType", "HintStorageTypeAndTableList", "HintTrueOrFalse", "IndexNameList", "IndexNameListOpt", "OptimizerHintList", - "PartitionList", "Start", "SubqueryStrategies", "SubqueryStrategiesOpt", "UnitOfBytes", - "Value", "ViewNameList", "$default", "error", @@ -413,586 +413,607 @@ var ( yyhintReductions = []struct{ xsym, components int }{ {0, 1}, + {126, 1}, {125, 1}, - {123, 1}, - {123, 3}, - {123, 1}, - {123, 3}, - {112, 4}, - {112, 4}, - {112, 4}, - {112, 4}, - {112, 4}, - {112, 4}, - {112, 5}, - {112, 5}, - {112, 5}, - {112, 6}, - {112, 4}, - {112, 4}, - {112, 6}, - {112, 6}, - {112, 6}, - {112, 5}, - {112, 4}, - {112, 5}, - {107, 5}, - {119, 1}, - {119, 3}, - {102, 4}, - {91, 0}, - {91, 1}, + {125, 3}, + {125, 1}, + {125, 3}, + {115, 4}, + {115, 4}, + {115, 4}, + {115, 4}, + {115, 4}, + {115, 4}, + {115, 5}, + {115, 5}, + {115, 5}, + {115, 6}, + {115, 4}, + {115, 4}, + {115, 6}, + {115, 6}, + {115, 6}, + {115, 5}, + {115, 4}, + {115, 5}, + {115, 5}, + {115, 4}, + {115, 6}, + {115, 6}, + {110, 5}, + {121, 1}, + {121, 3}, + {104, 4}, + {92, 0}, + {92, 1}, {95, 0}, {95, 1}, - {106, 0}, - {106, 4}, - {124, 1}, - {124, 3}, - {103, 1}, - {103, 1}, + {109, 0}, + {109, 4}, + {108, 1}, + {108, 3}, + {105, 1}, + {105, 1}, {97, 2}, {97, 3}, {96, 3}, {96, 5}, {130, 3}, {130, 1}, - {115, 2}, - {115, 1}, - {100, 4}, - {122, 0}, - {122, 1}, - {121, 1}, - {121, 3}, - {127, 0}, + {119, 2}, + {119, 1}, + {102, 4}, + {124, 0}, + {124, 1}, + {123, 1}, + {123, 3}, + {128, 0}, + {128, 1}, {127, 1}, - {126, 1}, - {126, 3}, - {129, 1}, + {127, 3}, + {118, 1}, + {118, 1}, + {118, 1}, + {118, 2}, + {118, 2}, {129, 1}, {129, 1}, - {129, 2}, - {129, 2}, - {128, 1}, - {128, 1}, - {120, 1}, - {120, 1}, - {104, 1}, - {104, 1}, - {104, 1}, + {122, 1}, + {122, 1}, + {106, 1}, + {106, 1}, + {106, 1}, + {117, 1}, + {117, 1}, + {117, 1}, + {117, 1}, + {117, 1}, {114, 1}, {114, 1}, {114, 1}, {114, 1}, {114, 1}, - {111, 1}, - {111, 1}, - {111, 1}, - {111, 1}, - {111, 1}, - {111, 1}, - {111, 1}, - {111, 1}, - {111, 1}, - {111, 1}, - {111, 1}, - {111, 1}, - {111, 1}, - {111, 1}, - {111, 1}, - {111, 1}, - {111, 1}, - {111, 1}, - {111, 1}, - {111, 1}, - {111, 1}, - {113, 1}, + {114, 1}, + {114, 1}, + {114, 1}, + {114, 1}, + {114, 1}, + {114, 1}, + {114, 1}, + {114, 1}, + {114, 1}, + {114, 1}, + {114, 1}, + {114, 1}, + {114, 1}, + {114, 1}, + {114, 1}, + {114, 1}, + {116, 1}, + {116, 1}, + {116, 1}, + {116, 1}, + {116, 1}, + {116, 1}, + {116, 1}, {113, 1}, {113, 1}, {113, 1}, {113, 1}, {113, 1}, {113, 1}, - {110, 1}, - {110, 1}, - {110, 1}, - {110, 1}, - {110, 1}, - {110, 1}, - {108, 1}, - {108, 1}, - {109, 1}, - {109, 1}, - {109, 1}, - {109, 1}, - {99, 1}, - {99, 1}, - {105, 1}, - {105, 1}, - {105, 1}, - {105, 1}, - {105, 1}, - {105, 1}, - {105, 1}, - {105, 1}, - {105, 1}, - {105, 1}, - {105, 1}, - {105, 1}, - {105, 1}, - {118, 1}, - {118, 1}, + {111, 1}, + {111, 1}, + {112, 1}, + {112, 1}, + {112, 1}, + {112, 1}, {101, 1}, {101, 1}, - {92, 1}, - {92, 1}, - {92, 1}, - {92, 1}, - {92, 1}, - {92, 1}, - {92, 1}, - {92, 1}, - {92, 1}, - {92, 1}, - {92, 1}, - {92, 1}, - {92, 1}, - {92, 1}, - {92, 1}, - {92, 1}, - {92, 1}, - {92, 1}, - {92, 1}, - {92, 1}, - {92, 1}, - {92, 1}, - {92, 1}, - {92, 1}, - {92, 1}, - {92, 1}, - {92, 1}, - {92, 1}, - {92, 1}, - {92, 1}, - {92, 1}, - {92, 1}, - {92, 1}, - {92, 1}, - {92, 1}, - {92, 1}, - {92, 1}, - {92, 1}, - {92, 1}, - {92, 1}, - {92, 1}, - {92, 1}, - {92, 1}, - {92, 1}, - {92, 1}, - {92, 1}, - {92, 1}, - {92, 1}, - {92, 1}, - {92, 1}, - {92, 1}, - {92, 1}, - {92, 1}, - {92, 1}, - {92, 1}, - {92, 1}, - {92, 1}, - {92, 1}, - {92, 1}, - {92, 1}, - {92, 1}, - {92, 1}, - {92, 1}, - {92, 1}, - {92, 1}, - {92, 1}, - {92, 1}, - {92, 1}, - {92, 1}, - {92, 1}, - {92, 1}, - {92, 1}, - {92, 1}, - {92, 1}, - {92, 1}, - {92, 1}, - {92, 1}, - {92, 1}, - {92, 1}, - {92, 1}, - {92, 1}, - {92, 1}, + {107, 1}, + {107, 1}, + {107, 1}, + {107, 1}, + {107, 1}, + {107, 1}, + {107, 1}, + {107, 1}, + {107, 1}, + {107, 1}, + {107, 1}, + {107, 1}, + {107, 1}, + {120, 1}, + {120, 1}, + {103, 1}, + {103, 1}, + {93, 1}, + {93, 1}, + {93, 1}, + {93, 1}, + {93, 1}, + {93, 1}, + {93, 1}, + {93, 1}, + {93, 1}, + {93, 1}, + {93, 1}, + {93, 1}, + {93, 1}, + {93, 1}, + {93, 1}, + {93, 1}, + {93, 1}, + {93, 1}, + {93, 1}, + {93, 1}, + {93, 1}, + {93, 1}, + {93, 1}, + {93, 1}, + {93, 1}, + {93, 1}, + {93, 1}, + {93, 1}, + {93, 1}, + {93, 1}, + {93, 1}, + {93, 1}, + {93, 1}, + {93, 1}, + {93, 1}, + {93, 1}, + {93, 1}, + {93, 1}, + {93, 1}, + {93, 1}, + {93, 1}, + {93, 1}, + {93, 1}, + {93, 1}, + {93, 1}, + {93, 1}, + {93, 1}, + {93, 1}, + {93, 1}, + {93, 1}, + {93, 1}, + {93, 1}, + {93, 1}, + {93, 1}, + {93, 1}, + {93, 1}, + {93, 1}, + {93, 1}, + {93, 1}, + {93, 1}, + {93, 1}, + {93, 1}, + {93, 1}, + {93, 1}, + {93, 1}, + {93, 1}, + {93, 1}, + {93, 1}, + {93, 1}, + {93, 1}, + {93, 1}, + {93, 1}, + {93, 1}, + {93, 1}, + {93, 1}, + {93, 1}, + {93, 1}, + {93, 1}, + {93, 1}, + {93, 1}, + {93, 1}, + {93, 1}, } yyhintXErrors = map[yyhintXError]string{} - yyhintParseTab = [302][]uint16{ + yyhintParseTab = [316][]uint16{ // 0 - {1: 287, 246, 239, 241, 275, 283, 260, 262, 263, 273, 291, 253, 249, 265, 258, 252, 248, 257, 218, 236, 237, 238, 264, 288, 225, 230, 251, 284, 285, 266, 240, 242, 294, 261, 268, 254, 250, 289, 259, 243, 267, 277, 269, 279, 271, 245, 256, 226, 276, 229, 234, 290, 235, 228, 278, 293, 227, 247, 270, 244, 292, 286, 255, 231, 281, 272, 274, 282, 280, 99: 232, 104: 219, 233, 107: 217, 224, 110: 223, 221, 216, 222, 220, 123: 215, 125: 214}, - {90: 213}, - {1: 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 399, 90: 212, 95: 512}, - {1: 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 90: 211}, - {1: 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 90: 209}, + {1: 292, 251, 244, 246, 280, 288, 265, 267, 268, 239, 278, 296, 258, 254, 270, 263, 257, 253, 262, 222, 241, 242, 243, 269, 293, 229, 234, 256, 289, 290, 271, 245, 247, 299, 266, 273, 259, 255, 294, 264, 248, 272, 282, 274, 284, 276, 250, 261, 230, 281, 233, 238, 295, 240, 232, 283, 298, 231, 252, 275, 249, 297, 291, 260, 235, 286, 277, 279, 287, 285, 101: 236, 106: 223, 237, 110: 221, 228, 113: 227, 225, 220, 226, 224, 125: 219, 218}, + {91: 217}, + {1: 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 404, 91: 216, 95: 530}, + {1: 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 91: 215}, + {1: 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 91: 213}, // 5 - {89: 509}, - {89: 506}, - {89: 503}, - {89: 498}, - {89: 495}, + {90: 527}, + {90: 524}, + {90: 521}, + {90: 516}, + {90: 513}, // 10 - {89: 484}, - {89: 472}, - {89: 468}, - {89: 464}, - {89: 452}, + {90: 502}, + {90: 490}, + {90: 486}, + {90: 482}, + {90: 477}, // 15 - {89: 449}, - {89: 437}, - {89: 430}, - {89: 425}, - {89: 419}, + {90: 474}, + {90: 462}, + {90: 455}, + {90: 450}, + {90: 444}, // 20 - {89: 416}, - {89: 410}, - {89: 295}, - {89: 149}, - {89: 148}, + {90: 441}, + {90: 435}, + {90: 415}, + {90: 300}, + {90: 149}, // 25 - {89: 147}, - {89: 146}, - {89: 145}, - {89: 144}, - {89: 143}, + {90: 148}, + {90: 147}, + {90: 146}, + {90: 145}, + {90: 144}, // 30 - {89: 142}, - {89: 141}, - {89: 140}, - {89: 139}, - {89: 138}, + {90: 143}, + {90: 142}, + {90: 141}, + {90: 140}, + {90: 139}, // 35 - {89: 137}, - {89: 136}, - {89: 135}, - {89: 134}, - {89: 133}, + {90: 138}, + {90: 137}, + {90: 136}, + {90: 135}, + {90: 134}, // 40 - {89: 132}, - {89: 131}, - {89: 130}, - {89: 129}, - {89: 128}, + {90: 133}, + {90: 132}, + {90: 131}, + {90: 130}, + {90: 129}, // 45 - {89: 127}, - {89: 126}, - {89: 125}, - {89: 124}, - {89: 123}, + {90: 128}, + {90: 127}, + {90: 126}, + {90: 125}, + {90: 124}, // 50 - {89: 122}, - {89: 121}, - {89: 120}, - {89: 119}, - {89: 118}, + {90: 123}, + {90: 122}, + {90: 121}, + {90: 120}, + {90: 119}, // 55 - {89: 117}, - {89: 116}, - {89: 115}, - {89: 114}, - {89: 113}, + {90: 118}, + {90: 117}, + {90: 116}, + {90: 115}, + {90: 114}, // 60 - {89: 112}, - {89: 111}, - {89: 110}, - {89: 109}, - {89: 108}, + {90: 113}, + {90: 112}, + {90: 111}, + {90: 110}, + {90: 109}, // 65 - {89: 107}, - {89: 106}, - {89: 101}, - {89: 100}, - {89: 99}, + {90: 108}, + {90: 107}, + {90: 106}, + {90: 101}, + {90: 100}, // 70 - {89: 98}, - {89: 97}, - {89: 96}, - {89: 95}, - {89: 94}, + {90: 99}, + {90: 98}, + {90: 97}, + {90: 96}, + {90: 95}, // 75 - {89: 93}, - {89: 92}, - {89: 91}, - {89: 90}, - {89: 89}, + {90: 94}, + {90: 93}, + {90: 92}, + {90: 91}, + {90: 90}, // 80 - {89: 88}, - {89: 87}, - {75: 185, 185, 84: 297, 91: 296}, - {75: 302, 301, 101: 300, 299, 119: 298}, - {184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 85: 184, 184, 184, 93: 184}, + {90: 89}, + {90: 88}, + {90: 87}, + {76: 185, 185, 84: 302, 92: 301}, + {76: 307, 306, 103: 305, 304, 121: 303}, // 85 - {407, 70: 408}, - {188, 70: 188}, - {98: 303}, + {184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 85: 184, 184, 184, 184}, + {412, 71: 413}, + {188, 71: 188}, + {98: 308}, {98: 84}, - {98: 83}, // 90 - {1: 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 71: 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 297, 91: 305, 97: 304}, - {70: 405, 85: 404}, - {1: 337, 360, 313, 315, 373, 340, 317, 318, 319, 343, 339, 345, 348, 323, 351, 344, 347, 350, 309, 310, 311, 312, 375, 338, 333, 353, 321, 341, 342, 325, 314, 316, 377, 320, 327, 346, 349, 324, 352, 322, 326, 367, 328, 332, 330, 359, 354, 372, 366, 336, 355, 356, 357, 335, 331, 376, 334, 361, 329, 358, 374, 362, 363, 370, 371, 365, 364, 368, 369, 71: 386, 387, 388, 389, 381, 380, 382, 378, 379, 383, 385, 384, 308, 92: 307, 96: 306}, - {175, 70: 175, 85: 175}, - {185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 297, 185, 391, 185, 91: 390}, + {98: 83}, + {1: 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 72: 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 302, 92: 310, 97: 309}, + {71: 410, 86: 409}, + {1: 342, 365, 318, 320, 378, 345, 322, 323, 324, 313, 348, 344, 350, 353, 328, 356, 349, 352, 355, 314, 315, 316, 317, 380, 343, 338, 358, 326, 346, 347, 330, 319, 321, 382, 325, 332, 351, 354, 329, 357, 327, 331, 372, 333, 337, 335, 364, 359, 377, 371, 341, 360, 361, 362, 340, 336, 381, 339, 366, 334, 363, 379, 367, 368, 375, 376, 370, 369, 373, 374, 72: 391, 392, 393, 394, 386, 385, 387, 383, 384, 388, 390, 389, 93: 312, 96: 311}, + {175, 71: 175, 86: 175}, // 95 - {82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82}, - {81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81}, - {80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80}, - {79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79}, - {78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78}, + {185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 302, 86: 185, 396, 185, 92: 395}, + {82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82}, + {81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81}, + {80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80}, + {79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79}, // 100 - {77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77}, - {76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76}, - {75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75}, - {74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74}, - {73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73}, + {78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78}, + {77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77}, + {76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76}, + {75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75}, + {74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74}, // 105 - {72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72}, - {71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71}, - {70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70}, - {69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69}, - {68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68}, + {73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73}, + {72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72}, + {71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71}, + {70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70}, + {69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69}, // 110 - {67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67}, - {66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66}, - {65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65}, - {64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64}, - {63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63}, + {68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68}, + {67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67}, + {66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66}, + {65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65}, + {64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64}, // 115 - {62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62}, - {61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61}, - {60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60}, - {59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59}, - {58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58}, + {63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63}, + {62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62}, + {61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61}, + {60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60}, + {59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59}, // 120 - {57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57}, - {56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56}, - {55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55}, - {54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54}, - {53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53}, + {58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58}, + {57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57}, + {56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56}, + {55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55}, + {54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54}, // 125 - {52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52}, - {51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51}, - {50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50}, - {49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49}, - {48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48}, + {53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53}, + {52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52}, + {51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51}, + {50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50}, + {49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49}, // 130 - {47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47}, - {46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46}, - {45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45}, - {44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44}, - {43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43}, + {48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48}, + {47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47}, + {46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46}, + {45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45}, + {44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44}, // 135 - {42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42}, - {41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41}, - {40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40}, - {39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39}, - {38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38}, + {43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43}, + {42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42}, + {41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41}, + {40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40}, + {39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39}, // 140 - {37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37}, - {36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36}, - {35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35}, - {34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34}, - {33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33}, + {38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38}, + {37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37}, + {36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36}, + {35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35}, + {34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34}, // 145 - {32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32}, - {31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31}, - {30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30}, - {29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29}, - {28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28}, + {33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33}, + {32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32}, + {31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31}, + {30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30}, + {29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29}, // 150 - {27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27}, - {26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26}, - {25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25}, - {24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24}, - {23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23}, + {28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28}, + {27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27}, + {26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26}, + {25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25}, + {24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24}, // 155 - {22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22}, - {21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21}, - {20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20}, - {19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19}, - {18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18}, + {23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23}, + {22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22}, + {21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21}, + {20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20}, + {19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19}, // 160 - {17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17}, - {16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16}, - {15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15}, - {14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14}, - {13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13}, + {18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18}, + {17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17}, + {16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16}, + {15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15}, + {14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14}, // 165 - {12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12}, - {11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}, - {10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10}, - {9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9}, - {8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8}, + {13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13}, + {12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12}, + {11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}, + {10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10}, + {9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9}, // 170 - {7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7}, - {6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6}, - {5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5}, - {4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4}, - {3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3}, + {8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8}, + {7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7}, + {6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6}, + {5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5}, + {4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4}, // 175 - {2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2}, - {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, 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}, - {181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 85: 181, 87: 394, 106: 403}, - {1: 337, 360, 313, 315, 373, 340, 317, 318, 319, 343, 339, 345, 348, 323, 351, 344, 347, 350, 309, 310, 311, 312, 375, 338, 333, 353, 321, 341, 342, 325, 314, 316, 377, 320, 327, 346, 349, 324, 352, 322, 326, 367, 328, 332, 330, 359, 354, 372, 366, 336, 355, 356, 357, 335, 331, 376, 334, 361, 329, 358, 374, 362, 363, 370, 371, 365, 364, 368, 369, 71: 386, 387, 388, 389, 381, 380, 382, 378, 379, 383, 385, 384, 308, 92: 392}, - {185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 297, 185, 87: 185, 91: 393}, + {3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3}, + {2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2}, + {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, 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}, + {181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 86: 181, 88: 399, 109: 408}, + {1: 342, 365, 318, 320, 378, 345, 322, 323, 324, 313, 348, 344, 350, 353, 328, 356, 349, 352, 355, 314, 315, 316, 317, 380, 343, 338, 358, 326, 346, 347, 330, 319, 321, 382, 325, 332, 351, 354, 329, 357, 327, 331, 372, 333, 337, 335, 364, 359, 377, 371, 341, 360, 361, 362, 340, 336, 381, 339, 366, 334, 363, 379, 367, 368, 375, 376, 370, 369, 373, 374, 72: 391, 392, 393, 394, 386, 385, 387, 383, 384, 388, 390, 389, 93: 397}, // 180 - {181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 85: 181, 87: 394, 106: 395}, - {89: 396}, - {172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 85: 172}, - {1: 337, 360, 313, 315, 373, 340, 317, 318, 319, 343, 339, 345, 348, 323, 351, 344, 347, 350, 309, 310, 311, 312, 375, 338, 333, 353, 321, 341, 342, 325, 314, 316, 377, 320, 327, 346, 349, 324, 352, 322, 326, 367, 328, 332, 330, 359, 354, 372, 366, 336, 355, 356, 357, 335, 331, 376, 334, 361, 329, 358, 374, 362, 363, 370, 371, 365, 364, 368, 369, 71: 386, 387, 388, 389, 381, 380, 382, 378, 379, 383, 385, 384, 308, 92: 398, 124: 397}, - {400, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 399, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 95: 401}, + {185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 302, 86: 185, 88: 185, 92: 398}, + {181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 86: 181, 88: 399, 109: 400}, + {90: 401}, + {172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 86: 172}, + {1: 342, 365, 318, 320, 378, 345, 322, 323, 324, 313, 348, 344, 350, 353, 328, 356, 349, 352, 355, 314, 315, 316, 317, 380, 343, 338, 358, 326, 346, 347, 330, 319, 321, 382, 325, 332, 351, 354, 329, 357, 327, 331, 372, 333, 337, 335, 364, 359, 377, 371, 341, 360, 361, 362, 340, 336, 381, 339, 366, 334, 363, 379, 367, 368, 375, 376, 370, 369, 373, 374, 72: 391, 392, 393, 394, 386, 385, 387, 383, 384, 388, 390, 389, 93: 403, 108: 402}, // 185 + {405, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 404, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 95: 406}, {179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179}, - {182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 71: 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 94: 182}, - {180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 85: 180}, - {1: 337, 360, 313, 315, 373, 340, 317, 318, 319, 343, 339, 345, 348, 323, 351, 344, 347, 350, 309, 310, 311, 312, 375, 338, 333, 353, 321, 341, 342, 325, 314, 316, 377, 320, 327, 346, 349, 324, 352, 322, 326, 367, 328, 332, 330, 359, 354, 372, 366, 336, 355, 356, 357, 335, 331, 376, 334, 361, 329, 358, 374, 362, 363, 370, 371, 365, 364, 368, 369, 71: 386, 387, 388, 389, 381, 380, 382, 378, 379, 383, 385, 384, 308, 92: 402}, - {178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178}, + {182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 72: 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 85: 182, 94: 182}, + {180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 86: 180}, + {1: 342, 365, 318, 320, 378, 345, 322, 323, 324, 313, 348, 344, 350, 353, 328, 356, 349, 352, 355, 314, 315, 316, 317, 380, 343, 338, 358, 326, 346, 347, 330, 319, 321, 382, 325, 332, 351, 354, 329, 357, 327, 331, 372, 333, 337, 335, 364, 359, 377, 371, 341, 360, 361, 362, 340, 336, 381, 339, 366, 334, 363, 379, 367, 368, 375, 376, 370, 369, 373, 374, 72: 391, 392, 393, 394, 386, 385, 387, 383, 384, 388, 390, 389, 93: 407}, // 190 - {173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 85: 173}, - {186, 70: 186}, - {1: 337, 360, 313, 315, 373, 340, 317, 318, 319, 343, 339, 345, 348, 323, 351, 344, 347, 350, 309, 310, 311, 312, 375, 338, 333, 353, 321, 341, 342, 325, 314, 316, 377, 320, 327, 346, 349, 324, 352, 322, 326, 367, 328, 332, 330, 359, 354, 372, 366, 336, 355, 356, 357, 335, 331, 376, 334, 361, 329, 358, 374, 362, 363, 370, 371, 365, 364, 368, 369, 71: 386, 387, 388, 389, 381, 380, 382, 378, 379, 383, 385, 384, 308, 92: 307, 96: 406}, - {174, 70: 174, 85: 174}, - {1: 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 90: 189}, + {178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 85: 178}, + {173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 86: 173}, + {186, 71: 186}, + {1: 342, 365, 318, 320, 378, 345, 322, 323, 324, 313, 348, 344, 350, 353, 328, 356, 349, 352, 355, 314, 315, 316, 317, 380, 343, 338, 358, 326, 346, 347, 330, 319, 321, 382, 325, 332, 351, 354, 329, 357, 327, 331, 372, 333, 337, 335, 364, 359, 377, 371, 341, 360, 361, 362, 340, 336, 381, 339, 366, 334, 363, 379, 367, 368, 375, 376, 370, 369, 373, 374, 72: 391, 392, 393, 394, 386, 385, 387, 383, 384, 388, 390, 389, 93: 312, 96: 411}, + {174, 71: 174, 86: 174}, // 195 - {75: 302, 301, 101: 300, 409}, - {187, 70: 187}, - {78: 185, 185, 84: 297, 91: 411}, - {78: 413, 414, 118: 412}, - {415}, + {1: 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 91: 189}, + {76: 307, 306, 103: 305, 414}, + {187, 71: 187}, + {1: 342, 365, 318, 320, 378, 345, 322, 323, 324, 313, 348, 344, 350, 353, 328, 356, 349, 352, 355, 314, 315, 316, 317, 380, 343, 338, 358, 326, 346, 347, 330, 319, 321, 382, 325, 332, 351, 354, 329, 357, 327, 331, 372, 333, 337, 335, 364, 359, 377, 371, 341, 360, 361, 362, 340, 336, 381, 339, 366, 334, 363, 379, 367, 368, 375, 376, 370, 369, 373, 374, 72: 391, 392, 393, 394, 386, 385, 387, 383, 384, 388, 390, 389, 302, 185, 92: 416, 418, 108: 417}, + {85: 433}, // 200 - {86}, - {85}, - {1: 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 90: 190}, - {185, 84: 297, 91: 417}, - {418}, + {429, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 404, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 85: 183, 95: 430}, + {179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 85: 179, 89: 419}, + {1: 342, 365, 318, 320, 378, 345, 322, 323, 324, 313, 348, 344, 350, 353, 328, 356, 349, 352, 355, 314, 315, 316, 317, 380, 343, 338, 358, 326, 346, 347, 330, 319, 321, 382, 325, 332, 351, 354, 329, 357, 327, 331, 372, 333, 337, 335, 364, 359, 377, 371, 341, 360, 361, 362, 340, 336, 381, 339, 366, 334, 363, 379, 367, 368, 375, 376, 370, 369, 373, 374, 72: 391, 392, 393, 394, 386, 385, 387, 383, 384, 388, 390, 389, 85: 423, 93: 422, 421, 99: 424, 425, 118: 420}, + {428}, + {158}, // 205 - {1: 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 90: 191}, - {77: 185, 80: 185, 84: 297, 91: 420}, - {77: 423, 80: 422, 120: 421}, - {424}, - {151}, + {157}, + {156}, + {85: 427}, + {85: 426}, + {154}, // 210 - {150}, - {1: 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 90: 192}, - {94: 426}, - {70: 399, 94: 183, 427}, - {94: 428}, + {155}, + {1: 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 91: 190}, + {1: 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 91: 192}, + {1: 342, 365, 318, 320, 378, 345, 322, 323, 324, 313, 348, 344, 350, 353, 328, 356, 349, 352, 355, 314, 315, 316, 317, 380, 343, 338, 358, 326, 346, 347, 330, 319, 321, 382, 325, 332, 351, 354, 329, 357, 327, 331, 372, 333, 337, 335, 364, 359, 377, 371, 341, 360, 361, 362, 340, 336, 381, 339, 366, 334, 363, 379, 367, 368, 375, 376, 370, 369, 373, 374, 72: 391, 392, 393, 394, 386, 385, 387, 383, 384, 388, 390, 389, 85: 431, 93: 407}, + {432}, // 215 - {429}, - {1: 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 90: 193}, - {84: 297, 91: 431, 93: 185}, - {93: 432}, - {81: 435, 434, 128: 433}, + {1: 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 91: 191}, + {434}, + {1: 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 91: 193}, + {79: 185, 185, 84: 302, 92: 436}, + {79: 438, 439, 120: 437}, // 220 - {436}, - {153}, - {152}, - {1: 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 90: 194}, - {1: 337, 360, 313, 315, 373, 340, 317, 318, 319, 343, 339, 345, 348, 323, 351, 344, 347, 350, 309, 310, 311, 312, 375, 338, 333, 353, 321, 341, 342, 325, 314, 316, 377, 320, 327, 346, 349, 324, 352, 322, 326, 367, 328, 332, 330, 359, 354, 372, 366, 336, 355, 356, 357, 335, 331, 376, 334, 361, 329, 358, 374, 362, 363, 370, 371, 365, 364, 368, 369, 71: 386, 387, 388, 389, 381, 380, 382, 378, 379, 383, 385, 384, 308, 92: 438}, + {440}, + {86}, + {85}, + {1: 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 91: 194}, + {185, 84: 302, 92: 442}, // 225 - {439, 70: 440}, - {1: 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 90: 196}, - {185, 337, 360, 313, 315, 373, 340, 317, 318, 319, 343, 339, 345, 348, 323, 351, 344, 347, 350, 309, 310, 311, 312, 375, 338, 333, 353, 321, 341, 342, 325, 314, 316, 377, 320, 327, 346, 349, 324, 352, 322, 326, 367, 328, 332, 330, 359, 354, 372, 366, 336, 355, 356, 357, 335, 331, 376, 334, 361, 329, 358, 374, 362, 363, 370, 371, 365, 364, 368, 369, 71: 386, 387, 388, 389, 381, 380, 382, 378, 379, 383, 385, 384, 308, 297, 86: 185, 91: 444, 443, 115: 442, 130: 441}, - {446, 86: 447}, - {170, 86: 170}, + {443}, + {1: 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 91: 195}, + {78: 185, 81: 185, 84: 302, 92: 445}, + {78: 448, 81: 447, 122: 446}, + {449}, // 230 - {185, 84: 297, 86: 185, 91: 445}, - {168, 86: 168}, - {169, 86: 169}, - {1: 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 90: 195}, - {185, 337, 360, 313, 315, 373, 340, 317, 318, 319, 343, 339, 345, 348, 323, 351, 344, 347, 350, 309, 310, 311, 312, 375, 338, 333, 353, 321, 341, 342, 325, 314, 316, 377, 320, 327, 346, 349, 324, 352, 322, 326, 367, 328, 332, 330, 359, 354, 372, 366, 336, 355, 356, 357, 335, 331, 376, 334, 361, 329, 358, 374, 362, 363, 370, 371, 365, 364, 368, 369, 71: 386, 387, 388, 389, 381, 380, 382, 378, 379, 383, 385, 384, 308, 297, 86: 185, 91: 444, 443, 115: 448}, + {151}, + {150}, + {1: 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 91: 196}, + {94: 451}, + {71: 404, 94: 183, 452}, // 235 - {171, 86: 171}, - {1: 337, 360, 313, 315, 373, 340, 317, 318, 319, 343, 339, 345, 348, 323, 351, 344, 347, 350, 309, 310, 311, 312, 375, 338, 333, 353, 321, 341, 342, 325, 314, 316, 377, 320, 327, 346, 349, 324, 352, 322, 326, 367, 328, 332, 330, 359, 354, 372, 366, 336, 355, 356, 357, 335, 331, 376, 334, 361, 329, 358, 374, 362, 363, 370, 371, 365, 364, 368, 369, 71: 386, 387, 388, 389, 381, 380, 382, 378, 379, 383, 385, 384, 308, 92: 450}, - {451}, - {1: 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 90: 197}, - {1: 337, 360, 313, 315, 373, 340, 317, 318, 319, 343, 339, 345, 348, 323, 351, 344, 347, 350, 309, 310, 311, 312, 375, 338, 333, 353, 321, 341, 342, 325, 314, 316, 377, 320, 327, 346, 349, 324, 352, 322, 326, 367, 328, 332, 330, 359, 354, 372, 366, 336, 355, 356, 357, 335, 331, 376, 334, 361, 329, 358, 374, 362, 363, 370, 371, 365, 364, 368, 369, 71: 386, 387, 388, 389, 381, 380, 382, 378, 379, 383, 385, 384, 308, 92: 453}, + {94: 453}, + {454}, + {1: 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 91: 197}, + {84: 302, 185, 92: 456}, + {85: 457}, // 240 - {88: 454}, - {1: 337, 360, 313, 315, 373, 340, 317, 318, 319, 343, 339, 345, 348, 323, 351, 344, 347, 350, 309, 310, 311, 312, 375, 338, 333, 353, 321, 341, 342, 325, 314, 316, 377, 320, 327, 346, 349, 324, 352, 322, 326, 367, 328, 332, 330, 359, 354, 372, 366, 336, 355, 356, 357, 335, 331, 376, 334, 361, 329, 358, 374, 362, 363, 370, 371, 365, 364, 368, 369, 71: 386, 387, 388, 389, 381, 380, 382, 378, 379, 383, 385, 384, 308, 92: 457, 458, 456, 116: 459, 460, 129: 455}, - {463}, - {158}, - {157}, + {82: 460, 459, 129: 458}, + {461}, + {153}, + {152}, + {1: 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 91: 198}, // 245 - {156}, - {93: 462}, - {93: 461}, - {154}, - {155}, + {1: 342, 365, 318, 320, 378, 345, 322, 323, 324, 313, 348, 344, 350, 353, 328, 356, 349, 352, 355, 314, 315, 316, 317, 380, 343, 338, 358, 326, 346, 347, 330, 319, 321, 382, 325, 332, 351, 354, 329, 357, 327, 331, 372, 333, 337, 335, 364, 359, 377, 371, 341, 360, 361, 362, 340, 336, 381, 339, 366, 334, 363, 379, 367, 368, 375, 376, 370, 369, 373, 374, 72: 391, 392, 393, 394, 386, 385, 387, 383, 384, 388, 390, 389, 93: 463}, + {464, 71: 465}, + {1: 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 91: 200}, + {185, 342, 365, 318, 320, 378, 345, 322, 323, 324, 313, 348, 344, 350, 353, 328, 356, 349, 352, 355, 314, 315, 316, 317, 380, 343, 338, 358, 326, 346, 347, 330, 319, 321, 382, 325, 332, 351, 354, 329, 357, 327, 331, 372, 333, 337, 335, 364, 359, 377, 371, 341, 360, 361, 362, 340, 336, 381, 339, 366, 334, 363, 379, 367, 368, 375, 376, 370, 369, 373, 374, 72: 391, 392, 393, 394, 386, 385, 387, 383, 384, 388, 390, 389, 302, 87: 185, 92: 469, 468, 119: 467, 130: 466}, + {471, 87: 472}, // 250 - {1: 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 90: 198}, - {84: 297, 91: 465, 93: 185}, - {93: 466}, - {467}, - {1: 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 90: 199}, + {170, 87: 170}, + {185, 84: 302, 87: 185, 92: 470}, + {168, 87: 168}, + {169, 87: 169}, + {1: 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 91: 199}, // 255 - {84: 297, 91: 469, 93: 185}, - {93: 470}, - {471}, - {1: 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 90: 200}, - {185, 71: 185, 185, 185, 185, 84: 297, 91: 473}, + {185, 342, 365, 318, 320, 378, 345, 322, 323, 324, 313, 348, 344, 350, 353, 328, 356, 349, 352, 355, 314, 315, 316, 317, 380, 343, 338, 358, 326, 346, 347, 330, 319, 321, 382, 325, 332, 351, 354, 329, 357, 327, 331, 372, 333, 337, 335, 364, 359, 377, 371, 341, 360, 361, 362, 340, 336, 381, 339, 366, 334, 363, 379, 367, 368, 375, 376, 370, 369, 373, 374, 72: 391, 392, 393, 394, 386, 385, 387, 383, 384, 388, 390, 389, 302, 87: 185, 92: 469, 468, 119: 473}, + {171, 87: 171}, + {1: 342, 365, 318, 320, 378, 345, 322, 323, 324, 313, 348, 344, 350, 353, 328, 356, 349, 352, 355, 314, 315, 316, 317, 380, 343, 338, 358, 326, 346, 347, 330, 319, 321, 382, 325, 332, 351, 354, 329, 357, 327, 331, 372, 333, 337, 335, 364, 359, 377, 371, 341, 360, 361, 362, 340, 336, 381, 339, 366, 334, 363, 379, 367, 368, 375, 376, 370, 369, 373, 374, 72: 391, 392, 393, 394, 386, 385, 387, 383, 384, 388, 390, 389, 93: 475}, + {476}, + {1: 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 91: 201}, // 260 - {162, 71: 477, 478, 479, 480, 109: 476, 126: 475, 474}, - {483}, - {161, 70: 481}, - {160, 70: 160}, - {105, 70: 105}, + {1: 342, 365, 318, 320, 378, 345, 322, 323, 324, 313, 348, 344, 350, 353, 328, 356, 349, 352, 355, 314, 315, 316, 317, 380, 343, 338, 358, 326, 346, 347, 330, 319, 321, 382, 325, 332, 351, 354, 329, 357, 327, 331, 372, 333, 337, 335, 364, 359, 377, 371, 341, 360, 361, 362, 340, 336, 381, 339, 366, 334, 363, 379, 367, 368, 375, 376, 370, 369, 373, 374, 72: 391, 392, 393, 394, 386, 385, 387, 383, 384, 388, 390, 389, 93: 478}, + {89: 479}, + {1: 342, 365, 318, 320, 378, 345, 322, 323, 324, 313, 348, 344, 350, 353, 328, 356, 349, 352, 355, 314, 315, 316, 317, 380, 343, 338, 358, 326, 346, 347, 330, 319, 321, 382, 325, 332, 351, 354, 329, 357, 327, 331, 372, 333, 337, 335, 364, 359, 377, 371, 341, 360, 361, 362, 340, 336, 381, 339, 366, 334, 363, 379, 367, 368, 375, 376, 370, 369, 373, 374, 72: 391, 392, 393, 394, 386, 385, 387, 383, 384, 388, 390, 389, 85: 423, 93: 422, 421, 99: 424, 425, 118: 480}, + {481}, + {1: 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 91: 202}, // 265 - {104, 70: 104}, - {103, 70: 103}, - {102, 70: 102}, - {71: 477, 478, 479, 480, 109: 482}, - {159, 70: 159}, + {84: 302, 185, 92: 483}, + {85: 484}, + {485}, + {1: 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 91: 203}, + {84: 302, 185, 92: 487}, // 270 - {1: 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 90: 201}, - {1: 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 71: 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 297, 91: 486, 100: 485}, - {494}, - {1: 337, 360, 313, 315, 373, 340, 317, 318, 319, 343, 339, 345, 348, 323, 351, 344, 347, 350, 309, 310, 311, 312, 375, 338, 333, 353, 321, 341, 342, 325, 314, 316, 377, 320, 327, 346, 349, 324, 352, 322, 326, 367, 328, 332, 330, 359, 354, 372, 366, 336, 355, 356, 357, 335, 331, 376, 334, 361, 329, 358, 374, 362, 363, 370, 371, 365, 364, 368, 369, 71: 386, 387, 388, 389, 381, 380, 382, 378, 379, 383, 385, 384, 308, 92: 307, 96: 487}, - {183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 399, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 95: 488}, + {85: 488}, + {489}, + {1: 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 91: 204}, + {185, 72: 185, 185, 185, 185, 84: 302, 92: 491}, + {162, 72: 495, 496, 497, 498, 112: 494, 127: 493, 492}, // 275 - {166, 337, 360, 313, 315, 373, 340, 317, 318, 319, 343, 339, 345, 348, 323, 351, 344, 347, 350, 309, 310, 311, 312, 375, 338, 333, 353, 321, 341, 342, 325, 314, 316, 377, 320, 327, 346, 349, 324, 352, 322, 326, 367, 328, 332, 330, 359, 354, 372, 366, 336, 355, 356, 357, 335, 331, 376, 334, 361, 329, 358, 374, 362, 363, 370, 371, 365, 364, 368, 369, 71: 386, 387, 388, 389, 381, 380, 382, 378, 379, 383, 385, 384, 308, 92: 491, 121: 490, 489}, - {167}, - {165, 70: 492}, - {164, 70: 164}, - {1: 337, 360, 313, 315, 373, 340, 317, 318, 319, 343, 339, 345, 348, 323, 351, 344, 347, 350, 309, 310, 311, 312, 375, 338, 333, 353, 321, 341, 342, 325, 314, 316, 377, 320, 327, 346, 349, 324, 352, 322, 326, 367, 328, 332, 330, 359, 354, 372, 366, 336, 355, 356, 357, 335, 331, 376, 334, 361, 329, 358, 374, 362, 363, 370, 371, 365, 364, 368, 369, 71: 386, 387, 388, 389, 381, 380, 382, 378, 379, 383, 385, 384, 308, 92: 493}, + {501}, + {161, 71: 499}, + {160, 71: 160}, + {105, 71: 105}, + {104, 71: 104}, // 280 - {163, 70: 163}, - {1: 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 90: 202}, - {1: 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 71: 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 297, 91: 486, 100: 496}, - {497}, - {1: 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 90: 203}, + {103, 71: 103}, + {102, 71: 102}, + {72: 495, 496, 497, 498, 112: 500}, + {159, 71: 159}, + {1: 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 91: 205}, // 285 - {185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 71: 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 297, 91: 501, 97: 500, 103: 499}, - {502}, - {177, 70: 405}, - {176, 337, 360, 313, 315, 373, 340, 317, 318, 319, 343, 339, 345, 348, 323, 351, 344, 347, 350, 309, 310, 311, 312, 375, 338, 333, 353, 321, 341, 342, 325, 314, 316, 377, 320, 327, 346, 349, 324, 352, 322, 326, 367, 328, 332, 330, 359, 354, 372, 366, 336, 355, 356, 357, 335, 331, 376, 334, 361, 329, 358, 374, 362, 363, 370, 371, 365, 364, 368, 369, 71: 386, 387, 388, 389, 381, 380, 382, 378, 379, 383, 385, 384, 308, 92: 307, 96: 306}, - {1: 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 90: 204}, + {1: 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 72: 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 302, 92: 504, 102: 503}, + {512}, + {1: 342, 365, 318, 320, 378, 345, 322, 323, 324, 313, 348, 344, 350, 353, 328, 356, 349, 352, 355, 314, 315, 316, 317, 380, 343, 338, 358, 326, 346, 347, 330, 319, 321, 382, 325, 332, 351, 354, 329, 357, 327, 331, 372, 333, 337, 335, 364, 359, 377, 371, 341, 360, 361, 362, 340, 336, 381, 339, 366, 334, 363, 379, 367, 368, 375, 376, 370, 369, 373, 374, 72: 391, 392, 393, 394, 386, 385, 387, 383, 384, 388, 390, 389, 93: 312, 96: 505}, + {183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 404, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 95: 506}, + {166, 342, 365, 318, 320, 378, 345, 322, 323, 324, 313, 348, 344, 350, 353, 328, 356, 349, 352, 355, 314, 315, 316, 317, 380, 343, 338, 358, 326, 346, 347, 330, 319, 321, 382, 325, 332, 351, 354, 329, 357, 327, 331, 372, 333, 337, 335, 364, 359, 377, 371, 341, 360, 361, 362, 340, 336, 381, 339, 366, 334, 363, 379, 367, 368, 375, 376, 370, 369, 373, 374, 72: 391, 392, 393, 394, 386, 385, 387, 383, 384, 388, 390, 389, 93: 509, 123: 508, 507}, // 290 - {185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 71: 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 297, 91: 501, 97: 500, 103: 504}, - {505}, - {1: 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 90: 205}, - {1: 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 71: 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 297, 91: 305, 97: 507}, - {508, 70: 405}, + {167}, + {165, 71: 510}, + {164, 71: 164}, + {1: 342, 365, 318, 320, 378, 345, 322, 323, 324, 313, 348, 344, 350, 353, 328, 356, 349, 352, 355, 314, 315, 316, 317, 380, 343, 338, 358, 326, 346, 347, 330, 319, 321, 382, 325, 332, 351, 354, 329, 357, 327, 331, 372, 333, 337, 335, 364, 359, 377, 371, 341, 360, 361, 362, 340, 336, 381, 339, 366, 334, 363, 379, 367, 368, 375, 376, 370, 369, 373, 374, 72: 391, 392, 393, 394, 386, 385, 387, 383, 384, 388, 390, 389, 93: 511}, + {163, 71: 163}, // 295 - {1: 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 90: 206}, - {185, 84: 297, 91: 510}, - {511}, - {1: 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 90: 207}, - {1: 287, 246, 239, 241, 275, 283, 260, 262, 263, 273, 291, 253, 249, 265, 258, 252, 248, 257, 218, 236, 237, 238, 264, 288, 225, 230, 251, 284, 285, 266, 240, 242, 294, 261, 268, 254, 250, 289, 259, 243, 267, 277, 269, 279, 271, 245, 256, 226, 276, 229, 234, 290, 235, 228, 278, 293, 227, 247, 270, 244, 292, 286, 255, 231, 281, 272, 274, 282, 280, 99: 232, 104: 219, 233, 107: 514, 224, 110: 223, 221, 513, 222, 220}, + {1: 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 91: 206}, + {1: 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 72: 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 302, 92: 504, 102: 514}, + {515}, + {1: 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 91: 207}, + {185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 72: 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 302, 92: 519, 97: 518, 105: 517}, // 300 - {1: 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 90: 210}, - {1: 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 90: 208}, + {520}, + {177, 71: 410}, + {176, 342, 365, 318, 320, 378, 345, 322, 323, 324, 313, 348, 344, 350, 353, 328, 356, 349, 352, 355, 314, 315, 316, 317, 380, 343, 338, 358, 326, 346, 347, 330, 319, 321, 382, 325, 332, 351, 354, 329, 357, 327, 331, 372, 333, 337, 335, 364, 359, 377, 371, 341, 360, 361, 362, 340, 336, 381, 339, 366, 334, 363, 379, 367, 368, 375, 376, 370, 369, 373, 374, 72: 391, 392, 393, 394, 386, 385, 387, 383, 384, 388, 390, 389, 93: 312, 96: 311}, + {1: 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 91: 208}, + {185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 72: 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 302, 92: 519, 97: 518, 105: 522}, + // 305 + {523}, + {1: 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 91: 209}, + {1: 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 72: 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 302, 92: 310, 97: 525}, + {526, 71: 410}, + {1: 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 91: 210}, + // 310 + {185, 84: 302, 92: 528}, + {529}, + {1: 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 91: 211}, + {1: 292, 251, 244, 246, 280, 288, 265, 267, 268, 239, 278, 296, 258, 254, 270, 263, 257, 253, 262, 222, 241, 242, 243, 269, 293, 229, 234, 256, 289, 290, 271, 245, 247, 299, 266, 273, 259, 255, 294, 264, 248, 272, 282, 274, 284, 276, 250, 261, 230, 281, 233, 238, 295, 240, 232, 283, 298, 231, 252, 275, 249, 297, 291, 260, 235, 286, 277, 279, 287, 285, 101: 236, 106: 223, 237, 110: 532, 228, 113: 227, 225, 531, 226, 224}, + {1: 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 91: 214}, + // 315 + {1: 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 91: 212}, } ) @@ -1366,6 +1387,26 @@ yynewstate: } } case 24: + { + parser.warnUnsupportedHint(yyS[yypt-4].ident) + parser.yyVAL.hint = nil + } + case 25: + { + parser.warnUnsupportedHint(yyS[yypt-3].ident) + parser.yyVAL.hint = nil + } + case 26: + { + parser.warnUnsupportedHint(yyS[yypt-5].ident) + parser.yyVAL.hint = nil + } + case 27: + { + parser.warnUnsupportedHint(yyS[yypt-5].ident) + parser.yyVAL.hint = nil + } + case 28: { hs := yyS[yypt-1].hints name := model.NewCIStr(yyS[yypt-4].ident) @@ -1376,60 +1417,60 @@ yynewstate: } parser.yyVAL.hints = hs } - case 25: + case 29: { parser.yyVAL.hints = []*ast.TableOptimizerHint{yyS[yypt-0].hint} } - case 26: + case 30: { parser.yyVAL.hints = append(yyS[yypt-2].hints, yyS[yypt-0].hint) } - case 27: + case 31: { h := yyS[yypt-1].hint h.HintData = model.NewCIStr(yyS[yypt-3].ident) parser.yyVAL.hint = h } - case 28: + case 32: { parser.yyVAL.ident = "" } - case 32: + case 36: { parser.yyVAL.modelIdents = nil } - case 33: + case 37: { parser.yyVAL.modelIdents = yyS[yypt-1].modelIdents } - case 34: + case 38: { parser.yyVAL.modelIdents = []model.CIStr{model.NewCIStr(yyS[yypt-0].ident)} } - case 35: + case 39: { parser.yyVAL.modelIdents = append(yyS[yypt-2].modelIdents, model.NewCIStr(yyS[yypt-0].ident)) } - case 37: + case 41: { parser.yyVAL.hint = &ast.TableOptimizerHint{ QBName: model.NewCIStr(yyS[yypt-0].ident), } } - case 38: + case 42: { parser.yyVAL.hint = &ast.TableOptimizerHint{ Tables: []ast.HintTable{yyS[yypt-0].table}, QBName: model.NewCIStr(yyS[yypt-1].ident), } } - case 39: + case 43: { h := yyS[yypt-2].hint h.Tables = append(h.Tables, yyS[yypt-0].table) parser.yyVAL.hint = h } - case 40: + case 44: { parser.yyVAL.table = ast.HintTable{ TableName: model.NewCIStr(yyS[yypt-2].ident), @@ -1437,7 +1478,7 @@ yynewstate: PartitionList: yyS[yypt-0].modelIdents, } } - case 41: + case 45: { parser.yyVAL.table = ast.HintTable{ DBName: model.NewCIStr(yyS[yypt-4].ident), @@ -1446,63 +1487,63 @@ yynewstate: PartitionList: yyS[yypt-0].modelIdents, } } - case 42: + case 46: { h := yyS[yypt-2].hint h.Tables = append(h.Tables, yyS[yypt-0].table) parser.yyVAL.hint = h } - case 43: + case 47: { parser.yyVAL.hint = &ast.TableOptimizerHint{ Tables: []ast.HintTable{yyS[yypt-0].table}, } } - case 44: + case 48: { parser.yyVAL.table = ast.HintTable{ TableName: model.NewCIStr(yyS[yypt-1].ident), QBName: model.NewCIStr(yyS[yypt-0].ident), } } - case 45: + case 49: { parser.yyVAL.table = ast.HintTable{ QBName: model.NewCIStr(yyS[yypt-0].ident), } } - case 46: + case 50: { h := yyS[yypt-0].hint h.Tables = []ast.HintTable{yyS[yypt-2].table} h.QBName = model.NewCIStr(yyS[yypt-3].ident) parser.yyVAL.hint = h } - case 47: + case 51: { parser.yyVAL.hint = &ast.TableOptimizerHint{} } - case 49: + case 53: { parser.yyVAL.hint = &ast.TableOptimizerHint{ Indexes: []model.CIStr{model.NewCIStr(yyS[yypt-0].ident)}, } } - case 50: + case 54: { h := yyS[yypt-2].hint h.Indexes = append(h.Indexes, model.NewCIStr(yyS[yypt-0].ident)) parser.yyVAL.hint = h } - case 57: + case 61: { parser.yyVAL.ident = strconv.FormatUint(yyS[yypt-0].number, 10) } - case 58: + case 62: { parser.yyVAL.ident = strconv.FormatUint(yyS[yypt-0].number, 10) } - case 59: + case 63: { if yyS[yypt-0].number > 9223372036854775808 { yylex.AppendError(yylex.Errorf("the Signed Value should be at the range of [-9223372036854775808, 9223372036854775807].")) @@ -1514,19 +1555,19 @@ yynewstate: parser.yyVAL.ident = strconv.FormatInt(-int64(yyS[yypt-0].number), 10) } } - case 60: + case 64: { parser.yyVAL.number = 1024 * 1024 } - case 61: + case 65: { parser.yyVAL.number = 1024 * 1024 * 1024 } - case 62: + case 66: { parser.yyVAL.hint = &ast.TableOptimizerHint{HintData: true} } - case 63: + case 67: { parser.yyVAL.hint = &ast.TableOptimizerHint{HintData: false} } diff --git a/pkg/parser/hintparser.y b/pkg/parser/hintparser.y index 73476be61b279..228d525e15747 100644 --- a/pkg/parser/hintparser.y +++ b/pkg/parser/hintparser.y @@ -353,6 +353,27 @@ TableOptimizerHintOpt: HintData: model.NewCIStr($4), } } +| hintIdentifier '(' QueryBlockOpt hintIntLit ')' + /* The hints below are pseudo hint. They are unsupported hints */ + { + parser.warnUnsupportedHint($1) + $$ = nil + } +| hintIdentifier '(' PartitionList ')' + { + parser.warnUnsupportedHint($1) + $$ = nil + } +| hintIdentifier '(' PartitionList CommaOpt hintIntLit ')' + { + parser.warnUnsupportedHint($1) + $$ = nil + } +| hintIdentifier '(' Identifier '=' Value ')' + { + parser.warnUnsupportedHint($1) + $$ = nil + } StorageOptimizerHintOpt: "READ_FROM_STORAGE" '(' QueryBlockOpt HintStorageTypeAndTableList ')' diff --git a/pkg/parser/keywords.go b/pkg/parser/keywords.go new file mode 100644 index 0000000000000..d17526c3ebf0b --- /dev/null +++ b/pkg/parser/keywords.go @@ -0,0 +1,673 @@ +// Copyright 2023 PingCAP, 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +package parser + +// WARNING: This file is generated by 'genkeyword' + +// KeywordsType defines the attributes of keywords +type KeywordsType struct { + Word string + Reserved bool + Section string +} + +// Keywords is used for all keywords in TiDB +var Keywords = []KeywordsType{ + {"ADD", true, "reserved"}, + {"ALL", true, "reserved"}, + {"ALTER", true, "reserved"}, + {"ANALYZE", true, "reserved"}, + {"AND", true, "reserved"}, + {"ARRAY", true, "reserved"}, + {"AS", true, "reserved"}, + {"ASC", true, "reserved"}, + {"BETWEEN", true, "reserved"}, + {"BIGINT", true, "reserved"}, + {"BINARY", true, "reserved"}, + {"BLOB", true, "reserved"}, + {"BOTH", true, "reserved"}, + {"BY", true, "reserved"}, + {"CALL", true, "reserved"}, + {"CASCADE", true, "reserved"}, + {"CASE", true, "reserved"}, + {"CHANGE", true, "reserved"}, + {"CHAR", true, "reserved"}, + {"CHARACTER", true, "reserved"}, + {"CHECK", true, "reserved"}, + {"COLLATE", true, "reserved"}, + {"COLUMN", true, "reserved"}, + {"CONSTRAINT", true, "reserved"}, + {"CONTINUE", true, "reserved"}, + {"CONVERT", true, "reserved"}, + {"CREATE", true, "reserved"}, + {"CROSS", true, "reserved"}, + {"CUME_DIST", true, "reserved"}, + {"CURRENT_DATE", true, "reserved"}, + {"CURRENT_ROLE", true, "reserved"}, + {"CURRENT_TIME", true, "reserved"}, + {"CURRENT_TIMESTAMP", true, "reserved"}, + {"CURRENT_USER", true, "reserved"}, + {"CURSOR", true, "reserved"}, + {"DATABASE", true, "reserved"}, + {"DATABASES", true, "reserved"}, + {"DAY_HOUR", true, "reserved"}, + {"DAY_MICROSECOND", true, "reserved"}, + {"DAY_MINUTE", true, "reserved"}, + {"DAY_SECOND", true, "reserved"}, + {"DECIMAL", true, "reserved"}, + {"DEFAULT", true, "reserved"}, + {"DELAYED", true, "reserved"}, + {"DELETE", true, "reserved"}, + {"DENSE_RANK", true, "reserved"}, + {"DESC", true, "reserved"}, + {"DESCRIBE", true, "reserved"}, + {"DISTINCT", true, "reserved"}, + {"DISTINCTROW", true, "reserved"}, + {"DIV", true, "reserved"}, + {"DOUBLE", true, "reserved"}, + {"DROP", true, "reserved"}, + {"DUAL", true, "reserved"}, + {"ELSE", true, "reserved"}, + {"ELSEIF", true, "reserved"}, + {"ENCLOSED", true, "reserved"}, + {"ESCAPED", true, "reserved"}, + {"EXCEPT", true, "reserved"}, + {"EXISTS", true, "reserved"}, + {"EXIT", true, "reserved"}, + {"EXPLAIN", true, "reserved"}, + {"FALSE", true, "reserved"}, + {"FETCH", true, "reserved"}, + {"FIRST_VALUE", true, "reserved"}, + {"FLOAT", true, "reserved"}, + {"FLOAT4", true, "reserved"}, + {"FLOAT8", true, "reserved"}, + {"FOR", true, "reserved"}, + {"FORCE", true, "reserved"}, + {"FOREIGN", true, "reserved"}, + {"FROM", true, "reserved"}, + {"FULLTEXT", true, "reserved"}, + {"GENERATED", true, "reserved"}, + {"GRANT", true, "reserved"}, + {"GROUP", true, "reserved"}, + {"GROUPS", true, "reserved"}, + {"HAVING", true, "reserved"}, + {"HIGH_PRIORITY", true, "reserved"}, + {"HOUR_MICROSECOND", true, "reserved"}, + {"HOUR_MINUTE", true, "reserved"}, + {"HOUR_SECOND", true, "reserved"}, + {"IF", true, "reserved"}, + {"IGNORE", true, "reserved"}, + {"ILIKE", true, "reserved"}, + {"IN", true, "reserved"}, + {"INDEX", true, "reserved"}, + {"INFILE", true, "reserved"}, + {"INNER", true, "reserved"}, + {"INOUT", true, "reserved"}, + {"INSERT", true, "reserved"}, + {"INT", true, "reserved"}, + {"INT1", true, "reserved"}, + {"INT2", true, "reserved"}, + {"INT3", true, "reserved"}, + {"INT4", true, "reserved"}, + {"INT8", true, "reserved"}, + {"INTEGER", true, "reserved"}, + {"INTERSECT", true, "reserved"}, + {"INTERVAL", true, "reserved"}, + {"INTO", true, "reserved"}, + {"IS", true, "reserved"}, + {"ITERATE", true, "reserved"}, + {"JOIN", true, "reserved"}, + {"KEY", true, "reserved"}, + {"KEYS", true, "reserved"}, + {"KILL", true, "reserved"}, + {"LAG", true, "reserved"}, + {"LAST_VALUE", true, "reserved"}, + {"LEAD", true, "reserved"}, + {"LEADING", true, "reserved"}, + {"LEAVE", true, "reserved"}, + {"LEFT", true, "reserved"}, + {"LIKE", true, "reserved"}, + {"LIMIT", true, "reserved"}, + {"LINEAR", true, "reserved"}, + {"LINES", true, "reserved"}, + {"LOAD", true, "reserved"}, + {"LOCALTIME", true, "reserved"}, + {"LOCALTIMESTAMP", true, "reserved"}, + {"LOCK", true, "reserved"}, + {"LONG", true, "reserved"}, + {"LONGBLOB", true, "reserved"}, + {"LONGTEXT", true, "reserved"}, + {"LOW_PRIORITY", true, "reserved"}, + {"MATCH", true, "reserved"}, + {"MAXVALUE", true, "reserved"}, + {"MEDIUMBLOB", true, "reserved"}, + {"MEDIUMINT", true, "reserved"}, + {"MEDIUMTEXT", true, "reserved"}, + {"MIDDLEINT", true, "reserved"}, + {"MINUTE_MICROSECOND", true, "reserved"}, + {"MINUTE_SECOND", true, "reserved"}, + {"MOD", true, "reserved"}, + {"NATURAL", true, "reserved"}, + {"NOT", true, "reserved"}, + {"NO_WRITE_TO_BINLOG", true, "reserved"}, + {"NTH_VALUE", true, "reserved"}, + {"NTILE", true, "reserved"}, + {"NULL", true, "reserved"}, + {"NUMERIC", true, "reserved"}, + {"OF", true, "reserved"}, + {"ON", true, "reserved"}, + {"OPTIMIZE", true, "reserved"}, + {"OPTION", true, "reserved"}, + {"OPTIONALLY", true, "reserved"}, + {"OR", true, "reserved"}, + {"ORDER", true, "reserved"}, + {"OUT", true, "reserved"}, + {"OUTER", true, "reserved"}, + {"OUTFILE", true, "reserved"}, + {"OVER", true, "reserved"}, + {"PARTITION", true, "reserved"}, + {"PERCENT_RANK", true, "reserved"}, + {"PRECISION", true, "reserved"}, + {"PRIMARY", true, "reserved"}, + {"PROCEDURE", true, "reserved"}, + {"RANGE", true, "reserved"}, + {"RANK", true, "reserved"}, + {"READ", true, "reserved"}, + {"REAL", true, "reserved"}, + {"RECURSIVE", true, "reserved"}, + {"REFERENCES", true, "reserved"}, + {"REGEXP", true, "reserved"}, + {"RELEASE", true, "reserved"}, + {"RENAME", true, "reserved"}, + {"REPEAT", true, "reserved"}, + {"REPLACE", true, "reserved"}, + {"REQUIRE", true, "reserved"}, + {"RESTRICT", true, "reserved"}, + {"REVOKE", true, "reserved"}, + {"RIGHT", true, "reserved"}, + {"RLIKE", true, "reserved"}, + {"ROW", true, "reserved"}, + {"ROWS", true, "reserved"}, + {"ROW_NUMBER", true, "reserved"}, + {"SECOND_MICROSECOND", true, "reserved"}, + {"SELECT", true, "reserved"}, + {"SET", true, "reserved"}, + {"SHOW", true, "reserved"}, + {"SMALLINT", true, "reserved"}, + {"SPATIAL", true, "reserved"}, + {"SQL", true, "reserved"}, + {"SQLEXCEPTION", true, "reserved"}, + {"SQLSTATE", true, "reserved"}, + {"SQLWARNING", true, "reserved"}, + {"SQL_BIG_RESULT", true, "reserved"}, + {"SQL_CALC_FOUND_ROWS", true, "reserved"}, + {"SQL_SMALL_RESULT", true, "reserved"}, + {"SSL", true, "reserved"}, + {"STARTING", true, "reserved"}, + {"STATS_EXTENDED", true, "reserved"}, + {"STORED", true, "reserved"}, + {"STRAIGHT_JOIN", true, "reserved"}, + {"TABLE", true, "reserved"}, + {"TABLESAMPLE", true, "reserved"}, + {"TERMINATED", true, "reserved"}, + {"THEN", true, "reserved"}, + {"TINYBLOB", true, "reserved"}, + {"TINYINT", true, "reserved"}, + {"TINYTEXT", true, "reserved"}, + {"TO", true, "reserved"}, + {"TRAILING", true, "reserved"}, + {"TRIGGER", true, "reserved"}, + {"TRUE", true, "reserved"}, + {"TiDB_CURRENT_TSO", true, "reserved"}, + {"UNION", true, "reserved"}, + {"UNIQUE", true, "reserved"}, + {"UNLOCK", true, "reserved"}, + {"UNSIGNED", true, "reserved"}, + {"UNTIL", true, "reserved"}, + {"UPDATE", true, "reserved"}, + {"USAGE", true, "reserved"}, + {"USE", true, "reserved"}, + {"USING", true, "reserved"}, + {"UTC_DATE", true, "reserved"}, + {"UTC_TIME", true, "reserved"}, + {"UTC_TIMESTAMP", true, "reserved"}, + {"VALUES", true, "reserved"}, + {"VARBINARY", true, "reserved"}, + {"VARCHAR", true, "reserved"}, + {"VARCHARACTER", true, "reserved"}, + {"VARYING", true, "reserved"}, + {"VIRTUAL", true, "reserved"}, + {"WHEN", true, "reserved"}, + {"WHERE", true, "reserved"}, + {"WHILE", true, "reserved"}, + {"WINDOW", true, "reserved"}, + {"WITH", true, "reserved"}, + {"WRITE", true, "reserved"}, + {"XOR", true, "reserved"}, + {"YEAR_MONTH", true, "reserved"}, + {"ZEROFILL", true, "reserved"}, + {"ACCOUNT", false, "unreserved"}, + {"ACTION", false, "unreserved"}, + {"ADVISE", false, "unreserved"}, + {"AFTER", false, "unreserved"}, + {"AGAINST", false, "unreserved"}, + {"AGO", false, "unreserved"}, + {"ALGORITHM", false, "unreserved"}, + {"ALWAYS", false, "unreserved"}, + {"ANY", false, "unreserved"}, + {"ASCII", false, "unreserved"}, + {"ATTRIBUTE", false, "unreserved"}, + {"ATTRIBUTES", false, "unreserved"}, + {"AUTO_ID_CACHE", false, "unreserved"}, + {"AUTO_INCREMENT", false, "unreserved"}, + {"AUTO_RANDOM", false, "unreserved"}, + {"AUTO_RANDOM_BASE", false, "unreserved"}, + {"AVG", false, "unreserved"}, + {"AVG_ROW_LENGTH", false, "unreserved"}, + {"BACKEND", false, "unreserved"}, + {"BACKUP", false, "unreserved"}, + {"BACKUPS", false, "unreserved"}, + {"BDR", false, "unreserved"}, + {"BEGIN", false, "unreserved"}, + {"BERNOULLI", false, "unreserved"}, + {"BINDING", false, "unreserved"}, + {"BINDINGS", false, "unreserved"}, + {"BINDING_CACHE", false, "unreserved"}, + {"BINLOG", false, "unreserved"}, + {"BIT", false, "unreserved"}, + {"BLOCK", false, "unreserved"}, + {"BOOL", false, "unreserved"}, + {"BOOLEAN", false, "unreserved"}, + {"BTREE", false, "unreserved"}, + {"BYTE", false, "unreserved"}, + {"CACHE", false, "unreserved"}, + {"CALIBRATE", false, "unreserved"}, + {"CAPTURE", false, "unreserved"}, + {"CASCADED", false, "unreserved"}, + {"CAUSAL", false, "unreserved"}, + {"CHAIN", false, "unreserved"}, + {"CHARSET", false, "unreserved"}, + {"CHECKPOINT", false, "unreserved"}, + {"CHECKSUM", false, "unreserved"}, + {"CIPHER", false, "unreserved"}, + {"CLEANUP", false, "unreserved"}, + {"CLIENT", false, "unreserved"}, + {"CLIENT_ERRORS_SUMMARY", false, "unreserved"}, + {"CLOSE", false, "unreserved"}, + {"CLUSTER", false, "unreserved"}, + {"CLUSTERED", false, "unreserved"}, + {"COALESCE", false, "unreserved"}, + {"COLLATION", false, "unreserved"}, + {"COLUMNS", false, "unreserved"}, + {"COLUMN_FORMAT", false, "unreserved"}, + {"COMMENT", false, "unreserved"}, + {"COMMIT", false, "unreserved"}, + {"COMMITTED", false, "unreserved"}, + {"COMPACT", false, "unreserved"}, + {"COMPRESSED", false, "unreserved"}, + {"COMPRESSION", false, "unreserved"}, + {"CONCURRENCY", false, "unreserved"}, + {"CONFIG", false, "unreserved"}, + {"CONNECTION", false, "unreserved"}, + {"CONSISTENCY", false, "unreserved"}, + {"CONSISTENT", false, "unreserved"}, + {"CONTEXT", false, "unreserved"}, + {"CPU", false, "unreserved"}, + {"CSV_BACKSLASH_ESCAPE", false, "unreserved"}, + {"CSV_DELIMITER", false, "unreserved"}, + {"CSV_HEADER", false, "unreserved"}, + {"CSV_NOT_NULL", false, "unreserved"}, + {"CSV_NULL", false, "unreserved"}, + {"CSV_SEPARATOR", false, "unreserved"}, + {"CSV_TRIM_LAST_SEPARATORS", false, "unreserved"}, + {"CURRENT", false, "unreserved"}, + {"CYCLE", false, "unreserved"}, + {"DATA", false, "unreserved"}, + {"DATE", false, "unreserved"}, + {"DATETIME", false, "unreserved"}, + {"DAY", false, "unreserved"}, + {"DEALLOCATE", false, "unreserved"}, + {"DECLARE", false, "unreserved"}, + {"DEFINER", false, "unreserved"}, + {"DELAY_KEY_WRITE", false, "unreserved"}, + {"DIGEST", false, "unreserved"}, + {"DIRECTORY", false, "unreserved"}, + {"DISABLE", false, "unreserved"}, + {"DISABLED", false, "unreserved"}, + {"DISCARD", false, "unreserved"}, + {"DISK", false, "unreserved"}, + {"DO", false, "unreserved"}, + {"DUPLICATE", false, "unreserved"}, + {"DYNAMIC", false, "unreserved"}, + {"ENABLE", false, "unreserved"}, + {"ENABLED", false, "unreserved"}, + {"ENCRYPTION", false, "unreserved"}, + {"END", false, "unreserved"}, + {"ENFORCED", false, "unreserved"}, + {"ENGINE", false, "unreserved"}, + {"ENGINES", false, "unreserved"}, + {"ENUM", false, "unreserved"}, + {"ERROR", false, "unreserved"}, + {"ERRORS", false, "unreserved"}, + {"ESCAPE", false, "unreserved"}, + {"EVENT", false, "unreserved"}, + {"EVENTS", false, "unreserved"}, + {"EVOLVE", false, "unreserved"}, + {"EXCHANGE", false, "unreserved"}, + {"EXCLUSIVE", false, "unreserved"}, + {"EXECUTE", false, "unreserved"}, + {"EXPANSION", false, "unreserved"}, + {"EXPIRE", false, "unreserved"}, + {"EXTENDED", false, "unreserved"}, + {"FAILED_LOGIN_ATTEMPTS", false, "unreserved"}, + {"FAULTS", false, "unreserved"}, + {"FIELDS", false, "unreserved"}, + {"FILE", false, "unreserved"}, + {"FIRST", false, "unreserved"}, + {"FIXED", false, "unreserved"}, + {"FLUSH", false, "unreserved"}, + {"FOLLOWING", false, "unreserved"}, + {"FORMAT", false, "unreserved"}, + {"FOUND", false, "unreserved"}, + {"FULL", false, "unreserved"}, + {"FUNCTION", false, "unreserved"}, + {"GENERAL", false, "unreserved"}, + {"GLOBAL", false, "unreserved"}, + {"GRANTS", false, "unreserved"}, + {"HANDLER", false, "unreserved"}, + {"HASH", false, "unreserved"}, + {"HELP", false, "unreserved"}, + {"HISTOGRAM", false, "unreserved"}, + {"HISTORY", false, "unreserved"}, + {"HOSTS", false, "unreserved"}, + {"HOUR", false, "unreserved"}, + {"HYPO", false, "unreserved"}, + {"IDENTIFIED", false, "unreserved"}, + {"IMPORT", false, "unreserved"}, + {"IMPORTS", false, "unreserved"}, + {"INCREMENT", false, "unreserved"}, + {"INCREMENTAL", false, "unreserved"}, + {"INDEXES", false, "unreserved"}, + {"INSERT_METHOD", false, "unreserved"}, + {"INSTANCE", false, "unreserved"}, + {"INVISIBLE", false, "unreserved"}, + {"INVOKER", false, "unreserved"}, + {"IO", false, "unreserved"}, + {"IPC", false, "unreserved"}, + {"ISOLATION", false, "unreserved"}, + {"ISSUER", false, "unreserved"}, + {"JSON", false, "unreserved"}, + {"KEY_BLOCK_SIZE", false, "unreserved"}, + {"LABELS", false, "unreserved"}, + {"LANGUAGE", false, "unreserved"}, + {"LAST", false, "unreserved"}, + {"LASTVAL", false, "unreserved"}, + {"LAST_BACKUP", false, "unreserved"}, + {"LESS", false, "unreserved"}, + {"LEVEL", false, "unreserved"}, + {"LIST", false, "unreserved"}, + {"LOCAL", false, "unreserved"}, + {"LOCATION", false, "unreserved"}, + {"LOCKED", false, "unreserved"}, + {"LOGS", false, "unreserved"}, + {"MASTER", false, "unreserved"}, + {"MAX_CONNECTIONS_PER_HOUR", false, "unreserved"}, + {"MAX_IDXNUM", false, "unreserved"}, + {"MAX_MINUTES", false, "unreserved"}, + {"MAX_QUERIES_PER_HOUR", false, "unreserved"}, + {"MAX_ROWS", false, "unreserved"}, + {"MAX_UPDATES_PER_HOUR", false, "unreserved"}, + {"MAX_USER_CONNECTIONS", false, "unreserved"}, + {"MB", false, "unreserved"}, + {"MEMBER", false, "unreserved"}, + {"MEMORY", false, "unreserved"}, + {"MERGE", false, "unreserved"}, + {"MICROSECOND", false, "unreserved"}, + {"MINUTE", false, "unreserved"}, + {"MINVALUE", false, "unreserved"}, + {"MIN_ROWS", false, "unreserved"}, + {"MODE", false, "unreserved"}, + {"MODIFY", false, "unreserved"}, + {"MONTH", false, "unreserved"}, + {"NAMES", false, "unreserved"}, + {"NATIONAL", false, "unreserved"}, + {"NCHAR", false, "unreserved"}, + {"NEVER", false, "unreserved"}, + {"NEXT", false, "unreserved"}, + {"NEXTVAL", false, "unreserved"}, + {"NO", false, "unreserved"}, + {"NOCACHE", false, "unreserved"}, + {"NOCYCLE", false, "unreserved"}, + {"NODEGROUP", false, "unreserved"}, + {"NOMAXVALUE", false, "unreserved"}, + {"NOMINVALUE", false, "unreserved"}, + {"NONCLUSTERED", false, "unreserved"}, + {"NONE", false, "unreserved"}, + {"NOWAIT", false, "unreserved"}, + {"NULLS", false, "unreserved"}, + {"NVARCHAR", false, "unreserved"}, + {"OFF", false, "unreserved"}, + {"OFFSET", false, "unreserved"}, + {"OLTP_READ_ONLY", false, "unreserved"}, + {"OLTP_READ_WRITE", false, "unreserved"}, + {"OLTP_WRITE_ONLY", false, "unreserved"}, + {"ONLINE", false, "unreserved"}, + {"ONLY", false, "unreserved"}, + {"ON_DUPLICATE", false, "unreserved"}, + {"OPEN", false, "unreserved"}, + {"OPTIONAL", false, "unreserved"}, + {"PACK_KEYS", false, "unreserved"}, + {"PAGE", false, "unreserved"}, + {"PARSER", false, "unreserved"}, + {"PARTIAL", false, "unreserved"}, + {"PARTITIONING", false, "unreserved"}, + {"PARTITIONS", false, "unreserved"}, + {"PASSWORD", false, "unreserved"}, + {"PASSWORD_LOCK_TIME", false, "unreserved"}, + {"PAUSE", false, "unreserved"}, + {"PERCENT", false, "unreserved"}, + {"PER_DB", false, "unreserved"}, + {"PER_TABLE", false, "unreserved"}, + {"PLUGINS", false, "unreserved"}, + {"POINT", false, "unreserved"}, + {"POLICY", false, "unreserved"}, + {"PRECEDING", false, "unreserved"}, + {"PREPARE", false, "unreserved"}, + {"PRESERVE", false, "unreserved"}, + {"PRE_SPLIT_REGIONS", false, "unreserved"}, + {"PRIVILEGES", false, "unreserved"}, + {"PROCESS", false, "unreserved"}, + {"PROCESSLIST", false, "unreserved"}, + {"PROFILE", false, "unreserved"}, + {"PROFILES", false, "unreserved"}, + {"PROXY", false, "unreserved"}, + {"PURGE", false, "unreserved"}, + {"QUARTER", false, "unreserved"}, + {"QUERIES", false, "unreserved"}, + {"QUERY", false, "unreserved"}, + {"QUICK", false, "unreserved"}, + {"RATE_LIMIT", false, "unreserved"}, + {"REBUILD", false, "unreserved"}, + {"RECOVER", false, "unreserved"}, + {"REDUNDANT", false, "unreserved"}, + {"RELOAD", false, "unreserved"}, + {"REMOVE", false, "unreserved"}, + {"REORGANIZE", false, "unreserved"}, + {"REPAIR", false, "unreserved"}, + {"REPEATABLE", false, "unreserved"}, + {"REPLICA", false, "unreserved"}, + {"REPLICAS", false, "unreserved"}, + {"REPLICATION", false, "unreserved"}, + {"REQUIRED", false, "unreserved"}, + {"RESOURCE", false, "unreserved"}, + {"RESPECT", false, "unreserved"}, + {"RESTART", false, "unreserved"}, + {"RESTORE", false, "unreserved"}, + {"RESTORES", false, "unreserved"}, + {"RESUME", false, "unreserved"}, + {"REUSE", false, "unreserved"}, + {"REVERSE", false, "unreserved"}, + {"ROLE", false, "unreserved"}, + {"ROLLBACK", false, "unreserved"}, + {"ROLLUP", false, "unreserved"}, + {"ROUTINE", false, "unreserved"}, + {"ROW_COUNT", false, "unreserved"}, + {"ROW_FORMAT", false, "unreserved"}, + {"RTREE", false, "unreserved"}, + {"SAN", false, "unreserved"}, + {"SAVEPOINT", false, "unreserved"}, + {"SECOND", false, "unreserved"}, + {"SECONDARY", false, "unreserved"}, + {"SECONDARY_ENGINE", false, "unreserved"}, + {"SECONDARY_LOAD", false, "unreserved"}, + {"SECONDARY_UNLOAD", false, "unreserved"}, + {"SECURITY", false, "unreserved"}, + {"SEND_CREDENTIALS_TO_TIKV", false, "unreserved"}, + {"SEPARATOR", false, "unreserved"}, + {"SEQUENCE", false, "unreserved"}, + {"SERIAL", false, "unreserved"}, + {"SERIALIZABLE", false, "unreserved"}, + {"SESSION", false, "unreserved"}, + {"SETVAL", false, "unreserved"}, + {"SHARD_ROW_ID_BITS", false, "unreserved"}, + {"SHARE", false, "unreserved"}, + {"SHARED", false, "unreserved"}, + {"SHUTDOWN", false, "unreserved"}, + {"SIGNED", false, "unreserved"}, + {"SIMPLE", false, "unreserved"}, + {"SKIP", false, "unreserved"}, + {"SKIP_SCHEMA_FILES", false, "unreserved"}, + {"SLAVE", false, "unreserved"}, + {"SLOW", false, "unreserved"}, + {"SNAPSHOT", false, "unreserved"}, + {"SOME", false, "unreserved"}, + {"SOURCE", false, "unreserved"}, + {"SQL_BUFFER_RESULT", false, "unreserved"}, + {"SQL_CACHE", false, "unreserved"}, + {"SQL_NO_CACHE", false, "unreserved"}, + {"SQL_TSI_DAY", false, "unreserved"}, + {"SQL_TSI_HOUR", false, "unreserved"}, + {"SQL_TSI_MINUTE", false, "unreserved"}, + {"SQL_TSI_MONTH", false, "unreserved"}, + {"SQL_TSI_QUARTER", false, "unreserved"}, + {"SQL_TSI_SECOND", false, "unreserved"}, + {"SQL_TSI_WEEK", false, "unreserved"}, + {"SQL_TSI_YEAR", false, "unreserved"}, + {"START", false, "unreserved"}, + {"STATS_AUTO_RECALC", false, "unreserved"}, + {"STATS_COL_CHOICE", false, "unreserved"}, + {"STATS_COL_LIST", false, "unreserved"}, + {"STATS_OPTIONS", false, "unreserved"}, + {"STATS_PERSISTENT", false, "unreserved"}, + {"STATS_SAMPLE_PAGES", false, "unreserved"}, + {"STATS_SAMPLE_RATE", false, "unreserved"}, + {"STATUS", false, "unreserved"}, + {"STORAGE", false, "unreserved"}, + {"STRICT_FORMAT", false, "unreserved"}, + {"SUBJECT", false, "unreserved"}, + {"SUBPARTITION", false, "unreserved"}, + {"SUBPARTITIONS", false, "unreserved"}, + {"SUPER", false, "unreserved"}, + {"SWAPS", false, "unreserved"}, + {"SWITCHES", false, "unreserved"}, + {"SYSTEM", false, "unreserved"}, + {"SYSTEM_TIME", false, "unreserved"}, + {"TABLES", false, "unreserved"}, + {"TABLESPACE", false, "unreserved"}, + {"TABLE_CHECKSUM", false, "unreserved"}, + {"TEMPORARY", false, "unreserved"}, + {"TEMPTABLE", false, "unreserved"}, + {"TEXT", false, "unreserved"}, + {"THAN", false, "unreserved"}, + {"TIKV_IMPORTER", false, "unreserved"}, + {"TIME", false, "unreserved"}, + {"TIMESTAMP", false, "unreserved"}, + {"TOKEN_ISSUER", false, "unreserved"}, + {"TPCC", false, "unreserved"}, + {"TPCH_10", false, "unreserved"}, + {"TRACE", false, "unreserved"}, + {"TRADITIONAL", false, "unreserved"}, + {"TRANSACTION", false, "unreserved"}, + {"TRIGGERS", false, "unreserved"}, + {"TRUNCATE", false, "unreserved"}, + {"TSO", false, "unreserved"}, + {"TTL", false, "unreserved"}, + {"TTL_ENABLE", false, "unreserved"}, + {"TTL_JOB_INTERVAL", false, "unreserved"}, + {"TYPE", false, "unreserved"}, + {"UNBOUNDED", false, "unreserved"}, + {"UNCOMMITTED", false, "unreserved"}, + {"UNDEFINED", false, "unreserved"}, + {"UNICODE", false, "unreserved"}, + {"UNKNOWN", false, "unreserved"}, + {"UNSET", false, "unreserved"}, + {"USER", false, "unreserved"}, + {"VALIDATION", false, "unreserved"}, + {"VALUE", false, "unreserved"}, + {"VARIABLES", false, "unreserved"}, + {"VIEW", false, "unreserved"}, + {"VISIBLE", false, "unreserved"}, + {"WAIT", false, "unreserved"}, + {"WARNINGS", false, "unreserved"}, + {"WEEK", false, "unreserved"}, + {"WEIGHT_STRING", false, "unreserved"}, + {"WITHOUT", false, "unreserved"}, + {"WORKLOAD", false, "unreserved"}, + {"X509", false, "unreserved"}, + {"YEAR", false, "unreserved"}, + {"ADMIN", false, "tidb"}, + {"BATCH", false, "tidb"}, + {"BUCKETS", false, "tidb"}, + {"BUILTINS", false, "tidb"}, + {"CANCEL", false, "tidb"}, + {"CARDINALITY", false, "tidb"}, + {"CMSKETCH", false, "tidb"}, + {"COLUMN_STATS_USAGE", false, "tidb"}, + {"CORRELATION", false, "tidb"}, + {"DDL", false, "tidb"}, + {"DEPENDENCY", false, "tidb"}, + {"DEPTH", false, "tidb"}, + {"DRAINER", false, "tidb"}, + {"DRY", false, "tidb"}, + {"HISTOGRAMS_IN_FLIGHT", false, "tidb"}, + {"JOB", false, "tidb"}, + {"JOBS", false, "tidb"}, + {"NODE_ID", false, "tidb"}, + {"NODE_STATE", false, "tidb"}, + {"OPTIMISTIC", false, "tidb"}, + {"PESSIMISTIC", false, "tidb"}, + {"PUMP", false, "tidb"}, + {"REGION", false, "tidb"}, + {"REGIONS", false, "tidb"}, + {"RESET", false, "tidb"}, + {"RUN", false, "tidb"}, + {"SAMPLERATE", false, "tidb"}, + {"SAMPLES", false, "tidb"}, + {"SESSION_STATES", false, "tidb"}, + {"SPLIT", false, "tidb"}, + {"STATISTICS", false, "tidb"}, + {"STATS", false, "tidb"}, + {"STATS_BUCKETS", false, "tidb"}, + {"STATS_HEALTHY", false, "tidb"}, + {"STATS_HISTOGRAMS", false, "tidb"}, + {"STATS_LOCKED", false, "tidb"}, + {"STATS_META", false, "tidb"}, + {"STATS_TOPN", false, "tidb"}, + {"TELEMETRY", false, "tidb"}, + {"TELEMETRY_ID", false, "tidb"}, + {"TIDB", false, "tidb"}, + {"TIFLASH", false, "tidb"}, + {"TOPN", false, "tidb"}, + {"WIDTH", false, "tidb"}, +} diff --git a/pkg/parser/keywords_test.go b/pkg/parser/keywords_test.go new file mode 100644 index 0000000000000..2cfb7be092c00 --- /dev/null +++ b/pkg/parser/keywords_test.go @@ -0,0 +1,57 @@ +// Copyright 2023 PingCAP, 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +package parser_test + +import ( + "testing" + + "github.com/pingcap/tidb/pkg/parser" + "github.com/stretchr/testify/require" +) + +func TestKeywords(t *testing.T) { + // Test for the first keyword + require.Equal(t, "ADD", parser.Keywords[0].Word) + require.Equal(t, true, parser.Keywords[0].Reserved) + + // Make sure TiDBKeywords are included. + found := false + for _, kw := range parser.Keywords { + if kw.Word == "ADMIN" { + found = true + } + } + require.Equal(t, found, true, "TiDBKeyword ADMIN is part of the list") +} + +func TestKeywordsLength(t *testing.T) { + require.Equal(t, 646, len(parser.Keywords)) + + reservedNr := 0 + for _, kw := range parser.Keywords { + if kw.Reserved { + reservedNr += 1 + } + } + require.Equal(t, 233, reservedNr) +} + +func TestKeywordsSorting(t *testing.T) { + for i, kw := range parser.Keywords { + if i > 1 && parser.Keywords[i-1].Word > kw.Word && parser.Keywords[i-1].Section == kw.Section { + t.Errorf("%s should come after %s, please update parser.y and re-generate keywords.go\n", + parser.Keywords[i-1].Word, kw.Word) + } + } +} diff --git a/pkg/parser/main_test.go b/pkg/parser/main_test.go index edde620bc825c..6134c27b92c9c 100644 --- a/pkg/parser/main_test.go +++ b/pkg/parser/main_test.go @@ -21,7 +21,13 @@ import ( ) func TestMain(m *testing.M) { - goleak.VerifyTestMain(m) + opts := []goleak.Option{ + goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), + goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), + goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), + } + goleak.VerifyTestMain(m, opts...) } // WindowFuncTokenMapForTest exports windowFuncTokenMap in test-case diff --git a/pkg/parser/misc.go b/pkg/parser/misc.go index d772c17dfbd62..ea70855152d88 100644 --- a/pkg/parser/misc.go +++ b/pkg/parser/misc.go @@ -29,6 +29,17 @@ func isIdentExtend(ch byte) bool { return ch >= 0x80 } +// See https://dev.mysql.com/doc/refman/5.7/en/identifiers.html +func isInCorrectIdentifierName(name string) bool { + if len(name) == 0 { + return true + } + if name[len(name)-1] == ' ' { + return true + } + return false +} + // Initialize a lookup table for isUserVarChar var isUserVarCharTable [256]bool @@ -492,7 +503,6 @@ var tokenMap = map[string]int{ "LOCAL": local, "LOCALTIME": localTime, "LOCALTIMESTAMP": localTs, - "LOCAL_ONLY": local_only, "LOCATION": location, "LOCK": lock, "LOCKED": locked, @@ -848,6 +858,7 @@ var tokenMap = map[string]int{ "UNKNOWN": unknown, "UNLOCK": unlock, "UNLIMITED": unlimited, + "UNSET": unset, "UNSIGNED": unsigned, "UNTIL": until, "UNTIL_TS": untilTS, diff --git a/pkg/parser/model/BUILD.bazel b/pkg/parser/model/BUILD.bazel index e1c9fab9fea24..7078d14a5670c 100644 --- a/pkg/parser/model/BUILD.bazel +++ b/pkg/parser/model/BUILD.bazel @@ -30,7 +30,7 @@ go_test( ], embed = [":model"], flaky = True, - shard_count = 20, + shard_count = 21, deps = [ "//pkg/parser/charset", "//pkg/parser/mysql", diff --git a/pkg/parser/model/ddl.go b/pkg/parser/model/ddl.go index f0aa1af73e1c8..3af2b1da3132f 100644 --- a/pkg/parser/model/ddl.go +++ b/pkg/parser/model/ddl.go @@ -90,23 +90,25 @@ const ( ActionModifySchemaDefaultPlacement ActionType = 55 ActionAlterTablePlacement ActionType = 56 ActionAlterCacheTable ActionType = 57 - ActionAlterTableStatsOptions ActionType = 58 - ActionAlterNoCacheTable ActionType = 59 - ActionCreateTables ActionType = 60 - ActionMultiSchemaChange ActionType = 61 - ActionFlashbackCluster ActionType = 62 - ActionRecoverSchema ActionType = 63 - ActionReorganizePartition ActionType = 64 - ActionAlterTTLInfo ActionType = 65 - ActionAlterTTLRemove ActionType = 67 - ActionCreateResourceGroup ActionType = 68 - ActionAlterResourceGroup ActionType = 69 - ActionDropResourceGroup ActionType = 70 - ActionAlterTablePartitioning ActionType = 71 - ActionRemovePartitioning ActionType = 72 + // not used + ActionAlterTableStatsOptions ActionType = 58 + ActionAlterNoCacheTable ActionType = 59 + ActionCreateTables ActionType = 60 + ActionMultiSchemaChange ActionType = 61 + ActionFlashbackCluster ActionType = 62 + ActionRecoverSchema ActionType = 63 + ActionReorganizePartition ActionType = 64 + ActionAlterTTLInfo ActionType = 65 + ActionAlterTTLRemove ActionType = 67 + ActionCreateResourceGroup ActionType = 68 + ActionAlterResourceGroup ActionType = 69 + ActionDropResourceGroup ActionType = 70 + ActionAlterTablePartitioning ActionType = 71 + ActionRemovePartitioning ActionType = 72 ) -var actionMap = map[ActionType]string{ +// ActionMap is the map of DDL ActionType to string. +var ActionMap = map[ActionType]string{ ActionCreateSchema: "create schema", ActionDropSchema: "drop schema", ActionCreateTable: "create table", @@ -180,9 +182,113 @@ var actionMap = map[ActionType]string{ __DEPRECATED_ActionAlterTableAlterPartition: "alter partition", } +// DDLBDRType is the type for DDL when BDR enable. +type DDLBDRType string + +const ( + // UnsafeDDL means the DDL can't be executed by user when cluster is Primary/Secondary. + UnsafeDDL DDLBDRType = "unsafe DDL" + // SafeDDL means the DDL can be executed by user when cluster is Primary. + SafeDDL DDLBDRType = "safe DDL" + // UnmanagementDDL means the DDL can't be synced by CDC. + UnmanagementDDL DDLBDRType = "unmanagement DDL" + // UnknownDDL means the DDL is unknown. + UnknownDDL DDLBDRType = "unknown DDL" +) + +// ActionBDRMap is the map of DDL ActionType to DDLBDRType. +var ActionBDRMap = map[ActionType]DDLBDRType{} + +// BDRActionMap is the map of DDLBDRType to ActionType (reversed from ActionBDRMap). +var BDRActionMap = map[DDLBDRType][]ActionType{ + SafeDDL: { + ActionCreateSchema, + ActionCreateTable, + ActionAddColumn, // add a new column to table if it’s nullable or with default value. + ActionAddIndex, //add non-unique index + ActionDropIndex, + ActionModifyColumn, // add or update comments for column, change default values of one particular column + ActionSetDefaultValue, + ActionModifyTableComment, + ActionRenameIndex, + ActionAddTablePartition, + ActionDropPrimaryKey, + ActionAlterIndexVisibility, + ActionCreateTables, + ActionAlterTTLInfo, + ActionAlterTTLRemove, + ActionCreateView, + ActionDropView, + }, + UnsafeDDL: { + ActionDropSchema, + ActionDropTable, + ActionDropColumn, + ActionAddForeignKey, + ActionDropForeignKey, + ActionTruncateTable, + ActionRebaseAutoID, + ActionRenameTable, + ActionShardRowID, + ActionDropTablePartition, + ActionModifyTableCharsetAndCollate, + ActionTruncateTablePartition, + ActionRecoverTable, + ActionModifySchemaCharsetAndCollate, + ActionLockTable, + ActionUnlockTable, + ActionRepairTable, + ActionSetTiFlashReplica, + ActionUpdateTiFlashReplicaStatus, + ActionAddPrimaryKey, + ActionCreateSequence, + ActionAlterSequence, + ActionDropSequence, + ActionModifyTableAutoIdCache, + ActionRebaseAutoRandomBase, + ActionExchangeTablePartition, + ActionAddCheckConstraint, + ActionDropCheckConstraint, + ActionAlterCheckConstraint, + ActionRenameTables, + ActionAlterTableAttributes, + ActionAlterTablePartitionAttributes, + ActionAlterTablePartitionPlacement, + ActionModifySchemaDefaultPlacement, + ActionAlterTablePlacement, + ActionAlterCacheTable, + ActionAlterTableStatsOptions, + ActionAlterNoCacheTable, + ActionMultiSchemaChange, + ActionFlashbackCluster, + ActionRecoverSchema, + ActionReorganizePartition, + ActionAlterTablePartitioning, + ActionRemovePartitioning, + }, + UnmanagementDDL: { + ActionCreatePlacementPolicy, + ActionAlterPlacementPolicy, + ActionDropPlacementPolicy, + ActionCreateResourceGroup, + ActionAlterResourceGroup, + ActionDropResourceGroup, + }, + UnknownDDL: { + __DEPRECATED_ActionAlterTableAlterPartition, + }, +} + +const ( + // TiDBDDLV1 is the version 1 of DDL. + TiDBDDLV1 int64 = iota + 1 + // TiDBDDLV2 is the version 2 of DDL. + TiDBDDLV2 +) + // String return current ddl action in string func (action ActionType) String() string { - if v, ok := actionMap[action]; ok { + if v, ok := ActionMap[action]; ok { return v } return "none" @@ -355,6 +461,7 @@ func (sub *SubJob) ToProxyJob(parentJob *Job, seq int) Job { Collate: parentJob.Collate, AdminOperator: parentJob.AdminOperator, TraceInfo: parentJob.TraceInfo, + LocalMode: parentJob.LocalMode, } } @@ -442,14 +549,43 @@ type Job struct { // Collate is the collation the DDL Job is created. Collate string `json:"collate"` + // InvolvingSchemaInfo indicates the schema info involved in the job. + // nil means fallback to use job.SchemaName/TableName. + // Keep unchanged after initialization. + InvolvingSchemaInfo []InvolvingSchemaInfo `json:"involving_schema_info,omitempty"` + // AdminOperator indicates where the Admin command comes, by the TiDB // itself (AdminCommandBySystem) or by user (AdminCommandByEndUser). AdminOperator AdminCommandOperator `json:"admin_operator"` // TraceInfo indicates the information for SQL tracing TraceInfo *TraceInfo `json:"trace_info"` + + // BDRRole indicates the role of BDR cluster when executing this DDL. + BDRRole string `json:"bdr_role"` + + // CDCWriteSource indicates the source of CDC write. + CDCWriteSource uint64 `json:"cdc_write_source"` + + // LocalMode indicates whether the job is running in local TiDB. + // Only happens when tidb_ddl_version = 2. + LocalMode bool `json:"local_mode"` } +// InvolvingSchemaInfo returns the schema info involved in the job. +// The value should be stored in lower case. +type InvolvingSchemaInfo struct { + Database string `json:"database"` + Table string `json:"table"` +} + +const ( + // InvolvingAll means all schemas/tables are affected. + InvolvingAll = "*" + // InvolvingNone means no schema/table is affected. + InvolvingNone = "" +) + // FinishTableJob is called when a job is finished. // It updates the job's state information and adds tblInfo to the binlog. func (job *Job) FinishTableJob(jobState JobState, schemaState SchemaState, ver int64, tblInfo *TableInfo) { @@ -608,8 +744,8 @@ func (job *Job) DecodeArgs(args ...interface{}) error { // String implements fmt.Stringer interface. func (job *Job) String() string { rowCount := job.GetRowCount() - ret := fmt.Sprintf("ID:%d, Type:%s, State:%s, SchemaState:%s, SchemaID:%d, TableID:%d, RowCount:%d, ArgLen:%d, start time: %v, Err:%v, ErrCount:%d, SnapshotVersion:%v", - job.ID, job.Type, job.State, job.SchemaState, job.SchemaID, job.TableID, rowCount, len(job.Args), TSConvert2Time(job.StartTS), job.Error, job.ErrorCount, job.SnapshotVer) + ret := fmt.Sprintf("ID:%d, Type:%s, State:%s, SchemaState:%s, SchemaID:%d, TableID:%d, RowCount:%d, ArgLen:%d, start time: %v, Err:%v, ErrCount:%d, SnapshotVersion:%v, LocalMode: %t", + job.ID, job.Type, job.State, job.SchemaState, job.SchemaID, job.TableID, rowCount, len(job.Args), TSConvert2Time(job.StartTS), job.Error, job.ErrorCount, job.SnapshotVer, job.LocalMode) if job.ReorgMeta != nil { warnings, _ := job.GetWarnings() ret += fmt.Sprintf(", UniqueWarnings:%d", len(warnings)) @@ -866,6 +1002,16 @@ func (job *Job) IsRollbackable() bool { return true } +// GetInvolvingSchemaInfo returns the schema info involved in the job. +func (job *Job) GetInvolvingSchemaInfo() []InvolvingSchemaInfo { + if len(job.InvolvingSchemaInfo) > 0 { + return job.InvolvingSchemaInfo + } + return []InvolvingSchemaInfo{ + {Database: job.SchemaName, Table: job.TableName}, + } +} + // JobState is for job state. type JobState int32 @@ -1000,3 +1146,11 @@ type AffectedOption struct { OldTableID int64 `json:"old_table_id"` OldSchemaID int64 `json:"old_schema_id"` } + +func init() { + for bdrType, v := range BDRActionMap { + for _, action := range v { + ActionBDRMap[action] = bdrType + } + } +} diff --git a/pkg/parser/model/ddl_test.go b/pkg/parser/model/ddl_test.go index 66550b407c578..0020f7fabe6d3 100644 --- a/pkg/parser/model/ddl_test.go +++ b/pkg/parser/model/ddl_test.go @@ -50,7 +50,7 @@ func TestJobSize(t *testing.T) { - SubJob.ToProxyJob() ` job := model.Job{} - require.Equal(t, 336, int(unsafe.Sizeof(job)), msg) + require.Equal(t, 392, int(unsafe.Sizeof(job)), msg) } func TestBackfillMetaCodec(t *testing.T) { @@ -104,3 +104,17 @@ func TestMayNeedReorg(t *testing.T) { require.False(t, job.MayNeedReorg()) } } + +func TestActionBDRMap(t *testing.T) { + require.Equal(t, len(model.ActionMap), len(model.ActionBDRMap)) + + totalActions := 0 + for bdrType, actions := range model.BDRActionMap { + for _, action := range actions { + require.Equal(t, bdrType, model.ActionBDRMap[action], "action %s", action) + } + totalActions += len(actions) + } + + require.Equal(t, totalActions, len(model.ActionBDRMap)) +} diff --git a/pkg/parser/model/model.go b/pkg/parser/model/model.go index bd5e3ad493509..831bb85946b77 100644 --- a/pkg/parser/model/model.go +++ b/pkg/parser/model/model.go @@ -493,9 +493,9 @@ type TableInfo struct { // Because auto increment ID has schemaID as prefix, // We need to save original schemaID to keep autoID unchanged // while renaming a table from one database to another. - // TODO: Remove it. - // Now it only uses for compatibility with the old version that already uses this field. - OldSchemaID int64 `json:"old_schema_id,omitempty"` + // Only set if table has been renamed across schemas + // Old name 'old_schema_id' is kept for backwards compatibility + AutoIDSchemaID int64 `json:"old_schema_id,omitempty"` // ShardRowIDBits specify if the implicit row ID is sharded. ShardRowIDBits uint64 @@ -543,6 +543,12 @@ type TableInfo struct { TTLInfo *TTLInfo `json:"ttl_info"` } +// TableNameInfo provides meta data describing a table name info. +type TableNameInfo struct { + ID int64 `json:"id"` + Name CIStr `json:"name"` +} + // SepAutoInc decides whether _rowid and auto_increment id use separate allocator. func (t *TableInfo) SepAutoInc() bool { return t.Version >= TableInfoVersion5 && t.AutoIdCache == 1 @@ -718,11 +724,10 @@ func (t *TableInfo) GetUpdateTime() time.Time { return TSConvert2Time(t.UpdateTS) } -// GetDBID returns the schema ID that is used to create an allocator. -// TODO: Remove it after removing OldSchemaID. -func (t *TableInfo) GetDBID(dbID int64) int64 { - if t.OldSchemaID != 0 { - return t.OldSchemaID +// GetAutoIDSchemaID returns the schema ID that was used to create an allocator. +func (t *TableInfo) GetAutoIDSchemaID(dbID int64) int64 { + if t.AutoIDSchemaID != 0 { + return t.AutoIDSchemaID } return dbID } diff --git a/pkg/parser/model/model_test.go b/pkg/parser/model/model_test.go index e5cc71034fb25..907efffc8d045 100644 --- a/pkg/parser/model/model_test.go +++ b/pkg/parser/model/model_test.go @@ -222,7 +222,7 @@ func TestJobStartTime(t *testing.T) { BinlogInfo: &HistoryInfo{}, } require.Equal(t, TSConvert2Time(job.StartTS), time.Unix(0, 0)) - require.Equal(t, fmt.Sprintf("ID:123, Type:none, State:none, SchemaState:none, SchemaID:0, TableID:0, RowCount:0, ArgLen:0, start time: %s, Err:, ErrCount:0, SnapshotVersion:0", time.Unix(0, 0)), job.String()) + require.Equal(t, fmt.Sprintf("ID:123, Type:none, State:none, SchemaState:none, SchemaID:0, TableID:0, RowCount:0, ArgLen:0, start time: %s, Err:, ErrCount:0, SnapshotVersion:0, LocalMode: false", time.Unix(0, 0)), job.String()) } func TestJobCodec(t *testing.T) { diff --git a/pkg/parser/parser.go b/pkg/parser/parser.go index 892adb56dfd92..901f0f9bd8941 100644 --- a/pkg/parser/parser.go +++ b/pkg/parser/parser.go @@ -86,386 +86,385 @@ const ( assignmentEq = 58160 attribute = 57606 attributes = 57607 - autoIdCache = 57612 - autoIncrement = 57613 - autoRandom = 57614 - autoRandomBase = 57615 - avg = 57616 - avgRowLength = 57617 - backend = 57618 - background = 58081 - backup = 57619 - backups = 57620 + autoIdCache = 57608 + autoIncrement = 57609 + autoRandom = 57610 + autoRandomBase = 57611 + avg = 57612 + avgRowLength = 57613 + backend = 57614 + background = 57969 + backup = 57615 + backups = 57616 batch = 58084 - bdr = 57621 - begin = 57622 - bernoulli = 57623 + bdr = 57617 + begin = 57618 + bernoulli = 57619 between = 57371 bigIntType = 57372 binaryType = 57373 - binding = 57624 - bindingCache = 57625 - bindings = 57626 - binlog = 57627 - bitAnd = 57969 + binding = 57620 + bindingCache = 57622 + bindings = 57621 + binlog = 57623 + bitAnd = 57970 bitLit = 58158 - bitOr = 57970 - bitType = 57628 - bitXor = 57971 + bitOr = 57971 + bitType = 57624 + bitXor = 57972 blobType = 57374 - block = 57629 - boolType = 57631 - booleanType = 57630 + block = 57625 + boolType = 57626 + booleanType = 57627 both = 57375 - bound = 57972 - br = 57973 - briefType = 57974 - btree = 57632 + bound = 57973 + br = 57974 + briefType = 57975 + btree = 57628 buckets = 58085 - builtinApproxCountDistinct = 58132 - builtinApproxPercentile = 58133 - builtinBitAnd = 58127 - builtinBitOr = 58128 - builtinBitXor = 58129 - builtinCast = 58130 - builtinCount = 58131 - builtinCurDate = 58134 - builtinCurTime = 58135 - builtinDateAdd = 58136 - builtinDateSub = 58137 - builtinExtract = 58138 - builtinGroupConcat = 58139 - builtinMax = 58140 - builtinMin = 58141 - builtinNow = 58142 - builtinPosition = 58143 - builtinStddevPop = 58147 - builtinStddevSamp = 58148 - builtinSubstring = 58144 - builtinSum = 58145 - builtinSysDate = 58146 - builtinTranslate = 58149 - builtinTrim = 58150 - builtinUser = 58151 - builtinVarPop = 58152 - builtinVarSamp = 58153 - builtins = 58086 - burstable = 57975 + builtinApproxCountDistinct = 58086 + builtinApproxPercentile = 58087 + builtinBitAnd = 58088 + builtinBitOr = 58089 + builtinBitXor = 58090 + builtinCast = 58091 + builtinCount = 58092 + builtinCurDate = 58093 + builtinCurTime = 58094 + builtinDateAdd = 58095 + builtinDateSub = 58096 + builtinExtract = 58097 + builtinGroupConcat = 58098 + builtinMax = 58099 + builtinMin = 58100 + builtinNow = 58101 + builtinPosition = 58102 + builtinStddevPop = 58104 + builtinStddevSamp = 58105 + builtinSubstring = 58106 + builtinSum = 58107 + builtinSysDate = 58108 + builtinTranslate = 58109 + builtinTrim = 58110 + builtinUser = 58111 + builtinVarPop = 58112 + builtinVarSamp = 58113 + builtins = 58103 + burstable = 57976 by = 57376 - byteType = 57633 - cache = 57634 - calibrate = 57635 + byteType = 57629 + cache = 57630 + calibrate = 57631 call = 57377 - cancel = 58087 - capture = 57636 - cardinality = 58088 + cancel = 58114 + capture = 57632 + cardinality = 58115 cascade = 57378 - cascaded = 57637 + cascaded = 57633 caseKwd = 57379 - cast = 57976 - causal = 57638 - chain = 57639 + cast = 57977 + causal = 57634 + chain = 57635 change = 57380 - charType = 57382 - character = 57381 - charsetKwd = 57640 + charType = 57381 + character = 57382 + charsetKwd = 57636 check = 57383 - checkpoint = 57641 - checksum = 57642 - cipher = 57643 - cleanup = 57644 - client = 57645 - clientErrorsSummary = 57646 - close = 57672 - cluster = 57673 - clustered = 57674 - cmSketch = 58089 - coalesce = 57647 + checkpoint = 57637 + checksum = 57638 + cipher = 57639 + cleanup = 57640 + client = 57641 + clientErrorsSummary = 57642 + close = 57643 + cluster = 57644 + clustered = 57645 + cmSketch = 58116 + coalesce = 57646 collate = 57384 - collation = 57648 + collation = 57647 column = 57385 columnFormat = 57649 - columnStatsUsage = 58090 - columns = 57650 - comment = 57652 - commit = 57653 - committed = 57654 - compact = 57655 - compressed = 57656 - compression = 57657 - concurrency = 57658 - config = 57651 - connection = 57659 - consistency = 57660 - consistent = 57661 + columnStatsUsage = 58117 + columns = 57648 + comment = 57650 + commit = 57651 + committed = 57652 + compact = 57653 + compressed = 57654 + compression = 57655 + concurrency = 57656 + config = 57657 + connection = 57658 + consistency = 57659 + consistent = 57660 constraint = 57386 constraints = 57978 - context = 57662 + context = 57661 continueKwd = 57387 convert = 57388 - cooldown = 58077 - copyKwd = 57977 - correlation = 58091 - cpu = 57663 + cooldown = 57979 + copyKwd = 57980 + correlation = 58118 + cpu = 57662 create = 57389 createTableSelect = 58183 cross = 57390 - csvBackslashEscape = 57664 - csvDelimiter = 57665 - csvHeader = 57666 - csvNotNull = 57667 - csvNull = 57668 - csvSeparator = 57669 - csvTrimLastSeparators = 57670 + csvBackslashEscape = 57663 + csvDelimiter = 57664 + csvHeader = 57665 + csvNotNull = 57666 + csvNull = 57667 + csvSeparator = 57668 + csvTrimLastSeparators = 57669 cumeDist = 57391 - curDate = 57980 - curTime = 57979 - current = 57671 + curDate = 57981 + curTime = 57982 + current = 57670 currentDate = 57392 - currentRole = 57396 - currentTime = 57393 - currentTs = 57394 - currentUser = 57395 + currentRole = 57393 + currentTime = 57394 + currentTs = 57395 + currentUser = 57396 cursor = 57397 - cycle = 57675 - data = 57676 + cycle = 57671 + data = 57672 database = 57398 databases = 57399 - dateAdd = 57981 - dateSub = 57982 - dateType = 57678 - datetimeType = 57677 - day = 57679 + dateAdd = 57983 + dateSub = 57984 + dateType = 57673 + datetimeType = 57674 + day = 57675 dayHour = 57400 dayMicrosecond = 57401 dayMinute = 57402 daySecond = 57403 - ddl = 58092 - deallocate = 57680 + ddl = 58119 + deallocate = 57676 decLit = 58155 decimalType = 57404 - declare = 57681 + declare = 57677 defaultKwd = 57405 - defined = 57983 - definer = 57682 - delayKeyWrite = 57683 + defined = 57985 + definer = 57678 + delayKeyWrite = 57679 delayed = 57406 deleteKwd = 57407 denseRank = 57408 - dependency = 58093 - depth = 58094 + dependency = 58120 + depth = 58121 desc = 57409 describe = 57410 - digest = 57684 - directory = 57685 - disable = 57686 - disabled = 57687 - discard = 57688 - disk = 57689 + digest = 57680 + directory = 57681 + disable = 57682 + disabled = 57683 + discard = 57684 + disk = 57685 distinct = 57411 distinctRow = 57412 div = 57413 - do = 57690 - dotType = 57984 + do = 57686 + dotType = 57986 doubleAtIdentifier = 57355 doubleType = 57414 - drainer = 58095 + drainer = 58122 drop = 57415 - dry = 58096 - dryRun = 58076 + dry = 58123 + dryRun = 57987 dual = 57416 - dump = 57985 - duplicate = 57691 - dynamic = 57692 - elseIfKwd = 57417 - elseKwd = 57418 + dump = 57988 + duplicate = 57687 + dynamic = 57688 + elseIfKwd = 57418 + elseKwd = 57417 empty = 58173 - enable = 57693 - enabled = 57694 + enable = 57689 + enabled = 57690 enclosed = 57419 - encryption = 57695 - end = 57696 - endTime = 57987 - enforced = 57697 - engine = 57698 - engines = 57699 - enum = 57700 + encryption = 57691 + end = 57692 + endTime = 57989 + enforced = 57693 + engine = 57694 + engines = 57695 + enum = 57696 eq = 58161 yyErrCode = 57345 - errorKwd = 57701 - escape = 57702 + errorKwd = 57697 + escape = 57699 escaped = 57420 - event = 57703 - events = 57704 - evolve = 57705 - exact = 57988 - except = 57424 - exchange = 57706 - exclusive = 57707 - execElapsed = 58075 - execute = 57708 - exists = 57421 - exit = 57422 - expansion = 57709 - expire = 57710 - explain = 57423 - exprPushdownBlacklist = 57989 - extended = 57711 - extract = 57990 - failedLoginAttempts = 57964 + event = 57700 + events = 57701 + evolve = 57702 + exact = 57990 + except = 57421 + exchange = 57703 + exclusive = 57704 + execElapsed = 57991 + execute = 57705 + exists = 57422 + exit = 57423 + expansion = 57706 + expire = 57707 + explain = 57424 + exprPushdownBlacklist = 57992 + extended = 57708 + extract = 57993 + failedLoginAttempts = 57709 falseKwd = 57425 - faultsSym = 57712 + faultsSym = 57710 fetch = 57426 - fields = 57713 - file = 57714 - first = 57715 + fields = 57711 + file = 57712 + first = 57713 firstValue = 57427 - fixed = 57716 - flashback = 57991 + fixed = 57714 + flashback = 57994 float4Type = 57429 float8Type = 57430 floatLit = 58154 floatType = 57428 - flush = 57717 - follower = 57992 - followerConstraints = 57993 - followers = 57994 - following = 57719 + flush = 57715 + follower = 57995 + followerConstraints = 57996 + followers = 57997 + following = 57716 forKwd = 57431 force = 57432 foreign = 57433 - format = 57720 + format = 57717 found = 57718 from = 57434 - full = 57721 - fullBackupStorage = 57995 + full = 57719 + fullBackupStorage = 57998 fulltext = 57435 - function = 57722 - gcTTL = 57997 + function = 57720 + gcTTL = 57999 ge = 58162 - general = 57723 + general = 57721 generated = 57436 - getFormat = 57996 - global = 57724 + getFormat = 58000 + global = 57722 grant = 57437 - grants = 57725 + grants = 57723 group = 57438 - groupConcat = 57998 + groupConcat = 58001 groups = 57439 - handler = 57726 - hash = 57727 + handler = 57724 + hash = 57725 having = 57440 - help = 57728 + help = 57726 hexLit = 58157 - high = 58070 + high = 58002 highPriority = 57441 higherThanComma = 58198 higherThanParenthese = 58192 hintComment = 57357 - histogram = 57729 - histogramsInFlight = 58116 - history = 57730 - hosts = 57731 - hour = 57732 + histogram = 57727 + histogramsInFlight = 58124 + history = 57728 + hosts = 57729 + hour = 57730 hourMicrosecond = 57442 hourMinute = 57443 hourSecond = 57444 - hypo = 57868 - identSQLErrors = 57734 - identified = 57733 + hypo = 57731 + identSQLErrors = 57698 + identified = 57732 identifier = 57346 ifKwd = 57445 ignore = 57446 - ilike = 57477 - importKwd = 57735 - imports = 57736 - in = 57447 - increment = 57737 - incremental = 57738 - index = 57448 - indexes = 57739 - infile = 57449 - inner = 57450 - inout = 57451 - inplace = 58000 - insert = 57458 - insertMethod = 57740 + ilike = 57447 + importKwd = 57733 + imports = 57734 + in = 57448 + increment = 57735 + incremental = 57736 + index = 57449 + indexes = 57737 + infile = 57450 + inner = 57451 + inout = 57452 + inplace = 58003 + insert = 57453 + insertMethod = 57738 insertValues = 58181 - instance = 57741 - instant = 58001 - int1Type = 57460 - int2Type = 57461 - int3Type = 57462 - int4Type = 57463 - int8Type = 57464 + instance = 57739 + instant = 58004 + int1Type = 57455 + int2Type = 57456 + int3Type = 57457 + int4Type = 57458 + int8Type = 57459 intLit = 58156 - intType = 57459 - integerType = 57452 - internal = 58002 - intersect = 57453 - interval = 57454 - into = 57455 + intType = 57454 + integerType = 57460 + internal = 58005 + intersect = 57461 + interval = 57462 + into = 57463 invalid = 57356 - invisible = 57742 - invoker = 57743 - io = 57744 - ioReadBandwidth = 58073 - ioWriteBandwidth = 58074 - ipc = 57745 - is = 57457 - isolation = 57746 - issuer = 57747 + invisible = 57740 + invoker = 57741 + io = 57742 + ioReadBandwidth = 58006 + ioWriteBandwidth = 58007 + ipc = 57743 + is = 57464 + isolation = 57744 + issuer = 57745 iterate = 57465 - job = 58098 - jobs = 58097 + job = 58125 + jobs = 58126 join = 57466 - jsonArrayagg = 58003 - jsonObjectAgg = 58004 - jsonType = 57748 + jsonArrayagg = 58008 + jsonObjectAgg = 58009 + jsonType = 57746 jss = 58164 juss = 58165 key = 57467 - keyBlockSize = 57749 + keyBlockSize = 57747 keys = 57468 kill = 57469 - labels = 57750 + labels = 57748 lag = 57470 - language = 57751 - last = 57752 - lastBackup = 57753 + language = 57749 + last = 57750 + lastBackup = 57752 lastValue = 57471 - lastval = 57754 + lastval = 57751 le = 58163 lead = 57472 - leader = 58005 - leaderConstraints = 58006 + leader = 58010 + leaderConstraints = 58011 leading = 57473 - learner = 58007 - learnerConstraints = 58008 - learners = 58009 + learner = 58012 + learnerConstraints = 58013 + learners = 58014 leave = 57474 left = 57475 - less = 57755 - level = 57756 + less = 57753 + level = 57754 like = 57476 - limit = 57478 - linear = 57480 + limit = 57477 + linear = 57478 lines = 57479 - list = 57757 - load = 57481 - local = 57758 - localTime = 57482 - localTs = 57483 - local_only = 57759 - location = 57761 - lock = 57484 - locked = 57760 - log = 58010 - logs = 57762 - long = 57580 + list = 57755 + load = 57480 + local = 57756 + localTime = 57481 + localTs = 57482 + location = 57757 + lock = 57483 + locked = 57758 + log = 58015 + logs = 57759 + long = 57484 longblobType = 57485 longtextType = 57486 - low = 58072 + low = 58016 lowPriority = 57487 lowerThanCharsetKwd = 58184 lowerThanComma = 58197 @@ -487,1234 +486,1235 @@ const ( lowerThanWith = 58176 lowerThenOrder = 58188 lsh = 58166 - master = 57763 + master = 57760 match = 57488 - max = 58012 - maxConnectionsPerHour = 57766 - maxQueriesPerHour = 57767 - maxRows = 57768 - maxUpdatesPerHour = 57769 - maxUserConnections = 57770 + max = 58017 + maxConnectionsPerHour = 57761 + maxQueriesPerHour = 57764 + maxRows = 57765 + maxUpdatesPerHour = 57766 + maxUserConnections = 57767 maxValue = 57489 - max_idxnum = 57764 - max_minutes = 57765 - mb = 57771 - medium = 58071 + max_idxnum = 57762 + max_minutes = 57763 + mb = 57768 + medium = 58018 mediumIntType = 57491 mediumblobType = 57490 mediumtextType = 57492 - member = 57772 + member = 57769 memberof = 57350 - memory = 57773 - merge = 57774 - metadata = 58013 - microsecond = 57775 + memory = 57770 + merge = 57771 + metadata = 58019 + microsecond = 57772 middleIntType = 57493 - min = 58011 - minRows = 57776 - minValue = 57778 - minute = 57777 + min = 58020 + minRows = 57775 + minValue = 57774 + minute = 57773 minuteMicrosecond = 57494 minuteSecond = 57495 mod = 57496 - mode = 57779 - modify = 57780 - month = 57781 - names = 57782 - national = 57783 - natural = 57595 - ncharType = 57784 + mode = 57776 + modify = 57777 + month = 57778 + names = 57779 + national = 57780 + natural = 57497 + ncharType = 57781 neg = 58195 neq = 58167 neqSynonym = 58168 - never = 57785 - next = 57786 - next_row_id = 57999 - nextval = 57787 - no = 57788 - noWriteToBinLog = 57498 - nocache = 57789 - nocycle = 57790 - nodeID = 58099 - nodeState = 58100 - nodegroup = 57791 - nomaxvalue = 57792 - nominvalue = 57793 - nonclustered = 57794 - none = 57795 - not = 57497 + never = 57782 + next = 57783 + next_row_id = 58021 + nextval = 57784 + no = 57785 + noWriteToBinLog = 57499 + nocache = 57786 + nocycle = 57787 + nodeID = 58127 + nodeState = 58128 + nodegroup = 57788 + nomaxvalue = 57789 + nominvalue = 57790 + nonclustered = 57791 + none = 57792 + not = 57498 not2 = 58172 - now = 58014 - nowait = 57796 - nthValue = 57499 - ntile = 57500 - null = 57501 + now = 58022 + nowait = 57793 + nthValue = 57500 + ntile = 57501 + null = 57502 nulleq = 58169 - nulls = 57798 - numericType = 57502 - nvarcharType = 57797 + nulls = 57794 + numericType = 57503 + nvarcharType = 57795 odbcDateType = 57360 odbcTimeType = 57361 odbcTimestampType = 57362 - of = 57503 - off = 57799 - offset = 57800 - oltpReadOnly = 57801 - oltpReadWrite = 57802 - oltpWriteOnly = 57803 - on = 57504 - onDuplicate = 57805 - online = 57806 - only = 57807 - open = 57808 - optRuleBlacklist = 58015 - optimistic = 58101 - optimize = 57505 - option = 57506 - optional = 57809 - optionally = 57507 + of = 57504 + off = 57796 + offset = 57797 + oltpReadOnly = 57798 + oltpReadWrite = 57799 + oltpWriteOnly = 57800 + on = 57505 + onDuplicate = 57803 + online = 57801 + only = 57802 + open = 57804 + optRuleBlacklist = 58023 + optimistic = 58129 + optimize = 57506 + option = 57507 + optional = 57805 + optionally = 57508 optionallyEnclosedBy = 57351 - or = 57508 - order = 57509 - out = 57510 - outer = 57511 - outfile = 57456 - over = 57512 - packKeys = 57810 - pageSym = 57811 + or = 57509 + order = 57510 + out = 57511 + outer = 57512 + outfile = 57513 + over = 57514 + packKeys = 57806 + pageSym = 57807 paramMarker = 58170 - parser = 57812 - partial = 57813 - partition = 57513 - partitioning = 57814 - partitions = 57815 - password = 57816 - passwordLockTime = 57965 - pause = 57817 - per_db = 57819 - per_table = 57820 - percent = 57818 - percentRank = 57514 - pessimistic = 58102 + parser = 57808 + partial = 57809 + partition = 57515 + partitioning = 57810 + partitions = 57811 + password = 57812 + passwordLockTime = 57813 + pause = 57814 + per_db = 57816 + per_table = 57817 + percent = 57815 + percentRank = 57516 + pessimistic = 58130 pipes = 57359 - pipesAsOr = 57821 - placement = 58016 - plan = 58017 - planCache = 58018 - plugins = 57822 - point = 57823 - policy = 57824 - position = 58019 + pipesAsOr = 57818 + placement = 58024 + plan = 58026 + planCache = 58025 + plugins = 57819 + point = 57820 + policy = 57821 + position = 58027 preSplitRegions = 57825 - preceding = 57826 - precisionType = 57515 - predicate = 58020 - prepare = 57827 - preserve = 57828 - primary = 57516 - primaryRegion = 58021 - priority = 58069 - privileges = 57829 - procedure = 57517 - process = 57830 - processlist = 57831 - profile = 57832 - profiles = 57833 - proxy = 57834 - pump = 58103 - purge = 57835 - quarter = 57836 - queries = 57837 - query = 57838 - queryLimit = 58080 - quick = 57839 - rangeKwd = 57518 - rank = 57519 - rateLimit = 57840 - read = 57520 - realType = 57521 - rebuild = 57841 - recent = 58022 - recover = 57842 - recursive = 57522 - redundant = 57843 - references = 57523 - regexpKwd = 57524 - region = 58126 - regions = 58125 - release = 57525 - reload = 57844 - remove = 57845 - rename = 57526 - reorganize = 57846 - repair = 57847 - repeat = 57527 - repeatable = 57848 - replace = 57528 - replayer = 58023 - replica = 57849 - replicas = 57850 - replication = 57851 - require = 57529 - required = 57852 - reset = 58124 - resource = 57853 - respect = 57854 - restart = 57855 - restore = 57856 - restoredTS = 58024 - restores = 57857 - restrict = 57530 - resume = 57858 - reuse = 57859 - reverse = 57860 - revoke = 57531 - right = 57532 - rlike = 57533 - role = 57861 - rollback = 57862 - rollup = 57863 - routine = 57864 - row = 57534 - rowCount = 57865 - rowFormat = 57866 - rowNumber = 57536 - rows = 57535 + preceding = 57822 + precisionType = 57517 + predicate = 58028 + prepare = 57823 + preserve = 57824 + primary = 57518 + primaryRegion = 58029 + priority = 58030 + privileges = 57826 + procedure = 57519 + process = 57827 + processlist = 57828 + profile = 57829 + profiles = 57830 + proxy = 57831 + pump = 58131 + purge = 57832 + quarter = 57833 + queries = 57834 + query = 57835 + queryLimit = 58031 + quick = 57836 + rangeKwd = 57520 + rank = 57521 + rateLimit = 57837 + read = 57522 + realType = 57523 + rebuild = 57838 + recent = 58032 + recover = 57839 + recursive = 57524 + redundant = 57840 + references = 57525 + regexpKwd = 57526 + region = 58132 + regions = 58133 + release = 57527 + reload = 57841 + remove = 57842 + rename = 57528 + reorganize = 57843 + repair = 57844 + repeat = 57529 + repeatable = 57845 + replace = 57530 + replayer = 58033 + replica = 57846 + replicas = 57847 + replication = 57848 + require = 57531 + required = 57849 + reset = 58134 + resource = 57850 + respect = 57851 + restart = 57852 + restore = 57853 + restoredTS = 58034 + restores = 57854 + restrict = 57532 + resume = 57855 + reuse = 57856 + reverse = 57857 + revoke = 57533 + right = 57534 + rlike = 57535 + role = 57858 + rollback = 57859 + rollup = 57860 + routine = 57861 + row = 57536 + rowCount = 57862 + rowFormat = 57863 + rowNumber = 57538 + rows = 57537 rsh = 58171 - rtree = 57867 - ruRate = 58068 - run = 58104 - running = 58025 - s3 = 58026 - sampleRate = 58106 - samples = 58105 - san = 57869 - savepoint = 57870 - schedule = 58027 - second = 57871 - secondMicrosecond = 57537 - secondary = 57872 - secondaryEngine = 57873 - secondaryLoad = 57874 - secondaryUnload = 57875 - security = 57876 - selectKwd = 57538 - sendCredentialsToTiKV = 57877 - separator = 57878 - sequence = 57879 - serial = 57880 - serializable = 57881 - session = 57882 - sessionStates = 58107 - set = 57539 - setval = 57883 - shardRowIDBits = 57884 - share = 57885 - shared = 57886 - show = 57540 - shutdown = 57887 - signed = 57888 - similar = 58079 - simple = 57889 + rtree = 57864 + ruRate = 58036 + run = 58135 + running = 58035 + s3 = 58037 + sampleRate = 58136 + samples = 58137 + san = 57865 + savepoint = 57866 + schedule = 58038 + second = 57867 + secondMicrosecond = 57539 + secondary = 57868 + secondaryEngine = 57869 + secondaryLoad = 57870 + secondaryUnload = 57871 + security = 57872 + selectKwd = 57540 + sendCredentialsToTiKV = 57873 + separator = 57874 + sequence = 57875 + serial = 57876 + serializable = 57877 + session = 57878 + sessionStates = 58138 + set = 57541 + setval = 57879 + shardRowIDBits = 57880 + share = 57881 + shared = 57882 + show = 57542 + shutdown = 57883 + signed = 57884 + similar = 58039 + simple = 57885 singleAtIdentifier = 57354 - skip = 57890 - skipSchemaFiles = 57891 - slave = 57892 - slow = 57893 - smallIntType = 57541 - snapshot = 57894 - some = 57895 - source = 57896 - spatial = 57542 - split = 58122 - sql = 57543 - sqlBigResult = 57544 - sqlBufferResult = 57897 - sqlCache = 57898 - sqlCalcFoundRows = 57545 - sqlNoCache = 57899 - sqlSmallResult = 57546 - sqlTsiDay = 57900 - sqlTsiHour = 57901 - sqlTsiMinute = 57902 - sqlTsiMonth = 57903 - sqlTsiQuarter = 57904 - sqlTsiSecond = 57905 - sqlTsiWeek = 57906 - sqlTsiYear = 57907 - sqlexception = 57547 - sqlstate = 57548 - sqlwarning = 57549 - ssl = 57550 - staleness = 58028 - start = 57908 - startTS = 58030 - startTime = 58029 - starting = 57551 - statistics = 58108 - stats = 58109 - statsAutoRecalc = 57909 - statsBuckets = 58112 - statsColChoice = 57610 - statsColList = 57611 - statsExtended = 57552 - statsHealthy = 58113 - statsHistograms = 58111 - statsLocked = 58115 - statsMeta = 58110 - statsOptions = 57608 - statsPersistent = 57910 - statsSamplePages = 57911 - statsSampleRate = 57609 - statsTopN = 58114 + skip = 57886 + skipSchemaFiles = 57887 + slave = 57888 + slow = 57889 + smallIntType = 57543 + snapshot = 57890 + some = 57891 + source = 57892 + spatial = 57544 + split = 58139 + sql = 57545 + sqlBigResult = 57549 + sqlBufferResult = 57893 + sqlCache = 57894 + sqlCalcFoundRows = 57550 + sqlNoCache = 57895 + sqlSmallResult = 57551 + sqlTsiDay = 57896 + sqlTsiHour = 57897 + sqlTsiMinute = 57898 + sqlTsiMonth = 57899 + sqlTsiQuarter = 57900 + sqlTsiSecond = 57901 + sqlTsiWeek = 57902 + sqlTsiYear = 57903 + sqlexception = 57546 + sqlstate = 57547 + sqlwarning = 57548 + ssl = 57552 + staleness = 58040 + start = 57904 + startTS = 58042 + startTime = 58041 + starting = 57553 + statistics = 58140 + stats = 58141 + statsAutoRecalc = 57905 + statsBuckets = 58142 + statsColChoice = 57906 + statsColList = 57907 + statsExtended = 57554 + statsHealthy = 58143 + statsHistograms = 58144 + statsLocked = 58145 + statsMeta = 58146 + statsOptions = 57908 + statsPersistent = 57909 + statsSamplePages = 57910 + statsSampleRate = 57911 + statsTopN = 58147 status = 57912 - std = 58031 - stddev = 58032 - stddevPop = 58033 - stddevSamp = 58034 - stop = 58035 + std = 58046 + stddev = 58043 + stddevPop = 58044 + stddevSamp = 58045 + stop = 58047 storage = 57913 - stored = 57557 - straightJoin = 57553 - strict = 58036 + stored = 57555 + straightJoin = 57556 + strict = 58048 strictFormat = 57914 stringLit = 57353 - strong = 58037 - subDate = 58038 + strong = 58049 + subDate = 58050 subject = 57915 subpartition = 57916 subpartitions = 57917 - substring = 58040 - sum = 58039 + substring = 58051 + sum = 58052 super = 57918 - survivalPreferences = 58041 + survivalPreferences = 58053 swaps = 57919 switchesSym = 57920 system = 57921 systemTime = 57922 - tableChecksum = 57923 - tableKwd = 57555 + tableChecksum = 57925 + tableKwd = 57557 tableRefPriority = 58190 - tableSample = 57556 - tables = 57924 - tablespace = 57925 - target = 58042 - taskTypes = 58043 - telemetry = 58117 - telemetryID = 58118 + tableSample = 57558 + tables = 57923 + tablespace = 57924 + target = 58054 + taskTypes = 58055 + telemetry = 58148 + telemetryID = 58149 temporary = 57926 temptable = 57927 - terminated = 57558 + terminated = 57559 textType = 57928 than = 57929 - then = 57559 - tiFlash = 58120 - tidb = 58119 - tidbCurrentTSO = 57554 - tidbJson = 58044 + then = 57560 + tiFlash = 58151 + tidb = 58150 + tidbCurrentTSO = 57568 + tidbJson = 58056 tikvImporter = 57930 - timeDuration = 57986 - timeType = 57932 - timestampAdd = 58045 - timestampDiff = 58046 - timestampType = 57931 - tinyIntType = 57561 - tinyblobType = 57560 - tinytextType = 57562 - tls = 58047 - to = 57563 + timeDuration = 58057 + timeType = 57931 + timestampAdd = 58058 + timestampDiff = 58059 + timestampType = 57932 + tinyIntType = 57562 + tinyblobType = 57561 + tinytextType = 57563 + tls = 58060 + to = 57564 toTSO = 57349 toTimestamp = 57348 tokenIssuer = 57933 - tokudbDefault = 58048 - tokudbFast = 58049 - tokudbLzma = 58050 - tokudbQuickLZ = 58051 - tokudbSmall = 58053 - tokudbSnappy = 58052 - tokudbUncompressed = 58054 - tokudbZlib = 58055 - tokudbZstd = 58056 - top = 58057 - topn = 58121 - tp = 57934 - tpcc = 57935 - tpch10 = 57804 + tokudbDefault = 58061 + tokudbFast = 58062 + tokudbLzma = 58063 + tokudbQuickLZ = 58064 + tokudbSmall = 58065 + tokudbSnappy = 58066 + tokudbUncompressed = 58067 + tokudbZlib = 58068 + tokudbZstd = 58069 + top = 58070 + topn = 58152 + tp = 57945 + tpcc = 57934 + tpch10 = 57935 trace = 57936 traditional = 57937 - trailing = 57564 + trailing = 57565 transaction = 57938 - trigger = 57565 + trigger = 57566 triggers = 57939 - trim = 58058 - trueCardCost = 58064 - trueKwd = 57566 + trim = 58071 + trueCardCost = 58072 + trueKwd = 57567 truncate = 57940 tsoType = 57941 ttl = 57942 ttlEnable = 57943 ttlJobInterval = 57944 - unbounded = 57945 - uncommitted = 57946 - undefined = 57947 + unbounded = 57946 + uncommitted = 57947 + undefined = 57948 underscoreCS = 57352 - unicodeSym = 57948 - union = 57568 - unique = 57567 - unknown = 57949 - unlimited = 58082 - unlock = 57569 - unsigned = 57570 - until = 57571 - untilTS = 58059 - update = 57572 - usage = 57573 - use = 57574 - user = 57950 - using = 57575 - utcDate = 57576 - utcTime = 57578 - utcTimestamp = 57577 - validation = 57951 - value = 57952 - values = 57579 - varPop = 58061 - varSamp = 58062 - varbinaryType = 57583 - varcharType = 57581 - varcharacter = 57582 - variables = 57953 - variance = 58060 - varying = 57584 - verboseType = 58063 - view = 57954 - virtual = 57585 - visible = 57955 - voter = 58065 - voterConstraints = 58066 - voters = 58067 - wait = 57963 - warnings = 57956 - watch = 58078 - week = 57957 - weightString = 57958 - when = 57586 - where = 57587 - while = 57588 - width = 58123 + unicodeSym = 57949 + union = 57569 + unique = 57570 + unknown = 57950 + unlimited = 58073 + unlock = 57571 + unset = 57951 + unsigned = 57572 + until = 57573 + untilTS = 58074 + update = 57574 + usage = 57575 + use = 57576 + user = 57952 + using = 57577 + utcDate = 57578 + utcTime = 57579 + utcTimestamp = 57580 + validation = 57953 + value = 57954 + values = 57581 + varPop = 58076 + varSamp = 58077 + varbinaryType = 57582 + varcharType = 57583 + varcharacter = 57584 + variables = 57955 + variance = 58075 + varying = 57585 + verboseType = 58078 + view = 57956 + virtual = 57586 + visible = 57957 + voter = 58081 + voterConstraints = 58079 + voters = 58080 + wait = 57958 + warnings = 57959 + watch = 58082 + week = 57960 + weightString = 57961 + when = 57587 + where = 57588 + while = 57589 + width = 58153 window = 57590 with = 57591 - without = 57959 - workload = 57960 - write = 57589 - x509 = 57961 - xor = 57592 - yearMonth = 57593 - yearType = 57962 - zerofill = 57594 + without = 57962 + workload = 57963 + write = 57592 + x509 = 57964 + xor = 57593 + yearMonth = 57594 + yearType = 57965 + zerofill = 57595 yyMaxDepth = 200 - yyTabOfs = -2870 + yyTabOfs = -2876 ) var ( yyXLAT = map[int]int{ - 59: 0, // ';' (2519x) - 57344: 1, // $end (2506x) - 57845: 2, // remove (1996x) - 58122: 3, // split (1996x) - 57774: 4, // merge (1995x) - 57846: 5, // reorganize (1994x) - 57652: 6, // comment (1987x) - 57913: 7, // storage (1899x) - 57613: 8, // autoIncrement (1888x) - 44: 9, // ',' (1862x) - 57715: 10, // first (1787x) - 57599: 11, // after (1781x) - 57880: 12, // serial (1777x) - 57614: 13, // autoRandom (1776x) - 57649: 14, // columnFormat (1776x) - 57816: 15, // password (1748x) - 57640: 16, // charsetKwd (1740x) - 57642: 17, // checksum (1730x) - 58016: 18, // placement (1727x) - 57749: 19, // keyBlockSize (1711x) - 57925: 20, // tablespace (1707x) - 57695: 21, // encryption (1705x) - 57676: 22, // data (1703x) - 57698: 23, // engine (1702x) - 57740: 24, // insertMethod (1698x) - 57768: 25, // maxRows (1698x) - 57776: 26, // minRows (1698x) - 57791: 27, // nodegroup (1698x) - 57659: 28, // connection (1690x) - 57615: 29, // autoRandomBase (1687x) - 58112: 30, // statsBuckets (1685x) - 58114: 31, // statsTopN (1685x) - 57942: 32, // ttl (1685x) - 57612: 33, // autoIdCache (1684x) - 57617: 34, // avgRowLength (1684x) - 57657: 35, // compression (1684x) - 57683: 36, // delayKeyWrite (1684x) - 57810: 37, // packKeys (1684x) - 57825: 38, // preSplitRegions (1684x) - 57866: 39, // rowFormat (1684x) - 57873: 40, // secondaryEngine (1684x) - 57884: 41, // shardRowIDBits (1684x) - 57909: 42, // statsAutoRecalc (1684x) - 57610: 43, // statsColChoice (1684x) - 57611: 44, // statsColList (1684x) - 57910: 45, // statsPersistent (1684x) - 57911: 46, // statsSamplePages (1684x) - 57609: 47, // statsSampleRate (1684x) - 57923: 48, // tableChecksum (1684x) - 57943: 49, // ttlEnable (1684x) - 57944: 50, // ttlJobInterval (1684x) - 57853: 51, // resource (1662x) - 57606: 52, // attribute (1635x) - 57596: 53, // account (1633x) - 57964: 54, // failedLoginAttempts (1633x) - 57965: 55, // passwordLockTime (1633x) - 57346: 56, // identifier (1632x) - 41: 57, // ')' (1628x) - 57858: 58, // resume (1620x) - 57888: 59, // signed (1620x) - 57894: 60, // snapshot (1618x) - 57618: 61, // backend (1617x) - 57641: 62, // checkpoint (1617x) - 57658: 63, // concurrency (1617x) - 57664: 64, // csvBackslashEscape (1617x) - 57665: 65, // csvDelimiter (1617x) - 57666: 66, // csvHeader (1617x) - 57667: 67, // csvNotNull (1617x) - 57668: 68, // csvNull (1617x) - 57669: 69, // csvSeparator (1617x) - 57670: 70, // csvTrimLastSeparators (1617x) - 57995: 71, // fullBackupStorage (1617x) - 57997: 72, // gcTTL (1617x) - 57753: 73, // lastBackup (1617x) - 57805: 74, // onDuplicate (1617x) - 57806: 75, // online (1617x) - 57840: 76, // rateLimit (1617x) - 58024: 77, // restoredTS (1617x) - 57877: 78, // sendCredentialsToTiKV (1617x) - 57891: 79, // skipSchemaFiles (1617x) - 58030: 80, // startTS (1617x) - 57914: 81, // strictFormat (1617x) - 57930: 82, // tikvImporter (1617x) - 58059: 83, // untilTS (1617x) - 57622: 84, // begin (1611x) - 57653: 85, // commit (1611x) - 57788: 86, // no (1611x) - 57862: 87, // rollback (1611x) - 57908: 88, // start (1609x) - 57940: 89, // truncate (1608x) - 57634: 90, // cache (1606x) - 57789: 91, // nocache (1605x) - 57808: 92, // open (1605x) - 57597: 93, // action (1604x) - 57672: 94, // close (1604x) - 57675: 95, // cycle (1604x) - 57778: 96, // minValue (1604x) - 57696: 97, // end (1603x) - 57737: 98, // increment (1603x) - 57790: 99, // nocycle (1603x) - 57792: 100, // nomaxvalue (1603x) - 57793: 101, // nominvalue (1603x) - 57602: 102, // algorithm (1601x) - 57855: 103, // restart (1601x) - 57934: 104, // tp (1601x) - 57674: 105, // clustered (1600x) - 57742: 106, // invisible (1600x) - 57794: 107, // nonclustered (1600x) - 58125: 108, // regions (1600x) - 57955: 109, // visible (1600x) - 58081: 110, // background (1598x) - 57975: 111, // burstable (1598x) - 58069: 112, // priority (1598x) - 58080: 113, // queryLimit (1598x) - 58068: 114, // ruRate (1598x) - 57916: 115, // subpartition (1596x) - 57815: 116, // partitions (1595x) - 58017: 117, // plan (1595x) - 57962: 118, // yearType (1595x) - 57978: 119, // constraints (1593x) - 57993: 120, // followerConstraints (1593x) - 57994: 121, // followers (1593x) - 58006: 122, // leaderConstraints (1593x) - 58008: 123, // learnerConstraints (1593x) - 58009: 124, // learners (1593x) - 58021: 125, // primaryRegion (1593x) - 58027: 126, // schedule (1593x) - 57907: 127, // sqlTsiYear (1593x) - 58041: 128, // survivalPreferences (1593x) - 58066: 129, // voterConstraints (1593x) - 58067: 130, // voters (1593x) - 57650: 131, // columns (1591x) - 57954: 132, // view (1591x) - 57679: 133, // day (1590x) - 58078: 134, // watch (1589x) - 57983: 135, // defined (1588x) - 58075: 136, // execElapsed (1588x) - 57871: 137, // second (1588x) - 57732: 138, // hour (1587x) - 57775: 139, // microsecond (1587x) - 57777: 140, // minute (1587x) - 57781: 141, // month (1587x) - 57836: 142, // quarter (1587x) - 57900: 143, // sqlTsiDay (1587x) - 57901: 144, // sqlTsiHour (1587x) - 57902: 145, // sqlTsiMinute (1587x) - 57903: 146, // sqlTsiMonth (1587x) - 57904: 147, // sqlTsiQuarter (1587x) - 57905: 148, // sqlTsiSecond (1587x) - 57906: 149, // sqlTsiWeek (1587x) - 57957: 150, // week (1587x) - 57605: 151, // ascii (1586x) - 57633: 152, // byteType (1586x) - 57948: 153, // unicodeSym (1586x) - 57713: 154, // fields (1585x) - 57912: 155, // status (1585x) - 57762: 156, // logs (1584x) - 57924: 157, // tables (1584x) - 57986: 158, // timeDuration (1584x) - 57838: 159, // query (1582x) - 57878: 160, // separator (1582x) - 57643: 161, // cipher (1581x) - 57747: 162, // issuer (1581x) - 57766: 163, // maxConnectionsPerHour (1581x) - 57767: 164, // maxQueriesPerHour (1581x) - 57769: 165, // maxUpdatesPerHour (1581x) - 57770: 166, // maxUserConnections (1581x) - 57826: 167, // preceding (1581x) - 57869: 168, // san (1581x) - 57915: 169, // subject (1581x) - 57933: 170, // tokenIssuer (1581x) - 57987: 171, // endTime (1580x) - 57748: 172, // jsonType (1580x) - 57758: 173, // local (1580x) - 58029: 174, // startTime (1580x) - 57677: 175, // datetimeType (1579x) - 57678: 176, // dateType (1579x) - 57716: 177, // fixed (1579x) - 58098: 178, // job (1579x) - 57932: 179, // timeType (1579x) - 57626: 180, // bindings (1578x) - 57682: 181, // definer (1578x) - 57727: 182, // hash (1578x) - 57733: 183, // identified (1578x) - 57854: 184, // respect (1578x) - 57931: 185, // timestampType (1578x) - 57952: 186, // value (1578x) - 57619: 187, // backup (1577x) - 57630: 188, // booleanType (1577x) - 57671: 189, // current (1577x) - 57697: 190, // enforced (1577x) - 57719: 191, // following (1577x) - 57755: 192, // less (1577x) - 57999: 193, // next_row_id (1577x) - 57796: 194, // nowait (1577x) - 57807: 195, // only (1577x) - 57861: 196, // role (1577x) - 57870: 197, // savepoint (1577x) - 57890: 198, // skip (1577x) - 58043: 199, // taskTypes (1577x) - 57928: 200, // textType (1577x) - 57929: 201, // than (1577x) - 58120: 202, // tiFlash (1577x) - 57945: 203, // unbounded (1577x) - 57624: 204, // binding (1576x) - 57628: 205, // bitType (1576x) - 57631: 206, // boolType (1576x) - 57700: 207, // enum (1576x) - 57724: 208, // global (1576x) - 57868: 209, // hypo (1576x) - 57735: 210, // importKwd (1576x) - 57783: 211, // national (1576x) - 57784: 212, // ncharType (1576x) - 57797: 213, // nvarcharType (1576x) - 57800: 214, // offset (1576x) - 57824: 215, // policy (1576x) - 58020: 216, // predicate (1576x) - 57926: 217, // temporary (1576x) - 57950: 218, // user (1576x) - 57684: 219, // digest (1575x) - 58097: 220, // jobs (1575x) - 57761: 221, // location (1575x) - 58018: 222, // planCache (1575x) - 57827: 223, // prepare (1575x) - 57849: 224, // replica (1575x) - 58109: 225, // stats (1575x) - 57949: 226, // unknown (1575x) - 57963: 227, // wait (1575x) - 57632: 228, // btree (1574x) - 58077: 229, // cooldown (1574x) - 57681: 230, // declare (1574x) - 58076: 231, // dryRun (1574x) - 57720: 232, // format (1574x) - 57746: 233, // isolation (1574x) - 57752: 234, // last (1574x) - 57764: 235, // max_idxnum (1574x) - 57773: 236, // memory (1574x) - 57799: 237, // off (1574x) - 57809: 238, // optional (1574x) - 57819: 239, // per_db (1574x) - 57829: 240, // privileges (1574x) - 57852: 241, // required (1574x) - 57867: 242, // rtree (1574x) - 58106: 243, // sampleRate (1574x) - 57879: 244, // sequence (1574x) - 57882: 245, // session (1574x) - 57893: 246, // slow (1574x) - 57951: 247, // validation (1574x) - 57953: 248, // variables (1574x) - 57607: 249, // attributes (1573x) - 58087: 250, // cancel (1573x) - 57655: 251, // compact (1573x) - 58092: 252, // ddl (1573x) - 57686: 253, // disable (1573x) - 57690: 254, // do (1573x) - 57692: 255, // dynamic (1573x) - 57693: 256, // enable (1573x) - 57701: 257, // errorKwd (1573x) - 57988: 258, // exact (1573x) - 57717: 259, // flush (1573x) - 57721: 260, // full (1573x) - 57726: 261, // handler (1573x) - 57730: 262, // history (1573x) - 57771: 263, // mb (1573x) - 57779: 264, // mode (1573x) - 57786: 265, // next (1573x) - 57817: 266, // pause (1573x) - 57822: 267, // plugins (1573x) - 57831: 268, // processlist (1573x) - 57842: 269, // recover (1573x) - 57847: 270, // repair (1573x) - 57848: 271, // repeatable (1573x) - 58079: 272, // similar (1573x) - 58108: 273, // statistics (1573x) - 57917: 274, // subpartitions (1573x) - 58119: 275, // tidb (1573x) - 57959: 276, // without (1573x) - 58083: 277, // admin (1572x) - 58084: 278, // batch (1572x) - 57627: 279, // binlog (1572x) - 57629: 280, // block (1572x) - 57973: 281, // br (1572x) - 57974: 282, // briefType (1572x) - 58085: 283, // buckets (1572x) - 57635: 284, // calibrate (1572x) - 57636: 285, // capture (1572x) - 58088: 286, // cardinality (1572x) - 57639: 287, // chain (1572x) - 57646: 288, // clientErrorsSummary (1572x) - 58089: 289, // cmSketch (1572x) - 57647: 290, // coalesce (1572x) - 57656: 291, // compressed (1572x) - 57662: 292, // context (1572x) - 57977: 293, // copyKwd (1572x) - 58091: 294, // correlation (1572x) - 57663: 295, // cpu (1572x) - 57680: 296, // deallocate (1572x) - 58093: 297, // dependency (1572x) - 57685: 298, // directory (1572x) - 57688: 299, // discard (1572x) - 57689: 300, // disk (1572x) - 57984: 301, // dotType (1572x) - 58095: 302, // drainer (1572x) - 58096: 303, // dry (1572x) - 57691: 304, // duplicate (1572x) - 57706: 305, // exchange (1572x) - 57708: 306, // execute (1572x) - 57709: 307, // expansion (1572x) - 57991: 308, // flashback (1572x) - 57723: 309, // general (1572x) - 57728: 310, // help (1572x) - 58070: 311, // high (1572x) - 57729: 312, // histogram (1572x) - 57731: 313, // hosts (1572x) - 57734: 314, // identSQLErrors (1572x) - 58000: 315, // inplace (1572x) - 57741: 316, // instance (1572x) - 58001: 317, // instant (1572x) - 57745: 318, // ipc (1572x) - 57750: 319, // labels (1572x) - 57760: 320, // locked (1572x) - 58072: 321, // low (1572x) - 58071: 322, // medium (1572x) - 58013: 323, // metadata (1572x) - 57780: 324, // modify (1572x) - 58099: 325, // nodeID (1572x) - 58100: 326, // nodeState (1572x) - 57795: 327, // none (1572x) - 57798: 328, // nulls (1572x) - 57811: 329, // pageSym (1572x) - 58103: 330, // pump (1572x) - 57835: 331, // purge (1572x) - 57841: 332, // rebuild (1572x) - 57843: 333, // redundant (1572x) - 57844: 334, // reload (1572x) - 57856: 335, // restore (1572x) - 57864: 336, // routine (1572x) - 58026: 337, // s3 (1572x) - 58105: 338, // samples (1572x) - 57874: 339, // secondaryLoad (1572x) - 57875: 340, // secondaryUnload (1572x) - 57885: 341, // share (1572x) - 57887: 342, // shutdown (1572x) - 57896: 343, // source (1572x) - 57608: 344, // statsOptions (1572x) - 58035: 345, // stop (1572x) - 57919: 346, // swaps (1572x) - 58044: 347, // tidbJson (1572x) - 58048: 348, // tokudbDefault (1572x) - 58049: 349, // tokudbFast (1572x) - 58050: 350, // tokudbLzma (1572x) - 58051: 351, // tokudbQuickLZ (1572x) - 58053: 352, // tokudbSmall (1572x) - 58052: 353, // tokudbSnappy (1572x) - 58054: 354, // tokudbUncompressed (1572x) - 58055: 355, // tokudbZlib (1572x) - 58056: 356, // tokudbZstd (1572x) - 58121: 357, // topn (1572x) - 57936: 358, // trace (1572x) - 57937: 359, // traditional (1572x) - 58064: 360, // trueCardCost (1572x) - 58082: 361, // unlimited (1572x) - 58063: 362, // verboseType (1572x) - 57956: 363, // warnings (1572x) - 57598: 364, // advise (1571x) - 57600: 365, // against (1571x) - 57601: 366, // ago (1571x) - 57603: 367, // always (1571x) - 57620: 368, // backups (1571x) - 57621: 369, // bdr (1571x) - 57623: 370, // bernoulli (1571x) - 57625: 371, // bindingCache (1571x) - 58086: 372, // builtins (1571x) - 57637: 373, // cascaded (1571x) - 57638: 374, // causal (1571x) - 57644: 375, // cleanup (1571x) - 57645: 376, // client (1571x) - 57673: 377, // cluster (1571x) - 57648: 378, // collation (1571x) - 58090: 379, // columnStatsUsage (1571x) - 57654: 380, // committed (1571x) - 57651: 381, // config (1571x) - 57660: 382, // consistency (1571x) - 57661: 383, // consistent (1571x) - 58094: 384, // depth (1571x) - 57687: 385, // disabled (1571x) - 57985: 386, // dump (1571x) - 57694: 387, // enabled (1571x) - 57699: 388, // engines (1571x) - 57704: 389, // events (1571x) - 57705: 390, // evolve (1571x) - 57710: 391, // expire (1571x) - 57989: 392, // exprPushdownBlacklist (1571x) - 57711: 393, // extended (1571x) - 57712: 394, // faultsSym (1571x) - 57718: 395, // found (1571x) - 57722: 396, // function (1571x) - 57725: 397, // grants (1571x) - 58116: 398, // histogramsInFlight (1571x) - 57738: 399, // incremental (1571x) - 57739: 400, // indexes (1571x) - 58002: 401, // internal (1571x) - 57743: 402, // invoker (1571x) - 57744: 403, // io (1571x) - 57751: 404, // language (1571x) - 57756: 405, // level (1571x) - 57757: 406, // list (1571x) - 57759: 407, // local_only (1571x) - 58010: 408, // log (1571x) - 57763: 409, // master (1571x) - 57765: 410, // max_minutes (1571x) - 57785: 411, // never (1571x) - 57787: 412, // nextval (1571x) - 57801: 413, // oltpReadOnly (1571x) - 57802: 414, // oltpReadWrite (1571x) - 57803: 415, // oltpWriteOnly (1571x) - 58101: 416, // optimistic (1571x) - 58015: 417, // optRuleBlacklist (1571x) - 57812: 418, // parser (1571x) - 57813: 419, // partial (1571x) - 57814: 420, // partitioning (1571x) - 57820: 421, // per_table (1571x) - 57818: 422, // percent (1571x) - 58102: 423, // pessimistic (1571x) - 57823: 424, // point (1571x) - 57828: 425, // preserve (1571x) - 57832: 426, // profile (1571x) - 57833: 427, // profiles (1571x) - 57837: 428, // queries (1571x) - 58022: 429, // recent (1571x) - 58126: 430, // region (1571x) - 58023: 431, // replayer (1571x) - 58124: 432, // reset (1571x) - 57857: 433, // restores (1571x) - 57859: 434, // reuse (1571x) - 57863: 435, // rollup (1571x) - 58104: 436, // run (1571x) - 57872: 437, // secondary (1571x) - 57876: 438, // security (1571x) - 57881: 439, // serializable (1571x) - 58107: 440, // sessionStates (1571x) - 57889: 441, // simple (1571x) - 57892: 442, // slave (1571x) - 58113: 443, // statsHealthy (1571x) - 58111: 444, // statsHistograms (1571x) - 58115: 445, // statsLocked (1571x) - 58110: 446, // statsMeta (1571x) - 57920: 447, // switchesSym (1571x) - 57921: 448, // system (1571x) - 57922: 449, // systemTime (1571x) - 58042: 450, // target (1571x) - 58118: 451, // telemetryID (1571x) - 57927: 452, // temptable (1571x) - 58047: 453, // tls (1571x) - 58057: 454, // top (1571x) - 57935: 455, // tpcc (1571x) - 57804: 456, // tpch10 (1571x) - 57938: 457, // transaction (1571x) - 57939: 458, // triggers (1571x) - 57946: 459, // uncommitted (1571x) - 57947: 460, // undefined (1571x) - 58123: 461, // width (1571x) - 57960: 462, // workload (1571x) - 57961: 463, // x509 (1571x) - 57966: 464, // addDate (1570x) - 57604: 465, // any (1570x) - 57967: 466, // approxCountDistinct (1570x) - 57968: 467, // approxPercentile (1570x) - 57616: 468, // avg (1570x) - 57969: 469, // bitAnd (1570x) - 57970: 470, // bitOr (1570x) - 57971: 471, // bitXor (1570x) - 57972: 472, // bound (1570x) - 57976: 473, // cast (1570x) - 57980: 474, // curDate (1570x) - 57979: 475, // curTime (1570x) - 57981: 476, // dateAdd (1570x) - 57982: 477, // dateSub (1570x) - 57702: 478, // escape (1570x) - 57703: 479, // event (1570x) - 57707: 480, // exclusive (1570x) - 57990: 481, // extract (1570x) - 57714: 482, // file (1570x) - 57992: 483, // follower (1570x) - 57996: 484, // getFormat (1570x) - 57998: 485, // groupConcat (1570x) - 57736: 486, // imports (1570x) - 58073: 487, // ioReadBandwidth (1570x) - 58074: 488, // ioWriteBandwidth (1570x) - 58003: 489, // jsonArrayagg (1570x) - 58004: 490, // jsonObjectAgg (1570x) - 57754: 491, // lastval (1570x) - 58005: 492, // leader (1570x) - 58007: 493, // learner (1570x) - 58012: 494, // max (1570x) - 57772: 495, // member (1570x) - 58011: 496, // min (1570x) - 57782: 497, // names (1570x) - 58014: 498, // now (1570x) - 58019: 499, // position (1570x) - 57830: 500, // process (1570x) - 57834: 501, // proxy (1570x) - 57839: 502, // quick (1570x) - 57850: 503, // replicas (1570x) - 57851: 504, // replication (1570x) - 57860: 505, // reverse (1570x) - 57865: 506, // rowCount (1570x) - 58025: 507, // running (1570x) - 57883: 508, // setval (1570x) - 57886: 509, // shared (1570x) - 57895: 510, // some (1570x) - 57897: 511, // sqlBufferResult (1570x) - 57898: 512, // sqlCache (1570x) - 57899: 513, // sqlNoCache (1570x) - 58028: 514, // staleness (1570x) - 58031: 515, // std (1570x) - 58032: 516, // stddev (1570x) - 58033: 517, // stddevPop (1570x) - 58034: 518, // stddevSamp (1570x) - 58036: 519, // strict (1570x) - 58037: 520, // strong (1570x) - 58038: 521, // subDate (1570x) - 58040: 522, // substring (1570x) - 58039: 523, // sum (1570x) - 57918: 524, // super (1570x) - 58117: 525, // telemetry (1570x) - 58045: 526, // timestampAdd (1570x) - 58046: 527, // timestampDiff (1570x) - 58058: 528, // trim (1570x) - 57941: 529, // tsoType (1570x) - 58060: 530, // variance (1570x) - 58061: 531, // varPop (1570x) - 58062: 532, // varSamp (1570x) - 58065: 533, // voter (1570x) - 57958: 534, // weightString (1570x) - 57504: 535, // on (1480x) - 40: 536, // '(' (1475x) - 57591: 537, // with (1346x) - 57353: 538, // stringLit (1333x) - 58172: 539, // not2 (1284x) - 57405: 540, // defaultKwd (1235x) - 57497: 541, // not (1215x) - 57369: 542, // as (1182x) - 57384: 543, // collate (1150x) - 57568: 544, // union (1140x) - 57475: 545, // left (1137x) - 57532: 546, // right (1137x) - 57575: 547, // using (1126x) - 43: 548, // '+' (1113x) - 45: 549, // '-' (1111x) - 57496: 550, // mod (1091x) - 57513: 551, // partition (1067x) - 57579: 552, // values (1046x) - 57501: 553, // null (1044x) - 57446: 554, // ignore (1035x) - 57424: 555, // except (1029x) - 57453: 556, // intersect (1028x) - 57528: 557, // replace (1021x) - 57382: 558, // charType (1017x) - 57426: 559, // fetch (1011x) - 57539: 560, // set (1003x) - 58161: 561, // eq (1002x) - 57478: 562, // limit (1002x) - 57431: 563, // forKwd (1000x) - 58156: 564, // intLit (995x) - 57455: 565, // into (994x) - 57434: 566, // from (992x) - 57484: 567, // lock (987x) - 57587: 568, // where (979x) - 57509: 569, // order (974x) - 57432: 570, // force (969x) - 57367: 571, // and (966x) - 57508: 572, // or (942x) - 57358: 573, // andand (941x) - 57821: 574, // pipesAsOr (941x) - 57592: 575, // xor (941x) - 57438: 576, // group (912x) - 57440: 577, // having (907x) - 57553: 578, // straightJoin (899x) - 57590: 579, // window (893x) - 57574: 580, // use (891x) - 57466: 581, // join (887x) - 57409: 582, // desc (882x) - 57445: 583, // ifKwd (878x) - 57476: 584, // like (877x) - 57595: 585, // natural (877x) - 57390: 586, // cross (876x) - 57423: 587, // explain (876x) - 57450: 588, // inner (876x) - 42: 589, // '*' (874x) - 125: 590, // '}' (873x) + 59: 0, // ';' (2525x) + 57344: 1, // $end (2512x) + 57842: 2, // remove (2001x) + 58139: 3, // split (2001x) + 57771: 4, // merge (2000x) + 57843: 5, // reorganize (1999x) + 57650: 6, // comment (1992x) + 57913: 7, // storage (1904x) + 57609: 8, // autoIncrement (1893x) + 44: 9, // ',' (1864x) + 57713: 10, // first (1792x) + 57599: 11, // after (1786x) + 57876: 12, // serial (1782x) + 57610: 13, // autoRandom (1781x) + 57649: 14, // columnFormat (1781x) + 57812: 15, // password (1753x) + 57636: 16, // charsetKwd (1745x) + 57638: 17, // checksum (1735x) + 58024: 18, // placement (1732x) + 57747: 19, // keyBlockSize (1716x) + 57924: 20, // tablespace (1712x) + 57691: 21, // encryption (1710x) + 57694: 22, // engine (1707x) + 57672: 23, // data (1705x) + 57738: 24, // insertMethod (1703x) + 57765: 25, // maxRows (1703x) + 57775: 26, // minRows (1703x) + 57788: 27, // nodegroup (1703x) + 57658: 28, // connection (1695x) + 57611: 29, // autoRandomBase (1692x) + 58142: 30, // statsBuckets (1690x) + 58147: 31, // statsTopN (1690x) + 57942: 32, // ttl (1690x) + 57608: 33, // autoIdCache (1689x) + 57613: 34, // avgRowLength (1689x) + 57655: 35, // compression (1689x) + 57679: 36, // delayKeyWrite (1689x) + 57806: 37, // packKeys (1689x) + 57825: 38, // preSplitRegions (1689x) + 57863: 39, // rowFormat (1689x) + 57869: 40, // secondaryEngine (1689x) + 57880: 41, // shardRowIDBits (1689x) + 57905: 42, // statsAutoRecalc (1689x) + 57906: 43, // statsColChoice (1689x) + 57907: 44, // statsColList (1689x) + 57909: 45, // statsPersistent (1689x) + 57910: 46, // statsSamplePages (1689x) + 57911: 47, // statsSampleRate (1689x) + 57925: 48, // tableChecksum (1689x) + 57943: 49, // ttlEnable (1689x) + 57944: 50, // ttlJobInterval (1689x) + 57850: 51, // resource (1667x) + 57606: 52, // attribute (1640x) + 57596: 53, // account (1638x) + 57709: 54, // failedLoginAttempts (1638x) + 57813: 55, // passwordLockTime (1638x) + 57346: 56, // identifier (1637x) + 41: 57, // ')' (1629x) + 57855: 58, // resume (1625x) + 57884: 59, // signed (1625x) + 57890: 60, // snapshot (1623x) + 57614: 61, // backend (1622x) + 57637: 62, // checkpoint (1622x) + 57656: 63, // concurrency (1622x) + 57663: 64, // csvBackslashEscape (1622x) + 57664: 65, // csvDelimiter (1622x) + 57665: 66, // csvHeader (1622x) + 57666: 67, // csvNotNull (1622x) + 57667: 68, // csvNull (1622x) + 57668: 69, // csvSeparator (1622x) + 57669: 70, // csvTrimLastSeparators (1622x) + 57998: 71, // fullBackupStorage (1622x) + 57999: 72, // gcTTL (1622x) + 57752: 73, // lastBackup (1622x) + 57803: 74, // onDuplicate (1622x) + 57801: 75, // online (1622x) + 57837: 76, // rateLimit (1622x) + 58034: 77, // restoredTS (1622x) + 57873: 78, // sendCredentialsToTiKV (1622x) + 57887: 79, // skipSchemaFiles (1622x) + 58042: 80, // startTS (1622x) + 57914: 81, // strictFormat (1622x) + 57930: 82, // tikvImporter (1622x) + 58074: 83, // untilTS (1622x) + 57618: 84, // begin (1616x) + 57651: 85, // commit (1616x) + 57785: 86, // no (1616x) + 57859: 87, // rollback (1616x) + 57904: 88, // start (1614x) + 57940: 89, // truncate (1613x) + 57630: 90, // cache (1611x) + 57786: 91, // nocache (1610x) + 57804: 92, // open (1610x) + 57597: 93, // action (1609x) + 57643: 94, // close (1609x) + 57671: 95, // cycle (1609x) + 57774: 96, // minValue (1609x) + 57692: 97, // end (1608x) + 57735: 98, // increment (1608x) + 57787: 99, // nocycle (1608x) + 57789: 100, // nomaxvalue (1608x) + 57790: 101, // nominvalue (1608x) + 57602: 102, // algorithm (1606x) + 57852: 103, // restart (1606x) + 57945: 104, // tp (1606x) + 57645: 105, // clustered (1605x) + 57740: 106, // invisible (1605x) + 57791: 107, // nonclustered (1605x) + 58133: 108, // regions (1605x) + 57957: 109, // visible (1605x) + 57969: 110, // background (1603x) + 57976: 111, // burstable (1603x) + 58030: 112, // priority (1603x) + 58031: 113, // queryLimit (1603x) + 58036: 114, // ruRate (1603x) + 57916: 115, // subpartition (1601x) + 57811: 116, // partitions (1600x) + 58026: 117, // plan (1600x) + 57965: 118, // yearType (1600x) + 57978: 119, // constraints (1598x) + 57996: 120, // followerConstraints (1598x) + 57997: 121, // followers (1598x) + 58011: 122, // leaderConstraints (1598x) + 58013: 123, // learnerConstraints (1598x) + 58014: 124, // learners (1598x) + 58029: 125, // primaryRegion (1598x) + 58038: 126, // schedule (1598x) + 57903: 127, // sqlTsiYear (1598x) + 58053: 128, // survivalPreferences (1598x) + 58079: 129, // voterConstraints (1598x) + 58080: 130, // voters (1598x) + 57648: 131, // columns (1596x) + 57733: 132, // importKwd (1596x) + 57956: 133, // view (1596x) + 57675: 134, // day (1595x) + 58082: 135, // watch (1594x) + 57985: 136, // defined (1593x) + 57991: 137, // execElapsed (1593x) + 57867: 138, // second (1593x) + 57912: 139, // status (1593x) + 57730: 140, // hour (1592x) + 57772: 141, // microsecond (1592x) + 57773: 142, // minute (1592x) + 57778: 143, // month (1592x) + 57833: 144, // quarter (1592x) + 57896: 145, // sqlTsiDay (1592x) + 57897: 146, // sqlTsiHour (1592x) + 57898: 147, // sqlTsiMinute (1592x) + 57899: 148, // sqlTsiMonth (1592x) + 57900: 149, // sqlTsiQuarter (1592x) + 57901: 150, // sqlTsiSecond (1592x) + 57902: 151, // sqlTsiWeek (1592x) + 57960: 152, // week (1592x) + 57605: 153, // ascii (1591x) + 57629: 154, // byteType (1591x) + 57923: 155, // tables (1591x) + 57949: 156, // unicodeSym (1591x) + 57711: 157, // fields (1590x) + 57759: 158, // logs (1589x) + 58057: 159, // timeDuration (1589x) + 57756: 160, // local (1587x) + 57835: 161, // query (1587x) + 57874: 162, // separator (1587x) + 57639: 163, // cipher (1586x) + 57745: 164, // issuer (1586x) + 57761: 165, // maxConnectionsPerHour (1586x) + 57764: 166, // maxQueriesPerHour (1586x) + 57766: 167, // maxUpdatesPerHour (1586x) + 57767: 168, // maxUserConnections (1586x) + 57822: 169, // preceding (1586x) + 57865: 170, // san (1586x) + 57915: 171, // subject (1586x) + 57933: 172, // tokenIssuer (1586x) + 57989: 173, // endTime (1585x) + 57746: 174, // jsonType (1585x) + 58041: 175, // startTime (1585x) + 57674: 176, // datetimeType (1584x) + 57673: 177, // dateType (1584x) + 57714: 178, // fixed (1584x) + 57931: 179, // timeType (1584x) + 57621: 180, // bindings (1583x) + 57678: 181, // definer (1583x) + 57725: 182, // hash (1583x) + 57732: 183, // identified (1583x) + 57851: 184, // respect (1583x) + 57858: 185, // role (1583x) + 57932: 186, // timestampType (1583x) + 57954: 187, // value (1583x) + 57615: 188, // backup (1582x) + 57627: 189, // booleanType (1582x) + 57670: 190, // current (1582x) + 57693: 191, // enforced (1582x) + 57716: 192, // following (1582x) + 57753: 193, // less (1582x) + 58021: 194, // next_row_id (1582x) + 57793: 195, // nowait (1582x) + 57802: 196, // only (1582x) + 57866: 197, // savepoint (1582x) + 57886: 198, // skip (1582x) + 58055: 199, // taskTypes (1582x) + 57928: 200, // textType (1582x) + 57929: 201, // than (1582x) + 58151: 202, // tiFlash (1582x) + 57946: 203, // unbounded (1582x) + 57620: 204, // binding (1581x) + 57624: 205, // bitType (1581x) + 57626: 206, // boolType (1581x) + 57696: 207, // enum (1581x) + 57722: 208, // global (1581x) + 57731: 209, // hypo (1581x) + 58125: 210, // job (1581x) + 57780: 211, // national (1581x) + 57781: 212, // ncharType (1581x) + 57795: 213, // nvarcharType (1581x) + 57797: 214, // offset (1581x) + 57821: 215, // policy (1581x) + 58028: 216, // predicate (1581x) + 57846: 217, // replica (1581x) + 57926: 218, // temporary (1581x) + 57952: 219, // user (1581x) + 57680: 220, // digest (1580x) + 58126: 221, // jobs (1580x) + 57757: 222, // location (1580x) + 58025: 223, // planCache (1580x) + 57823: 224, // prepare (1580x) + 58141: 225, // stats (1580x) + 57950: 226, // unknown (1580x) + 57958: 227, // wait (1580x) + 57628: 228, // btree (1579x) + 57979: 229, // cooldown (1579x) + 57677: 230, // declare (1579x) + 57987: 231, // dryRun (1579x) + 57717: 232, // format (1579x) + 57744: 233, // isolation (1579x) + 57750: 234, // last (1579x) + 57762: 235, // max_idxnum (1579x) + 57770: 236, // memory (1579x) + 57796: 237, // off (1579x) + 57805: 238, // optional (1579x) + 57816: 239, // per_db (1579x) + 57826: 240, // privileges (1579x) + 57849: 241, // required (1579x) + 57864: 242, // rtree (1579x) + 58136: 243, // sampleRate (1579x) + 57875: 244, // sequence (1579x) + 57878: 245, // session (1579x) + 57889: 246, // slow (1579x) + 57953: 247, // validation (1579x) + 57955: 248, // variables (1579x) + 57607: 249, // attributes (1578x) + 58114: 250, // cancel (1578x) + 57653: 251, // compact (1578x) + 58119: 252, // ddl (1578x) + 57682: 253, // disable (1578x) + 57686: 254, // do (1578x) + 57688: 255, // dynamic (1578x) + 57689: 256, // enable (1578x) + 57697: 257, // errorKwd (1578x) + 57990: 258, // exact (1578x) + 57715: 259, // flush (1578x) + 57719: 260, // full (1578x) + 57724: 261, // handler (1578x) + 57728: 262, // history (1578x) + 57768: 263, // mb (1578x) + 57776: 264, // mode (1578x) + 57783: 265, // next (1578x) + 57814: 266, // pause (1578x) + 57819: 267, // plugins (1578x) + 57828: 268, // processlist (1578x) + 57839: 269, // recover (1578x) + 57844: 270, // repair (1578x) + 57845: 271, // repeatable (1578x) + 58039: 272, // similar (1578x) + 58140: 273, // statistics (1578x) + 57917: 274, // subpartitions (1578x) + 58150: 275, // tidb (1578x) + 57962: 276, // without (1578x) + 58083: 277, // admin (1577x) + 58084: 278, // batch (1577x) + 57617: 279, // bdr (1577x) + 57623: 280, // binlog (1577x) + 57625: 281, // block (1577x) + 57974: 282, // br (1577x) + 57975: 283, // briefType (1577x) + 58085: 284, // buckets (1577x) + 57631: 285, // calibrate (1577x) + 57632: 286, // capture (1577x) + 58115: 287, // cardinality (1577x) + 57635: 288, // chain (1577x) + 57642: 289, // clientErrorsSummary (1577x) + 58116: 290, // cmSketch (1577x) + 57646: 291, // coalesce (1577x) + 57654: 292, // compressed (1577x) + 57661: 293, // context (1577x) + 57980: 294, // copyKwd (1577x) + 58118: 295, // correlation (1577x) + 57662: 296, // cpu (1577x) + 57676: 297, // deallocate (1577x) + 58120: 298, // dependency (1577x) + 57681: 299, // directory (1577x) + 57684: 300, // discard (1577x) + 57685: 301, // disk (1577x) + 57986: 302, // dotType (1577x) + 58122: 303, // drainer (1577x) + 58123: 304, // dry (1577x) + 57687: 305, // duplicate (1577x) + 57703: 306, // exchange (1577x) + 57705: 307, // execute (1577x) + 57706: 308, // expansion (1577x) + 57994: 309, // flashback (1577x) + 57721: 310, // general (1577x) + 57726: 311, // help (1577x) + 58002: 312, // high (1577x) + 57727: 313, // histogram (1577x) + 57729: 314, // hosts (1577x) + 57698: 315, // identSQLErrors (1577x) + 57736: 316, // incremental (1577x) + 58003: 317, // inplace (1577x) + 57739: 318, // instance (1577x) + 58004: 319, // instant (1577x) + 57743: 320, // ipc (1577x) + 57748: 321, // labels (1577x) + 57758: 322, // locked (1577x) + 58016: 323, // low (1577x) + 58018: 324, // medium (1577x) + 58019: 325, // metadata (1577x) + 57777: 326, // modify (1577x) + 58127: 327, // nodeID (1577x) + 58128: 328, // nodeState (1577x) + 57794: 329, // nulls (1577x) + 57807: 330, // pageSym (1577x) + 58131: 331, // pump (1577x) + 57832: 332, // purge (1577x) + 57838: 333, // rebuild (1577x) + 57840: 334, // redundant (1577x) + 57841: 335, // reload (1577x) + 57853: 336, // restore (1577x) + 57861: 337, // routine (1577x) + 58037: 338, // s3 (1577x) + 58137: 339, // samples (1577x) + 57870: 340, // secondaryLoad (1577x) + 57871: 341, // secondaryUnload (1577x) + 57881: 342, // share (1577x) + 57883: 343, // shutdown (1577x) + 57888: 344, // slave (1577x) + 57892: 345, // source (1577x) + 57908: 346, // statsOptions (1577x) + 58047: 347, // stop (1577x) + 57919: 348, // swaps (1577x) + 58056: 349, // tidbJson (1577x) + 58061: 350, // tokudbDefault (1577x) + 58062: 351, // tokudbFast (1577x) + 58063: 352, // tokudbLzma (1577x) + 58064: 353, // tokudbQuickLZ (1577x) + 58065: 354, // tokudbSmall (1577x) + 58066: 355, // tokudbSnappy (1577x) + 58067: 356, // tokudbUncompressed (1577x) + 58068: 357, // tokudbZlib (1577x) + 58069: 358, // tokudbZstd (1577x) + 58152: 359, // topn (1577x) + 57936: 360, // trace (1577x) + 57937: 361, // traditional (1577x) + 58072: 362, // trueCardCost (1577x) + 58073: 363, // unlimited (1577x) + 58078: 364, // verboseType (1577x) + 57959: 365, // warnings (1577x) + 57598: 366, // advise (1576x) + 57600: 367, // against (1576x) + 57601: 368, // ago (1576x) + 57603: 369, // always (1576x) + 57616: 370, // backups (1576x) + 57619: 371, // bernoulli (1576x) + 57622: 372, // bindingCache (1576x) + 58103: 373, // builtins (1576x) + 57633: 374, // cascaded (1576x) + 57634: 375, // causal (1576x) + 57640: 376, // cleanup (1576x) + 57641: 377, // client (1576x) + 57644: 378, // cluster (1576x) + 57647: 379, // collation (1576x) + 58117: 380, // columnStatsUsage (1576x) + 57652: 381, // committed (1576x) + 57657: 382, // config (1576x) + 57659: 383, // consistency (1576x) + 57660: 384, // consistent (1576x) + 58121: 385, // depth (1576x) + 57683: 386, // disabled (1576x) + 57988: 387, // dump (1576x) + 57690: 388, // enabled (1576x) + 57695: 389, // engines (1576x) + 57701: 390, // events (1576x) + 57702: 391, // evolve (1576x) + 57707: 392, // expire (1576x) + 57992: 393, // exprPushdownBlacklist (1576x) + 57708: 394, // extended (1576x) + 57710: 395, // faultsSym (1576x) + 57718: 396, // found (1576x) + 57720: 397, // function (1576x) + 57723: 398, // grants (1576x) + 58124: 399, // histogramsInFlight (1576x) + 57737: 400, // indexes (1576x) + 58005: 401, // internal (1576x) + 57741: 402, // invoker (1576x) + 57742: 403, // io (1576x) + 57749: 404, // language (1576x) + 57754: 405, // level (1576x) + 57755: 406, // list (1576x) + 58015: 407, // log (1576x) + 57760: 408, // master (1576x) + 57763: 409, // max_minutes (1576x) + 57782: 410, // never (1576x) + 57784: 411, // nextval (1576x) + 57792: 412, // none (1576x) + 57798: 413, // oltpReadOnly (1576x) + 57799: 414, // oltpReadWrite (1576x) + 57800: 415, // oltpWriteOnly (1576x) + 58129: 416, // optimistic (1576x) + 58023: 417, // optRuleBlacklist (1576x) + 57808: 418, // parser (1576x) + 57809: 419, // partial (1576x) + 57810: 420, // partitioning (1576x) + 57817: 421, // per_table (1576x) + 57815: 422, // percent (1576x) + 58130: 423, // pessimistic (1576x) + 57820: 424, // point (1576x) + 57824: 425, // preserve (1576x) + 57829: 426, // profile (1576x) + 57830: 427, // profiles (1576x) + 57834: 428, // queries (1576x) + 58032: 429, // recent (1576x) + 58132: 430, // region (1576x) + 58033: 431, // replayer (1576x) + 58134: 432, // reset (1576x) + 57854: 433, // restores (1576x) + 57856: 434, // reuse (1576x) + 57860: 435, // rollup (1576x) + 58135: 436, // run (1576x) + 57868: 437, // secondary (1576x) + 57872: 438, // security (1576x) + 57877: 439, // serializable (1576x) + 58138: 440, // sessionStates (1576x) + 57885: 441, // simple (1576x) + 58143: 442, // statsHealthy (1576x) + 58144: 443, // statsHistograms (1576x) + 58145: 444, // statsLocked (1576x) + 58146: 445, // statsMeta (1576x) + 57920: 446, // switchesSym (1576x) + 57921: 447, // system (1576x) + 57922: 448, // systemTime (1576x) + 58054: 449, // target (1576x) + 58149: 450, // telemetryID (1576x) + 57927: 451, // temptable (1576x) + 58060: 452, // tls (1576x) + 58070: 453, // top (1576x) + 57934: 454, // tpcc (1576x) + 57935: 455, // tpch10 (1576x) + 57938: 456, // transaction (1576x) + 57939: 457, // triggers (1576x) + 57947: 458, // uncommitted (1576x) + 57948: 459, // undefined (1576x) + 57951: 460, // unset (1576x) + 58153: 461, // width (1576x) + 57963: 462, // workload (1576x) + 57964: 463, // x509 (1576x) + 57966: 464, // addDate (1575x) + 57604: 465, // any (1575x) + 57967: 466, // approxCountDistinct (1575x) + 57968: 467, // approxPercentile (1575x) + 57612: 468, // avg (1575x) + 57970: 469, // bitAnd (1575x) + 57971: 470, // bitOr (1575x) + 57972: 471, // bitXor (1575x) + 57973: 472, // bound (1575x) + 57977: 473, // cast (1575x) + 57981: 474, // curDate (1575x) + 57982: 475, // curTime (1575x) + 57983: 476, // dateAdd (1575x) + 57984: 477, // dateSub (1575x) + 57699: 478, // escape (1575x) + 57700: 479, // event (1575x) + 57704: 480, // exclusive (1575x) + 57993: 481, // extract (1575x) + 57712: 482, // file (1575x) + 57995: 483, // follower (1575x) + 58000: 484, // getFormat (1575x) + 58001: 485, // groupConcat (1575x) + 57734: 486, // imports (1575x) + 58006: 487, // ioReadBandwidth (1575x) + 58007: 488, // ioWriteBandwidth (1575x) + 58008: 489, // jsonArrayagg (1575x) + 58009: 490, // jsonObjectAgg (1575x) + 57751: 491, // lastval (1575x) + 58010: 492, // leader (1575x) + 58012: 493, // learner (1575x) + 58017: 494, // max (1575x) + 57769: 495, // member (1575x) + 58020: 496, // min (1575x) + 57779: 497, // names (1575x) + 58022: 498, // now (1575x) + 58027: 499, // position (1575x) + 57827: 500, // process (1575x) + 57831: 501, // proxy (1575x) + 57836: 502, // quick (1575x) + 57847: 503, // replicas (1575x) + 57848: 504, // replication (1575x) + 57857: 505, // reverse (1575x) + 57862: 506, // rowCount (1575x) + 58035: 507, // running (1575x) + 57879: 508, // setval (1575x) + 57882: 509, // shared (1575x) + 57891: 510, // some (1575x) + 57893: 511, // sqlBufferResult (1575x) + 57894: 512, // sqlCache (1575x) + 57895: 513, // sqlNoCache (1575x) + 58040: 514, // staleness (1575x) + 58046: 515, // std (1575x) + 58043: 516, // stddev (1575x) + 58044: 517, // stddevPop (1575x) + 58045: 518, // stddevSamp (1575x) + 58048: 519, // strict (1575x) + 58049: 520, // strong (1575x) + 58050: 521, // subDate (1575x) + 58051: 522, // substring (1575x) + 58052: 523, // sum (1575x) + 57918: 524, // super (1575x) + 58148: 525, // telemetry (1575x) + 58058: 526, // timestampAdd (1575x) + 58059: 527, // timestampDiff (1575x) + 58071: 528, // trim (1575x) + 57941: 529, // tsoType (1575x) + 58075: 530, // variance (1575x) + 58076: 531, // varPop (1575x) + 58077: 532, // varSamp (1575x) + 58081: 533, // voter (1575x) + 57961: 534, // weightString (1575x) + 57505: 535, // on (1481x) + 40: 536, // '(' (1478x) + 57591: 537, // with (1354x) + 57353: 538, // stringLit (1334x) + 58172: 539, // not2 (1285x) + 57405: 540, // defaultKwd (1236x) + 57498: 541, // not (1216x) + 57369: 542, // as (1183x) + 57384: 543, // collate (1151x) + 57569: 544, // union (1143x) + 57475: 545, // left (1138x) + 57534: 546, // right (1138x) + 57577: 547, // using (1128x) + 43: 548, // '+' (1114x) + 45: 549, // '-' (1112x) + 57496: 550, // mod (1092x) + 57515: 551, // partition (1068x) + 57581: 552, // values (1049x) + 57502: 553, // null (1045x) + 57446: 554, // ignore (1036x) + 57421: 555, // except (1032x) + 57461: 556, // intersect (1031x) + 57530: 557, // replace (1023x) + 57381: 558, // charType (1018x) + 57426: 559, // fetch (1013x) + 57477: 560, // limit (1004x) + 57541: 561, // set (1004x) + 58161: 562, // eq (1003x) + 57431: 563, // forKwd (1001x) + 57463: 564, // into (997x) + 42: 565, // '*' (996x) + 57434: 566, // from (993x) + 58156: 567, // intLit (993x) + 57483: 568, // lock (988x) + 57588: 569, // where (980x) + 57510: 570, // order (976x) + 57432: 571, // force (970x) + 57367: 572, // and (967x) + 57509: 573, // or (943x) + 57358: 574, // andand (942x) + 57818: 575, // pipesAsOr (942x) + 57593: 576, // xor (942x) + 57438: 577, // group (913x) + 57440: 578, // having (908x) + 57556: 579, // straightJoin (900x) + 57590: 580, // window (894x) + 57576: 581, // use (892x) + 57466: 582, // join (888x) + 57409: 583, // desc (883x) + 57445: 584, // ifKwd (878x) + 57476: 585, // like (878x) + 57497: 586, // natural (878x) + 57390: 587, // cross (877x) + 57424: 588, // explain (877x) + 57451: 589, // inner (877x) + 125: 590, // '}' (874x) 57373: 591, // binaryType (870x) - 57458: 592, // insert (866x) - 57535: 593, // rows (861x) - 57586: 594, // when (855x) - 57418: 595, // elseKwd (851x) - 57518: 596, // rangeKwd (851x) - 57556: 597, // tableSample (851x) - 57439: 598, // groups (849x) - 57400: 599, // dayHour (848x) - 57401: 600, // dayMicrosecond (848x) - 57402: 601, // dayMinute (848x) - 57403: 602, // daySecond (848x) - 57442: 603, // hourMicrosecond (848x) - 57443: 604, // hourMinute (848x) - 57444: 605, // hourSecond (848x) - 57494: 606, // minuteMicrosecond (848x) - 57495: 607, // minuteSecond (848x) - 57537: 608, // secondMicrosecond (848x) - 57593: 609, // yearMonth (848x) - 57370: 610, // asc (846x) - 57447: 611, // in (840x) - 57559: 612, // then (840x) - 47: 613, // '/' (832x) - 57555: 614, // tableKwd (832x) - 37: 615, // '%' (831x) - 38: 616, // '&' (831x) - 94: 617, // '^' (831x) - 124: 618, // '|' (831x) - 57413: 619, // div (831x) - 58166: 620, // lsh (831x) - 58171: 621, // rsh (831x) - 60: 622, // '<' (830x) - 62: 623, // '>' (830x) - 57379: 624, // caseKwd (830x) - 58162: 625, // ge (830x) - 57457: 626, // is (830x) - 58163: 627, // le (830x) - 58167: 628, // neq (830x) - 58168: 629, // neqSynonym (830x) - 58169: 630, // nulleq (830x) - 57527: 631, // repeat (830x) - 57371: 632, // between (825x) + 57453: 592, // insert (867x) + 57537: 593, // rows (862x) + 57587: 594, // when (856x) + 57417: 595, // elseKwd (852x) + 57520: 596, // rangeKwd (852x) + 57558: 597, // tableSample (852x) + 57439: 598, // groups (850x) + 57400: 599, // dayHour (849x) + 57401: 600, // dayMicrosecond (849x) + 57402: 601, // dayMinute (849x) + 57403: 602, // daySecond (849x) + 57442: 603, // hourMicrosecond (849x) + 57443: 604, // hourMinute (849x) + 57444: 605, // hourSecond (849x) + 57494: 606, // minuteMicrosecond (849x) + 57495: 607, // minuteSecond (849x) + 57539: 608, // secondMicrosecond (849x) + 57594: 609, // yearMonth (849x) + 57370: 610, // asc (847x) + 57448: 611, // in (841x) + 57560: 612, // then (841x) + 57557: 613, // tableKwd (838x) + 47: 614, // '/' (833x) + 37: 615, // '%' (832x) + 38: 616, // '&' (832x) + 94: 617, // '^' (832x) + 124: 618, // '|' (832x) + 57413: 619, // div (832x) + 58166: 620, // lsh (832x) + 58171: 621, // rsh (832x) + 60: 622, // '<' (831x) + 62: 623, // '>' (831x) + 58162: 624, // ge (831x) + 57464: 625, // is (831x) + 58163: 626, // le (831x) + 58167: 627, // neq (831x) + 58168: 628, // neqSynonym (831x) + 58169: 629, // nulleq (831x) + 57379: 630, // caseKwd (830x) + 57529: 631, // repeat (830x) + 57371: 632, // between (826x) 57354: 633, // singleAtIdentifier (823x) 57425: 634, // falseKwd (819x) - 57566: 635, // trueKwd (819x) - 57395: 636, // currentUser (818x) - 57477: 637, // ilike (817x) - 57524: 638, // regexpKwd (817x) - 57533: 639, // rlike (817x) - 57350: 640, // memberof (814x) + 57567: 635, // trueKwd (819x) + 57396: 636, // currentUser (818x) + 57447: 637, // ilike (818x) + 57526: 638, // regexpKwd (818x) + 57535: 639, // rlike (818x) + 57350: 640, // memberof (815x) 58155: 641, // decLit (811x) 58154: 642, // floatLit (811x) 58157: 643, // hexLit (811x) - 57534: 644, // row (810x) + 57536: 644, // row (810x) 58158: 645, // bitLit (809x) - 57454: 646, // interval (809x) + 57462: 646, // interval (809x) 58170: 647, // paramMarker (808x) 123: 648, // '{' (806x) 57398: 649, // database (802x) - 57421: 650, // exists (801x) - 57388: 651, // convert (798x) + 57422: 650, // exists (801x) + 57388: 651, // convert (799x) 57352: 652, // underscoreCS (798x) - 58134: 653, // builtinCurDate (797x) - 58142: 654, // builtinNow (797x) + 58093: 653, // builtinCurDate (797x) + 58101: 654, // builtinNow (797x) 57392: 655, // currentDate (797x) - 57394: 656, // currentTs (797x) + 57395: 656, // currentTs (797x) 57355: 657, // doubleAtIdentifier (797x) - 57482: 658, // localTime (797x) - 57483: 659, // localTs (797x) - 58131: 660, // builtinCount (795x) - 57543: 661, // sql (795x) - 33: 662, // '!' (794x) - 126: 663, // '~' (794x) - 58132: 664, // builtinApproxCountDistinct (794x) - 58133: 665, // builtinApproxPercentile (794x) - 58127: 666, // builtinBitAnd (794x) - 58128: 667, // builtinBitOr (794x) - 58129: 668, // builtinBitXor (794x) - 58130: 669, // builtinCast (794x) - 58135: 670, // builtinCurTime (794x) - 58136: 671, // builtinDateAdd (794x) - 58137: 672, // builtinDateSub (794x) - 58138: 673, // builtinExtract (794x) - 58139: 674, // builtinGroupConcat (794x) - 58140: 675, // builtinMax (794x) - 58141: 676, // builtinMin (794x) - 58143: 677, // builtinPosition (794x) - 58147: 678, // builtinStddevPop (794x) - 58148: 679, // builtinStddevSamp (794x) - 58144: 680, // builtinSubstring (794x) - 58145: 681, // builtinSum (794x) - 58146: 682, // builtinSysDate (794x) - 58149: 683, // builtinTranslate (794x) - 58150: 684, // builtinTrim (794x) - 58151: 685, // builtinUser (794x) - 58152: 686, // builtinVarPop (794x) - 58153: 687, // builtinVarSamp (794x) - 57391: 688, // cumeDist (794x) - 57396: 689, // currentRole (794x) - 57393: 690, // currentTime (794x) - 57408: 691, // denseRank (794x) - 57427: 692, // firstValue (794x) - 57470: 693, // lag (794x) - 57471: 694, // lastValue (794x) - 57472: 695, // lead (794x) - 57499: 696, // nthValue (794x) - 57500: 697, // ntile (794x) - 57514: 698, // percentRank (794x) - 57519: 699, // rank (794x) - 57536: 700, // rowNumber (794x) - 57538: 701, // selectKwd (794x) - 57554: 702, // tidbCurrentTSO (794x) - 57576: 703, // utcDate (794x) - 57578: 704, // utcTime (794x) - 57577: 705, // utcTimestamp (794x) - 57467: 706, // key (788x) - 57359: 707, // pipes (779x) - 57516: 708, // primary (779x) - 57383: 709, // check (778x) - 57567: 710, // unique (771x) - 57386: 711, // constraint (768x) - 57523: 712, // references (766x) - 57436: 713, // generated (762x) - 57381: 714, // character (758x) - 57448: 715, // index (742x) - 57488: 716, // match (728x) - 57563: 717, // to (637x) - 57366: 718, // analyze (631x) - 57572: 719, // update (626x) - 46: 720, // '.' (616x) - 57364: 721, // all (615x) + 57481: 658, // localTime (797x) + 57482: 659, // localTs (797x) + 57540: 660, // selectKwd (797x) + 57545: 661, // sql (796x) + 58092: 662, // builtinCount (795x) + 33: 663, // '!' (794x) + 126: 664, // '~' (794x) + 58086: 665, // builtinApproxCountDistinct (794x) + 58087: 666, // builtinApproxPercentile (794x) + 58088: 667, // builtinBitAnd (794x) + 58089: 668, // builtinBitOr (794x) + 58090: 669, // builtinBitXor (794x) + 58091: 670, // builtinCast (794x) + 58094: 671, // builtinCurTime (794x) + 58095: 672, // builtinDateAdd (794x) + 58096: 673, // builtinDateSub (794x) + 58097: 674, // builtinExtract (794x) + 58098: 675, // builtinGroupConcat (794x) + 58099: 676, // builtinMax (794x) + 58100: 677, // builtinMin (794x) + 58102: 678, // builtinPosition (794x) + 58104: 679, // builtinStddevPop (794x) + 58105: 680, // builtinStddevSamp (794x) + 58106: 681, // builtinSubstring (794x) + 58107: 682, // builtinSum (794x) + 58108: 683, // builtinSysDate (794x) + 58109: 684, // builtinTranslate (794x) + 58110: 685, // builtinTrim (794x) + 58111: 686, // builtinUser (794x) + 58112: 687, // builtinVarPop (794x) + 58113: 688, // builtinVarSamp (794x) + 57391: 689, // cumeDist (794x) + 57393: 690, // currentRole (794x) + 57394: 691, // currentTime (794x) + 57408: 692, // denseRank (794x) + 57427: 693, // firstValue (794x) + 57470: 694, // lag (794x) + 57471: 695, // lastValue (794x) + 57472: 696, // lead (794x) + 57500: 697, // nthValue (794x) + 57501: 698, // ntile (794x) + 57516: 699, // percentRank (794x) + 57521: 700, // rank (794x) + 57538: 701, // rowNumber (794x) + 57568: 702, // tidbCurrentTSO (794x) + 57578: 703, // utcDate (794x) + 57579: 704, // utcTime (794x) + 57580: 705, // utcTimestamp (794x) + 57467: 706, // key (789x) + 57359: 707, // pipes (780x) + 57518: 708, // primary (780x) + 57383: 709, // check (779x) + 57570: 710, // unique (772x) + 57386: 711, // constraint (769x) + 57525: 712, // references (767x) + 57436: 713, // generated (763x) + 57382: 714, // character (759x) + 57449: 715, // index (743x) + 57488: 716, // match (729x) + 57564: 717, // to (638x) + 57366: 718, // analyze (632x) + 57574: 719, // update (628x) + 46: 720, // '.' (618x) + 57364: 721, // all (616x) 58160: 722, // assignmentEq (580x) 58164: 723, // jss (580x) 58165: 724, // juss (580x) - 57489: 725, // maxValue (579x) + 57489: 725, // maxValue (580x) 57368: 726, // array (576x) - 57479: 727, // lines (572x) - 57376: 728, // by (564x) - 57365: 729, // alter (562x) - 57529: 730, // require (559x) + 57479: 727, // lines (573x) + 57376: 728, // by (565x) + 57365: 729, // alter (563x) + 57531: 730, // require (559x) 64: 731, // '@' (554x) - 57415: 732, // drop (548x) - 57378: 733, // cascade (547x) - 57520: 734, // read (547x) - 57530: 735, // restrict (547x) - 57347: 736, // asof (546x) - 57582: 737, // varcharacter (546x) - 57581: 738, // varcharType (546x) + 57415: 732, // drop (549x) + 57378: 733, // cascade (548x) + 57522: 734, // read (548x) + 57532: 735, // restrict (548x) + 57347: 736, // asof (547x) + 57584: 737, // varcharacter (546x) + 57583: 738, // varcharType (546x) 57404: 739, // decimalType (545x) 57414: 740, // doubleType (545x) 57428: 741, // floatType (545x) - 57452: 742, // integerType (545x) - 57459: 743, // intType (545x) - 57521: 744, // realType (545x) - 57583: 745, // varbinaryType (544x) - 57372: 746, // bigIntType (543x) - 57374: 747, // blobType (543x) - 57389: 748, // create (543x) + 57460: 742, // integerType (545x) + 57454: 743, // intType (545x) + 57523: 744, // realType (545x) + 57389: 745, // create (544x) + 57582: 746, // varbinaryType (544x) + 57372: 747, // bigIntType (543x) + 57374: 748, // blobType (543x) 57429: 749, // float4Type (543x) 57430: 750, // float8Type (543x) 57433: 751, // foreign (543x) 57435: 752, // fulltext (543x) - 57460: 753, // int1Type (543x) - 57461: 754, // int2Type (543x) - 57462: 755, // int3Type (543x) - 57463: 756, // int4Type (543x) - 57464: 757, // int8Type (543x) - 57580: 758, // long (543x) + 57455: 753, // int1Type (543x) + 57456: 754, // int2Type (543x) + 57457: 755, // int3Type (543x) + 57458: 756, // int4Type (543x) + 57459: 757, // int8Type (543x) + 57484: 758, // long (543x) 57485: 759, // longblobType (543x) 57486: 760, // longtextType (543x) 57490: 761, // mediumblobType (543x) 57491: 762, // mediumIntType (543x) 57492: 763, // mediumtextType (543x) 57493: 764, // middleIntType (543x) - 57502: 765, // numericType (543x) - 57541: 766, // smallIntType (543x) - 57560: 767, // tinyblobType (543x) - 57561: 768, // tinyIntType (543x) - 57562: 769, // tinytextType (543x) - 57348: 770, // toTimestamp (542x) - 57349: 771, // toTSO (542x) - 57380: 772, // change (540x) - 57526: 773, // rename (540x) - 57589: 774, // write (540x) - 57363: 775, // add (539x) - 57505: 776, // optimize (538x) - 58446: 777, // Identifier (534x) - 58527: 778, // NotKeywordToken (534x) - 58805: 779, // TiDBKeyword (534x) - 58815: 780, // UnReservedKeyword (534x) - 58770: 781, // SubSelect (259x) + 57503: 765, // numericType (543x) + 57543: 766, // smallIntType (543x) + 57561: 767, // tinyblobType (543x) + 57562: 768, // tinyIntType (543x) + 57563: 769, // tinytextType (543x) + 57348: 770, // toTimestamp (543x) + 57349: 771, // toTSO (543x) + 57380: 772, // change (541x) + 57506: 773, // optimize (541x) + 57528: 774, // rename (541x) + 57592: 775, // write (541x) + 57363: 776, // add (540x) + 58445: 777, // Identifier (536x) + 58527: 778, // NotKeywordToken (536x) + 58805: 779, // TiDBKeyword (536x) + 58815: 780, // UnReservedKeyword (536x) + 58770: 781, // SubSelect (261x) 58825: 782, // UserVariable (200x) 58498: 783, // Literal (198x) 58741: 784, // SimpleIdent (198x) 58760: 785, // StringLiteral (198x) 58524: 786, // NextValueForSequence (195x) - 58423: 787, // FunctionCallGeneric (194x) - 58424: 788, // FunctionCallKeyword (194x) - 58425: 789, // FunctionCallNonKeyword (194x) - 58426: 790, // FunctionNameConflict (194x) - 58427: 791, // FunctionNameDateArith (194x) - 58428: 792, // FunctionNameDateArithMultiForms (194x) - 58429: 793, // FunctionNameDatetimePrecision (194x) - 58430: 794, // FunctionNameOptionalBraces (194x) - 58431: 795, // FunctionNameSequence (194x) + 58422: 787, // FunctionCallGeneric (194x) + 58423: 788, // FunctionCallKeyword (194x) + 58424: 789, // FunctionCallNonKeyword (194x) + 58425: 790, // FunctionNameConflict (194x) + 58426: 791, // FunctionNameDateArith (194x) + 58427: 792, // FunctionNameDateArithMultiForms (194x) + 58428: 793, // FunctionNameDatetimePrecision (194x) + 58429: 794, // FunctionNameOptionalBraces (194x) + 58430: 795, // FunctionNameSequence (194x) 58740: 796, // SimpleExpr (194x) 58771: 797, // SumExpr (194x) 58773: 798, // SystemVariable (194x) @@ -1723,72 +1723,72 @@ var ( 58254: 801, // BitExpr (176x) 58602: 802, // PredicateExpr (144x) 58257: 803, // BoolPri (141x) - 58386: 804, // Expression (141x) - 58522: 805, // NUM (125x) + 58385: 804, // Expression (141x) + 58522: 805, // NUM (122x) 58876: 806, // logAnd (107x) 58877: 807, // logOr (107x) - 58377: 808, // EqOpt (98x) - 57407: 809, // deleteKwd (86x) - 58783: 810, // TableName (81x) + 58376: 808, // EqOpt (98x) + 57407: 809, // deleteKwd (87x) + 58783: 810, // TableName (82x) 58761: 811, // StringName (56x) - 58695: 812, // SelectStmt (52x) - 58696: 813, // SelectStmtBasic (52x) - 58698: 814, // SelectStmtFromDualTable (52x) - 58699: 815, // SelectStmtFromTable (52x) - 58716: 816, // SetOprClause (52x) - 58489: 817, // LengthNum (51x) - 58717: 818, // SetOprClauseList (51x) - 58720: 819, // SetOprStmtWithLimitOrderBy (51x) - 58721: 820, // SetOprStmtWoutLimitOrderBy (51x) - 57570: 821, // unsigned (50x) - 58866: 822, // WithClause (49x) - 58708: 823, // SelectStmtWithClause (48x) - 58719: 824, // SetOprStmt (48x) - 57594: 825, // zerofill (48x) - 57512: 826, // over (45x) - 58283: 827, // ColumnName (41x) - 58819: 828, // UpdateStmtNoWith (41x) - 58343: 829, // DeleteWithoutUsingStmt (40x) - 58474: 830, // InsertIntoStmt (38x) - 58477: 831, // Int64Num (38x) - 58659: 832, // ReplaceIntoStmt (38x) - 58818: 833, // UpdateStmt (38x) - 57410: 834, // describe (36x) - 57411: 835, // distinct (36x) - 57412: 836, // distinctRow (36x) - 57588: 837, // while (36x) + 58695: 812, // SelectStmt (54x) + 58696: 813, // SelectStmtBasic (54x) + 58698: 814, // SelectStmtFromDualTable (54x) + 58699: 815, // SelectStmtFromTable (54x) + 58716: 816, // SetOprClause (54x) + 58717: 817, // SetOprClauseList (53x) + 58720: 818, // SetOprStmtWithLimitOrderBy (53x) + 58721: 819, // SetOprStmtWoutLimitOrderBy (53x) + 58489: 820, // LengthNum (51x) + 58866: 821, // WithClause (51x) + 58708: 822, // SelectStmtWithClause (50x) + 58719: 823, // SetOprStmt (50x) + 57572: 824, // unsigned (50x) + 57595: 825, // zerofill (48x) + 57514: 826, // over (45x) + 58819: 827, // UpdateStmtNoWith (42x) + 58283: 828, // ColumnName (41x) + 58343: 829, // DeleteWithoutUsingStmt (41x) + 58474: 830, // InsertIntoStmt (39x) + 58659: 831, // ReplaceIntoStmt (39x) + 58818: 832, // UpdateStmt (39x) + 57410: 833, // describe (36x) + 57411: 834, // distinct (36x) + 57412: 835, // distinctRow (36x) + 57589: 836, // while (36x) + 58477: 837, // Int64Num (35x) 58865: 838, // WindowingClause (35x) - 58342: 839, // DeleteWithUsingStmt (34x) - 57465: 840, // iterate (34x) - 57474: 841, // leave (34x) - 57406: 842, // delayed (33x) - 57441: 843, // highPriority (33x) - 57487: 844, // lowPriority (33x) + 57406: 839, // delayed (34x) + 58342: 840, // DeleteWithUsingStmt (34x) + 57441: 841, // highPriority (34x) + 57465: 842, // iterate (34x) + 57474: 843, // leave (34x) + 57487: 844, // lowPriority (34x) 58341: 845, // DeleteFromStmt (32x) - 57357: 846, // hintComment (27x) - 58397: 847, // FieldLen (25x) - 58572: 848, // OrderBy (25x) - 58702: 849, // SelectStmtLimit (25x) + 57357: 846, // hintComment (28x) + 58573: 847, // OrderBy (26x) + 58702: 848, // SelectStmtLimit (26x) + 58396: 849, // FieldLen (25x) 58566: 850, // OptWindowingClause (24x) 58226: 851, // AnalyzeTableStmt (23x) 58297: 852, // CommitStmt (23x) 58686: 853, // RollbackStmt (23x) 58724: 854, // SetStmt (23x) - 57544: 855, // sqlBigResult (23x) - 57545: 856, // sqlCalcFoundRows (23x) - 57546: 857, // sqlSmallResult (23x) - 57558: 858, // terminated (21x) + 57549: 855, // sqlBigResult (23x) + 57550: 856, // sqlCalcFoundRows (23x) + 57551: 857, // sqlSmallResult (23x) + 57559: 858, // terminated (21x) 58272: 859, // CharsetKw (20x) - 58447: 860, // IfExists (20x) + 58446: 860, // IfExists (20x) 58827: 861, // Username (20x) 57419: 862, // enclosed (19x) - 58382: 863, // ExplainStmt (19x) - 58383: 864, // ExplainSym (19x) - 58584: 865, // PartitionNameList (19x) + 58381: 863, // ExplainStmt (19x) + 58382: 864, // ExplainSym (19x) + 58585: 865, // PartitionNameList (19x) 58813: 866, // TruncateTableStmt (19x) 58820: 867, // UseStmt (19x) 57420: 868, // escaped (18x) - 58387: 869, // ExpressionList (18x) + 58386: 869, // ExpressionList (18x) 57351: 870, // optionallyEnclosedBy (18x) 58596: 871, // PlacementPolicyOption (18x) 58613: 872, // ProcedureBlockContent (18x) @@ -1808,8 +1808,8 @@ var ( 58640: 886, // ProcedureStatementStmt (17x) 58643: 887, // ProcedureUnlabeledBlock (17x) 58641: 888, // ProcedureUnlabelLoopBlock (17x) - 58448: 889, // IfNotExists (16x) - 58784: 890, // TableNameList (16x) + 58784: 889, // TableNameList (17x) + 58447: 890, // IfNotExists (16x) 58348: 891, // DistinctKwd (15x) 58807: 892, // TimestampUnit (15x) 58349: 893, // DistinctOpt (14x) @@ -1817,320 +1817,320 @@ var ( 58850: 895, // WhereClause (14x) 58851: 896, // WhereClauseOptional (14x) 58336: 897, // DefaultKwdOpt (13x) - 58378: 898, // EqOrAssignmentEq (13x) - 58385: 899, // ExprOrDefault (13x) - 57481: 900, // load (13x) - 58483: 901, // JoinTable (12x) + 58377: 898, // EqOrAssignmentEq (13x) + 58384: 899, // ExprOrDefault (13x) + 58483: 900, // JoinTable (12x) + 57499: 901, // noWriteToBinLog (12x) 58545: 902, // OptBinary (12x) - 57525: 903, // release (12x) + 57527: 903, // release (12x) 58683: 904, // RolenameComposed (12x) 58780: 905, // TableFactor (12x) 58793: 906, // TableRef (12x) 58806: 907, // TimeUnit (12x) 58225: 908, // AnalyzeOptionListOpt (11x) - 58418: 909, // FromOrIn (11x) + 58417: 909, // FromOrIn (11x) 58221: 910, // AlterTableStmt (10x) 58273: 911, // CharsetName (10x) 58284: 912, // ColumnNameList (10x) 58326: 913, // DBName (10x) - 57498: 914, // noWriteToBinLog (10x) - 58573: 915, // OrderByOptional (10x) - 58575: 916, // PartDefOption (10x) - 58739: 917, // SignedNum (10x) - 58260: 918, // BuggyDefaultFalseDistinctOpt (9x) - 58335: 919, // DefaultFalseDistinctOpt (9x) - 58484: 920, // JoinType (9x) - 58528: 921, // NotSym (9x) - 58535: 922, // NumLiteral (9x) - 58682: 923, // Rolename (9x) - 58677: 924, // RoleNameString (9x) - 58324: 925, // CrossOpt (8x) - 58384: 926, // ExplainableStmt (8x) - 58388: 927, // ExpressionListOpt (8x) - 58468: 928, // IndexPartSpecification (8x) - 58485: 929, // KeyOrIndex (8x) - 58525: 930, // NoWriteToBinLogAliasOpt (8x) - 58703: 931, // SelectStmtLimitOpt (8x) - 58839: 932, // VariableName (8x) - 58206: 933, // AllOrPartitionNameList (7x) - 58307: 934, // ConstraintKeywordOpt (7x) - 58331: 935, // DatabaseSym (7x) - 58403: 936, // FieldsOrColumns (7x) - 58415: 937, // ForceOpt (7x) - 58469: 938, // IndexPartSpecificationList (7x) - 57469: 939, // kill (7x) - 58606: 940, // Priority (7x) - 58636: 941, // ProcedureProcStmt1s (7x) - 58665: 942, // ResourceGroupName (7x) - 58687: 943, // RowFormat (7x) - 58690: 944, // RowValue (7x) - 58714: 945, // SetExpr (7x) - 58726: 946, // ShowDatabaseNameOpt (7x) - 58790: 947, // TableOption (7x) - 57584: 948, // varying (7x) - 58249: 949, // BeginTransactionStmt (6x) - 58251: 950, // BindableStmt (6x) - 58241: 951, // BRIEBooleanOptionName (6x) - 58242: 952, // BRIEIntegerOptionName (6x) - 58243: 953, // BRIEKeywordOptionName (6x) - 58244: 954, // BRIEOption (6x) - 58245: 955, // BRIEOptions (6x) - 58247: 956, // BRIEStringOptionName (6x) - 58271: 957, // Char (6x) - 57385: 958, // column (6x) - 58278: 959, // ColumnDef (6x) - 58328: 960, // DatabaseOption (6x) - 58379: 961, // EscapedTableRef (6x) - 58401: 962, // FieldTerminator (6x) - 57437: 963, // grant (6x) - 58450: 964, // IgnoreOptional (6x) - 58460: 965, // IndexInvisible (6x) - 58465: 966, // IndexNameList (6x) - 58471: 967, // IndexType (6x) - 58505: 968, // LoadDataStmt (6x) - 58585: 969, // PartitionNameListOpt (6x) - 57517: 970, // procedure (6x) - 58654: 971, // ReleaseSavepointStmt (6x) - 58684: 972, // RolenameList (6x) - 58691: 973, // SavepointStmt (6x) - 57540: 974, // show (6x) - 58788: 975, // TableOptimizerHints (6x) - 58828: 976, // UsernameList (6x) - 58867: 977, // WithClustered (6x) - 58204: 978, // AlgorithmClause (5x) - 58262: 979, // ByItem (5x) - 58277: 980, // CollationName (5x) - 58281: 981, // ColumnKeywordOpt (5x) - 58344: 982, // DirectPlacementOption (5x) - 58346: 983, // DirectResourceGroupOption (5x) - 58399: 984, // FieldOpt (5x) - 58400: 985, // FieldOpts (5x) - 58444: 986, // IdentList (5x) - 58463: 987, // IndexName (5x) - 58466: 988, // IndexOption (5x) - 58467: 989, // IndexOptionList (5x) - 57449: 990, // infile (5x) - 58494: 991, // LimitOption (5x) - 58509: 992, // LockClause (5x) - 58547: 993, // OptCharsetWithOptBinary (5x) - 58557: 994, // OptNullTreatment (5x) - 58600: 995, // PolicyName (5x) - 58607: 996, // PriorityOpt (5x) - 58694: 997, // SelectLockOpt (5x) - 58701: 998, // SelectStmtIntoOption (5x) - 58794: 999, // TableRefs (5x) - 58821: 1000, // UserSpec (5x) - 58229: 1001, // AsOfClause (4x) - 58232: 1002, // Assignment (4x) - 58238: 1003, // AuthString (4x) - 58258: 1004, // Boolean (4x) - 58261: 1005, // BuiltinFunction (4x) - 58263: 1006, // ByList (4x) - 58301: 1007, // ConfigItemName (4x) - 58305: 1008, // Constraint (4x) - 58411: 1009, // FloatOpt (4x) - 58472: 1010, // IndexTypeName (4x) - 58534: 1011, // NumList (4x) - 57506: 1012, // option (4x) - 57507: 1013, // optionally (4x) - 58563: 1014, // OptWild (4x) - 57511: 1015, // outer (4x) - 58601: 1016, // Precision (4x) - 58650: 1017, // ReferDef (4x) - 58673: 1018, // RestrictOrCascadeOpt (4x) - 58689: 1019, // RowStmt (4x) - 58709: 1020, // SequenceOption (4x) - 57552: 1021, // statsExtended (4x) - 58775: 1022, // TableAsName (4x) - 58776: 1023, // TableAsNameOpt (4x) - 58787: 1024, // TableNameOptWild (4x) - 58789: 1025, // TableOptimizerHintsOpt (4x) - 58791: 1026, // TableOptionList (4x) - 58802: 1027, // TextString (4x) - 58809: 1028, // TraceableStmt (4x) - 58810: 1029, // TransactionChar (4x) - 58822: 1030, // UserSpecList (4x) - 58835: 1031, // Varchar (4x) - 58861: 1032, // WindowName (4x) - 58233: 1033, // AssignmentList (3x) - 58235: 1034, // AttributesOpt (3x) - 58255: 1035, // BitValueType (3x) - 58256: 1036, // BlobType (3x) - 58259: 1037, // BooleanType (3x) - 58290: 1038, // ColumnOption (3x) - 58293: 1039, // ColumnPosition (3x) - 58298: 1040, // CommonTableExpr (3x) - 58320: 1041, // CreateTableStmt (3x) - 58325: 1042, // CurdateSym (3x) - 58329: 1043, // DatabaseOptionList (3x) - 58332: 1044, // DateAndTimeType (3x) - 58339: 1045, // DefaultTrueDistinctOpt (3x) - 58345: 1046, // DirectResourceGroupBackgroundOption (3x) - 58347: 1047, // DirectResourceGroupRunawayOption (3x) - 58369: 1048, // DynamicCalibrateResourceOption (3x) - 57417: 1049, // elseIfKwd (3x) - 58374: 1050, // EnforcedOrNot (3x) - 58390: 1051, // ExtendedPriv (3x) - 58406: 1052, // FixedPointType (3x) - 58412: 1053, // FloatingPointType (3x) - 58432: 1054, // GeneratedAlways (3x) - 58434: 1055, // GlobalScope (3x) - 58438: 1056, // GroupByClause (3x) - 58455: 1057, // IndexHint (3x) - 58459: 1058, // IndexHintType (3x) - 58464: 1059, // IndexNameAndTypeOpt (3x) - 58478: 1060, // IntegerType (3x) - 57468: 1061, // keys (3x) - 58496: 1062, // Lines (3x) - 58508: 1063, // LocationLabelList (3x) - 58521: 1064, // NChar (3x) - 58529: 1065, // NowSym (3x) - 58530: 1066, // NowSymFunc (3x) - 58531: 1067, // NowSymOptionFraction (3x) - 58536: 1068, // NumericType (3x) - 58523: 1069, // NVarchar (3x) - 58558: 1070, // OptOrder (3x) - 58562: 1071, // OptTemporary (3x) - 58576: 1072, // PartDefOptionList (3x) - 58578: 1073, // PartitionDefinition (3x) - 58589: 1074, // PasswordOrLockOption (3x) - 58599: 1075, // PluginNameList (3x) - 58605: 1076, // PrimaryOpt (3x) - 58608: 1077, // PrivElem (3x) - 58610: 1078, // PrivType (3x) - 58645: 1079, // QueryWatchOption (3x) - 58647: 1080, // QueryWatchTextOption (3x) - 58660: 1081, // RequireClause (3x) - 58661: 1082, // RequireClauseOpt (3x) - 58663: 1083, // RequireListElement (3x) - 58685: 1084, // RolenameWithoutIdent (3x) - 58678: 1085, // RoleOrPrivElem (3x) - 58700: 1086, // SelectStmtGroup (3x) - 58718: 1087, // SetOprOpt (3x) - 58738: 1088, // SignedLiteral (3x) - 58763: 1089, // StringType (3x) - 58774: 1090, // TableAliasRefList (3x) - 58777: 1091, // TableElement (3x) - 58804: 1092, // TextType (3x) - 58811: 1093, // TransactionChars (3x) - 57565: 1094, // trigger (3x) - 58814: 1095, // Type (3x) - 57569: 1096, // unlock (3x) - 57571: 1097, // until (3x) - 57573: 1098, // usage (3x) - 58832: 1099, // ValuesList (3x) - 58834: 1100, // ValuesStmtList (3x) - 58830: 1101, // ValueSym (3x) - 58837: 1102, // VariableAssignment (3x) - 58858: 1103, // WindowFrameStart (3x) - 58875: 1104, // Year (3x) - 58200: 1105, // AddQueryWatchStmt (2x) - 58202: 1106, // AdminStmt (2x) - 58205: 1107, // AllColumnsOrPredicateColumnsOpt (2x) - 58207: 1108, // AlterDatabaseStmt (2x) - 58208: 1109, // AlterInstanceStmt (2x) - 58209: 1110, // AlterOrderItem (2x) - 58211: 1111, // AlterPolicyStmt (2x) - 58212: 1112, // AlterRangeStmt (2x) - 58213: 1113, // AlterResourceGroupStmt (2x) - 58214: 1114, // AlterSequenceOption (2x) - 58216: 1115, // AlterSequenceStmt (2x) - 58217: 1116, // AlterTableSpec (2x) - 58222: 1117, // AlterUserStmt (2x) - 58223: 1118, // AnalyzeOption (2x) - 58253: 1119, // BinlogStmt (2x) - 58246: 1120, // BRIEStmt (2x) - 58248: 1121, // BRIETables (2x) - 58265: 1122, // CalibrateResourceStmt (2x) - 57377: 1123, // call (2x) - 58267: 1124, // CallStmt (2x) - 58268: 1125, // CancelImportStmt (2x) - 58269: 1126, // CastType (2x) - 58270: 1127, // ChangeStmt (2x) - 58276: 1128, // CheckConstraintKeyword (2x) - 58285: 1129, // ColumnNameListOpt (2x) - 58288: 1130, // ColumnNameOrUserVariable (2x) - 58287: 1131, // ColumnNameOrUserVarListOptWithBrackets (2x) - 58291: 1132, // ColumnOptionList (2x) - 58292: 1133, // ColumnOptionListOpt (2x) - 58296: 1134, // CommentOrAttributeOption (2x) - 58300: 1135, // CompletionTypeWithinTransaction (2x) - 58302: 1136, // ConnectionOption (2x) - 58304: 1137, // ConnectionOptions (2x) - 58308: 1138, // CreateBindingStmt (2x) - 58309: 1139, // CreateDatabaseStmt (2x) - 58310: 1140, // CreateIndexStmt (2x) - 58311: 1141, // CreatePolicyStmt (2x) - 58312: 1142, // CreateProcedureStmt (2x) - 58313: 1143, // CreateResourceGroupStmt (2x) - 58314: 1144, // CreateRoleStmt (2x) - 58316: 1145, // CreateSequenceStmt (2x) - 58317: 1146, // CreateStatisticsStmt (2x) - 58318: 1147, // CreateTableOptionListOpt (2x) - 58321: 1148, // CreateUserStmt (2x) - 58323: 1149, // CreateViewStmt (2x) - 57399: 1150, // databases (2x) - 58333: 1151, // DeallocateStmt (2x) - 58334: 1152, // DeallocateSym (2x) - 58337: 1153, // DefaultOrExpression (2x) - 58350: 1154, // DoStmt (2x) - 58351: 1155, // DropBindingStmt (2x) - 58352: 1156, // DropDatabaseStmt (2x) - 58353: 1157, // DropIndexStmt (2x) - 58354: 1158, // DropLoadDataStmt (2x) - 58355: 1159, // DropPolicyStmt (2x) - 58356: 1160, // DropProcedureStmt (2x) - 58357: 1161, // DropQueryWatchStmt (2x) - 58358: 1162, // DropResourceGroupStmt (2x) - 58359: 1163, // DropRoleStmt (2x) - 58360: 1164, // DropSequenceStmt (2x) - 58361: 1165, // DropStatisticsStmt (2x) - 58362: 1166, // DropStatsStmt (2x) - 58363: 1167, // DropTableStmt (2x) - 58364: 1168, // DropUserStmt (2x) - 58365: 1169, // DropViewStmt (2x) - 58367: 1170, // DuplicateOpt (2x) - 58370: 1171, // ElseCaseOpt (2x) - 58372: 1172, // EmptyStmt (2x) - 58373: 1173, // EncryptionOpt (2x) - 58375: 1174, // EnforcedOrNotOpt (2x) - 58380: 1175, // ExecuteStmt (2x) - 58381: 1176, // ExplainFormatType (2x) - 58392: 1177, // Field (2x) - 58395: 1178, // FieldItem (2x) - 58402: 1179, // Fields (2x) - 58407: 1180, // FlashbackDatabaseStmt (2x) - 58408: 1181, // FlashbackTableStmt (2x) - 58409: 1182, // FlashbackToNewName (2x) - 58410: 1183, // FlashbackToTimestampStmt (2x) - 58414: 1184, // FlushStmt (2x) - 58416: 1185, // FormatOpt (2x) - 58421: 1186, // FuncDatetimePrecList (2x) - 58422: 1187, // FuncDatetimePrecListOpt (2x) - 58435: 1188, // GrantProxyStmt (2x) - 58436: 1189, // GrantRoleStmt (2x) - 58437: 1190, // GrantStmt (2x) - 58439: 1191, // HandleRange (2x) - 58441: 1192, // HashString (2x) - 58442: 1193, // HavingClause (2x) - 58443: 1194, // HelpStmt (2x) - 58452: 1195, // ImportIntoStmt (2x) - 58454: 1196, // IndexAdviseStmt (2x) - 58456: 1197, // IndexHintList (2x) - 58457: 1198, // IndexHintListOpt (2x) - 58462: 1199, // IndexLockAndAlgorithmOpt (2x) - 57451: 1200, // inout (2x) - 58475: 1201, // InsertValues (2x) - 58480: 1202, // IntoOpt (2x) - 58486: 1203, // KeyOrIndexOpt (2x) - 58487: 1204, // KillOrKillTiDB (2x) - 58488: 1205, // KillStmt (2x) - 58490: 1206, // LikeOrIlikeEscapeOpt (2x) - 58493: 1207, // LimitClause (2x) - 57480: 1208, // linear (2x) - 58495: 1209, // LinearOpt (2x) - 58499: 1210, // LoadDataOption (2x) - 58501: 1211, // LoadDataOptionListOpt (2x) + 58452: 914, // ImportIntoStmt (10x) + 57480: 915, // load (10x) + 58525: 916, // NoWriteToBinLogAliasOpt (10x) + 58574: 917, // OrderByOptional (10x) + 58576: 918, // PartDefOption (10x) + 58739: 919, // SignedNum (10x) + 58260: 920, // BuggyDefaultFalseDistinctOpt (9x) + 58335: 921, // DefaultFalseDistinctOpt (9x) + 58484: 922, // JoinType (9x) + 58528: 923, // NotSym (9x) + 58535: 924, // NumLiteral (9x) + 58682: 925, // Rolename (9x) + 58677: 926, // RoleNameString (9x) + 58324: 927, // CrossOpt (8x) + 58383: 928, // ExplainableStmt (8x) + 58387: 929, // ExpressionListOpt (8x) + 58468: 930, // IndexPartSpecification (8x) + 58485: 931, // KeyOrIndex (8x) + 58703: 932, // SelectStmtLimitOpt (8x) + 58839: 933, // VariableName (8x) + 58206: 934, // AllOrPartitionNameList (7x) + 58251: 935, // BindableStmt (7x) + 58307: 936, // ConstraintKeywordOpt (7x) + 58331: 937, // DatabaseSym (7x) + 58402: 938, // FieldsOrColumns (7x) + 58414: 939, // ForceOpt (7x) + 58469: 940, // IndexPartSpecificationList (7x) + 57469: 941, // kill (7x) + 58606: 942, // Priority (7x) + 58636: 943, // ProcedureProcStmt1s (7x) + 58666: 944, // ResourceGroupName (7x) + 58687: 945, // RowFormat (7x) + 58690: 946, // RowValue (7x) + 58714: 947, // SetExpr (7x) + 58726: 948, // ShowDatabaseNameOpt (7x) + 58788: 949, // TableOptimizerHints (7x) + 58790: 950, // TableOption (7x) + 57585: 951, // varying (7x) + 58249: 952, // BeginTransactionStmt (6x) + 58241: 953, // BRIEBooleanOptionName (6x) + 58242: 954, // BRIEIntegerOptionName (6x) + 58243: 955, // BRIEKeywordOptionName (6x) + 58244: 956, // BRIEOption (6x) + 58245: 957, // BRIEOptions (6x) + 58247: 958, // BRIEStringOptionName (6x) + 58271: 959, // Char (6x) + 57385: 960, // column (6x) + 58278: 961, // ColumnDef (6x) + 58328: 962, // DatabaseOption (6x) + 58378: 963, // EscapedTableRef (6x) + 58400: 964, // FieldTerminator (6x) + 57437: 965, // grant (6x) + 58449: 966, // IgnoreOptional (6x) + 58460: 967, // IndexInvisible (6x) + 58465: 968, // IndexNameList (6x) + 58471: 969, // IndexType (6x) + 58505: 970, // LoadDataStmt (6x) + 58586: 971, // PartitionNameListOpt (6x) + 57519: 972, // procedure (6x) + 58654: 973, // ReleaseSavepointStmt (6x) + 58684: 974, // RolenameList (6x) + 58691: 975, // SavepointStmt (6x) + 57542: 976, // show (6x) + 58828: 977, // UsernameList (6x) + 58867: 978, // WithClustered (6x) + 58204: 979, // AlgorithmClause (5x) + 58262: 980, // ByItem (5x) + 58277: 981, // CollationName (5x) + 58281: 982, // ColumnKeywordOpt (5x) + 58344: 983, // DirectPlacementOption (5x) + 58346: 984, // DirectResourceGroupOption (5x) + 58398: 985, // FieldOpt (5x) + 58399: 986, // FieldOpts (5x) + 58443: 987, // IdentList (5x) + 58463: 988, // IndexName (5x) + 58466: 989, // IndexOption (5x) + 58467: 990, // IndexOptionList (5x) + 57450: 991, // infile (5x) + 58494: 992, // LimitOption (5x) + 58509: 993, // LockClause (5x) + 58547: 994, // OptCharsetWithOptBinary (5x) + 58557: 995, // OptNullTreatment (5x) + 58600: 996, // PolicyName (5x) + 58607: 997, // PriorityOpt (5x) + 58694: 998, // SelectLockOpt (5x) + 58701: 999, // SelectStmtIntoOption (5x) + 58789: 1000, // TableOptimizerHintsOpt (5x) + 58794: 1001, // TableRefs (5x) + 58821: 1002, // UserSpec (5x) + 58229: 1003, // AsOfClause (4x) + 58232: 1004, // Assignment (4x) + 58238: 1005, // AuthString (4x) + 58258: 1006, // Boolean (4x) + 58261: 1007, // BuiltinFunction (4x) + 58263: 1008, // ByList (4x) + 58301: 1009, // ConfigItemName (4x) + 58305: 1010, // Constraint (4x) + 58410: 1011, // FloatOpt (4x) + 58472: 1012, // IndexTypeName (4x) + 58534: 1013, // NumList (4x) + 57507: 1014, // option (4x) + 57508: 1015, // optionally (4x) + 58563: 1016, // OptWild (4x) + 57512: 1017, // outer (4x) + 58601: 1018, // Precision (4x) + 58650: 1019, // ReferDef (4x) + 58674: 1020, // RestrictOrCascadeOpt (4x) + 58689: 1021, // RowStmt (4x) + 58709: 1022, // SequenceOption (4x) + 57554: 1023, // statsExtended (4x) + 58775: 1024, // TableAsName (4x) + 58776: 1025, // TableAsNameOpt (4x) + 58787: 1026, // TableNameOptWild (4x) + 58791: 1027, // TableOptionList (4x) + 58802: 1028, // TextString (4x) + 58809: 1029, // TraceableStmt (4x) + 58810: 1030, // TransactionChar (4x) + 58822: 1031, // UserSpecList (4x) + 58835: 1032, // Varchar (4x) + 58861: 1033, // WindowName (4x) + 58233: 1034, // AssignmentList (3x) + 58235: 1035, // AttributesOpt (3x) + 58255: 1036, // BitValueType (3x) + 58256: 1037, // BlobType (3x) + 58259: 1038, // BooleanType (3x) + 58290: 1039, // ColumnOption (3x) + 58293: 1040, // ColumnPosition (3x) + 58298: 1041, // CommonTableExpr (3x) + 58320: 1042, // CreateTableStmt (3x) + 58325: 1043, // CurdateSym (3x) + 58329: 1044, // DatabaseOptionList (3x) + 58332: 1045, // DateAndTimeType (3x) + 58339: 1046, // DefaultTrueDistinctOpt (3x) + 58345: 1047, // DirectResourceGroupBackgroundOption (3x) + 58347: 1048, // DirectResourceGroupRunawayOption (3x) + 58368: 1049, // DynamicCalibrateResourceOption (3x) + 57418: 1050, // elseIfKwd (3x) + 58373: 1051, // EnforcedOrNot (3x) + 58389: 1052, // ExtendedPriv (3x) + 58405: 1053, // FixedPointType (3x) + 58411: 1054, // FloatingPointType (3x) + 58431: 1055, // GeneratedAlways (3x) + 58433: 1056, // GlobalScope (3x) + 58437: 1057, // GroupByClause (3x) + 58455: 1058, // IndexHint (3x) + 58459: 1059, // IndexHintType (3x) + 58464: 1060, // IndexNameAndTypeOpt (3x) + 58478: 1061, // IntegerType (3x) + 57468: 1062, // keys (3x) + 58496: 1063, // Lines (3x) + 58501: 1064, // LoadDataOptionListOpt (3x) + 58508: 1065, // LocationLabelList (3x) + 58521: 1066, // NChar (3x) + 58529: 1067, // NowSym (3x) + 58530: 1068, // NowSymFunc (3x) + 58531: 1069, // NowSymOptionFraction (3x) + 58536: 1070, // NumericType (3x) + 58523: 1071, // NVarchar (3x) + 58558: 1072, // OptOrder (3x) + 58562: 1073, // OptTemporary (3x) + 58577: 1074, // PartDefOptionList (3x) + 58579: 1075, // PartitionDefinition (3x) + 58590: 1076, // PasswordOrLockOption (3x) + 58599: 1077, // PluginNameList (3x) + 58605: 1078, // PrimaryOpt (3x) + 58608: 1079, // PrivElem (3x) + 58610: 1080, // PrivType (3x) + 58645: 1081, // QueryWatchOption (3x) + 58647: 1082, // QueryWatchTextOption (3x) + 58661: 1083, // RequireClause (3x) + 58662: 1084, // RequireClauseOpt (3x) + 58664: 1085, // RequireListElement (3x) + 58685: 1086, // RolenameWithoutIdent (3x) + 58678: 1087, // RoleOrPrivElem (3x) + 58700: 1088, // SelectStmtGroup (3x) + 58718: 1089, // SetOprOpt (3x) + 58738: 1090, // SignedLiteral (3x) + 58763: 1091, // StringType (3x) + 58774: 1092, // TableAliasRefList (3x) + 58777: 1093, // TableElement (3x) + 58792: 1094, // TableOrTables (3x) + 58804: 1095, // TextType (3x) + 58811: 1096, // TransactionChars (3x) + 57566: 1097, // trigger (3x) + 58814: 1098, // Type (3x) + 57571: 1099, // unlock (3x) + 57573: 1100, // until (3x) + 57575: 1101, // usage (3x) + 58832: 1102, // ValuesList (3x) + 58834: 1103, // ValuesStmtList (3x) + 58830: 1104, // ValueSym (3x) + 58837: 1105, // VariableAssignment (3x) + 58858: 1106, // WindowFrameStart (3x) + 58875: 1107, // Year (3x) + 58200: 1108, // AddQueryWatchStmt (2x) + 58202: 1109, // AdminStmt (2x) + 58205: 1110, // AllColumnsOrPredicateColumnsOpt (2x) + 58207: 1111, // AlterDatabaseStmt (2x) + 58208: 1112, // AlterInstanceStmt (2x) + 58209: 1113, // AlterOrderItem (2x) + 58211: 1114, // AlterPolicyStmt (2x) + 58212: 1115, // AlterRangeStmt (2x) + 58213: 1116, // AlterResourceGroupStmt (2x) + 58214: 1117, // AlterSequenceOption (2x) + 58216: 1118, // AlterSequenceStmt (2x) + 58217: 1119, // AlterTableSpec (2x) + 58222: 1120, // AlterUserStmt (2x) + 58223: 1121, // AnalyzeOption (2x) + 58253: 1122, // BinlogStmt (2x) + 58246: 1123, // BRIEStmt (2x) + 58248: 1124, // BRIETables (2x) + 58265: 1125, // CalibrateResourceStmt (2x) + 57377: 1126, // call (2x) + 58267: 1127, // CallStmt (2x) + 58268: 1128, // CancelImportStmt (2x) + 58269: 1129, // CastType (2x) + 58270: 1130, // ChangeStmt (2x) + 58276: 1131, // CheckConstraintKeyword (2x) + 58285: 1132, // ColumnNameListOpt (2x) + 58288: 1133, // ColumnNameOrUserVariable (2x) + 58287: 1134, // ColumnNameOrUserVarListOptWithBrackets (2x) + 58291: 1135, // ColumnOptionList (2x) + 58292: 1136, // ColumnOptionListOpt (2x) + 58296: 1137, // CommentOrAttributeOption (2x) + 58300: 1138, // CompletionTypeWithinTransaction (2x) + 58302: 1139, // ConnectionOption (2x) + 58304: 1140, // ConnectionOptions (2x) + 58308: 1141, // CreateBindingStmt (2x) + 58309: 1142, // CreateDatabaseStmt (2x) + 58310: 1143, // CreateIndexStmt (2x) + 58311: 1144, // CreatePolicyStmt (2x) + 58312: 1145, // CreateProcedureStmt (2x) + 58313: 1146, // CreateResourceGroupStmt (2x) + 58314: 1147, // CreateRoleStmt (2x) + 58316: 1148, // CreateSequenceStmt (2x) + 58317: 1149, // CreateStatisticsStmt (2x) + 58318: 1150, // CreateTableOptionListOpt (2x) + 58321: 1151, // CreateUserStmt (2x) + 58323: 1152, // CreateViewStmt (2x) + 57399: 1153, // databases (2x) + 58333: 1154, // DeallocateStmt (2x) + 58334: 1155, // DeallocateSym (2x) + 58337: 1156, // DefaultOrExpression (2x) + 58350: 1157, // DoStmt (2x) + 58351: 1158, // DropBindingStmt (2x) + 58352: 1159, // DropDatabaseStmt (2x) + 58353: 1160, // DropIndexStmt (2x) + 58354: 1161, // DropPolicyStmt (2x) + 58355: 1162, // DropProcedureStmt (2x) + 58356: 1163, // DropQueryWatchStmt (2x) + 58357: 1164, // DropResourceGroupStmt (2x) + 58358: 1165, // DropRoleStmt (2x) + 58359: 1166, // DropSequenceStmt (2x) + 58360: 1167, // DropStatisticsStmt (2x) + 58361: 1168, // DropStatsStmt (2x) + 58362: 1169, // DropTableStmt (2x) + 58363: 1170, // DropUserStmt (2x) + 58364: 1171, // DropViewStmt (2x) + 58366: 1172, // DuplicateOpt (2x) + 58369: 1173, // ElseCaseOpt (2x) + 58371: 1174, // EmptyStmt (2x) + 58372: 1175, // EncryptionOpt (2x) + 58374: 1176, // EnforcedOrNotOpt (2x) + 58379: 1177, // ExecuteStmt (2x) + 58380: 1178, // ExplainFormatType (2x) + 58391: 1179, // Field (2x) + 58394: 1180, // FieldItem (2x) + 58401: 1181, // Fields (2x) + 58406: 1182, // FlashbackDatabaseStmt (2x) + 58407: 1183, // FlashbackTableStmt (2x) + 58408: 1184, // FlashbackToNewName (2x) + 58409: 1185, // FlashbackToTimestampStmt (2x) + 58413: 1186, // FlushStmt (2x) + 58415: 1187, // FormatOpt (2x) + 58420: 1188, // FuncDatetimePrecList (2x) + 58421: 1189, // FuncDatetimePrecListOpt (2x) + 58434: 1190, // GrantProxyStmt (2x) + 58435: 1191, // GrantRoleStmt (2x) + 58436: 1192, // GrantStmt (2x) + 58438: 1193, // HandleRange (2x) + 58440: 1194, // HashString (2x) + 58441: 1195, // HavingClause (2x) + 58442: 1196, // HelpStmt (2x) + 58454: 1197, // IndexAdviseStmt (2x) + 58456: 1198, // IndexHintList (2x) + 58457: 1199, // IndexHintListOpt (2x) + 58462: 1200, // IndexLockAndAlgorithmOpt (2x) + 57452: 1201, // inout (2x) + 58475: 1202, // InsertValues (2x) + 58480: 1203, // IntoOpt (2x) + 58486: 1204, // KeyOrIndexOpt (2x) + 58487: 1205, // KillOrKillTiDB (2x) + 58488: 1206, // KillStmt (2x) + 58490: 1207, // LikeOrIlikeEscapeOpt (2x) + 58493: 1208, // LimitClause (2x) + 57478: 1209, // linear (2x) + 58495: 1210, // LinearOpt (2x) + 58499: 1211, // LoadDataOption (2x) 58502: 1212, // LoadDataSetItem (2x) 58504: 1213, // LoadDataSetSpecOpt (2x) 58506: 1214, // LoadStatsStmt (2x) @@ -2141,28 +2141,28 @@ var ( 58526: 1219, // NonTransactionalDMLStmt (2x) 58532: 1220, // NowSymOptionFractionParentheses (2x) 58537: 1221, // ObjectType (2x) - 57503: 1222, // of (2x) + 57504: 1222, // of (2x) 58538: 1223, // OfTablesOpt (2x) 58539: 1224, // OnCommitOpt (2x) 58540: 1225, // OnDelete (2x) 58543: 1226, // OnUpdate (2x) 58548: 1227, // OptCollate (2x) 58552: 1228, // OptFull (2x) - 58554: 1229, // OptInteger (2x) - 58568: 1230, // OptionalBraces (2x) - 58567: 1231, // OptionLevel (2x) - 58556: 1232, // OptLeadLagInfo (2x) - 58555: 1233, // OptLLDefault (2x) - 57510: 1234, // out (2x) - 58574: 1235, // OuterOpt (2x) - 58579: 1236, // PartitionDefinitionList (2x) - 58580: 1237, // PartitionDefinitionListOpt (2x) - 58581: 1238, // PartitionIntervalOpt (2x) - 58587: 1239, // PartitionOpt (2x) - 58588: 1240, // PasswordOpt (2x) - 58590: 1241, // PasswordOrLockOptionList (2x) - 58591: 1242, // PasswordOrLockOptions (2x) - 58592: 1243, // PauseLoadDataStmt (2x) + 58567: 1229, // OptimizeTableStmt (2x) + 58554: 1230, // OptInteger (2x) + 58569: 1231, // OptionalBraces (2x) + 58568: 1232, // OptionLevel (2x) + 58556: 1233, // OptLeadLagInfo (2x) + 58555: 1234, // OptLLDefault (2x) + 57511: 1235, // out (2x) + 58575: 1236, // OuterOpt (2x) + 58580: 1237, // PartitionDefinitionList (2x) + 58581: 1238, // PartitionDefinitionListOpt (2x) + 58582: 1239, // PartitionIntervalOpt (2x) + 58588: 1240, // PartitionOpt (2x) + 58589: 1241, // PasswordOpt (2x) + 58591: 1242, // PasswordOrLockOptionList (2x) + 58592: 1243, // PasswordOrLockOptions (2x) 58595: 1244, // PlacementOptionList (2x) 58598: 1245, // PlanReplayerStmt (2x) 58604: 1246, // PreparedStmt (2x) @@ -2179,196 +2179,196 @@ var ( 58655: 1257, // RenameTableStmt (2x) 58656: 1258, // RenameUserStmt (2x) 58658: 1259, // RepeatableOpt (2x) - 58666: 1260, // ResourceGroupNameOption (2x) - 58667: 1261, // ResourceGroupOptionList (2x) - 58669: 1262, // ResourceGroupRunawayActionOption (2x) - 58671: 1263, // ResourceGroupRunawayWatchOption (2x) - 58672: 1264, // RestartStmt (2x) - 58674: 1265, // ResumeLoadDataStmt (2x) - 57531: 1266, // revoke (2x) - 58675: 1267, // RevokeRoleStmt (2x) - 58676: 1268, // RevokeStmt (2x) - 58679: 1269, // RoleOrPrivElemList (2x) - 58680: 1270, // RoleSpec (2x) - 58692: 1271, // SearchWhenThen (2x) - 58704: 1272, // SelectStmtOpt (2x) - 58707: 1273, // SelectStmtSQLCache (2x) - 58711: 1274, // SetBindingStmt (2x) - 58712: 1275, // SetDefaultRoleOpt (2x) - 58713: 1276, // SetDefaultRoleStmt (2x) - 58723: 1277, // SetRoleStmt (2x) - 58731: 1278, // ShowProfileType (2x) - 58734: 1279, // ShowStmt (2x) - 58735: 1280, // ShowTableAliasOpt (2x) - 58737: 1281, // ShutdownStmt (2x) - 58742: 1282, // SimpleWhenThen (2x) - 58747: 1283, // SplitOption (2x) - 58748: 1284, // SplitRegionStmt (2x) - 58744: 1285, // SpOptInout (2x) - 58745: 1286, // SpPdparam (2x) - 57547: 1287, // sqlexception (2x) - 57548: 1288, // sqlstate (2x) - 57549: 1289, // sqlwarning (2x) - 58752: 1290, // Statement (2x) - 58755: 1291, // StatsOptionsOpt (2x) - 58756: 1292, // StatsPersistentVal (2x) - 58757: 1293, // StatsType (2x) - 58764: 1294, // SubPartDefinition (2x) - 58767: 1295, // SubPartitionMethod (2x) - 58772: 1296, // Symbol (2x) - 58778: 1297, // TableElementList (2x) - 58781: 1298, // TableLock (2x) - 58785: 1299, // TableNameListOpt (2x) - 58792: 1300, // TableOrTables (2x) - 58801: 1301, // TablesTerminalSym (2x) - 58799: 1302, // TableToTable (2x) - 58803: 1303, // TextStringList (2x) - 58808: 1304, // TraceStmt (2x) - 58816: 1305, // UnlockStatsStmt (2x) - 58817: 1306, // UnlockTablesStmt (2x) - 58823: 1307, // UserToUser (2x) - 58838: 1308, // VariableAssignmentList (2x) - 58848: 1309, // WhenClause (2x) - 58853: 1310, // WindowDefinition (2x) - 58856: 1311, // WindowFrameBound (2x) - 58863: 1312, // WindowSpec (2x) - 58868: 1313, // WithGrantOptionOpt (2x) - 58869: 1314, // WithList (2x) - 58874: 1315, // Writeable (2x) - 58: 1316, // ':' (1x) - 58201: 1317, // AdminShowSlow (1x) - 58203: 1318, // AdminStmtLimitOpt (1x) - 58210: 1319, // AlterOrderList (1x) - 58215: 1320, // AlterSequenceOptionList (1x) - 58218: 1321, // AlterTableSpecList (1x) - 58219: 1322, // AlterTableSpecListOpt (1x) - 58220: 1323, // AlterTableSpecSingleOpt (1x) - 58224: 1324, // AnalyzeOptionList (1x) - 58227: 1325, // AnyOrAll (1x) - 58228: 1326, // ArrayKwdOpt (1x) - 58230: 1327, // AsOfClauseOpt (1x) - 58231: 1328, // AsOpt (1x) - 58236: 1329, // AuthOption (1x) - 58237: 1330, // AuthPlugin (1x) - 58239: 1331, // AutoRandomOpt (1x) - 58240: 1332, // BDRRole (1x) - 58250: 1333, // BetweenOrNotOp (1x) - 58252: 1334, // BindingStatusType (1x) - 57375: 1335, // both (1x) - 58264: 1336, // CalibrateOption (1x) - 58266: 1337, // CalibrateResourceWorkloadOption (1x) - 58274: 1338, // CharsetNameOrDefault (1x) - 58275: 1339, // CharsetOpt (1x) - 58280: 1340, // ColumnFormat (1x) - 58282: 1341, // ColumnList (1x) - 58289: 1342, // ColumnNameOrUserVariableList (1x) - 58286: 1343, // ColumnNameOrUserVarListOpt (1x) - 58294: 1344, // ColumnSetValueList (1x) - 58299: 1345, // CompareOp (1x) - 58303: 1346, // ConnectionOptionList (1x) - 58306: 1347, // ConstraintElem (1x) - 57387: 1348, // continueKwd (1x) - 58315: 1349, // CreateSequenceOptionListOpt (1x) - 58319: 1350, // CreateTableSelectOpt (1x) - 58322: 1351, // CreateViewSelectOpt (1x) - 57397: 1352, // cursor (1x) - 58330: 1353, // DatabaseOptionListOpt (1x) - 58327: 1354, // DBNameList (1x) - 58338: 1355, // DefaultOrExpressionList (1x) - 58340: 1356, // DefaultValueExpr (1x) - 58366: 1357, // DryRunOptions (1x) - 57416: 1358, // dual (1x) - 58368: 1359, // DynamicCalibrateOptionList (1x) - 58371: 1360, // ElseOpt (1x) - 58376: 1361, // EnforcedOrNotOrNotNullOpt (1x) - 57422: 1362, // exit (1x) - 58389: 1363, // ExpressionOpt (1x) - 58391: 1364, // FetchFirstOpt (1x) - 58393: 1365, // FieldAsName (1x) - 58394: 1366, // FieldAsNameOpt (1x) - 58396: 1367, // FieldItemList (1x) - 58398: 1368, // FieldList (1x) - 58404: 1369, // FirstAndLastPartOpt (1x) - 58405: 1370, // FirstOrNext (1x) - 58413: 1371, // FlushOption (1x) - 58417: 1372, // FromDual (1x) - 58419: 1373, // FulltextSearchModifierOpt (1x) - 58420: 1374, // FuncDatetimePrec (1x) - 58433: 1375, // GetFormatSelector (1x) - 58440: 1376, // HandleRangeList (1x) - 58445: 1377, // IdentListWithParenOpt (1x) - 58449: 1378, // IgnoreLines (1x) - 58451: 1379, // IlikeOrNotOp (1x) - 58458: 1380, // IndexHintScope (1x) - 58461: 1381, // IndexKeyTypeOpt (1x) - 58470: 1382, // IndexPartSpecificationListOpt (1x) - 58473: 1383, // IndexTypeOpt (1x) - 58453: 1384, // InOrNotOp (1x) - 58476: 1385, // InstanceOption (1x) - 58479: 1386, // IntervalExpr (1x) - 58482: 1387, // IsolationLevel (1x) - 58481: 1388, // IsOrNotOp (1x) - 57473: 1389, // leading (1x) - 58491: 1390, // LikeOrNotOp (1x) - 58492: 1391, // LikeTableWithOrWithoutParen (1x) - 58497: 1392, // LinesTerminated (1x) - 58500: 1393, // LoadDataOptionList (1x) - 58503: 1394, // LoadDataSetList (1x) - 58512: 1395, // LockType (1x) - 58513: 1396, // LogTypeOpt (1x) - 58514: 1397, // Match (1x) - 58515: 1398, // MatchOpt (1x) - 58516: 1399, // MaxIndexNumOpt (1x) - 58517: 1400, // MaxMinutesOpt (1x) - 58518: 1401, // MaxValPartOpt (1x) - 58520: 1402, // MaxValueOrExpressionList (1x) - 58533: 1403, // NullPartOpt (1x) - 58541: 1404, // OnDeleteUpdateOpt (1x) - 58542: 1405, // OnDuplicateKeyUpdate (1x) - 58544: 1406, // OptBinMod (1x) - 58546: 1407, // OptCharset (1x) - 58549: 1408, // OptExistingWindowName (1x) - 58551: 1409, // OptFromFirstLast (1x) - 58553: 1410, // OptGConcatSeparator (1x) - 58569: 1411, // OptionalShardColumn (1x) - 58559: 1412, // OptPartitionClause (1x) - 58560: 1413, // OptSpPdparams (1x) - 58561: 1414, // OptTable (1x) - 58878: 1415, // optValue (1x) - 58564: 1416, // OptWindowFrameClause (1x) - 58565: 1417, // OptWindowOrderByClause (1x) - 58571: 1418, // Order (1x) - 58570: 1419, // OrReplace (1x) - 57456: 1420, // outfile (1x) - 58577: 1421, // PartDefValuesOpt (1x) - 58582: 1422, // PartitionKeyAlgorithmOpt (1x) - 58583: 1423, // PartitionMethod (1x) - 58586: 1424, // PartitionNumOpt (1x) - 58593: 1425, // PerDB (1x) - 58594: 1426, // PerTable (1x) - 58597: 1427, // PlanReplayerDumpOpt (1x) - 57515: 1428, // precisionType (1x) - 58603: 1429, // PrepareSQL (1x) - 58879: 1430, // procedurceElseIfs (1x) - 58614: 1431, // ProcedureCall (1x) - 58617: 1432, // ProcedureCursorSelectStmt (1x) - 58619: 1433, // ProcedureDeclIdents (1x) - 58620: 1434, // ProcedureDecls (1x) - 58621: 1435, // ProcedureDeclsOpt (1x) - 58623: 1436, // ProcedureFetchList (1x) - 58624: 1437, // ProcedureHandlerType (1x) - 58626: 1438, // ProcedureHcondList (1x) - 58633: 1439, // ProcedureOptDefault (1x) - 58634: 1440, // ProcedureOptFetchNo (1x) - 58637: 1441, // ProcedureProcStmts (1x) - 58646: 1442, // QueryWatchOptionList (1x) - 57522: 1443, // recursive (1x) - 58652: 1444, // RegexpOrNotOp (1x) - 58657: 1445, // ReorganizePartitionRuleOpt (1x) - 58662: 1446, // RequireList (1x) - 58664: 1447, // ResourceGroupBackgroundOptionList (1x) - 58668: 1448, // ResourceGroupPriorityOption (1x) - 58670: 1449, // ResourceGroupRunawayOptionList (1x) + 58667: 1260, // ResourceGroupNameOption (2x) + 58668: 1261, // ResourceGroupOptionList (2x) + 58670: 1262, // ResourceGroupRunawayActionOption (2x) + 58672: 1263, // ResourceGroupRunawayWatchOption (2x) + 58673: 1264, // RestartStmt (2x) + 57533: 1265, // revoke (2x) + 58675: 1266, // RevokeRoleStmt (2x) + 58676: 1267, // RevokeStmt (2x) + 58679: 1268, // RoleOrPrivElemList (2x) + 58680: 1269, // RoleSpec (2x) + 58692: 1270, // SearchWhenThen (2x) + 58704: 1271, // SelectStmtOpt (2x) + 58707: 1272, // SelectStmtSQLCache (2x) + 58711: 1273, // SetBindingStmt (2x) + 58712: 1274, // SetDefaultRoleOpt (2x) + 58713: 1275, // SetDefaultRoleStmt (2x) + 58723: 1276, // SetRoleStmt (2x) + 58731: 1277, // ShowProfileType (2x) + 58734: 1278, // ShowStmt (2x) + 58735: 1279, // ShowTableAliasOpt (2x) + 58737: 1280, // ShutdownStmt (2x) + 58742: 1281, // SimpleWhenThen (2x) + 58747: 1282, // SplitOption (2x) + 58748: 1283, // SplitRegionStmt (2x) + 58744: 1284, // SpOptInout (2x) + 58745: 1285, // SpPdparam (2x) + 57546: 1286, // sqlexception (2x) + 57547: 1287, // sqlstate (2x) + 57548: 1288, // sqlwarning (2x) + 58752: 1289, // Statement (2x) + 58755: 1290, // StatsOptionsOpt (2x) + 58756: 1291, // StatsPersistentVal (2x) + 58757: 1292, // StatsType (2x) + 58764: 1293, // SubPartDefinition (2x) + 58767: 1294, // SubPartitionMethod (2x) + 58772: 1295, // Symbol (2x) + 58778: 1296, // TableElementList (2x) + 58781: 1297, // TableLock (2x) + 58785: 1298, // TableNameListOpt (2x) + 58801: 1299, // TablesTerminalSym (2x) + 58799: 1300, // TableToTable (2x) + 58803: 1301, // TextStringList (2x) + 58808: 1302, // TraceStmt (2x) + 58816: 1303, // UnlockStatsStmt (2x) + 58817: 1304, // UnlockTablesStmt (2x) + 58823: 1305, // UserToUser (2x) + 58838: 1306, // VariableAssignmentList (2x) + 58848: 1307, // WhenClause (2x) + 58853: 1308, // WindowDefinition (2x) + 58856: 1309, // WindowFrameBound (2x) + 58863: 1310, // WindowSpec (2x) + 58868: 1311, // WithGrantOptionOpt (2x) + 58869: 1312, // WithList (2x) + 58874: 1313, // Writeable (2x) + 58: 1314, // ':' (1x) + 58201: 1315, // AdminShowSlow (1x) + 58203: 1316, // AdminStmtLimitOpt (1x) + 58210: 1317, // AlterOrderList (1x) + 58215: 1318, // AlterSequenceOptionList (1x) + 58218: 1319, // AlterTableSpecList (1x) + 58219: 1320, // AlterTableSpecListOpt (1x) + 58220: 1321, // AlterTableSpecSingleOpt (1x) + 58224: 1322, // AnalyzeOptionList (1x) + 58227: 1323, // AnyOrAll (1x) + 58228: 1324, // ArrayKwdOpt (1x) + 58230: 1325, // AsOfClauseOpt (1x) + 58231: 1326, // AsOpt (1x) + 58236: 1327, // AuthOption (1x) + 58237: 1328, // AuthPlugin (1x) + 58239: 1329, // AutoRandomOpt (1x) + 58240: 1330, // BDRRole (1x) + 58250: 1331, // BetweenOrNotOp (1x) + 58252: 1332, // BindingStatusType (1x) + 57375: 1333, // both (1x) + 58264: 1334, // CalibrateOption (1x) + 58266: 1335, // CalibrateResourceWorkloadOption (1x) + 58274: 1336, // CharsetNameOrDefault (1x) + 58275: 1337, // CharsetOpt (1x) + 58280: 1338, // ColumnFormat (1x) + 58282: 1339, // ColumnList (1x) + 58289: 1340, // ColumnNameOrUserVariableList (1x) + 58286: 1341, // ColumnNameOrUserVarListOpt (1x) + 58294: 1342, // ColumnSetValueList (1x) + 58299: 1343, // CompareOp (1x) + 58303: 1344, // ConnectionOptionList (1x) + 58306: 1345, // ConstraintElem (1x) + 57387: 1346, // continueKwd (1x) + 58315: 1347, // CreateSequenceOptionListOpt (1x) + 58319: 1348, // CreateTableSelectOpt (1x) + 58322: 1349, // CreateViewSelectOpt (1x) + 57397: 1350, // cursor (1x) + 58330: 1351, // DatabaseOptionListOpt (1x) + 58327: 1352, // DBNameList (1x) + 58338: 1353, // DefaultOrExpressionList (1x) + 58340: 1354, // DefaultValueExpr (1x) + 58365: 1355, // DryRunOptions (1x) + 57416: 1356, // dual (1x) + 58367: 1357, // DynamicCalibrateOptionList (1x) + 58370: 1358, // ElseOpt (1x) + 58375: 1359, // EnforcedOrNotOrNotNullOpt (1x) + 57423: 1360, // exit (1x) + 58388: 1361, // ExpressionOpt (1x) + 58390: 1362, // FetchFirstOpt (1x) + 58392: 1363, // FieldAsName (1x) + 58393: 1364, // FieldAsNameOpt (1x) + 58395: 1365, // FieldItemList (1x) + 58397: 1366, // FieldList (1x) + 58403: 1367, // FirstAndLastPartOpt (1x) + 58404: 1368, // FirstOrNext (1x) + 58412: 1369, // FlushOption (1x) + 58416: 1370, // FromDual (1x) + 58418: 1371, // FulltextSearchModifierOpt (1x) + 58419: 1372, // FuncDatetimePrec (1x) + 58432: 1373, // GetFormatSelector (1x) + 58439: 1374, // HandleRangeList (1x) + 58444: 1375, // IdentListWithParenOpt (1x) + 58448: 1376, // IgnoreLines (1x) + 58450: 1377, // IlikeOrNotOp (1x) + 58451: 1378, // ImportFromSelectStmt (1x) + 58458: 1379, // IndexHintScope (1x) + 58461: 1380, // IndexKeyTypeOpt (1x) + 58470: 1381, // IndexPartSpecificationListOpt (1x) + 58473: 1382, // IndexTypeOpt (1x) + 58453: 1383, // InOrNotOp (1x) + 58476: 1384, // InstanceOption (1x) + 58479: 1385, // IntervalExpr (1x) + 58482: 1386, // IsolationLevel (1x) + 58481: 1387, // IsOrNotOp (1x) + 57473: 1388, // leading (1x) + 58491: 1389, // LikeOrNotOp (1x) + 58492: 1390, // LikeTableWithOrWithoutParen (1x) + 58497: 1391, // LinesTerminated (1x) + 58500: 1392, // LoadDataOptionList (1x) + 58503: 1393, // LoadDataSetList (1x) + 58512: 1394, // LockType (1x) + 58513: 1395, // LogTypeOpt (1x) + 58514: 1396, // Match (1x) + 58515: 1397, // MatchOpt (1x) + 58516: 1398, // MaxIndexNumOpt (1x) + 58517: 1399, // MaxMinutesOpt (1x) + 58518: 1400, // MaxValPartOpt (1x) + 58520: 1401, // MaxValueOrExpressionList (1x) + 58533: 1402, // NullPartOpt (1x) + 58541: 1403, // OnDeleteUpdateOpt (1x) + 58542: 1404, // OnDuplicateKeyUpdate (1x) + 58544: 1405, // OptBinMod (1x) + 58546: 1406, // OptCharset (1x) + 58549: 1407, // OptExistingWindowName (1x) + 58551: 1408, // OptFromFirstLast (1x) + 58553: 1409, // OptGConcatSeparator (1x) + 58570: 1410, // OptionalShardColumn (1x) + 58559: 1411, // OptPartitionClause (1x) + 58560: 1412, // OptSpPdparams (1x) + 58561: 1413, // OptTable (1x) + 58878: 1414, // optValue (1x) + 58564: 1415, // OptWindowFrameClause (1x) + 58565: 1416, // OptWindowOrderByClause (1x) + 58572: 1417, // Order (1x) + 58571: 1418, // OrReplace (1x) + 57513: 1419, // outfile (1x) + 58578: 1420, // PartDefValuesOpt (1x) + 58583: 1421, // PartitionKeyAlgorithmOpt (1x) + 58584: 1422, // PartitionMethod (1x) + 58587: 1423, // PartitionNumOpt (1x) + 58593: 1424, // PerDB (1x) + 58594: 1425, // PerTable (1x) + 58597: 1426, // PlanReplayerDumpOpt (1x) + 57517: 1427, // precisionType (1x) + 58603: 1428, // PrepareSQL (1x) + 58879: 1429, // procedurceElseIfs (1x) + 58614: 1430, // ProcedureCall (1x) + 58617: 1431, // ProcedureCursorSelectStmt (1x) + 58619: 1432, // ProcedureDeclIdents (1x) + 58620: 1433, // ProcedureDecls (1x) + 58621: 1434, // ProcedureDeclsOpt (1x) + 58623: 1435, // ProcedureFetchList (1x) + 58624: 1436, // ProcedureHandlerType (1x) + 58626: 1437, // ProcedureHcondList (1x) + 58633: 1438, // ProcedureOptDefault (1x) + 58634: 1439, // ProcedureOptFetchNo (1x) + 58637: 1440, // ProcedureProcStmts (1x) + 58646: 1441, // QueryWatchOptionList (1x) + 57524: 1442, // recursive (1x) + 58652: 1443, // RegexpOrNotOp (1x) + 58657: 1444, // ReorganizePartitionRuleOpt (1x) + 58660: 1445, // Replica (1x) + 58663: 1446, // RequireList (1x) + 58665: 1447, // ResourceGroupBackgroundOptionList (1x) + 58669: 1448, // ResourceGroupPriorityOption (1x) + 58671: 1449, // ResourceGroupRunawayOptionList (1x) 58681: 1450, // RoleSpecList (1x) 58688: 1451, // RowOrRows (1x) 58693: 1452, // SearchedWhenThenList (1x) @@ -2387,17 +2387,17 @@ var ( 58733: 1465, // ShowProfileTypesOpt (1x) 58736: 1466, // ShowTargetFilterable (1x) 58743: 1467, // SimpleWhenThenList (1x) - 57542: 1468, // spatial (1x) + 57544: 1468, // spatial (1x) 58749: 1469, // SplitSyntaxOption (1x) 58746: 1470, // SpPdparams (1x) - 57550: 1471, // ssl (1x) + 57552: 1471, // ssl (1x) 58750: 1472, // Start (1x) 58751: 1473, // Starting (1x) - 57551: 1474, // starting (1x) + 57553: 1474, // starting (1x) 58753: 1475, // StatementList (1x) 58754: 1476, // StatementScope (1x) 58758: 1477, // StorageMedia (1x) - 57557: 1478, // stored (1x) + 57555: 1478, // stored (1x) 58759: 1479, // StringList (1x) 58762: 1480, // StringNameOrBRIEOptionKeyword (1x) 58765: 1481, // SubPartDefinitionList (1x) @@ -2411,7 +2411,7 @@ var ( 58797: 1489, // TableSampleOpt (1x) 58798: 1490, // TableSampleUnitOpt (1x) 58800: 1491, // TableToTableList (1x) - 57564: 1492, // trailing (1x) + 57565: 1492, // trailing (1x) 58812: 1493, // TrimDirection (1x) 58824: 1494, // UserToUserList (1x) 58826: 1495, // UserVariableList (1x) @@ -2424,7 +2424,7 @@ var ( 58843: 1502, // ViewFieldList (1x) 58844: 1503, // ViewName (1x) 58845: 1504, // ViewSQLSecurity (1x) - 57585: 1505, // virtual (1x) + 57586: 1505, // virtual (1x) 58846: 1506, // VirtualOrStored (1x) 58847: 1507, // WatchDurationOption (1x) 58849: 1508, // WhenClauseList (1x) @@ -2501,8 +2501,8 @@ var ( "keyBlockSize", "tablespace", "encryption", - "data", "engine", + "data", "insertMethod", "maxRows", "minRows", @@ -2611,12 +2611,14 @@ var ( "voterConstraints", "voters", "columns", + "importKwd", "view", "day", "watch", "defined", "execElapsed", "second", + "status", "hour", "microsecond", "minute", @@ -2632,12 +2634,12 @@ var ( "week", "ascii", "byteType", + "tables", "unicodeSym", "fields", - "status", "logs", - "tables", "timeDuration", + "local", "query", "separator", "cipher", @@ -2652,18 +2654,17 @@ var ( "tokenIssuer", "endTime", "jsonType", - "local", "startTime", "datetimeType", "dateType", "fixed", - "job", "timeType", "bindings", "definer", "hash", "identified", "respect", + "role", "timestampType", "value", "backup", @@ -2675,7 +2676,6 @@ var ( "next_row_id", "nowait", "only", - "role", "savepoint", "skip", "taskTypes", @@ -2689,13 +2689,14 @@ var ( "enum", "global", "hypo", - "importKwd", + "job", "national", "ncharType", "nvarcharType", "offset", "policy", "predicate", + "replica", "temporary", "user", "digest", @@ -2703,7 +2704,6 @@ var ( "location", "planCache", "prepare", - "replica", "stats", "unknown", "wait", @@ -2758,6 +2758,7 @@ var ( "without", "admin", "batch", + "bdr", "binlog", "block", "br", @@ -2794,6 +2795,7 @@ var ( "histogram", "hosts", "identSQLErrors", + "incremental", "inplace", "instance", "instant", @@ -2806,7 +2808,6 @@ var ( "modify", "nodeID", "nodeState", - "none", "nulls", "pageSym", "pump", @@ -2822,6 +2823,7 @@ var ( "secondaryUnload", "share", "shutdown", + "slave", "source", "statsOptions", "stop", @@ -2848,7 +2850,6 @@ var ( "ago", "always", "backups", - "bdr", "bernoulli", "bindingCache", "builtins", @@ -2878,7 +2879,6 @@ var ( "function", "grants", "histogramsInFlight", - "incremental", "indexes", "internal", "invoker", @@ -2886,12 +2886,12 @@ var ( "language", "level", "list", - "local_only", "log", "master", "max_minutes", "never", "nextval", + "none", "oltpReadOnly", "oltpReadWrite", "oltpWriteOnly", @@ -2921,7 +2921,6 @@ var ( "serializable", "sessionStates", "simple", - "slave", "statsHealthy", "statsHistograms", "statsLocked", @@ -2940,6 +2939,7 @@ var ( "triggers", "uncommitted", "undefined", + "unset", "width", "workload", "x509", @@ -3039,13 +3039,14 @@ var ( "replace", "charType", "fetch", + "limit", "set", "eq", - "limit", "forKwd", - "intLit", "into", + "'*'", "from", + "intLit", "lock", "where", "order", @@ -3068,7 +3069,6 @@ var ( "cross", "explain", "inner", - "'*'", "'}'", "binaryType", "insert", @@ -3092,8 +3092,8 @@ var ( "asc", "in", "then", - "'/'", "tableKwd", + "'/'", "'%'", "'&'", "'^'", @@ -3103,13 +3103,13 @@ var ( "rsh", "'<'", "'>'", - "caseKwd", "ge", "is", "le", "neq", "neqSynonym", "nulleq", + "caseKwd", "repeat", "between", "singleAtIdentifier", @@ -3139,8 +3139,9 @@ var ( "doubleAtIdentifier", "localTime", "localTs", - "builtinCount", + "selectKwd", "sql", + "builtinCount", "'!'", "'~'", "builtinApproxCountDistinct", @@ -3180,7 +3181,6 @@ var ( "percentRank", "rank", "rowNumber", - "selectKwd", "tidbCurrentTSO", "utcDate", "utcTime", @@ -3224,10 +3224,10 @@ var ( "integerType", "intType", "realType", + "create", "varbinaryType", "bigIntType", "blobType", - "create", "float4Type", "float8Type", "foreign", @@ -3252,10 +3252,10 @@ var ( "toTimestamp", "toTSO", "change", + "optimize", "rename", "write", "add", - "optimize", "Identifier", "NotKeywordToken", "TiDBKeyword", @@ -3296,39 +3296,39 @@ var ( "SelectStmtFromDualTable", "SelectStmtFromTable", "SetOprClause", - "LengthNum", "SetOprClauseList", "SetOprStmtWithLimitOrderBy", "SetOprStmtWoutLimitOrderBy", - "unsigned", + "LengthNum", "WithClause", "SelectStmtWithClause", "SetOprStmt", + "unsigned", "zerofill", "over", - "ColumnName", "UpdateStmtNoWith", + "ColumnName", "DeleteWithoutUsingStmt", "InsertIntoStmt", - "Int64Num", "ReplaceIntoStmt", "UpdateStmt", "describe", "distinct", "distinctRow", "while", + "Int64Num", "WindowingClause", + "delayed", "DeleteWithUsingStmt", + "highPriority", "iterate", "leave", - "delayed", - "highPriority", "lowPriority", "DeleteFromStmt", "hintComment", - "FieldLen", "OrderBy", "SelectStmtLimit", + "FieldLen", "OptWindowingClause", "AnalyzeTableStmt", "CommitStmt", @@ -3368,8 +3368,8 @@ var ( "ProcedureStatementStmt", "ProcedureUnlabeledBlock", "ProcedureUnlabelLoopBlock", - "IfNotExists", "TableNameList", + "IfNotExists", "DistinctKwd", "TimestampUnit", "DistinctOpt", @@ -3379,8 +3379,8 @@ var ( "DefaultKwdOpt", "EqOrAssignmentEq", "ExprOrDefault", - "load", "JoinTable", + "noWriteToBinLog", "OptBinary", "release", "RolenameComposed", @@ -3393,7 +3393,9 @@ var ( "CharsetName", "ColumnNameList", "DBName", - "noWriteToBinLog", + "ImportIntoStmt", + "load", + "NoWriteToBinLogAliasOpt", "OrderByOptional", "PartDefOption", "SignedNum", @@ -3409,10 +3411,10 @@ var ( "ExpressionListOpt", "IndexPartSpecification", "KeyOrIndex", - "NoWriteToBinLogAliasOpt", "SelectStmtLimitOpt", "VariableName", "AllOrPartitionNameList", + "BindableStmt", "ConstraintKeywordOpt", "DatabaseSym", "FieldsOrColumns", @@ -3426,10 +3428,10 @@ var ( "RowValue", "SetExpr", "ShowDatabaseNameOpt", + "TableOptimizerHints", "TableOption", "varying", "BeginTransactionStmt", - "BindableStmt", "BRIEBooleanOptionName", "BRIEIntegerOptionName", "BRIEKeywordOptionName", @@ -3454,7 +3456,6 @@ var ( "RolenameList", "SavepointStmt", "show", - "TableOptimizerHints", "UsernameList", "WithClustered", "AlgorithmClause", @@ -3478,6 +3479,7 @@ var ( "PriorityOpt", "SelectLockOpt", "SelectStmtIntoOption", + "TableOptimizerHintsOpt", "TableRefs", "UserSpec", "AsOfClause", @@ -3504,7 +3506,6 @@ var ( "TableAsName", "TableAsNameOpt", "TableNameOptWild", - "TableOptimizerHintsOpt", "TableOptionList", "TextString", "TraceableStmt", @@ -3542,6 +3543,7 @@ var ( "IntegerType", "keys", "Lines", + "LoadDataOptionListOpt", "LocationLabelList", "NChar", "NowSym", @@ -3571,6 +3573,7 @@ var ( "StringType", "TableAliasRefList", "TableElement", + "TableOrTables", "TextType", "TransactionChars", "trigger", @@ -3637,7 +3640,6 @@ var ( "DropBindingStmt", "DropDatabaseStmt", "DropIndexStmt", - "DropLoadDataStmt", "DropPolicyStmt", "DropProcedureStmt", "DropQueryWatchStmt", @@ -3674,7 +3676,6 @@ var ( "HashString", "HavingClause", "HelpStmt", - "ImportIntoStmt", "IndexAdviseStmt", "IndexHintList", "IndexHintListOpt", @@ -3690,7 +3691,6 @@ var ( "linear", "LinearOpt", "LoadDataOption", - "LoadDataOptionListOpt", "LoadDataSetItem", "LoadDataSetSpecOpt", "LoadStatsStmt", @@ -3708,6 +3708,7 @@ var ( "OnUpdate", "OptCollate", "OptFull", + "OptimizeTableStmt", "OptInteger", "OptionalBraces", "OptionLevel", @@ -3722,7 +3723,6 @@ var ( "PasswordOpt", "PasswordOrLockOptionList", "PasswordOrLockOptions", - "PauseLoadDataStmt", "PlacementOptionList", "PlanReplayerStmt", "PreparedStmt", @@ -3744,7 +3744,6 @@ var ( "ResourceGroupRunawayActionOption", "ResourceGroupRunawayWatchOption", "RestartStmt", - "ResumeLoadDataStmt", "revoke", "RevokeRoleStmt", "RevokeStmt", @@ -3779,7 +3778,6 @@ var ( "TableElementList", "TableLock", "TableNameListOpt", - "TableOrTables", "TablesTerminalSym", "TableToTable", "TextStringList", @@ -3859,6 +3857,7 @@ var ( "IdentListWithParenOpt", "IgnoreLines", "IlikeOrNotOp", + "ImportFromSelectStmt", "IndexHintScope", "IndexKeyTypeOpt", "IndexPartSpecificationListOpt", @@ -3925,6 +3924,7 @@ var ( "recursive", "RegexpOrNotOp", "ReorganizePartitionRuleOpt", + "Replica", "RequireList", "ResourceGroupBackgroundOptionList", "ResourceGroupPriorityOption", @@ -4063,476 +4063,476 @@ var ( {1262, 1}, {1262, 1}, {1262, 1}, - {1047, 3}, - {1047, 3}, - {1047, 4}, + {1048, 3}, + {1048, 3}, + {1048, 4}, {1507, 0}, {1507, 3}, {1507, 3}, - {983, 3}, - {983, 3}, - {983, 1}, - {983, 3}, - {983, 5}, - {983, 4}, - {983, 3}, - {983, 5}, - {983, 4}, - {983, 3}, + {984, 3}, + {984, 3}, + {984, 1}, + {984, 3}, + {984, 5}, + {984, 4}, + {984, 3}, + {984, 5}, + {984, 4}, + {984, 3}, {1447, 1}, {1447, 2}, {1447, 3}, - {1046, 3}, + {1047, 3}, {1244, 1}, {1244, 2}, {1244, 3}, - {982, 3}, - {982, 3}, - {982, 3}, - {982, 3}, - {982, 3}, - {982, 3}, - {982, 3}, - {982, 3}, - {982, 3}, - {982, 3}, - {982, 3}, - {982, 3}, + {983, 3}, + {983, 3}, + {983, 3}, + {983, 3}, + {983, 3}, + {983, 3}, + {983, 3}, + {983, 3}, + {983, 3}, + {983, 3}, + {983, 3}, + {983, 3}, {871, 4}, {871, 4}, {871, 4}, {871, 4}, - {1034, 3}, - {1034, 3}, - {1291, 3}, - {1291, 3}, - {1323, 1}, - {1323, 2}, - {1323, 4}, - {1323, 8}, - {1323, 8}, - {1323, 3}, - {1323, 3}, - {1323, 2}, - {1063, 0}, - {1063, 3}, - {1116, 1}, - {1116, 5}, - {1116, 6}, - {1116, 5}, - {1116, 5}, - {1116, 5}, - {1116, 6}, - {1116, 2}, - {1116, 5}, - {1116, 6}, - {1116, 8}, - {1116, 8}, - {1116, 1}, - {1116, 1}, - {1116, 3}, - {1116, 4}, - {1116, 5}, - {1116, 3}, - {1116, 4}, - {1116, 8}, - {1116, 4}, - {1116, 7}, - {1116, 3}, - {1116, 4}, - {1116, 4}, - {1116, 4}, - {1116, 4}, - {1116, 2}, - {1116, 2}, - {1116, 4}, - {1116, 4}, - {1116, 5}, - {1116, 3}, - {1116, 2}, - {1116, 2}, - {1116, 5}, - {1116, 6}, - {1116, 6}, - {1116, 8}, - {1116, 5}, - {1116, 5}, - {1116, 3}, - {1116, 3}, - {1116, 3}, - {1116, 5}, - {1116, 1}, - {1116, 1}, - {1116, 1}, - {1116, 1}, - {1116, 2}, - {1116, 2}, - {1116, 1}, - {1116, 1}, - {1116, 4}, - {1116, 3}, - {1116, 4}, - {1116, 1}, - {1116, 1}, - {1445, 0}, - {1445, 5}, - {933, 1}, - {933, 1}, + {1035, 3}, + {1035, 3}, + {1290, 3}, + {1290, 3}, + {1321, 1}, + {1321, 2}, + {1321, 4}, + {1321, 8}, + {1321, 8}, + {1321, 3}, + {1321, 3}, + {1321, 2}, + {1065, 0}, + {1065, 3}, + {1119, 1}, + {1119, 5}, + {1119, 6}, + {1119, 5}, + {1119, 5}, + {1119, 5}, + {1119, 6}, + {1119, 2}, + {1119, 5}, + {1119, 6}, + {1119, 8}, + {1119, 8}, + {1119, 1}, + {1119, 1}, + {1119, 3}, + {1119, 4}, + {1119, 5}, + {1119, 3}, + {1119, 4}, + {1119, 8}, + {1119, 4}, + {1119, 7}, + {1119, 3}, + {1119, 4}, + {1119, 4}, + {1119, 4}, + {1119, 4}, + {1119, 2}, + {1119, 2}, + {1119, 4}, + {1119, 4}, + {1119, 5}, + {1119, 3}, + {1119, 2}, + {1119, 2}, + {1119, 5}, + {1119, 6}, + {1119, 6}, + {1119, 8}, + {1119, 5}, + {1119, 5}, + {1119, 3}, + {1119, 3}, + {1119, 3}, + {1119, 5}, + {1119, 1}, + {1119, 1}, + {1119, 1}, + {1119, 1}, + {1119, 2}, + {1119, 2}, + {1119, 1}, + {1119, 1}, + {1119, 4}, + {1119, 3}, + {1119, 4}, + {1119, 1}, + {1119, 1}, + {1444, 0}, + {1444, 5}, + {934, 1}, + {934, 1}, {1519, 0}, {1519, 1}, {1518, 2}, {1518, 2}, - {977, 1}, - {977, 1}, - {978, 3}, - {978, 3}, - {978, 3}, - {978, 3}, - {978, 3}, - {992, 3}, - {992, 3}, - {1315, 2}, - {1315, 2}, - {929, 1}, - {929, 1}, - {1203, 0}, - {1203, 1}, - {981, 0}, - {981, 1}, - {1039, 0}, - {1039, 1}, - {1039, 2}, - {1322, 0}, - {1322, 1}, - {1321, 1}, - {1321, 3}, + {978, 1}, + {978, 1}, + {979, 3}, + {979, 3}, + {979, 3}, + {979, 3}, + {979, 3}, + {993, 3}, + {993, 3}, + {1313, 2}, + {1313, 2}, + {931, 1}, + {931, 1}, + {1204, 0}, + {1204, 1}, + {982, 0}, + {982, 1}, + {1040, 0}, + {1040, 1}, + {1040, 2}, + {1320, 0}, + {1320, 1}, + {1319, 1}, + {1319, 3}, {865, 1}, {865, 3}, - {934, 0}, - {934, 1}, - {934, 2}, - {1296, 1}, + {936, 0}, + {936, 1}, + {936, 2}, + {1295, 1}, {1257, 3}, {1491, 1}, {1491, 3}, - {1302, 3}, + {1300, 3}, {1258, 3}, {1494, 1}, {1494, 3}, - {1307, 3}, + {1305, 3}, {1254, 5}, {1254, 3}, {1254, 4}, + {1185, 4}, + {1185, 5}, + {1185, 5}, + {1185, 4}, + {1185, 5}, + {1185, 5}, {1183, 4}, - {1183, 5}, - {1183, 5}, - {1183, 4}, - {1183, 5}, - {1183, 5}, - {1181, 4}, - {1182, 0}, - {1182, 2}, - {1180, 4}, - {1284, 6}, - {1284, 8}, + {1184, 0}, + {1184, 2}, + {1182, 4}, {1283, 6}, - {1283, 2}, + {1283, 8}, + {1282, 6}, + {1282, 2}, {1469, 0}, {1469, 2}, {1469, 1}, {1469, 3}, - {851, 5}, {851, 6}, {851, 7}, - {851, 7}, + {851, 8}, {851, 8}, {851, 9}, + {851, 10}, + {851, 9}, {851, 8}, {851, 7}, - {851, 6}, - {851, 8}, - {1107, 0}, - {1107, 2}, - {1107, 2}, + {851, 9}, + {1110, 0}, + {1110, 2}, + {1110, 2}, {908, 0}, {908, 2}, - {1324, 1}, - {1324, 3}, - {1118, 2}, - {1118, 2}, - {1118, 3}, - {1118, 3}, - {1118, 2}, - {1118, 2}, - {1002, 3}, - {1033, 1}, - {1033, 3}, + {1322, 1}, + {1322, 3}, + {1121, 2}, + {1121, 2}, + {1121, 3}, + {1121, 3}, + {1121, 2}, + {1121, 2}, + {1004, 3}, + {1034, 1}, + {1034, 3}, {1522, 0}, {1522, 1}, - {949, 1}, - {949, 2}, - {949, 2}, - {949, 2}, - {949, 4}, - {949, 5}, - {949, 6}, - {949, 4}, - {949, 5}, - {1119, 2}, + {952, 1}, + {952, 2}, + {952, 2}, + {952, 2}, + {952, 4}, + {952, 5}, + {952, 6}, + {952, 4}, + {952, 5}, + {1122, 2}, {1523, 1}, {1523, 3}, - {959, 3}, - {959, 3}, - {827, 1}, - {827, 3}, - {827, 5}, + {961, 3}, + {961, 3}, + {828, 1}, + {828, 3}, + {828, 5}, {912, 1}, {912, 3}, - {1129, 0}, - {1129, 1}, - {1377, 0}, - {1377, 3}, - {986, 1}, - {986, 3}, - {1343, 0}, - {1343, 1}, - {1342, 1}, - {1342, 3}, - {1130, 1}, - {1130, 1}, - {1131, 0}, - {1131, 3}, + {1132, 0}, + {1132, 1}, + {1375, 0}, + {1375, 3}, + {987, 1}, + {987, 3}, + {1341, 0}, + {1341, 1}, + {1340, 1}, + {1340, 3}, + {1133, 1}, + {1133, 1}, + {1134, 0}, + {1134, 3}, {852, 1}, {852, 2}, - {1076, 0}, - {1076, 1}, - {921, 1}, - {921, 1}, - {1050, 1}, - {1050, 2}, - {1174, 0}, - {1174, 1}, - {1361, 2}, - {1361, 1}, - {1038, 2}, - {1038, 1}, - {1038, 1}, - {1038, 2}, - {1038, 3}, - {1038, 1}, - {1038, 2}, - {1038, 2}, - {1038, 3}, - {1038, 3}, - {1038, 2}, - {1038, 6}, - {1038, 6}, - {1038, 1}, - {1038, 2}, - {1038, 2}, - {1038, 2}, - {1038, 2}, - {1331, 0}, - {1331, 3}, - {1331, 5}, + {1078, 0}, + {1078, 1}, + {923, 1}, + {923, 1}, + {1051, 1}, + {1051, 2}, + {1176, 0}, + {1176, 1}, + {1359, 2}, + {1359, 1}, + {1039, 2}, + {1039, 1}, + {1039, 1}, + {1039, 2}, + {1039, 3}, + {1039, 1}, + {1039, 2}, + {1039, 2}, + {1039, 3}, + {1039, 3}, + {1039, 2}, + {1039, 6}, + {1039, 6}, + {1039, 1}, + {1039, 2}, + {1039, 2}, + {1039, 2}, + {1039, 2}, + {1329, 0}, + {1329, 3}, + {1329, 5}, {1477, 1}, {1477, 1}, {1477, 1}, - {1340, 1}, - {1340, 1}, - {1340, 1}, - {1054, 0}, - {1054, 2}, + {1338, 1}, + {1338, 1}, + {1338, 1}, + {1055, 0}, + {1055, 2}, {1506, 0}, {1506, 1}, {1506, 1}, - {1132, 1}, - {1132, 2}, - {1133, 0}, - {1133, 1}, - {1347, 7}, - {1347, 7}, - {1347, 7}, - {1347, 7}, - {1347, 8}, - {1347, 5}, - {1397, 2}, - {1397, 2}, - {1397, 2}, - {1398, 0}, - {1398, 1}, - {1017, 5}, + {1135, 1}, + {1135, 2}, + {1136, 0}, + {1136, 1}, + {1345, 7}, + {1345, 7}, + {1345, 7}, + {1345, 7}, + {1345, 8}, + {1345, 5}, + {1396, 2}, + {1396, 2}, + {1396, 2}, + {1397, 0}, + {1397, 1}, + {1019, 5}, {1225, 3}, {1226, 3}, - {1404, 0}, - {1404, 1}, - {1404, 1}, - {1404, 2}, - {1404, 2}, + {1403, 0}, + {1403, 1}, + {1403, 1}, + {1403, 2}, + {1403, 2}, {1255, 1}, {1255, 1}, {1255, 2}, {1255, 2}, {1255, 2}, - {1356, 1}, - {1356, 1}, - {1356, 1}, - {1356, 1}, - {1005, 3}, - {1005, 3}, - {1005, 4}, + {1354, 1}, + {1354, 1}, + {1354, 1}, + {1354, 1}, + {1007, 3}, + {1007, 3}, + {1007, 4}, {1220, 3}, {1220, 1}, - {1067, 1}, - {1067, 3}, - {1067, 4}, - {1067, 3}, - {1067, 1}, + {1069, 1}, + {1069, 3}, + {1069, 4}, + {1069, 3}, + {1069, 1}, {786, 4}, {786, 4}, - {1066, 1}, - {1066, 1}, - {1066, 1}, - {1066, 1}, - {1065, 1}, - {1065, 1}, - {1065, 1}, - {1042, 1}, - {1042, 1}, - {1088, 1}, - {1088, 2}, - {1088, 2}, - {922, 1}, - {922, 1}, - {922, 1}, - {1293, 1}, - {1293, 1}, - {1293, 1}, - {1334, 1}, - {1334, 1}, - {1146, 12}, - {1165, 3}, - {1140, 13}, - {1382, 0}, - {1382, 3}, - {938, 1}, - {938, 3}, - {928, 3}, - {928, 4}, - {1199, 0}, - {1199, 1}, - {1199, 1}, - {1199, 2}, - {1199, 2}, + {1068, 1}, + {1068, 1}, + {1068, 1}, + {1068, 1}, + {1067, 1}, + {1067, 1}, + {1067, 1}, + {1043, 1}, + {1043, 1}, + {1090, 1}, + {1090, 2}, + {1090, 2}, + {924, 1}, + {924, 1}, + {924, 1}, + {1292, 1}, + {1292, 1}, + {1292, 1}, + {1332, 1}, + {1332, 1}, + {1149, 12}, + {1167, 3}, + {1143, 13}, {1381, 0}, - {1381, 1}, - {1381, 1}, - {1381, 1}, - {1108, 4}, - {1108, 3}, - {1139, 5}, + {1381, 3}, + {940, 1}, + {940, 3}, + {930, 3}, + {930, 4}, + {1200, 0}, + {1200, 1}, + {1200, 1}, + {1200, 2}, + {1200, 2}, + {1380, 0}, + {1380, 1}, + {1380, 1}, + {1380, 1}, + {1111, 4}, + {1111, 3}, + {1142, 5}, {913, 1}, - {995, 1}, - {942, 1}, - {942, 1}, - {960, 4}, - {960, 4}, - {960, 4}, - {960, 2}, - {960, 1}, - {960, 5}, - {1353, 0}, - {1353, 1}, - {1043, 1}, - {1043, 2}, - {1041, 12}, - {1041, 7}, + {996, 1}, + {944, 1}, + {944, 1}, + {962, 4}, + {962, 4}, + {962, 4}, + {962, 2}, + {962, 1}, + {962, 5}, + {1351, 0}, + {1351, 1}, + {1044, 1}, + {1044, 2}, + {1042, 12}, + {1042, 7}, {1224, 0}, {1224, 4}, {1224, 4}, {897, 0}, {897, 1}, - {1239, 0}, - {1239, 6}, - {1295, 6}, - {1295, 5}, - {1422, 0}, + {1240, 0}, + {1240, 6}, + {1294, 6}, + {1294, 5}, + {1421, 0}, + {1421, 3}, + {1422, 1}, + {1422, 5}, + {1422, 6}, + {1422, 4}, + {1422, 5}, + {1422, 4}, {1422, 3}, - {1423, 1}, - {1423, 5}, - {1423, 6}, - {1423, 4}, - {1423, 5}, - {1423, 4}, - {1423, 3}, - {1423, 1}, - {1238, 0}, - {1238, 7}, - {1386, 1}, - {1386, 2}, - {1403, 0}, - {1403, 2}, - {1401, 0}, - {1401, 2}, - {1369, 0}, - {1369, 14}, - {1209, 0}, - {1209, 1}, + {1422, 1}, + {1239, 0}, + {1239, 7}, + {1385, 1}, + {1385, 2}, + {1402, 0}, + {1402, 2}, + {1400, 0}, + {1400, 2}, + {1367, 0}, + {1367, 14}, + {1210, 0}, + {1210, 1}, {1484, 0}, {1484, 4}, {1483, 0}, {1483, 2}, - {1424, 0}, - {1424, 2}, - {1237, 0}, + {1423, 0}, + {1423, 2}, + {1238, 0}, + {1238, 3}, + {1237, 1}, {1237, 3}, - {1236, 1}, - {1236, 3}, - {1073, 5}, + {1075, 5}, {1482, 0}, {1482, 3}, {1481, 1}, {1481, 3}, - {1294, 3}, - {1072, 0}, - {1072, 2}, - {916, 3}, - {916, 3}, - {916, 4}, - {916, 3}, - {916, 4}, - {916, 4}, - {916, 3}, - {916, 3}, - {916, 3}, - {916, 3}, - {916, 1}, - {1421, 0}, - {1421, 4}, - {1421, 6}, - {1421, 1}, - {1421, 5}, - {1421, 1}, - {1421, 1}, - {1170, 0}, - {1170, 1}, - {1170, 1}, - {1328, 0}, - {1328, 1}, - {1350, 0}, - {1350, 1}, - {1350, 1}, - {1350, 1}, - {1350, 1}, - {1351, 1}, - {1351, 1}, - {1351, 1}, - {1351, 1}, - {1391, 2}, - {1391, 4}, - {1149, 11}, - {1419, 0}, - {1419, 2}, + {1293, 3}, + {1074, 0}, + {1074, 2}, + {918, 3}, + {918, 3}, + {918, 4}, + {918, 3}, + {918, 4}, + {918, 4}, + {918, 3}, + {918, 3}, + {918, 3}, + {918, 3}, + {918, 1}, + {1420, 0}, + {1420, 4}, + {1420, 6}, + {1420, 1}, + {1420, 5}, + {1420, 1}, + {1420, 1}, + {1172, 0}, + {1172, 1}, + {1172, 1}, + {1326, 0}, + {1326, 1}, + {1348, 0}, + {1348, 1}, + {1348, 1}, + {1348, 1}, + {1348, 1}, + {1349, 1}, + {1349, 1}, + {1349, 1}, + {1349, 1}, + {1390, 2}, + {1390, 4}, + {1152, 11}, + {1418, 0}, + {1418, 2}, {1499, 0}, {1499, 3}, {1499, 3}, @@ -4545,48 +4545,48 @@ var ( {1503, 1}, {1502, 0}, {1502, 3}, - {1341, 1}, - {1341, 3}, + {1339, 1}, + {1339, 3}, {1500, 0}, {1500, 4}, {1500, 4}, - {1154, 2}, + {1157, 2}, {829, 13}, {829, 9}, - {839, 10}, + {840, 10}, {845, 1}, {845, 1}, {845, 2}, {845, 2}, - {935, 1}, - {1156, 4}, - {1157, 7}, - {1157, 7}, - {1167, 6}, - {1071, 0}, - {1071, 1}, - {1071, 2}, - {1169, 4}, + {937, 1}, + {1159, 4}, + {1160, 7}, + {1160, 7}, {1169, 6}, + {1073, 0}, + {1073, 1}, + {1073, 2}, + {1171, 4}, + {1171, 6}, + {1170, 3}, + {1170, 5}, + {1165, 3}, + {1165, 5}, {1168, 3}, {1168, 5}, - {1163, 3}, - {1163, 5}, - {1166, 3}, - {1166, 5}, - {1166, 4}, - {1018, 0}, - {1018, 1}, - {1018, 1}, - {1300, 1}, - {1300, 1}, + {1168, 4}, + {1020, 0}, + {1020, 1}, + {1020, 1}, + {1094, 1}, + {1094, 1}, {808, 0}, {808, 1}, - {1172, 0}, - {1304, 2}, - {1304, 5}, - {1304, 3}, - {1304, 6}, + {1174, 0}, + {1302, 2}, + {1302, 5}, + {1302, 3}, + {1302, 6}, {864, 1}, {864, 1}, {864, 1}, @@ -4601,88 +4601,85 @@ var ( {863, 3}, {863, 6}, {863, 6}, - {1176, 1}, - {1176, 1}, - {1176, 1}, - {1176, 1}, - {1176, 1}, - {1176, 1}, - {1176, 1}, - {1176, 1}, - {973, 2}, - {971, 3}, - {1120, 5}, - {1120, 5}, - {1120, 3}, - {1120, 4}, - {1120, 3}, - {1120, 6}, - {1120, 4}, - {1120, 6}, - {1120, 4}, - {1120, 5}, - {1120, 4}, - {1120, 5}, - {1120, 5}, - {1120, 5}, - {1121, 2}, - {1121, 2}, - {1121, 2}, - {1354, 1}, - {1354, 3}, - {955, 0}, - {955, 2}, - {952, 1}, - {952, 1}, - {951, 1}, - {951, 1}, - {951, 1}, - {951, 1}, - {951, 1}, - {951, 1}, - {951, 1}, - {951, 1}, - {956, 1}, - {956, 1}, - {956, 1}, - {956, 1}, + {1178, 1}, + {1178, 1}, + {1178, 1}, + {1178, 1}, + {1178, 1}, + {1178, 1}, + {1178, 1}, + {1178, 1}, + {975, 2}, + {973, 3}, + {1123, 5}, + {1123, 5}, + {1123, 3}, + {1123, 4}, + {1123, 3}, + {1123, 6}, + {1123, 4}, + {1123, 6}, + {1123, 4}, + {1123, 5}, + {1123, 4}, + {1123, 5}, + {1123, 5}, + {1123, 5}, + {1124, 2}, + {1124, 2}, + {1124, 2}, + {1352, 1}, + {1352, 3}, + {957, 0}, + {957, 2}, + {954, 1}, + {954, 1}, {953, 1}, {953, 1}, - {953, 2}, - {954, 3}, - {954, 3}, - {954, 3}, - {954, 3}, - {954, 5}, - {954, 3}, - {954, 3}, - {954, 3}, - {954, 3}, - {954, 6}, - {954, 3}, - {954, 3}, - {954, 3}, - {954, 3}, - {954, 3}, - {954, 3}, - {954, 3}, - {954, 3}, - {954, 3}, - {954, 3}, - {954, 3}, - {817, 1}, - {831, 1}, + {953, 1}, + {953, 1}, + {953, 1}, + {953, 1}, + {953, 1}, + {953, 1}, + {958, 1}, + {958, 1}, + {958, 1}, + {958, 1}, + {955, 1}, + {955, 1}, + {955, 2}, + {956, 3}, + {956, 3}, + {956, 3}, + {956, 3}, + {956, 5}, + {956, 3}, + {956, 3}, + {956, 3}, + {956, 3}, + {956, 6}, + {956, 3}, + {956, 3}, + {956, 3}, + {956, 3}, + {956, 3}, + {956, 3}, + {956, 3}, + {956, 3}, + {956, 3}, + {956, 3}, + {956, 3}, + {820, 1}, + {837, 1}, {805, 1}, - {1004, 1}, - {1004, 1}, - {1004, 1}, - {1231, 1}, - {1231, 1}, - {1231, 1}, - {1243, 5}, - {1265, 5}, - {1125, 4}, - {1158, 5}, + {1006, 1}, + {1006, 1}, + {1006, 1}, + {1232, 1}, + {1232, 1}, + {1232, 1}, + {1128, 4}, {804, 3}, {804, 3}, {804, 3}, @@ -4693,58 +4690,58 @@ var ( {804, 3}, {804, 3}, {804, 1}, - {1153, 1}, - {1153, 1}, + {1156, 1}, + {1156, 1}, {1218, 1}, {1218, 1}, - {1373, 0}, - {1373, 4}, - {1373, 7}, - {1373, 3}, - {1373, 3}, + {1371, 0}, + {1371, 4}, + {1371, 7}, + {1371, 3}, + {1371, 3}, {807, 1}, {807, 1}, {806, 1}, {806, 1}, {869, 1}, {869, 3}, - {1402, 1}, - {1402, 3}, - {1355, 1}, - {1355, 3}, - {927, 0}, - {927, 1}, - {1187, 0}, - {1187, 1}, - {1186, 1}, + {1401, 1}, + {1401, 3}, + {1353, 1}, + {1353, 3}, + {929, 0}, + {929, 1}, + {1189, 0}, + {1189, 1}, + {1188, 1}, {803, 3}, {803, 3}, {803, 4}, {803, 5}, {803, 1}, - {1345, 1}, - {1345, 1}, - {1345, 1}, - {1345, 1}, - {1345, 1}, - {1345, 1}, - {1345, 1}, - {1345, 1}, - {1333, 1}, - {1333, 2}, - {1388, 1}, - {1388, 2}, - {1384, 1}, - {1384, 2}, - {1390, 1}, - {1390, 2}, - {1379, 1}, - {1379, 2}, - {1444, 1}, - {1444, 2}, - {1325, 1}, - {1325, 1}, - {1325, 1}, + {1343, 1}, + {1343, 1}, + {1343, 1}, + {1343, 1}, + {1343, 1}, + {1343, 1}, + {1343, 1}, + {1343, 1}, + {1331, 1}, + {1331, 2}, + {1387, 1}, + {1387, 2}, + {1383, 1}, + {1383, 2}, + {1389, 1}, + {1389, 2}, + {1377, 1}, + {1377, 2}, + {1443, 1}, + {1443, 2}, + {1323, 1}, + {1323, 1}, + {1323, 1}, {802, 5}, {802, 3}, {802, 5}, @@ -4755,57 +4752,57 @@ var ( {802, 1}, {1256, 1}, {1256, 1}, - {1206, 0}, - {1206, 2}, - {1177, 1}, - {1177, 3}, - {1177, 5}, - {1177, 2}, - {1366, 0}, + {1207, 0}, + {1207, 2}, + {1179, 1}, + {1179, 3}, + {1179, 5}, + {1179, 2}, + {1364, 0}, + {1364, 1}, + {1363, 1}, + {1363, 2}, + {1363, 1}, + {1363, 2}, {1366, 1}, - {1365, 1}, - {1365, 2}, - {1365, 1}, - {1365, 2}, - {1368, 1}, - {1368, 3}, + {1366, 3}, {1517, 0}, {1517, 2}, - {1056, 4}, - {1193, 0}, - {1193, 2}, - {1327, 0}, - {1327, 1}, - {1001, 3}, + {1057, 4}, + {1195, 0}, + {1195, 2}, + {1325, 0}, + {1325, 1}, + {1003, 3}, {860, 0}, {860, 2}, - {889, 0}, - {889, 3}, - {964, 0}, - {964, 1}, - {987, 0}, - {987, 1}, - {989, 0}, - {989, 2}, - {988, 3}, - {988, 1}, - {988, 3}, - {988, 2}, - {988, 1}, + {890, 0}, + {890, 3}, + {966, 0}, + {966, 1}, + {988, 0}, {988, 1}, - {1059, 1}, - {1059, 3}, - {1059, 3}, - {1383, 0}, - {1383, 1}, - {967, 2}, - {967, 2}, - {1010, 1}, - {1010, 1}, - {1010, 1}, - {1010, 1}, - {965, 1}, - {965, 1}, + {990, 0}, + {990, 2}, + {989, 3}, + {989, 1}, + {989, 3}, + {989, 2}, + {989, 1}, + {989, 1}, + {1060, 1}, + {1060, 3}, + {1060, 3}, + {1382, 0}, + {1382, 1}, + {969, 2}, + {969, 2}, + {1012, 1}, + {1012, 1}, + {1012, 1}, + {1012, 1}, + {967, 1}, + {967, 1}, {777, 1}, {777, 1}, {777, 1}, @@ -5340,41 +5337,41 @@ var ( {778, 1}, {778, 1}, {778, 1}, - {1124, 2}, - {1431, 1}, - {1431, 3}, - {1431, 4}, - {1431, 6}, + {1127, 2}, + {1430, 1}, + {1430, 3}, + {1430, 4}, + {1430, 6}, {830, 9}, - {1202, 0}, + {1203, 0}, + {1203, 1}, + {1202, 5}, + {1202, 4}, + {1202, 4}, + {1202, 4}, + {1202, 4}, + {1202, 2}, + {1202, 1}, + {1202, 1}, + {1202, 1}, {1202, 1}, - {1201, 5}, - {1201, 4}, - {1201, 4}, - {1201, 4}, - {1201, 4}, - {1201, 2}, - {1201, 1}, - {1201, 1}, - {1201, 1}, - {1201, 1}, - {1201, 2}, - {1101, 1}, - {1101, 1}, - {1099, 1}, - {1099, 3}, - {944, 3}, + {1202, 2}, + {1104, 1}, + {1104, 1}, + {1102, 1}, + {1102, 3}, + {946, 3}, {1498, 0}, {1498, 1}, {1497, 3}, {1497, 1}, {899, 1}, {899, 1}, - {1344, 3}, - {1344, 5}, - {1405, 0}, - {1405, 5}, - {832, 6}, + {1342, 3}, + {1342, 5}, + {1404, 0}, + {1404, 5}, + {831, 7}, {783, 1}, {783, 1}, {783, 1}, @@ -5389,21 +5386,21 @@ var ( {783, 2}, {785, 1}, {785, 2}, - {1319, 1}, - {1319, 3}, - {1110, 2}, - {848, 3}, - {1006, 1}, - {1006, 3}, - {979, 1}, - {979, 2}, - {1418, 1}, - {1418, 1}, - {1070, 0}, - {1070, 1}, - {1070, 1}, - {915, 0}, - {915, 1}, + {1317, 1}, + {1317, 3}, + {1113, 2}, + {847, 3}, + {1008, 1}, + {1008, 3}, + {980, 1}, + {980, 2}, + {1417, 1}, + {1417, 1}, + {1072, 0}, + {1072, 1}, + {1072, 1}, + {917, 0}, + {917, 1}, {801, 3}, {801, 3}, {801, 3}, @@ -5454,18 +5451,18 @@ var ( {796, 4}, {796, 3}, {796, 3}, - {1326, 0}, - {1326, 1}, + {1324, 0}, + {1324, 1}, {891, 1}, {891, 1}, {893, 1}, {893, 1}, - {919, 0}, - {919, 1}, - {1045, 0}, - {1045, 1}, - {918, 1}, - {918, 2}, + {921, 0}, + {921, 1}, + {1046, 0}, + {1046, 1}, + {920, 1}, + {920, 2}, {790, 1}, {790, 1}, {790, 1}, @@ -5497,8 +5494,8 @@ var ( {790, 1}, {790, 1}, {790, 1}, - {1230, 0}, - {1230, 2}, + {1231, 0}, + {1231, 2}, {794, 1}, {794, 1}, {794, 1}, @@ -5546,10 +5543,10 @@ var ( {789, 7}, {789, 1}, {789, 8}, - {1375, 1}, - {1375, 1}, - {1375, 1}, - {1375, 1}, + {1373, 1}, + {1373, 1}, + {1373, 1}, + {1373, 1}, {791, 1}, {791, 1}, {792, 1}, @@ -5587,13 +5584,13 @@ var ( {797, 8}, {797, 8}, {797, 9}, - {1410, 0}, - {1410, 2}, + {1409, 0}, + {1409, 2}, {787, 4}, {787, 6}, - {1374, 0}, - {1374, 2}, - {1374, 3}, + {1372, 0}, + {1372, 2}, + {1372, 3}, {907, 1}, {907, 1}, {907, 1}, @@ -5623,67 +5620,68 @@ var ( {892, 1}, {892, 1}, {892, 1}, - {1363, 0}, - {1363, 1}, + {1361, 0}, + {1361, 1}, {1508, 1}, {1508, 2}, - {1309, 4}, - {1360, 0}, - {1360, 2}, - {1126, 2}, - {1126, 3}, - {1126, 1}, - {1126, 1}, - {1126, 2}, - {1126, 2}, - {1126, 2}, - {1126, 2}, - {1126, 2}, - {1126, 1}, - {1126, 1}, - {1126, 2}, - {1126, 1}, - {940, 1}, - {940, 1}, - {940, 1}, - {996, 0}, - {996, 1}, + {1307, 4}, + {1358, 0}, + {1358, 2}, + {1129, 2}, + {1129, 3}, + {1129, 1}, + {1129, 1}, + {1129, 2}, + {1129, 2}, + {1129, 2}, + {1129, 2}, + {1129, 2}, + {1129, 1}, + {1129, 1}, + {1129, 2}, + {1129, 1}, + {942, 1}, + {942, 1}, + {942, 1}, + {997, 0}, + {997, 1}, {810, 1}, {810, 3}, - {890, 1}, - {890, 3}, - {1024, 2}, - {1024, 4}, - {1090, 1}, - {1090, 3}, - {1014, 0}, - {1014, 2}, + {810, 3}, + {889, 1}, + {889, 3}, + {1026, 2}, + {1026, 4}, + {1092, 1}, + {1092, 3}, + {1016, 0}, + {1016, 2}, {1253, 0}, {1253, 1}, {1246, 4}, - {1429, 1}, - {1429, 1}, - {1175, 2}, - {1175, 4}, + {1428, 1}, + {1428, 1}, + {1177, 2}, + {1177, 4}, {1495, 1}, {1495, 3}, - {1151, 3}, - {1152, 1}, - {1152, 1}, + {1154, 3}, + {1155, 1}, + {1155, 1}, {853, 1}, {853, 2}, {853, 3}, {853, 4}, - {1135, 4}, - {1135, 4}, - {1135, 5}, - {1135, 2}, - {1135, 3}, - {1135, 1}, - {1135, 2}, - {1281, 1}, + {1138, 4}, + {1138, 4}, + {1138, 5}, + {1138, 2}, + {1138, 3}, + {1138, 1}, + {1138, 2}, + {1280, 1}, {1264, 1}, - {1194, 2}, + {1196, 2}, {813, 4}, {814, 3}, {815, 7}, @@ -5704,46 +5702,46 @@ var ( {812, 5}, {812, 6}, {812, 6}, - {823, 2}, - {823, 2}, {822, 2}, - {822, 3}, - {1314, 3}, - {1314, 1}, - {1040, 4}, - {1372, 2}, + {822, 2}, + {821, 2}, + {821, 3}, + {1312, 3}, + {1312, 1}, + {1041, 4}, + {1370, 2}, {1509, 0}, {1509, 2}, {1510, 1}, {1510, 3}, + {1308, 3}, + {1033, 1}, {1310, 3}, - {1032, 1}, - {1312, 3}, {1515, 4}, - {1408, 0}, - {1408, 1}, - {1412, 0}, - {1412, 3}, - {1417, 0}, - {1417, 3}, + {1407, 0}, + {1407, 1}, + {1411, 0}, + {1411, 3}, {1416, 0}, - {1416, 2}, + {1416, 3}, + {1415, 0}, + {1415, 2}, {1513, 1}, {1513, 1}, {1513, 1}, {1512, 1}, {1512, 1}, - {1103, 2}, - {1103, 2}, - {1103, 2}, - {1103, 4}, - {1103, 2}, + {1106, 2}, + {1106, 2}, + {1106, 2}, + {1106, 4}, + {1106, 2}, {1511, 4}, - {1311, 1}, - {1311, 2}, - {1311, 2}, - {1311, 2}, - {1311, 4}, + {1309, 1}, + {1309, 2}, + {1309, 2}, + {1309, 2}, + {1309, 4}, {850, 0}, {850, 1}, {838, 2}, @@ -5760,142 +5758,142 @@ var ( {800, 6}, {800, 6}, {800, 9}, - {1232, 0}, - {1232, 3}, - {1232, 3}, {1233, 0}, - {1233, 2}, - {994, 0}, - {994, 2}, - {994, 2}, - {1409, 0}, - {1409, 2}, - {1409, 2}, + {1233, 3}, + {1233, 3}, + {1234, 0}, + {1234, 2}, + {995, 0}, + {995, 2}, + {995, 2}, + {1408, 0}, + {1408, 2}, + {1408, 2}, {1487, 1}, - {999, 1}, - {999, 3}, - {961, 1}, - {961, 4}, + {1001, 1}, + {1001, 3}, + {963, 1}, + {963, 4}, {906, 1}, {906, 1}, {905, 6}, {905, 2}, {905, 3}, - {969, 0}, - {969, 4}, - {1023, 0}, - {1023, 1}, - {1022, 1}, - {1022, 2}, - {1058, 2}, - {1058, 2}, - {1058, 2}, - {1380, 0}, - {1380, 2}, - {1380, 3}, - {1380, 3}, - {1057, 5}, - {966, 0}, - {966, 1}, - {966, 3}, - {966, 1}, - {966, 3}, - {1197, 1}, - {1197, 2}, - {1198, 0}, + {971, 0}, + {971, 4}, + {1025, 0}, + {1025, 1}, + {1024, 1}, + {1024, 2}, + {1059, 2}, + {1059, 2}, + {1059, 2}, + {1379, 0}, + {1379, 2}, + {1379, 3}, + {1379, 3}, + {1058, 5}, + {968, 0}, + {968, 1}, + {968, 3}, + {968, 1}, + {968, 3}, {1198, 1}, - {901, 3}, - {901, 5}, - {901, 7}, - {901, 7}, - {901, 9}, - {901, 4}, - {901, 6}, - {901, 3}, - {901, 5}, - {920, 1}, - {920, 1}, - {1235, 0}, - {1235, 1}, - {925, 1}, - {925, 2}, - {925, 2}, - {1207, 0}, - {1207, 2}, - {991, 1}, - {991, 1}, + {1198, 2}, + {1199, 0}, + {1199, 1}, + {900, 3}, + {900, 5}, + {900, 7}, + {900, 7}, + {900, 9}, + {900, 4}, + {900, 6}, + {900, 3}, + {900, 5}, + {922, 1}, + {922, 1}, + {1236, 0}, + {1236, 1}, + {927, 1}, + {927, 2}, + {927, 2}, + {1208, 0}, + {1208, 2}, + {992, 1}, + {992, 1}, {1451, 1}, {1451, 1}, - {1370, 1}, - {1370, 1}, - {1364, 0}, - {1364, 1}, - {849, 2}, - {849, 4}, - {849, 4}, - {849, 5}, - {931, 0}, - {931, 1}, - {1272, 1}, - {1272, 1}, - {1272, 1}, - {1272, 1}, - {1272, 1}, - {1272, 1}, - {1272, 1}, - {1272, 1}, - {1272, 1}, + {1368, 1}, + {1368, 1}, + {1362, 0}, + {1362, 1}, + {848, 2}, + {848, 4}, + {848, 4}, + {848, 5}, + {932, 0}, + {932, 1}, + {1271, 1}, + {1271, 1}, + {1271, 1}, + {1271, 1}, + {1271, 1}, + {1271, 1}, + {1271, 1}, + {1271, 1}, + {1271, 1}, {1454, 0}, {1454, 1}, {1455, 2}, {1455, 1}, - {975, 1}, - {1025, 0}, - {1025, 1}, - {1273, 1}, - {1273, 1}, + {949, 1}, + {1000, 0}, + {1000, 1}, + {1272, 1}, + {1272, 1}, {1453, 1}, - {1086, 0}, - {1086, 1}, - {998, 0}, - {998, 5}, + {1088, 0}, + {1088, 1}, + {999, 0}, + {999, 5}, {781, 3}, {781, 3}, {781, 3}, {781, 3}, - {997, 0}, - {997, 3}, - {997, 3}, - {997, 4}, - {997, 5}, - {997, 4}, - {997, 5}, - {997, 5}, - {997, 4}, + {998, 0}, + {998, 3}, + {998, 3}, + {998, 4}, + {998, 5}, + {998, 4}, + {998, 5}, + {998, 5}, + {998, 4}, {1223, 0}, {1223, 2}, - {824, 1}, - {824, 1}, - {824, 2}, - {824, 2}, - {820, 3}, - {820, 3}, - {819, 4}, - {819, 4}, - {819, 5}, - {819, 2}, - {819, 2}, + {823, 1}, + {823, 1}, + {823, 2}, + {823, 2}, {819, 3}, - {818, 1}, + {819, 3}, + {818, 4}, + {818, 4}, + {818, 5}, + {818, 2}, + {818, 2}, {818, 3}, + {817, 1}, + {817, 3}, {816, 1}, {816, 1}, {1457, 2}, {1457, 2}, {1457, 2}, - {1087, 1}, - {1127, 9}, - {1127, 9}, + {1089, 1}, + {1130, 9}, + {1130, 9}, {854, 2}, {854, 4}, {854, 6}, @@ -5906,53 +5904,53 @@ var ( {854, 6}, {854, 3}, {854, 4}, - {1277, 3}, - {1276, 6}, - {1275, 1}, - {1275, 1}, - {1275, 1}, + {1276, 3}, + {1275, 6}, + {1274, 1}, + {1274, 1}, + {1274, 1}, {1458, 3}, {1458, 1}, {1458, 1}, - {1093, 1}, - {1093, 3}, - {1029, 3}, - {1029, 2}, - {1029, 2}, - {1029, 3}, - {1387, 2}, - {1387, 2}, - {1387, 2}, - {1387, 1}, - {945, 1}, - {945, 1}, - {945, 1}, + {1096, 1}, + {1096, 3}, + {1030, 3}, + {1030, 2}, + {1030, 2}, + {1030, 3}, + {1386, 2}, + {1386, 2}, + {1386, 2}, + {1386, 1}, + {947, 1}, + {947, 1}, + {947, 1}, {898, 1}, {898, 1}, - {932, 1}, - {932, 3}, - {1007, 1}, - {1007, 3}, - {1007, 3}, - {1102, 3}, - {1102, 4}, - {1102, 4}, - {1102, 4}, - {1102, 3}, - {1102, 3}, - {1102, 2}, - {1102, 4}, - {1102, 4}, - {1102, 2}, - {1102, 2}, - {1338, 1}, - {1338, 1}, + {933, 1}, + {933, 3}, + {1009, 1}, + {1009, 3}, + {1009, 3}, + {1105, 3}, + {1105, 4}, + {1105, 4}, + {1105, 4}, + {1105, 3}, + {1105, 3}, + {1105, 2}, + {1105, 4}, + {1105, 4}, + {1105, 2}, + {1105, 2}, + {1336, 1}, + {1336, 1}, {911, 1}, {911, 1}, - {980, 1}, - {980, 1}, - {1308, 1}, - {1308, 3}, + {981, 1}, + {981, 1}, + {1306, 1}, + {1306, 3}, {799, 1}, {799, 1}, {798, 1}, @@ -5961,93 +5959,93 @@ var ( {861, 3}, {861, 2}, {861, 2}, - {976, 1}, - {976, 3}, - {1240, 1}, - {1240, 4}, - {1003, 1}, - {924, 1}, - {924, 1}, + {977, 1}, + {977, 3}, + {1241, 1}, + {1241, 4}, + {1005, 1}, + {926, 1}, + {926, 1}, {904, 3}, {904, 2}, - {1084, 1}, - {1084, 1}, - {923, 1}, - {923, 1}, - {972, 1}, - {972, 3}, - {1318, 2}, - {1318, 4}, - {1318, 4}, - {1332, 1}, - {1332, 1}, - {1332, 1}, - {1332, 1}, - {1106, 3}, - {1106, 5}, - {1106, 6}, - {1106, 4}, - {1106, 4}, - {1106, 5}, - {1106, 5}, - {1106, 5}, - {1106, 6}, - {1106, 4}, - {1106, 5}, - {1106, 5}, - {1106, 5}, - {1106, 6}, - {1106, 6}, - {1106, 4}, - {1106, 3}, - {1106, 3}, - {1106, 4}, - {1106, 4}, - {1106, 5}, - {1106, 5}, - {1106, 3}, - {1106, 3}, - {1106, 3}, - {1106, 3}, - {1106, 3}, - {1106, 3}, - {1106, 3}, - {1106, 3}, - {1106, 4}, - {1106, 5}, - {1106, 4}, - {1317, 2}, - {1317, 2}, - {1317, 3}, - {1317, 3}, - {1376, 1}, - {1376, 3}, - {1191, 5}, - {1011, 1}, - {1011, 3}, - {1279, 3}, - {1279, 4}, - {1279, 4}, - {1279, 5}, - {1279, 4}, - {1279, 5}, - {1279, 5}, - {1279, 4}, - {1279, 6}, - {1279, 4}, - {1279, 8}, - {1279, 2}, - {1279, 5}, - {1279, 3}, - {1279, 4}, - {1279, 3}, - {1279, 2}, - {1279, 5}, - {1279, 2}, - {1279, 2}, - {1279, 4}, - {1279, 4}, - {1279, 4}, + {1086, 1}, + {1086, 1}, + {925, 1}, + {925, 1}, + {974, 1}, + {974, 3}, + {1316, 2}, + {1316, 4}, + {1316, 4}, + {1330, 1}, + {1330, 1}, + {1109, 3}, + {1109, 5}, + {1109, 6}, + {1109, 4}, + {1109, 4}, + {1109, 5}, + {1109, 5}, + {1109, 5}, + {1109, 6}, + {1109, 4}, + {1109, 5}, + {1109, 5}, + {1109, 5}, + {1109, 6}, + {1109, 6}, + {1109, 4}, + {1109, 3}, + {1109, 3}, + {1109, 4}, + {1109, 4}, + {1109, 5}, + {1109, 5}, + {1109, 3}, + {1109, 3}, + {1109, 3}, + {1109, 3}, + {1109, 3}, + {1109, 3}, + {1109, 3}, + {1109, 3}, + {1109, 4}, + {1109, 5}, + {1109, 4}, + {1109, 4}, + {1315, 2}, + {1315, 2}, + {1315, 3}, + {1315, 3}, + {1374, 1}, + {1374, 3}, + {1193, 5}, + {1013, 1}, + {1013, 3}, + {1278, 3}, + {1278, 4}, + {1278, 4}, + {1278, 5}, + {1278, 4}, + {1278, 5}, + {1278, 5}, + {1278, 4}, + {1278, 6}, + {1278, 4}, + {1278, 8}, + {1278, 2}, + {1278, 5}, + {1278, 3}, + {1278, 4}, + {1278, 3}, + {1278, 3}, + {1278, 2}, + {1278, 5}, + {1278, 2}, + {1278, 2}, + {1278, 4}, + {1278, 4}, + {1278, 4}, {1462, 2}, {1462, 2}, {1462, 4}, @@ -6055,15 +6053,15 @@ var ( {1465, 1}, {1464, 1}, {1464, 3}, - {1278, 1}, - {1278, 1}, - {1278, 2}, - {1278, 2}, - {1278, 2}, - {1278, 1}, - {1278, 1}, - {1278, 1}, - {1278, 1}, + {1277, 1}, + {1277, 1}, + {1277, 2}, + {1277, 2}, + {1277, 2}, + {1277, 1}, + {1277, 1}, + {1277, 1}, + {1277, 1}, {1463, 0}, {1463, 3}, {1496, 0}, @@ -6119,349 +6117,350 @@ var ( {1461, 0}, {1461, 2}, {1461, 2}, - {1055, 0}, - {1055, 1}, - {1055, 1}, + {1056, 0}, + {1056, 1}, + {1056, 1}, {1476, 0}, {1476, 1}, {1476, 1}, {1476, 1}, {1228, 0}, {1228, 1}, - {946, 0}, - {946, 2}, - {1280, 2}, - {1184, 3}, - {1075, 1}, - {1075, 3}, - {1371, 1}, - {1371, 1}, - {1371, 3}, - {1371, 1}, - {1371, 2}, - {1371, 3}, - {1371, 1}, - {1396, 0}, - {1396, 1}, - {1396, 1}, - {1396, 1}, - {1396, 1}, - {1396, 1}, - {930, 0}, - {930, 1}, - {930, 1}, - {1299, 0}, - {1299, 1}, + {948, 0}, + {948, 2}, + {1279, 2}, + {1445, 1}, + {1445, 1}, + {1186, 3}, + {1077, 1}, + {1077, 3}, + {1369, 1}, + {1369, 1}, + {1369, 3}, + {1369, 1}, + {1369, 2}, + {1369, 3}, + {1369, 1}, + {1395, 0}, + {1395, 1}, + {1395, 1}, + {1395, 1}, + {1395, 1}, + {1395, 1}, + {916, 0}, + {916, 1}, + {916, 1}, + {1298, 0}, + {1298, 1}, {1555, 0}, {1555, 2}, {1516, 0}, {1516, 3}, - {1290, 1}, - {1290, 1}, - {1290, 1}, - {1290, 1}, - {1290, 1}, - {1290, 1}, - {1290, 1}, - {1290, 1}, - {1290, 1}, - {1290, 1}, - {1290, 1}, - {1290, 1}, - {1290, 1}, - {1290, 1}, - {1290, 1}, - {1290, 1}, - {1290, 1}, - {1290, 1}, - {1290, 1}, - {1290, 1}, - {1290, 1}, - {1290, 1}, - {1290, 1}, - {1290, 1}, - {1290, 1}, - {1290, 1}, - {1290, 1}, - {1290, 1}, - {1290, 1}, - {1290, 1}, - {1290, 1}, - {1290, 1}, - {1290, 1}, - {1290, 1}, - {1290, 1}, - {1290, 1}, - {1290, 1}, - {1290, 1}, - {1290, 1}, - {1290, 1}, - {1290, 1}, - {1290, 1}, - {1290, 1}, - {1290, 1}, - {1290, 1}, - {1290, 1}, - {1290, 1}, - {1290, 1}, - {1290, 1}, - {1290, 1}, - {1290, 1}, - {1290, 1}, - {1290, 1}, - {1290, 1}, - {1290, 1}, - {1290, 1}, - {1290, 1}, - {1290, 1}, - {1290, 1}, - {1290, 1}, - {1290, 1}, - {1290, 1}, - {1290, 1}, - {1290, 1}, - {1290, 1}, - {1290, 1}, - {1290, 1}, - {1290, 1}, - {1290, 1}, - {1290, 1}, - {1290, 1}, - {1290, 1}, - {1290, 1}, - {1290, 1}, - {1290, 1}, - {1290, 1}, - {1290, 1}, - {1290, 1}, - {1290, 1}, - {1290, 1}, - {1290, 1}, - {1290, 1}, - {1290, 1}, - {1290, 1}, - {1290, 1}, - {1290, 1}, - {1290, 1}, - {1290, 1}, - {1290, 1}, - {1290, 1}, - {1290, 1}, - {1290, 1}, - {1290, 1}, - {1290, 1}, - {1290, 1}, - {1290, 1}, - {1290, 1}, - {1290, 1}, - {1290, 1}, - {1290, 1}, - {1028, 1}, - {1028, 1}, - {1028, 1}, - {1028, 1}, - {1028, 1}, - {1028, 1}, - {1028, 1}, - {1028, 1}, - {1028, 1}, - {1028, 1}, - {1028, 1}, - {1028, 1}, - {1028, 1}, - {1028, 1}, - {1028, 1}, - {1028, 1}, - {926, 1}, - {926, 1}, - {926, 1}, - {926, 1}, - {926, 1}, - {926, 1}, - {926, 1}, - {926, 1}, - {926, 1}, + {1289, 1}, + {1289, 1}, + {1289, 1}, + {1289, 1}, + {1289, 1}, + {1289, 1}, + {1289, 1}, + {1289, 1}, + {1289, 1}, + {1289, 1}, + {1289, 1}, + {1289, 1}, + {1289, 1}, + {1289, 1}, + {1289, 1}, + {1289, 1}, + {1289, 1}, + {1289, 1}, + {1289, 1}, + {1289, 1}, + {1289, 1}, + {1289, 1}, + {1289, 1}, + {1289, 1}, + {1289, 1}, + {1289, 1}, + {1289, 1}, + {1289, 1}, + {1289, 1}, + {1289, 1}, + {1289, 1}, + {1289, 1}, + {1289, 1}, + {1289, 1}, + {1289, 1}, + {1289, 1}, + {1289, 1}, + {1289, 1}, + {1289, 1}, + {1289, 1}, + {1289, 1}, + {1289, 1}, + {1289, 1}, + {1289, 1}, + {1289, 1}, + {1289, 1}, + {1289, 1}, + {1289, 1}, + {1289, 1}, + {1289, 1}, + {1289, 1}, + {1289, 1}, + {1289, 1}, + {1289, 1}, + {1289, 1}, + {1289, 1}, + {1289, 1}, + {1289, 1}, + {1289, 1}, + {1289, 1}, + {1289, 1}, + {1289, 1}, + {1289, 1}, + {1289, 1}, + {1289, 1}, + {1289, 1}, + {1289, 1}, + {1289, 1}, + {1289, 1}, + {1289, 1}, + {1289, 1}, + {1289, 1}, + {1289, 1}, + {1289, 1}, + {1289, 1}, + {1289, 1}, + {1289, 1}, + {1289, 1}, + {1289, 1}, + {1289, 1}, + {1289, 1}, + {1289, 1}, + {1289, 1}, + {1289, 1}, + {1289, 1}, + {1289, 1}, + {1289, 1}, + {1289, 1}, + {1289, 1}, + {1289, 1}, + {1289, 1}, + {1289, 1}, + {1289, 1}, + {1289, 1}, + {1289, 1}, + {1289, 1}, + {1289, 1}, + {1289, 1}, + {1029, 1}, + {1029, 1}, + {1029, 1}, + {1029, 1}, + {1029, 1}, + {1029, 1}, + {1029, 1}, + {1029, 1}, + {1029, 1}, + {1029, 1}, + {1029, 1}, + {1029, 1}, + {1029, 1}, + {1029, 1}, + {1029, 1}, + {1029, 1}, + {928, 1}, + {928, 1}, + {928, 1}, + {928, 1}, + {928, 1}, + {928, 1}, + {928, 1}, + {928, 1}, + {928, 1}, + {928, 1}, {1475, 1}, {1475, 3}, - {1008, 2}, - {1128, 1}, - {1128, 1}, - {1091, 1}, - {1091, 1}, - {1297, 1}, - {1297, 3}, + {1010, 2}, + {1131, 1}, + {1131, 1}, + {1093, 1}, + {1093, 1}, + {1296, 1}, + {1296, 3}, {1485, 0}, {1485, 3}, - {947, 1}, - {947, 4}, - {947, 4}, - {947, 4}, - {947, 3}, - {947, 4}, - {947, 3}, - {947, 3}, - {947, 3}, - {947, 3}, - {947, 3}, - {947, 3}, - {947, 3}, - {947, 3}, - {947, 1}, - {947, 3}, - {947, 3}, - {947, 3}, - {947, 3}, - {947, 3}, - {947, 3}, - {947, 3}, - {947, 3}, - {947, 3}, - {947, 3}, - {947, 3}, - {947, 3}, - {947, 3}, - {947, 2}, - {947, 2}, - {947, 3}, - {947, 3}, - {947, 5}, - {947, 3}, - {947, 7}, - {947, 3}, - {947, 3}, - {937, 0}, - {937, 1}, - {1292, 1}, - {1292, 1}, - {1147, 0}, - {1147, 1}, - {1026, 1}, - {1026, 2}, - {1026, 3}, - {1414, 0}, - {1414, 1}, + {950, 1}, + {950, 4}, + {950, 4}, + {950, 4}, + {950, 3}, + {950, 4}, + {950, 3}, + {950, 3}, + {950, 3}, + {950, 3}, + {950, 3}, + {950, 3}, + {950, 3}, + {950, 3}, + {950, 1}, + {950, 3}, + {950, 3}, + {950, 3}, + {950, 3}, + {950, 3}, + {950, 3}, + {950, 3}, + {950, 3}, + {950, 3}, + {950, 3}, + {950, 3}, + {950, 3}, + {950, 3}, + {950, 2}, + {950, 2}, + {950, 3}, + {950, 3}, + {950, 5}, + {950, 3}, + {950, 7}, + {950, 3}, + {950, 3}, + {939, 0}, + {939, 1}, + {1291, 1}, + {1291, 1}, + {1150, 0}, + {1150, 1}, + {1027, 1}, + {1027, 2}, + {1027, 3}, + {1413, 0}, + {1413, 1}, {866, 3}, - {943, 3}, - {943, 3}, - {943, 3}, - {943, 3}, - {943, 3}, - {943, 3}, - {943, 3}, - {943, 3}, - {943, 3}, - {943, 3}, - {943, 3}, - {943, 3}, - {943, 3}, - {943, 3}, - {943, 3}, - {1095, 1}, - {1095, 1}, - {1095, 1}, - {1068, 3}, - {1068, 2}, - {1068, 3}, - {1068, 3}, - {1068, 2}, - {1060, 1}, - {1060, 1}, - {1060, 1}, - {1060, 1}, - {1060, 1}, - {1060, 1}, - {1060, 1}, - {1060, 1}, - {1060, 1}, - {1060, 1}, - {1060, 1}, - {1060, 1}, - {1037, 1}, - {1037, 1}, - {1229, 0}, - {1229, 1}, - {1229, 1}, - {1052, 1}, - {1052, 1}, - {1052, 1}, - {1053, 1}, - {1053, 1}, + {945, 3}, + {945, 3}, + {945, 3}, + {945, 3}, + {945, 3}, + {945, 3}, + {945, 3}, + {945, 3}, + {945, 3}, + {945, 3}, + {945, 3}, + {945, 3}, + {945, 3}, + {945, 3}, + {945, 3}, + {1098, 1}, + {1098, 1}, + {1098, 1}, + {1070, 3}, + {1070, 2}, + {1070, 3}, + {1070, 3}, + {1070, 2}, + {1061, 1}, + {1061, 1}, + {1061, 1}, + {1061, 1}, + {1061, 1}, + {1061, 1}, + {1061, 1}, + {1061, 1}, + {1061, 1}, + {1061, 1}, + {1061, 1}, + {1061, 1}, + {1038, 1}, + {1038, 1}, + {1230, 0}, + {1230, 1}, + {1230, 1}, {1053, 1}, - {1053, 2}, {1053, 1}, {1053, 1}, - {1035, 1}, - {1089, 3}, - {1089, 2}, - {1089, 3}, - {1089, 2}, - {1089, 3}, - {1089, 3}, - {1089, 2}, - {1089, 2}, - {1089, 1}, - {1089, 2}, - {1089, 5}, - {1089, 5}, - {1089, 1}, - {1089, 3}, - {1089, 2}, - {957, 1}, - {957, 1}, - {1064, 1}, - {1064, 2}, - {1064, 2}, - {1031, 2}, - {1031, 2}, - {1031, 1}, - {1031, 1}, - {1069, 2}, - {1069, 2}, - {1069, 1}, - {1069, 2}, - {1069, 2}, - {1069, 3}, - {1069, 3}, - {1069, 2}, - {1104, 1}, - {1104, 1}, - {1036, 1}, - {1036, 2}, - {1036, 1}, + {1054, 1}, + {1054, 1}, + {1054, 1}, + {1054, 2}, + {1054, 1}, + {1054, 1}, {1036, 1}, - {1036, 2}, - {1092, 1}, - {1092, 2}, - {1092, 1}, - {1092, 1}, - {993, 1}, - {993, 1}, - {993, 1}, - {993, 1}, - {1044, 1}, - {1044, 2}, - {1044, 2}, - {1044, 2}, - {1044, 3}, - {847, 3}, + {1091, 3}, + {1091, 2}, + {1091, 3}, + {1091, 2}, + {1091, 3}, + {1091, 3}, + {1091, 2}, + {1091, 2}, + {1091, 1}, + {1091, 2}, + {1091, 5}, + {1091, 5}, + {1091, 1}, + {1091, 3}, + {1091, 2}, + {959, 1}, + {959, 1}, + {1066, 1}, + {1066, 2}, + {1066, 2}, + {1032, 2}, + {1032, 2}, + {1032, 1}, + {1032, 1}, + {1071, 2}, + {1071, 2}, + {1071, 1}, + {1071, 2}, + {1071, 2}, + {1071, 3}, + {1071, 3}, + {1071, 2}, + {1107, 1}, + {1107, 1}, + {1037, 1}, + {1037, 2}, + {1037, 1}, + {1037, 1}, + {1037, 2}, + {1095, 1}, + {1095, 2}, + {1095, 1}, + {1095, 1}, + {994, 1}, + {994, 1}, + {994, 1}, + {994, 1}, + {1045, 1}, + {1045, 2}, + {1045, 2}, + {1045, 2}, + {1045, 3}, + {849, 3}, {894, 0}, {894, 1}, - {984, 1}, - {984, 1}, - {984, 1}, - {985, 0}, - {985, 2}, - {1009, 0}, - {1009, 1}, - {1009, 1}, - {1016, 5}, - {1406, 0}, - {1406, 1}, + {985, 1}, + {985, 1}, + {985, 1}, + {986, 0}, + {986, 2}, + {1011, 0}, + {1011, 1}, + {1011, 1}, + {1018, 5}, + {1405, 0}, + {1405, 1}, {902, 0}, {902, 2}, {902, 3}, - {1407, 0}, - {1407, 2}, + {1406, 0}, + {1406, 2}, {859, 2}, {859, 1}, {859, 2}, @@ -6469,164 +6468,165 @@ var ( {1227, 2}, {1479, 1}, {1479, 3}, - {1027, 1}, - {1027, 1}, - {1027, 1}, - {1303, 1}, - {1303, 3}, + {1028, 1}, + {1028, 1}, + {1028, 1}, + {1301, 1}, + {1301, 3}, {811, 1}, {811, 1}, {1480, 1}, {1480, 1}, {1480, 1}, - {833, 1}, - {833, 2}, - {828, 10}, - {828, 8}, + {832, 1}, + {832, 2}, + {827, 10}, + {827, 8}, {867, 2}, {895, 2}, {896, 0}, {896, 1}, {1524, 0}, {1524, 1}, - {1148, 9}, - {1144, 4}, - {1117, 9}, - {1117, 9}, - {1109, 3}, - {1112, 4}, - {1385, 2}, - {1385, 6}, - {1000, 2}, - {1030, 1}, - {1030, 3}, - {1137, 0}, - {1137, 2}, - {1346, 1}, - {1346, 2}, - {1136, 2}, - {1136, 2}, - {1136, 2}, - {1136, 2}, - {1082, 0}, - {1082, 1}, - {1081, 2}, - {1081, 2}, - {1081, 2}, - {1081, 2}, - {1446, 1}, - {1446, 3}, - {1446, 2}, - {1083, 2}, + {1151, 9}, + {1147, 4}, + {1120, 9}, + {1120, 9}, + {1112, 3}, + {1115, 4}, + {1384, 2}, + {1384, 6}, + {1002, 2}, + {1031, 1}, + {1031, 3}, + {1140, 0}, + {1140, 2}, + {1344, 1}, + {1344, 2}, + {1139, 2}, + {1139, 2}, + {1139, 2}, + {1139, 2}, + {1084, 0}, + {1084, 1}, {1083, 2}, {1083, 2}, {1083, 2}, {1083, 2}, - {1134, 0}, - {1134, 2}, - {1134, 2}, + {1446, 1}, + {1446, 3}, + {1446, 2}, + {1085, 2}, + {1085, 2}, + {1085, 2}, + {1085, 2}, + {1085, 2}, + {1137, 0}, + {1137, 2}, + {1137, 2}, {1260, 0}, {1260, 3}, - {1242, 0}, + {1243, 0}, + {1243, 1}, {1242, 1}, - {1241, 1}, - {1241, 2}, - {1074, 2}, - {1074, 2}, - {1074, 3}, - {1074, 3}, - {1074, 4}, - {1074, 5}, - {1074, 2}, - {1074, 5}, - {1074, 3}, - {1074, 3}, - {1074, 2}, - {1074, 2}, - {1074, 2}, - {1329, 0}, - {1329, 3}, - {1329, 3}, - {1329, 5}, - {1329, 5}, - {1329, 4}, - {1330, 1}, - {1192, 1}, - {1192, 1}, - {1270, 1}, + {1242, 2}, + {1076, 2}, + {1076, 2}, + {1076, 3}, + {1076, 3}, + {1076, 4}, + {1076, 5}, + {1076, 2}, + {1076, 5}, + {1076, 3}, + {1076, 3}, + {1076, 2}, + {1076, 2}, + {1076, 2}, + {1327, 0}, + {1327, 3}, + {1327, 3}, + {1327, 5}, + {1327, 5}, + {1327, 4}, + {1328, 1}, + {1194, 1}, + {1194, 1}, + {1269, 1}, {1450, 1}, {1450, 3}, - {950, 1}, - {950, 1}, - {950, 1}, - {950, 1}, - {950, 1}, - {950, 1}, - {950, 1}, - {950, 1}, - {1138, 7}, - {1138, 9}, - {1155, 5}, - {1155, 7}, - {1155, 7}, - {1274, 5}, - {1274, 7}, - {1274, 7}, - {1190, 9}, - {1188, 7}, - {1189, 4}, - {1313, 0}, - {1313, 3}, - {1313, 3}, - {1313, 3}, - {1313, 3}, - {1313, 3}, - {1051, 1}, - {1051, 2}, - {1085, 1}, - {1085, 1}, - {1085, 1}, - {1085, 3}, - {1085, 3}, - {1269, 1}, - {1269, 3}, - {1077, 1}, - {1077, 4}, - {1078, 1}, - {1078, 2}, - {1078, 1}, - {1078, 1}, - {1078, 2}, - {1078, 2}, - {1078, 1}, - {1078, 1}, - {1078, 1}, - {1078, 1}, - {1078, 1}, - {1078, 1}, - {1078, 1}, - {1078, 1}, - {1078, 1}, - {1078, 2}, - {1078, 1}, - {1078, 2}, - {1078, 1}, - {1078, 2}, - {1078, 2}, - {1078, 1}, - {1078, 1}, - {1078, 1}, - {1078, 1}, - {1078, 3}, - {1078, 2}, - {1078, 2}, - {1078, 2}, - {1078, 2}, - {1078, 2}, - {1078, 2}, - {1078, 2}, - {1078, 1}, - {1078, 1}, + {935, 1}, + {935, 1}, + {935, 1}, + {935, 1}, + {935, 1}, + {935, 1}, + {935, 1}, + {935, 1}, + {1141, 7}, + {1141, 5}, + {1141, 9}, + {1158, 5}, + {1158, 7}, + {1158, 7}, + {1273, 5}, + {1273, 7}, + {1273, 7}, + {1192, 9}, + {1190, 7}, + {1191, 4}, + {1311, 0}, + {1311, 3}, + {1311, 3}, + {1311, 3}, + {1311, 3}, + {1311, 3}, + {1052, 1}, + {1052, 2}, + {1087, 1}, + {1087, 1}, + {1087, 1}, + {1087, 3}, + {1087, 3}, + {1268, 1}, + {1268, 3}, + {1079, 1}, + {1079, 4}, + {1080, 1}, + {1080, 2}, + {1080, 1}, + {1080, 1}, + {1080, 2}, + {1080, 2}, + {1080, 1}, + {1080, 1}, + {1080, 1}, + {1080, 1}, + {1080, 1}, + {1080, 1}, + {1080, 1}, + {1080, 1}, + {1080, 1}, + {1080, 2}, + {1080, 1}, + {1080, 2}, + {1080, 1}, + {1080, 2}, + {1080, 2}, + {1080, 1}, + {1080, 1}, + {1080, 1}, + {1080, 1}, + {1080, 3}, + {1080, 2}, + {1080, 2}, + {1080, 2}, + {1080, 2}, + {1080, 2}, + {1080, 2}, + {1080, 2}, + {1080, 1}, + {1080, 1}, {1221, 0}, {1221, 1}, {1221, 1}, @@ -6636,59 +6636,64 @@ var ( {1247, 3}, {1247, 3}, {1247, 1}, - {1268, 7}, - {1267, 4}, - {968, 17}, - {1185, 0}, - {1185, 2}, - {1378, 0}, - {1378, 3}, - {1339, 0}, - {1339, 3}, + {1267, 7}, + {1266, 4}, + {970, 17}, + {1187, 0}, + {1187, 2}, + {1376, 0}, + {1376, 3}, + {1337, 0}, + {1337, 3}, {1215, 0}, {1215, 1}, - {1179, 0}, - {1179, 2}, - {936, 1}, - {936, 1}, - {1367, 2}, - {1367, 1}, - {1178, 3}, - {1178, 2}, - {1178, 3}, - {1178, 3}, - {1178, 4}, - {1178, 6}, - {962, 1}, - {962, 1}, - {962, 1}, - {1062, 0}, - {1062, 3}, + {1181, 0}, + {1181, 2}, + {938, 1}, + {938, 1}, + {1365, 2}, + {1365, 1}, + {1180, 3}, + {1180, 2}, + {1180, 3}, + {1180, 3}, + {1180, 4}, + {1180, 6}, + {964, 1}, + {964, 1}, + {964, 1}, + {1063, 0}, + {1063, 3}, {1473, 0}, {1473, 3}, - {1392, 0}, - {1392, 3}, - {1213, 0}, - {1213, 2}, - {1394, 3}, - {1394, 1}, - {1212, 3}, - {1211, 0}, - {1211, 2}, - {1393, 1}, + {1391, 0}, + {1391, 3}, + {1213, 0}, + {1213, 2}, {1393, 3}, - {1210, 1}, - {1210, 3}, - {1195, 9}, - {1306, 2}, + {1393, 1}, + {1212, 3}, + {1064, 0}, + {1064, 2}, + {1392, 1}, + {1392, 3}, + {1211, 1}, + {1211, 3}, + {914, 9}, + {914, 8}, + {1378, 1}, + {1378, 1}, + {1378, 1}, + {1378, 1}, + {1304, 2}, {1217, 3}, - {1301, 1}, - {1301, 1}, - {1298, 2}, - {1395, 1}, - {1395, 2}, - {1395, 1}, - {1395, 2}, + {1299, 1}, + {1299, 1}, + {1297, 2}, + {1394, 1}, + {1394, 2}, + {1394, 1}, + {1394, 2}, {1486, 1}, {1486, 3}, {1219, 6}, @@ -6696,75 +6701,76 @@ var ( {1459, 1}, {1459, 1}, {1459, 1}, - {1357, 0}, - {1357, 2}, - {1357, 3}, - {1411, 0}, - {1411, 2}, - {1205, 2}, - {1205, 3}, - {1205, 3}, + {1355, 0}, + {1355, 2}, + {1355, 3}, + {1410, 0}, + {1410, 2}, + {1229, 4}, + {1206, 2}, + {1206, 3}, + {1206, 3}, + {1206, 2}, + {1205, 1}, {1205, 2}, - {1204, 1}, - {1204, 2}, {1214, 3}, {1216, 3}, {1216, 5}, {1216, 7}, - {1305, 3}, - {1305, 5}, - {1305, 7}, - {1159, 5}, - {1143, 6}, - {1113, 6}, - {1162, 5}, - {1141, 7}, - {1111, 6}, - {1145, 6}, - {1349, 0}, - {1349, 1}, + {1303, 3}, + {1303, 5}, + {1303, 7}, + {1161, 5}, + {1146, 6}, + {1116, 6}, + {1164, 5}, + {1144, 7}, + {1114, 6}, + {1148, 6}, + {1347, 0}, + {1347, 1}, {1456, 1}, {1456, 2}, - {1020, 3}, - {1020, 3}, - {1020, 3}, - {1020, 3}, - {1020, 3}, - {1020, 1}, - {1020, 2}, - {1020, 3}, - {1020, 1}, - {1020, 2}, - {1020, 3}, - {1020, 1}, - {1020, 2}, - {1020, 1}, - {1020, 1}, - {1020, 2}, - {917, 1}, - {917, 2}, - {917, 2}, - {1164, 4}, - {1115, 5}, - {1320, 1}, - {1320, 2}, - {1114, 1}, - {1114, 1}, - {1114, 3}, - {1114, 3}, - {1196, 8}, - {1400, 0}, - {1400, 2}, + {1022, 3}, + {1022, 3}, + {1022, 3}, + {1022, 3}, + {1022, 3}, + {1022, 1}, + {1022, 2}, + {1022, 3}, + {1022, 1}, + {1022, 2}, + {1022, 3}, + {1022, 1}, + {1022, 2}, + {1022, 1}, + {1022, 1}, + {1022, 2}, + {919, 1}, + {919, 2}, + {919, 2}, + {1166, 4}, + {1118, 5}, + {1318, 1}, + {1318, 2}, + {1117, 1}, + {1117, 1}, + {1117, 3}, + {1117, 3}, + {1197, 8}, {1399, 0}, - {1399, 3}, - {1426, 0}, - {1426, 2}, + {1399, 2}, + {1398, 0}, + {1398, 3}, {1425, 0}, {1425, 2}, - {1173, 1}, - {1100, 1}, - {1100, 3}, - {1019, 2}, + {1424, 0}, + {1424, 2}, + {1175, 1}, + {1103, 1}, + {1103, 3}, + {1021, 2}, {1245, 6}, {1245, 7}, {1245, 10}, @@ -6774,17 +6780,17 @@ var ( {1245, 4}, {1245, 5}, {1245, 6}, - {1427, 0}, - {1427, 3}, - {1413, 0}, - {1413, 1}, + {1426, 0}, + {1426, 3}, + {1412, 0}, + {1412, 1}, {1470, 3}, {1470, 1}, - {1286, 3}, - {1285, 0}, - {1285, 1}, - {1285, 1}, - {1285, 1}, + {1285, 3}, + {1284, 0}, + {1284, 1}, + {1284, 1}, + {1284, 1}, {886, 1}, {886, 1}, {886, 1}, @@ -6800,62 +6806,62 @@ var ( {886, 1}, {886, 1}, {886, 1}, - {1432, 1}, - {1432, 1}, - {1432, 1}, - {1432, 1}, + {1431, 1}, + {1431, 1}, + {1431, 1}, + {1431, 1}, {887, 1}, - {1433, 1}, - {1433, 3}, - {1439, 0}, - {1439, 2}, + {1432, 1}, + {1432, 3}, + {1438, 0}, + {1438, 2}, {1250, 4}, {1250, 5}, {1250, 6}, + {1436, 1}, + {1436, 1}, {1437, 1}, - {1437, 1}, - {1438, 1}, - {1438, 3}, + {1437, 3}, {1251, 1}, {1251, 1}, {1251, 2}, {1251, 1}, {1248, 1}, {1248, 3}, - {1415, 0}, - {1415, 1}, + {1414, 0}, + {1414, 1}, {882, 2}, {876, 5}, {875, 2}, - {1440, 0}, - {1440, 2}, - {1440, 1}, - {1436, 1}, - {1436, 3}, - {1435, 0}, + {1439, 0}, + {1439, 2}, + {1439, 1}, {1435, 1}, - {1434, 2}, - {1434, 3}, - {1441, 0}, - {1441, 3}, - {941, 2}, - {941, 3}, + {1435, 3}, + {1434, 0}, + {1434, 1}, + {1433, 2}, + {1433, 3}, + {1440, 0}, + {1440, 3}, + {943, 2}, + {943, 3}, {872, 4}, {877, 4}, {1252, 4}, - {1430, 0}, - {1430, 2}, - {1430, 2}, + {1429, 0}, + {1429, 2}, + {1429, 2}, {874, 1}, {874, 1}, {1467, 1}, {1467, 2}, {1452, 1}, {1452, 2}, - {1282, 4}, - {1271, 4}, - {1171, 0}, - {1171, 2}, + {1281, 4}, + {1270, 4}, + {1173, 0}, + {1173, 2}, {885, 6}, {884, 5}, {888, 1}, @@ -6879,5972 +6885,5984 @@ var ( {883, 1}, {883, 1}, {883, 1}, - {1142, 8}, - {1160, 4}, - {1122, 3}, - {1336, 0}, - {1336, 1}, - {1336, 1}, - {1359, 1}, - {1359, 2}, - {1359, 3}, - {1048, 3}, - {1048, 3}, - {1048, 3}, - {1048, 5}, - {1337, 2}, - {1337, 2}, - {1337, 2}, - {1337, 2}, - {1337, 2}, - {1105, 4}, - {1442, 1}, - {1442, 2}, - {1442, 3}, - {1079, 3}, - {1079, 3}, - {1079, 3}, - {1079, 1}, - {1080, 3}, - {1080, 3}, - {1080, 5}, - {1161, 4}, + {1145, 8}, + {1162, 4}, + {1125, 3}, + {1334, 0}, + {1334, 1}, + {1334, 1}, + {1357, 1}, + {1357, 2}, + {1357, 3}, + {1049, 3}, + {1049, 3}, + {1049, 3}, + {1049, 5}, + {1335, 2}, + {1335, 2}, + {1335, 2}, + {1335, 2}, + {1335, 2}, + {1108, 4}, + {1441, 1}, + {1441, 2}, + {1441, 3}, + {1081, 3}, + {1081, 3}, + {1081, 3}, + {1081, 1}, + {1082, 3}, + {1082, 3}, + {1082, 5}, + {1163, 4}, } yyXErrors = map[yyXError]string{} - yyParseTab = [4942][]uint16{ + yyParseTab = [4952][]uint16{ // 0 - {2327, 2327, 3: 2877, 58: 2900, 84: 2879, 2882, 87: 2912, 2880, 3033, 103: 2914, 117: 3047, 159: 3049, 187: 2897, 197: 2895, 210: 3040, 223: 2908, 250: 2903, 254: 2885, 259: 2933, 266: 2899, 269: 2875, 277: 2932, 3043, 2881, 284: 3048, 296: 2911, 306: 2909, 308: 2876, 310: 2915, 331: 2901, 335: 2904, 342: 2913, 345: 2898, 358: 2890, 536: 2923, 2922, 552: 2921, 557: 2907, 560: 2931, 567: 3042, 580: 3036, 582: 2893, 587: 2891, 592: 2906, 614: 2920, 701: 2916, 715: 3046, 718: 2878, 3035, 729: 2873, 732: 2884, 748: 2883, 772: 2930, 2874, 781: 2927, 809: 2886, 812: 2929, 2917, 2918, 2919, 2928, 818: 2926, 2925, 2924, 822: 2889, 3011, 3010, 828: 3034, 2887, 2992, 832: 3004, 3020, 2892, 839: 2888, 845: 2950, 851: 2944, 2948, 3001, 3012, 863: 2952, 2894, 866: 3019, 3021, 900: 3039, 903: 2896, 910: 2937, 939: 3045, 949: 2945, 963: 3037, 968: 2995, 971: 3006, 973: 3009, 2902, 1041: 2957, 1096: 3041, 1105: 2965, 2935, 1108: 2936, 2939, 1111: 2942, 2940, 2943, 1115: 2941, 1117: 2938, 1119: 2946, 2947, 1122: 2953, 2905, 2990, 3030, 1127: 2954, 1138: 2961, 2955, 2956, 2962, 2963, 2964, 2960, 2966, 2967, 1148: 2959, 2958, 1151: 2949, 2910, 1154: 2968, 2982, 2969, 2970, 3031, 2973, 2972, 2978, 2977, 2979, 2974, 2980, 2981, 2971, 2976, 2975, 1172: 2934, 1175: 2951, 1180: 2986, 2984, 1183: 2985, 2983, 1188: 2988, 2989, 2987, 1194: 3026, 2991, 2993, 1204: 3044, 2994, 1214: 2996, 1216: 2997, 3023, 1219: 3027, 1243: 3028, 1245: 2999, 3000, 1254: 3005, 1257: 3002, 3003, 1264: 3025, 3029, 3038, 3008, 3007, 1274: 3013, 1276: 3015, 3014, 1279: 3017, 1281: 3024, 1284: 3016, 1290: 3032, 1304: 3018, 2998, 3022, 1472: 2871, 1475: 2872}, - {1: 2870}, - {7810, 2869}, - {18: 7763, 51: 7762, 218: 7759, 244: 7764, 316: 7760, 554: 4697, 596: 7761, 614: 2128, 649: 6681, 935: 7758, 964: 4696}, - {218: 7743, 614: 7742}, + {2333, 2333, 3: 2883, 58: 2906, 84: 2885, 2888, 87: 2918, 2886, 3037, 103: 2920, 117: 3052, 132: 3044, 161: 3054, 188: 2903, 197: 2901, 224: 2914, 250: 2909, 254: 2891, 259: 2939, 266: 2905, 269: 2881, 277: 2938, 3047, 280: 2887, 285: 3053, 297: 2917, 307: 2915, 309: 2882, 311: 2921, 332: 2907, 336: 2910, 343: 2919, 347: 2904, 360: 2896, 536: 2929, 2928, 552: 2927, 557: 2913, 561: 2937, 568: 3046, 581: 3040, 583: 2899, 588: 2897, 592: 2912, 613: 2926, 660: 2922, 715: 3051, 718: 2884, 3039, 729: 2879, 732: 2890, 745: 2889, 772: 2936, 3048, 2880, 781: 2933, 809: 2892, 812: 2935, 2923, 2924, 2925, 2934, 2932, 2931, 2930, 821: 2895, 3017, 3016, 827: 3038, 829: 2893, 2998, 3010, 3026, 2898, 840: 2894, 845: 2956, 851: 2950, 2954, 3007, 3018, 863: 2958, 2900, 866: 3025, 3027, 903: 2902, 910: 2943, 914: 2997, 3043, 941: 3050, 952: 2951, 965: 3041, 970: 3001, 973: 3012, 975: 3015, 2908, 1042: 2963, 1099: 3045, 1108: 2971, 2941, 1111: 2942, 2945, 1114: 2948, 2946, 2949, 1118: 2947, 1120: 2944, 1122: 2952, 2953, 1125: 2959, 2911, 2996, 3035, 1130: 2960, 1141: 2967, 2961, 2962, 2968, 2969, 2970, 2966, 2972, 2973, 1151: 2965, 2964, 1154: 2955, 2916, 1157: 2974, 2988, 2975, 2976, 2979, 2978, 2984, 2983, 2985, 2980, 2986, 2987, 2977, 2982, 2981, 1174: 2940, 1177: 2957, 1182: 2992, 2990, 1185: 2991, 2989, 1190: 2994, 2995, 2993, 1196: 3032, 2999, 1205: 3049, 3000, 1214: 3002, 1216: 3003, 3029, 1219: 3033, 1229: 3034, 1245: 3005, 3006, 1254: 3011, 1257: 3008, 3009, 1264: 3031, 3042, 3014, 3013, 1273: 3019, 1275: 3021, 3020, 1278: 3023, 1280: 3030, 1283: 3022, 1289: 3036, 1302: 3024, 3004, 3028, 1472: 2877, 1475: 2878}, + {1: 2876}, + {7826, 2875}, + {18: 7779, 51: 7778, 219: 7775, 244: 7780, 318: 7776, 554: 4706, 596: 7777, 613: 2137, 649: 6701, 937: 7774, 966: 4705}, + {219: 7759, 613: 7758}, // 5 - {614: 7736}, - {377: 7714, 614: 7715, 649: 6681, 935: 7716}, - {430: 7695, 551: 7696, 614: 2672, 1469: 7694}, - {399: 7650, 614: 7649}, - {2640, 2640, 416: 7648, 423: 7647}, + {613: 7752}, + {378: 7730, 613: 7731, 649: 6701, 937: 7732}, + {430: 7711, 551: 7712, 613: 2678, 1469: 7710}, + {160: 5282, 316: 768, 613: 768, 901: 5281, 916: 7664}, + {2646, 2646, 416: 7663, 423: 7662}, // 10 - {457: 7636}, - {538: 7635}, - {2607, 2607, 86: 6596, 571: 6594, 903: 6595, 1135: 7634}, - {18: 2378, 51: 7164, 102: 2378, 132: 2378, 181: 2378, 196: 7162, 204: 790, 208: 7081, 217: 6180, 7161, 244: 7165, 6839, 273: 7153, 572: 7160, 614: 2346, 649: 6681, 661: 2378, 710: 7155, 715: 2485, 752: 7157, 935: 7158, 970: 7166, 1055: 7163, 1071: 6179, 1381: 7154, 1419: 7159, 1468: 7156}, - {18: 7088, 51: 7089, 132: 7082, 157: 2346, 196: 7084, 204: 790, 208: 7081, 7079, 217: 6180, 7083, 223: 1240, 225: 7085, 244: 7090, 6839, 273: 7076, 614: 2346, 649: 6681, 715: 7078, 900: 7086, 935: 7077, 970: 7091, 1055: 7087, 1071: 7080}, + {456: 7651}, + {538: 7650}, + {2613, 2613, 86: 6615, 572: 6613, 903: 6614, 1138: 7649}, + {18: 2384, 51: 7177, 102: 2384, 133: 2384, 181: 2384, 185: 7175, 204: 798, 208: 7098, 218: 6199, 7174, 244: 7178, 6860, 273: 7166, 573: 7173, 613: 2352, 649: 6701, 661: 2384, 710: 7168, 715: 2491, 752: 7170, 937: 7171, 972: 7179, 1056: 7176, 1073: 6198, 1380: 7167, 1418: 7172, 1468: 7169}, + {18: 7104, 51: 7105, 133: 7099, 155: 2352, 185: 7101, 204: 798, 208: 7098, 7096, 218: 6199, 7100, 224: 1248, 7102, 244: 7106, 6860, 273: 7093, 613: 2352, 649: 6701, 715: 7095, 937: 7094, 972: 7107, 1056: 7103, 1073: 7097}, // 15 - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 3864, 869: 7075}, - {2: 1059, 1059, 1059, 1059, 1059, 1059, 1059, 10: 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 58: 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 554: 1059, 566: 1059, 842: 1059, 1059, 1059, 846: 5978, 975: 5979, 1025: 7063}, - {2355, 2355}, - {2354, 2354}, - {536: 2923, 552: 2921, 614: 2920, 701: 2916, 719: 3035, 781: 3876, 809: 2886, 812: 3875, 2917, 2918, 2919, 2928, 818: 2926, 3877, 3878, 828: 5727, 5725, 839: 5726}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 3869, 869: 7092}, + {2: 1067, 1067, 1067, 1067, 1067, 1067, 1067, 10: 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 58: 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 554: 1067, 566: 1067, 839: 1067, 841: 1067, 844: 1067, 846: 5998, 949: 5999, 1000: 7080}, + {2361, 2361}, + {2360, 2360}, + {536: 2929, 552: 2927, 613: 2926, 660: 2922, 719: 3039, 781: 3881, 809: 2892, 812: 3880, 2923, 2924, 2925, 2934, 2932, 3882, 3883, 827: 5741, 829: 5739, 840: 5740}, // 20 - {84: 2879, 2882, 87: 2912, 2880, 117: 7036, 197: 2895, 232: 7035, 536: 2923, 2922, 552: 2921, 557: 2907, 560: 7039, 592: 2906, 614: 2920, 701: 2916, 718: 2878, 3035, 781: 7037, 809: 2886, 812: 7038, 2917, 2918, 2919, 2928, 818: 2926, 2925, 2924, 822: 2889, 7045, 7044, 828: 3034, 2887, 7042, 832: 7043, 7041, 839: 2888, 845: 7040, 851: 7053, 7048, 7051, 7052, 900: 7054, 903: 2896, 949: 7047, 968: 7046, 971: 7050, 973: 7049, 1028: 7034}, - {2: 2322, 2322, 2322, 2322, 2322, 2322, 2322, 10: 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 58: 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 536: 2322, 2322, 552: 2322, 557: 2322, 563: 2322, 592: 2322, 614: 2322, 701: 2322, 718: 2322, 2322, 729: 2322, 809: 2322}, - {2: 2321, 2321, 2321, 2321, 2321, 2321, 2321, 10: 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 58: 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 536: 2321, 2321, 552: 2321, 557: 2321, 563: 2321, 592: 2321, 614: 2321, 701: 2321, 718: 2321, 2321, 729: 2321, 809: 2321}, - {2: 2320, 2320, 2320, 2320, 2320, 2320, 2320, 10: 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 58: 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320, 536: 2320, 2320, 552: 2320, 557: 2320, 563: 2320, 592: 2320, 614: 2320, 701: 2320, 718: 2320, 2320, 729: 2320, 809: 2320}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 7003, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 536: 2923, 2922, 552: 2921, 557: 2907, 563: 7002, 592: 2906, 614: 2920, 701: 2916, 718: 7004, 3035, 729: 4668, 777: 3949, 3067, 3068, 3066, 4669, 809: 2886, 7000, 812: 4670, 2917, 2918, 2919, 2928, 818: 2926, 2925, 2924, 822: 2889, 4676, 4675, 828: 3034, 2887, 4673, 832: 4674, 4672, 839: 2888, 845: 4671, 910: 4677, 926: 7001}, + {84: 2885, 2888, 87: 2918, 2886, 117: 7053, 197: 2901, 232: 7052, 536: 2929, 2928, 552: 2927, 557: 2913, 561: 7056, 592: 2912, 613: 2926, 660: 2922, 718: 2884, 3039, 781: 7054, 809: 2892, 812: 7055, 2923, 2924, 2925, 2934, 2932, 2931, 2930, 821: 2895, 7062, 7061, 827: 3038, 829: 2893, 7059, 7060, 7058, 840: 2894, 845: 7057, 851: 7070, 7065, 7068, 7069, 903: 2902, 915: 7071, 952: 7064, 970: 7063, 973: 7067, 975: 7066, 1029: 7051}, + {2: 2328, 2328, 2328, 2328, 2328, 2328, 2328, 10: 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 58: 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 536: 2328, 2328, 552: 2328, 557: 2328, 563: 2328, 565: 2328, 592: 2328, 613: 2328, 660: 2328, 718: 2328, 2328, 729: 2328, 809: 2328}, + {2: 2327, 2327, 2327, 2327, 2327, 2327, 2327, 10: 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 58: 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 2327, 536: 2327, 2327, 552: 2327, 557: 2327, 563: 2327, 565: 2327, 592: 2327, 613: 2327, 660: 2327, 718: 2327, 2327, 729: 2327, 809: 2327}, + {2: 2326, 2326, 2326, 2326, 2326, 2326, 2326, 10: 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 58: 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 536: 2326, 2326, 552: 2326, 557: 2326, 563: 2326, 565: 2326, 592: 2326, 613: 2326, 660: 2326, 718: 2326, 2326, 729: 2326, 809: 2326}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 7021, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 7019, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 536: 2929, 2928, 552: 2927, 557: 2913, 563: 7018, 565: 3955, 592: 2912, 613: 2926, 660: 2922, 718: 7020, 3039, 729: 4676, 777: 3954, 3072, 3073, 3071, 4677, 809: 2892, 7016, 812: 4678, 2923, 2924, 2925, 2934, 2932, 2931, 2930, 821: 2895, 4684, 4683, 827: 3038, 829: 2893, 4681, 4682, 4680, 840: 2894, 845: 4679, 910: 4685, 914: 4686, 928: 7017}, // 25 - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 6999, 3067, 3068, 3066}, - {197: 6997}, - {156: 6990, 614: 6685, 649: 6681, 935: 6684, 1121: 6989}, - {187: 6987}, - {187: 6980, 900: 6981}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 7015, 3072, 3073, 3071}, + {197: 7013}, + {158: 7006, 613: 6705, 649: 6701, 937: 6704, 1124: 7005}, + {188: 7003}, + {188: 7000}, // 30 - {187: 6974, 900: 6975}, - {187: 6969}, - {16: 4440, 18: 6800, 30: 6830, 6829, 92: 6809, 131: 783, 154: 783, 790, 157: 783, 180: 790, 187: 6787, 208: 6838, 210: 6801, 240: 6798, 245: 6839, 248: 790, 260: 6840, 267: 6824, 783, 281: 6788, 302: 6821, 314: 6814, 330: 6820, 363: 6813, 368: 6836, 371: 6818, 6799, 378: 6816, 6834, 381: 6807, 388: 6805, 6823, 393: 6811, 396: 6822, 6792, 6833, 400: 6803, 409: 6793, 426: 6797, 6796, 433: 6837, 440: 6825, 443: 6831, 6828, 6832, 6827, 458: 6817, 558: 4441, 591: 6794, 614: 6791, 660: 6812, 714: 4439, 6802, 718: 6835, 748: 6790, 859: 6808, 970: 6819, 1021: 6826, 1055: 6815, 1061: 6804, 1150: 6806, 1228: 6795, 1460: 6810, 1466: 6789}, - {210: 6782, 281: 6781}, - {424: 6683, 614: 6685, 649: 6681, 935: 6684, 1121: 6682}, + {188: 6998}, + {188: 6993}, + {16: 4448, 18: 6821, 30: 6851, 6850, 92: 6830, 131: 791, 6822, 139: 798, 155: 791, 157: 791, 180: 798, 188: 6807, 208: 6859, 217: 6862, 240: 6819, 245: 6860, 248: 798, 260: 6861, 267: 6845, 791, 282: 6808, 303: 6842, 315: 6835, 331: 6841, 344: 6863, 365: 6834, 370: 6857, 372: 6839, 6820, 379: 6837, 6855, 382: 6828, 389: 6826, 6844, 394: 6832, 397: 6843, 6812, 6854, 6824, 408: 6813, 426: 6818, 6817, 433: 6858, 440: 6846, 442: 6852, 6849, 6853, 6848, 457: 6838, 558: 4449, 591: 6814, 613: 6811, 662: 6833, 714: 4447, 6823, 718: 6856, 745: 6810, 859: 6829, 972: 6840, 1023: 6847, 1056: 6836, 1062: 6825, 1153: 6827, 1228: 6816, 1445: 6815, 1460: 6831, 1466: 6809}, + {132: 6802, 282: 6801}, + {424: 6703, 613: 6705, 649: 6701, 937: 6704, 1124: 6702}, // 35 - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 6670, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 6672, 3067, 3068, 3066, 1431: 6671}, - {2: 1059, 1059, 1059, 1059, 1059, 1059, 1059, 10: 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 58: 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 554: 1059, 565: 1059, 842: 1059, 1059, 1059, 846: 5978, 975: 5979, 1025: 6657}, - {2: 1263, 1263, 1263, 1263, 1263, 1263, 1263, 10: 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 58: 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 565: 1263, 842: 5983, 5982, 5981, 940: 5984, 996: 6622}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 6617, 3067, 3068, 3066}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 6611, 3067, 3068, 3066}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 6690, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 6692, 3072, 3073, 3071, 1430: 6691}, + {2: 1067, 1067, 1067, 1067, 1067, 1067, 1067, 10: 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 58: 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 554: 1067, 564: 1067, 1067, 839: 1067, 841: 1067, 844: 1067, 846: 5998, 949: 5999, 1000: 6677}, + {2: 1067, 1067, 1067, 1067, 1067, 1067, 1067, 10: 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 58: 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 564: 1067, 1067, 839: 1067, 841: 1067, 844: 1067, 846: 5998, 949: 5999, 1000: 6641}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 6636, 3072, 3073, 3071}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 6630, 3072, 3073, 3071}, // 40 - {223: 6609}, - {223: 1241}, - {1239, 1239, 86: 6596, 571: 6594, 717: 6593, 903: 6595, 1135: 6592}, - {1228, 1228}, - {1227, 1227}, + {224: 6628}, + {224: 1249}, + {1247, 1247, 86: 6615, 572: 6613, 717: 6612, 903: 6614, 1138: 6611}, + {1236, 1236}, + {1235, 1235}, // 45 - {538: 6591}, - {2: 1064, 1064, 1064, 1064, 1064, 1064, 1064, 10: 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 58: 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 6561, 6567, 6568, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 536: 1064, 538: 1064, 1064, 1064, 1064, 545: 1064, 1064, 548: 1064, 1064, 1064, 552: 1064, 1064, 557: 1064, 1064, 564: 1064, 578: 6564, 583: 1064, 589: 1064, 591: 1064, 1064, 624: 1064, 631: 1064, 633: 1064, 1064, 1064, 1064, 641: 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 662: 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 702: 1064, 1064, 1064, 1064, 716: 1064, 721: 4196, 835: 4194, 4195, 842: 5983, 5982, 5981, 846: 5978, 855: 6560, 6563, 6559, 891: 6479, 893: 6557, 940: 6558, 975: 6556, 1272: 6566, 6562, 1454: 6555, 6565}, - {424, 424, 57: 424, 535: 424, 537: 424, 544: 424, 547: 424, 555: 424, 424, 559: 424, 562: 424, 424, 565: 424, 6530, 424, 4683, 424, 576: 424, 895: 4684, 6531, 1372: 6529}, - {1054, 1054, 57: 1054, 535: 1054, 537: 1054, 544: 1054, 547: 1054, 555: 1054, 1054, 559: 1054, 562: 1054, 1054, 565: 1054, 567: 1054, 569: 1054, 576: 6517, 1056: 6519, 1086: 6518}, - {1507, 1507, 57: 1507, 535: 1507, 537: 1507, 544: 1507, 547: 1507, 555: 1507, 1507, 559: 1507, 562: 1507, 1507, 565: 1507, 567: 1507, 569: 3879, 848: 3933, 915: 6513}, + {538: 6610}, + {2: 1072, 1072, 1072, 1072, 1072, 1072, 1072, 10: 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 58: 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 6580, 6586, 6587, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 536: 1072, 538: 1072, 1072, 1072, 1072, 545: 1072, 1072, 548: 1072, 1072, 1072, 552: 1072, 1072, 557: 1072, 1072, 565: 1072, 567: 1072, 579: 6583, 584: 1072, 591: 1072, 1072, 630: 1072, 1072, 633: 1072, 1072, 1072, 1072, 641: 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 662: 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 716: 1072, 721: 4204, 834: 4202, 4203, 839: 6003, 841: 6002, 844: 6001, 846: 5998, 855: 6579, 6582, 6578, 891: 6498, 893: 6576, 942: 6577, 949: 6575, 1271: 6585, 6581, 1454: 6574, 6584}, + {431, 431, 57: 431, 535: 431, 537: 431, 544: 431, 547: 431, 555: 431, 431, 559: 431, 431, 563: 431, 431, 566: 6549, 568: 431, 4692, 431, 577: 431, 895: 4693, 6550, 1370: 6548}, + {1062, 1062, 57: 1062, 535: 1062, 537: 1062, 544: 1062, 547: 1062, 555: 1062, 1062, 559: 1062, 1062, 563: 1062, 1062, 568: 1062, 570: 1062, 577: 6536, 1057: 6538, 1088: 6537}, + {1516, 1516, 57: 1516, 535: 1516, 537: 1516, 544: 1516, 547: 1516, 555: 1516, 1516, 559: 1516, 1516, 563: 1516, 1516, 568: 1516, 570: 3884, 847: 3938, 917: 6532}, // 50 - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 3949, 3067, 3068, 3066, 810: 6508}, - {644: 3914, 1019: 3913, 1100: 3912}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 6495, 3067, 3068, 3066, 1040: 6494, 1314: 6492, 1443: 6493}, - {536: 2923, 2922, 552: 2921, 614: 2920, 701: 2916, 781: 6491, 812: 3869, 2917, 2918, 2919, 2928, 818: 2926, 2925, 2924, 822: 3868, 3871, 3870}, - {1035, 1035, 57: 1035, 535: 1035, 537: 1035, 547: 1035}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 565: 3955, 777: 3954, 3072, 3073, 3071, 810: 6527}, + {644: 3919, 1021: 3918, 1103: 3917}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 6514, 3072, 3073, 3071, 1041: 6513, 1312: 6511, 1442: 6512}, + {536: 2929, 2928, 552: 2927, 613: 2926, 660: 2922, 781: 6510, 812: 3874, 2923, 2924, 2925, 2934, 2932, 2931, 2930, 821: 3873, 3876, 3875}, + {1043, 1043, 57: 1043, 535: 1043, 537: 1043, 547: 1043}, // 55 - {1034, 1034, 57: 1034, 535: 1034, 537: 1034, 547: 1034}, - {544: 6476, 555: 6477, 6478, 1457: 6475}, - {674, 674, 544: 1020, 555: 1020, 1020, 559: 3881, 562: 3880, 569: 3879, 848: 3882, 3883}, - {544: 1023, 555: 1023, 1023}, - {676, 676, 544: 1021, 555: 1021, 1021}, + {1042, 1042, 57: 1042, 535: 1042, 537: 1042, 547: 1042}, + {544: 6495, 555: 6496, 6497, 1457: 6494}, + {680, 680, 544: 1028, 555: 1028, 1028, 559: 3886, 3885, 570: 3884, 847: 3887, 3888}, + {544: 1031, 555: 1031, 1031}, + {682, 682, 544: 1029, 555: 1029, 1029}, // 60 - {302: 6460, 330: 6459}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 6297, 6292, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 6298, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 6295, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 6299, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 6302, 3086, 3087, 3119, 6294, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 6300, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 6293, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 6303, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 6301, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 6296, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 540: 6305, 558: 4441, 633: 6309, 657: 6308, 714: 4439, 777: 6306, 3067, 3068, 3066, 859: 6310, 932: 6307, 1102: 6311, 1308: 6304}, - {17: 6147, 58: 6150, 250: 6148, 259: 6154, 266: 6149, 6152, 269: 6145, 6153, 285: 6155, 334: 6151, 375: 6146, 390: 6156, 432: 6157, 560: 6158, 709: 6144, 974: 6143}, - {23: 762, 155: 762, 762, 762, 173: 5273, 240: 762, 246: 762, 257: 762, 275: 762, 288: 762, 309: 762, 313: 762, 591: 762, 614: 762, 914: 5272, 930: 6116}, - {753, 753}, + {303: 6479, 331: 6478}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 6316, 6311, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 6317, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 6314, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 6318, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 6321, 3091, 3092, 3124, 6313, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 6319, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 6312, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 6322, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 6320, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 6315, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 540: 6324, 558: 4449, 633: 6328, 657: 6327, 714: 4447, 777: 6325, 3072, 3073, 3071, 859: 6329, 933: 6326, 1105: 6330, 1306: 6323}, + {17: 6165, 58: 6168, 250: 6166, 259: 6172, 266: 6167, 6170, 269: 6163, 6171, 286: 6173, 335: 6169, 376: 6164, 391: 6174, 432: 6175, 460: 6177, 561: 6176, 709: 6162, 976: 6161}, + {22: 768, 139: 768, 155: 768, 158: 768, 160: 5282, 240: 768, 246: 768, 257: 768, 275: 768, 289: 768, 310: 768, 314: 768, 591: 768, 613: 768, 901: 5281, 916: 6136}, + {759, 759}, // 65 + {758, 758}, + {757, 757}, + {756, 756}, + {755, 755}, + {754, 754}, + // 70 + {753, 753}, {752, 752}, {751, 751}, {750, 750}, {749, 749}, + // 75 {748, 748}, - // 70 {747, 747}, {746, 746}, {745, 745}, {744, 744}, + // 80 {743, 743}, - // 75 {742, 742}, {741, 741}, {740, 740}, {739, 739}, + // 85 {738, 738}, - // 80 {737, 737}, {736, 736}, {735, 735}, {734, 734}, + // 90 {733, 733}, - // 85 {732, 732}, {731, 731}, {730, 730}, {729, 729}, + // 95 {728, 728}, - // 90 {727, 727}, {726, 726}, {725, 725}, {724, 724}, + // 100 {723, 723}, - // 95 {722, 722}, {721, 721}, {720, 720}, {719, 719}, + // 105 {718, 718}, - // 100 {717, 717}, {716, 716}, {715, 715}, {714, 714}, + // 110 {713, 713}, - // 105 {712, 712}, {711, 711}, {710, 710}, {709, 709}, + // 115 {708, 708}, - // 110 {707, 707}, {706, 706}, {705, 705}, {704, 704}, + // 120 {703, 703}, - // 115 {702, 702}, {701, 701}, {700, 700}, {699, 699}, + // 125 {698, 698}, - // 120 {697, 697}, {696, 696}, {695, 695}, {694, 694}, + // 130 {693, 693}, - // 125 {692, 692}, {691, 691}, {690, 690}, {689, 689}, + // 135 {688, 688}, - // 130 {687, 687}, {686, 686}, {685, 685}, {684, 684}, + // 140 {683, 683}, - // 135 - {682, 682}, {681, 681}, - {680, 680}, {679, 679}, {678, 678}, - // 140 {677, 677}, + // 145 + {676, 676}, {675, 675}, + {674, 674}, {673, 673}, {672, 672}, + // 150 {671, 671}, - // 145 {670, 670}, {669, 669}, {668, 668}, {667, 667}, + // 155 {666, 666}, - // 150 {665, 665}, {664, 664}, {663, 663}, {662, 662}, - {661, 661}, - // 155 - {660, 660}, - {659, 659}, - {658, 658}, - {657, 657}, - {656, 656}, // 160 - {655, 655}, - {654, 654}, - {628, 628}, - {2: 571, 571, 571, 571, 571, 571, 571, 10: 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 58: 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 614: 6113, 1414: 6114}, - {430, 430, 547: 430}, + {635, 635}, + {2: 578, 578, 578, 578, 578, 578, 578, 10: 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 58: 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 565: 578, 613: 6133, 1413: 6134}, + {437, 437, 547: 437}, + {2: 1067, 1067, 1067, 1067, 1067, 1067, 1067, 10: 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 58: 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 536: 1067, 554: 1067, 565: 1067, 648: 1067, 839: 1067, 841: 1067, 844: 1067, 846: 5998, 949: 5999, 1000: 6000}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 5996, 3072, 3073, 3071, 913: 5997}, // 165 - {2: 1059, 1059, 1059, 1059, 1059, 1059, 1059, 10: 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 58: 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 536: 1059, 554: 1059, 648: 1059, 842: 1059, 1059, 1059, 846: 5978, 975: 5979, 1025: 5980}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 5976, 3067, 3068, 3066, 913: 5977}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 5819, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 5821, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 5827, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 5823, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 5820, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 5828, 3245, 3497, 5822, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 5825, 5929, 3153, 3399, 5826, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 5824, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 538: 5830, 567: 5853, 592: 5847, 701: 5836, 712: 5851, 715: 5846, 719: 5849, 721: 5840, 729: 5841, 732: 5845, 748: 5842, 777: 3759, 3067, 3068, 3066, 809: 5844, 811: 5829, 900: 5835, 904: 5831, 963: 5850, 974: 5848, 1051: 5832, 1077: 5833, 5839, 1084: 5834, 5837, 1094: 5843, 1098: 5852, 1269: 5930}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 5819, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 5821, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 5827, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 5823, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 5820, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 5828, 3245, 3497, 5822, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 5825, 3152, 3153, 3399, 5826, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 5824, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 538: 5830, 567: 5853, 592: 5847, 701: 5836, 712: 5851, 715: 5846, 719: 5849, 721: 5840, 729: 5841, 732: 5845, 748: 5842, 777: 3759, 3067, 3068, 3066, 809: 5844, 811: 5829, 900: 5835, 904: 5831, 963: 5850, 974: 5848, 1051: 5832, 1077: 5833, 5839, 1084: 5834, 5837, 1094: 5843, 1098: 5852, 1269: 5838}, - {22: 5793, 225: 5794}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 5839, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 5841, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 5847, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 5843, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 5840, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 5848, 3250, 3502, 5842, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 5845, 5949, 3157, 3404, 5846, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 5844, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 538: 5850, 568: 5873, 592: 5867, 660: 5856, 712: 5871, 715: 5866, 719: 5869, 721: 5860, 729: 5861, 732: 5865, 745: 5862, 777: 3764, 3072, 3073, 3071, 809: 5864, 811: 5849, 904: 5851, 915: 5855, 965: 5870, 976: 5868, 1052: 5852, 1079: 5853, 5859, 1086: 5854, 5857, 1097: 5863, 1101: 5872, 1268: 5950}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 5839, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 5841, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 5847, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 5843, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 5840, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 5848, 3250, 3502, 5842, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 5845, 3156, 3157, 3404, 5846, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 5844, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 538: 5850, 568: 5873, 592: 5867, 660: 5856, 712: 5871, 715: 5866, 719: 5869, 721: 5860, 729: 5861, 732: 5865, 745: 5862, 777: 3764, 3072, 3073, 3071, 809: 5864, 811: 5849, 904: 5851, 915: 5855, 965: 5870, 976: 5868, 1052: 5852, 1079: 5853, 5859, 1086: 5854, 5857, 1097: 5863, 1101: 5872, 1268: 5858}, + {23: 5813, 225: 5814}, + {564: 5772}, + {155: 5743, 225: 5764, 613: 5744, 1299: 5763}, // 170 - {565: 5758}, - {157: 5729, 225: 5750, 614: 5730, 1301: 5749}, - {157: 5729, 225: 5731, 614: 5730, 1301: 5728}, - {535: 5711, 562: 210, 1411: 5710}, - {28: 5705, 56: 5232, 159: 5706, 536: 5703, 564: 3053, 805: 5704, 1005: 5707}, + {155: 5743, 225: 5745, 613: 5744, 1299: 5742}, + {535: 5725, 560: 211, 1410: 5724}, + {155: 768, 160: 5282, 613: 768, 901: 5281, 916: 5719}, + {28: 5714, 56: 5241, 161: 5715, 536: 5712, 567: 3058, 805: 5713, 1007: 5716}, + {28: 204, 56: 204, 161: 204, 275: 5711, 536: 204, 567: 204}, // 175 - {28: 204, 56: 204, 159: 204, 275: 5702, 536: 204, 564: 204}, - {364: 5685}, - {431: 4650}, - {51: 4624}, - {134: 3050}, + {366: 5694}, + {431: 4658}, + {51: 4632}, + {135: 3055}, + {2: 3057, 776: 3056}, // 180 - {2: 3052, 775: 3051}, - {51: 3057, 93: 3058, 117: 3061, 661: 3060, 1079: 3056, 3059, 1442: 3055}, - {564: 3053, 805: 3054}, - {2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 15: 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 60: 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 94: 2237, 2237, 2237, 98: 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 118: 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 133: 2237, 137: 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 163: 2237, 2237, 2237, 2237, 214: 2237, 221: 2237, 235: 2237, 239: 2237, 263: 2237, 303: 2237, 535: 2237, 2237, 2237, 540: 2237, 542: 2237, 2237, 2237, 547: 2237, 551: 2237, 2237, 554: 2237, 2237, 2237, 2237, 2237, 2237, 2237, 562: 2237, 2237, 565: 2237, 567: 2237, 2237, 570: 2237, 580: 2237, 582: 2237, 2237, 587: 2237, 592: 2237, 2237, 614: 2237, 624: 2237, 631: 2237, 644: 2237, 701: 2237, 714: 2237, 2237, 718: 2237, 2237, 725: 2237, 727: 2237, 809: 2237, 834: 2237, 837: 2237, 840: 2237, 2237}, + {51: 3062, 93: 3063, 117: 3066, 661: 3065, 1081: 3061, 3064, 1441: 3060}, + {567: 3058, 805: 3059}, + {2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 15: 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 60: 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 94: 2243, 2243, 2243, 98: 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 118: 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 134: 2243, 138: 2243, 140: 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 165: 2243, 2243, 2243, 2243, 214: 2243, 222: 2243, 235: 2243, 239: 2243, 263: 2243, 304: 2243, 535: 2243, 2243, 2243, 540: 2243, 542: 2243, 2243, 2243, 547: 2243, 551: 2243, 2243, 554: 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 563: 2243, 2243, 568: 2243, 2243, 571: 2243, 581: 2243, 583: 2243, 2243, 588: 2243, 592: 2243, 2243, 613: 2243, 630: 2243, 2243, 644: 2243, 660: 2243, 714: 2243, 2243, 718: 2243, 2243, 725: 2243, 727: 2243, 809: 2243, 833: 2243, 836: 2243, 842: 2243, 2243}, {1, 1}, + {12, 12, 9: 4630, 51: 3062, 93: 3063, 117: 3066, 661: 3065, 1081: 4629, 3064}, // 185 - {12, 12, 9: 4622, 51: 3057, 93: 3058, 117: 3061, 661: 3060, 1079: 4621, 3059}, {11, 11, 9: 11, 51: 11, 93: 11, 117: 11, 661: 11}, - {576: 4616}, - {229: 2329, 231: 2329, 561: 4610, 808: 4611, 939: 2329}, + {577: 4624}, + {229: 2335, 231: 2335, 562: 4618, 808: 4619, 941: 2335}, {5, 5, 9: 5, 51: 5, 93: 5, 117: 5, 661: 5}, + {200: 4610, 220: 4609}, // 190 - {200: 4602, 219: 4601}, - {219: 3062}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3703, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3637, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3613, 3618, 3700, 3617, 3614}, - {1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 4598, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 537: 1795, 1795, 1795, 541: 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 554: 1795, 1795, 1795, 559: 1795, 1795, 1795, 1795, 1795, 565: 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 584: 1795, 1795, 1795, 1795, 1795, 1795, 1795, 593: 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 615: 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 625: 1795, 1795, 1795, 1795, 1795, 1795, 632: 1795, 637: 1795, 1795, 1795, 1795, 661: 1795, 707: 1795, 720: 1795, 723: 1795, 1795}, - {1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 4595, 1794, 1794, 1794, 541: 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 554: 1794, 1794, 1794, 559: 1794, 1794, 1794, 1794, 1794, 565: 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 584: 1794, 1794, 1794, 1794, 1794, 1794, 1794, 593: 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 615: 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 625: 1794, 1794, 1794, 1794, 1794, 1794, 632: 1794, 637: 1794, 1794, 1794, 1794, 661: 1794, 707: 1794, 720: 1794, 723: 1794, 1794}, + {220: 3067}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3708, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3642, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3618, 3623, 3705, 3622, 3619}, + {1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 4606, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 537: 1804, 1804, 1804, 541: 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 554: 1804, 1804, 1804, 559: 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 568: 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 585: 1804, 1804, 1804, 1804, 1804, 1804, 593: 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 614: 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 632: 1804, 637: 1804, 1804, 1804, 1804, 661: 1804, 707: 1804, 720: 1804, 723: 1804, 1804}, + {1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 4603, 1803, 1803, 1803, 541: 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 554: 1803, 1803, 1803, 559: 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 568: 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 585: 1803, 1803, 1803, 1803, 1803, 1803, 593: 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 614: 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 632: 1803, 637: 1803, 1803, 1803, 1803, 661: 1803, 707: 1803, 720: 1803, 723: 1803, 1803}, + {2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 4600, 2112, 2112, 2112, 541: 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 554: 2112, 2112, 2112, 559: 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 568: 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 585: 2112, 2112, 2112, 2112, 2112, 2112, 593: 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 614: 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 632: 2112, 637: 2112, 2112, 2112, 2112, 661: 2112, 707: 2112, 720: 2112, 723: 2112, 2112}, // 195 - {2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 4592, 2103, 2103, 2103, 541: 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 554: 2103, 2103, 2103, 559: 2103, 2103, 2103, 2103, 2103, 565: 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 584: 2103, 2103, 2103, 2103, 2103, 2103, 2103, 593: 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 615: 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 625: 2103, 2103, 2103, 2103, 2103, 2103, 632: 2103, 637: 2103, 2103, 2103, 2103, 661: 2103, 707: 2103, 720: 2103, 723: 2103, 2103}, + {2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111}, + {2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110}, + {2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109}, + {2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108}, + {2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107}, + // 200 + {2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 1452, 2106, 2106, 2106, 541: 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 554: 2106, 2106, 2106, 559: 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 568: 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 585: 2106, 2106, 2106, 2106, 2106, 2106, 593: 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 614: 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 632: 2106, 637: 2106, 2106, 2106, 2106, 661: 2106, 707: 2106, 720: 2106, 723: 2106, 2106}, + {2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105}, + {2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104}, + {2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103}, {2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102}, + // 205 {2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101}, {2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100}, {2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2099}, - // 200 {2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098}, - {2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 1443, 2097, 2097, 2097, 541: 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 554: 2097, 2097, 2097, 559: 2097, 2097, 2097, 2097, 2097, 565: 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 584: 2097, 2097, 2097, 2097, 2097, 2097, 2097, 593: 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 615: 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 625: 2097, 2097, 2097, 2097, 2097, 2097, 632: 2097, 637: 2097, 2097, 2097, 2097, 661: 2097, 707: 2097, 720: 2097, 723: 2097, 2097}, + {2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097}, + // 210 {2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096, 2096}, {2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095, 2095}, - {2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094}, - // 205 + {2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 4595, 2094, 2094, 2094, 541: 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 554: 2094, 2094, 2094, 559: 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 568: 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 585: 2094, 2094, 2094, 2094, 2094, 2094, 593: 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 614: 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 632: 2094, 637: 2094, 2094, 2094, 2094, 661: 2094, 707: 2094, 720: 2094, 723: 2094, 2094}, {2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093}, {2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092}, + // 215 {2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091}, {2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090}, {2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089}, - // 210 {2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088}, {2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087}, + // 220 {2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086, 2086}, - {2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 4587, 2085, 2085, 2085, 541: 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 554: 2085, 2085, 2085, 559: 2085, 2085, 2085, 2085, 2085, 565: 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 584: 2085, 2085, 2085, 2085, 2085, 2085, 2085, 593: 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 615: 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 625: 2085, 2085, 2085, 2085, 2085, 2085, 632: 2085, 637: 2085, 2085, 2085, 2085, 661: 2085, 707: 2085, 720: 2085, 723: 2085, 2085}, + {2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085}, {2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084}, - // 215 {2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083, 2083}, {2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082}, - {2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081}, + // 225 + {2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 1451, 2081, 2081, 2081, 541: 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 554: 2081, 2081, 2081, 559: 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 568: 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 585: 2081, 2081, 2081, 2081, 2081, 2081, 593: 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 614: 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 632: 2081, 637: 2081, 2081, 2081, 2081, 661: 2081, 707: 2081, 720: 2081, 723: 2081, 2081}, {2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080}, {2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079, 2079}, - // 220 {2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078}, {2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077}, + // 230 {2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076}, {2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075}, {2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074}, - // 225 {2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073}, - {2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 1442, 2072, 2072, 2072, 541: 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 554: 2072, 2072, 2072, 559: 2072, 2072, 2072, 2072, 2072, 565: 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 584: 2072, 2072, 2072, 2072, 2072, 2072, 2072, 593: 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 615: 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 625: 2072, 2072, 2072, 2072, 2072, 2072, 632: 2072, 637: 2072, 2072, 2072, 2072, 661: 2072, 707: 2072, 720: 2072, 723: 2072, 2072}, + {2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072}, + // 235 {2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071}, - {2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070}, + {2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 1448, 2070, 4594, 2070, 541: 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 554: 2070, 2070, 2070, 559: 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 568: 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 585: 2070, 2070, 2070, 2070, 2070, 2070, 593: 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 614: 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 632: 2070, 637: 2070, 2070, 2070, 2070, 661: 2070, 707: 2070, 720: 2070, 723: 2070, 2070}, {2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069}, - // 230 - {2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068}, + {2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 1446, 2068, 2068, 2068, 541: 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 554: 2068, 2068, 2068, 559: 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 568: 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 585: 2068, 2068, 2068, 2068, 2068, 2068, 593: 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 614: 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 632: 2068, 637: 2068, 2068, 2068, 2068, 661: 2068, 707: 2068, 720: 2068, 723: 2068, 2068}, {2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067}, + // 240 {2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066}, {2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065}, {2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064}, - // 235 {2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063}, {2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062}, - {2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 1439, 2061, 4586, 2061, 541: 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 554: 2061, 2061, 2061, 559: 2061, 2061, 2061, 2061, 2061, 565: 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 584: 2061, 2061, 2061, 2061, 2061, 2061, 2061, 593: 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 615: 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 625: 2061, 2061, 2061, 2061, 2061, 2061, 632: 2061, 637: 2061, 2061, 2061, 2061, 661: 2061, 707: 2061, 720: 2061, 723: 2061, 2061}, + // 245 + {2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061}, {2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060}, - {2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 1437, 2059, 2059, 2059, 541: 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 554: 2059, 2059, 2059, 559: 2059, 2059, 2059, 2059, 2059, 565: 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 584: 2059, 2059, 2059, 2059, 2059, 2059, 2059, 593: 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 615: 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 625: 2059, 2059, 2059, 2059, 2059, 2059, 632: 2059, 637: 2059, 2059, 2059, 2059, 661: 2059, 707: 2059, 720: 2059, 723: 2059, 2059}, - // 240 + {2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059}, {2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058}, {2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057}, + // 250 {2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056}, {2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055}, {2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054}, - // 245 {2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053}, {2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052}, + // 255 {2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051}, {2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050}, {2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049}, - // 250 {2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048}, {2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047}, + // 260 {2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046}, - {2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045}, + {2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 1441, 2045, 2045, 2045, 541: 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 554: 2045, 2045, 2045, 559: 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 568: 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 585: 2045, 2045, 2045, 2045, 2045, 2045, 593: 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 614: 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 632: 2045, 637: 2045, 2045, 2045, 2045, 661: 2045, 707: 2045, 720: 2045, 723: 2045, 2045}, {2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044}, - // 255 {2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043}, {2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042}, + // 265 {2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041}, {2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040}, - {2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039}, - // 260 + {2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 1445, 2039, 2039, 2039, 541: 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 554: 2039, 2039, 2039, 559: 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 568: 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 585: 2039, 2039, 2039, 2039, 2039, 2039, 593: 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 614: 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 632: 2039, 637: 2039, 2039, 2039, 2039, 661: 2039, 707: 2039, 720: 2039, 723: 2039, 2039}, {2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038}, {2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037}, - {2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 1432, 2036, 2036, 2036, 541: 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 554: 2036, 2036, 2036, 559: 2036, 2036, 2036, 2036, 2036, 565: 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 584: 2036, 2036, 2036, 2036, 2036, 2036, 2036, 593: 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 615: 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 625: 2036, 2036, 2036, 2036, 2036, 2036, 632: 2036, 637: 2036, 2036, 2036, 2036, 661: 2036, 707: 2036, 720: 2036, 723: 2036, 2036}, + // 270 + {2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036}, {2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035, 2035}, {2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034}, - // 265 {2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033}, {2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032, 2032}, + // 275 {2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031, 2031}, - {2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 1436, 2030, 2030, 2030, 541: 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 554: 2030, 2030, 2030, 559: 2030, 2030, 2030, 2030, 2030, 565: 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 584: 2030, 2030, 2030, 2030, 2030, 2030, 2030, 593: 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 615: 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 625: 2030, 2030, 2030, 2030, 2030, 2030, 632: 2030, 637: 2030, 2030, 2030, 2030, 661: 2030, 707: 2030, 720: 2030, 723: 2030, 2030}, - {2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029}, - // 270 + {2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030}, + {2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 4591, 2029, 2029, 2029, 541: 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 554: 2029, 2029, 2029, 559: 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 568: 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 585: 2029, 2029, 2029, 2029, 2029, 2029, 593: 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 614: 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 632: 2029, 637: 2029, 2029, 2029, 2029, 661: 2029, 707: 2029, 720: 2029, 723: 2029, 2029}, {2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028}, {2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027}, + // 280 {2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026}, {2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025, 2025}, {2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024}, - // 275 {2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023}, {2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022}, + // 285 {2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021}, {2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020}, - {2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 4583, 2019, 2019, 2019, 541: 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 554: 2019, 2019, 2019, 559: 2019, 2019, 2019, 2019, 2019, 565: 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 584: 2019, 2019, 2019, 2019, 2019, 2019, 2019, 593: 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 615: 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 625: 2019, 2019, 2019, 2019, 2019, 2019, 632: 2019, 637: 2019, 2019, 2019, 2019, 661: 2019, 707: 2019, 720: 2019, 723: 2019, 2019}, - // 280 + {2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019}, {2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018}, {2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017}, + // 290 {2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016}, {2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015}, {2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014}, - // 285 {2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013}, {2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012}, + // 295 {2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011}, {2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010}, {2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009}, - // 290 - {2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008}, + {2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 1435, 2008, 2008, 2008, 541: 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 554: 2008, 2008, 2008, 559: 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 568: 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 585: 2008, 2008, 2008, 2008, 2008, 2008, 593: 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 614: 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 632: 2008, 637: 2008, 2008, 2008, 2008, 661: 2008, 707: 2008, 720: 2008, 723: 2008, 2008}, {2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007}, + // 300 {2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006}, {2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005}, {2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004}, - // 295 {2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003}, {2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002}, - {2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001}, - {2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000}, + // 305 + {2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 1427, 2001, 4590, 2001, 541: 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 554: 2001, 2001, 2001, 559: 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 568: 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 585: 2001, 2001, 2001, 2001, 2001, 2001, 593: 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 614: 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 632: 2001, 637: 2001, 2001, 2001, 2001, 661: 2001, 707: 2001, 720: 2001, 723: 2001, 2001}, + {2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 1426, 2000, 4589, 2000, 541: 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 554: 2000, 2000, 2000, 559: 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 568: 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 585: 2000, 2000, 2000, 2000, 2000, 2000, 593: 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 614: 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 632: 2000, 637: 2000, 2000, 2000, 2000, 661: 2000, 707: 2000, 720: 2000, 723: 2000, 2000}, {1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999}, - // 300 - {1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1426, 1998, 1998, 1998, 541: 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 554: 1998, 1998, 1998, 559: 1998, 1998, 1998, 1998, 1998, 565: 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 584: 1998, 1998, 1998, 1998, 1998, 1998, 1998, 593: 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 615: 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 625: 1998, 1998, 1998, 1998, 1998, 1998, 632: 1998, 637: 1998, 1998, 1998, 1998, 661: 1998, 707: 1998, 720: 1998, 723: 1998, 1998}, - {1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997}, + {1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998}, + {1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1425, 1997, 1997, 1997, 541: 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 554: 1997, 1997, 1997, 559: 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 568: 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 585: 1997, 1997, 1997, 1997, 1997, 1997, 593: 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 614: 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 632: 1997, 637: 1997, 1997, 1997, 1997, 661: 1997, 707: 1997, 720: 1997, 723: 1997, 1997}, + // 310 {1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996}, {1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995}, {1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994}, - // 305 {1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993}, {1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992}, - {1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1418, 1991, 4582, 1991, 541: 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 554: 1991, 1991, 1991, 559: 1991, 1991, 1991, 1991, 1991, 565: 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 584: 1991, 1991, 1991, 1991, 1991, 1991, 1991, 593: 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 615: 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 625: 1991, 1991, 1991, 1991, 1991, 1991, 632: 1991, 637: 1991, 1991, 1991, 1991, 661: 1991, 707: 1991, 720: 1991, 723: 1991, 1991}, - {1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1417, 1990, 4581, 1990, 541: 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 554: 1990, 1990, 1990, 559: 1990, 1990, 1990, 1990, 1990, 565: 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 584: 1990, 1990, 1990, 1990, 1990, 1990, 1990, 593: 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 615: 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 625: 1990, 1990, 1990, 1990, 1990, 1990, 632: 1990, 637: 1990, 1990, 1990, 1990, 661: 1990, 707: 1990, 720: 1990, 723: 1990, 1990}, + // 315 + {1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991}, + {1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1422, 1990, 1990, 1990, 541: 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 554: 1990, 1990, 1990, 559: 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 568: 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 585: 1990, 1990, 1990, 1990, 1990, 1990, 593: 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 614: 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 632: 1990, 637: 1990, 1990, 1990, 1990, 661: 1990, 707: 1990, 720: 1990, 723: 1990, 1990}, {1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989, 1989}, - // 310 - {1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988}, - {1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1416, 1987, 1987, 1987, 541: 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 554: 1987, 1987, 1987, 559: 1987, 1987, 1987, 1987, 1987, 565: 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 584: 1987, 1987, 1987, 1987, 1987, 1987, 1987, 593: 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 615: 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 625: 1987, 1987, 1987, 1987, 1987, 1987, 632: 1987, 637: 1987, 1987, 1987, 1987, 661: 1987, 707: 1987, 720: 1987, 723: 1987, 1987}, + {1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1423, 1988, 1988, 1988, 541: 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 554: 1988, 1988, 1988, 559: 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 568: 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 585: 1988, 1988, 1988, 1988, 1988, 1988, 593: 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 614: 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 632: 1988, 637: 1988, 1988, 1988, 1988, 661: 1988, 707: 1988, 720: 1988, 723: 1988, 1988}, + {1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 4579, 1987, 1987, 1987, 541: 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 554: 1987, 1987, 1987, 559: 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 568: 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 585: 1987, 1987, 1987, 1987, 1987, 1987, 593: 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 614: 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 632: 1987, 637: 1987, 1987, 1987, 1987, 661: 1987, 707: 1987, 720: 1987, 723: 1987, 1987}, + // 320 {1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986}, {1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985}, - {1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984}, - // 315 + {1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1424, 1984, 1984, 1984, 541: 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 554: 1984, 1984, 1984, 559: 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 568: 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 585: 1984, 1984, 1984, 1984, 1984, 1984, 593: 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 614: 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 632: 1984, 637: 1984, 1984, 1984, 1984, 661: 1984, 707: 1984, 720: 1984, 723: 1984, 1984}, {1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983}, - {1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982}, - {1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1413, 1981, 1981, 1981, 541: 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 554: 1981, 1981, 1981, 559: 1981, 1981, 1981, 1981, 1981, 565: 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 584: 1981, 1981, 1981, 1981, 1981, 1981, 1981, 593: 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 615: 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 625: 1981, 1981, 1981, 1981, 1981, 1981, 632: 1981, 637: 1981, 1981, 1981, 1981, 661: 1981, 707: 1981, 720: 1981, 723: 1981, 1981}, + {1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1449, 1982, 1982, 1982, 541: 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 554: 1982, 1982, 1982, 559: 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 568: 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 585: 1982, 1982, 1982, 1982, 1982, 1982, 593: 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 614: 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 632: 1982, 637: 1982, 1982, 1982, 1982, 661: 1982, 707: 1982, 720: 1982, 723: 1982, 1982}, + // 325 + {1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981}, {1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980}, - {1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1414, 1979, 1979, 1979, 541: 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 554: 1979, 1979, 1979, 559: 1979, 1979, 1979, 1979, 1979, 565: 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 584: 1979, 1979, 1979, 1979, 1979, 1979, 1979, 593: 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 615: 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 625: 1979, 1979, 1979, 1979, 1979, 1979, 632: 1979, 637: 1979, 1979, 1979, 1979, 661: 1979, 707: 1979, 720: 1979, 723: 1979, 1979}, - // 320 - {1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 4571, 1978, 1978, 1978, 541: 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 554: 1978, 1978, 1978, 559: 1978, 1978, 1978, 1978, 1978, 565: 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 584: 1978, 1978, 1978, 1978, 1978, 1978, 1978, 593: 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 615: 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 625: 1978, 1978, 1978, 1978, 1978, 1978, 632: 1978, 637: 1978, 1978, 1978, 1978, 661: 1978, 707: 1978, 720: 1978, 723: 1978, 1978}, + {1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979}, + {1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978}, {1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977}, + // 330 {1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976}, - {1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1415, 1975, 1975, 1975, 541: 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 554: 1975, 1975, 1975, 559: 1975, 1975, 1975, 1975, 1975, 565: 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 584: 1975, 1975, 1975, 1975, 1975, 1975, 1975, 593: 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 615: 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 625: 1975, 1975, 1975, 1975, 1975, 1975, 632: 1975, 637: 1975, 1975, 1975, 1975, 661: 1975, 707: 1975, 720: 1975, 723: 1975, 1975}, + {1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975}, {1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974}, - // 325 - {1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1440, 1973, 1973, 1973, 541: 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 554: 1973, 1973, 1973, 559: 1973, 1973, 1973, 1973, 1973, 565: 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 584: 1973, 1973, 1973, 1973, 1973, 1973, 1973, 593: 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 615: 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 625: 1973, 1973, 1973, 1973, 1973, 1973, 632: 1973, 637: 1973, 1973, 1973, 1973, 661: 1973, 707: 1973, 720: 1973, 723: 1973, 1973}, + {1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973}, {1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972}, + // 335 {1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971}, {1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970}, - {1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969}, - // 330 + {1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1434, 1969, 1969, 1969, 541: 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 554: 1969, 1969, 1969, 559: 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 568: 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 585: 1969, 1969, 1969, 1969, 1969, 1969, 593: 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 614: 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 632: 1969, 637: 1969, 1969, 1969, 1969, 661: 1969, 707: 1969, 720: 1969, 723: 1969, 1969}, {1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968}, {1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967}, + // 340 {1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966}, {1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965}, {1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964}, - // 335 {1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963}, {1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962}, + // 345 {1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961}, - {1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1425, 1960, 1960, 1960, 541: 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 554: 1960, 1960, 1960, 559: 1960, 1960, 1960, 1960, 1960, 565: 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 584: 1960, 1960, 1960, 1960, 1960, 1960, 1960, 593: 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 615: 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 625: 1960, 1960, 1960, 1960, 1960, 1960, 632: 1960, 637: 1960, 1960, 1960, 1960, 661: 1960, 707: 1960, 720: 1960, 723: 1960, 1960}, + {1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960}, {1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959}, - // 340 {1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958}, {1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957}, + // 350 {1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956}, {1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955}, {1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954}, - // 345 {1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953}, {1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952}, + // 355 {1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951}, {1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950}, {1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949}, - // 350 {1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948}, {1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947}, - {1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946}, + // 360 + {1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1431, 1946, 1946, 1946, 541: 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 554: 1946, 1946, 1946, 559: 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 568: 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 585: 1946, 1946, 1946, 1946, 1946, 1946, 593: 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 614: 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 632: 1946, 637: 1946, 1946, 1946, 1946, 661: 1946, 707: 1946, 720: 1946, 723: 1946, 1946}, {1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945}, {1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944}, - // 355 {1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943}, {1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942}, + // 365 {1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941}, {1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940}, {1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939}, - // 360 {1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938}, - {1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1422, 1937, 1937, 1937, 541: 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 554: 1937, 1937, 1937, 559: 1937, 1937, 1937, 1937, 1937, 565: 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 584: 1937, 1937, 1937, 1937, 1937, 1937, 1937, 593: 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 615: 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 625: 1937, 1937, 1937, 1937, 1937, 1937, 632: 1937, 637: 1937, 1937, 1937, 1937, 661: 1937, 707: 1937, 720: 1937, 723: 1937, 1937}, + {1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937}, + // 370 {1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936}, {1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935}, {1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934}, - // 365 {1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933}, {1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932}, + // 375 {1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931}, {1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930}, - {1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929}, - // 370 - {1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928}, - {1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927}, + {1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1429, 1929, 1929, 1929, 541: 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 554: 1929, 1929, 1929, 559: 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 568: 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 585: 1929, 1929, 1929, 1929, 1929, 1929, 593: 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 614: 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 632: 1929, 637: 1929, 1929, 1929, 1929, 661: 1929, 707: 1929, 720: 1929, 723: 1929, 1929}, + {1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1450, 1928, 1928, 1928, 541: 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 554: 1928, 1928, 1928, 559: 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 568: 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 585: 1928, 1928, 1928, 1928, 1928, 1928, 593: 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 614: 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 632: 1928, 637: 1928, 1928, 1928, 1928, 661: 1928, 707: 1928, 720: 1928, 723: 1928, 1928}, + {1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1437, 1927, 1927, 1927, 541: 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 554: 1927, 1927, 1927, 559: 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 568: 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 585: 1927, 1927, 1927, 1927, 1927, 1927, 593: 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 614: 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 632: 1927, 637: 1927, 1927, 1927, 1927, 661: 1927, 707: 1927, 720: 1927, 723: 1927, 1927}, + // 380 {1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926}, {1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925}, {1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924}, - // 375 - {1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923}, - {1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922}, + {1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1439, 1923, 1923, 1923, 541: 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 554: 1923, 1923, 1923, 559: 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 568: 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 585: 1923, 1923, 1923, 1923, 1923, 1923, 593: 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 614: 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 632: 1923, 637: 1923, 1923, 1923, 1923, 661: 1923, 707: 1923, 720: 1923, 723: 1923, 1923}, + {1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1438, 1922, 1922, 1922, 541: 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 554: 1922, 1922, 1922, 559: 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 568: 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 585: 1922, 1922, 1922, 1922, 1922, 1922, 593: 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 614: 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 632: 1922, 637: 1922, 1922, 1922, 1922, 661: 1922, 707: 1922, 720: 1922, 723: 1922, 1922}, + // 385 {1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921}, - {1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1420, 1920, 1920, 1920, 541: 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 554: 1920, 1920, 1920, 559: 1920, 1920, 1920, 1920, 1920, 565: 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 584: 1920, 1920, 1920, 1920, 1920, 1920, 1920, 593: 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 615: 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 625: 1920, 1920, 1920, 1920, 1920, 1920, 632: 1920, 637: 1920, 1920, 1920, 1920, 661: 1920, 707: 1920, 720: 1920, 723: 1920, 1920}, - {1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1441, 1919, 1919, 1919, 541: 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 554: 1919, 1919, 1919, 559: 1919, 1919, 1919, 1919, 1919, 565: 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 584: 1919, 1919, 1919, 1919, 1919, 1919, 1919, 593: 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 615: 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 625: 1919, 1919, 1919, 1919, 1919, 1919, 632: 1919, 637: 1919, 1919, 1919, 1919, 661: 1919, 707: 1919, 720: 1919, 723: 1919, 1919}, - // 380 - {1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1428, 1918, 1918, 1918, 541: 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 554: 1918, 1918, 1918, 559: 1918, 1918, 1918, 1918, 1918, 565: 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 584: 1918, 1918, 1918, 1918, 1918, 1918, 1918, 593: 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 615: 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 625: 1918, 1918, 1918, 1918, 1918, 1918, 632: 1918, 637: 1918, 1918, 1918, 1918, 661: 1918, 707: 1918, 720: 1918, 723: 1918, 1918}, + {1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920}, + {1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919}, + {1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918}, {1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917}, - {1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916}, + // 390 + {1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1428, 1916, 1916, 1916, 541: 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 554: 1916, 1916, 1916, 559: 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 568: 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 585: 1916, 1916, 1916, 1916, 1916, 1916, 593: 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 614: 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 632: 1916, 637: 1916, 1916, 1916, 1916, 661: 1916, 707: 1916, 720: 1916, 723: 1916, 1916}, {1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915}, - {1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1430, 1914, 1914, 1914, 541: 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 554: 1914, 1914, 1914, 559: 1914, 1914, 1914, 1914, 1914, 565: 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 584: 1914, 1914, 1914, 1914, 1914, 1914, 1914, 593: 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 615: 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 625: 1914, 1914, 1914, 1914, 1914, 1914, 632: 1914, 637: 1914, 1914, 1914, 1914, 661: 1914, 707: 1914, 720: 1914, 723: 1914, 1914}, - // 385 - {1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1429, 1913, 1913, 1913, 541: 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 554: 1913, 1913, 1913, 559: 1913, 1913, 1913, 1913, 1913, 565: 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 584: 1913, 1913, 1913, 1913, 1913, 1913, 1913, 593: 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 615: 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 625: 1913, 1913, 1913, 1913, 1913, 1913, 632: 1913, 637: 1913, 1913, 1913, 1913, 661: 1913, 707: 1913, 720: 1913, 723: 1913, 1913}, + {1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914}, + {1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913}, {1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912}, + // 395 {1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911}, {1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910}, {1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909}, - // 390 {1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908}, - {1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1419, 1907, 1907, 1907, 541: 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 554: 1907, 1907, 1907, 559: 1907, 1907, 1907, 1907, 1907, 565: 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 584: 1907, 1907, 1907, 1907, 1907, 1907, 1907, 593: 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 615: 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 625: 1907, 1907, 1907, 1907, 1907, 1907, 632: 1907, 637: 1907, 1907, 1907, 1907, 661: 1907, 707: 1907, 720: 1907, 723: 1907, 1907}, + {1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907}, + // 400 {1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906}, {1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905}, {1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904}, - // 395 {1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903}, {1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902}, + // 405 {1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901}, {1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900}, {1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899}, - // 400 {1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898}, {1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897}, + // 410 {1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896}, {1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895}, {1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894}, - // 405 {1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893}, {1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892}, + // 415 {1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891}, {1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890}, {1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889}, - // 410 {1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888}, {1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887}, + // 420 {1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886}, {1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885}, {1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884}, - // 415 {1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883}, {1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882}, + // 425 {1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881}, {1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880}, {1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879}, - // 420 {1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878}, {1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877}, + // 430 {1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876}, {1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875}, {1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874}, - // 425 {1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873}, {1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872}, + // 435 {1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871}, {1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870}, {1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869}, - // 430 {1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868, 1868}, {1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867}, + // 440 {1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866, 1866}, {1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865}, {1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864}, - // 435 {1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863}, {1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862}, + // 445 {1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861}, {1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860}, {1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859}, - // 440 {1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858}, {1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857}, + // 450 {1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856}, {1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855}, {1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854}, - // 445 {1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853}, {1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852}, + // 455 {1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851}, {1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850}, {1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849}, - // 450 {1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848}, {1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847}, + // 460 {1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846}, {1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845}, {1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844}, - // 455 {1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843}, {1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842}, + // 465 {1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841}, {1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840}, {1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839}, - // 460 {1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838}, {1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837}, + // 470 {1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836}, {1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835}, {1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834}, - // 465 {1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833}, {1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832}, + // 475 {1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831}, {1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830}, {1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829}, - // 470 {1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828}, {1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827}, + // 480 {1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826}, {1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825}, {1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824}, - // 475 {1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823}, {1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822}, + // 485 {1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821}, {1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820}, {1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819}, - // 480 {1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818}, {1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817}, + // 490 {1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816}, {1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815, 1815}, {1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814}, - // 485 {1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813}, {1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812}, + // 495 {1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811}, {1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810}, {1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809}, - // 490 {1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808}, {1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807}, + // 500 {1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806}, {1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805}, - {1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804}, - // 495 - {1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803}, - {1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802}, - {1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801}, + {1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 4576, 1802, 1802, 1802, 541: 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 554: 1802, 1802, 1802, 559: 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 568: 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 585: 1802, 1802, 1802, 1802, 1802, 1802, 593: 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 614: 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 632: 1802, 637: 1802, 1802, 1802, 1802, 661: 1802, 707: 1802, 720: 1802, 723: 1802, 1802}, + {1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 4565, 1801, 1801, 1801, 541: 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 554: 1801, 1801, 1801, 559: 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 568: 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 585: 1801, 1801, 1801, 1801, 1801, 1801, 593: 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 614: 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 632: 1801, 637: 1801, 1801, 1801, 1801, 661: 1801, 707: 1801, 720: 1801, 723: 1801, 1801}, {1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800}, + // 505 {1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799}, - // 500 {1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798}, {1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797}, {1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796}, - {1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 4568, 1793, 1793, 1793, 541: 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 554: 1793, 1793, 1793, 559: 1793, 1793, 1793, 1793, 1793, 565: 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 584: 1793, 1793, 1793, 1793, 1793, 1793, 1793, 593: 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 615: 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 625: 1793, 1793, 1793, 1793, 1793, 1793, 632: 1793, 637: 1793, 1793, 1793, 1793, 661: 1793, 707: 1793, 720: 1793, 723: 1793, 1793}, - {1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 4557, 1792, 1792, 1792, 541: 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 554: 1792, 1792, 1792, 559: 1792, 1792, 1792, 1792, 1792, 565: 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 584: 1792, 1792, 1792, 1792, 1792, 1792, 1792, 593: 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 615: 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 625: 1792, 1792, 1792, 1792, 1792, 1792, 632: 1792, 637: 1792, 1792, 1792, 1792, 661: 1792, 707: 1792, 720: 1792, 723: 1792, 1792}, - // 505 + {1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795}, + // 510 + {1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794}, + {1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793}, + {1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792}, {1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791}, {1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790}, + // 515 {1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789}, {1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788}, {1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787, 1787}, - // 510 {1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786, 1786}, {1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785}, + // 520 {1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784}, {1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783}, {1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782}, - // 515 {1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781}, {1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780}, + // 525 {1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779}, {1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778}, {1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777}, - // 520 {1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776}, {1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775}, + // 530 {1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774}, {1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773}, {1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772}, - // 525 {1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771}, {1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770}, + // 535 {1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769}, {1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768}, {1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767}, - // 530 {1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766}, {1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765}, + // 540 {1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764}, {1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763}, {1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762}, - // 535 {1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761}, {1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760}, + // 545 {1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759}, {1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758}, {1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757}, - // 540 {1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756}, {1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755}, + // 550 {1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754}, {1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753}, {1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752}, - // 545 {1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751}, {1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750}, + // 555 {1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749}, {1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748}, {1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747}, - // 550 {1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746}, {1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745}, + // 560 {1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744}, {1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743}, {1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742}, - // 555 {1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741}, {1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740}, + // 565 {1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739}, {1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738}, {1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737}, - // 560 {1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736}, {1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735}, + // 570 {1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734}, {1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733}, {1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732}, - // 565 {1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731}, {1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730}, + // 575 {1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729}, {1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728}, {1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727}, - // 570 {1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726}, {1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725}, + // 580 {1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724}, {1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723}, {1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722}, - // 575 {1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721}, {1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720}, + // 585 {1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719}, {1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718}, {1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717}, - // 580 {1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716}, {1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715}, + // 590 {1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714}, {1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713}, {1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712}, - // 585 {1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711}, {1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710}, + // 595 {1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709}, {1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708}, {1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707}, - // 590 {1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706}, {1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705}, + // 600 {1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704}, {1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703}, {1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702}, - // 595 {1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701}, {1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700}, + // 605 {1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699}, {1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698}, {1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697}, - // 600 {1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696}, - {1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695}, + {1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1366, 1695, 1695, 1695, 541: 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 554: 1695, 1695, 1695, 559: 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 568: 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 585: 1695, 1695, 1695, 1695, 1695, 1695, 593: 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 614: 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 632: 1695, 637: 1695, 1695, 1695, 1695, 661: 1695, 707: 1695, 720: 1695, 723: 1695, 1695}, + // 610 {1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694}, {1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693}, {1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692}, - // 605 {1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691}, {1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690}, + // 615 {1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689}, {1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688}, {1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687}, - // 610 - {1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1357, 1686, 1686, 1686, 541: 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 554: 1686, 1686, 1686, 559: 1686, 1686, 1686, 1686, 1686, 565: 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 584: 1686, 1686, 1686, 1686, 1686, 1686, 1686, 593: 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 615: 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 625: 1686, 1686, 1686, 1686, 1686, 1686, 632: 1686, 637: 1686, 1686, 1686, 1686, 661: 1686, 707: 1686, 720: 1686, 723: 1686, 1686}, + {1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686}, {1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685}, + // 620 {1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684}, {1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683}, {1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682}, - // 615 {1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681}, {1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680}, + // 625 {1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679}, {1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678}, {1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677}, - // 620 - {1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676}, + {1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 4556, 1676, 1676, 1676, 541: 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 554: 1676, 1676, 1676, 559: 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 568: 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 585: 1676, 1676, 1676, 1676, 1676, 1676, 593: 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 614: 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 632: 1676, 637: 1676, 1676, 1676, 1676, 661: 1676, 707: 1676, 720: 1676, 723: 1676, 1676}, {1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675}, + // 630 {1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674}, {1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673}, {1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672}, - // 625 - {1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671}, + {1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1442, 1671, 1671, 1671, 541: 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 554: 1671, 1671, 1671, 559: 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 568: 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 585: 1671, 1671, 1671, 1671, 1671, 1671, 593: 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 614: 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 632: 1671, 637: 1671, 1671, 1671, 1671, 661: 1671, 707: 1671, 720: 1671, 723: 1671, 1671}, {1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670}, + // 635 {1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669}, {1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668}, - {1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 4548, 1667, 1667, 1667, 541: 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 554: 1667, 1667, 1667, 559: 1667, 1667, 1667, 1667, 1667, 565: 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 584: 1667, 1667, 1667, 1667, 1667, 1667, 1667, 593: 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 615: 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 625: 1667, 1667, 1667, 1667, 1667, 1667, 632: 1667, 637: 1667, 1667, 1667, 1667, 661: 1667, 707: 1667, 720: 1667, 723: 1667, 1667}, - // 630 + {1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667}, {1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666}, {1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665}, + // 640 {1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664}, {1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663}, - {1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1433, 1662, 1662, 1662, 541: 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 554: 1662, 1662, 1662, 559: 1662, 1662, 1662, 1662, 1662, 565: 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 584: 1662, 1662, 1662, 1662, 1662, 1662, 1662, 593: 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 615: 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 625: 1662, 1662, 1662, 1662, 1662, 1662, 632: 1662, 637: 1662, 1662, 1662, 1662, 661: 1662, 707: 1662, 720: 1662, 723: 1662, 1662}, - // 635 + {1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662}, {1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661}, {1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660}, + // 645 {1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659}, {1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658}, - {1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657}, - // 640 + {1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1365, 1657, 1657, 1657, 541: 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 554: 1657, 1657, 1657, 559: 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 568: 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 585: 1657, 1657, 1657, 1657, 1657, 1657, 593: 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 614: 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 632: 1657, 637: 1657, 1657, 1657, 1657, 661: 1657, 707: 1657, 720: 1657, 723: 1657, 1657}, {1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656}, {1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655}, + // 650 {1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654}, {1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653}, {1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652}, - // 645 {1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651}, {1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650}, + // 655 {1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649}, - {1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1356, 1648, 1648, 1648, 541: 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 554: 1648, 1648, 1648, 559: 1648, 1648, 1648, 1648, 1648, 565: 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 584: 1648, 1648, 1648, 1648, 1648, 1648, 1648, 593: 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 615: 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 625: 1648, 1648, 1648, 1648, 1648, 1648, 632: 1648, 637: 1648, 1648, 1648, 1648, 661: 1648, 707: 1648, 720: 1648, 723: 1648, 1648}, + {1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648}, {1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647}, - // 650 {1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646}, {1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645}, - {1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644}, - {1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643}, + // 660 + {1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 4549, 1644, 1644, 1644, 541: 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 554: 1644, 1644, 1644, 559: 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 568: 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 585: 1644, 1644, 1644, 1644, 1644, 1644, 593: 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 614: 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 632: 1644, 637: 1644, 1644, 1644, 1644, 661: 1644, 707: 1644, 720: 1644, 723: 1644, 1644}, + {1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 4542, 1643, 1643, 1643, 541: 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 554: 1643, 1643, 1643, 559: 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 568: 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 585: 1643, 1643, 1643, 1643, 1643, 1643, 593: 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 614: 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 632: 1643, 637: 1643, 1643, 1643, 1643, 661: 1643, 707: 1643, 720: 1643, 723: 1643, 1643}, {1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642}, - // 655 {1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641}, {1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640}, + // 665 {1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639}, {1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638}, {1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637}, - // 660 {1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636}, - {1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 4541, 1635, 1635, 1635, 541: 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 554: 1635, 1635, 1635, 559: 1635, 1635, 1635, 1635, 1635, 565: 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 584: 1635, 1635, 1635, 1635, 1635, 1635, 1635, 593: 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 615: 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 625: 1635, 1635, 1635, 1635, 1635, 1635, 632: 1635, 637: 1635, 1635, 1635, 1635, 661: 1635, 707: 1635, 720: 1635, 723: 1635, 1635}, - {1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 4534, 1634, 1634, 1634, 541: 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 554: 1634, 1634, 1634, 559: 1634, 1634, 1634, 1634, 1634, 565: 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 584: 1634, 1634, 1634, 1634, 1634, 1634, 1634, 593: 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 615: 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 625: 1634, 1634, 1634, 1634, 1634, 1634, 632: 1634, 637: 1634, 1634, 1634, 1634, 661: 1634, 707: 1634, 720: 1634, 723: 1634, 1634}, + {1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635}, + // 670 + {1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634}, {1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633}, {1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632}, - // 665 {1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631}, {1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630}, + // 675 {1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629}, {1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628}, {1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627}, - // 670 {1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626}, {1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625}, + // 680 {1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624}, - {1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623}, - {1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622}, - // 675 + {1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 4522, 1623, 1623, 1623, 541: 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 554: 1623, 1623, 1623, 559: 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 568: 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 585: 1623, 1623, 1623, 1623, 1623, 1623, 593: 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 614: 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 632: 1623, 637: 1623, 1623, 1623, 1623, 661: 1623, 707: 1623, 720: 1623, 723: 1623, 1623}, + {1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 4514, 1622, 1622, 1622, 541: 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 554: 1622, 1622, 1622, 559: 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 568: 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 585: 1622, 1622, 1622, 1622, 1622, 1622, 593: 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 614: 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 632: 1622, 637: 1622, 1622, 1622, 1622, 661: 1622, 707: 1622, 720: 1622, 723: 1622, 1622}, {1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621}, {1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620}, + // 685 {1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619}, {1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618}, {1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617}, - // 680 {1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616}, {1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615}, - {1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 4514, 1614, 1614, 1614, 541: 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 554: 1614, 1614, 1614, 559: 1614, 1614, 1614, 1614, 1614, 565: 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 584: 1614, 1614, 1614, 1614, 1614, 1614, 1614, 593: 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 615: 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 625: 1614, 1614, 1614, 1614, 1614, 1614, 632: 1614, 637: 1614, 1614, 1614, 1614, 661: 1614, 707: 1614, 720: 1614, 723: 1614, 1614}, - {1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 4506, 1613, 1613, 1613, 541: 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 554: 1613, 1613, 1613, 559: 1613, 1613, 1613, 1613, 1613, 565: 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 584: 1613, 1613, 1613, 1613, 1613, 1613, 1613, 593: 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 615: 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 625: 1613, 1613, 1613, 1613, 1613, 1613, 632: 1613, 637: 1613, 1613, 1613, 1613, 661: 1613, 707: 1613, 720: 1613, 723: 1613, 1613}, + // 690 + {1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614}, + {1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613}, {1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612}, - // 685 {1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611}, {1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610}, + // 695 {1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609}, {1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608}, {1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607}, - // 690 {1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606}, {1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605}, + // 700 {1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604}, {1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603}, {1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602}, - // 695 {1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601}, {1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600}, + // 705 {1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599}, {1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598}, {1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597}, - // 700 {1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596}, {1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595}, + // 710 {1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594}, {1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593}, {1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592}, - // 705 {1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591}, {1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590}, + // 715 {1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589}, {1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588}, {1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587}, - // 710 {1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586}, {1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585}, + // 720 {1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584}, {1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583}, {1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582}, - // 715 {1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581}, {1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580}, - {1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579}, - {1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578}, - {1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577}, - // 720 - {1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576}, - {1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575}, - {1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574}, - {1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573}, - {1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572}, // 725 - {1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571}, - {1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570}, - {1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 537: 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 553: 1534, 1534, 1534, 1534, 559: 1534, 1534, 1534, 1534, 1534, 565: 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 584: 1534, 1534, 1534, 1534, 1534, 1534, 1534, 593: 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 615: 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 625: 1534, 1534, 1534, 1534, 1534, 1534, 632: 1534, 637: 1534, 1534, 1534, 1534, 661: 1534, 706: 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534}, - {1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 537: 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 553: 1533, 1533, 1533, 1533, 559: 1533, 1533, 1533, 1533, 1533, 565: 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 584: 1533, 1533, 1533, 1533, 1533, 1533, 1533, 593: 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 615: 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 625: 1533, 1533, 1533, 1533, 1533, 1533, 632: 1533, 637: 1533, 1533, 1533, 1533, 661: 1533, 706: 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533}, - {1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 537: 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 553: 1532, 1532, 1532, 1532, 559: 1532, 1532, 1532, 1532, 1532, 565: 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 584: 1532, 1532, 1532, 1532, 1532, 1532, 1532, 593: 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 615: 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 625: 1532, 1532, 1532, 1532, 1532, 1532, 632: 1532, 637: 1532, 1532, 1532, 1532, 661: 1532, 706: 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532}, + {1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579}, + {1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 537: 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 553: 1543, 1543, 1543, 1543, 559: 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 568: 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 585: 1543, 1543, 1543, 1543, 1543, 1543, 593: 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 614: 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 632: 1543, 637: 1543, 1543, 1543, 1543, 661: 1543, 706: 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543}, + {1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 537: 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 553: 1542, 1542, 1542, 1542, 559: 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 568: 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 585: 1542, 1542, 1542, 1542, 1542, 1542, 593: 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 614: 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 632: 1542, 637: 1542, 1542, 1542, 1542, 661: 1542, 706: 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542}, + {1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 537: 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 553: 1541, 1541, 1541, 1541, 559: 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 568: 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 585: 1541, 1541, 1541, 1541, 1541, 1541, 593: 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 614: 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 632: 1541, 637: 1541, 1541, 1541, 1541, 661: 1541, 706: 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541}, + {1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 537: 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 553: 1540, 1540, 1540, 1540, 559: 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 568: 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 585: 1540, 1540, 1540, 1540, 1540, 1540, 593: 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 614: 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 632: 1540, 637: 1540, 1540, 1540, 1540, 661: 1540, 706: 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540}, // 730 - {1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 537: 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 553: 1531, 1531, 1531, 1531, 559: 1531, 1531, 1531, 1531, 1531, 565: 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 584: 1531, 1531, 1531, 1531, 1531, 1531, 1531, 593: 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 615: 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 625: 1531, 1531, 1531, 1531, 1531, 1531, 632: 1531, 637: 1531, 1531, 1531, 1531, 661: 1531, 706: 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531}, - {1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 537: 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 553: 1530, 1530, 1530, 1530, 559: 1530, 1530, 1530, 1530, 1530, 565: 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 584: 1530, 1530, 1530, 1530, 1530, 1530, 1530, 593: 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 615: 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 625: 1530, 1530, 1530, 1530, 1530, 1530, 632: 1530, 637: 1530, 1530, 1530, 1530, 661: 1530, 706: 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530}, - {1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 537: 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 553: 1529, 1529, 1529, 1529, 559: 1529, 1529, 1529, 1529, 1529, 565: 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 584: 1529, 1529, 1529, 1529, 1529, 1529, 1529, 593: 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 615: 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 625: 1529, 1529, 1529, 1529, 1529, 1529, 632: 1529, 637: 1529, 1529, 1529, 1529, 661: 1529, 706: 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529}, - {1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 537: 1528, 4505, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 553: 1528, 1528, 1528, 1528, 559: 1528, 1528, 1528, 1528, 1528, 565: 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 584: 1528, 1528, 1528, 1528, 1528, 1528, 1528, 593: 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 615: 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 625: 1528, 1528, 1528, 1528, 1528, 1528, 632: 1528, 637: 1528, 1528, 1528, 1528, 661: 1528, 706: 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528}, - {538: 4502, 643: 4503, 645: 4504}, + {1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 537: 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 553: 1539, 1539, 1539, 1539, 559: 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 568: 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 585: 1539, 1539, 1539, 1539, 1539, 1539, 593: 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 614: 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 632: 1539, 637: 1539, 1539, 1539, 1539, 661: 1539, 706: 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539}, + {1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 537: 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 553: 1538, 1538, 1538, 1538, 559: 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 568: 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 585: 1538, 1538, 1538, 1538, 1538, 1538, 593: 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 614: 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 632: 1538, 637: 1538, 1538, 1538, 1538, 661: 1538, 706: 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538}, + {1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 537: 1537, 4513, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 553: 1537, 1537, 1537, 1537, 559: 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 568: 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 585: 1537, 1537, 1537, 1537, 1537, 1537, 593: 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 614: 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 632: 1537, 637: 1537, 1537, 1537, 1537, 661: 1537, 706: 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537}, + {538: 4510, 643: 4511, 645: 4512}, + {1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 537: 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 553: 1535, 1535, 1535, 1535, 559: 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 568: 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 585: 1535, 1535, 1535, 1535, 1535, 1535, 593: 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 614: 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 632: 1535, 637: 1535, 1535, 1535, 1535, 661: 1535, 706: 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535}, // 735 - {1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 537: 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 553: 1526, 1526, 1526, 1526, 559: 1526, 1526, 1526, 1526, 1526, 565: 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 584: 1526, 1526, 1526, 1526, 1526, 1526, 1526, 593: 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 615: 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 625: 1526, 1526, 1526, 1526, 1526, 1526, 632: 1526, 637: 1526, 1526, 1526, 1526, 661: 1526, 706: 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526}, - {1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 537: 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 553: 1525, 1525, 1525, 1525, 559: 1525, 1525, 1525, 1525, 1525, 565: 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 584: 1525, 1525, 1525, 1525, 1525, 1525, 1525, 593: 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 615: 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 625: 1525, 1525, 1525, 1525, 1525, 1525, 632: 1525, 637: 1525, 1525, 1525, 1525, 661: 1525, 706: 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525}, - {1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 537: 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 553: 1522, 1522, 1522, 1522, 559: 1522, 1522, 1522, 1522, 1522, 565: 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 584: 1522, 1522, 1522, 1522, 1522, 1522, 1522, 593: 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 615: 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 625: 1522, 1522, 1522, 1522, 1522, 1522, 632: 1522, 637: 1522, 1522, 1522, 1522, 661: 1522, 706: 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522}, - {1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 537: 1489, 1489, 1489, 541: 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 554: 1489, 1489, 1489, 559: 1489, 1489, 1489, 1489, 1489, 565: 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 584: 1489, 1489, 1489, 1489, 1489, 1489, 1489, 593: 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 615: 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 625: 1489, 1489, 1489, 1489, 1489, 1489, 632: 1489, 637: 1489, 1489, 1489, 1489, 661: 1489, 707: 1489, 720: 4497, 723: 1489, 1489}, - {1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 537: 1486, 1486, 1486, 541: 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 554: 1486, 1486, 1486, 559: 1486, 1486, 1486, 1486, 1486, 565: 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 584: 1486, 1486, 1486, 1486, 1486, 1486, 1486, 593: 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 615: 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 625: 1486, 1486, 1486, 1486, 1486, 1486, 632: 1486, 637: 1486, 1486, 1486, 1486, 661: 1486, 707: 1486, 723: 4493, 4494}, + {1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 537: 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 553: 1534, 1534, 1534, 1534, 559: 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 568: 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 585: 1534, 1534, 1534, 1534, 1534, 1534, 593: 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 614: 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 632: 1534, 637: 1534, 1534, 1534, 1534, 661: 1534, 706: 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534}, + {1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 537: 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 553: 1531, 1531, 1531, 1531, 559: 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 568: 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 585: 1531, 1531, 1531, 1531, 1531, 1531, 593: 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 614: 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 632: 1531, 637: 1531, 1531, 1531, 1531, 661: 1531, 706: 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531}, + {1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 537: 1498, 1498, 1498, 541: 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 554: 1498, 1498, 1498, 559: 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 568: 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 585: 1498, 1498, 1498, 1498, 1498, 1498, 593: 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 614: 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 632: 1498, 637: 1498, 1498, 1498, 1498, 661: 1498, 707: 1498, 720: 4505, 723: 1498, 1498}, + {1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 537: 1495, 1495, 1495, 541: 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 554: 1495, 1495, 1495, 559: 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 568: 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 585: 1495, 1495, 1495, 1495, 1495, 1495, 593: 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 614: 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 632: 1495, 637: 1495, 1495, 1495, 1495, 661: 1495, 707: 1495, 723: 4501, 4502}, + {1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 537: 1494, 1494, 1494, 541: 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 554: 1494, 1494, 1494, 559: 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 568: 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 585: 1494, 1494, 1494, 1494, 1494, 1494, 593: 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 614: 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 632: 1494, 637: 1494, 1494, 1494, 1494, 661: 1494, 707: 1494}, // 740 - {1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 537: 1485, 1485, 1485, 541: 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 554: 1485, 1485, 1485, 559: 1485, 1485, 1485, 1485, 1485, 565: 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 584: 1485, 1485, 1485, 1485, 1485, 1485, 1485, 593: 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 615: 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 625: 1485, 1485, 1485, 1485, 1485, 1485, 632: 1485, 637: 1485, 1485, 1485, 1485, 661: 1485, 707: 1485}, - {1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 537: 1484, 1484, 1484, 541: 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 554: 1484, 1484, 1484, 559: 1484, 1484, 1484, 1484, 1484, 565: 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 584: 1484, 1484, 1484, 1484, 1484, 1484, 1484, 593: 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 615: 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 625: 1484, 1484, 1484, 1484, 1484, 1484, 632: 1484, 637: 1484, 1484, 1484, 1484, 661: 1484, 707: 1484}, - {1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 537: 1483, 1483, 1483, 541: 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 554: 1483, 1483, 1483, 559: 1483, 1483, 1483, 1483, 1483, 565: 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 584: 1483, 1483, 1483, 1483, 1483, 1483, 1483, 593: 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 615: 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 625: 1483, 1483, 1483, 1483, 1483, 1483, 632: 1483, 637: 1483, 1483, 1483, 1483, 661: 1483, 707: 1483}, - {3, 3, 9: 3, 51: 3, 93: 3, 117: 3, 543: 3714, 661: 3, 707: 3715}, - {1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 537: 1481, 1481, 1481, 541: 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 554: 1481, 1481, 1481, 559: 1481, 1481, 1481, 1481, 1481, 565: 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 584: 1481, 1481, 1481, 1481, 1481, 1481, 1481, 593: 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 615: 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 625: 1481, 1481, 1481, 1481, 1481, 1481, 632: 1481, 637: 1481, 1481, 1481, 1481, 661: 1481, 707: 1481}, + {1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 537: 1493, 1493, 1493, 541: 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 554: 1493, 1493, 1493, 559: 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 568: 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 585: 1493, 1493, 1493, 1493, 1493, 1493, 593: 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 614: 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 632: 1493, 637: 1493, 1493, 1493, 1493, 661: 1493, 707: 1493}, + {1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 537: 1492, 1492, 1492, 541: 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 554: 1492, 1492, 1492, 559: 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 568: 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 585: 1492, 1492, 1492, 1492, 1492, 1492, 593: 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 614: 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 632: 1492, 637: 1492, 1492, 1492, 1492, 661: 1492, 707: 1492}, + {3, 3, 9: 3, 51: 3, 93: 3, 117: 3, 543: 3719, 661: 3, 707: 3720}, + {1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 537: 1490, 1490, 1490, 541: 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 554: 1490, 1490, 1490, 559: 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 568: 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 585: 1490, 1490, 1490, 1490, 1490, 1490, 593: 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 614: 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 632: 1490, 637: 1490, 1490, 1490, 1490, 661: 1490, 707: 1490}, + {1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 537: 1489, 1489, 1489, 541: 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 554: 1489, 1489, 1489, 559: 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 568: 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 585: 1489, 1489, 1489, 1489, 1489, 1489, 593: 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 614: 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 632: 1489, 637: 1489, 1489, 1489, 1489, 661: 1489, 707: 1489}, // 745 - {1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 537: 1480, 1480, 1480, 541: 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 554: 1480, 1480, 1480, 559: 1480, 1480, 1480, 1480, 1480, 565: 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 584: 1480, 1480, 1480, 1480, 1480, 1480, 1480, 593: 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 615: 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 625: 1480, 1480, 1480, 1480, 1480, 1480, 632: 1480, 637: 1480, 1480, 1480, 1480, 661: 1480, 707: 1480}, - {1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 537: 1479, 1479, 1479, 541: 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 554: 1479, 1479, 1479, 559: 1479, 1479, 1479, 1479, 1479, 565: 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 584: 1479, 1479, 1479, 1479, 1479, 1479, 1479, 593: 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 615: 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 625: 1479, 1479, 1479, 1479, 1479, 1479, 632: 1479, 637: 1479, 1479, 1479, 1479, 661: 1479, 707: 1479}, - {1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 537: 1478, 1478, 1478, 541: 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 554: 1478, 1478, 1478, 559: 1478, 1478, 1478, 1478, 1478, 565: 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 584: 1478, 1478, 1478, 1478, 1478, 1478, 1478, 593: 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 615: 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 625: 1478, 1478, 1478, 1478, 1478, 1478, 632: 1478, 637: 1478, 1478, 1478, 1478, 661: 1478, 707: 1478}, - {1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 537: 1477, 1477, 1477, 541: 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 554: 1477, 1477, 1477, 559: 1477, 1477, 1477, 1477, 1477, 565: 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 584: 1477, 1477, 1477, 1477, 1477, 1477, 1477, 593: 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 615: 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 625: 1477, 1477, 1477, 1477, 1477, 1477, 632: 1477, 637: 1477, 1477, 1477, 1477, 661: 1477, 707: 1477}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3703, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3637, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 4492, 3618, 3700, 3617, 3614}, + {1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 537: 1488, 1488, 1488, 541: 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 554: 1488, 1488, 1488, 559: 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 568: 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 585: 1488, 1488, 1488, 1488, 1488, 1488, 593: 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 614: 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 632: 1488, 637: 1488, 1488, 1488, 1488, 661: 1488, 707: 1488}, + {1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 537: 1487, 1487, 1487, 541: 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 554: 1487, 1487, 1487, 559: 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 568: 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 585: 1487, 1487, 1487, 1487, 1487, 1487, 593: 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 614: 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 632: 1487, 637: 1487, 1487, 1487, 1487, 661: 1487, 707: 1487}, + {1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 537: 1486, 1486, 1486, 541: 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 554: 1486, 1486, 1486, 559: 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 568: 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 585: 1486, 1486, 1486, 1486, 1486, 1486, 593: 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 614: 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 632: 1486, 637: 1486, 1486, 1486, 1486, 661: 1486, 707: 1486}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3708, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3642, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 4500, 3623, 3705, 3622, 3619}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3708, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3642, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 4499, 3623, 3705, 3622, 3619}, // 750 - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3703, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3637, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 4491, 3618, 3700, 3617, 3614}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3703, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3637, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 4490, 3618, 3700, 3617, 3614}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3703, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3637, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 4489, 3618, 3700, 3617, 3614}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3703, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3637, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 4488, 3618, 3700, 3617, 3614}, - {1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 537: 1470, 1470, 1470, 541: 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 554: 1470, 1470, 1470, 559: 1470, 1470, 1470, 1470, 1470, 565: 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 584: 1470, 1470, 1470, 1470, 1470, 1470, 1470, 593: 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 615: 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 625: 1470, 1470, 1470, 1470, 1470, 1470, 632: 1470, 637: 1470, 1470, 1470, 1470, 661: 1470, 707: 1470}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3708, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3642, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 4498, 3623, 3705, 3622, 3619}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3708, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3642, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 4497, 3623, 3705, 3622, 3619}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3708, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3642, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 4496, 3623, 3705, 3622, 3619}, + {1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 537: 1479, 1479, 1479, 541: 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 554: 1479, 1479, 1479, 559: 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 568: 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 585: 1479, 1479, 1479, 1479, 1479, 1479, 593: 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 614: 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 632: 1479, 637: 1479, 1479, 1479, 1479, 661: 1479, 707: 1479}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 2928, 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3872, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 613: 2926, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 2922, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3871, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 4490, 812: 3874, 2923, 2924, 2925, 2934, 2932, 2931, 2930, 821: 3873, 3876, 3875, 869: 4491}, // 755 - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 2922, 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3867, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 614: 2920, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 2916, 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3866, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 4482, 812: 3869, 2917, 2918, 2919, 2928, 818: 2926, 2925, 2924, 822: 3868, 3871, 3870, 869: 4483}, - {536: 4477}, - {536: 2923, 781: 4476}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 4473, 3067, 3068, 3066}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3703, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3637, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 4472, 3618, 3700, 3617, 3614}, + {536: 4485}, + {536: 2929, 781: 4484}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 4481, 3072, 3073, 3071}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3708, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3642, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 4480, 3623, 3705, 3622, 3619}, + {536: 4473}, // 760 - {536: 4465}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 594: 1286, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 4452, 1363: 4453}, - {536: 4394}, - {536: 3922}, - {536: 3911}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 594: 1295, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 4460, 1361: 4461}, + {536: 4402}, + {536: 3927}, + {536: 3916}, + {536: 1447}, // 765 - {536: 1438}, - {536: 1435}, - {536: 1434}, - {536: 1431}, - {536: 1427}, + {536: 1444}, + {536: 1443}, + {536: 1440}, + {536: 1436}, + {536: 1433}, // 770 - {536: 1424}, - {536: 1423}, - {536: 1421}, - {1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 541: 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 554: 1410, 1410, 1410, 559: 1410, 1410, 1410, 1410, 1410, 565: 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 584: 1410, 1410, 1410, 1410, 1410, 1410, 1410, 593: 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 615: 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 625: 1410, 1410, 1410, 1410, 1410, 1410, 632: 1410, 637: 1410, 1410, 1410, 1410, 661: 1410, 707: 1410}, - {1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 541: 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 554: 1409, 1409, 1409, 559: 1409, 1409, 1409, 1409, 1409, 565: 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 584: 1409, 1409, 1409, 1409, 1409, 1409, 1409, 593: 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 615: 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 625: 1409, 1409, 1409, 1409, 1409, 1409, 632: 1409, 637: 1409, 1409, 1409, 1409, 661: 1409, 707: 1409}, + {536: 1432}, + {536: 1430}, + {1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 541: 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 554: 1419, 1419, 1419, 559: 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 568: 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 585: 1419, 1419, 1419, 1419, 1419, 1419, 593: 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 614: 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 632: 1419, 637: 1419, 1419, 1419, 1419, 661: 1419, 707: 1419}, + {1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 541: 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 554: 1418, 1418, 1418, 559: 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 568: 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 585: 1418, 1418, 1418, 1418, 1418, 1418, 593: 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 614: 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 632: 1418, 637: 1418, 1418, 1418, 1418, 661: 1418, 707: 1418}, + {1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 541: 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 554: 1417, 1417, 1417, 559: 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 568: 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 585: 1417, 1417, 1417, 1417, 1417, 1417, 593: 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 614: 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 632: 1417, 637: 1417, 1417, 1417, 1417, 661: 1417, 707: 1417}, // 775 - {1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 541: 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 554: 1408, 1408, 1408, 559: 1408, 1408, 1408, 1408, 1408, 565: 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 584: 1408, 1408, 1408, 1408, 1408, 1408, 1408, 593: 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 615: 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 625: 1408, 1408, 1408, 1408, 1408, 1408, 632: 1408, 637: 1408, 1408, 1408, 1408, 661: 1408, 707: 1408}, - {1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 541: 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 554: 1407, 1407, 1407, 559: 1407, 1407, 1407, 1407, 1407, 565: 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 584: 1407, 1407, 1407, 1407, 1407, 1407, 1407, 593: 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 615: 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 625: 1407, 1407, 1407, 1407, 1407, 1407, 632: 1407, 637: 1407, 1407, 1407, 1407, 661: 1407, 707: 1407}, - {1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 541: 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 554: 1406, 1406, 1406, 559: 1406, 1406, 1406, 1406, 1406, 565: 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 584: 1406, 1406, 1406, 1406, 1406, 1406, 1406, 593: 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 615: 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 625: 1406, 1406, 1406, 1406, 1406, 1406, 632: 1406, 637: 1406, 1406, 1406, 1406, 661: 1406, 707: 1406}, - {1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 541: 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 554: 1405, 1405, 1405, 559: 1405, 1405, 1405, 1405, 1405, 565: 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 584: 1405, 1405, 1405, 1405, 1405, 1405, 1405, 593: 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 615: 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 625: 1405, 1405, 1405, 1405, 1405, 1405, 632: 1405, 637: 1405, 1405, 1405, 1405, 661: 1405, 707: 1405}, - {1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 541: 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 554: 1404, 1404, 1404, 559: 1404, 1404, 1404, 1404, 1404, 565: 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 584: 1404, 1404, 1404, 1404, 1404, 1404, 1404, 593: 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 615: 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 625: 1404, 1404, 1404, 1404, 1404, 1404, 632: 1404, 637: 1404, 1404, 1404, 1404, 661: 1404, 707: 1404}, + {1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 541: 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 554: 1416, 1416, 1416, 559: 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 568: 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 585: 1416, 1416, 1416, 1416, 1416, 1416, 593: 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 614: 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 632: 1416, 637: 1416, 1416, 1416, 1416, 661: 1416, 707: 1416}, + {1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 541: 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 554: 1415, 1415, 1415, 559: 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 568: 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 585: 1415, 1415, 1415, 1415, 1415, 1415, 593: 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 614: 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 632: 1415, 637: 1415, 1415, 1415, 1415, 661: 1415, 707: 1415}, + {1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 541: 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 554: 1414, 1414, 1414, 559: 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 568: 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 585: 1414, 1414, 1414, 1414, 1414, 1414, 593: 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 614: 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 632: 1414, 637: 1414, 1414, 1414, 1414, 661: 1414, 707: 1414}, + {1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 541: 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 554: 1413, 1413, 1413, 559: 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 568: 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 585: 1413, 1413, 1413, 1413, 1413, 1413, 593: 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 614: 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 632: 1413, 637: 1413, 1413, 1413, 1413, 661: 1413, 707: 1413}, + {1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 541: 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 554: 1412, 1412, 1412, 559: 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 568: 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 585: 1412, 1412, 1412, 1412, 1412, 1412, 593: 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 614: 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 632: 1412, 637: 1412, 1412, 1412, 1412, 661: 1412, 707: 1412}, // 780 - {1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 541: 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 554: 1403, 1403, 1403, 559: 1403, 1403, 1403, 1403, 1403, 565: 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 584: 1403, 1403, 1403, 1403, 1403, 1403, 1403, 593: 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 615: 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 625: 1403, 1403, 1403, 1403, 1403, 1403, 632: 1403, 637: 1403, 1403, 1403, 1403, 661: 1403, 707: 1403}, - {1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 541: 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 554: 1402, 1402, 1402, 559: 1402, 1402, 1402, 1402, 1402, 565: 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 584: 1402, 1402, 1402, 1402, 1402, 1402, 1402, 593: 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 615: 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 625: 1402, 1402, 1402, 1402, 1402, 1402, 632: 1402, 637: 1402, 1402, 1402, 1402, 661: 1402, 707: 1402}, - {1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 541: 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 554: 1401, 1401, 1401, 559: 1401, 1401, 1401, 1401, 1401, 565: 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 584: 1401, 1401, 1401, 1401, 1401, 1401, 1401, 593: 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 615: 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 625: 1401, 1401, 1401, 1401, 1401, 1401, 632: 1401, 637: 1401, 1401, 1401, 1401, 661: 1401, 707: 1401}, - {1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 541: 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 554: 1400, 1400, 1400, 559: 1400, 1400, 1400, 1400, 1400, 565: 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 584: 1400, 1400, 1400, 1400, 1400, 1400, 1400, 593: 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 615: 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 625: 1400, 1400, 1400, 1400, 1400, 1400, 632: 1400, 637: 1400, 1400, 1400, 1400, 661: 1400, 707: 1400}, - {536: 4391}, + {1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 541: 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 554: 1411, 1411, 1411, 559: 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 568: 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 585: 1411, 1411, 1411, 1411, 1411, 1411, 593: 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 614: 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 632: 1411, 637: 1411, 1411, 1411, 1411, 661: 1411, 707: 1411}, + {1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 541: 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 554: 1410, 1410, 1410, 559: 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 568: 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 585: 1410, 1410, 1410, 1410, 1410, 1410, 593: 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 614: 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 632: 1410, 637: 1410, 1410, 1410, 1410, 661: 1410, 707: 1410}, + {1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 541: 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 554: 1409, 1409, 1409, 559: 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 568: 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 585: 1409, 1409, 1409, 1409, 1409, 1409, 593: 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 614: 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 632: 1409, 637: 1409, 1409, 1409, 1409, 661: 1409, 707: 1409}, + {536: 4399}, + {536: 4396}, // 785 - {536: 4388}, - {1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 4385, 1412, 1412, 1412, 541: 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 554: 1412, 1412, 1412, 559: 1412, 1412, 1412, 1412, 1412, 565: 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 584: 1412, 1412, 1412, 1412, 1412, 1412, 1412, 593: 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 615: 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 625: 1412, 1412, 1412, 1412, 1412, 1412, 632: 1412, 637: 1412, 1412, 1412, 1412, 661: 1412, 707: 1412, 1230: 4386}, - {536: 4383}, - {1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 4379, 1318, 1318, 1318, 541: 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 554: 1318, 1318, 1318, 559: 1318, 1318, 1318, 1318, 1318, 565: 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 584: 1318, 1318, 1318, 1318, 1318, 1318, 1318, 593: 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 615: 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 625: 1318, 1318, 1318, 1318, 1318, 1318, 632: 1318, 637: 1318, 1318, 1318, 1318, 661: 1318, 707: 1318, 1374: 4378}, - {536: 4370}, + {1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 4393, 1421, 1421, 1421, 541: 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 554: 1421, 1421, 1421, 559: 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 568: 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 585: 1421, 1421, 1421, 1421, 1421, 1421, 593: 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 614: 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 632: 1421, 637: 1421, 1421, 1421, 1421, 661: 1421, 707: 1421, 1231: 4394}, + {536: 4391}, + {1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 4387, 1327, 1327, 1327, 541: 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 554: 1327, 1327, 1327, 559: 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 568: 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 585: 1327, 1327, 1327, 1327, 1327, 1327, 593: 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 614: 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 632: 1327, 637: 1327, 1327, 1327, 1327, 661: 1327, 707: 1327, 1372: 4386}, + {536: 4378}, + {536: 4374}, // 790 + {536: 4369}, {536: 4366}, {536: 4361}, - {536: 4358}, - {536: 4353}, - {536: 4344}, + {536: 4352}, + {536: 4345}, // 795 - {536: 4337}, - {536: 4332}, - {536: 4327}, - {536: 4313}, - {536: 4296}, + {536: 4340}, + {536: 4335}, + {536: 4321}, + {536: 4304}, + {1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 537: 1374, 1374, 1374, 541: 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 554: 1374, 1374, 1374, 559: 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 568: 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 585: 1374, 1374, 1374, 1374, 1374, 1374, 593: 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 614: 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 632: 1374, 637: 1374, 1374, 1374, 1374, 661: 1374, 707: 1374}, // 800 - {1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 537: 1365, 1365, 1365, 541: 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 554: 1365, 1365, 1365, 559: 1365, 1365, 1365, 1365, 1365, 565: 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 584: 1365, 1365, 1365, 1365, 1365, 1365, 1365, 593: 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 615: 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 625: 1365, 1365, 1365, 1365, 1365, 1365, 632: 1365, 637: 1365, 1365, 1365, 1365, 661: 1365, 707: 1365}, - {536: 4289}, - {536: 1359}, - {536: 1358}, - {1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 537: 1350, 1350, 1350, 541: 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 554: 1350, 1350, 1350, 559: 1350, 1350, 1350, 1350, 1350, 565: 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 584: 1350, 1350, 1350, 1350, 1350, 1350, 1350, 593: 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 615: 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 625: 1350, 1350, 1350, 1350, 1350, 1350, 632: 1350, 637: 1350, 1350, 1350, 1350, 661: 1350, 707: 1350}, + {536: 4297}, + {536: 1368}, + {536: 1367}, + {1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 537: 1359, 1359, 1359, 541: 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 554: 1359, 1359, 1359, 559: 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 568: 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 585: 1359, 1359, 1359, 1359, 1359, 1359, 593: 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 614: 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 632: 1359, 637: 1359, 1359, 1359, 1359, 661: 1359, 707: 1359}, + {536: 4294}, // 805 - {536: 4286}, + {536: 4291}, {536: 4283}, {536: 4275}, {536: 4267}, - {536: 4259}, + {536: 4253}, // 810 - {536: 4245}, - {536: 4236}, - {536: 4231}, - {536: 4226}, - {536: 4221}, + {536: 4244}, + {536: 4239}, + {536: 4234}, + {536: 4229}, + {536: 4224}, // 815 - {536: 4216}, - {536: 4211}, - {536: 4206}, - {536: 4193}, - {536: 4190}, + {536: 4219}, + {536: 4214}, + {536: 4201}, + {536: 4198}, + {536: 4195}, // 820 - {536: 4187}, - {536: 4184}, - {536: 4181}, - {536: 4178}, - {536: 4174}, + {536: 4192}, + {536: 4189}, + {536: 4186}, + {536: 4182}, + {536: 4176}, // 825 - {536: 4168}, - {536: 4155}, - {536: 4150}, - {536: 4145}, - {536: 3704}, + {536: 4163}, + {536: 4158}, + {536: 4153}, + {536: 3709}, + {964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 537: 964, 964, 964, 541: 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 554: 964, 964, 964, 559: 964, 964, 964, 964, 964, 964, 964, 964, 568: 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 585: 964, 964, 964, 964, 964, 964, 593: 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 614: 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 632: 964, 637: 964, 964, 964, 964, 661: 964, 707: 964}, // 830 - {956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 537: 956, 956, 956, 541: 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 554: 956, 956, 956, 559: 956, 956, 956, 956, 956, 565: 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 584: 956, 956, 956, 956, 956, 956, 956, 593: 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 615: 956, 956, 956, 956, 956, 956, 956, 956, 956, 625: 956, 956, 956, 956, 956, 956, 632: 956, 637: 956, 956, 956, 956, 661: 956, 707: 956}, - {955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 537: 955, 955, 955, 541: 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 554: 955, 955, 955, 559: 955, 955, 955, 955, 955, 565: 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 584: 955, 955, 955, 955, 955, 955, 955, 593: 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 615: 955, 955, 955, 955, 955, 955, 955, 955, 955, 625: 955, 955, 955, 955, 955, 955, 632: 955, 637: 955, 955, 955, 955, 661: 955, 707: 955}, - {954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 537: 954, 954, 954, 541: 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 554: 954, 954, 954, 559: 954, 954, 954, 954, 954, 565: 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 584: 954, 954, 954, 954, 954, 954, 954, 593: 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 615: 954, 954, 954, 954, 954, 954, 954, 954, 954, 625: 954, 954, 954, 954, 954, 954, 632: 954, 637: 954, 954, 954, 954, 661: 954, 707: 954}, - {953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 537: 953, 953, 953, 541: 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 554: 953, 953, 953, 559: 953, 953, 953, 953, 953, 565: 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 584: 953, 953, 953, 953, 953, 953, 953, 593: 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 615: 953, 953, 953, 953, 953, 953, 953, 953, 953, 625: 953, 953, 953, 953, 953, 953, 632: 953, 637: 953, 953, 953, 953, 661: 953, 707: 953}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 3706}, + {963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 537: 963, 963, 963, 541: 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 554: 963, 963, 963, 559: 963, 963, 963, 963, 963, 963, 963, 963, 568: 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 585: 963, 963, 963, 963, 963, 963, 593: 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 614: 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 632: 963, 637: 963, 963, 963, 963, 661: 963, 707: 963}, + {962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 537: 962, 962, 962, 541: 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 554: 962, 962, 962, 559: 962, 962, 962, 962, 962, 962, 962, 962, 568: 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 585: 962, 962, 962, 962, 962, 962, 593: 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 614: 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 632: 962, 637: 962, 962, 962, 962, 661: 962, 707: 962}, + {961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 537: 961, 961, 961, 541: 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 554: 961, 961, 961, 559: 961, 961, 961, 961, 961, 961, 961, 961, 568: 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 585: 961, 961, 961, 961, 961, 961, 593: 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 614: 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 632: 961, 637: 961, 961, 961, 961, 661: 961, 707: 961}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 3711}, + {961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 537: 961, 961, 961, 541: 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 554: 961, 961, 961, 559: 961, 961, 961, 961, 961, 961, 961, 961, 568: 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 585: 961, 961, 961, 961, 961, 961, 593: 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 614: 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 632: 961, 637: 961, 961, 961, 961, 707: 961, 722: 4151}, // 835 - {953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 537: 953, 953, 953, 541: 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 554: 953, 953, 953, 559: 953, 953, 953, 953, 953, 565: 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 584: 953, 953, 953, 953, 953, 953, 953, 593: 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 615: 953, 953, 953, 953, 953, 953, 953, 953, 953, 625: 953, 953, 953, 953, 953, 953, 632: 953, 637: 953, 953, 953, 953, 707: 953, 722: 4143}, - {9: 4074, 571: 3767, 3765, 3766, 3764, 3762, 806: 3763, 3761}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 4073}, - {536: 4045}, - {2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 537: 2217, 2217, 542: 2217, 544: 2217, 2217, 2217, 2217, 554: 2217, 2217, 2217, 559: 2217, 2217, 4028, 2217, 2217, 565: 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 585: 2217, 2217, 2217, 2217, 590: 2217, 593: 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 612: 2217, 622: 4025, 4023, 625: 4022, 4030, 4024, 4026, 4027, 4029, 1345: 4021, 1388: 4020}, + {9: 4082, 572: 3772, 3770, 3771, 3769, 3767, 806: 3768, 3766}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 4081}, + {536: 4053}, + {2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 537: 2226, 2226, 542: 2226, 544: 2226, 2226, 2226, 2226, 554: 2226, 2226, 2226, 559: 2226, 2226, 2226, 4036, 2226, 2226, 566: 2226, 568: 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 586: 2226, 2226, 2226, 2226, 2226, 593: 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 612: 2226, 622: 4033, 4031, 4030, 4038, 4032, 4034, 4035, 4037, 1343: 4029, 1387: 4028}, + {2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 537: 2197, 2197, 542: 2197, 544: 2197, 2197, 2197, 2197, 554: 2197, 2197, 2197, 559: 2197, 2197, 2197, 2197, 2197, 2197, 566: 2197, 568: 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 586: 2197, 2197, 2197, 2197, 2197, 593: 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 612: 2197, 622: 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197}, // 840 - {2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 537: 2188, 2188, 542: 2188, 544: 2188, 2188, 2188, 2188, 554: 2188, 2188, 2188, 559: 2188, 2188, 2188, 2188, 2188, 565: 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 585: 2188, 2188, 2188, 2188, 590: 2188, 593: 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 612: 2188, 622: 2188, 2188, 625: 2188, 2188, 2188, 2188, 2188, 2188}, - {2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 537: 2157, 2157, 3834, 541: 3833, 2157, 544: 2157, 2157, 2157, 2157, 3804, 3805, 3810, 554: 2157, 2157, 2157, 559: 2157, 2157, 2157, 2157, 2157, 565: 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 584: 3838, 2157, 2157, 2157, 2157, 3806, 2157, 593: 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 3837, 2157, 3807, 615: 3808, 3801, 3811, 3800, 3809, 3802, 3803, 2157, 2157, 625: 2157, 2157, 2157, 2157, 2157, 2157, 632: 3835, 637: 3839, 3847, 3848, 3846, 921: 3836, 1256: 3840, 1333: 3842, 1379: 3844, 1384: 3841, 1390: 3843, 1444: 3845}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 1434, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 3760}, - {1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 537: 1490, 1490, 1490, 541: 1490, 1490, 3714, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 554: 1490, 1490, 1490, 559: 1490, 1490, 1490, 1490, 1490, 565: 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 584: 1490, 1490, 1490, 1490, 1490, 1490, 1490, 593: 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 615: 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 625: 1490, 1490, 1490, 1490, 1490, 1490, 632: 1490, 637: 1490, 1490, 1490, 1490, 707: 3715}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 538: 3758, 591: 3757, 777: 3759, 3067, 3068, 3066, 811: 3756, 980: 3755}, + {2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 537: 2166, 2166, 3839, 541: 3838, 2166, 544: 2166, 2166, 2166, 2166, 3809, 3810, 3815, 554: 2166, 2166, 2166, 559: 2166, 2166, 2166, 2166, 2166, 2166, 3811, 2166, 568: 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 585: 3843, 2166, 2166, 2166, 2166, 2166, 593: 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 3842, 2166, 614: 3812, 3813, 3806, 3816, 3805, 3814, 3807, 3808, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 632: 3840, 637: 3844, 3852, 3853, 3851, 923: 3841, 1256: 3845, 1331: 3847, 1377: 3849, 1383: 3846, 1389: 3848, 1443: 3850}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 1443, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 3765}, + {1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 537: 1499, 1499, 1499, 541: 1499, 1499, 3719, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 554: 1499, 1499, 1499, 559: 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 568: 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 585: 1499, 1499, 1499, 1499, 1499, 1499, 593: 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 614: 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 632: 1499, 637: 1499, 1499, 1499, 1499, 707: 3720}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 538: 3763, 591: 3762, 777: 3764, 3072, 3073, 3071, 811: 3761, 981: 3760}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3708, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3642, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3721, 3623, 3705, 3622, 3619}, // 845 - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3703, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3637, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3716, 3618, 3700, 3617, 3614}, - {1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 537: 1472, 1472, 1472, 541: 1472, 1472, 3714, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 554: 1472, 1472, 1472, 559: 1472, 1472, 1472, 1472, 1472, 565: 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 584: 1472, 1472, 1472, 1472, 1472, 1472, 1472, 593: 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 615: 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 625: 1472, 1472, 1472, 1472, 1472, 1472, 632: 1472, 637: 1472, 1472, 1472, 1472, 661: 1472, 707: 1472}, - {2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103}, - {2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097}, - {2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085, 2085}, + {1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 537: 1481, 1481, 1481, 541: 1481, 1481, 3719, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 554: 1481, 1481, 1481, 559: 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 568: 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 585: 1481, 1481, 1481, 1481, 1481, 1481, 593: 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 614: 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 632: 1481, 637: 1481, 1481, 1481, 1481, 661: 1481, 707: 1481}, + {2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112}, + {2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106}, + {2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094}, + {2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081}, // 850 - {2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072}, - {2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061}, - {2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059}, - {2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036}, - {2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030}, + {2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070}, + {2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068}, + {2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045}, + {2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039}, + {2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029}, // 855 - {2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019}, - {1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998}, - {1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991}, + {2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008}, + {2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001}, + {2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000}, + {1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997}, {1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990}, - {1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987}, // 860 - {1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981}, - {1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979}, - {1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978}, - {1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975}, - {1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973}, + {1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988, 1988}, + {1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987, 1987}, + {1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984}, + {1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982}, + {1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969}, // 865 - {1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960}, - {1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937}, - {1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920}, - {1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919}, - {1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918}, + {1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946}, + {1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929}, + {1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928}, + {1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927}, + {1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923}, // 870 - {1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914}, - {1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913}, - {1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907}, - {1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795}, - {1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794}, + {1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922}, + {1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916}, + {1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804}, + {1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803}, + {1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802}, // 875 - {1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793}, - {1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792}, - {1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686}, - {1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667}, - {1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662}, + {1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801}, + {1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695}, + {1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676}, + {1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671}, + {1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657}, // 880 - {1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648}, - {1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635}, - {1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634}, - {1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614}, - {1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613}, + {1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644}, + {1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643}, + {1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623}, + {1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622}, + {1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 537: 1491, 1491, 1491, 541: 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 554: 1491, 1491, 1491, 559: 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 568: 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 585: 1491, 1491, 1491, 1491, 1491, 1491, 593: 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 614: 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 632: 1491, 637: 1491, 1491, 1491, 1491, 661: 1491, 707: 1491}, // 885 - {1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 537: 1482, 1482, 1482, 541: 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 554: 1482, 1482, 1482, 559: 1482, 1482, 1482, 1482, 1482, 565: 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 584: 1482, 1482, 1482, 1482, 1482, 1482, 1482, 593: 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 615: 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 625: 1482, 1482, 1482, 1482, 1482, 1482, 632: 1482, 637: 1482, 1482, 1482, 1482, 661: 1482, 707: 1482}, - {960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 565: 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 584: 960, 960, 960, 960, 960, 960, 960, 593: 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 625: 960, 960, 960, 960, 960, 960, 632: 960, 637: 960, 960, 960, 960, 661: 960, 701: 960, 706: 960, 960, 960, 960, 960, 960, 960, 960, 960, 960}, - {959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 565: 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 584: 959, 959, 959, 959, 959, 959, 959, 593: 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 625: 959, 959, 959, 959, 959, 959, 632: 959, 637: 959, 959, 959, 959, 661: 959, 701: 959, 706: 959, 959, 959, 959, 959, 959, 959, 959, 959, 959}, - {435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 565: 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 584: 435, 435, 435, 435, 435, 435, 435, 435, 593: 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 625: 435, 435, 435, 435, 435, 435, 632: 435, 435, 637: 435, 435, 435, 435, 661: 435, 701: 435, 706: 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 717: 435, 435, 722: 435, 726: 435, 435, 435, 730: 435, 435}, - {434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 565: 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 584: 434, 434, 434, 434, 434, 434, 434, 434, 593: 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 625: 434, 434, 434, 434, 434, 434, 632: 434, 434, 637: 434, 434, 434, 434, 661: 434, 701: 434, 706: 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 717: 434, 434, 722: 434, 726: 434, 434, 434, 730: 434, 434}, + {968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 568: 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 585: 968, 968, 968, 968, 968, 968, 593: 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 632: 968, 637: 968, 968, 968, 968, 660: 968, 968, 706: 968, 968, 968, 968, 968, 968, 968, 968, 968, 968}, + {967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 568: 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 585: 967, 967, 967, 967, 967, 967, 593: 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 632: 967, 637: 967, 967, 967, 967, 660: 967, 967, 706: 967, 967, 967, 967, 967, 967, 967, 967, 967, 967}, + {442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 568: 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 585: 442, 442, 442, 442, 442, 442, 442, 593: 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 632: 442, 442, 637: 442, 442, 442, 442, 660: 442, 442, 706: 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 717: 442, 442, 722: 442, 726: 442, 442, 442, 730: 442, 442}, + {441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 568: 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 585: 441, 441, 441, 441, 441, 441, 441, 593: 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 632: 441, 441, 637: 441, 441, 441, 441, 660: 441, 441, 706: 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 717: 441, 441, 722: 441, 726: 441, 441, 441, 730: 441, 441}, + {118: 3794, 127: 3802, 134: 3790, 138: 3787, 140: 3789, 3786, 3788, 3792, 3793, 3798, 3797, 3796, 3800, 3801, 3795, 3799, 3791, 572: 3772, 3770, 3771, 3769, 3767, 599: 3784, 3781, 3783, 3782, 3778, 3780, 3779, 3776, 3777, 3775, 3785, 806: 3768, 3766, 892: 3774, 907: 3773}, // 890 - {118: 3789, 127: 3797, 133: 3785, 137: 3782, 3784, 3781, 3783, 3787, 3788, 3793, 3792, 3791, 3795, 3796, 3790, 3794, 3786, 571: 3767, 3765, 3766, 3764, 3762, 599: 3779, 3776, 3778, 3777, 3773, 3775, 3774, 3771, 3772, 3770, 3780, 806: 3763, 3761, 892: 3769, 907: 3768}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 3832}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 3831}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 3830}, - {2: 2207, 2207, 2207, 2207, 2207, 2207, 2207, 10: 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 58: 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 536: 2207, 538: 2207, 2207, 2207, 2207, 545: 2207, 2207, 548: 2207, 2207, 2207, 552: 2207, 2207, 557: 2207, 2207, 564: 2207, 583: 2207, 591: 2207, 2207, 624: 2207, 631: 2207, 633: 2207, 2207, 2207, 2207, 641: 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 662: 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 702: 2207, 2207, 2207, 2207, 716: 2207}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 3837}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 3836}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 3835}, + {2: 2216, 2216, 2216, 2216, 2216, 2216, 2216, 10: 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 58: 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 536: 2216, 538: 2216, 2216, 2216, 2216, 545: 2216, 2216, 548: 2216, 2216, 2216, 552: 2216, 2216, 557: 2216, 2216, 567: 2216, 584: 2216, 591: 2216, 2216, 630: 2216, 2216, 633: 2216, 2216, 2216, 2216, 641: 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 662: 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 716: 2216}, + {2: 2215, 2215, 2215, 2215, 2215, 2215, 2215, 10: 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 58: 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 536: 2215, 538: 2215, 2215, 2215, 2215, 545: 2215, 2215, 548: 2215, 2215, 2215, 552: 2215, 2215, 557: 2215, 2215, 567: 2215, 584: 2215, 591: 2215, 2215, 630: 2215, 2215, 633: 2215, 2215, 2215, 2215, 641: 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 662: 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 716: 2215}, // 895 - {2: 2206, 2206, 2206, 2206, 2206, 2206, 2206, 10: 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 58: 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 536: 2206, 538: 2206, 2206, 2206, 2206, 545: 2206, 2206, 548: 2206, 2206, 2206, 552: 2206, 2206, 557: 2206, 2206, 564: 2206, 583: 2206, 591: 2206, 2206, 624: 2206, 631: 2206, 633: 2206, 2206, 2206, 2206, 641: 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 662: 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 702: 2206, 2206, 2206, 2206, 716: 2206}, - {2: 2205, 2205, 2205, 2205, 2205, 2205, 2205, 10: 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 58: 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 536: 2205, 538: 2205, 2205, 2205, 2205, 545: 2205, 2205, 548: 2205, 2205, 2205, 552: 2205, 2205, 557: 2205, 2205, 564: 2205, 583: 2205, 591: 2205, 2205, 624: 2205, 631: 2205, 633: 2205, 2205, 2205, 2205, 641: 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 662: 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 702: 2205, 2205, 2205, 2205, 716: 2205}, - {2: 2204, 2204, 2204, 2204, 2204, 2204, 2204, 10: 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 58: 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 536: 2204, 538: 2204, 2204, 2204, 2204, 545: 2204, 2204, 548: 2204, 2204, 2204, 552: 2204, 2204, 557: 2204, 2204, 564: 2204, 583: 2204, 591: 2204, 2204, 624: 2204, 631: 2204, 633: 2204, 2204, 2204, 2204, 641: 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 662: 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 702: 2204, 2204, 2204, 2204, 716: 2204}, - {548: 3798}, - {1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 554: 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 565: 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 584: 1315, 1315, 1315, 1315, 1315, 1315, 1315, 593: 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 625: 1315, 1315, 1315, 1315, 1315, 1315, 632: 1315, 637: 1315, 1315, 1315, 1315, 701: 1315, 714: 1315, 1315}, + {2: 2214, 2214, 2214, 2214, 2214, 2214, 2214, 10: 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 58: 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 536: 2214, 538: 2214, 2214, 2214, 2214, 545: 2214, 2214, 548: 2214, 2214, 2214, 552: 2214, 2214, 557: 2214, 2214, 567: 2214, 584: 2214, 591: 2214, 2214, 630: 2214, 2214, 633: 2214, 2214, 2214, 2214, 641: 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 662: 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 716: 2214}, + {2: 2213, 2213, 2213, 2213, 2213, 2213, 2213, 10: 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 58: 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 536: 2213, 538: 2213, 2213, 2213, 2213, 545: 2213, 2213, 548: 2213, 2213, 2213, 552: 2213, 2213, 557: 2213, 2213, 567: 2213, 584: 2213, 591: 2213, 2213, 630: 2213, 2213, 633: 2213, 2213, 2213, 2213, 641: 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 662: 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 716: 2213}, + {548: 3803}, + {1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 554: 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 568: 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 585: 1324, 1324, 1324, 1324, 1324, 1324, 593: 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 632: 1324, 637: 1324, 1324, 1324, 1324, 660: 1324, 714: 1324, 1324}, + {1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 554: 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 568: 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 585: 1323, 1323, 1323, 1323, 1323, 1323, 593: 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 632: 1323, 637: 1323, 1323, 1323, 1323, 660: 1323, 714: 1323, 1323}, // 900 - {1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 554: 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 565: 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 584: 1314, 1314, 1314, 1314, 1314, 1314, 1314, 593: 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 625: 1314, 1314, 1314, 1314, 1314, 1314, 632: 1314, 637: 1314, 1314, 1314, 1314, 701: 1314, 714: 1314, 1314}, - {1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 554: 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 565: 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 584: 1313, 1313, 1313, 1313, 1313, 1313, 1313, 593: 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 625: 1313, 1313, 1313, 1313, 1313, 1313, 632: 1313, 637: 1313, 1313, 1313, 1313, 701: 1313, 714: 1313, 1313}, - {1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 554: 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 565: 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 584: 1312, 1312, 1312, 1312, 1312, 1312, 1312, 593: 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 625: 1312, 1312, 1312, 1312, 1312, 1312, 632: 1312, 637: 1312, 1312, 1312, 1312, 701: 1312, 714: 1312, 1312}, - {1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 554: 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 565: 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 584: 1311, 1311, 1311, 1311, 1311, 1311, 1311, 593: 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 625: 1311, 1311, 1311, 1311, 1311, 1311, 632: 1311, 637: 1311, 1311, 1311, 1311, 701: 1311, 714: 1311, 1311}, - {1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 554: 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 565: 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 584: 1310, 1310, 1310, 1310, 1310, 1310, 1310, 593: 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 625: 1310, 1310, 1310, 1310, 1310, 1310, 632: 1310, 637: 1310, 1310, 1310, 1310, 701: 1310, 714: 1310, 1310}, + {1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 554: 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 568: 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 585: 1322, 1322, 1322, 1322, 1322, 1322, 593: 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 632: 1322, 637: 1322, 1322, 1322, 1322, 660: 1322, 714: 1322, 1322}, + {1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 554: 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 568: 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 585: 1321, 1321, 1321, 1321, 1321, 1321, 593: 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 632: 1321, 637: 1321, 1321, 1321, 1321, 660: 1321, 714: 1321, 1321}, + {1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 554: 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 568: 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 585: 1320, 1320, 1320, 1320, 1320, 1320, 593: 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 632: 1320, 637: 1320, 1320, 1320, 1320, 660: 1320, 714: 1320, 1320}, + {1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 554: 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 568: 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 585: 1319, 1319, 1319, 1319, 1319, 1319, 593: 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 632: 1319, 637: 1319, 1319, 1319, 1319, 660: 1319, 714: 1319, 1319}, + {1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 554: 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 568: 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 585: 1318, 1318, 1318, 1318, 1318, 1318, 593: 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 632: 1318, 637: 1318, 1318, 1318, 1318, 660: 1318, 714: 1318, 1318}, // 905 - {1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 554: 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 565: 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 584: 1309, 1309, 1309, 1309, 1309, 1309, 1309, 593: 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 625: 1309, 1309, 1309, 1309, 1309, 1309, 632: 1309, 637: 1309, 1309, 1309, 1309, 701: 1309, 714: 1309, 1309}, - {1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 554: 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 565: 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 584: 1308, 1308, 1308, 1308, 1308, 1308, 1308, 593: 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 625: 1308, 1308, 1308, 1308, 1308, 1308, 632: 1308, 637: 1308, 1308, 1308, 1308, 701: 1308, 714: 1308, 1308}, - {1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 554: 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 565: 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 584: 1307, 1307, 1307, 1307, 1307, 1307, 1307, 593: 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 625: 1307, 1307, 1307, 1307, 1307, 1307, 632: 1307, 637: 1307, 1307, 1307, 1307, 701: 1307, 714: 1307, 1307}, - {1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 554: 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 565: 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 584: 1306, 1306, 1306, 1306, 1306, 1306, 1306, 593: 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 625: 1306, 1306, 1306, 1306, 1306, 1306, 632: 1306, 637: 1306, 1306, 1306, 1306, 701: 1306, 714: 1306, 1306}, - {1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 554: 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 565: 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 584: 1305, 1305, 1305, 1305, 1305, 1305, 1305, 593: 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 625: 1305, 1305, 1305, 1305, 1305, 1305, 632: 1305, 637: 1305, 1305, 1305, 1305, 701: 1305, 714: 1305, 1305}, + {1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 554: 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 568: 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 585: 1317, 1317, 1317, 1317, 1317, 1317, 593: 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 632: 1317, 637: 1317, 1317, 1317, 1317, 660: 1317, 714: 1317, 1317}, + {1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 554: 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 568: 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 585: 1316, 1316, 1316, 1316, 1316, 1316, 593: 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 632: 1316, 637: 1316, 1316, 1316, 1316, 660: 1316, 714: 1316, 1316}, + {1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 554: 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 568: 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 585: 1315, 1315, 1315, 1315, 1315, 1315, 593: 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 632: 1315, 637: 1315, 1315, 1315, 1315, 660: 1315, 714: 1315, 1315}, + {1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 554: 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 568: 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 585: 1314, 1314, 1314, 1314, 1314, 1314, 593: 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 632: 1314, 637: 1314, 1314, 1314, 1314, 660: 1314, 714: 1314, 1314}, + {1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 554: 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 568: 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 585: 1313, 1313, 1313, 1313, 1313, 1313, 593: 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 632: 1313, 637: 1313, 1313, 1313, 1313, 660: 1313, 714: 1313, 1313}, // 910 - {1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 554: 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 565: 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 584: 1304, 1304, 1304, 1304, 1304, 1304, 1304, 593: 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 625: 1304, 1304, 1304, 1304, 1304, 1304, 632: 1304, 637: 1304, 1304, 1304, 1304, 701: 1304, 714: 1304, 1304}, - {1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 554: 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 565: 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 584: 1303, 1303, 1303, 1303, 1303, 1303, 1303, 593: 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 625: 1303, 1303, 1303, 1303, 1303, 1303, 632: 1303, 637: 1303, 1303, 1303, 1303, 701: 1303, 714: 1303, 1303}, - {1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 554: 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 565: 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 584: 1302, 1302, 1302, 1302, 1302, 1302, 1302, 593: 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 625: 1302, 1302, 1302, 1302, 1302, 1302, 632: 1302, 637: 1302, 1302, 1302, 1302, 701: 1302, 714: 1302, 1302}, - {1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 554: 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 565: 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 584: 1301, 1301, 1301, 1301, 1301, 1301, 1301, 593: 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 625: 1301, 1301, 1301, 1301, 1301, 1301, 632: 1301, 637: 1301, 1301, 1301, 1301, 701: 1301, 714: 1301, 1301}, - {1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 554: 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 565: 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 584: 1300, 1300, 1300, 1300, 1300, 1300, 1300, 593: 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 625: 1300, 1300, 1300, 1300, 1300, 1300, 632: 1300, 637: 1300, 1300, 1300, 1300, 701: 1300, 714: 1300, 1300}, + {1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 554: 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 568: 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 585: 1312, 1312, 1312, 1312, 1312, 1312, 593: 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 632: 1312, 637: 1312, 1312, 1312, 1312, 660: 1312, 714: 1312, 1312}, + {1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 554: 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 568: 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 585: 1311, 1311, 1311, 1311, 1311, 1311, 593: 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 632: 1311, 637: 1311, 1311, 1311, 1311, 660: 1311, 714: 1311, 1311}, + {1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 554: 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 568: 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 585: 1310, 1310, 1310, 1310, 1310, 1310, 593: 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 632: 1310, 637: 1310, 1310, 1310, 1310, 660: 1310, 714: 1310, 1310}, + {1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 554: 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 568: 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 585: 1309, 1309, 1309, 1309, 1309, 1309, 593: 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 632: 1309, 637: 1309, 1309, 1309, 1309, 660: 1309, 714: 1309, 1309}, + {1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 554: 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 568: 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 585: 1308, 1308, 1308, 1308, 1308, 1308, 593: 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 632: 1308, 637: 1308, 1308, 1308, 1308, 660: 1308, 714: 1308, 1308}, // 915 - {1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 554: 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 565: 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 584: 1299, 1299, 1299, 1299, 1299, 1299, 1299, 593: 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 625: 1299, 1299, 1299, 1299, 1299, 1299, 632: 1299, 637: 1299, 1299, 1299, 1299, 701: 1299, 714: 1299, 1299}, - {1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 554: 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 565: 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 584: 1298, 1298, 1298, 1298, 1298, 1298, 1298, 593: 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 625: 1298, 1298, 1298, 1298, 1298, 1298, 632: 1298, 637: 1298, 1298, 1298, 1298, 701: 1298, 714: 1298, 1298}, - {1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 554: 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 565: 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 584: 1297, 1297, 1297, 1297, 1297, 1297, 1297, 593: 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 625: 1297, 1297, 1297, 1297, 1297, 1297, 632: 1297, 637: 1297, 1297, 1297, 1297, 701: 1297, 714: 1297, 1297}, - {1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 554: 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 565: 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 584: 1296, 1296, 1296, 1296, 1296, 1296, 1296, 593: 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 625: 1296, 1296, 1296, 1296, 1296, 1296, 632: 1296, 637: 1296, 1296, 1296, 1296, 701: 1296, 714: 1296, 1296}, - {1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 554: 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 565: 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 584: 1295, 1295, 1295, 1295, 1295, 1295, 1295, 593: 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 625: 1295, 1295, 1295, 1295, 1295, 1295, 632: 1295, 637: 1295, 1295, 1295, 1295, 701: 1295, 714: 1295, 1295}, + {1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 554: 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 568: 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 585: 1307, 1307, 1307, 1307, 1307, 1307, 593: 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 632: 1307, 637: 1307, 1307, 1307, 1307, 660: 1307, 714: 1307, 1307}, + {1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 554: 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 568: 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 585: 1306, 1306, 1306, 1306, 1306, 1306, 593: 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 632: 1306, 637: 1306, 1306, 1306, 1306, 660: 1306, 714: 1306, 1306}, + {1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 554: 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 568: 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 585: 1305, 1305, 1305, 1305, 1305, 1305, 593: 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 632: 1305, 637: 1305, 1305, 1305, 1305, 660: 1305, 714: 1305, 1305}, + {1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 554: 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 568: 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 585: 1304, 1304, 1304, 1304, 1304, 1304, 593: 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 632: 1304, 637: 1304, 1304, 1304, 1304, 660: 1304, 714: 1304, 1304}, + {1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 554: 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 568: 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 585: 1303, 1303, 1303, 1303, 1303, 1303, 593: 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 632: 1303, 637: 1303, 1303, 1303, 1303, 660: 1303, 714: 1303, 1303}, // 920 - {1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 554: 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 565: 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 584: 1294, 1294, 1294, 1294, 1294, 1294, 1294, 593: 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 625: 1294, 1294, 1294, 1294, 1294, 1294, 632: 1294, 637: 1294, 1294, 1294, 1294, 701: 1294, 714: 1294, 1294}, - {1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 554: 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 565: 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 584: 1293, 1293, 1293, 1293, 1293, 1293, 1293, 593: 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 625: 1293, 1293, 1293, 1293, 1293, 1293, 632: 1293, 637: 1293, 1293, 1293, 1293, 701: 1293, 714: 1293, 1293}, - {1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 554: 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 565: 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 584: 1292, 1292, 1292, 1292, 1292, 1292, 1292, 593: 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 625: 1292, 1292, 1292, 1292, 1292, 1292, 632: 1292, 637: 1292, 1292, 1292, 1292, 701: 1292, 714: 1292, 1292}, - {1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 554: 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 565: 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 584: 1291, 1291, 1291, 1291, 1291, 1291, 1291, 593: 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 625: 1291, 1291, 1291, 1291, 1291, 1291, 632: 1291, 637: 1291, 1291, 1291, 1291, 701: 1291, 714: 1291, 1291}, - {1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 554: 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 565: 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 584: 1290, 1290, 1290, 1290, 1290, 1290, 1290, 593: 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 625: 1290, 1290, 1290, 1290, 1290, 1290, 632: 1290, 637: 1290, 1290, 1290, 1290, 701: 1290, 714: 1290, 1290}, + {1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 554: 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 568: 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 585: 1302, 1302, 1302, 1302, 1302, 1302, 593: 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 632: 1302, 637: 1302, 1302, 1302, 1302, 660: 1302, 714: 1302, 1302}, + {1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 554: 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 568: 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 585: 1301, 1301, 1301, 1301, 1301, 1301, 593: 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 632: 1301, 637: 1301, 1301, 1301, 1301, 660: 1301, 714: 1301, 1301}, + {1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 554: 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 568: 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 585: 1300, 1300, 1300, 1300, 1300, 1300, 593: 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 632: 1300, 637: 1300, 1300, 1300, 1300, 660: 1300, 714: 1300, 1300}, + {1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 554: 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 568: 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 585: 1299, 1299, 1299, 1299, 1299, 1299, 593: 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 632: 1299, 637: 1299, 1299, 1299, 1299, 660: 1299, 714: 1299, 1299}, + {1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 554: 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 568: 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 585: 1298, 1298, 1298, 1298, 1298, 1298, 593: 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 632: 1298, 637: 1298, 1298, 1298, 1298, 660: 1298, 714: 1298, 1298}, // 925 - {1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 554: 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 565: 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 584: 1289, 1289, 1289, 1289, 1289, 1289, 1289, 593: 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 625: 1289, 1289, 1289, 1289, 1289, 1289, 632: 1289, 637: 1289, 1289, 1289, 1289, 701: 1289, 714: 1289, 1289}, - {1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 554: 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 565: 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 584: 1288, 1288, 1288, 1288, 1288, 1288, 1288, 593: 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 625: 1288, 1288, 1288, 1288, 1288, 1288, 632: 1288, 637: 1288, 1288, 1288, 1288, 701: 1288, 714: 1288, 1288}, - {1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 554: 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 565: 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 584: 1287, 1287, 1287, 1287, 1287, 1287, 1287, 593: 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 625: 1287, 1287, 1287, 1287, 1287, 1287, 632: 1287, 637: 1287, 1287, 1287, 1287, 701: 1287, 714: 1287, 1287}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3703, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3799}, - {1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 537: 1497, 1497, 1497, 541: 1497, 1497, 544: 1497, 1497, 1497, 1497, 1497, 1497, 3810, 554: 1497, 1497, 1497, 559: 1497, 1497, 1497, 1497, 1497, 565: 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 584: 1497, 1497, 1497, 1497, 1497, 3806, 1497, 593: 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 3807, 615: 3808, 1497, 3811, 1497, 3809, 1497, 1497, 1497, 1497, 625: 1497, 1497, 1497, 1497, 1497, 1497, 632: 1497, 637: 1497, 1497, 1497, 1497}, + {1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 554: 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 568: 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 585: 1297, 1297, 1297, 1297, 1297, 1297, 593: 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 632: 1297, 637: 1297, 1297, 1297, 1297, 660: 1297, 714: 1297, 1297}, + {1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 554: 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 568: 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 585: 1296, 1296, 1296, 1296, 1296, 1296, 593: 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 632: 1296, 637: 1296, 1296, 1296, 1296, 660: 1296, 714: 1296, 1296}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3708, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3804}, + {1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 537: 1506, 1506, 1506, 541: 1506, 1506, 544: 1506, 1506, 1506, 1506, 1506, 1506, 3815, 554: 1506, 1506, 1506, 559: 1506, 1506, 1506, 1506, 1506, 1506, 3811, 1506, 568: 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 585: 1506, 1506, 1506, 1506, 1506, 1506, 593: 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 614: 3812, 3813, 1506, 3816, 1506, 3814, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 632: 1506, 637: 1506, 1506, 1506, 1506}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3708, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3834}, // 930 - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3703, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3829}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3703, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3828}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3703, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3827}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3703, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3826}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3703, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3823, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3822}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3708, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3833}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3708, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3832}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3708, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3831}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3708, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3828, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3827}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3708, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3824, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3823}, // 935 - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3703, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3819, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3818}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3703, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3817}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3703, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3816}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3703, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3815}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3703, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3814}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3708, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3822}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3708, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3821}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3708, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3820}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3708, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3819}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3708, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3818}, // 940 - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3703, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3813}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3703, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3812}, - {1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 537: 1491, 1491, 1491, 541: 1491, 1491, 544: 1491, 1491, 1491, 1491, 1491, 1491, 1491, 554: 1491, 1491, 1491, 559: 1491, 1491, 1491, 1491, 1491, 565: 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 584: 1491, 1491, 1491, 1491, 1491, 1491, 1491, 593: 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 615: 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 625: 1491, 1491, 1491, 1491, 1491, 1491, 632: 1491, 637: 1491, 1491, 1491, 1491}, - {1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 537: 1492, 1492, 1492, 541: 1492, 1492, 544: 1492, 1492, 1492, 1492, 1492, 1492, 1492, 554: 1492, 1492, 1492, 559: 1492, 1492, 1492, 1492, 1492, 565: 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 584: 1492, 1492, 1492, 1492, 1492, 1492, 1492, 593: 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 615: 1492, 1492, 3811, 1492, 1492, 1492, 1492, 1492, 1492, 625: 1492, 1492, 1492, 1492, 1492, 1492, 632: 1492, 637: 1492, 1492, 1492, 1492}, - {1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 537: 1493, 1493, 1493, 541: 1493, 1493, 544: 1493, 1493, 1493, 1493, 1493, 1493, 1493, 554: 1493, 1493, 1493, 559: 1493, 1493, 1493, 1493, 1493, 565: 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 584: 1493, 1493, 1493, 1493, 1493, 1493, 1493, 593: 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 615: 1493, 1493, 3811, 1493, 1493, 1493, 1493, 1493, 1493, 625: 1493, 1493, 1493, 1493, 1493, 1493, 632: 1493, 637: 1493, 1493, 1493, 1493}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3708, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3817}, + {1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 537: 1500, 1500, 1500, 541: 1500, 1500, 544: 1500, 1500, 1500, 1500, 1500, 1500, 1500, 554: 1500, 1500, 1500, 559: 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 568: 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 585: 1500, 1500, 1500, 1500, 1500, 1500, 593: 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 614: 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 632: 1500, 637: 1500, 1500, 1500, 1500}, + {1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 537: 1501, 1501, 1501, 541: 1501, 1501, 544: 1501, 1501, 1501, 1501, 1501, 1501, 1501, 554: 1501, 1501, 1501, 559: 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 568: 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 585: 1501, 1501, 1501, 1501, 1501, 1501, 593: 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 614: 1501, 1501, 1501, 3816, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 632: 1501, 637: 1501, 1501, 1501, 1501}, + {1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 537: 1502, 1502, 1502, 541: 1502, 1502, 544: 1502, 1502, 1502, 1502, 1502, 1502, 1502, 554: 1502, 1502, 1502, 559: 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 568: 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 585: 1502, 1502, 1502, 1502, 1502, 1502, 593: 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 614: 1502, 1502, 1502, 3816, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 632: 1502, 637: 1502, 1502, 1502, 1502}, + {1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 537: 1503, 1503, 1503, 541: 1503, 1503, 544: 1503, 1503, 1503, 1503, 1503, 1503, 1503, 554: 1503, 1503, 1503, 559: 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 568: 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 585: 1503, 1503, 1503, 1503, 1503, 1503, 593: 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 614: 1503, 1503, 1503, 3816, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 632: 1503, 637: 1503, 1503, 1503, 1503}, // 945 - {1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 537: 1494, 1494, 1494, 541: 1494, 1494, 544: 1494, 1494, 1494, 1494, 1494, 1494, 1494, 554: 1494, 1494, 1494, 559: 1494, 1494, 1494, 1494, 1494, 565: 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 584: 1494, 1494, 1494, 1494, 1494, 1494, 1494, 593: 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 615: 1494, 1494, 3811, 1494, 1494, 1494, 1494, 1494, 1494, 625: 1494, 1494, 1494, 1494, 1494, 1494, 632: 1494, 637: 1494, 1494, 1494, 1494}, - {1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 537: 1495, 1495, 1495, 541: 1495, 1495, 544: 1495, 1495, 1495, 1495, 1495, 1495, 1495, 554: 1495, 1495, 1495, 559: 1495, 1495, 1495, 1495, 1495, 565: 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 584: 1495, 1495, 1495, 1495, 1495, 1495, 1495, 593: 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 615: 1495, 1495, 3811, 1495, 1495, 1495, 1495, 1495, 1495, 625: 1495, 1495, 1495, 1495, 1495, 1495, 632: 1495, 637: 1495, 1495, 1495, 1495}, - {1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 537: 1496, 1496, 1496, 541: 1496, 1496, 544: 1496, 1496, 1496, 1496, 1496, 1496, 1496, 554: 1496, 1496, 1496, 559: 1496, 1496, 1496, 1496, 1496, 565: 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 584: 1496, 1496, 1496, 1496, 1496, 1496, 1496, 593: 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 615: 1496, 1496, 3811, 1496, 1496, 1496, 1496, 1496, 1496, 625: 1496, 1496, 1496, 1496, 1496, 1496, 632: 1496, 637: 1496, 1496, 1496, 1496}, - {1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 537: 1500, 1500, 1500, 541: 1500, 1500, 544: 1500, 1500, 1500, 1500, 1500, 1500, 3810, 554: 1500, 1500, 1500, 559: 1500, 1500, 1500, 1500, 1500, 565: 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 584: 1500, 1500, 1500, 1500, 1500, 3806, 1500, 593: 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 3807, 615: 3808, 1500, 3811, 1500, 3809, 1500, 1500, 1500, 1500, 625: 1500, 1500, 1500, 1500, 1500, 1500, 632: 1500, 637: 1500, 1500, 1500, 1500}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 1434, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 3820}, + {1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 537: 1504, 1504, 1504, 541: 1504, 1504, 544: 1504, 1504, 1504, 1504, 1504, 1504, 1504, 554: 1504, 1504, 1504, 559: 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 568: 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 585: 1504, 1504, 1504, 1504, 1504, 1504, 593: 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 614: 1504, 1504, 1504, 3816, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 632: 1504, 637: 1504, 1504, 1504, 1504}, + {1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 537: 1505, 1505, 1505, 541: 1505, 1505, 544: 1505, 1505, 1505, 1505, 1505, 1505, 1505, 554: 1505, 1505, 1505, 559: 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 568: 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 585: 1505, 1505, 1505, 1505, 1505, 1505, 593: 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 614: 1505, 1505, 1505, 3816, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 632: 1505, 637: 1505, 1505, 1505, 1505}, + {1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 537: 1509, 1509, 1509, 541: 1509, 1509, 544: 1509, 1509, 1509, 1509, 1509, 1509, 3815, 554: 1509, 1509, 1509, 559: 1509, 1509, 1509, 1509, 1509, 1509, 3811, 1509, 568: 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 585: 1509, 1509, 1509, 1509, 1509, 1509, 593: 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 614: 3812, 3813, 1509, 3816, 1509, 3814, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 632: 1509, 637: 1509, 1509, 1509, 1509}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 1443, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 3825}, + {118: 3794, 127: 3802, 134: 3790, 138: 3787, 140: 3789, 3786, 3788, 3792, 3793, 3798, 3797, 3796, 3800, 3801, 3795, 3799, 3791, 572: 3772, 3770, 3771, 3769, 3767, 599: 3784, 3781, 3783, 3782, 3778, 3780, 3779, 3776, 3777, 3775, 3785, 806: 3768, 3766, 892: 3774, 907: 3826}, // 950 - {118: 3789, 127: 3797, 133: 3785, 137: 3782, 3784, 3781, 3783, 3787, 3788, 3793, 3792, 3791, 3795, 3796, 3790, 3794, 3786, 571: 3767, 3765, 3766, 3764, 3762, 599: 3779, 3776, 3778, 3777, 3773, 3775, 3774, 3771, 3772, 3770, 3780, 806: 3763, 3761, 892: 3769, 907: 3821}, - {1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 537: 1498, 1498, 1498, 541: 1498, 1498, 544: 1498, 1498, 1498, 1498, 1498, 1498, 1498, 554: 1498, 1498, 1498, 559: 1498, 1498, 1498, 1498, 1498, 565: 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 584: 1498, 1498, 1498, 1498, 1498, 1498, 1498, 593: 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 615: 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 625: 1498, 1498, 1498, 1498, 1498, 1498, 632: 1498, 637: 1498, 1498, 1498, 1498}, - {1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 537: 1501, 1501, 1501, 541: 1501, 1501, 544: 1501, 1501, 1501, 1501, 1501, 1501, 3810, 554: 1501, 1501, 1501, 559: 1501, 1501, 1501, 1501, 1501, 565: 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 584: 1501, 1501, 1501, 1501, 1501, 3806, 1501, 593: 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 3807, 615: 3808, 1501, 3811, 1501, 3809, 1501, 1501, 1501, 1501, 625: 1501, 1501, 1501, 1501, 1501, 1501, 632: 1501, 637: 1501, 1501, 1501, 1501}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 1434, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 3824}, - {118: 3789, 127: 3797, 133: 3785, 137: 3782, 3784, 3781, 3783, 3787, 3788, 3793, 3792, 3791, 3795, 3796, 3790, 3794, 3786, 571: 3767, 3765, 3766, 3764, 3762, 599: 3779, 3776, 3778, 3777, 3773, 3775, 3774, 3771, 3772, 3770, 3780, 806: 3763, 3761, 892: 3769, 907: 3825}, + {1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 537: 1507, 1507, 1507, 541: 1507, 1507, 544: 1507, 1507, 1507, 1507, 1507, 1507, 1507, 554: 1507, 1507, 1507, 559: 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 568: 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 585: 1507, 1507, 1507, 1507, 1507, 1507, 593: 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 614: 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 632: 1507, 637: 1507, 1507, 1507, 1507}, + {1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 537: 1510, 1510, 1510, 541: 1510, 1510, 544: 1510, 1510, 1510, 1510, 1510, 1510, 3815, 554: 1510, 1510, 1510, 559: 1510, 1510, 1510, 1510, 1510, 1510, 3811, 1510, 568: 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 585: 1510, 1510, 1510, 1510, 1510, 1510, 593: 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 614: 3812, 3813, 1510, 3816, 1510, 3814, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 632: 1510, 637: 1510, 1510, 1510, 1510}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 1443, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 3829}, + {118: 3794, 127: 3802, 134: 3790, 138: 3787, 140: 3789, 3786, 3788, 3792, 3793, 3798, 3797, 3796, 3800, 3801, 3795, 3799, 3791, 572: 3772, 3770, 3771, 3769, 3767, 599: 3784, 3781, 3783, 3782, 3778, 3780, 3779, 3776, 3777, 3775, 3785, 806: 3768, 3766, 892: 3774, 907: 3830}, + {1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 537: 1508, 1508, 1508, 541: 1508, 1508, 544: 1508, 1508, 1508, 1508, 1508, 1508, 1508, 554: 1508, 1508, 1508, 559: 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 568: 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 585: 1508, 1508, 1508, 1508, 1508, 1508, 593: 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 614: 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 632: 1508, 637: 1508, 1508, 1508, 1508}, // 955 - {1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 537: 1499, 1499, 1499, 541: 1499, 1499, 544: 1499, 1499, 1499, 1499, 1499, 1499, 1499, 554: 1499, 1499, 1499, 559: 1499, 1499, 1499, 1499, 1499, 565: 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 584: 1499, 1499, 1499, 1499, 1499, 1499, 1499, 593: 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 615: 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 625: 1499, 1499, 1499, 1499, 1499, 1499, 632: 1499, 637: 1499, 1499, 1499, 1499}, - {1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 537: 1502, 1502, 1502, 541: 1502, 1502, 544: 1502, 1502, 1502, 1502, 3804, 3805, 3810, 554: 1502, 1502, 1502, 559: 1502, 1502, 1502, 1502, 1502, 565: 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 584: 1502, 1502, 1502, 1502, 1502, 3806, 1502, 593: 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 3807, 615: 3808, 1502, 3811, 1502, 3809, 1502, 1502, 1502, 1502, 625: 1502, 1502, 1502, 1502, 1502, 1502, 632: 1502, 637: 1502, 1502, 1502, 1502}, - {1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 537: 1503, 1503, 1503, 541: 1503, 1503, 544: 1503, 1503, 1503, 1503, 3804, 3805, 3810, 554: 1503, 1503, 1503, 559: 1503, 1503, 1503, 1503, 1503, 565: 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 584: 1503, 1503, 1503, 1503, 1503, 3806, 1503, 593: 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 3807, 615: 3808, 1503, 3811, 1503, 3809, 1503, 1503, 1503, 1503, 625: 1503, 1503, 1503, 1503, 1503, 1503, 632: 1503, 637: 1503, 1503, 1503, 1503}, - {1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 537: 1504, 1504, 1504, 541: 1504, 1504, 544: 1504, 1504, 1504, 1504, 3804, 3805, 3810, 554: 1504, 1504, 1504, 559: 1504, 1504, 1504, 1504, 1504, 565: 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 584: 1504, 1504, 1504, 1504, 1504, 3806, 1504, 593: 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 3807, 615: 3808, 1504, 3811, 1504, 3809, 3802, 3803, 1504, 1504, 625: 1504, 1504, 1504, 1504, 1504, 1504, 632: 1504, 637: 1504, 1504, 1504, 1504}, - {1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 537: 1505, 1505, 1505, 541: 1505, 1505, 544: 1505, 1505, 1505, 1505, 3804, 3805, 3810, 554: 1505, 1505, 1505, 559: 1505, 1505, 1505, 1505, 1505, 565: 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 584: 1505, 1505, 1505, 1505, 1505, 3806, 1505, 593: 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 3807, 615: 3808, 3801, 3811, 1505, 3809, 3802, 3803, 1505, 1505, 625: 1505, 1505, 1505, 1505, 1505, 1505, 632: 1505, 637: 1505, 1505, 1505, 1505}, + {1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 537: 1511, 1511, 1511, 541: 1511, 1511, 544: 1511, 1511, 1511, 1511, 3809, 3810, 3815, 554: 1511, 1511, 1511, 559: 1511, 1511, 1511, 1511, 1511, 1511, 3811, 1511, 568: 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 585: 1511, 1511, 1511, 1511, 1511, 1511, 593: 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 614: 3812, 3813, 1511, 3816, 1511, 3814, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 632: 1511, 637: 1511, 1511, 1511, 1511}, + {1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 537: 1512, 1512, 1512, 541: 1512, 1512, 544: 1512, 1512, 1512, 1512, 3809, 3810, 3815, 554: 1512, 1512, 1512, 559: 1512, 1512, 1512, 1512, 1512, 1512, 3811, 1512, 568: 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 585: 1512, 1512, 1512, 1512, 1512, 1512, 593: 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 614: 3812, 3813, 1512, 3816, 1512, 3814, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 632: 1512, 637: 1512, 1512, 1512, 1512}, + {1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 537: 1513, 1513, 1513, 541: 1513, 1513, 544: 1513, 1513, 1513, 1513, 3809, 3810, 3815, 554: 1513, 1513, 1513, 559: 1513, 1513, 1513, 1513, 1513, 1513, 3811, 1513, 568: 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 585: 1513, 1513, 1513, 1513, 1513, 1513, 593: 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 614: 3812, 3813, 1513, 3816, 1513, 3814, 3807, 3808, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 632: 1513, 637: 1513, 1513, 1513, 1513}, + {1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 537: 1514, 1514, 1514, 541: 1514, 1514, 544: 1514, 1514, 1514, 1514, 3809, 3810, 3815, 554: 1514, 1514, 1514, 559: 1514, 1514, 1514, 1514, 1514, 1514, 3811, 1514, 568: 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 585: 1514, 1514, 1514, 1514, 1514, 1514, 593: 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 614: 3812, 3813, 3806, 3816, 1514, 3814, 3807, 3808, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 632: 1514, 637: 1514, 1514, 1514, 1514}, + {2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 537: 2232, 2232, 542: 2232, 544: 2232, 2232, 2232, 2232, 554: 2232, 2232, 2232, 559: 2232, 2232, 2232, 563: 2232, 2232, 566: 2232, 568: 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 586: 2232, 2232, 2232, 2232, 2232, 593: 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 612: 2232, 806: 3768, 3766}, // 960 - {2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 537: 2223, 2223, 542: 2223, 544: 2223, 2223, 2223, 2223, 554: 2223, 2223, 2223, 559: 2223, 2223, 562: 2223, 2223, 565: 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 585: 2223, 2223, 2223, 2223, 590: 2223, 593: 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 612: 2223, 806: 3763, 3761}, - {2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 537: 2224, 2224, 542: 2224, 544: 2224, 2224, 2224, 2224, 554: 2224, 2224, 2224, 559: 2224, 2224, 562: 2224, 2224, 565: 2224, 2224, 2224, 2224, 2224, 2224, 3767, 2224, 3766, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 585: 2224, 2224, 2224, 2224, 590: 2224, 593: 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 612: 2224, 806: 3763, 3761}, - {2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 537: 2225, 2225, 542: 2225, 544: 2225, 2225, 2225, 2225, 554: 2225, 2225, 2225, 559: 2225, 2225, 562: 2225, 2225, 565: 2225, 2225, 2225, 2225, 2225, 2225, 3767, 2225, 3766, 2225, 3762, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 585: 2225, 2225, 2225, 2225, 590: 2225, 593: 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 612: 2225, 806: 3763, 3761}, - {190: 2603, 226: 2603, 553: 2603, 584: 2603, 611: 2603, 632: 2603, 634: 2603, 2603, 637: 2603, 2603, 2603, 650: 2603}, - {190: 2602, 226: 2602, 553: 2602, 584: 2602, 611: 2602, 632: 2602, 634: 2602, 2602, 637: 2602, 2602, 2602, 650: 2602}, + {2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 537: 2233, 2233, 542: 2233, 544: 2233, 2233, 2233, 2233, 554: 2233, 2233, 2233, 559: 2233, 2233, 2233, 563: 2233, 2233, 566: 2233, 568: 2233, 2233, 2233, 2233, 3772, 2233, 3771, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 586: 2233, 2233, 2233, 2233, 2233, 593: 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 612: 2233, 806: 3768, 3766}, + {2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 537: 2234, 2234, 542: 2234, 544: 2234, 2234, 2234, 2234, 554: 2234, 2234, 2234, 559: 2234, 2234, 2234, 563: 2234, 2234, 566: 2234, 568: 2234, 2234, 2234, 2234, 3772, 2234, 3771, 2234, 3767, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 586: 2234, 2234, 2234, 2234, 2234, 593: 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 612: 2234, 806: 3768, 3766}, + {191: 2609, 226: 2609, 553: 2609, 585: 2609, 611: 2609, 632: 2609, 634: 2609, 2609, 637: 2609, 2609, 2609, 650: 2609}, + {191: 2608, 226: 2608, 553: 2608, 585: 2608, 611: 2608, 632: 2608, 634: 2608, 2608, 637: 2608, 2608, 2608, 650: 2608}, + {2: 2188, 2188, 2188, 2188, 2188, 2188, 2188, 10: 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 58: 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 536: 2188, 538: 2188, 2188, 2188, 545: 2188, 2188, 548: 2188, 2188, 2188, 552: 2188, 2188, 557: 2188, 2188, 567: 2188, 584: 2188, 591: 2188, 2188, 630: 2188, 2188, 633: 2188, 2188, 2188, 2188, 641: 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 662: 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188}, // 965 - {2: 2179, 2179, 2179, 2179, 2179, 2179, 2179, 10: 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 58: 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 536: 2179, 538: 2179, 2179, 2179, 545: 2179, 2179, 548: 2179, 2179, 2179, 552: 2179, 2179, 557: 2179, 2179, 564: 2179, 583: 2179, 591: 2179, 2179, 624: 2179, 631: 2179, 633: 2179, 2179, 2179, 2179, 641: 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 662: 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 702: 2179, 2179, 2179, 2179}, - {584: 4017, 611: 4016, 632: 4015, 637: 4018, 3847, 3848, 1256: 4019}, - {536: 2175}, - {2: 2173, 2173, 2173, 2173, 2173, 2173, 2173, 10: 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 58: 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 536: 2173, 538: 2173, 2173, 2173, 545: 2173, 2173, 548: 2173, 2173, 2173, 552: 2173, 2173, 557: 2173, 2173, 564: 2173, 583: 2173, 591: 2173, 2173, 624: 2173, 631: 2173, 633: 2173, 2173, 2173, 2173, 641: 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 662: 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 702: 2173, 2173, 2173, 2173}, - {2: 2171, 2171, 2171, 2171, 2171, 2171, 2171, 10: 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 58: 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 536: 2171, 538: 2171, 2171, 2171, 545: 2171, 2171, 548: 2171, 2171, 2171, 552: 2171, 2171, 557: 2171, 2171, 564: 2171, 583: 2171, 591: 2171, 2171, 624: 2171, 631: 2171, 633: 2171, 2171, 2171, 2171, 641: 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 662: 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 702: 2171, 2171, 2171, 2171}, + {585: 4025, 611: 4024, 632: 4023, 637: 4026, 3852, 3853, 1256: 4027}, + {536: 2184}, + {2: 2182, 2182, 2182, 2182, 2182, 2182, 2182, 10: 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 58: 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 536: 2182, 538: 2182, 2182, 2182, 545: 2182, 2182, 548: 2182, 2182, 2182, 552: 2182, 2182, 557: 2182, 2182, 567: 2182, 584: 2182, 591: 2182, 2182, 630: 2182, 2182, 633: 2182, 2182, 2182, 2182, 641: 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 662: 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182}, + {2: 2180, 2180, 2180, 2180, 2180, 2180, 2180, 10: 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 58: 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 536: 2180, 538: 2180, 2180, 2180, 545: 2180, 2180, 548: 2180, 2180, 2180, 552: 2180, 2180, 557: 2180, 2180, 567: 2180, 584: 2180, 591: 2180, 2180, 630: 2180, 2180, 633: 2180, 2180, 2180, 2180, 641: 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 662: 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180}, + {2: 2178, 2178, 2178, 2178, 2178, 2178, 2178, 10: 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 58: 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 536: 2178, 538: 2178, 2178, 2178, 545: 2178, 2178, 548: 2178, 2178, 2178, 552: 2178, 2178, 557: 2178, 2178, 567: 2178, 584: 2178, 591: 2178, 2178, 630: 2178, 2178, 633: 2178, 2178, 2178, 2178, 641: 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 662: 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178}, // 970 - {2: 2169, 2169, 2169, 2169, 2169, 2169, 2169, 10: 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 58: 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 536: 2169, 538: 2169, 2169, 2169, 545: 2169, 2169, 548: 2169, 2169, 2169, 552: 2169, 2169, 557: 2169, 2169, 564: 2169, 583: 2169, 591: 2169, 2169, 624: 2169, 631: 2169, 633: 2169, 2169, 2169, 2169, 641: 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 662: 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 702: 2169, 2169, 2169, 2169}, - {536: 3862, 781: 3863}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3703, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3859}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3703, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3637, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3857, 3618, 3700, 3617, 3614}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3703, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3637, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3853, 3618, 3700, 3617, 3614}, + {536: 3867, 781: 3868}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3708, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3864}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3708, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3642, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3862, 3623, 3705, 3622, 3619}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3708, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3642, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3858, 3623, 3705, 3622, 3619}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3708, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3642, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3857, 3623, 3705, 3622, 3619}, // 975 - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3703, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3637, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3852, 3618, 3700, 3617, 3614}, - {536: 3849}, - {2: 2156, 2156, 2156, 2156, 2156, 2156, 2156, 10: 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 58: 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 536: 2156, 538: 2156, 2156, 2156, 545: 2156, 2156, 548: 2156, 2156, 2156, 552: 2156, 2156, 557: 2156, 2156, 564: 2156, 583: 2156, 591: 2156, 2156, 624: 2156, 631: 2156, 633: 2156, 2156, 2156, 2156, 641: 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 662: 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 702: 2156, 2156, 2156, 2156}, - {2: 2155, 2155, 2155, 2155, 2155, 2155, 2155, 10: 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 58: 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 536: 2155, 538: 2155, 2155, 2155, 545: 2155, 2155, 548: 2155, 2155, 2155, 552: 2155, 2155, 557: 2155, 2155, 564: 2155, 583: 2155, 591: 2155, 2155, 624: 2155, 631: 2155, 633: 2155, 2155, 2155, 2155, 641: 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 662: 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 702: 2155, 2155, 2155, 2155}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3703, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3637, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3850, 3618, 3700, 3617, 3614}, + {536: 3854}, + {2: 2165, 2165, 2165, 2165, 2165, 2165, 2165, 10: 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 58: 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 536: 2165, 538: 2165, 2165, 2165, 545: 2165, 2165, 548: 2165, 2165, 2165, 552: 2165, 2165, 557: 2165, 2165, 567: 2165, 584: 2165, 591: 2165, 2165, 630: 2165, 2165, 633: 2165, 2165, 2165, 2165, 641: 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 662: 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165}, + {2: 2164, 2164, 2164, 2164, 2164, 2164, 2164, 10: 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 58: 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 536: 2164, 538: 2164, 2164, 2164, 545: 2164, 2164, 548: 2164, 2164, 2164, 552: 2164, 2164, 557: 2164, 2164, 567: 2164, 584: 2164, 591: 2164, 2164, 630: 2164, 2164, 633: 2164, 2164, 2164, 2164, 641: 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 662: 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3708, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3642, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3855, 3623, 3705, 3622, 3619}, + {57: 3856, 543: 3719, 707: 3720}, // 980 - {57: 3851, 543: 3714, 707: 3715}, - {2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 537: 2158, 2158, 542: 2158, 544: 2158, 2158, 2158, 2158, 554: 2158, 2158, 2158, 559: 2158, 2158, 2158, 2158, 2158, 565: 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 585: 2158, 2158, 2158, 2158, 590: 2158, 593: 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 612: 2158, 622: 2158, 2158, 625: 2158, 2158, 2158, 2158, 2158, 2158}, - {2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 537: 2159, 2159, 542: 2159, 3714, 2159, 2159, 2159, 2159, 554: 2159, 2159, 2159, 559: 2159, 2159, 2159, 2159, 2159, 565: 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 585: 2159, 2159, 2159, 2159, 590: 2159, 593: 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 612: 2159, 622: 2159, 2159, 625: 2159, 2159, 2159, 2159, 2159, 2159, 707: 3715}, - {2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 3855, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 537: 2154, 2154, 542: 2154, 3714, 2154, 2154, 2154, 2154, 554: 2154, 2154, 2154, 559: 2154, 2154, 2154, 2154, 2154, 565: 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 585: 2154, 2154, 2154, 2154, 590: 2154, 593: 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 612: 2154, 622: 2154, 2154, 625: 2154, 2154, 2154, 2154, 2154, 2154, 707: 3715, 1206: 3854}, - {2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 537: 2160, 2160, 542: 2160, 544: 2160, 2160, 2160, 2160, 554: 2160, 2160, 2160, 559: 2160, 2160, 2160, 2160, 2160, 565: 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 585: 2160, 2160, 2160, 2160, 590: 2160, 593: 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 612: 2160, 622: 2160, 2160, 625: 2160, 2160, 2160, 2160, 2160, 2160}, + {2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 537: 2167, 2167, 542: 2167, 544: 2167, 2167, 2167, 2167, 554: 2167, 2167, 2167, 559: 2167, 2167, 2167, 2167, 2167, 2167, 566: 2167, 568: 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 586: 2167, 2167, 2167, 2167, 2167, 593: 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 612: 2167, 622: 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167}, + {2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 537: 2168, 2168, 542: 2168, 3719, 2168, 2168, 2168, 2168, 554: 2168, 2168, 2168, 559: 2168, 2168, 2168, 2168, 2168, 2168, 566: 2168, 568: 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 586: 2168, 2168, 2168, 2168, 2168, 593: 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 612: 2168, 622: 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 707: 3720}, + {2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 3860, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 537: 2163, 2163, 542: 2163, 3719, 2163, 2163, 2163, 2163, 554: 2163, 2163, 2163, 559: 2163, 2163, 2163, 2163, 2163, 2163, 566: 2163, 568: 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 586: 2163, 2163, 2163, 2163, 2163, 593: 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 612: 2163, 622: 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 707: 3720, 1207: 3859}, + {2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 537: 2169, 2169, 542: 2169, 544: 2169, 2169, 2169, 2169, 554: 2169, 2169, 2169, 559: 2169, 2169, 2169, 2169, 2169, 2169, 566: 2169, 568: 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 586: 2169, 2169, 2169, 2169, 2169, 593: 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 612: 2169, 622: 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169}, + {538: 3861}, // 985 - {538: 3856}, - {2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 537: 2153, 2153, 542: 2153, 544: 2153, 2153, 2153, 2153, 554: 2153, 2153, 2153, 559: 2153, 2153, 2153, 2153, 2153, 565: 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 585: 2153, 2153, 2153, 2153, 590: 2153, 593: 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 612: 2153, 622: 2153, 2153, 625: 2153, 2153, 2153, 2153, 2153, 2153}, - {2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 3855, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 537: 2154, 2154, 542: 2154, 3714, 2154, 2154, 2154, 2154, 554: 2154, 2154, 2154, 559: 2154, 2154, 2154, 2154, 2154, 565: 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 585: 2154, 2154, 2154, 2154, 590: 2154, 593: 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 612: 2154, 622: 2154, 2154, 625: 2154, 2154, 2154, 2154, 2154, 2154, 707: 3715, 1206: 3858}, - {2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 537: 2161, 2161, 542: 2161, 544: 2161, 2161, 2161, 2161, 554: 2161, 2161, 2161, 559: 2161, 2161, 2161, 2161, 2161, 565: 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 585: 2161, 2161, 2161, 2161, 590: 2161, 593: 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 612: 2161, 622: 2161, 2161, 625: 2161, 2161, 2161, 2161, 2161, 2161}, - {548: 3804, 3805, 3810, 571: 3860, 589: 3806, 613: 3807, 615: 3808, 3801, 3811, 3800, 3809, 3802, 3803}, + {2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 537: 2162, 2162, 542: 2162, 544: 2162, 2162, 2162, 2162, 554: 2162, 2162, 2162, 559: 2162, 2162, 2162, 2162, 2162, 2162, 566: 2162, 568: 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 586: 2162, 2162, 2162, 2162, 2162, 593: 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 612: 2162, 622: 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162}, + {2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 3860, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 537: 2163, 2163, 542: 2163, 3719, 2163, 2163, 2163, 2163, 554: 2163, 2163, 2163, 559: 2163, 2163, 2163, 2163, 2163, 2163, 566: 2163, 568: 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 586: 2163, 2163, 2163, 2163, 2163, 593: 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 612: 2163, 622: 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 707: 3720, 1207: 3863}, + {2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 537: 2170, 2170, 542: 2170, 544: 2170, 2170, 2170, 2170, 554: 2170, 2170, 2170, 559: 2170, 2170, 2170, 2170, 2170, 2170, 566: 2170, 568: 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 586: 2170, 2170, 2170, 2170, 2170, 593: 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 612: 2170, 622: 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170}, + {548: 3809, 3810, 3815, 565: 3811, 572: 3865, 614: 3812, 3813, 3806, 3816, 3805, 3814, 3807, 3808}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3708, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3866}, // 990 - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3703, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3861}, - {2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 537: 2162, 2162, 542: 2162, 544: 2162, 2162, 2162, 2162, 554: 2162, 2162, 2162, 559: 2162, 2162, 2162, 2162, 2162, 565: 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 585: 2162, 2162, 2162, 2162, 590: 2162, 593: 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 612: 2162, 622: 2162, 2162, 625: 2162, 2162, 2162, 2162, 2162, 2162}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 2922, 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3867, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 614: 2920, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 2916, 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3866, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 3864, 812: 3869, 2917, 2918, 2919, 2928, 818: 2926, 2925, 2924, 822: 3868, 3871, 3870, 869: 3865}, - {2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 537: 2163, 2163, 542: 2163, 544: 2163, 2163, 2163, 2163, 554: 2163, 2163, 2163, 559: 2163, 2163, 2163, 2163, 2163, 565: 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 585: 2163, 2163, 2163, 2163, 590: 2163, 593: 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 612: 2163, 622: 2163, 2163, 625: 2163, 2163, 2163, 2163, 2163, 2163}, - {2203, 2203, 9: 2203, 57: 2203, 160: 2203, 547: 2203, 569: 2203, 571: 3767, 3765, 3766, 3764, 3762, 806: 3763, 3761}, + {2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 537: 2171, 2171, 542: 2171, 544: 2171, 2171, 2171, 2171, 554: 2171, 2171, 2171, 559: 2171, 2171, 2171, 2171, 2171, 2171, 566: 2171, 568: 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 586: 2171, 2171, 2171, 2171, 2171, 593: 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 612: 2171, 622: 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 2928, 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3872, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 613: 2926, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 2922, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3871, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 3869, 812: 3874, 2923, 2924, 2925, 2934, 2932, 2931, 2930, 821: 3873, 3876, 3875, 869: 3870}, + {2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 537: 2172, 2172, 542: 2172, 544: 2172, 2172, 2172, 2172, 554: 2172, 2172, 2172, 559: 2172, 2172, 2172, 2172, 2172, 2172, 566: 2172, 568: 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 586: 2172, 2172, 2172, 2172, 2172, 593: 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 612: 2172, 622: 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172}, + {2212, 2212, 9: 2212, 57: 2212, 162: 2212, 547: 2212, 570: 2212, 572: 3772, 3770, 3771, 3769, 3767, 806: 3768, 3766}, + {9: 4020, 57: 4021}, // 995 - {9: 4012, 57: 4013}, - {9: 1470, 57: 1470, 539: 1470, 541: 1470, 543: 1470, 1020, 548: 1470, 1470, 1470, 555: 1020, 1020, 559: 3881, 561: 1470, 3880, 569: 3879, 571: 1470, 1470, 1470, 1470, 1470, 584: 1470, 589: 1470, 611: 1470, 613: 1470, 615: 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 625: 1470, 1470, 1470, 1470, 1470, 1470, 632: 1470, 637: 1470, 1470, 1470, 1470, 707: 1470, 848: 3882, 3883}, - {536: 3911, 644: 3914, 1019: 3913, 1100: 3912}, - {536: 2923, 552: 2921, 614: 2920, 701: 2916, 781: 3876, 812: 3875, 2917, 2918, 2919, 2928, 818: 2926, 3877, 3878}, - {57: 3874, 544: 1021, 555: 1021, 1021}, + {9: 1479, 57: 1479, 539: 1479, 541: 1479, 543: 1479, 1028, 548: 1479, 1479, 1479, 555: 1028, 1028, 559: 3886, 3885, 562: 1479, 565: 1479, 570: 3884, 572: 1479, 1479, 1479, 1479, 1479, 585: 1479, 611: 1479, 614: 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 632: 1479, 637: 1479, 1479, 1479, 1479, 707: 1479, 847: 3887, 3888}, + {536: 3916, 644: 3919, 1021: 3918, 1103: 3917}, + {536: 2929, 552: 2927, 613: 2926, 660: 2922, 781: 3881, 812: 3880, 2923, 2924, 2925, 2934, 2932, 3882, 3883}, + {57: 3879, 544: 1029, 555: 1029, 1029}, + {57: 3878}, // 1000 - {57: 3873}, - {57: 3872}, - {1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 541: 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 552: 1048, 554: 1048, 1048, 1048, 559: 1048, 1048, 1048, 1048, 1048, 565: 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 584: 1048, 1048, 1048, 1048, 1048, 1048, 1048, 593: 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 625: 1048, 1048, 1048, 1048, 1048, 1048, 632: 1048, 637: 1048, 1048, 1048, 1048, 661: 1048, 701: 1048, 707: 1048, 719: 1048, 809: 1048}, - {1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 541: 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 552: 1049, 554: 1049, 1049, 1049, 559: 1049, 1049, 1049, 1049, 1049, 565: 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 584: 1049, 1049, 1049, 1049, 1049, 1049, 1049, 593: 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 625: 1049, 1049, 1049, 1049, 1049, 1049, 632: 1049, 637: 1049, 1049, 1049, 1049, 661: 1049, 701: 1049, 707: 1049, 719: 1049, 809: 1049}, - {1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 541: 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 552: 1050, 554: 1050, 1050, 1050, 559: 1050, 1050, 1050, 1050, 1050, 565: 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 584: 1050, 1050, 1050, 1050, 1050, 1050, 1050, 593: 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 625: 1050, 1050, 1050, 1050, 1050, 1050, 632: 1050, 637: 1050, 1050, 1050, 1050, 661: 1050, 701: 1050, 707: 1050, 719: 1050, 809: 1050}, + {57: 3877}, + {1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 541: 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 552: 1056, 554: 1056, 1056, 1056, 559: 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 568: 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 585: 1056, 1056, 1056, 1056, 1056, 1056, 593: 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 632: 1056, 637: 1056, 1056, 1056, 1056, 660: 1056, 1056, 707: 1056, 719: 1056, 809: 1056}, + {1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 541: 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 552: 1057, 554: 1057, 1057, 1057, 559: 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 568: 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 585: 1057, 1057, 1057, 1057, 1057, 1057, 593: 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 632: 1057, 637: 1057, 1057, 1057, 1057, 660: 1057, 1057, 707: 1057, 719: 1057, 809: 1057}, + {1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 541: 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 552: 1058, 554: 1058, 1058, 1058, 559: 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 568: 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 585: 1058, 1058, 1058, 1058, 1058, 1058, 593: 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 632: 1058, 637: 1058, 1058, 1058, 1058, 660: 1058, 1058, 707: 1058, 719: 1058, 809: 1058}, + {1213, 1213, 57: 1213, 535: 1213, 537: 1213, 544: 1029, 547: 1213, 555: 1029, 1029}, // 1005 - {1205, 1205, 57: 1205, 535: 1205, 537: 1205, 544: 1021, 547: 1205, 555: 1021, 1021}, - {1204, 1204, 57: 1204, 535: 1204, 537: 1204, 544: 1020, 547: 1204, 555: 1020, 1020, 559: 3881, 562: 3880, 569: 3879, 848: 3882, 3883}, + {1212, 1212, 57: 1212, 535: 1212, 537: 1212, 544: 1028, 547: 1212, 555: 1028, 1028, 559: 3886, 3885, 570: 3884, 847: 3887, 3888}, + {1041, 1041, 57: 1041, 535: 1041, 537: 1041, 547: 1041}, + {1040, 1040, 57: 1040, 535: 1040, 537: 1040, 547: 1040}, + {728: 3907}, + {567: 3058, 647: 3895, 805: 3893, 820: 3894, 992: 3902}, + // 1010 + {10: 3890, 265: 3891, 1368: 3892}, + {1034, 1034, 57: 1034, 535: 1034, 537: 1034, 547: 1034, 559: 3886, 3885, 848: 3889}, {1033, 1033, 57: 1033, 535: 1033, 537: 1033, 547: 1033}, {1032, 1032, 57: 1032, 535: 1032, 537: 1032, 547: 1032}, - {728: 3902}, - // 1010 - {564: 3053, 647: 3890, 805: 3888, 817: 3889, 991: 3897}, - {10: 3885, 265: 3886, 1370: 3887}, - {1026, 1026, 57: 1026, 535: 1026, 537: 1026, 547: 1026, 559: 3881, 562: 3880, 849: 3884}, - {1025, 1025, 57: 1025, 535: 1025, 537: 1025, 547: 1025}, - {1024, 1024, 57: 1024, 535: 1024, 537: 1024, 547: 1024}, + {567: 1091, 593: 1091, 644: 1091, 647: 1091}, // 1015 - {564: 1083, 593: 1083, 644: 1083, 647: 1083}, - {564: 1082, 593: 1082, 644: 1082, 647: 1082}, - {564: 3053, 593: 1081, 644: 1081, 647: 3890, 805: 3888, 817: 3889, 991: 3891, 1364: 3892}, - {2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 15: 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 57: 2239, 2239, 60: 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 102: 2239, 104: 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 118: 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 133: 2239, 137: 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 214: 2239, 221: 2239, 263: 2239, 535: 2239, 2239, 2239, 540: 2239, 542: 2239, 2239, 2239, 547: 2239, 551: 2239, 2239, 554: 2239, 2239, 2239, 2239, 2239, 560: 2239, 563: 2239, 565: 2239, 567: 2239, 570: 2239, 593: 2239, 614: 2239, 644: 2239, 701: 2239, 714: 2239, 2239, 718: 2239}, - {1087, 1087, 9: 1087, 57: 1087, 214: 1087, 535: 1087, 537: 1087, 544: 1087, 547: 1087, 555: 1087, 1087, 563: 1087, 565: 1087, 567: 1087, 593: 1087, 644: 1087}, + {567: 1090, 593: 1090, 644: 1090, 647: 1090}, + {567: 3058, 593: 1089, 644: 1089, 647: 3895, 805: 3893, 820: 3894, 992: 3896, 1362: 3897}, + {2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 15: 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 57: 2245, 2245, 60: 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 102: 2245, 104: 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 118: 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 134: 2245, 138: 2245, 140: 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 214: 2245, 222: 2245, 263: 2245, 535: 2245, 2245, 2245, 540: 2245, 542: 2245, 2245, 2245, 547: 2245, 551: 2245, 2245, 554: 2245, 2245, 2245, 2245, 2245, 561: 2245, 563: 2245, 2245, 568: 2245, 571: 2245, 593: 2245, 613: 2245, 644: 2245, 660: 2245, 714: 2245, 2245, 718: 2245}, + {1095, 1095, 9: 1095, 57: 1095, 214: 1095, 535: 1095, 537: 1095, 544: 1095, 547: 1095, 555: 1095, 1095, 563: 1095, 1095, 568: 1095, 593: 1095, 644: 1095}, + {1094, 1094, 9: 1094, 57: 1094, 214: 1094, 535: 1094, 537: 1094, 544: 1094, 547: 1094, 555: 1094, 1094, 563: 1094, 1094, 568: 1094, 593: 1094, 644: 1094}, // 1020 - {1086, 1086, 9: 1086, 57: 1086, 214: 1086, 535: 1086, 537: 1086, 544: 1086, 547: 1086, 555: 1086, 1086, 563: 1086, 565: 1086, 567: 1086, 593: 1086, 644: 1086}, - {593: 1080, 644: 1080}, - {593: 3894, 644: 3893, 1451: 3895}, - {195: 1085}, - {195: 1084}, + {593: 1088, 644: 1088}, + {593: 3899, 644: 3898, 1451: 3900}, + {196: 1093}, + {196: 1092}, + {196: 3901}, // 1025 - {195: 3896}, - {1076, 1076, 57: 1076, 535: 1076, 537: 1076, 544: 1076, 547: 1076, 555: 1076, 1076, 563: 1076, 565: 1076, 567: 1076}, - {1079, 1079, 9: 3898, 57: 1079, 214: 3899, 535: 1079, 537: 1079, 544: 1079, 547: 1079, 555: 1079, 1079, 563: 1079, 565: 1079, 567: 1079}, - {564: 3053, 647: 3890, 805: 3888, 817: 3889, 991: 3901}, - {564: 3053, 647: 3890, 805: 3888, 817: 3889, 991: 3900}, + {1084, 1084, 57: 1084, 535: 1084, 537: 1084, 544: 1084, 547: 1084, 555: 1084, 1084, 563: 1084, 1084, 568: 1084}, + {1087, 1087, 9: 3903, 57: 1087, 214: 3904, 535: 1087, 537: 1087, 544: 1087, 547: 1087, 555: 1087, 1087, 563: 1087, 1087, 568: 1087}, + {567: 3058, 647: 3895, 805: 3893, 820: 3894, 992: 3906}, + {567: 3058, 647: 3895, 805: 3893, 820: 3894, 992: 3905}, + {1085, 1085, 57: 1085, 535: 1085, 537: 1085, 544: 1085, 547: 1085, 555: 1085, 1085, 563: 1085, 1085, 568: 1085}, // 1030 - {1077, 1077, 57: 1077, 535: 1077, 537: 1077, 544: 1077, 547: 1077, 555: 1077, 1077, 563: 1077, 565: 1077, 567: 1077}, - {1078, 1078, 57: 1078, 535: 1078, 537: 1078, 544: 1078, 547: 1078, 555: 1078, 1078, 563: 1078, 565: 1078, 567: 1078}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 3903, 979: 3905, 1006: 3904}, - {1514, 1514, 9: 1514, 57: 1514, 160: 1514, 535: 1514, 537: 1514, 544: 1514, 547: 1514, 555: 1514, 1514, 559: 1514, 562: 1514, 1514, 565: 1514, 567: 1514, 569: 1514, 571: 3767, 3765, 3766, 3764, 3762, 577: 1514, 579: 1514, 582: 3910, 593: 1514, 596: 1514, 598: 1514, 610: 3909, 806: 3763, 3761, 1418: 3908}, - {1517, 1517, 9: 3906, 57: 1517, 160: 1517, 535: 1517, 537: 1517, 544: 1517, 547: 1517, 555: 1517, 1517, 559: 1517, 562: 1517, 1517, 565: 1517, 567: 1517}, + {1086, 1086, 57: 1086, 535: 1086, 537: 1086, 544: 1086, 547: 1086, 555: 1086, 1086, 563: 1086, 1086, 568: 1086}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 3908, 980: 3910, 1008: 3909}, + {1523, 1523, 9: 1523, 57: 1523, 162: 1523, 535: 1523, 537: 1523, 544: 1523, 547: 1523, 555: 1523, 1523, 559: 1523, 1523, 563: 1523, 1523, 568: 1523, 570: 1523, 572: 3772, 3770, 3771, 3769, 3767, 578: 1523, 580: 1523, 583: 3915, 593: 1523, 596: 1523, 598: 1523, 610: 3914, 806: 3768, 3766, 1417: 3913}, + {1526, 1526, 9: 3911, 57: 1526, 162: 1526, 535: 1526, 537: 1526, 544: 1526, 547: 1526, 555: 1526, 1526, 559: 1526, 1526, 563: 1526, 1526, 568: 1526}, + {1525, 1525, 9: 1525, 57: 1525, 162: 1525, 535: 1525, 537: 1525, 544: 1525, 547: 1525, 555: 1525, 1525, 559: 1525, 1525, 563: 1525, 1525, 568: 1525, 570: 1525, 578: 1525, 580: 1525, 593: 1525, 596: 1525, 598: 1525}, // 1035 - {1516, 1516, 9: 1516, 57: 1516, 160: 1516, 535: 1516, 537: 1516, 544: 1516, 547: 1516, 555: 1516, 1516, 559: 1516, 562: 1516, 1516, 565: 1516, 567: 1516, 569: 1516, 577: 1516, 579: 1516, 593: 1516, 596: 1516, 598: 1516}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 3903, 979: 3907}, - {1515, 1515, 9: 1515, 57: 1515, 160: 1515, 535: 1515, 537: 1515, 544: 1515, 547: 1515, 555: 1515, 1515, 559: 1515, 562: 1515, 1515, 565: 1515, 567: 1515, 569: 1515, 577: 1515, 579: 1515, 593: 1515, 596: 1515, 598: 1515}, - {1513, 1513, 9: 1513, 57: 1513, 160: 1513, 535: 1513, 537: 1513, 544: 1513, 547: 1513, 555: 1513, 1513, 559: 1513, 562: 1513, 1513, 565: 1513, 567: 1513, 569: 1513, 577: 1513, 579: 1513, 593: 1513, 596: 1513, 598: 1513}, - {1512, 1512, 9: 1512, 57: 1512, 160: 1512, 535: 1512, 537: 1512, 544: 1512, 547: 1512, 555: 1512, 1512, 559: 1512, 562: 1512, 1512, 565: 1512, 567: 1512, 569: 1512, 577: 1512, 579: 1512, 593: 1512, 596: 1512, 598: 1512}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 3908, 980: 3912}, + {1524, 1524, 9: 1524, 57: 1524, 162: 1524, 535: 1524, 537: 1524, 544: 1524, 547: 1524, 555: 1524, 1524, 559: 1524, 1524, 563: 1524, 1524, 568: 1524, 570: 1524, 578: 1524, 580: 1524, 593: 1524, 596: 1524, 598: 1524}, + {1522, 1522, 9: 1522, 57: 1522, 162: 1522, 535: 1522, 537: 1522, 544: 1522, 547: 1522, 555: 1522, 1522, 559: 1522, 1522, 563: 1522, 1522, 568: 1522, 570: 1522, 578: 1522, 580: 1522, 593: 1522, 596: 1522, 598: 1522}, + {1521, 1521, 9: 1521, 57: 1521, 162: 1521, 535: 1521, 537: 1521, 544: 1521, 547: 1521, 555: 1521, 1521, 559: 1521, 1521, 563: 1521, 1521, 568: 1521, 570: 1521, 578: 1521, 580: 1521, 593: 1521, 596: 1521, 598: 1521}, + {1520, 1520, 9: 1520, 57: 1520, 162: 1520, 535: 1520, 537: 1520, 544: 1520, 547: 1520, 555: 1520, 1520, 559: 1520, 1520, 563: 1520, 1520, 568: 1520, 570: 1520, 578: 1520, 580: 1520, 593: 1520, 596: 1520, 598: 1520}, // 1040 - {1511, 1511, 9: 1511, 57: 1511, 160: 1511, 535: 1511, 537: 1511, 544: 1511, 547: 1511, 555: 1511, 1511, 559: 1511, 562: 1511, 1511, 565: 1511, 567: 1511, 569: 1511, 577: 1511, 579: 1511, 593: 1511, 596: 1511, 598: 1511}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 3923, 3067, 3068, 3066, 784: 4009}, - {1507, 1507, 9: 3935, 57: 1507, 535: 1507, 537: 1507, 544: 1507, 547: 1507, 555: 1507, 1507, 559: 1507, 562: 1507, 1507, 565: 1507, 567: 1507, 569: 3879, 848: 3933, 915: 3934}, - {147, 147, 9: 147, 57: 147, 535: 147, 537: 147, 544: 147, 547: 147, 555: 147, 147, 559: 147, 562: 147, 147, 565: 147, 567: 147, 569: 147}, - {536: 3915, 944: 3916}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 3928, 3072, 3073, 3071, 784: 4017}, + {1516, 1516, 9: 3940, 57: 1516, 535: 1516, 537: 1516, 544: 1516, 547: 1516, 555: 1516, 1516, 559: 1516, 1516, 563: 1516, 1516, 568: 1516, 570: 3884, 847: 3938, 917: 3939}, + {147, 147, 9: 147, 57: 147, 535: 147, 537: 147, 544: 147, 547: 147, 555: 147, 147, 559: 147, 147, 563: 147, 147, 568: 147, 570: 147}, + {536: 3920, 946: 3921}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 1554, 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3926, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 3922, 899: 3925, 1497: 3924, 3923}, // 1045 - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 1545, 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3921, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 3917, 899: 3920, 1497: 3919, 3918}, - {145, 145, 9: 145, 57: 145, 535: 145, 537: 145, 544: 145, 547: 145, 555: 145, 145, 559: 145, 562: 145, 145, 565: 145, 567: 145, 569: 145}, - {1541, 1541, 9: 1541, 57: 1541, 535: 1541, 537: 1541, 547: 1541, 562: 1541, 566: 1541, 568: 1541, 1541, 571: 3767, 3765, 3766, 3764, 3762, 806: 3763, 3761}, - {57: 3932}, - {9: 3930, 57: 1544}, + {145, 145, 9: 145, 57: 145, 535: 145, 537: 145, 544: 145, 547: 145, 555: 145, 145, 559: 145, 145, 563: 145, 145, 568: 145, 570: 145}, + {1550, 1550, 9: 1550, 57: 1550, 535: 1550, 537: 1550, 547: 1550, 560: 1550, 566: 1550, 569: 1550, 1550, 572: 3772, 3770, 3771, 3769, 3767, 806: 3768, 3766}, + {57: 3937}, + {9: 3935, 57: 1553}, + {9: 1551, 57: 1551}, // 1050 - {9: 1542, 57: 1542}, - {1540, 1540, 9: 1540, 57: 1540, 535: 1540, 3922, 1540, 547: 1540, 562: 1540, 566: 1540, 568: 1540, 1540}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 3923, 3067, 3068, 3066, 784: 3924}, - {57: 1489, 561: 1489, 720: 3926}, - {57: 3925}, + {1549, 1549, 9: 1549, 57: 1549, 535: 1549, 3927, 1549, 547: 1549, 560: 1549, 566: 1549, 569: 1549, 1549}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 3928, 3072, 3073, 3071, 784: 3929}, + {57: 1498, 562: 1498, 720: 3931}, + {57: 3930}, + {1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 537: 1468, 1468, 1468, 541: 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 554: 1468, 1468, 1468, 559: 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 568: 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 585: 1468, 1468, 1468, 1468, 1468, 1468, 593: 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 614: 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 632: 1468, 637: 1468, 1468, 1468, 1468, 661: 1468, 707: 1468}, // 1055 - {1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 537: 1459, 1459, 1459, 541: 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 554: 1459, 1459, 1459, 559: 1459, 1459, 1459, 1459, 1459, 565: 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 584: 1459, 1459, 1459, 1459, 1459, 1459, 1459, 593: 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 615: 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 625: 1459, 1459, 1459, 1459, 1459, 1459, 632: 1459, 637: 1459, 1459, 1459, 1459, 661: 1459, 707: 1459}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 3927, 3067, 3068, 3066}, - {57: 1488, 561: 1488, 720: 3928}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 3929, 3067, 3068, 3066}, - {1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 537: 1487, 1487, 1487, 541: 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 554: 1487, 1487, 1487, 559: 1487, 1487, 1487, 1487, 1487, 565: 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 584: 1487, 1487, 1487, 1487, 1487, 1487, 1487, 593: 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 615: 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 625: 1487, 1487, 1487, 1487, 1487, 1487, 632: 1487, 637: 1487, 1487, 1487, 1487, 661: 1487, 707: 1487, 723: 1487, 1487}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 3932, 3072, 3073, 3071}, + {57: 1497, 562: 1497, 720: 3933}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 3934, 3072, 3073, 3071}, + {1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 537: 1496, 1496, 1496, 541: 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 554: 1496, 1496, 1496, 559: 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 568: 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 585: 1496, 1496, 1496, 1496, 1496, 1496, 593: 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 614: 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 632: 1496, 637: 1496, 1496, 1496, 1496, 661: 1496, 707: 1496, 723: 1496, 1496}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3926, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 3922, 899: 3936}, // 1060 - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3921, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 3917, 899: 3931}, - {9: 1543, 57: 1543}, - {1546, 1546, 9: 1546, 57: 1546, 108: 1546, 535: 1546, 537: 1546, 544: 1546, 547: 1546, 555: 1546, 1546, 559: 1546, 562: 1546, 1546, 565: 1546, 567: 1546, 569: 1546, 571: 1546}, - {1506, 1506, 57: 1506, 160: 1506, 535: 1506, 537: 1506, 544: 1506, 547: 1506, 555: 1506, 1506, 559: 1506, 562: 1506, 1506, 565: 1506, 567: 1506}, - {1075, 1075, 57: 1075, 535: 1075, 537: 1075, 544: 1075, 547: 1075, 555: 1075, 1075, 559: 3881, 562: 3880, 1075, 565: 1075, 567: 1075, 849: 3938, 931: 3937}, + {9: 1552, 57: 1552}, + {1555, 1555, 9: 1555, 57: 1555, 108: 1555, 535: 1555, 537: 1555, 544: 1555, 547: 1555, 555: 1555, 1555, 559: 1555, 1555, 563: 1555, 1555, 568: 1555, 570: 1555, 572: 1555}, + {1515, 1515, 57: 1515, 162: 1515, 535: 1515, 537: 1515, 544: 1515, 547: 1515, 555: 1515, 1515, 559: 1515, 1515, 563: 1515, 1515, 568: 1515}, + {1083, 1083, 57: 1083, 535: 1083, 537: 1083, 544: 1083, 547: 1083, 555: 1083, 1083, 559: 3886, 3885, 563: 1083, 1083, 568: 1083, 848: 3943, 932: 3942}, + {644: 3919, 1021: 3941}, // 1065 - {644: 3914, 1019: 3936}, - {146, 146, 9: 146, 57: 146, 535: 146, 537: 146, 544: 146, 547: 146, 555: 146, 146, 559: 146, 562: 146, 146, 565: 146, 567: 146, 569: 146}, - {1046, 1046, 57: 1046, 535: 1046, 537: 1046, 544: 1046, 547: 1046, 555: 1046, 1046, 563: 3940, 565: 1046, 567: 3941, 997: 3939}, - {1074, 1074, 57: 1074, 535: 1074, 537: 1074, 544: 1074, 547: 1074, 555: 1074, 1074, 563: 1074, 565: 1074, 567: 1074}, - {1052, 1052, 57: 1052, 535: 1052, 537: 1052, 544: 1052, 547: 1052, 555: 1052, 1052, 565: 3966, 998: 3965}, + {146, 146, 9: 146, 57: 146, 535: 146, 537: 146, 544: 146, 547: 146, 555: 146, 146, 559: 146, 146, 563: 146, 146, 568: 146, 570: 146}, + {1054, 1054, 57: 1054, 535: 1054, 537: 1054, 544: 1054, 547: 1054, 555: 1054, 1054, 563: 3945, 1054, 568: 3946, 998: 3944}, + {1082, 1082, 57: 1082, 535: 1082, 537: 1082, 544: 1082, 547: 1082, 555: 1082, 1082, 563: 1082, 1082, 568: 1082}, + {1060, 1060, 57: 1060, 535: 1060, 537: 1060, 544: 1060, 547: 1060, 555: 1060, 1060, 564: 3974, 999: 3973}, + {342: 3951, 719: 3950}, // 1070 - {341: 3946, 719: 3945}, - {611: 3942}, - {341: 3943}, - {264: 3944}, - {1038, 1038, 57: 1038, 535: 1038, 537: 1038, 544: 1038, 547: 1038, 555: 1038, 1038, 565: 1038}, + {611: 3947}, + {342: 3948}, + {264: 3949}, + {1046, 1046, 57: 1046, 535: 1046, 537: 1046, 544: 1046, 547: 1046, 555: 1046, 1046, 564: 1046}, + {1045, 1045, 57: 1045, 195: 1045, 198: 1045, 227: 1045, 535: 1045, 537: 1045, 544: 1045, 547: 1045, 555: 1045, 1045, 564: 1045, 1222: 3953, 3967}, // 1075 - {1037, 1037, 57: 1037, 194: 1037, 198: 1037, 227: 1037, 535: 1037, 537: 1037, 544: 1037, 547: 1037, 555: 1037, 1037, 565: 1037, 1222: 3948, 3959}, - {1037, 1037, 57: 1037, 194: 1037, 198: 1037, 535: 1037, 537: 1037, 544: 1037, 547: 1037, 555: 1037, 1037, 565: 1037, 1222: 3948, 3947}, - {1044, 1044, 57: 1044, 194: 3956, 198: 3957, 535: 1044, 537: 1044, 544: 1044, 547: 1044, 555: 1044, 1044, 565: 1044}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 3949, 3067, 3068, 3066, 810: 3950, 890: 3951}, - {1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 584: 1261, 1261, 1261, 1261, 1261, 1261, 1261, 593: 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 625: 1261, 1261, 1261, 1261, 1261, 1261, 632: 1261, 637: 1261, 1261, 1261, 1261, 651: 1261, 661: 1261, 701: 1261, 706: 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 3954, 1261, 725: 1261, 727: 1261, 1261, 1261, 732: 1261, 1261, 1261, 1261, 1261, 748: 1261, 770: 1261, 1261, 1261, 1261, 1261, 1261, 1261}, + {1045, 1045, 57: 1045, 195: 1045, 198: 1045, 535: 1045, 537: 1045, 544: 1045, 547: 1045, 555: 1045, 1045, 564: 1045, 1222: 3953, 3952}, + {1052, 1052, 57: 1052, 195: 3964, 198: 3965, 535: 1052, 537: 1052, 544: 1052, 547: 1052, 555: 1052, 1052, 564: 1052}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 565: 3955, 777: 3954, 3072, 3073, 3071, 810: 3956, 889: 3957}, + {1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 585: 1270, 1270, 1270, 1270, 1270, 1270, 593: 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 632: 1270, 637: 1270, 1270, 1270, 1270, 651: 1270, 660: 1270, 1270, 706: 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 3962, 1270, 725: 1270, 727: 1270, 1270, 1270, 732: 1270, 1270, 1270, 1270, 1270, 745: 1270, 770: 1270, 1270, 1270, 1270, 1270, 1270, 1270}, + {720: 3960}, // 1080 - {1259, 1259, 9: 1259, 57: 1259, 194: 1259, 198: 1259, 227: 1259, 535: 1259, 537: 1259, 544: 1259, 547: 1259, 555: 1259, 1259, 565: 1259, 1259, 717: 1259, 733: 1259, 735: 1259}, - {1036, 1036, 9: 3952, 57: 1036, 194: 1036, 198: 1036, 227: 1036, 535: 1036, 537: 1036, 544: 1036, 547: 1036, 555: 1036, 1036, 565: 1036}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 3949, 3067, 3068, 3066, 810: 3953}, - {1258, 1258, 9: 1258, 57: 1258, 194: 1258, 198: 1258, 216: 1258, 227: 1258, 535: 1258, 537: 1258, 544: 1258, 547: 1258, 555: 1258, 1258, 565: 1258, 1258, 717: 1258, 721: 1258, 733: 1258, 735: 1258, 770: 1258, 1258}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 3955, 3067, 3068, 3066}, + {1267, 1267, 9: 1267, 57: 1267, 195: 1267, 198: 1267, 227: 1267, 535: 1267, 537: 1267, 544: 1267, 547: 1267, 555: 1267, 1267, 564: 1267, 566: 1267, 717: 1267, 733: 1267, 735: 1267}, + {1044, 1044, 9: 3958, 57: 1044, 195: 1044, 198: 1044, 227: 1044, 535: 1044, 537: 1044, 544: 1044, 547: 1044, 555: 1044, 1044, 564: 1044}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 565: 3955, 777: 3954, 3072, 3073, 3071, 810: 3959}, + {1266, 1266, 9: 1266, 57: 1266, 195: 1266, 198: 1266, 216: 1266, 227: 1266, 535: 1266, 537: 1266, 544: 1266, 547: 1266, 555: 1266, 1266, 564: 1266, 566: 1266, 717: 1266, 721: 1266, 733: 1266, 735: 1266, 770: 1266, 1266}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 3961, 3072, 3073, 3071}, // 1085 - {1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 584: 1260, 1260, 1260, 1260, 1260, 1260, 1260, 593: 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 625: 1260, 1260, 1260, 1260, 1260, 1260, 632: 1260, 637: 1260, 1260, 1260, 1260, 651: 1260, 661: 1260, 701: 1260, 706: 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 721: 1260, 725: 1260, 727: 1260, 1260, 1260, 732: 1260, 1260, 1260, 1260, 1260, 748: 1260, 770: 1260, 1260, 1260, 1260, 1260, 1260, 1260}, - {1041, 1041, 57: 1041, 535: 1041, 537: 1041, 544: 1041, 547: 1041, 555: 1041, 1041, 565: 1041}, - {320: 3958}, - {1039, 1039, 57: 1039, 535: 1039, 537: 1039, 544: 1039, 547: 1039, 555: 1039, 1039, 565: 1039}, - {1045, 1045, 57: 1045, 194: 3960, 198: 3962, 227: 3961, 535: 1045, 537: 1045, 544: 1045, 547: 1045, 555: 1045, 1045, 565: 1045}, + {1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 585: 1268, 1268, 1268, 1268, 1268, 1268, 593: 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 632: 1268, 637: 1268, 1268, 1268, 1268, 651: 1268, 660: 1268, 1268, 706: 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 721: 1268, 725: 1268, 727: 1268, 1268, 1268, 732: 1268, 1268, 1268, 1268, 1268, 745: 1268, 770: 1268, 1268, 1268, 1268, 1268, 1268, 1268}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 3963, 3072, 3073, 3071}, + {1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 585: 1269, 1269, 1269, 1269, 1269, 1269, 593: 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 632: 1269, 637: 1269, 1269, 1269, 1269, 651: 1269, 660: 1269, 1269, 706: 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 721: 1269, 725: 1269, 727: 1269, 1269, 1269, 732: 1269, 1269, 1269, 1269, 1269, 745: 1269, 770: 1269, 1269, 1269, 1269, 1269, 1269, 1269}, + {1049, 1049, 57: 1049, 535: 1049, 537: 1049, 544: 1049, 547: 1049, 555: 1049, 1049, 564: 1049}, + {322: 3966}, // 1090 - {1043, 1043, 57: 1043, 535: 1043, 537: 1043, 544: 1043, 547: 1043, 555: 1043, 1043, 565: 1043}, - {564: 3053, 805: 3964}, - {320: 3963}, - {1040, 1040, 57: 1040, 535: 1040, 537: 1040, 544: 1040, 547: 1040, 555: 1040, 1040, 565: 1040}, - {1042, 1042, 57: 1042, 535: 1042, 537: 1042, 544: 1042, 547: 1042, 555: 1042, 1042, 565: 1042}, + {1047, 1047, 57: 1047, 535: 1047, 537: 1047, 544: 1047, 547: 1047, 555: 1047, 1047, 564: 1047}, + {1053, 1053, 57: 1053, 195: 3968, 198: 3970, 227: 3969, 535: 1053, 537: 1053, 544: 1053, 547: 1053, 555: 1053, 1053, 564: 1053}, + {1051, 1051, 57: 1051, 535: 1051, 537: 1051, 544: 1051, 547: 1051, 555: 1051, 1051, 564: 1051}, + {567: 3058, 805: 3972}, + {322: 3971}, // 1095 - {1206, 1206, 57: 1206, 535: 1206, 537: 1206, 544: 1206, 547: 1206, 555: 1206, 1206}, - {1420: 3967}, - {538: 3968}, - {262, 262, 57: 262, 131: 3972, 154: 3971, 535: 262, 537: 262, 544: 262, 547: 262, 555: 262, 262, 727: 262, 936: 3970, 1179: 3969}, - {247, 247, 57: 247, 535: 247, 537: 247, 544: 247, 547: 247, 555: 247, 247, 727: 4000, 1062: 3999}, + {1048, 1048, 57: 1048, 535: 1048, 537: 1048, 544: 1048, 547: 1048, 555: 1048, 1048, 564: 1048}, + {1050, 1050, 57: 1050, 535: 1050, 537: 1050, 544: 1050, 547: 1050, 555: 1050, 1050, 564: 1050}, + {1214, 1214, 57: 1214, 535: 1214, 537: 1214, 544: 1214, 547: 1214, 555: 1214, 1214}, + {1419: 3975}, + {538: 3976}, // 1100 - {135: 3979, 858: 3975, 862: 3977, 868: 3978, 870: 3976, 1178: 3974, 1367: 3973}, - {260, 260, 17: 260, 58: 260, 60: 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 135: 260, 535: 260, 260, 566: 260, 611: 260, 718: 260, 858: 260, 862: 260, 868: 260, 870: 260}, - {259, 259, 17: 259, 58: 259, 60: 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 135: 259, 535: 259, 259, 566: 259, 611: 259, 718: 259, 858: 259, 862: 259, 868: 259, 870: 259}, - {261, 261, 57: 261, 135: 3979, 535: 261, 261, 261, 544: 261, 547: 261, 554: 261, 261, 261, 560: 261, 727: 261, 858: 3975, 862: 3977, 868: 3978, 870: 3976, 1178: 3998}, - {257, 257, 57: 257, 135: 257, 535: 257, 257, 257, 544: 257, 547: 257, 554: 257, 257, 257, 560: 257, 727: 257, 858: 257, 862: 257, 868: 257, 870: 257}, + {268, 268, 57: 268, 131: 3980, 157: 3979, 535: 268, 537: 268, 544: 268, 547: 268, 555: 268, 268, 727: 268, 938: 3978, 1181: 3977}, + {253, 253, 57: 253, 535: 253, 537: 253, 544: 253, 547: 253, 555: 253, 253, 727: 4008, 1063: 4007}, + {136: 3987, 858: 3983, 862: 3985, 868: 3986, 870: 3984, 1180: 3982, 1365: 3981}, + {266, 266, 17: 266, 58: 266, 60: 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 136: 266, 535: 266, 266, 566: 266, 611: 266, 718: 266, 858: 266, 862: 266, 868: 266, 870: 266}, + {265, 265, 17: 265, 58: 265, 60: 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 136: 265, 535: 265, 265, 566: 265, 611: 265, 718: 265, 858: 265, 862: 265, 868: 265, 870: 265}, // 1105 - {728: 3996}, - {538: 3990, 643: 3991, 645: 3992, 962: 3995}, - {728: 3993}, - {728: 3988}, - {553: 3980}, + {267, 267, 57: 267, 136: 3987, 535: 267, 267, 267, 544: 267, 547: 267, 554: 267, 267, 267, 561: 267, 727: 267, 858: 3983, 862: 3985, 868: 3986, 870: 3984, 1180: 4006}, + {263, 263, 57: 263, 136: 263, 535: 263, 263, 263, 544: 263, 547: 263, 554: 263, 263, 263, 561: 263, 727: 263, 858: 263, 862: 263, 868: 263, 870: 263}, + {728: 4004}, + {538: 3998, 643: 3999, 645: 4000, 964: 4003}, + {728: 4001}, // 1110 - {728: 3981}, - {538: 3982, 643: 3983, 645: 3984, 1027: 3985}, - {440, 440, 9: 440, 57: 440, 135: 440, 535: 440, 440, 440, 544: 440, 547: 440, 554: 440, 440, 440, 560: 440, 727: 440, 858: 440, 862: 440, 868: 440, 870: 440, 1013: 440}, - {439, 439, 9: 439, 57: 439, 135: 439, 535: 439, 439, 439, 544: 439, 547: 439, 554: 439, 439, 439, 560: 439, 727: 439, 858: 439, 862: 439, 868: 439, 870: 439, 1013: 439}, - {438, 438, 9: 438, 57: 438, 135: 438, 535: 438, 438, 438, 544: 438, 547: 438, 554: 438, 438, 438, 560: 438, 727: 438, 858: 438, 862: 438, 868: 438, 870: 438, 1013: 438}, + {728: 3996}, + {553: 3988}, + {728: 3989}, + {538: 3990, 643: 3991, 645: 3992, 1028: 3993}, + {447, 447, 9: 447, 57: 447, 136: 447, 535: 447, 447, 447, 544: 447, 547: 447, 554: 447, 447, 447, 561: 447, 727: 447, 858: 447, 862: 447, 868: 447, 870: 447, 1015: 447}, // 1115 - {252, 252, 57: 252, 135: 252, 535: 252, 252, 252, 544: 252, 547: 252, 554: 252, 252, 252, 560: 252, 727: 252, 858: 252, 862: 252, 868: 252, 870: 252, 1013: 3986}, - {862: 3987}, - {251, 251, 57: 251, 135: 251, 535: 251, 251, 251, 544: 251, 547: 251, 554: 251, 251, 251, 560: 251, 727: 251, 858: 251, 862: 251, 868: 251, 870: 251}, - {538: 3990, 643: 3991, 645: 3992, 962: 3989}, - {253, 253, 57: 253, 135: 253, 535: 253, 253, 253, 544: 253, 547: 253, 554: 253, 253, 253, 560: 253, 727: 253, 858: 253, 862: 253, 868: 253, 870: 253}, + {446, 446, 9: 446, 57: 446, 136: 446, 535: 446, 446, 446, 544: 446, 547: 446, 554: 446, 446, 446, 561: 446, 727: 446, 858: 446, 862: 446, 868: 446, 870: 446, 1015: 446}, + {445, 445, 9: 445, 57: 445, 136: 445, 535: 445, 445, 445, 544: 445, 547: 445, 554: 445, 445, 445, 561: 445, 727: 445, 858: 445, 862: 445, 868: 445, 870: 445, 1015: 445}, + {258, 258, 57: 258, 136: 258, 535: 258, 258, 258, 544: 258, 547: 258, 554: 258, 258, 258, 561: 258, 727: 258, 858: 258, 862: 258, 868: 258, 870: 258, 1015: 3994}, + {862: 3995}, + {257, 257, 57: 257, 136: 257, 535: 257, 257, 257, 544: 257, 547: 257, 554: 257, 257, 257, 561: 257, 727: 257, 858: 257, 862: 257, 868: 257, 870: 257}, // 1120 - {250, 250, 57: 250, 135: 250, 535: 250, 250, 250, 544: 250, 547: 250, 554: 250, 250, 250, 560: 250, 727: 250, 858: 250, 862: 250, 868: 250, 870: 250}, - {249, 249, 57: 249, 135: 249, 535: 249, 249, 249, 544: 249, 547: 249, 554: 249, 249, 249, 560: 249, 727: 249, 858: 249, 862: 249, 868: 249, 870: 249}, - {248, 248, 57: 248, 135: 248, 535: 248, 248, 248, 544: 248, 547: 248, 554: 248, 248, 248, 560: 248, 727: 248, 858: 248, 862: 248, 868: 248, 870: 248}, - {538: 3990, 643: 3991, 645: 3992, 962: 3994}, - {254, 254, 57: 254, 135: 254, 535: 254, 254, 254, 544: 254, 547: 254, 554: 254, 254, 254, 560: 254, 727: 254, 858: 254, 862: 254, 868: 254, 870: 254}, + {538: 3998, 643: 3999, 645: 4000, 964: 3997}, + {259, 259, 57: 259, 136: 259, 535: 259, 259, 259, 544: 259, 547: 259, 554: 259, 259, 259, 561: 259, 727: 259, 858: 259, 862: 259, 868: 259, 870: 259}, + {256, 256, 57: 256, 136: 256, 535: 256, 256, 256, 544: 256, 547: 256, 554: 256, 256, 256, 561: 256, 727: 256, 858: 256, 862: 256, 868: 256, 870: 256}, + {255, 255, 57: 255, 136: 255, 535: 255, 255, 255, 544: 255, 547: 255, 554: 255, 255, 255, 561: 255, 727: 255, 858: 255, 862: 255, 868: 255, 870: 255}, + {254, 254, 57: 254, 136: 254, 535: 254, 254, 254, 544: 254, 547: 254, 554: 254, 254, 254, 561: 254, 727: 254, 858: 254, 862: 254, 868: 254, 870: 254}, // 1125 - {255, 255, 57: 255, 135: 255, 535: 255, 255, 255, 544: 255, 547: 255, 554: 255, 255, 255, 560: 255, 727: 255, 858: 255, 862: 255, 868: 255, 870: 255}, - {538: 3990, 643: 3991, 645: 3992, 962: 3997}, - {256, 256, 57: 256, 135: 256, 535: 256, 256, 256, 544: 256, 547: 256, 554: 256, 256, 256, 560: 256, 727: 256, 858: 256, 862: 256, 868: 256, 870: 256}, - {258, 258, 57: 258, 135: 258, 535: 258, 258, 258, 544: 258, 547: 258, 554: 258, 258, 258, 560: 258, 727: 258, 858: 258, 862: 258, 868: 258, 870: 258}, - {1051, 1051, 57: 1051, 535: 1051, 537: 1051, 544: 1051, 547: 1051, 555: 1051, 1051}, + {538: 3998, 643: 3999, 645: 4000, 964: 4002}, + {260, 260, 57: 260, 136: 260, 535: 260, 260, 260, 544: 260, 547: 260, 554: 260, 260, 260, 561: 260, 727: 260, 858: 260, 862: 260, 868: 260, 870: 260}, + {261, 261, 57: 261, 136: 261, 535: 261, 261, 261, 544: 261, 547: 261, 554: 261, 261, 261, 561: 261, 727: 261, 858: 261, 862: 261, 868: 261, 870: 261}, + {538: 3998, 643: 3999, 645: 4000, 964: 4005}, + {262, 262, 57: 262, 136: 262, 535: 262, 262, 262, 544: 262, 547: 262, 554: 262, 262, 262, 561: 262, 727: 262, 858: 262, 862: 262, 868: 262, 870: 262}, // 1130 - {245, 245, 57: 245, 535: 245, 245, 245, 544: 245, 547: 245, 554: 245, 245, 245, 560: 245, 858: 245, 1473: 4001, 4002}, - {243, 243, 57: 243, 535: 243, 243, 243, 544: 243, 547: 243, 554: 243, 243, 243, 560: 243, 858: 4006, 1392: 4005}, - {728: 4003}, - {538: 3990, 643: 3991, 645: 3992, 962: 4004}, - {244, 244, 57: 244, 535: 244, 244, 244, 544: 244, 547: 244, 554: 244, 244, 244, 560: 244, 858: 244}, + {264, 264, 57: 264, 136: 264, 535: 264, 264, 264, 544: 264, 547: 264, 554: 264, 264, 264, 561: 264, 727: 264, 858: 264, 862: 264, 868: 264, 870: 264}, + {1059, 1059, 57: 1059, 535: 1059, 537: 1059, 544: 1059, 547: 1059, 555: 1059, 1059}, + {251, 251, 57: 251, 535: 251, 251, 251, 544: 251, 547: 251, 554: 251, 251, 251, 561: 251, 858: 251, 1473: 4009, 4010}, + {249, 249, 57: 249, 535: 249, 249, 249, 544: 249, 547: 249, 554: 249, 249, 249, 561: 249, 858: 4014, 1391: 4013}, + {728: 4011}, // 1135 - {246, 246, 57: 246, 535: 246, 246, 246, 544: 246, 547: 246, 554: 246, 246, 246, 560: 246}, - {728: 4007}, - {538: 3990, 643: 3991, 645: 3992, 962: 4008}, - {242, 242, 57: 242, 535: 242, 242, 242, 544: 242, 547: 242, 554: 242, 242, 242, 560: 242}, - {57: 4010}, + {538: 3998, 643: 3999, 645: 4000, 964: 4012}, + {250, 250, 57: 250, 535: 250, 250, 250, 544: 250, 547: 250, 554: 250, 250, 250, 561: 250, 858: 250}, + {252, 252, 57: 252, 535: 252, 252, 252, 544: 252, 547: 252, 554: 252, 252, 252, 561: 252}, + {728: 4015}, + {538: 3998, 643: 3999, 645: 4000, 964: 4016}, // 1140 - {1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 537: 1458, 1458, 1458, 541: 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 554: 1458, 1458, 1458, 559: 1458, 1458, 1458, 1458, 1458, 565: 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 584: 1458, 1458, 1458, 1458, 1458, 1458, 1458, 593: 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 615: 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 625: 1458, 1458, 1458, 1458, 1458, 1458, 632: 1458, 637: 1458, 1458, 1458, 1458, 661: 1458, 707: 1458}, - {1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 541: 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 552: 1047, 554: 1047, 1047, 1047, 559: 1047, 1047, 1047, 1047, 1047, 565: 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 584: 1047, 1047, 1047, 1047, 1047, 1047, 1047, 593: 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 625: 1047, 1047, 1047, 1047, 1047, 1047, 632: 1047, 637: 1047, 1047, 1047, 1047, 661: 1047, 701: 1047, 707: 1047, 719: 1047, 809: 1047}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 4014}, - {2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 537: 2164, 2164, 542: 2164, 544: 2164, 2164, 2164, 2164, 554: 2164, 2164, 2164, 559: 2164, 2164, 2164, 2164, 2164, 565: 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 585: 2164, 2164, 2164, 2164, 590: 2164, 593: 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 612: 2164, 622: 2164, 2164, 625: 2164, 2164, 2164, 2164, 2164, 2164}, - {2202, 2202, 9: 2202, 57: 2202, 160: 2202, 547: 2202, 569: 2202, 571: 3767, 3765, 3766, 3764, 3762, 806: 3763, 3761}, + {248, 248, 57: 248, 535: 248, 248, 248, 544: 248, 547: 248, 554: 248, 248, 248, 561: 248}, + {57: 4018}, + {1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 537: 1467, 1467, 1467, 541: 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 554: 1467, 1467, 1467, 559: 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 568: 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 585: 1467, 1467, 1467, 1467, 1467, 1467, 593: 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 614: 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 632: 1467, 637: 1467, 1467, 1467, 1467, 661: 1467, 707: 1467}, + {1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 541: 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 552: 1055, 554: 1055, 1055, 1055, 559: 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 568: 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 585: 1055, 1055, 1055, 1055, 1055, 1055, 593: 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 632: 1055, 637: 1055, 1055, 1055, 1055, 660: 1055, 1055, 707: 1055, 719: 1055, 809: 1055}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 4022}, // 1145 - {2: 2178, 2178, 2178, 2178, 2178, 2178, 2178, 10: 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 58: 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 536: 2178, 538: 2178, 2178, 2178, 545: 2178, 2178, 548: 2178, 2178, 2178, 552: 2178, 2178, 557: 2178, 2178, 564: 2178, 583: 2178, 591: 2178, 2178, 624: 2178, 631: 2178, 633: 2178, 2178, 2178, 2178, 641: 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 662: 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 702: 2178, 2178, 2178, 2178}, - {536: 2174}, - {2: 2172, 2172, 2172, 2172, 2172, 2172, 2172, 10: 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 58: 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 536: 2172, 538: 2172, 2172, 2172, 545: 2172, 2172, 548: 2172, 2172, 2172, 552: 2172, 2172, 557: 2172, 2172, 564: 2172, 583: 2172, 591: 2172, 2172, 624: 2172, 631: 2172, 633: 2172, 2172, 2172, 2172, 641: 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 662: 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 702: 2172, 2172, 2172, 2172}, - {2: 2170, 2170, 2170, 2170, 2170, 2170, 2170, 10: 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 58: 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 536: 2170, 538: 2170, 2170, 2170, 545: 2170, 2170, 548: 2170, 2170, 2170, 552: 2170, 2170, 557: 2170, 2170, 564: 2170, 583: 2170, 591: 2170, 2170, 624: 2170, 631: 2170, 633: 2170, 2170, 2170, 2170, 641: 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 662: 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 702: 2170, 2170, 2170, 2170}, - {2: 2168, 2168, 2168, 2168, 2168, 2168, 2168, 10: 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 58: 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 536: 2168, 538: 2168, 2168, 2168, 545: 2168, 2168, 548: 2168, 2168, 2168, 552: 2168, 2168, 557: 2168, 2168, 564: 2168, 583: 2168, 591: 2168, 2168, 624: 2168, 631: 2168, 633: 2168, 2168, 2168, 2168, 641: 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 662: 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 702: 2168, 2168, 2168, 2168}, + {2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 537: 2173, 2173, 542: 2173, 544: 2173, 2173, 2173, 2173, 554: 2173, 2173, 2173, 559: 2173, 2173, 2173, 2173, 2173, 2173, 566: 2173, 568: 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 586: 2173, 2173, 2173, 2173, 2173, 593: 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 612: 2173, 622: 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173}, + {2211, 2211, 9: 2211, 57: 2211, 162: 2211, 547: 2211, 570: 2211, 572: 3772, 3770, 3771, 3769, 3767, 806: 3768, 3766}, + {2: 2187, 2187, 2187, 2187, 2187, 2187, 2187, 10: 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 58: 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 536: 2187, 538: 2187, 2187, 2187, 545: 2187, 2187, 548: 2187, 2187, 2187, 552: 2187, 2187, 557: 2187, 2187, 567: 2187, 584: 2187, 591: 2187, 2187, 630: 2187, 2187, 633: 2187, 2187, 2187, 2187, 641: 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 662: 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187}, + {536: 2183}, + {2: 2181, 2181, 2181, 2181, 2181, 2181, 2181, 10: 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 58: 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 536: 2181, 538: 2181, 2181, 2181, 545: 2181, 2181, 548: 2181, 2181, 2181, 552: 2181, 2181, 557: 2181, 2181, 567: 2181, 584: 2181, 591: 2181, 2181, 630: 2181, 2181, 633: 2181, 2181, 2181, 2181, 641: 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 662: 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181}, // 1150 - {226: 4043, 553: 4044, 634: 4042, 4041}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 4035, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 4036, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 4034, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 721: 4037, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 4032, 1325: 4033}, - {2: 2187, 2187, 2187, 2187, 2187, 2187, 2187, 10: 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 58: 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 536: 2187, 538: 2187, 2187, 2187, 545: 2187, 2187, 548: 2187, 2187, 2187, 552: 2187, 2187, 557: 2187, 2187, 564: 2187, 583: 2187, 591: 2187, 2187, 624: 2187, 631: 2187, 633: 2187, 2187, 2187, 2187, 641: 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 662: 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 702: 2187, 2187, 2187, 2187, 721: 2187}, - {2: 2186, 2186, 2186, 2186, 2186, 2186, 2186, 10: 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 58: 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 536: 2186, 538: 2186, 2186, 2186, 545: 2186, 2186, 548: 2186, 2186, 2186, 552: 2186, 2186, 557: 2186, 2186, 564: 2186, 583: 2186, 591: 2186, 2186, 624: 2186, 631: 2186, 633: 2186, 2186, 2186, 2186, 641: 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 662: 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 702: 2186, 2186, 2186, 2186, 721: 2186}, - {2: 2185, 2185, 2185, 2185, 2185, 2185, 2185, 10: 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 58: 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 536: 2185, 538: 2185, 2185, 2185, 545: 2185, 2185, 548: 2185, 2185, 2185, 552: 2185, 2185, 557: 2185, 2185, 564: 2185, 583: 2185, 591: 2185, 2185, 624: 2185, 631: 2185, 633: 2185, 2185, 2185, 2185, 641: 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 662: 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 702: 2185, 2185, 2185, 2185, 721: 2185}, + {2: 2179, 2179, 2179, 2179, 2179, 2179, 2179, 10: 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 58: 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 536: 2179, 538: 2179, 2179, 2179, 545: 2179, 2179, 548: 2179, 2179, 2179, 552: 2179, 2179, 557: 2179, 2179, 567: 2179, 584: 2179, 591: 2179, 2179, 630: 2179, 2179, 633: 2179, 2179, 2179, 2179, 641: 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 662: 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179}, + {2: 2177, 2177, 2177, 2177, 2177, 2177, 2177, 10: 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 58: 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 536: 2177, 538: 2177, 2177, 2177, 545: 2177, 2177, 548: 2177, 2177, 2177, 552: 2177, 2177, 557: 2177, 2177, 567: 2177, 584: 2177, 591: 2177, 2177, 630: 2177, 2177, 633: 2177, 2177, 2177, 2177, 641: 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 662: 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177}, + {226: 4051, 553: 4052, 634: 4050, 4049}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 4043, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 4044, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 4042, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 721: 4045, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 4040, 1323: 4041}, + {2: 2196, 2196, 2196, 2196, 2196, 2196, 2196, 10: 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 58: 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 536: 2196, 538: 2196, 2196, 2196, 545: 2196, 2196, 548: 2196, 2196, 2196, 552: 2196, 2196, 557: 2196, 2196, 567: 2196, 584: 2196, 591: 2196, 2196, 630: 2196, 2196, 633: 2196, 2196, 2196, 2196, 641: 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 662: 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 721: 2196}, // 1155 - {2: 2184, 2184, 2184, 2184, 2184, 2184, 2184, 10: 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 58: 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 536: 2184, 538: 2184, 2184, 2184, 545: 2184, 2184, 548: 2184, 2184, 2184, 552: 2184, 2184, 557: 2184, 2184, 564: 2184, 583: 2184, 591: 2184, 2184, 624: 2184, 631: 2184, 633: 2184, 2184, 2184, 2184, 641: 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 662: 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 702: 2184, 2184, 2184, 2184, 721: 2184}, - {2: 2183, 2183, 2183, 2183, 2183, 2183, 2183, 10: 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 58: 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 536: 2183, 538: 2183, 2183, 2183, 545: 2183, 2183, 548: 2183, 2183, 2183, 552: 2183, 2183, 557: 2183, 2183, 564: 2183, 583: 2183, 591: 2183, 2183, 624: 2183, 631: 2183, 633: 2183, 2183, 2183, 2183, 641: 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 662: 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 702: 2183, 2183, 2183, 2183, 721: 2183}, - {2: 2182, 2182, 2182, 2182, 2182, 2182, 2182, 10: 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 58: 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 536: 2182, 538: 2182, 2182, 2182, 545: 2182, 2182, 548: 2182, 2182, 2182, 552: 2182, 2182, 557: 2182, 2182, 564: 2182, 583: 2182, 591: 2182, 2182, 624: 2182, 631: 2182, 633: 2182, 2182, 2182, 2182, 641: 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 662: 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 702: 2182, 2182, 2182, 2182, 721: 2182}, - {2: 2181, 2181, 2181, 2181, 2181, 2181, 2181, 10: 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 58: 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 536: 2181, 538: 2181, 2181, 2181, 545: 2181, 2181, 548: 2181, 2181, 2181, 552: 2181, 2181, 557: 2181, 2181, 564: 2181, 583: 2181, 591: 2181, 2181, 624: 2181, 631: 2181, 633: 2181, 2181, 2181, 2181, 641: 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 662: 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 702: 2181, 2181, 2181, 2181, 721: 2181}, - {2: 2180, 2180, 2180, 2180, 2180, 2180, 2180, 10: 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 58: 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 536: 2180, 538: 2180, 2180, 2180, 545: 2180, 2180, 548: 2180, 2180, 2180, 552: 2180, 2180, 557: 2180, 2180, 564: 2180, 583: 2180, 591: 2180, 2180, 624: 2180, 631: 2180, 633: 2180, 2180, 2180, 2180, 641: 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 662: 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 702: 2180, 2180, 2180, 2180, 721: 2180}, + {2: 2195, 2195, 2195, 2195, 2195, 2195, 2195, 10: 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 58: 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 536: 2195, 538: 2195, 2195, 2195, 545: 2195, 2195, 548: 2195, 2195, 2195, 552: 2195, 2195, 557: 2195, 2195, 567: 2195, 584: 2195, 591: 2195, 2195, 630: 2195, 2195, 633: 2195, 2195, 2195, 2195, 641: 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 662: 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 721: 2195}, + {2: 2194, 2194, 2194, 2194, 2194, 2194, 2194, 10: 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 58: 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 536: 2194, 538: 2194, 2194, 2194, 545: 2194, 2194, 548: 2194, 2194, 2194, 552: 2194, 2194, 557: 2194, 2194, 567: 2194, 584: 2194, 591: 2194, 2194, 630: 2194, 2194, 633: 2194, 2194, 2194, 2194, 641: 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 662: 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 721: 2194}, + {2: 2193, 2193, 2193, 2193, 2193, 2193, 2193, 10: 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 58: 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 536: 2193, 538: 2193, 2193, 2193, 545: 2193, 2193, 548: 2193, 2193, 2193, 552: 2193, 2193, 557: 2193, 2193, 567: 2193, 584: 2193, 591: 2193, 2193, 630: 2193, 2193, 633: 2193, 2193, 2193, 2193, 641: 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 662: 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 721: 2193}, + {2: 2192, 2192, 2192, 2192, 2192, 2192, 2192, 10: 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 58: 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 536: 2192, 538: 2192, 2192, 2192, 545: 2192, 2192, 548: 2192, 2192, 2192, 552: 2192, 2192, 557: 2192, 2192, 567: 2192, 584: 2192, 591: 2192, 2192, 630: 2192, 2192, 633: 2192, 2192, 2192, 2192, 641: 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 662: 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 721: 2192}, + {2: 2191, 2191, 2191, 2191, 2191, 2191, 2191, 10: 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 58: 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 536: 2191, 538: 2191, 2191, 2191, 545: 2191, 2191, 548: 2191, 2191, 2191, 552: 2191, 2191, 557: 2191, 2191, 567: 2191, 584: 2191, 591: 2191, 2191, 630: 2191, 2191, 633: 2191, 2191, 2191, 2191, 641: 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 662: 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 721: 2191}, // 1160 - {226: 2177, 539: 3834, 541: 3833, 553: 2177, 634: 2177, 2177, 921: 4031}, - {226: 2176, 553: 2176, 634: 2176, 2176}, - {2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 537: 2191, 2191, 542: 2191, 544: 2191, 2191, 2191, 2191, 554: 2191, 2191, 2191, 559: 2191, 2191, 2191, 2191, 2191, 565: 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 585: 2191, 2191, 2191, 2191, 590: 2191, 593: 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 612: 2191, 622: 2191, 2191, 625: 2191, 2191, 2191, 2191, 2191, 2191}, - {536: 2923, 781: 4040}, - {953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 537: 953, 953, 953, 541: 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 554: 953, 953, 953, 559: 953, 953, 953, 953, 953, 565: 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 584: 953, 953, 953, 953, 953, 953, 953, 593: 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 615: 953, 953, 953, 953, 953, 953, 953, 953, 953, 625: 953, 953, 953, 953, 953, 953, 632: 953, 637: 953, 953, 953, 953, 707: 953, 722: 4038}, + {2: 2190, 2190, 2190, 2190, 2190, 2190, 2190, 10: 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 58: 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 536: 2190, 538: 2190, 2190, 2190, 545: 2190, 2190, 548: 2190, 2190, 2190, 552: 2190, 2190, 557: 2190, 2190, 567: 2190, 584: 2190, 591: 2190, 2190, 630: 2190, 2190, 633: 2190, 2190, 2190, 2190, 641: 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 662: 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 721: 2190}, + {2: 2189, 2189, 2189, 2189, 2189, 2189, 2189, 10: 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 58: 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 536: 2189, 538: 2189, 2189, 2189, 545: 2189, 2189, 548: 2189, 2189, 2189, 552: 2189, 2189, 557: 2189, 2189, 567: 2189, 584: 2189, 591: 2189, 2189, 630: 2189, 2189, 633: 2189, 2189, 2189, 2189, 641: 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 662: 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 721: 2189}, + {226: 2186, 539: 3839, 541: 3838, 553: 2186, 634: 2186, 2186, 923: 4039}, + {226: 2185, 553: 2185, 634: 2185, 2185}, + {2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 537: 2200, 2200, 542: 2200, 544: 2200, 2200, 2200, 2200, 554: 2200, 2200, 2200, 559: 2200, 2200, 2200, 2200, 2200, 2200, 566: 2200, 568: 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 586: 2200, 2200, 2200, 2200, 2200, 593: 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 612: 2200, 622: 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200}, // 1165 - {1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 2167, 1977, 1977, 1977, 541: 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 554: 1977, 1977, 1977, 559: 1977, 1977, 1977, 1977, 1977, 565: 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 584: 1977, 1977, 1977, 1977, 1977, 1977, 1977, 593: 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 615: 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 625: 1977, 1977, 1977, 1977, 1977, 1977, 632: 1977, 637: 1977, 1977, 1977, 1977, 707: 1977, 720: 1977, 723: 1977, 1977}, - {1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 2166, 1976, 1976, 1976, 541: 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 554: 1976, 1976, 1976, 559: 1976, 1976, 1976, 1976, 1976, 565: 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 584: 1976, 1976, 1976, 1976, 1976, 1976, 1976, 593: 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 615: 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 625: 1976, 1976, 1976, 1976, 1976, 1976, 632: 1976, 637: 1976, 1976, 1976, 1976, 707: 1976, 720: 1976, 723: 1976, 1976}, - {536: 2165}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3703, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 4039}, - {2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 537: 2189, 2189, 542: 2189, 544: 2189, 2189, 2189, 2189, 554: 2189, 2189, 2189, 559: 2189, 2189, 2189, 2189, 2189, 565: 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 585: 2189, 2189, 2189, 2189, 590: 2189, 593: 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 612: 2189, 622: 2189, 2189, 625: 2189, 2189, 2189, 2189, 2189, 2189}, + {536: 2929, 781: 4048}, + {961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 537: 961, 961, 961, 541: 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 554: 961, 961, 961, 559: 961, 961, 961, 961, 961, 961, 961, 961, 568: 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 585: 961, 961, 961, 961, 961, 961, 593: 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 614: 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 632: 961, 637: 961, 961, 961, 961, 707: 961, 722: 4046}, + {1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 2176, 1986, 1986, 1986, 541: 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 554: 1986, 1986, 1986, 559: 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 568: 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 585: 1986, 1986, 1986, 1986, 1986, 1986, 593: 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 614: 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 632: 1986, 637: 1986, 1986, 1986, 1986, 707: 1986, 720: 1986, 723: 1986, 1986}, + {1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 2175, 1985, 1985, 1985, 541: 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 554: 1985, 1985, 1985, 559: 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 568: 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 585: 1985, 1985, 1985, 1985, 1985, 1985, 593: 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 614: 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 632: 1985, 637: 1985, 1985, 1985, 1985, 707: 1985, 720: 1985, 723: 1985, 1985}, + {536: 2174}, // 1170 - {2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 537: 2190, 2190, 542: 2190, 544: 2190, 2190, 2190, 2190, 554: 2190, 2190, 2190, 559: 2190, 2190, 2190, 2190, 2190, 565: 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 585: 2190, 2190, 2190, 2190, 590: 2190, 593: 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 612: 2190, 622: 2190, 2190, 625: 2190, 2190, 2190, 2190, 2190, 2190}, - {2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 537: 2220, 2220, 542: 2220, 544: 2220, 2220, 2220, 2220, 554: 2220, 2220, 2220, 559: 2220, 2220, 562: 2220, 2220, 565: 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 585: 2220, 2220, 2220, 2220, 590: 2220, 593: 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 612: 2220}, - {2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 537: 2219, 2219, 542: 2219, 544: 2219, 2219, 2219, 2219, 554: 2219, 2219, 2219, 559: 2219, 2219, 562: 2219, 2219, 565: 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 585: 2219, 2219, 2219, 2219, 590: 2219, 593: 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 612: 2219}, - {2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 537: 2218, 2218, 542: 2218, 544: 2218, 2218, 2218, 2218, 554: 2218, 2218, 2218, 559: 2218, 2218, 562: 2218, 2218, 565: 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 585: 2218, 2218, 2218, 2218, 590: 2218, 593: 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 612: 2218}, - {2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 537: 2192, 2192, 542: 2192, 544: 2192, 2192, 2192, 2192, 554: 2192, 2192, 2192, 559: 2192, 2192, 2192, 2192, 2192, 565: 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 585: 2192, 2192, 2192, 2192, 590: 2192, 593: 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 612: 2192, 622: 2192, 2192, 625: 2192, 2192, 2192, 2192, 2192, 2192}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3708, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 4047}, + {2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 537: 2198, 2198, 542: 2198, 544: 2198, 2198, 2198, 2198, 554: 2198, 2198, 2198, 559: 2198, 2198, 2198, 2198, 2198, 2198, 566: 2198, 568: 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 586: 2198, 2198, 2198, 2198, 2198, 593: 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 612: 2198, 622: 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198}, + {2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 537: 2199, 2199, 542: 2199, 544: 2199, 2199, 2199, 2199, 554: 2199, 2199, 2199, 559: 2199, 2199, 2199, 2199, 2199, 2199, 566: 2199, 568: 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 586: 2199, 2199, 2199, 2199, 2199, 593: 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 612: 2199, 622: 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199}, + {2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 537: 2229, 2229, 542: 2229, 544: 2229, 2229, 2229, 2229, 554: 2229, 2229, 2229, 559: 2229, 2229, 2229, 563: 2229, 2229, 566: 2229, 568: 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 586: 2229, 2229, 2229, 2229, 2229, 593: 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 612: 2229}, + {2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 537: 2228, 2228, 542: 2228, 544: 2228, 2228, 2228, 2228, 554: 2228, 2228, 2228, 559: 2228, 2228, 2228, 563: 2228, 2228, 566: 2228, 568: 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 586: 2228, 2228, 2228, 2228, 2228, 593: 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 612: 2228}, // 1175 - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 4046, 3067, 3068, 3066, 827: 4047, 912: 4048}, - {2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 536: 2626, 551: 2626, 558: 2626, 560: 2626, 2626, 2626, 582: 2626, 591: 2626, 610: 2626, 714: 2626, 720: 4069, 722: 2626, 732: 2626, 2626, 735: 2626, 737: 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 749: 2626, 2626, 753: 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626}, - {9: 2623, 57: 2623}, - {9: 4049, 57: 4050}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 4046, 3067, 3068, 3066, 827: 4068}, + {2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 537: 2227, 2227, 542: 2227, 544: 2227, 2227, 2227, 2227, 554: 2227, 2227, 2227, 559: 2227, 2227, 2227, 563: 2227, 2227, 566: 2227, 568: 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 586: 2227, 2227, 2227, 2227, 2227, 593: 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 612: 2227}, + {2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 537: 2201, 2201, 542: 2201, 544: 2201, 2201, 2201, 2201, 554: 2201, 2201, 2201, 559: 2201, 2201, 2201, 2201, 2201, 2201, 566: 2201, 568: 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 586: 2201, 2201, 2201, 2201, 2201, 593: 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 612: 2201, 622: 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 4054, 3072, 3073, 3071, 828: 4055, 912: 4056}, + {2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 536: 2632, 551: 2632, 558: 2632, 560: 2632, 2632, 2632, 583: 2632, 591: 2632, 610: 2632, 714: 2632, 720: 4077, 722: 2632, 732: 2632, 2632, 735: 2632, 737: 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 746: 2632, 2632, 2632, 2632, 2632, 753: 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632}, + {9: 2629, 57: 2629}, // 1180 - {365: 4051}, - {536: 4052}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3703, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 4053}, - {57: 2212, 537: 4056, 548: 3804, 3805, 3810, 589: 3806, 611: 4055, 613: 3807, 615: 3808, 3801, 3811, 3800, 3809, 3802, 3803, 1373: 4054}, - {57: 4067}, + {9: 4057, 57: 4058}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 4054, 3072, 3073, 3071, 828: 4076}, + {367: 4059}, + {536: 4060}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3708, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 4061}, // 1185 - {188: 4060, 585: 4059}, - {159: 4057}, - {307: 4058}, - {57: 2208}, - {404: 4062}, + {57: 2221, 537: 4064, 548: 3809, 3810, 3815, 565: 3811, 611: 4063, 614: 3812, 3813, 3806, 3816, 3805, 3814, 3807, 3808, 1371: 4062}, + {57: 4075}, + {189: 4068, 586: 4067}, + {161: 4065}, + {308: 4066}, // 1190 - {264: 4061}, - {57: 2209}, - {264: 4063}, - {57: 2211, 537: 4064}, - {159: 4065}, + {57: 2217}, + {404: 4070}, + {264: 4069}, + {57: 2218}, + {264: 4071}, // 1195 - {307: 4066}, - {57: 2210}, - {2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 537: 2221, 2221, 542: 2221, 544: 2221, 2221, 2221, 2221, 554: 2221, 2221, 2221, 559: 2221, 2221, 562: 2221, 2221, 565: 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 585: 2221, 2221, 2221, 2221, 590: 2221, 593: 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 612: 2221}, - {9: 2622, 57: 2622}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 4070, 3067, 3068, 3066}, + {57: 2220, 537: 4072}, + {161: 4073}, + {308: 4074}, + {57: 2219}, + {2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 537: 2230, 2230, 542: 2230, 544: 2230, 2230, 2230, 2230, 554: 2230, 2230, 2230, 559: 2230, 2230, 2230, 563: 2230, 2230, 566: 2230, 568: 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 586: 2230, 2230, 2230, 2230, 2230, 593: 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 612: 2230}, // 1200 - {2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 536: 2625, 551: 2625, 558: 2625, 560: 2625, 2625, 2625, 582: 2625, 591: 2625, 610: 2625, 714: 2625, 720: 4071, 722: 2625, 732: 2625, 2625, 735: 2625, 737: 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 749: 2625, 2625, 753: 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 4072, 3067, 3068, 3066}, - {2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 536: 2624, 551: 2624, 558: 2624, 560: 2624, 2624, 2624, 582: 2624, 591: 2624, 610: 2624, 714: 2624, 722: 2624, 732: 2624, 2624, 735: 2624, 737: 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 749: 2624, 2624, 753: 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2624}, - {2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 537: 2222, 2222, 542: 2222, 544: 2222, 2222, 2222, 2222, 554: 2222, 2222, 2222, 559: 2222, 2222, 562: 2222, 2222, 565: 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 585: 2222, 2222, 2222, 2222, 590: 2222, 593: 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 612: 2222, 806: 3763, 3761}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3703, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3637, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 4075, 3618, 3700, 3617, 3614}, + {9: 2628, 57: 2628}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 4078, 3072, 3073, 3071}, + {2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 536: 2631, 551: 2631, 558: 2631, 560: 2631, 2631, 2631, 583: 2631, 591: 2631, 610: 2631, 714: 2631, 720: 4079, 722: 2631, 732: 2631, 2631, 735: 2631, 737: 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 746: 2631, 2631, 2631, 2631, 2631, 753: 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 4080, 3072, 3073, 3071}, + {2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 536: 2630, 551: 2630, 558: 2630, 560: 2630, 2630, 2630, 583: 2630, 591: 2630, 610: 2630, 714: 2630, 722: 2630, 732: 2630, 2630, 735: 2630, 737: 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 746: 2630, 2630, 2630, 2630, 2630, 753: 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630}, // 1205 - {57: 4076, 543: 3714, 707: 3715}, - {184: 1141, 554: 1141, 566: 4078, 826: 1141, 1409: 4077}, - {184: 4082, 554: 4083, 826: 1144, 994: 4081}, - {10: 4079, 234: 4080}, - {184: 1140, 554: 1140, 826: 1140}, + {2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 537: 2231, 2231, 542: 2231, 544: 2231, 2231, 2231, 2231, 554: 2231, 2231, 2231, 559: 2231, 2231, 2231, 563: 2231, 2231, 566: 2231, 568: 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 586: 2231, 2231, 2231, 2231, 2231, 593: 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 612: 2231, 806: 3768, 3766}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3708, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3642, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 4083, 3623, 3705, 3622, 3619}, + {57: 4084, 543: 3719, 707: 3720}, + {184: 1149, 554: 1149, 566: 4086, 826: 1149, 1408: 4085}, + {184: 4090, 554: 4091, 826: 1152, 995: 4089}, // 1210 - {184: 1139, 554: 1139, 826: 1139}, - {826: 4086, 838: 4087}, - {328: 4085}, - {328: 4084}, - {826: 1142}, + {10: 4087, 234: 4088}, + {184: 1148, 554: 1148, 826: 1148}, + {184: 1147, 554: 1147, 826: 1147}, + {826: 4094, 838: 4095}, + {329: 4093}, // 1215 - {826: 1143}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 536: 4089, 777: 4088, 3067, 3068, 3066, 1032: 4091, 1312: 4092, 1514: 4090}, - {1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 537: 1150, 1150, 1150, 541: 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 554: 1150, 1150, 1150, 559: 1150, 1150, 1150, 1150, 1150, 565: 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 584: 1150, 1150, 1150, 1150, 1150, 1150, 1150, 593: 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 615: 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 625: 1150, 1150, 1150, 1150, 1150, 1150, 632: 1150, 637: 1150, 1150, 1150, 1150, 661: 1150, 707: 1150}, - {1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 537: 1192, 1192, 1192, 541: 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 554: 1192, 1192, 1192, 559: 1192, 1192, 1192, 1192, 1192, 565: 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 584: 1192, 1192, 1192, 1192, 1192, 1192, 1192, 593: 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 615: 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 625: 1192, 1192, 1192, 1192, 1192, 1192, 632: 1192, 637: 1192, 1192, 1192, 1192, 661: 1192, 707: 1192}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 1189, 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 551: 1189, 569: 1189, 593: 1189, 596: 1189, 598: 1189, 777: 4088, 3067, 3068, 3066, 1032: 4095, 1408: 4094, 1515: 4093}, + {329: 4092}, + {826: 1150}, + {826: 1151}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 536: 4097, 777: 4096, 3072, 3073, 3071, 1033: 4099, 1310: 4100, 1514: 4098}, + {1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 537: 1158, 1158, 1158, 541: 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 554: 1158, 1158, 1158, 559: 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 568: 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 585: 1158, 1158, 1158, 1158, 1158, 1158, 593: 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 614: 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 632: 1158, 637: 1158, 1158, 1158, 1158, 661: 1158, 707: 1158}, // 1220 - {1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 537: 1163, 1163, 1163, 541: 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 554: 1163, 1163, 1163, 559: 1163, 1163, 1163, 1163, 1163, 565: 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 584: 1163, 1163, 1163, 1163, 1163, 1163, 1163, 593: 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 615: 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 625: 1163, 1163, 1163, 1163, 1163, 1163, 632: 1163, 637: 1163, 1163, 1163, 1163, 661: 1163, 707: 1163}, - {1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 537: 1162, 1162, 1162, 541: 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 554: 1162, 1162, 1162, 559: 1162, 1162, 1162, 1162, 1162, 565: 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 584: 1162, 1162, 1162, 1162, 1162, 1162, 1162, 593: 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 615: 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 625: 1162, 1162, 1162, 1162, 1162, 1162, 632: 1162, 637: 1162, 1162, 1162, 1162, 661: 1162, 707: 1162}, - {1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 537: 1161, 1161, 1161, 541: 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 554: 1161, 1161, 1161, 559: 1161, 1161, 1161, 1161, 1161, 565: 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 584: 1161, 1161, 1161, 1161, 1161, 1161, 1161, 593: 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 615: 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 625: 1161, 1161, 1161, 1161, 1161, 1161, 632: 1161, 637: 1161, 1161, 1161, 1161, 661: 1161, 707: 1161}, - {57: 4142}, - {57: 1187, 551: 4097, 569: 1187, 593: 1187, 596: 1187, 598: 1187, 1412: 4096}, + {1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 537: 1200, 1200, 1200, 541: 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 554: 1200, 1200, 1200, 559: 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 568: 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 585: 1200, 1200, 1200, 1200, 1200, 1200, 593: 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 614: 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 632: 1200, 637: 1200, 1200, 1200, 1200, 661: 1200, 707: 1200}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 1197, 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 551: 1197, 570: 1197, 593: 1197, 596: 1197, 598: 1197, 777: 4096, 3072, 3073, 3071, 1033: 4103, 1407: 4102, 1515: 4101}, + {1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 537: 1171, 1171, 1171, 541: 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 554: 1171, 1171, 1171, 559: 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 568: 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 585: 1171, 1171, 1171, 1171, 1171, 1171, 593: 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 614: 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 632: 1171, 637: 1171, 1171, 1171, 1171, 661: 1171, 707: 1171}, + {1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 537: 1170, 1170, 1170, 541: 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 554: 1170, 1170, 1170, 559: 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 568: 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 585: 1170, 1170, 1170, 1170, 1170, 1170, 593: 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 614: 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 632: 1170, 637: 1170, 1170, 1170, 1170, 661: 1170, 707: 1170}, + {1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 537: 1169, 1169, 1169, 541: 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 554: 1169, 1169, 1169, 559: 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 568: 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 585: 1169, 1169, 1169, 1169, 1169, 1169, 593: 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 614: 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 632: 1169, 637: 1169, 1169, 1169, 1169, 661: 1169, 707: 1169}, // 1225 - {57: 1188, 551: 1188, 569: 1188, 593: 1188, 596: 1188, 598: 1188}, - {57: 1185, 569: 4101, 593: 1185, 596: 1185, 598: 1185, 1417: 4100}, - {728: 4098}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 3903, 979: 3905, 1006: 4099}, - {9: 3906, 57: 1186, 569: 1186, 593: 1186, 596: 1186, 598: 1186}, + {57: 4150}, + {57: 1195, 551: 4105, 570: 1195, 593: 1195, 596: 1195, 598: 1195, 1411: 4104}, + {57: 1196, 551: 1196, 570: 1196, 593: 1196, 596: 1196, 598: 1196}, + {57: 1193, 570: 4109, 593: 1193, 596: 1193, 598: 1193, 1416: 4108}, + {728: 4106}, // 1230 - {57: 1183, 593: 4106, 596: 4107, 598: 4108, 1416: 4104, 1513: 4105}, - {728: 4102}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 3903, 979: 3905, 1006: 4103}, - {9: 3906, 57: 1184, 593: 1184, 596: 1184, 598: 1184}, - {57: 1190}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 3908, 980: 3910, 1008: 4107}, + {9: 3911, 57: 1194, 570: 1194, 593: 1194, 596: 1194, 598: 1194}, + {57: 1191, 593: 4114, 596: 4115, 598: 4116, 1415: 4112, 1513: 4113}, + {728: 4110}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 3908, 980: 3910, 1008: 4111}, // 1235 - {189: 4119, 203: 4115, 564: 4109, 632: 4120, 641: 4111, 4110, 646: 4118, 4117, 922: 4116, 1103: 4113, 1511: 4114, 4112}, - {189: 1181, 203: 1181, 564: 1181, 632: 1181, 641: 1181, 1181, 646: 1181, 1181}, - {189: 1180, 203: 1180, 564: 1180, 632: 1180, 641: 1180, 1180, 646: 1180, 1180}, - {189: 1179, 203: 1179, 564: 1179, 632: 1179, 641: 1179, 1179, 646: 1179, 1179}, - {2507, 2507, 2507, 2507, 2507, 2507, 2507, 2507, 2507, 2507, 2507, 2507, 2507, 2507, 2507, 2507, 2507, 2507, 2507, 2507, 2507, 2507, 2507, 2507, 2507, 2507, 2507, 2507, 2507, 2507, 2507, 2507, 2507, 2507, 2507, 2507, 2507, 2507, 2507, 2507, 2507, 2507, 2507, 2507, 2507, 2507, 2507, 2507, 2507, 2507, 2507, 57: 2507, 167: 2507, 191: 2507, 535: 2507, 2507, 2507, 539: 2507, 2507, 2507, 2507, 2507, 2507, 551: 2507, 2507, 2507, 2507, 557: 2507, 2507, 570: 2507, 614: 2507, 701: 2507, 706: 2507, 708: 2507, 2507, 2507, 2507, 2507, 2507, 2507, 2507}, + {9: 3911, 57: 1192, 593: 1192, 596: 1192, 598: 1192}, + {57: 1198}, + {190: 4127, 203: 4123, 567: 4117, 632: 4128, 641: 4119, 4118, 646: 4126, 4125, 924: 4124, 1106: 4121, 1511: 4122, 4120}, + {190: 1189, 203: 1189, 567: 1189, 632: 1189, 641: 1189, 1189, 646: 1189, 1189}, + {190: 1188, 203: 1188, 567: 1188, 632: 1188, 641: 1188, 1188, 646: 1188, 1188}, // 1240 - {2506, 2506, 2506, 2506, 2506, 2506, 2506, 2506, 2506, 2506, 2506, 2506, 2506, 2506, 2506, 2506, 2506, 2506, 2506, 2506, 2506, 2506, 2506, 2506, 2506, 2506, 2506, 2506, 2506, 2506, 2506, 2506, 2506, 2506, 2506, 2506, 2506, 2506, 2506, 2506, 2506, 2506, 2506, 2506, 2506, 2506, 2506, 2506, 2506, 2506, 2506, 57: 2506, 167: 2506, 191: 2506, 243: 2506, 535: 2506, 2506, 2506, 539: 2506, 2506, 2506, 2506, 2506, 2506, 551: 2506, 2506, 2506, 2506, 557: 2506, 2506, 570: 2506, 614: 2506, 701: 2506, 706: 2506, 708: 2506, 2506, 2506, 2506, 2506, 2506, 2506, 2506}, - {2505, 2505, 2505, 2505, 2505, 2505, 2505, 2505, 2505, 2505, 2505, 2505, 2505, 2505, 2505, 2505, 2505, 2505, 2505, 2505, 2505, 2505, 2505, 2505, 2505, 2505, 2505, 2505, 2505, 2505, 2505, 2505, 2505, 2505, 2505, 2505, 2505, 2505, 2505, 2505, 2505, 2505, 2505, 2505, 2505, 2505, 2505, 2505, 2505, 2505, 2505, 57: 2505, 167: 2505, 191: 2505, 243: 2505, 535: 2505, 2505, 2505, 539: 2505, 2505, 2505, 2505, 2505, 2505, 551: 2505, 2505, 2505, 2505, 557: 2505, 2505, 570: 2505, 614: 2505, 701: 2505, 706: 2505, 708: 2505, 2505, 2505, 2505, 2505, 2505, 2505, 2505}, - {57: 1182}, - {57: 1178}, - {57: 1177}, + {190: 1187, 203: 1187, 567: 1187, 632: 1187, 641: 1187, 1187, 646: 1187, 1187}, + {2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 57: 2513, 169: 2513, 192: 2513, 535: 2513, 2513, 2513, 539: 2513, 2513, 2513, 2513, 2513, 2513, 551: 2513, 2513, 2513, 2513, 557: 2513, 2513, 571: 2513, 613: 2513, 660: 2513, 706: 2513, 708: 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513}, + {2512, 2512, 2512, 2512, 2512, 2512, 2512, 2512, 2512, 2512, 2512, 2512, 2512, 2512, 2512, 2512, 2512, 2512, 2512, 2512, 2512, 2512, 2512, 2512, 2512, 2512, 2512, 2512, 2512, 2512, 2512, 2512, 2512, 2512, 2512, 2512, 2512, 2512, 2512, 2512, 2512, 2512, 2512, 2512, 2512, 2512, 2512, 2512, 2512, 2512, 2512, 57: 2512, 169: 2512, 192: 2512, 243: 2512, 535: 2512, 2512, 2512, 539: 2512, 2512, 2512, 2512, 2512, 2512, 551: 2512, 2512, 2512, 2512, 557: 2512, 2512, 571: 2512, 613: 2512, 660: 2512, 706: 2512, 708: 2512, 2512, 2512, 2512, 2512, 2512, 2512, 2512}, + {2511, 2511, 2511, 2511, 2511, 2511, 2511, 2511, 2511, 2511, 2511, 2511, 2511, 2511, 2511, 2511, 2511, 2511, 2511, 2511, 2511, 2511, 2511, 2511, 2511, 2511, 2511, 2511, 2511, 2511, 2511, 2511, 2511, 2511, 2511, 2511, 2511, 2511, 2511, 2511, 2511, 2511, 2511, 2511, 2511, 2511, 2511, 2511, 2511, 2511, 2511, 57: 2511, 169: 2511, 192: 2511, 243: 2511, 535: 2511, 2511, 2511, 539: 2511, 2511, 2511, 2511, 2511, 2511, 551: 2511, 2511, 2511, 2511, 557: 2511, 2511, 571: 2511, 613: 2511, 660: 2511, 706: 2511, 708: 2511, 2511, 2511, 2511, 2511, 2511, 2511, 2511}, + {57: 1190}, // 1245 - {167: 4137}, - {167: 4135}, - {167: 4133}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 4140}, - {644: 4139}, + {57: 1186}, + {57: 1185}, + {169: 4145}, + {169: 4143}, + {169: 4141}, // 1250 - {189: 4119, 203: 4121, 564: 4109, 641: 4111, 4110, 646: 4124, 4123, 922: 4122, 1103: 4126, 1311: 4125}, - {167: 4137, 191: 4138}, - {167: 4135, 191: 4136}, - {167: 4133, 191: 4134}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 4129}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 4148}, + {644: 4147}, + {190: 4127, 203: 4129, 567: 4117, 641: 4119, 4118, 646: 4132, 4131, 924: 4130, 1106: 4134, 1309: 4133}, + {169: 4145, 192: 4146}, + {169: 4143, 192: 4144}, // 1255 - {571: 4127}, - {57: 1170, 571: 1170}, - {189: 4119, 203: 4121, 564: 4109, 641: 4111, 4110, 646: 4124, 4123, 922: 4122, 1103: 4126, 1311: 4128}, - {57: 1171}, - {118: 3789, 127: 3797, 133: 3785, 137: 3782, 3784, 3781, 3783, 3787, 3788, 3793, 3792, 3791, 3795, 3796, 3790, 3794, 3786, 571: 3767, 3765, 3766, 3764, 3762, 599: 3779, 3776, 3778, 3777, 3773, 3775, 3774, 3771, 3772, 3770, 3780, 806: 3763, 3761, 892: 3769, 907: 4130}, + {169: 4141, 192: 4142}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 4137}, + {572: 4135}, + {57: 1178, 572: 1178}, + {190: 4127, 203: 4129, 567: 4117, 641: 4119, 4118, 646: 4132, 4131, 924: 4130, 1106: 4134, 1309: 4136}, // 1260 - {167: 4131, 191: 4132}, - {57: 1173, 571: 1173}, - {57: 1166, 571: 1166}, - {57: 1174, 571: 1174}, - {57: 1167, 571: 1167}, + {57: 1179}, + {118: 3794, 127: 3802, 134: 3790, 138: 3787, 140: 3789, 3786, 3788, 3792, 3793, 3798, 3797, 3796, 3800, 3801, 3795, 3799, 3791, 572: 3772, 3770, 3771, 3769, 3767, 599: 3784, 3781, 3783, 3782, 3778, 3780, 3779, 3776, 3777, 3775, 3785, 806: 3768, 3766, 892: 3774, 907: 4138}, + {169: 4139, 192: 4140}, + {57: 1181, 572: 1181}, + {57: 1174, 572: 1174}, // 1265 - {57: 1175, 571: 1175}, - {57: 1168, 571: 1168}, - {57: 1176, 571: 1176}, - {57: 1169, 571: 1169}, - {57: 1172, 571: 1172}, + {57: 1182, 572: 1182}, + {57: 1175, 572: 1175}, + {57: 1183, 572: 1183}, + {57: 1176, 572: 1176}, + {57: 1184, 572: 1184}, // 1270 - {118: 3789, 127: 3797, 133: 3785, 137: 3782, 3784, 3781, 3783, 3787, 3788, 3793, 3792, 3791, 3795, 3796, 3790, 3794, 3786, 571: 3767, 3765, 3766, 3764, 3762, 599: 3779, 3776, 3778, 3777, 3773, 3775, 3774, 3771, 3772, 3770, 3780, 806: 3763, 3761, 892: 3769, 907: 4141}, - {167: 4131}, - {1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 537: 1191, 1191, 1191, 541: 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 554: 1191, 1191, 1191, 559: 1191, 1191, 1191, 1191, 1191, 565: 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 584: 1191, 1191, 1191, 1191, 1191, 1191, 1191, 593: 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 615: 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 625: 1191, 1191, 1191, 1191, 1191, 1191, 632: 1191, 637: 1191, 1191, 1191, 1191, 661: 1191, 707: 1191}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 4144}, - {2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 537: 2226, 2226, 542: 2226, 544: 2226, 2226, 2226, 2226, 554: 2226, 2226, 2226, 559: 2226, 2226, 562: 2226, 2226, 565: 2226, 2226, 2226, 2226, 2226, 2226, 3767, 3765, 3766, 3764, 3762, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 585: 2226, 2226, 2226, 2226, 590: 2226, 593: 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 612: 2226, 806: 3763, 3761}, + {57: 1177, 572: 1177}, + {57: 1180, 572: 1180}, + {118: 3794, 127: 3802, 134: 3790, 138: 3787, 140: 3789, 3786, 3788, 3792, 3793, 3798, 3797, 3796, 3800, 3801, 3795, 3799, 3791, 572: 3772, 3770, 3771, 3769, 3767, 599: 3784, 3781, 3783, 3782, 3778, 3780, 3779, 3776, 3777, 3775, 3785, 806: 3768, 3766, 892: 3774, 907: 4149}, + {169: 4139}, + {1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 537: 1199, 1199, 1199, 541: 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 554: 1199, 1199, 1199, 559: 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 568: 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 585: 1199, 1199, 1199, 1199, 1199, 1199, 593: 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 614: 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 632: 1199, 637: 1199, 1199, 1199, 1199, 661: 1199, 707: 1199}, // 1275 - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 4146}, - {57: 4147, 571: 3767, 3765, 3766, 3764, 3762, 806: 3763, 3761}, - {184: 4082, 554: 4083, 826: 1144, 994: 4148}, - {826: 4086, 838: 4149}, - {1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 537: 1151, 1151, 1151, 541: 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 554: 1151, 1151, 1151, 559: 1151, 1151, 1151, 1151, 1151, 565: 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 584: 1151, 1151, 1151, 1151, 1151, 1151, 1151, 593: 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 615: 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 625: 1151, 1151, 1151, 1151, 1151, 1151, 632: 1151, 637: 1151, 1151, 1151, 1151, 661: 1151, 707: 1151}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 4152}, + {2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 537: 2235, 2235, 542: 2235, 544: 2235, 2235, 2235, 2235, 554: 2235, 2235, 2235, 559: 2235, 2235, 2235, 563: 2235, 2235, 566: 2235, 568: 2235, 2235, 2235, 2235, 3772, 3770, 3771, 3769, 3767, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 586: 2235, 2235, 2235, 2235, 2235, 593: 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 612: 2235, 806: 3768, 3766}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 4154}, + {57: 4155, 572: 3772, 3770, 3771, 3769, 3767, 806: 3768, 3766}, + {184: 4090, 554: 4091, 826: 1152, 995: 4156}, // 1280 - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 4151}, - {57: 4152, 571: 3767, 3765, 3766, 3764, 3762, 806: 3763, 3761}, - {184: 4082, 554: 4083, 826: 1144, 994: 4153}, - {826: 4086, 838: 4154}, - {1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 537: 1152, 1152, 1152, 541: 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 554: 1152, 1152, 1152, 559: 1152, 1152, 1152, 1152, 1152, 565: 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 584: 1152, 1152, 1152, 1152, 1152, 1152, 1152, 593: 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 615: 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 625: 1152, 1152, 1152, 1152, 1152, 1152, 632: 1152, 637: 1152, 1152, 1152, 1152, 661: 1152, 707: 1152}, + {826: 4094, 838: 4157}, + {1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 537: 1159, 1159, 1159, 541: 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 554: 1159, 1159, 1159, 559: 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 568: 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 585: 1159, 1159, 1159, 1159, 1159, 1159, 593: 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 614: 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 632: 1159, 637: 1159, 1159, 1159, 1159, 661: 1159, 707: 1159}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 4159}, + {57: 4160, 572: 3772, 3770, 3771, 3769, 3767, 806: 3768, 3766}, + {184: 4090, 554: 4091, 826: 1152, 995: 4161}, // 1285 - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 4156}, - {9: 4158, 57: 1149, 571: 3767, 3765, 3766, 3764, 3762, 806: 3763, 3761, 1232: 4157}, - {57: 4165}, - {564: 4109, 641: 4111, 4110, 647: 4160, 922: 4159}, - {9: 4162, 57: 1146, 1233: 4164}, + {826: 4094, 838: 4162}, + {1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 537: 1160, 1160, 1160, 541: 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 554: 1160, 1160, 1160, 559: 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 568: 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 585: 1160, 1160, 1160, 1160, 1160, 1160, 593: 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 614: 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 632: 1160, 637: 1160, 1160, 1160, 1160, 661: 1160, 707: 1160}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 4164}, + {9: 4166, 57: 1157, 572: 3772, 3770, 3771, 3769, 3767, 806: 3768, 3766, 1233: 4165}, + {57: 4173}, // 1290 - {9: 4162, 57: 1146, 1233: 4161}, - {57: 1147}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 4163}, - {57: 1145, 571: 3767, 3765, 3766, 3764, 3762, 806: 3763, 3761}, - {57: 1148}, + {567: 4117, 641: 4119, 4118, 647: 4168, 924: 4167}, + {9: 4170, 57: 1154, 1234: 4172}, + {9: 4170, 57: 1154, 1234: 4169}, + {57: 1155}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 4171}, // 1295 - {184: 4082, 554: 4083, 826: 1144, 994: 4166}, - {826: 4086, 838: 4167}, - {1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 537: 1153, 1153, 1153, 541: 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 554: 1153, 1153, 1153, 559: 1153, 1153, 1153, 1153, 1153, 565: 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 584: 1153, 1153, 1153, 1153, 1153, 1153, 1153, 593: 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 615: 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 625: 1153, 1153, 1153, 1153, 1153, 1153, 632: 1153, 637: 1153, 1153, 1153, 1153, 661: 1153, 707: 1153}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 4169}, - {9: 4158, 57: 1149, 571: 3767, 3765, 3766, 3764, 3762, 806: 3763, 3761, 1232: 4170}, + {57: 1153, 572: 3772, 3770, 3771, 3769, 3767, 806: 3768, 3766}, + {57: 1156}, + {184: 4090, 554: 4091, 826: 1152, 995: 4174}, + {826: 4094, 838: 4175}, + {1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 537: 1161, 1161, 1161, 541: 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 554: 1161, 1161, 1161, 559: 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 568: 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 585: 1161, 1161, 1161, 1161, 1161, 1161, 593: 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 614: 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 632: 1161, 637: 1161, 1161, 1161, 1161, 661: 1161, 707: 1161}, // 1300 - {57: 4171}, - {184: 4082, 554: 4083, 826: 1144, 994: 4172}, - {826: 4086, 838: 4173}, - {1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 537: 1154, 1154, 1154, 541: 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 554: 1154, 1154, 1154, 559: 1154, 1154, 1154, 1154, 1154, 565: 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 584: 1154, 1154, 1154, 1154, 1154, 1154, 1154, 593: 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 615: 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 625: 1154, 1154, 1154, 1154, 1154, 1154, 632: 1154, 637: 1154, 1154, 1154, 1154, 661: 1154, 707: 1154}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3703, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3637, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 4175, 3618, 3700, 3617, 3614}, - // 1305 - {57: 4176, 543: 3714, 707: 3715}, - {826: 4086, 838: 4177}, - {1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 537: 1155, 1155, 1155, 541: 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 554: 1155, 1155, 1155, 559: 1155, 1155, 1155, 1155, 1155, 565: 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 584: 1155, 1155, 1155, 1155, 1155, 1155, 1155, 593: 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 615: 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 625: 1155, 1155, 1155, 1155, 1155, 1155, 632: 1155, 637: 1155, 1155, 1155, 1155, 661: 1155, 707: 1155}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 4177}, + {9: 4166, 57: 1157, 572: 3772, 3770, 3771, 3769, 3767, 806: 3768, 3766, 1233: 4178}, {57: 4179}, - {826: 4086, 838: 4180}, + {184: 4090, 554: 4091, 826: 1152, 995: 4180}, + {826: 4094, 838: 4181}, + // 1305 + {1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 537: 1162, 1162, 1162, 541: 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 554: 1162, 1162, 1162, 559: 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 568: 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 585: 1162, 1162, 1162, 1162, 1162, 1162, 593: 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 614: 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 632: 1162, 637: 1162, 1162, 1162, 1162, 661: 1162, 707: 1162}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3708, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3642, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 4183, 3623, 3705, 3622, 3619}, + {57: 4184, 543: 3719, 707: 3720}, + {826: 4094, 838: 4185}, + {1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 537: 1163, 1163, 1163, 541: 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 554: 1163, 1163, 1163, 559: 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 568: 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 585: 1163, 1163, 1163, 1163, 1163, 1163, 593: 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 614: 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 632: 1163, 637: 1163, 1163, 1163, 1163, 661: 1163, 707: 1163}, // 1310 - {1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 537: 1156, 1156, 1156, 541: 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 554: 1156, 1156, 1156, 559: 1156, 1156, 1156, 1156, 1156, 565: 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 584: 1156, 1156, 1156, 1156, 1156, 1156, 1156, 593: 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 615: 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 625: 1156, 1156, 1156, 1156, 1156, 1156, 632: 1156, 637: 1156, 1156, 1156, 1156, 661: 1156, 707: 1156}, - {57: 4182}, - {826: 4086, 838: 4183}, - {1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 537: 1157, 1157, 1157, 541: 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 554: 1157, 1157, 1157, 559: 1157, 1157, 1157, 1157, 1157, 565: 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 584: 1157, 1157, 1157, 1157, 1157, 1157, 1157, 593: 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 615: 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 625: 1157, 1157, 1157, 1157, 1157, 1157, 632: 1157, 637: 1157, 1157, 1157, 1157, 661: 1157, 707: 1157}, - {57: 4185}, + {57: 4187}, + {826: 4094, 838: 4188}, + {1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 537: 1164, 1164, 1164, 541: 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 554: 1164, 1164, 1164, 559: 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 568: 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 585: 1164, 1164, 1164, 1164, 1164, 1164, 593: 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 614: 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 632: 1164, 637: 1164, 1164, 1164, 1164, 661: 1164, 707: 1164}, + {57: 4190}, + {826: 4094, 838: 4191}, // 1315 - {826: 4086, 838: 4186}, - {1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 537: 1158, 1158, 1158, 541: 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 554: 1158, 1158, 1158, 559: 1158, 1158, 1158, 1158, 1158, 565: 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 584: 1158, 1158, 1158, 1158, 1158, 1158, 1158, 593: 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 615: 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 625: 1158, 1158, 1158, 1158, 1158, 1158, 632: 1158, 637: 1158, 1158, 1158, 1158, 661: 1158, 707: 1158}, - {57: 4188}, - {826: 4086, 838: 4189}, - {1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 537: 1159, 1159, 1159, 541: 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 554: 1159, 1159, 1159, 559: 1159, 1159, 1159, 1159, 1159, 565: 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 584: 1159, 1159, 1159, 1159, 1159, 1159, 1159, 593: 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 615: 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 625: 1159, 1159, 1159, 1159, 1159, 1159, 632: 1159, 637: 1159, 1159, 1159, 1159, 661: 1159, 707: 1159}, + {1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 537: 1165, 1165, 1165, 541: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 554: 1165, 1165, 1165, 559: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 568: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 585: 1165, 1165, 1165, 1165, 1165, 1165, 593: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 614: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 632: 1165, 637: 1165, 1165, 1165, 1165, 661: 1165, 707: 1165}, + {57: 4193}, + {826: 4094, 838: 4194}, + {1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 537: 1166, 1166, 1166, 541: 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 554: 1166, 1166, 1166, 559: 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 568: 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 585: 1166, 1166, 1166, 1166, 1166, 1166, 593: 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 614: 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 632: 1166, 637: 1166, 1166, 1166, 1166, 661: 1166, 707: 1166}, + {57: 4196}, // 1320 - {57: 4191}, - {826: 4086, 838: 4192}, - {1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 537: 1160, 1160, 1160, 541: 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 554: 1160, 1160, 1160, 559: 1160, 1160, 1160, 1160, 1160, 565: 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 584: 1160, 1160, 1160, 1160, 1160, 1160, 1160, 593: 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 615: 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 625: 1160, 1160, 1160, 1160, 1160, 1160, 632: 1160, 637: 1160, 1160, 1160, 1160, 661: 1160, 707: 1160}, - {2: 1449, 1449, 1449, 1449, 1449, 1449, 1449, 10: 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 58: 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 536: 1449, 538: 1449, 1449, 1449, 1449, 545: 1449, 1449, 548: 1449, 1449, 1449, 552: 1449, 1449, 557: 1449, 1449, 564: 1449, 583: 1449, 591: 1449, 1449, 624: 1449, 631: 1449, 633: 1449, 1449, 1449, 1449, 641: 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 662: 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 702: 1449, 1449, 1449, 1449, 716: 1449, 721: 4196, 835: 4194, 4195, 891: 4197, 893: 4198, 918: 4200, 4199}, - {2: 1453, 1453, 1453, 1453, 1453, 1453, 1453, 10: 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 58: 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 536: 1453, 538: 1453, 1453, 1453, 1453, 545: 1453, 1453, 548: 1453, 1453, 1453, 552: 1453, 1453, 557: 1453, 1453, 564: 1453, 578: 1453, 583: 1453, 589: 1453, 591: 1453, 1453, 614: 1453, 624: 1453, 631: 1453, 633: 1453, 1453, 1453, 1453, 641: 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 662: 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 716: 1453, 721: 1453, 835: 1453, 1453, 842: 1453, 1453, 1453, 846: 1453, 855: 1453, 1453, 1453}, + {826: 4094, 838: 4197}, + {1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 537: 1167, 1167, 1167, 541: 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 554: 1167, 1167, 1167, 559: 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 568: 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 585: 1167, 1167, 1167, 1167, 1167, 1167, 593: 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 614: 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 632: 1167, 637: 1167, 1167, 1167, 1167, 661: 1167, 707: 1167}, + {57: 4199}, + {826: 4094, 838: 4200}, + {1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 537: 1168, 1168, 1168, 541: 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 554: 1168, 1168, 1168, 559: 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 568: 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 585: 1168, 1168, 1168, 1168, 1168, 1168, 593: 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 614: 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 632: 1168, 637: 1168, 1168, 1168, 1168, 661: 1168, 707: 1168}, // 1325 - {2: 1452, 1452, 1452, 1452, 1452, 1452, 1452, 10: 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 58: 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 536: 1452, 538: 1452, 1452, 1452, 1452, 545: 1452, 1452, 548: 1452, 1452, 1452, 552: 1452, 1452, 557: 1452, 1452, 564: 1452, 578: 1452, 583: 1452, 589: 1452, 591: 1452, 1452, 614: 1452, 624: 1452, 631: 1452, 633: 1452, 1452, 1452, 1452, 641: 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 662: 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 716: 1452, 721: 1452, 835: 1452, 1452, 842: 1452, 1452, 1452, 846: 1452, 855: 1452, 1452, 1452}, - {2: 1451, 1451, 1451, 1451, 1451, 1451, 1451, 10: 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 58: 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 536: 1451, 538: 1451, 1451, 1451, 1451, 545: 1451, 1451, 548: 1451, 1451, 1451, 552: 1451, 1451, 557: 1451, 1451, 564: 1451, 578: 1451, 583: 1451, 589: 1451, 591: 1451, 1451, 614: 1451, 624: 1451, 631: 1451, 633: 1451, 1451, 1451, 1451, 641: 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 662: 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 716: 1451, 721: 1451, 835: 1451, 1451, 842: 1451, 1451, 1451, 846: 1451, 855: 1451, 1451, 1451}, - {2: 1450, 1450, 1450, 1450, 1450, 1450, 1450, 10: 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 58: 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 536: 1450, 538: 1450, 1450, 1450, 1450, 545: 1450, 1450, 548: 1450, 1450, 1450, 552: 1450, 1450, 557: 1450, 1450, 564: 1450, 583: 1450, 591: 1450, 1450, 624: 1450, 631: 1450, 633: 1450, 1450, 1450, 1450, 641: 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 662: 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 702: 1450, 1450, 1450, 1450, 716: 1450, 721: 4205}, - {2: 1448, 1448, 1448, 1448, 1448, 1448, 1448, 10: 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 58: 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 536: 1448, 538: 1448, 1448, 1448, 1448, 545: 1448, 1448, 548: 1448, 1448, 1448, 552: 1448, 1448, 557: 1448, 1448, 564: 1448, 583: 1448, 591: 1448, 1448, 624: 1448, 631: 1448, 633: 1448, 1448, 1448, 1448, 641: 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 662: 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 702: 1448, 1448, 1448, 1448, 716: 1448}, - {2: 1445, 1445, 1445, 1445, 1445, 1445, 1445, 10: 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 58: 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 536: 1445, 538: 1445, 1445, 1445, 1445, 545: 1445, 1445, 548: 1445, 1445, 1445, 552: 1445, 1445, 557: 1445, 1445, 564: 1445, 583: 1445, 591: 1445, 1445, 624: 1445, 631: 1445, 633: 1445, 1445, 1445, 1445, 641: 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 662: 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 702: 1445, 1445, 1445, 1445, 716: 1445}, + {2: 1458, 1458, 1458, 1458, 1458, 1458, 1458, 10: 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 58: 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 536: 1458, 538: 1458, 1458, 1458, 1458, 545: 1458, 1458, 548: 1458, 1458, 1458, 552: 1458, 1458, 557: 1458, 1458, 567: 1458, 584: 1458, 591: 1458, 1458, 630: 1458, 1458, 633: 1458, 1458, 1458, 1458, 641: 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 662: 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 716: 1458, 721: 4204, 834: 4202, 4203, 891: 4205, 893: 4206, 920: 4208, 4207}, + {2: 1462, 1462, 1462, 1462, 1462, 1462, 1462, 10: 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 58: 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 536: 1462, 538: 1462, 1462, 1462, 1462, 545: 1462, 1462, 548: 1462, 1462, 1462, 552: 1462, 1462, 557: 1462, 1462, 565: 1462, 567: 1462, 579: 1462, 584: 1462, 591: 1462, 1462, 613: 1462, 630: 1462, 1462, 633: 1462, 1462, 1462, 1462, 641: 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 662: 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 716: 1462, 721: 1462, 834: 1462, 1462, 839: 1462, 841: 1462, 844: 1462, 846: 1462, 855: 1462, 1462, 1462}, + {2: 1461, 1461, 1461, 1461, 1461, 1461, 1461, 10: 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 58: 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 536: 1461, 538: 1461, 1461, 1461, 1461, 545: 1461, 1461, 548: 1461, 1461, 1461, 552: 1461, 1461, 557: 1461, 1461, 565: 1461, 567: 1461, 579: 1461, 584: 1461, 591: 1461, 1461, 613: 1461, 630: 1461, 1461, 633: 1461, 1461, 1461, 1461, 641: 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 662: 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 716: 1461, 721: 1461, 834: 1461, 1461, 839: 1461, 841: 1461, 844: 1461, 846: 1461, 855: 1461, 1461, 1461}, + {2: 1460, 1460, 1460, 1460, 1460, 1460, 1460, 10: 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 58: 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 536: 1460, 538: 1460, 1460, 1460, 1460, 545: 1460, 1460, 548: 1460, 1460, 1460, 552: 1460, 1460, 557: 1460, 1460, 565: 1460, 567: 1460, 579: 1460, 584: 1460, 591: 1460, 1460, 613: 1460, 630: 1460, 1460, 633: 1460, 1460, 1460, 1460, 641: 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 662: 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 716: 1460, 721: 1460, 834: 1460, 1460, 839: 1460, 841: 1460, 844: 1460, 846: 1460, 855: 1460, 1460, 1460}, + {2: 1459, 1459, 1459, 1459, 1459, 1459, 1459, 10: 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 58: 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 536: 1459, 538: 1459, 1459, 1459, 1459, 545: 1459, 1459, 548: 1459, 1459, 1459, 552: 1459, 1459, 557: 1459, 1459, 567: 1459, 584: 1459, 591: 1459, 1459, 630: 1459, 1459, 633: 1459, 1459, 1459, 1459, 641: 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 662: 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 716: 1459, 721: 4213}, // 1330 - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 4201}, - {57: 4202, 571: 3767, 3765, 3766, 3764, 3762, 806: 3763, 3761}, - {1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 537: 1165, 1165, 1165, 541: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 554: 1165, 1165, 1165, 559: 1165, 1165, 1165, 1165, 1165, 565: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 584: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 593: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 615: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 625: 1165, 1165, 1165, 1165, 1165, 1165, 632: 1165, 637: 1165, 1165, 1165, 1165, 661: 1165, 707: 1165, 826: 4086, 838: 4204, 850: 4203}, - {1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 537: 1329, 1329, 1329, 541: 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 554: 1329, 1329, 1329, 559: 1329, 1329, 1329, 1329, 1329, 565: 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 584: 1329, 1329, 1329, 1329, 1329, 1329, 1329, 593: 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 615: 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 625: 1329, 1329, 1329, 1329, 1329, 1329, 632: 1329, 637: 1329, 1329, 1329, 1329, 661: 1329, 707: 1329}, - {1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 537: 1164, 1164, 1164, 541: 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 554: 1164, 1164, 1164, 559: 1164, 1164, 1164, 1164, 1164, 565: 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 584: 1164, 1164, 1164, 1164, 1164, 1164, 1164, 593: 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 615: 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 625: 1164, 1164, 1164, 1164, 1164, 1164, 632: 1164, 637: 1164, 1164, 1164, 1164, 661: 1164, 707: 1164}, + {2: 1457, 1457, 1457, 1457, 1457, 1457, 1457, 10: 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 58: 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 536: 1457, 538: 1457, 1457, 1457, 1457, 545: 1457, 1457, 548: 1457, 1457, 1457, 552: 1457, 1457, 557: 1457, 1457, 567: 1457, 584: 1457, 591: 1457, 1457, 630: 1457, 1457, 633: 1457, 1457, 1457, 1457, 641: 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 662: 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 716: 1457}, + {2: 1454, 1454, 1454, 1454, 1454, 1454, 1454, 10: 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 58: 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 536: 1454, 538: 1454, 1454, 1454, 1454, 545: 1454, 1454, 548: 1454, 1454, 1454, 552: 1454, 1454, 557: 1454, 1454, 567: 1454, 584: 1454, 591: 1454, 1454, 630: 1454, 1454, 633: 1454, 1454, 1454, 1454, 641: 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 662: 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 716: 1454}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 4209}, + {57: 4210, 572: 3772, 3770, 3771, 3769, 3767, 806: 3768, 3766}, + {1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 537: 1173, 1173, 1173, 541: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 554: 1173, 1173, 1173, 559: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 568: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 585: 1173, 1173, 1173, 1173, 1173, 1173, 593: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 614: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 632: 1173, 637: 1173, 1173, 1173, 1173, 661: 1173, 707: 1173, 826: 4094, 838: 4212, 850: 4211}, // 1335 - {2: 1444, 1444, 1444, 1444, 1444, 1444, 1444, 10: 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 58: 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 536: 1444, 538: 1444, 1444, 1444, 1444, 545: 1444, 1444, 548: 1444, 1444, 1444, 552: 1444, 1444, 557: 1444, 1444, 564: 1444, 583: 1444, 591: 1444, 1444, 624: 1444, 631: 1444, 633: 1444, 1444, 1444, 1444, 641: 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 662: 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 702: 1444, 1444, 1444, 1444, 716: 1444}, - {2: 1449, 1449, 1449, 1449, 1449, 1449, 1449, 10: 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 58: 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 536: 1449, 538: 1449, 1449, 1449, 1449, 545: 1449, 1449, 548: 1449, 1449, 1449, 552: 1449, 1449, 557: 1449, 1449, 564: 1449, 583: 1449, 591: 1449, 1449, 624: 1449, 631: 1449, 633: 1449, 1449, 1449, 1449, 641: 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 662: 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 702: 1449, 1449, 1449, 1449, 716: 1449, 721: 4196, 835: 4194, 4195, 891: 4197, 893: 4198, 918: 4207, 4199}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 4208}, - {57: 4209, 571: 3767, 3765, 3766, 3764, 3762, 806: 3763, 3761}, - {1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 537: 1165, 1165, 1165, 541: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 554: 1165, 1165, 1165, 559: 1165, 1165, 1165, 1165, 1165, 565: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 584: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 593: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 615: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 625: 1165, 1165, 1165, 1165, 1165, 1165, 632: 1165, 637: 1165, 1165, 1165, 1165, 661: 1165, 707: 1165, 826: 4086, 838: 4204, 850: 4210}, + {1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 537: 1338, 1338, 1338, 541: 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 554: 1338, 1338, 1338, 559: 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 568: 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 585: 1338, 1338, 1338, 1338, 1338, 1338, 593: 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 614: 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 632: 1338, 637: 1338, 1338, 1338, 1338, 661: 1338, 707: 1338}, + {1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 537: 1172, 1172, 1172, 541: 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 554: 1172, 1172, 1172, 559: 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 568: 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 585: 1172, 1172, 1172, 1172, 1172, 1172, 593: 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 614: 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 632: 1172, 637: 1172, 1172, 1172, 1172, 661: 1172, 707: 1172}, + {2: 1453, 1453, 1453, 1453, 1453, 1453, 1453, 10: 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 58: 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 536: 1453, 538: 1453, 1453, 1453, 1453, 545: 1453, 1453, 548: 1453, 1453, 1453, 552: 1453, 1453, 557: 1453, 1453, 567: 1453, 584: 1453, 591: 1453, 1453, 630: 1453, 1453, 633: 1453, 1453, 1453, 1453, 641: 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 662: 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 716: 1453}, + {2: 1458, 1458, 1458, 1458, 1458, 1458, 1458, 10: 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 58: 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 536: 1458, 538: 1458, 1458, 1458, 1458, 545: 1458, 1458, 548: 1458, 1458, 1458, 552: 1458, 1458, 557: 1458, 1458, 567: 1458, 584: 1458, 591: 1458, 1458, 630: 1458, 1458, 633: 1458, 1458, 1458, 1458, 641: 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 662: 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 716: 1458, 721: 4204, 834: 4202, 4203, 891: 4205, 893: 4206, 920: 4215, 4207}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 4216}, // 1340 - {1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 537: 1330, 1330, 1330, 541: 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 554: 1330, 1330, 1330, 559: 1330, 1330, 1330, 1330, 1330, 565: 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 584: 1330, 1330, 1330, 1330, 1330, 1330, 1330, 593: 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 615: 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 625: 1330, 1330, 1330, 1330, 1330, 1330, 632: 1330, 637: 1330, 1330, 1330, 1330, 661: 1330, 707: 1330}, - {2: 1449, 1449, 1449, 1449, 1449, 1449, 1449, 10: 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 58: 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 536: 1449, 538: 1449, 1449, 1449, 1449, 545: 1449, 1449, 548: 1449, 1449, 1449, 552: 1449, 1449, 557: 1449, 1449, 564: 1449, 583: 1449, 591: 1449, 1449, 624: 1449, 631: 1449, 633: 1449, 1449, 1449, 1449, 641: 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 662: 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 702: 1449, 1449, 1449, 1449, 716: 1449, 721: 4196, 835: 4194, 4195, 891: 4197, 893: 4198, 918: 4212, 4199}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 4213}, - {57: 4214, 571: 3767, 3765, 3766, 3764, 3762, 806: 3763, 3761}, - {1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 537: 1165, 1165, 1165, 541: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 554: 1165, 1165, 1165, 559: 1165, 1165, 1165, 1165, 1165, 565: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 584: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 593: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 615: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 625: 1165, 1165, 1165, 1165, 1165, 1165, 632: 1165, 637: 1165, 1165, 1165, 1165, 661: 1165, 707: 1165, 826: 4086, 838: 4204, 850: 4215}, + {57: 4217, 572: 3772, 3770, 3771, 3769, 3767, 806: 3768, 3766}, + {1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 537: 1173, 1173, 1173, 541: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 554: 1173, 1173, 1173, 559: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 568: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 585: 1173, 1173, 1173, 1173, 1173, 1173, 593: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 614: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 632: 1173, 637: 1173, 1173, 1173, 1173, 661: 1173, 707: 1173, 826: 4094, 838: 4212, 850: 4218}, + {1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 537: 1339, 1339, 1339, 541: 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 554: 1339, 1339, 1339, 559: 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 568: 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 585: 1339, 1339, 1339, 1339, 1339, 1339, 593: 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 614: 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 632: 1339, 637: 1339, 1339, 1339, 1339, 661: 1339, 707: 1339}, + {2: 1458, 1458, 1458, 1458, 1458, 1458, 1458, 10: 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 58: 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 536: 1458, 538: 1458, 1458, 1458, 1458, 545: 1458, 1458, 548: 1458, 1458, 1458, 552: 1458, 1458, 557: 1458, 1458, 567: 1458, 584: 1458, 591: 1458, 1458, 630: 1458, 1458, 633: 1458, 1458, 1458, 1458, 641: 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 662: 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 716: 1458, 721: 4204, 834: 4202, 4203, 891: 4205, 893: 4206, 920: 4220, 4207}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 4221}, // 1345 - {1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 537: 1331, 1331, 1331, 541: 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 554: 1331, 1331, 1331, 559: 1331, 1331, 1331, 1331, 1331, 565: 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 584: 1331, 1331, 1331, 1331, 1331, 1331, 1331, 593: 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 615: 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 625: 1331, 1331, 1331, 1331, 1331, 1331, 632: 1331, 637: 1331, 1331, 1331, 1331, 661: 1331, 707: 1331}, - {2: 1449, 1449, 1449, 1449, 1449, 1449, 1449, 10: 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 58: 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 536: 1449, 538: 1449, 1449, 1449, 1449, 545: 1449, 1449, 548: 1449, 1449, 1449, 552: 1449, 1449, 557: 1449, 1449, 564: 1449, 583: 1449, 591: 1449, 1449, 624: 1449, 631: 1449, 633: 1449, 1449, 1449, 1449, 641: 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 662: 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 702: 1449, 1449, 1449, 1449, 716: 1449, 721: 4196, 835: 4194, 4195, 891: 4197, 893: 4198, 918: 4217, 4199}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 4218}, - {57: 4219, 571: 3767, 3765, 3766, 3764, 3762, 806: 3763, 3761}, - {1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 537: 1165, 1165, 1165, 541: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 554: 1165, 1165, 1165, 559: 1165, 1165, 1165, 1165, 1165, 565: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 584: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 593: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 615: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 625: 1165, 1165, 1165, 1165, 1165, 1165, 632: 1165, 637: 1165, 1165, 1165, 1165, 661: 1165, 707: 1165, 826: 4086, 838: 4204, 850: 4220}, + {57: 4222, 572: 3772, 3770, 3771, 3769, 3767, 806: 3768, 3766}, + {1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 537: 1173, 1173, 1173, 541: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 554: 1173, 1173, 1173, 559: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 568: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 585: 1173, 1173, 1173, 1173, 1173, 1173, 593: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 614: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 632: 1173, 637: 1173, 1173, 1173, 1173, 661: 1173, 707: 1173, 826: 4094, 838: 4212, 850: 4223}, + {1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 537: 1340, 1340, 1340, 541: 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 554: 1340, 1340, 1340, 559: 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 568: 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 585: 1340, 1340, 1340, 1340, 1340, 1340, 593: 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 614: 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 632: 1340, 637: 1340, 1340, 1340, 1340, 661: 1340, 707: 1340}, + {2: 1458, 1458, 1458, 1458, 1458, 1458, 1458, 10: 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 58: 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 536: 1458, 538: 1458, 1458, 1458, 1458, 545: 1458, 1458, 548: 1458, 1458, 1458, 552: 1458, 1458, 557: 1458, 1458, 567: 1458, 584: 1458, 591: 1458, 1458, 630: 1458, 1458, 633: 1458, 1458, 1458, 1458, 641: 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 662: 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 716: 1458, 721: 4204, 834: 4202, 4203, 891: 4205, 893: 4206, 920: 4225, 4207}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 4226}, // 1350 - {1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 537: 1332, 1332, 1332, 541: 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 554: 1332, 1332, 1332, 559: 1332, 1332, 1332, 1332, 1332, 565: 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 584: 1332, 1332, 1332, 1332, 1332, 1332, 1332, 593: 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 615: 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 625: 1332, 1332, 1332, 1332, 1332, 1332, 632: 1332, 637: 1332, 1332, 1332, 1332, 661: 1332, 707: 1332}, - {2: 1449, 1449, 1449, 1449, 1449, 1449, 1449, 10: 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 58: 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 536: 1449, 538: 1449, 1449, 1449, 1449, 545: 1449, 1449, 548: 1449, 1449, 1449, 552: 1449, 1449, 557: 1449, 1449, 564: 1449, 583: 1449, 591: 1449, 1449, 624: 1449, 631: 1449, 633: 1449, 1449, 1449, 1449, 641: 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 662: 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 702: 1449, 1449, 1449, 1449, 716: 1449, 721: 4196, 835: 4194, 4195, 891: 4197, 893: 4198, 918: 4222, 4199}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 4223}, - {57: 4224, 571: 3767, 3765, 3766, 3764, 3762, 806: 3763, 3761}, - {1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 537: 1165, 1165, 1165, 541: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 554: 1165, 1165, 1165, 559: 1165, 1165, 1165, 1165, 1165, 565: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 584: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 593: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 615: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 625: 1165, 1165, 1165, 1165, 1165, 1165, 632: 1165, 637: 1165, 1165, 1165, 1165, 661: 1165, 707: 1165, 826: 4086, 838: 4204, 850: 4225}, + {57: 4227, 572: 3772, 3770, 3771, 3769, 3767, 806: 3768, 3766}, + {1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 537: 1173, 1173, 1173, 541: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 554: 1173, 1173, 1173, 559: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 568: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 585: 1173, 1173, 1173, 1173, 1173, 1173, 593: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 614: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 632: 1173, 637: 1173, 1173, 1173, 1173, 661: 1173, 707: 1173, 826: 4094, 838: 4212, 850: 4228}, + {1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 537: 1341, 1341, 1341, 541: 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 554: 1341, 1341, 1341, 559: 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 568: 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 585: 1341, 1341, 1341, 1341, 1341, 1341, 593: 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 614: 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 632: 1341, 637: 1341, 1341, 1341, 1341, 661: 1341, 707: 1341}, + {2: 1458, 1458, 1458, 1458, 1458, 1458, 1458, 10: 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 58: 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 536: 1458, 538: 1458, 1458, 1458, 1458, 545: 1458, 1458, 548: 1458, 1458, 1458, 552: 1458, 1458, 557: 1458, 1458, 567: 1458, 584: 1458, 591: 1458, 1458, 630: 1458, 1458, 633: 1458, 1458, 1458, 1458, 641: 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 662: 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 716: 1458, 721: 4204, 834: 4202, 4203, 891: 4205, 893: 4206, 920: 4230, 4207}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 4231}, // 1355 - {1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 537: 1333, 1333, 1333, 541: 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 554: 1333, 1333, 1333, 559: 1333, 1333, 1333, 1333, 1333, 565: 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 584: 1333, 1333, 1333, 1333, 1333, 1333, 1333, 593: 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 615: 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 625: 1333, 1333, 1333, 1333, 1333, 1333, 632: 1333, 637: 1333, 1333, 1333, 1333, 661: 1333, 707: 1333}, - {2: 1449, 1449, 1449, 1449, 1449, 1449, 1449, 10: 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 58: 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 536: 1449, 538: 1449, 1449, 1449, 1449, 545: 1449, 1449, 548: 1449, 1449, 1449, 552: 1449, 1449, 557: 1449, 1449, 564: 1449, 583: 1449, 591: 1449, 1449, 624: 1449, 631: 1449, 633: 1449, 1449, 1449, 1449, 641: 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 662: 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 702: 1449, 1449, 1449, 1449, 716: 1449, 721: 4196, 835: 4194, 4195, 891: 4197, 893: 4198, 918: 4227, 4199}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 4228}, - {57: 4229, 571: 3767, 3765, 3766, 3764, 3762, 806: 3763, 3761}, - {1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 537: 1165, 1165, 1165, 541: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 554: 1165, 1165, 1165, 559: 1165, 1165, 1165, 1165, 1165, 565: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 584: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 593: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 615: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 625: 1165, 1165, 1165, 1165, 1165, 1165, 632: 1165, 637: 1165, 1165, 1165, 1165, 661: 1165, 707: 1165, 826: 4086, 838: 4204, 850: 4230}, + {57: 4232, 572: 3772, 3770, 3771, 3769, 3767, 806: 3768, 3766}, + {1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 537: 1173, 1173, 1173, 541: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 554: 1173, 1173, 1173, 559: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 568: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 585: 1173, 1173, 1173, 1173, 1173, 1173, 593: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 614: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 632: 1173, 637: 1173, 1173, 1173, 1173, 661: 1173, 707: 1173, 826: 4094, 838: 4212, 850: 4233}, + {1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 537: 1342, 1342, 1342, 541: 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 554: 1342, 1342, 1342, 559: 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 568: 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 585: 1342, 1342, 1342, 1342, 1342, 1342, 593: 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 614: 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 632: 1342, 637: 1342, 1342, 1342, 1342, 661: 1342, 707: 1342}, + {2: 1458, 1458, 1458, 1458, 1458, 1458, 1458, 10: 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 58: 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 536: 1458, 538: 1458, 1458, 1458, 1458, 545: 1458, 1458, 548: 1458, 1458, 1458, 552: 1458, 1458, 557: 1458, 1458, 567: 1458, 584: 1458, 591: 1458, 1458, 630: 1458, 1458, 633: 1458, 1458, 1458, 1458, 641: 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 662: 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 716: 1458, 721: 4204, 834: 4202, 4203, 891: 4205, 893: 4206, 920: 4235, 4207}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 4236}, // 1360 - {1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 537: 1334, 1334, 1334, 541: 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 554: 1334, 1334, 1334, 559: 1334, 1334, 1334, 1334, 1334, 565: 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 584: 1334, 1334, 1334, 1334, 1334, 1334, 1334, 593: 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 615: 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 625: 1334, 1334, 1334, 1334, 1334, 1334, 632: 1334, 637: 1334, 1334, 1334, 1334, 661: 1334, 707: 1334}, - {2: 1449, 1449, 1449, 1449, 1449, 1449, 1449, 10: 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 58: 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 536: 1449, 538: 1449, 1449, 1449, 1449, 545: 1449, 1449, 548: 1449, 1449, 1449, 552: 1449, 1449, 557: 1449, 1449, 564: 1449, 583: 1449, 591: 1449, 1449, 624: 1449, 631: 1449, 633: 1449, 1449, 1449, 1449, 641: 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 662: 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 702: 1449, 1449, 1449, 1449, 716: 1449, 721: 4196, 835: 4194, 4195, 891: 4197, 893: 4198, 918: 4232, 4199}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 4233}, - {57: 4234, 571: 3767, 3765, 3766, 3764, 3762, 806: 3763, 3761}, - {1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 537: 1165, 1165, 1165, 541: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 554: 1165, 1165, 1165, 559: 1165, 1165, 1165, 1165, 1165, 565: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 584: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 593: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 615: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 625: 1165, 1165, 1165, 1165, 1165, 1165, 632: 1165, 637: 1165, 1165, 1165, 1165, 661: 1165, 707: 1165, 826: 4086, 838: 4204, 850: 4235}, + {57: 4237, 572: 3772, 3770, 3771, 3769, 3767, 806: 3768, 3766}, + {1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 537: 1173, 1173, 1173, 541: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 554: 1173, 1173, 1173, 559: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 568: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 585: 1173, 1173, 1173, 1173, 1173, 1173, 593: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 614: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 632: 1173, 637: 1173, 1173, 1173, 1173, 661: 1173, 707: 1173, 826: 4094, 838: 4212, 850: 4238}, + {1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 537: 1343, 1343, 1343, 541: 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 554: 1343, 1343, 1343, 559: 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 568: 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 585: 1343, 1343, 1343, 1343, 1343, 1343, 593: 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 614: 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 632: 1343, 637: 1343, 1343, 1343, 1343, 661: 1343, 707: 1343}, + {2: 1458, 1458, 1458, 1458, 1458, 1458, 1458, 10: 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 58: 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 536: 1458, 538: 1458, 1458, 1458, 1458, 545: 1458, 1458, 548: 1458, 1458, 1458, 552: 1458, 1458, 557: 1458, 1458, 567: 1458, 584: 1458, 591: 1458, 1458, 630: 1458, 1458, 633: 1458, 1458, 1458, 1458, 641: 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 662: 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 716: 1458, 721: 4204, 834: 4202, 4203, 891: 4205, 893: 4206, 920: 4240, 4207}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 4241}, // 1365 - {1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 537: 1335, 1335, 1335, 541: 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 554: 1335, 1335, 1335, 559: 1335, 1335, 1335, 1335, 1335, 565: 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 584: 1335, 1335, 1335, 1335, 1335, 1335, 1335, 593: 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 615: 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 625: 1335, 1335, 1335, 1335, 1335, 1335, 632: 1335, 637: 1335, 1335, 1335, 1335, 661: 1335, 707: 1335}, - {2: 1449, 1449, 1449, 1449, 1449, 1449, 1449, 10: 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 58: 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 536: 1449, 538: 1449, 1449, 1449, 1449, 545: 1449, 1449, 548: 1449, 1449, 1449, 552: 1449, 1449, 557: 1449, 1449, 564: 1449, 583: 1449, 591: 1449, 1449, 624: 1449, 631: 1449, 633: 1449, 1449, 1449, 1449, 641: 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 662: 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 702: 1449, 1449, 1449, 1449, 716: 1449, 721: 4196, 835: 4194, 4195, 891: 4197, 893: 4198, 918: 4237, 4199}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 3864, 869: 4238}, - {9: 4012, 57: 1507, 160: 1507, 569: 3879, 848: 3933, 915: 4239}, - {57: 1322, 160: 4241, 1410: 4240}, + {57: 4242, 572: 3772, 3770, 3771, 3769, 3767, 806: 3768, 3766}, + {1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 537: 1173, 1173, 1173, 541: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 554: 1173, 1173, 1173, 559: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 568: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 585: 1173, 1173, 1173, 1173, 1173, 1173, 593: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 614: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 632: 1173, 637: 1173, 1173, 1173, 1173, 661: 1173, 707: 1173, 826: 4094, 838: 4212, 850: 4243}, + {1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 537: 1344, 1344, 1344, 541: 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 554: 1344, 1344, 1344, 559: 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 568: 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 585: 1344, 1344, 1344, 1344, 1344, 1344, 593: 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 614: 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 632: 1344, 637: 1344, 1344, 1344, 1344, 661: 1344, 707: 1344}, + {2: 1458, 1458, 1458, 1458, 1458, 1458, 1458, 10: 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 58: 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 536: 1458, 538: 1458, 1458, 1458, 1458, 545: 1458, 1458, 548: 1458, 1458, 1458, 552: 1458, 1458, 557: 1458, 1458, 567: 1458, 584: 1458, 591: 1458, 1458, 630: 1458, 1458, 633: 1458, 1458, 1458, 1458, 641: 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 662: 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 716: 1458, 721: 4204, 834: 4202, 4203, 891: 4205, 893: 4206, 920: 4245, 4207}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 3869, 869: 4246}, // 1370 - {57: 4243}, - {538: 4242}, - {57: 1321}, - {1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 537: 1165, 1165, 1165, 541: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 554: 1165, 1165, 1165, 559: 1165, 1165, 1165, 1165, 1165, 565: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 584: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 593: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 615: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 625: 1165, 1165, 1165, 1165, 1165, 1165, 632: 1165, 637: 1165, 1165, 1165, 1165, 661: 1165, 707: 1165, 826: 4086, 838: 4204, 850: 4244}, - {1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 537: 1336, 1336, 1336, 541: 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 554: 1336, 1336, 1336, 559: 1336, 1336, 1336, 1336, 1336, 565: 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 584: 1336, 1336, 1336, 1336, 1336, 1336, 1336, 593: 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 615: 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 625: 1336, 1336, 1336, 1336, 1336, 1336, 632: 1336, 637: 1336, 1336, 1336, 1336, 661: 1336, 707: 1336}, + {9: 4020, 57: 1516, 162: 1516, 570: 3884, 847: 3938, 917: 4247}, + {57: 1331, 162: 4249, 1409: 4248}, + {57: 4251}, + {538: 4250}, + {57: 1330}, // 1375 - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 589: 4249, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 721: 4248, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 4246, 835: 4194, 4195, 891: 4247}, - {57: 4257, 571: 3767, 3765, 3766, 3764, 3762, 806: 3763, 3761}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 3864, 869: 4255}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 4252}, - {57: 4250}, + {1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 537: 1173, 1173, 1173, 541: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 554: 1173, 1173, 1173, 559: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 568: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 585: 1173, 1173, 1173, 1173, 1173, 1173, 593: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 614: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 632: 1173, 637: 1173, 1173, 1173, 1173, 661: 1173, 707: 1173, 826: 4094, 838: 4212, 850: 4252}, + {1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 537: 1345, 1345, 1345, 541: 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 554: 1345, 1345, 1345, 559: 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 568: 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 585: 1345, 1345, 1345, 1345, 1345, 1345, 593: 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 614: 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 632: 1345, 637: 1345, 1345, 1345, 1345, 661: 1345, 707: 1345}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 565: 4257, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 721: 4256, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 4254, 834: 4202, 4203, 891: 4255}, + {57: 4265, 572: 3772, 3770, 3771, 3769, 3767, 806: 3768, 3766}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 3869, 869: 4263}, // 1380 - {1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 537: 1165, 1165, 1165, 541: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 554: 1165, 1165, 1165, 559: 1165, 1165, 1165, 1165, 1165, 565: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 584: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 593: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 615: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 625: 1165, 1165, 1165, 1165, 1165, 1165, 632: 1165, 637: 1165, 1165, 1165, 1165, 661: 1165, 707: 1165, 826: 4086, 838: 4204, 850: 4251}, - {1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 537: 1337, 1337, 1337, 541: 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 554: 1337, 1337, 1337, 559: 1337, 1337, 1337, 1337, 1337, 565: 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 584: 1337, 1337, 1337, 1337, 1337, 1337, 1337, 593: 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 615: 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 625: 1337, 1337, 1337, 1337, 1337, 1337, 632: 1337, 637: 1337, 1337, 1337, 1337, 661: 1337, 707: 1337}, - {57: 4253, 571: 3767, 3765, 3766, 3764, 3762, 806: 3763, 3761}, - {1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 537: 1165, 1165, 1165, 541: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 554: 1165, 1165, 1165, 559: 1165, 1165, 1165, 1165, 1165, 565: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 584: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 593: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 615: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 625: 1165, 1165, 1165, 1165, 1165, 1165, 632: 1165, 637: 1165, 1165, 1165, 1165, 661: 1165, 707: 1165, 826: 4086, 838: 4204, 850: 4254}, - {1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 537: 1339, 1339, 1339, 541: 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 554: 1339, 1339, 1339, 559: 1339, 1339, 1339, 1339, 1339, 565: 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 584: 1339, 1339, 1339, 1339, 1339, 1339, 1339, 593: 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 615: 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 625: 1339, 1339, 1339, 1339, 1339, 1339, 632: 1339, 637: 1339, 1339, 1339, 1339, 661: 1339, 707: 1339}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 4260}, + {57: 4258}, + {1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 537: 1173, 1173, 1173, 541: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 554: 1173, 1173, 1173, 559: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 568: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 585: 1173, 1173, 1173, 1173, 1173, 1173, 593: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 614: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 632: 1173, 637: 1173, 1173, 1173, 1173, 661: 1173, 707: 1173, 826: 4094, 838: 4212, 850: 4259}, + {1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 537: 1346, 1346, 1346, 541: 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 554: 1346, 1346, 1346, 559: 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 568: 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 585: 1346, 1346, 1346, 1346, 1346, 1346, 593: 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 614: 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 632: 1346, 637: 1346, 1346, 1346, 1346, 661: 1346, 707: 1346}, + {57: 4261, 572: 3772, 3770, 3771, 3769, 3767, 806: 3768, 3766}, // 1385 - {9: 4012, 57: 4256}, - {1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 537: 1340, 1340, 1340, 541: 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 554: 1340, 1340, 1340, 559: 1340, 1340, 1340, 1340, 1340, 565: 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 584: 1340, 1340, 1340, 1340, 1340, 1340, 1340, 593: 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 615: 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 625: 1340, 1340, 1340, 1340, 1340, 1340, 632: 1340, 637: 1340, 1340, 1340, 1340, 661: 1340, 707: 1340}, - {1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 537: 1165, 1165, 1165, 541: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 554: 1165, 1165, 1165, 559: 1165, 1165, 1165, 1165, 1165, 565: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 584: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 593: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 615: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 625: 1165, 1165, 1165, 1165, 1165, 1165, 632: 1165, 637: 1165, 1165, 1165, 1165, 661: 1165, 707: 1165, 826: 4086, 838: 4204, 850: 4258}, - {1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 537: 1338, 1338, 1338, 541: 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 554: 1338, 1338, 1338, 559: 1338, 1338, 1338, 1338, 1338, 565: 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 584: 1338, 1338, 1338, 1338, 1338, 1338, 1338, 593: 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 615: 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 625: 1338, 1338, 1338, 1338, 1338, 1338, 632: 1338, 637: 1338, 1338, 1338, 1338, 661: 1338, 707: 1338}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 721: 4261, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 4260}, + {1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 537: 1173, 1173, 1173, 541: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 554: 1173, 1173, 1173, 559: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 568: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 585: 1173, 1173, 1173, 1173, 1173, 1173, 593: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 614: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 632: 1173, 637: 1173, 1173, 1173, 1173, 661: 1173, 707: 1173, 826: 4094, 838: 4212, 850: 4262}, + {1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 537: 1348, 1348, 1348, 541: 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 554: 1348, 1348, 1348, 559: 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 568: 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 585: 1348, 1348, 1348, 1348, 1348, 1348, 593: 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 614: 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 632: 1348, 637: 1348, 1348, 1348, 1348, 661: 1348, 707: 1348}, + {9: 4020, 57: 4264}, + {1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 537: 1349, 1349, 1349, 541: 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 554: 1349, 1349, 1349, 559: 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 568: 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 585: 1349, 1349, 1349, 1349, 1349, 1349, 593: 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 614: 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 632: 1349, 637: 1349, 1349, 1349, 1349, 661: 1349, 707: 1349}, + {1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 537: 1173, 1173, 1173, 541: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 554: 1173, 1173, 1173, 559: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 568: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 585: 1173, 1173, 1173, 1173, 1173, 1173, 593: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 614: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 632: 1173, 637: 1173, 1173, 1173, 1173, 661: 1173, 707: 1173, 826: 4094, 838: 4212, 850: 4266}, // 1390 - {57: 4265, 571: 3767, 3765, 3766, 3764, 3762, 806: 3763, 3761}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 4262}, - {57: 4263, 571: 3767, 3765, 3766, 3764, 3762, 806: 3763, 3761}, - {1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 537: 1165, 1165, 1165, 541: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 554: 1165, 1165, 1165, 559: 1165, 1165, 1165, 1165, 1165, 565: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 584: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 593: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 615: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 625: 1165, 1165, 1165, 1165, 1165, 1165, 632: 1165, 637: 1165, 1165, 1165, 1165, 661: 1165, 707: 1165, 826: 4086, 838: 4204, 850: 4264}, - {1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 537: 1341, 1341, 1341, 541: 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 554: 1341, 1341, 1341, 559: 1341, 1341, 1341, 1341, 1341, 565: 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 584: 1341, 1341, 1341, 1341, 1341, 1341, 1341, 593: 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 615: 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 625: 1341, 1341, 1341, 1341, 1341, 1341, 632: 1341, 637: 1341, 1341, 1341, 1341, 661: 1341, 707: 1341}, + {1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 537: 1347, 1347, 1347, 541: 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 554: 1347, 1347, 1347, 559: 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 568: 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 585: 1347, 1347, 1347, 1347, 1347, 1347, 593: 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 614: 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 632: 1347, 637: 1347, 1347, 1347, 1347, 661: 1347, 707: 1347}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 721: 4269, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 4268}, + {57: 4273, 572: 3772, 3770, 3771, 3769, 3767, 806: 3768, 3766}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 4270}, + {57: 4271, 572: 3772, 3770, 3771, 3769, 3767, 806: 3768, 3766}, // 1395 - {1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 537: 1165, 1165, 1165, 541: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 554: 1165, 1165, 1165, 559: 1165, 1165, 1165, 1165, 1165, 565: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 584: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 593: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 615: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 625: 1165, 1165, 1165, 1165, 1165, 1165, 632: 1165, 637: 1165, 1165, 1165, 1165, 661: 1165, 707: 1165, 826: 4086, 838: 4204, 850: 4266}, - {1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 537: 1342, 1342, 1342, 541: 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 554: 1342, 1342, 1342, 559: 1342, 1342, 1342, 1342, 1342, 565: 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 584: 1342, 1342, 1342, 1342, 1342, 1342, 1342, 593: 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 615: 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 625: 1342, 1342, 1342, 1342, 1342, 1342, 632: 1342, 637: 1342, 1342, 1342, 1342, 661: 1342, 707: 1342}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 721: 4269, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 4268}, - {57: 4273, 571: 3767, 3765, 3766, 3764, 3762, 806: 3763, 3761}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 4270}, + {1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 537: 1173, 1173, 1173, 541: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 554: 1173, 1173, 1173, 559: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 568: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 585: 1173, 1173, 1173, 1173, 1173, 1173, 593: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 614: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 632: 1173, 637: 1173, 1173, 1173, 1173, 661: 1173, 707: 1173, 826: 4094, 838: 4212, 850: 4272}, + {1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 537: 1350, 1350, 1350, 541: 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 554: 1350, 1350, 1350, 559: 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 568: 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 585: 1350, 1350, 1350, 1350, 1350, 1350, 593: 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 614: 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 632: 1350, 637: 1350, 1350, 1350, 1350, 661: 1350, 707: 1350}, + {1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 537: 1173, 1173, 1173, 541: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 554: 1173, 1173, 1173, 559: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 568: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 585: 1173, 1173, 1173, 1173, 1173, 1173, 593: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 614: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 632: 1173, 637: 1173, 1173, 1173, 1173, 661: 1173, 707: 1173, 826: 4094, 838: 4212, 850: 4274}, + {1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 537: 1351, 1351, 1351, 541: 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 554: 1351, 1351, 1351, 559: 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 568: 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 585: 1351, 1351, 1351, 1351, 1351, 1351, 593: 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 614: 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 632: 1351, 637: 1351, 1351, 1351, 1351, 661: 1351, 707: 1351}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 721: 4277, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 4276}, // 1400 - {57: 4271, 571: 3767, 3765, 3766, 3764, 3762, 806: 3763, 3761}, - {1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 537: 1165, 1165, 1165, 541: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 554: 1165, 1165, 1165, 559: 1165, 1165, 1165, 1165, 1165, 565: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 584: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 593: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 615: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 625: 1165, 1165, 1165, 1165, 1165, 1165, 632: 1165, 637: 1165, 1165, 1165, 1165, 661: 1165, 707: 1165, 826: 4086, 838: 4204, 850: 4272}, - {1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 537: 1343, 1343, 1343, 541: 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 554: 1343, 1343, 1343, 559: 1343, 1343, 1343, 1343, 1343, 565: 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 584: 1343, 1343, 1343, 1343, 1343, 1343, 1343, 593: 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 615: 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 625: 1343, 1343, 1343, 1343, 1343, 1343, 632: 1343, 637: 1343, 1343, 1343, 1343, 661: 1343, 707: 1343}, - {1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 537: 1165, 1165, 1165, 541: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 554: 1165, 1165, 1165, 559: 1165, 1165, 1165, 1165, 1165, 565: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 584: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 593: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 615: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 625: 1165, 1165, 1165, 1165, 1165, 1165, 632: 1165, 637: 1165, 1165, 1165, 1165, 661: 1165, 707: 1165, 826: 4086, 838: 4204, 850: 4274}, - {1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 537: 1344, 1344, 1344, 541: 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 554: 1344, 1344, 1344, 559: 1344, 1344, 1344, 1344, 1344, 565: 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 584: 1344, 1344, 1344, 1344, 1344, 1344, 1344, 593: 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 615: 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 625: 1344, 1344, 1344, 1344, 1344, 1344, 632: 1344, 637: 1344, 1344, 1344, 1344, 661: 1344, 707: 1344}, + {57: 4281, 572: 3772, 3770, 3771, 3769, 3767, 806: 3768, 3766}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 4278}, + {57: 4279, 572: 3772, 3770, 3771, 3769, 3767, 806: 3768, 3766}, + {1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 537: 1173, 1173, 1173, 541: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 554: 1173, 1173, 1173, 559: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 568: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 585: 1173, 1173, 1173, 1173, 1173, 1173, 593: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 614: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 632: 1173, 637: 1173, 1173, 1173, 1173, 661: 1173, 707: 1173, 826: 4094, 838: 4212, 850: 4280}, + {1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 537: 1352, 1352, 1352, 541: 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 554: 1352, 1352, 1352, 559: 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 568: 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 585: 1352, 1352, 1352, 1352, 1352, 1352, 593: 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 614: 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 632: 1352, 637: 1352, 1352, 1352, 1352, 661: 1352, 707: 1352}, // 1405 - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 721: 4277, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 4276}, - {57: 4281, 571: 3767, 3765, 3766, 3764, 3762, 806: 3763, 3761}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 4278}, - {57: 4279, 571: 3767, 3765, 3766, 3764, 3762, 806: 3763, 3761}, - {1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 537: 1165, 1165, 1165, 541: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 554: 1165, 1165, 1165, 559: 1165, 1165, 1165, 1165, 1165, 565: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 584: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 593: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 615: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 625: 1165, 1165, 1165, 1165, 1165, 1165, 632: 1165, 637: 1165, 1165, 1165, 1165, 661: 1165, 707: 1165, 826: 4086, 838: 4204, 850: 4280}, + {1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 537: 1173, 1173, 1173, 541: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 554: 1173, 1173, 1173, 559: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 568: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 585: 1173, 1173, 1173, 1173, 1173, 1173, 593: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 614: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 632: 1173, 637: 1173, 1173, 1173, 1173, 661: 1173, 707: 1173, 826: 4094, 838: 4212, 850: 4282}, + {1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 537: 1353, 1353, 1353, 541: 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 554: 1353, 1353, 1353, 559: 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 568: 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 585: 1353, 1353, 1353, 1353, 1353, 1353, 593: 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 614: 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 632: 1353, 637: 1353, 1353, 1353, 1353, 661: 1353, 707: 1353}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 721: 4285, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 4284}, + {57: 4289, 572: 3772, 3770, 3771, 3769, 3767, 806: 3768, 3766}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 4286}, // 1410 - {1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 537: 1345, 1345, 1345, 541: 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 554: 1345, 1345, 1345, 559: 1345, 1345, 1345, 1345, 1345, 565: 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 584: 1345, 1345, 1345, 1345, 1345, 1345, 1345, 593: 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 615: 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 625: 1345, 1345, 1345, 1345, 1345, 1345, 632: 1345, 637: 1345, 1345, 1345, 1345, 661: 1345, 707: 1345}, - {1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 537: 1165, 1165, 1165, 541: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 554: 1165, 1165, 1165, 559: 1165, 1165, 1165, 1165, 1165, 565: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 584: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 593: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 615: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 625: 1165, 1165, 1165, 1165, 1165, 1165, 632: 1165, 637: 1165, 1165, 1165, 1165, 661: 1165, 707: 1165, 826: 4086, 838: 4204, 850: 4282}, - {1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 537: 1346, 1346, 1346, 541: 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 554: 1346, 1346, 1346, 559: 1346, 1346, 1346, 1346, 1346, 565: 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 584: 1346, 1346, 1346, 1346, 1346, 1346, 1346, 593: 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 615: 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 625: 1346, 1346, 1346, 1346, 1346, 1346, 632: 1346, 637: 1346, 1346, 1346, 1346, 661: 1346, 707: 1346}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 3864, 869: 4284}, - {9: 4012, 57: 4285}, + {57: 4287, 572: 3772, 3770, 3771, 3769, 3767, 806: 3768, 3766}, + {1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 537: 1173, 1173, 1173, 541: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 554: 1173, 1173, 1173, 559: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 568: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 585: 1173, 1173, 1173, 1173, 1173, 1173, 593: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 614: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 632: 1173, 637: 1173, 1173, 1173, 1173, 661: 1173, 707: 1173, 826: 4094, 838: 4212, 850: 4288}, + {1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 537: 1354, 1354, 1354, 541: 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 554: 1354, 1354, 1354, 559: 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 568: 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 585: 1354, 1354, 1354, 1354, 1354, 1354, 593: 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 614: 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 632: 1354, 637: 1354, 1354, 1354, 1354, 661: 1354, 707: 1354}, + {1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 537: 1173, 1173, 1173, 541: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 554: 1173, 1173, 1173, 559: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 568: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 585: 1173, 1173, 1173, 1173, 1173, 1173, 593: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 614: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 632: 1173, 637: 1173, 1173, 1173, 1173, 661: 1173, 707: 1173, 826: 4094, 838: 4212, 850: 4290}, + {1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 537: 1355, 1355, 1355, 541: 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 554: 1355, 1355, 1355, 559: 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 568: 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 585: 1355, 1355, 1355, 1355, 1355, 1355, 593: 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 614: 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 632: 1355, 637: 1355, 1355, 1355, 1355, 661: 1355, 707: 1355}, // 1415 - {1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 537: 1347, 1347, 1347, 541: 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 554: 1347, 1347, 1347, 559: 1347, 1347, 1347, 1347, 1347, 565: 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 584: 1347, 1347, 1347, 1347, 1347, 1347, 1347, 593: 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 615: 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 625: 1347, 1347, 1347, 1347, 1347, 1347, 632: 1347, 637: 1347, 1347, 1347, 1347, 661: 1347, 707: 1347}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 3864, 869: 4287}, - {9: 4012, 57: 4288}, - {1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 537: 1348, 1348, 1348, 541: 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 554: 1348, 1348, 1348, 559: 1348, 1348, 1348, 1348, 1348, 565: 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 584: 1348, 1348, 1348, 1348, 1348, 1348, 1348, 593: 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 615: 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 625: 1348, 1348, 1348, 1348, 1348, 1348, 632: 1348, 637: 1348, 1348, 1348, 1348, 661: 1348, 707: 1348}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 4290}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 3869, 869: 4292}, + {9: 4020, 57: 4293}, + {1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 537: 1356, 1356, 1356, 541: 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 554: 1356, 1356, 1356, 559: 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 568: 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 585: 1356, 1356, 1356, 1356, 1356, 1356, 593: 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 614: 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 632: 1356, 637: 1356, 1356, 1356, 1356, 661: 1356, 707: 1356}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 3869, 869: 4295}, + {9: 4020, 57: 4296}, // 1420 - {9: 4291, 571: 3767, 3765, 3766, 3764, 3762, 806: 3763, 3761}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 4292}, - {9: 4293, 571: 3767, 3765, 3766, 3764, 3762, 806: 3763, 3761}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 4294}, - {57: 4295, 571: 3767, 3765, 3766, 3764, 3762, 806: 3763, 3761}, + {1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 537: 1357, 1357, 1357, 541: 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 554: 1357, 1357, 1357, 559: 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 568: 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 585: 1357, 1357, 1357, 1357, 1357, 1357, 593: 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 614: 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 632: 1357, 637: 1357, 1357, 1357, 1357, 661: 1357, 707: 1357}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 4298}, + {9: 4299, 572: 3772, 3770, 3771, 3769, 3767, 806: 3768, 3766}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 4300}, + {9: 4301, 572: 3772, 3770, 3771, 3769, 3767, 806: 3768, 3766}, // 1425 - {1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 537: 1364, 1364, 1364, 541: 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 554: 1364, 1364, 1364, 559: 1364, 1364, 1364, 1364, 1364, 565: 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 584: 1364, 1364, 1364, 1364, 1364, 1364, 1364, 593: 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 615: 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 625: 1364, 1364, 1364, 1364, 1364, 1364, 632: 1364, 637: 1364, 1364, 1364, 1364, 661: 1364, 707: 1364}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 4297, 1335: 4299, 1389: 4300, 1492: 4301, 4298}, - {57: 4309, 566: 4310, 571: 3767, 3765, 3766, 3764, 3762, 806: 3763, 3761}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 566: 4303, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 4302}, - {2: 1355, 1355, 1355, 1355, 1355, 1355, 1355, 10: 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 58: 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 536: 1355, 538: 1355, 1355, 1355, 1355, 545: 1355, 1355, 548: 1355, 1355, 1355, 552: 1355, 1355, 557: 1355, 1355, 564: 1355, 566: 1355, 583: 1355, 591: 1355, 1355, 624: 1355, 631: 1355, 633: 1355, 1355, 1355, 1355, 641: 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 662: 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 702: 1355, 1355, 1355, 1355, 716: 1355}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 4302}, + {57: 4303, 572: 3772, 3770, 3771, 3769, 3767, 806: 3768, 3766}, + {1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 537: 1373, 1373, 1373, 541: 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 554: 1373, 1373, 1373, 559: 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 568: 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 585: 1373, 1373, 1373, 1373, 1373, 1373, 593: 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 614: 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 632: 1373, 637: 1373, 1373, 1373, 1373, 661: 1373, 707: 1373}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 4305, 1333: 4307, 1388: 4308, 1492: 4309, 4306}, + {57: 4317, 566: 4318, 572: 3772, 3770, 3771, 3769, 3767, 806: 3768, 3766}, // 1430 - {2: 1354, 1354, 1354, 1354, 1354, 1354, 1354, 10: 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 58: 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 536: 1354, 538: 1354, 1354, 1354, 1354, 545: 1354, 1354, 548: 1354, 1354, 1354, 552: 1354, 1354, 557: 1354, 1354, 564: 1354, 566: 1354, 583: 1354, 591: 1354, 1354, 624: 1354, 631: 1354, 633: 1354, 1354, 1354, 1354, 641: 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 662: 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 702: 1354, 1354, 1354, 1354, 716: 1354}, - {2: 1353, 1353, 1353, 1353, 1353, 1353, 1353, 10: 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 58: 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 536: 1353, 538: 1353, 1353, 1353, 1353, 545: 1353, 1353, 548: 1353, 1353, 1353, 552: 1353, 1353, 557: 1353, 1353, 564: 1353, 566: 1353, 583: 1353, 591: 1353, 1353, 624: 1353, 631: 1353, 633: 1353, 1353, 1353, 1353, 641: 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 662: 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 702: 1353, 1353, 1353, 1353, 716: 1353}, - {566: 4306, 571: 3767, 3765, 3766, 3764, 3762, 806: 3763, 3761}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 4304}, - {57: 4305, 571: 3767, 3765, 3766, 3764, 3762, 806: 3763, 3761}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 566: 4311, 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 4310}, + {2: 1364, 1364, 1364, 1364, 1364, 1364, 1364, 10: 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 58: 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 536: 1364, 538: 1364, 1364, 1364, 1364, 545: 1364, 1364, 548: 1364, 1364, 1364, 552: 1364, 1364, 557: 1364, 1364, 566: 1364, 1364, 584: 1364, 591: 1364, 1364, 630: 1364, 1364, 633: 1364, 1364, 1364, 1364, 641: 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 662: 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 716: 1364}, + {2: 1363, 1363, 1363, 1363, 1363, 1363, 1363, 10: 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 58: 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 536: 1363, 538: 1363, 1363, 1363, 1363, 545: 1363, 1363, 548: 1363, 1363, 1363, 552: 1363, 1363, 557: 1363, 1363, 566: 1363, 1363, 584: 1363, 591: 1363, 1363, 630: 1363, 1363, 633: 1363, 1363, 1363, 1363, 641: 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 662: 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 716: 1363}, + {2: 1362, 1362, 1362, 1362, 1362, 1362, 1362, 10: 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 58: 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 536: 1362, 538: 1362, 1362, 1362, 1362, 545: 1362, 1362, 548: 1362, 1362, 1362, 552: 1362, 1362, 557: 1362, 1362, 566: 1362, 1362, 584: 1362, 591: 1362, 1362, 630: 1362, 1362, 633: 1362, 1362, 1362, 1362, 641: 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 662: 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 716: 1362}, + {566: 4314, 572: 3772, 3770, 3771, 3769, 3767, 806: 3768, 3766}, // 1435 - {1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 537: 1370, 1370, 1370, 541: 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 554: 1370, 1370, 1370, 559: 1370, 1370, 1370, 1370, 1370, 565: 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 584: 1370, 1370, 1370, 1370, 1370, 1370, 1370, 593: 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 615: 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 625: 1370, 1370, 1370, 1370, 1370, 1370, 632: 1370, 637: 1370, 1370, 1370, 1370, 661: 1370, 707: 1370}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 4307}, - {57: 4308, 571: 3767, 3765, 3766, 3764, 3762, 806: 3763, 3761}, - {1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 537: 1369, 1369, 1369, 541: 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 554: 1369, 1369, 1369, 559: 1369, 1369, 1369, 1369, 1369, 565: 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 584: 1369, 1369, 1369, 1369, 1369, 1369, 1369, 593: 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 615: 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 625: 1369, 1369, 1369, 1369, 1369, 1369, 632: 1369, 637: 1369, 1369, 1369, 1369, 661: 1369, 707: 1369}, - {1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 537: 1372, 1372, 1372, 541: 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 554: 1372, 1372, 1372, 559: 1372, 1372, 1372, 1372, 1372, 565: 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 584: 1372, 1372, 1372, 1372, 1372, 1372, 1372, 593: 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 615: 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 625: 1372, 1372, 1372, 1372, 1372, 1372, 632: 1372, 637: 1372, 1372, 1372, 1372, 661: 1372, 707: 1372}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 4312}, + {57: 4313, 572: 3772, 3770, 3771, 3769, 3767, 806: 3768, 3766}, + {1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 537: 1379, 1379, 1379, 541: 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 554: 1379, 1379, 1379, 559: 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 568: 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 585: 1379, 1379, 1379, 1379, 1379, 1379, 593: 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 614: 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 632: 1379, 637: 1379, 1379, 1379, 1379, 661: 1379, 707: 1379}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 4315}, + {57: 4316, 572: 3772, 3770, 3771, 3769, 3767, 806: 3768, 3766}, // 1440 - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 4311}, - {57: 4312, 571: 3767, 3765, 3766, 3764, 3762, 806: 3763, 3761}, - {1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 537: 1371, 1371, 1371, 541: 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 554: 1371, 1371, 1371, 559: 1371, 1371, 1371, 1371, 1371, 565: 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 584: 1371, 1371, 1371, 1371, 1371, 1371, 1371, 593: 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 615: 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 625: 1371, 1371, 1371, 1371, 1371, 1371, 632: 1371, 637: 1371, 1371, 1371, 1371, 661: 1371, 707: 1371}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 4314}, - {9: 4315, 566: 4316, 571: 3767, 3765, 3766, 3764, 3762, 806: 3763, 3761}, + {1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 537: 1378, 1378, 1378, 541: 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 554: 1378, 1378, 1378, 559: 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 568: 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 585: 1378, 1378, 1378, 1378, 1378, 1378, 593: 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 614: 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 632: 1378, 637: 1378, 1378, 1378, 1378, 661: 1378, 707: 1378}, + {1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 537: 1381, 1381, 1381, 541: 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 554: 1381, 1381, 1381, 559: 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 568: 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 585: 1381, 1381, 1381, 1381, 1381, 1381, 593: 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 614: 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 632: 1381, 637: 1381, 1381, 1381, 1381, 661: 1381, 707: 1381}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 4319}, + {57: 4320, 572: 3772, 3770, 3771, 3769, 3767, 806: 3768, 3766}, + {1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 537: 1380, 1380, 1380, 541: 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 554: 1380, 1380, 1380, 559: 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 568: 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 585: 1380, 1380, 1380, 1380, 1380, 1380, 593: 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 614: 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 632: 1380, 637: 1380, 1380, 1380, 1380, 661: 1380, 707: 1380}, // 1445 - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 4322}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 4317}, - {57: 4318, 563: 4319, 571: 3767, 3765, 3766, 3764, 3762, 806: 3763, 3761}, - {1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 537: 1377, 1377, 1377, 541: 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 554: 1377, 1377, 1377, 559: 1377, 1377, 1377, 1377, 1377, 565: 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 584: 1377, 1377, 1377, 1377, 1377, 1377, 1377, 593: 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 615: 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 625: 1377, 1377, 1377, 1377, 1377, 1377, 632: 1377, 637: 1377, 1377, 1377, 1377, 661: 1377, 707: 1377}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 4320}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 4322}, + {9: 4323, 566: 4324, 572: 3772, 3770, 3771, 3769, 3767, 806: 3768, 3766}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 4330}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 4325}, + {57: 4326, 563: 4327, 572: 3772, 3770, 3771, 3769, 3767, 806: 3768, 3766}, // 1450 - {57: 4321, 571: 3767, 3765, 3766, 3764, 3762, 806: 3763, 3761}, - {1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 537: 1375, 1375, 1375, 541: 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 554: 1375, 1375, 1375, 559: 1375, 1375, 1375, 1375, 1375, 565: 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 584: 1375, 1375, 1375, 1375, 1375, 1375, 1375, 593: 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 615: 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 625: 1375, 1375, 1375, 1375, 1375, 1375, 632: 1375, 637: 1375, 1375, 1375, 1375, 661: 1375, 707: 1375}, - {9: 4324, 57: 4323, 571: 3767, 3765, 3766, 3764, 3762, 806: 3763, 3761}, - {1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 537: 1378, 1378, 1378, 541: 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 554: 1378, 1378, 1378, 559: 1378, 1378, 1378, 1378, 1378, 565: 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 584: 1378, 1378, 1378, 1378, 1378, 1378, 1378, 593: 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 615: 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 625: 1378, 1378, 1378, 1378, 1378, 1378, 632: 1378, 637: 1378, 1378, 1378, 1378, 661: 1378, 707: 1378}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 4325}, + {1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 537: 1386, 1386, 1386, 541: 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 554: 1386, 1386, 1386, 559: 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 568: 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 585: 1386, 1386, 1386, 1386, 1386, 1386, 593: 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 614: 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 632: 1386, 637: 1386, 1386, 1386, 1386, 661: 1386, 707: 1386}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 4328}, + {57: 4329, 572: 3772, 3770, 3771, 3769, 3767, 806: 3768, 3766}, + {1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 537: 1384, 1384, 1384, 541: 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 554: 1384, 1384, 1384, 559: 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 568: 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 585: 1384, 1384, 1384, 1384, 1384, 1384, 593: 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 614: 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 632: 1384, 637: 1384, 1384, 1384, 1384, 661: 1384, 707: 1384}, + {9: 4332, 57: 4331, 572: 3772, 3770, 3771, 3769, 3767, 806: 3768, 3766}, // 1455 - {57: 4326, 571: 3767, 3765, 3766, 3764, 3762, 806: 3763, 3761}, - {1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 537: 1376, 1376, 1376, 541: 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 554: 1376, 1376, 1376, 559: 1376, 1376, 1376, 1376, 1376, 565: 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 584: 1376, 1376, 1376, 1376, 1376, 1376, 1376, 593: 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 615: 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 625: 1376, 1376, 1376, 1376, 1376, 1376, 632: 1376, 637: 1376, 1376, 1376, 1376, 661: 1376, 707: 1376}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3703, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 4328}, - {548: 3804, 3805, 3810, 589: 3806, 611: 4329, 613: 3807, 615: 3808, 3801, 3811, 3800, 3809, 3802, 3803}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 4330}, + {1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 537: 1387, 1387, 1387, 541: 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 554: 1387, 1387, 1387, 559: 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 568: 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 585: 1387, 1387, 1387, 1387, 1387, 1387, 593: 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 614: 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 632: 1387, 637: 1387, 1387, 1387, 1387, 661: 1387, 707: 1387}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 4333}, + {57: 4334, 572: 3772, 3770, 3771, 3769, 3767, 806: 3768, 3766}, + {1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 537: 1385, 1385, 1385, 541: 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 554: 1385, 1385, 1385, 559: 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 568: 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 585: 1385, 1385, 1385, 1385, 1385, 1385, 593: 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 614: 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 632: 1385, 637: 1385, 1385, 1385, 1385, 661: 1385, 707: 1385}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3708, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 4336}, // 1460 - {57: 4331, 571: 3767, 3765, 3766, 3764, 3762, 806: 3763, 3761}, - {1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 537: 1379, 1379, 1379, 541: 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 554: 1379, 1379, 1379, 559: 1379, 1379, 1379, 1379, 1379, 565: 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 584: 1379, 1379, 1379, 1379, 1379, 1379, 1379, 593: 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 615: 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 625: 1379, 1379, 1379, 1379, 1379, 1379, 632: 1379, 637: 1379, 1379, 1379, 1379, 661: 1379, 707: 1379}, - {118: 3789, 127: 3797, 133: 3785, 137: 3782, 3784, 3781, 3783, 3787, 3788, 3793, 3792, 3791, 3795, 3796, 3790, 3794, 3786, 599: 3779, 3776, 3778, 3777, 3773, 3775, 3774, 3771, 3772, 3770, 3780, 892: 3769, 907: 4333}, - {566: 4334}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 4335}, + {548: 3809, 3810, 3815, 565: 3811, 611: 4337, 614: 3812, 3813, 3806, 3816, 3805, 3814, 3807, 3808}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 4338}, + {57: 4339, 572: 3772, 3770, 3771, 3769, 3767, 806: 3768, 3766}, + {1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 537: 1388, 1388, 1388, 541: 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 554: 1388, 1388, 1388, 559: 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 568: 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 585: 1388, 1388, 1388, 1388, 1388, 1388, 593: 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 614: 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 632: 1388, 637: 1388, 1388, 1388, 1388, 661: 1388, 707: 1388}, + {118: 3794, 127: 3802, 134: 3790, 138: 3787, 140: 3789, 3786, 3788, 3792, 3793, 3798, 3797, 3796, 3800, 3801, 3795, 3799, 3791, 599: 3784, 3781, 3783, 3782, 3778, 3780, 3779, 3776, 3777, 3775, 3785, 892: 3774, 907: 4341}, // 1465 - {57: 4336, 571: 3767, 3765, 3766, 3764, 3762, 806: 3763, 3761}, - {1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 537: 1381, 1381, 1381, 541: 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 554: 1381, 1381, 1381, 559: 1381, 1381, 1381, 1381, 1381, 565: 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 584: 1381, 1381, 1381, 1381, 1381, 1381, 1381, 593: 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 615: 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 625: 1381, 1381, 1381, 1381, 1381, 1381, 632: 1381, 637: 1381, 1381, 1381, 1381, 661: 1381, 707: 1381}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 4338}, - {9: 4339, 571: 3767, 3765, 3766, 3764, 3762, 806: 3763, 3761}, - {646: 4340}, + {566: 4342}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 4343}, + {57: 4344, 572: 3772, 3770, 3771, 3769, 3767, 806: 3768, 3766}, + {1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 537: 1390, 1390, 1390, 541: 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 554: 1390, 1390, 1390, 559: 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 568: 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 585: 1390, 1390, 1390, 1390, 1390, 1390, 593: 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 614: 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 632: 1390, 637: 1390, 1390, 1390, 1390, 661: 1390, 707: 1390}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 4346}, // 1470 - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 4341}, - {118: 3789, 127: 3797, 133: 3785, 137: 3782, 3784, 3781, 3783, 3787, 3788, 3793, 3792, 3791, 3795, 3796, 3790, 3794, 3786, 571: 3767, 3765, 3766, 3764, 3762, 599: 3779, 3776, 3778, 3777, 3773, 3775, 3774, 3771, 3772, 3770, 3780, 806: 3763, 3761, 892: 3769, 907: 4342}, - {57: 4343}, - {1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 537: 1382, 1382, 1382, 541: 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 554: 1382, 1382, 1382, 559: 1382, 1382, 1382, 1382, 1382, 565: 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 584: 1382, 1382, 1382, 1382, 1382, 1382, 1382, 593: 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 615: 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 625: 1382, 1382, 1382, 1382, 1382, 1382, 632: 1382, 637: 1382, 1382, 1382, 1382, 661: 1382, 707: 1382}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 4345}, + {9: 4347, 572: 3772, 3770, 3771, 3769, 3767, 806: 3768, 3766}, + {646: 4348}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 4349}, + {118: 3794, 127: 3802, 134: 3790, 138: 3787, 140: 3789, 3786, 3788, 3792, 3793, 3798, 3797, 3796, 3800, 3801, 3795, 3799, 3791, 572: 3772, 3770, 3771, 3769, 3767, 599: 3784, 3781, 3783, 3782, 3778, 3780, 3779, 3776, 3777, 3775, 3785, 806: 3768, 3766, 892: 3774, 907: 4350}, + {57: 4351}, // 1475 - {9: 4346, 571: 3767, 3765, 3766, 3764, 3762, 806: 3763, 3761}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 4348, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 4347}, - {57: 4352, 571: 3767, 3765, 3766, 3764, 3762, 806: 3763, 3761}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 1434, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 4349}, - {118: 3789, 127: 3797, 133: 3785, 137: 3782, 3784, 3781, 3783, 3787, 3788, 3793, 3792, 3791, 3795, 3796, 3790, 3794, 3786, 571: 3767, 3765, 3766, 3764, 3762, 599: 3779, 3776, 3778, 3777, 3773, 3775, 3774, 3771, 3772, 3770, 3780, 806: 3763, 3761, 892: 3769, 907: 4350}, + {1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 537: 1391, 1391, 1391, 541: 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 554: 1391, 1391, 1391, 559: 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 568: 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 585: 1391, 1391, 1391, 1391, 1391, 1391, 593: 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 614: 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 632: 1391, 637: 1391, 1391, 1391, 1391, 661: 1391, 707: 1391}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 4353}, + {9: 4354, 572: 3772, 3770, 3771, 3769, 3767, 806: 3768, 3766}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 4356, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 4355}, + {57: 4360, 572: 3772, 3770, 3771, 3769, 3767, 806: 3768, 3766}, // 1480 - {57: 4351, 548: 3798}, - {1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 537: 1383, 1383, 1383, 541: 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 554: 1383, 1383, 1383, 559: 1383, 1383, 1383, 1383, 1383, 565: 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 584: 1383, 1383, 1383, 1383, 1383, 1383, 1383, 593: 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 615: 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 625: 1383, 1383, 1383, 1383, 1383, 1383, 632: 1383, 637: 1383, 1383, 1383, 1383, 661: 1383, 707: 1383}, - {1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 537: 1384, 1384, 1384, 541: 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 554: 1384, 1384, 1384, 559: 1384, 1384, 1384, 1384, 1384, 565: 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 584: 1384, 1384, 1384, 1384, 1384, 1384, 1384, 593: 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 615: 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 625: 1384, 1384, 1384, 1384, 1384, 1384, 632: 1384, 637: 1384, 1384, 1384, 1384, 661: 1384, 707: 1384}, - {57: 2195, 564: 4355, 1186: 4354, 4356}, - {57: 2194}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 1443, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 4357}, + {118: 3794, 127: 3802, 134: 3790, 138: 3787, 140: 3789, 3786, 3788, 3792, 3793, 3798, 3797, 3796, 3800, 3801, 3795, 3799, 3791, 572: 3772, 3770, 3771, 3769, 3767, 599: 3784, 3781, 3783, 3782, 3778, 3780, 3779, 3776, 3777, 3775, 3785, 806: 3768, 3766, 892: 3774, 907: 4358}, + {57: 4359, 548: 3803}, + {1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 537: 1392, 1392, 1392, 541: 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 554: 1392, 1392, 1392, 559: 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 568: 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 585: 1392, 1392, 1392, 1392, 1392, 1392, 593: 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 614: 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 632: 1392, 637: 1392, 1392, 1392, 1392, 661: 1392, 707: 1392}, + {1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 537: 1393, 1393, 1393, 541: 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 554: 1393, 1393, 1393, 559: 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 568: 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 585: 1393, 1393, 1393, 1393, 1393, 1393, 593: 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 614: 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 632: 1393, 637: 1393, 1393, 1393, 1393, 661: 1393, 707: 1393}, // 1485 - {57: 2193}, - {57: 4357}, - {1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 537: 1385, 1385, 1385, 541: 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 554: 1385, 1385, 1385, 559: 1385, 1385, 1385, 1385, 1385, 565: 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 584: 1385, 1385, 1385, 1385, 1385, 1385, 1385, 593: 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 615: 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 625: 1385, 1385, 1385, 1385, 1385, 1385, 632: 1385, 637: 1385, 1385, 1385, 1385, 661: 1385, 707: 1385}, - {57: 2195, 564: 4355, 1186: 4354, 4359}, - {57: 4360}, + {57: 2204, 567: 4363, 1188: 4362, 4364}, + {57: 2203}, + {57: 2202}, + {57: 4365}, + {1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 537: 1394, 1394, 1394, 541: 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 554: 1394, 1394, 1394, 559: 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 568: 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 585: 1394, 1394, 1394, 1394, 1394, 1394, 593: 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 614: 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 632: 1394, 637: 1394, 1394, 1394, 1394, 661: 1394, 707: 1394}, // 1490 - {1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 537: 1386, 1386, 1386, 541: 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 554: 1386, 1386, 1386, 559: 1386, 1386, 1386, 1386, 1386, 565: 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 584: 1386, 1386, 1386, 1386, 1386, 1386, 1386, 593: 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 615: 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 625: 1386, 1386, 1386, 1386, 1386, 1386, 632: 1386, 637: 1386, 1386, 1386, 1386, 661: 1386, 707: 1386}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3703, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 4362}, - {9: 4363, 548: 3804, 3805, 3810, 589: 3806, 613: 3807, 615: 3808, 3801, 3811, 3800, 3809, 3802, 3803}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3703, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 4364}, - {57: 4365, 548: 3804, 3805, 3810, 589: 3806, 613: 3807, 615: 3808, 3801, 3811, 3800, 3809, 3802, 3803}, + {57: 2204, 567: 4363, 1188: 4362, 4367}, + {57: 4368}, + {1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 537: 1395, 1395, 1395, 541: 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 554: 1395, 1395, 1395, 559: 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 568: 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 585: 1395, 1395, 1395, 1395, 1395, 1395, 593: 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 614: 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 632: 1395, 637: 1395, 1395, 1395, 1395, 661: 1395, 707: 1395}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3708, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 4370}, + {9: 4371, 548: 3809, 3810, 3815, 565: 3811, 614: 3812, 3813, 3806, 3816, 3805, 3814, 3807, 3808}, // 1495 - {1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 537: 1388, 1388, 1388, 541: 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 554: 1388, 1388, 1388, 559: 1388, 1388, 1388, 1388, 1388, 565: 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 584: 1388, 1388, 1388, 1388, 1388, 1388, 1388, 593: 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 615: 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 625: 1388, 1388, 1388, 1388, 1388, 1388, 632: 1388, 637: 1388, 1388, 1388, 1388, 661: 1388, 707: 1388}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 2197, 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 3864, 869: 4367, 927: 4368}, - {9: 4012, 57: 2196}, - {57: 4369}, - {1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 537: 1389, 1389, 1389, 541: 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 554: 1389, 1389, 1389, 559: 1389, 1389, 1389, 1389, 1389, 565: 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 584: 1389, 1389, 1389, 1389, 1389, 1389, 1389, 593: 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 615: 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 625: 1389, 1389, 1389, 1389, 1389, 1389, 632: 1389, 637: 1389, 1389, 1389, 1389, 661: 1389, 707: 1389}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3708, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 4372}, + {57: 4373, 548: 3809, 3810, 3815, 565: 3811, 614: 3812, 3813, 3806, 3816, 3805, 3814, 3807, 3808}, + {1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 537: 1397, 1397, 1397, 541: 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 554: 1397, 1397, 1397, 559: 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 568: 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 585: 1397, 1397, 1397, 1397, 1397, 1397, 593: 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 614: 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 632: 1397, 637: 1397, 1397, 1397, 1397, 661: 1397, 707: 1397}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 2206, 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 3869, 869: 4375, 929: 4376}, + {9: 4020, 57: 2205}, // 1500 - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 3864, 869: 4371}, - {9: 4012, 57: 4372, 547: 4373}, - {1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 537: 1394, 1394, 1394, 541: 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 554: 1394, 1394, 1394, 559: 1394, 1394, 1394, 1394, 1394, 565: 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 584: 1394, 1394, 1394, 1394, 1394, 1394, 1394, 593: 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 615: 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 625: 1394, 1394, 1394, 1394, 1394, 1394, 632: 1394, 637: 1394, 1394, 1394, 1394, 661: 1394, 707: 1394}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 538: 3758, 591: 4376, 777: 3759, 3067, 3068, 3066, 811: 4375, 911: 4374}, {57: 4377}, + {1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 537: 1398, 1398, 1398, 541: 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 554: 1398, 1398, 1398, 559: 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 568: 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 585: 1398, 1398, 1398, 1398, 1398, 1398, 593: 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 614: 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 632: 1398, 637: 1398, 1398, 1398, 1398, 661: 1398, 707: 1398}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 3869, 869: 4379}, + {9: 4020, 57: 4380, 547: 4381}, + {1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 537: 1403, 1403, 1403, 541: 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 554: 1403, 1403, 1403, 559: 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 568: 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 585: 1403, 1403, 1403, 1403, 1403, 1403, 593: 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 614: 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 632: 1403, 637: 1403, 1403, 1403, 1403, 661: 1403, 707: 1403}, // 1505 - {962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 57: 962, 131: 962, 154: 962, 535: 962, 962, 962, 539: 962, 962, 962, 962, 962, 962, 551: 962, 962, 962, 962, 557: 962, 962, 560: 962, 570: 962, 591: 962, 614: 962, 701: 962, 706: 962, 708: 962, 962, 962, 962, 962, 962, 962, 962, 726: 962, 962}, - {961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 57: 961, 131: 961, 154: 961, 535: 961, 961, 961, 539: 961, 961, 961, 961, 961, 961, 551: 961, 961, 961, 961, 557: 961, 961, 560: 961, 570: 961, 591: 961, 614: 961, 701: 961, 706: 961, 708: 961, 961, 961, 961, 961, 961, 961, 961, 726: 961, 961}, - {1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 537: 1393, 1393, 1393, 541: 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 554: 1393, 1393, 1393, 559: 1393, 1393, 1393, 1393, 1393, 565: 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 584: 1393, 1393, 1393, 1393, 1393, 1393, 1393, 593: 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 615: 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 625: 1393, 1393, 1393, 1393, 1393, 1393, 632: 1393, 637: 1393, 1393, 1393, 1393, 661: 1393, 707: 1393}, - {1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 537: 1395, 1395, 1395, 541: 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 554: 1395, 1395, 1395, 559: 1395, 1395, 1395, 1395, 1395, 565: 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 584: 1395, 1395, 1395, 1395, 1395, 1395, 1395, 593: 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 615: 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 625: 1395, 1395, 1395, 1395, 1395, 1395, 632: 1395, 637: 1395, 1395, 1395, 1395, 661: 1395, 707: 1395}, - {57: 4380, 564: 4381}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 538: 3763, 591: 4384, 777: 3764, 3072, 3073, 3071, 811: 4383, 911: 4382}, + {57: 4385}, + {970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 57: 970, 131: 970, 157: 970, 535: 970, 970, 970, 539: 970, 970, 970, 970, 970, 970, 551: 970, 970, 970, 970, 557: 970, 970, 561: 970, 571: 970, 591: 970, 613: 970, 660: 970, 706: 970, 708: 970, 970, 970, 970, 970, 970, 970, 970, 726: 970, 970}, + {969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 57: 969, 131: 969, 157: 969, 535: 969, 969, 969, 539: 969, 969, 969, 969, 969, 969, 551: 969, 969, 969, 969, 557: 969, 969, 561: 969, 571: 969, 591: 969, 613: 969, 660: 969, 706: 969, 708: 969, 969, 969, 969, 969, 969, 969, 969, 726: 969, 969}, + {1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 537: 1402, 1402, 1402, 541: 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 554: 1402, 1402, 1402, 559: 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 568: 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 585: 1402, 1402, 1402, 1402, 1402, 1402, 593: 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 614: 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 632: 1402, 637: 1402, 1402, 1402, 1402, 661: 1402, 707: 1402}, // 1510 - {1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 537: 1317, 1317, 1317, 541: 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 554: 1317, 1317, 1317, 559: 1317, 1317, 1317, 1317, 1317, 565: 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 584: 1317, 1317, 1317, 1317, 1317, 1317, 1317, 593: 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 615: 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 625: 1317, 1317, 1317, 1317, 1317, 1317, 632: 1317, 637: 1317, 1317, 1317, 1317, 661: 1317, 707: 1317}, - {57: 4382}, - {1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 537: 1316, 1316, 1316, 541: 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 554: 1316, 1316, 1316, 559: 1316, 1316, 1316, 1316, 1316, 565: 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 584: 1316, 1316, 1316, 1316, 1316, 1316, 1316, 593: 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 615: 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 625: 1316, 1316, 1316, 1316, 1316, 1316, 632: 1316, 637: 1316, 1316, 1316, 1316, 661: 1316, 707: 1316}, - {57: 4384}, - {1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 537: 1396, 1396, 1396, 541: 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 554: 1396, 1396, 1396, 559: 1396, 1396, 1396, 1396, 1396, 565: 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 584: 1396, 1396, 1396, 1396, 1396, 1396, 1396, 593: 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 615: 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 625: 1396, 1396, 1396, 1396, 1396, 1396, 632: 1396, 637: 1396, 1396, 1396, 1396, 661: 1396, 707: 1396}, - // 1515 - {57: 4387}, - {1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 537: 1397, 1397, 1397, 541: 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 554: 1397, 1397, 1397, 559: 1397, 1397, 1397, 1397, 1397, 565: 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 584: 1397, 1397, 1397, 1397, 1397, 1397, 1397, 593: 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 615: 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 625: 1397, 1397, 1397, 1397, 1397, 1397, 632: 1397, 637: 1397, 1397, 1397, 1397, 661: 1397, 707: 1397}, - {1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 537: 1411, 1411, 1411, 541: 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 554: 1411, 1411, 1411, 559: 1411, 1411, 1411, 1411, 1411, 565: 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 584: 1411, 1411, 1411, 1411, 1411, 1411, 1411, 593: 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 615: 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 625: 1411, 1411, 1411, 1411, 1411, 1411, 632: 1411, 637: 1411, 1411, 1411, 1411, 661: 1411, 707: 1411, 717: 1411, 722: 1411, 730: 1411}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 2197, 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 3864, 869: 4367, 927: 4389}, + {1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 537: 1404, 1404, 1404, 541: 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 554: 1404, 1404, 1404, 559: 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 568: 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 585: 1404, 1404, 1404, 1404, 1404, 1404, 593: 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 614: 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 632: 1404, 637: 1404, 1404, 1404, 1404, 661: 1404, 707: 1404}, + {57: 4388, 567: 4389}, + {1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 537: 1326, 1326, 1326, 541: 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 554: 1326, 1326, 1326, 559: 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 568: 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 585: 1326, 1326, 1326, 1326, 1326, 1326, 593: 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 614: 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 632: 1326, 637: 1326, 1326, 1326, 1326, 661: 1326, 707: 1326}, {57: 4390}, + {1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 537: 1325, 1325, 1325, 541: 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 554: 1325, 1325, 1325, 559: 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 568: 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 585: 1325, 1325, 1325, 1325, 1325, 1325, 593: 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 614: 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 632: 1325, 637: 1325, 1325, 1325, 1325, 661: 1325, 707: 1325}, + // 1515 + {57: 4392}, + {1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 537: 1405, 1405, 1405, 541: 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 554: 1405, 1405, 1405, 559: 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 568: 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 585: 1405, 1405, 1405, 1405, 1405, 1405, 593: 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 614: 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 632: 1405, 637: 1405, 1405, 1405, 1405, 661: 1405, 707: 1405}, + {57: 4395}, + {1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 537: 1406, 1406, 1406, 541: 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 554: 1406, 1406, 1406, 559: 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 568: 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 585: 1406, 1406, 1406, 1406, 1406, 1406, 593: 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 614: 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 632: 1406, 637: 1406, 1406, 1406, 1406, 661: 1406, 707: 1406}, + {1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 537: 1420, 1420, 1420, 541: 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 554: 1420, 1420, 1420, 559: 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 568: 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 585: 1420, 1420, 1420, 1420, 1420, 1420, 593: 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 614: 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 632: 1420, 637: 1420, 1420, 1420, 1420, 661: 1420, 707: 1420, 717: 1420, 722: 1420, 730: 1420}, // 1520 - {1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 537: 1398, 1398, 1398, 541: 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 554: 1398, 1398, 1398, 559: 1398, 1398, 1398, 1398, 1398, 565: 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 584: 1398, 1398, 1398, 1398, 1398, 1398, 1398, 593: 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 615: 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 625: 1398, 1398, 1398, 1398, 1398, 1398, 632: 1398, 637: 1398, 1398, 1398, 1398, 661: 1398, 707: 1398}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 2197, 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 3864, 869: 4367, 927: 4392}, - {57: 4393}, - {1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 537: 1399, 1399, 1399, 541: 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 554: 1399, 1399, 1399, 559: 1399, 1399, 1399, 1399, 1399, 565: 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 584: 1399, 1399, 1399, 1399, 1399, 1399, 1399, 593: 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 615: 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 625: 1399, 1399, 1399, 1399, 1399, 1399, 632: 1399, 637: 1399, 1399, 1399, 1399, 661: 1399, 707: 1399}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 4395}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 2206, 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 3869, 869: 4375, 929: 4397}, + {57: 4398}, + {1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 537: 1407, 1407, 1407, 541: 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 554: 1407, 1407, 1407, 559: 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 568: 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 585: 1407, 1407, 1407, 1407, 1407, 1407, 593: 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 614: 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 632: 1407, 637: 1407, 1407, 1407, 1407, 661: 1407, 707: 1407}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 2206, 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 3869, 869: 4375, 929: 4400}, + {57: 4401}, // 1525 - {9: 4396, 547: 4397, 571: 3767, 3765, 3766, 3764, 3762, 806: 3763, 3761}, - {59: 4408, 118: 4404, 172: 4410, 175: 4405, 4403, 179: 4407, 558: 4415, 591: 4401, 714: 4414, 739: 4406, 4411, 4412, 744: 4413, 821: 4409, 957: 4402, 1126: 4400}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 538: 3758, 591: 4376, 777: 3759, 3067, 3068, 3066, 811: 4375, 911: 4398}, - {57: 4399}, - {1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 537: 1460, 1460, 1460, 541: 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 554: 1460, 1460, 1460, 559: 1460, 1460, 1460, 1460, 1460, 565: 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 584: 1460, 1460, 1460, 1460, 1460, 1460, 1460, 593: 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 615: 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 625: 1460, 1460, 1460, 1460, 1460, 1460, 632: 1460, 637: 1460, 1460, 1460, 1460, 661: 1460, 707: 1460}, + {1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 537: 1408, 1408, 1408, 541: 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 554: 1408, 1408, 1408, 559: 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 568: 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 585: 1408, 1408, 1408, 1408, 1408, 1408, 593: 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 614: 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 632: 1408, 637: 1408, 1408, 1408, 1408, 661: 1408, 707: 1408}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 4403}, + {9: 4404, 547: 4405, 572: 3772, 3770, 3771, 3769, 3767, 806: 3768, 3766}, + {59: 4416, 118: 4412, 174: 4418, 176: 4413, 4411, 179: 4415, 558: 4423, 591: 4409, 714: 4422, 739: 4414, 4419, 4420, 744: 4421, 824: 4417, 959: 4410, 1129: 4408}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 538: 3763, 591: 4384, 777: 3764, 3072, 3073, 3071, 811: 4383, 911: 4406}, // 1530 - {57: 4451}, - {57: 465, 536: 4430, 726: 465, 847: 4431, 894: 4450}, - {16: 465, 57: 465, 536: 4430, 558: 465, 591: 465, 714: 465, 726: 465, 847: 4431, 894: 4435}, - {57: 1277, 726: 1277}, - {57: 1276, 726: 1276}, + {57: 4407}, + {1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 537: 1469, 1469, 1469, 541: 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 554: 1469, 1469, 1469, 559: 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 568: 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 585: 1469, 1469, 1469, 1469, 1469, 1469, 593: 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 614: 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 632: 1469, 637: 1469, 1469, 1469, 1469, 661: 1469, 707: 1469}, + {57: 4459}, + {57: 472, 536: 4438, 726: 472, 849: 4439, 894: 4458}, + {16: 472, 57: 472, 536: 4438, 558: 472, 591: 472, 714: 472, 726: 472, 849: 4439, 894: 4443}, // 1535 - {57: 465, 536: 4430, 726: 465, 847: 4431, 894: 4434}, - {57: 458, 536: 4417, 726: 458, 847: 4418, 1009: 4433, 1016: 4419}, - {57: 465, 536: 4430, 726: 465, 847: 4431, 894: 4429}, - {57: 531, 726: 531, 742: 4426, 4427, 1229: 4428}, - {57: 531, 726: 531, 742: 4426, 4427, 1229: 4425}, + {57: 1286, 726: 1286}, + {57: 1285, 726: 1285}, + {57: 472, 536: 4438, 726: 472, 849: 4439, 894: 4442}, + {57: 465, 536: 4425, 726: 465, 849: 4426, 1011: 4441, 1018: 4427}, + {57: 472, 536: 4438, 726: 472, 849: 4439, 894: 4437}, // 1540 - {57: 1270, 726: 1270}, - {57: 1269, 726: 1269}, - {57: 458, 536: 4417, 726: 458, 847: 4418, 1009: 4416, 1016: 4419}, - {57: 1267, 726: 1267}, - {16: 503, 57: 503, 536: 503, 558: 503, 591: 503, 714: 503, 726: 503}, + {57: 538, 726: 538, 742: 4434, 4435, 1230: 4436}, + {57: 538, 726: 538, 742: 4434, 4435, 1230: 4433}, + {57: 1279, 726: 1279}, + {57: 1278, 726: 1278}, + {57: 465, 536: 4425, 726: 465, 849: 4426, 1011: 4424, 1018: 4427}, // 1545 - {16: 502, 57: 502, 536: 502, 558: 502, 591: 502, 714: 502, 726: 502}, - {57: 1268, 726: 1268}, - {564: 3053, 805: 3888, 817: 4420}, - {457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 57: 457, 59: 457, 535: 457, 539: 457, 457, 457, 457, 457, 551: 457, 553: 457, 706: 457, 708: 457, 457, 457, 457, 457, 457, 726: 457, 821: 457, 825: 457}, - {456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 57: 456, 59: 456, 535: 456, 539: 456, 456, 456, 456, 456, 551: 456, 553: 456, 706: 456, 708: 456, 456, 456, 456, 456, 456, 726: 456, 821: 456, 825: 456}, + {57: 1276, 726: 1276}, + {16: 510, 57: 510, 536: 510, 558: 510, 591: 510, 714: 510, 726: 510}, + {16: 509, 57: 509, 536: 509, 558: 509, 591: 509, 714: 509, 726: 509}, + {57: 1277, 726: 1277}, + {567: 3058, 805: 3893, 820: 4428}, // 1550 - {9: 4422, 57: 4421}, - {466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 16: 466, 57: 466, 59: 466, 151: 466, 466, 466, 535: 466, 539: 466, 466, 466, 466, 466, 551: 466, 553: 466, 558: 466, 582: 466, 591: 466, 610: 466, 706: 466, 708: 466, 466, 466, 466, 466, 466, 466, 726: 466, 821: 466, 825: 466}, - {564: 3053, 805: 3888, 817: 4423}, - {57: 4424}, - {455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 57: 455, 59: 455, 535: 455, 539: 455, 455, 455, 455, 455, 551: 455, 553: 455, 706: 455, 708: 455, 455, 455, 455, 455, 455, 726: 455, 821: 455, 825: 455}, + {464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 57: 464, 59: 464, 535: 464, 539: 464, 464, 464, 464, 464, 551: 464, 553: 464, 706: 464, 708: 464, 464, 464, 464, 464, 464, 726: 464, 824: 464, 464}, + {463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 57: 463, 59: 463, 535: 463, 539: 463, 463, 463, 463, 463, 551: 463, 553: 463, 706: 463, 708: 463, 463, 463, 463, 463, 463, 726: 463, 824: 463, 463}, + {9: 4430, 57: 4429}, + {473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 16: 473, 57: 473, 59: 473, 153: 473, 473, 156: 473, 535: 473, 539: 473, 473, 473, 473, 473, 551: 473, 553: 473, 558: 473, 583: 473, 591: 473, 610: 473, 706: 473, 708: 473, 473, 473, 473, 473, 473, 473, 726: 473, 824: 473, 473}, + {567: 3058, 805: 3893, 820: 4431}, // 1555 - {57: 1271, 726: 1271}, - {57: 530, 726: 530}, - {57: 529, 726: 529}, - {57: 1272, 726: 1272}, - {57: 1273, 726: 1273}, + {57: 4432}, + {462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 57: 462, 59: 462, 535: 462, 539: 462, 462, 462, 462, 462, 551: 462, 553: 462, 706: 462, 708: 462, 462, 462, 462, 462, 462, 726: 462, 824: 462, 462}, + {57: 1280, 726: 1280}, + {57: 537, 726: 537}, + {57: 536, 726: 536}, // 1560 - {564: 3053, 805: 3888, 817: 4432}, - {464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 16: 464, 57: 464, 59: 464, 151: 464, 464, 464, 535: 464, 539: 464, 464, 464, 464, 464, 551: 464, 553: 464, 558: 464, 582: 464, 591: 464, 610: 464, 706: 464, 708: 464, 464, 464, 464, 464, 464, 464, 726: 464, 821: 464, 825: 464}, - {57: 4421}, - {57: 1274, 726: 1274}, - {57: 1275, 726: 1275}, + {57: 1281, 726: 1281}, + {57: 1282, 726: 1282}, + {567: 3058, 805: 3893, 820: 4440}, + {471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 16: 471, 57: 471, 59: 471, 153: 471, 471, 156: 471, 535: 471, 539: 471, 471, 471, 471, 471, 551: 471, 553: 471, 558: 471, 583: 471, 591: 471, 610: 471, 706: 471, 708: 471, 471, 471, 471, 471, 471, 471, 726: 471, 824: 471, 471}, + {57: 4429}, // 1565 - {16: 4440, 57: 452, 558: 4441, 591: 4437, 714: 4439, 726: 452, 859: 4438, 902: 4436}, - {57: 1278, 726: 1278}, - {449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 16: 4440, 57: 449, 535: 449, 539: 449, 449, 449, 449, 449, 551: 449, 553: 449, 558: 4441, 706: 449, 708: 449, 449, 449, 449, 449, 449, 4439, 726: 449, 859: 4448, 1407: 4447}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 538: 3758, 591: 4376, 777: 3759, 3067, 3068, 3066, 811: 4375, 911: 4444}, - {560: 4443}, + {57: 1283, 726: 1283}, + {57: 1284, 726: 1284}, + {16: 4448, 57: 459, 558: 4449, 591: 4445, 714: 4447, 726: 459, 859: 4446, 902: 4444}, + {57: 1287, 726: 1287}, + {456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 16: 4448, 57: 456, 535: 456, 539: 456, 456, 456, 456, 456, 551: 456, 553: 456, 558: 4449, 706: 456, 708: 456, 456, 456, 456, 456, 456, 4447, 726: 456, 859: 4456, 1406: 4455}, // 1570 - {446, 446, 446, 446, 446, 446, 446, 446, 446, 10: 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 58: 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 538: 446, 540: 446, 561: 446, 568: 446, 584: 446, 591: 446}, - {560: 4442}, - {445, 445, 445, 445, 445, 445, 445, 445, 445, 10: 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 58: 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 538: 445, 540: 445, 561: 445, 568: 445, 584: 445, 591: 445}, - {447, 447, 447, 447, 447, 447, 447, 447, 447, 10: 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 58: 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 538: 447, 540: 447, 561: 447, 568: 447, 584: 447, 591: 447}, - {454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 57: 454, 535: 454, 539: 454, 454, 454, 454, 454, 551: 454, 553: 454, 591: 4445, 706: 454, 708: 454, 454, 454, 454, 454, 454, 726: 454, 1406: 4446}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 538: 3763, 591: 4384, 777: 3764, 3072, 3073, 3071, 811: 4383, 911: 4452}, + {561: 4451}, + {453, 453, 453, 453, 453, 453, 453, 453, 453, 10: 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 58: 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 538: 453, 540: 453, 562: 453, 569: 453, 585: 453, 591: 453}, + {561: 4450}, + {452, 452, 452, 452, 452, 452, 452, 452, 452, 10: 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 58: 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 538: 452, 540: 452, 562: 452, 569: 452, 585: 452, 591: 452}, // 1575 - {453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 57: 453, 535: 453, 539: 453, 453, 453, 453, 453, 551: 453, 553: 453, 706: 453, 708: 453, 453, 453, 453, 453, 453, 726: 453}, - {450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 57: 450, 535: 450, 539: 450, 450, 450, 450, 450, 551: 450, 553: 450, 706: 450, 708: 450, 450, 450, 450, 450, 450, 726: 450}, - {451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 57: 451, 535: 451, 539: 451, 451, 451, 451, 451, 551: 451, 553: 451, 706: 451, 708: 451, 451, 451, 451, 451, 451, 726: 451}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 538: 3758, 591: 4376, 777: 3759, 3067, 3068, 3066, 811: 4375, 911: 4449}, - {448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 57: 448, 535: 448, 539: 448, 448, 448, 448, 448, 551: 448, 553: 448, 706: 448, 708: 448, 448, 448, 448, 448, 448, 726: 448}, + {454, 454, 454, 454, 454, 454, 454, 454, 454, 10: 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 58: 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 538: 454, 540: 454, 562: 454, 569: 454, 585: 454, 591: 454}, + {461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 57: 461, 535: 461, 539: 461, 461, 461, 461, 461, 551: 461, 553: 461, 591: 4453, 706: 461, 708: 461, 461, 461, 461, 461, 461, 726: 461, 1405: 4454}, + {460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 57: 460, 535: 460, 539: 460, 460, 460, 460, 460, 551: 460, 553: 460, 706: 460, 708: 460, 460, 460, 460, 460, 460, 726: 460}, + {457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 57: 457, 535: 457, 539: 457, 457, 457, 457, 457, 551: 457, 553: 457, 706: 457, 708: 457, 457, 457, 457, 457, 457, 726: 457}, + {458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 57: 458, 535: 458, 539: 458, 458, 458, 458, 458, 551: 458, 553: 458, 706: 458, 708: 458, 458, 458, 458, 458, 458, 726: 458}, // 1580 - {57: 1279, 726: 1279}, - {1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 537: 1461, 1461, 1461, 541: 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 554: 1461, 1461, 1461, 559: 1461, 1461, 1461, 1461, 1461, 565: 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 584: 1461, 1461, 1461, 1461, 1461, 1461, 1461, 593: 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 615: 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 625: 1461, 1461, 1461, 1461, 1461, 1461, 632: 1461, 637: 1461, 1461, 1461, 1461, 661: 1461, 707: 1461}, - {571: 3767, 3765, 3766, 3764, 3762, 594: 1285, 806: 3763, 3761}, - {594: 4456, 1309: 4455, 1508: 4454}, - {97: 1281, 594: 4456, 4462, 1309: 4461, 1360: 4460}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 538: 3763, 591: 4384, 777: 3764, 3072, 3073, 3071, 811: 4383, 911: 4457}, + {455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 57: 455, 535: 455, 539: 455, 455, 455, 455, 455, 551: 455, 553: 455, 706: 455, 708: 455, 455, 455, 455, 455, 455, 726: 455}, + {57: 1288, 726: 1288}, + {1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 537: 1470, 1470, 1470, 541: 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 554: 1470, 1470, 1470, 559: 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 568: 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 585: 1470, 1470, 1470, 1470, 1470, 1470, 593: 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 614: 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 632: 1470, 637: 1470, 1470, 1470, 1470, 661: 1470, 707: 1470}, + {572: 3772, 3770, 3771, 3769, 3767, 594: 1294, 806: 3768, 3766}, // 1585 - {97: 1284, 594: 1284, 1284}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 4457}, - {571: 3767, 3765, 3766, 3764, 3762, 612: 4458, 806: 3763, 3761}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 4459}, - {97: 1282, 571: 3767, 3765, 3766, 3764, 3762, 594: 1282, 1282, 806: 3763, 3761}, + {594: 4464, 1307: 4463, 1508: 4462}, + {97: 1290, 594: 4464, 4470, 1307: 4469, 1358: 4468}, + {97: 1293, 594: 1293, 1293}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 4465}, + {572: 3772, 3770, 3771, 3769, 3767, 612: 4466, 806: 3768, 3766}, // 1590 - {97: 4464}, - {97: 1283, 594: 1283, 1283}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 4463}, - {97: 1280, 571: 3767, 3765, 3766, 3764, 3762, 806: 3763, 3761}, - {1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 537: 1462, 1462, 1462, 541: 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 554: 1462, 1462, 1462, 559: 1462, 1462, 1462, 1462, 1462, 565: 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 584: 1462, 1462, 1462, 1462, 1462, 1462, 1462, 593: 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 615: 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 625: 1462, 1462, 1462, 1462, 1462, 1462, 632: 1462, 637: 1462, 1462, 1462, 1462, 661: 1462, 707: 1462}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 4467}, + {97: 1291, 572: 3772, 3770, 3771, 3769, 3767, 594: 1291, 1291, 806: 3768, 3766}, + {97: 4472}, + {97: 1292, 594: 1292, 1292}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 4471}, // 1595 - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 4466}, - {542: 4467, 571: 3767, 3765, 3766, 3764, 3762, 806: 3763, 3761}, - {59: 4408, 118: 4404, 172: 4410, 175: 4405, 4403, 179: 4407, 558: 4415, 591: 4401, 714: 4414, 739: 4406, 4411, 4412, 744: 4413, 821: 4409, 957: 4402, 1126: 4468}, - {57: 1455, 726: 4470, 1326: 4469}, - {57: 4471}, + {97: 1289, 572: 3772, 3770, 3771, 3769, 3767, 806: 3768, 3766}, + {1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 537: 1471, 1471, 1471, 541: 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 554: 1471, 1471, 1471, 559: 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 568: 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 585: 1471, 1471, 1471, 1471, 1471, 1471, 593: 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 614: 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 632: 1471, 637: 1471, 1471, 1471, 1471, 661: 1471, 707: 1471}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 4474}, + {542: 4475, 572: 3772, 3770, 3771, 3769, 3767, 806: 3768, 3766}, + {59: 4416, 118: 4412, 174: 4418, 176: 4413, 4411, 179: 4415, 558: 4423, 591: 4409, 714: 4422, 739: 4414, 4419, 4420, 744: 4421, 824: 4417, 959: 4410, 1129: 4476}, // 1600 - {57: 1454}, - {1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 537: 1463, 1463, 1463, 541: 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 554: 1463, 1463, 1463, 559: 1463, 1463, 1463, 1463, 1463, 565: 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 584: 1463, 1463, 1463, 1463, 1463, 1463, 1463, 593: 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 615: 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 625: 1463, 1463, 1463, 1463, 1463, 1463, 632: 1463, 637: 1463, 1463, 1463, 1463, 661: 1463, 707: 1463}, - {1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 537: 1464, 1464, 1464, 541: 1464, 1464, 3714, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 554: 1464, 1464, 1464, 559: 1464, 1464, 1464, 1464, 1464, 565: 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 584: 1464, 1464, 1464, 1464, 1464, 1464, 1464, 593: 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 615: 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 625: 1464, 1464, 1464, 1464, 1464, 1464, 632: 1464, 637: 1464, 1464, 1464, 1464, 661: 1464, 707: 1464}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 4474}, - {571: 3767, 3765, 3766, 3764, 3762, 590: 4475, 806: 3763, 3761}, + {57: 1464, 726: 4478, 1324: 4477}, + {57: 4479}, + {57: 1463}, + {1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 537: 1472, 1472, 1472, 541: 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 554: 1472, 1472, 1472, 559: 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 568: 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 585: 1472, 1472, 1472, 1472, 1472, 1472, 593: 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 614: 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 632: 1472, 637: 1472, 1472, 1472, 1472, 661: 1472, 707: 1472}, + {1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 537: 1473, 1473, 1473, 541: 1473, 1473, 3719, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 554: 1473, 1473, 1473, 559: 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 568: 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 585: 1473, 1473, 1473, 1473, 1473, 1473, 593: 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 614: 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 632: 1473, 637: 1473, 1473, 1473, 1473, 661: 1473, 707: 1473}, // 1605 - {1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 537: 1465, 1465, 1465, 541: 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 554: 1465, 1465, 1465, 559: 1465, 1465, 1465, 1465, 1465, 565: 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 584: 1465, 1465, 1465, 1465, 1465, 1465, 1465, 593: 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 615: 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 625: 1465, 1465, 1465, 1465, 1465, 1465, 632: 1465, 637: 1465, 1465, 1465, 1465, 661: 1465, 707: 1465}, - {1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 537: 1466, 1466, 1466, 541: 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 554: 1466, 1466, 1466, 559: 1466, 1466, 1466, 1466, 1466, 565: 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 584: 1466, 1466, 1466, 1466, 1466, 1466, 1466, 593: 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 615: 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 625: 1466, 1466, 1466, 1466, 1466, 1466, 632: 1466, 637: 1466, 1466, 1466, 1466, 661: 1466, 707: 1466}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 3864, 869: 4478}, - {9: 4479}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 4480}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 4482}, + {572: 3772, 3770, 3771, 3769, 3767, 590: 4483, 806: 3768, 3766}, + {1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 537: 1474, 1474, 1474, 541: 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 554: 1474, 1474, 1474, 559: 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 568: 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 585: 1474, 1474, 1474, 1474, 1474, 1474, 593: 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 614: 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 632: 1474, 637: 1474, 1474, 1474, 1474, 661: 1474, 707: 1474}, + {1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 537: 1475, 1475, 1475, 541: 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 554: 1475, 1475, 1475, 559: 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 568: 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 585: 1475, 1475, 1475, 1475, 1475, 1475, 593: 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 614: 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 632: 1475, 637: 1475, 1475, 1475, 1475, 661: 1475, 707: 1475}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 3869, 869: 4486}, // 1610 - {9: 2202, 57: 4481, 571: 3767, 3765, 3766, 3764, 3762, 806: 3763, 3761}, - {1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 537: 1467, 1467, 1467, 541: 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 554: 1467, 1467, 1467, 559: 1467, 1467, 1467, 1467, 1467, 565: 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 584: 1467, 1467, 1467, 1467, 1467, 1467, 1467, 593: 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 615: 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 625: 1467, 1467, 1467, 1467, 1467, 1467, 632: 1467, 637: 1467, 1467, 1467, 1467, 661: 1467, 707: 1467}, - {9: 2203, 57: 4487, 571: 3767, 3765, 3766, 3764, 3762, 806: 3763, 3761}, - {9: 4484}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 4485}, + {9: 4487}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 4488}, + {9: 2211, 57: 4489, 572: 3772, 3770, 3771, 3769, 3767, 806: 3768, 3766}, + {1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 537: 1476, 1476, 1476, 541: 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 554: 1476, 1476, 1476, 559: 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 568: 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 585: 1476, 1476, 1476, 1476, 1476, 1476, 593: 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 614: 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 632: 1476, 637: 1476, 1476, 1476, 1476, 661: 1476, 707: 1476}, + {9: 2212, 57: 4495, 572: 3772, 3770, 3771, 3769, 3767, 806: 3768, 3766}, // 1615 - {9: 2202, 57: 4486, 571: 3767, 3765, 3766, 3764, 3762, 806: 3763, 3761}, - {1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 537: 1468, 1468, 1468, 541: 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 554: 1468, 1468, 1468, 559: 1468, 1468, 1468, 1468, 1468, 565: 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 584: 1468, 1468, 1468, 1468, 1468, 1468, 1468, 593: 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 615: 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 625: 1468, 1468, 1468, 1468, 1468, 1468, 632: 1468, 637: 1468, 1468, 1468, 1468, 661: 1468, 707: 1468}, - {1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 537: 1469, 1469, 1469, 541: 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 554: 1469, 1469, 1469, 559: 1469, 1469, 1469, 1469, 1469, 565: 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 584: 1469, 1469, 1469, 1469, 1469, 1469, 1469, 593: 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 615: 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 625: 1469, 1469, 1469, 1469, 1469, 1469, 632: 1469, 637: 1469, 1469, 1469, 1469, 661: 1469, 707: 1469}, - {1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 537: 1471, 1471, 1471, 541: 1471, 1471, 3714, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 554: 1471, 1471, 1471, 559: 1471, 1471, 1471, 1471, 1471, 565: 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 584: 1471, 1471, 1471, 1471, 1471, 1471, 1471, 593: 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 615: 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 625: 1471, 1471, 1471, 1471, 1471, 1471, 632: 1471, 637: 1471, 1471, 1471, 1471, 661: 1471, 707: 1471}, - {1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 537: 1473, 1473, 1473, 541: 1473, 1473, 3714, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 554: 1473, 1473, 1473, 559: 1473, 1473, 1473, 1473, 1473, 565: 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 584: 1473, 1473, 1473, 1473, 1473, 1473, 1473, 593: 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 615: 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 625: 1473, 1473, 1473, 1473, 1473, 1473, 632: 1473, 637: 1473, 1473, 1473, 1473, 661: 1473, 707: 1473}, + {9: 4492}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 4493}, + {9: 2211, 57: 4494, 572: 3772, 3770, 3771, 3769, 3767, 806: 3768, 3766}, + {1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 537: 1477, 1477, 1477, 541: 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 554: 1477, 1477, 1477, 559: 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 568: 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 585: 1477, 1477, 1477, 1477, 1477, 1477, 593: 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 614: 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 632: 1477, 637: 1477, 1477, 1477, 1477, 661: 1477, 707: 1477}, + {1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 537: 1478, 1478, 1478, 541: 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 554: 1478, 1478, 1478, 559: 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 568: 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 585: 1478, 1478, 1478, 1478, 1478, 1478, 593: 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 614: 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 632: 1478, 637: 1478, 1478, 1478, 1478, 661: 1478, 707: 1478}, // 1620 - {1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 537: 1474, 1474, 1474, 541: 1474, 1474, 3714, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 554: 1474, 1474, 1474, 559: 1474, 1474, 1474, 1474, 1474, 565: 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 584: 1474, 1474, 1474, 1474, 1474, 1474, 1474, 593: 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 615: 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 625: 1474, 1474, 1474, 1474, 1474, 1474, 632: 1474, 637: 1474, 1474, 1474, 1474, 661: 1474, 707: 1474}, - {1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 537: 1475, 1475, 1475, 541: 1475, 1475, 3714, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 554: 1475, 1475, 1475, 559: 1475, 1475, 1475, 1475, 1475, 565: 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 584: 1475, 1475, 1475, 1475, 1475, 1475, 1475, 593: 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 615: 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 625: 1475, 1475, 1475, 1475, 1475, 1475, 632: 1475, 637: 1475, 1475, 1475, 1475, 661: 1475, 707: 1475}, - {1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 537: 1476, 1476, 1476, 541: 1476, 1476, 3714, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 554: 1476, 1476, 1476, 559: 1476, 1476, 1476, 1476, 1476, 565: 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 584: 1476, 1476, 1476, 1476, 1476, 1476, 1476, 593: 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 615: 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 625: 1476, 1476, 1476, 1476, 1476, 1476, 632: 1476, 637: 1476, 1476, 1476, 1476, 661: 1476, 707: 1476}, - {538: 4496}, - {538: 4495}, + {1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 537: 1480, 1480, 1480, 541: 1480, 1480, 3719, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 554: 1480, 1480, 1480, 559: 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 568: 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 585: 1480, 1480, 1480, 1480, 1480, 1480, 593: 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 614: 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 632: 1480, 637: 1480, 1480, 1480, 1480, 661: 1480, 707: 1480}, + {1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 537: 1482, 1482, 1482, 541: 1482, 1482, 3719, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 554: 1482, 1482, 1482, 559: 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 568: 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 585: 1482, 1482, 1482, 1482, 1482, 1482, 593: 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 614: 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 632: 1482, 637: 1482, 1482, 1482, 1482, 661: 1482, 707: 1482}, + {1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 537: 1483, 1483, 1483, 541: 1483, 1483, 3719, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 554: 1483, 1483, 1483, 559: 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 568: 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 585: 1483, 1483, 1483, 1483, 1483, 1483, 593: 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 614: 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 632: 1483, 637: 1483, 1483, 1483, 1483, 661: 1483, 707: 1483}, + {1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 537: 1484, 1484, 1484, 541: 1484, 1484, 3719, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 554: 1484, 1484, 1484, 559: 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 568: 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 585: 1484, 1484, 1484, 1484, 1484, 1484, 593: 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 614: 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 632: 1484, 637: 1484, 1484, 1484, 1484, 661: 1484, 707: 1484}, + {1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 537: 1485, 1485, 1485, 541: 1485, 1485, 3719, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 554: 1485, 1485, 1485, 559: 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 568: 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 585: 1485, 1485, 1485, 1485, 1485, 1485, 593: 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 614: 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 632: 1485, 637: 1485, 1485, 1485, 1485, 661: 1485, 707: 1485}, // 1625 - {1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 537: 1456, 1456, 1456, 541: 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 554: 1456, 1456, 1456, 559: 1456, 1456, 1456, 1456, 1456, 565: 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 584: 1456, 1456, 1456, 1456, 1456, 1456, 1456, 593: 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 615: 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 625: 1456, 1456, 1456, 1456, 1456, 1456, 632: 1456, 637: 1456, 1456, 1456, 1456, 661: 1456, 707: 1456}, - {1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 537: 1457, 1457, 1457, 541: 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 554: 1457, 1457, 1457, 559: 1457, 1457, 1457, 1457, 1457, 565: 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 584: 1457, 1457, 1457, 1457, 1457, 1457, 1457, 593: 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 615: 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 625: 1457, 1457, 1457, 1457, 1457, 1457, 632: 1457, 637: 1457, 1457, 1457, 1457, 661: 1457, 707: 1457}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 4498, 3067, 3068, 3066}, - {1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 4499, 1488, 1488, 1488, 541: 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 554: 1488, 1488, 1488, 559: 1488, 1488, 1488, 1488, 1488, 565: 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 584: 1488, 1488, 1488, 1488, 1488, 1488, 1488, 593: 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 615: 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 625: 1488, 1488, 1488, 1488, 1488, 1488, 632: 1488, 637: 1488, 1488, 1488, 1488, 661: 1488, 707: 1488, 720: 3928, 723: 1488, 1488}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 2197, 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 3864, 869: 4367, 927: 4500}, + {538: 4504}, + {538: 4503}, + {1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 537: 1465, 1465, 1465, 541: 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 554: 1465, 1465, 1465, 559: 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 568: 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 585: 1465, 1465, 1465, 1465, 1465, 1465, 593: 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 614: 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 632: 1465, 637: 1465, 1465, 1465, 1465, 661: 1465, 707: 1465}, + {1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 537: 1466, 1466, 1466, 541: 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 554: 1466, 1466, 1466, 559: 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 568: 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 585: 1466, 1466, 1466, 1466, 1466, 1466, 593: 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 614: 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 632: 1466, 637: 1466, 1466, 1466, 1466, 661: 1466, 707: 1466}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 4506, 3072, 3073, 3071}, // 1630 - {57: 4501}, - {1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 537: 1319, 1319, 1319, 541: 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 554: 1319, 1319, 1319, 559: 1319, 1319, 1319, 1319, 1319, 565: 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 584: 1319, 1319, 1319, 1319, 1319, 1319, 1319, 593: 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 615: 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 625: 1319, 1319, 1319, 1319, 1319, 1319, 632: 1319, 637: 1319, 1319, 1319, 1319, 661: 1319, 707: 1319}, - {1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 537: 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 553: 1527, 1527, 1527, 1527, 559: 1527, 1527, 1527, 1527, 1527, 565: 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 584: 1527, 1527, 1527, 1527, 1527, 1527, 1527, 593: 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 615: 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 625: 1527, 1527, 1527, 1527, 1527, 1527, 632: 1527, 637: 1527, 1527, 1527, 1527, 661: 1527, 706: 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527}, - {1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 537: 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 553: 1524, 1524, 1524, 1524, 559: 1524, 1524, 1524, 1524, 1524, 565: 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 584: 1524, 1524, 1524, 1524, 1524, 1524, 1524, 593: 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 615: 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 625: 1524, 1524, 1524, 1524, 1524, 1524, 632: 1524, 637: 1524, 1524, 1524, 1524, 661: 1524, 706: 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524}, - {1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 537: 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 553: 1523, 1523, 1523, 1523, 559: 1523, 1523, 1523, 1523, 1523, 565: 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 584: 1523, 1523, 1523, 1523, 1523, 1523, 1523, 593: 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 615: 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 625: 1523, 1523, 1523, 1523, 1523, 1523, 632: 1523, 637: 1523, 1523, 1523, 1523, 661: 1523, 706: 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523}, + {1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 4507, 1497, 1497, 1497, 541: 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 554: 1497, 1497, 1497, 559: 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 568: 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 585: 1497, 1497, 1497, 1497, 1497, 1497, 593: 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 614: 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 632: 1497, 637: 1497, 1497, 1497, 1497, 661: 1497, 707: 1497, 720: 3933, 723: 1497, 1497}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 2206, 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 3869, 869: 4375, 929: 4508}, + {57: 4509}, + {1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 537: 1328, 1328, 1328, 541: 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 554: 1328, 1328, 1328, 559: 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 568: 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 585: 1328, 1328, 1328, 1328, 1328, 1328, 593: 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 614: 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 632: 1328, 637: 1328, 1328, 1328, 1328, 661: 1328, 707: 1328}, + {1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 537: 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 553: 1536, 1536, 1536, 1536, 559: 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 568: 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 585: 1536, 1536, 1536, 1536, 1536, 1536, 593: 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 614: 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 632: 1536, 637: 1536, 1536, 1536, 1536, 661: 1536, 706: 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536}, // 1635 - {1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 537: 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 553: 1521, 1521, 1521, 1521, 559: 1521, 1521, 1521, 1521, 1521, 565: 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 584: 1521, 1521, 1521, 1521, 1521, 1521, 1521, 593: 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 615: 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 625: 1521, 1521, 1521, 1521, 1521, 1521, 632: 1521, 637: 1521, 1521, 1521, 1521, 661: 1521, 706: 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 721: 4508, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 4507}, - {57: 4512, 571: 3767, 3765, 3766, 3764, 3762, 806: 3763, 3761}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 4509}, - {57: 4510, 571: 3767, 3765, 3766, 3764, 3762, 806: 3763, 3761}, + {1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 537: 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 553: 1533, 1533, 1533, 1533, 559: 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 568: 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 585: 1533, 1533, 1533, 1533, 1533, 1533, 593: 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 614: 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 632: 1533, 637: 1533, 1533, 1533, 1533, 661: 1533, 706: 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533}, + {1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 537: 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 553: 1532, 1532, 1532, 1532, 559: 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 568: 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 585: 1532, 1532, 1532, 1532, 1532, 1532, 593: 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 614: 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 632: 1532, 637: 1532, 1532, 1532, 1532, 661: 1532, 706: 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532}, + {1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 537: 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 553: 1530, 1530, 1530, 1530, 559: 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 568: 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 585: 1530, 1530, 1530, 1530, 1530, 1530, 593: 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 614: 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 632: 1530, 637: 1530, 1530, 1530, 1530, 661: 1530, 706: 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 721: 4516, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 4515}, + {57: 4520, 572: 3772, 3770, 3771, 3769, 3767, 806: 3768, 3766}, // 1640 - {1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 537: 1165, 1165, 1165, 541: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 554: 1165, 1165, 1165, 559: 1165, 1165, 1165, 1165, 1165, 565: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 584: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 593: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 615: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 625: 1165, 1165, 1165, 1165, 1165, 1165, 632: 1165, 637: 1165, 1165, 1165, 1165, 661: 1165, 707: 1165, 826: 4086, 838: 4204, 850: 4511}, - {1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 537: 1327, 1327, 1327, 541: 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 554: 1327, 1327, 1327, 559: 1327, 1327, 1327, 1327, 1327, 565: 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 584: 1327, 1327, 1327, 1327, 1327, 1327, 1327, 593: 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 615: 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 625: 1327, 1327, 1327, 1327, 1327, 1327, 632: 1327, 637: 1327, 1327, 1327, 1327, 661: 1327, 707: 1327}, - {1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 537: 1165, 1165, 1165, 541: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 554: 1165, 1165, 1165, 559: 1165, 1165, 1165, 1165, 1165, 565: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 584: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 593: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 615: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 625: 1165, 1165, 1165, 1165, 1165, 1165, 632: 1165, 637: 1165, 1165, 1165, 1165, 661: 1165, 707: 1165, 826: 4086, 838: 4204, 850: 4513}, - {1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 537: 1328, 1328, 1328, 541: 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 554: 1328, 1328, 1328, 559: 1328, 1328, 1328, 1328, 1328, 565: 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 584: 1328, 1328, 1328, 1328, 1328, 1328, 1328, 593: 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 615: 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 625: 1328, 1328, 1328, 1328, 1328, 1328, 632: 1328, 637: 1328, 1328, 1328, 1328, 661: 1328, 707: 1328}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 721: 4516, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 4515}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 4517}, + {57: 4518, 572: 3772, 3770, 3771, 3769, 3767, 806: 3768, 3766}, + {1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 537: 1173, 1173, 1173, 541: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 554: 1173, 1173, 1173, 559: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 568: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 585: 1173, 1173, 1173, 1173, 1173, 1173, 593: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 614: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 632: 1173, 637: 1173, 1173, 1173, 1173, 661: 1173, 707: 1173, 826: 4094, 838: 4212, 850: 4519}, + {1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 537: 1336, 1336, 1336, 541: 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 554: 1336, 1336, 1336, 559: 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 568: 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 585: 1336, 1336, 1336, 1336, 1336, 1336, 593: 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 614: 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 632: 1336, 637: 1336, 1336, 1336, 1336, 661: 1336, 707: 1336}, + {1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 537: 1173, 1173, 1173, 541: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 554: 1173, 1173, 1173, 559: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 568: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 585: 1173, 1173, 1173, 1173, 1173, 1173, 593: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 614: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 632: 1173, 637: 1173, 1173, 1173, 1173, 661: 1173, 707: 1173, 826: 4094, 838: 4212, 850: 4521}, // 1645 - {9: 4526, 571: 3767, 3765, 3766, 3764, 3762, 806: 3763, 3761}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 4517}, - {9: 4518, 571: 3767, 3765, 3766, 3764, 3762, 806: 3763, 3761}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 721: 4520, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 4519}, - {57: 4524, 571: 3767, 3765, 3766, 3764, 3762, 806: 3763, 3761}, + {1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 537: 1337, 1337, 1337, 541: 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 554: 1337, 1337, 1337, 559: 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 568: 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 585: 1337, 1337, 1337, 1337, 1337, 1337, 593: 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 614: 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 632: 1337, 637: 1337, 1337, 1337, 1337, 661: 1337, 707: 1337}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 721: 4524, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 4523}, + {9: 4534, 572: 3772, 3770, 3771, 3769, 3767, 806: 3768, 3766}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 4525}, + {9: 4526, 572: 3772, 3770, 3771, 3769, 3767, 806: 3768, 3766}, // 1650 - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 4521}, - {57: 4522, 571: 3767, 3765, 3766, 3764, 3762, 806: 3763, 3761}, - {1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 537: 1165, 1165, 1165, 541: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 554: 1165, 1165, 1165, 559: 1165, 1165, 1165, 1165, 1165, 565: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 584: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 593: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 615: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 625: 1165, 1165, 1165, 1165, 1165, 1165, 632: 1165, 637: 1165, 1165, 1165, 1165, 661: 1165, 707: 1165, 826: 4086, 838: 4204, 850: 4523}, - {1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 537: 1323, 1323, 1323, 541: 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 554: 1323, 1323, 1323, 559: 1323, 1323, 1323, 1323, 1323, 565: 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 584: 1323, 1323, 1323, 1323, 1323, 1323, 1323, 593: 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 615: 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 625: 1323, 1323, 1323, 1323, 1323, 1323, 632: 1323, 637: 1323, 1323, 1323, 1323, 661: 1323, 707: 1323}, - {1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 537: 1165, 1165, 1165, 541: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 554: 1165, 1165, 1165, 559: 1165, 1165, 1165, 1165, 1165, 565: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 584: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 593: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 615: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 625: 1165, 1165, 1165, 1165, 1165, 1165, 632: 1165, 637: 1165, 1165, 1165, 1165, 661: 1165, 707: 1165, 826: 4086, 838: 4204, 850: 4525}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 721: 4528, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 4527}, + {57: 4532, 572: 3772, 3770, 3771, 3769, 3767, 806: 3768, 3766}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 4529}, + {57: 4530, 572: 3772, 3770, 3771, 3769, 3767, 806: 3768, 3766}, + {1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 537: 1173, 1173, 1173, 541: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 554: 1173, 1173, 1173, 559: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 568: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 585: 1173, 1173, 1173, 1173, 1173, 1173, 593: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 614: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 632: 1173, 637: 1173, 1173, 1173, 1173, 661: 1173, 707: 1173, 826: 4094, 838: 4212, 850: 4531}, // 1655 - {1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 537: 1325, 1325, 1325, 541: 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 554: 1325, 1325, 1325, 559: 1325, 1325, 1325, 1325, 1325, 565: 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 584: 1325, 1325, 1325, 1325, 1325, 1325, 1325, 593: 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 615: 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 625: 1325, 1325, 1325, 1325, 1325, 1325, 632: 1325, 637: 1325, 1325, 1325, 1325, 661: 1325, 707: 1325}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 721: 4528, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 4527}, - {57: 4532, 571: 3767, 3765, 3766, 3764, 3762, 806: 3763, 3761}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 4529}, - {57: 4530, 571: 3767, 3765, 3766, 3764, 3762, 806: 3763, 3761}, + {1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 537: 1332, 1332, 1332, 541: 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 554: 1332, 1332, 1332, 559: 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 568: 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 585: 1332, 1332, 1332, 1332, 1332, 1332, 593: 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 614: 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 632: 1332, 637: 1332, 1332, 1332, 1332, 661: 1332, 707: 1332}, + {1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 537: 1173, 1173, 1173, 541: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 554: 1173, 1173, 1173, 559: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 568: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 585: 1173, 1173, 1173, 1173, 1173, 1173, 593: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 614: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 632: 1173, 637: 1173, 1173, 1173, 1173, 661: 1173, 707: 1173, 826: 4094, 838: 4212, 850: 4533}, + {1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 537: 1334, 1334, 1334, 541: 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 554: 1334, 1334, 1334, 559: 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 568: 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 585: 1334, 1334, 1334, 1334, 1334, 1334, 593: 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 614: 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 632: 1334, 637: 1334, 1334, 1334, 1334, 661: 1334, 707: 1334}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 721: 4536, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 4535}, + {57: 4540, 572: 3772, 3770, 3771, 3769, 3767, 806: 3768, 3766}, // 1660 - {1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 537: 1165, 1165, 1165, 541: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 554: 1165, 1165, 1165, 559: 1165, 1165, 1165, 1165, 1165, 565: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 584: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 593: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 615: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 625: 1165, 1165, 1165, 1165, 1165, 1165, 632: 1165, 637: 1165, 1165, 1165, 1165, 661: 1165, 707: 1165, 826: 4086, 838: 4204, 850: 4531}, - {1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 537: 1324, 1324, 1324, 541: 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 554: 1324, 1324, 1324, 559: 1324, 1324, 1324, 1324, 1324, 565: 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 584: 1324, 1324, 1324, 1324, 1324, 1324, 1324, 593: 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 615: 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 625: 1324, 1324, 1324, 1324, 1324, 1324, 632: 1324, 637: 1324, 1324, 1324, 1324, 661: 1324, 707: 1324}, - {1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 537: 1165, 1165, 1165, 541: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 554: 1165, 1165, 1165, 559: 1165, 1165, 1165, 1165, 1165, 565: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 584: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 593: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 615: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 625: 1165, 1165, 1165, 1165, 1165, 1165, 632: 1165, 637: 1165, 1165, 1165, 1165, 661: 1165, 707: 1165, 826: 4086, 838: 4204, 850: 4533}, - {1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 537: 1326, 1326, 1326, 541: 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 554: 1326, 1326, 1326, 559: 1326, 1326, 1326, 1326, 1326, 565: 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 584: 1326, 1326, 1326, 1326, 1326, 1326, 1326, 593: 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 615: 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 625: 1326, 1326, 1326, 1326, 1326, 1326, 632: 1326, 637: 1326, 1326, 1326, 1326, 661: 1326, 707: 1326}, - {118: 3789, 127: 3797, 133: 3785, 137: 3782, 3784, 3781, 3783, 3787, 3788, 3793, 3792, 3791, 3795, 3796, 3790, 3794, 3786, 892: 4535}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 4537}, + {57: 4538, 572: 3772, 3770, 3771, 3769, 3767, 806: 3768, 3766}, + {1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 537: 1173, 1173, 1173, 541: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 554: 1173, 1173, 1173, 559: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 568: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 585: 1173, 1173, 1173, 1173, 1173, 1173, 593: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 614: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 632: 1173, 637: 1173, 1173, 1173, 1173, 661: 1173, 707: 1173, 826: 4094, 838: 4212, 850: 4539}, + {1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 537: 1333, 1333, 1333, 541: 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 554: 1333, 1333, 1333, 559: 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 568: 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 585: 1333, 1333, 1333, 1333, 1333, 1333, 593: 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 614: 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 632: 1333, 637: 1333, 1333, 1333, 1333, 661: 1333, 707: 1333}, + {1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 537: 1173, 1173, 1173, 541: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 554: 1173, 1173, 1173, 559: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 568: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 585: 1173, 1173, 1173, 1173, 1173, 1173, 593: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 614: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 632: 1173, 637: 1173, 1173, 1173, 1173, 661: 1173, 707: 1173, 826: 4094, 838: 4212, 850: 4541}, // 1665 - {9: 4536}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 4537}, - {9: 4538, 571: 3767, 3765, 3766, 3764, 3762, 806: 3763, 3761}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 4539}, - {57: 4540, 571: 3767, 3765, 3766, 3764, 3762, 806: 3763, 3761}, + {1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 537: 1335, 1335, 1335, 541: 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 554: 1335, 1335, 1335, 559: 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 568: 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 585: 1335, 1335, 1335, 1335, 1335, 1335, 593: 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 614: 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 632: 1335, 637: 1335, 1335, 1335, 1335, 661: 1335, 707: 1335}, + {118: 3794, 127: 3802, 134: 3790, 138: 3787, 140: 3789, 3786, 3788, 3792, 3793, 3798, 3797, 3796, 3800, 3801, 3795, 3799, 3791, 892: 4543}, + {9: 4544}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 4545}, + {9: 4546, 572: 3772, 3770, 3771, 3769, 3767, 806: 3768, 3766}, // 1670 - {1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 537: 1373, 1373, 1373, 541: 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 554: 1373, 1373, 1373, 559: 1373, 1373, 1373, 1373, 1373, 565: 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 584: 1373, 1373, 1373, 1373, 1373, 1373, 1373, 593: 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 615: 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 625: 1373, 1373, 1373, 1373, 1373, 1373, 632: 1373, 637: 1373, 1373, 1373, 1373, 661: 1373, 707: 1373}, - {118: 3789, 127: 3797, 133: 3785, 137: 3782, 3784, 3781, 3783, 3787, 3788, 3793, 3792, 3791, 3795, 3796, 3790, 3794, 3786, 892: 4542}, - {9: 4543}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 4544}, - {9: 4545, 571: 3767, 3765, 3766, 3764, 3762, 806: 3763, 3761}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 4547}, + {57: 4548, 572: 3772, 3770, 3771, 3769, 3767, 806: 3768, 3766}, + {1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 537: 1382, 1382, 1382, 541: 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 554: 1382, 1382, 1382, 559: 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 568: 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 585: 1382, 1382, 1382, 1382, 1382, 1382, 593: 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 614: 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 632: 1382, 637: 1382, 1382, 1382, 1382, 661: 1382, 707: 1382}, + {118: 3794, 127: 3802, 134: 3790, 138: 3787, 140: 3789, 3786, 3788, 3792, 3793, 3798, 3797, 3796, 3800, 3801, 3795, 3799, 3791, 892: 4550}, + {9: 4551}, // 1675 - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 4546}, - {57: 4547, 571: 3767, 3765, 3766, 3764, 3762, 806: 3763, 3761}, - {1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 537: 1374, 1374, 1374, 541: 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 554: 1374, 1374, 1374, 559: 1374, 1374, 1374, 1374, 1374, 565: 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 584: 1374, 1374, 1374, 1374, 1374, 1374, 1374, 593: 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 615: 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 625: 1374, 1374, 1374, 1374, 1374, 1374, 632: 1374, 637: 1374, 1374, 1374, 1374, 661: 1374, 707: 1374}, - {175: 4551, 4550, 179: 4552, 185: 4553, 1375: 4549}, - {9: 4554}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 4552}, + {9: 4553, 572: 3772, 3770, 3771, 3769, 3767, 806: 3768, 3766}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 4554}, + {57: 4555, 572: 3772, 3770, 3771, 3769, 3767, 806: 3768, 3766}, + {1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 537: 1383, 1383, 1383, 541: 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 554: 1383, 1383, 1383, 559: 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 568: 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 585: 1383, 1383, 1383, 1383, 1383, 1383, 593: 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 614: 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 632: 1383, 637: 1383, 1383, 1383, 1383, 661: 1383, 707: 1383}, // 1680 - {9: 1363}, - {9: 1362}, - {9: 1361}, - {9: 1360}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 4555}, + {176: 4559, 4558, 179: 4560, 186: 4561, 1373: 4557}, + {9: 4562}, + {9: 1372}, + {9: 1371}, + {9: 1370}, // 1685 - {57: 4556, 571: 3767, 3765, 3766, 3764, 3762, 806: 3763, 3761}, - {1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 537: 1380, 1380, 1380, 541: 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 554: 1380, 1380, 1380, 559: 1380, 1380, 1380, 1380, 1380, 565: 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 584: 1380, 1380, 1380, 1380, 1380, 1380, 1380, 593: 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 615: 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 625: 1380, 1380, 1380, 1380, 1380, 1380, 632: 1380, 637: 1380, 1380, 1380, 1380, 661: 1380, 707: 1380}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 3949, 3067, 3068, 3066, 810: 4558}, - {9: 4559}, - {548: 4563, 4564, 564: 3053, 805: 4560, 831: 4562, 917: 4561}, + {9: 1369}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 4563}, + {57: 4564, 572: 3772, 3770, 3771, 3769, 3767, 806: 3768, 3766}, + {1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 537: 1389, 1389, 1389, 541: 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 554: 1389, 1389, 1389, 559: 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 568: 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 585: 1389, 1389, 1389, 1389, 1389, 1389, 593: 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 614: 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 632: 1389, 637: 1389, 1389, 1389, 1389, 661: 1389, 707: 1389}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 565: 3955, 777: 3954, 3072, 3073, 3071, 810: 4566}, // 1690 - {2238, 2238, 6: 2238, 2238, 2238, 2238, 15: 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238, 57: 2238, 86: 2238, 88: 2238, 90: 2238, 2238, 95: 2238, 2238, 98: 2238, 2238, 2238, 2238, 103: 2238, 133: 2238, 163: 2238, 2238, 2238, 2238, 540: 2238, 543: 2238, 2238, 558: 2238, 2238, 562: 2238, 568: 2238, 570: 2238, 714: 2238, 2238, 725: 2238}, - {57: 4567}, - {168, 168, 6: 168, 168, 168, 15: 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 57: 168, 86: 168, 88: 168, 90: 168, 168, 95: 168, 168, 98: 168, 168, 168, 168, 103: 168, 540: 168, 543: 168, 168, 558: 168, 570: 168, 714: 168, 168, 725: 168}, - {564: 3053, 805: 4560, 831: 4566}, - {564: 3053, 805: 4565}, + {9: 4567}, + {548: 4571, 4572, 567: 3058, 805: 4568, 837: 4570, 919: 4569}, + {2244, 2244, 6: 2244, 2244, 2244, 2244, 15: 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 57: 2244, 86: 2244, 88: 2244, 90: 2244, 2244, 95: 2244, 2244, 98: 2244, 2244, 2244, 2244, 103: 2244, 134: 2244, 165: 2244, 2244, 2244, 2244, 540: 2244, 543: 2244, 2244, 558: 2244, 2244, 2244, 569: 2244, 571: 2244, 714: 2244, 2244, 725: 2244}, + {57: 4575}, + {168, 168, 6: 168, 168, 168, 15: 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 57: 168, 86: 168, 88: 168, 90: 168, 168, 95: 168, 168, 98: 168, 168, 168, 168, 103: 168, 540: 168, 543: 168, 168, 558: 168, 571: 168, 714: 168, 168, 725: 168}, // 1695 - {166, 166, 6: 166, 166, 166, 15: 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 57: 166, 86: 166, 88: 166, 90: 166, 166, 95: 166, 166, 98: 166, 166, 166, 166, 103: 166, 540: 166, 543: 166, 166, 558: 166, 570: 166, 714: 166, 166, 725: 166}, - {167, 167, 6: 167, 167, 167, 15: 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 57: 167, 86: 167, 88: 167, 90: 167, 167, 95: 167, 167, 98: 167, 167, 167, 167, 103: 167, 540: 167, 543: 167, 167, 558: 167, 570: 167, 714: 167, 167, 725: 167}, - {1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 537: 1351, 1351, 1351, 541: 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 554: 1351, 1351, 1351, 559: 1351, 1351, 1351, 1351, 1351, 565: 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 584: 1351, 1351, 1351, 1351, 1351, 1351, 1351, 593: 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 615: 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 625: 1351, 1351, 1351, 1351, 1351, 1351, 632: 1351, 637: 1351, 1351, 1351, 1351, 661: 1351, 707: 1351}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 3949, 3067, 3068, 3066, 810: 4569}, - {57: 4570}, + {567: 3058, 805: 4568, 837: 4574}, + {567: 3058, 805: 4573}, + {166, 166, 6: 166, 166, 166, 15: 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 57: 166, 86: 166, 88: 166, 90: 166, 166, 95: 166, 166, 98: 166, 166, 166, 166, 103: 166, 540: 166, 543: 166, 166, 558: 166, 571: 166, 714: 166, 166, 725: 166}, + {167, 167, 6: 167, 167, 167, 15: 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 57: 167, 86: 167, 88: 167, 90: 167, 167, 95: 167, 167, 98: 167, 167, 167, 167, 103: 167, 540: 167, 543: 167, 167, 558: 167, 571: 167, 714: 167, 167, 725: 167}, + {1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 537: 1360, 1360, 1360, 541: 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 554: 1360, 1360, 1360, 559: 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 568: 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 585: 1360, 1360, 1360, 1360, 1360, 1360, 593: 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 614: 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 632: 1360, 637: 1360, 1360, 1360, 1360, 661: 1360, 707: 1360}, // 1700 - {1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 537: 1352, 1352, 1352, 541: 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 554: 1352, 1352, 1352, 559: 1352, 1352, 1352, 1352, 1352, 565: 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 584: 1352, 1352, 1352, 1352, 1352, 1352, 1352, 593: 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 615: 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 625: 1352, 1352, 1352, 1352, 1352, 1352, 632: 1352, 637: 1352, 1352, 1352, 1352, 661: 1352, 707: 1352}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 4572}, - {57: 4573, 542: 4574, 571: 3767, 3765, 3766, 3764, 3762, 806: 3763, 3761}, - {1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 537: 1368, 1368, 1368, 541: 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 554: 1368, 1368, 1368, 559: 1368, 1368, 1368, 1368, 1368, 565: 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 584: 1368, 1368, 1368, 1368, 1368, 1368, 1368, 593: 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 615: 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 625: 1368, 1368, 1368, 1368, 1368, 1368, 632: 1368, 637: 1368, 1368, 1368, 1368, 661: 1368, 707: 1368}, - {558: 4415, 591: 4576, 714: 4414, 957: 4575}, - // 1705 - {536: 4430, 847: 4579}, - {536: 4430, 847: 4577}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 565: 3955, 777: 3954, 3072, 3073, 3071, 810: 4577}, {57: 4578}, - {1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 537: 1366, 1366, 1366, 541: 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 554: 1366, 1366, 1366, 559: 1366, 1366, 1366, 1366, 1366, 565: 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 584: 1366, 1366, 1366, 1366, 1366, 1366, 1366, 593: 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 615: 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 625: 1366, 1366, 1366, 1366, 1366, 1366, 632: 1366, 637: 1366, 1366, 1366, 1366, 661: 1366, 707: 1366}, - {57: 4580}, + {1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 537: 1361, 1361, 1361, 541: 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 554: 1361, 1361, 1361, 559: 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 568: 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 585: 1361, 1361, 1361, 1361, 1361, 1361, 593: 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 614: 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 632: 1361, 637: 1361, 1361, 1361, 1361, 661: 1361, 707: 1361}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 4580}, + {57: 4581, 542: 4582, 572: 3772, 3770, 3771, 3769, 3767, 806: 3768, 3766}, + // 1705 + {1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 537: 1377, 1377, 1377, 541: 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 554: 1377, 1377, 1377, 559: 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 568: 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 585: 1377, 1377, 1377, 1377, 1377, 1377, 593: 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 614: 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 632: 1377, 637: 1377, 1377, 1377, 1377, 661: 1377, 707: 1377}, + {558: 4423, 591: 4584, 714: 4422, 959: 4583}, + {536: 4438, 849: 4587}, + {536: 4438, 849: 4585}, + {57: 4586}, // 1710 - {1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 537: 1367, 1367, 1367, 541: 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 554: 1367, 1367, 1367, 559: 1367, 1367, 1367, 1367, 1367, 565: 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 584: 1367, 1367, 1367, 1367, 1367, 1367, 1367, 593: 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 615: 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 625: 1367, 1367, 1367, 1367, 1367, 1367, 632: 1367, 637: 1367, 1367, 1367, 1367, 661: 1367, 707: 1367}, - {1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 537: 1390, 1390, 1390, 541: 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 554: 1390, 1390, 1390, 559: 1390, 1390, 1390, 1390, 1390, 565: 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 584: 1390, 1390, 1390, 1390, 1390, 1390, 1390, 593: 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 615: 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 625: 1390, 1390, 1390, 1390, 1390, 1390, 632: 1390, 637: 1390, 1390, 1390, 1390, 661: 1390, 707: 1390}, - {1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 537: 1391, 1391, 1391, 541: 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 554: 1391, 1391, 1391, 559: 1391, 1391, 1391, 1391, 1391, 565: 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 584: 1391, 1391, 1391, 1391, 1391, 1391, 1391, 593: 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 615: 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 625: 1391, 1391, 1391, 1391, 1391, 1391, 632: 1391, 637: 1391, 1391, 1391, 1391, 661: 1391, 707: 1391}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 2197, 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 3864, 869: 4367, 927: 4584}, - {57: 4585}, + {1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 537: 1375, 1375, 1375, 541: 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 554: 1375, 1375, 1375, 559: 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 568: 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 585: 1375, 1375, 1375, 1375, 1375, 1375, 593: 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 614: 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 632: 1375, 637: 1375, 1375, 1375, 1375, 661: 1375, 707: 1375}, + {57: 4588}, + {1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 537: 1376, 1376, 1376, 541: 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 554: 1376, 1376, 1376, 559: 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 568: 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 585: 1376, 1376, 1376, 1376, 1376, 1376, 593: 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 614: 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 632: 1376, 637: 1376, 1376, 1376, 1376, 661: 1376, 707: 1376}, + {1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 537: 1399, 1399, 1399, 541: 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 554: 1399, 1399, 1399, 559: 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 568: 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 585: 1399, 1399, 1399, 1399, 1399, 1399, 593: 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 614: 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 632: 1399, 637: 1399, 1399, 1399, 1399, 661: 1399, 707: 1399}, + {1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 537: 1400, 1400, 1400, 541: 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 554: 1400, 1400, 1400, 559: 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 568: 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 585: 1400, 1400, 1400, 1400, 1400, 1400, 593: 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 614: 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 632: 1400, 637: 1400, 1400, 1400, 1400, 661: 1400, 707: 1400}, // 1715 - {1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 537: 1387, 1387, 1387, 541: 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 554: 1387, 1387, 1387, 559: 1387, 1387, 1387, 1387, 1387, 565: 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 584: 1387, 1387, 1387, 1387, 1387, 1387, 1387, 593: 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 615: 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 625: 1387, 1387, 1387, 1387, 1387, 1387, 632: 1387, 637: 1387, 1387, 1387, 1387, 661: 1387, 707: 1387}, - {1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 537: 1392, 1392, 1392, 541: 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 554: 1392, 1392, 1392, 559: 1392, 1392, 1392, 1392, 1392, 565: 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 584: 1392, 1392, 1392, 1392, 1392, 1392, 1392, 593: 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 615: 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 625: 1392, 1392, 1392, 1392, 1392, 1392, 632: 1392, 637: 1392, 1392, 1392, 1392, 661: 1392, 707: 1392}, - {2: 1449, 1449, 1449, 1449, 1449, 1449, 1449, 10: 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 58: 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 536: 1449, 538: 1449, 1449, 1449, 1449, 545: 1449, 1449, 548: 1449, 1449, 1449, 552: 1449, 1449, 557: 1449, 1449, 564: 1449, 583: 1449, 591: 1449, 1449, 624: 1449, 631: 1449, 633: 1449, 1449, 1449, 1449, 641: 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 662: 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 702: 1449, 1449, 1449, 1449, 716: 1449, 721: 4196, 835: 4194, 4195, 891: 4197, 893: 4198, 918: 4588, 4199}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 4589}, - {57: 4590, 571: 3767, 3765, 3766, 3764, 3762, 806: 3763, 3761}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 2206, 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 3869, 869: 4375, 929: 4592}, + {57: 4593}, + {1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 537: 1396, 1396, 1396, 541: 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 554: 1396, 1396, 1396, 559: 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 568: 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 585: 1396, 1396, 1396, 1396, 1396, 1396, 593: 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 614: 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 632: 1396, 637: 1396, 1396, 1396, 1396, 661: 1396, 707: 1396}, + {1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 537: 1401, 1401, 1401, 541: 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 554: 1401, 1401, 1401, 559: 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 568: 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 585: 1401, 1401, 1401, 1401, 1401, 1401, 593: 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 614: 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 632: 1401, 637: 1401, 1401, 1401, 1401, 661: 1401, 707: 1401}, + {2: 1458, 1458, 1458, 1458, 1458, 1458, 1458, 10: 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 58: 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 536: 1458, 538: 1458, 1458, 1458, 1458, 545: 1458, 1458, 548: 1458, 1458, 1458, 552: 1458, 1458, 557: 1458, 1458, 567: 1458, 584: 1458, 591: 1458, 1458, 630: 1458, 1458, 633: 1458, 1458, 1458, 1458, 641: 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 662: 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 716: 1458, 721: 4204, 834: 4202, 4203, 891: 4205, 893: 4206, 920: 4596, 4207}, // 1720 - {1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 537: 1165, 1165, 1165, 541: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 554: 1165, 1165, 1165, 559: 1165, 1165, 1165, 1165, 1165, 565: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 584: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 593: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 615: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 625: 1165, 1165, 1165, 1165, 1165, 1165, 632: 1165, 637: 1165, 1165, 1165, 1165, 661: 1165, 707: 1165, 826: 4086, 838: 4204, 850: 4591}, - {1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 537: 1349, 1349, 1349, 541: 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 554: 1349, 1349, 1349, 559: 1349, 1349, 1349, 1349, 1349, 565: 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 584: 1349, 1349, 1349, 1349, 1349, 1349, 1349, 593: 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 615: 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 625: 1349, 1349, 1349, 1349, 1349, 1349, 632: 1349, 637: 1349, 1349, 1349, 1349, 661: 1349, 707: 1349}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 2197, 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 3864, 869: 4367, 927: 4593}, - {57: 4594}, - {1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 537: 1320, 1320, 1320, 541: 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 554: 1320, 1320, 1320, 559: 1320, 1320, 1320, 1320, 1320, 565: 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 584: 1320, 1320, 1320, 1320, 1320, 1320, 1320, 593: 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 615: 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 625: 1320, 1320, 1320, 1320, 1320, 1320, 632: 1320, 637: 1320, 1320, 1320, 1320, 661: 1320, 707: 1320}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 4597}, + {57: 4598, 572: 3772, 3770, 3771, 3769, 3767, 806: 3768, 3766}, + {1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 537: 1173, 1173, 1173, 541: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 554: 1173, 1173, 1173, 559: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 568: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 585: 1173, 1173, 1173, 1173, 1173, 1173, 593: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 614: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 632: 1173, 637: 1173, 1173, 1173, 1173, 661: 1173, 707: 1173, 826: 4094, 838: 4212, 850: 4599}, + {1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 537: 1358, 1358, 1358, 541: 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 554: 1358, 1358, 1358, 559: 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 568: 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 585: 1358, 1358, 1358, 1358, 1358, 1358, 593: 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 614: 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 632: 1358, 637: 1358, 1358, 1358, 1358, 661: 1358, 707: 1358}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 2206, 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 3869, 869: 4375, 929: 4601}, // 1725 - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 3949, 3067, 3068, 3066, 810: 4596}, - {57: 4597}, - {2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 537: 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 553: 2520, 2520, 2520, 2520, 559: 2520, 2520, 2520, 2520, 2520, 565: 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 584: 2520, 2520, 2520, 2520, 2520, 2520, 2520, 593: 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 615: 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 625: 2520, 2520, 2520, 2520, 2520, 2520, 632: 2520, 637: 2520, 2520, 2520, 2520, 661: 2520, 706: 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520}, - {563: 4599}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 3949, 3067, 3068, 3066, 810: 4600}, + {57: 4602}, + {1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 537: 1329, 1329, 1329, 541: 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 554: 1329, 1329, 1329, 559: 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 568: 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 585: 1329, 1329, 1329, 1329, 1329, 1329, 593: 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 614: 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 632: 1329, 637: 1329, 1329, 1329, 1329, 661: 1329, 707: 1329}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 565: 3955, 777: 3954, 3072, 3073, 3071, 810: 4604}, + {57: 4605}, + {2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 537: 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 553: 2526, 2526, 2526, 2526, 559: 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 568: 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 585: 2526, 2526, 2526, 2526, 2526, 2526, 593: 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 614: 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 632: 2526, 637: 2526, 2526, 2526, 2526, 661: 2526, 706: 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526}, // 1730 - {2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 537: 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 553: 2521, 2521, 2521, 2521, 559: 2521, 2521, 2521, 2521, 2521, 565: 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 584: 2521, 2521, 2521, 2521, 2521, 2521, 2521, 593: 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 615: 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 625: 2521, 2521, 2521, 2521, 2521, 2521, 632: 2521, 637: 2521, 2521, 2521, 2521, 661: 2521, 706: 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3703, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3637, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 4609, 3618, 3700, 3617, 3614}, - {117: 4605, 258: 4603, 272: 4604, 1263: 4606}, - {9: 2852, 57: 2852, 93: 2852, 134: 2852, 136: 2852, 158: 2852, 717: 2852}, - {9: 2851, 57: 2851, 93: 2851, 134: 2851, 136: 2851, 158: 2851, 717: 2851}, + {563: 4607}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 565: 3955, 777: 3954, 3072, 3073, 3071, 810: 4608}, + {2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 537: 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 553: 2527, 2527, 2527, 2527, 559: 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 568: 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 585: 2527, 2527, 2527, 2527, 2527, 2527, 593: 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 614: 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 632: 2527, 637: 2527, 2527, 2527, 2527, 661: 2527, 706: 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3708, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3642, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 4617, 3623, 3705, 3622, 3619}, + {117: 4613, 258: 4611, 272: 4612, 1263: 4614}, // 1735 - {9: 2850, 57: 2850, 93: 2850, 134: 2850, 136: 2850, 158: 2850, 717: 2850}, - {717: 4607}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3703, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3637, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 4608, 3618, 3700, 3617, 3614}, - {2, 2, 9: 2, 51: 2, 93: 2, 117: 2, 543: 3714, 661: 2, 707: 3715}, - {4, 4, 9: 4, 51: 4, 93: 4, 117: 4, 543: 3714, 661: 4, 707: 3715}, + {9: 2858, 57: 2858, 93: 2858, 135: 2858, 137: 2858, 159: 2858, 717: 2858}, + {9: 2857, 57: 2857, 93: 2857, 135: 2857, 137: 2857, 159: 2857, 717: 2857}, + {9: 2856, 57: 2856, 93: 2856, 135: 2856, 137: 2856, 159: 2856, 717: 2856}, + {717: 4615}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3708, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3642, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 4616, 3623, 3705, 3622, 3619}, // 1740 - {2: 2328, 2328, 2328, 2328, 2328, 2328, 2328, 10: 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 58: 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 536: 2328, 538: 2328, 2328, 2328, 2328, 545: 2328, 2328, 548: 2328, 2328, 2328, 552: 2328, 2328, 2328, 557: 2328, 2328, 564: 2328, 583: 2328, 591: 2328, 2328, 624: 2328, 631: 2328, 633: 2328, 2328, 2328, 2328, 641: 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 662: 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 2328, 702: 2328, 2328, 2328, 2328, 716: 2328, 939: 2328}, - {229: 4613, 231: 4612, 939: 4614, 1262: 4615}, - {2849, 2849, 9: 2849, 51: 2849, 57: 2849, 93: 2849, 117: 2849, 134: 2849, 136: 2849, 661: 2849}, - {2848, 2848, 9: 2848, 51: 2848, 57: 2848, 93: 2848, 117: 2848, 134: 2848, 136: 2848, 661: 2848}, - {2847, 2847, 9: 2847, 51: 2847, 57: 2847, 93: 2847, 117: 2847, 134: 2847, 136: 2847, 661: 2847}, + {2, 2, 9: 2, 51: 2, 93: 2, 117: 2, 543: 3719, 661: 2, 707: 3720}, + {4, 4, 9: 4, 51: 4, 93: 4, 117: 4, 543: 3719, 661: 4, 707: 3720}, + {2: 2334, 2334, 2334, 2334, 2334, 2334, 2334, 10: 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 58: 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 536: 2334, 538: 2334, 2334, 2334, 2334, 545: 2334, 2334, 548: 2334, 2334, 2334, 552: 2334, 2334, 2334, 557: 2334, 2334, 565: 2334, 567: 2334, 584: 2334, 591: 2334, 2334, 630: 2334, 2334, 633: 2334, 2334, 2334, 2334, 641: 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 662: 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 2334, 716: 2334, 941: 2334}, + {229: 4621, 231: 4620, 941: 4622, 1262: 4623}, + {2855, 2855, 9: 2855, 51: 2855, 57: 2855, 93: 2855, 117: 2855, 135: 2855, 137: 2855, 661: 2855}, // 1745 + {2854, 2854, 9: 2854, 51: 2854, 57: 2854, 93: 2854, 117: 2854, 135: 2854, 137: 2854, 661: 2854}, + {2853, 2853, 9: 2853, 51: 2853, 57: 2853, 93: 2853, 117: 2853, 135: 2853, 137: 2853, 661: 2853}, {6, 6, 9: 6, 51: 6, 93: 6, 117: 6, 661: 6}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 540: 4618, 633: 3703, 777: 4617, 3067, 3068, 3066, 782: 4620, 942: 4619}, - {2476, 2476, 9: 2476, 51: 2476, 93: 2476, 110: 2476, 2476, 2476, 2476, 2476, 117: 2476, 661: 2476}, - {2475, 2475, 9: 2475, 51: 2475, 93: 2475, 110: 2475, 2475, 2475, 2475, 2475, 117: 2475, 661: 2475}, - {8, 8, 9: 8, 51: 8, 93: 8, 117: 8, 661: 8}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 540: 4626, 633: 3708, 777: 4625, 3072, 3073, 3071, 782: 4628, 944: 4627}, + {2482, 2482, 9: 2482, 51: 2482, 93: 2482, 110: 2482, 2482, 2482, 2482, 2482, 117: 2482, 661: 2482}, // 1750 + {2481, 2481, 9: 2481, 51: 2481, 93: 2481, 110: 2481, 2481, 2481, 2481, 2481, 117: 2481, 661: 2481}, + {8, 8, 9: 8, 51: 8, 93: 8, 117: 8, 661: 8}, {7, 7, 9: 7, 51: 7, 93: 7, 117: 7, 661: 7}, {10, 10, 9: 10, 51: 10, 93: 10, 117: 10, 661: 10}, - {51: 3057, 93: 3058, 117: 3061, 661: 3060, 1079: 4623, 3059}, - {9, 9, 9: 9, 51: 9, 93: 9, 117: 9, 661: 9}, - {27, 27, 158: 4631, 171: 4630, 174: 4629, 462: 4632, 1048: 4628, 1336: 4625, 4627, 1359: 4626}, + {51: 3062, 93: 3063, 117: 3066, 661: 3065, 1081: 4631, 3064}, // 1755 + {9, 9, 9: 9, 51: 9, 93: 9, 117: 9, 661: 9}, + {27, 27, 159: 4639, 173: 4638, 175: 4637, 462: 4640, 1049: 4636, 1334: 4633, 4635, 1357: 4634}, {28, 28}, - {26, 26, 9: 4648, 158: 4631, 171: 4630, 174: 4629, 1048: 4647}, + {26, 26, 9: 4656, 159: 4639, 173: 4638, 175: 4637, 1049: 4655}, {25, 25}, - {24, 24, 9: 24, 158: 24, 171: 24, 174: 24}, - {2: 2329, 2329, 2329, 2329, 2329, 2329, 2329, 10: 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 58: 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 536: 2329, 538: 2329, 2329, 2329, 2329, 545: 2329, 2329, 548: 2329, 2329, 2329, 552: 2329, 2329, 557: 2329, 2329, 561: 4610, 564: 2329, 583: 2329, 591: 2329, 2329, 624: 2329, 631: 2329, 633: 2329, 2329, 2329, 2329, 641: 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 662: 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 702: 2329, 2329, 2329, 2329, 716: 2329, 808: 4645}, // 1760 - {2: 2329, 2329, 2329, 2329, 2329, 2329, 2329, 10: 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 58: 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 536: 2329, 538: 2329, 2329, 2329, 2329, 545: 2329, 2329, 548: 2329, 2329, 2329, 552: 2329, 2329, 557: 2329, 2329, 561: 4610, 564: 2329, 583: 2329, 591: 2329, 2329, 624: 2329, 631: 2329, 633: 2329, 2329, 2329, 2329, 641: 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 662: 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 702: 2329, 2329, 2329, 2329, 716: 2329, 808: 4643}, - {538: 2329, 561: 4610, 646: 2329, 808: 4638}, - {413: 4635, 4634, 4636, 455: 4633, 4637}, + {24, 24, 9: 24, 159: 24, 173: 24, 175: 24}, + {2: 2335, 2335, 2335, 2335, 2335, 2335, 2335, 10: 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 58: 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 536: 2335, 538: 2335, 2335, 2335, 2335, 545: 2335, 2335, 548: 2335, 2335, 2335, 552: 2335, 2335, 557: 2335, 2335, 562: 4618, 567: 2335, 584: 2335, 591: 2335, 2335, 630: 2335, 2335, 633: 2335, 2335, 2335, 2335, 641: 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 662: 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 716: 2335, 808: 4653}, + {2: 2335, 2335, 2335, 2335, 2335, 2335, 2335, 10: 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 58: 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 536: 2335, 538: 2335, 2335, 2335, 2335, 545: 2335, 2335, 548: 2335, 2335, 2335, 552: 2335, 2335, 557: 2335, 2335, 562: 4618, 567: 2335, 584: 2335, 591: 2335, 2335, 630: 2335, 2335, 633: 2335, 2335, 2335, 2335, 641: 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 662: 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 716: 2335, 808: 4651}, + {538: 2335, 562: 4618, 646: 2335, 808: 4646}, + {413: 4643, 4642, 4644, 454: 4641, 4645}, + // 1765 {17, 17}, {16, 16}, - // 1765 {15, 15}, {14, 14}, {13, 13}, - {538: 4639, 646: 4640}, - {19, 19, 9: 19, 158: 19, 171: 19, 174: 19}, // 1770 - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 4641}, - {118: 3789, 127: 3797, 133: 3785, 137: 3782, 3784, 3781, 3783, 3787, 3788, 3793, 3792, 3791, 3795, 3796, 3790, 3794, 3786, 571: 3767, 3765, 3766, 3764, 3762, 599: 3779, 3776, 3778, 3777, 3773, 3775, 3774, 3771, 3772, 3770, 3780, 806: 3763, 3761, 892: 3769, 907: 4642}, - {18, 18, 9: 18, 158: 18, 171: 18, 174: 18}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 4644}, - {20, 20, 9: 20, 158: 20, 171: 20, 174: 20, 571: 3767, 3765, 3766, 3764, 3762, 806: 3763, 3761}, + {538: 4647, 646: 4648}, + {19, 19, 9: 19, 159: 19, 173: 19, 175: 19}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 4649}, + {118: 3794, 127: 3802, 134: 3790, 138: 3787, 140: 3789, 3786, 3788, 3792, 3793, 3798, 3797, 3796, 3800, 3801, 3795, 3799, 3791, 572: 3772, 3770, 3771, 3769, 3767, 599: 3784, 3781, 3783, 3782, 3778, 3780, 3779, 3776, 3777, 3775, 3785, 806: 3768, 3766, 892: 3774, 907: 4650}, + {18, 18, 9: 18, 159: 18, 173: 18, 175: 18}, // 1775 - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 4646}, - {21, 21, 9: 21, 158: 21, 171: 21, 174: 21, 571: 3767, 3765, 3766, 3764, 3762, 806: 3763, 3761}, - {23, 23, 9: 23, 158: 23, 171: 23, 174: 23}, - {158: 4631, 171: 4630, 174: 4629, 1048: 4649}, - {22, 22, 9: 22, 158: 22, 171: 22, 174: 22}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 4652}, + {20, 20, 9: 20, 159: 20, 173: 20, 175: 20, 572: 3772, 3770, 3771, 3769, 3767, 806: 3768, 3766}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 4654}, + {21, 21, 9: 21, 159: 21, 173: 21, 175: 21, 572: 3772, 3770, 3771, 3769, 3767, 806: 3768, 3766}, + {23, 23, 9: 23, 159: 23, 173: 23, 175: 23}, // 1780 - {285: 4653, 386: 4651, 900: 4652}, - {537: 4661, 587: 135, 1427: 4660}, - {538: 4659}, - {2: 4655, 538: 4654}, - {538: 4658}, + {159: 4639, 173: 4638, 175: 4637, 1049: 4657}, + {22, 22, 9: 22, 159: 22, 173: 22, 175: 22}, + {286: 4661, 387: 4659, 915: 4660}, + {537: 4669, 588: 135, 1426: 4668}, + {538: 4667}, // 1785 - {538: 4656}, - {538: 4657}, + {2: 4663, 538: 4662}, + {538: 4666}, + {538: 4664}, + {538: 4665}, {136, 136}, + // 1790 {137, 137}, {138, 138}, - // 1790 - {587: 4667}, - {225: 4662}, - {736: 4663, 1001: 4664}, - {185: 4665}, - {587: 134}, + {588: 4675}, + {225: 4670}, + {736: 4671, 1003: 4672}, // 1795 - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 4666}, - {2133, 2133, 9: 2133, 57: 2133, 535: 2133, 537: 2133, 544: 2133, 2133, 2133, 2133, 554: 2133, 2133, 2133, 559: 2133, 2133, 562: 2133, 2133, 565: 2133, 567: 2133, 2133, 2133, 2133, 3767, 3765, 3766, 3764, 3762, 2133, 2133, 2133, 2133, 2133, 2133, 585: 2133, 2133, 2133, 2133, 590: 2133, 597: 2133, 806: 3763, 3761}, - {246: 4680, 536: 2923, 2922, 4681, 552: 2921, 557: 2907, 592: 2906, 614: 2920, 701: 2916, 718: 4679, 3035, 729: 4668, 781: 4669, 809: 2886, 812: 4670, 2917, 2918, 2919, 2928, 818: 2926, 2925, 2924, 822: 2889, 4676, 4675, 828: 3034, 2887, 4673, 832: 4674, 4672, 839: 2888, 845: 4671, 910: 4677, 926: 4678}, - {554: 4697, 614: 2128, 964: 4696}, - {630, 630, 544: 1020, 555: 1020, 1020, 559: 3881, 562: 3880, 569: 3879, 848: 3882, 3883}, + {186: 4673}, + {588: 134}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 4674}, + {2142, 2142, 9: 2142, 57: 2142, 535: 2142, 537: 2142, 544: 2142, 2142, 2142, 2142, 554: 2142, 2142, 2142, 559: 2142, 2142, 2142, 563: 2142, 2142, 568: 2142, 2142, 2142, 2142, 3772, 3770, 3771, 3769, 3767, 2142, 2142, 2142, 2142, 2142, 2142, 586: 2142, 2142, 2142, 2142, 2142, 597: 2142, 806: 3768, 3766}, + {132: 3044, 246: 4689, 536: 2929, 2928, 4690, 552: 2927, 557: 2913, 592: 2912, 613: 2926, 660: 2922, 718: 4688, 3039, 729: 4676, 781: 4677, 809: 2892, 812: 4678, 2923, 2924, 2925, 2934, 2932, 2931, 2930, 821: 2895, 4684, 4683, 827: 3038, 829: 2893, 4681, 4682, 4680, 840: 2894, 845: 4679, 910: 4685, 914: 4686, 928: 4687}, // 1800 - {632, 632, 544: 1021, 555: 1021, 1021}, + {554: 4706, 613: 2137, 966: 4705}, + {638, 638, 544: 1028, 555: 1028, 1028, 559: 3886, 3885, 570: 3884, 847: 3887, 3888}, + {640, 640, 544: 1029, 555: 1029, 1029}, + {645, 645}, + {644, 644}, + // 1805 + {643, 643}, + {642, 642}, + {641, 641}, + {639, 639}, {637, 637}, + // 1810 {636, 636}, - {635, 635}, - {634, 634}, - // 1805 - {633, 633}, - {631, 631}, - {629, 629}, {144, 144}, - {246: 4690, 536: 2923, 2922, 4691, 552: 2921, 557: 2907, 592: 2906, 614: 2920, 701: 2916, 719: 3035, 729: 4668, 781: 4669, 809: 2886, 812: 4670, 2917, 2918, 2919, 2928, 818: 2926, 2925, 2924, 822: 2889, 4676, 4675, 828: 3034, 2887, 4673, 832: 4674, 4672, 839: 2888, 845: 4671, 910: 4677, 926: 4689}, - // 1810 - {159: 4682}, + {132: 3044, 246: 4699, 536: 2929, 2928, 4700, 552: 2927, 557: 2913, 592: 2912, 613: 2926, 660: 2922, 719: 3039, 729: 4676, 781: 4677, 809: 2892, 812: 4678, 2923, 2924, 2925, 2934, 2932, 2931, 2930, 821: 2895, 4684, 4683, 827: 3038, 829: 2893, 4681, 4682, 4680, 840: 2894, 845: 4679, 910: 4685, 914: 4686, 928: 4698}, + {161: 4691}, {140, 140}, - {424, 424, 559: 424, 562: 424, 568: 4683, 424, 895: 4684, 4685}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 4688}, - {423, 423, 57: 423, 535: 423, 537: 423, 544: 423, 547: 423, 555: 423, 423, 559: 423, 562: 423, 423, 565: 423, 567: 423, 569: 423, 576: 423, 423, 579: 423}, // 1815 - {1507, 1507, 559: 1507, 562: 1507, 569: 3879, 848: 3933, 915: 4686}, - {1075, 1075, 559: 3881, 562: 3880, 849: 3938, 931: 4687}, + {431, 431, 559: 431, 431, 569: 4692, 431, 895: 4693, 4694}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 4697}, + {430, 430, 57: 430, 535: 430, 537: 430, 544: 430, 547: 430, 555: 430, 430, 559: 430, 430, 563: 430, 430, 568: 430, 570: 430, 577: 430, 430, 580: 430}, + {1516, 1516, 559: 1516, 1516, 570: 3884, 847: 3938, 917: 4695}, + {1083, 1083, 559: 3886, 3885, 848: 3943, 932: 4696}, + // 1820 {142, 142}, - {425, 425, 57: 425, 535: 425, 537: 425, 544: 425, 547: 425, 555: 425, 425, 559: 425, 562: 425, 425, 565: 425, 567: 425, 569: 425, 571: 3767, 3765, 3766, 3764, 3762, 425, 425, 579: 425, 806: 3763, 3761}, + {432, 432, 57: 432, 535: 432, 537: 432, 544: 432, 547: 432, 555: 432, 432, 559: 432, 432, 563: 432, 432, 568: 432, 570: 432, 572: 3772, 3770, 3771, 3769, 3767, 432, 432, 580: 432, 806: 3768, 3766}, {143, 143}, - // 1820 - {159: 4692}, + {161: 4701}, {139, 139}, - {424, 424, 559: 424, 562: 424, 568: 4683, 424, 895: 4684, 4693}, - {1507, 1507, 559: 1507, 562: 1507, 569: 3879, 848: 3933, 915: 4694}, - {1075, 1075, 559: 3881, 562: 3880, 849: 3938, 931: 4695}, // 1825 + {431, 431, 559: 431, 431, 569: 4692, 431, 895: 4693, 4702}, + {1516, 1516, 559: 1516, 1516, 570: 3884, 847: 3938, 917: 4703}, + {1083, 1083, 559: 3886, 3885, 848: 3943, 932: 4704}, {141, 141}, - {614: 4698}, - {2: 2127, 2127, 2127, 2127, 2127, 2127, 2127, 10: 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 58: 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 536: 2127, 565: 2127, 2127, 614: 2127, 648: 2127}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 3949, 3067, 3068, 3066, 810: 4699}, - {2707, 2707, 2707, 2707, 2707, 2707, 4747, 4749, 580, 10: 4716, 15: 4766, 2459, 4764, 4703, 4768, 4755, 4784, 4751, 4748, 4750, 4753, 4754, 4756, 4763, 580, 4774, 4775, 4785, 4761, 4762, 4767, 4769, 4781, 4780, 4789, 4782, 4779, 4772, 4777, 4778, 4771, 4773, 4776, 4765, 4786, 4787, 89: 4718, 4739, 4740, 102: 4741, 210: 4721, 234: 4710, 249: 4704, 251: 4702, 253: 4725, 256: 4726, 270: 4720, 276: 4736, 290: 4714, 299: 4722, 305: 4717, 324: 4727, 332: 4723, 339: 4737, 4738, 344: 4705, 537: 4735, 540: 4746, 543: 2459, 4783, 551: 2707, 558: 2459, 560: 4707, 567: 4742, 569: 4724, 4734, 651: 4708, 709: 4713, 714: 2459, 4752, 718: 4701, 729: 4729, 732: 4715, 734: 4743, 772: 4728, 4730, 775: 4709, 4719, 871: 4757, 897: 4759, 916: 4758, 937: 4760, 943: 4770, 947: 4788, 978: 4733, 992: 4731, 1026: 4706, 1034: 4711, 1116: 4745, 1291: 4712, 1315: 4732, 1321: 4744, 4700}, + {613: 4707}, // 1830 - {2457, 2457, 5573, 5575, 5576, 5574, 551: 5577, 1239: 5572, 1323: 5571}, - {551: 5545}, - {2865, 2865, 202: 5539, 551: 5540}, - {215: 5531}, - {538: 2329, 540: 2329, 561: 4610, 808: 5528}, + {2: 2136, 2136, 2136, 2136, 2136, 2136, 2136, 10: 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 58: 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136, 536: 2136, 564: 2136, 2136, 2136, 613: 2136, 648: 2136}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 565: 3955, 777: 3954, 3072, 3073, 3071, 810: 4708}, + {2713, 2713, 2713, 2713, 2713, 2713, 4756, 4758, 587, 10: 4725, 15: 4775, 2465, 4773, 4712, 4777, 4764, 4793, 4757, 4760, 4759, 4762, 4763, 4765, 4772, 587, 4783, 4784, 4794, 4770, 4771, 4776, 4778, 4790, 4789, 4798, 4791, 4788, 4781, 4786, 4787, 4780, 4782, 4785, 4774, 4795, 4796, 89: 4727, 4748, 4749, 102: 4750, 132: 4730, 234: 4719, 249: 4713, 251: 4711, 253: 4734, 256: 4735, 270: 4729, 276: 4745, 291: 4723, 300: 4731, 306: 4726, 326: 4736, 333: 4732, 340: 4746, 4747, 346: 4714, 537: 4744, 540: 4755, 543: 2465, 4792, 551: 2713, 558: 2465, 561: 4716, 568: 4751, 570: 4733, 4743, 651: 4717, 709: 4722, 714: 2465, 4761, 718: 4710, 729: 4738, 732: 4724, 734: 4752, 772: 4737, 4728, 4739, 776: 4718, 871: 4766, 897: 4768, 918: 4767, 939: 4769, 945: 4779, 950: 4797, 979: 4742, 993: 4740, 1027: 4715, 1035: 4720, 1119: 4754, 1290: 4721, 1313: 4741, 1319: 4753, 4709}, + {2463, 2463, 5582, 5584, 5585, 5583, 551: 5586, 1240: 5581, 1321: 5580}, + {551: 5554}, // 1835 - {538: 2329, 540: 2329, 561: 4610, 808: 5525}, - {2793, 2793, 2793, 2793, 2793, 2793, 4747, 4749, 580, 2793, 15: 4766, 2459, 4764, 4703, 4768, 4755, 4784, 4751, 4748, 4750, 4753, 4754, 4756, 4763, 580, 4774, 4775, 4785, 4761, 4762, 4767, 4769, 4781, 4780, 4789, 4782, 4779, 4772, 4777, 4778, 4771, 4773, 4776, 4765, 4786, 4787, 540: 4746, 543: 2459, 4783, 551: 2793, 558: 2459, 570: 5521, 714: 2459, 4752, 871: 4757, 897: 4759, 916: 4758, 937: 4760, 943: 4770, 947: 5522}, - {202: 5506, 209: 5507}, - {717: 5498}, - {2: 2712, 2712, 2712, 2712, 2712, 2712, 2712, 10: 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 58: 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 536: 2712, 551: 5351, 583: 2712, 706: 2701, 708: 2701, 2701, 2701, 5107, 715: 2701, 751: 2701, 2701, 934: 5353, 958: 4942, 981: 5349, 1008: 5350, 1021: 5352}, + {2871, 2871, 202: 5548, 551: 5549}, + {215: 5540}, + {538: 2335, 540: 2335, 562: 4618, 808: 5537}, + {538: 2335, 540: 2335, 562: 4618, 808: 5534}, + {2799, 2799, 2799, 2799, 2799, 2799, 4756, 4758, 587, 2799, 15: 4775, 2465, 4773, 4712, 4777, 4764, 4793, 4757, 4760, 4759, 4762, 4763, 4765, 4772, 587, 4783, 4784, 4794, 4770, 4771, 4776, 4778, 4790, 4789, 4798, 4791, 4788, 4781, 4786, 4787, 4780, 4782, 4785, 4774, 4795, 4796, 540: 4755, 543: 2465, 4792, 551: 2799, 558: 2465, 571: 5530, 714: 2465, 4761, 871: 4766, 897: 4768, 918: 4767, 939: 4769, 945: 4779, 950: 5531}, // 1840 - {551: 5342}, - {2781, 2781, 2781, 2781, 2781, 2781, 9: 2781, 551: 2781}, - {2780, 2780, 2780, 2780, 2780, 2780, 9: 2780, 551: 2780}, - {551: 5340}, - {551: 5337}, + {202: 5515, 209: 5516}, + {717: 5507}, + {2: 2718, 2718, 2718, 2718, 2718, 2718, 2718, 10: 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 58: 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 536: 2718, 551: 5360, 584: 2718, 706: 2707, 708: 2707, 2707, 2707, 5116, 715: 2707, 751: 2707, 2707, 936: 5362, 960: 4951, 982: 5358, 1010: 5359, 1023: 5361}, + {551: 5351}, + {2787, 2787, 2787, 2787, 2787, 2787, 9: 2787, 551: 2787}, // 1845 - {2: 2712, 2712, 2712, 2712, 2712, 2712, 2712, 10: 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 58: 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 551: 5316, 583: 2712, 706: 4928, 708: 5315, 4943, 711: 4944, 715: 4929, 751: 5319, 929: 5318, 958: 4942, 981: 5314, 1021: 5317, 1128: 5320}, - {551: 5307}, - {551: 5296}, - {551: 5294}, - {551: 5291}, + {2786, 2786, 2786, 2786, 2786, 2786, 9: 2786, 551: 2786}, + {551: 5349}, + {551: 5346}, + {2: 2718, 2718, 2718, 2718, 2718, 2718, 2718, 10: 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 58: 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 551: 5325, 584: 2718, 706: 4937, 708: 5324, 4952, 711: 4953, 715: 4938, 751: 5328, 931: 5327, 960: 4951, 982: 5323, 1023: 5326, 1131: 5329}, + {551: 5316}, // 1850 - {551: 5288}, - {20: 5285, 551: 5284}, - {20: 5281, 551: 5280}, - {551: 5270}, - {728: 5263}, + {551: 5305}, + {551: 5303}, + {551: 5300}, + {551: 5297}, + {20: 5294, 551: 5293}, // 1855 - {1061: 5262}, - {1061: 5261}, - {2: 2712, 2712, 2712, 2712, 2712, 2712, 2712, 10: 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 58: 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 583: 2712, 958: 4942, 981: 5257}, - {2: 2712, 2712, 2712, 2712, 2712, 2712, 2712, 10: 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 58: 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 583: 2712, 958: 4942, 981: 4968}, - {2: 2712, 2712, 2712, 2712, 2712, 2712, 2712, 10: 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 58: 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 709: 4943, 711: 4944, 715: 4941, 958: 4942, 981: 4939, 1128: 4940}, + {20: 5290, 551: 5289}, + {551: 5279}, + {728: 5272}, + {1062: 5271}, + {1062: 5270}, // 1860 - {2: 2329, 2329, 2329, 2329, 2329, 2329, 2329, 10: 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 58: 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 542: 4926, 561: 4610, 706: 4928, 715: 4929, 717: 4924, 808: 4925, 929: 4927, 958: 4923}, + {2: 2718, 2718, 2718, 2718, 2718, 2718, 2718, 10: 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 58: 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 584: 2718, 960: 4951, 982: 5266}, + {2: 2718, 2718, 2718, 2718, 2718, 2718, 2718, 10: 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 58: 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 584: 2718, 960: 4951, 982: 4977}, + {2: 2718, 2718, 2718, 2718, 2718, 2718, 2718, 10: 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 58: 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718, 709: 4952, 711: 4953, 715: 4950, 960: 4951, 982: 4948, 1131: 4949}, + {2: 2335, 2335, 2335, 2335, 2335, 2335, 2335, 10: 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 58: 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 542: 4935, 562: 4618, 565: 2335, 706: 4937, 715: 4938, 717: 4933, 808: 4934, 931: 4936, 960: 4932}, + {2754, 2754, 2754, 2754, 2754, 2754, 9: 2754, 551: 2754}, + // 1865 + {2753, 2753, 2753, 2753, 2753, 2753, 9: 2753, 551: 2753}, + {2752, 2752, 2752, 2752, 2752, 2752, 9: 2752, 551: 2752}, + {2751, 2751, 2751, 2751, 2751, 2751, 8: 586, 2751, 29: 586, 551: 2751}, + {247: 4931}, + {247: 4930}, + // 1870 {2748, 2748, 2748, 2748, 2748, 2748, 9: 2748, 551: 2748}, {2747, 2747, 2747, 2747, 2747, 2747, 9: 2747, 551: 2747}, - {2746, 2746, 2746, 2746, 2746, 2746, 9: 2746, 551: 2746}, - {2745, 2745, 2745, 2745, 2745, 2745, 8: 579, 2745, 29: 579, 551: 2745}, - // 1865 - {247: 4922}, - {247: 4921}, + {2743, 2743, 2743, 2743, 2743, 2743, 9: 2743, 551: 2743}, {2742, 2742, 2742, 2742, 2742, 2742, 9: 2742, 551: 2742}, - {2741, 2741, 2741, 2741, 2741, 2741, 9: 2741, 551: 2741}, - {2737, 2737, 2737, 2737, 2737, 2737, 9: 2737, 551: 2737}, - // 1870 - {2736, 2736, 2736, 2736, 2736, 2736, 9: 2736, 551: 2736}, - {56: 2329, 293: 2329, 315: 2329, 317: 2329, 540: 2329, 561: 4610, 808: 4915}, - {2: 2329, 2329, 2329, 2329, 2329, 2329, 2329, 10: 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 58: 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 540: 2329, 561: 4610, 808: 4912}, - {195: 4911, 774: 4910}, - {2706, 2706, 2706, 2706, 2706, 2706, 9: 4908, 551: 2706}, + {56: 2335, 294: 2335, 317: 2335, 319: 2335, 540: 2335, 562: 4618, 808: 4924}, // 1875 - {2705, 2705, 2705, 2705, 2705, 2705, 9: 2705, 551: 2705}, - {16: 2458, 18: 2458, 21: 2458, 543: 2458, 558: 2458, 714: 2458}, - {538: 2329, 561: 4610, 808: 4906}, - {2: 2329, 2329, 2329, 2329, 2329, 2329, 2329, 10: 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 58: 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 538: 2329, 561: 4610, 808: 4904}, - {23: 4899, 236: 4900, 300: 4901}, + {2: 2335, 2335, 2335, 2335, 2335, 2335, 2335, 10: 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 58: 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 540: 2335, 562: 4618, 808: 4921}, + {196: 4920, 775: 4919}, + {2712, 2712, 2712, 2712, 2712, 2712, 9: 4917, 551: 2712}, + {2711, 2711, 2711, 2711, 2711, 2711, 9: 2711, 551: 2711}, + {16: 2464, 18: 2464, 21: 2464, 543: 2464, 558: 2464, 714: 2464}, // 1880 - {2: 2329, 2329, 2329, 2329, 2329, 2329, 2329, 10: 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 58: 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 538: 2329, 561: 4610, 808: 4897}, - {298: 4894}, - {298: 4891}, - {561: 4610, 564: 2329, 808: 4889}, - {561: 4610, 564: 2329, 808: 4887}, + {538: 2335, 562: 4618, 808: 4915}, + {2: 2335, 2335, 2335, 2335, 2335, 2335, 2335, 10: 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 58: 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 538: 2335, 562: 4618, 808: 4913}, + {22: 4908, 236: 4909, 301: 4910}, + {2: 2335, 2335, 2335, 2335, 2335, 2335, 2335, 10: 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 58: 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 538: 2335, 562: 4618, 808: 4906}, + {299: 4903}, // 1885 - {2: 2329, 2329, 2329, 2329, 2329, 2329, 2329, 10: 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 58: 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 561: 4610, 808: 4885}, - {561: 4610, 564: 2329, 808: 4883}, - {2403, 2403, 2403, 2403, 2403, 2403, 2403, 2403, 2403, 2403, 15: 2403, 2403, 2403, 2403, 2403, 2403, 2403, 2403, 2403, 2403, 2403, 2403, 2403, 2403, 2403, 2403, 2403, 2403, 2403, 2403, 2403, 2403, 2403, 2403, 2403, 2403, 2403, 2403, 2403, 2403, 2403, 2403, 2403, 2403, 2403, 2403, 57: 2403, 535: 2403, 2403, 2403, 540: 2403, 542: 2403, 2403, 2403, 551: 2403, 2403, 554: 2403, 557: 2403, 2403, 570: 2403, 614: 2403, 701: 2403, 714: 2403, 2403}, - {617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 15: 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 535: 617, 617, 617, 540: 617, 542: 617, 617, 617, 551: 617, 617, 554: 617, 557: 617, 617, 570: 617, 614: 617, 701: 617, 714: 617, 617}, - {16: 4440, 543: 4878, 558: 4441, 714: 4439, 859: 4877}, + {299: 4900}, + {562: 4618, 567: 2335, 808: 4898}, + {562: 4618, 567: 2335, 808: 4896}, + {2: 2335, 2335, 2335, 2335, 2335, 2335, 2335, 10: 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 58: 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 562: 4618, 808: 4894}, + {562: 4618, 567: 2335, 808: 4892}, // 1890 - {8: 4871, 29: 4872}, - {561: 4610, 564: 2329, 808: 4869}, - {561: 4610, 564: 2329, 808: 4867}, - {538: 2329, 561: 4610, 808: 4865}, - {561: 4610, 564: 2329, 808: 4863}, + {2409, 2409, 2409, 2409, 2409, 2409, 2409, 2409, 2409, 2409, 15: 2409, 2409, 2409, 2409, 2409, 2409, 2409, 2409, 2409, 2409, 2409, 2409, 2409, 2409, 2409, 2409, 2409, 2409, 2409, 2409, 2409, 2409, 2409, 2409, 2409, 2409, 2409, 2409, 2409, 2409, 2409, 2409, 2409, 2409, 2409, 2409, 57: 2409, 535: 2409, 2409, 2409, 540: 2409, 542: 2409, 2409, 2409, 551: 2409, 2409, 554: 2409, 557: 2409, 2409, 571: 2409, 613: 2409, 660: 2409, 714: 2409, 2409}, + {624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 15: 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 535: 624, 624, 624, 540: 624, 542: 624, 624, 624, 551: 624, 624, 554: 624, 557: 624, 624, 571: 624, 613: 624, 660: 624, 714: 624, 624}, + {16: 4448, 543: 4887, 558: 4449, 714: 4447, 859: 4886}, + {8: 4880, 29: 4881}, + {562: 4618, 567: 2335, 808: 4878}, // 1895 - {561: 4610, 564: 2329, 808: 4861}, - {538: 2329, 561: 4610, 808: 4859}, - {538: 2329, 561: 4610, 808: 4857}, - {561: 4610, 564: 2329, 808: 4855}, - {561: 4610, 564: 2329, 808: 4853}, + {562: 4618, 567: 2335, 808: 4876}, + {538: 2335, 562: 4618, 808: 4874}, + {562: 4618, 567: 2335, 808: 4872}, + {562: 4618, 567: 2335, 808: 4870}, + {538: 2335, 562: 4618, 808: 4868}, // 1900 - {603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 15: 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 535: 603, 603, 603, 540: 603, 542: 603, 603, 603, 551: 603, 603, 554: 603, 557: 603, 603, 570: 603, 614: 603, 701: 603, 714: 603, 603}, - {540: 2329, 561: 4610, 564: 2329, 808: 4851}, - {540: 2329, 561: 4610, 564: 2329, 808: 4848}, - {540: 2329, 561: 4610, 564: 2329, 808: 4845}, - {561: 4610, 564: 2329, 808: 4843}, + {538: 2335, 562: 4618, 808: 4866}, + {562: 4618, 567: 2335, 808: 4864}, + {562: 4618, 567: 2335, 808: 4862}, + {610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 15: 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 535: 610, 610, 610, 540: 610, 542: 610, 610, 610, 551: 610, 610, 554: 610, 557: 610, 610, 571: 610, 613: 610, 660: 610, 714: 610, 610}, + {540: 2335, 562: 4618, 567: 2335, 808: 4860}, // 1905 - {561: 4610, 564: 2329, 808: 4841}, - {561: 4610, 564: 2329, 641: 2329, 2329, 808: 4839}, - {538: 2329, 561: 4610, 808: 4837}, - {538: 2329, 561: 4610, 808: 4835}, - {561: 4610, 564: 2329, 808: 4833}, + {540: 2335, 562: 4618, 567: 2335, 808: 4857}, + {540: 2335, 562: 4618, 567: 2335, 808: 4854}, + {562: 4618, 567: 2335, 808: 4852}, + {562: 4618, 567: 2335, 808: 4850}, + {562: 4618, 567: 2335, 641: 2335, 2335, 808: 4848}, // 1910 - {561: 4610, 564: 2329, 808: 4831}, - {540: 2329, 561: 4610, 564: 2329, 808: 4827}, - {2: 2329, 2329, 2329, 2329, 2329, 2329, 2329, 10: 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 58: 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 538: 2329, 553: 2329, 561: 4610, 808: 4824}, - {536: 2329, 561: 4610, 808: 4819}, - {538: 2329, 561: 4610, 808: 4816}, + {538: 2335, 562: 4618, 808: 4846}, + {538: 2335, 562: 4618, 808: 4844}, + {562: 4618, 567: 2335, 808: 4842}, + {562: 4618, 567: 2335, 808: 4840}, + {540: 2335, 562: 4618, 567: 2335, 808: 4836}, // 1915 - {2: 2329, 2329, 2329, 2329, 2329, 2329, 2329, 10: 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 58: 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 561: 4610, 808: 4810}, - {538: 2329, 561: 4610, 808: 4808}, - {538: 2329, 561: 4610, 808: 4806}, - {574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 15: 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 535: 574, 574, 574, 540: 574, 542: 574, 574, 574, 551: 574, 574, 554: 574, 557: 574, 574, 570: 574, 614: 574, 701: 574, 714: 574, 574}, - {177: 2329, 251: 2329, 255: 2329, 291: 2329, 333: 2329, 348: 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 540: 2329, 561: 4610, 808: 4790}, + {2: 2335, 2335, 2335, 2335, 2335, 2335, 2335, 10: 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 58: 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 538: 2335, 553: 2335, 562: 4618, 808: 4833}, + {536: 2335, 562: 4618, 808: 4828}, + {538: 2335, 562: 4618, 808: 4825}, + {2: 2335, 2335, 2335, 2335, 2335, 2335, 2335, 10: 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 58: 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 562: 4618, 808: 4819}, + {538: 2335, 562: 4618, 808: 4817}, // 1920 - {177: 4793, 251: 4796, 255: 4792, 291: 4794, 333: 4795, 348: 4797, 4798, 4803, 4802, 4799, 4804, 4805, 4800, 4801, 540: 4791}, - {568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 15: 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 535: 568, 568, 568, 540: 568, 542: 568, 568, 568, 551: 568, 568, 554: 568, 557: 568, 568, 570: 568, 614: 568, 701: 568, 714: 568, 568}, - {567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 15: 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 535: 567, 567, 567, 540: 567, 542: 567, 567, 567, 551: 567, 567, 554: 567, 557: 567, 567, 570: 567, 614: 567, 701: 567, 714: 567, 567}, - {566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 15: 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 535: 566, 566, 566, 540: 566, 542: 566, 566, 566, 551: 566, 566, 554: 566, 557: 566, 566, 570: 566, 614: 566, 701: 566, 714: 566, 566}, - {565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 15: 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 535: 565, 565, 565, 540: 565, 542: 565, 565, 565, 551: 565, 565, 554: 565, 557: 565, 565, 570: 565, 614: 565, 701: 565, 714: 565, 565}, + {538: 2335, 562: 4618, 808: 4815}, + {581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 15: 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 535: 581, 581, 581, 540: 581, 542: 581, 581, 581, 551: 581, 581, 554: 581, 557: 581, 581, 571: 581, 613: 581, 660: 581, 714: 581, 581}, + {178: 2335, 251: 2335, 255: 2335, 292: 2335, 334: 2335, 350: 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 540: 2335, 562: 4618, 808: 4799}, + {178: 4802, 251: 4805, 255: 4801, 292: 4803, 334: 4804, 350: 4806, 4807, 4812, 4811, 4808, 4813, 4814, 4809, 4810, 540: 4800}, + {575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 15: 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 535: 575, 575, 575, 540: 575, 542: 575, 575, 575, 551: 575, 575, 554: 575, 557: 575, 575, 571: 575, 613: 575, 660: 575, 714: 575, 575}, // 1925 - {564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 15: 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 535: 564, 564, 564, 540: 564, 542: 564, 564, 564, 551: 564, 564, 554: 564, 557: 564, 564, 570: 564, 614: 564, 701: 564, 714: 564, 564}, - {563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 15: 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 535: 563, 563, 563, 540: 563, 542: 563, 563, 563, 551: 563, 563, 554: 563, 557: 563, 563, 570: 563, 614: 563, 701: 563, 714: 563, 563}, - {562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 15: 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 535: 562, 562, 562, 540: 562, 542: 562, 562, 562, 551: 562, 562, 554: 562, 557: 562, 562, 570: 562, 614: 562, 701: 562, 714: 562, 562}, - {561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 15: 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 535: 561, 561, 561, 540: 561, 542: 561, 561, 561, 551: 561, 561, 554: 561, 557: 561, 561, 570: 561, 614: 561, 701: 561, 714: 561, 561}, - {560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 15: 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 535: 560, 560, 560, 540: 560, 542: 560, 560, 560, 551: 560, 560, 554: 560, 557: 560, 560, 570: 560, 614: 560, 701: 560, 714: 560, 560}, + {574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 15: 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 535: 574, 574, 574, 540: 574, 542: 574, 574, 574, 551: 574, 574, 554: 574, 557: 574, 574, 571: 574, 613: 574, 660: 574, 714: 574, 574}, + {573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 15: 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 535: 573, 573, 573, 540: 573, 542: 573, 573, 573, 551: 573, 573, 554: 573, 557: 573, 573, 571: 573, 613: 573, 660: 573, 714: 573, 573}, + {572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 15: 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 535: 572, 572, 572, 540: 572, 542: 572, 572, 572, 551: 572, 572, 554: 572, 557: 572, 572, 571: 572, 613: 572, 660: 572, 714: 572, 572}, + {571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 15: 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 535: 571, 571, 571, 540: 571, 542: 571, 571, 571, 551: 571, 571, 554: 571, 557: 571, 571, 571: 571, 613: 571, 660: 571, 714: 571, 571}, + {570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 15: 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 535: 570, 570, 570, 540: 570, 542: 570, 570, 570, 551: 570, 570, 554: 570, 557: 570, 570, 571: 570, 613: 570, 660: 570, 714: 570, 570}, // 1930 - {559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 15: 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 535: 559, 559, 559, 540: 559, 542: 559, 559, 559, 551: 559, 559, 554: 559, 557: 559, 559, 570: 559, 614: 559, 701: 559, 714: 559, 559}, - {558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 15: 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 535: 558, 558, 558, 540: 558, 542: 558, 558, 558, 551: 558, 558, 554: 558, 557: 558, 558, 570: 558, 614: 558, 701: 558, 714: 558, 558}, - {557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 15: 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 535: 557, 557, 557, 540: 557, 542: 557, 557, 557, 551: 557, 557, 554: 557, 557: 557, 557, 570: 557, 614: 557, 701: 557, 714: 557, 557}, - {556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 15: 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 535: 556, 556, 556, 540: 556, 542: 556, 556, 556, 551: 556, 556, 554: 556, 557: 556, 556, 570: 556, 614: 556, 701: 556, 714: 556, 556}, - {555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 15: 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 535: 555, 555, 555, 540: 555, 542: 555, 555, 555, 551: 555, 555, 554: 555, 557: 555, 555, 570: 555, 614: 555, 701: 555, 714: 555, 555}, + {569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 15: 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 535: 569, 569, 569, 540: 569, 542: 569, 569, 569, 551: 569, 569, 554: 569, 557: 569, 569, 571: 569, 613: 569, 660: 569, 714: 569, 569}, + {568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 15: 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 535: 568, 568, 568, 540: 568, 542: 568, 568, 568, 551: 568, 568, 554: 568, 557: 568, 568, 571: 568, 613: 568, 660: 568, 714: 568, 568}, + {567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 15: 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 535: 567, 567, 567, 540: 567, 542: 567, 567, 567, 551: 567, 567, 554: 567, 557: 567, 567, 571: 567, 613: 567, 660: 567, 714: 567, 567}, + {566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 15: 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 535: 566, 566, 566, 540: 566, 542: 566, 566, 566, 551: 566, 566, 554: 566, 557: 566, 566, 571: 566, 613: 566, 660: 566, 714: 566, 566}, + {565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 15: 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 535: 565, 565, 565, 540: 565, 542: 565, 565, 565, 551: 565, 565, 554: 565, 557: 565, 565, 571: 565, 613: 565, 660: 565, 714: 565, 565}, // 1935 - {554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 15: 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 535: 554, 554, 554, 540: 554, 542: 554, 554, 554, 551: 554, 554, 554: 554, 557: 554, 554, 570: 554, 614: 554, 701: 554, 714: 554, 554}, - {538: 4807}, - {581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 15: 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 535: 581, 581, 581, 540: 581, 542: 581, 581, 581, 551: 581, 581, 554: 581, 557: 581, 581, 570: 581, 614: 581, 701: 581, 714: 581, 581}, - {538: 4809}, - {582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 15: 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 535: 582, 582, 582, 540: 582, 542: 582, 582, 582, 551: 582, 582, 554: 582, 557: 582, 582, 570: 582, 614: 582, 701: 582, 714: 582, 582}, + {564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 15: 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 535: 564, 564, 564, 540: 564, 542: 564, 564, 564, 551: 564, 564, 554: 564, 557: 564, 564, 571: 564, 613: 564, 660: 564, 714: 564, 564}, + {563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 15: 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 535: 563, 563, 563, 540: 563, 542: 563, 563, 563, 551: 563, 563, 554: 563, 557: 563, 563, 571: 563, 613: 563, 660: 563, 714: 563, 563}, + {562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 15: 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 535: 562, 562, 562, 540: 562, 542: 562, 562, 562, 551: 562, 562, 554: 562, 557: 562, 562, 571: 562, 613: 562, 660: 562, 714: 562, 562}, + {561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 15: 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 535: 561, 561, 561, 540: 561, 542: 561, 561, 561, 551: 561, 561, 554: 561, 557: 561, 561, 571: 561, 613: 561, 660: 561, 714: 561, 561}, + {538: 4816}, // 1940 - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 4811, 3067, 3068, 3066}, - {548: 4812}, - {646: 4813}, - {538: 3607, 553: 3598, 564: 3602, 634: 3597, 3599, 641: 3601, 3600, 3605, 645: 3606, 652: 3604, 783: 4814, 785: 3603}, - {118: 3789, 127: 3797, 133: 3785, 137: 3782, 3784, 3781, 3783, 3787, 3788, 3793, 3792, 3791, 3795, 3796, 3790, 3794, 3786, 599: 3779, 3776, 3778, 3777, 3773, 3775, 3774, 3771, 3772, 3770, 3780, 892: 3769, 907: 4815}, + {588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 15: 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 535: 588, 588, 588, 540: 588, 542: 588, 588, 588, 551: 588, 588, 554: 588, 557: 588, 588, 571: 588, 613: 588, 660: 588, 714: 588, 588}, + {538: 4818}, + {589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 15: 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 535: 589, 589, 589, 540: 589, 542: 589, 589, 589, 551: 589, 589, 554: 589, 557: 589, 589, 571: 589, 613: 589, 660: 589, 714: 589, 589}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 4820, 3072, 3073, 3071}, + {548: 4821}, // 1945 - {583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 15: 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 535: 583, 583, 583, 540: 583, 542: 583, 583, 583, 551: 583, 583, 554: 583, 557: 583, 583, 570: 583, 614: 583, 701: 583, 714: 583, 583}, - {538: 4818, 1173: 4817}, - {584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 15: 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 535: 584, 584, 584, 540: 584, 542: 584, 584, 584, 551: 584, 584, 554: 584, 557: 584, 584, 570: 584, 614: 584, 701: 584, 714: 584, 584}, - {148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 15: 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 535: 148, 148, 148, 540: 148, 542: 148, 148, 148, 551: 148, 148, 554: 148, 557: 148, 148, 560: 148, 570: 148, 614: 148, 701: 148, 714: 148, 148}, - {536: 4820}, + {646: 4822}, + {538: 3612, 553: 3603, 567: 3607, 634: 3602, 3604, 641: 3606, 3605, 3610, 645: 3611, 652: 3609, 783: 4823, 785: 3608}, + {118: 3794, 127: 3802, 134: 3790, 138: 3787, 140: 3789, 3786, 3788, 3792, 3793, 3798, 3797, 3796, 3800, 3801, 3795, 3799, 3791, 599: 3784, 3781, 3783, 3782, 3778, 3780, 3779, 3776, 3777, 3775, 3785, 892: 3774, 907: 4824}, + {590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 15: 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 535: 590, 590, 590, 540: 590, 542: 590, 590, 590, 551: 590, 590, 554: 590, 557: 590, 590, 571: 590, 613: 590, 660: 590, 714: 590, 590}, + {538: 4827, 1175: 4826}, // 1950 - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 759, 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 3949, 3067, 3068, 3066, 810: 3950, 890: 4821, 1299: 4822}, - {758, 758, 9: 3952, 57: 758, 537: 758}, - {57: 4823}, - {585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 15: 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 535: 585, 585, 585, 540: 585, 542: 585, 585, 585, 551: 585, 585, 554: 585, 557: 585, 585, 570: 585, 614: 585, 701: 585, 714: 585, 585}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 538: 3758, 553: 4825, 777: 3759, 3067, 3068, 3066, 811: 4826}, + {591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 15: 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 535: 591, 591, 591, 540: 591, 542: 591, 591, 591, 551: 591, 591, 554: 591, 557: 591, 591, 571: 591, 613: 591, 660: 591, 714: 591, 591}, + {148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 15: 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 535: 148, 148, 148, 540: 148, 542: 148, 148, 148, 551: 148, 148, 554: 148, 557: 148, 148, 561: 148, 571: 148, 613: 148, 660: 148, 714: 148, 148}, + {536: 4829}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 765, 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 565: 3955, 777: 3954, 3072, 3073, 3071, 810: 3956, 889: 4830, 1298: 4831}, + {764, 764, 9: 3958, 57: 764, 537: 764}, // 1955 - {587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 15: 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 535: 587, 587, 587, 540: 587, 542: 587, 587, 587, 551: 587, 587, 554: 587, 557: 587, 587, 570: 587, 614: 587, 701: 587, 714: 587, 587}, - {586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 15: 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 535: 586, 586, 586, 540: 586, 542: 586, 586, 586, 551: 586, 586, 554: 586, 557: 586, 586, 570: 586, 614: 586, 701: 586, 714: 586, 586}, - {540: 4829, 564: 3053, 805: 3888, 817: 4830, 1292: 4828}, - {590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 15: 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 535: 590, 590, 590, 540: 590, 542: 590, 590, 590, 551: 590, 590, 554: 590, 557: 590, 590, 570: 590, 614: 590, 701: 590, 714: 590, 590}, - {578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 15: 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 535: 578, 578, 578, 540: 578, 542: 578, 578, 578, 551: 578, 578, 554: 578, 557: 578, 578, 570: 578, 614: 578, 701: 578, 714: 578, 578}, + {57: 4832}, + {592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 15: 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 535: 592, 592, 592, 540: 592, 542: 592, 592, 592, 551: 592, 592, 554: 592, 557: 592, 592, 571: 592, 613: 592, 660: 592, 714: 592, 592}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 538: 3763, 553: 4834, 777: 3764, 3072, 3073, 3071, 811: 4835}, + {594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 15: 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 535: 594, 594, 594, 540: 594, 542: 594, 594, 594, 551: 594, 594, 554: 594, 557: 594, 594, 571: 594, 613: 594, 660: 594, 714: 594, 594}, + {593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 15: 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 535: 593, 593, 593, 540: 593, 542: 593, 593, 593, 551: 593, 593, 554: 593, 557: 593, 593, 571: 593, 613: 593, 660: 593, 714: 593, 593}, // 1960 - {577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 15: 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 535: 577, 577, 577, 540: 577, 542: 577, 577, 577, 551: 577, 577, 554: 577, 557: 577, 577, 570: 577, 614: 577, 701: 577, 714: 577, 577}, - {564: 3053, 805: 3888, 817: 4832}, - {591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 15: 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 535: 591, 591, 591, 540: 591, 542: 591, 591, 591, 551: 591, 591, 554: 591, 557: 591, 591, 570: 591, 614: 591, 701: 591, 714: 591, 591}, - {564: 3053, 805: 3888, 817: 4834}, - {592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 15: 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 535: 592, 592, 592, 540: 592, 542: 592, 592, 592, 551: 592, 592, 554: 592, 557: 592, 592, 570: 592, 614: 592, 701: 592, 714: 592, 592}, + {540: 4838, 567: 3058, 805: 3893, 820: 4839, 1291: 4837}, + {597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 15: 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 535: 597, 597, 597, 540: 597, 542: 597, 597, 597, 551: 597, 597, 554: 597, 557: 597, 597, 571: 597, 613: 597, 660: 597, 714: 597, 597}, + {585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 15: 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 535: 585, 585, 585, 540: 585, 542: 585, 585, 585, 551: 585, 585, 554: 585, 557: 585, 585, 571: 585, 613: 585, 660: 585, 714: 585, 585}, + {584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 15: 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 535: 584, 584, 584, 540: 584, 542: 584, 584, 584, 551: 584, 584, 554: 584, 557: 584, 584, 571: 584, 613: 584, 660: 584, 714: 584, 584}, + {567: 3058, 805: 3893, 820: 4841}, // 1965 - {538: 4836}, - {593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 15: 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 535: 593, 593, 593, 540: 593, 542: 593, 593, 593, 551: 593, 593, 554: 593, 557: 593, 593, 570: 593, 614: 593, 701: 593, 714: 593, 593}, - {538: 4838}, - {594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 15: 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 535: 594, 594, 594, 540: 594, 542: 594, 594, 594, 551: 594, 594, 554: 594, 557: 594, 594, 570: 594, 614: 594, 701: 594, 714: 594, 594}, - {564: 4109, 641: 4111, 4110, 922: 4840}, + {598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 15: 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 535: 598, 598, 598, 540: 598, 542: 598, 598, 598, 551: 598, 598, 554: 598, 557: 598, 598, 571: 598, 613: 598, 660: 598, 714: 598, 598}, + {567: 3058, 805: 3893, 820: 4843}, + {599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 15: 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 535: 599, 599, 599, 540: 599, 542: 599, 599, 599, 551: 599, 599, 554: 599, 557: 599, 599, 571: 599, 613: 599, 660: 599, 714: 599, 599}, + {538: 4845}, + {600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 15: 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 535: 600, 600, 600, 540: 600, 542: 600, 600, 600, 551: 600, 600, 554: 600, 557: 600, 600, 571: 600, 613: 600, 660: 600, 714: 600, 600}, // 1970 - {595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 15: 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 535: 595, 595, 595, 540: 595, 542: 595, 595, 595, 551: 595, 595, 554: 595, 557: 595, 595, 570: 595, 614: 595, 701: 595, 714: 595, 595}, - {564: 3053, 805: 3888, 817: 4842}, - {596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 15: 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 535: 596, 596, 596, 540: 596, 542: 596, 596, 596, 551: 596, 596, 554: 596, 557: 596, 596, 570: 596, 614: 596, 701: 596, 714: 596, 596}, - {564: 3053, 805: 3888, 817: 4844}, - {597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 15: 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 535: 597, 597, 597, 540: 597, 542: 597, 597, 597, 551: 597, 597, 554: 597, 557: 597, 597, 570: 597, 614: 597, 701: 597, 714: 597, 597}, + {538: 4847}, + {601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 15: 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 535: 601, 601, 601, 540: 601, 542: 601, 601, 601, 551: 601, 601, 554: 601, 557: 601, 601, 571: 601, 613: 601, 660: 601, 714: 601, 601}, + {567: 4117, 641: 4119, 4118, 924: 4849}, + {602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 15: 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 535: 602, 602, 602, 540: 602, 542: 602, 602, 602, 551: 602, 602, 554: 602, 557: 602, 602, 571: 602, 613: 602, 660: 602, 714: 602, 602}, + {567: 3058, 805: 3893, 820: 4851}, // 1975 - {540: 4847, 564: 3053, 805: 3888, 817: 4846}, - {599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 15: 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 535: 599, 599, 599, 540: 599, 542: 599, 599, 599, 551: 599, 599, 554: 599, 557: 599, 599, 570: 599, 614: 599, 701: 599, 714: 599, 599}, - {598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 15: 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 535: 598, 598, 598, 540: 598, 542: 598, 598, 598, 551: 598, 598, 554: 598, 557: 598, 598, 570: 598, 614: 598, 701: 598, 714: 598, 598}, - {540: 4850, 564: 3053, 805: 3888, 817: 4849}, - {601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 15: 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 535: 601, 601, 601, 540: 601, 542: 601, 601, 601, 551: 601, 601, 554: 601, 557: 601, 601, 570: 601, 614: 601, 701: 601, 714: 601, 601}, + {603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 15: 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 535: 603, 603, 603, 540: 603, 542: 603, 603, 603, 551: 603, 603, 554: 603, 557: 603, 603, 571: 603, 613: 603, 660: 603, 714: 603, 603}, + {567: 3058, 805: 3893, 820: 4853}, + {604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 15: 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 535: 604, 604, 604, 540: 604, 542: 604, 604, 604, 551: 604, 604, 554: 604, 557: 604, 604, 571: 604, 613: 604, 660: 604, 714: 604, 604}, + {540: 4856, 567: 3058, 805: 3893, 820: 4855}, + {606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 15: 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 535: 606, 606, 606, 540: 606, 542: 606, 606, 606, 551: 606, 606, 554: 606, 557: 606, 606, 571: 606, 613: 606, 660: 606, 714: 606, 606}, // 1980 - {600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 15: 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 535: 600, 600, 600, 540: 600, 542: 600, 600, 600, 551: 600, 600, 554: 600, 557: 600, 600, 570: 600, 614: 600, 701: 600, 714: 600, 600}, - {540: 4829, 564: 3053, 805: 3888, 817: 4830, 1292: 4852}, - {602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 15: 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 535: 602, 602, 602, 540: 602, 542: 602, 602, 602, 551: 602, 602, 554: 602, 557: 602, 602, 570: 602, 614: 602, 701: 602, 714: 602, 602}, - {564: 3053, 805: 3888, 817: 4854}, - {604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 15: 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 535: 604, 604, 604, 540: 604, 542: 604, 604, 604, 551: 604, 604, 554: 604, 557: 604, 604, 570: 604, 614: 604, 701: 604, 714: 604, 604}, + {605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 15: 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 535: 605, 605, 605, 540: 605, 542: 605, 605, 605, 551: 605, 605, 554: 605, 557: 605, 605, 571: 605, 613: 605, 660: 605, 714: 605, 605}, + {540: 4859, 567: 3058, 805: 3893, 820: 4858}, + {608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 15: 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 535: 608, 608, 608, 540: 608, 542: 608, 608, 608, 551: 608, 608, 554: 608, 557: 608, 608, 571: 608, 613: 608, 660: 608, 714: 608, 608}, + {607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 15: 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 535: 607, 607, 607, 540: 607, 542: 607, 607, 607, 551: 607, 607, 554: 607, 557: 607, 607, 571: 607, 613: 607, 660: 607, 714: 607, 607}, + {540: 4838, 567: 3058, 805: 3893, 820: 4839, 1291: 4861}, // 1985 - {564: 3053, 805: 3888, 817: 4856}, - {605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 15: 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 535: 605, 605, 605, 540: 605, 542: 605, 605, 605, 551: 605, 605, 554: 605, 557: 605, 605, 570: 605, 614: 605, 701: 605, 714: 605, 605}, - {538: 4858}, - {606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 15: 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 535: 606, 606, 606, 540: 606, 542: 606, 606, 606, 551: 606, 606, 554: 606, 557: 606, 606, 570: 606, 614: 606, 701: 606, 714: 606, 606}, - {538: 4860}, + {609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 15: 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 535: 609, 609, 609, 540: 609, 542: 609, 609, 609, 551: 609, 609, 554: 609, 557: 609, 609, 571: 609, 613: 609, 660: 609, 714: 609, 609}, + {567: 3058, 805: 3893, 820: 4863}, + {611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 15: 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 535: 611, 611, 611, 540: 611, 542: 611, 611, 611, 551: 611, 611, 554: 611, 557: 611, 611, 571: 611, 613: 611, 660: 611, 714: 611, 611}, + {567: 3058, 805: 3893, 820: 4865}, + {612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 15: 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 535: 612, 612, 612, 540: 612, 542: 612, 612, 612, 551: 612, 612, 554: 612, 557: 612, 612, 571: 612, 613: 612, 660: 612, 714: 612, 612}, // 1990 - {607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 15: 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 535: 607, 607, 607, 540: 607, 542: 607, 607, 607, 551: 607, 607, 554: 607, 557: 607, 607, 570: 607, 614: 607, 701: 607, 714: 607, 607}, - {564: 3053, 805: 3888, 817: 4862}, - {608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 15: 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 535: 608, 608, 608, 540: 608, 542: 608, 608, 608, 551: 608, 608, 554: 608, 557: 608, 608, 570: 608, 614: 608, 701: 608, 714: 608, 608}, - {564: 3053, 805: 3888, 817: 4864}, - {609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 15: 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 535: 609, 609, 609, 540: 609, 542: 609, 609, 609, 551: 609, 609, 554: 609, 557: 609, 609, 570: 609, 614: 609, 701: 609, 714: 609, 609}, + {538: 4867}, + {613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 15: 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 535: 613, 613, 613, 540: 613, 542: 613, 613, 613, 551: 613, 613, 554: 613, 557: 613, 613, 571: 613, 613: 613, 660: 613, 714: 613, 613}, + {538: 4869}, + {614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 15: 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 535: 614, 614, 614, 540: 614, 542: 614, 614, 614, 551: 614, 614, 554: 614, 557: 614, 614, 571: 614, 613: 614, 660: 614, 714: 614, 614}, + {567: 3058, 805: 3893, 820: 4871}, // 1995 - {538: 4866}, - {610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 15: 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 535: 610, 610, 610, 540: 610, 542: 610, 610, 610, 551: 610, 610, 554: 610, 557: 610, 610, 570: 610, 614: 610, 701: 610, 714: 610, 610}, - {564: 3053, 805: 3888, 817: 4868}, - {611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 15: 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 535: 611, 611, 611, 540: 611, 542: 611, 611, 611, 551: 611, 611, 554: 611, 557: 611, 611, 570: 611, 614: 611, 701: 611, 714: 611, 611}, - {564: 3053, 805: 3888, 817: 4870}, + {615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 15: 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 535: 615, 615, 615, 540: 615, 542: 615, 615, 615, 551: 615, 615, 554: 615, 557: 615, 615, 571: 615, 613: 615, 660: 615, 714: 615, 615}, + {567: 3058, 805: 3893, 820: 4873}, + {616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 15: 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 535: 616, 616, 616, 540: 616, 542: 616, 616, 616, 551: 616, 616, 554: 616, 557: 616, 616, 571: 616, 613: 616, 660: 616, 714: 616, 616}, + {538: 4875}, + {617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 15: 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 535: 617, 617, 617, 540: 617, 542: 617, 617, 617, 551: 617, 617, 554: 617, 557: 617, 617, 571: 617, 613: 617, 660: 617, 714: 617, 617}, // 2000 - {613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 15: 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 535: 613, 613, 613, 540: 613, 542: 613, 613, 613, 551: 613, 613, 554: 613, 557: 613, 613, 570: 613, 614: 613, 701: 613, 714: 613, 613}, - {561: 4610, 564: 2329, 808: 4875}, - {561: 4610, 564: 2329, 808: 4873}, - {564: 3053, 805: 3888, 817: 4874}, - {612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 15: 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 535: 612, 612, 612, 540: 612, 542: 612, 612, 612, 551: 612, 612, 554: 612, 557: 612, 612, 570: 612, 614: 612, 701: 612, 714: 612, 612}, + {567: 3058, 805: 3893, 820: 4877}, + {618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 15: 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 535: 618, 618, 618, 540: 618, 542: 618, 618, 618, 551: 618, 618, 554: 618, 557: 618, 618, 571: 618, 613: 618, 660: 618, 714: 618, 618}, + {567: 3058, 805: 3893, 820: 4879}, + {620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 15: 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 535: 620, 620, 620, 540: 620, 542: 620, 620, 620, 551: 620, 620, 554: 620, 557: 620, 620, 571: 620, 613: 620, 660: 620, 714: 620, 620}, + {562: 4618, 567: 2335, 808: 4884}, // 2005 - {564: 3053, 805: 3888, 817: 4876}, - {614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 15: 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 535: 614, 614, 614, 540: 614, 542: 614, 614, 614, 551: 614, 614, 554: 614, 557: 614, 614, 570: 614, 614: 614, 701: 614, 714: 614, 614}, - {2: 2329, 2329, 2329, 2329, 2329, 2329, 2329, 10: 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 58: 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 538: 2329, 561: 4610, 591: 2329, 808: 4881}, - {2: 2329, 2329, 2329, 2329, 2329, 2329, 2329, 10: 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 58: 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 538: 2329, 561: 4610, 591: 2329, 808: 4879}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 538: 3758, 591: 3757, 777: 3759, 3067, 3068, 3066, 811: 3756, 980: 4880}, + {562: 4618, 567: 2335, 808: 4882}, + {567: 3058, 805: 3893, 820: 4883}, + {619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 15: 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 535: 619, 619, 619, 540: 619, 542: 619, 619, 619, 551: 619, 619, 554: 619, 557: 619, 619, 571: 619, 613: 619, 660: 619, 714: 619, 619}, + {567: 3058, 805: 3893, 820: 4885}, + {621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 15: 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 535: 621, 621, 621, 540: 621, 542: 621, 621, 621, 551: 621, 621, 554: 621, 557: 621, 621, 571: 621, 613: 621, 660: 621, 714: 621, 621}, // 2010 - {615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 15: 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 535: 615, 615, 615, 540: 615, 542: 615, 615, 615, 551: 615, 615, 554: 615, 557: 615, 615, 570: 615, 614: 615, 701: 615, 714: 615, 615}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 538: 3758, 591: 4376, 777: 3759, 3067, 3068, 3066, 811: 4375, 911: 4882}, - {616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 15: 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 535: 616, 616, 616, 540: 616, 542: 616, 616, 616, 551: 616, 616, 554: 616, 557: 616, 616, 570: 616, 614: 616, 701: 616, 714: 616, 616}, - {564: 3053, 805: 3888, 817: 4884}, - {2404, 2404, 2404, 2404, 2404, 2404, 2404, 2404, 2404, 2404, 15: 2404, 2404, 2404, 2404, 2404, 2404, 2404, 2404, 2404, 2404, 2404, 2404, 2404, 2404, 2404, 2404, 2404, 2404, 2404, 2404, 2404, 2404, 2404, 2404, 2404, 2404, 2404, 2404, 2404, 2404, 2404, 2404, 2404, 2404, 2404, 2404, 57: 2404, 535: 2404, 2404, 2404, 540: 2404, 542: 2404, 2404, 2404, 551: 2404, 2404, 554: 2404, 557: 2404, 2404, 570: 2404, 614: 2404, 701: 2404, 714: 2404, 2404}, + {2: 2335, 2335, 2335, 2335, 2335, 2335, 2335, 10: 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 58: 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 538: 2335, 562: 4618, 591: 2335, 808: 4890}, + {2: 2335, 2335, 2335, 2335, 2335, 2335, 2335, 10: 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 58: 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 538: 2335, 562: 4618, 591: 2335, 808: 4888}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 538: 3763, 591: 3762, 777: 3764, 3072, 3073, 3071, 811: 3761, 981: 4889}, + {622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 15: 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 535: 622, 622, 622, 540: 622, 542: 622, 622, 622, 551: 622, 622, 554: 622, 557: 622, 622, 571: 622, 613: 622, 660: 622, 714: 622, 622}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 538: 3763, 591: 4384, 777: 3764, 3072, 3073, 3071, 811: 4383, 911: 4891}, // 2015 - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 4886, 3067, 3068, 3066}, - {2405, 2405, 2405, 2405, 2405, 2405, 2405, 2405, 2405, 2405, 15: 2405, 2405, 2405, 2405, 2405, 2405, 2405, 2405, 2405, 2405, 2405, 2405, 2405, 2405, 2405, 2405, 2405, 2405, 2405, 2405, 2405, 2405, 2405, 2405, 2405, 2405, 2405, 2405, 2405, 2405, 2405, 2405, 2405, 2405, 2405, 2405, 57: 2405, 535: 2405, 2405, 2405, 540: 2405, 542: 2405, 2405, 2405, 551: 2405, 2405, 554: 2405, 557: 2405, 2405, 570: 2405, 614: 2405, 701: 2405, 714: 2405, 2405}, - {564: 3053, 805: 3888, 817: 4888}, - {2406, 2406, 2406, 2406, 2406, 2406, 2406, 2406, 2406, 2406, 15: 2406, 2406, 2406, 2406, 2406, 2406, 2406, 2406, 2406, 2406, 2406, 2406, 2406, 2406, 2406, 2406, 2406, 2406, 2406, 2406, 2406, 2406, 2406, 2406, 2406, 2406, 2406, 2406, 2406, 2406, 2406, 2406, 2406, 2406, 2406, 2406, 57: 2406, 535: 2406, 2406, 2406, 540: 2406, 542: 2406, 2406, 2406, 551: 2406, 2406, 554: 2406, 557: 2406, 2406, 570: 2406, 614: 2406, 701: 2406, 714: 2406, 2406}, - {564: 3053, 805: 3888, 817: 4890}, + {623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 15: 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 535: 623, 623, 623, 540: 623, 542: 623, 623, 623, 551: 623, 623, 554: 623, 557: 623, 623, 571: 623, 613: 623, 660: 623, 714: 623, 623}, + {567: 3058, 805: 3893, 820: 4893}, + {2410, 2410, 2410, 2410, 2410, 2410, 2410, 2410, 2410, 2410, 15: 2410, 2410, 2410, 2410, 2410, 2410, 2410, 2410, 2410, 2410, 2410, 2410, 2410, 2410, 2410, 2410, 2410, 2410, 2410, 2410, 2410, 2410, 2410, 2410, 2410, 2410, 2410, 2410, 2410, 2410, 2410, 2410, 2410, 2410, 2410, 2410, 57: 2410, 535: 2410, 2410, 2410, 540: 2410, 542: 2410, 2410, 2410, 551: 2410, 2410, 554: 2410, 557: 2410, 2410, 571: 2410, 613: 2410, 660: 2410, 714: 2410, 2410}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 4895, 3072, 3073, 3071}, + {2411, 2411, 2411, 2411, 2411, 2411, 2411, 2411, 2411, 2411, 15: 2411, 2411, 2411, 2411, 2411, 2411, 2411, 2411, 2411, 2411, 2411, 2411, 2411, 2411, 2411, 2411, 2411, 2411, 2411, 2411, 2411, 2411, 2411, 2411, 2411, 2411, 2411, 2411, 2411, 2411, 2411, 2411, 2411, 2411, 2411, 2411, 57: 2411, 535: 2411, 2411, 2411, 540: 2411, 542: 2411, 2411, 2411, 551: 2411, 2411, 554: 2411, 557: 2411, 2411, 571: 2411, 613: 2411, 660: 2411, 714: 2411, 2411}, // 2020 - {2407, 2407, 2407, 2407, 2407, 2407, 2407, 2407, 2407, 2407, 15: 2407, 2407, 2407, 2407, 2407, 2407, 2407, 2407, 2407, 2407, 2407, 2407, 2407, 2407, 2407, 2407, 2407, 2407, 2407, 2407, 2407, 2407, 2407, 2407, 2407, 2407, 2407, 2407, 2407, 2407, 2407, 2407, 2407, 2407, 2407, 2407, 57: 2407, 535: 2407, 2407, 2407, 540: 2407, 542: 2407, 2407, 2407, 551: 2407, 2407, 554: 2407, 557: 2407, 2407, 570: 2407, 614: 2407, 701: 2407, 714: 2407, 2407}, - {538: 2329, 561: 4610, 808: 4892}, - {538: 4893}, - {2408, 2408, 2408, 2408, 2408, 2408, 2408, 2408, 2408, 2408, 15: 2408, 2408, 2408, 2408, 2408, 2408, 2408, 2408, 2408, 2408, 2408, 2408, 2408, 2408, 2408, 2408, 2408, 2408, 2408, 2408, 2408, 2408, 2408, 2408, 2408, 2408, 2408, 2408, 2408, 2408, 2408, 2408, 2408, 2408, 2408, 2408, 57: 2408, 535: 2408, 2408, 2408, 540: 2408, 542: 2408, 2408, 2408, 551: 2408, 2408, 554: 2408, 557: 2408, 2408, 570: 2408, 614: 2408, 701: 2408, 714: 2408, 2408}, - {538: 2329, 561: 4610, 808: 4895}, + {567: 3058, 805: 3893, 820: 4897}, + {2412, 2412, 2412, 2412, 2412, 2412, 2412, 2412, 2412, 2412, 15: 2412, 2412, 2412, 2412, 2412, 2412, 2412, 2412, 2412, 2412, 2412, 2412, 2412, 2412, 2412, 2412, 2412, 2412, 2412, 2412, 2412, 2412, 2412, 2412, 2412, 2412, 2412, 2412, 2412, 2412, 2412, 2412, 2412, 2412, 2412, 2412, 57: 2412, 535: 2412, 2412, 2412, 540: 2412, 542: 2412, 2412, 2412, 551: 2412, 2412, 554: 2412, 557: 2412, 2412, 571: 2412, 613: 2412, 660: 2412, 714: 2412, 2412}, + {567: 3058, 805: 3893, 820: 4899}, + {2413, 2413, 2413, 2413, 2413, 2413, 2413, 2413, 2413, 2413, 15: 2413, 2413, 2413, 2413, 2413, 2413, 2413, 2413, 2413, 2413, 2413, 2413, 2413, 2413, 2413, 2413, 2413, 2413, 2413, 2413, 2413, 2413, 2413, 2413, 2413, 2413, 2413, 2413, 2413, 2413, 2413, 2413, 2413, 2413, 2413, 2413, 57: 2413, 535: 2413, 2413, 2413, 540: 2413, 542: 2413, 2413, 2413, 551: 2413, 2413, 554: 2413, 557: 2413, 2413, 571: 2413, 613: 2413, 660: 2413, 714: 2413, 2413}, + {538: 2335, 562: 4618, 808: 4901}, // 2025 - {538: 4896}, - {2409, 2409, 2409, 2409, 2409, 2409, 2409, 2409, 2409, 2409, 15: 2409, 2409, 2409, 2409, 2409, 2409, 2409, 2409, 2409, 2409, 2409, 2409, 2409, 2409, 2409, 2409, 2409, 2409, 2409, 2409, 2409, 2409, 2409, 2409, 2409, 2409, 2409, 2409, 2409, 2409, 2409, 2409, 2409, 2409, 2409, 2409, 57: 2409, 535: 2409, 2409, 2409, 540: 2409, 542: 2409, 2409, 2409, 551: 2409, 2409, 554: 2409, 557: 2409, 2409, 570: 2409, 614: 2409, 701: 2409, 714: 2409, 2409}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 538: 3758, 777: 3759, 3067, 3068, 3066, 811: 4898}, - {2410, 2410, 2410, 2410, 2410, 2410, 2410, 2410, 2410, 2410, 15: 2410, 2410, 2410, 2410, 2410, 2410, 2410, 2410, 2410, 2410, 2410, 2410, 2410, 2410, 2410, 2410, 2410, 2410, 2410, 2410, 2410, 2410, 2410, 2410, 2410, 2410, 2410, 2410, 2410, 2410, 2410, 2410, 2410, 2410, 2410, 2410, 57: 2410, 535: 2410, 2410, 2410, 540: 2410, 542: 2410, 2410, 2410, 551: 2410, 2410, 554: 2410, 557: 2410, 2410, 570: 2410, 614: 2410, 701: 2410, 714: 2410, 2410}, - {2: 2329, 2329, 2329, 2329, 2329, 2329, 2329, 10: 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 58: 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 538: 2329, 561: 4610, 808: 4902}, + {538: 4902}, + {2414, 2414, 2414, 2414, 2414, 2414, 2414, 2414, 2414, 2414, 15: 2414, 2414, 2414, 2414, 2414, 2414, 2414, 2414, 2414, 2414, 2414, 2414, 2414, 2414, 2414, 2414, 2414, 2414, 2414, 2414, 2414, 2414, 2414, 2414, 2414, 2414, 2414, 2414, 2414, 2414, 2414, 2414, 2414, 2414, 2414, 2414, 57: 2414, 535: 2414, 2414, 2414, 540: 2414, 542: 2414, 2414, 2414, 551: 2414, 2414, 554: 2414, 557: 2414, 2414, 571: 2414, 613: 2414, 660: 2414, 714: 2414, 2414}, + {538: 2335, 562: 4618, 808: 4904}, + {538: 4905}, + {2415, 2415, 2415, 2415, 2415, 2415, 2415, 2415, 2415, 2415, 15: 2415, 2415, 2415, 2415, 2415, 2415, 2415, 2415, 2415, 2415, 2415, 2415, 2415, 2415, 2415, 2415, 2415, 2415, 2415, 2415, 2415, 2415, 2415, 2415, 2415, 2415, 2415, 2415, 2415, 2415, 2415, 2415, 2415, 2415, 2415, 2415, 57: 2415, 535: 2415, 2415, 2415, 540: 2415, 542: 2415, 2415, 2415, 551: 2415, 2415, 554: 2415, 557: 2415, 2415, 571: 2415, 613: 2415, 660: 2415, 714: 2415, 2415}, // 2030 - {589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 15: 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 535: 589, 589, 589, 540: 589, 542: 589, 589, 589, 551: 589, 589, 554: 589, 557: 589, 589, 570: 589, 614: 589, 701: 589, 714: 589, 589}, - {588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 15: 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 535: 588, 588, 588, 540: 588, 542: 588, 588, 588, 551: 588, 588, 554: 588, 557: 588, 588, 570: 588, 614: 588, 701: 588, 714: 588, 588}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 538: 3758, 777: 3759, 3067, 3068, 3066, 811: 4903}, - {2411, 2411, 2411, 2411, 2411, 2411, 2411, 2411, 2411, 2411, 15: 2411, 2411, 2411, 2411, 2411, 2411, 2411, 2411, 2411, 2411, 2411, 2411, 2411, 2411, 2411, 2411, 2411, 2411, 2411, 2411, 2411, 2411, 2411, 2411, 2411, 2411, 2411, 2411, 2411, 2411, 2411, 2411, 2411, 2411, 2411, 2411, 57: 2411, 535: 2411, 2411, 2411, 540: 2411, 542: 2411, 2411, 2411, 551: 2411, 2411, 554: 2411, 557: 2411, 2411, 570: 2411, 614: 2411, 701: 2411, 714: 2411, 2411}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 538: 3758, 777: 3759, 3067, 3068, 3066, 811: 4905}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 538: 3763, 777: 3764, 3072, 3073, 3071, 811: 4907}, + {2416, 2416, 2416, 2416, 2416, 2416, 2416, 2416, 2416, 2416, 15: 2416, 2416, 2416, 2416, 2416, 2416, 2416, 2416, 2416, 2416, 2416, 2416, 2416, 2416, 2416, 2416, 2416, 2416, 2416, 2416, 2416, 2416, 2416, 2416, 2416, 2416, 2416, 2416, 2416, 2416, 2416, 2416, 2416, 2416, 2416, 2416, 57: 2416, 535: 2416, 2416, 2416, 540: 2416, 542: 2416, 2416, 2416, 551: 2416, 2416, 554: 2416, 557: 2416, 2416, 571: 2416, 613: 2416, 660: 2416, 714: 2416, 2416}, + {2: 2335, 2335, 2335, 2335, 2335, 2335, 2335, 10: 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 58: 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 538: 2335, 562: 4618, 808: 4911}, + {596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 15: 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 535: 596, 596, 596, 540: 596, 542: 596, 596, 596, 551: 596, 596, 554: 596, 557: 596, 596, 571: 596, 613: 596, 660: 596, 714: 596, 596}, + {595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 15: 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 535: 595, 595, 595, 540: 595, 542: 595, 595, 595, 551: 595, 595, 554: 595, 557: 595, 595, 571: 595, 613: 595, 660: 595, 714: 595, 595}, // 2035 - {2412, 2412, 2412, 2412, 2412, 2412, 2412, 2412, 2412, 2412, 15: 2412, 2412, 2412, 2412, 2412, 2412, 2412, 2412, 2412, 2412, 2412, 2412, 2412, 2412, 2412, 2412, 2412, 2412, 2412, 2412, 2412, 2412, 2412, 2412, 2412, 2412, 2412, 2412, 2412, 2412, 2412, 2412, 2412, 2412, 2412, 2412, 57: 2412, 535: 2412, 2412, 2412, 540: 2412, 542: 2412, 2412, 2412, 551: 2412, 2412, 554: 2412, 557: 2412, 2412, 570: 2412, 614: 2412, 701: 2412, 714: 2412, 2412}, - {538: 4907}, - {2413, 2413, 2413, 2413, 2413, 2413, 2413, 2413, 2413, 2413, 15: 2413, 2413, 2413, 2413, 2413, 2413, 2413, 2413, 2413, 2413, 2413, 2413, 2413, 2413, 2413, 2413, 2413, 2413, 2413, 2413, 2413, 2413, 2413, 2413, 2413, 2413, 2413, 2413, 2413, 2413, 2413, 2413, 2413, 2413, 2413, 2413, 57: 2413, 535: 2413, 2413, 2413, 540: 2413, 542: 2413, 2413, 2413, 551: 2413, 2413, 554: 2413, 557: 2413, 2413, 570: 2413, 614: 2413, 701: 2413, 714: 2413, 2413}, - {6: 4747, 4749, 580, 10: 4716, 15: 4766, 2459, 4764, 4703, 4768, 4755, 4784, 4751, 4748, 4750, 4753, 4754, 4756, 4763, 580, 4774, 4775, 4785, 4761, 4762, 4767, 4769, 4781, 4780, 4789, 4782, 4779, 4772, 4777, 4778, 4771, 4773, 4776, 4765, 4786, 4787, 89: 4718, 4739, 4740, 102: 4741, 210: 4721, 234: 4710, 249: 4704, 253: 4725, 256: 4726, 270: 4720, 276: 4736, 290: 4714, 299: 4722, 305: 4717, 324: 4727, 332: 4723, 339: 4737, 4738, 344: 4705, 537: 4735, 540: 4746, 543: 2459, 4783, 558: 2459, 560: 4707, 567: 4742, 569: 4724, 4734, 651: 4708, 709: 4713, 714: 2459, 4752, 729: 4729, 732: 4715, 734: 4743, 772: 4728, 4730, 775: 4709, 4719, 871: 4757, 897: 4759, 916: 4758, 937: 4760, 943: 4770, 947: 4788, 978: 4733, 992: 4731, 1026: 4706, 1034: 4711, 1116: 4909, 1291: 4712, 1315: 4732}, - {2704, 2704, 2704, 2704, 2704, 2704, 9: 2704, 551: 2704}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 538: 3763, 777: 3764, 3072, 3073, 3071, 811: 4912}, + {2417, 2417, 2417, 2417, 2417, 2417, 2417, 2417, 2417, 2417, 15: 2417, 2417, 2417, 2417, 2417, 2417, 2417, 2417, 2417, 2417, 2417, 2417, 2417, 2417, 2417, 2417, 2417, 2417, 2417, 2417, 2417, 2417, 2417, 2417, 2417, 2417, 2417, 2417, 2417, 2417, 2417, 2417, 2417, 2417, 2417, 2417, 57: 2417, 535: 2417, 2417, 2417, 540: 2417, 542: 2417, 2417, 2417, 551: 2417, 2417, 554: 2417, 557: 2417, 2417, 571: 2417, 613: 2417, 660: 2417, 714: 2417, 2417}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 538: 3763, 777: 3764, 3072, 3073, 3071, 811: 4914}, + {2418, 2418, 2418, 2418, 2418, 2418, 2418, 2418, 2418, 2418, 15: 2418, 2418, 2418, 2418, 2418, 2418, 2418, 2418, 2418, 2418, 2418, 2418, 2418, 2418, 2418, 2418, 2418, 2418, 2418, 2418, 2418, 2418, 2418, 2418, 2418, 2418, 2418, 2418, 2418, 2418, 2418, 2418, 2418, 2418, 2418, 2418, 57: 2418, 535: 2418, 2418, 2418, 540: 2418, 542: 2418, 2418, 2418, 551: 2418, 2418, 554: 2418, 557: 2418, 2418, 571: 2418, 613: 2418, 660: 2418, 714: 2418, 2418}, + {538: 4916}, // 2040 - {2718, 2718, 2718, 2718, 2718, 2718, 9: 2718, 551: 2718}, - {2717, 2717, 2717, 2717, 2717, 2717, 9: 2717, 551: 2717}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 540: 4913, 777: 4914, 3067, 3068, 3066}, - {2720, 2720, 2720, 2720, 2720, 2720, 9: 2720, 102: 2720, 551: 2720}, - {2719, 2719, 2719, 2719, 2719, 2719, 9: 2719, 102: 2719, 551: 2719}, + {2419, 2419, 2419, 2419, 2419, 2419, 2419, 2419, 2419, 2419, 15: 2419, 2419, 2419, 2419, 2419, 2419, 2419, 2419, 2419, 2419, 2419, 2419, 2419, 2419, 2419, 2419, 2419, 2419, 2419, 2419, 2419, 2419, 2419, 2419, 2419, 2419, 2419, 2419, 2419, 2419, 2419, 2419, 2419, 2419, 2419, 2419, 57: 2419, 535: 2419, 2419, 2419, 540: 2419, 542: 2419, 2419, 2419, 551: 2419, 2419, 554: 2419, 557: 2419, 2419, 571: 2419, 613: 2419, 660: 2419, 714: 2419, 2419}, + {6: 4756, 4758, 587, 10: 4725, 15: 4775, 2465, 4773, 4712, 4777, 4764, 4793, 4757, 4760, 4759, 4762, 4763, 4765, 4772, 587, 4783, 4784, 4794, 4770, 4771, 4776, 4778, 4790, 4789, 4798, 4791, 4788, 4781, 4786, 4787, 4780, 4782, 4785, 4774, 4795, 4796, 89: 4727, 4748, 4749, 102: 4750, 132: 4730, 234: 4719, 249: 4713, 253: 4734, 256: 4735, 270: 4729, 276: 4745, 291: 4723, 300: 4731, 306: 4726, 326: 4736, 333: 4732, 340: 4746, 4747, 346: 4714, 537: 4744, 540: 4755, 543: 2465, 4792, 558: 2465, 561: 4716, 568: 4751, 570: 4733, 4743, 651: 4717, 709: 4722, 714: 2465, 4761, 729: 4738, 732: 4724, 734: 4752, 772: 4737, 4728, 4739, 776: 4718, 871: 4766, 897: 4768, 918: 4767, 939: 4769, 945: 4779, 950: 4797, 979: 4742, 993: 4740, 1027: 4715, 1035: 4720, 1119: 4918, 1290: 4721, 1313: 4741}, + {2710, 2710, 2710, 2710, 2710, 2710, 9: 2710, 551: 2710}, + {2724, 2724, 2724, 2724, 2724, 2724, 9: 2724, 551: 2724}, + {2723, 2723, 2723, 2723, 2723, 2723, 9: 2723, 551: 2723}, // 2045 - {56: 4920, 293: 4917, 315: 4918, 317: 4919, 540: 4916}, - {2725, 2725, 2725, 2725, 2725, 2725, 9: 2725, 551: 2725, 567: 2725}, - {2724, 2724, 2724, 2724, 2724, 2724, 9: 2724, 551: 2724, 567: 2724}, - {2723, 2723, 2723, 2723, 2723, 2723, 9: 2723, 551: 2723, 567: 2723}, - {2722, 2722, 2722, 2722, 2722, 2722, 9: 2722, 551: 2722, 567: 2722}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 540: 4922, 777: 4923, 3072, 3073, 3071}, + {2726, 2726, 2726, 2726, 2726, 2726, 9: 2726, 102: 2726, 551: 2726}, + {2725, 2725, 2725, 2725, 2725, 2725, 9: 2725, 102: 2725, 551: 2725}, + {56: 4929, 294: 4926, 317: 4927, 319: 4928, 540: 4925}, + {2731, 2731, 2731, 2731, 2731, 2731, 9: 2731, 551: 2731, 568: 2731}, // 2050 - {2721, 2721, 2721, 2721, 2721, 2721, 9: 2721, 551: 2721, 567: 2721}, - {2743, 2743, 2743, 2743, 2743, 2743, 9: 2743, 551: 2743}, - {2744, 2744, 2744, 2744, 2744, 2744, 9: 2744, 551: 2744}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 4936, 3067, 3068, 3066}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 3949, 3067, 3068, 3066, 810: 4935}, - // 2055 - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 3949, 3067, 3068, 3066, 810: 4934}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 3949, 3067, 3068, 3066, 810: 4933}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 4930, 3067, 3068, 3066}, - {2: 2716, 2716, 2716, 2716, 2716, 2716, 2716, 10: 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 58: 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 2716, 536: 2716, 547: 2716, 563: 2716, 583: 2716}, - {2: 2715, 2715, 2715, 2715, 2715, 2715, 2715, 10: 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 58: 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 2715, 536: 2715, 547: 2715, 563: 2715, 583: 2715}, - // 2060 - {717: 4931}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 4932, 3067, 3068, 3066}, + {2730, 2730, 2730, 2730, 2730, 2730, 9: 2730, 551: 2730, 568: 2730}, + {2729, 2729, 2729, 2729, 2729, 2729, 9: 2729, 551: 2729, 568: 2729}, + {2728, 2728, 2728, 2728, 2728, 2728, 9: 2728, 551: 2728, 568: 2728}, + {2727, 2727, 2727, 2727, 2727, 2727, 9: 2727, 551: 2727, 568: 2727}, {2749, 2749, 2749, 2749, 2749, 2749, 9: 2749, 551: 2749}, + // 2055 {2750, 2750, 2750, 2750, 2750, 2750, 9: 2750, 551: 2750}, - {2751, 2751, 2751, 2751, 2751, 2751, 9: 2751, 551: 2751}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 4945, 3072, 3073, 3071}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 565: 3955, 777: 3954, 3072, 3073, 3071, 810: 4944}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 565: 3955, 777: 3954, 3072, 3073, 3071, 810: 4943}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 565: 3955, 777: 3954, 3072, 3073, 3071, 810: 4942}, + // 2060 + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 4939, 3072, 3073, 3071}, + {2: 2722, 2722, 2722, 2722, 2722, 2722, 2722, 10: 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 58: 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722, 536: 2722, 547: 2722, 563: 2722, 584: 2722}, + {2: 2721, 2721, 2721, 2721, 2721, 2721, 2721, 10: 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 58: 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 2721, 536: 2721, 547: 2721, 563: 2721, 584: 2721}, + {717: 4940}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 4941, 3072, 3073, 3071}, // 2065 - {2752, 2752, 2752, 2752, 2752, 2752, 9: 2752, 551: 2752}, - {717: 4937}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 4938, 3067, 3068, 3066}, - {2753, 2753, 2753, 2753, 2753, 2753, 9: 2753, 551: 2753}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 4046, 3067, 3068, 3066, 827: 4954}, + {2755, 2755, 2755, 2755, 2755, 2755, 9: 2755, 551: 2755}, + {2756, 2756, 2756, 2756, 2756, 2756, 9: 2756, 551: 2756}, + {2757, 2757, 2757, 2757, 2757, 2757, 9: 2757, 551: 2757}, + {2758, 2758, 2758, 2758, 2758, 2758, 9: 2758, 551: 2758}, + {717: 4946}, // 2070 - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 4949, 3067, 3068, 3066}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 4945, 3067, 3068, 3066}, - {2: 2711, 2711, 2711, 2711, 2711, 2711, 2711, 10: 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 58: 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 2711, 536: 2711, 583: 2711}, - {2: 625, 625, 625, 625, 625, 625, 625, 10: 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 58: 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625}, - {2: 624, 624, 624, 624, 624, 624, 624, 10: 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 58: 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 4947, 3072, 3073, 3071}, + {2759, 2759, 2759, 2759, 2759, 2759, 9: 2759, 551: 2759}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 4054, 3072, 3073, 3071, 828: 4963}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 4958, 3072, 3073, 3071}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 4954, 3072, 3073, 3071}, // 2075 - {106: 4948, 109: 4947, 965: 4946}, - {2738, 2738, 2738, 2738, 2738, 2738, 9: 2738, 551: 2738}, - {2105, 2105, 2105, 2105, 2105, 2105, 2105, 9: 2105, 19: 2105, 57: 2105, 102: 2105, 104: 2105, 2105, 2105, 2105, 109: 2105, 537: 2105, 547: 2105, 551: 2105, 567: 2105}, - {2104, 2104, 2104, 2104, 2104, 2104, 2104, 9: 2104, 19: 2104, 57: 2104, 102: 2104, 104: 2104, 2104, 2104, 2104, 109: 2104, 537: 2104, 547: 2104, 551: 2104, 567: 2104}, - {190: 4951, 539: 3834, 541: 3833, 921: 4952, 1050: 4950}, + {2: 2717, 2717, 2717, 2717, 2717, 2717, 2717, 10: 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 58: 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717, 536: 2717, 584: 2717}, + {2: 632, 632, 632, 632, 632, 632, 632, 10: 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 58: 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632}, + {2: 631, 631, 631, 631, 631, 631, 631, 10: 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 58: 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631}, + {106: 4957, 109: 4956, 967: 4955}, + {2744, 2744, 2744, 2744, 2744, 2744, 9: 2744, 551: 2744}, // 2080 - {2740, 2740, 2740, 2740, 2740, 2740, 9: 2740, 551: 2740}, - {2601, 2601, 2601, 2601, 2601, 2601, 2601, 2601, 2601, 2601, 2601, 2601, 2601, 2601, 2601, 57: 2601, 535: 2601, 539: 2601, 2601, 2601, 2601, 2601, 551: 2601, 553: 2601, 706: 2601, 708: 2601, 2601, 2601, 2601, 2601, 2601}, - {190: 4953}, - {2600, 2600, 2600, 2600, 2600, 2600, 2600, 2600, 2600, 2600, 2600, 2600, 2600, 2600, 2600, 57: 2600, 535: 2600, 539: 2600, 2600, 2600, 2600, 2600, 551: 2600, 553: 2600, 706: 2600, 708: 2600, 2600, 2600, 2600, 2600, 2600}, - {560: 4955, 732: 4956}, + {2114, 2114, 2114, 2114, 2114, 2114, 2114, 9: 2114, 19: 2114, 57: 2114, 102: 2114, 104: 2114, 2114, 2114, 2114, 109: 2114, 537: 2114, 547: 2114, 551: 2114, 568: 2114}, + {2113, 2113, 2113, 2113, 2113, 2113, 2113, 9: 2113, 19: 2113, 57: 2113, 102: 2113, 104: 2113, 2113, 2113, 2113, 109: 2113, 537: 2113, 547: 2113, 551: 2113, 568: 2113}, + {191: 4960, 539: 3839, 541: 3838, 923: 4961, 1051: 4959}, + {2746, 2746, 2746, 2746, 2746, 2746, 9: 2746, 551: 2746}, + {2607, 2607, 2607, 2607, 2607, 2607, 2607, 2607, 2607, 2607, 2607, 2607, 2607, 2607, 2607, 57: 2607, 535: 2607, 539: 2607, 2607, 2607, 2607, 2607, 551: 2607, 553: 2607, 706: 2607, 708: 2607, 2607, 2607, 2607, 2607, 2607}, // 2085 - {540: 4958}, - {540: 4957}, - {2754, 2754, 2754, 2754, 2754, 2754, 9: 2754, 551: 2754}, - {536: 4960, 538: 3607, 548: 4962, 4963, 553: 3598, 564: 3602, 634: 3597, 3599, 641: 3601, 3600, 3605, 645: 3606, 652: 3604, 783: 4961, 785: 3603, 1088: 4959}, - {2756, 2756, 2756, 2756, 2756, 2756, 9: 2756, 551: 2756}, + {191: 4962}, + {2606, 2606, 2606, 2606, 2606, 2606, 2606, 2606, 2606, 2606, 2606, 2606, 2606, 2606, 2606, 57: 2606, 535: 2606, 539: 2606, 2606, 2606, 2606, 2606, 551: 2606, 553: 2606, 706: 2606, 708: 2606, 2606, 2606, 2606, 2606, 2606}, + {561: 4964, 732: 4965}, + {540: 4967}, + {540: 4966}, // 2090 - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 4966}, - {2510, 2510, 2510, 2510, 2510, 2510, 2510, 2510, 2510, 2510, 2510, 2510, 2510, 2510, 2510, 57: 2510, 535: 2510, 539: 2510, 2510, 2510, 2510, 2510, 551: 2510, 553: 2510, 706: 2510, 708: 2510, 2510, 2510, 2510, 2510, 2510}, - {564: 4109, 641: 4111, 4110, 922: 4965}, - {564: 4109, 641: 4111, 4110, 922: 4964}, - {2508, 2508, 2508, 2508, 2508, 2508, 2508, 2508, 2508, 2508, 2508, 2508, 2508, 2508, 2508, 57: 2508, 535: 2508, 539: 2508, 2508, 2508, 2508, 2508, 551: 2508, 553: 2508, 706: 2508, 708: 2508, 2508, 2508, 2508, 2508, 2508}, + {2760, 2760, 2760, 2760, 2760, 2760, 9: 2760, 551: 2760}, + {536: 4969, 538: 3612, 548: 4971, 4972, 553: 3603, 567: 3607, 634: 3602, 3604, 641: 3606, 3605, 3610, 645: 3611, 652: 3609, 783: 4970, 785: 3608, 1090: 4968}, + {2762, 2762, 2762, 2762, 2762, 2762, 9: 2762, 551: 2762}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 4975}, + {2516, 2516, 2516, 2516, 2516, 2516, 2516, 2516, 2516, 2516, 2516, 2516, 2516, 2516, 2516, 57: 2516, 535: 2516, 539: 2516, 2516, 2516, 2516, 2516, 551: 2516, 553: 2516, 706: 2516, 708: 2516, 2516, 2516, 2516, 2516, 2516}, // 2095 - {2509, 2509, 2509, 2509, 2509, 2509, 2509, 2509, 2509, 2509, 2509, 2509, 2509, 2509, 2509, 57: 2509, 535: 2509, 539: 2509, 2509, 2509, 2509, 2509, 551: 2509, 553: 2509, 706: 2509, 708: 2509, 2509, 2509, 2509, 2509, 2509}, - {57: 4967, 571: 3767, 3765, 3766, 3764, 3762, 806: 3763, 3761}, - {2755, 2755, 2755, 2755, 2755, 2755, 9: 2755, 551: 2755}, - {2: 2132, 2132, 2132, 2132, 2132, 2132, 2132, 10: 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 58: 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 583: 4970, 860: 4969}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 4046, 3067, 3068, 3066, 827: 4972}, + {567: 4117, 641: 4119, 4118, 924: 4974}, + {567: 4117, 641: 4119, 4118, 924: 4973}, + {2514, 2514, 2514, 2514, 2514, 2514, 2514, 2514, 2514, 2514, 2514, 2514, 2514, 2514, 2514, 57: 2514, 535: 2514, 539: 2514, 2514, 2514, 2514, 2514, 551: 2514, 553: 2514, 706: 2514, 708: 2514, 2514, 2514, 2514, 2514, 2514}, + {2515, 2515, 2515, 2515, 2515, 2515, 2515, 2515, 2515, 2515, 2515, 2515, 2515, 2515, 2515, 57: 2515, 535: 2515, 539: 2515, 2515, 2515, 2515, 2515, 551: 2515, 553: 2515, 706: 2515, 708: 2515, 2515, 2515, 2515, 2515, 2515}, + {57: 4976, 572: 3772, 3770, 3771, 3769, 3767, 806: 3768, 3766}, // 2100 - {650: 4971}, - {2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 58: 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, 538: 2131, 540: 2131, 551: 2131, 636: 2131}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 4046, 3067, 3068, 3066, 827: 4974, 959: 4973}, - {2710, 2710, 2710, 2710, 2710, 2710, 9: 2710, 5254, 5255, 551: 2710, 1039: 5253}, - {12: 4976, 118: 5027, 127: 5028, 172: 5018, 175: 5038, 5037, 5001, 179: 5040, 185: 5039, 188: 4998, 200: 5034, 205: 5007, 4997, 5016, 211: 5023, 5022, 5026, 558: 5021, 560: 5017, 591: 5012, 714: 5020, 737: 5025, 5024, 4999, 5004, 5002, 4995, 4989, 5003, 5013, 4996, 5030, 749: 5005, 5006, 753: 4990, 4991, 4992, 4993, 4994, 5019, 5032, 5036, 5031, 4987, 5035, 4988, 5000, 4986, 5029, 4985, 5033, 957: 5008, 1031: 5010, 1035: 4984, 5014, 4981, 1044: 4979, 1052: 4982, 4983, 1060: 4980, 1064: 5009, 1068: 4977, 5011, 1089: 4978, 1092: 5015, 1095: 4975, 1104: 5041}, + {2761, 2761, 2761, 2761, 2761, 2761, 9: 2761, 551: 2761}, + {2: 2141, 2141, 2141, 2141, 2141, 2141, 2141, 10: 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 58: 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 584: 4979, 860: 4978}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 4054, 3072, 3073, 3071, 828: 4981}, + {650: 4980}, + {2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 58: 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 538: 2140, 540: 2140, 551: 2140, 565: 2140, 636: 2140}, // 2105 - {2561, 2561, 2561, 2561, 2561, 2561, 5118, 5124, 5112, 2561, 2561, 2561, 5116, 5125, 5123, 57: 2561, 535: 5117, 539: 3834, 5115, 3833, 2568, 5122, 551: 2561, 553: 5111, 706: 2605, 708: 5109, 2701, 5114, 5107, 5129, 5126, 921: 5110, 934: 5119, 1017: 5121, 1038: 5127, 1054: 5120, 1076: 5113, 1132: 5128, 5252}, - {2561, 2561, 2561, 2561, 2561, 2561, 5118, 5124, 5112, 2561, 2561, 2561, 5116, 5125, 5123, 57: 2561, 535: 5117, 539: 3834, 5115, 3833, 2568, 5122, 551: 2561, 553: 5111, 706: 2605, 708: 5109, 2701, 5114, 5107, 5129, 5126, 921: 5110, 934: 5119, 1017: 5121, 1038: 5127, 1054: 5120, 1076: 5113, 1132: 5128, 5108}, - {553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 57: 553, 535: 553, 539: 553, 553, 553, 553, 553, 551: 553, 553: 553, 706: 553, 708: 553, 553, 553, 553, 553, 553}, - {552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 57: 552, 535: 552, 539: 552, 552, 552, 552, 552, 551: 552, 553: 552, 706: 552, 708: 552, 552, 552, 552, 552, 552}, - {551, 551, 551, 551, 551, 551, 551, 551, 551, 551, 551, 551, 551, 551, 551, 57: 551, 535: 551, 539: 551, 551, 551, 551, 551, 551: 551, 553: 551, 706: 551, 708: 551, 551, 551, 551, 551, 551}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 4054, 3072, 3073, 3071, 828: 4983, 961: 4982}, + {2716, 2716, 2716, 2716, 2716, 2716, 9: 2716, 5263, 5264, 551: 2716, 1040: 5262}, + {12: 4985, 118: 5036, 127: 5037, 174: 5027, 176: 5047, 5046, 5010, 5049, 186: 5048, 189: 5007, 200: 5043, 205: 5016, 5006, 5025, 211: 5032, 5031, 5035, 558: 5030, 561: 5026, 591: 5021, 714: 5029, 737: 5034, 5033, 5008, 5013, 5011, 5004, 4998, 5012, 746: 5022, 5005, 5039, 5014, 5015, 753: 4999, 5000, 5001, 5002, 5003, 5028, 5041, 5045, 5040, 4996, 5044, 4997, 5009, 4995, 5038, 4994, 5042, 959: 5017, 1032: 5019, 1036: 4993, 5023, 4990, 1045: 4988, 1053: 4991, 4992, 1061: 4989, 1066: 5018, 1070: 4986, 5020, 1091: 4987, 1095: 5024, 1098: 4984, 1107: 5050}, + {2567, 2567, 2567, 2567, 2567, 2567, 5127, 5133, 5121, 2567, 2567, 2567, 5125, 5134, 5132, 57: 2567, 535: 5126, 539: 3839, 5124, 3838, 2574, 5131, 551: 2567, 553: 5120, 706: 2611, 708: 5118, 2707, 5123, 5116, 5138, 5135, 923: 5119, 936: 5128, 1019: 5130, 1039: 5136, 1055: 5129, 1078: 5122, 1135: 5137, 5261}, + {2567, 2567, 2567, 2567, 2567, 2567, 5127, 5133, 5121, 2567, 2567, 2567, 5125, 5134, 5132, 57: 2567, 535: 5126, 539: 3839, 5124, 3838, 2574, 5131, 551: 2567, 553: 5120, 706: 2611, 708: 5118, 2707, 5123, 5116, 5138, 5135, 923: 5119, 936: 5128, 1019: 5130, 1039: 5136, 1055: 5129, 1078: 5122, 1135: 5137, 5117}, // 2110 - {465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 57: 465, 59: 465, 535: 465, 4430, 539: 465, 465, 465, 465, 465, 551: 465, 553: 465, 706: 465, 708: 465, 465, 465, 465, 465, 465, 821: 465, 825: 465, 847: 4431, 894: 5105}, - {460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 57: 460, 59: 460, 535: 460, 539: 460, 460, 460, 460, 460, 551: 460, 553: 460, 706: 460, 708: 460, 460, 460, 460, 460, 460, 821: 460, 825: 460, 985: 5104}, - {458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 57: 458, 59: 458, 535: 458, 4417, 539: 458, 458, 458, 458, 458, 551: 458, 553: 458, 706: 458, 708: 458, 458, 458, 458, 458, 458, 821: 458, 825: 458, 847: 4418, 1009: 5102, 1016: 4419}, - {458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 57: 458, 59: 458, 535: 458, 4417, 539: 458, 458, 458, 458, 458, 551: 458, 553: 458, 706: 458, 708: 458, 458, 458, 458, 458, 458, 821: 458, 825: 458, 847: 4418, 1009: 5100, 1016: 4419}, - {465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 57: 465, 535: 465, 4430, 539: 465, 465, 465, 465, 465, 551: 465, 553: 465, 706: 465, 708: 465, 465, 465, 465, 465, 465, 847: 4431, 894: 5099}, + {560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 57: 560, 535: 560, 539: 560, 560, 560, 560, 560, 551: 560, 553: 560, 706: 560, 708: 560, 560, 560, 560, 560, 560}, + {559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 57: 559, 535: 559, 539: 559, 559, 559, 559, 559, 551: 559, 553: 559, 706: 559, 708: 559, 559, 559, 559, 559, 559}, + {558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 57: 558, 535: 558, 539: 558, 558, 558, 558, 558, 551: 558, 553: 558, 706: 558, 708: 558, 558, 558, 558, 558, 558}, + {472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 57: 472, 59: 472, 535: 472, 4438, 539: 472, 472, 472, 472, 472, 551: 472, 553: 472, 706: 472, 708: 472, 472, 472, 472, 472, 472, 824: 472, 472, 849: 4439, 894: 5114}, + {467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 57: 467, 59: 467, 535: 467, 539: 467, 467, 467, 467, 467, 551: 467, 553: 467, 706: 467, 708: 467, 467, 467, 467, 467, 467, 824: 467, 467, 986: 5113}, // 2115 - {545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 57: 545, 59: 545, 535: 545, 545, 539: 545, 545, 545, 545, 545, 551: 545, 553: 545, 706: 545, 708: 545, 545, 545, 545, 545, 545, 821: 545, 825: 545}, - {544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 57: 544, 59: 544, 535: 544, 544, 539: 544, 544, 544, 544, 544, 551: 544, 553: 544, 706: 544, 708: 544, 544, 544, 544, 544, 544, 821: 544, 825: 544}, - {543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 57: 543, 59: 543, 535: 543, 543, 539: 543, 543, 543, 543, 543, 551: 543, 553: 543, 706: 543, 708: 543, 543, 543, 543, 543, 543, 821: 543, 825: 543}, - {542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 57: 542, 59: 542, 535: 542, 542, 539: 542, 542, 542, 542, 542, 551: 542, 553: 542, 706: 542, 708: 542, 542, 542, 542, 542, 542, 821: 542, 825: 542}, - {541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 57: 541, 59: 541, 535: 541, 541, 539: 541, 541, 541, 541, 541, 551: 541, 553: 541, 706: 541, 708: 541, 541, 541, 541, 541, 541, 821: 541, 825: 541}, + {465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 57: 465, 59: 465, 535: 465, 4425, 539: 465, 465, 465, 465, 465, 551: 465, 553: 465, 706: 465, 708: 465, 465, 465, 465, 465, 465, 824: 465, 465, 849: 4426, 1011: 5111, 1018: 4427}, + {465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 57: 465, 59: 465, 535: 465, 4425, 539: 465, 465, 465, 465, 465, 551: 465, 553: 465, 706: 465, 708: 465, 465, 465, 465, 465, 465, 824: 465, 465, 849: 4426, 1011: 5109, 1018: 4427}, + {472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 57: 472, 535: 472, 4438, 539: 472, 472, 472, 472, 472, 551: 472, 553: 472, 706: 472, 708: 472, 472, 472, 472, 472, 472, 849: 4439, 894: 5108}, + {552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 57: 552, 59: 552, 535: 552, 552, 539: 552, 552, 552, 552, 552, 551: 552, 553: 552, 706: 552, 708: 552, 552, 552, 552, 552, 552, 824: 552, 552}, + {551, 551, 551, 551, 551, 551, 551, 551, 551, 551, 551, 551, 551, 551, 551, 57: 551, 59: 551, 535: 551, 551, 539: 551, 551, 551, 551, 551, 551: 551, 553: 551, 706: 551, 708: 551, 551, 551, 551, 551, 551, 824: 551, 551}, // 2120 - {540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 57: 540, 59: 540, 535: 540, 540, 539: 540, 540, 540, 540, 540, 551: 540, 553: 540, 706: 540, 708: 540, 540, 540, 540, 540, 540, 821: 540, 825: 540}, - {539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 57: 539, 59: 539, 535: 539, 539, 539: 539, 539, 539, 539, 539, 551: 539, 553: 539, 706: 539, 708: 539, 539, 539, 539, 539, 539, 821: 539, 825: 539}, - {538, 538, 538, 538, 538, 538, 538, 538, 538, 538, 538, 538, 538, 538, 538, 57: 538, 59: 538, 535: 538, 538, 539: 538, 538, 538, 538, 538, 551: 538, 553: 538, 706: 538, 708: 538, 538, 538, 538, 538, 538, 821: 538, 825: 538}, - {537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 57: 537, 59: 537, 535: 537, 537, 539: 537, 537, 537, 537, 537, 551: 537, 553: 537, 706: 537, 708: 537, 537, 537, 537, 537, 537, 821: 537, 825: 537}, - {536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 57: 536, 59: 536, 535: 536, 536, 539: 536, 536, 536, 536, 536, 551: 536, 553: 536, 706: 536, 708: 536, 536, 536, 536, 536, 536, 821: 536, 825: 536}, + {550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 57: 550, 59: 550, 535: 550, 550, 539: 550, 550, 550, 550, 550, 551: 550, 553: 550, 706: 550, 708: 550, 550, 550, 550, 550, 550, 824: 550, 550}, + {549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 57: 549, 59: 549, 535: 549, 549, 539: 549, 549, 549, 549, 549, 551: 549, 553: 549, 706: 549, 708: 549, 549, 549, 549, 549, 549, 824: 549, 549}, + {548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 57: 548, 59: 548, 535: 548, 548, 539: 548, 548, 548, 548, 548, 551: 548, 553: 548, 706: 548, 708: 548, 548, 548, 548, 548, 548, 824: 548, 548}, + {547, 547, 547, 547, 547, 547, 547, 547, 547, 547, 547, 547, 547, 547, 547, 57: 547, 59: 547, 535: 547, 547, 539: 547, 547, 547, 547, 547, 551: 547, 553: 547, 706: 547, 708: 547, 547, 547, 547, 547, 547, 824: 547, 547}, + {546, 546, 546, 546, 546, 546, 546, 546, 546, 546, 546, 546, 546, 546, 546, 57: 546, 59: 546, 535: 546, 546, 539: 546, 546, 546, 546, 546, 551: 546, 553: 546, 706: 546, 708: 546, 546, 546, 546, 546, 546, 824: 546, 546}, // 2125 - {535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 57: 535, 59: 535, 535: 535, 535, 539: 535, 535, 535, 535, 535, 551: 535, 553: 535, 706: 535, 708: 535, 535, 535, 535, 535, 535, 821: 535, 825: 535}, - {534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 57: 534, 59: 534, 535: 534, 534, 539: 534, 534, 534, 534, 534, 551: 534, 553: 534, 706: 534, 708: 534, 534, 534, 534, 534, 534, 821: 534, 825: 534}, - {533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 57: 533, 59: 533, 535: 533, 539: 533, 533, 533, 533, 533, 551: 533, 553: 533, 706: 533, 708: 533, 533, 533, 533, 533, 533, 821: 533, 825: 533}, - {532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 57: 532, 59: 532, 535: 532, 539: 532, 532, 532, 532, 532, 551: 532, 553: 532, 706: 532, 708: 532, 532, 532, 532, 532, 532, 821: 532, 825: 532}, - {528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 57: 528, 59: 528, 535: 528, 528, 539: 528, 528, 528, 528, 528, 551: 528, 553: 528, 706: 528, 708: 528, 528, 528, 528, 528, 528, 821: 528, 825: 528}, + {545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 57: 545, 59: 545, 535: 545, 545, 539: 545, 545, 545, 545, 545, 551: 545, 553: 545, 706: 545, 708: 545, 545, 545, 545, 545, 545, 824: 545, 545}, + {544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 57: 544, 59: 544, 535: 544, 544, 539: 544, 544, 544, 544, 544, 551: 544, 553: 544, 706: 544, 708: 544, 544, 544, 544, 544, 544, 824: 544, 544}, + {543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 57: 543, 59: 543, 535: 543, 543, 539: 543, 543, 543, 543, 543, 551: 543, 553: 543, 706: 543, 708: 543, 543, 543, 543, 543, 543, 824: 543, 543}, + {542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 57: 542, 59: 542, 535: 542, 542, 539: 542, 542, 542, 542, 542, 551: 542, 553: 542, 706: 542, 708: 542, 542, 542, 542, 542, 542, 824: 542, 542}, + {541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 57: 541, 59: 541, 535: 541, 541, 539: 541, 541, 541, 541, 541, 551: 541, 553: 541, 706: 541, 708: 541, 541, 541, 541, 541, 541, 824: 541, 541}, // 2130 - {527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 57: 527, 59: 527, 535: 527, 527, 539: 527, 527, 527, 527, 527, 551: 527, 553: 527, 706: 527, 708: 527, 527, 527, 527, 527, 527, 821: 527, 825: 527}, - {526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 57: 526, 59: 526, 535: 526, 526, 539: 526, 526, 526, 526, 526, 551: 526, 553: 526, 706: 526, 708: 526, 526, 526, 526, 526, 526, 821: 526, 825: 526}, - {525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 57: 525, 59: 525, 535: 525, 525, 539: 525, 525, 525, 525, 525, 551: 525, 553: 525, 706: 525, 708: 525, 525, 525, 525, 525, 525, 821: 525, 825: 525}, - {524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 57: 524, 59: 524, 535: 524, 524, 539: 524, 524, 524, 524, 524, 551: 524, 553: 524, 706: 524, 708: 524, 524, 524, 524, 524, 524, 821: 524, 825: 524}, - {523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 57: 523, 59: 523, 535: 523, 523, 539: 523, 523, 523, 523, 523, 551: 523, 553: 523, 706: 523, 708: 523, 523, 523, 523, 523, 523, 821: 523, 825: 523, 1428: 5098}, + {540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 57: 540, 59: 540, 535: 540, 539: 540, 540, 540, 540, 540, 551: 540, 553: 540, 706: 540, 708: 540, 540, 540, 540, 540, 540, 824: 540, 540}, + {539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 57: 539, 59: 539, 535: 539, 539: 539, 539, 539, 539, 539, 551: 539, 553: 539, 706: 539, 708: 539, 539, 539, 539, 539, 539, 824: 539, 539}, + {535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 57: 535, 59: 535, 535: 535, 535, 539: 535, 535, 535, 535, 535, 551: 535, 553: 535, 706: 535, 708: 535, 535, 535, 535, 535, 535, 824: 535, 535}, + {534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 57: 534, 59: 534, 535: 534, 534, 539: 534, 534, 534, 534, 534, 551: 534, 553: 534, 706: 534, 708: 534, 534, 534, 534, 534, 534, 824: 534, 534}, + {533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 57: 533, 59: 533, 535: 533, 533, 539: 533, 533, 533, 533, 533, 551: 533, 553: 533, 706: 533, 708: 533, 533, 533, 533, 533, 533, 824: 533, 533}, // 2135 - {521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 57: 521, 59: 521, 535: 521, 521, 539: 521, 521, 521, 521, 521, 551: 521, 553: 521, 706: 521, 708: 521, 521, 521, 521, 521, 521, 821: 521, 825: 521}, - {520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 57: 520, 59: 520, 535: 520, 520, 539: 520, 520, 520, 520, 520, 551: 520, 553: 520, 706: 520, 708: 520, 520, 520, 520, 520, 520, 821: 520, 825: 520}, - {519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 57: 519, 535: 519, 519, 539: 519, 519, 519, 519, 519, 551: 519, 553: 519, 706: 519, 708: 519, 519, 519, 519, 519, 519}, - {452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 16: 4440, 57: 452, 535: 452, 4430, 539: 452, 452, 452, 452, 452, 551: 452, 553: 452, 558: 4441, 591: 4437, 706: 452, 708: 452, 452, 452, 452, 452, 452, 4439, 847: 5095, 859: 4438, 902: 5096}, - {452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 16: 4440, 57: 452, 535: 452, 4430, 539: 452, 452, 452, 452, 452, 551: 452, 553: 452, 558: 4441, 591: 4437, 706: 452, 708: 452, 452, 452, 452, 452, 452, 4439, 847: 5092, 859: 4438, 902: 5093}, + {532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 57: 532, 59: 532, 535: 532, 532, 539: 532, 532, 532, 532, 532, 551: 532, 553: 532, 706: 532, 708: 532, 532, 532, 532, 532, 532, 824: 532, 532}, + {531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 57: 531, 59: 531, 535: 531, 531, 539: 531, 531, 531, 531, 531, 551: 531, 553: 531, 706: 531, 708: 531, 531, 531, 531, 531, 531, 824: 531, 531}, + {530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 57: 530, 59: 530, 535: 530, 530, 539: 530, 530, 530, 530, 530, 551: 530, 553: 530, 706: 530, 708: 530, 530, 530, 530, 530, 530, 824: 530, 530, 1427: 5107}, + {528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 57: 528, 59: 528, 535: 528, 528, 539: 528, 528, 528, 528, 528, 551: 528, 553: 528, 706: 528, 708: 528, 528, 528, 528, 528, 528, 824: 528, 528}, + {527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 57: 527, 59: 527, 535: 527, 527, 539: 527, 527, 527, 527, 527, 551: 527, 553: 527, 706: 527, 708: 527, 527, 527, 527, 527, 527, 824: 527, 527}, // 2140 - {536: 4430, 847: 5090}, - {536: 4430, 847: 5088}, - {465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 57: 465, 535: 465, 4430, 539: 465, 465, 465, 465, 465, 551: 465, 553: 465, 706: 465, 708: 465, 465, 465, 465, 465, 465, 847: 4431, 894: 5087}, - {536: 4430, 847: 5086}, - {510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 57: 510, 535: 510, 539: 510, 510, 510, 510, 510, 551: 510, 553: 510, 706: 510, 708: 510, 510, 510, 510, 510, 510}, + {526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 57: 526, 535: 526, 526, 539: 526, 526, 526, 526, 526, 551: 526, 553: 526, 706: 526, 708: 526, 526, 526, 526, 526, 526}, + {459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 16: 4448, 57: 459, 535: 459, 4438, 539: 459, 459, 459, 459, 459, 551: 459, 553: 459, 558: 4449, 591: 4445, 706: 459, 708: 459, 459, 459, 459, 459, 459, 4447, 849: 5104, 859: 4446, 902: 5105}, + {459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 16: 4448, 57: 459, 535: 459, 4438, 539: 459, 459, 459, 459, 459, 551: 459, 553: 459, 558: 4449, 591: 4445, 706: 459, 708: 459, 459, 459, 459, 459, 459, 4447, 849: 5101, 859: 4446, 902: 5102}, + {536: 4438, 849: 5099}, + {536: 4438, 849: 5097}, // 2145 - {452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 16: 4440, 57: 452, 151: 5070, 5072, 5071, 535: 452, 539: 452, 452, 452, 452, 452, 551: 452, 553: 452, 558: 4441, 591: 4437, 706: 452, 708: 452, 452, 452, 452, 452, 452, 4439, 859: 4438, 902: 5069, 993: 5085}, - {536: 5081}, - {536: 5074}, - {506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 57: 506, 535: 506, 539: 506, 506, 506, 506, 506, 551: 506, 553: 506, 706: 506, 708: 506, 506, 506, 506, 506, 506}, - {452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 16: 4440, 57: 452, 151: 5070, 5072, 5071, 535: 452, 539: 452, 452, 452, 452, 452, 551: 452, 553: 452, 558: 5067, 591: 4437, 706: 452, 708: 452, 452, 452, 452, 452, 452, 5066, 737: 5025, 5024, 745: 5068, 859: 4438, 902: 5069, 993: 5065, 1031: 5064}, + {472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 57: 472, 535: 472, 4438, 539: 472, 472, 472, 472, 472, 551: 472, 553: 472, 706: 472, 708: 472, 472, 472, 472, 472, 472, 849: 4439, 894: 5096}, + {536: 4438, 849: 5095}, + {517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 57: 517, 535: 517, 539: 517, 517, 517, 517, 517, 551: 517, 553: 517, 706: 517, 708: 517, 517, 517, 517, 517, 517}, + {459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 16: 4448, 57: 459, 153: 5079, 5081, 156: 5080, 535: 459, 539: 459, 459, 459, 459, 459, 551: 459, 553: 459, 558: 4449, 591: 4445, 706: 459, 708: 459, 459, 459, 459, 459, 459, 4447, 859: 4446, 902: 5078, 994: 5094}, + {536: 5090}, // 2150 - {503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 16: 503, 57: 503, 535: 503, 503, 539: 503, 503, 503, 503, 503, 551: 503, 553: 503, 558: 503, 591: 503, 706: 503, 708: 503, 503, 503, 503, 503, 503, 503, 948: 5063}, - {502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 16: 502, 57: 502, 535: 502, 502, 539: 502, 502, 502, 502, 502, 551: 502, 553: 502, 558: 502, 591: 502, 706: 502, 708: 502, 502, 502, 502, 502, 502, 502, 948: 5062}, - {501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 16: 501, 57: 501, 535: 501, 501, 539: 501, 501, 501, 501, 501, 551: 501, 553: 501, 558: 501, 591: 501, 706: 501, 708: 501, 501, 501, 501, 501, 501, 501, 737: 5060, 5059, 948: 5061}, - {558: 5054, 714: 5053, 737: 5056, 5055}, - {496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 16: 496, 57: 496, 151: 496, 496, 496, 535: 496, 496, 539: 496, 496, 496, 496, 496, 551: 496, 553: 496, 558: 496, 591: 496, 706: 496, 708: 496, 496, 496, 496, 496, 496, 496}, + {536: 5083}, + {513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 57: 513, 535: 513, 539: 513, 513, 513, 513, 513, 551: 513, 553: 513, 706: 513, 708: 513, 513, 513, 513, 513, 513}, + {459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 16: 4448, 57: 459, 153: 5079, 5081, 156: 5080, 535: 459, 539: 459, 459, 459, 459, 459, 551: 459, 553: 459, 558: 5076, 591: 4445, 706: 459, 708: 459, 459, 459, 459, 459, 459, 5075, 737: 5034, 5033, 746: 5077, 859: 4446, 902: 5078, 994: 5074, 1032: 5073}, + {510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 510, 16: 510, 57: 510, 535: 510, 510, 539: 510, 510, 510, 510, 510, 551: 510, 553: 510, 558: 510, 591: 510, 706: 510, 708: 510, 510, 510, 510, 510, 510, 510, 951: 5072}, + {509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 16: 509, 57: 509, 535: 509, 509, 539: 509, 509, 509, 509, 509, 551: 509, 553: 509, 558: 509, 591: 509, 706: 509, 708: 509, 509, 509, 509, 509, 509, 509, 951: 5071}, // 2155 - {495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 16: 495, 57: 495, 151: 495, 495, 495, 535: 495, 495, 539: 495, 495, 495, 495, 495, 551: 495, 553: 495, 558: 495, 591: 495, 706: 495, 708: 495, 495, 495, 495, 495, 495, 495}, - {536: 492}, - {486, 486, 486, 486, 486, 486, 486, 486, 486, 486, 486, 486, 486, 486, 486, 57: 486, 59: 486, 535: 486, 486, 539: 486, 486, 486, 486, 486, 551: 486, 553: 486, 706: 486, 708: 486, 486, 486, 486, 486, 486, 821: 486, 825: 486}, - {485, 485, 485, 485, 485, 485, 485, 485, 485, 485, 485, 485, 485, 485, 485, 57: 485, 59: 485, 535: 485, 485, 539: 485, 485, 485, 485, 485, 551: 485, 553: 485, 706: 485, 708: 485, 485, 485, 485, 485, 485, 821: 485, 825: 485}, - {484, 484, 484, 484, 484, 484, 484, 484, 484, 484, 484, 484, 484, 484, 484, 57: 484, 535: 484, 539: 484, 484, 484, 484, 484, 551: 484, 553: 484, 706: 484, 708: 484, 484, 484, 484, 484, 484}, + {508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 16: 508, 57: 508, 535: 508, 508, 539: 508, 508, 508, 508, 508, 551: 508, 553: 508, 558: 508, 591: 508, 706: 508, 708: 508, 508, 508, 508, 508, 508, 508, 737: 5069, 5068, 951: 5070}, + {558: 5063, 714: 5062, 737: 5065, 5064}, + {503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 503, 16: 503, 57: 503, 153: 503, 503, 156: 503, 535: 503, 503, 539: 503, 503, 503, 503, 503, 551: 503, 553: 503, 558: 503, 591: 503, 706: 503, 708: 503, 503, 503, 503, 503, 503, 503}, + {502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 16: 502, 57: 502, 153: 502, 502, 156: 502, 535: 502, 502, 539: 502, 502, 502, 502, 502, 551: 502, 553: 502, 558: 502, 591: 502, 706: 502, 708: 502, 502, 502, 502, 502, 502, 502}, + {536: 499}, // 2160 - {465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 57: 465, 535: 465, 4430, 539: 465, 465, 465, 465, 465, 551: 465, 553: 465, 706: 465, 708: 465, 465, 465, 465, 465, 465, 847: 4431, 894: 5052}, - {482, 482, 482, 482, 482, 482, 482, 482, 482, 482, 482, 482, 482, 482, 482, 57: 482, 535: 482, 539: 482, 482, 482, 482, 482, 551: 482, 553: 482, 706: 482, 708: 482, 482, 482, 482, 482, 482}, - {481, 481, 481, 481, 481, 481, 481, 481, 481, 481, 481, 481, 481, 481, 481, 57: 481, 535: 481, 539: 481, 481, 481, 481, 481, 551: 481, 553: 481, 706: 481, 708: 481, 481, 481, 481, 481, 481}, - {479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 16: 479, 57: 479, 151: 479, 479, 479, 535: 479, 539: 479, 479, 479, 479, 479, 551: 479, 553: 479, 558: 479, 591: 479, 706: 479, 708: 479, 479, 479, 479, 479, 479, 479}, - {465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 16: 465, 57: 465, 151: 465, 465, 465, 535: 465, 4430, 539: 465, 465, 465, 465, 465, 551: 465, 553: 465, 558: 465, 591: 465, 706: 465, 708: 465, 465, 465, 465, 465, 465, 465, 847: 4431, 894: 5051}, + {493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 57: 493, 59: 493, 535: 493, 493, 539: 493, 493, 493, 493, 493, 551: 493, 553: 493, 706: 493, 708: 493, 493, 493, 493, 493, 493, 824: 493, 493}, + {492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 57: 492, 59: 492, 535: 492, 492, 539: 492, 492, 492, 492, 492, 551: 492, 553: 492, 706: 492, 708: 492, 492, 492, 492, 492, 492, 824: 492, 492}, + {491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 57: 491, 535: 491, 539: 491, 491, 491, 491, 491, 551: 491, 553: 491, 706: 491, 708: 491, 491, 491, 491, 491, 491}, + {472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 57: 472, 535: 472, 4438, 539: 472, 472, 472, 472, 472, 551: 472, 553: 472, 706: 472, 708: 472, 472, 472, 472, 472, 472, 849: 4439, 894: 5061}, + {489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 57: 489, 535: 489, 539: 489, 489, 489, 489, 489, 551: 489, 553: 489, 706: 489, 708: 489, 489, 489, 489, 489, 489}, // 2165 - {477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 16: 477, 57: 477, 151: 477, 477, 477, 535: 477, 539: 477, 477, 477, 477, 477, 551: 477, 553: 477, 558: 477, 591: 477, 706: 477, 708: 477, 477, 477, 477, 477, 477, 477}, - {476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 16: 476, 57: 476, 151: 476, 476, 476, 535: 476, 539: 476, 476, 476, 476, 476, 551: 476, 553: 476, 558: 476, 591: 476, 706: 476, 708: 476, 476, 476, 476, 476, 476, 476}, - {471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 57: 471, 535: 471, 539: 471, 471, 471, 471, 471, 551: 471, 553: 471, 706: 471, 708: 471, 471, 471, 471, 471, 471}, - {465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 57: 465, 535: 465, 4430, 539: 465, 465, 465, 465, 465, 551: 465, 553: 465, 706: 465, 708: 465, 465, 465, 465, 465, 465, 847: 4431, 894: 5050}, - {465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 57: 465, 535: 465, 4430, 539: 465, 465, 465, 465, 465, 551: 465, 553: 465, 706: 465, 708: 465, 465, 465, 465, 465, 465, 847: 4431, 894: 5049}, + {488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 57: 488, 535: 488, 539: 488, 488, 488, 488, 488, 551: 488, 553: 488, 706: 488, 708: 488, 488, 488, 488, 488, 488}, + {486, 486, 486, 486, 486, 486, 486, 486, 486, 486, 486, 486, 486, 486, 486, 16: 486, 57: 486, 153: 486, 486, 156: 486, 535: 486, 539: 486, 486, 486, 486, 486, 551: 486, 553: 486, 558: 486, 591: 486, 706: 486, 708: 486, 486, 486, 486, 486, 486, 486}, + {472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 16: 472, 57: 472, 153: 472, 472, 156: 472, 535: 472, 4438, 539: 472, 472, 472, 472, 472, 551: 472, 553: 472, 558: 472, 591: 472, 706: 472, 708: 472, 472, 472, 472, 472, 472, 472, 849: 4439, 894: 5060}, + {484, 484, 484, 484, 484, 484, 484, 484, 484, 484, 484, 484, 484, 484, 484, 16: 484, 57: 484, 153: 484, 484, 156: 484, 535: 484, 539: 484, 484, 484, 484, 484, 551: 484, 553: 484, 558: 484, 591: 484, 706: 484, 708: 484, 484, 484, 484, 484, 484, 484}, + {483, 483, 483, 483, 483, 483, 483, 483, 483, 483, 483, 483, 483, 483, 483, 16: 483, 57: 483, 153: 483, 483, 156: 483, 535: 483, 539: 483, 483, 483, 483, 483, 551: 483, 553: 483, 558: 483, 591: 483, 706: 483, 708: 483, 483, 483, 483, 483, 483, 483}, // 2170 - {465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 57: 465, 535: 465, 4430, 539: 465, 465, 465, 465, 465, 551: 465, 553: 465, 706: 465, 708: 465, 465, 465, 465, 465, 465, 847: 4431, 894: 5048}, - {465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 57: 465, 59: 465, 535: 465, 4430, 539: 465, 465, 465, 465, 465, 551: 465, 553: 465, 706: 465, 708: 465, 465, 465, 465, 465, 465, 821: 465, 825: 465, 847: 4431, 894: 5042}, - {460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 57: 460, 59: 460, 535: 460, 539: 460, 460, 460, 460, 460, 551: 460, 553: 460, 706: 460, 708: 460, 460, 460, 460, 460, 460, 821: 460, 825: 460, 985: 5043}, - {467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 57: 467, 59: 5045, 535: 467, 539: 467, 467, 467, 467, 467, 551: 467, 553: 467, 706: 467, 708: 467, 467, 467, 467, 467, 467, 821: 5044, 825: 5046, 984: 5047}, - {463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 57: 463, 59: 463, 535: 463, 539: 463, 463, 463, 463, 463, 551: 463, 553: 463, 706: 463, 708: 463, 463, 463, 463, 463, 463, 821: 463, 825: 463}, + {478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 57: 478, 535: 478, 539: 478, 478, 478, 478, 478, 551: 478, 553: 478, 706: 478, 708: 478, 478, 478, 478, 478, 478}, + {472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 57: 472, 535: 472, 4438, 539: 472, 472, 472, 472, 472, 551: 472, 553: 472, 706: 472, 708: 472, 472, 472, 472, 472, 472, 849: 4439, 894: 5059}, + {472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 57: 472, 535: 472, 4438, 539: 472, 472, 472, 472, 472, 551: 472, 553: 472, 706: 472, 708: 472, 472, 472, 472, 472, 472, 849: 4439, 894: 5058}, + {472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 57: 472, 535: 472, 4438, 539: 472, 472, 472, 472, 472, 551: 472, 553: 472, 706: 472, 708: 472, 472, 472, 472, 472, 472, 849: 4439, 894: 5057}, + {472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 57: 472, 59: 472, 535: 472, 4438, 539: 472, 472, 472, 472, 472, 551: 472, 553: 472, 706: 472, 708: 472, 472, 472, 472, 472, 472, 824: 472, 472, 849: 4439, 894: 5051}, // 2175 - {462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 57: 462, 59: 462, 535: 462, 539: 462, 462, 462, 462, 462, 551: 462, 553: 462, 706: 462, 708: 462, 462, 462, 462, 462, 462, 821: 462, 825: 462}, - {461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 57: 461, 59: 461, 535: 461, 539: 461, 461, 461, 461, 461, 551: 461, 553: 461, 706: 461, 708: 461, 461, 461, 461, 461, 461, 821: 461, 825: 461}, - {459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 57: 459, 59: 459, 535: 459, 539: 459, 459, 459, 459, 459, 551: 459, 553: 459, 706: 459, 708: 459, 459, 459, 459, 459, 459, 821: 459, 825: 459}, - {468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 57: 468, 535: 468, 539: 468, 468, 468, 468, 468, 551: 468, 553: 468, 706: 468, 708: 468, 468, 468, 468, 468, 468}, - {469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 57: 469, 535: 469, 539: 469, 469, 469, 469, 469, 551: 469, 553: 469, 706: 469, 708: 469, 469, 469, 469, 469, 469}, + {467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 57: 467, 59: 467, 535: 467, 539: 467, 467, 467, 467, 467, 551: 467, 553: 467, 706: 467, 708: 467, 467, 467, 467, 467, 467, 824: 467, 467, 986: 5052}, + {474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 57: 474, 59: 5054, 535: 474, 539: 474, 474, 474, 474, 474, 551: 474, 553: 474, 706: 474, 708: 474, 474, 474, 474, 474, 474, 824: 5053, 5055, 985: 5056}, + {470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 57: 470, 59: 470, 535: 470, 539: 470, 470, 470, 470, 470, 551: 470, 553: 470, 706: 470, 708: 470, 470, 470, 470, 470, 470, 824: 470, 470}, + {469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 57: 469, 59: 469, 535: 469, 539: 469, 469, 469, 469, 469, 551: 469, 553: 469, 706: 469, 708: 469, 469, 469, 469, 469, 469, 824: 469, 469}, + {468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 57: 468, 59: 468, 535: 468, 539: 468, 468, 468, 468, 468, 551: 468, 553: 468, 706: 468, 708: 468, 468, 468, 468, 468, 468, 824: 468, 468}, // 2180 - {470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 57: 470, 535: 470, 539: 470, 470, 470, 470, 470, 551: 470, 553: 470, 706: 470, 708: 470, 470, 470, 470, 470, 470}, - {478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 16: 478, 57: 478, 151: 478, 478, 478, 535: 478, 539: 478, 478, 478, 478, 478, 551: 478, 553: 478, 558: 478, 591: 478, 706: 478, 708: 478, 478, 478, 478, 478, 478, 478}, - {483, 483, 483, 483, 483, 483, 483, 483, 483, 483, 483, 483, 483, 483, 483, 57: 483, 535: 483, 539: 483, 483, 483, 483, 483, 551: 483, 553: 483, 706: 483, 708: 483, 483, 483, 483, 483, 483}, - {500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 16: 500, 57: 500, 535: 500, 500, 539: 500, 500, 500, 500, 500, 551: 500, 553: 500, 558: 500, 591: 500, 706: 500, 708: 500, 500, 500, 500, 500, 500, 500, 948: 5058}, - {499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 16: 499, 57: 499, 535: 499, 499, 539: 499, 499, 499, 499, 499, 551: 499, 553: 499, 558: 499, 591: 499, 706: 499, 708: 499, 499, 499, 499, 499, 499, 499, 948: 5057}, + {466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 57: 466, 59: 466, 535: 466, 539: 466, 466, 466, 466, 466, 551: 466, 553: 466, 706: 466, 708: 466, 466, 466, 466, 466, 466, 824: 466, 466}, + {475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 57: 475, 535: 475, 539: 475, 475, 475, 475, 475, 551: 475, 553: 475, 706: 475, 708: 475, 475, 475, 475, 475, 475}, + {476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 57: 476, 535: 476, 539: 476, 476, 476, 476, 476, 551: 476, 553: 476, 706: 476, 708: 476, 476, 476, 476, 476, 476}, + {477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 57: 477, 535: 477, 539: 477, 477, 477, 477, 477, 551: 477, 553: 477, 706: 477, 708: 477, 477, 477, 477, 477, 477}, + {485, 485, 485, 485, 485, 485, 485, 485, 485, 485, 485, 485, 485, 485, 485, 16: 485, 57: 485, 153: 485, 485, 156: 485, 535: 485, 539: 485, 485, 485, 485, 485, 551: 485, 553: 485, 558: 485, 591: 485, 706: 485, 708: 485, 485, 485, 485, 485, 485, 485}, // 2185 - {536: 494}, - {536: 493}, - {536: 488}, - {536: 489}, - {536: 491}, + {490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 57: 490, 535: 490, 539: 490, 490, 490, 490, 490, 551: 490, 553: 490, 706: 490, 708: 490, 490, 490, 490, 490, 490}, + {507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 16: 507, 57: 507, 535: 507, 507, 539: 507, 507, 507, 507, 507, 551: 507, 553: 507, 558: 507, 591: 507, 706: 507, 708: 507, 507, 507, 507, 507, 507, 507, 951: 5067}, + {506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 16: 506, 57: 506, 535: 506, 506, 539: 506, 506, 506, 506, 506, 551: 506, 553: 506, 558: 506, 591: 506, 706: 506, 708: 506, 506, 506, 506, 506, 506, 506, 951: 5066}, + {536: 501}, + {536: 500}, // 2190 - {536: 490}, - {536: 487}, - {497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 16: 497, 57: 497, 151: 497, 497, 497, 535: 497, 497, 539: 497, 497, 497, 497, 497, 551: 497, 553: 497, 558: 497, 591: 497, 706: 497, 708: 497, 497, 497, 497, 497, 497, 497}, - {498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 16: 498, 57: 498, 151: 498, 498, 498, 535: 498, 498, 539: 498, 498, 498, 498, 498, 551: 498, 553: 498, 558: 498, 591: 498, 706: 498, 708: 498, 498, 498, 498, 498, 498, 498}, - {452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 16: 4440, 57: 452, 151: 5070, 5072, 5071, 535: 452, 539: 452, 452, 452, 452, 452, 551: 452, 553: 452, 558: 4441, 591: 4437, 706: 452, 708: 452, 452, 452, 452, 452, 452, 4439, 859: 4438, 902: 5069, 993: 5073}, + {536: 495}, + {536: 496}, + {536: 498}, + {536: 497}, + {536: 494}, // 2195 - {504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 57: 504, 535: 504, 539: 504, 504, 504, 504, 504, 551: 504, 553: 504, 706: 504, 708: 504, 504, 504, 504, 504, 504}, - {560: 4443, 948: 5063}, - {560: 4442, 948: 5062}, - {480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 57: 480, 535: 480, 539: 480, 480, 480, 480, 480, 551: 480, 553: 480, 706: 480, 708: 480, 480, 480, 480, 480, 480}, - {475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 57: 475, 535: 475, 539: 475, 475, 475, 475, 475, 551: 475, 553: 475, 706: 475, 708: 475, 475, 475, 475, 475, 475}, + {504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 16: 504, 57: 504, 153: 504, 504, 156: 504, 535: 504, 504, 539: 504, 504, 504, 504, 504, 551: 504, 553: 504, 558: 504, 591: 504, 706: 504, 708: 504, 504, 504, 504, 504, 504, 504}, + {505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 16: 505, 57: 505, 153: 505, 505, 156: 505, 535: 505, 505, 539: 505, 505, 505, 505, 505, 551: 505, 553: 505, 558: 505, 591: 505, 706: 505, 708: 505, 505, 505, 505, 505, 505, 505}, + {459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 16: 4448, 57: 459, 153: 5079, 5081, 156: 5080, 535: 459, 539: 459, 459, 459, 459, 459, 551: 459, 553: 459, 558: 4449, 591: 4445, 706: 459, 708: 459, 459, 459, 459, 459, 459, 4447, 859: 4446, 902: 5078, 994: 5082}, + {511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 57: 511, 535: 511, 539: 511, 511, 511, 511, 511, 551: 511, 553: 511, 706: 511, 708: 511, 511, 511, 511, 511, 511}, + {561: 4451, 951: 5072}, // 2200 - {474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 57: 474, 535: 474, 539: 474, 474, 474, 474, 474, 551: 474, 553: 474, 706: 474, 708: 474, 474, 474, 474, 474, 474}, - {473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 57: 473, 535: 473, 539: 473, 473, 473, 473, 473, 551: 473, 553: 473, 706: 473, 708: 473, 473, 473, 473, 473, 473}, - {472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 57: 472, 535: 472, 539: 472, 472, 472, 472, 472, 551: 472, 553: 472, 706: 472, 708: 472, 472, 472, 472, 472, 472}, - {505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 57: 505, 535: 505, 539: 505, 505, 505, 505, 505, 551: 505, 553: 505, 706: 505, 708: 505, 505, 505, 505, 505, 505}, - {538: 3982, 643: 3983, 645: 3984, 1027: 5076, 1303: 5075}, + {561: 4450, 951: 5071}, + {487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 57: 487, 535: 487, 539: 487, 487, 487, 487, 487, 551: 487, 553: 487, 706: 487, 708: 487, 487, 487, 487, 487, 487}, + {482, 482, 482, 482, 482, 482, 482, 482, 482, 482, 482, 482, 482, 482, 482, 57: 482, 535: 482, 539: 482, 482, 482, 482, 482, 551: 482, 553: 482, 706: 482, 708: 482, 482, 482, 482, 482, 482}, + {481, 481, 481, 481, 481, 481, 481, 481, 481, 481, 481, 481, 481, 481, 481, 57: 481, 535: 481, 539: 481, 481, 481, 481, 481, 551: 481, 553: 481, 706: 481, 708: 481, 481, 481, 481, 481, 481}, + {480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 57: 480, 535: 480, 539: 480, 480, 480, 480, 480, 551: 480, 553: 480, 706: 480, 708: 480, 480, 480, 480, 480, 480}, // 2205 - {9: 5078, 57: 5077}, - {9: 437, 57: 437}, - {452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 16: 4440, 57: 452, 151: 5070, 5072, 5071, 535: 452, 539: 452, 452, 452, 452, 452, 551: 452, 553: 452, 558: 4441, 591: 4437, 706: 452, 708: 452, 452, 452, 452, 452, 452, 4439, 859: 4438, 902: 5069, 993: 5080}, - {538: 3982, 643: 3983, 645: 3984, 1027: 5079}, - {9: 436, 57: 436}, - // 2210 - {507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 507, 57: 507, 535: 507, 539: 507, 507, 507, 507, 507, 551: 507, 553: 507, 706: 507, 708: 507, 507, 507, 507, 507, 507}, - {538: 3982, 643: 3983, 645: 3984, 1027: 5076, 1303: 5082}, - {9: 5078, 57: 5083}, - {452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 16: 4440, 57: 452, 151: 5070, 5072, 5071, 535: 452, 539: 452, 452, 452, 452, 452, 551: 452, 553: 452, 558: 4441, 591: 4437, 706: 452, 708: 452, 452, 452, 452, 452, 452, 4439, 859: 4438, 902: 5069, 993: 5084}, - {508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, 57: 508, 535: 508, 539: 508, 508, 508, 508, 508, 551: 508, 553: 508, 706: 508, 708: 508, 508, 508, 508, 508, 508}, - // 2215 - {509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 57: 509, 535: 509, 539: 509, 509, 509, 509, 509, 551: 509, 553: 509, 706: 509, 708: 509, 509, 509, 509, 509, 509}, - {511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 57: 511, 535: 511, 539: 511, 511, 511, 511, 511, 551: 511, 553: 511, 706: 511, 708: 511, 511, 511, 511, 511, 511}, + {479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 57: 479, 535: 479, 539: 479, 479, 479, 479, 479, 551: 479, 553: 479, 706: 479, 708: 479, 479, 479, 479, 479, 479}, {512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 57: 512, 535: 512, 539: 512, 512, 512, 512, 512, 551: 512, 553: 512, 706: 512, 708: 512, 512, 512, 512, 512, 512}, - {452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 16: 4440, 57: 452, 535: 452, 539: 452, 452, 452, 452, 452, 551: 452, 553: 452, 558: 4441, 591: 4437, 706: 452, 708: 452, 452, 452, 452, 452, 452, 4439, 859: 4438, 902: 5089}, - {513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 57: 513, 535: 513, 539: 513, 513, 513, 513, 513, 551: 513, 553: 513, 706: 513, 708: 513, 513, 513, 513, 513, 513}, - // 2220 - {452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 16: 4440, 57: 452, 535: 452, 539: 452, 452, 452, 452, 452, 551: 452, 553: 452, 558: 4441, 591: 4437, 706: 452, 708: 452, 452, 452, 452, 452, 452, 4439, 859: 4438, 902: 5091}, + {538: 3990, 643: 3991, 645: 3992, 1028: 5085, 1301: 5084}, + {9: 5087, 57: 5086}, + {9: 444, 57: 444}, + // 2210 + {459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 16: 4448, 57: 459, 153: 5079, 5081, 156: 5080, 535: 459, 539: 459, 459, 459, 459, 459, 551: 459, 553: 459, 558: 4449, 591: 4445, 706: 459, 708: 459, 459, 459, 459, 459, 459, 4447, 859: 4446, 902: 5078, 994: 5089}, + {538: 3990, 643: 3991, 645: 3992, 1028: 5088}, + {9: 443, 57: 443}, {514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 57: 514, 535: 514, 539: 514, 514, 514, 514, 514, 551: 514, 553: 514, 706: 514, 708: 514, 514, 514, 514, 514, 514}, - {452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 16: 4440, 57: 452, 535: 452, 539: 452, 452, 452, 452, 452, 551: 452, 553: 452, 558: 4441, 591: 4437, 706: 452, 708: 452, 452, 452, 452, 452, 452, 4439, 859: 4438, 902: 5094}, + {538: 3990, 643: 3991, 645: 3992, 1028: 5085, 1301: 5091}, + // 2215 + {9: 5087, 57: 5092}, + {459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 16: 4448, 57: 459, 153: 5079, 5081, 156: 5080, 535: 459, 539: 459, 459, 459, 459, 459, 551: 459, 553: 459, 558: 4449, 591: 4445, 706: 459, 708: 459, 459, 459, 459, 459, 459, 4447, 859: 4446, 902: 5078, 994: 5093}, {515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 57: 515, 535: 515, 539: 515, 515, 515, 515, 515, 551: 515, 553: 515, 706: 515, 708: 515, 515, 515, 515, 515, 515}, {516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 57: 516, 535: 516, 539: 516, 516, 516, 516, 516, 551: 516, 553: 516, 706: 516, 708: 516, 516, 516, 516, 516, 516}, - // 2225 - {452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 16: 4440, 57: 452, 535: 452, 539: 452, 452, 452, 452, 452, 551: 452, 553: 452, 558: 4441, 591: 4437, 706: 452, 708: 452, 452, 452, 452, 452, 452, 4439, 859: 4438, 902: 5097}, - {517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 57: 517, 535: 517, 539: 517, 517, 517, 517, 517, 551: 517, 553: 517, 706: 517, 708: 517, 517, 517, 517, 517, 517}, {518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 57: 518, 535: 518, 539: 518, 518, 518, 518, 518, 551: 518, 553: 518, 706: 518, 708: 518, 518, 518, 518, 518, 518}, - {522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 57: 522, 59: 522, 535: 522, 522, 539: 522, 522, 522, 522, 522, 551: 522, 553: 522, 706: 522, 708: 522, 522, 522, 522, 522, 522, 821: 522, 825: 522}, - {546, 546, 546, 546, 546, 546, 546, 546, 546, 546, 546, 546, 546, 546, 546, 57: 546, 535: 546, 539: 546, 546, 546, 546, 546, 551: 546, 553: 546, 706: 546, 708: 546, 546, 546, 546, 546, 546}, + // 2220 + {519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 57: 519, 535: 519, 539: 519, 519, 519, 519, 519, 551: 519, 553: 519, 706: 519, 708: 519, 519, 519, 519, 519, 519}, + {459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 16: 4448, 57: 459, 535: 459, 539: 459, 459, 459, 459, 459, 551: 459, 553: 459, 558: 4449, 591: 4445, 706: 459, 708: 459, 459, 459, 459, 459, 459, 4447, 859: 4446, 902: 5098}, + {520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 57: 520, 535: 520, 539: 520, 520, 520, 520, 520, 551: 520, 553: 520, 706: 520, 708: 520, 520, 520, 520, 520, 520}, + {459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 16: 4448, 57: 459, 535: 459, 539: 459, 459, 459, 459, 459, 551: 459, 553: 459, 558: 4449, 591: 4445, 706: 459, 708: 459, 459, 459, 459, 459, 459, 4447, 859: 4446, 902: 5100}, + {521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 57: 521, 535: 521, 539: 521, 521, 521, 521, 521, 551: 521, 553: 521, 706: 521, 708: 521, 521, 521, 521, 521, 521}, + // 2225 + {459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 16: 4448, 57: 459, 535: 459, 539: 459, 459, 459, 459, 459, 551: 459, 553: 459, 558: 4449, 591: 4445, 706: 459, 708: 459, 459, 459, 459, 459, 459, 4447, 859: 4446, 902: 5103}, + {522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 57: 522, 535: 522, 539: 522, 522, 522, 522, 522, 551: 522, 553: 522, 706: 522, 708: 522, 522, 522, 522, 522, 522}, + {523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 57: 523, 535: 523, 539: 523, 523, 523, 523, 523, 551: 523, 553: 523, 706: 523, 708: 523, 523, 523, 523, 523, 523}, + {459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 16: 4448, 57: 459, 535: 459, 539: 459, 459, 459, 459, 459, 551: 459, 553: 459, 558: 4449, 591: 4445, 706: 459, 708: 459, 459, 459, 459, 459, 459, 4447, 859: 4446, 902: 5106}, + {524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 57: 524, 535: 524, 539: 524, 524, 524, 524, 524, 551: 524, 553: 524, 706: 524, 708: 524, 524, 524, 524, 524, 524}, // 2230 - {460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 57: 460, 59: 460, 535: 460, 539: 460, 460, 460, 460, 460, 551: 460, 553: 460, 706: 460, 708: 460, 460, 460, 460, 460, 460, 821: 460, 825: 460, 985: 5101}, - {547, 547, 547, 547, 547, 547, 547, 547, 547, 547, 547, 547, 547, 547, 547, 57: 547, 59: 5045, 535: 547, 539: 547, 547, 547, 547, 547, 551: 547, 553: 547, 706: 547, 708: 547, 547, 547, 547, 547, 547, 821: 5044, 825: 5046, 984: 5047}, - {460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 57: 460, 59: 460, 535: 460, 539: 460, 460, 460, 460, 460, 551: 460, 553: 460, 706: 460, 708: 460, 460, 460, 460, 460, 460, 821: 460, 825: 460, 985: 5103}, - {548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 57: 548, 59: 5045, 535: 548, 539: 548, 548, 548, 548, 548, 551: 548, 553: 548, 706: 548, 708: 548, 548, 548, 548, 548, 548, 821: 5044, 825: 5046, 984: 5047}, - {549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 57: 549, 59: 5045, 535: 549, 539: 549, 549, 549, 549, 549, 551: 549, 553: 549, 706: 549, 708: 549, 549, 549, 549, 549, 549, 821: 5044, 825: 5046, 984: 5047}, + {525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 57: 525, 535: 525, 539: 525, 525, 525, 525, 525, 551: 525, 553: 525, 706: 525, 708: 525, 525, 525, 525, 525, 525}, + {529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 57: 529, 59: 529, 535: 529, 529, 539: 529, 529, 529, 529, 529, 551: 529, 553: 529, 706: 529, 708: 529, 529, 529, 529, 529, 529, 824: 529, 529}, + {553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 57: 553, 535: 553, 539: 553, 553, 553, 553, 553, 551: 553, 553: 553, 706: 553, 708: 553, 553, 553, 553, 553, 553}, + {467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 57: 467, 59: 467, 535: 467, 539: 467, 467, 467, 467, 467, 551: 467, 553: 467, 706: 467, 708: 467, 467, 467, 467, 467, 467, 824: 467, 467, 986: 5110}, + {554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 57: 554, 59: 5054, 535: 554, 539: 554, 554, 554, 554, 554, 551: 554, 553: 554, 706: 554, 708: 554, 554, 554, 554, 554, 554, 824: 5053, 5055, 985: 5056}, // 2235 - {460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 57: 460, 59: 460, 535: 460, 539: 460, 460, 460, 460, 460, 551: 460, 553: 460, 706: 460, 708: 460, 460, 460, 460, 460, 460, 821: 460, 825: 460, 985: 5106}, - {550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 57: 550, 59: 5045, 535: 550, 539: 550, 550, 550, 550, 550, 551: 550, 553: 550, 706: 550, 708: 550, 550, 550, 550, 550, 550, 821: 5044, 825: 5046, 984: 5047}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 706: 2700, 708: 2700, 2700, 2700, 715: 2700, 751: 2700, 2700, 777: 5251, 3067, 3068, 3066, 1296: 5250}, - {2627, 2627, 2627, 2627, 2627, 2627, 9: 2627, 2627, 2627, 57: 2627, 551: 2627}, - {706: 2604}, + {467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 57: 467, 59: 467, 535: 467, 539: 467, 467, 467, 467, 467, 551: 467, 553: 467, 706: 467, 708: 467, 467, 467, 467, 467, 467, 824: 467, 467, 986: 5112}, + {555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 57: 555, 59: 5054, 535: 555, 539: 555, 555, 555, 555, 555, 551: 555, 553: 555, 706: 555, 708: 555, 555, 555, 555, 555, 555, 824: 5053, 5055, 985: 5056}, + {556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 57: 556, 59: 5054, 535: 556, 539: 556, 556, 556, 556, 556, 551: 556, 553: 556, 706: 556, 708: 556, 556, 556, 556, 556, 556, 824: 5053, 5055, 985: 5056}, + {467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 57: 467, 59: 467, 535: 467, 539: 467, 467, 467, 467, 467, 551: 467, 553: 467, 706: 467, 708: 467, 467, 467, 467, 467, 467, 824: 467, 467, 986: 5115}, + {557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 57: 557, 59: 5054, 535: 557, 539: 557, 557, 557, 557, 557, 551: 557, 553: 557, 706: 557, 708: 557, 557, 557, 557, 557, 557, 824: 5053, 5055, 985: 5056}, // 2240 - {553: 5249}, - {2594, 2594, 2594, 2594, 2594, 2594, 2594, 2594, 2594, 2594, 2594, 2594, 2594, 2594, 2594, 57: 2594, 535: 2594, 539: 2594, 2594, 2594, 2594, 2594, 551: 2594, 553: 2594, 706: 2594, 708: 2594, 2594, 2594, 2594, 2594, 2594}, - {2593, 2593, 2593, 2593, 2593, 2593, 2593, 2593, 2593, 2593, 2593, 2593, 2593, 2593, 2593, 57: 2593, 535: 2593, 539: 2593, 2593, 2593, 2593, 2593, 551: 2593, 553: 2593, 706: 2593, 708: 2593, 2593, 2593, 2593, 2593, 2593}, - {706: 5245}, - {2590, 2590, 2590, 2590, 2590, 2590, 2590, 2590, 2590, 2590, 2590, 2590, 2590, 2590, 2590, 57: 2590, 535: 2590, 539: 2590, 2590, 2590, 2590, 2590, 551: 2590, 553: 2590, 706: 5244, 708: 2590, 2590, 2590, 2590, 2590, 2590}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 706: 2706, 708: 2706, 2706, 2706, 715: 2706, 751: 2706, 2706, 777: 5260, 3072, 3073, 3071, 1295: 5259}, + {2633, 2633, 2633, 2633, 2633, 2633, 9: 2633, 2633, 2633, 57: 2633, 551: 2633}, + {706: 2610}, + {553: 5258}, + {2600, 2600, 2600, 2600, 2600, 2600, 2600, 2600, 2600, 2600, 2600, 2600, 2600, 2600, 2600, 57: 2600, 535: 2600, 539: 2600, 2600, 2600, 2600, 2600, 551: 2600, 553: 2600, 706: 2600, 708: 2600, 2600, 2600, 2600, 2600, 2600}, // 2245 - {56: 5232, 265: 5234, 412: 5235, 536: 5231, 538: 3607, 548: 4962, 4963, 553: 3598, 564: 3602, 634: 3597, 3599, 641: 3601, 3600, 3605, 645: 3606, 652: 3604, 5217, 5216, 5212, 5213, 658: 5214, 5215, 783: 4961, 785: 3603, 5229, 1005: 5230, 1042: 5211, 1065: 5209, 5210, 5233, 1088: 5228, 1220: 5227, 1356: 5226}, - {540: 5224}, - {719: 5207}, - {538: 5206}, - {709: 5197}, + {2599, 2599, 2599, 2599, 2599, 2599, 2599, 2599, 2599, 2599, 2599, 2599, 2599, 2599, 2599, 57: 2599, 535: 2599, 539: 2599, 2599, 2599, 2599, 2599, 551: 2599, 553: 2599, 706: 2599, 708: 2599, 2599, 2599, 2599, 2599, 2599}, + {706: 5254}, + {2596, 2596, 2596, 2596, 2596, 2596, 2596, 2596, 2596, 2596, 2596, 2596, 2596, 2596, 2596, 57: 2596, 535: 2596, 539: 2596, 2596, 2596, 2596, 2596, 551: 2596, 553: 2596, 706: 5253, 708: 2596, 2596, 2596, 2596, 2596, 2596}, + {56: 5241, 265: 5243, 411: 5244, 536: 5240, 538: 3612, 548: 4971, 4972, 553: 3603, 567: 3607, 634: 3602, 3604, 641: 3606, 3605, 3610, 645: 3611, 652: 3609, 5226, 5225, 5221, 5222, 658: 5223, 5224, 783: 4970, 785: 3608, 5238, 1007: 5239, 1043: 5220, 1067: 5218, 5219, 5242, 1090: 5237, 1220: 5236, 1354: 5235}, + {540: 5233}, // 2250 - {542: 5190}, - {2582, 2582, 2582, 2582, 2582, 2582, 2582, 2582, 2582, 2582, 2582, 2582, 2582, 2582, 2582, 57: 2582, 535: 2582, 539: 2582, 2582, 2582, 2582, 2582, 551: 2582, 553: 2582, 706: 2582, 708: 2582, 2582, 2582, 2582, 2582, 2582}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 538: 3758, 591: 3757, 777: 3759, 3067, 3068, 3066, 811: 3756, 980: 5189}, - {177: 5187, 255: 5188, 540: 5186, 1340: 5185}, - {236: 5184, 300: 5183, 540: 5182, 1477: 5181}, + {719: 5216}, + {538: 5215}, + {709: 5206}, + {542: 5199}, + {2588, 2588, 2588, 2588, 2588, 2588, 2588, 2588, 2588, 2588, 2588, 2588, 2588, 2588, 2588, 57: 2588, 535: 2588, 539: 2588, 2588, 2588, 2588, 2588, 551: 2588, 553: 2588, 706: 2588, 708: 2588, 2588, 2588, 2588, 2588, 2588}, // 2255 - {2577, 2577, 2577, 2577, 2577, 2577, 2577, 2577, 2577, 2577, 2577, 2577, 2577, 2577, 2577, 57: 2577, 535: 2577, 5175, 539: 2577, 2577, 2577, 2577, 2577, 551: 2577, 553: 2577, 706: 2577, 708: 2577, 2577, 2577, 2577, 2577, 2577, 1331: 5174}, - {367: 5173}, - {2563, 2563, 2563, 2563, 2563, 2563, 2563, 2563, 2563, 2563, 2563, 2563, 2563, 2563, 2563, 57: 2563, 535: 2563, 539: 2563, 2563, 2563, 2563, 2563, 551: 2563, 553: 2563, 706: 2563, 708: 2563, 2563, 2563, 2563, 2563, 2563}, - {2560, 2560, 2560, 2560, 2560, 2560, 5118, 5124, 5112, 2560, 2560, 2560, 5116, 5125, 5123, 57: 2560, 535: 5117, 539: 3834, 5115, 3833, 2568, 5122, 551: 2560, 553: 5111, 706: 2605, 708: 5109, 2701, 5114, 5107, 5129, 5126, 921: 5110, 934: 5119, 1017: 5121, 1038: 5172, 1054: 5120, 1076: 5113}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 3949, 3067, 3068, 3066, 810: 5130}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 538: 3763, 591: 3762, 777: 3764, 3072, 3073, 3071, 811: 3761, 981: 5198}, + {178: 5196, 255: 5197, 540: 5195, 1338: 5194}, + {236: 5193, 301: 5192, 540: 5191, 1477: 5190}, + {2583, 2583, 2583, 2583, 2583, 2583, 2583, 2583, 2583, 2583, 2583, 2583, 2583, 2583, 2583, 57: 2583, 535: 2583, 5184, 539: 2583, 2583, 2583, 2583, 2583, 551: 2583, 553: 2583, 706: 2583, 708: 2583, 2583, 2583, 2583, 2583, 2583, 1329: 5183}, + {369: 5182}, // 2260 - {2496, 2496, 2496, 2496, 2496, 2496, 2496, 2496, 2496, 2496, 2496, 2496, 2496, 2496, 2496, 57: 2496, 535: 2496, 5132, 539: 2496, 2496, 2496, 2496, 2496, 551: 2496, 553: 2496, 706: 2496, 708: 2496, 2496, 2496, 2496, 2496, 2496, 716: 2496, 1382: 5131}, - {2550, 2550, 2550, 2550, 2550, 2550, 2550, 2550, 2550, 2550, 2550, 2550, 2550, 2550, 2550, 57: 2550, 535: 2550, 539: 2550, 2550, 2550, 2550, 2550, 551: 2550, 553: 2550, 706: 2550, 708: 2550, 2550, 2550, 2550, 2550, 2550, 716: 5147, 1397: 5148, 5149}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 536: 5136, 777: 4046, 3067, 3068, 3066, 827: 5135, 928: 5134, 938: 5133}, - {9: 5145, 57: 5144}, - {9: 2494, 57: 2494}, + {2569, 2569, 2569, 2569, 2569, 2569, 2569, 2569, 2569, 2569, 2569, 2569, 2569, 2569, 2569, 57: 2569, 535: 2569, 539: 2569, 2569, 2569, 2569, 2569, 551: 2569, 553: 2569, 706: 2569, 708: 2569, 2569, 2569, 2569, 2569, 2569}, + {2566, 2566, 2566, 2566, 2566, 2566, 5127, 5133, 5121, 2566, 2566, 2566, 5125, 5134, 5132, 57: 2566, 535: 5126, 539: 3839, 5124, 3838, 2574, 5131, 551: 2566, 553: 5120, 706: 2611, 708: 5118, 2707, 5123, 5116, 5138, 5135, 923: 5119, 936: 5128, 1019: 5130, 1039: 5181, 1055: 5129, 1078: 5122}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 565: 3955, 777: 3954, 3072, 3073, 3071, 810: 5139}, + {2502, 2502, 2502, 2502, 2502, 2502, 2502, 2502, 2502, 2502, 2502, 2502, 2502, 2502, 2502, 57: 2502, 535: 2502, 5141, 539: 2502, 2502, 2502, 2502, 2502, 551: 2502, 553: 2502, 706: 2502, 708: 2502, 2502, 2502, 2502, 2502, 2502, 716: 2502, 1381: 5140}, + {2556, 2556, 2556, 2556, 2556, 2556, 2556, 2556, 2556, 2556, 2556, 2556, 2556, 2556, 2556, 57: 2556, 535: 2556, 539: 2556, 2556, 2556, 2556, 2556, 551: 2556, 553: 2556, 706: 2556, 708: 2556, 2556, 2556, 2556, 2556, 2556, 716: 5156, 1396: 5157, 5158}, // 2265 - {9: 465, 57: 465, 536: 4430, 582: 465, 610: 465, 847: 4431, 894: 5142}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 5137}, - {57: 5138, 571: 3767, 3765, 3766, 3764, 3762, 806: 3763, 3761}, - {9: 1510, 57: 1510, 582: 5141, 610: 5140, 1070: 5139}, - {9: 2491, 57: 2491}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 536: 5145, 777: 4054, 3072, 3073, 3071, 828: 5144, 930: 5143, 940: 5142}, + {9: 5154, 57: 5153}, + {9: 2500, 57: 2500}, + {9: 472, 57: 472, 536: 4438, 583: 472, 610: 472, 849: 4439, 894: 5151}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 5146}, // 2270 - {1509, 1509, 1509, 1509, 1509, 1509, 9: 1509, 57: 1509, 551: 1509}, - {1508, 1508, 1508, 1508, 1508, 1508, 9: 1508, 57: 1508, 551: 1508}, - {9: 1510, 57: 1510, 582: 5141, 610: 5140, 1070: 5143}, - {9: 2492, 57: 2492}, - {2495, 2495, 2495, 2495, 2495, 2495, 2495, 2495, 2495, 2495, 2495, 2495, 2495, 2495, 2495, 57: 2495, 535: 2495, 539: 2495, 2495, 2495, 2495, 2495, 551: 2495, 553: 2495, 706: 2495, 708: 2495, 2495, 2495, 2495, 2495, 2495, 716: 2495}, + {57: 5147, 572: 3772, 3770, 3771, 3769, 3767, 806: 3768, 3766}, + {9: 1519, 57: 1519, 583: 5150, 610: 5149, 1072: 5148}, + {9: 2497, 57: 2497}, + {1518, 1518, 1518, 1518, 1518, 1518, 9: 1518, 57: 1518, 551: 1518}, + {1517, 1517, 1517, 1517, 1517, 1517, 9: 1517, 57: 1517, 551: 1517}, // 2275 - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 536: 5136, 777: 4046, 3067, 3068, 3066, 827: 5135, 928: 5146}, - {9: 2493, 57: 2493}, - {260: 5169, 419: 5170, 441: 5171}, - {2549, 2549, 2549, 2549, 2549, 2549, 2549, 2549, 2549, 2549, 2549, 2549, 2549, 2549, 2549, 57: 2549, 535: 2549, 539: 2549, 2549, 2549, 2549, 2549, 551: 2549, 553: 2549, 706: 2549, 708: 2549, 2549, 2549, 2549, 2549, 2549}, - {2545, 2545, 2545, 2545, 2545, 2545, 2545, 2545, 2545, 2545, 2545, 2545, 2545, 2545, 2545, 57: 2545, 535: 5151, 539: 2545, 2545, 2545, 2545, 2545, 551: 2545, 553: 2545, 706: 2545, 708: 2545, 2545, 2545, 2545, 2545, 2545, 1225: 5152, 5153, 1404: 5150}, + {9: 1519, 57: 1519, 583: 5150, 610: 5149, 1072: 5152}, + {9: 2498, 57: 2498}, + {2501, 2501, 2501, 2501, 2501, 2501, 2501, 2501, 2501, 2501, 2501, 2501, 2501, 2501, 2501, 57: 2501, 535: 2501, 539: 2501, 2501, 2501, 2501, 2501, 551: 2501, 553: 2501, 706: 2501, 708: 2501, 2501, 2501, 2501, 2501, 2501, 716: 2501}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 536: 5145, 777: 4054, 3072, 3073, 3071, 828: 5144, 930: 5155}, + {9: 2499, 57: 2499}, // 2280 - {2548, 2548, 2548, 2548, 2548, 2548, 2548, 2548, 2548, 2548, 2548, 2548, 2548, 2548, 2548, 57: 2548, 535: 2548, 539: 2548, 2548, 2548, 2548, 2548, 551: 2548, 553: 2548, 706: 2548, 708: 2548, 2548, 2548, 2548, 2548, 2548}, - {719: 5167, 809: 5156}, - {2544, 2544, 2544, 2544, 2544, 2544, 2544, 2544, 2544, 2544, 2544, 2544, 2544, 2544, 2544, 57: 2544, 535: 5165, 539: 2544, 2544, 2544, 2544, 2544, 551: 2544, 553: 2544, 706: 2544, 708: 2544, 2544, 2544, 2544, 2544, 2544, 1226: 5166}, - {2543, 2543, 2543, 2543, 2543, 2543, 2543, 2543, 2543, 2543, 2543, 2543, 2543, 2543, 2543, 57: 2543, 535: 5154, 539: 2543, 2543, 2543, 2543, 2543, 551: 2543, 553: 2543, 706: 2543, 708: 2543, 2543, 2543, 2543, 2543, 2543, 1225: 5155}, - {809: 5156}, + {260: 5178, 419: 5179, 441: 5180}, + {2555, 2555, 2555, 2555, 2555, 2555, 2555, 2555, 2555, 2555, 2555, 2555, 2555, 2555, 2555, 57: 2555, 535: 2555, 539: 2555, 2555, 2555, 2555, 2555, 551: 2555, 553: 2555, 706: 2555, 708: 2555, 2555, 2555, 2555, 2555, 2555}, + {2551, 2551, 2551, 2551, 2551, 2551, 2551, 2551, 2551, 2551, 2551, 2551, 2551, 2551, 2551, 57: 2551, 535: 5160, 539: 2551, 2551, 2551, 2551, 2551, 551: 2551, 553: 2551, 706: 2551, 708: 2551, 2551, 2551, 2551, 2551, 2551, 1225: 5161, 5162, 1403: 5159}, + {2554, 2554, 2554, 2554, 2554, 2554, 2554, 2554, 2554, 2554, 2554, 2554, 2554, 2554, 2554, 57: 2554, 535: 2554, 539: 2554, 2554, 2554, 2554, 2554, 551: 2554, 553: 2554, 706: 2554, 708: 2554, 2554, 2554, 2554, 2554, 2554}, + {719: 5176, 809: 5165}, // 2285 - {2541, 2541, 2541, 2541, 2541, 2541, 2541, 2541, 2541, 2541, 2541, 2541, 2541, 2541, 2541, 57: 2541, 535: 2541, 539: 2541, 2541, 2541, 2541, 2541, 551: 2541, 553: 2541, 706: 2541, 708: 2541, 2541, 2541, 2541, 2541, 2541}, - {86: 5161, 560: 5160, 733: 5159, 735: 5158, 1255: 5157}, + {2550, 2550, 2550, 2550, 2550, 2550, 2550, 2550, 2550, 2550, 2550, 2550, 2550, 2550, 2550, 57: 2550, 535: 5174, 539: 2550, 2550, 2550, 2550, 2550, 551: 2550, 553: 2550, 706: 2550, 708: 2550, 2550, 2550, 2550, 2550, 2550, 1226: 5175}, + {2549, 2549, 2549, 2549, 2549, 2549, 2549, 2549, 2549, 2549, 2549, 2549, 2549, 2549, 2549, 57: 2549, 535: 5163, 539: 2549, 2549, 2549, 2549, 2549, 551: 2549, 553: 2549, 706: 2549, 708: 2549, 2549, 2549, 2549, 2549, 2549, 1225: 5164}, + {809: 5165}, {2547, 2547, 2547, 2547, 2547, 2547, 2547, 2547, 2547, 2547, 2547, 2547, 2547, 2547, 2547, 57: 2547, 535: 2547, 539: 2547, 2547, 2547, 2547, 2547, 551: 2547, 553: 2547, 706: 2547, 708: 2547, 2547, 2547, 2547, 2547, 2547}, - {2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540, 57: 2540, 535: 2540, 539: 2540, 2540, 2540, 2540, 2540, 551: 2540, 553: 2540, 706: 2540, 708: 2540, 2540, 2540, 2540, 2540, 2540}, - {2539, 2539, 2539, 2539, 2539, 2539, 2539, 2539, 2539, 2539, 2539, 2539, 2539, 2539, 2539, 57: 2539, 535: 2539, 539: 2539, 2539, 2539, 2539, 2539, 551: 2539, 553: 2539, 706: 2539, 708: 2539, 2539, 2539, 2539, 2539, 2539}, + {86: 5170, 561: 5169, 733: 5168, 735: 5167, 1255: 5166}, // 2290 - {540: 5164, 553: 5163}, - {93: 5162}, - {2537, 2537, 2537, 2537, 2537, 2537, 2537, 2537, 2537, 2537, 2537, 2537, 2537, 2537, 2537, 57: 2537, 535: 2537, 539: 2537, 2537, 2537, 2537, 2537, 551: 2537, 553: 2537, 706: 2537, 708: 2537, 2537, 2537, 2537, 2537, 2537}, - {2538, 2538, 2538, 2538, 2538, 2538, 2538, 2538, 2538, 2538, 2538, 2538, 2538, 2538, 2538, 57: 2538, 535: 2538, 539: 2538, 2538, 2538, 2538, 2538, 551: 2538, 553: 2538, 706: 2538, 708: 2538, 2538, 2538, 2538, 2538, 2538}, - {2536, 2536, 2536, 2536, 2536, 2536, 2536, 2536, 2536, 2536, 2536, 2536, 2536, 2536, 2536, 57: 2536, 535: 2536, 539: 2536, 2536, 2536, 2536, 2536, 551: 2536, 553: 2536, 706: 2536, 708: 2536, 2536, 2536, 2536, 2536, 2536}, + {2553, 2553, 2553, 2553, 2553, 2553, 2553, 2553, 2553, 2553, 2553, 2553, 2553, 2553, 2553, 57: 2553, 535: 2553, 539: 2553, 2553, 2553, 2553, 2553, 551: 2553, 553: 2553, 706: 2553, 708: 2553, 2553, 2553, 2553, 2553, 2553}, + {2546, 2546, 2546, 2546, 2546, 2546, 2546, 2546, 2546, 2546, 2546, 2546, 2546, 2546, 2546, 57: 2546, 535: 2546, 539: 2546, 2546, 2546, 2546, 2546, 551: 2546, 553: 2546, 706: 2546, 708: 2546, 2546, 2546, 2546, 2546, 2546}, + {2545, 2545, 2545, 2545, 2545, 2545, 2545, 2545, 2545, 2545, 2545, 2545, 2545, 2545, 2545, 57: 2545, 535: 2545, 539: 2545, 2545, 2545, 2545, 2545, 551: 2545, 553: 2545, 706: 2545, 708: 2545, 2545, 2545, 2545, 2545, 2545}, + {540: 5173, 553: 5172}, + {93: 5171}, // 2295 - {719: 5167}, + {2543, 2543, 2543, 2543, 2543, 2543, 2543, 2543, 2543, 2543, 2543, 2543, 2543, 2543, 2543, 57: 2543, 535: 2543, 539: 2543, 2543, 2543, 2543, 2543, 551: 2543, 553: 2543, 706: 2543, 708: 2543, 2543, 2543, 2543, 2543, 2543}, + {2544, 2544, 2544, 2544, 2544, 2544, 2544, 2544, 2544, 2544, 2544, 2544, 2544, 2544, 2544, 57: 2544, 535: 2544, 539: 2544, 2544, 2544, 2544, 2544, 551: 2544, 553: 2544, 706: 2544, 708: 2544, 2544, 2544, 2544, 2544, 2544}, {2542, 2542, 2542, 2542, 2542, 2542, 2542, 2542, 2542, 2542, 2542, 2542, 2542, 2542, 2542, 57: 2542, 535: 2542, 539: 2542, 2542, 2542, 2542, 2542, 551: 2542, 553: 2542, 706: 2542, 708: 2542, 2542, 2542, 2542, 2542, 2542}, - {86: 5161, 560: 5160, 733: 5159, 735: 5158, 1255: 5168}, - {2546, 2546, 2546, 2546, 2546, 2546, 2546, 2546, 2546, 2546, 2546, 2546, 2546, 2546, 2546, 57: 2546, 535: 2546, 539: 2546, 2546, 2546, 2546, 2546, 551: 2546, 553: 2546, 706: 2546, 708: 2546, 2546, 2546, 2546, 2546, 2546}, - {2553, 2553, 2553, 2553, 2553, 2553, 2553, 2553, 2553, 2553, 2553, 2553, 2553, 2553, 2553, 57: 2553, 535: 2553, 539: 2553, 2553, 2553, 2553, 2553, 551: 2553, 553: 2553, 706: 2553, 708: 2553, 2553, 2553, 2553, 2553, 2553}, + {719: 5176}, + {2548, 2548, 2548, 2548, 2548, 2548, 2548, 2548, 2548, 2548, 2548, 2548, 2548, 2548, 2548, 57: 2548, 535: 2548, 539: 2548, 2548, 2548, 2548, 2548, 551: 2548, 553: 2548, 706: 2548, 708: 2548, 2548, 2548, 2548, 2548, 2548}, // 2300 + {86: 5170, 561: 5169, 733: 5168, 735: 5167, 1255: 5177}, {2552, 2552, 2552, 2552, 2552, 2552, 2552, 2552, 2552, 2552, 2552, 2552, 2552, 2552, 2552, 57: 2552, 535: 2552, 539: 2552, 2552, 2552, 2552, 2552, 551: 2552, 553: 2552, 706: 2552, 708: 2552, 2552, 2552, 2552, 2552, 2552}, - {2551, 2551, 2551, 2551, 2551, 2551, 2551, 2551, 2551, 2551, 2551, 2551, 2551, 2551, 2551, 57: 2551, 535: 2551, 539: 2551, 2551, 2551, 2551, 2551, 551: 2551, 553: 2551, 706: 2551, 708: 2551, 2551, 2551, 2551, 2551, 2551}, - {2562, 2562, 2562, 2562, 2562, 2562, 2562, 2562, 2562, 2562, 2562, 2562, 2562, 2562, 2562, 57: 2562, 535: 2562, 539: 2562, 2562, 2562, 2562, 2562, 551: 2562, 553: 2562, 706: 2562, 708: 2562, 2562, 2562, 2562, 2562, 2562}, - {542: 2567}, - {2578, 2578, 2578, 2578, 2578, 2578, 2578, 2578, 2578, 2578, 2578, 2578, 2578, 2578, 2578, 57: 2578, 535: 2578, 539: 2578, 2578, 2578, 2578, 2578, 551: 2578, 553: 2578, 706: 2578, 708: 2578, 2578, 2578, 2578, 2578, 2578}, + {2559, 2559, 2559, 2559, 2559, 2559, 2559, 2559, 2559, 2559, 2559, 2559, 2559, 2559, 2559, 57: 2559, 535: 2559, 539: 2559, 2559, 2559, 2559, 2559, 551: 2559, 553: 2559, 706: 2559, 708: 2559, 2559, 2559, 2559, 2559, 2559}, + {2558, 2558, 2558, 2558, 2558, 2558, 2558, 2558, 2558, 2558, 2558, 2558, 2558, 2558, 2558, 57: 2558, 535: 2558, 539: 2558, 2558, 2558, 2558, 2558, 551: 2558, 553: 2558, 706: 2558, 708: 2558, 2558, 2558, 2558, 2558, 2558}, + {2557, 2557, 2557, 2557, 2557, 2557, 2557, 2557, 2557, 2557, 2557, 2557, 2557, 2557, 2557, 57: 2557, 535: 2557, 539: 2557, 2557, 2557, 2557, 2557, 551: 2557, 553: 2557, 706: 2557, 708: 2557, 2557, 2557, 2557, 2557, 2557}, // 2305 - {564: 3053, 805: 3888, 817: 5176}, - {9: 5178, 57: 5177}, - {2576, 2576, 2576, 2576, 2576, 2576, 2576, 2576, 2576, 2576, 2576, 2576, 2576, 2576, 2576, 57: 2576, 535: 2576, 539: 2576, 2576, 2576, 2576, 2576, 551: 2576, 553: 2576, 706: 2576, 708: 2576, 2576, 2576, 2576, 2576, 2576}, - {564: 3053, 805: 3888, 817: 5179}, - {57: 5180}, + {2568, 2568, 2568, 2568, 2568, 2568, 2568, 2568, 2568, 2568, 2568, 2568, 2568, 2568, 2568, 57: 2568, 535: 2568, 539: 2568, 2568, 2568, 2568, 2568, 551: 2568, 553: 2568, 706: 2568, 708: 2568, 2568, 2568, 2568, 2568, 2568}, + {542: 2573}, + {2584, 2584, 2584, 2584, 2584, 2584, 2584, 2584, 2584, 2584, 2584, 2584, 2584, 2584, 2584, 57: 2584, 535: 2584, 539: 2584, 2584, 2584, 2584, 2584, 551: 2584, 553: 2584, 706: 2584, 708: 2584, 2584, 2584, 2584, 2584, 2584}, + {567: 3058, 805: 3893, 820: 5185}, + {9: 5187, 57: 5186}, // 2310 - {2575, 2575, 2575, 2575, 2575, 2575, 2575, 2575, 2575, 2575, 2575, 2575, 2575, 2575, 2575, 57: 2575, 535: 2575, 539: 2575, 2575, 2575, 2575, 2575, 551: 2575, 553: 2575, 706: 2575, 708: 2575, 2575, 2575, 2575, 2575, 2575}, - {2579, 2579, 2579, 2579, 2579, 2579, 2579, 2579, 2579, 2579, 2579, 2579, 2579, 2579, 2579, 57: 2579, 535: 2579, 539: 2579, 2579, 2579, 2579, 2579, 551: 2579, 553: 2579, 706: 2579, 708: 2579, 2579, 2579, 2579, 2579, 2579}, - {2574, 2574, 2574, 2574, 2574, 2574, 2574, 2574, 2574, 2574, 2574, 2574, 2574, 2574, 2574, 57: 2574, 535: 2574, 539: 2574, 2574, 2574, 2574, 2574, 551: 2574, 553: 2574, 706: 2574, 708: 2574, 2574, 2574, 2574, 2574, 2574}, - {2573, 2573, 2573, 2573, 2573, 2573, 2573, 2573, 2573, 2573, 2573, 2573, 2573, 2573, 2573, 57: 2573, 535: 2573, 539: 2573, 2573, 2573, 2573, 2573, 551: 2573, 553: 2573, 706: 2573, 708: 2573, 2573, 2573, 2573, 2573, 2573}, - {2572, 2572, 2572, 2572, 2572, 2572, 2572, 2572, 2572, 2572, 2572, 2572, 2572, 2572, 2572, 57: 2572, 535: 2572, 539: 2572, 2572, 2572, 2572, 2572, 551: 2572, 553: 2572, 706: 2572, 708: 2572, 2572, 2572, 2572, 2572, 2572}, + {2582, 2582, 2582, 2582, 2582, 2582, 2582, 2582, 2582, 2582, 2582, 2582, 2582, 2582, 2582, 57: 2582, 535: 2582, 539: 2582, 2582, 2582, 2582, 2582, 551: 2582, 553: 2582, 706: 2582, 708: 2582, 2582, 2582, 2582, 2582, 2582}, + {567: 3058, 805: 3893, 820: 5188}, + {57: 5189}, + {2581, 2581, 2581, 2581, 2581, 2581, 2581, 2581, 2581, 2581, 2581, 2581, 2581, 2581, 2581, 57: 2581, 535: 2581, 539: 2581, 2581, 2581, 2581, 2581, 551: 2581, 553: 2581, 706: 2581, 708: 2581, 2581, 2581, 2581, 2581, 2581}, + {2585, 2585, 2585, 2585, 2585, 2585, 2585, 2585, 2585, 2585, 2585, 2585, 2585, 2585, 2585, 57: 2585, 535: 2585, 539: 2585, 2585, 2585, 2585, 2585, 551: 2585, 553: 2585, 706: 2585, 708: 2585, 2585, 2585, 2585, 2585, 2585}, // 2315 {2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580, 57: 2580, 535: 2580, 539: 2580, 2580, 2580, 2580, 2580, 551: 2580, 553: 2580, 706: 2580, 708: 2580, 2580, 2580, 2580, 2580, 2580}, - {2571, 2571, 2571, 2571, 2571, 2571, 2571, 2571, 2571, 2571, 2571, 2571, 2571, 2571, 2571, 57: 2571, 535: 2571, 539: 2571, 2571, 2571, 2571, 2571, 551: 2571, 553: 2571, 706: 2571, 708: 2571, 2571, 2571, 2571, 2571, 2571}, - {2570, 2570, 2570, 2570, 2570, 2570, 2570, 2570, 2570, 2570, 2570, 2570, 2570, 2570, 2570, 57: 2570, 535: 2570, 539: 2570, 2570, 2570, 2570, 2570, 551: 2570, 553: 2570, 706: 2570, 708: 2570, 2570, 2570, 2570, 2570, 2570}, - {2569, 2569, 2569, 2569, 2569, 2569, 2569, 2569, 2569, 2569, 2569, 2569, 2569, 2569, 2569, 57: 2569, 535: 2569, 539: 2569, 2569, 2569, 2569, 2569, 551: 2569, 553: 2569, 706: 2569, 708: 2569, 2569, 2569, 2569, 2569, 2569}, - {2581, 2581, 2581, 2581, 2581, 2581, 2581, 2581, 2581, 2581, 2581, 2581, 2581, 2581, 2581, 57: 2581, 535: 2581, 539: 2581, 2581, 2581, 2581, 2581, 551: 2581, 553: 2581, 706: 2581, 708: 2581, 2581, 2581, 2581, 2581, 2581}, + {2579, 2579, 2579, 2579, 2579, 2579, 2579, 2579, 2579, 2579, 2579, 2579, 2579, 2579, 2579, 57: 2579, 535: 2579, 539: 2579, 2579, 2579, 2579, 2579, 551: 2579, 553: 2579, 706: 2579, 708: 2579, 2579, 2579, 2579, 2579, 2579}, + {2578, 2578, 2578, 2578, 2578, 2578, 2578, 2578, 2578, 2578, 2578, 2578, 2578, 2578, 2578, 57: 2578, 535: 2578, 539: 2578, 2578, 2578, 2578, 2578, 551: 2578, 553: 2578, 706: 2578, 708: 2578, 2578, 2578, 2578, 2578, 2578}, + {2586, 2586, 2586, 2586, 2586, 2586, 2586, 2586, 2586, 2586, 2586, 2586, 2586, 2586, 2586, 57: 2586, 535: 2586, 539: 2586, 2586, 2586, 2586, 2586, 551: 2586, 553: 2586, 706: 2586, 708: 2586, 2586, 2586, 2586, 2586, 2586}, + {2577, 2577, 2577, 2577, 2577, 2577, 2577, 2577, 2577, 2577, 2577, 2577, 2577, 2577, 2577, 57: 2577, 535: 2577, 539: 2577, 2577, 2577, 2577, 2577, 551: 2577, 553: 2577, 706: 2577, 708: 2577, 2577, 2577, 2577, 2577, 2577}, // 2320 - {536: 5191}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 5192}, - {57: 5193, 571: 3767, 3765, 3766, 3764, 3762, 806: 3763, 3761}, - {2566, 2566, 2566, 2566, 2566, 2566, 2566, 2566, 2566, 2566, 2566, 2566, 2566, 2566, 2566, 57: 2566, 535: 2566, 539: 2566, 2566, 2566, 2566, 2566, 551: 2566, 553: 2566, 706: 2566, 708: 2566, 2566, 2566, 2566, 2566, 2566, 1478: 5196, 1505: 5195, 5194}, - {2583, 2583, 2583, 2583, 2583, 2583, 2583, 2583, 2583, 2583, 2583, 2583, 2583, 2583, 2583, 57: 2583, 535: 2583, 539: 2583, 2583, 2583, 2583, 2583, 551: 2583, 553: 2583, 706: 2583, 708: 2583, 2583, 2583, 2583, 2583, 2583}, + {2576, 2576, 2576, 2576, 2576, 2576, 2576, 2576, 2576, 2576, 2576, 2576, 2576, 2576, 2576, 57: 2576, 535: 2576, 539: 2576, 2576, 2576, 2576, 2576, 551: 2576, 553: 2576, 706: 2576, 708: 2576, 2576, 2576, 2576, 2576, 2576}, + {2575, 2575, 2575, 2575, 2575, 2575, 2575, 2575, 2575, 2575, 2575, 2575, 2575, 2575, 2575, 57: 2575, 535: 2575, 539: 2575, 2575, 2575, 2575, 2575, 551: 2575, 553: 2575, 706: 2575, 708: 2575, 2575, 2575, 2575, 2575, 2575}, + {2587, 2587, 2587, 2587, 2587, 2587, 2587, 2587, 2587, 2587, 2587, 2587, 2587, 2587, 2587, 57: 2587, 535: 2587, 539: 2587, 2587, 2587, 2587, 2587, 551: 2587, 553: 2587, 706: 2587, 708: 2587, 2587, 2587, 2587, 2587, 2587}, + {536: 5200}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 5201}, // 2325 - {2565, 2565, 2565, 2565, 2565, 2565, 2565, 2565, 2565, 2565, 2565, 2565, 2565, 2565, 2565, 57: 2565, 535: 2565, 539: 2565, 2565, 2565, 2565, 2565, 551: 2565, 553: 2565, 706: 2565, 708: 2565, 2565, 2565, 2565, 2565, 2565}, - {2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 57: 2564, 535: 2564, 539: 2564, 2564, 2564, 2564, 2564, 551: 2564, 553: 2564, 706: 2564, 708: 2564, 2564, 2564, 2564, 2564, 2564}, - {536: 5198}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 5199}, - {57: 5200, 571: 3767, 3765, 3766, 3764, 3762, 806: 3763, 3761}, + {57: 5202, 572: 3772, 3770, 3771, 3769, 3767, 806: 3768, 3766}, + {2572, 2572, 2572, 2572, 2572, 2572, 2572, 2572, 2572, 2572, 2572, 2572, 2572, 2572, 2572, 57: 2572, 535: 2572, 539: 2572, 2572, 2572, 2572, 2572, 551: 2572, 553: 2572, 706: 2572, 708: 2572, 2572, 2572, 2572, 2572, 2572, 1478: 5205, 1505: 5204, 5203}, + {2589, 2589, 2589, 2589, 2589, 2589, 2589, 2589, 2589, 2589, 2589, 2589, 2589, 2589, 2589, 57: 2589, 535: 2589, 539: 2589, 2589, 2589, 2589, 2589, 551: 2589, 553: 2589, 706: 2589, 708: 2589, 2589, 2589, 2589, 2589, 2589}, + {2571, 2571, 2571, 2571, 2571, 2571, 2571, 2571, 2571, 2571, 2571, 2571, 2571, 2571, 2571, 57: 2571, 535: 2571, 539: 2571, 2571, 2571, 2571, 2571, 551: 2571, 553: 2571, 706: 2571, 708: 2571, 2571, 2571, 2571, 2571, 2571}, + {2570, 2570, 2570, 2570, 2570, 2570, 2570, 2570, 2570, 2570, 2570, 2570, 2570, 2570, 2570, 57: 2570, 535: 2570, 539: 2570, 2570, 2570, 2570, 2570, 551: 2570, 553: 2570, 706: 2570, 708: 2570, 2570, 2570, 2570, 2570, 2570}, // 2330 - {2599, 2599, 2599, 2599, 2599, 2599, 2599, 2599, 2599, 2599, 2599, 2599, 2599, 2599, 2599, 57: 2599, 190: 4951, 535: 2599, 539: 3834, 2599, 3833, 2599, 2599, 551: 2599, 553: 2599, 706: 2599, 708: 2599, 2599, 2599, 2599, 2599, 2599, 921: 5201, 1050: 5202, 1174: 5203, 1361: 5204}, - {190: 4953, 553: 5205}, - {2598, 2598, 2598, 2598, 2598, 2598, 2598, 2598, 2598, 2598, 2598, 2598, 2598, 2598, 2598, 57: 2598, 535: 2598, 539: 2598, 2598, 2598, 2598, 2598, 551: 2598, 553: 2598, 706: 2598, 708: 2598, 2598, 2598, 2598, 2598, 2598}, - {2596, 2596, 2596, 2596, 2596, 2596, 2596, 2596, 2596, 2596, 2596, 2596, 2596, 2596, 2596, 57: 2596, 535: 2596, 539: 2596, 2596, 2596, 2596, 2596, 551: 2596, 553: 2596, 706: 2596, 708: 2596, 2596, 2596, 2596, 2596, 2596}, - {2584, 2584, 2584, 2584, 2584, 2584, 2584, 2584, 2584, 2584, 2584, 2584, 2584, 2584, 2584, 57: 2584, 535: 2584, 539: 2584, 2584, 2584, 2584, 2584, 551: 2584, 553: 2584, 706: 2584, 708: 2584, 2584, 2584, 2584, 2584, 2584}, + {536: 5207}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 5208}, + {57: 5209, 572: 3772, 3770, 3771, 3769, 3767, 806: 3768, 3766}, + {2605, 2605, 2605, 2605, 2605, 2605, 2605, 2605, 2605, 2605, 2605, 2605, 2605, 2605, 2605, 57: 2605, 191: 4960, 535: 2605, 539: 3839, 2605, 3838, 2605, 2605, 551: 2605, 553: 2605, 706: 2605, 708: 2605, 2605, 2605, 2605, 2605, 2605, 923: 5210, 1051: 5211, 1176: 5212, 1359: 5213}, + {191: 4962, 553: 5214}, // 2335 - {2597, 2597, 2597, 2597, 2597, 2597, 2597, 2597, 2597, 2597, 2597, 2597, 2597, 2597, 2597, 57: 2597, 535: 2597, 539: 2597, 2597, 2597, 2597, 2597, 551: 2597, 553: 2597, 706: 2597, 708: 2597, 2597, 2597, 2597, 2597, 2597}, - {2585, 2585, 2585, 2585, 2585, 2585, 2585, 2585, 2585, 2585, 2585, 2585, 2585, 2585, 2585, 57: 2585, 535: 2585, 539: 2585, 2585, 2585, 2585, 2585, 551: 2585, 553: 2585, 706: 2585, 708: 2585, 2585, 2585, 2585, 2585, 2585}, - {653: 5217, 5216, 5212, 5213, 658: 5214, 5215, 1042: 5211, 1065: 5209, 5210, 5208}, - {2586, 2586, 2586, 2586, 2586, 2586, 2586, 2586, 2586, 2586, 2586, 2586, 2586, 2586, 2586, 57: 2586, 535: 2586, 539: 2586, 2586, 2586, 2586, 2586, 551: 2586, 553: 2586, 706: 2586, 708: 2586, 2586, 2586, 2586, 2586, 2586}, - {2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 2526, 57: 2526, 535: 2526, 539: 2526, 2526, 2526, 2526, 2526, 551: 2526, 553: 2526, 706: 2526, 708: 2526, 2526, 2526, 2526, 2526, 2526}, + {2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 57: 2604, 535: 2604, 539: 2604, 2604, 2604, 2604, 2604, 551: 2604, 553: 2604, 706: 2604, 708: 2604, 2604, 2604, 2604, 2604, 2604}, + {2602, 2602, 2602, 2602, 2602, 2602, 2602, 2602, 2602, 2602, 2602, 2602, 2602, 2602, 2602, 57: 2602, 535: 2602, 539: 2602, 2602, 2602, 2602, 2602, 551: 2602, 553: 2602, 706: 2602, 708: 2602, 2602, 2602, 2602, 2602, 2602}, + {2590, 2590, 2590, 2590, 2590, 2590, 2590, 2590, 2590, 2590, 2590, 2590, 2590, 2590, 2590, 57: 2590, 535: 2590, 539: 2590, 2590, 2590, 2590, 2590, 551: 2590, 553: 2590, 706: 2590, 708: 2590, 2590, 2590, 2590, 2590, 2590}, + {2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 57: 2603, 535: 2603, 539: 2603, 2603, 2603, 2603, 2603, 551: 2603, 553: 2603, 706: 2603, 708: 2603, 2603, 2603, 2603, 2603, 2603}, + {2591, 2591, 2591, 2591, 2591, 2591, 2591, 2591, 2591, 2591, 2591, 2591, 2591, 2591, 2591, 57: 2591, 535: 2591, 539: 2591, 2591, 2591, 2591, 2591, 551: 2591, 553: 2591, 706: 2591, 708: 2591, 2591, 2591, 2591, 2591, 2591}, // 2340 - {536: 5220}, - {536: 5218}, - {2522, 2522, 2522, 2522, 2522, 2522, 2522, 2522, 2522, 2522, 2522, 2522, 2522, 2522, 2522, 57: 2522, 535: 2522, 2511, 539: 2522, 2522, 2522, 2522, 2522, 551: 2522, 553: 2522, 706: 2522, 708: 2522, 2522, 2522, 2522, 2522, 2522}, - {2515, 2515, 2515, 2515, 2515, 2515, 2515, 2515, 2515, 2515, 2515, 2515, 2515, 2515, 2515, 57: 2515, 535: 2515, 2519, 539: 2515, 2515, 2515, 2515, 2515, 551: 2515, 553: 2515, 706: 2515, 708: 2515, 2515, 2515, 2515, 2515, 2515}, - {2514, 2514, 2514, 2514, 2514, 2514, 2514, 2514, 2514, 2514, 2514, 2514, 2514, 2514, 2514, 57: 2514, 535: 2514, 2518, 539: 2514, 2514, 2514, 2514, 2514, 551: 2514, 553: 2514, 706: 2514, 708: 2514, 2514, 2514, 2514, 2514, 2514}, + {653: 5226, 5225, 5221, 5222, 658: 5223, 5224, 1043: 5220, 1067: 5218, 5219, 5217}, + {2592, 2592, 2592, 2592, 2592, 2592, 2592, 2592, 2592, 2592, 2592, 2592, 2592, 2592, 2592, 57: 2592, 535: 2592, 539: 2592, 2592, 2592, 2592, 2592, 551: 2592, 553: 2592, 706: 2592, 708: 2592, 2592, 2592, 2592, 2592, 2592}, + {2532, 2532, 2532, 2532, 2532, 2532, 2532, 2532, 2532, 2532, 2532, 2532, 2532, 2532, 2532, 57: 2532, 535: 2532, 539: 2532, 2532, 2532, 2532, 2532, 551: 2532, 553: 2532, 706: 2532, 708: 2532, 2532, 2532, 2532, 2532, 2532}, + {536: 5229}, + {536: 5227}, // 2345 - {2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 57: 2513, 535: 2513, 2517, 539: 2513, 2513, 2513, 2513, 2513, 551: 2513, 553: 2513, 706: 2513, 708: 2513, 2513, 2513, 2513, 2513, 2513}, - {536: 2516}, - {536: 2512}, - {57: 5219}, - {2523, 2523, 2523, 2523, 2523, 2523, 2523, 2523, 2523, 2523, 2523, 2523, 2523, 2523, 2523, 57: 2523, 535: 2523, 539: 2523, 2523, 2523, 2523, 2523, 551: 2523, 553: 2523, 706: 2523, 708: 2523, 2523, 2523, 2523, 2523, 2523}, + {2528, 2528, 2528, 2528, 2528, 2528, 2528, 2528, 2528, 2528, 2528, 2528, 2528, 2528, 2528, 57: 2528, 535: 2528, 2517, 539: 2528, 2528, 2528, 2528, 2528, 551: 2528, 553: 2528, 706: 2528, 708: 2528, 2528, 2528, 2528, 2528, 2528}, + {2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 57: 2521, 535: 2521, 2525, 539: 2521, 2521, 2521, 2521, 2521, 551: 2521, 553: 2521, 706: 2521, 708: 2521, 2521, 2521, 2521, 2521, 2521}, + {2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520, 57: 2520, 535: 2520, 2524, 539: 2520, 2520, 2520, 2520, 2520, 551: 2520, 553: 2520, 706: 2520, 708: 2520, 2520, 2520, 2520, 2520, 2520}, + {2519, 2519, 2519, 2519, 2519, 2519, 2519, 2519, 2519, 2519, 2519, 2519, 2519, 2519, 2519, 57: 2519, 535: 2519, 2523, 539: 2519, 2519, 2519, 2519, 2519, 551: 2519, 553: 2519, 706: 2519, 708: 2519, 2519, 2519, 2519, 2519, 2519}, + {536: 2522}, // 2350 - {57: 5221, 564: 3053, 805: 5222}, - {2525, 2525, 2525, 2525, 2525, 2525, 2525, 2525, 2525, 2525, 2525, 2525, 2525, 2525, 2525, 57: 2525, 535: 2525, 539: 2525, 2525, 2525, 2525, 2525, 551: 2525, 553: 2525, 706: 2525, 708: 2525, 2525, 2525, 2525, 2525, 2525}, - {57: 5223}, - {2524, 2524, 2524, 2524, 2524, 2524, 2524, 2524, 2524, 2524, 2524, 2524, 2524, 2524, 2524, 57: 2524, 535: 2524, 539: 2524, 2524, 2524, 2524, 2524, 551: 2524, 553: 2524, 706: 2524, 708: 2524, 2524, 2524, 2524, 2524, 2524}, - {186: 5225}, + {536: 2518}, + {57: 5228}, + {2529, 2529, 2529, 2529, 2529, 2529, 2529, 2529, 2529, 2529, 2529, 2529, 2529, 2529, 2529, 57: 2529, 535: 2529, 539: 2529, 2529, 2529, 2529, 2529, 551: 2529, 553: 2529, 706: 2529, 708: 2529, 2529, 2529, 2529, 2529, 2529}, + {57: 5230, 567: 3058, 805: 5231}, + {2531, 2531, 2531, 2531, 2531, 2531, 2531, 2531, 2531, 2531, 2531, 2531, 2531, 2531, 2531, 57: 2531, 535: 2531, 539: 2531, 2531, 2531, 2531, 2531, 551: 2531, 553: 2531, 706: 2531, 708: 2531, 2531, 2531, 2531, 2531, 2531}, // 2355 - {2587, 2587, 2587, 2587, 2587, 2587, 2587, 2587, 2587, 2587, 2587, 2587, 2587, 2587, 2587, 57: 2587, 535: 2587, 539: 2587, 2587, 2587, 2587, 2587, 551: 2587, 553: 2587, 706: 2587, 708: 2587, 2587, 2587, 2587, 2587, 2587}, - {2588, 2588, 2588, 2588, 2588, 2588, 2588, 2588, 2588, 2588, 2588, 2588, 2588, 2588, 2588, 57: 2588, 535: 2588, 539: 2588, 2588, 2588, 2588, 2588, 551: 2588, 553: 2588, 706: 2588, 708: 2588, 2588, 2588, 2588, 2588, 2588}, - {2535, 2535, 2535, 2535, 2535, 2535, 2535, 2535, 2535, 2535, 2535, 2535, 2535, 2535, 2535, 57: 2535, 535: 2535, 539: 2535, 2535, 2535, 2535, 2535, 551: 2535, 553: 2535, 706: 2535, 708: 2535, 2535, 2535, 2535, 2535, 2535}, - {2534, 2534, 2534, 2534, 2534, 2534, 2534, 2534, 2534, 2534, 2534, 2534, 2534, 2534, 2534, 57: 2534, 535: 2534, 539: 2534, 2534, 2534, 2534, 2534, 551: 2534, 553: 2534, 706: 2534, 708: 2534, 2534, 2534, 2534, 2534, 2534}, - {2533, 2533, 2533, 2533, 2533, 2533, 2533, 2533, 2533, 2533, 2533, 2533, 2533, 2533, 2533, 57: 2533, 535: 2533, 539: 2533, 2533, 2533, 2533, 2533, 551: 2533, 553: 2533, 706: 2533, 708: 2533, 2533, 2533, 2533, 2533, 2533}, + {57: 5232}, + {2530, 2530, 2530, 2530, 2530, 2530, 2530, 2530, 2530, 2530, 2530, 2530, 2530, 2530, 2530, 57: 2530, 535: 2530, 539: 2530, 2530, 2530, 2530, 2530, 551: 2530, 553: 2530, 706: 2530, 708: 2530, 2530, 2530, 2530, 2530, 2530}, + {187: 5234}, + {2593, 2593, 2593, 2593, 2593, 2593, 2593, 2593, 2593, 2593, 2593, 2593, 2593, 2593, 2593, 57: 2593, 535: 2593, 539: 2593, 2593, 2593, 2593, 2593, 551: 2593, 553: 2593, 706: 2593, 708: 2593, 2593, 2593, 2593, 2593, 2593}, + {2594, 2594, 2594, 2594, 2594, 2594, 2594, 2594, 2594, 2594, 2594, 2594, 2594, 2594, 2594, 57: 2594, 535: 2594, 539: 2594, 2594, 2594, 2594, 2594, 551: 2594, 553: 2594, 706: 2594, 708: 2594, 2594, 2594, 2594, 2594, 2594}, // 2360 - {2532, 2532, 2532, 2532, 2532, 2532, 2532, 2532, 2532, 2532, 2532, 2532, 2532, 2532, 2532, 57: 2532, 535: 2532, 539: 2532, 2532, 2532, 2532, 2532, 551: 2532, 553: 2532, 706: 2532, 708: 2532, 2532, 2532, 2532, 2532, 2532}, - {56: 5232, 536: 5231, 653: 5217, 5216, 5212, 5213, 658: 5214, 5215, 1005: 5240, 1042: 5211, 1065: 5209, 5210, 5233, 1220: 5241}, - {536: 5236}, - {2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 2527, 57: 2527, 535: 2527, 539: 2527, 2527, 2527, 2527, 2527, 551: 2527, 553: 2527, 706: 2527, 708: 2527, 2527, 2527, 2527, 2527, 2527}, - {186: 4598}, + {2541, 2541, 2541, 2541, 2541, 2541, 2541, 2541, 2541, 2541, 2541, 2541, 2541, 2541, 2541, 57: 2541, 535: 2541, 539: 2541, 2541, 2541, 2541, 2541, 551: 2541, 553: 2541, 706: 2541, 708: 2541, 2541, 2541, 2541, 2541, 2541}, + {2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540, 57: 2540, 535: 2540, 539: 2540, 2540, 2540, 2540, 2540, 551: 2540, 553: 2540, 706: 2540, 708: 2540, 2540, 2540, 2540, 2540, 2540}, + {2539, 2539, 2539, 2539, 2539, 2539, 2539, 2539, 2539, 2539, 2539, 2539, 2539, 2539, 2539, 57: 2539, 535: 2539, 539: 2539, 2539, 2539, 2539, 2539, 551: 2539, 553: 2539, 706: 2539, 708: 2539, 2539, 2539, 2539, 2539, 2539}, + {2538, 2538, 2538, 2538, 2538, 2538, 2538, 2538, 2538, 2538, 2538, 2538, 2538, 2538, 2538, 57: 2538, 535: 2538, 539: 2538, 2538, 2538, 2538, 2538, 551: 2538, 553: 2538, 706: 2538, 708: 2538, 2538, 2538, 2538, 2538, 2538}, + {56: 5241, 536: 5240, 653: 5226, 5225, 5221, 5222, 658: 5223, 5224, 1007: 5249, 1043: 5220, 1067: 5218, 5219, 5242, 1220: 5250}, // 2365 - {536: 4595}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 5237, 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 3864, 869: 5238}, - {2530, 2530, 2530, 2530, 2530, 2530, 2530, 2530, 2530, 2530, 2530, 2530, 2530, 2530, 2530, 57: 2530, 535: 2530, 539: 2530, 2530, 2530, 2530, 2530, 551: 2530, 553: 2530, 706: 2530, 708: 2530, 2530, 2530, 2530, 2530, 2530}, - {9: 4012, 57: 5239}, - {2529, 2529, 2529, 2529, 2529, 2529, 2529, 2529, 2529, 2529, 2529, 2529, 2529, 2529, 2529, 57: 2529, 535: 2529, 539: 2529, 2529, 2529, 2529, 2529, 551: 2529, 553: 2529, 706: 2529, 708: 2529, 2529, 2529, 2529, 2529, 2529}, + {536: 5245}, + {2533, 2533, 2533, 2533, 2533, 2533, 2533, 2533, 2533, 2533, 2533, 2533, 2533, 2533, 2533, 57: 2533, 535: 2533, 539: 2533, 2533, 2533, 2533, 2533, 551: 2533, 553: 2533, 706: 2533, 708: 2533, 2533, 2533, 2533, 2533, 2533}, + {187: 4606}, + {536: 4603}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 5246, 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 3869, 869: 5247}, // 2370 - {57: 5243}, - {57: 5242}, - {2528, 2528, 2528, 2528, 2528, 2528, 2528, 2528, 2528, 2528, 2528, 2528, 2528, 2528, 2528, 57: 2528, 535: 2528, 539: 2528, 2528, 2528, 2528, 2528, 551: 2528, 553: 2528, 706: 2528, 708: 2528, 2528, 2528, 2528, 2528, 2528}, - {2531, 2531, 2531, 2531, 2531, 2531, 2531, 2531, 2531, 2531, 2531, 2531, 2531, 2531, 2531, 57: 2531, 535: 2531, 539: 2531, 2531, 2531, 2531, 2531, 551: 2531, 553: 2531, 706: 2531, 708: 2531, 2531, 2531, 2531, 2531, 2531}, - {2589, 2589, 2589, 2589, 2589, 2589, 2589, 2589, 2589, 2589, 2589, 2589, 2589, 2589, 2589, 57: 2589, 535: 2589, 539: 2589, 2589, 2589, 2589, 2589, 551: 2589, 553: 2589, 706: 2589, 708: 2589, 2589, 2589, 2589, 2589, 2589}, + {2536, 2536, 2536, 2536, 2536, 2536, 2536, 2536, 2536, 2536, 2536, 2536, 2536, 2536, 2536, 57: 2536, 535: 2536, 539: 2536, 2536, 2536, 2536, 2536, 551: 2536, 553: 2536, 706: 2536, 708: 2536, 2536, 2536, 2536, 2536, 2536}, + {9: 4020, 57: 5248}, + {2535, 2535, 2535, 2535, 2535, 2535, 2535, 2535, 2535, 2535, 2535, 2535, 2535, 2535, 2535, 57: 2535, 535: 2535, 539: 2535, 2535, 2535, 2535, 2535, 551: 2535, 553: 2535, 706: 2535, 708: 2535, 2535, 2535, 2535, 2535, 2535}, + {57: 5252}, + {57: 5251}, // 2375 - {2592, 2592, 2592, 2592, 2592, 2592, 2592, 2592, 2592, 2592, 2592, 2592, 2592, 2592, 2592, 57: 2592, 105: 5246, 107: 5247, 535: 2592, 539: 2592, 2592, 2592, 2592, 2592, 551: 2592, 553: 2592, 706: 2592, 708: 2592, 2592, 2592, 2592, 2592, 2592, 977: 5248}, - {2727, 2727, 2727, 2727, 2727, 2727, 2727, 2727, 2727, 2727, 2727, 2727, 2727, 2727, 2727, 19: 2727, 57: 2727, 102: 2727, 104: 2727, 2727, 2727, 2727, 109: 2727, 535: 2727, 537: 2727, 539: 2727, 2727, 2727, 2727, 2727, 547: 2727, 551: 2727, 553: 2727, 567: 2727, 706: 2727, 708: 2727, 2727, 2727, 2727, 2727, 2727}, - {2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726, 2726, 19: 2726, 57: 2726, 102: 2726, 104: 2726, 2726, 2726, 2726, 109: 2726, 535: 2726, 537: 2726, 539: 2726, 2726, 2726, 2726, 2726, 547: 2726, 551: 2726, 553: 2726, 567: 2726, 706: 2726, 708: 2726, 2726, 2726, 2726, 2726, 2726}, - {2591, 2591, 2591, 2591, 2591, 2591, 2591, 2591, 2591, 2591, 2591, 2591, 2591, 2591, 2591, 57: 2591, 535: 2591, 539: 2591, 2591, 2591, 2591, 2591, 551: 2591, 553: 2591, 706: 2591, 708: 2591, 2591, 2591, 2591, 2591, 2591}, + {2534, 2534, 2534, 2534, 2534, 2534, 2534, 2534, 2534, 2534, 2534, 2534, 2534, 2534, 2534, 57: 2534, 535: 2534, 539: 2534, 2534, 2534, 2534, 2534, 551: 2534, 553: 2534, 706: 2534, 708: 2534, 2534, 2534, 2534, 2534, 2534}, + {2537, 2537, 2537, 2537, 2537, 2537, 2537, 2537, 2537, 2537, 2537, 2537, 2537, 2537, 2537, 57: 2537, 535: 2537, 539: 2537, 2537, 2537, 2537, 2537, 551: 2537, 553: 2537, 706: 2537, 708: 2537, 2537, 2537, 2537, 2537, 2537}, {2595, 2595, 2595, 2595, 2595, 2595, 2595, 2595, 2595, 2595, 2595, 2595, 2595, 2595, 2595, 57: 2595, 535: 2595, 539: 2595, 2595, 2595, 2595, 2595, 551: 2595, 553: 2595, 706: 2595, 708: 2595, 2595, 2595, 2595, 2595, 2595}, + {2598, 2598, 2598, 2598, 2598, 2598, 2598, 2598, 2598, 2598, 2598, 2598, 2598, 2598, 2598, 57: 2598, 105: 5255, 107: 5256, 535: 2598, 539: 2598, 2598, 2598, 2598, 2598, 551: 2598, 553: 2598, 706: 2598, 708: 2598, 2598, 2598, 2598, 2598, 2598, 978: 5257}, + {2733, 2733, 2733, 2733, 2733, 2733, 2733, 2733, 2733, 2733, 2733, 2733, 2733, 2733, 2733, 19: 2733, 57: 2733, 102: 2733, 104: 2733, 2733, 2733, 2733, 109: 2733, 535: 2733, 537: 2733, 539: 2733, 2733, 2733, 2733, 2733, 547: 2733, 551: 2733, 553: 2733, 568: 2733, 706: 2733, 708: 2733, 2733, 2733, 2733, 2733, 2733}, // 2380 - {706: 2699, 708: 2699, 2699, 2699, 715: 2699, 751: 2699, 2699}, - {2698, 2698, 2698, 2698, 2698, 2698, 9: 2698, 551: 2698, 706: 2698, 708: 2698, 2698, 2698, 715: 2698, 751: 2698, 2698}, - {2628, 2628, 2628, 2628, 2628, 2628, 9: 2628, 2628, 2628, 57: 2628, 551: 2628}, - {2757, 2757, 2757, 2757, 2757, 2757, 9: 2757, 551: 2757}, - {2709, 2709, 2709, 2709, 2709, 2709, 9: 2709, 551: 2709}, + {2732, 2732, 2732, 2732, 2732, 2732, 2732, 2732, 2732, 2732, 2732, 2732, 2732, 2732, 2732, 19: 2732, 57: 2732, 102: 2732, 104: 2732, 2732, 2732, 2732, 109: 2732, 535: 2732, 537: 2732, 539: 2732, 2732, 2732, 2732, 2732, 547: 2732, 551: 2732, 553: 2732, 568: 2732, 706: 2732, 708: 2732, 2732, 2732, 2732, 2732, 2732}, + {2597, 2597, 2597, 2597, 2597, 2597, 2597, 2597, 2597, 2597, 2597, 2597, 2597, 2597, 2597, 57: 2597, 535: 2597, 539: 2597, 2597, 2597, 2597, 2597, 551: 2597, 553: 2597, 706: 2597, 708: 2597, 2597, 2597, 2597, 2597, 2597}, + {2601, 2601, 2601, 2601, 2601, 2601, 2601, 2601, 2601, 2601, 2601, 2601, 2601, 2601, 2601, 57: 2601, 535: 2601, 539: 2601, 2601, 2601, 2601, 2601, 551: 2601, 553: 2601, 706: 2601, 708: 2601, 2601, 2601, 2601, 2601, 2601}, + {706: 2705, 708: 2705, 2705, 2705, 715: 2705, 751: 2705, 2705}, + {2704, 2704, 2704, 2704, 2704, 2704, 9: 2704, 551: 2704, 706: 2704, 708: 2704, 2704, 2704, 715: 2704, 751: 2704, 2704}, // 2385 - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 4046, 3067, 3068, 3066, 827: 5256}, - {2708, 2708, 2708, 2708, 2708, 2708, 9: 2708, 551: 2708}, - {2: 2132, 2132, 2132, 2132, 2132, 2132, 2132, 10: 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 58: 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 583: 4970, 860: 5258}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 4046, 3067, 3068, 3066, 827: 4974, 959: 5259}, - {2710, 2710, 2710, 2710, 2710, 2710, 9: 2710, 5254, 5255, 551: 2710, 1039: 5260}, + {2634, 2634, 2634, 2634, 2634, 2634, 9: 2634, 2634, 2634, 57: 2634, 551: 2634}, + {2763, 2763, 2763, 2763, 2763, 2763, 9: 2763, 551: 2763}, + {2715, 2715, 2715, 2715, 2715, 2715, 9: 2715, 551: 2715}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 4054, 3072, 3073, 3071, 828: 5265}, + {2714, 2714, 2714, 2714, 2714, 2714, 9: 2714, 551: 2714}, // 2390 - {2758, 2758, 2758, 2758, 2758, 2758, 9: 2758, 551: 2758}, - {2759, 2759, 2759, 2759, 2759, 2759, 9: 2759, 551: 2759}, - {2760, 2760, 2760, 2760, 2760, 2760, 9: 2760, 551: 2760}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 4046, 3067, 3068, 3066, 827: 5266, 1110: 5265, 1319: 5264}, - {2761, 2761, 2761, 2761, 2761, 2761, 9: 5268, 551: 2761}, + {2: 2141, 2141, 2141, 2141, 2141, 2141, 2141, 10: 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 58: 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 584: 4979, 860: 5267}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 4054, 3072, 3073, 3071, 828: 4983, 961: 5268}, + {2716, 2716, 2716, 2716, 2716, 2716, 9: 2716, 5263, 5264, 551: 2716, 1040: 5269}, + {2764, 2764, 2764, 2764, 2764, 2764, 9: 2764, 551: 2764}, + {2765, 2765, 2765, 2765, 2765, 2765, 9: 2765, 551: 2765}, // 2395 - {1520, 1520, 1520, 1520, 1520, 1520, 9: 1520, 551: 1520}, - {1510, 1510, 1510, 1510, 1510, 1510, 9: 1510, 551: 1510, 582: 5141, 610: 5140, 1070: 5267}, - {1518, 1518, 1518, 1518, 1518, 1518, 9: 1518, 551: 1518}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 4046, 3067, 3068, 3066, 827: 5266, 1110: 5269}, - {1519, 1519, 1519, 1519, 1519, 1519, 9: 1519, 551: 1519}, + {2766, 2766, 2766, 2766, 2766, 2766, 9: 2766, 551: 2766}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 4054, 3072, 3073, 3071, 828: 5275, 1113: 5274, 1317: 5273}, + {2767, 2767, 2767, 2767, 2767, 2767, 9: 5277, 551: 2767}, + {1529, 1529, 1529, 1529, 1529, 1529, 9: 1529, 551: 1529}, + {1519, 1519, 1519, 1519, 1519, 1519, 9: 1519, 551: 1519, 583: 5150, 610: 5149, 1072: 5276}, // 2400 - {2: 762, 762, 762, 762, 762, 762, 762, 10: 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 58: 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 5273, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 721: 762, 914: 5272, 930: 5271}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 721: 5275, 777: 5277, 3067, 3068, 3066, 865: 5276, 933: 5274}, - {761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 58: 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 536: 761, 551: 761, 564: 761, 591: 761, 614: 761, 721: 761}, - {760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 58: 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 536: 760, 551: 760, 564: 760, 591: 760, 614: 760, 721: 760}, - {2764, 2764, 2764, 2764, 2764, 2764, 9: 2764, 551: 2764}, + {1527, 1527, 1527, 1527, 1527, 1527, 9: 1527, 551: 1527}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 4054, 3072, 3073, 3071, 828: 5275, 1113: 5278}, + {1528, 1528, 1528, 1528, 1528, 1528, 9: 1528, 551: 1528}, + {2: 768, 768, 768, 768, 768, 768, 768, 10: 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 58: 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 5282, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 721: 768, 901: 5281, 916: 5280}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 721: 5284, 777: 5286, 3072, 3073, 3071, 865: 5285, 934: 5283}, // 2405 - {2733, 2733, 2733, 2733, 2733, 2733, 9: 2733, 20: 2733, 551: 2733}, - {2732, 2732, 2732, 2732, 2732, 2732, 9: 5278, 20: 2732, 551: 2732}, - {2703, 2703, 2703, 2703, 2703, 2703, 9: 2703, 20: 2703, 57: 2703, 131: 2703, 202: 2703, 216: 2703, 537: 2703, 551: 2703, 565: 2703, 715: 2703, 721: 2703}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 5279, 3067, 3068, 3066}, - {2702, 2702, 2702, 2702, 2702, 2702, 9: 2702, 20: 2702, 57: 2702, 131: 2702, 202: 2702, 216: 2702, 537: 2702, 551: 2702, 565: 2702, 715: 2702, 721: 2702}, + {767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 58: 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 536: 767, 551: 767, 567: 767, 591: 767, 613: 767, 721: 767}, + {766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 58: 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 536: 766, 551: 766, 567: 766, 591: 766, 613: 766, 721: 766}, + {2770, 2770, 2770, 2770, 2770, 2770, 9: 2770, 551: 2770}, + {2739, 2739, 2739, 2739, 2739, 2739, 9: 2739, 20: 2739, 551: 2739}, + {2738, 2738, 2738, 2738, 2738, 2738, 9: 5287, 20: 2738, 551: 2738}, // 2410 - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 721: 5275, 777: 5277, 3067, 3068, 3066, 865: 5276, 933: 5282}, - {2765, 2765, 2765, 2765, 2765, 2765, 9: 2765, 551: 2765}, - {20: 5283}, - {2767, 2767, 2767, 2767, 2767, 2767, 9: 2767, 551: 2767}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 721: 5275, 777: 5277, 3067, 3068, 3066, 865: 5276, 933: 5286}, + {2709, 2709, 2709, 2709, 2709, 2709, 9: 2709, 20: 2709, 57: 2709, 131: 2709, 202: 2709, 216: 2709, 537: 2709, 551: 2709, 564: 2709, 715: 2709, 721: 2709}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 5288, 3072, 3073, 3071}, + {2708, 2708, 2708, 2708, 2708, 2708, 9: 2708, 20: 2708, 57: 2708, 131: 2708, 202: 2708, 216: 2708, 537: 2708, 551: 2708, 564: 2708, 715: 2708, 721: 2708}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 721: 5284, 777: 5286, 3072, 3073, 3071, 865: 5285, 934: 5291}, + {2771, 2771, 2771, 2771, 2771, 2771, 9: 2771, 551: 2771}, // 2415 - {2766, 2766, 2766, 2766, 2766, 2766, 9: 2766, 551: 2766}, - {20: 5287}, - {2768, 2768, 2768, 2768, 2768, 2768, 9: 2768, 551: 2768}, - {2: 762, 762, 762, 762, 762, 762, 762, 10: 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 58: 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 5273, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 721: 762, 914: 5272, 930: 5289}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 721: 5275, 777: 5277, 3067, 3068, 3066, 865: 5276, 933: 5290}, + {20: 5292}, + {2773, 2773, 2773, 2773, 2773, 2773, 9: 2773, 551: 2773}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 721: 5284, 777: 5286, 3072, 3073, 3071, 865: 5285, 934: 5295}, + {2772, 2772, 2772, 2772, 2772, 2772, 9: 2772, 551: 2772}, + {20: 5296}, // 2420 - {2769, 2769, 2769, 2769, 2769, 2769, 9: 2769, 551: 2769}, - {2: 762, 762, 762, 762, 762, 762, 762, 10: 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 58: 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 5273, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 721: 762, 914: 5272, 930: 5292}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 721: 5275, 777: 5277, 3067, 3068, 3066, 865: 5276, 933: 5293}, - {2770, 2770, 2770, 2770, 2770, 2770, 9: 2770, 551: 2770}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 721: 5275, 777: 5277, 3067, 3068, 3066, 865: 5276, 933: 5295}, + {2774, 2774, 2774, 2774, 2774, 2774, 9: 2774, 551: 2774}, + {2: 768, 768, 768, 768, 768, 768, 768, 10: 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 58: 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 5282, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 721: 768, 901: 5281, 916: 5298}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 721: 5284, 777: 5286, 3072, 3073, 3071, 865: 5285, 934: 5299}, + {2775, 2775, 2775, 2775, 2775, 2775, 9: 2775, 551: 2775}, + {2: 768, 768, 768, 768, 768, 768, 768, 10: 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 58: 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 5282, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 721: 768, 901: 5281, 916: 5301}, // 2425 - {2771, 2771, 2771, 2771, 2771, 2771, 9: 2771, 551: 2771}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 5297, 3067, 3068, 3066}, - {537: 5298}, - {614: 5299}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 3949, 3067, 3068, 3066, 810: 5300}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 721: 5284, 777: 5286, 3072, 3073, 3071, 865: 5285, 934: 5302}, + {2776, 2776, 2776, 2776, 2776, 2776, 9: 2776, 551: 2776}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 721: 5284, 777: 5286, 3072, 3073, 3071, 865: 5285, 934: 5304}, + {2777, 2777, 2777, 2777, 2777, 2777, 9: 2777, 551: 2777}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 5306, 3072, 3073, 3071}, // 2430 - {2731, 2731, 2731, 2731, 2731, 2731, 9: 2731, 276: 5304, 537: 5303, 551: 2731, 1518: 5302, 5301}, - {2772, 2772, 2772, 2772, 2772, 2772, 9: 2772, 551: 2772}, - {2730, 2730, 2730, 2730, 2730, 2730, 9: 2730, 551: 2730}, - {247: 5306}, - {247: 5305}, + {537: 5307}, + {613: 5308}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 565: 3955, 777: 3954, 3072, 3073, 3071, 810: 5309}, + {2737, 2737, 2737, 2737, 2737, 2737, 9: 2737, 276: 5313, 537: 5312, 551: 2737, 1518: 5311, 5310}, + {2778, 2778, 2778, 2778, 2778, 2778, 9: 2778, 551: 2778}, // 2435 - {2728, 2728, 2728, 2728, 2728, 2728, 9: 2728, 551: 2728}, - {2729, 2729, 2729, 2729, 2729, 2729, 9: 2729, 551: 2729}, - {192: 5308}, - {201: 5309}, - {536: 5310}, + {2736, 2736, 2736, 2736, 2736, 2736, 9: 2736, 551: 2736}, + {247: 5315}, + {247: 5314}, + {2734, 2734, 2734, 2734, 2734, 2734, 9: 2734, 551: 2734}, + {2735, 2735, 2735, 2735, 2735, 2735, 9: 2735, 551: 2735}, // 2440 - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3703, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 5311}, - {57: 5312, 548: 3804, 3805, 3810, 589: 3806, 613: 3807, 615: 3808, 3801, 3811, 3800, 3809, 3802, 3803}, - {2132, 2132, 2132, 2132, 2132, 2132, 9: 2132, 551: 2132, 583: 4970, 860: 5313}, - {2774, 2774, 2774, 2774, 2774, 2774, 9: 2774, 551: 2774}, - {2: 2132, 2132, 2132, 2132, 2132, 2132, 2132, 10: 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 58: 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 583: 4970, 860: 5332}, + {193: 5317}, + {201: 5318}, + {536: 5319}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3708, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 5320}, + {57: 5321, 548: 3809, 3810, 3815, 565: 3811, 614: 3812, 3813, 3806, 3816, 3805, 3814, 3807, 3808}, // 2445 - {706: 5331}, - {2: 2132, 2132, 2132, 2132, 2132, 2132, 2132, 10: 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 58: 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 583: 4970, 860: 5329}, - {2: 2132, 2132, 2132, 2132, 2132, 2132, 2132, 10: 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 58: 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 583: 4970, 860: 5327}, - {2: 2132, 2132, 2132, 2132, 2132, 2132, 2132, 10: 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 58: 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 583: 4970, 860: 5325}, - {706: 5322}, + {2141, 2141, 2141, 2141, 2141, 2141, 9: 2141, 551: 2141, 584: 4979, 860: 5322}, + {2780, 2780, 2780, 2780, 2780, 2780, 9: 2780, 551: 2780}, + {2: 2141, 2141, 2141, 2141, 2141, 2141, 2141, 10: 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 58: 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 584: 4979, 860: 5341}, + {706: 5340}, + {2: 2141, 2141, 2141, 2141, 2141, 2141, 2141, 10: 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 58: 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 584: 4979, 860: 5338}, // 2450 - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 5321, 3067, 3068, 3066}, - {2739, 2739, 2739, 2739, 2739, 2739, 9: 2739, 551: 2739}, - {2: 2132, 2132, 2132, 2132, 2132, 2132, 2132, 10: 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 58: 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 583: 4970, 860: 5323}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 5251, 3067, 3068, 3066, 1296: 5324}, - {2762, 2762, 2762, 2762, 2762, 2762, 9: 2762, 551: 2762}, + {2: 2141, 2141, 2141, 2141, 2141, 2141, 2141, 10: 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 58: 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 584: 4979, 860: 5336}, + {2: 2141, 2141, 2141, 2141, 2141, 2141, 2141, 10: 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 58: 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 584: 4979, 860: 5334}, + {706: 5331}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 5330, 3072, 3073, 3071}, + {2745, 2745, 2745, 2745, 2745, 2745, 9: 2745, 551: 2745}, // 2455 - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 5326, 3067, 3068, 3066}, - {2763, 2763, 2763, 2763, 2763, 2763, 9: 2763, 551: 2763}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 5328, 3067, 3068, 3066}, - {2773, 2773, 2773, 2773, 2773, 2773, 9: 2773, 551: 2773}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 5277, 3067, 3068, 3066, 865: 5330}, + {2: 2141, 2141, 2141, 2141, 2141, 2141, 2141, 10: 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 58: 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 584: 4979, 860: 5332}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 5260, 3072, 3073, 3071, 1295: 5333}, + {2768, 2768, 2768, 2768, 2768, 2768, 9: 2768, 551: 2768}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 5335, 3072, 3073, 3071}, + {2769, 2769, 2769, 2769, 2769, 2769, 9: 2769, 551: 2769}, // 2460 - {2775, 2775, 2775, 2775, 2775, 2775, 9: 5278, 551: 2775}, - {2776, 2776, 2776, 2776, 2776, 2776, 9: 2776, 551: 2776}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 4046, 3067, 3068, 3066, 827: 5333}, - {2334, 2334, 2334, 2334, 2334, 2334, 9: 2334, 551: 2334, 733: 5336, 735: 5335, 1018: 5334}, - {2777, 2777, 2777, 2777, 2777, 2777, 9: 2777, 551: 2777}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 5337, 3072, 3073, 3071}, + {2779, 2779, 2779, 2779, 2779, 2779, 9: 2779, 551: 2779}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 5286, 3072, 3073, 3071, 865: 5339}, + {2781, 2781, 2781, 2781, 2781, 2781, 9: 5287, 551: 2781}, + {2782, 2782, 2782, 2782, 2782, 2782, 9: 2782, 551: 2782}, // 2465 - {2333, 2333, 2333, 2333, 2333, 2333, 9: 2333, 551: 2333}, - {2332, 2332, 2332, 2332, 2332, 2332, 9: 2332, 551: 2332}, - {173: 5273, 564: 762, 914: 5272, 930: 5338}, - {564: 3053, 805: 5339}, - {2778, 2778, 2778, 2778, 2778, 2778, 9: 2778, 551: 2778}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 4054, 3072, 3073, 3071, 828: 5342}, + {2340, 2340, 2340, 2340, 2340, 2340, 9: 2340, 551: 2340, 733: 5345, 735: 5344, 1020: 5343}, + {2783, 2783, 2783, 2783, 2783, 2783, 9: 2783, 551: 2783}, + {2339, 2339, 2339, 2339, 2339, 2339, 9: 2339, 551: 2339}, + {2338, 2338, 2338, 2338, 2338, 2338, 9: 2338, 551: 2338}, // 2470 - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 721: 5275, 777: 5277, 3067, 3068, 3066, 865: 5276, 933: 5341}, - {2779, 2779, 2779, 2779, 2779, 2779, 9: 2779, 551: 2779}, - {192: 5343}, - {201: 5344}, - {536: 5345}, + {160: 5282, 567: 768, 901: 5281, 916: 5347}, + {567: 3058, 805: 5348}, + {2784, 2784, 2784, 2784, 2784, 2784, 9: 2784, 551: 2784}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 721: 5284, 777: 5286, 3072, 3073, 3071, 865: 5285, 934: 5350}, + {2785, 2785, 2785, 2785, 2785, 2785, 9: 2785, 551: 2785}, // 2475 - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3703, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 5346}, - {57: 5347, 548: 3804, 3805, 3810, 589: 3806, 613: 3807, 615: 3808, 3801, 3811, 3800, 3809, 3802, 3803}, - {762, 762, 762, 762, 762, 762, 9: 762, 173: 5273, 551: 762, 914: 5272, 930: 5348}, - {2783, 2783, 2783, 2783, 2783, 2783, 9: 2783, 551: 2783}, - {2: 2130, 2130, 2130, 2130, 2130, 2130, 2130, 10: 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 58: 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 536: 2130, 583: 5367, 889: 5487}, + {193: 5352}, + {201: 5353}, + {536: 5354}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3708, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 5355}, + {57: 5356, 548: 3809, 3810, 3815, 565: 3811, 614: 3812, 3813, 3806, 3816, 3805, 3814, 3807, 3808}, // 2480 - {2786, 2786, 2786, 2786, 2786, 2786, 9: 2786, 551: 2786}, - {2130, 2130, 2130, 2130, 2130, 2130, 9: 2130, 116: 2130, 173: 2130, 536: 2130, 551: 2130, 583: 5367, 889: 5436, 914: 2130}, - {2: 2130, 2130, 2130, 2130, 2130, 2130, 2130, 10: 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 58: 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 583: 5367, 889: 5427}, - {706: 4928, 708: 5354, 5359, 5357, 715: 4929, 751: 5358, 5355, 929: 5356, 1347: 5360}, - {706: 5421}, + {768, 768, 768, 768, 768, 768, 9: 768, 160: 5282, 551: 768, 901: 5281, 916: 5357}, + {2789, 2789, 2789, 2789, 2789, 2789, 9: 2789, 551: 2789}, + {2: 2139, 2139, 2139, 2139, 2139, 2139, 2139, 10: 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 58: 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 536: 2139, 584: 5376, 890: 5496}, + {2792, 2792, 2792, 2792, 2792, 2792, 9: 2792, 551: 2792}, + {2139, 2139, 2139, 2139, 2139, 2139, 9: 2139, 116: 2139, 160: 2139, 536: 2139, 551: 2139, 584: 5376, 890: 5445, 901: 2139}, // 2485 - {2: 2714, 2714, 2714, 2714, 2714, 2714, 2714, 10: 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 58: 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 536: 2714, 706: 4928, 715: 4929, 929: 5376, 1203: 5415}, - {2: 2130, 2130, 2130, 2130, 2130, 2130, 2130, 10: 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 58: 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 536: 2130, 547: 2130, 583: 5367, 889: 5409}, - {2: 2714, 2714, 2714, 2714, 2714, 2714, 2714, 10: 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 58: 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 2714, 536: 2714, 547: 2714, 706: 4928, 715: 4929, 929: 5376, 1203: 5377}, - {706: 5365}, - {536: 5361}, + {2: 2139, 2139, 2139, 2139, 2139, 2139, 2139, 10: 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 58: 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 584: 5376, 890: 5436}, + {706: 4937, 708: 5363, 5368, 5366, 715: 4938, 751: 5367, 5364, 931: 5365, 1345: 5369}, + {706: 5430}, + {2: 2720, 2720, 2720, 2720, 2720, 2720, 2720, 10: 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 58: 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 536: 2720, 706: 4937, 715: 4938, 931: 5385, 1204: 5424}, + {2: 2139, 2139, 2139, 2139, 2139, 2139, 2139, 10: 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 58: 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 536: 2139, 547: 2139, 584: 5376, 890: 5418}, // 2490 - {626, 626, 626, 626, 626, 626, 9: 626, 57: 626, 551: 626}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 5362}, - {57: 5363, 571: 3767, 3765, 3766, 3764, 3762, 806: 3763, 3761}, - {2599, 2599, 2599, 2599, 2599, 2599, 9: 2599, 57: 2599, 190: 4951, 539: 3834, 541: 3833, 551: 2599, 921: 4952, 1050: 5202, 1174: 5364}, - {2554, 2554, 2554, 2554, 2554, 2554, 9: 2554, 57: 2554, 551: 2554}, + {2: 2720, 2720, 2720, 2720, 2720, 2720, 2720, 10: 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 58: 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 536: 2720, 547: 2720, 706: 4937, 715: 4938, 931: 5385, 1204: 5386}, + {706: 5374}, + {536: 5370}, + {633, 633, 633, 633, 633, 633, 9: 633, 57: 633, 551: 633}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 5371}, // 2495 - {2: 2130, 2130, 2130, 2130, 2130, 2130, 2130, 10: 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 58: 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 536: 2130, 583: 5367, 889: 5366}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 536: 2126, 777: 5371, 3067, 3068, 3066, 987: 5370}, - {539: 3834, 541: 3833, 921: 5368}, - {650: 5369}, - {2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 58: 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 536: 2129, 538: 2129, 540: 2129, 547: 2129, 551: 2129, 636: 2129, 914: 2129}, + {57: 5372, 572: 3772, 3770, 3771, 3769, 3767, 806: 3768, 3766}, + {2605, 2605, 2605, 2605, 2605, 2605, 9: 2605, 57: 2605, 191: 4960, 539: 3839, 541: 3838, 551: 2605, 923: 4961, 1051: 5211, 1176: 5373}, + {2560, 2560, 2560, 2560, 2560, 2560, 9: 2560, 57: 2560, 551: 2560}, + {2: 2139, 2139, 2139, 2139, 2139, 2139, 2139, 10: 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 58: 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 536: 2139, 584: 5376, 890: 5375}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 536: 2135, 777: 5380, 3072, 3073, 3071, 988: 5379}, // 2500 - {536: 5372}, - {536: 2125}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 536: 5136, 777: 4046, 3067, 3068, 3066, 827: 5135, 928: 5134, 938: 5373}, - {9: 5145, 57: 5374}, - {712: 5129, 1017: 5375}, + {539: 3839, 541: 3838, 923: 5377}, + {650: 5378}, + {2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 58: 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 536: 2138, 538: 2138, 540: 2138, 547: 2138, 551: 2138, 565: 2138, 636: 2138, 901: 2138}, + {536: 5381}, + {536: 2134}, // 2505 - {2555, 2555, 2555, 2555, 2555, 2555, 9: 2555, 57: 2555, 551: 2555}, - {2: 2713, 2713, 2713, 2713, 2713, 2713, 2713, 10: 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 58: 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 536: 2713, 547: 2713}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 536: 2126, 547: 2126, 777: 5379, 3067, 3068, 3066, 987: 5380, 1059: 5378}, - {536: 5389}, - {104: 5387, 536: 2125, 547: 2125}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 536: 5145, 777: 4054, 3072, 3073, 3071, 828: 5144, 930: 5143, 940: 5382}, + {9: 5154, 57: 5383}, + {712: 5138, 1019: 5384}, + {2561, 2561, 2561, 2561, 2561, 2561, 9: 2561, 57: 2561, 551: 2561}, + {2: 2719, 2719, 2719, 2719, 2719, 2719, 2719, 10: 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 58: 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 2719, 536: 2719, 547: 2719}, // 2510 - {536: 2116, 547: 5381}, - {182: 5384, 209: 5386, 228: 5383, 242: 5385, 1010: 5382}, - {536: 2115}, - {2109, 2109, 2109, 2109, 2109, 2109, 2109, 9: 2109, 19: 2109, 57: 2109, 102: 2109, 104: 2109, 2109, 2109, 2109, 109: 2109, 535: 2109, 2109, 2109, 547: 2109, 551: 2109, 567: 2109}, - {2108, 2108, 2108, 2108, 2108, 2108, 2108, 9: 2108, 19: 2108, 57: 2108, 102: 2108, 104: 2108, 2108, 2108, 2108, 109: 2108, 535: 2108, 2108, 2108, 547: 2108, 551: 2108, 567: 2108}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 536: 2135, 547: 2135, 777: 5388, 3072, 3073, 3071, 988: 5389, 1060: 5387}, + {536: 5398}, + {104: 5396, 536: 2134, 547: 2134}, + {536: 2125, 547: 5390}, + {182: 5393, 209: 5395, 228: 5392, 242: 5394, 1012: 5391}, // 2515 - {2107, 2107, 2107, 2107, 2107, 2107, 2107, 9: 2107, 19: 2107, 57: 2107, 102: 2107, 104: 2107, 2107, 2107, 2107, 109: 2107, 535: 2107, 2107, 2107, 547: 2107, 551: 2107, 567: 2107}, - {2106, 2106, 2106, 2106, 2106, 2106, 2106, 9: 2106, 19: 2106, 57: 2106, 102: 2106, 104: 2106, 2106, 2106, 2106, 109: 2106, 535: 2106, 2106, 2106, 547: 2106, 551: 2106, 567: 2106}, - {182: 5384, 209: 5386, 228: 5383, 242: 5385, 1010: 5388}, - {536: 2114}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 536: 5136, 777: 4046, 3067, 3068, 3066, 827: 5135, 928: 5134, 938: 5390}, + {536: 2124}, + {2118, 2118, 2118, 2118, 2118, 2118, 2118, 9: 2118, 19: 2118, 57: 2118, 102: 2118, 104: 2118, 2118, 2118, 2118, 109: 2118, 535: 2118, 2118, 2118, 547: 2118, 551: 2118, 568: 2118}, + {2117, 2117, 2117, 2117, 2117, 2117, 2117, 9: 2117, 19: 2117, 57: 2117, 102: 2117, 104: 2117, 2117, 2117, 2117, 109: 2117, 535: 2117, 2117, 2117, 547: 2117, 551: 2117, 568: 2117}, + {2116, 2116, 2116, 2116, 2116, 2116, 2116, 9: 2116, 19: 2116, 57: 2116, 102: 2116, 104: 2116, 2116, 2116, 2116, 109: 2116, 535: 2116, 2116, 2116, 547: 2116, 551: 2116, 568: 2116}, + {2115, 2115, 2115, 2115, 2115, 2115, 2115, 9: 2115, 19: 2115, 57: 2115, 102: 2115, 104: 2115, 2115, 2115, 2115, 109: 2115, 535: 2115, 2115, 2115, 547: 2115, 551: 2115, 568: 2115}, // 2520 - {9: 5145, 57: 5391}, - {2124, 2124, 2124, 2124, 2124, 2124, 2124, 9: 2124, 19: 2124, 57: 2124, 104: 2124, 2124, 2124, 2124, 109: 2124, 537: 2124, 547: 2124, 551: 2124, 989: 5392}, - {2556, 2556, 2556, 2556, 2556, 2556, 5397, 9: 2556, 19: 5394, 57: 2556, 104: 5401, 5246, 4948, 5247, 109: 4947, 537: 5396, 547: 5400, 551: 2556, 965: 5398, 967: 5395, 977: 5399, 988: 5393}, - {2123, 2123, 2123, 2123, 2123, 2123, 2123, 9: 2123, 19: 2123, 57: 2123, 102: 2123, 104: 2123, 2123, 2123, 2123, 109: 2123, 537: 2123, 547: 2123, 551: 2123, 567: 2123}, - {561: 4610, 564: 2329, 808: 5407}, + {182: 5393, 209: 5395, 228: 5392, 242: 5394, 1012: 5397}, + {536: 2123}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 536: 5145, 777: 4054, 3072, 3073, 3071, 828: 5144, 930: 5143, 940: 5399}, + {9: 5154, 57: 5400}, + {2133, 2133, 2133, 2133, 2133, 2133, 2133, 9: 2133, 19: 2133, 57: 2133, 104: 2133, 2133, 2133, 2133, 109: 2133, 537: 2133, 547: 2133, 551: 2133, 990: 5401}, // 2525 - {2121, 2121, 2121, 2121, 2121, 2121, 2121, 9: 2121, 19: 2121, 57: 2121, 102: 2121, 104: 2121, 2121, 2121, 2121, 109: 2121, 537: 2121, 547: 2121, 551: 2121, 567: 2121}, - {418: 5405}, - {538: 5404}, - {2118, 2118, 2118, 2118, 2118, 2118, 2118, 9: 2118, 19: 2118, 57: 2118, 102: 2118, 104: 2118, 2118, 2118, 2118, 109: 2118, 537: 2118, 547: 2118, 551: 2118, 567: 2118}, - {2117, 2117, 2117, 2117, 2117, 2117, 2117, 9: 2117, 19: 2117, 57: 2117, 102: 2117, 104: 2117, 2117, 2117, 2117, 109: 2117, 537: 2117, 547: 2117, 551: 2117, 567: 2117}, + {2562, 2562, 2562, 2562, 2562, 2562, 5406, 9: 2562, 19: 5403, 57: 2562, 104: 5410, 5255, 4957, 5256, 109: 4956, 537: 5405, 547: 5409, 551: 2562, 967: 5407, 969: 5404, 978: 5408, 989: 5402}, + {2132, 2132, 2132, 2132, 2132, 2132, 2132, 9: 2132, 19: 2132, 57: 2132, 102: 2132, 104: 2132, 2132, 2132, 2132, 109: 2132, 537: 2132, 547: 2132, 551: 2132, 568: 2132}, + {562: 4618, 567: 2335, 808: 5416}, + {2130, 2130, 2130, 2130, 2130, 2130, 2130, 9: 2130, 19: 2130, 57: 2130, 102: 2130, 104: 2130, 2130, 2130, 2130, 109: 2130, 537: 2130, 547: 2130, 551: 2130, 568: 2130}, + {418: 5414}, // 2530 - {182: 5384, 209: 5386, 228: 5383, 242: 5385, 1010: 5403}, - {182: 5384, 209: 5386, 228: 5383, 242: 5385, 1010: 5402}, - {2110, 2110, 2110, 2110, 2110, 2110, 2110, 9: 2110, 19: 2110, 57: 2110, 102: 2110, 104: 2110, 2110, 2110, 2110, 109: 2110, 535: 2110, 537: 2110, 547: 2110, 551: 2110, 567: 2110}, - {2111, 2111, 2111, 2111, 2111, 2111, 2111, 9: 2111, 19: 2111, 57: 2111, 102: 2111, 104: 2111, 2111, 2111, 2111, 109: 2111, 535: 2111, 537: 2111, 547: 2111, 551: 2111, 567: 2111}, - {2119, 2119, 2119, 2119, 2119, 2119, 2119, 9: 2119, 19: 2119, 57: 2119, 102: 2119, 104: 2119, 2119, 2119, 2119, 109: 2119, 537: 2119, 547: 2119, 551: 2119, 567: 2119}, + {538: 5413}, + {2127, 2127, 2127, 2127, 2127, 2127, 2127, 9: 2127, 19: 2127, 57: 2127, 102: 2127, 104: 2127, 2127, 2127, 2127, 109: 2127, 537: 2127, 547: 2127, 551: 2127, 568: 2127}, + {2126, 2126, 2126, 2126, 2126, 2126, 2126, 9: 2126, 19: 2126, 57: 2126, 102: 2126, 104: 2126, 2126, 2126, 2126, 109: 2126, 537: 2126, 547: 2126, 551: 2126, 568: 2126}, + {182: 5393, 209: 5395, 228: 5392, 242: 5394, 1012: 5412}, + {182: 5393, 209: 5395, 228: 5392, 242: 5394, 1012: 5411}, // 2535 - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 5406, 3067, 3068, 3066}, - {2120, 2120, 2120, 2120, 2120, 2120, 2120, 9: 2120, 19: 2120, 57: 2120, 102: 2120, 104: 2120, 2120, 2120, 2120, 109: 2120, 537: 2120, 547: 2120, 551: 2120, 567: 2120}, - {564: 3053, 805: 3888, 817: 5408}, - {2122, 2122, 2122, 2122, 2122, 2122, 2122, 9: 2122, 19: 2122, 57: 2122, 102: 2122, 104: 2122, 2122, 2122, 2122, 109: 2122, 537: 2122, 547: 2122, 551: 2122, 567: 2122}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 536: 2126, 547: 2126, 777: 5379, 3067, 3068, 3066, 987: 5380, 1059: 5410}, + {2119, 2119, 2119, 2119, 2119, 2119, 2119, 9: 2119, 19: 2119, 57: 2119, 102: 2119, 104: 2119, 2119, 2119, 2119, 109: 2119, 535: 2119, 537: 2119, 547: 2119, 551: 2119, 568: 2119}, + {2120, 2120, 2120, 2120, 2120, 2120, 2120, 9: 2120, 19: 2120, 57: 2120, 102: 2120, 104: 2120, 2120, 2120, 2120, 109: 2120, 535: 2120, 537: 2120, 547: 2120, 551: 2120, 568: 2120}, + {2128, 2128, 2128, 2128, 2128, 2128, 2128, 9: 2128, 19: 2128, 57: 2128, 102: 2128, 104: 2128, 2128, 2128, 2128, 109: 2128, 537: 2128, 547: 2128, 551: 2128, 568: 2128}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 5415, 3072, 3073, 3071}, + {2129, 2129, 2129, 2129, 2129, 2129, 2129, 9: 2129, 19: 2129, 57: 2129, 102: 2129, 104: 2129, 2129, 2129, 2129, 109: 2129, 537: 2129, 547: 2129, 551: 2129, 568: 2129}, // 2540 - {536: 5411}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 536: 5136, 777: 4046, 3067, 3068, 3066, 827: 5135, 928: 5134, 938: 5412}, - {9: 5145, 57: 5413}, - {2124, 2124, 2124, 2124, 2124, 2124, 2124, 9: 2124, 19: 2124, 57: 2124, 104: 2124, 2124, 2124, 2124, 109: 2124, 537: 2124, 547: 2124, 551: 2124, 989: 5414}, - {2557, 2557, 2557, 2557, 2557, 2557, 5397, 9: 2557, 19: 5394, 57: 2557, 104: 5401, 5246, 4948, 5247, 109: 4947, 537: 5396, 547: 5400, 551: 2557, 965: 5398, 967: 5395, 977: 5399, 988: 5393}, + {567: 3058, 805: 3893, 820: 5417}, + {2131, 2131, 2131, 2131, 2131, 2131, 2131, 9: 2131, 19: 2131, 57: 2131, 102: 2131, 104: 2131, 2131, 2131, 2131, 109: 2131, 537: 2131, 547: 2131, 551: 2131, 568: 2131}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 536: 2135, 547: 2135, 777: 5388, 3072, 3073, 3071, 988: 5389, 1060: 5419}, + {536: 5420}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 536: 5145, 777: 4054, 3072, 3073, 3071, 828: 5144, 930: 5143, 940: 5421}, // 2545 - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 536: 2126, 777: 5371, 3067, 3068, 3066, 987: 5416}, - {536: 5417}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 536: 5136, 777: 4046, 3067, 3068, 3066, 827: 5135, 928: 5134, 938: 5418}, - {9: 5145, 57: 5419}, - {2124, 2124, 2124, 2124, 2124, 2124, 2124, 9: 2124, 19: 2124, 57: 2124, 104: 2124, 2124, 2124, 2124, 109: 2124, 537: 2124, 547: 2124, 551: 2124, 989: 5420}, + {9: 5154, 57: 5422}, + {2133, 2133, 2133, 2133, 2133, 2133, 2133, 9: 2133, 19: 2133, 57: 2133, 104: 2133, 2133, 2133, 2133, 109: 2133, 537: 2133, 547: 2133, 551: 2133, 990: 5423}, + {2563, 2563, 2563, 2563, 2563, 2563, 5406, 9: 2563, 19: 5403, 57: 2563, 104: 5410, 5255, 4957, 5256, 109: 4956, 537: 5405, 547: 5409, 551: 2563, 967: 5407, 969: 5404, 978: 5408, 989: 5402}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 536: 2135, 777: 5380, 3072, 3073, 3071, 988: 5425}, + {536: 5426}, // 2550 - {2558, 2558, 2558, 2558, 2558, 2558, 5397, 9: 2558, 19: 5394, 57: 2558, 104: 5401, 5246, 4948, 5247, 109: 4947, 537: 5396, 547: 5400, 551: 2558, 965: 5398, 967: 5395, 977: 5399, 988: 5393}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 536: 2126, 547: 2126, 777: 5379, 3067, 3068, 3066, 987: 5380, 1059: 5422}, - {536: 5423}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 536: 5136, 777: 4046, 3067, 3068, 3066, 827: 5135, 928: 5134, 938: 5424}, - {9: 5145, 57: 5425}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 536: 5145, 777: 4054, 3072, 3073, 3071, 828: 5144, 930: 5143, 940: 5427}, + {9: 5154, 57: 5428}, + {2133, 2133, 2133, 2133, 2133, 2133, 2133, 9: 2133, 19: 2133, 57: 2133, 104: 2133, 2133, 2133, 2133, 109: 2133, 537: 2133, 547: 2133, 551: 2133, 990: 5429}, + {2564, 2564, 2564, 2564, 2564, 2564, 5406, 9: 2564, 19: 5403, 57: 2564, 104: 5410, 5255, 4957, 5256, 109: 4956, 537: 5405, 547: 5409, 551: 2564, 967: 5407, 969: 5404, 978: 5408, 989: 5402}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 536: 2135, 547: 2135, 777: 5388, 3072, 3073, 3071, 988: 5389, 1060: 5431}, // 2555 - {2124, 2124, 2124, 2124, 2124, 2124, 2124, 9: 2124, 19: 2124, 57: 2124, 104: 2124, 2124, 2124, 2124, 109: 2124, 537: 2124, 547: 2124, 551: 2124, 989: 5426}, - {2559, 2559, 2559, 2559, 2559, 2559, 5397, 9: 2559, 19: 5394, 57: 2559, 104: 5401, 5246, 4948, 5247, 109: 4947, 537: 5396, 547: 5400, 551: 2559, 965: 5398, 967: 5395, 977: 5399, 988: 5393}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 5428, 3067, 3068, 3066}, - {286: 5430, 294: 5432, 297: 5431, 1293: 5429}, - {536: 5433}, + {536: 5432}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 536: 5145, 777: 4054, 3072, 3073, 3071, 828: 5144, 930: 5143, 940: 5433}, + {9: 5154, 57: 5434}, + {2133, 2133, 2133, 2133, 2133, 2133, 2133, 9: 2133, 19: 2133, 57: 2133, 104: 2133, 2133, 2133, 2133, 109: 2133, 537: 2133, 547: 2133, 551: 2133, 990: 5435}, + {2565, 2565, 2565, 2565, 2565, 2565, 5406, 9: 2565, 19: 5403, 57: 2565, 104: 5410, 5255, 4957, 5256, 109: 4956, 537: 5405, 547: 5409, 551: 2565, 967: 5407, 969: 5404, 978: 5408, 989: 5402}, // 2560 - {57: 2504, 536: 2504}, - {57: 2503, 536: 2503}, - {57: 2502, 536: 2502}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 4046, 3067, 3068, 3066, 827: 4047, 912: 5434}, - {9: 4049, 57: 5435}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 5437, 3072, 3073, 3071}, + {287: 5439, 295: 5441, 298: 5440, 1292: 5438}, + {536: 5442}, + {57: 2510, 536: 2510}, + {57: 2509, 536: 2509}, // 2565 - {2782, 2782, 2782, 2782, 2782, 2782, 9: 2782, 551: 2782}, - {762, 762, 762, 762, 762, 762, 9: 762, 116: 762, 173: 5273, 536: 762, 551: 762, 914: 5272, 930: 5437}, - {2425, 2425, 2425, 2425, 2425, 2425, 9: 2425, 116: 5439, 536: 5440, 551: 2425, 1237: 5438}, - {2785, 2785, 2785, 2785, 2785, 2785, 9: 2785, 551: 2785}, - {564: 3053, 805: 5486}, + {57: 2508, 536: 2508}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 4054, 3072, 3073, 3071, 828: 4055, 912: 5443}, + {9: 4057, 57: 5444}, + {2788, 2788, 2788, 2788, 2788, 2788, 9: 2788, 551: 2788}, + {768, 768, 768, 768, 768, 768, 9: 768, 116: 768, 160: 5282, 536: 768, 551: 768, 901: 5281, 916: 5446}, // 2570 - {551: 5443, 1073: 5442, 1236: 5441}, - {9: 5484, 57: 5483}, - {9: 2423, 57: 2423}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 5444, 3067, 3068, 3066}, - {6: 2402, 2402, 9: 2402, 18: 2402, 20: 2402, 22: 2402, 2402, 2402, 2402, 2402, 2402, 57: 2402, 189: 5449, 262: 5448, 536: 2402, 540: 5447, 552: 5446, 715: 2402, 1421: 5445}, + {2431, 2431, 2431, 2431, 2431, 2431, 9: 2431, 116: 5448, 536: 5449, 551: 2431, 1238: 5447}, + {2791, 2791, 2791, 2791, 2791, 2791, 9: 2791, 551: 2791}, + {567: 3058, 805: 5495}, + {551: 5452, 1075: 5451, 1237: 5450}, + {9: 5493, 57: 5492}, // 2575 - {6: 2415, 2415, 9: 2415, 18: 2415, 20: 2415, 22: 2415, 2415, 2415, 2415, 2415, 2415, 57: 2415, 536: 2415, 715: 2415, 1072: 5470}, - {192: 5450, 611: 5451}, - {6: 2399, 2399, 9: 2399, 18: 2399, 20: 2399, 22: 2399, 2399, 2399, 2399, 2399, 2399, 57: 2399, 536: 2399, 715: 2399}, - {6: 2397, 2397, 9: 2397, 18: 2397, 20: 2397, 22: 2397, 2397, 2397, 2397, 2397, 2397, 57: 2397, 536: 2397, 715: 2397}, - {6: 2396, 2396, 9: 2396, 18: 2396, 20: 2396, 22: 2396, 2396, 2396, 2396, 2396, 2396, 57: 2396, 536: 2396, 715: 2396}, + {9: 2429, 57: 2429}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 5453, 3072, 3073, 3071}, + {6: 2408, 2408, 9: 2408, 18: 2408, 20: 2408, 22: 2408, 2408, 2408, 2408, 2408, 2408, 57: 2408, 190: 5458, 262: 5457, 536: 2408, 540: 5456, 552: 5455, 715: 2408, 1420: 5454}, + {6: 2421, 2421, 9: 2421, 18: 2421, 20: 2421, 22: 2421, 2421, 2421, 2421, 2421, 2421, 57: 2421, 536: 2421, 715: 2421, 1074: 5479}, + {193: 5459, 611: 5460}, // 2580 - {201: 5460}, - {536: 5452}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 5454, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3703, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 5455, 1153: 5456, 1355: 5453}, - {9: 5458, 57: 5457}, - {9: 2216, 57: 2216, 536: 3922}, + {6: 2405, 2405, 9: 2405, 18: 2405, 20: 2405, 22: 2405, 2405, 2405, 2405, 2405, 2405, 57: 2405, 536: 2405, 715: 2405}, + {6: 2403, 2403, 9: 2403, 18: 2403, 20: 2403, 22: 2403, 2403, 2403, 2403, 2403, 2403, 57: 2403, 536: 2403, 715: 2403}, + {6: 2402, 2402, 9: 2402, 18: 2402, 20: 2402, 22: 2402, 2402, 2402, 2402, 2402, 2402, 57: 2402, 536: 2402, 715: 2402}, + {201: 5469}, + {536: 5461}, // 2585 - {9: 2215, 57: 2215, 548: 3804, 3805, 3810, 589: 3806, 613: 3807, 615: 3808, 3801, 3811, 3800, 3809, 3802, 3803}, - {9: 2199, 57: 2199}, - {6: 2398, 2398, 9: 2398, 18: 2398, 20: 2398, 22: 2398, 2398, 2398, 2398, 2398, 2398, 57: 2398, 536: 2398, 715: 2398}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 5454, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3703, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 5455, 1153: 5459}, - {9: 2198, 57: 2198}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 5463, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3708, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 5464, 1156: 5465, 1353: 5462}, + {9: 5467, 57: 5466}, + {9: 2225, 57: 2225, 536: 3927}, + {9: 2224, 57: 2224, 548: 3809, 3810, 3815, 565: 3811, 614: 3812, 3813, 3806, 3816, 3805, 3814, 3807, 3808}, + {9: 2208, 57: 2208}, // 2590 - {536: 5462, 725: 5461}, - {6: 2401, 2401, 9: 2401, 18: 2401, 20: 2401, 22: 2401, 2401, 2401, 2401, 2401, 2401, 57: 2401, 536: 2401, 715: 2401}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3703, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 725: 5464, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 5465, 1218: 5466, 1402: 5463}, - {9: 5468, 57: 5467}, - {9: 2214, 57: 2214}, + {6: 2404, 2404, 9: 2404, 18: 2404, 20: 2404, 22: 2404, 2404, 2404, 2404, 2404, 2404, 57: 2404, 536: 2404, 715: 2404}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 5463, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3708, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 5464, 1156: 5468}, + {9: 2207, 57: 2207}, + {536: 5471, 725: 5470}, + {6: 2407, 2407, 9: 2407, 18: 2407, 20: 2407, 22: 2407, 2407, 2407, 2407, 2407, 2407, 57: 2407, 536: 2407, 715: 2407}, // 2595 - {9: 2213, 57: 2213, 548: 3804, 3805, 3810, 589: 3806, 613: 3807, 615: 3808, 3801, 3811, 3800, 3809, 3802, 3803}, - {9: 2201, 57: 2201}, - {6: 2400, 2400, 9: 2400, 18: 2400, 20: 2400, 22: 2400, 2400, 2400, 2400, 2400, 2400, 57: 2400, 536: 2400, 715: 2400}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3703, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 725: 5464, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 5465, 1218: 5469}, - {9: 2200, 57: 2200}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3708, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 725: 5473, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 5474, 1218: 5475, 1401: 5472}, + {9: 5477, 57: 5476}, + {9: 2223, 57: 2223}, + {9: 2222, 57: 2222, 548: 3809, 3810, 3815, 565: 3811, 614: 3812, 3813, 3806, 3816, 3805, 3814, 3807, 3808}, + {9: 2210, 57: 2210}, // 2600 - {6: 4747, 5474, 9: 2420, 18: 4703, 20: 4755, 22: 4751, 4748, 4750, 4753, 4754, 4756, 57: 2420, 536: 5472, 715: 4752, 871: 4757, 916: 5473, 1482: 5471}, - {9: 2421, 57: 2421}, - {115: 5477, 1294: 5476, 1481: 5475}, - {2414, 2414, 6: 2414, 2414, 9: 2414, 18: 2414, 20: 2414, 22: 2414, 2414, 2414, 2414, 2414, 2414, 57: 2414, 536: 2414, 715: 2414}, - {23: 4899}, + {6: 2406, 2406, 9: 2406, 18: 2406, 20: 2406, 22: 2406, 2406, 2406, 2406, 2406, 2406, 57: 2406, 536: 2406, 715: 2406}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3708, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 725: 5473, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 5474, 1218: 5478}, + {9: 2209, 57: 2209}, + {6: 4756, 5483, 9: 2426, 18: 4712, 20: 4764, 22: 4757, 4760, 4759, 4762, 4763, 4765, 57: 2426, 536: 5481, 715: 4761, 871: 4766, 918: 5482, 1482: 5480}, + {9: 2427, 57: 2427}, // 2605 - {9: 5481, 57: 5480}, - {9: 2418, 57: 2418}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 5478, 3067, 3068, 3066}, - {6: 2415, 2415, 9: 2415, 18: 2415, 20: 2415, 22: 2415, 2415, 2415, 2415, 2415, 2415, 57: 2415, 715: 2415, 1072: 5479}, - {6: 4747, 5474, 9: 2416, 18: 4703, 20: 4755, 22: 4751, 4748, 4750, 4753, 4754, 4756, 57: 2416, 715: 4752, 871: 4757, 916: 5473}, + {115: 5486, 1293: 5485, 1481: 5484}, + {2420, 2420, 6: 2420, 2420, 9: 2420, 18: 2420, 20: 2420, 22: 2420, 2420, 2420, 2420, 2420, 2420, 57: 2420, 536: 2420, 715: 2420}, + {22: 4908}, + {9: 5490, 57: 5489}, + {9: 2424, 57: 2424}, // 2610 - {9: 2419, 57: 2419}, - {115: 5477, 1294: 5482}, - {9: 2417, 57: 2417}, - {2424, 2424, 2424, 2424, 2424, 2424, 9: 2424, 535: 2424, 2424, 2424, 542: 2424, 551: 2424, 2424, 554: 2424, 557: 2424, 614: 2424, 701: 2424}, - {551: 5443, 1073: 5485}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 5487, 3072, 3073, 3071}, + {6: 2421, 2421, 9: 2421, 18: 2421, 20: 2421, 22: 2421, 2421, 2421, 2421, 2421, 2421, 57: 2421, 715: 2421, 1074: 5488}, + {6: 4756, 5483, 9: 2422, 18: 4712, 20: 4764, 22: 4757, 4760, 4759, 4762, 4763, 4765, 57: 2422, 715: 4761, 871: 4766, 918: 5482}, + {9: 2425, 57: 2425}, + {115: 5486, 1293: 5491}, // 2615 - {9: 2422, 57: 2422}, - {2784, 2784, 2784, 2784, 2784, 2784, 9: 2784, 551: 2784}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 536: 5489, 777: 4046, 3067, 3068, 3066, 827: 4974, 959: 5488}, - {2710, 2710, 2710, 2710, 2710, 2710, 9: 2710, 5254, 5255, 551: 2710, 1039: 5497}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 706: 2701, 708: 2701, 2701, 2701, 5107, 715: 2701, 751: 2701, 2701, 777: 4046, 3067, 3068, 3066, 827: 4974, 934: 5353, 959: 5491, 1008: 5492, 1091: 5493, 1297: 5490}, + {9: 2423, 57: 2423}, + {2430, 2430, 2430, 2430, 2430, 2430, 9: 2430, 535: 2430, 2430, 2430, 542: 2430, 551: 2430, 2430, 554: 2430, 557: 2430, 613: 2430, 660: 2430}, + {551: 5452, 1075: 5494}, + {9: 2428, 57: 2428}, + {2790, 2790, 2790, 2790, 2790, 2790, 9: 2790, 551: 2790}, // 2620 - {9: 5495, 57: 5494}, - {9: 623, 57: 623}, - {9: 622, 57: 622}, - {9: 621, 57: 621}, - {2787, 2787, 2787, 2787, 2787, 2787, 9: 2787, 551: 2787}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 536: 5498, 777: 4054, 3072, 3073, 3071, 828: 4983, 961: 5497}, + {2716, 2716, 2716, 2716, 2716, 2716, 9: 2716, 5263, 5264, 551: 2716, 1040: 5506}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 706: 2707, 708: 2707, 2707, 2707, 5116, 715: 2707, 751: 2707, 2707, 777: 4054, 3072, 3073, 3071, 828: 4983, 936: 5362, 961: 5500, 1010: 5501, 1093: 5502, 1296: 5499}, + {9: 5504, 57: 5503}, + {9: 630, 57: 630}, // 2625 - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 706: 2701, 708: 2701, 2701, 2701, 5107, 715: 2701, 751: 2701, 2701, 777: 4046, 3067, 3068, 3066, 827: 4974, 934: 5353, 959: 5491, 1008: 5492, 1091: 5496}, - {9: 620, 57: 620}, - {2788, 2788, 2788, 2788, 2788, 2788, 9: 2788, 551: 2788}, - {16: 4440, 558: 4441, 714: 4439, 859: 5499}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 538: 3758, 540: 5501, 591: 4376, 777: 3759, 3067, 3068, 3066, 811: 4375, 911: 5500}, + {9: 629, 57: 629}, + {9: 628, 57: 628}, + {2793, 2793, 2793, 2793, 2793, 2793, 9: 2793, 551: 2793}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 706: 2707, 708: 2707, 2707, 2707, 5116, 715: 2707, 751: 2707, 2707, 777: 4054, 3072, 3073, 3071, 828: 4983, 936: 5362, 961: 5500, 1010: 5501, 1093: 5505}, + {9: 627, 57: 627}, // 2630 - {444, 444, 444, 444, 444, 444, 9: 444, 543: 5503, 551: 444, 1227: 5505}, - {444, 444, 444, 444, 444, 444, 9: 444, 543: 5503, 551: 444, 1227: 5502}, - {2789, 2789, 2789, 2789, 2789, 2789, 9: 2789, 551: 2789}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 538: 3758, 591: 3757, 777: 3759, 3067, 3068, 3066, 811: 3756, 980: 5504}, - {443, 443, 443, 443, 443, 443, 9: 443, 551: 443}, + {2794, 2794, 2794, 2794, 2794, 2794, 9: 2794, 551: 2794}, + {16: 4448, 558: 4449, 714: 4447, 859: 5508}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 538: 3763, 540: 5510, 591: 4384, 777: 3764, 3072, 3073, 3071, 811: 4383, 911: 5509}, + {451, 451, 451, 451, 451, 451, 9: 451, 543: 5512, 551: 451, 1227: 5514}, + {451, 451, 451, 451, 451, 451, 9: 451, 543: 5512, 551: 451, 1227: 5511}, // 2635 - {2790, 2790, 2790, 2790, 2790, 2790, 9: 2790, 551: 2790}, - {224: 5518}, - {202: 5508}, - {224: 5509}, - {564: 3053, 805: 3888, 817: 5510}, + {2795, 2795, 2795, 2795, 2795, 2795, 9: 2795, 551: 2795}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 538: 3763, 591: 3762, 777: 3764, 3072, 3073, 3071, 811: 3761, 981: 5513}, + {450, 450, 450, 450, 450, 450, 9: 450, 551: 450}, + {2796, 2796, 2796, 2796, 2796, 2796, 9: 2796, 551: 2796}, + {217: 5527}, // 2640 - {2795, 2795, 2795, 2795, 2795, 2795, 9: 2795, 221: 5511, 551: 2795, 1063: 5512}, - {319: 5513}, - {2791, 2791, 2791, 2791, 2791, 2791, 9: 2791, 551: 2791}, - {538: 5515, 1479: 5514}, - {2794, 2794, 2794, 2794, 2794, 2794, 9: 5516, 16: 2794, 18: 2794, 21: 2794, 540: 2794, 543: 2794, 551: 2794, 558: 2794, 560: 2794, 714: 2794}, + {202: 5517}, + {217: 5518}, + {567: 3058, 805: 3893, 820: 5519}, + {2801, 2801, 2801, 2801, 2801, 2801, 9: 2801, 222: 5520, 551: 2801, 1065: 5521}, + {321: 5522}, // 2645 - {442, 442, 442, 442, 442, 442, 9: 442, 16: 442, 18: 442, 21: 442, 540: 442, 543: 442, 551: 442, 558: 442, 560: 442, 714: 442}, - {538: 5517}, - {441, 441, 441, 441, 441, 441, 9: 441, 16: 441, 18: 441, 21: 441, 540: 441, 543: 441, 551: 441, 558: 441, 560: 441, 714: 441}, - {564: 3053, 805: 3888, 817: 5519}, - {2795, 2795, 2795, 2795, 2795, 2795, 9: 2795, 221: 5511, 551: 2795, 1063: 5520}, + {2797, 2797, 2797, 2797, 2797, 2797, 9: 2797, 551: 2797}, + {538: 5524, 1479: 5523}, + {2800, 2800, 2800, 2800, 2800, 2800, 9: 5525, 16: 2800, 18: 2800, 21: 2800, 540: 2800, 543: 2800, 551: 2800, 558: 2800, 561: 2800, 714: 2800}, + {449, 449, 449, 449, 449, 449, 9: 449, 16: 449, 18: 449, 21: 449, 540: 449, 543: 449, 551: 449, 558: 449, 561: 449, 714: 449}, + {538: 5526}, // 2650 - {2792, 2792, 2792, 2792, 2792, 2792, 9: 2792, 551: 2792}, - {8: 579, 29: 579}, - {573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 15: 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 535: 573, 573, 573, 540: 573, 542: 573, 573, 573, 551: 573, 573, 554: 573, 557: 573, 573, 570: 573, 614: 573, 701: 573, 714: 573, 573}, - {6: 4747, 4749, 580, 15: 4766, 2459, 4764, 4703, 4768, 4755, 4784, 4751, 4748, 4750, 4753, 4754, 4756, 4763, 580, 4774, 4775, 4785, 4761, 4762, 4767, 4769, 4781, 4780, 4789, 4782, 4779, 4772, 4777, 4778, 4771, 4773, 4776, 4765, 4786, 4787, 540: 4746, 543: 2459, 4783, 558: 2459, 570: 5521, 714: 2459, 4752, 871: 4757, 897: 4759, 916: 4758, 937: 4760, 943: 4770, 947: 5524}, - {572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 15: 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 535: 572, 572, 572, 540: 572, 542: 572, 572, 572, 551: 572, 572, 554: 572, 557: 572, 572, 570: 572, 614: 572, 701: 572, 714: 572, 572}, + {448, 448, 448, 448, 448, 448, 9: 448, 16: 448, 18: 448, 21: 448, 540: 448, 543: 448, 551: 448, 558: 448, 561: 448, 714: 448}, + {567: 3058, 805: 3893, 820: 5528}, + {2801, 2801, 2801, 2801, 2801, 2801, 9: 2801, 222: 5520, 551: 2801, 1065: 5529}, + {2798, 2798, 2798, 2798, 2798, 2798, 9: 2798, 551: 2798}, + {8: 586, 29: 586}, // 2655 - {538: 5527, 540: 5526}, - {2805, 2805, 2805, 2805, 2805, 2805, 9: 2805, 551: 2805}, - {2804, 2804, 2804, 2804, 2804, 2804, 9: 2804, 551: 2804}, - {538: 5530, 540: 5529}, - {2807, 2807, 2807, 2807, 2807, 2807, 9: 2807, 551: 2807}, + {580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 15: 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 535: 580, 580, 580, 540: 580, 542: 580, 580, 580, 551: 580, 580, 554: 580, 557: 580, 580, 571: 580, 613: 580, 660: 580, 714: 580, 580}, + {6: 4756, 4758, 587, 15: 4775, 2465, 4773, 4712, 4777, 4764, 4793, 4757, 4760, 4759, 4762, 4763, 4765, 4772, 587, 4783, 4784, 4794, 4770, 4771, 4776, 4778, 4790, 4789, 4798, 4791, 4788, 4781, 4786, 4787, 4780, 4782, 4785, 4774, 4795, 4796, 540: 4755, 543: 2465, 4792, 558: 2465, 571: 5530, 714: 2465, 4761, 871: 4766, 897: 4768, 918: 4767, 939: 4769, 945: 4779, 950: 5533}, + {579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 15: 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 535: 579, 579, 579, 540: 579, 542: 579, 579, 579, 551: 579, 579, 554: 579, 557: 579, 579, 571: 579, 613: 579, 660: 579, 714: 579, 579}, + {538: 5536, 540: 5535}, + {2811, 2811, 2811, 2811, 2811, 2811, 9: 2811, 551: 2811}, // 2660 - {2806, 2806, 2806, 2806, 2806, 2806, 9: 2806, 551: 2806}, - {2: 2329, 2329, 2329, 2329, 2329, 2329, 2329, 10: 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 58: 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 538: 2329, 540: 2329, 560: 5533, 4610, 808: 5532}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 538: 5535, 540: 5537, 777: 5538, 3067, 3068, 3066, 995: 5536}, - {540: 5534}, - {2808, 2808, 2808, 2808, 2808, 2808, 2808, 2808, 2808, 2808, 15: 2808, 2808, 2808, 2808, 2808, 2808, 2808, 2808, 2808, 2808, 2808, 2808, 2808, 2808, 2808, 2808, 2808, 2808, 2808, 2808, 2808, 2808, 2808, 2808, 2808, 2808, 2808, 2808, 2808, 2808, 2808, 2808, 2808, 2808, 2808, 2808, 57: 2808, 535: 2808, 2808, 2808, 540: 2808, 542: 2808, 2808, 2808, 551: 2808, 2808, 554: 2808, 557: 2808, 2808, 560: 2808, 570: 2808, 614: 2808, 701: 2808, 714: 2808, 2808}, + {2810, 2810, 2810, 2810, 2810, 2810, 9: 2810, 551: 2810}, + {538: 5539, 540: 5538}, + {2813, 2813, 2813, 2813, 2813, 2813, 9: 2813, 551: 2813}, + {2812, 2812, 2812, 2812, 2812, 2812, 9: 2812, 551: 2812}, + {2: 2335, 2335, 2335, 2335, 2335, 2335, 2335, 10: 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 58: 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 538: 2335, 540: 2335, 561: 5542, 4618, 808: 5541}, // 2665 - {2811, 2811, 2811, 2811, 2811, 2811, 2811, 2811, 2811, 2811, 15: 2811, 2811, 2811, 2811, 2811, 2811, 2811, 2811, 2811, 2811, 2811, 2811, 2811, 2811, 2811, 2811, 2811, 2811, 2811, 2811, 2811, 2811, 2811, 2811, 2811, 2811, 2811, 2811, 2811, 2811, 2811, 2811, 2811, 2811, 2811, 2811, 57: 2811, 535: 2811, 2811, 2811, 540: 2811, 542: 2811, 2811, 2811, 551: 2811, 2811, 554: 2811, 557: 2811, 2811, 560: 2811, 570: 2811, 614: 2811, 701: 2811, 714: 2811, 2811}, - {2810, 2810, 2810, 2810, 2810, 2810, 2810, 2810, 2810, 2810, 15: 2810, 2810, 2810, 2810, 2810, 2810, 2810, 2810, 2810, 2810, 2810, 2810, 2810, 2810, 2810, 2810, 2810, 2810, 2810, 2810, 2810, 2810, 2810, 2810, 2810, 2810, 2810, 2810, 2810, 2810, 2810, 2810, 2810, 2810, 2810, 2810, 57: 2810, 535: 2810, 2810, 2810, 540: 2810, 542: 2810, 2810, 2810, 551: 2810, 2810, 554: 2810, 557: 2810, 2810, 560: 2810, 570: 2810, 614: 2810, 701: 2810, 714: 2810, 2810}, - {2809, 2809, 2809, 2809, 2809, 2809, 2809, 2809, 2809, 2809, 15: 2809, 2809, 2809, 2809, 2809, 2809, 2809, 2809, 2809, 2809, 2809, 2809, 2809, 2809, 2809, 2809, 2809, 2809, 2809, 2809, 2809, 2809, 2809, 2809, 2809, 2809, 2809, 2809, 2809, 2809, 2809, 2809, 2809, 2809, 2809, 2809, 57: 2809, 535: 2809, 2809, 2809, 540: 2809, 542: 2809, 2809, 2809, 551: 2809, 2809, 554: 2809, 557: 2809, 2809, 560: 2809, 570: 2809, 614: 2809, 701: 2809, 714: 2809, 2809}, - {2477, 2477, 2477, 2477, 2477, 2477, 2477, 2477, 2477, 2477, 15: 2477, 2477, 2477, 2477, 2477, 2477, 2477, 2477, 2477, 2477, 2477, 2477, 2477, 2477, 2477, 2477, 2477, 2477, 2477, 2477, 2477, 2477, 2477, 2477, 2477, 2477, 2477, 2477, 2477, 2477, 2477, 2477, 2477, 2477, 2477, 2477, 57: 2477, 108: 2477, 119: 2477, 2477, 2477, 2477, 2477, 2477, 2477, 2477, 128: 2477, 2477, 2477, 535: 2477, 2477, 2477, 540: 2477, 542: 2477, 2477, 2477, 551: 2477, 2477, 554: 2477, 557: 2477, 2477, 560: 2477, 570: 2477, 614: 2477, 701: 2477, 714: 2477, 2477}, - {224: 5544}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 538: 5544, 540: 5546, 777: 5547, 3072, 3073, 3071, 996: 5545}, + {540: 5543}, + {2814, 2814, 2814, 2814, 2814, 2814, 2814, 2814, 2814, 2814, 15: 2814, 2814, 2814, 2814, 2814, 2814, 2814, 2814, 2814, 2814, 2814, 2814, 2814, 2814, 2814, 2814, 2814, 2814, 2814, 2814, 2814, 2814, 2814, 2814, 2814, 2814, 2814, 2814, 2814, 2814, 2814, 2814, 2814, 2814, 2814, 2814, 57: 2814, 535: 2814, 2814, 2814, 540: 2814, 542: 2814, 2814, 2814, 551: 2814, 2814, 554: 2814, 557: 2814, 2814, 561: 2814, 571: 2814, 613: 2814, 660: 2814, 714: 2814, 2814}, + {2817, 2817, 2817, 2817, 2817, 2817, 2817, 2817, 2817, 2817, 15: 2817, 2817, 2817, 2817, 2817, 2817, 2817, 2817, 2817, 2817, 2817, 2817, 2817, 2817, 2817, 2817, 2817, 2817, 2817, 2817, 2817, 2817, 2817, 2817, 2817, 2817, 2817, 2817, 2817, 2817, 2817, 2817, 2817, 2817, 2817, 2817, 57: 2817, 535: 2817, 2817, 2817, 540: 2817, 542: 2817, 2817, 2817, 551: 2817, 2817, 554: 2817, 557: 2817, 2817, 561: 2817, 571: 2817, 613: 2817, 660: 2817, 714: 2817, 2817}, + {2816, 2816, 2816, 2816, 2816, 2816, 2816, 2816, 2816, 2816, 15: 2816, 2816, 2816, 2816, 2816, 2816, 2816, 2816, 2816, 2816, 2816, 2816, 2816, 2816, 2816, 2816, 2816, 2816, 2816, 2816, 2816, 2816, 2816, 2816, 2816, 2816, 2816, 2816, 2816, 2816, 2816, 2816, 2816, 2816, 2816, 2816, 57: 2816, 535: 2816, 2816, 2816, 540: 2816, 542: 2816, 2816, 2816, 551: 2816, 2816, 554: 2816, 557: 2816, 2816, 561: 2816, 571: 2816, 613: 2816, 660: 2816, 714: 2816, 2816}, // 2670 - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 5277, 3067, 3068, 3066, 865: 5541}, - {2863, 2863, 9: 5278, 202: 5542}, - {224: 5543}, - {2862, 2862}, - {2864, 2864}, + {2815, 2815, 2815, 2815, 2815, 2815, 2815, 2815, 2815, 2815, 15: 2815, 2815, 2815, 2815, 2815, 2815, 2815, 2815, 2815, 2815, 2815, 2815, 2815, 2815, 2815, 2815, 2815, 2815, 2815, 2815, 2815, 2815, 2815, 2815, 2815, 2815, 2815, 2815, 2815, 2815, 2815, 2815, 2815, 2815, 2815, 2815, 57: 2815, 535: 2815, 2815, 2815, 540: 2815, 542: 2815, 2815, 2815, 551: 2815, 2815, 554: 2815, 557: 2815, 2815, 561: 2815, 571: 2815, 613: 2815, 660: 2815, 714: 2815, 2815}, + {2483, 2483, 2483, 2483, 2483, 2483, 2483, 2483, 2483, 2483, 15: 2483, 2483, 2483, 2483, 2483, 2483, 2483, 2483, 2483, 2483, 2483, 2483, 2483, 2483, 2483, 2483, 2483, 2483, 2483, 2483, 2483, 2483, 2483, 2483, 2483, 2483, 2483, 2483, 2483, 2483, 2483, 2483, 2483, 2483, 2483, 2483, 57: 2483, 108: 2483, 119: 2483, 2483, 2483, 2483, 2483, 2483, 2483, 2483, 128: 2483, 2483, 2483, 535: 2483, 2483, 2483, 540: 2483, 542: 2483, 2483, 2483, 551: 2483, 2483, 554: 2483, 557: 2483, 2483, 561: 2483, 571: 2483, 613: 2483, 660: 2483, 714: 2483, 2483}, + {217: 5553}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 5286, 3072, 3073, 3071, 865: 5550}, + {2869, 2869, 9: 5287, 202: 5551}, // 2675 - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 5277, 3067, 3068, 3066, 865: 5546}, - {2655, 2655, 9: 5278, 537: 5549, 715: 5548, 908: 5547}, - {2867, 2867}, - {1114, 1114, 3316, 3471, 3280, 3156, 3196, 3318, 3080, 1114, 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 537: 1114, 708: 5566, 777: 5565, 3067, 3068, 3066, 966: 5564}, - {564: 5554, 641: 4111, 4110, 805: 5552, 922: 5553, 1118: 5551, 1324: 5550}, + {217: 5552}, + {2868, 2868}, + {2870, 2870}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 5286, 3072, 3073, 3071, 865: 5555}, + {2661, 2661, 9: 5287, 537: 5558, 715: 5557, 908: 5556}, // 2680 - {2654, 2654, 9: 5562}, - {2653, 2653, 9: 2653}, - {283: 5556, 289: 5558, 338: 5559, 357: 5557}, - {243: 5555}, - {243: 2507, 283: 2237, 289: 2237, 338: 2237, 357: 2237}, + {2873, 2873}, + {1122, 1122, 3321, 3476, 3285, 3160, 3201, 3323, 3085, 1122, 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 537: 1122, 708: 5575, 777: 5574, 3072, 3073, 3071, 968: 5573}, + {567: 5563, 641: 4119, 4118, 805: 5561, 924: 5562, 1121: 5560, 1322: 5559}, + {2660, 2660, 9: 5571}, + {2659, 2659, 9: 2659}, // 2685 - {2646, 2646, 9: 2646}, - {2651, 2651, 9: 2651}, - {2650, 2650, 9: 2650}, - {384: 5560, 461: 5561}, - {2647, 2647, 9: 2647}, - // 2690 - {2649, 2649, 9: 2649}, - {2648, 2648, 9: 2648}, - {564: 5554, 641: 4111, 4110, 805: 5552, 922: 5553, 1118: 5563}, + {284: 5565, 290: 5567, 339: 5568, 359: 5566}, + {243: 5564}, + {243: 2513, 284: 2243, 290: 2243, 339: 2243, 359: 2243}, {2652, 2652, 9: 2652}, - {2655, 2655, 9: 5568, 537: 5549, 908: 5567}, + {2657, 2657, 9: 2657}, + // 2690 + {2656, 2656, 9: 2656}, + {385: 5569, 461: 5570}, + {2653, 2653, 9: 2653}, + {2655, 2655, 9: 2655}, + {2654, 2654, 9: 2654}, // 2695 - {1113, 1113, 9: 1113, 57: 1113, 537: 1113}, - {1111, 1111, 9: 1111, 57: 1111, 537: 1111}, - {2866, 2866}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 708: 5570, 777: 5569, 3067, 3068, 3066}, - {1112, 1112, 9: 1112, 57: 1112, 537: 1112}, + {567: 5563, 641: 4119, 4118, 805: 5561, 924: 5562, 1121: 5572}, + {2658, 2658, 9: 2658}, + {2661, 2661, 9: 5577, 537: 5558, 908: 5576}, + {1121, 1121, 9: 1121, 57: 1121, 537: 1121}, + {1119, 1119, 9: 1119, 57: 1119, 537: 1119}, // 2700 - {1110, 1110, 9: 1110, 57: 1110, 537: 1110}, - {2868, 2868}, - {2803, 2803}, - {32: 5684, 420: 5683}, - {551: 5675}, + {2872, 2872}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 708: 5579, 777: 5578, 3072, 3073, 3071}, + {1120, 1120, 9: 1120, 57: 1120, 537: 1120}, + {1118, 1118, 9: 1118, 57: 1118, 537: 1118}, + {2874, 2874}, // 2705 - {725: 5668}, - {10: 5661}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 728: 5579, 777: 5578, 3067, 3068, 3066}, - {2415, 2415, 6: 2415, 2415, 18: 2415, 20: 2415, 22: 2415, 2415, 2415, 2415, 2415, 2415, 249: 4704, 715: 2415, 1034: 5659, 1072: 5660}, - {182: 2433, 406: 5584, 449: 5585, 596: 5583, 706: 2433, 1208: 5586, 5581, 1295: 5582, 1423: 5580}, + {2809, 2809}, + {32: 5693, 420: 5692}, + {551: 5684}, + {725: 5677}, + {10: 5670}, // 2710 - {2427, 2427, 115: 2427, 5649, 535: 2427, 2427, 2427, 542: 2427, 552: 2427, 554: 2427, 557: 2427, 614: 2427, 701: 2427, 1424: 5648}, - {182: 5636, 706: 5635}, - {2451, 2451, 115: 2451, 2451, 535: 2451, 2451, 2451, 542: 2451, 552: 2451, 554: 2451, 557: 2451, 614: 2451, 701: 2451}, - {131: 3972, 154: 3971, 536: 5599, 936: 5600}, - {131: 3972, 154: 3971, 536: 5592, 936: 5593}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 728: 5588, 777: 5587, 3072, 3073, 3071}, + {2421, 2421, 6: 2421, 2421, 18: 2421, 20: 2421, 22: 2421, 2421, 2421, 2421, 2421, 2421, 249: 4713, 715: 2421, 1035: 5668, 1074: 5669}, + {182: 2439, 406: 5593, 448: 5594, 596: 5592, 706: 2439, 1209: 5595, 5590, 1294: 5591, 1422: 5589}, + {2433, 2433, 115: 2433, 5658, 535: 2433, 2433, 2433, 542: 2433, 552: 2433, 554: 2433, 557: 2433, 613: 2433, 660: 2433, 1423: 5657}, + {182: 5645, 706: 5644}, // 2715 - {2444, 2444, 115: 2444, 2444, 535: 2444, 2444, 2444, 542: 2444, 552: 2444, 554: 2444, 557: 2444, 562: 5588, 614: 2444, 646: 5587, 701: 2444}, - {182: 2432, 706: 2432}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 5590}, - {564: 3053, 805: 3888, 817: 5589}, - {2445, 2445, 115: 2445, 2445, 535: 2445, 2445, 2445, 542: 2445, 552: 2445, 554: 2445, 557: 2445, 614: 2445, 701: 2445}, + {2457, 2457, 115: 2457, 2457, 535: 2457, 2457, 2457, 542: 2457, 552: 2457, 554: 2457, 557: 2457, 613: 2457, 660: 2457}, + {131: 3980, 157: 3979, 536: 5608, 938: 5609}, + {131: 3980, 157: 3979, 536: 5601, 938: 5602}, + {2450, 2450, 115: 2450, 2450, 535: 2450, 2450, 2450, 542: 2450, 552: 2450, 554: 2450, 557: 2450, 560: 5597, 613: 2450, 646: 5596, 660: 2450}, + {182: 2438, 706: 2438}, // 2720 - {118: 3789, 127: 3797, 133: 3785, 137: 3782, 3784, 3781, 3783, 3787, 3788, 3793, 3792, 3791, 3795, 3796, 3790, 3794, 3786, 571: 3767, 3765, 3766, 3764, 3762, 599: 3779, 3776, 3778, 3777, 3773, 3775, 3774, 3771, 3772, 3770, 3780, 806: 3763, 3761, 892: 3769, 907: 5591}, - {2446, 2446, 115: 2446, 2446, 535: 2446, 2446, 2446, 542: 2446, 552: 2446, 554: 2446, 557: 2446, 614: 2446, 701: 2446}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3703, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 5597}, - {536: 5594}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 4046, 3067, 3068, 3066, 827: 4047, 912: 5595}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 5599}, + {567: 3058, 805: 3893, 820: 5598}, + {2451, 2451, 115: 2451, 2451, 535: 2451, 2451, 2451, 542: 2451, 552: 2451, 554: 2451, 557: 2451, 613: 2451, 660: 2451}, + {118: 3794, 127: 3802, 134: 3790, 138: 3787, 140: 3789, 3786, 3788, 3792, 3793, 3798, 3797, 3796, 3800, 3801, 3795, 3799, 3791, 572: 3772, 3770, 3771, 3769, 3767, 599: 3784, 3781, 3783, 3782, 3778, 3780, 3779, 3776, 3777, 3775, 3785, 806: 3768, 3766, 892: 3774, 907: 5600}, + {2452, 2452, 115: 2452, 2452, 535: 2452, 2452, 2452, 542: 2452, 552: 2452, 554: 2452, 557: 2452, 613: 2452, 660: 2452}, // 2725 - {9: 4049, 57: 5596}, - {2447, 2447, 115: 2447, 2447, 535: 2447, 2447, 2447, 542: 2447, 552: 2447, 554: 2447, 557: 2447, 614: 2447, 701: 2447}, - {57: 5598, 548: 3804, 3805, 3810, 589: 3806, 613: 3807, 615: 3808, 3801, 3811, 3800, 3809, 3802, 3803}, - {2448, 2448, 115: 2448, 2448, 535: 2448, 2448, 2448, 542: 2448, 552: 2448, 554: 2448, 557: 2448, 614: 2448, 701: 2448}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3703, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 5632}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3708, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 5606}, + {536: 5603}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 4054, 3072, 3073, 3071, 828: 4055, 912: 5604}, + {9: 4057, 57: 5605}, + {2453, 2453, 115: 2453, 2453, 535: 2453, 2453, 2453, 542: 2453, 552: 2453, 554: 2453, 557: 2453, 613: 2453, 660: 2453}, // 2730 - {536: 5601}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 4046, 3067, 3068, 3066, 827: 4047, 912: 5602}, - {9: 4049, 57: 5603}, - {2443, 2443, 115: 2443, 2443, 535: 2443, 2443, 2443, 542: 2443, 552: 2443, 554: 2443, 557: 2443, 614: 2443, 646: 5605, 701: 2443, 1238: 5604}, - {2449, 2449, 115: 2449, 2449, 535: 2449, 2449, 2449, 542: 2449, 552: 2449, 554: 2449, 557: 2449, 614: 2449, 701: 2449}, + {57: 5607, 548: 3809, 3810, 3815, 565: 3811, 614: 3812, 3813, 3806, 3816, 3805, 3814, 3807, 3808}, + {2454, 2454, 115: 2454, 2454, 535: 2454, 2454, 2454, 542: 2454, 552: 2454, 554: 2454, 557: 2454, 613: 2454, 660: 2454}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3708, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 5641}, + {536: 5610}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 4054, 3072, 3073, 3071, 828: 4055, 912: 5611}, // 2735 - {536: 5606}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3703, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 5608, 1386: 5607}, - {57: 5610}, - {57: 2441, 118: 3789, 127: 3797, 133: 3785, 137: 3782, 3784, 3781, 3783, 3787, 3788, 3793, 3792, 3791, 3795, 3796, 3790, 3794, 3786, 548: 3804, 3805, 3810, 589: 3806, 599: 3779, 3776, 3778, 3777, 3773, 3775, 3774, 3771, 3772, 3770, 3780, 613: 3807, 615: 3808, 3801, 3811, 3800, 3809, 3802, 3803, 892: 3769, 907: 5609}, - {57: 2440}, + {9: 4057, 57: 5612}, + {2449, 2449, 115: 2449, 2449, 535: 2449, 2449, 2449, 542: 2449, 552: 2449, 554: 2449, 557: 2449, 613: 2449, 646: 5614, 660: 2449, 1239: 5613}, + {2455, 2455, 115: 2455, 2455, 535: 2455, 2455, 2455, 542: 2455, 552: 2455, 554: 2455, 557: 2455, 613: 2455, 660: 2455}, + {536: 5615}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3708, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 5617, 1385: 5616}, // 2740 - {2435, 2435, 10: 5612, 115: 2435, 2435, 535: 2435, 2435, 2435, 542: 2435, 552: 2435, 2435, 2435, 557: 2435, 614: 2435, 701: 2435, 725: 2435, 1369: 5611}, - {2439, 2439, 115: 2439, 2439, 535: 2439, 2439, 2439, 542: 2439, 552: 2439, 5627, 2439, 557: 2439, 614: 2439, 701: 2439, 725: 2439, 1403: 5626}, - {551: 5613}, - {192: 5614}, - {201: 5615}, + {57: 5619}, + {57: 2447, 118: 3794, 127: 3802, 134: 3790, 138: 3787, 140: 3789, 3786, 3788, 3792, 3793, 3798, 3797, 3796, 3800, 3801, 3795, 3799, 3791, 548: 3809, 3810, 3815, 565: 3811, 599: 3784, 3781, 3783, 3782, 3778, 3780, 3779, 3776, 3777, 3775, 3785, 614: 3812, 3813, 3806, 3816, 3805, 3814, 3807, 3808, 892: 3774, 907: 5618}, + {57: 2446}, + {2441, 2441, 10: 5621, 115: 2441, 2441, 535: 2441, 2441, 2441, 542: 2441, 552: 2441, 2441, 2441, 557: 2441, 613: 2441, 660: 2441, 725: 2441, 1367: 5620}, + {2445, 2445, 115: 2445, 2445, 535: 2445, 2445, 2445, 542: 2445, 552: 2445, 5636, 2445, 557: 2445, 613: 2445, 660: 2445, 725: 2445, 1402: 5635}, // 2745 - {536: 5616}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3703, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 5617}, - {57: 5618, 548: 3804, 3805, 3810, 589: 3806, 613: 3807, 615: 3808, 3801, 3811, 3800, 3809, 3802, 3803}, - {234: 5619}, - {551: 5620}, + {551: 5622}, + {193: 5623}, + {201: 5624}, + {536: 5625}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3708, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 5626}, // 2750 - {192: 5621}, - {201: 5622}, - {536: 5623}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3703, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 5624}, - {57: 5625, 548: 3804, 3805, 3810, 589: 3806, 613: 3807, 615: 3808, 3801, 3811, 3800, 3809, 3802, 3803}, + {57: 5627, 548: 3809, 3810, 3815, 565: 3811, 614: 3812, 3813, 3806, 3816, 3805, 3814, 3807, 3808}, + {234: 5628}, + {551: 5629}, + {193: 5630}, + {201: 5631}, // 2755 - {2434, 2434, 115: 2434, 2434, 535: 2434, 2434, 2434, 542: 2434, 552: 2434, 2434, 2434, 557: 2434, 614: 2434, 701: 2434, 725: 2434}, - {2437, 2437, 115: 2437, 2437, 535: 2437, 2437, 2437, 542: 2437, 552: 2437, 554: 2437, 557: 2437, 614: 2437, 701: 2437, 725: 5630, 1401: 5629}, - {551: 5628}, - {2438, 2438, 115: 2438, 2438, 535: 2438, 2438, 2438, 542: 2438, 552: 2438, 554: 2438, 557: 2438, 614: 2438, 701: 2438, 725: 2438}, - {2442, 2442, 115: 2442, 2442, 535: 2442, 2442, 2442, 542: 2442, 552: 2442, 554: 2442, 557: 2442, 614: 2442, 701: 2442}, + {536: 5632}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3708, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 5633}, + {57: 5634, 548: 3809, 3810, 3815, 565: 3811, 614: 3812, 3813, 3806, 3816, 3805, 3814, 3807, 3808}, + {2440, 2440, 115: 2440, 2440, 535: 2440, 2440, 2440, 542: 2440, 552: 2440, 2440, 2440, 557: 2440, 613: 2440, 660: 2440, 725: 2440}, + {2443, 2443, 115: 2443, 2443, 535: 2443, 2443, 2443, 542: 2443, 552: 2443, 554: 2443, 557: 2443, 613: 2443, 660: 2443, 725: 5639, 1400: 5638}, // 2760 - {551: 5631}, - {2436, 2436, 115: 2436, 2436, 535: 2436, 2436, 2436, 542: 2436, 552: 2436, 554: 2436, 557: 2436, 614: 2436, 701: 2436}, - {57: 5633, 548: 3804, 3805, 3810, 589: 3806, 613: 3807, 615: 3808, 3801, 3811, 3800, 3809, 3802, 3803}, - {2443, 2443, 115: 2443, 2443, 535: 2443, 2443, 2443, 542: 2443, 552: 2443, 554: 2443, 557: 2443, 614: 2443, 646: 5605, 701: 2443, 1238: 5634}, - {2450, 2450, 115: 2450, 2450, 535: 2450, 2450, 2450, 542: 2450, 552: 2450, 554: 2450, 557: 2450, 614: 2450, 701: 2450}, + {551: 5637}, + {2444, 2444, 115: 2444, 2444, 535: 2444, 2444, 2444, 542: 2444, 552: 2444, 554: 2444, 557: 2444, 613: 2444, 660: 2444, 725: 2444}, + {2448, 2448, 115: 2448, 2448, 535: 2448, 2448, 2448, 542: 2448, 552: 2448, 554: 2448, 557: 2448, 613: 2448, 660: 2448}, + {551: 5640}, + {2442, 2442, 115: 2442, 2442, 535: 2442, 2442, 2442, 542: 2442, 552: 2442, 554: 2442, 557: 2442, 613: 2442, 660: 2442}, // 2765 - {102: 5641, 536: 2453, 1422: 5640}, - {536: 5637}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3703, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 5638}, - {57: 5639, 548: 3804, 3805, 3810, 589: 3806, 613: 3807, 615: 3808, 3801, 3811, 3800, 3809, 3802, 3803}, - {2454, 2454, 115: 2454, 2454, 274: 2454, 535: 2454, 2454, 2454, 542: 2454, 552: 2454, 554: 2454, 557: 2454, 614: 2454, 701: 2454}, + {57: 5642, 548: 3809, 3810, 3815, 565: 3811, 614: 3812, 3813, 3806, 3816, 3805, 3814, 3807, 3808}, + {2449, 2449, 115: 2449, 2449, 535: 2449, 2449, 2449, 542: 2449, 552: 2449, 554: 2449, 557: 2449, 613: 2449, 646: 5614, 660: 2449, 1239: 5643}, + {2456, 2456, 115: 2456, 2456, 535: 2456, 2456, 2456, 542: 2456, 552: 2456, 554: 2456, 557: 2456, 613: 2456, 660: 2456}, + {102: 5650, 536: 2459, 1421: 5649}, + {536: 5646}, // 2770 - {536: 5644}, - {561: 5642}, - {564: 3053, 805: 5643}, - {536: 2452}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 2621, 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 4046, 3067, 3068, 3066, 827: 4047, 912: 5645, 1129: 5646}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3708, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 5647}, + {57: 5648, 548: 3809, 3810, 3815, 565: 3811, 614: 3812, 3813, 3806, 3816, 3805, 3814, 3807, 3808}, + {2460, 2460, 115: 2460, 2460, 274: 2460, 535: 2460, 2460, 2460, 542: 2460, 552: 2460, 554: 2460, 557: 2460, 613: 2460, 660: 2460}, + {536: 5653}, + {562: 5651}, // 2775 - {9: 4049, 57: 2620}, - {57: 5647}, - {2455, 2455, 115: 2455, 2455, 274: 2455, 535: 2455, 2455, 2455, 542: 2455, 552: 2455, 554: 2455, 557: 2455, 614: 2455, 701: 2455}, - {2431, 2431, 115: 5652, 535: 2431, 2431, 2431, 542: 2431, 552: 2431, 554: 2431, 557: 2431, 614: 2431, 701: 2431, 1484: 5651}, - {564: 3053, 805: 3888, 817: 5650}, + {567: 3058, 805: 5652}, + {536: 2458}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 2627, 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 4054, 3072, 3073, 3071, 828: 4055, 912: 5654, 1132: 5655}, + {9: 4057, 57: 2626}, + {57: 5656}, // 2780 - {2426, 2426, 115: 2426, 535: 2426, 2426, 2426, 542: 2426, 552: 2426, 554: 2426, 557: 2426, 614: 2426, 701: 2426}, - {2425, 2425, 535: 2425, 5440, 2425, 542: 2425, 552: 2425, 554: 2425, 557: 2425, 614: 2425, 701: 2425, 1237: 5658}, - {728: 5653}, - {182: 2433, 706: 2433, 1208: 5586, 5581, 1295: 5654}, - {2429, 2429, 274: 5656, 535: 2429, 2429, 2429, 542: 2429, 552: 2429, 554: 2429, 557: 2429, 614: 2429, 701: 2429, 1483: 5655}, + {2461, 2461, 115: 2461, 2461, 274: 2461, 535: 2461, 2461, 2461, 542: 2461, 552: 2461, 554: 2461, 557: 2461, 613: 2461, 660: 2461}, + {2437, 2437, 115: 5661, 535: 2437, 2437, 2437, 542: 2437, 552: 2437, 554: 2437, 557: 2437, 613: 2437, 660: 2437, 1484: 5660}, + {567: 3058, 805: 3893, 820: 5659}, + {2432, 2432, 115: 2432, 535: 2432, 2432, 2432, 542: 2432, 552: 2432, 554: 2432, 557: 2432, 613: 2432, 660: 2432}, + {2431, 2431, 535: 2431, 5449, 2431, 542: 2431, 552: 2431, 554: 2431, 557: 2431, 613: 2431, 660: 2431, 1238: 5667}, // 2785 - {2430, 2430, 535: 2430, 2430, 2430, 542: 2430, 552: 2430, 554: 2430, 557: 2430, 614: 2430, 701: 2430}, - {564: 3053, 805: 3888, 817: 5657}, - {2428, 2428, 535: 2428, 2428, 2428, 542: 2428, 552: 2428, 554: 2428, 557: 2428, 614: 2428, 701: 2428}, - {2456, 2456, 535: 2456, 2456, 2456, 542: 2456, 552: 2456, 554: 2456, 557: 2456, 614: 2456, 701: 2456}, - {2798, 2798}, + {728: 5662}, + {182: 2439, 706: 2439, 1209: 5595, 5590, 1294: 5663}, + {2435, 2435, 274: 5665, 535: 2435, 2435, 2435, 542: 2435, 552: 2435, 554: 2435, 557: 2435, 613: 2435, 660: 2435, 1483: 5664}, + {2436, 2436, 535: 2436, 2436, 2436, 542: 2436, 552: 2436, 554: 2436, 557: 2436, 613: 2436, 660: 2436}, + {567: 3058, 805: 3893, 820: 5666}, // 2790 - {2797, 2797, 6: 4747, 5474, 18: 4703, 20: 4755, 22: 4751, 4748, 4750, 4753, 4754, 4756, 715: 4752, 871: 4757, 916: 5473}, - {551: 5662}, - {192: 5663}, - {201: 5664}, - {536: 5665}, + {2434, 2434, 535: 2434, 2434, 2434, 542: 2434, 552: 2434, 554: 2434, 557: 2434, 613: 2434, 660: 2434}, + {2462, 2462, 535: 2462, 2462, 2462, 542: 2462, 552: 2462, 554: 2462, 557: 2462, 613: 2462, 660: 2462}, + {2804, 2804}, + {2803, 2803, 6: 4756, 5483, 18: 4712, 20: 4764, 22: 4757, 4760, 4759, 4762, 4763, 4765, 715: 4761, 871: 4766, 918: 5482}, + {551: 5671}, // 2795 - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3703, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 5666}, - {57: 5667, 548: 3804, 3805, 3810, 589: 3806, 613: 3807, 615: 3808, 3801, 3811, 3800, 3809, 3802, 3803}, - {2799, 2799}, - {551: 5669}, - {192: 5670}, + {193: 5672}, + {201: 5673}, + {536: 5674}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3708, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 5675}, + {57: 5676, 548: 3809, 3810, 3815, 565: 3811, 614: 3812, 3813, 3806, 3816, 3805, 3814, 3807, 3808}, // 2800 - {201: 5671}, - {536: 5672}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3703, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 5673}, - {57: 5674, 548: 3804, 3805, 3810, 589: 3806, 613: 3807, 615: 3808, 3801, 3811, 3800, 3809, 3802, 3803}, - {2800, 2800}, + {2805, 2805}, + {551: 5678}, + {193: 5679}, + {201: 5680}, + {536: 5681}, // 2805 - {762, 762, 762, 762, 762, 762, 762, 762, 762, 10: 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 58: 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 5273, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 914: 5272, 930: 5676}, - {2735, 2735, 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 5277, 3067, 3068, 3066, 865: 5678, 1445: 5677}, - {2801, 2801}, - {9: 5278, 565: 5679}, - {536: 5680}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3708, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 5682}, + {57: 5683, 548: 3809, 3810, 3815, 565: 3811, 614: 3812, 3813, 3806, 3816, 3805, 3814, 3807, 3808}, + {2806, 2806}, + {768, 768, 768, 768, 768, 768, 768, 768, 768, 10: 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 58: 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 5282, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 901: 5281, 916: 5685}, + {2741, 2741, 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 5286, 3072, 3073, 3071, 865: 5687, 1444: 5686}, // 2810 - {551: 5443, 1073: 5442, 1236: 5681}, - {9: 5484, 57: 5682}, - {2734, 2734}, - {2802, 2802}, - {2796, 2796}, + {2807, 2807}, + {9: 5287, 564: 5688}, + {536: 5689}, + {551: 5452, 1075: 5451, 1237: 5690}, + {9: 5493, 57: 5691}, // 2815 - {173: 5686, 990: 264, 1215: 5687}, - {990: 263}, - {990: 5688}, - {538: 5689}, - {156, 156, 235: 156, 410: 5691, 727: 156, 1400: 5690}, + {2740, 2740}, + {2808, 2808}, + {2802, 2802}, + {160: 5695, 991: 270, 1215: 5696}, + {991: 269}, // 2820 - {154, 154, 235: 5694, 727: 154, 1399: 5693}, - {564: 3053, 805: 5692}, - {155, 155, 235: 155, 727: 155}, - {247, 247, 727: 4000, 1062: 5701}, - {152, 152, 239: 152, 421: 5696, 727: 152, 1426: 5695}, + {991: 5697}, + {538: 5698}, + {156, 156, 235: 156, 409: 5700, 727: 156, 1399: 5699}, + {154, 154, 235: 5703, 727: 154, 1398: 5702}, + {567: 3058, 805: 5701}, // 2825 - {150, 150, 239: 5699, 727: 150, 1425: 5698}, - {564: 3053, 805: 5697}, + {155, 155, 235: 155, 727: 155}, + {253, 253, 727: 4008, 1063: 5710}, + {152, 152, 239: 152, 421: 5705, 727: 152, 1425: 5704}, + {150, 150, 239: 5708, 727: 150, 1424: 5707}, + {567: 3058, 805: 5706}, + // 2830 {151, 151, 239: 151, 727: 151}, {153, 153, 727: 153}, - {564: 3053, 805: 5700}, - // 2830 + {567: 3058, 805: 5709}, {149, 149, 727: 149}, {157, 157}, - {28: 203, 56: 203, 159: 203, 536: 203, 564: 203}, - {56: 5232, 536: 5703, 1005: 5240}, - {208, 208}, // 2835 - {564: 3053, 805: 5709}, - {564: 3053, 805: 5708}, + {28: 203, 56: 203, 161: 203, 536: 203, 567: 203}, + {56: 5241, 536: 5712, 1007: 5249}, + {208, 208}, + {567: 3058, 805: 5718}, + {567: 3058, 805: 5717}, + // 2840 {205, 205}, {206, 206}, {207, 207}, - // 2840 - {562: 5713}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 4046, 3067, 3068, 3066, 827: 5712}, - {562: 209}, - {564: 3053, 805: 5714}, - {303: 5716, 537: 213, 557: 213, 592: 213, 719: 213, 809: 213, 1357: 5715}, + {155: 5721, 613: 5720, 1094: 5722}, + {2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 10: 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 58: 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 537: 2337, 565: 2337, 584: 2337}, // 2845 - {537: 2922, 557: 2907, 592: 2906, 719: 3035, 809: 2886, 822: 5719, 828: 3034, 2887, 5723, 832: 5724, 5722, 839: 2888, 845: 5721, 1459: 5720}, - {436: 5717}, - {159: 5718, 537: 212, 557: 212, 592: 212, 719: 212, 809: 212}, - {537: 211, 557: 211, 592: 211, 719: 211, 809: 211}, - {719: 3035, 809: 2886, 828: 5727, 5725, 839: 5726}, + {2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 10: 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 58: 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 537: 2336, 565: 2336, 584: 2336}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 565: 3955, 777: 3954, 3072, 3073, 3071, 810: 3956, 889: 5723}, + {209, 209, 9: 3958}, + {560: 5727}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 4054, 3072, 3073, 3071, 828: 5726}, // 2850 + {560: 210}, + {567: 3058, 805: 5728}, + {304: 5730, 537: 214, 557: 214, 592: 214, 719: 214, 809: 214, 1355: 5729}, + {537: 2928, 557: 2913, 592: 2912, 719: 3039, 809: 2892, 821: 5733, 827: 3038, 829: 2893, 5737, 5738, 5736, 840: 2894, 845: 5735, 1459: 5734}, + {436: 5731}, + // 2855 + {161: 5732, 537: 213, 557: 213, 592: 213, 719: 213, 809: 213}, + {537: 212, 557: 212, 592: 212, 719: 212, 809: 212}, + {719: 3039, 809: 2892, 827: 5741, 829: 5739, 840: 5740}, + {219, 219}, {218, 218}, + // 2860 {217, 217}, {216, 216}, {215, 215}, - {214, 214}, - // 2855 - {2353, 2353}, - {2352, 2352}, - {429, 429, 547: 429}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 3949, 3067, 3068, 3066, 810: 5740, 1298: 5741, 1486: 5739}, - {227, 227, 227, 227, 227, 227, 227, 227, 227, 10: 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 58: 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227}, - // 2860 - {226, 226, 226, 226, 226, 226, 226, 226, 226, 10: 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 58: 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 3949, 3067, 3068, 3066, 810: 5732, 890: 5733}, - {1259, 1259, 9: 1259, 551: 5734}, - {201, 201, 9: 3952}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 536: 5736, 777: 5277, 3067, 3068, 3066, 865: 5735}, + {2359, 2359}, + {2358, 2358}, // 2865 - {200, 200, 9: 5278}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 5277, 3067, 3068, 3066, 865: 5737}, - {9: 5278, 57: 5738}, - {199, 199}, - {228, 228, 9: 5747}, + {436, 436, 547: 436}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 565: 3955, 777: 3954, 3072, 3073, 3071, 810: 5754, 1297: 5755, 1486: 5753}, + {228, 228, 228, 228, 228, 228, 228, 228, 228, 10: 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 58: 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 565: 228}, + {227, 227, 227, 227, 227, 227, 227, 227, 227, 10: 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 58: 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 565: 227}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 565: 3955, 777: 3954, 3072, 3073, 3071, 810: 5746, 889: 5747}, // 2870 - {734: 5743, 774: 5744, 1395: 5742}, - {220, 220, 9: 220}, - {225, 225, 9: 225}, - {224, 224, 9: 224, 173: 5746}, - {222, 222, 9: 222, 173: 5745}, + {1267, 1267, 9: 1267, 551: 5748}, + {201, 201, 9: 3958}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 536: 5750, 777: 5286, 3072, 3073, 3071, 865: 5749}, + {200, 200, 9: 5287}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 5286, 3072, 3073, 3071, 865: 5751}, // 2875 + {9: 5287, 57: 5752}, + {199, 199}, + {229, 229, 9: 5761}, + {734: 5757, 775: 5758, 1394: 5756}, {221, 221, 9: 221}, - {223, 223, 9: 223}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 3949, 3067, 3068, 3066, 810: 5740, 1298: 5748}, - {219, 219, 9: 219}, - {229, 229}, // 2880 - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 3949, 3067, 3068, 3066, 810: 5751, 890: 5752}, - {1259, 1259, 9: 1259, 551: 5753}, - {198, 198, 9: 3952}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 536: 5755, 777: 5277, 3067, 3068, 3066, 865: 5754}, - {197, 197, 9: 5278}, + {226, 226, 9: 226}, + {225, 225, 9: 225, 160: 5760}, + {223, 223, 9: 223, 160: 5759}, + {222, 222, 9: 222}, + {224, 224, 9: 224}, // 2885 - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 5277, 3067, 3068, 3066, 865: 5756}, - {9: 5278, 57: 5757}, - {196, 196}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 3949, 3067, 3068, 3066, 810: 5759}, - {536: 5760, 560: 2609, 566: 2609, 1131: 5761}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 565: 3955, 777: 3954, 3072, 3073, 3071, 810: 5754, 1297: 5762}, + {220, 220, 9: 220}, + {230, 230}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 565: 3955, 777: 3954, 3072, 3073, 3071, 810: 5765, 889: 5766}, + {1267, 1267, 9: 1267, 551: 5767}, // 2890 - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 2615, 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 633: 3703, 777: 4046, 3067, 3068, 3066, 782: 5788, 827: 5787, 1130: 5786, 1342: 5785, 5789}, - {560: 5762, 566: 241, 1213: 5763}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 3923, 3067, 3068, 3066, 784: 5780, 1212: 5779, 1394: 5778}, - {566: 5764}, - {538: 5765}, + {198, 198, 9: 3958}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 536: 5769, 777: 5286, 3072, 3073, 3071, 865: 5768}, + {197, 197, 9: 5287}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 5286, 3072, 3073, 3071, 865: 5770}, + {9: 5287, 57: 5771}, // 2895 - {270, 270, 232: 5766, 537: 270, 1185: 5767}, - {538: 5777}, - {236, 236, 537: 5768, 1211: 5769}, - {56: 5772, 1210: 5771, 1393: 5770}, - {230, 230}, + {196, 196}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 565: 3955, 777: 3954, 3072, 3073, 3071, 810: 5773}, + {536: 5774, 561: 2615, 566: 2615, 1134: 5775}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 2621, 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 633: 3708, 777: 4054, 3072, 3073, 3071, 782: 5808, 828: 5807, 1133: 5806, 1340: 5805, 5809}, + {561: 5776, 566: 247, 1213: 5777}, // 2900 - {235, 235, 9: 5775}, - {234, 234, 9: 234}, - {232, 232, 9: 232, 561: 5773}, - {538: 3607, 548: 4962, 4963, 553: 3598, 564: 3602, 634: 3597, 3599, 641: 3601, 3600, 3605, 645: 3606, 652: 3604, 783: 4961, 785: 3603, 1088: 5774}, - {231, 231, 9: 231}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 3928, 3072, 3073, 3071, 784: 5800, 1212: 5799, 1393: 5798}, + {566: 5778}, + {536: 2929, 2928, 5781, 552: 2927, 613: 2926, 660: 2922, 781: 5779, 812: 5780, 2923, 2924, 2925, 2934, 2932, 2931, 2930, 821: 3873, 5784, 5783, 1378: 5782}, + {231, 231, 537: 231, 544: 1028, 555: 1028, 1028, 559: 3886, 3885, 570: 3884, 847: 3887, 3888}, + {234, 234, 537: 234, 544: 1029, 555: 1029, 1029}, // 2905 - {56: 5772, 1210: 5776}, - {233, 233, 9: 233}, - {269, 269, 537: 269, 554: 269, 557: 269, 565: 269}, - {240, 240, 9: 5783, 537: 240, 566: 240}, - {238, 238, 9: 238, 537: 238, 566: 238}, + {276, 276, 232: 5794, 537: 276, 1187: 5795}, + {242, 242, 537: 5785, 1064: 5786}, + {233, 233, 537: 233}, + {232, 232, 537: 232}, + {56: 5789, 1211: 5788, 1392: 5787}, // 2910 - {561: 5781}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3921, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 3917, 899: 5782}, - {237, 237, 9: 237, 537: 237, 566: 237}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 3923, 3067, 3068, 3066, 784: 5780, 1212: 5784}, - {239, 239, 9: 239, 537: 239, 566: 239}, + {235, 235}, + {241, 241, 9: 5792}, + {240, 240, 9: 240}, + {238, 238, 9: 238, 562: 5790}, + {538: 3612, 548: 4971, 4972, 553: 3603, 567: 3607, 634: 3602, 3604, 641: 3606, 3605, 3610, 645: 3611, 652: 3609, 783: 4970, 785: 3608, 1090: 5791}, // 2915 - {9: 5791, 57: 2614}, - {9: 2613, 57: 2613}, - {9: 2611, 57: 2611}, - {9: 2610, 57: 2610}, - {57: 5790}, + {237, 237, 9: 237}, + {56: 5789, 1211: 5793}, + {239, 239, 9: 239}, + {538: 5797}, + {242, 242, 537: 5785, 1064: 5796}, // 2920 - {2608, 2608, 537: 2608, 560: 2608, 566: 2608}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 633: 3703, 777: 4046, 3067, 3068, 3066, 782: 5788, 827: 5787, 1130: 5792}, - {9: 2612, 57: 2612}, - {173: 5686, 990: 264, 1215: 5796}, - {538: 5795}, + {236, 236}, + {275, 275, 537: 275, 554: 275, 557: 275, 564: 275}, + {246, 246, 9: 5803, 537: 246, 566: 246}, + {244, 244, 9: 244, 537: 244, 566: 244}, + {562: 5801}, // 2925 - {202, 202}, - {990: 5797}, - {538: 5798}, - {232: 5766, 554: 270, 557: 270, 565: 270, 1185: 5799}, - {554: 5800, 557: 5801, 565: 2395, 1170: 5802}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3926, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 3922, 899: 5802}, + {243, 243, 9: 243, 537: 243, 566: 243}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 3928, 3072, 3073, 3071, 784: 5800, 1212: 5804}, + {245, 245, 9: 245, 537: 245, 566: 245}, + {9: 5811, 57: 2620}, // 2930 - {2394, 2394, 535: 2394, 2394, 2394, 542: 2394, 552: 2394, 565: 2394, 614: 2394, 701: 2394}, - {2393, 2393, 535: 2393, 2393, 2393, 542: 2393, 552: 2393, 565: 2393, 614: 2393, 701: 2393}, - {565: 5803}, - {614: 5804}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 3949, 3067, 3068, 3066, 810: 5805}, + {9: 2619, 57: 2619}, + {9: 2617, 57: 2617}, + {9: 2616, 57: 2616}, + {57: 5810}, + {2614, 2614, 537: 2614, 561: 2614, 566: 2614}, // 2935 - {266, 266, 131: 266, 154: 266, 536: 266, 266, 554: 266, 560: 266, 714: 5807, 727: 266, 1339: 5806}, - {262, 262, 131: 3972, 154: 3971, 536: 262, 262, 554: 262, 560: 262, 727: 262, 936: 3970, 1179: 5810}, - {560: 5808}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 538: 3758, 591: 4376, 777: 3759, 3067, 3068, 3066, 811: 4375, 911: 5809}, - {265, 265, 131: 265, 154: 265, 536: 265, 265, 554: 265, 560: 265, 727: 265}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 633: 3708, 777: 4054, 3072, 3073, 3071, 782: 5808, 828: 5807, 1133: 5812}, + {9: 2618, 57: 2618}, + {160: 5695, 991: 270, 1215: 5816}, + {538: 5815}, + {202, 202}, // 2940 - {247, 247, 536: 247, 247, 554: 247, 560: 247, 727: 4000, 1062: 5811}, - {268, 268, 536: 268, 268, 554: 5813, 560: 268, 1378: 5812}, - {2609, 2609, 536: 5760, 2609, 560: 2609, 1131: 5816}, - {564: 3053, 805: 5814}, - {727: 5815}, + {991: 5817}, + {538: 5818}, + {232: 5794, 554: 276, 557: 276, 564: 276, 1187: 5819}, + {554: 5820, 557: 5821, 564: 2401, 1172: 5822}, + {2400, 2400, 535: 2400, 2400, 2400, 542: 2400, 552: 2400, 564: 2400, 613: 2400, 660: 2400}, // 2945 - {267, 267, 536: 267, 267, 560: 267}, - {241, 241, 537: 241, 560: 5762, 1213: 5817}, - {236, 236, 537: 5768, 1211: 5818}, - {271, 271}, - {9: 328, 56: 328, 535: 328, 566: 328, 633: 2103, 717: 328, 731: 2103}, + {2399, 2399, 535: 2399, 2399, 2399, 542: 2399, 552: 2399, 564: 2399, 613: 2399, 660: 2399}, + {564: 5823}, + {613: 5824}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 565: 3955, 777: 3954, 3072, 3073, 3071, 810: 5825}, + {272, 272, 131: 272, 157: 272, 536: 272, 272, 554: 272, 561: 272, 714: 5827, 727: 272, 1337: 5826}, // 2950 - {9: 293, 535: 293, 293, 566: 293, 633: 2070, 717: 293, 731: 2070}, - {9: 307, 535: 307, 307, 566: 307, 633: 2044, 717: 307, 731: 2044}, - {9: 294, 535: 294, 294, 566: 294, 633: 2041, 717: 294, 731: 2041}, - {9: 283, 535: 283, 283, 566: 283, 633: 2003, 717: 283, 731: 2003}, - {9: 303, 535: 303, 303, 566: 303, 633: 1924, 717: 303, 731: 1924}, + {268, 268, 131: 3980, 157: 3979, 536: 268, 268, 554: 268, 561: 268, 727: 268, 938: 3978, 1181: 5830}, + {561: 5828}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 538: 3763, 591: 4384, 777: 3764, 3072, 3073, 3071, 811: 4383, 911: 5829}, + {271, 271, 131: 271, 157: 271, 536: 271, 271, 554: 271, 561: 271, 727: 271}, + {253, 253, 536: 253, 253, 554: 253, 561: 253, 727: 4008, 1063: 5831}, // 2955 - {9: 308, 535: 308, 308, 566: 308, 633: 1917, 717: 308, 731: 1917}, - {376: 5928, 442: 5927, 633: 1898, 731: 1898}, - {9: 295, 535: 295, 295, 566: 295, 633: 1895, 717: 295, 731: 1895}, - {9: 284, 535: 284, 284, 566: 284, 633: 1892, 717: 284, 731: 1892}, - {633: 5925, 731: 5924}, + {274, 274, 536: 274, 274, 554: 5833, 561: 274, 1376: 5832}, + {2615, 2615, 536: 5774, 2615, 561: 2615, 1134: 5836}, + {567: 3058, 805: 5834}, + {727: 5835}, + {273, 273, 536: 273, 273, 561: 273}, // 2960 - {9: 939, 535: 939, 566: 939, 633: 435, 717: 939, 731: 435}, - {9: 938, 535: 938, 566: 938, 717: 938}, - {9: 324, 56: 5923, 535: 324, 566: 324, 717: 324}, - {9: 326, 535: 326, 566: 326, 717: 326}, - {9: 325, 535: 325, 566: 325, 717: 325}, + {247, 247, 537: 247, 561: 5776, 1213: 5837}, + {242, 242, 537: 5785, 1064: 5838}, + {277, 277}, + {9: 334, 56: 334, 535: 334, 566: 334, 633: 2112, 717: 334, 731: 2112}, + {9: 299, 535: 299, 299, 566: 299, 633: 2079, 717: 299, 731: 2079}, // 2965 - {566: 5921}, - {9: 304, 535: 304, 304, 565: 5919, 304, 717: 304}, - {9: 321, 535: 321, 566: 321, 717: 321}, - {9: 5871, 535: 5872, 566: 5873}, - {9: 319, 535: 319, 5868, 566: 319, 717: 319}, + {9: 313, 535: 313, 313, 566: 313, 633: 2053, 717: 313, 731: 2053}, + {9: 300, 535: 300, 300, 566: 300, 633: 2050, 717: 300, 731: 2050}, + {9: 289, 535: 289, 289, 566: 289, 633: 2013, 717: 289, 731: 2013}, + {9: 309, 535: 309, 309, 566: 309, 633: 1933, 717: 309, 731: 1933}, + {9: 314, 535: 314, 314, 566: 314, 633: 1926, 717: 314, 731: 1926}, // 2970 - {9: 317, 240: 5867, 535: 317, 317, 566: 317, 717: 317}, - {9: 315, 336: 5866, 535: 315, 315, 566: 315, 717: 315}, - {9: 314, 20: 5860, 132: 5862, 196: 5863, 217: 5861, 5859, 336: 5864, 535: 314, 314, 566: 314, 717: 314}, - {9: 311, 535: 311, 311, 566: 311, 717: 311}, - {9: 310, 535: 310, 310, 566: 310, 717: 310}, + {344: 5947, 377: 5948, 633: 1907, 731: 1907}, + {9: 301, 535: 301, 301, 566: 301, 633: 1904, 717: 301, 731: 1904}, + {9: 290, 535: 290, 290, 566: 290, 633: 1901, 717: 290, 731: 1901}, + {633: 5945, 731: 5944}, + {9: 947, 535: 947, 566: 947, 633: 442, 717: 947, 731: 442}, // 2975 - {9: 309, 196: 5858, 535: 309, 309, 566: 309, 717: 309}, - {9: 306, 535: 306, 306, 566: 306, 717: 306}, - {9: 305, 535: 305, 305, 566: 305, 717: 305}, - {132: 5857, 1150: 5856}, - {9: 301, 535: 301, 301, 566: 301, 717: 301}, + {9: 946, 535: 946, 566: 946, 717: 946}, + {9: 330, 56: 5943, 535: 330, 566: 330, 717: 330}, + {9: 332, 535: 332, 566: 332, 717: 332}, + {9: 331, 535: 331, 566: 331, 717: 331}, + {566: 5941}, // 2980 - {1012: 5855}, - {9: 299, 535: 299, 299, 566: 299, 717: 299}, - {9: 296, 535: 296, 296, 566: 296, 717: 296}, - {157: 5854}, - {9: 291, 535: 291, 291, 566: 291, 717: 291}, + {9: 310, 535: 310, 310, 564: 5939, 566: 310, 717: 310}, + {9: 327, 535: 327, 566: 327, 717: 327}, + {9: 5891, 535: 5892, 566: 5893}, + {9: 325, 535: 325, 5888, 566: 325, 717: 325}, + {9: 323, 240: 5887, 535: 323, 323, 566: 323, 717: 323}, // 2985 - {9: 300, 535: 300, 300, 566: 300, 717: 300}, - {9: 302, 535: 302, 302, 566: 302, 717: 302}, - {9: 289, 535: 289, 289, 566: 289, 717: 289}, - {9: 287, 535: 287, 287, 566: 287, 717: 287}, - {9: 313, 535: 313, 313, 566: 313, 717: 313}, + {9: 321, 337: 5886, 535: 321, 321, 566: 321, 717: 321}, + {9: 320, 20: 5880, 133: 5882, 185: 5883, 218: 5881, 5879, 337: 5884, 535: 320, 320, 566: 320, 717: 320}, + {9: 317, 535: 317, 317, 566: 317, 717: 317}, + {9: 316, 535: 316, 316, 566: 316, 717: 316}, + {9: 315, 185: 5878, 535: 315, 315, 566: 315, 717: 315}, // 2990 {9: 312, 535: 312, 312, 566: 312, 717: 312}, - {157: 5865}, - {9: 290, 535: 290, 290, 566: 290, 717: 290}, - {9: 288, 535: 288, 288, 566: 288, 717: 288}, - {9: 286, 535: 286, 286, 566: 286, 717: 286}, + {9: 311, 535: 311, 311, 566: 311, 717: 311}, + {133: 5877, 1153: 5876}, + {9: 307, 535: 307, 307, 566: 307, 717: 307}, + {1014: 5875}, // 2995 - {9: 292, 535: 292, 292, 566: 292, 717: 292}, - {9: 285, 535: 285, 285, 566: 285, 717: 285}, - {9: 316, 535: 316, 316, 566: 316, 717: 316}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 4046, 3067, 3068, 3066, 827: 4047, 912: 5869}, - {9: 4049, 57: 5870}, + {9: 305, 535: 305, 305, 566: 305, 717: 305}, + {9: 302, 535: 302, 302, 566: 302, 717: 302}, + {155: 5874}, + {9: 297, 535: 297, 297, 566: 297, 717: 297}, + {9: 306, 535: 306, 306, 566: 306, 717: 306}, // 3000 - {9: 318, 535: 318, 566: 318, 717: 318}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 5819, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 5821, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 5827, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 5823, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 5820, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 5828, 3245, 3497, 5822, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 5825, 3152, 3153, 3399, 5826, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 5824, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 538: 5830, 567: 5853, 592: 5847, 701: 5836, 712: 5851, 715: 5846, 719: 5849, 721: 5840, 729: 5841, 732: 5845, 748: 5842, 777: 3759, 3067, 3068, 3066, 809: 5844, 811: 5829, 900: 5835, 904: 5831, 963: 5850, 974: 5848, 1051: 5832, 1077: 5833, 5839, 1084: 5834, 5918, 1094: 5843, 1098: 5852}, - {2: 282, 282, 282, 282, 282, 282, 282, 10: 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 58: 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 5885, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 589: 282, 614: 5884, 970: 5886, 1221: 5887}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 538: 3758, 636: 5875, 777: 3759, 3067, 3068, 3066, 811: 5874, 861: 5876, 976: 5877}, - {952, 952, 6: 952, 9: 952, 15: 952, 51: 952, 952, 952, 952, 952, 132: 952, 183: 952, 537: 952, 547: 952, 561: 952, 633: 5882, 661: 952, 717: 952, 722: 952, 730: 952, 5881}, + {9: 308, 535: 308, 308, 566: 308, 717: 308}, + {9: 295, 535: 295, 295, 566: 295, 717: 295}, + {9: 293, 535: 293, 293, 566: 293, 717: 293}, + {9: 319, 535: 319, 319, 566: 319, 717: 319}, + {9: 318, 535: 318, 318, 566: 318, 717: 318}, // 3005 - {1412, 1412, 6: 1412, 9: 1412, 15: 1412, 51: 1412, 1412, 1412, 1412, 1412, 132: 1412, 183: 1412, 536: 4385, 1412, 547: 1412, 561: 1412, 661: 1412, 717: 1412, 722: 1412, 730: 1412, 1230: 5880}, - {948, 948, 9: 948, 537: 948}, - {272, 272, 9: 5878}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 538: 3758, 636: 5875, 777: 3759, 3067, 3068, 3066, 811: 5874, 861: 5879}, - {947, 947, 9: 947, 537: 947}, + {155: 5885}, + {9: 296, 535: 296, 296, 566: 296, 717: 296}, + {9: 294, 535: 294, 294, 566: 294, 717: 294}, + {9: 292, 535: 292, 292, 566: 292, 717: 292}, + {9: 298, 535: 298, 298, 566: 298, 717: 298}, // 3010 - {949, 949, 6: 949, 9: 949, 15: 949, 51: 949, 949, 949, 949, 949, 132: 949, 183: 949, 537: 949, 547: 949, 561: 949, 661: 949, 717: 949, 722: 949, 730: 949}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 538: 3758, 777: 3759, 3067, 3068, 3066, 811: 5883}, - {950, 950, 6: 950, 9: 950, 15: 950, 51: 950, 950, 950, 950, 950, 132: 950, 183: 950, 537: 950, 547: 950, 561: 950, 661: 950, 717: 950, 722: 950, 730: 950}, - {951, 951, 6: 951, 9: 951, 15: 951, 51: 951, 951, 951, 951, 951, 132: 951, 183: 951, 537: 951, 547: 951, 561: 951, 661: 951, 717: 951, 722: 951, 730: 951}, - {2: 281, 281, 281, 281, 281, 281, 281, 10: 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 58: 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 589: 281}, + {9: 291, 535: 291, 291, 566: 291, 717: 291}, + {9: 322, 535: 322, 322, 566: 322, 717: 322}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 4054, 3072, 3073, 3071, 828: 4055, 912: 5889}, + {9: 4057, 57: 5890}, + {9: 324, 535: 324, 566: 324, 717: 324}, // 3015 - {2: 280, 280, 280, 280, 280, 280, 280, 10: 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 58: 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 589: 280}, - {2: 279, 279, 279, 279, 279, 279, 279, 10: 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 58: 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 589: 279}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 589: 5888, 777: 5889, 3067, 3068, 3066, 1247: 5890}, - {566: 278, 717: 278, 720: 5916}, - {566: 274, 717: 274, 720: 5913}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 5839, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 5841, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 5847, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 5843, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 5840, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 5848, 3250, 3502, 5842, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 5845, 3156, 3157, 3404, 5846, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 5844, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 538: 5850, 568: 5873, 592: 5867, 660: 5856, 712: 5871, 715: 5866, 719: 5869, 721: 5860, 729: 5861, 732: 5865, 745: 5862, 777: 3764, 3072, 3073, 3071, 809: 5864, 811: 5849, 904: 5851, 915: 5855, 965: 5870, 976: 5868, 1052: 5852, 1079: 5853, 5859, 1086: 5854, 5938, 1097: 5863, 1101: 5872}, + {2: 288, 288, 288, 288, 288, 288, 288, 10: 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 58: 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 5905, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 565: 288, 613: 5904, 972: 5906, 1221: 5907}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 538: 3763, 636: 5895, 777: 3764, 3072, 3073, 3071, 811: 5894, 861: 5896, 977: 5897}, + {960, 960, 6: 960, 9: 960, 15: 960, 51: 960, 960, 960, 960, 960, 133: 960, 183: 960, 537: 960, 547: 960, 562: 960, 633: 5902, 661: 960, 717: 960, 722: 960, 730: 960, 5901}, + {1421, 1421, 6: 1421, 9: 1421, 15: 1421, 51: 1421, 1421, 1421, 1421, 1421, 133: 1421, 183: 1421, 536: 4393, 1421, 547: 1421, 562: 1421, 661: 1421, 717: 1421, 722: 1421, 730: 1421, 1231: 5900}, // 3020 - {566: 5891}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 538: 3758, 636: 5875, 777: 3759, 3067, 3068, 3066, 811: 5874, 861: 5892, 1000: 5893, 1030: 5894}, - {365, 365, 6: 365, 9: 365, 15: 365, 51: 365, 365, 365, 365, 365, 183: 5898, 537: 365, 730: 365, 1329: 5897}, - {411, 411, 6: 411, 9: 411, 15: 411, 51: 411, 411, 411, 411, 411, 537: 411, 730: 411}, - {273, 273, 9: 5895}, + {956, 956, 9: 956, 537: 956}, + {278, 278, 9: 5898}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 538: 3763, 636: 5895, 777: 3764, 3072, 3073, 3071, 811: 5894, 861: 5899}, + {955, 955, 9: 955, 537: 955}, + {957, 957, 6: 957, 9: 957, 15: 957, 51: 957, 957, 957, 957, 957, 133: 957, 183: 957, 537: 957, 547: 957, 562: 957, 661: 957, 717: 957, 722: 957, 730: 957}, // 3025 - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 538: 3758, 636: 5875, 777: 3759, 3067, 3068, 3066, 811: 5874, 861: 5892, 1000: 5896}, - {410, 410, 6: 410, 9: 410, 15: 410, 51: 410, 410, 410, 410, 410, 537: 410, 730: 410}, - {412, 412, 6: 412, 9: 412, 15: 412, 51: 412, 412, 412, 412, 412, 537: 412, 730: 412}, - {537: 5900, 728: 5899}, - {15: 5911, 538: 5908, 1003: 5910}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 538: 3763, 777: 3764, 3072, 3073, 3071, 811: 5903}, + {958, 958, 6: 958, 9: 958, 15: 958, 51: 958, 958, 958, 958, 958, 133: 958, 183: 958, 537: 958, 547: 958, 562: 958, 661: 958, 717: 958, 722: 958, 730: 958}, + {959, 959, 6: 959, 9: 959, 15: 959, 51: 959, 959, 959, 959, 959, 133: 959, 183: 959, 537: 959, 547: 959, 562: 959, 661: 959, 717: 959, 722: 959, 730: 959}, + {2: 287, 287, 287, 287, 287, 287, 287, 10: 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 58: 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 565: 287}, + {2: 286, 286, 286, 286, 286, 286, 286, 10: 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 58: 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 565: 286}, // 3030 - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 538: 3758, 777: 3759, 3067, 3068, 3066, 811: 5902, 1330: 5901}, - {363, 363, 6: 363, 9: 363, 15: 363, 51: 363, 363, 363, 363, 363, 537: 363, 542: 5904, 728: 5903, 730: 363}, - {359, 359, 6: 359, 9: 359, 15: 359, 51: 359, 359, 359, 359, 359, 537: 359, 542: 359, 728: 359, 730: 359}, - {538: 5908, 1003: 5909}, - {538: 5906, 643: 5907, 1192: 5905}, + {2: 285, 285, 285, 285, 285, 285, 285, 10: 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 58: 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 565: 285}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 565: 5908, 777: 5909, 3072, 3073, 3071, 1247: 5910}, + {566: 284, 717: 284, 720: 5936}, + {566: 280, 717: 280, 720: 5933}, + {566: 5911}, // 3035 - {361, 361, 6: 361, 9: 361, 15: 361, 51: 361, 361, 361, 361, 361, 537: 361, 730: 361}, - {358, 358, 6: 358, 9: 358, 15: 358, 51: 358, 358, 358, 358, 358, 537: 358, 730: 358}, - {357, 357, 6: 357, 9: 357, 15: 357, 51: 357, 357, 357, 357, 357, 537: 357, 730: 357}, - {944, 944, 6: 944, 9: 944, 15: 944, 51: 944, 944, 944, 944, 944, 57: 944, 537: 944, 730: 944}, - {362, 362, 6: 362, 9: 362, 15: 362, 51: 362, 362, 362, 362, 362, 537: 362, 730: 362}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 538: 3763, 636: 5895, 777: 3764, 3072, 3073, 3071, 811: 5894, 861: 5912, 1002: 5913, 1031: 5914}, + {372, 372, 6: 372, 9: 372, 15: 372, 51: 372, 372, 372, 372, 372, 183: 5918, 537: 372, 730: 372, 1327: 5917}, + {418, 418, 6: 418, 9: 418, 15: 418, 51: 418, 418, 418, 418, 418, 537: 418, 730: 418}, + {279, 279, 9: 5915}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 538: 3763, 636: 5895, 777: 3764, 3072, 3073, 3071, 811: 5894, 861: 5912, 1002: 5916}, // 3040 - {364, 364, 6: 364, 9: 364, 15: 364, 51: 364, 364, 364, 364, 364, 537: 364, 730: 364}, - {538: 5906, 643: 5907, 1192: 5912}, - {360, 360, 6: 360, 9: 360, 15: 360, 51: 360, 360, 360, 360, 360, 537: 360, 730: 360}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 589: 5914, 777: 5915, 3067, 3068, 3066}, - {566: 276, 717: 276}, + {417, 417, 6: 417, 9: 417, 15: 417, 51: 417, 417, 417, 417, 417, 537: 417, 730: 417}, + {419, 419, 6: 419, 9: 419, 15: 419, 51: 419, 419, 419, 419, 419, 537: 419, 730: 419}, + {537: 5920, 728: 5919}, + {15: 5931, 538: 5928, 1005: 5930}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 538: 3763, 777: 3764, 3072, 3073, 3071, 811: 5922, 1328: 5921}, // 3045 - {566: 275, 717: 275}, - {589: 5917}, - {566: 277, 717: 277}, - {9: 320, 535: 320, 566: 320, 717: 320}, - {337: 5920}, + {370, 370, 6: 370, 9: 370, 15: 370, 51: 370, 370, 370, 370, 370, 537: 370, 542: 5924, 728: 5923, 730: 370}, + {366, 366, 6: 366, 9: 366, 15: 366, 51: 366, 366, 366, 366, 366, 537: 366, 542: 366, 728: 366, 730: 366}, + {538: 5928, 1005: 5929}, + {538: 5926, 643: 5927, 1194: 5925}, + {368, 368, 6: 368, 9: 368, 15: 368, 51: 368, 368, 368, 368, 368, 537: 368, 730: 368}, // 3050 - {9: 322, 535: 322, 566: 322, 717: 322}, - {337: 5922}, - {9: 323, 535: 323, 566: 323, 717: 323}, - {9: 327, 56: 327, 535: 327, 566: 327, 717: 327}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 538: 3758, 777: 3759, 3067, 3068, 3066, 811: 5926}, + {365, 365, 6: 365, 9: 365, 15: 365, 51: 365, 365, 365, 365, 365, 537: 365, 730: 365}, + {364, 364, 6: 364, 9: 364, 15: 364, 51: 364, 364, 364, 364, 364, 537: 364, 730: 364}, + {952, 952, 6: 952, 9: 952, 15: 952, 51: 952, 952, 952, 952, 952, 57: 952, 537: 952, 730: 952}, + {369, 369, 6: 369, 9: 369, 15: 369, 51: 369, 369, 369, 369, 369, 537: 369, 730: 369}, + {371, 371, 6: 371, 9: 371, 15: 371, 51: 371, 371, 371, 371, 371, 537: 371, 730: 371}, // 3055 - {940, 940, 9: 940, 535: 940, 566: 940, 717: 940}, - {941, 941, 9: 941, 535: 941, 566: 941, 717: 941}, - {9: 298, 535: 298, 298, 566: 298, 717: 298}, - {9: 297, 535: 297, 297, 566: 297, 717: 297}, - {535: 5971, 633: 2016, 731: 2016}, + {538: 5926, 643: 5927, 1194: 5932}, + {367, 367, 6: 367, 9: 367, 15: 367, 51: 367, 367, 367, 367, 367, 537: 367, 730: 367}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 565: 5934, 777: 5935, 3072, 3073, 3071}, + {566: 282, 717: 282}, + {566: 281, 717: 281}, // 3060 - {9: 5871, 535: 5931, 717: 5932}, - {2: 282, 282, 282, 282, 282, 282, 282, 10: 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 58: 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 5885, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 589: 282, 614: 5884, 970: 5886, 1221: 5934}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 538: 3758, 636: 5875, 777: 3759, 3067, 3068, 3066, 811: 5874, 861: 5876, 976: 5933}, - {335, 335, 9: 5878}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 589: 5888, 777: 5889, 3067, 3068, 3066, 1247: 5935}, + {565: 5937}, + {566: 283, 717: 283}, + {9: 326, 535: 326, 566: 326, 717: 326}, + {338: 5940}, + {9: 328, 535: 328, 566: 328, 717: 328}, // 3065 - {717: 5936}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 538: 3758, 636: 5875, 777: 3759, 3067, 3068, 3066, 811: 5874, 861: 5892, 1000: 5893, 1030: 5937}, - {401, 401, 9: 5895, 537: 401, 730: 5939, 1081: 5938, 5940}, - {400, 400, 6: 400, 15: 400, 51: 400, 400, 400, 400, 400, 537: 400}, - {161: 5960, 5958, 168: 5961, 5959, 5962, 327: 5953, 463: 5955, 1083: 5957, 1446: 5956, 1471: 5954}, + {338: 5942}, + {9: 329, 535: 329, 566: 329, 717: 329}, + {9: 333, 56: 333, 535: 333, 566: 333, 717: 333}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 538: 3763, 777: 3764, 3072, 3073, 3071, 811: 5946}, + {948, 948, 9: 948, 535: 948, 566: 948, 717: 948}, // 3070 - {334, 334, 537: 5942, 1313: 5941}, - {337, 337}, - {163: 5946, 5944, 5945, 5947, 963: 5943}, - {1012: 5952}, - {564: 3053, 805: 5951}, + {949, 949, 9: 949, 535: 949, 566: 949, 717: 949}, + {9: 304, 535: 304, 304, 566: 304, 717: 304}, + {9: 303, 535: 303, 303, 566: 303, 717: 303}, + {535: 5991, 633: 2026, 731: 2026}, + {9: 5891, 535: 5951, 717: 5952}, // 3075 - {564: 3053, 805: 5950}, - {564: 3053, 805: 5949}, - {564: 3053, 805: 5948}, - {329, 329}, - {330, 330}, + {2: 288, 288, 288, 288, 288, 288, 288, 10: 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 58: 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 5905, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 565: 288, 613: 5904, 972: 5906, 1221: 5954}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 538: 3763, 636: 5895, 777: 3764, 3072, 3073, 3071, 811: 5894, 861: 5896, 977: 5953}, + {341, 341, 9: 5898}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 565: 5908, 777: 5909, 3072, 3073, 3071, 1247: 5955}, + {717: 5956}, // 3080 - {331, 331}, - {332, 332}, - {333, 333}, - {399, 399, 6: 399, 15: 399, 51: 399, 399, 399, 399, 399, 537: 399}, - {398, 398, 6: 398, 15: 398, 51: 398, 398, 398, 398, 398, 537: 398}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 538: 3763, 636: 5895, 777: 3764, 3072, 3073, 3071, 811: 5894, 861: 5912, 1002: 5913, 1031: 5957}, + {408, 408, 9: 5915, 537: 408, 730: 5959, 1083: 5958, 5960}, + {407, 407, 6: 407, 15: 407, 51: 407, 407, 407, 407, 407, 537: 407}, + {163: 5980, 5978, 170: 5981, 5979, 5982, 412: 5973, 463: 5975, 1085: 5977, 1446: 5976, 1471: 5974}, + {340, 340, 537: 5962, 1311: 5961}, // 3085 - {397, 397, 6: 397, 15: 397, 51: 397, 397, 397, 397, 397, 537: 397}, - {396, 396, 6: 396, 15: 396, 51: 396, 396, 396, 396, 396, 161: 5960, 5958, 168: 5961, 5959, 5962, 537: 396, 571: 5968, 1083: 5969}, - {395, 395, 6: 395, 15: 395, 51: 395, 395, 395, 395, 395, 161: 395, 395, 168: 395, 395, 395, 537: 395, 571: 395}, - {538: 5967}, - {538: 5966}, + {343, 343}, + {165: 5966, 5964, 5965, 5967, 965: 5963}, + {1014: 5972}, + {567: 3058, 805: 5971}, + {567: 3058, 805: 5970}, // 3090 - {538: 5965}, - {538: 5964}, - {538: 5963}, - {388, 388, 6: 388, 15: 388, 51: 388, 388, 388, 388, 388, 161: 388, 388, 168: 388, 388, 388, 537: 388, 571: 388}, - {389, 389, 6: 389, 15: 389, 51: 389, 389, 389, 389, 389, 161: 389, 389, 168: 389, 389, 389, 537: 389, 571: 389}, + {567: 3058, 805: 5969}, + {567: 3058, 805: 5968}, + {335, 335}, + {336, 336}, + {337, 337}, // 3095 - {390, 390, 6: 390, 15: 390, 51: 390, 390, 390, 390, 390, 161: 390, 390, 168: 390, 390, 390, 537: 390, 571: 390}, - {391, 391, 6: 391, 15: 391, 51: 391, 391, 391, 391, 391, 161: 391, 391, 168: 391, 391, 391, 537: 391, 571: 391}, - {392, 392, 6: 392, 15: 392, 51: 392, 392, 392, 392, 392, 161: 392, 392, 168: 392, 392, 392, 537: 392, 571: 392}, - {161: 5960, 5958, 168: 5961, 5959, 5962, 1083: 5970}, - {393, 393, 6: 393, 15: 393, 51: 393, 393, 393, 393, 393, 161: 393, 393, 168: 393, 393, 393, 537: 393, 571: 393}, + {338, 338}, + {339, 339}, + {406, 406, 6: 406, 15: 406, 51: 406, 406, 406, 406, 406, 537: 406}, + {405, 405, 6: 405, 15: 405, 51: 405, 405, 405, 405, 405, 537: 405}, + {404, 404, 6: 404, 15: 404, 51: 404, 404, 404, 404, 404, 537: 404}, // 3100 - {394, 394, 6: 394, 15: 394, 51: 394, 394, 394, 394, 394, 161: 394, 394, 168: 394, 394, 394, 537: 394, 571: 394}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 538: 3758, 636: 5875, 777: 3759, 3067, 3068, 3066, 811: 5874, 861: 5972}, - {717: 5973}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 538: 3758, 636: 5875, 777: 3759, 3067, 3068, 3066, 811: 5874, 861: 5876, 976: 5974}, - {334, 334, 9: 5878, 537: 5942, 1313: 5975}, + {403, 403, 6: 403, 15: 403, 51: 403, 403, 403, 403, 403, 163: 5980, 5978, 170: 5981, 5979, 5982, 537: 403, 572: 5988, 1085: 5989}, + {402, 402, 6: 402, 15: 402, 51: 402, 402, 402, 402, 402, 163: 402, 402, 170: 402, 402, 402, 537: 402, 572: 402}, + {538: 5987}, + {538: 5986}, + {538: 5985}, // 3105 - {336, 336}, - {2478, 2478, 9: 2478, 16: 2478, 18: 2478, 21: 2478, 540: 2478, 543: 2478, 558: 2478, 560: 2478, 566: 2478, 568: 2478, 584: 2478, 714: 2478, 717: 2478, 770: 2478, 2478}, - {426, 426}, - {2: 1060, 1060, 1060, 1060, 1060, 1060, 1060, 10: 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 58: 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 536: 1060, 538: 1060, 1060, 1060, 1060, 545: 1060, 1060, 548: 1060, 1060, 1060, 552: 1060, 1060, 1060, 557: 1060, 1060, 564: 1060, 1060, 1060, 578: 1060, 583: 1060, 589: 1060, 591: 1060, 1060, 624: 1060, 631: 1060, 633: 1060, 1060, 1060, 1060, 641: 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 662: 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 702: 1060, 1060, 1060, 1060, 716: 1060, 721: 1060, 835: 1060, 1060, 842: 1060, 1060, 1060, 846: 1060, 855: 1060, 1060, 1060}, - {2: 1058, 1058, 1058, 1058, 1058, 1058, 1058, 10: 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 58: 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 536: 1058, 554: 1058, 565: 1058, 1058, 648: 1058, 842: 1058, 1058, 1058}, + {538: 5984}, + {538: 5983}, + {395, 395, 6: 395, 15: 395, 51: 395, 395, 395, 395, 395, 163: 395, 395, 170: 395, 395, 395, 537: 395, 572: 395}, + {396, 396, 6: 396, 15: 396, 51: 396, 396, 396, 396, 396, 163: 396, 396, 170: 396, 396, 396, 537: 396, 572: 396}, + {397, 397, 6: 397, 15: 397, 51: 397, 397, 397, 397, 397, 163: 397, 397, 170: 397, 397, 397, 537: 397, 572: 397}, // 3110 - {2: 1263, 1263, 1263, 1263, 1263, 1263, 1263, 10: 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 58: 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 536: 1263, 554: 1263, 648: 1263, 842: 5983, 5982, 5981, 940: 5984, 996: 5985}, - {2: 1266, 1266, 1266, 1266, 1266, 1266, 1266, 10: 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 58: 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 536: 1266, 538: 1266, 1266, 1266, 1266, 545: 1266, 1266, 548: 1266, 1266, 1266, 552: 1266, 1266, 1266, 557: 1266, 1266, 564: 1266, 1266, 1266, 578: 1266, 583: 1266, 589: 1266, 591: 1266, 1266, 624: 1266, 631: 1266, 633: 1266, 1266, 1266, 1266, 641: 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 662: 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 702: 1266, 1266, 1266, 1266, 716: 1266, 721: 1266, 835: 1266, 1266, 842: 1266, 1266, 1266, 846: 1266, 855: 1266, 1266, 1266}, - {2: 1265, 1265, 1265, 1265, 1265, 1265, 1265, 10: 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 58: 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 536: 1265, 538: 1265, 1265, 1265, 1265, 545: 1265, 1265, 548: 1265, 1265, 1265, 552: 1265, 1265, 1265, 557: 1265, 1265, 564: 1265, 1265, 1265, 578: 1265, 583: 1265, 589: 1265, 591: 1265, 1265, 624: 1265, 631: 1265, 633: 1265, 1265, 1265, 1265, 641: 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 662: 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 702: 1265, 1265, 1265, 1265, 716: 1265, 721: 1265, 835: 1265, 1265, 842: 1265, 1265, 1265, 846: 1265, 855: 1265, 1265, 1265}, - {2: 1264, 1264, 1264, 1264, 1264, 1264, 1264, 10: 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 58: 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 536: 1264, 538: 1264, 1264, 1264, 1264, 545: 1264, 1264, 548: 1264, 1264, 1264, 552: 1264, 1264, 1264, 557: 1264, 1264, 564: 1264, 1264, 1264, 578: 1264, 583: 1264, 589: 1264, 591: 1264, 1264, 624: 1264, 631: 1264, 633: 1264, 1264, 1264, 1264, 641: 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 662: 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 702: 1264, 1264, 1264, 1264, 716: 1264, 721: 1264, 835: 1264, 1264, 842: 1264, 1264, 1264, 846: 1264, 855: 1264, 1264, 1264}, - {2: 1262, 1262, 1262, 1262, 1262, 1262, 1262, 10: 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 58: 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 536: 1262, 554: 1262, 565: 1262, 1262, 648: 1262}, + {398, 398, 6: 398, 15: 398, 51: 398, 398, 398, 398, 398, 163: 398, 398, 170: 398, 398, 398, 537: 398, 572: 398}, + {399, 399, 6: 399, 15: 399, 51: 399, 399, 399, 399, 399, 163: 399, 399, 170: 399, 399, 399, 537: 399, 572: 399}, + {163: 5980, 5978, 170: 5981, 5979, 5982, 1085: 5990}, + {400, 400, 6: 400, 15: 400, 51: 400, 400, 400, 400, 400, 163: 400, 400, 170: 400, 400, 400, 537: 400, 572: 400}, + {401, 401, 6: 401, 15: 401, 51: 401, 401, 401, 401, 401, 163: 401, 401, 170: 401, 401, 401, 537: 401, 572: 401}, // 3115 - {2: 2128, 2128, 2128, 2128, 2128, 2128, 2128, 10: 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 58: 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 536: 2128, 554: 4697, 648: 2128, 964: 5986}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 536: 5995, 648: 5990, 777: 3949, 3067, 3068, 3066, 5994, 810: 5993, 901: 5992, 905: 5991, 5989, 961: 5987, 999: 5988}, - {1137, 1137, 9: 1137, 57: 1137, 535: 1137, 537: 1137, 544: 1137, 547: 1137, 555: 1137, 1137, 559: 1137, 1137, 562: 1137, 1137, 565: 1137, 567: 1137, 1137, 1137, 576: 1137, 1137, 579: 1137}, - {9: 6041, 560: 6110}, - {9: 1135, 545: 6008, 6009, 560: 6095, 578: 6007, 581: 6010, 585: 6006, 6011, 588: 6012, 920: 6005, 925: 6004}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 538: 3763, 636: 5895, 777: 3764, 3072, 3073, 3071, 811: 5894, 861: 5992}, + {717: 5993}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 538: 3763, 636: 5895, 777: 3764, 3072, 3073, 3071, 811: 5894, 861: 5896, 977: 5994}, + {340, 340, 9: 5898, 537: 5962, 1311: 5995}, + {342, 342}, // 3120 - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 6092, 3067, 3068, 3066}, - {1133, 1133, 9: 1133, 57: 1133, 535: 1133, 537: 1133, 544: 1133, 1133, 1133, 1133, 555: 1133, 1133, 559: 1133, 1133, 562: 1133, 1133, 565: 1133, 567: 1133, 1133, 1133, 576: 1133, 1133, 1133, 1133, 581: 1133, 585: 1133, 1133, 588: 1133, 590: 1133}, - {1132, 1132, 9: 1132, 57: 1132, 535: 1132, 537: 1132, 544: 1132, 1132, 1132, 1132, 555: 1132, 1132, 559: 1132, 1132, 562: 1132, 1132, 565: 1132, 567: 1132, 1132, 1132, 576: 1132, 1132, 1132, 1132, 581: 1132, 585: 1132, 1132, 588: 1132, 590: 1132}, - {1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 537: 1128, 542: 1128, 544: 1128, 1128, 1128, 1128, 551: 6045, 554: 1128, 1128, 1128, 559: 1128, 1128, 562: 1128, 1128, 565: 1128, 567: 1128, 1128, 1128, 1128, 576: 1128, 1128, 1128, 1128, 1128, 1128, 585: 1128, 1128, 588: 1128, 590: 1128, 597: 1128, 736: 1128, 969: 6044}, - {1126, 1126, 3316, 3471, 3280, 3156, 3196, 3318, 3080, 1126, 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 1126, 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 1126, 537: 1126, 542: 6002, 544: 1126, 1126, 1126, 1126, 555: 1126, 1126, 559: 1126, 1126, 562: 1126, 1126, 565: 1126, 567: 1126, 1126, 1126, 576: 1126, 1126, 1126, 1126, 581: 1126, 585: 1126, 1126, 588: 1126, 590: 1126, 777: 6001, 3067, 3068, 3066, 1022: 6000, 5999}, + {2484, 2484, 9: 2484, 16: 2484, 18: 2484, 21: 2484, 540: 2484, 543: 2484, 558: 2484, 561: 2484, 566: 2484, 569: 2484, 585: 2484, 714: 2484, 717: 2484, 770: 2484, 2484}, + {433, 433}, + {2: 1068, 1068, 1068, 1068, 1068, 1068, 1068, 10: 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 58: 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 536: 1068, 538: 1068, 1068, 1068, 1068, 545: 1068, 1068, 548: 1068, 1068, 1068, 552: 1068, 1068, 1068, 557: 1068, 1068, 564: 1068, 1068, 1068, 1068, 579: 1068, 584: 1068, 591: 1068, 1068, 630: 1068, 1068, 633: 1068, 1068, 1068, 1068, 641: 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 662: 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 716: 1068, 721: 1068, 834: 1068, 1068, 839: 1068, 841: 1068, 844: 1068, 846: 1068, 855: 1068, 1068, 1068}, + {2: 1066, 1066, 1066, 1066, 1066, 1066, 1066, 10: 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 58: 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 536: 1066, 554: 1066, 564: 1066, 1066, 1066, 648: 1066, 839: 1066, 841: 1066, 844: 1066}, + {2: 1272, 1272, 1272, 1272, 1272, 1272, 1272, 10: 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 58: 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 536: 1272, 554: 1272, 565: 1272, 648: 1272, 839: 6003, 841: 6002, 844: 6001, 942: 6004, 997: 6005}, // 3125 - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 536: 5995, 2922, 552: 2921, 614: 2920, 648: 5990, 701: 2916, 777: 3949, 3067, 3068, 3066, 5998, 810: 5993, 812: 3869, 2917, 2918, 2919, 2928, 818: 2926, 2925, 2924, 822: 3868, 3871, 3870, 901: 5992, 905: 5991, 5997, 961: 5987, 999: 5996}, - {9: 6041, 57: 6042}, - {1135, 1135, 9: 1135, 57: 1135, 535: 1135, 537: 1135, 544: 1135, 6008, 6009, 1135, 555: 1135, 1135, 559: 1135, 1135, 562: 1135, 1135, 565: 1135, 567: 1135, 1135, 1135, 576: 1135, 1135, 6007, 1135, 581: 6010, 585: 6006, 6011, 588: 6012, 920: 6005, 925: 6004}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 1126, 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 4011, 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 542: 6002, 544: 1020, 1126, 1126, 555: 1020, 1020, 559: 3881, 562: 3880, 569: 3879, 578: 1126, 581: 1126, 585: 1126, 1126, 588: 1126, 777: 6001, 3067, 3068, 3066, 848: 3882, 3883, 1022: 6000, 5999}, - {1130, 1130, 9: 1130, 57: 1130, 535: 1130, 537: 1130, 544: 1130, 1130, 1130, 1130, 555: 1130, 1130, 559: 1130, 1130, 562: 1130, 1130, 565: 1130, 567: 1130, 1130, 1130, 576: 1130, 1130, 1130, 1130, 581: 1130, 585: 1130, 1130, 588: 1130, 590: 1130}, + {2: 1275, 1275, 1275, 1275, 1275, 1275, 1275, 10: 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 58: 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 536: 1275, 538: 1275, 1275, 1275, 1275, 545: 1275, 1275, 548: 1275, 1275, 1275, 552: 1275, 1275, 1275, 557: 1275, 1275, 564: 1275, 1275, 1275, 1275, 579: 1275, 584: 1275, 591: 1275, 1275, 630: 1275, 1275, 633: 1275, 1275, 1275, 1275, 641: 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 662: 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 716: 1275, 721: 1275, 834: 1275, 1275, 839: 1275, 841: 1275, 844: 1275, 846: 1275, 855: 1275, 1275, 1275}, + {2: 1274, 1274, 1274, 1274, 1274, 1274, 1274, 10: 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 58: 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 536: 1274, 538: 1274, 1274, 1274, 1274, 545: 1274, 1274, 548: 1274, 1274, 1274, 552: 1274, 1274, 1274, 557: 1274, 1274, 564: 1274, 1274, 1274, 1274, 579: 1274, 584: 1274, 591: 1274, 1274, 630: 1274, 1274, 633: 1274, 1274, 1274, 1274, 641: 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 662: 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 716: 1274, 721: 1274, 834: 1274, 1274, 839: 1274, 841: 1274, 844: 1274, 846: 1274, 855: 1274, 1274, 1274}, + {2: 1273, 1273, 1273, 1273, 1273, 1273, 1273, 10: 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 58: 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 536: 1273, 538: 1273, 1273, 1273, 1273, 545: 1273, 1273, 548: 1273, 1273, 1273, 552: 1273, 1273, 1273, 557: 1273, 1273, 564: 1273, 1273, 1273, 1273, 579: 1273, 584: 1273, 591: 1273, 1273, 630: 1273, 1273, 633: 1273, 1273, 1273, 1273, 641: 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 662: 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 716: 1273, 721: 1273, 834: 1273, 1273, 839: 1273, 841: 1273, 844: 1273, 846: 1273, 855: 1273, 1273, 1273}, + {2: 1271, 1271, 1271, 1271, 1271, 1271, 1271, 10: 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 58: 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 536: 1271, 554: 1271, 564: 1271, 1271, 1271, 648: 1271}, + {2: 2137, 2137, 2137, 2137, 2137, 2137, 2137, 10: 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 58: 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 536: 2137, 554: 4706, 565: 2137, 648: 2137, 966: 6006}, // 3130 - {1125, 1125, 9: 1125, 57: 1125, 535: 1125, 537: 1125, 544: 1125, 1125, 1125, 1125, 554: 1125, 1125, 1125, 559: 1125, 1125, 562: 1125, 1125, 565: 1125, 567: 1125, 1125, 1125, 1125, 576: 1125, 1125, 1125, 1125, 1125, 1125, 585: 1125, 1125, 588: 1125, 590: 1125, 597: 1125, 736: 1125}, - {1124, 1124, 9: 1124, 57: 1124, 535: 1124, 537: 1124, 544: 1124, 1124, 1124, 1124, 554: 1124, 1124, 1124, 559: 1124, 1124, 562: 1124, 1124, 565: 1124, 567: 1124, 1124, 1124, 1124, 576: 1124, 1124, 1124, 1124, 1124, 1124, 585: 1124, 1124, 588: 1124, 590: 1124, 597: 1124, 736: 1124}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 6003, 3067, 3068, 3066}, - {1123, 1123, 9: 1123, 57: 1123, 535: 1123, 537: 1123, 544: 1123, 1123, 1123, 1123, 554: 1123, 1123, 1123, 559: 1123, 1123, 562: 1123, 1123, 565: 1123, 567: 1123, 1123, 1123, 1123, 576: 1123, 1123, 1123, 1123, 1123, 1123, 585: 1123, 1123, 588: 1123, 590: 1123, 597: 1123, 736: 1123}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 536: 5995, 777: 3949, 3067, 3068, 3066, 5994, 810: 5993, 901: 5992, 905: 5991, 6034}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 536: 6015, 565: 3955, 648: 6010, 777: 3954, 3072, 3073, 3071, 6014, 810: 6013, 900: 6012, 905: 6011, 6009, 963: 6007, 1001: 6008}, + {1145, 1145, 9: 1145, 57: 1145, 535: 1145, 537: 1145, 544: 1145, 547: 1145, 555: 1145, 1145, 559: 1145, 1145, 1145, 563: 1145, 1145, 568: 1145, 1145, 1145, 577: 1145, 1145, 580: 1145}, + {9: 6061, 561: 6130}, + {9: 1143, 545: 6028, 6029, 561: 6115, 579: 6027, 582: 6030, 586: 6026, 6031, 589: 6032, 922: 6025, 927: 6024}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 6112, 3072, 3073, 3071}, // 3135 - {581: 1094, 1015: 6021, 1235: 6025}, - {545: 6008, 6009, 581: 6018, 920: 6019}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 536: 5995, 777: 3949, 3067, 3068, 3066, 5994, 810: 5993, 901: 5992, 905: 5991, 6015}, - {581: 1096, 1015: 1096}, - {581: 1095, 1015: 1095}, + {1141, 1141, 9: 1141, 57: 1141, 535: 1141, 537: 1141, 544: 1141, 1141, 1141, 1141, 555: 1141, 1141, 559: 1141, 1141, 1141, 563: 1141, 1141, 568: 1141, 1141, 1141, 577: 1141, 1141, 1141, 1141, 582: 1141, 586: 1141, 1141, 589: 1141, 1141}, + {1140, 1140, 9: 1140, 57: 1140, 535: 1140, 537: 1140, 544: 1140, 1140, 1140, 1140, 555: 1140, 1140, 559: 1140, 1140, 1140, 563: 1140, 1140, 568: 1140, 1140, 1140, 577: 1140, 1140, 1140, 1140, 582: 1140, 586: 1140, 1140, 589: 1140, 1140}, + {1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 537: 1136, 542: 1136, 544: 1136, 1136, 1136, 1136, 551: 6065, 554: 1136, 1136, 1136, 559: 1136, 1136, 1136, 563: 1136, 1136, 568: 1136, 1136, 1136, 1136, 577: 1136, 1136, 1136, 1136, 1136, 1136, 586: 1136, 1136, 589: 1136, 1136, 597: 1136, 736: 1136, 971: 6064}, + {1134, 1134, 3321, 3476, 3285, 3160, 3201, 3323, 3085, 1134, 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 1134, 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 1134, 537: 1134, 542: 6022, 544: 1134, 1134, 1134, 1134, 555: 1134, 1134, 559: 1134, 1134, 1134, 563: 1134, 1134, 568: 1134, 1134, 1134, 577: 1134, 1134, 1134, 1134, 582: 1134, 586: 1134, 1134, 589: 1134, 1134, 777: 6021, 3072, 3073, 3071, 1024: 6020, 6019}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 536: 6015, 2928, 552: 2927, 565: 3955, 613: 2926, 648: 6010, 660: 2922, 777: 3954, 3072, 3073, 3071, 6018, 810: 6013, 812: 3874, 2923, 2924, 2925, 2934, 2932, 2931, 2930, 821: 3873, 3876, 3875, 900: 6012, 905: 6011, 6017, 963: 6007, 1001: 6016}, // 3140 - {2: 1092, 1092, 1092, 1092, 1092, 1092, 1092, 10: 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 58: 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 536: 1092}, - {581: 6014}, - {581: 6013}, - {2: 1090, 1090, 1090, 1090, 1090, 1090, 1090, 10: 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 58: 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 536: 1090}, - {2: 1091, 1091, 1091, 1091, 1091, 1091, 1091, 10: 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 58: 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 536: 1091}, + {9: 6061, 57: 6062}, + {1143, 1143, 9: 1143, 57: 1143, 535: 1143, 537: 1143, 544: 1143, 6028, 6029, 1143, 555: 1143, 1143, 559: 1143, 1143, 1143, 563: 1143, 1143, 568: 1143, 1143, 1143, 577: 1143, 1143, 6027, 1143, 582: 6030, 586: 6026, 6031, 589: 6032, 922: 6025, 927: 6024}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 1134, 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 4019, 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 542: 6022, 544: 1028, 1134, 1134, 555: 1028, 1028, 559: 3886, 3885, 570: 3884, 579: 1134, 582: 1134, 586: 1134, 1134, 589: 1134, 777: 6021, 3072, 3073, 3071, 847: 3887, 3888, 1024: 6020, 6019}, + {1138, 1138, 9: 1138, 57: 1138, 535: 1138, 537: 1138, 544: 1138, 1138, 1138, 1138, 555: 1138, 1138, 559: 1138, 1138, 1138, 563: 1138, 1138, 568: 1138, 1138, 1138, 577: 1138, 1138, 1138, 1138, 582: 1138, 586: 1138, 1138, 589: 1138, 1138}, + {1133, 1133, 9: 1133, 57: 1133, 535: 1133, 537: 1133, 544: 1133, 1133, 1133, 1133, 554: 1133, 1133, 1133, 559: 1133, 1133, 1133, 563: 1133, 1133, 568: 1133, 1133, 1133, 1133, 577: 1133, 1133, 1133, 1133, 1133, 1133, 586: 1133, 1133, 589: 1133, 1133, 597: 1133, 736: 1133}, // 3145 - {1098, 1098, 9: 1098, 57: 1098, 535: 6016, 537: 1098, 544: 1098, 1098, 1098, 1098, 555: 1098, 1098, 559: 1098, 1098, 562: 1098, 1098, 565: 1098, 567: 1098, 1098, 1098, 576: 1098, 1098, 1098, 1098, 581: 1098, 585: 1098, 1098, 588: 1098, 590: 1098, 920: 6005, 925: 6004}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 6017}, - {1097, 1097, 9: 1097, 57: 1097, 535: 1097, 537: 1097, 544: 1097, 1097, 1097, 1097, 555: 1097, 1097, 559: 1097, 1097, 562: 1097, 1097, 565: 1097, 567: 1097, 1097, 1097, 571: 3767, 3765, 3766, 3764, 3762, 1097, 1097, 1097, 1097, 581: 1097, 585: 1097, 1097, 588: 1097, 590: 1097, 806: 3763, 3761}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 536: 5995, 777: 3949, 3067, 3068, 3066, 5994, 810: 5993, 901: 5992, 905: 5991, 6024}, - {581: 1094, 1015: 6021, 1235: 6020}, + {1132, 1132, 9: 1132, 57: 1132, 535: 1132, 537: 1132, 544: 1132, 1132, 1132, 1132, 554: 1132, 1132, 1132, 559: 1132, 1132, 1132, 563: 1132, 1132, 568: 1132, 1132, 1132, 1132, 577: 1132, 1132, 1132, 1132, 1132, 1132, 586: 1132, 1132, 589: 1132, 1132, 597: 1132, 736: 1132}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 6023, 3072, 3073, 3071}, + {1131, 1131, 9: 1131, 57: 1131, 535: 1131, 537: 1131, 544: 1131, 1131, 1131, 1131, 554: 1131, 1131, 1131, 559: 1131, 1131, 1131, 563: 1131, 1131, 568: 1131, 1131, 1131, 1131, 577: 1131, 1131, 1131, 1131, 1131, 1131, 586: 1131, 1131, 589: 1131, 1131, 597: 1131, 736: 1131}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 536: 6015, 565: 3955, 777: 3954, 3072, 3073, 3071, 6014, 810: 6013, 900: 6012, 905: 6011, 6054}, + {582: 1102, 1017: 6041, 1236: 6045}, // 3150 - {581: 6022}, - {581: 1093}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 536: 5995, 777: 3949, 3067, 3068, 3066, 5994, 810: 5993, 901: 5992, 905: 5991, 6023}, - {1099, 1099, 9: 1099, 57: 1099, 535: 1099, 537: 1099, 544: 1099, 1099, 1099, 1099, 555: 1099, 1099, 559: 1099, 1099, 562: 1099, 1099, 565: 1099, 567: 1099, 1099, 1099, 576: 1099, 1099, 1099, 1099, 581: 1099, 585: 1099, 1099, 588: 1099, 590: 1099, 920: 6005, 925: 6004}, - {1100, 1100, 9: 1100, 57: 1100, 535: 1100, 537: 1100, 544: 1100, 1100, 1100, 1100, 555: 1100, 1100, 559: 1100, 1100, 562: 1100, 1100, 565: 1100, 567: 1100, 1100, 1100, 576: 1100, 1100, 1100, 1100, 581: 1100, 585: 1100, 1100, 588: 1100, 590: 1100, 920: 6005, 925: 6004}, + {545: 6028, 6029, 582: 6038, 922: 6039}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 536: 6015, 565: 3955, 777: 3954, 3072, 3073, 3071, 6014, 810: 6013, 900: 6012, 905: 6011, 6035}, + {582: 1104, 1017: 1104}, + {582: 1103, 1017: 1103}, + {2: 1100, 1100, 1100, 1100, 1100, 1100, 1100, 10: 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 58: 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 536: 1100, 565: 1100}, // 3155 - {581: 6026}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 536: 5995, 777: 3949, 3067, 3068, 3066, 5994, 810: 5993, 901: 5992, 905: 5991, 6027}, - {535: 6028, 545: 6008, 6009, 6029, 578: 6007, 581: 6010, 585: 6006, 6011, 588: 6012, 920: 6005, 925: 6004}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 6033}, - {536: 6030}, + {582: 6034}, + {582: 6033}, + {2: 1098, 1098, 1098, 1098, 1098, 1098, 1098, 10: 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 58: 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 536: 1098, 565: 1098}, + {2: 1099, 1099, 1099, 1099, 1099, 1099, 1099, 10: 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 58: 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 536: 1099, 565: 1099}, + {1106, 1106, 9: 1106, 57: 1106, 535: 6036, 537: 1106, 544: 1106, 1106, 1106, 1106, 555: 1106, 1106, 559: 1106, 1106, 1106, 563: 1106, 1106, 568: 1106, 1106, 1106, 577: 1106, 1106, 1106, 1106, 582: 1106, 586: 1106, 1106, 589: 1106, 1106, 922: 6025, 927: 6024}, // 3160 - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 4046, 3067, 3068, 3066, 827: 4047, 912: 6031}, - {9: 4049, 57: 6032}, - {1101, 1101, 9: 1101, 57: 1101, 535: 1101, 537: 1101, 544: 1101, 1101, 1101, 1101, 555: 1101, 1101, 559: 1101, 1101, 562: 1101, 1101, 565: 1101, 567: 1101, 1101, 1101, 576: 1101, 1101, 1101, 1101, 581: 1101, 585: 1101, 1101, 588: 1101, 590: 1101}, - {1102, 1102, 9: 1102, 57: 1102, 535: 1102, 537: 1102, 544: 1102, 1102, 1102, 1102, 555: 1102, 1102, 559: 1102, 1102, 562: 1102, 1102, 565: 1102, 567: 1102, 1102, 1102, 571: 3767, 3765, 3766, 3764, 3762, 1102, 1102, 1102, 1102, 581: 1102, 585: 1102, 1102, 588: 1102, 590: 1102, 806: 3763, 3761}, - {1105, 1105, 9: 1105, 57: 1105, 535: 6035, 537: 1105, 544: 1105, 6008, 6009, 6036, 555: 1105, 1105, 559: 1105, 1105, 562: 1105, 1105, 565: 1105, 567: 1105, 1105, 1105, 576: 1105, 1105, 6007, 1105, 581: 6010, 585: 6006, 6011, 588: 6012, 590: 1105, 920: 6005, 925: 6004}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 6037}, + {1105, 1105, 9: 1105, 57: 1105, 535: 1105, 537: 1105, 544: 1105, 1105, 1105, 1105, 555: 1105, 1105, 559: 1105, 1105, 1105, 563: 1105, 1105, 568: 1105, 1105, 1105, 572: 3772, 3770, 3771, 3769, 3767, 1105, 1105, 1105, 1105, 582: 1105, 586: 1105, 1105, 589: 1105, 1105, 806: 3768, 3766}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 536: 6015, 565: 3955, 777: 3954, 3072, 3073, 3071, 6014, 810: 6013, 900: 6012, 905: 6011, 6044}, + {582: 1102, 1017: 6041, 1236: 6040}, + {582: 6042}, // 3165 - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 6040}, - {536: 6037}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 4046, 3067, 3068, 3066, 827: 4047, 912: 6038}, - {9: 4049, 57: 6039}, - {1103, 1103, 9: 1103, 57: 1103, 535: 1103, 537: 1103, 544: 1103, 1103, 1103, 1103, 555: 1103, 1103, 559: 1103, 1103, 562: 1103, 1103, 565: 1103, 567: 1103, 1103, 1103, 576: 1103, 1103, 1103, 1103, 581: 1103, 585: 1103, 1103, 588: 1103, 590: 1103}, + {582: 1101}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 536: 6015, 565: 3955, 777: 3954, 3072, 3073, 3071, 6014, 810: 6013, 900: 6012, 905: 6011, 6043}, + {1107, 1107, 9: 1107, 57: 1107, 535: 1107, 537: 1107, 544: 1107, 1107, 1107, 1107, 555: 1107, 1107, 559: 1107, 1107, 1107, 563: 1107, 1107, 568: 1107, 1107, 1107, 577: 1107, 1107, 1107, 1107, 582: 1107, 586: 1107, 1107, 589: 1107, 1107, 922: 6025, 927: 6024}, + {1108, 1108, 9: 1108, 57: 1108, 535: 1108, 537: 1108, 544: 1108, 1108, 1108, 1108, 555: 1108, 1108, 559: 1108, 1108, 1108, 563: 1108, 1108, 568: 1108, 1108, 1108, 577: 1108, 1108, 1108, 1108, 582: 1108, 586: 1108, 1108, 589: 1108, 1108, 922: 6025, 927: 6024}, + {582: 6046}, // 3170 - {1104, 1104, 9: 1104, 57: 1104, 535: 1104, 537: 1104, 544: 1104, 1104, 1104, 1104, 555: 1104, 1104, 559: 1104, 1104, 562: 1104, 1104, 565: 1104, 567: 1104, 1104, 1104, 571: 3767, 3765, 3766, 3764, 3762, 1104, 1104, 1104, 1104, 581: 1104, 585: 1104, 1104, 588: 1104, 590: 1104, 806: 3763, 3761}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 536: 5995, 648: 5990, 777: 3949, 3067, 3068, 3066, 5994, 810: 5993, 901: 5992, 905: 5991, 5997, 961: 6043}, - {1129, 1129, 9: 1129, 57: 1129, 535: 1129, 537: 1129, 544: 1129, 1129, 1129, 1129, 555: 1129, 1129, 559: 1129, 1129, 562: 1129, 1129, 565: 1129, 567: 1129, 1129, 1129, 576: 1129, 1129, 1129, 1129, 581: 1129, 585: 1129, 1129, 588: 1129, 590: 1129}, - {1136, 1136, 9: 1136, 57: 1136, 535: 1136, 537: 1136, 544: 1136, 547: 1136, 555: 1136, 1136, 559: 1136, 1136, 562: 1136, 1136, 565: 1136, 567: 1136, 1136, 1136, 576: 1136, 1136, 579: 1136}, - {1126, 1126, 3316, 3471, 3280, 3156, 3196, 3318, 3080, 1126, 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 1126, 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 1126, 537: 1126, 542: 6002, 544: 1126, 1126, 1126, 1126, 554: 1126, 1126, 1126, 559: 1126, 1126, 562: 1126, 1126, 565: 1126, 567: 1126, 1126, 1126, 1126, 576: 1126, 1126, 1126, 1126, 1126, 1126, 585: 1126, 1126, 588: 1126, 590: 1126, 597: 1126, 736: 1126, 777: 6001, 3067, 3068, 3066, 1022: 6000, 6049}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 536: 6015, 565: 3955, 777: 3954, 3072, 3073, 3071, 6014, 810: 6013, 900: 6012, 905: 6011, 6047}, + {535: 6048, 545: 6028, 6029, 6049, 579: 6027, 582: 6030, 586: 6026, 6031, 589: 6032, 922: 6025, 927: 6024}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 6053}, + {536: 6050}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 4054, 3072, 3073, 3071, 828: 4055, 912: 6051}, // 3175 - {536: 6046}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 5277, 3067, 3068, 3066, 865: 6047}, - {9: 5278, 57: 6048}, - {1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 542: 1127, 544: 1127, 1127, 1127, 1127, 552: 1127, 554: 1127, 1127, 1127, 559: 1127, 1127, 562: 1127, 1127, 565: 1127, 567: 1127, 1127, 1127, 1127, 576: 1127, 1127, 1127, 1127, 1127, 1127, 585: 1127, 1127, 588: 1127, 590: 1127, 597: 1127, 614: 1127, 632: 1127, 701: 1127, 715: 1127, 728: 1127, 736: 1127}, - {2135, 2135, 9: 2135, 57: 2135, 535: 2135, 537: 2135, 544: 2135, 2135, 2135, 2135, 554: 2135, 2135, 2135, 559: 2135, 2135, 562: 2135, 2135, 565: 2135, 567: 2135, 2135, 2135, 2135, 576: 2135, 2135, 2135, 2135, 2135, 2135, 585: 2135, 2135, 588: 2135, 590: 2135, 597: 2135, 736: 4663, 1001: 6050, 1327: 6051}, + {9: 4057, 57: 6052}, + {1109, 1109, 9: 1109, 57: 1109, 535: 1109, 537: 1109, 544: 1109, 1109, 1109, 1109, 555: 1109, 1109, 559: 1109, 1109, 1109, 563: 1109, 1109, 568: 1109, 1109, 1109, 577: 1109, 1109, 1109, 1109, 582: 1109, 586: 1109, 1109, 589: 1109, 1109}, + {1110, 1110, 9: 1110, 57: 1110, 535: 1110, 537: 1110, 544: 1110, 1110, 1110, 1110, 555: 1110, 1110, 559: 1110, 1110, 1110, 563: 1110, 1110, 568: 1110, 1110, 1110, 572: 3772, 3770, 3771, 3769, 3767, 1110, 1110, 1110, 1110, 582: 1110, 586: 1110, 1110, 589: 1110, 1110, 806: 3768, 3766}, + {1113, 1113, 9: 1113, 57: 1113, 535: 6055, 537: 1113, 544: 1113, 6028, 6029, 6056, 555: 1113, 1113, 559: 1113, 1113, 1113, 563: 1113, 1113, 568: 1113, 1113, 1113, 577: 1113, 1113, 6027, 1113, 582: 6030, 586: 6026, 6031, 589: 6032, 1113, 922: 6025, 927: 6024}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 6060}, // 3180 - {2134, 2134, 9: 2134, 57: 2134, 535: 2134, 537: 2134, 544: 2134, 2134, 2134, 2134, 554: 2134, 2134, 2134, 559: 2134, 2134, 562: 2134, 2134, 565: 2134, 567: 2134, 2134, 2134, 2134, 576: 2134, 2134, 2134, 2134, 2134, 2134, 585: 2134, 2134, 588: 2134, 590: 2134, 597: 2134}, - {1107, 1107, 9: 1107, 57: 1107, 535: 1107, 537: 1107, 544: 1107, 1107, 1107, 1107, 554: 6054, 1107, 1107, 559: 1107, 1107, 562: 1107, 1107, 565: 1107, 567: 1107, 1107, 1107, 6055, 576: 1107, 1107, 1107, 1107, 6053, 1107, 585: 1107, 1107, 588: 1107, 590: 1107, 597: 1107, 1057: 6057, 6056, 1197: 6058, 6052}, - {1222, 1222, 9: 1222, 57: 1222, 535: 1222, 537: 1222, 544: 1222, 1222, 1222, 1222, 555: 1222, 1222, 559: 1222, 1222, 562: 1222, 1222, 565: 1222, 567: 1222, 1222, 1222, 576: 1222, 1222, 1222, 1222, 581: 1222, 585: 1222, 1222, 588: 1222, 590: 1222, 597: 6073, 1489: 6074}, - {706: 4928, 715: 4929, 929: 6072}, - {706: 4928, 715: 4929, 929: 6071}, + {536: 6057}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 4054, 3072, 3073, 3071, 828: 4055, 912: 6058}, + {9: 4057, 57: 6059}, + {1111, 1111, 9: 1111, 57: 1111, 535: 1111, 537: 1111, 544: 1111, 1111, 1111, 1111, 555: 1111, 1111, 559: 1111, 1111, 1111, 563: 1111, 1111, 568: 1111, 1111, 1111, 577: 1111, 1111, 1111, 1111, 582: 1111, 586: 1111, 1111, 589: 1111, 1111}, + {1112, 1112, 9: 1112, 57: 1112, 535: 1112, 537: 1112, 544: 1112, 1112, 1112, 1112, 555: 1112, 1112, 559: 1112, 1112, 1112, 563: 1112, 1112, 568: 1112, 1112, 1112, 572: 3772, 3770, 3771, 3769, 3767, 1112, 1112, 1112, 1112, 582: 1112, 586: 1112, 1112, 589: 1112, 1112, 806: 3768, 3766}, // 3185 - {706: 4928, 715: 4929, 929: 6070}, - {536: 1119, 563: 6060, 1380: 6061}, - {1109, 1109, 9: 1109, 57: 1109, 535: 1109, 537: 1109, 544: 1109, 1109, 1109, 1109, 554: 1109, 1109, 1109, 559: 1109, 1109, 562: 1109, 1109, 565: 1109, 567: 1109, 1109, 1109, 1109, 576: 1109, 1109, 1109, 1109, 1109, 1109, 585: 1109, 1109, 588: 1109, 590: 1109, 597: 1109}, - {1106, 1106, 9: 1106, 57: 1106, 535: 1106, 537: 1106, 544: 1106, 1106, 1106, 1106, 554: 6054, 1106, 1106, 559: 1106, 1106, 562: 1106, 1106, 565: 1106, 567: 1106, 1106, 1106, 6055, 576: 1106, 1106, 1106, 1106, 6053, 1106, 585: 1106, 1106, 588: 1106, 590: 1106, 597: 1106, 1057: 6059, 6056}, - {1108, 1108, 9: 1108, 57: 1108, 535: 1108, 537: 1108, 544: 1108, 1108, 1108, 1108, 554: 1108, 1108, 1108, 559: 1108, 1108, 562: 1108, 1108, 565: 1108, 567: 1108, 1108, 1108, 1108, 576: 1108, 1108, 1108, 1108, 1108, 1108, 585: 1108, 1108, 588: 1108, 590: 1108, 597: 1108}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 536: 6015, 565: 3955, 648: 6010, 777: 3954, 3072, 3073, 3071, 6014, 810: 6013, 900: 6012, 905: 6011, 6017, 963: 6063}, + {1137, 1137, 9: 1137, 57: 1137, 535: 1137, 537: 1137, 544: 1137, 1137, 1137, 1137, 555: 1137, 1137, 559: 1137, 1137, 1137, 563: 1137, 1137, 568: 1137, 1137, 1137, 577: 1137, 1137, 1137, 1137, 582: 1137, 586: 1137, 1137, 589: 1137, 1137}, + {1144, 1144, 9: 1144, 57: 1144, 535: 1144, 537: 1144, 544: 1144, 547: 1144, 555: 1144, 1144, 559: 1144, 1144, 1144, 563: 1144, 1144, 568: 1144, 1144, 1144, 577: 1144, 1144, 580: 1144}, + {1134, 1134, 3321, 3476, 3285, 3160, 3201, 3323, 3085, 1134, 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 1134, 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 1134, 537: 1134, 542: 6022, 544: 1134, 1134, 1134, 1134, 554: 1134, 1134, 1134, 559: 1134, 1134, 1134, 563: 1134, 1134, 568: 1134, 1134, 1134, 1134, 577: 1134, 1134, 1134, 1134, 1134, 1134, 586: 1134, 1134, 589: 1134, 1134, 597: 1134, 736: 1134, 777: 6021, 3072, 3073, 3071, 1024: 6020, 6069}, + {536: 6066}, // 3190 - {569: 6066, 576: 6067, 581: 6065}, - {536: 6062}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 1114, 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 1114, 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 708: 5566, 777: 5565, 3067, 3068, 3066, 966: 6063}, - {9: 5568, 57: 6064}, - {1115, 1115, 9: 1115, 57: 1115, 535: 1115, 537: 1115, 544: 1115, 1115, 1115, 1115, 554: 1115, 1115, 1115, 559: 1115, 1115, 562: 1115, 1115, 565: 1115, 567: 1115, 1115, 1115, 1115, 576: 1115, 1115, 1115, 1115, 1115, 1115, 585: 1115, 1115, 588: 1115, 590: 1115, 597: 1115}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 5286, 3072, 3073, 3071, 865: 6067}, + {9: 5287, 57: 6068}, + {1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 542: 1135, 544: 1135, 1135, 1135, 1135, 552: 1135, 554: 1135, 1135, 1135, 559: 1135, 1135, 1135, 563: 1135, 1135, 568: 1135, 1135, 1135, 1135, 577: 1135, 1135, 1135, 1135, 1135, 1135, 586: 1135, 1135, 589: 1135, 1135, 597: 1135, 613: 1135, 632: 1135, 660: 1135, 715: 1135, 728: 1135, 736: 1135}, + {2144, 2144, 9: 2144, 57: 2144, 535: 2144, 537: 2144, 544: 2144, 2144, 2144, 2144, 554: 2144, 2144, 2144, 559: 2144, 2144, 2144, 563: 2144, 2144, 568: 2144, 2144, 2144, 2144, 577: 2144, 2144, 2144, 2144, 2144, 2144, 586: 2144, 2144, 589: 2144, 2144, 597: 2144, 736: 4671, 1003: 6070, 1325: 6071}, + {2143, 2143, 9: 2143, 57: 2143, 535: 2143, 537: 2143, 544: 2143, 2143, 2143, 2143, 554: 2143, 2143, 2143, 559: 2143, 2143, 2143, 563: 2143, 2143, 568: 2143, 2143, 2143, 2143, 577: 2143, 2143, 2143, 2143, 2143, 2143, 586: 2143, 2143, 589: 2143, 2143, 597: 2143}, // 3195 - {536: 1118}, - {728: 6069}, - {728: 6068}, - {536: 1116}, - {536: 1117}, + {1115, 1115, 9: 1115, 57: 1115, 535: 1115, 537: 1115, 544: 1115, 1115, 1115, 1115, 554: 6074, 1115, 1115, 559: 1115, 1115, 1115, 563: 1115, 1115, 568: 1115, 1115, 1115, 6075, 577: 1115, 1115, 1115, 1115, 6073, 1115, 586: 1115, 1115, 589: 1115, 1115, 597: 1115, 1058: 6077, 6076, 1198: 6078, 6072}, + {1230, 1230, 9: 1230, 57: 1230, 535: 1230, 537: 1230, 544: 1230, 1230, 1230, 1230, 555: 1230, 1230, 559: 1230, 1230, 1230, 563: 1230, 1230, 568: 1230, 1230, 1230, 577: 1230, 1230, 1230, 1230, 582: 1230, 586: 1230, 1230, 589: 1230, 1230, 597: 6093, 1489: 6094}, + {706: 4937, 715: 4938, 931: 6092}, + {706: 4937, 715: 4938, 931: 6091}, + {706: 4937, 715: 4938, 931: 6090}, // 3200 - {536: 1120, 563: 1120}, - {536: 1121, 563: 1121}, - {536: 1122, 563: 1122}, - {108: 6078, 370: 6077, 448: 6076, 536: 1219, 1488: 6075}, - {1131, 1131, 9: 1131, 57: 1131, 535: 1131, 537: 1131, 544: 1131, 1131, 1131, 1131, 555: 1131, 1131, 559: 1131, 1131, 562: 1131, 1131, 565: 1131, 567: 1131, 1131, 1131, 576: 1131, 1131, 1131, 1131, 581: 1131, 585: 1131, 1131, 588: 1131, 590: 1131}, + {536: 1127, 563: 6080, 1379: 6081}, + {1117, 1117, 9: 1117, 57: 1117, 535: 1117, 537: 1117, 544: 1117, 1117, 1117, 1117, 554: 1117, 1117, 1117, 559: 1117, 1117, 1117, 563: 1117, 1117, 568: 1117, 1117, 1117, 1117, 577: 1117, 1117, 1117, 1117, 1117, 1117, 586: 1117, 1117, 589: 1117, 1117, 597: 1117}, + {1114, 1114, 9: 1114, 57: 1114, 535: 1114, 537: 1114, 544: 1114, 1114, 1114, 1114, 554: 6074, 1114, 1114, 559: 1114, 1114, 1114, 563: 1114, 1114, 568: 1114, 1114, 1114, 6075, 577: 1114, 1114, 1114, 1114, 6073, 1114, 586: 1114, 1114, 589: 1114, 1114, 597: 1114, 1058: 6079, 6076}, + {1116, 1116, 9: 1116, 57: 1116, 535: 1116, 537: 1116, 544: 1116, 1116, 1116, 1116, 554: 1116, 1116, 1116, 559: 1116, 1116, 1116, 563: 1116, 1116, 568: 1116, 1116, 1116, 1116, 577: 1116, 1116, 1116, 1116, 1116, 1116, 586: 1116, 1116, 589: 1116, 1116, 597: 1116}, + {570: 6086, 577: 6087, 582: 6085}, // 3205 - {536: 6079}, - {536: 1218}, - {536: 1217}, - {536: 1216}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 6081, 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 6080}, + {536: 6082}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 1122, 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 1122, 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 708: 5575, 777: 5574, 3072, 3073, 3071, 968: 6083}, + {9: 5577, 57: 6084}, + {1123, 1123, 9: 1123, 57: 1123, 535: 1123, 537: 1123, 544: 1123, 1123, 1123, 1123, 554: 1123, 1123, 1123, 559: 1123, 1123, 1123, 563: 1123, 1123, 568: 1123, 1123, 1123, 1123, 577: 1123, 1123, 1123, 1123, 1123, 1123, 586: 1123, 1123, 589: 1123, 1123, 597: 1123}, + {536: 1126}, // 3210 - {57: 1215, 422: 6089, 571: 3767, 3765, 3766, 3764, 3762, 593: 6088, 806: 3763, 3761, 1490: 6087}, - {1212, 1212, 9: 1212, 57: 1212, 271: 6083, 535: 1212, 537: 1212, 544: 1212, 1212, 1212, 1212, 555: 1212, 1212, 559: 1212, 1212, 562: 1212, 1212, 565: 1212, 567: 1212, 1212, 1212, 576: 1212, 1212, 1212, 1212, 581: 1212, 585: 1212, 1212, 588: 1212, 590: 1212, 1259: 6082}, - {1220, 1220, 9: 1220, 57: 1220, 535: 1220, 537: 1220, 544: 1220, 1220, 1220, 1220, 555: 1220, 1220, 559: 1220, 1220, 562: 1220, 1220, 565: 1220, 567: 1220, 1220, 1220, 576: 1220, 1220, 1220, 1220, 581: 1220, 585: 1220, 1220, 588: 1220, 590: 1220}, - {536: 6084}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 6085}, + {728: 6089}, + {728: 6088}, + {536: 1124}, + {536: 1125}, + {536: 1128, 563: 1128}, // 3215 - {57: 6086, 571: 3767, 3765, 3766, 3764, 3762, 806: 3763, 3761}, - {1211, 1211, 9: 1211, 57: 1211, 535: 1211, 537: 1211, 544: 1211, 1211, 1211, 1211, 555: 1211, 1211, 559: 1211, 1211, 562: 1211, 1211, 565: 1211, 567: 1211, 1211, 1211, 576: 1211, 1211, 1211, 1211, 581: 1211, 585: 1211, 1211, 588: 1211, 590: 1211}, - {57: 6090}, - {57: 1214}, - {57: 1213}, + {536: 1129, 563: 1129}, + {536: 1130, 563: 1130}, + {108: 6098, 371: 6097, 447: 6096, 536: 1227, 1488: 6095}, + {1139, 1139, 9: 1139, 57: 1139, 535: 1139, 537: 1139, 544: 1139, 1139, 1139, 1139, 555: 1139, 1139, 559: 1139, 1139, 1139, 563: 1139, 1139, 568: 1139, 1139, 1139, 577: 1139, 1139, 1139, 1139, 582: 1139, 586: 1139, 1139, 589: 1139, 1139}, + {536: 6099}, // 3220 - {1212, 1212, 9: 1212, 57: 1212, 271: 6083, 535: 1212, 537: 1212, 544: 1212, 1212, 1212, 1212, 555: 1212, 1212, 559: 1212, 1212, 562: 1212, 1212, 565: 1212, 567: 1212, 1212, 1212, 576: 1212, 1212, 1212, 1212, 581: 1212, 585: 1212, 1212, 588: 1212, 590: 1212, 1259: 6091}, - {1221, 1221, 9: 1221, 57: 1221, 535: 1221, 537: 1221, 544: 1221, 1221, 1221, 1221, 555: 1221, 1221, 559: 1221, 1221, 562: 1221, 1221, 565: 1221, 567: 1221, 1221, 1221, 576: 1221, 1221, 1221, 1221, 581: 1221, 585: 1221, 1221, 588: 1221, 590: 1221}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 536: 5995, 777: 3949, 3067, 3068, 3066, 5994, 810: 5993, 901: 5992, 905: 5991, 6093}, - {545: 6008, 6009, 578: 6007, 581: 6010, 585: 6006, 6011, 588: 6012, 590: 6094, 920: 6005, 925: 6004}, - {1134, 1134, 9: 1134, 57: 1134, 535: 1134, 537: 1134, 544: 1134, 547: 1134, 555: 1134, 1134, 559: 1134, 1134, 562: 1134, 1134, 565: 1134, 567: 1134, 1134, 1134, 576: 1134, 1134, 579: 1134}, + {536: 1226}, + {536: 1225}, + {536: 1224}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 6101, 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 6100}, + {57: 1223, 422: 6109, 572: 3772, 3770, 3771, 3769, 3767, 593: 6108, 806: 3768, 3766, 1490: 6107}, // 3225 - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 4046, 3067, 3068, 3066, 827: 6096, 1002: 6097, 1033: 6098}, - {561: 6107, 722: 6108, 898: 6106}, - {2644, 2644, 9: 2644, 547: 2644, 562: 2644, 568: 2644, 2644}, - {424, 424, 9: 6099, 547: 424, 562: 424, 568: 4683, 424, 895: 4684, 6100}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 4046, 3067, 3068, 3066, 827: 6096, 1002: 6105}, + {1220, 1220, 9: 1220, 57: 1220, 271: 6103, 535: 1220, 537: 1220, 544: 1220, 1220, 1220, 1220, 555: 1220, 1220, 559: 1220, 1220, 1220, 563: 1220, 1220, 568: 1220, 1220, 1220, 577: 1220, 1220, 1220, 1220, 582: 1220, 586: 1220, 1220, 589: 1220, 1220, 1259: 6102}, + {1228, 1228, 9: 1228, 57: 1228, 535: 1228, 537: 1228, 544: 1228, 1228, 1228, 1228, 555: 1228, 1228, 559: 1228, 1228, 1228, 563: 1228, 1228, 568: 1228, 1228, 1228, 577: 1228, 1228, 1228, 1228, 582: 1228, 586: 1228, 1228, 589: 1228, 1228}, + {536: 6104}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 6105}, + {57: 6106, 572: 3772, 3770, 3771, 3769, 3767, 806: 3768, 3766}, // 3230 - {1507, 1507, 547: 1507, 562: 1507, 569: 3879, 848: 3933, 915: 6101}, - {1089, 1089, 547: 1089, 562: 6102, 1207: 6103}, - {564: 3053, 647: 3890, 805: 3888, 817: 3889, 991: 6104}, - {428, 428, 547: 428}, - {1088, 1088, 547: 1088}, + {1219, 1219, 9: 1219, 57: 1219, 535: 1219, 537: 1219, 544: 1219, 1219, 1219, 1219, 555: 1219, 1219, 559: 1219, 1219, 1219, 563: 1219, 1219, 568: 1219, 1219, 1219, 577: 1219, 1219, 1219, 1219, 582: 1219, 586: 1219, 1219, 589: 1219, 1219}, + {57: 6110}, + {57: 1222}, + {57: 1221}, + {1220, 1220, 9: 1220, 57: 1220, 271: 6103, 535: 1220, 537: 1220, 544: 1220, 1220, 1220, 1220, 555: 1220, 1220, 559: 1220, 1220, 1220, 563: 1220, 1220, 568: 1220, 1220, 1220, 577: 1220, 1220, 1220, 1220, 582: 1220, 586: 1220, 1220, 589: 1220, 1220, 1259: 6111}, // 3235 - {2643, 2643, 9: 2643, 547: 2643, 562: 2643, 568: 2643, 2643}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3921, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 3917, 899: 6109}, - {2: 982, 982, 982, 982, 982, 982, 982, 10: 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 58: 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 538: 982, 982, 982, 982, 545: 982, 982, 548: 982, 982, 982, 552: 982, 982, 557: 982, 982, 564: 982, 583: 982, 591: 982, 982, 624: 982, 631: 982, 633: 982, 982, 982, 982, 641: 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 662: 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 702: 982, 982, 982, 982, 716: 982}, - {2: 981, 981, 981, 981, 981, 981, 981, 10: 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 58: 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 538: 981, 981, 981, 981, 545: 981, 981, 548: 981, 981, 981, 552: 981, 981, 557: 981, 981, 564: 981, 583: 981, 591: 981, 981, 624: 981, 631: 981, 633: 981, 981, 981, 981, 641: 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 662: 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 702: 981, 981, 981, 981, 716: 981}, - {2645, 2645, 9: 2645, 547: 2645, 562: 2645, 568: 2645, 2645}, + {1229, 1229, 9: 1229, 57: 1229, 535: 1229, 537: 1229, 544: 1229, 1229, 1229, 1229, 555: 1229, 1229, 559: 1229, 1229, 1229, 563: 1229, 1229, 568: 1229, 1229, 1229, 577: 1229, 1229, 1229, 1229, 582: 1229, 586: 1229, 1229, 589: 1229, 1229}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 536: 6015, 565: 3955, 777: 3954, 3072, 3073, 3071, 6014, 810: 6013, 900: 6012, 905: 6011, 6113}, + {545: 6028, 6029, 579: 6027, 582: 6030, 586: 6026, 6031, 589: 6032, 6114, 922: 6025, 927: 6024}, + {1142, 1142, 9: 1142, 57: 1142, 535: 1142, 537: 1142, 544: 1142, 547: 1142, 555: 1142, 1142, 559: 1142, 1142, 1142, 563: 1142, 1142, 568: 1142, 1142, 1142, 577: 1142, 1142, 580: 1142}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 4054, 3072, 3073, 3071, 828: 6116, 1004: 6117, 1034: 6118}, // 3240 - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 4046, 3067, 3068, 3066, 827: 6096, 1002: 6097, 1033: 6111}, - {424, 424, 9: 6099, 547: 424, 568: 4683, 895: 4684, 6112}, - {427, 427, 547: 427}, - {2: 570, 570, 570, 570, 570, 570, 570, 10: 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 58: 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 3949, 3067, 3068, 3066, 810: 6115}, + {562: 6127, 722: 6128, 898: 6126}, + {2650, 2650, 9: 2650, 547: 2650, 560: 2650, 569: 2650, 2650}, + {431, 431, 9: 6119, 547: 431, 560: 431, 569: 4692, 431, 895: 4693, 6120}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 4054, 3072, 3073, 3071, 828: 6116, 1004: 6125}, + {1516, 1516, 547: 1516, 560: 1516, 570: 3884, 847: 3938, 917: 6121}, // 3245 - {569, 569}, - {23: 6128, 155: 6121, 768, 6118, 240: 6120, 246: 6131, 257: 6129, 275: 6122, 288: 6126, 309: 6130, 313: 6123, 591: 6127, 614: 6117, 1300: 6125, 1371: 6119, 1396: 6124}, - {2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 10: 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 58: 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 2331, 537: 2331, 583: 2331}, - {2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 10: 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 58: 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 2330, 537: 2330, 583: 2330}, - {778, 778}, + {1097, 1097, 547: 1097, 560: 6122, 1208: 6123}, + {567: 3058, 647: 3895, 805: 3893, 820: 3894, 992: 6124}, + {435, 435, 547: 435}, + {1096, 1096, 547: 1096}, + {2649, 2649, 9: 2649, 547: 2649, 560: 2649, 569: 2649, 2649}, // 3250 - {775, 775}, - {774, 774}, - {267: 6138}, - {772, 772}, - {156: 6137}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3926, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 3922, 899: 6129}, + {2: 990, 990, 990, 990, 990, 990, 990, 10: 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 58: 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 538: 990, 990, 990, 990, 545: 990, 990, 548: 990, 990, 990, 552: 990, 990, 557: 990, 990, 567: 990, 584: 990, 591: 990, 990, 630: 990, 990, 633: 990, 990, 990, 990, 641: 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 662: 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 716: 990}, + {2: 989, 989, 989, 989, 989, 989, 989, 10: 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 58: 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 538: 989, 989, 989, 989, 545: 989, 989, 548: 989, 989, 989, 552: 989, 989, 557: 989, 989, 567: 989, 584: 989, 591: 989, 989, 630: 989, 989, 633: 989, 989, 989, 989, 641: 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 662: 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 716: 989}, + {2651, 2651, 9: 2651, 547: 2651, 560: 2651, 569: 2651, 2651}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 4054, 3072, 3073, 3071, 828: 6116, 1004: 6117, 1034: 6131}, // 3255 - {759, 759, 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 537: 759, 777: 3949, 3067, 3068, 3066, 810: 3950, 890: 4821, 1299: 6132}, - {769, 769}, - {156: 767}, - {156: 766}, - {156: 765}, + {431, 431, 9: 6119, 547: 431, 569: 4692, 895: 4693, 6132}, + {434, 434, 547: 434}, + {2: 577, 577, 577, 577, 577, 577, 577, 10: 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 58: 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 565: 577}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 565: 3955, 777: 3954, 3072, 3073, 3071, 810: 6135}, + {576, 576}, // 3260 - {156: 764}, - {156: 763}, - {755, 755, 537: 6134, 1516: 6133}, - {770, 770}, - {734: 6135}, + {22: 6146, 139: 6139, 155: 5721, 158: 774, 240: 6138, 246: 6149, 257: 6147, 275: 6140, 289: 6144, 310: 6148, 314: 6141, 591: 6145, 613: 5720, 1094: 6143, 1369: 6137, 1395: 6142}, + {784, 784}, + {781, 781}, + {780, 780}, + {267: 6156}, // 3265 - {567: 6136}, - {754, 754}, - {771, 771}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 6139, 3067, 3068, 3066, 1075: 6140}, - {777, 777, 9: 777}, + {778, 778}, + {158: 6155}, + {765, 765, 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 537: 765, 565: 3955, 777: 3954, 3072, 3073, 3071, 810: 3956, 889: 4830, 1298: 6150}, + {775, 775}, + {158: 773}, // 3270 - {773, 773, 9: 6141}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 6142, 3067, 3068, 3066}, - {776, 776, 9: 776}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 6263, 3325, 3222, 3073, 3440, 3101, 6264, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 6262, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 6265, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 3949, 3067, 3068, 3066, 810: 6266}, - {614: 6248, 715: 6249}, + {158: 772}, + {158: 771}, + {158: 770}, + {158: 769}, + {761, 761, 537: 6152, 1516: 6151}, // 3275 - {715: 6245}, - {614: 6240, 715: 6239}, - {614: 6237}, - {252: 6234}, - {252: 6231}, + {776, 776}, + {734: 6153}, + {568: 6154}, + {760, 760}, + {777, 777}, // 3280 - {252: 6225}, - {180: 6222, 273: 6224, 392: 6220, 417: 6221, 1021: 6223}, - {253: 6217, 256: 6216}, - {614: 6175}, - {180: 6169, 208: 6171, 222: 787, 245: 6173, 316: 6172, 1476: 6170}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 6157, 3072, 3073, 3071, 1077: 6158}, + {783, 783, 9: 783}, + {779, 779, 9: 6159}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 6160, 3072, 3073, 3071}, + {782, 782, 9: 782}, // 3285 - {180: 6168}, - {180: 6167}, - {451: 6166}, - {369: 6159}, - {196: 6160}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 6282, 3330, 3227, 3078, 3445, 3106, 6283, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 6281, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 6284, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 565: 3955, 777: 3954, 3072, 3073, 3071, 810: 6285}, + {613: 6267, 715: 6268}, + {715: 6264}, + {613: 6259, 715: 6258}, + {613: 6256}, // 3290 - {327: 6164, 407: 6163, 437: 6162, 708: 6161, 1332: 6165}, - {930, 930}, - {929, 929}, - {928, 928}, - {927, 927}, + {252: 6253}, + {252: 6250}, + {252: 6244}, + {180: 6241, 273: 6243, 393: 6239, 417: 6240, 1023: 6242}, + {253: 6236, 256: 6235}, // 3295 - {895, 895}, - {897, 897}, - {902, 902}, - {903, 903}, - {904, 904}, + {613: 6194}, + {180: 6188, 208: 6190, 223: 795, 245: 6192, 318: 6191, 1476: 6189}, + {180: 6187}, + {180: 6186}, + {450: 6185}, // 3300 - {222: 6174}, - {222: 786}, - {222: 785}, - {222: 784}, - {896, 896}, + {279: 6180}, + {279: 6178}, + {185: 6179}, + {903, 903}, + {185: 6181}, // 3305 - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 3949, 3067, 3068, 3066, 810: 6176}, - {748: 6177, 1041: 6178}, - {208: 6181, 217: 6180, 614: 2346, 1071: 6179}, + {437: 6183, 708: 6182, 1330: 6184}, + {938, 938}, + {937, 937}, {905, 905}, - {614: 6183}, + {907, 907}, // 3310 - {157: 2345, 614: 2345}, - {217: 6182}, - {157: 2344, 614: 2344}, - {2: 2130, 2130, 2130, 2130, 2130, 2130, 2130, 10: 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 58: 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 583: 5367, 889: 6184}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 3949, 3067, 3068, 3066, 810: 6185}, + {912, 912}, + {913, 913}, + {914, 914}, + {223: 6193}, + {223: 794}, // 3315 - {619, 619, 6: 619, 619, 619, 15: 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 535: 619, 6189, 619, 540: 619, 542: 619, 619, 619, 551: 619, 619, 554: 619, 557: 619, 619, 570: 619, 584: 6188, 614: 619, 701: 619, 714: 619, 619, 1391: 6187, 1485: 6186}, - {576, 576, 6: 4747, 4749, 580, 15: 4766, 2459, 4764, 4703, 4768, 4755, 4784, 4751, 4748, 4750, 4753, 4754, 4756, 4763, 580, 4774, 4775, 4785, 4761, 4762, 4767, 4769, 4781, 4780, 4789, 4782, 4779, 4772, 4777, 4778, 4771, 4773, 4776, 4765, 4786, 4787, 535: 576, 576, 576, 540: 4746, 542: 576, 2459, 4783, 551: 576, 576, 554: 576, 557: 576, 2459, 570: 5521, 614: 576, 701: 576, 714: 2459, 4752, 871: 4757, 897: 4759, 916: 4758, 937: 4760, 943: 4770, 947: 4788, 1026: 6204, 1147: 6203}, - {2462, 2462, 535: 6197, 1224: 6196}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 3949, 3067, 3068, 3066, 810: 6195}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 584: 6190, 706: 2701, 708: 2701, 2701, 2701, 5107, 715: 2701, 751: 2701, 2701, 777: 4046, 3067, 3068, 3066, 827: 4974, 934: 5353, 959: 5491, 1008: 5492, 1091: 5493, 1297: 6191}, + {223: 793}, + {223: 792}, + {906, 906}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 565: 3955, 777: 3954, 3072, 3073, 3071, 810: 6195}, + {745: 6196, 1042: 6197}, // 3320 - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 3949, 3067, 3068, 3066, 810: 6193}, - {9: 5495, 57: 6192}, - {618, 618, 6: 618, 618, 618, 15: 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 535: 618, 618, 618, 540: 618, 542: 618, 618, 618, 551: 618, 618, 554: 618, 557: 618, 618, 570: 618, 614: 618, 701: 618, 714: 618, 618}, - {57: 6194}, - {2380, 2380, 535: 2380}, + {208: 6200, 218: 6199, 613: 2352, 1073: 6198}, + {915, 915}, + {613: 6202}, + {155: 2351, 613: 2351}, + {218: 6201}, // 3325 - {2381, 2381, 535: 2381}, - {2463, 2463}, - {85: 6198}, - {425: 6200, 809: 6199}, - {593: 6202}, + {155: 2350, 613: 2350}, + {2: 2139, 2139, 2139, 2139, 2139, 2139, 2139, 10: 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 58: 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 565: 2139, 584: 5376, 890: 6203}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 565: 3955, 777: 3954, 3072, 3073, 3071, 810: 6204}, + {626, 626, 6: 626, 626, 626, 15: 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 535: 626, 6208, 626, 540: 626, 542: 626, 626, 626, 551: 626, 626, 554: 626, 557: 626, 626, 571: 626, 585: 6207, 613: 626, 660: 626, 714: 626, 626, 1390: 6206, 1485: 6205}, + {583, 583, 6: 4756, 4758, 587, 15: 4775, 2465, 4773, 4712, 4777, 4764, 4793, 4757, 4760, 4759, 4762, 4763, 4765, 4772, 587, 4783, 4784, 4794, 4770, 4771, 4776, 4778, 4790, 4789, 4798, 4791, 4788, 4781, 4786, 4787, 4780, 4782, 4785, 4774, 4795, 4796, 535: 583, 583, 583, 540: 4755, 542: 583, 2465, 4792, 551: 583, 583, 554: 583, 557: 583, 2465, 571: 5530, 613: 583, 660: 583, 714: 2465, 4761, 871: 4766, 897: 4768, 918: 4767, 939: 4769, 945: 4779, 950: 4797, 1027: 6223, 1150: 6222}, // 3330 - {593: 6201}, - {2460, 2460}, - {2461, 2461}, - {2457, 2457, 535: 2457, 2457, 2457, 542: 2457, 551: 6206, 2457, 554: 2457, 557: 2457, 614: 2457, 701: 2457, 1239: 6205}, - {575, 575, 6: 4747, 4749, 580, 5523, 15: 4766, 2459, 4764, 4703, 4768, 4755, 4784, 4751, 4748, 4750, 4753, 4754, 4756, 4763, 580, 4774, 4775, 4785, 4761, 4762, 4767, 4769, 4781, 4780, 4789, 4782, 4779, 4772, 4777, 4778, 4771, 4773, 4776, 4765, 4786, 4787, 535: 575, 575, 575, 540: 4746, 542: 575, 2459, 4783, 551: 575, 575, 554: 575, 557: 575, 2459, 570: 5521, 614: 575, 701: 575, 714: 2459, 4752, 871: 4757, 897: 4759, 916: 4758, 937: 4760, 943: 4770, 947: 5522}, + {2468, 2468, 535: 6216, 1224: 6215}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 565: 3955, 777: 3954, 3072, 3073, 3071, 810: 6214}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 585: 6209, 706: 2707, 708: 2707, 2707, 2707, 5116, 715: 2707, 751: 2707, 2707, 777: 4054, 3072, 3073, 3071, 828: 4983, 936: 5362, 961: 5500, 1010: 5501, 1093: 5502, 1296: 6210}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 565: 3955, 777: 3954, 3072, 3073, 3071, 810: 6212}, + {9: 5504, 57: 6211}, // 3335 - {2395, 2395, 535: 2395, 2395, 2395, 542: 2395, 552: 2395, 554: 5800, 557: 5801, 614: 2395, 701: 2395, 1170: 6207}, - {728: 5579}, - {2392, 2392, 535: 2392, 2392, 2392, 542: 6209, 552: 2392, 614: 2392, 701: 2392, 1328: 6208}, - {2390, 2390, 535: 2390, 2923, 2922, 552: 2921, 614: 2920, 701: 2916, 781: 6214, 812: 6212, 2917, 2918, 2919, 2928, 818: 2926, 2925, 2924, 822: 3868, 6213, 6211, 1350: 6210}, - {2391, 2391, 535: 2391, 2391, 2391, 552: 2391, 614: 2391, 701: 2391}, - // 3340 - {2462, 2462, 535: 6197, 1224: 6215}, - {2389, 2389, 535: 2389}, - {2388, 2388, 535: 2388, 544: 1021, 555: 1021, 1021}, + {625, 625, 6: 625, 625, 625, 15: 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 535: 625, 625, 625, 540: 625, 542: 625, 625, 625, 551: 625, 625, 554: 625, 557: 625, 625, 571: 625, 613: 625, 660: 625, 714: 625, 625}, + {57: 6213}, + {2386, 2386, 535: 2386}, {2387, 2387, 535: 2387}, - {2386, 2386, 535: 2386, 544: 1020, 555: 1020, 1020, 559: 3881, 562: 3880, 569: 3879, 848: 3882, 3883}, + {2469, 2469}, + // 3340 + {85: 6217}, + {425: 6219, 809: 6218}, + {593: 6221}, + {593: 6220}, + {2466, 2466}, // 3345 - {2464, 2464}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 6139, 3067, 3068, 3066, 1075: 6219}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 6139, 3067, 3068, 3066, 1075: 6218}, - {907, 907, 9: 6141}, - {908, 908, 9: 6141}, + {2467, 2467}, + {2463, 2463, 535: 2463, 2463, 2463, 542: 2463, 551: 6225, 2463, 554: 2463, 557: 2463, 613: 2463, 660: 2463, 1240: 6224}, + {582, 582, 6: 4756, 4758, 587, 5532, 15: 4775, 2465, 4773, 4712, 4777, 4764, 4793, 4757, 4760, 4759, 4762, 4763, 4765, 4772, 587, 4783, 4784, 4794, 4770, 4771, 4776, 4778, 4790, 4789, 4798, 4791, 4788, 4781, 4786, 4787, 4780, 4782, 4785, 4774, 4795, 4796, 535: 582, 582, 582, 540: 4755, 542: 582, 2465, 4792, 551: 582, 582, 554: 582, 557: 582, 2465, 571: 5530, 613: 582, 660: 582, 714: 2465, 4761, 871: 4766, 897: 4768, 918: 4767, 939: 4769, 945: 4779, 950: 5531}, + {2401, 2401, 535: 2401, 2401, 2401, 542: 2401, 552: 2401, 554: 5820, 557: 5821, 613: 2401, 660: 2401, 1172: 6226}, + {728: 5588}, // 3350 - {910, 910}, - {909, 909}, - {901, 901}, - {900, 900}, - {899, 899}, + {2398, 2398, 535: 2398, 2398, 2398, 542: 6228, 552: 2398, 613: 2398, 660: 2398, 1326: 6227}, + {2396, 2396, 535: 2396, 2929, 2928, 552: 2927, 613: 2926, 660: 2922, 781: 6233, 812: 6231, 2923, 2924, 2925, 2934, 2932, 2931, 2930, 821: 3873, 6232, 6230, 1348: 6229}, + {2397, 2397, 535: 2397, 2397, 2397, 552: 2397, 613: 2397, 660: 2397}, + {2468, 2468, 535: 6216, 1224: 6234}, + {2395, 2395, 535: 2395}, // 3355 - {220: 6226}, - {564: 3053, 805: 4560, 831: 6228, 1011: 6227}, - {914, 914, 9: 6229}, - {886, 886, 9: 886}, - {564: 3053, 805: 4560, 831: 6230}, + {2394, 2394, 535: 2394, 544: 1029, 555: 1029, 1029}, + {2393, 2393, 535: 2393}, + {2392, 2392, 535: 2392, 544: 1028, 555: 1028, 1028, 559: 3886, 3885, 570: 3884, 847: 3887, 3888}, + {2470, 2470}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 6157, 3072, 3073, 3071, 1077: 6238}, // 3360 - {885, 885, 9: 885}, - {220: 6232}, - {564: 3053, 805: 4560, 831: 6228, 1011: 6233}, - {915, 915, 9: 6229}, - {220: 6235}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 6157, 3072, 3073, 3071, 1077: 6237}, + {917, 917, 9: 6159}, + {918, 918, 9: 6159}, + {920, 920}, + {919, 919}, // 3365 - {564: 3053, 805: 4560, 831: 6228, 1011: 6236}, - {916, 916, 9: 6229}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 3949, 3067, 3068, 3066, 810: 3950, 890: 6238}, - {917, 917, 9: 3952}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 3949, 3067, 3068, 3066, 810: 6243}, + {911, 911}, + {910, 910}, + {909, 909}, + {221: 6245}, + {567: 3058, 805: 4568, 837: 6247, 1013: 6246}, // 3370 - {567: 6241}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 3949, 3067, 3068, 3066, 810: 3950, 890: 6242}, - {906, 906, 9: 3952}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 6244, 3067, 3068, 3066}, - {919, 919}, + {924, 924, 9: 6248}, + {895, 895, 9: 895}, + {567: 3058, 805: 4568, 837: 6249}, + {894, 894, 9: 894}, + {221: 6251}, // 3375 - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 3949, 3067, 3068, 3066, 810: 6246}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 6247, 3067, 3068, 3066}, - {920, 920}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 3949, 3067, 3068, 3066, 810: 3950, 890: 6261}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 3949, 3067, 3068, 3066, 810: 6250}, + {567: 3058, 805: 4568, 837: 6247, 1013: 6252}, + {925, 925, 9: 6248}, + {221: 6254}, + {567: 3058, 805: 4568, 837: 6247, 1013: 6255}, + {926, 926, 9: 6248}, // 3380 - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 6251, 3067, 3068, 3066}, - {921, 921, 536: 6254, 1191: 6253, 1376: 6252}, - {918, 918, 9: 6259}, - {889, 889, 9: 889}, - {564: 3053, 805: 4560, 831: 6255}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 565: 3955, 777: 3954, 3072, 3073, 3071, 810: 3956, 889: 6257}, + {927, 927, 9: 3958}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 565: 3955, 777: 3954, 3072, 3073, 3071, 810: 6262}, + {568: 6260}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 565: 3955, 777: 3954, 3072, 3073, 3071, 810: 3956, 889: 6261}, // 3385 - {9: 6256}, - {564: 3053, 805: 4560, 831: 6257}, - {57: 6258}, - {887, 887, 9: 887}, - {536: 6254, 1191: 6260}, + {916, 916, 9: 3958}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 6263, 3072, 3073, 3071}, + {929, 929}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 565: 3955, 777: 3954, 3072, 3073, 3071, 810: 6265}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 6266, 3072, 3073, 3071}, // 3390 - {888, 888, 9: 888}, - {922, 922, 9: 3952}, - {193: 2084, 196: 6291, 720: 2084}, - {193: 1903, 429: 6283, 454: 6284, 720: 1903, 1317: 6282}, - {926, 926, 178: 6269, 193: 1721, 220: 6268, 720: 1721}, + {930, 930}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 565: 3955, 777: 3954, 3072, 3073, 3071, 810: 3956, 889: 6280}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 565: 3955, 777: 3954, 3072, 3073, 3071, 810: 6269}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 6270, 3072, 3073, 3071}, + {931, 931, 536: 6273, 1193: 6272, 1374: 6271}, // 3395 - {898, 898, 193: 1700, 720: 1700}, - {193: 6267}, - {923, 923}, - {424, 424, 564: 3053, 568: 4683, 805: 4560, 831: 6280, 895: 4684, 6279}, - {428: 6270}, + {928, 928, 9: 6278}, + {898, 898, 9: 898}, + {567: 3058, 805: 4568, 837: 6274}, + {9: 6275}, + {567: 3058, 805: 4568, 837: 6276}, // 3400 - {562: 6271, 564: 3053, 805: 4560, 831: 6228, 1011: 6272, 1318: 6273}, - {564: 3053, 805: 3888, 817: 6274}, - {913, 913, 9: 6229}, - {912, 912}, - {933, 933, 9: 6275, 214: 6276}, + {57: 6277}, + {896, 896, 9: 896}, + {536: 6273, 1193: 6279}, + {897, 897, 9: 897}, + {932, 932, 9: 3958}, // 3405 - {564: 3053, 805: 3888, 817: 6278}, - {564: 3053, 805: 3888, 817: 6277}, - {931, 931}, - {932, 932}, - {925, 925}, + {185: 6310, 194: 2093, 720: 2093}, + {194: 1912, 429: 6302, 453: 6303, 720: 1912, 1315: 6301}, + {936, 936, 194: 1730, 210: 6288, 221: 6287, 720: 1730}, + {908, 908, 194: 1709, 720: 1709}, + {194: 6286}, // 3410 - {424, 424, 568: 4683, 895: 4684, 6281}, - {924, 924}, - {911, 911}, - {564: 3053, 805: 6290}, - {401: 6286, 564: 3053, 721: 6287, 805: 6285}, + {933, 933}, + {431, 431, 567: 3058, 569: 4692, 805: 4568, 837: 6299, 895: 4693, 6298}, + {428: 6289}, + {560: 6290, 567: 3058, 805: 4568, 837: 6247, 1013: 6291, 1316: 6292}, + {567: 3058, 805: 3893, 820: 6293}, // 3415 - {892, 892}, - {564: 3053, 805: 6289}, - {564: 3053, 805: 6288}, - {890, 890}, - {891, 891}, + {923, 923, 9: 6248}, + {922, 922}, + {941, 941, 9: 6294, 214: 6295}, + {567: 3058, 805: 3893, 820: 6297}, + {567: 3058, 805: 3893, 820: 6296}, // 3420 - {893, 893}, - {894, 894}, - {2: 446, 446, 446, 446, 446, 446, 446, 10: 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 58: 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 538: 446, 540: 446, 561: 2072, 591: 446, 720: 2072, 722: 2072}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 538: 6447, 561: 2070, 720: 2070, 722: 2070, 777: 6446, 3067, 3068, 3066}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 6444, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 561: 2033, 720: 2033, 722: 2033, 777: 6306, 3067, 3068, 3066, 932: 6347}, + {939, 939}, + {940, 940}, + {935, 935}, + {431, 431, 569: 4692, 895: 4693, 6300}, + {934, 934}, // 3425 - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 561: 2027, 720: 2027, 722: 2027, 777: 6306, 3067, 3068, 3066, 932: 6441}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 538: 3758, 540: 6437, 561: 2024, 591: 4376, 720: 2024, 722: 2024, 777: 3759, 3067, 3068, 3066, 811: 4375, 911: 6436}, - {561: 6107, 563: 6426, 720: 2019, 722: 2019, 898: 6425}, - {561: 2011, 576: 6423, 720: 2011, 722: 2011}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 6327, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 6328, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 538: 6332, 540: 6420, 561: 2009, 720: 2009, 6418, 2009, 777: 3759, 3067, 3068, 3066, 811: 5829, 904: 6334, 923: 6335, 6333, 972: 6331, 1275: 6419, 1458: 6417}, + {921, 921}, + {567: 3058, 805: 6309}, + {401: 6305, 567: 3058, 721: 6306, 805: 6304}, + {901, 901}, + {567: 3058, 805: 6308}, // 3430 - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 6415, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 561: 2006, 720: 2006, 722: 2006, 777: 6306, 3067, 3068, 3066, 932: 6344}, - {233: 6400, 561: 1988, 720: 1988, 722: 1988, 734: 6401, 1029: 6399, 1093: 6398}, - {385: 6352, 387: 6351, 561: 1931, 720: 1931, 722: 1931, 1334: 6353}, - {538: 6350, 561: 1710, 720: 1710, 722: 1710}, - {1013, 1013, 9: 6340}, + {567: 3058, 805: 6307}, + {899, 899}, + {900, 900}, + {902, 902}, + {904, 904}, // 3435 - {196: 6326}, - {561: 980, 720: 6324, 722: 980}, - {561: 6107, 722: 6108, 898: 6322}, - {561: 6107, 722: 6108, 898: 6317}, - {561: 6107, 722: 6108, 898: 6315}, + {2: 453, 453, 453, 453, 453, 453, 453, 10: 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 58: 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 538: 453, 540: 453, 562: 2081, 591: 453, 720: 2081, 722: 2081}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 538: 6466, 562: 2079, 720: 2079, 722: 2079, 777: 6465, 3072, 3073, 3071}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 6463, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 562: 2042, 720: 2042, 722: 2042, 777: 6325, 3072, 3073, 3071, 933: 6366}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 562: 2036, 720: 2036, 722: 2036, 777: 6325, 3072, 3073, 3071, 933: 6460}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 538: 3763, 540: 6456, 562: 2034, 591: 4384, 720: 2034, 722: 2034, 777: 3764, 3072, 3073, 3071, 811: 4383, 911: 6455}, // 3440 - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 538: 3758, 540: 6314, 591: 4376, 777: 3759, 3067, 3068, 3066, 811: 4375, 911: 6313, 1338: 6312}, - {958, 958, 9: 958}, - {965, 965, 9: 965}, - {964, 964, 9: 964}, - {963, 963, 9: 963}, + {562: 6127, 6445, 720: 2029, 722: 2029, 898: 6444}, + {562: 2021, 577: 6442, 720: 2021, 722: 2021}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 6346, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 6347, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 538: 6351, 540: 6439, 562: 2019, 720: 2019, 6437, 2019, 777: 3764, 3072, 3073, 3071, 811: 5849, 904: 6353, 925: 6354, 6352, 974: 6350, 1274: 6438, 1458: 6436}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 6434, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 562: 2016, 720: 2016, 722: 2016, 777: 6325, 3072, 3073, 3071, 933: 6363}, + {233: 6419, 562: 1998, 720: 1998, 722: 1998, 734: 6420, 1030: 6418, 1096: 6417}, // 3445 - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 6316}, - {970, 970, 9: 970, 571: 3767, 3765, 3766, 3764, 3762, 806: 3763, 3761}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 6319, 3625, 538: 3607, 3623, 3921, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 6318, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 3917, 899: 6320, 945: 6321}, - {984, 984, 3316, 3471, 3280, 3156, 3196, 3318, 3080, 984, 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3703, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3637, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 4472, 3618, 3700, 3617, 3614}, - {985, 985, 9: 985}, + {386: 6371, 388: 6370, 562: 1940, 720: 1940, 722: 1940, 1332: 6372}, + {538: 6369, 562: 1719, 720: 1719, 722: 1719}, + {1021, 1021, 9: 6359}, + {185: 6345}, + {562: 988, 720: 6343, 722: 988}, // 3450 - {983, 983, 9: 983}, - {971, 971, 9: 971}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 6319, 3625, 538: 3607, 3623, 3921, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 6318, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 3917, 899: 6320, 945: 6323}, - {975, 975, 9: 975}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 6325, 3067, 3068, 3066}, + {562: 6127, 722: 6128, 898: 6341}, + {562: 6127, 722: 6128, 898: 6336}, + {562: 6127, 722: 6128, 898: 6334}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 538: 3763, 540: 6333, 591: 4384, 777: 3764, 3072, 3073, 3071, 811: 4383, 911: 6332, 1336: 6331}, + {966, 966, 9: 966}, // 3455 - {561: 979, 722: 979}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 6327, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 6328, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 538: 6332, 721: 6330, 777: 3759, 3067, 3068, 3066, 811: 5829, 904: 6334, 923: 6335, 6333, 972: 6331, 1275: 6329}, - {942, 942, 9: 942, 633: 2103, 717: 942, 731: 2103}, - {1001, 1001, 633: 1926, 717: 1001, 731: 1926}, - {717: 6338}, + {973, 973, 9: 973}, + {972, 972, 9: 972}, + {971, 971, 9: 971}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 6335}, + {978, 978, 9: 978, 572: 3772, 3770, 3771, 3769, 3767, 806: 3768, 3766}, // 3460 - {717: 1000}, - {999, 999, 9: 6336, 717: 999}, - {943, 943, 9: 943, 633: 435, 717: 943, 731: 435}, - {937, 937, 9: 937, 717: 937}, - {936, 936, 9: 936, 717: 936}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 6338, 3630, 538: 3612, 3628, 3926, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 6337, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 3922, 899: 6339, 947: 6340}, + {992, 992, 3321, 3476, 3285, 3160, 3201, 3323, 3085, 992, 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3708, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3642, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 4480, 3623, 3705, 3622, 3619}, + {993, 993, 9: 993}, + {991, 991, 9: 991}, + {979, 979, 9: 979}, // 3465 - {935, 935, 9: 935, 717: 935}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 6327, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 538: 6332, 777: 3759, 3067, 3068, 3066, 811: 5829, 904: 6334, 923: 6337, 6333}, - {934, 934, 9: 934, 717: 934}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 538: 3758, 636: 5875, 777: 3759, 3067, 3068, 3066, 811: 5874, 861: 5876, 976: 6339}, - {1002, 1002, 9: 5878}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 6338, 3630, 538: 3612, 3628, 3926, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 6337, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 3922, 899: 6339, 947: 6342}, + {983, 983, 9: 983}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 6344, 3072, 3073, 3071}, + {562: 987, 722: 987}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 6346, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 6347, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 538: 6351, 721: 6349, 777: 3764, 3072, 3073, 3071, 811: 5849, 904: 6353, 925: 6354, 6352, 974: 6350, 1274: 6348}, // 3470 - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 6292, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 6295, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 6341, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 6342, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 6296, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 558: 4441, 633: 6309, 657: 6308, 714: 4439, 777: 6306, 3067, 3068, 3066, 859: 6310, 932: 6307, 1102: 6343}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 561: 2033, 720: 2033, 722: 2033, 777: 6306, 3067, 3068, 3066, 932: 6347}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 561: 2006, 720: 2006, 722: 2006, 777: 6306, 3067, 3068, 3066, 932: 6344}, - {957, 957, 9: 957}, - {561: 6107, 722: 6108, 898: 6345}, + {950, 950, 9: 950, 633: 2112, 717: 950, 731: 2112}, + {1009, 1009, 633: 1935, 717: 1009, 731: 1935}, + {717: 6357}, + {717: 1008}, + {1007, 1007, 9: 6355, 717: 1007}, // 3475 - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 6319, 3625, 538: 3607, 3623, 3921, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 6318, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 3917, 899: 6320, 945: 6346}, - {973, 973, 9: 973}, - {561: 6107, 722: 6108, 898: 6348}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 6319, 3625, 538: 3607, 3623, 3921, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 6318, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 3917, 899: 6320, 945: 6349}, - {974, 974, 9: 974}, + {951, 951, 9: 951, 633: 442, 717: 951, 731: 442}, + {945, 945, 9: 945, 717: 945}, + {944, 944, 9: 944, 717: 944}, + {943, 943, 9: 943, 717: 943}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 6346, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 538: 6351, 777: 3764, 3072, 3073, 3071, 811: 5849, 904: 6353, 925: 6356, 6352}, // 3480 - {1005, 1005}, - {563: 2501}, - {563: 2500}, - {563: 6354}, - {536: 2923, 2922, 552: 2921, 557: 2907, 592: 2906, 614: 2920, 661: 6366, 701: 2916, 719: 3035, 781: 6357, 809: 6355, 812: 6358, 2917, 2918, 2919, 2928, 818: 2926, 2925, 2924, 822: 6356, 6360, 6359, 828: 3034, 6362, 6363, 832: 6364, 6361, 950: 6365}, + {942, 942, 9: 942, 717: 942}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 538: 3763, 636: 5895, 777: 3764, 3072, 3073, 3071, 811: 5894, 861: 5896, 977: 6358}, + {1010, 1010, 9: 5898}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 6311, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 6314, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 6360, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 6361, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 6315, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 558: 4449, 633: 6328, 657: 6327, 714: 4447, 777: 6325, 3072, 3073, 3071, 859: 6329, 933: 6326, 1105: 6362}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 562: 2042, 720: 2042, 722: 2042, 777: 6325, 3072, 3073, 3071, 933: 6366}, // 3485 - {2: 1059, 1059, 1059, 1059, 1059, 1059, 1059, 10: 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 58: 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 554: 1059, 566: 1059, 842: 1059, 1059, 1059, 846: 5978, 975: 5979, 1025: 6371}, - {536: 2923, 552: 2921, 614: 2920, 701: 2916, 719: 3035, 781: 3876, 812: 3875, 2917, 2918, 2919, 2928, 818: 2926, 3877, 3878, 828: 5727}, - {350, 350, 544: 1020, 547: 350, 555: 1020, 1020, 559: 3881, 562: 3880, 569: 3879, 848: 3882, 3883}, - {352, 352, 544: 1021, 547: 352, 555: 1021, 1021}, - {353, 353, 547: 353}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 562: 2016, 720: 2016, 722: 2016, 777: 6325, 3072, 3073, 3071, 933: 6363}, + {965, 965, 9: 965}, + {562: 6127, 722: 6128, 898: 6364}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 6338, 3630, 538: 3612, 3628, 3926, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 6337, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 3922, 899: 6339, 947: 6365}, + {981, 981, 9: 981}, // 3490 - {351, 351, 547: 351}, - {349, 349, 547: 349}, - {348, 348, 547: 348}, - {347, 347, 547: 347}, - {346, 346, 547: 346}, + {562: 6127, 722: 6128, 898: 6367}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 6338, 3630, 538: 3612, 3628, 3926, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 6337, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 3922, 899: 6339, 947: 6368}, + {982, 982, 9: 982}, + {1013, 1013}, + {563: 2507}, // 3495 - {340, 340, 547: 6369}, - {219: 6367}, - {538: 6368}, - {338, 338}, - {536: 2923, 2922, 552: 2921, 557: 2907, 592: 2906, 614: 2920, 701: 2916, 719: 3035, 781: 6357, 809: 6355, 812: 6358, 2917, 2918, 2919, 2928, 818: 2926, 2925, 2924, 822: 6356, 6360, 6359, 828: 3034, 6362, 6363, 832: 6364, 6361, 950: 6370}, + {563: 2506}, + {563: 6373}, + {536: 2929, 2928, 552: 2927, 557: 2913, 592: 2912, 613: 2926, 660: 2922, 6385, 719: 3039, 781: 6376, 809: 6374, 812: 6377, 2923, 2924, 2925, 2934, 2932, 2931, 2930, 821: 6375, 6379, 6378, 827: 3038, 829: 6381, 6382, 6383, 6380, 935: 6384}, + {2: 1067, 1067, 1067, 1067, 1067, 1067, 1067, 10: 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 58: 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 554: 1067, 566: 1067, 839: 1067, 841: 1067, 844: 1067, 846: 5998, 949: 5999, 1000: 6390}, + {536: 2929, 552: 2927, 613: 2926, 660: 2922, 719: 3039, 781: 3881, 812: 3880, 2923, 2924, 2925, 2934, 2932, 3882, 3883, 827: 5741}, // 3500 - {339, 339}, - {2: 1263, 1263, 1263, 1263, 1263, 1263, 1263, 10: 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 58: 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 554: 1263, 566: 1263, 842: 5983, 5982, 5981, 940: 5984, 996: 6372}, - {2: 1251, 1251, 1251, 1251, 1251, 1251, 1251, 10: 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 58: 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 6374, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 554: 1251, 566: 1251, 1253: 6373}, - {2: 2128, 2128, 2128, 2128, 2128, 2128, 2128, 10: 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 58: 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 554: 4697, 566: 2128, 964: 6375}, - {2: 1250, 1250, 1250, 1250, 1250, 1250, 1250, 10: 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 58: 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 554: 1250, 566: 1250}, + {357, 357, 544: 1028, 547: 357, 555: 1028, 1028, 559: 3886, 3885, 570: 3884, 847: 3887, 3888}, + {359, 359, 544: 1029, 547: 359, 555: 1029, 1029}, + {360, 360, 547: 360}, + {358, 358, 547: 358}, + {356, 356, 547: 356}, // 3505 - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 566: 6376, 777: 6378, 3067, 3068, 3066, 1024: 6379, 1090: 6377}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 3949, 3067, 3068, 3066, 810: 6391}, - {9: 6387, 566: 6386}, - {9: 1253, 547: 1253, 566: 1253, 720: 6381, 1014: 6380}, - {9: 1255, 547: 1255, 566: 1255}, + {355, 355, 547: 355}, + {354, 354, 547: 354}, + {353, 353, 547: 353}, + {346, 346, 547: 6388}, + {220: 6386}, // 3510 - {9: 1257, 547: 1257, 566: 1257}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 589: 6383, 777: 6382, 3067, 3068, 3066}, - {9: 1253, 547: 1253, 566: 1253, 720: 6385, 1014: 6384}, - {9: 1252, 547: 1252, 566: 1252}, - {9: 1256, 547: 1256, 566: 1256}, + {538: 6387}, + {344, 344}, + {536: 2929, 2928, 552: 2927, 557: 2913, 592: 2912, 613: 2926, 660: 2922, 719: 3039, 781: 6376, 809: 6374, 812: 6377, 2923, 2924, 2925, 2934, 2932, 2931, 2930, 821: 6375, 6379, 6378, 827: 3038, 829: 6381, 6382, 6383, 6380, 935: 6389}, + {345, 345}, + {2: 1272, 1272, 1272, 1272, 1272, 1272, 1272, 10: 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 58: 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 554: 1272, 566: 1272, 839: 6003, 841: 6002, 844: 6001, 942: 6004, 997: 6391}, // 3515 - {589: 6383}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 536: 5995, 648: 5990, 777: 3949, 3067, 3068, 3066, 5994, 810: 5993, 901: 5992, 905: 5991, 5997, 961: 5987, 999: 6389}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 6378, 3067, 3068, 3066, 1024: 6388}, - {9: 1254, 547: 1254, 566: 1254}, - {424, 424, 9: 6041, 547: 424, 568: 4683, 895: 4684, 6390}, + {2: 1259, 1259, 1259, 1259, 1259, 1259, 1259, 10: 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 58: 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 6393, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 554: 1259, 566: 1259, 1253: 6392}, + {2: 2137, 2137, 2137, 2137, 2137, 2137, 2137, 10: 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 58: 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 554: 4706, 566: 2137, 966: 6394}, + {2: 1258, 1258, 1258, 1258, 1258, 1258, 1258, 10: 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 58: 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 554: 1258, 566: 1258}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 566: 6395, 777: 6397, 3072, 3073, 3071, 1026: 6398, 1092: 6396}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 565: 3955, 777: 3954, 3072, 3073, 3071, 810: 6410}, // 3520 - {2357, 2357, 547: 2357}, - {1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 10: 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 58: 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 542: 1128, 547: 1128, 551: 6045, 554: 1128, 562: 1128, 568: 1128, 1128, 1128, 580: 1128, 969: 6392}, - {1126, 1126, 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 542: 6002, 547: 1126, 554: 1126, 562: 1126, 568: 1126, 1126, 1126, 580: 1126, 777: 6001, 3067, 3068, 3066, 1022: 6000, 6393}, - {1107, 1107, 547: 1107, 554: 6054, 562: 1107, 568: 1107, 1107, 6055, 580: 6053, 1057: 6057, 6056, 1197: 6058, 6394}, - {424, 424, 547: 424, 562: 424, 568: 4683, 424, 895: 4684, 6395}, + {9: 6406, 566: 6405}, + {9: 1261, 547: 1261, 566: 1261, 720: 6400, 1016: 6399}, + {9: 1263, 547: 1263, 566: 1263}, + {9: 1265, 547: 1265, 566: 1265}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 565: 6402, 777: 6401, 3072, 3073, 3071}, // 3525 - {1507, 1507, 547: 1507, 562: 1507, 569: 3879, 848: 3933, 915: 6396}, - {1089, 1089, 547: 1089, 562: 6102, 1207: 6397}, - {2358, 2358, 547: 2358}, - {1008, 1008, 9: 6413}, - {995, 995, 9: 995}, + {9: 1261, 547: 1261, 566: 1261, 720: 6404, 1016: 6403}, + {9: 1260, 547: 1260, 566: 1260}, + {9: 1264, 547: 1264, 566: 1264}, + {565: 6402}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 536: 6015, 565: 3955, 648: 6010, 777: 3954, 3072, 3073, 3071, 6014, 810: 6013, 900: 6012, 905: 6011, 6017, 963: 6007, 1001: 6408}, // 3530 - {405: 6405}, - {195: 6403, 774: 6402}, - {992, 992, 9: 992}, - {991, 991, 9: 991, 736: 4663, 1001: 6404}, - {990, 990, 9: 990}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 6397, 3072, 3073, 3071, 1026: 6407}, + {9: 1262, 547: 1262, 566: 1262}, + {431, 431, 9: 6061, 547: 431, 569: 4692, 895: 4693, 6409}, + {2363, 2363, 547: 2363}, + {1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 10: 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 58: 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 542: 1136, 547: 1136, 551: 6065, 554: 1136, 560: 1136, 569: 1136, 1136, 1136, 581: 1136, 971: 6411}, // 3535 - {271: 6407, 439: 6409, 734: 6408, 1387: 6406}, - {993, 993, 9: 993}, - {734: 6412}, - {380: 6410, 459: 6411}, - {986, 986, 9: 986}, + {1134, 1134, 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 542: 6022, 547: 1134, 554: 1134, 560: 1134, 569: 1134, 1134, 1134, 581: 1134, 777: 6021, 3072, 3073, 3071, 1024: 6020, 6412}, + {1115, 1115, 547: 1115, 554: 6074, 560: 1115, 569: 1115, 1115, 6075, 581: 6073, 1058: 6077, 6076, 1198: 6078, 6413}, + {431, 431, 547: 431, 560: 431, 569: 4692, 431, 895: 4693, 6414}, + {1516, 1516, 547: 1516, 560: 1516, 570: 3884, 847: 3938, 917: 6415}, + {1097, 1097, 547: 1097, 560: 6122, 1208: 6416}, // 3540 - {988, 988, 9: 988}, - {987, 987, 9: 987}, - {989, 989, 9: 989}, - {233: 6400, 734: 6401, 1029: 6414}, - {994, 994, 9: 994}, + {2364, 2364, 547: 2364}, + {1016, 1016, 9: 6432}, + {1003, 1003, 9: 1003}, + {405: 6424}, + {196: 6422, 775: 6421}, // 3545 - {233: 6400, 561: 1988, 720: 1988, 722: 1988, 734: 6401, 1029: 6399, 1093: 6416}, - {1009, 1009, 9: 6413}, - {1003, 1003}, - {1000, 1000, 555: 6421}, - {997, 997}, + {1000, 1000, 9: 1000}, + {999, 999, 9: 999, 736: 4671, 1003: 6423}, + {998, 998, 9: 998}, + {271: 6426, 439: 6428, 734: 6427, 1386: 6425}, + {1001, 1001, 9: 1001}, // 3550 - {996, 996}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 6327, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 538: 6332, 777: 3759, 3067, 3068, 3066, 811: 5829, 904: 6334, 923: 6335, 6333, 972: 6422}, - {998, 998, 9: 6336}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 540: 4618, 777: 4617, 3067, 3068, 3066, 942: 6424}, - {1004, 1004}, + {734: 6431}, + {381: 6429, 458: 6430}, + {994, 994, 9: 994}, + {996, 996, 9: 996}, + {995, 995, 9: 995}, // 3555 - {15: 6431, 538: 6430, 1240: 6435}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 538: 3758, 636: 5875, 777: 3759, 3067, 3068, 3066, 811: 5874, 861: 6427}, - {561: 6107, 722: 6108, 898: 6428}, - {15: 6431, 538: 6430, 1240: 6429}, - {1011, 1011}, + {997, 997, 9: 997}, + {233: 6419, 734: 6420, 1030: 6433}, + {1002, 1002, 9: 1002}, + {233: 6419, 562: 1998, 720: 1998, 722: 1998, 734: 6420, 1030: 6418, 1096: 6435}, + {1017, 1017, 9: 6432}, // 3560 - {946, 946}, - {536: 6432}, - {538: 5908, 1003: 6433}, - {57: 6434}, - {945, 945}, + {1011, 1011}, + {1008, 1008, 555: 6440}, + {1005, 1005}, + {1004, 1004}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 6346, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 538: 6351, 777: 3764, 3072, 3073, 3071, 811: 5849, 904: 6353, 925: 6354, 6352, 974: 6441}, // 3565 + {1006, 1006, 9: 6355}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 540: 4626, 777: 4625, 3072, 3073, 3071, 944: 6443}, {1012, 1012}, - {969, 969, 9: 969, 543: 6438}, - {966, 966, 9: 966}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 538: 3758, 540: 6439, 777: 3759, 3067, 3068, 3066, 811: 6440}, - {968, 968, 9: 968}, + {15: 6450, 538: 6449, 1241: 6454}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 538: 3763, 636: 5895, 777: 3764, 3072, 3073, 3071, 811: 5894, 861: 6446}, // 3570 - {967, 967, 9: 967}, - {561: 6107, 722: 6108, 898: 6442}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 6319, 3625, 538: 3607, 3623, 3921, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 6318, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 3917, 899: 6320, 945: 6443}, - {972, 972, 9: 972}, - {233: 6400, 561: 1988, 720: 1988, 722: 1988, 734: 6401, 1029: 6399, 1093: 6445}, + {562: 6127, 722: 6128, 898: 6447}, + {15: 6450, 538: 6449, 1241: 6448}, + {1019, 1019}, + {954, 954}, + {536: 6451}, // 3575 - {1010, 1010, 9: 6413}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 6449, 3067, 3068, 3066, 1007: 6456}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 6449, 3067, 3068, 3066, 1007: 6448}, - {561: 6107, 722: 6108, 898: 6454}, - {549: 6451, 561: 978, 720: 6450, 722: 978}, + {538: 5928, 1005: 6452}, + {57: 6453}, + {953, 953}, + {1020, 1020}, + {977, 977, 9: 977, 543: 6457}, // 3580 - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 6449, 3067, 3068, 3066, 1007: 6453}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 6449, 3067, 3068, 3066, 1007: 6452}, - {561: 976, 722: 976}, - {561: 977, 722: 977}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 6319, 3625, 538: 3607, 3623, 3921, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 6318, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 3917, 899: 6320, 945: 6455}, + {974, 974, 9: 974}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 538: 3763, 540: 6458, 777: 3764, 3072, 3073, 3071, 811: 6459}, + {976, 976, 9: 976}, + {975, 975, 9: 975}, + {562: 6127, 722: 6128, 898: 6461}, // 3585 - {1006, 1006}, - {561: 6107, 722: 6108, 898: 6457}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 6319, 3625, 538: 3607, 3623, 3921, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 6318, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 3917, 899: 6320, 945: 6458}, - {1007, 1007}, - {717: 6468}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 6338, 3630, 538: 3612, 3628, 3926, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 6337, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 3922, 899: 6339, 947: 6462}, + {980, 980, 9: 980}, + {233: 6419, 562: 1998, 720: 1998, 722: 1998, 734: 6420, 1030: 6418, 1096: 6464}, + {1018, 1018, 9: 6432}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 6468, 3072, 3073, 3071, 1009: 6475}, // 3590 - {717: 6461}, - {326: 6462}, - {561: 6463}, - {538: 6464}, - {563: 6465}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 6468, 3072, 3073, 3071, 1009: 6467}, + {562: 6127, 722: 6128, 898: 6473}, + {549: 6470, 562: 986, 720: 6469, 722: 986}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 6468, 3072, 3073, 3071, 1009: 6472}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 6468, 3072, 3073, 3071, 1009: 6471}, // 3595 - {325: 6466}, - {538: 6467}, + {562: 984, 722: 984}, + {562: 985, 722: 985}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 6338, 3630, 538: 3612, 3628, 3926, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 6337, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 3922, 899: 6339, 947: 6474}, {1014, 1014}, - {326: 6469}, - {561: 6470}, + {562: 6127, 722: 6128, 898: 6476}, // 3600 - {538: 6471}, - {563: 6472}, - {325: 6473}, - {538: 6474}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 6338, 3630, 538: 3612, 3628, 3926, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 6337, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 3922, 899: 6339, 947: 6477}, {1015, 1015}, + {717: 6487}, + {717: 6480}, + {328: 6481}, // 3605 - {536: 2923, 552: 2921, 614: 2920, 701: 2916, 781: 6486, 812: 6485, 2917, 2918, 2919, 6487}, - {536: 1447, 552: 1447, 614: 1447, 701: 1447, 721: 4196, 835: 4194, 4195, 891: 6479, 893: 6480, 1045: 6482, 1087: 6484}, - {536: 1447, 552: 1447, 614: 1447, 701: 1447, 721: 4196, 835: 4194, 4195, 891: 6479, 893: 6480, 1045: 6482, 1087: 6483}, - {536: 1447, 552: 1447, 614: 1447, 701: 1447, 721: 4196, 835: 4194, 4195, 891: 6479, 893: 6480, 1045: 6482, 1087: 6481}, - {2: 1450, 1450, 1450, 1450, 1450, 1450, 1450, 10: 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 58: 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 536: 1450, 538: 1450, 1450, 1450, 1450, 545: 1450, 1450, 548: 1450, 1450, 1450, 552: 1450, 1450, 557: 1450, 1450, 564: 1450, 578: 1450, 583: 1450, 589: 1450, 591: 1450, 1450, 614: 1450, 624: 1450, 631: 1450, 633: 1450, 1450, 1450, 1450, 641: 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 662: 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 716: 1450, 721: 1450, 835: 1450, 1450, 842: 1450, 1450, 1450, 846: 1450, 855: 1450, 1450, 1450}, + {562: 6482}, + {538: 6483}, + {563: 6484}, + {327: 6485}, + {538: 6486}, // 3610 - {536: 1446, 552: 1446, 614: 1446, 701: 1446}, - {536: 1017, 552: 1017, 614: 1017, 701: 1017}, - {536: 1016, 552: 1016, 614: 1016, 701: 1016}, - {536: 1018, 552: 1018, 614: 1018, 701: 1018}, - {536: 1019, 552: 1019, 614: 1019, 701: 1019}, + {1022, 1022}, + {328: 6488}, + {562: 6489}, + {538: 6490}, + {563: 6491}, // 3615 - {1031, 1031, 57: 1031, 535: 1031, 537: 1031, 544: 1021, 547: 1031, 555: 1021, 1021}, - {1030, 1030, 57: 1030, 535: 1030, 537: 1030, 544: 1020, 547: 1030, 555: 1020, 1020, 559: 3881, 562: 3880, 569: 3879, 848: 6488, 6489}, - {544: 1022, 555: 1022, 1022}, - {1029, 1029, 57: 1029, 535: 1029, 537: 1029, 547: 1029, 559: 3881, 562: 3880, 849: 6490}, - {1028, 1028, 57: 1028, 535: 1028, 537: 1028, 547: 1028}, + {327: 6492}, + {538: 6493}, + {1023, 1023}, + {536: 2929, 552: 2927, 613: 2926, 660: 2922, 781: 6505, 812: 6504, 2923, 2924, 2925, 6506}, + {536: 1456, 552: 1456, 613: 1456, 660: 1456, 721: 4204, 834: 4202, 4203, 891: 6498, 893: 6499, 1046: 6501, 1089: 6503}, // 3620 - {1027, 1027, 57: 1027, 535: 1027, 537: 1027, 547: 1027}, - {57: 4011, 544: 1020, 555: 1020, 1020, 559: 3881, 562: 3880, 569: 3879, 848: 3882, 3883}, - {9: 6506, 536: 1203, 552: 1203, 614: 1203, 701: 1203, 719: 1203, 809: 1203}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 6495, 3067, 3068, 3066, 1040: 6494, 1314: 6505}, - {9: 1200, 536: 1200, 552: 1200, 614: 1200, 701: 1200, 719: 1200, 809: 1200}, + {536: 1456, 552: 1456, 613: 1456, 660: 1456, 721: 4204, 834: 4202, 4203, 891: 6498, 893: 6499, 1046: 6501, 1089: 6502}, + {536: 1456, 552: 1456, 613: 1456, 660: 1456, 721: 4204, 834: 4202, 4203, 891: 6498, 893: 6499, 1046: 6501, 1089: 6500}, + {2: 1459, 1459, 1459, 1459, 1459, 1459, 1459, 10: 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 58: 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 536: 1459, 538: 1459, 1459, 1459, 1459, 545: 1459, 1459, 548: 1459, 1459, 1459, 552: 1459, 1459, 557: 1459, 1459, 565: 1459, 567: 1459, 579: 1459, 584: 1459, 591: 1459, 1459, 613: 1459, 630: 1459, 1459, 633: 1459, 1459, 1459, 1459, 641: 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 662: 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 716: 1459, 721: 1459, 834: 1459, 1459, 839: 1459, 841: 1459, 844: 1459, 846: 1459, 855: 1459, 1459, 1459}, + {536: 1455, 552: 1455, 613: 1455, 660: 1455}, + {536: 1025, 552: 1025, 613: 1025, 660: 1025}, // 3625 - {536: 6496, 542: 2619, 1377: 6497}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 6501, 3067, 3068, 3066, 986: 6500}, - {542: 6498}, - {536: 2923, 781: 6499}, - {9: 1199, 536: 1199, 552: 1199, 614: 1199, 701: 1199, 719: 1199, 809: 1199}, + {536: 1024, 552: 1024, 613: 1024, 660: 1024}, + {536: 1026, 552: 1026, 613: 1026, 660: 1026}, + {536: 1027, 552: 1027, 613: 1027, 660: 1027}, + {1039, 1039, 57: 1039, 535: 1039, 537: 1039, 544: 1029, 547: 1039, 555: 1029, 1029}, + {1038, 1038, 57: 1038, 535: 1038, 537: 1038, 544: 1028, 547: 1038, 555: 1028, 1028, 559: 3886, 3885, 570: 3884, 847: 6507, 6508}, // 3630 - {9: 6503, 57: 6502}, - {2617, 2617, 9: 2617, 57: 2617, 537: 2617}, - {542: 2618}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 6504, 3067, 3068, 3066}, - {2616, 2616, 9: 2616, 57: 2616, 537: 2616}, + {544: 1030, 555: 1030, 1030}, + {1037, 1037, 57: 1037, 535: 1037, 537: 1037, 547: 1037, 559: 3886, 3885, 848: 6509}, + {1036, 1036, 57: 1036, 535: 1036, 537: 1036, 547: 1036}, + {1035, 1035, 57: 1035, 535: 1035, 537: 1035, 547: 1035}, + {57: 4019, 544: 1028, 555: 1028, 1028, 559: 3886, 3885, 570: 3884, 847: 3887, 3888}, // 3635 - {9: 6506, 536: 1202, 552: 1202, 614: 1202, 701: 1202, 719: 1202, 809: 1202}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 6495, 3067, 3068, 3066, 1040: 6507}, - {9: 1201, 536: 1201, 552: 1201, 614: 1201, 701: 1201, 719: 1201, 809: 1201}, - {1507, 1507, 57: 1507, 535: 1507, 537: 1507, 544: 1507, 547: 1507, 555: 1507, 1507, 559: 1507, 562: 1507, 1507, 565: 1507, 567: 1507, 569: 3879, 848: 3933, 915: 6509}, - {1075, 1075, 57: 1075, 535: 1075, 537: 1075, 544: 1075, 547: 1075, 555: 1075, 1075, 559: 3881, 562: 3880, 1075, 565: 1075, 567: 1075, 849: 3938, 931: 6510}, + {9: 6525, 536: 1211, 552: 1211, 613: 1211, 660: 1211, 719: 1211, 809: 1211}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 6514, 3072, 3073, 3071, 1041: 6513, 1312: 6524}, + {9: 1208, 536: 1208, 552: 1208, 613: 1208, 660: 1208, 719: 1208, 809: 1208}, + {536: 6515, 542: 2625, 1375: 6516}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 6520, 3072, 3073, 3071, 987: 6519}, // 3640 - {1046, 1046, 57: 1046, 535: 1046, 537: 1046, 544: 1046, 547: 1046, 555: 1046, 1046, 563: 3940, 565: 1046, 567: 3941, 997: 6511}, - {1052, 1052, 57: 1052, 535: 1052, 537: 1052, 544: 1052, 547: 1052, 555: 1052, 1052, 565: 3966, 998: 6512}, - {1207, 1207, 57: 1207, 535: 1207, 537: 1207, 544: 1207, 547: 1207, 555: 1207, 1207}, - {1075, 1075, 57: 1075, 535: 1075, 537: 1075, 544: 1075, 547: 1075, 555: 1075, 1075, 559: 3881, 562: 3880, 1075, 565: 1075, 567: 1075, 849: 3938, 931: 6514}, - {1046, 1046, 57: 1046, 535: 1046, 537: 1046, 544: 1046, 547: 1046, 555: 1046, 1046, 563: 3940, 565: 1046, 567: 3941, 997: 6515}, + {542: 6517}, + {536: 2929, 781: 6518}, + {9: 1207, 536: 1207, 552: 1207, 613: 1207, 660: 1207, 719: 1207, 809: 1207}, + {9: 6522, 57: 6521}, + {2623, 2623, 9: 2623, 57: 2623, 537: 2623}, // 3645 - {1052, 1052, 57: 1052, 535: 1052, 537: 1052, 544: 1052, 547: 1052, 555: 1052, 1052, 565: 3966, 998: 6516}, - {1208, 1208, 57: 1208, 535: 1208, 537: 1208, 544: 1208, 547: 1208, 555: 1208, 1208}, - {728: 6524}, - {1507, 1507, 57: 1507, 535: 1507, 537: 1507, 544: 1507, 547: 1507, 555: 1507, 1507, 559: 1507, 562: 1507, 1507, 565: 1507, 567: 1507, 569: 3879, 848: 3933, 915: 6520}, - {1053, 1053, 57: 1053, 535: 1053, 537: 1053, 544: 1053, 547: 1053, 555: 1053, 1053, 559: 1053, 562: 1053, 1053, 565: 1053, 567: 1053, 569: 1053, 577: 1053, 579: 1053}, + {542: 2624}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 6523, 3072, 3073, 3071}, + {2622, 2622, 9: 2622, 57: 2622, 537: 2622}, + {9: 6525, 536: 1210, 552: 1210, 613: 1210, 660: 1210, 719: 1210, 809: 1210}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 6514, 3072, 3073, 3071, 1041: 6526}, // 3650 - {1075, 1075, 57: 1075, 535: 1075, 537: 1075, 544: 1075, 547: 1075, 555: 1075, 1075, 559: 3881, 562: 3880, 1075, 565: 1075, 567: 1075, 849: 3938, 931: 6521}, - {1046, 1046, 57: 1046, 535: 1046, 537: 1046, 544: 1046, 547: 1046, 555: 1046, 1046, 563: 3940, 565: 1046, 567: 3941, 997: 6522}, - {1052, 1052, 57: 1052, 535: 1052, 537: 1052, 544: 1052, 547: 1052, 555: 1052, 1052, 565: 3966, 998: 6523}, - {1209, 1209, 57: 1209, 535: 1209, 537: 1209, 544: 1209, 547: 1209, 555: 1209, 1209}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 3903, 979: 3905, 1006: 6525}, + {9: 1209, 536: 1209, 552: 1209, 613: 1209, 660: 1209, 719: 1209, 809: 1209}, + {1516, 1516, 57: 1516, 535: 1516, 537: 1516, 544: 1516, 547: 1516, 555: 1516, 1516, 559: 1516, 1516, 563: 1516, 1516, 568: 1516, 570: 3884, 847: 3938, 917: 6528}, + {1083, 1083, 57: 1083, 535: 1083, 537: 1083, 544: 1083, 547: 1083, 555: 1083, 1083, 559: 3886, 3885, 563: 1083, 1083, 568: 1083, 848: 3943, 932: 6529}, + {1054, 1054, 57: 1054, 535: 1054, 537: 1054, 544: 1054, 547: 1054, 555: 1054, 1054, 563: 3945, 1054, 568: 3946, 998: 6530}, + {1060, 1060, 57: 1060, 535: 1060, 537: 1060, 544: 1060, 547: 1060, 555: 1060, 1060, 564: 3974, 999: 6531}, // 3655 - {2140, 2140, 9: 3906, 57: 2140, 535: 2140, 537: 6526, 544: 2140, 547: 2140, 555: 2140, 2140, 559: 2140, 562: 2140, 2140, 565: 2140, 567: 2140, 569: 2140, 577: 2140, 579: 2140, 1517: 6527}, - {435: 6528}, - {2138, 2138, 57: 2138, 535: 2138, 537: 2138, 544: 2138, 547: 2138, 555: 2138, 2138, 559: 2138, 562: 2138, 2138, 565: 2138, 567: 2138, 569: 2138, 577: 2138, 579: 2138}, - {2139, 2139, 57: 2139, 535: 2139, 537: 2139, 544: 2139, 547: 2139, 555: 2139, 2139, 559: 2139, 562: 2139, 2139, 565: 2139, 567: 2139, 569: 2139, 577: 2139, 579: 2139}, - {424, 424, 57: 424, 535: 424, 537: 424, 544: 424, 547: 424, 555: 424, 424, 559: 424, 562: 424, 424, 565: 424, 567: 424, 4683, 424, 576: 424, 895: 4684, 6554}, + {1215, 1215, 57: 1215, 535: 1215, 537: 1215, 544: 1215, 547: 1215, 555: 1215, 1215}, + {1083, 1083, 57: 1083, 535: 1083, 537: 1083, 544: 1083, 547: 1083, 555: 1083, 1083, 559: 3886, 3885, 563: 1083, 1083, 568: 1083, 848: 3943, 932: 6533}, + {1054, 1054, 57: 1054, 535: 1054, 537: 1054, 544: 1054, 547: 1054, 555: 1054, 1054, 563: 3945, 1054, 568: 3946, 998: 6534}, + {1060, 1060, 57: 1060, 535: 1060, 537: 1060, 544: 1060, 547: 1060, 555: 1060, 1060, 564: 3974, 999: 6535}, + {1216, 1216, 57: 1216, 535: 1216, 537: 1216, 544: 1216, 547: 1216, 555: 1216, 1216}, // 3660 - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 536: 5995, 648: 5990, 777: 3949, 3067, 3068, 3066, 5994, 810: 5993, 901: 5992, 905: 5991, 5997, 961: 5987, 999: 6539, 1358: 6538, 1487: 6537}, - {1054, 1054, 57: 1054, 535: 1054, 537: 1054, 544: 1054, 547: 1054, 555: 1054, 1054, 559: 1054, 562: 1054, 1054, 565: 1054, 567: 1054, 569: 1054, 576: 6517, 1056: 6519, 1086: 6532}, - {1507, 1507, 57: 1507, 535: 1507, 537: 1507, 544: 1507, 547: 1507, 555: 1507, 1507, 559: 1507, 562: 1507, 1507, 565: 1507, 567: 1507, 569: 3879, 848: 3933, 915: 6533}, - {1075, 1075, 57: 1075, 535: 1075, 537: 1075, 544: 1075, 547: 1075, 555: 1075, 1075, 559: 3881, 562: 3880, 1075, 565: 1075, 567: 1075, 849: 3938, 931: 6534}, - {1046, 1046, 57: 1046, 535: 1046, 537: 1046, 544: 1046, 547: 1046, 555: 1046, 1046, 563: 3940, 565: 1046, 567: 3941, 997: 6535}, + {728: 6543}, + {1516, 1516, 57: 1516, 535: 1516, 537: 1516, 544: 1516, 547: 1516, 555: 1516, 1516, 559: 1516, 1516, 563: 1516, 1516, 568: 1516, 570: 3884, 847: 3938, 917: 6539}, + {1061, 1061, 57: 1061, 535: 1061, 537: 1061, 544: 1061, 547: 1061, 555: 1061, 1061, 559: 1061, 1061, 563: 1061, 1061, 568: 1061, 570: 1061, 578: 1061, 580: 1061}, + {1083, 1083, 57: 1083, 535: 1083, 537: 1083, 544: 1083, 547: 1083, 555: 1083, 1083, 559: 3886, 3885, 563: 1083, 1083, 568: 1083, 848: 3943, 932: 6540}, + {1054, 1054, 57: 1054, 535: 1054, 537: 1054, 544: 1054, 547: 1054, 555: 1054, 1054, 563: 3945, 1054, 568: 3946, 998: 6541}, // 3665 - {1052, 1052, 57: 1052, 535: 1052, 537: 1052, 544: 1052, 547: 1052, 555: 1052, 1052, 565: 3966, 998: 6536}, - {1210, 1210, 57: 1210, 535: 1210, 537: 1210, 544: 1210, 547: 1210, 555: 1210, 1210}, - {424, 424, 57: 424, 535: 424, 537: 424, 544: 424, 547: 424, 555: 424, 424, 559: 424, 562: 424, 424, 565: 424, 567: 424, 4683, 424, 576: 424, 424, 579: 424, 895: 4684, 6540}, - {1198, 1198, 57: 1198, 535: 1198, 537: 1198, 544: 1198, 547: 1198, 555: 1198, 1198, 559: 1198, 562: 1198, 1198, 565: 1198, 567: 1198, 1198, 1198, 576: 1198}, - {1138, 1138, 9: 6041, 57: 1138, 535: 1138, 537: 1138, 544: 1138, 547: 1138, 555: 1138, 1138, 559: 1138, 562: 1138, 1138, 565: 1138, 567: 1138, 1138, 1138, 576: 1138, 1138, 579: 1138}, + {1060, 1060, 57: 1060, 535: 1060, 537: 1060, 544: 1060, 547: 1060, 555: 1060, 1060, 564: 3974, 999: 6542}, + {1217, 1217, 57: 1217, 535: 1217, 537: 1217, 544: 1217, 547: 1217, 555: 1217, 1217}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 3908, 980: 3910, 1008: 6544}, + {2149, 2149, 9: 3911, 57: 2149, 535: 2149, 537: 6545, 544: 2149, 547: 2149, 555: 2149, 2149, 559: 2149, 2149, 563: 2149, 2149, 568: 2149, 570: 2149, 578: 2149, 580: 2149, 1517: 6546}, + {435: 6547}, // 3670 - {1054, 1054, 57: 1054, 535: 1054, 537: 1054, 544: 1054, 547: 1054, 555: 1054, 1054, 559: 1054, 562: 1054, 1054, 565: 1054, 567: 1054, 569: 1054, 576: 6517, 1054, 579: 1054, 1056: 6519, 1086: 6541}, - {2137, 2137, 57: 2137, 535: 2137, 537: 2137, 544: 2137, 547: 2137, 555: 2137, 2137, 559: 2137, 562: 2137, 2137, 565: 2137, 567: 2137, 569: 2137, 577: 6542, 579: 2137, 1193: 6543}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 6553}, - {1197, 1197, 57: 1197, 535: 1197, 537: 1197, 544: 1197, 547: 1197, 555: 1197, 1197, 559: 1197, 562: 1197, 1197, 565: 1197, 567: 1197, 569: 1197, 579: 6545, 1509: 6544}, - {1223, 1223, 57: 1223, 535: 1223, 537: 1223, 544: 1223, 547: 1223, 555: 1223, 1223, 559: 1223, 562: 1223, 1223, 565: 1223, 567: 1223, 569: 1223}, + {2147, 2147, 57: 2147, 535: 2147, 537: 2147, 544: 2147, 547: 2147, 555: 2147, 2147, 559: 2147, 2147, 563: 2147, 2147, 568: 2147, 570: 2147, 578: 2147, 580: 2147}, + {2148, 2148, 57: 2148, 535: 2148, 537: 2148, 544: 2148, 547: 2148, 555: 2148, 2148, 559: 2148, 2148, 563: 2148, 2148, 568: 2148, 570: 2148, 578: 2148, 580: 2148}, + {431, 431, 57: 431, 535: 431, 537: 431, 544: 431, 547: 431, 555: 431, 431, 559: 431, 431, 563: 431, 431, 568: 431, 4692, 431, 577: 431, 895: 4693, 6573}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 536: 6015, 565: 3955, 648: 6010, 777: 3954, 3072, 3073, 3071, 6014, 810: 6013, 900: 6012, 905: 6011, 6017, 963: 6007, 1001: 6558, 1356: 6557, 1487: 6556}, + {1062, 1062, 57: 1062, 535: 1062, 537: 1062, 544: 1062, 547: 1062, 555: 1062, 1062, 559: 1062, 1062, 563: 1062, 1062, 568: 1062, 570: 1062, 577: 6536, 1057: 6538, 1088: 6551}, // 3675 - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 4088, 3067, 3068, 3066, 1032: 6548, 1310: 6547, 1510: 6546}, - {1196, 1196, 9: 6551, 57: 1196, 535: 1196, 537: 1196, 544: 1196, 547: 1196, 555: 1196, 1196, 559: 1196, 562: 1196, 1196, 565: 1196, 567: 1196, 569: 1196}, - {1195, 1195, 9: 1195, 57: 1195, 535: 1195, 537: 1195, 544: 1195, 547: 1195, 555: 1195, 1195, 559: 1195, 562: 1195, 1195, 565: 1195, 567: 1195, 569: 1195}, - {542: 6549}, - {536: 4089, 1312: 6550}, + {1516, 1516, 57: 1516, 535: 1516, 537: 1516, 544: 1516, 547: 1516, 555: 1516, 1516, 559: 1516, 1516, 563: 1516, 1516, 568: 1516, 570: 3884, 847: 3938, 917: 6552}, + {1083, 1083, 57: 1083, 535: 1083, 537: 1083, 544: 1083, 547: 1083, 555: 1083, 1083, 559: 3886, 3885, 563: 1083, 1083, 568: 1083, 848: 3943, 932: 6553}, + {1054, 1054, 57: 1054, 535: 1054, 537: 1054, 544: 1054, 547: 1054, 555: 1054, 1054, 563: 3945, 1054, 568: 3946, 998: 6554}, + {1060, 1060, 57: 1060, 535: 1060, 537: 1060, 544: 1060, 547: 1060, 555: 1060, 1060, 564: 3974, 999: 6555}, + {1218, 1218, 57: 1218, 535: 1218, 537: 1218, 544: 1218, 547: 1218, 555: 1218, 1218}, // 3680 - {1193, 1193, 9: 1193, 57: 1193, 535: 1193, 537: 1193, 544: 1193, 547: 1193, 555: 1193, 1193, 559: 1193, 562: 1193, 1193, 565: 1193, 567: 1193, 569: 1193}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 4088, 3067, 3068, 3066, 1032: 6548, 1310: 6552}, - {1194, 1194, 9: 1194, 57: 1194, 535: 1194, 537: 1194, 544: 1194, 547: 1194, 555: 1194, 1194, 559: 1194, 562: 1194, 1194, 565: 1194, 567: 1194, 569: 1194}, - {2136, 2136, 57: 2136, 535: 2136, 537: 2136, 544: 2136, 547: 2136, 555: 2136, 2136, 559: 2136, 562: 2136, 2136, 565: 2136, 2136, 2136, 2136, 2136, 571: 3767, 3765, 3766, 3764, 3762, 2136, 579: 2136, 806: 3763, 3761}, - {1224, 1224, 57: 1224, 535: 1224, 537: 1224, 544: 1224, 547: 1224, 555: 1224, 1224, 559: 1224, 562: 1224, 1224, 565: 1224, 567: 1224, 569: 1224, 576: 1224}, + {431, 431, 57: 431, 535: 431, 537: 431, 544: 431, 547: 431, 555: 431, 431, 559: 431, 431, 563: 431, 431, 568: 431, 4692, 431, 577: 431, 431, 580: 431, 895: 4693, 6559}, + {1206, 1206, 57: 1206, 535: 1206, 537: 1206, 544: 1206, 547: 1206, 555: 1206, 1206, 559: 1206, 1206, 563: 1206, 1206, 568: 1206, 1206, 1206, 577: 1206}, + {1146, 1146, 9: 6061, 57: 1146, 535: 1146, 537: 1146, 544: 1146, 547: 1146, 555: 1146, 1146, 559: 1146, 1146, 563: 1146, 1146, 568: 1146, 1146, 1146, 577: 1146, 1146, 580: 1146}, + {1062, 1062, 57: 1062, 535: 1062, 537: 1062, 544: 1062, 547: 1062, 555: 1062, 1062, 559: 1062, 1062, 563: 1062, 1062, 568: 1062, 570: 1062, 577: 6536, 1062, 580: 1062, 1057: 6538, 1088: 6560}, + {2146, 2146, 57: 2146, 535: 2146, 537: 2146, 544: 2146, 547: 2146, 555: 2146, 2146, 559: 2146, 2146, 563: 2146, 2146, 568: 2146, 570: 2146, 578: 6561, 580: 2146, 1195: 6562}, // 3685 - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 589: 6571, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 6572, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 6570, 1177: 6573, 1368: 6574, 1453: 6575}, - {2: 1073, 1073, 1073, 1073, 1073, 1073, 1073, 10: 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 58: 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 536: 1073, 538: 1073, 1073, 1073, 1073, 545: 1073, 1073, 548: 1073, 1073, 1073, 552: 1073, 1073, 557: 1073, 1073, 564: 1073, 578: 1073, 583: 1073, 589: 1073, 591: 1073, 1073, 624: 1073, 631: 1073, 633: 1073, 1073, 1073, 1073, 641: 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 662: 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 702: 1073, 1073, 1073, 1073, 716: 1073, 721: 1073, 835: 1073, 1073, 842: 1073, 1073, 1073, 846: 1073, 855: 1073, 1073, 1073}, - {2: 1072, 1072, 1072, 1072, 1072, 1072, 1072, 10: 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 58: 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 536: 1072, 538: 1072, 1072, 1072, 1072, 545: 1072, 1072, 548: 1072, 1072, 1072, 552: 1072, 1072, 557: 1072, 1072, 564: 1072, 578: 1072, 583: 1072, 589: 1072, 591: 1072, 1072, 624: 1072, 631: 1072, 633: 1072, 1072, 1072, 1072, 641: 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 662: 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 702: 1072, 1072, 1072, 1072, 716: 1072, 721: 1072, 835: 1072, 1072, 842: 1072, 1072, 1072, 846: 1072, 855: 1072, 1072, 1072}, - {2: 1071, 1071, 1071, 1071, 1071, 1071, 1071, 10: 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 58: 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 536: 1071, 538: 1071, 1071, 1071, 1071, 545: 1071, 1071, 548: 1071, 1071, 1071, 552: 1071, 1071, 557: 1071, 1071, 564: 1071, 578: 1071, 583: 1071, 589: 1071, 591: 1071, 1071, 624: 1071, 631: 1071, 633: 1071, 1071, 1071, 1071, 641: 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 662: 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 702: 1071, 1071, 1071, 1071, 716: 1071, 721: 1071, 835: 1071, 1071, 842: 1071, 1071, 1071, 846: 1071, 855: 1071, 1071, 1071}, - {2: 1070, 1070, 1070, 1070, 1070, 1070, 1070, 10: 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 58: 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 536: 1070, 538: 1070, 1070, 1070, 1070, 545: 1070, 1070, 548: 1070, 1070, 1070, 552: 1070, 1070, 557: 1070, 1070, 564: 1070, 578: 1070, 583: 1070, 589: 1070, 591: 1070, 1070, 624: 1070, 631: 1070, 633: 1070, 1070, 1070, 1070, 641: 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 662: 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 702: 1070, 1070, 1070, 1070, 716: 1070, 721: 1070, 835: 1070, 1070, 842: 1070, 1070, 1070, 846: 1070, 855: 1070, 1070, 1070}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 6572}, + {1205, 1205, 57: 1205, 535: 1205, 537: 1205, 544: 1205, 547: 1205, 555: 1205, 1205, 559: 1205, 1205, 563: 1205, 1205, 568: 1205, 570: 1205, 580: 6564, 1509: 6563}, + {1231, 1231, 57: 1231, 535: 1231, 537: 1231, 544: 1231, 547: 1231, 555: 1231, 1231, 559: 1231, 1231, 563: 1231, 1231, 568: 1231, 570: 1231}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 4096, 3072, 3073, 3071, 1033: 6567, 1308: 6566, 1510: 6565}, + {1204, 1204, 9: 6570, 57: 1204, 535: 1204, 537: 1204, 544: 1204, 547: 1204, 555: 1204, 1204, 559: 1204, 1204, 563: 1204, 1204, 568: 1204, 570: 1204}, // 3690 - {2: 1069, 1069, 1069, 1069, 1069, 1069, 1069, 10: 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 58: 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 536: 1069, 538: 1069, 1069, 1069, 1069, 545: 1069, 1069, 548: 1069, 1069, 1069, 552: 1069, 1069, 557: 1069, 1069, 564: 1069, 578: 1069, 583: 1069, 589: 1069, 591: 1069, 1069, 624: 1069, 631: 1069, 633: 1069, 1069, 1069, 1069, 641: 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 662: 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 702: 1069, 1069, 1069, 1069, 716: 1069, 721: 1069, 835: 1069, 1069, 842: 1069, 1069, 1069, 846: 1069, 855: 1069, 1069, 1069}, - {2: 1068, 1068, 1068, 1068, 1068, 1068, 1068, 10: 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 58: 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 536: 1068, 538: 1068, 1068, 1068, 1068, 545: 1068, 1068, 548: 1068, 1068, 1068, 552: 1068, 1068, 557: 1068, 1068, 564: 1068, 578: 1068, 583: 1068, 589: 1068, 591: 1068, 1068, 624: 1068, 631: 1068, 633: 1068, 1068, 1068, 1068, 641: 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 662: 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 702: 1068, 1068, 1068, 1068, 716: 1068, 721: 1068, 835: 1068, 1068, 842: 1068, 1068, 1068, 846: 1068, 855: 1068, 1068, 1068}, - {2: 1067, 1067, 1067, 1067, 1067, 1067, 1067, 10: 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 58: 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 536: 1067, 538: 1067, 1067, 1067, 1067, 545: 1067, 1067, 548: 1067, 1067, 1067, 552: 1067, 1067, 557: 1067, 1067, 564: 1067, 578: 1067, 583: 1067, 589: 1067, 591: 1067, 1067, 624: 1067, 631: 1067, 633: 1067, 1067, 1067, 1067, 641: 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 662: 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 702: 1067, 1067, 1067, 1067, 716: 1067, 721: 1067, 835: 1067, 1067, 842: 1067, 1067, 1067, 846: 1067, 855: 1067, 1067, 1067}, - {2: 1066, 1066, 1066, 1066, 1066, 1066, 1066, 10: 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 58: 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 536: 1066, 538: 1066, 1066, 1066, 1066, 545: 1066, 1066, 548: 1066, 1066, 1066, 552: 1066, 1066, 557: 1066, 1066, 564: 1066, 578: 1066, 583: 1066, 589: 1066, 591: 1066, 1066, 624: 1066, 631: 1066, 633: 1066, 1066, 1066, 1066, 641: 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 662: 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 702: 1066, 1066, 1066, 1066, 716: 1066, 721: 1066, 835: 1066, 1066, 842: 1066, 1066, 1066, 846: 1066, 855: 1066, 1066, 1066}, - {2: 1065, 1065, 1065, 1065, 1065, 1065, 1065, 10: 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 58: 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 536: 1065, 538: 1065, 1065, 1065, 1065, 545: 1065, 1065, 548: 1065, 1065, 1065, 552: 1065, 1065, 557: 1065, 1065, 564: 1065, 578: 1065, 583: 1065, 589: 1065, 591: 1065, 1065, 624: 1065, 631: 1065, 633: 1065, 1065, 1065, 1065, 641: 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 662: 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 702: 1065, 1065, 1065, 1065, 716: 1065, 721: 1065, 835: 1065, 1065, 842: 1065, 1065, 1065, 846: 1065, 855: 1065, 1065, 1065}, + {1203, 1203, 9: 1203, 57: 1203, 535: 1203, 537: 1203, 544: 1203, 547: 1203, 555: 1203, 1203, 559: 1203, 1203, 563: 1203, 1203, 568: 1203, 570: 1203}, + {542: 6568}, + {536: 4097, 1310: 6569}, + {1201, 1201, 9: 1201, 57: 1201, 535: 1201, 537: 1201, 544: 1201, 547: 1201, 555: 1201, 1201, 559: 1201, 1201, 563: 1201, 1201, 568: 1201, 570: 1201}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 4096, 3072, 3073, 3071, 1033: 6567, 1308: 6571}, // 3695 - {2: 1063, 1063, 1063, 1063, 1063, 1063, 1063, 10: 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 58: 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 6561, 6567, 6568, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 536: 1063, 538: 1063, 1063, 1063, 1063, 545: 1063, 1063, 548: 1063, 1063, 1063, 552: 1063, 1063, 557: 1063, 1063, 564: 1063, 578: 6564, 583: 1063, 589: 1063, 591: 1063, 1063, 624: 1063, 631: 1063, 633: 1063, 1063, 1063, 1063, 641: 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 662: 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 702: 1063, 1063, 1063, 1063, 716: 1063, 721: 4196, 835: 4194, 4195, 842: 5983, 5982, 5981, 846: 5978, 855: 6560, 6563, 6559, 891: 6479, 893: 6557, 940: 6558, 975: 6556, 1272: 6569, 6562}, - {2: 1061, 1061, 1061, 1061, 1061, 1061, 1061, 10: 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 58: 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 536: 1061, 538: 1061, 1061, 1061, 1061, 545: 1061, 1061, 548: 1061, 1061, 1061, 552: 1061, 1061, 557: 1061, 1061, 564: 1061, 578: 1061, 583: 1061, 589: 1061, 591: 1061, 1061, 624: 1061, 631: 1061, 633: 1061, 1061, 1061, 1061, 641: 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 662: 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 702: 1061, 1061, 1061, 1061, 716: 1061, 721: 1061, 835: 1061, 1061, 842: 1061, 1061, 1061, 846: 1061, 855: 1061, 1061, 1061}, - {2: 1057, 1057, 1057, 1057, 1057, 1057, 1057, 10: 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 58: 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 536: 1057, 538: 1057, 1057, 1057, 1057, 545: 1057, 1057, 548: 1057, 1057, 1057, 552: 1057, 1057, 557: 1057, 1057, 564: 1057, 578: 1057, 583: 1057, 589: 1057, 591: 1057, 1057, 624: 1057, 631: 1057, 633: 1057, 1057, 1057, 1057, 641: 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 662: 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 702: 1057, 1057, 1057, 1057, 716: 1057, 721: 1057, 835: 1057, 1057, 842: 1057, 1057, 1057, 846: 1057, 855: 1057, 1057, 1057}, - {2: 1056, 1056, 1056, 1056, 1056, 1056, 1056, 10: 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 58: 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 536: 1056, 538: 1056, 1056, 1056, 1056, 545: 1056, 1056, 548: 1056, 1056, 1056, 552: 1056, 1056, 557: 1056, 1056, 564: 1056, 578: 1056, 583: 1056, 589: 1056, 591: 1056, 1056, 624: 1056, 631: 1056, 633: 1056, 1056, 1056, 1056, 641: 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 662: 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 702: 1056, 1056, 1056, 1056, 716: 1056, 721: 1056, 835: 1056, 1056, 842: 1056, 1056, 1056, 846: 1056, 855: 1056, 1056, 1056}, - {2: 1062, 1062, 1062, 1062, 1062, 1062, 1062, 10: 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 58: 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 536: 1062, 538: 1062, 1062, 1062, 1062, 545: 1062, 1062, 548: 1062, 1062, 1062, 552: 1062, 1062, 557: 1062, 1062, 564: 1062, 578: 1062, 583: 1062, 589: 1062, 591: 1062, 1062, 624: 1062, 631: 1062, 633: 1062, 1062, 1062, 1062, 641: 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 662: 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 702: 1062, 1062, 1062, 1062, 716: 1062, 721: 1062, 835: 1062, 1062, 842: 1062, 1062, 1062, 846: 1062, 855: 1062, 1062, 1062}, + {1202, 1202, 9: 1202, 57: 1202, 535: 1202, 537: 1202, 544: 1202, 547: 1202, 555: 1202, 1202, 559: 1202, 1202, 563: 1202, 1202, 568: 1202, 570: 1202}, + {2145, 2145, 57: 2145, 535: 2145, 537: 2145, 544: 2145, 547: 2145, 555: 2145, 2145, 559: 2145, 2145, 563: 2145, 2145, 566: 2145, 568: 2145, 2145, 2145, 572: 3772, 3770, 3771, 3769, 3767, 2145, 580: 2145, 806: 3768, 3766}, + {1232, 1232, 57: 1232, 535: 1232, 537: 1232, 544: 1232, 547: 1232, 555: 1232, 1232, 559: 1232, 1232, 563: 1232, 1232, 568: 1232, 570: 1232, 577: 1232}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 565: 6590, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 6591, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 6589, 1179: 6592, 1366: 6593, 1453: 6594}, + {2: 1081, 1081, 1081, 1081, 1081, 1081, 1081, 10: 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 58: 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 536: 1081, 538: 1081, 1081, 1081, 1081, 545: 1081, 1081, 548: 1081, 1081, 1081, 552: 1081, 1081, 557: 1081, 1081, 565: 1081, 567: 1081, 579: 1081, 584: 1081, 591: 1081, 1081, 630: 1081, 1081, 633: 1081, 1081, 1081, 1081, 641: 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 662: 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 716: 1081, 721: 1081, 834: 1081, 1081, 839: 1081, 841: 1081, 844: 1081, 846: 1081, 855: 1081, 1081, 1081}, // 3700 - {2148, 2148, 3316, 3471, 3280, 3156, 3196, 3318, 3080, 2148, 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 2148, 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 2148, 537: 2148, 6588, 542: 6587, 544: 2148, 547: 2148, 555: 2148, 2148, 559: 2148, 562: 2148, 2148, 565: 2148, 2148, 2148, 2148, 2148, 571: 3767, 3765, 3766, 3764, 3762, 2148, 2148, 777: 6586, 3067, 3068, 3066, 806: 3763, 3761, 1365: 6585, 6584}, - {2152, 2152, 9: 2152, 57: 2152, 535: 2152, 537: 2152, 544: 2152, 547: 2152, 555: 2152, 2152, 559: 2152, 562: 2152, 2152, 565: 2152, 2152, 2152, 2152, 2152, 576: 2152, 2152}, - {1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 537: 1489, 1489, 1489, 541: 1489, 1489, 1489, 1489, 547: 1489, 1489, 1489, 1489, 555: 1489, 1489, 559: 1489, 561: 1489, 1489, 1489, 565: 1489, 1489, 1489, 1489, 1489, 571: 1489, 1489, 1489, 1489, 1489, 1489, 1489, 584: 1489, 589: 1489, 611: 1489, 613: 1489, 615: 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 625: 1489, 1489, 1489, 1489, 1489, 1489, 632: 1489, 637: 1489, 1489, 1489, 1489, 707: 1489, 720: 6579, 723: 1489, 1489}, - {2142, 2142, 9: 2142, 57: 2142, 535: 2142, 537: 2142, 544: 2142, 547: 2142, 555: 2142, 2142, 559: 2142, 562: 2142, 2142, 565: 2142, 2142, 2142, 2142, 2142, 576: 2142, 2142}, - {1055, 1055, 9: 6577, 57: 1055, 535: 1055, 537: 1055, 544: 1055, 547: 1055, 555: 1055, 1055, 559: 1055, 562: 1055, 1055, 565: 1055, 1055, 1055, 1055, 1055, 576: 1055, 1055}, + {2: 1080, 1080, 1080, 1080, 1080, 1080, 1080, 10: 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 58: 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 536: 1080, 538: 1080, 1080, 1080, 1080, 545: 1080, 1080, 548: 1080, 1080, 1080, 552: 1080, 1080, 557: 1080, 1080, 565: 1080, 567: 1080, 579: 1080, 584: 1080, 591: 1080, 1080, 630: 1080, 1080, 633: 1080, 1080, 1080, 1080, 641: 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 662: 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 716: 1080, 721: 1080, 834: 1080, 1080, 839: 1080, 841: 1080, 844: 1080, 846: 1080, 855: 1080, 1080, 1080}, + {2: 1079, 1079, 1079, 1079, 1079, 1079, 1079, 10: 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 58: 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 536: 1079, 538: 1079, 1079, 1079, 1079, 545: 1079, 1079, 548: 1079, 1079, 1079, 552: 1079, 1079, 557: 1079, 1079, 565: 1079, 567: 1079, 579: 1079, 584: 1079, 591: 1079, 1079, 630: 1079, 1079, 633: 1079, 1079, 1079, 1079, 641: 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 662: 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 716: 1079, 721: 1079, 834: 1079, 1079, 839: 1079, 841: 1079, 844: 1079, 846: 1079, 855: 1079, 1079, 1079}, + {2: 1078, 1078, 1078, 1078, 1078, 1078, 1078, 10: 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 58: 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 536: 1078, 538: 1078, 1078, 1078, 1078, 545: 1078, 1078, 548: 1078, 1078, 1078, 552: 1078, 1078, 557: 1078, 1078, 565: 1078, 567: 1078, 579: 1078, 584: 1078, 591: 1078, 1078, 630: 1078, 1078, 633: 1078, 1078, 1078, 1078, 641: 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 662: 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 716: 1078, 721: 1078, 834: 1078, 1078, 839: 1078, 841: 1078, 844: 1078, 846: 1078, 855: 1078, 1078, 1078}, + {2: 1077, 1077, 1077, 1077, 1077, 1077, 1077, 10: 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 58: 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 536: 1077, 538: 1077, 1077, 1077, 1077, 545: 1077, 1077, 548: 1077, 1077, 1077, 552: 1077, 1077, 557: 1077, 1077, 565: 1077, 567: 1077, 579: 1077, 584: 1077, 591: 1077, 1077, 630: 1077, 1077, 633: 1077, 1077, 1077, 1077, 641: 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 662: 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 716: 1077, 721: 1077, 834: 1077, 1077, 839: 1077, 841: 1077, 844: 1077, 846: 1077, 855: 1077, 1077, 1077}, + {2: 1076, 1076, 1076, 1076, 1076, 1076, 1076, 10: 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 58: 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 536: 1076, 538: 1076, 1076, 1076, 1076, 545: 1076, 1076, 548: 1076, 1076, 1076, 552: 1076, 1076, 557: 1076, 1076, 565: 1076, 567: 1076, 579: 1076, 584: 1076, 591: 1076, 1076, 630: 1076, 1076, 633: 1076, 1076, 1076, 1076, 641: 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 662: 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 716: 1076, 721: 1076, 834: 1076, 1076, 839: 1076, 841: 1076, 844: 1076, 846: 1076, 855: 1076, 1076, 1076}, // 3705 - {2137, 2137, 57: 2137, 535: 2137, 537: 2137, 544: 2137, 547: 2137, 555: 2137, 2137, 559: 2137, 562: 2137, 2137, 565: 2137, 2137, 2137, 2137, 2137, 576: 2137, 6542, 1193: 6576}, - {1225, 1225, 57: 1225, 535: 1225, 537: 1225, 544: 1225, 547: 1225, 555: 1225, 1225, 559: 1225, 562: 1225, 1225, 565: 1225, 1225, 1225, 1225, 1225, 576: 1225}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 589: 6571, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 6572, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 6570, 1177: 6578}, - {2141, 2141, 9: 2141, 57: 2141, 535: 2141, 537: 2141, 544: 2141, 547: 2141, 555: 2141, 2141, 559: 2141, 562: 2141, 2141, 565: 2141, 2141, 2141, 2141, 2141, 576: 2141, 2141}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 589: 6580, 777: 6581, 3067, 3068, 3066}, + {2: 1075, 1075, 1075, 1075, 1075, 1075, 1075, 10: 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 58: 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 536: 1075, 538: 1075, 1075, 1075, 1075, 545: 1075, 1075, 548: 1075, 1075, 1075, 552: 1075, 1075, 557: 1075, 1075, 565: 1075, 567: 1075, 579: 1075, 584: 1075, 591: 1075, 1075, 630: 1075, 1075, 633: 1075, 1075, 1075, 1075, 641: 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 662: 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 716: 1075, 721: 1075, 834: 1075, 1075, 839: 1075, 841: 1075, 844: 1075, 846: 1075, 855: 1075, 1075, 1075}, + {2: 1074, 1074, 1074, 1074, 1074, 1074, 1074, 10: 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 58: 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 536: 1074, 538: 1074, 1074, 1074, 1074, 545: 1074, 1074, 548: 1074, 1074, 1074, 552: 1074, 1074, 557: 1074, 1074, 565: 1074, 567: 1074, 579: 1074, 584: 1074, 591: 1074, 1074, 630: 1074, 1074, 633: 1074, 1074, 1074, 1074, 641: 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 662: 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 716: 1074, 721: 1074, 834: 1074, 1074, 839: 1074, 841: 1074, 844: 1074, 846: 1074, 855: 1074, 1074, 1074}, + {2: 1073, 1073, 1073, 1073, 1073, 1073, 1073, 10: 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 58: 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 536: 1073, 538: 1073, 1073, 1073, 1073, 545: 1073, 1073, 548: 1073, 1073, 1073, 552: 1073, 1073, 557: 1073, 1073, 565: 1073, 567: 1073, 579: 1073, 584: 1073, 591: 1073, 1073, 630: 1073, 1073, 633: 1073, 1073, 1073, 1073, 641: 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 662: 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 716: 1073, 721: 1073, 834: 1073, 1073, 839: 1073, 841: 1073, 844: 1073, 846: 1073, 855: 1073, 1073, 1073}, + {2: 1071, 1071, 1071, 1071, 1071, 1071, 1071, 10: 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 58: 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 6580, 6586, 6587, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 536: 1071, 538: 1071, 1071, 1071, 1071, 545: 1071, 1071, 548: 1071, 1071, 1071, 552: 1071, 1071, 557: 1071, 1071, 565: 1071, 567: 1071, 579: 6583, 584: 1071, 591: 1071, 1071, 630: 1071, 1071, 633: 1071, 1071, 1071, 1071, 641: 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 662: 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 716: 1071, 721: 4204, 834: 4202, 4203, 839: 6003, 841: 6002, 844: 6001, 846: 5998, 855: 6579, 6582, 6578, 891: 6498, 893: 6576, 942: 6577, 949: 6575, 1271: 6588, 6581}, + {2: 1069, 1069, 1069, 1069, 1069, 1069, 1069, 10: 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 58: 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 536: 1069, 538: 1069, 1069, 1069, 1069, 545: 1069, 1069, 548: 1069, 1069, 1069, 552: 1069, 1069, 557: 1069, 1069, 565: 1069, 567: 1069, 579: 1069, 584: 1069, 591: 1069, 1069, 630: 1069, 1069, 633: 1069, 1069, 1069, 1069, 641: 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 662: 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 716: 1069, 721: 1069, 834: 1069, 1069, 839: 1069, 841: 1069, 844: 1069, 846: 1069, 855: 1069, 1069, 1069}, // 3710 - {2151, 2151, 9: 2151, 57: 2151, 535: 2151, 537: 2151, 544: 2151, 547: 2151, 555: 2151, 2151, 559: 2151, 562: 2151, 2151, 565: 2151, 2151, 2151, 2151, 2151, 576: 2151, 2151}, - {1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 4499, 1488, 1488, 1488, 541: 1488, 1488, 1488, 1488, 547: 1488, 1488, 1488, 1488, 555: 1488, 1488, 559: 1488, 561: 1488, 1488, 1488, 565: 1488, 1488, 1488, 1488, 1488, 571: 1488, 1488, 1488, 1488, 1488, 1488, 1488, 584: 1488, 589: 1488, 611: 1488, 613: 1488, 615: 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 625: 1488, 1488, 1488, 1488, 1488, 1488, 632: 1488, 637: 1488, 1488, 1488, 1488, 707: 1488, 720: 6582, 723: 1488, 1488}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 589: 6583, 777: 3929, 3067, 3068, 3066}, - {2150, 2150, 9: 2150, 57: 2150, 535: 2150, 537: 2150, 544: 2150, 547: 2150, 555: 2150, 2150, 559: 2150, 562: 2150, 2150, 565: 2150, 2150, 2150, 2150, 2150, 576: 2150, 2150}, - {2149, 2149, 9: 2149, 57: 2149, 535: 2149, 537: 2149, 544: 2149, 547: 2149, 555: 2149, 2149, 559: 2149, 562: 2149, 2149, 565: 2149, 2149, 2149, 2149, 2149, 576: 2149, 2149}, + {2: 1065, 1065, 1065, 1065, 1065, 1065, 1065, 10: 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 58: 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 536: 1065, 538: 1065, 1065, 1065, 1065, 545: 1065, 1065, 548: 1065, 1065, 1065, 552: 1065, 1065, 557: 1065, 1065, 565: 1065, 567: 1065, 579: 1065, 584: 1065, 591: 1065, 1065, 630: 1065, 1065, 633: 1065, 1065, 1065, 1065, 641: 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 662: 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 716: 1065, 721: 1065, 834: 1065, 1065, 839: 1065, 841: 1065, 844: 1065, 846: 1065, 855: 1065, 1065, 1065}, + {2: 1064, 1064, 1064, 1064, 1064, 1064, 1064, 10: 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 58: 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 536: 1064, 538: 1064, 1064, 1064, 1064, 545: 1064, 1064, 548: 1064, 1064, 1064, 552: 1064, 1064, 557: 1064, 1064, 565: 1064, 567: 1064, 579: 1064, 584: 1064, 591: 1064, 1064, 630: 1064, 1064, 633: 1064, 1064, 1064, 1064, 641: 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 662: 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 716: 1064, 721: 1064, 834: 1064, 1064, 839: 1064, 841: 1064, 844: 1064, 846: 1064, 855: 1064, 1064, 1064}, + {2: 1070, 1070, 1070, 1070, 1070, 1070, 1070, 10: 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 58: 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 536: 1070, 538: 1070, 1070, 1070, 1070, 545: 1070, 1070, 548: 1070, 1070, 1070, 552: 1070, 1070, 557: 1070, 1070, 565: 1070, 567: 1070, 579: 1070, 584: 1070, 591: 1070, 1070, 630: 1070, 1070, 633: 1070, 1070, 1070, 1070, 641: 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 662: 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 716: 1070, 721: 1070, 834: 1070, 1070, 839: 1070, 841: 1070, 844: 1070, 846: 1070, 855: 1070, 1070, 1070}, + {2157, 2157, 3321, 3476, 3285, 3160, 3201, 3323, 3085, 2157, 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 2157, 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 2157, 537: 2157, 6607, 542: 6606, 544: 2157, 547: 2157, 555: 2157, 2157, 559: 2157, 2157, 563: 2157, 2157, 566: 2157, 568: 2157, 2157, 2157, 572: 3772, 3770, 3771, 3769, 3767, 2157, 2157, 777: 6605, 3072, 3073, 3071, 806: 3768, 3766, 1363: 6604, 6603}, + {2161, 2161, 9: 2161, 57: 2161, 535: 2161, 537: 2161, 544: 2161, 547: 2161, 555: 2161, 2161, 559: 2161, 2161, 563: 2161, 2161, 566: 2161, 568: 2161, 2161, 2161, 577: 2161, 2161}, // 3715 - {2147, 2147, 9: 2147, 57: 2147, 535: 2147, 537: 2147, 544: 2147, 547: 2147, 555: 2147, 2147, 559: 2147, 562: 2147, 2147, 565: 2147, 2147, 2147, 2147, 2147, 576: 2147, 2147}, - {2146, 2146, 9: 2146, 57: 2146, 535: 2146, 537: 2146, 544: 2146, 547: 2146, 555: 2146, 2146, 559: 2146, 562: 2146, 2146, 565: 2146, 2146, 2146, 2146, 2146, 576: 2146, 2146}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 538: 6590, 777: 6589, 3067, 3068, 3066}, - {2144, 2144, 9: 2144, 57: 2144, 535: 2144, 537: 2144, 544: 2144, 547: 2144, 555: 2144, 2144, 559: 2144, 562: 2144, 2144, 565: 2144, 2144, 2144, 2144, 2144, 576: 2144, 2144}, - {2145, 2145, 9: 2145, 57: 2145, 535: 2145, 537: 2145, 544: 2145, 547: 2145, 555: 2145, 2145, 559: 2145, 562: 2145, 2145, 565: 2145, 2145, 2145, 2145, 2145, 576: 2145, 2145}, + {1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 537: 1498, 1498, 1498, 541: 1498, 1498, 1498, 1498, 547: 1498, 1498, 1498, 1498, 555: 1498, 1498, 559: 1498, 1498, 562: 1498, 1498, 1498, 1498, 1498, 568: 1498, 1498, 1498, 572: 1498, 1498, 1498, 1498, 1498, 1498, 1498, 585: 1498, 611: 1498, 614: 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 632: 1498, 637: 1498, 1498, 1498, 1498, 707: 1498, 720: 6598, 723: 1498, 1498}, + {2151, 2151, 9: 2151, 57: 2151, 535: 2151, 537: 2151, 544: 2151, 547: 2151, 555: 2151, 2151, 559: 2151, 2151, 563: 2151, 2151, 566: 2151, 568: 2151, 2151, 2151, 577: 2151, 2151}, + {1063, 1063, 9: 6596, 57: 1063, 535: 1063, 537: 1063, 544: 1063, 547: 1063, 555: 1063, 1063, 559: 1063, 1063, 563: 1063, 1063, 566: 1063, 568: 1063, 1063, 1063, 577: 1063, 1063}, + {2146, 2146, 57: 2146, 535: 2146, 537: 2146, 544: 2146, 547: 2146, 555: 2146, 2146, 559: 2146, 2146, 563: 2146, 2146, 566: 2146, 568: 2146, 2146, 2146, 577: 2146, 6561, 1195: 6595}, + {1233, 1233, 57: 1233, 535: 1233, 537: 1233, 544: 1233, 547: 1233, 555: 1233, 1233, 559: 1233, 1233, 563: 1233, 1233, 566: 1233, 568: 1233, 1233, 1233, 577: 1233}, // 3720 - {2143, 2143, 9: 2143, 57: 2143, 535: 2143, 537: 2143, 544: 2143, 547: 2143, 555: 2143, 2143, 559: 2143, 562: 2143, 2143, 565: 2143, 2143, 2143, 2143, 2143, 576: 2143, 2143}, - {1226, 1226}, - {1238, 1238}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 6606, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 6607, 3067, 3068, 3066}, - {86: 6599, 287: 6598}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 565: 6590, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 6591, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 6589, 1179: 6597}, + {2150, 2150, 9: 2150, 57: 2150, 535: 2150, 537: 2150, 544: 2150, 547: 2150, 555: 2150, 2150, 559: 2150, 2150, 563: 2150, 2150, 566: 2150, 568: 2150, 2150, 2150, 577: 2150, 2150}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 565: 6599, 777: 6600, 3072, 3073, 3071}, + {2160, 2160, 9: 2160, 57: 2160, 535: 2160, 537: 2160, 544: 2160, 547: 2160, 555: 2160, 2160, 559: 2160, 2160, 563: 2160, 2160, 566: 2160, 568: 2160, 2160, 2160, 577: 2160, 2160}, + {1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 4507, 1497, 1497, 1497, 541: 1497, 1497, 1497, 1497, 547: 1497, 1497, 1497, 1497, 555: 1497, 1497, 559: 1497, 1497, 562: 1497, 1497, 1497, 1497, 1497, 568: 1497, 1497, 1497, 572: 1497, 1497, 1497, 1497, 1497, 1497, 1497, 585: 1497, 611: 1497, 614: 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 632: 1497, 637: 1497, 1497, 1497, 1497, 707: 1497, 720: 6601, 723: 1497, 1497}, // 3725 - {1230, 1230}, - {903: 6597}, - {1229, 1229}, - {1232, 1232, 86: 6604}, - {287: 6600}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 565: 6602, 777: 3934, 3072, 3073, 3071}, + {2159, 2159, 9: 2159, 57: 2159, 535: 2159, 537: 2159, 544: 2159, 547: 2159, 555: 2159, 2159, 559: 2159, 2159, 563: 2159, 2159, 566: 2159, 568: 2159, 2159, 2159, 577: 2159, 2159}, + {2158, 2158, 9: 2158, 57: 2158, 535: 2158, 537: 2158, 544: 2158, 547: 2158, 555: 2158, 2158, 559: 2158, 2158, 563: 2158, 2158, 566: 2158, 568: 2158, 2158, 2158, 577: 2158, 2158}, + {2156, 2156, 9: 2156, 57: 2156, 535: 2156, 537: 2156, 544: 2156, 547: 2156, 555: 2156, 2156, 559: 2156, 2156, 563: 2156, 2156, 566: 2156, 568: 2156, 2156, 2156, 577: 2156, 2156}, + {2155, 2155, 9: 2155, 57: 2155, 535: 2155, 537: 2155, 544: 2155, 547: 2155, 555: 2155, 2155, 559: 2155, 2155, 563: 2155, 2155, 566: 2155, 568: 2155, 2155, 2155, 577: 2155, 2155}, // 3730 - {1231, 1231, 86: 6602, 903: 6601}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 538: 6609, 777: 6608, 3072, 3073, 3071}, + {2153, 2153, 9: 2153, 57: 2153, 535: 2153, 537: 2153, 544: 2153, 547: 2153, 555: 2153, 2153, 559: 2153, 2153, 563: 2153, 2153, 566: 2153, 568: 2153, 2153, 2153, 577: 2153, 2153}, + {2154, 2154, 9: 2154, 57: 2154, 535: 2154, 537: 2154, 544: 2154, 547: 2154, 555: 2154, 2154, 559: 2154, 2154, 563: 2154, 2154, 566: 2154, 568: 2154, 2154, 2154, 577: 2154, 2154}, + {2152, 2152, 9: 2152, 57: 2152, 535: 2152, 537: 2152, 544: 2152, 547: 2152, 555: 2152, 2152, 559: 2152, 2152, 563: 2152, 2152, 566: 2152, 568: 2152, 2152, 2152, 577: 2152, 2152}, {1234, 1234}, - {903: 6603}, - {1233, 1233}, - {903: 6605}, // 3735 - {1235, 1235}, - {1908, 1908, 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 6608, 3067, 3068, 3066}, - {1237, 1237}, - {1236, 1236}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 6610, 3067, 3068, 3066}, + {1246, 1246}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 6625, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 6626, 3072, 3073, 3071}, + {86: 6618, 288: 6617}, + {1238, 1238}, + {903: 6616}, // 3740 + {1237, 1237}, + {1240, 1240, 86: 6623}, + {288: 6619}, + {1239, 1239, 86: 6621, 903: 6620}, {1242, 1242}, - {1246, 1246, 547: 6612}, - {633: 3703, 782: 6614, 1495: 6613}, - {1245, 1245, 9: 6615}, - {1244, 1244, 9: 1244}, // 3745 - {633: 3703, 782: 6616}, - {1243, 1243, 9: 1243}, - {566: 6618}, - {538: 6620, 633: 3703, 782: 6621, 1429: 6619}, - {1249, 1249}, + {903: 6622}, + {1241, 1241}, + {903: 6624}, + {1243, 1243}, + {1917, 1917, 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 6627, 3072, 3073, 3071}, // 3750 - {1248, 1248}, - {1247, 1247}, - {2: 1563, 1563, 1563, 1563, 1563, 1563, 1563, 10: 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 58: 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 565: 6623, 1202: 6624}, - {2: 1562, 1562, 1562, 1562, 1562, 1562, 1562, 10: 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 58: 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 3949, 3067, 3068, 3066, 810: 6625}, + {1245, 1245}, + {1244, 1244}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 6629, 3072, 3073, 3071}, + {1250, 1250}, + {1254, 1254, 547: 6631}, // 3755 - {186: 1128, 536: 1128, 1128, 551: 6045, 1128, 560: 1128, 614: 1128, 701: 1128, 969: 6626}, - {186: 6634, 536: 6627, 2922, 552: 6635, 560: 6633, 614: 2920, 701: 2916, 781: 6632, 812: 6630, 2917, 2918, 2919, 2928, 818: 2926, 2925, 2924, 822: 3868, 6631, 6629, 1101: 6628, 1201: 6636}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 2621, 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 536: 2923, 2922, 552: 2921, 614: 2920, 701: 2916, 777: 4046, 3067, 3068, 3066, 6491, 812: 3869, 2917, 2918, 2919, 2928, 818: 2926, 2925, 2924, 822: 3868, 3871, 3870, 827: 4047, 912: 5645, 1129: 6649}, - {536: 3915, 944: 6646, 1099: 6645}, - {1555, 1555, 535: 1555, 547: 1555}, + {633: 3708, 782: 6633, 1495: 6632}, + {1253, 1253, 9: 6634}, + {1252, 1252, 9: 1252}, + {633: 3708, 782: 6635}, + {1251, 1251, 9: 1251}, // 3760 - {1554, 1554, 535: 1554, 544: 1021, 547: 1554, 555: 1021, 1021}, - {1553, 1553, 535: 1553, 547: 1553}, - {1552, 1552, 535: 1552, 544: 1020, 547: 1552, 555: 1020, 1020, 559: 3881, 562: 3880, 569: 3879, 848: 3882, 3883}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 4046, 3067, 3068, 3066, 827: 6638, 1344: 6637}, - {536: 1550}, + {566: 6637}, + {538: 6639, 633: 3708, 782: 6640, 1428: 6638}, + {1257, 1257}, + {1256, 1256}, + {1255, 1255}, // 3765 - {536: 1549, 644: 3914, 1019: 3913, 1100: 3912}, - {1535, 1535, 547: 1535}, - {1551, 1551, 9: 6641, 535: 1551, 547: 1551}, - {561: 6107, 722: 6108, 898: 6639}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3921, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 3917, 899: 6640}, + {2: 1272, 1272, 1272, 1272, 1272, 1272, 1272, 10: 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 58: 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 564: 1272, 1272, 839: 6003, 841: 6002, 844: 6001, 942: 6004, 997: 6642}, + {2: 1572, 1572, 1572, 1572, 1572, 1572, 1572, 10: 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 58: 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 564: 6643, 1572, 1203: 6644}, + {2: 1571, 1571, 1571, 1571, 1571, 1571, 1571, 10: 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 58: 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 565: 1571}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 565: 3955, 777: 3954, 3072, 3073, 3071, 810: 6645}, + {187: 1136, 536: 1136, 1136, 551: 6065, 1136, 561: 1136, 613: 1136, 660: 1136, 971: 6646}, // 3770 - {1539, 1539, 9: 1539, 535: 1539, 547: 1539}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 4046, 3067, 3068, 3066, 827: 6642}, - {561: 6107, 722: 6108, 898: 6643}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3921, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 3917, 899: 6644}, - {1538, 1538, 9: 1538, 535: 1538, 547: 1538}, + {187: 6654, 536: 6647, 2928, 552: 6655, 561: 6653, 613: 2926, 660: 2922, 781: 6652, 812: 6650, 2923, 2924, 2925, 2934, 2932, 2931, 2930, 821: 3873, 6651, 6649, 1104: 6648, 1202: 6656}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 2627, 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 536: 2929, 2928, 552: 2927, 613: 2926, 660: 2922, 777: 4054, 3072, 3073, 3071, 6510, 812: 3874, 2923, 2924, 2925, 2934, 2932, 2931, 2930, 821: 3873, 3876, 3875, 828: 4055, 912: 5654, 1132: 6669}, + {536: 3920, 946: 6666, 1102: 6665}, + {1564, 1564, 535: 1564, 547: 1564}, + {1563, 1563, 535: 1563, 544: 1029, 547: 1563, 555: 1029, 1029}, // 3775 - {1556, 1556, 9: 6647, 535: 1556, 547: 1556}, - {1548, 1548, 9: 1548, 535: 1548, 547: 1548}, - {536: 3915, 944: 6648}, - {1547, 1547, 9: 1547, 535: 1547, 547: 1547}, - {57: 6650}, + {1562, 1562, 535: 1562, 547: 1562}, + {1561, 1561, 535: 1561, 544: 1028, 547: 1561, 555: 1028, 1028, 559: 3886, 3885, 570: 3884, 847: 3887, 3888}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 4054, 3072, 3073, 3071, 828: 6658, 1342: 6657}, + {536: 1559}, + {536: 1558, 644: 3919, 1021: 3918, 1103: 3917}, // 3780 - {186: 6634, 536: 2923, 2922, 552: 6635, 614: 2920, 701: 2916, 781: 6655, 812: 6653, 2917, 2918, 2919, 2928, 818: 2926, 2925, 2924, 822: 3868, 6654, 6652, 1101: 6651}, - {536: 3915, 944: 6646, 1099: 6656}, - {1560, 1560, 535: 1560, 547: 1560}, - {1559, 1559, 535: 1559, 544: 1021, 547: 1559, 555: 1021, 1021}, - {1558, 1558, 535: 1558, 547: 1558}, + {1544, 1544, 547: 1544}, + {1560, 1560, 9: 6661, 535: 1560, 547: 1560}, + {562: 6127, 722: 6128, 898: 6659}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3926, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 3922, 899: 6660}, + {1548, 1548, 9: 1548, 535: 1548, 547: 1548}, // 3785 - {1557, 1557, 535: 1557, 544: 1020, 547: 1557, 555: 1020, 1020, 559: 3881, 562: 3880, 569: 3879, 848: 3882, 3883}, - {1561, 1561, 9: 6647, 535: 1561, 547: 1561}, - {2: 1263, 1263, 1263, 1263, 1263, 1263, 1263, 10: 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 58: 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 554: 1263, 565: 1263, 842: 5983, 5982, 5981, 940: 5984, 996: 6658}, - {2: 2128, 2128, 2128, 2128, 2128, 2128, 2128, 10: 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 58: 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 554: 4697, 565: 2128, 964: 6659}, - {2: 1563, 1563, 1563, 1563, 1563, 1563, 1563, 10: 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 58: 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 565: 6623, 1202: 6660}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 4054, 3072, 3073, 3071, 828: 6662}, + {562: 6127, 722: 6128, 898: 6663}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3926, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 3922, 899: 6664}, + {1547, 1547, 9: 1547, 535: 1547, 547: 1547}, + {1565, 1565, 9: 6667, 535: 1565, 547: 1565}, // 3790 - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 3949, 3067, 3068, 3066, 810: 6661}, - {186: 1128, 536: 1128, 1128, 551: 6045, 1128, 560: 1128, 614: 1128, 701: 1128, 969: 6662}, - {186: 6634, 536: 6627, 2922, 552: 6635, 560: 6633, 614: 2920, 701: 2916, 781: 6632, 812: 6630, 2917, 2918, 2919, 2928, 818: 2926, 2925, 2924, 822: 3868, 6631, 6629, 1101: 6628, 1201: 6663}, - {1537, 1537, 535: 6665, 547: 1537, 1405: 6664}, - {1564, 1564, 547: 1564}, + {1557, 1557, 9: 1557, 535: 1557, 547: 1557}, + {536: 3920, 946: 6668}, + {1556, 1556, 9: 1556, 535: 1556, 547: 1556}, + {57: 6670}, + {187: 6654, 536: 2929, 2928, 552: 6655, 613: 2926, 660: 2922, 781: 6675, 812: 6673, 2923, 2924, 2925, 2934, 2932, 2931, 2930, 821: 3873, 6674, 6672, 1104: 6671}, // 3795 - {304: 6666}, - {706: 6667}, - {719: 6668}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 4046, 3067, 3068, 3066, 827: 6096, 1002: 6097, 1033: 6669}, - {1536, 1536, 9: 6099, 547: 1536}, + {536: 3920, 946: 6666, 1102: 6676}, + {1569, 1569, 535: 1569, 547: 1569}, + {1568, 1568, 535: 1568, 544: 1029, 547: 1568, 555: 1029, 1029}, + {1567, 1567, 535: 1567, 547: 1567}, + {1566, 1566, 535: 1566, 544: 1028, 547: 1566, 555: 1028, 1028, 559: 3886, 3885, 570: 3884, 847: 3887, 3888}, // 3800 - {1568, 1568, 536: 6678, 720: 2103}, - {1569, 1569}, - {720: 6673}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 6674, 3067, 3068, 3066}, - {1567, 1567, 536: 6675}, + {1570, 1570, 9: 6667, 535: 1570, 547: 1570}, + {2: 1272, 1272, 1272, 1272, 1272, 1272, 1272, 10: 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 58: 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 554: 1272, 564: 1272, 1272, 839: 6003, 841: 6002, 844: 6001, 942: 6004, 997: 6678}, + {2: 2137, 2137, 2137, 2137, 2137, 2137, 2137, 10: 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 58: 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 554: 4706, 564: 2137, 2137, 966: 6679}, + {2: 1572, 1572, 1572, 1572, 1572, 1572, 1572, 10: 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 58: 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 564: 6643, 1572, 1203: 6680}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 565: 3955, 777: 3954, 3072, 3073, 3071, 810: 6681}, // 3805 - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 2197, 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 3864, 869: 4367, 927: 6676}, - {57: 6677}, - {1565, 1565}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 2197, 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 3864, 869: 4367, 927: 6679}, - {57: 6680}, + {187: 1136, 536: 1136, 1136, 551: 6065, 1136, 561: 1136, 613: 1136, 660: 1136, 971: 6682}, + {187: 6654, 536: 6647, 2928, 552: 6655, 561: 6653, 613: 2926, 660: 2922, 781: 6652, 812: 6650, 2923, 2924, 2925, 2934, 2932, 2931, 2930, 821: 3873, 6651, 6649, 1104: 6648, 1202: 6683}, + {1546, 1546, 535: 6685, 547: 1546, 1404: 6684}, + {1573, 1573, 547: 1573}, + {305: 6686}, // 3810 - {1566, 1566}, - {2: 2351, 2351, 2351, 2351, 2351, 2351, 2351, 10: 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 58: 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 2351, 540: 2351, 543: 2351, 558: 2351, 560: 2351, 583: 2351, 589: 2351, 714: 2351}, - {566: 6778}, - {566: 6692}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 589: 6687, 777: 5976, 3067, 3068, 3066, 913: 6689, 1354: 6688}, + {706: 6687}, + {719: 6688}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 4054, 3072, 3073, 3071, 828: 6116, 1004: 6117, 1034: 6689}, + {1545, 1545, 9: 6119, 547: 1545}, + {1577, 1577, 536: 6698, 720: 2112}, // 3815 - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 3949, 3067, 3068, 3066, 810: 3950, 890: 6686}, - {9: 3952, 566: 2282, 717: 2282}, - {566: 2284, 717: 2284}, - {9: 6690, 566: 2283, 717: 2283}, - {9: 2281, 566: 2281, 717: 2281}, + {1578, 1578}, + {720: 6693}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 6694, 3072, 3073, 3071}, + {1576, 1576, 536: 6695}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 2206, 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 3869, 869: 4375, 929: 6696}, // 3820 - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 5976, 3067, 3068, 3066, 913: 6691}, - {9: 2280, 566: 2280, 717: 2280}, - {538: 6693}, - {2279, 2279, 17: 2279, 58: 2279, 60: 2279, 2279, 2279, 2279, 2279, 2279, 2279, 2279, 2279, 2279, 2279, 2279, 2279, 2279, 2279, 2279, 2279, 2279, 2279, 2279, 2279, 2279, 2279, 2279, 535: 2279, 718: 2279, 955: 6694}, - {2285, 2285, 17: 6721, 58: 6697, 60: 6717, 6710, 6700, 6696, 6704, 6708, 6720, 6703, 6709, 6707, 6705, 6723, 6727, 6718, 6711, 6699, 6719, 6724, 6698, 6701, 6725, 6702, 6706, 6726, 535: 6712, 718: 6722, 951: 6714, 6713, 6716, 6695, 956: 6715}, + {57: 6697}, + {1574, 1574}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 2206, 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 3869, 869: 4375, 929: 6699}, + {57: 6700}, + {1575, 1575}, // 3825 - {2278, 2278, 17: 2278, 58: 2278, 60: 2278, 2278, 2278, 2278, 2278, 2278, 2278, 2278, 2278, 2278, 2278, 2278, 2278, 2278, 2278, 2278, 2278, 2278, 2278, 2278, 2278, 2278, 2278, 2278, 535: 2278, 718: 2278}, - {561: 2277, 564: 2277}, - {561: 2276, 564: 2276}, - {561: 2275, 564: 2275, 634: 2275, 2275}, - {561: 2274, 564: 2274, 634: 2274, 2274}, + {2: 2357, 2357, 2357, 2357, 2357, 2357, 2357, 10: 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 58: 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 2357, 540: 2357, 543: 2357, 558: 2357, 561: 2357, 565: 2357, 584: 2357, 714: 2357}, + {566: 6798}, + {566: 6712}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 565: 6707, 777: 5996, 3072, 3073, 3071, 913: 6709, 1352: 6708}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 565: 3955, 777: 3954, 3072, 3073, 3071, 810: 3956, 889: 6706}, // 3830 - {561: 2273, 564: 2273, 634: 2273, 2273}, - {561: 2272, 564: 2272, 634: 2272, 2272}, - {561: 2271, 564: 2271, 634: 2271, 2271}, - {561: 2270, 564: 2270, 634: 2270, 2270}, - {561: 2269, 564: 2269, 634: 2269, 2269}, + {9: 3958, 566: 2288, 717: 2288}, + {566: 2290, 717: 2290}, + {9: 6710, 566: 2289, 717: 2289}, + {9: 2287, 566: 2287, 717: 2287}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 5996, 3072, 3073, 3071, 913: 6711}, // 3835 - {561: 2268, 564: 2268, 634: 2268, 2268}, - {538: 2267, 561: 2267}, - {538: 2266, 561: 2266}, - {538: 2265, 561: 2265}, - {538: 2264, 561: 2264}, + {9: 2286, 566: 2286, 717: 2286}, + {538: 6713}, + {2285, 2285, 17: 2285, 58: 2285, 60: 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 535: 2285, 718: 2285, 957: 6714}, + {2291, 2291, 17: 6741, 58: 6717, 60: 6737, 6730, 6720, 6716, 6724, 6728, 6740, 6723, 6729, 6727, 6725, 6743, 6747, 6738, 6731, 6719, 6739, 6744, 6718, 6721, 6745, 6722, 6726, 6746, 535: 6732, 718: 6742, 953: 6734, 6733, 6736, 6715, 958: 6735}, + {2284, 2284, 17: 2284, 58: 2284, 60: 2284, 2284, 2284, 2284, 2284, 2284, 2284, 2284, 2284, 2284, 2284, 2284, 2284, 2284, 2284, 2284, 2284, 2284, 2284, 2284, 2284, 2284, 2284, 2284, 535: 2284, 718: 2284}, // 3840 - {2: 2263, 2263, 2263, 2263, 2263, 2263, 2263, 10: 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 58: 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 538: 2263, 554: 2263, 557: 2263, 561: 2263}, - {2: 2262, 2262, 2262, 2262, 2262, 2262, 2262, 10: 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 58: 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 538: 2262, 554: 2262, 557: 2262, 561: 2262}, - {304: 6777}, - {561: 4610, 564: 2329, 808: 6775}, - {561: 4610, 564: 2329, 634: 2329, 2329, 808: 6773}, + {562: 2283, 567: 2283}, + {562: 2282, 567: 2282}, + {562: 2281, 567: 2281, 634: 2281, 2281}, + {562: 2280, 567: 2280, 634: 2280, 2280}, + {562: 2279, 567: 2279, 634: 2279, 2279}, // 3845 - {538: 2329, 561: 4610, 808: 6771}, - {2: 2329, 2329, 2329, 2329, 2329, 2329, 2329, 10: 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 58: 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 538: 2329, 554: 2329, 557: 2329, 561: 4610, 808: 6766}, - {538: 2329, 561: 4610, 564: 2329, 808: 6761}, - {538: 2329, 561: 4610, 564: 2329, 808: 6758}, - {561: 4610, 564: 2329, 808: 6753}, + {562: 2278, 567: 2278, 634: 2278, 2278}, + {562: 2277, 567: 2277, 634: 2277, 2277}, + {562: 2276, 567: 2276, 634: 2276, 2276}, + {562: 2275, 567: 2275, 634: 2275, 2275}, + {562: 2274, 567: 2274, 634: 2274, 2274}, // 3850 - {131: 2329, 154: 2329, 561: 4610, 564: 2329, 808: 6750}, - {237: 2329, 2329, 241: 2329, 561: 4610, 564: 2329, 634: 2329, 2329, 808: 6747}, - {237: 2329, 2329, 241: 2329, 561: 4610, 564: 2329, 634: 2329, 2329, 808: 6738}, - {538: 2329, 561: 4610, 808: 6736}, - {538: 2329, 561: 4610, 808: 6734}, + {538: 2273, 562: 2273}, + {538: 2272, 562: 2272}, + {538: 2271, 562: 2271}, + {538: 2270, 562: 2270}, + {2: 2269, 2269, 2269, 2269, 2269, 2269, 2269, 10: 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 58: 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 538: 2269, 554: 2269, 557: 2269, 562: 2269}, // 3855 - {538: 2329, 561: 4610, 808: 6732}, - {538: 2329, 561: 4610, 808: 6730}, - {538: 2329, 561: 4610, 808: 6728}, - {538: 6729}, - {2240, 2240, 17: 2240, 58: 2240, 60: 2240, 2240, 2240, 2240, 2240, 2240, 2240, 2240, 2240, 2240, 2240, 2240, 2240, 2240, 2240, 2240, 2240, 2240, 2240, 2240, 2240, 2240, 2240, 2240, 535: 2240, 718: 2240}, + {2: 2268, 2268, 2268, 2268, 2268, 2268, 2268, 10: 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 58: 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 2268, 538: 2268, 554: 2268, 557: 2268, 562: 2268}, + {305: 6797}, + {562: 4618, 567: 2335, 808: 6795}, + {562: 4618, 567: 2335, 634: 2335, 2335, 808: 6793}, + {538: 2335, 562: 4618, 808: 6791}, // 3860 - {538: 6731}, - {2241, 2241, 17: 2241, 58: 2241, 60: 2241, 2241, 2241, 2241, 2241, 2241, 2241, 2241, 2241, 2241, 2241, 2241, 2241, 2241, 2241, 2241, 2241, 2241, 2241, 2241, 2241, 2241, 2241, 2241, 535: 2241, 718: 2241}, - {538: 6733}, - {2242, 2242, 17: 2242, 58: 2242, 60: 2242, 2242, 2242, 2242, 2242, 2242, 2242, 2242, 2242, 2242, 2242, 2242, 2242, 2242, 2242, 2242, 2242, 2242, 2242, 2242, 2242, 2242, 2242, 2242, 535: 2242, 718: 2242}, - {538: 6735}, + {2: 2335, 2335, 2335, 2335, 2335, 2335, 2335, 10: 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 58: 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 538: 2335, 554: 2335, 557: 2335, 562: 4618, 808: 6786}, + {538: 2335, 562: 4618, 567: 2335, 808: 6781}, + {538: 2335, 562: 4618, 567: 2335, 808: 6778}, + {562: 4618, 567: 2335, 808: 6773}, + {131: 2335, 157: 2335, 562: 4618, 567: 2335, 808: 6770}, // 3865 - {2243, 2243, 17: 2243, 58: 2243, 60: 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 535: 2243, 718: 2243}, - {538: 6737}, - {2244, 2244, 17: 2244, 58: 2244, 60: 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 535: 2244, 718: 2244}, - {237: 6744, 6745, 241: 6746, 564: 3053, 634: 6742, 6743, 805: 6741, 1004: 6739, 1231: 6740}, - {2246, 2246, 17: 2246, 58: 2246, 60: 2246, 2246, 2246, 2246, 2246, 2246, 2246, 2246, 2246, 2246, 2246, 2246, 2246, 2246, 2246, 2246, 2246, 2246, 2246, 2246, 2246, 2246, 2246, 2246, 535: 2246, 718: 2246}, + {237: 2335, 2335, 241: 2335, 562: 4618, 567: 2335, 634: 2335, 2335, 808: 6767}, + {237: 2335, 2335, 241: 2335, 562: 4618, 567: 2335, 634: 2335, 2335, 808: 6758}, + {538: 2335, 562: 4618, 808: 6756}, + {538: 2335, 562: 4618, 808: 6754}, + {538: 2335, 562: 4618, 808: 6752}, // 3870 - {2245, 2245, 17: 2245, 58: 2245, 60: 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 535: 2245, 718: 2245}, - {2236, 2236, 9: 2236, 17: 2236, 58: 2236, 60: 2236, 2236, 2236, 2236, 2236, 2236, 2236, 2236, 2236, 2236, 2236, 2236, 2236, 2236, 2236, 2236, 2236, 2236, 2236, 2236, 2236, 2236, 2236, 2236, 110: 2236, 2236, 2236, 2236, 2236, 535: 2236, 718: 2236}, - {2235, 2235, 9: 2235, 17: 2235, 58: 2235, 60: 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 110: 2235, 2235, 2235, 2235, 2235, 535: 2235, 718: 2235}, - {2234, 2234, 9: 2234, 17: 2234, 58: 2234, 60: 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 110: 2234, 2234, 2234, 2234, 2234, 535: 2234, 718: 2234}, - {2233, 2233, 17: 2233, 58: 2233, 60: 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 535: 2233, 718: 2233}, + {538: 2335, 562: 4618, 808: 6750}, + {538: 2335, 562: 4618, 808: 6748}, + {538: 6749}, + {2246, 2246, 17: 2246, 58: 2246, 60: 2246, 2246, 2246, 2246, 2246, 2246, 2246, 2246, 2246, 2246, 2246, 2246, 2246, 2246, 2246, 2246, 2246, 2246, 2246, 2246, 2246, 2246, 2246, 2246, 535: 2246, 718: 2246}, + {538: 6751}, // 3875 - {2232, 2232, 17: 2232, 58: 2232, 60: 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 535: 2232, 718: 2232}, - {2231, 2231, 17: 2231, 58: 2231, 60: 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 535: 2231, 718: 2231}, - {237: 6744, 6745, 241: 6746, 564: 3053, 634: 6742, 6743, 805: 6741, 1004: 6748, 1231: 6749}, - {2248, 2248, 17: 2248, 58: 2248, 60: 2248, 2248, 2248, 2248, 2248, 2248, 2248, 2248, 2248, 2248, 2248, 2248, 2248, 2248, 2248, 2248, 2248, 2248, 2248, 2248, 2248, 2248, 2248, 2248, 535: 2248, 718: 2248}, {2247, 2247, 17: 2247, 58: 2247, 60: 2247, 2247, 2247, 2247, 2247, 2247, 2247, 2247, 2247, 2247, 2247, 2247, 2247, 2247, 2247, 2247, 2247, 2247, 2247, 2247, 2247, 2247, 2247, 2247, 535: 2247, 718: 2247}, + {538: 6753}, + {2248, 2248, 17: 2248, 58: 2248, 60: 2248, 2248, 2248, 2248, 2248, 2248, 2248, 2248, 2248, 2248, 2248, 2248, 2248, 2248, 2248, 2248, 2248, 2248, 2248, 2248, 2248, 2248, 2248, 2248, 535: 2248, 718: 2248}, + {538: 6755}, + {2249, 2249, 17: 2249, 58: 2249, 60: 2249, 2249, 2249, 2249, 2249, 2249, 2249, 2249, 2249, 2249, 2249, 2249, 2249, 2249, 2249, 2249, 2249, 2249, 2249, 2249, 2249, 2249, 2249, 2249, 535: 2249, 718: 2249}, // 3880 - {131: 3972, 154: 3971, 564: 3053, 805: 3888, 817: 6752, 936: 6751}, + {538: 6757}, {2250, 2250, 17: 2250, 58: 2250, 60: 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2250, 535: 2250, 718: 2250}, - {2249, 2249, 17: 2249, 58: 2249, 60: 2249, 2249, 2249, 2249, 2249, 2249, 2249, 2249, 2249, 2249, 2249, 2249, 2249, 2249, 2249, 2249, 2249, 2249, 2249, 2249, 2249, 2249, 2249, 2249, 535: 2249, 718: 2249}, - {564: 3053, 805: 3888, 817: 6754}, - {263: 6755}, - // 3885 - {613: 6756}, - {137: 6757}, + {237: 6764, 6765, 241: 6766, 567: 3058, 634: 6762, 6763, 805: 6761, 1006: 6759, 1232: 6760}, + {2252, 2252, 17: 2252, 58: 2252, 60: 2252, 2252, 2252, 2252, 2252, 2252, 2252, 2252, 2252, 2252, 2252, 2252, 2252, 2252, 2252, 2252, 2252, 2252, 2252, 2252, 2252, 2252, 2252, 2252, 535: 2252, 718: 2252}, {2251, 2251, 17: 2251, 58: 2251, 60: 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251, 535: 2251, 718: 2251}, - {538: 6759, 564: 3053, 805: 3888, 817: 6760}, - {2253, 2253, 17: 2253, 58: 2253, 60: 2253, 2253, 2253, 2253, 2253, 2253, 2253, 2253, 2253, 2253, 2253, 2253, 2253, 2253, 2253, 2253, 2253, 2253, 2253, 2253, 2253, 2253, 2253, 2253, 535: 2253, 718: 2253}, + // 3885 + {2242, 2242, 9: 2242, 17: 2242, 58: 2242, 60: 2242, 2242, 2242, 2242, 2242, 2242, 2242, 2242, 2242, 2242, 2242, 2242, 2242, 2242, 2242, 2242, 2242, 2242, 2242, 2242, 2242, 2242, 2242, 2242, 110: 2242, 2242, 2242, 2242, 2242, 535: 2242, 718: 2242}, + {2241, 2241, 9: 2241, 17: 2241, 58: 2241, 60: 2241, 2241, 2241, 2241, 2241, 2241, 2241, 2241, 2241, 2241, 2241, 2241, 2241, 2241, 2241, 2241, 2241, 2241, 2241, 2241, 2241, 2241, 2241, 2241, 110: 2241, 2241, 2241, 2241, 2241, 535: 2241, 718: 2241}, + {2240, 2240, 9: 2240, 17: 2240, 58: 2240, 60: 2240, 2240, 2240, 2240, 2240, 2240, 2240, 2240, 2240, 2240, 2240, 2240, 2240, 2240, 2240, 2240, 2240, 2240, 2240, 2240, 2240, 2240, 2240, 2240, 110: 2240, 2240, 2240, 2240, 2240, 535: 2240, 718: 2240}, + {2239, 2239, 17: 2239, 58: 2239, 60: 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 535: 2239, 718: 2239}, + {2238, 2238, 17: 2238, 58: 2238, 60: 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238, 535: 2238, 718: 2238}, // 3890 - {2252, 2252, 17: 2252, 58: 2252, 60: 2252, 2252, 2252, 2252, 2252, 2252, 2252, 2252, 2252, 2252, 2252, 2252, 2252, 2252, 2252, 2252, 2252, 2252, 2252, 2252, 2252, 2252, 2252, 2252, 535: 2252, 718: 2252}, - {538: 6763, 564: 3053, 805: 3888, 817: 6762}, - {2254, 2254, 17: 2254, 58: 2254, 60: 2254, 2254, 2254, 2254, 2254, 2254, 2254, 2254, 2254, 2254, 2254, 2254, 2254, 2254, 2254, 2254, 2254, 2254, 2254, 2254, 2254, 2254, 2254, 2254, 118: 3789, 127: 3797, 133: 3785, 137: 3782, 3784, 3781, 3783, 3787, 3788, 3793, 3792, 3791, 3795, 3796, 3790, 3794, 3786, 535: 2254, 718: 2254, 892: 6764}, - {2255, 2255, 17: 2255, 58: 2255, 60: 2255, 2255, 2255, 2255, 2255, 2255, 2255, 2255, 2255, 2255, 2255, 2255, 2255, 2255, 2255, 2255, 2255, 2255, 2255, 2255, 2255, 2255, 2255, 2255, 535: 2255, 718: 2255}, - {366: 6765}, + {2237, 2237, 17: 2237, 58: 2237, 60: 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 535: 2237, 718: 2237}, + {237: 6764, 6765, 241: 6766, 567: 3058, 634: 6762, 6763, 805: 6761, 1006: 6768, 1232: 6769}, + {2254, 2254, 17: 2254, 58: 2254, 60: 2254, 2254, 2254, 2254, 2254, 2254, 2254, 2254, 2254, 2254, 2254, 2254, 2254, 2254, 2254, 2254, 2254, 2254, 2254, 2254, 2254, 2254, 2254, 2254, 535: 2254, 718: 2254}, + {2253, 2253, 17: 2253, 58: 2253, 60: 2253, 2253, 2253, 2253, 2253, 2253, 2253, 2253, 2253, 2253, 2253, 2253, 2253, 2253, 2253, 2253, 2253, 2253, 2253, 2253, 2253, 2253, 2253, 2253, 535: 2253, 718: 2253}, + {131: 3980, 157: 3979, 567: 3058, 805: 3893, 820: 6772, 938: 6771}, // 3895 {2256, 2256, 17: 2256, 58: 2256, 60: 2256, 2256, 2256, 2256, 2256, 2256, 2256, 2256, 2256, 2256, 2256, 2256, 2256, 2256, 2256, 2256, 2256, 2256, 2256, 2256, 2256, 2256, 2256, 2256, 535: 2256, 718: 2256}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 538: 3758, 554: 6769, 557: 6770, 777: 3759, 3067, 3068, 3066, 811: 6768, 1480: 6767}, - {2257, 2257, 17: 2257, 58: 2257, 60: 2257, 2257, 2257, 2257, 2257, 2257, 2257, 2257, 2257, 2257, 2257, 2257, 2257, 2257, 2257, 2257, 2257, 2257, 2257, 2257, 2257, 2257, 2257, 2257, 535: 2257, 718: 2257}, - {433, 433, 17: 433, 58: 433, 60: 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 535: 433, 718: 433}, - {432, 432, 17: 432, 58: 432, 60: 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 535: 432, 718: 432}, + {2255, 2255, 17: 2255, 58: 2255, 60: 2255, 2255, 2255, 2255, 2255, 2255, 2255, 2255, 2255, 2255, 2255, 2255, 2255, 2255, 2255, 2255, 2255, 2255, 2255, 2255, 2255, 2255, 2255, 2255, 535: 2255, 718: 2255}, + {567: 3058, 805: 3893, 820: 6774}, + {263: 6775}, + {614: 6776}, // 3900 - {431, 431, 17: 431, 58: 431, 60: 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 535: 431, 718: 431}, - {538: 6772}, - {2258, 2258, 17: 2258, 58: 2258, 60: 2258, 2258, 2258, 2258, 2258, 2258, 2258, 2258, 2258, 2258, 2258, 2258, 2258, 2258, 2258, 2258, 2258, 2258, 2258, 2258, 2258, 2258, 2258, 2258, 535: 2258, 718: 2258}, - {564: 3053, 634: 6742, 6743, 805: 6741, 1004: 6774}, + {138: 6777}, + {2257, 2257, 17: 2257, 58: 2257, 60: 2257, 2257, 2257, 2257, 2257, 2257, 2257, 2257, 2257, 2257, 2257, 2257, 2257, 2257, 2257, 2257, 2257, 2257, 2257, 2257, 2257, 2257, 2257, 2257, 535: 2257, 718: 2257}, + {538: 6779, 567: 3058, 805: 3893, 820: 6780}, {2259, 2259, 17: 2259, 58: 2259, 60: 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 535: 2259, 718: 2259}, + {2258, 2258, 17: 2258, 58: 2258, 60: 2258, 2258, 2258, 2258, 2258, 2258, 2258, 2258, 2258, 2258, 2258, 2258, 2258, 2258, 2258, 2258, 2258, 2258, 2258, 2258, 2258, 2258, 2258, 2258, 535: 2258, 718: 2258}, // 3905 - {564: 3053, 805: 3888, 817: 6776}, - {2260, 2260, 17: 2260, 58: 2260, 60: 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 535: 2260, 718: 2260}, - {2: 2261, 2261, 2261, 2261, 2261, 2261, 2261, 10: 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 58: 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 538: 2261, 554: 2261, 557: 2261, 561: 2261}, - {538: 6779}, - {2279, 2279, 17: 2279, 58: 2279, 60: 2279, 2279, 2279, 2279, 2279, 2279, 2279, 2279, 2279, 2279, 2279, 2279, 2279, 2279, 2279, 2279, 2279, 2279, 2279, 2279, 2279, 2279, 2279, 2279, 535: 2279, 718: 2279, 955: 6780}, + {538: 6783, 567: 3058, 805: 3893, 820: 6782}, + {2260, 2260, 17: 2260, 58: 2260, 60: 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 118: 3794, 127: 3802, 134: 3790, 138: 3787, 140: 3789, 3786, 3788, 3792, 3793, 3798, 3797, 3796, 3800, 3801, 3795, 3799, 3791, 535: 2260, 718: 2260, 892: 6784}, + {2261, 2261, 17: 2261, 58: 2261, 60: 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 535: 2261, 718: 2261}, + {368: 6785}, + {2262, 2262, 17: 2262, 58: 2262, 60: 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, 535: 2262, 718: 2262}, // 3910 - {2286, 2286, 17: 6721, 58: 6697, 60: 6717, 6710, 6700, 6696, 6704, 6708, 6720, 6703, 6709, 6707, 6705, 6723, 6727, 6718, 6711, 6699, 6719, 6724, 6698, 6701, 6725, 6702, 6706, 6726, 535: 6712, 718: 6722, 951: 6714, 6713, 6716, 6695, 956: 6715}, - {178: 6785}, - {178: 6783}, - {564: 3053, 805: 4560, 831: 6784}, - {2228, 2228}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 538: 3763, 554: 6789, 557: 6790, 777: 3764, 3072, 3073, 3071, 811: 6788, 1480: 6787}, + {2263, 2263, 17: 2263, 58: 2263, 60: 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, 535: 2263, 718: 2263}, + {440, 440, 17: 440, 58: 440, 60: 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 535: 440, 718: 440}, + {439, 439, 17: 439, 58: 439, 60: 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 535: 439, 718: 439}, + {438, 438, 17: 438, 58: 438, 60: 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 535: 438, 718: 438}, // 3915 - {564: 3053, 805: 4560, 831: 6786}, - {2288, 2288}, - {156: 6961, 323: 6962}, - {178: 6957}, - {793, 793, 568: 6954, 584: 6953, 1461: 6952}, + {538: 6792}, + {2264, 2264, 17: 2264, 58: 2264, 60: 2264, 2264, 2264, 2264, 2264, 2264, 2264, 2264, 2264, 2264, 2264, 2264, 2264, 2264, 2264, 2264, 2264, 2264, 2264, 2264, 2264, 2264, 2264, 2264, 535: 2264, 718: 2264}, + {567: 3058, 634: 6762, 6763, 805: 6761, 1006: 6794}, + {2265, 2265, 17: 2265, 58: 2265, 60: 2265, 2265, 2265, 2265, 2265, 2265, 2265, 2265, 2265, 2265, 2265, 2265, 2265, 2265, 2265, 2265, 2265, 2265, 2265, 2265, 2265, 2265, 2265, 2265, 535: 2265, 718: 2265}, + {567: 3058, 805: 3893, 820: 6796}, // 3920 - {18: 6937, 51: 6938, 132: 6934, 218: 6939, 244: 6936, 614: 6933, 649: 6935, 970: 6940}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 6922, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 3949, 3067, 3068, 3066, 810: 6923}, - {873, 873, 563: 6917}, - {155: 6916}, - {408: 6914}, + {2266, 2266, 17: 2266, 58: 2266, 60: 2266, 2266, 2266, 2266, 2266, 2266, 2266, 2266, 2266, 2266, 2266, 2266, 2266, 2266, 2266, 2266, 2266, 2266, 2266, 2266, 2266, 2266, 2266, 2266, 535: 2266, 718: 2266}, + {2: 2267, 2267, 2267, 2267, 2267, 2267, 2267, 10: 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 58: 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 538: 2267, 554: 2267, 557: 2267, 562: 2267}, + {538: 6799}, + {2285, 2285, 17: 2285, 58: 2285, 60: 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 535: 2285, 718: 2285, 957: 6800}, + {2292, 2292, 17: 6741, 58: 6717, 60: 6737, 6730, 6720, 6716, 6724, 6728, 6740, 6723, 6729, 6727, 6725, 6743, 6747, 6738, 6731, 6719, 6739, 6744, 6718, 6721, 6745, 6722, 6726, 6746, 535: 6732, 718: 6742, 953: 6734, 6733, 6736, 6715, 958: 6735}, // 3925 - {131: 3972, 154: 3971, 157: 6909, 268: 6908, 936: 6910}, - {868, 868}, - {858, 858, 236: 6890, 280: 6891, 292: 6892, 295: 6889, 318: 6894, 329: 6893, 343: 6896, 346: 6895, 559: 858, 562: 858, 858, 721: 6897, 1278: 6888, 1464: 6887, 6886}, - {866, 866}, - {865, 865}, + {210: 6805}, + {210: 6803}, + {567: 3058, 805: 4568, 837: 6804}, + {2236, 2236}, + {567: 3058, 805: 4568, 837: 6806}, // 3930 - {796, 796, 319: 6878, 563: 6877, 568: 796, 584: 796}, - {178: 6874, 220: 6875}, - {566: 841, 611: 841}, - {566: 840, 611: 840}, - {566: 839, 611: 839}, + {2294, 2294}, + {158: 6985, 325: 6986}, + {210: 6981}, + {801, 801, 569: 6978, 585: 6977, 1461: 6976}, + {18: 6961, 51: 6962, 133: 6958, 219: 6963, 244: 6960, 613: 6957, 649: 6959, 972: 6964}, // 3935 - {836, 836, 568: 836, 584: 836}, - {835, 835, 568: 835, 584: 835}, - {834, 834, 568: 834, 584: 834}, - {833, 833, 568: 833, 584: 833}, - {157: 6872}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 6946, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 565: 3955, 777: 3954, 3072, 3073, 3071, 810: 6947}, + {882, 882, 563: 6941}, + {139: 6940}, + {407: 6938}, + {139: 6937}, // 3940 - {566: 6842, 611: 6843, 909: 6867}, - {131: 783, 154: 783, 260: 6840, 1228: 6861}, - {536: 6856}, - {824, 824, 568: 824, 584: 824}, - {822, 822, 568: 822, 584: 822}, + {131: 3980, 155: 6932, 157: 3979, 268: 6931, 938: 6933}, + {876, 876}, + {866, 866, 236: 6913, 281: 6914, 293: 6915, 296: 6912, 320: 6917, 330: 6916, 345: 6919, 348: 6918, 559: 866, 866, 563: 866, 721: 6920, 1277: 6911, 1464: 6910, 6909}, + {874, 874}, + {873, 873}, // 3945 - {155: 6854, 180: 6855, 248: 6853}, - {818, 818, 568: 818, 584: 818}, - {781, 781, 566: 6842, 568: 781, 584: 781, 611: 6843, 909: 6845, 946: 6852}, - {155: 6851}, - {155: 6850}, + {804, 804, 321: 6901, 563: 6900, 569: 804, 585: 804}, + {210: 6897, 221: 6898}, + {566: 849, 611: 849}, + {566: 848, 611: 848}, + {566: 847, 611: 847}, // 3950 - {155: 6849}, - {155: 6848}, - {155: 6847}, - {781, 781, 566: 6842, 568: 781, 584: 781, 611: 6843, 909: 6845, 946: 6844}, - {810, 810, 568: 810, 584: 810}, + {844, 844, 569: 844, 585: 844}, + {843, 843, 569: 843, 585: 843}, + {842, 842, 569: 842, 585: 842}, + {841, 841, 569: 841, 585: 841}, + {155: 6895}, // 3955 - {809, 809, 568: 809, 584: 809}, - {808, 808, 568: 808, 584: 808}, - {807, 807, 568: 807, 584: 807}, - {806, 806, 568: 806, 584: 806}, - {805, 805, 568: 805, 584: 805}, + {566: 6865, 611: 6866, 909: 6890}, + {131: 791, 157: 791, 260: 6861, 1228: 6884}, + {536: 6879}, + {832, 832, 569: 832, 585: 832}, + {830, 830, 569: 830, 585: 830}, // 3960 - {804, 804, 568: 804, 584: 804}, - {803, 803, 568: 803, 584: 803}, - {802, 802, 568: 802, 584: 802}, - {801, 801, 568: 801, 584: 801}, - {800, 800, 568: 800, 584: 800}, + {139: 6877, 180: 6878, 248: 6876}, + {826, 826, 569: 826, 585: 826}, + {789, 789, 566: 6865, 569: 789, 585: 789, 611: 6866, 909: 6868, 948: 6875}, + {139: 6874}, + {139: 6873}, // 3965 - {155: 6841}, - {798, 798, 568: 798, 584: 798}, - {797, 797, 568: 797, 584: 797}, - {155: 789, 180: 789, 248: 789}, - {155: 788, 180: 788, 204: 788, 248: 788}, + {139: 6872}, + {139: 6871}, + {139: 6870}, + {789, 789, 566: 6865, 569: 789, 585: 789, 611: 6866, 909: 6868, 948: 6867}, + {818, 818, 569: 818, 585: 818}, // 3970 - {131: 782, 154: 782, 157: 782, 268: 782}, - {799, 799, 568: 799, 584: 799}, - {2: 838, 838, 838, 838, 838, 838, 838, 10: 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 58: 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838}, - {2: 837, 837, 837, 837, 837, 837, 837, 10: 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 58: 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837}, - {811, 811, 568: 811, 584: 811}, + {817, 817, 569: 817, 585: 817}, + {816, 816, 569: 816, 585: 816}, + {815, 815, 569: 815, 585: 815}, + {814, 814, 569: 814, 585: 814}, + {813, 813, 569: 813, 585: 813}, // 3975 - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 5976, 3067, 3068, 3066, 913: 6846}, - {780, 780, 568: 780, 584: 780}, - {812, 812, 568: 812, 584: 812}, - {813, 813, 568: 813, 584: 813}, - {814, 814, 568: 814, 584: 814}, + {812, 812, 569: 812, 585: 812}, + {811, 811, 569: 811, 585: 811}, + {810, 810, 569: 810, 585: 810}, + {809, 809, 569: 809, 585: 809}, + {808, 808, 569: 808, 585: 808}, // 3980 - {815, 815, 568: 815, 584: 815}, - {816, 816, 568: 816, 584: 816}, - {817, 817, 568: 817, 584: 817}, - {821, 821, 568: 821, 584: 821}, - {820, 820, 568: 820, 584: 820}, + {139: 6864}, + {806, 806, 569: 806, 585: 806}, + {805, 805, 569: 805, 585: 805}, + {139: 797, 180: 797, 248: 797}, + {139: 796, 180: 796, 204: 796, 248: 796}, // 3985 - {819, 819, 568: 819, 584: 819}, - {589: 6857}, - {57: 6858}, - {314: 6860, 363: 6859}, - {825, 825, 568: 825, 584: 825}, + {131: 790, 155: 790, 157: 790, 268: 790}, + {139: 786}, + {139: 785}, + {807, 807, 569: 807, 585: 807}, + {2: 846, 846, 846, 846, 846, 846, 846, 10: 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 58: 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 565: 846}, // 3990 - {823, 823, 568: 823, 584: 823}, - {131: 3972, 154: 3971, 936: 6862}, - {566: 6842, 611: 6843, 909: 6864, 1280: 6863}, - {781, 781, 566: 6842, 568: 781, 584: 781, 611: 6843, 909: 6845, 946: 6866}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 3949, 3067, 3068, 3066, 810: 6865}, + {2: 845, 845, 845, 845, 845, 845, 845, 10: 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 58: 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 565: 845}, + {819, 819, 569: 819, 585: 819}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 5996, 3072, 3073, 3071, 913: 6869}, + {788, 788, 569: 788, 585: 788}, + {820, 820, 569: 820, 585: 820}, // 3995 - {779, 779, 566: 779, 568: 779, 584: 779, 611: 779}, - {826, 826, 568: 826, 584: 826}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 6868, 3067, 3068, 3066, 810: 6869}, - {1261, 1261, 566: 6842, 568: 1261, 584: 1261, 611: 6843, 720: 3954, 909: 6870}, - {829, 829, 568: 829, 584: 829}, + {821, 821, 569: 821, 585: 821}, + {822, 822, 569: 822, 585: 822}, + {823, 823, 569: 823, 585: 823}, + {824, 824, 569: 824, 585: 824}, + {825, 825, 569: 825, 585: 825}, // 4000 - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 6871, 3067, 3068, 3066}, - {828, 828, 568: 828, 584: 828}, - {781, 781, 566: 6842, 568: 781, 584: 781, 611: 6843, 909: 6845, 946: 6873}, - {831, 831, 568: 831, 584: 831}, - {564: 3053, 805: 4560, 831: 6876}, + {829, 829, 569: 829, 585: 829}, + {828, 828, 569: 828, 585: 828}, + {827, 827, 569: 827, 585: 827}, + {565: 6880}, + {57: 6881}, // 4005 - {794, 794, 568: 794, 584: 794}, - {863, 863}, - {614: 6881, 649: 6681, 935: 6880, 1462: 6879}, - {795, 795, 568: 795, 584: 795}, - {864, 864}, + {315: 6883, 365: 6882}, + {833, 833, 569: 833, 585: 833}, + {831, 831, 569: 831, 585: 831}, + {131: 3980, 157: 3979, 938: 6885}, + {566: 6865, 611: 6866, 909: 6887, 1279: 6886}, // 4010 - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 5976, 3067, 3068, 3066, 913: 6885}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 3949, 3067, 3068, 3066, 810: 6882}, - {860, 860, 551: 6883}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 6884, 3067, 3068, 3066}, - {859, 859}, + {789, 789, 566: 6865, 569: 789, 585: 789, 611: 6866, 909: 6868, 948: 6889}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 565: 3955, 777: 3954, 3072, 3073, 3071, 810: 6888}, + {787, 787, 566: 787, 569: 787, 585: 787, 611: 787}, + {834, 834, 569: 834, 585: 834}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 565: 3955, 777: 6891, 3072, 3073, 3071, 810: 6892}, // 4015 - {861, 861}, - {845, 845, 559: 845, 562: 845, 6904, 1463: 6903}, - {857, 857, 9: 6901, 559: 857, 562: 857, 857}, - {856, 856, 9: 856, 559: 856, 562: 856, 856}, - {854, 854, 9: 854, 559: 854, 562: 854, 854}, + {1270, 1270, 566: 6865, 569: 1270, 585: 1270, 611: 6866, 720: 3962, 909: 6893}, + {837, 837, 569: 837, 585: 837}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 6894, 3072, 3073, 3071}, + {836, 836, 569: 836, 585: 836}, + {789, 789, 566: 6865, 569: 789, 585: 789, 611: 6866, 909: 6868, 948: 6896}, // 4020 - {853, 853, 9: 853, 559: 853, 562: 853, 853}, - {403: 6900}, - {447: 6899}, - {394: 6898}, - {849, 849, 9: 849, 559: 849, 562: 849, 849}, + {839, 839, 569: 839, 585: 839}, + {567: 3058, 805: 4568, 837: 6899}, + {802, 802, 569: 802, 585: 802}, + {871, 871}, + {613: 6904, 649: 6701, 937: 6903, 1462: 6902}, // 4025 - {848, 848, 9: 848, 559: 848, 562: 848, 848}, - {847, 847, 9: 847, 559: 847, 562: 847, 847}, - {846, 846, 9: 846, 559: 846, 562: 846, 846}, - {850, 850, 9: 850, 559: 850, 562: 850, 850}, - {851, 851, 9: 851, 559: 851, 562: 851, 851}, + {803, 803, 569: 803, 585: 803}, + {872, 872}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 5996, 3072, 3073, 3071, 913: 6908}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 565: 3955, 777: 3954, 3072, 3073, 3071, 810: 6905}, + {868, 868, 551: 6906}, // 4030 - {852, 852, 9: 852, 559: 852, 562: 852, 852}, - {236: 6890, 280: 6891, 292: 6892, 295: 6889, 318: 6894, 329: 6893, 343: 6896, 346: 6895, 721: 6897, 1278: 6902}, - {855, 855, 9: 855, 559: 855, 562: 855, 855}, - {1075, 1075, 559: 3881, 562: 3880, 849: 3938, 931: 6907}, - {159: 6905}, - // 4035 - {564: 3053, 805: 4560, 831: 6906}, - {844, 844, 559: 844, 562: 844}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 6907, 3072, 3073, 3071}, {867, 867}, {869, 869}, - {781, 781, 566: 6842, 568: 781, 584: 781, 611: 6843, 909: 6845, 946: 6913}, + {853, 853, 559: 853, 853, 563: 6927, 1463: 6926}, + {865, 865, 9: 6924, 559: 865, 865, 563: 865}, + // 4035 + {864, 864, 9: 864, 559: 864, 864, 563: 864}, + {862, 862, 9: 862, 559: 862, 862, 563: 862}, + {861, 861, 9: 861, 559: 861, 861, 563: 861}, + {403: 6923}, + {446: 6922}, // 4040 - {566: 6842, 611: 6843, 909: 6864, 1280: 6911}, - {781, 781, 566: 6842, 568: 781, 584: 781, 611: 6843, 909: 6845, 946: 6912}, - {827, 827, 568: 827, 584: 827}, - {832, 832, 568: 832, 584: 832}, - {155: 6915}, + {395: 6921}, + {857, 857, 9: 857, 559: 857, 857, 563: 857}, + {856, 856, 9: 856, 559: 856, 856, 563: 856}, + {855, 855, 9: 855, 559: 855, 855, 563: 855}, + {854, 854, 9: 854, 559: 854, 854, 563: 854}, // 4045 - {870, 870}, - {871, 871}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 538: 3758, 636: 5875, 777: 3759, 3067, 3068, 3066, 811: 5874, 861: 6918}, - {843, 843, 547: 6920, 1496: 6919}, - {872, 872}, + {858, 858, 9: 858, 559: 858, 858, 563: 858}, + {859, 859, 9: 859, 559: 859, 859, 563: 859}, + {860, 860, 9: 860, 559: 860, 860, 563: 860}, + {236: 6913, 281: 6914, 293: 6915, 296: 6912, 320: 6917, 330: 6916, 345: 6919, 348: 6918, 721: 6920, 1277: 6925}, + {863, 863, 9: 863, 559: 863, 863, 563: 863}, // 4050 - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 6327, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 538: 6332, 777: 3759, 3067, 3068, 3066, 811: 5829, 904: 6334, 923: 6335, 6333, 972: 6921}, - {842, 842, 9: 6336}, - {781, 781, 108: 2000, 193: 2000, 551: 2000, 566: 6842, 568: 781, 584: 781, 611: 6843, 715: 2000, 720: 2000, 909: 6845, 946: 6932}, - {108: 1128, 193: 6925, 551: 6045, 715: 1128, 969: 6924}, - {108: 6926, 715: 6927}, - // 4055 + {1083, 1083, 559: 3886, 3885, 848: 3943, 932: 6930}, + {161: 6928}, + {567: 3058, 805: 4568, 837: 6929}, + {852, 852, 559: 852, 852}, {875, 875}, - {424, 424, 568: 4683, 895: 4684, 6931}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 6928, 3067, 3068, 3066}, - {108: 6929}, - {424, 424, 568: 4683, 895: 4684, 6930}, - // 4060 - {874, 874}, - {876, 876}, - {830, 830, 568: 830, 584: 830}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 3949, 3067, 3068, 3066, 810: 6951}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 3949, 3067, 3068, 3066, 810: 6950}, - // 4065 - {2: 2130, 2130, 2130, 2130, 2130, 2130, 2130, 10: 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 58: 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 583: 5367, 889: 6948}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 3949, 3067, 3068, 3066, 810: 6947}, - {215: 6945}, - {576: 6943}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 538: 3758, 636: 5875, 777: 3759, 3067, 3068, 3066, 811: 5874, 861: 6942}, - // 4070 - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 3949, 3067, 3068, 3066, 810: 6941}, - {862, 862}, + // 4055 {877, 877}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 540: 4618, 777: 4617, 3067, 3068, 3066, 942: 6944}, + {789, 789, 566: 6865, 569: 789, 585: 789, 611: 6866, 909: 6868, 948: 6936}, + {566: 6865, 611: 6866, 909: 6887, 1279: 6934}, + {789, 789, 566: 6865, 569: 789, 585: 789, 611: 6866, 909: 6868, 948: 6935}, + {835, 835, 569: 835, 585: 835}, + // 4060 + {840, 840, 569: 840, 585: 840}, {878, 878}, - // 4075 - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 5538, 3067, 3068, 3066, 995: 6946}, + {139: 6939}, {879, 879}, {880, 880}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 5976, 3067, 3068, 3066, 913: 6949}, + // 4065 + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 538: 3763, 636: 5895, 777: 3764, 3072, 3073, 3071, 811: 5894, 861: 6942}, + {851, 851, 547: 6944, 1496: 6943}, {881, 881}, - // 4080 - {882, 882}, - {883, 883}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 6346, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 538: 6351, 777: 3764, 3072, 3073, 3071, 811: 5849, 904: 6353, 925: 6354, 6352, 974: 6945}, + {850, 850, 9: 6355}, + // 4070 + {789, 789, 108: 2010, 194: 2010, 551: 2010, 566: 6865, 569: 789, 585: 789, 611: 6866, 715: 2010, 720: 2010, 909: 6868, 948: 6956}, + {108: 1136, 194: 6949, 551: 6065, 715: 1136, 971: 6948}, + {108: 6950, 715: 6951}, {884, 884}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3703, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3637, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 6956, 3618, 3700, 3617, 3614}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 6955}, + {431, 431, 569: 4692, 895: 4693, 6955}, + // 4075 + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 6952, 3072, 3073, 3071}, + {108: 6953}, + {431, 431, 569: 4692, 895: 4693, 6954}, + {883, 883}, + {885, 885}, + // 4080 + {838, 838, 569: 838, 585: 838}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 565: 3955, 777: 3954, 3072, 3073, 3071, 810: 6975}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 565: 3955, 777: 3954, 3072, 3073, 3071, 810: 6974}, + {2: 2139, 2139, 2139, 2139, 2139, 2139, 2139, 10: 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 58: 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 584: 5376, 890: 6972}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 565: 3955, 777: 3954, 3072, 3073, 3071, 810: 6971}, // 4085 - {791, 791, 571: 3767, 3765, 3766, 3764, 3762, 806: 3763, 3761}, - {792, 792, 543: 3714, 707: 3715}, - {159: 6959, 564: 3053, 805: 4560, 831: 6958}, - {2290, 2290}, - {564: 3053, 805: 4560, 831: 6960}, + {215: 6969}, + {577: 6967}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 538: 3763, 636: 5895, 777: 3764, 3072, 3073, 3071, 811: 5894, 861: 6966}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 565: 3955, 777: 3954, 3072, 3073, 3071, 810: 6965}, + {870, 870}, // 4090 - {2289, 2289}, - {155: 6965, 323: 6966}, - {566: 6963}, - {538: 6964}, - {2287, 2287}, + {886, 886}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 540: 4626, 777: 4625, 3072, 3073, 3071, 944: 6968}, + {887, 887}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 5547, 3072, 3073, 3071, 996: 6970}, + {888, 888}, // 4095 - {2292, 2292}, - {566: 6967}, - {538: 6968}, - {2291, 2291}, - {156: 6970}, + {889, 889}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 5996, 3072, 3073, 3071, 913: 6973}, + {890, 890}, + {891, 891}, + {892, 892}, // 4100 - {566: 6971}, - {538: 6972}, - {2279, 2279, 17: 2279, 58: 2279, 60: 2279, 2279, 2279, 2279, 2279, 2279, 2279, 2279, 2279, 2279, 2279, 2279, 2279, 2279, 2279, 2279, 2279, 2279, 2279, 2279, 2279, 2279, 2279, 2279, 535: 2279, 718: 2279, 955: 6973}, - {2293, 2293, 17: 6721, 58: 6697, 60: 6717, 6710, 6700, 6696, 6704, 6708, 6720, 6703, 6709, 6707, 6705, 6723, 6727, 6718, 6711, 6699, 6719, 6724, 6698, 6701, 6725, 6702, 6706, 6726, 535: 6712, 718: 6722, 951: 6714, 6713, 6716, 6695, 956: 6715}, - {156: 6979}, + {893, 893}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3708, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3642, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 6980, 3623, 3705, 3622, 3619}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 6979}, + {799, 799, 572: 3772, 3770, 3771, 3769, 3767, 806: 3768, 3766}, + {800, 800, 543: 3719, 707: 3720}, // 4105 - {22: 6976}, - {178: 6977}, - {564: 3053, 805: 4560, 831: 6978}, - {2229, 2229}, - {2294, 2294}, + {161: 6983, 567: 3058, 805: 4568, 837: 6982}, + {2296, 2296}, + {567: 3058, 805: 4568, 837: 6984}, + {2295, 2295}, + {139: 6989, 325: 6990}, // 4110 - {156: 6985}, - {22: 6982}, - {178: 6983}, - {564: 3053, 805: 4560, 831: 6984}, - {2230, 2230}, + {566: 6987}, + {538: 6988}, + {2293, 2293}, + {2298, 2298}, + {566: 6991}, // 4115 - {2279, 2279, 17: 2279, 58: 2279, 60: 2279, 2279, 2279, 2279, 2279, 2279, 2279, 2279, 2279, 2279, 2279, 2279, 2279, 2279, 2279, 2279, 2279, 2279, 2279, 2279, 2279, 2279, 2279, 2279, 535: 2279, 718: 2279, 955: 6986}, - {2295, 2295, 17: 6721, 58: 6697, 60: 6717, 6710, 6700, 6696, 6704, 6708, 6720, 6703, 6709, 6707, 6705, 6723, 6727, 6718, 6711, 6699, 6719, 6724, 6698, 6701, 6725, 6702, 6706, 6726, 535: 6712, 718: 6722, 951: 6714, 6713, 6716, 6695, 956: 6715}, - {156: 6988}, - {2296, 2296}, - {717: 6994}, - // 4120 - {717: 6991}, {538: 6992}, - {2279, 2279, 17: 2279, 58: 2279, 60: 2279, 2279, 2279, 2279, 2279, 2279, 2279, 2279, 2279, 2279, 2279, 2279, 2279, 2279, 2279, 2279, 2279, 2279, 2279, 2279, 2279, 2279, 2279, 2279, 535: 2279, 718: 2279, 955: 6993}, - {2297, 2297, 17: 6721, 58: 6697, 60: 6717, 6710, 6700, 6696, 6704, 6708, 6720, 6703, 6709, 6707, 6705, 6723, 6727, 6718, 6711, 6699, 6719, 6724, 6698, 6701, 6725, 6702, 6706, 6726, 535: 6712, 718: 6722, 951: 6714, 6713, 6716, 6695, 956: 6715}, - {538: 6995}, - // 4125 - {2279, 2279, 17: 2279, 58: 2279, 60: 2279, 2279, 2279, 2279, 2279, 2279, 2279, 2279, 2279, 2279, 2279, 2279, 2279, 2279, 2279, 2279, 2279, 2279, 2279, 2279, 2279, 2279, 2279, 2279, 535: 2279, 718: 2279, 955: 6996}, - {2298, 2298, 17: 6721, 58: 6697, 60: 6717, 6710, 6700, 6696, 6704, 6708, 6720, 6703, 6709, 6707, 6705, 6723, 6727, 6718, 6711, 6699, 6719, 6724, 6698, 6701, 6725, 6702, 6706, 6726, 535: 6712, 718: 6722, 951: 6714, 6713, 6716, 6695, 956: 6715}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 6998, 3067, 3068, 3066}, - {2299, 2299}, + {2297, 2297}, + {158: 6994}, + {566: 6995}, + {538: 6996}, + // 4120 + {2285, 2285, 17: 2285, 58: 2285, 60: 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 535: 2285, 718: 2285, 957: 6997}, + {2299, 2299, 17: 6741, 58: 6717, 60: 6737, 6730, 6720, 6716, 6724, 6728, 6740, 6723, 6729, 6727, 6725, 6743, 6747, 6738, 6731, 6719, 6739, 6744, 6718, 6721, 6745, 6722, 6726, 6746, 535: 6732, 718: 6742, 953: 6734, 6733, 6736, 6715, 958: 6735}, + {158: 6999}, {2300, 2300}, + {158: 7001}, + // 4125 + {2285, 2285, 17: 2285, 58: 2285, 60: 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 535: 2285, 718: 2285, 957: 7002}, + {2301, 2301, 17: 6741, 58: 6717, 60: 6737, 6730, 6720, 6716, 6724, 6728, 6740, 6723, 6729, 6727, 6725, 6743, 6747, 6738, 6731, 6719, 6739, 6744, 6718, 6721, 6745, 6722, 6726, 6746, 535: 6732, 718: 6742, 953: 6734, 6733, 6736, 6715, 958: 6735}, + {158: 7004}, + {2302, 2302}, + {717: 7010}, // 4130 - {2319, 2319, 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 4046, 3067, 3068, 3066, 827: 7033}, - {2317, 2317}, - {28: 7031}, - {2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 10: 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 58: 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 561: 7020, 720: 2036}, - {232: 7006, 536: 2923, 2922, 552: 2921, 557: 2907, 592: 2906, 614: 2920, 701: 2916, 719: 3035, 729: 4668, 781: 4669, 809: 2886, 812: 4670, 2917, 2918, 2919, 2928, 818: 2926, 2925, 2924, 822: 2889, 4676, 4675, 828: 3034, 2887, 4673, 832: 4674, 4672, 839: 2888, 845: 4671, 910: 4677, 926: 7005}, + {717: 7007}, + {538: 7008}, + {2285, 2285, 17: 2285, 58: 2285, 60: 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 535: 2285, 718: 2285, 957: 7009}, + {2303, 2303, 17: 6741, 58: 6717, 60: 6737, 6730, 6720, 6716, 6724, 6728, 6740, 6723, 6729, 6727, 6725, 6743, 6747, 6738, 6731, 6719, 6739, 6744, 6718, 6721, 6745, 6722, 6726, 6746, 535: 6732, 718: 6742, 953: 6734, 6733, 6736, 6715, 958: 6735}, + {538: 7011}, // 4135 - {2311, 2311}, - {561: 7007}, - {172: 7011, 282: 7014, 301: 7013, 347: 7017, 359: 7010, 7016, 362: 7015, 538: 7009, 644: 7012, 1176: 7008}, - {536: 2923, 2922, 552: 2921, 557: 2907, 592: 2906, 614: 2920, 701: 2916, 719: 3035, 729: 4668, 781: 4669, 809: 2886, 812: 4670, 2917, 2918, 2919, 2928, 818: 2926, 2925, 2924, 822: 2889, 4676, 4675, 828: 3034, 2887, 4673, 832: 4674, 4672, 839: 2888, 845: 4671, 910: 4677, 926: 7019}, - {536: 2923, 2922, 552: 2921, 557: 2907, 592: 2906, 614: 2920, 701: 2916, 719: 3035, 729: 4668, 781: 4669, 809: 2886, 812: 4670, 2917, 2918, 2919, 2928, 818: 2926, 2925, 2924, 822: 2889, 4676, 4675, 828: 3034, 2887, 4673, 832: 4674, 4672, 839: 2888, 845: 4671, 910: 4677, 926: 7018}, + {2285, 2285, 17: 2285, 58: 2285, 60: 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 535: 2285, 718: 2285, 957: 7012}, + {2304, 2304, 17: 6741, 58: 6717, 60: 6737, 6730, 6720, 6716, 6724, 6728, 6740, 6723, 6729, 6727, 6725, 6743, 6747, 6738, 6731, 6719, 6739, 6744, 6718, 6721, 6745, 6722, 6726, 6746, 535: 6732, 718: 6742, 953: 6734, 6733, 6736, 6715, 958: 6735}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 7014, 3072, 3073, 3071}, + {2305, 2305}, + {2306, 2306}, // 4140 - {536: 2308, 2308, 552: 2308, 557: 2308, 563: 2308, 592: 2308, 614: 2308, 701: 2308, 719: 2308, 729: 2308, 809: 2308}, - {536: 2307, 2307, 552: 2307, 557: 2307, 563: 2307, 592: 2307, 614: 2307, 701: 2307, 719: 2307, 729: 2307, 809: 2307}, - {536: 2306, 2306, 552: 2306, 557: 2306, 563: 2306, 592: 2306, 614: 2306, 701: 2306, 719: 2306, 729: 2306, 809: 2306}, - {536: 2305, 2305, 552: 2305, 557: 2305, 563: 2305, 592: 2305, 614: 2305, 701: 2305, 719: 2305, 729: 2305, 809: 2305}, - {536: 2304, 2304, 552: 2304, 557: 2304, 563: 2304, 592: 2304, 614: 2304, 701: 2304, 719: 2304, 729: 2304, 809: 2304}, + {2325, 2325, 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 4054, 3072, 3073, 3071, 828: 7050}, + {2323, 2323}, + {28: 7048}, + {2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 10: 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 58: 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 562: 7037, 720: 2045}, + {132: 3044, 232: 7023, 536: 2929, 2928, 552: 2927, 557: 2913, 592: 2912, 613: 2926, 660: 2922, 719: 3039, 729: 4676, 781: 4677, 809: 2892, 812: 4678, 2923, 2924, 2925, 2934, 2932, 2931, 2930, 821: 2895, 4684, 4683, 827: 3038, 829: 2893, 4681, 4682, 4680, 840: 2894, 845: 4679, 910: 4685, 914: 4686, 928: 7022}, // 4145 - {536: 2303, 2303, 552: 2303, 557: 2303, 563: 2303, 592: 2303, 614: 2303, 701: 2303, 719: 2303, 729: 2303, 809: 2303}, - {536: 2302, 2302, 552: 2302, 557: 2302, 563: 2302, 592: 2302, 614: 2302, 701: 2302, 719: 2302, 729: 2302, 809: 2302}, - {536: 2301, 2301, 552: 2301, 557: 2301, 563: 2301, 592: 2301, 614: 2301, 701: 2301, 719: 2301, 729: 2301, 809: 2301}, - {2309, 2309}, - {2310, 2310}, + {1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 10: 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 58: 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 564: 5772, 720: 1845}, + {2317, 2317}, + {562: 7024}, + {174: 7028, 283: 7031, 302: 7030, 349: 7034, 361: 7027, 7033, 364: 7032, 538: 7026, 644: 7029, 1178: 7025}, + {132: 3044, 536: 2929, 2928, 552: 2927, 557: 2913, 592: 2912, 613: 2926, 660: 2922, 719: 3039, 729: 4676, 781: 4677, 809: 2892, 812: 4678, 2923, 2924, 2925, 2934, 2932, 2931, 2930, 821: 2895, 4684, 4683, 827: 3038, 829: 2893, 4681, 4682, 4680, 840: 2894, 845: 4679, 910: 4685, 914: 4686, 928: 7036}, // 4150 - {172: 7011, 282: 7014, 301: 7013, 347: 7017, 359: 7010, 7016, 362: 7015, 538: 7021, 644: 7012, 1176: 7022}, - {536: 2923, 2922, 552: 2921, 557: 2907, 563: 7027, 592: 2906, 614: 2920, 701: 2916, 719: 3035, 729: 4668, 781: 4669, 809: 2886, 812: 4670, 2917, 2918, 2919, 2928, 818: 2926, 2925, 2924, 822: 2889, 4676, 4675, 828: 3034, 2887, 4673, 832: 4674, 4672, 839: 2888, 845: 4671, 910: 4677, 926: 7028}, - {536: 2923, 2922, 552: 2921, 557: 2907, 563: 7023, 592: 2906, 614: 2920, 701: 2916, 719: 3035, 729: 4668, 781: 4669, 809: 2886, 812: 4670, 2917, 2918, 2919, 2928, 818: 2926, 2925, 2924, 822: 2889, 4676, 4675, 828: 3034, 2887, 4673, 832: 4674, 4672, 839: 2888, 845: 4671, 910: 4677, 926: 7024}, - {28: 7025}, - {2312, 2312}, + {132: 3044, 536: 2929, 2928, 552: 2927, 557: 2913, 592: 2912, 613: 2926, 660: 2922, 719: 3039, 729: 4676, 781: 4677, 809: 2892, 812: 4678, 2923, 2924, 2925, 2934, 2932, 2931, 2930, 821: 2895, 4684, 4683, 827: 3038, 829: 2893, 4681, 4682, 4680, 840: 2894, 845: 4679, 910: 4685, 914: 4686, 928: 7035}, + {132: 2314, 536: 2314, 2314, 552: 2314, 557: 2314, 563: 2314, 592: 2314, 613: 2314, 660: 2314, 719: 2314, 729: 2314, 809: 2314}, + {132: 2313, 536: 2313, 2313, 552: 2313, 557: 2313, 563: 2313, 592: 2313, 613: 2313, 660: 2313, 719: 2313, 729: 2313, 809: 2313}, + {132: 2312, 536: 2312, 2312, 552: 2312, 557: 2312, 563: 2312, 592: 2312, 613: 2312, 660: 2312, 719: 2312, 729: 2312, 809: 2312}, + {132: 2311, 536: 2311, 2311, 552: 2311, 557: 2311, 563: 2311, 592: 2311, 613: 2311, 660: 2311, 719: 2311, 729: 2311, 809: 2311}, // 4155 - {564: 3053, 805: 7026}, - {2313, 2313}, - {28: 7029}, - {2314, 2314}, - {564: 3053, 805: 7030}, - // 4160 + {132: 2310, 536: 2310, 2310, 552: 2310, 557: 2310, 563: 2310, 592: 2310, 613: 2310, 660: 2310, 719: 2310, 729: 2310, 809: 2310}, + {132: 2309, 536: 2309, 2309, 552: 2309, 557: 2309, 563: 2309, 592: 2309, 613: 2309, 660: 2309, 719: 2309, 729: 2309, 809: 2309}, + {132: 2308, 536: 2308, 2308, 552: 2308, 557: 2308, 563: 2308, 592: 2308, 613: 2308, 660: 2308, 719: 2308, 729: 2308, 809: 2308}, + {132: 2307, 536: 2307, 2307, 552: 2307, 557: 2307, 563: 2307, 592: 2307, 613: 2307, 660: 2307, 719: 2307, 729: 2307, 809: 2307}, {2315, 2315}, - {564: 3053, 805: 7032}, + // 4160 {2316, 2316}, - {2318, 2318}, - {2326, 2326}, + {174: 7028, 283: 7031, 302: 7030, 349: 7034, 361: 7027, 7033, 364: 7032, 538: 7038, 644: 7029, 1178: 7039}, + {132: 3044, 536: 2929, 2928, 552: 2927, 557: 2913, 563: 7044, 592: 2912, 613: 2926, 660: 2922, 719: 3039, 729: 4676, 781: 4677, 809: 2892, 812: 4678, 2923, 2924, 2925, 2934, 2932, 2931, 2930, 821: 2895, 4684, 4683, 827: 3038, 829: 2893, 4681, 4682, 4680, 840: 2894, 845: 4679, 910: 4685, 914: 4686, 928: 7045}, + {132: 3044, 536: 2929, 2928, 552: 2927, 557: 2913, 563: 7040, 592: 2912, 613: 2926, 660: 2922, 719: 3039, 729: 4676, 781: 4677, 809: 2892, 812: 4678, 2923, 2924, 2925, 2934, 2932, 2931, 2930, 821: 2895, 4684, 4683, 827: 3038, 829: 2893, 4681, 4682, 4680, 840: 2894, 845: 4679, 910: 4685, 914: 4686, 928: 7041}, + {28: 7042}, // 4165 - {561: 7060}, - {84: 2879, 2882, 87: 2912, 2880, 197: 2895, 450: 7056, 536: 2923, 2922, 552: 2921, 557: 2907, 560: 7039, 592: 2906, 614: 2920, 701: 2916, 718: 2878, 3035, 781: 7037, 809: 2886, 812: 7038, 2917, 2918, 2919, 2928, 818: 2926, 2925, 2924, 822: 2889, 7045, 7044, 828: 3034, 2887, 7042, 832: 7043, 7041, 839: 2888, 845: 7040, 851: 7053, 7048, 7051, 7052, 900: 7054, 903: 2896, 949: 7047, 968: 7046, 971: 7050, 973: 7049, 1028: 7055}, - {646, 646, 544: 1020, 555: 1020, 1020, 559: 3881, 562: 3880, 569: 3879, 848: 3882, 3883}, - {648, 648, 544: 1021, 555: 1021, 1021}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 6297, 6292, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 6298, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 6295, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 6294, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 6300, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 6293, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 6303, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 6301, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 6296, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 558: 4441, 633: 6309, 657: 6308, 714: 4439, 777: 6306, 3067, 3068, 3066, 859: 6310, 932: 6307, 1102: 6311, 1308: 6304}, + {2318, 2318}, + {567: 3058, 805: 7043}, + {2319, 2319}, + {28: 7046}, + {2320, 2320}, // 4170 + {567: 3058, 805: 7047}, + {2321, 2321}, + {567: 3058, 805: 7049}, + {2322, 2322}, + {2324, 2324}, + // 4175 + {2332, 2332}, + {562: 7077}, + {84: 2885, 2888, 87: 2918, 2886, 197: 2901, 449: 7073, 536: 2929, 2928, 552: 2927, 557: 2913, 561: 7056, 592: 2912, 613: 2926, 660: 2922, 718: 2884, 3039, 781: 7054, 809: 2892, 812: 7055, 2923, 2924, 2925, 2934, 2932, 2931, 2930, 821: 2895, 7062, 7061, 827: 3038, 829: 2893, 7059, 7060, 7058, 840: 2894, 845: 7057, 851: 7070, 7065, 7068, 7069, 903: 2902, 915: 7071, 952: 7064, 970: 7063, 973: 7067, 975: 7066, 1029: 7072}, + {654, 654, 544: 1028, 555: 1028, 1028, 559: 3886, 3885, 570: 3884, 847: 3887, 3888}, + {656, 656, 544: 1029, 555: 1029, 1029}, + // 4180 + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 6316, 6311, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 6317, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 6314, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 6313, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 6319, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 6312, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 6322, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 6320, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 6315, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 558: 4449, 633: 6328, 657: 6327, 714: 4447, 777: 6325, 3072, 3073, 3071, 859: 6329, 933: 6326, 1105: 6330, 1306: 6323}, + {661, 661}, + {660, 660}, + {659, 659}, + {658, 658}, + // 4185 + {657, 657}, + {655, 655}, {653, 653}, {652, 652}, {651, 651}, + // 4190 {650, 650}, {649, 649}, - // 4175 + {648, 648}, {647, 647}, - {645, 645}, - {644, 644}, - {643, 643}, - {642, 642}, - // 4180 - {641, 641}, - {640, 640}, - {639, 639}, - {638, 638}, - {22: 5793}, - // 4185 - {2324, 2324}, - {561: 7057}, - {538: 7058}, - {84: 2879, 2882, 87: 2912, 2880, 197: 2895, 536: 2923, 2922, 552: 2921, 557: 2907, 560: 7039, 592: 2906, 614: 2920, 701: 2916, 718: 2878, 3035, 781: 7037, 809: 2886, 812: 7038, 2917, 2918, 2919, 2928, 818: 2926, 2925, 2924, 822: 2889, 7045, 7044, 828: 3034, 2887, 7042, 832: 7043, 7041, 839: 2888, 845: 7040, 851: 7053, 7048, 7051, 7052, 900: 7054, 903: 2896, 949: 7047, 968: 7046, 971: 7050, 973: 7049, 1028: 7059}, - {2323, 2323}, - // 4190 - {538: 7061}, - {84: 2879, 2882, 87: 2912, 2880, 197: 2895, 536: 2923, 2922, 552: 2921, 557: 2907, 560: 7039, 592: 2906, 614: 2920, 701: 2916, 718: 2878, 3035, 781: 7037, 809: 2886, 812: 7038, 2917, 2918, 2919, 2928, 818: 2926, 2925, 2924, 822: 2889, 7045, 7044, 828: 3034, 2887, 7042, 832: 7043, 7041, 839: 2888, 845: 7040, 851: 7053, 7048, 7051, 7052, 900: 7054, 903: 2896, 949: 7047, 968: 7046, 971: 7050, 973: 7049, 1028: 7062}, - {2325, 2325}, - {2: 1263, 1263, 1263, 1263, 1263, 1263, 1263, 10: 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 58: 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 554: 1263, 566: 1263, 842: 5983, 5982, 5981, 940: 5984, 996: 7064}, - {2: 1251, 1251, 1251, 1251, 1251, 1251, 1251, 10: 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 58: 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 6374, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 554: 1251, 566: 1251, 1253: 7065}, + {646, 646}, // 4195 - {2: 2128, 2128, 2128, 2128, 2128, 2128, 2128, 10: 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 58: 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 554: 4697, 566: 2128, 964: 7066}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 566: 7067, 777: 6378, 3067, 3068, 3066, 1024: 6379, 1090: 6377}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 7069, 3067, 3068, 3066, 810: 6391, 1024: 6379, 1090: 7068}, - {9: 6387, 547: 7072}, - {1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1253, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 58: 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 542: 1261, 547: 1253, 551: 1261, 554: 1261, 562: 1261, 568: 1261, 1261, 1261, 580: 1261, 720: 7070, 1014: 6380}, + {23: 5813}, + {2330, 2330}, + {562: 7074}, + {538: 7075}, + {84: 2885, 2888, 87: 2918, 2886, 197: 2901, 536: 2929, 2928, 552: 2927, 557: 2913, 561: 7056, 592: 2912, 613: 2926, 660: 2922, 718: 2884, 3039, 781: 7054, 809: 2892, 812: 7055, 2923, 2924, 2925, 2934, 2932, 2931, 2930, 821: 2895, 7062, 7061, 827: 3038, 829: 2893, 7059, 7060, 7058, 840: 2894, 845: 7057, 851: 7070, 7065, 7068, 7069, 903: 2902, 915: 7071, 952: 7064, 970: 7063, 973: 7067, 975: 7066, 1029: 7076}, // 4200 - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 589: 6383, 777: 7071, 3067, 3068, 3066}, - {1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1253, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 58: 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 542: 1260, 547: 1253, 551: 1260, 554: 1260, 562: 1260, 568: 1260, 1260, 1260, 580: 1260, 720: 6385, 1014: 6384}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 536: 5995, 648: 5990, 777: 3949, 3067, 3068, 3066, 5994, 810: 5993, 901: 5992, 905: 5991, 5997, 961: 5987, 999: 7073}, - {424, 424, 9: 6041, 568: 4683, 895: 4684, 7074}, - {2356, 2356}, + {2329, 2329}, + {538: 7078}, + {84: 2885, 2888, 87: 2918, 2886, 197: 2901, 536: 2929, 2928, 552: 2927, 557: 2913, 561: 7056, 592: 2912, 613: 2926, 660: 2922, 718: 2884, 3039, 781: 7054, 809: 2892, 812: 7055, 2923, 2924, 2925, 2934, 2932, 2931, 2930, 821: 2895, 7062, 7061, 827: 3038, 829: 2893, 7059, 7060, 7058, 840: 2894, 845: 7057, 851: 7070, 7065, 7068, 7069, 903: 2902, 915: 7071, 952: 7064, 970: 7063, 973: 7067, 975: 7066, 1029: 7079}, + {2331, 2331}, + {2: 1272, 1272, 1272, 1272, 1272, 1272, 1272, 10: 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 58: 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 554: 1272, 566: 1272, 839: 6003, 841: 6002, 844: 6001, 942: 6004, 997: 7081}, // 4205 - {2359, 2359, 9: 4012}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 7152, 3067, 3068, 3066}, - {2: 2132, 2132, 2132, 2132, 2132, 2132, 2132, 10: 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 58: 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 583: 4970, 860: 7150}, - {2: 2132, 2132, 2132, 2132, 2132, 2132, 2132, 10: 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 58: 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 583: 4970, 860: 7141}, - {715: 7136}, + {2: 1259, 1259, 1259, 1259, 1259, 1259, 1259, 10: 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 58: 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 6393, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 554: 1259, 566: 1259, 1253: 7082}, + {2: 2137, 2137, 2137, 2137, 2137, 2137, 2137, 10: 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 58: 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 554: 4706, 566: 2137, 966: 7083}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 566: 7084, 777: 6397, 3072, 3073, 3071, 1026: 6398, 1092: 6396}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 565: 3955, 777: 7086, 3072, 3073, 3071, 810: 6410, 1026: 6398, 1092: 7085}, + {9: 6406, 547: 7089}, // 4210 - {157: 6118, 614: 6117, 1300: 7132}, - {204: 789, 217: 6182}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 583: 7127, 777: 3949, 3067, 3068, 3066, 810: 3950, 890: 7126}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 538: 3758, 583: 7123, 636: 5875, 777: 3759, 3067, 3068, 3066, 811: 5874, 861: 5876, 976: 7122}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 6327, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 538: 6332, 583: 7119, 777: 3759, 3067, 3068, 3066, 811: 5829, 904: 6334, 923: 6335, 6333, 972: 7118}, + {1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1261, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 58: 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 542: 1270, 547: 1261, 551: 1270, 554: 1270, 560: 1270, 569: 1270, 1270, 1270, 581: 1270, 720: 7087, 1016: 6399}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 565: 6402, 777: 7088, 3072, 3073, 3071}, + {1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1261, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 58: 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 542: 1269, 547: 1261, 551: 1269, 554: 1269, 560: 1269, 569: 1269, 1269, 1269, 581: 1269, 720: 6404, 1016: 6403}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 536: 6015, 565: 3955, 648: 6010, 777: 3954, 3072, 3073, 3071, 6014, 810: 6013, 900: 6012, 905: 6011, 6017, 963: 6007, 1001: 7090}, + {431, 431, 9: 6061, 569: 4692, 895: 4693, 7091}, // 4215 - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 3949, 3067, 3068, 3066, 810: 7114, 890: 7113}, - {22: 7110}, - {204: 7102}, - {215: 7099}, - {576: 7096}, + {2362, 2362}, + {2365, 2365, 9: 4020}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 7165, 3072, 3073, 3071}, + {2: 2141, 2141, 2141, 2141, 2141, 2141, 2141, 10: 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 58: 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 584: 4979, 860: 7163}, + {2: 2141, 2141, 2141, 2141, 2141, 2141, 2141, 10: 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 58: 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 584: 4979, 860: 7154}, // 4220 - {2: 2132, 2132, 2132, 2132, 2132, 2132, 2132, 10: 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 58: 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 583: 4970, 860: 7094}, - {2: 2132, 2132, 2132, 2132, 2132, 2132, 2132, 10: 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 58: 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 583: 4970, 860: 7092}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 3949, 3067, 3068, 3066, 810: 7093}, - {29, 29}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 3949, 3067, 3068, 3066, 810: 3950, 890: 7095}, + {715: 7149}, + {155: 5721, 613: 5720, 1094: 7145}, + {204: 797, 218: 6201}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 565: 3955, 584: 7140, 777: 3954, 3072, 3073, 3071, 810: 3956, 889: 7139}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 538: 3763, 584: 7136, 636: 5895, 777: 3764, 3072, 3073, 3071, 811: 5894, 861: 5896, 977: 7135}, // 4225 - {165, 165, 9: 3952}, - {2: 2132, 2132, 2132, 2132, 2132, 2132, 2132, 10: 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 58: 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 540: 2132, 583: 4970, 860: 7097}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 540: 4618, 777: 4617, 3067, 3068, 3066, 942: 7098}, - {192, 192}, - {2: 2132, 2132, 2132, 2132, 2132, 2132, 2132, 10: 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 58: 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 583: 4970, 860: 7100}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 6346, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 538: 6351, 584: 7132, 777: 3764, 3072, 3073, 3071, 811: 5849, 904: 6353, 925: 6354, 6352, 974: 7131}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 565: 3955, 777: 3954, 3072, 3073, 3071, 810: 7127, 889: 7126}, + {204: 7118}, + {215: 7115}, + {577: 7112}, // 4230 - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 5538, 3067, 3068, 3066, 995: 7101}, - {195, 195}, - {563: 7103}, - {536: 2923, 2922, 552: 2921, 557: 2907, 592: 2906, 614: 2920, 661: 7105, 701: 2916, 719: 3035, 781: 6357, 809: 6355, 812: 6358, 2917, 2918, 2919, 2928, 818: 2926, 2925, 2924, 822: 6356, 6360, 6359, 828: 3034, 6362, 6363, 832: 6364, 6361, 950: 7104}, - {343, 343, 547: 7108}, + {2: 2141, 2141, 2141, 2141, 2141, 2141, 2141, 10: 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 58: 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 565: 2141, 584: 4979, 860: 7110}, + {2: 2141, 2141, 2141, 2141, 2141, 2141, 2141, 10: 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 58: 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 565: 2141, 584: 4979, 860: 7108}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 565: 3955, 777: 3954, 3072, 3073, 3071, 810: 7109}, + {29, 29}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 565: 3955, 777: 3954, 3072, 3073, 3071, 810: 3956, 889: 7111}, // 4235 - {219: 7106}, - {538: 7107}, - {341, 341}, - {536: 2923, 2922, 552: 2921, 557: 2907, 592: 2906, 614: 2920, 701: 2916, 719: 3035, 781: 6357, 809: 6355, 812: 6358, 2917, 2918, 2919, 2928, 818: 2926, 2925, 2924, 822: 6356, 6360, 6359, 828: 3034, 6362, 6363, 832: 6364, 6361, 950: 7109}, - {342, 342}, + {165, 165, 9: 3958}, + {2: 2141, 2141, 2141, 2141, 2141, 2141, 2141, 10: 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 58: 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 540: 2141, 584: 4979, 860: 7113}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 540: 4626, 777: 4625, 3072, 3073, 3071, 944: 7114}, + {192, 192}, + {2: 2141, 2141, 2141, 2141, 2141, 2141, 2141, 10: 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 58: 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 584: 4979, 860: 7116}, // 4240 - {178: 7111}, - {564: 3053, 805: 4560, 831: 7112}, - {2227, 2227}, - {2337, 2337, 9: 3952}, - {1259, 1259, 9: 1259, 208: 7116, 551: 7115}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 5547, 3072, 3073, 3071, 996: 7117}, + {195, 195}, + {563: 7119}, + {536: 2929, 2928, 552: 2927, 557: 2913, 592: 2912, 613: 2926, 660: 2922, 7121, 719: 3039, 781: 6376, 809: 6374, 812: 6377, 2923, 2924, 2925, 2934, 2932, 2931, 2930, 821: 6375, 6379, 6378, 827: 3038, 829: 6381, 6382, 6383, 6380, 935: 7120}, + {349, 349, 547: 7124}, // 4245 - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 5277, 3067, 3068, 3066, 865: 7117}, - {2335, 2335}, - {2336, 2336, 9: 5278}, - {2339, 2339, 9: 6336}, - {650: 7120}, + {220: 7122}, + {538: 7123}, + {347, 347}, + {536: 2929, 2928, 552: 2927, 557: 2913, 592: 2912, 613: 2926, 660: 2922, 719: 3039, 781: 6376, 809: 6374, 812: 6377, 2923, 2924, 2925, 2934, 2932, 2931, 2930, 821: 6375, 6379, 6378, 827: 3038, 829: 6381, 6382, 6383, 6380, 935: 7125}, + {348, 348}, // 4250 - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 6327, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 538: 6332, 777: 3759, 3067, 3068, 3066, 811: 5829, 904: 6334, 923: 6335, 6333, 972: 7121}, - {2338, 2338, 9: 6336}, - {2341, 2341, 9: 5878}, - {650: 7124}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 538: 3758, 636: 5875, 777: 3759, 3067, 3068, 3066, 811: 5874, 861: 5876, 976: 7125}, + {2343, 2343, 9: 3958}, + {1267, 1267, 9: 1267, 208: 7129, 551: 7128}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 5286, 3072, 3073, 3071, 865: 7130}, + {2341, 2341}, + {2342, 2342, 9: 5287}, // 4255 - {2340, 2340, 9: 5878}, - {2334, 2334, 9: 3952, 733: 5336, 735: 5335, 1018: 7131}, - {650: 7128}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 3949, 3067, 3068, 3066, 810: 3950, 890: 7129}, - {2334, 2334, 9: 3952, 733: 5336, 735: 5335, 1018: 7130}, + {2345, 2345, 9: 6355}, + {650: 7133}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 6346, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 538: 6351, 777: 3764, 3072, 3073, 3071, 811: 5849, 904: 6353, 925: 6354, 6352, 974: 7134}, + {2344, 2344, 9: 6355}, + {2347, 2347, 9: 5898}, // 4260 - {2342, 2342}, - {2343, 2343}, - {2: 2132, 2132, 2132, 2132, 2132, 2132, 2132, 10: 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 58: 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 583: 4970, 860: 7133}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 3949, 3067, 3068, 3066, 810: 3950, 890: 7134}, - {2334, 2334, 9: 3952, 733: 5336, 735: 5335, 1018: 7135}, + {650: 7137}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 538: 3763, 636: 5895, 777: 3764, 3072, 3073, 3071, 811: 5894, 861: 5896, 977: 7138}, + {2346, 2346, 9: 5898}, + {2340, 2340, 9: 3958, 733: 5345, 735: 5344, 1020: 7144}, + {650: 7141}, // 4265 - {2347, 2347}, - {2: 2132, 2132, 2132, 2132, 2132, 2132, 2132, 10: 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 58: 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 583: 4970, 860: 7137}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 7138, 3067, 3068, 3066}, - {535: 7139}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 3949, 3067, 3068, 3066, 810: 7140}, - // 4270 + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 565: 3955, 777: 3954, 3072, 3073, 3071, 810: 3956, 889: 7142}, + {2340, 2340, 9: 3958, 733: 5345, 735: 5344, 1020: 7143}, {2348, 2348}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 7142, 3067, 3068, 3066}, - {535: 7143}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 3949, 3067, 3068, 3066, 810: 7144}, - {2490, 2490, 102: 4741, 567: 4742, 978: 7146, 992: 7145, 1199: 7147}, - // 4275 - {2489, 2489, 102: 4741, 978: 7149}, - {2488, 2488, 567: 4742, 992: 7148}, {2349, 2349}, - {2486, 2486}, - {2487, 2487}, + {2: 2141, 2141, 2141, 2141, 2141, 2141, 2141, 10: 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 58: 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 565: 2141, 584: 4979, 860: 7146}, + // 4270 + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 565: 3955, 777: 3954, 3072, 3073, 3071, 810: 3956, 889: 7147}, + {2340, 2340, 9: 3958, 733: 5345, 735: 5344, 1020: 7148}, + {2353, 2353}, + {2: 2141, 2141, 2141, 2141, 2141, 2141, 2141, 10: 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 58: 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 584: 4979, 860: 7150}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 7151, 3072, 3073, 3071}, + // 4275 + {535: 7152}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 565: 3955, 777: 3954, 3072, 3073, 3071, 810: 7153}, + {2354, 2354}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 7155, 3072, 3073, 3071}, + {535: 7156}, // 4280 - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 5976, 3067, 3068, 3066, 913: 7151}, - {2350, 2350}, - {2498, 2498}, - {2: 2130, 2130, 2130, 2130, 2130, 2130, 2130, 10: 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 58: 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 583: 5367, 889: 7624}, - {715: 7612}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 565: 3955, 777: 3954, 3072, 3073, 3071, 810: 7157}, + {2496, 2496, 102: 4750, 568: 4751, 979: 7159, 993: 7158, 1200: 7160}, + {2495, 2495, 102: 4750, 979: 7162}, + {2494, 2494, 568: 4751, 993: 7161}, + {2355, 2355}, // 4285 - {715: 2484}, - {715: 2483}, - {715: 2482}, - {2: 2130, 2130, 2130, 2130, 2130, 2130, 2130, 10: 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 58: 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 583: 5367, 889: 7589}, - {18: 7507, 102: 7506, 132: 2376, 181: 2376, 661: 2376, 1499: 7505}, + {2492, 2492}, + {2493, 2493}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 5996, 3072, 3073, 3071, 913: 7164}, + {2356, 2356}, + {2504, 2504}, // 4290 - {557: 7504}, - {2: 2130, 2130, 2130, 2130, 2130, 2130, 2130, 10: 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 58: 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 538: 2130, 583: 5367, 636: 2130, 889: 7452}, - {2: 2130, 2130, 2130, 2130, 2130, 2130, 2130, 10: 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 58: 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 538: 2130, 583: 5367, 889: 7446}, - {204: 7435}, - {576: 7376}, + {2: 2139, 2139, 2139, 2139, 2139, 2139, 2139, 10: 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 58: 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 584: 5376, 890: 7639}, + {715: 7627}, + {715: 2490}, + {715: 2489}, + {715: 2488}, // 4295 - {2: 2130, 2130, 2130, 2130, 2130, 2130, 2130, 10: 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 58: 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 583: 5367, 889: 7340}, - {2: 2130, 2130, 2130, 2130, 2130, 2130, 2130, 10: 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 58: 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 583: 5367, 889: 7167}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 3949, 3067, 3068, 3066, 810: 7168}, - {536: 7169}, - {2: 128, 128, 128, 128, 128, 128, 128, 10: 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 133, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 611: 7173, 1200: 7175, 1234: 7174, 1285: 7172, 7171, 1413: 7176, 1470: 7170}, + {2: 2139, 2139, 2139, 2139, 2139, 2139, 2139, 10: 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 58: 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 584: 5376, 890: 7604}, + {18: 7522, 102: 7521, 133: 2382, 181: 2382, 661: 2382, 1499: 7520}, + {557: 7519}, + {2: 2139, 2139, 2139, 2139, 2139, 2139, 2139, 10: 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 58: 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 538: 2139, 584: 5376, 636: 2139, 890: 7467}, + {2: 2139, 2139, 2139, 2139, 2139, 2139, 2139, 10: 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 58: 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 538: 2139, 584: 5376, 890: 7461}, // 4300 - {9: 7338, 57: 132}, + {204: 7448}, + {577: 7389}, + {2: 2139, 2139, 2139, 2139, 2139, 2139, 2139, 10: 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 58: 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 565: 2139, 584: 5376, 890: 7353}, + {2: 2139, 2139, 2139, 2139, 2139, 2139, 2139, 10: 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 58: 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 565: 2139, 584: 5376, 890: 7180}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 565: 3955, 777: 3954, 3072, 3073, 3071, 810: 7181}, + // 4305 + {536: 7182}, + {2: 128, 128, 128, 128, 128, 128, 128, 10: 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 133, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 611: 7186, 1201: 7188, 1235: 7187, 1284: 7185, 7184, 1412: 7189, 1470: 7183}, + {9: 7351, 57: 132}, {9: 130, 57: 130}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 7336, 3067, 3068, 3066}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 7349, 3072, 3073, 3071}, + // 4310 {2: 127, 127, 127, 127, 127, 127, 127, 10: 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 58: 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127}, {2: 126, 126, 126, 126, 126, 126, 126, 10: 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 58: 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126}, - // 4305 {2: 125, 125, 125, 125, 125, 125, 125, 10: 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 58: 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125}, - {57: 7177}, - {56: 7205, 84: 7197, 2882, 87: 2912, 89: 3033, 92: 7194, 94: 7196, 536: 2923, 2922, 552: 2921, 557: 2907, 559: 7195, 7039, 580: 3036, 582: 2893, 7198, 587: 2891, 592: 2906, 614: 2920, 624: 7201, 631: 7204, 701: 2916, 718: 2878, 3035, 781: 7178, 809: 2886, 812: 7179, 2917, 2918, 2919, 2928, 818: 2926, 2925, 2924, 822: 2889, 7180, 7189, 828: 3034, 2887, 7184, 832: 7185, 7182, 2892, 837: 7203, 839: 2888, 7206, 7207, 845: 7190, 851: 7191, 7186, 7187, 7181, 863: 7188, 2894, 866: 7192, 7183, 872: 7193, 7202, 7211, 7214, 7215, 7210, 7218, 7216, 7217, 7219, 7213, 7220, 7200, 7199, 7208, 7209, 7212}, - {122, 122, 544: 1020, 555: 1020, 1020, 559: 3881, 562: 3880, 569: 3879, 848: 3882, 3883}, - {124, 124, 544: 1021, 555: 1021, 1021}, - // 4310 + {57: 7190}, + {56: 7218, 84: 7210, 2888, 87: 2918, 89: 3037, 92: 7207, 94: 7209, 536: 2929, 2928, 552: 2927, 557: 2913, 559: 7208, 561: 7056, 581: 3040, 583: 2899, 7211, 588: 2897, 592: 2912, 613: 2926, 630: 7214, 7217, 660: 2922, 718: 2884, 3039, 781: 7191, 809: 2892, 812: 7192, 2923, 2924, 2925, 2934, 2932, 2931, 2930, 821: 2895, 7193, 7202, 827: 3038, 829: 2893, 7197, 7198, 7195, 2898, 836: 7216, 840: 2894, 842: 7219, 7220, 845: 7203, 851: 7204, 7199, 7200, 7194, 863: 7201, 2900, 866: 7205, 7196, 872: 7206, 7215, 7224, 7227, 7228, 7223, 7231, 7229, 7230, 7232, 7226, 7233, 7213, 7212, 7221, 7222, 7225}, + // 4315 + {122, 122, 544: 1028, 555: 1028, 1028, 559: 3886, 3885, 570: 3884, 847: 3887, 3888}, + {124, 124, 544: 1029, 555: 1029, 1029}, {123, 123}, {121, 121}, {120, 120}, + // 4320 {119, 119}, {118, 118}, - // 4315 {117, 117}, {116, 116}, {115, 115}, + // 4325 {114, 114}, {113, 113}, - // 4320 {112, 112}, {111, 111}, {110, 110}, + // 4330 {105, 105}, - {56: 7335}, - // 4325 - {56: 82, 265: 7326, 566: 7327, 1440: 7325}, - {56: 7324}, - {56: 77, 84: 77, 77, 87: 77, 89: 77, 92: 77, 94: 77, 97: 77, 230: 7277, 536: 77, 77, 552: 77, 557: 77, 559: 77, 77, 580: 77, 582: 77, 77, 587: 77, 592: 77, 614: 77, 624: 77, 631: 77, 701: 77, 718: 77, 77, 809: 77, 834: 77, 837: 77, 840: 77, 77, 1250: 7279, 1434: 7278, 7280}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 7266, 1252: 7267}, + {56: 7348}, + {56: 82, 265: 7339, 566: 7340, 1439: 7338}, + {56: 7337}, + {56: 77, 84: 77, 77, 87: 77, 89: 77, 92: 77, 94: 77, 97: 77, 230: 7290, 536: 77, 77, 552: 77, 557: 77, 559: 77, 561: 77, 581: 77, 583: 77, 77, 588: 77, 592: 77, 613: 77, 630: 77, 77, 660: 77, 718: 77, 77, 809: 77, 833: 77, 836: 77, 842: 77, 77, 1250: 7292, 1433: 7291, 7293}, + // 4335 + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 7279, 1252: 7280}, {63, 63}, - // 4330 {62, 62}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 594: 7246, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 7243, 1271: 7244, 1452: 7245}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 594: 7259, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 7256, 1270: 7257, 1452: 7258}, {51, 51}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 7238}, - {56: 7205, 84: 7197, 2882, 87: 2912, 89: 3033, 92: 7194, 94: 7196, 536: 2923, 2922, 552: 2921, 557: 2907, 559: 7195, 7039, 580: 3036, 582: 2893, 7198, 587: 2891, 592: 2906, 614: 2920, 624: 7201, 631: 7204, 701: 2916, 718: 2878, 3035, 781: 7178, 809: 2886, 812: 7179, 2917, 2918, 2919, 2928, 818: 2926, 2925, 2924, 822: 2889, 7180, 7189, 828: 3034, 2887, 7184, 832: 7185, 7182, 2892, 837: 7203, 839: 2888, 7206, 7207, 845: 7190, 851: 7191, 7186, 7187, 7181, 863: 7188, 2894, 866: 7192, 7183, 872: 7193, 7202, 7211, 7214, 7215, 7210, 7218, 7216, 7217, 7219, 7213, 7229, 7200, 7199, 7208, 7209, 7212, 941: 7230}, - // 4335 - {1316: 7223}, - {56: 7222}, - {56: 7221}, + // 4340 + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 7251}, + {56: 7218, 84: 7210, 2888, 87: 2918, 89: 3037, 92: 7207, 94: 7209, 536: 2929, 2928, 552: 2927, 557: 2913, 559: 7208, 561: 7056, 581: 3040, 583: 2899, 7211, 588: 2897, 592: 2912, 613: 2926, 630: 7214, 7217, 660: 2922, 718: 2884, 3039, 781: 7191, 809: 2892, 812: 7192, 2923, 2924, 2925, 2934, 2932, 2931, 2930, 821: 2895, 7193, 7202, 827: 3038, 829: 2893, 7197, 7198, 7195, 2898, 836: 7216, 840: 2894, 842: 7219, 7220, 845: 7203, 851: 7204, 7199, 7200, 7194, 863: 7201, 2900, 866: 7205, 7196, 872: 7206, 7215, 7224, 7227, 7228, 7223, 7231, 7229, 7230, 7232, 7226, 7242, 7213, 7212, 7221, 7222, 7225, 943: 7243}, + {1314: 7236}, + {56: 7235}, + {56: 7234}, + // 4345 {42, 42}, {41, 41}, - // 4340 {40, 40}, {39, 39}, {38, 38}, + // 4350 {37, 37}, {36, 36}, - // 4345 {35, 35}, {34, 34}, {33, 33}, + // 4355 {32, 32}, {31, 31}, - // 4350 {30, 30}, {43, 43}, {44, 44}, - {84: 7197, 631: 7204, 837: 7203, 872: 7224, 7225}, - {47, 47, 56: 7226, 1249: 7228}, - // 4355 - {47, 47, 56: 7226, 1249: 7227}, - {46, 46}, - {45, 45}, - {48, 48}, - {7237}, // 4360 - {56: 7205, 84: 7197, 2882, 87: 2912, 89: 3033, 92: 7194, 94: 7196, 536: 2923, 2922, 552: 2921, 557: 2907, 559: 7195, 7039, 580: 3036, 582: 2893, 7198, 587: 2891, 592: 2906, 614: 2920, 624: 7201, 631: 7204, 701: 2916, 718: 2878, 3035, 781: 7178, 809: 2886, 812: 7179, 2917, 2918, 2919, 2928, 818: 2926, 2925, 2924, 822: 2889, 7180, 7189, 828: 3034, 2887, 7184, 832: 7185, 7182, 2892, 837: 7203, 839: 2888, 7206, 7207, 845: 7190, 851: 7191, 7186, 7187, 7181, 863: 7188, 2894, 866: 7192, 7183, 872: 7193, 7202, 7211, 7214, 7215, 7210, 7218, 7216, 7217, 7219, 7213, 7231, 7200, 7199, 7208, 7209, 7212, 1097: 7232}, - {7236}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 7233}, - {97: 7234, 571: 3767, 3765, 3766, 3764, 3762, 806: 3763, 3761}, - {631: 7235}, + {84: 7210, 631: 7217, 836: 7216, 872: 7237, 7238}, + {47, 47, 56: 7239, 1249: 7241}, + {47, 47, 56: 7239, 1249: 7240}, + {46, 46}, + {45, 45}, // 4365 - {49, 49, 56: 49}, - {56: 70, 84: 70, 70, 87: 70, 89: 70, 92: 70, 94: 70, 97: 70, 536: 70, 70, 552: 70, 557: 70, 559: 70, 70, 580: 70, 582: 70, 70, 587: 70, 592: 70, 594: 70, 70, 614: 70, 624: 70, 631: 70, 701: 70, 718: 70, 70, 809: 70, 834: 70, 837: 70, 840: 70, 70, 1049: 70, 1097: 70}, - {56: 71, 84: 71, 71, 87: 71, 89: 71, 92: 71, 94: 71, 97: 71, 536: 71, 71, 552: 71, 557: 71, 559: 71, 71, 580: 71, 582: 71, 71, 587: 71, 592: 71, 594: 71, 71, 614: 71, 624: 71, 631: 71, 701: 71, 718: 71, 71, 809: 71, 834: 71, 837: 71, 840: 71, 71, 1049: 71, 1097: 71}, - {254: 7239, 571: 3767, 3765, 3766, 3764, 3762, 806: 3763, 3761}, - {56: 7205, 84: 7197, 2882, 87: 2912, 89: 3033, 92: 7194, 94: 7196, 536: 2923, 2922, 552: 2921, 557: 2907, 559: 7195, 7039, 580: 3036, 582: 2893, 7198, 587: 2891, 592: 2906, 614: 2920, 624: 7201, 631: 7204, 701: 2916, 718: 2878, 3035, 781: 7178, 809: 2886, 812: 7179, 2917, 2918, 2919, 2928, 818: 2926, 2925, 2924, 822: 2889, 7180, 7189, 828: 3034, 2887, 7184, 832: 7185, 7182, 2892, 837: 7203, 839: 2888, 7206, 7207, 845: 7190, 851: 7191, 7186, 7187, 7181, 863: 7188, 2894, 866: 7192, 7183, 872: 7193, 7202, 7211, 7214, 7215, 7210, 7218, 7216, 7217, 7219, 7213, 7229, 7200, 7199, 7208, 7209, 7212, 941: 7240}, + {48, 48}, + {7250}, + {56: 7218, 84: 7210, 2888, 87: 2918, 89: 3037, 92: 7207, 94: 7209, 536: 2929, 2928, 552: 2927, 557: 2913, 559: 7208, 561: 7056, 581: 3040, 583: 2899, 7211, 588: 2897, 592: 2912, 613: 2926, 630: 7214, 7217, 660: 2922, 718: 2884, 3039, 781: 7191, 809: 2892, 812: 7192, 2923, 2924, 2925, 2934, 2932, 2931, 2930, 821: 2895, 7193, 7202, 827: 3038, 829: 2893, 7197, 7198, 7195, 2898, 836: 7216, 840: 2894, 842: 7219, 7220, 845: 7203, 851: 7204, 7199, 7200, 7194, 863: 7201, 2900, 866: 7205, 7196, 872: 7206, 7215, 7224, 7227, 7228, 7223, 7231, 7229, 7230, 7232, 7226, 7244, 7213, 7212, 7221, 7222, 7225, 1100: 7245}, + {7249}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 7246}, // 4370 - {56: 7205, 84: 7197, 2882, 87: 2912, 89: 3033, 92: 7194, 94: 7196, 97: 7241, 536: 2923, 2922, 552: 2921, 557: 2907, 559: 7195, 7039, 580: 3036, 582: 2893, 7198, 587: 2891, 592: 2906, 614: 2920, 624: 7201, 631: 7204, 701: 2916, 718: 2878, 3035, 781: 7178, 809: 2886, 812: 7179, 2917, 2918, 2919, 2928, 818: 2926, 2925, 2924, 822: 2889, 7180, 7189, 828: 3034, 2887, 7184, 832: 7185, 7182, 2892, 837: 7203, 839: 2888, 7206, 7207, 845: 7190, 851: 7191, 7186, 7187, 7181, 863: 7188, 2894, 866: 7192, 7183, 872: 7193, 7202, 7211, 7214, 7215, 7210, 7218, 7216, 7217, 7219, 7213, 7231, 7200, 7199, 7208, 7209, 7212}, - {837: 7242}, - {50, 50, 56: 50}, - {571: 3767, 3765, 3766, 3764, 3762, 594: 7258, 806: 3763, 3761, 1282: 7256, 1467: 7257}, - {97: 59, 594: 59, 59}, + {97: 7247, 572: 3772, 3770, 3771, 3769, 3767, 806: 3768, 3766}, + {631: 7248}, + {49, 49, 56: 49}, + {56: 70, 84: 70, 70, 87: 70, 89: 70, 92: 70, 94: 70, 97: 70, 536: 70, 70, 552: 70, 557: 70, 559: 70, 561: 70, 581: 70, 583: 70, 70, 588: 70, 592: 70, 594: 70, 70, 613: 70, 630: 70, 70, 660: 70, 718: 70, 70, 809: 70, 833: 70, 836: 70, 842: 70, 70, 1050: 70, 1100: 70}, + {56: 71, 84: 71, 71, 87: 71, 89: 71, 92: 71, 94: 71, 97: 71, 536: 71, 71, 552: 71, 557: 71, 559: 71, 561: 71, 581: 71, 583: 71, 71, 588: 71, 592: 71, 594: 71, 71, 613: 71, 630: 71, 71, 660: 71, 718: 71, 71, 809: 71, 833: 71, 836: 71, 842: 71, 71, 1050: 71, 1100: 71}, // 4375 - {97: 55, 594: 7246, 7251, 1171: 7252, 1271: 7250}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 7247}, - {571: 3767, 3765, 3766, 3764, 3762, 612: 7248, 806: 3763, 3761}, - {56: 7205, 84: 7197, 2882, 87: 2912, 89: 3033, 92: 7194, 94: 7196, 536: 2923, 2922, 552: 2921, 557: 2907, 559: 7195, 7039, 580: 3036, 582: 2893, 7198, 587: 2891, 592: 2906, 614: 2920, 624: 7201, 631: 7204, 701: 2916, 718: 2878, 3035, 781: 7178, 809: 2886, 812: 7179, 2917, 2918, 2919, 2928, 818: 2926, 2925, 2924, 822: 2889, 7180, 7189, 828: 3034, 2887, 7184, 832: 7185, 7182, 2892, 837: 7203, 839: 2888, 7206, 7207, 845: 7190, 851: 7191, 7186, 7187, 7181, 863: 7188, 2894, 866: 7192, 7183, 872: 7193, 7202, 7211, 7214, 7215, 7210, 7218, 7216, 7217, 7219, 7213, 7229, 7200, 7199, 7208, 7209, 7212, 941: 7249}, - {56: 7205, 84: 7197, 2882, 87: 2912, 89: 3033, 92: 7194, 94: 7196, 97: 56, 536: 2923, 2922, 552: 2921, 557: 2907, 559: 7195, 7039, 580: 3036, 582: 2893, 7198, 587: 2891, 592: 2906, 594: 56, 56, 614: 2920, 624: 7201, 631: 7204, 701: 2916, 718: 2878, 3035, 781: 7178, 809: 2886, 812: 7179, 2917, 2918, 2919, 2928, 818: 2926, 2925, 2924, 822: 2889, 7180, 7189, 828: 3034, 2887, 7184, 832: 7185, 7182, 2892, 837: 7203, 839: 2888, 7206, 7207, 845: 7190, 851: 7191, 7186, 7187, 7181, 863: 7188, 2894, 866: 7192, 7183, 872: 7193, 7202, 7211, 7214, 7215, 7210, 7218, 7216, 7217, 7219, 7213, 7231, 7200, 7199, 7208, 7209, 7212}, + {254: 7252, 572: 3772, 3770, 3771, 3769, 3767, 806: 3768, 3766}, + {56: 7218, 84: 7210, 2888, 87: 2918, 89: 3037, 92: 7207, 94: 7209, 536: 2929, 2928, 552: 2927, 557: 2913, 559: 7208, 561: 7056, 581: 3040, 583: 2899, 7211, 588: 2897, 592: 2912, 613: 2926, 630: 7214, 7217, 660: 2922, 718: 2884, 3039, 781: 7191, 809: 2892, 812: 7192, 2923, 2924, 2925, 2934, 2932, 2931, 2930, 821: 2895, 7193, 7202, 827: 3038, 829: 2893, 7197, 7198, 7195, 2898, 836: 7216, 840: 2894, 842: 7219, 7220, 845: 7203, 851: 7204, 7199, 7200, 7194, 863: 7201, 2900, 866: 7205, 7196, 872: 7206, 7215, 7224, 7227, 7228, 7223, 7231, 7229, 7230, 7232, 7226, 7242, 7213, 7212, 7221, 7222, 7225, 943: 7253}, + {56: 7218, 84: 7210, 2888, 87: 2918, 89: 3037, 92: 7207, 94: 7209, 97: 7254, 536: 2929, 2928, 552: 2927, 557: 2913, 559: 7208, 561: 7056, 581: 3040, 583: 2899, 7211, 588: 2897, 592: 2912, 613: 2926, 630: 7214, 7217, 660: 2922, 718: 2884, 3039, 781: 7191, 809: 2892, 812: 7192, 2923, 2924, 2925, 2934, 2932, 2931, 2930, 821: 2895, 7193, 7202, 827: 3038, 829: 2893, 7197, 7198, 7195, 2898, 836: 7216, 840: 2894, 842: 7219, 7220, 845: 7203, 851: 7204, 7199, 7200, 7194, 863: 7201, 2900, 866: 7205, 7196, 872: 7206, 7215, 7224, 7227, 7228, 7223, 7231, 7229, 7230, 7232, 7226, 7244, 7213, 7212, 7221, 7222, 7225}, + {836: 7255}, + {50, 50, 56: 50}, // 4380 + {572: 3772, 3770, 3771, 3769, 3767, 594: 7271, 806: 3768, 3766, 1281: 7269, 1467: 7270}, + {97: 59, 594: 59, 59}, + {97: 55, 594: 7259, 7264, 1173: 7265, 1270: 7263}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 7260}, + {572: 3772, 3770, 3771, 3769, 3767, 612: 7261, 806: 3768, 3766}, + // 4385 + {56: 7218, 84: 7210, 2888, 87: 2918, 89: 3037, 92: 7207, 94: 7209, 536: 2929, 2928, 552: 2927, 557: 2913, 559: 7208, 561: 7056, 581: 3040, 583: 2899, 7211, 588: 2897, 592: 2912, 613: 2926, 630: 7214, 7217, 660: 2922, 718: 2884, 3039, 781: 7191, 809: 2892, 812: 7192, 2923, 2924, 2925, 2934, 2932, 2931, 2930, 821: 2895, 7193, 7202, 827: 3038, 829: 2893, 7197, 7198, 7195, 2898, 836: 7216, 840: 2894, 842: 7219, 7220, 845: 7203, 851: 7204, 7199, 7200, 7194, 863: 7201, 2900, 866: 7205, 7196, 872: 7206, 7215, 7224, 7227, 7228, 7223, 7231, 7229, 7230, 7232, 7226, 7242, 7213, 7212, 7221, 7222, 7225, 943: 7262}, + {56: 7218, 84: 7210, 2888, 87: 2918, 89: 3037, 92: 7207, 94: 7209, 97: 56, 536: 2929, 2928, 552: 2927, 557: 2913, 559: 7208, 561: 7056, 581: 3040, 583: 2899, 7211, 588: 2897, 592: 2912, 594: 56, 56, 613: 2926, 630: 7214, 7217, 660: 2922, 718: 2884, 3039, 781: 7191, 809: 2892, 812: 7192, 2923, 2924, 2925, 2934, 2932, 2931, 2930, 821: 2895, 7193, 7202, 827: 3038, 829: 2893, 7197, 7198, 7195, 2898, 836: 7216, 840: 2894, 842: 7219, 7220, 845: 7203, 851: 7204, 7199, 7200, 7194, 863: 7201, 2900, 866: 7205, 7196, 872: 7206, 7215, 7224, 7227, 7228, 7223, 7231, 7229, 7230, 7232, 7226, 7244, 7213, 7212, 7221, 7222, 7225}, {97: 58, 594: 58, 58}, - {56: 7205, 84: 7197, 2882, 87: 2912, 89: 3033, 92: 7194, 94: 7196, 536: 2923, 2922, 552: 2921, 557: 2907, 559: 7195, 7039, 580: 3036, 582: 2893, 7198, 587: 2891, 592: 2906, 614: 2920, 624: 7201, 631: 7204, 701: 2916, 718: 2878, 3035, 781: 7178, 809: 2886, 812: 7179, 2917, 2918, 2919, 2928, 818: 2926, 2925, 2924, 822: 2889, 7180, 7189, 828: 3034, 2887, 7184, 832: 7185, 7182, 2892, 837: 7203, 839: 2888, 7206, 7207, 845: 7190, 851: 7191, 7186, 7187, 7181, 863: 7188, 2894, 866: 7192, 7183, 872: 7193, 7202, 7211, 7214, 7215, 7210, 7218, 7216, 7217, 7219, 7213, 7229, 7200, 7199, 7208, 7209, 7212, 941: 7255}, - {97: 7253}, - {624: 7254}, + {56: 7218, 84: 7210, 2888, 87: 2918, 89: 3037, 92: 7207, 94: 7209, 536: 2929, 2928, 552: 2927, 557: 2913, 559: 7208, 561: 7056, 581: 3040, 583: 2899, 7211, 588: 2897, 592: 2912, 613: 2926, 630: 7214, 7217, 660: 2922, 718: 2884, 3039, 781: 7191, 809: 2892, 812: 7192, 2923, 2924, 2925, 2934, 2932, 2931, 2930, 821: 2895, 7193, 7202, 827: 3038, 829: 2893, 7197, 7198, 7195, 2898, 836: 7216, 840: 2894, 842: 7219, 7220, 845: 7203, 851: 7204, 7199, 7200, 7194, 863: 7201, 2900, 866: 7205, 7196, 872: 7206, 7215, 7224, 7227, 7228, 7223, 7231, 7229, 7230, 7232, 7226, 7242, 7213, 7212, 7221, 7222, 7225, 943: 7268}, + {97: 7266}, + // 4390 + {630: 7267}, {52, 52}, - // 4385 - {56: 7205, 84: 7197, 2882, 87: 2912, 89: 3033, 92: 7194, 94: 7196, 97: 54, 536: 2923, 2922, 552: 2921, 557: 2907, 559: 7195, 7039, 580: 3036, 582: 2893, 7198, 587: 2891, 592: 2906, 614: 2920, 624: 7201, 631: 7204, 701: 2916, 718: 2878, 3035, 781: 7178, 809: 2886, 812: 7179, 2917, 2918, 2919, 2928, 818: 2926, 2925, 2924, 822: 2889, 7180, 7189, 828: 3034, 2887, 7184, 832: 7185, 7182, 2892, 837: 7203, 839: 2888, 7206, 7207, 845: 7190, 851: 7191, 7186, 7187, 7181, 863: 7188, 2894, 866: 7192, 7183, 872: 7193, 7202, 7211, 7214, 7215, 7210, 7218, 7216, 7217, 7219, 7213, 7231, 7200, 7199, 7208, 7209, 7212}, + {56: 7218, 84: 7210, 2888, 87: 2918, 89: 3037, 92: 7207, 94: 7209, 97: 54, 536: 2929, 2928, 552: 2927, 557: 2913, 559: 7208, 561: 7056, 581: 3040, 583: 2899, 7211, 588: 2897, 592: 2912, 613: 2926, 630: 7214, 7217, 660: 2922, 718: 2884, 3039, 781: 7191, 809: 2892, 812: 7192, 2923, 2924, 2925, 2934, 2932, 2931, 2930, 821: 2895, 7193, 7202, 827: 3038, 829: 2893, 7197, 7198, 7195, 2898, 836: 7216, 840: 2894, 842: 7219, 7220, 845: 7203, 851: 7204, 7199, 7200, 7194, 863: 7201, 2900, 866: 7205, 7196, 872: 7206, 7215, 7224, 7227, 7228, 7223, 7231, 7229, 7230, 7232, 7226, 7244, 7213, 7212, 7221, 7222, 7225}, {97: 61, 594: 61, 61}, - {97: 55, 594: 7258, 7251, 1171: 7263, 1282: 7262}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 7259}, - {571: 3767, 3765, 3766, 3764, 3762, 612: 7260, 806: 3763, 3761}, - // 4390 - {56: 7205, 84: 7197, 2882, 87: 2912, 89: 3033, 92: 7194, 94: 7196, 536: 2923, 2922, 552: 2921, 557: 2907, 559: 7195, 7039, 580: 3036, 582: 2893, 7198, 587: 2891, 592: 2906, 614: 2920, 624: 7201, 631: 7204, 701: 2916, 718: 2878, 3035, 781: 7178, 809: 2886, 812: 7179, 2917, 2918, 2919, 2928, 818: 2926, 2925, 2924, 822: 2889, 7180, 7189, 828: 3034, 2887, 7184, 832: 7185, 7182, 2892, 837: 7203, 839: 2888, 7206, 7207, 845: 7190, 851: 7191, 7186, 7187, 7181, 863: 7188, 2894, 866: 7192, 7183, 872: 7193, 7202, 7211, 7214, 7215, 7210, 7218, 7216, 7217, 7219, 7213, 7229, 7200, 7199, 7208, 7209, 7212, 941: 7261}, - {56: 7205, 84: 7197, 2882, 87: 2912, 89: 3033, 92: 7194, 94: 7196, 97: 57, 536: 2923, 2922, 552: 2921, 557: 2907, 559: 7195, 7039, 580: 3036, 582: 2893, 7198, 587: 2891, 592: 2906, 594: 57, 57, 614: 2920, 624: 7201, 631: 7204, 701: 2916, 718: 2878, 3035, 781: 7178, 809: 2886, 812: 7179, 2917, 2918, 2919, 2928, 818: 2926, 2925, 2924, 822: 2889, 7180, 7189, 828: 3034, 2887, 7184, 832: 7185, 7182, 2892, 837: 7203, 839: 2888, 7206, 7207, 845: 7190, 851: 7191, 7186, 7187, 7181, 863: 7188, 2894, 866: 7192, 7183, 872: 7193, 7202, 7211, 7214, 7215, 7210, 7218, 7216, 7217, 7219, 7213, 7231, 7200, 7199, 7208, 7209, 7212}, - {97: 60, 594: 60, 60}, - {97: 7264}, - {624: 7265}, + {97: 55, 594: 7271, 7264, 1173: 7276, 1281: 7275}, // 4395 + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 7272}, + {572: 3772, 3770, 3771, 3769, 3767, 612: 7273, 806: 3768, 3766}, + {56: 7218, 84: 7210, 2888, 87: 2918, 89: 3037, 92: 7207, 94: 7209, 536: 2929, 2928, 552: 2927, 557: 2913, 559: 7208, 561: 7056, 581: 3040, 583: 2899, 7211, 588: 2897, 592: 2912, 613: 2926, 630: 7214, 7217, 660: 2922, 718: 2884, 3039, 781: 7191, 809: 2892, 812: 7192, 2923, 2924, 2925, 2934, 2932, 2931, 2930, 821: 2895, 7193, 7202, 827: 3038, 829: 2893, 7197, 7198, 7195, 2898, 836: 7216, 840: 2894, 842: 7219, 7220, 845: 7203, 851: 7204, 7199, 7200, 7194, 863: 7201, 2900, 866: 7205, 7196, 872: 7206, 7215, 7224, 7227, 7228, 7223, 7231, 7229, 7230, 7232, 7226, 7242, 7213, 7212, 7221, 7222, 7225, 943: 7274}, + {56: 7218, 84: 7210, 2888, 87: 2918, 89: 3037, 92: 7207, 94: 7209, 97: 57, 536: 2929, 2928, 552: 2927, 557: 2913, 559: 7208, 561: 7056, 581: 3040, 583: 2899, 7211, 588: 2897, 592: 2912, 594: 57, 57, 613: 2926, 630: 7214, 7217, 660: 2922, 718: 2884, 3039, 781: 7191, 809: 2892, 812: 7192, 2923, 2924, 2925, 2934, 2932, 2931, 2930, 821: 2895, 7193, 7202, 827: 3038, 829: 2893, 7197, 7198, 7195, 2898, 836: 7216, 840: 2894, 842: 7219, 7220, 845: 7203, 851: 7204, 7199, 7200, 7194, 863: 7201, 2900, 866: 7205, 7196, 872: 7206, 7215, 7224, 7227, 7228, 7223, 7231, 7229, 7230, 7232, 7226, 7244, 7213, 7212, 7221, 7222, 7225}, + {97: 60, 594: 60, 60}, + // 4400 + {97: 7277}, + {630: 7278}, {53, 53}, - {571: 3767, 3765, 3766, 3764, 3762, 612: 7270, 806: 3763, 3761}, - {97: 7268}, - {583: 7269}, + {572: 3772, 3770, 3771, 3769, 3767, 612: 7283, 806: 3768, 3766}, + {97: 7281}, + // 4405 + {584: 7282}, {68, 68}, - // 4400 - {56: 7205, 84: 7197, 2882, 87: 2912, 89: 3033, 92: 7194, 94: 7196, 536: 2923, 2922, 552: 2921, 557: 2907, 559: 7195, 7039, 580: 3036, 582: 2893, 7198, 587: 2891, 592: 2906, 614: 2920, 624: 7201, 631: 7204, 701: 2916, 718: 2878, 3035, 781: 7178, 809: 2886, 812: 7179, 2917, 2918, 2919, 2928, 818: 2926, 2925, 2924, 822: 2889, 7180, 7189, 828: 3034, 2887, 7184, 832: 7185, 7182, 2892, 837: 7203, 839: 2888, 7206, 7207, 845: 7190, 851: 7191, 7186, 7187, 7181, 863: 7188, 2894, 866: 7192, 7183, 872: 7193, 7202, 7211, 7214, 7215, 7210, 7218, 7216, 7217, 7219, 7213, 7229, 7200, 7199, 7208, 7209, 7212, 941: 7271}, - {56: 7205, 84: 7197, 2882, 87: 2912, 89: 3033, 92: 7194, 94: 7196, 97: 66, 536: 2923, 2922, 552: 2921, 557: 2907, 559: 7195, 7039, 580: 3036, 582: 2893, 7198, 587: 2891, 592: 2906, 595: 7274, 614: 2920, 624: 7201, 631: 7204, 701: 2916, 718: 2878, 3035, 781: 7178, 809: 2886, 812: 7179, 2917, 2918, 2919, 2928, 818: 2926, 2925, 2924, 822: 2889, 7180, 7189, 828: 3034, 2887, 7184, 832: 7185, 7182, 2892, 837: 7203, 839: 2888, 7206, 7207, 845: 7190, 851: 7191, 7186, 7187, 7181, 863: 7188, 2894, 866: 7192, 7183, 872: 7193, 7202, 7211, 7214, 7215, 7210, 7218, 7216, 7217, 7219, 7213, 7231, 7200, 7199, 7208, 7209, 7212, 1049: 7273, 1430: 7272}, + {56: 7218, 84: 7210, 2888, 87: 2918, 89: 3037, 92: 7207, 94: 7209, 536: 2929, 2928, 552: 2927, 557: 2913, 559: 7208, 561: 7056, 581: 3040, 583: 2899, 7211, 588: 2897, 592: 2912, 613: 2926, 630: 7214, 7217, 660: 2922, 718: 2884, 3039, 781: 7191, 809: 2892, 812: 7192, 2923, 2924, 2925, 2934, 2932, 2931, 2930, 821: 2895, 7193, 7202, 827: 3038, 829: 2893, 7197, 7198, 7195, 2898, 836: 7216, 840: 2894, 842: 7219, 7220, 845: 7203, 851: 7204, 7199, 7200, 7194, 863: 7201, 2900, 866: 7205, 7196, 872: 7206, 7215, 7224, 7227, 7228, 7223, 7231, 7229, 7230, 7232, 7226, 7242, 7213, 7212, 7221, 7222, 7225, 943: 7284}, + {56: 7218, 84: 7210, 2888, 87: 2918, 89: 3037, 92: 7207, 94: 7209, 97: 66, 536: 2929, 2928, 552: 2927, 557: 2913, 559: 7208, 561: 7056, 581: 3040, 583: 2899, 7211, 588: 2897, 592: 2912, 595: 7287, 613: 2926, 630: 7214, 7217, 660: 2922, 718: 2884, 3039, 781: 7191, 809: 2892, 812: 7192, 2923, 2924, 2925, 2934, 2932, 2931, 2930, 821: 2895, 7193, 7202, 827: 3038, 829: 2893, 7197, 7198, 7195, 2898, 836: 7216, 840: 2894, 842: 7219, 7220, 845: 7203, 851: 7204, 7199, 7200, 7194, 863: 7201, 2900, 866: 7205, 7196, 872: 7206, 7215, 7224, 7227, 7228, 7223, 7231, 7229, 7230, 7232, 7226, 7244, 7213, 7212, 7221, 7222, 7225, 1050: 7286, 1429: 7285}, {97: 67}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 7266, 1252: 7276}, - {56: 7205, 84: 7197, 2882, 87: 2912, 89: 3033, 92: 7194, 94: 7196, 536: 2923, 2922, 552: 2921, 557: 2907, 559: 7195, 7039, 580: 3036, 582: 2893, 7198, 587: 2891, 592: 2906, 614: 2920, 624: 7201, 631: 7204, 701: 2916, 718: 2878, 3035, 781: 7178, 809: 2886, 812: 7179, 2917, 2918, 2919, 2928, 818: 2926, 2925, 2924, 822: 2889, 7180, 7189, 828: 3034, 2887, 7184, 832: 7185, 7182, 2892, 837: 7203, 839: 2888, 7206, 7207, 845: 7190, 851: 7191, 7186, 7187, 7181, 863: 7188, 2894, 866: 7192, 7183, 872: 7193, 7202, 7211, 7214, 7215, 7210, 7218, 7216, 7217, 7219, 7213, 7229, 7200, 7199, 7208, 7209, 7212, 941: 7275}, - // 4405 - {56: 7205, 84: 7197, 2882, 87: 2912, 89: 3033, 92: 7194, 94: 7196, 97: 64, 536: 2923, 2922, 552: 2921, 557: 2907, 559: 7195, 7039, 580: 3036, 582: 2893, 7198, 587: 2891, 592: 2906, 614: 2920, 624: 7201, 631: 7204, 701: 2916, 718: 2878, 3035, 781: 7178, 809: 2886, 812: 7179, 2917, 2918, 2919, 2928, 818: 2926, 2925, 2924, 822: 2889, 7180, 7189, 828: 3034, 2887, 7184, 832: 7185, 7182, 2892, 837: 7203, 839: 2888, 7206, 7207, 845: 7190, 851: 7191, 7186, 7187, 7181, 863: 7188, 2894, 866: 7192, 7183, 872: 7193, 7202, 7211, 7214, 7215, 7210, 7218, 7216, 7217, 7219, 7213, 7231, 7200, 7199, 7208, 7209, 7212}, - {97: 65}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 7288, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 7289, 3067, 3068, 3066, 1348: 7292, 1362: 7293, 1433: 7290, 1437: 7291}, - {56: 76, 84: 76, 76, 87: 76, 89: 76, 92: 76, 94: 76, 97: 76, 230: 7277, 536: 76, 76, 552: 76, 557: 76, 559: 76, 76, 580: 76, 582: 76, 76, 587: 76, 592: 76, 614: 76, 624: 76, 631: 76, 701: 76, 718: 76, 76, 809: 76, 834: 76, 837: 76, 840: 76, 76, 1250: 7286}, - {7285}, // 4410 - {56: 73, 84: 73, 73, 87: 73, 89: 73, 92: 73, 94: 73, 97: 73, 536: 73, 73, 552: 73, 557: 73, 559: 73, 73, 580: 73, 582: 73, 73, 587: 73, 592: 73, 614: 73, 624: 73, 631: 73, 701: 73, 718: 73, 73, 809: 73, 834: 73, 837: 73, 840: 73, 73, 1441: 7281}, - {56: 7205, 84: 7197, 2882, 87: 2912, 89: 3033, 92: 7194, 94: 7196, 97: 7283, 536: 2923, 2922, 552: 2921, 557: 2907, 559: 7195, 7039, 580: 3036, 582: 2893, 7198, 587: 2891, 592: 2906, 614: 2920, 624: 7201, 631: 7204, 701: 2916, 718: 2878, 3035, 781: 7178, 809: 2886, 812: 7179, 2917, 2918, 2919, 2928, 818: 2926, 2925, 2924, 822: 2889, 7180, 7189, 828: 3034, 2887, 7184, 832: 7185, 7182, 2892, 837: 7203, 839: 2888, 7206, 7207, 845: 7190, 851: 7191, 7186, 7187, 7181, 863: 7188, 2894, 866: 7192, 7183, 872: 7193, 7202, 7211, 7214, 7215, 7210, 7218, 7216, 7217, 7219, 7213, 7282, 7200, 7199, 7208, 7209, 7212}, - {7284}, - {69, 69, 56: 69}, - {56: 72, 84: 72, 72, 87: 72, 89: 72, 92: 72, 94: 72, 97: 72, 536: 72, 72, 552: 72, 557: 72, 559: 72, 72, 580: 72, 582: 72, 72, 587: 72, 592: 72, 614: 72, 624: 72, 631: 72, 701: 72, 718: 72, 72, 809: 72, 834: 72, 837: 72, 840: 72, 72}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 7279, 1252: 7289}, + {56: 7218, 84: 7210, 2888, 87: 2918, 89: 3037, 92: 7207, 94: 7209, 536: 2929, 2928, 552: 2927, 557: 2913, 559: 7208, 561: 7056, 581: 3040, 583: 2899, 7211, 588: 2897, 592: 2912, 613: 2926, 630: 7214, 7217, 660: 2922, 718: 2884, 3039, 781: 7191, 809: 2892, 812: 7192, 2923, 2924, 2925, 2934, 2932, 2931, 2930, 821: 2895, 7193, 7202, 827: 3038, 829: 2893, 7197, 7198, 7195, 2898, 836: 7216, 840: 2894, 842: 7219, 7220, 845: 7203, 851: 7204, 7199, 7200, 7194, 863: 7201, 2900, 866: 7205, 7196, 872: 7206, 7215, 7224, 7227, 7228, 7223, 7231, 7229, 7230, 7232, 7226, 7242, 7213, 7212, 7221, 7222, 7225, 943: 7288}, + {56: 7218, 84: 7210, 2888, 87: 2918, 89: 3037, 92: 7207, 94: 7209, 97: 64, 536: 2929, 2928, 552: 2927, 557: 2913, 559: 7208, 561: 7056, 581: 3040, 583: 2899, 7211, 588: 2897, 592: 2912, 613: 2926, 630: 7214, 7217, 660: 2922, 718: 2884, 3039, 781: 7191, 809: 2892, 812: 7192, 2923, 2924, 2925, 2934, 2932, 2931, 2930, 821: 2895, 7193, 7202, 827: 3038, 829: 2893, 7197, 7198, 7195, 2898, 836: 7216, 840: 2894, 842: 7219, 7220, 845: 7203, 851: 7204, 7199, 7200, 7194, 863: 7201, 2900, 866: 7205, 7196, 872: 7206, 7215, 7224, 7227, 7228, 7223, 7231, 7229, 7230, 7232, 7226, 7244, 7213, 7212, 7221, 7222, 7225}, + {97: 65}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 7301, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 7302, 3072, 3073, 3071, 1346: 7305, 1360: 7306, 1432: 7303, 1436: 7304}, // 4415 - {56: 75, 84: 75, 75, 87: 75, 89: 75, 92: 75, 94: 75, 97: 75, 230: 75, 536: 75, 75, 552: 75, 557: 75, 559: 75, 75, 580: 75, 582: 75, 75, 587: 75, 592: 75, 614: 75, 624: 75, 631: 75, 701: 75, 718: 75, 75, 809: 75, 834: 75, 837: 75, 840: 75, 75}, - {7287}, - {56: 74, 84: 74, 74, 87: 74, 89: 74, 92: 74, 94: 74, 97: 74, 230: 74, 536: 74, 74, 552: 74, 557: 74, 559: 74, 74, 580: 74, 582: 74, 74, 587: 74, 592: 74, 614: 74, 624: 74, 631: 74, 701: 74, 718: 74, 74, 809: 74, 834: 74, 837: 74, 840: 74, 74}, - {9: 2103, 118: 2103, 127: 2103, 172: 2103, 175: 2103, 2103, 2103, 179: 2103, 185: 2103, 188: 2103, 200: 2103, 205: 2103, 2103, 2103, 211: 2103, 2103, 2103, 558: 2103, 560: 2103, 591: 2103, 714: 2103, 737: 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 749: 2103, 2103, 753: 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 1352: 7317}, - {9: 104, 118: 104, 127: 104, 172: 104, 175: 104, 104, 104, 179: 104, 185: 104, 188: 104, 200: 104, 205: 104, 104, 104, 211: 104, 104, 104, 558: 104, 560: 104, 591: 104, 714: 104, 737: 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 749: 104, 104, 753: 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104}, + {56: 76, 84: 76, 76, 87: 76, 89: 76, 92: 76, 94: 76, 97: 76, 230: 7290, 536: 76, 76, 552: 76, 557: 76, 559: 76, 561: 76, 581: 76, 583: 76, 76, 588: 76, 592: 76, 613: 76, 630: 76, 76, 660: 76, 718: 76, 76, 809: 76, 833: 76, 836: 76, 842: 76, 76, 1250: 7299}, + {7298}, + {56: 73, 84: 73, 73, 87: 73, 89: 73, 92: 73, 94: 73, 97: 73, 536: 73, 73, 552: 73, 557: 73, 559: 73, 561: 73, 581: 73, 583: 73, 73, 588: 73, 592: 73, 613: 73, 630: 73, 73, 660: 73, 718: 73, 73, 809: 73, 833: 73, 836: 73, 842: 73, 73, 1440: 7294}, + {56: 7218, 84: 7210, 2888, 87: 2918, 89: 3037, 92: 7207, 94: 7209, 97: 7296, 536: 2929, 2928, 552: 2927, 557: 2913, 559: 7208, 561: 7056, 581: 3040, 583: 2899, 7211, 588: 2897, 592: 2912, 613: 2926, 630: 7214, 7217, 660: 2922, 718: 2884, 3039, 781: 7191, 809: 2892, 812: 7192, 2923, 2924, 2925, 2934, 2932, 2931, 2930, 821: 2895, 7193, 7202, 827: 3038, 829: 2893, 7197, 7198, 7195, 2898, 836: 7216, 840: 2894, 842: 7219, 7220, 845: 7203, 851: 7204, 7199, 7200, 7194, 863: 7201, 2900, 866: 7205, 7196, 872: 7206, 7215, 7224, 7227, 7228, 7223, 7231, 7229, 7230, 7232, 7226, 7295, 7213, 7212, 7221, 7222, 7225}, + {7297}, // 4420 - {9: 7311, 118: 5027, 127: 5028, 172: 5018, 175: 5038, 5037, 5001, 179: 5040, 185: 5039, 188: 4998, 200: 5034, 205: 5007, 4997, 5016, 211: 5023, 5022, 5026, 558: 5021, 560: 5017, 591: 5012, 714: 5020, 737: 5025, 5024, 4999, 5004, 5002, 4995, 4989, 5003, 5013, 4996, 5030, 749: 5005, 5006, 753: 4990, 4991, 4992, 4993, 4994, 5019, 5032, 5036, 5031, 4987, 5035, 4988, 5000, 4986, 5029, 4985, 5033, 957: 5008, 1031: 5010, 1035: 4984, 5014, 4981, 1044: 4979, 1052: 4982, 4983, 1060: 4980, 1064: 5009, 1068: 4977, 5011, 1089: 4978, 1092: 5015, 1095: 7312, 1104: 5041}, - {261: 7294}, - {261: 97}, - {261: 96}, - {563: 7295}, + {69, 69, 56: 69}, + {56: 72, 84: 72, 72, 87: 72, 89: 72, 92: 72, 94: 72, 97: 72, 536: 72, 72, 552: 72, 557: 72, 559: 72, 561: 72, 581: 72, 583: 72, 72, 588: 72, 592: 72, 613: 72, 630: 72, 72, 660: 72, 718: 72, 72, 809: 72, 833: 72, 836: 72, 842: 72, 72}, + {56: 75, 84: 75, 75, 87: 75, 89: 75, 92: 75, 94: 75, 97: 75, 230: 75, 536: 75, 75, 552: 75, 557: 75, 559: 75, 561: 75, 581: 75, 583: 75, 75, 588: 75, 592: 75, 613: 75, 630: 75, 75, 660: 75, 718: 75, 75, 809: 75, 833: 75, 836: 75, 842: 75, 75}, + {7300}, + {56: 74, 84: 74, 74, 87: 74, 89: 74, 92: 74, 94: 74, 97: 74, 230: 74, 536: 74, 74, 552: 74, 557: 74, 559: 74, 561: 74, 581: 74, 583: 74, 74, 588: 74, 592: 74, 613: 74, 630: 74, 74, 660: 74, 718: 74, 74, 809: 74, 833: 74, 836: 74, 842: 74, 74}, // 4425 - {541: 7300, 564: 3053, 805: 7302, 1248: 7298, 1251: 7297, 1287: 7301, 7303, 7299, 1438: 7296}, - {9: 7309, 56: 7205, 84: 7197, 2882, 87: 2912, 89: 3033, 92: 7194, 94: 7196, 536: 2923, 2922, 552: 2921, 557: 2907, 559: 7195, 7039, 580: 3036, 582: 2893, 7198, 587: 2891, 592: 2906, 614: 2920, 624: 7201, 631: 7204, 701: 2916, 718: 2878, 3035, 781: 7178, 809: 2886, 812: 7179, 2917, 2918, 2919, 2928, 818: 2926, 2925, 2924, 822: 2889, 7180, 7189, 828: 3034, 2887, 7184, 832: 7185, 7182, 2892, 837: 7203, 839: 2888, 7206, 7207, 845: 7190, 851: 7191, 7186, 7187, 7181, 863: 7188, 2894, 866: 7192, 7183, 872: 7193, 7202, 7211, 7214, 7215, 7210, 7218, 7216, 7217, 7219, 7213, 7308, 7200, 7199, 7208, 7209, 7212}, - {9: 95, 56: 95, 84: 95, 95, 87: 95, 89: 95, 92: 95, 94: 95, 536: 95, 95, 552: 95, 557: 95, 559: 95, 95, 580: 95, 582: 95, 95, 587: 95, 592: 95, 614: 95, 624: 95, 631: 95, 701: 95, 718: 95, 95, 809: 95, 834: 95, 837: 95, 840: 95, 95}, - {9: 93, 56: 93, 84: 93, 93, 87: 93, 89: 93, 92: 93, 94: 93, 536: 93, 93, 552: 93, 557: 93, 559: 93, 93, 580: 93, 582: 93, 93, 587: 93, 592: 93, 614: 93, 624: 93, 631: 93, 701: 93, 718: 93, 93, 809: 93, 834: 93, 837: 93, 840: 93, 93}, - {9: 92, 56: 92, 84: 92, 92, 87: 92, 89: 92, 92: 92, 94: 92, 536: 92, 92, 552: 92, 557: 92, 559: 92, 92, 580: 92, 582: 92, 92, 587: 92, 592: 92, 614: 92, 624: 92, 631: 92, 701: 92, 718: 92, 92, 809: 92, 834: 92, 837: 92, 840: 92, 92}, + {9: 2112, 118: 2112, 127: 2112, 174: 2112, 176: 2112, 2112, 2112, 2112, 186: 2112, 189: 2112, 200: 2112, 205: 2112, 2112, 2112, 211: 2112, 2112, 2112, 558: 2112, 561: 2112, 591: 2112, 714: 2112, 737: 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 746: 2112, 2112, 2112, 2112, 2112, 753: 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 1350: 7330}, + {9: 104, 118: 104, 127: 104, 174: 104, 176: 104, 104, 104, 104, 186: 104, 189: 104, 200: 104, 205: 104, 104, 104, 211: 104, 104, 104, 558: 104, 561: 104, 591: 104, 714: 104, 737: 104, 104, 104, 104, 104, 104, 104, 104, 746: 104, 104, 104, 104, 104, 753: 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104}, + {9: 7324, 118: 5036, 127: 5037, 174: 5027, 176: 5047, 5046, 5010, 5049, 186: 5048, 189: 5007, 200: 5043, 205: 5016, 5006, 5025, 211: 5032, 5031, 5035, 558: 5030, 561: 5026, 591: 5021, 714: 5029, 737: 5034, 5033, 5008, 5013, 5011, 5004, 4998, 5012, 746: 5022, 5005, 5039, 5014, 5015, 753: 4999, 5000, 5001, 5002, 5003, 5028, 5041, 5045, 5040, 4996, 5044, 4997, 5009, 4995, 5038, 4994, 5042, 959: 5017, 1032: 5019, 1036: 4993, 5023, 4990, 1045: 4988, 1053: 4991, 4992, 1061: 4989, 1066: 5018, 1070: 4986, 5020, 1091: 4987, 1095: 5024, 1098: 7325, 1107: 5050}, + {261: 7307}, + {261: 97}, // 4430 - {395: 7307}, - {9: 90, 56: 90, 84: 90, 90, 87: 90, 89: 90, 92: 90, 94: 90, 536: 90, 90, 552: 90, 557: 90, 559: 90, 90, 580: 90, 582: 90, 90, 587: 90, 592: 90, 614: 90, 624: 90, 631: 90, 701: 90, 718: 90, 90, 809: 90, 834: 90, 837: 90, 840: 90, 90}, - {9: 89, 56: 89, 84: 89, 89, 87: 89, 89: 89, 92: 89, 94: 89, 536: 89, 89, 552: 89, 557: 89, 559: 89, 89, 580: 89, 582: 89, 89, 587: 89, 592: 89, 614: 89, 624: 89, 631: 89, 701: 89, 718: 89, 89, 809: 89, 834: 89, 837: 89, 840: 89, 89}, - {186: 7305, 538: 87, 1415: 7304}, - {538: 7306}, + {261: 96}, + {563: 7308}, + {541: 7313, 567: 3058, 805: 7315, 1248: 7311, 1251: 7310, 1286: 7314, 7316, 7312, 1437: 7309}, + {9: 7322, 56: 7218, 84: 7210, 2888, 87: 2918, 89: 3037, 92: 7207, 94: 7209, 536: 2929, 2928, 552: 2927, 557: 2913, 559: 7208, 561: 7056, 581: 3040, 583: 2899, 7211, 588: 2897, 592: 2912, 613: 2926, 630: 7214, 7217, 660: 2922, 718: 2884, 3039, 781: 7191, 809: 2892, 812: 7192, 2923, 2924, 2925, 2934, 2932, 2931, 2930, 821: 2895, 7193, 7202, 827: 3038, 829: 2893, 7197, 7198, 7195, 2898, 836: 7216, 840: 2894, 842: 7219, 7220, 845: 7203, 851: 7204, 7199, 7200, 7194, 863: 7201, 2900, 866: 7205, 7196, 872: 7206, 7215, 7224, 7227, 7228, 7223, 7231, 7229, 7230, 7232, 7226, 7321, 7213, 7212, 7221, 7222, 7225}, + {9: 95, 56: 95, 84: 95, 95, 87: 95, 89: 95, 92: 95, 94: 95, 536: 95, 95, 552: 95, 557: 95, 559: 95, 561: 95, 581: 95, 583: 95, 95, 588: 95, 592: 95, 613: 95, 630: 95, 95, 660: 95, 718: 95, 95, 809: 95, 833: 95, 836: 95, 842: 95, 95}, // 4435 - {538: 86}, - {9: 88, 56: 88, 84: 88, 88, 87: 88, 89: 88, 92: 88, 94: 88, 536: 88, 88, 552: 88, 557: 88, 559: 88, 88, 580: 88, 582: 88, 88, 587: 88, 592: 88, 614: 88, 624: 88, 631: 88, 701: 88, 718: 88, 88, 809: 88, 834: 88, 837: 88, 840: 88, 88}, - {9: 91, 56: 91, 84: 91, 91, 87: 91, 89: 91, 92: 91, 94: 91, 536: 91, 91, 552: 91, 557: 91, 559: 91, 91, 580: 91, 582: 91, 91, 587: 91, 592: 91, 614: 91, 624: 91, 631: 91, 701: 91, 718: 91, 91, 809: 91, 834: 91, 837: 91, 840: 91, 91}, - {98}, - {541: 7300, 564: 3053, 805: 7302, 1248: 7298, 1251: 7310, 1287: 7301, 7303, 7299}, + {9: 93, 56: 93, 84: 93, 93, 87: 93, 89: 93, 92: 93, 94: 93, 536: 93, 93, 552: 93, 557: 93, 559: 93, 561: 93, 581: 93, 583: 93, 93, 588: 93, 592: 93, 613: 93, 630: 93, 93, 660: 93, 718: 93, 93, 809: 93, 833: 93, 836: 93, 842: 93, 93}, + {9: 92, 56: 92, 84: 92, 92, 87: 92, 89: 92, 92: 92, 94: 92, 536: 92, 92, 552: 92, 557: 92, 559: 92, 561: 92, 581: 92, 583: 92, 92, 588: 92, 592: 92, 613: 92, 630: 92, 92, 660: 92, 718: 92, 92, 809: 92, 833: 92, 836: 92, 842: 92, 92}, + {396: 7320}, + {9: 90, 56: 90, 84: 90, 90, 87: 90, 89: 90, 92: 90, 94: 90, 536: 90, 90, 552: 90, 557: 90, 559: 90, 561: 90, 581: 90, 583: 90, 90, 588: 90, 592: 90, 613: 90, 630: 90, 90, 660: 90, 718: 90, 90, 809: 90, 833: 90, 836: 90, 842: 90, 90}, + {9: 89, 56: 89, 84: 89, 89, 87: 89, 89: 89, 92: 89, 94: 89, 536: 89, 89, 552: 89, 557: 89, 559: 89, 561: 89, 581: 89, 583: 89, 89, 588: 89, 592: 89, 613: 89, 630: 89, 89, 660: 89, 718: 89, 89, 809: 89, 833: 89, 836: 89, 842: 89, 89}, // 4440 - {9: 94, 56: 94, 84: 94, 94, 87: 94, 89: 94, 92: 94, 94: 94, 536: 94, 94, 552: 94, 557: 94, 559: 94, 94, 580: 94, 582: 94, 94, 587: 94, 592: 94, 614: 94, 624: 94, 631: 94, 701: 94, 718: 94, 94, 809: 94, 834: 94, 837: 94, 840: 94, 94}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 7316, 3067, 3068, 3066}, - {102, 540: 7313, 1439: 7314}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3149, 3096, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3065, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3181, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3187, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3109, 3591, 3493, 3588, 3261, 3138, 3254, 3255, 3250, 3208, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3189, 3071, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3107, 3129, 3450, 3177, 3238, 3278, 3136, 3194, 3215, 3178, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3193, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3132, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3063, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3249, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3195, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3504, 3202, 3369, 3290, 3064, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3170, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3480, 3191, 3481, 3482, 3083, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3499, 3500, 3333, 3573, 3574, 3553, 3552, 3373, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3231, 3248, 3510, 3374, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3518, 3519, 3520, 3244, 3466, 3531, 3532, 3543, 3182, 3527, 3528, 3529, 3562, 3190, 536: 3625, 538: 3607, 3623, 3633, 3707, 545: 3638, 3642, 548: 3622, 3621, 3661, 552: 3634, 3598, 557: 3641, 3659, 564: 3602, 583: 3636, 591: 3629, 3660, 624: 3631, 631: 3640, 633: 3705, 3597, 3599, 3643, 641: 3601, 3600, 3605, 3626, 3606, 3712, 3616, 3628, 3635, 3627, 3632, 3604, 3657, 3639, 3644, 3649, 3702, 3650, 3651, 3680, 662: 3619, 3620, 3675, 3676, 3677, 3678, 3679, 3630, 3662, 3672, 3673, 3666, 3681, 3682, 3683, 3667, 3685, 3686, 3668, 3684, 3663, 3671, 3669, 3655, 3687, 3688, 3692, 3645, 3648, 3691, 3697, 3696, 3698, 3695, 3699, 3694, 3693, 3690, 3689, 702: 3647, 3646, 3652, 3653, 716: 3708, 777: 3608, 3067, 3068, 3066, 3624, 3701, 3615, 3609, 3603, 3674, 3612, 3610, 3611, 3654, 3665, 3664, 3658, 3656, 3670, 3713, 3618, 3700, 3617, 3614, 3711, 3710, 3709, 7315}, - {100}, + {187: 7318, 538: 87, 1414: 7317}, + {538: 7319}, + {538: 86}, + {9: 88, 56: 88, 84: 88, 88, 87: 88, 89: 88, 92: 88, 94: 88, 536: 88, 88, 552: 88, 557: 88, 559: 88, 561: 88, 581: 88, 583: 88, 88, 588: 88, 592: 88, 613: 88, 630: 88, 88, 660: 88, 718: 88, 88, 809: 88, 833: 88, 836: 88, 842: 88, 88}, + {9: 91, 56: 91, 84: 91, 91, 87: 91, 89: 91, 92: 91, 94: 91, 536: 91, 91, 552: 91, 557: 91, 559: 91, 561: 91, 581: 91, 583: 91, 91, 588: 91, 592: 91, 613: 91, 630: 91, 91, 660: 91, 718: 91, 91, 809: 91, 833: 91, 836: 91, 842: 91, 91}, // 4445 - {101, 571: 3767, 3765, 3766, 3764, 3762, 806: 3763, 3761}, - {9: 103, 118: 103, 127: 103, 172: 103, 175: 103, 103, 103, 179: 103, 185: 103, 188: 103, 200: 103, 205: 103, 103, 103, 211: 103, 103, 103, 558: 103, 560: 103, 591: 103, 714: 103, 737: 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 749: 103, 103, 753: 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103}, - {563: 7318}, - {536: 2923, 2922, 552: 2921, 614: 2920, 701: 2916, 781: 7319, 812: 7320, 2917, 2918, 2919, 2928, 818: 2926, 2925, 2924, 822: 3868, 7321, 7322, 1432: 7323}, - {107, 544: 1020, 555: 1020, 1020, 559: 3881, 562: 3880, 569: 3879, 848: 3882, 3883}, + {98}, + {541: 7313, 567: 3058, 805: 7315, 1248: 7311, 1251: 7323, 1286: 7314, 7316, 7312}, + {9: 94, 56: 94, 84: 94, 94, 87: 94, 89: 94, 92: 94, 94: 94, 536: 94, 94, 552: 94, 557: 94, 559: 94, 561: 94, 581: 94, 583: 94, 94, 588: 94, 592: 94, 613: 94, 630: 94, 94, 660: 94, 718: 94, 94, 809: 94, 833: 94, 836: 94, 842: 94, 94}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 7329, 3072, 3073, 3071}, + {102, 540: 7326, 1438: 7327}, // 4450 - {109, 544: 1021, 555: 1021, 1021}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3153, 3101, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3070, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3185, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3192, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3114, 3596, 3498, 3593, 3266, 3172, 3143, 3259, 3260, 3255, 3213, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3194, 3076, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3112, 3134, 3181, 3243, 3283, 3141, 3199, 3220, 3163, 3182, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3198, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3137, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3068, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3254, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3200, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3509, 3207, 3374, 3295, 3069, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3174, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3485, 3196, 3486, 3487, 3088, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3504, 3505, 3338, 3578, 3579, 3558, 3557, 3378, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3236, 3253, 3515, 3379, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3523, 3524, 3525, 3249, 3471, 3536, 3537, 3548, 3186, 3532, 3533, 3534, 3567, 3195, 536: 3630, 538: 3612, 3628, 3638, 3712, 545: 3643, 3647, 548: 3627, 3626, 3666, 552: 3639, 3603, 557: 3646, 3664, 567: 3607, 584: 3641, 591: 3634, 3665, 630: 3636, 3645, 633: 3710, 3602, 3604, 3648, 641: 3606, 3605, 3610, 3631, 3611, 3717, 3621, 3633, 3640, 3632, 3637, 3609, 3662, 3644, 3649, 3654, 3707, 3655, 3656, 662: 3685, 3624, 3625, 3680, 3681, 3682, 3683, 3684, 3635, 3667, 3677, 3678, 3671, 3686, 3687, 3688, 3672, 3690, 3691, 3673, 3689, 3668, 3676, 3674, 3660, 3692, 3693, 3697, 3650, 3653, 3696, 3702, 3701, 3703, 3700, 3704, 3699, 3698, 3695, 3694, 3652, 3651, 3657, 3658, 716: 3713, 777: 3613, 3072, 3073, 3071, 3629, 3706, 3620, 3614, 3608, 3679, 3617, 3615, 3616, 3659, 3670, 3669, 3663, 3661, 3675, 3718, 3623, 3705, 3622, 3619, 3716, 3715, 3714, 7328}, + {100}, + {101, 572: 3772, 3770, 3771, 3769, 3767, 806: 3768, 3766}, + {9: 103, 118: 103, 127: 103, 174: 103, 176: 103, 103, 103, 103, 186: 103, 189: 103, 200: 103, 205: 103, 103, 103, 211: 103, 103, 103, 558: 103, 561: 103, 591: 103, 714: 103, 737: 103, 103, 103, 103, 103, 103, 103, 103, 746: 103, 103, 103, 103, 103, 753: 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103}, + {563: 7331}, + // 4455 + {536: 2929, 2928, 552: 2927, 613: 2926, 660: 2922, 781: 7332, 812: 7333, 2923, 2924, 2925, 2934, 2932, 2931, 2930, 821: 3873, 7334, 7335, 1431: 7336}, + {107, 544: 1028, 555: 1028, 1028, 559: 3886, 3885, 570: 3884, 847: 3887, 3888}, + {109, 544: 1029, 555: 1029, 1029}, {108}, {106}, + // 4460 {99}, {83, 83}, - // 4455 - {56: 7329}, - {566: 7328}, + {56: 7342}, + {566: 7341}, {56: 80}, + // 4465 {56: 81}, - {565: 7330}, - // 4460 - {56: 7332, 1436: 7331}, - {84, 84, 9: 7333}, + {564: 7343}, + {56: 7345, 1435: 7344}, + {84, 84, 9: 7346}, {79, 79, 9: 79}, - {56: 7334}, + // 4470 + {56: 7347}, {78, 78, 9: 78}, - // 4465 {85, 85}, - {118: 5027, 127: 5028, 172: 5018, 175: 5038, 5037, 5001, 179: 5040, 185: 5039, 188: 4998, 200: 5034, 205: 5007, 4997, 5016, 211: 5023, 5022, 5026, 558: 5021, 560: 5017, 591: 5012, 714: 5020, 737: 5025, 5024, 4999, 5004, 5002, 4995, 4989, 5003, 5013, 4996, 5030, 749: 5005, 5006, 753: 4990, 4991, 4992, 4993, 4994, 5019, 5032, 5036, 5031, 4987, 5035, 4988, 5000, 4986, 5029, 4985, 5033, 957: 5008, 1031: 5010, 1035: 4984, 5014, 4981, 1044: 4979, 1052: 4982, 4983, 1060: 4980, 1064: 5009, 1068: 4977, 5011, 1089: 4978, 1092: 5015, 1095: 7337, 1104: 5041}, + {118: 5036, 127: 5037, 174: 5027, 176: 5047, 5046, 5010, 5049, 186: 5048, 189: 5007, 200: 5043, 205: 5016, 5006, 5025, 211: 5032, 5031, 5035, 558: 5030, 561: 5026, 591: 5021, 714: 5029, 737: 5034, 5033, 5008, 5013, 5011, 5004, 4998, 5012, 746: 5022, 5005, 5039, 5014, 5015, 753: 4999, 5000, 5001, 5002, 5003, 5028, 5041, 5045, 5040, 4996, 5044, 4997, 5009, 4995, 5038, 4994, 5042, 959: 5017, 1032: 5019, 1036: 4993, 5023, 4990, 1045: 4988, 1053: 4991, 4992, 1061: 4989, 1066: 5018, 1070: 4986, 5020, 1091: 4987, 1095: 5024, 1098: 7350, 1107: 5050}, {9: 129, 57: 129}, - {2: 128, 128, 128, 128, 128, 128, 128, 10: 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 58: 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 611: 7173, 1200: 7175, 1234: 7174, 1285: 7172, 7339}, - {9: 131, 57: 131}, - // 4470 - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 3949, 3067, 3068, 3066, 810: 7341}, - {188, 188, 6: 188, 188, 188, 15: 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 86: 7349, 88: 7346, 90: 7352, 7353, 95: 7354, 7347, 98: 7345, 7355, 7351, 7348, 540: 188, 543: 188, 188, 558: 188, 570: 188, 714: 188, 188, 725: 7350, 1020: 7344, 1349: 7342, 1456: 7343}, - {576, 576, 6: 4747, 4749, 580, 15: 4766, 2459, 4764, 4703, 4768, 4755, 4784, 4751, 4748, 4750, 4753, 4754, 4756, 4763, 580, 4774, 4775, 4785, 4761, 4762, 4767, 4769, 4781, 4780, 4789, 4782, 4779, 4772, 4777, 4778, 4771, 4773, 4776, 4765, 4786, 4787, 540: 4746, 543: 2459, 4783, 558: 2459, 570: 5521, 714: 2459, 4752, 871: 4757, 897: 4759, 916: 4758, 937: 4760, 943: 4770, 947: 4788, 1026: 6204, 1147: 7375}, - {187, 187, 6: 187, 187, 187, 15: 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 86: 7349, 88: 7346, 90: 7352, 7353, 95: 7354, 7347, 98: 7345, 7355, 7351, 7348, 540: 187, 543: 187, 187, 558: 187, 570: 187, 714: 187, 187, 725: 7350, 1020: 7374}, - {186, 186, 6: 186, 186, 186, 15: 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 86: 186, 88: 186, 90: 186, 186, 95: 186, 186, 98: 186, 186, 186, 186, 540: 186, 543: 186, 186, 558: 186, 570: 186, 714: 186, 186, 725: 186}, // 4475 - {548: 2329, 2329, 561: 4610, 564: 2329, 728: 7371, 808: 7370}, - {537: 7367, 548: 2329, 2329, 561: 4610, 564: 2329, 808: 7366}, - {548: 2329, 2329, 561: 4610, 564: 2329, 808: 7364}, - {179, 179, 6: 179, 179, 179, 15: 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 86: 179, 88: 179, 90: 179, 179, 95: 179, 179, 98: 179, 179, 179, 179, 103: 179, 540: 179, 543: 179, 179, 558: 179, 570: 179, 714: 179, 179, 725: 179}, - {90: 7362, 95: 7363, 7360, 725: 7361}, + {2: 128, 128, 128, 128, 128, 128, 128, 10: 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 58: 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 611: 7186, 1201: 7188, 1235: 7187, 1284: 7185, 7352}, + {9: 131, 57: 131}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 565: 3955, 777: 3954, 3072, 3073, 3071, 810: 7354}, + {188, 188, 6: 188, 188, 188, 15: 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 86: 7362, 88: 7359, 90: 7365, 7366, 95: 7367, 7360, 98: 7358, 7368, 7364, 7361, 540: 188, 543: 188, 188, 558: 188, 571: 188, 714: 188, 188, 725: 7363, 1022: 7357, 1347: 7355, 1456: 7356}, + {583, 583, 6: 4756, 4758, 587, 15: 4775, 2465, 4773, 4712, 4777, 4764, 4793, 4757, 4760, 4759, 4762, 4763, 4765, 4772, 587, 4783, 4784, 4794, 4770, 4771, 4776, 4778, 4790, 4789, 4798, 4791, 4788, 4781, 4786, 4787, 4780, 4782, 4785, 4774, 4795, 4796, 540: 4755, 543: 2465, 4792, 558: 2465, 571: 5530, 714: 2465, 4761, 871: 4766, 897: 4768, 918: 4767, 939: 4769, 945: 4779, 950: 4797, 1027: 6223, 1150: 7388}, // 4480 - {548: 2329, 2329, 561: 4610, 564: 2329, 808: 7358}, - {176, 176, 6: 176, 176, 176, 15: 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 86: 176, 88: 176, 90: 176, 176, 95: 176, 176, 98: 176, 176, 176, 176, 103: 176, 540: 176, 543: 176, 176, 558: 176, 570: 176, 714: 176, 176, 725: 176}, - {548: 2329, 2329, 561: 4610, 564: 2329, 808: 7356}, - {173, 173, 6: 173, 173, 173, 15: 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 86: 173, 88: 173, 90: 173, 173, 95: 173, 173, 98: 173, 173, 173, 173, 103: 173, 540: 173, 543: 173, 173, 558: 173, 570: 173, 714: 173, 173, 725: 173}, - {171, 171, 6: 171, 171, 171, 15: 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 86: 171, 88: 171, 90: 171, 171, 95: 171, 171, 98: 171, 171, 171, 171, 103: 171, 540: 171, 543: 171, 171, 558: 171, 570: 171, 714: 171, 171, 725: 171}, + {187, 187, 6: 187, 187, 187, 15: 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 86: 7362, 88: 7359, 90: 7365, 7366, 95: 7367, 7360, 98: 7358, 7368, 7364, 7361, 540: 187, 543: 187, 187, 558: 187, 571: 187, 714: 187, 187, 725: 7363, 1022: 7387}, + {186, 186, 6: 186, 186, 186, 15: 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 86: 186, 88: 186, 90: 186, 186, 95: 186, 186, 98: 186, 186, 186, 186, 540: 186, 543: 186, 186, 558: 186, 571: 186, 714: 186, 186, 725: 186}, + {548: 2335, 2335, 562: 4618, 567: 2335, 728: 7384, 808: 7383}, + {537: 7380, 548: 2335, 2335, 562: 4618, 567: 2335, 808: 7379}, + {548: 2335, 2335, 562: 4618, 567: 2335, 808: 7377}, // 4485 - {170, 170, 6: 170, 170, 170, 15: 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 86: 170, 88: 170, 90: 170, 170, 95: 170, 170, 98: 170, 170, 170, 170, 103: 170, 540: 170, 543: 170, 170, 558: 170, 570: 170, 714: 170, 170, 725: 170}, - {548: 4563, 4564, 564: 3053, 805: 4560, 831: 4562, 917: 7357}, - {174, 174, 6: 174, 174, 174, 15: 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 86: 174, 88: 174, 90: 174, 174, 95: 174, 174, 98: 174, 174, 174, 174, 103: 174, 540: 174, 543: 174, 174, 558: 174, 570: 174, 714: 174, 174, 725: 174}, - {548: 4563, 4564, 564: 3053, 805: 4560, 831: 4562, 917: 7359}, - {177, 177, 6: 177, 177, 177, 15: 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 86: 177, 88: 177, 90: 177, 177, 95: 177, 177, 98: 177, 177, 177, 177, 103: 177, 540: 177, 543: 177, 177, 558: 177, 570: 177, 714: 177, 177, 725: 177}, + {179, 179, 6: 179, 179, 179, 15: 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 86: 179, 88: 179, 90: 179, 179, 95: 179, 179, 98: 179, 179, 179, 179, 103: 179, 540: 179, 543: 179, 179, 558: 179, 571: 179, 714: 179, 179, 725: 179}, + {90: 7375, 95: 7376, 7373, 725: 7374}, + {548: 2335, 2335, 562: 4618, 567: 2335, 808: 7371}, + {176, 176, 6: 176, 176, 176, 15: 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 86: 176, 88: 176, 90: 176, 176, 95: 176, 176, 98: 176, 176, 176, 176, 103: 176, 540: 176, 543: 176, 176, 558: 176, 571: 176, 714: 176, 176, 725: 176}, + {548: 2335, 2335, 562: 4618, 567: 2335, 808: 7369}, // 4490 - {178, 178, 6: 178, 178, 178, 15: 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 86: 178, 88: 178, 90: 178, 178, 95: 178, 178, 98: 178, 178, 178, 178, 103: 178, 540: 178, 543: 178, 178, 558: 178, 570: 178, 714: 178, 178, 725: 178}, - {175, 175, 6: 175, 175, 175, 15: 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 86: 175, 88: 175, 90: 175, 175, 95: 175, 175, 98: 175, 175, 175, 175, 103: 175, 540: 175, 543: 175, 175, 558: 175, 570: 175, 714: 175, 175, 725: 175}, - {172, 172, 6: 172, 172, 172, 15: 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 86: 172, 88: 172, 90: 172, 172, 95: 172, 172, 98: 172, 172, 172, 172, 103: 172, 540: 172, 543: 172, 172, 558: 172, 570: 172, 714: 172, 172, 725: 172}, - {169, 169, 6: 169, 169, 169, 15: 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 86: 169, 88: 169, 90: 169, 169, 95: 169, 169, 98: 169, 169, 169, 169, 103: 169, 540: 169, 543: 169, 169, 558: 169, 570: 169, 714: 169, 169, 725: 169}, - {548: 4563, 4564, 564: 3053, 805: 4560, 831: 4562, 917: 7365}, + {173, 173, 6: 173, 173, 173, 15: 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 86: 173, 88: 173, 90: 173, 173, 95: 173, 173, 98: 173, 173, 173, 173, 103: 173, 540: 173, 543: 173, 173, 558: 173, 571: 173, 714: 173, 173, 725: 173}, + {171, 171, 6: 171, 171, 171, 15: 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 86: 171, 88: 171, 90: 171, 171, 95: 171, 171, 98: 171, 171, 171, 171, 103: 171, 540: 171, 543: 171, 171, 558: 171, 571: 171, 714: 171, 171, 725: 171}, + {170, 170, 6: 170, 170, 170, 15: 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 86: 170, 88: 170, 90: 170, 170, 95: 170, 170, 98: 170, 170, 170, 170, 103: 170, 540: 170, 543: 170, 170, 558: 170, 571: 170, 714: 170, 170, 725: 170}, + {548: 4571, 4572, 567: 3058, 805: 4568, 837: 4570, 919: 7370}, + {174, 174, 6: 174, 174, 174, 15: 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 86: 174, 88: 174, 90: 174, 174, 95: 174, 174, 98: 174, 174, 174, 174, 103: 174, 540: 174, 543: 174, 174, 558: 174, 571: 174, 714: 174, 174, 725: 174}, // 4495 - {180, 180, 6: 180, 180, 180, 15: 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 86: 180, 88: 180, 90: 180, 180, 95: 180, 180, 98: 180, 180, 180, 180, 103: 180, 540: 180, 543: 180, 180, 558: 180, 570: 180, 714: 180, 180, 725: 180}, - {548: 4563, 4564, 564: 3053, 805: 4560, 831: 4562, 917: 7369}, - {548: 4563, 4564, 564: 3053, 805: 4560, 831: 4562, 917: 7368}, - {181, 181, 6: 181, 181, 181, 15: 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 86: 181, 88: 181, 90: 181, 181, 95: 181, 181, 98: 181, 181, 181, 181, 103: 181, 540: 181, 543: 181, 181, 558: 181, 570: 181, 714: 181, 181, 725: 181}, - {182, 182, 6: 182, 182, 182, 15: 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 86: 182, 88: 182, 90: 182, 182, 95: 182, 182, 98: 182, 182, 182, 182, 103: 182, 540: 182, 543: 182, 182, 558: 182, 570: 182, 714: 182, 182, 725: 182}, + {548: 4571, 4572, 567: 3058, 805: 4568, 837: 4570, 919: 7372}, + {177, 177, 6: 177, 177, 177, 15: 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 86: 177, 88: 177, 90: 177, 177, 95: 177, 177, 98: 177, 177, 177, 177, 103: 177, 540: 177, 543: 177, 177, 558: 177, 571: 177, 714: 177, 177, 725: 177}, + {178, 178, 6: 178, 178, 178, 15: 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 86: 178, 88: 178, 90: 178, 178, 95: 178, 178, 98: 178, 178, 178, 178, 103: 178, 540: 178, 543: 178, 178, 558: 178, 571: 178, 714: 178, 178, 725: 178}, + {175, 175, 6: 175, 175, 175, 15: 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 86: 175, 88: 175, 90: 175, 175, 95: 175, 175, 98: 175, 175, 175, 175, 103: 175, 540: 175, 543: 175, 175, 558: 175, 571: 175, 714: 175, 175, 725: 175}, + {172, 172, 6: 172, 172, 172, 15: 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 86: 172, 88: 172, 90: 172, 172, 95: 172, 172, 98: 172, 172, 172, 172, 103: 172, 540: 172, 543: 172, 172, 558: 172, 571: 172, 714: 172, 172, 725: 172}, // 4500 - {548: 4563, 4564, 564: 3053, 805: 4560, 831: 4562, 917: 7373}, - {548: 4563, 4564, 564: 3053, 805: 4560, 831: 4562, 917: 7372}, - {183, 183, 6: 183, 183, 183, 15: 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 86: 183, 88: 183, 90: 183, 183, 95: 183, 183, 98: 183, 183, 183, 183, 103: 183, 540: 183, 543: 183, 183, 558: 183, 570: 183, 714: 183, 183, 725: 183}, - {184, 184, 6: 184, 184, 184, 15: 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 86: 184, 88: 184, 90: 184, 184, 95: 184, 184, 98: 184, 184, 184, 184, 103: 184, 540: 184, 543: 184, 184, 558: 184, 570: 184, 714: 184, 184, 725: 184}, - {185, 185, 6: 185, 185, 185, 15: 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 86: 185, 88: 185, 90: 185, 185, 95: 185, 185, 98: 185, 185, 185, 185, 540: 185, 543: 185, 185, 558: 185, 570: 185, 714: 185, 185, 725: 185}, + {169, 169, 6: 169, 169, 169, 15: 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 86: 169, 88: 169, 90: 169, 169, 95: 169, 169, 98: 169, 169, 169, 169, 103: 169, 540: 169, 543: 169, 169, 558: 169, 571: 169, 714: 169, 169, 725: 169}, + {548: 4571, 4572, 567: 3058, 805: 4568, 837: 4570, 919: 7378}, + {180, 180, 6: 180, 180, 180, 15: 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 86: 180, 88: 180, 90: 180, 180, 95: 180, 180, 98: 180, 180, 180, 180, 103: 180, 540: 180, 543: 180, 180, 558: 180, 571: 180, 714: 180, 180, 725: 180}, + {548: 4571, 4572, 567: 3058, 805: 4568, 837: 4570, 919: 7382}, + {548: 4571, 4572, 567: 3058, 805: 4568, 837: 4570, 919: 7381}, // 4505 - {189, 189}, - {2: 2130, 2130, 2130, 2130, 2130, 2130, 2130, 10: 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 58: 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 540: 2130, 583: 5367, 889: 7377}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 540: 4618, 777: 4617, 3067, 3068, 3066, 942: 7378}, - {110: 7385, 7383, 7382, 7384, 7381, 983: 7379, 1261: 7380}, - {2861, 2861, 9: 2861, 110: 2861, 2861, 2861, 2861, 2861}, + {181, 181, 6: 181, 181, 181, 15: 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 86: 181, 88: 181, 90: 181, 181, 95: 181, 181, 98: 181, 181, 181, 181, 103: 181, 540: 181, 543: 181, 181, 558: 181, 571: 181, 714: 181, 181, 725: 181}, + {182, 182, 6: 182, 182, 182, 15: 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 86: 182, 88: 182, 90: 182, 182, 95: 182, 182, 98: 182, 182, 182, 182, 103: 182, 540: 182, 543: 182, 182, 558: 182, 571: 182, 714: 182, 182, 725: 182}, + {548: 4571, 4572, 567: 3058, 805: 4568, 837: 4570, 919: 7386}, + {548: 4571, 4572, 567: 3058, 805: 4568, 837: 4570, 919: 7385}, + {183, 183, 6: 183, 183, 183, 15: 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 86: 183, 88: 183, 90: 183, 183, 95: 183, 183, 98: 183, 183, 183, 183, 103: 183, 540: 183, 543: 183, 183, 558: 183, 571: 183, 714: 183, 183, 725: 183}, // 4510 - {194, 194, 9: 7433, 110: 7385, 7383, 7382, 7384, 7381, 983: 7432}, - {561: 4610, 564: 2329, 808: 7430}, - {311: 2329, 321: 2329, 2329, 561: 4610, 808: 7425}, - {2838, 2838, 9: 2838, 110: 2838, 2838, 2838, 2838, 2838, 561: 4610, 564: 2329, 634: 2329, 2329, 808: 7423}, - {536: 2329, 553: 2329, 561: 4610, 808: 7399}, + {184, 184, 6: 184, 184, 184, 15: 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 86: 184, 88: 184, 90: 184, 184, 95: 184, 184, 98: 184, 184, 184, 184, 103: 184, 540: 184, 543: 184, 184, 558: 184, 571: 184, 714: 184, 184, 725: 184}, + {185, 185, 6: 185, 185, 185, 15: 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 86: 185, 88: 185, 90: 185, 185, 95: 185, 185, 98: 185, 185, 185, 185, 540: 185, 543: 185, 185, 558: 185, 571: 185, 714: 185, 185, 725: 185}, + {189, 189}, + {2: 2139, 2139, 2139, 2139, 2139, 2139, 2139, 10: 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 58: 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 540: 2139, 584: 5376, 890: 7390}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 540: 4626, 777: 4625, 3072, 3073, 3071, 944: 7391}, // 4515 - {536: 2329, 553: 2329, 561: 4610, 808: 7386}, - {536: 7387, 553: 7388}, - {57: 7390, 199: 7392, 1046: 7391, 1447: 7389}, - {2831, 2831, 9: 2831, 110: 2831, 2831, 2831, 2831, 2831}, - {9: 7397, 57: 7395, 199: 7392, 1046: 7396}, + {110: 7398, 7396, 7395, 7397, 7394, 984: 7392, 1261: 7393}, + {2867, 2867, 9: 2867, 110: 2867, 2867, 2867, 2867, 2867}, + {194, 194, 9: 7446, 110: 7398, 7396, 7395, 7397, 7394, 984: 7445}, + {562: 4618, 567: 2335, 808: 7443}, + {312: 2335, 323: 2335, 2335, 562: 4618, 808: 7438}, // 4520 - {2832, 2832, 9: 2832, 110: 2832, 2832, 2832, 2832, 2832}, - {9: 2830, 57: 2830, 199: 2830}, - {538: 2329, 561: 4610, 808: 7393}, - {538: 7394}, - {9: 2827, 57: 2827, 199: 2827}, - // 4525 - {2833, 2833, 9: 2833, 110: 2833, 2833, 2833, 2833, 2833}, - {9: 2829, 57: 2829, 199: 2829}, - {199: 7392, 1046: 7398}, - {9: 2828, 57: 2828, 199: 2828}, + {2844, 2844, 9: 2844, 110: 2844, 2844, 2844, 2844, 2844, 562: 4618, 567: 2335, 634: 2335, 2335, 808: 7436}, + {536: 2335, 553: 2335, 562: 4618, 808: 7412}, + {536: 2335, 553: 2335, 562: 4618, 808: 7399}, {536: 7400, 553: 7401}, + {57: 7403, 199: 7405, 1047: 7404, 1447: 7402}, + // 4525 + {2837, 2837, 9: 2837, 110: 2837, 2837, 2837, 2837, 2837}, + {9: 7410, 57: 7408, 199: 7405, 1047: 7409}, + {2838, 2838, 9: 2838, 110: 2838, 2838, 2838, 2838, 2838}, + {9: 2836, 57: 2836, 199: 2836}, + {538: 2335, 562: 4618, 808: 7406}, // 4530 - {57: 7407, 93: 7405, 134: 7406, 136: 7404, 1047: 7402, 1449: 7403}, - {2834, 2834, 9: 2834, 110: 2834, 2834, 2834, 2834, 2834}, - {9: 2855, 57: 2855, 93: 2855, 134: 2855, 136: 2855}, - {9: 7420, 57: 7421, 93: 7405, 134: 7406, 136: 7404, 1047: 7419}, - {538: 2329, 561: 4610, 808: 7417}, + {538: 7407}, + {9: 2833, 57: 2833, 199: 2833}, + {2839, 2839, 9: 2839, 110: 2839, 2839, 2839, 2839, 2839}, + {9: 2835, 57: 2835, 199: 2835}, + {199: 7405, 1047: 7411}, // 4535 - {229: 2329, 231: 2329, 561: 4610, 808: 7415, 939: 2329}, - {117: 2329, 258: 2329, 272: 2329, 561: 4610, 808: 7408}, - {2835, 2835, 9: 2835, 110: 2835, 2835, 2835, 2835, 2835}, - {117: 4605, 258: 4603, 272: 4604, 1263: 7409}, - {9: 2843, 57: 2843, 93: 2843, 134: 2843, 136: 2843, 158: 7411, 1507: 7410}, + {9: 2834, 57: 2834, 199: 2834}, + {536: 7413, 553: 7414}, + {57: 7420, 93: 7418, 135: 7419, 137: 7417, 1048: 7415, 1449: 7416}, + {2840, 2840, 9: 2840, 110: 2840, 2840, 2840, 2840, 2840}, + {9: 2861, 57: 2861, 93: 2861, 135: 2861, 137: 2861}, // 4540 - {9: 2844, 57: 2844, 93: 2844, 134: 2844, 136: 2844}, - {361: 2329, 538: 2329, 561: 4610, 808: 7412}, - {361: 7414, 538: 7413}, - {9: 2842, 57: 2842, 93: 2842, 134: 2842, 136: 2842}, - {9: 2841, 57: 2841, 93: 2841, 134: 2841, 136: 2841}, + {9: 7433, 57: 7434, 93: 7418, 135: 7419, 137: 7417, 1048: 7432}, + {538: 2335, 562: 4618, 808: 7430}, + {229: 2335, 231: 2335, 562: 4618, 808: 7428, 941: 2335}, + {117: 2335, 258: 2335, 272: 2335, 562: 4618, 808: 7421}, + {2841, 2841, 9: 2841, 110: 2841, 2841, 2841, 2841, 2841}, // 4545 - {229: 4613, 231: 4612, 939: 4614, 1262: 7416}, - {9: 2845, 57: 2845, 93: 2845, 134: 2845, 136: 2845}, - {538: 7418}, - {9: 2846, 57: 2846, 93: 2846, 134: 2846, 136: 2846}, - {9: 2854, 57: 2854, 93: 2854, 134: 2854, 136: 2854}, + {117: 4613, 258: 4611, 272: 4612, 1263: 7422}, + {9: 2849, 57: 2849, 93: 2849, 135: 2849, 137: 2849, 159: 7424, 1507: 7423}, + {9: 2850, 57: 2850, 93: 2850, 135: 2850, 137: 2850}, + {363: 2335, 538: 2335, 562: 4618, 808: 7425}, + {363: 7427, 538: 7426}, // 4550 - {93: 7405, 134: 7406, 136: 7404, 1047: 7422}, - {2836, 2836, 9: 2836, 110: 2836, 2836, 2836, 2836, 2836}, - {9: 2853, 57: 2853, 93: 2853, 134: 2853, 136: 2853}, - {564: 3053, 634: 6742, 6743, 805: 6741, 1004: 7424}, - {2837, 2837, 9: 2837, 110: 2837, 2837, 2837, 2837, 2837}, + {9: 2848, 57: 2848, 93: 2848, 135: 2848, 137: 2848}, + {9: 2847, 57: 2847, 93: 2847, 135: 2847, 137: 2847}, + {229: 4621, 231: 4620, 941: 4622, 1262: 7429}, + {9: 2851, 57: 2851, 93: 2851, 135: 2851, 137: 2851}, + {538: 7431}, // 4555 - {311: 7428, 321: 7426, 7427, 1448: 7429}, - {2858, 2858, 9: 2858, 110: 2858, 2858, 2858, 2858, 2858}, - {2857, 2857, 9: 2857, 110: 2857, 2857, 2857, 2857, 2857}, - {2856, 2856, 9: 2856, 110: 2856, 2856, 2856, 2856, 2856}, - {2839, 2839, 9: 2839, 110: 2839, 2839, 2839, 2839, 2839}, + {9: 2852, 57: 2852, 93: 2852, 135: 2852, 137: 2852}, + {9: 2860, 57: 2860, 93: 2860, 135: 2860, 137: 2860}, + {93: 7418, 135: 7419, 137: 7417, 1048: 7435}, + {2842, 2842, 9: 2842, 110: 2842, 2842, 2842, 2842, 2842}, + {9: 2859, 57: 2859, 93: 2859, 135: 2859, 137: 2859}, // 4560 - {564: 3053, 805: 3888, 817: 7431}, - {2840, 2840, 9: 2840, 110: 2840, 2840, 2840, 2840, 2840}, - {2860, 2860, 9: 2860, 110: 2860, 2860, 2860, 2860, 2860}, - {110: 7385, 7383, 7382, 7384, 7381, 983: 7434}, - {2859, 2859, 9: 2859, 110: 2859, 2859, 2859, 2859, 2859}, + {567: 3058, 634: 6762, 6763, 805: 6761, 1006: 7437}, + {2843, 2843, 9: 2843, 110: 2843, 2843, 2843, 2843, 2843}, + {312: 7441, 323: 7439, 7440, 1448: 7442}, + {2864, 2864, 9: 2864, 110: 2864, 2864, 2864, 2864, 2864}, + {2863, 2863, 9: 2863, 110: 2863, 2863, 2863, 2863, 2863}, // 4565 - {563: 7436, 566: 7437}, - {536: 2923, 2922, 552: 2921, 557: 2907, 592: 2906, 614: 2920, 701: 2916, 719: 3035, 781: 6357, 809: 6355, 812: 6358, 2917, 2918, 2919, 2928, 818: 2926, 2925, 2924, 822: 6356, 6360, 6359, 828: 3034, 6362, 6363, 832: 6364, 6361, 950: 7443}, - {262: 7438}, - {547: 7439}, - {117: 7440}, + {2862, 2862, 9: 2862, 110: 2862, 2862, 2862, 2862, 2862}, + {2845, 2845, 9: 2845, 110: 2845, 2845, 2845, 2845, 2845}, + {567: 3058, 805: 3893, 820: 7444}, + {2846, 2846, 9: 2846, 110: 2846, 2846, 2846, 2846, 2846}, + {2866, 2866, 9: 2866, 110: 2866, 2866, 2866, 2866, 2866}, // 4570 - {219: 7441}, - {538: 7442}, - {344, 344}, - {547: 7444}, - {536: 2923, 2922, 552: 2921, 557: 2907, 592: 2906, 614: 2920, 701: 2916, 719: 3035, 781: 6357, 809: 6355, 812: 6358, 2917, 2918, 2919, 2928, 818: 2926, 2925, 2924, 822: 6356, 6360, 6359, 828: 3034, 6362, 6363, 832: 6364, 6361, 950: 7445}, + {110: 7398, 7396, 7395, 7397, 7394, 984: 7447}, + {2865, 2865, 9: 2865, 110: 2865, 2865, 2865, 2865, 2865}, + {547: 7450, 563: 7449, 566: 7451}, + {536: 2929, 2928, 552: 2927, 557: 2913, 592: 2912, 613: 2926, 660: 2922, 719: 3039, 781: 6376, 809: 6374, 812: 6377, 2923, 2924, 2925, 2934, 2932, 2931, 2930, 821: 6375, 6379, 6378, 827: 3038, 829: 6381, 6382, 6383, 6380, 935: 7458}, + {536: 2929, 2928, 552: 2927, 557: 2913, 592: 2912, 613: 2926, 660: 2922, 719: 3039, 781: 6376, 809: 6374, 812: 6377, 2923, 2924, 2925, 2934, 2932, 2931, 2930, 821: 6375, 6379, 6378, 827: 3038, 829: 6381, 6382, 6383, 6380, 935: 7457}, // 4575 - {345, 345}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 6327, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 538: 6332, 777: 3759, 3067, 3068, 3066, 811: 5829, 904: 6334, 923: 7448, 6333, 1270: 7449, 1450: 7447}, - {419, 419, 9: 7450}, - {356, 356, 9: 356}, - {355, 355, 9: 355}, + {262: 7452}, + {547: 7453}, + {117: 7454}, + {220: 7455}, + {538: 7456}, // 4580 - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 6327, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 538: 6332, 777: 3759, 3067, 3068, 3066, 811: 5829, 904: 6334, 923: 7448, 6333, 1270: 7451}, - {354, 354, 9: 354}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 538: 3758, 636: 5875, 777: 3759, 3067, 3068, 3066, 811: 5874, 861: 5892, 1000: 5893, 1030: 7453}, - {401, 401, 6: 401, 9: 5895, 15: 401, 51: 401, 401, 401, 401, 401, 537: 401, 730: 5939, 1081: 5938, 7454}, - {409, 409, 6: 409, 15: 409, 51: 409, 409, 409, 409, 409, 537: 7456, 1137: 7455}, + {350, 350}, + {351, 351}, + {547: 7459}, + {536: 2929, 2928, 552: 2927, 557: 2913, 592: 2912, 613: 2926, 660: 2922, 719: 3039, 781: 6376, 809: 6374, 812: 6377, 2923, 2924, 2925, 2934, 2932, 2931, 2930, 821: 6375, 6379, 6378, 827: 3038, 829: 6381, 6382, 6383, 6380, 935: 7460}, + {352, 352}, // 4585 - {382, 382, 6: 382, 15: 7472, 51: 382, 382, 7471, 7473, 7474, 1074: 7470, 1241: 7469, 7468}, - {163: 7461, 7459, 7460, 7462, 1136: 7458, 1346: 7457}, - {408, 408, 6: 408, 15: 408, 51: 408, 408, 408, 408, 408, 163: 7461, 7459, 7460, 7462, 1136: 7467}, - {407, 407, 6: 407, 15: 407, 51: 407, 407, 407, 407, 407, 163: 407, 407, 407, 407}, - {564: 3053, 805: 4560, 831: 7466}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 6346, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 538: 6351, 777: 3764, 3072, 3073, 3071, 811: 5849, 904: 6353, 925: 7463, 6352, 1269: 7464, 1450: 7462}, + {426, 426, 9: 7465}, + {363, 363, 9: 363}, + {362, 362, 9: 362}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 6346, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 538: 6351, 777: 3764, 3072, 3073, 3071, 811: 5849, 904: 6353, 925: 7463, 6352, 1269: 7466}, // 4590 - {564: 3053, 805: 4560, 831: 7465}, - {564: 3053, 805: 4560, 831: 7464}, - {564: 3053, 805: 4560, 831: 7463}, - {402, 402, 6: 402, 15: 402, 51: 402, 402, 402, 402, 402, 163: 402, 402, 402, 402}, - {403, 403, 6: 403, 15: 403, 51: 403, 403, 403, 403, 403, 163: 403, 403, 403, 403}, + {361, 361, 9: 361}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 538: 3763, 636: 5895, 777: 3764, 3072, 3073, 3071, 811: 5894, 861: 5912, 1002: 5913, 1031: 7468}, + {408, 408, 6: 408, 9: 5915, 15: 408, 51: 408, 408, 408, 408, 408, 537: 408, 730: 5959, 1083: 5958, 7469}, + {416, 416, 6: 416, 15: 416, 51: 416, 416, 416, 416, 416, 537: 7471, 1140: 7470}, + {389, 389, 6: 389, 15: 7487, 51: 389, 389, 7486, 7488, 7489, 1076: 7485, 1242: 7484, 7483}, // 4595 - {404, 404, 6: 404, 15: 404, 51: 404, 404, 404, 404, 404, 163: 404, 404, 404, 404}, - {405, 405, 6: 405, 15: 405, 51: 405, 405, 405, 405, 405, 163: 405, 405, 405, 405}, - {406, 406, 6: 406, 15: 406, 51: 406, 406, 406, 406, 406, 163: 406, 406, 406, 406}, - {387, 387, 6: 7496, 51: 387, 7497, 1134: 7495}, - {381, 381, 6: 381, 15: 7472, 51: 381, 381, 7471, 7473, 7474, 1074: 7494}, + {165: 7476, 7474, 7475, 7477, 1139: 7473, 1344: 7472}, + {415, 415, 6: 415, 15: 415, 51: 415, 415, 415, 415, 415, 165: 7476, 7474, 7475, 7477, 1139: 7482}, + {414, 414, 6: 414, 15: 414, 51: 414, 414, 414, 414, 414, 165: 414, 414, 414, 414}, + {567: 3058, 805: 4568, 837: 7481}, + {567: 3058, 805: 4568, 837: 7480}, // 4600 - {380, 380, 6: 380, 15: 380, 51: 380, 380, 380, 380, 380}, - {567: 7493, 1096: 7492}, - {262: 7478, 391: 7480, 434: 7479}, - {564: 3053, 805: 4560, 831: 7477}, - {203: 7476, 564: 3053, 805: 4560, 831: 7475}, + {567: 3058, 805: 4568, 837: 7479}, + {567: 3058, 805: 4568, 837: 7478}, + {409, 409, 6: 409, 15: 409, 51: 409, 409, 409, 409, 409, 165: 409, 409, 409, 409}, + {410, 410, 6: 410, 15: 410, 51: 410, 410, 410, 410, 410, 165: 410, 410, 410, 410}, + {411, 411, 6: 411, 15: 411, 51: 411, 411, 411, 411, 411, 165: 411, 411, 411, 411}, // 4605 - {367, 367, 6: 367, 15: 367, 51: 367, 367, 367, 367, 367}, - {366, 366, 6: 366, 15: 366, 51: 366, 366, 366, 366, 366}, - {368, 368, 6: 368, 15: 368, 51: 368, 368, 368, 368, 368}, - {540: 7490, 564: 3053, 805: 7491}, - {646: 7486}, + {412, 412, 6: 412, 15: 412, 51: 412, 412, 412, 412, 412, 165: 412, 412, 412, 412}, + {413, 413, 6: 413, 15: 413, 51: 413, 413, 413, 413, 413, 165: 413, 413, 413, 413}, + {394, 394, 6: 7511, 51: 394, 7512, 1137: 7510}, + {388, 388, 6: 388, 15: 7487, 51: 388, 388, 7486, 7488, 7489, 1076: 7509}, + {387, 387, 6: 387, 15: 387, 51: 387, 387, 387, 387, 387}, // 4610 - {372, 372, 6: 372, 15: 372, 51: 372, 372, 372, 372, 372, 411: 7482, 540: 7483, 646: 7481}, - {564: 3053, 805: 4560, 831: 7484}, - {370, 370, 6: 370, 15: 370, 51: 370, 370, 370, 370, 370}, - {369, 369, 6: 369, 15: 369, 51: 369, 369, 369, 369, 369}, - {133: 7485}, - // 4615 - {371, 371, 6: 371, 15: 371, 51: 371, 371, 371, 371, 371}, - {540: 7487, 564: 3053, 805: 7488}, + {568: 7508, 1099: 7507}, + {262: 7493, 392: 7495, 434: 7494}, + {567: 3058, 805: 4568, 837: 7492}, + {203: 7491, 567: 3058, 805: 4568, 837: 7490}, {374, 374, 6: 374, 15: 374, 51: 374, 374, 374, 374, 374}, - {133: 7489}, + // 4615 {373, 373, 6: 373, 15: 373, 51: 373, 373, 373, 373, 373}, + {375, 375, 6: 375, 15: 375, 51: 375, 375, 375, 375, 375}, + {540: 7505, 567: 3058, 805: 7506}, + {646: 7501}, + {379, 379, 6: 379, 15: 379, 51: 379, 379, 379, 379, 379, 410: 7497, 540: 7498, 646: 7496}, // 4620 + {567: 3058, 805: 4568, 837: 7499}, + {377, 377, 6: 377, 15: 377, 51: 377, 377, 377, 377, 377}, {376, 376, 6: 376, 15: 376, 51: 376, 376, 376, 376, 376}, - {375, 375, 6: 375, 15: 375, 51: 375, 375, 375, 375, 375}, + {134: 7500}, {378, 378, 6: 378, 15: 378, 51: 378, 378, 378, 378, 378}, - {377, 377, 6: 377, 15: 377, 51: 377, 377, 377, 377, 377}, - {379, 379, 6: 379, 15: 379, 51: 379, 379, 379, 379, 379}, // 4625 - {384, 384, 51: 7501, 1260: 7500}, - {538: 7499}, - {538: 7498}, - {385, 385, 51: 385}, - {386, 386, 51: 386}, + {540: 7502, 567: 3058, 805: 7503}, + {381, 381, 6: 381, 15: 381, 51: 381, 381, 381, 381, 381}, + {134: 7504}, + {380, 380, 6: 380, 15: 380, 51: 380, 380, 380, 380, 380}, + {383, 383, 6: 383, 15: 383, 51: 383, 383, 383, 383, 383}, // 4630 - {420, 420}, - {576: 7502}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 540: 4618, 777: 4617, 3067, 3068, 3066, 942: 7503}, - {383, 383}, - {18: 2377, 102: 2377, 132: 2377, 181: 2377, 661: 2377}, + {382, 382, 6: 382, 15: 382, 51: 382, 382, 382, 382, 382}, + {385, 385, 6: 385, 15: 385, 51: 385, 385, 385, 385, 385}, + {384, 384, 6: 384, 15: 384, 51: 384, 384, 384, 384, 384}, + {386, 386, 6: 386, 15: 386, 51: 386, 386, 386, 386, 386}, + {391, 391, 51: 7516, 1260: 7515}, // 4635 - {132: 2372, 181: 7557, 661: 2372, 1501: 7556}, - {561: 7552}, - {215: 7508}, - {2: 2130, 2130, 2130, 2130, 2130, 2130, 2130, 10: 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 58: 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 583: 5367, 889: 7509}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 5538, 3067, 3068, 3066, 995: 7510}, + {538: 7514}, + {538: 7513}, + {392, 392, 51: 392}, + {393, 393, 51: 393}, + {427, 427}, // 4640 - {108: 7514, 119: 7519, 7521, 7515, 7520, 7523, 7517, 7513, 7518, 128: 7524, 7522, 7516, 982: 7511, 1244: 7512}, - {2826, 2826, 9: 2826, 108: 2826, 119: 2826, 2826, 2826, 2826, 2826, 2826, 2826, 2826, 128: 2826, 2826, 2826}, - {191, 191, 9: 7550, 108: 7514, 119: 7519, 7521, 7515, 7520, 7523, 7517, 7513, 7518, 128: 7524, 7522, 7516, 982: 7549}, - {538: 2329, 561: 4610, 808: 7547}, - {538: 2329, 561: 4610, 808: 7545}, + {577: 7517}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 540: 4626, 777: 4625, 3072, 3073, 3071, 944: 7518}, + {390, 390}, + {18: 2383, 102: 2383, 133: 2383, 181: 2383, 661: 2383}, + {133: 2378, 181: 7572, 661: 2378, 1501: 7571}, // 4645 - {561: 4610, 564: 2329, 808: 7543}, - {561: 4610, 564: 2329, 808: 7541}, - {561: 4610, 564: 2329, 808: 7539}, - {538: 2329, 561: 4610, 808: 7537}, - {538: 2329, 561: 4610, 808: 7535}, + {562: 7567}, + {215: 7523}, + {2: 2139, 2139, 2139, 2139, 2139, 2139, 2139, 10: 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 58: 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 584: 5376, 890: 7524}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 5547, 3072, 3073, 3071, 996: 7525}, + {108: 7529, 119: 7534, 7536, 7530, 7535, 7538, 7532, 7528, 7533, 128: 7539, 7537, 7531, 983: 7526, 1244: 7527}, // 4650 - {538: 2329, 561: 4610, 808: 7533}, - {538: 2329, 561: 4610, 808: 7531}, - {538: 2329, 561: 4610, 808: 7529}, - {538: 2329, 561: 4610, 808: 7527}, - {538: 2329, 561: 4610, 808: 7525}, + {2832, 2832, 9: 2832, 108: 2832, 119: 2832, 2832, 2832, 2832, 2832, 2832, 2832, 2832, 128: 2832, 2832, 2832}, + {191, 191, 9: 7565, 108: 7529, 119: 7534, 7536, 7530, 7535, 7538, 7532, 7528, 7533, 128: 7539, 7537, 7531, 983: 7564}, + {538: 2335, 562: 4618, 808: 7562}, + {538: 2335, 562: 4618, 808: 7560}, + {562: 4618, 567: 2335, 808: 7558}, // 4655 - {538: 7526}, - {2812, 2812, 9: 2812, 108: 2812, 119: 2812, 2812, 2812, 2812, 2812, 2812, 2812, 2812, 128: 2812, 2812, 2812}, - {538: 7528}, - {2813, 2813, 9: 2813, 108: 2813, 119: 2813, 2813, 2813, 2813, 2813, 2813, 2813, 2813, 128: 2813, 2813, 2813}, - {538: 7530}, + {562: 4618, 567: 2335, 808: 7556}, + {562: 4618, 567: 2335, 808: 7554}, + {538: 2335, 562: 4618, 808: 7552}, + {538: 2335, 562: 4618, 808: 7550}, + {538: 2335, 562: 4618, 808: 7548}, // 4660 - {2814, 2814, 9: 2814, 108: 2814, 119: 2814, 2814, 2814, 2814, 2814, 2814, 2814, 2814, 128: 2814, 2814, 2814}, - {538: 7532}, - {2815, 2815, 9: 2815, 108: 2815, 119: 2815, 2815, 2815, 2815, 2815, 2815, 2815, 2815, 128: 2815, 2815, 2815}, - {538: 7534}, - {2816, 2816, 9: 2816, 108: 2816, 119: 2816, 2816, 2816, 2816, 2816, 2816, 2816, 2816, 128: 2816, 2816, 2816}, + {538: 2335, 562: 4618, 808: 7546}, + {538: 2335, 562: 4618, 808: 7544}, + {538: 2335, 562: 4618, 808: 7542}, + {538: 2335, 562: 4618, 808: 7540}, + {538: 7541}, // 4665 - {538: 7536}, - {2817, 2817, 9: 2817, 108: 2817, 119: 2817, 2817, 2817, 2817, 2817, 2817, 2817, 2817, 128: 2817, 2817, 2817}, - {538: 7538}, {2818, 2818, 9: 2818, 108: 2818, 119: 2818, 2818, 2818, 2818, 2818, 2818, 2818, 2818, 128: 2818, 2818, 2818}, - {564: 3053, 805: 3888, 817: 7540}, - // 4670 + {538: 7543}, {2819, 2819, 9: 2819, 108: 2819, 119: 2819, 2819, 2819, 2819, 2819, 2819, 2819, 2819, 128: 2819, 2819, 2819}, - {564: 3053, 805: 3888, 817: 7542}, + {538: 7545}, {2820, 2820, 9: 2820, 108: 2820, 119: 2820, 2820, 2820, 2820, 2820, 2820, 2820, 2820, 128: 2820, 2820, 2820}, - {564: 3053, 805: 3888, 817: 7544}, + // 4670 + {538: 7547}, {2821, 2821, 9: 2821, 108: 2821, 119: 2821, 2821, 2821, 2821, 2821, 2821, 2821, 2821, 128: 2821, 2821, 2821}, - // 4675 - {538: 7546}, + {538: 7549}, {2822, 2822, 9: 2822, 108: 2822, 119: 2822, 2822, 2822, 2822, 2822, 2822, 2822, 2822, 128: 2822, 2822, 2822}, - {538: 7548}, + {538: 7551}, + // 4675 {2823, 2823, 9: 2823, 108: 2823, 119: 2823, 2823, 2823, 2823, 2823, 2823, 2823, 2823, 128: 2823, 2823, 2823}, + {538: 7553}, + {2824, 2824, 9: 2824, 108: 2824, 119: 2824, 2824, 2824, 2824, 2824, 2824, 2824, 2824, 128: 2824, 2824, 2824}, + {567: 3058, 805: 3893, 820: 7555}, {2825, 2825, 9: 2825, 108: 2825, 119: 2825, 2825, 2825, 2825, 2825, 2825, 2825, 2825, 128: 2825, 2825, 2825}, // 4680 - {108: 7514, 119: 7519, 7521, 7515, 7520, 7523, 7517, 7513, 7518, 128: 7524, 7522, 7516, 982: 7551}, - {2824, 2824, 9: 2824, 108: 2824, 119: 2824, 2824, 2824, 2824, 2824, 2824, 2824, 2824, 128: 2824, 2824, 2824}, - {4: 7554, 452: 7555, 460: 7553}, - {132: 2375, 181: 2375, 661: 2375}, - {132: 2374, 181: 2374, 661: 2374}, + {567: 3058, 805: 3893, 820: 7557}, + {2826, 2826, 9: 2826, 108: 2826, 119: 2826, 2826, 2826, 2826, 2826, 2826, 2826, 2826, 128: 2826, 2826, 2826}, + {567: 3058, 805: 3893, 820: 7559}, + {2827, 2827, 9: 2827, 108: 2827, 119: 2827, 2827, 2827, 2827, 2827, 2827, 2827, 2827, 128: 2827, 2827, 2827}, + {538: 7561}, // 4685 - {132: 2373, 181: 2373, 661: 2373}, - {132: 2370, 661: 7561, 1504: 7560}, - {561: 7558}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 538: 3758, 636: 5875, 777: 3759, 3067, 3068, 3066, 811: 5874, 861: 7559}, - {132: 2371, 661: 2371}, + {2828, 2828, 9: 2828, 108: 2828, 119: 2828, 2828, 2828, 2828, 2828, 2828, 2828, 2828, 128: 2828, 2828, 2828}, + {538: 7563}, + {2829, 2829, 9: 2829, 108: 2829, 119: 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 128: 2829, 2829, 2829}, + {2831, 2831, 9: 2831, 108: 2831, 119: 2831, 2831, 2831, 2831, 2831, 2831, 2831, 2831, 128: 2831, 2831, 2831}, + {108: 7529, 119: 7534, 7536, 7530, 7535, 7538, 7532, 7528, 7533, 128: 7539, 7537, 7531, 983: 7566}, // 4690 - {132: 7565}, - {438: 7562}, - {181: 7563, 402: 7564}, - {132: 2369}, - {132: 2368}, + {2830, 2830, 9: 2830, 108: 2830, 119: 2830, 2830, 2830, 2830, 2830, 2830, 2830, 2830, 128: 2830, 2830, 2830}, + {4: 7569, 451: 7570, 459: 7568}, + {133: 2381, 181: 2381, 661: 2381}, + {133: 2380, 181: 2380, 661: 2380}, + {133: 2379, 181: 2379, 661: 2379}, // 4695 - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 3949, 3067, 3068, 3066, 810: 7567, 1503: 7566}, - {536: 7569, 542: 2366, 1502: 7568}, - {536: 2367, 542: 2367}, - {542: 7575}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 7571, 3067, 3068, 3066, 1341: 7570}, + {133: 2376, 661: 7576, 1504: 7575}, + {562: 7573}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 538: 3763, 636: 5895, 777: 3764, 3072, 3073, 3071, 811: 5894, 861: 7574}, + {133: 2377, 661: 2377}, + {133: 7580}, // 4700 - {9: 7573, 57: 7572}, - {9: 2364, 57: 2364}, - {542: 2365}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 7574, 3067, 3068, 3066}, - {9: 2363, 57: 2363}, + {438: 7577}, + {181: 7578, 402: 7579}, + {133: 2375}, + {133: 2374}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 565: 3955, 777: 3954, 3072, 3073, 3071, 810: 7582, 1503: 7581}, // 4705 - {536: 2923, 2922, 552: 2921, 614: 2920, 701: 2916, 781: 7579, 812: 7577, 2917, 2918, 2919, 2928, 818: 2926, 2925, 2924, 822: 3868, 7578, 7576, 1351: 7580}, - {2385, 2385, 537: 2385}, - {2384, 2384, 537: 2384, 544: 1021, 555: 1021, 1021}, - {2383, 2383, 537: 2383}, - {2382, 2382, 537: 2382, 544: 1020, 555: 1020, 1020, 559: 3881, 562: 3880, 569: 3879, 848: 3882, 3883}, + {536: 7584, 542: 2372, 1502: 7583}, + {536: 2373, 542: 2373}, + {542: 7590}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 7586, 3072, 3073, 3071, 1339: 7585}, + {9: 7588, 57: 7587}, // 4710 - {2362, 2362, 537: 7582, 1500: 7581}, - {2379, 2379}, - {173: 7584, 373: 7583}, - {709: 7587}, - {709: 7585}, + {9: 2370, 57: 2370}, + {542: 2371}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 7589, 3072, 3073, 3071}, + {9: 2369, 57: 2369}, + {536: 2929, 2928, 552: 2927, 613: 2926, 660: 2922, 781: 7594, 812: 7592, 2923, 2924, 2925, 2934, 2932, 2931, 2930, 821: 3873, 7593, 7591, 1349: 7595}, // 4715 - {1012: 7586}, - {2360, 2360}, - {1012: 7588}, - {2361, 2361}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 5976, 3067, 3068, 3066, 913: 7590}, + {2391, 2391, 537: 2391}, + {2390, 2390, 537: 2390, 544: 1029, 555: 1029, 1029}, + {2389, 2389, 537: 2389}, + {2388, 2388, 537: 2388, 544: 1028, 555: 1028, 1028, 559: 3886, 3885, 570: 3884, 847: 3887, 3888}, + {2368, 2368, 537: 7597, 1500: 7596}, // 4720 - {2468, 2468, 16: 2459, 18: 2459, 21: 2459, 540: 4746, 543: 2459, 558: 2459, 560: 7594, 714: 2459, 871: 7593, 897: 7592, 960: 7596, 1043: 7595, 1353: 7591}, - {2479, 2479}, - {16: 4440, 18: 4703, 21: 7604, 543: 7603, 558: 4441, 714: 4439, 859: 7602, 871: 7605}, - {2470, 2470, 16: 2470, 18: 2470, 21: 2470, 540: 2470, 543: 2470, 558: 2470, 560: 2470, 714: 2470}, - {202: 7598}, + {2385, 2385}, + {160: 7599, 374: 7598}, + {709: 7602}, + {709: 7600}, + {1014: 7601}, // 4725 - {2467, 2467, 16: 2459, 18: 2459, 21: 2459, 540: 4746, 543: 2459, 558: 2459, 560: 7594, 714: 2459, 871: 7593, 897: 7592, 960: 7597}, - {2466, 2466, 16: 2466, 18: 2466, 21: 2466, 540: 2466, 543: 2466, 558: 2466, 560: 2466, 714: 2466}, - {2465, 2465, 16: 2465, 18: 2465, 21: 2465, 540: 2465, 543: 2465, 558: 2465, 560: 2465, 714: 2465}, - {224: 7599}, - {564: 3053, 805: 3888, 817: 7600}, + {2366, 2366}, + {1014: 7603}, + {2367, 2367}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 5996, 3072, 3073, 3071, 913: 7605}, + {2474, 2474, 16: 2465, 18: 2465, 21: 2465, 540: 4755, 543: 2465, 558: 2465, 561: 7609, 714: 2465, 871: 7608, 897: 7607, 962: 7611, 1044: 7610, 1351: 7606}, // 4730 - {2795, 2795, 16: 2795, 18: 2795, 21: 2795, 221: 5511, 540: 2795, 543: 2795, 558: 2795, 560: 2795, 714: 2795, 1063: 7601}, - {2469, 2469, 16: 2469, 18: 2469, 21: 2469, 540: 2469, 543: 2469, 558: 2469, 560: 2469, 714: 2469}, - {2: 2329, 2329, 2329, 2329, 2329, 2329, 2329, 10: 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 58: 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 538: 2329, 561: 4610, 591: 2329, 808: 7610}, - {2: 2329, 2329, 2329, 2329, 2329, 2329, 2329, 10: 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 58: 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329, 538: 2329, 561: 4610, 591: 2329, 808: 7608}, - {538: 2329, 561: 4610, 808: 7606}, + {2485, 2485}, + {16: 4448, 18: 4712, 21: 7619, 543: 7618, 558: 4449, 714: 4447, 859: 7617, 871: 7620}, + {2476, 2476, 16: 2476, 18: 2476, 21: 2476, 540: 2476, 543: 2476, 558: 2476, 561: 2476, 714: 2476}, + {202: 7613}, + {2473, 2473, 16: 2465, 18: 2465, 21: 2465, 540: 4755, 543: 2465, 558: 2465, 561: 7609, 714: 2465, 871: 7608, 897: 7607, 962: 7612}, // 4735 - {2471, 2471, 16: 2471, 18: 2471, 21: 2471, 540: 2471, 543: 2471, 558: 2471, 560: 2471, 714: 2471}, - {538: 4818, 1173: 7607}, - {2472, 2472, 16: 2472, 18: 2472, 21: 2472, 540: 2472, 543: 2472, 558: 2472, 560: 2472, 714: 2472}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 538: 3758, 591: 3757, 777: 3759, 3067, 3068, 3066, 811: 3756, 980: 7609}, - {2473, 2473, 16: 2473, 18: 2473, 21: 2473, 540: 2473, 543: 2473, 558: 2473, 560: 2473, 714: 2473}, + {2472, 2472, 16: 2472, 18: 2472, 21: 2472, 540: 2472, 543: 2472, 558: 2472, 561: 2472, 714: 2472}, + {2471, 2471, 16: 2471, 18: 2471, 21: 2471, 540: 2471, 543: 2471, 558: 2471, 561: 2471, 714: 2471}, + {217: 7614}, + {567: 3058, 805: 3893, 820: 7615}, + {2801, 2801, 16: 2801, 18: 2801, 21: 2801, 222: 5520, 540: 2801, 543: 2801, 558: 2801, 561: 2801, 714: 2801, 1065: 7616}, // 4740 - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 538: 3758, 591: 4376, 777: 3759, 3067, 3068, 3066, 811: 4375, 911: 7611}, - {2474, 2474, 16: 2474, 18: 2474, 21: 2474, 540: 2474, 543: 2474, 558: 2474, 560: 2474, 714: 2474}, - {2: 2130, 2130, 2130, 2130, 2130, 2130, 2130, 10: 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 58: 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 583: 5367, 889: 7613}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 7614, 3067, 3068, 3066}, - {104: 5401, 535: 2113, 547: 5400, 967: 7616, 1383: 7615}, + {2475, 2475, 16: 2475, 18: 2475, 21: 2475, 540: 2475, 543: 2475, 558: 2475, 561: 2475, 714: 2475}, + {2: 2335, 2335, 2335, 2335, 2335, 2335, 2335, 10: 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 58: 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 538: 2335, 562: 4618, 591: 2335, 808: 7625}, + {2: 2335, 2335, 2335, 2335, 2335, 2335, 2335, 10: 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 58: 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335, 538: 2335, 562: 4618, 591: 2335, 808: 7623}, + {538: 2335, 562: 4618, 808: 7621}, + {2477, 2477, 16: 2477, 18: 2477, 21: 2477, 540: 2477, 543: 2477, 558: 2477, 561: 2477, 714: 2477}, // 4745 - {535: 7617}, - {535: 2112}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 3949, 3067, 3068, 3066, 810: 7618}, - {536: 7619}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 536: 5136, 777: 4046, 3067, 3068, 3066, 827: 5135, 928: 5134, 938: 7620}, + {538: 4827, 1175: 7622}, + {2478, 2478, 16: 2478, 18: 2478, 21: 2478, 540: 2478, 543: 2478, 558: 2478, 561: 2478, 714: 2478}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 538: 3763, 591: 3762, 777: 3764, 3072, 3073, 3071, 811: 3761, 981: 7624}, + {2479, 2479, 16: 2479, 18: 2479, 21: 2479, 540: 2479, 543: 2479, 558: 2479, 561: 2479, 714: 2479}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 538: 3763, 591: 4384, 777: 3764, 3072, 3073, 3071, 811: 4383, 911: 7626}, // 4750 - {9: 5145, 57: 7621}, - {2124, 2124, 6: 2124, 19: 2124, 102: 2124, 104: 2124, 2124, 2124, 2124, 109: 2124, 537: 2124, 547: 2124, 567: 2124, 989: 7622}, - {2490, 2490, 6: 5397, 19: 5394, 102: 4741, 104: 5401, 5246, 4948, 5247, 109: 4947, 537: 5396, 547: 5400, 567: 4742, 965: 5398, 967: 5395, 977: 5399, 7146, 988: 5393, 992: 7145, 1199: 7623}, - {2497, 2497}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 7625, 3067, 3068, 3066}, + {2480, 2480, 16: 2480, 18: 2480, 21: 2480, 540: 2480, 543: 2480, 558: 2480, 561: 2480, 714: 2480}, + {2: 2139, 2139, 2139, 2139, 2139, 2139, 2139, 10: 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 58: 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 584: 5376, 890: 7628}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 7629, 3072, 3073, 3071}, + {104: 5410, 535: 2122, 547: 5409, 969: 7631, 1382: 7630}, + {535: 7632}, // 4755 - {536: 7626}, - {286: 5430, 294: 5432, 297: 5431, 1293: 7627}, - {57: 7628}, - {535: 7629}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 3949, 3067, 3068, 3066, 810: 7630}, + {535: 2121}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 565: 3955, 777: 3954, 3072, 3073, 3071, 810: 7633}, + {536: 7634}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 536: 5145, 777: 4054, 3072, 3073, 3071, 828: 5144, 930: 5143, 940: 7635}, + {9: 5154, 57: 7636}, // 4760 - {536: 7631}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 4046, 3067, 3068, 3066, 827: 4047, 912: 7632}, - {9: 4049, 57: 7633}, - {2499, 2499}, - {2606, 2606}, + {2133, 2133, 6: 2133, 19: 2133, 102: 2133, 104: 2133, 2133, 2133, 2133, 109: 2133, 537: 2133, 547: 2133, 568: 2133, 990: 7637}, + {2496, 2496, 6: 5406, 19: 5403, 102: 4750, 104: 5410, 5255, 4957, 5256, 109: 4956, 537: 5405, 547: 5409, 568: 4751, 967: 5407, 969: 5404, 978: 5408, 7159, 989: 5402, 993: 7158, 1200: 7638}, + {2503, 2503}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 7640, 3072, 3073, 3071}, + {536: 7641}, // 4765 - {2631, 2631}, - {2637, 2637, 537: 7638, 734: 7637}, - {195: 7645, 774: 7644}, - {374: 7640, 383: 7639}, - {60: 7643}, + {287: 5439, 295: 5441, 298: 5440, 1292: 7642}, + {57: 7643}, + {535: 7644}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 565: 3955, 777: 3954, 3072, 3073, 3071, 810: 7645}, + {536: 7646}, // 4770 - {382: 7641}, - {195: 7642}, - {2634, 2634}, - {2635, 2635}, - {2636, 2636}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 4054, 3072, 3073, 3071, 828: 4055, 912: 7647}, + {9: 4057, 57: 7648}, + {2505, 2505}, + {2612, 2612}, + {2637, 2637}, // 4775 - {2633, 2633, 736: 4663, 1001: 7646}, - {2632, 2632}, - {2639, 2639}, - {2638, 2638}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 3949, 3067, 3068, 3066, 810: 7662, 890: 7661}, + {2643, 2643, 537: 7653, 734: 7652}, + {196: 7660, 775: 7659}, + {375: 7655, 384: 7654}, + {60: 7658}, + {383: 7656}, // 4780 - {614: 7651}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 3949, 3067, 3068, 3066, 810: 7652}, - {551: 7654, 715: 7653}, - {1114, 1114, 3316, 3471, 3280, 3156, 3196, 3318, 3080, 1114, 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 537: 1114, 708: 5566, 777: 5565, 3067, 3068, 3066, 966: 7659}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 5277, 3067, 3068, 3066, 865: 7655}, + {196: 7657}, + {2640, 2640}, + {2641, 2641}, + {2642, 2642}, + {2639, 2639, 736: 4671, 1003: 7661}, // 4785 - {9: 5278, 715: 7656}, - {1114, 1114, 3316, 3471, 3280, 3156, 3196, 3318, 3080, 1114, 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 537: 1114, 708: 5566, 777: 5565, 3067, 3068, 3066, 966: 7657}, - {2655, 2655, 9: 5568, 537: 5549, 908: 7658}, - {2663, 2663}, - {2655, 2655, 9: 5568, 537: 5549, 908: 7660}, + {2638, 2638}, + {2645, 2645}, + {2644, 2644}, + {316: 7666, 613: 7665}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 565: 3955, 777: 3954, 3072, 3073, 3071, 810: 7678, 889: 7677}, // 4790 - {2666, 2666}, - {2658, 2658, 9: 3952, 216: 7682, 537: 2658, 721: 7681, 1107: 7692}, - {1259, 1259, 9: 1259, 131: 7667, 216: 1259, 537: 1259, 551: 7664, 715: 7663, 719: 7665, 721: 1259, 732: 7666}, - {1114, 1114, 3316, 3471, 3280, 3156, 3196, 3318, 3080, 1114, 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 537: 1114, 708: 5566, 777: 5565, 3067, 3068, 3066, 966: 7690}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 5277, 3067, 3068, 3066, 865: 7677}, + {613: 7667}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 565: 3955, 777: 3954, 3072, 3073, 3071, 810: 7668}, + {551: 7670, 715: 7669}, + {1122, 1122, 3321, 3476, 3285, 3160, 3201, 3323, 3085, 1122, 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 537: 1122, 708: 5575, 777: 5574, 3072, 3073, 3071, 968: 7675}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 5286, 3072, 3073, 3071, 865: 7671}, // 4795 - {312: 7673}, - {312: 7670}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 6501, 3067, 3068, 3066, 986: 7668}, - {2655, 2655, 9: 6503, 537: 5549, 908: 7669}, - {2660, 2660}, + {9: 5287, 715: 7672}, + {1122, 1122, 3321, 3476, 3285, 3160, 3201, 3323, 3085, 1122, 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 537: 1122, 708: 5575, 777: 5574, 3072, 3073, 3071, 968: 7673}, + {2661, 2661, 9: 5577, 537: 5558, 908: 7674}, + {2669, 2669}, + {2661, 2661, 9: 5577, 537: 5558, 908: 7676}, // 4800 - {535: 7671}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 6501, 3067, 3068, 3066, 986: 7672}, - {2661, 2661, 9: 6503}, - {535: 7674}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 6501, 3067, 3068, 3066, 986: 7675}, + {2672, 2672}, + {2664, 2664, 9: 3958, 216: 7698, 537: 2664, 721: 7697, 1110: 7708}, + {1267, 1267, 9: 1267, 131: 7683, 216: 1267, 537: 1267, 551: 7680, 715: 7679, 719: 7681, 721: 1267, 732: 7682}, + {1122, 1122, 3321, 3476, 3285, 3160, 3201, 3323, 3085, 1122, 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 537: 1122, 708: 5575, 777: 5574, 3072, 3073, 3071, 968: 7706}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 5286, 3072, 3073, 3071, 865: 7693}, // 4805 - {2655, 2655, 9: 6503, 537: 5549, 908: 7676}, - {2662, 2662}, - {2658, 2658, 9: 5278, 131: 7680, 216: 7682, 537: 2658, 715: 7679, 721: 7681, 1107: 7678}, - {2655, 2655, 537: 5549, 908: 7689}, - {1114, 1114, 3316, 3471, 3280, 3156, 3196, 3318, 3080, 1114, 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 537: 1114, 708: 5566, 777: 5565, 3067, 3068, 3066, 966: 7687}, + {313: 7689}, + {313: 7686}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 6520, 3072, 3073, 3071, 987: 7684}, + {2661, 2661, 9: 6522, 537: 5558, 908: 7685}, + {2666, 2666}, // 4810 - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 6501, 3067, 3068, 3066, 986: 7685}, - {131: 7684}, - {131: 7683}, - {2656, 2656, 537: 2656}, - {2657, 2657, 537: 2657}, + {535: 7687}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 6520, 3072, 3073, 3071, 987: 7688}, + {2667, 2667, 9: 6522}, + {535: 7690}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 6520, 3072, 3073, 3071, 987: 7691}, // 4815 - {2655, 2655, 9: 6503, 537: 5549, 908: 7686}, - {2659, 2659}, - {2655, 2655, 9: 5568, 537: 5549, 908: 7688}, - {2664, 2664}, - {2665, 2665}, - // 4820 - {2655, 2655, 9: 5568, 537: 5549, 908: 7691}, - {2667, 2667}, - {2655, 2655, 537: 5549, 908: 7693}, + {2661, 2661, 9: 6522, 537: 5558, 908: 7692}, {2668, 2668}, - {614: 7699}, + {2664, 2664, 9: 5287, 131: 7696, 216: 7698, 537: 2664, 715: 7695, 721: 7697, 1110: 7694}, + {2661, 2661, 537: 5558, 908: 7705}, + {1122, 1122, 3321, 3476, 3285, 3160, 3201, 3323, 3085, 1122, 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 537: 1122, 708: 5575, 777: 5574, 3072, 3073, 3071, 968: 7703}, + // 4820 + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 6520, 3072, 3073, 3071, 987: 7701}, + {131: 7700}, + {131: 7699}, + {2662, 2662, 537: 2662}, + {2663, 2663, 537: 2663}, // 4825 - {563: 7697}, - {614: 2670}, - {551: 7698, 614: 2671}, - {614: 2669}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 3949, 3067, 3068, 3066, 810: 7700}, + {2661, 2661, 9: 6522, 537: 5558, 908: 7702}, + {2665, 2665}, + {2661, 2661, 9: 5577, 537: 5558, 908: 7704}, + {2670, 2670}, + {2671, 2671}, // 4830 - {551: 6045, 632: 1128, 715: 1128, 728: 1128, 969: 7701}, - {632: 7704, 715: 7703, 728: 7705, 1283: 7702}, - {2676, 2676}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 7712, 3067, 3068, 3066}, - {536: 3915, 944: 7707}, + {2661, 2661, 9: 5577, 537: 5558, 908: 7707}, + {2673, 2673}, + {2661, 2661, 537: 5558, 908: 7709}, + {2674, 2674}, + {613: 7715}, // 4835 - {536: 3915, 944: 6646, 1099: 7706}, - {2673, 2673, 9: 6647}, - {571: 7708}, - {536: 3915, 944: 7709}, - {108: 7710}, + {563: 7713}, + {613: 2676}, + {551: 7714, 613: 2677}, + {613: 2675}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 565: 3955, 777: 3954, 3072, 3073, 3071, 810: 7716}, // 4840 - {564: 3053, 805: 4560, 831: 7711}, - {2674, 2674}, - {632: 7704, 728: 7705, 1283: 7713}, - {2675, 2675}, - {770: 7732, 7733}, + {551: 6065, 632: 1136, 715: 1136, 728: 1136, 971: 7717}, + {632: 7720, 715: 7719, 728: 7721, 1282: 7718}, + {2682, 2682}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 7728, 3072, 3073, 3071}, + {536: 3920, 946: 7723}, // 4845 - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 3949, 3067, 3068, 3066, 810: 7726, 890: 7725}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 5976, 3067, 3068, 3066, 913: 7717}, - {2679, 2679, 717: 7720, 770: 7718, 7719, 1182: 7721}, - {538: 7724}, - {564: 3053, 805: 3888, 817: 7723}, + {536: 3920, 946: 6666, 1102: 7722}, + {2679, 2679, 9: 6667}, + {572: 7724}, + {536: 3920, 946: 7725}, + {108: 7726}, // 4850 - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 7722, 3067, 3068, 3066}, - {2677, 2677}, - {2678, 2678}, + {567: 3058, 805: 4568, 837: 7727}, + {2680, 2680}, + {632: 7720, 728: 7721, 1282: 7729}, {2681, 2681}, - {2684, 2684}, + {770: 7748, 7749}, // 4855 - {9: 3952, 770: 7728, 7729}, - {2679, 2679, 9: 1259, 717: 7720, 770: 1259, 1259, 1182: 7727}, - {2680, 2680}, - {538: 7731}, - {564: 3053, 805: 3888, 817: 7730}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 565: 3955, 777: 3954, 3072, 3073, 3071, 810: 7742, 889: 7741}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 5996, 3072, 3073, 3071, 913: 7733}, + {2685, 2685, 717: 7736, 770: 7734, 7735, 1184: 7737}, + {538: 7740}, + {567: 3058, 805: 3893, 820: 7739}, // 4860 - {2682, 2682}, - {2685, 2685}, - {538: 7735}, - {564: 3053, 805: 3888, 817: 7734}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 7738, 3072, 3073, 3071}, {2683, 2683}, + {2684, 2684}, + {2687, 2687}, + {2690, 2690}, // 4865 + {9: 3958, 770: 7744, 7745}, + {2685, 2685, 9: 1267, 717: 7736, 770: 1267, 1267, 1184: 7743}, {2686, 2686}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 728: 7737, 777: 3949, 3067, 3068, 3066, 810: 7738}, - {178: 7740}, - {2688, 2688, 564: 3053, 805: 4560, 831: 7739}, - {2687, 2687}, + {538: 7747}, + {567: 3058, 805: 3893, 820: 7746}, // 4870 - {564: 3053, 805: 4560, 831: 7741}, + {2688, 2688}, + {2691, 2691}, + {538: 7751}, + {567: 3058, 805: 3893, 820: 7750}, {2689, 2689}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 3949, 3067, 3068, 3066, 810: 7753, 1302: 7752, 1491: 7751}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 538: 3758, 636: 5875, 777: 3759, 3067, 3068, 3066, 811: 5874, 861: 7746, 1307: 7745, 1494: 7744}, - {2693, 2693, 9: 7749}, // 4875 - {2692, 2692, 9: 2692}, - {717: 7747}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 538: 3758, 636: 5875, 777: 3759, 3067, 3068, 3066, 811: 5874, 861: 7748}, - {2690, 2690, 9: 2690}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 538: 3758, 636: 5875, 777: 3759, 3067, 3068, 3066, 811: 5874, 861: 7746, 1307: 7750}, + {2692, 2692}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 565: 3955, 728: 7753, 777: 3954, 3072, 3073, 3071, 810: 7754}, + {210: 7756}, + {2694, 2694, 567: 3058, 805: 4568, 837: 7755}, + {2693, 2693}, // 4880 - {2691, 2691, 9: 2691}, - {2697, 2697, 9: 7756}, - {2696, 2696, 9: 2696}, - {717: 7754}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 3949, 3067, 3068, 3066, 810: 7755}, + {567: 3058, 805: 4568, 837: 7757}, + {2695, 2695}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 565: 3955, 777: 3954, 3072, 3073, 3071, 810: 7769, 1300: 7768, 1491: 7767}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 538: 3763, 636: 5895, 777: 3764, 3072, 3073, 3071, 811: 5894, 861: 7762, 1305: 7761, 1494: 7760}, + {2699, 2699, 9: 7765}, // 4885 - {2694, 2694, 9: 2694}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 3949, 3067, 3068, 3066, 810: 7753, 1302: 7757}, - {2695, 2695, 9: 2695}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 2459, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 540: 4746, 543: 2459, 558: 2459, 560: 7594, 714: 2459, 777: 5976, 3067, 3068, 3066, 871: 7593, 897: 7592, 913: 7807, 960: 7596, 1043: 7808}, - {2: 2132, 2132, 2132, 2132, 2132, 2132, 2132, 10: 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 58: 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 538: 2132, 583: 4970, 636: 2132, 860: 7793}, + {2698, 2698, 9: 2698}, + {717: 7763}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 538: 3763, 636: 5895, 777: 3764, 3072, 3073, 3071, 811: 5894, 861: 7764}, + {2696, 2696, 9: 2696}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 538: 3763, 636: 5895, 777: 3764, 3072, 3073, 3071, 811: 5894, 861: 7762, 1305: 7766}, // 4890 - {334: 7787, 1385: 7786}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 7784, 3067, 3068, 3066}, - {576: 7780}, - {215: 7776}, - {2: 2132, 2132, 2132, 2132, 2132, 2132, 2132, 10: 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 58: 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 583: 4970, 860: 7765}, + {2697, 2697, 9: 2697}, + {2703, 2703, 9: 7772}, + {2702, 2702, 9: 2702}, + {717: 7770}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 565: 3955, 777: 3954, 3072, 3073, 3071, 810: 7771}, // 4895 - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 3949, 3067, 3068, 3066, 810: 7766}, - {86: 7349, 88: 7346, 90: 7352, 7353, 95: 7354, 7347, 98: 7345, 7355, 7351, 7348, 103: 7770, 725: 7350, 1020: 7769, 1114: 7768, 1320: 7767}, - {164, 164, 86: 7349, 88: 7346, 90: 7352, 7353, 95: 7354, 7347, 98: 7345, 7355, 7351, 7348, 103: 7770, 725: 7350, 1020: 7769, 1114: 7775}, + {2700, 2700, 9: 2700}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 565: 3955, 777: 3954, 3072, 3073, 3071, 810: 7769, 1300: 7773}, + {2701, 2701, 9: 2701}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 2465, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 540: 4755, 543: 2465, 558: 2465, 561: 7609, 714: 2465, 777: 5996, 3072, 3073, 3071, 871: 7608, 897: 7607, 913: 7823, 962: 7611, 1044: 7824}, + {2: 2141, 2141, 2141, 2141, 2141, 2141, 2141, 10: 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 58: 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 538: 2141, 584: 4979, 636: 2141, 860: 7809}, + // 4900 + {335: 7803, 1384: 7802}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 7800, 3072, 3073, 3071}, + {577: 7796}, + {215: 7792}, + {2: 2141, 2141, 2141, 2141, 2141, 2141, 2141, 10: 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 58: 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 565: 2141, 584: 4979, 860: 7781}, + // 4905 + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 565: 3955, 777: 3954, 3072, 3073, 3071, 810: 7782}, + {86: 7362, 88: 7359, 90: 7365, 7366, 95: 7367, 7360, 98: 7358, 7368, 7364, 7361, 103: 7786, 725: 7363, 1022: 7785, 1117: 7784, 1318: 7783}, + {164, 164, 86: 7362, 88: 7359, 90: 7365, 7366, 95: 7367, 7360, 98: 7358, 7368, 7364, 7361, 103: 7786, 725: 7363, 1022: 7785, 1117: 7791}, {163, 163, 86: 163, 88: 163, 90: 163, 163, 95: 163, 163, 98: 163, 163, 163, 163, 103: 163, 725: 163}, {161, 161, 86: 161, 88: 161, 90: 161, 161, 95: 161, 161, 98: 161, 161, 161, 161, 103: 161, 725: 161}, - // 4900 - {160, 160, 86: 160, 88: 160, 90: 160, 160, 95: 160, 160, 98: 160, 160, 160, 160, 103: 160, 537: 7772, 548: 2329, 2329, 561: 4610, 564: 2329, 725: 160, 808: 7771}, - {548: 4563, 4564, 564: 3053, 805: 4560, 831: 4562, 917: 7774}, - {548: 4563, 4564, 564: 3053, 805: 4560, 831: 4562, 917: 7773}, + // 4910 + {160, 160, 86: 160, 88: 160, 90: 160, 160, 95: 160, 160, 98: 160, 160, 160, 160, 103: 160, 537: 7788, 548: 2335, 2335, 562: 4618, 567: 2335, 725: 160, 808: 7787}, + {548: 4571, 4572, 567: 3058, 805: 4568, 837: 4570, 919: 7790}, + {548: 4571, 4572, 567: 3058, 805: 4568, 837: 4570, 919: 7789}, {158, 158, 86: 158, 88: 158, 90: 158, 158, 95: 158, 158, 98: 158, 158, 158, 158, 103: 158, 725: 158}, {159, 159, 86: 159, 88: 159, 90: 159, 159, 95: 159, 159, 98: 159, 159, 159, 159, 103: 159, 725: 159}, - // 4905 - {162, 162, 86: 162, 88: 162, 90: 162, 162, 95: 162, 162, 98: 162, 162, 162, 162, 103: 162, 725: 162}, - {2: 2132, 2132, 2132, 2132, 2132, 2132, 2132, 10: 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 58: 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 583: 4970, 860: 7777}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 777: 5538, 3067, 3068, 3066, 995: 7778}, - {108: 7514, 119: 7519, 7521, 7515, 7520, 7523, 7517, 7513, 7518, 128: 7524, 7522, 7516, 982: 7511, 1244: 7779}, - {190, 190, 9: 7550, 108: 7514, 119: 7519, 7521, 7515, 7520, 7523, 7517, 7513, 7518, 128: 7524, 7522, 7516, 982: 7549}, - // 4910 - {2: 2132, 2132, 2132, 2132, 2132, 2132, 2132, 10: 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 58: 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, 540: 2132, 583: 4970, 860: 7781}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 3733, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 540: 4618, 777: 4617, 3067, 3068, 3066, 942: 7782}, - {110: 7385, 7383, 7382, 7384, 7381, 983: 7379, 1261: 7783}, - {193, 193, 9: 7433, 110: 7385, 7383, 7382, 7384, 7381, 983: 7432}, - {18: 4703, 871: 7785}, // 4915 - {415, 415}, - {416, 416}, - {453: 7788}, - {414, 414, 86: 7789}, - {87: 7790}, + {162, 162, 86: 162, 88: 162, 90: 162, 162, 95: 162, 162, 98: 162, 162, 162, 162, 103: 162, 725: 162}, + {2: 2141, 2141, 2141, 2141, 2141, 2141, 2141, 10: 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 58: 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 584: 4979, 860: 7793}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 777: 5547, 3072, 3073, 3071, 996: 7794}, + {108: 7529, 119: 7534, 7536, 7530, 7535, 7538, 7532, 7528, 7533, 128: 7539, 7537, 7531, 983: 7526, 1244: 7795}, + {190, 190, 9: 7565, 108: 7529, 119: 7534, 7536, 7530, 7535, 7538, 7532, 7528, 7533, 128: 7539, 7537, 7531, 983: 7564}, // 4920 - {535: 7791}, - {257: 7792}, - {413, 413}, - {2: 3316, 3471, 3280, 3156, 3196, 3318, 3080, 10: 3128, 3081, 3219, 3337, 3330, 3725, 3720, 3199, 3511, 3201, 3174, 3114, 3106, 3117, 3139, 3203, 3204, 3312, 3198, 3338, 3462, 3461, 3419, 3079, 3197, 3200, 3211, 3147, 3151, 3207, 3322, 3164, 3247, 3077, 3078, 3246, 3320, 3076, 3335, 3420, 3421, 3157, 3072, 3292, 3422, 3423, 3717, 58: 3407, 3163, 3166, 3389, 3386, 3378, 3390, 3393, 3394, 3391, 3395, 3396, 3392, 3587, 3582, 3385, 3397, 3380, 3381, 3586, 3384, 3387, 3584, 3388, 3398, 3585, 3085, 3100, 3233, 3160, 3167, 3729, 3365, 3364, 3169, 3069, 3094, 3366, 3361, 3115, 3360, 3367, 3362, 3363, 3277, 3158, 3350, 3415, 3348, 3416, 3475, 3349, 3594, 3580, 3576, 3593, 3575, 3172, 3241, 3512, 3730, 3564, 3569, 3556, 3568, 3570, 3559, 3565, 3566, 3347, 3567, 3571, 3563, 3097, 3236, 3722, 3591, 3493, 3588, 3742, 3724, 3740, 3741, 3739, 3735, 3339, 3340, 3341, 3342, 3343, 3344, 3346, 3731, 3718, 3090, 3336, 3126, 3168, 3356, 3173, 3496, 3258, 3262, 3286, 3288, 3266, 3267, 3268, 3269, 3257, 3099, 3287, 3418, 3498, 3213, 3141, 3521, 3108, 3721, 3129, 3450, 3727, 3238, 3278, 3136, 3194, 3215, 3728, 3185, 3376, 3088, 3105, 3116, 3131, 3140, 3544, 3351, 3218, 3159, 3260, 3412, 3595, 3175, 3176, 3469, 3183, 3237, 3086, 3087, 3119, 3135, 3328, 3332, 3205, 3206, 3145, 3146, 3400, 3515, 3274, 7794, 3424, 3449, 3354, 3513, 3150, 3353, 3458, 3184, 3401, 3089, 3590, 3426, 3589, 3723, 3212, 3143, 3370, 3296, 3408, 3409, 3372, 3232, 3410, 3327, 3455, 3368, 3162, 3265, 3325, 3222, 3073, 3440, 3101, 3445, 3227, 3111, 3113, 3229, 3120, 3548, 3130, 3133, 3427, 3310, 3379, 3188, 3743, 3406, 3256, 3225, 3285, 3331, 3214, 3592, 3457, 3171, 3468, 3326, 3436, 3437, 3234, 3297, 3581, 3486, 3438, 3429, 3091, 3441, 3095, 3402, 3442, 3738, 3102, 3299, 3488, 3444, 3294, 3110, 3446, 3308, 3334, 3319, 3494, 3448, 3478, 3112, 3329, 3124, 3359, 3551, 3134, 3137, 3577, 3309, 3357, 3121, 3501, 3352, 3502, 3303, 3355, 3413, 3579, 3578, 3583, 3239, 3451, 3452, 3242, 3243, 3301, 3453, 3411, 3154, 3155, 3273, 3382, 3275, 3516, 3454, 3323, 3324, 3263, 3165, 3305, 3075, 3526, 3304, 3572, 3533, 3534, 3535, 3536, 3538, 3537, 3539, 3540, 3541, 3470, 3179, 3306, 3561, 3596, 3560, 3186, 3070, 3358, 3375, 3082, 3377, 3084, 3403, 3074, 3439, 3284, 3092, 3093, 3271, 3414, 3734, 3443, 3216, 3098, 3103, 3104, 3447, 3228, 3495, 3230, 3118, 3240, 3123, 3291, 3545, 3125, 3302, 3428, 3235, 3209, 3465, 3293, 3224, 3503, 3279, 3298, 3345, 3221, 3311, 3142, 3749, 3202, 3369, 3290, 3744, 3433, 3432, 3434, 3472, 3546, 3148, 3314, 3317, 3371, 3405, 3473, 3726, 3417, 3252, 3253, 3259, 3508, 3476, 3509, 3477, 3383, 3425, 3161, 3479, 3321, 3283, 3220, 3456, 3315, 3272, 3463, 3460, 3464, 3459, 3300, 3404, 3313, 3530, 3467, 3281, 3554, 3542, 3431, 3435, 3180, 3210, 3217, 3282, 3474, 3430, 3289, 3747, 3191, 3481, 3482, 3719, 3483, 3484, 3485, 3547, 3487, 3490, 3489, 3491, 3492, 3122, 3276, 3245, 3497, 3127, 3555, 3748, 3500, 3333, 3573, 3574, 3754, 3753, 3745, 3557, 3558, 3506, 3295, 3505, 3144, 3507, 3514, 3251, 3152, 3153, 3399, 3270, 3736, 3737, 3510, 3746, 3264, 3192, 3307, 3223, 3226, 3549, 3522, 3523, 3524, 3525, 3517, 3550, 3750, 3519, 3520, 3244, 3466, 3751, 3752, 3543, 3182, 3527, 3528, 3529, 3562, 3732, 538: 3758, 636: 5875, 777: 3759, 3067, 3068, 3066, 811: 5874, 861: 5892, 1000: 5893, 1030: 7795}, - {1975, 1975, 6: 1975, 9: 1975, 15: 1975, 51: 1975, 1975, 1975, 1975, 1975, 183: 1975, 536: 7801, 1975, 633: 1975, 730: 1975, 1975}, + {2: 2141, 2141, 2141, 2141, 2141, 2141, 2141, 10: 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 58: 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 540: 2141, 584: 4979, 860: 7797}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 3738, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 540: 4626, 777: 4625, 3072, 3073, 3071, 944: 7798}, + {110: 7398, 7396, 7395, 7397, 7394, 984: 7392, 1261: 7799}, + {193, 193, 9: 7446, 110: 7398, 7396, 7395, 7397, 7394, 984: 7445}, + {18: 4712, 871: 7801}, // 4925 - {401, 401, 6: 401, 9: 5895, 15: 401, 51: 401, 401, 401, 401, 401, 537: 401, 730: 5939, 1081: 5938, 7796}, - {409, 409, 6: 409, 15: 409, 51: 409, 409, 409, 409, 409, 537: 7456, 1137: 7797}, - {382, 382, 6: 382, 15: 7472, 51: 382, 382, 7471, 7473, 7474, 1074: 7470, 1241: 7469, 7798}, - {387, 387, 6: 7496, 51: 387, 7497, 1134: 7799}, - {384, 384, 51: 7501, 1260: 7800}, + {422, 422}, + {423, 423}, + {452: 7804}, + {421, 421, 86: 7805}, + {87: 7806}, // 4930 - {418, 418}, - {57: 7802}, - {183: 7803}, - {728: 7804}, - {538: 5908, 1003: 7805}, + {535: 7807}, + {257: 7808}, + {420, 420}, + {2: 3321, 3476, 3285, 3160, 3201, 3323, 3085, 10: 3133, 3086, 3224, 3342, 3335, 3730, 3725, 3204, 3516, 3206, 3178, 3119, 3122, 3111, 3144, 3208, 3209, 3317, 3203, 3343, 3467, 3466, 3424, 3084, 3202, 3205, 3216, 3151, 3155, 3212, 3327, 3168, 3252, 3082, 3083, 3251, 3325, 3081, 3340, 3425, 3426, 3161, 3077, 3297, 3427, 3428, 3722, 58: 3412, 3167, 3170, 3394, 3391, 3383, 3395, 3398, 3399, 3396, 3400, 3401, 3397, 3592, 3587, 3390, 3402, 3385, 3386, 3591, 3389, 3392, 3589, 3393, 3403, 3590, 3090, 3105, 3238, 3164, 3171, 3734, 3370, 3369, 3173, 3074, 3099, 3371, 3366, 3120, 3365, 3372, 3367, 3368, 3282, 3162, 3355, 3420, 3353, 3421, 3480, 3354, 3599, 3585, 3581, 3598, 3580, 3176, 3246, 3517, 3735, 3569, 3574, 3561, 3573, 3575, 3564, 3570, 3571, 3352, 3572, 3576, 3568, 3102, 3337, 3241, 3727, 3596, 3498, 3593, 3747, 3172, 3729, 3745, 3746, 3744, 3740, 3344, 3345, 3346, 3347, 3348, 3349, 3351, 3736, 3723, 3095, 3177, 3341, 3131, 3361, 3501, 3146, 3263, 3267, 3291, 3293, 3271, 3272, 3273, 3274, 3262, 3104, 3292, 3423, 3503, 3218, 3526, 3113, 3726, 3134, 3732, 3243, 3283, 3141, 3199, 3220, 3163, 3733, 3190, 3381, 3093, 3110, 3121, 3136, 3145, 3549, 3356, 3223, 3265, 3417, 3600, 3179, 3180, 3474, 3187, 3242, 3091, 3092, 3124, 3140, 3333, 3455, 3210, 3211, 3149, 3150, 3405, 3520, 3358, 3279, 7810, 3429, 3454, 3359, 3518, 3154, 3463, 3188, 3406, 3094, 3595, 3431, 3594, 3728, 3217, 3147, 3375, 3301, 3413, 3414, 3377, 3237, 3415, 3332, 3460, 3373, 3166, 3270, 3330, 3227, 3078, 3445, 3106, 3450, 3232, 3116, 3118, 3234, 3125, 3553, 3135, 3138, 3432, 3315, 3384, 3193, 3748, 3411, 3261, 3230, 3290, 3336, 3219, 3597, 3462, 3175, 3473, 3331, 3441, 3442, 3089, 3239, 3302, 3586, 3491, 3443, 3434, 3096, 3446, 3100, 3407, 3447, 3743, 3107, 3304, 3493, 3449, 3299, 3115, 3451, 3313, 3339, 3324, 3499, 3453, 3483, 3117, 3334, 3129, 3364, 3556, 3139, 3142, 3582, 3314, 3362, 3126, 3298, 3506, 3357, 3507, 3308, 3360, 3418, 3584, 3583, 3588, 3244, 3456, 3457, 3248, 3306, 3458, 3416, 3158, 3159, 3278, 3387, 3280, 3521, 3459, 3328, 3329, 3268, 3169, 3277, 3310, 3080, 3531, 3309, 3577, 3538, 3539, 3540, 3541, 3543, 3542, 3544, 3545, 3546, 3475, 3183, 3311, 3566, 3601, 3565, 3191, 3075, 3363, 3380, 3087, 3382, 3408, 3079, 3444, 3289, 3097, 3098, 3276, 3419, 3739, 3448, 3221, 3103, 3108, 3109, 3452, 3233, 3500, 3235, 3123, 3245, 3128, 3296, 3550, 3130, 3307, 3433, 3240, 3214, 3470, 3229, 3508, 3284, 3303, 3350, 3226, 3316, 3754, 3207, 3374, 3295, 3749, 3247, 3438, 3437, 3439, 3477, 3551, 3152, 3319, 3322, 3376, 3410, 3478, 3731, 3422, 3257, 3258, 3264, 3513, 3481, 3514, 3482, 3388, 3430, 3165, 3484, 3326, 3288, 3225, 3461, 3320, 3468, 3465, 3469, 3464, 3305, 3409, 3318, 3535, 3472, 3286, 3559, 3547, 3436, 3440, 3184, 3215, 3222, 3287, 3189, 3479, 3435, 3294, 3752, 3196, 3486, 3487, 3724, 3488, 3489, 3490, 3552, 3492, 3495, 3494, 3496, 3497, 3127, 3281, 3250, 3502, 3132, 3560, 3753, 3505, 3338, 3578, 3579, 3759, 3758, 3750, 3562, 3563, 3511, 3300, 3510, 3148, 3512, 3519, 3256, 3156, 3157, 3404, 3275, 3741, 3742, 3515, 3751, 3269, 3197, 3312, 3228, 3231, 3554, 3527, 3528, 3529, 3530, 3522, 3555, 3755, 3524, 3525, 3249, 3471, 3756, 3757, 3548, 3186, 3532, 3533, 3534, 3567, 3737, 538: 3763, 636: 5895, 777: 3764, 3072, 3073, 3071, 811: 5894, 861: 5912, 1002: 5913, 1031: 7811}, + {1984, 1984, 6: 1984, 9: 1984, 15: 1984, 51: 1984, 1984, 1984, 1984, 1984, 183: 1984, 536: 7817, 1984, 633: 1984, 730: 1984, 1984}, // 4935 - {417, 417}, - {16: 1655, 18: 1655, 21: 1655, 215: 5531, 540: 1655, 543: 1655, 558: 1655, 560: 1655, 714: 1655}, - {16: 2459, 18: 2459, 21: 2459, 540: 4746, 543: 2459, 558: 2459, 560: 7594, 714: 2459, 871: 7593, 897: 7592, 960: 7596, 1043: 7809}, - {2480, 2480, 16: 2459, 18: 2459, 21: 2459, 540: 4746, 543: 2459, 558: 2459, 560: 7594, 714: 2459, 871: 7593, 897: 7592, 960: 7597}, - {2481, 2481, 16: 2459, 18: 2459, 21: 2459, 540: 4746, 543: 2459, 558: 2459, 560: 7594, 714: 2459, 871: 7593, 897: 7592, 960: 7597}, + {408, 408, 6: 408, 9: 5915, 15: 408, 51: 408, 408, 408, 408, 408, 537: 408, 730: 5959, 1083: 5958, 7812}, + {416, 416, 6: 416, 15: 416, 51: 416, 416, 416, 416, 416, 537: 7471, 1140: 7813}, + {389, 389, 6: 389, 15: 7487, 51: 389, 389, 7486, 7488, 7489, 1076: 7485, 1242: 7484, 7814}, + {394, 394, 6: 7511, 51: 394, 7512, 1137: 7815}, + {391, 391, 51: 7516, 1260: 7816}, // 4940 - {2327, 2327, 3: 2877, 58: 2900, 84: 2879, 2882, 87: 2912, 2880, 3033, 103: 2914, 117: 3047, 159: 3049, 187: 2897, 197: 2895, 210: 3040, 223: 2908, 250: 2903, 254: 2885, 259: 2933, 266: 2899, 269: 2875, 277: 2932, 3043, 2881, 284: 3048, 296: 2911, 306: 2909, 308: 2876, 310: 2915, 331: 2901, 335: 2904, 342: 2913, 345: 2898, 358: 2890, 536: 2923, 2922, 552: 2921, 557: 2907, 560: 2931, 567: 3042, 580: 3036, 582: 2893, 587: 2891, 592: 2906, 614: 2920, 701: 2916, 715: 3046, 718: 2878, 3035, 729: 2873, 732: 2884, 748: 2883, 772: 2930, 2874, 781: 2927, 809: 2886, 812: 2929, 2917, 2918, 2919, 2928, 818: 2926, 2925, 2924, 822: 2889, 3011, 3010, 828: 3034, 2887, 2992, 832: 3004, 3020, 2892, 839: 2888, 845: 2950, 851: 2944, 2948, 3001, 3012, 863: 2952, 2894, 866: 3019, 3021, 900: 3039, 903: 2896, 910: 2937, 939: 3045, 949: 2945, 963: 3037, 968: 2995, 971: 3006, 973: 3009, 2902, 1041: 2957, 1096: 3041, 1105: 2965, 2935, 1108: 2936, 2939, 1111: 2942, 2940, 2943, 1115: 2941, 1117: 2938, 1119: 2946, 2947, 1122: 2953, 2905, 2990, 3030, 1127: 2954, 1138: 2961, 2955, 2956, 2962, 2963, 2964, 2960, 2966, 2967, 1148: 2959, 2958, 1151: 2949, 2910, 1154: 2968, 2982, 2969, 2970, 3031, 2973, 2972, 2978, 2977, 2979, 2974, 2980, 2981, 2971, 2976, 2975, 1172: 2934, 1175: 2951, 1180: 2986, 2984, 1183: 2985, 2983, 1188: 2988, 2989, 2987, 1194: 3026, 2991, 2993, 1204: 3044, 2994, 1214: 2996, 1216: 2997, 3023, 1219: 3027, 1243: 3028, 1245: 2999, 3000, 1254: 3005, 1257: 3002, 3003, 1264: 3025, 3029, 3038, 3008, 3007, 1274: 3013, 1276: 3015, 3014, 1279: 3017, 1281: 3024, 1284: 3016, 1290: 7811, 1304: 3018, 2998, 3022}, - {627, 627}, + {425, 425}, + {57: 7818}, + {183: 7819}, + {728: 7820}, + {538: 5928, 1005: 7821}, + // 4945 + {424, 424}, + {16: 1664, 18: 1664, 21: 1664, 215: 5540, 540: 1664, 543: 1664, 558: 1664, 561: 1664, 714: 1664}, + {16: 2465, 18: 2465, 21: 2465, 540: 4755, 543: 2465, 558: 2465, 561: 7609, 714: 2465, 871: 7608, 897: 7607, 962: 7611, 1044: 7825}, + {2486, 2486, 16: 2465, 18: 2465, 21: 2465, 540: 4755, 543: 2465, 558: 2465, 561: 7609, 714: 2465, 871: 7608, 897: 7607, 962: 7612}, + {2487, 2487, 16: 2465, 18: 2465, 21: 2465, 540: 4755, 543: 2465, 558: 2465, 561: 7609, 714: 2465, 871: 7608, 897: 7607, 962: 7612}, + // 4950 + {2333, 2333, 3: 2883, 58: 2906, 84: 2885, 2888, 87: 2918, 2886, 3037, 103: 2920, 117: 3052, 132: 3044, 161: 3054, 188: 2903, 197: 2901, 224: 2914, 250: 2909, 254: 2891, 259: 2939, 266: 2905, 269: 2881, 277: 2938, 3047, 280: 2887, 285: 3053, 297: 2917, 307: 2915, 309: 2882, 311: 2921, 332: 2907, 336: 2910, 343: 2919, 347: 2904, 360: 2896, 536: 2929, 2928, 552: 2927, 557: 2913, 561: 2937, 568: 3046, 581: 3040, 583: 2899, 588: 2897, 592: 2912, 613: 2926, 660: 2922, 715: 3051, 718: 2884, 3039, 729: 2879, 732: 2890, 745: 2889, 772: 2936, 3048, 2880, 781: 2933, 809: 2892, 812: 2935, 2923, 2924, 2925, 2934, 2932, 2931, 2930, 821: 2895, 3017, 3016, 827: 3038, 829: 2893, 2998, 3010, 3026, 2898, 840: 2894, 845: 2956, 851: 2950, 2954, 3007, 3018, 863: 2958, 2900, 866: 3025, 3027, 903: 2902, 910: 2943, 914: 2997, 3043, 941: 3050, 952: 2951, 965: 3041, 970: 3001, 973: 3012, 975: 3015, 2908, 1042: 2963, 1099: 3045, 1108: 2971, 2941, 1111: 2942, 2945, 1114: 2948, 2946, 2949, 1118: 2947, 1120: 2944, 1122: 2952, 2953, 1125: 2959, 2911, 2996, 3035, 1130: 2960, 1141: 2967, 2961, 2962, 2968, 2969, 2970, 2966, 2972, 2973, 1151: 2965, 2964, 1154: 2955, 2916, 1157: 2974, 2988, 2975, 2976, 2979, 2978, 2984, 2983, 2985, 2980, 2986, 2987, 2977, 2982, 2981, 1174: 2940, 1177: 2957, 1182: 2992, 2990, 1185: 2991, 2989, 1190: 2994, 2995, 2993, 1196: 3032, 2999, 1205: 3049, 3000, 1214: 3002, 1216: 3003, 3029, 1219: 3033, 1229: 3034, 1245: 3005, 3006, 1254: 3011, 1257: 3008, 3009, 1264: 3031, 3042, 3014, 3013, 1273: 3019, 1275: 3021, 3020, 1278: 3023, 1280: 3030, 1283: 3022, 1289: 7827, 1302: 3024, 3004, 3028}, + {634, 634}, } ) @@ -14381,45 +14399,48 @@ yynewstate: } case 202: { - parser.yyVAL.statement = &ast.AnalyzeTableStmt{TableNames: yyS[yypt-2].item.([]*ast.TableName), ColumnChoice: yyS[yypt-1].item.(model.ColumnChoice), AnalyzeOpts: yyS[yypt-0].item.([]ast.AnalyzeOpt)} + parser.yyVAL.statement = &ast.AnalyzeTableStmt{TableNames: yyS[yypt-2].item.([]*ast.TableName), NoWriteToBinLog: yyS[yypt-4].item.(bool), ColumnChoice: yyS[yypt-1].item.(model.ColumnChoice), AnalyzeOpts: yyS[yypt-0].item.([]ast.AnalyzeOpt)} } case 203: { - parser.yyVAL.statement = &ast.AnalyzeTableStmt{TableNames: []*ast.TableName{yyS[yypt-3].item.(*ast.TableName)}, IndexNames: yyS[yypt-1].item.([]model.CIStr), IndexFlag: true, AnalyzeOpts: yyS[yypt-0].item.([]ast.AnalyzeOpt)} + parser.yyVAL.statement = &ast.AnalyzeTableStmt{TableNames: []*ast.TableName{yyS[yypt-3].item.(*ast.TableName)}, NoWriteToBinLog: yyS[yypt-5].item.(bool), IndexNames: yyS[yypt-1].item.([]model.CIStr), IndexFlag: true, AnalyzeOpts: yyS[yypt-0].item.([]ast.AnalyzeOpt)} } case 204: { - parser.yyVAL.statement = &ast.AnalyzeTableStmt{TableNames: []*ast.TableName{yyS[yypt-3].item.(*ast.TableName)}, IndexNames: yyS[yypt-1].item.([]model.CIStr), IndexFlag: true, Incremental: true, AnalyzeOpts: yyS[yypt-0].item.([]ast.AnalyzeOpt)} + parser.yyVAL.statement = &ast.AnalyzeTableStmt{TableNames: []*ast.TableName{yyS[yypt-3].item.(*ast.TableName)}, NoWriteToBinLog: yyS[yypt-6].item.(bool), IndexNames: yyS[yypt-1].item.([]model.CIStr), IndexFlag: true, Incremental: true, AnalyzeOpts: yyS[yypt-0].item.([]ast.AnalyzeOpt)} } case 205: { - parser.yyVAL.statement = &ast.AnalyzeTableStmt{TableNames: []*ast.TableName{yyS[yypt-4].item.(*ast.TableName)}, PartitionNames: yyS[yypt-2].item.([]model.CIStr), ColumnChoice: yyS[yypt-1].item.(model.ColumnChoice), AnalyzeOpts: yyS[yypt-0].item.([]ast.AnalyzeOpt)} + parser.yyVAL.statement = &ast.AnalyzeTableStmt{TableNames: []*ast.TableName{yyS[yypt-4].item.(*ast.TableName)}, NoWriteToBinLog: yyS[yypt-6].item.(bool), PartitionNames: yyS[yypt-2].item.([]model.CIStr), ColumnChoice: yyS[yypt-1].item.(model.ColumnChoice), AnalyzeOpts: yyS[yypt-0].item.([]ast.AnalyzeOpt)} } case 206: { parser.yyVAL.statement = &ast.AnalyzeTableStmt{ - TableNames: []*ast.TableName{yyS[yypt-5].item.(*ast.TableName)}, - PartitionNames: yyS[yypt-3].item.([]model.CIStr), - IndexNames: yyS[yypt-1].item.([]model.CIStr), - IndexFlag: true, - AnalyzeOpts: yyS[yypt-0].item.([]ast.AnalyzeOpt), + TableNames: []*ast.TableName{yyS[yypt-5].item.(*ast.TableName)}, + NoWriteToBinLog: yyS[yypt-7].item.(bool), + PartitionNames: yyS[yypt-3].item.([]model.CIStr), + IndexNames: yyS[yypt-1].item.([]model.CIStr), + IndexFlag: true, + AnalyzeOpts: yyS[yypt-0].item.([]ast.AnalyzeOpt), } } case 207: { parser.yyVAL.statement = &ast.AnalyzeTableStmt{ - TableNames: []*ast.TableName{yyS[yypt-5].item.(*ast.TableName)}, - PartitionNames: yyS[yypt-3].item.([]model.CIStr), - IndexNames: yyS[yypt-1].item.([]model.CIStr), - IndexFlag: true, - Incremental: true, - AnalyzeOpts: yyS[yypt-0].item.([]ast.AnalyzeOpt), + TableNames: []*ast.TableName{yyS[yypt-5].item.(*ast.TableName)}, + NoWriteToBinLog: yyS[yypt-8].item.(bool), + PartitionNames: yyS[yypt-3].item.([]model.CIStr), + IndexNames: yyS[yypt-1].item.([]model.CIStr), + IndexFlag: true, + Incremental: true, + AnalyzeOpts: yyS[yypt-0].item.([]ast.AnalyzeOpt), } } case 208: { parser.yyVAL.statement = &ast.AnalyzeTableStmt{ TableNames: []*ast.TableName{yyS[yypt-5].item.(*ast.TableName)}, + NoWriteToBinLog: yyS[yypt-7].item.(bool), ColumnNames: yyS[yypt-1].item.([]model.CIStr), AnalyzeOpts: yyS[yypt-0].item.([]ast.AnalyzeOpt), HistogramOperation: ast.HistogramOperationUpdate, @@ -14429,6 +14450,7 @@ yynewstate: { parser.yyVAL.statement = &ast.AnalyzeTableStmt{ TableNames: []*ast.TableName{yyS[yypt-4].item.(*ast.TableName)}, + NoWriteToBinLog: yyS[yypt-6].item.(bool), ColumnNames: yyS[yypt-0].item.([]model.CIStr), HistogramOperation: ast.HistogramOperationDrop, } @@ -14436,19 +14458,21 @@ yynewstate: case 210: { parser.yyVAL.statement = &ast.AnalyzeTableStmt{ - TableNames: []*ast.TableName{yyS[yypt-3].item.(*ast.TableName)}, - ColumnNames: yyS[yypt-1].item.([]model.CIStr), - ColumnChoice: model.ColumnList, - AnalyzeOpts: yyS[yypt-0].item.([]ast.AnalyzeOpt)} + TableNames: []*ast.TableName{yyS[yypt-3].item.(*ast.TableName)}, + NoWriteToBinLog: yyS[yypt-5].item.(bool), + ColumnNames: yyS[yypt-1].item.([]model.CIStr), + ColumnChoice: model.ColumnList, + AnalyzeOpts: yyS[yypt-0].item.([]ast.AnalyzeOpt)} } case 211: { parser.yyVAL.statement = &ast.AnalyzeTableStmt{ - TableNames: []*ast.TableName{yyS[yypt-5].item.(*ast.TableName)}, - PartitionNames: yyS[yypt-3].item.([]model.CIStr), - ColumnNames: yyS[yypt-1].item.([]model.CIStr), - ColumnChoice: model.ColumnList, - AnalyzeOpts: yyS[yypt-0].item.([]ast.AnalyzeOpt)} + TableNames: []*ast.TableName{yyS[yypt-5].item.(*ast.TableName)}, + NoWriteToBinLog: yyS[yypt-7].item.(bool), + PartitionNames: yyS[yypt-3].item.([]model.CIStr), + ColumnNames: yyS[yypt-1].item.([]model.CIStr), + ColumnChoice: model.ColumnList, + AnalyzeOpts: yyS[yypt-0].item.([]ast.AnalyzeOpt)} } case 212: { @@ -16616,34 +16640,13 @@ yynewstate: parser.yyVAL.item = ast.BRIEOptionLevelRequired } case 640: - { - parser.yyVAL.statement = &ast.LoadDataActionStmt{ - Tp: ast.LoadDataPause, - JobID: yyS[yypt-0].item.(int64), - } - } - case 641: - { - parser.yyVAL.statement = &ast.LoadDataActionStmt{ - Tp: ast.LoadDataResume, - JobID: yyS[yypt-0].item.(int64), - } - } - case 642: { parser.yyVAL.statement = &ast.ImportIntoActionStmt{ Tp: ast.ImportIntoCancel, JobID: yyS[yypt-0].item.(int64), } } - case 643: - { - parser.yyVAL.statement = &ast.LoadDataActionStmt{ - Tp: ast.LoadDataDrop, - JobID: yyS[yypt-0].item.(int64), - } - } - case 644: + case 641: { v := yyS[yypt-2].ident v = strings.TrimPrefix(v, "@") @@ -16654,19 +16657,19 @@ yynewstate: Value: yyS[yypt-0].expr, } } - case 645: + case 642: { parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.LogicOr, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} } - case 646: + case 643: { parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.LogicXor, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} } - case 647: + case 644: { parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.LogicAnd, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} } - case 648: + case 645: { expr, ok := yyS[yypt-0].expr.(*ast.ExistsSubqueryExpr) if ok { @@ -16676,7 +16679,7 @@ yynewstate: parser.yyVAL.expr = &ast.UnaryOperationExpr{Op: opcode.Not, V: yyS[yypt-0].expr} } } - case 649: + case 646: { parser.yyVAL.expr = &ast.MatchAgainst{ ColumnNames: yyS[yypt-6].item.([]*ast.ColumnName), @@ -16684,99 +16687,99 @@ yynewstate: Modifier: ast.FulltextSearchModifier(yyS[yypt-1].item.(int)), } } - case 650: + case 647: { parser.yyVAL.expr = &ast.IsTruthExpr{Expr: yyS[yypt-2].expr, Not: !yyS[yypt-1].item.(bool), True: int64(1)} } - case 651: + case 648: { parser.yyVAL.expr = &ast.IsTruthExpr{Expr: yyS[yypt-2].expr, Not: !yyS[yypt-1].item.(bool), True: int64(0)} } - case 652: + case 649: { /* https://dev.mysql.com/doc/refman/5.7/en/comparison-operators.html#operator_is */ parser.yyVAL.expr = &ast.IsNullExpr{Expr: yyS[yypt-2].expr, Not: !yyS[yypt-1].item.(bool)} } - case 654: + case 651: { parser.yyVAL.expr = &ast.DefaultExpr{} } - case 656: + case 653: { parser.yyVAL.expr = &ast.MaxValueExpr{} } - case 658: + case 655: { parser.yyVAL.item = ast.FulltextSearchModifierNaturalLanguageMode } - case 659: + case 656: { parser.yyVAL.item = ast.FulltextSearchModifierNaturalLanguageMode } - case 660: + case 657: { parser.yyVAL.item = ast.FulltextSearchModifierNaturalLanguageMode | ast.FulltextSearchModifierWithQueryExpansion } - case 661: + case 658: { parser.yyVAL.item = ast.FulltextSearchModifierBooleanMode } - case 662: + case 659: { parser.yyVAL.item = ast.FulltextSearchModifierWithQueryExpansion } - case 667: + case 664: { parser.yyVAL.item = []ast.ExprNode{yyS[yypt-0].expr} } - case 668: + case 665: { parser.yyVAL.item = append(yyS[yypt-2].item.([]ast.ExprNode), yyS[yypt-0].expr) } - case 669: + case 666: { parser.yyVAL.item = []ast.ExprNode{yyS[yypt-0].expr} } - case 670: + case 667: { parser.yyVAL.item = append(yyS[yypt-2].item.([]ast.ExprNode), yyS[yypt-0].expr) } - case 671: + case 668: { parser.yyVAL.item = []ast.ExprNode{yyS[yypt-0].expr} } - case 672: + case 669: { parser.yyVAL.item = append(yyS[yypt-2].item.([]ast.ExprNode), yyS[yypt-0].expr) } - case 673: + case 670: { parser.yyVAL.item = []ast.ExprNode{} } - case 675: + case 672: { parser.yyVAL.item = []ast.ExprNode{} } - case 677: + case 674: { expr := ast.NewValueExpr(yyS[yypt-0].item, parser.charset, parser.collation) parser.yyVAL.item = []ast.ExprNode{expr} } - case 678: + case 675: { parser.yyVAL.expr = &ast.IsNullExpr{Expr: yyS[yypt-2].expr, Not: !yyS[yypt-1].item.(bool)} } - case 679: + case 676: { parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: yyS[yypt-1].item.(opcode.Op), L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} } - case 680: + case 677: { sq := yyS[yypt-0].expr.(*ast.SubqueryExpr) sq.MultiRows = true parser.yyVAL.expr = &ast.CompareSubqueryExpr{Op: yyS[yypt-2].item.(opcode.Op), L: yyS[yypt-3].expr, R: sq, All: yyS[yypt-1].item.(bool)} } - case 681: + case 678: { v := yyS[yypt-2].ident v = strings.TrimPrefix(v, "@") @@ -16788,109 +16791,109 @@ yynewstate: } parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: yyS[yypt-3].item.(opcode.Op), L: yyS[yypt-4].expr, R: variable} } - case 683: + case 680: { parser.yyVAL.item = opcode.GE } - case 684: + case 681: { parser.yyVAL.item = opcode.GT } - case 685: + case 682: { parser.yyVAL.item = opcode.LE } - case 686: + case 683: { parser.yyVAL.item = opcode.LT } - case 687: + case 684: { parser.yyVAL.item = opcode.NE } - case 688: + case 685: { parser.yyVAL.item = opcode.NE } - case 689: + case 686: { parser.yyVAL.item = opcode.EQ } - case 690: + case 687: { parser.yyVAL.item = opcode.NullEQ } - case 691: + case 688: { parser.yyVAL.item = true } - case 692: + case 689: { parser.yyVAL.item = false } - case 693: + case 690: { parser.yyVAL.item = true } - case 694: + case 691: { parser.yyVAL.item = false } - case 695: + case 692: { parser.yyVAL.item = true } - case 696: + case 693: { parser.yyVAL.item = false } - case 697: + case 694: { parser.yyVAL.item = true } - case 698: + case 695: { parser.yyVAL.item = false } - case 699: + case 696: { parser.yyVAL.item = true } - case 700: + case 697: { parser.yyVAL.item = false } - case 701: + case 698: { parser.yyVAL.item = true } - case 702: + case 699: { parser.yyVAL.item = false } - case 703: + case 700: { parser.yyVAL.item = false } - case 704: + case 701: { parser.yyVAL.item = false } - case 705: + case 702: { parser.yyVAL.item = true } - case 706: + case 703: { parser.yyVAL.expr = &ast.PatternInExpr{Expr: yyS[yypt-4].expr, Not: !yyS[yypt-3].item.(bool), List: yyS[yypt-1].item.([]ast.ExprNode)} } - case 707: + case 704: { sq := yyS[yypt-0].expr.(*ast.SubqueryExpr) sq.MultiRows = true parser.yyVAL.expr = &ast.PatternInExpr{Expr: yyS[yypt-2].expr, Not: !yyS[yypt-1].item.(bool), Sel: sq} } - case 708: + case 705: { parser.yyVAL.expr = &ast.BetweenExpr{ Expr: yyS[yypt-4].expr, @@ -16899,7 +16902,7 @@ yynewstate: Not: !yyS[yypt-3].item.(bool), } } - case 709: + case 706: { escape := yyS[yypt-0].ident if len(escape) > 1 { @@ -16916,7 +16919,7 @@ yynewstate: IsLike: true, } } - case 710: + case 707: { escape := yyS[yypt-0].ident if len(escape) > 1 { @@ -16933,55 +16936,55 @@ yynewstate: IsLike: false, } } - case 711: + case 708: { parser.yyVAL.expr = &ast.PatternRegexpExpr{Expr: yyS[yypt-2].expr, Pattern: yyS[yypt-0].expr, Not: !yyS[yypt-1].item.(bool)} } - case 712: + case 709: { parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(ast.JSONMemberOf), Args: []ast.ExprNode{yyS[yypt-4].expr, yyS[yypt-1].expr}} } - case 716: + case 713: { parser.yyVAL.ident = "\\" } - case 717: + case 714: { parser.yyVAL.ident = yyS[yypt-0].ident } - case 718: + case 715: { parser.yyVAL.item = &ast.SelectField{WildCard: &ast.WildCardField{}} } - case 719: + case 716: { wildCard := &ast.WildCardField{Table: model.NewCIStr(yyS[yypt-2].ident)} parser.yyVAL.item = &ast.SelectField{WildCard: wildCard} } - case 720: + case 717: { wildCard := &ast.WildCardField{Schema: model.NewCIStr(yyS[yypt-4].ident), Table: model.NewCIStr(yyS[yypt-2].ident)} parser.yyVAL.item = &ast.SelectField{WildCard: wildCard} } - case 721: + case 718: { expr := yyS[yypt-1].expr asName := yyS[yypt-0].ident parser.yyVAL.item = &ast.SelectField{Expr: expr, AsName: model.NewCIStr(asName)} } - case 722: + case 719: { parser.yyVAL.ident = "" } - case 725: + case 722: { parser.yyVAL.ident = yyS[yypt-0].ident } - case 727: + case 724: { parser.yyVAL.ident = yyS[yypt-0].ident } - case 728: + case 725: { field := yyS[yypt-0].item.(*ast.SelectField) field.Offset = parser.startOffset(&yyS[yypt]) @@ -16991,7 +16994,7 @@ yynewstate: } parser.yyVAL.item = []*ast.SelectField{field} } - case 729: + case 726: { fl := yyS[yypt-2].item.([]*ast.SelectField) field := yyS[yypt-0].item.(*ast.SelectField) @@ -17002,79 +17005,79 @@ yynewstate: } parser.yyVAL.item = append(fl, field) } - case 730: + case 727: { parser.yyVAL.item = false } - case 731: + case 728: { parser.yyVAL.item = true } - case 732: + case 729: { parser.yyVAL.item = &ast.GroupByClause{Items: yyS[yypt-1].item.([]*ast.ByItem), Rollup: yyS[yypt-0].item.(bool)} } - case 733: + case 730: { parser.yyVAL.item = nil } - case 734: + case 731: { parser.yyVAL.item = &ast.HavingClause{Expr: yyS[yypt-0].expr} } - case 735: + case 732: { parser.yyVAL.item = nil } - case 737: + case 734: { parser.yyVAL.item = &ast.AsOfClause{ TsExpr: yyS[yypt-0].expr.(ast.ExprNode), } } - case 738: + case 735: { parser.yyVAL.item = false } - case 739: + case 736: { parser.yyVAL.item = true } - case 740: + case 737: { parser.yyVAL.item = false } - case 741: + case 738: { parser.yyVAL.item = true } - case 742: + case 739: { parser.yyVAL.item = false } - case 743: + case 740: { parser.yyVAL.item = true } - case 744: + case 741: { parser.yyVAL.item = &ast.NullString{ String: "", Empty: false, } } - case 745: + case 742: { parser.yyVAL.item = &ast.NullString{ String: yyS[yypt-0].ident, Empty: len(yyS[yypt-0].ident) == 0, } } - case 746: + case 743: { parser.yyVAL.item = nil } - case 747: + case 744: { // Merge the options if yyS[yypt-1].item == nil { @@ -17098,19 +17101,19 @@ yynewstate: parser.yyVAL.item = opt1 } } - case 748: + case 745: { parser.yyVAL.item = &ast.IndexOption{ KeyBlockSize: yyS[yypt-0].item.(uint64), } } - case 749: + case 746: { parser.yyVAL.item = &ast.IndexOption{ Tp: yyS[yypt-0].item.(model.IndexType), } } - case 750: + case 747: { parser.yyVAL.item = &ast.IndexOption{ ParserName: model.NewCIStr(yyS[yypt-0].ident), @@ -17118,79 +17121,79 @@ yynewstate: yylex.AppendError(yylex.Errorf("The WITH PARASER clause is parsed but ignored by all storage engines.")) parser.lastErrorAsWarn() } - case 751: + case 748: { parser.yyVAL.item = &ast.IndexOption{ Comment: yyS[yypt-0].ident, } } - case 752: + case 749: { parser.yyVAL.item = &ast.IndexOption{ Visibility: yyS[yypt-0].item.(ast.IndexVisibility), } } - case 753: + case 750: { parser.yyVAL.item = &ast.IndexOption{ PrimaryKeyTp: yyS[yypt-0].item.(model.PrimaryKeyType), } } - case 754: + case 751: { parser.yyVAL.item = []interface{}{yyS[yypt-0].item, nil} } - case 755: + case 752: { parser.yyVAL.item = []interface{}{yyS[yypt-2].item, yyS[yypt-0].item} } - case 756: + case 753: { parser.yyVAL.item = []interface{}{&ast.NullString{String: yyS[yypt-2].ident, Empty: len(yyS[yypt-2].ident) == 0}, yyS[yypt-0].item} } - case 757: + case 754: { parser.yyVAL.item = nil } - case 759: + case 756: { parser.yyVAL.item = yyS[yypt-0].item } - case 760: + case 757: { parser.yyVAL.item = yyS[yypt-0].item } - case 761: + case 758: { parser.yyVAL.item = model.IndexTypeBtree } - case 762: + case 759: { parser.yyVAL.item = model.IndexTypeHash } - case 763: + case 760: { parser.yyVAL.item = model.IndexTypeRtree } - case 764: + case 761: { parser.yyVAL.item = model.IndexTypeHypo } - case 765: + case 762: { parser.yyVAL.item = ast.IndexVisibilityVisible } - case 766: + case 763: { parser.yyVAL.item = ast.IndexVisibilityInvisible } - case 1301: + case 1298: { parser.yyVAL.statement = &ast.CallStmt{ Procedure: yyS[yypt-0].expr.(*ast.FuncCallExpr), } } - case 1302: + case 1299: { parser.yyVAL.expr = &ast.FuncCallExpr{ Tp: ast.FuncCallExprTypeGeneric, @@ -17198,7 +17201,7 @@ yynewstate: Args: []ast.ExprNode{}, } } - case 1303: + case 1300: { parser.yyVAL.expr = &ast.FuncCallExpr{ Tp: ast.FuncCallExprTypeGeneric, @@ -17207,7 +17210,7 @@ yynewstate: Args: []ast.ExprNode{}, } } - case 1304: + case 1301: { parser.yyVAL.expr = &ast.FuncCallExpr{ Tp: ast.FuncCallExprTypeGeneric, @@ -17215,7 +17218,7 @@ yynewstate: Args: yyS[yypt-1].item.([]ast.ExprNode), } } - case 1305: + case 1302: { parser.yyVAL.expr = &ast.FuncCallExpr{ Tp: ast.FuncCallExprTypeGeneric, @@ -17224,7 +17227,7 @@ yynewstate: Args: yyS[yypt-1].item.([]ast.ExprNode), } } - case 1306: + case 1303: { x := yyS[yypt-1].item.(*ast.InsertStmt) x.Priority = yyS[yypt-6].item.(mysql.PriorityEnum) @@ -17241,26 +17244,26 @@ yynewstate: x.PartitionNames = yyS[yypt-2].item.([]model.CIStr) parser.yyVAL.statement = x } - case 1309: + case 1306: { parser.yyVAL.item = &ast.InsertStmt{ Columns: yyS[yypt-3].item.([]*ast.ColumnName), Lists: yyS[yypt-0].item.([][]ast.ExprNode), } } - case 1310: + case 1307: { parser.yyVAL.item = &ast.InsertStmt{Columns: yyS[yypt-2].item.([]*ast.ColumnName), Select: yyS[yypt-0].statement.(ast.ResultSetNode)} } - case 1311: + case 1308: { parser.yyVAL.item = &ast.InsertStmt{Columns: yyS[yypt-2].item.([]*ast.ColumnName), Select: yyS[yypt-0].statement.(ast.ResultSetNode)} } - case 1312: + case 1309: { parser.yyVAL.item = &ast.InsertStmt{Columns: yyS[yypt-2].item.([]*ast.ColumnName), Select: yyS[yypt-0].statement.(ast.ResultSetNode)} } - case 1313: + case 1310: { var sel ast.ResultSetNode switch x := yyS[yypt-0].expr.(*ast.SubqueryExpr).Query.(type) { @@ -17273,23 +17276,23 @@ yynewstate: } parser.yyVAL.item = &ast.InsertStmt{Columns: yyS[yypt-2].item.([]*ast.ColumnName), Select: sel} } - case 1314: + case 1311: { parser.yyVAL.item = &ast.InsertStmt{Lists: yyS[yypt-0].item.([][]ast.ExprNode)} } - case 1315: + case 1312: { parser.yyVAL.item = &ast.InsertStmt{Select: yyS[yypt-0].statement.(ast.ResultSetNode)} } - case 1316: + case 1313: { parser.yyVAL.item = &ast.InsertStmt{Select: yyS[yypt-0].statement.(ast.ResultSetNode)} } - case 1317: + case 1314: { parser.yyVAL.item = &ast.InsertStmt{Select: yyS[yypt-0].statement.(ast.ResultSetNode)} } - case 1318: + case 1315: { var sel ast.ResultSetNode switch x := yyS[yypt-0].expr.(*ast.SubqueryExpr).Query.(type) { @@ -17302,39 +17305,39 @@ yynewstate: } parser.yyVAL.item = &ast.InsertStmt{Select: sel} } - case 1319: + case 1316: { parser.yyVAL.item = yyS[yypt-0].item.(*ast.InsertStmt) } - case 1322: + case 1319: { parser.yyVAL.item = [][]ast.ExprNode{yyS[yypt-0].item.([]ast.ExprNode)} } - case 1323: + case 1320: { parser.yyVAL.item = append(yyS[yypt-2].item.([][]ast.ExprNode), yyS[yypt-0].item.([]ast.ExprNode)) } - case 1324: + case 1321: { parser.yyVAL.item = yyS[yypt-1].item } - case 1325: + case 1322: { parser.yyVAL.item = []ast.ExprNode{} } - case 1327: + case 1324: { parser.yyVAL.item = append(yyS[yypt-2].item.([]ast.ExprNode), yyS[yypt-0].expr) } - case 1328: + case 1325: { parser.yyVAL.item = []ast.ExprNode{yyS[yypt-0].expr} } - case 1330: + case 1327: { parser.yyVAL.expr = &ast.DefaultExpr{} } - case 1331: + case 1328: { parser.yyVAL.item = &ast.InsertStmt{ Columns: []*ast.ColumnName{yyS[yypt-2].item.(*ast.ColumnName)}, @@ -17342,24 +17345,27 @@ yynewstate: Setlist: true, } } - case 1332: + case 1329: { ins := yyS[yypt-4].item.(*ast.InsertStmt) ins.Columns = append(ins.Columns, yyS[yypt-2].item.(*ast.ColumnName)) ins.Lists[0] = append(ins.Lists[0], yyS[yypt-0].expr.(ast.ExprNode)) parser.yyVAL.item = ins } - case 1333: + case 1330: { parser.yyVAL.item = nil } - case 1334: + case 1331: { parser.yyVAL.item = yyS[yypt-0].item } - case 1335: + case 1332: { x := yyS[yypt-0].item.(*ast.InsertStmt) + if yyS[yypt-5].item != nil { + x.TableHints = yyS[yypt-5].item.([]*ast.TableOptimizerHint) + } x.IsReplace = true x.Priority = yyS[yypt-4].item.(mysql.PriorityEnum) ts := &ast.TableSource{Source: yyS[yypt-2].item.(*ast.TableName)} @@ -17367,31 +17373,31 @@ yynewstate: x.PartitionNames = yyS[yypt-1].item.([]model.CIStr) parser.yyVAL.statement = x } - case 1336: + case 1333: { parser.yyVAL.expr = ast.NewValueExpr(false, parser.charset, parser.collation) } - case 1337: + case 1334: { parser.yyVAL.expr = ast.NewValueExpr(nil, parser.charset, parser.collation) } - case 1338: + case 1335: { parser.yyVAL.expr = ast.NewValueExpr(true, parser.charset, parser.collation) } - case 1339: + case 1336: { parser.yyVAL.expr = ast.NewValueExpr(yyS[yypt-0].item, parser.charset, parser.collation) } - case 1340: + case 1337: { parser.yyVAL.expr = ast.NewValueExpr(yyS[yypt-0].item, parser.charset, parser.collation) } - case 1341: + case 1338: { parser.yyVAL.expr = ast.NewValueExpr(yyS[yypt-0].item, parser.charset, parser.collation) } - case 1343: + case 1340: { // See https://dev.mysql.com/doc/refman/5.7/en/charset-literal.html co, err := charset.GetDefaultCollationLegacy(yyS[yypt-1].ident) @@ -17409,15 +17415,15 @@ yynewstate: } parser.yyVAL.expr = expr } - case 1344: + case 1341: { parser.yyVAL.expr = ast.NewValueExpr(yyS[yypt-0].item, parser.charset, parser.collation) } - case 1345: + case 1342: { parser.yyVAL.expr = ast.NewValueExpr(yyS[yypt-0].item, parser.charset, parser.collation) } - case 1346: + case 1343: { co, err := charset.GetDefaultCollationLegacy(yyS[yypt-1].ident) if err != nil { @@ -17434,7 +17440,7 @@ yynewstate: } parser.yyVAL.expr = expr } - case 1347: + case 1344: { co, err := charset.GetDefaultCollationLegacy(yyS[yypt-1].ident) if err != nil { @@ -17451,12 +17457,12 @@ yynewstate: } parser.yyVAL.expr = expr } - case 1348: + case 1345: { expr := ast.NewValueExpr(yyS[yypt-0].ident, parser.charset, parser.collation) parser.yyVAL.expr = expr } - case 1349: + case 1346: { valExpr := yyS[yypt-1].expr.(ast.ValueExpr) strLit := valExpr.GetString() @@ -17469,31 +17475,31 @@ yynewstate: } parser.yyVAL.expr = expr } - case 1350: + case 1347: { parser.yyVAL.item = []*ast.AlterOrderItem{yyS[yypt-0].item.(*ast.AlterOrderItem)} } - case 1351: + case 1348: { parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.AlterOrderItem), yyS[yypt-0].item.(*ast.AlterOrderItem)) } - case 1352: + case 1349: { parser.yyVAL.item = &ast.AlterOrderItem{Column: yyS[yypt-1].item.(*ast.ColumnName), Desc: yyS[yypt-0].item.(bool)} } - case 1353: + case 1350: { parser.yyVAL.item = &ast.OrderByClause{Items: yyS[yypt-0].item.([]*ast.ByItem)} } - case 1354: + case 1351: { parser.yyVAL.item = []*ast.ByItem{yyS[yypt-0].item.(*ast.ByItem)} } - case 1355: + case 1352: { parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.ByItem), yyS[yypt-0].item.(*ast.ByItem)) } - case 1356: + case 1353: { expr := yyS[yypt-0].expr valueExpr, ok := expr.(ast.ValueExpr) @@ -17505,7 +17511,7 @@ yynewstate: } parser.yyVAL.item = &ast.ByItem{Expr: expr, NullOrder: true} } - case 1357: + case 1354: { expr := yyS[yypt-1].expr valueExpr, ok := expr.(ast.ValueExpr) @@ -17517,55 +17523,55 @@ yynewstate: } parser.yyVAL.item = &ast.ByItem{Expr: expr, Desc: yyS[yypt-0].item.(bool)} } - case 1358: + case 1355: { parser.yyVAL.item = false } - case 1359: + case 1356: { parser.yyVAL.item = true } - case 1360: + case 1357: { parser.yyVAL.item = false // ASC by default } - case 1361: + case 1358: { parser.yyVAL.item = false } - case 1362: + case 1359: { parser.yyVAL.item = true } - case 1363: + case 1360: { parser.yyVAL.item = nil } - case 1365: + case 1362: { parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.Or, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} } - case 1366: + case 1363: { parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.And, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} } - case 1367: + case 1364: { parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.LeftShift, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} } - case 1368: + case 1365: { parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.RightShift, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} } - case 1369: + case 1366: { parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.Plus, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} } - case 1370: + case 1367: { parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.Minus, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} } - case 1371: + case 1368: { parser.yyVAL.expr = &ast.FuncCallExpr{ FnName: model.NewCIStr("DATE_ADD"), @@ -17576,7 +17582,7 @@ yynewstate: }, } } - case 1372: + case 1369: { parser.yyVAL.expr = &ast.FuncCallExpr{ FnName: model.NewCIStr("DATE_SUB"), @@ -17587,7 +17593,7 @@ yynewstate: }, } } - case 1373: + case 1370: { parser.yyVAL.expr = &ast.FuncCallExpr{ FnName: model.NewCIStr("DATE_ADD"), @@ -17598,44 +17604,44 @@ yynewstate: }, } } - case 1374: + case 1371: { parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.Mul, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} } - case 1375: + case 1372: { parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.Div, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} } - case 1376: + case 1373: { parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.Mod, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} } - case 1377: + case 1374: { parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.IntDiv, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} } - case 1378: + case 1375: { parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.Mod, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} } - case 1379: + case 1376: { parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.Xor, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} } - case 1381: + case 1378: { parser.yyVAL.expr = &ast.ColumnNameExpr{Name: &ast.ColumnName{ Name: model.NewCIStr(yyS[yypt-0].ident), }} } - case 1382: + case 1379: { parser.yyVAL.expr = &ast.ColumnNameExpr{Name: &ast.ColumnName{ Table: model.NewCIStr(yyS[yypt-2].ident), Name: model.NewCIStr(yyS[yypt-0].ident), }} } - case 1383: + case 1380: { parser.yyVAL.expr = &ast.ColumnNameExpr{Name: &ast.ColumnName{ Schema: model.NewCIStr(yyS[yypt-4].ident), @@ -17643,39 +17649,39 @@ yynewstate: Name: model.NewCIStr(yyS[yypt-0].ident), }} } - case 1388: + case 1385: { parser.yyVAL.expr = &ast.SetCollationExpr{Expr: yyS[yypt-2].expr, Collate: yyS[yypt-0].ident} } - case 1391: + case 1388: { parser.yyVAL.expr = ast.NewParamMarkerExpr(yyS[yypt].offset) } - case 1394: + case 1391: { parser.yyVAL.expr = &ast.UnaryOperationExpr{Op: opcode.Not2, V: yyS[yypt-0].expr} } - case 1395: + case 1392: { parser.yyVAL.expr = &ast.UnaryOperationExpr{Op: opcode.BitNeg, V: yyS[yypt-0].expr} } - case 1396: + case 1393: { parser.yyVAL.expr = &ast.UnaryOperationExpr{Op: opcode.Minus, V: yyS[yypt-0].expr} } - case 1397: + case 1394: { parser.yyVAL.expr = &ast.UnaryOperationExpr{Op: opcode.Plus, V: yyS[yypt-0].expr} } - case 1398: + case 1395: { parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(ast.Concat), Args: []ast.ExprNode{yyS[yypt-2].expr, yyS[yypt-0].expr}} } - case 1399: + case 1396: { parser.yyVAL.expr = &ast.UnaryOperationExpr{Op: opcode.Not2, V: yyS[yypt-0].expr} } - case 1401: + case 1398: { startOffset := parser.startOffset(&yyS[yypt-1]) endOffset := parser.endOffset(&yyS[yypt]) @@ -17683,23 +17689,23 @@ yynewstate: expr.SetText(parser.lexer.client, parser.src[startOffset:endOffset]) parser.yyVAL.expr = &ast.ParenthesesExpr{Expr: expr} } - case 1402: + case 1399: { values := append(yyS[yypt-3].item.([]ast.ExprNode), yyS[yypt-1].expr) parser.yyVAL.expr = &ast.RowExpr{Values: values} } - case 1403: + case 1400: { values := append(yyS[yypt-3].item.([]ast.ExprNode), yyS[yypt-1].expr) parser.yyVAL.expr = &ast.RowExpr{Values: values} } - case 1404: + case 1401: { sq := yyS[yypt-0].expr.(*ast.SubqueryExpr) sq.Exists = true parser.yyVAL.expr = &ast.ExistsSubqueryExpr{Sel: sq} } - case 1405: + case 1402: { /* * ODBC escape syntax. @@ -17723,7 +17729,7 @@ yynewstate: parser.yyVAL.expr = yyS[yypt-1].expr } } - case 1406: + case 1403: { // See https://dev.mysql.com/doc/refman/5.7/en/cast-functions.html#operator_binary tp := types.NewFieldType(mysql.TypeString) @@ -17736,7 +17742,7 @@ yynewstate: FunctionType: ast.CastBinaryOperator, } } - case 1407: + case 1404: { /* See https://dev.mysql.com/doc/refman/5.7/en/cast-functions.html#function_cast */ tp := yyS[yypt-2].item.(*types.FieldType) @@ -17762,7 +17768,7 @@ yynewstate: ExplicitCharSet: explicitCharset, } } - case 1408: + case 1405: { x := &ast.CaseExpr{WhenClauses: yyS[yypt-2].item.([]*ast.WhenClause)} if yyS[yypt-3].expr != nil { @@ -17773,7 +17779,7 @@ yynewstate: } parser.yyVAL.expr = x } - case 1409: + case 1406: { // See https://dev.mysql.com/doc/refman/5.7/en/cast-functions.html#function_convert tp := yyS[yypt-1].item.(*types.FieldType) @@ -17793,7 +17799,7 @@ yynewstate: ExplicitCharSet: explicitCharset, } } - case 1410: + case 1407: { // See https://dev.mysql.com/doc/refman/5.7/en/cast-functions.html#function_convert charset1 := ast.NewValueExpr(yyS[yypt-1].ident, "", "") @@ -17802,70 +17808,70 @@ yynewstate: Args: []ast.ExprNode{yyS[yypt-3].expr, charset1}, } } - case 1411: + case 1408: { parser.yyVAL.expr = &ast.DefaultExpr{Name: yyS[yypt-1].expr.(*ast.ColumnNameExpr).Name} } - case 1412: + case 1409: { parser.yyVAL.expr = &ast.ValuesExpr{Column: yyS[yypt-1].expr.(*ast.ColumnNameExpr)} } - case 1413: + case 1410: { expr := ast.NewValueExpr(yyS[yypt-0].ident, parser.charset, parser.collation) parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(ast.JSONExtract), Args: []ast.ExprNode{yyS[yypt-2].expr, expr}} } - case 1414: + case 1411: { expr := ast.NewValueExpr(yyS[yypt-0].ident, parser.charset, parser.collation) extract := &ast.FuncCallExpr{FnName: model.NewCIStr(ast.JSONExtract), Args: []ast.ExprNode{yyS[yypt-2].expr, expr}} parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(ast.JSONUnquote), Args: []ast.ExprNode{extract}} } - case 1415: + case 1412: { parser.yyVAL.item = false } - case 1416: + case 1413: { parser.yyVAL.item = true } - case 1419: + case 1416: { parser.yyVAL.item = false } - case 1420: + case 1417: { parser.yyVAL.item = true } - case 1421: + case 1418: { parser.yyVAL.item = false } - case 1423: + case 1420: { parser.yyVAL.item = true } - case 1426: + case 1423: { parser.yyVAL.item = true } - case 1471: + case 1468: { parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(yyS[yypt-3].ident), Args: yyS[yypt-1].item.([]ast.ExprNode)} } - case 1472: + case 1469: { parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(yyS[yypt-3].ident), Args: yyS[yypt-1].item.([]ast.ExprNode)} } - case 1473: + case 1470: { parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(yyS[yypt-1].ident)} } - case 1474: + case 1471: { parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(yyS[yypt-2].ident)} } - case 1475: + case 1472: { args := []ast.ExprNode{} if yyS[yypt-0].item != nil { @@ -17873,7 +17879,7 @@ yynewstate: } parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(yyS[yypt-1].ident), Args: args} } - case 1476: + case 1473: { nilVal := ast.NewValueExpr(nil, parser.charset, parser.collation) args := yyS[yypt-1].item.([]ast.ExprNode) @@ -17882,7 +17888,7 @@ yynewstate: Args: append(args, nilVal), } } - case 1477: + case 1474: { charset1 := ast.NewValueExpr(yyS[yypt-1].ident, "", "") args := yyS[yypt-3].item.([]ast.ExprNode) @@ -17891,42 +17897,42 @@ yynewstate: Args: append(args, charset1), } } - case 1478: + case 1475: { expr := ast.NewValueExpr(yyS[yypt-0].ident, "", "") parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(ast.DateLiteral), Args: []ast.ExprNode{expr}} } - case 1479: + case 1476: { expr := ast.NewValueExpr(yyS[yypt-0].ident, "", "") parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(ast.TimeLiteral), Args: []ast.ExprNode{expr}} } - case 1480: + case 1477: { expr := ast.NewValueExpr(yyS[yypt-0].ident, "", "") parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(ast.TimestampLiteral), Args: []ast.ExprNode{expr}} } - case 1481: + case 1478: { parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(ast.InsertFunc), Args: yyS[yypt-1].item.([]ast.ExprNode)} } - case 1482: + case 1479: { parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.Mod, L: yyS[yypt-3].expr, R: yyS[yypt-1].expr} } - case 1483: + case 1480: { parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(ast.PasswordFunc), Args: yyS[yypt-1].item.([]ast.ExprNode)} } - case 1484: + case 1481: { parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(yyS[yypt-3].ident), Args: yyS[yypt-1].item.([]ast.ExprNode)} } - case 1485: + case 1482: { parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(yyS[yypt-3].ident), Args: yyS[yypt-1].item.([]ast.ExprNode)} } - case 1486: + case 1483: { parser.yyVAL.expr = &ast.FuncCallExpr{ FnName: model.NewCIStr(yyS[yypt-5].ident), @@ -17937,7 +17943,7 @@ yynewstate: }, } } - case 1487: + case 1484: { parser.yyVAL.expr = &ast.FuncCallExpr{ FnName: model.NewCIStr(yyS[yypt-7].ident), @@ -17948,7 +17954,7 @@ yynewstate: }, } } - case 1488: + case 1485: { parser.yyVAL.expr = &ast.FuncCallExpr{ FnName: model.NewCIStr(yyS[yypt-7].ident), @@ -17959,7 +17965,7 @@ yynewstate: }, } } - case 1489: + case 1486: { timeUnit := &ast.TimeUnitExpr{Unit: yyS[yypt-3].item.(ast.TimeUnitType)} parser.yyVAL.expr = &ast.FuncCallExpr{ @@ -17967,7 +17973,7 @@ yynewstate: Args: []ast.ExprNode{timeUnit, yyS[yypt-1].expr}, } } - case 1490: + case 1487: { parser.yyVAL.expr = &ast.FuncCallExpr{ FnName: model.NewCIStr(yyS[yypt-5].ident), @@ -17977,67 +17983,67 @@ yynewstate: }, } } - case 1491: + case 1488: { parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(yyS[yypt-5].ident), Args: []ast.ExprNode{yyS[yypt-3].expr, yyS[yypt-1].expr}} } - case 1492: + case 1489: { parser.yyVAL.expr = &ast.FuncCallExpr{ FnName: model.NewCIStr(yyS[yypt-5].ident), Args: []ast.ExprNode{yyS[yypt-3].expr, yyS[yypt-1].expr}, } } - case 1493: + case 1490: { parser.yyVAL.expr = &ast.FuncCallExpr{ FnName: model.NewCIStr(yyS[yypt-5].ident), Args: []ast.ExprNode{yyS[yypt-3].expr, yyS[yypt-1].expr}, } } - case 1494: + case 1491: { parser.yyVAL.expr = &ast.FuncCallExpr{ FnName: model.NewCIStr(yyS[yypt-7].ident), Args: []ast.ExprNode{yyS[yypt-5].expr, yyS[yypt-3].expr, yyS[yypt-1].expr}, } } - case 1495: + case 1492: { parser.yyVAL.expr = &ast.FuncCallExpr{ FnName: model.NewCIStr(yyS[yypt-7].ident), Args: []ast.ExprNode{yyS[yypt-5].expr, yyS[yypt-3].expr, yyS[yypt-1].expr}, } } - case 1496: + case 1493: { parser.yyVAL.expr = &ast.FuncCallExpr{ FnName: model.NewCIStr(yyS[yypt-7].ident), Args: []ast.ExprNode{&ast.TimeUnitExpr{Unit: yyS[yypt-5].item.(ast.TimeUnitType)}, yyS[yypt-3].expr, yyS[yypt-1].expr}, } } - case 1497: + case 1494: { parser.yyVAL.expr = &ast.FuncCallExpr{ FnName: model.NewCIStr(yyS[yypt-7].ident), Args: []ast.ExprNode{&ast.TimeUnitExpr{Unit: yyS[yypt-5].item.(ast.TimeUnitType)}, yyS[yypt-3].expr, yyS[yypt-1].expr}, } } - case 1498: + case 1495: { parser.yyVAL.expr = &ast.FuncCallExpr{ FnName: model.NewCIStr(yyS[yypt-3].ident), Args: []ast.ExprNode{yyS[yypt-1].expr}, } } - case 1499: + case 1496: { parser.yyVAL.expr = &ast.FuncCallExpr{ FnName: model.NewCIStr(yyS[yypt-5].ident), Args: []ast.ExprNode{yyS[yypt-1].expr, yyS[yypt-3].expr}, } } - case 1500: + case 1497: { spaceVal := ast.NewValueExpr(" ", parser.charset, parser.collation) direction := &ast.TrimDirectionExpr{Direction: yyS[yypt-3].item.(ast.TrimDirectionType)} @@ -18046,7 +18052,7 @@ yynewstate: Args: []ast.ExprNode{yyS[yypt-1].expr, spaceVal, direction}, } } - case 1501: + case 1498: { direction := &ast.TrimDirectionExpr{Direction: yyS[yypt-4].item.(ast.TrimDirectionType)} parser.yyVAL.expr = &ast.FuncCallExpr{ @@ -18054,63 +18060,63 @@ yynewstate: Args: []ast.ExprNode{yyS[yypt-1].expr, yyS[yypt-3].expr, direction}, } } - case 1502: + case 1499: { parser.yyVAL.expr = &ast.FuncCallExpr{ FnName: model.NewCIStr(yyS[yypt-3].ident), Args: []ast.ExprNode{yyS[yypt-1].expr}, } } - case 1503: + case 1500: { parser.yyVAL.expr = &ast.FuncCallExpr{ FnName: model.NewCIStr(yyS[yypt-6].ident), Args: []ast.ExprNode{yyS[yypt-4].expr, ast.NewValueExpr("CHAR", parser.charset, parser.collation), ast.NewValueExpr(yyS[yypt-1].item, parser.charset, parser.collation)}, } } - case 1504: + case 1501: { parser.yyVAL.expr = &ast.FuncCallExpr{ FnName: model.NewCIStr(yyS[yypt-6].ident), Args: []ast.ExprNode{yyS[yypt-4].expr, ast.NewValueExpr("BINARY", parser.charset, parser.collation), ast.NewValueExpr(yyS[yypt-1].item, parser.charset, parser.collation)}, } } - case 1506: + case 1503: { parser.yyVAL.expr = &ast.FuncCallExpr{ FnName: model.NewCIStr(yyS[yypt-7].ident), Args: []ast.ExprNode{yyS[yypt-5].expr, yyS[yypt-3].expr, yyS[yypt-1].expr}, } } - case 1507: + case 1504: { parser.yyVAL.item = ast.GetFormatSelectorDate } - case 1508: + case 1505: { parser.yyVAL.item = ast.GetFormatSelectorDatetime } - case 1509: + case 1506: { parser.yyVAL.item = ast.GetFormatSelectorTime } - case 1510: + case 1507: { parser.yyVAL.item = ast.GetFormatSelectorDatetime } - case 1515: + case 1512: { parser.yyVAL.item = ast.TrimBoth } - case 1516: + case 1513: { parser.yyVAL.item = ast.TrimLeading } - case 1517: + case 1514: { parser.yyVAL.item = ast.TrimTrailing } - case 1518: + case 1515: { objNameExpr := &ast.TableNameExpr{ Name: yyS[yypt-1].item.(*ast.TableName), @@ -18120,7 +18126,7 @@ yynewstate: Args: []ast.ExprNode{objNameExpr}, } } - case 1519: + case 1516: { objNameExpr := &ast.TableNameExpr{ Name: yyS[yypt-3].item.(*ast.TableName), @@ -18131,7 +18137,7 @@ yynewstate: Args: []ast.ExprNode{objNameExpr, valueExpr}, } } - case 1521: + case 1518: { if yyS[yypt-0].item != nil { parser.yyVAL.expr = &ast.WindowFuncExpr{Name: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Distinct: yyS[yypt-3].item.(bool), Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} @@ -18139,15 +18145,15 @@ yynewstate: parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Distinct: yyS[yypt-3].item.(bool)} } } - case 1522: + case 1519: { parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-3].ident, Args: yyS[yypt-1].item.([]ast.ExprNode), Distinct: false} } - case 1523: + case 1520: { parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-3].ident, Args: yyS[yypt-1].item.([]ast.ExprNode)} } - case 1524: + case 1521: { if yyS[yypt-0].item != nil { parser.yyVAL.expr = &ast.WindowFuncExpr{Name: yyS[yypt-4].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} @@ -18155,7 +18161,7 @@ yynewstate: parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-4].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}} } } - case 1525: + case 1522: { if yyS[yypt-0].item != nil { parser.yyVAL.expr = &ast.WindowFuncExpr{Name: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} @@ -18163,7 +18169,7 @@ yynewstate: parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}} } } - case 1526: + case 1523: { if yyS[yypt-0].item != nil { parser.yyVAL.expr = &ast.WindowFuncExpr{Name: yyS[yypt-4].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} @@ -18171,7 +18177,7 @@ yynewstate: parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-4].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}} } } - case 1527: + case 1524: { if yyS[yypt-0].item != nil { parser.yyVAL.expr = &ast.WindowFuncExpr{Name: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} @@ -18179,7 +18185,7 @@ yynewstate: parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}} } } - case 1528: + case 1525: { if yyS[yypt-0].item != nil { parser.yyVAL.expr = &ast.WindowFuncExpr{Name: yyS[yypt-4].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} @@ -18187,7 +18193,7 @@ yynewstate: parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-4].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}} } } - case 1529: + case 1526: { if yyS[yypt-0].item != nil { parser.yyVAL.expr = &ast.WindowFuncExpr{Name: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} @@ -18195,11 +18201,11 @@ yynewstate: parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}} } } - case 1530: + case 1527: { parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-4].ident, Args: yyS[yypt-1].item.([]ast.ExprNode), Distinct: true} } - case 1531: + case 1528: { if yyS[yypt-0].item != nil { parser.yyVAL.expr = &ast.WindowFuncExpr{Name: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} @@ -18207,7 +18213,7 @@ yynewstate: parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}} } } - case 1532: + case 1529: { if yyS[yypt-0].item != nil { parser.yyVAL.expr = &ast.WindowFuncExpr{Name: yyS[yypt-4].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} @@ -18215,7 +18221,7 @@ yynewstate: parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-4].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}} } } - case 1533: + case 1530: { args := []ast.ExprNode{ast.NewValueExpr(1, parser.charset, parser.collation)} if yyS[yypt-0].item != nil { @@ -18224,7 +18230,7 @@ yynewstate: parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-4].ident, Args: args} } } - case 1534: + case 1531: { args := yyS[yypt-4].item.([]ast.ExprNode) args = append(args, yyS[yypt-2].item.(ast.ExprNode)) @@ -18238,7 +18244,7 @@ yynewstate: parser.yyVAL.expr = agg } } - case 1535: + case 1532: { if yyS[yypt-0].item != nil { parser.yyVAL.expr = &ast.WindowFuncExpr{Name: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Distinct: yyS[yypt-3].item.(bool), Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} @@ -18246,7 +18252,7 @@ yynewstate: parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Distinct: yyS[yypt-3].item.(bool)} } } - case 1536: + case 1533: { if yyS[yypt-0].item != nil { parser.yyVAL.expr = &ast.WindowFuncExpr{Name: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Distinct: yyS[yypt-3].item.(bool), Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} @@ -18254,7 +18260,7 @@ yynewstate: parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Distinct: yyS[yypt-3].item.(bool)} } } - case 1537: + case 1534: { if yyS[yypt-0].item != nil { parser.yyVAL.expr = &ast.WindowFuncExpr{Name: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Distinct: yyS[yypt-3].item.(bool), Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} @@ -18262,7 +18268,7 @@ yynewstate: parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Distinct: yyS[yypt-3].item.(bool)} } } - case 1538: + case 1535: { if yyS[yypt-0].item != nil { parser.yyVAL.expr = &ast.WindowFuncExpr{Name: ast.AggFuncStddevPop, Args: []ast.ExprNode{yyS[yypt-2].expr}, Distinct: yyS[yypt-3].item.(bool), Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} @@ -18270,7 +18276,7 @@ yynewstate: parser.yyVAL.expr = &ast.AggregateFuncExpr{F: ast.AggFuncStddevPop, Args: []ast.ExprNode{yyS[yypt-2].expr}, Distinct: yyS[yypt-3].item.(bool)} } } - case 1539: + case 1536: { if yyS[yypt-0].item != nil { parser.yyVAL.expr = &ast.WindowFuncExpr{Name: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Distinct: yyS[yypt-3].item.(bool), Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} @@ -18278,7 +18284,7 @@ yynewstate: parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Distinct: yyS[yypt-3].item.(bool)} } } - case 1540: + case 1537: { if yyS[yypt-0].item != nil { parser.yyVAL.expr = &ast.WindowFuncExpr{Name: ast.AggFuncVarPop, Args: []ast.ExprNode{yyS[yypt-2].expr}, Distinct: yyS[yypt-3].item.(bool), Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} @@ -18286,11 +18292,11 @@ yynewstate: parser.yyVAL.expr = &ast.AggregateFuncExpr{F: ast.AggFuncVarPop, Args: []ast.ExprNode{yyS[yypt-2].expr}, Distinct: yyS[yypt-3].item.(bool)} } } - case 1541: + case 1538: { parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Distinct: yyS[yypt-3].item.(bool)} } - case 1542: + case 1539: { if yyS[yypt-0].item != nil { parser.yyVAL.expr = &ast.WindowFuncExpr{Name: yyS[yypt-4].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} @@ -18298,7 +18304,7 @@ yynewstate: parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-4].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}} } } - case 1543: + case 1540: { if yyS[yypt-0].item != nil { parser.yyVAL.expr = &ast.WindowFuncExpr{Name: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} @@ -18306,7 +18312,7 @@ yynewstate: parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}} } } - case 1544: + case 1541: { if yyS[yypt-0].item != nil { parser.yyVAL.expr = &ast.WindowFuncExpr{Name: yyS[yypt-6].ident, Args: []ast.ExprNode{yyS[yypt-4].expr, yyS[yypt-2].expr}, Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} @@ -18314,7 +18320,7 @@ yynewstate: parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-6].ident, Args: []ast.ExprNode{yyS[yypt-4].expr, yyS[yypt-2].expr}} } } - case 1545: + case 1542: { if yyS[yypt-0].item != nil { parser.yyVAL.expr = &ast.WindowFuncExpr{Name: yyS[yypt-7].ident, Args: []ast.ExprNode{yyS[yypt-4].expr, yyS[yypt-2].expr}, Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} @@ -18322,7 +18328,7 @@ yynewstate: parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-7].ident, Args: []ast.ExprNode{yyS[yypt-4].expr, yyS[yypt-2].expr}} } } - case 1546: + case 1543: { if yyS[yypt-0].item != nil { parser.yyVAL.expr = &ast.WindowFuncExpr{Name: yyS[yypt-7].ident, Args: []ast.ExprNode{yyS[yypt-5].expr, yyS[yypt-2].expr}, Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} @@ -18330,7 +18336,7 @@ yynewstate: parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-7].ident, Args: []ast.ExprNode{yyS[yypt-5].expr, yyS[yypt-2].expr}} } } - case 1547: + case 1544: { if yyS[yypt-0].item != nil { parser.yyVAL.expr = &ast.WindowFuncExpr{Name: yyS[yypt-8].ident, Args: []ast.ExprNode{yyS[yypt-5].expr, yyS[yypt-2].expr}, Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} @@ -18338,22 +18344,22 @@ yynewstate: parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-8].ident, Args: []ast.ExprNode{yyS[yypt-5].expr, yyS[yypt-2].expr}} } } - case 1548: + case 1545: { parser.yyVAL.item = ast.NewValueExpr(",", "", "") } - case 1549: + case 1546: { parser.yyVAL.item = ast.NewValueExpr(yyS[yypt-0].ident, "", "") } - case 1550: + case 1547: { parser.yyVAL.expr = &ast.FuncCallExpr{ FnName: model.NewCIStr(yyS[yypt-3].ident), Args: yyS[yypt-1].item.([]ast.ExprNode), } } - case 1551: + case 1548: { var tp ast.FuncCallExprType if isInTokenMap(yyS[yypt-3].ident) { @@ -18368,159 +18374,159 @@ yynewstate: Args: yyS[yypt-1].item.([]ast.ExprNode), } } - case 1552: + case 1549: { parser.yyVAL.item = nil } - case 1553: + case 1550: { parser.yyVAL.item = nil } - case 1554: + case 1551: { expr := ast.NewValueExpr(yyS[yypt-1].item, parser.charset, parser.collation) parser.yyVAL.item = expr } - case 1556: + case 1553: { parser.yyVAL.item = ast.TimeUnitSecondMicrosecond } - case 1557: + case 1554: { parser.yyVAL.item = ast.TimeUnitMinuteMicrosecond } - case 1558: + case 1555: { parser.yyVAL.item = ast.TimeUnitMinuteSecond } - case 1559: + case 1556: { parser.yyVAL.item = ast.TimeUnitHourMicrosecond } - case 1560: + case 1557: { parser.yyVAL.item = ast.TimeUnitHourSecond } - case 1561: + case 1558: { parser.yyVAL.item = ast.TimeUnitHourMinute } - case 1562: + case 1559: { parser.yyVAL.item = ast.TimeUnitDayMicrosecond } - case 1563: + case 1560: { parser.yyVAL.item = ast.TimeUnitDaySecond } - case 1564: + case 1561: { parser.yyVAL.item = ast.TimeUnitDayMinute } - case 1565: + case 1562: { parser.yyVAL.item = ast.TimeUnitDayHour } - case 1566: + case 1563: { parser.yyVAL.item = ast.TimeUnitYearMonth } - case 1567: + case 1564: { parser.yyVAL.item = ast.TimeUnitMicrosecond } - case 1568: + case 1565: { parser.yyVAL.item = ast.TimeUnitSecond } - case 1569: + case 1566: { parser.yyVAL.item = ast.TimeUnitMinute } - case 1570: + case 1567: { parser.yyVAL.item = ast.TimeUnitHour } - case 1571: + case 1568: { parser.yyVAL.item = ast.TimeUnitDay } - case 1572: + case 1569: { parser.yyVAL.item = ast.TimeUnitWeek } - case 1573: + case 1570: { parser.yyVAL.item = ast.TimeUnitMonth } - case 1574: + case 1571: { parser.yyVAL.item = ast.TimeUnitQuarter } - case 1575: + case 1572: { parser.yyVAL.item = ast.TimeUnitYear } - case 1576: + case 1573: { parser.yyVAL.item = ast.TimeUnitSecond } - case 1577: + case 1574: { parser.yyVAL.item = ast.TimeUnitMinute } - case 1578: + case 1575: { parser.yyVAL.item = ast.TimeUnitHour } - case 1579: + case 1576: { parser.yyVAL.item = ast.TimeUnitDay } - case 1580: + case 1577: { parser.yyVAL.item = ast.TimeUnitWeek } - case 1581: + case 1578: { parser.yyVAL.item = ast.TimeUnitMonth } - case 1582: + case 1579: { parser.yyVAL.item = ast.TimeUnitQuarter } - case 1583: + case 1580: { parser.yyVAL.item = ast.TimeUnitYear } - case 1584: + case 1581: { parser.yyVAL.expr = nil } - case 1586: + case 1583: { parser.yyVAL.item = []*ast.WhenClause{yyS[yypt-0].item.(*ast.WhenClause)} } - case 1587: + case 1584: { parser.yyVAL.item = append(yyS[yypt-1].item.([]*ast.WhenClause), yyS[yypt-0].item.(*ast.WhenClause)) } - case 1588: + case 1585: { parser.yyVAL.item = &ast.WhenClause{ Expr: yyS[yypt-2].expr, Result: yyS[yypt-0].expr, } } - case 1589: + case 1586: { parser.yyVAL.item = nil } - case 1590: + case 1587: { parser.yyVAL.item = yyS[yypt-0].expr } - case 1591: + case 1588: { tp := types.NewFieldType(mysql.TypeVarString) tp.SetFlen(yyS[yypt-0].item.(int)) // TODO: Flen should be the flen of expression @@ -18532,7 +18538,7 @@ yynewstate: tp.AddFlag(mysql.BinaryFlag) parser.yyVAL.item = tp } - case 1592: + case 1589: { tp := types.NewFieldType(mysql.TypeVarString) tp.SetFlen(yyS[yypt-1].item.(int)) // TODO: Flen should be the flen of expression @@ -18555,7 +18561,7 @@ yynewstate: } parser.yyVAL.item = tp } - case 1593: + case 1590: { tp := types.NewFieldType(mysql.TypeDate) tp.SetCharset(charset.CharsetBin) @@ -18563,7 +18569,7 @@ yynewstate: tp.AddFlag(mysql.BinaryFlag) parser.yyVAL.item = tp } - case 1594: + case 1591: { tp := types.NewFieldType(mysql.TypeYear) tp.SetCharset(charset.CharsetBin) @@ -18571,7 +18577,7 @@ yynewstate: tp.AddFlag(mysql.BinaryFlag) parser.yyVAL.item = tp } - case 1595: + case 1592: { tp := types.NewFieldType(mysql.TypeDatetime) flen, _ := mysql.GetDefaultFieldLengthAndDecimalForCast(mysql.TypeDatetime) @@ -18585,7 +18591,7 @@ yynewstate: tp.AddFlag(mysql.BinaryFlag) parser.yyVAL.item = tp } - case 1596: + case 1593: { fopt := yyS[yypt-0].item.(*ast.FloatOpt) tp := types.NewFieldType(mysql.TypeNewDecimal) @@ -18596,7 +18602,7 @@ yynewstate: tp.AddFlag(mysql.BinaryFlag) parser.yyVAL.item = tp } - case 1597: + case 1594: { tp := types.NewFieldType(mysql.TypeDuration) flen, _ := mysql.GetDefaultFieldLengthAndDecimalForCast(mysql.TypeDuration) @@ -18610,7 +18616,7 @@ yynewstate: tp.AddFlag(mysql.BinaryFlag) parser.yyVAL.item = tp } - case 1598: + case 1595: { tp := types.NewFieldType(mysql.TypeLonglong) tp.SetCharset(charset.CharsetBin) @@ -18618,7 +18624,7 @@ yynewstate: tp.AddFlag(mysql.BinaryFlag) parser.yyVAL.item = tp } - case 1599: + case 1596: { tp := types.NewFieldType(mysql.TypeLonglong) tp.AddFlag(mysql.UnsignedFlag | mysql.BinaryFlag) @@ -18626,7 +18632,7 @@ yynewstate: tp.SetCollate(charset.CollationBin) parser.yyVAL.item = tp } - case 1600: + case 1597: { tp := types.NewFieldType(mysql.TypeJSON) tp.AddFlag(mysql.BinaryFlag | mysql.ParseToJSONFlag) @@ -18634,7 +18640,7 @@ yynewstate: tp.SetCollate(mysql.DefaultCollationName) parser.yyVAL.item = tp } - case 1601: + case 1598: { tp := types.NewFieldType(mysql.TypeDouble) flen, decimal := mysql.GetDefaultFieldLengthAndDecimalForCast(mysql.TypeDouble) @@ -18645,7 +18651,7 @@ yynewstate: tp.SetCollate(charset.CollationBin) parser.yyVAL.item = tp } - case 1602: + case 1599: { tp := types.NewFieldType(mysql.TypeFloat) fopt := yyS[yypt-0].item.(*ast.FloatOpt) @@ -18662,7 +18668,7 @@ yynewstate: tp.SetCollate(charset.CollationBin) parser.yyVAL.item = tp } - case 1603: + case 1600: { var tp *types.FieldType if parser.lexer.GetSQLMode().HasRealAsFloatMode() { @@ -18678,65 +18684,74 @@ yynewstate: tp.SetCollate(charset.CollationBin) parser.yyVAL.item = tp } - case 1604: + case 1601: { parser.yyVAL.item = mysql.LowPriority } - case 1605: + case 1602: { parser.yyVAL.item = mysql.HighPriority } - case 1606: + case 1603: { parser.yyVAL.item = mysql.DelayedPriority } - case 1607: + case 1604: { parser.yyVAL.item = mysql.NoPriority } - case 1609: + case 1606: { parser.yyVAL.item = &ast.TableName{Name: model.NewCIStr(yyS[yypt-0].ident)} } - case 1610: + case 1607: { - parser.yyVAL.item = &ast.TableName{Schema: model.NewCIStr(yyS[yypt-2].ident), Name: model.NewCIStr(yyS[yypt-0].ident)} + schema := yyS[yypt-2].ident + if isInCorrectIdentifierName(schema) { + yylex.AppendError(ErrWrongDBName.GenWithStackByArgs(schema)) + return 1 + } + parser.yyVAL.item = &ast.TableName{Schema: model.NewCIStr(schema), Name: model.NewCIStr(yyS[yypt-0].ident)} } - case 1611: + case 1608: + { + parser.yyVAL.item = &ast.TableName{Schema: model.NewCIStr("*"), Name: model.NewCIStr(yyS[yypt-0].ident)} + } + case 1609: { tbl := []*ast.TableName{yyS[yypt-0].item.(*ast.TableName)} parser.yyVAL.item = tbl } - case 1612: + case 1610: { parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.TableName), yyS[yypt-0].item.(*ast.TableName)) } - case 1613: + case 1611: { parser.yyVAL.item = &ast.TableName{Name: model.NewCIStr(yyS[yypt-1].ident)} } - case 1614: + case 1612: { parser.yyVAL.item = &ast.TableName{Schema: model.NewCIStr(yyS[yypt-3].ident), Name: model.NewCIStr(yyS[yypt-1].ident)} } - case 1615: + case 1613: { tbl := []*ast.TableName{yyS[yypt-0].item.(*ast.TableName)} parser.yyVAL.item = tbl } - case 1616: + case 1614: { parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.TableName), yyS[yypt-0].item.(*ast.TableName)) } - case 1619: + case 1617: { parser.yyVAL.item = false } - case 1620: + case 1618: { parser.yyVAL.item = true } - case 1621: + case 1619: { var sqlText string var sqlVar *ast.VariableExpr @@ -18752,94 +18767,94 @@ yynewstate: SQLVar: sqlVar, } } - case 1622: + case 1620: { parser.yyVAL.item = yyS[yypt-0].ident } - case 1623: + case 1621: { parser.yyVAL.item = yyS[yypt-0].expr } - case 1624: + case 1622: { parser.yyVAL.statement = &ast.ExecuteStmt{Name: yyS[yypt-0].ident} } - case 1625: + case 1623: { parser.yyVAL.statement = &ast.ExecuteStmt{ Name: yyS[yypt-2].ident, UsingVars: yyS[yypt-0].item.([]ast.ExprNode), } } - case 1626: + case 1624: { parser.yyVAL.item = []ast.ExprNode{yyS[yypt-0].expr} } - case 1627: + case 1625: { parser.yyVAL.item = append(yyS[yypt-2].item.([]ast.ExprNode), yyS[yypt-0].expr) } - case 1628: + case 1626: { parser.yyVAL.statement = &ast.DeallocateStmt{Name: yyS[yypt-0].ident} } - case 1631: + case 1629: { parser.yyVAL.statement = &ast.RollbackStmt{} } - case 1632: + case 1630: { parser.yyVAL.statement = &ast.RollbackStmt{CompletionType: yyS[yypt-0].item.(ast.CompletionType)} } - case 1633: + case 1631: { parser.yyVAL.statement = &ast.RollbackStmt{SavepointName: yyS[yypt-0].ident} } - case 1634: + case 1632: { parser.yyVAL.statement = &ast.RollbackStmt{SavepointName: yyS[yypt-0].ident} } - case 1635: + case 1633: { parser.yyVAL.item = ast.CompletionTypeChain } - case 1636: + case 1634: { parser.yyVAL.item = ast.CompletionTypeRelease } - case 1637: + case 1635: { parser.yyVAL.item = ast.CompletionTypeDefault } - case 1638: + case 1636: { parser.yyVAL.item = ast.CompletionTypeChain } - case 1639: + case 1637: { parser.yyVAL.item = ast.CompletionTypeDefault } - case 1640: + case 1638: { parser.yyVAL.item = ast.CompletionTypeRelease } - case 1641: + case 1639: { parser.yyVAL.item = ast.CompletionTypeDefault } - case 1642: + case 1640: { parser.yyVAL.statement = &ast.ShutdownStmt{} } - case 1643: + case 1641: { parser.yyVAL.statement = &ast.RestartStmt{} } - case 1644: + case 1642: { parser.yyVAL.statement = &ast.HelpStmt{Topic: yyS[yypt-0].ident} } - case 1645: + case 1643: { st := &ast.SelectStmt{ SelectStmtOpts: yyS[yypt-2].item.(*ast.SelectStmtOpts), @@ -18855,7 +18870,7 @@ yynewstate: } parser.yyVAL.item = st } - case 1646: + case 1644: { st := yyS[yypt-2].item.(*ast.SelectStmt) lastField := st.Fields.Fields[len(st.Fields.Fields)-1] @@ -18867,7 +18882,7 @@ yynewstate: st.Where = yyS[yypt-0].item.(ast.ExprNode) } } - case 1647: + case 1645: { st := yyS[yypt-6].item.(*ast.SelectStmt) st.From = yyS[yypt-4].item.(*ast.TableRefsClause) @@ -18890,11 +18905,11 @@ yynewstate: } parser.yyVAL.item = st } - case 1648: + case 1646: { parser.yyVAL.item = nil } - case 1649: + case 1647: { var repSeed ast.ExprNode if yyS[yypt-0].expr != nil { @@ -18907,7 +18922,7 @@ yynewstate: RepeatableSeed: repSeed, } } - case 1650: + case 1648: { var repSeed ast.ExprNode if yyS[yypt-0].expr != nil { @@ -18918,43 +18933,43 @@ yynewstate: RepeatableSeed: repSeed, } } - case 1651: + case 1649: { parser.yyVAL.item = ast.SampleMethodTypeNone } - case 1652: + case 1650: { parser.yyVAL.item = ast.SampleMethodTypeSystem } - case 1653: + case 1651: { parser.yyVAL.item = ast.SampleMethodTypeBernoulli } - case 1654: + case 1652: { parser.yyVAL.item = ast.SampleMethodTypeTiDBRegion } - case 1655: + case 1653: { parser.yyVAL.item = ast.SampleClauseUnitTypeDefault } - case 1656: + case 1654: { parser.yyVAL.item = ast.SampleClauseUnitTypeRow } - case 1657: + case 1655: { parser.yyVAL.item = ast.SampleClauseUnitTypePercent } - case 1658: + case 1656: { parser.yyVAL.expr = nil } - case 1659: + case 1657: { parser.yyVAL.expr = yyS[yypt-1].expr } - case 1660: + case 1658: { st := yyS[yypt-6].item.(*ast.SelectStmt) if yyS[yypt-1].item != nil { @@ -18977,7 +18992,7 @@ yynewstate: } parser.yyVAL.statement = st } - case 1661: + case 1659: { st := yyS[yypt-5].item.(*ast.SelectStmt) if yyS[yypt-4].item != nil { @@ -18997,7 +19012,7 @@ yynewstate: } parser.yyVAL.statement = st } - case 1662: + case 1660: { st := yyS[yypt-4].item.(*ast.SelectStmt) if yyS[yypt-1].item != nil { @@ -19014,7 +19029,7 @@ yynewstate: } parser.yyVAL.statement = st } - case 1663: + case 1661: { st := &ast.SelectStmt{ Kind: ast.SelectStmtKindTable, @@ -19036,7 +19051,7 @@ yynewstate: } parser.yyVAL.statement = st } - case 1664: + case 1662: { st := &ast.SelectStmt{ Kind: ast.SelectStmtKindValues, @@ -19057,13 +19072,13 @@ yynewstate: } parser.yyVAL.statement = st } - case 1665: + case 1663: { sel := yyS[yypt-0].statement.(*ast.SelectStmt) sel.With = yyS[yypt-1].item.(*ast.WithClause) parser.yyVAL.statement = sel } - case 1666: + case 1664: { var sel ast.StmtNode switch x := yyS[yypt-0].expr.(*ast.SubqueryExpr).Query.(type) { @@ -19079,11 +19094,11 @@ yynewstate: } parser.yyVAL.statement = sel } - case 1667: + case 1665: { parser.yyVAL.item = yyS[yypt-0].item } - case 1668: + case 1666: { ws := yyS[yypt-0].item.(*ast.WithClause) ws.IsRecursive = true @@ -19092,20 +19107,20 @@ yynewstate: } parser.yyVAL.item = ws } - case 1669: + case 1667: { ws := yyS[yypt-2].item.(*ast.WithClause) ws.CTEs = append(ws.CTEs, yyS[yypt-0].item.(*ast.CommonTableExpression)) parser.yyVAL.item = ws } - case 1670: + case 1668: { ws := &ast.WithClause{} ws.CTEs = make([]*ast.CommonTableExpression, 0, 4) ws.CTEs = append(ws.CTEs, yyS[yypt-0].item.(*ast.CommonTableExpression)) parser.yyVAL.item = ws } - case 1671: + case 1669: { cte := &ast.CommonTableExpression{} cte.Name = model.NewCIStr(yyS[yypt-3].ident) @@ -19113,37 +19128,37 @@ yynewstate: cte.Query = yyS[yypt-0].expr.(*ast.SubqueryExpr) parser.yyVAL.item = cte } - case 1673: + case 1671: { parser.yyVAL.item = nil } - case 1674: + case 1672: { parser.yyVAL.item = yyS[yypt-0].item.([]ast.WindowSpec) } - case 1675: + case 1673: { parser.yyVAL.item = []ast.WindowSpec{yyS[yypt-0].item.(ast.WindowSpec)} } - case 1676: + case 1674: { parser.yyVAL.item = append(yyS[yypt-2].item.([]ast.WindowSpec), yyS[yypt-0].item.(ast.WindowSpec)) } - case 1677: + case 1675: { var spec = yyS[yypt-0].item.(ast.WindowSpec) spec.Name = yyS[yypt-2].item.(model.CIStr) parser.yyVAL.item = spec } - case 1678: + case 1676: { parser.yyVAL.item = model.NewCIStr(yyS[yypt-0].ident) } - case 1679: + case 1677: { parser.yyVAL.item = yyS[yypt-1].item.(ast.WindowSpec) } - case 1680: + case 1678: { spec := ast.WindowSpec{Ref: yyS[yypt-3].item.(model.CIStr)} if yyS[yypt-2].item != nil { @@ -19157,138 +19172,138 @@ yynewstate: } parser.yyVAL.item = spec } - case 1681: + case 1679: { parser.yyVAL.item = model.CIStr{} } - case 1683: + case 1681: { parser.yyVAL.item = nil } - case 1684: + case 1682: { parser.yyVAL.item = &ast.PartitionByClause{Items: yyS[yypt-0].item.([]*ast.ByItem)} } - case 1685: + case 1683: { parser.yyVAL.item = nil } - case 1686: + case 1684: { parser.yyVAL.item = &ast.OrderByClause{Items: yyS[yypt-0].item.([]*ast.ByItem)} } - case 1687: + case 1685: { parser.yyVAL.item = nil } - case 1688: + case 1686: { parser.yyVAL.item = &ast.FrameClause{ Type: yyS[yypt-1].item.(ast.FrameType), Extent: yyS[yypt-0].item.(ast.FrameExtent), } } - case 1689: + case 1687: { parser.yyVAL.item = ast.FrameType(ast.Rows) } - case 1690: + case 1688: { parser.yyVAL.item = ast.FrameType(ast.Ranges) } - case 1691: + case 1689: { parser.yyVAL.item = ast.FrameType(ast.Groups) } - case 1692: + case 1690: { parser.yyVAL.item = ast.FrameExtent{ Start: yyS[yypt-0].item.(ast.FrameBound), End: ast.FrameBound{Type: ast.CurrentRow}, } } - case 1694: + case 1692: { parser.yyVAL.item = ast.FrameBound{Type: ast.Preceding, UnBounded: true} } - case 1695: + case 1693: { parser.yyVAL.item = ast.FrameBound{Type: ast.Preceding, Expr: ast.NewValueExpr(yyS[yypt-1].item, parser.charset, parser.collation)} } - case 1696: + case 1694: { parser.yyVAL.item = ast.FrameBound{Type: ast.Preceding, Expr: ast.NewParamMarkerExpr(yyS[yypt].offset)} } - case 1697: + case 1695: { parser.yyVAL.item = ast.FrameBound{Type: ast.Preceding, Expr: yyS[yypt-2].expr, Unit: yyS[yypt-1].item.(ast.TimeUnitType)} } - case 1698: + case 1696: { parser.yyVAL.item = ast.FrameBound{Type: ast.CurrentRow} } - case 1699: + case 1697: { parser.yyVAL.item = ast.FrameExtent{Start: yyS[yypt-2].item.(ast.FrameBound), End: yyS[yypt-0].item.(ast.FrameBound)} } - case 1701: + case 1699: { parser.yyVAL.item = ast.FrameBound{Type: ast.Following, UnBounded: true} } - case 1702: + case 1700: { parser.yyVAL.item = ast.FrameBound{Type: ast.Following, Expr: ast.NewValueExpr(yyS[yypt-1].item, parser.charset, parser.collation)} } - case 1703: + case 1701: { parser.yyVAL.item = ast.FrameBound{Type: ast.Following, Expr: ast.NewParamMarkerExpr(yyS[yypt].offset)} } - case 1704: + case 1702: { parser.yyVAL.item = ast.FrameBound{Type: ast.Following, Expr: yyS[yypt-2].expr, Unit: yyS[yypt-1].item.(ast.TimeUnitType)} } - case 1705: + case 1703: { parser.yyVAL.item = nil } - case 1706: + case 1704: { spec := yyS[yypt-0].item.(ast.WindowSpec) parser.yyVAL.item = &spec } - case 1707: + case 1705: { parser.yyVAL.item = yyS[yypt-0].item.(ast.WindowSpec) } - case 1708: + case 1706: { parser.yyVAL.item = ast.WindowSpec{Name: yyS[yypt-0].item.(model.CIStr), OnlyAlias: true} } - case 1710: + case 1708: { parser.yyVAL.expr = &ast.WindowFuncExpr{Name: yyS[yypt-3].ident, Spec: yyS[yypt-0].item.(ast.WindowSpec)} } - case 1711: + case 1709: { parser.yyVAL.expr = &ast.WindowFuncExpr{Name: yyS[yypt-3].ident, Spec: yyS[yypt-0].item.(ast.WindowSpec)} } - case 1712: + case 1710: { parser.yyVAL.expr = &ast.WindowFuncExpr{Name: yyS[yypt-3].ident, Spec: yyS[yypt-0].item.(ast.WindowSpec)} } - case 1713: + case 1711: { parser.yyVAL.expr = &ast.WindowFuncExpr{Name: yyS[yypt-3].ident, Spec: yyS[yypt-0].item.(ast.WindowSpec)} } - case 1714: + case 1712: { parser.yyVAL.expr = &ast.WindowFuncExpr{Name: yyS[yypt-3].ident, Spec: yyS[yypt-0].item.(ast.WindowSpec)} } - case 1715: + case 1713: { parser.yyVAL.expr = &ast.WindowFuncExpr{Name: yyS[yypt-4].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Spec: yyS[yypt-0].item.(ast.WindowSpec)} } - case 1716: + case 1714: { args := []ast.ExprNode{yyS[yypt-4].expr} if yyS[yypt-3].item != nil { @@ -19296,7 +19311,7 @@ yynewstate: } parser.yyVAL.expr = &ast.WindowFuncExpr{Name: yyS[yypt-6].ident, Args: args, IgnoreNull: yyS[yypt-1].item.(bool), Spec: yyS[yypt-0].item.(ast.WindowSpec)} } - case 1717: + case 1715: { args := []ast.ExprNode{yyS[yypt-4].expr} if yyS[yypt-3].item != nil { @@ -19304,23 +19319,23 @@ yynewstate: } parser.yyVAL.expr = &ast.WindowFuncExpr{Name: yyS[yypt-6].ident, Args: args, IgnoreNull: yyS[yypt-1].item.(bool), Spec: yyS[yypt-0].item.(ast.WindowSpec)} } - case 1718: + case 1716: { parser.yyVAL.expr = &ast.WindowFuncExpr{Name: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-3].expr}, IgnoreNull: yyS[yypt-1].item.(bool), Spec: yyS[yypt-0].item.(ast.WindowSpec)} } - case 1719: + case 1717: { parser.yyVAL.expr = &ast.WindowFuncExpr{Name: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-3].expr}, IgnoreNull: yyS[yypt-1].item.(bool), Spec: yyS[yypt-0].item.(ast.WindowSpec)} } - case 1720: + case 1718: { parser.yyVAL.expr = &ast.WindowFuncExpr{Name: yyS[yypt-8].ident, Args: []ast.ExprNode{yyS[yypt-6].expr, yyS[yypt-4].expr}, FromLast: yyS[yypt-2].item.(bool), IgnoreNull: yyS[yypt-1].item.(bool), Spec: yyS[yypt-0].item.(ast.WindowSpec)} } - case 1721: + case 1719: { parser.yyVAL.item = nil } - case 1722: + case 1720: { args := []ast.ExprNode{ast.NewValueExpr(yyS[yypt-1].item, parser.charset, parser.collation)} if yyS[yypt-0].item != nil { @@ -19328,7 +19343,7 @@ yynewstate: } parser.yyVAL.item = args } - case 1723: + case 1721: { args := []ast.ExprNode{ast.NewParamMarkerExpr(yyS[yypt-1].offset)} if yyS[yypt-0].item != nil { @@ -19336,43 +19351,43 @@ yynewstate: } parser.yyVAL.item = args } - case 1724: + case 1722: { parser.yyVAL.item = nil } - case 1725: + case 1723: { parser.yyVAL.item = yyS[yypt-0].expr } - case 1726: + case 1724: { parser.yyVAL.item = false } - case 1727: + case 1725: { parser.yyVAL.item = false } - case 1728: + case 1726: { parser.yyVAL.item = true } - case 1729: + case 1727: { parser.yyVAL.item = false } - case 1730: + case 1728: { parser.yyVAL.item = false } - case 1731: + case 1729: { parser.yyVAL.item = true } - case 1732: + case 1730: { parser.yyVAL.item = &ast.TableRefsClause{TableRefs: yyS[yypt-0].item.(*ast.Join)} } - case 1733: + case 1731: { if j, ok := yyS[yypt-0].item.(*ast.Join); ok { // if $1 is Join, use it directly @@ -19381,12 +19396,12 @@ yynewstate: parser.yyVAL.item = &ast.Join{Left: yyS[yypt-0].item.(ast.ResultSetNode), Right: nil} } } - case 1734: + case 1732: { /* from a, b is default cross join */ parser.yyVAL.item = &ast.Join{Left: yyS[yypt-2].item.(ast.ResultSetNode), Right: yyS[yypt-0].item.(ast.ResultSetNode), Tp: ast.CrossJoin} } - case 1736: + case 1734: { /* * ODBC escape syntax for outer join is { OJ join_table } @@ -19394,7 +19409,7 @@ yynewstate: */ parser.yyVAL.item = yyS[yypt-1].item } - case 1739: + case 1737: { tn := yyS[yypt-5].item.(*ast.TableName) tn.PartitionNames = yyS[yypt-4].item.([]model.CIStr) @@ -19407,66 +19422,66 @@ yynewstate: } parser.yyVAL.item = &ast.TableSource{Source: tn, AsName: yyS[yypt-3].item.(model.CIStr)} } - case 1740: + case 1738: { resultNode := yyS[yypt-1].expr.(*ast.SubqueryExpr).Query parser.yyVAL.item = &ast.TableSource{Source: resultNode, AsName: yyS[yypt-0].item.(model.CIStr)} } - case 1741: + case 1739: { j := yyS[yypt-1].item.(*ast.Join) j.ExplicitParens = true parser.yyVAL.item = yyS[yypt-1].item } - case 1742: + case 1740: { parser.yyVAL.item = []model.CIStr{} } - case 1743: + case 1741: { parser.yyVAL.item = yyS[yypt-1].item } - case 1744: + case 1742: { parser.yyVAL.item = model.CIStr{} } - case 1746: + case 1744: { parser.yyVAL.item = model.NewCIStr(yyS[yypt-0].ident) } - case 1747: + case 1745: { parser.yyVAL.item = model.NewCIStr(yyS[yypt-0].ident) } - case 1748: + case 1746: { parser.yyVAL.item = ast.HintUse } - case 1749: + case 1747: { parser.yyVAL.item = ast.HintIgnore } - case 1750: + case 1748: { parser.yyVAL.item = ast.HintForce } - case 1751: + case 1749: { parser.yyVAL.item = ast.HintForScan } - case 1752: + case 1750: { parser.yyVAL.item = ast.HintForJoin } - case 1753: + case 1751: { parser.yyVAL.item = ast.HintForOrderBy } - case 1754: + case 1752: { parser.yyVAL.item = ast.HintForGroupBy } - case 1755: + case 1753: { parser.yyVAL.item = &ast.IndexHint{ IndexNames: yyS[yypt-1].item.([]model.CIStr), @@ -19474,134 +19489,134 @@ yynewstate: HintScope: yyS[yypt-3].item.(ast.IndexHintScope), } } - case 1756: + case 1754: { var nameList []model.CIStr parser.yyVAL.item = nameList } - case 1757: + case 1755: { parser.yyVAL.item = []model.CIStr{model.NewCIStr(yyS[yypt-0].ident)} } - case 1758: + case 1756: { parser.yyVAL.item = append(yyS[yypt-2].item.([]model.CIStr), model.NewCIStr(yyS[yypt-0].ident)) } - case 1759: + case 1757: { parser.yyVAL.item = []model.CIStr{model.NewCIStr(yyS[yypt-0].ident)} } - case 1760: + case 1758: { parser.yyVAL.item = append(yyS[yypt-2].item.([]model.CIStr), model.NewCIStr(yyS[yypt-0].ident)) } - case 1761: + case 1759: { parser.yyVAL.item = []*ast.IndexHint{yyS[yypt-0].item.(*ast.IndexHint)} } - case 1762: + case 1760: { parser.yyVAL.item = append(yyS[yypt-1].item.([]*ast.IndexHint), yyS[yypt-0].item.(*ast.IndexHint)) } - case 1763: + case 1761: { parser.yyVAL.item = []*ast.IndexHint{} } - case 1765: + case 1763: { parser.yyVAL.item = ast.NewCrossJoin(yyS[yypt-2].item.(ast.ResultSetNode), yyS[yypt-0].item.(ast.ResultSetNode)) } - case 1766: + case 1764: { on := &ast.OnCondition{Expr: yyS[yypt-0].expr} parser.yyVAL.item = &ast.Join{Left: yyS[yypt-4].item.(ast.ResultSetNode), Right: yyS[yypt-2].item.(ast.ResultSetNode), Tp: ast.CrossJoin, On: on} } - case 1767: + case 1765: { parser.yyVAL.item = &ast.Join{Left: yyS[yypt-6].item.(ast.ResultSetNode), Right: yyS[yypt-4].item.(ast.ResultSetNode), Tp: ast.CrossJoin, Using: yyS[yypt-1].item.([]*ast.ColumnName)} } - case 1768: + case 1766: { on := &ast.OnCondition{Expr: yyS[yypt-0].expr} parser.yyVAL.item = &ast.Join{Left: yyS[yypt-6].item.(ast.ResultSetNode), Right: yyS[yypt-2].item.(ast.ResultSetNode), Tp: yyS[yypt-5].item.(ast.JoinType), On: on} } - case 1769: + case 1767: { parser.yyVAL.item = &ast.Join{Left: yyS[yypt-8].item.(ast.ResultSetNode), Right: yyS[yypt-4].item.(ast.ResultSetNode), Tp: yyS[yypt-7].item.(ast.JoinType), Using: yyS[yypt-1].item.([]*ast.ColumnName)} } - case 1770: + case 1768: { parser.yyVAL.item = &ast.Join{Left: yyS[yypt-3].item.(ast.ResultSetNode), Right: yyS[yypt-0].item.(ast.ResultSetNode), NaturalJoin: true} } - case 1771: + case 1769: { parser.yyVAL.item = &ast.Join{Left: yyS[yypt-5].item.(ast.ResultSetNode), Right: yyS[yypt-0].item.(ast.ResultSetNode), Tp: yyS[yypt-3].item.(ast.JoinType), NaturalJoin: true} } - case 1772: + case 1770: { parser.yyVAL.item = &ast.Join{Left: yyS[yypt-2].item.(ast.ResultSetNode), Right: yyS[yypt-0].item.(ast.ResultSetNode), StraightJoin: true} } - case 1773: + case 1771: { on := &ast.OnCondition{Expr: yyS[yypt-0].expr} parser.yyVAL.item = &ast.Join{Left: yyS[yypt-4].item.(ast.ResultSetNode), Right: yyS[yypt-2].item.(ast.ResultSetNode), StraightJoin: true, On: on} } - case 1774: + case 1772: { parser.yyVAL.item = ast.LeftJoin } - case 1775: + case 1773: { parser.yyVAL.item = ast.RightJoin } - case 1781: + case 1779: { parser.yyVAL.item = nil } - case 1782: + case 1780: { parser.yyVAL.item = &ast.Limit{Count: yyS[yypt-0].item.(ast.ValueExpr)} } - case 1783: + case 1781: { parser.yyVAL.item = ast.NewValueExpr(yyS[yypt-0].item, parser.charset, parser.collation) } - case 1784: + case 1782: { parser.yyVAL.item = ast.NewParamMarkerExpr(yyS[yypt].offset) } - case 1789: + case 1787: { parser.yyVAL.item = ast.NewValueExpr(uint64(1), parser.charset, parser.collation) } - case 1791: + case 1789: { parser.yyVAL.item = &ast.Limit{Count: yyS[yypt-0].item.(ast.ExprNode)} } - case 1792: + case 1790: { parser.yyVAL.item = &ast.Limit{Offset: yyS[yypt-2].item.(ast.ExprNode), Count: yyS[yypt-0].item.(ast.ExprNode)} } - case 1793: + case 1791: { parser.yyVAL.item = &ast.Limit{Offset: yyS[yypt-0].item.(ast.ExprNode), Count: yyS[yypt-2].item.(ast.ExprNode)} } - case 1794: + case 1792: { parser.yyVAL.item = &ast.Limit{Count: yyS[yypt-2].item.(ast.ExprNode)} } - case 1795: + case 1793: { parser.yyVAL.item = nil } - case 1797: + case 1795: { opt := &ast.SelectStmtOpts{} opt.SQLCache = true opt.TableHints = yyS[yypt-0].item.([]*ast.TableOptimizerHint) parser.yyVAL.item = opt } - case 1798: + case 1796: { opt := &ast.SelectStmtOpts{} opt.SQLCache = true @@ -19613,61 +19628,61 @@ yynewstate: } parser.yyVAL.item = opt } - case 1799: + case 1797: { opt := &ast.SelectStmtOpts{} opt.SQLCache = true opt.Priority = yyS[yypt-0].item.(mysql.PriorityEnum) parser.yyVAL.item = opt } - case 1800: + case 1798: { opt := &ast.SelectStmtOpts{} opt.SQLCache = true opt.SQLSmallResult = true parser.yyVAL.item = opt } - case 1801: + case 1799: { opt := &ast.SelectStmtOpts{} opt.SQLCache = true opt.SQLBigResult = true parser.yyVAL.item = opt } - case 1802: + case 1800: { opt := &ast.SelectStmtOpts{} opt.SQLCache = true opt.SQLBufferResult = true parser.yyVAL.item = opt } - case 1803: + case 1801: { opt := &ast.SelectStmtOpts{} opt.SQLCache = yyS[yypt-0].item.(bool) parser.yyVAL.item = opt } - case 1804: + case 1802: { opt := &ast.SelectStmtOpts{} opt.SQLCache = true opt.CalcFoundRows = true parser.yyVAL.item = opt } - case 1805: + case 1803: { opt := &ast.SelectStmtOpts{} opt.SQLCache = true opt.StraightJoin = true parser.yyVAL.item = opt } - case 1806: + case 1804: { opt := &ast.SelectStmtOpts{} opt.SQLCache = true parser.yyVAL.item = opt } - case 1808: + case 1806: { opts := yyS[yypt-1].item.(*ast.SelectStmtOpts) opt := yyS[yypt-0].item.(*ast.SelectStmtOpts) @@ -19712,7 +19727,7 @@ yynewstate: parser.yyVAL.item = opts } - case 1810: + case 1808: { hints, warns := parser.parseHint(yyS[yypt-0].ident) for _, w := range warns { @@ -19721,31 +19736,31 @@ yynewstate: } parser.yyVAL.item = hints } - case 1811: + case 1809: { parser.yyVAL.item = nil } - case 1813: + case 1811: { parser.yyVAL.item = true } - case 1814: + case 1812: { parser.yyVAL.item = false } - case 1815: + case 1813: { parser.yyVAL.item = &ast.FieldList{Fields: yyS[yypt-0].item.([]*ast.SelectField)} } - case 1816: + case 1814: { parser.yyVAL.item = nil } - case 1818: + case 1816: { parser.yyVAL.item = nil } - case 1819: + case 1817: { x := &ast.SelectIntoOption{ Tp: ast.SelectIntoOutfile, @@ -19760,7 +19775,7 @@ yynewstate: parser.yyVAL.item = x } - case 1820: + case 1818: { rs := yyS[yypt-1].statement.(*ast.SelectStmt) endOffset := parser.endOffset(&yyS[yypt]) @@ -19770,14 +19785,14 @@ yynewstate: rs.SetText(parser.lexer.client, src[yyS[yypt-1].offset:yyS[yypt].offset]) parser.yyVAL.expr = &ast.SubqueryExpr{Query: rs} } - case 1821: + case 1819: { rs := yyS[yypt-1].statement.(*ast.SetOprStmt) src := parser.src rs.SetText(parser.lexer.client, src[yyS[yypt-1].offset:yyS[yypt].offset]) parser.yyVAL.expr = &ast.SubqueryExpr{Query: rs} } - case 1822: + case 1820: { switch rs := yyS[yypt-1].statement.(type) { case *ast.SelectStmt: @@ -19793,7 +19808,7 @@ yynewstate: parser.yyVAL.expr = &ast.SubqueryExpr{Query: rs} } } - case 1823: + case 1821: { subQuery := yyS[yypt-1].expr.(*ast.SubqueryExpr).Query isRecursive := true @@ -19816,32 +19831,32 @@ yynewstate: parser.yyVAL.expr = &ast.SubqueryExpr{Query: rs} } } - case 1824: + case 1822: { parser.yyVAL.item = nil } - case 1825: + case 1823: { parser.yyVAL.item = &ast.SelectLockInfo{ LockType: ast.SelectLockForUpdate, Tables: yyS[yypt-0].item.([]*ast.TableName), } } - case 1826: + case 1824: { parser.yyVAL.item = &ast.SelectLockInfo{ LockType: ast.SelectLockForShare, Tables: yyS[yypt-0].item.([]*ast.TableName), } } - case 1827: + case 1825: { parser.yyVAL.item = &ast.SelectLockInfo{ LockType: ast.SelectLockForUpdateNoWait, Tables: yyS[yypt-1].item.([]*ast.TableName), } } - case 1828: + case 1826: { parser.yyVAL.item = &ast.SelectLockInfo{ LockType: ast.SelectLockForUpdateWaitN, @@ -19849,55 +19864,55 @@ yynewstate: Tables: yyS[yypt-2].item.([]*ast.TableName), } } - case 1829: + case 1827: { parser.yyVAL.item = &ast.SelectLockInfo{ LockType: ast.SelectLockForShareNoWait, Tables: yyS[yypt-1].item.([]*ast.TableName), } } - case 1830: + case 1828: { parser.yyVAL.item = &ast.SelectLockInfo{ LockType: ast.SelectLockForUpdateSkipLocked, Tables: yyS[yypt-2].item.([]*ast.TableName), } } - case 1831: + case 1829: { parser.yyVAL.item = &ast.SelectLockInfo{ LockType: ast.SelectLockForShareSkipLocked, Tables: yyS[yypt-2].item.([]*ast.TableName), } } - case 1832: + case 1830: { parser.yyVAL.item = &ast.SelectLockInfo{ LockType: ast.SelectLockForShare, Tables: []*ast.TableName{}, } } - case 1833: + case 1831: { parser.yyVAL.item = []*ast.TableName{} } - case 1834: + case 1832: { parser.yyVAL.item = yyS[yypt-0].item.([]*ast.TableName) } - case 1837: + case 1835: { setOpr := yyS[yypt-0].statement.(*ast.SetOprStmt) setOpr.With = yyS[yypt-1].item.(*ast.WithClause) parser.yyVAL.statement = setOpr } - case 1838: + case 1836: { setOpr := yyS[yypt-0].statement.(*ast.SetOprStmt) setOpr.With = yyS[yypt-1].item.(*ast.WithClause) parser.yyVAL.statement = setOpr } - case 1839: + case 1837: { setOprList1 := yyS[yypt-2].item.([]ast.Node) if sel, isSelect := setOprList1[len(setOprList1)-1].(*ast.SelectStmt); isSelect && !sel.IsInBraces { @@ -19914,7 +19929,7 @@ yynewstate: setOpr.SelectList.Selects = append(setOpr.SelectList.Selects, st) parser.yyVAL.statement = setOpr } - case 1840: + case 1838: { setOprList1 := yyS[yypt-2].item.([]ast.Node) if sel, isSelect := setOprList1[len(setOprList1)-1].(*ast.SelectStmt); isSelect && !sel.IsInBraces { @@ -19923,21 +19938,27 @@ yynewstate: } var setOprList2 []ast.Node var with2 *ast.WithClause + var limit2 *ast.Limit + var orderBy2 *ast.OrderByClause switch x := yyS[yypt-0].expr.(*ast.SubqueryExpr).Query.(type) { case *ast.SelectStmt: setOprList2 = []ast.Node{x} with2 = x.With case *ast.SetOprStmt: + // child setOprStmt's limit and order should also make sense + // we should separate it out from other normal SetOprSelectList. setOprList2 = x.SelectList.Selects with2 = x.With + limit2 = x.Limit + orderBy2 = x.OrderBy } - nextSetOprList := &ast.SetOprSelectList{Selects: setOprList2, With: with2} + nextSetOprList := &ast.SetOprSelectList{Selects: setOprList2, With: with2, Limit: limit2, OrderBy: orderBy2} nextSetOprList.AfterSetOperator = yyS[yypt-1].item.(*ast.SetOprType) setOprList := append(setOprList1, nextSetOprList) setOpr := &ast.SetOprStmt{SelectList: &ast.SetOprSelectList{Selects: setOprList}} parser.yyVAL.statement = setOpr } - case 1841: + case 1839: { setOprList1 := yyS[yypt-3].item.([]ast.Node) if sel, isSelect := setOprList1[len(setOprList1)-1].(*ast.SelectStmt); isSelect && !sel.IsInBraces { @@ -19946,6 +19967,8 @@ yynewstate: } var setOprList2 []ast.Node var with2 *ast.WithClause + var limit2 *ast.Limit + var orderBy2 *ast.OrderByClause switch x := yyS[yypt-1].expr.(*ast.SubqueryExpr).Query.(type) { case *ast.SelectStmt: setOprList2 = []ast.Node{x} @@ -19953,15 +19976,17 @@ yynewstate: case *ast.SetOprStmt: setOprList2 = x.SelectList.Selects with2 = x.With + limit2 = x.Limit + orderBy2 = x.OrderBy } - nextSetOprList := &ast.SetOprSelectList{Selects: setOprList2, With: with2} + nextSetOprList := &ast.SetOprSelectList{Selects: setOprList2, With: with2, Limit: limit2, OrderBy: orderBy2} nextSetOprList.AfterSetOperator = yyS[yypt-2].item.(*ast.SetOprType) setOprList := append(setOprList1, nextSetOprList) setOpr := &ast.SetOprStmt{SelectList: &ast.SetOprSelectList{Selects: setOprList}} setOpr.OrderBy = yyS[yypt-0].item.(*ast.OrderByClause) parser.yyVAL.statement = setOpr } - case 1842: + case 1840: { setOprList1 := yyS[yypt-3].item.([]ast.Node) if sel, isSelect := setOprList1[len(setOprList1)-1].(*ast.SelectStmt); isSelect && !sel.IsInBraces { @@ -19970,6 +19995,8 @@ yynewstate: } var setOprList2 []ast.Node var with2 *ast.WithClause + var limit2 *ast.Limit + var orderBy2 *ast.OrderByClause switch x := yyS[yypt-1].expr.(*ast.SubqueryExpr).Query.(type) { case *ast.SelectStmt: setOprList2 = []ast.Node{x} @@ -19977,15 +20004,17 @@ yynewstate: case *ast.SetOprStmt: setOprList2 = x.SelectList.Selects with2 = x.With + limit2 = x.Limit + orderBy2 = x.OrderBy } - nextSetOprList := &ast.SetOprSelectList{Selects: setOprList2, With: with2} + nextSetOprList := &ast.SetOprSelectList{Selects: setOprList2, With: with2, Limit: limit2, OrderBy: orderBy2} nextSetOprList.AfterSetOperator = yyS[yypt-2].item.(*ast.SetOprType) setOprList := append(setOprList1, nextSetOprList) setOpr := &ast.SetOprStmt{SelectList: &ast.SetOprSelectList{Selects: setOprList}} setOpr.Limit = yyS[yypt-0].item.(*ast.Limit) parser.yyVAL.statement = setOpr } - case 1843: + case 1841: { setOprList1 := yyS[yypt-4].item.([]ast.Node) if sel, isSelect := setOprList1[len(setOprList1)-1].(*ast.SelectStmt); isSelect && !sel.IsInBraces { @@ -19994,6 +20023,8 @@ yynewstate: } var setOprList2 []ast.Node var with2 *ast.WithClause + var limit2 *ast.Limit + var orderBy2 *ast.OrderByClause switch x := yyS[yypt-2].expr.(*ast.SubqueryExpr).Query.(type) { case *ast.SelectStmt: setOprList2 = []ast.Node{x} @@ -20001,8 +20032,10 @@ yynewstate: case *ast.SetOprStmt: setOprList2 = x.SelectList.Selects with2 = x.With + limit2 = x.Limit + orderBy2 = x.OrderBy } - nextSetOprList := &ast.SetOprSelectList{Selects: setOprList2, With: with2} + nextSetOprList := &ast.SetOprSelectList{Selects: setOprList2, With: with2, Limit: limit2, OrderBy: orderBy2} nextSetOprList.AfterSetOperator = yyS[yypt-3].item.(*ast.SetOprType) setOprList := append(setOprList1, nextSetOprList) setOpr := &ast.SetOprStmt{SelectList: &ast.SetOprSelectList{Selects: setOprList}} @@ -20010,56 +20043,47 @@ yynewstate: setOpr.Limit = yyS[yypt-0].item.(*ast.Limit) parser.yyVAL.statement = setOpr } - case 1844: + case 1842: { var setOprList []ast.Node - var with *ast.WithClause switch x := yyS[yypt-1].expr.(*ast.SubqueryExpr).Query.(type) { case *ast.SelectStmt: - setOprList = []ast.Node{x} - with = x.With + setOprList = []ast.Node{&ast.SetOprSelectList{Selects: []ast.Node{x}, With: x.With}} case *ast.SetOprStmt: - setOprList = x.SelectList.Selects - with = x.With + setOprList = []ast.Node{&ast.SetOprSelectList{Selects: x.SelectList.Selects, With: x.With, Limit: x.Limit, OrderBy: x.OrderBy}} } - setOpr := &ast.SetOprStmt{SelectList: &ast.SetOprSelectList{Selects: setOprList}, With: with} + setOpr := &ast.SetOprStmt{SelectList: &ast.SetOprSelectList{Selects: setOprList}} setOpr.OrderBy = yyS[yypt-0].item.(*ast.OrderByClause) parser.yyVAL.statement = setOpr } - case 1845: + case 1843: { var setOprList []ast.Node - var with *ast.WithClause switch x := yyS[yypt-1].expr.(*ast.SubqueryExpr).Query.(type) { case *ast.SelectStmt: - setOprList = []ast.Node{x} - with = x.With + setOprList = []ast.Node{&ast.SetOprSelectList{Selects: []ast.Node{x}, With: x.With}} case *ast.SetOprStmt: - setOprList = x.SelectList.Selects - with = x.With + setOprList = []ast.Node{&ast.SetOprSelectList{Selects: x.SelectList.Selects, With: x.With, Limit: x.Limit, OrderBy: x.OrderBy}} } - setOpr := &ast.SetOprStmt{SelectList: &ast.SetOprSelectList{Selects: setOprList}, With: with} + setOpr := &ast.SetOprStmt{SelectList: &ast.SetOprSelectList{Selects: setOprList}} setOpr.Limit = yyS[yypt-0].item.(*ast.Limit) parser.yyVAL.statement = setOpr } - case 1846: + case 1844: { var setOprList []ast.Node - var with *ast.WithClause switch x := yyS[yypt-2].expr.(*ast.SubqueryExpr).Query.(type) { case *ast.SelectStmt: - setOprList = []ast.Node{x} - with = x.With + setOprList = []ast.Node{&ast.SetOprSelectList{Selects: []ast.Node{x}, With: x.With}} case *ast.SetOprStmt: - setOprList = x.SelectList.Selects - with = x.With + setOprList = []ast.Node{&ast.SetOprSelectList{Selects: x.SelectList.Selects, With: x.With, Limit: x.Limit, OrderBy: x.OrderBy}} } - setOpr := &ast.SetOprStmt{SelectList: &ast.SetOprSelectList{Selects: setOprList}, With: with} + setOpr := &ast.SetOprStmt{SelectList: &ast.SetOprSelectList{Selects: setOprList}} setOpr.OrderBy = yyS[yypt-1].item.(*ast.OrderByClause) setOpr.Limit = yyS[yypt-0].item.(*ast.Limit) parser.yyVAL.statement = setOpr } - case 1848: + case 1846: { setOprList1 := yyS[yypt-2].item.([]ast.Node) setOprList2 := yyS[yypt-0].item.([]ast.Node) @@ -20075,22 +20099,22 @@ yynewstate: } parser.yyVAL.item = append(setOprList1, setOprList2...) } - case 1849: + case 1847: { parser.yyVAL.item = []ast.Node{yyS[yypt-0].statement.(*ast.SelectStmt)} } - case 1850: + case 1848: { var setOprList []ast.Node switch x := yyS[yypt-0].expr.(*ast.SubqueryExpr).Query.(type) { case *ast.SelectStmt: setOprList = []ast.Node{&ast.SetOprSelectList{Selects: []ast.Node{x}}} case *ast.SetOprStmt: - setOprList = []ast.Node{&ast.SetOprSelectList{Selects: x.SelectList.Selects, With: x.With}} + setOprList = []ast.Node{&ast.SetOprSelectList{Selects: x.SelectList.Selects, With: x.With, Limit: x.Limit, OrderBy: x.OrderBy}} } parser.yyVAL.item = setOprList } - case 1851: + case 1849: { var tp ast.SetOprType tp = ast.Union @@ -20099,7 +20123,7 @@ yynewstate: } parser.yyVAL.item = &tp } - case 1852: + case 1850: { var tp ast.SetOprType tp = ast.Except @@ -20108,7 +20132,7 @@ yynewstate: } parser.yyVAL.item = &tp } - case 1853: + case 1851: { var tp ast.SetOprType tp = ast.Intersect @@ -20117,7 +20141,7 @@ yynewstate: } parser.yyVAL.item = &tp } - case 1855: + case 1853: { parser.yyVAL.statement = &ast.ChangeStmt{ NodeType: ast.PumpType, @@ -20125,7 +20149,7 @@ yynewstate: NodeID: yyS[yypt-0].ident, } } - case 1856: + case 1854: { parser.yyVAL.statement = &ast.ChangeStmt{ NodeType: ast.DrainerType, @@ -20133,19 +20157,19 @@ yynewstate: NodeID: yyS[yypt-0].ident, } } - case 1857: + case 1855: { parser.yyVAL.statement = &ast.SetStmt{Variables: yyS[yypt-0].item.([]*ast.VariableAssignment)} } - case 1858: + case 1856: { parser.yyVAL.statement = &ast.SetPwdStmt{Password: yyS[yypt-0].ident} } - case 1859: + case 1857: { parser.yyVAL.statement = &ast.SetPwdStmt{User: yyS[yypt-2].item.(*auth.UserIdentity), Password: yyS[yypt-0].ident} } - case 1860: + case 1858: { vars := yyS[yypt-0].item.([]*ast.VariableAssignment) for _, v := range vars { @@ -20153,11 +20177,11 @@ yynewstate: } parser.yyVAL.statement = &ast.SetStmt{Variables: vars} } - case 1861: + case 1859: { parser.yyVAL.statement = &ast.SetStmt{Variables: yyS[yypt-0].item.([]*ast.VariableAssignment)} } - case 1862: + case 1860: { assigns := yyS[yypt-0].item.([]*ast.VariableAssignment) for i := 0; i < len(assigns); i++ { @@ -20168,27 +20192,27 @@ yynewstate: } parser.yyVAL.statement = &ast.SetStmt{Variables: assigns} } - case 1863: + case 1861: { parser.yyVAL.statement = &ast.SetConfigStmt{Type: strings.ToLower(yyS[yypt-3].ident), Name: yyS[yypt-2].ident, Value: yyS[yypt-0].expr} } - case 1864: + case 1862: { parser.yyVAL.statement = &ast.SetConfigStmt{Instance: yyS[yypt-3].ident, Name: yyS[yypt-2].ident, Value: yyS[yypt-0].expr} } - case 1865: + case 1863: { parser.yyVAL.statement = &ast.SetSessionStatesStmt{SessionStates: yyS[yypt-0].ident} } - case 1866: + case 1864: { parser.yyVAL.statement = &ast.SetResourceGroupStmt{Name: model.NewCIStr(yyS[yypt-0].ident)} } - case 1867: + case 1865: { parser.yyVAL.statement = yyS[yypt-0].item.(*ast.SetRoleStmt) } - case 1868: + case 1866: { tmp := yyS[yypt-2].item.(*ast.SetRoleStmt) parser.yyVAL.statement = &ast.SetDefaultRoleStmt{ @@ -20197,27 +20221,27 @@ yynewstate: UserList: yyS[yypt-0].item.([]*auth.UserIdentity), } } - case 1869: + case 1867: { parser.yyVAL.item = &ast.SetRoleStmt{SetRoleOpt: ast.SetRoleNone, RoleList: nil} } - case 1870: + case 1868: { parser.yyVAL.item = &ast.SetRoleStmt{SetRoleOpt: ast.SetRoleAll, RoleList: nil} } - case 1871: + case 1869: { parser.yyVAL.item = &ast.SetRoleStmt{SetRoleOpt: ast.SetRoleRegular, RoleList: yyS[yypt-0].item.([]*auth.RoleIdentity)} } - case 1872: + case 1870: { parser.yyVAL.item = &ast.SetRoleStmt{SetRoleOpt: ast.SetRoleAllExcept, RoleList: yyS[yypt-0].item.([]*auth.RoleIdentity)} } - case 1874: + case 1872: { parser.yyVAL.item = &ast.SetRoleStmt{SetRoleOpt: ast.SetRoleDefault, RoleList: nil} } - case 1875: + case 1873: { if yyS[yypt-0].item != nil { parser.yyVAL.item = yyS[yypt-0].item @@ -20225,7 +20249,7 @@ yynewstate: parser.yyVAL.item = []*ast.VariableAssignment{} } } - case 1876: + case 1874: { if yyS[yypt-0].item != nil { varAssigns := yyS[yypt-0].item.([]*ast.VariableAssignment) @@ -20234,28 +20258,28 @@ yynewstate: parser.yyVAL.item = yyS[yypt-2].item } } - case 1877: + case 1875: { varAssigns := []*ast.VariableAssignment{} expr := ast.NewValueExpr(yyS[yypt-0].ident, parser.charset, parser.collation) varAssigns = append(varAssigns, &ast.VariableAssignment{Name: "tx_isolation", Value: expr, IsSystem: true}) parser.yyVAL.item = varAssigns } - case 1878: + case 1876: { varAssigns := []*ast.VariableAssignment{} expr := ast.NewValueExpr("0", parser.charset, parser.collation) varAssigns = append(varAssigns, &ast.VariableAssignment{Name: "tx_read_only", Value: expr, IsSystem: true}) parser.yyVAL.item = varAssigns } - case 1879: + case 1877: { varAssigns := []*ast.VariableAssignment{} expr := ast.NewValueExpr("1", parser.charset, parser.collation) varAssigns = append(varAssigns, &ast.VariableAssignment{Name: "tx_read_only", Value: expr, IsSystem: true}) parser.yyVAL.item = varAssigns } - case 1880: + case 1878: { varAssigns := []*ast.VariableAssignment{} asof := yyS[yypt-0].item.(*ast.AsOfClause) @@ -20264,59 +20288,59 @@ yynewstate: } parser.yyVAL.item = varAssigns } - case 1881: + case 1879: { parser.yyVAL.ident = ast.RepeatableRead } - case 1882: + case 1880: { parser.yyVAL.ident = ast.ReadCommitted } - case 1883: + case 1881: { parser.yyVAL.ident = ast.ReadUncommitted } - case 1884: + case 1882: { parser.yyVAL.ident = ast.Serializable } - case 1885: + case 1883: { parser.yyVAL.expr = ast.NewValueExpr("ON", parser.charset, parser.collation) } - case 1886: + case 1884: { parser.yyVAL.expr = ast.NewValueExpr("BINARY", parser.charset, parser.collation) } - case 1891: + case 1889: { parser.yyVAL.ident = yyS[yypt-2].ident + "." + yyS[yypt-0].ident } - case 1893: + case 1891: { parser.yyVAL.ident = yyS[yypt-2].ident + "." + yyS[yypt-0].ident } - case 1894: + case 1892: { parser.yyVAL.ident = yyS[yypt-2].ident + "-" + yyS[yypt-0].ident } - case 1895: + case 1893: { parser.yyVAL.item = &ast.VariableAssignment{Name: yyS[yypt-2].ident, Value: yyS[yypt-0].expr, IsSystem: true} } - case 1896: + case 1894: { parser.yyVAL.item = &ast.VariableAssignment{Name: yyS[yypt-2].ident, Value: yyS[yypt-0].expr, IsGlobal: true, IsSystem: true} } - case 1897: + case 1895: { parser.yyVAL.item = &ast.VariableAssignment{Name: yyS[yypt-2].ident, Value: yyS[yypt-0].expr, IsSystem: true} } - case 1898: + case 1896: { parser.yyVAL.item = &ast.VariableAssignment{Name: yyS[yypt-2].ident, Value: yyS[yypt-0].expr, IsSystem: true} } - case 1899: + case 1897: { v := strings.ToLower(yyS[yypt-2].ident) var isGlobal bool @@ -20332,27 +20356,27 @@ yynewstate: } parser.yyVAL.item = &ast.VariableAssignment{Name: v, Value: yyS[yypt-0].expr, IsGlobal: isGlobal, IsSystem: true} } - case 1900: + case 1898: { v := yyS[yypt-2].ident v = strings.TrimPrefix(v, "@") parser.yyVAL.item = &ast.VariableAssignment{Name: v, Value: yyS[yypt-0].expr} } - case 1901: + case 1899: { parser.yyVAL.item = &ast.VariableAssignment{ Name: ast.SetNames, Value: ast.NewValueExpr(yyS[yypt-0].ident, "", ""), } } - case 1902: + case 1900: { parser.yyVAL.item = &ast.VariableAssignment{ Name: ast.SetNames, Value: ast.NewValueExpr(yyS[yypt-2].ident, "", ""), } } - case 1903: + case 1901: { parser.yyVAL.item = &ast.VariableAssignment{ Name: ast.SetNames, @@ -20360,24 +20384,24 @@ yynewstate: ExtendValue: ast.NewValueExpr(yyS[yypt-0].ident, "", ""), } } - case 1904: + case 1902: { v := &ast.DefaultExpr{} parser.yyVAL.item = &ast.VariableAssignment{Name: ast.SetNames, Value: v} } - case 1905: + case 1903: { parser.yyVAL.item = &ast.VariableAssignment{Name: ast.SetCharset, Value: yyS[yypt-0].expr} } - case 1906: + case 1904: { parser.yyVAL.expr = ast.NewValueExpr(yyS[yypt-0].ident, "", "") } - case 1907: + case 1905: { parser.yyVAL.expr = &ast.DefaultExpr{} } - case 1908: + case 1906: { // Validate input charset name to keep the same behavior as parser of MySQL. cs, err := charset.GetCharsetInfo(yyS[yypt-0].ident) @@ -20389,11 +20413,11 @@ yynewstate: // to keep lower case of input for generated column restore. parser.yyVAL.ident = cs.Name } - case 1909: + case 1907: { parser.yyVAL.ident = charset.CharsetBin } - case 1910: + case 1908: { info, err := charset.GetCollationByName(yyS[yypt-0].ident) if err != nil { @@ -20402,19 +20426,19 @@ yynewstate: } parser.yyVAL.ident = info.Name } - case 1911: + case 1909: { parser.yyVAL.ident = charset.CollationBin } - case 1912: + case 1910: { parser.yyVAL.item = []*ast.VariableAssignment{yyS[yypt-0].item.(*ast.VariableAssignment)} } - case 1913: + case 1911: { parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.VariableAssignment), yyS[yypt-0].item.(*ast.VariableAssignment)) } - case 1916: + case 1914: { v := strings.ToLower(yyS[yypt-0].ident) var isGlobal bool @@ -20431,105 +20455,97 @@ yynewstate: } parser.yyVAL.expr = &ast.VariableExpr{Name: v, IsGlobal: isGlobal, IsSystem: true, ExplicitScope: explicitScope} } - case 1917: + case 1915: { v := yyS[yypt-0].ident v = strings.TrimPrefix(v, "@") parser.yyVAL.expr = &ast.VariableExpr{Name: v, IsGlobal: false, IsSystem: false} } - case 1918: + case 1916: { parser.yyVAL.item = &auth.UserIdentity{Username: yyS[yypt-0].ident, Hostname: "%"} } - case 1919: + case 1917: { parser.yyVAL.item = &auth.UserIdentity{Username: yyS[yypt-2].ident, Hostname: strings.ToLower(yyS[yypt-0].ident)} } - case 1920: + case 1918: { parser.yyVAL.item = &auth.UserIdentity{Username: yyS[yypt-1].ident, Hostname: strings.ToLower(strings.TrimPrefix(yyS[yypt-0].ident, "@"))} } - case 1921: + case 1919: { parser.yyVAL.item = &auth.UserIdentity{CurrentUser: true} } - case 1922: + case 1920: { parser.yyVAL.item = []*auth.UserIdentity{yyS[yypt-0].item.(*auth.UserIdentity)} } - case 1923: + case 1921: { parser.yyVAL.item = append(yyS[yypt-2].item.([]*auth.UserIdentity), yyS[yypt-0].item.(*auth.UserIdentity)) } - case 1925: + case 1923: { parser.yyVAL.ident = yyS[yypt-1].ident } - case 1929: + case 1927: { parser.yyVAL.item = &auth.RoleIdentity{Username: yyS[yypt-2].ident, Hostname: strings.ToLower(yyS[yypt-0].ident)} } - case 1930: + case 1928: { parser.yyVAL.item = &auth.RoleIdentity{Username: yyS[yypt-1].ident, Hostname: strings.ToLower(strings.TrimPrefix(yyS[yypt-0].ident, "@"))} } - case 1931: + case 1929: { parser.yyVAL.item = &auth.RoleIdentity{Username: yyS[yypt-0].ident, Hostname: "%"} } - case 1932: + case 1930: { parser.yyVAL.item = yyS[yypt-0].item } - case 1933: + case 1931: { parser.yyVAL.item = &auth.RoleIdentity{Username: yyS[yypt-0].ident, Hostname: "%"} } - case 1934: + case 1932: { parser.yyVAL.item = yyS[yypt-0].item } - case 1935: + case 1933: { parser.yyVAL.item = []*auth.RoleIdentity{yyS[yypt-0].item.(*auth.RoleIdentity)} } - case 1936: + case 1934: { parser.yyVAL.item = append(yyS[yypt-2].item.([]*auth.RoleIdentity), yyS[yypt-0].item.(*auth.RoleIdentity)) } - case 1937: + case 1935: { parser.yyVAL.item = &ast.LimitSimple{Offset: 0, Count: yyS[yypt-0].item.(uint64)} } - case 1938: + case 1936: { parser.yyVAL.item = &ast.LimitSimple{Offset: yyS[yypt-2].item.(uint64), Count: yyS[yypt-0].item.(uint64)} } - case 1939: + case 1937: { parser.yyVAL.item = &ast.LimitSimple{Offset: yyS[yypt-0].item.(uint64), Count: yyS[yypt-2].item.(uint64)} } - case 1940: + case 1938: { parser.yyVAL.item = ast.BDRRolePrimary } - case 1941: + case 1939: { parser.yyVAL.item = ast.BDRRoleSecondary } - case 1942: - { - parser.yyVAL.item = ast.BDRRoleLocalOnly - } - case 1943: - { - parser.yyVAL.item = ast.BDRRoleNone - } - case 1944: + case 1940: { parser.yyVAL.statement = &ast.AdminStmt{Tp: ast.AdminShowDDL} } - case 1945: + case 1941: { stmt := &ast.AdminStmt{Tp: ast.AdminShowDDLJobs} if yyS[yypt-0].item != nil { @@ -20537,7 +20553,7 @@ yynewstate: } parser.yyVAL.statement = stmt } - case 1946: + case 1942: { stmt := &ast.AdminStmt{ Tp: ast.AdminShowDDLJobs, @@ -20548,21 +20564,21 @@ yynewstate: } parser.yyVAL.statement = stmt } - case 1947: + case 1943: { parser.yyVAL.statement = &ast.AdminStmt{ Tp: ast.AdminShowNextRowID, Tables: []*ast.TableName{yyS[yypt-1].item.(*ast.TableName)}, } } - case 1948: + case 1944: { parser.yyVAL.statement = &ast.AdminStmt{ Tp: ast.AdminCheckTable, Tables: yyS[yypt-0].item.([]*ast.TableName), } } - case 1949: + case 1945: { parser.yyVAL.statement = &ast.AdminStmt{ Tp: ast.AdminCheckIndex, @@ -20570,7 +20586,7 @@ yynewstate: Index: string(yyS[yypt-0].ident), } } - case 1950: + case 1946: { parser.yyVAL.statement = &ast.AdminStmt{ Tp: ast.AdminRecoverIndex, @@ -20578,7 +20594,7 @@ yynewstate: Index: string(yyS[yypt-0].ident), } } - case 1951: + case 1947: { parser.yyVAL.statement = &ast.AdminStmt{ Tp: ast.AdminCleanupIndex, @@ -20586,7 +20602,7 @@ yynewstate: Index: string(yyS[yypt-0].ident), } } - case 1952: + case 1948: { parser.yyVAL.statement = &ast.AdminStmt{ Tp: ast.AdminCheckIndexRange, @@ -20595,42 +20611,42 @@ yynewstate: HandleRanges: yyS[yypt-0].item.([]ast.HandleRange), } } - case 1953: + case 1949: { parser.yyVAL.statement = &ast.AdminStmt{ Tp: ast.AdminChecksumTable, Tables: yyS[yypt-0].item.([]*ast.TableName), } } - case 1954: + case 1950: { parser.yyVAL.statement = &ast.AdminStmt{ Tp: ast.AdminCancelDDLJobs, JobIDs: yyS[yypt-0].item.([]int64), } } - case 1955: + case 1951: { parser.yyVAL.statement = &ast.AdminStmt{ Tp: ast.AdminPauseDDLJobs, JobIDs: yyS[yypt-0].item.([]int64), } } - case 1956: + case 1952: { parser.yyVAL.statement = &ast.AdminStmt{ Tp: ast.AdminResumeDDLJobs, JobIDs: yyS[yypt-0].item.([]int64), } } - case 1957: + case 1953: { parser.yyVAL.statement = &ast.AdminStmt{ Tp: ast.AdminShowDDLJobQueries, JobIDs: yyS[yypt-0].item.([]int64), } } - case 1958: + case 1954: { ret := &ast.AdminStmt{ Tp: ast.AdminShowDDLJobQueriesWithRange, @@ -20639,128 +20655,134 @@ yynewstate: ret.LimitSimple.Offset = yyS[yypt-0].item.(*ast.LimitSimple).Offset parser.yyVAL.statement = ret } - case 1959: + case 1955: { parser.yyVAL.statement = &ast.AdminStmt{ Tp: ast.AdminShowSlow, ShowSlow: yyS[yypt-0].item.(*ast.ShowSlow), } } - case 1960: + case 1956: { parser.yyVAL.statement = &ast.AdminStmt{ Tp: ast.AdminReloadExprPushdownBlacklist, } } - case 1961: + case 1957: { parser.yyVAL.statement = &ast.AdminStmt{ Tp: ast.AdminReloadOptRuleBlacklist, } } - case 1962: + case 1958: { parser.yyVAL.statement = &ast.AdminStmt{ Tp: ast.AdminPluginEnable, Plugins: yyS[yypt-0].item.([]string), } } - case 1963: + case 1959: { parser.yyVAL.statement = &ast.AdminStmt{ Tp: ast.AdminPluginDisable, Plugins: yyS[yypt-0].item.([]string), } } - case 1964: + case 1960: { parser.yyVAL.statement = &ast.CleanupTableLockStmt{ Tables: yyS[yypt-0].item.([]*ast.TableName), } } - case 1965: + case 1961: { parser.yyVAL.statement = &ast.RepairTableStmt{ Table: yyS[yypt-1].item.(*ast.TableName), CreateStmt: yyS[yypt-0].statement.(*ast.CreateTableStmt), } } - case 1966: + case 1962: { parser.yyVAL.statement = &ast.AdminStmt{ Tp: ast.AdminFlushBindings, } } - case 1967: + case 1963: { parser.yyVAL.statement = &ast.AdminStmt{ Tp: ast.AdminCaptureBindings, } } - case 1968: + case 1964: { parser.yyVAL.statement = &ast.AdminStmt{ Tp: ast.AdminEvolveBindings, } } - case 1969: + case 1965: { parser.yyVAL.statement = &ast.AdminStmt{ Tp: ast.AdminReloadBindings, } } - case 1970: + case 1966: { parser.yyVAL.statement = &ast.AdminStmt{ Tp: ast.AdminReloadStatistics, } } - case 1971: + case 1967: { parser.yyVAL.statement = &ast.AdminStmt{ Tp: ast.AdminReloadStatistics, } } - case 1972: + case 1968: { parser.yyVAL.statement = &ast.AdminStmt{ Tp: ast.AdminShowTelemetry, } } - case 1973: + case 1969: { parser.yyVAL.statement = &ast.AdminStmt{ Tp: ast.AdminResetTelemetryID, } } - case 1974: + case 1970: { parser.yyVAL.statement = &ast.AdminStmt{ Tp: ast.AdminFlushPlanCache, StatementScope: yyS[yypt-1].item.(ast.StatementScope), } } - case 1975: + case 1971: { parser.yyVAL.statement = &ast.AdminStmt{ Tp: ast.AdminSetBDRRole, BDRRole: yyS[yypt-0].item.(ast.BDRRole), } } - case 1976: + case 1972: { parser.yyVAL.statement = &ast.AdminStmt{ Tp: ast.AdminShowBDRRole, } } - case 1977: + case 1973: + { + parser.yyVAL.statement = &ast.AdminStmt{ + Tp: ast.AdminUnsetBDRRole, + } + } + case 1974: { parser.yyVAL.item = &ast.ShowSlow{ Tp: ast.ShowSlowRecent, Count: getUint64FromNUM(yyS[yypt-0].item), } } - case 1978: + case 1975: { parser.yyVAL.item = &ast.ShowSlow{ Tp: ast.ShowSlowTop, @@ -20768,7 +20790,7 @@ yynewstate: Count: getUint64FromNUM(yyS[yypt-0].item), } } - case 1979: + case 1976: { parser.yyVAL.item = &ast.ShowSlow{ Tp: ast.ShowSlowTop, @@ -20776,7 +20798,7 @@ yynewstate: Count: getUint64FromNUM(yyS[yypt-0].item), } } - case 1980: + case 1977: { parser.yyVAL.item = &ast.ShowSlow{ Tp: ast.ShowSlowTop, @@ -20784,27 +20806,27 @@ yynewstate: Count: getUint64FromNUM(yyS[yypt-0].item), } } - case 1981: + case 1978: { parser.yyVAL.item = []ast.HandleRange{yyS[yypt-0].item.(ast.HandleRange)} } - case 1982: + case 1979: { parser.yyVAL.item = append(yyS[yypt-2].item.([]ast.HandleRange), yyS[yypt-0].item.(ast.HandleRange)) } - case 1983: + case 1980: { parser.yyVAL.item = ast.HandleRange{Begin: yyS[yypt-3].item.(int64), End: yyS[yypt-1].item.(int64)} } - case 1984: + case 1981: { parser.yyVAL.item = []int64{yyS[yypt-0].item.(int64)} } - case 1985: + case 1982: { parser.yyVAL.item = append(yyS[yypt-2].item.([]int64), yyS[yypt-0].item.(int64)) } - case 1986: + case 1983: { stmt := yyS[yypt-1].item.(*ast.ShowStmt) if yyS[yypt-0].item != nil { @@ -20816,21 +20838,21 @@ yynewstate: } parser.yyVAL.statement = stmt } - case 1987: + case 1984: { parser.yyVAL.statement = &ast.ShowStmt{ Tp: ast.ShowCreateTable, Table: yyS[yypt-0].item.(*ast.TableName), } } - case 1988: + case 1985: { parser.yyVAL.statement = &ast.ShowStmt{ Tp: ast.ShowCreateView, Table: yyS[yypt-0].item.(*ast.TableName), } } - case 1989: + case 1986: { parser.yyVAL.statement = &ast.ShowStmt{ Tp: ast.ShowCreateDatabase, @@ -20838,28 +20860,28 @@ yynewstate: DBName: yyS[yypt-0].ident, } } - case 1990: + case 1987: { parser.yyVAL.statement = &ast.ShowStmt{ Tp: ast.ShowCreateSequence, Table: yyS[yypt-0].item.(*ast.TableName), } } - case 1991: + case 1988: { parser.yyVAL.statement = &ast.ShowStmt{ Tp: ast.ShowCreatePlacementPolicy, DBName: yyS[yypt-0].ident, } } - case 1992: + case 1989: { parser.yyVAL.statement = &ast.ShowStmt{ Tp: ast.ShowCreateResourceGroup, ResourceGroupName: yyS[yypt-0].ident, } } - case 1993: + case 1990: { // See https://dev.mysql.com/doc/refman/5.7/en/show-create-user.html parser.yyVAL.statement = &ast.ShowStmt{ @@ -20867,7 +20889,7 @@ yynewstate: User: yyS[yypt-0].item.(*auth.UserIdentity), } } - case 1994: + case 1991: { stmt := &ast.ShowStmt{ Tp: ast.ShowRegions, @@ -20879,14 +20901,14 @@ yynewstate: } parser.yyVAL.statement = stmt } - case 1995: + case 1992: { parser.yyVAL.statement = &ast.ShowStmt{ Tp: ast.ShowTableNextRowId, Table: yyS[yypt-1].item.(*ast.TableName), } } - case 1996: + case 1993: { stmt := &ast.ShowStmt{ Tp: ast.ShowRegions, @@ -20899,12 +20921,12 @@ yynewstate: } parser.yyVAL.statement = stmt } - case 1997: + case 1994: { // See https://dev.mysql.com/doc/refman/5.7/en/show-grants.html parser.yyVAL.statement = &ast.ShowStmt{Tp: ast.ShowGrants} } - case 1998: + case 1995: { // See https://dev.mysql.com/doc/refman/5.7/en/show-grants.html if yyS[yypt-0].item != nil { @@ -20921,32 +20943,38 @@ yynewstate: } } } - case 1999: + case 1996: { parser.yyVAL.statement = &ast.ShowStmt{ Tp: ast.ShowMasterStatus, } } - case 2000: + case 1997: { parser.yyVAL.statement = &ast.ShowStmt{ Tp: ast.ShowBinlogStatus, } } - case 2001: + case 1998: + { + parser.yyVAL.statement = &ast.ShowStmt{ + Tp: ast.ShowReplicaStatus, + } + } + case 1999: { parser.yyVAL.statement = &ast.ShowStmt{ Tp: ast.ShowProcessList, Full: yyS[yypt-1].item.(bool), } } - case 2002: + case 2000: { parser.yyVAL.statement = &ast.ShowStmt{ Tp: ast.ShowProfiles, } } - case 2003: + case 2001: { v := &ast.ShowStmt{ Tp: ast.ShowProfile, @@ -20962,23 +20990,23 @@ yynewstate: } parser.yyVAL.statement = v } - case 2004: + case 2002: { parser.yyVAL.statement = &ast.ShowStmt{ Tp: ast.ShowPrivileges, } } - case 2005: + case 2003: { parser.yyVAL.statement = &ast.ShowStmt{ Tp: ast.ShowBuiltins, } } - case 2006: + case 2004: { parser.yyVAL.statement = yyS[yypt-0].item.(*ast.ShowStmt) } - case 2007: + case 2005: { v := yyS[yypt-0].item.(int64) parser.yyVAL.statement = &ast.ShowStmt{ @@ -20986,28 +21014,28 @@ yynewstate: ImportJobID: &v, } } - case 2008: + case 2006: { parser.yyVAL.statement = &ast.ShowStmt{ Tp: ast.ShowCreateProcedure, Procedure: yyS[yypt-0].item.(*ast.TableName), } } - case 2009: + case 2007: { parser.yyVAL.item = &ast.ShowStmt{ Tp: ast.ShowPlacementForDatabase, DBName: yyS[yypt-0].ident, } } - case 2010: + case 2008: { parser.yyVAL.item = &ast.ShowStmt{ Tp: ast.ShowPlacementForTable, Table: yyS[yypt-0].item.(*ast.TableName), } } - case 2011: + case 2009: { parser.yyVAL.item = &ast.ShowStmt{ Tp: ast.ShowPlacementForPartition, @@ -21015,90 +21043,90 @@ yynewstate: Partition: model.NewCIStr(yyS[yypt-0].ident), } } - case 2012: + case 2010: { parser.yyVAL.item = nil } - case 2014: + case 2012: { parser.yyVAL.item = []int{yyS[yypt-0].item.(int)} } - case 2015: + case 2013: { l := yyS[yypt-2].item.([]int) l = append(l, yyS[yypt-0].item.(int)) parser.yyVAL.item = l } - case 2016: + case 2014: { parser.yyVAL.item = ast.ProfileTypeCPU } - case 2017: + case 2015: { parser.yyVAL.item = ast.ProfileTypeMemory } - case 2018: + case 2016: { parser.yyVAL.item = ast.ProfileTypeBlockIo } - case 2019: + case 2017: { parser.yyVAL.item = ast.ProfileTypeContextSwitch } - case 2020: + case 2018: { parser.yyVAL.item = ast.ProfileTypePageFaults } - case 2021: + case 2019: { parser.yyVAL.item = ast.ProfileTypeIpc } - case 2022: + case 2020: { parser.yyVAL.item = ast.ProfileTypeSwaps } - case 2023: + case 2021: { parser.yyVAL.item = ast.ProfileTypeSource } - case 2024: + case 2022: { parser.yyVAL.item = ast.ProfileTypeAll } - case 2025: + case 2023: { parser.yyVAL.item = nil } - case 2026: + case 2024: { v := yyS[yypt-0].item.(int64) parser.yyVAL.item = &v } - case 2027: + case 2025: { parser.yyVAL.item = nil } - case 2028: + case 2026: { parser.yyVAL.item = yyS[yypt-0].item.([]*auth.RoleIdentity) } - case 2034: + case 2032: { parser.yyVAL.item = &ast.ShowStmt{Tp: ast.ShowEngines} } - case 2035: + case 2033: { parser.yyVAL.item = &ast.ShowStmt{Tp: ast.ShowDatabases} } - case 2036: + case 2034: { parser.yyVAL.item = &ast.ShowStmt{Tp: ast.ShowConfig} } - case 2037: + case 2035: { parser.yyVAL.item = &ast.ShowStmt{Tp: ast.ShowCharset} } - case 2038: + case 2036: { parser.yyVAL.item = &ast.ShowStmt{ Tp: ast.ShowTables, @@ -21106,28 +21134,28 @@ yynewstate: Full: yyS[yypt-2].item.(bool), } } - case 2039: + case 2037: { parser.yyVAL.item = &ast.ShowStmt{ Tp: ast.ShowOpenTables, DBName: yyS[yypt-0].ident, } } - case 2040: + case 2038: { parser.yyVAL.item = &ast.ShowStmt{ Tp: ast.ShowTableStatus, DBName: yyS[yypt-0].ident, } } - case 2041: + case 2039: { parser.yyVAL.item = &ast.ShowStmt{ Tp: ast.ShowIndex, Table: yyS[yypt-0].item.(*ast.TableName), } } - case 2042: + case 2040: { show := &ast.ShowStmt{ Tp: ast.ShowIndex, @@ -21135,7 +21163,7 @@ yynewstate: } parser.yyVAL.item = show } - case 2043: + case 2041: { parser.yyVAL.item = &ast.ShowStmt{ Tp: ast.ShowColumns, @@ -21144,7 +21172,7 @@ yynewstate: Full: yyS[yypt-3].item.(bool), } } - case 2044: + case 2042: { parser.yyVAL.item = &ast.ShowStmt{ Tp: ast.ShowColumns, @@ -21154,81 +21182,81 @@ yynewstate: Extended: true, } } - case 2045: + case 2043: { parser.yyVAL.item = &ast.ShowStmt{Tp: ast.ShowWarnings, CountWarningsOrErrors: true} } - case 2046: + case 2044: { parser.yyVAL.item = &ast.ShowStmt{Tp: ast.ShowWarnings} } - case 2047: + case 2045: { parser.yyVAL.item = &ast.ShowStmt{Tp: ast.ShowErrors, CountWarningsOrErrors: true} } - case 2048: + case 2046: { parser.yyVAL.item = &ast.ShowStmt{Tp: ast.ShowErrors} } - case 2049: + case 2047: { parser.yyVAL.item = &ast.ShowStmt{ Tp: ast.ShowVariables, GlobalScope: yyS[yypt-1].item.(bool), } } - case 2050: + case 2048: { parser.yyVAL.item = &ast.ShowStmt{ Tp: ast.ShowStatus, GlobalScope: yyS[yypt-1].item.(bool), } } - case 2051: + case 2049: { parser.yyVAL.item = &ast.ShowStmt{ Tp: ast.ShowBindings, GlobalScope: yyS[yypt-1].item.(bool), } } - case 2052: + case 2050: { parser.yyVAL.item = &ast.ShowStmt{ Tp: ast.ShowCollation, } } - case 2053: + case 2051: { parser.yyVAL.item = &ast.ShowStmt{ Tp: ast.ShowTriggers, DBName: yyS[yypt-0].ident, } } - case 2054: + case 2052: { parser.yyVAL.item = &ast.ShowStmt{ Tp: ast.ShowBindingCacheStatus, } } - case 2055: + case 2053: { parser.yyVAL.item = &ast.ShowStmt{ Tp: ast.ShowProcedureStatus, } } - case 2056: + case 2054: { parser.yyVAL.item = &ast.ShowStmt{ Tp: ast.ShowPumpStatus, } } - case 2057: + case 2055: { parser.yyVAL.item = &ast.ShowStmt{ Tp: ast.ShowDrainerStatus, } } - case 2058: + case 2056: { // This statement is similar to SHOW PROCEDURE STATUS but for stored functions. // See http://dev.mysql.com/doc/refman/5.7/en/show-function-status.html @@ -21238,88 +21266,88 @@ yynewstate: Tp: ast.ShowFunctionStatus, } } - case 2059: + case 2057: { parser.yyVAL.item = &ast.ShowStmt{ Tp: ast.ShowEvents, DBName: yyS[yypt-0].ident, } } - case 2060: + case 2058: { parser.yyVAL.item = &ast.ShowStmt{ Tp: ast.ShowPlugins, } } - case 2061: + case 2059: { parser.yyVAL.item = &ast.ShowStmt{Tp: ast.ShowSessionStates} } - case 2062: + case 2060: { parser.yyVAL.item = &ast.ShowStmt{Tp: ast.ShowStatsExtended} } - case 2063: + case 2061: { parser.yyVAL.item = &ast.ShowStmt{Tp: ast.ShowStatsMeta, Table: &ast.TableName{Name: model.NewCIStr("STATS_META"), Schema: model.NewCIStr(mysql.SystemDB)}} } - case 2064: + case 2062: { parser.yyVAL.item = &ast.ShowStmt{Tp: ast.ShowStatsHistograms, Table: &ast.TableName{Name: model.NewCIStr("STATS_HISTOGRAMS"), Schema: model.NewCIStr(mysql.SystemDB)}} } - case 2065: + case 2063: { parser.yyVAL.item = &ast.ShowStmt{Tp: ast.ShowStatsTopN} } - case 2066: + case 2064: { parser.yyVAL.item = &ast.ShowStmt{Tp: ast.ShowStatsBuckets, Table: &ast.TableName{Name: model.NewCIStr("STATS_BUCKETS"), Schema: model.NewCIStr(mysql.SystemDB)}} } - case 2067: + case 2065: { parser.yyVAL.item = &ast.ShowStmt{Tp: ast.ShowStatsHealthy} } - case 2068: + case 2066: { parser.yyVAL.item = &ast.ShowStmt{Tp: ast.ShowStatsLocked, Table: &ast.TableName{Name: model.NewCIStr("STATS_TABLE_LOCKED"), Schema: model.NewCIStr(mysql.SystemDB)}} } - case 2069: + case 2067: { parser.yyVAL.item = &ast.ShowStmt{Tp: ast.ShowHistogramsInFlight} } - case 2070: + case 2068: { parser.yyVAL.item = &ast.ShowStmt{Tp: ast.ShowColumnStatsUsage} } - case 2071: + case 2069: { parser.yyVAL.item = &ast.ShowStmt{Tp: ast.ShowAnalyzeStatus} } - case 2072: + case 2070: { parser.yyVAL.item = &ast.ShowStmt{Tp: ast.ShowBackups} } - case 2073: + case 2071: { parser.yyVAL.item = &ast.ShowStmt{Tp: ast.ShowRestores} } - case 2074: + case 2072: { parser.yyVAL.item = &ast.ShowStmt{Tp: ast.ShowPlacement} } - case 2075: + case 2073: { parser.yyVAL.item = &ast.ShowStmt{Tp: ast.ShowPlacementLabels} } - case 2076: + case 2074: { parser.yyVAL.item = &ast.ShowStmt{Tp: ast.ShowImportJobs} } - case 2077: + case 2075: { parser.yyVAL.item = nil } - case 2078: + case 2076: { parser.yyVAL.item = &ast.PatternLikeOrIlikeExpr{ Pattern: yyS[yypt-0].expr, @@ -21327,55 +21355,55 @@ yynewstate: IsLike: true, } } - case 2079: + case 2077: { parser.yyVAL.item = yyS[yypt-0].expr } - case 2080: + case 2078: { parser.yyVAL.item = false } - case 2081: + case 2079: { parser.yyVAL.item = true } - case 2082: + case 2080: { parser.yyVAL.item = false } - case 2083: + case 2081: { parser.yyVAL.item = ast.StatementScopeSession } - case 2084: + case 2082: { parser.yyVAL.item = ast.StatementScopeGlobal } - case 2085: + case 2083: { parser.yyVAL.item = ast.StatementScopeInstance } - case 2086: + case 2084: { parser.yyVAL.item = ast.StatementScopeSession } - case 2087: + case 2085: { parser.yyVAL.item = false } - case 2088: + case 2086: { parser.yyVAL.item = true } - case 2089: + case 2087: { parser.yyVAL.ident = "" } - case 2090: + case 2088: { parser.yyVAL.ident = yyS[yypt-0].ident } - case 2091: + case 2089: { parser.yyVAL.item = yyS[yypt-0].item.(*ast.TableName) } @@ -21508,7 +21536,7 @@ yynewstate: } parser.yyVAL.statement = sel } - case 2224: + case 2222: { var sel ast.StmtNode switch x := yyS[yypt-0].expr.(*ast.SubqueryExpr).Query.(type) { @@ -21521,7 +21549,7 @@ yynewstate: } parser.yyVAL.statement = sel } - case 2240: + case 2238: { var sel ast.StmtNode switch x := yyS[yypt-0].expr.(*ast.SubqueryExpr).Query.(type) { @@ -21534,7 +21562,7 @@ yynewstate: } parser.yyVAL.statement = sel } - case 2242: + case 2241: { if yyS[yypt-0].statement != nil { s := yyS[yypt-0].statement @@ -21544,7 +21572,7 @@ yynewstate: parser.result = append(parser.result, s) } } - case 2243: + case 2242: { if yyS[yypt-0].statement != nil { s := yyS[yypt-0].statement @@ -21554,7 +21582,7 @@ yynewstate: parser.result = append(parser.result, s) } } - case 2244: + case 2243: { cst := yyS[yypt-0].item.(*ast.Constraint) if yyS[yypt-1].item != nil { @@ -21563,7 +21591,7 @@ yynewstate: } parser.yyVAL.item = cst } - case 2249: + case 2248: { if yyS[yypt-0].item != nil { parser.yyVAL.item = []interface{}{yyS[yypt-0].item.(interface{})} @@ -21571,7 +21599,7 @@ yynewstate: parser.yyVAL.item = []interface{}{} } } - case 2250: + case 2249: { if yyS[yypt-0].item != nil { parser.yyVAL.item = append(yyS[yypt-2].item.([]interface{}), yyS[yypt-0].item) @@ -21579,7 +21607,7 @@ yynewstate: parser.yyVAL.item = yyS[yypt-2].item } } - case 2251: + case 2250: { var columnDefs []*ast.ColumnDef var constraints []*ast.Constraint @@ -21588,7 +21616,7 @@ yynewstate: Constraints: constraints, } } - case 2252: + case 2251: { tes := yyS[yypt-1].item.([]interface{}) var columnDefs []*ast.ColumnDef @@ -21606,69 +21634,69 @@ yynewstate: Constraints: constraints, } } - case 2254: + case 2253: { parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionCharset, StrValue: yyS[yypt-0].ident, UintValue: ast.TableOptionCharsetWithoutConvertTo} } - case 2255: + case 2254: { parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionCollate, StrValue: yyS[yypt-0].ident, UintValue: ast.TableOptionCharsetWithoutConvertTo} } - case 2256: + case 2255: { parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionAutoIncrement, UintValue: yyS[yypt-0].item.(uint64), BoolValue: yyS[yypt-3].item.(bool)} } - case 2257: + case 2256: { parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionAutoIdCache, UintValue: yyS[yypt-0].item.(uint64)} } - case 2258: + case 2257: { parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionAutoRandomBase, UintValue: yyS[yypt-0].item.(uint64), BoolValue: yyS[yypt-3].item.(bool)} } - case 2259: + case 2258: { parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionAvgRowLength, UintValue: yyS[yypt-0].item.(uint64)} } - case 2260: + case 2259: { parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionConnection, StrValue: yyS[yypt-0].ident} } - case 2261: + case 2260: { parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionCheckSum, UintValue: yyS[yypt-0].item.(uint64)} } - case 2262: + case 2261: { parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionTableCheckSum, UintValue: yyS[yypt-0].item.(uint64)} } - case 2263: + case 2262: { parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionPassword, StrValue: yyS[yypt-0].ident} } - case 2264: + case 2263: { parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionCompression, StrValue: yyS[yypt-0].ident} } - case 2265: + case 2264: { parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionKeyBlockSize, UintValue: yyS[yypt-0].item.(uint64)} } - case 2266: + case 2265: { parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionDelayKeyWrite, UintValue: yyS[yypt-0].item.(uint64)} } - case 2267: + case 2266: { parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionRowFormat, UintValue: yyS[yypt-0].item.(uint64)} } - case 2268: + case 2267: { parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionStatsPersistent} } - case 2269: + case 2268: { n := yyS[yypt-0].item.(uint64) if n != 0 && n != 1 { @@ -21679,13 +21707,13 @@ yynewstate: yylex.AppendError(yylex.Errorf("The STATS_AUTO_RECALC is parsed but ignored by all storage engines.")) parser.lastErrorAsWarn() } - case 2270: + case 2269: { parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionStatsAutoRecalc, Default: true} yylex.AppendError(yylex.Errorf("The STATS_AUTO_RECALC is parsed but ignored by all storage engines.")) parser.lastErrorAsWarn() } - case 2271: + case 2270: { // Parse it but will ignore it. // In MySQL, STATS_SAMPLE_PAGES=N(Where 0 9223372036854775808 { @@ -23997,14 +24091,14 @@ yynewstate: parser.yyVAL.item = -int64(unsigned_num) } } - case 2705: + case 2711: { parser.yyVAL.statement = &ast.DropSequenceStmt{ IfExists: yyS[yypt-1].item.(bool), Sequences: yyS[yypt-0].item.([]*ast.TableName), } } - case 2706: + case 2712: { parser.yyVAL.statement = &ast.AlterSequenceStmt{ IfExists: yyS[yypt-2].item.(bool), @@ -24012,27 +24106,27 @@ yynewstate: SeqOptions: yyS[yypt-0].item.([]*ast.SequenceOption), } } - case 2707: + case 2713: { parser.yyVAL.item = []*ast.SequenceOption{yyS[yypt-0].item.(*ast.SequenceOption)} } - case 2708: + case 2714: { parser.yyVAL.item = append(yyS[yypt-1].item.([]*ast.SequenceOption), yyS[yypt-0].item.(*ast.SequenceOption)) } - case 2710: + case 2716: { parser.yyVAL.item = &ast.SequenceOption{Tp: ast.SequenceRestart} } - case 2711: + case 2717: { parser.yyVAL.item = &ast.SequenceOption{Tp: ast.SequenceRestartWith, IntValue: yyS[yypt-0].item.(int64)} } - case 2712: + case 2718: { parser.yyVAL.item = &ast.SequenceOption{Tp: ast.SequenceRestartWith, IntValue: yyS[yypt-0].item.(int64)} } - case 2713: + case 2719: { x := &ast.IndexAdviseStmt{ Path: yyS[yypt-3].ident, @@ -24049,42 +24143,42 @@ yynewstate: } parser.yyVAL.statement = x } - case 2714: + case 2720: { parser.yyVAL.item = uint64(ast.UnspecifiedSize) } - case 2715: + case 2721: { parser.yyVAL.item = getUint64FromNUM(yyS[yypt-0].item) } - case 2716: + case 2722: { parser.yyVAL.item = nil } - case 2717: + case 2723: { parser.yyVAL.item = &ast.MaxIndexNumClause{ PerTable: yyS[yypt-1].item.(uint64), PerDB: yyS[yypt-0].item.(uint64), } } - case 2718: + case 2724: { parser.yyVAL.item = uint64(ast.UnspecifiedSize) } - case 2719: + case 2725: { parser.yyVAL.item = getUint64FromNUM(yyS[yypt-0].item) } - case 2720: + case 2726: { parser.yyVAL.item = uint64(ast.UnspecifiedSize) } - case 2721: + case 2727: { parser.yyVAL.item = getUint64FromNUM(yyS[yypt-0].item) } - case 2722: + case 2728: { // Parse it but will ignore it switch yyS[yypt-0].ident { @@ -24099,19 +24193,19 @@ yynewstate: } parser.yyVAL.ident = yyS[yypt-0].ident } - case 2723: + case 2729: { parser.yyVAL.item = append([]*ast.RowExpr{}, yyS[yypt-0].item.(*ast.RowExpr)) } - case 2724: + case 2730: { parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.RowExpr), yyS[yypt-0].item.(*ast.RowExpr)) } - case 2725: + case 2731: { parser.yyVAL.item = &ast.RowExpr{Values: yyS[yypt-0].item.([]ast.ExprNode)} } - case 2726: + case 2732: { x := &ast.PlanReplayerStmt{ Stmt: yyS[yypt-0].statement, @@ -24130,7 +24224,7 @@ yynewstate: parser.yyVAL.statement = x } - case 2727: + case 2733: { x := &ast.PlanReplayerStmt{ Stmt: yyS[yypt-0].statement, @@ -24149,7 +24243,7 @@ yynewstate: parser.yyVAL.statement = x } - case 2728: + case 2734: { x := &ast.PlanReplayerStmt{ Stmt: nil, @@ -24172,7 +24266,7 @@ yynewstate: parser.yyVAL.statement = x } - case 2729: + case 2735: { x := &ast.PlanReplayerStmt{ Stmt: nil, @@ -24195,7 +24289,7 @@ yynewstate: parser.yyVAL.statement = x } - case 2730: + case 2736: { x := &ast.PlanReplayerStmt{ Stmt: nil, @@ -24208,7 +24302,7 @@ yynewstate: } parser.yyVAL.statement = x } - case 2731: + case 2737: { x := &ast.PlanReplayerStmt{ Stmt: nil, @@ -24221,7 +24315,7 @@ yynewstate: } parser.yyVAL.statement = x } - case 2732: + case 2738: { x := &ast.PlanReplayerStmt{ Stmt: nil, @@ -24235,7 +24329,7 @@ yynewstate: parser.yyVAL.statement = x } - case 2733: + case 2739: { x := &ast.PlanReplayerStmt{ Stmt: nil, @@ -24250,7 +24344,7 @@ yynewstate: parser.yyVAL.statement = x } - case 2734: + case 2740: { x := &ast.PlanReplayerStmt{ Stmt: nil, @@ -24265,33 +24359,33 @@ yynewstate: parser.yyVAL.statement = x } - case 2735: + case 2741: { parser.yyVAL.item = nil } - case 2736: + case 2742: { parser.yyVAL.item = yyS[yypt-0].item.(*ast.AsOfClause) } - case 2737: + case 2743: { parser.yyVAL.item = []*ast.StoreParameter{} } - case 2738: + case 2744: { parser.yyVAL.item = yyS[yypt-0].item } - case 2739: + case 2745: { l := yyS[yypt-2].item.([]*ast.StoreParameter) l = append(l, yyS[yypt-0].item.(*ast.StoreParameter)) parser.yyVAL.item = l } - case 2740: + case 2746: { parser.yyVAL.item = []*ast.StoreParameter{yyS[yypt-0].item.(*ast.StoreParameter)} } - case 2741: + case 2747: { x := &ast.StoreParameter{ Paramstatus: yyS[yypt-2].item.(int), @@ -24300,23 +24394,23 @@ yynewstate: } parser.yyVAL.item = x } - case 2742: + case 2748: { parser.yyVAL.item = ast.MODE_IN } - case 2743: + case 2749: { parser.yyVAL.item = ast.MODE_IN } - case 2744: + case 2750: { parser.yyVAL.item = ast.MODE_OUT } - case 2745: + case 2751: { parser.yyVAL.item = ast.MODE_INOUT } - case 2748: + case 2754: { var sel ast.StmtNode switch x := yyS[yypt-0].expr.(*ast.SubqueryExpr).Query.(type) { @@ -24329,7 +24423,7 @@ yynewstate: } parser.yyVAL.statement = sel } - case 2763: + case 2769: { var sel ast.StmtNode switch x := yyS[yypt-0].expr.(*ast.SubqueryExpr).Query.(type) { @@ -24342,29 +24436,29 @@ yynewstate: } parser.yyVAL.statement = sel } - case 2765: + case 2771: { parser.yyVAL.statement = yyS[yypt-0].statement } - case 2766: + case 2772: { parser.yyVAL.item = []string{strings.ToLower(yyS[yypt-0].ident)} } - case 2767: + case 2773: { l := yyS[yypt-2].item.([]string) l = append(l, strings.ToLower(yyS[yypt-0].ident)) parser.yyVAL.item = l } - case 2768: + case 2774: { parser.yyVAL.item = nil } - case 2769: + case 2775: { parser.yyVAL.item = yyS[yypt-0].expr } - case 2770: + case 2776: { x := &ast.ProcedureDecl{ DeclNames: yyS[yypt-2].item.([]string), @@ -24375,7 +24469,7 @@ yynewstate: } parser.yyVAL.item = x } - case 2771: + case 2777: { name := strings.ToLower(yyS[yypt-3].ident) parser.yyVAL.item = &ast.ProcedureCursor{ @@ -24383,7 +24477,7 @@ yynewstate: Selectstring: yyS[yypt-0].statement.(ast.StmtNode), } } - case 2772: + case 2778: { parser.yyVAL.item = &ast.ProcedureErrorControl{ ControlHandle: yyS[yypt-4].item.(int), @@ -24391,66 +24485,66 @@ yynewstate: Operate: yyS[yypt-0].statement.(ast.StmtNode), } } - case 2773: + case 2779: { parser.yyVAL.item = ast.PROCEDUR_CONTINUE } - case 2774: + case 2780: { parser.yyVAL.item = ast.PROCEDUR_EXIT } - case 2775: + case 2781: { parser.yyVAL.item = []ast.ErrNode{yyS[yypt-0].statement.(ast.ErrNode)} } - case 2776: + case 2782: { l := yyS[yypt-2].item.([]ast.ErrNode) l = append(l, yyS[yypt-0].statement.(ast.ErrNode)) parser.yyVAL.item = l } - case 2777: + case 2783: { parser.yyVAL.statement = yyS[yypt-0].statement.(ast.ErrNode) } - case 2778: + case 2784: { parser.yyVAL.statement = &ast.ProcedureErrorCon{ ErrorCon: ast.PROCEDUR_SQLWARNING, } } - case 2779: + case 2785: { parser.yyVAL.statement = &ast.ProcedureErrorCon{ ErrorCon: ast.PROCEDUR_NOT_FOUND, } } - case 2780: + case 2786: { parser.yyVAL.statement = &ast.ProcedureErrorCon{ ErrorCon: ast.PROCEDUR_SQLEXCEPTION, } } - case 2781: + case 2787: { parser.yyVAL.statement = &ast.ProcedureErrorVal{ ErrorNum: getUint64FromNUM(yyS[yypt-0].item), } } - case 2782: + case 2788: { parser.yyVAL.statement = &ast.ProcedureErrorState{ CodeStatus: yyS[yypt-0].ident, } } - case 2785: + case 2791: { name := strings.ToLower(yyS[yypt-0].ident) parser.yyVAL.statement = &ast.ProcedureOpenCur{ CurName: name, } } - case 2786: + case 2792: { name := strings.ToLower(yyS[yypt-2].ident) parser.yyVAL.statement = &ast.ProcedureFetchInto{ @@ -24458,62 +24552,62 @@ yynewstate: Variables: yyS[yypt-0].item.([]string), } } - case 2787: + case 2793: { name := strings.ToLower(yyS[yypt-0].ident) parser.yyVAL.statement = &ast.ProcedureCloseCur{ CurName: name, } } - case 2791: + case 2797: { parser.yyVAL.item = []string{strings.ToLower(yyS[yypt-0].ident)} } - case 2792: + case 2798: { l := yyS[yypt-2].item.([]string) l = append(l, strings.ToLower(yyS[yypt-0].ident)) parser.yyVAL.item = l } - case 2793: + case 2799: { parser.yyVAL.item = []ast.DeclNode{} } - case 2794: + case 2800: { parser.yyVAL.item = yyS[yypt-0].item } - case 2795: + case 2801: { parser.yyVAL.item = []ast.DeclNode{yyS[yypt-1].item.(ast.DeclNode)} } - case 2796: + case 2802: { l := yyS[yypt-2].item.([]ast.DeclNode) l = append(l, yyS[yypt-1].item.(ast.DeclNode)) parser.yyVAL.item = l } - case 2797: + case 2803: { parser.yyVAL.item = []ast.StmtNode{} } - case 2798: + case 2804: { l := yyS[yypt-2].item.([]ast.StmtNode) l = append(l, yyS[yypt-1].statement.(ast.StmtNode)) parser.yyVAL.item = l } - case 2799: + case 2805: { parser.yyVAL.item = []ast.StmtNode{yyS[yypt-1].statement.(ast.StmtNode)} } - case 2800: + case 2806: { l := yyS[yypt-2].item.([]ast.StmtNode) l = append(l, yyS[yypt-1].statement.(ast.StmtNode)) parser.yyVAL.item = l } - case 2801: + case 2807: { x := &ast.ProcedureBlock{ ProcedureVars: yyS[yypt-2].item.([]ast.DeclNode), @@ -24521,13 +24615,13 @@ yynewstate: } parser.yyVAL.statement = x } - case 2802: + case 2808: { parser.yyVAL.statement = &ast.ProcedureIfInfo{ IfBody: yyS[yypt-2].statement.(*ast.ProcedureIfBlock), } } - case 2803: + case 2809: { ifBlock := &ast.ProcedureIfBlock{ IfExpr: yyS[yypt-3].expr.(ast.ExprNode), @@ -24538,73 +24632,73 @@ yynewstate: } parser.yyVAL.statement = ifBlock } - case 2804: + case 2810: { parser.yyVAL.statement = nil } - case 2805: + case 2811: { parser.yyVAL.statement = &ast.ProcedureElseIfBlock{ ProcedureIfStmt: yyS[yypt-0].statement.(*ast.ProcedureIfBlock), } } - case 2806: + case 2812: { parser.yyVAL.statement = &ast.ProcedureElseBlock{ ProcedureIfStmts: yyS[yypt-0].item.([]ast.StmtNode), } } - case 2807: + case 2813: { parser.yyVAL.statement = yyS[yypt-0].statement } - case 2808: + case 2814: { parser.yyVAL.statement = yyS[yypt-0].statement } - case 2809: + case 2815: { parser.yyVAL.item = []*ast.SimpleWhenThenStmt{yyS[yypt-0].statement.(*ast.SimpleWhenThenStmt)} } - case 2810: + case 2816: { l := yyS[yypt-1].item.([]*ast.SimpleWhenThenStmt) l = append(l, yyS[yypt-0].statement.(*ast.SimpleWhenThenStmt)) parser.yyVAL.item = l } - case 2811: + case 2817: { parser.yyVAL.item = []*ast.SearchWhenThenStmt{yyS[yypt-0].statement.(*ast.SearchWhenThenStmt)} } - case 2812: + case 2818: { l := yyS[yypt-1].item.([]*ast.SearchWhenThenStmt) l = append(l, yyS[yypt-0].statement.(*ast.SearchWhenThenStmt)) parser.yyVAL.item = l } - case 2813: + case 2819: { parser.yyVAL.statement = &ast.SimpleWhenThenStmt{ Expr: yyS[yypt-2].expr.(ast.ExprNode), ProcedureStmts: yyS[yypt-0].item.([]ast.StmtNode), } } - case 2814: + case 2820: { parser.yyVAL.statement = &ast.SearchWhenThenStmt{ Expr: yyS[yypt-2].expr.(ast.ExprNode), ProcedureStmts: yyS[yypt-0].item.([]ast.StmtNode), } } - case 2815: + case 2821: { parser.yyVAL.item = nil } - case 2816: + case 2822: { parser.yyVAL.item = yyS[yypt-0].item.([]ast.StmtNode) } - case 2817: + case 2823: { caseStmt := &ast.SimpleCaseStmt{ Condition: yyS[yypt-4].expr.(ast.ExprNode), @@ -24615,7 +24709,7 @@ yynewstate: } parser.yyVAL.statement = caseStmt } - case 2818: + case 2824: { caseStmt := &ast.SearchCaseStmt{ WhenCases: yyS[yypt-3].item.([]*ast.SearchWhenThenStmt), @@ -24625,25 +24719,25 @@ yynewstate: } parser.yyVAL.statement = caseStmt } - case 2819: + case 2825: { parser.yyVAL.statement = yyS[yypt-0].statement } - case 2820: + case 2826: { parser.yyVAL.statement = &ast.ProcedureWhileStmt{ Condition: yyS[yypt-4].expr.(ast.ExprNode), Body: yyS[yypt-2].item.([]ast.StmtNode), } } - case 2821: + case 2827: { parser.yyVAL.statement = &ast.ProcedureRepeatStmt{ Body: yyS[yypt-4].item.([]ast.StmtNode), Condition: yyS[yypt-2].expr.(ast.ExprNode), } } - case 2822: + case 2828: { labelBlock := &ast.ProcedureLabelBlock{ LabelName: yyS[yypt-3].ident, @@ -24655,15 +24749,15 @@ yynewstate: } parser.yyVAL.statement = labelBlock } - case 2823: + case 2829: { parser.yyVAL.ident = "" } - case 2824: + case 2830: { parser.yyVAL.ident = yyS[yypt-0].ident } - case 2825: + case 2831: { labelLoop := &ast.ProcedureLabelLoop{ LabelName: yyS[yypt-3].ident, @@ -24675,21 +24769,21 @@ yynewstate: } parser.yyVAL.statement = labelLoop } - case 2826: + case 2832: { parser.yyVAL.statement = &ast.ProcedureJump{ Name: yyS[yypt-0].ident, IsLeave: false, } } - case 2827: + case 2833: { parser.yyVAL.statement = &ast.ProcedureJump{ Name: yyS[yypt-0].ident, IsLeave: true, } } - case 2840: + case 2846: { x := &ast.ProcedureInfo{ IfNotExists: yyS[yypt-5].item.(bool), @@ -24708,38 +24802,38 @@ yynewstate: x.ProcedureParamStr = strings.TrimSpace(parser.src[startOffset:endOffset]) parser.yyVAL.statement = x } - case 2841: + case 2847: { parser.yyVAL.statement = &ast.DropProcedureStmt{ IfExists: yyS[yypt-1].item.(bool), ProcedureName: yyS[yypt-0].item.(*ast.TableName), } } - case 2842: + case 2848: { parser.yyVAL.statement = yyS[yypt-0].item.(*ast.CalibrateResourceStmt) } - case 2843: + case 2849: { parser.yyVAL.item = &ast.CalibrateResourceStmt{} } - case 2844: + case 2850: { parser.yyVAL.item = &ast.CalibrateResourceStmt{ DynamicCalibrateResourceOptionList: yyS[yypt-0].item.([]*ast.DynamicCalibrateResourceOption), } } - case 2845: + case 2851: { parser.yyVAL.item = &ast.CalibrateResourceStmt{ Tp: yyS[yypt-0].item.(ast.CalibrateResourceType), } } - case 2846: + case 2852: { parser.yyVAL.item = []*ast.DynamicCalibrateResourceOption{yyS[yypt-0].item.(*ast.DynamicCalibrateResourceOption)} } - case 2847: + case 2853: { if yyS[yypt-1].item.([]*ast.DynamicCalibrateResourceOption)[0].Tp == yyS[yypt-0].item.(*ast.DynamicCalibrateResourceOption).Tp || (len(yyS[yypt-1].item.([]*ast.DynamicCalibrateResourceOption)) > 1 && yyS[yypt-1].item.([]*ast.DynamicCalibrateResourceOption)[1].Tp == yyS[yypt-0].item.(*ast.DynamicCalibrateResourceOption).Tp) { @@ -24748,7 +24842,7 @@ yynewstate: } parser.yyVAL.item = append(yyS[yypt-1].item.([]*ast.DynamicCalibrateResourceOption), yyS[yypt-0].item.(*ast.DynamicCalibrateResourceOption)) } - case 2848: + case 2854: { if yyS[yypt-2].item.([]*ast.DynamicCalibrateResourceOption)[0].Tp == yyS[yypt-0].item.(*ast.DynamicCalibrateResourceOption).Tp || (len(yyS[yypt-2].item.([]*ast.DynamicCalibrateResourceOption)) > 1 && yyS[yypt-2].item.([]*ast.DynamicCalibrateResourceOption)[1].Tp == yyS[yypt-0].item.(*ast.DynamicCalibrateResourceOption).Tp) { @@ -24757,15 +24851,15 @@ yynewstate: } parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.DynamicCalibrateResourceOption), yyS[yypt-0].item.(*ast.DynamicCalibrateResourceOption)) } - case 2849: + case 2855: { parser.yyVAL.item = &ast.DynamicCalibrateResourceOption{Tp: ast.CalibrateStartTime, Ts: yyS[yypt-0].expr.(ast.ExprNode)} } - case 2850: + case 2856: { parser.yyVAL.item = &ast.DynamicCalibrateResourceOption{Tp: ast.CalibrateEndTime, Ts: yyS[yypt-0].expr.(ast.ExprNode)} } - case 2851: + case 2857: { _, err := duration.ParseDuration(yyS[yypt-0].ident) if err != nil { @@ -24774,41 +24868,41 @@ yynewstate: } parser.yyVAL.item = &ast.DynamicCalibrateResourceOption{Tp: ast.CalibrateDuration, StrValue: yyS[yypt-0].ident} } - case 2852: + case 2858: { parser.yyVAL.item = &ast.DynamicCalibrateResourceOption{Tp: ast.CalibrateDuration, Ts: yyS[yypt-1].expr.(ast.ExprNode), Unit: yyS[yypt-0].item.(ast.TimeUnitType)} } - case 2853: + case 2859: { parser.yyVAL.item = ast.TPCC } - case 2854: + case 2860: { parser.yyVAL.item = ast.OLTPREADWRITE } - case 2855: + case 2861: { parser.yyVAL.item = ast.OLTPREADONLY } - case 2856: + case 2862: { parser.yyVAL.item = ast.OLTPWRITEONLY } - case 2857: + case 2863: { parser.yyVAL.item = ast.TPCH10 } - case 2858: + case 2864: { parser.yyVAL.statement = &ast.AddQueryWatchStmt{ QueryWatchOptionList: yyS[yypt-0].item.([]*ast.QueryWatchOption), } } - case 2859: + case 2865: { parser.yyVAL.item = []*ast.QueryWatchOption{yyS[yypt-0].item.(*ast.QueryWatchOption)} } - case 2860: + case 2866: { if !ast.CheckQueryWatchAppend(yyS[yypt-1].item.([]*ast.QueryWatchOption), yyS[yypt-0].item.(*ast.QueryWatchOption)) { yylex.AppendError(yylex.Errorf("Dupliated options specified")) @@ -24816,7 +24910,7 @@ yynewstate: } parser.yyVAL.item = append(yyS[yypt-1].item.([]*ast.QueryWatchOption), yyS[yypt-0].item.(*ast.QueryWatchOption)) } - case 2861: + case 2867: { if !ast.CheckQueryWatchAppend(yyS[yypt-2].item.([]*ast.QueryWatchOption), yyS[yypt-0].item.(*ast.QueryWatchOption)) { yylex.AppendError(yylex.Errorf("Dupliated options specified")) @@ -24824,35 +24918,35 @@ yynewstate: } parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.QueryWatchOption), yyS[yypt-0].item.(*ast.QueryWatchOption)) } - case 2862: + case 2868: { parser.yyVAL.item = &ast.QueryWatchOption{Tp: ast.QueryWatchResourceGroup, StrValue: model.NewCIStr(yyS[yypt-0].ident)} } - case 2863: + case 2869: { parser.yyVAL.item = &ast.QueryWatchOption{Tp: ast.QueryWatchResourceGroup, ExprValue: yyS[yypt-0].expr} } - case 2864: + case 2870: { parser.yyVAL.item = &ast.QueryWatchOption{Tp: ast.QueryWatchAction, IntValue: yyS[yypt-0].item.(int32)} } - case 2865: + case 2871: { parser.yyVAL.item = yyS[yypt-0].item.(*ast.QueryWatchOption) } - case 2866: + case 2872: { parser.yyVAL.item = &ast.QueryWatchOption{Tp: ast.QueryWatchType, IntValue: int32(model.WatchSimilar), ExprValue: yyS[yypt-0].expr} } - case 2867: + case 2873: { parser.yyVAL.item = &ast.QueryWatchOption{Tp: ast.QueryWatchType, IntValue: int32(model.WatchPlan), ExprValue: yyS[yypt-0].expr} } - case 2868: + case 2874: { parser.yyVAL.item = &ast.QueryWatchOption{Tp: ast.QueryWatchType, IntValue: yyS[yypt-2].item.(int32), ExprValue: yyS[yypt-0].expr, BoolValue: true} } - case 2869: + case 2875: { parser.yyVAL.statement = &ast.DropQueryWatchStmt{ IntValue: yyS[yypt-0].item.(int64), diff --git a/pkg/parser/parser.y b/pkg/parser/parser.y index 1aac154278aa2..cfb0b48927448 100644 --- a/pkg/parser/parser.y +++ b/pkg/parser/parser.y @@ -95,8 +95,8 @@ import ( cascade "CASCADE" caseKwd "CASE" change "CHANGE" - character "CHARACTER" charType "CHAR" + character "CHARACTER" check "CHECK" collate "COLLATE" column "COLUMN" @@ -107,10 +107,10 @@ import ( cross "CROSS" cumeDist "CUME_DIST" currentDate "CURRENT_DATE" + currentRole "CURRENT_ROLE" currentTime "CURRENT_TIME" currentTs "CURRENT_TIMESTAMP" currentUser "CURRENT_USER" - currentRole "CURRENT_ROLE" cursor "CURSOR" database "DATABASE" databases "DATABASES" @@ -131,14 +131,14 @@ import ( doubleType "DOUBLE" drop "DROP" dual "DUAL" - elseIfKwd "ELSEIF" elseKwd "ELSE" + elseIfKwd "ELSEIF" enclosed "ENCLOSED" escaped "ESCAPED" + except "EXCEPT" exists "EXISTS" exit "EXIT" explain "EXPLAIN" - except "EXCEPT" falseKwd "FALSE" fetch "FETCH" firstValue "FIRST_VALUE" @@ -161,17 +161,12 @@ import ( hourSecond "HOUR_SECOND" ifKwd "IF" ignore "IGNORE" + ilike "ILIKE" in "IN" index "INDEX" infile "INFILE" inner "INNER" inout "INOUT" - integerType "INTEGER" - intersect "INTERSECT" - interval "INTERVAL" - into "INTO" - outfile "OUTFILE" - is "IS" insert "INSERT" intType "INT" int1Type "INT1" @@ -179,6 +174,11 @@ import ( int3Type "INT3" int4Type "INT4" int8Type "INT8" + integerType "INTEGER" + intersect "INTERSECT" + interval "INTERVAL" + into "INTO" + is "IS" iterate "ITERATE" join "JOIN" key "KEY" @@ -191,14 +191,14 @@ import ( leave "LEAVE" left "LEFT" like "LIKE" - ilike "ILIKE" limit "LIMIT" - lines "LINES" linear "LINEAR" + lines "LINES" load "LOAD" localTime "LOCALTIME" localTs "LOCALTIMESTAMP" lock "LOCK" + long "LONG" longblobType "LONGBLOB" longtextType "LONGTEXT" lowPriority "LOW_PRIORITY" @@ -211,6 +211,7 @@ import ( minuteMicrosecond "MINUTE_MICROSECOND" minuteSecond "MINUTE_SECOND" mod "MOD" + natural "NATURAL" not "NOT" noWriteToBinLog "NO_WRITE_TO_BINLOG" nthValue "NTH_VALUE" @@ -226,6 +227,7 @@ import ( order "ORDER" out "OUT" outer "OUTER" + outfile "OUTFILE" over "OVER" partition "PARTITION" percentRank "PERCENT_RANK" @@ -258,20 +260,19 @@ import ( smallIntType "SMALLINT" spatial "SPATIAL" sql "SQL" - sqlBigResult "SQL_BIG_RESULT" - sqlCalcFoundRows "SQL_CALC_FOUND_ROWS" - sqlSmallResult "SQL_SMALL_RESULT" sqlexception "SQLEXCEPTION" sqlstate "SQLSTATE" sqlwarning "SQLWARNING" + sqlBigResult "SQL_BIG_RESULT" + sqlCalcFoundRows "SQL_CALC_FOUND_ROWS" + sqlSmallResult "SQL_SMALL_RESULT" ssl "SSL" starting "STARTING" statsExtended "STATS_EXTENDED" + stored "STORED" straightJoin "STRAIGHT_JOIN" - tidbCurrentTSO "TiDB_CURRENT_TSO" tableKwd "TABLE" tableSample "TABLESAMPLE" - stored "STORED" terminated "TERMINATED" then "THEN" tinyblobType "TINYBLOB" @@ -281,8 +282,9 @@ import ( trailing "TRAILING" trigger "TRIGGER" trueKwd "TRUE" - unique "UNIQUE" + tidbCurrentTSO "TiDB_CURRENT_TSO" union "UNION" + unique "UNIQUE" unlock "UNLOCK" unsigned "UNSIGNED" until "UNTIL" @@ -291,25 +293,23 @@ import ( use "USE" using "USING" utcDate "UTC_DATE" - utcTimestamp "UTC_TIMESTAMP" utcTime "UTC_TIME" + utcTimestamp "UTC_TIMESTAMP" values "VALUES" - long "LONG" + varbinaryType "VARBINARY" varcharType "VARCHAR" varcharacter "VARCHARACTER" - varbinaryType "VARBINARY" varying "VARYING" virtual "VIRTUAL" when "WHEN" where "WHERE" while "WHILE" - write "WRITE" window "WINDOW" with "WITH" + write "WRITE" xor "XOR" yearMonth "YEAR_MONTH" zerofill "ZEROFILL" - natural "NATURAL" /* The following tokens belong to UnReservedKeyword. Notice: make sure these tokens are contained in UnReservedKeyword. */ account "ACCOUNT" @@ -324,10 +324,6 @@ import ( ascii "ASCII" attribute "ATTRIBUTE" attributes "ATTRIBUTES" - statsOptions "STATS_OPTIONS" - statsSampleRate "STATS_SAMPLE_RATE" - statsColChoice "STATS_COL_CHOICE" - statsColList "STATS_COL_LIST" autoIdCache "AUTO_ID_CACHE" autoIncrement "AUTO_INCREMENT" autoRandom "AUTO_RANDOM" @@ -341,13 +337,13 @@ import ( begin "BEGIN" bernoulli "BERNOULLI" binding "BINDING" - bindingCache "BINDING_CACHE" bindings "BINDINGS" + bindingCache "BINDING_CACHE" binlog "BINLOG" bitType "BIT" block "BLOCK" - booleanType "BOOLEAN" boolType "BOOL" + booleanType "BOOLEAN" btree "BTREE" byteType "BYTE" cache "CACHE" @@ -363,11 +359,13 @@ import ( cleanup "CLEANUP" client "CLIENT" clientErrorsSummary "CLIENT_ERRORS_SUMMARY" + close "CLOSE" + cluster "CLUSTER" + clustered "CLUSTERED" coalesce "COALESCE" collation "COLLATION" - columnFormat "COLUMN_FORMAT" columns "COLUMNS" - config "CONFIG" + columnFormat "COLUMN_FORMAT" comment "COMMENT" commit "COMMIT" committed "COMMITTED" @@ -375,6 +373,7 @@ import ( compressed "COMPRESSED" compression "COMPRESSION" concurrency "CONCURRENCY" + config "CONFIG" connection "CONNECTION" consistency "CONSISTENCY" consistent "CONSISTENT" @@ -388,13 +387,10 @@ import ( csvSeparator "CSV_SEPARATOR" csvTrimLastSeparators "CSV_TRIM_LAST_SEPARATORS" current "CURRENT" - close "CLOSE" - cluster "CLUSTER" - clustered "CLUSTERED" cycle "CYCLE" data "DATA" - datetimeType "DATETIME" dateType "DATE" + datetimeType "DATETIME" day "DAY" deallocate "DEALLOCATE" declare "DECLARE" @@ -418,6 +414,7 @@ import ( engines "ENGINES" enum "ENUM" errorKwd "ERROR" + identSQLErrors "ERRORS" escape "ESCAPE" event "EVENT" events "EVENTS" @@ -428,15 +425,16 @@ import ( expansion "EXPANSION" expire "EXPIRE" extended "EXTENDED" + failedLoginAttempts "FAILED_LOGIN_ATTEMPTS" faultsSym "FAULTS" fields "FIELDS" file "FILE" first "FIRST" fixed "FIXED" flush "FLUSH" - found "FOUND" following "FOLLOWING" format "FORMAT" + found "FOUND" full "FULL" function "FUNCTION" general "GENERAL" @@ -449,8 +447,8 @@ import ( history "HISTORY" hosts "HOSTS" hour "HOUR" + hypo "HYPO" identified "IDENTIFIED" - identSQLErrors "ERRORS" importKwd "IMPORT" imports "IMPORTS" increment "INCREMENT" @@ -469,20 +467,19 @@ import ( labels "LABELS" language "LANGUAGE" last "LAST" - lastBackup "LAST_BACKUP" lastval "LASTVAL" + lastBackup "LAST_BACKUP" less "LESS" level "LEVEL" list "LIST" local "LOCAL" - local_only "LOCAL_ONLY" - locked "LOCKED" location "LOCATION" + locked "LOCKED" logs "LOGS" master "MASTER" + maxConnectionsPerHour "MAX_CONNECTIONS_PER_HOUR" max_idxnum "MAX_IDXNUM" max_minutes "MAX_MINUTES" - maxConnectionsPerHour "MAX_CONNECTIONS_PER_HOUR" maxQueriesPerHour "MAX_QUERIES_PER_HOUR" maxRows "MAX_ROWS" maxUpdatesPerHour "MAX_UPDATES_PER_HOUR" @@ -492,9 +489,9 @@ import ( memory "MEMORY" merge "MERGE" microsecond "MICROSECOND" - minRows "MIN_ROWS" minute "MINUTE" minValue "MINVALUE" + minRows "MIN_ROWS" mode "MODE" modify "MODIFY" month "MONTH" @@ -513,17 +510,16 @@ import ( nonclustered "NONCLUSTERED" none "NONE" nowait "NOWAIT" - nvarcharType "NVARCHAR" nulls "NULLS" + nvarcharType "NVARCHAR" off "OFF" offset "OFFSET" oltpReadOnly "OLTP_READ_ONLY" oltpReadWrite "OLTP_READ_WRITE" oltpWriteOnly "OLTP_WRITE_ONLY" - tpch10 "TPCH_10" - onDuplicate "ON_DUPLICATE" online "ONLINE" only "ONLY" + onDuplicate "ON_DUPLICATE" open "OPEN" optional "OPTIONAL" packKeys "PACK_KEYS" @@ -533,6 +529,7 @@ import ( partitioning "PARTITIONING" partitions "PARTITIONS" password "PASSWORD" + passwordLockTime "PASSWORD_LOCK_TIME" pause "PAUSE" percent "PERCENT" per_db "PER_DB" @@ -541,10 +538,10 @@ import ( plugins "PLUGINS" point "POINT" policy "POLICY" - preSplitRegions "PRE_SPLIT_REGIONS" preceding "PRECEDING" prepare "PREPARE" preserve "PRESERVE" + preSplitRegions "PRE_SPLIT_REGIONS" privileges "PRIVILEGES" process "PROCESS" processlist "PROCESSLIST" @@ -584,7 +581,6 @@ import ( rowCount "ROW_COUNT" rowFormat "ROW_FORMAT" rtree "RTREE" - hypo "HYPO" san "SAN" savepoint "SAVEPOINT" second "SECOND" @@ -626,8 +622,12 @@ import ( sqlTsiYear "SQL_TSI_YEAR" start "START" statsAutoRecalc "STATS_AUTO_RECALC" + statsColChoice "STATS_COL_CHOICE" + statsColList "STATS_COL_LIST" + statsOptions "STATS_OPTIONS" statsPersistent "STATS_PERSISTENT" statsSamplePages "STATS_SAMPLE_PAGES" + statsSampleRate "STATS_SAMPLE_RATE" status "STATUS" storage "STORAGE" strictFormat "STRICT_FORMAT" @@ -639,19 +639,19 @@ import ( switchesSym "SWITCHES" system "SYSTEM" systemTime "SYSTEM_TIME" - tableChecksum "TABLE_CHECKSUM" tables "TABLES" tablespace "TABLESPACE" + tableChecksum "TABLE_CHECKSUM" temporary "TEMPORARY" temptable "TEMPTABLE" textType "TEXT" than "THAN" tikvImporter "TIKV_IMPORTER" - timestampType "TIMESTAMP" timeType "TIME" + timestampType "TIMESTAMP" tokenIssuer "TOKEN_ISSUER" - tp "TYPE" tpcc "TPCC" + tpch10 "TPCH_10" trace "TRACE" traditional "TRADITIONAL" transaction "TRANSACTION" @@ -661,17 +661,20 @@ import ( ttl "TTL" ttlEnable "TTL_ENABLE" ttlJobInterval "TTL_JOB_INTERVAL" + tp "TYPE" unbounded "UNBOUNDED" uncommitted "UNCOMMITTED" undefined "UNDEFINED" unicodeSym "UNICODE" unknown "UNKNOWN" + unset "UNSET" user "USER" validation "VALIDATION" value "VALUE" variables "VARIABLES" view "VIEW" visible "VISIBLE" + wait "WAIT" warnings "WARNINGS" week "WEEK" weightString "WEIGHT_STRING" @@ -679,14 +682,12 @@ import ( workload "WORKLOAD" x509 "X509" yearType "YEAR" - wait "WAIT" - failedLoginAttempts "FAILED_LOGIN_ATTEMPTS" - passwordLockTime "PASSWORD_LOCK_TIME" /* The following tokens belong to NotKeywordToken. Notice: make sure these tokens are contained in NotKeywordToken. */ addDate "ADDDATE" approxCountDistinct "APPROX_COUNT_DISTINCT" approxPercentile "APPROX_PERCENTILE" + background "BACKGROUND" bitAnd "BIT_AND" bitOr "BIT_OR" bitXor "BIT_XOR" @@ -695,18 +696,20 @@ import ( briefType "BRIEF" burstable "BURSTABLE" cast "CAST" - copyKwd "COPY" constraints "CONSTRAINTS" - curTime "CURTIME" + cooldown "COOLDOWN" + copyKwd "COPY" curDate "CURDATE" + curTime "CURTIME" dateAdd "DATE_ADD" dateSub "DATE_SUB" defined "DEFINED" dotType "DOT" + dryRun "DRYRUN" dump "DUMP" - timeDuration "DURATION" endTime "END_TIME" exact "EXACT" + execElapsed "EXEC_ELAPSED" exprPushdownBlacklist "EXPR_PUSHDOWN_BLACKLIST" extract "EXTRACT" flashback "FLASHBACK" @@ -714,13 +717,15 @@ import ( followerConstraints "FOLLOWER_CONSTRAINTS" followers "FOLLOWERS" fullBackupStorage "FULL_BACKUP_STORAGE" - getFormat "GET_FORMAT" gcTTL "GC_TTL" + getFormat "GET_FORMAT" groupConcat "GROUP_CONCAT" - next_row_id "NEXT_ROW_ID" + high "HIGH" inplace "INPLACE" instant "INSTANT" internal "INTERNAL" + ioReadBandwidth "IO_READ_BANDWIDTH" + ioWriteBandwidth "IO_WRITE_BANDWIDTH" jsonArrayagg "JSON_ARRAYAGG" jsonObjectAgg "JSON_OBJECTAGG" leader "LEADER" @@ -729,40 +734,48 @@ import ( learnerConstraints "LEARNER_CONSTRAINTS" learners "LEARNERS" log "LOG" - min "MIN" + low "LOW" max "MAX" + medium "MEDIUM" metadata "METADATA" + min "MIN" + next_row_id "NEXT_ROW_ID" now "NOW" optRuleBlacklist "OPT_RULE_BLACKLIST" placement "PLACEMENT" - plan "PLAN" planCache "PLAN_CACHE" + plan "PLAN" position "POSITION" predicate "PREDICATE" primaryRegion "PRIMARY_REGION" + priority "PRIORITY" + queryLimit "QUERY_LIMIT" recent "RECENT" replayer "REPLAYER" restoredTS "RESTORED_TS" running "RUNNING" + ruRate "RU_PER_SEC" s3 "S3" schedule "SCHEDULE" + similar "SIMILAR" staleness "STALENESS" startTime "START_TIME" startTS "START_TS" - std "STD" stddev "STDDEV" stddevPop "STDDEV_POP" stddevSamp "STDDEV_SAMP" + std "STD" stop "STOP" strict "STRICT" strong "STRONG" subDate "SUBDATE" - sum "SUM" substring "SUBSTRING" + sum "SUM" survivalPreferences "SURVIVAL_PREFERENCES" target "TARGET" taskTypes "TASK_TYPES" tidbJson "TIDB_JSON" + timeDuration "DURATION" timestampAdd "TIMESTAMPADD" timestampDiff "TIMESTAMPDIFF" tls "TLS" @@ -770,43 +783,57 @@ import ( tokudbFast "TOKUDB_FAST" tokudbLzma "TOKUDB_LZMA" tokudbQuickLZ "TOKUDB_QUICKLZ" - tokudbSnappy "TOKUDB_SNAPPY" tokudbSmall "TOKUDB_SMALL" + tokudbSnappy "TOKUDB_SNAPPY" tokudbUncompressed "TOKUDB_UNCOMPRESSED" tokudbZlib "TOKUDB_ZLIB" tokudbZstd "TOKUDB_ZSTD" top "TOP" trim "TRIM" + trueCardCost "TRUE_CARD_COST" + unlimited "UNLIMITED" untilTS "UNTIL_TS" variance "VARIANCE" varPop "VAR_POP" varSamp "VAR_SAMP" verboseType "VERBOSE" - trueCardCost "TRUE_CARD_COST" - voter "VOTER" voterConstraints "VOTER_CONSTRAINTS" voters "VOTERS" - ruRate "RU_PER_SEC" - priority "PRIORITY" - high "HIGH" - medium "MEDIUM" - low "LOW" - ioReadBandwidth "IO_READ_BANDWIDTH" - ioWriteBandwidth "IO_WRITE_BANDWIDTH" - execElapsed "EXEC_ELAPSED" - dryRun "DRYRUN" - cooldown "COOLDOWN" + voter "VOTER" watch "WATCH" - similar "SIMILAR" - queryLimit "QUERY_LIMIT" - background "BACKGROUND" - unlimited "UNLIMITED" /* The following tokens belong to TiDBKeyword. Notice: make sure these tokens are contained in TiDBKeyword. */ admin "ADMIN" batch "BATCH" buckets "BUCKETS" + builtinApproxCountDistinct + builtinApproxPercentile + builtinBitAnd + builtinBitOr + builtinBitXor + builtinCast + builtinCount + builtinCurDate + builtinCurTime + builtinDateAdd + builtinDateSub + builtinExtract + builtinGroupConcat + builtinMax + builtinMin + builtinNow + builtinPosition builtins "BUILTINS" + builtinStddevPop + builtinStddevSamp + builtinSubstring + builtinSum + builtinSysDate + builtinTranslate + builtinTrim + builtinUser + builtinVarPop + builtinVarSamp cancel "CANCEL" cardinality "CARDINALITY" cmSketch "CMSKETCH" @@ -817,63 +844,36 @@ import ( depth "DEPTH" drainer "DRAINER" dry "DRY" - jobs "JOBS" + histogramsInFlight "HISTOGRAMS_IN_FLIGHT" job "JOB" + jobs "JOBS" nodeID "NODE_ID" nodeState "NODE_STATE" optimistic "OPTIMISTIC" pessimistic "PESSIMISTIC" pump "PUMP" + region "REGION" + regions "REGIONS" + reset "RESET" run "RUN" - samples "SAMPLES" sampleRate "SAMPLERATE" + samples "SAMPLES" sessionStates "SESSION_STATES" + split "SPLIT" statistics "STATISTICS" stats "STATS" - statsMeta "STATS_META" - statsHistograms "STATS_HISTOGRAMS" statsBuckets "STATS_BUCKETS" statsHealthy "STATS_HEALTHY" - statsTopN "STATS_TOPN" + statsHistograms "STATS_HISTOGRAMS" statsLocked "STATS_LOCKED" - histogramsInFlight "HISTOGRAMS_IN_FLIGHT" + statsMeta "STATS_META" + statsTopN "STATS_TOPN" telemetry "TELEMETRY" telemetryID "TELEMETRY_ID" tidb "TIDB" tiFlash "TIFLASH" topn "TOPN" - split "SPLIT" width "WIDTH" - reset "RESET" - regions "REGIONS" - region "REGION" - builtinBitAnd - builtinBitOr - builtinBitXor - builtinCast - builtinCount - builtinApproxCountDistinct - builtinApproxPercentile - builtinCurDate - builtinCurTime - builtinDateAdd - builtinDateSub - builtinExtract - builtinGroupConcat - builtinMax - builtinMin - builtinNow - builtinPosition - builtinSubstring - builtinSum - builtinSysDate - builtinStddevPop - builtinStddevSamp - builtinTranslate - builtinTrim - builtinUser - builtinVarPop - builtinVarSamp %token @@ -1003,6 +1003,7 @@ import ( CallStmt "CALL statement" IndexAdviseStmt "INDEX ADVISE statement" ImportIntoStmt "IMPORT INTO statement" + ImportFromSelectStmt "SELECT statement of IMPORT INTO" KillStmt "Kill statement" LoadDataStmt "Load data statement" LoadStatsStmt "Load statistic statement" @@ -1010,6 +1011,7 @@ import ( UnlockStatsStmt "Unlock statistic statement" LockTablesStmt "Lock tables statement" NonTransactionalDMLStmt "Non-transactional DML statement" + OptimizeTableStmt "OPTIMIZE statement" PlanReplayerStmt "Plan replayer statement" PreparedStmt "PreparedStmt" ProcedureProcStmt "The entrance of procedure statements which contains all kinds of statements in procedure" @@ -1049,10 +1051,7 @@ import ( UpdateStmtNoWith "Update statement without CTE clause" HelpStmt "HELP statement" ShardableStmt "Shardable statement that can be used in non-transactional DMLs" - PauseLoadDataStmt "PAUSE LOAD DATA JOB statement" - ResumeLoadDataStmt "RESUME LOAD DATA JOB statement" CancelImportStmt "CANCEL IMPORT JOB statement" - DropLoadDataStmt "DROP LOAD DATA JOB statement" ProcedureUnlabeledBlock "The statement block without label in procedure" ProcedureBlockContent "The statement block in procedure expressed with 'Begin ... End'" SimpleWhenThen "Procedure case when then" @@ -1098,7 +1097,7 @@ import ( AuthOption "User auth option" AutoRandomOpt "Auto random option" Boolean "Boolean (0, 1, false, true)" - BDRRole "BDR role (none, primary, secondary, local_only)" + BDRRole "BDR role (primary, secondary)" OptionalBraces "optional braces" CastType "Cast function target type" CharsetOpt "CHARACTER SET option in LOAD DATA" @@ -1548,6 +1547,7 @@ import ( EncryptionOpt "Encryption option 'Y' or 'N'" FirstOrNext "FIRST or NEXT" RowOrRows "ROW or ROWS" + Replica "{REPLICA | SLAVE}" %type Identifier "identifier or unreserved keyword" @@ -2982,23 +2982,23 @@ FlashbackToTimestampStmt: "FLASHBACK" "CLUSTER" toTimestamp stringLit { $$ = &ast.FlashBackToTimestampStmt{ - FlashbackTS: ast.NewValueExpr($4, "", ""), + FlashbackTS: ast.NewValueExpr($4, "", ""), FlashbackTSO: 0, } } | "FLASHBACK" "TABLE" TableNameList toTimestamp stringLit { $$ = &ast.FlashBackToTimestampStmt{ - Tables: $3.([]*ast.TableName), - FlashbackTS: ast.NewValueExpr($5, "", ""), + Tables: $3.([]*ast.TableName), + FlashbackTS: ast.NewValueExpr($5, "", ""), FlashbackTSO: 0, } } | "FLASHBACK" DatabaseSym DBName toTimestamp stringLit { $$ = &ast.FlashBackToTimestampStmt{ - DBName: model.NewCIStr($3), - FlashbackTS: ast.NewValueExpr($5, "", ""), + DBName: model.NewCIStr($3), + FlashbackTS: ast.NewValueExpr($5, "", ""), FlashbackTSO: 0, } } @@ -3006,20 +3006,20 @@ FlashbackToTimestampStmt: { if tsoValue, ok := $4.(uint64); ok && tsoValue > 0 { $$ = &ast.FlashBackToTimestampStmt{ - FlashbackTSO: tsoValue, - } + FlashbackTSO: tsoValue, + } } else { - yylex.AppendError(yylex.Errorf("Invalid TSO value provided: %d", $4)) - return 1 + yylex.AppendError(yylex.Errorf("Invalid TSO value provided: %d", $4)) + return 1 } } | "FLASHBACK" "TABLE" TableNameList toTSO LengthNum { if tsoValue, ok := $5.(uint64); ok && tsoValue > 0 { $$ = &ast.FlashBackToTimestampStmt{ - Tables: $3.([]*ast.TableName), - FlashbackTSO: tsoValue, - } + Tables: $3.([]*ast.TableName), + FlashbackTSO: tsoValue, + } } else { yylex.AppendError(yylex.Errorf("Invalid TSO value provided: %d", $5)) return 1 @@ -3029,8 +3029,8 @@ FlashbackToTimestampStmt: { if tsoValue, ok := $5.(uint64); ok && tsoValue > 0 { $$ = &ast.FlashBackToTimestampStmt{ - DBName: model.NewCIStr($3), - FlashbackTSO: tsoValue, + DBName: model.NewCIStr($3), + FlashbackTSO: tsoValue, } } else { yylex.AppendError(yylex.Errorf("Invalid TSO value provided: %d", $5)) @@ -3038,7 +3038,6 @@ FlashbackToTimestampStmt: } } - /******************************************************************* * * Flush Back Table Statement @@ -3152,76 +3151,82 @@ SplitSyntaxOption: } AnalyzeTableStmt: - "ANALYZE" "TABLE" TableNameList AllColumnsOrPredicateColumnsOpt AnalyzeOptionListOpt + "ANALYZE" NoWriteToBinLogAliasOpt "TABLE" TableNameList AllColumnsOrPredicateColumnsOpt AnalyzeOptionListOpt { - $$ = &ast.AnalyzeTableStmt{TableNames: $3.([]*ast.TableName), ColumnChoice: $4.(model.ColumnChoice), AnalyzeOpts: $5.([]ast.AnalyzeOpt)} + $$ = &ast.AnalyzeTableStmt{TableNames: $4.([]*ast.TableName), NoWriteToBinLog: $2.(bool), ColumnChoice: $5.(model.ColumnChoice), AnalyzeOpts: $6.([]ast.AnalyzeOpt)} } -| "ANALYZE" "TABLE" TableName "INDEX" IndexNameList AnalyzeOptionListOpt +| "ANALYZE" NoWriteToBinLogAliasOpt "TABLE" TableName "INDEX" IndexNameList AnalyzeOptionListOpt { - $$ = &ast.AnalyzeTableStmt{TableNames: []*ast.TableName{$3.(*ast.TableName)}, IndexNames: $5.([]model.CIStr), IndexFlag: true, AnalyzeOpts: $6.([]ast.AnalyzeOpt)} + $$ = &ast.AnalyzeTableStmt{TableNames: []*ast.TableName{$4.(*ast.TableName)}, NoWriteToBinLog: $2.(bool), IndexNames: $6.([]model.CIStr), IndexFlag: true, AnalyzeOpts: $7.([]ast.AnalyzeOpt)} } -| "ANALYZE" "INCREMENTAL" "TABLE" TableName "INDEX" IndexNameList AnalyzeOptionListOpt +| "ANALYZE" NoWriteToBinLogAliasOpt "INCREMENTAL" "TABLE" TableName "INDEX" IndexNameList AnalyzeOptionListOpt { - $$ = &ast.AnalyzeTableStmt{TableNames: []*ast.TableName{$4.(*ast.TableName)}, IndexNames: $6.([]model.CIStr), IndexFlag: true, Incremental: true, AnalyzeOpts: $7.([]ast.AnalyzeOpt)} + $$ = &ast.AnalyzeTableStmt{TableNames: []*ast.TableName{$5.(*ast.TableName)}, NoWriteToBinLog: $2.(bool), IndexNames: $7.([]model.CIStr), IndexFlag: true, Incremental: true, AnalyzeOpts: $8.([]ast.AnalyzeOpt)} } -| "ANALYZE" "TABLE" TableName "PARTITION" PartitionNameList AllColumnsOrPredicateColumnsOpt AnalyzeOptionListOpt +| "ANALYZE" NoWriteToBinLogAliasOpt "TABLE" TableName "PARTITION" PartitionNameList AllColumnsOrPredicateColumnsOpt AnalyzeOptionListOpt { - $$ = &ast.AnalyzeTableStmt{TableNames: []*ast.TableName{$3.(*ast.TableName)}, PartitionNames: $5.([]model.CIStr), ColumnChoice: $6.(model.ColumnChoice), AnalyzeOpts: $7.([]ast.AnalyzeOpt)} + $$ = &ast.AnalyzeTableStmt{TableNames: []*ast.TableName{$4.(*ast.TableName)}, NoWriteToBinLog: $2.(bool), PartitionNames: $6.([]model.CIStr), ColumnChoice: $7.(model.ColumnChoice), AnalyzeOpts: $8.([]ast.AnalyzeOpt)} } -| "ANALYZE" "TABLE" TableName "PARTITION" PartitionNameList "INDEX" IndexNameList AnalyzeOptionListOpt +| "ANALYZE" NoWriteToBinLogAliasOpt "TABLE" TableName "PARTITION" PartitionNameList "INDEX" IndexNameList AnalyzeOptionListOpt { $$ = &ast.AnalyzeTableStmt{ - TableNames: []*ast.TableName{$3.(*ast.TableName)}, - PartitionNames: $5.([]model.CIStr), - IndexNames: $7.([]model.CIStr), - IndexFlag: true, - AnalyzeOpts: $8.([]ast.AnalyzeOpt), + TableNames: []*ast.TableName{$4.(*ast.TableName)}, + NoWriteToBinLog: $2.(bool), + PartitionNames: $6.([]model.CIStr), + IndexNames: $8.([]model.CIStr), + IndexFlag: true, + AnalyzeOpts: $9.([]ast.AnalyzeOpt), } } -| "ANALYZE" "INCREMENTAL" "TABLE" TableName "PARTITION" PartitionNameList "INDEX" IndexNameList AnalyzeOptionListOpt +| "ANALYZE" NoWriteToBinLogAliasOpt "INCREMENTAL" "TABLE" TableName "PARTITION" PartitionNameList "INDEX" IndexNameList AnalyzeOptionListOpt { $$ = &ast.AnalyzeTableStmt{ - TableNames: []*ast.TableName{$4.(*ast.TableName)}, - PartitionNames: $6.([]model.CIStr), - IndexNames: $8.([]model.CIStr), - IndexFlag: true, - Incremental: true, - AnalyzeOpts: $9.([]ast.AnalyzeOpt), + TableNames: []*ast.TableName{$5.(*ast.TableName)}, + NoWriteToBinLog: $2.(bool), + PartitionNames: $7.([]model.CIStr), + IndexNames: $9.([]model.CIStr), + IndexFlag: true, + Incremental: true, + AnalyzeOpts: $10.([]ast.AnalyzeOpt), } } -| "ANALYZE" "TABLE" TableName "UPDATE" "HISTOGRAM" "ON" IdentList AnalyzeOptionListOpt +| "ANALYZE" NoWriteToBinLogAliasOpt "TABLE" TableName "UPDATE" "HISTOGRAM" "ON" IdentList AnalyzeOptionListOpt { $$ = &ast.AnalyzeTableStmt{ - TableNames: []*ast.TableName{$3.(*ast.TableName)}, - ColumnNames: $7.([]model.CIStr), - AnalyzeOpts: $8.([]ast.AnalyzeOpt), + TableNames: []*ast.TableName{$4.(*ast.TableName)}, + NoWriteToBinLog: $2.(bool), + ColumnNames: $8.([]model.CIStr), + AnalyzeOpts: $9.([]ast.AnalyzeOpt), HistogramOperation: ast.HistogramOperationUpdate, } } -| "ANALYZE" "TABLE" TableName "DROP" "HISTOGRAM" "ON" IdentList +| "ANALYZE" NoWriteToBinLogAliasOpt "TABLE" TableName "DROP" "HISTOGRAM" "ON" IdentList { $$ = &ast.AnalyzeTableStmt{ - TableNames: []*ast.TableName{$3.(*ast.TableName)}, - ColumnNames: $7.([]model.CIStr), + TableNames: []*ast.TableName{$4.(*ast.TableName)}, + NoWriteToBinLog: $2.(bool), + ColumnNames: $8.([]model.CIStr), HistogramOperation: ast.HistogramOperationDrop, } } -| "ANALYZE" "TABLE" TableName "COLUMNS" IdentList AnalyzeOptionListOpt +| "ANALYZE" NoWriteToBinLogAliasOpt "TABLE" TableName "COLUMNS" IdentList AnalyzeOptionListOpt { $$ = &ast.AnalyzeTableStmt{ - TableNames: []*ast.TableName{$3.(*ast.TableName)}, - ColumnNames: $5.([]model.CIStr), - ColumnChoice: model.ColumnList, - AnalyzeOpts: $6.([]ast.AnalyzeOpt)} + TableNames: []*ast.TableName{$4.(*ast.TableName)}, + NoWriteToBinLog: $2.(bool), + ColumnNames: $6.([]model.CIStr), + ColumnChoice: model.ColumnList, + AnalyzeOpts: $7.([]ast.AnalyzeOpt)} } -| "ANALYZE" "TABLE" TableName "PARTITION" PartitionNameList "COLUMNS" IdentList AnalyzeOptionListOpt +| "ANALYZE" NoWriteToBinLogAliasOpt "TABLE" TableName "PARTITION" PartitionNameList "COLUMNS" IdentList AnalyzeOptionListOpt { $$ = &ast.AnalyzeTableStmt{ - TableNames: []*ast.TableName{$3.(*ast.TableName)}, - PartitionNames: $5.([]model.CIStr), - ColumnNames: $7.([]model.CIStr), - ColumnChoice: model.ColumnList, - AnalyzeOpts: $8.([]ast.AnalyzeOpt)} + TableNames: []*ast.TableName{$4.(*ast.TableName)}, + NoWriteToBinLog: $2.(bool), + PartitionNames: $6.([]model.CIStr), + ColumnNames: $8.([]model.CIStr), + ColumnChoice: model.ColumnList, + AnalyzeOpts: $9.([]ast.AnalyzeOpt)} } AllColumnsOrPredicateColumnsOpt: @@ -5855,24 +5860,6 @@ OptionLevel: $$ = ast.BRIEOptionLevelRequired } -PauseLoadDataStmt: - "PAUSE" "LOAD" "DATA" "JOB" Int64Num - { - $$ = &ast.LoadDataActionStmt{ - Tp: ast.LoadDataPause, - JobID: $5.(int64), - } - } - -ResumeLoadDataStmt: - "RESUME" "LOAD" "DATA" "JOB" Int64Num - { - $$ = &ast.LoadDataActionStmt{ - Tp: ast.LoadDataResume, - JobID: $5.(int64), - } - } - CancelImportStmt: "CANCEL" "IMPORT" "JOB" Int64Num { @@ -5882,15 +5869,6 @@ CancelImportStmt: } } -DropLoadDataStmt: - "DROP" "LOAD" "DATA" "JOB" Int64Num - { - $$ = &ast.LoadDataActionStmt{ - Tp: ast.LoadDataDrop, - JobID: $5.(int64), - } - } - Expression: singleAtIdentifier assignmentEq Expression %prec assignmentEq { @@ -6629,7 +6607,6 @@ UnReservedKeyword: | "INSERT_METHOD" | "LESS" | "LOCAL" -| "LOCAL_ONLY" | "LAST" | "NAMES" | "NVARCHAR" @@ -6672,6 +6649,7 @@ UnReservedKeyword: | "TSO" | "UNBOUNDED" | "UNKNOWN" +| "UNSET" | "VALUE" %prec lowerThanValueKeyword | "WARNINGS" | "YEAR" @@ -6808,7 +6786,7 @@ UnReservedKeyword: | "STORAGE" | "DISK" | "STATS_SAMPLE_PAGES" -| "SECONDARY" +| "SECONDARY" | "SECONDARY_ENGINE" | "SECONDARY_LOAD" | "SECONDARY_UNLOAD" @@ -7314,14 +7292,17 @@ OnDuplicateKeyUpdate: * **********************************************************************************/ ReplaceIntoStmt: - "REPLACE" PriorityOpt IntoOpt TableName PartitionNameListOpt InsertValues + "REPLACE" TableOptimizerHintsOpt PriorityOpt IntoOpt TableName PartitionNameListOpt InsertValues { - x := $6.(*ast.InsertStmt) + x := $7.(*ast.InsertStmt) + if $2 != nil { + x.TableHints = $2.([]*ast.TableOptimizerHint) + } x.IsReplace = true - x.Priority = $2.(mysql.PriorityEnum) - ts := &ast.TableSource{Source: $4.(*ast.TableName)} + x.Priority = $3.(mysql.PriorityEnum) + ts := &ast.TableSource{Source: $5.(*ast.TableName)} x.Table = &ast.TableRefsClause{TableRefs: &ast.Join{Left: ts}} - x.PartitionNames = $5.([]model.CIStr) + x.PartitionNames = $6.([]model.CIStr) $$ = x } @@ -8808,7 +8789,16 @@ TableName: } | Identifier '.' Identifier { - $$ = &ast.TableName{Schema: model.NewCIStr($1), Name: model.NewCIStr($3)} + schema := $1 + if isInCorrectIdentifierName(schema) { + yylex.AppendError(ErrWrongDBName.GenWithStackByArgs(schema)) + return 1 + } + $$ = &ast.TableName{Schema: model.NewCIStr(schema), Name: model.NewCIStr($3)} + } +| '*' '.' Identifier + { + $$ = &ast.TableName{Schema: model.NewCIStr("*"), Name: model.NewCIStr($3)} } TableNameList: @@ -10250,15 +10240,21 @@ SetOprStmtWoutLimitOrderBy: } var setOprList2 []ast.Node var with2 *ast.WithClause + var limit2 *ast.Limit + var orderBy2 *ast.OrderByClause switch x := $3.(*ast.SubqueryExpr).Query.(type) { case *ast.SelectStmt: setOprList2 = []ast.Node{x} with2 = x.With case *ast.SetOprStmt: + // child setOprStmt's limit and order should also make sense + // we should separate it out from other normal SetOprSelectList. setOprList2 = x.SelectList.Selects with2 = x.With + limit2 = x.Limit + orderBy2 = x.OrderBy } - nextSetOprList := &ast.SetOprSelectList{Selects: setOprList2, With: with2} + nextSetOprList := &ast.SetOprSelectList{Selects: setOprList2, With: with2, Limit: limit2, OrderBy: orderBy2} nextSetOprList.AfterSetOperator = $2.(*ast.SetOprType) setOprList := append(setOprList1, nextSetOprList) setOpr := &ast.SetOprStmt{SelectList: &ast.SetOprSelectList{Selects: setOprList}} @@ -10275,6 +10271,8 @@ SetOprStmtWithLimitOrderBy: } var setOprList2 []ast.Node var with2 *ast.WithClause + var limit2 *ast.Limit + var orderBy2 *ast.OrderByClause switch x := $3.(*ast.SubqueryExpr).Query.(type) { case *ast.SelectStmt: setOprList2 = []ast.Node{x} @@ -10282,8 +10280,10 @@ SetOprStmtWithLimitOrderBy: case *ast.SetOprStmt: setOprList2 = x.SelectList.Selects with2 = x.With + limit2 = x.Limit + orderBy2 = x.OrderBy } - nextSetOprList := &ast.SetOprSelectList{Selects: setOprList2, With: with2} + nextSetOprList := &ast.SetOprSelectList{Selects: setOprList2, With: with2, Limit: limit2, OrderBy: orderBy2} nextSetOprList.AfterSetOperator = $2.(*ast.SetOprType) setOprList := append(setOprList1, nextSetOprList) setOpr := &ast.SetOprStmt{SelectList: &ast.SetOprSelectList{Selects: setOprList}} @@ -10299,6 +10299,8 @@ SetOprStmtWithLimitOrderBy: } var setOprList2 []ast.Node var with2 *ast.WithClause + var limit2 *ast.Limit + var orderBy2 *ast.OrderByClause switch x := $3.(*ast.SubqueryExpr).Query.(type) { case *ast.SelectStmt: setOprList2 = []ast.Node{x} @@ -10306,8 +10308,10 @@ SetOprStmtWithLimitOrderBy: case *ast.SetOprStmt: setOprList2 = x.SelectList.Selects with2 = x.With + limit2 = x.Limit + orderBy2 = x.OrderBy } - nextSetOprList := &ast.SetOprSelectList{Selects: setOprList2, With: with2} + nextSetOprList := &ast.SetOprSelectList{Selects: setOprList2, With: with2, Limit: limit2, OrderBy: orderBy2} nextSetOprList.AfterSetOperator = $2.(*ast.SetOprType) setOprList := append(setOprList1, nextSetOprList) setOpr := &ast.SetOprStmt{SelectList: &ast.SetOprSelectList{Selects: setOprList}} @@ -10323,6 +10327,8 @@ SetOprStmtWithLimitOrderBy: } var setOprList2 []ast.Node var with2 *ast.WithClause + var limit2 *ast.Limit + var orderBy2 *ast.OrderByClause switch x := $3.(*ast.SubqueryExpr).Query.(type) { case *ast.SelectStmt: setOprList2 = []ast.Node{x} @@ -10330,8 +10336,10 @@ SetOprStmtWithLimitOrderBy: case *ast.SetOprStmt: setOprList2 = x.SelectList.Selects with2 = x.With + limit2 = x.Limit + orderBy2 = x.OrderBy } - nextSetOprList := &ast.SetOprSelectList{Selects: setOprList2, With: with2} + nextSetOprList := &ast.SetOprSelectList{Selects: setOprList2, With: with2, Limit: limit2, OrderBy: orderBy2} nextSetOprList.AfterSetOperator = $2.(*ast.SetOprType) setOprList := append(setOprList1, nextSetOprList) setOpr := &ast.SetOprStmt{SelectList: &ast.SetOprSelectList{Selects: setOprList}} @@ -10342,48 +10350,39 @@ SetOprStmtWithLimitOrderBy: | SubSelect OrderBy { var setOprList []ast.Node - var with *ast.WithClause switch x := $1.(*ast.SubqueryExpr).Query.(type) { case *ast.SelectStmt: - setOprList = []ast.Node{x} - with = x.With + setOprList = []ast.Node{&ast.SetOprSelectList{Selects: []ast.Node{x}, With: x.With}} case *ast.SetOprStmt: - setOprList = x.SelectList.Selects - with = x.With + setOprList = []ast.Node{&ast.SetOprSelectList{Selects: x.SelectList.Selects, With: x.With, Limit: x.Limit, OrderBy: x.OrderBy}} } - setOpr := &ast.SetOprStmt{SelectList: &ast.SetOprSelectList{Selects: setOprList}, With: with} + setOpr := &ast.SetOprStmt{SelectList: &ast.SetOprSelectList{Selects: setOprList}} setOpr.OrderBy = $2.(*ast.OrderByClause) $$ = setOpr } | SubSelect SelectStmtLimit { var setOprList []ast.Node - var with *ast.WithClause switch x := $1.(*ast.SubqueryExpr).Query.(type) { case *ast.SelectStmt: - setOprList = []ast.Node{x} - with = x.With + setOprList = []ast.Node{&ast.SetOprSelectList{Selects: []ast.Node{x}, With: x.With}} case *ast.SetOprStmt: - setOprList = x.SelectList.Selects - with = x.With + setOprList = []ast.Node{&ast.SetOprSelectList{Selects: x.SelectList.Selects, With: x.With, Limit: x.Limit, OrderBy: x.OrderBy}} } - setOpr := &ast.SetOprStmt{SelectList: &ast.SetOprSelectList{Selects: setOprList}, With: with} + setOpr := &ast.SetOprStmt{SelectList: &ast.SetOprSelectList{Selects: setOprList}} setOpr.Limit = $2.(*ast.Limit) $$ = setOpr } | SubSelect OrderBy SelectStmtLimit { var setOprList []ast.Node - var with *ast.WithClause switch x := $1.(*ast.SubqueryExpr).Query.(type) { case *ast.SelectStmt: - setOprList = []ast.Node{x} - with = x.With + setOprList = []ast.Node{&ast.SetOprSelectList{Selects: []ast.Node{x}, With: x.With}} case *ast.SetOprStmt: - setOprList = x.SelectList.Selects - with = x.With + setOprList = []ast.Node{&ast.SetOprSelectList{Selects: x.SelectList.Selects, With: x.With, Limit: x.Limit, OrderBy: x.OrderBy}} } - setOpr := &ast.SetOprStmt{SelectList: &ast.SetOprSelectList{Selects: setOprList}, With: with} + setOpr := &ast.SetOprStmt{SelectList: &ast.SetOprSelectList{Selects: setOprList}} setOpr.OrderBy = $2.(*ast.OrderByClause) setOpr.Limit = $3.(*ast.Limit) $$ = setOpr @@ -10420,7 +10419,7 @@ SetOprClause: case *ast.SelectStmt: setOprList = []ast.Node{&ast.SetOprSelectList{Selects: []ast.Node{x}}} case *ast.SetOprStmt: - setOprList = []ast.Node{&ast.SetOprSelectList{Selects: x.SelectList.Selects, With: x.With}} + setOprList = []ast.Node{&ast.SetOprSelectList{Selects: x.SelectList.Selects, With: x.With, Limit: x.Limit, OrderBy: x.OrderBy}} } $$ = setOprList } @@ -10931,18 +10930,10 @@ BDRRole: { $$ = ast.BDRRolePrimary } -| "SECONDARY" +| "SECONDARY" { $$ = ast.BDRRoleSecondary } -| "LOCAL_ONLY" - { - $$ = ast.BDRRoleLocalOnly - } -| "NONE" - { - $$ = ast.BDRRoleNone - } AdminStmt: "ADMIN" "SHOW" "DDL" @@ -11170,7 +11161,13 @@ AdminStmt: | "ADMIN" "SHOW" "BDR" "ROLE" { $$ = &ast.AdminStmt{ - Tp: ast.AdminShowBDRRole, + Tp: ast.AdminShowBDRRole, + } + } +| "ADMIN" "UNSET" "BDR" "ROLE" + { + $$ = &ast.AdminStmt{ + Tp: ast.AdminUnsetBDRRole, } } @@ -11365,6 +11362,15 @@ ShowStmt: Tp: ast.ShowBinlogStatus, } } +| "SHOW" Replica "STATUS" + // From MySQL 8.0.22, use SHOW REPLICA STATUS in place of SHOW SLAVE STATUS, + // which is deprecated from that release. In releases before MySQL 8.0.22, + // use SHOW SLAVE STATUS. + { + $$ = &ast.ShowStmt{ + Tp: ast.ShowReplicaStatus, + } + } | "SHOW" OptFull "PROCESSLIST" { $$ = &ast.ShowStmt{ @@ -11840,6 +11846,10 @@ ShowTableAliasOpt: $$ = $2.(*ast.TableName) } +Replica: + "REPLICA" +| "SLAVE" + FlushStmt: "FLUSH" NoWriteToBinLogAliasOpt FlushOption { @@ -12081,10 +12091,8 @@ Statement: | RestartStmt | HelpStmt | NonTransactionalDMLStmt -| PauseLoadDataStmt -| ResumeLoadDataStmt +| OptimizeTableStmt | CancelImportStmt -| DropLoadDataStmt TraceableStmt: DeleteFromStmt @@ -12138,6 +12146,7 @@ ExplainableStmt: $$ = sel } | AlterTableStmt +| ImportIntoStmt StatementList: Statement @@ -13820,6 +13829,20 @@ CreateBindingStmt: GlobalScope: $2.(bool), } + $$ = x + } +| "CREATE" GlobalScope "BINDING" "USING" BindableStmt + { + startOffset := parser.startOffset(&yyS[yypt]) + hintedStmt := $5 + hintedStmt.SetText(parser.lexer.client, strings.TrimSpace(parser.src[startOffset:])) + + x := &ast.CreateBindingStmt{ + OriginNode: hintedStmt, + HintedNode: hintedStmt, + GlobalScope: $2.(bool), + } + $$ = x } | "CREATE" GlobalScope "BINDING" "FROM" "HISTORY" "USING" "PLAN" "DIGEST" stringLit @@ -14604,6 +14627,54 @@ ImportIntoStmt: Options: $9.([]*ast.LoadDataOpt), } } +| "IMPORT" "INTO" TableName ColumnNameOrUserVarListOptWithBrackets LoadDataSetSpecOpt "FROM" ImportFromSelectStmt LoadDataOptionListOpt + /* LoadDataSetSpecOpt is used to avoid shift/reduce conflict, we don't support it actually */ + { + st := &ast.ImportIntoStmt{ + Table: $3.(*ast.TableName), + ColumnsAndUserVars: $4.([]*ast.ColumnNameOrUserVar), + Select: $7.(ast.ResultSetNode), + Options: $8.([]*ast.LoadDataOpt), + } + for _, cu := range st.ColumnsAndUserVars { + if cu.ColumnName == nil { + yylex.AppendError(yylex.Errorf("Cannot use user variable(%s) in IMPORT INTO FROM SELECT statement.", cu.UserVar.Name)) + return 1 + } + } + if $5.([]*ast.Assignment) != nil { + yylex.AppendError(yylex.Errorf("Cannot use SET clause in IMPORT INTO FROM SELECT statement.")) + return 1 + } + $$ = st + } + +ImportFromSelectStmt: + SelectStmt + { + $$ = $1 + } +| SetOprStmt + { + $$ = $1 + } +| SelectStmtWithClause + { + $$ = $1 + } +| SubSelect + { + var sel ast.ResultSetNode + switch x := $1.(*ast.SubqueryExpr).Query.(type) { + case *ast.SelectStmt: + x.IsInBraces = true + sel = x + case *ast.SetOprStmt: + x.IsInBraces = true + sel = x + } + $$ = sel.(ast.StmtNode) + } /********************************************************************* * Lock/Unlock Tables @@ -14708,6 +14779,21 @@ OptionalShardColumn: $$ = $2.(*ast.ColumnName) } +/******************************************************************** + * OptimizeTableStmt + * + * OPTIMIZE [NO_WRITE_TO_BINLOG | LOCAL] + * TABLE tbl_name [, tbl_name] ... + *******************************************************************/ +OptimizeTableStmt: + "OPTIMIZE" NoWriteToBinLogAliasOpt TableOrTables TableNameList + { + $$ = &ast.OptimizeTableStmt{ + Tables: $4.([]*ast.TableName), + NoWriteToBinLog: $2.(bool), + } + } + /******************************************************************** * Kill Statement * See https://dev.mysql.com/doc/refman/5.7/en/kill.html diff --git a/pkg/parser/parser_test.go b/pkg/parser/parser_test.go index 17bfc31a782e6..4117de8b8d820 100644 --- a/pkg/parser/parser_test.go +++ b/pkg/parser/parser_test.go @@ -515,10 +515,9 @@ func TestAdminStmt(t *testing.T) { // We do not support the global level. We will check it in the later. {"admin flush global plan_cache", true, "ADMIN FLUSH GLOBAL PLAN_CACHE"}, // for BDR - {"admin set bdr role none", true, "ADMIN SET BDR ROLE NONE"}, {"admin set bdr role primary", true, "ADMIN SET BDR ROLE PRIMARY"}, {"admin set bdr role secondary", true, "ADMIN SET BDR ROLE SECONDARY"}, - {"admin set bdr role local_only", true, "ADMIN SET BDR ROLE LOCAL_ONLY"}, + {"admin unset bdr role", true, "ADMIN UNSET BDR ROLE"}, {"admin show bdr role", true, "ADMIN SHOW BDR ROLE"}, } RunTest(t, table, false) @@ -1151,6 +1150,9 @@ AAAAAAAAAAAA5gm5Mg== {"query watch add SQL TEXT SIMILAR 'select 1'", false, ""}, {"query watch remove 1", true, "QUERY WATCH REMOVE 1"}, {"query watch remove", false, ""}, + + // for issue 34325, "replace into" with hints + {"replace /*+ SET_VAR(sql_mode='ALLOW_INVALID_DATES') */ into t values ('2004-04-31');", true, "REPLACE /*+ SET_VAR(sql_mode = 'ALLOW_INVALID_DATES')*/ INTO `t` VALUES (_UTF8MB4'2004-04-31')"}, } RunTest(t, table, false) } @@ -1276,6 +1278,8 @@ func TestDBAStmt(t *testing.T) { {"show backups where start_time > now() - interval 10 hour", true, "SHOW BACKUPS WHERE `start_time`>DATE_SUB(NOW(), INTERVAL 10 HOUR)"}, {"show backup", false, ""}, {"show restore", false, ""}, + {"show replica status", true, "SHOW REPLICA STATUS"}, + {"show slave status", true, "SHOW REPLICA STATUS"}, // for load stats {"load stats '/tmp/stats.json'", true, "LOAD STATS '/tmp/stats.json'"}, @@ -3910,13 +3914,13 @@ func TestHintError(t *testing.T) { stmt, warns, err := p.Parse("select /*+ tidb_unknown(T1,t2) */ c1, c2 from t1, t2 where t1.c1 = t2.c1", "", "") require.NoError(t, err) require.Len(t, warns, 1) - require.Regexp(t, `Optimizer hint syntax error at line 1 column 23 near "tidb_unknown\(T1,t2\) \*/" $`, warns[0].Error()) - require.Len(t, stmt[0].(*ast.SelectStmt).TableHints, 0) - stmt, warns, err = p.Parse("select /*+ TIDB_INLJ(t1, T2) tidb_unknow(T1,t2, 1) */ c1, c2 from t1, t2 where t1.c1 = t2.c1", "", "") + require.Equal(t, `[parser:8061]Optimizer hint tidb_unknown is not supported by TiDB and is ignored`, warns[0].Error()) require.Len(t, stmt[0].(*ast.SelectStmt).TableHints, 0) + stmt, warns, err = p.Parse("select /*+ TIDB_INLJ(t1, T2) tidb_unknown(T1,t2, 1) */ c1, c2 from t1, t2 where t1.c1 = t2.c1", "", "") + require.Len(t, stmt[0].(*ast.SelectStmt).TableHints, 1) require.NoError(t, err) require.Len(t, warns, 1) - require.Regexp(t, `Optimizer hint syntax error at line 1 column 40 near "tidb_unknow\(T1,t2, 1\) \*/" $`, warns[0].Error()) + require.Equal(t, `[parser:8061]Optimizer hint tidb_unknown is not supported by TiDB and is ignored`, warns[0].Error()) _, _, err = p.Parse("select c1, c2 from /*+ tidb_unknow(T1,t2) */ t1, t2 where t1.c1 = t2.c1", "", "") require.NoError(t, err) // Hints are ignored after the "FROM" keyword! _, _, err = p.Parse("select1 /*+ TIDB_INLJ(t1, T2) */ c1, c2 from t1, t2 where t1.c1 = t2.c1", "", "") @@ -3959,6 +3963,12 @@ func TestErrorMsg(t *testing.T) { _, _, err = p.Parse("create table t(f_year year(5))ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;", "", "") require.EqualError(t, err, "[parser:1818]Supports only YEAR or YEAR(4) column") + _, _, err = p.Parse("create table ``.t (id int);", "", "") + require.EqualError(t, err, "[parser:1102]Incorrect database name ''") + + _, _, err = p.Parse("create table ` `.t (id int);", "", "") + require.EqualError(t, err, "[parser:1102]Incorrect database name ' '") + _, _, err = p.Parse("select ifnull(a,0) & ifnull(a,0) like '55' ESCAPE '\\\\a' from t;", "", "") require.EqualError(t, err, "[parser:1210]Incorrect arguments to ESCAPE") @@ -5156,6 +5166,16 @@ func TestSetOperator(t *testing.T) { {"(select c1 from t1) union all (select c2 from t2 except select c3 from t3) order by c1 limit 1", true, "(SELECT `c1` FROM `t1`) UNION ALL (SELECT `c2` FROM `t2` EXCEPT SELECT `c3` FROM `t3`) ORDER BY `c1` LIMIT 1"}, {"((select c1 from t1) except select c2 from t2) intersect all (select c3 from t3) order by c1 limit 1", true, "((SELECT `c1` FROM `t1`) EXCEPT SELECT `c2` FROM `t2`) INTERSECT ALL (SELECT `c3` FROM `t3`) ORDER BY `c1` LIMIT 1"}, {"select 1 union distinct (select 1 except all select 1 intersect select 1)", true, "SELECT 1 UNION (SELECT 1 EXCEPT ALL SELECT 1 INTERSECT SELECT 1)"}, + + // https://github.com/pingcap/tidb/issues/49874 + {"select * from a where PK = 0 union all (select * from b where PK = 0 union all (select * from b where PK != 0) order by pk limit 1)", true, + "SELECT * FROM `a` WHERE `PK`=0 UNION ALL (SELECT * FROM `b` WHERE `PK`=0 UNION ALL (SELECT * FROM `b` WHERE `PK`!=0) ORDER BY `pk` LIMIT 1)"}, + {"select * from a where PK = 0 union all (select * from b where PK = 0 union all (select * from b where PK != 0) order by pk limit 1) order by pk limit 2", true, + "SELECT * FROM `a` WHERE `PK`=0 UNION ALL (SELECT * FROM `b` WHERE `PK`=0 UNION ALL (SELECT * FROM `b` WHERE `PK`!=0) ORDER BY `pk` LIMIT 1) ORDER BY `pk` LIMIT 2"}, + {"(select * from b where pk= 0 union all (select * from b where pk !=0) order by pk limit 1) order by pk limit 2", true, + "(SELECT * FROM `b` WHERE `pk`=0 UNION ALL (SELECT * FROM `b` WHERE `pk`!=0) ORDER BY `pk` LIMIT 1) ORDER BY `pk` LIMIT 2"}, + {"(select * from b where pk= 0 union all (select * from b where pk !=0) order by pk limit 1) order by pk", true, + "(SELECT * FROM `b` WHERE `pk`=0 UNION ALL (SELECT * FROM `b` WHERE `pk`!=0) ORDER BY `pk` LIMIT 1) ORDER BY `pk`"}, } RunTest(t, table, false) } @@ -5476,6 +5496,11 @@ func TestBinding(t *testing.T) { {"create session binding for select 1 union select 2 intersect select 3 using select 1 union select 2 intersect select 3", true, "CREATE SESSION BINDING FOR SELECT 1 UNION SELECT 2 INTERSECT SELECT 3 USING SELECT 1 UNION SELECT 2 INTERSECT SELECT 3"}, {"drop session binding for select 1 union select 2 intersect select 3 using select 1 union select 2 intersect select 3", true, "DROP SESSION BINDING FOR SELECT 1 UNION SELECT 2 INTERSECT SELECT 3 USING SELECT 1 UNION SELECT 2 INTERSECT SELECT 3"}, {"drop session binding for select 1 union select 2 intersect select 3", true, "DROP SESSION BINDING FOR SELECT 1 UNION SELECT 2 INTERSECT SELECT 3"}, + // Use wildcards when creating binding + {"create global binding using select * from *.t1", true, "CREATE GLOBAL BINDING FOR SELECT * FROM `*`.`t1` USING SELECT * FROM `*`.`t1`"}, + {"create global binding using select * from *.t1 where t1.a > (select max(a) from t2)", true, "CREATE GLOBAL BINDING FOR SELECT * FROM `*`.`t1` WHERE `t1`.`a`>(SELECT MAX(`a`) FROM `t2`) USING SELECT * FROM `*`.`t1` WHERE `t1`.`a`>(SELECT MAX(`a`) FROM `t2`)"}, + {"create session binding using select * from *.t1", true, "CREATE SESSION BINDING FOR SELECT * FROM `*`.`t1` USING SELECT * FROM `*`.`t1`"}, + {"create binding using select * from *.t1", true, "CREATE SESSION BINDING FOR SELECT * FROM `*`.`t1` USING SELECT * FROM `*`.`t1`"}, // Update cases. {"CREATE GLOBAL BINDING FOR UPDATE `t` SET `a`=1 WHERE `b`=1 USING UPDATE /*+ USE_INDEX(`t` `b`)*/ `t` SET `a`=1 WHERE `b`=1", true, "CREATE GLOBAL BINDING FOR UPDATE `t` SET `a`=1 WHERE `b`=1 USING UPDATE /*+ USE_INDEX(`t` `b`)*/ `t` SET `a`=1 WHERE `b`=1"}, {"CREATE SESSION BINDING FOR UPDATE `t` SET `a`=1 WHERE `b`=1 USING UPDATE /*+ USE_INDEX(`t` `b`)*/ `t` SET `a`=1 WHERE `b`=1", true, "CREATE SESSION BINDING FOR UPDATE `t` SET `a`=1 WHERE `b`=1 USING UPDATE /*+ USE_INDEX(`t` `b`)*/ `t` SET `a`=1 WHERE `b`=1"}, @@ -5879,6 +5904,8 @@ func TestAnalyze(t *testing.T) { {"analyze table t index a predicate columns", false, ""}, {"analyze table t with 10 samplerate", true, "ANALYZE TABLE `t` WITH 10 SAMPLERATE"}, {"analyze table t with 0.1 samplerate", true, "ANALYZE TABLE `t` WITH 0.1 SAMPLERATE"}, + {"analyze no_write_to_binlog table t1", true, "ANALYZE NO_WRITE_TO_BINLOG TABLE `t1`"}, + {"analyze local table t,t1", true, "ANALYZE NO_WRITE_TO_BINLOG TABLE `t`,`t1`"}, } RunTest(t, table, false) } diff --git a/pkg/parser/yy_parser.go b/pkg/parser/yy_parser.go index eb60bb4972962..db2f96bd1a174 100644 --- a/pkg/parser/yy_parser.go +++ b/pkg/parser/yy_parser.go @@ -58,6 +58,8 @@ var ( ErrWarnDeprecatedSyntaxNoReplacement = terror.ClassParser.NewStd(mysql.ErrWarnDeprecatedSyntaxNoReplacement) // ErrWrongUsage returns for incorrect usages. ErrWrongUsage = terror.ClassParser.NewStd(mysql.ErrWrongUsage) + // ErrWrongDBName returns for incorrect DB name. + ErrWrongDBName = terror.ClassParser.NewStd(mysql.ErrWrongDBName) // SpecFieldPattern special result field pattern SpecFieldPattern = regexp.MustCompile(`(\/\*!(M?[0-9]{5,6})?|\*\/)`) specCodeStart = regexp.MustCompile(`^\/\*!(M?[0-9]{5,6})?[ \t]*`) diff --git a/pkg/planner/BUILD.bazel b/pkg/planner/BUILD.bazel index 8c23060065bc3..4ea86a7384bc5 100644 --- a/pkg/planner/BUILD.bazel +++ b/pkg/planner/BUILD.bazel @@ -11,7 +11,6 @@ go_library( "//pkg/infoschema", "//pkg/kv", "//pkg/metrics", - "//pkg/parser", "//pkg/parser/ast", "//pkg/planner/cascades", "//pkg/planner/core", @@ -25,7 +24,6 @@ go_library( "//pkg/util/hint", "//pkg/util/intest", "//pkg/util/logutil", - "//pkg/util/parser", "//pkg/util/topsql", "@com_github_pingcap_errors//:errors", "@com_github_pingcap_failpoint//:failpoint", diff --git a/pkg/planner/cardinality/main_test.go b/pkg/planner/cardinality/main_test.go index 4831dcefa4953..57c1e1d4fcb38 100644 --- a/pkg/planner/cardinality/main_test.go +++ b/pkg/planner/cardinality/main_test.go @@ -43,6 +43,7 @@ func TestMain(m *testing.M) { opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), diff --git a/pkg/planner/cardinality/row_count_index.go b/pkg/planner/cardinality/row_count_index.go index 6c809df236f71..467b73f2fa81e 100644 --- a/pkg/planner/cardinality/row_count_index.go +++ b/pkg/planner/cardinality/row_count_index.go @@ -50,20 +50,16 @@ func GetRowCountByIndexRanges(sctx sessionctx.Context, coll *statistics.HistColl sc := sctx.GetSessionVars().StmtCtx idx, ok := coll.Indices[idxID] colNames := make([]string, 0, 8) - isMVIndex := false if ok { if idx.Info != nil { name = idx.Info.Name.O for _, col := range idx.Info.Columns { colNames = append(colNames, col.Name.O) } - isMVIndex = idx.Info.MVIndex } } recordUsedItemStatsStatus(sctx, idx, coll.PhysicalID, idxID) - // For the mv index case, now we have supported collecting stats and async loading stats, but sync loading and - // estimation is not well-supported, so we keep mv index using pseudo estimation for this period of time. - if !ok || idx.IsInvalid(sctx, coll.Pseudo) || isMVIndex { + if !ok || idx.IsInvalid(sctx, coll.Pseudo) { colsLen := -1 if idx != nil && idx.Info.Unique { colsLen = len(idx.Info.Columns) @@ -74,17 +70,18 @@ func GetRowCountByIndexRanges(sctx sessionctx.Context, coll *statistics.HistColl } return result, err } + realtimeCnt, modifyCount := coll.GetScaledRealtimeAndModifyCnt(idx) if sctx.GetSessionVars().StmtCtx.EnableOptimizerDebugTrace { debugtrace.RecordAnyValuesWithNames(sctx, "Histogram NotNull Count", idx.Histogram.NotNullCount(), "TopN total count", idx.TopN.TotalCount(), - "Increase Factor", idx.GetIncreaseFactor(coll.RealtimeCount), + "Increase Factor", idx.GetIncreaseFactor(realtimeCnt), ) } if idx.CMSketch != nil && idx.StatsVer == statistics.Version1 { result, err = getIndexRowCountForStatsV1(sctx, coll, idxID, indexRanges) } else { - result, err = getIndexRowCountForStatsV2(sctx, idx, coll, indexRanges, coll.RealtimeCount, coll.ModifyCount) + result, err = getIndexRowCountForStatsV2(sctx, idx, coll, indexRanges, realtimeCnt, modifyCount) } if sc.EnableOptimizerCETrace { ceTraceRange(sctx, coll.PhysicalID, colNames, indexRanges, "Index Stats", uint64(result)) @@ -118,7 +115,8 @@ func getIndexRowCountForStatsV1(sctx sessionctx.Context, coll *statistics.HistCo // on single-column index, use previous way as well, because CMSketch does not contain null // values in this case. if rangePosition == 0 || isSingleColIdxNullRange(idx, ran) { - count, err := getIndexRowCountForStatsV2(sctx, idx, nil, []*ranger.Range{ran}, coll.RealtimeCount, coll.ModifyCount) + realtimeCnt, modifyCount := coll.GetScaledRealtimeAndModifyCnt(idx) + count, err := getIndexRowCountForStatsV2(sctx, idx, nil, []*ranger.Range{ran}, realtimeCnt, modifyCount) if err != nil { return 0, errors.Trace(err) } @@ -432,13 +430,15 @@ func expBackoffEstimation(sctx sessionctx.Context, idx *statistics.Index, coll * } colID := colsIDs[i] var ( - count float64 - err error - foundStats bool + count float64 + selectivity float64 + err error + foundStats bool ) if col, ok := coll.Columns[colID]; ok && !col.IsInvalid(sctx, coll.Pseudo) { foundStats = true count, err = GetRowCountByColumnRanges(sctx, coll, colID, tmpRan) + selectivity = count / float64(coll.RealtimeCount) } if idxIDs, ok := coll.ColID2IdxIDs[colID]; ok && !foundStats && len(indexRange.LowVal) > 1 { // Note the `len(indexRange.LowVal) > 1` condition here, it means we only recursively call @@ -448,11 +448,17 @@ func expBackoffEstimation(sctx sessionctx.Context, idx *statistics.Index, coll * if idxID == idx.Histogram.ID { continue } + idxStats, ok := coll.Indices[idxID] + if !ok || idxStats.IsInvalid(sctx, coll.Pseudo) { + continue + } foundStats = true count, err = GetRowCountByIndexRanges(sctx, coll, idxID, tmpRan) if err == nil { break } + realtimeCnt, _ := coll.GetScaledRealtimeAndModifyCnt(idxStats) + selectivity = count / float64(realtimeCnt) } } if !foundStats { @@ -461,15 +467,11 @@ func expBackoffEstimation(sctx sessionctx.Context, idx *statistics.Index, coll * if err != nil { return 0, false, err } - singleColumnEstResults = append(singleColumnEstResults, count) + singleColumnEstResults = append(singleColumnEstResults, selectivity) } // Sort them. slices.Sort(singleColumnEstResults) l := len(singleColumnEstResults) - // Convert the first 4 to selectivity results. - for i := 0; i < l && i < 4; i++ { - singleColumnEstResults[i] = singleColumnEstResults[i] / float64(coll.RealtimeCount) - } failpoint.Inject("cleanEstResults", func() { singleColumnEstResults = singleColumnEstResults[:0] l = 0 diff --git a/pkg/planner/cardinality/selectivity.go b/pkg/planner/cardinality/selectivity.go index 966e892439864..023d56ef60025 100644 --- a/pkg/planner/cardinality/selectivity.go +++ b/pkg/planner/cardinality/selectivity.go @@ -23,6 +23,7 @@ import ( "github.com/pingcap/errors" "github.com/pingcap/tidb/pkg/expression" "github.com/pingcap/tidb/pkg/parser/ast" + "github.com/pingcap/tidb/pkg/parser/model" planutil "github.com/pingcap/tidb/pkg/planner/util" "github.com/pingcap/tidb/pkg/planner/util/debugtrace" "github.com/pingcap/tidb/pkg/sessionctx" @@ -32,6 +33,7 @@ import ( "github.com/pingcap/tidb/pkg/util/codec" "github.com/pingcap/tidb/pkg/util/collate" "github.com/pingcap/tidb/pkg/util/logutil" + "github.com/pingcap/tidb/pkg/util/mathutil" "github.com/pingcap/tidb/pkg/util/ranger" "go.uber.org/zap" "golang.org/x/exp/maps" @@ -157,6 +159,21 @@ func Selectivity( slices.Sort(idxIDs) for _, id := range idxIDs { idxStats := coll.Indices[id] + idxInfo := idxStats.Info + if idxInfo.MVIndex { + totalSelectivity, mask, ok := getMaskAndSelectivityForMVIndex(ctx, coll, id, remainedExprs) + if !ok { + continue + } + nodes = append(nodes, &StatsNode{ + Tp: IndexType, + ID: id, + mask: mask, + numCols: len(idxInfo.Columns), + Selectivity: totalSelectivity, + }) + continue + } idxCols := findPrefixOfIndexByCol(ctx, extractedCols, coll.Idx2ColumnIDs[id], id2Paths[idxStats.ID]) if len(idxCols) > 0 { lengths := make([]int, 0, len(idxCols)) @@ -359,7 +376,7 @@ OUTER: for i, scalarCond := range notCoveredStrMatch { ok, sel, err := GetSelectivityByFilter(ctx, coll, []expression.Expression{scalarCond}) if err != nil { - sc.AppendWarning(errors.New("Error when using TopN-assisted estimation: " + err.Error())) + sc.AppendWarning(errors.NewNoStackError("Error when using TopN-assisted estimation: " + err.Error())) } if !ok { continue @@ -374,7 +391,7 @@ OUTER: for i, scalarCond := range notCoveredNegateStrMatch { ok, sel, err := GetSelectivityByFilter(ctx, coll, []expression.Expression{scalarCond}) if err != nil { - sc.AppendWarning(errors.New("Error when using TopN-assisted estimation: " + err.Error())) + sc.AppendWarning(errors.NewNoStackError("Error when using TopN-assisted estimation: " + err.Error())) } if !ok { continue @@ -417,6 +434,92 @@ OUTER: return ret, nodes, nil } +// CalcTotalSelectivityForMVIdxPath calculates the total selectivity for the given partial paths of an MV index merge path. +// It corresponds with the meaning of AccessPath.CountAfterAccess, as used in buildPartialPathUp4MVIndex. +// It uses the independence assumption to estimate the selectivity. +func CalcTotalSelectivityForMVIdxPath( + coll *statistics.HistColl, + partialPaths []*planutil.AccessPath, + isIntersection bool, +) float64 { + selectivities := make([]float64, 0, len(partialPaths)) + for _, path := range partialPaths { + // For a partial path, we distinguish between two cases if it's a mv index path. + // 1. We will access a single value on the virtual column of the mv index. + // In this case, handles from a single partial path must be unique. + // The CountAfterAccess of a partial path will never be larger than the table total row count. + // For an index merge path with only one partial path, the CountAfterAccess will be exactly the same as the + // CountAfterAccess of the partial path (currently there's no index filter for partial path of mv index merge + // path). + // 2. We use the mv index as if it's a non-MV index, which means the virtual column is not involved in the access + // conditions. + // In this case, we may read repeated handles from a single partial path. + // The CountAfterAccess of a partial path might be larger than the table total row count. + // For an index merge path with only one partial path, the CountAfterAccess might be less than the CountAfterAccess + // of the partial path + // For example: + // create table t(a int, d json, index iad(a, (cast(d->'$.b' as signed array)))); + // insert into t value(1,'{"b":[1,2,3,4]}'), (2,'{"b":[3,4,5,6]}'); + // The index has 8 entries. + // Case 1: + // select * from t use index (iad) where a = 1 and 1 member of (d->'$.b'); + // IndexMerge + // ├─IndexRangeScan RowCount:1 Range:[1 1,1 1] + // └─TableRowIDScan RowCount:1 + // Case 2: + // select * from t use index (iad) where a = 1; + // IndexMerge + // ├─IndexRangeScan RowCount:4 Range:[1,1] + // └─TableRowIDScan RowCount:1 + // From the example, it should be obvious that we need different total row count to calculate the selectivity of + // the access conditions: + // Case 1: Here we should use the table total row count + // Selectivity( a = 1 and 1 member of (d->'$.b') ) = 1 / 2 + // Case 2: Here we should use the index total row count + // Selectivity( a = 1 ) = 4 / 8 + // + // Now, the `Case 2` above has been avoided because a mv index may not contain all rows. See the related issue + // https://github.com/pingcap/tidb/issues/50125 and fix https://github.com/pingcap/tidb/pull/50183 + realtimeCount := coll.RealtimeCount + if !path.IsTablePath() && path.Index.MVIndex { + var virtualCol *expression.Column + for _, col := range coll.MVIdx2Columns[path.Index.ID] { + if col.VirtualExpr != nil { + virtualCol = col + break + } + } + cols := expression.ExtractColumnsFromExpressions( + nil, + path.AccessConds, + func(column *expression.Column) bool { + return virtualCol != nil && column.UniqueID == virtualCol.UniqueID + }, + ) + // If we can't find the virtual column from the access conditions, it's the case 2. + if len(cols) == 0 { + realtimeCount, _ = coll.GetScaledRealtimeAndModifyCnt(coll.Indices[path.Index.ID]) + } + } + sel := path.CountAfterAccess / float64(realtimeCount) + sel = mathutil.Clamp(sel, 0, 1) + selectivities = append(selectivities, sel) + } + var totalSelectivity float64 + if isIntersection { + totalSelectivity = 1 + for _, sel := range selectivities { + totalSelectivity *= sel + } + } else { + totalSelectivity = 0 + for _, sel := range selectivities { + totalSelectivity = (sel + totalSelectivity) - totalSelectivity*sel + } + } + return totalSelectivity +} + // StatsNode is used for calculating selectivity. type StatsNode struct { // Ranges contains all the Ranges we got. @@ -621,6 +724,36 @@ func getMaskAndRanges(ctx sessionctx.Context, exprs []expression.Expression, ran return mask, ranges, false, nil } +func getMaskAndSelectivityForMVIndex( + ctx sessionctx.Context, + coll *statistics.HistColl, + id int64, + exprs []expression.Expression, +) (float64, int64, bool) { + cols := coll.MVIdx2Columns[id] + if len(cols) == 0 { + return 1.0, 0, false + } + // You can find more examples and explanations in comments for collectFilters4MVIndex() and + // buildPartialPaths4MVIndex() in planner/core. + accessConds, _ := CollectFilters4MVIndex(ctx, exprs, cols) + paths, isIntersection, ok, err := BuildPartialPaths4MVIndex(ctx, accessConds, cols, coll.Indices[id].Info, coll) + if err != nil || !ok { + return 1.0, 0, false + } + totalSelectivity := CalcTotalSelectivityForMVIdxPath(coll, paths, isIntersection) + var mask int64 + for i := range exprs { + for _, accessCond := range accessConds { + if exprs[i].Equal(ctx, accessCond) { + mask |= 1 << uint64(i) + break + } + } + } + return totalSelectivity, mask, true +} + // GetSelectivityByFilter try to estimate selectivity of expressions by evaluate the expressions using TopN, Histogram buckets boundaries and NULL. // Currently, this method can only handle expressions involving a single column. func GetSelectivityByFilter(sctx sessionctx.Context, coll *statistics.HistColl, filters []expression.Expression) (ok bool, selectivity float64, err error) { @@ -820,10 +953,11 @@ func getEqualCondSelectivity(sctx sessionctx.Context, coll *statistics.HistColl, } val := types.NewBytesDatum(bytes) if outOfRangeOnIndex(idx, val) { + realtimeCnt, _ := coll.GetScaledRealtimeAndModifyCnt(idx) // When the value is out of range, we could not found this value in the CM Sketch, // so we use heuristic methods to estimate the selectivity. if idx.NDV > 0 && coverAll { - return outOfRangeEQSelectivity(sctx, idx.NDV, coll.RealtimeCount, int64(idx.TotalRowCount())), nil + return outOfRangeEQSelectivity(sctx, idx.NDV, realtimeCnt, int64(idx.TotalRowCount())), nil } // The equal condition only uses prefix columns of the index. colIDs := coll.Idx2ColumnIDs[idx.ID] @@ -836,7 +970,7 @@ func getEqualCondSelectivity(sctx sessionctx.Context, coll *statistics.HistColl, ndv = max(ndv, col.Histogram.NDV) } } - return outOfRangeEQSelectivity(sctx, ndv, coll.RealtimeCount, int64(idx.TotalRowCount())), nil + return outOfRangeEQSelectivity(sctx, ndv, realtimeCnt, int64(idx.TotalRowCount())), nil } minRowCount, crossValidSelectivity, err := crossValidationSelectivity(sctx, coll, idx, usedColsLen, idxPointRange) @@ -942,3 +1076,29 @@ func crossValidationSelectivity( } return minRowCount, crossValidationSelectivity, nil } + +// CollectFilters4MVIndex and BuildPartialPaths4MVIndex are for matching JSON expressions against mv index. +// This logic is shared between the estimation logic and the access path generation logic. But the two functions are +// defined in planner/core package and hard to move here. So we use this trick to avoid the import cycle. +var ( + CollectFilters4MVIndex func( + sctx sessionctx.Context, + filters []expression.Expression, + idxCols []*expression.Column, + ) ( + accessFilters, + remainingFilters []expression.Expression, + ) + BuildPartialPaths4MVIndex func( + sctx sessionctx.Context, + accessFilters []expression.Expression, + idxCols []*expression.Column, + mvIndex *model.IndexInfo, + histColl *statistics.HistColl, + ) ( + partialPaths []*planutil.AccessPath, + isIntersection bool, + ok bool, + err error, + ) +) diff --git a/pkg/planner/cardinality/testdata/cardinality_suite_out.json b/pkg/planner/cardinality/testdata/cardinality_suite_out.json index 99032fe5faa10..83c900806704f 100644 --- a/pkg/planner/cardinality/testdata/cardinality_suite_out.json +++ b/pkg/planner/cardinality/testdata/cardinality_suite_out.json @@ -198,40 +198,40 @@ { "SQL": "explain format = 'brief' select * from t where a > 800 and a < 1000", "Result": [ - "TableReader 793.13 root data:Selection", - "└─Selection 793.13 cop[tikv] gt(test.t.a, 800), lt(test.t.a, 1000)", + "TableReader 793.20 root data:Selection", + "└─Selection 793.20 cop[tikv] gt(test.t.a, 800), lt(test.t.a, 1000)", " └─TableFullScan 2000.00 cop[tikv] table:t keep order:false" ] }, { "SQL": "explain format = 'brief' select * from t where a > 900 and a < 1000", "Result": [ - "TableReader 458.12 root data:Selection", - "└─Selection 458.12 cop[tikv] gt(test.t.a, 900), lt(test.t.a, 1000)", + "TableReader 458.19 root data:Selection", + "└─Selection 458.19 cop[tikv] gt(test.t.a, 900), lt(test.t.a, 1000)", " └─TableFullScan 2000.00 cop[tikv] table:t keep order:false" ] }, { "SQL": "explain format = 'brief' select * from t where a > 900 and a < 1100", "Result": [ - "TableReader 832.49 root data:Selection", - "└─Selection 832.49 cop[tikv] gt(test.t.a, 900), lt(test.t.a, 1100)", + "TableReader 832.77 root data:Selection", + "└─Selection 832.77 cop[tikv] gt(test.t.a, 900), lt(test.t.a, 1100)", " └─TableFullScan 2000.00 cop[tikv] table:t keep order:false" ] }, { "SQL": "explain format = 'brief' select * from t where a > 200 and a < 300", "Result": [ - "TableReader 458.12 root data:Selection", - "└─Selection 458.12 cop[tikv] gt(test.t.a, 200), lt(test.t.a, 300)", + "TableReader 459.03 root data:Selection", + "└─Selection 459.03 cop[tikv] gt(test.t.a, 200), lt(test.t.a, 300)", " └─TableFullScan 2000.00 cop[tikv] table:t keep order:false" ] }, { "SQL": "explain format = 'brief' select * from t where a > 100 and a < 300", "Result": [ - "TableReader 832.49 root data:Selection", - "└─Selection 832.49 cop[tikv] gt(test.t.a, 100), lt(test.t.a, 300)", + "TableReader 834.45 root data:Selection", + "└─Selection 834.45 cop[tikv] gt(test.t.a, 100), lt(test.t.a, 300)", " └─TableFullScan 2000.00 cop[tikv] table:t keep order:false" ] }, diff --git a/pkg/planner/cascades/BUILD.bazel b/pkg/planner/cascades/BUILD.bazel index 683ca0a738bea..4fde550d48db1 100644 --- a/pkg/planner/cascades/BUILD.bazel +++ b/pkg/planner/cascades/BUILD.bazel @@ -34,7 +34,6 @@ go_test( timeout = "short", srcs = [ "enforcer_rules_test.go", - "integration_test.go", "main_test.go", "optimize_test.go", "stringer_test.go", @@ -43,7 +42,7 @@ go_test( data = glob(["testdata/**"]), embed = [":cascades"], flaky = True, - shard_count = 26, + shard_count = 25, deps = [ "//pkg/domain", "//pkg/expression", @@ -53,10 +52,8 @@ go_test( "//pkg/planner/core", "//pkg/planner/memo", "//pkg/planner/property", - "//pkg/testkit", "//pkg/testkit/testdata", "//pkg/testkit/testsetup", - "@com_github_pingcap_failpoint//:failpoint", "@com_github_stretchr_testify//require", "@org_uber_go_goleak//:goleak", ], diff --git a/pkg/planner/cascades/enforcer_rules.go b/pkg/planner/cascades/enforcer_rules.go index 250a8b33aa535..19e96ce5a439d 100644 --- a/pkg/planner/cascades/enforcer_rules.go +++ b/pkg/planner/cascades/enforcer_rules.go @@ -65,7 +65,7 @@ func (*OrderEnforcer) OnEnforce(reqProp *property.PhysicalProperty, child memo.I childPlan := child.GetPlan() sort := plannercore.PhysicalSort{ ByItems: make([]*util.ByItems, 0, len(reqProp.SortItems)), - }.Init(childPlan.SCtx(), childPlan.StatsInfo(), childPlan.SelectBlockOffset(), &property.PhysicalProperty{ExpectedCnt: math.MaxFloat64}) + }.Init(childPlan.SCtx(), childPlan.StatsInfo(), childPlan.QueryBlockOffset(), &property.PhysicalProperty{ExpectedCnt: math.MaxFloat64}) for _, item := range reqProp.SortItems { item := &util.ByItems{ Expr: item.Col, diff --git a/pkg/planner/cascades/implementation_rules.go b/pkg/planner/cascades/implementation_rules.go index 93e4d8d948576..e520621918b68 100644 --- a/pkg/planner/cascades/implementation_rules.go +++ b/pkg/planner/cascades/implementation_rules.go @@ -103,7 +103,7 @@ func (*ImplTableDual) Match(_ *memo.GroupExpr, prop *property.PhysicalProperty) func (*ImplTableDual) OnImplement(expr *memo.GroupExpr, _ *property.PhysicalProperty) ([]memo.Implementation, error) { logicProp := expr.Group.Prop logicDual := expr.ExprNode.(*plannercore.LogicalTableDual) - dual := plannercore.PhysicalTableDual{RowCount: logicDual.RowCount}.Init(logicDual.SCtx(), logicProp.Stats, logicDual.SelectBlockOffset()) + dual := plannercore.PhysicalTableDual{RowCount: logicDual.RowCount}.Init(logicDual.SCtx(), logicProp.Stats, logicDual.QueryBlockOffset()) dual.SetSchema(logicProp.Schema) return []memo.Implementation{impl.NewTableDualImpl(dual)}, nil } @@ -129,7 +129,7 @@ func (*ImplMemTableScan) OnImplement( Table: logic.TableInfo, Columns: logic.TableInfo.Columns, Extractor: logic.Extractor, - }.Init(logic.SCtx(), logicProp.Stats.ScaleByExpectCnt(reqProp.ExpectedCnt), logic.SelectBlockOffset()) + }.Init(logic.SCtx(), logicProp.Stats.ScaleByExpectCnt(reqProp.ExpectedCnt), logic.QueryBlockOffset()) physical.SetSchema(logicProp.Schema) return []memo.Implementation{impl.NewMemTableScanImpl(physical)}, nil } @@ -155,7 +155,7 @@ func (*ImplProjection) OnImplement(expr *memo.GroupExpr, reqProp *property.Physi Exprs: logicProj.Exprs, CalculateNoDelay: logicProj.CalculateNoDelay, AvoidColumnEvaluator: logicProj.AvoidColumnEvaluator, - }.Init(logicProj.SCtx(), logicProp.Stats.ScaleByExpectCnt(reqProp.ExpectedCnt), logicProj.SelectBlockOffset(), childProp) + }.Init(logicProj.SCtx(), logicProp.Stats.ScaleByExpectCnt(reqProp.ExpectedCnt), logicProj.QueryBlockOffset(), childProp) proj.SetSchema(logicProp.Schema) return []memo.Implementation{impl.NewProjectionImpl(proj)}, nil } @@ -269,7 +269,7 @@ func (*ImplSelection) OnImplement(expr *memo.GroupExpr, reqProp *property.Physic logicalSel := expr.ExprNode.(*plannercore.LogicalSelection) physicalSel := plannercore.PhysicalSelection{ Conditions: logicalSel.Conditions, - }.Init(logicalSel.SCtx(), expr.Group.Prop.Stats.ScaleByExpectCnt(reqProp.ExpectedCnt), logicalSel.SelectBlockOffset(), reqProp.CloneEssentialFields()) + }.Init(logicalSel.SCtx(), expr.Group.Prop.Stats.ScaleByExpectCnt(reqProp.ExpectedCnt), logicalSel.QueryBlockOffset(), reqProp.CloneEssentialFields()) switch expr.Group.EngineType { case memo.EngineTiDB: return []memo.Implementation{impl.NewTiDBSelectionImpl(physicalSel)}, nil @@ -299,13 +299,13 @@ func (*ImplSort) OnImplement(expr *memo.GroupExpr, reqProp *property.PhysicalPro if newProp, canUseNominal := plannercore.GetPropByOrderByItems(ls.ByItems); canUseNominal { newProp.ExpectedCnt = reqProp.ExpectedCnt ns := plannercore.NominalSort{}.Init( - ls.SCtx(), expr.Group.Prop.Stats.ScaleByExpectCnt(reqProp.ExpectedCnt), ls.SelectBlockOffset(), newProp) + ls.SCtx(), expr.Group.Prop.Stats.ScaleByExpectCnt(reqProp.ExpectedCnt), ls.QueryBlockOffset(), newProp) return []memo.Implementation{impl.NewNominalSortImpl(ns)}, nil } ps := plannercore.PhysicalSort{ByItems: ls.ByItems}.Init( ls.SCtx(), expr.Group.Prop.Stats.ScaleByExpectCnt(reqProp.ExpectedCnt), - ls.SelectBlockOffset(), + ls.QueryBlockOffset(), &property.PhysicalProperty{ExpectedCnt: math.MaxFloat64}, ) return []memo.Implementation{impl.NewSortImpl(ps)}, nil @@ -358,7 +358,7 @@ func (*ImplLimit) OnImplement(expr *memo.GroupExpr, _ *property.PhysicalProperty physicalLimit := plannercore.PhysicalLimit{ Offset: logicalLimit.Offset, Count: logicalLimit.Count, - }.Init(logicalLimit.SCtx(), expr.Group.Prop.Stats, logicalLimit.SelectBlockOffset(), newProp) + }.Init(logicalLimit.SCtx(), expr.Group.Prop.Stats, logicalLimit.QueryBlockOffset(), newProp) physicalLimit.SetSchema(expr.Group.Prop.Schema.Clone()) return []memo.Implementation{impl.NewLimitImpl(physicalLimit)}, nil } @@ -385,7 +385,7 @@ func (*ImplTopN) OnImplement(expr *memo.GroupExpr, _ *property.PhysicalProperty) ByItems: lt.ByItems, Count: lt.Count, Offset: lt.Offset, - }.Init(lt.SCtx(), expr.Group.Prop.Stats, lt.SelectBlockOffset(), resultProp) + }.Init(lt.SCtx(), expr.Group.Prop.Stats, lt.QueryBlockOffset(), resultProp) switch expr.Group.EngineType { case memo.EngineTiDB: return []memo.Implementation{impl.NewTiDBTopNImpl(topN)}, nil @@ -420,7 +420,7 @@ func (*ImplTopNAsLimit) OnImplement(expr *memo.GroupExpr, _ *property.PhysicalPr physicalLimit := plannercore.PhysicalLimit{ Offset: lt.Offset, Count: lt.Count, - }.Init(lt.SCtx(), expr.Group.Prop.Stats, lt.SelectBlockOffset(), newProp) + }.Init(lt.SCtx(), expr.Group.Prop.Stats, lt.QueryBlockOffset(), newProp) physicalLimit.SetSchema(expr.Group.Prop.Schema.Clone()) return []memo.Implementation{impl.NewLimitImpl(physicalLimit)}, nil } @@ -535,7 +535,7 @@ func (*ImplUnionAll) OnImplement(expr *memo.GroupExpr, reqProp *property.Physica physicalUnion := plannercore.PhysicalUnionAll{}.Init( logicalUnion.SCtx(), expr.Group.Prop.Stats.ScaleByExpectCnt(reqProp.ExpectedCnt), - logicalUnion.SelectBlockOffset(), + logicalUnion.QueryBlockOffset(), chReqProps..., ) physicalUnion.SetSchema(expr.Group.Prop.Schema) @@ -561,7 +561,7 @@ func (*ImplApply) OnImplement(expr *memo.GroupExpr, reqProp *property.PhysicalPr }.Init( la.SCtx(), expr.Group.Prop.Stats.ScaleByExpectCnt(reqProp.ExpectedCnt), - la.SelectBlockOffset(), + la.QueryBlockOffset(), &property.PhysicalProperty{ExpectedCnt: math.MaxFloat64, SortItems: reqProp.SortItems}, &property.PhysicalProperty{ExpectedCnt: math.MaxFloat64}) physicalApply.SetSchema(expr.Group.Prop.Schema) @@ -583,7 +583,7 @@ func (*ImplMaxOneRow) OnImplement(expr *memo.GroupExpr, _ *property.PhysicalProp physicalMaxOneRow := plannercore.PhysicalMaxOneRow{}.Init( mor.SCtx(), expr.Group.Prop.Stats, - mor.SelectBlockOffset(), + mor.QueryBlockOffset(), &property.PhysicalProperty{ExpectedCnt: 2}) return []memo.Implementation{impl.NewMaxOneRowImpl(physicalMaxOneRow)}, nil } @@ -616,7 +616,7 @@ func (*ImplWindow) OnImplement(expr *memo.GroupExpr, reqProp *property.PhysicalP }.Init( lw.SCtx(), expr.Group.Prop.Stats.ScaleByExpectCnt(reqProp.ExpectedCnt), - lw.SelectBlockOffset(), + lw.QueryBlockOffset(), &property.PhysicalProperty{ExpectedCnt: math.MaxFloat64, SortItems: byItems}, ) physicalWindow.SetSchema(expr.Group.Prop.Schema) diff --git a/pkg/planner/cascades/integration_test.go b/pkg/planner/cascades/integration_test.go deleted file mode 100644 index 193793a6155df..0000000000000 --- a/pkg/planner/cascades/integration_test.go +++ /dev/null @@ -1,59 +0,0 @@ -// Copyright 2019 PingCAP, 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. - -package cascades_test - -import ( - "testing" - - "github.com/pingcap/failpoint" - "github.com/pingcap/tidb/pkg/planner/cascades" - "github.com/pingcap/tidb/pkg/testkit" - "github.com/pingcap/tidb/pkg/testkit/testdata" -) - -func TestCascadePlannerHashedPartTable(t *testing.T) { - failpoint.Enable("github.com/pingcap/tidb/pkg/planner/core/forceDynamicPrune", `return(true)`) - defer failpoint.Disable("github.com/pingcap/tidb/pkg/planner/core/forceDynamicPrune") - store := testkit.CreateMockStore(t) - - tk := testkit.NewTestKit(t, store) - tk.MustExec("use test") - tk.MustExec("drop table if exists pt1") - tk.MustExec("create table pt1(a bigint, b bigint) partition by hash(a) partitions 4") - tk.MustExec(`insert into pt1 values(1,10)`) - tk.MustExec(`insert into pt1 values(2,20)`) - tk.MustExec(`insert into pt1 values(3,30)`) - tk.MustExec(`insert into pt1 values(4,40)`) - tk.MustExec(`insert into pt1 values(5,50)`) - - tk.MustExec("set @@tidb_enable_cascades_planner = 1") - var input []string - var output []struct { - SQL string - Plan []string - Result []string - } - integrationSuiteData := cascades.GetIntegrationSuiteData() - integrationSuiteData.LoadTestCases(t, &input, &output) - for i, sql := range input { - testdata.OnRecord(func() { - output[i].SQL = sql - output[i].Plan = testdata.ConvertRowsToStrings(tk.MustQuery("explain " + sql).Rows()) - output[i].Result = testdata.ConvertRowsToStrings(tk.MustQuery(sql).Rows()) - }) - tk.MustQuery("explain " + sql).Check(testkit.Rows(output[i].Plan...)) - tk.MustQuery(sql).Check(testkit.Rows(output[i].Result...)) - } -} diff --git a/pkg/planner/cascades/main_test.go b/pkg/planner/cascades/main_test.go index dc2dfb4d56a24..0bc1b0bff6ca9 100644 --- a/pkg/planner/cascades/main_test.go +++ b/pkg/planner/cascades/main_test.go @@ -25,7 +25,7 @@ import ( "go.uber.org/goleak" ) -var testDataMap = make(testdata.BookKeeper, 3) +var testDataMap = make(testdata.BookKeeper, 2) var stringerSuiteData testdata.TestData var transformationRulesSuiteData testdata.TestData @@ -36,7 +36,6 @@ func TestMain(m *testing.M) { testDataMap.LoadTestSuiteData("testdata", "stringer_suite") testDataMap.LoadTestSuiteData("testdata", "transformation_rules_suite") - testDataMap.LoadTestSuiteData("testdata", "integration_suite") stringerSuiteData = testDataMap["stringer_suite"] transformationRulesSuiteData = testDataMap["transformation_rules_suite"] @@ -48,6 +47,7 @@ func TestMain(m *testing.M) { opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), @@ -58,7 +58,3 @@ func TestMain(m *testing.M) { os.Exit(1) } } - -func GetIntegrationSuiteData() testdata.TestData { - return testDataMap["integration_suite"] -} diff --git a/pkg/planner/cascades/testdata/integration_suite_in.json b/pkg/planner/cascades/testdata/integration_suite_in.json deleted file mode 100644 index d70a1e527eeb1..0000000000000 --- a/pkg/planner/cascades/testdata/integration_suite_in.json +++ /dev/null @@ -1,8 +0,0 @@ -[ - { - "name": "TestCascadePlannerHashedPartTable", - "cases": [ - "select * from pt1 order by a" - ] - } -] diff --git a/pkg/planner/cascades/testdata/integration_suite_out.json b/pkg/planner/cascades/testdata/integration_suite_out.json deleted file mode 100644 index cdd2df740a2bd..0000000000000 --- a/pkg/planner/cascades/testdata/integration_suite_out.json +++ /dev/null @@ -1,22 +0,0 @@ -[ - { - "Name": "TestCascadePlannerHashedPartTable", - "Cases": [ - { - "SQL": "select * from pt1 order by a", - "Plan": [ - "Sort_11 10000.00 root test.pt1.a", - "└─TableReader_9 10000.00 root partition:all data:TableFullScan_10", - " └─TableFullScan_10 10000.00 cop[tikv] table:pt1 keep order:false, stats:pseudo" - ], - "Result": [ - "1 10", - "2 20", - "3 30", - "4 40", - "5 50" - ] - } - ] - } -] diff --git a/pkg/planner/cascades/transformation_rules.go b/pkg/planner/cascades/transformation_rules.go index c3d6360cee8a9..1fbe083551036 100644 --- a/pkg/planner/cascades/transformation_rules.go +++ b/pkg/planner/cascades/transformation_rules.go @@ -205,7 +205,7 @@ func (*PushSelDownTableScan) OnTransform(old *memo.ExprIter) (newExprs []*memo.G Source: ts.Source, HandleCols: ts.HandleCols, AccessConds: ts.AccessConds.Shallow(), - }.Init(ts.SCtx(), ts.SelectBlockOffset()) + }.Init(ts.SCtx(), ts.QueryBlockOffset()) newTblScan.AccessConds = append(newTblScan.AccessConds, accesses...) tblScanExpr := memo.NewGroupExpr(newTblScan) if len(remained) == 0 { @@ -214,7 +214,7 @@ func (*PushSelDownTableScan) OnTransform(old *memo.ExprIter) (newExprs []*memo.G } schema := old.GetExpr().Group.Prop.Schema tblScanGroup := memo.NewGroupWithSchema(tblScanExpr, schema) - newSel := plannercore.LogicalSelection{Conditions: remained}.Init(sel.SCtx(), sel.SelectBlockOffset()) + newSel := plannercore.LogicalSelection{Conditions: remained}.Init(sel.SCtx(), sel.QueryBlockOffset()) selExpr := memo.NewGroupExpr(newSel) selExpr.Children = append(selExpr.Children, tblScanGroup) // `sel -> ts` is transformed to `newSel ->newTS`. @@ -290,14 +290,14 @@ func (*PushSelDownIndexScan) OnTransform(old *memo.ExprIter) (newExprs []*memo.G FullIdxColLens: is.FullIdxColLens, IdxCols: is.IdxCols, IdxColLens: is.IdxColLens, - }.Init(is.SCtx(), is.SelectBlockOffset()) + }.Init(is.SCtx(), is.QueryBlockOffset()) isExpr := memo.NewGroupExpr(newIs) if len(res.RemainedConds) == 0 { return []*memo.GroupExpr{isExpr}, true, false, nil } isGroup := memo.NewGroupWithSchema(isExpr, old.Children[0].GetExpr().Group.Prop.Schema) - newSel := plannercore.LogicalSelection{Conditions: res.RemainedConds}.Init(sel.SCtx(), sel.SelectBlockOffset()) + newSel := plannercore.LogicalSelection{Conditions: res.RemainedConds}.Init(sel.SCtx(), sel.QueryBlockOffset()) selExpr := memo.NewGroupExpr(newSel) selExpr.SetChildren(isGroup) return []*memo.GroupExpr{selExpr}, true, false, nil @@ -331,11 +331,11 @@ func (*PushSelDownTiKVSingleGather) OnTransform(old *memo.ExprIter) (newExprs [] childGroup := old.Children[0].Children[0].Group var pushed, remained []expression.Expression sctx := sg.SCtx() - pushed, remained = expression.PushDownExprs(sctx.GetSessionVars().StmtCtx, sel.Conditions, sctx.GetClient(), kv.TiKV) + pushed, remained = expression.PushDownExprs(sctx, sel.Conditions, sctx.GetClient(), kv.TiKV) if len(pushed) == 0 { return nil, false, false, nil } - pushedSel := plannercore.LogicalSelection{Conditions: pushed}.Init(sctx, sel.SelectBlockOffset()) + pushedSel := plannercore.LogicalSelection{Conditions: pushed}.Init(sctx, sel.QueryBlockOffset()) pushedSelExpr := memo.NewGroupExpr(pushedSel) pushedSelExpr.Children = append(pushedSelExpr.Children, childGroup) pushedSelGroup := memo.NewGroupWithSchema(pushedSelExpr, childGroup.Prop.Schema).SetEngineType(childGroup.EngineType) @@ -351,7 +351,7 @@ func (*PushSelDownTiKVSingleGather) OnTransform(old *memo.ExprIter) (newExprs [] return []*memo.GroupExpr{tblGatherExpr}, true, false, nil } tblGatherGroup := memo.NewGroupWithSchema(tblGatherExpr, pushedSelGroup.Prop.Schema) - remainedSel := plannercore.LogicalSelection{Conditions: remained}.Init(sel.SCtx(), sel.SelectBlockOffset()) + remainedSel := plannercore.LogicalSelection{Conditions: remained}.Init(sel.SCtx(), sel.QueryBlockOffset()) remainedSelExpr := memo.NewGroupExpr(remainedSel) remainedSelExpr.Children = append(remainedSelExpr.Children, tblGatherGroup) // `oldSel -> oldTg -> any` is transformed to `remainedSel -> newTg -> pushedSel -> any`. @@ -459,13 +459,13 @@ func (r *PushAggDownGather) OnTransform(old *memo.ExprIter) (newExprs []*memo.Gr partialAgg := plannercore.LogicalAggregation{ AggFuncs: partialPref.AggFuncs, GroupByItems: partialPref.GroupByItems, - }.Init(agg.SCtx(), agg.SelectBlockOffset()) + }.Init(agg.SCtx(), agg.QueryBlockOffset()) partialAgg.CopyAggHints(agg) finalAgg := plannercore.LogicalAggregation{ AggFuncs: finalPref.AggFuncs, GroupByItems: finalPref.GroupByItems, - }.Init(agg.SCtx(), agg.SelectBlockOffset()) + }.Init(agg.SCtx(), agg.QueryBlockOffset()) finalAgg.CopyAggHints(agg) partialAggExpr := memo.NewGroupExpr(partialAgg) @@ -549,8 +549,9 @@ func (*PushSelDownProjection) OnTransform(old *memo.ExprIter) (newExprs []*memo. } canBePushed := make([]expression.Expression, 0, len(sel.Conditions)) canNotBePushed := make([]expression.Expression, 0, len(sel.Conditions)) + ctx := sel.SCtx() for _, cond := range sel.Conditions { - substituted, hasFailed, newFilter := expression.ColumnSubstituteImpl(cond, projSchema, proj.Exprs, true) + substituted, hasFailed, newFilter := expression.ColumnSubstituteImpl(ctx, cond, projSchema, proj.Exprs, true) if substituted && !hasFailed && !expression.HasGetSetVarFunc(newFilter) { canBePushed = append(canBePushed, newFilter) } else { @@ -560,7 +561,7 @@ func (*PushSelDownProjection) OnTransform(old *memo.ExprIter) (newExprs []*memo. if len(canBePushed) == 0 { return nil, false, false, nil } - newBottomSel := plannercore.LogicalSelection{Conditions: canBePushed}.Init(sel.SCtx(), sel.SelectBlockOffset()) + newBottomSel := plannercore.LogicalSelection{Conditions: canBePushed}.Init(sel.SCtx(), sel.QueryBlockOffset()) newBottomSelExpr := memo.NewGroupExpr(newBottomSel) newBottomSelExpr.SetChildren(childGroup) newBottomSelGroup := memo.NewGroupWithSchema(newBottomSelExpr, childGroup.Prop.Schema) @@ -570,7 +571,7 @@ func (*PushSelDownProjection) OnTransform(old *memo.ExprIter) (newExprs []*memo. return []*memo.GroupExpr{newProjExpr}, true, false, nil } newProjGroup := memo.NewGroupWithSchema(newProjExpr, projSchema) - newTopSel := plannercore.LogicalSelection{Conditions: canNotBePushed}.Init(sel.SCtx(), sel.SelectBlockOffset()) + newTopSel := plannercore.LogicalSelection{Conditions: canNotBePushed}.Init(sel.SCtx(), sel.QueryBlockOffset()) newTopSelExpr := memo.NewGroupExpr(newTopSel) newTopSelExpr.SetChildren(newProjGroup) return []*memo.GroupExpr{newTopSelExpr}, true, false, nil @@ -635,7 +636,7 @@ func (*PushSelDownAggregation) OnTransform(old *memo.ExprIter) (newExprs []*memo } sctx := sel.SCtx() childGroup := old.Children[0].GetExpr().Children[0] - pushedSel := plannercore.LogicalSelection{Conditions: pushedExprs}.Init(sctx, sel.SelectBlockOffset()) + pushedSel := plannercore.LogicalSelection{Conditions: pushedExprs}.Init(sctx, sel.QueryBlockOffset()) pushedGroupExpr := memo.NewGroupExpr(pushedSel) pushedGroupExpr.SetChildren(childGroup) pushedGroup := memo.NewGroupWithSchema(pushedGroupExpr, childGroup.Prop.Schema) @@ -648,7 +649,7 @@ func (*PushSelDownAggregation) OnTransform(old *memo.ExprIter) (newExprs []*memo } aggGroup := memo.NewGroupWithSchema(aggGroupExpr, aggSchema) - remainedSel := plannercore.LogicalSelection{Conditions: remainedExprs}.Init(sctx, sel.SelectBlockOffset()) + remainedSel := plannercore.LogicalSelection{Conditions: remainedExprs}.Init(sctx, sel.QueryBlockOffset()) remainedGroupExpr := memo.NewGroupExpr(remainedSel) remainedGroupExpr.SetChildren(aggGroup) return []*memo.GroupExpr{remainedGroupExpr}, true, false, nil @@ -700,7 +701,7 @@ func (*PushSelDownWindow) OnTransform(old *memo.ExprIter) (newExprs []*memo.Grou } // construct return GroupExpr - newBottomSel := plannercore.LogicalSelection{Conditions: canBePushed}.Init(sel.SCtx(), sel.SelectBlockOffset()) + newBottomSel := plannercore.LogicalSelection{Conditions: canBePushed}.Init(sel.SCtx(), sel.QueryBlockOffset()) newBottomSelExpr := memo.NewGroupExpr(newBottomSel) newBottomSelExpr.SetChildren(childGroup) newBottomSelGroup := memo.NewGroupWithSchema(newBottomSelExpr, childGroup.Prop.Schema) @@ -711,7 +712,7 @@ func (*PushSelDownWindow) OnTransform(old *memo.ExprIter) (newExprs []*memo.Grou } newWindowGroup := memo.NewGroupWithSchema(newWindowExpr, windowSchema) - newTopSel := plannercore.LogicalSelection{Conditions: canNotBePushed}.Init(sel.SCtx(), sel.SelectBlockOffset()) + newTopSel := plannercore.LogicalSelection{Conditions: canNotBePushed}.Init(sel.SCtx(), sel.QueryBlockOffset()) newTopSelExpr := memo.NewGroupExpr(newTopSel) newTopSelExpr.SetChildren(newWindowGroup) return []*memo.GroupExpr{newTopSelExpr}, true, false, nil @@ -744,7 +745,7 @@ func (*TransformLimitToTopN) OnTransform(old *memo.ExprIter) (newExprs []*memo.G ByItems: sort.ByItems, Offset: limit.Offset, Count: limit.Count, - }.Init(limit.SCtx(), limit.SelectBlockOffset()) + }.Init(limit.SCtx(), limit.QueryBlockOffset()) topNExpr := memo.NewGroupExpr(topN) topNExpr.SetChildren(childGroup) return []*memo.GroupExpr{topNExpr}, true, false, nil @@ -825,7 +826,7 @@ func (r *PushLimitDownUnionAll) OnTransform(old *memo.ExprIter) (newExprs []*mem newLimit := plannercore.LogicalLimit{ Count: limit.Count + limit.Offset, - }.Init(limit.SCtx(), limit.SelectBlockOffset()) + }.Init(limit.SCtx(), limit.QueryBlockOffset()) newUnionAllExpr := memo.NewGroupExpr(unionAll) for _, childGroup := range old.Children[0].GetExpr().Children { @@ -970,13 +971,13 @@ func (r *PushSelDownJoin) Match(expr *memo.ExprIter) bool { // buildChildSelectionGroup builds a new childGroup if the pushed down condition is not empty. func buildChildSelectionGroup( sctx sessionctx.Context, - blockOffset int, + qbOffset int, conditions []expression.Expression, childGroup *memo.Group) *memo.Group { if len(conditions) == 0 { return childGroup } - newSel := plannercore.LogicalSelection{Conditions: conditions}.Init(sctx, blockOffset) + newSel := plannercore.LogicalSelection{Conditions: conditions}.Init(sctx, qbOffset) groupExpr := memo.NewGroupExpr(newSel) groupExpr.SetChildren(childGroup) newChild := memo.NewGroupWithSchema(groupExpr, childGroup.Prop.Schema) @@ -999,12 +1000,12 @@ func (r *PushSelDownJoin) OnTransform(old *memo.ExprIter) (newExprs []*memo.Grou } // TODO: Update EqualConditions like what we have done in the method join.updateEQCond() before. - leftGroup = buildChildSelectionGroup(sctx, sel.SelectBlockOffset(), leftCond, leftGroup) - rightGroup = buildChildSelectionGroup(sctx, sel.SelectBlockOffset(), rightCond, rightGroup) + leftGroup = buildChildSelectionGroup(sctx, sel.QueryBlockOffset(), leftCond, leftGroup) + rightGroup = buildChildSelectionGroup(sctx, sel.QueryBlockOffset(), rightCond, rightGroup) newJoinExpr := memo.NewGroupExpr(newJoin) newJoinExpr.SetChildren(leftGroup, rightGroup) if len(remainCond) > 0 { - newSel := plannercore.LogicalSelection{Conditions: remainCond}.Init(sctx, sel.SelectBlockOffset()) + newSel := plannercore.LogicalSelection{Conditions: remainCond}.Init(sctx, sel.QueryBlockOffset()) newSel.Conditions = remainCond newSelExpr := memo.NewGroupExpr(newSel) newSelExpr.SetChildren(memo.NewGroupWithSchema(newJoinExpr, old.Children[0].Prop.Schema)) @@ -1051,8 +1052,8 @@ func (r *TransformJoinCondToSel) OnTransform(old *memo.ExprIter) (newExprs []*me return []*memo.GroupExpr{memo.NewGroupExpr(dual)}, true, true, nil } // TODO: Update EqualConditions like what we have done in the method join.updateEQCond() before. - leftGroup = buildChildSelectionGroup(sctx, join.SelectBlockOffset(), leftCond, leftGroup) - rightGroup = buildChildSelectionGroup(sctx, join.SelectBlockOffset(), rightCond, rightGroup) + leftGroup = buildChildSelectionGroup(sctx, join.QueryBlockOffset(), leftCond, leftGroup) + rightGroup = buildChildSelectionGroup(sctx, join.QueryBlockOffset(), rightCond, rightGroup) newJoinExpr := memo.NewGroupExpr(newJoin) newJoinExpr.SetChildren(leftGroup, rightGroup) newJoinExpr.AddAppliedRule(r) @@ -1172,7 +1173,7 @@ func (*MergeAdjacentProjection) OnTransform(old *memo.ExprIter) (newExprs []*mem } } - newProj := plannercore.LogicalProjection{Exprs: make([]expression.Expression, len(proj.Exprs))}.Init(proj.SCtx(), proj.SelectBlockOffset()) + newProj := plannercore.LogicalProjection{Exprs: make([]expression.Expression, len(proj.Exprs))}.Init(proj.SCtx(), proj.QueryBlockOffset()) newProj.SetSchema(old.GetExpr().Group.Prop.Schema) for i, expr := range proj.Exprs { newExpr := expr.Clone() @@ -1230,7 +1231,7 @@ func pushTopNDownOuterJoinToChild(topN *plannercore.LogicalTopN, outerGroup *mem newTopN := plannercore.LogicalTopN{ Count: topN.Count + topN.Offset, ByItems: make([]*util.ByItems, len(topN.ByItems)), - }.Init(topN.SCtx(), topN.SelectBlockOffset()) + }.Init(topN.SCtx(), topN.QueryBlockOffset()) for i := range topN.ByItems { newTopN.ByItems[i] = topN.ByItems[i].Clone() @@ -1303,15 +1304,16 @@ func (*PushTopNDownProjection) OnTransform(old *memo.ExprIter) (newExprs []*memo proj := old.Children[0].GetExpr().ExprNode.(*plannercore.LogicalProjection) childGroup := old.Children[0].GetExpr().Children[0] + ctx := topN.SCtx() newTopN := plannercore.LogicalTopN{ Offset: topN.Offset, Count: topN.Count, - }.Init(topN.SCtx(), topN.SelectBlockOffset()) + }.Init(ctx, topN.QueryBlockOffset()) newTopN.ByItems = make([]*util.ByItems, 0, len(topN.ByItems)) for _, by := range topN.ByItems { newTopN.ByItems = append(newTopN.ByItems, &util.ByItems{ - Expr: expression.ColumnSubstitute(by.Expr, old.Children[0].Group.Prop.Schema, proj.Exprs), + Expr: expression.ColumnSubstitute(ctx, by.Expr, old.Children[0].Group.Prop.Schema, proj.Exprs), Desc: by.Desc, }) } @@ -1363,7 +1365,7 @@ func (r *PushTopNDownUnionAll) OnTransform(old *memo.ExprIter) (newExprs []*memo newTopN := plannercore.LogicalTopN{ Count: topN.Count + topN.Offset, ByItems: topN.ByItems, - }.Init(topN.SCtx(), topN.SelectBlockOffset()) + }.Init(topN.SCtx(), topN.QueryBlockOffset()) newUnionAllExpr := memo.NewGroupExpr(unionAll) for _, childGroup := range old.Children[0].GetExpr().Children { @@ -1415,7 +1417,7 @@ func (r *PushTopNDownTiKVSingleGather) OnTransform(old *memo.ExprIter) (newExprs particalTopN := plannercore.LogicalTopN{ ByItems: topN.ByItems, Count: topN.Count + topN.Offset, - }.Init(topN.SCtx(), topN.SelectBlockOffset()) + }.Init(topN.SCtx(), topN.QueryBlockOffset()) partialTopNExpr := memo.NewGroupExpr(particalTopN) partialTopNExpr.SetChildren(childGroup) partialTopNGroup := memo.NewGroupWithSchema(partialTopNExpr, topNSchema).SetEngineType(childGroup.EngineType) @@ -1472,7 +1474,7 @@ func (*MergeAdjacentTopN) OnTransform(old *memo.ExprIter) (newExprs []*memo.Grou childGroups := old.Children[0].GetExpr().Children if child.Count <= topN.Offset { - tableDual := plannercore.LogicalTableDual{RowCount: 0}.Init(child.SCtx(), child.SelectBlockOffset()) + tableDual := plannercore.LogicalTableDual{RowCount: 0}.Init(child.SCtx(), child.QueryBlockOffset()) tableDual.SetSchema(old.GetExpr().Schema()) tableDualExpr := memo.NewGroupExpr(tableDual) return []*memo.GroupExpr{tableDualExpr}, true, true, nil @@ -1484,7 +1486,7 @@ func (*MergeAdjacentTopN) OnTransform(old *memo.ExprIter) (newExprs []*memo.Grou Count: count, Offset: offset, ByItems: child.ByItems, - }.Init(child.SCtx(), child.SelectBlockOffset()) + }.Init(child.SCtx(), child.QueryBlockOffset()) newTopNExpr := memo.NewGroupExpr(newTopN) newTopNExpr.SetChildren(childGroups...) return []*memo.GroupExpr{newTopNExpr}, true, false, nil @@ -1522,9 +1524,10 @@ func (*MergeAggregationProjection) OnTransform(old *memo.ExprIter) (newExprs []* proj := old.Children[0].GetExpr().ExprNode.(*plannercore.LogicalProjection) projSchema := old.Children[0].GetExpr().Schema() + ctx := oldAgg.SCtx() groupByItems := make([]expression.Expression, len(oldAgg.GroupByItems)) for i, item := range oldAgg.GroupByItems { - groupByItems[i] = expression.ColumnSubstitute(item, projSchema, proj.Exprs) + groupByItems[i] = expression.ColumnSubstitute(ctx, item, projSchema, proj.Exprs) } aggFuncs := make([]*aggregation.AggFuncDesc, len(oldAgg.AggFuncs)) @@ -1532,7 +1535,7 @@ func (*MergeAggregationProjection) OnTransform(old *memo.ExprIter) (newExprs []* aggFuncs[i] = aggFunc.Clone() newArgs := make([]expression.Expression, len(aggFunc.Args)) for j, arg := range aggFunc.Args { - newArgs[j] = expression.ColumnSubstitute(arg, projSchema, proj.Exprs) + newArgs[j] = expression.ColumnSubstitute(ctx, arg, projSchema, proj.Exprs) } aggFuncs[i].Args = newArgs } @@ -1540,7 +1543,7 @@ func (*MergeAggregationProjection) OnTransform(old *memo.ExprIter) (newExprs []* newAgg := plannercore.LogicalAggregation{ GroupByItems: groupByItems, AggFuncs: aggFuncs, - }.Init(oldAgg.SCtx(), oldAgg.SelectBlockOffset()) + }.Init(ctx, oldAgg.QueryBlockOffset()) newAggExpr := memo.NewGroupExpr(newAgg) newAggExpr.SetChildren(old.Children[0].GetExpr().Children...) @@ -1605,7 +1608,7 @@ func (r *EliminateSingleMaxMin) OnTransform(old *memo.ExprIter) (newExprs []*mem if len(expression.ExtractColumns(f.Args[0])) > 0 { // If it can be NULL, we need to filter NULL out first. if !mysql.HasNotNullFlag(f.Args[0].GetType().GetFlag()) { - sel := plannercore.LogicalSelection{}.Init(ctx, agg.SelectBlockOffset()) + sel := plannercore.LogicalSelection{}.Init(ctx, agg.QueryBlockOffset()) isNullFunc := expression.NewFunctionInternal(ctx, ast.IsNull, types.NewFieldType(mysql.TypeTiny), f.Args[0]) notNullFunc := expression.NewFunctionInternal(ctx, ast.UnaryNot, types.NewFieldType(mysql.TypeTiny), isNullFunc) sel.Conditions = []expression.Expression{notNullFunc} @@ -1626,13 +1629,13 @@ func (r *EliminateSingleMaxMin) OnTransform(old *memo.ExprIter) (newExprs []*mem top1 := plannercore.LogicalTopN{ ByItems: byItems, Count: 1, - }.Init(ctx, agg.SelectBlockOffset()) + }.Init(ctx, agg.QueryBlockOffset()) top1Expr := memo.NewGroupExpr(top1) top1Expr.SetChildren(childGroup) top1Group := memo.NewGroupWithSchema(top1Expr, childGroup.Prop.Schema) childGroup = top1Group } else { - li := plannercore.LogicalLimit{Count: 1}.Init(ctx, agg.SelectBlockOffset()) + li := plannercore.LogicalLimit{Count: 1}.Init(ctx, agg.QueryBlockOffset()) liExpr := memo.NewGroupExpr(li) liExpr.SetChildren(childGroup) liGroup := memo.NewGroupWithSchema(liExpr, childGroup.Prop.Schema) @@ -1675,7 +1678,7 @@ func (*MergeAdjacentSelection) OnTransform(old *memo.ExprIter) (newExprs []*memo conditions := make([]expression.Expression, 0, len(sel.Conditions)+len(child.Conditions)) conditions = append(conditions, sel.Conditions...) conditions = append(conditions, child.Conditions...) - newSel := plannercore.LogicalSelection{Conditions: conditions}.Init(sel.SCtx(), sel.SelectBlockOffset()) + newSel := plannercore.LogicalSelection{Conditions: conditions}.Init(sel.SCtx(), sel.QueryBlockOffset()) newSelExpr := memo.NewGroupExpr(newSel) newSelExpr.SetChildren(childGroups...) return []*memo.GroupExpr{newSelExpr}, true, false, nil @@ -1706,7 +1709,7 @@ func (*MergeAdjacentLimit) OnTransform(old *memo.ExprIter) (newExprs []*memo.Gro childGroups := old.Children[0].GetExpr().Children if child.Count <= limit.Offset { - tableDual := plannercore.LogicalTableDual{RowCount: 0}.Init(child.SCtx(), child.SelectBlockOffset()) + tableDual := plannercore.LogicalTableDual{RowCount: 0}.Init(child.SCtx(), child.QueryBlockOffset()) tableDual.SetSchema(old.GetExpr().Schema()) tableDualExpr := memo.NewGroupExpr(tableDual) return []*memo.GroupExpr{tableDualExpr}, true, true, nil @@ -1717,7 +1720,7 @@ func (*MergeAdjacentLimit) OnTransform(old *memo.ExprIter) (newExprs []*memo.Gro newLimit := plannercore.LogicalLimit{ Offset: offset, Count: count, - }.Init(limit.SCtx(), limit.SelectBlockOffset()) + }.Init(limit.SCtx(), limit.QueryBlockOffset()) newLimitExpr := memo.NewGroupExpr(newLimit) newLimitExpr.SetChildren(childGroups...) return []*memo.GroupExpr{newLimitExpr}, true, false, nil @@ -1749,7 +1752,7 @@ func (*TransformLimitToTableDual) Match(expr *memo.ExprIter) bool { // This rule tries to convert limit to tableDual. func (*TransformLimitToTableDual) OnTransform(old *memo.ExprIter) (newExprs []*memo.GroupExpr, eraseOld bool, eraseAll bool, err error) { limit := old.GetExpr().ExprNode.(*plannercore.LogicalLimit) - tableDual := plannercore.LogicalTableDual{RowCount: 0}.Init(limit.SCtx(), limit.SelectBlockOffset()) + tableDual := plannercore.LogicalTableDual{RowCount: 0}.Init(limit.SCtx(), limit.QueryBlockOffset()) tableDual.SetSchema(old.GetExpr().Schema()) tableDualExpr := memo.NewGroupExpr(tableDual) return []*memo.GroupExpr{tableDualExpr}, true, true, nil @@ -1810,7 +1813,7 @@ func (r *PushLimitDownOuterJoin) OnTransform(old *memo.ExprIter) (newExprs []*me func (*PushLimitDownOuterJoin) pushLimitDownOuterJoinToChild(limit *plannercore.LogicalLimit, outerGroup *memo.Group) *memo.Group { newLimit := plannercore.LogicalLimit{ Count: limit.Count + limit.Offset, - }.Init(limit.SCtx(), limit.SelectBlockOffset()) + }.Init(limit.SCtx(), limit.QueryBlockOffset()) newLimitGroup := memo.NewGroupExpr(newLimit) newLimitGroup.SetChildren(outerGroup) return memo.NewGroupWithSchema(newLimitGroup, outerGroup.Prop.Schema) @@ -1849,7 +1852,7 @@ func (r *PushLimitDownTiKVSingleGather) OnTransform(old *memo.ExprIter) (newExpr particalLimit := plannercore.LogicalLimit{ Count: limit.Count + limit.Offset, - }.Init(limit.SCtx(), limit.SelectBlockOffset()) + }.Init(limit.SCtx(), limit.QueryBlockOffset()) partialLimitExpr := memo.NewGroupExpr(particalLimit) partialLimitExpr.SetChildren(childGroup) partialLimitGroup := memo.NewGroupWithSchema(partialLimitExpr, limitSchema).SetEngineType(childGroup.EngineType) @@ -2059,7 +2062,7 @@ func (r *TransformAggregateCaseToSelection) OnTransform(old *memo.ExprIter) (new return nil, false, false, nil } - newSel := plannercore.LogicalSelection{Conditions: newConditions}.Init(agg.SCtx(), agg.SelectBlockOffset()) + newSel := plannercore.LogicalSelection{Conditions: newConditions}.Init(agg.SCtx(), agg.QueryBlockOffset()) newSelExpr := memo.NewGroupExpr(newSel) newSelExpr.SetChildren(old.GetExpr().Children...) newSelGroup := memo.NewGroupWithSchema(newSelExpr, old.GetExpr().Children[0].Prop.Schema) @@ -2067,7 +2070,7 @@ func (r *TransformAggregateCaseToSelection) OnTransform(old *memo.ExprIter) (new newAgg := plannercore.LogicalAggregation{ AggFuncs: newAggFuncs, GroupByItems: agg.GroupByItems, - }.Init(agg.SCtx(), agg.SelectBlockOffset()) + }.Init(agg.SCtx(), agg.QueryBlockOffset()) newAgg.CopyAggHints(agg) newAggExpr := memo.NewGroupExpr(newAgg) newAggExpr.SetChildren(newSelGroup) @@ -2250,7 +2253,7 @@ func (*InjectProjectionBelowTopN) OnTransform(old *memo.ExprIter) (newExprs []*m } topProj := plannercore.LogicalProjection{ Exprs: topProjExprs, - }.Init(topN.SCtx(), topN.SelectBlockOffset()) + }.Init(topN.SCtx(), topN.QueryBlockOffset()) topProj.SetSchema(oldTopNSchema) // Construct bottom Projection. @@ -2277,7 +2280,7 @@ func (*InjectProjectionBelowTopN) OnTransform(old *memo.ExprIter) (newExprs []*m } bottomProj := plannercore.LogicalProjection{ Exprs: bottomProjExprs, - }.Init(topN.SCtx(), topN.SelectBlockOffset()) + }.Init(topN.SCtx(), topN.QueryBlockOffset()) newSchema := expression.NewSchema(bottomProjSchema...) bottomProj.SetSchema(newSchema) @@ -2285,7 +2288,7 @@ func (*InjectProjectionBelowTopN) OnTransform(old *memo.ExprIter) (newExprs []*m ByItems: newByItems, Offset: topN.Offset, Count: topN.Count, - }.Init(topN.SCtx(), topN.SelectBlockOffset()) + }.Init(topN.SCtx(), topN.QueryBlockOffset()) // Construct GroupExpr, Group (TopProj -> TopN -> BottomProj -> Child) bottomProjGroupExpr := memo.NewGroupExpr(bottomProj) @@ -2399,7 +2402,7 @@ func (*InjectProjectionBelowAgg) OnTransform(old *memo.ExprIter) (newExprs []*me // Construct GroupExpr, Group (Agg -> Proj -> Child). proj := plannercore.LogicalProjection{ Exprs: projExprs, - }.Init(agg.SCtx(), agg.SelectBlockOffset()) + }.Init(agg.SCtx(), agg.QueryBlockOffset()) projSchema := expression.NewSchema(projSchemaCols...) proj.SetSchema(projSchema) projExpr := memo.NewGroupExpr(proj) @@ -2409,7 +2412,7 @@ func (*InjectProjectionBelowAgg) OnTransform(old *memo.ExprIter) (newExprs []*me newAgg := plannercore.LogicalAggregation{ AggFuncs: copyFuncs, GroupByItems: newGroupByItems, - }.Init(agg.SCtx(), agg.SelectBlockOffset()) + }.Init(agg.SCtx(), agg.QueryBlockOffset()) newAgg.CopyAggHints(agg) newAggExpr := memo.NewGroupExpr(newAgg) newAggExpr.SetChildren(projGroup) @@ -2502,7 +2505,7 @@ func (*PullSelectionUpApply) OnTransform(old *memo.ExprIter) (newExprs []*memo.G newApply := plannercore.LogicalApply{ LogicalJoin: *(apply.LogicalJoin.Shallow()), CorCols: apply.CorCols, - }.Init(apply.SCtx(), apply.SelectBlockOffset()) + }.Init(apply.SCtx(), apply.QueryBlockOffset()) // Update Join conditions. eq, left, right, other := newApply.LogicalJoin.ExtractOnCondition(newConds, outerChildGroup.Prop.Schema, innerChildGroup.Prop.Schema, false, false) newApply.LogicalJoin.AppendJoinConds(eq, left, right, other) @@ -2583,7 +2586,7 @@ func (*MergeAdjacentWindow) OnTransform(old *memo.ExprIter) (newExprs []*memo.Gr PartitionBy: curWinPlan.PartitionBy, OrderBy: curWinPlan.OrderBy, Frame: curWinPlan.Frame, - }.Init(ctx, curWinPlan.SelectBlockOffset()) + }.Init(ctx, curWinPlan.QueryBlockOffset()) newWindowGroupExpr := memo.NewGroupExpr(newWindowPlan) newWindowGroupExpr.SetChildren(old.Children[0].GetExpr().Children...) return []*memo.GroupExpr{newWindowGroupExpr}, true, false, nil diff --git a/pkg/planner/core/BUILD.bazel b/pkg/planner/core/BUILD.bazel index 0f3516a348b7b..a134d3eb2aff1 100644 --- a/pkg/planner/core/BUILD.bazel +++ b/pkg/planner/core/BUILD.bazel @@ -18,7 +18,7 @@ go_library( "fragment.go", "handle_cols.go", "hashcode.go", - "hints.go", + "hint_utils.go", "indexmerge_path.go", "initialize.go", "logical_plan_builder.go", @@ -87,6 +87,7 @@ go_library( deps = [ "//br/pkg/storage", "//pkg/bindinfo", + "//pkg/bindinfo/norm", "//pkg/config", "//pkg/distsql", "//pkg/domain", @@ -173,6 +174,7 @@ go_library( "@com_github_pingcap_tipb//go-tipb", "@com_github_tikv_client_go_v2//kv", "@com_github_tikv_client_go_v2//oracle", + "@org_golang_x_exp//maps", "@org_uber_go_atomic//:atomic", "@org_uber_go_zap//:zap", ], @@ -220,7 +222,6 @@ go_test( "preprocess_test.go", "rule_generate_column_substitute_test.go", "rule_join_reorder_dp_test.go", - "rule_join_reorder_test.go", "runtime_filter_generator_test.go", "stringer_test.go", ], @@ -231,7 +232,6 @@ go_test( deps = [ "//pkg/config", "//pkg/domain", - "//pkg/errno", "//pkg/expression", "//pkg/expression/aggregation", "//pkg/infoschema", diff --git a/pkg/planner/core/access_object.go b/pkg/planner/core/access_object.go index ea59145cbc956..162e321643771 100644 --- a/pkg/planner/core/access_object.go +++ b/pkg/planner/core/access_object.go @@ -307,8 +307,8 @@ func (p *PointGetPlan) AccessObject() AccessObject { Database: p.dbName, Table: p.TblInfo.Name.O, } - if p.PartitionInfo != nil { - res.Partitions = []string{p.PartitionInfo.Name.O} + if p.PartitionDef != nil { + res.Partitions = []string{p.PartitionDef.Name.O} } if p.IndexInfo != nil { index := IndexAccess{ @@ -333,8 +333,8 @@ func (p *BatchPointGetPlan) AccessObject() AccessObject { Database: p.dbName, Table: p.TblInfo.Name.O, } - for _, partitionInfo := range p.PartitionInfos { - res.Partitions = append(res.Partitions, partitionInfo.Name.O) + for _, partitionDef := range p.PartitionDefs { + res.Partitions = append(res.Partitions, partitionDef.Name.O) } if p.IndexInfo != nil { index := IndexAccess{ @@ -353,7 +353,7 @@ func (p *BatchPointGetPlan) AccessObject() AccessObject { return res } -func getDynamicAccessPartition(sctx sessionctx.Context, tblInfo *model.TableInfo, partitionInfo *PartitionInfo, asName string) (res *DynamicPartitionAccessObject) { +func getDynamicAccessPartition(sctx sessionctx.Context, tblInfo *model.TableInfo, physPlanPartInfo *PhysPlanPartInfo, asName string) (res *DynamicPartitionAccessObject) { pi := tblInfo.GetPartitionInfo() if pi == nil || !sctx.GetSessionVars().StmtCtx.UseDynamicPartitionPrune() { return nil @@ -377,7 +377,7 @@ func getDynamicAccessPartition(sctx sessionctx.Context, tblInfo *model.TableInfo } tbl := tmp.(table.PartitionedTable) - idxArr, err := PartitionPruning(sctx, tbl, partitionInfo.PruningConds, partitionInfo.PartitionNames, partitionInfo.Columns, partitionInfo.ColumnNames) + idxArr, err := PartitionPruning(sctx, tbl, physPlanPartInfo.PruningConds, physPlanPartInfo.PartitionNames, physPlanPartInfo.Columns, physPlanPartInfo.ColumnNames) if err != nil { res.err = "partition pruning error:" + err.Error() return res @@ -398,7 +398,7 @@ func (p *PhysicalTableReader) accessObject(sctx sessionctx.Context) AccessObject if !sctx.GetSessionVars().StmtCtx.UseDynamicPartitionPrune() { return DynamicPartitionAccessObjects(nil) } - if len(p.PartitionInfos) == 0 { + if len(p.TableScanAndPartitionInfos) == 0 { ts, ok := p.TablePlans[0].(*PhysicalTableScan) if !ok { return OtherAccessObject("") @@ -407,20 +407,20 @@ func (p *PhysicalTableReader) accessObject(sctx sessionctx.Context) AccessObject if ts.TableAsName != nil && len(ts.TableAsName.O) > 0 { asName = ts.TableAsName.O } - res := getDynamicAccessPartition(sctx, ts.Table, &p.PartitionInfo, asName) + res := getDynamicAccessPartition(sctx, ts.Table, &p.PlanPartInfo, asName) if res == nil { return DynamicPartitionAccessObjects(nil) } return DynamicPartitionAccessObjects{res} } - if len(p.PartitionInfos) == 1 { - ts := p.PartitionInfos[0].tableScan - partInfo := p.PartitionInfos[0].partitionInfo + if len(p.TableScanAndPartitionInfos) == 1 { + tp := p.TableScanAndPartitionInfos[0] + ts := tp.tableScan asName := "" if ts.TableAsName != nil && len(ts.TableAsName.O) > 0 { asName = ts.TableAsName.O } - res := getDynamicAccessPartition(sctx, ts.Table, &partInfo, asName) + res := getDynamicAccessPartition(sctx, ts.Table, &tp.physPlanPartInfo, asName) if res == nil { return DynamicPartitionAccessObjects(nil) } @@ -428,17 +428,16 @@ func (p *PhysicalTableReader) accessObject(sctx sessionctx.Context) AccessObject } res := make(DynamicPartitionAccessObjects, 0) - for _, info := range p.PartitionInfos { + for _, info := range p.TableScanAndPartitionInfos { if info.tableScan.Table.GetPartitionInfo() == nil { continue } ts := info.tableScan - partInfo := info.partitionInfo asName := "" if ts.TableAsName != nil && len(ts.TableAsName.O) > 0 { asName = ts.TableAsName.O } - accessObj := getDynamicAccessPartition(sctx, ts.Table, &partInfo, asName) + accessObj := getDynamicAccessPartition(sctx, ts.Table, &info.physPlanPartInfo, asName) if accessObj != nil { res = append(res, accessObj) } @@ -458,7 +457,7 @@ func (p *PhysicalIndexReader) accessObject(sctx sessionctx.Context) AccessObject if is.TableAsName != nil && len(is.TableAsName.O) > 0 { asName = is.TableAsName.O } - res := getDynamicAccessPartition(sctx, is.Table, &p.PartitionInfo, asName) + res := getDynamicAccessPartition(sctx, is.Table, &p.PlanPartInfo, asName) if res == nil { return DynamicPartitionAccessObjects(nil) } @@ -474,7 +473,7 @@ func (p *PhysicalIndexLookUpReader) accessObject(sctx sessionctx.Context) Access if ts.TableAsName != nil && len(ts.TableAsName.O) > 0 { asName = ts.TableAsName.O } - res := getDynamicAccessPartition(sctx, ts.Table, &p.PartitionInfo, asName) + res := getDynamicAccessPartition(sctx, ts.Table, &p.PlanPartInfo, asName) if res == nil { return DynamicPartitionAccessObjects(nil) } @@ -490,7 +489,7 @@ func (p *PhysicalIndexMergeReader) accessObject(sctx sessionctx.Context) AccessO if ts.TableAsName != nil && len(ts.TableAsName.O) > 0 { asName = ts.TableAsName.O } - res := getDynamicAccessPartition(sctx, ts.Table, &p.PartitionInfo, asName) + res := getDynamicAccessPartition(sctx, ts.Table, &p.PlanPartInfo, asName) if res == nil { return DynamicPartitionAccessObjects(nil) } diff --git a/pkg/planner/core/casetest/BUILD.bazel b/pkg/planner/core/casetest/BUILD.bazel index 037ae24961c47..c14b6876896cc 100644 --- a/pkg/planner/core/casetest/BUILD.bazel +++ b/pkg/planner/core/casetest/BUILD.bazel @@ -12,7 +12,7 @@ go_test( ], data = glob(["testdata/**"]), flaky = True, - shard_count = 21, + shard_count = 18, deps = [ "//pkg/domain", "//pkg/parser", diff --git a/pkg/planner/core/casetest/binaryplan/main_test.go b/pkg/planner/core/casetest/binaryplan/main_test.go index 526f50cbe0d99..d284d9b1eca12 100644 --- a/pkg/planner/core/casetest/binaryplan/main_test.go +++ b/pkg/planner/core/casetest/binaryplan/main_test.go @@ -38,6 +38,7 @@ func TestMain(m *testing.M) { }) opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("gopkg.in/natefinch/lumberjack%2ev2.(*Logger).millRun"), diff --git a/pkg/planner/core/casetest/cbotest/main_test.go b/pkg/planner/core/casetest/cbotest/main_test.go index 5e3871dc7da52..72c9ab9fab392 100644 --- a/pkg/planner/core/casetest/cbotest/main_test.go +++ b/pkg/planner/core/casetest/cbotest/main_test.go @@ -32,6 +32,7 @@ func TestMain(m *testing.M) { testDataMap.LoadTestSuiteData("testdata", "analyze_suite") opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("gopkg.in/natefinch/lumberjack%2ev2.(*Logger).millRun"), diff --git a/pkg/planner/core/casetest/dag/main_test.go b/pkg/planner/core/casetest/dag/main_test.go index 899d68a67b0eb..b623671dffecb 100644 --- a/pkg/planner/core/casetest/dag/main_test.go +++ b/pkg/planner/core/casetest/dag/main_test.go @@ -32,6 +32,7 @@ func TestMain(m *testing.M) { testDataMap.LoadTestSuiteData("testdata", "plan_suite") opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("gopkg.in/natefinch/lumberjack%2ev2.(*Logger).millRun"), diff --git a/pkg/planner/core/casetest/enforcempp/enforce_mpp_test.go b/pkg/planner/core/casetest/enforcempp/enforce_mpp_test.go index f6017576d0296..e21405d46a80b 100644 --- a/pkg/planner/core/casetest/enforcempp/enforce_mpp_test.go +++ b/pkg/planner/core/casetest/enforcempp/enforce_mpp_test.go @@ -41,6 +41,7 @@ func TestEnforceMPP(t *testing.T) { tk.MustExec("create table t(a int, b int)") tk.MustExec("create index idx on t(a)") tk.MustExec("CREATE TABLE `s` (\n `a` int(11) DEFAULT NULL,\n `b` int(11) DEFAULT NULL,\n `c` int(11) DEFAULT NULL,\n `d` int(11) DEFAULT NULL,\n UNIQUE KEY `a` (`a`),\n KEY `ii` (`a`,`b`)\n)") + tk.MustExec("create table t3(id int, sala char(10), name char(100), primary key(id, sala)) partition by list columns (sala)(partition p1 values in('a'));") // Default RPC encoding may cause statistics explain result differ and then the test unstable. tk.MustExec("set @@tidb_enable_chunk_rpc = on") @@ -65,6 +66,12 @@ func TestEnforceMPP(t *testing.T) { Available: true, } } + if tblInfo.Name.L == "t3" { + tblInfo.TiFlashReplica = &model.TiFlashReplicaInfo{ + Count: 1, + Available: true, + } + } } var input []string diff --git a/pkg/planner/core/casetest/enforcempp/main_test.go b/pkg/planner/core/casetest/enforcempp/main_test.go index 9f7ba67aee4bd..8c06370c939b3 100644 --- a/pkg/planner/core/casetest/enforcempp/main_test.go +++ b/pkg/planner/core/casetest/enforcempp/main_test.go @@ -33,6 +33,7 @@ func TestMain(m *testing.M) { opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("gopkg.in/natefinch/lumberjack%2ev2.(*Logger).millRun"), diff --git a/pkg/planner/core/casetest/enforcempp/testdata/enforce_mpp_suite_in.json b/pkg/planner/core/casetest/enforcempp/testdata/enforce_mpp_suite_in.json index 66a7e83f6456a..54e8681bd11e1 100644 --- a/pkg/planner/core/casetest/enforcempp/testdata/enforce_mpp_suite_in.json +++ b/pkg/planner/core/casetest/enforcempp/testdata/enforce_mpp_suite_in.json @@ -22,7 +22,9 @@ "explain format='verbose' select count(*) from t where a=1", "explain format='verbose' select /*+ read_from_storage(tikv[t]) */ count(*) from t where a=1", "explain format='verbose' select /*+ read_from_storage(tiflash[t]) */ count(*) from t where a=1", - "explain select /*+ READ_FROM_STORAGE(TIFLASH[s]) */ a from s where a = 10 and b is null; -- index path huristic rule will prune tiflash path" + "explain select /*+ READ_FROM_STORAGE(TIFLASH[s]) */ a from s where a = 10 and b is null; -- index path huristic rule will prune tiflash path", + "explain select /*+ read_from_storage(tiflash[t3]) */ * from t3 where sala='a' and id =1; -- once hinted, walk with tiflash range scan", + "explain select * from t3 where sala='a' and id =1; -- once not hinted, walk with tikv point get" ] }, { diff --git a/pkg/planner/core/casetest/enforcempp/testdata/enforce_mpp_suite_out.json b/pkg/planner/core/casetest/enforcempp/testdata/enforce_mpp_suite_out.json index 2dc6c93121651..ca8efc69e23bb 100644 --- a/pkg/planner/core/casetest/enforcempp/testdata/enforce_mpp_suite_out.json +++ b/pkg/planner/core/casetest/enforcempp/testdata/enforce_mpp_suite_out.json @@ -177,13 +177,33 @@ { "SQL": "explain select /*+ READ_FROM_STORAGE(TIFLASH[s]) */ a from s where a = 10 and b is null; -- index path huristic rule will prune tiflash path", "Plan": [ - "TableReader_12 0.10 root MppVersion: 2, data:ExchangeSender_11", - "└─ExchangeSender_11 0.10 mpp[tiflash] ExchangeType: PassThrough", + "TableReader_9 0.10 root MppVersion: 2, data:ExchangeSender_8", + "└─ExchangeSender_8 0.10 mpp[tiflash] ExchangeType: PassThrough", " └─Projection_5 0.10 mpp[tiflash] test.s.a", - " └─Selection_10 0.10 mpp[tiflash] isnull(test.s.b)", - " └─TableFullScan_9 10.00 mpp[tiflash] table:s pushed down filter:eq(test.s.a, 10), keep order:false, stats:pseudo" + " └─Selection_7 0.10 mpp[tiflash] isnull(test.s.b)", + " └─TableFullScan_6 10.00 mpp[tiflash] table:s pushed down filter:eq(test.s.a, 10), keep order:false, stats:pseudo" ], "Warn": null + }, + { + "SQL": "explain select /*+ read_from_storage(tiflash[t3]) */ * from t3 where sala='a' and id =1; -- once hinted, walk with tiflash range scan", + "Plan": [ + "TableReader_12 0.01 root MppVersion: 2, data:ExchangeSender_11", + "└─ExchangeSender_11 0.01 mpp[tiflash] ExchangeType: PassThrough", + " └─TableRangeScan_10 1.00 mpp[tiflash] table:t3, partition:p1 range:[1 \"a\",1 \"a\"], keep order:false, stats:pseudo" + ], + "Warn": [ + "disable dynamic pruning due to t3 has no global stats" + ] + }, + { + "SQL": "explain select * from t3 where sala='a' and id =1; -- once not hinted, walk with tikv point get", + "Plan": [ + "Point_Get_6 1.00 root table:t3, partition:p1, clustered index:PRIMARY(id, sala) " + ], + "Warn": [ + "disable dynamic pruning due to t3 has no global stats" + ] } ] }, @@ -681,21 +701,20 @@ "└─ExchangeSender_79 8000.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection_10 8000.00 mpp[tiflash] test.o.o_id, Column#6", " └─Projection_78 8000.00 mpp[tiflash] Column#6, test.o.o_id", - " └─HashAgg_77 8000.00 mpp[tiflash] group by:Column#27, funcs:sum(Column#25)->Column#6, funcs:firstrow(Column#26)->test.o.o_id", - " └─Projection_81 9990.00 mpp[tiflash] cast(Column#7, decimal(20,0) BINARY)->Column#25, Column#8->Column#26, test.o.o_id->Column#27", - " └─ExchangeReceiver_73 9990.00 mpp[tiflash] ", - " └─ExchangeSender_72 9990.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.o.o_id, collate: binary]", - " └─HashJoin_71 9990.00 mpp[tiflash] inner join, equal:[eq(test.c.c_id, test.o.c_id)]", - " ├─ExchangeReceiver_34(Build) 8000.00 mpp[tiflash] ", - " │ └─ExchangeSender_33 8000.00 mpp[tiflash] ExchangeType: Broadcast, Compression: FAST", - " │ └─Projection_29 8000.00 mpp[tiflash] Column#7, Column#8, test.o.o_id, test.o.c_id", - " │ └─HashAgg_30 8000.00 mpp[tiflash] group by:test.o.c_id, test.o.o_id, funcs:sum(Column#9)->Column#7, funcs:firstrow(test.o.o_id)->Column#8, funcs:firstrow(test.o.o_id)->test.o.o_id, funcs:firstrow(test.o.c_id)->test.o.c_id", - " │ └─ExchangeReceiver_32 8000.00 mpp[tiflash] ", - " │ └─ExchangeSender_31 8000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.o.o_id, collate: binary], [name: test.o.c_id, collate: binary]", - " │ └─HashAgg_21 8000.00 mpp[tiflash] group by:test.o.c_id, test.o.o_id, funcs:count(1)->Column#9", - " │ └─TableFullScan_28 10000.00 mpp[tiflash] table:o keep order:false, stats:pseudo", - " └─Selection_19(Probe) 9990.00 mpp[tiflash] not(isnull(test.c.c_id))", - " └─TableFullScan_18 10000.00 mpp[tiflash] table:c pushed down filter:empty, keep order:false, stats:pseudo" + " └─HashAgg_77 8000.00 mpp[tiflash] group by:test.o.o_id, funcs:sum(Column#7)->Column#6, funcs:firstrow(Column#8)->test.o.o_id", + " └─ExchangeReceiver_73 9990.00 mpp[tiflash] ", + " └─ExchangeSender_72 9990.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.o.o_id, collate: binary]", + " └─HashJoin_71 9990.00 mpp[tiflash] inner join, equal:[eq(test.c.c_id, test.o.c_id)]", + " ├─ExchangeReceiver_34(Build) 8000.00 mpp[tiflash] ", + " │ └─ExchangeSender_33 8000.00 mpp[tiflash] ExchangeType: Broadcast, Compression: FAST", + " │ └─Projection_29 8000.00 mpp[tiflash] Column#7, Column#8, test.o.o_id, test.o.c_id", + " │ └─HashAgg_30 8000.00 mpp[tiflash] group by:test.o.c_id, test.o.o_id, funcs:sum(Column#9)->Column#7, funcs:firstrow(test.o.o_id)->Column#8, funcs:firstrow(test.o.o_id)->test.o.o_id, funcs:firstrow(test.o.c_id)->test.o.c_id", + " │ └─ExchangeReceiver_32 8000.00 mpp[tiflash] ", + " │ └─ExchangeSender_31 8000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.o.o_id, collate: binary], [name: test.o.c_id, collate: binary]", + " │ └─HashAgg_21 8000.00 mpp[tiflash] group by:test.o.c_id, test.o.o_id, funcs:count(1)->Column#9", + " │ └─TableFullScan_28 10000.00 mpp[tiflash] table:o keep order:false, stats:pseudo", + " └─Selection_19(Probe) 9990.00 mpp[tiflash] not(isnull(test.c.c_id))", + " └─TableFullScan_18 10000.00 mpp[tiflash] table:c pushed down filter:empty, keep order:false, stats:pseudo" ], "Warn": null }, @@ -706,21 +725,20 @@ "└─ExchangeSender_79 8000.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection_10 8000.00 mpp[tiflash] test.o.c_id, Column#6", " └─Projection_78 8000.00 mpp[tiflash] Column#6, test.o.c_id", - " └─HashAgg_77 8000.00 mpp[tiflash] group by:Column#23, funcs:sum(Column#21)->Column#6, funcs:firstrow(Column#22)->test.o.c_id", - " └─Projection_81 9990.00 mpp[tiflash] cast(Column#7, decimal(20,0) BINARY)->Column#21, Column#8->Column#22, test.o.c_id->Column#23", - " └─ExchangeReceiver_73 9990.00 mpp[tiflash] ", - " └─ExchangeSender_72 9990.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.o.c_id, collate: binary]", - " └─HashJoin_71 9990.00 mpp[tiflash] inner join, equal:[eq(test.c.c_id, test.o.c_id)]", - " ├─ExchangeReceiver_34(Build) 8000.00 mpp[tiflash] ", - " │ └─ExchangeSender_33 8000.00 mpp[tiflash] ExchangeType: Broadcast, Compression: FAST", - " │ └─Projection_29 8000.00 mpp[tiflash] Column#7, Column#8, test.o.c_id", - " │ └─HashAgg_30 8000.00 mpp[tiflash] group by:test.o.c_id, funcs:sum(Column#9)->Column#7, funcs:firstrow(test.o.c_id)->Column#8, funcs:firstrow(test.o.c_id)->test.o.c_id", - " │ └─ExchangeReceiver_32 8000.00 mpp[tiflash] ", - " │ └─ExchangeSender_31 8000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.o.c_id, collate: binary]", - " │ └─HashAgg_21 8000.00 mpp[tiflash] group by:test.o.c_id, funcs:count(1)->Column#9", - " │ └─TableFullScan_28 10000.00 mpp[tiflash] table:o keep order:false, stats:pseudo", - " └─Selection_19(Probe) 9990.00 mpp[tiflash] not(isnull(test.c.c_id))", - " └─TableFullScan_18 10000.00 mpp[tiflash] table:c pushed down filter:empty, keep order:false, stats:pseudo" + " └─HashAgg_77 8000.00 mpp[tiflash] group by:test.o.c_id, funcs:sum(Column#7)->Column#6, funcs:firstrow(Column#8)->test.o.c_id", + " └─ExchangeReceiver_73 9990.00 mpp[tiflash] ", + " └─ExchangeSender_72 9990.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.o.c_id, collate: binary]", + " └─HashJoin_71 9990.00 mpp[tiflash] inner join, equal:[eq(test.c.c_id, test.o.c_id)]", + " ├─ExchangeReceiver_34(Build) 8000.00 mpp[tiflash] ", + " │ └─ExchangeSender_33 8000.00 mpp[tiflash] ExchangeType: Broadcast, Compression: FAST", + " │ └─Projection_29 8000.00 mpp[tiflash] Column#7, Column#8, test.o.c_id", + " │ └─HashAgg_30 8000.00 mpp[tiflash] group by:test.o.c_id, funcs:sum(Column#9)->Column#7, funcs:firstrow(test.o.c_id)->Column#8, funcs:firstrow(test.o.c_id)->test.o.c_id", + " │ └─ExchangeReceiver_32 8000.00 mpp[tiflash] ", + " │ └─ExchangeSender_31 8000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.o.c_id, collate: binary]", + " │ └─HashAgg_21 8000.00 mpp[tiflash] group by:test.o.c_id, funcs:count(1)->Column#9", + " │ └─TableFullScan_28 10000.00 mpp[tiflash] table:o keep order:false, stats:pseudo", + " └─Selection_19(Probe) 9990.00 mpp[tiflash] not(isnull(test.c.c_id))", + " └─TableFullScan_18 10000.00 mpp[tiflash] table:c pushed down filter:empty, keep order:false, stats:pseudo" ], "Warn": null }, @@ -733,21 +751,20 @@ " └─ExchangeSender 10.00 mpp[tiflash] ExchangeType: PassThrough", " └─TopN 10.00 mpp[tiflash] Column#7, offset:0, count:10", " └─Projection 16000.00 mpp[tiflash] Column#9, Column#7", - " └─HashAgg 16000.00 mpp[tiflash] group by:Column#38, funcs:sum(Column#36)->Column#9, funcs:firstrow(Column#37)->Column#7", - " └─Projection 16000.00 mpp[tiflash] cast(Column#10, decimal(20,0) BINARY)->Column#36, Column#11->Column#37, Column#7->Column#38", - " └─ExchangeReceiver 16000.00 mpp[tiflash] ", - " └─ExchangeSender 16000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: Column#7, collate: binary]", - " └─Union 16000.00 mpp[tiflash] ", - " ├─HashAgg 8000.00 mpp[tiflash] group by:test.t.a, funcs:sum(Column#30)->Column#10, funcs:firstrow(test.t.a)->Column#11, funcs:firstrow(test.t.a)->Column#7", - " │ └─ExchangeReceiver 8000.00 mpp[tiflash] ", - " │ └─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.a, collate: binary]", - " │ └─HashAgg 8000.00 mpp[tiflash] group by:test.t.a, funcs:count(1)->Column#30", - " │ └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo", - " └─HashAgg 8000.00 mpp[tiflash] group by:test.t.a, funcs:sum(Column#33)->Column#10, funcs:firstrow(test.t.a)->Column#11, funcs:firstrow(test.t.a)->Column#7", - " └─ExchangeReceiver 8000.00 mpp[tiflash] ", - " └─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.a, collate: binary]", - " └─HashAgg 8000.00 mpp[tiflash] group by:test.t.a, funcs:count(1)->Column#33", - " └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" + " └─HashAgg 16000.00 mpp[tiflash] group by:Column#7, funcs:sum(Column#10)->Column#9, funcs:firstrow(Column#11)->Column#7", + " └─ExchangeReceiver 16000.00 mpp[tiflash] ", + " └─ExchangeSender 16000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: Column#7, collate: binary]", + " └─Union 16000.00 mpp[tiflash] ", + " ├─HashAgg 8000.00 mpp[tiflash] group by:test.t.a, funcs:sum(Column#30)->Column#10, funcs:firstrow(test.t.a)->Column#11, funcs:firstrow(test.t.a)->Column#7", + " │ └─ExchangeReceiver 8000.00 mpp[tiflash] ", + " │ └─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.a, collate: binary]", + " │ └─HashAgg 8000.00 mpp[tiflash] group by:test.t.a, funcs:count(1)->Column#30", + " │ └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo", + " └─HashAgg 8000.00 mpp[tiflash] group by:test.t.a, funcs:sum(Column#33)->Column#10, funcs:firstrow(test.t.a)->Column#11, funcs:firstrow(test.t.a)->Column#7", + " └─ExchangeReceiver 8000.00 mpp[tiflash] ", + " └─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: test.t.a, collate: binary]", + " └─HashAgg 8000.00 mpp[tiflash] group by:test.t.a, funcs:count(1)->Column#33", + " └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" ], "Warn": null } diff --git a/pkg/planner/core/casetest/flatplan/main_test.go b/pkg/planner/core/casetest/flatplan/main_test.go index 7295be82c07b1..c78de3d57ba72 100644 --- a/pkg/planner/core/casetest/flatplan/main_test.go +++ b/pkg/planner/core/casetest/flatplan/main_test.go @@ -39,6 +39,7 @@ func TestMain(m *testing.M) { }) opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("gopkg.in/natefinch/lumberjack%2ev2.(*Logger).millRun"), diff --git a/pkg/planner/core/casetest/hint/BUILD.bazel b/pkg/planner/core/casetest/hint/BUILD.bazel index 9db40cf4873e4..cf2c5aff0e10b 100644 --- a/pkg/planner/core/casetest/hint/BUILD.bazel +++ b/pkg/planner/core/casetest/hint/BUILD.bazel @@ -9,7 +9,7 @@ go_test( ], data = glob(["testdata/**"]), flaky = True, - shard_count = 6, + shard_count = 7, deps = [ "//pkg/config", "//pkg/domain", diff --git a/pkg/planner/core/casetest/hint/hint_test.go b/pkg/planner/core/casetest/hint/hint_test.go index 4f13d1edce434..98916fa3383d6 100644 --- a/pkg/planner/core/casetest/hint/hint_test.go +++ b/pkg/planner/core/casetest/hint/hint_test.go @@ -334,4 +334,35 @@ func TestOptimizeHintOnPartitionTable(t *testing.T) { tk.MustQuery("explain format = 'brief' " + tt).Check(testkit.Rows(output[i].Plan...)) tk.MustQuery("show warnings").Check(testkit.Rows(output[i].Warn...)) } + tk.MustQuery("SELECT /*+ MAX_EXECUTION_TIME(10) */ SLEEP(5)").Check(testkit.Rows("0")) + tk.MustQuery("SELECT /*+ MAX_EXECUTION_TIME(10), dtc(name=tt) */ SLEEP(5)").Check(testkit.Rows("0")) + require.Len(t, tk.Session().GetSessionVars().StmtCtx.GetWarnings(), 1) + tk.MustQuery("SELECT /*+ MAX_EXECUTION_TIME(10), dtc(name=tt) unknow(t1,t2) */ SLEEP(5)").Check(testkit.Rows("0")) + require.Len(t, tk.Session().GetSessionVars().StmtCtx.GetWarnings(), 2) +} + +func TestHints(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("create table t1 (a int);") + tk.MustExec("create table t2 (a int);") + tk.MustExec("create table t3 (a int);") + var input []string + var output []struct { + SQL string + Plan []string + Warn []string + } + integrationSuiteData := GetIntegrationSuiteData() + integrationSuiteData.LoadTestCases(t, &input, &output) + for i, tt := range input { + testdata.OnRecord(func() { + output[i].SQL = tt + output[i].Plan = testdata.ConvertRowsToStrings(tk.MustQuery("explain format = 'brief' " + tt).Rows()) + output[i].Warn = testdata.ConvertRowsToStrings(tk.MustQuery("show warnings").Rows()) + }) + tk.MustQuery("explain format = 'brief' " + tt).Check(testkit.Rows(output[i].Plan...)) + tk.MustQuery("show warnings").Check(testkit.Rows(output[i].Warn...)) + } } diff --git a/pkg/planner/core/casetest/hint/main_test.go b/pkg/planner/core/casetest/hint/main_test.go index 07482a3e3efe8..ae6224aa182f0 100644 --- a/pkg/planner/core/casetest/hint/main_test.go +++ b/pkg/planner/core/casetest/hint/main_test.go @@ -39,6 +39,7 @@ func TestMain(m *testing.M) { }) opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("gopkg.in/natefinch/lumberjack%2ev2.(*Logger).millRun"), diff --git a/pkg/planner/core/casetest/hint/testdata/integration_suite_in.json b/pkg/planner/core/casetest/hint/testdata/integration_suite_in.json index 9959c3a7ca666..9edca6deacc28 100644 --- a/pkg/planner/core/casetest/hint/testdata/integration_suite_in.json +++ b/pkg/planner/core/casetest/hint/testdata/integration_suite_in.json @@ -180,5 +180,11 @@ "explain format = 'brief' select /*+ use_index(t, idx)*/ * from t", "explain format = 'brief' select /*+ use_index(t)*/ * from t" ] + }, + { + "name": "TestHints", + "cases": [ + "select * from t1, t2, t3 union all select /*+ leading(t3, t2) */ * from t1, t2, t3 union all select * from t1, t2, t3" + ] } ] diff --git a/pkg/planner/core/casetest/hint/testdata/integration_suite_out.json b/pkg/planner/core/casetest/hint/testdata/integration_suite_out.json index 369189e4531db..471b39747cf4a 100644 --- a/pkg/planner/core/casetest/hint/testdata/integration_suite_out.json +++ b/pkg/planner/core/casetest/hint/testdata/integration_suite_out.json @@ -325,7 +325,7 @@ " └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" ], "Warn": [ - "[planner:1815]We can only use one leading hint at most, when multiple leading hints are used, all leading hints will be invalid" + "[planner:1815]leading hint is inapplicable, check if the leading hint table is valid" ] }, { @@ -347,7 +347,7 @@ " └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" ], "Warn": [ - "[planner:1815]We can only use one leading hint at most, when multiple leading hints are used, all leading hints will be invalid" + "[planner:1815]leading hint is inapplicable, check if the leading hint table is valid" ] }, { @@ -1862,5 +1862,44 @@ "Warn": null } ] + }, + { + "Name": "TestHints", + "Cases": [ + { + "SQL": "select * from t1, t2, t3 union all select /*+ leading(t3, t2) */ * from t1, t2, t3 union all select * from t1, t2, t3", + "Plan": [ + "Union 3000000000000.00 root ", + "├─HashJoin 1000000000000.00 root CARTESIAN inner join", + "│ ├─TableReader(Build) 10000.00 root data:TableFullScan", + "│ │ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", + "│ └─HashJoin(Probe) 100000000.00 root CARTESIAN inner join", + "│ ├─TableReader(Build) 10000.00 root data:TableFullScan", + "│ │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + "│ └─TableReader(Probe) 10000.00 root data:TableFullScan", + "│ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + "├─Projection 1000000000000.00 root test.t1.a->Column#19, test.t2.a->Column#20, test.t3.a->Column#21", + "│ └─HashJoin 1000000000000.00 root CARTESIAN inner join", + "│ ├─TableReader(Build) 10000.00 root data:TableFullScan", + "│ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + "│ └─HashJoin(Probe) 100000000.00 root CARTESIAN inner join", + "│ ├─TableReader(Build) 10000.00 root data:TableFullScan", + "│ │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + "│ └─TableReader(Probe) 10000.00 root data:TableFullScan", + "│ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", + "└─HashJoin 1000000000000.00 root CARTESIAN inner join", + " ├─TableReader(Build) 10000.00 root data:TableFullScan", + " │ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 100000000.00 root CARTESIAN inner join", + " ├─TableReader(Build) 10000.00 root data:TableFullScan", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + " └─TableReader(Probe) 10000.00 root data:TableFullScan", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + ], + "Warn": [ + "Warning 1815 leading hint is inapplicable, check if the leading hint table has join conditions with other tables" + ] + } + ] } ] diff --git a/pkg/planner/core/casetest/index/BUILD.bazel b/pkg/planner/core/casetest/index/BUILD.bazel index 648f2e993d7ff..96df3221e09ff 100644 --- a/pkg/planner/core/casetest/index/BUILD.bazel +++ b/pkg/planner/core/casetest/index/BUILD.bazel @@ -9,15 +9,12 @@ go_test( ], data = glob(["testdata/**"]), flaky = True, - shard_count = 14, deps = [ - "//pkg/sessionctx/variable", "//pkg/testkit", "//pkg/testkit/testdata", "//pkg/testkit/testmain", "//pkg/testkit/testsetup", "//pkg/util", - "@com_github_stretchr_testify//require", "@org_uber_go_goleak//:goleak", ], ) diff --git a/pkg/planner/core/casetest/index/index_test.go b/pkg/planner/core/casetest/index/index_test.go index eea129788efa1..e1445b64a8ffc 100644 --- a/pkg/planner/core/casetest/index/index_test.go +++ b/pkg/planner/core/casetest/index/index_test.go @@ -16,318 +16,13 @@ package index import ( "fmt" - "strings" "testing" - "github.com/pingcap/tidb/pkg/sessionctx/variable" "github.com/pingcap/tidb/pkg/testkit" "github.com/pingcap/tidb/pkg/testkit/testdata" "github.com/pingcap/tidb/pkg/util" - "github.com/stretchr/testify/require" ) -func TestIndexJoinUniqueCompositeIndex(t *testing.T) { - store := testkit.CreateMockStore(t) - tk := testkit.NewTestKit(t, store) - - tk.MustExec("set tidb_cost_model_version=2") - tk.MustExec("use test") - tk.MustExec("drop table if exists t1, t2") - tk.Session().GetSessionVars().EnableClusteredIndex = variable.ClusteredIndexDefModeIntOnly - tk.MustExec("create table t1(a int not null, c int not null)") - tk.MustExec("create table t2(a int not null, b int not null, c int not null, primary key(a,b))") - tk.MustExec("insert into t1 values(1,1)") - tk.MustExec("insert into t2 values(1,1,1),(1,2,1)") - tk.MustExec("analyze table t1,t2") - - var input []string - var output []struct { - SQL string - Plan []string - } - integrationSuiteData := GetIntegrationSuiteData() - integrationSuiteData.LoadTestCases(t, &input, &output) - for i, tt := range input { - testdata.OnRecord(func() { - output[i].SQL = tt - output[i].Plan = testdata.ConvertRowsToStrings(tk.MustQuery(tt).Rows()) - }) - tk.MustQuery(tt).Check(testkit.Rows(output[i].Plan...)) - } -} - -func TestIndexMergeFromComposedDNFCondition(t *testing.T) { - store := testkit.CreateMockStore(t) - tk := testkit.NewTestKit(t, store) - - tk.MustExec("use test") - tk.MustExec("drop table if exists t2") - tk.MustExec("create table t2(pk int primary key, a json, b json, c int, d int, e int, index idx(c, " + - "(cast(a as signed array))), index idx2((cast(b as signed array)), c), index idx3(c, d), index idx4(d));") - - var input []string - var output []struct { - SQL string - Plan []string - } - integrationSuiteData := GetIntegrationSuiteData() - integrationSuiteData.LoadTestCases(t, &input, &output) - - for i, tt := range input { - testdata.OnRecord(func() { - output[i].SQL = tt - output[i].Plan = testdata.ConvertRowsToStrings(tk.MustQuery(tt).Rows()) - }) - tk.MustQuery(tt).Check(testkit.Rows(output[i].Plan...)) - } -} - -func TestIndexMergeFromComposedCNFCondition(t *testing.T) { - store := testkit.CreateMockStore(t) - tk := testkit.NewTestKit(t, store) - - tk.MustExec("use test") - tk.MustExec("drop table if exists t1, t2") - tk.MustExec("create table t1(pk int primary key, a json, b json, c int, d int, index idx((cast(a as signed array))), index idx2((cast(b as signed array))));") - tk.MustExec("create table t2(pk int primary key, a json, b json, c int, d int, index idx(c, (cast(a as signed array))), index idx2((cast(b as signed array)), c), index idx3(c, d), index idx4(d));") - - var input []string - var output []struct { - SQL string - Plan []string - } - integrationSuiteData := GetIntegrationSuiteData() - integrationSuiteData.LoadTestCases(t, &input, &output) - - for i, tt := range input { - testdata.OnRecord(func() { - output[i].SQL = tt - output[i].Plan = testdata.ConvertRowsToStrings(tk.MustQuery(tt).Rows()) - }) - tk.MustQuery(tt).Check(testkit.Rows(output[i].Plan...)) - } -} - -func TestIndexMerge(t *testing.T) { - store := testkit.CreateMockStore(t) - tk := testkit.NewTestKit(t, store) - - tk.MustExec("use test") - tk.MustExec("drop table if exists t") - tk.MustExec("create table t(a int, b int, c int, unique index(a), unique index(b), primary key(c))") - - var input []string - var output []struct { - SQL string - Plan []string - } - integrationSuiteData := GetIntegrationSuiteData() - integrationSuiteData.LoadTestCases(t, &input, &output) - for i, tt := range input { - testdata.OnRecord(func() { - output[i].SQL = tt - output[i].Plan = testdata.ConvertRowsToStrings(tk.MustQuery(tt).Rows()) - }) - tk.MustQuery(tt).Check(testkit.Rows(output[i].Plan...)) - } -} - -// for issue #14822 and #38258 -func TestIndexJoinTableRange(t *testing.T) { - store := testkit.CreateMockStore(t) - tk := testkit.NewTestKit(t, store) - - tk.MustExec("use test") - tk.MustExec("drop table if exists t1, t2") - tk.MustExec("create table t1(a int, b int, primary key (a), key idx_t1_b (b))") - tk.MustExec("create table t2(a int, b int, primary key (a), key idx_t1_b (b))") - tk.MustExec("create table t3(a int, b int, c int)") - tk.MustExec("create table t4(a int, b int, c int, primary key (a, b) clustered)") - - var input []string - var output []struct { - SQL string - Plan []string - } - integrationSuiteData := GetIntegrationSuiteData() - integrationSuiteData.LoadTestCases(t, &input, &output) - for i, tt := range input { - testdata.OnRecord(func() { - output[i].SQL = tt - output[i].Plan = testdata.ConvertRowsToStrings(tk.MustQuery(tt).Rows()) - }) - tk.MustQuery(tt).Check(testkit.Rows(output[i].Plan...)) - } -} - -func TestIndexJoinInnerIndexNDV(t *testing.T) { - store := testkit.CreateMockStore(t) - tk := testkit.NewTestKit(t, store) - tk.MustExec("use test") - tk.MustExec("set tidb_cost_model_version=2") - tk.MustExec("drop table if exists t1, t2") - tk.MustExec("create table t1(a int not null, b int not null, c int not null)") - tk.MustExec("create table t2(a int not null, b int not null, c int not null, index idx1(a,b), index idx2(c))") - tk.MustExec("insert into t1 values(1,1,1),(1,1,1),(1,1,1)") - tk.MustExec("insert into t2 values(1,1,1),(1,1,2),(1,1,3)") - tk.MustExec("analyze table t1, t2") - - var input []string - var output []struct { - SQL string - Plan []string - } - integrationSuiteData := GetIntegrationSuiteData() - integrationSuiteData.LoadTestCases(t, &input, &output) - for i, tt := range input { - testdata.OnRecord(func() { - output[i].SQL = tt - output[i].Plan = testdata.ConvertRowsToStrings(tk.MustQuery(tt).Rows()) - }) - tk.MustQuery(tt).Check(testkit.Rows(output[i].Plan...)) - } -} - -func TestIndexMergeSerial(t *testing.T) { - store := testkit.CreateMockStore(t) - tk := testkit.NewTestKit(t, store) - tk.MustExec("use test") - tk.MustExec("drop table if exists t") - tk.MustExec("create table t (a int, b int, unique key(a), unique key(b))") - tk.MustExec("insert into t value (1, 5), (2, 4), (3, 3), (4, 2), (5, 1)") - tk.MustExec("insert into t value (6, 0), (7, -1), (8, -2), (9, -3), (10, -4)") - tk.MustExec("analyze table t") - - var input []string - var output []struct { - SQL string - Plan []string - Warnings []string - } - integrationSuiteData := GetIntegrationSuiteData() - integrationSuiteData.LoadTestCases(t, &input, &output) - for i, tt := range input { - testdata.OnRecord(func() { - output[i].SQL = tt - output[i].Plan = testdata.ConvertRowsToStrings(tk.MustQuery(tt).Rows()) - output[i].Warnings = testdata.ConvertRowsToStrings(tk.MustQuery("show warnings").Rows()) - }) - tk.MustQuery(tt).Check(testkit.Rows(output[i].Plan...)) - tk.MustQuery("show warnings").Check(testkit.Rows(output[i].Warnings...)) - } -} - -func TestIndexJoinOnClusteredIndex(t *testing.T) { - store := testkit.CreateMockStore(t) - tk := testkit.NewTestKit(t, store) - tk.MustExec("use test") - tk.MustExec("set tidb_cost_model_version=2") - tk.Session().GetSessionVars().EnableClusteredIndex = variable.ClusteredIndexDefModeOn - tk.MustExec("drop table if exists t1") - tk.MustExec("create table t (a int, b varchar(20), c decimal(40,10), d int, primary key(a,b), key(c))") - tk.MustExec(`insert into t values (1,"111",1.1,11), (2,"222",2.2,12), (3,"333",3.3,13)`) - tk.MustExec("analyze table t") - - var input []string - var output []struct { - SQL string - Plan []string - Res []string - } - integrationSuiteData := GetIntegrationSuiteData() - integrationSuiteData.LoadTestCases(t, &input, &output) - for i, tt := range input { - testdata.OnRecord(func() { - output[i].SQL = tt - output[i].Plan = testdata.ConvertRowsToStrings(tk.MustQuery("explain format = 'brief' " + tt).Rows()) - output[i].Res = testdata.ConvertRowsToStrings(tk.MustQuery(tt).Rows()) - }) - tk.MustQuery("explain format = 'brief'" + tt).Check(testkit.Rows(output[i].Plan...)) - tk.MustQuery(tt).Check(testkit.Rows(output[i].Res...)) - } -} - -func TestIndexMergeWithCorrelatedColumns(t *testing.T) { - store := testkit.CreateMockStore(t) - tk := testkit.NewTestKit(t, store) - tk.MustExec("use test;") - - tk.MustExec("set tidb_cost_model_version=2") - tk.MustExec("drop table if exists t1, t2;") - tk.MustExec("create table t1(c1 int, c2 int, c3 int, primary key(c1), key(c2));") - tk.MustExec("insert into t1 values(1, 1, 1);") - tk.MustExec("insert into t1 values(2, 2, 2);") - tk.MustExec("create table t2(c1 int, c2 int, c3 int);") - tk.MustExec("insert into t2 values(1, 1, 1);") - tk.MustExec("insert into t2 values(2, 2, 2);") - - tk.MustExec("drop table if exists tt1, tt2;") - tk.MustExec("create table tt1 (c_int int, c_str varchar(40), c_datetime datetime, c_decimal decimal(12, 6), primary key(c_int), key(c_int), key(c_str), unique key(c_decimal), key(c_datetime));") - tk.MustExec("create table tt2 like tt1 ;") - tk.MustExec(`insert into tt1 (c_int, c_str, c_datetime, c_decimal) values (6, 'sharp payne', '2020-06-07 10:40:39', 6.117000) , - (7, 'objective kare', '2020-02-05 18:47:26', 1.053000) , - (8, 'thirsty pasteur', '2020-01-02 13:06:56', 2.506000) , - (9, 'blissful wilbur', '2020-06-04 11:34:04', 9.144000) , - (10, 'reverent mclean', '2020-02-12 07:36:26', 7.751000) ;`) - tk.MustExec(`insert into tt2 (c_int, c_str, c_datetime, c_decimal) values (6, 'beautiful joliot', '2020-01-16 01:44:37', 5.627000) , - (7, 'hopeful blackburn', '2020-05-23 21:44:20', 7.890000) , - (8, 'ecstatic davinci', '2020-02-01 12:27:17', 5.648000) , - (9, 'hopeful lewin', '2020-05-05 05:58:25', 7.288000) , - (10, 'sharp jennings', '2020-01-28 04:35:03', 9.758000) ;`) - - var input []string - var output []struct { - SQL string - Plan []string - Res []string - } - integrationSuiteData := GetIntegrationSuiteData() - integrationSuiteData.LoadTestCases(t, &input, &output) - for i, tt := range input { - testdata.OnRecord(func() { - output[i].SQL = tt - output[i].Plan = testdata.ConvertRowsToStrings(tk.MustQuery("explain format=brief " + tt).Rows()) - output[i].Res = testdata.ConvertRowsToStrings(tk.MustQuery(tt).Rows()) - }) - tk.MustQuery("explain format=brief " + tt).Check(testkit.Rows(output[i].Plan...)) - tk.MustQuery(tt).Check(testkit.Rows(output[i].Res...)) - } -} - -func TestIndexJoinRangeFallback(t *testing.T) { - store := testkit.CreateMockStore(t) - tk := testkit.NewTestKit(t, store) - tk.MustExec("use test") - tk.MustExec("drop table if exists t1, t2") - tk.MustExec("create table t1(a int, b int, c varchar(10), d varchar(10), index idx_a_b_c_d(a, b, c(2), d(2)))") - tk.MustExec("create table t2(e int, f int, g varchar(10), h varchar(10))") - - var input []string - var output []struct { - SQL string - Plan []string - Warn []string - } - integrationSuiteData := GetIntegrationSuiteData() - integrationSuiteData.LoadTestCases(t, &input, &output) - for i, tt := range input { - setStmt := strings.HasPrefix(tt, "set") - testdata.OnRecord(func() { - output[i].SQL = tt - if !setStmt { - output[i].Plan = testdata.ConvertRowsToStrings(tk.MustQuery(tt).Rows()) - output[i].Warn = testdata.ConvertSQLWarnToStrings(tk.Session().GetSessionVars().StmtCtx.GetWarnings()) - } - }) - if setStmt { - tk.MustExec(tt) - } else { - tk.MustQuery(tt).Check(testkit.Rows(output[i].Plan...)) - require.Equal(t, output[i].Warn, testdata.ConvertSQLWarnToStrings(tk.Session().GetSessionVars().StmtCtx.GetWarnings())) - } - } -} - func TestNullConditionForPrefixIndex(t *testing.T) { store := testkit.CreateMockStore(t) tk := testkit.NewTestKit(t, store) @@ -383,89 +78,3 @@ func TestNullConditionForPrefixIndex(t *testing.T) { " └─StreamAgg_9 1.00 cop[tikv] funcs:count(1)->Column#7", " └─IndexRangeScan_16 99.90 cop[tikv] table:t1, index:idx2(c1, c2) range:[\"0xfff\" -inf,\"0xfff\" +inf], keep order:false, stats:pseudo")) } - -func TestHeuristicIndexSelection(t *testing.T) { - store := testkit.CreateMockStore(t) - tk := testkit.NewTestKit(t, store) - tk.MustExec("use test") - tk.MustExec("set tidb_cost_model_version=2") - tk.MustExec("drop table if exists t1, t2") - tk.MustExec("create table t1(a int, b int, c int, d int, e int, f int, g int, primary key (a), unique key c_d_e (c, d, e), unique key f (f), unique key f_g (f, g), key g (g))") - tk.MustExec("create table t2(a int, b int, c int, d int, unique index idx_a (a), unique index idx_b_c (b, c), unique index idx_b_c_a_d (b, c, a, d))") - tk.MustExec("create table t3(a bigint, b varchar(255), c bigint, primary key(a, b) clustered)") - tk.MustExec("create table t4(a bigint, b varchar(255), c bigint, primary key(a, b) nonclustered)") - - // Default RPC encoding may cause statistics explain result differ and then the test unstable. - tk.MustExec("set @@tidb_enable_chunk_rpc = on") - - var input []string - var output []struct { - SQL string - Plan []string - Warnings []string - } - integrationSuiteData := GetIntegrationSuiteData() - integrationSuiteData.LoadTestCases(t, &input, &output) - for i, tt := range input { - testdata.OnRecord(func() { - output[i].SQL = tt - output[i].Plan = testdata.ConvertRowsToStrings(tk.MustQuery("explain format = 'verbose' " + tt).Rows()) - output[i].Warnings = testdata.ConvertRowsToStrings(tk.MustQuery("show warnings").Rows()) - }) - tk.MustQuery("explain format = 'verbose' " + tt).Check(testkit.Rows(output[i].Plan...)) - tk.MustQuery("show warnings").Check(testkit.Rows(output[i].Warnings...)) - } -} - -func TestLimitIndexLookUpKeepOrder(t *testing.T) { - store := testkit.CreateMockStore(t) - tk := testkit.NewTestKit(t, store) - tk.MustExec("use test") - tk.MustExec("set tidb_cost_model_version=2") - tk.MustExec("drop table if exists t;") - tk.MustExec("create table t(a int, b int, c int, d int, index idx(a,b,c));") - - var input []string - var output []struct { - SQL string - Plan []string - } - integrationSuiteData := GetIntegrationSuiteData() - integrationSuiteData.LoadTestCases(t, &input, &output) - for i, tt := range input { - testdata.OnRecord(func() { - output[i].SQL = tt - output[i].Plan = testdata.ConvertRowsToStrings(tk.MustQuery(tt).Rows()) - }) - tk.MustQuery(tt).Check(testkit.Rows(output[i].Plan...)) - } -} - -func TestAccessPathOnClusterIndex(t *testing.T) { - store := testkit.CreateMockStore(t) - tk := testkit.NewTestKit(t, store) - tk.MustExec("use test") - tk.Session().GetSessionVars().EnableClusteredIndex = variable.ClusteredIndexDefModeOn - tk.MustExec("drop table if exists t1") - tk.MustExec("create table t1 (a int, b varchar(20), c decimal(40,10), d int, primary key(a,b), key(c))") - tk.MustExec(`insert into t1 values (1,"111",1.1,11), (2,"222",2.2,12), (3,"333",3.3,13)`) - tk.MustExec("analyze table t1") - - var input []string - var output []struct { - SQL string - Plan []string - Res []string - } - integrationSuiteData := GetIntegrationSuiteData() - integrationSuiteData.LoadTestCases(t, &input, &output) - for i, tt := range input { - testdata.OnRecord(func() { - output[i].SQL = tt - output[i].Plan = testdata.ConvertRowsToStrings(tk.MustQuery("explain format='brief' " + tt).Rows()) - output[i].Res = testdata.ConvertRowsToStrings(tk.MustQuery(tt).Sort().Rows()) - }) - tk.MustQuery("explain format='brief' " + tt).Check(testkit.Rows(output[i].Plan...)) - tk.MustQuery(tt).Sort().Check(testkit.Rows(output[i].Res...)) - } -} diff --git a/pkg/planner/core/casetest/index/main_test.go b/pkg/planner/core/casetest/index/main_test.go index b7f7c1d55f621..cad74fcb20ddb 100644 --- a/pkg/planner/core/casetest/index/main_test.go +++ b/pkg/planner/core/casetest/index/main_test.go @@ -34,6 +34,7 @@ func TestMain(m *testing.M) { opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("gopkg.in/natefinch/lumberjack%2ev2.(*Logger).millRun"), diff --git a/pkg/planner/core/casetest/index/testdata/integration_suite_in.json b/pkg/planner/core/casetest/index/testdata/integration_suite_in.json index c7dac835f37b3..5bc6d2c672129 100644 --- a/pkg/planner/core/casetest/index/testdata/integration_suite_in.json +++ b/pkg/planner/core/casetest/index/testdata/integration_suite_in.json @@ -1,134 +1,4 @@ [ - { - "name": "TestIndexJoinInnerIndexNDV", - "cases": [ - // t2 should use idx2 instead of idx1, since idx2 has larger NDV. - "explain format = 'brief' select /*+ inl_join(t2) */ * from t1, t2 where t1.a = t2.a and t1.b = t2.b and t1.c = t2.c" - ] - }, - { - "name": "TestIndexJoinUniqueCompositeIndex", - "cases": [ - // Row count of IndexScan should be 2. - "explain format = 'brief' select /*+ TIDB_INLJ(t2) */ * from t1 join t2 on t1.a = t2.a and t1.c = t2.c", - // Row count of IndexScan should be 2. - "explain format = 'brief' select /*+ TIDB_INLJ(t2) */ * from t1 join t2 on t1.a = t2.a and t1.c <= t2.b", - // Row count of IndexScan should be 1. - "explain format = 'brief' select /*+ TIDB_INLJ(t2) */ * from t1 join t2 on t1.a = t2.a and t2.b = 1" - ] - }, - { - "name": "TestIndexMerge", - "cases": [ - "explain format = 'brief' select /*+ USE_INDEX_MERGE(t, a, b) */ * from t where a = 1 or b = 2", - "explain format = 'brief' select /*+ USE_INDEX_MERGE(t, A, B) */ * from t where a = 1 or b = 2", - "explain format = 'brief' select /*+ USE_INDEX_MERGE(t, primary) */ * from t where 1 or t.c", - "explain format = 'brief' select /*+ USE_INDEX_MERGE(t, a, b, c) */ * from t where 1 or t.a = 1 or t.b = 2" - ] - }, - { - "name": "TestIndexJoinTableRange", - "cases": [ - "desc format = 'brief' select /*+ TIDB_INLJ(t2)*/ * from t1, t2 where t1.a = t2.a and t1.b = t2.b", - "desc format = 'brief' select /*+ TIDB_INLJ(t2)*/ * from t1, t2 where t1.a = t2.a and t1.b = t2.a and t1.b = t2.b", - "desc format = 'brief' select /*+ INL_JOIN(t4) */ * from t3 join t4 on t3.a = t4.a where t4.b = 1", - "desc format = 'brief' select /*+ INL_JOIN(t4) */ * from t3 join t4 on t3.b = t4.b where t4.a = 1" - ] - }, - { - "name": "TestAccessPathOnClusterIndex", - "cases": [ - "select * from t1", - "select * from t1 where t1.a >= 1 and t1.a < 4", - "select * from t1 where t1.a = 1 and t1.b < \"333\"", - "select t1.a, t1.b, t1.c from t1 where t1.c = 3.3", - "select t1.b, t1.c from t1 where t1.c = 2.2", - "select /*+ use_index(t1, c) */ * from t1", - "select * from t1 use index(c) where t1.c in (2.2, 3.3)", - "select * from t1 where t1.a = 1 order by b", - "select * from t1 order by a, b limit 1", - "select /*+ use_index_merge(t1 primary, c) */ * from t1 where t1.a >= 1 or t1.c = 2.2", - "select /*+ use_index_merge(t1 primary, c) */ * from t1 where t1.a = 1 and t1.b = '111' or t1.c = 3.3" - ] - }, - { - "name": "TestIndexJoinOnClusteredIndex", - "cases": [ - "select /*+ inl_join(t1, t2) */ * from t t1 join t t2 on t1.a = t2.a", - "select /*+ inl_merge_join(t1, t2) */ * from t t1 join t t2 on t1.a = t2.a", - "select /*+ inl_hash_join(t1, t2) */ * from t t1 join t t2 on t1.a = t2.a", - "select /*+ inl_join(t1, t2) */ * from t t1 join t t2 on t1.a = t2.a and t1.b = t2.b", - "select /*+ inl_join(t1, t2) */ * from t t1 join t t2 on t1.c = t2.c", - "select /*+ inl_merge_join(t1,t2) */ t2.a, t2.c, t2.d from t t1 left join t t2 on t1.a = t2.c;" - ] - }, - { - "name": "TestHeuristicIndexSelection", - "cases": [ - "select * from t1 where a = 3 or a = 5", - "select f, g from t1 where f = 2 and g in (3, 4, 5)", - "select * from t1 where c = 1 and (d = 2 or d = 3) and e in (4, 5)", - "select f, g from t1 where f = 2 and g > 3", - "select a, b, c from t2 where a = 1 and b = 2 and c in (1, 2, 3, 4, 5)", - "select * from t3 where (a = 1 or a = 3) and b = 'xx'", - "select * from t4 where (a = 1 or a = 3) and b = 'xx'", - "select a, b from t3 where (a = 1 or a = 3) and b = 'xx'", - "select a, b from t4 where (a = 1 or a = 3) and b = 'xx'", - "update t1 set b = 2 where a = 4 or a = 6", - "delete from t1 where f = 2 and g in (3, 4)", - "insert into t3 select a, b, c from t1 where f = 2", - "replace into t3 select a, b, c from t1 where a = 3" - ] - }, - { - "name": "TestIndexMergeWithCorrelatedColumns", - "cases": [ - "select * from t2 where c1 < all(select /*+ use_index_merge(t1) */ c1 from t1 where (c1 = 10 and c1 = t2.c3 or c2 = 1 and c2 = t2.c3) and substring(c3, 10)) order by c1;", - "select * from t2 where c1 < all(select /*+ use_index_merge(t1) */ c1 from t1 where (c1 = 10 and c1 = t2.c3 or c2 = 1 and c2 = t2.c3) and reverse(c3)) order by c1;", - "select * from t2 where c1 < all(select /*+ use_index_merge(t1) */ c1 from t1 where (c1 >= 10 and c1 = t2.c3 or c2 = 1 and c2 = t2.c3) and substring(c3, 10)) order by c1;", - // Test correlated column in IndexPath.TableFilters. - "select c_int from tt1 where c_decimal < all (select /*+ use_index_merge(tt2) */ c_decimal from tt2 where tt1.c_int = tt2.c_int and tt1.c_datetime > tt2.c_datetime and tt2.c_decimal = 9.060 or tt2.c_str <= 'interesting shtern' and tt1.c_int = tt2.c_int) order by 1;", - // Test correlated column in TablePath.TableFilters. - "select c_int from tt1 where c_decimal > all (select /*+ use_index_merge(tt2) */ c_decimal from tt2 where tt2.c_int = 7 and tt2.c_int < tt1.c_decimal or tt2.c_str >= 'zzzzzzzzzzzzzzzzzzz' and tt1.c_int = tt2.c_int) order by 1;" - ] - }, - { - "name": "TestIndexMergeSerial", - "cases": [ - "desc format='brief' select /*+ use_index_merge(t) */ * from t where a =1 or (b=1 and b+2>1)", - "desc format='brief' select /*+ use_index_merge(t) */ * from t where a =1 or (b=1 and length(b)=1)", - "desc format='brief' select /*+ use_index_merge(t) */ * from t where (a=1 and length(a)=1) or (b=1 and length(b)=1)", - "desc format='brief' select /*+ use_index_merge(t) */ * from t where (a=1 and length(b)=1) or (b=1 and length(a)=1)" - ] - }, - { - "name": "TestLimitIndexLookUpKeepOrder", - "cases": [ - "desc format = 'brief' select * from t where a = 1 and b > 2 and b < 10 and d = 10 order by b,c limit 10", - "desc format = 'brief' select * from t where a = 1 and b > 2 and b < 10 and d = 10 order by b desc, c desc limit 10" - ] - }, - { - "name": "TestIndexJoinRangeFallback", - "cases": [ - "set @@tidb_opt_range_max_size = 0", - "explain format='brief' select /*+ inl_join(t1) */ * from t1 join t2 on t1.b = t2.e and t1.d = t2.g where t1.a in (1, 3) and t1.c in ('aaa', 'bbb')", - "set @@tidb_opt_range_max_size = 2900", - "explain format='brief' select /*+ inl_join(t1) */ * from t1 join t2 on t1.b = t2.e and t1.d = t2.g where t1.a in (1, 3) and t1.c in ('aaa', 'bbb')", - "set @@tidb_opt_range_max_size = 2300", - "explain format='brief' select /*+ inl_join(t1) */ * from t1 join t2 on t1.b = t2.e and t1.d = t2.g where t1.a in (1, 3) and t1.c in ('aaa', 'bbb')", - "set @@tidb_opt_range_max_size = 700", - "explain format='brief' select /*+ inl_join(t1) */ * from t1 join t2 on t1.b = t2.e and t1.d = t2.g where t1.a in (1, 3) and t1.c in ('aaa', 'bbb')", - "set @@tidb_opt_range_max_size = 0", - "explain format='brief' select /*+ inl_join(t1) */ * from t1 join t2 on t1.a = t2.e where t1.b > 1 and t1.b < 10", - "set @@tidb_opt_range_max_size = 300", - "explain format='brief' select /*+ inl_join(t1) */ * from t1 join t2 on t1.a = t2.e where t1.b > 1 and t1.b < 10", - "set @@tidb_opt_range_max_size = 0", - "explain format='brief' select /*+ inl_join(t1) */ * from t1 join t2 on t1.a = t2.e where t1.b > t2.f and t1.b < t2.f + 10", - "set @@tidb_opt_range_max_size = 300", - "explain format='brief' select /*+ inl_join(t1) */ * from t1 join t2 on t1.a = t2.e where t1.b > t2.f and t1.b < t2.f + 10" - ] - }, { "name": "TestNullConditionForPrefixIndex", "cases": [ @@ -149,30 +19,5 @@ "select b from t3 where a = 1 and b is not null", "select b from t3 where a = 1 and b is null" ] - }, - { - "name": "TestIndexMergeFromComposedCNFCondition", - "cases": [ - "explain select /*+ use_index_merge(t1, idx2, idx) */ * from t1 where 1 member of (a) and 2 member of (b); -- 1: AND index merge from multi member mv index predicate, since member of is single partial path, it can be merged with outer index merge.", - "explain select /*+ use_index_merge(t2, idx2, idx) */ * from t2 where 1 member of (a) and c=1 and 2 member of (b); -- 2: AND index merge from multi complicated mv index", - "explain select /*+ use_index_merge(t2, idx2, idx, idx4) */ * from t2 where 1 member of (a) and c=1 and 2 member of (b) and d=3; -- 3: AND index merge from multi complicated mv indexes and normal indexes", - "explain select /*+ use_index_merge(t2, idx2, idx, idx3) */ * from t2 where json_contains(a, '[1, 2, 3]') and c=1 and 2 member of (b) and d=3; -- 4: AND index merge from multi complicated mv indexes (json_contains (intersection))and normal indexes", - "explain select /*+ use_index_merge(t2, idx2, idx, idx3) */ * from t2 where json_overlaps(a, '[1, 2, 3]') and c=1 and 2 member of (b) and d=3; -- 5: AND index merge from multi complicated mv indexes (json_overlap (intersection))and normal indexes", - "explain select /*+ use_index_merge(t2, idx2, idx) */ * from t2 where 1 member of (a) and c=1 and c=2; -- 6: AND index merge from multi complicated mv indexes (empty range)" - ] - }, - { - "name": "TestIndexMergeFromComposedDNFCondition", - "cases": [ - "explain select /*+ use_index_merge(t2, idx2, idx) */ * from t2 where (1 member of (a) and c=1) or (2 member of (b) and c=1); -- 1: OR index merge from multi complicated mv index (memberof)", - "explain select /*+ use_index_merge(t2, idx2, idx) */ * from t2 where (1 member of (a) and c=1) or (2 member of (b) and c=1); -- 2: OR index merge from multi complicated mv index (memberof)", - "explain select /*+ use_index_merge(t2, idx2, idx) */ * from t2 where (1 member of (a) and c=1 and d=2) or (2 member of (b) and c=3 and d=2); -- 3: OR index merge from multi complicated mv index (memberof),while each DNF item contains redundant condition, which should be remained as table filters", - "explain select /*+ use_index_merge(t2, idx2, idx) */ * from t2 where ( json_contains(a, '[1, 2, 3]') and c=1 and d=2) or (2 member of (b) and c=3 and d=2); -- 4: OR index merge from multi complicated mv index (memberof),make full use of DNF item's condition even if the predicate is intersection case (json_contains)", - "explain select /*+ use_index_merge(t2, idx2, idx) */ * from t2 where ( json_overlaps(a, '[1, 2, 3]') and c=1 and d=2) or (2 member of (b) and c=3 and d=2); -- 5: OR index merge from multi complicated mv index (memberof),make full use of DNF item's condition even if the predicate is intersection case (json_contains)", - "explain select /*+ use_index_merge(t2, idx2, idx, idx4) */ * from t2 where ( json_contains(a, '[1, 2, 3]') and d=2) or (2 member of (b) and c=3 and d=2); -- 6: OR index merge from multi complicated mv index (memberof),make full use of other DNF items even if one of the DNF items fails", - "explain select /*+ use_index_merge(t2, idx2, idx) */ * from t2 where (1 member of (a) and 1 member of (b) and c=3) or (3 member of (b) and c=4); -- 7: OR index merge from multi complicated mv index (memberof),each DNF item can be more complicated like a another embedded CNF member-of composition.", - "explain select /*+ use_index_merge(t2, idx2, idx) */ * from t2 where (1 member of (a) and 1 member of (b) and c=3) or (3 member of (b) and c=4) or e=1; -- 8: OR index merge from multi complicated mv index (memberof), each DNF item should be strict or lax used as index partial path.", - "explain select /*+ use_index_merge(t2, idx2, idx, idx4) */ * from t2 where (1 member of (a) and 1 member of (b) and c=3) or (3 member of (b) and c=4) or d=1; -- 9: OR index merge from multi complicated mv index (memberof), each DNF item should be strict or lax used as index partial path, specify the index in index merge hint" - ] } ] diff --git a/pkg/planner/core/casetest/index/testdata/integration_suite_out.json b/pkg/planner/core/casetest/index/testdata/integration_suite_out.json index ce8eace0ab9b7..990012c0ba2f0 100644 --- a/pkg/planner/core/casetest/index/testdata/integration_suite_out.json +++ b/pkg/planner/core/casetest/index/testdata/integration_suite_out.json @@ -1,879 +1,4 @@ [ - { - "Name": "TestIndexJoinInnerIndexNDV", - "Cases": [ - { - "SQL": "explain format = 'brief' select /*+ inl_join(t2) */ * from t1, t2 where t1.a = t2.a and t1.b = t2.b and t1.c = t2.c", - "Plan": [ - "IndexJoin 3.00 root inner join, inner:IndexLookUp, outer key:test.t1.c, inner key:test.t2.c, equal cond:eq(test.t1.a, test.t2.a), eq(test.t1.b, test.t2.b), eq(test.t1.c, test.t2.c)", - "├─TableReader(Build) 3.00 root data:TableFullScan", - "│ └─TableFullScan 3.00 cop[tikv] table:t1 keep order:false", - "└─IndexLookUp(Probe) 3.00 root ", - " ├─IndexRangeScan(Build) 3.00 cop[tikv] table:t2, index:idx2(c) range: decided by [eq(test.t2.c, test.t1.c)], keep order:false", - " └─TableRowIDScan(Probe) 3.00 cop[tikv] table:t2 keep order:false" - ] - } - ] - }, - { - "Name": "TestIndexJoinUniqueCompositeIndex", - "Cases": [ - { - "SQL": "explain format = 'brief' select /*+ TIDB_INLJ(t2) */ * from t1 join t2 on t1.a = t2.a and t1.c = t2.c", - "Plan": [ - "IndexJoin 2.00 root inner join, inner:IndexLookUp, outer key:test.t1.a, inner key:test.t2.a, equal cond:eq(test.t1.a, test.t2.a), eq(test.t1.c, test.t2.c)", - "├─TableReader(Build) 1.00 root data:TableFullScan", - "│ └─TableFullScan 1.00 cop[tikv] table:t1 keep order:false", - "└─IndexLookUp(Probe) 2.00 root ", - " ├─IndexRangeScan(Build) 2.00 cop[tikv] table:t2, index:PRIMARY(a, b) range: decided by [eq(test.t2.a, test.t1.a)], keep order:false", - " └─TableRowIDScan(Probe) 2.00 cop[tikv] table:t2 keep order:false" - ] - }, - { - "SQL": "explain format = 'brief' select /*+ TIDB_INLJ(t2) */ * from t1 join t2 on t1.a = t2.a and t1.c <= t2.b", - "Plan": [ - "IndexJoin 2.00 root inner join, inner:IndexLookUp, outer key:test.t1.a, inner key:test.t2.a, equal cond:eq(test.t1.a, test.t2.a), other cond:le(test.t1.c, test.t2.b)", - "├─TableReader(Build) 1.00 root data:TableFullScan", - "│ └─TableFullScan 1.00 cop[tikv] table:t1 keep order:false", - "└─IndexLookUp(Probe) 2.00 root ", - " ├─IndexRangeScan(Build) 2.00 cop[tikv] table:t2, index:PRIMARY(a, b) range: decided by [eq(test.t2.a, test.t1.a) le(test.t1.c, test.t2.b)], keep order:false", - " └─TableRowIDScan(Probe) 2.00 cop[tikv] table:t2 keep order:false" - ] - }, - { - "SQL": "explain format = 'brief' select /*+ TIDB_INLJ(t2) */ * from t1 join t2 on t1.a = t2.a and t2.b = 1", - "Plan": [ - "IndexJoin 1.00 root inner join, inner:IndexLookUp, outer key:test.t1.a, inner key:test.t2.a, equal cond:eq(test.t1.a, test.t2.a)", - "├─TableReader(Build) 1.00 root data:TableFullScan", - "│ └─TableFullScan 1.00 cop[tikv] table:t1 keep order:false", - "└─IndexLookUp(Probe) 1.00 root ", - " ├─IndexRangeScan(Build) 1.00 cop[tikv] table:t2, index:PRIMARY(a, b) range: decided by [eq(test.t2.a, test.t1.a) eq(test.t2.b, 1)], keep order:false", - " └─TableRowIDScan(Probe) 1.00 cop[tikv] table:t2 keep order:false" - ] - } - ] - }, - { - "Name": "TestIndexMerge", - "Cases": [ - { - "SQL": "explain format = 'brief' select /*+ USE_INDEX_MERGE(t, a, b) */ * from t where a = 1 or b = 2", - "Plan": [ - "IndexMerge 2.00 root type: union", - "├─IndexRangeScan(Build) 1.00 cop[tikv] table:t, index:a(a) range:[1,1], keep order:false, stats:pseudo", - "├─IndexRangeScan(Build) 1.00 cop[tikv] table:t, index:b(b) range:[2,2], keep order:false, stats:pseudo", - "└─TableRowIDScan(Probe) 2.00 cop[tikv] table:t keep order:false, stats:pseudo" - ] - }, - { - "SQL": "explain format = 'brief' select /*+ USE_INDEX_MERGE(t, A, B) */ * from t where a = 1 or b = 2", - "Plan": [ - "IndexMerge 2.00 root type: union", - "├─IndexRangeScan(Build) 1.00 cop[tikv] table:t, index:a(a) range:[1,1], keep order:false, stats:pseudo", - "├─IndexRangeScan(Build) 1.00 cop[tikv] table:t, index:b(b) range:[2,2], keep order:false, stats:pseudo", - "└─TableRowIDScan(Probe) 2.00 cop[tikv] table:t keep order:false, stats:pseudo" - ] - }, - { - "SQL": "explain format = 'brief' select /*+ USE_INDEX_MERGE(t, primary) */ * from t where 1 or t.c", - "Plan": [ - "TableReader 10000.00 root data:TableFullScan", - "└─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" - ] - }, - { - "SQL": "explain format = 'brief' select /*+ USE_INDEX_MERGE(t, a, b, c) */ * from t where 1 or t.a = 1 or t.b = 2", - "Plan": [ - "TableReader 10000.00 root data:Selection", - "└─Selection 10000.00 cop[tikv] or(1, or(eq(test.t.a, 1), eq(test.t.b, 2)))", - " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" - ] - } - ] - }, - { - "Name": "TestIndexJoinTableRange", - "Cases": [ - { - "SQL": "desc format = 'brief' select /*+ TIDB_INLJ(t2)*/ * from t1, t2 where t1.a = t2.a and t1.b = t2.b", - "Plan": [ - "IndexJoin 12487.50 root inner join, inner:TableReader, outer key:test.t1.a, inner key:test.t2.a, equal cond:eq(test.t1.a, test.t2.a), eq(test.t1.b, test.t2.b)", - "├─IndexReader(Build) 9990.00 root index:IndexFullScan", - "│ └─IndexFullScan 9990.00 cop[tikv] table:t1, index:idx_t1_b(b) keep order:false, stats:pseudo", - "└─TableReader(Probe) 9980.01 root data:Selection", - " └─Selection 9980.01 cop[tikv] not(isnull(test.t2.b))", - " └─TableRangeScan 9990.00 cop[tikv] table:t2 range: decided by [test.t1.a], keep order:false, stats:pseudo" - ] - }, - { - "SQL": "desc format = 'brief' select /*+ TIDB_INLJ(t2)*/ * from t1, t2 where t1.a = t2.a and t1.b = t2.a and t1.b = t2.b", - "Plan": [ - "IndexJoin 12487.50 root inner join, inner:TableReader, outer key:test.t1.a, test.t1.b, inner key:test.t2.a, test.t2.a, equal cond:eq(test.t1.a, test.t2.a), eq(test.t1.b, test.t2.a), eq(test.t1.b, test.t2.b)", - "├─IndexReader(Build) 9990.00 root index:IndexFullScan", - "│ └─IndexFullScan 9990.00 cop[tikv] table:t1, index:idx_t1_b(b) keep order:false, stats:pseudo", - "└─TableReader(Probe) 9980.01 root data:Selection", - " └─Selection 9980.01 cop[tikv] not(isnull(test.t2.b))", - " └─TableRangeScan 9990.00 cop[tikv] table:t2 range: decided by [test.t1.a test.t1.b], keep order:false, stats:pseudo" - ] - }, - { - "SQL": "desc format = 'brief' select /*+ INL_JOIN(t4) */ * from t3 join t4 on t3.a = t4.a where t4.b = 1", - "Plan": [ - "Projection 12.50 root test.t3.a, test.t3.b, test.t3.c, test.t4.a, test.t4.b, test.t4.c", - "└─IndexJoin 12.50 root inner join, inner:TableReader, outer key:test.t3.a, inner key:test.t4.a, equal cond:eq(test.t3.a, test.t4.a)", - " ├─TableReader(Build) 9990.00 root data:Selection", - " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t3.a))", - " │ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", - " └─TableReader(Probe) 9.99 root data:Selection", - " └─Selection 9.99 cop[tikv] eq(test.t4.b, 1)", - " └─TableRangeScan 9990.00 cop[tikv] table:t4 range: decided by [eq(test.t4.a, test.t3.a) eq(test.t4.b, 1)], keep order:false, stats:pseudo" - ] - }, - { - "SQL": "desc format = 'brief' select /*+ INL_JOIN(t4) */ * from t3 join t4 on t3.b = t4.b where t4.a = 1", - "Plan": [ - "Projection 12.50 root test.t3.a, test.t3.b, test.t3.c, test.t4.a, test.t4.b, test.t4.c", - "└─IndexJoin 12.50 root inner join, inner:TableReader, outer key:test.t3.b, inner key:test.t4.b, equal cond:eq(test.t3.b, test.t4.b)", - " ├─TableReader(Build) 9990.00 root data:Selection", - " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t3.b))", - " │ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", - " └─TableReader(Probe) 9.99 root data:Selection", - " └─Selection 9.99 cop[tikv] eq(test.t4.a, 1)", - " └─TableRangeScan 9990.00 cop[tikv] table:t4 range: decided by [eq(test.t4.b, test.t3.b) eq(test.t4.a, 1)], keep order:false, stats:pseudo" - ] - } - ] - }, - { - "Name": "TestAccessPathOnClusterIndex", - "Cases": [ - { - "SQL": "select * from t1", - "Plan": [ - "TableReader 3.00 root data:TableFullScan", - "└─TableFullScan 3.00 cop[tikv] table:t1 keep order:false" - ], - "Res": [ - "1 111 1.1000000000 11", - "2 222 2.2000000000 12", - "3 333 3.3000000000 13" - ] - }, - { - "SQL": "select * from t1 where t1.a >= 1 and t1.a < 4", - "Plan": [ - "TableReader 3.00 root data:TableRangeScan", - "└─TableRangeScan 3.00 cop[tikv] table:t1 range:[1,4), keep order:false" - ], - "Res": [ - "1 111 1.1000000000 11", - "2 222 2.2000000000 12", - "3 333 3.3000000000 13" - ] - }, - { - "SQL": "select * from t1 where t1.a = 1 and t1.b < \"333\"", - "Plan": [ - "TableReader 0.82 root data:TableRangeScan", - "└─TableRangeScan 0.82 cop[tikv] table:t1 range:[1 -inf,1 \"333\"), keep order:false" - ], - "Res": [ - "1 111 1.1000000000 11" - ] - }, - { - "SQL": "select t1.a, t1.b, t1.c from t1 where t1.c = 3.3", - "Plan": [ - "IndexReader 1.00 root index:IndexRangeScan", - "└─IndexRangeScan 1.00 cop[tikv] table:t1, index:c(c) range:[3.3000000000,3.3000000000], keep order:false" - ], - "Res": [ - "3 333 3.3000000000" - ] - }, - { - "SQL": "select t1.b, t1.c from t1 where t1.c = 2.2", - "Plan": [ - "IndexReader 1.00 root index:IndexRangeScan", - "└─IndexRangeScan 1.00 cop[tikv] table:t1, index:c(c) range:[2.2000000000,2.2000000000], keep order:false" - ], - "Res": [ - "222 2.2000000000" - ] - }, - { - "SQL": "select /*+ use_index(t1, c) */ * from t1", - "Plan": [ - "IndexLookUp 3.00 root ", - "├─IndexFullScan(Build) 3.00 cop[tikv] table:t1, index:c(c) keep order:false", - "└─TableRowIDScan(Probe) 3.00 cop[tikv] table:t1 keep order:false" - ], - "Res": [ - "1 111 1.1000000000 11", - "2 222 2.2000000000 12", - "3 333 3.3000000000 13" - ] - }, - { - "SQL": "select * from t1 use index(c) where t1.c in (2.2, 3.3)", - "Plan": [ - "IndexLookUp 2.00 root ", - "├─IndexRangeScan(Build) 2.00 cop[tikv] table:t1, index:c(c) range:[2.2000000000,2.2000000000], [3.3000000000,3.3000000000], keep order:false", - "└─TableRowIDScan(Probe) 2.00 cop[tikv] table:t1 keep order:false" - ], - "Res": [ - "2 222 2.2000000000 12", - "3 333 3.3000000000 13" - ] - }, - { - "SQL": "select * from t1 where t1.a = 1 order by b", - "Plan": [ - "TableReader 1.00 root data:TableRangeScan", - "└─TableRangeScan 1.00 cop[tikv] table:t1 range:[1,1], keep order:true" - ], - "Res": [ - "1 111 1.1000000000 11" - ] - }, - { - "SQL": "select * from t1 order by a, b limit 1", - "Plan": [ - "Limit 1.00 root offset:0, count:1", - "└─TableReader 1.00 root data:Limit", - " └─Limit 1.00 cop[tikv] offset:0, count:1", - " └─TableFullScan 1.00 cop[tikv] table:t1 keep order:true" - ], - "Res": [ - "1 111 1.1000000000 11" - ] - }, - { - "SQL": "select /*+ use_index_merge(t1 primary, c) */ * from t1 where t1.a >= 1 or t1.c = 2.2", - "Plan": [ - "IndexMerge 3.00 root type: union", - "├─TableRangeScan(Build) 3.00 cop[tikv] table:t1 range:[1,+inf], keep order:false", - "├─IndexRangeScan(Build) 1.00 cop[tikv] table:t1, index:c(c) range:[2.2000000000,2.2000000000], keep order:false", - "└─TableRowIDScan(Probe) 3.00 cop[tikv] table:t1 keep order:false" - ], - "Res": [ - "1 111 1.1000000000 11", - "2 222 2.2000000000 12", - "3 333 3.3000000000 13" - ] - }, - { - "SQL": "select /*+ use_index_merge(t1 primary, c) */ * from t1 where t1.a = 1 and t1.b = '111' or t1.c = 3.3", - "Plan": [ - "IndexMerge 1.67 root type: union", - "├─TableRangeScan(Build) 1.00 cop[tikv] table:t1 range:[1 \"111\",1 \"111\"], keep order:false", - "├─IndexRangeScan(Build) 1.00 cop[tikv] table:t1, index:c(c) range:[3.3000000000,3.3000000000], keep order:false", - "└─TableRowIDScan(Probe) 1.67 cop[tikv] table:t1 keep order:false" - ], - "Res": [ - "1 111 1.1000000000 11", - "3 333 3.3000000000 13" - ] - } - ] - }, - { - "Name": "TestIndexJoinOnClusteredIndex", - "Cases": [ - { - "SQL": "select /*+ inl_join(t1, t2) */ * from t t1 join t t2 on t1.a = t2.a", - "Plan": [ - "IndexJoin 3.00 root inner join, inner:TableReader, outer key:test.t.a, inner key:test.t.a, equal cond:eq(test.t.a, test.t.a)", - "├─TableReader(Build) 3.00 root data:TableFullScan", - "│ └─TableFullScan 3.00 cop[tikv] table:t1 keep order:false", - "└─TableReader(Probe) 3.00 root data:TableRangeScan", - " └─TableRangeScan 3.00 cop[tikv] table:t2 range: decided by [eq(test.t.a, test.t.a)], keep order:false" - ], - "Res": [ - "1 111 1.1000000000 11 1 111 1.1000000000 11", - "2 222 2.2000000000 12 2 222 2.2000000000 12", - "3 333 3.3000000000 13 3 333 3.3000000000 13" - ] - }, - { - "SQL": "select /*+ inl_merge_join(t1, t2) */ * from t t1 join t t2 on t1.a = t2.a", - "Plan": [ - "IndexMergeJoin 3.00 root inner join, inner:TableReader, outer key:test.t.a, inner key:test.t.a", - "├─TableReader(Build) 3.00 root data:TableFullScan", - "│ └─TableFullScan 3.00 cop[tikv] table:t1 keep order:false", - "└─TableReader(Probe) 3.00 root data:TableRangeScan", - " └─TableRangeScan 3.00 cop[tikv] table:t2 range: decided by [eq(test.t.a, test.t.a)], keep order:true" - ], - "Res": [ - "1 111 1.1000000000 11 1 111 1.1000000000 11", - "2 222 2.2000000000 12 2 222 2.2000000000 12", - "3 333 3.3000000000 13 3 333 3.3000000000 13" - ] - }, - { - "SQL": "select /*+ inl_hash_join(t1, t2) */ * from t t1 join t t2 on t1.a = t2.a", - "Plan": [ - "IndexHashJoin 3.00 root inner join, inner:TableReader, outer key:test.t.a, inner key:test.t.a, equal cond:eq(test.t.a, test.t.a)", - "├─TableReader(Build) 3.00 root data:TableFullScan", - "│ └─TableFullScan 3.00 cop[tikv] table:t1 keep order:false", - "└─TableReader(Probe) 3.00 root data:TableRangeScan", - " └─TableRangeScan 3.00 cop[tikv] table:t2 range: decided by [eq(test.t.a, test.t.a)], keep order:false" - ], - "Res": [ - "1 111 1.1000000000 11 1 111 1.1000000000 11", - "2 222 2.2000000000 12 2 222 2.2000000000 12", - "3 333 3.3000000000 13 3 333 3.3000000000 13" - ] - }, - { - "SQL": "select /*+ inl_join(t1, t2) */ * from t t1 join t t2 on t1.a = t2.a and t1.b = t2.b", - "Plan": [ - "IndexJoin 3.00 root inner join, inner:TableReader, outer key:test.t.a, test.t.b, inner key:test.t.a, test.t.b, equal cond:eq(test.t.a, test.t.a), eq(test.t.b, test.t.b)", - "├─TableReader(Build) 3.00 root data:TableFullScan", - "│ └─TableFullScan 3.00 cop[tikv] table:t1 keep order:false", - "└─TableReader(Probe) 3.00 root data:TableRangeScan", - " └─TableRangeScan 3.00 cop[tikv] table:t2 range: decided by [eq(test.t.a, test.t.a) eq(test.t.b, test.t.b)], keep order:false" - ], - "Res": [ - "1 111 1.1000000000 11 1 111 1.1000000000 11", - "2 222 2.2000000000 12 2 222 2.2000000000 12", - "3 333 3.3000000000 13 3 333 3.3000000000 13" - ] - }, - { - "SQL": "select /*+ inl_join(t1, t2) */ * from t t1 join t t2 on t1.c = t2.c", - "Plan": [ - "IndexJoin 3.00 root inner join, inner:IndexLookUp, outer key:test.t.c, inner key:test.t.c, equal cond:eq(test.t.c, test.t.c)", - "├─TableReader(Build) 3.00 root data:Selection", - "│ └─Selection 3.00 cop[tikv] not(isnull(test.t.c))", - "│ └─TableFullScan 3.00 cop[tikv] table:t1 keep order:false", - "└─IndexLookUp(Probe) 3.00 root ", - " ├─Selection(Build) 3.00 cop[tikv] not(isnull(test.t.c))", - " │ └─IndexRangeScan 3.00 cop[tikv] table:t2, index:c(c) range: decided by [eq(test.t.c, test.t.c)], keep order:false", - " └─TableRowIDScan(Probe) 3.00 cop[tikv] table:t2 keep order:false" - ], - "Res": [ - "1 111 1.1000000000 11 1 111 1.1000000000 11", - "2 222 2.2000000000 12 2 222 2.2000000000 12", - "3 333 3.3000000000 13 3 333 3.3000000000 13" - ] - }, - { - "SQL": "select /*+ inl_merge_join(t1,t2) */ t2.a, t2.c, t2.d from t t1 left join t t2 on t1.a = t2.c;", - "Plan": [ - "IndexMergeJoin 3.00 root left outer join, inner:Projection, outer key:Column#9, inner key:test.t.c", - "├─Projection(Build) 3.00 root cast(test.t.a, decimal(10,0) BINARY)->Column#9", - "│ └─IndexReader 3.00 root index:IndexFullScan", - "│ └─IndexFullScan 3.00 cop[tikv] table:t1, index:c(c) keep order:false", - "└─Projection(Probe) 3.00 root test.t.a, test.t.c, test.t.d", - " └─IndexLookUp 3.00 root ", - " ├─IndexRangeScan(Build) 3.00 cop[tikv] table:t2, index:c(c) range: decided by [eq(test.t.c, Column#9)], keep order:true", - " └─TableRowIDScan(Probe) 3.00 cop[tikv] table:t2 keep order:false" - ], - "Res": [ - " ", - " ", - " " - ] - } - ] - }, - { - "Name": "TestHeuristicIndexSelection", - "Cases": [ - { - "SQL": "select * from t1 where a = 3 or a = 5", - "Plan": [ - "Batch_Point_Get_5 2.00 887.04 root table:t1 handle:[3 5], keep order:false, desc:false" - ], - "Warnings": [ - "Note 1105 handle of t1 is selected since the path only has point ranges" - ] - }, - { - "SQL": "select f, g from t1 where f = 2 and g in (3, 4, 5)", - "Plan": [ - "Batch_Point_Get_5 3.00 380.16 root table:t1, index:f_g(f, g) keep order:false, desc:false" - ], - "Warnings": [ - "Note 1105 unique index f_g of t1 is selected since the path only has point ranges with single scan" - ] - }, - { - "SQL": "select * from t1 where c = 1 and (d = 2 or d = 3) and e in (4, 5)", - "Plan": [ - "Batch_Point_Get_5 4.00 1774.08 root table:t1, index:c_d_e(c, d, e) keep order:false, desc:false" - ], - "Warnings": [ - "Note 1105 unique index c_d_e of t1 is selected since the path only has point ranges with double scan" - ] - }, - { - "SQL": "select f, g from t1 where f = 2 and g > 3", - "Plan": [ - "IndexReader_6 33.33 733.82 root index:IndexRangeScan_5", - "└─IndexRangeScan_5 33.33 6783.33 cop[tikv] table:t1, index:f_g(f, g) range:(2 3,2 +inf], keep order:false, stats:pseudo" - ], - "Warnings": [ - "Note 1105 unique index f_g of t1 is selected since the path only fetches limited number of rows with single scan" - ] - }, - { - "SQL": "select a, b, c from t2 where a = 1 and b = 2 and c in (1, 2, 3, 4, 5)", - "Plan": [ - "Selection_6 0.01 289.88 root eq(test.t2.b, 2), in(test.t2.c, 1, 2, 3, 4, 5)", - "└─Point_Get_5 1.00 190.08 root table:t2, index:idx_a(a) " - ], - "Warnings": [ - "Note 1105 unique index idx_a of t2 is selected since the path only has point ranges with double scan" - ] - }, - { - "SQL": "select * from t3 where (a = 1 or a = 3) and b = 'xx'", - "Plan": [ - "Batch_Point_Get_5 2.00 1449.36 root table:t3, clustered index:PRIMARY(a, b) keep order:false, desc:false" - ], - "Warnings": [ - "Note 1105 handle of t3 is selected since the path only has point ranges" - ] - }, - { - "SQL": "select * from t4 where (a = 1 or a = 3) and b = 'xx'", - "Plan": [ - "Batch_Point_Get_5 2.00 1449.36 root table:t4, index:PRIMARY(a, b) keep order:false, desc:false" - ], - "Warnings": [ - "Note 1105 unique index PRIMARY of t4 is selected since the path only has point ranges with double scan" - ] - }, - { - "SQL": "select a, b from t3 where (a = 1 or a = 3) and b = 'xx'", - "Plan": [ - "Batch_Point_Get_5 2.00 1322.64 root table:t3, clustered index:PRIMARY(a, b) keep order:false, desc:false" - ], - "Warnings": [ - "Note 1105 handle of t3 is selected since the path only has point ranges" - ] - }, - { - "SQL": "select a, b from t4 where (a = 1 or a = 3) and b = 'xx'", - "Plan": [ - "Batch_Point_Get_5 2.00 1322.64 root table:t4, index:PRIMARY(a, b) keep order:false, desc:false" - ], - "Warnings": [ - "Note 1105 unique index PRIMARY of t4 is selected since the path only has point ranges with single scan" - ] - }, - { - "SQL": "update t1 set b = 2 where a = 4 or a = 6", - "Plan": [ - "Update_4 N/A N/A root N/A", - "└─Batch_Point_Get_6 2.00 887.04 root table:t1 handle:[4 6], keep order:false, desc:false" - ], - "Warnings": [ - "Note 1105 handle of t1 is selected since the path only has point ranges" - ] - }, - { - "SQL": "delete from t1 where f = 2 and g in (3, 4)", - "Plan": [ - "Delete_4 N/A N/A root N/A", - "└─Selection_7 2.00 493.42 root in(test.t1.g, 3, 4)", - " └─Point_Get_6 1.00 443.52 root table:t1, index:f(f) " - ], - "Warnings": [ - "Note 1105 unique index f of t1 is selected since the path only has point ranges with double scan" - ] - }, - { - "SQL": "insert into t3 select a, b, c from t1 where f = 2", - "Plan": [ - "Insert_1 N/A N/A root N/A", - "└─Projection_6 1.00 253.74 root test.t1.a, test.t1.b, test.t1.c", - " └─Point_Get_7 1.00 253.44 root table:t1, index:f(f) " - ], - "Warnings": [ - "Note 1105 unique index f of t1 is selected since the path only has point ranges with double scan" - ] - }, - { - "SQL": "replace into t3 select a, b, c from t1 where a = 3", - "Plan": [ - "Insert_1 N/A N/A root N/A", - "└─Point_Get_7 1.00 190.08 root table:t1 handle:3" - ], - "Warnings": [ - "Note 1105 handle of t1 is selected since the path only has point ranges" - ] - } - ] - }, - { - "Name": "TestIndexMergeWithCorrelatedColumns", - "Cases": [ - { - "SQL": "select * from t2 where c1 < all(select /*+ use_index_merge(t1) */ c1 from t1 where (c1 = 10 and c1 = t2.c3 or c2 = 1 and c2 = t2.c3) and substring(c3, 10)) order by c1;", - "Plan": [ - "Sort 10000.00 root test.t2.c1", - "└─Projection 10000.00 root test.t2.c1, test.t2.c2, test.t2.c3", - " └─Apply 10000.00 root CARTESIAN inner join, other cond:or(and(lt(test.t2.c1, Column#8), if(ne(Column#9, 0), NULL, 1)), or(eq(Column#10, 0), if(isnull(test.t2.c1), NULL, 0)))", - " ├─TableReader(Build) 10000.00 root data:TableFullScan", - " │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", - " └─StreamAgg(Probe) 10000.00 root funcs:min(test.t1.c1)->Column#8, funcs:sum(0)->Column#9, funcs:count(1)->Column#10", - " └─IndexMerge 63.35 root type: union", - " ├─Selection(Build) 10000.00 cop[tikv] eq(10, test.t2.c3)", - " │ └─TableRangeScan 10000.00 cop[tikv] table:t1 range:[10,10], keep order:false, stats:pseudo", - " ├─Selection(Build) 80000.00 cop[tikv] eq(1, test.t2.c3)", - " │ └─IndexRangeScan 100000.00 cop[tikv] table:t1, index:c2(c2) range:[1,1], keep order:false, stats:pseudo", - " └─Selection(Probe) 63.35 cop[tikv] or(and(eq(test.t1.c1, 10), eq(10, test.t2.c3)), and(eq(test.t1.c2, 1), eq(1, test.t2.c3))), substring(cast(test.t1.c3, var_string(20)), 10)", - " └─TableRowIDScan 89992.00 cop[tikv] table:t1 keep order:false, stats:pseudo" - ], - "Res": [ - "1 1 1", - "2 2 2" - ] - }, - { - "SQL": "select * from t2 where c1 < all(select /*+ use_index_merge(t1) */ c1 from t1 where (c1 = 10 and c1 = t2.c3 or c2 = 1 and c2 = t2.c3) and reverse(c3)) order by c1;", - "Plan": [ - "Sort 10000.00 root test.t2.c1", - "└─Projection 10000.00 root test.t2.c1, test.t2.c2, test.t2.c3", - " └─Apply 10000.00 root CARTESIAN inner join, other cond:or(and(lt(test.t2.c1, Column#8), if(ne(Column#9, 0), NULL, 1)), or(eq(Column#10, 0), if(isnull(test.t2.c1), NULL, 0)))", - " ├─TableReader(Build) 10000.00 root data:TableFullScan", - " │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", - " └─StreamAgg(Probe) 10000.00 root funcs:min(test.t1.c1)->Column#8, funcs:sum(0)->Column#9, funcs:count(1)->Column#10", - " └─IndexMerge 63.35 root type: union", - " ├─Selection(Build) 10000.00 cop[tikv] eq(10, test.t2.c3)", - " │ └─TableRangeScan 10000.00 cop[tikv] table:t1 range:[10,10], keep order:false, stats:pseudo", - " ├─Selection(Build) 80000.00 cop[tikv] eq(1, test.t2.c3)", - " │ └─IndexRangeScan 100000.00 cop[tikv] table:t1, index:c2(c2) range:[1,1], keep order:false, stats:pseudo", - " └─Selection(Probe) 63.35 cop[tikv] or(and(eq(test.t1.c1, 10), eq(10, test.t2.c3)), and(eq(test.t1.c2, 1), eq(1, test.t2.c3))), reverse(cast(test.t1.c3, var_string(20)))", - " └─TableRowIDScan 89992.00 cop[tikv] table:t1 keep order:false, stats:pseudo" - ], - "Res": [ - "2 2 2" - ] - }, - { - "SQL": "select * from t2 where c1 < all(select /*+ use_index_merge(t1) */ c1 from t1 where (c1 >= 10 and c1 = t2.c3 or c2 = 1 and c2 = t2.c3) and substring(c3, 10)) order by c1;", - "Plan": [ - "Sort 10000.00 root test.t2.c1", - "└─Projection 10000.00 root test.t2.c1, test.t2.c2, test.t2.c3", - " └─Apply 10000.00 root CARTESIAN inner join, other cond:or(and(lt(test.t2.c1, Column#8), if(ne(Column#9, 0), NULL, 1)), or(eq(Column#10, 0), if(isnull(test.t2.c1), NULL, 0)))", - " ├─TableReader(Build) 10000.00 root data:TableFullScan", - " │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", - " └─StreamAgg(Probe) 10000.00 root funcs:min(test.t1.c1)->Column#8, funcs:sum(0)->Column#9, funcs:count(1)->Column#10", - " └─IndexMerge 30263.46 root type: union", - " ├─Selection(Build) 33333.33 cop[tikv] eq(test.t1.c1, test.t2.c3)", - " │ └─TableRangeScan 33333333.33 cop[tikv] table:t1 range:[10,+inf], keep order:false, stats:pseudo", - " ├─Selection(Build) 80000.00 cop[tikv] eq(1, test.t2.c3)", - " │ └─IndexRangeScan 100000.00 cop[tikv] table:t1, index:c2(c2) range:[1,1], keep order:false, stats:pseudo", - " └─Selection(Probe) 30263.46 cop[tikv] or(and(ge(test.t1.c1, 10), eq(test.t1.c1, test.t2.c3)), and(eq(test.t1.c2, 1), eq(1, test.t2.c3))), substring(cast(test.t1.c3, var_string(20)), 10)", - " └─TableRowIDScan 33386666.67 cop[tikv] table:t1 keep order:false, stats:pseudo" - ], - "Res": [ - "1 1 1", - "2 2 2" - ] - }, - { - "SQL": "select c_int from tt1 where c_decimal < all (select /*+ use_index_merge(tt2) */ c_decimal from tt2 where tt1.c_int = tt2.c_int and tt1.c_datetime > tt2.c_datetime and tt2.c_decimal = 9.060 or tt2.c_str <= 'interesting shtern' and tt1.c_int = tt2.c_int) order by 1;", - "Plan": [ - "Projection 10000.00 root test.tt1.c_int", - "└─Apply 10000.00 root CARTESIAN inner join, other cond:or(and(lt(test.tt1.c_decimal, Column#9), if(ne(Column#10, 0), NULL, 1)), or(eq(Column#11, 0), if(isnull(test.tt1.c_decimal), NULL, 0)))", - " ├─TableReader(Build) 10000.00 root data:TableFullScan", - " │ └─TableFullScan 10000.00 cop[tikv] table:tt1 keep order:true, stats:pseudo", - " └─StreamAgg(Probe) 10000.00 root funcs:min(Column#14)->Column#9, funcs:sum(Column#15)->Column#10, funcs:count(1)->Column#11", - " └─Projection 11.05 root test.tt2.c_decimal->Column#14, cast(isnull(test.tt2.c_decimal), decimal(20,0) BINARY)->Column#15", - " └─IndexMerge 11.05 root type: union", - " ├─Selection(Build) 10.00 cop[tikv] eq(test.tt1.c_int, test.tt2.c_int)", - " │ └─IndexRangeScan 10000.00 cop[tikv] table:tt2, index:c_decimal(c_decimal) range:[9.060000,9.060000], keep order:false, stats:pseudo", - " ├─Selection(Build) 33233.33 cop[tikv] eq(test.tt1.c_int, test.tt2.c_int)", - " │ └─IndexRangeScan 33233333.33 cop[tikv] table:tt2, index:c_str(c_str) range:[-inf,\"interesting shtern\"], keep order:false, stats:pseudo", - " └─Selection(Probe) 11.05 cop[tikv] or(and(eq(test.tt1.c_int, test.tt2.c_int), and(gt(test.tt1.c_datetime, test.tt2.c_datetime), eq(test.tt2.c_decimal, 9.060))), and(le(test.tt2.c_str, \"interesting shtern\"), eq(test.tt1.c_int, test.tt2.c_int)))", - " └─TableRowIDScan 33243.33 cop[tikv] table:tt2 keep order:false, stats:pseudo" - ], - "Res": [ - "7", - "8", - "10" - ] - }, - { - "SQL": "select c_int from tt1 where c_decimal > all (select /*+ use_index_merge(tt2) */ c_decimal from tt2 where tt2.c_int = 7 and tt2.c_int < tt1.c_decimal or tt2.c_str >= 'zzzzzzzzzzzzzzzzzzz' and tt1.c_int = tt2.c_int) order by 1;", - "Plan": [ - "Projection 10000.00 root test.tt1.c_int", - "└─Apply 10000.00 root CARTESIAN inner join, other cond:or(and(gt(test.tt1.c_decimal, Column#9), if(ne(Column#10, 0), NULL, 1)), or(eq(Column#11, 0), if(isnull(test.tt1.c_decimal), NULL, 0)))", - " ├─TableReader(Build) 10000.00 root data:TableFullScan", - " │ └─TableFullScan 10000.00 cop[tikv] table:tt1 keep order:true, stats:pseudo", - " └─StreamAgg(Probe) 10000.00 root funcs:max(Column#14)->Column#9, funcs:sum(Column#15)->Column#10, funcs:count(1)->Column#11", - " └─Projection 17.91 root test.tt2.c_decimal->Column#14, cast(isnull(test.tt2.c_decimal), decimal(20,0) BINARY)->Column#15", - " └─IndexMerge 17.91 root type: union", - " ├─Selection(Build) 10000.00 cop[tikv] lt(7, test.tt1.c_decimal)", - " │ └─TableRangeScan 10000.00 cop[tikv] table:tt2 range:[7,7], keep order:false, stats:pseudo", - " ├─Selection(Build) 33333.33 cop[tikv] eq(test.tt1.c_int, test.tt2.c_int)", - " │ └─IndexRangeScan 33333333.33 cop[tikv] table:tt2, index:c_str(c_str) range:[\"zzzzzzzzzzzzzzzzzzz\",+inf], keep order:false, stats:pseudo", - " └─Selection(Probe) 17.91 cop[tikv] or(and(eq(test.tt2.c_int, 7), lt(7, test.tt1.c_decimal)), and(ge(test.tt2.c_str, \"zzzzzzzzzzzzzzzzzzz\"), eq(test.tt1.c_int, test.tt2.c_int)))", - " └─TableRowIDScan 43330.00 cop[tikv] table:tt2 keep order:false, stats:pseudo" - ], - "Res": [ - "6", - "7", - "8", - "9" - ] - } - ] - }, - { - "Name": "TestIndexMergeSerial", - "Cases": [ - { - "SQL": "desc format='brief' select /*+ use_index_merge(t) */ * from t where a =1 or (b=1 and b+2>1)", - "Plan": [ - "IndexMerge 8.00 root type: union", - "├─IndexRangeScan(Build) 1.00 cop[tikv] table:t, index:a(a) range:[1,1], keep order:false", - "├─Selection(Build) 1.00 cop[tikv] 1", - "│ └─IndexRangeScan 1.00 cop[tikv] table:t, index:b(b) range:[1,1], keep order:false", - "└─TableRowIDScan(Probe) 8.00 cop[tikv] table:t keep order:false" - ], - "Warnings": null - }, - { - "SQL": "desc format='brief' select /*+ use_index_merge(t) */ * from t where a =1 or (b=1 and length(b)=1)", - "Plan": [ - "IndexMerge 8.00 root type: union", - "├─IndexRangeScan(Build) 1.00 cop[tikv] table:t, index:a(a) range:[1,1], keep order:false", - "├─Selection(Build) 1.00 cop[tikv] 1", - "│ └─IndexRangeScan 1.00 cop[tikv] table:t, index:b(b) range:[1,1], keep order:false", - "└─TableRowIDScan(Probe) 8.00 cop[tikv] table:t keep order:false" - ], - "Warnings": null - }, - { - "SQL": "desc format='brief' select /*+ use_index_merge(t) */ * from t where (a=1 and length(a)=1) or (b=1 and length(b)=1)", - "Plan": [ - "IndexMerge 8.00 root type: union", - "├─Selection(Build) 1.00 cop[tikv] 1", - "│ └─IndexRangeScan 1.00 cop[tikv] table:t, index:a(a) range:[1,1], keep order:false", - "├─Selection(Build) 1.00 cop[tikv] 1", - "│ └─IndexRangeScan 1.00 cop[tikv] table:t, index:b(b) range:[1,1], keep order:false", - "└─TableRowIDScan(Probe) 8.00 cop[tikv] table:t keep order:false" - ], - "Warnings": null - }, - { - "SQL": "desc format='brief' select /*+ use_index_merge(t) */ * from t where (a=1 and length(b)=1) or (b=1 and length(a)=1)", - "Plan": [ - "IndexMerge 0.29 root type: union", - "├─IndexRangeScan(Build) 1.00 cop[tikv] table:t, index:a(a) range:[1,1], keep order:false", - "├─IndexRangeScan(Build) 1.00 cop[tikv] table:t, index:b(b) range:[1,1], keep order:false", - "└─Selection(Probe) 0.29 cop[tikv] or(and(eq(test.t.a, 1), eq(length(cast(test.t.b, var_string(20))), 1)), and(eq(test.t.b, 1), eq(length(cast(test.t.a, var_string(20))), 1)))", - " └─TableRowIDScan 1.90 cop[tikv] table:t keep order:false" - ], - "Warnings": null - } - ] - }, - { - "Name": "TestLimitIndexLookUpKeepOrder", - "Cases": [ - { - "SQL": "desc format = 'brief' select * from t where a = 1 and b > 2 and b < 10 and d = 10 order by b,c limit 10", - "Plan": [ - "Limit 0.00 root offset:0, count:10", - "└─Projection 0.00 root test.t.a, test.t.b, test.t.c, test.t.d", - " └─IndexLookUp 0.00 root ", - " ├─IndexRangeScan(Build) 2.50 cop[tikv] table:t, index:idx(a, b, c) range:(1 2,1 10), keep order:true, stats:pseudo", - " └─Selection(Probe) 0.00 cop[tikv] eq(test.t.d, 10)", - " └─TableRowIDScan 2.50 cop[tikv] table:t keep order:false, stats:pseudo" - ] - }, - { - "SQL": "desc format = 'brief' select * from t where a = 1 and b > 2 and b < 10 and d = 10 order by b desc, c desc limit 10", - "Plan": [ - "Limit 0.00 root offset:0, count:10", - "└─Projection 0.00 root test.t.a, test.t.b, test.t.c, test.t.d", - " └─IndexLookUp 0.00 root ", - " ├─IndexRangeScan(Build) 2.50 cop[tikv] table:t, index:idx(a, b, c) range:(1 2,1 10), keep order:true, desc, stats:pseudo", - " └─Selection(Probe) 0.00 cop[tikv] eq(test.t.d, 10)", - " └─TableRowIDScan 2.50 cop[tikv] table:t keep order:false, stats:pseudo" - ] - } - ] - }, - { - "Name": "TestIndexJoinRangeFallback", - "Cases": [ - { - "SQL": "set @@tidb_opt_range_max_size = 0", - "Plan": null, - "Warn": null - }, - { - "SQL": "explain format='brief' select /*+ inl_join(t1) */ * from t1 join t2 on t1.b = t2.e and t1.d = t2.g where t1.a in (1, 3) and t1.c in ('aaa', 'bbb')", - "Plan": [ - "IndexJoin 0.50 root inner join, inner:IndexLookUp, outer key:test.t2.e, test.t2.g, inner key:test.t1.b, test.t1.d, equal cond:eq(test.t2.e, test.t1.b), eq(test.t2.g, test.t1.d)", - "├─TableReader(Build) 9980.01 root data:Selection", - "│ └─Selection 9980.01 cop[tikv] not(isnull(test.t2.e)), not(isnull(test.t2.g))", - "│ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", - "└─IndexLookUp(Probe) 0.50 root ", - " ├─Selection(Build) 249.50 cop[tikv] not(isnull(test.t1.b)), not(isnull(test.t1.d))", - " │ └─IndexRangeScan 250.00 cop[tikv] table:t1, index:idx_a_b_c_d(a, b, c, d) range: decided by [eq(test.t1.b, test.t2.e) eq(test.t1.d, test.t2.g) in(test.t1.a, 1, 3) in(test.t1.c, aaa, bbb)], keep order:false, stats:pseudo", - " └─Selection(Probe) 0.50 cop[tikv] in(test.t1.c, \"aaa\", \"bbb\")", - " └─TableRowIDScan 249.50 cop[tikv] table:t1 keep order:false, stats:pseudo" - ], - "Warn": null - }, - { - "SQL": "set @@tidb_opt_range_max_size = 2900", - "Plan": null, - "Warn": null - }, - { - "SQL": "explain format='brief' select /*+ inl_join(t1) */ * from t1 join t2 on t1.b = t2.e and t1.d = t2.g where t1.a in (1, 3) and t1.c in ('aaa', 'bbb')", - "Plan": [ - "IndexJoin 0.50 root inner join, inner:IndexLookUp, outer key:test.t2.e, inner key:test.t1.b, equal cond:eq(test.t2.e, test.t1.b), eq(test.t2.g, test.t1.d)", - "├─TableReader(Build) 9980.01 root data:Selection", - "│ └─Selection 9980.01 cop[tikv] not(isnull(test.t2.e)), not(isnull(test.t2.g))", - "│ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", - "└─IndexLookUp(Probe) 0.50 root ", - " ├─Selection(Build) 249.50 cop[tikv] not(isnull(test.t1.b)), not(isnull(test.t1.d))", - " │ └─IndexRangeScan 250.00 cop[tikv] table:t1, index:idx_a_b_c_d(a, b, c, d) range: decided by [eq(test.t1.b, test.t2.e) in(test.t1.a, 1, 3) in(test.t1.c, aaa, bbb)], keep order:false, stats:pseudo", - " └─Selection(Probe) 0.50 cop[tikv] in(test.t1.c, \"aaa\", \"bbb\")", - " └─TableRowIDScan 249.50 cop[tikv] table:t1 keep order:false, stats:pseudo" - ], - "Warn": [ - "Memory capacity of 2900 bytes for 'tidb_opt_range_max_size' exceeded when building ranges. Less accurate ranges such as full range are chosen" - ] - }, - { - "SQL": "set @@tidb_opt_range_max_size = 2300", - "Plan": null, - "Warn": null - }, - { - "SQL": "explain format='brief' select /*+ inl_join(t1) */ * from t1 join t2 on t1.b = t2.e and t1.d = t2.g where t1.a in (1, 3) and t1.c in ('aaa', 'bbb')", - "Plan": [ - "IndexJoin 0.50 root inner join, inner:IndexLookUp, outer key:test.t2.e, inner key:test.t1.b, equal cond:eq(test.t2.e, test.t1.b), eq(test.t2.g, test.t1.d)", - "├─TableReader(Build) 9980.01 root data:Selection", - "│ └─Selection 9980.01 cop[tikv] not(isnull(test.t2.e)), not(isnull(test.t2.g))", - "│ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", - "└─IndexLookUp(Probe) 0.50 root ", - " ├─Selection(Build) 249.50 cop[tikv] not(isnull(test.t1.b)), not(isnull(test.t1.d))", - " │ └─IndexRangeScan 250.00 cop[tikv] table:t1, index:idx_a_b_c_d(a, b, c, d) range: decided by [eq(test.t1.b, test.t2.e) in(test.t1.a, 1, 3)], keep order:false, stats:pseudo", - " └─Selection(Probe) 0.50 cop[tikv] in(test.t1.c, \"aaa\", \"bbb\")", - " └─TableRowIDScan 249.50 cop[tikv] table:t1 keep order:false, stats:pseudo" - ], - "Warn": [ - "Memory capacity of 2300 bytes for 'tidb_opt_range_max_size' exceeded when building ranges. Less accurate ranges such as full range are chosen" - ] - }, - { - "SQL": "set @@tidb_opt_range_max_size = 700", - "Plan": null, - "Warn": null - }, - { - "SQL": "explain format='brief' select /*+ inl_join(t1) */ * from t1 join t2 on t1.b = t2.e and t1.d = t2.g where t1.a in (1, 3) and t1.c in ('aaa', 'bbb')", - "Plan": [ - "HashJoin 0.05 root inner join, equal:[eq(test.t1.b, test.t2.e) eq(test.t1.d, test.t2.g)]", - "├─IndexLookUp(Build) 0.04 root ", - "│ ├─Selection(Build) 19.96 cop[tikv] not(isnull(test.t1.b)), not(isnull(test.t1.d))", - "│ │ └─IndexRangeScan 20.00 cop[tikv] table:t1, index:idx_a_b_c_d(a, b, c, d) range:[1,1], [3,3], keep order:false, stats:pseudo", - "│ └─Selection(Probe) 0.04 cop[tikv] in(test.t1.c, \"aaa\", \"bbb\")", - "│ └─TableRowIDScan 19.96 cop[tikv] table:t1 keep order:false, stats:pseudo", - "└─TableReader(Probe) 9980.01 root data:Selection", - " └─Selection 9980.01 cop[tikv] not(isnull(test.t2.e)), not(isnull(test.t2.g))", - " └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" - ], - "Warn": [ - "Memory capacity of 700 bytes for 'tidb_opt_range_max_size' exceeded when building ranges. Less accurate ranges such as full range are chosen", - "[planner:1815]Optimizer Hint /*+ INL_JOIN(t1) */ or /*+ TIDB_INLJ(t1) */ is inapplicable" - ] - }, - { - "SQL": "set @@tidb_opt_range_max_size = 0", - "Plan": null, - "Warn": null - }, - { - "SQL": "explain format='brief' select /*+ inl_join(t1) */ * from t1 join t2 on t1.a = t2.e where t1.b > 1 and t1.b < 10", - "Plan": [ - "IndexJoin 312.19 root inner join, inner:IndexLookUp, outer key:test.t2.e, inner key:test.t1.a, equal cond:eq(test.t2.e, test.t1.a)", - "├─TableReader(Build) 9990.00 root data:Selection", - "│ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.e))", - "│ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", - "└─IndexLookUp(Probe) 312.19 root ", - " ├─Selection(Build) 312.19 cop[tikv] not(isnull(test.t1.a))", - " │ └─IndexRangeScan 312.50 cop[tikv] table:t1, index:idx_a_b_c_d(a, b, c, d) range: decided by [eq(test.t1.a, test.t2.e) gt(test.t1.b, 1) lt(test.t1.b, 10)], keep order:false, stats:pseudo", - " └─TableRowIDScan(Probe) 312.19 cop[tikv] table:t1 keep order:false, stats:pseudo" - ], - "Warn": null - }, - { - "SQL": "set @@tidb_opt_range_max_size = 300", - "Plan": null, - "Warn": null - }, - { - "SQL": "explain format='brief' select /*+ inl_join(t1) */ * from t1 join t2 on t1.a = t2.e where t1.b > 1 and t1.b < 10", - "Plan": [ - "IndexJoin 312.19 root inner join, inner:IndexLookUp, outer key:test.t2.e, inner key:test.t1.a, equal cond:eq(test.t2.e, test.t1.a)", - "├─TableReader(Build) 9990.00 root data:Selection", - "│ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.e))", - "│ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", - "└─IndexLookUp(Probe) 312.19 root ", - " ├─Selection(Build) 312.19 cop[tikv] gt(test.t1.b, 1), lt(test.t1.b, 10), not(isnull(test.t1.a))", - " │ └─IndexRangeScan 12500.00 cop[tikv] table:t1, index:idx_a_b_c_d(a, b, c, d) range: decided by [eq(test.t1.a, test.t2.e)], keep order:false, stats:pseudo", - " └─TableRowIDScan(Probe) 312.19 cop[tikv] table:t1 keep order:false, stats:pseudo" - ], - "Warn": [ - "Memory capacity of 300 bytes for 'tidb_opt_range_max_size' exceeded when building ranges. Less accurate ranges such as full range are chosen" - ] - }, - { - "SQL": "set @@tidb_opt_range_max_size = 0", - "Plan": null, - "Warn": null - }, - { - "SQL": "explain format='brief' select /*+ inl_join(t1) */ * from t1 join t2 on t1.a = t2.e where t1.b > t2.f and t1.b < t2.f + 10", - "Plan": [ - "IndexJoin 12475.01 root inner join, inner:IndexLookUp, outer key:test.t2.e, inner key:test.t1.a, equal cond:eq(test.t2.e, test.t1.a), other cond:gt(test.t1.b, test.t2.f), lt(test.t1.b, plus(test.t2.f, 10))", - "├─TableReader(Build) 9980.01 root data:Selection", - "│ └─Selection 9980.01 cop[tikv] not(isnull(test.t2.e)), not(isnull(test.t2.f))", - "│ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", - "└─IndexLookUp(Probe) 12475.01 root ", - " ├─Selection(Build) 12475.01 cop[tikv] not(isnull(test.t1.a)), not(isnull(test.t1.b))", - " │ └─IndexRangeScan 12500.00 cop[tikv] table:t1, index:idx_a_b_c_d(a, b, c, d) range: decided by [eq(test.t1.a, test.t2.e) lt(test.t1.b, plus(test.t2.f, 10)) gt(test.t1.b, test.t2.f)], keep order:false, stats:pseudo", - " └─TableRowIDScan(Probe) 12475.01 cop[tikv] table:t1 keep order:false, stats:pseudo" - ], - "Warn": null - }, - { - "SQL": "set @@tidb_opt_range_max_size = 300", - "Plan": null, - "Warn": null - }, - { - "SQL": "explain format='brief' select /*+ inl_join(t1) */ * from t1 join t2 on t1.a = t2.e where t1.b > t2.f and t1.b < t2.f + 10", - "Plan": [ - "IndexJoin 12475.01 root inner join, inner:IndexLookUp, outer key:test.t2.e, inner key:test.t1.a, equal cond:eq(test.t2.e, test.t1.a), other cond:gt(test.t1.b, test.t2.f), lt(test.t1.b, plus(test.t2.f, 10))", - "├─TableReader(Build) 9980.01 root data:Selection", - "│ └─Selection 9980.01 cop[tikv] not(isnull(test.t2.e)), not(isnull(test.t2.f))", - "│ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", - "└─IndexLookUp(Probe) 12475.01 root ", - " ├─Selection(Build) 12475.01 cop[tikv] not(isnull(test.t1.a)), not(isnull(test.t1.b))", - " │ └─IndexRangeScan 12500.00 cop[tikv] table:t1, index:idx_a_b_c_d(a, b, c, d) range: decided by [eq(test.t1.a, test.t2.e)], keep order:false, stats:pseudo", - " └─TableRowIDScan(Probe) 12475.01 cop[tikv] table:t1 keep order:false, stats:pseudo" - ], - "Warn": [ - "Memory capacity of 300 bytes for 'tidb_opt_range_max_size' exceeded when building ranges. Less accurate ranges such as full range are chosen" - ] - } - ] - }, { "Name": "TestNullConditionForPrefixIndex", "Cases": [ @@ -1075,160 +200,5 @@ "Result": null } ] - }, - { - "Name": "TestIndexMergeFromComposedCNFCondition", - "Cases": [ - { - "SQL": "explain select /*+ use_index_merge(t1, idx2, idx) */ * from t1 where 1 member of (a) and 2 member of (b); -- 1: AND index merge from multi member mv index predicate, since member of is single partial path, it can be merged with outer index merge.", - "Plan": [ - "IndexMerge_8 10.00 root type: intersection", - "├─IndexRangeScan_5(Build) 10.00 cop[tikv] table:t1, index:idx(cast(`a` as signed array)) range:[1,1], keep order:false, stats:pseudo", - "├─IndexRangeScan_6(Build) 10.00 cop[tikv] table:t1, index:idx2(cast(`b` as signed array)) range:[2,2], keep order:false, stats:pseudo", - "└─TableRowIDScan_7(Probe) 10.00 cop[tikv] table:t1 keep order:false, stats:pseudo" - ] - }, - { - "SQL": "explain select /*+ use_index_merge(t2, idx2, idx) */ * from t2 where 1 member of (a) and c=1 and 2 member of (b); -- 2: AND index merge from multi complicated mv index", - "Plan": [ - "IndexMerge_8 0.10 root type: intersection", - "├─IndexRangeScan_5(Build) 0.10 cop[tikv] table:t2, index:idx(c, cast(`a` as signed array)) range:[1 1,1 1], keep order:false, stats:pseudo", - "├─IndexRangeScan_6(Build) 0.10 cop[tikv] table:t2, index:idx2(cast(`b` as signed array), c) range:[2 1,2 1], keep order:false, stats:pseudo", - "└─TableRowIDScan_7(Probe) 0.10 cop[tikv] table:t2 keep order:false, stats:pseudo" - ] - }, - { - "SQL": "explain select /*+ use_index_merge(t2, idx2, idx, idx4) */ * from t2 where 1 member of (a) and c=1 and 2 member of (b) and d=3; -- 3: AND index merge from multi complicated mv indexes and normal indexes", - "Plan": [ - "IndexMerge_9 0.10 root type: intersection", - "├─IndexRangeScan_5(Build) 10.00 cop[tikv] table:t2, index:idx4(d) range:[3,3], keep order:false, stats:pseudo", - "├─IndexRangeScan_6(Build) 0.10 cop[tikv] table:t2, index:idx(c, cast(`a` as signed array)) range:[1 1,1 1], keep order:false, stats:pseudo", - "├─IndexRangeScan_7(Build) 0.10 cop[tikv] table:t2, index:idx2(cast(`b` as signed array), c) range:[2 1,2 1], keep order:false, stats:pseudo", - "└─TableRowIDScan_8(Probe) 0.10 cop[tikv] table:t2 keep order:false, stats:pseudo" - ] - }, - { - "SQL": "explain select /*+ use_index_merge(t2, idx2, idx, idx3) */ * from t2 where json_contains(a, '[1, 2, 3]') and c=1 and 2 member of (b) and d=3; -- 4: AND index merge from multi complicated mv indexes (json_contains (intersection))and normal indexes", - "Plan": [ - "IndexMerge_11 0.10 root type: intersection", - "├─IndexRangeScan_5(Build) 0.10 cop[tikv] table:t2, index:idx3(c, d) range:[1 3,1 3], keep order:false, stats:pseudo", - "├─IndexRangeScan_6(Build) 0.10 cop[tikv] table:t2, index:idx(c, cast(`a` as signed array)) range:[1 1,1 1], keep order:false, stats:pseudo", - "├─IndexRangeScan_7(Build) 0.10 cop[tikv] table:t2, index:idx(c, cast(`a` as signed array)) range:[1 2,1 2], keep order:false, stats:pseudo", - "├─IndexRangeScan_8(Build) 0.10 cop[tikv] table:t2, index:idx(c, cast(`a` as signed array)) range:[1 3,1 3], keep order:false, stats:pseudo", - "├─IndexRangeScan_9(Build) 0.10 cop[tikv] table:t2, index:idx2(cast(`b` as signed array), c) range:[2 1,2 1], keep order:false, stats:pseudo", - "└─TableRowIDScan_10(Probe) 0.10 cop[tikv] table:t2 keep order:false, stats:pseudo" - ] - }, - { - "SQL": "explain select /*+ use_index_merge(t2, idx2, idx, idx3) */ * from t2 where json_overlaps(a, '[1, 2, 3]') and c=1 and 2 member of (b) and d=3; -- 5: AND index merge from multi complicated mv indexes (json_overlap (intersection))and normal indexes", - "Plan": [ - "Selection_5 0.06 root json_overlaps(test.t2.a, cast(\"[1, 2, 3]\", json BINARY))", - "└─IndexMerge_9 0.10 root type: intersection", - " ├─IndexRangeScan_6(Build) 0.10 cop[tikv] table:t2, index:idx3(c, d) range:[1 3,1 3], keep order:false, stats:pseudo", - " ├─IndexRangeScan_7(Build) 0.10 cop[tikv] table:t2, index:idx2(cast(`b` as signed array), c) range:[2 1,2 1], keep order:false, stats:pseudo", - " └─TableRowIDScan_8(Probe) 0.10 cop[tikv] table:t2 keep order:false, stats:pseudo" - ] - }, - { - "SQL": "explain select /*+ use_index_merge(t2, idx2, idx) */ * from t2 where 1 member of (a) and c=1 and c=2; -- 6: AND index merge from multi complicated mv indexes (empty range)", - "Plan": [ - "TableDual_5 0.00 root rows:0" - ] - } - ] - }, - { - "Name": "TestIndexMergeFromComposedDNFCondition", - "Cases": [ - { - "SQL": "explain select /*+ use_index_merge(t2, idx2, idx) */ * from t2 where (1 member of (a) and c=1) or (2 member of (b) and c=1); -- 1: OR index merge from multi complicated mv index (memberof)", - "Plan": [ - "IndexMerge_8 0.10 root type: union", - "├─IndexRangeScan_5(Build) 0.10 cop[tikv] table:t2, index:idx(c, cast(`a` as signed array)) range:[1 1,1 1], keep order:false, stats:pseudo", - "├─IndexRangeScan_6(Build) 0.10 cop[tikv] table:t2, index:idx2(cast(`b` as signed array), c) range:[2 1,2 1], keep order:false, stats:pseudo", - "└─TableRowIDScan_7(Probe) 0.10 cop[tikv] table:t2 keep order:false, stats:pseudo" - ] - }, - { - "SQL": "explain select /*+ use_index_merge(t2, idx2, idx) */ * from t2 where (1 member of (a) and c=1) or (2 member of (b) and c=1); -- 2: OR index merge from multi complicated mv index (memberof)", - "Plan": [ - "IndexMerge_8 0.10 root type: union", - "├─IndexRangeScan_5(Build) 0.10 cop[tikv] table:t2, index:idx(c, cast(`a` as signed array)) range:[1 1,1 1], keep order:false, stats:pseudo", - "├─IndexRangeScan_6(Build) 0.10 cop[tikv] table:t2, index:idx2(cast(`b` as signed array), c) range:[2 1,2 1], keep order:false, stats:pseudo", - "└─TableRowIDScan_7(Probe) 0.10 cop[tikv] table:t2 keep order:false, stats:pseudo" - ] - }, - { - "SQL": "explain select /*+ use_index_merge(t2, idx2, idx) */ * from t2 where (1 member of (a) and c=1 and d=2) or (2 member of (b) and c=3 and d=2); -- 3: OR index merge from multi complicated mv index (memberof),while each DNF item contains redundant condition, which should be remained as table filters", - "Plan": [ - "IndexMerge_9 0.10 root type: union", - "├─IndexRangeScan_5(Build) 0.10 cop[tikv] table:t2, index:idx(c, cast(`a` as signed array)) range:[1 1,1 1], keep order:false, stats:pseudo", - "├─IndexRangeScan_6(Build) 0.10 cop[tikv] table:t2, index:idx2(cast(`b` as signed array), c) range:[2 3,2 3], keep order:false, stats:pseudo", - "└─Selection_8(Probe) 0.10 cop[tikv] or(and(json_memberof(cast(1, json BINARY), test.t2.a), and(eq(test.t2.c, 1), eq(test.t2.d, 2))), and(json_memberof(cast(2, json BINARY), test.t2.b), and(eq(test.t2.c, 3), eq(test.t2.d, 2))))", - " └─TableRowIDScan_7 0.10 cop[tikv] table:t2 keep order:false, stats:pseudo" - ] - }, - { - "SQL": "explain select /*+ use_index_merge(t2, idx2, idx) */ * from t2 where ( json_contains(a, '[1, 2, 3]') and c=1 and d=2) or (2 member of (b) and c=3 and d=2); -- 4: OR index merge from multi complicated mv index (memberof),make full use of DNF item's condition even if the predicate is intersection case (json_contains)", - "Plan": [ - "IndexMerge_9 0.01 root type: union", - "├─IndexRangeScan_5(Build) 10.00 cop[tikv] table:t2, index:idx(c, cast(`a` as signed array)) range:[1,1], keep order:false, stats:pseudo", - "├─IndexRangeScan_6(Build) 0.10 cop[tikv] table:t2, index:idx2(cast(`b` as signed array), c) range:[2 3,2 3], keep order:false, stats:pseudo", - "└─Selection_8(Probe) 0.01 cop[tikv] or(and(json_contains(test.t2.a, cast(\"[1, 2, 3]\", json BINARY)), and(eq(test.t2.c, 1), eq(test.t2.d, 2))), and(json_memberof(cast(2, json BINARY), test.t2.b), and(eq(test.t2.c, 3), eq(test.t2.d, 2))))", - " └─TableRowIDScan_7 10.00 cop[tikv] table:t2 keep order:false, stats:pseudo" - ] - }, - { - "SQL": "explain select /*+ use_index_merge(t2, idx2, idx) */ * from t2 where ( json_overlaps(a, '[1, 2, 3]') and c=1 and d=2) or (2 member of (b) and c=3 and d=2); -- 5: OR index merge from multi complicated mv index (memberof),make full use of DNF item's condition even if the predicate is intersection case (json_contains)", - "Plan": [ - "Selection_5 0.08 root or(and(json_overlaps(test.t2.a, cast(\"[1, 2, 3]\", json BINARY)), and(eq(test.t2.c, 1), eq(test.t2.d, 2))), and(json_memberof(cast(2, json BINARY), test.t2.b), and(eq(test.t2.c, 3), eq(test.t2.d, 2))))", - "└─IndexMerge_11 0.10 root type: union", - " ├─IndexRangeScan_6(Build) 0.10 cop[tikv] table:t2, index:idx(c, cast(`a` as signed array)) range:[1 1,1 1], keep order:false, stats:pseudo", - " ├─IndexRangeScan_7(Build) 0.10 cop[tikv] table:t2, index:idx(c, cast(`a` as signed array)) range:[1 2,1 2], keep order:false, stats:pseudo", - " ├─IndexRangeScan_8(Build) 0.10 cop[tikv] table:t2, index:idx(c, cast(`a` as signed array)) range:[1 3,1 3], keep order:false, stats:pseudo", - " ├─IndexRangeScan_9(Build) 0.10 cop[tikv] table:t2, index:idx2(cast(`b` as signed array), c) range:[2 3,2 3], keep order:false, stats:pseudo", - " └─TableRowIDScan_10(Probe) 0.10 cop[tikv] table:t2 keep order:false, stats:pseudo" - ] - }, - { - "SQL": "explain select /*+ use_index_merge(t2, idx2, idx, idx4) */ * from t2 where ( json_contains(a, '[1, 2, 3]') and d=2) or (2 member of (b) and c=3 and d=2); -- 6: OR index merge from multi complicated mv index (memberof),make full use of other DNF items even if one of the DNF items fails", - "Plan": [ - "IndexMerge_9 0.01 root type: union", - "├─IndexRangeScan_5(Build) 10.00 cop[tikv] table:t2, index:idx4(d) range:[2,2], keep order:false, stats:pseudo", - "├─IndexRangeScan_6(Build) 0.10 cop[tikv] table:t2, index:idx2(cast(`b` as signed array), c) range:[2 3,2 3], keep order:false, stats:pseudo", - "└─Selection_8(Probe) 0.01 cop[tikv] or(and(json_contains(test.t2.a, cast(\"[1, 2, 3]\", json BINARY)), eq(test.t2.d, 2)), and(json_memberof(cast(2, json BINARY), test.t2.b), and(eq(test.t2.c, 3), eq(test.t2.d, 2))))", - " └─TableRowIDScan_7 10.00 cop[tikv] table:t2 keep order:false, stats:pseudo" - ] - }, - { - "SQL": "explain select /*+ use_index_merge(t2, idx2, idx) */ * from t2 where (1 member of (a) and 1 member of (b) and c=3) or (3 member of (b) and c=4); -- 7: OR index merge from multi complicated mv index (memberof),each DNF item can be more complicated like a another embedded CNF member-of composition.", - "Plan": [ - "IndexMerge_9 0.10 root type: union", - "├─IndexRangeScan_5(Build) 0.10 cop[tikv] table:t2, index:idx(c, cast(`a` as signed array)) range:[3 1,3 1], keep order:false, stats:pseudo", - "├─IndexRangeScan_6(Build) 0.10 cop[tikv] table:t2, index:idx2(cast(`b` as signed array), c) range:[3 4,3 4], keep order:false, stats:pseudo", - "└─Selection_8(Probe) 0.10 cop[tikv] or(and(json_memberof(cast(1, json BINARY), test.t2.a), and(json_memberof(cast(1, json BINARY), test.t2.b), eq(test.t2.c, 3))), and(json_memberof(cast(3, json BINARY), test.t2.b), eq(test.t2.c, 4)))", - " └─TableRowIDScan_7 0.10 cop[tikv] table:t2 keep order:false, stats:pseudo" - ] - }, - { - "SQL": "explain select /*+ use_index_merge(t2, idx2, idx) */ * from t2 where (1 member of (a) and 1 member of (b) and c=3) or (3 member of (b) and c=4) or e=1; -- 8: OR index merge from multi complicated mv index (memberof), each DNF item should be strict or lax used as index partial path.", - "Plan": [ - "TableReader_7 25.98 root data:Selection_6", - "└─Selection_6 25.98 cop[tikv] or(and(json_memberof(cast(1, json BINARY), test.t2.a), and(json_memberof(cast(1, json BINARY), test.t2.b), eq(test.t2.c, 3))), or(and(json_memberof(cast(3, json BINARY), test.t2.b), eq(test.t2.c, 4)), eq(test.t2.e, 1)))", - " └─TableFullScan_5 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" - ] - }, - { - "SQL": "explain select /*+ use_index_merge(t2, idx2, idx, idx4) */ * from t2 where (1 member of (a) and 1 member of (b) and c=3) or (3 member of (b) and c=4) or d=1; -- 9: OR index merge from multi complicated mv index (memberof), each DNF item should be strict or lax used as index partial path, specify the index in index merge hint", - "Plan": [ - "IndexMerge_10 0.03 root type: union", - "├─IndexRangeScan_5(Build) 10.00 cop[tikv] table:t2, index:idx4(d) range:[1,1], keep order:false, stats:pseudo", - "├─IndexRangeScan_6(Build) 0.10 cop[tikv] table:t2, index:idx(c, cast(`a` as signed array)) range:[3 1,3 1], keep order:false, stats:pseudo", - "├─IndexRangeScan_7(Build) 0.10 cop[tikv] table:t2, index:idx2(cast(`b` as signed array), c) range:[3 4,3 4], keep order:false, stats:pseudo", - "└─Selection_9(Probe) 0.03 cop[tikv] or(and(json_memberof(cast(1, json BINARY), test.t2.a), and(json_memberof(cast(1, json BINARY), test.t2.b), eq(test.t2.c, 3))), or(and(json_memberof(cast(3, json BINARY), test.t2.b), eq(test.t2.c, 4)), eq(test.t2.d, 1)))", - " └─TableRowIDScan_8 10.00 cop[tikv] table:t2 keep order:false, stats:pseudo" - ] - } - ] } ] diff --git a/pkg/planner/core/casetest/integration_test.go b/pkg/planner/core/casetest/integration_test.go index 04e2f0c2bc9a3..2df7a1222e758 100644 --- a/pkg/planner/core/casetest/integration_test.go +++ b/pkg/planner/core/casetest/integration_test.go @@ -143,62 +143,6 @@ func TestIsolationReadDoNotFilterSystemDB(t *testing.T) { } } -func TestPartitionPruningForInExpr(t *testing.T) { - failpoint.Enable("github.com/pingcap/tidb/pkg/planner/core/forceDynamicPrune", `return(true)`) - defer failpoint.Disable("github.com/pingcap/tidb/pkg/planner/core/forceDynamicPrune") - store := testkit.CreateMockStore(t) - tk := testkit.NewTestKit(t, store) - - tk.MustExec("use test") - tk.MustExec("drop table if exists t") - tk.MustExec("create table t(a int(11) not null, b int) partition by range (a) (partition p0 values less than (4), partition p1 values less than(10), partition p2 values less than maxvalue);") - tk.MustExec("insert into t values (1, 1),(10, 10),(11, 11)") - - var input []string - var output []struct { - SQL string - Plan []string - } - integrationSuiteData := GetIntegrationSuiteData() - integrationSuiteData.LoadTestCases(t, &input, &output) - for i, tt := range input { - testdata.OnRecord(func() { - output[i].SQL = tt - output[i].Plan = testdata.ConvertRowsToStrings(tk.MustQuery(tt).Rows()) - }) - tk.MustQuery(tt).Check(testkit.Rows(output[i].Plan...)) - } -} - -func TestPartitionExplain(t *testing.T) { - failpoint.Enable("github.com/pingcap/tidb/pkg/planner/core/forceDynamicPrune", `return(true)`) - defer failpoint.Disable("github.com/pingcap/tidb/pkg/planner/core/forceDynamicPrune") - store := testkit.CreateMockStore(t) - tk := testkit.NewTestKit(t, store) - tk.MustExec("use test") - tk.MustExec(`create table pt (id int, c int, key i_id(id), key i_c(c)) partition by range (c) ( -partition p0 values less than (4), -partition p1 values less than (7), -partition p2 values less than (10))`) - - tk.MustExec("set @@tidb_enable_index_merge = 1;") - - var input []string - var output []struct { - SQL string - Plan []string - } - integrationSuiteData := GetIntegrationSuiteData() - integrationSuiteData.LoadTestCases(t, &input, &output) - for i, tt := range input { - testdata.OnRecord(func() { - output[i].SQL = tt - output[i].Plan = testdata.ConvertRowsToStrings(tk.MustQuery("explain " + tt).Rows()) - }) - tk.MustQuery("explain " + tt).Check(testkit.Rows(output[i].Plan...)) - } -} - func TestMergeContinuousSelections(t *testing.T) { store := testkit.CreateMockStore(t) tk := testkit.NewTestKit(t, store) @@ -432,11 +376,3 @@ func TestFixControl45132(t *testing.T) { tk.MustExec(`set @@tidb_opt_fix_control = "45132:0"`) tk.MustHavePlan(`select * from t where a=2`, `TableFullScan`) } - -func TestIssue41957(t *testing.T) { - store := testkit.CreateMockStore(t) - tk := testkit.NewTestKit(t, store) - tk.MustExec(`use test`) - tk.MustExec("CREATE TABLE `github_events` (\n `id` bigint(20) NOT NULL DEFAULT '0',\n `type` varchar(29) NOT NULL DEFAULT 'Event',\n `created_at` datetime NOT NULL DEFAULT '1970-01-01 00:00:00',\n `repo_id` bigint(20) NOT NULL DEFAULT '0',\n `repo_name` varchar(140) NOT NULL DEFAULT '',\n `actor_id` bigint(20) NOT NULL DEFAULT '0',\n `actor_login` varchar(40) NOT NULL DEFAULT '',\n `language` varchar(26) NOT NULL DEFAULT '',\n `additions` bigint(20) NOT NULL DEFAULT '0',\n `deletions` bigint(20) NOT NULL DEFAULT '0',\n `action` varchar(11) NOT NULL DEFAULT '',\n `number` int(11) NOT NULL DEFAULT '0',\n `commit_id` varchar(40) NOT NULL DEFAULT '',\n `comment_id` bigint(20) NOT NULL DEFAULT '0',\n `org_login` varchar(40) NOT NULL DEFAULT '',\n `org_id` bigint(20) NOT NULL DEFAULT '0',\n `state` varchar(6) NOT NULL DEFAULT '',\n `closed_at` datetime NOT NULL DEFAULT '1970-01-01 00:00:00',\n `comments` int(11) NOT NULL DEFAULT '0',\n `pr_merged_at` datetime NOT NULL DEFAULT '1970-01-01 00:00:00',\n `pr_merged` tinyint(1) NOT NULL DEFAULT '0',\n `pr_changed_files` int(11) NOT NULL DEFAULT '0',\n `pr_review_comments` int(11) NOT NULL DEFAULT '0',\n `pr_or_issue_id` bigint(20) NOT NULL DEFAULT '0',\n `event_day` date NOT NULL,\n `event_month` date NOT NULL,\n `event_year` int(11) NOT NULL,\n `push_size` int(11) NOT NULL DEFAULT '0',\n `push_distinct_size` int(11) NOT NULL DEFAULT '0',\n `creator_user_login` varchar(40) NOT NULL DEFAULT '',\n `creator_user_id` bigint(20) NOT NULL DEFAULT '0',\n `pr_or_issue_created_at` datetime NOT NULL DEFAULT '1970-01-01 00:00:00',\n KEY `index_github_events_on_id` (`id`),\n KEY `index_github_events_on_created_at` (`created_at`),\n KEY `index_github_events_on_repo_id_type_action_month_actor_login` (`repo_id`,`type`,`action`,`event_month`,`actor_login`),\n KEY `index_ge_on_repo_id_type_action_pr_merged_created_at_add_del` (`repo_id`,`type`,`action`,`pr_merged`,`created_at`,`additions`,`deletions`),\n KEY `index_ge_on_creator_id_type_action_merged_created_at_add_del` (`creator_user_id`,`type`,`action`,`pr_merged`,`created_at`,`additions`,`deletions`),\n KEY `index_ge_on_actor_id_type_action_created_at_repo_id_commits` (`actor_id`,`type`,`action`,`created_at`,`repo_id`,`push_distinct_size`),\n KEY `index_ge_on_repo_id_type_action_created_at_number_pdsize_psize` (`repo_id`,`type`,`action`,`created_at`,`number`,`push_distinct_size`,`push_size`),\n KEY `index_ge_on_repo_id_type_action_created_at_actor_login` (`repo_id`,`type`,`action`,`created_at`,`actor_login`),\n KEY `index_ge_on_repo_name_type` (`repo_name`,`type`),\n KEY `index_ge_on_actor_login_type` (`actor_login`,`type`),\n KEY `index_ge_on_org_login_type` (`org_login`,`type`),\n KEY `index_ge_on_language` (`language`),\n KEY `index_ge_on_org_id_type` (`org_id`,`type`),\n KEY `index_ge_on_actor_login_lower` ((lower(`actor_login`))),\n KEY `index_ge_on_repo_name_lower` ((lower(`repo_name`))),\n KEY `index_ge_on_language_lower` ((lower(`language`))),\n KEY `index_ge_on_type_action` (`type`,`action`) /*!80000 INVISIBLE */,\n KEY `index_ge_on_repo_id_type_created_at` (`repo_id`,`type`,`created_at`),\n KEY `index_ge_on_repo_id_created_at` (`repo_id`,`created_at`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin\nPARTITION BY LIST COLUMNS(`type`)\n(PARTITION `push_event` VALUES IN ('PushEvent'),\n PARTITION `create_event` VALUES IN ('CreateEvent'),\n PARTITION `pull_request_event` VALUES IN ('PullRequestEvent'),\n PARTITION `watch_event` VALUES IN ('WatchEvent'),\n PARTITION `issue_comment_event` VALUES IN ('IssueCommentEvent'),\n PARTITION `issues_event` VALUES IN ('IssuesEvent'),\n PARTITION `delete_event` VALUES IN ('DeleteEvent'),\n PARTITION `fork_event` VALUES IN ('ForkEvent'),\n PARTITION `pull_request_review_comment_event` VALUES IN ('PullRequestReviewCommentEvent'),\n PARTITION `pull_request_review_event` VALUES IN ('PullRequestReviewEvent'),\n PARTITION `gollum_event` VALUES IN ('GollumEvent'),\n PARTITION `release_event` VALUES IN ('ReleaseEvent'),\n PARTITION `member_event` VALUES IN ('MemberEvent'),\n PARTITION `commit_comment_event` VALUES IN ('CommitCommentEvent'),\n PARTITION `public_event` VALUES IN ('PublicEvent'),\n PARTITION `gist_event` VALUES IN ('GistEvent'),\n PARTITION `follow_event` VALUES IN ('FollowEvent'),\n PARTITION `event` VALUES IN ('Event'),\n PARTITION `download_event` VALUES IN ('DownloadEvent'),\n PARTITION `team_add_event` VALUES IN ('TeamAddEvent'),\n PARTITION `fork_apply_event` VALUES IN ('ForkApplyEvent'))\n") - tk.MustQuery("SELECT\n repo_id, GROUP_CONCAT(\n DISTINCT actor_login\n ORDER BY cnt DESC\n SEPARATOR ','\n ) AS actor_logins\nFROM (\n SELECT\n ge.repo_id AS repo_id,\n ge.actor_login AS actor_login,\n COUNT(*) AS cnt\n FROM github_events ge\n WHERE\n type = 'PullRequestEvent' AND action = 'opened'\n AND (ge.created_at >= DATE_SUB(NOW(), INTERVAL 1 DAY) AND ge.created_at <= NOW())\n GROUP BY ge.repo_id, ge.actor_login\n ORDER BY cnt DESC\n) sub\nGROUP BY repo_id").Check(testkit.Rows()) -} diff --git a/pkg/planner/core/casetest/main_test.go b/pkg/planner/core/casetest/main_test.go index 173c428d9ff96..d551df46f9b5a 100644 --- a/pkg/planner/core/casetest/main_test.go +++ b/pkg/planner/core/casetest/main_test.go @@ -37,6 +37,7 @@ func TestMain(m *testing.M) { opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("gopkg.in/natefinch/lumberjack%2ev2.(*Logger).millRun"), diff --git a/pkg/planner/core/casetest/mpp/main_test.go b/pkg/planner/core/casetest/mpp/main_test.go index a488d8aa28f56..4830866f325c1 100644 --- a/pkg/planner/core/casetest/mpp/main_test.go +++ b/pkg/planner/core/casetest/mpp/main_test.go @@ -39,6 +39,7 @@ func TestMain(m *testing.M) { }) opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("gopkg.in/natefinch/lumberjack%2ev2.(*Logger).millRun"), diff --git a/pkg/planner/core/casetest/parallelapply/BUILD.bazel b/pkg/planner/core/casetest/parallelapply/BUILD.bazel new file mode 100644 index 0000000000000..0d472ac151e57 --- /dev/null +++ b/pkg/planner/core/casetest/parallelapply/BUILD.bazel @@ -0,0 +1,16 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_test") + +go_test( + name = "parallelapply_test", + timeout = "short", + srcs = [ + "main_test.go", + "parallel_apply_test.go", + ], + flaky = True, + deps = [ + "//pkg/testkit", + "//pkg/testkit/testsetup", + "@org_uber_go_goleak//:goleak", + ], +) diff --git a/pkg/planner/core/casetest/parallelapply/main_test.go b/pkg/planner/core/casetest/parallelapply/main_test.go new file mode 100644 index 0000000000000..84c0876d8a1fe --- /dev/null +++ b/pkg/planner/core/casetest/parallelapply/main_test.go @@ -0,0 +1,36 @@ +// Copyright 2024 PingCAP, 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. + +package parallelapply + +import ( + "testing" + + "github.com/pingcap/tidb/pkg/testkit/testsetup" + "go.uber.org/goleak" +) + +func TestMain(m *testing.M) { + testsetup.SetupForCommonTest() + opts := []goleak.Option{ + goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), + goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), + goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), + goleak.IgnoreTopFunction("gopkg.in/natefinch/lumberjack%2ev2.(*Logger).millRun"), + goleak.IgnoreTopFunction("github.com/tikv/client-go/v2/txnkv/transaction.keepAlive"), + goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), + } + goleak.VerifyTestMain(m, opts...) +} diff --git a/pkg/planner/core/casetest/parallelapply/parallel_apply_test.go b/pkg/planner/core/casetest/parallelapply/parallel_apply_test.go new file mode 100644 index 0000000000000..5df87d06d42ef --- /dev/null +++ b/pkg/planner/core/casetest/parallelapply/parallel_apply_test.go @@ -0,0 +1,33 @@ +// Copyright 2024 PingCAP, 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. + +package parallelapply + +import ( + "testing" + + "github.com/pingcap/tidb/pkg/testkit" +) + +func TestParallelApplyWarnning(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("create table t1 (a int, b int, c int);") + tk.MustExec("create table t2 (a int, b int, c int, key(a));") + tk.MustExec("create table t3(a int, b int, c int, key(a));") + tk.MustExec("set tidb_enable_parallel_apply=on;") + tk.MustQuery("select (select 1 from t2, t3 where t2.a=t3.a and t2.b > t1.b) from t1;") + tk.MustQuery("show warnings").Check(testkit.Rows("Warning 1105 Some apply operators can not be executed in parallel: *core.PhysicalIndexHashJoin doesn't support cloning")) +} diff --git a/pkg/planner/core/casetest/partition/main_test.go b/pkg/planner/core/casetest/partition/main_test.go index 025108ac7f246..60c419ef7b242 100644 --- a/pkg/planner/core/casetest/partition/main_test.go +++ b/pkg/planner/core/casetest/partition/main_test.go @@ -34,6 +34,7 @@ func TestMain(m *testing.M) { testDataMap.LoadTestSuiteData("testdata", "partition_pruner") opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("gopkg.in/natefinch/lumberjack%2ev2.(*Logger).millRun"), diff --git a/pkg/planner/core/casetest/physicalplantest/BUILD.bazel b/pkg/planner/core/casetest/physicalplantest/BUILD.bazel index 5281d694291c3..145f74ebb7dfb 100644 --- a/pkg/planner/core/casetest/physicalplantest/BUILD.bazel +++ b/pkg/planner/core/casetest/physicalplantest/BUILD.bazel @@ -10,7 +10,7 @@ go_test( data = glob(["testdata/**"]), flaky = True, race = "on", - shard_count = 30, + shard_count = 32, deps = [ "//pkg/config", "//pkg/domain", diff --git a/pkg/planner/core/casetest/physicalplantest/main_test.go b/pkg/planner/core/casetest/physicalplantest/main_test.go index 7d60f7f3329f0..81b6491bb2d9f 100644 --- a/pkg/planner/core/casetest/physicalplantest/main_test.go +++ b/pkg/planner/core/casetest/physicalplantest/main_test.go @@ -32,6 +32,7 @@ func TestMain(m *testing.M) { testDataMap.LoadTestSuiteData("testdata", "plan_suite") opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("gopkg.in/natefinch/lumberjack%2ev2.(*Logger).millRun"), diff --git a/pkg/planner/core/casetest/physicalplantest/physical_plan_test.go b/pkg/planner/core/casetest/physicalplantest/physical_plan_test.go index ba29c00fee313..834ca5df16859 100644 --- a/pkg/planner/core/casetest/physicalplantest/physical_plan_test.go +++ b/pkg/planner/core/casetest/physicalplantest/physical_plan_test.go @@ -1352,6 +1352,32 @@ func TestCountStarForTiFlash(t *testing.T) { } } +func TestIssues49377Plan(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("drop table if exists employee") + tk.MustExec("create table employee (employee_id int, name varchar(20), dept_id int)") + + var ( + input []string + output []struct { + SQL string + Plan []string + Warning []string + } + ) + planSuiteData := GetPlanSuiteData() + planSuiteData.LoadTestCases(t, &input, &output) + for i, ts := range input { + testdata.OnRecord(func() { + output[i].SQL = ts + output[i].Plan = testdata.ConvertRowsToStrings(tk.MustQuery("explain format = 'brief' " + ts).Rows()) + }) + tk.MustQuery("explain format = 'brief' " + ts).Check(testkit.Rows(output[i].Plan...)) + } +} + func TestHashAggPushdownToTiFlashCompute(t *testing.T) { var ( input []string @@ -1423,3 +1449,31 @@ func TestHashAggPushdownToTiFlashCompute(t *testing.T) { tk.MustQuery("explain format = 'brief' " + ts).Check(testkit.Rows(output[i].Plan...)) } } + +func TestPointgetIndexChoosen(t *testing.T) { + var ( + input []string + output []struct { + SQL string + Plan []string + Warning []string + } + ) + planSuiteData := GetPlanSuiteData() + planSuiteData.LoadTestCases(t, &input, &output) + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + + tk.MustExec("use test") + tk.MustExec(`CREATE TABLE t ( a int NOT NULL , b int NOT NULL, + c varchar(64) NOT NULL , d varchar(64) NOT NULL , + UNIQUE KEY ub (b), + UNIQUE KEY ubc (b, c));`) + for i, ts := range input { + testdata.OnRecord(func() { + output[i].SQL = ts + output[i].Plan = testdata.ConvertRowsToStrings(tk.MustQuery("explain format = 'brief' " + ts).Rows()) + }) + tk.MustQuery("explain format = 'brief' " + ts).Check(testkit.Rows(output[i].Plan...)) + } +} diff --git a/pkg/planner/core/casetest/physicalplantest/testdata/plan_suite_in.json b/pkg/planner/core/casetest/physicalplantest/testdata/plan_suite_in.json index a4d6a105b6001..e37113c7afe3d 100644 --- a/pkg/planner/core/casetest/physicalplantest/testdata/plan_suite_in.json +++ b/pkg/planner/core/casetest/physicalplantest/testdata/plan_suite_in.json @@ -594,5 +594,22 @@ "select /*+ agg_to_cop() hash_agg() */ count(1) from tbl_15 ;", "select /*+ agg_to_cop() stream_agg() */ avg( tbl_16.col_100 ) as r0 from tbl_16 where tbl_16.col_100 in ( 10672141 ) or tbl_16.col_104 in ( 'yfEG1t!*b' ,'C1*bqx_qyO' ,'vQ^yUpKHr&j#~' ) group by tbl_16.col_100 order by r0 limit 20 ;" ] + }, + { + "name": "TestIssues49377Plan", + "cases": [ + "select 1,1,1 union all ((select * from employee where dept_id = 1) union all ( select * from employee where dept_id = 1 order by employee_id ) order by 1 );", + "select 1,1,1 union all ((select * from employee where dept_id = 1) union all ( select * from employee where dept_id = 1 order by employee_id ) order by 1 limit 1);", + "select * from employee where dept_id = 1 union all ( select * from employee where dept_id = 1 order by employee_id) union all ( select * from employee where dept_id = 1 union all ( select * from employee where dept_id = 1 order by employee_id ) limit 1);", + "select * from employee where dept_id = 1 union all ( select * from employee where dept_id = 1 order by employee_id) union all ( select * from employee where dept_id = 1 union all ( select * from employee where dept_id = 1 order by employee_id ) order by 1 limit 1);" + ] + }, + { + "name": "TestPointgetIndexChoosen", + "cases": [ + "select * from t where b=1 and c='1';", + "select * from t where b=1 and c='1' and d='1';", + "select * from t where b in (1,2,3) and c in ('1');" + ] } ] diff --git a/pkg/planner/core/casetest/physicalplantest/testdata/plan_suite_out.json b/pkg/planner/core/casetest/physicalplantest/testdata/plan_suite_out.json index 85743605cc0b7..f82008601632f 100644 --- a/pkg/planner/core/casetest/physicalplantest/testdata/plan_suite_out.json +++ b/pkg/planner/core/casetest/physicalplantest/testdata/plan_suite_out.json @@ -2171,11 +2171,11 @@ }, { "SQL": "select a from t where c_str like ''", - "Best": "IndexReader(Index(t.c_d_e_str)[[\"\",\"\"]])->Projection" + "Best": "IndexReader(Index(t.c_d_e_str)[[\"\",\"\"]]->Sel([like(test.t.c_str, , 92)]))->Projection" }, { "SQL": "select a from t where c_str like 'abc'", - "Best": "IndexReader(Index(t.c_d_e_str)[[\"abc\",\"abc\"]])->Projection" + "Best": "IndexReader(Index(t.c_d_e_str)[[\"abc\",\"abc\"]]->Sel([like(test.t.c_str, abc, 92)]))->Projection" }, { "SQL": "select a from t where c_str not like 'abc'", @@ -2191,11 +2191,11 @@ }, { "SQL": "select a from t where c_str like 'abc%'", - "Best": "IndexReader(Index(t.c_d_e_str)[[\"abc\",\"abd\")])->Projection" + "Best": "IndexReader(Index(t.c_d_e_str)[[\"abc\",\"abd\")]->Sel([like(test.t.c_str, abc%, 92)]))->Projection" }, { "SQL": "select a from t where c_str like 'abc_'", - "Best": "IndexReader(Index(t.c_d_e_str)[(\"abc\",\"abd\")]->Sel([like(test.t.c_str, abc_, 92)]))->Projection" + "Best": "IndexReader(Index(t.c_d_e_str)[[\"abc\",\"abd\")]->Sel([like(test.t.c_str, abc_, 92)]))->Projection" }, { "SQL": "select a from t where c_str like 'abc%af'", @@ -2203,31 +2203,31 @@ }, { "SQL": "select a from t where c_str like 'abc\\_' escape ''", - "Best": "IndexReader(Index(t.c_d_e_str)[[\"abc_\",\"abc_\"]])->Projection" + "Best": "IndexReader(Index(t.c_d_e_str)[[\"abc_\",\"abc_\"]]->Sel([like(test.t.c_str, abc\\_, 92)]))->Projection" }, { "SQL": "select a from t where c_str like 'abc\\_'", - "Best": "IndexReader(Index(t.c_d_e_str)[[\"abc_\",\"abc_\"]])->Projection" + "Best": "IndexReader(Index(t.c_d_e_str)[[\"abc_\",\"abc_\"]]->Sel([like(test.t.c_str, abc\\_, 92)]))->Projection" }, { "SQL": "select a from t where c_str like 'abc\\\\_'", - "Best": "IndexReader(Index(t.c_d_e_str)[[\"abc_\",\"abc_\"]])->Projection" + "Best": "IndexReader(Index(t.c_d_e_str)[[\"abc_\",\"abc_\"]]->Sel([like(test.t.c_str, abc\\_, 92)]))->Projection" }, { "SQL": "select a from t where c_str like 'abc\\_%'", - "Best": "IndexReader(Index(t.c_d_e_str)[[\"abc_\",\"abc`\")])->Projection" + "Best": "IndexReader(Index(t.c_d_e_str)[[\"abc_\",\"abc`\")]->Sel([like(test.t.c_str, abc\\_%, 92)]))->Projection" }, { "SQL": "select a from t where c_str like 'abc=_%' escape '='", - "Best": "IndexReader(Index(t.c_d_e_str)[[\"abc_\",\"abc`\")])->Projection" + "Best": "IndexReader(Index(t.c_d_e_str)[[\"abc_\",\"abc`\")]->Sel([like(test.t.c_str, abc=_%, 61)]))->Projection" }, { "SQL": "select a from t where c_str like 'abc\\__'", - "Best": "IndexReader(Index(t.c_d_e_str)[(\"abc_\",\"abc`\")]->Sel([like(test.t.c_str, abc\\__, 92)]))->Projection" + "Best": "IndexReader(Index(t.c_d_e_str)[[\"abc_\",\"abc`\")]->Sel([like(test.t.c_str, abc\\__, 92)]))->Projection" }, { "SQL": "select a from t where c_str like 123", - "Best": "IndexReader(Index(t.c_d_e_str)[[\"123\",\"123\"]])->Projection" + "Best": "IndexReader(Index(t.c_d_e_str)[[\"123\",\"123\"]]->Sel([like(test.t.c_str, 123, 92)]))->Projection" }, { "SQL": "select a from t where c = 1.9 and d > 3", @@ -3621,5 +3621,130 @@ "Warning": null } ] + }, + { + "Name": "TestIssues49377Plan", + "Cases": [ + { + "SQL": "select 1,1,1 union all ((select * from employee where dept_id = 1) union all ( select * from employee where dept_id = 1 order by employee_id ) order by 1 );", + "Plan": [ + "Union 21.00 root ", + "├─Projection 1.00 root 1->Column#15, 1->Column#16, 1->Column#17", + "│ └─TableDual 1.00 root rows:1", + "└─Projection 20.00 root cast(Column#12, bigint(11) BINARY)->Column#15, Column#13->Column#16, cast(Column#14, bigint(11) BINARY)->Column#17", + " └─Sort 20.00 root Column#12", + " └─Union 20.00 root ", + " ├─TableReader 10.00 root data:Selection", + " │ └─Selection 10.00 cop[tikv] eq(test.employee.dept_id, 1)", + " │ └─TableFullScan 10000.00 cop[tikv] table:employee keep order:false, stats:pseudo", + " └─Sort 10.00 root test.employee.employee_id", + " └─TableReader 10.00 root data:Selection", + " └─Selection 10.00 cop[tikv] eq(test.employee.dept_id, 1)", + " └─TableFullScan 10000.00 cop[tikv] table:employee keep order:false, stats:pseudo" + ], + "Warning": null + }, + { + "SQL": "select 1,1,1 union all ((select * from employee where dept_id = 1) union all ( select * from employee where dept_id = 1 order by employee_id ) order by 1 limit 1);", + "Plan": [ + "Union 2.00 root ", + "├─Projection 1.00 root 1->Column#15, 1->Column#16, 1->Column#17", + "│ └─TableDual 1.00 root rows:1", + "└─Projection 1.00 root cast(Column#12, bigint(11) BINARY)->Column#15, Column#13->Column#16, cast(Column#14, bigint(11) BINARY)->Column#17", + " └─TopN 1.00 root Column#12, offset:0, count:1", + " └─Union 2.00 root ", + " ├─TopN 1.00 root test.employee.employee_id, offset:0, count:1", + " │ └─TableReader 1.00 root data:TopN", + " │ └─TopN 1.00 cop[tikv] test.employee.employee_id, offset:0, count:1", + " │ └─Selection 10.00 cop[tikv] eq(test.employee.dept_id, 1)", + " │ └─TableFullScan 10000.00 cop[tikv] table:employee keep order:false, stats:pseudo", + " └─TopN 1.00 root test.employee.employee_id, offset:0, count:1", + " └─TableReader 1.00 root data:TopN", + " └─TopN 1.00 cop[tikv] test.employee.employee_id, offset:0, count:1", + " └─Selection 10.00 cop[tikv] eq(test.employee.dept_id, 1)", + " └─TableFullScan 10000.00 cop[tikv] table:employee keep order:false, stats:pseudo" + ], + "Warning": null + }, + { + "SQL": "select * from employee where dept_id = 1 union all ( select * from employee where dept_id = 1 order by employee_id) union all ( select * from employee where dept_id = 1 union all ( select * from employee where dept_id = 1 order by employee_id ) limit 1);", + "Plan": [ + "Union 21.00 root ", + "├─TableReader 10.00 root data:Selection", + "│ └─Selection 10.00 cop[tikv] eq(test.employee.dept_id, 1)", + "│ └─TableFullScan 10000.00 cop[tikv] table:employee keep order:false, stats:pseudo", + "├─Sort 10.00 root test.employee.employee_id", + "│ └─TableReader 10.00 root data:Selection", + "│ └─Selection 10.00 cop[tikv] eq(test.employee.dept_id, 1)", + "│ └─TableFullScan 10000.00 cop[tikv] table:employee keep order:false, stats:pseudo", + "└─Limit 1.00 root offset:0, count:1", + " └─Union 1.00 root ", + " ├─Limit 1.00 root offset:0, count:1", + " │ └─TableReader 1.00 root data:Limit", + " │ └─Limit 1.00 cop[tikv] offset:0, count:1", + " │ └─Selection 1.00 cop[tikv] eq(test.employee.dept_id, 1)", + " │ └─TableFullScan 1000.00 cop[tikv] table:employee keep order:false, stats:pseudo", + " └─TopN 1.00 root test.employee.employee_id, offset:0, count:1", + " └─TableReader 1.00 root data:TopN", + " └─TopN 1.00 cop[tikv] test.employee.employee_id, offset:0, count:1", + " └─Selection 10.00 cop[tikv] eq(test.employee.dept_id, 1)", + " └─TableFullScan 10000.00 cop[tikv] table:employee keep order:false, stats:pseudo" + ], + "Warning": null + }, + { + "SQL": "select * from employee where dept_id = 1 union all ( select * from employee where dept_id = 1 order by employee_id) union all ( select * from employee where dept_id = 1 union all ( select * from employee where dept_id = 1 order by employee_id ) order by 1 limit 1);", + "Plan": [ + "Union 21.00 root ", + "├─TableReader 10.00 root data:Selection", + "│ └─Selection 10.00 cop[tikv] eq(test.employee.dept_id, 1)", + "│ └─TableFullScan 10000.00 cop[tikv] table:employee keep order:false, stats:pseudo", + "├─Sort 10.00 root test.employee.employee_id", + "│ └─TableReader 10.00 root data:Selection", + "│ └─Selection 10.00 cop[tikv] eq(test.employee.dept_id, 1)", + "│ └─TableFullScan 10000.00 cop[tikv] table:employee keep order:false, stats:pseudo", + "└─TopN 1.00 root Column#17, offset:0, count:1", + " └─Union 2.00 root ", + " ├─TopN 1.00 root test.employee.employee_id, offset:0, count:1", + " │ └─TableReader 1.00 root data:TopN", + " │ └─TopN 1.00 cop[tikv] test.employee.employee_id, offset:0, count:1", + " │ └─Selection 10.00 cop[tikv] eq(test.employee.dept_id, 1)", + " │ └─TableFullScan 10000.00 cop[tikv] table:employee keep order:false, stats:pseudo", + " └─TopN 1.00 root test.employee.employee_id, offset:0, count:1", + " └─TableReader 1.00 root data:TopN", + " └─TopN 1.00 cop[tikv] test.employee.employee_id, offset:0, count:1", + " └─Selection 10.00 cop[tikv] eq(test.employee.dept_id, 1)", + " └─TableFullScan 10000.00 cop[tikv] table:employee keep order:false, stats:pseudo" + ], + "Warning": null + } + ] + }, + { + "Name": "TestPointgetIndexChoosen", + "Cases": [ + { + "SQL": "select * from t where b=1 and c='1';", + "Plan": [ + "Point_Get 1.00 root table:t, index:ubc(b, c) " + ], + "Warning": null + }, + { + "SQL": "select * from t where b=1 and c='1' and d='1';", + "Plan": [ + "Selection 0.00 root eq(test.t.d, \"1\")", + "└─Point_Get 1.00 root table:t, index:ubc(b, c) " + ], + "Warning": null + }, + { + "SQL": "select * from t where b in (1,2,3) and c in ('1');", + "Plan": [ + "Batch_Point_Get 3.00 root table:t, index:ubc(b, c) keep order:false, desc:false" + ], + "Warning": null + } + ] } ] diff --git a/pkg/planner/core/casetest/planstats/main_test.go b/pkg/planner/core/casetest/planstats/main_test.go index 07659467e02b1..f53fa7fc26c58 100644 --- a/pkg/planner/core/casetest/planstats/main_test.go +++ b/pkg/planner/core/casetest/planstats/main_test.go @@ -34,6 +34,7 @@ func TestMain(m *testing.M) { opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("gopkg.in/natefinch/lumberjack%2ev2.(*Logger).millRun"), diff --git a/pkg/planner/core/casetest/pushdown/main_test.go b/pkg/planner/core/casetest/pushdown/main_test.go index 5f822937fd2e3..c6b0353f38c25 100644 --- a/pkg/planner/core/casetest/pushdown/main_test.go +++ b/pkg/planner/core/casetest/pushdown/main_test.go @@ -34,6 +34,7 @@ func TestMain(m *testing.M) { opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("gopkg.in/natefinch/lumberjack%2ev2.(*Logger).millRun"), diff --git a/pkg/planner/core/casetest/rule/main_test.go b/pkg/planner/core/casetest/rule/main_test.go index 51a39a986dcbd..6e357a5801f2d 100644 --- a/pkg/planner/core/casetest/rule/main_test.go +++ b/pkg/planner/core/casetest/rule/main_test.go @@ -33,6 +33,7 @@ func TestMain(m *testing.M) { testDataMap.LoadTestSuiteData("testdata", "join_reorder_suite") opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("gopkg.in/natefinch/lumberjack%2ev2.(*Logger).millRun"), diff --git a/pkg/planner/core/casetest/scalarsubquery/main_test.go b/pkg/planner/core/casetest/scalarsubquery/main_test.go index 04fd9d9e86f51..ca331dd078488 100644 --- a/pkg/planner/core/casetest/scalarsubquery/main_test.go +++ b/pkg/planner/core/casetest/scalarsubquery/main_test.go @@ -32,6 +32,7 @@ func TestMain(m *testing.M) { testDataMap.LoadTestSuiteData("testdata", "plan_suite") opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("gopkg.in/natefinch/lumberjack%2ev2.(*Logger).millRun"), diff --git a/pkg/planner/core/casetest/stats_test.go b/pkg/planner/core/casetest/stats_test.go index cc7f4da935e11..a84aec9b2dab8 100644 --- a/pkg/planner/core/casetest/stats_test.go +++ b/pkg/planner/core/casetest/stats_test.go @@ -58,7 +58,7 @@ func TestGroupNDVs(t *testing.T) { err = core.Preprocess(context.Background(), tk.Session(), stmt, core.WithPreprocessorReturn(ret)) require.NoError(t, err) tk.Session().GetSessionVars().PlanColumnID.Store(0) - builder, _ := core.NewPlanBuilder().Init(tk.Session(), ret.InfoSchema, &hint.BlockHintProcessor{}) + builder, _ := core.NewPlanBuilder().Init(tk.Session(), ret.InfoSchema, hint.NewQBHintHandler(nil)) p, err := builder.Build(ctx, stmt) require.NoError(t, err, comment) p, err = core.LogicalOptimizeTest(ctx, builder.GetOptFlag(), p.(core.LogicalPlan)) diff --git a/pkg/planner/core/casetest/testdata/integration_suite_in.json b/pkg/planner/core/casetest/testdata/integration_suite_in.json index 09cde7a829609..49896add29e01 100644 --- a/pkg/planner/core/casetest/testdata/integration_suite_in.json +++ b/pkg/planner/core/casetest/testdata/integration_suite_in.json @@ -1,42 +1,4 @@ [ - { - "name": "TestPartitionPruningForInExpr", - "cases": [ - "explain format = 'brief' select * from t where a in (1, 2,'11')", - "explain format = 'brief' select * from t where a in (17, null)", - "explain format = 'brief' select * from t where a in (16, 'abc')", - "explain format = 'brief' select * from t where a in (15, 0.12, 3.47)", - "explain format = 'brief' select * from t where a in (0.12, 3.47)", - "explain format = 'brief' select * from t where a in (14, floor(3.47))", - "explain format = 'brief' select * from t where b in (3, 4)" - ] - }, - { - "name": "TestPartitionExplain", - "cases": [ - // Table reader - "select * from pt where c > 10", - "select * from pt where c > 8", - "select * from pt where c < 2 or c >= 9", - // Index reader - "select c from pt", - "select c from pt where c > 10", - "select c from pt where c > 8", - "select c from pt where c < 2 or c >= 9", - // Index Lookup - "select /*+ use_index(pt, i_id) */ * from pt", - "select /*+ use_index(pt, i_id) */ * from pt where id < 4 and c > 10", - "select /*+ use_index(pt, i_id) */ * from pt where id < 10 and c > 8", - "select /*+ use_index(pt, i_id) */ * from pt where id < 10 and c < 2 or c >= 9", - // Partition selection - "select * from pt partition (p0) where c > 8", - "select c from pt partition (p0, p2) where c > 8", - "select /*+ use_index(pt, i_id) */ * from pt partition (p1, p2) where c < 3 and id = 5", - // Index Merge - "select * from pt where id = 4 or c < 7", - "select * from pt where id > 4 or c = 7" - ] - }, { "name": "TestIssue31240", "cases": [ diff --git a/pkg/planner/core/casetest/testdata/integration_suite_out.json b/pkg/planner/core/casetest/testdata/integration_suite_out.json index 7df363a498e8b..d3118b0eb5195 100644 --- a/pkg/planner/core/casetest/testdata/integration_suite_out.json +++ b/pkg/planner/core/casetest/testdata/integration_suite_out.json @@ -1,197 +1,4 @@ [ - { - "Name": "TestPartitionPruningForInExpr", - "Cases": [ - { - "SQL": "explain format = 'brief' select * from t where a in (1, 2,'11')", - "Plan": [ - "TableReader 30.00 root partition:p0,p2 data:Selection", - "└─Selection 30.00 cop[tikv] in(test.t.a, 1, 2, 11)", - " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" - ] - }, - { - "SQL": "explain format = 'brief' select * from t where a in (17, null)", - "Plan": [ - "TableReader 10.00 root partition:p0,p2 data:Selection", - "└─Selection 10.00 cop[tikv] in(test.t.a, 17, NULL)", - " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" - ] - }, - { - "SQL": "explain format = 'brief' select * from t where a in (16, 'abc')", - "Plan": [ - "TableReader 20.00 root partition:p0,p2 data:Selection", - "└─Selection 20.00 cop[tikv] in(test.t.a, 16, 0)", - " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" - ] - }, - { - "SQL": "explain format = 'brief' select * from t where a in (15, 0.12, 3.47)", - "Plan": [ - "TableReader 10.00 root partition:p2 data:Selection", - "└─Selection 10.00 cop[tikv] or(eq(test.t.a, 15), 0)", - " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" - ] - }, - { - "SQL": "explain format = 'brief' select * from t where a in (0.12, 3.47)", - "Plan": [ - "TableDual 0.00 root rows:0" - ] - }, - { - "SQL": "explain format = 'brief' select * from t where a in (14, floor(3.47))", - "Plan": [ - "TableReader 20.00 root partition:p0,p2 data:Selection", - "└─Selection 20.00 cop[tikv] in(test.t.a, 14, 3)", - " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" - ] - }, - { - "SQL": "explain format = 'brief' select * from t where b in (3, 4)", - "Plan": [ - "TableReader 20.00 root partition:all data:Selection", - "└─Selection 20.00 cop[tikv] in(test.t.b, 3, 4)", - " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" - ] - } - ] - }, - { - "Name": "TestPartitionExplain", - "Cases": [ - { - "SQL": "select * from pt where c > 10", - "Plan": [ - "TableReader_7 3333.33 root partition:dual data:Selection_6", - "└─Selection_6 3333.33 cop[tikv] gt(test.pt.c, 10)", - " └─TableFullScan_5 10000.00 cop[tikv] table:pt keep order:false, stats:pseudo" - ] - }, - { - "SQL": "select * from pt where c > 8", - "Plan": [ - "TableReader_7 3333.33 root partition:p2 data:Selection_6", - "└─Selection_6 3333.33 cop[tikv] gt(test.pt.c, 8)", - " └─TableFullScan_5 10000.00 cop[tikv] table:pt keep order:false, stats:pseudo" - ] - }, - { - "SQL": "select * from pt where c < 2 or c >= 9", - "Plan": [ - "TableReader_7 6656.67 root partition:p0,p2 data:Selection_6", - "└─Selection_6 6656.67 cop[tikv] or(lt(test.pt.c, 2), ge(test.pt.c, 9))", - " └─TableFullScan_5 10000.00 cop[tikv] table:pt keep order:false, stats:pseudo" - ] - }, - { - "SQL": "select c from pt", - "Plan": [ - "IndexReader_7 10000.00 root partition:all index:IndexFullScan_6", - "└─IndexFullScan_6 10000.00 cop[tikv] table:pt, index:i_c(c) keep order:false, stats:pseudo" - ] - }, - { - "SQL": "select c from pt where c > 10", - "Plan": [ - "IndexReader_6 3333.33 root partition:dual index:IndexRangeScan_5", - "└─IndexRangeScan_5 3333.33 cop[tikv] table:pt, index:i_c(c) range:(10,+inf], keep order:false, stats:pseudo" - ] - }, - { - "SQL": "select c from pt where c > 8", - "Plan": [ - "IndexReader_6 3333.33 root partition:p2 index:IndexRangeScan_5", - "└─IndexRangeScan_5 3333.33 cop[tikv] table:pt, index:i_c(c) range:(8,+inf], keep order:false, stats:pseudo" - ] - }, - { - "SQL": "select c from pt where c < 2 or c >= 9", - "Plan": [ - "IndexReader_6 6656.67 root partition:p0,p2 index:IndexRangeScan_5", - "└─IndexRangeScan_5 6656.67 cop[tikv] table:pt, index:i_c(c) range:[-inf,2), [9,+inf], keep order:false, stats:pseudo" - ] - }, - { - "SQL": "select /*+ use_index(pt, i_id) */ * from pt", - "Plan": [ - "IndexLookUp_6 10000.00 root partition:all ", - "├─IndexFullScan_4(Build) 10000.00 cop[tikv] table:pt, index:i_id(id) keep order:false, stats:pseudo", - "└─TableRowIDScan_5(Probe) 10000.00 cop[tikv] table:pt keep order:false, stats:pseudo" - ] - }, - { - "SQL": "select /*+ use_index(pt, i_id) */ * from pt where id < 4 and c > 10", - "Plan": [ - "IndexLookUp_8 1107.78 root partition:dual ", - "├─IndexRangeScan_5(Build) 3323.33 cop[tikv] table:pt, index:i_id(id) range:[-inf,4), keep order:false, stats:pseudo", - "└─Selection_7(Probe) 1107.78 cop[tikv] gt(test.pt.c, 10)", - " └─TableRowIDScan_6 3323.33 cop[tikv] table:pt keep order:false, stats:pseudo" - ] - }, - { - "SQL": "select /*+ use_index(pt, i_id) */ * from pt where id < 10 and c > 8", - "Plan": [ - "IndexLookUp_8 1107.78 root partition:p2 ", - "├─IndexRangeScan_5(Build) 3323.33 cop[tikv] table:pt, index:i_id(id) range:[-inf,10), keep order:false, stats:pseudo", - "└─Selection_7(Probe) 1107.78 cop[tikv] gt(test.pt.c, 8)", - " └─TableRowIDScan_6 3323.33 cop[tikv] table:pt keep order:false, stats:pseudo" - ] - }, - { - "SQL": "select /*+ use_index(pt, i_id) */ * from pt where id < 10 and c < 2 or c >= 9", - "Plan": [ - "IndexLookUp_8 5325.33 root partition:p0,p2 ", - "├─IndexFullScan_5(Build) 10000.00 cop[tikv] table:pt, index:i_id(id) keep order:false, stats:pseudo", - "└─Selection_7(Probe) 5325.33 cop[tikv] or(and(lt(test.pt.id, 10), lt(test.pt.c, 2)), ge(test.pt.c, 9))", - " └─TableRowIDScan_6 10000.00 cop[tikv] table:pt keep order:false, stats:pseudo" - ] - }, - { - "SQL": "select * from pt partition (p0) where c > 8", - "Plan": [ - "TableReader_7 3333.33 root partition:dual data:Selection_6", - "└─Selection_6 3333.33 cop[tikv] gt(test.pt.c, 8)", - " └─TableFullScan_5 10000.00 cop[tikv] table:pt keep order:false, stats:pseudo" - ] - }, - { - "SQL": "select c from pt partition (p0, p2) where c > 8", - "Plan": [ - "IndexReader_6 3333.33 root partition:p2 index:IndexRangeScan_5", - "└─IndexRangeScan_5 3333.33 cop[tikv] table:pt, index:i_c(c) range:(8,+inf], keep order:false, stats:pseudo" - ] - }, - { - "SQL": "select /*+ use_index(pt, i_id) */ * from pt partition (p1, p2) where c < 3 and id = 5", - "Plan": [ - "IndexLookUp_8 3.32 root partition:dual ", - "├─IndexRangeScan_5(Build) 10.00 cop[tikv] table:pt, index:i_id(id) range:[5,5], keep order:false, stats:pseudo", - "└─Selection_7(Probe) 3.32 cop[tikv] lt(test.pt.c, 3)", - " └─TableRowIDScan_6 10.00 cop[tikv] table:pt keep order:false, stats:pseudo" - ] - }, - { - "SQL": "select * from pt where id = 4 or c < 7", - "Plan": [ - "IndexMerge_11 3330.01 root partition:all type: union", - "├─IndexRangeScan_8(Build) 10.00 cop[tikv] table:pt, index:i_id(id) range:[4,4], keep order:false, stats:pseudo", - "├─IndexRangeScan_9(Build) 3323.33 cop[tikv] table:pt, index:i_c(c) range:[-inf,7), keep order:false, stats:pseudo", - "└─TableRowIDScan_10(Probe) 3330.01 cop[tikv] table:pt keep order:false, stats:pseudo" - ] - }, - { - "SQL": "select * from pt where id > 4 or c = 7", - "Plan": [ - "IndexMerge_11 3340.00 root partition:all type: union", - "├─IndexRangeScan_8(Build) 3333.33 cop[tikv] table:pt, index:i_id(id) range:(4,+inf], keep order:false, stats:pseudo", - "├─IndexRangeScan_9(Build) 10.00 cop[tikv] table:pt, index:i_c(c) range:[7,7], keep order:false, stats:pseudo", - "└─TableRowIDScan_10(Probe) 3340.00 cop[tikv] table:pt keep order:false, stats:pseudo" - ] - } - ] - }, { "Name": "TestIssue31240", "Cases": [ diff --git a/pkg/planner/core/casetest/windows/main_test.go b/pkg/planner/core/casetest/windows/main_test.go index ca2f32e4b7f6f..31c21396bea1e 100644 --- a/pkg/planner/core/casetest/windows/main_test.go +++ b/pkg/planner/core/casetest/windows/main_test.go @@ -32,6 +32,7 @@ func TestMain(m *testing.M) { testDataMap.LoadTestSuiteData("testdata", "window_push_down_suite") opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("gopkg.in/natefinch/lumberjack%2ev2.(*Logger).millRun"), diff --git a/pkg/planner/core/collect_column_stats_usage_test.go b/pkg/planner/core/collect_column_stats_usage_test.go index a9a3668fa79ad..ab74ebd3dcb95 100644 --- a/pkg/planner/core/collect_column_stats_usage_test.go +++ b/pkg/planner/core/collect_column_stats_usage_test.go @@ -259,7 +259,7 @@ func TestCollectPredicateColumns(t *testing.T) { require.NoError(t, err, comment) err = Preprocess(context.Background(), s.ctx, stmt, WithPreprocessorReturn(&PreprocessorReturn{InfoSchema: s.is})) require.NoError(t, err, comment) - builder, _ := NewPlanBuilder().Init(s.ctx, s.is, &hint.BlockHintProcessor{}) + builder, _ := NewPlanBuilder().Init(s.ctx, s.is, hint.NewQBHintHandler(nil)) p, err := builder.Build(ctx, stmt) require.NoError(t, err, comment) lp, ok := p.(LogicalPlan) @@ -342,7 +342,7 @@ func TestCollectHistNeededColumns(t *testing.T) { require.NoError(t, err, comment) err = Preprocess(context.Background(), s.ctx, stmt, WithPreprocessorReturn(&PreprocessorReturn{InfoSchema: s.is})) require.NoError(t, err, comment) - builder, _ := NewPlanBuilder().Init(s.ctx, s.is, &hint.BlockHintProcessor{}) + builder, _ := NewPlanBuilder().Init(s.ctx, s.is, hint.NewQBHintHandler(nil)) p, err := builder.Build(ctx, stmt) require.NoError(t, err, comment) lp, ok := p.(LogicalPlan) diff --git a/pkg/planner/core/common_plans.go b/pkg/planner/core/common_plans.go index 88e36c8ca1d01..7f69168be0886 100644 --- a/pkg/planner/core/common_plans.go +++ b/pkg/planner/core/common_plans.go @@ -595,6 +595,8 @@ type ImportInto struct { GenCols InsertGeneratedColumns Stmt string + + SelectPlan PhysicalPlan } // LoadStats represents a load stats plan. @@ -874,12 +876,12 @@ func (e *Explain) RenderResult() error { cost, _ := pp.getPlanCostVer2(property.RootTaskType, NewDefaultPlanCostOption()) if cost.trace != nil { trace := cost.trace - pp.SCtx().GetSessionVars().StmtCtx.AppendWarning(errors.Errorf("cost formula: %v", trace.formula)) + pp.SCtx().GetSessionVars().StmtCtx.AppendWarning(errors.NewNoStackErrorf("cost formula: %v", trace.formula)) data, err := json.Marshal(trace.factorCosts) if err != nil { - pp.SCtx().GetSessionVars().StmtCtx.AppendWarning(errors.Errorf("marshal factor costs error %v", err)) + pp.SCtx().GetSessionVars().StmtCtx.AppendWarning(errors.NewNoStackErrorf("marshal factor costs error %v", err)) } - pp.SCtx().GetSessionVars().StmtCtx.AppendWarning(errors.Errorf("factor costs: %v", string(data))) + pp.SCtx().GetSessionVars().StmtCtx.AppendWarning(errors.NewNoStackErrorf("factor costs: %v", string(data))) // output cost factor weights for cost calibration factors := defaultVer2Factors.tolist() @@ -890,14 +892,14 @@ func (e *Explain) RenderResult() error { } } if wstr, err := json.Marshal(weights); err != nil { - pp.SCtx().GetSessionVars().StmtCtx.AppendWarning(errors.Errorf("marshal weights error %v", err)) + pp.SCtx().GetSessionVars().StmtCtx.AppendWarning(errors.NewNoStackErrorf("marshal weights error %v", err)) } else { - pp.SCtx().GetSessionVars().StmtCtx.AppendWarning(errors.Errorf("factor weights: %v", string(wstr))) + pp.SCtx().GetSessionVars().StmtCtx.AppendWarning(errors.NewNoStackErrorf("factor weights: %v", string(wstr))) } } } } else { - e.SCtx().GetSessionVars().StmtCtx.AppendWarning(errors.Errorf("'explain format=true_card_cost' cannot support this plan")) + e.SCtx().GetSessionVars().StmtCtx.AppendWarning(errors.NewNoStackError("'explain format=true_card_cost' cannot support this plan")) } } diff --git a/pkg/planner/core/exhaust_physical_plans.go b/pkg/planner/core/exhaust_physical_plans.go index 7601111e36e5c..cc0f3b10e5a7e 100644 --- a/pkg/planner/core/exhaust_physical_plans.go +++ b/pkg/planner/core/exhaust_physical_plans.go @@ -39,6 +39,7 @@ import ( "github.com/pingcap/tidb/pkg/types" "github.com/pingcap/tidb/pkg/util/chunk" "github.com/pingcap/tidb/pkg/util/collate" + h "github.com/pingcap/tidb/pkg/util/hint" "github.com/pingcap/tidb/pkg/util/logutil" "github.com/pingcap/tidb/pkg/util/plancodec" "github.com/pingcap/tidb/pkg/util/ranger" @@ -59,7 +60,7 @@ func (p *LogicalUnionScan) exhaustPhysicalPlans(prop *property.PhysicalProperty) us := PhysicalUnionScan{ Conditions: p.conditions, HandleCols: p.handleCols, - }.Init(p.SCtx(), p.StatsInfo(), p.SelectBlockOffset(), childProp) + }.Init(p.SCtx(), p.StatsInfo(), p.QueryBlockOffset(), childProp) return []PhysicalPlan{us}, true, nil } @@ -214,7 +215,7 @@ func (p *LogicalJoin) GetMergeJoin(prop *property.PhysicalProperty, schema *expr RightJoinKeys: rightKeys, IsNullEQ: newIsNullEQ, } - mergeJoin := PhysicalMergeJoin{basePhysicalJoin: baseJoin}.Init(p.SCtx(), statsInfo.ScaleByExpectCnt(prop.ExpectedCnt), p.SelectBlockOffset()) + mergeJoin := PhysicalMergeJoin{basePhysicalJoin: baseJoin}.Init(p.SCtx(), statsInfo.ScaleByExpectCnt(prop.ExpectedCnt), p.QueryBlockOffset()) mergeJoin.SetSchema(schema) mergeJoin.OtherConditions = p.moveEqualToOtherConditions(offsets) mergeJoin.initCompareFuncs() @@ -232,17 +233,17 @@ func (p *LogicalJoin) GetMergeJoin(prop *property.PhysicalProperty, schema *expr } } - if p.preferJoinType&preferNoMergeJoin > 0 { - if p.preferJoinType&preferMergeJoin == 0 { + if p.preferJoinType&h.PreferNoMergeJoin > 0 { + if p.preferJoinType&h.PreferMergeJoin == 0 { return nil } - p.SCtx().GetSessionVars().StmtCtx.AppendWarning(ErrInternal.GenWithStack( + p.SCtx().GetSessionVars().StmtCtx.AppendWarning(ErrInternal.FastGen( "Some MERGE_JOIN and NO_MERGE_JOIN hints conflict, NO_MERGE_JOIN is ignored")) } // If TiDB_SMJ hint is existed, it should consider enforce merge join, // because we can't trust lhsChildProperty completely. - if (p.preferJoinType&preferMergeJoin) > 0 || + if (p.preferJoinType&h.PreferMergeJoin) > 0 || p.shouldSkipHashJoin() { // if hash join is not allowed, generate as many other types of join as possible to avoid 'cant-find-plan' error. joins = append(joins, p.getEnforcedMergeJoin(prop, schema, statsInfo)...) } @@ -368,7 +369,7 @@ func (p *LogicalJoin) getEnforcedMergeJoin(prop *property.PhysicalProperty, sche IsNullEQ: newNullEQ, OtherConditions: otherConditions, } - enforcedPhysicalMergeJoin := PhysicalMergeJoin{basePhysicalJoin: baseJoin, Desc: desc}.Init(p.SCtx(), statsInfo.ScaleByExpectCnt(prop.ExpectedCnt), p.SelectBlockOffset()) + enforcedPhysicalMergeJoin := PhysicalMergeJoin{basePhysicalJoin: baseJoin, Desc: desc}.Init(p.SCtx(), statsInfo.ScaleByExpectCnt(prop.ExpectedCnt), p.QueryBlockOffset()) enforcedPhysicalMergeJoin.SetSchema(schema) enforcedPhysicalMergeJoin.childrenReqProps = []*property.PhysicalProperty{lProp, rProp} enforcedPhysicalMergeJoin.initCompareFuncs() @@ -391,17 +392,17 @@ var ForceUseOuterBuild4Test = atomic.NewBool(false) var ForcedHashLeftJoin4Test = atomic.NewBool(false) func (p *LogicalJoin) shouldSkipHashJoin() bool { - return (p.preferJoinType&preferNoHashJoin) > 0 || (p.SCtx().GetSessionVars().DisableHashJoin) + return (p.preferJoinType&h.PreferNoHashJoin) > 0 || (p.SCtx().GetSessionVars().DisableHashJoin) } func (p *LogicalJoin) getHashJoins(prop *property.PhysicalProperty) (joins []PhysicalPlan, forced bool) { if !prop.IsSortItemEmpty() { // hash join doesn't promise any orders return } - forceLeftToBuild := ((p.preferJoinType & preferLeftAsHJBuild) > 0) || ((p.preferJoinType & preferRightAsHJProbe) > 0) - forceRightToBuild := ((p.preferJoinType & preferRightAsHJBuild) > 0) || ((p.preferJoinType & preferLeftAsHJProbe) > 0) + forceLeftToBuild := ((p.preferJoinType & h.PreferLeftAsHJBuild) > 0) || ((p.preferJoinType & h.PreferRightAsHJProbe) > 0) + forceRightToBuild := ((p.preferJoinType & h.PreferRightAsHJBuild) > 0) || ((p.preferJoinType & h.PreferLeftAsHJProbe) > 0) if forceLeftToBuild && forceRightToBuild { - p.SCtx().GetSessionVars().StmtCtx.AppendWarning(ErrInternal.GenWithStack("Some HASH_JOIN_BUILD and HASH_JOIN_PROBE hints are conflicts, please check the hints")) + p.SCtx().GetSessionVars().StmtCtx.AppendWarning(ErrInternal.FastGen("Some HASH_JOIN_BUILD and HASH_JOIN_PROBE hints are conflicts, please check the hints")) forceLeftToBuild = false forceRightToBuild = false } @@ -412,7 +413,7 @@ func (p *LogicalJoin) getHashJoins(prop *property.PhysicalProperty) (joins []Phy joins = append(joins, p.getHashJoin(prop, 1, false)) if forceLeftToBuild || forceRightToBuild { // Do not support specifying the build side. - p.SCtx().GetSessionVars().StmtCtx.AppendWarning(ErrInternal.GenWithStack(fmt.Sprintf("We can't use the HASH_JOIN_BUILD or HASH_JOIN_PROBE hint for %s, please check the hint", p.JoinType))) + p.SCtx().GetSessionVars().StmtCtx.AppendWarning(ErrInternal.FastGen(fmt.Sprintf("We can't use the HASH_JOIN_BUILD or HASH_JOIN_PROBE hint for %s, please check the hint", p.JoinType))) forceLeftToBuild = false forceRightToBuild = false } @@ -453,11 +454,11 @@ func (p *LogicalJoin) getHashJoins(prop *property.PhysicalProperty) (joins []Phy } } - forced = (p.preferJoinType&preferHashJoin > 0) || forceLeftToBuild || forceRightToBuild + forced = (p.preferJoinType&h.PreferHashJoin > 0) || forceLeftToBuild || forceRightToBuild if !forced && p.shouldSkipHashJoin() { return nil, false } else if forced && p.shouldSkipHashJoin() { - p.SCtx().GetSessionVars().StmtCtx.AppendWarning(ErrInternal.GenWithStack( + p.SCtx().GetSessionVars().StmtCtx.AppendWarning(ErrInternal.FastGen( "A conflict between the HASH_JOIN hint and the NO_HASH_JOIN hint, " + "or the tidb_opt_enable_hash_join system variable, the HASH_JOIN hint will take precedence.")) } @@ -585,7 +586,7 @@ func (p *LogicalJoin) constructIndexJoin( CompareFilters: compareFilters, OuterHashKeys: outerHashKeys, InnerHashKeys: innerHashKeys, - }.Init(p.SCtx(), p.StatsInfo().ScaleByExpectCnt(prop.ExpectedCnt), p.SelectBlockOffset(), chReqProps...) + }.Init(p.SCtx(), p.StatsInfo().ScaleByExpectCnt(prop.ExpectedCnt), p.QueryBlockOffset(), chReqProps...) if path != nil { join.IdxColLens = path.IdxColLens } @@ -603,7 +604,7 @@ func (p *LogicalJoin) constructIndexMergeJoin( compareFilters *ColWithCmpFuncManager, ) []PhysicalPlan { hintExists := false - if (outerIdx == 1 && (p.preferJoinType&preferLeftAsINLMJInner) > 0) || (outerIdx == 0 && (p.preferJoinType&preferRightAsINLMJInner) > 0) { + if (outerIdx == 1 && (p.preferJoinType&h.PreferLeftAsINLMJInner) > 0) || (outerIdx == 0 && (p.preferJoinType&h.PreferRightAsINLMJInner) > 0) { hintExists = true } indexJoins := p.constructIndexJoin(prop, outerIdx, innerTask, ranges, keyOff2IdxOff, path, compareFilters, !hintExists) @@ -781,7 +782,7 @@ func (p *LogicalJoin) extractIndexJoinInnerChildPattern(innerChild LogicalPlan) wrapper.ds = ds // If one of the union scan children is a TiFlash table, then we can't choose index join. for _, child := range wrapper.us.Children() { - if ds, ok := child.(*DataSource); ok && ds.preferStoreType&preferTiFlash != 0 { + if ds, ok := child.(*DataSource); ok && ds.preferStoreType&h.PreferTiFlash != 0 { return nil } } @@ -812,7 +813,7 @@ func (p *LogicalJoin) extractIndexJoinInnerChildPattern(innerChild LogicalPlan) } wrapper.ds = ds } - if wrapper.ds == nil || wrapper.ds.preferStoreType&preferTiFlash != 0 { + if wrapper.ds == nil || wrapper.ds.preferStoreType&h.PreferTiFlash != 0 { return nil } return wrapper @@ -958,7 +959,21 @@ func (p *LogicalJoin) buildIndexJoinInner2IndexScan( outerIdx int, avgInnerRowCnt float64) (joins []PhysicalPlan) { ds := wrapper.ds us := wrapper.us - helper, keyOff2IdxOff := p.getIndexJoinBuildHelper(ds, innerJoinKeys, func(path *util.AccessPath) bool { return !path.IsTablePath() }, outerJoinKeys) + indexValid := func(path *util.AccessPath) bool { + if path.IsTablePath() { + return false + } + // if path is index path. index path currently include two kind of, one is normal, and the other is mv index. + // for mv index like mvi(a, json, b), if driving condition is a=1, and we build a prefix scan with range [1,1] + // on mvi, it will return many index rows which breaks handle-unique attribute here. + // + // the basic rule is that: mv index can be and can only be accessed by indexMerge operator. (embedded handle duplication) + if !isMVIndexPath(path) { + return true // not a MVIndex path, it can successfully be index join probe side. + } + return false + } + helper, keyOff2IdxOff := p.getIndexJoinBuildHelper(ds, innerJoinKeys, indexValid, outerJoinKeys) if helper == nil { return nil } @@ -1073,7 +1088,7 @@ func (p *LogicalJoin) constructInnerTableScanTask( isPartition: ds.isPartition, tblCols: ds.TblCols, tblColHists: ds.TblColHists, - }.Init(ds.SCtx(), ds.SelectBlockOffset()) + }.Init(ds.SCtx(), ds.QueryBlockOffset()) ts.SetSchema(ds.schema.Clone()) if rowCount <= 0 { rowCount = float64(1) @@ -1107,13 +1122,13 @@ func (p *LogicalJoin) constructInnerTableScanTask( tblColHists: ds.TblColHists, keepOrder: ts.KeepOrder, } - copTask.partitionInfo = PartitionInfo{ + copTask.physPlanPartInfo = PhysPlanPartInfo{ PruningConds: ds.allConds, PartitionNames: ds.partitionNames, Columns: ds.TblCols, ColumnNames: ds.names, } - ts.PartitionInfo = copTask.partitionInfo + ts.PlanPartInfo = copTask.physPlanPartInfo selStats := ts.StatsInfo().Scale(selectivity) ts.addPushedDownSelection(copTask, selStats) t := copTask.convertToRootTask(ds.SCtx()) @@ -1145,7 +1160,7 @@ func (*LogicalJoin) constructInnerSel(sel *LogicalSelection, child PhysicalPlan) } physicalSel := PhysicalSelection{ Conditions: sel.Conditions, - }.Init(sel.SCtx(), sel.StatsInfo(), sel.SelectBlockOffset(), nil) + }.Init(sel.SCtx(), sel.StatsInfo(), sel.QueryBlockOffset(), nil) physicalSel.SetChildren(child) return physicalSel } @@ -1158,7 +1173,7 @@ func (*LogicalJoin) constructInnerProj(proj *LogicalProjection, child PhysicalPl Exprs: proj.Exprs, CalculateNoDelay: proj.CalculateNoDelay, AvoidColumnEvaluator: proj.AvoidColumnEvaluator, - }.Init(proj.SCtx(), proj.StatsInfo(), proj.SelectBlockOffset(), nil) + }.Init(proj.SCtx(), proj.StatsInfo(), proj.QueryBlockOffset(), nil) physicalProj.SetChildren(child) return physicalProj } @@ -1172,7 +1187,7 @@ func (*LogicalJoin) constructInnerUnionScan(us *LogicalUnionScan, reader Physica physicalUnionScan := PhysicalUnionScan{ Conditions: us.conditions, HandleCols: us.handleCols, - }.Init(us.SCtx(), reader.StatsInfo(), us.SelectBlockOffset(), nil) + }.Init(us.SCtx(), reader.StatsInfo(), us.QueryBlockOffset(), nil) physicalUnionScan.SetChildren(reader) return physicalUnionScan } @@ -1264,14 +1279,14 @@ func (p *LogicalJoin) constructInnerIndexScanTask( physicalTableID: ds.physicalTableID, tblColHists: ds.TblColHists, pkIsHandleCol: ds.getPKIsHandleCol(), - }.Init(ds.SCtx(), ds.SelectBlockOffset()) + }.Init(ds.SCtx(), ds.QueryBlockOffset()) cop := &copTask{ indexPlan: is, tblColHists: ds.TblColHists, tblCols: ds.TblCols, keepOrder: is.KeepOrder, } - cop.partitionInfo = PartitionInfo{ + cop.physPlanPartInfo = PhysPlanPartInfo{ PruningConds: ds.allConds, PartitionNames: ds.partitionNames, Columns: ds.TblCols, @@ -1288,7 +1303,7 @@ func (p *LogicalJoin) constructInnerIndexScanTask( physicalTableID: ds.physicalTableID, tblCols: ds.TblCols, tblColHists: ds.TblColHists, - }.Init(ds.SCtx(), ds.SelectBlockOffset()) + }.Init(ds.SCtx(), ds.QueryBlockOffset()) ts.schema = is.dataSourceSchema.Clone() if ds.tableInfo.IsCommonHandle { commonHandle := ds.handleCols.(*CommonHandleCols) @@ -2038,14 +2053,14 @@ func (p *LogicalJoin) tryToGetIndexJoin(prop *property.PhysicalProperty) (indexJ // The priority is: force hints like TIDB_INLJ > filter hints like NO_INDEX_JOIN > variables. // Handle hints conflict first. stmtCtx := p.SCtx().GetSessionVars().StmtCtx - if p.preferAny(preferLeftAsINLJInner, preferRightAsINLJInner) && p.preferAny(preferNoIndexJoin) { - stmtCtx.AppendWarning(ErrInternal.GenWithStack("Some INL_JOIN and NO_INDEX_JOIN hints conflict, NO_INDEX_JOIN may be ignored")) + if p.preferAny(h.PreferLeftAsINLJInner, h.PreferRightAsINLJInner) && p.preferAny(h.PreferNoIndexJoin) { + stmtCtx.AppendWarning(ErrInternal.FastGen("Some INL_JOIN and NO_INDEX_JOIN hints conflict, NO_INDEX_JOIN may be ignored")) } - if p.preferAny(preferLeftAsINLHJInner, preferRightAsINLHJInner) && p.preferAny(preferNoIndexHashJoin) { - stmtCtx.AppendWarning(ErrInternal.GenWithStack("Some INL_HASH_JOIN and NO_INDEX_HASH_JOIN hints conflict, NO_INDEX_HASH_JOIN may be ignored")) + if p.preferAny(h.PreferLeftAsINLHJInner, h.PreferRightAsINLHJInner) && p.preferAny(h.PreferNoIndexHashJoin) { + stmtCtx.AppendWarning(ErrInternal.FastGen("Some INL_HASH_JOIN and NO_INDEX_HASH_JOIN hints conflict, NO_INDEX_HASH_JOIN may be ignored")) } - if p.preferAny(preferLeftAsINLMJInner, preferRightAsINLMJInner) && p.preferAny(preferNoIndexMergeJoin) { - stmtCtx.AppendWarning(ErrInternal.GenWithStack("Some INL_MERGE_JOIN and NO_INDEX_MERGE_JOIN hints conflict, NO_INDEX_MERGE_JOIN may be ignored")) + if p.preferAny(h.PreferLeftAsINLMJInner, h.PreferRightAsINLMJInner) && p.preferAny(h.PreferNoIndexMergeJoin) { + stmtCtx.AppendWarning(ErrInternal.FastGen("Some INL_MERGE_JOIN and NO_INDEX_MERGE_JOIN hints conflict, NO_INDEX_MERGE_JOIN may be ignored")) } candidates, canForced = p.handleForceIndexJoinHints(prop, candidates) @@ -2057,7 +2072,7 @@ func (p *LogicalJoin) tryToGetIndexJoin(prop *property.PhysicalProperty) (indexJ } func (p *LogicalJoin) handleFilterIndexJoinHints(candidates []PhysicalPlan) []PhysicalPlan { - if !p.preferAny(preferNoIndexJoin, preferNoIndexHashJoin, preferNoIndexMergeJoin) { + if !p.preferAny(h.PreferNoIndexJoin, h.PreferNoIndexHashJoin, h.PreferNoIndexMergeJoin) { return candidates // no filter index join hints } filtered := make([]PhysicalPlan, 0, len(candidates)) @@ -2066,9 +2081,9 @@ func (p *LogicalJoin) handleFilterIndexJoinHints(candidates []PhysicalPlan) []Ph if !ok { continue } - if (p.preferAny(preferNoIndexJoin) && joinMethod == indexJoinMethod) || - (p.preferAny(preferNoIndexHashJoin) && joinMethod == indexHashJoinMethod) || - (p.preferAny(preferNoIndexMergeJoin) && joinMethod == indexMergeJoinMethod) { + if (p.preferAny(h.PreferNoIndexJoin) && joinMethod == indexJoinMethod) || + (p.preferAny(h.PreferNoIndexHashJoin) && joinMethod == indexHashJoinMethod) || + (p.preferAny(h.PreferNoIndexMergeJoin) && joinMethod == indexMergeJoinMethod) { continue } filtered = append(filtered, candidate) @@ -2078,8 +2093,8 @@ func (p *LogicalJoin) handleFilterIndexJoinHints(candidates []PhysicalPlan) []Ph // handleForceIndexJoinHints handles the force index join hints and returns all plans that can satisfy the hints. func (p *LogicalJoin) handleForceIndexJoinHints(prop *property.PhysicalProperty, candidates []PhysicalPlan) (indexJoins []PhysicalPlan, canForced bool) { - if !p.preferAny(preferRightAsINLJInner, preferRightAsINLHJInner, preferRightAsINLMJInner, - preferLeftAsINLJInner, preferLeftAsINLHJInner, preferLeftAsINLMJInner) { + if !p.preferAny(h.PreferRightAsINLJInner, h.PreferRightAsINLHJInner, h.PreferRightAsINLMJInner, + h.PreferLeftAsINLJInner, h.PreferLeftAsINLHJInner, h.PreferLeftAsINLMJInner) { return candidates, false // no force index join hints } forced := make([]PhysicalPlan, 0, len(candidates)) @@ -2088,12 +2103,12 @@ func (p *LogicalJoin) handleForceIndexJoinHints(prop *property.PhysicalProperty, if !ok { continue } - if (p.preferAny(preferLeftAsINLJInner) && innerSide == joinLeft && joinMethod == indexJoinMethod) || - (p.preferAny(preferRightAsINLJInner) && innerSide == joinRight && joinMethod == indexJoinMethod) || - (p.preferAny(preferLeftAsINLHJInner) && innerSide == joinLeft && joinMethod == indexHashJoinMethod) || - (p.preferAny(preferRightAsINLHJInner) && innerSide == joinRight && joinMethod == indexHashJoinMethod) || - (p.preferAny(preferLeftAsINLMJInner) && innerSide == joinLeft && joinMethod == indexMergeJoinMethod) || - (p.preferAny(preferRightAsINLMJInner) && innerSide == joinRight && joinMethod == indexMergeJoinMethod) { + if (p.preferAny(h.PreferLeftAsINLJInner) && innerSide == joinLeft && joinMethod == indexJoinMethod) || + (p.preferAny(h.PreferRightAsINLJInner) && innerSide == joinRight && joinMethod == indexJoinMethod) || + (p.preferAny(h.PreferLeftAsINLHJInner) && innerSide == joinLeft && joinMethod == indexHashJoinMethod) || + (p.preferAny(h.PreferRightAsINLHJInner) && innerSide == joinRight && joinMethod == indexHashJoinMethod) || + (p.preferAny(h.PreferLeftAsINLMJInner) && innerSide == joinLeft && joinMethod == indexMergeJoinMethod) || + (p.preferAny(h.PreferRightAsINLMJInner) && innerSide == joinRight && joinMethod == indexMergeJoinMethod) { forced = append(forced, candidate) } } @@ -2106,26 +2121,26 @@ func (p *LogicalJoin) handleForceIndexJoinHints(prop *property.PhysicalProperty, // If the required property is not empty, we will enforce it and try the hint again. // So we only need to generate warning message when the property is empty. if prop.IsSortItemEmpty() { - var indexJoinTables, indexHashJoinTables, indexMergeJoinTables []hintTableInfo + var indexJoinTables, indexHashJoinTables, indexMergeJoinTables []h.TableInfo if p.hintInfo != nil { - t := p.hintInfo.indexNestedLoopJoinTables - indexJoinTables, indexHashJoinTables, indexMergeJoinTables = t.inljTables, t.inlhjTables, t.inlmjTables + t := p.hintInfo.IndexNestedLoopJoinTables + indexJoinTables, indexHashJoinTables, indexMergeJoinTables = t.INLJTables, t.INLHJTables, t.INLMJTables } var errMsg string switch { - case p.preferAny(preferLeftAsINLJInner, preferRightAsINLJInner): // prefer index join - errMsg = fmt.Sprintf("Optimizer Hint %s or %s is inapplicable", restore2JoinHint(HintINLJ, indexJoinTables), restore2JoinHint(TiDBIndexNestedLoopJoin, indexJoinTables)) - case p.preferAny(preferLeftAsINLHJInner, preferRightAsINLHJInner): // prefer index hash join - errMsg = fmt.Sprintf("Optimizer Hint %s is inapplicable", restore2JoinHint(HintINLHJ, indexHashJoinTables)) - case p.preferAny(preferLeftAsINLMJInner, preferRightAsINLMJInner): // prefer index merge join - errMsg = fmt.Sprintf("Optimizer Hint %s is inapplicable", restore2JoinHint(HintINLMJ, indexMergeJoinTables)) + case p.preferAny(h.PreferLeftAsINLJInner, h.PreferRightAsINLJInner): // prefer index join + errMsg = fmt.Sprintf("Optimizer Hint %s or %s is inapplicable", h.Restore2JoinHint(h.HintINLJ, indexJoinTables), h.Restore2JoinHint(h.TiDBIndexNestedLoopJoin, indexJoinTables)) + case p.preferAny(h.PreferLeftAsINLHJInner, h.PreferRightAsINLHJInner): // prefer index hash join + errMsg = fmt.Sprintf("Optimizer Hint %s is inapplicable", h.Restore2JoinHint(h.HintINLHJ, indexHashJoinTables)) + case p.preferAny(h.PreferLeftAsINLMJInner, h.PreferRightAsINLMJInner): // prefer index merge join + errMsg = fmt.Sprintf("Optimizer Hint %s is inapplicable", h.Restore2JoinHint(h.HintINLMJ, indexMergeJoinTables)) } // Append inapplicable reason. if len(p.EqualConditions) == 0 { errMsg += " without column equal ON condition" } // Generate warning message to client. - p.SCtx().GetSessionVars().StmtCtx.AppendWarning(ErrInternal.GenWithStack(errMsg)) + p.SCtx().GetSessionVars().StmtCtx.AppendWarning(ErrInternal.FastGen(errMsg)) } return candidates, false } @@ -2269,7 +2284,7 @@ func (p *LogicalJoin) exhaustPhysicalPlans(prop *property.PhysicalProperty) ([]P if !isJoinHintSupportedInMPPMode(p.preferJoinType) { if hasMPPJoinHints(p.preferJoinType) { // If there are MPP hints but has some conflicts join method hints, all the join hints are invalid. - p.SCtx().GetSessionVars().StmtCtx.AppendWarning(ErrInternal.GenWithStack("The MPP join hints are in conflict, and you can only specify join method hints that are currently supported by MPP mode now")) + p.SCtx().GetSessionVars().StmtCtx.AppendWarning(ErrInternal.FastGen("The MPP join hints are in conflict, and you can only specify join method hints that are currently supported by MPP mode now")) p.preferJoinType = 0 } else { // If there are no MPP hints but has some conflicts join method hints, the MPP mode will be blocked. @@ -2285,12 +2300,12 @@ func (p *LogicalJoin) exhaustPhysicalPlans(prop *property.PhysicalProperty) ([]P joins := make([]PhysicalPlan, 0, 8) canPushToTiFlash := p.canPushToCop(kv.TiFlash) if p.SCtx().GetSessionVars().IsMPPAllowed() && canPushToTiFlash { - if (p.preferJoinType & preferShuffleJoin) > 0 { + if (p.preferJoinType & h.PreferShuffleJoin) > 0 { if shuffleJoins := p.tryToGetMppHashJoin(prop, false); len(shuffleJoins) > 0 { return shuffleJoins, true, nil } } - if (p.preferJoinType & preferBCJoin) > 0 { + if (p.preferJoinType & h.PreferBCJoin) > 0 { if bcastJoins := p.tryToGetMppHashJoin(prop, true); len(bcastJoins) > 0 { return bcastJoins, true, nil } @@ -2305,17 +2320,16 @@ func (p *LogicalJoin) exhaustPhysicalPlans(prop *property.PhysicalProperty) ([]P } else { hasMppHints := false var errMsg string - if (p.preferJoinType & preferShuffleJoin) > 0 { + if (p.preferJoinType & h.PreferShuffleJoin) > 0 { errMsg = "The join can not push down to the MPP side, the shuffle_join() hint is invalid" hasMppHints = true } - if (p.preferJoinType & preferBCJoin) > 0 { + if (p.preferJoinType & h.PreferBCJoin) > 0 { errMsg = "The join can not push down to the MPP side, the broadcast_join() hint is invalid" hasMppHints = true } if hasMppHints { - warning := ErrInternal.GenWithStack(errMsg) - p.SCtx().GetSessionVars().StmtCtx.AppendWarning(warning) + p.SCtx().GetSessionVars().StmtCtx.AppendWarning(ErrInternal.FastGen(errMsg)) } } if prop.IsFlashProp() { @@ -2325,7 +2339,7 @@ func (p *LogicalJoin) exhaustPhysicalPlans(prop *property.PhysicalProperty) ([]P if !p.isNAAJ() { // naaj refuse merge join and index join. mergeJoins := p.GetMergeJoin(prop, p.schema, p.StatsInfo(), p.children[0].StatsInfo(), p.children[1].StatsInfo()) - if (p.preferJoinType&preferMergeJoin) > 0 && len(mergeJoins) > 0 { + if (p.preferJoinType&h.PreferMergeJoin) > 0 && len(mergeJoins) > 0 { return mergeJoins, true, nil } joins = append(joins, mergeJoins...) @@ -2360,16 +2374,17 @@ func canExprsInJoinPushdown(p *LogicalJoin, storeType kv.StoreType) bool { } equalExprs = append(equalExprs, eqCondition) } - if !expression.CanExprsPushDown(p.SCtx().GetSessionVars().StmtCtx, equalExprs, p.SCtx().GetClient(), storeType) { + ctx := p.SCtx() + if !expression.CanExprsPushDown(ctx, equalExprs, p.SCtx().GetClient(), storeType) { return false } - if !expression.CanExprsPushDown(p.SCtx().GetSessionVars().StmtCtx, p.LeftConditions, p.SCtx().GetClient(), storeType) { + if !expression.CanExprsPushDown(ctx, p.LeftConditions, p.SCtx().GetClient(), storeType) { return false } - if !expression.CanExprsPushDown(p.SCtx().GetSessionVars().StmtCtx, p.RightConditions, p.SCtx().GetClient(), storeType) { + if !expression.CanExprsPushDown(ctx, p.RightConditions, p.SCtx().GetClient(), storeType) { return false } - if !expression.CanExprsPushDown(p.SCtx().GetSessionVars().StmtCtx, p.OtherConditions, p.SCtx().GetClient(), storeType) { + if !expression.CanExprsPushDown(ctx, p.OtherConditions, p.SCtx().GetClient(), storeType) { return false } return true @@ -2433,10 +2448,10 @@ func (p *LogicalJoin) tryToGetMppHashJoin(prop *property.PhysicalProperty, useBC RightNAJoinKeys: rNAKeys, } // It indicates which side is the build side. - forceLeftToBuild := ((p.preferJoinType & preferLeftAsHJBuild) > 0) || ((p.preferJoinType & preferRightAsHJProbe) > 0) - forceRightToBuild := ((p.preferJoinType & preferRightAsHJBuild) > 0) || ((p.preferJoinType & preferLeftAsHJProbe) > 0) + forceLeftToBuild := ((p.preferJoinType & h.PreferLeftAsHJBuild) > 0) || ((p.preferJoinType & h.PreferRightAsHJProbe) > 0) + forceRightToBuild := ((p.preferJoinType & h.PreferRightAsHJBuild) > 0) || ((p.preferJoinType & h.PreferLeftAsHJProbe) > 0) if forceLeftToBuild && forceRightToBuild { - p.SCtx().GetSessionVars().StmtCtx.AppendWarning(ErrInternal.GenWithStack("Some HASH_JOIN_BUILD and HASH_JOIN_PROBE hints are conflicts, please check the hints")) + p.SCtx().GetSessionVars().StmtCtx.AppendWarning(ErrInternal.FastGen("Some HASH_JOIN_BUILD and HASH_JOIN_PROBE hints are conflicts, please check the hints")) forceLeftToBuild = false forceRightToBuild = false } @@ -2484,7 +2499,7 @@ func (p *LogicalJoin) tryToGetMppHashJoin(prop *property.PhysicalProperty, useBC if !match { if fixedBuildSide { // A warning will be generated if the build side is fixed, but we attempt to change it using the hint. - p.SCtx().GetSessionVars().StmtCtx.AppendWarning(ErrInternal.GenWithStack("Some HASH_JOIN_BUILD and HASH_JOIN_PROBE hints cannot be utilized for MPP joins, please check the hints")) + p.SCtx().GetSessionVars().StmtCtx.AppendWarning(ErrInternal.FastGen("Some HASH_JOIN_BUILD and HASH_JOIN_PROBE hints cannot be utilized for MPP joins, please check the hints")) } else { // The HASH_JOIN_BUILD OR HASH_JOIN_PROBE hints can take effective. preferredBuildIndex = 1 - preferredBuildIndex @@ -2560,7 +2575,7 @@ func (p *LogicalJoin) tryToGetMppHashJoin(prop *property.PhysicalProperty, useBC storeTp: kv.TiFlash, mppShuffleJoin: !useBCJ, // Mpp Join has quite heavy cost. Even limit might not suspend it in time, so we don't scale the count. - }.Init(p.SCtx(), p.StatsInfo(), p.SelectBlockOffset(), childrenProps...) + }.Init(p.SCtx(), p.StatsInfo(), p.QueryBlockOffset(), childrenProps...) join.SetSchema(p.schema) return []PhysicalPlan{join} } @@ -2617,7 +2632,7 @@ func (p *LogicalExpand) exhaustPhysicalPlans(prop *property.PhysicalProperty) ([ GroupingSets: p.rollupGroupingSets, LevelExprs: p.LevelExprs, ExtraGroupingColNames: p.ExtraGroupingColNames, - }.Init(p.SCtx(), p.StatsInfo().ScaleByExpectCnt(prop.ExpectedCnt), p.SelectBlockOffset(), mppProp) + }.Init(p.SCtx(), p.StatsInfo().ScaleByExpectCnt(prop.ExpectedCnt), p.QueryBlockOffset(), mppProp) expand.SetSchema(p.Schema()) return []PhysicalPlan{expand}, true, nil } @@ -2632,14 +2647,15 @@ func (p *LogicalProjection) exhaustPhysicalPlans(prop *property.PhysicalProperty } newProps := []*property.PhysicalProperty{newProp} // generate a mpp task candidate if mpp mode is allowed - if newProp.TaskTp != property.MppTaskType && p.SCtx().GetSessionVars().IsMPPAllowed() && p.canPushToCop(kv.TiFlash) && - expression.CanExprsPushDown(p.SCtx().GetSessionVars().StmtCtx, p.Exprs, p.SCtx().GetClient(), kv.TiFlash) { + ctx := p.SCtx() + if newProp.TaskTp != property.MppTaskType && ctx.GetSessionVars().IsMPPAllowed() && p.canPushToCop(kv.TiFlash) && + expression.CanExprsPushDown(ctx, p.Exprs, ctx.GetClient(), kv.TiFlash) { mppProp := newProp.CloneEssentialFields() mppProp.TaskTp = property.MppTaskType newProps = append(newProps, mppProp) } - if newProp.TaskTp != property.CopSingleReadTaskType && p.SCtx().GetSessionVars().AllowProjectionPushDown && p.canPushToCop(kv.TiKV) && - expression.CanExprsPushDown(p.SCtx().GetSessionVars().StmtCtx, p.Exprs, p.SCtx().GetClient(), kv.TiKV) && !expression.ContainVirtualColumn(p.Exprs) { + if newProp.TaskTp != property.CopSingleReadTaskType && ctx.GetSessionVars().AllowProjectionPushDown && p.canPushToCop(kv.TiKV) && + expression.CanExprsPushDown(ctx, p.Exprs, ctx.GetClient(), kv.TiKV) && !expression.ContainVirtualColumn(p.Exprs) { copProp := newProp.CloneEssentialFields() copProp.TaskTp = property.CopSingleReadTaskType newProps = append(newProps, copProp) @@ -2651,7 +2667,7 @@ func (p *LogicalProjection) exhaustPhysicalPlans(prop *property.PhysicalProperty Exprs: p.Exprs, CalculateNoDelay: p.CalculateNoDelay, AvoidColumnEvaluator: p.AvoidColumnEvaluator, - }.Init(p.SCtx(), p.StatsInfo().ScaleByExpectCnt(prop.ExpectedCnt), p.SelectBlockOffset(), newProp) + }.Init(p.SCtx(), p.StatsInfo().ScaleByExpectCnt(prop.ExpectedCnt), p.QueryBlockOffset(), newProp) proj.SetSchema(p.schema) ret = append(ret, proj) } @@ -2663,10 +2679,10 @@ func pushLimitOrTopNForcibly(p LogicalPlan) bool { var preferPushDown *bool switch lp := p.(type) { case *LogicalTopN: - preferPushDown = &lp.limitHints.preferLimitToCop + preferPushDown = &lp.limitHints.PreferLimitToCop meetThreshold = lp.Count+lp.Offset <= uint64(lp.SCtx().GetSessionVars().LimitPushDownThreshold) case *LogicalLimit: - preferPushDown = &lp.limitHints.preferLimitToCop + preferPushDown = &lp.limitHints.PreferLimitToCop meetThreshold = true // always push Limit down in this case since it has no side effect default: return false @@ -2678,8 +2694,7 @@ func pushLimitOrTopNForcibly(p LogicalPlan) bool { } if *preferPushDown { errMsg := "Optimizer Hint LIMIT_TO_COP is inapplicable" - warning := ErrInternal.GenWithStack(errMsg) - p.SCtx().GetSessionVars().StmtCtx.AppendWarning(warning) + p.SCtx().GetSessionVars().StmtCtx.AppendWarning(ErrInternal.FastGen(errMsg)) *preferPushDown = false } } @@ -2703,7 +2718,7 @@ func (lt *LogicalTopN) getPhysTopN(prop *property.PhysicalProperty) []PhysicalPl PartitionBy: lt.PartitionBy, Count: lt.Count, Offset: lt.Offset, - }.Init(lt.SCtx(), lt.StatsInfo(), lt.SelectBlockOffset(), resultProp) + }.Init(lt.SCtx(), lt.StatsInfo(), lt.QueryBlockOffset(), resultProp) ret = append(ret, topN) } return ret @@ -2726,7 +2741,7 @@ func (lt *LogicalTopN) getPhysLimits(prop *property.PhysicalProperty) []Physical Count: lt.Count, Offset: lt.Offset, PartitionBy: lt.GetPartitionBy(), - }.Init(lt.SCtx(), lt.StatsInfo(), lt.SelectBlockOffset(), resultProp) + }.Init(lt.SCtx(), lt.StatsInfo(), lt.QueryBlockOffset(), resultProp) limit.SetSchema(lt.Schema()) ret = append(ret, limit) } @@ -2766,7 +2781,7 @@ func (la *LogicalApply) exhaustPhysicalPlans(prop *property.PhysicalProperty) ([ return nil, true, nil } if !prop.IsSortItemEmpty() && la.SCtx().GetSessionVars().EnableParallelApply { - la.SCtx().GetSessionVars().StmtCtx.AppendWarning(errors.Errorf("Parallel Apply rejects the possible order properties of its outer child currently")) + la.SCtx().GetSessionVars().StmtCtx.AppendWarning(errors.NewNoStackErrorf("Parallel Apply rejects the possible order properties of its outer child currently")) return nil, true, nil } disableAggPushDownToCop(la.children[0]) @@ -2796,7 +2811,7 @@ func (la *LogicalApply) exhaustPhysicalPlans(prop *property.PhysicalProperty) ([ CanUseCache: canUseCache, }.Init(la.SCtx(), la.StatsInfo().ScaleByExpectCnt(prop.ExpectedCnt), - la.SelectBlockOffset(), + la.QueryBlockOffset(), &property.PhysicalProperty{ExpectedCnt: math.MaxFloat64, SortItems: prop.SortItems, CTEProducerStatus: prop.CTEProducerStatus}, &property.PhysicalProperty{ExpectedCnt: math.MaxFloat64, CTEProducerStatus: prop.CTEProducerStatus}) apply.SetSchema(la.schema) @@ -2868,12 +2883,13 @@ func (lw *LogicalWindow) tryToGetMppWindows(prop *property.PhysicalProperty) []P } if lw.Frame != nil && lw.Frame.Type == ast.Ranges { - if _, err := expression.ExpressionsToPBList(lw.SCtx().GetSessionVars().StmtCtx, lw.Frame.Start.CalcFuncs, lw.SCtx().GetClient()); err != nil { + ctx := lw.SCtx() + if _, err := expression.ExpressionsToPBList(ctx, lw.Frame.Start.CalcFuncs, lw.SCtx().GetClient()); err != nil { lw.SCtx().GetSessionVars().RaiseWarningWhenMPPEnforced( "MPP mode may be blocked because window function frame can't be pushed down, because " + err.Error()) return nil } - if _, err := expression.ExpressionsToPBList(lw.SCtx().GetSessionVars().StmtCtx, lw.Frame.End.CalcFuncs, lw.SCtx().GetClient()); err != nil { + if _, err := expression.ExpressionsToPBList(ctx, lw.Frame.End.CalcFuncs, lw.SCtx().GetClient()); err != nil { lw.SCtx().GetSessionVars().RaiseWarningWhenMPPEnforced( "MPP mode may be blocked because window function frame can't be pushed down, because " + err.Error()) return nil @@ -2929,7 +2945,7 @@ func (lw *LogicalWindow) tryToGetMppWindows(prop *property.PhysicalProperty) []P OrderBy: lw.OrderBy, Frame: lw.Frame, storeTp: kv.TiFlash, - }.Init(lw.SCtx(), lw.StatsInfo().ScaleByExpectCnt(prop.ExpectedCnt), lw.SelectBlockOffset(), childProperty) + }.Init(lw.SCtx(), lw.StatsInfo().ScaleByExpectCnt(prop.ExpectedCnt), lw.QueryBlockOffset(), childProperty) window.SetSchema(lw.Schema()) return []PhysicalPlan{window} @@ -2960,7 +2976,7 @@ func (lw *LogicalWindow) exhaustPhysicalPlans(prop *property.PhysicalProperty) ( PartitionBy: lw.PartitionBy, OrderBy: lw.OrderBy, Frame: lw.Frame, - }.Init(lw.SCtx(), lw.StatsInfo().ScaleByExpectCnt(prop.ExpectedCnt), lw.SelectBlockOffset(), childProperty) + }.Init(lw.SCtx(), lw.StatsInfo().ScaleByExpectCnt(prop.ExpectedCnt), lw.QueryBlockOffset(), childProperty) window.SetSchema(lw.Schema()) windows = append(windows, window) @@ -3084,7 +3100,7 @@ func (la *LogicalAggregation) getEnforcedStreamAggs(prop *property.PhysicalPrope if !la.canPushToCop(kv.TiKV) || !la.SCtx().GetSessionVars().AllowDistinctAggPushDown { taskTypes = []property.TaskType{property.RootTaskType} } - } else if !la.aggHints.preferAggToCop { + } else if !la.aggHints.PreferAggToCop { taskTypes = append(taskTypes, property.RootTaskType) } for _, taskTp := range taskTypes { @@ -3100,7 +3116,7 @@ func (la *LogicalAggregation) getEnforcedStreamAggs(prop *property.PhysicalPrope agg := basePhysicalAgg{ GroupByItems: newGbyItems, AggFuncs: newAggFuncs, - }.initForStream(la.SCtx(), la.StatsInfo().ScaleByExpectCnt(prop.ExpectedCnt), la.SelectBlockOffset(), copiedChildProperty) + }.initForStream(la.SCtx(), la.StatsInfo().ScaleByExpectCnt(prop.ExpectedCnt), la.QueryBlockOffset(), copiedChildProperty) agg.SetSchema(la.schema.Clone()) enforcedAggs = append(enforcedAggs, agg) } @@ -3165,7 +3181,7 @@ func (la *LogicalAggregation) getStreamAggs(prop *property.PhysicalProperty) []P } else if !la.distinctArgsMeetsProperty() { continue } - } else if !la.aggHints.preferAggToCop { + } else if !la.aggHints.PreferAggToCop { taskTypes = append(taskTypes, property.RootTaskType) } if !la.canPushToCop(kv.TiKV) && !la.canPushToCop(kv.TiFlash) { @@ -3184,14 +3200,14 @@ func (la *LogicalAggregation) getStreamAggs(prop *property.PhysicalProperty) []P agg := basePhysicalAgg{ GroupByItems: newGbyItems, AggFuncs: newAggFuncs, - }.initForStream(la.SCtx(), la.StatsInfo().ScaleByExpectCnt(prop.ExpectedCnt), la.SelectBlockOffset(), copiedChildProperty) + }.initForStream(la.SCtx(), la.StatsInfo().ScaleByExpectCnt(prop.ExpectedCnt), la.QueryBlockOffset(), copiedChildProperty) agg.SetSchema(la.schema.Clone()) streamAggs = append(streamAggs, agg) } } // If STREAM_AGG hint is existed, it should consider enforce stream aggregation, // because we can't trust possibleChildProperty completely. - if (la.aggHints.preferAggType & preferStreamAgg) > 0 { + if (la.aggHints.PreferAggType & h.PreferStreamAgg) > 0 { streamAggs = append(streamAggs, la.getEnforcedStreamAggs(prop)...) } return streamAggs @@ -3213,7 +3229,7 @@ func (la *LogicalAggregation) checkCanPushDownToMPP() bool { } } if hasUnsupportedDistinct { - warnErr := errors.New("Aggregation can not be pushed to storage layer in mpp mode because it contains agg function with distinct") + warnErr := errors.NewNoStackError("Aggregation can not be pushed to storage layer in mpp mode because it contains agg function with distinct") if la.SCtx().GetSessionVars().StmtCtx.InExplainStmt { la.SCtx().GetSessionVars().StmtCtx.AppendWarning(warnErr) } else { @@ -3244,7 +3260,9 @@ func (la *LogicalAggregation) tryToGetMppHashAggs(prop *property.PhysicalPropert finalAggAdjust := func(aggFuncs []*aggregation.AggFuncDesc) { for i, agg := range aggFuncs { if agg.Mode == aggregation.FinalMode && agg.Name == ast.AggFuncCount { + oldFT := agg.RetTp aggFuncs[i], _ = aggregation.NewAggFuncDesc(la.SCtx(), ast.AggFuncSum, agg.Args, false) + aggFuncs[i].TypeInfer4FinalCount(oldFT) } } } @@ -3323,9 +3341,9 @@ func (la *LogicalAggregation) tryToGetMppHashAggs(prop *property.PhysicalPropert // handle MPP Agg hints var preferMode AggMppRunMode var prefer bool - if la.aggHints.preferAggType&preferMPP1PhaseAgg > 0 { + if la.aggHints.PreferAggType&h.PreferMPP1PhaseAgg > 0 { preferMode, prefer = Mpp1Phase, true - } else if la.aggHints.preferAggType&preferMPP2PhaseAgg > 0 { + } else if la.aggHints.PreferAggType&h.PreferMPP2PhaseAgg > 0 { preferMode, prefer = Mpp2Phase, true } if prefer { @@ -3367,7 +3385,7 @@ func (la *LogicalAggregation) getHashAggs(prop *property.PhysicalProperty) []Phy // if variable does allow DistinctAggPushDown, but OP itself can't be pushed down to tikv, just produce root task type. taskTypes = []property.TaskType{property.RootTaskType} } - } else if !la.aggHints.preferAggToCop { + } else if !la.aggHints.PreferAggToCop { taskTypes = append(taskTypes, property.RootTaskType) } if !la.canPushToCop(kv.TiKV) && !canPushDownToTiFlash { @@ -3378,17 +3396,16 @@ func (la *LogicalAggregation) getHashAggs(prop *property.PhysicalProperty) []Phy } else { hasMppHints := false var errMsg string - if la.aggHints.preferAggType&preferMPP1PhaseAgg > 0 { + if la.aggHints.PreferAggType&h.PreferMPP1PhaseAgg > 0 { errMsg = "The agg can not push down to the MPP side, the MPP_1PHASE_AGG() hint is invalid" hasMppHints = true } - if la.aggHints.preferAggType&preferMPP2PhaseAgg > 0 { + if la.aggHints.PreferAggType&h.PreferMPP2PhaseAgg > 0 { errMsg = "The agg can not push down to the MPP side, the MPP_2PHASE_AGG() hint is invalid" hasMppHints = true } if hasMppHints { - warning := ErrInternal.GenWithStack(errMsg) - la.SCtx().GetSessionVars().StmtCtx.AppendWarning(warning) + la.SCtx().GetSessionVars().StmtCtx.AppendWarning(ErrInternal.FastGen(errMsg)) } } if prop.IsFlashProp() { @@ -3410,28 +3427,28 @@ func (la *LogicalAggregation) getHashAggs(prop *property.PhysicalProperty) []Phy return hashAggs } -// ResetHintIfConflicted resets the aggHints.preferAggType if they are conflicted, -// and returns the two preferAggType hints. +// ResetHintIfConflicted resets the aggHints.PreferAggType if they are conflicted, +// and returns the two PreferAggType hints. func (la *LogicalAggregation) ResetHintIfConflicted() (preferHash bool, preferStream bool) { - preferHash = (la.aggHints.preferAggType & preferHashAgg) > 0 - preferStream = (la.aggHints.preferAggType & preferStreamAgg) > 0 + preferHash = (la.aggHints.PreferAggType & h.PreferHashAgg) > 0 + preferStream = (la.aggHints.PreferAggType & h.PreferStreamAgg) > 0 if preferHash && preferStream { errMsg := "Optimizer aggregation hints are conflicted" - warning := ErrInternal.GenWithStack(errMsg) + warning := ErrInternal.FastGen(errMsg) la.SCtx().GetSessionVars().StmtCtx.AppendWarning(warning) - la.aggHints.preferAggType = 0 + la.aggHints.PreferAggType = 0 preferHash, preferStream = false, false } return } func (la *LogicalAggregation) exhaustPhysicalPlans(prop *property.PhysicalProperty) ([]PhysicalPlan, bool, error) { - if la.aggHints.preferAggToCop { + if la.aggHints.PreferAggToCop { if !la.canPushToCop(kv.TiKV) { errMsg := "Optimizer Hint AGG_TO_COP is inapplicable" - warning := ErrInternal.GenWithStack(errMsg) + warning := ErrInternal.FastGen(errMsg) la.SCtx().GetSessionVars().StmtCtx.AppendWarning(warning) - la.aggHints.preferAggToCop = false + la.aggHints.PreferAggToCop = false } } @@ -3451,7 +3468,7 @@ func (la *LogicalAggregation) exhaustPhysicalPlans(prop *property.PhysicalProper if streamAggs == nil && preferStream && !prop.IsSortItemEmpty() { errMsg := "Optimizer Hint STREAM_AGG is inapplicable" - warning := ErrInternal.GenWithStack(errMsg) + warning := ErrInternal.FastGen(errMsg) la.SCtx().GetSessionVars().StmtCtx.AppendWarning(warning) } @@ -3475,7 +3492,7 @@ func (p *LogicalSelection) exhaustPhysicalPlans(prop *property.PhysicalProperty) for _, newProp := range newProps { sel := PhysicalSelection{ Conditions: p.Conditions, - }.Init(p.SCtx(), p.StatsInfo().ScaleByExpectCnt(prop.ExpectedCnt), p.SelectBlockOffset(), newProp) + }.Init(p.SCtx(), p.StatsInfo().ScaleByExpectCnt(prop.ExpectedCnt), p.QueryBlockOffset(), newProp) ret = append(ret, sel) } return ret, true, nil @@ -3486,7 +3503,7 @@ func (p *LogicalSelection) canPushDown(storeTp kv.StoreType) bool { return !expression.ContainVirtualColumn(p.Conditions) && p.canPushToCop(storeTp) && expression.CanExprsPushDown( - p.SCtx().GetSessionVars().StmtCtx, + p.SCtx(), p.Conditions, p.SCtx().GetClient(), storeTp) @@ -3511,7 +3528,7 @@ func (p *LogicalLimit) exhaustPhysicalPlans(prop *property.PhysicalProperty) ([] Offset: p.Offset, Count: p.Count, PartitionBy: p.GetPartitionBy(), - }.Init(p.SCtx(), p.StatsInfo(), p.SelectBlockOffset(), resultProp) + }.Init(p.SCtx(), p.StatsInfo(), p.QueryBlockOffset(), resultProp) limit.SetSchema(p.Schema()) ret = append(ret, limit) } @@ -3558,7 +3575,7 @@ func (p *LogicalUnionAll) exhaustPhysicalPlans(prop *property.PhysicalProperty) } ua := PhysicalUnionAll{ mpp: canUseMpp && prop.TaskTp == property.MppTaskType, - }.Init(p.SCtx(), p.StatsInfo().ScaleByExpectCnt(prop.ExpectedCnt), p.SelectBlockOffset(), chReqProps...) + }.Init(p.SCtx(), p.StatsInfo().ScaleByExpectCnt(prop.ExpectedCnt), p.QueryBlockOffset(), chReqProps...) ua.SetSchema(p.Schema()) if canUseMpp && prop.TaskTp == property.RootTaskType { chReqProps = make([]*property.PhysicalProperty, 0, len(p.children)) @@ -3570,7 +3587,7 @@ func (p *LogicalUnionAll) exhaustPhysicalPlans(prop *property.PhysicalProperty) CTEProducerStatus: prop.CTEProducerStatus, }) } - mppUA := PhysicalUnionAll{mpp: true}.Init(p.SCtx(), p.StatsInfo().ScaleByExpectCnt(prop.ExpectedCnt), p.SelectBlockOffset(), chReqProps...) + mppUA := PhysicalUnionAll{mpp: true}.Init(p.SCtx(), p.StatsInfo().ScaleByExpectCnt(prop.ExpectedCnt), p.QueryBlockOffset(), chReqProps...) mppUA.SetSchema(p.Schema()) return []PhysicalPlan{ua, mppUA}, true, nil } @@ -3589,7 +3606,7 @@ func (p *LogicalPartitionUnionAll) exhaustPhysicalPlans(prop *property.PhysicalP } func (ls *LogicalSort) getPhysicalSort(prop *property.PhysicalProperty) *PhysicalSort { - ps := PhysicalSort{ByItems: ls.ByItems}.Init(ls.SCtx(), ls.StatsInfo().ScaleByExpectCnt(prop.ExpectedCnt), ls.SelectBlockOffset(), &property.PhysicalProperty{TaskTp: prop.TaskTp, ExpectedCnt: math.MaxFloat64, RejectSort: true, CTEProducerStatus: prop.CTEProducerStatus}) + ps := PhysicalSort{ByItems: ls.ByItems}.Init(ls.SCtx(), ls.StatsInfo().ScaleByExpectCnt(prop.ExpectedCnt), ls.QueryBlockOffset(), &property.PhysicalProperty{TaskTp: prop.TaskTp, ExpectedCnt: math.MaxFloat64, RejectSort: true, CTEProducerStatus: prop.CTEProducerStatus}) return ps } @@ -3601,7 +3618,7 @@ func (ls *LogicalSort) getNominalSort(reqProp *property.PhysicalProperty) *Nomin prop.RejectSort = true prop.ExpectedCnt = reqProp.ExpectedCnt ps := NominalSort{OnlyColumn: onlyColumn, ByItems: ls.ByItems}.Init( - ls.SCtx(), ls.StatsInfo().ScaleByExpectCnt(prop.ExpectedCnt), ls.SelectBlockOffset(), prop) + ls.SCtx(), ls.StatsInfo().ScaleByExpectCnt(prop.ExpectedCnt), ls.QueryBlockOffset(), prop) return ps } @@ -3621,7 +3638,7 @@ func (ls *LogicalSort) exhaustPhysicalPlans(prop *property.PhysicalProperty) ([] newProp := prop.CloneEssentialFields() newProp.RejectSort = true ps := NominalSort{OnlyColumn: true, ByItems: ls.ByItems}.Init( - ls.SCtx(), ls.StatsInfo().ScaleByExpectCnt(prop.ExpectedCnt), ls.SelectBlockOffset(), newProp) + ls.SCtx(), ls.StatsInfo().ScaleByExpectCnt(prop.ExpectedCnt), ls.QueryBlockOffset(), newProp) return []PhysicalPlan{ps}, true, nil } } @@ -3633,7 +3650,7 @@ func (p *LogicalMaxOneRow) exhaustPhysicalPlans(prop *property.PhysicalProperty) p.SCtx().GetSessionVars().RaiseWarningWhenMPPEnforced("MPP mode may be blocked because operator `MaxOneRow` is not supported now.") return nil, true, nil } - mor := PhysicalMaxOneRow{}.Init(p.SCtx(), p.StatsInfo(), p.SelectBlockOffset(), &property.PhysicalProperty{ExpectedCnt: 2, CTEProducerStatus: prop.CTEProducerStatus}) + mor := PhysicalMaxOneRow{}.Init(p.SCtx(), p.StatsInfo(), p.QueryBlockOffset(), &property.PhysicalProperty{ExpectedCnt: 2, CTEProducerStatus: prop.CTEProducerStatus}) return []PhysicalPlan{mor}, true, nil } @@ -3675,7 +3692,7 @@ func (p *LogicalSequence) exhaustPhysicalPlans(prop *property.PhysicalProperty) childReqs = append(childReqs, propChoice[0].CloneEssentialFields()) } childReqs = append(childReqs, propChoice[1]) - seq := PhysicalSequence{}.Init(p.SCtx(), p.StatsInfo(), p.SelectBlockOffset(), childReqs...) + seq := PhysicalSequence{}.Init(p.SCtx(), p.StatsInfo(), p.QueryBlockOffset(), childReqs...) seq.SetSchema(p.children[len(p.children)-1].Schema()) seqs = append(seqs, seq) } diff --git a/pkg/planner/core/explain.go b/pkg/planner/core/explain.go index a0d7afa09f4b9..53f9a482063da 100644 --- a/pkg/planner/core/explain.go +++ b/pkg/planner/core/explain.go @@ -27,6 +27,7 @@ import ( "github.com/pingcap/tidb/pkg/parser/mysql" "github.com/pingcap/tidb/pkg/planner/property" "github.com/pingcap/tidb/pkg/planner/util" + "github.com/pingcap/tidb/pkg/sessionctx" "github.com/pingcap/tidb/pkg/sessionctx/variable" "github.com/pingcap/tidb/pkg/statistics" "github.com/pingcap/tidb/pkg/types" @@ -217,11 +218,11 @@ func (p *PhysicalTableScan) OperatorInfo(normalized bool) string { } if p.SCtx().GetSessionVars().EnableLateMaterialization && len(p.filterCondition) > 0 && p.StoreType == kv.TiFlash { buffer.WriteString("pushed down filter:") - if len(p.lateMaterializationFilterCondition) > 0 { + if len(p.LateMaterializationFilterCondition) > 0 { if normalized { - buffer.Write(expression.SortedExplainNormalizedExpressionList(p.lateMaterializationFilterCondition)) + buffer.Write(expression.SortedExplainNormalizedExpressionList(p.LateMaterializationFilterCondition)) } else { - buffer.Write(expression.SortedExplainExpressionList(p.lateMaterializationFilterCondition)) + buffer.Write(expression.SortedExplainExpressionList(p.SCtx(), p.LateMaterializationFilterCondition)) } } else { buffer.WriteString("empty") @@ -352,12 +353,12 @@ func (p *PhysicalIndexMergeReader) ExplainInfo() string { // ExplainInfo implements Plan interface. func (p *PhysicalUnionScan) ExplainInfo() string { - return string(expression.SortedExplainExpressionList(p.Conditions)) + return string(expression.SortedExplainExpressionList(p.SCtx(), p.Conditions)) } // ExplainInfo implements Plan interface. func (p *PhysicalSelection) ExplainInfo() string { - exprStr := string(expression.SortedExplainExpressionList(p.Conditions)) + exprStr := string(expression.SortedExplainExpressionList(p.SCtx(), p.Conditions)) if p.TiFlashFineGrainedShuffleStreamCount > 0 { exprStr += fmt.Sprintf(", stream_count: %d", p.TiFlashFineGrainedShuffleStreamCount) } @@ -424,7 +425,7 @@ func (p *PhysicalTableDual) ExplainInfo() string { // ExplainInfo implements Plan interface. func (p *PhysicalSort) ExplainInfo() string { buffer := bytes.NewBufferString("") - buffer = explainByItems(buffer, p.ByItems) + buffer = explainByItems(p.SCtx(), buffer, p.ByItems) if p.TiFlashFineGrainedShuffleStreamCount > 0 { fmt.Fprintf(buffer, ", stream_count: %d", p.TiFlashFineGrainedShuffleStreamCount) } @@ -466,13 +467,15 @@ func (p *basePhysicalAgg) ExplainInfo() string { func (p *basePhysicalAgg) explainInfo(normalized bool) string { sortedExplainExpressionList := expression.SortedExplainExpressionList if normalized { - sortedExplainExpressionList = expression.SortedExplainNormalizedExpressionList + sortedExplainExpressionList = func(_ expression.EvalContext, exprs []expression.Expression) []byte { + return expression.SortedExplainNormalizedExpressionList(exprs) + } } builder := &strings.Builder{} if len(p.GroupByItems) > 0 { builder.WriteString("group by:") - builder.Write(sortedExplainExpressionList(p.GroupByItems)) + builder.Write(sortedExplainExpressionList(p.SCtx(), p.GroupByItems)) builder.WriteString(", ") } for i := 0; i < len(p.AggFuncs); i++ { @@ -481,9 +484,9 @@ func (p *basePhysicalAgg) explainInfo(normalized bool) string { if normalized { colName = p.schema.Columns[i].ExplainNormalizedInfo() } else { - colName = p.schema.Columns[i].ExplainInfo() + colName = p.schema.Columns[i].ExplainInfo(p.SCtx()) } - builder.WriteString(aggregation.ExplainAggFunc(p.AggFuncs[i], normalized)) + builder.WriteString(aggregation.ExplainAggFunc(p.SCtx(), p.AggFuncs[i], normalized)) builder.WriteString("->") builder.WriteString(colName) if i+1 < len(p.AggFuncs) { @@ -514,7 +517,9 @@ func (p *PhysicalIndexMergeJoin) ExplainInfo() string { func (p *PhysicalIndexJoin) explainInfo(normalized bool, isIndexMergeJoin bool) string { sortedExplainExpressionList := expression.SortedExplainExpressionList if normalized { - sortedExplainExpressionList = expression.SortedExplainNormalizedExpressionList + sortedExplainExpressionList = func(_ expression.EvalContext, exprs []expression.Expression) []byte { + return expression.SortedExplainNormalizedExpressionList(exprs) + } } buffer := bytes.NewBufferString(p.JoinType.String()) @@ -526,11 +531,11 @@ func (p *PhysicalIndexJoin) explainInfo(normalized bool, isIndexMergeJoin bool) } if len(p.OuterJoinKeys) > 0 { buffer.WriteString(", outer key:") - buffer.Write(expression.ExplainColumnList(p.OuterJoinKeys)) + buffer.Write(expression.ExplainColumnList(p.SCtx(), p.OuterJoinKeys)) } if len(p.InnerJoinKeys) > 0 { buffer.WriteString(", inner key:") - buffer.Write(expression.ExplainColumnList(p.InnerJoinKeys)) + buffer.Write(expression.ExplainColumnList(p.SCtx(), p.InnerJoinKeys)) } if len(p.OuterHashKeys) > 0 && !isIndexMergeJoin { @@ -543,19 +548,19 @@ func (p *PhysicalIndexJoin) explainInfo(normalized bool, isIndexMergeJoin bool) exprs = append(exprs, expr) } buffer.WriteString(", equal cond:") - buffer.Write(sortedExplainExpressionList(exprs)) + buffer.Write(sortedExplainExpressionList(p.SCtx(), exprs)) } if len(p.LeftConditions) > 0 { buffer.WriteString(", left cond:") - buffer.Write(sortedExplainExpressionList(p.LeftConditions)) + buffer.Write(sortedExplainExpressionList(p.SCtx(), p.LeftConditions)) } if len(p.RightConditions) > 0 { buffer.WriteString(", right cond:") - buffer.Write(sortedExplainExpressionList(p.RightConditions)) + buffer.Write(sortedExplainExpressionList(p.SCtx(), p.RightConditions)) } if len(p.OtherConditions) > 0 { buffer.WriteString(", other cond:") - buffer.Write(sortedExplainExpressionList(p.OtherConditions)) + buffer.Write(sortedExplainExpressionList(p.SCtx(), p.OtherConditions)) } return buffer.String() } @@ -583,7 +588,9 @@ func (p *PhysicalHashJoin) ExplainNormalizedInfo() string { func (p *PhysicalHashJoin) explainInfo(normalized bool) string { sortedExplainExpressionList := expression.SortedExplainExpressionList if normalized { - sortedExplainExpressionList = expression.SortedExplainNormalizedExpressionList + sortedExplainExpressionList = func(_ expression.EvalContext, exprs []expression.Expression) []byte { + return expression.SortedExplainNormalizedExpressionList(exprs) + } } buffer := new(strings.Builder) @@ -645,11 +652,11 @@ func (p *PhysicalHashJoin) explainInfo(normalized bool) string { } if len(p.RightConditions) > 0 { buffer.WriteString(", right cond:") - buffer.Write(sortedExplainExpressionList(p.RightConditions)) + buffer.Write(sortedExplainExpressionList(p.SCtx(), p.RightConditions)) } if len(p.OtherConditions) > 0 { buffer.WriteString(", other cond:") - buffer.Write(sortedExplainExpressionList(p.OtherConditions)) + buffer.Write(sortedExplainExpressionList(p.SCtx(), p.OtherConditions)) } if p.TiFlashFineGrainedShuffleStreamCount > 0 { fmt.Fprintf(buffer, ", stream_count: %d", p.TiFlashFineGrainedShuffleStreamCount) @@ -676,17 +683,19 @@ func (p *PhysicalMergeJoin) ExplainInfo() string { func (p *PhysicalMergeJoin) explainInfo(normalized bool) string { sortedExplainExpressionList := expression.SortedExplainExpressionList if normalized { - sortedExplainExpressionList = expression.SortedExplainNormalizedExpressionList + sortedExplainExpressionList = func(_ expression.EvalContext, exprs []expression.Expression) []byte { + return expression.SortedExplainNormalizedExpressionList(exprs) + } } buffer := bytes.NewBufferString(p.JoinType.String()) if len(p.LeftJoinKeys) > 0 { fmt.Fprintf(buffer, ", left key:%s", - expression.ExplainColumnList(p.LeftJoinKeys)) + expression.ExplainColumnList(p.SCtx(), p.LeftJoinKeys)) } if len(p.RightJoinKeys) > 0 { fmt.Fprintf(buffer, ", right key:%s", - expression.ExplainColumnList(p.RightJoinKeys)) + expression.ExplainColumnList(p.SCtx(), p.RightJoinKeys)) } if len(p.LeftConditions) > 0 { if normalized { @@ -697,11 +706,11 @@ func (p *PhysicalMergeJoin) explainInfo(normalized bool) string { } if len(p.RightConditions) > 0 { fmt.Fprintf(buffer, ", right cond:%s", - sortedExplainExpressionList(p.RightConditions)) + sortedExplainExpressionList(p.SCtx(), p.RightConditions)) } if len(p.OtherConditions) > 0 { fmt.Fprintf(buffer, ", other cond:%s", - sortedExplainExpressionList(p.OtherConditions)) + sortedExplainExpressionList(p.SCtx(), p.OtherConditions)) } return buffer.String() } @@ -716,11 +725,7 @@ func explainPartitionBy(buffer *bytes.Buffer, partitionBy []property.SortItem, n if len(partitionBy) > 0 { buffer.WriteString("partition by ") for i, item := range partitionBy { - if normalized { - fmt.Fprintf(buffer, "%s", item.Col.ExplainNormalizedInfo()) - } else { - fmt.Fprintf(buffer, "%s", item.Col.ExplainInfo()) - } + fmt.Fprintf(buffer, "%s", item.Col.ColumnExplainInfo(normalized)) if i+1 < len(partitionBy) { buffer.WriteString(", ") } @@ -742,7 +747,7 @@ func (p *PhysicalTopN) ExplainInfo() string { if len(p.GetPartitionBy()) > 0 { buffer.WriteString("order by ") } - buffer = explainByItems(buffer, p.ByItems) + buffer = explainByItems(p.SCtx(), buffer, p.ByItems) } fmt.Fprintf(buffer, ", offset:%v, count:%v", p.Offset, p.Count) return buffer.String() @@ -766,7 +771,7 @@ func (p *PhysicalTopN) ExplainNormalizedInfo() string { return buffer.String() } -func (*PhysicalWindow) formatFrameBound(buffer *bytes.Buffer, bound *FrameBound) { +func (p *PhysicalWindow) formatFrameBound(buffer *bytes.Buffer, bound *FrameBound) { if bound.Type == ast.CurrentRow { buffer.WriteString("current row") return @@ -774,14 +779,15 @@ func (*PhysicalWindow) formatFrameBound(buffer *bytes.Buffer, bound *FrameBound) if bound.UnBounded { buffer.WriteString("unbounded") } else if len(bound.CalcFuncs) > 0 { + ctx := p.SCtx() sf := bound.CalcFuncs[0].(*expression.ScalarFunction) switch sf.FuncName.L { case ast.DateAdd, ast.DateSub: // For `interval '2:30' minute_second`. - fmt.Fprintf(buffer, "interval %s %s", sf.GetArgs()[1].ExplainInfo(), sf.GetArgs()[2].ExplainInfo()) + fmt.Fprintf(buffer, "interval %s %s", sf.GetArgs()[1].ExplainInfo(ctx), sf.GetArgs()[2].ExplainInfo(ctx)) case ast.Plus, ast.Minus: // For `1 preceding` of range frame. - fmt.Fprintf(buffer, "%s", sf.GetArgs()[1].ExplainInfo()) + fmt.Fprintf(buffer, "%s", sf.GetArgs()[1].ExplainInfo(ctx)) } } else { fmt.Fprintf(buffer, "%d", bound.Num) @@ -808,11 +814,12 @@ func (p *PhysicalWindow) ExplainInfo() string { buffer.WriteString(" ") } buffer.WriteString("order by ") + ctx := p.SCtx() for i, item := range p.OrderBy { if item.Desc { - fmt.Fprintf(buffer, "%s desc", item.Col.ExplainInfo()) + fmt.Fprintf(buffer, "%s desc", item.Col.ExplainInfo(ctx)) } else { - fmt.Fprintf(buffer, "%s", item.Col.ExplainInfo()) + fmt.Fprintf(buffer, "%s", item.Col.ExplainInfo(ctx)) } if i+1 < len(p.OrderBy) { @@ -873,15 +880,15 @@ func (p *LogicalJoin) ExplainInfo() string { } if len(p.LeftConditions) > 0 { fmt.Fprintf(buffer, ", left cond:%s", - expression.SortedExplainExpressionList(p.LeftConditions)) + expression.SortedExplainExpressionList(p.SCtx(), p.LeftConditions)) } if len(p.RightConditions) > 0 { fmt.Fprintf(buffer, ", right cond:%s", - expression.SortedExplainExpressionList(p.RightConditions)) + expression.SortedExplainExpressionList(p.SCtx(), p.RightConditions)) } if len(p.OtherConditions) > 0 { fmt.Fprintf(buffer, ", other cond:%s", - expression.SortedExplainExpressionList(p.OtherConditions)) + expression.SortedExplainExpressionList(p.SCtx(), p.OtherConditions)) } return buffer.String() } @@ -891,12 +898,12 @@ func (p *LogicalAggregation) ExplainInfo() string { buffer := bytes.NewBufferString("") if len(p.GroupByItems) > 0 { fmt.Fprintf(buffer, "group by:%s, ", - expression.SortedExplainExpressionList(p.GroupByItems)) + expression.SortedExplainExpressionList(p.SCtx(), p.GroupByItems)) } if len(p.AggFuncs) > 0 { buffer.WriteString("funcs:") for i, agg := range p.AggFuncs { - buffer.WriteString(aggregation.ExplainAggFunc(agg, false)) + buffer.WriteString(aggregation.ExplainAggFunc(p.SCtx(), agg, false)) if i+1 < len(p.AggFuncs) { buffer.WriteString(", ") } @@ -912,7 +919,7 @@ func (p *LogicalProjection) ExplainInfo() string { // ExplainInfo implements Plan interface. func (p *LogicalSelection) ExplainInfo() string { - return string(expression.SortedExplainExpressionList(p.Conditions)) + return string(expression.SortedExplainExpressionList(p.SCtx(), p.Conditions)) } // ExplainInfo implements Plan interface. @@ -960,7 +967,7 @@ func (p *PhysicalExchangeSender) ExplainInfo() string { fmt.Fprintf(buffer, ", Compression: %s", p.CompressionMode.Name()) } if p.ExchangeType == tipb.ExchangeType_Hash { - fmt.Fprintf(buffer, ", Hash Cols: %s", property.ExplainColumnList(p.HashCols)) + fmt.Fprintf(buffer, ", Hash Cols: %s", property.ExplainColumnList(p.SCtx(), p.HashCols)) } if len(p.Tasks) > 0 { fmt.Fprintf(buffer, ", tasks: [") @@ -990,17 +997,17 @@ func (p *PhysicalExchangeReceiver) ExplainInfo() (res string) { func (p *LogicalUnionScan) ExplainInfo() string { buffer := bytes.NewBufferString("") fmt.Fprintf(buffer, "conds:%s", - expression.SortedExplainExpressionList(p.conditions)) + expression.SortedExplainExpressionList(p.SCtx(), p.conditions)) fmt.Fprintf(buffer, ", handle:%s", p.handleCols) return buffer.String() } -func explainByItems(buffer *bytes.Buffer, byItems []*util.ByItems) *bytes.Buffer { +func explainByItems(ctx sessionctx.Context, buffer *bytes.Buffer, byItems []*util.ByItems) *bytes.Buffer { for i, item := range byItems { if item.Desc { - fmt.Fprintf(buffer, "%s:desc", item.Expr.ExplainInfo()) + fmt.Fprintf(buffer, "%s:desc", item.Expr.ExplainInfo(ctx)) } else { - fmt.Fprintf(buffer, "%s", item.Expr.ExplainInfo()) + fmt.Fprintf(buffer, "%s", item.Expr.ExplainInfo(ctx)) } if i+1 < len(byItems) { @@ -1028,7 +1035,7 @@ func explainNormalizedByItems(buffer *bytes.Buffer, byItems []*util.ByItems) *by // ExplainInfo implements Plan interface. func (p *LogicalSort) ExplainInfo() string { buffer := bytes.NewBufferString("") - return explainByItems(buffer, p.ByItems).String() + return explainByItems(p.SCtx(), buffer, p.ByItems).String() } // ExplainInfo implements Plan interface. @@ -1038,7 +1045,7 @@ func (lt *LogicalTopN) ExplainInfo() string { if len(lt.GetPartitionBy()) > 0 && len(lt.ByItems) > 0 { buffer.WriteString("order by ") } - buffer = explainByItems(buffer, lt.ByItems) + buffer = explainByItems(lt.SCtx(), buffer, lt.ByItems) fmt.Fprintf(buffer, ", offset:%v, count:%v", lt.Offset, lt.Count) return buffer.String() } diff --git a/pkg/planner/core/expression_rewriter.go b/pkg/planner/core/expression_rewriter.go index 612988845c869..4933104015590 100644 --- a/pkg/planner/core/expression_rewriter.go +++ b/pkg/planner/core/expression_rewriter.go @@ -23,7 +23,6 @@ import ( "time" "github.com/pingcap/errors" - "github.com/pingcap/tidb/pkg/domain" "github.com/pingcap/tidb/pkg/expression" "github.com/pingcap/tidb/pkg/expression/aggregation" "github.com/pingcap/tidb/pkg/infoschema" @@ -43,6 +42,7 @@ import ( "github.com/pingcap/tidb/pkg/util/codec" "github.com/pingcap/tidb/pkg/util/collate" "github.com/pingcap/tidb/pkg/util/hint" + "github.com/pingcap/tidb/pkg/util/intest" "github.com/pingcap/tidb/pkg/util/sem" "github.com/pingcap/tidb/pkg/util/stringutil" ) @@ -69,7 +69,7 @@ func rewriteAstExpr(sctx sessionctx.Context, expr ast.ExprNode, schema *expressi if s, ok := sctx.GetInfoSchema().(infoschema.InfoSchema); ok { is = s } - b, savedBlockNames := NewPlanBuilder().Init(sctx, is, &hint.BlockHintProcessor{}) + b, savedBlockNames := NewPlanBuilder().Init(sctx, is, hint.NewQBHintHandler(nil)) b.allowBuildCastArray = allowCastArray fakePlan := LogicalTableDual{}.Init(sctx, 0) if schema != nil { @@ -99,7 +99,7 @@ func (b *PlanBuilder) rewriteInsertOnDuplicateUpdate(ctx context.Context, exprNo return nil, rewriter.err } - rewriter.insertPlan = insertPlan + rewriter.planCtx.insertPlan = insertPlan rewriter.asScalar = true expr, _, err := b.rewriteExprNode(rewriter, exprNode, true) @@ -138,8 +138,8 @@ func (b *PlanBuilder) rewriteWithPreprocess( return nil, nil, rewriter.err } - rewriter.aggrMap = aggMapper - rewriter.windowMap = windowMapper + rewriter.planCtx.aggrMap = aggMapper + rewriter.planCtx.windowMap = windowMapper rewriter.asScalar = asScalar rewriter.preprocess = preprocess @@ -156,34 +156,38 @@ func (b *PlanBuilder) getExpressionRewriter(ctx context.Context, p LogicalPlan) }() if len(b.rewriterPool) < b.rewriterCounter { - rewriter = &expressionRewriter{p: p, b: b, sctx: b.ctx, ctx: ctx, rollExpand: b.currentBlockExpand} + rewriter = &expressionRewriter{ + sctx: b.ctx, ctx: ctx, + planCtx: &exprRewriterPlanCtx{plan: p, builder: b, rollExpand: b.currentBlockExpand}, + } rewriter.sctx.SetValue(expression.TiDBDecodeKeyFunctionKey, decodeKeyFromString) b.rewriterPool = append(b.rewriterPool, rewriter) return } rewriter = b.rewriterPool[b.rewriterCounter-1] - rewriter.p = p rewriter.asScalar = false - rewriter.aggrMap = nil rewriter.preprocess = nil - rewriter.insertPlan = nil rewriter.disableFoldCounter = 0 rewriter.tryFoldCounter = 0 rewriter.ctxStack = rewriter.ctxStack[:0] rewriter.ctxNameStk = rewriter.ctxNameStk[:0] rewriter.ctx = ctx rewriter.err = nil - rewriter.rollExpand = b.currentBlockExpand + rewriter.planCtx.plan = p + rewriter.planCtx.aggrMap = nil + rewriter.planCtx.insertPlan = nil + rewriter.planCtx.rollExpand = b.currentBlockExpand return } func (*PlanBuilder) rewriteExprNode(rewriter *expressionRewriter, exprNode ast.ExprNode, asScalar bool) (expression.Expression, LogicalPlan, error) { - if rewriter.p != nil { - curColLen := rewriter.p.Schema().Len() + planCtx := rewriter.planCtx + if planCtx.plan != nil { + curColLen := planCtx.plan.Schema().Len() defer func() { - names := rewriter.p.OutputNames().Shallow()[:curColLen] - for i := curColLen; i < rewriter.p.Schema().Len(); i++ { + names := planCtx.plan.OutputNames().Shallow()[:curColLen] + for i := curColLen; i < planCtx.plan.Schema().Len(); i++ { names = append(names, types.EmptyName) } // After rewriting finished, only old columns are visible. @@ -195,7 +199,7 @@ func (*PlanBuilder) rewriteExprNode(rewriter *expressionRewriter, exprNode ast.E // the previous subquery. // So here we just reset the names to empty to avoid this situation. // TODO: implement ScalarSubQuery and resolve it during optimizing. In building phase, we will not change the plan's structure. - rewriter.p.SetOutputNames(names) + planCtx.plan.SetOutputNames(names) }() } exprNode.Accept(rewriter) @@ -203,7 +207,7 @@ func (*PlanBuilder) rewriteExprNode(rewriter *expressionRewriter, exprNode ast.E return nil, nil, errors.Trace(rewriter.err) } if !asScalar && len(rewriter.ctxStack) == 0 { - return nil, rewriter.p, nil + return nil, rewriter.planCtx.plan, nil } if len(rewriter.ctxStack) != 1 { return nil, nil, errors.Errorf("context len %v is invalid", len(rewriter.ctxStack)) @@ -212,21 +216,32 @@ func (*PlanBuilder) rewriteExprNode(rewriter *expressionRewriter, exprNode ast.E if rewriter.err != nil { return nil, nil, errors.Trace(rewriter.err) } - return rewriter.ctxStack[0], rewriter.p, nil + return rewriter.ctxStack[0], rewriter.planCtx.plan, nil +} + +type exprRewriterPlanCtx struct { + plan LogicalPlan + builder *PlanBuilder + + aggrMap map[*ast.AggregateFuncExpr]int + windowMap map[*ast.WindowFuncExpr]int + + // insertPlan is only used to rewrite the expressions inside the assignment + // of the "INSERT" statement. + insertPlan *Insert + + rollExpand *LogicalExpand } type expressionRewriter struct { ctxStack []expression.Expression ctxNameStk []*types.FieldName - p LogicalPlan schema *expression.Schema names []*types.FieldName err error - aggrMap map[*ast.AggregateFuncExpr]int - windowMap map[*ast.WindowFuncExpr]int - b *PlanBuilder - sctx sessionctx.Context - ctx context.Context + + sctx sessionctx.Context + ctx context.Context // asScalar indicates the return value must be a scalar value. // NOTE: This value can be changed during expression rewritten. @@ -235,10 +250,6 @@ type expressionRewriter struct { // preprocess is called for every ast.Node in Leave. preprocess func(ast.Node) ast.Node - // insertPlan is only used to rewrite the expressions inside the assignment - // of the "INSERT" statement. - insertPlan *Insert - // disableFoldCounter controls fold-disabled scope. If > 0, rewriter will NOT do constant folding. // Typically, during visiting AST, while entering the scope(disable), the counter will +1; while // leaving the scope(enable again), the counter will -1. @@ -246,7 +257,7 @@ type expressionRewriter struct { disableFoldCounter int tryFoldCounter int - rollExpand *LogicalExpand + planCtx *exprRewriterPlanCtx } func (er *expressionRewriter) ctxStackLen() int { @@ -322,48 +333,52 @@ func (er *expressionRewriter) constructBinaryOpFunction(l expression.Expression, // buildSubquery translates the subquery ast to plan. // Subquery related hints are returned through hintFlags. Please see comments around HintFlagSemiJoinRewrite and PlanBuilder.subQueryHintFlags for details. -func (er *expressionRewriter) buildSubquery(ctx context.Context, subq *ast.SubqueryExpr, subqueryCtx subQueryCtx) (np LogicalPlan, hintFlags uint64, err error) { +func (er *expressionRewriter) buildSubquery(ctx context.Context, planCtx *exprRewriterPlanCtx, subq *ast.SubqueryExpr, subqueryCtx subQueryCtx) (np LogicalPlan, hintFlags uint64, err error) { + intest.AssertNotNil(planCtx) + b := planCtx.builder if er.schema != nil { outerSchema := er.schema.Clone() - er.b.outerSchemas = append(er.b.outerSchemas, outerSchema) - er.b.outerNames = append(er.b.outerNames, er.names) - er.b.outerBlockExpand = append(er.b.outerBlockExpand, er.b.currentBlockExpand) + b.outerSchemas = append(b.outerSchemas, outerSchema) + b.outerNames = append(b.outerNames, er.names) + b.outerBlockExpand = append(b.outerBlockExpand, b.currentBlockExpand) defer func() { - er.b.outerSchemas = er.b.outerSchemas[0 : len(er.b.outerSchemas)-1] - er.b.outerNames = er.b.outerNames[0 : len(er.b.outerNames)-1] - er.b.currentBlockExpand = er.b.outerBlockExpand[len(er.b.outerBlockExpand)-1] - er.b.outerBlockExpand = er.b.outerBlockExpand[0 : len(er.b.outerBlockExpand)-1] + b.outerSchemas = b.outerSchemas[0 : len(b.outerSchemas)-1] + b.outerNames = b.outerNames[0 : len(b.outerNames)-1] + b.currentBlockExpand = b.outerBlockExpand[len(b.outerBlockExpand)-1] + b.outerBlockExpand = b.outerBlockExpand[0 : len(b.outerBlockExpand)-1] }() } // Store the old value before we enter the subquery and reset they to default value. - oldSubQCtx := er.b.subQueryCtx - er.b.subQueryCtx = subqueryCtx - oldHintFlags := er.b.subQueryHintFlags - er.b.subQueryHintFlags = 0 - outerWindowSpecs := er.b.windowSpecs + oldSubQCtx := b.subQueryCtx + b.subQueryCtx = subqueryCtx + oldHintFlags := b.subQueryHintFlags + b.subQueryHintFlags = 0 + outerWindowSpecs := b.windowSpecs defer func() { - er.b.windowSpecs = outerWindowSpecs - er.b.subQueryCtx = oldSubQCtx - er.b.subQueryHintFlags = oldHintFlags + b.windowSpecs = outerWindowSpecs + b.subQueryCtx = oldSubQCtx + b.subQueryHintFlags = oldHintFlags }() - np, err = er.b.buildResultSetNode(ctx, subq.Query, false) + np, err = b.buildResultSetNode(ctx, subq.Query, false) if err != nil { return nil, 0, err } - hintFlags = er.b.subQueryHintFlags + hintFlags = b.subQueryHintFlags // Pop the handle map generated by the subquery. - er.b.handleHelper.popMap() + b.handleHelper.popMap() return np, hintFlags, nil } // Enter implements Visitor interface. func (er *expressionRewriter) Enter(inNode ast.Node) (ast.Node, bool) { + planCtx := er.planCtx switch v := inNode.(type) { case *ast.AggregateFuncExpr: + intest.AssertNotNil(planCtx) index, ok := -1, false - if er.aggrMap != nil { - index, ok = er.aggrMap[v] + if planCtx.aggrMap != nil { + index, ok = planCtx.aggrMap[v] } if ok { // index < 0 indicates this is a correlated aggregate belonging to outer query, @@ -378,24 +393,26 @@ func (er *expressionRewriter) Enter(inNode ast.Node) (ast.Node, bool) { return inNode, true } // replace correlated aggregate in sub-query with its corresponding correlated column - if col, ok := er.b.correlatedAggMapper[v]; ok { + if col, ok := planCtx.builder.correlatedAggMapper[v]; ok { er.ctxStackAppend(col, types.EmptyName) return inNode, true } er.err = ErrInvalidGroupFuncUse return inNode, true case *ast.ColumnNameExpr: - if index, ok := er.b.colMapper[v]; ok { - er.ctxStackAppend(er.schema.Columns[index], er.names[index]) - return inNode, true + if planCtx != nil { + if index, ok := planCtx.builder.colMapper[v]; ok { + er.ctxStackAppend(er.schema.Columns[index], er.names[index]) + return inNode, true + } } case *ast.CompareSubqueryExpr: - return er.handleCompareSubquery(er.ctx, v) + return er.handleCompareSubquery(er.ctx, planCtx, v) case *ast.ExistsSubqueryExpr: - return er.handleExistSubquery(er.ctx, v) + return er.handleExistSubquery(er.ctx, planCtx, v) case *ast.PatternInExpr: if v.Sel != nil { - return er.handleInSubquery(er.ctx, v) + return er.handleInSubquery(er.ctx, planCtx, v) } if len(v.List) != 1 { break @@ -407,7 +424,7 @@ func (er *expressionRewriter) Enter(inNode ast.Node) (ast.Node, bool) { switch y := x.(type) { case *ast.SubqueryExpr: v.Sel = y - return er.handleInSubquery(er.ctx, v) + return er.handleInSubquery(er.ctx, planCtx, v) case *ast.ParenthesesExpr: x = y.Expr default: @@ -415,16 +432,17 @@ func (er *expressionRewriter) Enter(inNode ast.Node) (ast.Node, bool) { } } case *ast.SubqueryExpr: - return er.handleScalarSubquery(er.ctx, v) + return er.handleScalarSubquery(er.ctx, planCtx, v) case *ast.ParenthesesExpr: case *ast.ValuesExpr: + intest.AssertNotNil(planCtx) schema, names := er.schema, er.names // NOTE: "er.insertPlan != nil" means that we are rewriting the // expressions inside the assignment of "INSERT" statement. we have to // use the "tableSchema" of that "insertPlan". - if er.insertPlan != nil { - schema = er.insertPlan.tableSchema - names = er.insertPlan.tableColNames + if planCtx.insertPlan != nil { + schema = planCtx.insertPlan.tableSchema + names = planCtx.insertPlan.tableColNames } idx, err := expression.FindFieldName(names, v.Column.Name) if err != nil { @@ -439,9 +457,10 @@ func (er *expressionRewriter) Enter(inNode ast.Node) (ast.Node, bool) { er.ctxStackAppend(expression.NewValuesFunc(er.sctx, col.Index, col.RetType), types.EmptyName) return inNode, true case *ast.WindowFuncExpr: + intest.AssertNotNil(planCtx) index, ok := -1, false - if er.windowMap != nil { - index, ok = er.windowMap[v] + if planCtx.windowMap != nil { + index, ok = planCtx.windowMap[v] } if !ok { er.err = ErrWindowInvalidWindowFuncUse.GenWithStackByArgs(strings.ToLower(v.Name)) @@ -478,7 +497,8 @@ func (er *expressionRewriter) Enter(inNode ast.Node) (ast.Node, bool) { return inNode, false } -func (er *expressionRewriter) buildSemiApplyFromEqualSubq(np LogicalPlan, l, r expression.Expression, not, markNoDecorrelate bool) { +func (er *expressionRewriter) buildSemiApplyFromEqualSubq(np LogicalPlan, planCtx *exprRewriterPlanCtx, l, r expression.Expression, not, markNoDecorrelate bool) { + intest.AssertNotNil(planCtx) if er.asScalar || not { if expression.GetRowLen(r) == 1 { rCol := r.(*expression.Column) @@ -520,11 +540,13 @@ func (er *expressionRewriter) buildSemiApplyFromEqualSubq(np LogicalPlan, l, r e if er.err != nil { return } - er.p, er.err = er.b.buildSemiApply(er.p, np, []expression.Expression{condition}, er.asScalar, not, false, markNoDecorrelate) + planCtx.plan, er.err = planCtx.builder.buildSemiApply(planCtx.plan, np, []expression.Expression{condition}, er.asScalar, not, false, markNoDecorrelate) } -func (er *expressionRewriter) handleCompareSubquery(ctx context.Context, v *ast.CompareSubqueryExpr) (ast.Node, bool) { - ci := er.b.prepareCTECheckForSubQuery() +func (er *expressionRewriter) handleCompareSubquery(ctx context.Context, planCtx *exprRewriterPlanCtx, v *ast.CompareSubqueryExpr) (ast.Node, bool) { + intest.AssertNotNil(planCtx) + b := planCtx.builder + ci := b.prepareCTECheckForSubQuery() defer resetCTECheckForSubQuery(ci) v.L.Accept(er) if er.err != nil { @@ -536,15 +558,15 @@ func (er *expressionRewriter) handleCompareSubquery(ctx context.Context, v *ast. er.err = errors.Errorf("Unknown compare type %T", v.R) return v, true } - np, hintFlags, err := er.buildSubquery(ctx, subq, handlingCompareSubquery) + np, hintFlags, err := er.buildSubquery(ctx, planCtx, subq, handlingCompareSubquery) if err != nil { er.err = err return v, true } - noDecorrelate := hintFlags&HintFlagNoDecorrelate > 0 - if noDecorrelate && len(extractCorColumnsBySchema4LogicalPlan(np, er.p.Schema())) == 0 { - er.sctx.GetSessionVars().StmtCtx.AppendWarning(ErrInternal.GenWithStack( + noDecorrelate := hintFlags&hint.HintFlagNoDecorrelate > 0 + if noDecorrelate && len(extractCorColumnsBySchema4LogicalPlan(np, planCtx.plan.Schema())) == 0 { + er.sctx.GetSessionVars().StmtCtx.AppendWarning(ErrInternal.FastGen( "NO_DECORRELATE() is inapplicable because there are no correlated columns.")) noDecorrelate = false } @@ -587,11 +609,11 @@ func (er *expressionRewriter) handleCompareSubquery(ctx context.Context, v *ast. case opcode.EQ, opcode.NE, opcode.NullEQ: if v.Op == opcode.EQ { if v.All { - er.handleEQAll(lexpr, rexpr, np, noDecorrelate) + er.handleEQAll(planCtx, lexpr, rexpr, np, noDecorrelate) } else { // `a = any(subq)` will be rewriten as `a in (subq)`. er.asScalar = true - er.buildSemiApplyFromEqualSubq(np, lexpr, rexpr, false, noDecorrelate) + er.buildSemiApplyFromEqualSubq(np, planCtx, lexpr, rexpr, false, noDecorrelate) if er.err != nil { return v, true } @@ -600,12 +622,12 @@ func (er *expressionRewriter) handleCompareSubquery(ctx context.Context, v *ast. if v.All { // `a != all(subq)` will be rewriten as `a not in (subq)`. er.asScalar = true - er.buildSemiApplyFromEqualSubq(np, lexpr, rexpr, true, noDecorrelate) + er.buildSemiApplyFromEqualSubq(np, planCtx, lexpr, rexpr, true, noDecorrelate) if er.err != nil { return v, true } } else { - er.handleNEAny(lexpr, rexpr, np, noDecorrelate) + er.handleNEAny(planCtx, lexpr, rexpr, np, noDecorrelate) } } else { // TODO: Support this in future. @@ -615,22 +637,23 @@ func (er *expressionRewriter) handleCompareSubquery(ctx context.Context, v *ast. default: // When < all or > any , the agg function should use min. useMin := ((v.Op == opcode.LT || v.Op == opcode.LE) && v.All) || ((v.Op == opcode.GT || v.Op == opcode.GE) && !v.All) - er.handleOtherComparableSubq(lexpr, rexpr, np, useMin, v.Op.String(), v.All, noDecorrelate) + er.handleOtherComparableSubq(planCtx, lexpr, rexpr, np, useMin, v.Op.String(), v.All, noDecorrelate) } if er.asScalar { // The parent expression only use the last column in schema, which represents whether the condition is matched. - er.ctxStack[len(er.ctxStack)-1] = er.p.Schema().Columns[er.p.Schema().Len()-1] - er.ctxNameStk[len(er.ctxNameStk)-1] = er.p.OutputNames()[er.p.Schema().Len()-1] + er.ctxStack[len(er.ctxStack)-1] = planCtx.plan.Schema().Columns[planCtx.plan.Schema().Len()-1] + er.ctxNameStk[len(er.ctxNameStk)-1] = planCtx.plan.OutputNames()[planCtx.plan.Schema().Len()-1] } return v, true } // handleOtherComparableSubq handles the queries like < any, < max, etc. For example, if the query is t.id < any (select s.id from s), // it will be rewrote to t.id < (select max(s.id) from s). -func (er *expressionRewriter) handleOtherComparableSubq(lexpr, rexpr expression.Expression, np LogicalPlan, useMin bool, cmpFunc string, all, markNoDecorrelate bool) { - plan4Agg := LogicalAggregation{}.Init(er.sctx, er.b.getSelectOffset()) - if hint := er.b.TableHints(); hint != nil { - plan4Agg.aggHints = hint.aggHints +func (er *expressionRewriter) handleOtherComparableSubq(planCtx *exprRewriterPlanCtx, lexpr, rexpr expression.Expression, np LogicalPlan, useMin bool, cmpFunc string, all, markNoDecorrelate bool) { + intest.AssertNotNil(planCtx) + plan4Agg := LogicalAggregation{}.Init(er.sctx, planCtx.builder.getSelectOffset()) + if hint := planCtx.builder.TableHints(); hint != nil { + plan4Agg.aggHints = hint.AggHints } plan4Agg.SetChildren(np) @@ -658,11 +681,12 @@ func (er *expressionRewriter) handleOtherComparableSubq(lexpr, rexpr expression. plan4Agg.AggFuncs = []*aggregation.AggFuncDesc{funcMaxOrMin} cond := expression.NewFunctionInternal(er.sctx, cmpFunc, types.NewFieldType(mysql.TypeTiny), lexpr, colMaxOrMin) - er.buildQuantifierPlan(plan4Agg, cond, lexpr, rexpr, all, markNoDecorrelate) + er.buildQuantifierPlan(planCtx, plan4Agg, cond, lexpr, rexpr, all, markNoDecorrelate) } // buildQuantifierPlan adds extra condition for any / all subquery. -func (er *expressionRewriter) buildQuantifierPlan(plan4Agg *LogicalAggregation, cond, lexpr, rexpr expression.Expression, all, markNoDecorrelate bool) { +func (er *expressionRewriter) buildQuantifierPlan(planCtx *exprRewriterPlanCtx, plan4Agg *LogicalAggregation, cond, lexpr, rexpr expression.Expression, all, markNoDecorrelate bool) { + intest.AssertNotNil(planCtx) innerIsNull := expression.NewFunctionInternal(er.sctx, ast.IsNull, types.NewFieldType(mysql.TypeTiny), rexpr) outerIsNull := expression.NewFunctionInternal(er.sctx, ast.IsNull, types.NewFieldType(mysql.TypeTiny), lexpr) @@ -718,18 +742,18 @@ func (er *expressionRewriter) buildQuantifierPlan(plan4Agg *LogicalAggregation, // plan4Agg.buildProjectionIfNecessary() if !er.asScalar { // For Semi LogicalApply without aux column, the result is no matter false or null. So we can add it to join predicate. - er.p, er.err = er.b.buildSemiApply(er.p, plan4Agg, []expression.Expression{cond}, false, false, false, markNoDecorrelate) + planCtx.plan, er.err = planCtx.builder.buildSemiApply(planCtx.plan, plan4Agg, []expression.Expression{cond}, false, false, false, markNoDecorrelate) return } // If we treat the result as a scalar value, we will add a projection with a extra column to output true, false or null. - outerSchemaLen := er.p.Schema().Len() - er.p = er.b.buildApplyWithJoinType(er.p, plan4Agg, InnerJoin, markNoDecorrelate) - joinSchema := er.p.Schema() + outerSchemaLen := planCtx.plan.Schema().Len() + planCtx.plan = planCtx.builder.buildApplyWithJoinType(planCtx.plan, plan4Agg, InnerJoin, markNoDecorrelate) + joinSchema := planCtx.plan.Schema() proj := LogicalProjection{ Exprs: expression.Column2Exprs(joinSchema.Clone().Columns[:outerSchemaLen]), - }.Init(er.sctx, er.b.getSelectOffset()) + }.Init(er.sctx, planCtx.builder.getSelectOffset()) proj.names = make([]*types.FieldName, outerSchemaLen, outerSchemaLen+1) - copy(proj.names, er.p.OutputNames()) + copy(proj.names, planCtx.plan.OutputNames()) proj.SetSchema(expression.NewSchema(joinSchema.Clone().Columns[:outerSchemaLen]...)) proj.Exprs = append(proj.Exprs, cond) proj.schema.Append(&expression.Column{ @@ -737,14 +761,15 @@ func (er *expressionRewriter) buildQuantifierPlan(plan4Agg *LogicalAggregation, RetType: cond.GetType(), }) proj.names = append(proj.names, types.EmptyName) - proj.SetChildren(er.p) - er.p = proj + proj.SetChildren(planCtx.plan) + planCtx.plan = proj } // handleNEAny handles the case of != any. For example, if the query is t.id != any (select s.id from s), it will be rewrote to // t.id != s.id or count(distinct s.id) > 1 or [any checker]. If there are two different values in s.id , // there must exist a s.id that doesn't equal to t.id. -func (er *expressionRewriter) handleNEAny(lexpr, rexpr expression.Expression, np LogicalPlan, markNoDecorrelate bool) { +func (er *expressionRewriter) handleNEAny(planCtx *exprRewriterPlanCtx, lexpr, rexpr expression.Expression, np LogicalPlan, markNoDecorrelate bool) { + intest.AssertNotNil(planCtx) // If there is NULL in s.id column, s.id should be the value that isn't null in condition t.id != s.id. // So use function max to filter NULL. maxFunc, err := aggregation.NewAggFuncDesc(er.sctx, ast.AggFuncMax, []expression.Expression{rexpr}, false) @@ -759,9 +784,9 @@ func (er *expressionRewriter) handleNEAny(lexpr, rexpr expression.Expression, np } plan4Agg := LogicalAggregation{ AggFuncs: []*aggregation.AggFuncDesc{maxFunc, countFunc}, - }.Init(er.sctx, er.b.getSelectOffset()) - if hint := er.b.TableHints(); hint != nil { - plan4Agg.aggHints = hint.aggHints + }.Init(er.sctx, planCtx.builder.getSelectOffset()) + if hint := planCtx.builder.TableHints(); hint != nil { + plan4Agg.aggHints = hint.AggHints } plan4Agg.SetChildren(np) maxResultCol := &expression.Column{ @@ -778,12 +803,13 @@ func (er *expressionRewriter) handleNEAny(lexpr, rexpr expression.Expression, np gtFunc := expression.NewFunctionInternal(er.sctx, ast.GT, types.NewFieldType(mysql.TypeTiny), count, expression.NewOne()) neCond := expression.NewFunctionInternal(er.sctx, ast.NE, types.NewFieldType(mysql.TypeTiny), lexpr, maxResultCol) cond := expression.ComposeDNFCondition(er.sctx, gtFunc, neCond) - er.buildQuantifierPlan(plan4Agg, cond, lexpr, rexpr, false, markNoDecorrelate) + er.buildQuantifierPlan(planCtx, plan4Agg, cond, lexpr, rexpr, false, markNoDecorrelate) } // handleEQAll handles the case of = all. For example, if the query is t.id = all (select s.id from s), it will be rewrote to // t.id = (select s.id from s having count(distinct s.id) <= 1 and [all checker]). -func (er *expressionRewriter) handleEQAll(lexpr, rexpr expression.Expression, np LogicalPlan, markNoDecorrelate bool) { +func (er *expressionRewriter) handleEQAll(planCtx *exprRewriterPlanCtx, lexpr, rexpr expression.Expression, np LogicalPlan, markNoDecorrelate bool) { + intest.AssertNotNil(planCtx) firstRowFunc, err := aggregation.NewAggFuncDesc(er.sctx, ast.AggFuncFirstRow, []expression.Expression{rexpr}, false) if err != nil { er.err = err @@ -796,9 +822,9 @@ func (er *expressionRewriter) handleEQAll(lexpr, rexpr expression.Expression, np } plan4Agg := LogicalAggregation{ AggFuncs: []*aggregation.AggFuncDesc{firstRowFunc, countFunc}, - }.Init(er.sctx, er.b.getSelectOffset()) - if hint := er.b.TableHints(); hint != nil { - plan4Agg.aggHints = hint.aggHints + }.Init(er.sctx, planCtx.builder.getSelectOffset()) + if hint := planCtx.builder.TableHints(); hint != nil { + plan4Agg.aggHints = hint.AggHints } plan4Agg.SetChildren(np) plan4Agg.names = append(plan4Agg.names, types.EmptyName) @@ -827,71 +853,73 @@ func (er *expressionRewriter) handleEQAll(lexpr, rexpr expression.Expression, np leFunc := expression.NewFunctionInternal(er.sctx, ast.LE, types.NewFieldType(mysql.TypeTiny), count, expression.NewOne()) eqCond := expression.NewFunctionInternal(er.sctx, ast.EQ, types.NewFieldType(mysql.TypeTiny), lexpr, firstRowResultCol) cond := expression.ComposeCNFCondition(er.sctx, leFunc, eqCond) - er.buildQuantifierPlan(plan4Agg, cond, lexpr, rexpr, true, markNoDecorrelate) + er.buildQuantifierPlan(planCtx, plan4Agg, cond, lexpr, rexpr, true, markNoDecorrelate) } -func (er *expressionRewriter) handleExistSubquery(ctx context.Context, v *ast.ExistsSubqueryExpr) (ast.Node, bool) { - ci := er.b.prepareCTECheckForSubQuery() +func (er *expressionRewriter) handleExistSubquery(ctx context.Context, planCtx *exprRewriterPlanCtx, v *ast.ExistsSubqueryExpr) (ast.Node, bool) { + intest.AssertNotNil(planCtx) + b := planCtx.builder + ci := b.prepareCTECheckForSubQuery() defer resetCTECheckForSubQuery(ci) subq, ok := v.Sel.(*ast.SubqueryExpr) if !ok { er.err = errors.Errorf("Unknown exists type %T", v.Sel) return v, true } - np, hintFlags, err := er.buildSubquery(ctx, subq, handlingExistsSubquery) + np, hintFlags, err := er.buildSubquery(ctx, planCtx, subq, handlingExistsSubquery) if err != nil { er.err = err return v, true } - np = er.popExistsSubPlan(np) + np = er.popExistsSubPlan(planCtx, np) - noDecorrelate := hintFlags&HintFlagNoDecorrelate > 0 - if noDecorrelate && len(extractCorColumnsBySchema4LogicalPlan(np, er.p.Schema())) == 0 { - er.sctx.GetSessionVars().StmtCtx.AppendWarning(ErrInternal.GenWithStack( + noDecorrelate := hintFlags&hint.HintFlagNoDecorrelate > 0 + if noDecorrelate && len(extractCorColumnsBySchema4LogicalPlan(np, planCtx.plan.Schema())) == 0 { + er.sctx.GetSessionVars().StmtCtx.AppendWarning(ErrInternal.FastGen( "NO_DECORRELATE() is inapplicable because there are no correlated columns.")) noDecorrelate = false } - semiJoinRewrite := hintFlags&HintFlagSemiJoinRewrite > 0 + semiJoinRewrite := hintFlags&hint.HintFlagSemiJoinRewrite > 0 if semiJoinRewrite && noDecorrelate { - er.sctx.GetSessionVars().StmtCtx.AppendWarning(ErrInternal.GenWithStack( + er.sctx.GetSessionVars().StmtCtx.AppendWarning(ErrInternal.FastGen( "NO_DECORRELATE() and SEMI_JOIN_REWRITE() are in conflict. Both will be ineffective.")) noDecorrelate = false semiJoinRewrite = false } - if er.b.disableSubQueryPreprocessing || len(ExtractCorrelatedCols4LogicalPlan(np)) > 0 || hasCTEConsumerInSubPlan(np) { - er.p, er.err = er.b.buildSemiApply(er.p, np, nil, er.asScalar, v.Not, semiJoinRewrite, noDecorrelate) + if b.disableSubQueryPreprocessing || len(ExtractCorrelatedCols4LogicalPlan(np)) > 0 || hasCTEConsumerInSubPlan(np) { + planCtx.plan, er.err = b.buildSemiApply(planCtx.plan, np, nil, er.asScalar, v.Not, semiJoinRewrite, noDecorrelate) if er.err != nil || !er.asScalar { return v, true } - er.ctxStackAppend(er.p.Schema().Columns[er.p.Schema().Len()-1], er.p.OutputNames()[er.p.Schema().Len()-1]) + er.ctxStackAppend(planCtx.plan.Schema().Columns[planCtx.plan.Schema().Len()-1], planCtx.plan.OutputNames()[planCtx.plan.Schema().Len()-1]) } else { // We don't want nth_plan hint to affect separately executed subqueries here, so disable nth_plan temporarily. nthPlanBackup := er.sctx.GetSessionVars().StmtCtx.StmtHints.ForceNthPlan er.sctx.GetSessionVars().StmtCtx.StmtHints.ForceNthPlan = -1 - physicalPlan, _, err := DoOptimize(ctx, er.sctx, er.b.optFlag, np) + physicalPlan, _, err := DoOptimize(ctx, er.sctx, b.optFlag, np) er.sctx.GetSessionVars().StmtCtx.StmtHints.ForceNthPlan = nthPlanBackup if err != nil { er.err = err return v, true } - if er.b.ctx.GetSessionVars().StmtCtx.InExplainStmt && !er.b.ctx.GetSessionVars().StmtCtx.InExplainAnalyzeStmt && er.b.ctx.GetSessionVars().ExplainNonEvaledSubQuery { - newColID := er.b.ctx.GetSessionVars().AllocPlanColumnID() + if b.ctx.GetSessionVars().StmtCtx.InExplainStmt && !b.ctx.GetSessionVars().StmtCtx.InExplainAnalyzeStmt && b.ctx.GetSessionVars().ExplainNonEvaledSubQuery { + newColID := b.ctx.GetSessionVars().AllocPlanColumnID() subqueryCtx := ScalarSubqueryEvalCtx{ scalarSubQuery: physicalPlan, ctx: ctx, - is: er.b.is, + is: b.is, outputColIDs: []int64{newColID}, - }.Init(er.b.ctx, np.SelectBlockOffset()) + }.Init(b.ctx, np.QueryBlockOffset()) scalarSubQ := &ScalarSubQueryExpr{ scalarSubqueryColID: newColID, evalCtx: subqueryCtx, } scalarSubQ.RetType = np.Schema().Columns[0].GetType() scalarSubQ.SetCoercibility(np.Schema().Columns[0].Coercibility()) - er.b.ctx.GetSessionVars().RegisterScalarSubQ(subqueryCtx) + b.ctx.GetSessionVars().RegisterScalarSubQ(subqueryCtx) if v.Not { - notWrapped, err := expression.NewFunction(er.b.ctx, ast.UnaryNot, types.NewFieldType(mysql.TypeTiny), scalarSubQ) + notWrapped, err := expression.NewFunction(b.ctx, ast.UnaryNot, types.NewFieldType(mysql.TypeTiny), scalarSubQ) if err != nil { er.err = err return v, true @@ -902,7 +930,7 @@ func (er *expressionRewriter) handleExistSubquery(ctx context.Context, v *ast.Ex er.ctxStackAppend(scalarSubQ, types.EmptyName) return v, true } - row, err := EvalSubqueryFirstRow(ctx, physicalPlan, er.b.is, er.b.ctx) + row, err := EvalSubqueryFirstRow(ctx, physicalPlan, b.is, b.ctx) if err != nil { er.err = err return v, true @@ -918,7 +946,8 @@ func (er *expressionRewriter) handleExistSubquery(ctx context.Context, v *ast.Ex // popExistsSubPlan will remove the useless plan in exist's child. // See comments inside the method for more details. -func (er *expressionRewriter) popExistsSubPlan(p LogicalPlan) LogicalPlan { +func (er *expressionRewriter) popExistsSubPlan(planCtx *exprRewriterPlanCtx, p LogicalPlan) LogicalPlan { + intest.AssertNotNil(planCtx) out: for { switch plan := p.(type) { @@ -928,7 +957,7 @@ out: p = p.Children()[0] case *LogicalAggregation: if len(plan.GroupByItems) == 0 { - p = LogicalTableDual{RowCount: 1}.Init(er.sctx, er.b.getSelectOffset()) + p = LogicalTableDual{RowCount: 1}.Init(er.sctx, planCtx.builder.getSelectOffset()) break out } p = p.Children()[0] @@ -939,8 +968,9 @@ out: return p } -func (er *expressionRewriter) handleInSubquery(ctx context.Context, v *ast.PatternInExpr) (ast.Node, bool) { - ci := er.b.prepareCTECheckForSubQuery() +func (er *expressionRewriter) handleInSubquery(ctx context.Context, planCtx *exprRewriterPlanCtx, v *ast.PatternInExpr) (ast.Node, bool) { + intest.AssertNotNil(planCtx) + ci := planCtx.builder.prepareCTECheckForSubQuery() defer resetCTECheckForSubQuery(ci) asScalar := er.asScalar er.asScalar = true @@ -954,7 +984,7 @@ func (er *expressionRewriter) handleInSubquery(ctx context.Context, v *ast.Patte er.err = errors.Errorf("Unknown compare type %T", v.Sel) return v, true } - np, hintFlags, err := er.buildSubquery(ctx, subq, handlingInSubquery) + np, hintFlags, err := er.buildSubquery(ctx, planCtx, subq, handlingInSubquery) if err != nil { er.err = err return v, true @@ -1018,10 +1048,10 @@ func (er *expressionRewriter) handleInSubquery(ctx context.Context, v *ast.Patte lt, rt := lexpr.GetType(), rexpr.GetType() collFlag := collate.CompatibleCollate(lt.GetCollate(), rt.GetCollate()) - noDecorrelate := hintFlags&HintFlagNoDecorrelate > 0 - corCols := extractCorColumnsBySchema4LogicalPlan(np, er.p.Schema()) + noDecorrelate := hintFlags&hint.HintFlagNoDecorrelate > 0 + corCols := extractCorColumnsBySchema4LogicalPlan(np, planCtx.plan.Schema()) if len(corCols) == 0 && noDecorrelate { - er.sctx.GetSessionVars().StmtCtx.AppendWarning(ErrInternal.GenWithStack( + er.sctx.GetSessionVars().StmtCtx.AppendWarning(ErrInternal.FastGen( "NO_DECORRELATE() is inapplicable because there are no correlated columns.")) noDecorrelate = false } @@ -1032,30 +1062,30 @@ func (er *expressionRewriter) handleInSubquery(ctx context.Context, v *ast.Patte // and don't need to append a scalar value, we can rewrite it to inner join. if er.sctx.GetSessionVars().GetAllowInSubqToJoinAndAgg() && !v.Not && !asScalar && len(corCols) == 0 && collFlag { // We need to try to eliminate the agg and the projection produced by this operation. - er.b.optFlag |= flagEliminateAgg - er.b.optFlag |= flagEliminateProjection - er.b.optFlag |= flagJoinReOrder + planCtx.builder.optFlag |= flagEliminateAgg + planCtx.builder.optFlag |= flagEliminateProjection + planCtx.builder.optFlag |= flagJoinReOrder // Build distinct for the inner query. - agg, err := er.b.buildDistinct(np, np.Schema().Len()) + agg, err := planCtx.builder.buildDistinct(np, np.Schema().Len()) if err != nil { er.err = err return v, true } // Build inner join above the aggregation. - join := LogicalJoin{JoinType: InnerJoin}.Init(er.sctx, er.b.getSelectOffset()) - join.SetChildren(er.p, agg) - join.SetSchema(expression.MergeSchema(er.p.Schema(), agg.schema)) - join.names = make([]*types.FieldName, er.p.Schema().Len()+agg.Schema().Len()) - copy(join.names, er.p.OutputNames()) - copy(join.names[er.p.Schema().Len():], agg.OutputNames()) + join := LogicalJoin{JoinType: InnerJoin}.Init(er.sctx, planCtx.builder.getSelectOffset()) + join.SetChildren(planCtx.plan, agg) + join.SetSchema(expression.MergeSchema(planCtx.plan.Schema(), agg.schema)) + join.names = make([]*types.FieldName, planCtx.plan.Schema().Len()+agg.Schema().Len()) + copy(join.names, planCtx.plan.OutputNames()) + copy(join.names[planCtx.plan.Schema().Len():], agg.OutputNames()) join.AttachOnConds(expression.SplitCNFItems(checkCondition)) // Set join hint for this join. - if er.b.TableHints() != nil { - join.setPreferredJoinTypeAndOrder(er.b.TableHints()) + if planCtx.builder.TableHints() != nil { + join.setPreferredJoinTypeAndOrder(planCtx.builder.TableHints()) } - er.p = join + planCtx.plan = join } else { - er.p, er.err = er.b.buildSemiApply(er.p, np, expression.SplitCNFItems(checkCondition), asScalar, v.Not, false, noDecorrelate) + planCtx.plan, er.err = planCtx.builder.buildSemiApply(planCtx.plan, np, expression.SplitCNFItems(checkCondition), asScalar, v.Not, false, noDecorrelate) if er.err != nil { return v, true } @@ -1063,31 +1093,32 @@ func (er *expressionRewriter) handleInSubquery(ctx context.Context, v *ast.Patte er.ctxStackPop(1) if asScalar { - col := er.p.Schema().Columns[er.p.Schema().Len()-1] - er.ctxStackAppend(col, er.p.OutputNames()[er.p.Schema().Len()-1]) + col := planCtx.plan.Schema().Columns[planCtx.plan.Schema().Len()-1] + er.ctxStackAppend(col, planCtx.plan.OutputNames()[planCtx.plan.Schema().Len()-1]) } return v, true } -func (er *expressionRewriter) handleScalarSubquery(ctx context.Context, v *ast.SubqueryExpr) (ast.Node, bool) { - ci := er.b.prepareCTECheckForSubQuery() +func (er *expressionRewriter) handleScalarSubquery(ctx context.Context, planCtx *exprRewriterPlanCtx, v *ast.SubqueryExpr) (ast.Node, bool) { + intest.AssertNotNil(planCtx) + ci := planCtx.builder.prepareCTECheckForSubQuery() defer resetCTECheckForSubQuery(ci) - np, hintFlags, err := er.buildSubquery(ctx, v, handlingScalarSubquery) + np, hintFlags, err := er.buildSubquery(ctx, planCtx, v, handlingScalarSubquery) if err != nil { er.err = err return v, true } - np = er.b.buildMaxOneRow(np) + np = planCtx.builder.buildMaxOneRow(np) - noDecorrelate := hintFlags&HintFlagNoDecorrelate > 0 - if noDecorrelate && len(extractCorColumnsBySchema4LogicalPlan(np, er.p.Schema())) == 0 { - er.sctx.GetSessionVars().StmtCtx.AppendWarning(ErrInternal.GenWithStack( + noDecorrelate := hintFlags&hint.HintFlagNoDecorrelate > 0 + if noDecorrelate && len(extractCorColumnsBySchema4LogicalPlan(np, planCtx.plan.Schema())) == 0 { + er.sctx.GetSessionVars().StmtCtx.AppendWarning(ErrInternal.FastGen( "NO_DECORRELATE() is inapplicable because there are no correlated columns.")) noDecorrelate = false } - if er.b.disableSubQueryPreprocessing || len(ExtractCorrelatedCols4LogicalPlan(np)) > 0 || hasCTEConsumerInSubPlan(np) { - er.p = er.b.buildApplyWithJoinType(er.p, np, LeftOuterJoin, noDecorrelate) + if planCtx.builder.disableSubQueryPreprocessing || len(ExtractCorrelatedCols4LogicalPlan(np)) > 0 || hasCTEConsumerInSubPlan(np) { + planCtx.plan = planCtx.builder.buildApplyWithJoinType(planCtx.plan, np, LeftOuterJoin, noDecorrelate) if np.Schema().Len() > 1 { newCols := make([]expression.Expression, 0, np.Schema().Len()) for _, col := range np.Schema().Columns { @@ -1100,29 +1131,29 @@ func (er *expressionRewriter) handleScalarSubquery(ctx context.Context, v *ast.S } er.ctxStackAppend(expr, types.EmptyName) } else { - er.ctxStackAppend(er.p.Schema().Columns[er.p.Schema().Len()-1], er.p.OutputNames()[er.p.Schema().Len()-1]) + er.ctxStackAppend(planCtx.plan.Schema().Columns[planCtx.plan.Schema().Len()-1], planCtx.plan.OutputNames()[planCtx.plan.Schema().Len()-1]) } return v, true } // We don't want nth_plan hint to affect separately executed subqueries here, so disable nth_plan temporarily. nthPlanBackup := er.sctx.GetSessionVars().StmtCtx.StmtHints.ForceNthPlan er.sctx.GetSessionVars().StmtCtx.StmtHints.ForceNthPlan = -1 - physicalPlan, _, err := DoOptimize(ctx, er.sctx, er.b.optFlag, np) + physicalPlan, _, err := DoOptimize(ctx, er.sctx, planCtx.builder.optFlag, np) er.sctx.GetSessionVars().StmtCtx.StmtHints.ForceNthPlan = nthPlanBackup if err != nil { er.err = err return v, true } - if er.b.ctx.GetSessionVars().StmtCtx.InExplainStmt && !er.b.ctx.GetSessionVars().StmtCtx.InExplainAnalyzeStmt && er.b.ctx.GetSessionVars().ExplainNonEvaledSubQuery { + if planCtx.builder.ctx.GetSessionVars().StmtCtx.InExplainStmt && !planCtx.builder.ctx.GetSessionVars().StmtCtx.InExplainAnalyzeStmt && planCtx.builder.ctx.GetSessionVars().ExplainNonEvaledSubQuery { subqueryCtx := ScalarSubqueryEvalCtx{ scalarSubQuery: physicalPlan, ctx: ctx, - is: er.b.is, - }.Init(er.b.ctx, np.SelectBlockOffset()) + is: planCtx.builder.is, + }.Init(planCtx.builder.ctx, np.QueryBlockOffset()) newColIDs := make([]int64, 0, np.Schema().Len()) newScalarSubQueryExprs := make([]expression.Expression, 0, np.Schema().Len()) for _, col := range np.Schema().Columns { - newColID := er.b.ctx.GetSessionVars().AllocPlanColumnID() + newColID := planCtx.builder.ctx.GetSessionVars().AllocPlanColumnID() scalarSubQ := &ScalarSubQueryExpr{ scalarSubqueryColID: newColID, evalCtx: subqueryCtx, @@ -1134,7 +1165,7 @@ func (er *expressionRewriter) handleScalarSubquery(ctx context.Context, v *ast.S } subqueryCtx.outputColIDs = newColIDs - er.b.ctx.GetSessionVars().RegisterScalarSubQ(subqueryCtx) + planCtx.builder.ctx.GetSessionVars().RegisterScalarSubQ(subqueryCtx) if len(newScalarSubQueryExprs) == 1 { er.ctxStackAppend(newScalarSubQueryExprs[0], types.EmptyName) } else { @@ -1147,7 +1178,7 @@ func (er *expressionRewriter) handleScalarSubquery(ctx context.Context, v *ast.S } return v, true } - row, err := EvalSubqueryFirstRow(ctx, physicalPlan, er.b.is, er.b.ctx) + row, err := EvalSubqueryFirstRow(ctx, physicalPlan, planCtx.builder.is, planCtx.builder.ctx) if err != nil { er.err = err return v, true @@ -1218,6 +1249,7 @@ func (er *expressionRewriter) Leave(originInNode ast.Node) (retNode ast.Node, ok if er.preprocess != nil { inNode = er.preprocess(inNode) } + planCtx := er.planCtx switch v := inNode.(type) { case *ast.AggregateFuncExpr, *ast.ColumnNameExpr, *ast.ParenthesesExpr, *ast.WhenClause, *ast.SubqueryExpr, *ast.ExistsSubqueryExpr, *ast.CompareSubqueryExpr, *ast.ValuesExpr, *ast.WindowFuncExpr, *ast.TableNameExpr: @@ -1251,7 +1283,7 @@ func (er *expressionRewriter) Leave(originInNode ast.Node) (retNode ast.Node, ok } er.ctxStackAppend(value, types.EmptyName) case *ast.VariableExpr: - er.rewriteVariable(v) + er.rewriteVariable(planCtx, v) case *ast.FuncCallExpr: if _, ok := expression.TryFoldFunctions[v.FnName.L]; ok { er.tryFoldCounter-- @@ -1282,7 +1314,8 @@ func (er *expressionRewriter) Leave(originInNode ast.Node) (retNode ast.Node, ok er.disableFoldCounter-- } case *ast.FuncCastExpr: - if v.Tp.IsArray() && !er.b.allowBuildCastArray { + intest.AssertNotNil(planCtx) + if v.Tp.IsArray() && !planCtx.builder.allowBuildCastArray { er.err = expression.ErrNotSupportedYet.GenWithStackByArgs("Use of CAST( .. AS .. ARRAY) outside of functional index in CREATE(non-SELECT)/ALTER TABLE or in general expressions") return retNode, false } @@ -1328,13 +1361,13 @@ func (er *expressionRewriter) Leave(originInNode ast.Node) (retNode ast.Node, ok er.inToExpression(len(v.List), v.Not, &v.Type) } case *ast.PositionExpr: - er.positionToScalarFunc(v) + er.positionToScalarFunc(planCtx, v) case *ast.IsNullExpr: er.isNullToExpression(v) case *ast.IsTruthExpr: er.isTrueToScalarFunc(v) case *ast.DefaultExpr: - er.evalDefaultExpr(v) + er.evalDefaultExpr(planCtx, v) // TODO: Perhaps we don't need to transcode these back to generic integers/strings case *ast.TrimDirectionExpr: er.ctxStackAppend(&expression.Constant{ @@ -1419,7 +1452,7 @@ func (er *expressionRewriter) newFunctionWithInit(funcName string, retType *type return } if scalarFunc, ok := ret.(*expression.ScalarFunction); ok { - er.b.ctx.BuiltinFunctionUsageInc(scalarFunc.Function.PbCode().String()) + er.sctx.BuiltinFunctionUsageInc(scalarFunc.Function.PbCode().String()) } return } @@ -1440,10 +1473,10 @@ func (er *expressionRewriter) useCache() bool { return er.sctx.GetSessionVars().StmtCtx.UseCache } -func (er *expressionRewriter) rewriteVariable(v *ast.VariableExpr) { +func (er *expressionRewriter) rewriteVariable(planCtx *exprRewriterPlanCtx, v *ast.VariableExpr) { stkLen := len(er.ctxStack) name := strings.ToLower(v.Name) - sessionVars := er.b.ctx.GetSessionVars() + sessionVars := planCtx.builder.ctx.GetSessionVars() if !v.IsSystem { if v.Value != nil { tp := er.ctxStack[stkLen-1].GetType() @@ -1484,11 +1517,11 @@ func (er *expressionRewriter) rewriteVariable(v *ast.VariableExpr) { } if sysVar.IsNoop && !variable.EnableNoopVariables.Load() { // The variable does nothing, append a warning to the statement output. - sessionVars.StmtCtx.AppendWarning(ErrGettingNoopVariable.GenWithStackByArgs(sysVar.Name)) + sessionVars.StmtCtx.AppendWarning(ErrGettingNoopVariable.FastGenByArgs(sysVar.Name)) } if sem.IsEnabled() && sem.IsInvisibleSysVar(sysVar.Name) { err := ErrSpecificAccessDenied.GenWithStackByArgs("RESTRICTED_VARIABLES_ADMIN") - er.b.visitInfo = appendDynamicVisitInfo(er.b.visitInfo, "RESTRICTED_VARIABLES_ADMIN", false, err) + planCtx.builder.visitInfo = appendDynamicVisitInfo(planCtx.builder.visitInfo, "RESTRICTED_VARIABLES_ADMIN", false, err) } if v.ExplicitScope && !sysVar.HasNoneScope() { if v.IsGlobal && !(sysVar.HasGlobalScope() || sysVar.HasInstanceScope()) { @@ -1609,7 +1642,8 @@ func (er *expressionRewriter) isNullToExpression(v *ast.IsNullExpr) { er.ctxStackAppend(function, types.EmptyName) } -func (er *expressionRewriter) positionToScalarFunc(v *ast.PositionExpr) { +func (er *expressionRewriter) positionToScalarFunc(planCtx *exprRewriterPlanCtx, v *ast.PositionExpr) { + intest.AssertNotNil(planCtx) pos := v.N str := strconv.Itoa(pos) if v.P != nil { @@ -1629,7 +1663,7 @@ func (er *expressionRewriter) positionToScalarFunc(v *ast.PositionExpr) { if er.err == nil && pos > 0 && pos <= er.schema.Len() && !er.schema.Columns[pos-1].IsHidden { er.ctxStackAppend(er.schema.Columns[pos-1], er.names[pos-1]) } else { - er.err = ErrUnknownColumn.GenWithStackByArgs(str, clauseMsg[er.b.curClause]) + er.err = ErrUnknownColumn.GenWithStackByArgs(str, clauseMsg[planCtx.builder.curClause]) } } @@ -2106,7 +2140,9 @@ func (er *expressionRewriter) funcCallToExpression(v *ast.FuncCallExpr) { // collecting those gid as a collection and filling it into the grouping function meta. Besides, // the first arg of grouping function should be rewritten as gid column defined/passed by Expand // from the bottom up. - if er.rollExpand == nil { + planCtx := er.planCtx + intest.AssertNotNil(planCtx) + if planCtx.rollExpand == nil { er.err = ErrInvalidGroupFuncUse er.ctxStackAppend(nil, types.EmptyName) } else { @@ -2125,15 +2161,15 @@ func (er *expressionRewriter) funcCallToExpression(v *ast.FuncCallExpr) { return } // resolve grouping args in group by items or not. - resolvedCols, err := er.rollExpand.resolveGroupingFuncArgsInGroupBy(args) + resolvedCols, err := planCtx.rollExpand.resolveGroupingFuncArgsInGroupBy(args) if err != nil { er.err = err er.ctxStackAppend(nil, types.EmptyName) return } - newArg := er.rollExpand.GID.Clone() + newArg := planCtx.rollExpand.GID.Clone() init := func(groupingFunc *expression.ScalarFunction) (expression.Expression, error) { - err = groupingFunc.Function.(*expression.BuiltinGroupingImplSig).SetMetadata(er.rollExpand.GroupingMode, er.rollExpand.GenerateGroupingMarks(resolvedCols)) + err = groupingFunc.Function.(*expression.BuiltinGroupingImplSig).SetMetadata(planCtx.rollExpand.GroupingMode, planCtx.rollExpand.GenerateGroupingMarks(resolvedCols)) return groupingFunc, err } function, er.err = er.newFunctionWithInit(v.FnName.L, &v.Type, init, newArg) @@ -2160,6 +2196,8 @@ func (er *expressionRewriter) toTable(v *ast.TableName) { } func (er *expressionRewriter) toColumn(v *ast.ColumnName) { + planCtx := er.planCtx + intest.AssertNotNil(planCtx) idx, err := expression.FindFieldName(er.names, v) if err != nil { er.err = ErrAmbiguous.GenWithStackByArgs(v.Name, clauseMsg[fieldList]) @@ -2168,13 +2206,13 @@ func (er *expressionRewriter) toColumn(v *ast.ColumnName) { if idx >= 0 { column := er.schema.Columns[idx] if column.IsHidden { - er.err = ErrUnknownColumn.GenWithStackByArgs(v.Name, clauseMsg[er.b.curClause]) + er.err = ErrUnknownColumn.GenWithStackByArgs(v.Name, clauseMsg[planCtx.builder.curClause]) return } er.ctxStackAppend(column, er.names[idx]) return } - col, name, err := findFieldNameFromNaturalUsingJoin(er.p, v) + col, name, err := findFieldNameFromNaturalUsingJoin(planCtx.plan, v) if err != nil { er.err = err return @@ -2182,8 +2220,8 @@ func (er *expressionRewriter) toColumn(v *ast.ColumnName) { er.ctxStackAppend(col, name) return } - for i := len(er.b.outerSchemas) - 1; i >= 0; i-- { - outerSchema, outerName := er.b.outerSchemas[i], er.b.outerNames[i] + for i := len(planCtx.builder.outerSchemas) - 1; i >= 0; i-- { + outerSchema, outerName := planCtx.builder.outerSchemas[i], planCtx.builder.outerNames[i] idx, err = expression.FindFieldName(outerName, v) if idx >= 0 { column := outerSchema.Columns[idx] @@ -2195,14 +2233,14 @@ func (er *expressionRewriter) toColumn(v *ast.ColumnName) { return } } - if _, ok := er.p.(*LogicalUnionAll); ok && v.Table.O != "" { - er.err = ErrTablenameNotAllowedHere.GenWithStackByArgs(v.Table.O, "SELECT", clauseMsg[er.b.curClause]) + if _, ok := planCtx.plan.(*LogicalUnionAll); ok && v.Table.O != "" { + er.err = ErrTablenameNotAllowedHere.GenWithStackByArgs(v.Table.O, "SELECT", clauseMsg[planCtx.builder.curClause]) return } - if er.b.curClause == globalOrderByClause { - er.b.curClause = orderByClause + if planCtx.builder.curClause == globalOrderByClause { + planCtx.builder.curClause = orderByClause } - er.err = ErrUnknownColumn.GenWithStackByArgs(v.String(), clauseMsg[er.b.curClause]) + er.err = ErrUnknownColumn.GenWithStackByArgs(v.String(), clauseMsg[planCtx.builder.curClause]) } func findFieldNameFromNaturalUsingJoin(p LogicalPlan, v *ast.ColumnName) (col *expression.Column, name *types.FieldName, err error) { @@ -2223,7 +2261,8 @@ func findFieldNameFromNaturalUsingJoin(p LogicalPlan, v *ast.ColumnName) (col *e return nil, nil, nil } -func (er *expressionRewriter) evalDefaultExpr(v *ast.DefaultExpr) { +func (er *expressionRewriter) evalDefaultExpr(planCtx *exprRewriterPlanCtx, v *ast.DefaultExpr) { + intest.AssertNotNil(planCtx) var name *types.FieldName // Here we will find the corresponding column for default function. At the same time, we need to consider the issue // of subquery and name space. @@ -2232,14 +2271,14 @@ func (er *expressionRewriter) evalDefaultExpr(v *ast.DefaultExpr) { // Refer to the behavior of MySQL, we need to find column a in table t2. If table t2 does not have column a, then find it // in table t1. If there are none, return an error message. // Based on the above description, we need to look in er.b.allNames from back to front. - for i := len(er.b.allNames) - 1; i >= 0; i-- { - idx, err := expression.FindFieldName(er.b.allNames[i], v.Name) + for i := len(planCtx.builder.allNames) - 1; i >= 0; i-- { + idx, err := expression.FindFieldName(planCtx.builder.allNames[i], v.Name) if err != nil { er.err = err return } if idx >= 0 { - name = er.b.allNames[i][idx] + name = planCtx.builder.allNames[i][idx] break } } @@ -2269,7 +2308,7 @@ func (er *expressionRewriter) evalDefaultExpr(v *ast.DefaultExpr) { return } var tbl table.Table - tbl, er.err = er.b.is.TableByName(dbName, name.OrigTblName) + tbl, er.err = planCtx.builder.is.TableByName(dbName, name.OrigTblName) if er.err != nil { return } @@ -2297,7 +2336,7 @@ func (er *expressionRewriter) evalDefaultExpr(v *ast.DefaultExpr) { } default: // for other columns, just use what it is - val, er.err = er.b.getDefaultValue(col) + val, er.err = planCtx.builder.getDefaultValue(col) } if er.err != nil { return @@ -2314,11 +2353,11 @@ func hasCurrentDatetimeDefault(col *table.Column) bool { return strings.ToLower(x) == ast.CurrentTimestamp } -func decodeKeyFromString(ctx sessionctx.Context, s string) string { +func decodeKeyFromString(ctx expression.EvalContext, s string) string { sc := ctx.GetSessionVars().StmtCtx key, err := hex.DecodeString(s) if err != nil { - sc.AppendWarning(errors.Errorf("invalid key: %X", key)) + sc.AppendWarning(errors.NewNoStackErrorf("invalid key: %X", key)) return s } // Auto decode byte if needed. @@ -2328,17 +2367,13 @@ func decodeKeyFromString(ctx sessionctx.Context, s string) string { } tableID := tablecodec.DecodeTableID(key) if tableID == 0 { - sc.AppendWarning(errors.Errorf("invalid key: %X", key)) - return s - } - dm := domain.GetDomain(ctx) - if dm == nil { - sc.AppendWarning(errors.Errorf("domain not found when decoding key: %X", key)) + sc.AppendWarning(errors.NewNoStackErrorf("invalid key: %X", key)) return s } - is := dm.InfoSchema() - if is == nil { - sc.AppendWarning(errors.Errorf("infoschema not found when decoding key: %X", key)) + + is, ok := ctx.GetDomainInfoSchema().(infoschema.InfoSchema) + if !ok { + sc.AppendWarning(errors.NewNoStackErrorf("infoschema not found when decoding key: %X", key)) return s } tbl, _ := infoschema.FindTableByTblOrPartID(is, tableID) @@ -2365,7 +2400,7 @@ func decodeKeyFromString(ctx sessionctx.Context, s string) string { } return ret } - sc.AppendWarning(errors.Errorf("invalid key: %X", key)) + sc.AppendWarning(errors.NewNoStackErrorf("invalid key: %X", key)) return s } diff --git a/pkg/planner/core/find_best_task.go b/pkg/planner/core/find_best_task.go index 9d043b5e955a2..55247b0979f49 100644 --- a/pkg/planner/core/find_best_task.go +++ b/pkg/planner/core/find_best_task.go @@ -33,12 +33,12 @@ import ( "github.com/pingcap/tidb/pkg/planner/util" "github.com/pingcap/tidb/pkg/planner/util/fixcontrol" "github.com/pingcap/tidb/pkg/sessionctx" - "github.com/pingcap/tidb/pkg/sessionctx/stmtctx" "github.com/pingcap/tidb/pkg/statistics" "github.com/pingcap/tidb/pkg/types" tidbutil "github.com/pingcap/tidb/pkg/util" "github.com/pingcap/tidb/pkg/util/chunk" "github.com/pingcap/tidb/pkg/util/collate" + h "github.com/pingcap/tidb/pkg/util/hint" "github.com/pingcap/tidb/pkg/util/logutil" "github.com/pingcap/tidb/pkg/util/ranger" "github.com/pingcap/tidb/pkg/util/tracing" @@ -150,7 +150,7 @@ func (p *LogicalTableDual) findBestTask(prop *property.PhysicalProperty, planCou } dual := PhysicalTableDual{ RowCount: p.RowCount, - }.Init(p.SCtx(), p.StatsInfo(), p.SelectBlockOffset()) + }.Init(p.SCtx(), p.StatsInfo(), p.QueryBlockOffset()) dual.SetSchema(p.schema) planCounter.Dec(1) opt.appendCandidate(p, dual, prop) @@ -685,7 +685,7 @@ func (p *LogicalMemTable) findBestTask(prop *property.PhysicalProperty, planCoun Columns: p.Columns, Extractor: p.Extractor, QueryTimeRange: p.QueryTimeRange, - }.Init(p.SCtx(), p.StatsInfo(), p.SelectBlockOffset()) + }.Init(p.SCtx(), p.StatsInfo(), p.QueryBlockOffset()) memTable.SetSchema(p.schema) planCounter.Dec(1) opt.appendCandidate(p, memTable, prop) @@ -701,7 +701,7 @@ func (ds *DataSource) tryToGetDualTask() (task, error) { return nil, err } if !result { - dual := PhysicalTableDual{}.Init(ds.SCtx(), ds.StatsInfo(), ds.SelectBlockOffset()) + dual := PhysicalTableDual{}.Init(ds.SCtx(), ds.StatsInfo(), ds.QueryBlockOffset()) dual.SetSchema(ds.schema) return &rootTask{ p: dual, @@ -1119,7 +1119,7 @@ func (ds *DataSource) findBestTask(prop *property.PhysicalProperty, planCounter pruningInfo := ds.getPruningInfo(candidates, prop) defer func() { if err == nil && t != nil && !t.invalid() && pruningInfo != "" { - warnErr := errors.New(pruningInfo) + warnErr := errors.NewNoStackError(pruningInfo) if ds.SCtx().GetSessionVars().StmtCtx.InVerboseExplain { ds.SCtx().GetSessionVars().StmtCtx.AppendNote(warnErr) } else { @@ -1160,7 +1160,7 @@ func (ds *DataSource) findBestTask(prop *property.PhysicalProperty, planCounter if expression.MaybeOverOptimized4PlanCache(ds.SCtx(), path.AccessConds) { ds.SCtx().GetSessionVars().StmtCtx.SetSkipPlanCache(errors.Errorf("get a TableDual plan")) } - dual := PhysicalTableDual{}.Init(ds.SCtx(), ds.StatsInfo(), ds.SelectBlockOffset()) + dual := PhysicalTableDual{}.Init(ds.SCtx(), ds.StatsInfo(), ds.QueryBlockOffset()) dual.SetSchema(ds.schema) cntPlan++ planCounter.Dec(1) @@ -1258,10 +1258,10 @@ func (ds *DataSource) findBestTask(prop *property.PhysicalProperty, planCounter } } if path.IsTablePath() { - if ds.preferStoreType&preferTiFlash != 0 && path.StoreType == kv.TiKV { + if ds.preferStoreType&h.PreferTiFlash != 0 && path.StoreType == kv.TiKV { continue } - if ds.preferStoreType&preferTiKV != 0 && path.StoreType == kv.TiFlash { + if ds.preferStoreType&h.PreferTiKV != 0 && path.StoreType == kv.TiFlash { continue } var tblTask task @@ -1291,7 +1291,7 @@ func (ds *DataSource) findBestTask(prop *property.PhysicalProperty, planCounter continue } // TiFlash storage do not support index scan. - if ds.preferStoreType&preferTiFlash != 0 { + if ds.preferStoreType&h.PreferTiFlash != 0 { continue } idxTask, err := ds.convertToIndexScan(prop, candidate, opt) @@ -1346,7 +1346,7 @@ func (ds *DataSource) convertToIndexMergeScan(prop *property.PhysicalProperty, c indexPlanFinished: false, tblColHists: ds.TblColHists, } - cop.partitionInfo = PartitionInfo{ + cop.physPlanPartInfo = PhysPlanPartInfo{ PruningConds: pushDownNot(ds.SCtx(), ds.allConds), PartitionNames: ds.partitionNames, Columns: ds.TblCols, @@ -1432,7 +1432,7 @@ func (ds *DataSource) convertToPartialIndexScan(prop *property.PhysicalProperty, if ds.statisticTable.Pseudo { stats.StatsVersion = statistics.PseudoVersion } - indexPlan := PhysicalSelection{Conditions: indexConds}.Init(is.SCtx(), stats, ds.SelectBlockOffset()) + indexPlan := PhysicalSelection{Conditions: indexConds}.Init(is.SCtx(), stats, ds.QueryBlockOffset()) indexPlan.SetChildren(is) return indexPlan } @@ -1473,7 +1473,7 @@ func (ds *DataSource) convertToPartialTableScan(prop *property.PhysicalProperty, logutil.BgLogger().Debug("calculate selectivity failed, use selection factor", zap.Error(err)) selectivity = SelectionFactor } - tablePlan = PhysicalSelection{Conditions: ts.filterCondition}.Init(ts.SCtx(), ts.StatsInfo().ScaleByExpectCnt(selectivity*rowCount), ds.SelectBlockOffset()) + tablePlan = PhysicalSelection{Conditions: ts.filterCondition}.Init(ts.SCtx(), ts.StatsInfo().ScaleByExpectCnt(selectivity*rowCount), ds.QueryBlockOffset()) tablePlan.SetChildren(ts) return tablePlan } @@ -1523,7 +1523,6 @@ func setIndexMergeTableScanHandleCols(ds *DataSource, ts *PhysicalTableScan) (er // Filters that cannot be pushed to TiKV are also returned, and an extra Selection above IndexMergeReader will be constructed later. func (ds *DataSource) buildIndexMergeTableScan(tableFilters []expression.Expression, totalRowCount float64, matchProp bool) (PhysicalPlan, []expression.Expression, bool, error) { - sessVars := ds.SCtx().GetSessionVars() ts := PhysicalTableScan{ Table: ds.tableInfo, Columns: slices.Clone(ds.Columns), @@ -1534,7 +1533,7 @@ func (ds *DataSource) buildIndexMergeTableScan(tableFilters []expression.Express HandleCols: ds.handleCols, tblCols: ds.TblCols, tblColHists: ds.TblColHists, - }.Init(ds.SCtx(), ds.SelectBlockOffset()) + }.Init(ds.SCtx(), ds.QueryBlockOffset()) ts.SetSchema(ds.schema.Clone()) err := setIndexMergeTableScanHandleCols(ds, ts) if err != nil { @@ -1550,7 +1549,7 @@ func (ds *DataSource) buildIndexMergeTableScan(tableFilters []expression.Express } var currentTopPlan PhysicalPlan = ts if len(tableFilters) > 0 { - pushedFilters, remainingFilters := extractFiltersForIndexMerge(sessVars.StmtCtx, ds.SCtx().GetClient(), tableFilters) + pushedFilters, remainingFilters := extractFiltersForIndexMerge(ds.SCtx(), ds.SCtx().GetClient(), tableFilters) pushedFilters1, remainingFilters1 := SplitSelCondsWithVirtualColumn(pushedFilters) pushedFilters = pushedFilters1 remainingFilters = append(remainingFilters, remainingFilters1...) @@ -1560,7 +1559,7 @@ func (ds *DataSource) buildIndexMergeTableScan(tableFilters []expression.Express logutil.BgLogger().Debug("calculate selectivity failed, use selection factor", zap.Error(err)) selectivity = SelectionFactor } - sel := PhysicalSelection{Conditions: pushedFilters}.Init(ts.SCtx(), ts.StatsInfo().ScaleByExpectCnt(selectivity*totalRowCount), ts.SelectBlockOffset()) + sel := PhysicalSelection{Conditions: pushedFilters}.Init(ts.SCtx(), ts.StatsInfo().ScaleByExpectCnt(selectivity*totalRowCount), ts.QueryBlockOffset()) sel.SetChildren(ts) currentTopPlan = sel } @@ -1616,13 +1615,13 @@ func (ds *DataSource) buildIndexMergeTableScan(tableFilters []expression.Express // // But the new Selection should exclude the exprs that can NOT be pushed to ALL the storage engines. // Because these exprs have already been put in another Selection(check rule_predicate_push_down). -func extractFiltersForIndexMerge(sc *stmtctx.StatementContext, client kv.Client, filters []expression.Expression) (pushed []expression.Expression, remaining []expression.Expression) { +func extractFiltersForIndexMerge(ctx sessionctx.Context, client kv.Client, filters []expression.Expression) (pushed []expression.Expression, remaining []expression.Expression) { for _, expr := range filters { - if expression.CanExprsPushDown(sc, []expression.Expression{expr}, client, kv.TiKV) { + if expression.CanExprsPushDown(ctx, []expression.Expression{expr}, client, kv.TiKV) { pushed = append(pushed, expr) continue } - if expression.CanExprsPushDown(sc, []expression.Expression{expr}, client, kv.UnSpecified) { + if expression.CanExprsPushDown(ctx, []expression.Expression{expr}, client, kv.UnSpecified) { remaining = append(remaining, expr) } } @@ -1758,7 +1757,7 @@ func (ds *DataSource) convertToIndexScan(prop *property.PhysicalProperty, tblCols: ds.TblCols, expectCnt: uint64(prop.ExpectedCnt), } - cop.partitionInfo = PartitionInfo{ + cop.physPlanPartInfo = PhysPlanPartInfo{ PruningConds: pushDownNot(ds.SCtx(), ds.allConds), PartitionNames: ds.partitionNames, Columns: ds.TblCols, @@ -1775,7 +1774,7 @@ func (ds *DataSource) convertToIndexScan(prop *property.PhysicalProperty, physicalTableID: ds.physicalTableID, tblCols: ds.TblCols, tblColHists: ds.TblColHists, - }.Init(ds.SCtx(), is.SelectBlockOffset()) + }.Init(ds.SCtx(), is.QueryBlockOffset()) ts.SetSchema(ds.schema.Clone()) // We set `StatsVersion` here and fill other fields in `(*copTask).finishIndexPlan`. Since `copTask.indexPlan` may // change before calling `(*copTask).finishIndexPlan`, we don't know the stats information of `ts` currently and on @@ -1944,10 +1943,10 @@ func (is *PhysicalIndexScan) addPushedDownSelection(copTask *copTask, p *DataSou tableConds, copTask.rootTaskConds = SplitSelCondsWithVirtualColumn(tableConds) var newRootConds []expression.Expression - indexConds, newRootConds = expression.PushDownExprs(is.SCtx().GetSessionVars().StmtCtx, indexConds, is.SCtx().GetClient(), kv.TiKV) + indexConds, newRootConds = expression.PushDownExprs(is.SCtx(), indexConds, is.SCtx().GetClient(), kv.TiKV) copTask.rootTaskConds = append(copTask.rootTaskConds, newRootConds...) - tableConds, newRootConds = expression.PushDownExprs(is.SCtx().GetSessionVars().StmtCtx, tableConds, is.SCtx().GetClient(), kv.TiKV) + tableConds, newRootConds = expression.PushDownExprs(is.SCtx(), tableConds, is.SCtx().GetClient(), kv.TiKV) copTask.rootTaskConds = append(copTask.rootTaskConds, newRootConds...) if indexConds != nil { @@ -1957,13 +1956,13 @@ func (is *PhysicalIndexScan) addPushedDownSelection(copTask *copTask, p *DataSou } count := is.StatsInfo().RowCount * selectivity stats := p.tableStats.ScaleByExpectCnt(count) - indexSel := PhysicalSelection{Conditions: indexConds}.Init(is.SCtx(), stats, is.SelectBlockOffset()) + indexSel := PhysicalSelection{Conditions: indexConds}.Init(is.SCtx(), stats, is.QueryBlockOffset()) indexSel.SetChildren(is) copTask.indexPlan = indexSel } if len(tableConds) > 0 { copTask.finishIndexPlan() - tableSel := PhysicalSelection{Conditions: tableConds}.Init(is.SCtx(), finalStats, is.SelectBlockOffset()) + tableSel := PhysicalSelection{Conditions: tableConds}.Init(is.SCtx(), finalStats, is.QueryBlockOffset()) if len(copTask.rootTaskConds) != 0 { selectivity, _, err := cardinality.Selectivity(is.SCtx(), copTask.tblColHists, tableConds, nil) if err != nil { @@ -2051,7 +2050,7 @@ func (s *LogicalTableScan) GetPhysicalScan(schema *expression.Schema, stats *pro AccessCondition: s.AccessConds, tblCols: ds.TblCols, tblColHists: ds.TblColHists, - }.Init(s.SCtx(), s.SelectBlockOffset()) + }.Init(s.SCtx(), s.QueryBlockOffset()) ts.SetStats(stats) ts.SetSchema(schema.Clone()) return ts @@ -2075,7 +2074,7 @@ func (s *LogicalIndexScan) GetPhysicalIndexScan(_ *expression.Schema, stats *pro physicalTableID: ds.physicalTableID, tblColHists: ds.TblColHists, pkIsHandleCol: ds.getPKIsHandleCol(), - }.Init(ds.SCtx(), ds.SelectBlockOffset()) + }.Init(ds.SCtx(), ds.QueryBlockOffset()) is.SetStats(stats) is.initSchema(s.FullIdxCols, s.IsDoubleRead) return is @@ -2180,7 +2179,7 @@ func (ds *DataSource) convertToTableScan(prop *property.PhysicalProperty, candid partTp: property.AnyType, tblColHists: ds.TblColHists, } - ts.PartitionInfo = PartitionInfo{ + ts.PlanPartInfo = PhysPlanPartInfo{ PruningConds: pushDownNot(ds.SCtx(), ds.allConds), PartitionNames: ds.partitionNames, Columns: ds.TblCols, @@ -2214,13 +2213,13 @@ func (ds *DataSource) convertToTableScan(prop *property.PhysicalProperty, candid indexPlanFinished: true, tblColHists: ds.TblColHists, } - copTask.partitionInfo = PartitionInfo{ + copTask.physPlanPartInfo = PhysPlanPartInfo{ PruningConds: pushDownNot(ds.SCtx(), ds.allConds), PartitionNames: ds.partitionNames, Columns: ds.TblCols, ColumnNames: ds.names, } - ts.PartitionInfo = copTask.partitionInfo + ts.PlanPartInfo = copTask.physPlanPartInfo task = copTask if candidate.isMatchProp { copTask.keepOrder = true @@ -2268,7 +2267,7 @@ func (ds *DataSource) convertToSampleTable(prop *property.PhysicalProperty, TableSampleInfo: ds.SampleInfo, TableInfo: ds.table, Desc: candidate.isMatchProp && prop.SortItems[0].Desc, - }.Init(ds.SCtx(), ds.SelectBlockOffset()) + }.Init(ds.SCtx(), ds.QueryBlockOffset()) p.schema = ds.schema return &rootTask{ p: p, @@ -2298,8 +2297,8 @@ func (ds *DataSource) convertToPointGet(prop *property.PhysicalProperty, candida outputNames: ds.OutputNames(), LockWaitTime: ds.SCtx().GetSessionVars().LockWaitTimeout, Columns: ds.Columns, - }.Init(ds.SCtx(), ds.tableStats.ScaleByExpectCnt(accessCnt), ds.SelectBlockOffset()) - var partitionInfo *model.PartitionDefinition + }.Init(ds.SCtx(), ds.tableStats.ScaleByExpectCnt(accessCnt), ds.QueryBlockOffset()) + var partitionDef *model.PartitionDefinition pi := ds.tableInfo.GetPartitionInfo() if ds.isPartition { // static prune @@ -2307,12 +2306,12 @@ func (ds *DataSource) convertToPointGet(prop *property.PhysicalProperty, candida for i := range pi.Definitions { def := pi.Definitions[i] if def.ID == ds.physicalTableID { - partitionInfo = &def + partitionDef = &def break } } } - if partitionInfo == nil { + if partitionDef == nil { return invalidTask } } else if pi != nil { @@ -2325,9 +2324,9 @@ func (ds *DataSource) convertToPointGet(prop *property.PhysicalProperty, candida if len(pi.Definitions) != 1 { return invalidTask } - partitionInfo = &pi.Definitions[0] + partitionDef = &pi.Definitions[0] } else if len(idxs) == 1 { - partitionInfo = &pi.Definitions[idxs[0]] + partitionDef = &pi.Definitions[idxs[0]] } else { return invalidTask } @@ -2336,13 +2335,13 @@ func (ds *DataSource) convertToPointGet(prop *property.PhysicalProperty, candida if candidate.path.IsIntHandlePath { pointGetPlan.Handle = kv.IntHandle(candidate.path.Ranges[0].LowVal[0].GetInt64()) pointGetPlan.UnsignedHandle = mysql.HasUnsignedFlag(ds.handleCols.GetCol(0).RetType.GetFlag()) - pointGetPlan.PartitionInfo = partitionInfo + pointGetPlan.PartitionDef = partitionDef pointGetPlan.accessCols = ds.TblCols // Add filter condition to table plan now. if len(candidate.path.TableFilters) > 0 { sel := PhysicalSelection{ Conditions: candidate.path.TableFilters, - }.Init(ds.SCtx(), ds.StatsInfo().ScaleByExpectCnt(prop.ExpectedCnt), ds.SelectBlockOffset()) + }.Init(ds.SCtx(), ds.StatsInfo().ScaleByExpectCnt(prop.ExpectedCnt), ds.QueryBlockOffset()) sel.SetChildren(pointGetPlan) rTsk.p = sel } @@ -2351,7 +2350,7 @@ func (ds *DataSource) convertToPointGet(prop *property.PhysicalProperty, candida pointGetPlan.IdxCols = candidate.path.IdxCols pointGetPlan.IdxColLens = candidate.path.IdxColLens pointGetPlan.IndexValues = candidate.path.Ranges[0].LowVal - pointGetPlan.PartitionInfo = partitionInfo + pointGetPlan.PartitionDef = partitionDef if candidate.path.IsSingleScan { pointGetPlan.accessCols = candidate.path.IdxCols } else { @@ -2361,7 +2360,7 @@ func (ds *DataSource) convertToPointGet(prop *property.PhysicalProperty, candida if len(candidate.path.IndexFilters)+len(candidate.path.TableFilters) > 0 { sel := PhysicalSelection{ Conditions: append(candidate.path.IndexFilters, candidate.path.TableFilters...), - }.Init(ds.SCtx(), ds.StatsInfo().ScaleByExpectCnt(prop.ExpectedCnt), ds.SelectBlockOffset()) + }.Init(ds.SCtx(), ds.StatsInfo().ScaleByExpectCnt(prop.ExpectedCnt), ds.QueryBlockOffset()) sel.SetChildren(pointGetPlan) rTsk.p = sel } @@ -2402,10 +2401,10 @@ func (ds *DataSource) convertToBatchPointGet(prop *property.PhysicalProperty, ca batchPointGetPlan.accessCols = ds.TblCols // Add filter condition to table plan now. if len(candidate.path.TableFilters) > 0 { - batchPointGetPlan.Init(ds.SCtx(), ds.tableStats.ScaleByExpectCnt(accessCnt), ds.schema.Clone(), ds.names, ds.SelectBlockOffset()) + batchPointGetPlan.Init(ds.SCtx(), ds.tableStats.ScaleByExpectCnt(accessCnt), ds.schema.Clone(), ds.names, ds.QueryBlockOffset()) sel := PhysicalSelection{ Conditions: candidate.path.TableFilters, - }.Init(ds.SCtx(), ds.StatsInfo().ScaleByExpectCnt(prop.ExpectedCnt), ds.SelectBlockOffset()) + }.Init(ds.SCtx(), ds.StatsInfo().ScaleByExpectCnt(prop.ExpectedCnt), ds.QueryBlockOffset()) sel.SetChildren(batchPointGetPlan) rTsk.p = sel } @@ -2428,16 +2427,16 @@ func (ds *DataSource) convertToBatchPointGet(prop *property.PhysicalProperty, ca } // Add index condition to table plan now. if len(candidate.path.IndexFilters)+len(candidate.path.TableFilters) > 0 { - batchPointGetPlan.Init(ds.SCtx(), ds.tableStats.ScaleByExpectCnt(accessCnt), ds.schema.Clone(), ds.names, ds.SelectBlockOffset()) + batchPointGetPlan.Init(ds.SCtx(), ds.tableStats.ScaleByExpectCnt(accessCnt), ds.schema.Clone(), ds.names, ds.QueryBlockOffset()) sel := PhysicalSelection{ Conditions: append(candidate.path.IndexFilters, candidate.path.TableFilters...), - }.Init(ds.SCtx(), ds.StatsInfo().ScaleByExpectCnt(prop.ExpectedCnt), ds.SelectBlockOffset()) + }.Init(ds.SCtx(), ds.StatsInfo().ScaleByExpectCnt(prop.ExpectedCnt), ds.QueryBlockOffset()) sel.SetChildren(batchPointGetPlan) rTsk.p = sel } } if rTsk.p == nil { - rTsk.p = batchPointGetPlan.Init(ds.SCtx(), ds.tableStats.ScaleByExpectCnt(accessCnt), ds.schema.Clone(), ds.names, ds.SelectBlockOffset()) + rTsk.p = batchPointGetPlan.Init(ds.SCtx(), ds.tableStats.ScaleByExpectCnt(accessCnt), ds.schema.Clone(), ds.names, ds.QueryBlockOffset()) } return rTsk @@ -2446,13 +2445,13 @@ func (ds *DataSource) convertToBatchPointGet(prop *property.PhysicalProperty, ca func (ts *PhysicalTableScan) addPushedDownSelectionToMppTask(mpp *mppTask, stats *property.StatsInfo) *mppTask { filterCondition, rootTaskConds := SplitSelCondsWithVirtualColumn(ts.filterCondition) var newRootConds []expression.Expression - filterCondition, newRootConds = expression.PushDownExprs(ts.SCtx().GetSessionVars().StmtCtx, filterCondition, ts.SCtx().GetClient(), ts.StoreType) + filterCondition, newRootConds = expression.PushDownExprs(ts.SCtx(), filterCondition, ts.SCtx().GetClient(), ts.StoreType) mpp.rootTaskConds = append(rootTaskConds, newRootConds...) ts.filterCondition = filterCondition // Add filter condition to table plan now. if len(ts.filterCondition) > 0 { - sel := PhysicalSelection{Conditions: ts.filterCondition}.Init(ts.SCtx(), stats, ts.SelectBlockOffset()) + sel := PhysicalSelection{Conditions: ts.filterCondition}.Init(ts.SCtx(), stats, ts.QueryBlockOffset()) sel.SetChildren(ts) mpp.p = sel } @@ -2462,12 +2461,12 @@ func (ts *PhysicalTableScan) addPushedDownSelectionToMppTask(mpp *mppTask, stats func (ts *PhysicalTableScan) addPushedDownSelection(copTask *copTask, stats *property.StatsInfo) { ts.filterCondition, copTask.rootTaskConds = SplitSelCondsWithVirtualColumn(ts.filterCondition) var newRootConds []expression.Expression - ts.filterCondition, newRootConds = expression.PushDownExprs(ts.SCtx().GetSessionVars().StmtCtx, ts.filterCondition, ts.SCtx().GetClient(), ts.StoreType) + ts.filterCondition, newRootConds = expression.PushDownExprs(ts.SCtx(), ts.filterCondition, ts.SCtx().GetClient(), ts.StoreType) copTask.rootTaskConds = append(copTask.rootTaskConds, newRootConds...) // Add filter condition to table plan now. if len(ts.filterCondition) > 0 { - sel := PhysicalSelection{Conditions: ts.filterCondition}.Init(ts.SCtx(), stats, ts.SelectBlockOffset()) + sel := PhysicalSelection{Conditions: ts.filterCondition}.Init(ts.SCtx(), stats, ts.QueryBlockOffset()) if len(copTask.rootTaskConds) != 0 { selectivity, _, err := cardinality.Selectivity(ts.SCtx(), copTask.tblColHists, ts.filterCondition, nil) if err != nil { @@ -2507,7 +2506,7 @@ func (ds *DataSource) getOriginalPhysicalTableScan(prop *property.PhysicalProper constColsByCond: path.ConstCols, prop: prop, filterCondition: slices.Clone(path.TableFilters), - }.Init(ds.SCtx(), ds.SelectBlockOffset()) + }.Init(ds.SCtx(), ds.QueryBlockOffset()) ts.SetSchema(ds.schema.Clone()) rowCount := path.CountAfterAccess if prop.ExpectedCnt < ds.StatsInfo().RowCount { @@ -2551,7 +2550,7 @@ func (ds *DataSource) getOriginalPhysicalIndexScan(prop *property.PhysicalProper pkIsHandleCol: ds.getPKIsHandleCol(), constColsByCond: path.ConstCols, prop: prop, - }.Init(ds.SCtx(), ds.SelectBlockOffset()) + }.Init(ds.SCtx(), ds.QueryBlockOffset()) rowCount := path.CountAfterAccess is.initSchema(append(path.FullIdxCols, ds.commonHandleCols...), !isSingleScan) @@ -2566,7 +2565,14 @@ func (ds *DataSource) getOriginalPhysicalIndexScan(prop *property.PhysicalProper ds.StatsInfo(), ds.tableStats, ds.statisticTable, path, prop.ExpectedCnt, isMatchProp && prop.SortItems[0].Desc) } - is.SetStats(ds.tableStats.ScaleByExpectCnt(rowCount)) + // ScaleByExpectCnt only allows to scale the row count smaller than the table total row count. + // But for MV index, it's possible that the IndexRangeScan row count is larger than the table total row count. + // Please see the Case 2 in CalcTotalSelectivityForMVIdxPath for an example. + if idx.MVIndex && rowCount > ds.tableStats.RowCount { + is.SetStats(ds.tableStats.Scale(rowCount / ds.tableStats.RowCount)) + } else { + is.SetStats(ds.tableStats.ScaleByExpectCnt(rowCount)) + } usedStats := ds.SCtx().GetSessionVars().StmtCtx.GetUsedStatsInfo(false) if usedStats != nil && usedStats[is.physicalTableID] != nil { is.usedStatsInfo = usedStats[is.physicalTableID] diff --git a/pkg/planner/core/flat_plan.go b/pkg/planner/core/flat_plan.go index 747de0a4e0f11..35e46827c2e05 100644 --- a/pkg/planner/core/flat_plan.go +++ b/pkg/planner/core/flat_plan.go @@ -385,6 +385,14 @@ func (f *FlatPhysicalPlan) flattenRecursively(p Plan, info *operatorCtx, target childIdxs = append(childIdxs, childIdx) } target, childIdxs = f.flattenForeignKeyChecksAndCascades(childCtx, target, childIdxs, plan.FKChecks, plan.FKCascades, true) + case *ImportInto: + if plan.SelectPlan != nil { + childCtx.isRoot = true + childCtx.label = Empty + childCtx.isLastChild = true + target, childIdx = f.flattenRecursively(plan.SelectPlan, childCtx, target) + childIdxs = append(childIdxs, childIdx) + } case *Update: if plan.SelectPlan != nil { childCtx.isRoot = true diff --git a/pkg/planner/core/fragment.go b/pkg/planner/core/fragment.go index 06745c5e26fcb..95eea5bd349ad 100644 --- a/pkg/planner/core/fragment.go +++ b/pkg/planner/core/fragment.go @@ -105,10 +105,13 @@ type mppTaskGenerator struct { // For MPPGather under UnionScan, need keyRange to scan MemBuffer. KVRanges []kv.KeyRange + + nodeInfo map[string]bool } // GenerateRootMPPTasks generate all mpp tasks and return root ones. -func GenerateRootMPPTasks(ctx sessionctx.Context, startTs uint64, mppGatherID uint64, mppQueryID kv.MPPQueryID, sender *PhysicalExchangeSender, is infoschema.InfoSchema) ([]*Fragment, []kv.KeyRange, error) { +func GenerateRootMPPTasks(ctx sessionctx.Context, startTs uint64, mppGatherID uint64, + mppQueryID kv.MPPQueryID, sender *PhysicalExchangeSender, is infoschema.InfoSchema) ([]*Fragment, []kv.KeyRange, map[string]bool, error) { g := &mppTaskGenerator{ ctx: ctx, gatherID: mppGatherID, @@ -117,15 +120,16 @@ func GenerateRootMPPTasks(ctx sessionctx.Context, startTs uint64, mppGatherID ui is: is, cache: make(map[int]tasksAndFrags), KVRanges: make([]kv.KeyRange, 0), + nodeInfo: make(map[string]bool), } frags, err := g.generateMPPTasks(sender) if err != nil { - return frags, nil, err + return frags, nil, nil, err } if len(g.KVRanges) == 0 { err = errors.New("kvRanges for MPPTask should not be empty") } - return frags, g.KVRanges, err + return frags, g.KVRanges, g.nodeInfo, err } // AllocMPPTaskID allocates task id for mpp tasks. It will reset the task id when the query finished. @@ -550,7 +554,7 @@ func (e *mppTaskGenerator) constructMPPTasksImpl(ctx context.Context, ts *Physic tbl := tmp.(table.PartitionedTable) if !tiFlashStaticPrune { var partitions []table.PhysicalTable - partitions, err = partitionPruning(e.ctx, tbl, ts.PartitionInfo.PruningConds, ts.PartitionInfo.PartitionNames, ts.PartitionInfo.Columns, ts.PartitionInfo.ColumnNames) + partitions, err = partitionPruning(e.ctx, tbl, ts.PlanPartInfo.PruningConds, ts.PlanPartInfo.PartitionNames, ts.PlanPartInfo.Columns, ts.PlanPartInfo.ColumnNames) if err != nil { return nil, errors.Trace(err) } @@ -606,6 +610,8 @@ func (e *mppTaskGenerator) constructMPPTasksImpl(ctx context.Context, ts *Physic SessionAlias: sessionAlias, } tasks = append(tasks, task) + addr := meta.GetAddress() + e.nodeInfo[addr] = true } return tasks, nil } diff --git a/pkg/planner/core/handle_cols.go b/pkg/planner/core/handle_cols.go index 0131e3f7f5aec..9c36ab5843da8 100644 --- a/pkg/planner/core/handle_cols.go +++ b/pkg/planner/core/handle_cols.go @@ -164,7 +164,7 @@ func (cb *CommonHandleCols) String() string { if i != 0 { b.WriteByte(',') } - b.WriteString(col.ExplainInfo()) + b.WriteString(col.ColumnExplainInfo(false)) } b.WriteByte(']') return b.String() @@ -269,7 +269,7 @@ func (*IntHandleCols) IsInt() bool { // String implements the kv.HandleCols interface. func (ib *IntHandleCols) String() string { - return ib.col.ExplainInfo() + return ib.col.ColumnExplainInfo(false) } // GetCol implements the kv.HandleCols interface. diff --git a/pkg/planner/core/hashcode.go b/pkg/planner/core/hashcode.go index 073e8afa1c9c2..6772f1e092fac 100644 --- a/pkg/planner/core/hashcode.go +++ b/pkg/planner/core/hashcode.go @@ -44,7 +44,7 @@ func (p *LogicalProjection) HashCode() []byte { // we pre-alloc 10 bytes for each expr's hashcode. result := make([]byte, 0, 12+len(p.Exprs)*10) result = encodeIntAsUint32(result, plancodec.TypeStringToPhysicalID(p.TP())) - result = encodeIntAsUint32(result, p.SelectBlockOffset()) + result = encodeIntAsUint32(result, p.QueryBlockOffset()) result = encodeIntAsUint32(result, len(p.Exprs)) for _, expr := range p.Exprs { exprHashCode := expr.HashCode() @@ -59,7 +59,7 @@ func (p *LogicalTableDual) HashCode() []byte { // PlanType + SelectOffset + RowCount result := make([]byte, 0, 12) result = encodeIntAsUint32(result, plancodec.TypeStringToPhysicalID(p.TP())) - result = encodeIntAsUint32(result, p.SelectBlockOffset()) + result = encodeIntAsUint32(result, p.QueryBlockOffset()) result = encodeIntAsUint32(result, p.RowCount) return result } @@ -71,7 +71,7 @@ func (p *LogicalSelection) HashCode() []byte { // length larger than 20, so we pre-alloc 25 bytes for each expr's hashcode. result := make([]byte, 0, 12+len(p.Conditions)*25) result = encodeIntAsUint32(result, plancodec.TypeStringToPhysicalID(p.TP())) - result = encodeIntAsUint32(result, p.SelectBlockOffset()) + result = encodeIntAsUint32(result, p.QueryBlockOffset()) result = encodeIntAsUint32(result, len(p.Conditions)) condHashCodes := make([][]byte, len(p.Conditions)) @@ -93,7 +93,7 @@ func (p *LogicalLimit) HashCode() []byte { // PlanType + SelectOffset + Offset + Count result := make([]byte, 24) binary.BigEndian.PutUint32(result, uint32(plancodec.TypeStringToPhysicalID(p.TP()))) - binary.BigEndian.PutUint32(result[4:], uint32(p.SelectBlockOffset())) + binary.BigEndian.PutUint32(result[4:], uint32(p.QueryBlockOffset())) binary.BigEndian.PutUint64(result[8:], p.Offset) binary.BigEndian.PutUint64(result[16:], p.Count) return result diff --git a/pkg/planner/core/hints.go b/pkg/planner/core/hint_utils.go similarity index 75% rename from pkg/planner/core/hints.go rename to pkg/planner/core/hint_utils.go index 2eafe2aefe6ee..1b0c6526eaab4 100644 --- a/pkg/planner/core/hints.go +++ b/pkg/planner/core/hint_utils.go @@ -1,4 +1,4 @@ -// Copyright 2019 PingCAP, Inc. +// Copyright 2023 PingCAP, Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -19,7 +19,7 @@ import ( "github.com/pingcap/tidb/pkg/parser/ast" "github.com/pingcap/tidb/pkg/parser/model" "github.com/pingcap/tidb/pkg/sessionctx" - utilhint "github.com/pingcap/tidb/pkg/util/hint" + h "github.com/pingcap/tidb/pkg/util/hint" ) // GenHintsFromFlatPlan generates hints from a FlatPhysicalPlan. @@ -27,12 +27,12 @@ func GenHintsFromFlatPlan(flat *FlatPhysicalPlan) []*ast.TableOptimizerHint { if len(flat.Main) == 0 { return nil } - nodeTp := utilhint.TypeSelect + nodeTp := h.TypeSelect switch flat.Main[0].Origin.(type) { case *Update: - nodeTp = utilhint.TypeUpdate + nodeTp = h.TypeUpdate case *Delete: - nodeTp = utilhint.TypeDelete + nodeTp = h.TypeDelete } var hints []*ast.TableOptimizerHint selectPlan, _ := flat.Main.GetSelectPlan() @@ -52,7 +52,7 @@ func GenHintsFromFlatPlan(flat *FlatPhysicalPlan) []*ast.TableOptimizerHint { hints = genHintsFromSingle(p, nodeTp, op.StoreType, hints) } } - return removeDuplicatedHints(hints) + return h.RemoveDuplicatedHints(hints) } // GenHintsFromPhysicalPlan generates hints from physical plan. @@ -97,34 +97,34 @@ func extractTableAsName(p PhysicalPlan) (*model.CIStr, *model.CIStr) { return nil, nil } -func getJoinHints(sctx sessionctx.Context, joinType string, parentOffset int, nodeType utilhint.NodeType, children ...PhysicalPlan) (res []*ast.TableOptimizerHint) { +func getJoinHints(sctx sessionctx.Context, joinType string, parentOffset int, nodeType h.NodeType, children ...PhysicalPlan) (res []*ast.TableOptimizerHint) { if parentOffset == -1 { return res } for _, child := range children { - blockOffset := child.SelectBlockOffset() - if blockOffset == -1 { + qbOffset := child.QueryBlockOffset() + if qbOffset == -1 { continue } var dbName, tableName *model.CIStr - if blockOffset != parentOffset { + if qbOffset != parentOffset { var blockAsNames []ast.HintTable if p := sctx.GetSessionVars().PlannerSelectBlockAsName.Load(); p != nil { blockAsNames = *p } - if blockOffset >= len(blockAsNames) { + if qbOffset >= len(blockAsNames) { continue } - hintTable := blockAsNames[blockOffset] + hintTable := blockAsNames[qbOffset] // For sub-queries like `(select * from t) t1`, t1 should belong to its surrounding select block. - dbName, tableName, blockOffset = &hintTable.DBName, &hintTable.TableName, parentOffset + dbName, tableName, qbOffset = &hintTable.DBName, &hintTable.TableName, parentOffset } else { dbName, tableName = extractTableAsName(child) } if tableName == nil || tableName.L == "" { continue } - qbName, err := utilhint.GenerateQBName(nodeType, blockOffset) + qbName, err := h.GenerateQBName(nodeType, qbOffset) if err != nil { continue } @@ -138,8 +138,8 @@ func getJoinHints(sctx sessionctx.Context, joinType string, parentOffset int, no return res } -func genHintsFromSingle(p PhysicalPlan, nodeType utilhint.NodeType, storeType kv.StoreType, res []*ast.TableOptimizerHint) []*ast.TableOptimizerHint { - qbName, err := utilhint.GenerateQBName(nodeType, p.SelectBlockOffset()) +func genHintsFromSingle(p PhysicalPlan, nodeType h.NodeType, storeType kv.StoreType, res []*ast.TableOptimizerHint) []*ast.TableOptimizerHint { + qbName, err := h.GenerateQBName(nodeType, p.QueryBlockOffset()) if err != nil { return res } @@ -148,7 +148,7 @@ func genHintsFromSingle(p PhysicalPlan, nodeType utilhint.NodeType, storeType kv if storeType == kv.TiKV { res = append(res, &ast.TableOptimizerHint{ QBName: qbName, - HintName: model.NewCIStr(HintLimitToCop), + HintName: model.NewCIStr(h.HintLimitToCop), }) } case *PhysicalTableReader: @@ -159,20 +159,20 @@ func genHintsFromSingle(p PhysicalPlan, nodeType utilhint.NodeType, storeType kv if tbl.StoreType == kv.TiFlash { res = append(res, &ast.TableOptimizerHint{ QBName: qbName, - HintName: model.NewCIStr(HintReadFromStorage), + HintName: model.NewCIStr(h.HintReadFromStorage), HintData: model.NewCIStr(kv.TiFlash.Name()), Tables: []ast.HintTable{{DBName: tbl.DBName, TableName: getTableName(tbl.Table.Name, tbl.TableAsName)}}, }) } else { res = append(res, &ast.TableOptimizerHint{ QBName: qbName, - HintName: model.NewCIStr(HintUseIndex), + HintName: model.NewCIStr(h.HintUseIndex), Tables: []ast.HintTable{{DBName: tbl.DBName, TableName: getTableName(tbl.Table.Name, tbl.TableAsName)}}, }) if tbl.Table.PKIsHandle || tbl.Table.IsCommonHandle { // it's a primary key - orderHint := HintOrderIndex + orderHint := h.HintOrderIndex if !tbl.KeepOrder { - orderHint = HintNoOrderIndex + orderHint = h.HintNoOrderIndex } res = append(res, &ast.TableOptimizerHint{ QBName: qbName, @@ -186,13 +186,13 @@ func genHintsFromSingle(p PhysicalPlan, nodeType utilhint.NodeType, storeType kv index := pp.IndexPlans[0].(*PhysicalIndexScan) res = append(res, &ast.TableOptimizerHint{ QBName: qbName, - HintName: model.NewCIStr(HintUseIndex), + HintName: model.NewCIStr(h.HintUseIndex), Tables: []ast.HintTable{{DBName: index.DBName, TableName: getTableName(index.Table.Name, index.TableAsName)}}, Indexes: []model.CIStr{index.Index.Name}, }) - orderHint := HintOrderIndex + orderHint := h.HintOrderIndex if !index.KeepOrder { - orderHint = HintNoOrderIndex + orderHint = h.HintNoOrderIndex } res = append(res, &ast.TableOptimizerHint{ QBName: qbName, @@ -204,13 +204,13 @@ func genHintsFromSingle(p PhysicalPlan, nodeType utilhint.NodeType, storeType kv index := pp.IndexPlans[0].(*PhysicalIndexScan) res = append(res, &ast.TableOptimizerHint{ QBName: qbName, - HintName: model.NewCIStr(HintUseIndex), + HintName: model.NewCIStr(h.HintUseIndex), Tables: []ast.HintTable{{DBName: index.DBName, TableName: getTableName(index.Table.Name, index.TableAsName)}}, Indexes: []model.CIStr{index.Index.Name}, }) - orderHint := HintOrderIndex + orderHint := h.HintOrderIndex if !index.KeepOrder { - orderHint = HintNoOrderIndex + orderHint = h.HintNoOrderIndex } res = append(res, &ast.TableOptimizerHint{ QBName: qbName, @@ -234,60 +234,43 @@ func genHintsFromSingle(p PhysicalPlan, nodeType utilhint.NodeType, storeType kv } res = append(res, &ast.TableOptimizerHint{ QBName: qbName, - HintName: model.NewCIStr(HintIndexMerge), + HintName: model.NewCIStr(h.HintIndexMerge), Tables: []ast.HintTable{{TableName: getTableName(tableName, tableAsName)}}, Indexes: indexs, }) case *PhysicalHashAgg: res = append(res, &ast.TableOptimizerHint{ QBName: qbName, - HintName: model.NewCIStr(HintHashAgg), + HintName: model.NewCIStr(h.HintHashAgg), }) if storeType == kv.TiKV { res = append(res, &ast.TableOptimizerHint{ QBName: qbName, - HintName: model.NewCIStr(HintAggToCop), + HintName: model.NewCIStr(h.HintAggToCop), }) } case *PhysicalStreamAgg: res = append(res, &ast.TableOptimizerHint{ QBName: qbName, - HintName: model.NewCIStr(HintStreamAgg), + HintName: model.NewCIStr(h.HintStreamAgg), }) if storeType == kv.TiKV { res = append(res, &ast.TableOptimizerHint{ QBName: qbName, - HintName: model.NewCIStr(HintAggToCop), + HintName: model.NewCIStr(h.HintAggToCop), }) } case *PhysicalMergeJoin: - res = append(res, getJoinHints(p.SCtx(), HintSMJ, p.SelectBlockOffset(), nodeType, pp.children...)...) + res = append(res, getJoinHints(p.SCtx(), h.HintSMJ, p.QueryBlockOffset(), nodeType, pp.children...)...) case *PhysicalHashJoin: // TODO: support the hash_join_build and hash_join_probe hint for auto capture - res = append(res, getJoinHints(p.SCtx(), HintHJ, p.SelectBlockOffset(), nodeType, pp.children...)...) + res = append(res, getJoinHints(p.SCtx(), h.HintHJ, p.QueryBlockOffset(), nodeType, pp.children...)...) case *PhysicalIndexJoin: - res = append(res, getJoinHints(p.SCtx(), HintINLJ, p.SelectBlockOffset(), nodeType, pp.children[pp.InnerChildIdx])...) + res = append(res, getJoinHints(p.SCtx(), h.HintINLJ, p.QueryBlockOffset(), nodeType, pp.children[pp.InnerChildIdx])...) case *PhysicalIndexMergeJoin: - res = append(res, getJoinHints(p.SCtx(), HintINLMJ, p.SelectBlockOffset(), nodeType, pp.children[pp.InnerChildIdx])...) + res = append(res, getJoinHints(p.SCtx(), h.HintINLMJ, p.QueryBlockOffset(), nodeType, pp.children[pp.InnerChildIdx])...) case *PhysicalIndexHashJoin: - res = append(res, getJoinHints(p.SCtx(), HintINLHJ, p.SelectBlockOffset(), nodeType, pp.children[pp.InnerChildIdx])...) - } - return res -} - -func removeDuplicatedHints(hints []*ast.TableOptimizerHint) []*ast.TableOptimizerHint { - if len(hints) < 2 { - return hints - } - m := make(map[string]struct{}, len(hints)) - res := make([]*ast.TableOptimizerHint, 0, len(hints)) - for _, hint := range hints { - key := utilhint.RestoreTableOptimizerHint(hint) - if _, ok := m[key]; ok { - continue - } - m[key] = struct{}{} - res = append(res, hint) + res = append(res, getJoinHints(p.SCtx(), h.HintINLHJ, p.QueryBlockOffset(), nodeType, pp.children[pp.InnerChildIdx])...) } return res } diff --git a/pkg/planner/core/indexmerge_path.go b/pkg/planner/core/indexmerge_path.go index 5518566d1d2e9..5d9f0ed52a34b 100644 --- a/pkg/planner/core/indexmerge_path.go +++ b/pkg/planner/core/indexmerge_path.go @@ -15,6 +15,7 @@ package core import ( + "cmp" "math" "slices" "strings" @@ -30,13 +31,21 @@ import ( "github.com/pingcap/tidb/pkg/planner/util" "github.com/pingcap/tidb/pkg/planner/util/debugtrace" "github.com/pingcap/tidb/pkg/sessionctx" + "github.com/pingcap/tidb/pkg/statistics" "github.com/pingcap/tidb/pkg/types" "github.com/pingcap/tidb/pkg/util/chunk" "github.com/pingcap/tidb/pkg/util/logutil" "github.com/pingcap/tidb/pkg/util/ranger" "go.uber.org/zap" + "golang.org/x/exp/maps" ) +func init() { + cardinality.CollectFilters4MVIndex = collectFilters4MVIndex + cardinality.BuildPartialPaths4MVIndex = buildPartialPaths4MVIndex + statistics.PrepareCols4MVIndex = PrepareCols4MVIndex +} + // generateIndexMergePath generates IndexMerge AccessPaths on this DataSource. func (ds *DataSource) generateIndexMergePath() error { if ds.SCtx().GetSessionVars().StmtCtx.EnableOptimizerDebugTrace { @@ -48,7 +57,7 @@ func (ds *DataSource) generateIndexMergePath() error { defer func() { if len(ds.indexMergeHints) > 0 && warningMsg != "" { ds.indexMergeHints = nil - stmtCtx.AppendWarning(errors.Errorf(warningMsg)) + stmtCtx.AppendWarning(errors.NewNoStackError(warningMsg)) logutil.BgLogger().Debug(warningMsg) } }() @@ -86,34 +95,43 @@ func (ds *DataSource) generateIndexMergePath() error { return err } - // If without hints, it means that `enableIndexMerge` is true - if len(ds.indexMergeHints) == 0 { - return nil - } - // If len(indexMergeHints) > 0, then add warnings if index-merge hints cannot work. - if regularPathCount == len(ds.possibleAccessPaths) { - if warningMsg == "" { - warningMsg = "IndexMerge is inapplicable" + // Because index merge access paths are built from ds.allConds, sometimes they can help us consider more filters than + // the ds.stats, which is calculated from ds.pushedDownConds before this point. + // So we use a simple and naive method to update ds.stats here using the largest row count from index merge paths. + // This can help to avoid some cases where the row count of operator above IndexMerge is larger than IndexMerge. + // TODO: Probably we should directly consider ds.allConds when calculating ds.stats in the future. + if len(ds.possibleAccessPaths) > regularPathCount && len(ds.allConds) > len(ds.pushedDownConds) { + var maxRowCount float64 + for i := regularPathCount; i < len(ds.possibleAccessPaths); i++ { + maxRowCount = max(maxRowCount, ds.possibleAccessPaths[i].CountAfterAccess) + } + if ds.StatsInfo().RowCount > maxRowCount { + ds.SetStats(ds.tableStats.ScaleByExpectCnt(maxRowCount)) } - return nil } - // If len(indexMergeHints) > 0 and some index-merge paths were added, then prune all other non-index-merge paths. - // if len(ds.possibleAccessPaths) > oldIndexMergeCount, it means composed index merge path is generated, prune others. - if len(ds.possibleAccessPaths) > oldIndexMergeCount { - ds.possibleAccessPaths = ds.possibleAccessPaths[oldIndexMergeCount:] - } else { - ds.possibleAccessPaths = ds.possibleAccessPaths[regularPathCount:] - } - minRowCount := ds.possibleAccessPaths[0].CountAfterAccess - for _, path := range ds.possibleAccessPaths { - if minRowCount < path.CountAfterAccess { - minRowCount = path.CountAfterAccess + // If without hints, it means that `enableIndexMerge` is true + if len(ds.indexMergeHints) != 0 { + // If len(indexMergeHints) > 0, then add warnings if index-merge hints cannot work. + if regularPathCount == len(ds.possibleAccessPaths) { + if warningMsg == "" { + warningMsg = "IndexMerge is inapplicable" + } + return nil + } + + // If len(indexMergeHints) > 0 and some index-merge paths were added, then prune all other non-index-merge paths. + // if len(ds.possibleAccessPaths) > oldIndexMergeCount, it means composed index merge path is generated, prune others. + if len(ds.possibleAccessPaths) > oldIndexMergeCount { + ds.possibleAccessPaths = ds.possibleAccessPaths[oldIndexMergeCount:] + } else { + ds.possibleAccessPaths = ds.possibleAccessPaths[regularPathCount:] } } - if ds.StatsInfo().RowCount > minRowCount { - ds.SetStats(ds.tableStats.ScaleByExpectCnt(minRowCount)) - } + + // If there is a multi-valued index hint, remove all paths which don't use the specified index. + ds.cleanAccessPathForMVIndexHint() + return nil } @@ -124,7 +142,7 @@ func (ds *DataSource) generateNormalIndexPartialPaths4DNF(dnfItems []expression. cnfItems := expression.SplitCNFItems(item) pushedDownCNFItems := make([]expression.Expression, 0, len(cnfItems)) for _, cnfItem := range cnfItems { - if expression.CanExprsPushDown(ds.SCtx().GetSessionVars().StmtCtx, + if expression.CanExprsPushDown(ds.SCtx(), []expression.Expression{cnfItem}, ds.SCtx().GetClient(), kv.TiKV, @@ -148,10 +166,7 @@ func (ds *DataSource) generateNormalIndexPartialPaths4DNF(dnfItems []expression. } return false }) - partialPath, err := ds.buildIndexMergePartialPath(itemPaths) - if err != nil { - return nil, false, nil, err - } + partialPath := ds.buildIndexMergePartialPath(itemPaths) if partialPath == nil { // for this dnf item, we couldn't generate an index merge partial path. // (1 member of (a)) or (3 member of (b)) or d=1; if one dnf item like d=1 here could walk index path, @@ -166,7 +181,7 @@ func (ds *DataSource) generateNormalIndexPartialPaths4DNF(dnfItems []expression. partialPath.TableFilters = nil } // If any partial path's index filter cannot be pushed to TiKV, we should keep the whole DNF filter. - if len(partialPath.IndexFilters) != 0 && !expression.CanExprsPushDown(ds.SCtx().GetSessionVars().StmtCtx, partialPath.IndexFilters, ds.SCtx().GetClient(), kv.TiKV) { + if len(partialPath.IndexFilters) != 0 && !expression.CanExprsPushDown(ds.SCtx(), partialPath.IndexFilters, ds.SCtx().GetClient(), kv.TiKV) { needSelection = true // Clear IndexFilter, the whole filter will be put in indexMergePath.TableFilters. partialPath.IndexFilters = nil @@ -199,7 +214,7 @@ func (ds *DataSource) generateIndexMergeOrPaths(filters []expression.Expression) pushedDownCNFItems := make([]expression.Expression, 0, len(cnfItems)) for _, cnfItem := range cnfItems { - if expression.CanExprsPushDown(ds.SCtx().GetSessionVars().StmtCtx, + if expression.CanExprsPushDown(ds.SCtx(), []expression.Expression{cnfItem}, ds.SCtx().GetClient(), kv.TiKV, @@ -215,10 +230,7 @@ func (ds *DataSource) generateIndexMergeOrPaths(filters []expression.Expression) partialPaths = nil break } - partialPath, err := ds.buildIndexMergePartialPath(itemPaths) - if err != nil { - return err - } + partialPath := ds.buildIndexMergePartialPath(itemPaths) if partialPath == nil { partialPaths = nil break @@ -271,10 +283,10 @@ func (ds *DataSource) isInIndexMergeHints(name string) bool { return true } for _, hint := range ds.indexMergeHints { - if hint.indexHint == nil || len(hint.indexHint.IndexNames) == 0 { + if hint.IndexHint == nil || len(hint.IndexHint.IndexNames) == 0 { return true } - for _, hintName := range hint.indexHint.IndexNames { + for _, hintName := range hint.IndexHint.IndexNames { if strings.EqualFold(strings.ToLower(name), strings.ToLower(hintName.String())) { return true } @@ -286,10 +298,10 @@ func (ds *DataSource) isInIndexMergeHints(name string) bool { // indexMergeHintsHasSpecifiedIdx returns true if there's IndexMerge hint, and it has specified index names. func (ds *DataSource) indexMergeHintsHasSpecifiedIdx() bool { for _, hint := range ds.indexMergeHints { - if hint.indexHint == nil || len(hint.indexHint.IndexNames) == 0 { + if hint.IndexHint == nil || len(hint.IndexHint.IndexNames) == 0 { continue } - if len(hint.indexHint.IndexNames) > 0 { + if len(hint.IndexHint.IndexNames) > 0 { return true } } @@ -299,10 +311,10 @@ func (ds *DataSource) indexMergeHintsHasSpecifiedIdx() bool { // indexMergeHintsHasSpecifiedIdx return true if the input index name is specified in the IndexMerge hint. func (ds *DataSource) isSpecifiedInIndexMergeHints(name string) bool { for _, hint := range ds.indexMergeHints { - if hint.indexHint == nil || len(hint.indexHint.IndexNames) == 0 { + if hint.IndexHint == nil || len(hint.IndexHint.IndexNames) == 0 { continue } - for _, hintName := range hint.indexHint.IndexNames { + for _, hintName := range hint.IndexHint.IndexNames { if strings.EqualFold(strings.ToLower(name), strings.ToLower(hintName.String())) { return true } @@ -384,9 +396,9 @@ func (ds *DataSource) accessPathsForConds(conditions []expression.Expression, us // buildIndexMergePartialPath chooses the best index path from all possible paths. // Now we choose the index with minimal estimate row count. -func (*DataSource) buildIndexMergePartialPath(indexAccessPaths []*util.AccessPath) (*util.AccessPath, error) { +func (*DataSource) buildIndexMergePartialPath(indexAccessPaths []*util.AccessPath) *util.AccessPath { if len(indexAccessPaths) == 1 { - return indexAccessPaths[0], nil + return indexAccessPaths[0] } minEstRowIndex := 0 @@ -401,7 +413,7 @@ func (*DataSource) buildIndexMergePartialPath(indexAccessPaths []*util.AccessPat minEstRow = rc } } - return indexAccessPaths[minEstRowIndex], nil + return indexAccessPaths[minEstRowIndex] } // buildIndexMergeOrPath generates one possible IndexMergePath. @@ -418,7 +430,7 @@ func (ds *DataSource) buildIndexMergeOrPath( // Global index is not compatible with IndexMergeReaderExecutor. for i := range partialPaths { if partialPaths[i].Index != nil && partialPaths[i].Index.Global { - ds.SCtx().GetSessionVars().StmtCtx.AppendWarning(errors.New("global index is not compatible with index merge, so ignore it")) + ds.SCtx().GetSessionVars().StmtCtx.AppendWarning(errors.NewNoStackError("global index is not compatible with index merge, so ignore it")) return nil } } @@ -429,12 +441,12 @@ func (ds *DataSource) buildIndexMergeOrPath( shouldKeepCurrentFilter = true } // If any partial path's index filter cannot be pushed to TiKV, we should keep the whole DNF filter. - if len(path.IndexFilters) != 0 && !expression.CanExprsPushDown(ds.SCtx().GetSessionVars().StmtCtx, path.IndexFilters, ds.SCtx().GetClient(), kv.TiKV) { + if len(path.IndexFilters) != 0 && !expression.CanExprsPushDown(ds.SCtx(), path.IndexFilters, ds.SCtx().GetClient(), kv.TiKV) { shouldKeepCurrentFilter = true // Clear IndexFilter, the whole filter will be put in indexMergePath.TableFilters. path.IndexFilters = nil } - if len(path.TableFilters) != 0 && !expression.CanExprsPushDown(ds.SCtx().GetSessionVars().StmtCtx, path.TableFilters, ds.SCtx().GetClient(), kv.TiKV) { + if len(path.TableFilters) != 0 && !expression.CanExprsPushDown(ds.SCtx(), path.TableFilters, ds.SCtx().GetClient(), kv.TiKV) { shouldKeepCurrentFilter = true path.TableFilters = nil } @@ -570,7 +582,7 @@ func (ds *DataSource) generateIndexMergeAndPaths(normalPathCnt int, usedAccessMa coveredConds = append(coveredConds, path.AccessConds...) for i, cond := range path.IndexFilters { // IndexFilters can be covered by partial path if it can be pushed down to TiKV. - if !expression.CanExprsPushDown(ds.SCtx().GetSessionVars().StmtCtx, []expression.Expression{cond}, ds.SCtx().GetClient(), kv.TiKV) { + if !expression.CanExprsPushDown(ds.SCtx(), []expression.Expression{cond}, ds.SCtx().GetClient(), kv.TiKV) { path.IndexFilters = append(path.IndexFilters[:i], path.IndexFilters[i+1:]...) notCoveredConds = append(notCoveredConds, cond) } else { @@ -680,25 +692,29 @@ func (ds *DataSource) generateMVIndexPartialPath4Or(normalPathCnt int, indexMerg bestNeedSelection bool ) for _, onePossibleMVIndexPath := range possibleMVIndexPaths { - idxCols, ok := ds.prepareCols4MVIndex(onePossibleMVIndexPath.Index) + idxCols, ok := PrepareCols4MVIndex(ds.table.Meta(), onePossibleMVIndexPath.Index, ds.TblCols) if !ok { continue } // for every cnfCond, try to map it into possible mv index path. // remainingFilters is not cared here, because it will be all suspended on the table side. - accessFilters, remainingFilters := ds.collectFilters4MVIndex(cnfConds, idxCols) + accessFilters, remainingFilters := collectFilters4MVIndex(ds.SCtx(), cnfConds, idxCols) if len(accessFilters) == 0 { continue } - paths, isIntersection, ok, err := ds.buildPartialPaths4MVIndex(accessFilters, idxCols, onePossibleMVIndexPath.Index) + paths, isIntersection, ok, err := buildPartialPaths4MVIndex(ds.SCtx(), accessFilters, idxCols, onePossibleMVIndexPath.Index, ds.tableStats.HistColl) if err != nil { logutil.BgLogger().Debug("build index merge partial mv index paths failed", zap.Error(err)) return nil, nil, false, err } - if isIntersection || !ok { // limitation 2 + if !ok || len(paths) == 0 { continue } - if len(paths) == 0 { + // only under 2 cases we can fallthrough it. + // 1: the index merge only has one partial path. + // 2: index merge is UNION type. + canFallThrough := len(paths) == 1 || !isIntersection + if !canFallThrough { continue } // UNION case, use the max count after access for simplicity. @@ -732,7 +748,7 @@ func (ds *DataSource) generateMVIndexPartialPath4Or(normalPathCnt int, indexMerg } // generateMVIndexMergePartialPaths4And try to find mv index merge partial path from a collection of cnf conditions. -func (ds *DataSource) generateMVIndexMergePartialPaths4And(normalPathCnt int, indexMergeConds []expression.Expression) ([]*util.AccessPath, map[string]expression.Expression, error) { +func (ds *DataSource) generateMVIndexMergePartialPaths4And(normalPathCnt int, indexMergeConds []expression.Expression, histColl *statistics.HistColl) ([]*util.AccessPath, map[string]expression.Expression, error) { // step1: collect all mv index paths possibleMVIndexPaths := make([]*util.AccessPath, 0, len(ds.possibleAccessPaths)) for idx := 0; idx < normalPathCnt; idx++ { @@ -747,22 +763,44 @@ func (ds *DataSource) generateMVIndexMergePartialPaths4And(normalPathCnt int, in // step2: mapping index merge conditions into possible mv index path mvAndPartialPath := make([]*util.AccessPath, 0, len(possibleMVIndexPaths)) usedAccessCondsMap := make(map[string]expression.Expression, len(indexMergeConds)) + // fill the possible indexMergeConds down to possible index merge paths. If two index merge path + // share same accessFilters, pick the one with minimum countAfterAccess. + type record struct { + originOffset int + paths []*util.AccessPath + countAfterAccess float64 + } + // mm is a map here used for de-duplicate partial paths which is derived from **same** accessFilters, not necessary to keep them both. + mm := make(map[string]*record, 0) for idx := 0; idx < len(possibleMVIndexPaths); idx++ { - idxCols, ok := ds.prepareCols4MVIndex(possibleMVIndexPaths[idx].Index) + idxCols, ok := PrepareCols4MVIndex(ds.table.Meta(), possibleMVIndexPaths[idx].Index, ds.TblCols) if !ok { continue } - accessFilters, _, mvColOffset, mvFilterMutations := ds.collectFilters4MVIndexMutations(indexMergeConds, idxCols) + accessFilters, _, mvColOffset, mvFilterMutations := CollectFilters4MVIndexMutations(ds.SCtx(), indexMergeConds, idxCols) if len(accessFilters) == 0 { // cannot use any filter on this MVIndex continue } + // record the all hashcodes before accessFilters is mutated. + allHashCodes := make([]string, 0, len(accessFilters)+len(mvFilterMutations)-1) + for _, accessF := range accessFilters { + allHashCodes = append(allHashCodes, string(accessF.HashCode())) + } + for i, mvF := range mvFilterMutations { + if i == 0 { + // skip the first one, because it has already in accessFilters. + continue + } + allHashCodes = append(allHashCodes, string(mvF.HashCode())) + } // in traveling of these mv index conditions, we can only use one of them to build index merge path, just fetch it out first. // build index merge partial path for every mutation combination access filters. + var partialPaths4ThisMvIndex []*util.AccessPath for _, mvFilterMu := range mvFilterMutations { // derive each mutation access filters accessFilters[mvColOffset] = mvFilterMu - partialPaths, isIntersection, ok, err := ds.buildPartialPaths4MVIndex(accessFilters, idxCols, possibleMVIndexPaths[idx].Index) + partialPaths, isIntersection, ok, err := buildPartialPaths4MVIndex(ds.SCtx(), accessFilters, idxCols, possibleMVIndexPaths[idx].Index, ds.tableStats.HistColl) if err != nil { logutil.BgLogger().Debug("build index merge partial mv index paths failed", zap.Error(err)) return nil, nil, err @@ -780,10 +818,32 @@ func (ds *DataSource) generateMVIndexMergePartialPaths4And(normalPathCnt int, in for _, accessF := range accessFilters { usedAccessCondsMap[string(accessF.HashCode())] = accessF } - mvAndPartialPath = append(mvAndPartialPath, partialPaths...) + partialPaths4ThisMvIndex = append(partialPaths4ThisMvIndex, partialPaths...) + } + } + // sort allHashCodes to make the unified hashcode for slices of all accessFilters. + slices.Sort(allHashCodes) + allHashCodesKey := strings.Join(allHashCodes, "") + countAfterAccess := float64(histColl.RealtimeCount) * cardinality.CalcTotalSelectivityForMVIdxPath(histColl, partialPaths4ThisMvIndex, true) + if rec, ok := mm[allHashCodesKey]; !ok { + // compute the count after access from those intersection partial paths, for this mv index usage. + mm[allHashCodesKey] = &record{idx, partialPaths4ThisMvIndex, countAfterAccess} + } else { + // pick the minimum countAfterAccess's paths. + if rec.countAfterAccess > countAfterAccess { + mm[allHashCodesKey] = &record{idx, partialPaths4ThisMvIndex, countAfterAccess} } } } + // after all mv index is traversed, pick those remained paths which has already been de-duplicated for its accessFilters. + recordsCollection := maps.Values(mm) + // according origin offset to stable the partial paths order. (golang map is not order stable) + slices.SortFunc(recordsCollection, func(a, b *record) int { + return cmp.Compare(a.originOffset, b.originOffset) + }) + for _, one := range recordsCollection { + mvAndPartialPath = append(mvAndPartialPath, one.paths...) + } return mvAndPartialPath, usedAccessCondsMap, nil } @@ -811,7 +871,7 @@ func (ds *DataSource) generateIndexMerge4NormalIndex(regularPathCount int, index // PushDownExprs() will append extra warnings, which is annoying. So we reset warnings here. warnings := stmtCtx.GetWarnings() extraWarnings := stmtCtx.GetExtraWarnings() - _, remaining := expression.PushDownExprs(stmtCtx, indexMergeConds, ds.SCtx().GetClient(), kv.UnSpecified) + _, remaining := expression.PushDownExprs(ds.SCtx(), indexMergeConds, ds.SCtx().GetClient(), kv.UnSpecified) stmtCtx.SetWarnings(warnings) stmtCtx.SetExtraWarnings(extraWarnings) if len(remaining) > 0 { @@ -855,7 +915,7 @@ func (ds *DataSource) generateIndexMergeOnDNF4MVIndex(normalPathCnt int, filters continue // not a MVIndex path } - idxCols, ok := ds.prepareCols4MVIndex(ds.possibleAccessPaths[idx].Index) + idxCols, ok := PrepareCols4MVIndex(ds.table.Meta(), ds.possibleAccessPaths[idx].Index, ds.TblCols) if !ok { continue } @@ -876,12 +936,12 @@ func (ds *DataSource) generateIndexMergeOnDNF4MVIndex(normalPathCnt int, filters mvIndexFilters = expression.FlattenCNFConditions(sf) // (1 member of (a) and b=1) --> [(1 member of (a)), b=1] } - accessFilters, remainingFilters := ds.collectFilters4MVIndex(mvIndexFilters, idxCols) + accessFilters, remainingFilters := collectFilters4MVIndex(ds.SCtx(), mvIndexFilters, idxCols) if len(accessFilters) == 0 || len(remainingFilters) > 0 { // limitation 1 cannotFit = true break } - paths, isIntersection, ok, err := ds.buildPartialPaths4MVIndex(accessFilters, idxCols, ds.possibleAccessPaths[idx].Index) + paths, isIntersection, ok, err := buildPartialPaths4MVIndex(ds.SCtx(), accessFilters, idxCols, ds.possibleAccessPaths[idx].Index, ds.tableStats.HistColl) if err != nil { return nil, err } @@ -899,7 +959,12 @@ func (ds *DataSource) generateIndexMergeOnDNF4MVIndex(normalPathCnt int, filters remainingFilters = append(remainingFilters, filters[:current]...) remainingFilters = append(remainingFilters, filters[current+1:]...) - indexMergePath := ds.buildPartialPathUp4MVIndex(partialPaths, false, remainingFilters) + indexMergePath := ds.buildPartialPathUp4MVIndex( + partialPaths, + false, + remainingFilters, + ds.tableStats.HistColl, + ) mvIndexPaths = append(mvIndexPaths, indexMergePath) } } @@ -1022,7 +1087,12 @@ func (ds *DataSource) generateIndexMerge4ComposedIndex(normalPathCnt int, indexM if needSelection4MVIndex || needSelection4NormalIndex { indexMergeTableFilters = indexMergeConds } - mvp := ds.buildPartialPathUp4MVIndex(combinedPartialPaths, false, indexMergeTableFilters) + mvp := ds.buildPartialPathUp4MVIndex( + combinedPartialPaths, + false, + indexMergeTableFilters, + ds.tableStats.HistColl, + ) ds.possibleAccessPaths = append(ds.possibleAccessPaths, mvp) return nil } @@ -1043,7 +1113,7 @@ func (ds *DataSource) generateIndexMerge4ComposedIndex(normalPathCnt int, indexM // step1: firstly collect all the potential normal index partial paths. // step2: secondly collect all the potential mv index partial path, and merge them into one if possible. // step3: thirdly merge normal index paths and mv index paths together to compose a bigger index merge path. - mvIndexPartialPaths, usedAccessMap, err := ds.generateMVIndexMergePartialPaths4And(normalPathCnt, indexMergeConds) + mvIndexPartialPaths, usedAccessMap, err := ds.generateMVIndexMergePartialPaths4And(normalPathCnt, indexMergeConds, ds.tableStats.HistColl) if err != nil { return err } @@ -1069,7 +1139,7 @@ func (ds *DataSource) generateIndexMerge4ComposedIndex(normalPathCnt int, indexM remainedCNFs = append(remainedCNFs, CNFItem) } } - mvp := ds.buildPartialPathUp4MVIndex(combinedPartialPaths, true, remainedCNFs) + mvp := ds.buildPartialPathUp4MVIndex(combinedPartialPaths, true, remainedCNFs, ds.tableStats.HistColl) ds.possibleAccessPaths = append(ds.possibleAccessPaths, mvp) return nil @@ -1106,17 +1176,17 @@ func (ds *DataSource) generateIndexMerge4MVIndex(normalPathCnt int, filters []ex continue // not a MVIndex path } - idxCols, ok := ds.prepareCols4MVIndex(ds.possibleAccessPaths[idx].Index) + idxCols, ok := PrepareCols4MVIndex(ds.table.Meta(), ds.possibleAccessPaths[idx].Index, ds.TblCols) if !ok { continue } - accessFilters, remainingFilters := ds.collectFilters4MVIndex(filters, idxCols) + accessFilters, remainingFilters := collectFilters4MVIndex(ds.SCtx(), filters, idxCols) if len(accessFilters) == 0 { // cannot use any filter on this MVIndex continue } - partialPaths, isIntersection, ok, err := ds.buildPartialPaths4MVIndex(accessFilters, idxCols, ds.possibleAccessPaths[idx].Index) + partialPaths, isIntersection, ok, err := buildPartialPaths4MVIndex(ds.SCtx(), accessFilters, idxCols, ds.possibleAccessPaths[idx].Index, ds.tableStats.HistColl) if err != nil { return err } @@ -1124,37 +1194,47 @@ func (ds *DataSource) generateIndexMerge4MVIndex(normalPathCnt int, filters []ex continue } - ds.possibleAccessPaths = append(ds.possibleAccessPaths, ds.buildPartialPathUp4MVIndex(partialPaths, isIntersection, remainingFilters)) + ds.possibleAccessPaths = append(ds.possibleAccessPaths, ds.buildPartialPathUp4MVIndex( + partialPaths, + isIntersection, + remainingFilters, + ds.tableStats.HistColl, + ), + ) } return nil } // buildPartialPathUp4MVIndex builds these partial paths up to a complete index merge path. -func (*DataSource) buildPartialPathUp4MVIndex(partialPaths []*util.AccessPath, isIntersection bool, remainingFilters []expression.Expression) *util.AccessPath { +func (*DataSource) buildPartialPathUp4MVIndex( + partialPaths []*util.AccessPath, + isIntersection bool, + remainingFilters []expression.Expression, + histColl *statistics.HistColl, +) *util.AccessPath { indexMergePath := &util.AccessPath{PartialIndexPaths: partialPaths, IndexMergeAccessMVIndex: true} indexMergePath.IndexMergeIsIntersection = isIntersection indexMergePath.TableFilters = remainingFilters - - // TODO: use a naive estimation strategy here now for simplicity, make it more accurate. - minEstRows, maxEstRows := math.MaxFloat64, -1.0 - for _, p := range indexMergePath.PartialIndexPaths { - minEstRows = math.Min(minEstRows, p.CountAfterAccess) - maxEstRows = math.Max(maxEstRows, p.CountAfterAccess) - } - if indexMergePath.IndexMergeIsIntersection { - indexMergePath.CountAfterAccess = minEstRows - } else { - indexMergePath.CountAfterAccess = maxEstRows - } + indexMergePath.CountAfterAccess = float64(histColl.RealtimeCount) * + cardinality.CalcTotalSelectivityForMVIdxPath(histColl, partialPaths, isIntersection) return indexMergePath } // buildPartialPaths4MVIndex builds partial paths by using these accessFilters upon this MVIndex. // The accessFilters must be corresponding to these idxCols. // OK indicates whether it builds successfully. These partial paths should be ignored if ok==false. -func (ds *DataSource) buildPartialPaths4MVIndex(accessFilters []expression.Expression, - idxCols []*expression.Column, mvIndex *model.IndexInfo) ( - partialPaths []*util.AccessPath, isIntersection bool, ok bool, err error) { +func buildPartialPaths4MVIndex( + sctx sessionctx.Context, + accessFilters []expression.Expression, + idxCols []*expression.Column, + mvIndex *model.IndexInfo, + histColl *statistics.HistColl, +) ( + partialPaths []*util.AccessPath, + isIntersection bool, + ok bool, + err error, +) { var virColID = -1 for i := range idxCols { // index column may contain other virtual column. @@ -1166,10 +1246,17 @@ func (ds *DataSource) buildPartialPaths4MVIndex(accessFilters []expression.Expre if virColID == -1 { // unexpected, no vir-col on this MVIndex return nil, false, false, nil } - if len(accessFilters) <= virColID { // no filter related to the vir-col, build a partial path directly. - partialPath, ok, err := ds.buildPartialPath4MVIndex(accessFilters, idxCols, mvIndex) - return []*util.AccessPath{partialPath}, false, ok, err + if len(accessFilters) <= virColID { + // No filter related to the vir-col, cannot build a path for multi-valued index. Scanning on a multi-valued + // index will only produce the rows whose corresponding array is not empty. + return nil, false, false, nil } + // If the condition is related with the array column, all following condition assumes that the array is not empty: + // `member of`, `json_contains`, `json_overlaps` all return false when the array is empty, except that + // `json_contains('[]', '[]')` is true. Therefore, using `json_contains(array, '[]')` is also not allowed here. + // + // Only when the condition implies that the array is not empty, it'd be safe to scan on multi-valued index without + // worrying whether the row with empty array will be lost in the result. virCol := idxCols[virColID] jsonType := virCol.GetType().ArrayType() @@ -1193,21 +1280,23 @@ func (ds *DataSource) buildPartialPaths4MVIndex(accessFilters []expression.Expre virColVals = append(virColVals, v) case ast.JSONContains: // (json_contains(a->'$.zip', '[1, 2, 3]') isIntersection = true - virColVals, ok = jsonArrayExpr2Exprs(ds.SCtx(), sf.GetArgs()[1], jsonType) - if !ok || len(virColVals) == 0 { // json_contains(JSON, '[]') is TRUE + virColVals, ok = jsonArrayExpr2Exprs(sctx, sf.GetArgs()[1], jsonType) + if !ok || len(virColVals) == 0 { + // json_contains(JSON, '[]') is TRUE. If the row has an empty array, it'll not exist on multi-valued index, + // but the `json_contains(array, '[]')` is still true, so also don't try to scan on the index. return nil, false, false, nil } case ast.JSONOverlaps: // (json_overlaps(a->'$.zip', '[1, 2, 3]') var jsonPathIdx int - if sf.GetArgs()[0].Equal(ds.SCtx(), targetJSONPath) { + if sf.GetArgs()[0].Equal(sctx, targetJSONPath) { jsonPathIdx = 0 // (json_overlaps(a->'$.zip', '[1, 2, 3]') - } else if sf.GetArgs()[1].Equal(ds.SCtx(), targetJSONPath) { + } else if sf.GetArgs()[1].Equal(sctx, targetJSONPath) { jsonPathIdx = 1 // (json_overlaps('[1, 2, 3]', a->'$.zip') } else { return nil, false, false, nil } var ok bool - virColVals, ok = jsonArrayExpr2Exprs(ds.SCtx(), sf.GetArgs()[1-jsonPathIdx], jsonType) + virColVals, ok = jsonArrayExpr2Exprs(sctx, sf.GetArgs()[1-jsonPathIdx], jsonType) if !ok || len(virColVals) == 0 { // forbid empty array for safety return nil, false, false, nil } @@ -1223,7 +1312,7 @@ func (ds *DataSource) buildPartialPaths4MVIndex(accessFilters []expression.Expre for _, v := range virColVals { // rewrite json functions to EQ to calculate range, `(1 member of j)` -> `j=1`. - eq, err := expression.NewFunction(ds.SCtx(), ast.EQ, types.NewFieldType(mysql.TypeTiny), virCol, v) + eq, err := expression.NewFunction(sctx, ast.EQ, types.NewFieldType(mysql.TypeTiny), virCol, v) if err != nil { return nil, false, false, err } @@ -1231,7 +1320,7 @@ func (ds *DataSource) buildPartialPaths4MVIndex(accessFilters []expression.Expre copy(newAccessFilters, accessFilters) newAccessFilters[virColID] = eq - partialPath, ok, err := ds.buildPartialPath4MVIndex(newAccessFilters, idxCols, mvIndex) + partialPath, ok, err := buildPartialPath4MVIndex(sctx, newAccessFilters, idxCols, mvIndex, histColl) if !ok || err != nil { return nil, false, ok, err } @@ -1249,7 +1338,13 @@ func isSafeTypeConversion4MVIndexRange(valType, mvIndexType *types.FieldType) (s } // buildPartialPath4MVIndex builds a partial path on this MVIndex with these accessFilters. -func (ds *DataSource) buildPartialPath4MVIndex(accessFilters []expression.Expression, idxCols []*expression.Column, mvIndex *model.IndexInfo) (*util.AccessPath, bool, error) { +func buildPartialPath4MVIndex( + sctx sessionctx.Context, + accessFilters []expression.Expression, + idxCols []*expression.Column, + mvIndex *model.IndexInfo, + histColl *statistics.HistColl, +) (*util.AccessPath, bool, error) { partialPath := &util.AccessPath{Index: mvIndex} partialPath.Ranges = ranger.FullRange() for i := 0; i < len(idxCols); i++ { @@ -1258,7 +1353,7 @@ func (ds *DataSource) buildPartialPath4MVIndex(accessFilters []expression.Expres partialPath.FullIdxCols = append(partialPath.FullIdxCols, idxCols[i]) partialPath.FullIdxColLens = append(partialPath.FullIdxColLens, mvIndex.Columns[i].Length) } - if err := ds.detachCondAndBuildRangeForPath(partialPath, accessFilters); err != nil { + if err := detachCondAndBuildRangeForPath(sctx, partialPath, accessFilters, histColl); err != nil { return nil, false, err } if len(partialPath.AccessConds) != len(accessFilters) || len(partialPath.TableFilters) > 0 { @@ -1268,13 +1363,18 @@ func (ds *DataSource) buildPartialPath4MVIndex(accessFilters []expression.Expres return partialPath, true, nil } -func (ds *DataSource) prepareCols4MVIndex(mvIndex *model.IndexInfo) (idxCols []*expression.Column, ok bool) { +// PrepareCols4MVIndex exported for test. +func PrepareCols4MVIndex( + tableInfo *model.TableInfo, + mvIndex *model.IndexInfo, + tblCols []*expression.Column, +) (idxCols []*expression.Column, ok bool) { var virColNum = 0 for i := range mvIndex.Columns { colOffset := mvIndex.Columns[i].Offset - colMeta := ds.table.Meta().Cols()[colOffset] + colMeta := tableInfo.Cols()[colOffset] var col *expression.Column - for _, c := range ds.TblCols { + for _, c := range tblCols { if c.ID == colMeta.ID { col = c break @@ -1301,7 +1401,7 @@ func (ds *DataSource) prepareCols4MVIndex(mvIndex *model.IndexInfo) (idxCols []* // collectFilters4MVIndex splits these filters into 2 parts where accessFilters can be used to access this index directly. // For idx(x, cast(a as array), z), `x=1 and (2 member of a) and z=1 and x+z>0` is split to: // accessFilters: `x=1 and (2 member of a) and z=1`, remaining: `x+z>0`. -func (ds *DataSource) collectFilters4MVIndex(filters []expression.Expression, idxCols []*expression.Column) (accessFilters, remainingFilters []expression.Expression) { +func collectFilters4MVIndex(sctx sessionctx.Context, filters []expression.Expression, idxCols []*expression.Column) (accessFilters, remainingFilters []expression.Expression) { usedAsAccess := make([]bool, len(filters)) for _, col := range idxCols { found := false @@ -1309,7 +1409,7 @@ func (ds *DataSource) collectFilters4MVIndex(filters []expression.Expression, id if usedAsAccess[i] { continue } - if ds.checkFilter4MVIndexColumn(f, col) { + if checkFilter4MVIndexColumn(sctx, f, col) { accessFilters = append(accessFilters, f) usedAsAccess[i] = true found = true @@ -1328,6 +1428,7 @@ func (ds *DataSource) collectFilters4MVIndex(filters []expression.Expression, id return accessFilters, remainingFilters } +// CollectFilters4MVIndexMutations exported for unit test. // For idx(x, cast(a as array), z), `x=1 and (2 member of a) and (1 member of a) and z=1 and x+z>0` is split to: // accessFilters combination: // 1: `x=1 and (2 member of a) and z=1`, remaining: `x+z>0`. @@ -1364,7 +1465,7 @@ func (ds *DataSource) collectFilters4MVIndex(filters []expression.Expression, id // accessFilters: [x=1, (2 member of a), z=1], remainingFilters: [x+z>0], mvColOffset: 1, mvFilterMutations[(2 member of a), (1 member of a)] // // the outer usage will be: accessFilter[mvColOffset] = each element of mvFilterMutations to get the mv access filters mutation combination. -func (ds *DataSource) collectFilters4MVIndexMutations(filters []expression.Expression, +func CollectFilters4MVIndexMutations(sctx sessionctx.Context, filters []expression.Expression, idxCols []*expression.Column) (accessFilters, remainingFilters []expression.Expression, mvColOffset int, mvFilterMutations []expression.Expression) { usedAsAccess := make([]bool, len(filters)) // accessFilters [x, a, z] @@ -1378,12 +1479,20 @@ func (ds *DataSource) collectFilters4MVIndexMutations(filters []expression.Expre if usedAsAccess[i] { continue } - if ds.checkFilter4MVIndexColumn(f, col) { + if checkFilter4MVIndexColumn(sctx, f, col) { if col.VirtualExpr != nil && col.VirtualExpr.GetType().IsArray() { // assert jsonColOffset should always be the same. // if the filter is from virtual expression, it means it is about the mv json col. mvFilterMutations = append(mvFilterMutations, f) - mvColOffset = z + if mvColOffset == -1 { + // means first encountering, recording offset pos, and append it as occupation of access filter. + mvColOffset = z + accessFilters = append(accessFilters, f) + } + // additional encountering, just map it as used access. + usedAsAccess[i] = true + found = true + continue } accessFilters = append(accessFilters, f) usedAsAccess[i] = true @@ -1403,8 +1512,59 @@ func (ds *DataSource) collectFilters4MVIndexMutations(filters []expression.Expre return accessFilters, remainingFilters, mvColOffset, mvFilterMutations } +// cleanAccessPathForMVIndexHint removes all other access path if there is a multi-valued index hint, and this hint +// has a valid path +func (ds *DataSource) cleanAccessPathForMVIndexHint() { + forcedMultiValuedIndex := make(map[int64]struct{}, len(ds.possibleAccessPaths)) + for _, p := range ds.possibleAccessPaths { + if !isMVIndexPath(p) || !p.Forced { + continue + } + forcedMultiValuedIndex[p.Index.ID] = struct{}{} + } + // no multi-valued index specified, just return + if len(forcedMultiValuedIndex) == 0 { + return + } + + validMVIndexPath := make([]*util.AccessPath, 0, len(ds.possibleAccessPaths)) + for _, p := range ds.possibleAccessPaths { + if indexMergeContainSpecificIndex(p, forcedMultiValuedIndex) { + validMVIndexPath = append(validMVIndexPath, p) + } + } + if len(validMVIndexPath) > 0 { + ds.possibleAccessPaths = validMVIndexPath + } +} + +// indexMergeContainSpecificIndex checks whether the index merge path contains at least one index in the `indexSet` +func indexMergeContainSpecificIndex(path *util.AccessPath, indexSet map[int64]struct{}) bool { + if path.PartialIndexPaths == nil { + return false + } + for _, p := range path.PartialIndexPaths { + // NOTE: currently, an index merge access path can only be "a single layer", it's impossible to meet this + // condition. These codes are just left here for future change. + if len(p.PartialIndexPaths) > 0 { + contain := indexMergeContainSpecificIndex(p, indexSet) + if contain { + return true + } + } + + if p.Index != nil { + if _, ok := indexSet[p.Index.ID]; ok { + return true + } + } + } + + return false +} + // checkFilter4MVIndexColumn checks whether this filter can be used as an accessFilter to access the MVIndex column. -func (ds *DataSource) checkFilter4MVIndexColumn(filter expression.Expression, idxCol *expression.Column) bool { +func checkFilter4MVIndexColumn(sctx sessionctx.Context, filter expression.Expression, idxCol *expression.Column) bool { sf, ok := filter.(*expression.ScalarFunction) if !ok { return false @@ -1416,12 +1576,12 @@ func (ds *DataSource) checkFilter4MVIndexColumn(filter expression.Expression, id } switch sf.FuncName.L { case ast.JSONMemberOf: // (1 member of a) - return targetJSONPath.Equal(ds.SCtx(), sf.GetArgs()[1]) + return targetJSONPath.Equal(sctx, sf.GetArgs()[1]) case ast.JSONContains: // json_contains(a, '1') - return targetJSONPath.Equal(ds.SCtx(), sf.GetArgs()[0]) + return targetJSONPath.Equal(sctx, sf.GetArgs()[0]) case ast.JSONOverlaps: // json_overlaps(a, '1') or json_overlaps('1', a) - return targetJSONPath.Equal(ds.SCtx(), sf.GetArgs()[0]) || - targetJSONPath.Equal(ds.SCtx(), sf.GetArgs()[1]) + return targetJSONPath.Equal(sctx, sf.GetArgs()[0]) || + targetJSONPath.Equal(sctx, sf.GetArgs()[1]) default: return false } @@ -1444,7 +1604,7 @@ func (ds *DataSource) checkFilter4MVIndexColumn(filter expression.Expression, id if argCol == nil || argConst == nil { return false } - if argCol.Equal(ds.SCtx(), idxCol) { + if argCol.Equal(sctx, idxCol) { return true } } diff --git a/pkg/planner/core/indexmerge_path_test.go b/pkg/planner/core/indexmerge_path_test.go index 6358389049349..e73156f91883d 100644 --- a/pkg/planner/core/indexmerge_path_test.go +++ b/pkg/planner/core/indexmerge_path_test.go @@ -15,14 +15,92 @@ package core_test import ( + "context" "fmt" "math/rand" "strings" "testing" + "github.com/pingcap/tidb/pkg/expression" + "github.com/pingcap/tidb/pkg/infoschema" + "github.com/pingcap/tidb/pkg/parser" + "github.com/pingcap/tidb/pkg/parser/ast" + "github.com/pingcap/tidb/pkg/parser/model" + "github.com/pingcap/tidb/pkg/planner/core" + "github.com/pingcap/tidb/pkg/sessiontxn" "github.com/pingcap/tidb/pkg/testkit" + "github.com/pingcap/tidb/pkg/util/hint" + "github.com/stretchr/testify/require" ) +func TestCollectFilters4MVIndexMutations(t *testing.T) { + store, domain := testkit.CreateMockStoreAndDomain(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a int, b int, domains json null, images json null, KEY `a_domains_b` (a, (cast(`domains` as char(253) array)), b))") + sql := "SELECT * FROM t WHERE 15975127 member of (domains) AND 15975128 member of (domains) AND a = 1 AND b = 2" + + par := parser.New() + par.SetParserConfig(parser.ParserConfig{EnableWindowFunction: true, EnableStrictDoubleTypeCheck: true}) + // Make sure the table schema is the new schema. + err := domain.Reload() + require.NoError(t, err) + is := domain.InfoSchema() + is = &infoschema.SessionExtendedInfoSchema{InfoSchema: is} + require.NoError(t, tk.Session().PrepareTxnCtx(context.TODO())) + require.NoError(t, sessiontxn.GetTxnManager(tk.Session()).OnStmtStart(context.TODO(), nil)) + stmt, err := par.ParseOneStmt(sql, "", "") + require.NoError(t, err) + tk.Session().GetSessionVars().PlanID.Store(0) + tk.Session().GetSessionVars().PlanColumnID.Store(0) + err = core.Preprocess(context.Background(), tk.Session(), stmt, core.WithPreprocessorReturn(&core.PreprocessorReturn{InfoSchema: is})) + require.NoError(t, err) + require.NoError(t, sessiontxn.GetTxnManager(tk.Session()).AdviseWarmup()) + builder, _ := core.NewPlanBuilder().Init(tk.Session(), is, hint.NewQBHintHandler(nil)) + p, err := builder.Build(context.TODO(), stmt) + require.NoError(t, err) + logicalP, err := core.LogicalOptimizeTest(context.TODO(), builder.GetOptFlag(), p.(core.LogicalPlan)) + require.NoError(t, err) + + ds, ok := logicalP.(*core.DataSource) + for !ok { + p := logicalP.Children()[0] + ds, ok = p.(*core.DataSource) + } + cnfs := ds.GetAllConds() + tbl, err := is.TableByName(model.NewCIStr("test"), model.NewCIStr("t")) + require.NoError(t, err) + idxCols, ok := core.PrepareCols4MVIndex(tbl.Meta(), tbl.Meta().FindIndexByName("a_domains_b"), ds.TblCols) + require.True(t, ok) + accessFilters, _, mvColOffset, mvFilterMutations := core.CollectFilters4MVIndexMutations(tk.Session(), cnfs, idxCols) + + // assert mv col access filters. + require.Equal(t, len(accessFilters), 3) + sf, ok := accessFilters[0].(*expression.ScalarFunction) + require.True(t, ok) + require.Equal(t, sf.FuncName.L, ast.EQ) + sf, ok = accessFilters[1].(*expression.ScalarFunction) + require.True(t, ok) + require.Equal(t, sf.FuncName.L, ast.JSONMemberOf) + sf, ok = accessFilters[2].(*expression.ScalarFunction) + require.True(t, ok) + require.Equal(t, sf.FuncName.L, ast.EQ) + + // assert mv col offset + require.Equal(t, mvColOffset, 1) + + // assert mv col condition mutations. + require.Equal(t, len(mvFilterMutations), 2) + sf, ok = mvFilterMutations[0].(*expression.ScalarFunction) + require.True(t, ok) + require.Equal(t, sf.FuncName.L, ast.JSONMemberOf) + sf, ok = mvFilterMutations[1].(*expression.ScalarFunction) + require.True(t, ok) + require.Equal(t, sf.FuncName.L, ast.JSONMemberOf) +} + func TestMultiMVIndexRandom(t *testing.T) { store := testkit.CreateMockStore(t) tk := testkit.NewTestKit(t, store) diff --git a/pkg/planner/core/indexmerge_test.go b/pkg/planner/core/indexmerge_test.go index f0af902ff9607..bb89671cbb58e 100644 --- a/pkg/planner/core/indexmerge_test.go +++ b/pkg/planner/core/indexmerge_test.go @@ -76,7 +76,7 @@ func TestIndexMergePathGeneration(t *testing.T) { err = Preprocess(context.Background(), sctx, stmt, WithPreprocessorReturn(&PreprocessorReturn{InfoSchema: is})) require.NoError(t, err) sctx := MockContext() - builder, _ := NewPlanBuilder().Init(sctx, is, &hint.BlockHintProcessor{}) + builder, _ := NewPlanBuilder().Init(sctx, is, hint.NewQBHintHandler(nil)) p, err := builder.Build(ctx, stmt) if err != nil { testdata.OnRecord(func() { diff --git a/pkg/planner/core/initialize.go b/pkg/planner/core/initialize.go index f48eb8296c59b..d50455d30e99e 100644 --- a/pkg/planner/core/initialize.go +++ b/pkg/planner/core/initialize.go @@ -69,28 +69,28 @@ func (la LogicalApply) Init(ctx sessionctx.Context, offset int) *LogicalApply { } // Init initializes LogicalSelection. -func (p LogicalSelection) Init(ctx sessionctx.Context, offset int) *LogicalSelection { - p.baseLogicalPlan = newBaseLogicalPlan(ctx, plancodec.TypeSel, &p, offset) +func (p LogicalSelection) Init(ctx sessionctx.Context, qbOffset int) *LogicalSelection { + p.baseLogicalPlan = newBaseLogicalPlan(ctx, plancodec.TypeSel, &p, qbOffset) return &p } // Init initializes PhysicalSelection. -func (p PhysicalSelection) Init(ctx sessionctx.Context, stats *property.StatsInfo, offset int, props ...*property.PhysicalProperty) *PhysicalSelection { - p.basePhysicalPlan = newBasePhysicalPlan(ctx, plancodec.TypeSel, &p, offset) +func (p PhysicalSelection) Init(ctx sessionctx.Context, stats *property.StatsInfo, qbOffset int, props ...*property.PhysicalProperty) *PhysicalSelection { + p.basePhysicalPlan = newBasePhysicalPlan(ctx, plancodec.TypeSel, &p, qbOffset) p.childrenReqProps = props p.SetStats(stats) return &p } // Init initializes LogicalUnionScan. -func (p LogicalUnionScan) Init(ctx sessionctx.Context, offset int) *LogicalUnionScan { - p.baseLogicalPlan = newBaseLogicalPlan(ctx, plancodec.TypeUnionScan, &p, offset) +func (p LogicalUnionScan) Init(ctx sessionctx.Context, qbOffset int) *LogicalUnionScan { + p.baseLogicalPlan = newBaseLogicalPlan(ctx, plancodec.TypeUnionScan, &p, qbOffset) return &p } // Init initializes LogicalProjection. -func (p LogicalProjection) Init(ctx sessionctx.Context, offset int) *LogicalProjection { - p.baseLogicalPlan = newBaseLogicalPlan(ctx, plancodec.TypeProj, &p, offset) +func (p LogicalProjection) Init(ctx sessionctx.Context, qbOffset int) *LogicalProjection { + p.baseLogicalPlan = newBaseLogicalPlan(ctx, plancodec.TypeProj, &p, qbOffset) return &p } @@ -556,6 +556,10 @@ func (p *BatchPointGetPlan) Init(ctx sessionctx.Context, stats *property.StatsIn d types.Datum ) + if p.PartitionColPos == GlobalWithoutColumnPos { + return p + } + if p.PartitionExpr != nil { if len(p.Handles) > 0 { for _, handle := range p.Handles { diff --git a/pkg/planner/core/integration_partition_test.go b/pkg/planner/core/integration_partition_test.go index ed2d15bdad374..545a18b900a20 100644 --- a/pkg/planner/core/integration_partition_test.go +++ b/pkg/planner/core/integration_partition_test.go @@ -21,11 +21,8 @@ import ( "strconv" "testing" - "github.com/pingcap/tidb/pkg/parser/auth" - "github.com/pingcap/tidb/pkg/session" "github.com/pingcap/tidb/pkg/testkit" "github.com/pingcap/tidb/pkg/util/benchdaily" - "github.com/stretchr/testify/require" ) func TestListPartitionOrderLimit(t *testing.T) { @@ -144,44 +141,6 @@ func TestListPartitionAgg(t *testing.T) { } } -func TestListPartitionPrivilege(t *testing.T) { - store := testkit.CreateMockStore(t) - - tk := testkit.NewTestKit(t, store) - - se, err := session.CreateSession4Test(store) - require.NoError(t, err) - require.NoError(t, se.Auth(&auth.UserIdentity{Username: "root", Hostname: "%"}, nil, nil, nil)) - tk.SetSession(se) - tk.MustExec("create database list_partition_pri") - tk.MustExec("use list_partition_pri") - tk.MustExec("drop table if exists tlist") - tk.MustExec(`set tidb_enable_list_partition = 1`) - tk.MustExec(`create table tlist (a int) partition by list (a) (partition p0 values in (0), partition p1 values in (1))`) - - tk.MustExec(`create user 'priv_test'@'%'`) - tk.MustExec(`grant select on list_partition_pri.tlist to 'priv_test'`) - - tk1 := testkit.NewTestKit(t, store) - se, err = session.CreateSession4Test(store) - require.NoError(t, err) - require.NoError(t, se.Auth(&auth.UserIdentity{Username: "priv_test", Hostname: "%"}, nil, nil, nil)) - tk1.SetSession(se) - tk1.MustExec(`use list_partition_pri`) - err = tk1.ExecToErr(`alter table tlist truncate partition p0`) - require.Error(t, err) - require.Contains(t, err.Error(), "denied") - err = tk1.ExecToErr(`alter table tlist drop partition p0`) - require.Error(t, err) - require.Contains(t, err.Error(), "denied") - err = tk1.ExecToErr(`alter table tlist add partition (partition p2 values in (2))`) - require.Error(t, err) - require.Contains(t, err.Error(), "denied") - err = tk1.ExecToErr(`insert into tlist values (1)`) - require.Error(t, err) - require.Contains(t, err.Error(), "denied") -} - func TestListPartitionView(t *testing.T) { store := testkit.CreateMockStore(t) diff --git a/pkg/planner/core/integration_test.go b/pkg/planner/core/integration_test.go index fdacbc06460eb..9b1f0758884b3 100644 --- a/pkg/planner/core/integration_test.go +++ b/pkg/planner/core/integration_test.go @@ -107,7 +107,7 @@ func TestAggPushDownEngine(t *testing.T) { " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo")) } -func TestIssue15110(t *testing.T) { +func TestIssue15110And49616(t *testing.T) { store := testkit.CreateMockStore(t) tk := testkit.NewTestKit(t, store) tk.MustExec("use test") @@ -141,78 +141,15 @@ func TestIssue15110(t *testing.T) { tk.MustExec("set @@session.tidb_isolation_read_engines = 'tiflash'") tk.MustExec("explain format = 'brief' SELECT count(*) FROM crm_rd_150m dataset_48 WHERE (CASE WHEN (month(dataset_48.customer_first_date)) <= 30 THEN '新客' ELSE NULL END) IS NOT NULL;") -} - -func TestKeepOrderHintWithBinding(t *testing.T) { - store := testkit.CreateMockStore(t) - tk := testkit.NewTestKit(t, store) - - tk.MustExec("use test") - tk.MustExec("set tidb_cost_model_version=2") - tk.MustExec("drop table if exists t1") - tk.MustExec("create table t1(a int, b int, index idx_a(a));") - - // create binding for order_index hint - tk.MustExec("select * from t1 where a<10 order by a limit 1;") - tk.MustQuery("select @@last_plan_from_binding").Check(testkit.Rows("0")) - tk.MustExec("create global binding for select * from t1 where a<10 order by a limit 1 using select /*+ order_index(t1, idx_a) */ * from t1 where a<10 order by a limit 1;") - tk.MustExec("select * from t1 where a<10 order by a limit 1;") - tk.MustQuery("select @@last_plan_from_binding").Check(testkit.Rows("1")) - res := tk.MustQuery("show global bindings").Rows() - require.Equal(t, res[0][0], "select * from `test` . `t1` where `a` < ? order by `a` limit ?") - require.Equal(t, res[0][1], "SELECT /*+ order_index(`t1` `idx_a`)*/ * FROM `test`.`t1` WHERE `a` < 10 ORDER BY `a` LIMIT 1") - - tk.MustExec("drop global binding for select * from t1 where a<10 order by a limit 1;") - tk.MustExec("select * from t1 where a<10 order by a limit 1;") - tk.MustQuery("select @@last_plan_from_binding").Check(testkit.Rows("0")) - res = tk.MustQuery("show global bindings").Rows() - require.Equal(t, len(res), 0) - - // create binding for no_order_index hint - tk.MustExec("create global binding for select * from t1 where a<10 order by a limit 1 using select /*+ no_order_index(t1, idx_a) */ * from t1 where a<10 order by a limit 1;") - tk.MustExec("select * from t1 where a<10 order by a limit 1;") - tk.MustQuery("select @@last_plan_from_binding").Check(testkit.Rows("1")) - res = tk.MustQuery("show global bindings").Rows() - require.Equal(t, res[0][0], "select * from `test` . `t1` where `a` < ? order by `a` limit ?") - require.Equal(t, res[0][1], "SELECT /*+ no_order_index(`t1` `idx_a`)*/ * FROM `test`.`t1` WHERE `a` < 10 ORDER BY `a` LIMIT 1") - - tk.MustExec("drop global binding for select * from t1 where a<10 order by a limit 1;") - tk.MustExec("select * from t1 where a<10 order by a limit 1;") - tk.MustQuery("select @@last_plan_from_binding").Check(testkit.Rows("0")) - res = tk.MustQuery("show global bindings").Rows() - require.Equal(t, len(res), 0) -} -func TestViewHintWithBinding(t *testing.T) { - store := testkit.CreateMockStore(t) - tk := testkit.NewTestKit(t, store) - - tk.MustExec("use test") - tk.MustExec("set tidb_cost_model_version=2") - tk.MustExec("drop view if exists v, v1") - tk.MustExec("drop table if exists t, t1, t2, t3") - tk.MustExec("create table t(a int, b int);") - tk.MustExec("create table t1(a int, b int);") - tk.MustExec("create table t2(a int, b int);") - tk.MustExec("create table t3(a int, b int)") - tk.MustExec("create definer='root'@'localhost' view v as select t.a, t.b from t join (select count(*) as a from t1 join t2 join t3 where t1.b=t2.b and t2.a = t3.a group by t2.a) tt on t.a = tt.a;") - tk.MustExec("create definer='root'@'localhost' view v1 as select t.a, t.b from t join (select count(*) as a from t1 join v on t1.b=v.b group by v.a) tt on t.a = tt.a;") - tk.MustExec("create definer='root'@'localhost' view v2 as select t.a, t.b from t join (select count(*) as a from t1 join v1 on t1.b=v1.b group by v1.a) tt on t.a = tt.a;") - - tk.MustExec("select * from v2") - tk.MustQuery("select @@last_plan_from_binding").Check(testkit.Rows("0")) - tk.MustExec("create global binding for select * from v2 using select /*+ qb_name(qb_v_2, v2.v1@sel_2 .v@sel_2 .@sel_2), merge_join(t1@qb_v_2), stream_agg(@qb_v_2), qb_name(qb_v_1, v2. v1@sel_2 .v@sel_2 .@sel_1), merge_join(t@qb_v_1) */ * from v2;") - tk.MustExec("select * from v2") - tk.MustQuery("select @@last_plan_from_binding").Check(testkit.Rows("1")) - res := tk.MustQuery("show global bindings").Rows() - require.Equal(t, res[0][0], "select * from `test` . `v2`") - require.Equal(t, res[0][1], "SELECT /*+ qb_name(`qb_v_2` , `v2`. `v1`@`sel_2`. `v`@`sel_2`. ``@`sel_2`) merge_join(`t1`@`qb_v_2`) stream_agg(@`qb_v_2`) qb_name(`qb_v_1` , `v2`. `v1`@`sel_2`. `v`@`sel_2`. ``@`sel_1`) merge_join(`t`@`qb_v_1`)*/ * FROM `test`.`v2`") - - tk.MustExec("drop global binding for select * from v2") - tk.MustExec("select * from v2") - tk.MustQuery("select @@last_plan_from_binding").Check(testkit.Rows("0")) - res = tk.MustQuery("show global bindings").Rows() - require.Equal(t, len(res), 0) + // for #49616 + tk.MustExec(`use test`) + tk.MustExec("set @@session.tidb_isolation_read_engines = 'tikv'") + tk.MustExec(`create table t1 (k int, a int)`) + tk.MustExec(`create table t2 (k int, b int, key(k))`) + tk.MustHavePlan(`select /*+ tidb_inlj(t2, t1) */ * + from t2 left join t1 on t1.k=t2.k + where a>0 or (a=0 and b>0)`, `IndexJoin`) } func TestPartitionPruningForEQ(t *testing.T) { @@ -951,25 +888,6 @@ func TestExplainAnalyzeDML2(t *testing.T) { } } -func TestIssue20139(t *testing.T) { - failpoint.Enable("github.com/pingcap/tidb/pkg/planner/core/forceDynamicPrune", `return(true)`) - defer failpoint.Disable("github.com/pingcap/tidb/pkg/planner/core/forceDynamicPrune") - store := testkit.CreateMockStore(t) - tk := testkit.NewTestKit(t, store) - - tk.MustExec("use test") - tk.MustExec("drop table if exists t") - tk.MustExec("create table t (id int, c int) partition by range (id) (partition p0 values less than (4), partition p1 values less than (7))") - tk.MustExec("insert into t values(3, 3), (5, 5)") - plan := tk.MustQuery("explain format = 'brief' select * from t where c = 1 and id = c") - plan.Check(testkit.Rows( - "TableReader 0.01 root partition:p0 data:Selection", - "└─Selection 0.01 cop[tikv] eq(test.t.c, 1), eq(test.t.id, 1)", - " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", - )) - tk.MustExec("drop table t") -} - func TestConflictReadFromStorage(t *testing.T) { failpoint.Enable("github.com/pingcap/tidb/pkg/planner/core/forceDynamicPrune", `return(true)`) defer failpoint.Disable("github.com/pingcap/tidb/pkg/planner/core/forceDynamicPrune") @@ -1964,14 +1882,14 @@ func TestPlanCacheForIndexJoinRangeFallback(t *testing.T) { tk.MustExec("drop table if exists t1, t2") tk.MustExec("create table t1(a int, b varchar(10), c varchar(10), index idx_a_b(a, b))") tk.MustExec("create table t2(d int)") - tk.MustExec("set @@tidb_opt_range_max_size=1275") - // 1275 is enough for [? a,? a], [? b,? b], [? c,? c] but is not enough for [? aaaaaa,? aaaaaa], [? bbbbbb,? bbbbbb], [? cccccc,? cccccc]. + tk.MustExec("set @@tidb_opt_range_max_size=1260") + // 1260 is enough for [? a,? a], [? b,? b], [? c,? c] but is not enough for [? aaaaaa,? aaaaaa], [? bbbbbb,? bbbbbb], [? cccccc,? cccccc]. rows := tk.MustQuery("explain format='brief' select /*+ inl_join(t1) */ * from t1 join t2 on t1.a = t2.d where t1.b in ('a', 'b', 'c')").Rows() require.True(t, strings.Contains(rows[6][4].(string), "range: decided by [eq(test.t1.a, test.t2.d) in(test.t1.b, a, b, c)]")) tk.MustQuery("show warnings").Check(testkit.Rows()) rows = tk.MustQuery("explain format='brief' select /*+ inl_join(t1) */ * from t1 join t2 on t1.a = t2.d where t1.b in ('aaaaaa', 'bbbbbb', 'cccccc');").Rows() - require.True(t, strings.Contains(rows[6][4].(string), "range: decided by [eq(test.t1.a, test.t2.d)]")) - tk.MustQuery("show warnings").Check(testkit.Rows("Warning 1105 Memory capacity of 1275 bytes for 'tidb_opt_range_max_size' exceeded when building ranges. Less accurate ranges such as full range are chosen")) + require.Contains(t, rows[6][4].(string), "range: decided by [eq(test.t1.a, test.t2.d)]") + tk.MustQuery("show warnings").Check(testkit.Rows("Warning 1105 Memory capacity of 1260 bytes for 'tidb_opt_range_max_size' exceeded when building ranges. Less accurate ranges such as full range are chosen")) tk.MustExec("prepare stmt1 from 'select /*+ inl_join(t1) */ * from t1 join t2 on t1.a = t2.d where t1.b in (?, ?, ?)'") tk.MustExec("set @a='a', @b='b', @c='c'") @@ -1986,13 +1904,13 @@ func TestPlanCacheForIndexJoinRangeFallback(t *testing.T) { tk.Session().SetSessionManager(&testkit.MockSessionManager{PS: ps}) rows = tk.MustQuery(fmt.Sprintf("explain for connection %d", tkProcess.ID)).Rows() // We don't limit range mem usage when rebuilding index join ranges for the cached plan. So [? aaaaaa,? aaaaaa], [? bbbbbb,? bbbbbb], [? cccccc,? cccccc] can be built. - require.True(t, strings.Contains(rows[6][4].(string), "range: decided by [eq(test.t1.a, test.t2.d) in(test.t1.b, aaaaaa, bbbbbb, cccccc)]")) + require.Contains(t, rows[6][4].(string), "range: decided by [eq(test.t1.a, test.t2.d) in(test.t1.b, aaaaaa, bbbbbb, cccccc)]") // Test the plan with range fallback would not be put into cache. tk.MustExec("prepare stmt2 from 'select /*+ inl_join(t1) */ * from t1 join t2 on t1.a = t2.d where t1.b in (?, ?, ?, ?, ?)'") tk.MustExec("set @a='a', @b='b', @c='c', @d='d', @e='e'") tk.MustExec("execute stmt2 using @a, @b, @c, @d, @e") - tk.MustQuery("show warnings").Sort().Check(testkit.Rows("Warning 1105 Memory capacity of 1275 bytes for 'tidb_opt_range_max_size' exceeded when building ranges. Less accurate ranges such as full range are chosen", + tk.MustQuery("show warnings").Sort().Check(testkit.Rows("Warning 1105 Memory capacity of 1260 bytes for 'tidb_opt_range_max_size' exceeded when building ranges. Less accurate ranges such as full range are chosen", "Warning 1105 skip prepared plan-cache: in-list is too long")) tk.MustExec("execute stmt2 using @a, @b, @c, @d, @e") tk.MustQuery("select @@last_plan_from_cache").Check(testkit.Rows("0")) @@ -2224,53 +2142,6 @@ func TestWindowRangeFramePushDownTiflash(t *testing.T) { " └─TableFullScan_9 10000.00 mpp[tiflash] table:first_range keep order:false, stats:pseudo")) } -func TestIssue46177(t *testing.T) { - store := testkit.CreateMockStore(t) - tk := testkit.NewTestKit(t, store) - tk.MustExec(`use test`) - tk.MustExec(` CREATE TABLE sbtest ( - id int(10) unsigned NOT NULL AUTO_INCREMENT, - k int(10) unsigned NOT NULL DEFAULT '0', - c char(120) NOT NULL DEFAULT '', - pad char(60) NOT NULL DEFAULT '', - PRIMARY KEY (id) /*T![clustered_index] CLUSTERED */, - KEY k (k) -)`) - - // cannot choose the best plan with RangeScan. - tk.MustExec(`set @@tidb_opt_fix_control = '46177:off'`) - tk.MustQuery(`explain format='brief' select row_number() over(order by a.k) from (select * from sbtest where id<10) a`).Check(testkit.Rows( - `Projection 10.00 root Column#6->Column#7`, - `└─Window 10.00 root row_number()->Column#6 over(order by test.sbtest.k rows between current row and current row)`, - ` └─IndexReader 10.00 root index:Selection`, - ` └─Selection 10.00 cop[tikv] lt(test.sbtest.id, 10)`, - ` └─IndexFullScan 10000.00 cop[tikv] table:sbtest, index:k(k) keep order:true, stats:pseudo`)) - - tk.MustExec(`set @@tidb_opt_fix_control = '46177:on'`) - tk.MustQuery(`explain format='brief' select row_number() over(order by a.k) from (select * from sbtest where id<10) a`).Check(testkit.Rows( - `Projection 10.00 root Column#6->Column#7`, - `└─Window 10.00 root row_number()->Column#6 over(order by test.sbtest.k rows between current row and current row)`, - ` └─Sort 10.00 root test.sbtest.k`, - ` └─TableReader 10.00 root data:TableRangeScan`, - ` └─TableRangeScan 10.00 cop[tikv] table:sbtest range:[0,10), keep order:false, stats:pseudo`)) - - // cannot choose the range scan plan. - tk.MustExec(`set @@tidb_opt_fix_control = '46177:off'`) - tk.MustQuery(`explain format='brief' select /*+ stream_agg() */ count(1) from sbtest where id<1 group by k`).Check(testkit.Rows( - `StreamAgg 1.00 root group by:test.sbtest.k, funcs:count(Column#6)->Column#5`, - `└─IndexReader 1.00 root index:StreamAgg`, - ` └─StreamAgg 1.00 cop[tikv] group by:test.sbtest.k, funcs:count(1)->Column#6`, - ` └─Selection 1.00 cop[tikv] lt(test.sbtest.id, 1)`, - ` └─IndexFullScan 10000.00 cop[tikv] table:sbtest, index:k(k) keep order:true, stats:pseudo`)) - - tk.MustExec(`set @@tidb_opt_fix_control = '46177:on'`) - tk.MustQuery(`explain format='brief' select /*+ stream_agg() */ count(1) from sbtest where id<1 group by k`).Check(testkit.Rows( - `StreamAgg 1.00 root group by:test.sbtest.k, funcs:count(1)->Column#5`, - `└─Sort 1.00 root test.sbtest.k`, - ` └─TableReader 1.00 root data:TableRangeScan`, - ` └─TableRangeScan 1.00 cop[tikv] table:sbtest range:[0,1), keep order:false, stats:pseudo`)) -} - // https://github.com/pingcap/tidb/issues/41458 func TestIssue41458(t *testing.T) { store := testkit.CreateMockStore(t) diff --git a/pkg/planner/core/internal/base/plan.go b/pkg/planner/core/internal/base/plan.go index 7463093c8f2e3..00be1c4bd92c2 100644 --- a/pkg/planner/core/internal/base/plan.go +++ b/pkg/planner/core/internal/base/plan.go @@ -29,21 +29,21 @@ import ( // Plan Should be used as embedded struct in Plan implementations. type Plan struct { - ctx sessionctx.Context - stats *property.StatsInfo - tp string - id int - blockOffset int + ctx sessionctx.Context + stats *property.StatsInfo + tp string + id int + qbBlock int // Query Block offset } // NewBasePlan creates a new base plan. -func NewBasePlan(ctx sessionctx.Context, tp string, offset int) Plan { +func NewBasePlan(ctx sessionctx.Context, tp string, qbBlock int) Plan { id := ctx.GetSessionVars().PlanID.Add(1) return Plan{ - tp: tp, - id: int(id), - ctx: ctx, - blockOffset: offset, + tp: tp, + id: int(id), + ctx: ctx, + qbBlock: qbBlock, } } @@ -108,9 +108,9 @@ func (p *Plan) SetTP(tp string) { p.tp = tp } -// SelectBlockOffset is to get the select block offset. -func (p *Plan) SelectBlockOffset() int { - return p.blockOffset +// QueryBlockOffset is to get the select block offset. +func (p *Plan) QueryBlockOffset() int { + return p.qbBlock } // SetStats sets the stats diff --git a/pkg/planner/core/issuetest/main_test.go b/pkg/planner/core/issuetest/main_test.go index fba537637990e..0b1b09e33ea50 100644 --- a/pkg/planner/core/issuetest/main_test.go +++ b/pkg/planner/core/issuetest/main_test.go @@ -31,6 +31,7 @@ func TestMain(m *testing.M) { flag.Parse() opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), } callback := func(i int) int { diff --git a/pkg/planner/core/logical_plan_builder.go b/pkg/planner/core/logical_plan_builder.go index edc04269de2cf..2eed4cbac408b 100644 --- a/pkg/planner/core/logical_plan_builder.go +++ b/pkg/planner/core/logical_plan_builder.go @@ -60,7 +60,7 @@ import ( "github.com/pingcap/tidb/pkg/util/collate" "github.com/pingcap/tidb/pkg/util/dbterror" "github.com/pingcap/tidb/pkg/util/hack" - "github.com/pingcap/tidb/pkg/util/hint" + h "github.com/pingcap/tidb/pkg/util/hint" "github.com/pingcap/tidb/pkg/util/intset" "github.com/pingcap/tidb/pkg/util/logutil" "github.com/pingcap/tidb/pkg/util/plancodec" @@ -69,101 +69,6 @@ import ( "github.com/pingcap/tipb/go-tipb" ) -const ( - // TiDBMergeJoin is hint enforce merge join. - TiDBMergeJoin = "tidb_smj" - // HintSMJ is hint enforce merge join. - HintSMJ = "merge_join" - // HintNoMergeJoin is the hint to enforce the query not to use merge join. - HintNoMergeJoin = "no_merge_join" - - // TiDBBroadCastJoin indicates applying broadcast join by force. - TiDBBroadCastJoin = "tidb_bcj" - // HintBCJ indicates applying broadcast join by force. - HintBCJ = "broadcast_join" - // HintShuffleJoin indicates applying shuffle join by force. - HintShuffleJoin = "shuffle_join" - - // HintStraightJoin causes TiDB to join tables in the order in which they appear in the FROM clause. - HintStraightJoin = "straight_join" - // HintLeading specifies the set of tables to be used as the prefix in the execution plan. - HintLeading = "leading" - - // TiDBIndexNestedLoopJoin is hint enforce index nested loop join. - TiDBIndexNestedLoopJoin = "tidb_inlj" - // HintINLJ is hint enforce index nested loop join. - HintINLJ = "inl_join" - // HintINLHJ is hint enforce index nested loop hash join. - HintINLHJ = "inl_hash_join" - // HintINLMJ is hint enforce index nested loop merge join. - HintINLMJ = "inl_merge_join" - // HintNoIndexJoin is the hint to enforce the query not to use index join. - HintNoIndexJoin = "no_index_join" - // HintNoIndexHashJoin is the hint to enforce the query not to use index hash join. - HintNoIndexHashJoin = "no_index_hash_join" - // HintNoIndexMergeJoin is the hint to enforce the query not to use index merge join. - HintNoIndexMergeJoin = "no_index_merge_join" - // TiDBHashJoin is hint enforce hash join. - TiDBHashJoin = "tidb_hj" - // HintNoHashJoin is the hint to enforce the query not to use hash join. - HintNoHashJoin = "no_hash_join" - // HintHJ is hint enforce hash join. - HintHJ = "hash_join" - // HintHashJoinBuild is hint enforce hash join's build side - HintHashJoinBuild = "hash_join_build" - // HintHashJoinProbe is hint enforce hash join's probe side - HintHashJoinProbe = "hash_join_probe" - // HintHashAgg is hint enforce hash aggregation. - HintHashAgg = "hash_agg" - // HintStreamAgg is hint enforce stream aggregation. - HintStreamAgg = "stream_agg" - // HintMPP1PhaseAgg enforces the optimizer to use the mpp-1phase aggregation. - HintMPP1PhaseAgg = "mpp_1phase_agg" - // HintMPP2PhaseAgg enforces the optimizer to use the mpp-2phase aggregation. - HintMPP2PhaseAgg = "mpp_2phase_agg" - // HintUseIndex is hint enforce using some indexes. - HintUseIndex = "use_index" - // HintIgnoreIndex is hint enforce ignoring some indexes. - HintIgnoreIndex = "ignore_index" - // HintForceIndex make optimizer to use this index even if it thinks a table scan is more efficient. - HintForceIndex = "force_index" - // HintOrderIndex is hint enforce using some indexes and keep the index's order. - HintOrderIndex = "order_index" - // HintNoOrderIndex is hint enforce using some indexes and not keep the index's order. - HintNoOrderIndex = "no_order_index" - // HintAggToCop is hint enforce pushing aggregation to coprocessor. - HintAggToCop = "agg_to_cop" - // HintReadFromStorage is hint enforce some tables read from specific type of storage. - HintReadFromStorage = "read_from_storage" - // HintTiFlash is a label represents the tiflash storage type. - HintTiFlash = "tiflash" - // HintTiKV is a label represents the tikv storage type. - HintTiKV = "tikv" - // HintIndexMerge is a hint to enforce using some indexes at the same time. - HintIndexMerge = "use_index_merge" - // HintTimeRange is a hint to specify the time range for metrics summary tables - HintTimeRange = "time_range" - // HintIgnorePlanCache is a hint to enforce ignoring plan cache - HintIgnorePlanCache = "ignore_plan_cache" - // HintLimitToCop is a hint enforce pushing limit or topn to coprocessor. - HintLimitToCop = "limit_to_cop" - // HintMerge is a hint which can switch turning inline for the CTE. - HintMerge = "merge" - // HintSemiJoinRewrite is a hint to force we rewrite the semi join operator as much as possible. - HintSemiJoinRewrite = "semi_join_rewrite" - // HintNoDecorrelate indicates a LogicalApply not to be decorrelated. - HintNoDecorrelate = "no_decorrelate" - - // HintMemoryQuota sets the memory limit for a query - HintMemoryQuota = "memory_quota" - // HintUseToja is a hint to optimize `in (select ...)` subquery into `join` - HintUseToja = "use_toja" - // HintNoIndexMerge is a hint to disable index merge - HintNoIndexMerge = "no_index_merge" - // HintMaxExecutionTime specifies the max allowed execution time in milliseconds - HintMaxExecutionTime = "max_execution_time" -) - const ( // ErrExprInSelect is in select fields for the error of ErrFieldNotInGroupBy ErrExprInSelect = "SELECT list" @@ -356,7 +261,7 @@ func (b *PlanBuilder) buildAggregation(ctx context.Context, p LogicalPlan, aggFu plan4Agg := LogicalAggregation{AggFuncs: make([]*aggregation.AggFuncDesc, 0, len(aggFuncList))}.Init(b.ctx, b.getSelectOffset()) if hint := b.TableHints(); hint != nil { - plan4Agg.aggHints = hint.aggHints + plan4Agg.aggHints = hint.AggHints } schema4Agg := expression.NewSchema(make([]*expression.Column, 0, len(aggFuncList)+p.Schema().Len())...) names := make(types.NameSlice, 0, len(aggFuncList)+p.Schema().Len()) @@ -413,6 +318,7 @@ func (b *PlanBuilder) buildAggregation(ctx context.Context, p LogicalPlan, aggFu if _, ok = b.correlatedAggMapper[aggFuncList[j]]; !ok { b.correlatedAggMapper[aggFuncList[j]] = &expression.CorrelatedColumn{ Column: *schema4Agg.Columns[aggIndexMap[j]], + Data: new(types.Datum), } } b.correlatedAggMapper[aggFunc] = b.correlatedAggMapper[aggFuncList[j]] @@ -434,6 +340,7 @@ func (b *PlanBuilder) buildAggregation(ctx context.Context, p LogicalPlan, aggFu if _, ok := correlatedAggMap[aggFunc]; ok { b.correlatedAggMapper[aggFunc] = &expression.CorrelatedColumn{ Column: column, + Data: new(types.Datum), } } } @@ -554,7 +461,7 @@ func (b *PlanBuilder) buildResultSetNode(ctx context.Context, node ast.ResultSet plannerSelectBlockAsName = *p } if len(plannerSelectBlockAsName) > 0 && !isTableName { - plannerSelectBlockAsName[p.SelectBlockOffset()] = ast.HintTable{DBName: p.OutputNames()[0].DBName, TableName: p.OutputNames()[0].TblName} + plannerSelectBlockAsName[p.QueryBlockOffset()] = ast.HintTable{DBName: p.OutputNames()[0].DBName, TableName: p.OutputNames()[0].TblName} } // Duplicate column name in one table is not allowed. // "select * from (select 1, 1) as a;" is duplicate @@ -626,6 +533,7 @@ func (p *LogicalJoin) ExtractOnCondition( deriveLeft bool, deriveRight bool) (eqCond []*expression.ScalarFunction, leftCond []expression.Expression, rightCond []expression.Expression, otherCond []expression.Expression) { + ctx := p.SCtx() for _, expr := range conditions { // For queries like `select a in (select a from s where s.b = t.b) from t`, // if subquery is empty caused by `s.b = t.b`, the result should always be @@ -638,7 +546,6 @@ func (p *LogicalJoin) ExtractOnCondition( } binop, ok := expr.(*expression.ScalarFunction) if ok && len(binop.GetArgs()) == 2 { - ctx := binop.GetCtx() arg0, lOK := binop.GetArgs()[0].(*expression.Column) arg1, rOK := binop.GetArgs()[1].(*expression.Column) if lOK && rOK { @@ -695,13 +602,13 @@ func (p *LogicalJoin) ExtractOnCondition( // `expr AND leftRelaxedCond AND rightRelaxedCond`. Motivation is to push filters down to // children as much as possible. if deriveLeft { - leftRelaxedCond := expression.DeriveRelaxedFiltersFromDNF(expr, leftSchema) + leftRelaxedCond := expression.DeriveRelaxedFiltersFromDNF(ctx, expr, leftSchema) if leftRelaxedCond != nil { leftCond = append(leftCond, leftRelaxedCond) } } if deriveRight { - rightRelaxedCond := expression.DeriveRelaxedFiltersFromDNF(expr, rightSchema) + rightRelaxedCond := expression.DeriveRelaxedFiltersFromDNF(ctx, expr, rightSchema) if rightRelaxedCond != nil { rightCond = append(rightCond, rightRelaxedCond) } @@ -714,8 +621,8 @@ func (p *LogicalJoin) ExtractOnCondition( // extractTableAlias returns table alias of the LogicalPlan's columns. // It will return nil when there are multiple table alias, because the alias is only used to check if -// the logicalPlan match some optimizer hints, and hints are not expected to take effect in this case. -func extractTableAlias(p Plan, parentOffset int) *hintTableInfo { +// the logicalPlan Match some optimizer hints, and hints are not expected to take effect in this case. +func extractTableAlias(p Plan, parentOffset int) *h.TableInfo { if len(p.OutputNames()) > 0 && p.OutputNames()[0].TblName.L != "" { firstName := p.OutputNames()[0] for _, name := range p.OutputNames() { @@ -724,142 +631,142 @@ func extractTableAlias(p Plan, parentOffset int) *hintTableInfo { return nil } } - blockOffset := p.SelectBlockOffset() + qbOffset := p.QueryBlockOffset() var blockAsNames []ast.HintTable if p := p.SCtx().GetSessionVars().PlannerSelectBlockAsName.Load(); p != nil { blockAsNames = *p } // For sub-queries like `(select * from t) t1`, t1 should belong to its surrounding select block. - if blockOffset != parentOffset && blockAsNames != nil && blockAsNames[blockOffset].TableName.L != "" { - blockOffset = parentOffset + if qbOffset != parentOffset && blockAsNames != nil && blockAsNames[qbOffset].TableName.L != "" { + qbOffset = parentOffset } dbName := firstName.DBName if dbName.L == "" { dbName = model.NewCIStr(p.SCtx().GetSessionVars().CurrentDB) } - return &hintTableInfo{dbName: dbName, tblName: firstName.TblName, selectOffset: blockOffset} + return &h.TableInfo{DBName: dbName, TblName: firstName.TblName, SelectOffset: qbOffset} } return nil } -func (p *LogicalJoin) setPreferredJoinTypeAndOrder(hintInfo *tableHintInfo) { +func (p *LogicalJoin) setPreferredJoinTypeAndOrder(hintInfo *h.TableHintInfo) { if hintInfo == nil { return } - lhsAlias := extractTableAlias(p.children[0], p.SelectBlockOffset()) - rhsAlias := extractTableAlias(p.children[1], p.SelectBlockOffset()) - if hintInfo.ifPreferMergeJoin(lhsAlias) { - p.preferJoinType |= preferMergeJoin - p.leftPreferJoinType |= preferMergeJoin + lhsAlias := extractTableAlias(p.children[0], p.QueryBlockOffset()) + rhsAlias := extractTableAlias(p.children[1], p.QueryBlockOffset()) + if hintInfo.IfPreferMergeJoin(lhsAlias) { + p.preferJoinType |= h.PreferMergeJoin + p.leftPreferJoinType |= h.PreferMergeJoin } - if hintInfo.ifPreferMergeJoin(rhsAlias) { - p.preferJoinType |= preferMergeJoin - p.rightPreferJoinType |= preferMergeJoin + if hintInfo.IfPreferMergeJoin(rhsAlias) { + p.preferJoinType |= h.PreferMergeJoin + p.rightPreferJoinType |= h.PreferMergeJoin } - if hintInfo.ifPreferNoMergeJoin(lhsAlias) { - p.preferJoinType |= preferNoMergeJoin - p.leftPreferJoinType |= preferNoMergeJoin + if hintInfo.IfPreferNoMergeJoin(lhsAlias) { + p.preferJoinType |= h.PreferNoMergeJoin + p.leftPreferJoinType |= h.PreferNoMergeJoin } - if hintInfo.ifPreferNoMergeJoin(rhsAlias) { - p.preferJoinType |= preferNoMergeJoin - p.rightPreferJoinType |= preferNoMergeJoin + if hintInfo.IfPreferNoMergeJoin(rhsAlias) { + p.preferJoinType |= h.PreferNoMergeJoin + p.rightPreferJoinType |= h.PreferNoMergeJoin } - if hintInfo.ifPreferBroadcastJoin(lhsAlias) { - p.preferJoinType |= preferBCJoin - p.leftPreferJoinType |= preferBCJoin + if hintInfo.IfPreferBroadcastJoin(lhsAlias) { + p.preferJoinType |= h.PreferBCJoin + p.leftPreferJoinType |= h.PreferBCJoin } - if hintInfo.ifPreferBroadcastJoin(rhsAlias) { - p.preferJoinType |= preferBCJoin - p.rightPreferJoinType |= preferBCJoin + if hintInfo.IfPreferBroadcastJoin(rhsAlias) { + p.preferJoinType |= h.PreferBCJoin + p.rightPreferJoinType |= h.PreferBCJoin } - if hintInfo.ifPreferShuffleJoin(lhsAlias) { - p.preferJoinType |= preferShuffleJoin - p.leftPreferJoinType |= preferShuffleJoin + if hintInfo.IfPreferShuffleJoin(lhsAlias) { + p.preferJoinType |= h.PreferShuffleJoin + p.leftPreferJoinType |= h.PreferShuffleJoin } - if hintInfo.ifPreferShuffleJoin(rhsAlias) { - p.preferJoinType |= preferShuffleJoin - p.rightPreferJoinType |= preferShuffleJoin + if hintInfo.IfPreferShuffleJoin(rhsAlias) { + p.preferJoinType |= h.PreferShuffleJoin + p.rightPreferJoinType |= h.PreferShuffleJoin } - if hintInfo.ifPreferHashJoin(lhsAlias) { - p.preferJoinType |= preferHashJoin - p.leftPreferJoinType |= preferHashJoin + if hintInfo.IfPreferHashJoin(lhsAlias) { + p.preferJoinType |= h.PreferHashJoin + p.leftPreferJoinType |= h.PreferHashJoin } - if hintInfo.ifPreferHashJoin(rhsAlias) { - p.preferJoinType |= preferHashJoin - p.rightPreferJoinType |= preferHashJoin + if hintInfo.IfPreferHashJoin(rhsAlias) { + p.preferJoinType |= h.PreferHashJoin + p.rightPreferJoinType |= h.PreferHashJoin } - if hintInfo.ifPreferNoHashJoin(lhsAlias) { - p.preferJoinType |= preferNoHashJoin - p.leftPreferJoinType |= preferNoHashJoin + if hintInfo.IfPreferNoHashJoin(lhsAlias) { + p.preferJoinType |= h.PreferNoHashJoin + p.leftPreferJoinType |= h.PreferNoHashJoin } - if hintInfo.ifPreferNoHashJoin(rhsAlias) { - p.preferJoinType |= preferNoHashJoin - p.rightPreferJoinType |= preferNoHashJoin + if hintInfo.IfPreferNoHashJoin(rhsAlias) { + p.preferJoinType |= h.PreferNoHashJoin + p.rightPreferJoinType |= h.PreferNoHashJoin } - if hintInfo.ifPreferINLJ(lhsAlias) { - p.preferJoinType |= preferLeftAsINLJInner - p.leftPreferJoinType |= preferINLJ + if hintInfo.IfPreferINLJ(lhsAlias) { + p.preferJoinType |= h.PreferLeftAsINLJInner + p.leftPreferJoinType |= h.PreferINLJ } - if hintInfo.ifPreferINLJ(rhsAlias) { - p.preferJoinType |= preferRightAsINLJInner - p.rightPreferJoinType |= preferINLJ + if hintInfo.IfPreferINLJ(rhsAlias) { + p.preferJoinType |= h.PreferRightAsINLJInner + p.rightPreferJoinType |= h.PreferINLJ } - if hintInfo.ifPreferINLHJ(lhsAlias) { - p.preferJoinType |= preferLeftAsINLHJInner - p.leftPreferJoinType |= preferINLHJ + if hintInfo.IfPreferINLHJ(lhsAlias) { + p.preferJoinType |= h.PreferLeftAsINLHJInner + p.leftPreferJoinType |= h.PreferINLHJ } - if hintInfo.ifPreferINLHJ(rhsAlias) { - p.preferJoinType |= preferRightAsINLHJInner - p.rightPreferJoinType |= preferINLHJ + if hintInfo.IfPreferINLHJ(rhsAlias) { + p.preferJoinType |= h.PreferRightAsINLHJInner + p.rightPreferJoinType |= h.PreferINLHJ } - if hintInfo.ifPreferINLMJ(lhsAlias) { - p.preferJoinType |= preferLeftAsINLMJInner - p.leftPreferJoinType |= preferINLMJ + if hintInfo.IfPreferINLMJ(lhsAlias) { + p.preferJoinType |= h.PreferLeftAsINLMJInner + p.leftPreferJoinType |= h.PreferINLMJ } - if hintInfo.ifPreferINLMJ(rhsAlias) { - p.preferJoinType |= preferRightAsINLMJInner - p.rightPreferJoinType |= preferINLMJ + if hintInfo.IfPreferINLMJ(rhsAlias) { + p.preferJoinType |= h.PreferRightAsINLMJInner + p.rightPreferJoinType |= h.PreferINLMJ } - if hintInfo.ifPreferNoIndexJoin(lhsAlias) { - p.preferJoinType |= preferNoIndexJoin - p.leftPreferJoinType |= preferNoIndexJoin + if hintInfo.IfPreferNoIndexJoin(lhsAlias) { + p.preferJoinType |= h.PreferNoIndexJoin + p.leftPreferJoinType |= h.PreferNoIndexJoin } - if hintInfo.ifPreferNoIndexJoin(rhsAlias) { - p.preferJoinType |= preferNoIndexJoin - p.rightPreferJoinType |= preferNoIndexJoin + if hintInfo.IfPreferNoIndexJoin(rhsAlias) { + p.preferJoinType |= h.PreferNoIndexJoin + p.rightPreferJoinType |= h.PreferNoIndexJoin } - if hintInfo.ifPreferNoIndexHashJoin(lhsAlias) { - p.preferJoinType |= preferNoIndexHashJoin - p.leftPreferJoinType |= preferNoIndexHashJoin + if hintInfo.IfPreferNoIndexHashJoin(lhsAlias) { + p.preferJoinType |= h.PreferNoIndexHashJoin + p.leftPreferJoinType |= h.PreferNoIndexHashJoin } - if hintInfo.ifPreferNoIndexHashJoin(rhsAlias) { - p.preferJoinType |= preferNoIndexHashJoin - p.rightPreferJoinType |= preferNoIndexHashJoin + if hintInfo.IfPreferNoIndexHashJoin(rhsAlias) { + p.preferJoinType |= h.PreferNoIndexHashJoin + p.rightPreferJoinType |= h.PreferNoIndexHashJoin } - if hintInfo.ifPreferNoIndexMergeJoin(lhsAlias) { - p.preferJoinType |= preferNoIndexMergeJoin - p.leftPreferJoinType |= preferNoIndexMergeJoin + if hintInfo.IfPreferNoIndexMergeJoin(lhsAlias) { + p.preferJoinType |= h.PreferNoIndexMergeJoin + p.leftPreferJoinType |= h.PreferNoIndexMergeJoin } - if hintInfo.ifPreferNoIndexMergeJoin(rhsAlias) { - p.preferJoinType |= preferNoIndexMergeJoin - p.rightPreferJoinType |= preferNoIndexMergeJoin + if hintInfo.IfPreferNoIndexMergeJoin(rhsAlias) { + p.preferJoinType |= h.PreferNoIndexMergeJoin + p.rightPreferJoinType |= h.PreferNoIndexMergeJoin } - if hintInfo.ifPreferHJBuild(lhsAlias) { - p.preferJoinType |= preferLeftAsHJBuild - p.leftPreferJoinType |= preferHJBuild + if hintInfo.IfPreferHJBuild(lhsAlias) { + p.preferJoinType |= h.PreferLeftAsHJBuild + p.leftPreferJoinType |= h.PreferHJBuild } - if hintInfo.ifPreferHJBuild(rhsAlias) { - p.preferJoinType |= preferRightAsHJBuild - p.rightPreferJoinType |= preferHJBuild + if hintInfo.IfPreferHJBuild(rhsAlias) { + p.preferJoinType |= h.PreferRightAsHJBuild + p.rightPreferJoinType |= h.PreferHJBuild } - if hintInfo.ifPreferHJProbe(lhsAlias) { - p.preferJoinType |= preferLeftAsHJProbe - p.leftPreferJoinType |= preferHJProbe + if hintInfo.IfPreferHJProbe(lhsAlias) { + p.preferJoinType |= h.PreferLeftAsHJProbe + p.leftPreferJoinType |= h.PreferHJProbe } - if hintInfo.ifPreferHJProbe(rhsAlias) { - p.preferJoinType |= preferRightAsHJProbe - p.rightPreferJoinType |= preferHJProbe + if hintInfo.IfPreferHJProbe(rhsAlias) { + p.preferJoinType |= h.PreferRightAsHJProbe + p.rightPreferJoinType |= h.PreferHJProbe } hasConflict := false if !p.SCtx().GetSessionVars().EnableAdvancedJoinHint || p.SCtx().GetSessionVars().StmtCtx.StraightJoinOrder { @@ -873,13 +780,13 @@ func (p *LogicalJoin) setPreferredJoinTypeAndOrder(hintInfo *tableHintInfo) { } if hasConflict { errMsg := "Join hints are conflict, you can only specify one type of join" - warning := ErrInternal.GenWithStack(errMsg) + warning := ErrInternal.FastGen(errMsg) p.SCtx().GetSessionVars().StmtCtx.AppendWarning(warning) p.preferJoinType = 0 } // set the join order - if hintInfo.leadingJoinOrder != nil { - p.preferJoinOrder = hintInfo.matchTableName([]*hintTableInfo{lhsAlias, rhsAlias}, hintInfo.leadingJoinOrder) + if hintInfo.LeadingJoinOrder != nil { + p.preferJoinOrder = hintInfo.MatchTableName([]*h.TableInfo{lhsAlias, rhsAlias}, hintInfo.LeadingJoinOrder) } // set hintInfo for further usage if this hint info can be used. if p.preferJoinType != 0 || p.preferJoinOrder { @@ -891,44 +798,44 @@ func setPreferredJoinTypeFromOneSide(preferJoinType uint, isLeft bool) (resJoinT if preferJoinType == 0 { return } - if preferJoinType&preferINLJ > 0 { - preferJoinType &= ^preferINLJ + if preferJoinType&h.PreferINLJ > 0 { + preferJoinType &= ^h.PreferINLJ if isLeft { - resJoinType |= preferLeftAsINLJInner + resJoinType |= h.PreferLeftAsINLJInner } else { - resJoinType |= preferRightAsINLJInner + resJoinType |= h.PreferRightAsINLJInner } } - if preferJoinType&preferINLHJ > 0 { - preferJoinType &= ^preferINLHJ + if preferJoinType&h.PreferINLHJ > 0 { + preferJoinType &= ^h.PreferINLHJ if isLeft { - resJoinType |= preferLeftAsINLHJInner + resJoinType |= h.PreferLeftAsINLHJInner } else { - resJoinType |= preferRightAsINLHJInner + resJoinType |= h.PreferRightAsINLHJInner } } - if preferJoinType&preferINLMJ > 0 { - preferJoinType &= ^preferINLMJ + if preferJoinType&h.PreferINLMJ > 0 { + preferJoinType &= ^h.PreferINLMJ if isLeft { - resJoinType |= preferLeftAsINLMJInner + resJoinType |= h.PreferLeftAsINLMJInner } else { - resJoinType |= preferRightAsINLMJInner + resJoinType |= h.PreferRightAsINLMJInner } } - if preferJoinType&preferHJBuild > 0 { - preferJoinType &= ^preferHJBuild + if preferJoinType&h.PreferHJBuild > 0 { + preferJoinType &= ^h.PreferHJBuild if isLeft { - resJoinType |= preferLeftAsHJBuild + resJoinType |= h.PreferLeftAsHJBuild } else { - resJoinType |= preferRightAsHJBuild + resJoinType |= h.PreferRightAsHJBuild } } - if preferJoinType&preferHJProbe > 0 { - preferJoinType &= ^preferHJProbe + if preferJoinType&h.PreferHJProbe > 0 { + preferJoinType &= ^h.PreferHJProbe if isLeft { - resJoinType |= preferLeftAsHJProbe + resJoinType |= h.PreferLeftAsHJProbe } else { - resJoinType |= preferRightAsHJProbe + resJoinType |= h.PreferRightAsHJProbe } } resJoinType |= preferJoinType @@ -943,64 +850,64 @@ func (p *LogicalJoin) setPreferredJoinType() { p.preferJoinType = setPreferredJoinTypeFromOneSide(p.leftPreferJoinType, true) | setPreferredJoinTypeFromOneSide(p.rightPreferJoinType, false) if containDifferentJoinTypes(p.preferJoinType) { errMsg := "Join hints conflict after join reorder phase, you can only specify one type of join" - warning := ErrInternal.GenWithStack(errMsg) + warning := ErrInternal.FastGen(errMsg) p.SCtx().GetSessionVars().StmtCtx.AppendWarning(warning) p.preferJoinType = 0 } } -func (ds *DataSource) setPreferredStoreType(hintInfo *tableHintInfo) { +func (ds *DataSource) setPreferredStoreType(hintInfo *h.TableHintInfo) { if hintInfo == nil { return } - var alias *hintTableInfo + var alias *h.TableInfo if len(ds.TableAsName.L) != 0 { - alias = &hintTableInfo{dbName: ds.DBName, tblName: *ds.TableAsName, selectOffset: ds.SelectBlockOffset()} + alias = &h.TableInfo{DBName: ds.DBName, TblName: *ds.TableAsName, SelectOffset: ds.QueryBlockOffset()} } else { - alias = &hintTableInfo{dbName: ds.DBName, tblName: ds.tableInfo.Name, selectOffset: ds.SelectBlockOffset()} + alias = &h.TableInfo{DBName: ds.DBName, TblName: ds.tableInfo.Name, SelectOffset: ds.QueryBlockOffset()} } - if hintTbl := hintInfo.ifPreferTiKV(alias); hintTbl != nil { + if hintTbl := hintInfo.IfPreferTiKV(alias); hintTbl != nil { for _, path := range ds.possibleAccessPaths { if path.StoreType == kv.TiKV { - ds.preferStoreType |= preferTiKV - ds.preferPartitions[preferTiKV] = hintTbl.partitions + ds.preferStoreType |= h.PreferTiKV + ds.preferPartitions[h.PreferTiKV] = hintTbl.Partitions break } } - if ds.preferStoreType&preferTiKV == 0 { + if ds.preferStoreType&h.PreferTiKV == 0 { errMsg := fmt.Sprintf("No available path for table %s.%s with the store type %s of the hint /*+ read_from_storage */, "+ "please check the status of the table replica and variable value of tidb_isolation_read_engines(%v)", ds.DBName.O, ds.table.Meta().Name.O, kv.TiKV.Name(), ds.SCtx().GetSessionVars().GetIsolationReadEngines()) - warning := ErrInternal.GenWithStack(errMsg) + warning := ErrInternal.FastGen(errMsg) ds.SCtx().GetSessionVars().StmtCtx.AppendWarning(warning) } else { - ds.SCtx().GetSessionVars().RaiseWarningWhenMPPEnforced("MPP mode may be blocked because you have set a hint to read table `" + hintTbl.tblName.O + "` from TiKV.") + ds.SCtx().GetSessionVars().RaiseWarningWhenMPPEnforced("MPP mode may be blocked because you have set a hint to read table `" + hintTbl.TblName.O + "` from TiKV.") } } - if hintTbl := hintInfo.ifPreferTiFlash(alias); hintTbl != nil { + if hintTbl := hintInfo.IfPreferTiFlash(alias); hintTbl != nil { // `ds.preferStoreType != 0`, which means there's a hint hit the both TiKV value and TiFlash value for table. // We can't support read a table from two different storages, even partition table. if ds.preferStoreType != 0 { errMsg := fmt.Sprintf("Storage hints are conflict, you can only specify one storage type of table %s.%s", - alias.dbName.L, alias.tblName.L) - warning := ErrInternal.GenWithStack(errMsg) + alias.DBName.L, alias.TblName.L) + warning := ErrInternal.FastGen(errMsg) ds.SCtx().GetSessionVars().StmtCtx.AppendWarning(warning) ds.preferStoreType = 0 return } for _, path := range ds.possibleAccessPaths { if path.StoreType == kv.TiFlash { - ds.preferStoreType |= preferTiFlash - ds.preferPartitions[preferTiFlash] = hintTbl.partitions + ds.preferStoreType |= h.PreferTiFlash + ds.preferPartitions[h.PreferTiFlash] = hintTbl.Partitions break } } - if ds.preferStoreType&preferTiFlash == 0 { + if ds.preferStoreType&h.PreferTiFlash == 0 { errMsg := fmt.Sprintf("No available path for table %s.%s with the store type %s of the hint /*+ read_from_storage */, "+ "please check the status of the table replica and variable value of tidb_isolation_read_engines(%v)", ds.DBName.O, ds.table.Meta().Name.O, kv.TiFlash.Name(), ds.SCtx().GetSessionVars().GetIsolationReadEngines()) - warning := ErrInternal.GenWithStack(errMsg) + warning := ErrInternal.FastGen(errMsg) ds.SCtx().GetSessionVars().StmtCtx.AppendWarning(warning) } } @@ -1360,10 +1267,11 @@ func (b *PlanBuilder) buildSelection(ctx context.Context, p LogicalPlan, where a expressions = append(expressions, expr) } cnfExpres := make([]expression.Expression, 0) + useCache := b.ctx.GetSessionVars().StmtCtx.UseCache for _, expr := range expressions { cnfItems := expression.SplitCNFItems(expr) for _, item := range cnfItems { - if con, ok := item.(*expression.Constant); ok && con.ConstItem(b.ctx.GetSessionVars().StmtCtx) { + if con, ok := item.(*expression.Constant); ok && expression.ConstExprConsiderPlanCache(con, useCache) { ret, _, err := expression.EvalBool(b.ctx, expression.CNFExprs{con}, chunk.Row{}) if err != nil { return nil, errors.Trace(err) @@ -1917,9 +1825,9 @@ func (b *PlanBuilder) buildDistinct(child LogicalPlan, length int) (*LogicalAggr plan4Agg := LogicalAggregation{ AggFuncs: make([]*aggregation.AggFuncDesc, 0, child.Schema().Len()), GroupByItems: expression.Column2Exprs(child.Schema().Clone().Columns[:length]), - }.Init(b.ctx, child.SelectBlockOffset()) + }.Init(b.ctx, child.QueryBlockOffset()) if hint := b.TableHints(); hint != nil { - plan4Agg.aggHints = hint.aggHints + plan4Agg.aggHints = hint.AggHints } for _, col := range child.Schema().Columns { aggDesc, err := aggregation.NewAggFuncDesc(b.ctx, ast.AggFuncFirstRow, []expression.Expression{col}, false) @@ -2076,6 +1984,12 @@ func (b *PlanBuilder) buildSetOpr(ctx context.Context, setOpr *ast.SetOprStmt) ( if *x.AfterSetOperator != ast.Intersect && *x.AfterSetOperator != ast.IntersectAll { breakIteration = true } + if x.Limit != nil || x.OrderBy != nil { + // when SetOprSelectList's limit and order-by is not nil, it means itself is converted from + // an independent ast.SetOprStmt in parser, its data should be evaluated first, and ordered + // by given items and conduct a limit on it, then it can only be integrated with other brothers. + breakIteration = true + } } if breakIteration { break @@ -2174,7 +2088,7 @@ func (b *PlanBuilder) buildIntersect(ctx context.Context, selects []ast.Node) (L leftPlan, err = b.buildSelect(ctx, x) case *ast.SetOprSelectList: afterSetOperator = x.AfterSetOperator - leftPlan, err = b.buildSetOpr(ctx, &ast.SetOprStmt{SelectList: x, With: x.With}) + leftPlan, err = b.buildSetOpr(ctx, &ast.SetOprStmt{SelectList: x, With: x.With, Limit: x.Limit, OrderBy: x.OrderBy}) } if err != nil { return nil, nil, err @@ -2198,7 +2112,7 @@ func (b *PlanBuilder) buildIntersect(ctx context.Context, selects []ast.Node) (L // TODO: support intersect all return nil, nil, errors.Errorf("TiDB do not support intersect all") } - rightPlan, err = b.buildSetOpr(ctx, &ast.SetOprStmt{SelectList: x, With: x.With}) + rightPlan, err = b.buildSetOpr(ctx, &ast.SetOprStmt{SelectList: x, With: x.With, Limit: x.Limit, OrderBy: x.OrderBy}) } if err != nil { return nil, nil, err @@ -2522,7 +2436,7 @@ func (b *PlanBuilder) buildLimit(src LogicalPlan, limit *ast.Limit) (LogicalPlan Count: count, }.Init(b.ctx, b.getSelectOffset()) if hint := b.TableHints(); hint != nil { - li.limitHints = hint.limitHints + li.limitHints = hint.LimitHints } li.SetChildren(src) return li, nil @@ -4039,31 +3953,32 @@ func (b *PlanBuilder) pushHintWithoutTableWarning(hint *ast.TableOptimizerHint) return } errMsg := fmt.Sprintf("Hint %s is inapplicable. Please specify the table names in the arguments.", sb.String()) - b.ctx.GetSessionVars().StmtCtx.AppendWarning(ErrInternal.GenWithStack(errMsg)) + b.ctx.GetSessionVars().StmtCtx.AppendWarning(ErrInternal.FastGen(errMsg)) } func (b *PlanBuilder) pushTableHints(hints []*ast.TableOptimizerHint, currentLevel int) { hints = b.hintProcessor.GetCurrentStmtHints(hints, currentLevel) var ( - sortMergeTables, inljTables, inlhjTables, inlmjTables, hashJoinTables, bcTables []hintTableInfo - noIndexJoinTables, noIndexHashJoinTables, noIndexMergeJoinTables []hintTableInfo - noHashJoinTables, noMergeJoinTables []hintTableInfo - shuffleJoinTables []hintTableInfo - indexHintList, indexMergeHintList []indexHintInfo - tiflashTables, tikvTables []hintTableInfo - aggHints aggHintInfo + sortMergeTables, inljTables, inlhjTables, inlmjTables, hashJoinTables, bcTables []h.TableInfo + noIndexJoinTables, noIndexHashJoinTables, noIndexMergeJoinTables []h.TableInfo + noHashJoinTables, noMergeJoinTables []h.TableInfo + shuffleJoinTables []h.TableInfo + indexHintList, indexMergeHintList []h.IndexHintInfo + tiflashTables, tikvTables []h.TableInfo + aggHints h.AggHintInfo timeRangeHint ast.HintTimeRange - limitHints limitHintInfo - MergeHints MergeHintInfo - leadingJoinOrder []hintTableInfo - hjBuildTables, hjProbeTables []hintTableInfo + limitHints h.LimitHintInfo + MergeHints h.MergeHintInfo + leadingJoinOrder []h.TableInfo + hjBuildTables, hjProbeTables []h.TableInfo leadingHintCnt int ) for _, hint := range hints { // Set warning for the hint that requires the table name. switch hint.HintName.L { - case TiDBMergeJoin, HintSMJ, TiDBIndexNestedLoopJoin, HintINLJ, HintINLHJ, HintINLMJ, HintNoHashJoin, HintNoMergeJoin, - TiDBHashJoin, HintHJ, HintUseIndex, HintIgnoreIndex, HintForceIndex, HintOrderIndex, HintNoOrderIndex, HintIndexMerge, HintLeading: + case h.TiDBMergeJoin, h.HintSMJ, h.TiDBIndexNestedLoopJoin, h.HintINLJ, h.HintINLHJ, h.HintINLMJ, + h.HintNoHashJoin, h.HintNoMergeJoin, h.TiDBHashJoin, h.HintHJ, h.HintUseIndex, h.HintIgnoreIndex, + h.HintForceIndex, h.HintOrderIndex, h.HintNoOrderIndex, h.HintIndexMerge, h.HintLeading: if len(hint.Tables) == 0 { b.pushHintWithoutTableWarning(hint) continue @@ -4071,121 +3986,121 @@ func (b *PlanBuilder) pushTableHints(hints []*ast.TableOptimizerHint, currentLev } switch hint.HintName.L { - case TiDBMergeJoin, HintSMJ: - sortMergeTables = append(sortMergeTables, tableNames2HintTableInfo(b.ctx, hint.HintName.L, hint.Tables, b.hintProcessor, currentLevel)...) - case TiDBBroadCastJoin, HintBCJ: - bcTables = append(bcTables, tableNames2HintTableInfo(b.ctx, hint.HintName.L, hint.Tables, b.hintProcessor, currentLevel)...) - case HintShuffleJoin: - shuffleJoinTables = append(shuffleJoinTables, tableNames2HintTableInfo(b.ctx, hint.HintName.L, hint.Tables, b.hintProcessor, currentLevel)...) - case TiDBIndexNestedLoopJoin, HintINLJ: - inljTables = append(inljTables, tableNames2HintTableInfo(b.ctx, hint.HintName.L, hint.Tables, b.hintProcessor, currentLevel)...) - case HintINLHJ: - inlhjTables = append(inlhjTables, tableNames2HintTableInfo(b.ctx, hint.HintName.L, hint.Tables, b.hintProcessor, currentLevel)...) - case HintINLMJ: - inlmjTables = append(inlmjTables, tableNames2HintTableInfo(b.ctx, hint.HintName.L, hint.Tables, b.hintProcessor, currentLevel)...) - case TiDBHashJoin, HintHJ: - hashJoinTables = append(hashJoinTables, tableNames2HintTableInfo(b.ctx, hint.HintName.L, hint.Tables, b.hintProcessor, currentLevel)...) - case HintNoHashJoin: - noHashJoinTables = append(noHashJoinTables, tableNames2HintTableInfo(b.ctx, hint.HintName.L, hint.Tables, b.hintProcessor, currentLevel)...) - case HintNoMergeJoin: - noMergeJoinTables = append(noMergeJoinTables, tableNames2HintTableInfo(b.ctx, hint.HintName.L, hint.Tables, b.hintProcessor, currentLevel)...) - case HintNoIndexJoin: - noIndexJoinTables = append(noIndexJoinTables, tableNames2HintTableInfo(b.ctx, hint.HintName.L, hint.Tables, b.hintProcessor, currentLevel)...) - case HintNoIndexHashJoin: - noIndexHashJoinTables = append(noIndexHashJoinTables, tableNames2HintTableInfo(b.ctx, hint.HintName.L, hint.Tables, b.hintProcessor, currentLevel)...) - case HintNoIndexMergeJoin: - noIndexMergeJoinTables = append(noIndexMergeJoinTables, tableNames2HintTableInfo(b.ctx, hint.HintName.L, hint.Tables, b.hintProcessor, currentLevel)...) - case HintMPP1PhaseAgg: - aggHints.preferAggType |= preferMPP1PhaseAgg - case HintMPP2PhaseAgg: - aggHints.preferAggType |= preferMPP2PhaseAgg - case HintHashJoinBuild: - hjBuildTables = append(hjBuildTables, tableNames2HintTableInfo(b.ctx, hint.HintName.L, hint.Tables, b.hintProcessor, currentLevel)...) - case HintHashJoinProbe: - hjProbeTables = append(hjProbeTables, tableNames2HintTableInfo(b.ctx, hint.HintName.L, hint.Tables, b.hintProcessor, currentLevel)...) - case HintHashAgg: - aggHints.preferAggType |= preferHashAgg - case HintStreamAgg: - aggHints.preferAggType |= preferStreamAgg - case HintAggToCop: - aggHints.preferAggToCop = true - case HintUseIndex, HintIgnoreIndex, HintForceIndex, HintOrderIndex, HintNoOrderIndex: + case h.TiDBMergeJoin, h.HintSMJ: + sortMergeTables = append(sortMergeTables, h.TableNames2HintTableInfo(b.ctx, hint.HintName.L, hint.Tables, b.hintProcessor, currentLevel)...) + case h.TiDBBroadCastJoin, h.HintBCJ: + bcTables = append(bcTables, h.TableNames2HintTableInfo(b.ctx, hint.HintName.L, hint.Tables, b.hintProcessor, currentLevel)...) + case h.HintShuffleJoin: + shuffleJoinTables = append(shuffleJoinTables, h.TableNames2HintTableInfo(b.ctx, hint.HintName.L, hint.Tables, b.hintProcessor, currentLevel)...) + case h.TiDBIndexNestedLoopJoin, h.HintINLJ: + inljTables = append(inljTables, h.TableNames2HintTableInfo(b.ctx, hint.HintName.L, hint.Tables, b.hintProcessor, currentLevel)...) + case h.HintINLHJ: + inlhjTables = append(inlhjTables, h.TableNames2HintTableInfo(b.ctx, hint.HintName.L, hint.Tables, b.hintProcessor, currentLevel)...) + case h.HintINLMJ: + inlmjTables = append(inlmjTables, h.TableNames2HintTableInfo(b.ctx, hint.HintName.L, hint.Tables, b.hintProcessor, currentLevel)...) + case h.TiDBHashJoin, h.HintHJ: + hashJoinTables = append(hashJoinTables, h.TableNames2HintTableInfo(b.ctx, hint.HintName.L, hint.Tables, b.hintProcessor, currentLevel)...) + case h.HintNoHashJoin: + noHashJoinTables = append(noHashJoinTables, h.TableNames2HintTableInfo(b.ctx, hint.HintName.L, hint.Tables, b.hintProcessor, currentLevel)...) + case h.HintNoMergeJoin: + noMergeJoinTables = append(noMergeJoinTables, h.TableNames2HintTableInfo(b.ctx, hint.HintName.L, hint.Tables, b.hintProcessor, currentLevel)...) + case h.HintNoIndexJoin: + noIndexJoinTables = append(noIndexJoinTables, h.TableNames2HintTableInfo(b.ctx, hint.HintName.L, hint.Tables, b.hintProcessor, currentLevel)...) + case h.HintNoIndexHashJoin: + noIndexHashJoinTables = append(noIndexHashJoinTables, h.TableNames2HintTableInfo(b.ctx, hint.HintName.L, hint.Tables, b.hintProcessor, currentLevel)...) + case h.HintNoIndexMergeJoin: + noIndexMergeJoinTables = append(noIndexMergeJoinTables, h.TableNames2HintTableInfo(b.ctx, hint.HintName.L, hint.Tables, b.hintProcessor, currentLevel)...) + case h.HintMPP1PhaseAgg: + aggHints.PreferAggType |= h.PreferMPP1PhaseAgg + case h.HintMPP2PhaseAgg: + aggHints.PreferAggType |= h.PreferMPP2PhaseAgg + case h.HintHashJoinBuild: + hjBuildTables = append(hjBuildTables, h.TableNames2HintTableInfo(b.ctx, hint.HintName.L, hint.Tables, b.hintProcessor, currentLevel)...) + case h.HintHashJoinProbe: + hjProbeTables = append(hjProbeTables, h.TableNames2HintTableInfo(b.ctx, hint.HintName.L, hint.Tables, b.hintProcessor, currentLevel)...) + case h.HintHashAgg: + aggHints.PreferAggType |= h.PreferHashAgg + case h.HintStreamAgg: + aggHints.PreferAggType |= h.PreferStreamAgg + case h.HintAggToCop: + aggHints.PreferAggToCop = true + case h.HintUseIndex, h.HintIgnoreIndex, h.HintForceIndex, h.HintOrderIndex, h.HintNoOrderIndex: dbName := hint.Tables[0].DBName if dbName.L == "" { dbName = model.NewCIStr(b.ctx.GetSessionVars().CurrentDB) } var hintType ast.IndexHintType switch hint.HintName.L { - case HintUseIndex: + case h.HintUseIndex: hintType = ast.HintUse - case HintIgnoreIndex: + case h.HintIgnoreIndex: hintType = ast.HintIgnore - case HintForceIndex: + case h.HintForceIndex: hintType = ast.HintForce - case HintOrderIndex: + case h.HintOrderIndex: hintType = ast.HintOrderIndex - case HintNoOrderIndex: + case h.HintNoOrderIndex: hintType = ast.HintNoOrderIndex } - indexHintList = append(indexHintList, indexHintInfo{ - dbName: dbName, - tblName: hint.Tables[0].TableName, - partitions: hint.Tables[0].PartitionList, - indexHint: &ast.IndexHint{ + indexHintList = append(indexHintList, h.IndexHintInfo{ + DBName: dbName, + TblName: hint.Tables[0].TableName, + Partitions: hint.Tables[0].PartitionList, + IndexHint: &ast.IndexHint{ IndexNames: hint.Indexes, HintType: hintType, HintScope: ast.HintForScan, }, }) - case HintReadFromStorage: + case h.HintReadFromStorage: switch hint.HintData.(model.CIStr).L { - case HintTiFlash: - tiflashTables = append(tiflashTables, tableNames2HintTableInfo(b.ctx, hint.HintName.L, hint.Tables, b.hintProcessor, currentLevel)...) - case HintTiKV: - tikvTables = append(tikvTables, tableNames2HintTableInfo(b.ctx, hint.HintName.L, hint.Tables, b.hintProcessor, currentLevel)...) + case h.HintTiFlash: + tiflashTables = append(tiflashTables, h.TableNames2HintTableInfo(b.ctx, hint.HintName.L, hint.Tables, b.hintProcessor, currentLevel)...) + case h.HintTiKV: + tikvTables = append(tikvTables, h.TableNames2HintTableInfo(b.ctx, hint.HintName.L, hint.Tables, b.hintProcessor, currentLevel)...) } - case HintIndexMerge: + case h.HintIndexMerge: dbName := hint.Tables[0].DBName if dbName.L == "" { dbName = model.NewCIStr(b.ctx.GetSessionVars().CurrentDB) } - indexMergeHintList = append(indexMergeHintList, indexHintInfo{ - dbName: dbName, - tblName: hint.Tables[0].TableName, - partitions: hint.Tables[0].PartitionList, - indexHint: &ast.IndexHint{ + indexMergeHintList = append(indexMergeHintList, h.IndexHintInfo{ + DBName: dbName, + TblName: hint.Tables[0].TableName, + Partitions: hint.Tables[0].PartitionList, + IndexHint: &ast.IndexHint{ IndexNames: hint.Indexes, HintType: ast.HintUse, HintScope: ast.HintForScan, }, }) - case HintTimeRange: + case h.HintTimeRange: timeRangeHint = hint.HintData.(ast.HintTimeRange) - case HintLimitToCop: - limitHints.preferLimitToCop = true - case HintMerge: + case h.HintLimitToCop: + limitHints.PreferLimitToCop = true + case h.HintMerge: if hint.Tables != nil { - b.ctx.GetSessionVars().StmtCtx.AppendWarning(ErrInternal.GenWithStack("The MERGE hint is not used correctly, maybe it inputs a table name.")) + b.ctx.GetSessionVars().StmtCtx.AppendWarning(ErrInternal.FastGen("The MERGE hint is not used correctly, maybe it inputs a table name.")) continue } - MergeHints.preferMerge = true - case HintLeading: + MergeHints.PreferMerge = true + case h.HintLeading: if leadingHintCnt == 0 { - leadingJoinOrder = append(leadingJoinOrder, tableNames2HintTableInfo(b.ctx, hint.HintName.L, hint.Tables, b.hintProcessor, currentLevel)...) + leadingJoinOrder = append(leadingJoinOrder, h.TableNames2HintTableInfo(b.ctx, hint.HintName.L, hint.Tables, b.hintProcessor, currentLevel)...) } leadingHintCnt++ - case HintSemiJoinRewrite: + case h.HintSemiJoinRewrite: if b.subQueryCtx != handlingExistsSubquery { - b.ctx.GetSessionVars().StmtCtx.AppendWarning(ErrInternal.GenWithStack("The SEMI_JOIN_REWRITE hint is not used correctly, maybe it's not in a subquery or the subquery is not EXISTS clause.")) + b.ctx.GetSessionVars().StmtCtx.AppendWarning(ErrInternal.FastGen("The SEMI_JOIN_REWRITE hint is not used correctly, maybe it's not in a subquery or the subquery is not EXISTS clause.")) continue } - b.subQueryHintFlags |= HintFlagSemiJoinRewrite - case HintNoDecorrelate: + b.subQueryHintFlags |= h.HintFlagSemiJoinRewrite + case h.HintNoDecorrelate: if b.subQueryCtx == notHandlingSubquery { - b.ctx.GetSessionVars().StmtCtx.AppendWarning(ErrInternal.GenWithStack("NO_DECORRELATE() is inapplicable because it's not in an IN subquery, an EXISTS subquery, an ANY/ALL/SOME subquery or a scalar subquery.")) + b.ctx.GetSessionVars().StmtCtx.AppendWarning(ErrInternal.FastGen("NO_DECORRELATE() is inapplicable because it's not in an IN subquery, an EXISTS subquery, an ANY/ALL/SOME subquery or a scalar subquery.")) continue } - b.subQueryHintFlags |= HintFlagNoDecorrelate + b.subQueryHintFlags |= h.HintFlagNoDecorrelate default: // ignore hints that not implemented } @@ -4194,31 +4109,31 @@ func (b *PlanBuilder) pushTableHints(hints []*ast.TableOptimizerHint, currentLev // If there are more leading hints or the straight_join hint existes, all leading hints will be invalid. leadingJoinOrder = leadingJoinOrder[:0] if leadingHintCnt > 1 { - b.ctx.GetSessionVars().StmtCtx.AppendWarning(ErrInternal.GenWithStack("We can only use one leading hint at most, when multiple leading hints are used, all leading hints will be invalid")) + b.ctx.GetSessionVars().StmtCtx.AppendWarning(ErrInternal.FastGen("We can only use one leading hint at most, when multiple leading hints are used, all leading hints will be invalid")) } else if b.ctx.GetSessionVars().StmtCtx.StraightJoinOrder { - b.ctx.GetSessionVars().StmtCtx.AppendWarning(ErrInternal.GenWithStack("We can only use the straight_join hint, when we use the leading hint and straight_join hint at the same time, all leading hints will be invalid")) - } - } - b.tableHintInfo = append(b.tableHintInfo, tableHintInfo{ - sortMergeJoinTables: sortMergeTables, - broadcastJoinTables: bcTables, - shuffleJoinTables: shuffleJoinTables, - indexNestedLoopJoinTables: indexNestedLoopJoinTables{inljTables, inlhjTables, inlmjTables}, - noIndexJoinTables: indexNestedLoopJoinTables{noIndexJoinTables, noIndexHashJoinTables, noIndexMergeJoinTables}, - hashJoinTables: hashJoinTables, - noHashJoinTables: noHashJoinTables, - noMergeJoinTables: noMergeJoinTables, - indexHintList: indexHintList, - tiflashTables: tiflashTables, - tikvTables: tikvTables, - aggHints: aggHints, - indexMergeHintList: indexMergeHintList, - timeRangeHint: timeRangeHint, - limitHints: limitHints, + b.ctx.GetSessionVars().StmtCtx.AppendWarning(ErrInternal.FastGen("We can only use the straight_join hint, when we use the leading hint and straight_join hint at the same time, all leading hints will be invalid")) + } + } + b.tableHintInfo = append(b.tableHintInfo, &h.TableHintInfo{ + SortMergeJoinTables: sortMergeTables, + BroadcastJoinTables: bcTables, + ShuffleJoinTables: shuffleJoinTables, + IndexNestedLoopJoinTables: h.IndexNestedLoopJoinTables{INLJTables: inljTables, INLHJTables: inlhjTables, INLMJTables: inlmjTables}, + NoIndexJoinTables: h.IndexNestedLoopJoinTables{INLJTables: noIndexJoinTables, INLHJTables: noIndexHashJoinTables, INLMJTables: noIndexMergeJoinTables}, + HashJoinTables: hashJoinTables, + NoHashJoinTables: noHashJoinTables, + NoMergeJoinTables: noMergeJoinTables, + IndexHintList: indexHintList, + TiFlashTables: tiflashTables, + TiKVTables: tikvTables, + AggHints: aggHints, + IndexMergeHintList: indexMergeHintList, + TimeRangeHint: timeRangeHint, + LimitHints: limitHints, MergeHints: MergeHints, - leadingJoinOrder: leadingJoinOrder, - hjBuildTables: hjBuildTables, - hjProbeTables: hjProbeTables, + LeadingJoinOrder: leadingJoinOrder, + HJBuildTables: hjBuildTables, + HJProbeTables: hjProbeTables, }) } @@ -4231,74 +4146,18 @@ func (b *PlanBuilder) popVisitInfo() { func (b *PlanBuilder) popTableHints() { hintInfo := b.tableHintInfo[len(b.tableHintInfo)-1] - b.appendUnmatchedIndexHintWarning(hintInfo.indexHintList, false) - b.appendUnmatchedIndexHintWarning(hintInfo.indexMergeHintList, true) - b.appendUnmatchedJoinHintWarning(HintINLJ, TiDBIndexNestedLoopJoin, hintInfo.indexNestedLoopJoinTables.inljTables) - b.appendUnmatchedJoinHintWarning(HintINLHJ, "", hintInfo.indexNestedLoopJoinTables.inlhjTables) - b.appendUnmatchedJoinHintWarning(HintINLMJ, "", hintInfo.indexNestedLoopJoinTables.inlmjTables) - b.appendUnmatchedJoinHintWarning(HintSMJ, TiDBMergeJoin, hintInfo.sortMergeJoinTables) - b.appendUnmatchedJoinHintWarning(HintBCJ, TiDBBroadCastJoin, hintInfo.broadcastJoinTables) - b.appendUnmatchedJoinHintWarning(HintShuffleJoin, HintShuffleJoin, hintInfo.shuffleJoinTables) - b.appendUnmatchedJoinHintWarning(HintHJ, TiDBHashJoin, hintInfo.hashJoinTables) - b.appendUnmatchedJoinHintWarning(HintHashJoinBuild, "", hintInfo.hjBuildTables) - b.appendUnmatchedJoinHintWarning(HintHashJoinProbe, "", hintInfo.hjProbeTables) - b.appendUnmatchedJoinHintWarning(HintLeading, "", hintInfo.leadingJoinOrder) - b.appendUnmatchedStorageHintWarning(hintInfo.tiflashTables, hintInfo.tikvTables) - b.tableHintInfo = b.tableHintInfo[:len(b.tableHintInfo)-1] -} - -func (b *PlanBuilder) appendUnmatchedIndexHintWarning(indexHints []indexHintInfo, usedForIndexMerge bool) { - for _, hint := range indexHints { - if !hint.matched { - var hintTypeString string - if usedForIndexMerge { - hintTypeString = "use_index_merge" - } else { - hintTypeString = hint.hintTypeString() - } - errMsg := fmt.Sprintf("%s(%s) is inapplicable, check whether the table(%s.%s) exists", - hintTypeString, - hint.indexString(), - hint.dbName, - hint.tblName, - ) - b.ctx.GetSessionVars().StmtCtx.AppendWarning(ErrInternal.GenWithStack(errMsg)) - } + for _, warning := range h.CollectUnmatchedHintWarnings(hintInfo) { + b.ctx.GetSessionVars().StmtCtx.AppendWarning(warning) } + b.tableHintInfo = b.tableHintInfo[:len(b.tableHintInfo)-1] } -func (b *PlanBuilder) appendUnmatchedJoinHintWarning(joinType string, joinTypeAlias string, hintTables []hintTableInfo) { - unMatchedTables := extractUnmatchedTables(hintTables) - if len(unMatchedTables) == 0 { - return - } - if len(joinTypeAlias) != 0 { - joinTypeAlias = fmt.Sprintf(" or %s", restore2JoinHint(joinTypeAlias, hintTables)) - } - - errMsg := fmt.Sprintf("There are no matching table names for (%s) in optimizer hint %s%s. Maybe you can use the table alias name", - strings.Join(unMatchedTables, ", "), restore2JoinHint(joinType, hintTables), joinTypeAlias) - b.ctx.GetSessionVars().StmtCtx.AppendWarning(ErrInternal.GenWithStack(errMsg)) -} - -func (b *PlanBuilder) appendUnmatchedStorageHintWarning(tiflashTables, tikvTables []hintTableInfo) { - unMatchedTiFlashTables := extractUnmatchedTables(tiflashTables) - unMatchedTiKVTables := extractUnmatchedTables(tikvTables) - if len(unMatchedTiFlashTables)+len(unMatchedTiKVTables) == 0 { - return - } - errMsg := fmt.Sprintf("There are no matching table names for (%s) in optimizer hint %s. Maybe you can use the table alias name", - strings.Join(append(unMatchedTiFlashTables, unMatchedTiKVTables...), ", "), - restore2StorageHint(tiflashTables, tikvTables)) - b.ctx.GetSessionVars().StmtCtx.AppendWarning(ErrInternal.GenWithStack(errMsg)) -} - -// TableHints returns the *tableHintInfo of PlanBuilder. -func (b *PlanBuilder) TableHints() *tableHintInfo { +// TableHints returns the *TableHintInfo of PlanBuilder. +func (b *PlanBuilder) TableHints() *h.TableHintInfo { if len(b.tableHintInfo) == 0 { return nil } - return &(b.tableHintInfo[len(b.tableHintInfo)-1]) + return b.tableHintInfo[len(b.tableHintInfo)-1] } func (b *PlanBuilder) buildSelect(ctx context.Context, sel *ast.SelectStmt) (p LogicalPlan, err error) { @@ -4347,7 +4206,7 @@ func (b *PlanBuilder) buildSelect(ctx context.Context, sel *ast.SelectStmt) (p L b.isForUpdateRead = true } - if hints := b.TableHints(); hints != nil && hints.MergeHints.preferMerge { + if hints := b.TableHints(); hints != nil && hints.MergeHints.PreferMerge { // Verify Merge hints in the current query, // we will update parameters for those that meet the rules, and warn those that do not. // If the current query uses Merge Hint and the query is a CTE, @@ -4582,7 +4441,7 @@ func (b *PlanBuilder) buildSelect(ctx context.Context, sel *ast.SelectStmt) (p L // 1. The select is top level query, order should be honored // 2. The query has LIMIT clause // 3. The control flag requires keeping ORDER BY explicitly - if len(b.selectOffset) == 1 || sel.Limit != nil || !b.ctx.GetSessionVars().RemoveOrderbyInSubquery { + if len(b.qbOffset) == 1 || sel.Limit != nil || !b.ctx.GetSessionVars().RemoveOrderbyInSubquery { if b.ctx.GetSessionVars().SQLMode.HasOnlyFullGroupBy() { p, err = b.buildSortWithCheck(ctx, p, sel.OrderBy.Items, orderMap, windowMapper, projExprs, oldLen, sel.Distinct) } else { @@ -5106,7 +4965,7 @@ func (b *PlanBuilder) buildDataSource(ctx context.Context, tn *ast.TableName, as // Get the hints belong to the current view. currentQBNameMap4View := make(map[string][]ast.HintTable) currentViewHints := make(map[string][]*ast.TableOptimizerHint) - for qbName, viewQBNameHintTable := range b.hintProcessor.QbNameMap4View { + for qbName, viewQBNameHintTable := range b.hintProcessor.ViewQBNameToTable { if len(viewQBNameHintTable) == 0 { continue } @@ -5126,8 +4985,8 @@ func (b *PlanBuilder) buildDataSource(ctx context.Context, tn *ast.TableName, as // It means the hint belong the current view, the first view name in hint is matched. // Because of the nested views, so we should check the left table list in hint when build the data source from the view inside the current view. currentQBNameMap4View[qbName] = viewQBNameHintTable[1:] - currentViewHints[qbName] = b.hintProcessor.QbHints4View[qbName] - b.hintProcessor.QbNameUsed4View[qbName] = struct{}{} + currentViewHints[qbName] = b.hintProcessor.ViewQBNameToHints[qbName] + b.hintProcessor.ViewQBNameUsed[qbName] = struct{}{} } } return b.BuildDataSourceFromView(ctx, dbName, tableInfo, currentQBNameMap4View, currentViewHints) @@ -5184,14 +5043,14 @@ func (b *PlanBuilder) buildDataSource(ctx context.Context, tn *ast.TableName, as columns = tbl.Cols() } // extract the IndexMergeHint - var indexMergeHints []indexHintInfo + var indexMergeHints []h.IndexHintInfo if hints := b.TableHints(); hints != nil { - for i, hint := range hints.indexMergeHintList { - if hint.tblName.L == tblName.L && hint.dbName.L == dbName.L { - hints.indexMergeHintList[i].matched = true + for i, hint := range hints.IndexMergeHintList { + if hint.Match(dbName, tblName) { + hints.IndexMergeHintList[i].Matched = true // check whether the index names in IndexMergeHint are valid. - invalidIdxNames := make([]string, 0, len(hint.indexHint.IndexNames)) - for _, idxName := range hint.indexHint.IndexNames { + invalidIdxNames := make([]string, 0, len(hint.IndexHint.IndexNames)) + for _, idxName := range hint.IndexHint.IndexNames { hasIdxName := false for _, path := range possiblePaths { if path.IsTablePath() { @@ -5216,7 +5075,7 @@ func (b *PlanBuilder) buildDataSource(ctx context.Context, tn *ast.TableName, as // Append warning if there are invalid index names. errMsg := fmt.Sprintf("use_index_merge(%s) is inapplicable, check whether the indexes (%s) "+ "exist, or the indexes are conflicted with use_index/ignore_index/force_index hints.", - hint.indexString(), strings.Join(invalidIdxNames, ", ")) + hint.IndexString(), strings.Join(invalidIdxNames, ", ")) b.ctx.GetSessionVars().StmtCtx.AppendWarning(ErrInternal.GenWithStack(errMsg)) } } @@ -5229,7 +5088,7 @@ func (b *PlanBuilder) buildDataSource(ctx context.Context, tn *ast.TableName, as tableInfo: tableInfo, physicalTableID: tableInfo.ID, astIndexHints: tn.IndexHints, - IndexHints: b.TableHints().indexHintList, + IndexHints: b.TableHints().IndexHintList, indexMergeHints: indexMergeHints, possibleAccessPaths: possiblePaths, Columns: make([]*model.ColumnInfo, 0, len(columns)), @@ -5304,7 +5163,7 @@ func (b *PlanBuilder) buildDataSource(ctx context.Context, tn *ast.TableName, as var err error originVal := b.allowBuildCastArray b.allowBuildCastArray = true - expr, _, err = b.rewrite(ctx, columns[i].GeneratedExpr, ds, nil, true) + expr, _, err = b.rewrite(ctx, columns[i].GeneratedExpr.Clone(), ds, nil, true) b.allowBuildCastArray = originVal if err != nil { return nil, err @@ -5490,7 +5349,7 @@ func (b *PlanBuilder) timeRangeForSummaryTable() QueryTimeRange { const defaultSummaryDuration = 30 * time.Minute hints := b.TableHints() // User doesn't use TIME_RANGE hint - if hints == nil || (hints.timeRangeHint.From == "" && hints.timeRangeHint.To == "") { + if hints == nil || (hints.TimeRangeHint.From == "" && hints.TimeRangeHint.To == "") { to := time.Now() from := to.Add(-defaultSummaryDuration) return QueryTimeRange{From: from, To: to} @@ -5504,8 +5363,8 @@ func (b *PlanBuilder) timeRangeForSummaryTable() QueryTimeRange { } return t, err == nil } - from, fromValid := parse(hints.timeRangeHint.From) - to, toValid := parse(hints.timeRangeHint.To) + from, fromValid := parse(hints.TimeRangeHint.From) + to, toValid := parse(hints.TimeRangeHint.To) switch { case !fromValid && !toValid: to = time.Now() @@ -5663,7 +5522,7 @@ func (b *PlanBuilder) BuildDataSourceFromView(ctx context.Context, dbName model. b.buildingCTE = o }() - hintProcessor := &hint.BlockHintProcessor{Ctx: b.ctx} + hintProcessor := h.NewQBHintHandler(b.ctx) selectNode.Accept(hintProcessor) currentQbNameMap4View := make(map[string][]ast.HintTable) currentQbHints4View := make(map[string][]*ast.TableOptimizerHint) @@ -5672,32 +5531,32 @@ func (b *PlanBuilder) BuildDataSourceFromView(ctx context.Context, dbName model. for qbName, viewQbNameHint := range qbNameMap4View { // Check whether the view hint belong the current view or its nested views. - selectOffset := -1 + qbOffset := -1 if len(viewQbNameHint) == 0 { - selectOffset = 1 + qbOffset = 1 } else if len(viewQbNameHint) == 1 && viewQbNameHint[0].TableName.L == "" { - selectOffset = hintProcessor.GetHintOffset(viewQbNameHint[0].QBName, -1) + qbOffset = hintProcessor.GetHintOffset(viewQbNameHint[0].QBName, -1) } else { currentQbNameMap4View[qbName] = viewQbNameHint currentQbHints4View[qbName] = viewHints[qbName] } - if selectOffset != -1 { + if qbOffset != -1 { // If the hint belongs to the current view and not belongs to it's nested views, we should convert the view hint to the normal hint. // After we convert the view hint to the normal hint, it can be reused the origin hint's infrastructure. - currentQbHints[selectOffset] = viewHints[qbName] - currentQbNameMap[qbName] = selectOffset + currentQbHints[qbOffset] = viewHints[qbName] + currentQbNameMap[qbName] = qbOffset delete(qbNameMap4View, qbName) delete(viewHints, qbName) } } - hintProcessor.QbNameMap4View = qbNameMap4View - hintProcessor.QbHints4View = viewHints - hintProcessor.QbNameUsed4View = make(map[string]struct{}) - hintProcessor.QbHints = currentQbHints - hintProcessor.QbNameMap = currentQbNameMap + hintProcessor.ViewQBNameToTable = qbNameMap4View + hintProcessor.ViewQBNameToHints = viewHints + hintProcessor.ViewQBNameUsed = make(map[string]struct{}) + hintProcessor.QBOffsetToHints = currentQbHints + hintProcessor.QBNameToSelOffset = currentQbNameMap originHintProcessor := b.hintProcessor originPlannerSelectBlockAsName := b.ctx.GetSessionVars().PlannerSelectBlockAsName.Load() @@ -5861,7 +5720,7 @@ func setIsInApplyForCTE(p LogicalPlan, apSchema *expression.Schema) { func (b *PlanBuilder) buildMaxOneRow(p LogicalPlan) LogicalPlan { // The query block of the MaxOneRow operator should be the same as that of its child. - maxOneRow := LogicalMaxOneRow{}.Init(b.ctx, p.SelectBlockOffset()) + maxOneRow := LogicalMaxOneRow{}.Init(b.ctx, p.QueryBlockOffset()) maxOneRow.SetChildren(p) return maxOneRow } @@ -5899,7 +5758,7 @@ func (b *PlanBuilder) buildSemiJoin(outerPlan, innerPlan LogicalPlan, onConditio // Apply forces to choose hash join currently, so don't worry the hints will take effect if the semi join is in one apply. joinPlan.setPreferredJoinTypeAndOrder(b.TableHints()) if forceRewrite { - joinPlan.preferJoinType |= preferRewriteSemiJoin + joinPlan.preferJoinType |= h.PreferRewriteSemiJoin b.optFlag |= flagSemiJoinRewrite } return joinPlan, nil @@ -6273,7 +6132,7 @@ func (b *PlanBuilder) buildUpdateLists(ctx context.Context, tableList []*ast.Tab } virtualAssignments = append(virtualAssignments, &ast.Assignment{ Column: &ast.ColumnName{Schema: tn.Schema, Table: tn.Name, Name: colInfo.Name}, - Expr: tableVal.Cols()[i].GeneratedExpr, + Expr: tableVal.Cols()[i].GeneratedExpr.Clone(), }) } } @@ -7193,7 +7052,7 @@ func (b *PlanBuilder) handleDefaultFrame(spec *ast.WindowSpec, windowFuncName st // For functions that operate on the entire partition, the frame clause will be ignored. if spec.Frame != nil { specName := spec.Name.O - b.ctx.GetSessionVars().StmtCtx.AppendNote(ErrWindowFunctionIgnoresFrame.GenWithStackByArgs(windowFuncName, getWindowName(specName))) + b.ctx.GetSessionVars().StmtCtx.AppendNote(ErrWindowFunctionIgnoresFrame.FastGenByArgs(windowFuncName, getWindowName(specName))) newSpec.Frame = nil updated = true } @@ -7570,19 +7429,19 @@ func getInnerFromParenthesesAndUnaryPlus(expr ast.ExprNode) ast.ExprNode { // containDifferentJoinTypes checks whether `preferJoinType` contains different // join types. func containDifferentJoinTypes(preferJoinType uint) bool { - preferJoinType &= ^preferNoHashJoin - preferJoinType &= ^preferNoMergeJoin - preferJoinType &= ^preferNoIndexJoin - preferJoinType &= ^preferNoIndexHashJoin - preferJoinType &= ^preferNoIndexMergeJoin - - inlMask := preferRightAsINLJInner ^ preferLeftAsINLJInner - inlhjMask := preferRightAsINLHJInner ^ preferLeftAsINLHJInner - inlmjMask := preferRightAsINLMJInner ^ preferLeftAsINLMJInner - hjRightBuildMask := preferRightAsHJBuild ^ preferLeftAsHJProbe - hjLeftBuildMask := preferLeftAsHJBuild ^ preferRightAsHJProbe - - mppMask := preferShuffleJoin ^ preferBCJoin + preferJoinType &= ^h.PreferNoHashJoin + preferJoinType &= ^h.PreferNoMergeJoin + preferJoinType &= ^h.PreferNoIndexJoin + preferJoinType &= ^h.PreferNoIndexHashJoin + preferJoinType &= ^h.PreferNoIndexMergeJoin + + inlMask := h.PreferRightAsINLJInner ^ h.PreferLeftAsINLJInner + inlhjMask := h.PreferRightAsINLHJInner ^ h.PreferLeftAsINLHJInner + inlmjMask := h.PreferRightAsINLMJInner ^ h.PreferLeftAsINLMJInner + hjRightBuildMask := h.PreferRightAsHJBuild ^ h.PreferLeftAsHJProbe + hjLeftBuildMask := h.PreferLeftAsHJBuild ^ h.PreferRightAsHJProbe + + mppMask := h.PreferShuffleJoin ^ h.PreferBCJoin mask := inlMask ^ inlhjMask ^ inlmjMask ^ hjRightBuildMask ^ hjLeftBuildMask onesCount := bits.OnesCount(preferJoinType & ^mask & ^mppMask) if onesCount > 1 || onesCount == 1 && preferJoinType&mask > 0 { @@ -7609,7 +7468,7 @@ func containDifferentJoinTypes(preferJoinType uint) bool { } func hasMPPJoinHints(preferJoinType uint) bool { - return (preferJoinType&preferBCJoin > 0) || (preferJoinType&preferShuffleJoin > 0) + return (preferJoinType&h.PreferBCJoin > 0) || (preferJoinType&h.PreferShuffleJoin > 0) } // isJoinHintSupportedInMPPMode is used to check if the specified join hint is available under MPP mode. @@ -7617,9 +7476,9 @@ func isJoinHintSupportedInMPPMode(preferJoinType uint) bool { if preferJoinType == 0 { return true } - mppMask := preferShuffleJoin ^ preferBCJoin + mppMask := h.PreferShuffleJoin ^ h.PreferBCJoin // Currently, TiFlash only supports HASH JOIN, so the hint for HASH JOIN is available while other join method hints are forbidden. - joinMethodHintSupportedByTiflash := preferHashJoin ^ preferLeftAsHJBuild ^ preferRightAsHJBuild ^ preferLeftAsHJProbe ^ preferRightAsHJProbe + joinMethodHintSupportedByTiflash := h.PreferHashJoin ^ h.PreferLeftAsHJBuild ^ h.PreferRightAsHJBuild ^ h.PreferLeftAsHJProbe ^ h.PreferRightAsHJProbe onesCount := bits.OnesCount(preferJoinType & ^joinMethodHintSupportedByTiflash & ^mppMask) return onesCount < 1 } @@ -7729,6 +7588,10 @@ func (b *PlanBuilder) buildRecursiveCTE(ctx context.Context, cte ast.ResultSetNo // Build seed part plan. saveSelect := x.SelectList.Selects x.SelectList.Selects = x.SelectList.Selects[:i] + // We're rebuilding the seed part, so we pop the result we built previously. + for _i := 0; _i < i; _i++ { + b.handleHelper.popMap() + } p, err = b.buildSetOpr(ctx, x) if err != nil { return err diff --git a/pkg/planner/core/logical_plan_trace_test.go b/pkg/planner/core/logical_plan_trace_test.go index c46015bcbca89..036986a2b5a42 100644 --- a/pkg/planner/core/logical_plan_trace_test.go +++ b/pkg/planner/core/logical_plan_trace_test.go @@ -411,7 +411,7 @@ func TestSingleRuleTraceStep(t *testing.T) { sctx := MockContext() sctx.GetSessionVars().StmtCtx.EnableOptimizeTrace = true sctx.GetSessionVars().AllowAggPushDown = true - builder, _ := NewPlanBuilder().Init(sctx, s.is, &hint.BlockHintProcessor{}) + builder, _ := NewPlanBuilder().Init(sctx, s.is, hint.NewQBHintHandler(nil)) domain.GetDomain(sctx).MockInfoCacheAndLoadInfoSchema(s.is) ctx := context.TODO() p, err := builder.Build(ctx, stmt) diff --git a/pkg/planner/core/logical_plans.go b/pkg/planner/core/logical_plans.go index da3ad0f3bf44f..8668630ad9d0e 100644 --- a/pkg/planner/core/logical_plans.go +++ b/pkg/planner/core/logical_plans.go @@ -36,6 +36,7 @@ import ( "github.com/pingcap/tidb/pkg/statistics" "github.com/pingcap/tidb/pkg/table" "github.com/pingcap/tidb/pkg/types" + h "github.com/pingcap/tidb/pkg/util/hint" "github.com/pingcap/tidb/pkg/util/intset" "github.com/pingcap/tidb/pkg/util/logutil" "github.com/pingcap/tidb/pkg/util/ranger" @@ -116,48 +117,6 @@ func (tp JoinType) String() string { return "unsupported join type" } -const ( - // Hint flag for join - preferINLJ uint = 1 << iota - preferINLHJ - preferINLMJ - preferHJBuild - preferHJProbe - preferHashJoin - preferNoHashJoin - preferMergeJoin - preferNoMergeJoin - preferNoIndexJoin - preferNoIndexHashJoin - preferNoIndexMergeJoin - preferBCJoin - preferShuffleJoin - preferRewriteSemiJoin - - // Hint flag to specify the join with direction - preferLeftAsINLJInner - preferRightAsINLJInner - preferLeftAsINLHJInner - preferRightAsINLHJInner - preferLeftAsINLMJInner - preferRightAsINLMJInner - preferLeftAsHJBuild - preferRightAsHJBuild - preferLeftAsHJProbe - preferRightAsHJProbe - - // Hint flag for Agg - preferHashAgg - preferStreamAgg - preferMPP1PhaseAgg - preferMPP2PhaseAgg -) - -const ( - preferTiKV = 1 << iota - preferTiFlash -) - // LogicalJoin is the logical join plan. type LogicalJoin struct { logicalSchemaProducer @@ -168,7 +127,7 @@ type LogicalJoin struct { StraightJoin bool // hintInfo stores the join algorithm hint information specified by client. - hintInfo *tableHintInfo + hintInfo *h.TableHintInfo preferJoinType uint preferJoinOrder bool leftPreferJoinType uint @@ -218,7 +177,7 @@ func (p *LogicalJoin) isNAAJ() bool { // Shallow shallow copies a LogicalJoin struct. func (p *LogicalJoin) Shallow() *LogicalJoin { join := *p - return join.Init(p.SCtx(), p.SelectBlockOffset()) + return join.Init(p.SCtx(), p.QueryBlockOffset()) } // ExtractFD implements the interface LogicalPlan. @@ -452,28 +411,29 @@ func (p *LogicalJoin) columnSubstituteAll(schema *expression.Schema, exprs []exp copy(cpOtherConditions, p.OtherConditions) copy(cpEqualConditions, p.EqualConditions) + ctx := p.SCtx() // try to substitute columns in these condition. for i, cond := range cpLeftConditions { - if hasFail, cpLeftConditions[i] = expression.ColumnSubstituteAll(cond, schema, exprs); hasFail { + if hasFail, cpLeftConditions[i] = expression.ColumnSubstituteAll(ctx, cond, schema, exprs); hasFail { return } } for i, cond := range cpRightConditions { - if hasFail, cpRightConditions[i] = expression.ColumnSubstituteAll(cond, schema, exprs); hasFail { + if hasFail, cpRightConditions[i] = expression.ColumnSubstituteAll(ctx, cond, schema, exprs); hasFail { return } } for i, cond := range cpOtherConditions { - if hasFail, cpOtherConditions[i] = expression.ColumnSubstituteAll(cond, schema, exprs); hasFail { + if hasFail, cpOtherConditions[i] = expression.ColumnSubstituteAll(ctx, cond, schema, exprs); hasFail { return } } for i, cond := range cpEqualConditions { var tmp expression.Expression - if hasFail, tmp = expression.ColumnSubstituteAll(cond, schema, exprs); hasFail { + if hasFail, tmp = expression.ColumnSubstituteAll(ctx, cond, schema, exprs); hasFail { return } cpEqualConditions[i] = tmp.(*expression.ScalarFunction) @@ -957,7 +917,7 @@ type LogicalAggregation struct { GroupByItems []expression.Expression // aggHints stores aggregation hint information. - aggHints aggHintInfo + aggHints h.AggHintInfo possibleProperties [][]*expression.Column inputCount float64 // inputCount is the input count of this plan. @@ -1447,12 +1407,17 @@ type LogicalUnionScan struct { handleCols HandleCols } +// GetAllConds Exported for unit test. +func (ds *DataSource) GetAllConds() []expression.Expression { + return ds.allConds +} + // DataSource represents a tableScan without condition push down. type DataSource struct { logicalSchemaProducer astIndexHints []*ast.IndexHint - IndexHints []indexHintInfo + IndexHints []h.IndexHintInfo table table.Table tableInfo *model.TableInfo Columns []*model.ColumnInfo @@ -1460,7 +1425,7 @@ type DataSource struct { TableAsName *model.CIStr // indexMergeHints are the hint for indexmerge. - indexMergeHints []indexHintInfo + indexMergeHints []h.IndexHintInfo // pushedDownConds are the conditions that will be pushed down to coprocessor. pushedDownConds []expression.Expression // allConds contains all the filters on this table. For now it's maintained @@ -1596,9 +1561,9 @@ func getTablePath(paths []*util.AccessPath) *util.AccessPath { } func (ds *DataSource) buildTableGather() LogicalPlan { - ts := LogicalTableScan{Source: ds, HandleCols: ds.handleCols}.Init(ds.SCtx(), ds.SelectBlockOffset()) + ts := LogicalTableScan{Source: ds, HandleCols: ds.handleCols}.Init(ds.SCtx(), ds.QueryBlockOffset()) ts.SetSchema(ds.Schema()) - sg := TiKVSingleGather{Source: ds, IsIndexGather: false}.Init(ds.SCtx(), ds.SelectBlockOffset()) + sg := TiKVSingleGather{Source: ds, IsIndexGather: false}.Init(ds.SCtx(), ds.QueryBlockOffset()) sg.SetSchema(ds.Schema()) sg.SetChildren(ts) return sg @@ -1613,7 +1578,7 @@ func (ds *DataSource) buildIndexGather(path *util.AccessPath) LogicalPlan { FullIdxColLens: path.FullIdxColLens, IdxCols: path.IdxCols, IdxColLens: path.IdxColLens, - }.Init(ds.SCtx(), ds.SelectBlockOffset()) + }.Init(ds.SCtx(), ds.QueryBlockOffset()) is.Columns = make([]*model.ColumnInfo, len(ds.Columns)) copy(is.Columns, ds.Columns) @@ -1624,7 +1589,7 @@ func (ds *DataSource) buildIndexGather(path *util.AccessPath) LogicalPlan { Source: ds, IsIndexGather: true, Index: path.Index, - }.Init(ds.SCtx(), ds.SelectBlockOffset()) + }.Init(ds.SCtx(), ds.QueryBlockOffset()) sg.SetSchema(ds.Schema()) sg.SetChildren(is) return sg @@ -1648,12 +1613,17 @@ func (ds *DataSource) Convert2Gathers() (gathers []LogicalPlan) { return gathers } -func (ds *DataSource) detachCondAndBuildRangeForPath(path *util.AccessPath, conds []expression.Expression) error { +func detachCondAndBuildRangeForPath( + sctx sessionctx.Context, + path *util.AccessPath, + conds []expression.Expression, + histColl *statistics.HistColl, +) error { if len(path.IdxCols) == 0 { path.TableFilters = conds return nil } - res, err := ranger.DetachCondAndBuildRangeForIndex(ds.SCtx(), conds, path.IdxCols, path.IdxColLens, ds.SCtx().GetSessionVars().RangeMaxSize) + res, err := ranger.DetachCondAndBuildRangeForIndex(sctx, conds, path.IdxCols, path.IdxColLens, sctx.GetSessionVars().RangeMaxSize) if err != nil { return err } @@ -1669,7 +1639,7 @@ func (ds *DataSource) detachCondAndBuildRangeForPath(path *util.AccessPath, cond path.ConstCols[i] = res.ColumnValues[i] != nil } } - path.CountAfterAccess, err = cardinality.GetRowCountByIndexRanges(ds.SCtx(), ds.tableStats.HistColl, path.Index.ID, path.Ranges) + path.CountAfterAccess, err = cardinality.GetRowCountByIndexRanges(sctx, histColl, path.Index.ID, path.Ranges) return err } @@ -1681,7 +1651,7 @@ func (ds *DataSource) deriveCommonHandleTablePathStats(path *util.AccessPath, co if len(conds) == 0 { return nil } - if err := ds.detachCondAndBuildRangeForPath(path, conds); err != nil { + if err := detachCondAndBuildRangeForPath(ds.SCtx(), path, conds, ds.tableStats.HistColl); err != nil { return err } if path.EqOrInCondCount == len(path.AccessConds) { @@ -1826,7 +1796,7 @@ func (ds *DataSource) fillIndexPath(path *util.AccessPath, conds []expression.Ex } } } - err := ds.detachCondAndBuildRangeForPath(path, conds) + err := detachCondAndBuildRangeForPath(ds.SCtx(), path, conds, ds.tableStats.HistColl) return err } @@ -1950,7 +1920,7 @@ type LogicalTopN struct { PartitionBy []property.SortItem // This is used for enhanced topN optimization Offset uint64 Count uint64 - limitHints limitHintInfo + limitHints h.LimitHintInfo } // GetPartitionBy returns partition by fields @@ -1979,7 +1949,7 @@ type LogicalLimit struct { PartitionBy []property.SortItem // This is used for enhanced topN optimization Offset uint64 Count uint64 - limitHints limitHintInfo + limitHints h.LimitHintInfo IsPartial bool } diff --git a/pkg/planner/core/logical_plans_test.go b/pkg/planner/core/logical_plans_test.go index 87c6ca25ea925..a297a6071c186 100644 --- a/pkg/planner/core/logical_plans_test.go +++ b/pkg/planner/core/logical_plans_test.go @@ -37,6 +37,7 @@ import ( "github.com/pingcap/tidb/pkg/sessionctx/variable" "github.com/pingcap/tidb/pkg/testkit/testdata" "github.com/pingcap/tidb/pkg/util/hint" + "github.com/pingcap/tidb/pkg/util/mock" "github.com/pingcap/tipb/go-tipb" "github.com/stretchr/testify/require" ) @@ -93,7 +94,22 @@ func createPlannerSuite() (s *plannerSuite) { } } s.is = infoschema.MockInfoSchema(tblInfos) - s.ctx = MockContext() + ctx := mock.NewContext() + ctx.Store = &mock.Store{ + Client: &mock.Client{}, + } + initStatsCtx := mock.NewContext() + initStatsCtx.Store = &mock.Store{ + Client: &mock.Client{}, + } + ctx.GetSessionVars().CurrentDB = "test" + do := domain.NewMockDomain() + if err := do.CreateStatsHandle(ctx, initStatsCtx); err != nil { + panic(fmt.Sprintf("create mock context panic: %+v", err)) + } + domain.BindDomain(ctx, do) + ctx.SetInfoSchema(s.is) + s.ctx = ctx domain.GetDomain(s.ctx).MockInfoCacheAndLoadInfoSchema(s.is) s.ctx.GetSessionVars().EnableWindowFunction = true s.p = parser.New() @@ -1482,7 +1498,7 @@ func TestVisitInfo(t *testing.T) { // TODO: to fix, Table 'test.ttt' doesn't exist _ = Preprocess(context.Background(), s.ctx, stmt, WithPreprocessorReturn(&PreprocessorReturn{InfoSchema: s.is})) sctx := MockContext() - builder, _ := NewPlanBuilder().Init(sctx, s.is, &hint.BlockHintProcessor{}) + builder, _ := NewPlanBuilder().Init(sctx, s.is, hint.NewQBHintHandler(nil)) domain.GetDomain(sctx).MockInfoCacheAndLoadInfoSchema(s.is) builder.ctx.GetSessionVars().SetHashJoinConcurrency(1) _, err = builder.Build(context.TODO(), stmt) @@ -1566,7 +1582,7 @@ func TestUnion(t *testing.T) { err = Preprocess(context.Background(), s.ctx, stmt, WithPreprocessorReturn(&PreprocessorReturn{InfoSchema: s.is})) require.NoError(t, err) sctx := MockContext() - builder, _ := NewPlanBuilder().Init(sctx, s.is, &hint.BlockHintProcessor{}) + builder, _ := NewPlanBuilder().Init(sctx, s.is, hint.NewQBHintHandler(nil)) domain.GetDomain(sctx).MockInfoCacheAndLoadInfoSchema(s.is) plan, err := builder.Build(ctx, stmt) testdata.OnRecord(func() { @@ -1608,7 +1624,7 @@ func TestTopNPushDown(t *testing.T) { err = Preprocess(context.Background(), s.ctx, stmt, WithPreprocessorReturn(&PreprocessorReturn{InfoSchema: s.is})) require.NoError(t, err) sctx := MockContext() - builder, _ := NewPlanBuilder().Init(sctx, s.is, &hint.BlockHintProcessor{}) + builder, _ := NewPlanBuilder().Init(sctx, s.is, hint.NewQBHintHandler(nil)) domain.GetDomain(sctx).MockInfoCacheAndLoadInfoSchema(s.is) p, err := builder.Build(ctx, stmt) require.NoError(t, err) @@ -1695,7 +1711,7 @@ func TestOuterJoinEliminator(t *testing.T) { err = Preprocess(context.Background(), s.ctx, stmt, WithPreprocessorReturn(&PreprocessorReturn{InfoSchema: s.is})) require.NoError(t, err) sctx := MockContext() - builder, _ := NewPlanBuilder().Init(sctx, s.is, &hint.BlockHintProcessor{}) + builder, _ := NewPlanBuilder().Init(sctx, s.is, hint.NewQBHintHandler(nil)) domain.GetDomain(sctx).MockInfoCacheAndLoadInfoSchema(s.is) p, err := builder.Build(ctx, stmt) require.NoError(t, err) @@ -1735,7 +1751,7 @@ func TestSelectView(t *testing.T) { err = Preprocess(context.Background(), s.ctx, stmt, WithPreprocessorReturn(&PreprocessorReturn{InfoSchema: s.is})) require.NoError(t, err) sctx := MockContext() - builder, _ := NewPlanBuilder().Init(sctx, s.is, &hint.BlockHintProcessor{}) + builder, _ := NewPlanBuilder().Init(sctx, s.is, hint.NewQBHintHandler(nil)) p, err := builder.Build(ctx, stmt) require.NoError(t, err) p, err = logicalOptimize(ctx, builder.optFlag, p.(LogicalPlan)) @@ -1842,7 +1858,7 @@ func (s *plannerSuiteWithOptimizeVars) optimize(ctx context.Context, sql string) return nil, nil, err } } - builder, _ := NewPlanBuilder().Init(sctx, s.is, &hint.BlockHintProcessor{}) + builder, _ := NewPlanBuilder().Init(sctx, s.is, hint.NewQBHintHandler(nil)) domain.GetDomain(sctx).MockInfoCacheAndLoadInfoSchema(s.is) p, err := builder.Build(ctx, stmt) if err != nil { @@ -1944,7 +1960,7 @@ func TestSkylinePruning(t *testing.T) { err = Preprocess(context.Background(), s.ctx, stmt, WithPreprocessorReturn(&PreprocessorReturn{InfoSchema: s.is})) require.NoError(t, err) sctx := MockContext() - builder, _ := NewPlanBuilder().Init(sctx, s.is, &hint.BlockHintProcessor{}) + builder, _ := NewPlanBuilder().Init(sctx, s.is, hint.NewQBHintHandler(nil)) domain.GetDomain(sctx).MockInfoCacheAndLoadInfoSchema(s.is) p, err := builder.Build(ctx, stmt) if err != nil { @@ -2053,7 +2069,7 @@ func TestUpdateEQCond(t *testing.T) { err = Preprocess(context.Background(), s.ctx, stmt, WithPreprocessorReturn(&PreprocessorReturn{InfoSchema: s.is})) require.NoError(t, err) sctx := MockContext() - builder, _ := NewPlanBuilder().Init(sctx, s.is, &hint.BlockHintProcessor{}) + builder, _ := NewPlanBuilder().Init(sctx, s.is, hint.NewQBHintHandler(nil)) domain.GetDomain(sctx).MockInfoCacheAndLoadInfoSchema(s.is) p, err := builder.Build(ctx, stmt) require.NoError(t, err) @@ -2077,7 +2093,7 @@ func TestConflictedJoinTypeHints(t *testing.T) { defer func() { domain.GetDomain(sctx).StatsHandle().Close() }() - builder, _ := NewPlanBuilder().Init(sctx, s.is, &hint.BlockHintProcessor{}) + builder, _ := NewPlanBuilder().Init(sctx, s.is, hint.NewQBHintHandler(nil)) domain.GetDomain(sctx).MockInfoCacheAndLoadInfoSchema(s.is) p, err := builder.Build(ctx, stmt) require.NoError(t, err) @@ -2104,7 +2120,7 @@ func TestSimplyOuterJoinWithOnlyOuterExpr(t *testing.T) { defer func() { domain.GetDomain(sctx).StatsHandle().Close() }() - builder, _ := NewPlanBuilder().Init(sctx, s.is, &hint.BlockHintProcessor{}) + builder, _ := NewPlanBuilder().Init(sctx, s.is, hint.NewQBHintHandler(nil)) domain.GetDomain(sctx).MockInfoCacheAndLoadInfoSchema(s.is) p, err := builder.Build(ctx, stmt) require.NoError(t, err) @@ -2300,7 +2316,7 @@ func TestRollupExpand(t *testing.T) { // manual builder s.ctx.GetSessionVars().PlanID.Store(0) s.ctx.GetSessionVars().PlanColumnID.Store(0) - builder, _ := NewPlanBuilder().Init(s.ctx, s.is, &hint.BlockHintProcessor{}) + builder, _ := NewPlanBuilder().Init(s.ctx, s.is, hint.NewQBHintHandler(nil)) p, err := builder.Build(ctx, stmt) require.NoError(t, err) diff --git a/pkg/planner/core/main_test.go b/pkg/planner/core/main_test.go index c716e04c93336..403ca25cce6bf 100644 --- a/pkg/planner/core/main_test.go +++ b/pkg/planner/core/main_test.go @@ -40,6 +40,7 @@ func TestMain(m *testing.M) { planSuiteUnexportedData = testDataMap["plan_suite_unexported"] opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("gopkg.in/natefinch/lumberjack%2ev2.(*Logger).millRun"), diff --git a/pkg/planner/core/memtable_predicate_extractor_test.go b/pkg/planner/core/memtable_predicate_extractor_test.go index 77f1585807d2b..df4a99d60168b 100644 --- a/pkg/planner/core/memtable_predicate_extractor_test.go +++ b/pkg/planner/core/memtable_predicate_extractor_test.go @@ -25,7 +25,6 @@ import ( "time" "github.com/pingcap/tidb/pkg/domain" - "github.com/pingcap/tidb/pkg/errno" "github.com/pingcap/tidb/pkg/expression" "github.com/pingcap/tidb/pkg/parser" "github.com/pingcap/tidb/pkg/parser/ast" @@ -45,7 +44,7 @@ func getLogicalMemTable(t *testing.T, dom *domain.Domain, se sessiontypes.Sessio require.NoError(t, err) ctx := context.Background() - builder, _ := plannercore.NewPlanBuilder().Init(se, dom.InfoSchema(), &hint.BlockHintProcessor{}) + builder, _ := plannercore.NewPlanBuilder().Init(se, dom.InfoSchema(), hint.NewQBHintHandler(nil)) plan, err := builder.Build(ctx, stmt) require.NoError(t, err) @@ -1651,63 +1650,6 @@ func TestColumns(t *testing.T) { } } -func TestPredicateQuery(t *testing.T) { - store := testkit.CreateMockStore(t) - - tk := testkit.NewTestKit(t, store) - tk.MustExec("use test") - tk.MustExec("create table t(id int, abctime int,DATETIME_PRECISION int);") - tk.MustExec("create table abclmn(a int);") - tk.MustQuery("select TABLE_NAME from information_schema.columns where table_schema = 'test' and column_name like 'i%'").Check(testkit.Rows("t")) - tk.MustQuery("select TABLE_NAME from information_schema.columns where table_schema = 'TEST' and column_name like 'I%'").Check(testkit.Rows("t")) - tk.MustQuery("select TABLE_NAME from information_schema.columns where table_schema = 'TEST' and column_name like 'ID'").Check(testkit.Rows("t")) - tk.MustQuery("select TABLE_NAME from information_schema.columns where table_schema = 'TEST' and column_name like 'id'").Check(testkit.Rows("t")) - tk.MustQuery("select column_name from information_schema.columns where table_schema = 'TEST' and (column_name like 'i%' or column_name like '%d')").Check(testkit.Rows("id")) - tk.MustQuery("select column_name from information_schema.columns where table_schema = 'TEST' and (column_name like 'abc%' and column_name like '%time')").Check(testkit.Rows("abctime")) - result := tk.MustQuery("select TABLE_NAME, column_name from information_schema.columns where table_schema = 'TEST' and column_name like '%time';") - require.Len(t, result.Rows(), 1) - tk.MustQuery("describe t").Check(testkit.Rows("id int(11) YES ", "abctime int(11) YES ", "DATETIME_PRECISION int(11) YES ")) - tk.MustQuery("describe t id").Check(testkit.Rows("id int(11) YES ")) - tk.MustQuery("describe t ID").Check(testkit.Rows("id int(11) YES ")) - tk.MustGetErrCode("describe t 'I%'", errno.ErrParse) - tk.MustGetErrCode("describe t I%", errno.ErrParse) - - tk.MustQuery("show columns from t like 'abctime'").Check(testkit.RowsWithSep(",", "abctime,int(11),YES,,,")) - tk.MustQuery("show columns from t like 'ABCTIME'").Check(testkit.RowsWithSep(",", "abctime,int(11),YES,,,")) - tk.MustQuery("show columns from t like 'abc%'").Check(testkit.RowsWithSep(",", "abctime,int(11),YES,,,")) - tk.MustQuery("show columns from t like 'ABC%'").Check(testkit.RowsWithSep(",", "abctime,int(11),YES,,,")) - tk.MustQuery("show columns from t like '%ime'").Check(testkit.RowsWithSep(",", "abctime,int(11),YES,,,")) - tk.MustQuery("show columns from t like '%IME'").Check(testkit.RowsWithSep(",", "abctime,int(11),YES,,,")) - tk.MustQuery("show columns in t like '%ime'").Check(testkit.RowsWithSep(",", "abctime,int(11),YES,,,")) - tk.MustQuery("show columns in t like '%IME'").Check(testkit.RowsWithSep(",", "abctime,int(11),YES,,,")) - tk.MustQuery("show fields in t like '%ime'").Check(testkit.RowsWithSep(",", "abctime,int(11),YES,,,")) - tk.MustQuery("show fields in t like '%IME'").Check(testkit.RowsWithSep(",", "abctime,int(11),YES,,,")) - - tk.MustQuery("show columns from t where field like '%time'").Check(testkit.RowsWithSep(",", "abctime,int(11),YES,,,")) - tk.MustQuery("show columns from t where field = 'abctime'").Check(testkit.RowsWithSep(",", "abctime,int(11),YES,,,")) - tk.MustQuery("show columns in t where field = 'abctime'").Check(testkit.RowsWithSep(",", "abctime,int(11),YES,,,")) - tk.MustQuery("show fields from t where field = 'abctime'").Check(testkit.RowsWithSep(",", "abctime,int(11),YES,,,")) - tk.MustQuery("show fields in t where field = 'abctime'").Check(testkit.RowsWithSep(",", "abctime,int(11),YES,,,")) - tk.MustQuery("explain t").Check(testkit.Rows("id int(11) YES ", "abctime int(11) YES ", "DATETIME_PRECISION int(11) YES ")) - - tk.MustGetErrCode("show columns from t like id", errno.ErrBadField) - tk.MustGetErrCode("show columns from t like `id`", errno.ErrBadField) - - tk.MustQuery("show tables like 't'").Check(testkit.Rows("t")) - tk.MustQuery("show tables like 'T'").Check(testkit.Rows("t")) - tk.MustQuery("show tables like 'ABCLMN'").Check(testkit.Rows("abclmn")) - tk.MustQuery("show tables like 'ABC%'").Check(testkit.Rows("abclmn")) - tk.MustQuery("show tables like '%lmn'").Check(testkit.Rows("abclmn")) - tk.MustQuery("show full tables like '%lmn'").Check(testkit.Rows("abclmn BASE TABLE")) - tk.MustGetErrCode("show tables like T", errno.ErrBadField) - tk.MustGetErrCode("show tables like `T`", errno.ErrBadField) - - // For issue46618 - tk.MustExec("create table _bar (id int);") - tk.MustExec("create table bar (id int);") - require.Len(t, tk.MustQuery(`show tables like '\_%'`).Rows(), 1) -} - func TestTikvRegionStatusExtractor(t *testing.T) { store, dom := testkit.CreateMockStoreAndDomain(t) diff --git a/pkg/planner/core/optimizer.go b/pkg/planner/core/optimizer.go index c17ddfc8e4f04..552e1181b6844 100644 --- a/pkg/planner/core/optimizer.go +++ b/pkg/planner/core/optimizer.go @@ -175,7 +175,7 @@ type logicalOptRule interface { func BuildLogicalPlanForTest(ctx context.Context, sctx sessionctx.Context, node ast.Node, infoSchema infoschema.InfoSchema) (Plan, error) { sctx.GetSessionVars().PlanID.Store(0) sctx.GetSessionVars().PlanColumnID.Store(0) - builder, _ := NewPlanBuilder().Init(sctx, infoSchema, &utilhint.BlockHintProcessor{}) + builder, _ := NewPlanBuilder().Init(sctx, infoSchema, utilhint.NewQBHintHandler(nil)) p, err := builder.Build(ctx, node) if err != nil { return nil, err @@ -541,7 +541,7 @@ func prunePhysicalColumnForHashJoinChild(sctx sessionctx.Context, hashJoin *Phys ch := sender.children[0] proj := PhysicalProjection{ Exprs: usedExprs, - }.Init(sctx, ch.StatsInfo(), ch.SelectBlockOffset()) + }.Init(sctx, ch.StatsInfo(), ch.QueryBlockOffset()) proj.SetSchema(prunedSchema) proj.SetChildren(ch) @@ -623,7 +623,7 @@ func tryEnableLateMaterialization(sctx sessionctx.Context, plan PhysicalPlan) { } if sctx.GetSessionVars().EnableLateMaterialization && sctx.GetSessionVars().TiFlashFastScan { sc := sctx.GetSessionVars().StmtCtx - sc.AppendWarning(errors.New("FastScan is not compatible with late materialization, late materialization is disabled")) + sc.AppendWarning(errors.NewNoStackError("FastScan is not compatible with late materialization, late materialization is disabled")) } } @@ -1116,9 +1116,12 @@ func enableParallelApply(sctx sessionctx.Context, plan PhysicalPlan) PhysicalPla if noOrder && supportClone { apply.Concurrency = sctx.GetSessionVars().ExecutorConcurrency } else { - sctx.GetSessionVars().StmtCtx.AppendWarning(errors.Errorf("Some apply operators can not be executed in parallel")) + if err != nil { + sctx.GetSessionVars().StmtCtx.AppendWarning(errors.NewNoStackErrorf("Some apply operators can not be executed in parallel: %v", err)) + } else { + sctx.GetSessionVars().StmtCtx.AppendWarning(errors.NewNoStackError("Some apply operators can not be executed in parallel")) + } } - // because of the limitation 3, we cannot parallelize Apply operators in this Apply's inner size, // so we only invoke recursively for its outer child. apply.SetChild(outerIdx, enableParallelApply(sctx, apply.Children()[outerIdx])) @@ -1234,7 +1237,7 @@ func physicalOptimize(logic LogicalPlan, planCounter *PlanCounterTp) (plan Physi return nil, 0, err } if *planCounter > 0 { - logic.SCtx().GetSessionVars().StmtCtx.AppendWarning(errors.Errorf("The parameter of nth_plan() is out of range")) + logic.SCtx().GetSessionVars().StmtCtx.AppendWarning(errors.NewNoStackErrorf("The parameter of nth_plan() is out of range")) } if t.invalid() { errMsg := "Can't find a proper physical plan for this query" diff --git a/pkg/planner/core/optimizer_test.go b/pkg/planner/core/optimizer_test.go index 5e876d29caecc..2b1088ded1ef6 100644 --- a/pkg/planner/core/optimizer_test.go +++ b/pkg/planner/core/optimizer_test.go @@ -431,6 +431,7 @@ func TestPrunePhysicalColumns(t *testing.T) { ExchangeType: tipb.ExchangeType_PassThrough, } hashJoin := &PhysicalHashJoin{} + hashJoin = hashJoin.Init(sctx, nil, 0) recv := &PhysicalExchangeReceiver{} recv1 := &PhysicalExchangeReceiver{} hashSender := &PhysicalExchangeSender{ diff --git a/pkg/planner/core/partition_pruning_test.go b/pkg/planner/core/partition_pruning_test.go index e65499dc32182..4268f890348bf 100644 --- a/pkg/planner/core/partition_pruning_test.go +++ b/pkg/planner/core/partition_pruning_test.go @@ -81,39 +81,87 @@ func TestCanBePrune(t *testing.T) { // need to convert 1564761600 to a timestamp, during that step, an error happen and the result is set to } -func TestPruneUseBinarySearch(t *testing.T) { - lessThan := lessThanDataInt{data: []int64{4, 7, 11, 14, 17, 0}, maxvalue: true} +func TestPruneUseBinarySearchSigned(t *testing.T) { + lessThan := lessThanDataInt{data: []int64{-3, 4, 7, 11, 14, 17, 0}, maxvalue: true, unsigned: false} + cases := []struct { + input dataForPrune + result partitionRange + }{ + {dataForPrune{ast.EQ, 66, false}, partitionRange{6, 7}}, + {dataForPrune{ast.EQ, 14, false}, partitionRange{5, 6}}, + {dataForPrune{ast.EQ, 10, false}, partitionRange{3, 4}}, + {dataForPrune{ast.EQ, 3, false}, partitionRange{1, 2}}, + {dataForPrune{ast.EQ, -4, false}, partitionRange{0, 1}}, + {dataForPrune{ast.LT, 66, false}, partitionRange{0, 7}}, + {dataForPrune{ast.LT, 14, false}, partitionRange{0, 5}}, + {dataForPrune{ast.LT, 10, false}, partitionRange{0, 4}}, + {dataForPrune{ast.LT, 3, false}, partitionRange{0, 2}}, + {dataForPrune{ast.LT, -4, false}, partitionRange{0, 1}}, + {dataForPrune{ast.GE, 66, false}, partitionRange{6, 7}}, + {dataForPrune{ast.GE, 14, false}, partitionRange{5, 7}}, + {dataForPrune{ast.GE, 10, false}, partitionRange{3, 7}}, + {dataForPrune{ast.GE, 3, false}, partitionRange{1, 7}}, + {dataForPrune{ast.GE, -4, false}, partitionRange{0, 7}}, + {dataForPrune{ast.GT, 66, false}, partitionRange{6, 7}}, + {dataForPrune{ast.GT, 14, false}, partitionRange{5, 7}}, + {dataForPrune{ast.GT, 10, false}, partitionRange{4, 7}}, + {dataForPrune{ast.GT, 3, false}, partitionRange{2, 7}}, + {dataForPrune{ast.GT, 2, false}, partitionRange{1, 7}}, + {dataForPrune{ast.GT, -4, false}, partitionRange{1, 7}}, + {dataForPrune{ast.LE, 66, false}, partitionRange{0, 7}}, + {dataForPrune{ast.LE, 14, false}, partitionRange{0, 6}}, + {dataForPrune{ast.LE, 10, false}, partitionRange{0, 4}}, + {dataForPrune{ast.LE, 3, false}, partitionRange{0, 2}}, + {dataForPrune{ast.LE, -4, false}, partitionRange{0, 1}}, + {dataForPrune{ast.IsNull, 0, false}, partitionRange{0, 1}}, + {dataForPrune{"illegal", 0, false}, partitionRange{0, 7}}, + } + + for i, ca := range cases { + start, end := pruneUseBinarySearch(lessThan, ca.input) + require.Equalf(t, ca.result.start, start, "fail = %d", i) + require.Equalf(t, ca.result.end, end, "fail = %d", i) + } +} + +func TestPruneUseBinarySearchUnSigned(t *testing.T) { + lessThan := lessThanDataInt{data: []int64{4, 7, 11, 14, 17, 0}, maxvalue: true, unsigned: true} cases := []struct { input dataForPrune result partitionRange }{ - {dataForPrune{ast.EQ, 66}, partitionRange{5, 6}}, - {dataForPrune{ast.EQ, 14}, partitionRange{4, 5}}, - {dataForPrune{ast.EQ, 10}, partitionRange{2, 3}}, - {dataForPrune{ast.EQ, 3}, partitionRange{0, 1}}, - {dataForPrune{ast.LT, 66}, partitionRange{0, 6}}, - {dataForPrune{ast.LT, 14}, partitionRange{0, 4}}, - {dataForPrune{ast.LT, 10}, partitionRange{0, 3}}, - {dataForPrune{ast.LT, 3}, partitionRange{0, 1}}, - {dataForPrune{ast.GE, 66}, partitionRange{5, 6}}, - {dataForPrune{ast.GE, 14}, partitionRange{4, 6}}, - {dataForPrune{ast.GE, 10}, partitionRange{2, 6}}, - {dataForPrune{ast.GE, 3}, partitionRange{0, 6}}, - {dataForPrune{ast.GT, 66}, partitionRange{5, 6}}, - {dataForPrune{ast.GT, 14}, partitionRange{4, 6}}, - {dataForPrune{ast.GT, 10}, partitionRange{3, 6}}, - {dataForPrune{ast.GT, 3}, partitionRange{1, 6}}, - {dataForPrune{ast.GT, 2}, partitionRange{0, 6}}, - {dataForPrune{ast.LE, 66}, partitionRange{0, 6}}, - {dataForPrune{ast.LE, 14}, partitionRange{0, 5}}, - {dataForPrune{ast.LE, 10}, partitionRange{0, 3}}, - {dataForPrune{ast.LE, 3}, partitionRange{0, 1}}, - {dataForPrune{ast.IsNull, 0}, partitionRange{0, 1}}, - {dataForPrune{"illegal", 0}, partitionRange{0, 6}}, + {dataForPrune{ast.EQ, 66, false}, partitionRange{5, 6}}, + {dataForPrune{ast.EQ, 14, false}, partitionRange{4, 5}}, + {dataForPrune{ast.EQ, 10, false}, partitionRange{2, 3}}, + {dataForPrune{ast.EQ, 3, false}, partitionRange{0, 1}}, + {dataForPrune{ast.EQ, -3, false}, partitionRange{0, 1}}, + {dataForPrune{ast.LT, 66, false}, partitionRange{0, 6}}, + {dataForPrune{ast.LT, 14, false}, partitionRange{0, 4}}, + {dataForPrune{ast.LT, 10, false}, partitionRange{0, 3}}, + {dataForPrune{ast.LT, 3, false}, partitionRange{0, 1}}, + {dataForPrune{ast.LT, -3, false}, partitionRange{0, 1}}, + {dataForPrune{ast.GE, 66, false}, partitionRange{5, 6}}, + {dataForPrune{ast.GE, 14, false}, partitionRange{4, 6}}, + {dataForPrune{ast.GE, 10, false}, partitionRange{2, 6}}, + {dataForPrune{ast.GE, 3, false}, partitionRange{0, 6}}, + {dataForPrune{ast.GE, -3, false}, partitionRange{0, 6}}, + {dataForPrune{ast.GT, 66, false}, partitionRange{5, 6}}, + {dataForPrune{ast.GT, 14, false}, partitionRange{4, 6}}, + {dataForPrune{ast.GT, 10, false}, partitionRange{3, 6}}, + {dataForPrune{ast.GT, 3, false}, partitionRange{1, 6}}, + {dataForPrune{ast.GT, 2, false}, partitionRange{0, 6}}, + {dataForPrune{ast.GT, -3, false}, partitionRange{0, 6}}, + {dataForPrune{ast.LE, 66, false}, partitionRange{0, 6}}, + {dataForPrune{ast.LE, 14, false}, partitionRange{0, 5}}, + {dataForPrune{ast.LE, 10, false}, partitionRange{0, 3}}, + {dataForPrune{ast.LE, 3, false}, partitionRange{0, 1}}, + {dataForPrune{ast.LE, -3, false}, partitionRange{0, 1}}, + {dataForPrune{ast.IsNull, 0, false}, partitionRange{0, 1}}, + {dataForPrune{"illegal", 0, false}, partitionRange{0, 6}}, } for i, ca := range cases { - start, end := pruneUseBinarySearch(lessThan, ca.input, false) + start, end := pruneUseBinarySearch(lessThan, ca.input) require.Equalf(t, ca.result.start, start, "fail = %d", i) require.Equalf(t, ca.result.end, end, "fail = %d", i) } diff --git a/pkg/planner/core/pb_to_plan.go b/pkg/planner/core/pb_to_plan.go index 767c7e609501a..a98c5e8afa0ff 100644 --- a/pkg/planner/core/pb_to_plan.go +++ b/pkg/planner/core/pb_to_plan.go @@ -153,7 +153,7 @@ func (b *PBPlanBuilder) buildTableScanSchema(tblInfo *model.TableInfo, columns [ } func (b *PBPlanBuilder) pbToSelection(e *tipb.Executor) (PhysicalPlan, error) { - conds, err := expression.PBToExprs(e.Selection.Conditions, b.tps, b.sctx.GetSessionVars().StmtCtx) + conds, err := expression.PBToExprs(b.sctx, e.Selection.Conditions, b.tps) if err != nil { return nil, err } @@ -165,10 +165,9 @@ func (b *PBPlanBuilder) pbToSelection(e *tipb.Executor) (PhysicalPlan, error) { func (b *PBPlanBuilder) pbToTopN(e *tipb.Executor) (PhysicalPlan, error) { topN := e.TopN - sc := b.sctx.GetSessionVars().StmtCtx byItems := make([]*util.ByItems, 0, len(topN.OrderBy)) for _, item := range topN.OrderBy { - expr, err := expression.PBToExpr(item.Expr, b.tps, sc) + expr, err := expression.PBToExpr(b.sctx, item.Expr, b.tps) if err != nil { return nil, errors.Trace(err) } @@ -230,7 +229,7 @@ func (b *PBPlanBuilder) getAggInfo(executor *tipb.Executor) ([]*aggregation.AggF } aggFuncs = append(aggFuncs, aggFunc) } - groupBys, err := expression.PBToExprs(executor.Aggregation.GetGroupBy(), b.tps, b.sctx.GetSessionVars().StmtCtx) + groupBys, err := expression.PBToExprs(b.sctx, executor.Aggregation.GetGroupBy(), b.tps) if err != nil { return nil, nil, errors.Trace(err) } diff --git a/pkg/planner/core/physical_plan_test.go b/pkg/planner/core/physical_plan_test.go index 7f502ed09acae..40e4985048104 100644 --- a/pkg/planner/core/physical_plan_test.go +++ b/pkg/planner/core/physical_plan_test.go @@ -423,39 +423,6 @@ func testDAGPlanBuilderSplitAvg(t *testing.T, root core.PhysicalPlan) { } } -func TestHJBuildAndProbeHintWithBinding(t *testing.T) { - store := testkit.CreateMockStore(t) - - tk := testkit.NewTestKit(t, store) - tk.MustExec("use test") - tk.MustExec("set tidb_cost_model_version=2") - tk.MustExec("drop table if exists t, t1, t2, t3;") - tk.MustExec("create table t(a int, b int, key(a));") - tk.MustExec("create table t1(a int, b int, key(a));") - tk.MustExec("create table t2(a int, b int, key(a));") - tk.MustExec("create table t3(a int, b int, key(a));") - - tk.MustExec("select * from t1 join t2 on t1.a=t2.a join t3 on t2.b=t3.b") - tk.MustQuery("select @@last_plan_from_binding").Check(testkit.Rows("0")) - tk.MustExec("create global binding for select * from t1 join t2 on t1.a=t2.a join t3 on t2.b=t3.b using select /*+ hash_join_build(t1) */ * from t1 join t2 on t1.a=t2.a join t3 on t2.b=t3.b") - tk.MustExec("select * from t1 join t2 on t1.a=t2.a join t3 on t2.b=t3.b") - tk.MustQuery("select @@last_plan_from_binding").Check(testkit.Rows("1")) - res := tk.MustQuery("show global bindings").Rows() - require.Equal(t, res[0][0], "select * from ( `test` . `t1` join `test` . `t2` on `t1` . `a` = `t2` . `a` ) join `test` . `t3` on `t2` . `b` = `t3` . `b`", "SELECT /*+ hash_join_build(t1)*/ * FROM (`test`.`t1` JOIN `test`.`t2` ON `t1`.`a` = `t2`.`a`) JOIN `test`.`t3` ON `t2`.`b` = `t3`.`b`") - - tk.MustExec("create global binding for select * from t1 join t2 on t1.a=t2.a join t3 on t2.b=t3.b using select /*+ hash_join_probe(t1) */ * from t1 join t2 on t1.a=t2.a join t3 on t2.b=t3.b") - tk.MustExec("select * from t1 join t2 on t1.a=t2.a join t3 on t2.b=t3.b") - tk.MustQuery("select @@last_plan_from_binding").Check(testkit.Rows("1")) - res = tk.MustQuery("show global bindings").Rows() - require.Equal(t, res[0][0], "select * from ( `test` . `t1` join `test` . `t2` on `t1` . `a` = `t2` . `a` ) join `test` . `t3` on `t2` . `b` = `t3` . `b`", "SELECT /*+ hash_join_probe(t1)*/ * FROM (`test`.`t1` JOIN `test`.`t2` ON `t1`.`a` = `t2`.`a`) JOIN `test`.`t3` ON `t2`.`b` = `t3`.`b`") - - tk.MustExec("drop global binding for select * from t1 join t2 on t1.a=t2.a join t3 on t2.b=t3.b") - tk.MustExec("select * from t1 join t2 on t1.a=t2.a join t3 on t2.b=t3.b") - tk.MustQuery("select @@last_plan_from_binding").Check(testkit.Rows("0")) - res = tk.MustQuery("show global bindings").Rows() - require.Equal(t, len(res), 0) -} - func TestPhysicalPlanMemoryTrace(t *testing.T) { // PhysicalSort ls := core.PhysicalSort{} diff --git a/pkg/planner/core/physical_plan_trace_test.go b/pkg/planner/core/physical_plan_trace_test.go index 55f8ad8c2c589..8a5bf1b5b56c8 100644 --- a/pkg/planner/core/physical_plan_trace_test.go +++ b/pkg/planner/core/physical_plan_trace_test.go @@ -95,7 +95,7 @@ func TestPhysicalOptimizeWithTraceEnabled(t *testing.T) { sctx := core.MockContext() sctx.GetSessionVars().StmtCtx.EnableOptimizeTrace = true sctx.GetSessionVars().CostModelVersion = 2 - builder, _ := core.NewPlanBuilder().Init(sctx, dom.InfoSchema(), &hint.BlockHintProcessor{}) + builder, _ := core.NewPlanBuilder().Init(sctx, dom.InfoSchema(), hint.NewQBHintHandler(nil)) domain.GetDomain(sctx).MockInfoCacheAndLoadInfoSchema(dom.InfoSchema()) plan, err := builder.Build(context.TODO(), stmt) require.NoError(t, err) @@ -154,7 +154,7 @@ func TestPhysicalOptimizerTrace(t *testing.T) { }() sctx.GetSessionVars().StmtCtx.EnableOptimizeTrace = true sctx.GetSessionVars().AllowAggPushDown = true - builder, _ := core.NewPlanBuilder().Init(sctx, dom.InfoSchema(), &hint.BlockHintProcessor{}) + builder, _ := core.NewPlanBuilder().Init(sctx, dom.InfoSchema(), hint.NewQBHintHandler(nil)) domain.GetDomain(sctx).MockInfoCacheAndLoadInfoSchema(dom.InfoSchema()) plan, err := builder.Build(context.TODO(), stmt) require.NoError(t, err) @@ -220,7 +220,7 @@ func TestPhysicalOptimizerTraceChildrenNotDuplicated(t *testing.T) { domain.GetDomain(sctx).StatsHandle().Close() }() sctx.GetSessionVars().StmtCtx.EnableOptimizeTrace = true - builder, _ := core.NewPlanBuilder().Init(sctx, dom.InfoSchema(), &hint.BlockHintProcessor{}) + builder, _ := core.NewPlanBuilder().Init(sctx, dom.InfoSchema(), hint.NewQBHintHandler(nil)) domain.GetDomain(sctx).MockInfoCacheAndLoadInfoSchema(dom.InfoSchema()) plan, err := builder.Build(context.TODO(), stmt) require.NoError(t, err) diff --git a/pkg/planner/core/physical_plans.go b/pkg/planner/core/physical_plans.go index c40ce39b04524..6bf372df63dbe 100644 --- a/pkg/planner/core/physical_plans.go +++ b/pkg/planner/core/physical_plans.go @@ -76,8 +76,8 @@ var ( ) type tableScanAndPartitionInfo struct { - tableScan *PhysicalTableScan - partitionInfo PartitionInfo + tableScan *PhysicalTableScan + physPlanPartInfo PhysPlanPartInfo } // MemoryUsage return the memory usage of tableScanAndPartitionInfo @@ -86,7 +86,7 @@ func (t *tableScanAndPartitionInfo) MemoryUsage() (sum int64) { return } - sum += t.partitionInfo.MemoryUsage() + sum += t.physPlanPartInfo.MemoryUsage() if t.tableScan != nil { sum += t.tableScan.MemoryUsage() } @@ -136,23 +136,23 @@ type PhysicalTableReader struct { IsCommonHandle bool // Used by partition table. - PartitionInfo PartitionInfo + PlanPartInfo PhysPlanPartInfo // Used by MPP, because MPP plan may contain join/union/union all, it is possible that a physical table reader contains more than 1 table scan - PartitionInfos []tableScanAndPartitionInfo + TableScanAndPartitionInfos []tableScanAndPartitionInfo } -// PartitionInfo indicates partition helper info in physical plan. -type PartitionInfo struct { +// PhysPlanPartInfo indicates partition helper info in physical plan. +type PhysPlanPartInfo struct { PruningConds []expression.Expression PartitionNames []model.CIStr Columns []*expression.Column ColumnNames types.NameSlice } -const emptyPartitionInfoSize = int64(unsafe.Sizeof(PartitionInfo{})) +const emptyPartitionInfoSize = int64(unsafe.Sizeof(PhysPlanPartInfo{})) -// MemoryUsage return the memory usage of PartitionInfo -func (pi *PartitionInfo) MemoryUsage() (sum int64) { +// MemoryUsage return the memory usage of PhysPlanPartInfo +func (pi *PhysPlanPartInfo) MemoryUsage() (sum int64) { if pi == nil { return } @@ -210,12 +210,12 @@ func (p *PhysicalTableReader) MemoryUsage() (sum int64) { return } - sum = p.physicalSchemaProducer.MemoryUsage() + size.SizeOfUint8*2 + size.SizeOfBool + p.PartitionInfo.MemoryUsage() + sum = p.physicalSchemaProducer.MemoryUsage() + size.SizeOfUint8*2 + size.SizeOfBool + p.PlanPartInfo.MemoryUsage() if p.tablePlan != nil { sum += p.tablePlan.MemoryUsage() } // since TablePlans is the flats of tablePlan, so we don't count it - for _, pInfo := range p.PartitionInfos { + for _, pInfo := range p.TableScanAndPartitionInfos { sum += pInfo.MemoryUsage() } return @@ -234,8 +234,8 @@ func setMppOrBatchCopForTableScan(curPlan PhysicalPlan) { // GetPhysicalTableReader returns PhysicalTableReader for logical TiKVSingleGather. func (sg *TiKVSingleGather) GetPhysicalTableReader(schema *expression.Schema, stats *property.StatsInfo, props ...*property.PhysicalProperty) *PhysicalTableReader { - reader := PhysicalTableReader{}.Init(sg.SCtx(), sg.SelectBlockOffset()) - reader.PartitionInfo = PartitionInfo{ + reader := PhysicalTableReader{}.Init(sg.SCtx(), sg.QueryBlockOffset()) + reader.PlanPartInfo = PhysPlanPartInfo{ PruningConds: sg.Source.allConds, PartitionNames: sg.Source.partitionNames, Columns: sg.Source.TblCols, @@ -249,7 +249,7 @@ func (sg *TiKVSingleGather) GetPhysicalTableReader(schema *expression.Schema, st // GetPhysicalIndexReader returns PhysicalIndexReader for logical TiKVSingleGather. func (sg *TiKVSingleGather) GetPhysicalIndexReader(schema *expression.Schema, stats *property.StatsInfo, props ...*property.PhysicalProperty) *PhysicalIndexReader { - reader := PhysicalIndexReader{}.Init(sg.SCtx(), sg.SelectBlockOffset()) + reader := PhysicalIndexReader{}.Init(sg.SCtx(), sg.QueryBlockOffset()) reader.SetStats(stats) reader.SetSchema(schema) reader.childrenReqProps = props @@ -315,7 +315,7 @@ type PhysicalIndexReader struct { OutputColumns []*expression.Column // Used by partition table. - PartitionInfo PartitionInfo + PlanPartInfo PhysPlanPartInfo } // Clone implements PhysicalPlan interface. @@ -387,7 +387,7 @@ func (p *PhysicalIndexReader) MemoryUsage() (sum int64) { return } - sum = p.physicalSchemaProducer.MemoryUsage() + p.PartitionInfo.MemoryUsage() + sum = p.physicalSchemaProducer.MemoryUsage() + p.PlanPartInfo.MemoryUsage() if p.indexPlan != nil { p.indexPlan.MemoryUsage() } @@ -444,7 +444,7 @@ type PhysicalIndexLookUpReader struct { CommonHandleCols []*expression.Column // Used by partition table. - PartitionInfo PartitionInfo + PlanPartInfo PhysPlanPartInfo // required by cost calculation expectedCnt uint64 @@ -529,7 +529,7 @@ func (p *PhysicalIndexLookUpReader) MemoryUsage() (sum int64) { return } - sum = p.physicalSchemaProducer.MemoryUsage() + size.SizeOfBool*2 + p.PartitionInfo.MemoryUsage() + size.SizeOfUint64 + sum = p.physicalSchemaProducer.MemoryUsage() + size.SizeOfBool*2 + p.PlanPartInfo.MemoryUsage() + size.SizeOfUint64 if p.indexPlan != nil { sum += p.indexPlan.MemoryUsage() @@ -576,7 +576,7 @@ type PhysicalIndexMergeReader struct { tablePlan PhysicalPlan // Used by partition table. - PartitionInfo PartitionInfo + PlanPartInfo PhysPlanPartInfo KeepOrder bool @@ -632,7 +632,7 @@ func (p *PhysicalIndexMergeReader) MemoryUsage() (sum int64) { return } - sum = p.physicalSchemaProducer.MemoryUsage() + p.PartitionInfo.MemoryUsage() + sum = p.physicalSchemaProducer.MemoryUsage() + p.PlanPartInfo.MemoryUsage() if p.tablePlan != nil { sum += p.tablePlan.MemoryUsage() } @@ -829,10 +829,10 @@ type PhysicalTableScan struct { // AccessCondition is used to calculate range. AccessCondition []expression.Expression filterCondition []expression.Expression - // lateMaterializationFilterCondition is used to record the filter conditions + // LateMaterializationFilterCondition is used to record the filter conditions // that are pushed down to table scan from selection by late materialization. // TODO: remove this field after we support pushing down selection to coprocessor. - lateMaterializationFilterCondition []expression.Expression + LateMaterializationFilterCondition []expression.Expression Table *model.TableInfo Columns []*model.ColumnInfo @@ -865,7 +865,7 @@ type PhysicalTableScan struct { isChildOfIndexLookUp bool - PartitionInfo PartitionInfo + PlanPartInfo PhysPlanPartInfo SampleInfo *TableSampleInfo @@ -937,18 +937,19 @@ func (ts *PhysicalTableScan) IsPartition() (bool, int64) { // mem usage when rebuilding ranges during the execution phase. func (ts *PhysicalTableScan) ResolveCorrelatedColumns() ([]*ranger.Range, error) { access := ts.AccessCondition + ctx := ts.SCtx() if ts.Table.IsCommonHandle { pkIdx := tables.FindPrimaryIndex(ts.Table) idxCols, idxColLens := expression.IndexInfo2PrefixCols(ts.Columns, ts.Schema().Columns, pkIdx) for _, cond := range access { - newCond, err := expression.SubstituteCorCol2Constant(cond) + newCond, err := expression.SubstituteCorCol2Constant(ctx, cond) if err != nil { return nil, err } access = append(access, newCond) } // All of access conditions must be used to build ranges, so we don't limit range memory usage. - res, err := ranger.DetachCondAndBuildRangeForIndex(ts.SCtx(), access, idxCols, idxColLens, 0) + res, err := ranger.DetachCondAndBuildRangeForIndex(ctx, access, idxCols, idxColLens, 0) if err != nil { return nil, err } @@ -957,7 +958,7 @@ func (ts *PhysicalTableScan) ResolveCorrelatedColumns() ([]*ranger.Range, error) var err error pkTP := ts.Table.GetPkColInfo().FieldType // All of access conditions must be used to build ranges, so we don't limit range memory usage. - ts.Ranges, _, _, err = ranger.BuildTableRange(access, ts.SCtx(), &pkTP, 0) + ts.Ranges, _, _, err = ranger.BuildTableRange(access, ctx, &pkTP, 0) if err != nil { return nil, err } @@ -1013,7 +1014,7 @@ func (ts *PhysicalTableScan) MemoryUsage() (sum int64) { } sum = emptyPhysicalTableScanSize + ts.physicalSchemaProducer.MemoryUsage() + ts.DBName.MemoryUsage() + - int64(cap(ts.HandleIdx))*size.SizeOfInt + ts.PartitionInfo.MemoryUsage() + int64(len(ts.rangeInfo)) + int64(cap(ts.HandleIdx))*size.SizeOfInt + ts.PlanPartInfo.MemoryUsage() + int64(len(ts.rangeInfo)) if ts.TableAsName != nil { sum += ts.TableAsName.MemoryUsage() } @@ -1422,7 +1423,7 @@ func NewPhysicalHashJoin(p *LogicalJoin, innerIdx int, useOuterToBuild bool, new NAEqualConditions: p.NAEQConditions, Concurrency: uint(p.SCtx().GetSessionVars().HashJoinConcurrency()), UseOuterToBuild: useOuterToBuild, - }.Init(p.SCtx(), newStats, p.SelectBlockOffset(), prop...) + }.Init(p.SCtx(), newStats, p.QueryBlockOffset(), prop...) return hashJoin } @@ -1976,7 +1977,7 @@ func NewPhysicalHashAgg(la *LogicalAggregation, newStats *property.StatsInfo, pr agg := basePhysicalAgg{ GroupByItems: newGbyItems, AggFuncs: newAggFuncs, - }.initForHash(la.SCtx(), newStats, la.SelectBlockOffset(), prop) + }.initForHash(la.SCtx(), newStats, la.QueryBlockOffset(), prop) return agg } diff --git a/pkg/planner/core/plan.go b/pkg/planner/core/plan.go index f99e95dc6e3ab..c599d12531d01 100644 --- a/pkg/planner/core/plan.go +++ b/pkg/planner/core/plan.go @@ -67,7 +67,11 @@ type Plan interface { // SetOutputNames sets the outputting name by the given slice. SetOutputNames(names types.NameSlice) - SelectBlockOffset() int + // QueryBlockOffset is query block offset. + // For example, in query + // `select /*+ use_index(@sel_2 t2, a) */ * from t1, (select a*2 as b from t2) tx where a>b` + // the hint should be applied on the sub-query, whose query block is 2. + QueryBlockOffset() int BuildPlanTrace() *tracing.PlanTrace } @@ -84,7 +88,9 @@ func enforceProperty(p *property.PhysicalProperty, tsk task, ctx sessionctx.Cont } tsk = mpp.enforceExchanger(p) } - if p.IsSortItemEmpty() || tsk.plan() == nil { + // when task is double cop task warping a index merge reader, tsk.plan() may be nil when indexPlanFinished is marked + // as false, while the real plan is in idxMergePartPlans. tsk.plan()==nil is not right here. + if p.IsSortItemEmpty() || tsk.invalid() { return tsk } if p.TaskTp != property.MppTaskType { @@ -94,7 +100,7 @@ func enforceProperty(p *property.PhysicalProperty, tsk task, ctx sessionctx.Cont sort := PhysicalSort{ ByItems: make([]*util.ByItems, 0, len(p.SortItems)), IsPartialSort: p.IsSortItemAllForPartition(), - }.Init(ctx, tsk.plan().StatsInfo(), tsk.plan().SelectBlockOffset(), sortReqProp) + }.Init(ctx, tsk.plan().StatsInfo(), tsk.plan().QueryBlockOffset(), sortReqProp) for _, col := range p.SortItems { sort.ByItems = append(sort.ByItems, &util.ByItems{Expr: col.Col, Desc: col.Desc}) } @@ -159,7 +165,7 @@ func optimizeByShuffle4Window(pp *PhysicalWindow, ctx sessionctx.Context) *Physi DataSources: []PhysicalPlan{dataSource}, SplitterType: PartitionHashSplitterType, ByItemArrays: [][]expression.Expression{byItems}, - }.Init(ctx, pp.StatsInfo(), pp.SelectBlockOffset(), reqProp) + }.Init(ctx, pp.StatsInfo(), pp.QueryBlockOffset(), reqProp) return shuffle } @@ -196,7 +202,7 @@ func optimizeByShuffle4StreamAgg(pp *PhysicalStreamAgg, ctx sessionctx.Context) DataSources: []PhysicalPlan{dataSource}, SplitterType: PartitionHashSplitterType, ByItemArrays: [][]expression.Expression{util.CloneExprs(pp.GroupByItems)}, - }.Init(ctx, pp.StatsInfo(), pp.SelectBlockOffset(), reqProp) + }.Init(ctx, pp.StatsInfo(), pp.QueryBlockOffset(), reqProp) return shuffle } @@ -235,7 +241,7 @@ func optimizeByShuffle4MergeJoin(pp *PhysicalMergeJoin, ctx sessionctx.Context) DataSources: dataSources, SplitterType: PartitionHashSplitterType, ByItemArrays: [][]expression.Expression{leftByItemArray, rightByItemArray}, - }.Init(ctx, pp.StatsInfo(), pp.SelectBlockOffset(), reqProp) + }.Init(ctx, pp.StatsInfo(), pp.QueryBlockOffset(), reqProp) return shuffle } @@ -734,12 +740,12 @@ func (p *logicalSchemaProducer) BuildKeyInfo(selfSchema *expression.Schema, chil } } -func newBaseLogicalPlan(ctx sessionctx.Context, tp string, self LogicalPlan, offset int) baseLogicalPlan { +func newBaseLogicalPlan(ctx sessionctx.Context, tp string, self LogicalPlan, qbOffset int) baseLogicalPlan { return baseLogicalPlan{ taskMap: make(map[string]task), taskMapBak: make([]string, 0, 10), taskMapBakTS: make([]uint64, 0, 10), - Plan: base.NewBasePlan(ctx, tp, offset), + Plan: base.NewBasePlan(ctx, tp, qbOffset), self: self, } } diff --git a/pkg/planner/core/plan_cache.go b/pkg/planner/core/plan_cache.go index a696f2eaefbae..b2a96ceb327a4 100644 --- a/pkg/planner/core/plan_cache.go +++ b/pkg/planner/core/plan_cache.go @@ -154,20 +154,23 @@ func GetPlanFromSessionPlanCache(ctx context.Context, sctx sessionctx.Context, sessVars := sctx.GetSessionVars() stmtCtx := sessVars.StmtCtx stmtAst := stmt.PreparedAst - stmtCtx.UseCache = stmt.StmtCacheable + cacheEnabled := false if isNonPrepared { stmtCtx.CacheType = stmtctx.SessionNonPrepared + cacheEnabled = sctx.GetSessionVars().EnableNonPreparedPlanCache // plan-cache might be disabled after prepare. } else { stmtCtx.CacheType = stmtctx.SessionPrepared + cacheEnabled = sctx.GetSessionVars().EnablePreparedPlanCache } - if !stmt.StmtCacheable { - stmtCtx.SetSkipPlanCache(errors.New(stmt.UncacheableReason)) + stmtCtx.UseCache = stmt.StmtCacheable && cacheEnabled + if stmt.UncacheableReason != "" { + stmtCtx.ForceSetSkipPlanCache(errors.New(stmt.UncacheableReason)) } var bindSQL string if stmtCtx.UseCache { var ignoreByBinding bool - bindSQL, ignoreByBinding = GetBindSQL4PlanCache(sctx, stmt) + bindSQL, ignoreByBinding = bindinfo.MatchSQLBindingForPlanCache(sctx, stmt.PreparedAst.Stmt, &stmt.BindingInfo) if ignoreByBinding { stmtCtx.SetSkipPlanCache(errors.Errorf("ignore plan cache by binding")) } @@ -355,7 +358,7 @@ func RebuildPlan4CachedPlan(p Plan) (ok bool) { sc.InPreparedPlanBuilding = true defer func() { sc.InPreparedPlanBuilding = false }() if err := rebuildRange(p); err != nil { - sc.AppendWarning(errors.Errorf("skip plan-cache: plan rebuild failed, %s", err.Error())) + sc.AppendWarning(errors.NewNoStackErrorf("skip plan-cache: plan rebuild failed, %s", err.Error())) return false // fail to rebuild ranges } if !sc.UseCache { @@ -485,7 +488,7 @@ func rebuildRange(p Plan) error { } // The code should never run here as long as we're not using point get for partition table. // And if we change the logic one day, here work as defensive programming to cache the error. - if x.PartitionInfo != nil { + if x.PartitionDef != nil { // TODO: relocate the partition after rebuilding range to make PlanCache support PointGet return errors.New("point get for partition table can not use plan cache") } @@ -786,40 +789,6 @@ func tryCachePointPlan(_ context.Context, sctx sessionctx.Context, return err } -// GetBindSQL4PlanCache used to get the bindSQL for plan cache to build the plan cache key. -func GetBindSQL4PlanCache(sctx sessionctx.Context, stmt *PlanCacheStmt) (string, bool) { - useBinding := sctx.GetSessionVars().UsePlanBaselines - ignore := false - if !useBinding || stmt.PreparedAst.Stmt == nil || stmt.NormalizedSQL4PC == "" || stmt.SQLDigest4PC == "" { - return "", ignore - } - if sctx.Value(bindinfo.SessionBindInfoKeyType) == nil { - return "", ignore - } - sessionHandle := sctx.Value(bindinfo.SessionBindInfoKeyType).(*bindinfo.SessionHandle) - bindRecord := sessionHandle.GetBindRecord(stmt.SQLDigest4PC, stmt.NormalizedSQL4PC, "") - if bindRecord != nil { - enabledBinding := bindRecord.FindEnabledBinding() - if enabledBinding != nil { - ignore = enabledBinding.Hint.ContainTableHint(HintIgnorePlanCache) - return enabledBinding.BindSQL, ignore - } - } - globalHandle := domain.GetDomain(sctx).BindHandle() - if globalHandle == nil { - return "", ignore - } - bindRecord = globalHandle.GetBindRecord(stmt.SQLDigest4PC, stmt.NormalizedSQL4PC, "") - if bindRecord != nil { - enabledBinding := bindRecord.FindEnabledBinding() - if enabledBinding != nil { - ignore = enabledBinding.Hint.ContainTableHint(HintIgnorePlanCache) - return enabledBinding.BindSQL, ignore - } - } - return "", ignore -} - // IsPointGetPlanShortPathOK check if we can execute using plan cached in prepared structure // Be careful with the short path, current precondition is ths cached plan satisfying // IsPointGetWithPKOrUniqueKeyByAutoCommit diff --git a/pkg/planner/core/plan_cache_test.go b/pkg/planner/core/plan_cache_test.go index a8be4a0413b04..df63e2d25fe31 100644 --- a/pkg/planner/core/plan_cache_test.go +++ b/pkg/planner/core/plan_cache_test.go @@ -293,6 +293,17 @@ func TestInvalidRange(t *testing.T) { tk.MustQuery("select @@last_plan_from_cache").Check(testkit.Rows("0")) } +func TestIssue49344(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec(`create table t(a int)`) + tk.MustExec(`set @@tidb_enable_prepared_plan_cache=1`) + tk.MustExec(`prepare s from "select * from t"`) + tk.MustExec(`set @@tidb_enable_prepared_plan_cache=0`) + tk.MustExec(`execute s`) // no error +} + func TestIssue40093(t *testing.T) { store := testkit.CreateMockStore(t) tk := testkit.NewTestKit(t, store) @@ -355,6 +366,44 @@ func TestIssue38205(t *testing.T) { tk.MustQuery("select @@last_plan_from_cache").Check(testkit.Rows("0")) } +func TestIssue49736(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("create table t (a int, key(a))") + tk.MustExec(`prepare st from 'select * from t limit ?'`) + tk.MustExec(`set @a=100000`) + tk.MustExec(`execute st using @a`) + tk.MustQuery(`show warnings`).Check(testkit.Rows(`Warning 1105 skip prepared plan-cache: limit count is too large`)) + tk.MustExec(`execute st using @a`) + tk.MustQuery(`select @@last_plan_from_cache`).Check(testkit.Rows("0")) + + tk.MustExec(`set @@tidb_opt_fix_control = "49736:ON"`) + tk.MustExec(`execute st using @a`) + tk.MustQuery(`show warnings`).Check(testkit.Rows(`Warning 1105 force plan-cache: may use risky cached plan: limit count is too large`)) + tk.MustExec(`execute st using @a`) + tk.MustQuery(`select @@last_plan_from_cache`).Check(testkit.Rows("1")) +} + +func TestIssue49736Partition(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("create table t (a int) partition by hash(a) partitions 4") + tk.MustExec(`analyze table t`) + tk.MustExec(`prepare st from 'select * from t where a=?'`) + tk.MustQuery(`show warnings`).Check(testkit.Rows("Warning 1105 skip prepared plan-cache: query accesses partitioned tables is un-cacheable")) + + tk.MustExec(`set @@tidb_opt_fix_control = "49736:ON"`) + tk.MustExec(`prepare st from 'select * from t where a=?'`) + tk.MustQuery(`show warnings`).Check(testkit.Rows("Warning 1105 force plan-cache: may use risky cached plan: query accesses partitioned tables is un-cacheable")) + tk.MustExec(`set @a=1`) + tk.MustExec(`execute st using @a`) + tk.MustQuery(`show warnings`).Check(testkit.Rows()) + tk.MustExec(`execute st using @a`) + tk.MustQuery(`select @@last_plan_from_cache`).Check(testkit.Rows("1")) +} + func TestIssue40224(t *testing.T) { store := testkit.CreateMockStore(t) tk := testkit.NewTestKit(t, store) @@ -1165,6 +1214,38 @@ func TestIssue47133(t *testing.T) { require.Equal(t, cnt, 2) } +func TestPlanCacheBindingIgnore(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec(`use test`) + tk.MustExec(`create database test1`) + tk.MustExec(`use test1`) + tk.MustExec(`create table t (a int)`) + tk.MustExec(`create database test2`) + tk.MustExec(`use test2`) + tk.MustExec(`create table t (a int)`) + + tk.MustExec(`prepare st1 from 'select * from test1.t'`) + tk.MustExec(`execute st1`) + tk.MustExec(`execute st1`) + tk.MustQuery(`select @@last_plan_from_cache`).Check(testkit.Rows("1")) + tk.MustExec(`prepare st2 from 'select * from test2.t'`) + tk.MustExec(`execute st2`) + tk.MustExec(`execute st2`) + tk.MustQuery(`select @@last_plan_from_cache`).Check(testkit.Rows("1")) + + tk.MustExec(`create global binding using select /*+ ignore_plan_cache() */ * from test1.t`) + tk.MustExec(`execute st1`) + tk.MustQuery(`select @@last_plan_from_cache`).Check(testkit.Rows("0")) + tk.MustExec(`execute st1`) + tk.MustQuery(`select @@last_plan_from_cache`).Check(testkit.Rows("0")) + tk.MustExec(`create global binding using select /*+ ignore_plan_cache() */ * from test2.t`) + tk.MustExec(`execute st2`) + tk.MustQuery(`select @@last_plan_from_cache`).Check(testkit.Rows("0")) + tk.MustExec(`execute st2`) + tk.MustQuery(`select @@last_plan_from_cache`).Check(testkit.Rows("0")) +} + func TestBuiltinFuncFlen(t *testing.T) { // same as TestIssue45378 and TestIssue45253 store := testkit.CreateMockStore(t) @@ -1192,6 +1273,36 @@ func TestBuiltinFuncFlen(t *testing.T) { } } +func TestWarningWithDisablePlanCacheStmt(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("create table t (a int) partition by hash(a) partitions 4;") + tk.MustExec("analyze table t;") + tk.MustExec("prepare st from 'select * from t';") + tk.MustQuery(`show warnings`).Check(testkit.Rows("Warning 1105 skip prepared plan-cache: query accesses partitioned tables is un-cacheable")) + tk.MustExec("execute st;") + tk.MustQuery(`show warnings`).Check(testkit.Rows("Warning 1105 skip prepared plan-cache: query accesses partitioned tables is un-cacheable")) + tk.MustExec("execute st;") + tk.MustQuery(`show warnings`).Check(testkit.Rows("Warning 1105 skip prepared plan-cache: query accesses partitioned tables is un-cacheable")) + tk.MustQuery("select @@last_plan_from_cache").Check(testkit.Rows("0")) +} + +func BenchmarkPlanCacheBindingMatch(b *testing.B) { + store := testkit.CreateMockStore(b) + tk := testkit.NewTestKit(b, store) + tk.MustExec("use test") + tk.MustExec("create table t (a int, key(a))") + tk.MustExec(`create global binding using select * from t where a=1`) + + tk.MustExec(`prepare st from 'select * from t where a=?'`) + tk.MustExec(`set @a=1`) + b.ResetTimer() + for i := 0; i < b.N; i++ { + tk.MustExec("execute st using @a") + } +} + func BenchmarkPlanCacheInsert(b *testing.B) { store := testkit.CreateMockStore(b) tk := testkit.NewTestKit(b, store) diff --git a/pkg/planner/core/plan_cache_utils.go b/pkg/planner/core/plan_cache_utils.go index b3c5bbcded942..f180833eeae5b 100644 --- a/pkg/planner/core/plan_cache_utils.go +++ b/pkg/planner/core/plan_cache_utils.go @@ -24,6 +24,7 @@ import ( "unsafe" "github.com/pingcap/errors" + "github.com/pingcap/tidb/pkg/bindinfo" "github.com/pingcap/tidb/pkg/expression" "github.com/pingcap/tidb/pkg/infoschema" "github.com/pingcap/tidb/pkg/kv" @@ -56,9 +57,6 @@ const ( var ( // PreparedPlanCacheMaxMemory stores the max memory size defined in the global config "performance-server-memory-quota". PreparedPlanCacheMaxMemory = *atomic2.NewUint64(math.MaxUint64) - - // ExtractSelectAndNormalizeDigest extract the select statement and normalize it. - ExtractSelectAndNormalizeDigest func(stmtNode ast.StmtNode, specifiledDB string, forBinding bool) (ast.StmtNode, string, string, error) ) type paramMarkerExtractor struct { @@ -90,9 +88,13 @@ func GeneratePlanCacheStmtWithAST(ctx context.Context, sctx sessionctx.Context, return nil, nil, 0, ErrPrepareDDL } - switch paramStmt.(type) { + switch stmt := paramStmt.(type) { case *ast.ImportIntoStmt, *ast.LoadDataStmt, *ast.PrepareStmt, *ast.ExecuteStmt, *ast.DeallocateStmt, *ast.NonTransactionalDMLStmt: return nil, nil, 0, ErrUnsupportedPs + case *ast.SelectStmt: + if stmt.SelectIntoOpt != nil { + return nil, nil, 0, ErrUnsupportedPs + } } // Prepare parameters should NOT over 2 bytes(MaxUint16) @@ -127,10 +129,8 @@ func GeneratePlanCacheStmtWithAST(ctx context.Context, sctx sessionctx.Context, normalizedSQL, digest := parser.NormalizeDigest(prepared.Stmt.Text()) var ( - normalizedSQL4PC, digest4PC string - selectStmtNode ast.StmtNode - cacheable bool - reason string + cacheable bool + reason string ) if (isPrepStmt && !vars.EnablePreparedPlanCache) || // prepared statement (!isPrepStmt && !vars.EnableNonPreparedPlanCache) { // non-prepared statement @@ -142,13 +142,15 @@ func GeneratePlanCacheStmtWithAST(ctx context.Context, sctx sessionctx.Context, } else { cacheable = true // it is already checked here } - if !cacheable { - sctx.GetSessionVars().StmtCtx.AppendWarning(errors.Errorf("skip prepared plan-cache: " + reason)) + + if !cacheable && fixcontrol.GetBoolWithDefault(vars.OptimizerFixControl, fixcontrol.Fix49736, false) { + sctx.GetSessionVars().StmtCtx.AppendWarning(errors.NewNoStackErrorf("force plan-cache: may use risky cached plan: %s", reason)) + cacheable = true + reason = "" } - selectStmtNode, normalizedSQL4PC, digest4PC, err = ExtractSelectAndNormalizeDigest(paramStmt, vars.CurrentDB, false) - if err != nil || selectStmtNode == nil { - normalizedSQL4PC = "" - digest4PC = "" + + if !cacheable { + sctx.GetSessionVars().StmtCtx.AppendWarning(errors.NewNoStackErrorf("skip prepared plan-cache: " + reason)) } } @@ -164,7 +166,7 @@ func GeneratePlanCacheStmtWithAST(ctx context.Context, sctx sessionctx.Context, } var p Plan - destBuilder, _ := NewPlanBuilder().Init(sctx, ret.InfoSchema, &hint.BlockHintProcessor{}) + destBuilder, _ := NewPlanBuilder().Init(sctx, ret.InfoSchema, hint.NewQBHintHandler(nil)) p, err = destBuilder.Build(ctx, paramStmt) if err != nil { return nil, nil, 0, err @@ -182,8 +184,6 @@ func GeneratePlanCacheStmtWithAST(ctx context.Context, sctx sessionctx.Context, SQLDigest: digest, ForUpdateRead: destBuilder.GetIsForUpdateRead(), SnapshotTSEvaluator: ret.SnapshotTSEvaluator, - NormalizedSQL4PC: normalizedSQL4PC, - SQLDigest4PC: digest4PC, StmtCacheable: cacheable, UncacheableReason: reason, QueryFeatures: features, @@ -455,8 +455,8 @@ type PlanCacheStmt struct { PlanDigest *parser.Digest ForUpdateRead bool SnapshotTSEvaluator func(sessionctx.Context) (uint64, error) - NormalizedSQL4PC string - SQLDigest4PC string + + BindingInfo bindinfo.BindingMatchInfo // the different between NormalizedSQL, NormalizedSQL4PC and StmtText: // for the query `select * from t where a>1 and b 0 { return p.toPBV2(ctx, storeType) } - sc := ctx.GetSessionVars().StmtCtx client := ctx.GetClient() - groupingSetsPB, err := p.GroupingSets.ToPB(sc, client) + groupingSetsPB, err := p.GroupingSets.ToPB(ctx, client) if err != nil { return nil, err } @@ -60,11 +59,10 @@ func (p *PhysicalExpand) ToPB(ctx sessionctx.Context, storeType kv.StoreType) (* } func (p *PhysicalExpand) toPBV2(ctx sessionctx.Context, storeType kv.StoreType) (*tipb.Executor, error) { - sc := ctx.GetSessionVars().StmtCtx client := ctx.GetClient() projExprsPB := make([]*tipb.ExprSlice, 0, len(p.LevelExprs)) for _, exprs := range p.LevelExprs { - expressionsPB, err := expression.ExpressionsToPBList(sc, exprs, client) + expressionsPB, err := expression.ExpressionsToPBList(ctx, exprs, client) if err != nil { return nil, err } @@ -88,9 +86,8 @@ func (p *PhysicalExpand) toPBV2(ctx sessionctx.Context, storeType kv.StoreType) // ToPB implements PhysicalPlan ToPB interface. func (p *PhysicalHashAgg) ToPB(ctx sessionctx.Context, storeType kv.StoreType) (*tipb.Executor, error) { - sc := ctx.GetSessionVars().StmtCtx client := ctx.GetClient() - groupByExprs, err := expression.ExpressionsToPBList(sc, p.GroupByItems, client) + groupByExprs, err := expression.ExpressionsToPBList(ctx, p.GroupByItems, client) if err != nil { return nil, err } @@ -124,9 +121,8 @@ func (p *PhysicalHashAgg) ToPB(ctx sessionctx.Context, storeType kv.StoreType) ( // ToPB implements PhysicalPlan ToPB interface. func (p *PhysicalStreamAgg) ToPB(ctx sessionctx.Context, storeType kv.StoreType) (*tipb.Executor, error) { - sc := ctx.GetSessionVars().StmtCtx client := ctx.GetClient() - groupByExprs, err := expression.ExpressionsToPBList(sc, p.GroupByItems, client) + groupByExprs, err := expression.ExpressionsToPBList(ctx, p.GroupByItems, client) if err != nil { return nil, err } @@ -154,9 +150,8 @@ func (p *PhysicalStreamAgg) ToPB(ctx sessionctx.Context, storeType kv.StoreType) // ToPB implements PhysicalPlan ToPB interface. func (p *PhysicalSelection) ToPB(ctx sessionctx.Context, storeType kv.StoreType) (*tipb.Executor, error) { - sc := ctx.GetSessionVars().StmtCtx client := ctx.GetClient() - conditions, err := expression.ExpressionsToPBList(sc, p.Conditions, client) + conditions, err := expression.ExpressionsToPBList(ctx, p.Conditions, client) if err != nil { return nil, err } @@ -177,9 +172,8 @@ func (p *PhysicalSelection) ToPB(ctx sessionctx.Context, storeType kv.StoreType) // ToPB implements PhysicalPlan ToPB interface. func (p *PhysicalProjection) ToPB(ctx sessionctx.Context, storeType kv.StoreType) (*tipb.Executor, error) { - sc := ctx.GetSessionVars().StmtCtx client := ctx.GetClient() - exprs, err := expression.ExpressionsToPBList(sc, p.Exprs, client) + exprs, err := expression.ExpressionsToPBList(ctx, p.Exprs, client) if err != nil { return nil, err } @@ -200,16 +194,15 @@ func (p *PhysicalProjection) ToPB(ctx sessionctx.Context, storeType kv.StoreType // ToPB implements PhysicalPlan ToPB interface. func (p *PhysicalTopN) ToPB(ctx sessionctx.Context, storeType kv.StoreType) (*tipb.Executor, error) { - sc := ctx.GetSessionVars().StmtCtx client := ctx.GetClient() topNExec := &tipb.TopN{ Limit: p.Count, } for _, item := range p.ByItems { - topNExec.OrderBy = append(topNExec.OrderBy, expression.SortByItemToPB(sc, client, item.Expr, item.Desc)) + topNExec.OrderBy = append(topNExec.OrderBy, expression.SortByItemToPB(ctx, client, item.Expr, item.Desc)) } for _, item := range p.PartitionBy { - topNExec.PartitionBy = append(topNExec.PartitionBy, expression.SortByItemToPB(sc, client, item.Col.Clone(), item.Desc)) + topNExec.PartitionBy = append(topNExec.PartitionBy, expression.SortByItemToPB(ctx, client, item.Col.Clone(), item.Desc)) } executorID := "" if storeType == kv.TiFlash { @@ -225,14 +218,13 @@ func (p *PhysicalTopN) ToPB(ctx sessionctx.Context, storeType kv.StoreType) (*ti // ToPB implements PhysicalPlan ToPB interface. func (p *PhysicalLimit) ToPB(ctx sessionctx.Context, storeType kv.StoreType) (*tipb.Executor, error) { - sc := ctx.GetSessionVars().StmtCtx client := ctx.GetClient() limitExec := &tipb.Limit{ Limit: p.Count, } executorID := "" for _, item := range p.PartitionBy { - limitExec.PartitionBy = append(limitExec.PartitionBy, expression.SortByItemToPB(sc, client, item.Col.Clone(), item.Desc)) + limitExec.PartitionBy = append(limitExec.PartitionBy, expression.SortByItemToPB(ctx, client, item.Col.Clone(), item.Desc)) } if storeType == kv.TiFlash { var err error @@ -256,10 +248,9 @@ func (p *PhysicalTableScan) ToPB(ctx sessionctx.Context, storeType kv.StoreType) tsExec.KeepOrder = &keepOrder tsExec.IsFastScan = &(ctx.GetSessionVars().TiFlashFastScan) - if len(p.lateMaterializationFilterCondition) > 0 { - sc := ctx.GetSessionVars().StmtCtx + if len(p.LateMaterializationFilterCondition) > 0 { client := ctx.GetClient() - conditions, err := expression.ExpressionsToPBList(sc, p.lateMaterializationFilterCondition, client) + conditions, err := expression.ExpressionsToPBList(ctx, p.LateMaterializationFilterCondition, client) if err != nil { return nil, err } @@ -267,7 +258,7 @@ func (p *PhysicalTableScan) ToPB(ctx sessionctx.Context, storeType kv.StoreType) } var err error - tsExec.RuntimeFilterList, err = RuntimeFilterListToPB(p.runtimeFilterList, ctx.GetSessionVars().StmtCtx, ctx.GetClient()) + tsExec.RuntimeFilterList, err = RuntimeFilterListToPB(ctx, p.runtimeFilterList, ctx.GetClient()) if err != nil { return nil, errors.Trace(err) } @@ -296,10 +287,9 @@ func (p *PhysicalTableScan) partitionTableScanToPBForFlash(ctx sessionctx.Contex telemetry.CurrentTiflashTableScanWithFastScanCount.Inc() } - if len(p.lateMaterializationFilterCondition) > 0 { - sc := ctx.GetSessionVars().StmtCtx + if len(p.LateMaterializationFilterCondition) > 0 { client := ctx.GetClient() - conditions, err := expression.ExpressionsToPBList(sc, p.lateMaterializationFilterCondition, client) + conditions, err := expression.ExpressionsToPBList(ctx, p.LateMaterializationFilterCondition, client) if err != nil { return nil, err } @@ -308,7 +298,7 @@ func (p *PhysicalTableScan) partitionTableScanToPBForFlash(ctx sessionctx.Contex // set runtime filter var err error - ptsExec.RuntimeFilterList, err = RuntimeFilterListToPB(p.runtimeFilterList, ctx.GetSessionVars().StmtCtx, ctx.GetClient()) + ptsExec.RuntimeFilterList, err = RuntimeFilterListToPB(ctx, p.runtimeFilterList, ctx.GetClient()) if err != nil { return nil, errors.Trace(err) } @@ -408,7 +398,7 @@ func (e *PhysicalExchangeSender) ToPB(ctx sessionctx.Context, storeType kv.Store } allFieldTypes = append(allFieldTypes, pbType) } - hashColPb, err := expression.ExpressionsToPBList(ctx.GetSessionVars().StmtCtx, hashCols, ctx.GetClient()) + hashColPb, err := expression.ExpressionsToPBList(ctx, hashCols, ctx.GetClient()) if err != nil { return nil, errors.Trace(err) } @@ -507,7 +497,6 @@ func (p *PhysicalIndexScan) ToPB(_ sessionctx.Context, _ kv.StoreType) (*tipb.Ex // ToPB implements PhysicalPlan ToPB interface. func (p *PhysicalHashJoin) ToPB(ctx sessionctx.Context, storeType kv.StoreType) (*tipb.Executor, error) { - sc := ctx.GetSessionVars().StmtCtx client := ctx.GetClient() if len(p.LeftJoinKeys) > 0 && len(p.LeftNAJoinKeys) > 0 { @@ -542,20 +531,20 @@ func (p *PhysicalHashJoin) ToPB(ctx sessionctx.Context, storeType kv.StoreType) return nil, errors.Trace(err) } - left, err := expression.ExpressionsToPBList(sc, leftKeys, client) + left, err := expression.ExpressionsToPBList(ctx, leftKeys, client) if err != nil { return nil, err } - right, err := expression.ExpressionsToPBList(sc, rightKeys, client) + right, err := expression.ExpressionsToPBList(ctx, rightKeys, client) if err != nil { return nil, err } - leftConditions, err := expression.ExpressionsToPBList(sc, p.LeftConditions, client) + leftConditions, err := expression.ExpressionsToPBList(ctx, p.LeftConditions, client) if err != nil { return nil, err } - rightConditions, err := expression.ExpressionsToPBList(sc, p.RightConditions, client) + rightConditions, err := expression.ExpressionsToPBList(ctx, p.RightConditions, client) if err != nil { return nil, err } @@ -575,11 +564,11 @@ func (p *PhysicalHashJoin) ToPB(ctx sessionctx.Context, storeType kv.StoreType) } else { otherConditionsInJoin = p.OtherConditions } - otherConditions, err := expression.ExpressionsToPBList(sc, otherConditionsInJoin, client) + otherConditions, err := expression.ExpressionsToPBList(ctx, otherConditionsInJoin, client) if err != nil { return nil, err } - otherEqConditions, err := expression.ExpressionsToPBList(sc, otherEqConditionsFromIn, client) + otherEqConditions, err := expression.ExpressionsToPBList(ctx, otherEqConditionsFromIn, client) if err != nil { return nil, err } @@ -622,7 +611,7 @@ func (p *PhysicalHashJoin) ToPB(ctx sessionctx.Context, storeType kv.StoreType) } // runtime filter - rfListPB, err := RuntimeFilterListToPB(p.runtimeFilterList, sc, client) + rfListPB, err := RuntimeFilterListToPB(ctx, p.runtimeFilterList, client) if err != nil { return nil, errors.Trace(err) } @@ -663,7 +652,7 @@ func (fb *FrameBound) ToPB(ctx sessionctx.Context) (*tipb.WindowFrameBound, erro pbBound.Offset = &offset if fb.IsExplicitRange { - rangeFrame, err := expression.ExpressionsToPBList(ctx.GetSessionVars().StmtCtx, fb.CalcFuncs, ctx.GetClient()) + rangeFrame, err := expression.ExpressionsToPBList(ctx, fb.CalcFuncs, ctx.GetClient()) if err != nil { return nil, err } @@ -677,7 +666,6 @@ func (fb *FrameBound) ToPB(ctx sessionctx.Context) (*tipb.WindowFrameBound, erro // ToPB implements PhysicalPlan ToPB interface. func (p *PhysicalWindow) ToPB(ctx sessionctx.Context, storeType kv.StoreType) (*tipb.Executor, error) { - sc := ctx.GetSessionVars().StmtCtx client := ctx.GetClient() windowExec := &tipb.Window{} @@ -687,10 +675,10 @@ func (p *PhysicalWindow) ToPB(ctx sessionctx.Context, storeType kv.StoreType) (* windowExec.FuncDesc = append(windowExec.FuncDesc, aggregation.WindowFuncToPBExpr(ctx, client, desc)) } for _, item := range p.PartitionBy { - windowExec.PartitionBy = append(windowExec.PartitionBy, expression.SortByItemToPB(sc, client, item.Col.Clone(), item.Desc)) + windowExec.PartitionBy = append(windowExec.PartitionBy, expression.SortByItemToPB(ctx, client, item.Col.Clone(), item.Desc)) } for _, item := range p.OrderBy { - windowExec.OrderBy = append(windowExec.OrderBy, expression.SortByItemToPB(sc, client, item.Col.Clone(), item.Desc)) + windowExec.OrderBy = append(windowExec.OrderBy, expression.SortByItemToPB(ctx, client, item.Col.Clone(), item.Desc)) } if p.Frame != nil { @@ -734,12 +722,11 @@ func (p *PhysicalSort) ToPB(ctx sessionctx.Context, storeType kv.StoreType) (*ti return nil, errors.Errorf("sort %s can't convert to pb, because it isn't a partial sort", p.Plan.ExplainID()) } - sc := ctx.GetSessionVars().StmtCtx client := ctx.GetClient() sortExec := &tipb.Sort{} for _, item := range p.ByItems { - sortExec.ByItems = append(sortExec.ByItems, expression.SortByItemToPB(sc, client, item.Expr, item.Desc)) + sortExec.ByItems = append(sortExec.ByItems, expression.SortByItemToPB(ctx, client, item.Expr, item.Desc)) } isPartialSort := p.IsPartialSort sortExec.IsPartialSort = &isPartialSort diff --git a/pkg/planner/core/planbuilder.go b/pkg/planner/core/planbuilder.go index fac40b8c855e6..8355c31b9372a 100644 --- a/pkg/planner/core/planbuilder.go +++ b/pkg/planner/core/planbuilder.go @@ -15,7 +15,6 @@ package core import ( - "bytes" "context" "encoding/binary" "fmt" @@ -28,6 +27,7 @@ import ( "github.com/pingcap/errors" "github.com/pingcap/tidb/br/pkg/storage" "github.com/pingcap/tidb/pkg/bindinfo" + "github.com/pingcap/tidb/pkg/bindinfo/norm" "github.com/pingcap/tidb/pkg/config" "github.com/pingcap/tidb/pkg/domain" "github.com/pingcap/tidb/pkg/expression" @@ -82,93 +82,6 @@ type visitInfo struct { dynamicWithGrant bool } -type indexNestedLoopJoinTables struct { - inljTables []hintTableInfo - inlhjTables []hintTableInfo - inlmjTables []hintTableInfo -} - -type tableHintInfo struct { - indexNestedLoopJoinTables - noIndexJoinTables indexNestedLoopJoinTables - sortMergeJoinTables []hintTableInfo - broadcastJoinTables []hintTableInfo - shuffleJoinTables []hintTableInfo - hashJoinTables []hintTableInfo - noHashJoinTables []hintTableInfo - noMergeJoinTables []hintTableInfo - indexHintList []indexHintInfo - tiflashTables []hintTableInfo - tikvTables []hintTableInfo - aggHints aggHintInfo - indexMergeHintList []indexHintInfo - timeRangeHint ast.HintTimeRange - limitHints limitHintInfo - MergeHints MergeHintInfo - leadingJoinOrder []hintTableInfo - hjBuildTables []hintTableInfo - hjProbeTables []hintTableInfo -} - -type limitHintInfo struct { - preferLimitToCop bool -} - -// MergeHintInfo ...one bool flag for cte -type MergeHintInfo struct { - preferMerge bool -} - -type hintTableInfo struct { - dbName model.CIStr - tblName model.CIStr - partitions []model.CIStr - selectOffset int - matched bool -} - -type indexHintInfo struct { - dbName model.CIStr - tblName model.CIStr - partitions []model.CIStr - indexHint *ast.IndexHint - // Matched indicates whether this index hint - // has been successfully applied to a DataSource. - // If an indexHintInfo is not matched after building - // a Select statement, we will generate a warning for it. - matched bool -} - -func (hint *indexHintInfo) hintTypeString() string { - switch hint.indexHint.HintType { - case ast.HintUse: - return "use_index" - case ast.HintIgnore: - return "ignore_index" - case ast.HintForce: - return "force_index" - } - return "" -} - -// indexString formats the indexHint as dbName.tableName[, indexNames]. -func (hint *indexHintInfo) indexString() string { - var indexListString string - indexList := make([]string, len(hint.indexHint.IndexNames)) - for i := range hint.indexHint.IndexNames { - indexList[i] = hint.indexHint.IndexNames[i].L - } - if len(indexList) > 0 { - indexListString = fmt.Sprintf(", %s", strings.Join(indexList, ", ")) - } - return fmt.Sprintf("%s.%s%s", hint.dbName, hint.tblName, indexListString) -} - -type aggHintInfo struct { - preferAggType uint - preferAggToCop bool -} - // QueryTimeRange represents a time range specified by TIME_RANGE hint type QueryTimeRange struct { From time.Time @@ -191,232 +104,6 @@ func (tr *QueryTimeRange) MemoryUsage() (sum int64) { return emptyQueryTimeRangeSize } -func tableNames2HintTableInfo(ctx sessionctx.Context, hintName string, hintTables []ast.HintTable, p *hint.BlockHintProcessor, currentOffset int) []hintTableInfo { - if len(hintTables) == 0 { - return nil - } - hintTableInfos := make([]hintTableInfo, 0, len(hintTables)) - defaultDBName := model.NewCIStr(ctx.GetSessionVars().CurrentDB) - isInapplicable := false - for _, hintTable := range hintTables { - tableInfo := hintTableInfo{ - dbName: hintTable.DBName, - tblName: hintTable.TableName, - partitions: hintTable.PartitionList, - selectOffset: p.GetHintOffset(hintTable.QBName, currentOffset), - } - if tableInfo.dbName.L == "" { - tableInfo.dbName = defaultDBName - } - switch hintName { - case TiDBMergeJoin, HintSMJ, TiDBIndexNestedLoopJoin, HintINLJ, HintINLHJ, HintINLMJ, TiDBHashJoin, HintHJ, HintLeading: - if len(tableInfo.partitions) > 0 { - isInapplicable = true - } - } - hintTableInfos = append(hintTableInfos, tableInfo) - } - if isInapplicable { - ctx.GetSessionVars().StmtCtx.AppendWarning( - fmt.Errorf("Optimizer Hint %s is inapplicable on specified partitions", - restore2JoinHint(hintName, hintTableInfos))) - return nil - } - return hintTableInfos -} - -func (info *tableHintInfo) ifPreferMergeJoin(tableNames ...*hintTableInfo) bool { - return info.matchTableName(tableNames, info.sortMergeJoinTables) -} - -func (info *tableHintInfo) ifPreferBroadcastJoin(tableNames ...*hintTableInfo) bool { - return info.matchTableName(tableNames, info.broadcastJoinTables) -} - -func (info *tableHintInfo) ifPreferShuffleJoin(tableNames ...*hintTableInfo) bool { - return info.matchTableName(tableNames, info.shuffleJoinTables) -} - -func (info *tableHintInfo) ifPreferHashJoin(tableNames ...*hintTableInfo) bool { - return info.matchTableName(tableNames, info.hashJoinTables) -} - -func (info *tableHintInfo) ifPreferNoHashJoin(tableNames ...*hintTableInfo) bool { - return info.matchTableName(tableNames, info.noHashJoinTables) -} - -func (info *tableHintInfo) ifPreferNoMergeJoin(tableNames ...*hintTableInfo) bool { - return info.matchTableName(tableNames, info.noMergeJoinTables) -} - -func (info *tableHintInfo) ifPreferHJBuild(tableNames ...*hintTableInfo) bool { - return info.matchTableName(tableNames, info.hjBuildTables) -} - -func (info *tableHintInfo) ifPreferHJProbe(tableNames ...*hintTableInfo) bool { - return info.matchTableName(tableNames, info.hjProbeTables) -} - -func (info *tableHintInfo) ifPreferINLJ(tableNames ...*hintTableInfo) bool { - return info.matchTableName(tableNames, info.indexNestedLoopJoinTables.inljTables) -} - -func (info *tableHintInfo) ifPreferINLHJ(tableNames ...*hintTableInfo) bool { - return info.matchTableName(tableNames, info.indexNestedLoopJoinTables.inlhjTables) -} - -func (info *tableHintInfo) ifPreferINLMJ(tableNames ...*hintTableInfo) bool { - return info.matchTableName(tableNames, info.indexNestedLoopJoinTables.inlmjTables) -} - -func (info *tableHintInfo) ifPreferNoIndexJoin(tableNames ...*hintTableInfo) bool { - return info.matchTableName(tableNames, info.noIndexJoinTables.inljTables) -} - -func (info *tableHintInfo) ifPreferNoIndexHashJoin(tableNames ...*hintTableInfo) bool { - return info.matchTableName(tableNames, info.noIndexJoinTables.inlhjTables) -} - -func (info *tableHintInfo) ifPreferNoIndexMergeJoin(tableNames ...*hintTableInfo) bool { - return info.matchTableName(tableNames, info.noIndexJoinTables.inlmjTables) -} - -func (info *tableHintInfo) ifPreferTiFlash(tableName *hintTableInfo) *hintTableInfo { - if tableName == nil { - return nil - } - for i, tbl := range info.tiflashTables { - if tableName.dbName.L == tbl.dbName.L && tableName.tblName.L == tbl.tblName.L && tbl.selectOffset == tableName.selectOffset { - info.tiflashTables[i].matched = true - return &tbl - } - } - return nil -} - -func (info *tableHintInfo) ifPreferTiKV(tableName *hintTableInfo) *hintTableInfo { - if tableName == nil { - return nil - } - for i, tbl := range info.tikvTables { - if tableName.dbName.L == tbl.dbName.L && tableName.tblName.L == tbl.tblName.L && tbl.selectOffset == tableName.selectOffset { - info.tikvTables[i].matched = true - return &tbl - } - } - return nil -} - -// matchTableName checks whether the hint hit the need. -// Only need either side matches one on the list. -// Even though you can put 2 tables on the list, -// it doesn't mean optimizer will reorder to make them -// join directly. -// Which it joins on with depend on sequence of traverse -// and without reorder, user might adjust themselves. -// This is similar to MySQL hints. -func (*tableHintInfo) matchTableName(tables []*hintTableInfo, hintTables []hintTableInfo) bool { - hintMatched := false - for _, table := range tables { - for i, curEntry := range hintTables { - if table == nil { - continue - } - if curEntry.dbName.L == table.dbName.L && curEntry.tblName.L == table.tblName.L && table.selectOffset == curEntry.selectOffset { - hintTables[i].matched = true - hintMatched = true - break - } - } - } - return hintMatched -} - -func restore2TableHint(hintTables ...hintTableInfo) string { - buffer := bytes.NewBufferString("") - for i, table := range hintTables { - buffer.WriteString(table.tblName.L) - if len(table.partitions) > 0 { - buffer.WriteString(" PARTITION(") - for j, partition := range table.partitions { - if j > 0 { - buffer.WriteString(", ") - } - buffer.WriteString(partition.L) - } - buffer.WriteString(")") - } - if i < len(hintTables)-1 { - buffer.WriteString(", ") - } - } - return buffer.String() -} - -func restore2JoinHint(hintType string, hintTables []hintTableInfo) string { - if len(hintTables) == 0 { - return strings.ToUpper(hintType) - } - buffer := bytes.NewBufferString("/*+ ") - buffer.WriteString(strings.ToUpper(hintType)) - buffer.WriteString("(") - buffer.WriteString(restore2TableHint(hintTables...)) - buffer.WriteString(") */") - return buffer.String() -} - -func restore2IndexHint(hintType string, hintIndex indexHintInfo) string { - buffer := bytes.NewBufferString("/*+ ") - buffer.WriteString(strings.ToUpper(hintType)) - buffer.WriteString("(") - buffer.WriteString(restore2TableHint(hintTableInfo{ - dbName: hintIndex.dbName, - tblName: hintIndex.tblName, - partitions: hintIndex.partitions, - })) - if hintIndex.indexHint != nil && len(hintIndex.indexHint.IndexNames) > 0 { - for i, indexName := range hintIndex.indexHint.IndexNames { - if i > 0 { - buffer.WriteString(",") - } - buffer.WriteString(" " + indexName.L) - } - } - buffer.WriteString(") */") - return buffer.String() -} - -func restore2StorageHint(tiflashTables, tikvTables []hintTableInfo) string { - buffer := bytes.NewBufferString("/*+ ") - buffer.WriteString(strings.ToUpper(HintReadFromStorage)) - buffer.WriteString("(") - if len(tiflashTables) > 0 { - buffer.WriteString("tiflash[") - buffer.WriteString(restore2TableHint(tiflashTables...)) - buffer.WriteString("]") - if len(tikvTables) > 0 { - buffer.WriteString(", ") - } - } - if len(tikvTables) > 0 { - buffer.WriteString("tikv[") - buffer.WriteString(restore2TableHint(tikvTables...)) - buffer.WriteString("]") - } - buffer.WriteString(") */") - return buffer.String() -} - -func extractUnmatchedTables(hintTables []hintTableInfo) []string { - var tableNames []string - for _, table := range hintTables { - if !table.matched { - tableNames = append(tableNames, table.tblName.O) - } - } - return tableNames -} - // clauseCode indicates in which clause the column is currently. type clauseCode int @@ -509,14 +196,6 @@ const ( handlingScalarSubquery ) -// Hint flags listed here are used by PlanBuilder.subQueryHintFlags. -const ( - // HintFlagSemiJoinRewrite corresponds to HintSemiJoinRewrite. - HintFlagSemiJoinRewrite uint64 = 1 << iota - // HintFlagNoDecorrelate corresponds to HintNoDecorrelate. - HintFlagNoDecorrelate -) - // PlanBuilder builds Plan from an ast.Node. // It just builds the ast node straightforwardly. type PlanBuilder struct { @@ -532,7 +211,7 @@ type PlanBuilder struct { colMapper map[*ast.ColumnNameExpr]int // visitInfo is used for privilege check. visitInfo []visitInfo - tableHintInfo []tableHintInfo + tableHintInfo []*hint.TableHintInfo // optFlag indicates the flags of the optimizer rules. optFlag uint64 // capFlag indicates the capability flags. @@ -562,9 +241,9 @@ type PlanBuilder struct { // If we meet a subquery, it's clearly that it's a independent problem so we just pop one map out when we finish building the subquery. handleHelper *handleColHelper - hintProcessor *hint.BlockHintProcessor - // selectOffset is the offsets of current processing select stmts. - selectOffset []int + hintProcessor *hint.QBHintHandler + // qbOffset is the offsets of current processing select stmts. + qbOffset []int // SelectLock need this information to locate the lock on partitions. partitionedTable []table.PartitionedTable @@ -710,18 +389,18 @@ func (b *PlanBuilder) GetOptFlag() uint64 { } func (b *PlanBuilder) getSelectOffset() int { - if len(b.selectOffset) > 0 { - return b.selectOffset[len(b.selectOffset)-1] + if len(b.qbOffset) > 0 { + return b.qbOffset[len(b.qbOffset)-1] } return -1 } func (b *PlanBuilder) pushSelectOffset(offset int) { - b.selectOffset = append(b.selectOffset, offset) + b.qbOffset = append(b.qbOffset, offset) } func (b *PlanBuilder) popSelectOffset() { - b.selectOffset = b.selectOffset[:len(b.selectOffset)-1] + b.qbOffset = b.qbOffset[:len(b.qbOffset)-1] } // PlanBuilderOpt is used to adjust the plan builder. @@ -764,7 +443,7 @@ func NewPlanBuilder(opts ...PlanBuilderOpt) *PlanBuilder { // PlannerSelectBlockAsName should be restored after using this builder. // This is The comman code pattern to use it: // NewPlanBuilder().Init(sctx, is, processor) -func (b *PlanBuilder) Init(sctx sessionctx.Context, is infoschema.InfoSchema, processor *hint.BlockHintProcessor) (*PlanBuilder, []ast.HintTable) { +func (b *PlanBuilder) Init(sctx sessionctx.Context, is infoschema.InfoSchema, processor *hint.QBHintHandler) (*PlanBuilder, []ast.HintTable) { savedBlockNames := sctx.GetSessionVars().PlannerSelectBlockAsName.Load() if processor == nil { sctx.GetSessionVars().PlannerSelectBlockAsName.Store(&[]ast.HintTable{}) @@ -875,7 +554,7 @@ func (b *PlanBuilder) Build(ctx context.Context, node ast.Node) (Plan, error) { *ast.GrantStmt, *ast.DropUserStmt, *ast.AlterUserStmt, *ast.AlterRangeStmt, *ast.RevokeStmt, *ast.KillStmt, *ast.DropStatsStmt, *ast.GrantRoleStmt, *ast.RevokeRoleStmt, *ast.SetRoleStmt, *ast.SetDefaultRoleStmt, *ast.ShutdownStmt, *ast.RenameUserStmt, *ast.NonTransactionalDMLStmt, *ast.SetSessionStatesStmt, *ast.SetResourceGroupStmt, - *ast.LoadDataActionStmt, *ast.ImportIntoActionStmt, *ast.CalibrateResourceStmt, *ast.AddQueryWatchStmt, *ast.DropQueryWatchStmt: + *ast.ImportIntoActionStmt, *ast.CalibrateResourceStmt, *ast.AddQueryWatchStmt, *ast.DropQueryWatchStmt: return b.buildSimple(ctx, node.(ast.StmtNode)) case ast.DDLNode: return b.buildDDL(ctx, x) @@ -1056,11 +735,13 @@ func (b *PlanBuilder) buildSet(ctx context.Context, v *ast.SetStmt) (Plan, error func (b *PlanBuilder) buildDropBindPlan(v *ast.DropBindingStmt) (Plan, error) { var p *SQLBindPlan if v.OriginNode != nil { + normdOrigSQL, sqlDigestWithDB := norm.NormalizeStmtForBinding(v.OriginNode, norm.WithSpecifiedDB(b.ctx.GetSessionVars().CurrentDB)) p = &SQLBindPlan{ SQLBindOp: OpSQLBindDrop, - NormdOrigSQL: parser.NormalizeForBinding(utilparser.RestoreWithDefaultDB(v.OriginNode, b.ctx.GetSessionVars().CurrentDB, v.OriginNode.Text())), + NormdOrigSQL: normdOrigSQL, IsGlobal: v.GlobalScope, Db: utilparser.GetDefaultDB(v.OriginNode, b.ctx.GetSessionVars().CurrentDB), + SQLDigest: sqlDigestWithDB, } if v.HintedNode != nil { p.BindSQL = utilparser.RestoreWithDefaultDB(v.HintedNode, b.ctx.GetSessionVars().CurrentDB, v.HintedNode.Text()) @@ -1174,14 +855,19 @@ func (b *PlanBuilder) buildCreateBindPlanFromPlanDigest(v *ast.CreateBindingStmt if err != nil { return nil, errors.Errorf("binding failed: %v", err) } - normdOrigSQL, sqlDigestWithDB := parser.NormalizeDigestForBinding(utilparser.RestoreWithDefaultDB(originNode, bindableStmt.Schema, bindableStmt.Query)) + + restoredSQL := utilparser.RestoreWithDefaultDB(originNode, bindableStmt.Schema, bindableStmt.Query) + bindSQL = utilparser.RestoreWithDefaultDB(hintNode, bindableStmt.Schema, hintNode.Text()) + db := utilparser.GetDefaultDB(originNode, bindableStmt.Schema) + normdOrigSQL, sqlDigestWithDB := parser.NormalizeDigestForBinding(restoredSQL) + p := &SQLBindPlan{ SQLBindOp: OpSQLBindCreate, NormdOrigSQL: normdOrigSQL, - BindSQL: utilparser.RestoreWithDefaultDB(hintNode, bindableStmt.Schema, hintNode.Text()), + BindSQL: bindSQL, IsGlobal: v.GlobalScope, BindStmt: hintNode, - Db: utilparser.GetDefaultDB(originNode, bindableStmt.Schema), + Db: db, Charset: bindableStmt.Charset, Collation: bindableStmt.Collation, Source: bindinfo.History, @@ -1207,14 +893,17 @@ func (b *PlanBuilder) buildCreateBindPlan(v *ast.CreateBindingStmt) (Plan, error return nil, err } - normdOrigSQL, sqlDigestWithDB := parser.NormalizeDigestForBinding(utilparser.RestoreWithDefaultDB(v.OriginNode, b.ctx.GetSessionVars().CurrentDB, v.OriginNode.Text())) + restoredSQL := utilparser.RestoreWithDefaultDB(v.OriginNode, b.ctx.GetSessionVars().CurrentDB, v.OriginNode.Text()) + bindSQL := utilparser.RestoreWithDefaultDB(v.HintedNode, b.ctx.GetSessionVars().CurrentDB, v.HintedNode.Text()) + db := utilparser.GetDefaultDB(v.OriginNode, b.ctx.GetSessionVars().CurrentDB) + normdOrigSQL, sqlDigestWithDB := parser.NormalizeDigestForBinding(restoredSQL) p := &SQLBindPlan{ SQLBindOp: OpSQLBindCreate, NormdOrigSQL: normdOrigSQL, - BindSQL: utilparser.RestoreWithDefaultDB(v.HintedNode, b.ctx.GetSessionVars().CurrentDB, v.HintedNode.Text()), + BindSQL: bindSQL, IsGlobal: v.GlobalScope, BindStmt: v.HintedNode, - Db: utilparser.GetDefaultDB(v.OriginNode, b.ctx.GetSessionVars().CurrentDB), + Db: db, Charset: charSet, Collation: collation, Source: bindinfo.Manual, @@ -1365,7 +1054,7 @@ func getLatestIndexInfo(ctx sessionctx.Context, id int64, startVer int64) (map[i return latestIndexes, true, nil } -func getPossibleAccessPaths(ctx sessionctx.Context, tableHints *tableHintInfo, indexHints []*ast.IndexHint, tbl table.Table, dbName, tblName model.CIStr, check bool, hasFlagPartitionProcessor bool) ([]*util.AccessPath, error) { +func getPossibleAccessPaths(ctx sessionctx.Context, tableHints *hint.TableHintInfo, indexHints []*ast.IndexHint, tbl table.Table, dbName, tblName model.CIStr, check bool, hasFlagPartitionProcessor bool) ([]*util.AccessPath, error) { tblInfo := tbl.Meta() publicPaths := make([]*util.AccessPath, 0, len(tblInfo.Indices)+2) tp := kv.TiKV @@ -1444,10 +1133,10 @@ func getPossibleAccessPaths(ctx sessionctx.Context, tableHints *tableHintInfo, i // Extract comment-style index hint like /*+ INDEX(t, idx1, idx2) */. indexHintsLen := len(indexHints) if tableHints != nil { - for i, hint := range tableHints.indexHintList { - if hint.dbName.L == dbName.L && hint.tblName.L == tblName.L { - indexHints = append(indexHints, hint.indexHint) - tableHints.indexHintList[i].matched = true + for i, hint := range tableHints.IndexHintList { + if hint.Match(dbName, tblName) { + indexHints = append(indexHints, hint.IndexHint) + tableHints.IndexHintList[i].Matched = true } } } @@ -1484,7 +1173,7 @@ func getPossibleAccessPaths(ctx sessionctx.Context, tableHints *tableHintInfo, i for _, idxName := range hint.IndexNames { path := getPathByIndexName(publicPaths, idxName, tblInfo) if path == nil { - err := ErrKeyDoesNotExist.GenWithStackByArgs(idxName, tblInfo.Name) + err := ErrKeyDoesNotExist.FastGenByArgs(idxName, tblInfo.Name) // if hint is from comment-style sql hints, we should throw a warning instead of error. if i < indexHintsLen { return nil, err @@ -1528,6 +1217,19 @@ func getPossibleAccessPaths(ctx sessionctx.Context, tableHints *tableHintInfo, i if len(available) == 0 { available = append(available, tablePath) } + + // If all available paths are Multi-Valued Index, it's possible that the only multi-valued index is inapplicable, + // so that the table paths are still added here to avoid failing to find any physical plan. + allMVIIndexPath := true + for _, availablePath := range available { + if !isMVIndexPath(availablePath) { + allMVIIndexPath = false + } + } + if allMVIIndexPath { + available = append(available, tablePath) + } + return available, nil } @@ -1602,17 +1304,6 @@ func removeGlobalIndexPaths(paths []*util.AccessPath) []*util.AccessPath { return paths[:i] } -func removeTiflashDuringStaleRead(paths []*util.AccessPath) []*util.AccessPath { - n := 0 - for _, path := range paths { - if path.StoreType != kv.TiFlash { - paths[n] = path - n++ - } - } - return paths[:n] -} - func (b *PlanBuilder) buildSelectLock(src LogicalPlan, lock *ast.SelectLockInfo) (*LogicalLock, error) { var tblID2PhysTblIDCol map[int64]*expression.Column if len(b.partitionedTable) > 0 { @@ -1777,7 +1468,7 @@ func (b *PlanBuilder) buildAdmin(ctx context.Context, as *ast.AdminStmt) (Plan, return &Simple{Statement: as}, nil case ast.AdminFlushPlanCache: return &Simple{Statement: as}, nil - case ast.AdminSetBDRRole: + case ast.AdminSetBDRRole, ast.AdminUnsetBDRRole: return &Simple{Statement: as}, nil case ast.AdminShowBDRRole: p := &AdminShowBDRRole{} @@ -2300,7 +1991,7 @@ func (b *PlanBuilder) getPredicateColumns(tbl *ast.TableName, cols *calcOnceMap) return nil, err } if len(colList) == 0 { - b.ctx.GetSessionVars().StmtCtx.AppendWarning(errors.Errorf("No predicate column has been collected yet for table %s.%s so all columns are analyzed", tbl.Schema.L, tbl.Name.L)) + b.ctx.GetSessionVars().StmtCtx.AppendWarning(errors.NewNoStackErrorf("No predicate column has been collected yet for table %s.%s so all columns are analyzed", tbl.Schema.L, tbl.Name.L)) for _, colInfo := range tblInfo.Columns { cols.data[colInfo.ID] = struct{}{} } @@ -2337,7 +2028,7 @@ func (b *PlanBuilder) getFullAnalyzeColumnsInfo( warning bool, ) ([]*model.ColumnInfo, []*model.ColumnInfo, error) { if mustAllColumns && warning && (columnChoice == model.PredicateColumns || columnChoice == model.ColumnList) { - b.ctx.GetSessionVars().StmtCtx.AppendWarning(errors.Errorf("Table %s.%s has version 1 statistics so all the columns must be analyzed to overwrite the current statistics", tbl.Schema.L, tbl.Name.L)) + b.ctx.GetSessionVars().StmtCtx.AppendWarning(errors.NewNoStackErrorf("Table %s.%s has version 1 statistics so all the columns must be analyzed to overwrite the current statistics", tbl.Schema.L, tbl.Name.L)) } switch columnChoice { @@ -2368,7 +2059,7 @@ func (b *PlanBuilder) getFullAnalyzeColumnsInfo( if len(missing) > 0 { missingNames := getColumnNamesFromIDs(tbl.TableInfo.Columns, missing) warningMsg := fmt.Sprintf("Columns %s are missing in ANALYZE but their stats are needed for calculating stats for indexes/primary key/extended stats", strings.Join(missingNames, ",")) - b.ctx.GetSessionVars().StmtCtx.AppendWarning(errors.New(warningMsg)) + b.ctx.GetSessionVars().StmtCtx.AppendWarning(errors.NewNoStackError(warningMsg)) } } colSet = combineColumnSets(colSet, mustAnalyzed) @@ -2452,7 +2143,11 @@ func getColOffsetForAnalyze(colsInfo []*model.ColumnInfo, colID int64) int { // TODO: find a better way to find indexed columns in ANALYZE rather than use IndexColumn.Offset // For multi-valued index, we need to collect it separately here and analyze it as independent index analyze task. // See comments for AnalyzeResults.ForMVIndex for more details. -func getModifiedIndexesInfoForAnalyze(sctx sessionctx.Context, tblInfo *model.TableInfo, allColumns bool, colsInfo []*model.ColumnInfo) ([]*model.IndexInfo, []*model.IndexInfo) { +func getModifiedIndexesInfoForAnalyze( + tblInfo *model.TableInfo, + allColumns bool, + colsInfo []*model.ColumnInfo, +) ([]*model.IndexInfo, []*model.IndexInfo) { idxsInfo := make([]*model.IndexInfo, 0, len(tblInfo.Indices)) independentIdxsInfo := make([]*model.IndexInfo, 0) for _, originIdx := range tblInfo.Indices { @@ -2460,7 +2155,7 @@ func getModifiedIndexesInfoForAnalyze(sctx sessionctx.Context, tblInfo *model.Ta continue } if originIdx.MVIndex { - sctx.GetSessionVars().StmtCtx.AppendWarning(errors.Errorf("analyzing multi-valued indexes is not supported, skip %s", originIdx.Name.L)) + independentIdxsInfo = append(independentIdxsInfo, originIdx) continue } if allColumns { @@ -2525,7 +2220,7 @@ func (b *PlanBuilder) buildAnalyzeFullSamplingTask( // Version 2 doesn't support incremental analyze. // And incremental analyze will be deprecated in the future. if as.Incremental { - b.ctx.GetSessionVars().StmtCtx.AppendWarning(errors.Errorf("The version 2 stats would ignore the INCREMENTAL keyword and do full sampling")) + b.ctx.GetSessionVars().StmtCtx.AppendWarning(errors.NewNoStackErrorf("The version 2 stats would ignore the INCREMENTAL keyword and do full sampling")) } astOpts, err := handleAnalyzeOptionsV2(as.AnalyzeOpts) @@ -2579,7 +2274,7 @@ func (b *PlanBuilder) buildAnalyzeFullSamplingTask( } execColsInfo = b.filterSkipColumnTypes(execColsInfo, tbl, &mustAnalyzedCols) allColumns := len(tbl.TableInfo.Columns) == len(execColsInfo) - indexes, independentIndexes := getModifiedIndexesInfoForAnalyze(b.ctx, tbl.TableInfo, allColumns, execColsInfo) + indexes, independentIndexes := getModifiedIndexesInfoForAnalyze(tbl.TableInfo, allColumns, execColsInfo) handleCols := BuildHandleColsForAnalyze(b.ctx, tbl.TableInfo, allColumns, execColsInfo) newTask := AnalyzeColumnsTask{ HandleCols: handleCols, @@ -2634,7 +2329,7 @@ func (b *PlanBuilder) genV2AnalyzeOptions( astOpts = make(map[ast.AnalyzeOptionType]uint64, 0) astColChoice = model.DefaultChoice astColList = make([]*model.ColumnInfo, 0) - b.ctx.GetSessionVars().StmtCtx.AppendWarning(errors.New("Ignore columns and options when analyze partition in dynamic mode")) + b.ctx.GetSessionVars().StmtCtx.AppendWarning(errors.NewNoStackError("Ignore columns and options when analyze partition in dynamic mode")) } // Get the analyze options which are saved in mysql.analyze_options. @@ -2833,7 +2528,7 @@ func (b *PlanBuilder) buildAnalyzeTable(as *ast.AnalyzeTableStmt, opts map[ast.A continue } if idx.MVIndex { - b.ctx.GetSessionVars().StmtCtx.AppendWarning(errors.Errorf("analyzing multi-valued indexes is not supported, skip %s", idx.Name.L)) + b.ctx.GetSessionVars().StmtCtx.AppendWarning(errors.NewNoStackErrorf("analyzing multi-valued indexes is not supported, skip %s", idx.Name.L)) continue } p.IdxTasks = append(p.IdxTasks, generateIndexTasks(idx, as, tbl.TableInfo, partitionNames, physicalIDs, version)...) @@ -2878,10 +2573,10 @@ func (b *PlanBuilder) buildAnalyzeIndex(as *ast.AnalyzeTableStmt, opts map[ast.A } versionIsSame := statsHandle.CheckAnalyzeVersion(tblInfo, physicalIDs, &version) if !versionIsSame { - b.ctx.GetSessionVars().StmtCtx.AppendWarning(errors.Errorf("The analyze version from the session is not compatible with the existing statistics of the table. Use the existing version instead")) + b.ctx.GetSessionVars().StmtCtx.AppendWarning(errors.NewNoStackErrorf("The analyze version from the session is not compatible with the existing statistics of the table. Use the existing version instead")) } if version == statistics.Version2 { - b.ctx.GetSessionVars().StmtCtx.AppendWarning(errors.Errorf("The version 2 would collect all statistics not only the selected indexes")) + b.ctx.GetSessionVars().StmtCtx.AppendWarning(errors.NewNoStackErrorf("The version 2 would collect all statistics not only the selected indexes")) return b.buildAnalyzeTable(as, opts, version) } for _, idxName := range as.IndexNames { @@ -2909,7 +2604,7 @@ func (b *PlanBuilder) buildAnalyzeIndex(as *ast.AnalyzeTableStmt, opts map[ast.A return nil, ErrAnalyzeMissIndex.GenWithStackByArgs(idxName.O, tblInfo.Name.O) } if idx.MVIndex { - b.ctx.GetSessionVars().StmtCtx.AppendWarning(errors.Errorf("analyzing multi-valued indexes is not supported, skip %s", idx.Name.L)) + b.ctx.GetSessionVars().StmtCtx.AppendWarning(errors.NewNoStackErrorf("analyzing multi-valued indexes is not supported, skip %s", idx.Name.L)) continue } p.IdxTasks = append(p.IdxTasks, generateIndexTasks(idx, as, tblInfo, names, physicalIDs, version)...) @@ -2930,16 +2625,16 @@ func (b *PlanBuilder) buildAnalyzeAllIndex(as *ast.AnalyzeTableStmt, opts map[as } versionIsSame := statsHandle.CheckAnalyzeVersion(tblInfo, physicalIDs, &version) if !versionIsSame { - b.ctx.GetSessionVars().StmtCtx.AppendWarning(errors.Errorf("The analyze version from the session is not compatible with the existing statistics of the table. Use the existing version instead")) + b.ctx.GetSessionVars().StmtCtx.AppendWarning(errors.NewNoStackErrorf("The analyze version from the session is not compatible with the existing statistics of the table. Use the existing version instead")) } if version == statistics.Version2 { - b.ctx.GetSessionVars().StmtCtx.AppendWarning(errors.Errorf("The version 2 would collect all statistics not only the selected indexes")) + b.ctx.GetSessionVars().StmtCtx.AppendWarning(errors.NewNoStackErrorf("The version 2 would collect all statistics not only the selected indexes")) return b.buildAnalyzeTable(as, opts, version) } for _, idx := range tblInfo.Indices { if idx.State == model.StatePublic { if idx.MVIndex { - b.ctx.GetSessionVars().StmtCtx.AppendWarning(errors.Errorf("analyzing multi-valued indexes is not supported, skip %s", idx.Name.L)) + b.ctx.GetSessionVars().StmtCtx.AppendWarning(errors.NewNoStackErrorf("analyzing multi-valued indexes is not supported, skip %s", idx.Name.L)) continue } @@ -2995,7 +2690,7 @@ func generateIndexTasks(idx *model.IndexInfo, as *ast.AnalyzeTableStmt, tblInfo } // CMSketchSizeLimit indicates the size limit of CMSketch. -var CMSketchSizeLimit = kv.TxnEntrySizeLimit / binary.MaxVarintLen32 +var CMSketchSizeLimit = kv.TxnEntrySizeLimit.Load() / binary.MaxVarintLen32 var analyzeOptionLimit = map[ast.AnalyzeOptionType]uint64{ ast.AnalyzeOptNumBuckets: 1024, @@ -3139,6 +2834,9 @@ func handleAnalyzeOptions(opts []ast.AnalyzeOpt, statsVer int) (map[ast.AnalyzeO } func (b *PlanBuilder) buildAnalyze(as *ast.AnalyzeTableStmt) (Plan, error) { + if as.NoWriteToBinLog { + return nil, dbterror.ErrNotSupportedYet.GenWithStackByArgs("[NO_WRITE_TO_BINLOG | LOCAL]") + } if as.Incremental { return nil, errors.Errorf("the incremental analyze feature has already been removed in TiDB v7.5.0, so this will have no effect") } @@ -3541,6 +3239,8 @@ func (b *PlanBuilder) buildShow(ctx context.Context, show *ast.ShowStmt) (Plan, if tableInfo.Meta().TempTableType != model.TempTableNone { return nil, ErrOptOnTemporaryTable.GenWithStackByArgs("show table regions") } + case ast.ShowReplicaStatus: + return nil, dbterror.ErrNotSupportedYet.GenWithStackByArgs("SHOW {REPLICA | SLAVE} STATUS") } schema, names := buildShowSchema(show, isView, isSequence) @@ -3896,7 +3596,7 @@ func (b *PlanBuilder) resolveGeneratedColumns(ctx context.Context, columns []*ta originalVal := b.allowBuildCastArray b.allowBuildCastArray = true - expr, _, err := b.rewrite(ctx, column.GeneratedExpr, mockPlan, nil, true) + expr, _, err := b.rewrite(ctx, column.GeneratedExpr.Clone(), mockPlan, nil, true) b.allowBuildCastArray = originalVal if err != nil { return igc, err @@ -4466,9 +4166,11 @@ func (b *PlanBuilder) buildImportInto(ctx context.Context, ld *ast.ImportIntoStm importFromServer bool ) - importFromServer, err = storage.IsLocalPath(ld.Path) - if err != nil { - return nil, exeerrors.ErrLoadDataInvalidURI.FastGenByArgs(ImportIntoDataSource, err.Error()) + if ld.Select == nil { + importFromServer, err = storage.IsLocalPath(ld.Path) + if err != nil { + return nil, exeerrors.ErrLoadDataInvalidURI.FastGenByArgs(ImportIntoDataSource, err.Error()) + } } if importFromServer && sem.IsEnabled() { @@ -4531,8 +4233,26 @@ func (b *PlanBuilder) buildImportInto(ctx context.Context, ld *ast.ImportIntoStm return nil, err } - outputSchema, outputFields := convert2OutputSchemasAndNames(importIntoSchemaNames, importIntoSchemaFTypes) - p.setSchemaAndNames(outputSchema, outputFields) + if ld.Select != nil { + // privilege of tables in select will be checked here + selectPlan, err2 := b.Build(ctx, ld.Select) + if err2 != nil { + return nil, err2 + } + // it's allowed to use IMPORT INTO t FROM SELECT * FROM t + // as we pre-check that the target table must be empty. + if (len(ld.ColumnsAndUserVars) > 0 && len(selectPlan.Schema().Columns) != len(ld.ColumnsAndUserVars)) || + (len(ld.ColumnsAndUserVars) == 0 && len(selectPlan.Schema().Columns) != len(tableInPlan.VisibleCols())) { + return nil, ErrWrongValueCountOnRow.GenWithStackByArgs(1) + } + p.SelectPlan, _, err2 = DoOptimize(ctx, b.ctx, b.optFlag, selectPlan.(LogicalPlan)) + if err2 != nil { + return nil, err2 + } + } else { + outputSchema, outputFields := convert2OutputSchemasAndNames(importIntoSchemaNames, importIntoSchemaFTypes) + p.setSchemaAndNames(outputSchema, outputFields) + } return p, nil } @@ -4602,8 +4322,13 @@ func (b *PlanBuilder) buildSplitRegion(node *ast.SplitRegionStmt) (Plan, error) func (b *PlanBuilder) buildSplitIndexRegion(node *ast.SplitRegionStmt) (Plan, error) { tblInfo := node.Table.TableInfo + if node.IndexName.L == strings.ToLower(mysql.PrimaryKeyName) && + (tblInfo.IsCommonHandle || tblInfo.PKIsHandle) { + return nil, ErrKeyDoesNotExist.FastGen("unable to split clustered index, please split table instead.") + } + indexInfo := tblInfo.FindIndexByName(node.IndexName.L) - if indexInfo == nil || indexInfo.Primary && tblInfo.IsCommonHandle { + if indexInfo == nil { return nil, ErrKeyDoesNotExist.GenWithStackByArgs(node.IndexName, tblInfo.Name) } mockTablePlan := LogicalTableDual{}.Init(b.ctx, b.getSelectOffset()) @@ -5142,6 +4867,8 @@ func (b *PlanBuilder) buildDDL(ctx context.Context, node ast.DDLNode) (Plan, err case *ast.CreateResourceGroupStmt, *ast.DropResourceGroupStmt, *ast.AlterResourceGroupStmt: err := ErrSpecificAccessDenied.GenWithStackByArgs("SUPER or RESOURCE_GROUP_ADMIN") b.visitInfo = appendDynamicVisitInfo(b.visitInfo, "RESOURCE_GROUP_ADMIN", false, err) + case *ast.OptimizeTableStmt: + return nil, dbterror.ErrGeneralUnsupportedDDL.GenWithStack("OPTIMIZE TABLE is not supported") } p := &DDL{Statement: node} return p, nil diff --git a/pkg/planner/core/planbuilder_test.go b/pkg/planner/core/planbuilder_test.go index 365fcccf5d67a..bbb62f336593c 100644 --- a/pkg/planner/core/planbuilder_test.go +++ b/pkg/planner/core/planbuilder_test.go @@ -124,16 +124,16 @@ func TestRewriterPool(t *testing.T) { defer func() { domain.GetDomain(ctx).StatsHandle().Close() }() - builder, _ := NewPlanBuilder().Init(ctx, nil, &hint.BlockHintProcessor{}) + builder, _ := NewPlanBuilder().Init(ctx, nil, hint.NewQBHintHandler(nil)) // Make sure PlanBuilder.getExpressionRewriter() provides clean rewriter from pool. // First, pick one rewriter from the pool and make it dirty. builder.rewriterCounter++ dirtyRewriter := builder.getExpressionRewriter(context.TODO(), nil) dirtyRewriter.asScalar = true - dirtyRewriter.aggrMap = make(map[*ast.AggregateFuncExpr]int) + dirtyRewriter.planCtx.aggrMap = make(map[*ast.AggregateFuncExpr]int) dirtyRewriter.preprocess = func(ast.Node) ast.Node { return nil } - dirtyRewriter.insertPlan = &Insert{} + dirtyRewriter.planCtx.insertPlan = &Insert{} dirtyRewriter.disableFoldCounter = 1 dirtyRewriter.ctxStack = make([]expression.Expression, 2) dirtyRewriter.ctxNameStk = make([]*types.FieldName, 2) @@ -143,9 +143,9 @@ func TestRewriterPool(t *testing.T) { cleanRewriter := builder.getExpressionRewriter(context.TODO(), nil) require.Equal(t, dirtyRewriter, cleanRewriter) require.Equal(t, false, cleanRewriter.asScalar) - require.Nil(t, cleanRewriter.aggrMap) + require.Nil(t, cleanRewriter.planCtx.aggrMap) require.Nil(t, cleanRewriter.preprocess) - require.Nil(t, cleanRewriter.insertPlan) + require.Nil(t, cleanRewriter.planCtx.insertPlan) require.Zero(t, cleanRewriter.disableFoldCounter) require.Len(t, cleanRewriter.ctxStack, 0) builder.rewriterCounter-- @@ -181,7 +181,7 @@ func TestDisableFold(t *testing.T) { stmt := st.(*ast.SelectStmt) expr := stmt.Fields.Fields[0].Expr - builder, _ := NewPlanBuilder().Init(ctx, nil, &hint.BlockHintProcessor{}) + builder, _ := NewPlanBuilder().Init(ctx, nil, hint.NewQBHintHandler(nil)) builder.rewriterCounter++ rewriter := builder.getExpressionRewriter(context.TODO(), nil) require.NotNil(t, rewriter) @@ -658,7 +658,7 @@ func TestGetFullAnalyzeColumnsInfo(t *testing.T) { defer func() { domain.GetDomain(ctx).StatsHandle().Close() }() - pb, _ := NewPlanBuilder().Init(ctx, nil, &hint.BlockHintProcessor{}) + pb, _ := NewPlanBuilder().Init(ctx, nil, hint.NewQBHintHandler(nil)) // Create a new TableName instance. tableName := &ast.TableName{ @@ -714,7 +714,7 @@ func TestRequireInsertAndSelectPriv(t *testing.T) { defer func() { domain.GetDomain(ctx).StatsHandle().Close() }() - pb, _ := NewPlanBuilder().Init(ctx, nil, &hint.BlockHintProcessor{}) + pb, _ := NewPlanBuilder().Init(ctx, nil, hint.NewQBHintHandler(nil)) tables := []*ast.TableName{ { diff --git a/pkg/planner/core/point_get_plan.go b/pkg/planner/core/point_get_plan.go index a4f501e308085..268241700c5b1 100644 --- a/pkg/planner/core/point_get_plan.go +++ b/pkg/planner/core/point_get_plan.go @@ -59,6 +59,9 @@ import ( "go.uber.org/zap" ) +// GlobalWithoutColumnPos marks the index has no partition column. +const GlobalWithoutColumnPos = -1 + // PointGetPlan is a fast plan for simple point get. // When we detect that the statement has a unique equal access condition, this plan is used. // This plan is much faster to build and to execute because it avoid the optimization and coprocessor cost. @@ -68,7 +71,7 @@ type PointGetPlan struct { schema *expression.Schema TblInfo *model.TableInfo IndexInfo *model.IndexInfo - PartitionInfo *model.PartitionDefinition + PartitionDef *model.PartitionDefinition Handle kv.Handle HandleConstant *expression.Constant handleFieldType *types.FieldType @@ -269,8 +272,8 @@ func (p *PointGetPlan) MemoryUsage() (sum int64) { if p.schema != nil { sum += p.schema.MemoryUsage() } - if p.PartitionInfo != nil { - sum += p.PartitionInfo.MemoryUsage() + if p.PartitionDef != nil { + sum += p.PartitionDef.MemoryUsage() } if p.HandleConstant != nil { sum += p.HandleConstant.MemoryUsage() @@ -312,7 +315,7 @@ type BatchPointGetPlan struct { dbName string TblInfo *model.TableInfo IndexInfo *model.IndexInfo - PartitionInfos []*model.PartitionDefinition + PartitionDefs []*model.PartitionDefinition Handles []kv.Handle HandleType *types.FieldType HandleParams []*expression.Constant // record all Parameters for Plan-Cache @@ -490,7 +493,7 @@ func (p *BatchPointGetPlan) MemoryUsage() (sum int64) { sum = emptyBatchPointGetPlanSize + p.baseSchemaProducer.MemoryUsage() + int64(len(p.dbName)) + int64(cap(p.IdxColLens))*size.SizeOfInt + int64(cap(p.Handles))*size.SizeOfInterface + - int64(cap(p.PartitionInfos)+cap(p.HandleParams)+cap(p.IndexColTypes)+cap(p.IdxCols)+cap(p.Columns)+cap(p.accessCols))*size.SizeOfPointer + int64(cap(p.PartitionDefs)+cap(p.HandleParams)+cap(p.IndexColTypes)+cap(p.IdxCols)+cap(p.Columns)+cap(p.accessCols))*size.SizeOfPointer if p.HandleType != nil { sum += p.HandleType.MemoryUsage() } @@ -546,7 +549,7 @@ func TryFastPlan(ctx sessionctx.Context, node ast.Node) (p Plan) { defer func() { vars := ctx.GetSessionVars() if vars.SelectLimit != math2.MaxUint64 && p != nil { - ctx.GetSessionVars().StmtCtx.AppendWarning(errors.New("sql_select_limit is set, so point get plan is not activated")) + ctx.GetSessionVars().StmtCtx.AppendWarning(errors.NewNoStackError("sql_select_limit is set, so point get plan is not activated")) p = nil } if vars.StmtCtx.EnableOptimizeTrace && p != nil { @@ -655,7 +658,7 @@ func newBatchPointGetPlan( var handles = make([]kv.Handle, len(patternInExpr.List)) var handleParams = make([]*expression.Constant, len(patternInExpr.List)) var pos2PartitionDefinition = make(map[int]*model.PartitionDefinition) - partitionInfos := make([]*model.PartitionDefinition, 0, len(patternInExpr.List)) + partitionDefs := make([]*model.PartitionDefinition, 0, len(patternInExpr.List)) for i, item := range patternInExpr.List { // SELECT * FROM t WHERE (key) in ((1), (2)) if p, ok := item.(*ast.ParenthesesExpr); ok { @@ -690,7 +693,7 @@ func newBatchPointGetPlan( handleParams[i] = con pairs := []nameValuePair{{colName: handleCol.Name.L, colFieldType: item.GetType(), value: *intDatum, con: con}} if tbl.GetPartitionInfo() != nil { - tmpPartitionDefinition, _, pos, isTableDual := getPartitionInfo(ctx, tbl, pairs) + tmpPartitionDefinition, _, pos, isTableDual := getPartitionDef(ctx, tbl, pairs) if isTableDual { return nil } @@ -708,18 +711,18 @@ func newBatchPointGetPlan( } sort.Ints(posArr) for _, pos := range posArr { - partitionInfos = append(partitionInfos, pos2PartitionDefinition[pos]) + partitionDefs = append(partitionDefs, pos2PartitionDefinition[pos]) } - if len(partitionInfos) == 0 { - partitionInfos = nil + if len(partitionDefs) == 0 { + partitionDefs = nil } p := &BatchPointGetPlan{ - TblInfo: tbl, - Handles: handles, - HandleParams: handleParams, - HandleType: &handleCol.FieldType, - PartitionExpr: partitionExpr, - PartitionInfos: partitionInfos, + TblInfo: tbl, + Handles: handles, + HandleParams: handleParams, + HandleType: &handleCol.FieldType, + PartitionExpr: partitionExpr, + PartitionDefs: partitionDefs, } return p.Init(ctx, statsInfo, schema, names, 0) @@ -776,7 +779,7 @@ func newBatchPointGetPlan( indexValues := make([][]types.Datum, len(patternInExpr.List)) indexValueParams := make([][]*expression.Constant, len(patternInExpr.List)) - partitionInfos := make([]*model.PartitionDefinition, 0, len(patternInExpr.List)) + partitionDefs := make([]*model.PartitionDefinition, 0, len(patternInExpr.List)) var pos2PartitionDefinition = make(map[int]*model.PartitionDefinition) var indexTypes []*types.FieldType @@ -878,7 +881,7 @@ func newBatchPointGetPlan( indexValues[i] = values indexValueParams[i] = valuesParams if tbl.GetPartitionInfo() != nil { - tmpPartitionDefinition, _, pos, isTableDual := getPartitionInfo(ctx, tbl, pairs) + tmpPartitionDefinition, _, pos, isTableDual := getPartitionDef(ctx, tbl, pairs) if isTableDual { return nil } @@ -896,10 +899,10 @@ func newBatchPointGetPlan( } sort.Ints(posArr) for _, pos := range posArr { - partitionInfos = append(partitionInfos, pos2PartitionDefinition[pos]) + partitionDefs = append(partitionDefs, pos2PartitionDefinition[pos]) } - if len(partitionInfos) == 0 { - partitionInfos = nil + if len(partitionDefs) == 0 { + partitionDefs = nil } p := &BatchPointGetPlan{ TblInfo: tbl, @@ -909,7 +912,7 @@ func newBatchPointGetPlan( IndexColTypes: indexTypes, PartitionColPos: pos, PartitionExpr: partitionExpr, - PartitionInfos: partitionInfos, + PartitionDefs: partitionDefs, } return p.Init(ctx, statsInfo, schema, names, 0) @@ -1016,7 +1019,7 @@ func tryWhereIn2BatchPointGet(ctx sessionctx.Context, selStmt *ast.SelectStmt) * // 3. All the columns must be public and not generated. // 4. The condition is an access path that the range is a unique key. func tryPointGetPlan(ctx sessionctx.Context, selStmt *ast.SelectStmt, check bool) *PointGetPlan { - if selStmt.Having != nil { + if selStmt.Having != nil || selStmt.OrderBy != nil { return nil } else if selStmt.Limit != nil { count, offset, err := extractLimitCountOffset(ctx, selStmt.Limit) @@ -1059,21 +1062,21 @@ func tryPointGetPlan(ctx sessionctx.Context, selStmt *ast.SelectStmt, check bool return nil } - var partitionInfo *model.PartitionDefinition + var partitionDef *model.PartitionDefinition var pos int if pi != nil { - partitionInfo, pos, _, isTableDual = getPartitionInfo(ctx, tbl, pairs) + partitionDef, pos, _, isTableDual = getPartitionDef(ctx, tbl, pairs) if isTableDual { p := newPointGetPlan(ctx, tblName.Schema.O, schema, tbl, names) p.IsTableDual = true return p } - if partitionInfo == nil { - return nil + if partitionDef == nil { + return checkTblIndexForPointPlan(ctx, tblName, schema, names, pairs, nil, pos, true, isTableDual, check) } // Take partition selection into consideration. if len(tblName.PartitionNames) > 0 { - if !partitionNameInSet(partitionInfo.Name, tblName.PartitionNames) { + if !partitionNameInSet(partitionDef.Name, tblName.PartitionNames) { p := newPointGetPlan(ctx, tblName.Schema.O, schema, tbl, names) p.IsTableDual = true return p @@ -1094,22 +1097,51 @@ func tryPointGetPlan(ctx sessionctx.Context, selStmt *ast.SelectStmt, check bool p.UnsignedHandle = mysql.HasUnsignedFlag(fieldType.GetFlag()) p.handleFieldType = fieldType p.HandleConstant = handlePair.con - p.PartitionInfo = partitionInfo + p.PartitionDef = partitionDef return p } else if handlePair.value.Kind() != types.KindNull { return nil } + return checkTblIndexForPointPlan(ctx, tblName, schema, names, pairs, partitionDef, pos, false, isTableDual, check) +} + +func checkTblIndexForPointPlan(ctx sessionctx.Context, tblName *ast.TableName, schema *expression.Schema, + names []*types.FieldName, pairs []nameValuePair, partitionDef *model.PartitionDefinition, + pos int, globalIndexCheck, isTableDual, check bool) *PointGetPlan { + if globalIndexCheck { + // when partitions are specified or some partition is in ddl, not use point get plan for global index. + // TODO: Add partition ID filter for Global Index Point Get. + // partitions are specified in select stmt. + if len(tblName.PartitionNames) > 0 { + return nil + } + tbl := tblName.TableInfo + // some partition is in ddl. + if tbl == nil || + len(tbl.GetPartitionInfo().AddingDefinitions) > 0 || + len(tbl.GetPartitionInfo().DroppingDefinitions) > 0 { + return nil + } + } check = check || ctx.GetSessionVars().IsIsolation(ast.ReadCommitted) check = check && ctx.GetSessionVars().ConnectionID > 0 var latestIndexes map[int64]*model.IndexInfo var err error + tbl := tblName.TableInfo + dbName := tblName.Schema.L + if dbName == "" { + dbName = ctx.GetSessionVars().CurrentDB + } for _, idxInfo := range tbl.Indices { if !idxInfo.Unique || idxInfo.State != model.StatePublic || idxInfo.Invisible || idxInfo.MVIndex || !indexIsAvailableByHints(idxInfo, tblName.IndexHints) { continue } + if globalIndexCheck && !idxInfo.Global { + continue + } if isTableDual { if check && latestIndexes == nil { latestIndexes, check, err = getLatestIndexInfo(ctx, tbl.ID, 0) @@ -1148,8 +1180,8 @@ func tryPointGetPlan(ctx sessionctx.Context, selStmt *ast.SelectStmt, check bool p.IndexValues = idxValues p.IndexConstants = idxConstant p.ColsFieldType = colsFieldType - p.PartitionInfo = partitionInfo - if p.PartitionInfo != nil { + p.PartitionDef = partitionDef + if p.PartitionDef != nil { p.partitionColumnPos = findPartitionIdx(idxInfo, pos, pairs) } return p @@ -1438,7 +1470,15 @@ func getNameValuePairs(ctx sessionctx.Context, tbl *model.TableInfo, tblName mod col := model.FindColumnInfo(tbl.Cols(), colName.Name.Name.L) if col == nil { // Handling the case when the column is _tidb_rowid. return append(nvPairs, nameValuePair{colName: colName.Name.Name.L, colFieldType: types.NewFieldType(mysql.TypeLonglong), value: d, con: con}), false - } else if col.GetType() == mysql.TypeString && col.GetCollate() == charset.CollationBin { // This type we needn't to pad `\0` in here. + } + + // As in buildFromBinOp in util/ranger, when we build key from the expression to do range scan or point get on + // a string column, we should set the collation of the string datum to collation of the column. + if col.FieldType.EvalType() == types.ETString && (d.Kind() == types.KindString || d.Kind() == types.KindBinaryLiteral) { + d.SetString(d.GetString(), col.FieldType.GetCollate()) + } + + if col.GetType() == mysql.TypeString && col.GetCollate() == charset.CollationBin { // This type we needn't to pad `\0` in here. return append(nvPairs, nameValuePair{colName: colName.Name.Name.L, colFieldType: &col.FieldType, value: d, con: con}), false } if !checkCanConvertInPointGet(col, d) { @@ -1468,6 +1508,11 @@ func getPointGetValue(stmtCtx *stmtctx.StatementContext, col *model.ColumnInfo, if !checkCanConvertInPointGet(col, *d) { return nil } + // As in buildFromBinOp in util/ranger, when we build key from the expression to do range scan or point get on + // a string column, we should set the collation of the string datum to collation of the column. + if col.FieldType.EvalType() == types.ETString && (d.Kind() == types.KindString || d.Kind() == types.KindBinaryLiteral) { + d.SetString(d.GetString(), col.FieldType.GetCollate()) + } dVal, err := d.ConvertTo(stmtCtx.TypeCtx(), &col.FieldType) if err != nil { return nil @@ -1657,7 +1702,7 @@ func buildPointUpdatePlan(ctx sessionctx.Context, pointPlan PhysicalPlan, dbName VirtualAssignmentsOffset: len(orderedList), }.Init(ctx) updatePlan.names = pointPlan.OutputNames() - is := ctx.GetInfoSchema().(infoschema.InfoSchema) + is := sessiontxn.GetTxnManager(ctx).GetTxnInfoSchema() t, _ := is.TableByID(tbl.ID) updatePlan.tblID2Table = map[int64]table.Table{ tbl.ID: t, @@ -1830,7 +1875,7 @@ func buildHandleCols(ctx sessionctx.Context, tbl *model.TableInfo, schema *expre return &IntHandleCols{col: handleCol} } -func getPartitionInfo(ctx sessionctx.Context, tbl *model.TableInfo, pairs []nameValuePair) (*model.PartitionDefinition, int, int, bool) { +func getPartitionDef(ctx sessionctx.Context, tbl *model.TableInfo, pairs []nameValuePair) (*model.PartitionDefinition, int, int, bool) { partitionExpr := getPartitionExpr(ctx, tbl) if partitionExpr == nil { return nil, 0, 0, false @@ -1985,6 +2030,9 @@ func getColumnPosInIndex(idx *model.IndexInfo, colName *model.CIStr) int { return i } } + if idx.Global { + return GlobalWithoutColumnPos + } panic("unique index must include all partition columns") } diff --git a/pkg/planner/core/point_get_plan_test.go b/pkg/planner/core/point_get_plan_test.go index 2d4a5222e5d80..cde9eb6be3f26 100644 --- a/pkg/planner/core/point_get_plan_test.go +++ b/pkg/planner/core/point_get_plan_test.go @@ -16,12 +16,9 @@ package core_test import ( "context" - "fmt" - "strings" "testing" "time" - "github.com/pingcap/tidb/pkg/config" "github.com/pingcap/tidb/pkg/metrics" "github.com/pingcap/tidb/pkg/planner" "github.com/pingcap/tidb/pkg/planner/core" @@ -150,35 +147,6 @@ func TestPointGetPlanCache(t *testing.T) { require.Equal(t, float64(2), hit) } -func TestPointGetForUpdate(t *testing.T) { - store := testkit.CreateMockStore(t) - tk := testkit.NewTestKit(t, store) - tk.MustExec("use test") - tk.MustExec("create table fu (id int primary key, val int)") - tk.MustExec("insert into fu values (6, 6)") - - // In autocommit mode, outside a transaction, "for update" doesn't take effect. - checkUseForUpdate(tk, t, false) - - tk.MustExec("begin") - checkUseForUpdate(tk, t, true) - tk.MustExec("rollback") - - tk.MustExec("set @@session.autocommit = 0") - checkUseForUpdate(tk, t, true) - tk.MustExec("rollback") -} - -func checkUseForUpdate(tk *testkit.TestKit, t *testing.T, expectLock bool) { - res := tk.MustQuery("explain format = 'brief' select * from fu where id = 6 for update") - // Point_Get_1 1.00 root table:fu, handle:6 - opInfo := res.Rows()[0][4] - selectLock := strings.Contains(fmt.Sprintf("%s", opInfo), "lock") - require.Equal(t, expectLock, selectLock) - - tk.MustQuery("select * from fu where id = 6 for update").Check(testkit.Rows("6 6")) -} - // Test that the plan id will be reset before optimization every time. func TestPointGetId(t *testing.T) { store := testkit.CreateMockStore(t) @@ -204,22 +172,6 @@ func TestPointGetId(t *testing.T) { } } -func TestUpdateWithTableReadLockWillFail(t *testing.T) { - defer config.RestoreFunc()() - config.UpdateGlobal(func(conf *config.Config) { - conf.EnableTableLock = true - }) - store := testkit.CreateMockStore(t) - tk := testkit.NewTestKit(t, store) - tk.MustExec("use test") - tk.MustExec("create table tbllock(id int, c int);") - tk.MustExec("insert into tbllock values(1, 2), (2, 2);") - tk.MustExec("lock table tbllock read;") - _, err := tk.Exec("update tbllock set c = 3 where id = 2;") - require.Error(t, err) - require.Equal(t, "[schema:1099]Table 'tbllock' was locked with a READ lock and can't be updated", err.Error()) -} - func TestIssue20692(t *testing.T) { store := testkit.CreateMockStore(t) tk := testkit.NewTestKit(t, store) diff --git a/pkg/planner/core/preprocess.go b/pkg/planner/core/preprocess.go index 62664c61bf6b9..988e69e93adbb 100644 --- a/pkg/planner/core/preprocess.go +++ b/pkg/planner/core/preprocess.go @@ -1774,9 +1774,9 @@ func (p *preprocessor) hasAutoConvertWarning(colDef *ast.ColumnDef) bool { if !sessVars.SQLMode.HasStrictMode() && colDef.Tp.GetType() == mysql.TypeVarchar { colDef.Tp.SetType(mysql.TypeBlob) if colDef.Tp.GetCharset() == charset.CharsetBin { - sessVars.StmtCtx.AppendWarning(dbterror.ErrAutoConvert.GenWithStackByArgs(colDef.Name.Name.O, "VARBINARY", "BLOB")) + sessVars.StmtCtx.AppendWarning(dbterror.ErrAutoConvert.FastGenByArgs(colDef.Name.Name.O, "VARBINARY", "BLOB")) } else { - sessVars.StmtCtx.AppendWarning(dbterror.ErrAutoConvert.GenWithStackByArgs(colDef.Name.Name.O, "VARCHAR", "TEXT")) + sessVars.StmtCtx.AppendWarning(dbterror.ErrAutoConvert.FastGenByArgs(colDef.Name.Name.O, "VARCHAR", "TEXT")) } return true } diff --git a/pkg/planner/core/resolve_indices.go b/pkg/planner/core/resolve_indices.go index 77e4e8d163171..e40a107a88612 100644 --- a/pkg/planner/core/resolve_indices.go +++ b/pkg/planner/core/resolve_indices.go @@ -83,6 +83,7 @@ func refine4NeighbourProj(p, childProj *PhysicalProjection) { func (p *PhysicalHashJoin) ResolveIndicesItself() (err error) { lSchema := p.children[0].Schema() rSchema := p.children[1].Schema() + ctx := p.SCtx() for i, fun := range p.EqualConditions { lArg, err := fun.GetArgs()[0].ResolveIndices(lSchema) if err != nil { @@ -94,7 +95,7 @@ func (p *PhysicalHashJoin) ResolveIndicesItself() (err error) { return err } p.RightJoinKeys[i] = rArg.(*expression.Column) - p.EqualConditions[i] = expression.NewFunctionInternal(fun.GetCtx(), fun.FuncName.L, fun.GetType(), lArg, rArg).(*expression.ScalarFunction) + p.EqualConditions[i] = expression.NewFunctionInternal(ctx, fun.FuncName.L, fun.GetType(), lArg, rArg).(*expression.ScalarFunction) } for i, fun := range p.NAEqualConditions { lArg, err := fun.GetArgs()[0].ResolveIndices(lSchema) @@ -107,7 +108,7 @@ func (p *PhysicalHashJoin) ResolveIndicesItself() (err error) { return err } p.RightNAJoinKeys[i] = rArg.(*expression.Column) - p.NAEqualConditions[i] = expression.NewFunctionInternal(fun.GetCtx(), fun.FuncName.L, fun.GetType(), lArg, rArg).(*expression.ScalarFunction) + p.NAEqualConditions[i] = expression.NewFunctionInternal(ctx, fun.FuncName.L, fun.GetType(), lArg, rArg).(*expression.ScalarFunction) } for i, expr := range p.LeftConditions { p.LeftConditions[i], err = expr.ResolveIndices(lSchema) diff --git a/pkg/planner/core/rule_aggregation_elimination.go b/pkg/planner/core/rule_aggregation_elimination.go index 50f3d3a01621c..2da4cc5a90cd0 100644 --- a/pkg/planner/core/rule_aggregation_elimination.go +++ b/pkg/planner/core/rule_aggregation_elimination.go @@ -183,7 +183,7 @@ func CheckCanConvertAggToProj(agg *LogicalAggregation) bool { func ConvertAggToProj(agg *LogicalAggregation, schema *expression.Schema) (bool, *LogicalProjection) { proj := LogicalProjection{ Exprs: make([]expression.Expression, 0, len(agg.AggFuncs)), - }.Init(agg.SCtx(), agg.SelectBlockOffset()) + }.Init(agg.SCtx(), agg.QueryBlockOffset()) for _, fun := range agg.AggFuncs { ok, expr := rewriteExpr(agg.SCtx(), fun) if !ok { diff --git a/pkg/planner/core/rule_aggregation_push_down.go b/pkg/planner/core/rule_aggregation_push_down.go index a1296d41f1dfd..c3dcf84312fce 100644 --- a/pkg/planner/core/rule_aggregation_push_down.go +++ b/pkg/planner/core/rule_aggregation_push_down.go @@ -26,6 +26,7 @@ import ( "github.com/pingcap/tidb/pkg/planner/util" "github.com/pingcap/tidb/pkg/sessionctx" "github.com/pingcap/tidb/pkg/types" + h "github.com/pingcap/tidb/pkg/util/hint" ) type aggregationPushDownSolver struct { @@ -249,7 +250,7 @@ func (*aggregationPushDownSolver) decompose(ctx sessionctx.Context, aggFunc *agg // process it temporarily. If not, We will add additional group by columns and first row functions. We make a new aggregation operator. // If the pushed aggregation is grouped by unique key, it's no need to push it down. func (a *aggregationPushDownSolver) tryToPushDownAgg(oldAgg *LogicalAggregation, aggFuncs []*aggregation.AggFuncDesc, gbyCols []*expression.Column, - join *LogicalJoin, childIdx int, aggHints aggHintInfo, blockOffset int, opt *logicalOptimizeOp) (_ LogicalPlan, err error) { + join *LogicalJoin, childIdx int, aggHints h.AggHintInfo, blockOffset int, opt *logicalOptimizeOp) (_ LogicalPlan, err error) { child := join.children[childIdx] if aggregation.IsAllFirstRow(aggFuncs) { return child, nil @@ -326,7 +327,7 @@ func (*aggregationPushDownSolver) checkAllArgsColumn(fun *aggregation.AggFuncDes // 1. https://github.com/pingcap/tidb/issues/16355, push avg & distinct functions across join // 2. remove this method and use splitPartialAgg instead for clean code. func (a *aggregationPushDownSolver) makeNewAgg(ctx sessionctx.Context, aggFuncs []*aggregation.AggFuncDesc, - gbyCols []*expression.Column, aggHints aggHintInfo, blockOffset int, nullGenerating bool) (*LogicalAggregation, error) { + gbyCols []*expression.Column, aggHints h.AggHintInfo, blockOffset int, nullGenerating bool) (*LogicalAggregation, error) { agg := LogicalAggregation{ GroupByItems: expression.Column2Exprs(gbyCols), aggHints: aggHints, @@ -374,7 +375,7 @@ func (*aggregationPushDownSolver) splitPartialAgg(agg *LogicalAggregation) (push AggFuncs: partial.AggFuncs, GroupByItems: partial.GroupByItems, aggHints: agg.aggHints, - }.Init(agg.SCtx(), agg.SelectBlockOffset()) + }.Init(agg.SCtx(), agg.QueryBlockOffset()) pushedAgg.SetSchema(partial.Schema) return } @@ -387,19 +388,19 @@ func (*aggregationPushDownSolver) pushAggCrossUnion(agg *LogicalAggregation, uni AggFuncs: make([]*aggregation.AggFuncDesc, 0, len(agg.AggFuncs)), GroupByItems: make([]expression.Expression, 0, len(agg.GroupByItems)), aggHints: agg.aggHints, - }.Init(ctx, agg.SelectBlockOffset()) + }.Init(ctx, agg.QueryBlockOffset()) newAgg.SetSchema(agg.schema.Clone()) for _, aggFunc := range agg.AggFuncs { newAggFunc := aggFunc.Clone() newArgs := make([]expression.Expression, 0, len(newAggFunc.Args)) for _, arg := range newAggFunc.Args { - newArgs = append(newArgs, expression.ColumnSubstitute(arg, unionSchema, expression.Column2Exprs(unionChild.Schema().Columns))) + newArgs = append(newArgs, expression.ColumnSubstitute(ctx, arg, unionSchema, expression.Column2Exprs(unionChild.Schema().Columns))) } newAggFunc.Args = newArgs newAgg.AggFuncs = append(newAgg.AggFuncs, newAggFunc) } for _, gbyExpr := range agg.GroupByItems { - newExpr := expression.ColumnSubstitute(gbyExpr, unionSchema, expression.Column2Exprs(unionChild.Schema().Columns)) + newExpr := expression.ColumnSubstitute(ctx, gbyExpr, unionSchema, expression.Column2Exprs(unionChild.Schema().Columns)) newAgg.GroupByItems = append(newAgg.GroupByItems, newExpr) // TODO: if there is a duplicated first_row function, we can delete it. firstRow, err := aggregation.NewAggFuncDesc(agg.SCtx(), ast.AggFuncFirstRow, []expression.Expression{gbyExpr}, false) @@ -492,7 +493,7 @@ func (a *aggregationPushDownSolver) aggPushDown(p LogicalPlan, opt *logicalOptim if rightInvalid { rChild = join.children[1] } else { - rChild, err = a.tryToPushDownAgg(agg, rightAggFuncs, rightGbyCols, join, 1, agg.aggHints, agg.SelectBlockOffset(), opt) + rChild, err = a.tryToPushDownAgg(agg, rightAggFuncs, rightGbyCols, join, 1, agg.aggHints, agg.QueryBlockOffset(), opt) if err != nil { return nil, err } @@ -500,7 +501,7 @@ func (a *aggregationPushDownSolver) aggPushDown(p LogicalPlan, opt *logicalOptim if leftInvalid { lChild = join.children[0] } else { - lChild, err = a.tryToPushDownAgg(agg, leftAggFuncs, leftGbyCols, join, 0, agg.aggHints, agg.SelectBlockOffset(), opt) + lChild, err = a.tryToPushDownAgg(agg, leftAggFuncs, leftGbyCols, join, 0, agg.aggHints, agg.QueryBlockOffset(), opt) if err != nil { return nil, err } @@ -551,10 +552,11 @@ func (a *aggregationPushDownSolver) aggPushDown(p LogicalPlan, opt *logicalOptim // push aggregation across projection // TODO: This optimization is not always reasonable. We have not supported pushing projection to kv layer yet, // so we must do this optimization. + ctx := p.SCtx() noSideEffects := true newGbyItems := make([]expression.Expression, 0, len(agg.GroupByItems)) for _, gbyItem := range agg.GroupByItems { - newGbyItems = append(newGbyItems, expression.ColumnSubstitute(gbyItem, proj.schema, proj.Exprs)) + newGbyItems = append(newGbyItems, expression.ColumnSubstitute(ctx, gbyItem, proj.schema, proj.Exprs)) if ExprsHasSideEffects(newGbyItems) { noSideEffects = false break @@ -569,7 +571,7 @@ func (a *aggregationPushDownSolver) aggPushDown(p LogicalPlan, opt *logicalOptim oldAggFuncsArgs = append(oldAggFuncsArgs, aggFunc.Args) newArgs := make([]expression.Expression, 0, len(aggFunc.Args)) for _, arg := range aggFunc.Args { - newArgs = append(newArgs, expression.ColumnSubstitute(arg, proj.schema, proj.Exprs)) + newArgs = append(newArgs, expression.ColumnSubstitute(ctx, arg, proj.schema, proj.Exprs)) } if ExprsHasSideEffects(newArgs) { noSideEffects = false @@ -581,7 +583,7 @@ func (a *aggregationPushDownSolver) aggPushDown(p LogicalPlan, opt *logicalOptim oldAggOrderItems = append(oldAggOrderItems, aggFunc.OrderByItems) newOrderByItems := make([]expression.Expression, 0, len(aggFunc.OrderByItems)) for _, oby := range aggFunc.OrderByItems { - newOrderByItems = append(newOrderByItems, expression.ColumnSubstitute(oby.Expr, proj.schema, proj.Exprs)) + newOrderByItems = append(newOrderByItems, expression.ColumnSubstitute(ctx, oby.Expr, proj.schema, proj.Exprs)) } if ExprsHasSideEffects(newOrderByItems) { noSideEffects = false @@ -606,7 +608,7 @@ func (a *aggregationPushDownSolver) aggPushDown(p LogicalPlan, opt *logicalOptim break } } - for j, item := range newAggOrderItems { + for j, item := range newAggOrderItems[i] { if item == nil { continue } diff --git a/pkg/planner/core/rule_aggregation_skew_rewrite.go b/pkg/planner/core/rule_aggregation_skew_rewrite.go index 5188f0ad49149..5f40a44bdcc97 100644 --- a/pkg/planner/core/rule_aggregation_skew_rewrite.go +++ b/pkg/planner/core/rule_aggregation_skew_rewrite.go @@ -194,7 +194,7 @@ func (a *skewDistinctAggRewriter) rewriteSkewDistinctAgg(agg *LogicalAggregation AggFuncs: bottomAggFuncs, GroupByItems: bottomAggGroupbyItems, aggHints: agg.aggHints, - }.Init(agg.SCtx(), agg.SelectBlockOffset()) + }.Init(agg.SCtx(), agg.QueryBlockOffset()) bottomAgg.SetChildren(agg.children...) bottomAgg.SetSchema(bottomAggSchema) @@ -202,7 +202,7 @@ func (a *skewDistinctAggRewriter) rewriteSkewDistinctAgg(agg *LogicalAggregation AggFuncs: topAggFuncs, GroupByItems: agg.GroupByItems, aggHints: agg.aggHints, - }.Init(agg.SCtx(), agg.SelectBlockOffset()) + }.Init(agg.SCtx(), agg.QueryBlockOffset()) topAgg.SetChildren(bottomAgg) topAgg.SetSchema(topAggSchema) @@ -215,7 +215,7 @@ func (a *skewDistinctAggRewriter) rewriteSkewDistinctAgg(agg *LogicalAggregation // we have to return a project operator that casts decimal to bigint proj := LogicalProjection{ Exprs: make([]expression.Expression, 0, len(agg.AggFuncs)), - }.Init(agg.SCtx(), agg.SelectBlockOffset()) + }.Init(agg.SCtx(), agg.QueryBlockOffset()) for _, column := range topAggSchema.Columns { proj.Exprs = append(proj.Exprs, column.Clone()) } diff --git a/pkg/planner/core/rule_column_pruning.go b/pkg/planner/core/rule_column_pruning.go index dce44e08ac1c0..159c075d98951 100644 --- a/pkg/planner/core/rule_column_pruning.go +++ b/pkg/planner/core/rule_column_pruning.go @@ -275,6 +275,9 @@ func (p *LogicalUnionAll) PruneColumns(parentUsedCols []*expression.Column, opt if !hasBeenUsed { parentUsedCols = make([]*expression.Column, len(p.schema.Columns)) copy(parentUsedCols, p.schema.Columns) + for i := range used { + used[i] = true + } } for _, child := range p.Children() { err := child.PruneColumns(parentUsedCols, opt, p) @@ -284,16 +287,14 @@ func (p *LogicalUnionAll) PruneColumns(parentUsedCols []*expression.Column, opt } prunedColumns := make([]*expression.Column, 0) - if hasBeenUsed { - // keep the schema of LogicalUnionAll same as its children's - used := expression.GetUsedList(p.SCtx(), p.children[0].Schema().Columns, p.schema) - for i := len(used) - 1; i >= 0; i-- { - if !used[i] { - prunedColumns = append(prunedColumns, p.schema.Columns[i]) - p.schema.Columns = append(p.schema.Columns[:i], p.schema.Columns[i+1:]...) - } + for i := len(used) - 1; i >= 0; i-- { + if !used[i] { + prunedColumns = append(prunedColumns, p.schema.Columns[i]) + p.schema.Columns = append(p.schema.Columns[:i], p.schema.Columns[i+1:]...) } - appendColumnPruneTraceStep(p, prunedColumns, opt) + } + appendColumnPruneTraceStep(p, prunedColumns, opt) + if hasBeenUsed { // It's possible that the child operator adds extra columns to the schema. // Currently, (*LogicalAggregation).PruneColumns() might do this. // But we don't need such columns, so we add an extra Projection to prune this column when this happened. @@ -304,7 +305,7 @@ func (p *LogicalUnionAll) PruneColumns(parentUsedCols []*expression.Column, opt for j, col := range schema.Columns { exprs[j] = col } - proj := LogicalProjection{Exprs: exprs, AvoidColumnEvaluator: true}.Init(p.SCtx(), p.SelectBlockOffset()) + proj := LogicalProjection{Exprs: exprs, AvoidColumnEvaluator: true}.Init(p.SCtx(), p.QueryBlockOffset()) proj.SetSchema(schema) proj.SetChildren(child) diff --git a/pkg/planner/core/rule_constant_propagation.go b/pkg/planner/core/rule_constant_propagation.go index 4c2071fc8610b..106719600bf0b 100644 --- a/pkg/planner/core/rule_constant_propagation.go +++ b/pkg/planner/core/rule_constant_propagation.go @@ -269,7 +269,7 @@ func validCompareConstantPredicate(candidatePredicate expression.Expression) boo func addCandidateSelection(currentPlan LogicalPlan, currentChildIdx int, parentPlan LogicalPlan, candidatePredicates []expression.Expression, opt *logicalOptimizeOp) (newRoot LogicalPlan) { // generate a new selection for candidatePredicates - selection := LogicalSelection{Conditions: candidatePredicates}.Init(currentPlan.SCtx(), currentPlan.SelectBlockOffset()) + selection := LogicalSelection{Conditions: candidatePredicates}.Init(currentPlan.SCtx(), currentPlan.QueryBlockOffset()) // add selection above of p if parentPlan == nil { newRoot = selection diff --git a/pkg/planner/core/rule_decorrelate.go b/pkg/planner/core/rule_decorrelate.go index 56bb103894776..2deccf3befdca 100644 --- a/pkg/planner/core/rule_decorrelate.go +++ b/pkg/planner/core/rule_decorrelate.go @@ -414,7 +414,7 @@ func (s *decorrelateSolver) optimize(ctx context.Context, p LogicalPlan, opt *lo defaultValueMap := s.aggDefaultValueMap(agg) // We should use it directly, rather than building a projection. if len(defaultValueMap) > 0 { - proj := LogicalProjection{}.Init(agg.SCtx(), agg.SelectBlockOffset()) + proj := LogicalProjection{}.Init(agg.SCtx(), agg.QueryBlockOffset()) proj.SetSchema(apply.schema) proj.Exprs = expression.Column2Exprs(apply.schema.Columns) for i, val := range defaultValueMap { diff --git a/pkg/planner/core/rule_derive_topn_from_window.go b/pkg/planner/core/rule_derive_topn_from_window.go index 4c3f8845381b6..d962387be4d7a 100644 --- a/pkg/planner/core/rule_derive_topn_from_window.go +++ b/pkg/planner/core/rule_derive_topn_from_window.go @@ -144,7 +144,7 @@ func (s *LogicalSelection) deriveTopN(opt *logicalOptimizeOp) LogicalPlan { byItems = append(byItems, &util.ByItems{Expr: col.Col, Desc: col.Desc}) } // Build derived Limit - derivedTopN := LogicalTopN{Count: limitValue, ByItems: byItems, PartitionBy: child.GetPartitionBy()}.Init(grandChild.SCtx(), grandChild.SelectBlockOffset()) + derivedTopN := LogicalTopN{Count: limitValue, ByItems: byItems, PartitionBy: child.GetPartitionBy()}.Init(grandChild.SCtx(), grandChild.QueryBlockOffset()) derivedTopN.SetChildren(grandChild) /* return select->datasource->topN->window */ child.SetChildren(derivedTopN) diff --git a/pkg/planner/core/rule_eliminate_projection.go b/pkg/planner/core/rule_eliminate_projection.go index 46b2d761e6095..36d7dbc82fd8d 100644 --- a/pkg/planner/core/rule_eliminate_projection.go +++ b/pkg/planner/core/rule_eliminate_projection.go @@ -209,9 +209,10 @@ func (pe *projectionEliminator) eliminate(p LogicalPlan, replace map[string]*exp // eliminate duplicate projection: projection with child projection if isProj { if child, ok := p.Children()[0].(*LogicalProjection); ok && !ExprsHasSideEffects(child.Exprs) { + ctx := p.SCtx() for i := range proj.Exprs { proj.Exprs[i] = ReplaceColumnOfExpr(proj.Exprs[i], child, child.Schema()) - foldedExpr := expression.FoldConstant(proj.Exprs[i]) + foldedExpr := expression.FoldConstant(ctx, proj.Exprs[i]) // the folded expr should have the same null flag with the original expr, especially for the projection under union, so forcing it here. foldedExpr.GetType().SetFlag((foldedExpr.GetType().GetFlag() & ^mysql.NotNullFlag) | (proj.Exprs[i].GetType().GetFlag() & mysql.NotNullFlag)) proj.Exprs[i] = foldedExpr diff --git a/pkg/planner/core/rule_generate_column_substitute.go b/pkg/planner/core/rule_generate_column_substitute.go index 5e5cc2b28f12c..c2d92af20628e 100644 --- a/pkg/planner/core/rule_generate_column_substitute.go +++ b/pkg/planner/core/rule_generate_column_substitute.go @@ -21,6 +21,7 @@ import ( "github.com/pingcap/tidb/pkg/expression" "github.com/pingcap/tidb/pkg/parser/ast" "github.com/pingcap/tidb/pkg/types" + h "github.com/pingcap/tidb/pkg/util/hint" ) type gcSubstituter struct { @@ -63,7 +64,7 @@ func collectGenerateColumn(lp LogicalPlan, exprToColumn ExprColumnMap) { // detect the read_from_storage(tiflash) hints, since virtual column will // block the mpp task spreading (only supporting MPP table scan), causing // mpp plan fail the cost comparison with tikv index plan. - if ds.preferStoreType&preferTiFlash != 0 { + if ds.preferStoreType&h.PreferTiFlash != 0 { return } for _, p := range ds.possibleAccessPaths { diff --git a/pkg/planner/core/rule_inject_extra_projection.go b/pkg/planner/core/rule_inject_extra_projection.go index 5e93699b0e6e7..5d1983df08be6 100644 --- a/pkg/planner/core/rule_inject_extra_projection.go +++ b/pkg/planner/core/rule_inject_extra_projection.go @@ -189,7 +189,7 @@ func InjectProjBelowAgg(aggPlan PhysicalPlan, aggFuncs []*aggregation.AggFuncDes proj := PhysicalProjection{ Exprs: projExprs, AvoidColumnEvaluator: false, - }.Init(aggPlan.SCtx(), child.StatsInfo().ScaleByExpectCnt(prop.ExpectedCnt), aggPlan.SelectBlockOffset(), prop) + }.Init(aggPlan.SCtx(), child.StatsInfo().ScaleByExpectCnt(prop.ExpectedCnt), aggPlan.QueryBlockOffset(), prop) proj.SetSchema(expression.NewSchema(projSchemaCols...)) proj.SetChildren(child) @@ -223,7 +223,7 @@ func InjectProjBelowSort(p PhysicalPlan, orderByItems []*util.ByItems) PhysicalP topProj := PhysicalProjection{ Exprs: topProjExprs, AvoidColumnEvaluator: false, - }.Init(p.SCtx(), p.StatsInfo(), p.SelectBlockOffset(), nil) + }.Init(p.SCtx(), p.StatsInfo(), p.QueryBlockOffset(), nil) topProj.SetSchema(p.Schema().Clone()) topProj.SetChildren(p) @@ -256,7 +256,7 @@ func InjectProjBelowSort(p PhysicalPlan, orderByItems []*util.ByItems) PhysicalP bottomProj := PhysicalProjection{ Exprs: bottomProjExprs, AvoidColumnEvaluator: false, - }.Init(p.SCtx(), childPlan.StatsInfo().ScaleByExpectCnt(childProp.ExpectedCnt), p.SelectBlockOffset(), childProp) + }.Init(p.SCtx(), childPlan.StatsInfo().ScaleByExpectCnt(childProp.ExpectedCnt), p.QueryBlockOffset(), childProp) bottomProj.SetSchema(expression.NewSchema(bottomProjSchemaCols...)) bottomProj.SetChildren(childPlan) p.SetChildren(bottomProj) @@ -306,7 +306,7 @@ func TurnNominalSortIntoProj(p PhysicalPlan, onlyColumn bool, orderByItems []*ut bottomProj := PhysicalProjection{ Exprs: bottomProjExprs, AvoidColumnEvaluator: false, - }.Init(p.SCtx(), childPlan.StatsInfo().ScaleByExpectCnt(childProp.ExpectedCnt), p.SelectBlockOffset(), childProp) + }.Init(p.SCtx(), childPlan.StatsInfo().ScaleByExpectCnt(childProp.ExpectedCnt), p.QueryBlockOffset(), childProp) bottomProj.SetSchema(expression.NewSchema(bottomProjSchemaCols...)) bottomProj.SetChildren(childPlan) @@ -319,7 +319,7 @@ func TurnNominalSortIntoProj(p PhysicalPlan, onlyColumn bool, orderByItems []*ut topProj := PhysicalProjection{ Exprs: topProjExprs, AvoidColumnEvaluator: false, - }.Init(p.SCtx(), childPlan.StatsInfo().ScaleByExpectCnt(childProp.ExpectedCnt), p.SelectBlockOffset(), childProp) + }.Init(p.SCtx(), childPlan.StatsInfo().ScaleByExpectCnt(childProp.ExpectedCnt), p.QueryBlockOffset(), childProp) topProj.SetSchema(childPlan.Schema().Clone()) topProj.SetChildren(bottomProj) diff --git a/pkg/planner/core/rule_join_reorder.go b/pkg/planner/core/rule_join_reorder.go index 271778c7c8bdc..4ca8e625b1d11 100644 --- a/pkg/planner/core/rule_join_reorder.go +++ b/pkg/planner/core/rule_join_reorder.go @@ -23,6 +23,7 @@ import ( "github.com/pingcap/tidb/pkg/expression" "github.com/pingcap/tidb/pkg/parser/ast" "github.com/pingcap/tidb/pkg/sessionctx" + h "github.com/pingcap/tidb/pkg/util/hint" "github.com/pingcap/tidb/pkg/util/plancodec" "github.com/pingcap/tidb/pkg/util/tracing" ) @@ -37,7 +38,7 @@ func extractJoinGroup(p LogicalPlan) *joinGroupResult { joinMethodHintInfo := make(map[int]*joinMethodHint) var ( group []LogicalPlan - joinOrderHintInfo []*tableHintInfo + joinOrderHintInfo []*h.TableHintInfo eqEdges []*expression.ScalarFunction otherConds []expression.Expression joinTypes []*joinTypeWithExtMsg @@ -270,19 +271,19 @@ func (s *joinReOrderSolver) optimizeRecursive(ctx sessionctx.Context, p LogicalP leadingHintInfo, hasDiffLeadingHint := checkAndGenerateLeadingHint(joinOrderHintInfo) if hasDiffLeadingHint { - ctx.GetSessionVars().StmtCtx.AppendWarning(ErrInternal.GenWithStack("We can only use one leading hint at most, when multiple leading hints are used, all leading hints will be invalid")) + ctx.GetSessionVars().StmtCtx.AppendWarning(ErrInternal.FastGen("We can only use one leading hint at most, when multiple leading hints are used, all leading hints will be invalid")) } - if leadingHintInfo != nil && leadingHintInfo.leadingJoinOrder != nil { + if leadingHintInfo != nil && leadingHintInfo.LeadingJoinOrder != nil { if useGreedy { ok, leftJoinGroup := baseGroupSolver.generateLeadingJoinGroup(curJoinGroup, leadingHintInfo, hasOuterJoin) if !ok { - ctx.GetSessionVars().StmtCtx.AppendWarning(ErrInternal.GenWithStack("leading hint is inapplicable, check if the leading hint table is valid")) + ctx.GetSessionVars().StmtCtx.AppendWarning(ErrInternal.FastGen("leading hint is inapplicable, check if the leading hint table is valid")) } else { curJoinGroup = leftJoinGroup } } else { - ctx.GetSessionVars().StmtCtx.AppendWarning(ErrInternal.GenWithStack("leading hint is inapplicable for the DP join reorder algorithm")) + ctx.GetSessionVars().StmtCtx.AppendWarning(ErrInternal.FastGen("leading hint is inapplicable for the DP join reorder algorithm")) } } @@ -315,7 +316,7 @@ func (s *joinReOrderSolver) optimizeRecursive(ctx sessionctx.Context, p LogicalP if schemaChanged { proj := LogicalProjection{ Exprs: expression.Column2Exprs(originalSchema.Columns), - }.Init(p.SCtx(), p.SelectBlockOffset()) + }.Init(p.SCtx(), p.QueryBlockOffset()) // Clone the schema here, because the schema may be changed by column pruning rules. proj.SetSchema(originalSchema.Clone()) proj.SetChildren(p) @@ -324,7 +325,7 @@ func (s *joinReOrderSolver) optimizeRecursive(ctx sessionctx.Context, p LogicalP return p, nil } if len(curJoinGroup) == 1 && joinOrderHintInfo != nil { - ctx.GetSessionVars().StmtCtx.AppendWarning(ErrInternal.GenWithStack("leading hint is inapplicable, check the join type or the join algorithm hint")) + ctx.GetSessionVars().StmtCtx.AppendWarning(ErrInternal.FastGen("leading hint is inapplicable, check the join type or the join algorithm hint")) } newChildren := make([]LogicalPlan, 0, len(p.Children())) for _, child := range p.Children() { @@ -345,9 +346,9 @@ func (s *joinReOrderSolver) optimizeRecursive(ctx sessionctx.Context, p LogicalP // The Join Group {t1, t2, t3} contains two leading hints includes leading(t3) and leading(t1). // Although they are in different query blocks, they are conflicting. // In addition, the table alias 't4' cannot be recognized because of the join group. -func checkAndGenerateLeadingHint(hintInfo []*tableHintInfo) (*tableHintInfo, bool) { +func checkAndGenerateLeadingHint(hintInfo []*h.TableHintInfo) (*h.TableHintInfo, bool) { leadingHintNum := len(hintInfo) - var leadingHintInfo *tableHintInfo + var leadingHintInfo *h.TableHintInfo hasDiffLeadingHint := false if leadingHintNum > 0 { leadingHintInfo = hintInfo[0] @@ -367,7 +368,7 @@ func checkAndGenerateLeadingHint(hintInfo []*tableHintInfo) (*tableHintInfo, boo type joinMethodHint struct { preferredJoinMethod uint - joinMethodHintInfo *tableHintInfo + joinMethodHintInfo *h.TableHintInfo } // basicJoinGroupInfo represents basic information for a join group in the join reorder process. @@ -384,7 +385,7 @@ type basicJoinGroupInfo struct { type joinGroupResult struct { group []LogicalPlan hasOuterJoin bool - joinOrderHintInfo []*tableHintInfo + joinOrderHintInfo []*h.TableHintInfo *basicJoinGroupInfo } @@ -396,7 +397,7 @@ type baseSingleGroupJoinOrderSolver struct { *basicJoinGroupInfo } -func (s *baseSingleGroupJoinOrderSolver) generateLeadingJoinGroup(curJoinGroup []LogicalPlan, hintInfo *tableHintInfo, hasOuterJoin bool) (bool, []LogicalPlan) { +func (s *baseSingleGroupJoinOrderSolver) generateLeadingJoinGroup(curJoinGroup []LogicalPlan, hintInfo *h.TableHintInfo, hasOuterJoin bool) (bool, []LogicalPlan) { var leadingJoinGroup []LogicalPlan leftJoinGroup := make([]LogicalPlan, len(curJoinGroup)) copy(leftJoinGroup, curJoinGroup) @@ -404,14 +405,14 @@ func (s *baseSingleGroupJoinOrderSolver) generateLeadingJoinGroup(curJoinGroup [ if p := s.ctx.GetSessionVars().PlannerSelectBlockAsName.Load(); p != nil { queryBlockNames = *p } - for _, hintTbl := range hintInfo.leadingJoinOrder { + for _, hintTbl := range hintInfo.LeadingJoinOrder { match := false for i, joinGroup := range leftJoinGroup { - tableAlias := extractTableAlias(joinGroup, joinGroup.SelectBlockOffset()) + tableAlias := extractTableAlias(joinGroup, joinGroup.QueryBlockOffset()) if tableAlias == nil { continue } - if hintTbl.dbName.L == tableAlias.dbName.L && hintTbl.tblName.L == tableAlias.tblName.L && hintTbl.selectOffset == tableAlias.selectOffset { + if (hintTbl.DBName.L == tableAlias.DBName.L || hintTbl.DBName.L == "*") && hintTbl.TblName.L == tableAlias.TblName.L && hintTbl.SelectOffset == tableAlias.SelectOffset { match = true leadingJoinGroup = append(leadingJoinGroup, joinGroup) leftJoinGroup = append(leftJoinGroup[:i], leftJoinGroup[i+1:]...) @@ -425,10 +426,10 @@ func (s *baseSingleGroupJoinOrderSolver) generateLeadingJoinGroup(curJoinGroup [ // consider query block alias: select /*+ leading(t1, t2) */ * from (select ...) t1, t2 ... groupIdx := -1 for i, joinGroup := range leftJoinGroup { - blockOffset := joinGroup.SelectBlockOffset() + blockOffset := joinGroup.QueryBlockOffset() if blockOffset > 1 && blockOffset < len(queryBlockNames) { blockName := queryBlockNames[blockOffset] - if hintTbl.dbName.L == blockName.DBName.L && hintTbl.tblName.L == blockName.TableName.L { + if hintTbl.DBName.L == blockName.DBName.L && hintTbl.TblName.L == blockName.TableName.L { // this can happen when multiple join groups are from the same block, for example: // select /*+ leading(tx) */ * from (select * from t1, t2 ...) tx, ... // `tx` is split to 2 join groups `t1` and `t2`, and they have the same block offset. @@ -446,7 +447,7 @@ func (s *baseSingleGroupJoinOrderSolver) generateLeadingJoinGroup(curJoinGroup [ leftJoinGroup = append(leftJoinGroup[:groupIdx], leftJoinGroup[groupIdx+1:]...) } } - if len(leadingJoinGroup) != len(hintInfo.leadingJoinOrder) || leadingJoinGroup == nil { + if len(leadingJoinGroup) != len(hintInfo.LeadingJoinOrder) || leadingJoinGroup == nil { return false, nil } leadingJoin := leadingJoinGroup[0] @@ -601,7 +602,7 @@ func (s *baseSingleGroupJoinOrderSolver) makeBushyJoin(cartesianJoinGroup []Logi if len(s.otherConds) > 0 { additionSelection := LogicalSelection{ Conditions: s.otherConds, - }.Init(cartesianJoinGroup[0].SCtx(), cartesianJoinGroup[0].SelectBlockOffset()) + }.Init(cartesianJoinGroup[0].SCtx(), cartesianJoinGroup[0].QueryBlockOffset()) additionSelection.SetChildren(cartesianJoinGroup[0]) cartesianJoinGroup[0] = additionSelection } @@ -609,8 +610,8 @@ func (s *baseSingleGroupJoinOrderSolver) makeBushyJoin(cartesianJoinGroup []Logi } func (s *baseSingleGroupJoinOrderSolver) newCartesianJoin(lChild, rChild LogicalPlan) *LogicalJoin { - offset := lChild.SelectBlockOffset() - if offset != rChild.SelectBlockOffset() { + offset := lChild.QueryBlockOffset() + if offset != rChild.QueryBlockOffset() { offset = -1 } join := LogicalJoin{ diff --git a/pkg/planner/core/rule_join_reorder_greedy.go b/pkg/planner/core/rule_join_reorder_greedy.go index 2cc01d48dd55e..0e39c492c0d3a 100644 --- a/pkg/planner/core/rule_join_reorder_greedy.go +++ b/pkg/planner/core/rule_join_reorder_greedy.go @@ -79,7 +79,10 @@ func (s *joinReorderGreedySolver) solve(joinNodePlans []LogicalPlan, tracer *joi // Getting here means that there is no join condition between the table used in the leading hint and other tables // For example: select /*+ leading(t3) */ * from t1 join t2 on t1.a=t2.a cross join t3 // We can not let table t3 join first. - s.ctx.GetSessionVars().StmtCtx.AppendWarning(ErrInternal.GenWithStack("leading hint is inapplicable, check if the leading hint table has join conditions with other tables")) + // TODO(hawkingrei): we find the problem in the TestHint. + // `select * from t1, t2, t3 union all select /*+ leading(t3, t2) */ * from t1, t2, t3 union all select * from t1, t2, t3` + // this sql should not return the warning. but It will not affect the result. so we will fix it as soon as possible. + s.ctx.GetSessionVars().StmtCtx.AppendWarning(ErrInternal.FastGen("leading hint is inapplicable, check if the leading hint table has join conditions with other tables")) } cartesianGroup = append(cartesianGroup, newNode.p) } diff --git a/pkg/planner/core/rule_join_reorder_test.go b/pkg/planner/core/rule_join_reorder_test.go deleted file mode 100644 index 3298c0d87dbbd..0000000000000 --- a/pkg/planner/core/rule_join_reorder_test.go +++ /dev/null @@ -1,70 +0,0 @@ -// Copyright 2022 PingCAP, 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. - -package core_test - -import ( - "testing" - - "github.com/pingcap/tidb/pkg/testkit" - "github.com/stretchr/testify/require" -) - -func TestJoinOrderHintWithBinding(t *testing.T) { - store := testkit.CreateMockStore(t) - - tk := testkit.NewTestKit(t, store) - tk.MustExec("use test") - tk.MustExec("drop table if exists t, t1, t2, t3;") - tk.MustExec("create table t(a int, b int, key(a));") - tk.MustExec("create table t1(a int, b int, key(a));") - tk.MustExec("create table t2(a int, b int, key(a));") - tk.MustExec("create table t3(a int, b int, key(a));") - - tk.MustExec("select * from t1 join t2 on t1.a=t2.a join t3 on t2.b=t3.b") - tk.MustQuery("select @@last_plan_from_binding").Check(testkit.Rows("0")) - tk.MustExec("create global binding for select * from t1 join t2 on t1.a=t2.a join t3 on t2.b=t3.b using select /*+ straight_join() */ * from t1 join t2 on t1.a=t2.a join t3 on t2.b=t3.b") - tk.MustExec("select * from t1 join t2 on t1.a=t2.a join t3 on t2.b=t3.b") - tk.MustQuery("select @@last_plan_from_binding").Check(testkit.Rows("1")) - res := tk.MustQuery("show global bindings").Rows() - require.Equal(t, res[0][0], "select * from ( `test` . `t1` join `test` . `t2` on `t1` . `a` = `t2` . `a` ) join `test` . `t3` on `t2` . `b` = `t3` . `b`", "SELECT /*+ straight_join()*/ * FROM (`test`.`t1` JOIN `test`.`t2` ON `t1`.`a` = `t2`.`a`) JOIN `test`.`t3` ON `t2`.`b` = `t3`.`b`") - - tk.MustExec("drop global binding for select * from t1 join t2 on t1.a=t2.a join t3 on t2.b=t3.b") - tk.MustExec("select * from t1 join t2 on t1.a=t2.a join t3 on t2.b=t3.b") - tk.MustQuery("select @@last_plan_from_binding").Check(testkit.Rows("0")) - res = tk.MustQuery("show global bindings").Rows() - require.Equal(t, len(res), 0) - - tk.MustExec("create global binding for select * from t1 join t2 on t1.a=t2.a join t3 on t2.b=t3.b using select /*+ leading(t3) */ * from t1 join t2 on t1.a=t2.a join t3 on t2.b=t3.b") - tk.MustExec("select * from t1 join t2 on t1.a=t2.a join t3 on t2.b=t3.b") - tk.MustQuery("select @@last_plan_from_binding").Check(testkit.Rows("1")) - res = tk.MustQuery("show global bindings").Rows() - require.Equal(t, res[0][0], "select * from ( `test` . `t1` join `test` . `t2` on `t1` . `a` = `t2` . `a` ) join `test` . `t3` on `t2` . `b` = `t3` . `b`") - - tk.MustExec("drop global binding for select * from t1 join t2 on t1.a=t2.a join t3 on t2.b=t3.b") - - // test for outer join - tk.MustExec("select * from t1 join t2 on t1.a=t2.a left join t3 on t2.b=t3.b") - tk.MustQuery("select @@last_plan_from_binding").Check(testkit.Rows("0")) - res = tk.MustQuery("show global bindings").Rows() - require.Equal(t, len(res), 0) - - tk.MustExec("create global binding for select * from t1 join t2 on t1.a=t2.a left join t3 on t2.b=t3.b using select /*+ leading(t2) */ * from t1 join t2 on t1.a=t2.a left join t3 on t2.b=t3.b") - tk.MustExec("select * from t1 join t2 on t1.a=t2.a left join t3 on t2.b=t3.b") - tk.MustQuery("select @@last_plan_from_binding").Check(testkit.Rows("1")) - res = tk.MustQuery("show global bindings").Rows() - require.Equal(t, res[0][0], "select * from ( `test` . `t1` join `test` . `t2` on `t1` . `a` = `t2` . `a` ) left join `test` . `t3` on `t2` . `b` = `t3` . `b`") - - tk.MustExec("drop global binding for select * from t1 join t2 on t1.a=t2.a join t3 on t2.b=t3.b") -} diff --git a/pkg/planner/core/rule_max_min_eliminate.go b/pkg/planner/core/rule_max_min_eliminate.go index 552b2b5a4f08b..70f3ed01d4ec1 100644 --- a/pkg/planner/core/rule_max_min_eliminate.go +++ b/pkg/planner/core/rule_max_min_eliminate.go @@ -47,7 +47,7 @@ func (*maxMinEliminator) composeAggsByInnerJoin(originAgg *LogicalAggregation, a sctx := plan.SCtx() joins := make([]*LogicalJoin, 0) for i := 1; i < len(aggs); i++ { - join := LogicalJoin{JoinType: InnerJoin}.Init(sctx, plan.SelectBlockOffset()) + join := LogicalJoin{JoinType: InnerJoin}.Init(sctx, plan.QueryBlockOffset()) join.SetChildren(plan, aggs[i]) join.schema = buildLogicalJoinSchema(InnerJoin, join) join.cartesianJoin = true @@ -110,14 +110,14 @@ func (a *maxMinEliminator) cloneSubPlans(plan LogicalPlan) LogicalPlan { case *LogicalSelection: newConditions := make([]expression.Expression, len(p.Conditions)) copy(newConditions, p.Conditions) - sel := LogicalSelection{Conditions: newConditions}.Init(p.SCtx(), p.SelectBlockOffset()) + sel := LogicalSelection{Conditions: newConditions}.Init(p.SCtx(), p.QueryBlockOffset()) sel.SetChildren(a.cloneSubPlans(p.children[0])) return sel case *DataSource: // Quick clone a DataSource. // ReadOnly fields uses a shallow copy, while the fields which will be overwritten must use a deep copy. newDs := *p - newDs.baseLogicalPlan = newBaseLogicalPlan(p.SCtx(), p.TP(), &newDs, p.SelectBlockOffset()) + newDs.baseLogicalPlan = newBaseLogicalPlan(p.SCtx(), p.TP(), &newDs, p.QueryBlockOffset()) newDs.schema = p.schema.Clone() newDs.Columns = make([]*model.ColumnInfo, len(p.Columns)) copy(newDs.Columns, p.Columns) @@ -152,7 +152,7 @@ func (a *maxMinEliminator) splitAggFuncAndCheckIndices(agg *LogicalAggregation, aggs = make([]*LogicalAggregation, 0, len(agg.AggFuncs)) // we can split the aggregation only if all of the aggFuncs pass the check. for i, f := range agg.AggFuncs { - newAgg := LogicalAggregation{AggFuncs: []*aggregation.AggFuncDesc{f}}.Init(agg.SCtx(), agg.SelectBlockOffset()) + newAgg := LogicalAggregation{AggFuncs: []*aggregation.AggFuncDesc{f}}.Init(agg.SCtx(), agg.QueryBlockOffset()) newAgg.SetChildren(a.cloneSubPlans(agg.children[0])) newAgg.schema = expression.NewSchema(agg.schema.Columns[i]) // Since LogicalAggregation doesn’t use the parent LogicalPlan, passing an incorrect parameter here won’t affect subsequent optimizations. @@ -176,7 +176,7 @@ func (*maxMinEliminator) eliminateSingleMaxMin(agg *LogicalAggregation, opt *log if len(expression.ExtractColumns(f.Args[0])) > 0 { // If it can be NULL, we need to filter NULL out first. if !mysql.HasNotNullFlag(f.Args[0].GetType().GetFlag()) { - sel = LogicalSelection{}.Init(ctx, agg.SelectBlockOffset()) + sel = LogicalSelection{}.Init(ctx, agg.QueryBlockOffset()) isNullFunc := expression.NewFunctionInternal(ctx, ast.IsNull, types.NewFieldType(mysql.TypeTiny), f.Args[0]) notNullFunc := expression.NewFunctionInternal(ctx, ast.UnaryNot, types.NewFieldType(mysql.TypeTiny), isNullFunc) sel.Conditions = []expression.Expression{notNullFunc} @@ -188,14 +188,14 @@ func (*maxMinEliminator) eliminateSingleMaxMin(agg *LogicalAggregation, opt *log // For max function, the sort order should be desc. desc := f.Name == ast.AggFuncMax // Compose Sort operator. - sort = LogicalSort{}.Init(ctx, agg.SelectBlockOffset()) + sort = LogicalSort{}.Init(ctx, agg.QueryBlockOffset()) sort.ByItems = append(sort.ByItems, &util.ByItems{Expr: f.Args[0], Desc: desc}) sort.SetChildren(child) child = sort } // Compose Limit operator. - li := LogicalLimit{Count: 1}.Init(ctx, agg.SelectBlockOffset()) + li := LogicalLimit{Count: 1}.Init(ctx, agg.QueryBlockOffset()) li.SetChildren(child) // If no data in the child, we need to return NULL instead of empty. This cannot be done by sort and limit themselves. diff --git a/pkg/planner/core/rule_partition_processor.go b/pkg/planner/core/rule_partition_processor.go index d0dda5e8fbf6b..36a42469b0875 100644 --- a/pkg/planner/core/rule_partition_processor.go +++ b/pkg/planner/core/rule_partition_processor.go @@ -19,7 +19,7 @@ import ( "cmp" "context" "fmt" - gomath "math" + "math" "slices" "sort" "strings" @@ -35,6 +35,7 @@ import ( "github.com/pingcap/tidb/pkg/types" "github.com/pingcap/tidb/pkg/util/chunk" "github.com/pingcap/tidb/pkg/util/collate" + h "github.com/pingcap/tidb/pkg/util/hint" "github.com/pingcap/tidb/pkg/util/mathutil" "github.com/pingcap/tidb/pkg/util/plancodec" "github.com/pingcap/tidb/pkg/util/ranger" @@ -86,7 +87,7 @@ func (s *partitionProcessor) rewriteDataSource(lp LogicalPlan, opt *logicalOptim us := LogicalUnionScan{ conditions: p.conditions, handleCols: p.handleCols, - }.Init(ua.SCtx(), ua.SelectBlockOffset()) + }.Init(ua.SCtx(), ua.QueryBlockOffset()) us.SetChildren(child) children = append(children, us) } @@ -179,17 +180,28 @@ func (s *partitionProcessor) getUsedHashPartitions(ctx sessionctx.Context, posHigh-- } - var rangeScalar float64 + var rangeScalar uint64 if mysql.HasUnsignedFlag(col.RetType.GetFlag()) { - rangeScalar = float64(uint64(posHigh)) - float64(uint64(posLow)) // use float64 to avoid integer overflow + // Avoid integer overflow + if uint64(posHigh) < uint64(posLow) { + rangeScalar = 0 + } else { + rangeScalar = uint64(posHigh) - uint64(posLow) + } } else { - rangeScalar = float64(posHigh) - float64(posLow) // use float64 to avoid integer overflow + // Avoid integer overflow + if posHigh < posLow { + rangeScalar = 0 + } else { + rangeScalar = uint64(posHigh - posLow) + } } // if range is less than the number of partitions, there will be unused partitions we can prune out. - if rangeScalar < float64(numPartitions) && !highIsNull && !lowIsNull { - for i := posLow; i <= posHigh; i++ { - idx := mathutil.Abs(i % int64(pi.Num)) + if rangeScalar < uint64(numPartitions) && !highIsNull && !lowIsNull { + var i int64 + for i = 0; i <= int64(rangeScalar); i++ { + idx := mathutil.Abs((posLow + i) % int64(numPartitions)) if len(partitionNames) > 0 && !s.findByName(partitionNames, pi.Definitions[idx].Name.L) { continue } @@ -201,7 +213,7 @@ func (s *partitionProcessor) getUsedHashPartitions(ctx sessionctx.Context, // issue:#22619 if col.RetType.GetType() == mysql.TypeBit { // maximum number of partitions is 8192 - if col.RetType.GetFlen() > 0 && col.RetType.GetFlen() < int(gomath.Log2(mysql.PartitionCountLimit)) { + if col.RetType.GetFlen() > 0 && col.RetType.GetFlen() < int(math.Log2(mysql.PartitionCountLimit)) { // all possible hash values maxUsedPartitions := 1 << col.RetType.GetFlen() if maxUsedPartitions < numPartitions { @@ -279,26 +291,47 @@ func (s *partitionProcessor) getUsedKeyPartitions(ctx sessionctx.Context, posHigh-- } - var rangeScalar float64 + var rangeScalar uint64 if mysql.HasUnsignedFlag(col.RetType.GetFlag()) { - rangeScalar = float64(uint64(posHigh)) - float64(uint64(posLow)) // use float64 to avoid integer overflow + // Avoid integer overflow + if uint64(posHigh) < uint64(posLow) { + rangeScalar = 0 + } else { + rangeScalar = uint64(posHigh) - uint64(posLow) + } } else { - rangeScalar = float64(posHigh) - float64(posLow) // use float64 to avoid integer overflow + // Avoid integer overflow + if posHigh < posLow { + rangeScalar = 0 + } else { + rangeScalar = uint64(posHigh - posLow) + } } // if range is less than the number of partitions, there will be unused partitions we can prune out. - if rangeScalar < float64(pi.Num) && !highIsNull && !lowIsNull { - for i := posLow; i <= posHigh; i++ { - d := types.NewIntDatum(i) + if rangeScalar < pi.Num && !highIsNull && !lowIsNull { + m := make(map[int]struct{}) + for i := 0; i <= int(rangeScalar); i++ { + var d types.Datum + if mysql.HasUnsignedFlag(col.RetType.GetFlag()) { + d = types.NewUintDatum(uint64(posLow) + uint64(i)) + } else { + d = types.NewIntDatum(posLow + int64(i)) + } idx, err := pe.LocateKeyPartition(pi.Num, []types.Datum{d}) if err != nil { // If we failed to get the point position, we can just skip and ignore it. continue } + if _, ok := m[idx]; ok { + // Keys maybe in a same partition, we should skip. + continue + } if len(partitionNames) > 0 && !s.findByName(partitionNames, pi.Definitions[idx].Name.L) { continue } used = append(used, idx) + m[idx] = struct{}{} } continue } @@ -469,7 +502,7 @@ func (s *partitionProcessor) processHashOrKeyPartition(ds *DataSource, pi *model if used != nil { return s.makeUnionAllChildren(ds, pi, convertToRangeOr(used, pi), opt) } - tableDual := LogicalTableDual{RowCount: 0}.Init(ds.SCtx(), ds.SelectBlockOffset()) + tableDual := LogicalTableDual{RowCount: 0}.Init(ds.SCtx(), ds.QueryBlockOffset()) tableDual.schema = ds.Schema() appendNoPartitionChildTraceStep(ds, tableDual, opt) return tableDual, nil @@ -816,6 +849,7 @@ func (*partitionProcessor) name() string { type lessThanDataInt struct { data []int64 + unsigned bool maxvalue bool } @@ -823,32 +857,13 @@ func (lt *lessThanDataInt) length() int { return len(lt.data) } -func compareUnsigned(v1, v2 int64) int { - switch { - case uint64(v1) > uint64(v2): - return 1 - case uint64(v1) == uint64(v2): - return 0 - } - return -1 -} - func (lt *lessThanDataInt) compare(ith int, v int64, unsigned bool) int { - if ith == len(lt.data)-1 { - if lt.maxvalue { - return 1 - } - } - if unsigned { - return compareUnsigned(lt.data[ith], v) - } - switch { - case lt.data[ith] > v: + // TODO: get an extra partition when `v` bigger than `lt.maxvalue``, but the result still correct. + if ith == lt.length()-1 && lt.maxvalue { return 1 - case lt.data[ith] == v: - return 0 } - return -1 + + return types.CompareInt(lt.data[ith], lt.unsigned, v, unsigned) } // partitionRange represents [start, end) @@ -991,6 +1006,7 @@ func (s *partitionProcessor) pruneRangePartition(ctx sessionctx.Context, pi *mod pruner := rangePruner{ lessThan: lessThanDataInt{ data: partExpr.ForRangePruning.LessThan, + unsigned: mysql.HasUnsignedFlag(col.GetType().GetFlag()), maxvalue: partExpr.ForRangePruning.MaxValue, }, col: col, @@ -1018,7 +1034,7 @@ func (s *partitionProcessor) processListPartition(ds *DataSource, pi *model.Part if used != nil { return s.makeUnionAllChildren(ds, pi, convertToRangeOr(used, pi), opt) } - tableDual := LogicalTableDual{RowCount: 0}.Init(ds.SCtx(), ds.SelectBlockOffset()) + tableDual := LogicalTableDual{RowCount: 0}.Init(ds.SCtx(), ds.QueryBlockOffset()) tableDual.schema = ds.Schema() appendNoPartitionChildTraceStep(ds, tableDual, opt) return tableDual, nil @@ -1308,8 +1324,7 @@ func (p *rangePruner) partitionRangeForExpr(sctx sessionctx.Context, expr expres return 0, 0, false } - unsigned := mysql.HasUnsignedFlag(p.col.RetType.GetFlag()) - start, end = pruneUseBinarySearch(p.lessThan, dataForPrune, unsigned) + start, end = pruneUseBinarySearch(p.lessThan, dataForPrune) return start, end, true } @@ -1370,7 +1385,6 @@ func partitionRangeForInExpr(sctx sessionctx.Context, args []expression.Expressi } var result partitionRangeOR - unsigned := mysql.HasUnsignedFlag(col.RetType.GetFlag()) for i := 1; i < len(args); i++ { constExpr, ok := args[i].(*expression.Constant) if !ok { @@ -1383,18 +1397,21 @@ func partitionRangeForInExpr(sctx sessionctx.Context, args []expression.Expressi var val int64 var err error + var unsigned bool if pruner.partFn != nil { // replace fn(col) to fn(const) partFnConst := replaceColumnWithConst(pruner.partFn, constExpr) val, _, err = partFnConst.EvalInt(sctx, chunk.Row{}) + unsigned = mysql.HasUnsignedFlag(partFnConst.GetType().GetFlag()) } else { - val, err = constExpr.Value.ToInt64(sctx.GetSessionVars().StmtCtx.TypeCtx()) + val, _, err = constExpr.EvalInt(sctx, chunk.Row{}) + unsigned = mysql.HasUnsignedFlag(constExpr.GetType().GetFlag()) } if err != nil { return pruner.fullRange() } - start, end := pruneUseBinarySearch(pruner.lessThan, dataForPrune{op: ast.EQ, c: val}, unsigned) + start, end := pruneUseBinarySearch(pruner.lessThan, dataForPrune{op: ast.EQ, c: val, unsigned: unsigned}) result = append(result, partitionRange{start, end}) } return result.simplify() @@ -1430,8 +1447,9 @@ func getMonotoneMode(fnName string) monotoneMode { // f(x) op const, op is > = < type dataForPrune struct { - op string - c int64 + op string + c int64 + unsigned bool } // extractDataForPrune extracts data from the expression for pruning. @@ -1499,12 +1517,13 @@ func (p *rangePruner) extractDataForPrune(sctx sessionctx.Context, expr expressi // the constExpr may not a really constant when coming here. // Suppose the partition expression is 'a + b' and we have a condition 'a = 2', // the constExpr is '2 + b' after the replacement which we can't evaluate. - if !constExpr.ConstItem(sctx.GetSessionVars().StmtCtx) { + if !expression.ConstExprConsiderPlanCache(constExpr, sctx.GetSessionVars().StmtCtx.UseCache) { return ret, false } c, isNull, err := constExpr.EvalInt(sctx, chunk.Row{}) if err == nil && !isNull { ret.c = c + ret.unsigned = mysql.HasUnsignedFlag(constExpr.GetType().GetFlag()) return ret, true } return ret, false @@ -1562,7 +1581,7 @@ func relaxOP(op string) string { // pruneUseBinarySearch returns the start and end of which partitions will match. // If no match (i.e. value > last partition) the start partition will be the number of partition, not the first partition! -func pruneUseBinarySearch(lessThan lessThanDataInt, data dataForPrune, unsigned bool) (start int, end int) { +func pruneUseBinarySearch(lessThan lessThanDataInt, data dataForPrune) (start int, end int) { length := lessThan.length() switch data.op { case ast.EQ: @@ -1570,21 +1589,21 @@ func pruneUseBinarySearch(lessThan lessThanDataInt, data dataForPrune, unsigned // col = 14, lessThan = [4 7 11 14 17] => [4, 5) // col = 10, lessThan = [4 7 11 14 17] => [2, 3) // col = 3, lessThan = [4 7 11 14 17] => [0, 1) - pos := sort.Search(length, func(i int) bool { return lessThan.compare(i, data.c, unsigned) > 0 }) + pos := sort.Search(length, func(i int) bool { return lessThan.compare(i, data.c, data.unsigned) > 0 }) start, end = pos, pos+1 case ast.LT: // col < 66, lessThan = [4 7 11 14 17] => [0, 5) // col < 14, lessThan = [4 7 11 14 17] => [0, 4) // col < 10, lessThan = [4 7 11 14 17] => [0, 3) // col < 3, lessThan = [4 7 11 14 17] => [0, 1) - pos := sort.Search(length, func(i int) bool { return lessThan.compare(i, data.c, unsigned) >= 0 }) + pos := sort.Search(length, func(i int) bool { return lessThan.compare(i, data.c, data.unsigned) >= 0 }) start, end = 0, pos+1 case ast.GE: // col >= 66, lessThan = [4 7 11 14 17] => [5, 5) // col >= 14, lessThan = [4 7 11 14 17] => [4, 5) // col >= 10, lessThan = [4 7 11 14 17] => [2, 5) // col >= 3, lessThan = [4 7 11 14 17] => [0, 5) - pos := sort.Search(length, func(i int) bool { return lessThan.compare(i, data.c, unsigned) > 0 }) + pos := sort.Search(length, func(i int) bool { return lessThan.compare(i, data.c, data.unsigned) > 0 }) start, end = pos, length case ast.GT: // col > 66, lessThan = [4 7 11 14 17] => [5, 5) @@ -1592,14 +1611,16 @@ func pruneUseBinarySearch(lessThan lessThanDataInt, data dataForPrune, unsigned // col > 10, lessThan = [4 7 11 14 17] => [3, 5) // col > 3, lessThan = [4 7 11 14 17] => [1, 5) // col > 2, lessThan = [4 7 11 14 17] => [0, 5) - pos := sort.Search(length, func(i int) bool { return lessThan.compare(i, data.c+1, unsigned) > 0 }) + + // Although `data.c+1` will overflow in sometime, this does not affect the correct results obtained. + pos := sort.Search(length, func(i int) bool { return lessThan.compare(i, data.c+1, data.unsigned) > 0 }) start, end = pos, length case ast.LE: // col <= 66, lessThan = [4 7 11 14 17] => [0, 6) // col <= 14, lessThan = [4 7 11 14 17] => [0, 5) // col <= 10, lessThan = [4 7 11 14 17] => [0, 3) // col <= 3, lessThan = [4 7 11 14 17] => [0, 1) - pos := sort.Search(length, func(i int) bool { return lessThan.compare(i, data.c, unsigned) > 0 }) + pos := sort.Search(length, func(i int) bool { return lessThan.compare(i, data.c, data.unsigned) > 0 }) start, end = 0, pos+1 case ast.IsNull: start, end = 0, 1 @@ -1615,7 +1636,7 @@ func pruneUseBinarySearch(lessThan lessThanDataInt, data dataForPrune, unsigned func (*partitionProcessor) resolveAccessPaths(ds *DataSource) error { possiblePaths, err := getPossibleAccessPaths( - ds.SCtx(), &tableHintInfo{indexMergeHintList: ds.indexMergeHints, indexHintList: ds.IndexHints}, + ds.SCtx(), &h.TableHintInfo{IndexMergeHintList: ds.indexMergeHints, IndexHintList: ds.IndexHints}, ds.astIndexHints, ds.table, ds.DBName, ds.tableInfo.Name, ds.isForUpdateRead, true) if err != nil { return err @@ -1631,12 +1652,12 @@ func (*partitionProcessor) resolveAccessPaths(ds *DataSource) error { func (s *partitionProcessor) resolveOptimizeHint(ds *DataSource, partitionName model.CIStr) error { // index hint if len(ds.IndexHints) > 0 { - newIndexHint := make([]indexHintInfo, 0, len(ds.IndexHints)) + newIndexHint := make([]h.IndexHintInfo, 0, len(ds.IndexHints)) for _, idxHint := range ds.IndexHints { - if len(idxHint.partitions) == 0 { + if len(idxHint.Partitions) == 0 { newIndexHint = append(newIndexHint, idxHint) } else { - for _, p := range idxHint.partitions { + for _, p := range idxHint.Partitions { if p.String() == partitionName.String() { newIndexHint = append(newIndexHint, idxHint) break @@ -1649,12 +1670,12 @@ func (s *partitionProcessor) resolveOptimizeHint(ds *DataSource, partitionName m // index merge hint if len(ds.indexMergeHints) > 0 { - newIndexMergeHint := make([]indexHintInfo, 0, len(ds.indexMergeHints)) + newIndexMergeHint := make([]h.IndexHintInfo, 0, len(ds.indexMergeHints)) for _, idxHint := range ds.indexMergeHints { - if len(idxHint.partitions) == 0 { + if len(idxHint.Partitions) == 0 { newIndexMergeHint = append(newIndexMergeHint, idxHint) } else { - for _, p := range idxHint.partitions { + for _, p := range idxHint.Partitions { if p.String() == partitionName.String() { newIndexMergeHint = append(newIndexMergeHint, idxHint) break @@ -1666,29 +1687,29 @@ func (s *partitionProcessor) resolveOptimizeHint(ds *DataSource, partitionName m } // read from storage hint - if ds.preferStoreType&preferTiKV > 0 { - if len(ds.preferPartitions[preferTiKV]) > 0 { - ds.preferStoreType ^= preferTiKV - for _, p := range ds.preferPartitions[preferTiKV] { + if ds.preferStoreType&h.PreferTiKV > 0 { + if len(ds.preferPartitions[h.PreferTiKV]) > 0 { + ds.preferStoreType ^= h.PreferTiKV + for _, p := range ds.preferPartitions[h.PreferTiKV] { if p.String() == partitionName.String() { - ds.preferStoreType |= preferTiKV + ds.preferStoreType |= h.PreferTiKV } } } } - if ds.preferStoreType&preferTiFlash > 0 { - if len(ds.preferPartitions[preferTiFlash]) > 0 { - ds.preferStoreType ^= preferTiFlash - for _, p := range ds.preferPartitions[preferTiFlash] { + if ds.preferStoreType&h.PreferTiFlash > 0 { + if len(ds.preferPartitions[h.PreferTiFlash]) > 0 { + ds.preferStoreType ^= h.PreferTiFlash + for _, p := range ds.preferPartitions[h.PreferTiFlash] { if p.String() == partitionName.String() { - ds.preferStoreType |= preferTiFlash + ds.preferStoreType |= h.PreferTiFlash } } } } - if ds.preferStoreType&preferTiFlash != 0 && ds.preferStoreType&preferTiKV != 0 { + if ds.preferStoreType&h.PreferTiFlash != 0 && ds.preferStoreType&h.PreferTiKV != 0 { ds.SCtx().GetSessionVars().StmtCtx.AppendWarning( - errors.New("hint `read_from_storage` has conflict storage type for the partition " + partitionName.L)) + errors.NewNoStackError("hint `read_from_storage` has conflict storage type for the partition " + partitionName.L)) } return s.resolveAccessPaths(ds) @@ -1715,17 +1736,17 @@ func appendWarnForUnknownPartitions(ctx sessionctx.Context, hintName string, unk func (*partitionProcessor) checkHintsApplicable(ds *DataSource, partitionSet set.StringSet) { for _, idxHint := range ds.IndexHints { - unknownPartitions := checkTableHintsApplicableForPartition(idxHint.partitions, partitionSet) - appendWarnForUnknownPartitions(ds.SCtx(), restore2IndexHint(idxHint.hintTypeString(), idxHint), unknownPartitions) + unknownPartitions := checkTableHintsApplicableForPartition(idxHint.Partitions, partitionSet) + appendWarnForUnknownPartitions(ds.SCtx(), h.Restore2IndexHint(idxHint.HintTypeString(), idxHint), unknownPartitions) } for _, idxMergeHint := range ds.indexMergeHints { - unknownPartitions := checkTableHintsApplicableForPartition(idxMergeHint.partitions, partitionSet) - appendWarnForUnknownPartitions(ds.SCtx(), restore2IndexHint(HintIndexMerge, idxMergeHint), unknownPartitions) + unknownPartitions := checkTableHintsApplicableForPartition(idxMergeHint.Partitions, partitionSet) + appendWarnForUnknownPartitions(ds.SCtx(), h.Restore2IndexHint(h.HintIndexMerge, idxMergeHint), unknownPartitions) } - unknownPartitions := checkTableHintsApplicableForPartition(ds.preferPartitions[preferTiKV], partitionSet) + unknownPartitions := checkTableHintsApplicableForPartition(ds.preferPartitions[h.PreferTiKV], partitionSet) unknownPartitions = append(unknownPartitions, - checkTableHintsApplicableForPartition(ds.preferPartitions[preferTiFlash], partitionSet)...) - appendWarnForUnknownPartitions(ds.SCtx(), HintReadFromStorage, unknownPartitions) + checkTableHintsApplicableForPartition(ds.preferPartitions[h.PreferTiFlash], partitionSet)...) + appendWarnForUnknownPartitions(ds.SCtx(), h.HintReadFromStorage, unknownPartitions) } func (s *partitionProcessor) makeUnionAllChildren(ds *DataSource, pi *model.PartitionInfo, or partitionRangeOR, opt *logicalOptimizeOp) (LogicalPlan, error) { @@ -1742,7 +1763,7 @@ func (s *partitionProcessor) makeUnionAllChildren(ds *DataSource, pi *model.Part } // Not a deep copy. newDataSource := *ds - newDataSource.baseLogicalPlan = newBaseLogicalPlan(ds.SCtx(), plancodec.TypeTableScan, &newDataSource, ds.SelectBlockOffset()) + newDataSource.baseLogicalPlan = newBaseLogicalPlan(ds.SCtx(), plancodec.TypeTableScan, &newDataSource, ds.QueryBlockOffset()) newDataSource.schema = ds.schema.Clone() newDataSource.Columns = make([]*model.ColumnInfo, len(ds.Columns)) copy(newDataSource.Columns, ds.Columns) @@ -1766,7 +1787,7 @@ func (s *partitionProcessor) makeUnionAllChildren(ds *DataSource, pi *model.Part if len(children) == 0 { // No result after table pruning. - tableDual := LogicalTableDual{RowCount: 0}.Init(ds.SCtx(), ds.SelectBlockOffset()) + tableDual := LogicalTableDual{RowCount: 0}.Init(ds.SCtx(), ds.QueryBlockOffset()) tableDual.schema = ds.Schema() appendMakeUnionAllChildrenTranceStep(ds, usedDefinition, tableDual, children, opt) return tableDual, nil @@ -1776,7 +1797,7 @@ func (s *partitionProcessor) makeUnionAllChildren(ds *DataSource, pi *model.Part appendMakeUnionAllChildrenTranceStep(ds, usedDefinition, children[0], children, opt) return children[0], nil } - unionAll := LogicalPartitionUnionAll{}.Init(ds.SCtx(), ds.SelectBlockOffset()) + unionAll := LogicalPartitionUnionAll{}.Init(ds.SCtx(), ds.QueryBlockOffset()) unionAll.SetChildren(children...) unionAll.SetSchema(ds.schema.Clone()) appendMakeUnionAllChildrenTranceStep(ds, usedDefinition, unionAll, children, opt) diff --git a/pkg/planner/core/rule_predicate_push_down.go b/pkg/planner/core/rule_predicate_push_down.go index 2597727ac6d4a..209ba4ea20608 100644 --- a/pkg/planner/core/rule_predicate_push_down.go +++ b/pkg/planner/core/rule_predicate_push_down.go @@ -67,7 +67,7 @@ func addSelection(p LogicalPlan, child LogicalPlan, conditions []expression.Expr p.Children()[chIdx] = child return } - selection := LogicalSelection{Conditions: conditions}.Init(p.SCtx(), p.SelectBlockOffset()) + selection := LogicalSelection{Conditions: conditions}.Init(p.SCtx(), p.QueryBlockOffset()) selection.SetChildren(child) p.Children()[chIdx] = selection appendAddSelectionTraceStep(p, child, selection, opt) @@ -139,7 +139,7 @@ func (ds *DataSource) PredicatePushDown(predicates []expression.Expression, opt // TODO: remove it to the place building logical plan predicates = ds.AddPrefix4ShardIndexes(ds.SCtx(), predicates) ds.allConds = predicates - ds.pushedDownConds, predicates = expression.PushDownExprs(ds.SCtx().GetSessionVars().StmtCtx, predicates, ds.SCtx().GetClient(), kv.UnSpecified) + ds.pushedDownConds, predicates = expression.PushDownExprs(ds.SCtx(), predicates, ds.SCtx().GetClient(), kv.UnSpecified) appendDataSourcePredicatePushDownTraceStep(ds, opt) return predicates, ds } @@ -350,7 +350,7 @@ func (p *LogicalProjection) appendExpr(expr expression.Expression) *expression.C if col, ok := expr.(*expression.Column); ok { return col } - expr = expression.ColumnSubstitute(expr, p.schema, p.Exprs) + expr = expression.ColumnSubstitute(p.SCtx(), expr, p.schema, p.Exprs) p.Exprs = append(p.Exprs, expr) col := &expression.Column{ @@ -373,7 +373,7 @@ func (p *LogicalJoin) getProj(idx int) *LogicalProjection { if ok { return proj } - proj = LogicalProjection{Exprs: make([]expression.Expression, 0, child.Schema().Len())}.Init(p.SCtx(), child.SelectBlockOffset()) + proj = LogicalProjection{Exprs: make([]expression.Expression, 0, child.Schema().Len())}.Init(p.SCtx(), child.QueryBlockOffset()) for _, col := range child.Schema().Columns { proj.Exprs = append(proj.Exprs, col) } @@ -440,6 +440,10 @@ func isNullRejected(ctx sessionctx.Context, schema *expression.Schema, expr expr sc.InNullRejectCheck = false }() for _, cond := range expression.SplitCNFItems(expr) { + if isNullRejectedSpecially(ctx, schema, expr) { + return true + } + result := expression.EvaluateExprWithNull(ctx, schema, cond) x, ok := result.(*expression.Constant) if !ok { @@ -454,6 +458,47 @@ func isNullRejected(ctx sessionctx.Context, schema *expression.Schema, expr expr return false } +// isNullRejectedSpecially handles some null-rejected cases specially, since the current in +// EvaluateExprWithNull is too strict for some cases, e.g. #49616. +func isNullRejectedSpecially(ctx sessionctx.Context, schema *expression.Schema, expr expression.Expression) bool { + return specialNullRejectedCase1(ctx, schema, expr) // only 1 case now +} + +// specialNullRejectedCase1 is mainly for #49616. +// Case1 specially handles `null-rejected OR (null-rejected AND {others})`, then no matter what the result +// of `{others}` is (True, False or Null), the result of this predicate is null, so this predicate is null-rejected. +func specialNullRejectedCase1(ctx sessionctx.Context, schema *expression.Schema, expr expression.Expression) bool { + isFunc := func(e expression.Expression, lowerFuncName string) *expression.ScalarFunction { + f, ok := e.(*expression.ScalarFunction) + if !ok { + return nil + } + if f.FuncName.L == lowerFuncName { + return f + } + return nil + } + orFunc := isFunc(expr, ast.LogicOr) + if orFunc == nil { + return false + } + for i := 0; i < 2; i++ { + andFunc := isFunc(orFunc.GetArgs()[i], ast.LogicAnd) + if andFunc == nil { + continue + } + if !isNullRejected(ctx, schema, orFunc.GetArgs()[1-i]) { + continue // the other side should be null-rejected: null-rejected OR (... AND ...) + } + for _, andItem := range expression.SplitCNFItems(andFunc) { + if isNullRejected(ctx, schema, andItem) { + return true // hit the case in the comment: null-rejected OR (null-rejected AND ...) + } + } + } + return false +} + // PredicatePushDown implements LogicalPlan PredicatePushDown interface. func (p *LogicalExpand) PredicatePushDown(predicates []expression.Expression, opt *logicalOptimizeOp) (ret []expression.Expression, retPlan LogicalPlan) { // Note that, grouping column related predicates can't be pushed down, since grouping column has nullability change after Expand OP itself. @@ -481,8 +526,9 @@ func (p *LogicalProjection) PredicatePushDown(predicates []expression.Expression return predicates, p } } + ctx := p.SCtx() for _, cond := range predicates { - substituted, hasFailed, newFilter := expression.ColumnSubstituteImpl(cond, p.Schema(), p.Exprs, true) + substituted, hasFailed, newFilter := expression.ColumnSubstituteImpl(ctx, cond, p.Schema(), p.Exprs, true) if substituted && !hasFailed && !expression.HasGetSetVarFunc(newFilter) { canBePushed = append(canBePushed, newFilter) } else { @@ -525,7 +571,7 @@ func (la *LogicalAggregation) pushDownPredicatesForAggregation(cond expression.E } } if ok { - newFunc := expression.ColumnSubstitute(cond, la.Schema(), exprsOriginal) + newFunc := expression.ColumnSubstitute(la.SCtx(), cond, la.Schema(), exprsOriginal) condsToPush = append(condsToPush, newFunc) } else { ret = append(ret, cond) @@ -635,19 +681,20 @@ func DeriveOtherConditions( deriveLeft bool, deriveRight bool) ( leftCond []expression.Expression, rightCond []expression.Expression) { isOuterSemi := (p.JoinType == LeftOuterSemiJoin) || (p.JoinType == AntiLeftOuterSemiJoin) + ctx := p.SCtx() for _, expr := range p.OtherConditions { if deriveLeft { - leftRelaxedCond := expression.DeriveRelaxedFiltersFromDNF(expr, leftSchema) + leftRelaxedCond := expression.DeriveRelaxedFiltersFromDNF(ctx, expr, leftSchema) if leftRelaxedCond != nil { leftCond = append(leftCond, leftRelaxedCond) } - notNullExpr := deriveNotNullExpr(expr, leftSchema) + notNullExpr := deriveNotNullExpr(ctx, expr, leftSchema) if notNullExpr != nil { leftCond = append(leftCond, notNullExpr) } } if deriveRight { - rightRelaxedCond := expression.DeriveRelaxedFiltersFromDNF(expr, rightSchema) + rightRelaxedCond := expression.DeriveRelaxedFiltersFromDNF(ctx, expr, rightSchema) if rightRelaxedCond != nil { rightCond = append(rightCond, rightRelaxedCond) } @@ -661,7 +708,7 @@ func DeriveOtherConditions( if isOuterSemi { continue } - notNullExpr := deriveNotNullExpr(expr, rightSchema) + notNullExpr := deriveNotNullExpr(ctx, expr, rightSchema) if notNullExpr != nil { rightCond = append(rightCond, notNullExpr) } @@ -673,12 +720,11 @@ func DeriveOtherConditions( // deriveNotNullExpr generates a new expression `not(isnull(col))` given `col1 op col2`, // in which `col` is in specified schema. Caller guarantees that only one of `col1` or // `col2` is in schema. -func deriveNotNullExpr(expr expression.Expression, schema *expression.Schema) expression.Expression { +func deriveNotNullExpr(ctx sessionctx.Context, expr expression.Expression, schema *expression.Schema) expression.Expression { binop, ok := expr.(*expression.ScalarFunction) if !ok || len(binop.GetArgs()) != 2 { return nil } - ctx := binop.GetCtx() arg0, lOK := binop.GetArgs()[0].(*expression.Column) arg1, rOK := binop.GetArgs()[1].(*expression.Column) if !lOK || !rOK { @@ -708,7 +754,7 @@ func Conds2TableDual(p LogicalPlan, conds []expression.Expression) LogicalPlan { return nil } if isTrue, err := con.Value.ToBool(sc.TypeCtxOrDefault()); (err == nil && isTrue == 0) || con.Value.IsNull() { - dual := LogicalTableDual{}.Init(p.SCtx(), p.SelectBlockOffset()) + dual := LogicalTableDual{}.Init(p.SCtx(), p.QueryBlockOffset()) dual.SetSchema(p.Schema()) return dual } diff --git a/pkg/planner/core/rule_predicate_simplification.go b/pkg/planner/core/rule_predicate_simplification.go index 00f65638423d2..501c78767012e 100644 --- a/pkg/planner/core/rule_predicate_simplification.go +++ b/pkg/planner/core/rule_predicate_simplification.go @@ -81,7 +81,7 @@ func (s *baseLogicalPlan) predicateSimplification(opt *logicalOptimizeOp) Logica // updateInPredicate applies intersection of an in list with <> value. It returns updated In list and a flag for // a special case if an element in the inlist is not removed to keep the list not empty. -func updateInPredicate(inPredicate expression.Expression, notEQPredicate expression.Expression) (expression.Expression, bool) { +func updateInPredicate(ctx sessionctx.Context, inPredicate expression.Expression, notEQPredicate expression.Expression) (expression.Expression, bool) { _, inPredicateType := findPredicateType(inPredicate) _, notEQPredicateType := findPredicateType(notEQPredicate) if inPredicateType != inListPredicate || notEQPredicateType != notEqualPredicate { @@ -97,7 +97,7 @@ func updateInPredicate(inPredicate expression.Expression, notEQPredicate express var lastValue *expression.Constant for _, element := range v.GetArgs() { value, valueOK := element.(*expression.Constant) - redundantValue := valueOK && value.Equal(v.GetCtx(), notEQValue) + redundantValue := valueOK && value.Equal(ctx, notEQValue) if !redundantValue { newValues = append(newValues, element) } @@ -113,7 +113,7 @@ func updateInPredicate(inPredicate expression.Expression, notEQPredicate express newValues = append(newValues, lastValue) specialCase = true } - newPred := expression.NewFunctionInternal(v.GetCtx(), v.FuncName.L, v.RetType, newValues...) + newPred := expression.NewFunctionInternal(ctx, v.FuncName.L, v.RetType, newValues...) return newPred, specialCase } @@ -131,13 +131,13 @@ func applyPredicateSimplification(sctx sessionctx.Context, predicates []expressi jCol, jType := findPredicateType(jthPredicate) if iCol == jCol { if iType == notEqualPredicate && jType == inListPredicate { - predicates[j], specialCase = updateInPredicate(jthPredicate, ithPredicate) + predicates[j], specialCase = updateInPredicate(sctx, jthPredicate, ithPredicate) sctx.GetSessionVars().StmtCtx.SetSkipPlanCache(errors.New("NE/INList simplification is triggered")) if !specialCase { removeValues = append(removeValues, i) } } else if iType == inListPredicate && jType == notEqualPredicate { - predicates[i], specialCase = updateInPredicate(ithPredicate, jthPredicate) + predicates[i], specialCase = updateInPredicate(sctx, ithPredicate, jthPredicate) sctx.GetSessionVars().StmtCtx.SetSkipPlanCache(errors.New("NE/INList simplification is triggered")) if !specialCase { removeValues = append(removeValues, j) diff --git a/pkg/planner/core/rule_push_down_sequence.go b/pkg/planner/core/rule_push_down_sequence.go index 70d150c674d91..ab196860b26a0 100644 --- a/pkg/planner/core/rule_push_down_sequence.go +++ b/pkg/planner/core/rule_push_down_sequence.go @@ -41,7 +41,7 @@ func (pdss *pushDownSequenceSolver) recursiveOptimize(pushedSequence *LogicalSeq switch x := lp.(type) { case *LogicalSequence: if pushedSequence == nil { - pushedSequence = LogicalSequence{}.Init(lp.SCtx(), lp.SelectBlockOffset()) + pushedSequence = LogicalSequence{}.Init(lp.SCtx(), lp.QueryBlockOffset()) pushedSequence.SetChildren(lp.Children()...) return pdss.recursiveOptimize(pushedSequence, lp.Children()[len(lp.Children())-1]) } @@ -50,7 +50,7 @@ func (pdss *pushDownSequenceSolver) recursiveOptimize(pushedSequence *LogicalSeq allCTEs := make([]LogicalPlan, 0, childLen+len(pushedSequence.children)-2) allCTEs = append(allCTEs, pushedSequence.children[:len(pushedSequence.children)-1]...) allCTEs = append(allCTEs, x.children[:childLen-1]...) - pushedSequence = LogicalSequence{}.Init(lp.SCtx(), lp.SelectBlockOffset()) + pushedSequence = LogicalSequence{}.Init(lp.SCtx(), lp.QueryBlockOffset()) pushedSequence.SetChildren(append(allCTEs, mainQuery)...) return pdss.recursiveOptimize(pushedSequence, mainQuery) case *DataSource, *LogicalAggregation, *LogicalCTE: diff --git a/pkg/planner/core/rule_result_reorder.go b/pkg/planner/core/rule_result_reorder.go index 95634543e2f20..be1bcd26fd5ea 100644 --- a/pkg/planner/core/rule_result_reorder.go +++ b/pkg/planner/core/rule_result_reorder.go @@ -89,7 +89,7 @@ func (rs *resultReorder) injectSort(lp LogicalPlan) LogicalPlan { } sort := LogicalSort{ ByItems: byItems, - }.Init(lp.SCtx(), lp.SelectBlockOffset()) + }.Init(lp.SCtx(), lp.QueryBlockOffset()) sort.SetChildren(lp) return sort } diff --git a/pkg/planner/core/rule_semi_join_rewrite.go b/pkg/planner/core/rule_semi_join_rewrite.go index 2082082d30d92..00ba4b13b2245 100644 --- a/pkg/planner/core/rule_semi_join_rewrite.go +++ b/pkg/planner/core/rule_semi_join_rewrite.go @@ -20,6 +20,7 @@ import ( "github.com/pingcap/tidb/pkg/expression" "github.com/pingcap/tidb/pkg/expression/aggregation" "github.com/pingcap/tidb/pkg/parser/ast" + h "github.com/pingcap/tidb/pkg/util/hint" ) type semiJoinRewriter struct { @@ -51,14 +52,14 @@ func (smj *semiJoinRewriter) recursivePlan(p LogicalPlan) (LogicalPlan, error) { join, ok := p.(*LogicalJoin) // If it's not a join, or not a (outer) semi join. We just return it since no optimization is needed. // Actually the check of the preferRewriteSemiJoin is a superset of checking the join type. We remain them for a better understanding. - if !ok || !(join.JoinType == SemiJoin || join.JoinType == LeftOuterSemiJoin) || (join.preferJoinType&preferRewriteSemiJoin == 0) { + if !ok || !(join.JoinType == SemiJoin || join.JoinType == LeftOuterSemiJoin) || (join.preferJoinType&h.PreferRewriteSemiJoin == 0) { return p, nil } // The preferRewriteSemiJoin flag only be used here. We should reset it in order to not affect other parts. - join.preferJoinType &= ^preferRewriteSemiJoin + join.preferJoinType &= ^h.PreferRewriteSemiJoin if join.JoinType == LeftOuterSemiJoin { - p.SCtx().GetSessionVars().StmtCtx.AppendWarning(ErrInternal.GenWithStack("SEMI_JOIN_REWRITE() is inapplicable for LeftOuterSemiJoin.")) + p.SCtx().GetSessionVars().StmtCtx.AppendWarning(ErrInternal.FastGen("SEMI_JOIN_REWRITE() is inapplicable for LeftOuterSemiJoin.")) return p, nil } @@ -66,7 +67,7 @@ func (smj *semiJoinRewriter) recursivePlan(p LogicalPlan) (LogicalPlan, error) { // If there's left condition or other condition, we cannot rewrite if len(join.LeftConditions) > 0 || len(join.OtherConditions) > 0 { - p.SCtx().GetSessionVars().StmtCtx.AppendWarning(ErrInternal.GenWithStack("SEMI_JOIN_REWRITE() is inapplicable for SemiJoin with left conditions or other conditions.")) + p.SCtx().GetSessionVars().StmtCtx.AppendWarning(ErrInternal.FastGen("SEMI_JOIN_REWRITE() is inapplicable for SemiJoin with left conditions or other conditions.")) return p, nil } @@ -78,7 +79,7 @@ func (smj *semiJoinRewriter) recursivePlan(p LogicalPlan) (LogicalPlan, error) { // But the aggregation we added may block the predicate push down since we've not maintained the functional dependency to pass the equiv class to guide the push down. // So we create a selection before we build the aggregation. if len(join.RightConditions) > 0 { - sel := LogicalSelection{Conditions: make([]expression.Expression, len(join.RightConditions))}.Init(p.SCtx(), innerChild.SelectBlockOffset()) + sel := LogicalSelection{Conditions: make([]expression.Expression, len(join.RightConditions))}.Init(p.SCtx(), innerChild.QueryBlockOffset()) copy(sel.Conditions, join.RightConditions) sel.SetChildren(innerChild) innerChild = sel @@ -87,7 +88,7 @@ func (smj *semiJoinRewriter) recursivePlan(p LogicalPlan) (LogicalPlan, error) { subAgg := LogicalAggregation{ AggFuncs: make([]*aggregation.AggFuncDesc, 0, len(join.EqualConditions)), GroupByItems: make([]expression.Expression, 0, len(join.EqualConditions)), - }.Init(p.SCtx(), p.Children()[1].SelectBlockOffset()) + }.Init(p.SCtx(), p.Children()[1].QueryBlockOffset()) aggOutputCols := make([]*expression.Column, 0, len(join.EqualConditions)) for i := range join.EqualConditions { @@ -110,14 +111,14 @@ func (smj *semiJoinRewriter) recursivePlan(p LogicalPlan) (LogicalPlan, error) { preferJoinType: join.preferJoinType, preferJoinOrder: join.preferJoinOrder, EqualConditions: make([]*expression.ScalarFunction, 0, len(join.EqualConditions)), - }.Init(p.SCtx(), p.SelectBlockOffset()) + }.Init(p.SCtx(), p.QueryBlockOffset()) innerJoin.SetChildren(join.Children()[0], subAgg) innerJoin.SetSchema(expression.MergeSchema(join.Children()[0].Schema(), subAgg.schema)) innerJoin.AttachOnConds(expression.ScalarFuncs2Exprs(join.EqualConditions)) proj := LogicalProjection{ Exprs: expression.Column2Exprs(join.Children()[0].Schema().Columns), - }.Init(p.SCtx(), p.SelectBlockOffset()) + }.Init(p.SCtx(), p.QueryBlockOffset()) proj.SetChildren(innerJoin) proj.SetSchema(join.Children()[0].Schema()) diff --git a/pkg/planner/core/rule_topn_push_down.go b/pkg/planner/core/rule_topn_push_down.go index 7f6716cc17948..9920bc478008f 100644 --- a/pkg/planner/core/rule_topn_push_down.go +++ b/pkg/planner/core/rule_topn_push_down.go @@ -70,7 +70,7 @@ func (lt *LogicalTopN) setChild(p LogicalPlan, opt *logicalOptimizeOp) LogicalPl Offset: lt.Offset, limitHints: lt.limitHints, PartitionBy: lt.GetPartitionBy(), - }.Init(lt.SCtx(), lt.SelectBlockOffset()) + }.Init(lt.SCtx(), lt.QueryBlockOffset()) limit.SetChildren(p) appendTopNPushDownTraceStep(limit, p, opt) return limit @@ -94,7 +94,7 @@ func (ls *LogicalSort) pushDownTopN(topN *LogicalTopN, opt *logicalOptimizeOp) L } func (p *LogicalLimit) convertToTopN(opt *logicalOptimizeOp) *LogicalTopN { - topn := LogicalTopN{Offset: p.Offset, Count: p.Count, limitHints: p.limitHints}.Init(p.SCtx(), p.SelectBlockOffset()) + topn := LogicalTopN{Offset: p.Offset, Count: p.Count, limitHints: p.limitHints}.Init(p.SCtx(), p.QueryBlockOffset()) appendConvertTopNTraceStep(p, topn, opt) return topn } @@ -111,7 +111,7 @@ func (p *LogicalUnionAll) pushDownTopN(topN *LogicalTopN, opt *logicalOptimizeOp for i, child := range p.children { var newTopN *LogicalTopN if topN != nil { - newTopN = LogicalTopN{Count: topN.Count + topN.Offset, limitHints: topN.limitHints}.Init(p.SCtx(), topN.SelectBlockOffset()) + newTopN = LogicalTopN{Count: topN.Count + topN.Offset, limitHints: topN.limitHints}.Init(p.SCtx(), topN.QueryBlockOffset()) for _, by := range topN.ByItems { newTopN.ByItems = append(newTopN.ByItems, &util.ByItems{Expr: by.Expr, Desc: by.Desc}) } @@ -133,8 +133,9 @@ func (p *LogicalProjection) pushDownTopN(topN *LogicalTopN, opt *logicalOptimize } } if topN != nil { + ctx := p.SCtx() for _, by := range topN.ByItems { - by.Expr = expression.FoldConstant(expression.ColumnSubstitute(by.Expr, p.schema, p.Exprs)) + by.Expr = expression.FoldConstant(ctx, expression.ColumnSubstitute(ctx, by.Expr, p.schema, p.Exprs)) } // remove meaningless constant sort items. @@ -189,7 +190,7 @@ func (p *LogicalJoin) pushDownTopNToChild(topN *LogicalTopN, idx int, opt *logic Count: topN.Count + topN.Offset, ByItems: make([]*util.ByItems, len(topN.ByItems)), limitHints: topN.limitHints, - }.Init(topN.SCtx(), topN.SelectBlockOffset()) + }.Init(topN.SCtx(), topN.QueryBlockOffset()) for i := range topN.ByItems { newTopN.ByItems[i] = topN.ByItems[i].Clone() } diff --git a/pkg/planner/core/runtime_filter.go b/pkg/planner/core/runtime_filter.go index 4f9339db7a96b..712618d5ffed9 100644 --- a/pkg/planner/core/runtime_filter.go +++ b/pkg/planner/core/runtime_filter.go @@ -20,7 +20,7 @@ import ( "github.com/pingcap/tidb/pkg/expression" "github.com/pingcap/tidb/pkg/kv" - "github.com/pingcap/tidb/pkg/sessionctx/stmtctx" + "github.com/pingcap/tidb/pkg/sessionctx" "github.com/pingcap/tidb/pkg/sessionctx/variable" "github.com/pingcap/tidb/pkg/util" "github.com/pingcap/tidb/pkg/util/logutil" @@ -201,10 +201,10 @@ func (rf *RuntimeFilter) Clone() *RuntimeFilter { } // RuntimeFilterListToPB convert runtime filter list to PB list -func RuntimeFilterListToPB(runtimeFilterList []*RuntimeFilter, sc *stmtctx.StatementContext, client kv.Client) ([]*tipb.RuntimeFilter, error) { +func RuntimeFilterListToPB(ctx sessionctx.Context, runtimeFilterList []*RuntimeFilter, client kv.Client) ([]*tipb.RuntimeFilter, error) { result := make([]*tipb.RuntimeFilter, 0, len(runtimeFilterList)) for _, runtimeFilter := range runtimeFilterList { - rfPB, err := runtimeFilter.ToPB(sc, client) + rfPB, err := runtimeFilter.ToPB(ctx, client) if err != nil { return nil, err } @@ -214,8 +214,8 @@ func RuntimeFilterListToPB(runtimeFilterList []*RuntimeFilter, sc *stmtctx.State } // ToPB convert runtime filter to PB -func (rf *RuntimeFilter) ToPB(sc *stmtctx.StatementContext, client kv.Client) (*tipb.RuntimeFilter, error) { - pc := expression.NewPBConverter(client, sc) +func (rf *RuntimeFilter) ToPB(ctx sessionctx.Context, client kv.Client) (*tipb.RuntimeFilter, error) { + pc := expression.NewPBConverter(client, ctx) srcExprListPB := make([]*tipb.Expr, 0, len(rf.srcExprList)) for _, srcExpr := range rf.srcExprList { srcExprPB := pc.ExprToPB(srcExpr) diff --git a/pkg/planner/core/runtime_filter_generator.go b/pkg/planner/core/runtime_filter_generator.go index 891689457a101..385cff8ca04d6 100644 --- a/pkg/planner/core/runtime_filter_generator.go +++ b/pkg/planner/core/runtime_filter_generator.go @@ -144,7 +144,7 @@ func (generator *RuntimeFilterGenerator) assignRuntimeFilter(physicalTableScan * // supply selection if there is no predicates above target scan node //if parent, ok := generator.parentPhysicalPlan.(*PhysicalSelection); !ok { // // StatsInfo: Just set a placeholder value here, and this value will not be used in subsequent optimizations - // sel := PhysicalSelection{hasRFConditions: true}.Init(plan.SCtx(), plan.statsInfo(), plan.SelectBlockOffset()) + // sel := PhysicalSelection{hasRFConditions: true}.Init(plan.SCtx(), plan.statsInfo(), plan.SelectOffset()) // sel.fromDataSource = true // sel.SetChildren(plan) // generator.parentPhysicalPlan.SetChild(generator.childIdxForParentPhysicalPlan, sel) diff --git a/pkg/planner/core/scalar_subq_expression.go b/pkg/planner/core/scalar_subq_expression.go index c3d0b91c0e147..d51617aa6669b 100644 --- a/pkg/planner/core/scalar_subq_expression.go +++ b/pkg/planner/core/scalar_subq_expression.go @@ -23,8 +23,6 @@ import ( "github.com/pingcap/tidb/pkg/expression" "github.com/pingcap/tidb/pkg/infoschema" "github.com/pingcap/tidb/pkg/planner/core/internal/base" - "github.com/pingcap/tidb/pkg/sessionctx" - "github.com/pingcap/tidb/pkg/sessionctx/stmtctx" "github.com/pingcap/tidb/pkg/types" "github.com/pingcap/tidb/pkg/util/chunk" "github.com/pingcap/tidb/pkg/util/codec" @@ -104,15 +102,8 @@ func (s *ScalarSubQueryExpr) selfEvaluate() error { return nil } -// EvalWithInnerCtx evaluates expression with inner ctx. -// Deprecated: This function is only used during refactoring, please do not use it in new code. -// TODO: remove this method after refactoring. -func (s *ScalarSubQueryExpr) EvalWithInnerCtx(row chunk.Row) (types.Datum, error) { - return s.Eval(nil, row) -} - // Eval implements the Expression interface. -func (s *ScalarSubQueryExpr) Eval(_ sessionctx.Context, _ chunk.Row) (types.Datum, error) { +func (s *ScalarSubQueryExpr) Eval(_ expression.EvalContext, _ chunk.Row) (types.Datum, error) { if s.evaled { return s.Value, nil } @@ -124,37 +115,37 @@ func (s *ScalarSubQueryExpr) Eval(_ sessionctx.Context, _ chunk.Row) (types.Datu } // EvalInt returns the int64 representation of expression. -func (*ScalarSubQueryExpr) EvalInt(_ sessionctx.Context, _ chunk.Row) (val int64, isNull bool, err error) { +func (*ScalarSubQueryExpr) EvalInt(_ expression.EvalContext, _ chunk.Row) (val int64, isNull bool, err error) { return 0, false, errors.Errorf("Evaluation methods is not implemented for ScalarSubQueryExpr") } // EvalReal returns the float64 representation of expression. -func (*ScalarSubQueryExpr) EvalReal(_ sessionctx.Context, _ chunk.Row) (val float64, isNull bool, err error) { +func (*ScalarSubQueryExpr) EvalReal(_ expression.EvalContext, _ chunk.Row) (val float64, isNull bool, err error) { return 0, false, errors.Errorf("Evaluation methods is not implemented for ScalarSubQueryExpr") } // EvalString returns the string representation of expression. -func (*ScalarSubQueryExpr) EvalString(_ sessionctx.Context, _ chunk.Row) (val string, isNull bool, err error) { +func (*ScalarSubQueryExpr) EvalString(_ expression.EvalContext, _ chunk.Row) (val string, isNull bool, err error) { return "", false, errors.Errorf("Evaluation methods is not implemented for ScalarSubQueryExpr") } // EvalDecimal returns the decimal representation of expression. -func (*ScalarSubQueryExpr) EvalDecimal(_ sessionctx.Context, _ chunk.Row) (val *types.MyDecimal, isNull bool, err error) { +func (*ScalarSubQueryExpr) EvalDecimal(_ expression.EvalContext, _ chunk.Row) (val *types.MyDecimal, isNull bool, err error) { return nil, false, errors.Errorf("Evaluation methods is not implemented for ScalarSubQueryExpr") } // EvalTime returns the DATE/DATETIME/TIMESTAMP representation of expression. -func (*ScalarSubQueryExpr) EvalTime(_ sessionctx.Context, _ chunk.Row) (val types.Time, isNull bool, err error) { +func (*ScalarSubQueryExpr) EvalTime(_ expression.EvalContext, _ chunk.Row) (val types.Time, isNull bool, err error) { return types.ZeroTime, false, errors.Errorf("Evaluation methods is not implemented for ScalarSubQueryExpr") } // EvalDuration returns the duration representation of expression. -func (*ScalarSubQueryExpr) EvalDuration(_ sessionctx.Context, _ chunk.Row) (val types.Duration, isNull bool, err error) { +func (*ScalarSubQueryExpr) EvalDuration(_ expression.EvalContext, _ chunk.Row) (val types.Duration, isNull bool, err error) { return types.ZeroDuration, false, errors.Errorf("Evaluation methods is not implemented for ScalarSubQueryExpr") } // EvalJSON returns the JSON representation of expression. -func (*ScalarSubQueryExpr) EvalJSON(_ sessionctx.Context, _ chunk.Row) (val types.BinaryJSON, isNull bool, err error) { +func (*ScalarSubQueryExpr) EvalJSON(_ expression.EvalContext, _ chunk.Row) (val types.BinaryJSON, isNull bool, err error) { return types.BinaryJSON{}, false, errors.Errorf("Evaluation methods is not implemented for ScalarSubQueryExpr") } @@ -171,7 +162,7 @@ func (s *ScalarSubQueryExpr) Clone() expression.Expression { } // Equal implements the Expression interface. -func (s *ScalarSubQueryExpr) Equal(_ sessionctx.Context, e expression.Expression) bool { +func (s *ScalarSubQueryExpr) Equal(_ expression.EvalContext, e expression.Expression) bool { anotherS, ok := e.(*ScalarSubQueryExpr) if !ok { return false @@ -187,18 +178,18 @@ func (*ScalarSubQueryExpr) IsCorrelated() bool { return false } -// ConstItem implements the Expression interface. -func (*ScalarSubQueryExpr) ConstItem(_ *stmtctx.StatementContext) bool { - return true +// ConstLevel returns the const level for the expression +func (*ScalarSubQueryExpr) ConstLevel() expression.ConstLevel { + return expression.ConstNone } // Decorrelate implements the Expression interface. -func (s *ScalarSubQueryExpr) Decorrelate(_ *expression.Schema) expression.Expression { +func (s *ScalarSubQueryExpr) Decorrelate(*expression.Schema) expression.Expression { return s } // resolveIndices implements the Expression interface. -func (*ScalarSubQueryExpr) resolveIndices(_ *expression.Schema) error { +func (*ScalarSubQueryExpr) resolveIndices(*expression.Schema) error { return nil } @@ -208,12 +199,12 @@ func (s *ScalarSubQueryExpr) ResolveIndices(_ *expression.Schema) (expression.Ex } // ResolveIndicesByVirtualExpr implements the Expression interface. -func (s *ScalarSubQueryExpr) ResolveIndicesByVirtualExpr(_ sessionctx.Context, _ *expression.Schema) (expression.Expression, bool) { +func (s *ScalarSubQueryExpr) ResolveIndicesByVirtualExpr(_ expression.EvalContext, _ *expression.Schema) (expression.Expression, bool) { return s, false } // resolveIndicesByVirtualExpr implements the Expression interface. -func (*ScalarSubQueryExpr) resolveIndicesByVirtualExpr(_ sessionctx.Context, _ *expression.Schema) bool { +func (*ScalarSubQueryExpr) resolveIndicesByVirtualExpr(_ expression.EvalContext, _ *expression.Schema) bool { return false } @@ -223,7 +214,7 @@ func (s *ScalarSubQueryExpr) RemapColumn(_ map[int64]*expression.Column) (expres } // ExplainInfo implements the Expression interface. -func (s *ScalarSubQueryExpr) ExplainInfo() string { +func (s *ScalarSubQueryExpr) ExplainInfo(expression.EvalContext) string { return s.String() } @@ -279,58 +270,38 @@ func (s *ScalarSubQueryExpr) MarshalJSON() ([]byte, error) { return s.Constant.MarshalJSON() } -// ReverseEval evaluates the only one column value with given function result. -func (s *ScalarSubQueryExpr) ReverseEval(_ *stmtctx.StatementContext, _ types.Datum, _ types.RoundingType) (val types.Datum, err error) { - if s.evalErr != nil { - return s.Value, s.evalErr - } - if s.evaled { - return s.Value, nil - } - err = s.selfEvaluate() - if err != nil { - return s.Value, err - } - return s.Value, nil -} - -// SupportReverseEval implements the Expression interface. -func (*ScalarSubQueryExpr) SupportReverseEval() bool { - return true -} - // VecEvalInt evaluates this expression in a vectorized manner. -func (*ScalarSubQueryExpr) VecEvalInt(_ sessionctx.Context, _ *chunk.Chunk, _ *chunk.Column) error { +func (*ScalarSubQueryExpr) VecEvalInt(_ expression.EvalContext, _ *chunk.Chunk, _ *chunk.Column) error { return errors.Errorf("ScalarSubQueryExpr doesn't implement the vec eval yet") } // VecEvalReal evaluates this expression in a vectorized manner. -func (*ScalarSubQueryExpr) VecEvalReal(_ sessionctx.Context, _ *chunk.Chunk, _ *chunk.Column) error { +func (*ScalarSubQueryExpr) VecEvalReal(_ expression.EvalContext, _ *chunk.Chunk, _ *chunk.Column) error { return errors.Errorf("ScalarSubQueryExpr doesn't implement the vec eval yet") } // VecEvalString evaluates this expression in a vectorized manner. -func (*ScalarSubQueryExpr) VecEvalString(_ sessionctx.Context, _ *chunk.Chunk, _ *chunk.Column) error { +func (*ScalarSubQueryExpr) VecEvalString(_ expression.EvalContext, _ *chunk.Chunk, _ *chunk.Column) error { return errors.Errorf("ScalarSubQueryExpr doesn't implement the vec eval yet") } // VecEvalDecimal evaluates this expression in a vectorized manner. -func (*ScalarSubQueryExpr) VecEvalDecimal(_ sessionctx.Context, _ *chunk.Chunk, _ *chunk.Column) error { +func (*ScalarSubQueryExpr) VecEvalDecimal(_ expression.EvalContext, _ *chunk.Chunk, _ *chunk.Column) error { return errors.Errorf("ScalarSubQueryExpr doesn't implement the vec eval yet") } // VecEvalTime evaluates this expression in a vectorized manner. -func (*ScalarSubQueryExpr) VecEvalTime(_ sessionctx.Context, _ *chunk.Chunk, _ *chunk.Column) error { +func (*ScalarSubQueryExpr) VecEvalTime(_ expression.EvalContext, _ *chunk.Chunk, _ *chunk.Column) error { return errors.Errorf("ScalarSubQueryExpr doesn't implement the vec eval yet") } // VecEvalDuration evaluates this expression in a vectorized manner. -func (*ScalarSubQueryExpr) VecEvalDuration(_ sessionctx.Context, _ *chunk.Chunk, _ *chunk.Column) error { +func (*ScalarSubQueryExpr) VecEvalDuration(_ expression.EvalContext, _ *chunk.Chunk, _ *chunk.Column) error { return errors.Errorf("ScalarSubQueryExpr doesn't implement the vec eval yet") } // VecEvalJSON evaluates this expression in a vectorized manner. -func (*ScalarSubQueryExpr) VecEvalJSON(_ sessionctx.Context, _ *chunk.Chunk, _ *chunk.Column) error { +func (*ScalarSubQueryExpr) VecEvalJSON(_ expression.EvalContext, _ *chunk.Chunk, _ *chunk.Column) error { return errors.Errorf("ScalarSubQueryExpr doesn't implement the vec eval yet") } diff --git a/pkg/planner/core/stats.go b/pkg/planner/core/stats.go index f2f928cd712a8..1bb9078f789ac 100644 --- a/pkg/planner/core/stats.go +++ b/pkg/planner/core/stats.go @@ -38,6 +38,7 @@ import ( "github.com/pingcap/tidb/pkg/statistics" "github.com/pingcap/tidb/pkg/table" "github.com/pingcap/tidb/pkg/types" + h "github.com/pingcap/tidb/pkg/util/hint" "github.com/pingcap/tidb/pkg/util/logutil" "github.com/pingcap/tidb/pkg/util/ranger" "go.uber.org/zap" @@ -307,6 +308,22 @@ func (ds *DataSource) derivePathStatsAndTryHeuristics() error { selected, uniqueBest, refinedBest *util.AccessPath isRefinedPath bool ) + // step1: if user prefer tiFlash store type, tiFlash path should always be built anyway ahead. + var tiflashPath *util.AccessPath + if ds.preferStoreType&h.PreferTiFlash != 0 { + for _, path := range ds.possibleAccessPaths { + if path.StoreType == kv.TiFlash { + err := ds.deriveTablePathStats(path, ds.pushedDownConds, false) + if err != nil { + return err + } + path.IsSingleScan = true + tiflashPath = path + break + } + } + } + // step2: kv path should follow the heuristic rules. for _, path := range ds.possibleAccessPaths { if path.IsTablePath() { err := ds.deriveTablePathStats(path, ds.pushedDownConds, false) @@ -318,7 +335,9 @@ func (ds *DataSource) derivePathStatsAndTryHeuristics() error { ds.deriveIndexPathStats(path, ds.pushedDownConds, false) path.IsSingleScan = ds.isSingleScan(path.FullIdxCols, path.FullIdxColLens) } + // step: 3 // Try some heuristic rules to select access path. + // tiFlash path also have table-range-scan (range point like here) to be heuristic treated. if len(path.Ranges) == 0 { selected = path break @@ -340,7 +359,13 @@ func (ds *DataSource) derivePathStatsAndTryHeuristics() error { for _, uniqueIdx := range uniqueIdxsWithDoubleScan { uniqueIdxAccessCols = append(uniqueIdxAccessCols, uniqueIdx.GetCol2LenFromAccessConds(ds.SCtx())) // Find the unique index with the minimal number of ranges as `uniqueBest`. - if uniqueBest == nil || len(uniqueIdx.Ranges) < len(uniqueBest.Ranges) { + /* + If the number of scan ranges are equal, choose the one with the least table predicates - meaning the unique index with the most index predicates. + Because the most index predicates means that it is more likely to fetch 0 index rows. + Example in the test "TestPointgetIndexChoosen". + */ + if uniqueBest == nil || len(uniqueIdx.Ranges) < len(uniqueBest.Ranges) || + (len(uniqueIdx.Ranges) == len(uniqueBest.Ranges) && len(uniqueIdx.TableFilters) < len(uniqueBest.TableFilters)) { uniqueBest = uniqueIdx } } @@ -381,13 +406,15 @@ func (ds *DataSource) derivePathStatsAndTryHeuristics() error { // heuristic rule pruning other path should consider hint prefer. // If no hints and some path matches a heuristic rule, just remove other possible paths. if selected != nil { - // if user wanna tiFlash read, while current heuristic choose a TiKV path. so we shouldn't prune other paths. - keep := ds.preferStoreType&preferTiFlash != 0 && selected.StoreType != kv.TiFlash + ds.possibleAccessPaths[0] = selected + ds.possibleAccessPaths = ds.possibleAccessPaths[:1] + // if user wanna tiFlash read, while current heuristic choose a TiKV path. so we shouldn't prune tiFlash path. + keep := ds.preferStoreType&h.PreferTiFlash != 0 && selected.StoreType != kv.TiFlash if keep { + // also keep tiflash path as well. + ds.possibleAccessPaths = append(ds.possibleAccessPaths, tiflashPath) return nil } - ds.possibleAccessPaths[0] = selected - ds.possibleAccessPaths = ds.possibleAccessPaths[:1] var tableName string if ds.TableAsName.O == "" { tableName = ds.tableInfo.Name.O @@ -415,9 +442,9 @@ func (ds *DataSource) derivePathStatsAndTryHeuristics() error { } } if ds.SCtx().GetSessionVars().StmtCtx.InVerboseExplain { - ds.SCtx().GetSessionVars().StmtCtx.AppendNote(errors.New(sb.String())) + ds.SCtx().GetSessionVars().StmtCtx.AppendNote(errors.NewNoStackError(sb.String())) } else { - ds.SCtx().GetSessionVars().StmtCtx.AppendExtraNote(errors.New(sb.String())) + ds.SCtx().GetSessionVars().StmtCtx.AppendExtraNote(errors.NewNoStackError(sb.String())) } } return nil @@ -982,7 +1009,7 @@ func (p *LogicalCTE) DeriveStats(_ []*property.StatsInfo, selfSchema *expression // Build push-downed predicates. if len(p.cte.pushDownPredicates) > 0 { newCond := expression.ComposeDNFCondition(p.SCtx(), p.cte.pushDownPredicates...) - newSel := LogicalSelection{Conditions: []expression.Expression{newCond}}.Init(p.SCtx(), p.cte.seedPartLogicalPlan.SelectBlockOffset()) + newSel := LogicalSelection{Conditions: []expression.Expression{newCond}}.Init(p.SCtx(), p.cte.seedPartLogicalPlan.QueryBlockOffset()) newSel.SetChildren(p.cte.seedPartLogicalPlan) p.cte.seedPartLogicalPlan = newSel p.cte.optFlag |= flagPredicatePushDown diff --git a/pkg/planner/core/stringer_test.go b/pkg/planner/core/stringer_test.go index 09e5b8dcebb6b..a527b5cb70668 100644 --- a/pkg/planner/core/stringer_test.go +++ b/pkg/planner/core/stringer_test.go @@ -117,7 +117,7 @@ func TestPlanStringer(t *testing.T) { stmt, err := parser.ParseOneStmt(tt.sql, "", "") require.NoError(t, err, "for %s", tt.sql) ret := &core.PreprocessorReturn{} - builder, _ := core.NewPlanBuilder().Init(tk.Session(), ret.InfoSchema, &hint.BlockHintProcessor{}) + builder, _ := core.NewPlanBuilder().Init(tk.Session(), ret.InfoSchema, hint.NewQBHintHandler(nil)) p, err := builder.Build(context.TODO(), stmt) require.NoError(t, err, "for %s", tt.sql) p, err = core.LogicalOptimize(context.TODO(), builder.GetOptFlag(), p.(core.LogicalPlan)) diff --git a/pkg/planner/core/task.go b/pkg/planner/core/task.go index 5808b1d0a5f2b..bcc564e2e944b 100644 --- a/pkg/planner/core/task.go +++ b/pkg/planner/core/task.go @@ -92,7 +92,7 @@ type copTask struct { rootTaskConds []expression.Expression // For table partition. - partitionInfo PartitionInfo + physPlanPartInfo PhysPlanPartInfo // expectCnt is the expected row count of upper task, 0 for unlimited. // It's used for deciding whether using paging distsql. @@ -100,7 +100,7 @@ type copTask struct { } func (t *copTask) invalid() bool { - return t.tablePlan == nil && t.indexPlan == nil + return t.tablePlan == nil && t.indexPlan == nil && len(t.idxMergePartPlans) == 0 } func (t *rootTask) invalid() bool { @@ -119,6 +119,8 @@ func (t *copTask) copy() task { return &nt } +// copTask plan should be careful with indexMergeReader, whose real plan is stored in +// idxMergePartPlans, when its indexPlanFinished is marked with false. func (t *copTask) plan() PhysicalPlan { if t.indexPlanFinished { return t.tablePlan @@ -189,7 +191,7 @@ func (t *copTask) MemoryUsage() (sum int64) { } sum = size.SizeOfInterface*(2+int64(cap(t.idxMergePartPlans)+cap(t.rootTaskConds))) + size.SizeOfBool*3 + size.SizeOfUint64 + - size.SizeOfPointer*(3+int64(cap(t.commonHandleCols)+cap(t.tblCols))) + size.SizeOfSlice*4 + t.partitionInfo.MemoryUsage() + size.SizeOfPointer*(3+int64(cap(t.commonHandleCols)+cap(t.tblCols))) + size.SizeOfSlice*4 + t.physPlanPartInfo.MemoryUsage() if t.indexPlan != nil { sum += t.indexPlan.MemoryUsage() } @@ -393,7 +395,7 @@ func negotiateCommonType(lType, rType *types.FieldType) (*types.FieldType, bool, func getProj(ctx sessionctx.Context, p PhysicalPlan) *PhysicalProjection { proj := PhysicalProjection{ Exprs: make([]expression.Expression, 0, len(p.Schema().Columns)), - }.Init(ctx, p.StatsInfo(), p.SelectBlockOffset()) + }.Init(ctx, p.StatsInfo(), p.QueryBlockOffset()) for _, col := range p.Schema().Columns { proj.Exprs = append(proj.Exprs, col) } @@ -588,8 +590,8 @@ func buildIndexLookUpTask(ctx sessionctx.Context, t *copTask) *rootTask { CommonHandleCols: t.commonHandleCols, expectedCnt: t.expectCnt, keepOrder: t.keepOrder, - }.Init(ctx, t.tablePlan.SelectBlockOffset()) - p.PartitionInfo = t.partitionInfo + }.Init(ctx, t.tablePlan.QueryBlockOffset()) + p.PlanPartInfo = t.physPlanPartInfo setTableScanToTableRowIDScan(p.tablePlan) p.SetStats(t.tablePlan.StatsInfo()) // Do not inject the extra Projection even if t.needExtraProj is set, or the schema between the phase-1 agg and @@ -604,7 +606,7 @@ func buildIndexLookUpTask(ctx sessionctx.Context, t *copTask) *rootTask { if t.needExtraProj && !aggPushedDown { schema := t.originSchema - proj := PhysicalProjection{Exprs: expression.Column2Exprs(schema.Columns)}.Init(ctx, p.StatsInfo(), t.tablePlan.SelectBlockOffset(), nil) + proj := PhysicalProjection{Exprs: expression.Column2Exprs(schema.Columns)}.Init(ctx, p.StatsInfo(), t.tablePlan.QueryBlockOffset(), nil) proj.SetSchema(schema) proj.SetChildren(p) newTask.p = proj @@ -692,14 +694,14 @@ func (t *copTask) convertToRootTaskImpl(ctx sessionctx.Context) *rootTask { IsIntersectionType: t.idxMergeIsIntersection, AccessMVIndex: t.idxMergeAccessMVIndex, KeepOrder: t.keepOrder, - }.Init(ctx, t.idxMergePartPlans[0].SelectBlockOffset()) - p.PartitionInfo = t.partitionInfo + }.Init(ctx, t.idxMergePartPlans[0].QueryBlockOffset()) + p.PlanPartInfo = t.physPlanPartInfo setTableScanToTableRowIDScan(p.tablePlan) newTask.p = p t.handleRootTaskConds(ctx, newTask) if t.needExtraProj { schema := t.originSchema - proj := PhysicalProjection{Exprs: expression.Column2Exprs(schema.Columns)}.Init(ctx, p.StatsInfo(), t.idxMergePartPlans[0].SelectBlockOffset(), nil) + proj := PhysicalProjection{Exprs: expression.Column2Exprs(schema.Columns)}.Init(ctx, p.StatsInfo(), t.idxMergePartPlans[0].QueryBlockOffset(), nil) proj.SetSchema(schema) proj.SetChildren(p) newTask.p = proj @@ -709,8 +711,8 @@ func (t *copTask) convertToRootTaskImpl(ctx sessionctx.Context) *rootTask { if t.indexPlan != nil && t.tablePlan != nil { newTask = buildIndexLookUpTask(ctx, t) } else if t.indexPlan != nil { - p := PhysicalIndexReader{indexPlan: t.indexPlan}.Init(ctx, t.indexPlan.SelectBlockOffset()) - p.PartitionInfo = t.partitionInfo + p := PhysicalIndexReader{indexPlan: t.indexPlan}.Init(ctx, t.indexPlan.QueryBlockOffset()) + p.PlanPartInfo = t.physPlanPartInfo p.SetStats(t.indexPlan.StatsInfo()) newTask.p = p } else { @@ -728,8 +730,8 @@ func (t *copTask) convertToRootTaskImpl(ctx sessionctx.Context) *rootTask { tablePlan: t.tablePlan, StoreType: ts.StoreType, IsCommonHandle: ts.Table.IsCommonHandle, - }.Init(ctx, t.tablePlan.SelectBlockOffset()) - p.PartitionInfo = t.partitionInfo + }.Init(ctx, t.tablePlan.QueryBlockOffset()) + p.PlanPartInfo = t.physPlanPartInfo p.SetStats(t.tablePlan.StatsInfo()) // If agg was pushed down in attach2Task(), the partial agg was placed on the top of tablePlan, the final agg was @@ -745,7 +747,7 @@ func (t *copTask) convertToRootTaskImpl(ctx sessionctx.Context) *rootTask { } if t.needExtraProj && !aggPushedDown { - proj := PhysicalProjection{Exprs: expression.Column2Exprs(t.originSchema.Columns)}.Init(ts.SCtx(), ts.StatsInfo(), ts.SelectBlockOffset(), nil) + proj := PhysicalProjection{Exprs: expression.Column2Exprs(t.originSchema.Columns)}.Init(ts.SCtx(), ts.StatsInfo(), ts.QueryBlockOffset(), nil) proj.SetSchema(t.originSchema) proj.SetChildren(p) newTask.p = proj @@ -765,7 +767,7 @@ func (t *copTask) handleRootTaskConds(ctx sessionctx.Context, newTask *rootTask) logutil.BgLogger().Debug("calculate selectivity failed, use selection factor", zap.Error(err)) selectivity = SelectionFactor } - sel := PhysicalSelection{Conditions: t.rootTaskConds}.Init(ctx, newTask.p.StatsInfo().Scale(selectivity), newTask.p.SelectBlockOffset()) + sel := PhysicalSelection{Conditions: t.rootTaskConds}.Init(ctx, newTask.p.StatsInfo().Scale(selectivity), newTask.p.QueryBlockOffset()) sel.fromDataSource = true sel.SetChildren(newTask.p) newTask.p = sel @@ -847,7 +849,7 @@ func (p *PhysicalLimit) attach2Task(tasks ...task) task { childProfile := cop.tablePlan.StatsInfo() // but "regionNum" is unknown since the copTask can be a double read, so we ignore it now. stats := deriveLimitStats(childProfile, float64(newCount)) - pushedDownLimit := PhysicalLimit{PartitionBy: newPartitionBy, Count: newCount}.Init(p.SCtx(), stats, p.SelectBlockOffset()) + pushedDownLimit := PhysicalLimit{PartitionBy: newPartitionBy, Count: newCount}.Init(p.SCtx(), stats, p.QueryBlockOffset()) pushedDownLimit.SetChildren(cop.tablePlan) cop.tablePlan = pushedDownLimit // Don't use clone() so that Limit and its children share the same schema. Otherwise, the virtual generated column may not be resolved right. @@ -864,7 +866,7 @@ func (p *PhysicalLimit) attach2Task(tasks ...task) task { // Strictly speaking, for the row count of stats, we should multiply newCount with "regionNum", // but "regionNum" is unknown since the copTask can be a double read, so we ignore it now. stats := deriveLimitStats(childProfile, float64(newCount)) - pushedDownLimit := PhysicalLimit{PartitionBy: newPartitionBy, Count: newCount}.Init(p.SCtx(), stats, p.SelectBlockOffset()) + pushedDownLimit := PhysicalLimit{PartitionBy: newPartitionBy, Count: newCount}.Init(p.SCtx(), stats, p.QueryBlockOffset()) cop = attachPlan2Task(pushedDownLimit, cop).(*copTask) // Don't use clone() so that Limit and its children share the same schema. Otherwise the virtual generated column may not be resolved right. pushedDownLimit.SetSchema(pushedDownLimit.children[0].Schema()) @@ -884,7 +886,7 @@ func (p *PhysicalLimit) attach2Task(tasks ...task) task { for _, partialScan := range cop.idxMergePartPlans { childProfile := partialScan.StatsInfo() stats := deriveLimitStats(childProfile, float64(newCount)) - pushedDownLimit := PhysicalLimit{PartitionBy: newPartitionBy, Count: newCount}.Init(p.SCtx(), stats, p.SelectBlockOffset()) + pushedDownLimit := PhysicalLimit{PartitionBy: newPartitionBy, Count: newCount}.Init(p.SCtx(), stats, p.QueryBlockOffset()) pushedDownLimit.SetChildren(partialScan) pushedDownLimit.SetSchema(pushedDownLimit.children[0].Schema()) limitChildren = append(limitChildren, pushedDownLimit) @@ -924,7 +926,7 @@ func (p *PhysicalLimit) attach2Task(tasks ...task) task { newCount := p.Offset + p.Count childProfile := mpp.plan().StatsInfo() stats := deriveLimitStats(childProfile, float64(newCount)) - pushedDownLimit := PhysicalLimit{Count: newCount, PartitionBy: newPartitionBy}.Init(p.SCtx(), stats, p.SelectBlockOffset()) + pushedDownLimit := PhysicalLimit{Count: newCount, PartitionBy: newPartitionBy}.Init(p.SCtx(), stats, p.QueryBlockOffset()) mpp = attachPlan2Task(pushedDownLimit, mpp).(*mppTask) pushedDownLimit.SetSchema(pushedDownLimit.children[0].Schema()) t = mpp.convertToRootTask(p.SCtx()) @@ -968,7 +970,7 @@ func (p *PhysicalLimit) sinkIntoIndexLookUp(t task) bool { if p.Schema().Len() != reader.Schema().Len() { extraProj := PhysicalProjection{ Exprs: expression.Column2Exprs(p.schema.Columns), - }.Init(p.SCtx(), p.StatsInfo(), p.SelectBlockOffset(), nil) + }.Init(p.SCtx(), p.StatsInfo(), p.QueryBlockOffset(), nil) extraProj.SetSchema(p.schema) // If the root.p is already a Projection. We left the optimization for the later Projection Elimination. extraProj.SetChildren(root.p) @@ -1036,7 +1038,7 @@ func (p *PhysicalLimit) sinkIntoIndexMerge(t task) bool { if needProj { extraProj := PhysicalProjection{ Exprs: expression.Column2Exprs(p.schema.Columns), - }.Init(p.SCtx(), p.StatsInfo(), p.SelectBlockOffset(), nil) + }.Init(p.SCtx(), p.StatsInfo(), p.QueryBlockOffset(), nil) extraProj.SetSchema(p.schema) // If the root.p is already a Projection. We left the optimization for the later Projection Elimination. extraProj.SetChildren(root.p) @@ -1078,7 +1080,7 @@ func (p *PhysicalTopN) getPushedDownTopN(childPlan PhysicalPlan) *PhysicalTopN { ByItems: newByItems, PartitionBy: newPartitionBy, Count: newCount, - }.Init(p.SCtx(), stats, p.SelectBlockOffset(), p.GetChildReqProps(0)) + }.Init(p.SCtx(), stats, p.QueryBlockOffset(), p.GetChildReqProps(0)) topN.SetChildren(childPlan) return topN } @@ -1111,7 +1113,7 @@ func (p *PhysicalTopN) canExpressionConvertedToPB(storeTp kv.StoreType) bool { for _, item := range p.ByItems { exprs = append(exprs, item.Expr) } - return expression.CanExprsPushDown(p.SCtx().GetSessionVars().StmtCtx, exprs, p.SCtx().GetClient(), storeTp) + return expression.CanExprsPushDown(p.SCtx(), exprs, p.SCtx().GetClient(), storeTp) } // containVirtualColumn checks whether TopN.ByItems contains virtual generated columns. @@ -1212,12 +1214,12 @@ func (p *PhysicalExpand) attach2Task(tasks ...task) task { func (p *PhysicalProjection) attach2Task(tasks ...task) task { t := tasks[0].copy() if cop, ok := t.(*copTask); ok { - if (len(cop.rootTaskConds) == 0 && len(cop.idxMergePartPlans) == 0) && expression.CanExprsPushDown(p.SCtx().GetSessionVars().StmtCtx, p.Exprs, p.SCtx().GetClient(), cop.getStoreType()) { + if (len(cop.rootTaskConds) == 0 && len(cop.idxMergePartPlans) == 0) && expression.CanExprsPushDown(p.SCtx(), p.Exprs, p.SCtx().GetClient(), cop.getStoreType()) { copTask := attachPlan2Task(p, cop) return copTask } } else if mpp, ok := t.(*mppTask); ok { - if expression.CanExprsPushDown(p.SCtx().GetSessionVars().StmtCtx, p.Exprs, p.SCtx().GetClient(), kv.TiFlash) { + if expression.CanExprsPushDown(p.SCtx(), p.Exprs, p.SCtx().GetClient(), kv.TiFlash) { p.SetChildren(mpp.p) mpp.p = p return mpp @@ -1274,8 +1276,7 @@ func (p *PhysicalUnionAll) attach2Task(tasks ...task) task { func (sel *PhysicalSelection) attach2Task(tasks ...task) task { if mppTask, _ := tasks[0].(*mppTask); mppTask != nil { // always push to mpp task. - sc := sel.SCtx().GetSessionVars().StmtCtx - if expression.CanExprsPushDown(sc, sel.Conditions, sel.SCtx().GetClient(), kv.TiFlash) { + if expression.CanExprsPushDown(sel.SCtx(), sel.Conditions, sel.SCtx().GetClient(), kv.TiFlash) { return attachPlan2Task(sel, mppTask.copy()) } } @@ -1302,7 +1303,7 @@ func CheckAggCanPushCop(sctx sessionctx.Context, aggFuncs []*aggregation.AggFunc ret = false break } - if !expression.CanExprsPushDownWithExtraInfo(sc, aggFunc.Args, client, storeType, aggFunc.Name == ast.AggFuncSum) { + if !expression.CanExprsPushDownWithExtraInfo(sctx, aggFunc.Args, client, storeType, aggFunc.Name == ast.AggFuncSum) { reason = "arguments of AggFunc `" + aggFunc.Name + "` contains unsupported exprs" ret = false break @@ -1313,7 +1314,7 @@ func CheckAggCanPushCop(sctx sessionctx.Context, aggFuncs []*aggregation.AggFunc for _, item := range aggFunc.OrderByItems { exprs = append(exprs, item.Expr) } - if !expression.CanExprsPushDownWithExtraInfo(sc, exprs, client, storeType, false) { + if !expression.CanExprsPushDownWithExtraInfo(sctx, exprs, client, storeType, false) { reason = "arguments of AggFunc `" + aggFunc.Name + "` contains unsupported exprs in order-by clause" ret = false break @@ -1330,7 +1331,7 @@ func CheckAggCanPushCop(sctx sessionctx.Context, aggFuncs []*aggregation.AggFunc reason = "groupByItems contain virtual columns, which is not supported now" ret = false } - if ret && !expression.CanExprsPushDown(sc, groupByItems, client, storeType) { + if ret && !expression.CanExprsPushDown(sctx, groupByItems, client, storeType) { reason = "groupByItems contain unsupported exprs" ret = false } @@ -1340,7 +1341,7 @@ func CheckAggCanPushCop(sctx sessionctx.Context, aggFuncs []*aggregation.AggFunc if storeType == kv.UnSpecified { storageName = "storage layer" } - warnErr := errors.New("Aggregation can not be pushed to " + storageName + " because " + reason) + warnErr := errors.NewNoStackError("Aggregation can not be pushed to " + storageName + " because " + reason) if sc.InExplainStmt { sc.AppendWarning(warnErr) } else { @@ -1678,7 +1679,7 @@ func (p *basePhysicalAgg) convertAvgForMPP() *PhysicalProjection { Exprs: exprs, CalculateNoDelay: false, AvoidColumnEvaluator: false, - }.Init(p.SCtx(), p.StatsInfo(), p.SelectBlockOffset(), p.GetChildReqProps(0).CloneEssentialFields()) + }.Init(p.SCtx(), p.StatsInfo(), p.QueryBlockOffset(), p.GetChildReqProps(0).CloneEssentialFields()) proj.SetSchema(p.schema) p.AggFuncs = newAggFuncs @@ -1727,7 +1728,7 @@ func (p *basePhysicalAgg) newPartialAggregate(copTaskType kv.StoreType, isMPPTas AggFuncs: finalPref.AggFuncs, GroupByItems: finalPref.GroupByItems, MppRunMode: p.MppRunMode, - }.initForStream(p.SCtx(), p.StatsInfo(), p.SelectBlockOffset(), prop) + }.initForStream(p.SCtx(), p.StatsInfo(), p.QueryBlockOffset(), prop) finalAgg.schema = finalPref.Schema return partialAgg, finalAgg } @@ -1736,7 +1737,7 @@ func (p *basePhysicalAgg) newPartialAggregate(copTaskType kv.StoreType, isMPPTas AggFuncs: finalPref.AggFuncs, GroupByItems: finalPref.GroupByItems, MppRunMode: p.MppRunMode, - }.initForHash(p.SCtx(), p.StatsInfo(), p.SelectBlockOffset(), prop) + }.initForHash(p.SCtx(), p.StatsInfo(), p.QueryBlockOffset(), prop) finalAgg.schema = finalPref.Schema // partialAgg and finalAgg use the same ref of stats return partialAgg, finalAgg @@ -1791,7 +1792,7 @@ func (p *basePhysicalAgg) canUse3Stage4MultiDistinctAgg() (can bool, gss express } compressed := groupingSets.Merge() if len(compressed) != len(groupingSets) { - p.SCtx().GetSessionVars().StmtCtx.AppendWarning(errors.Errorf("Some grouping sets should be merged")) + p.SCtx().GetSessionVars().StmtCtx.AppendWarning(errors.NewNoStackErrorf("Some grouping sets should be merged")) // todo arenatlx: some grouping set should be merged which is not supported by now temporarily. return false, nil } @@ -1807,7 +1808,7 @@ func (p *basePhysicalAgg) canUse3Stage4MultiDistinctAgg() (can bool, gss express groupingSetOffset := groupingSets.TargetOne(fun.Args) if groupingSetOffset == -1 { // todo: if we couldn't find a existed current valid group layout, we need to copy the column out from being filled with null value. - p.SCtx().GetSessionVars().StmtCtx.AppendWarning(errors.Errorf("couldn't find a proper group set for normal agg")) + p.SCtx().GetSessionVars().StmtCtx.AppendWarning(errors.NewNoStackErrorf("couldn't find a proper group set for normal agg")) return false, nil } // starting with 1 @@ -1890,6 +1891,12 @@ func RemoveUnnecessaryFirstRow( // the firstrow in root task can not be removed. break } + // Skip if it's a constant. + // For SELECT DISTINCT SQRT(1) FROM t. + // We shouldn't remove the firstrow(SQRT(1)). + if _, ok := gbyExpr.(*expression.Constant); ok { + continue + } if gbyExpr.Equal(sctx, aggFunc.Args[0]) { canOptimize = true firstRowFuncMap[aggFunc].Args[0] = finalGbyItems[j] @@ -2186,7 +2193,7 @@ func (p *PhysicalHashAgg) adjust3StagePhaseAgg(partialAgg, finalAgg PhysicalPlan stats.RowCount = stats.RowCount * float64(len(groupingSets)) physicalExpand := PhysicalExpand{ GroupingSets: groupingSets, - }.Init(p.SCtx(), stats, mpp.p.SelectBlockOffset()) + }.Init(p.SCtx(), stats, mpp.p.QueryBlockOffset()) // generate a new column as groupingID to identify which this row is targeting for. tp := types.NewFieldType(mysql.TypeLonglong) tp.SetFlag(mysql.UnsignedFlag | mysql.NotNullFlag) @@ -2208,7 +2215,7 @@ func (p *PhysicalHashAgg) adjust3StagePhaseAgg(partialAgg, finalAgg PhysicalPlan } cloneHashAgg := clonedAgg.(*PhysicalHashAgg) // Clone(), it will share same base-plan elements from the finalAgg, including id,tp,stats. Make a new one here. - cloneHashAgg.Plan = base.NewBasePlan(cloneHashAgg.SCtx(), cloneHashAgg.TP(), cloneHashAgg.SelectBlockOffset()) + cloneHashAgg.Plan = base.NewBasePlan(cloneHashAgg.SCtx(), cloneHashAgg.TP(), cloneHashAgg.QueryBlockOffset()) cloneHashAgg.SetStats(finalAgg.StatsInfo()) // reuse the final agg stats here. // step1: adjust partial agg, for normal agg here, adjust it to target for specified group data. @@ -2216,7 +2223,7 @@ func (p *PhysicalHashAgg) adjust3StagePhaseAgg(partialAgg, finalAgg PhysicalPlan // customized proj here rather than depending on postOptimize to insert a blunt one for us. // // proj4Partial output all the base col from lower op + caseWhen proj cols. - proj4Partial := new(PhysicalProjection).Init(p.SCtx(), mpp.p.StatsInfo(), mpp.p.SelectBlockOffset()) + proj4Partial := new(PhysicalProjection).Init(p.SCtx(), mpp.p.StatsInfo(), mpp.p.QueryBlockOffset()) for _, col := range mpp.p.Schema().Columns { proj4Partial.Exprs = append(proj4Partial.Exprs, col) } @@ -2411,7 +2418,7 @@ func (p *PhysicalHashAgg) attach2TaskForMpp(tasks ...task) task { if proj == nil { proj = PhysicalProjection{ Exprs: make([]expression.Expression, 0, len(p.Schema().Columns)), - }.Init(p.SCtx(), p.StatsInfo(), p.SelectBlockOffset()) + }.Init(p.SCtx(), p.StatsInfo(), p.QueryBlockOffset()) for _, col := range p.Schema().Columns { proj.Exprs = append(proj.Exprs, col) } @@ -2601,7 +2608,7 @@ func (t *mppTask) MemoryUsage() (sum int64) { func collectPartitionInfosFromMPPPlan(p *PhysicalTableReader, mppPlan PhysicalPlan) { switch x := mppPlan.(type) { case *PhysicalTableScan: - p.PartitionInfos = append(p.PartitionInfos, tableScanAndPartitionInfo{x, x.PartitionInfo}) + p.TableScanAndPartitionInfos = append(p.TableScanAndPartitionInfos, tableScanAndPartitionInfo{x, x.PlanPartInfo}) default: for _, ch := range mppPlan.Children() { collectPartitionInfosFromMPPPlan(p, ch) @@ -2647,7 +2654,7 @@ func (t *mppTask) convertToRootTaskImpl(ctx sessionctx.Context) *rootTask { p := PhysicalTableReader{ tablePlan: sender, StoreType: kv.TiFlash, - }.Init(ctx, t.p.SelectBlockOffset()) + }.Init(ctx, t.p.QueryBlockOffset()) p.SetStats(t.p.StatsInfo()) collectPartitionInfosFromMPPPlan(p, t.p) rt := &rootTask{ @@ -2674,7 +2681,7 @@ func (t *mppTask) convertToRootTaskImpl(ctx sessionctx.Context) *rootTask { logutil.BgLogger().Debug("calculate selectivity failed, use selection factor", zap.Error(err)) selectivity = SelectionFactor } - sel := PhysicalSelection{Conditions: t.rootTaskConds}.Init(ctx, rt.p.StatsInfo().Scale(selectivity), rt.p.SelectBlockOffset()) + sel := PhysicalSelection{Conditions: t.rootTaskConds}.Init(ctx, rt.p.StatsInfo().Scale(selectivity), rt.p.QueryBlockOffset()) sel.fromDataSource = true sel.SetChildren(rt.p) rt.p = sel diff --git a/pkg/planner/core/testdata/index_merge_suite_out.json b/pkg/planner/core/testdata/index_merge_suite_out.json index 3d67e5e372251..cfa13020f7c1a 100644 --- a/pkg/planner/core/testdata/index_merge_suite_out.json +++ b/pkg/planner/core/testdata/index_merge_suite_out.json @@ -131,8 +131,8 @@ "IndexMerge 0.00 root type: intersection", "├─IndexRangeScan(Build) 10.00 cop[tikv] table:t5, index:is1(s1) range:[\"Abc\",\"Abc\"], keep order:false, stats:pseudo", "├─IndexRangeScan(Build) 3333.33 cop[tikv] table:t5, index:is2(s2) range:(\"zzz\",+inf], keep order:false, stats:pseudo", - "├─IndexRangeScan(Build) 3323.33 cop[tikv] table:t5, index:is3(s3) range:[-inf,\"B啊a\"), keep order:false, stats:pseudo", - "├─IndexRangeScan(Build) 10.00 cop[tikv] table:t5, index:is4(s4) range:[\"CcC\",\"CcC\"], keep order:false, stats:pseudo", + "├─IndexRangeScan(Build) 3323.33 cop[tikv] table:t5, index:is3(s3) range:[-inf,\"\\x0eJ\\xfb@\\xd5J\\x0e3\"), keep order:false, stats:pseudo", + "├─IndexRangeScan(Build) 10.00 cop[tikv] table:t5, index:is4(s4) range:[\"CCC\",\"CCC\"], keep order:false, stats:pseudo", "└─TableRowIDScan(Probe) 0.00 cop[tikv] table:t5 keep order:false, stats:pseudo" ], "Result": [ @@ -144,7 +144,7 @@ "Plan": [ "IndexMerge 0.03 root type: intersection", "├─IndexRangeScan(Build) 33.33 cop[tikv] table:t6, index:PRIMARY(s1, s2) range:(\"Abc\" \"zzz\",\"Abc\" +inf], keep order:false, stats:pseudo", - "├─IndexRangeScan(Build) 10.00 cop[tikv] table:t6, index:is3(s3) range:[\"A啊a\",\"A啊a\"], keep order:false, stats:pseudo", + "├─IndexRangeScan(Build) 10.00 cop[tikv] table:t6, index:is3(s3) range:[\"\\x0e3\\xfb@\\xd5J\\x0e3\",\"\\x0e3\\xfb@\\xd5J\\x0e3\"], keep order:false, stats:pseudo", "└─Selection(Probe) 0.03 cop[tikv] gt(test.t6.s2, \"zzz\"), not(like(test.t6.s4, \"Cd_\", 92))", " └─TableRowIDScan 0.03 cop[tikv] table:t6 keep order:false, stats:pseudo" ], @@ -172,13 +172,14 @@ { "SQL": "select /*+ use_index_merge(t8, primary,is2,is3,is4,is5) */ * from t8 where s1 like '啊A%' and s2 > 'abc' and s3 > 'cba' and s4 in ('aA', '??') and s5 = 'test,2'", "Plan": [ - "Selection 1.42 root eq(test.t8.s5, \"test,2\")", - "└─IndexMerge 0.59 root type: intersection", - " ├─IndexRangeScan(Build) 3333.33 cop[tikv] table:t8, index:is2(s2) range:(0x616263,+inf], keep order:false, stats:pseudo", - " ├─IndexRangeScan(Build) 3333.33 cop[tikv] table:t8, index:is3(s3) range:(0x636261,+inf], keep order:false, stats:pseudo", + "Selection 0.04 root eq(test.t8.s5, \"test,2\")", + "└─IndexMerge 0.06 root type: intersection", + " ├─IndexRangeScan(Build) 250.00 cop[tikv] table:t8, index:PRIMARY(s1) range:[\"UJ\\x00A\",\"UJ\\x00B\"), keep order:false, stats:pseudo", + " ├─IndexRangeScan(Build) 3333.33 cop[tikv] table:t8, index:is2(s2) range:(\"abc\",+inf], keep order:false, stats:pseudo", + " ├─IndexRangeScan(Build) 3333.33 cop[tikv] table:t8, index:is3(s3) range:(\"cba\",+inf], keep order:false, stats:pseudo", " ├─IndexRangeScan(Build) 20.00 cop[tikv] table:t8, index:is4(s4) range:[\"aA\",\"aA\"], [\"??\",\"??\"], keep order:false, stats:pseudo", - " └─Selection(Probe) 0.59 cop[tikv] gt(test.t8.s3, \"cba\"), like(test.t8.s1, \"啊A%\", 92)", - " └─TableRowIDScan 2.22 cop[tikv] table:t8 keep order:false, stats:pseudo" + " └─Selection(Probe) 0.06 cop[tikv] gt(test.t8.s3, \"cba\"), like(test.t8.s1, \"啊A%\", 92)", + " └─TableRowIDScan 0.06 cop[tikv] table:t8 keep order:false, stats:pseudo" ], "Result": [ "啊aabbccdd abcc cccc aA tEsT,2" diff --git a/pkg/planner/core/tests/prepare/issue/issue_test.go b/pkg/planner/core/tests/prepare/issue/issue_test.go deleted file mode 100644 index e3bbb26563855..0000000000000 --- a/pkg/planner/core/tests/prepare/issue/issue_test.go +++ /dev/null @@ -1,127 +0,0 @@ -// Copyright 2018 PingCAP, 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. - -package issue - -import ( - "testing" - - "github.com/pingcap/tidb/pkg/parser/auth" - "github.com/pingcap/tidb/pkg/testkit" - "github.com/stretchr/testify/require" -) - -func TestIssueEnablePreparedPlanCache2(t *testing.T) { - // Issue18066 - store := testkit.CreateMockStore(t) - tk := testkit.NewTestKit(t, store) - tk.MustExec(`set tidb_enable_prepared_plan_cache=1`) - tk.RefreshConnectionID() - require.NoError(t, tk.Session().Auth(&auth.UserIdentity{Username: "root", Hostname: "%"}, nil, nil, nil)) - - tk.MustExec("use test") - tk.MustExec("drop table if exists t") - tk.MustExec("create table t(a int)") - tk.MustExec("prepare stmt from 'select * from t'") - tk.MustQuery("execute stmt").Check(testkit.Rows()) - tk.MustQuery("select EXEC_COUNT,plan_cache_hits, plan_in_cache from information_schema.statements_summary where digest_text='select * from `t`'").Check( - testkit.Rows("1 0 0")) - tk.MustQuery("execute stmt").Check(testkit.Rows()) - tk.MustQuery("select EXEC_COUNT,plan_cache_hits, plan_in_cache from information_schema.statements_summary where digest_text='select * from `t`'").Check( - testkit.Rows("2 1 1")) - tk.MustExec("prepare stmt from 'select * from t'") - tk.MustQuery("execute stmt").Check(testkit.Rows()) - tk.MustQuery("select @@last_plan_from_cache").Check(testkit.Rows("1")) - tk.MustQuery("select EXEC_COUNT, plan_cache_hits, plan_in_cache from information_schema.statements_summary where digest_text='select * from `t`'").Check( - testkit.Rows("3 2 1")) - // TestIssue26873 - tk.MustExec("drop table if exists t") - - tk.MustExec("create table t(a int primary key, b int, c int)") - tk.MustExec("prepare stmt from 'select * from t where a = 2 or a = ?'") - tk.MustExec("set @p = 3") - tk.MustQuery("execute stmt using @p").Check(testkit.Rows()) - tk.MustQuery("select @@last_plan_from_cache").Check(testkit.Rows("0")) - tk.MustQuery("execute stmt using @p").Check(testkit.Rows()) - tk.MustQuery("select @@last_plan_from_cache").Check(testkit.Rows("0")) - // TestIssue29511 - tk.MustExec("drop table if exists t") - - tk.MustExec("CREATE TABLE `t` (`COL1` bigint(20) DEFAULT NULL COMMENT 'WITH DEFAULT', UNIQUE KEY `UK_COL1` (`COL1`))") - tk.MustExec("insert into t values(-3865356285544170443),(9223372036854775807);") - tk.MustExec("prepare stmt from 'select/*+ hash_agg() */ max(col1) from t where col1 = ? and col1 > ?;';") - tk.MustExec("set @a=-3865356285544170443, @b=-4055949188488870713;") - tk.MustQuery("execute stmt using @a,@b;").Check(testkit.Rows("-3865356285544170443")) - // TestIssue23671 - tk.MustExec("drop table if exists t") - - tk.MustExec("create table t (a int, b int, index ab(a, b))") - tk.MustExec("insert into t values (1, 1), (2, 2)") - tk.MustExec("prepare s1 from 'select * from t use index(ab) where a>=? and b>=? and b<=?'") - tk.MustExec("set @a=1, @b=1, @c=1") - tk.MustQuery("execute s1 using @a, @b, @c").Check(testkit.Rows("1 1")) - tk.MustExec("set @a=1, @b=1, @c=10") - tk.MustQuery("execute s1 using @a, @b, @c").Check(testkit.Rows("1 1", "2 2")) - tk.MustQuery("select @@last_plan_from_cache").Check(testkit.Rows("0")) // b>=1 and b<=1 --> b=1 - // TestIssue28920 - tk.MustExec(`drop table if exists UK_GCOL_VIRTUAL_18928`) - tk.MustExec(` - CREATE TABLE UK_GCOL_VIRTUAL_18928 ( - COL102 bigint(20) DEFAULT NULL, - COL103 bigint(20) DEFAULT NULL, - COL1 bigint(20) GENERATED ALWAYS AS (COL102 & 10) VIRTUAL, - COL2 varchar(20) DEFAULT NULL, - COL4 datetime DEFAULT NULL, - COL3 bigint(20) DEFAULT NULL, - COL5 float DEFAULT NULL, - UNIQUE KEY UK_COL1 (COL1))`) - tk.MustExec(`insert into UK_GCOL_VIRTUAL_18928(col102,col2) values("-5175976006730879891", "屘厒镇览錻碛斵大擔觏譨頙硺箄魨搝珄鋧扭趖")`) - tk.MustExec(`prepare stmt from 'SELECT * FROM UK_GCOL_VIRTUAL_18928 WHERE col1 < ? AND col2 != ?'`) - tk.MustExec(`set @a=10, @b="aa"`) - tk.MustQuery(`execute stmt using @a, @b`).Check(testkit.Rows("-5175976006730879891 8 屘厒镇览錻碛斵大擔觏譨頙硺箄魨搝珄鋧扭趖 ")) - - // Issue29296 - tk.MustExec(`drop table if exists UK_MU14722`) - tk.MustExec(`CREATE TABLE UK_MU14722 ( - COL1 tinytext DEFAULT NULL, - COL2 tinyint(16) DEFAULT NULL, - COL3 datetime DEFAULT NULL, - COL4 int(11) DEFAULT NULL, - UNIQUE KEY U_M_COL (COL1(10)), - UNIQUE KEY U_M_COL2 (COL2), - UNIQUE KEY U_M_COL3 (COL3))`) - tk.MustExec(`insert into UK_MU14722 values("輮睅麤敜溺她晁瀪襄頮鹛涓誗钷廔筪惌嶙鎢塴", -121, "3383-02-19 07:58:28" , -639457963), - ("偧孇鱓鼂瘠钻篝醗時鷷聽箌磇砀玸眞扦鸇祈灇", 127, "7902-03-05 08:54:04", -1094128660), - ("浀玡慃淛漉围甧鴎史嬙砊齄w章炢忲噑硓哈樘", -127, "5813-04-16 03:07:20", -333397107), - ("鑝粼啎鸼贖桖弦簼赭蠅鏪鐥蕿捐榥疗耹岜鬓槊", -117, "7753-11-24 10:14:24", 654872077)`) - tk.MustExec(`prepare stmt from 'SELECT * FROM UK_MU14722 WHERE col2 > ? OR col2 BETWEEN ? AND ? ORDER BY COL2 + ? LIMIT 3'`) - tk.MustExec(`set @a=30410, @b=3937, @c=22045, @d=-4374`) - tk.MustQuery(`execute stmt using @a,@b,@c,@d`).Check(testkit.Rows()) - tk.MustExec(`set @a=127, @b=127, @c=127, @d=127`) - tk.MustQuery(`execute stmt using @a,@b,@c,@d`).Check(testkit.Rows(`偧孇鱓鼂瘠钻篝醗時鷷聽箌磇砀玸眞扦鸇祈灇 127 7902-03-05 08:54:04 -1094128660`)) - // TestIssue28246 - tk.MustExec("drop table if exists PK_AUTO_RANDOM9111;") - tk.MustExec("CREATE TABLE `PK_AUTO_RANDOM9111` ( `COL1` bigint(45) NOT NULL , `COL2` varchar(20) DEFAULT NULL, `COL4` datetime DEFAULT NULL, `COL3` bigint(20) DEFAULT NULL, `COL5` float DEFAULT NULL, PRIMARY KEY (`COL1`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;") - tk.MustExec("insert into PK_AUTO_RANDOM9111(col1) values (-9223372036854775808), (9223372036854775807);") - tk.MustExec("set @a=9223372036854775807, @b=1") - tk.MustExec(`prepare stmt from 'select min(col1) from PK_AUTO_RANDOM9111 where col1 > ?;';`) - tk.MustQuery("execute stmt using @a").Check(testkit.Rows("")) - // The plan contains the tableDual, so it will not be cached. - tk.MustQuery("execute stmt using @a").Check(testkit.Rows("")) - tk.MustQuery("select @@last_plan_from_cache").Check(testkit.Rows("0")) - tk.MustQuery("execute stmt using @b").Check(testkit.Rows("9223372036854775807")) - tk.MustQuery("select @@last_plan_from_cache").Check(testkit.Rows("0")) - tk.MustQuery("execute stmt using @a").Check(testkit.Rows("")) - tk.MustQuery("select @@last_plan_from_cache").Check(testkit.Rows("1")) -} diff --git a/pkg/planner/core/tests/prepare/main_test.go b/pkg/planner/core/tests/prepare/main_test.go index f58acb5396398..91929937355c8 100644 --- a/pkg/planner/core/tests/prepare/main_test.go +++ b/pkg/planner/core/tests/prepare/main_test.go @@ -27,6 +27,7 @@ func TestMain(m *testing.M) { flag.Parse() opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), } goleak.VerifyTestMain(m, opts...) diff --git a/pkg/planner/core/tests/prepare/prepare_test.go b/pkg/planner/core/tests/prepare/prepare_test.go index 99ace9c81672e..6e54fb50395a9 100644 --- a/pkg/planner/core/tests/prepare/prepare_test.go +++ b/pkg/planner/core/tests/prepare/prepare_test.go @@ -395,7 +395,7 @@ func TestPrepareCacheDeferredFunction(t *testing.T) { stmt, err := p.ParseOneStmt(sql1, "", "") require.NoError(t, err) is := tk.Session().GetInfoSchema().(infoschema.InfoSchema) - builder, _ := core.NewPlanBuilder().Init(tk.Session(), is, &hint.BlockHintProcessor{}) + builder, _ := core.NewPlanBuilder().Init(tk.Session(), is, hint.NewQBHintHandler(nil)) p, err := builder.Build(ctx, stmt) require.NoError(t, err) execPlan, ok := p.(*core.Execute) diff --git a/pkg/planner/core/tiflash_selection_late_materialization.go b/pkg/planner/core/tiflash_selection_late_materialization.go index 2a06ae67376e6..aab128d4166df 100644 --- a/pkg/planner/core/tiflash_selection_late_materialization.go +++ b/pkg/planner/core/tiflash_selection_late_materialization.go @@ -251,11 +251,11 @@ func predicatePushDownToTableScanImpl(sctx sessionctx.Context, physicalSelection if len(selectedConds) == 0 { return } - logutil.BgLogger().Debug("planner: push down conditions to table scan", zap.String("table", physicalTableScan.Table.Name.L), zap.String("conditions", string(expression.SortedExplainExpressionList(selectedConds)))) + logutil.BgLogger().Debug("planner: push down conditions to table scan", zap.String("table", physicalTableScan.Table.Name.L), zap.String("conditions", string(expression.SortedExplainExpressionList(sctx, selectedConds)))) // remove the pushed down conditions from selection removeSpecificExprsFromSelection(physicalSelection, selectedConds) // add the pushed down conditions to table scan - physicalTableScan.lateMaterializationFilterCondition = selectedConds + physicalTableScan.LateMaterializationFilterCondition = selectedConds // Update the row count of table scan after pushing down the conditions. physicalTableScan.StatsInfo().RowCount *= selectedSelectivity } diff --git a/pkg/planner/funcdep/extract_fd_test.go b/pkg/planner/funcdep/extract_fd_test.go index 0e7b27196e2f9..cc287a783dea0 100644 --- a/pkg/planner/funcdep/extract_fd_test.go +++ b/pkg/planner/funcdep/extract_fd_test.go @@ -222,7 +222,7 @@ func TestFDSet_ExtractFD(t *testing.T) { err = plannercore.Preprocess(context.Background(), tk.Session(), stmt, plannercore.WithPreprocessorReturn(&plannercore.PreprocessorReturn{InfoSchema: is})) require.NoError(t, err) require.NoError(t, sessiontxn.GetTxnManager(tk.Session()).AdviseWarmup()) - builder, _ := plannercore.NewPlanBuilder().Init(tk.Session(), is, &hint.BlockHintProcessor{}) + builder, _ := plannercore.NewPlanBuilder().Init(tk.Session(), is, hint.NewQBHintHandler(nil)) // extract FD to every OP p, err := builder.Build(ctx, stmt) require.NoError(t, err) @@ -321,7 +321,7 @@ func TestFDSet_ExtractFDForApply(t *testing.T) { err = plannercore.Preprocess(context.Background(), tk.Session(), stmt, plannercore.WithPreprocessorReturn(&plannercore.PreprocessorReturn{InfoSchema: is})) require.NoError(t, err, comment) require.NoError(t, sessiontxn.GetTxnManager(tk.Session()).AdviseWarmup()) - builder, _ := plannercore.NewPlanBuilder().Init(tk.Session(), is, &hint.BlockHintProcessor{}) + builder, _ := plannercore.NewPlanBuilder().Init(tk.Session(), is, hint.NewQBHintHandler(nil)) // extract FD to every OP p, err := builder.Build(ctx, stmt) require.NoError(t, err, comment) @@ -369,7 +369,7 @@ func TestFDSet_MakeOuterJoin(t *testing.T) { err = plannercore.Preprocess(context.Background(), tk.Session(), stmt, plannercore.WithPreprocessorReturn(&plannercore.PreprocessorReturn{InfoSchema: is})) require.NoError(t, err, comment) require.NoError(t, sessiontxn.GetTxnManager(tk.Session()).AdviseWarmup()) - builder, _ := plannercore.NewPlanBuilder().Init(tk.Session(), is, &hint.BlockHintProcessor{}) + builder, _ := plannercore.NewPlanBuilder().Init(tk.Session(), is, hint.NewQBHintHandler(nil)) // extract FD to every OP p, err := builder.Build(ctx, stmt) require.NoError(t, err, comment) diff --git a/pkg/planner/funcdep/main_test.go b/pkg/planner/funcdep/main_test.go index 61bf6ff8367f7..331fb39effb9a 100644 --- a/pkg/planner/funcdep/main_test.go +++ b/pkg/planner/funcdep/main_test.go @@ -25,6 +25,7 @@ func TestMain(m *testing.M) { testsetup.SetupForCommonTest() opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), diff --git a/pkg/planner/implementation/main_test.go b/pkg/planner/implementation/main_test.go index ed8082971b249..26969feb85e2a 100644 --- a/pkg/planner/implementation/main_test.go +++ b/pkg/planner/implementation/main_test.go @@ -25,6 +25,7 @@ func TestMain(m *testing.M) { testsetup.SetupForCommonTest() opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), } diff --git a/pkg/planner/memo/group_test.go b/pkg/planner/memo/group_test.go index 69958e8ec0398..14d9ec1d1aef1 100644 --- a/pkg/planner/memo/group_test.go +++ b/pkg/planner/memo/group_test.go @@ -140,7 +140,7 @@ func TestGroupFingerPrint(t *testing.T) { // Insert two LogicalSelections with same conditions but different order. require.Len(t, sel.Conditions, 2) newSelection := plannercore.LogicalSelection{ - Conditions: make([]expression.Expression, 2)}.Init(sel.SCtx(), sel.SelectBlockOffset()) + Conditions: make([]expression.Expression, 2)}.Init(sel.SCtx(), sel.QueryBlockOffset()) newSelection.Conditions[0], newSelection.Conditions[1] = sel.Conditions[1], sel.Conditions[0] newGroupExpr4 := NewGroupExpr(sel) newGroupExpr5 := NewGroupExpr(newSelection) diff --git a/pkg/planner/memo/main_test.go b/pkg/planner/memo/main_test.go index 2d77f8de00a9f..e4707f6c49380 100644 --- a/pkg/planner/memo/main_test.go +++ b/pkg/planner/memo/main_test.go @@ -25,6 +25,7 @@ func TestMain(m *testing.M) { testsetup.SetupForCommonTest() opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), diff --git a/pkg/planner/optimize.go b/pkg/planner/optimize.go index 67a7da1bff55e..5e18c9ed6c28f 100644 --- a/pkg/planner/optimize.go +++ b/pkg/planner/optimize.go @@ -20,7 +20,6 @@ import ( "math" "math/rand" "sort" - "strings" "sync" "time" @@ -31,7 +30,6 @@ import ( "github.com/pingcap/tidb/pkg/infoschema" "github.com/pingcap/tidb/pkg/kv" "github.com/pingcap/tidb/pkg/metrics" - "github.com/pingcap/tidb/pkg/parser" "github.com/pingcap/tidb/pkg/parser/ast" "github.com/pingcap/tidb/pkg/planner/cascades" "github.com/pingcap/tidb/pkg/planner/core" @@ -45,7 +43,6 @@ import ( "github.com/pingcap/tidb/pkg/util/hint" "github.com/pingcap/tidb/pkg/util/intest" "github.com/pingcap/tidb/pkg/util/logutil" - utilparser "github.com/pingcap/tidb/pkg/util/parser" "github.com/pingcap/tidb/pkg/util/topsql" "go.uber.org/zap" ) @@ -63,19 +60,6 @@ func IsReadOnly(node ast.Node, vars *variable.SessionVars) bool { return ast.IsReadOnly(node) } -func matchSQLBinding(sctx sessionctx.Context, stmtNode ast.StmtNode) (bindRecord *bindinfo.BindRecord, scope string, matched bool) { - useBinding := sctx.GetSessionVars().UsePlanBaselines - if !useBinding || stmtNode == nil { - return nil, "", false - } - var err error - bindRecord, scope, err = getBindRecord(sctx, stmtNode) - if err != nil || bindRecord == nil || len(bindRecord.Bindings) == 0 { - return nil, "", false - } - return bindRecord, scope, true -} - // getPlanFromNonPreparedPlanCache tries to get an available cached plan from the NonPrepared Plan Cache for this stmt. func getPlanFromNonPreparedPlanCache(ctx context.Context, sctx sessionctx.Context, stmt ast.StmtNode, is infoschema.InfoSchema) (p core.Plan, ns types.NameSlice, ok bool, err error) { stmtCtx := sctx.GetSessionVars().StmtCtx @@ -93,7 +77,7 @@ func getPlanFromNonPreparedPlanCache(ctx context.Context, sctx sessionctx.Contex ok, reason := core.NonPreparedPlanCacheableWithCtx(sctx, stmt, is) if !ok { if !isExplain && stmtCtx.InExplainStmt && stmtCtx.ExplainFormat == types.ExplainFormatPlanCache { - stmtCtx.AppendWarning(errors.Errorf("skip non-prepared plan-cache: %s", reason)) + stmtCtx.AppendWarning(errors.NewNoStackErrorf("skip non-prepared plan-cache: %s", reason)) } return nil, nil, false, nil } @@ -150,7 +134,7 @@ func Optimize(ctx context.Context, sctx sessionctx.Context, node ast.Node, is in defer debugtrace.LeaveContextCommon(sctx) } - if !sctx.GetSessionVars().InRestrictedSQL && variable.RestrictedReadOnly.Load() || variable.VarTiDBSuperReadOnly.Load() { + if !sctx.GetSessionVars().InRestrictedSQL && (variable.RestrictedReadOnly.Load() || variable.VarTiDBSuperReadOnly.Load()) { allowed, err := allowInReadOnlyMode(sctx, node) if err != nil { return nil, nil, err @@ -181,22 +165,21 @@ func Optimize(ctx context.Context, sctx sessionctx.Context, node ast.Node, is in } tableHints := hint.ExtractTableHintsFromStmtNode(node, sctx) - originStmtHints, originStmtHintsOffs, warns := handleStmtHints(tableHints) + originStmtHints, _, warns := handleStmtHints(tableHints) sessVars.StmtCtx.StmtHints = originStmtHints for _, warn := range warns { sessVars.StmtCtx.AppendWarning(warn) } defer func() { - // Override the resource group if necessary - // TODO: we didn't check the existence of the hinted resource group now to save the cost per query + // Override the resource group if the hint is set. if retErr == nil && sessVars.StmtCtx.StmtHints.HasResourceGroup { if variable.EnableResourceControl.Load() { - sessVars.ResourceGroupName = sessVars.StmtCtx.StmtHints.ResourceGroup + sessVars.StmtCtx.ResourceGroupName = sessVars.StmtCtx.StmtHints.ResourceGroup // if we are in a txn, should update the txn resource name to let the txn // commit with the hint resource group. if txn, err := sctx.Txn(false); err == nil && txn != nil && txn.Valid() { - kv.SetTxnResourceGroup(txn, sessVars.ResourceGroupName) + kv.SetTxnResourceGroup(txn, sessVars.StmtCtx.ResourceGroupName) } } else { err := infoschema.ErrResourceGroupSupportDisabled @@ -236,15 +219,20 @@ func Optimize(ctx context.Context, sctx sessionctx.Context, node ast.Node, is in enableUseBinding := sessVars.UsePlanBaselines stmtNode, isStmtNode := node.(ast.StmtNode) - bindRecord, scope, match := matchSQLBinding(sctx, stmtNode) + binding, match, scope := bindinfo.MatchSQLBinding(sctx, stmtNode) + var bindRecord bindinfo.Bindings + if match { + bindRecord = []bindinfo.Binding{binding} + } + useBinding := enableUseBinding && isStmtNode && match if sessVars.StmtCtx.EnableOptimizerDebugTrace { failpoint.Inject("SetBindingTimeToZero", func(val failpoint.Value) { if val.(bool) && bindRecord != nil { bindRecord = bindRecord.Copy() - for i := range bindRecord.Bindings { - bindRecord.Bindings[i].CreateTime = types.ZeroTime - bindRecord.Bindings[i].UpdateTime = types.ZeroTime + for i := range bindRecord { + bindRecord[i].CreateTime = types.ZeroTime + bindRecord[i].UpdateTime = types.ZeroTime } } }) @@ -287,7 +275,7 @@ func Optimize(ctx context.Context, sctx sessionctx.Context, node ast.Node, is in var bindStmtHints stmtctx.StmtHints originHints := hint.CollectHint(stmtNode) // bindRecord must be not nil when coming here, try to find the best binding. - for _, binding := range bindRecord.Bindings { + for _, binding := range bindRecord { if !binding.IsBindingEnabled() { continue } @@ -309,11 +297,7 @@ func Optimize(ctx context.Context, sctx sessionctx.Context, node ast.Node, is in plan, curNames, cost, err := optimize(ctx, sctx, node, is) if err != nil { binding.Status = bindinfo.Invalid - handleInvalidBindRecord(ctx, sctx, scope, bindinfo.BindRecord{ - OriginalSQL: bindRecord.OriginalSQL, - Db: bindRecord.Db, - Bindings: []bindinfo.Binding{binding}, - }) + handleInvalidBinding(ctx, sctx, scope, binding) continue } if cost < minCost { @@ -321,7 +305,7 @@ func Optimize(ctx context.Context, sctx sessionctx.Context, node ast.Node, is in } } if bestPlanFromBind == nil { - sessVars.StmtCtx.AppendWarning(errors.New("no plan generated from bindings")) + sessVars.StmtCtx.AppendWarning(errors.NewNoStackError("no plan generated from bindings")) } else { bestPlan = bestPlanFromBind sessVars.StmtCtx.StmtHints = bindStmtHints @@ -331,12 +315,12 @@ func Optimize(ctx context.Context, sctx sessionctx.Context, node ast.Node, is in sessVars.StmtCtx.BindSQL = chosenBinding.BindSQL sessVars.FoundInBinding = true if sessVars.StmtCtx.InVerboseExplain { - sessVars.StmtCtx.AppendNote(errors.Errorf("Using the bindSQL: %v", chosenBinding.BindSQL)) + sessVars.StmtCtx.AppendNote(errors.NewNoStackErrorf("Using the bindSQL: %v", chosenBinding.BindSQL)) } else { - sessVars.StmtCtx.AppendExtraNote(errors.Errorf("Using the bindSQL: %v", chosenBinding.BindSQL)) + sessVars.StmtCtx.AppendExtraNote(errors.NewNoStackErrorf("Using the bindSQL: %v", chosenBinding.BindSQL)) } if len(tableHints) > 0 { - sessVars.StmtCtx.AppendWarning(errors.Errorf("The system ignores the hints in the current query and uses the hints specified in the bindSQL: %v", chosenBinding.BindSQL)) + sessVars.StmtCtx.AppendWarning(errors.NewNoStackErrorf("The system ignores the hints in the current query and uses the hints specified in the bindSQL: %v", chosenBinding.BindSQL)) } } // Restore the hint to avoid changing the stmt node. @@ -368,7 +352,7 @@ func Optimize(ctx context.Context, sctx sessionctx.Context, node ast.Node, is in if sessVars.EvolvePlanBaselines && bestPlanFromBind != nil && sessVars.SelectLimit == math.MaxUint64 { // do not evolve this query if sql_select_limit is enabled // Check bestPlanFromBind firstly to avoid nil stmtNode. - if _, ok := stmtNode.(*ast.SelectStmt); ok && !bindRecord.Bindings[0].Hint.ContainTableHint(core.HintReadFromStorage) { + if _, ok := stmtNode.(*ast.SelectStmt); ok && !bindRecord[0].Hint.ContainTableHint(hint.HintReadFromStorage) { sessVars.StmtCtx.StmtHints = originStmtHints defPlan, _, _, err := optimize(ctx, sctx, node, is) if err != nil { @@ -376,20 +360,11 @@ func Optimize(ctx context.Context, sctx sessionctx.Context, node ast.Node, is in return bestPlan, names, nil } defPlanHints := core.GenHintsFromPhysicalPlan(defPlan) - for _, hint := range defPlanHints { - if hint.HintName.String() == core.HintReadFromStorage { + for _, h := range defPlanHints { + if h.HintName.String() == hint.HintReadFromStorage { return bestPlan, names, nil } } - // The hints generated from the plan do not contain the statement hints of the query, add them back. - for _, off := range originStmtHintsOffs { - defPlanHints = append(defPlanHints, tableHints[off]) - } - defPlanHintsStr := hint.RestoreOptimizerHints(defPlanHints) - binding := bindRecord.FindBinding(defPlanHintsStr) - if binding == nil { - handleEvolveTasks(ctx, sctx, bindRecord, stmtNode, defPlanHintsStr) - } } } @@ -402,7 +377,7 @@ func Optimize(ctx context.Context, sctx sessionctx.Context, node ast.Node, is in func OptimizeForForeignKeyCascade(ctx context.Context, sctx sessionctx.Context, node ast.StmtNode, is infoschema.InfoSchema) (core.Plan, error) { builder := planBuilderPool.Get().(*core.PlanBuilder) defer planBuilderPool.Put(builder.ResetForReuse()) - hintProcessor := &hint.BlockHintProcessor{Ctx: sctx} + hintProcessor := hint.NewQBHintHandler(sctx) builder.Init(sctx, is, hintProcessor) p, err := builder.Build(ctx, node) if err != nil { @@ -484,7 +459,7 @@ func optimize(ctx context.Context, sctx sessionctx.Context, node ast.Node, is in } // build logical plan - hintProcessor := &hint.BlockHintProcessor{Ctx: sctx} + hintProcessor := hint.NewQBHintHandler(sctx) node.Accept(hintProcessor) defer hintProcessor.HandleUnusedViewHints() builder := planBuilderPool.Get().(*core.PlanBuilder) @@ -585,114 +560,9 @@ func buildLogicalPlan(ctx context.Context, sctx sessionctx.Context, node ast.Nod return p, nil } -// ExtractSelectAndNormalizeDigest extract the select statement and normalize it. -func ExtractSelectAndNormalizeDigest(stmtNode ast.StmtNode, specifiledDB string, forBinding bool) (ast.StmtNode, string, string, error) { - switch x := stmtNode.(type) { - case *ast.ExplainStmt: - // This function is only used to find bind record. - // For some SQLs, such as `explain select * from t`, they will be entered here many times, - // but some of them do not want to obtain bind record. - // The difference between them is whether len(x.Text()) is empty. They cannot be distinguished by stmt.restore. - // For these cases, we need return "" as normalize SQL and hash. - if len(x.Text()) == 0 { - return x.Stmt, "", "", nil - } - switch x.Stmt.(type) { - case *ast.SelectStmt, *ast.DeleteStmt, *ast.UpdateStmt, *ast.InsertStmt: - var normalizeSQL string - if forBinding { - // Apply additional binding rules if enabled - normalizeSQL = parser.NormalizeForBinding(utilparser.RestoreWithDefaultDB(x.Stmt, specifiledDB, x.Text())) - } else { - normalizeSQL = parser.Normalize(utilparser.RestoreWithDefaultDB(x.Stmt, specifiledDB, x.Text())) - } - normalizeSQL = core.EraseLastSemicolonInSQL(normalizeSQL) - hash := parser.DigestNormalized(normalizeSQL) - return x.Stmt, normalizeSQL, hash.String(), nil - case *ast.SetOprStmt: - core.EraseLastSemicolon(x) - var normalizeExplainSQL string - var explainSQL string - if specifiledDB != "" { - explainSQL = utilparser.RestoreWithDefaultDB(x, specifiledDB, x.Text()) - } else { - explainSQL = x.Text() - } - - if forBinding { - // Apply additional binding rules - normalizeExplainSQL = parser.NormalizeForBinding(explainSQL) - } else { - normalizeExplainSQL = parser.Normalize(x.Text()) - } - - idx := strings.Index(normalizeExplainSQL, "select") - parenthesesIdx := strings.Index(normalizeExplainSQL, "(") - if parenthesesIdx != -1 && parenthesesIdx < idx { - idx = parenthesesIdx - } - // If the SQL is `EXPLAIN ((VALUES ROW ()) ORDER BY 1);`, the idx will be -1. - if idx == -1 { - hash := parser.DigestNormalized(normalizeExplainSQL) - return x.Stmt, normalizeExplainSQL, hash.String(), nil - } - normalizeSQL := normalizeExplainSQL[idx:] - hash := parser.DigestNormalized(normalizeSQL) - return x.Stmt, normalizeSQL, hash.String(), nil - } - case *ast.SelectStmt, *ast.SetOprStmt, *ast.DeleteStmt, *ast.UpdateStmt, *ast.InsertStmt: - core.EraseLastSemicolon(x) - // This function is only used to find bind record. - // For some SQLs, such as `explain select * from t`, they will be entered here many times, - // but some of them do not want to obtain bind record. - // The difference between them is whether len(x.Text()) is empty. They cannot be distinguished by stmt.restore. - // For these cases, we need return "" as normalize SQL and hash. - if len(x.Text()) == 0 { - return x, "", "", nil - } - - var normalizedSQL string - var hash *parser.Digest - if forBinding { - // Apply additional binding rules - normalizedSQL, hash = parser.NormalizeDigestForBinding(utilparser.RestoreWithDefaultDB(x, specifiledDB, x.Text())) - } else { - normalizedSQL, hash = parser.NormalizeDigest(utilparser.RestoreWithDefaultDB(x, specifiledDB, x.Text())) - } - - return x, normalizedSQL, hash.String(), nil - } - return nil, "", "", nil -} - -func getBindRecord(ctx sessionctx.Context, stmt ast.StmtNode) (*bindinfo.BindRecord, string, error) { - // When the domain is initializing, the bind will be nil. - if ctx.Value(bindinfo.SessionBindInfoKeyType) == nil { - return nil, "", nil - } - stmtNode, normalizedSQL, hash, err := ExtractSelectAndNormalizeDigest(stmt, ctx.GetSessionVars().CurrentDB, true) - if err != nil || stmtNode == nil { - return nil, "", err - } - sessionHandle := ctx.Value(bindinfo.SessionBindInfoKeyType).(*bindinfo.SessionHandle) - bindRecord := sessionHandle.GetBindRecord(hash, normalizedSQL, "") - if bindRecord != nil { - if bindRecord.HasEnabledBinding() { - return bindRecord, metrics.ScopeSession, nil - } - return nil, "", nil - } - globalHandle := domain.GetDomain(ctx).BindHandle() - if globalHandle == nil { - return nil, "", nil - } - bindRecord = globalHandle.GetBindRecord(hash, normalizedSQL, "") - return bindRecord, metrics.ScopeGlobal, nil -} - -func handleInvalidBindRecord(ctx context.Context, sctx sessionctx.Context, level string, bindRecord bindinfo.BindRecord) { - sessionHandle := sctx.Value(bindinfo.SessionBindInfoKeyType).(*bindinfo.SessionHandle) - err := sessionHandle.DropBindRecord(bindRecord.OriginalSQL, bindRecord.Db, &bindRecord.Bindings[0]) +func handleInvalidBinding(ctx context.Context, sctx sessionctx.Context, level string, binding bindinfo.Binding) { + sessionHandle := sctx.Value(bindinfo.SessionBindInfoKeyType).(bindinfo.SessionBindingHandle) + err := sessionHandle.DropSessionBinding(binding.SQLDigest) if err != nil { logutil.Logger(ctx).Info("drop session bindings failed") } @@ -701,26 +571,7 @@ func handleInvalidBindRecord(ctx context.Context, sctx sessionctx.Context, level } globalHandle := domain.GetDomain(sctx).BindHandle() - globalHandle.AddDropInvalidBindTask(&bindRecord) -} - -func handleEvolveTasks(ctx context.Context, sctx sessionctx.Context, br *bindinfo.BindRecord, stmtNode ast.StmtNode, planHint string) { - bindSQL := bindinfo.GenerateBindSQL(ctx, stmtNode, planHint, false, br.Db) - if bindSQL == "" { - return - } - charset, collation := sctx.GetSessionVars().GetCharsetInfo() - _, sqlDigestWithDB := parser.NormalizeDigest(utilparser.RestoreWithDefaultDB(stmtNode, br.Db, br.OriginalSQL)) - binding := bindinfo.Binding{ - BindSQL: bindSQL, - Status: bindinfo.PendingVerify, - Charset: charset, - Collation: collation, - Source: bindinfo.Evolve, - SQLDigest: sqlDigestWithDB.String(), - } - globalHandle := domain.GetDomain(sctx).BindHandle() - globalHandle.AddEvolvePlanTask(br.OriginalSQL, br.Db, binding) + globalHandle.AddInvalidGlobalBinding(binding) } func handleStmtHints(hints []*ast.TableOptimizerHint) (stmtHints stmtctx.StmtHints, offs []int, warns []error) { @@ -767,16 +618,16 @@ func handleStmtHints(hints []*ast.TableOptimizerHint) (stmtHints stmtctx.StmtHin // Not all session variables are permitted for use with SET_VAR sysVar := variable.GetSysVar(setVarHint.VarName) if sysVar == nil { - warns = append(warns, core.ErrUnresolvedHintName.GenWithStackByArgs(setVarHint.VarName, hint.HintName.String())) + warns = append(warns, core.ErrUnresolvedHintName.FastGenByArgs(setVarHint.VarName, hint.HintName.String())) continue } if !sysVar.IsHintUpdatableVerfied { - warns = append(warns, core.ErrNotHintUpdatable.GenWithStackByArgs(setVarHint.VarName)) + warns = append(warns, core.ErrNotHintUpdatable.FastGenByArgs(setVarHint.VarName)) } // If several hints with the same variable name appear in the same statement, the first one is applied and the others are ignored with a warning if _, ok := setVars[setVarHint.VarName]; ok { msg := fmt.Sprintf("%s(%s=%s)", hint.HintName.String(), setVarHint.VarName, setVarHint.Value) - warns = append(warns, core.ErrWarnConflictingHint.GenWithStackByArgs(msg)) + warns = append(warns, core.ErrWarnConflictingHint.FastGenByArgs(msg)) continue } setVars[setVarHint.VarName] = setVarHint.Value @@ -790,19 +641,19 @@ func handleStmtHints(hints []*ast.TableOptimizerHint) (stmtHints stmtctx.StmtHin if memoryQuotaHintCnt != 0 { memoryQuotaHint := hints[hintOffs["memory_quota"]] if memoryQuotaHintCnt > 1 { - warn := errors.Errorf("MEMORY_QUOTA() is defined more than once, only the last definition takes effect: MEMORY_QUOTA(%v)", memoryQuotaHint.HintData.(int64)) + warn := errors.NewNoStackErrorf("MEMORY_QUOTA() is defined more than once, only the last definition takes effect: MEMORY_QUOTA(%v)", memoryQuotaHint.HintData.(int64)) warns = append(warns, warn) } // Executor use MemoryQuota <= 0 to indicate no memory limit, here use < 0 to handle hint syntax error. if memoryQuota := memoryQuotaHint.HintData.(int64); memoryQuota < 0 { delete(hintOffs, "memory_quota") - warn := errors.New("The use of MEMORY_QUOTA hint is invalid, valid usage: MEMORY_QUOTA(10 MB) or MEMORY_QUOTA(10 GB)") + warn := errors.NewNoStackError("The use of MEMORY_QUOTA hint is invalid, valid usage: MEMORY_QUOTA(10 MB) or MEMORY_QUOTA(10 GB)") warns = append(warns, warn) } else { stmtHints.HasMemQuotaHint = true stmtHints.MemQuotaQuery = memoryQuota if memoryQuota == 0 { - warn := errors.New("Setting the MEMORY_QUOTA to 0 means no memory limit") + warn := errors.NewNoStackError("Setting the MEMORY_QUOTA to 0 means no memory limit") warns = append(warns, warn) } } @@ -811,7 +662,7 @@ func handleStmtHints(hints []*ast.TableOptimizerHint) (stmtHints stmtctx.StmtHin if useToJAHintCnt != 0 { useToJAHint := hints[hintOffs["use_toja"]] if useToJAHintCnt > 1 { - warn := errors.Errorf("USE_TOJA() is defined more than once, only the last definition takes effect: USE_TOJA(%v)", useToJAHint.HintData.(bool)) + warn := errors.NewNoStackErrorf("USE_TOJA() is defined more than once, only the last definition takes effect: USE_TOJA(%v)", useToJAHint.HintData.(bool)) warns = append(warns, warn) } stmtHints.HasAllowInSubqToJoinAndAggHint = true @@ -821,7 +672,7 @@ func handleStmtHints(hints []*ast.TableOptimizerHint) (stmtHints stmtctx.StmtHin if useCascadesHintCnt != 0 { useCascadesHint := hints[hintOffs["use_cascades"]] if useCascadesHintCnt > 1 { - warn := errors.Errorf("USE_CASCADES() is defined more than once, only the last definition takes effect: USE_CASCADES(%v)", useCascadesHint.HintData.(bool)) + warn := errors.NewNoStackErrorf("USE_CASCADES() is defined more than once, only the last definition takes effect: USE_CASCADES(%v)", useCascadesHint.HintData.(bool)) warns = append(warns, warn) } stmtHints.HasEnableCascadesPlannerHint = true @@ -830,7 +681,7 @@ func handleStmtHints(hints []*ast.TableOptimizerHint) (stmtHints stmtctx.StmtHin // Handle NO_INDEX_MERGE if noIndexMergeHintCnt != 0 { if noIndexMergeHintCnt > 1 { - warn := errors.New("NO_INDEX_MERGE() is defined more than once, only the last definition takes effect") + warn := errors.NewNoStackError("NO_INDEX_MERGE() is defined more than once, only the last definition takes effect") warns = append(warns, warn) } stmtHints.NoIndexMergeHint = true @@ -838,7 +689,7 @@ func handleStmtHints(hints []*ast.TableOptimizerHint) (stmtHints stmtctx.StmtHin // Handle straight_join if straightJoinHintCnt != 0 { if straightJoinHintCnt > 1 { - warn := errors.New("STRAIGHT_JOIN() is defined more than once, only the last definition takes effect") + warn := errors.NewNoStackError("STRAIGHT_JOIN() is defined more than once, only the last definition takes effect") warns = append(warns, warn) } stmtHints.StraightJoinOrder = true @@ -846,7 +697,7 @@ func handleStmtHints(hints []*ast.TableOptimizerHint) (stmtHints stmtctx.StmtHin // Handle READ_CONSISTENT_REPLICA if readReplicaHintCnt != 0 { if readReplicaHintCnt > 1 { - warn := errors.New("READ_CONSISTENT_REPLICA() is defined more than once, only the last definition takes effect") + warn := errors.NewNoStackError("READ_CONSISTENT_REPLICA() is defined more than once, only the last definition takes effect") warns = append(warns, warn) } stmtHints.HasReplicaReadHint = true @@ -856,7 +707,7 @@ func handleStmtHints(hints []*ast.TableOptimizerHint) (stmtHints stmtctx.StmtHin if maxExecutionTimeCnt != 0 { maxExecutionTime := hints[hintOffs["max_execution_time"]] if maxExecutionTimeCnt > 1 { - warn := errors.Errorf("MAX_EXECUTION_TIME() is defined more than once, only the last definition takes effect: MAX_EXECUTION_TIME(%v)", maxExecutionTime.HintData.(uint64)) + warn := errors.NewNoStackErrorf("MAX_EXECUTION_TIME() is defined more than once, only the last definition takes effect: MAX_EXECUTION_TIME(%v)", maxExecutionTime.HintData.(uint64)) warns = append(warns, warn) } stmtHints.HasMaxExecutionTime = true @@ -866,7 +717,7 @@ func handleStmtHints(hints []*ast.TableOptimizerHint) (stmtHints stmtctx.StmtHin if resourceGroupHintCnt != 0 { resourceGroup := hints[hintOffs["resource_group"]] if resourceGroupHintCnt > 1 { - warn := errors.Errorf("RESOURCE_GROUP() is defined more than once, only the last definition takes effect: RESOURCE_GROUP(%v)", resourceGroup.HintData.(string)) + warn := errors.NewNoStackErrorf("RESOURCE_GROUP() is defined more than once, only the last definition takes effect: RESOURCE_GROUP(%v)", resourceGroup.HintData.(string)) warns = append(warns, warn) } stmtHints.HasResourceGroup = true @@ -875,13 +726,13 @@ func handleStmtHints(hints []*ast.TableOptimizerHint) (stmtHints stmtctx.StmtHin // Handle NTH_PLAN if forceNthPlanCnt != 0 { if forceNthPlanCnt > 1 { - warn := errors.Errorf("NTH_PLAN() is defined more than once, only the last definition takes effect: NTH_PLAN(%v)", forceNthPlan.HintData.(int64)) + warn := errors.NewNoStackErrorf("NTH_PLAN() is defined more than once, only the last definition takes effect: NTH_PLAN(%v)", forceNthPlan.HintData.(int64)) warns = append(warns, warn) } stmtHints.ForceNthPlan = forceNthPlan.HintData.(int64) if stmtHints.ForceNthPlan < 1 { stmtHints.ForceNthPlan = -1 - warn := errors.Errorf("the hintdata for NTH_PLAN() is too small, hint ignored") + warn := errors.NewNoStackError("the hintdata for NTH_PLAN() is too small, hint ignored") warns = append(warns, warn) } } else { @@ -899,5 +750,7 @@ func handleStmtHints(hints []*ast.TableOptimizerHint) (stmtHints stmtctx.StmtHin func init() { core.OptimizeAstNode = Optimize core.IsReadOnly = IsReadOnly - core.ExtractSelectAndNormalizeDigest = ExtractSelectAndNormalizeDigest + bindinfo.GetGlobalBindingHandle = func(sctx sessionctx.Context) bindinfo.GlobalBindingHandle { + return domain.GetDomain(sctx).BindHandle() + } } diff --git a/pkg/planner/property/BUILD.bazel b/pkg/planner/property/BUILD.bazel index 90a53db31684e..eb02cf0275784 100644 --- a/pkg/planner/property/BUILD.bazel +++ b/pkg/planner/property/BUILD.bazel @@ -12,7 +12,7 @@ go_library( visibility = ["//visibility:public"], deps = [ "//pkg/expression", - "//pkg/sessionctx/stmtctx", + "//pkg/sessionctx", "//pkg/statistics", "//pkg/util/codec", "//pkg/util/collate", diff --git a/pkg/planner/property/physical_property.go b/pkg/planner/property/physical_property.go index 172ecbc2d379c..79a16448572d8 100644 --- a/pkg/planner/property/physical_property.go +++ b/pkg/planner/property/physical_property.go @@ -21,7 +21,7 @@ import ( "github.com/pingcap/log" "github.com/pingcap/tidb/pkg/expression" - "github.com/pingcap/tidb/pkg/sessionctx/stmtctx" + "github.com/pingcap/tidb/pkg/sessionctx" "github.com/pingcap/tidb/pkg/util/codec" "github.com/pingcap/tidb/pkg/util/collate" "github.com/pingcap/tidb/pkg/util/size" @@ -94,7 +94,7 @@ type MPPPartitionColumn struct { CollateID int32 } -func (partitionCol *MPPPartitionColumn) hashCode(ctx *stmtctx.StatementContext) []byte { +func (partitionCol *MPPPartitionColumn) hashCode() []byte { hashcode := partitionCol.Col.HashCode() if partitionCol.CollateID < 0 { // collateId < 0 means new collation is not enabled @@ -130,11 +130,11 @@ func (partitionCol *MPPPartitionColumn) MemoryUsage() (sum int64) { } // ExplainColumnList generates explain information for a list of columns. -func ExplainColumnList(cols []*MPPPartitionColumn) []byte { +func ExplainColumnList(ctx sessionctx.Context, cols []*MPPPartitionColumn) []byte { buffer := bytes.NewBufferString("") for i, col := range cols { buffer.WriteString("[name: ") - buffer.WriteString(col.Col.ExplainInfo()) + buffer.WriteString(col.Col.ExplainInfo(ctx)) buffer.WriteString(", collate: ") if collate.NewCollationEnabled() { buffer.WriteString(GetCollateNameByIDForPartition(col.CollateID)) @@ -340,7 +340,7 @@ func (p *PhysicalProperty) HashCode() []byte { if p.TaskTp == MppTaskType { p.hashcode = codec.EncodeInt(p.hashcode, int64(p.MPPPartitionTp)) for _, col := range p.MPPPartitionCols { - p.hashcode = append(p.hashcode, col.hashCode(nil)...) + p.hashcode = append(p.hashcode, col.hashCode()...) } } p.hashcode = append(p.hashcode, codec.EncodeInt(nil, int64(p.CTEProducerStatus))...) diff --git a/pkg/planner/util/fixcontrol/get.go b/pkg/planner/util/fixcontrol/get.go index 1c2706fbb83a2..4041aa7961f1e 100644 --- a/pkg/planner/util/fixcontrol/get.go +++ b/pkg/planner/util/fixcontrol/get.go @@ -40,6 +40,9 @@ const ( Fix45798 uint64 = 45798 // Fix46177 controls whether to explore enforced plans for DataSource if it has already found an unenforced plan. Fix46177 uint64 = 46177 + // Fix49736 controls whether to force the optimizer to use plan cache even if there is risky optimization. + // This fix-control is test-only. + Fix49736 uint64 = 49736 ) // GetStr fetches the given key from the fix control map as a string type. diff --git a/pkg/planner/util/fixcontrol/main_test.go b/pkg/planner/util/fixcontrol/main_test.go index 4dbc318379cbc..84ca7043da839 100644 --- a/pkg/planner/util/fixcontrol/main_test.go +++ b/pkg/planner/util/fixcontrol/main_test.go @@ -35,6 +35,7 @@ func TestMain(m *testing.M) { opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("gopkg.in/natefinch/lumberjack%2ev2.(*Logger).millRun"), diff --git a/pkg/planner/util/main_test.go b/pkg/planner/util/main_test.go index e5becaafd566e..54ab1870b3b47 100644 --- a/pkg/planner/util/main_test.go +++ b/pkg/planner/util/main_test.go @@ -25,6 +25,7 @@ func TestMain(m *testing.M) { testsetup.SetupForCommonTest() opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), diff --git a/pkg/plugin/BUILD.bazel b/pkg/plugin/BUILD.bazel index 0638939238dff..60157479817b1 100644 --- a/pkg/plugin/BUILD.bazel +++ b/pkg/plugin/BUILD.bazel @@ -39,7 +39,7 @@ go_test( ], embed = [":plugin"], flaky = True, - shard_count = 11, + shard_count = 12, deps = [ "//pkg/kv", "//pkg/parser/mysql", @@ -49,6 +49,7 @@ go_test( "//pkg/testkit", "//pkg/testkit/testsetup", "@com_github_stretchr_testify//require", + "@io_etcd_go_etcd_client_v3//:client", "@org_uber_go_goleak//:goleak", ], ) diff --git a/pkg/plugin/conn_ip_example/main_test.go b/pkg/plugin/conn_ip_example/main_test.go index 44e6371253967..40f20a36867ac 100644 --- a/pkg/plugin/conn_ip_example/main_test.go +++ b/pkg/plugin/conn_ip_example/main_test.go @@ -25,6 +25,7 @@ func TestMain(m *testing.M) { testsetup.SetupForCommonTest() opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), diff --git a/pkg/plugin/main_test.go b/pkg/plugin/main_test.go index 64640a479dc24..80379b90d8e0f 100644 --- a/pkg/plugin/main_test.go +++ b/pkg/plugin/main_test.go @@ -26,6 +26,7 @@ func TestMain(m *testing.M) { opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), diff --git a/pkg/plugin/plugin.go b/pkg/plugin/plugin.go index 2d5c57ab62687..cf5401bbb8263 100644 --- a/pkg/plugin/plugin.go +++ b/pkg/plugin/plugin.go @@ -21,6 +21,7 @@ import ( "strconv" "sync" "sync/atomic" + "time" "unsafe" "github.com/pingcap/errors" @@ -275,14 +276,33 @@ func (w *flushWatcher) refreshPluginState() error { } return nil } - func (w *flushWatcher) watchLoop() { - watchChan := w.etcd.Watch(w.ctx, w.path) + const reWatchInterval = time.Second * 5 + logutil.BgLogger().Info("plugin flushWatcher loop started", zap.String("plugin", w.manifest.Name)) + for w.ctx.Err() == nil { + ch := w.etcd.Watch(w.ctx, w.path) + if exit := w.watchLoopWithChan(ch); exit { + break + } + + logutil.BgLogger().Info( + "plugin flushWatcher old chan closed, restart loop later", + zap.String("plugin", w.manifest.Name), + zap.Duration("after", reWatchInterval)) + time.Sleep(reWatchInterval) + } +} + +func (w *flushWatcher) watchLoopWithChan(ch clientv3.WatchChan) (exit bool) { for { select { case <-w.ctx.Done(): - return - case <-watchChan: + return true + case _, ok := <-ch: + if !ok { + return false + } + logutil.BgLogger().Info("plugin flushWatcher detected event to reload plugin config", zap.String("plugin", w.manifest.Name)) _ = w.refreshPluginState() } } diff --git a/pkg/plugin/plugin_test.go b/pkg/plugin/plugin_test.go index bc09aa7da1469..daa1965b7758f 100644 --- a/pkg/plugin/plugin_test.go +++ b/pkg/plugin/plugin_test.go @@ -18,11 +18,14 @@ import ( "context" "io" "strconv" + "sync/atomic" "testing" + "time" "unsafe" "github.com/pingcap/tidb/pkg/sessionctx/variable" "github.com/stretchr/testify/require" + clientv3 "go.etcd.io/etcd/client/v3" ) func TestLoadStaticRegisteredPlugin(t *testing.T) { @@ -316,3 +319,43 @@ func TestPluginsClone(t *testing.T) { require.Equal(t, uint16(1), cps.versions["whitelist"]) require.Len(t, cps.dyingPlugins, 1) } + +func TestPluginWatcherLoop(t *testing.T) { + // exit when ctx done + ctx, cancel := context.WithCancel(context.Background()) + watcher := &flushWatcher{ + ctx: ctx, + manifest: &Manifest{ + Name: "test", + }, + } + ch := make(chan clientv3.WatchResponse) + var cancelled atomic.Bool + go func() { + time.Sleep(10 * time.Millisecond) + cancelled.Store(true) + cancel() + }() + exit := watcher.watchLoopWithChan(ch) + require.True(t, exit) + require.True(t, cancelled.Load()) + + // exit when ch closed + watcher = &flushWatcher{ + ctx: context.Background(), + manifest: &Manifest{ + Name: "test", + }, + } + + var closed atomic.Bool + ch = make(chan clientv3.WatchResponse) + go func() { + time.Sleep(10 * time.Millisecond) + closed.Store(true) + close(ch) + }() + exit = watcher.watchLoopWithChan(ch) + require.False(t, exit) + require.True(t, cancelled.Load()) +} diff --git a/pkg/privilege/privilege.go b/pkg/privilege/privilege.go index 1414238159842..274806ad441c9 100644 --- a/pkg/privilege/privilege.go +++ b/pkg/privilege/privilege.go @@ -15,6 +15,8 @@ package privilege import ( + "fmt" + "github.com/pingcap/tidb/pkg/parser/auth" "github.com/pingcap/tidb/pkg/parser/mysql" "github.com/pingcap/tidb/pkg/privilege/conn" @@ -127,8 +129,13 @@ func BindPrivilegeManager(ctx sessionctx.Context, pc Manager) { ctx.SetValue(key, pc) } +type privilegeManagerKeyProvider interface { + // Value returns the value associated with this context for key. + Value(key fmt.Stringer) interface{} +} + // GetPrivilegeManager gets Checker from context. -func GetPrivilegeManager(ctx sessionctx.Context) Manager { +func GetPrivilegeManager(ctx privilegeManagerKeyProvider) Manager { if v, ok := ctx.Value(key).(Manager); ok { return v } diff --git a/pkg/privilege/privileges/main_test.go b/pkg/privilege/privileges/main_test.go index 9586bfbcca9f5..6ea379c912a3f 100644 --- a/pkg/privilege/privileges/main_test.go +++ b/pkg/privilege/privileges/main_test.go @@ -25,6 +25,7 @@ import ( func TestMain(m *testing.M) { opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), diff --git a/pkg/privilege/privileges/privileges_test.go b/pkg/privilege/privileges/privileges_test.go index a8c39ceda572a..043ae41ca52fe 100644 --- a/pkg/privilege/privileges/privileges_test.go +++ b/pkg/privilege/privileges/privileges_test.go @@ -1003,7 +1003,8 @@ func TestLoadDataPrivilege(t *testing.T) { require.NoError(t, tk.Session().Auth(&auth.UserIdentity{Username: "root", Hostname: "localhost"}, nil, nil, nil)) tk.MustExec(`GRANT INSERT on *.* to 'test_load'@'localhost'`) require.NoError(t, tk.Session().Auth(&auth.UserIdentity{Username: "test_load", Hostname: "localhost"}, nil, nil, nil)) - tk.MustExec("LOAD DATA LOCAL INFILE '/tmp/load_data_priv.csv' INTO TABLE t_load") + err = tk.ExecToErr("LOAD DATA LOCAL INFILE '/tmp/load_data_priv.csv' INTO TABLE t_load") + require.ErrorContains(t, err, "reader is nil") require.NoError(t, tk.Session().Auth(&auth.UserIdentity{Username: "root", Hostname: "localhost"}, nil, nil, nil)) tk.MustExec(`GRANT INSERT on *.* to 'test_load'@'localhost'`) diff --git a/pkg/resourcemanager/pool/spool/main_test.go b/pkg/resourcemanager/pool/spool/main_test.go index 338d85c617dd6..cbaf3486de0e0 100644 --- a/pkg/resourcemanager/pool/spool/main_test.go +++ b/pkg/resourcemanager/pool/spool/main_test.go @@ -24,6 +24,7 @@ import ( func TestMain(m *testing.M) { opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), diff --git a/pkg/resourcemanager/pool/workerpool/main_test.go b/pkg/resourcemanager/pool/workerpool/main_test.go index 03371df4293fd..6ba6d9d895ec8 100644 --- a/pkg/resourcemanager/pool/workerpool/main_test.go +++ b/pkg/resourcemanager/pool/workerpool/main_test.go @@ -24,6 +24,7 @@ import ( func TestMain(m *testing.M) { opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), diff --git a/pkg/server/BUILD.bazel b/pkg/server/BUILD.bazel index 86901c1b84b5e..674fc95232c16 100644 --- a/pkg/server/BUILD.bazel +++ b/pkg/server/BUILD.bazel @@ -22,9 +22,11 @@ go_library( visibility = ["//visibility:public"], deps = [ "//pkg/autoid_service", + "//pkg/bindinfo", "//pkg/config", "//pkg/domain", "//pkg/domain/infosync", + "//pkg/domain/resourcegroup", "//pkg/errno", "//pkg/executor", "//pkg/executor/mppcoordmanager", @@ -49,7 +51,7 @@ go_library( "//pkg/privilege/privileges/ldap", "//pkg/server/err", "//pkg/server/handler", - "//pkg/server/handler/extactorhandler", + "//pkg/server/handler/extractorhandler", "//pkg/server/handler/optimizor", "//pkg/server/handler/tikvhandler", "//pkg/server/handler/ttlhandler", @@ -78,6 +80,7 @@ go_library( "//pkg/util", "//pkg/util/arena", "//pkg/util/chunk", + "//pkg/util/context", "//pkg/util/cpuprofile", "//pkg/util/dbterror", "//pkg/util/dbterror/exeerrors", @@ -88,6 +91,7 @@ go_library( "//pkg/util/logutil", "//pkg/util/memory", "//pkg/util/printer", + "//pkg/util/resourcegrouptag", "//pkg/util/sqlexec", "//pkg/util/sqlkiller", "//pkg/util/sys/linux", @@ -115,6 +119,7 @@ go_library( "@com_github_soheilhy_cmux//:cmux", "@com_github_stretchr_testify//require", "@com_github_tiancaiamao_appdash//traceapp", + "@com_github_tikv_client_go_v2//tikvrpc", "@com_github_tikv_client_go_v2//util", "@com_sourcegraph_sourcegraph_appdash_data//:appdash-data", "@org_golang_google_grpc//:grpc", @@ -181,6 +186,7 @@ go_test( "//pkg/util", "//pkg/util/arena", "//pkg/util/chunk", + "//pkg/util/context", "//pkg/util/dbterror/exeerrors", "//pkg/util/replayer", "//pkg/util/sqlkiller", diff --git a/pkg/server/conn.go b/pkg/server/conn.go index 57d9856f01c03..22407c9d20fad 100644 --- a/pkg/server/conn.go +++ b/pkg/server/conn.go @@ -45,6 +45,7 @@ import ( "io" "net" "os/user" + "runtime" "runtime/pprof" "runtime/trace" "strconv" @@ -59,6 +60,7 @@ import ( "github.com/pingcap/failpoint" "github.com/pingcap/tidb/pkg/config" "github.com/pingcap/tidb/pkg/domain/infosync" + "github.com/pingcap/tidb/pkg/domain/resourcegroup" "github.com/pingcap/tidb/pkg/errno" "github.com/pingcap/tidb/pkg/executor" "github.com/pingcap/tidb/pkg/extension" @@ -98,11 +100,15 @@ import ( "github.com/pingcap/tidb/pkg/util/dbterror/exeerrors" "github.com/pingcap/tidb/pkg/util/execdetails" "github.com/pingcap/tidb/pkg/util/hack" + "github.com/pingcap/tidb/pkg/util/intest" "github.com/pingcap/tidb/pkg/util/logutil" + "github.com/pingcap/tidb/pkg/util/resourcegrouptag" tlsutil "github.com/pingcap/tidb/pkg/util/tls" + "github.com/pingcap/tidb/pkg/util/topsql" topsqlstate "github.com/pingcap/tidb/pkg/util/topsql/state" "github.com/pingcap/tidb/pkg/util/tracing" "github.com/prometheus/client_golang/prometheus" + "github.com/tikv/client-go/v2/tikvrpc" "github.com/tikv/client-go/v2/util" "go.uber.org/zap" ) @@ -120,6 +126,11 @@ var ( statusCompressionLevel = "Compression_level" ) +var ( + // ConnectionInMemCounterForTest is a variable to count live connection object + ConnectionInMemCounterForTest = atomic.Int64{} +) + // newClientConn creates a *clientConn object. func newClientConn(s *Server) *clientConn { cc := &clientConn{ @@ -134,7 +145,13 @@ func newClientConn(s *Server) *clientConn { quit: make(chan struct{}), ppEnabled: s.cfg.ProxyProtocol.Networks != "", } - variable.RegisterStatistics(cc) + + if intest.InTest { + ConnectionInMemCounterForTest.Add(1) + runtime.SetFinalizer(cc, func(*clientConn) { + ConnectionInMemCounterForTest.Add(-1) + }) + } return cc } @@ -169,8 +186,9 @@ type clientConn struct { lastActive time.Time // last active time authPlugin string // default authentication plugin isUnixSocket bool // connection is Unix Socket file - rsEncoder *column.ResultEncoder // rsEncoder is used to encode the string result to different charsets. - inputDecoder *util2.InputDecoder // inputDecoder is used to decode the different charsets of incoming strings to utf-8. + closeOnce sync.Once // closeOnce is used to make sure clientConn closes only once + rsEncoder *column.ResultEncoder // rsEncoder is used to encode the string result to different charsets + inputDecoder *util2.InputDecoder // inputDecoder is used to decode the different charsets of incoming strings to utf-8 socketCredUID uint32 // UID from the other end of the Unix Socket // mu is used for cancelling the execution of current transaction. mu struct { @@ -344,38 +362,58 @@ func (cc *clientConn) handshake(ctx context.Context) error { func (cc *clientConn) Close() error { cc.server.rwlock.Lock() delete(cc.server.clients, cc.connectionID) - connections := len(cc.server.clients) + resourceGroupName, count := "", 0 + if ctx := cc.getCtx(); ctx != nil { + resourceGroupName = ctx.GetSessionVars().ResourceGroupName + count = cc.server.ConnNumByResourceGroup[resourceGroupName] + if count <= 1 { + delete(cc.server.ConnNumByResourceGroup, resourceGroupName) + } else { + cc.server.ConnNumByResourceGroup[resourceGroupName]-- + } + } cc.server.rwlock.Unlock() - return closeConn(cc, connections) + return closeConn(cc, resourceGroupName, count) } -// closeConn should be idempotent. +// closeConn is idempotent and thread-safe. // It will be called on the same `clientConn` more than once to avoid connection leak. -func closeConn(cc *clientConn, connections int) error { - metrics.ConnGauge.Set(float64(connections)) - if cc.connectionID > 0 { - cc.server.dom.ReleaseConnID(cc.connectionID) - cc.connectionID = 0 - } - if cc.bufReadConn != nil { - err := cc.bufReadConn.Close() - if err != nil { - // We need to expect connection might have already disconnected. - // This is because closeConn() might be called after a connection read-timeout. - logutil.Logger(context.Background()).Debug("could not close connection", zap.Error(err)) +func closeConn(cc *clientConn, resourceGroupName string, count int) error { + var err error + cc.closeOnce.Do(func() { + metrics.ConnGauge.WithLabelValues(resourceGroupName).Set(float64(count)) + + if cc.connectionID > 0 { + cc.server.dom.ReleaseConnID(cc.connectionID) + cc.connectionID = 0 } - } - // Close statements and session - // This will release advisory locks, row locks, etc. - if ctx := cc.getCtx(); ctx != nil { - return ctx.Close() - } - return nil + if cc.bufReadConn != nil { + err := cc.bufReadConn.Close() + if err != nil { + // We need to expect connection might have already disconnected. + // This is because closeConn() might be called after a connection read-timeout. + logutil.Logger(context.Background()).Debug("could not close connection", zap.Error(err)) + } + } + // Close statements and session + // This will release advisory locks, row locks, etc. + if ctx := cc.getCtx(); ctx != nil { + err = ctx.Close() + } + }) + return err } func (cc *clientConn) closeWithoutLock() error { delete(cc.server.clients, cc.connectionID) - return closeConn(cc, len(cc.server.clients)) + name := cc.getCtx().GetSessionVars().ResourceGroupName + count := cc.server.ConnNumByResourceGroup[name] + if count <= 1 { + delete(cc.server.ConnNumByResourceGroup, name) + } else { + cc.server.ConnNumByResourceGroup[name]-- + } + return closeConn(cc, name, count-1) } // writeInitialHandshake sends server version, connection ID, server capability, collation, server status @@ -456,6 +494,14 @@ func (cc *clientConn) writePacket(data []byte) error { return cc.pkt.WritePacket(data) } +func (cc *clientConn) getWaitTimeout(ctx context.Context) uint64 { + sessVars := cc.ctx.GetSessionVars() + if sessVars.InTxn() && sessVars.IdleTransactionTimeout > 0 { + return uint64(sessVars.IdleTransactionTimeout) + } + return cc.getSessionVarsWaitTimeout(ctx) +} + // getSessionVarsWaitTimeout get session variable wait_timeout func (cc *clientConn) getSessionVarsWaitTimeout(ctx context.Context) uint64 { valStr, exists := cc.ctx.GetSessionVars().GetSystemVar(variable.WaitTimeout) @@ -958,9 +1004,7 @@ func (cc *clientConn) initConnect(ctx context.Context) error { break } } - if err := rs.Close(); err != nil { - return err - } + rs.Close() } } logutil.Logger(ctx).Debug("init_connect complete") @@ -1029,7 +1073,7 @@ func (cc *clientConn) Run(ctx context.Context) { cc.alloc.Reset() // close connection when idle time is more than wait_timeout // default 28800(8h), FIXME: should not block at here when we kill the connection. - waitTimeout := cc.getSessionVarsWaitTimeout(ctx) + waitTimeout := cc.getWaitTimeout(ctx) cc.pkt.SetReadTimeout(time.Duration(waitTimeout) * time.Second) start := time.Now() data, err := cc.readPacket() @@ -1096,9 +1140,11 @@ func (cc *clientConn) Run(ctx context.Context) { if ctx := cc.getCtx(); ctx != nil { txnMode = ctx.GetSessionVars().GetReadableTxnMode() } - for _, dbName := range session.GetDBNames(cc.getCtx().GetSessionVars()) { - metrics.ExecuteErrorCounter.WithLabelValues(metrics.ExecuteErrorToLabel(err), dbName).Inc() + vars := cc.getCtx().GetSessionVars() + for _, dbName := range session.GetDBNames(vars) { + metrics.ExecuteErrorCounter.WithLabelValues(metrics.ExecuteErrorToLabel(err), dbName, vars.ResourceGroupName).Inc() } + if storeerr.ErrLockAcquireFailAndNoWaitSet.Equal(err) { logutil.Logger(ctx).Debug("Expected error for FOR UPDATE NOWAIT", zap.Error(err)) } else { @@ -1147,20 +1193,25 @@ func (cc *clientConn) addMetrics(cmd byte, startTime time.Time, err error) { return } + vars := cc.getCtx().GetSessionVars() + resourceGroupName := vars.ResourceGroupName var counter prometheus.Counter - if err != nil && int(cmd) < len(server_metrics.QueryTotalCountErr) { - counter = server_metrics.QueryTotalCountErr[cmd] - } else if err == nil && int(cmd) < len(server_metrics.QueryTotalCountOk) { - counter = server_metrics.QueryTotalCountOk[cmd] + if len(resourceGroupName) == 0 || resourceGroupName == resourcegroup.DefaultResourceGroupName { + if err != nil && int(cmd) < len(server_metrics.QueryTotalCountErr) { + counter = server_metrics.QueryTotalCountErr[cmd] + } else if err == nil && int(cmd) < len(server_metrics.QueryTotalCountOk) { + counter = server_metrics.QueryTotalCountOk[cmd] + } } + if counter != nil { counter.Inc() } else { label := strconv.Itoa(int(cmd)) if err != nil { - metrics.QueryTotalCounter.WithLabelValues(label, "Error").Inc() + metrics.QueryTotalCounter.WithLabelValues(label, "Error", resourceGroupName).Inc() } else { - metrics.QueryTotalCounter.WithLabelValues(label, "OK").Inc() + metrics.QueryTotalCounter.WithLabelValues(label, "OK", resourceGroupName).Inc() } } @@ -1186,9 +1237,8 @@ func (cc *clientConn) addMetrics(cmd byte, startTime time.Time, err error) { server_metrics.AffectedRowsCounterUpdate.Add(float64(affectedRows)) } - vars := cc.getCtx().GetSessionVars() for _, dbName := range session.GetDBNames(vars) { - metrics.QueryDurationHistogram.WithLabelValues(sqlType, dbName, vars.ResourceGroupName).Observe(cost.Seconds()) + metrics.QueryDurationHistogram.WithLabelValues(sqlType, dbName, vars.StmtCtx.ResourceGroupName).Observe(cost.Seconds()) } } @@ -1210,7 +1260,7 @@ func (cc *clientConn) dispatch(ctx context.Context, data []byte) error { cfg := config.GetGlobalConfig() if cfg.OpenTracing.Enable { var r tracing.Region - r, ctx = tracing.StartRegionEx(ctx, "server.dispatch") + r, ctx = tracing.StartRegionWithNewRootSpan(ctx, "server.dispatch") defer r.End() } @@ -1529,93 +1579,6 @@ func (cc *clientConn) writeReq(ctx context.Context, filePath string) error { return cc.flush(ctx) } -// handleLoadData does the additional work after processing the 'load data' query. -// It sends client a file path, then reads the file content from client, inserts data into database. -func (cc *clientConn) handleLoadData(ctx context.Context, loadDataWorker *executor.LoadDataWorker) error { - // If the server handles the load data request, the client has to set the ClientLocalFiles capability. - if cc.capability&mysql.ClientLocalFiles == 0 { - return servererr.ErrNotAllowedCommand - } - if loadDataWorker == nil { - return errors.New("load data info is empty") - } - infile := loadDataWorker.GetInfilePath() - err := cc.writeReq(ctx, infile) - if err != nil { - return err - } - - var ( - // use Pipe to convert cc.readPacket to io.Reader - r, w = io.Pipe() - drained bool - wg sync.WaitGroup - ) - wg.Add(1) - go func() { - defer wg.Done() - //nolint: errcheck - defer w.Close() - - var ( - data []byte - err2 error - ) - for { - if len(data) == 0 { - data, err2 = cc.readPacket() - if err2 != nil { - w.CloseWithError(err2) - return - } - // https://dev.mysql.com/doc/dev/mysql-server/latest/page_protocol_com_query_response_local_infile_request.html - if len(data) == 0 { - drained = true - return - } - } - - n, err3 := w.Write(data) - if err3 != nil { - logutil.Logger(ctx).Error("write data meet error", zap.Error(err3)) - return - } - data = data[n:] - } - }() - - ctx = kv.WithInternalSourceType(ctx, kv.InternalLoadData) - err = loadDataWorker.LoadLocal(ctx, r) - _ = r.Close() - wg.Wait() - - if err != nil { - if !drained { - logutil.Logger(ctx).Info("not drained yet, try reading left data from client connection") - } - // drain the data from client conn util empty packet received, otherwise the connection will be reset - // https://dev.mysql.com/doc/dev/mysql-server/latest/page_protocol_com_query_response_local_infile_request.html - for !drained { - // check kill flag again, let the draining loop could quit if empty packet could not be received - if atomic.CompareAndSwapUint32(&loadDataWorker.UserSctx.GetSessionVars().SQLKiller.Signal, 1, 0) { - logutil.Logger(ctx).Warn("receiving kill, stop draining data, connection may be reset") - return exeerrors.ErrQueryInterrupted - } - curData, err1 := cc.readPacket() - if err1 != nil { - logutil.Logger(ctx).Error("drain reading left data encounter errors", zap.Error(err1)) - break - } - if len(curData) == 0 { - drained = true - logutil.Logger(ctx).Info("draining finished for error", zap.Error(err)) - break - } - } - } - return err -} - // getDataFromPath gets file contents from file path. func (cc *clientConn) getDataFromPath(ctx context.Context, path string) ([]byte, error) { err := cc.writeReq(ctx, path) @@ -1779,7 +1742,7 @@ func (cc *clientConn) handleQuery(ctx context.Context, sql string) (err error) { cc.ctx.GetSessionVars().InMultiStmts = true // Only pre-build point plans for multi-statement query - pointPlans, err = cc.prefetchPointPlanKeys(ctx, stmts) + pointPlans, err = cc.prefetchPointPlanKeys(ctx, stmts, sql) if err != nil { for _, stmt := range stmts { cc.onExtensionStmtEnd(stmt, false, err) @@ -1855,7 +1818,7 @@ func (cc *clientConn) handleQuery(ctx context.Context, sql string) (err error) { // prefetchPointPlanKeys extracts the point keys in multi-statement query, // use BatchGet to get the keys, so the values will be cached in the snapshot cache, save RPC call cost. // For pessimistic transaction, the keys will be batch locked. -func (cc *clientConn) prefetchPointPlanKeys(ctx context.Context, stmts []ast.StmtNode) ([]plannercore.Plan, error) { +func (cc *clientConn) prefetchPointPlanKeys(ctx context.Context, stmts []ast.StmtNode, sqls string) ([]plannercore.Plan, error) { txn, err := cc.ctx.Txn(false) if err != nil { return nil, err @@ -1879,13 +1842,14 @@ func (cc *clientConn) prefetchPointPlanKeys(ctx context.Context, stmts []ast.Stm pointPlans := make([]plannercore.Plan, len(stmts)) var idxKeys []kv.Key //nolint: prealloc var rowKeys []kv.Key //nolint: prealloc + isCommonHandle := make(map[string]bool, 0) handlePlan := func(p plannercore.PhysicalPlan, resetStmtCtxFn func()) error { var tableID int64 switch v := p.(type) { case *plannercore.PointGetPlan: - if v.PartitionInfo != nil { - tableID = v.PartitionInfo.ID + if v.PartitionDef != nil { + tableID = v.PartitionDef.ID } else { tableID = v.TblInfo.ID } @@ -1896,16 +1860,17 @@ func (cc *clientConn) prefetchPointPlanKeys(ctx context.Context, stmts []ast.Stm return err1 } idxKeys = append(idxKeys, idxKey) + isCommonHandle[string(hack.String(idxKey))] = v.TblInfo.IsCommonHandle } else { rowKeys = append(rowKeys, tablecodec.EncodeRowKeyWithHandle(tableID, v.Handle)) } case *plannercore.BatchPointGetPlan: - if v.PartitionInfos != nil && len(v.PartitionIDs) == 0 { + if v.PartitionDefs != nil && len(v.PartitionIDs) == 0 { // skip when PartitionIDs is not initialized. return nil } getPhysID := func(i int) int64 { - if v.PartitionInfos == nil { + if v.PartitionDefs == nil { return v.TblInfo.ID } return v.PartitionIDs[i] @@ -1918,6 +1883,7 @@ func (cc *clientConn) prefetchPointPlanKeys(ctx context.Context, stmts []ast.Stm return err1 } idxKeys = append(idxKeys, idxKey) + isCommonHandle[string(hack.String(idxKey))] = v.TblInfo.IsCommonHandle } } else { for i, handle := range v.Handles { @@ -1982,12 +1948,14 @@ func (cc *clientConn) prefetchPointPlanKeys(ctx context.Context, stmts []ast.Stm return pointPlans, nil } snapshot := txn.GetSnapshot() + setResourceGroupTaggerForMultiStmtPrefetch(snapshot, sqls) idxVals, err1 := snapshot.BatchGet(ctx, idxKeys) if err1 != nil { return nil, err1 } for idxKey, idxVal := range idxVals { - h, err2 := tablecodec.DecodeHandleInUniqueIndexValue(idxVal, false) + isCommonHd := isCommonHandle[idxKey] + h, err2 := tablecodec.DecodeHandleInUniqueIndexValue(idxVal, isCommonHd) if err2 != nil { return nil, err2 } @@ -2011,13 +1979,48 @@ func (cc *clientConn) prefetchPointPlanKeys(ctx context.Context, stmts []ast.Stm return pointPlans, nil } +func setResourceGroupTaggerForMultiStmtPrefetch(snapshot kv.Snapshot, sqls string) { + if !topsqlstate.TopSQLEnabled() { + return + } + normalized, digest := parser.NormalizeDigest(sqls) + topsql.AttachAndRegisterSQLInfo(context.Background(), normalized, digest, false) + snapshot.SetOption(kv.ResourceGroupTagger, tikvrpc.ResourceGroupTagger(func(req *tikvrpc.Request) { + if req == nil { + return + } + if len(normalized) == 0 { + return + } + req.ResourceGroupTag = resourcegrouptag.EncodeResourceGroupTag(digest, nil, + resourcegrouptag.GetResourceGroupLabelByKey(resourcegrouptag.GetFirstKeyFromRequest(req))) + })) +} + // The first return value indicates whether the call of handleStmt has no side effect and can be retried. // Currently, the first return value is used to fall back to TiKV when TiFlash is down. -func (cc *clientConn) handleStmt(ctx context.Context, stmt ast.StmtNode, warns []stmtctx.SQLWarn, lastStmt bool) (bool, error) { +func (cc *clientConn) handleStmt( + ctx context.Context, stmt ast.StmtNode, + warns []stmtctx.SQLWarn, lastStmt bool, +) (bool, error) { ctx = context.WithValue(ctx, execdetails.StmtExecDetailKey, &execdetails.StmtExecDetails{}) ctx = context.WithValue(ctx, util.ExecDetailsKey, &util.ExecDetails{}) + ctx = context.WithValue(ctx, util.RUDetailsCtxKey, util.NewRUDetails()) reg := trace.StartRegion(ctx, "ExecuteStmt") cc.audit(plugin.Starting) + + // if stmt is load data stmt, store the channel that reads from the conn + // into the ctx for executor to use + if s, ok := stmt.(*ast.LoadDataStmt); ok { + if s.FileLocRef == ast.FileLocClient { + err := cc.preprocessLoadDataLocal(ctx) + defer cc.postprocessLoadDataLocal() + if err != nil { + return false, err + } + } + } + rs, err := cc.ctx.ExecuteStmt(ctx, stmt) reg.End() // - If rs is not nil, the statement tracker detachment from session tracker @@ -2025,8 +2028,9 @@ func (cc *clientConn) handleStmt(ctx context.Context, stmt ast.StmtNode, warns [ // - If the rs is nil and err is not nil, the detachment will be done in // the `handleNoDelay`. if rs != nil { - defer terror.Call(rs.Close) + defer rs.Close() } + if err != nil { // If error is returned during the planner phase or the executor.Open // phase, the rs will be nil, and StmtCtx.MemTracker StmtCtx.DiskTracker @@ -2064,18 +2068,93 @@ func (cc *clientConn) handleStmt(ctx context.Context, stmt ast.StmtNode, warns [ return false, err } -func (cc *clientConn) handleFileTransInConn(ctx context.Context, status uint16) (bool, error) { - handled := false - loadDataInfo := cc.ctx.Value(executor.LoadDataVarKey) - if loadDataInfo != nil { - handled = true - defer cc.ctx.SetValue(executor.LoadDataVarKey, nil) - //nolint:forcetypeassert - if err := cc.handleLoadData(ctx, loadDataInfo.(*executor.LoadDataWorker)); err != nil { - return handled, err +// Preprocess LOAD DATA. Load data from a local file requires reading from the connection. +// The function pass a builder to build the connection reader to the context, +// which will be used in LoadDataExec. +func (cc *clientConn) preprocessLoadDataLocal(ctx context.Context) error { + if cc.capability&mysql.ClientLocalFiles == 0 { + return servererr.ErrNotAllowedCommand + } + + var readerBuilder executor.LoadDataReaderBuilder = func(filepath string) ( + io.ReadCloser, error, + ) { + err := cc.writeReq(ctx, filepath) + if err != nil { + return nil, err } + + drained := false + r, w := io.Pipe() + + go func() { + var errOccurred error + + defer func() { + if errOccurred != nil { + // Continue reading packets to drain the connection + for !drained { + data, err := cc.readPacket() + if err != nil { + logutil.Logger(ctx).Error( + "drain connection failed in load data", + zap.Error(err), + ) + break + } + if len(data) == 0 { + drained = true + } + } + } + err := w.CloseWithError(errOccurred) + if err != nil { + logutil.Logger(ctx).Error( + "close pipe failed in `load data`", + zap.Error(err), + ) + } + }() + + for { + data, err := cc.readPacket() + if err != nil { + errOccurred = err + return + } + + if len(data) == 0 { + drained = true + return + } + + // Write all content in `data` + for len(data) > 0 { + n, err := w.Write(data) + if err != nil { + errOccurred = err + return + } + data = data[n:] + } + } + }() + + return r, nil } + cc.ctx.SetValue(executor.LoadDataReaderBuilderKey, readerBuilder) + + return nil +} + +func (cc *clientConn) postprocessLoadDataLocal() { + cc.ctx.ClearValue(executor.LoadDataReaderBuilderKey) +} + +func (cc *clientConn) handleFileTransInConn(ctx context.Context, status uint16) (bool, error) { + handled := false + loadStats := cc.ctx.Value(executor.LoadStatsVarKey) if loadStats != nil { handled = true @@ -2293,7 +2372,7 @@ func (cc *clientConn) writeChunks(ctx context.Context, rs resultset.ResultSet, b stmtDetail.WriteSQLRespDuration += time.Since(start) } } - if err := rs.Close(); err != nil { + if err := rs.Finish(); err != nil { return false, err } @@ -2594,8 +2673,10 @@ func (cc *clientConn) Flush(ctx context.Context) error { return cc.flush(ctx) } +type compressionStats struct{} + // Stats returns the connection statistics. -func (*clientConn) Stats(vars *variable.SessionVars) (map[string]interface{}, error) { +func (*compressionStats) Stats(vars *variable.SessionVars) (map[string]interface{}, error) { m := make(map[string]interface{}, 3) switch vars.CompressionAlgorithm { @@ -2625,6 +2706,10 @@ func (*clientConn) Stats(vars *variable.SessionVars) (map[string]interface{}, er } // GetScope gets the status variables scope. -func (*clientConn) GetScope(_ string) variable.ScopeFlag { +func (*compressionStats) GetScope(_ string) variable.ScopeFlag { return variable.ScopeSession } + +func init() { + variable.RegisterStatistics(&compressionStats{}) +} diff --git a/pkg/server/conn_stmt.go b/pkg/server/conn_stmt.go index cfb6a20da506f..d653f997546b0 100644 --- a/pkg/server/conn_stmt.go +++ b/pkg/server/conn_stmt.go @@ -50,7 +50,6 @@ import ( "github.com/pingcap/tidb/pkg/parser/ast" "github.com/pingcap/tidb/pkg/parser/charset" "github.com/pingcap/tidb/pkg/parser/mysql" - "github.com/pingcap/tidb/pkg/parser/terror" plannercore "github.com/pingcap/tidb/pkg/planner/core" "github.com/pingcap/tidb/pkg/server/internal/dump" "github.com/pingcap/tidb/pkg/server/internal/parse" @@ -230,6 +229,7 @@ func (cc *clientConn) handleStmtExecute(ctx context.Context, data []byte) (err e func (cc *clientConn) executePlanCacheStmt(ctx context.Context, stmt interface{}, args []param.BinaryParam, useCursor bool) (err error) { ctx = context.WithValue(ctx, execdetails.StmtExecDetailKey, &execdetails.StmtExecDetails{}) ctx = context.WithValue(ctx, util.ExecDetailsKey, &util.ExecDetails{}) + ctx = context.WithValue(ctx, util.RUDetailsCtxKey, util.NewRUDetails()) retryable, err := cc.executePreparedStmtAndWriteResult(ctx, stmt.(PreparedStatement), args, useCursor) if err != nil { action, txnErr := sessiontxn.GetTxnManager(&cc.ctx).OnStmtErrorForNextAction(ctx, sessiontxn.StmtErrAfterQuery, err) @@ -304,7 +304,7 @@ func (cc *clientConn) executePreparedStmtAndWriteResult(ctx context.Context, stm execStmt.SetText(charset.EncodingUTF8Impl, sql) rs, err := (&cc.ctx).ExecuteStmt(ctx, execStmt) if rs != nil { - defer terror.Call(rs.Close) + defer rs.Close() } if err != nil { // If error is returned during the planner phase or the executor.Open diff --git a/pkg/server/conn_stmt_params_test.go b/pkg/server/conn_stmt_params_test.go index 61dd33ffcc935..b992d78ea4a9e 100644 --- a/pkg/server/conn_stmt_params_test.go +++ b/pkg/server/conn_stmt_params_test.go @@ -31,6 +31,7 @@ import ( "github.com/pingcap/tidb/pkg/testkit" "github.com/pingcap/tidb/pkg/types" "github.com/pingcap/tidb/pkg/util/chunk" + contextutil "github.com/pingcap/tidb/pkg/util/context" "github.com/stretchr/testify/require" ) @@ -268,9 +269,9 @@ func TestParseExecArgs(t *testing.T) { } for _, tt := range tests { var warn error - typectx := types.NewContext(types.DefaultStmtFlags.WithTruncateAsWarning(true), time.UTC, func(err error) { + typectx := types.NewContext(types.DefaultStmtFlags.WithTruncateAsWarning(true), time.UTC, contextutil.NewFuncWarnHandlerForTest(func(err error) { warn = err - }) + })) err := decodeAndParse(typectx, tt.args.args, tt.args.boundParams, tt.args.nullBitmap, tt.args.paramTypes, tt.args.paramValues, nil) require.Truef(t, terror.ErrorEqual(err, tt.err), "err %v", err) require.Truef(t, terror.ErrorEqual(warn, tt.warn), "warn %v", warn) @@ -340,7 +341,7 @@ func expectedDatetimeExecuteResult(t *testing.T, c *mockConn, time types.Time, w require.NoError(t, conn.writePacket(data)) for i := 0; i < warnCount; i++ { - conn.ctx.GetSessionVars().StmtCtx.AppendWarning(errors.New("any error")) + conn.ctx.GetSessionVars().StmtCtx.AppendWarning(errors.NewNoStackError("any error")) } require.NoError(t, conn.writeEOF(context.Background(), mysql.ServerStatusAutocommit)) }) diff --git a/pkg/server/conn_stmt_test.go b/pkg/server/conn_stmt_test.go index 0cdf29d6d5147..cdfec0f6d0cd7 100644 --- a/pkg/server/conn_stmt_test.go +++ b/pkg/server/conn_stmt_test.go @@ -21,12 +21,6 @@ import ( "crypto/rand" "encoding/binary" "fmt" - "io/fs" - "os" - "path/filepath" - "strconv" - "strings" - "syscall" "testing" "github.com/pingcap/failpoint" @@ -334,25 +328,11 @@ func TestCursorFetchErrorInFetch(t *testing.T) { mysql.CursorTypeReadOnly, 0x1, 0x0, 0x0, 0x0, ))) - // close these disk files to produce error - filepath.Walk("/proc/self/fd", func(path string, info fs.FileInfo, err error) error { - if err != nil { - return nil - } - target, err := os.Readlink(path) - if err != nil { - return nil - } - if strings.HasPrefix(target, tmpStoragePath) { - fd, err := strconv.Atoi(filepath.Base(path)) - require.NoError(t, err) - require.NoError(t, syscall.Close(fd)) - } - return nil - }) - - // it'll get "bad file descriptor", as it has been closed in the test. - require.Error(t, c.Dispatch(ctx, appendUint32(appendUint32([]byte{mysql.ComStmtFetch}, uint32(stmt.ID())), 1024))) + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/util/chunk/get-chunk-error", "return(true)")) + defer func() { + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/util/chunk/get-chunk-error")) + }() + require.ErrorContains(t, c.Dispatch(ctx, appendUint32(appendUint32([]byte{mysql.ComStmtFetch}, uint32(stmt.ID())), 1024)), "fail to get chunk for test") // after getting a failed FETCH, the cursor should have been reseted require.False(t, stmt.GetCursorActive()) require.Len(t, tk.Session().GetSessionVars().MemTracker.GetChildrenForTest(), 0) diff --git a/pkg/server/conn_test.go b/pkg/server/conn_test.go index 802f7f9b2926e..de06081e291a6 100644 --- a/pkg/server/conn_test.go +++ b/pkg/server/conn_test.go @@ -25,6 +25,7 @@ import ( "io" "path/filepath" "strings" + "sync" "sync/atomic" "testing" "time" @@ -734,7 +735,8 @@ func TestConnExecutionTimeout(t *testing.T) { err = cc.handleQuery(context.Background(), "select /*+ MAX_EXECUTION_TIME(100)*/ * FROM testTable2 WHERE SLEEP(1);") require.Equal(t, "[executor:3024]Query execution was interrupted, maximum statement execution time exceeded", err.Error()) - + err = cc.handleQuery(context.Background(), "select /*+ set_var(max_execution_time=100) */ age, sleep(1) from testTable2 union all select age, 1 from testTable2") + require.Equal(t, "[executor:3024]Query execution was interrupted, maximum statement execution time exceeded", err.Error()) // Killed because of max execution time, reset Killed to 0. tk.Session().GetSessionVars().SQLKiller.SendKillSignal(sqlkiller.MaxExecTimeExceeded) tk.MustExec("set @@max_execution_time = 500;") @@ -2001,35 +2003,14 @@ func TestEmptyOrgName(t *testing.T) { } func TestStats(t *testing.T) { - var outBuffer bytes.Buffer - store := testkit.CreateMockStore(t) - cfg := serverutil.NewTestConfig() - cfg.Port = 0 - cfg.Status.StatusPort = 0 - drv := NewTiDBDriver(store) - server, err := NewServer(cfg, drv) - require.NoError(t, err) tk := testkit.NewTestKit(t, store) - cc := &clientConn{ - connectionID: 1, - salt: []byte{ - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, - 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, - }, - server: server, - pkt: internal.NewPacketIOForTest(bufio.NewWriter(&outBuffer)), - collation: mysql.DefaultCollationID, - peerHost: "localhost", - alloc: arena.NewAllocator(512), - chunkAlloc: chunk.NewAllocator(), - capability: mysql.ClientProtocol41, - } + stats := &compressionStats{} // No compression vars := tk.Session().GetSessionVars() - m, err := cc.Stats(vars) + m, err := stats.Stats(vars) require.NoError(t, err) require.Equal(t, "OFF", m["Compression"]) require.Equal(t, "", m["Compression_algorithm"]) @@ -2037,7 +2018,7 @@ func TestStats(t *testing.T) { // zlib compression vars.CompressionAlgorithm = mysql.CompressionZlib - m, err = cc.Stats(vars) + m, err = stats.Stats(vars) require.NoError(t, err) require.Equal(t, "ON", m["Compression"]) require.Equal(t, "zlib", m["Compression_algorithm"]) @@ -2046,9 +2027,48 @@ func TestStats(t *testing.T) { // zstd compression, with level 1 vars.CompressionAlgorithm = mysql.CompressionZstd vars.CompressionLevel = 1 - m, err = cc.Stats(vars) + m, err = stats.Stats(vars) require.NoError(t, err) require.Equal(t, "ON", m["Compression"]) require.Equal(t, "zstd", m["Compression_algorithm"]) require.Equal(t, 1, m["Compression_level"]) } + +func TestCloseConn(t *testing.T) { + var outBuffer bytes.Buffer + + store, _ := testkit.CreateMockStoreAndDomain(t) + cfg := serverutil.NewTestConfig() + cfg.Port = 0 + cfg.Status.StatusPort = 0 + drv := NewTiDBDriver(store) + server, err := NewServer(cfg, drv) + require.NoError(t, err) + + cc := &clientConn{ + connectionID: 0, + salt: []byte{ + 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, + 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, + }, + server: server, + pkt: internal.NewPacketIOForTest(bufio.NewWriter(&outBuffer)), + collation: mysql.DefaultCollationID, + peerHost: "localhost", + alloc: arena.NewAllocator(512), + chunkAlloc: chunk.NewAllocator(), + capability: mysql.ClientProtocol41, + } + + var wg sync.WaitGroup + const numGoroutines = 10 + wg.Add(numGoroutines) + for i := 0; i < numGoroutines; i++ { + go func() { + defer wg.Done() + err := closeConn(cc, "", 1) + require.NoError(t, err) + }() + } + wg.Wait() +} diff --git a/pkg/server/driver_tidb.go b/pkg/server/driver_tidb.go index c1d51b354e01a..749b274f58d6a 100644 --- a/pkg/server/driver_tidb.go +++ b/pkg/server/driver_tidb.go @@ -21,6 +21,7 @@ import ( "strings" "github.com/pingcap/errors" + "github.com/pingcap/tidb/pkg/bindinfo" "github.com/pingcap/tidb/pkg/expression" "github.com/pingcap/tidb/pkg/extension" "github.com/pingcap/tidb/pkg/kv" @@ -200,7 +201,7 @@ func (ts *TiDBStatement) Close() error { if !ok { return errors.Errorf("invalid PlanCacheStmt type") } - bindSQL, _ := core.GetBindSQL4PlanCache(ts.ctx, preparedObj) + bindSQL, _ := bindinfo.MatchSQLBindingForPlanCache(ts.ctx, preparedObj.PreparedAst.Stmt, &preparedObj.BindingInfo) cacheKey, err := core.NewPlanCacheKey(ts.ctx.GetSessionVars(), preparedObj.StmtText, preparedObj.StmtDB, preparedObj.PreparedAst.SchemaVersion, 0, bindSQL, expression.ExprPushDownBlackListReloadTimeStamp.Load()) if err != nil { diff --git a/pkg/server/extension.go b/pkg/server/extension.go index 407c4fa979e8b..4339e08c19d45 100644 --- a/pkg/server/extension.go +++ b/pkg/server/extension.go @@ -26,6 +26,7 @@ import ( "github.com/pingcap/tidb/pkg/sessionctx/stmtctx" "github.com/pingcap/tidb/pkg/sessionctx/variable" "github.com/pingcap/tidb/pkg/types" + contextutil "github.com/pingcap/tidb/pkg/util/context" ) func (cc *clientConn) onExtensionConnEvent(tp extension.ConnEventTp, err error) { @@ -89,9 +90,7 @@ func (cc *clientConn) onExtensionStmtEnd(node interface{}, stmtCtxValid bool, er // TODO: the `BinaryParam` is parsed two times: one in the `Execute` method and one here. It would be better to // eliminate one of them by storing the parsed result. typectx := ctx.GetSessionVars().StmtCtx.TypeCtx() - typectx = types.NewContext(typectx.Flags(), typectx.Location(), func(_ error) { - // ignore all warnings - }) + typectx = types.NewContext(typectx.Flags(), typectx.Location(), contextutil.IgnoreWarn) params, _ := param.ExecArgs(typectx, args) info.executeStmt = &ast.ExecuteStmt{ PrepStmt: prepared, diff --git a/pkg/server/extract.go b/pkg/server/extract.go index e8c20481d62fc..89718133de118 100644 --- a/pkg/server/extract.go +++ b/pkg/server/extract.go @@ -14,13 +14,13 @@ package server -import "github.com/pingcap/tidb/pkg/server/handler/extactorhandler" +import "github.com/pingcap/tidb/pkg/server/handler/extractorhandler" // newExtractServeHandler returns extractTaskServeHandler -func (s *Server) newExtractServeHandler() *extactorhandler.ExtractTaskServeHandler { - esh := &extactorhandler.ExtractTaskServeHandler{} +func (s *Server) newExtractServeHandler() *extractorhandler.ExtractTaskServeHandler { + esh := &extractorhandler.ExtractTaskServeHandler{} if s.dom != nil { - esh = extactorhandler.NewExtractTaskServeHandler(s.dom.GetExtractHandle()) + esh = extractorhandler.NewExtractTaskServeHandler(s.dom.GetExtractHandle()) } return esh } diff --git a/pkg/server/handler/extactorhandler/BUILD.bazel b/pkg/server/handler/extractorhandler/BUILD.bazel similarity index 88% rename from pkg/server/handler/extactorhandler/BUILD.bazel rename to pkg/server/handler/extractorhandler/BUILD.bazel index 658fa2420872d..73013b1a37011 100644 --- a/pkg/server/handler/extactorhandler/BUILD.bazel +++ b/pkg/server/handler/extractorhandler/BUILD.bazel @@ -1,9 +1,9 @@ load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") go_library( - name = "extactorhandler", - srcs = ["extactor.go"], - importpath = "github.com/pingcap/tidb/pkg/server/handler/extactorhandler", + name = "extractorhandler", + srcs = ["extractor.go"], + importpath = "github.com/pingcap/tidb/pkg/server/handler/extractorhandler", visibility = ["//visibility:public"], deps = [ "//pkg/domain", @@ -17,7 +17,7 @@ go_library( ) go_test( - name = "extactorhandler_test", + name = "extractorhandler_test", timeout = "short", srcs = [ "extract_test.go", @@ -25,8 +25,9 @@ go_test( ], flaky = True, deps = [ - ":extactorhandler", + ":extractorhandler", "//pkg/config", + "//pkg/domain", "//pkg/metrics", "//pkg/server", "//pkg/server/internal/testserverclient", diff --git a/pkg/server/handler/extactorhandler/extract_test.go b/pkg/server/handler/extractorhandler/extract_test.go similarity index 93% rename from pkg/server/handler/extactorhandler/extract_test.go rename to pkg/server/handler/extractorhandler/extract_test.go index 7f2144a26c512..ac8cffcecac9f 100644 --- a/pkg/server/handler/extactorhandler/extract_test.go +++ b/pkg/server/handler/extractorhandler/extract_test.go @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -package extactorhandler_test +package extractorhandler_test import ( "database/sql" @@ -26,8 +26,9 @@ import ( "github.com/gorilla/mux" "github.com/pingcap/failpoint" "github.com/pingcap/tidb/pkg/config" + "github.com/pingcap/tidb/pkg/domain" server2 "github.com/pingcap/tidb/pkg/server" - "github.com/pingcap/tidb/pkg/server/handler/extactorhandler" + "github.com/pingcap/tidb/pkg/server/handler/extractorhandler" "github.com/pingcap/tidb/pkg/server/internal/testserverclient" "github.com/pingcap/tidb/pkg/server/internal/testutil" "github.com/pingcap/tidb/pkg/server/internal/util" @@ -71,7 +72,7 @@ func TestExtractHandler(t *testing.T) { prepareData4ExtractPlanTask(t, client) time.Sleep(time.Second) endTime := time.Now() - eh := &extactorhandler.ExtractTaskServeHandler{ExtractHandler: dom.GetExtractHandle()} + eh := &extractorhandler.ExtractTaskServeHandler{ExtractHandler: dom.GetExtractHandle()} router := mux.NewRouter() router.Handle("/extract_task/dump", eh) require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/server/extractTaskServeHandler", `return(true)`)) @@ -80,6 +81,7 @@ func TestExtractHandler(t *testing.T) { }() resp0, err := client.FetchStatus(fmt.Sprintf("/extract_task/dump?type=plan&begin=%s&end=%s", url.QueryEscape(startTime.Format(types.TimeFormat)), url.QueryEscape(endTime.Format(types.TimeFormat)))) + defer os.RemoveAll(domain.GetExtractTaskDirName()) require.NoError(t, err) defer func() { require.NoError(t, resp0.Body.Close()) diff --git a/pkg/server/handler/extactorhandler/extactor.go b/pkg/server/handler/extractorhandler/extractor.go similarity index 99% rename from pkg/server/handler/extactorhandler/extactor.go rename to pkg/server/handler/extractorhandler/extractor.go index 7e2a1ccd95c75..4d925e6e5f190 100644 --- a/pkg/server/handler/extactorhandler/extactor.go +++ b/pkg/server/handler/extractorhandler/extractor.go @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -package extactorhandler +package extractorhandler import ( "context" diff --git a/pkg/server/handler/extactorhandler/main_test.go b/pkg/server/handler/extractorhandler/main_test.go similarity index 95% rename from pkg/server/handler/extactorhandler/main_test.go rename to pkg/server/handler/extractorhandler/main_test.go index c166e0f511bb8..de1e0c3c2d2cb 100644 --- a/pkg/server/handler/extactorhandler/main_test.go +++ b/pkg/server/handler/extractorhandler/main_test.go @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -package extactorhandler_test +package extractorhandler_test import ( "fmt" @@ -56,6 +56,7 @@ func TestMain(m *testing.M) { opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("time.Sleep"), goleak.IgnoreTopFunction("database/sql.(*Tx).awaitDone"), diff --git a/pkg/server/handler/optimizor/BUILD.bazel b/pkg/server/handler/optimizor/BUILD.bazel index 9c8f7ebf474c4..9a272edec00b5 100644 --- a/pkg/server/handler/optimizor/BUILD.bazel +++ b/pkg/server/handler/optimizor/BUILD.bazel @@ -60,6 +60,7 @@ go_test( "//pkg/store/mockstore/unistore", "//pkg/testkit", "//pkg/testkit/testsetup", + "//pkg/util/replayer", "//pkg/util/topsql/state", "@com_github_burntsushi_toml//:toml", "@com_github_go_sql_driver_mysql//:mysql", diff --git a/pkg/server/handler/optimizor/main_test.go b/pkg/server/handler/optimizor/main_test.go index 6e4cfe2f8f3b5..116fc9dba5b30 100644 --- a/pkg/server/handler/optimizor/main_test.go +++ b/pkg/server/handler/optimizor/main_test.go @@ -56,6 +56,7 @@ func TestMain(m *testing.M) { opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("time.Sleep"), goleak.IgnoreTopFunction("database/sql.(*Tx).awaitDone"), diff --git a/pkg/server/handler/optimizor/plan_replayer_test.go b/pkg/server/handler/optimizor/plan_replayer_test.go index 829afb4f8f985..bb6da7c385f1d 100644 --- a/pkg/server/handler/optimizor/plan_replayer_test.go +++ b/pkg/server/handler/optimizor/plan_replayer_test.go @@ -42,6 +42,7 @@ import ( "github.com/pingcap/tidb/pkg/session" util2 "github.com/pingcap/tidb/pkg/statistics/handle/util" "github.com/pingcap/tidb/pkg/testkit" + "github.com/pingcap/tidb/pkg/util/replayer" "github.com/stretchr/testify/require" "github.com/tikv/client-go/v2/oracle" ) @@ -112,6 +113,7 @@ func TestDumpPlanReplayerAPI(t *testing.T) { defer server.Close() filename, fileNameFromCapture := prepareData4PlanReplayer(t, client, dom) + defer os.RemoveAll(replayer.GetPlanReplayerDirName()) // 2. check the contents of the plan replayer zip files. diff --git a/pkg/server/handler/tests/main_test.go b/pkg/server/handler/tests/main_test.go index 577f97de761d8..c74b04527702a 100644 --- a/pkg/server/handler/tests/main_test.go +++ b/pkg/server/handler/tests/main_test.go @@ -56,6 +56,7 @@ func TestMain(m *testing.M) { opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("time.Sleep"), goleak.IgnoreTopFunction("database/sql.(*Tx).awaitDone"), diff --git a/pkg/server/handler/tikvhandler/tikv_handler.go b/pkg/server/handler/tikvhandler/tikv_handler.go index 394212e331ea9..b1632201019d7 100644 --- a/pkg/server/handler/tikvhandler/tikv_handler.go +++ b/pkg/server/handler/tikvhandler/tikv_handler.go @@ -1941,25 +1941,11 @@ func (h *TestHandler) handleGCResolveLocks(w http.ResponseWriter, req *http.Requ writeError(w, errors.Errorf("parse safePoint(%s) failed", s)) return } - usePhysical := true - s = req.FormValue("physical") - if s != "" { - usePhysical, err = strconv.ParseBool(s) - if err != nil { - writeError(w, errors.Errorf("parse physical(%s) failed", s)) - return - } - } - ctx := req.Context() - logutil.Logger(ctx).Info("start resolving locks", zap.Uint64("safePoint", safePoint), zap.Bool("physical", usePhysical)) - physicalUsed, err := gcworker.RunResolveLocks(ctx, h.Store, h.RegionCache.PDClient(), safePoint, "testGCWorker", 3, usePhysical) + logutil.Logger(ctx).Info("start resolving locks", zap.Uint64("safePoint", safePoint)) + err = gcworker.RunResolveLocks(ctx, h.Store, h.RegionCache.PDClient(), safePoint, "testGCWorker", 3) if err != nil { writeError(w, errors.Annotate(err, "resolveLocks failed")) - } else { - writeData(w, map[string]interface{}{ - "physicalUsed": physicalUsed, - }) } } diff --git a/pkg/server/internal/BUILD.bazel b/pkg/server/internal/BUILD.bazel index 05f0b1cf84edc..ade7fae050388 100644 --- a/pkg/server/internal/BUILD.bazel +++ b/pkg/server/internal/BUILD.bazel @@ -23,7 +23,7 @@ go_test( srcs = ["packetio_test.go"], embed = [":internal"], flaky = True, - shard_count = 7, + shard_count = 8, deps = [ "//pkg/parser/mysql", "//pkg/server/internal/testutil", diff --git a/pkg/server/internal/column/BUILD.bazel b/pkg/server/internal/column/BUILD.bazel index fc758df83711f..88fb2d7c97b35 100644 --- a/pkg/server/internal/column/BUILD.bazel +++ b/pkg/server/internal/column/BUILD.bazel @@ -40,6 +40,7 @@ go_test( "//pkg/server/internal/util", "//pkg/types", "//pkg/util/chunk", + "//pkg/util/context", "@com_github_stretchr_testify//require", ], ) diff --git a/pkg/server/internal/column/column_test.go b/pkg/server/internal/column/column_test.go index f4fdceab40962..7c224fbf50679 100644 --- a/pkg/server/internal/column/column_test.go +++ b/pkg/server/internal/column/column_test.go @@ -23,6 +23,7 @@ import ( "github.com/pingcap/tidb/pkg/server/internal/util" "github.com/pingcap/tidb/pkg/types" "github.com/pingcap/tidb/pkg/util/chunk" + contextutil "github.com/pingcap/tidb/pkg/util/context" "github.com/stretchr/testify/require" ) @@ -182,7 +183,7 @@ func TestDumpTextValue(t *testing.T) { losAngelesTz, err := time.LoadLocation("America/Los_Angeles") require.NoError(t, err) - typeCtx := types.NewContext(types.StrictFlags.WithIgnoreZeroInDate(true), losAngelesTz, func(err error) {}) + typeCtx := types.NewContext(types.StrictFlags.WithIgnoreZeroInDate(true), losAngelesTz, contextutil.IgnoreWarn) time, err := types.ParseTime(typeCtx, "2017-01-05 23:59:59.575601", mysql.TypeDatetime, 0) require.NoError(t, err) diff --git a/pkg/server/internal/dump/dump.go b/pkg/server/internal/dump/dump.go index ea5d07272bd30..016d6cc1c8d9b 100644 --- a/pkg/server/internal/dump/dump.go +++ b/pkg/server/internal/dump/dump.go @@ -72,31 +72,17 @@ func LengthEncodedInt(buffer []byte, n uint64) []byte { // Uint16 dumps an uint16 as byte slice. func Uint16(buffer []byte, n uint16) []byte { - buffer = append(buffer, byte(n)) - buffer = append(buffer, byte(n>>8)) - return buffer + return binary.LittleEndian.AppendUint16(buffer, n) } // Uint32 dumps an uint32 as byte slice. func Uint32(buffer []byte, n uint32) []byte { - buffer = append(buffer, byte(n)) - buffer = append(buffer, byte(n>>8)) - buffer = append(buffer, byte(n>>16)) - buffer = append(buffer, byte(n>>24)) - return buffer + return binary.LittleEndian.AppendUint32(buffer, n) } // Uint64 dumps an uint64 as byte slice. func Uint64(buffer []byte, n uint64) []byte { - buffer = append(buffer, byte(n)) - buffer = append(buffer, byte(n>>8)) - buffer = append(buffer, byte(n>>16)) - buffer = append(buffer, byte(n>>24)) - buffer = append(buffer, byte(n>>32)) - buffer = append(buffer, byte(n>>40)) - buffer = append(buffer, byte(n>>48)) - buffer = append(buffer, byte(n>>56)) - return buffer + return binary.LittleEndian.AppendUint64(buffer, n) } // BinaryTime dumps a time as binary byte slice. diff --git a/pkg/server/internal/packetio.go b/pkg/server/internal/packetio.go index 9e4e6c02ddc12..ba3eb4165a194 100644 --- a/pkg/server/internal/packetio.go +++ b/pkg/server/internal/packetio.go @@ -157,13 +157,18 @@ func (p *PacketIO) readOnePacket() ([]byte, error) { } length := int(uint32(header[0]) | uint32(header[1])<<8 | uint32(header[2])<<16) - sequence := header[3] + sequence := header[3] if sequence != p.sequence { - return nil, server_err.ErrInvalidSequence.GenWithStack( + err := server_err.ErrInvalidSequence.GenWithStack( "invalid sequence, received %d while expecting %d", sequence, p.sequence) + if p.compressionAlgorithm == mysql.CompressionNone { + return nil, err + } + // To be compatible with MariaDB Connector/J 2.x, + // ignore sequence check and print a log when compression protocol is active. + terror.Log(err) } - p.sequence++ // Accumulated payload length exceeds the limit. diff --git a/pkg/server/internal/packetio_test.go b/pkg/server/internal/packetio_test.go index 7e4230dcdbf05..4d5f47532d26b 100644 --- a/pkg/server/internal/packetio_test.go +++ b/pkg/server/internal/packetio_test.go @@ -424,3 +424,34 @@ func TestCompressedReaderLong(t *testing.T) { require.Equal(t, expected, data) }) } + +// MariaDB Java Connecter 2.X would generate wrong sequence number for the sub header. +// TiDB should be compatible with it. +// +// MySQL Compressed Protocol Header: +// 0e 00 00 Compressed length +// 00 Compressed Packetnr +// 00 00 00 Uncompressed length +// +// MySQL Protocol Header: +// 0a 00 00 Payload length +// 01 Packet Sequence Number (it should be 0x00, but MariaDB Connector/J 2.x sets it to 0x01) +// 03 COM_QUERY +// 73 65 6c 65 63 74 20 31 3b "select 1;" +func TestSubHeaderWithWrongSequenceNumber(t *testing.T) { + var inBuffer bytes.Buffer + _, err := inBuffer.Write([]byte{0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0a, 0x00, 0x00, 0x01, 0x03, 0x73, 0x65, 0x6c, + 0x65, 0x63, 0x74, 0x20, 0x31, 0x3b}) + require.NoError(t, err) + // Test read one packet + brc := util.NewBufferedReadConn(&testutil.BytesConn{Buffer: inBuffer}) + pkt := NewPacketIO(brc) + pkt.SetCompressionAlgorithm(mysql.CompressionZlib) + readBytes, err := pkt.ReadPacket() + require.NoError(t, err) + require.Equal(t, uint8(1), pkt.sequence) + require.Equal(t, uint8(1), pkt.compressedSequence) + require.Equal(t, []byte{0x03, 0x73, 0x65, 0x6c, 0x65, 0x63, + 0x74, 0x20, 0x31, 0x3b}, readBytes) +} diff --git a/pkg/server/internal/resultset/BUILD.bazel b/pkg/server/internal/resultset/BUILD.bazel index da47cac931127..f353da047d0eb 100644 --- a/pkg/server/internal/resultset/BUILD.bazel +++ b/pkg/server/internal/resultset/BUILD.bazel @@ -9,6 +9,7 @@ go_library( importpath = "github.com/pingcap/tidb/pkg/server/internal/resultset", visibility = ["//pkg/server:__subpackages__"], deps = [ + "//pkg/parser/terror", "//pkg/planner/core", "//pkg/server/internal/column", "//pkg/types", diff --git a/pkg/server/internal/resultset/resultset.go b/pkg/server/internal/resultset/resultset.go index ca800055276c4..394f39898780e 100644 --- a/pkg/server/internal/resultset/resultset.go +++ b/pkg/server/internal/resultset/resultset.go @@ -18,6 +18,7 @@ import ( "context" "sync/atomic" + "github.com/pingcap/tidb/pkg/parser/terror" "github.com/pingcap/tidb/pkg/planner/core" "github.com/pingcap/tidb/pkg/server/internal/column" "github.com/pingcap/tidb/pkg/types" @@ -30,11 +31,12 @@ type ResultSet interface { Columns() []*column.Info NewChunk(chunk.Allocator) *chunk.Chunk Next(context.Context, *chunk.Chunk) error - Close() error + Close() // IsClosed checks whether the result set is closed. IsClosed() bool FieldTypes() []*types.FieldType SetPreparedStmt(stmt *core.PlanCacheStmt) + Finish() error } var _ ResultSet = &tidbResultSet{} @@ -62,13 +64,19 @@ func (trs *tidbResultSet) Next(ctx context.Context, req *chunk.Chunk) error { return trs.recordSet.Next(ctx, req) } -func (trs *tidbResultSet) Close() error { +func (trs *tidbResultSet) Finish() error { + if x, ok := trs.recordSet.(interface{ Finish() error }); ok { + return x.Finish() + } + return nil +} + +func (trs *tidbResultSet) Close() { if !atomic.CompareAndSwapInt32(&trs.closed, 0, 1) { - return nil + return } - err := trs.recordSet.Close() + terror.Call(trs.recordSet.Close) trs.recordSet = nil - return err } // IsClosed implements ResultSet.IsClosed interface. diff --git a/pkg/server/internal/testserverclient/server_client.go b/pkg/server/internal/testserverclient/server_client.go index a05b24b2b8ccb..e1faa51b3e47a 100644 --- a/pkg/server/internal/testserverclient/server_client.go +++ b/pkg/server/internal/testserverclient/server_client.go @@ -28,6 +28,7 @@ import ( "regexp" "strconv" "strings" + "sync" "testing" "time" @@ -1008,6 +1009,204 @@ func columnsAsExpected(t *testing.T, columns []*sql.NullString, expected []strin } } +func (cli *TestServerClient) RunTestLoadDataInTransaction(t *testing.T) { + fp, err := os.CreateTemp("", "load_data_test.csv") + require.NoError(t, err) + path := fp.Name() + + require.NotNil(t, fp) + defer func() { + err = fp.Close() + require.NoError(t, err) + err = os.Remove(path) + require.NoError(t, err) + }() + + _, err = fp.WriteString("1") + require.NoError(t, err) + + // load file in transaction can be rolled back + cli.RunTestsOnNewDB( + t, func(config *mysql.Config) { + config.AllowAllFiles = true + config.Params["sql_mode"] = "''" + }, "LoadDataInTransaction", func(dbt *testkit.DBTestKit) { + dbt.MustExec("create table t (a int)") + txn, err := dbt.GetDB().Begin() + require.NoError(t, err) + txn.Exec("insert into t values (100)") // `load data` doesn't commit current txn + _, err = txn.Exec(fmt.Sprintf("load data local infile %q into table t", path)) + require.NoError(t, err) + rows, err := txn.Query("select * from t") + require.NoError(t, err) + cli.CheckRows(t, rows, "100\n1") + err = txn.Rollback() + require.NoError(t, err) + rows = dbt.MustQuery("select * from t") + cli.CheckRows(t, rows) + }, + ) + + // load file in transaction doesn't commit until the transaction is committed + cli.RunTestsOnNewDB( + t, func(config *mysql.Config) { + config.AllowAllFiles = true + config.Params["sql_mode"] = "''" + }, "LoadDataInTransaction", func(dbt *testkit.DBTestKit) { + dbt.MustExec("create table t (a int)") + txn, err := dbt.GetDB().Begin() + require.NoError(t, err) + _, err = txn.Exec(fmt.Sprintf("load data local infile %q into table t", path)) + require.NoError(t, err) + rows, err := txn.Query("select * from t") + require.NoError(t, err) + cli.CheckRows(t, rows, "1") + err = txn.Commit() + require.NoError(t, err) + rows = dbt.MustQuery("select * from t") + cli.CheckRows(t, rows, "1") + }, + ) + + // load file in auto commit mode should succeed + cli.RunTestsOnNewDB( + t, func(config *mysql.Config) { + config.AllowAllFiles = true + config.Params["sql_mode"] = "''" + }, "LoadDataInAutoCommit", func(dbt *testkit.DBTestKit) { + dbt.MustExec("create table t (a int)") + dbt.MustExec(fmt.Sprintf("load data local infile %q into table t", path)) + txn, err := dbt.GetDB().Begin() + require.NoError(t, err) + rows, _ := txn.Query("select * from t") + cli.CheckRows(t, rows, "1") + }, + ) + + // load file in a pessimistic transaction, + // should acquire locks when after its execution and before it commits. + // The lock should be observed by another transaction that is attempting to acquire the same + // lock. + dbName := "LoadDataInPessimisticTransaction" + cli.RunTestsOnNewDB( + t, func(config *mysql.Config) { + config.AllowAllFiles = true + config.Params["sql_mode"] = "''" + }, dbName, func(dbt *testkit.DBTestKit) { + dbt.MustExec("set @@global.tidb_txn_mode = 'pessimistic'") + dbt.MustExec("create table t (a int primary key)") + txn, err := dbt.GetDB().Begin() + require.NoError(t, err) + _, err = txn.Exec(fmt.Sprintf("USE `%s`;", dbName)) + require.NoError(t, err) + _, err = txn.Exec(fmt.Sprintf("load data local infile %q into table t", path)) + require.NoError(t, err) + rows, err := txn.Query("select * from t") + require.NoError(t, err) + cli.CheckRows(t, rows, "1") + + var wg sync.WaitGroup + wg.Add(1) + txn2Locked := make(chan struct{}, 1) + failed := make(chan struct{}, 1) + go func() { + time.Sleep(2 * time.Second) + select { + case <-txn2Locked: + failed <- struct{}{} + default: + } + + err2 := txn.Commit() + require.NoError(t, err2) + wg.Done() + }() + txn2, err := dbt.GetDB().Begin() + require.NoError(t, err) + _, err = txn2.Exec(fmt.Sprintf("USE `%s`;", dbName)) + require.NoError(t, err) + _, err = txn2.Exec("select * from t where a = 1 for update") + require.NoError(t, err) + txn2Locked <- struct{}{} + wg.Wait() + txn2.Rollback() + select { + case <-failed: + require.Fail(t, "txn2 should not be able to acquire the lock") + default: + } + + require.NoError(t, err) + rows = dbt.MustQuery("select * from t") + cli.CheckRows(t, rows, "1") + }, + ) + + dbName = "LoadDataInExplicitTransaction" + cli.RunTestsOnNewDB( + t, func(config *mysql.Config) { + config.AllowAllFiles = true + config.Params["sql_mode"] = "''" + }, dbName, func(dbt *testkit.DBTestKit) { + // in optimistic txn, one should not block another + dbt.MustExec("set @@global.tidb_txn_mode = 'optimistic'") + dbt.MustExec("create table t (a int primary key)") + txn1, err := dbt.GetDB().Begin() + require.NoError(t, err) + txn2, err := dbt.GetDB().Begin() + require.NoError(t, err) + _, err = txn1.Exec(fmt.Sprintf("USE `%s`;", dbName)) + require.NoError(t, err) + _, err = txn2.Exec(fmt.Sprintf("USE `%s`;", dbName)) + require.NoError(t, err) + _, err = txn1.Exec(fmt.Sprintf("load data local infile %q into table t", path)) + require.NoError(t, err) + _, err = txn2.Exec(fmt.Sprintf("load data local infile %q into table t", path)) + require.NoError(t, err) + err = txn1.Commit() + require.NoError(t, err) + err = txn2.Commit() + require.ErrorContains(t, err, "Write conflict") + rows := dbt.MustQuery("select * from t") + cli.CheckRows(t, rows, "1") + }, + ) + + cli.RunTestsOnNewDB( + t, func(config *mysql.Config) { + config.AllowAllFiles = true + config.Params["sql_mode"] = "''" + }, "LoadDataFromServerFile", func(dbt *testkit.DBTestKit) { + dbt.MustExec("create table t (a int)") + _, err = dbt.GetDB().Exec(fmt.Sprintf("load data infile %q into table t", path)) + require.ErrorContains(t, err, "Don't support load data from tidb-server's disk.") + }, + ) + + // The test is intended to test if the load data statement correctly cleans up its + // resources after execution, and does not affect following statements. + // For example, the 1st load data builds the reader and finishes. + // The 2nd load data should not be able to access the reader, especially when it should fail + cli.RunTestsOnNewDB( + t, func(config *mysql.Config) { + config.AllowAllFiles = true + config.Params["sql_mode"] = "''" + }, "LoadDataCleanup", func(dbt *testkit.DBTestKit) { + dbt.MustExec("create table t (a int)") + txn, err := dbt.GetDB().Begin() + require.NoError(t, err) + _, err = txn.Exec(fmt.Sprintf("load data local infile %q into table t", path)) + require.NoError(t, err) + _, err = txn.Exec("load data local infile '/tmp/does_not_exist' into table t") + require.ErrorContains(t, err, "no such file or directory") + err = txn.Commit() + require.NoError(t, err) + rows := dbt.MustQuery("select * from t") + cli.CheckRows(t, rows, "1") + }, + ) +} + func (cli *TestServerClient) RunTestLoadData(t *testing.T, server *server.Server) { fp, err := os.CreateTemp("", "load_data_test.csv") require.NoError(t, err) @@ -2080,6 +2279,18 @@ func (cli *TestServerClient) RunTestMultiStatements(t *testing.T) { // the create table + drop table statements will return errors. dbt.MustExec("CREATE DATABASE multistmtuse") dbt.MustExec("use multistmtuse; create table if not exists t1 (id int); drop table t1;") + + // Test issue #50012 + dbt.MustExec("create database if not exists test;") + dbt.MustExec("use test;") + dbt.MustExec("CREATE TABLE t (a bigint(20), b int(10), PRIMARY KEY (b, a), UNIQUE KEY uk_a (a));") + dbt.MustExec("insert into t values (1, 1);") + dbt.MustExec("begin;") + rs := dbt.MustQuery("delete from t where a = 1; select 1;") + rs.Close() + rs = dbt.MustQuery("update t set b = 2 where a = 1; select 1;") + rs.Close() + dbt.MustExec("commit;") }) } @@ -2258,7 +2469,7 @@ func (cli *TestServerClient) getMetrics(t *testing.T) []byte { func getStmtCnt(content string) (stmtCnt map[string]int) { stmtCnt = make(map[string]int) - r := regexp.MustCompile("tidb_executor_statement_total{db=\"\",type=\"([A-Z|a-z|-]+)\"} (\\d+)") + r := regexp.MustCompile("tidb_executor_statement_total{db=\"\",resource_group=\".*\",type=\"([A-Z|a-z|-]+)\"} (\\d+)") matchResult := r.FindAllStringSubmatch(content, -1) for _, v := range matchResult { cnt, _ := strconv.Atoi(v[2]) @@ -2269,7 +2480,7 @@ func getStmtCnt(content string) (stmtCnt map[string]int) { func getDBStmtCnt(content, dbName string) (stmtCnt map[string]int) { stmtCnt = make(map[string]int) - r := regexp.MustCompile(fmt.Sprintf("tidb_executor_statement_total{db=\"%s\",type=\"([A-Z|a-z|-]+)\"} (\\d+)", dbName)) + r := regexp.MustCompile(fmt.Sprintf("tidb_executor_statement_total{db=\"%s\",resource_group=\".*\",type=\"([A-Z|a-z|-]+)\"} (\\d+)", dbName)) matchResult := r.FindAllStringSubmatch(content, -1) for _, v := range matchResult { cnt, _ := strconv.Atoi(v[2]) diff --git a/pkg/server/main_test.go b/pkg/server/main_test.go index 08e8e6a13ac56..68958c93b51af 100644 --- a/pkg/server/main_test.go +++ b/pkg/server/main_test.go @@ -63,6 +63,7 @@ func TestMain(m *testing.M) { opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("time.Sleep"), goleak.IgnoreTopFunction("database/sql.(*Tx).awaitDone"), diff --git a/pkg/server/metrics/BUILD.bazel b/pkg/server/metrics/BUILD.bazel index 7e84c7ec918d2..f3bb2fb5e6f03 100644 --- a/pkg/server/metrics/BUILD.bazel +++ b/pkg/server/metrics/BUILD.bazel @@ -6,6 +6,7 @@ go_library( importpath = "github.com/pingcap/tidb/pkg/server/metrics", visibility = ["//visibility:public"], deps = [ + "//pkg/domain/resourcegroup", "//pkg/metrics", "//pkg/parser/mysql", "@com_github_prometheus_client_golang//prometheus", diff --git a/pkg/server/metrics/metrics.go b/pkg/server/metrics/metrics.go index e3ca8eb9eb2d2..ee0567ca95973 100644 --- a/pkg/server/metrics/metrics.go +++ b/pkg/server/metrics/metrics.go @@ -15,6 +15,7 @@ package metrics import ( + "github.com/pingcap/tidb/pkg/domain/resourcegroup" "github.com/pingcap/tidb/pkg/metrics" "github.com/pingcap/tidb/pkg/parser/mysql" "github.com/prometheus/client_golang/prometheus" @@ -48,34 +49,34 @@ func init() { // InitMetricsVars init server metrics vars. func InitMetricsVars() { QueryTotalCountOk = []prometheus.Counter{ - mysql.ComSleep: metrics.QueryTotalCounter.WithLabelValues("Sleep", "OK"), - mysql.ComQuit: metrics.QueryTotalCounter.WithLabelValues("Quit", "OK"), - mysql.ComInitDB: metrics.QueryTotalCounter.WithLabelValues("InitDB", "OK"), - mysql.ComQuery: metrics.QueryTotalCounter.WithLabelValues("Query", "OK"), - mysql.ComPing: metrics.QueryTotalCounter.WithLabelValues("Ping", "OK"), - mysql.ComFieldList: metrics.QueryTotalCounter.WithLabelValues("FieldList", "OK"), - mysql.ComStmtPrepare: metrics.QueryTotalCounter.WithLabelValues("StmtPrepare", "OK"), - mysql.ComStmtExecute: metrics.QueryTotalCounter.WithLabelValues("StmtExecute", "OK"), - mysql.ComStmtFetch: metrics.QueryTotalCounter.WithLabelValues("StmtFetch", "OK"), - mysql.ComStmtClose: metrics.QueryTotalCounter.WithLabelValues("StmtClose", "OK"), - mysql.ComStmtSendLongData: metrics.QueryTotalCounter.WithLabelValues("StmtSendLongData", "OK"), - mysql.ComStmtReset: metrics.QueryTotalCounter.WithLabelValues("StmtReset", "OK"), - mysql.ComSetOption: metrics.QueryTotalCounter.WithLabelValues("SetOption", "OK"), + mysql.ComSleep: metrics.QueryTotalCounter.WithLabelValues("Sleep", "OK", resourcegroup.DefaultResourceGroupName), + mysql.ComQuit: metrics.QueryTotalCounter.WithLabelValues("Quit", "OK", resourcegroup.DefaultResourceGroupName), + mysql.ComInitDB: metrics.QueryTotalCounter.WithLabelValues("InitDB", "OK", resourcegroup.DefaultResourceGroupName), + mysql.ComQuery: metrics.QueryTotalCounter.WithLabelValues("Query", "OK", resourcegroup.DefaultResourceGroupName), + mysql.ComPing: metrics.QueryTotalCounter.WithLabelValues("Ping", "OK", resourcegroup.DefaultResourceGroupName), + mysql.ComFieldList: metrics.QueryTotalCounter.WithLabelValues("FieldList", "OK", resourcegroup.DefaultResourceGroupName), + mysql.ComStmtPrepare: metrics.QueryTotalCounter.WithLabelValues("StmtPrepare", "OK", resourcegroup.DefaultResourceGroupName), + mysql.ComStmtExecute: metrics.QueryTotalCounter.WithLabelValues("StmtExecute", "OK", resourcegroup.DefaultResourceGroupName), + mysql.ComStmtFetch: metrics.QueryTotalCounter.WithLabelValues("StmtFetch", "OK", resourcegroup.DefaultResourceGroupName), + mysql.ComStmtClose: metrics.QueryTotalCounter.WithLabelValues("StmtClose", "OK", resourcegroup.DefaultResourceGroupName), + mysql.ComStmtSendLongData: metrics.QueryTotalCounter.WithLabelValues("StmtSendLongData", "OK", resourcegroup.DefaultResourceGroupName), + mysql.ComStmtReset: metrics.QueryTotalCounter.WithLabelValues("StmtReset", "OK", resourcegroup.DefaultResourceGroupName), + mysql.ComSetOption: metrics.QueryTotalCounter.WithLabelValues("SetOption", "OK", resourcegroup.DefaultResourceGroupName), } QueryTotalCountErr = []prometheus.Counter{ - mysql.ComSleep: metrics.QueryTotalCounter.WithLabelValues("Sleep", "Error"), - mysql.ComQuit: metrics.QueryTotalCounter.WithLabelValues("Quit", "Error"), - mysql.ComInitDB: metrics.QueryTotalCounter.WithLabelValues("InitDB", "Error"), - mysql.ComQuery: metrics.QueryTotalCounter.WithLabelValues("Query", "Error"), - mysql.ComPing: metrics.QueryTotalCounter.WithLabelValues("Ping", "Error"), - mysql.ComFieldList: metrics.QueryTotalCounter.WithLabelValues("FieldList", "Error"), - mysql.ComStmtPrepare: metrics.QueryTotalCounter.WithLabelValues("StmtPrepare", "Error"), - mysql.ComStmtExecute: metrics.QueryTotalCounter.WithLabelValues("StmtExecute", "Error"), - mysql.ComStmtFetch: metrics.QueryTotalCounter.WithLabelValues("StmtFetch", "Error"), - mysql.ComStmtClose: metrics.QueryTotalCounter.WithLabelValues("StmtClose", "Error"), - mysql.ComStmtSendLongData: metrics.QueryTotalCounter.WithLabelValues("StmtSendLongData", "Error"), - mysql.ComStmtReset: metrics.QueryTotalCounter.WithLabelValues("StmtReset", "Error"), - mysql.ComSetOption: metrics.QueryTotalCounter.WithLabelValues("SetOption", "Error"), + mysql.ComSleep: metrics.QueryTotalCounter.WithLabelValues("Sleep", "Error", resourcegroup.DefaultResourceGroupName), + mysql.ComQuit: metrics.QueryTotalCounter.WithLabelValues("Quit", "Error", resourcegroup.DefaultResourceGroupName), + mysql.ComInitDB: metrics.QueryTotalCounter.WithLabelValues("InitDB", "Error", resourcegroup.DefaultResourceGroupName), + mysql.ComQuery: metrics.QueryTotalCounter.WithLabelValues("Query", "Error", resourcegroup.DefaultResourceGroupName), + mysql.ComPing: metrics.QueryTotalCounter.WithLabelValues("Ping", "Error", resourcegroup.DefaultResourceGroupName), + mysql.ComFieldList: metrics.QueryTotalCounter.WithLabelValues("FieldList", "Error", resourcegroup.DefaultResourceGroupName), + mysql.ComStmtPrepare: metrics.QueryTotalCounter.WithLabelValues("StmtPrepare", "Error", resourcegroup.DefaultResourceGroupName), + mysql.ComStmtExecute: metrics.QueryTotalCounter.WithLabelValues("StmtExecute", "Error", resourcegroup.DefaultResourceGroupName), + mysql.ComStmtFetch: metrics.QueryTotalCounter.WithLabelValues("StmtFetch", "Error", resourcegroup.DefaultResourceGroupName), + mysql.ComStmtClose: metrics.QueryTotalCounter.WithLabelValues("StmtClose", "Error", resourcegroup.DefaultResourceGroupName), + mysql.ComStmtSendLongData: metrics.QueryTotalCounter.WithLabelValues("StmtSendLongData", "Error", resourcegroup.DefaultResourceGroupName), + mysql.ComStmtReset: metrics.QueryTotalCounter.WithLabelValues("StmtReset", "Error", resourcegroup.DefaultResourceGroupName), + mysql.ComSetOption: metrics.QueryTotalCounter.WithLabelValues("SetOption", "Error", resourcegroup.DefaultResourceGroupName), } DisconnectNormal = metrics.DisconnectionCounter.WithLabelValues(metrics.LblOK) diff --git a/pkg/server/rpc_server.go b/pkg/server/rpc_server.go index 231a8ecc0fcef..9fa31d8a47854 100644 --- a/pkg/server/rpc_server.go +++ b/pkg/server/rpc_server.go @@ -18,6 +18,7 @@ import ( "context" "fmt" "net" + "strconv" "time" "github.com/pingcap/kvproto/pkg/coprocessor" @@ -240,6 +241,9 @@ func (s *rpcServer) createSession() (sessiontypes.Session, error) { action := &memory.PanicOnExceed{Killer: &vars.SQLKiller} vars.MemTracker.SetActionOnExceed(action) } + if err = vars.SetSystemVar(variable.MaxAllowedPacket, strconv.FormatUint(variable.DefMaxAllowedPacket, 10)); err != nil { + return nil, err + } se.SetSessionManager(s.sm) return se, nil } diff --git a/pkg/server/server.go b/pkg/server/server.go index b3c3d8037dfbf..3da19e48924ff 100644 --- a/pkg/server/server.go +++ b/pkg/server/server.go @@ -117,8 +117,9 @@ type Server struct { socket net.Listener concurrentLimiter *TokenLimiter - rwlock sync.RWMutex - clients map[uint64]*clientConn + rwlock sync.RWMutex + clients map[uint64]*clientConn + ConnNumByResourceGroup map[string]int capability uint32 dom *domain.Domain @@ -236,14 +237,15 @@ func (s *Server) newConn(conn net.Conn) *clientConn { // NewServer creates a new Server. func NewServer(cfg *config.Config, driver IDriver) (*Server, error) { s := &Server{ - cfg: cfg, - driver: driver, - concurrentLimiter: NewTokenLimiter(cfg.TokenLimit), - clients: make(map[uint64]*clientConn), - internalSessions: make(map[interface{}]struct{}, 100), - health: uatomic.NewBool(true), - inShutdownMode: uatomic.NewBool(false), - printMDLLogTime: time.Now(), + cfg: cfg, + driver: driver, + concurrentLimiter: NewTokenLimiter(cfg.TokenLimit), + clients: make(map[uint64]*clientConn), + ConnNumByResourceGroup: make(map[string]int), + internalSessions: make(map[interface{}]struct{}, 100), + health: uatomic.NewBool(true), + inShutdownMode: uatomic.NewBool(false), + printMDLLogTime: time.Now(), } s.capability = defaultCapability setTxnScope() @@ -594,17 +596,27 @@ func (s *Server) Close() { func (s *Server) registerConn(conn *clientConn) bool { s.rwlock.Lock() defer s.rwlock.Unlock() - connections := len(s.clients) + connections := make(map[string]int, 0) + for _, conn := range s.clients { + resourceGroup := conn.getCtx().GetSessionVars().ResourceGroupName + connections[resourceGroup]++ + } logger := logutil.BgLogger() if s.inShutdownMode.Load() { logger.Info("close connection directly when shutting down") - terror.Log(closeConn(conn, connections)) + for resourceGroupName, count := range s.ConnNumByResourceGroup { + metrics.ConnGauge.WithLabelValues(resourceGroupName).Set(float64(count)) + } + terror.Log(closeConn(conn, "", 0)) return false } s.clients[conn.connectionID] = conn - connections = len(s.clients) - metrics.ConnGauge.Set(float64(connections)) + s.ConnNumByResourceGroup[conn.getCtx().GetSessionVars().ResourceGroupName]++ + + for name, count := range s.ConnNumByResourceGroup { + metrics.ConnGauge.WithLabelValues(name).Set(float64(count)) + } return true } @@ -725,10 +737,6 @@ func (cc *clientConn) connectInfo() *variable.ConnectionInfo { connType = variable.ConnTypeTLS sslVersionNum := cc.tlsConn.ConnectionState().Version switch sslVersionNum { - case tls.VersionTLS10: - sslVersion = "TLSv1.0" - case tls.VersionTLS11: - sslVersion = "TLSv1.1" case tls.VersionTLS12: sslVersion = "TLSv1.2" case tls.VersionTLS13: diff --git a/pkg/server/testdata/optimizer_suite_out.json b/pkg/server/testdata/optimizer_suite_out.json index db4e392d330ee..90839db93dbd9 100644 --- a/pkg/server/testdata/optimizer_suite_out.json +++ b/pkg/server/testdata/optimizer_suite_out.json @@ -251,23 +251,21 @@ "Enable binding": true, "IsStmtNode": true, "Matched": true, - "Matched bindings": { - "Bindings": [ - { - "BindSQL": "SELECT * FROM `test`.`t` USE INDEX () WHERE `col1` = 100", - "Charset": "utf8mb4", - "Collation": "utf8mb4_bin", - "CreateTime": 0, - "PlanDigest": "", - "SQLDigest": "36ceb6159adb3ac83539ec90c861ac4be4bc5cdb5fa02f70542744a4af640eac", - "Source": "manual", - "Status": "enabled", - "UpdateTime": 0 - } - ], - "Db": "test", - "OriginalSQL": "select * from `test` . `t` where `col1` = ?" - }, + "Matched bindings": [ + { + "BindSQL": "SELECT * FROM `test`.`t` USE INDEX () WHERE `col1` = 100", + "Charset": "utf8mb4", + "Collation": "utf8mb4_bin", + "CreateTime": 0, + "Db": "test", + "OriginalSQL": "select * from `test` . `t` where `col1` = ?", + "PlanDigest": "", + "SQLDigest": "36ceb6159adb3ac83539ec90c861ac4be4bc5cdb5fa02f70542744a4af640eac", + "Source": "manual", + "Status": "enabled", + "UpdateTime": 0 + } + ], "Scope": "session", "Used binding": true }, diff --git a/pkg/server/tests/main_test.go b/pkg/server/tests/main_test.go index e757e293d04b4..c51be7e386488 100644 --- a/pkg/server/tests/main_test.go +++ b/pkg/server/tests/main_test.go @@ -56,6 +56,7 @@ func TestMain(m *testing.M) { opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("time.Sleep"), goleak.IgnoreTopFunction("database/sql.(*Tx).awaitDone"), diff --git a/pkg/server/tests/tidb_serial_test.go b/pkg/server/tests/tidb_serial_test.go index 8f7e263100528..132703e96fd18 100644 --- a/pkg/server/tests/tidb_serial_test.go +++ b/pkg/server/tests/tidb_serial_test.go @@ -70,6 +70,12 @@ func TestLoadData1(t *testing.T) { ts.RunTestLoadDataForSlowLog(t) } +func TestLoadDataInTransaction(t *testing.T) { + ts := createTidbTestSuite(t) + + ts.RunTestLoadDataInTransaction(t) +} + func TestConfigDefaultValue(t *testing.T) { ts := createTidbTestSuite(t) diff --git a/pkg/server/tests/tidb_test.go b/pkg/server/tests/tidb_test.go index 365fad6d60ecc..be866eb683ad1 100644 --- a/pkg/server/tests/tidb_test.go +++ b/pkg/server/tests/tidb_test.go @@ -31,6 +31,7 @@ import ( "net/http" "os" "path/filepath" + "runtime" "strings" "sync" "sync/atomic" @@ -2907,6 +2908,228 @@ func TestChunkReuseCorruptSysVarString(t *testing.T) { require.Equal(t, "Asia/Shanghai", rows[0]) } +func TestTiDBIdleTransactionTimeout(t *testing.T) { + ts := createTidbTestTopSQLSuite(t) + cases := []func(dbt *testkit.DBTestKit){} + // Test simple txn. + cases = append(cases, func(dbt *testkit.DBTestKit) { + dbt.MustExec("use test;") + dbt.MustExec("create table t1 (id int key);") + dbt.MustExec("set @@tidb_idle_transaction_timeout = 1") + tx, err := dbt.GetDB().Begin() + require.NoError(t, err) + rows, err := tx.Query("select * from t1;") + require.NoError(t, err) + ts.CheckRows(t, rows, "") + time.Sleep(1500 * time.Millisecond) + _, err = tx.Query("select * from t1;") + require.Error(t, err) + require.Equal(t, "invalid connection", err.Error()) + }) + // Test raw conn. + cases = append(cases, func(dbt *testkit.DBTestKit) { + ctx := context.Background() + dbt.MustExec("use test;") + dbt.MustExec("create table t2 (id int key);") + dbt.MustExec("set @@tidb_idle_transaction_timeout = 1") + conn, err := dbt.GetDB().Conn(ctx) + require.NoError(t, err) + _, err = conn.ExecContext(ctx, "begin") + require.NoError(t, err) + rows, err := conn.QueryContext(ctx, "select * from t2;") + require.NoError(t, err) + ts.CheckRows(t, rows, "") + time.Sleep(1500 * time.Millisecond) + _, err = conn.QueryContext(ctx, "select * from t2;") + require.Error(t, err) + require.Equal(t, "invalid connection", err.Error()) + }) + // Test txn write. + cases = append(cases, func(dbt *testkit.DBTestKit) { + dbt.MustExec("use test;") + dbt.MustExec("create table t3 (id int key);") + dbt.MustExec("set @@tidb_idle_transaction_timeout = 1") + tx, err := dbt.GetDB().Begin() + require.NoError(t, err) + _, err = tx.Exec("insert into t3 values (1)") + require.NoError(t, err) + time.Sleep(1500 * time.Millisecond) + _, err = tx.Exec("commit") + require.Error(t, err) + require.Equal(t, "invalid connection", err.Error()) + rows := dbt.MustQuery("select * from t3;") + ts.CheckRows(t, rows, "") + }) + // Test autocommit=0. + cases = append(cases, func(dbt *testkit.DBTestKit) { + dbt.MustExec("use test;") + dbt.MustExec("create table t4 (id int key);") + dbt.MustExec("set @@tidb_idle_transaction_timeout = 1") + ctx := context.Background() + conn, err := dbt.GetDB().Conn(ctx) + require.NoError(t, err) + _, err = conn.ExecContext(ctx, "set @@autocommit=0") + require.NoError(t, err) + _, err = conn.ExecContext(ctx, "insert into t4 values (1)") + require.NoError(t, err) + time.Sleep(1500 * time.Millisecond) + _, err = conn.ExecContext(ctx, "commit") + require.Error(t, err) + require.Equal(t, "invalid connection", err.Error()) + rows := dbt.MustQuery("select * from t4;") + ts.CheckRows(t, rows, "") + }) + // Test autocommit=1. + cases = append(cases, func(dbt *testkit.DBTestKit) { + dbt.MustExec("use test;") + dbt.MustExec("create table t5 (id int key);") + dbt.MustExec("set @@tidb_idle_transaction_timeout = 1") + ctx := context.Background() + conn, err := dbt.GetDB().Conn(ctx) + require.NoError(t, err) + _, err = conn.ExecContext(ctx, "set @@autocommit=1") + require.NoError(t, err) + _, err = conn.ExecContext(ctx, "insert into t5 values (1)") + require.NoError(t, err) + time.Sleep(1500 * time.Millisecond) + _, err = conn.ExecContext(ctx, "insert into t5 values (2)") + require.NoError(t, err) + rows := dbt.MustQuery("select * from t5;") + ts.CheckRows(t, rows, "1\n2") + }) + // Test sleep stmt in txn. + cases = append(cases, func(dbt *testkit.DBTestKit) { + dbt.MustExec("use test;") + dbt.MustExec("create table t6 (id int key);") + dbt.MustExec("set @@tidb_idle_transaction_timeout = 1") + tx, err := dbt.GetDB().Begin() + require.NoError(t, err) + _, err = tx.Exec("insert into t6 values (1)") + require.NoError(t, err) + rows, err := tx.Query("select sleep(1.5)") + require.NoError(t, err) + ts.CheckRows(t, rows, "0") + _, err = tx.Exec("commit") + require.NoError(t, err) + rows = dbt.MustQuery("select * from t6;") + ts.CheckRows(t, rows, "1") + }) + // Test sleep stmt in raw conn. + cases = append(cases, func(dbt *testkit.DBTestKit) { + dbt.MustExec("use test;") + dbt.MustExec("create table t7 (id int key);") + dbt.MustExec("set @@tidb_idle_transaction_timeout = 1") + ctx := context.Background() + conn, err := dbt.GetDB().Conn(ctx) + require.NoError(t, err) + _, err = conn.ExecContext(ctx, "begin") + require.NoError(t, err) + _, err = conn.ExecContext(ctx, "insert into t7 values (1)") + require.NoError(t, err) + rows, err := conn.QueryContext(ctx, "select sleep(1.5)") + require.NoError(t, err) + ts.CheckRows(t, rows, "0") + _, err = conn.ExecContext(ctx, "commit") + require.NoError(t, err) + rows = dbt.MustQuery("select * from t7;") + ts.CheckRows(t, rows, "1") + }) + // Test many sleep stmts in txn. + cases = append(cases, func(dbt *testkit.DBTestKit) { + dbt.MustExec("use test;") + dbt.MustExec("create table t8 (id int key);") + dbt.MustExec("set @@tidb_idle_transaction_timeout = 1") + tx, err := dbt.GetDB().Begin() + require.NoError(t, err) + _, err = tx.Exec("insert into t8 values (1)") + require.NoError(t, err) + rows, err := tx.Query("select sleep(0.5)") + require.NoError(t, err) + ts.CheckRows(t, rows, "0") + _, err = tx.Exec("insert into t8 values (2)") + require.NoError(t, err) + rows, err = tx.Query("select sleep(0.5)") + require.NoError(t, err) + ts.CheckRows(t, rows, "0") + _, err = tx.Exec("insert into t8 values (3)") + require.NoError(t, err) + rows, err = tx.Query("select sleep(0.5)") + require.NoError(t, err) + ts.CheckRows(t, rows, "0") + _, err = tx.Exec("commit") + require.NoError(t, err) + rows = dbt.MustQuery("select * from t8;") + ts.CheckRows(t, rows, "1\n2\n3") + }) + + var wg sync.WaitGroup + for _, ca := range cases { + wg.Add(1) + go func(fn func(dbt *testkit.DBTestKit)) { + defer wg.Done() + ts.RunTests(t, nil, fn) + }(ca) + } + // Test release lock. + wg.Add(2) + go func() { + defer wg.Done() + db1, err := sql.Open("mysql", ts.GetDSN(nil)) + require.NoError(t, err) + db2, err := sql.Open("mysql", ts.GetDSN(nil)) + require.NoError(t, err) + defer func() { + err := db1.Close() + require.NoError(t, err) + err = db2.Close() + require.NoError(t, err) + }() + ctx := context.Background() + conn1, err := db1.Conn(ctx) + require.NoError(t, err) + _, err = conn1.ExecContext(ctx, "create table t (id int key);") + require.NoError(t, err) + _, err = conn1.ExecContext(ctx, "set @@tidb_idle_transaction_timeout = 1") + require.NoError(t, err) + _, err = conn1.ExecContext(ctx, "insert into t values (1)") + require.NoError(t, err) + _, err = conn1.ExecContext(ctx, "begin") + require.NoError(t, err) + _, err = conn1.ExecContext(ctx, "select * from t for update") + require.NoError(t, err) + _, err = conn1.ExecContext(ctx, "insert into t values (2)") + require.NoError(t, err) + go func() { + defer wg.Done() + conn2, err := db2.Conn(ctx) + require.NoError(t, err) + _, err = conn2.ExecContext(ctx, "set @@tidb_idle_transaction_timeout = 1") + require.NoError(t, err) + _, err = conn2.ExecContext(ctx, "begin") + require.NoError(t, err) + _, err = conn2.ExecContext(ctx, "select * from t for update") + require.NoError(t, err) + _, err = conn2.ExecContext(ctx, "insert into t values (3)") + require.NoError(t, err) + _, err = conn2.ExecContext(ctx, "commit") + require.NoError(t, err) + rows, err := db2.QueryContext(ctx, "select * from t") + require.NoError(t, err) + ts.CheckRows(t, rows, "1\n3") + }() + time.Sleep(1500 * time.Millisecond) + _, err = conn1.ExecContext(ctx, "commit") + require.Error(t, err) + require.Equal(t, "invalid connection", err.Error()) + rows, err := db1.QueryContext(ctx, "select * from t where id=2") + require.NoError(t, err) + ts.CheckRows(t, rows, "") + }() + + // wait all test case finished. + wg.Wait() +} + type mockProxyProtocolProxy struct { frontend string backend string @@ -3127,3 +3350,65 @@ func TestProxyProtocolWithIpNoFallbackable(t *testing.T) { require.NotNil(t, err) db.Close() } + +func TestConnectionWillNotLeak(t *testing.T) { + cfg := util2.NewTestConfig() + cfg.Port = 0 + cfg.Status.ReportStatus = false + // Setup proxy protocol config + cfg.ProxyProtocol.Networks = "*" + cfg.ProxyProtocol.Fallbackable = false + + ts := createTidbTestSuite(t) + + cli := testserverclient.NewTestServerClient() + cli.Port = testutil.GetPortFromTCPAddr(ts.server.ListenAddr()) + dsn := cli.GetDSN(func(config *mysql.Config) { + config.User = "root" + config.DBName = "test" + }) + db, err := sql.Open("mysql", dsn) + require.Nil(t, err) + db.SetMaxOpenConns(100) + db.SetMaxIdleConns(0) + + // create 100 connections + conns := make([]*sql.Conn, 0, 100) + for len(conns) < 100 { + conn, err := db.Conn(context.Background()) + require.NoError(t, err) + conns = append(conns, conn) + } + require.Eventually(t, func() bool { + runtime.GC() + return server2.ConnectionInMemCounterForTest.Load() == int64(100) + }, time.Minute, time.Millisecond*100) + + // run a simple query on each connection and close it + // this cannot ensure the connection will not leak for any kinds of requests + var wg sync.WaitGroup + for _, conn := range conns { + wg.Add(1) + conn := conn + go func() { + rows, err := conn.QueryContext(context.Background(), "SELECT 2023") + require.NoError(t, err) + var result int + require.True(t, rows.Next()) + require.NoError(t, rows.Scan(&result)) + require.Equal(t, result, 2023) + require.NoError(t, rows.Close()) + // `db.Close` will not close already grabbed connection, so it's still needed to close the connection here. + require.NoError(t, conn.Close()) + wg.Done() + }() + } + wg.Wait() + + require.NoError(t, db.Close()) + require.Eventually(t, func() bool { + runtime.GC() + count := server2.ConnectionInMemCounterForTest.Load() + return count == 0 + }, time.Minute, time.Millisecond*100) +} diff --git a/pkg/session/BUILD.bazel b/pkg/session/BUILD.bazel index b4c484de4123f..806bd6f76bfd7 100644 --- a/pkg/session/BUILD.bazel +++ b/pkg/session/BUILD.bazel @@ -130,17 +130,19 @@ go_test( ], embed = [":session"], flaky = True, - race = "on", + race = "off", shard_count = 50, deps = [ "//pkg/autoid_service", "//pkg/bindinfo", "//pkg/config", + "//pkg/ddl", "//pkg/domain", "//pkg/executor", "//pkg/expression", "//pkg/kv", "//pkg/meta", + "//pkg/parser", "//pkg/parser/ast", "//pkg/parser/auth", "//pkg/session/types", @@ -157,6 +159,7 @@ go_test( "//pkg/util/chunk", "//pkg/util/logutil", "//pkg/util/sqlexec", + "@com_github_pingcap_failpoint//:failpoint", "@com_github_pingcap_log//:log", "@com_github_stretchr_testify//require", "@com_github_tikv_client_go_v2//tikv", diff --git a/pkg/session/bootstrap.go b/pkg/session/bootstrap.go index ba14a7828b1b5..66277ab97d327 100644 --- a/pkg/session/bootstrap.go +++ b/pkg/session/bootstrap.go @@ -460,19 +460,18 @@ const ( );` // CreateMDLView is a view about metadata locks. CreateMDLView = `CREATE OR REPLACE VIEW mysql.tidb_mdl_view as ( - SELECT job_id, - db_name, - table_name, - query, + SELECT tidb_mdl_info.job_id, + JSON_UNQUOTE(JSON_EXTRACT(cast(cast(job_meta as char) as json), "$.schema_name")) as db_name, + JSON_UNQUOTE(JSON_EXTRACT(cast(cast(job_meta as char) as json), "$.table_name")) as table_name, + JSON_UNQUOTE(JSON_EXTRACT(cast(cast(job_meta as char) as json), "$.query")) as query, session_id, - txnstart, + cluster_tidb_trx.start_time, tidb_decode_sql_digests(all_sql_digests, 4096) AS SQL_DIGESTS - FROM information_schema.ddl_jobs, - information_schema.cluster_tidb_trx, - information_schema.cluster_processlist - WHERE (ddl_jobs.state != 'synced' and ddl_jobs.state != 'cancelled') - AND Find_in_set(ddl_jobs.table_id, cluster_tidb_trx.related_table_ids) - AND cluster_tidb_trx.session_id = cluster_processlist.id + FROM mysql.tidb_ddl_job, + mysql.tidb_mdl_info, + information_schema.cluster_tidb_trx + WHERE tidb_ddl_job.job_id=tidb_mdl_info.job_id + AND CONCAT(',', tidb_mdl_info.table_ids, ',') REGEXP CONCAT(',', REPLACE(cluster_tidb_trx.related_table_ids, ',', '|'), ',') != 0 );` // CreatePlanReplayerStatusTable is a table about plan replayer status @@ -575,8 +574,11 @@ const ( type VARCHAR(256) NOT NULL, dispatcher_id VARCHAR(256), state VARCHAR(64) NOT NULL, + priority INT DEFAULT 1, + create_time TIMESTAMP, start_time TIMESTAMP, state_update_time TIMESTAMP, + end_time TIMESTAMP, meta LONGBLOB, concurrency INT(11), step INT(11), @@ -592,8 +594,11 @@ const ( type VARCHAR(256) NOT NULL, dispatcher_id VARCHAR(256), state VARCHAR(64) NOT NULL, + priority INT DEFAULT 1, + create_time TIMESTAMP, start_time TIMESTAMP, state_update_time TIMESTAMP, + end_time TIMESTAMP, meta LONGBLOB, concurrency INT(11), step INT(11), @@ -606,7 +611,9 @@ const ( CreateDistFrameworkMeta = `CREATE TABLE IF NOT EXISTS mysql.dist_framework_meta ( host VARCHAR(100) NOT NULL PRIMARY KEY, role VARCHAR(64), - keyspace_id bigint(8) NOT NULL DEFAULT -1);` + cpu_count int default 0, + keyspace_id bigint(8) NOT NULL DEFAULT -1 + );` // CreateLoadDataJobs is a table that LOAD DATA uses CreateLoadDataJobs = `CREATE TABLE IF NOT EXISTS mysql.load_data_jobs ( @@ -669,6 +676,16 @@ const ( done_time TIMESTAMP(6) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;` + // CreateRequestUnitByGroupTable stores the historical RU consumption by resource group. + CreateRequestUnitByGroupTable = `CREATE TABLE IF NOT EXISTS mysql.request_unit_by_group ( + start_time TIMESTAMP(6) NOT NULL, + end_time TIMESTAMP(6) NOT NULL, + resource_group VARCHAR(32) NOT null, + total_ru bigint(64) UNSIGNED NOT NULL, + PRIMARY KEY (start_time, end_time, resource_group), + KEY (resource_group) + );` + // CreateImportJobs is a table that IMPORT INTO uses. CreateImportJobs = `CREATE TABLE IF NOT EXISTS mysql.tidb_import_jobs ( id bigint(64) NOT NULL AUTO_INCREMENT, @@ -1023,14 +1040,34 @@ const ( // write mDDLTableVersion into `mysql.tidb` table version178 = 178 - // vresion 179 + // version 179 // enlarge `VARIABLE_VALUE` of `mysql.global_variables` from `varchar(1024)` to `varchar(16383)`. version179 = 179 + + // version 180 + // add priority/create_time/end_time to `mysql.tidb_global_task`/`mysql.tidb_global_task_history` + // add concurrency/create_time/end_time/digest to `mysql.tidb_background_subtask`/`mysql.tidb_background_subtask_history` + // add idx_exec_id(exec_id), uk_digest to `mysql.tidb_background_subtask` + // add cpu_count to mysql.dist_framework_meta + version180 = 180 + + // version 181 + // set tidb_txn_mode to Optimistic when tidb_txn_mode is not set. + version181 = 181 + + // version 182 + // add new system table `mysql.request_unit_by_group`, which is used for + // historical RU consumption by resource group per day. + version182 = 182 + + // version 183 + // replace `mysql.tidb_mdl_view` table + version183 = 183 ) // currentBootstrapVersion is defined as a variable, so we can modify its value for testing. // please make sure this is the largest version -var currentBootstrapVersion int64 = version179 +var currentBootstrapVersion int64 = version183 // DDL owner key's expired time is ManagerSessionTTL seconds, we should wait the time and give more time to have a chance to finish it. var internalSQLTimeout = owner.ManagerSessionTTL + 15 @@ -1185,6 +1222,10 @@ var ( upgradeToVer177, upgradeToVer178, upgradeToVer179, + upgradeToVer180, + upgradeToVer181, + upgradeToVer182, + upgradeToVer183, } ) @@ -2008,7 +2049,6 @@ func upgradeToVer67(s sessiontypes.Session, ver int64) { return } bindMap := make(map[string]bindInfo) - h := &bindinfo.BindHandle{} var err error mustExecute(s, "BEGIN PESSIMISTIC") @@ -2020,7 +2060,7 @@ func upgradeToVer67(s sessiontypes.Session, ver int64) { mustExecute(s, "COMMIT") }() - mustExecute(s, h.LockBindInfoSQL()) + mustExecute(s, bindinfo.LockBindInfoSQL) ctx := kv.WithInternalSourceType(context.Background(), kv.InternalTxnBootstrap) var rs sqlexec.RecordSet rs, err = s.ExecuteInternal(ctx, @@ -2816,6 +2856,7 @@ func upgradeToVer175(s sessiontypes.Session, ver int64) { return } req := rs.NewChunk(nil) + updateStmts := make([]string, 0, 4) for { err = rs.Next(ctx, req) if err != nil { @@ -2832,13 +2873,18 @@ func upgradeToVer175(s sessiontypes.Session, ver int64) { if originalNormalizedSQL == newNormalizedSQL { continue // no need to update } - mustExecute(s, fmt.Sprintf("UPDATE mysql.bind_info SET original_sql='%s' WHERE original_sql='%s'", newNormalizedSQL, originalNormalizedSQL)) + // must run those update statements outside this loop, otherwise may cause some concurrency problems, + // since the current statement over this session has not been finished yet. + updateStmts = append(updateStmts, fmt.Sprintf("UPDATE mysql.bind_info SET original_sql='%s' WHERE original_sql='%s'", newNormalizedSQL, originalNormalizedSQL)) } req.Reset() } if err := rs.Close(); err != nil { logutil.BgLogger().Fatal("upgradeToVer175 error", zap.Error(err)) } + for _, updateStmt := range updateStmts { + mustExecute(s, updateStmt) + } } func upgradeToVer176(s sessiontypes.Session, ver int64) { @@ -2893,6 +2939,56 @@ func upgradeToVer179(s sessiontypes.Session, ver int64) { doReentrantDDL(s, "ALTER TABLE mysql.global_variables MODIFY COLUMN `VARIABLE_VALUE` varchar(16383)") } +func upgradeToVer180(s sessiontypes.Session, ver int64) { + if ver >= version180 { + return + } + doReentrantDDL(s, "ALTER TABLE mysql.tidb_global_task ADD COLUMN `priority` INT DEFAULT 1 AFTER `state`", infoschema.ErrColumnExists) + doReentrantDDL(s, "ALTER TABLE mysql.tidb_global_task ADD COLUMN `create_time` TIMESTAMP AFTER `priority`", infoschema.ErrColumnExists) + doReentrantDDL(s, "ALTER TABLE mysql.tidb_global_task ADD COLUMN `end_time` TIMESTAMP AFTER `state_update_time`", infoschema.ErrColumnExists) + doReentrantDDL(s, "ALTER TABLE mysql.tidb_global_task_history ADD COLUMN `priority` INT DEFAULT 1 AFTER `state`", infoschema.ErrColumnExists) + doReentrantDDL(s, "ALTER TABLE mysql.tidb_global_task_history ADD COLUMN `create_time` TIMESTAMP AFTER `priority`", infoschema.ErrColumnExists) + doReentrantDDL(s, "ALTER TABLE mysql.tidb_global_task_history ADD COLUMN `end_time` TIMESTAMP AFTER `state_update_time`", infoschema.ErrColumnExists) + + doReentrantDDL(s, "ALTER TABLE mysql.tidb_background_subtask ADD COLUMN `concurrency` INT AFTER `checkpoint`", infoschema.ErrColumnExists) + doReentrantDDL(s, "ALTER TABLE mysql.tidb_background_subtask ADD COLUMN `create_time` TIMESTAMP AFTER `concurrency`", infoschema.ErrColumnExists) + doReentrantDDL(s, "ALTER TABLE mysql.tidb_background_subtask ADD COLUMN `end_time` TIMESTAMP AFTER `state_update_time`", infoschema.ErrColumnExists) + doReentrantDDL(s, "ALTER TABLE mysql.tidb_background_subtask ADD COLUMN `ordinal` int AFTER `meta`", infoschema.ErrColumnExists) + doReentrantDDL(s, "ALTER TABLE mysql.tidb_background_subtask_history ADD COLUMN `concurrency` INT AFTER `checkpoint`", infoschema.ErrColumnExists) + doReentrantDDL(s, "ALTER TABLE mysql.tidb_background_subtask_history ADD COLUMN `create_time` TIMESTAMP AFTER `concurrency`", infoschema.ErrColumnExists) + doReentrantDDL(s, "ALTER TABLE mysql.tidb_background_subtask_history ADD COLUMN `end_time` TIMESTAMP AFTER `state_update_time`", infoschema.ErrColumnExists) + doReentrantDDL(s, "ALTER TABLE mysql.tidb_background_subtask_history ADD COLUMN `ordinal` int AFTER `meta`", infoschema.ErrColumnExists) + + doReentrantDDL(s, "ALTER TABLE mysql.tidb_background_subtask ADD INDEX idx_exec_id(exec_id)", dbterror.ErrDupKeyName) + doReentrantDDL(s, "ALTER TABLE mysql.tidb_background_subtask ADD UNIQUE INDEX uk_task_key_step_ordinal(task_key, step, ordinal)", dbterror.ErrDupKeyName) + + doReentrantDDL(s, "ALTER TABLE mysql.dist_framework_meta ADD COLUMN `cpu_count` INT DEFAULT 0 AFTER `role`", infoschema.ErrColumnExists) +} + +func upgradeToVer181(s sessiontypes.Session, ver int64) { + if ver >= version181 { + return + } + sql := fmt.Sprintf("INSERT HIGH_PRIORITY IGNORE INTO %s.%s VALUES('%s', '%s')", + mysql.SystemDB, mysql.GlobalVariablesTable, + variable.TiDBTxnMode, variable.OptimisticTxnMode) + mustExecute(s, sql) +} + +func upgradeToVer182(s sessiontypes.Session, ver int64) { + if ver >= version182 { + return + } + doReentrantDDL(s, CreateRequestUnitByGroupTable) +} + +func upgradeToVer183(s sessiontypes.Session, ver int64) { + if ver >= version183 { + return + } + doReentrantDDL(s, CreateMDLView) +} + func writeOOMAction(s sessiontypes.Session) { comment := "oom-action is `log` by default in v3.0.x, `cancel` by default in v4.0.11+" mustExecute(s, `INSERT HIGH_PRIORITY INTO %n.%n VALUES (%?, %?, %?) ON DUPLICATE KEY UPDATE VARIABLE_VALUE= %?`, @@ -3022,6 +3118,8 @@ func doDDLWorks(s sessiontypes.Session) { mustExecute(s, CreateDoneRunawayWatchTable) // create dist_framework_meta mustExecute(s, CreateDistFrameworkMeta) + // create request_unit_by_group + mustExecute(s, CreateRequestUnitByGroupTable) } // doBootstrapSQLFile executes SQL commands in a file as the last stage of bootstrap. @@ -3096,37 +3194,7 @@ func doDMLWorks(s sessiontypes.Session) { if !v.HasGlobalScope() { continue } - vVal := v.Value - switch v.Name { - case variable.TiDBTxnMode: - if config.GetGlobalConfig().Store == "tikv" || config.GetGlobalConfig().Store == "unistore" { - vVal = "pessimistic" - } - case variable.TiDBEnableAsyncCommit, variable.TiDBEnable1PC: - if config.GetGlobalConfig().Store == "tikv" { - vVal = variable.On - } - case variable.TiDBMemOOMAction: - if intest.InTest { - vVal = variable.OOMActionLog - } - case variable.TiDBEnableAutoAnalyze: - if intest.InTest { - vVal = variable.Off - } - // For the following sysvars, we change the default - // FOR NEW INSTALLS ONLY. In most cases you don't want to do this. - // It is better to change the value in the Sysvar struct, so that - // all installs will have the same value. - case variable.TiDBRowFormatVersion: - vVal = strconv.Itoa(variable.DefTiDBRowFormatV2) - case variable.TiDBTxnAssertionLevel: - vVal = variable.AssertionFastStr - case variable.TiDBEnableMutationChecker: - vVal = variable.On - case variable.TiDBPessimisticTransactionFairLocking: - vVal = variable.On - } + vVal := variable.GlobalSystemVariableInitialValue(v.Name, v.Value) // sanitize k and vVal value := fmt.Sprintf(`("%s", "%s")`, sqlescape.EscapeString(k), sqlescape.EscapeString(vVal)) diff --git a/pkg/session/bootstrap_test.go b/pkg/session/bootstrap_test.go index a5fb48a4e823f..39d5399dbb019 100644 --- a/pkg/session/bootstrap_test.go +++ b/pkg/session/bootstrap_test.go @@ -18,12 +18,16 @@ import ( "context" "fmt" "sort" + "strings" "testing" "time" + "github.com/pingcap/failpoint" "github.com/pingcap/tidb/pkg/bindinfo" + "github.com/pingcap/tidb/pkg/ddl" "github.com/pingcap/tidb/pkg/domain" "github.com/pingcap/tidb/pkg/meta" + "github.com/pingcap/tidb/pkg/parser" "github.com/pingcap/tidb/pkg/parser/auth" sessiontypes "github.com/pingcap/tidb/pkg/session/types" "github.com/pingcap/tidb/pkg/sessionctx" @@ -134,7 +138,7 @@ func globalVarsCount() int64 { // We should make sure that the following session could finish the bootstrap process. func TestBootstrapWithError(t *testing.T) { ctx := context.Background() - store, err := mockstore.NewMockStore() + store, err := mockstore.NewMockStore(mockstore.WithStoreType(mockstore.EmbedUnistore)) require.NoError(t, err) defer func() { require.NoError(t, store.Close()) @@ -331,6 +335,19 @@ func TestUpgrade(t *testing.T) { require.Equal(t, 1, req.NumRows()) require.Equal(t, "False", req.GetRow(0).GetString(0)) require.NoError(t, r.Close()) + + r = MustExecToRecodeSet(t, se2, "admin show ddl jobs 1000;") + req = r.NewChunk(nil) + err = r.Next(ctx, req) + require.NoError(t, err) + rowCnt := req.NumRows() + for i := 0; i < rowCnt; i++ { + jobType := req.GetRow(i).GetString(3) // get job type. + // Should not use multi-schema change in bootstrap DDL because the job arguments may be changed. + require.False(t, strings.Contains(jobType, "multi-schema")) + } + require.NoError(t, r.Close()) + dom.Close() } @@ -515,83 +532,6 @@ func TestStmtSummary(t *testing.T) { require.NoError(t, r.Close()) } -type bindTestStruct struct { - originText string - bindText string - db string - originWithDB string - bindWithDB string - deleteText string -} - -func TestUpdateBindInfo(t *testing.T) { - bindCases := []bindTestStruct{ - { - originText: "select * from t where a > ?", - bindText: "select /*+ use_index(t, idxb) */ * from t where a > 1", - db: "test", - originWithDB: "select * from `test` . `t` where `a` > ?", - bindWithDB: "SELECT /*+ use_index(`t` `idxb`)*/ * FROM `test`.`t` WHERE `a` > 1", - deleteText: "select * from test.t where a > 1", - }, - { - originText: "select count ( ? ), max ( a ) from t group by b", - bindText: "select /*+ use_index(t, idx) */ count(1), max(a) from t group by b", - db: "test", - originWithDB: "select count ( ? ) , max ( `a` ) from `test` . `t` group by `b`", - bindWithDB: "SELECT /*+ use_index(`t` `idx`)*/ count(1),max(`a`) FROM `test`.`t` GROUP BY `b`", - deleteText: "select count(1), max(a) from test.t group by b", - }, - { - originText: "select * from `test` . `t` where `a` = (_charset) ?", - bindText: "SELECT * FROM test.t WHERE a = _utf8\\'ab\\'", - db: "test", - originWithDB: "select * from `test` . `t` where `a` = ?", - bindWithDB: "SELECT * FROM `test`.`t` WHERE `a` = 'ab'", - deleteText: "select * from test.t where a = 'c'", - }, - } - - ctx := context.Background() - store, dom := CreateStoreAndBootstrap(t) - defer func() { require.NoError(t, store.Close()) }() - defer dom.Close() - se := CreateSessionAndSetID(t, store) - - MustExec(t, se, "alter table mysql.bind_info drop column if exists plan_digest") - MustExec(t, se, "alter table mysql.bind_info drop column if exists sql_digest") - for _, bindCase := range bindCases { - sql := fmt.Sprintf("insert into mysql.bind_info values('%s', '%s', '%s', 'enabled', '2021-01-04 14:50:58.257', '2021-01-04 14:50:58.257', 'utf8', 'utf8_general_ci', 'manual')", - bindCase.originText, - bindCase.bindText, - bindCase.db, - ) - MustExec(t, se, sql) - - upgradeToVer67(se, version66) - r := MustExecToRecodeSet(t, se, `select original_sql, bind_sql, default_db, status from mysql.bind_info where source != 'builtin'`) - req := r.NewChunk(nil) - require.NoError(t, r.Next(ctx, req)) - row := req.GetRow(0) - require.Equal(t, bindCase.originWithDB, row.GetString(0)) - require.Equal(t, bindCase.bindWithDB, row.GetString(1)) - require.Equal(t, "", row.GetString(2)) - require.Equal(t, bindinfo.Enabled, row.GetString(3)) - require.NoError(t, r.Close()) - sql = fmt.Sprintf("drop global binding for %s", bindCase.deleteText) - MustExec(t, se, sql) - r = MustExecToRecodeSet(t, se, `select original_sql, bind_sql, status from mysql.bind_info where source != 'builtin'`) - require.NoError(t, r.Next(ctx, req)) - row = req.GetRow(0) - require.Equal(t, bindCase.originWithDB, row.GetString(0)) - require.Equal(t, bindCase.bindWithDB, row.GetString(1)) - require.Equal(t, "deleted", row.GetString(2)) - require.NoError(t, r.Close()) - sql = fmt.Sprintf("delete from mysql.bind_info where original_sql = '%s'", bindCase.originWithDB) - MustExec(t, se, sql) - } -} - func TestUpdateDuplicateBindInfo(t *testing.T) { ctx := context.Background() store, dom := CreateStoreAndBootstrap(t) @@ -778,7 +718,7 @@ func TestAnalyzeVersionUpgradeFrom300To500(t *testing.T) { } func TestIndexMergeInNewCluster(t *testing.T) { - store, err := mockstore.NewMockStore() + store, err := mockstore.NewMockStore(mockstore.WithStoreType(mockstore.EmbedUnistore)) require.NoError(t, err) // Indicates we are in a new cluster. require.Equal(t, int64(notBootstrapped), getStoreBootstrapVersion(store)) @@ -1098,7 +1038,7 @@ func TestTiDBOptAdvancedJoinHintWhenUpgrading(t *testing.T) { } func TestTiDBOptAdvancedJoinHintInNewCluster(t *testing.T) { - store, err := mockstore.NewMockStore() + store, err := mockstore.NewMockStore(mockstore.WithStoreType(mockstore.EmbedUnistore)) require.NoError(t, err) // Indicates we are in a new cluster. require.Equal(t, int64(notBootstrapped), getStoreBootstrapVersion(store)) @@ -1124,7 +1064,7 @@ func TestTiDBOptAdvancedJoinHintInNewCluster(t *testing.T) { } func TestTiDBCostModelInNewCluster(t *testing.T) { - store, err := mockstore.NewMockStore() + store, err := mockstore.NewMockStore(mockstore.WithStoreType(mockstore.EmbedUnistore)) require.NoError(t, err) // Indicates we are in a new cluster. require.Equal(t, int64(notBootstrapped), getStoreBootstrapVersion(store)) @@ -1582,10 +1522,18 @@ func TestTiDBUpgradeToVer136(t *testing.T) { require.NoError(t, err) require.Equal(t, int64(ver135), ver) + MustExec(t, seV135, "ALTER TABLE mysql.tidb_background_subtask DROP INDEX idx_task_key;") + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/ddl/reorgMetaRecordFastReorgDisabled", `return`)) + t.Cleanup(func() { + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/ddl/reorgMetaRecordFastReorgDisabled")) + }) + MustExec(t, seV135, "set global tidb_ddl_enable_fast_reorg = 1") dom, err := BootstrapSession(store) require.NoError(t, err) ver, err = getBootstrapVersion(seV135) require.NoError(t, err) + require.True(t, ddl.LastReorgMetaFastReorgDisabled) + require.Less(t, int64(ver135), ver) dom.Close() } @@ -2007,9 +1955,12 @@ func TestTiDBBindingInListToVer175(t *testing.T) { // create some bindings at version174 MustExec(t, seV174, "use test") MustExec(t, seV174, "create table t (a int, b int, c int, key(c))") - MustExec(t, seV174, "insert into mysql.bind_info values ('select * from `test` . `t` where `a` in ( ... )', 'SELECT /*+ use_index(`t` `c`)*/ * FROM `test`.`t` WHERE `a` IN (1,2,3)', 'test', 'enabled', '2023-09-13 14:41:38.319', '2023-09-13 14:41:35.319', 'utf8', 'utf8_general_ci', 'manual', '', '')") - MustExec(t, seV174, "insert into mysql.bind_info values ('select * from `test` . `t` where `a` in ( ? )', 'SELECT /*+ use_index(`t` `c`)*/ * FROM `test`.`t` WHERE `a` IN (1)', 'test', 'enabled', '2023-09-13 14:41:38.319', '2023-09-13 14:41:36.319', 'utf8', 'utf8_general_ci', 'manual', '', '')") - MustExec(t, seV174, "insert into mysql.bind_info values ('select * from `test` . `t` where `a` in ( ? ) and `b` in ( ... )', 'SELECT /*+ use_index(`t` `c`)*/ * FROM `test`.`t` WHERE `a` IN (1) AND `b` IN (1,2,3)', 'test', 'enabled', '2023-09-13 14:41:37.319', '2023-09-13 14:41:38.319', 'utf8', 'utf8_general_ci', 'manual', '', '')") + _, digest := parser.NormalizeDigestForBinding("SELECT * FROM `test`.`t` WHERE `a` IN (1,2,3)") + MustExec(t, seV174, fmt.Sprintf("insert into mysql.bind_info values ('select * from `test` . `t` where `a` in ( ... )', 'SELECT /*+ use_index(`t` `c`)*/ * FROM `test`.`t` WHERE `a` IN (1,2,3)', 'test', 'enabled', '2023-09-13 14:41:38.319', '2023-09-13 14:41:35.319', 'utf8', 'utf8_general_ci', 'manual', '%s', '')", digest.String())) + _, digest = parser.NormalizeDigestForBinding("SELECT * FROM `test`.`t` WHERE `a` IN (1)") + MustExec(t, seV174, fmt.Sprintf("insert into mysql.bind_info values ('select * from `test` . `t` where `a` in ( ? )', 'SELECT /*+ use_index(`t` `c`)*/ * FROM `test`.`t` WHERE `a` IN (1)', 'test', 'enabled', '2023-09-13 14:41:38.319', '2023-09-13 14:41:36.319', 'utf8', 'utf8_general_ci', 'manual', '%s', '')", digest.String())) + _, digest = parser.NormalizeDigestForBinding("SELECT * FROM `test`.`t` WHERE `a` IN (1) AND `b` IN (1,2,3)") + MustExec(t, seV174, fmt.Sprintf("insert into mysql.bind_info values ('select * from `test` . `t` where `a` in ( ? ) and `b` in ( ... )', 'SELECT /*+ use_index(`t` `c`)*/ * FROM `test`.`t` WHERE `a` IN (1) AND `b` IN (1,2,3)', 'test', 'enabled', '2023-09-13 14:41:37.319', '2023-09-13 14:41:38.319', 'utf8', 'utf8_general_ci', 'manual', '%s', '')", digest.String())) showBindings := func(s sessiontypes.Session) (records []string) { MustExec(t, s, "admin reload bindings") diff --git a/pkg/session/bootstraptest/bootstrap_upgrade_test.go b/pkg/session/bootstraptest/bootstrap_upgrade_test.go index fbe12509b94c1..1e7983f09edff 100644 --- a/pkg/session/bootstraptest/bootstrap_upgrade_test.go +++ b/pkg/session/bootstraptest/bootstrap_upgrade_test.go @@ -554,24 +554,6 @@ func TestUpgradeVersionForResumeJob(t *testing.T) { ch := make(chan struct{}) hook := &callback.TestDDLCallback{} var jobID int64 - doOnce := true - hook.OnGetJobBeforeExported = func(str string) { - if jobID == 0 || !doOnce { - return - } - - for i := 0; i < 50; i++ { - sql := fmt.Sprintf("admin show ddl jobs where job_id=%d or job_id=%d", jobID, jobID+1) - se := session.CreateSessionAndSetID(t, store) - rows, err := execute(context.Background(), se, sql) - require.NoError(t, err) - if len(rows) == 2 { - doOnce = false - break - } - time.Sleep(100 * time.Millisecond) - } - } wg := sync.WaitGroup{} wg.Add(1) times := 0 diff --git a/pkg/session/bootstraptest/main_test.go b/pkg/session/bootstraptest/main_test.go index 3b96891b56af6..4752c373a6e23 100644 --- a/pkg/session/bootstraptest/main_test.go +++ b/pkg/session/bootstraptest/main_test.go @@ -40,8 +40,9 @@ func TestMain(m *testing.M) { opts := []goleak.Option{ // TODO: figure the reason and shorten this list goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), - goleak.IgnoreTopFunction("github.com/tikv/client-go/v2/internal/retry.newBackoffFn.func1"), + goleak.IgnoreTopFunction("github.com/tikv/client-go/v2/config/retry.newBackoffFn.func1"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/v3.waitRetryBackoff"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), diff --git a/pkg/session/clusteredindextest/main_test.go b/pkg/session/clusteredindextest/main_test.go index 8cb8bd03d5f15..f0e01898ea125 100644 --- a/pkg/session/clusteredindextest/main_test.go +++ b/pkg/session/clusteredindextest/main_test.go @@ -43,8 +43,9 @@ func TestMain(m *testing.M) { opts := []goleak.Option{ // TODO: figure the reason and shorten this list goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), - goleak.IgnoreTopFunction("github.com/tikv/client-go/v2/internal/retry.newBackoffFn.func1"), + goleak.IgnoreTopFunction("github.com/tikv/client-go/v2/config/retry.newBackoffFn.func1"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/v3.waitRetryBackoff"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), diff --git a/pkg/session/main_test.go b/pkg/session/main_test.go index 24e62127f0e75..8a24651b00c7b 100644 --- a/pkg/session/main_test.go +++ b/pkg/session/main_test.go @@ -45,8 +45,9 @@ func TestMain(m *testing.M) { opts := []goleak.Option{ // TODO: figure the reason and shorten this list goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), - goleak.IgnoreTopFunction("github.com/tikv/client-go/v2/internal/retry.newBackoffFn.func1"), + goleak.IgnoreTopFunction("github.com/tikv/client-go/v2/config/retry.newBackoffFn.func1"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/v3.waitRetryBackoff"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), diff --git a/pkg/session/mock_bootstrap.go b/pkg/session/mock_bootstrap.go index 9a200b6518a29..d10c0dc888481 100644 --- a/pkg/session/mock_bootstrap.go +++ b/pkg/session/mock_bootstrap.go @@ -66,8 +66,9 @@ var allDDLs = []string{ "alter table mock_sys_t alter index idx_v invisible", "alter table mock_sys_partition add partition (partition p6 values less than (8192))", "alter table mock_sys_partition drop partition p6", - "alter table mock_sys_t add index mul_idx1(c1), add index mul_idx2(c1)", - "alter table mock_sys_t drop index mul_idx1, drop index mul_idx2", + // Should not use multi-schema change to add index in bootstrap DDL. + // "alter table mock_sys_t add index mul_idx1(c1), add index mul_idx2(c1)", + // "alter table mock_sys_t drop index mul_idx1, drop index mul_idx2", // TODO: Support check the DB for ActionAlterPlacementPolicy. // "alter database mock_sys_db_placement placement policy = 'alter_x'", "alter table mock_sys_t add index rename_idx1(c1)", diff --git a/pkg/session/nontransactionaltest/main_test.go b/pkg/session/nontransactionaltest/main_test.go index b7eb2b041b8b5..be4f11d5a13b2 100644 --- a/pkg/session/nontransactionaltest/main_test.go +++ b/pkg/session/nontransactionaltest/main_test.go @@ -40,8 +40,9 @@ func TestMain(m *testing.M) { opts := []goleak.Option{ // TODO: figure the reason and shorten this list goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), - goleak.IgnoreTopFunction("github.com/tikv/client-go/v2/internal/retry.newBackoffFn.func1"), + goleak.IgnoreTopFunction("github.com/tikv/client-go/v2/config/retry.newBackoffFn.func1"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/v3.waitRetryBackoff"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), diff --git a/pkg/session/schematest/main_test.go b/pkg/session/schematest/main_test.go index eed409eeab44b..92c0ad6417082 100644 --- a/pkg/session/schematest/main_test.go +++ b/pkg/session/schematest/main_test.go @@ -40,8 +40,9 @@ func TestMain(m *testing.M) { opts := []goleak.Option{ // TODO: figure the reason and shorten this list goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), - goleak.IgnoreTopFunction("github.com/tikv/client-go/v2/internal/retry.newBackoffFn.func1"), + goleak.IgnoreTopFunction("github.com/tikv/client-go/v2/config/retry.newBackoffFn.func1"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/v3.waitRetryBackoff"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), diff --git a/pkg/session/session.go b/pkg/session/session.go index 5fcac90030187..6da9d88672676 100644 --- a/pkg/session/session.go +++ b/pkg/session/session.go @@ -296,7 +296,7 @@ func (s *session) cleanRetryInfo() { if ok { preparedAst = preparedObj.PreparedAst stmtText, stmtDB = preparedObj.StmtText, preparedObj.StmtDB - bindSQL, _ := plannercore.GetBindSQL4PlanCache(s, preparedObj) + bindSQL, _ := bindinfo.MatchSQLBindingForPlanCache(s, preparedObj.PreparedAst.Stmt, &preparedObj.BindingInfo) cacheKey, err = plannercore.NewPlanCacheKey(s.sessionVars, stmtText, stmtDB, preparedAst.SchemaVersion, 0, bindSQL, expression.ExprPushDownBlackListReloadTimeStamp.Load()) if err != nil { @@ -507,7 +507,7 @@ func (s *session) doCommit(ctx context.Context) error { return nil } // check if the cluster is read-only - if !s.sessionVars.InRestrictedSQL && variable.RestrictedReadOnly.Load() || variable.VarTiDBSuperReadOnly.Load() { + if !s.sessionVars.InRestrictedSQL && (variable.RestrictedReadOnly.Load() || variable.VarTiDBSuperReadOnly.Load()) { // It is not internal SQL, and the cluster has one of RestrictedReadOnly or SuperReadOnly // We need to privilege check again: a privilege check occurred during planning, but we need // to prevent the case that a long running auto-commit statement is now trying to commit. @@ -1092,21 +1092,32 @@ func (*session) isTxnRetryableError(err error) bool { return kv.IsTxnRetryableError(err) || domain.ErrInfoSchemaChanged.Equal(err) } +func isEndTxnStmt(stmt ast.StmtNode, vars *variable.SessionVars) (bool, error) { + switch n := stmt.(type) { + case *ast.RollbackStmt, *ast.CommitStmt: + return true, nil + case *ast.ExecuteStmt: + ps, err := plannercore.GetPreparedStmt(n, vars) + if err != nil { + return false, err + } + return isEndTxnStmt(ps.PreparedAst.Stmt, vars) + } + return false, nil +} + func (s *session) checkTxnAborted(stmt sqlexec.Statement) error { - var err error if atomic.LoadUint32(&s.GetSessionVars().TxnCtx.LockExpire) == 0 { return nil } - err = kv.ErrLockExpire // If the transaction is aborted, the following statements do not need to execute, except `commit` and `rollback`, // because they are used to finish the aborted transaction. - if _, ok := stmt.(*executor.ExecStmt).StmtNode.(*ast.CommitStmt); ok { - return nil - } - if _, ok := stmt.(*executor.ExecStmt).StmtNode.(*ast.RollbackStmt); ok { + if ok, err := isEndTxnStmt(stmt.(*executor.ExecStmt).StmtNode, s.sessionVars); err == nil && ok { return nil + } else if err != nil { + return err } - return err + return kv.ErrLockExpire } func (s *session) retry(ctx context.Context, maxCnt uint) (err error) { @@ -1146,6 +1157,7 @@ func (s *session) retry(ctx context.Context, maxCnt uint) (err error) { for i, sr := range nh.history { st := sr.st s.sessionVars.StmtCtx = sr.stmtCtx + s.sessionVars.StmtCtx.CTEStorageMap = map[int]*executor.CTEStorages{} s.sessionVars.StmtCtx.ResetForRetry() s.sessionVars.PlanCacheParams.Reset() schemaVersion, err = st.RebuildPlan(ctx) @@ -1512,7 +1524,7 @@ func (s *session) SetProcessInfo(sql string, t time.Time, command byte, maxExecu IndexNames: s.sessionVars.StmtCtx.IndexNames, MaxExecutionTime: maxExecutionTime, RedactSQL: s.sessionVars.EnableRedactLog, - ResourceGroupName: s.sessionVars.ResourceGroupName, + ResourceGroupName: s.sessionVars.StmtCtx.ResourceGroupName, SessionAlias: s.sessionVars.SessionAlias, } oldPi := s.ShowProcess() @@ -1862,6 +1874,7 @@ func (s *session) ExecRestrictedStmt(ctx context.Context, stmtNode ast.StmtNode, metrics.SessionRestrictedSQLCounter.Inc() ctx = context.WithValue(ctx, execdetails.StmtExecDetailKey, &execdetails.StmtExecDetails{}) ctx = context.WithValue(ctx, tikvutil.ExecDetailsKey, &tikvutil.ExecDetails{}) + ctx = context.WithValue(ctx, tikvutil.RUDetailsCtxKey, tikvutil.NewRUDetails()) rs, err := se.ExecuteStmt(ctx, stmtNode) if err != nil { se.sessionVars.StmtCtx.AppendError(err) @@ -1882,7 +1895,7 @@ func (s *session) ExecRestrictedStmt(ctx context.Context, stmtNode ast.StmtNode, vars := se.GetSessionVars() for _, dbName := range GetDBNames(vars) { - metrics.QueryDurationHistogram.WithLabelValues(metrics.LblInternal, dbName, vars.ResourceGroupName).Observe(time.Since(startTime).Seconds()) + metrics.QueryDurationHistogram.WithLabelValues(metrics.LblInternal, dbName, vars.StmtCtx.ResourceGroupName).Observe(time.Since(startTime).Seconds()) } return rows, rs.Fields(), err } @@ -2058,7 +2071,7 @@ func (s *session) ExecRestrictedSQL(ctx context.Context, opts []sqlexec.OptionFu vars := se.GetSessionVars() for _, dbName := range GetDBNames(vars) { - metrics.QueryDurationHistogram.WithLabelValues(metrics.LblInternal, dbName, vars.ResourceGroupName).Observe(time.Since(startTime).Seconds()) + metrics.QueryDurationHistogram.WithLabelValues(metrics.LblInternal, dbName, vars.StmtCtx.ResourceGroupName).Observe(time.Since(startTime).Seconds()) } return rows, rs.Fields(), err }) @@ -2167,28 +2180,19 @@ func (s *session) ExecuteStmt(ctx context.Context, stmtNode ast.StmtNode) (sqlex } s.setRequestSource(ctx, stmtLabel, stmtNode) - // Backup the original resource group name since sql hint might change it during optimization - originalResourceGroup := s.GetSessionVars().ResourceGroupName - // Transform abstract syntax tree to a physical plan(stored in executor.ExecStmt). compiler := executor.Compiler{Ctx: s} stmt, err := compiler.Compile(ctx, stmtNode) - // session resource-group might be changed by query hint, ensure restore it back when - // the execution finished. - if sessVars.ResourceGroupName != originalResourceGroup { + // check if resource group hint is valid, can't do this in planner.Optimize because we can access + // infoschema there. + if sessVars.StmtCtx.ResourceGroupName != sessVars.ResourceGroupName { // if target resource group doesn't exist, fallback to the origin resource group. - if _, ok := domain.GetDomain(s).InfoSchema().ResourceGroupByName(model.NewCIStr(sessVars.ResourceGroupName)); !ok { - logutil.Logger(ctx).Warn("Unknown resource group from hint", zap.String("name", sessVars.ResourceGroupName)) - sessVars.ResourceGroupName = originalResourceGroup - // if we are in a txn, should also reset the txn resource group. + if _, ok := domain.GetDomain(s).InfoSchema().ResourceGroupByName(model.NewCIStr(sessVars.StmtCtx.ResourceGroupName)); !ok { + logutil.Logger(ctx).Warn("Unknown resource group from hint", zap.String("name", sessVars.StmtCtx.ResourceGroupName)) + sessVars.StmtCtx.ResourceGroupName = sessVars.ResourceGroupName if txn, err := s.Txn(false); err == nil && txn != nil && txn.Valid() { - kv.SetTxnResourceGroup(txn, originalResourceGroup) + kv.SetTxnResourceGroup(txn, sessVars.ResourceGroupName) } - } else { - defer func() { - // Restore the resource group for the session - sessVars.ResourceGroupName = originalResourceGroup - }() } } if err != nil { @@ -2237,9 +2241,9 @@ func (s *session) ExecuteStmt(ctx context.Context, stmtNode ast.StmtNode) (sqlex // Observe the resource group query total counter if the resource control is enabled and the // current session is attached with a resource group. - resourceGroupName := s.GetSessionVars().ResourceGroupName + resourceGroupName := s.GetSessionVars().StmtCtx.ResourceGroupName if len(resourceGroupName) > 0 { - metrics.ResourceGroupQueryTotalCounter.WithLabelValues(resourceGroupName).Inc() + metrics.ResourceGroupQueryTotalCounter.WithLabelValues(resourceGroupName, resourceGroupName).Inc() } if err != nil { @@ -2358,23 +2362,6 @@ func runStmt(ctx context.Context, se *session, s sqlexec.Statement) (rs sqlexec. sessVars := se.sessionVars - // Record diagnostic information for DML statements - if stmt, ok := s.(*executor.ExecStmt).StmtNode.(ast.DMLNode); ok { - // Keep the previous queryInfo for `show session_states` because the statement needs to encode it. - if showStmt, ok := stmt.(*ast.ShowStmt); !ok || showStmt.Tp != ast.ShowSessionStates { - defer func() { - sessVars.LastQueryInfo = sessionstates.QueryInfo{ - TxnScope: sessVars.CheckAndGetTxnScope(), - StartTS: sessVars.TxnCtx.StartTS, - ForUpdateTS: sessVars.TxnCtx.GetForUpdateTS(), - } - if err != nil { - sessVars.LastQueryInfo.ErrMsg = err.Error() - } - }() - } - } - // Save origTxnCtx here to avoid it reset in the transaction retry. origTxnCtx := sessVars.TxnCtx err = se.checkTxnAborted(s) @@ -2441,18 +2428,31 @@ type execStmtResult struct { sqlexec.RecordSet se *session sql sqlexec.Statement + once sync.Once closed bool } +func (rs *execStmtResult) Finish() error { + var err error + rs.once.Do(func() { + var err1 error + if f, ok := rs.RecordSet.(interface{ Finish() error }); ok { + err1 = f.Finish() + } + err2 := finishStmt(context.Background(), rs.se, err, rs.sql) + err = stderrs.Join(err1, err2) + }) + return err +} + func (rs *execStmtResult) Close() error { if rs.closed { return nil } - se := rs.se - err := rs.RecordSet.Close() - err = finishStmt(context.Background(), se, err, rs.sql) + err1 := rs.Finish() + err2 := rs.RecordSet.Close() rs.closed = true - return err + return stderrs.Join(err1, err2) } // rollbackOnError makes sure the next statement starts a new transaction with the latest InfoSchema. @@ -2587,7 +2587,7 @@ func (s *session) Close() { telemetry.GlobalBuiltinFunctionsUsage.Collect(s.GetBuiltinFunctionUsage()) bindValue := s.Value(bindinfo.SessionBindInfoKeyType) if bindValue != nil { - bindValue.(*bindinfo.SessionHandle).Close() + bindValue.(bindinfo.SessionBindingHandle).Close() } ctx := context.WithValue(context.TODO(), inCloseSession{}, struct{}{}) s.RollbackTxn(ctx) @@ -3151,7 +3151,7 @@ func createAndSplitTables(store kv.Storage, t *meta.Meta, dbID int64, tables []t tblInfo.State = model.StatePublic tblInfo.ID = tbl.id tblInfo.UpdateTS = t.StartTS - err = t.CreateTableOrView(dbID, tblInfo) + err = t.CreateTableOrView(dbID, "", tblInfo) if err != nil { return errors.Trace(err) } @@ -3184,7 +3184,7 @@ func InitMDLTable(store kv.Storage) error { tblInfo.State = model.StatePublic tblInfo.ID = ddl.MDLTableID tblInfo.UpdateTS = t.StartTS - err = t.CreateTableOrView(dbID, tblInfo) + err = t.CreateTableOrView(dbID, "", tblInfo) if err != nil { return errors.Trace(err) } @@ -3487,7 +3487,7 @@ func bootstrapSessionImpl(store kv.Storage, createSessionsImpl func(store kv.Sto dom.Close() return nil, errors.New("Fail to load or parse sql file") } - err = dom.InitDistTaskLoop(ctx) + err = dom.InitDistTaskLoop() if err != nil { return nil, err } @@ -3590,7 +3590,7 @@ func createSessionWithOpt(store kv.Storage, opt *Opt) (*session, error) { s.sessionVars.BinlogClient = binloginfo.GetPumpsClient() s.txn.init() - sessionBindHandle := bindinfo.NewSessionBindHandle() + sessionBindHandle := bindinfo.NewSessionBindingHandle() s.SetValue(bindinfo.SessionBindInfoKeyType, sessionBindHandle) s.SetSessionStatesHandler(sessionstates.StateBinding, sessionBindHandle) return s, nil @@ -3707,6 +3707,11 @@ func (s *session) loadCommonGlobalVariablesIfNeeded() error { } if s.Value(sessionctx.Initing) != nil { // When running bootstrap or upgrade, we should not access global storage. + // But we need to init max_allowed_packet to use concat function during bootstrap or upgrade. + err := vars.SetSystemVar(variable.MaxAllowedPacket, strconv.FormatUint(variable.DefMaxAllowedPacket, 10)) + if err != nil { + logutil.BgLogger().Error("set system variable max_allowed_packet error", zap.Error(err)) + } return nil } diff --git a/pkg/session/temporarytabletest/main_test.go b/pkg/session/temporarytabletest/main_test.go index 46facff98e529..b66e3e92c5921 100644 --- a/pkg/session/temporarytabletest/main_test.go +++ b/pkg/session/temporarytabletest/main_test.go @@ -40,8 +40,9 @@ func TestMain(m *testing.M) { opts := []goleak.Option{ // TODO: figure the reason and shorten this list goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), - goleak.IgnoreTopFunction("github.com/tikv/client-go/v2/internal/retry.newBackoffFn.func1"), + goleak.IgnoreTopFunction("github.com/tikv/client-go/v2/config/retry.newBackoffFn.func1"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/v3.waitRetryBackoff"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), diff --git a/pkg/session/test/common/main_test.go b/pkg/session/test/common/main_test.go index 7eff34b528405..b51233b7b930f 100644 --- a/pkg/session/test/common/main_test.go +++ b/pkg/session/test/common/main_test.go @@ -40,8 +40,9 @@ func TestMain(m *testing.M) { opts := []goleak.Option{ // TODO: figure the reason and shorten this list goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), - goleak.IgnoreTopFunction("github.com/tikv/client-go/v2/internal/retry.newBackoffFn.func1"), + goleak.IgnoreTopFunction("github.com/tikv/client-go/v2/config/retry.newBackoffFn.func1"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/v3.waitRetryBackoff"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), diff --git a/pkg/session/test/main_test.go b/pkg/session/test/main_test.go index 4924098dc59a2..111165d04a63f 100644 --- a/pkg/session/test/main_test.go +++ b/pkg/session/test/main_test.go @@ -40,8 +40,9 @@ func TestMain(m *testing.M) { opts := []goleak.Option{ // TODO: figure the reason and shorten this list goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), - goleak.IgnoreTopFunction("github.com/tikv/client-go/v2/internal/retry.newBackoffFn.func1"), + goleak.IgnoreTopFunction("github.com/tikv/client-go/v2/config/retry.newBackoffFn.func1"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/v3.waitRetryBackoff"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), diff --git a/pkg/session/test/meta/BUILD.bazel b/pkg/session/test/meta/BUILD.bazel index e6cc77a8af18d..9e0b1b6f445ea 100644 --- a/pkg/session/test/meta/BUILD.bazel +++ b/pkg/session/test/meta/BUILD.bazel @@ -14,6 +14,7 @@ go_test( "//pkg/ddl", "//pkg/metrics", "//pkg/session", + "//pkg/store/mockstore", "//pkg/tablecodec", "//pkg/testkit", "//pkg/testkit/external", diff --git a/pkg/session/test/meta/main_test.go b/pkg/session/test/meta/main_test.go index 8597e36fc096e..ea7f53f7452f1 100644 --- a/pkg/session/test/meta/main_test.go +++ b/pkg/session/test/meta/main_test.go @@ -40,8 +40,9 @@ func TestMain(m *testing.M) { opts := []goleak.Option{ // TODO: figure the reason and shorten this list goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), - goleak.IgnoreTopFunction("github.com/tikv/client-go/v2/internal/retry.newBackoffFn.func1"), + goleak.IgnoreTopFunction("github.com/tikv/client-go/v2/config/retry.newBackoffFn.func1"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/v3.waitRetryBackoff"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), diff --git a/pkg/session/test/meta/session_test.go b/pkg/session/test/meta/session_test.go index e3be6077e1c82..f38e11ff87c5b 100644 --- a/pkg/session/test/meta/session_test.go +++ b/pkg/session/test/meta/session_test.go @@ -24,6 +24,7 @@ import ( "github.com/pingcap/tidb/pkg/ddl" "github.com/pingcap/tidb/pkg/metrics" "github.com/pingcap/tidb/pkg/session" + "github.com/pingcap/tidb/pkg/store/mockstore" "github.com/pingcap/tidb/pkg/tablecodec" "github.com/pingcap/tidb/pkg/testkit" "github.com/pingcap/tidb/pkg/testkit/external" @@ -71,7 +72,7 @@ func TestMetaTableRegion(t *testing.T) { enableSplitTableRegionVal := atomic.LoadUint32(&ddl.EnableSplitTableRegion) atomic.StoreUint32(&ddl.EnableSplitTableRegion, 1) defer atomic.StoreUint32(&ddl.EnableSplitTableRegion, enableSplitTableRegionVal) - store := testkit.CreateMockStore(t) + store := testkit.CreateMockStore(t, mockstore.WithStoreType(mockstore.EmbedUnistore)) tk := testkit.NewTestKit(t, store) diff --git a/pkg/session/test/privileges/main_test.go b/pkg/session/test/privileges/main_test.go index 95522ec4f3944..53f54cf3747fb 100644 --- a/pkg/session/test/privileges/main_test.go +++ b/pkg/session/test/privileges/main_test.go @@ -40,8 +40,9 @@ func TestMain(m *testing.M) { opts := []goleak.Option{ // TODO: figure the reason and shorten this list goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), - goleak.IgnoreTopFunction("github.com/tikv/client-go/v2/internal/retry.newBackoffFn.func1"), + goleak.IgnoreTopFunction("github.com/tikv/client-go/v2/config/retry.newBackoffFn.func1"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/v3.waitRetryBackoff"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), diff --git a/pkg/session/test/session_test.go b/pkg/session/test/session_test.go index aaf1bd67a4858..59cfec4ad63f6 100644 --- a/pkg/session/test/session_test.go +++ b/pkg/session/test/session_test.go @@ -798,7 +798,7 @@ func TestRequestSource(t *testing.T) { func TestEmptyInitSQLFile(t *testing.T) { // A non-existent sql file would stop the bootstrap of the tidb cluster - store, err := mockstore.NewMockStore() + store, err := mockstore.NewMockStore(mockstore.WithStoreType(mockstore.EmbedUnistore)) require.NoError(t, err) config.GetGlobalConfig().InitializeSQLFile = "non-existent.sql" defer func() { @@ -832,7 +832,7 @@ func TestInitSystemVariable(t *testing.T) { // Create a mock store // Set the config parameter for initialize sql file - store, err := mockstore.NewMockStore() + store, err := mockstore.NewMockStore(mockstore.WithStoreType(mockstore.EmbedUnistore)) require.NoError(t, err) config.GetGlobalConfig().InitializeSQLFile = initializeSQLFile.Name() defer func() { @@ -921,7 +921,7 @@ DROP USER root; _, err = sqlFiles[1].WriteString("drop user cloud_admin;") require.NoError(t, err) - store, err := mockstore.NewMockStore() + store, err := mockstore.NewMockStore(mockstore.WithStoreType(mockstore.EmbedUnistore)) require.NoError(t, err) config.GetGlobalConfig().InitializeSQLFile = sqlFiles[0].Name() defer func() { @@ -999,7 +999,7 @@ insert into test.t values ("abc"); -- invalid statement `) require.NoError(t, err) - store, err := mockstore.NewMockStore() + store, err := mockstore.NewMockStore(mockstore.WithStoreType(mockstore.EmbedUnistore)) require.NoError(t, err) config.GetGlobalConfig().InitializeSQLFile = sqlFiles[0].Name() defer func() { @@ -1015,7 +1015,7 @@ insert into test.t values ("abc"); -- invalid statement session.DisableRunBootstrapSQLFileInTest() // Bootstrap with the second sql file, which would not been executed. - store, err = mockstore.NewMockStore() + store, err = mockstore.NewMockStore(mockstore.WithStoreType(mockstore.EmbedUnistore)) require.NoError(t, err) defer func() { require.NoError(t, store.Close()) diff --git a/pkg/session/test/txn/main_test.go b/pkg/session/test/txn/main_test.go index ca5dc13ce6545..eb0e748eeb078 100644 --- a/pkg/session/test/txn/main_test.go +++ b/pkg/session/test/txn/main_test.go @@ -40,8 +40,9 @@ func TestMain(m *testing.M) { opts := []goleak.Option{ // TODO: figure the reason and shorten this list goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), - goleak.IgnoreTopFunction("github.com/tikv/client-go/v2/internal/retry.newBackoffFn.func1"), + goleak.IgnoreTopFunction("github.com/tikv/client-go/v2/config/retry.newBackoffFn.func1"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/v3.waitRetryBackoff"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), diff --git a/pkg/session/test/variable/BUILD.bazel b/pkg/session/test/variable/BUILD.bazel index 3f0a3dabf64f4..380a6dff7e4b8 100644 --- a/pkg/session/test/variable/BUILD.bazel +++ b/pkg/session/test/variable/BUILD.bazel @@ -8,7 +8,7 @@ go_test( "variable_test.go", ], flaky = True, - shard_count = 9, + shard_count = 10, deps = [ "//pkg/config", "//pkg/kv", diff --git a/pkg/session/test/variable/main_test.go b/pkg/session/test/variable/main_test.go index 2856f3b8a0fb5..e6425eb22a612 100644 --- a/pkg/session/test/variable/main_test.go +++ b/pkg/session/test/variable/main_test.go @@ -40,8 +40,9 @@ func TestMain(m *testing.M) { opts := []goleak.Option{ // TODO: figure the reason and shorten this list goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), - goleak.IgnoreTopFunction("github.com/tikv/client-go/v2/internal/retry.newBackoffFn.func1"), + goleak.IgnoreTopFunction("github.com/tikv/client-go/v2/config/retry.newBackoffFn.func1"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/v3.waitRetryBackoff"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), diff --git a/pkg/session/test/variable/variable_test.go b/pkg/session/test/variable/variable_test.go index 776489678396c..005d9eb122688 100644 --- a/pkg/session/test/variable/variable_test.go +++ b/pkg/session/test/variable/variable_test.go @@ -17,6 +17,7 @@ package variable import ( "context" "fmt" + "strings" "testing" "github.com/pingcap/failpoint" @@ -120,6 +121,8 @@ func TestCoprocessorOOMAction(t *testing.T) { disableOOM := func(tk *testkit.TestKit, name, sql string) { t.Logf("disable OOM, testcase: %v", name) quota := 5*copr.MockResponseSizeForTest - 100 + tk.MustExec("SET GLOBAL tidb_mem_oom_action='CANCEL'") + defer tk.MustExec("SET GLOBAL tidb_mem_oom_action = DEFAULT") tk.MustExec("use testoom") tk.MustExec("set @@tidb_enable_rate_limit_action=0") tk.MustExec("set @@tidb_distsql_scan_concurrency = 10") @@ -171,9 +174,11 @@ func TestCoprocessorOOMAction(t *testing.T) { tk.MustExec("use testoom") tk.MustExec("set tidb_distsql_scan_concurrency = 1") tk.MustExec("set @@tidb_mem_quota_query=1;") + tk.MustExec("SET GLOBAL tidb_mem_oom_action='CANCEL'") err = tk.QueryToErr(testcase.sql) require.Error(t, err) require.True(t, exeerrors.ErrMemoryExceedForQuery.Equal(err)) + tk.MustExec("SET GLOBAL tidb_mem_oom_action = DEFAULT") se.Close() } } @@ -362,3 +367,24 @@ func TestIsolationRead(t *testing.T) { require.True(t, hasTiFlash) require.False(t, hasTiKV) } + +func TestLastQueryInfo(t *testing.T) { + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/executor/mockRUConsumption", `return()`)) + defer func() { + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/executor/mockRUConsumption")) + }() + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a int, b int, index idx(a))") + tk.MustExec(`prepare stmt1 from 'select * from t'`) + tk.MustExec("execute stmt1") + checkMatch := func(actual []string, expected []interface{}) bool { + return strings.Contains(actual[0], expected[0].(string)) + } + tk.MustQuery("select @@tidb_last_query_info;").CheckWithFunc(testkit.Rows(`"ru_consumption":15`), checkMatch) + tk.MustExec("select a from t where a = 1") + tk.MustQuery("select @@tidb_last_query_info;").CheckWithFunc(testkit.Rows(`"ru_consumption":27`), checkMatch) + tk.MustQuery("select @@tidb_last_query_info;").CheckWithFunc(testkit.Rows(`"ru_consumption":30`), checkMatch) +} diff --git a/pkg/session/test/vars/main_test.go b/pkg/session/test/vars/main_test.go index 045c176dae505..e5904501fe471 100644 --- a/pkg/session/test/vars/main_test.go +++ b/pkg/session/test/vars/main_test.go @@ -40,8 +40,9 @@ func TestMain(m *testing.M) { opts := []goleak.Option{ // TODO: figure the reason and shorten this list goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), - goleak.IgnoreTopFunction("github.com/tikv/client-go/v2/internal/retry.newBackoffFn.func1"), + goleak.IgnoreTopFunction("github.com/tikv/client-go/v2/config/retry.newBackoffFn.func1"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/v3.waitRetryBackoff"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), diff --git a/pkg/session/testutil.go b/pkg/session/testutil.go index 78eca23d1a63e..1767efce6a48b 100644 --- a/pkg/session/testutil.go +++ b/pkg/session/testutil.go @@ -41,7 +41,7 @@ var ( // CreateStoreAndBootstrap creates a mock store and bootstrap it. func CreateStoreAndBootstrap(t *testing.T) (kv.Storage, *domain.Domain) { testenv.SetGOMAXPROCSForTest() - store, err := mockstore.NewMockStore() + store, err := mockstore.NewMockStore(mockstore.WithStoreType(mockstore.EmbedUnistore)) require.NoError(t, err) dom, err := BootstrapSession(store) require.NoError(t, err) diff --git a/pkg/session/txn.go b/pkg/session/txn.go index 17fdbbf1ea278..75ad0663af116 100644 --- a/pkg/session/txn.go +++ b/pkg/session/txn.go @@ -307,7 +307,14 @@ func (txn *LazyTxn) changePendingToValid(ctx context.Context, sctx sessionctx.Co txn.mu.TxnInfo.AllSQLDigests) // set resource group name for kv request such as lock pessimistic keys. - kv.SetTxnResourceGroup(txn, sctx.GetSessionVars().ResourceGroupName) + kv.SetTxnResourceGroup(txn, sctx.GetSessionVars().StmtCtx.ResourceGroupName) + // overwrite entry size limit by sys var. + if entrySizeLimit := sctx.GetSessionVars().TxnEntrySizeLimit; entrySizeLimit > 0 { + txn.SetOption(kv.SizeLimits, kv.TxnSizeLimits{ + Entry: entrySizeLimit, + Total: kv.TxnTotalSizeLimit.Load(), + }) + } return nil } diff --git a/pkg/sessionctx/binloginfo/main_test.go b/pkg/sessionctx/binloginfo/main_test.go index decd2ab61dc0f..613f9e63ad353 100644 --- a/pkg/sessionctx/binloginfo/main_test.go +++ b/pkg/sessionctx/binloginfo/main_test.go @@ -27,6 +27,7 @@ func TestMain(m *testing.M) { goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), } goleak.VerifyTestMain(m, opts...) diff --git a/pkg/sessionctx/main_test.go b/pkg/sessionctx/main_test.go index 45d1a23c66737..7dee5bea10200 100644 --- a/pkg/sessionctx/main_test.go +++ b/pkg/sessionctx/main_test.go @@ -25,6 +25,7 @@ func TestMain(m *testing.M) { testsetup.SetupForCommonTest() opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), diff --git a/pkg/sessionctx/sessionstates/session_states.go b/pkg/sessionctx/sessionstates/session_states.go index 833c0c3b9c09d..7afa39ffe404e 100644 --- a/pkg/sessionctx/sessionstates/session_states.go +++ b/pkg/sessionctx/sessionstates/session_states.go @@ -49,10 +49,11 @@ type PreparedStmtInfo struct { // QueryInfo represents the information of last executed query. It's used to expose information for test purpose. type QueryInfo struct { - TxnScope string `json:"txn_scope"` - StartTS uint64 `json:"start_ts"` - ForUpdateTS uint64 `json:"for_update_ts"` - ErrMsg string `json:"error,omitempty"` + TxnScope string `json:"txn_scope"` + StartTS uint64 `json:"start_ts"` + ForUpdateTS uint64 `json:"for_update_ts"` + RUConsumption float64 `json:"ru_consumption"` + ErrMsg string `json:"error,omitempty"` } // LastDDLInfo represents the information of last DDL. It's used to expose information for test purpose. diff --git a/pkg/sessionctx/sessionstates/session_states_test.go b/pkg/sessionctx/sessionstates/session_states_test.go index b1257775952f2..97f2597abfc55 100644 --- a/pkg/sessionctx/sessionstates/session_states_test.go +++ b/pkg/sessionctx/sessionstates/session_states_test.go @@ -548,12 +548,14 @@ func TestSessionCtx(t *testing.T) { setFunc: func(tk *testkit.TestKit) any { tk.MustExec("SET GLOBAL tidb_enable_resource_control='on'") tk.MustExec("CREATE RESOURCE GROUP rg1 ru_per_sec = 100") + tk.MustExec("CREATE RESOURCE GROUP rg2 ru_per_sec = 100") tk.MustExec("SET RESOURCE GROUP `rg1`") require.Equal(t, "rg1", tk.Session().GetSessionVars().ResourceGroupName) return nil }, checkFunc: func(tk *testkit.TestKit, param any) { tk.MustQuery("SELECT CURRENT_RESOURCE_GROUP()").Check(testkit.Rows("rg1")) + tk.MustQuery("SELECT /*+ RESOURCE_GROUP(rg2) */ CURRENT_RESOURCE_GROUP()").Check(testkit.Rows("rg2")) }, }, { diff --git a/pkg/sessionctx/stmtctx/BUILD.bazel b/pkg/sessionctx/stmtctx/BUILD.bazel index b9602e725fe91..a9f8c30b6c8b1 100644 --- a/pkg/sessionctx/stmtctx/BUILD.bazel +++ b/pkg/sessionctx/stmtctx/BUILD.bazel @@ -14,6 +14,7 @@ go_library( "//pkg/parser/mysql", "//pkg/parser/terror", "//pkg/types", + "//pkg/util/context", "//pkg/util/disk", "//pkg/util/execdetails", "//pkg/util/intest", @@ -41,8 +42,9 @@ go_test( ], embed = [":stmtctx"], flaky = True, - shard_count = 10, + shard_count = 12, deps = [ + "//pkg/errctx", "//pkg/kv", "//pkg/sessionctx/variable", "//pkg/testkit", diff --git a/pkg/sessionctx/stmtctx/main_test.go b/pkg/sessionctx/stmtctx/main_test.go index d714954969ec5..f34da9ae0cc07 100644 --- a/pkg/sessionctx/stmtctx/main_test.go +++ b/pkg/sessionctx/stmtctx/main_test.go @@ -25,6 +25,7 @@ func TestMain(m *testing.M) { testsetup.SetupForCommonTest() opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), diff --git a/pkg/sessionctx/stmtctx/stmtctx.go b/pkg/sessionctx/stmtctx/stmtctx.go index 5e3a929c051b5..4816b98f21e1f 100644 --- a/pkg/sessionctx/stmtctx/stmtctx.go +++ b/pkg/sessionctx/stmtctx/stmtctx.go @@ -36,6 +36,7 @@ import ( "github.com/pingcap/tidb/pkg/parser/mysql" "github.com/pingcap/tidb/pkg/parser/terror" "github.com/pingcap/tidb/pkg/types" + contextutil "github.com/pingcap/tidb/pkg/util/context" "github.com/pingcap/tidb/pkg/util/disk" "github.com/pingcap/tidb/pkg/util/execdetails" "github.com/pingcap/tidb/pkg/util/intest" @@ -147,6 +148,8 @@ func (rf *ReferenceCount) UnFreeze() { atomic.StoreInt32((*int32)(rf), ReferenceCountNoReference) } +var stmtCtxIDGenerator atomic.Uint64 + // StatementContext contains variables for a statement. // It should be reset before executing a statement. type StatementContext struct { @@ -156,6 +159,8 @@ type StatementContext struct { _ constructor.Constructor `ctor:"NewStmtCtx,NewStmtCtxWithTimeZone,Reset"` + ctxID uint64 + // typeCtx is used to indicate how to make the type conversation. typeCtx types.Context @@ -167,32 +172,27 @@ type StatementContext struct { // IsDDLJobInQueue is used to mark whether the DDL job is put into the queue. // If IsDDLJobInQueue is true, it means the DDL job is in the queue of storage, and it can be handled by the DDL worker. - IsDDLJobInQueue bool - DDLJobID int64 - InInsertStmt bool - InUpdateStmt bool - InDeleteStmt bool - InSelectStmt bool - InLoadDataStmt bool - InExplainStmt bool - InExplainAnalyzeStmt bool - ExplainFormat string - InCreateOrAlterStmt bool - InSetSessionStatesStmt bool - InPreparedPlanBuilding bool - DupKeyAsWarning bool - BadNullAsWarning bool - DividedByZeroAsWarning bool - OverflowAsWarning bool - ErrAutoincReadFailedAsWarning bool - InShowWarning bool - UseCache bool - CacheType PlanCacheType - BatchCheck bool - InNullRejectCheck bool - IgnoreNoPartition bool - IgnoreExplainIDSuffix bool - MultiSchemaInfo *model.MultiSchemaInfo + IsDDLJobInQueue bool + DDLJobID int64 + InInsertStmt bool + InUpdateStmt bool + InDeleteStmt bool + InSelectStmt bool + InLoadDataStmt bool + InExplainStmt bool + InExplainAnalyzeStmt bool + ExplainFormat string + InCreateOrAlterStmt bool + InSetSessionStatesStmt bool + InPreparedPlanBuilding bool + InShowWarning bool + UseCache bool + ForcePlanCache bool // force the optimizer to use plan cache even if there is risky optimization, see #49736. + CacheType PlanCacheType + BatchCheck bool + InNullRejectCheck bool + IgnoreExplainIDSuffix bool + MultiSchemaInfo *model.MultiSchemaInfo // If the select statement was like 'select * from t as of timestamp ...' or in a stale read transaction // or is affected by the tidb_read_staleness session variable, then the statement will be makred as isStaleness // in stmtCtx @@ -250,18 +250,21 @@ type StatementContext struct { MaxRowID int64 // Copied from SessionVars.TimeZone. - Priority mysql.PriorityEnum - NotFillCache bool - MemTracker *memory.Tracker - DiskTracker *disk.Tracker - RunawayChecker *resourcegroup.RunawayChecker - IsTiFlash atomic2.Bool - RuntimeStatsColl *execdetails.RuntimeStatsColl - TableIDs []int64 - IndexNames []string - StmtType string - OriginalSQL string - digestMemo struct { + Priority mysql.PriorityEnum + NotFillCache bool + MemTracker *memory.Tracker + DiskTracker *disk.Tracker + // per statement resource group name + // hint /* +ResourceGroup(name) */ can change the statement group name + ResourceGroupName string + RunawayChecker *resourcegroup.RunawayChecker + IsTiFlash atomic2.Bool + RuntimeStatsColl *execdetails.RuntimeStatsColl + TableIDs []int64 + IndexNames []string + StmtType string + OriginalSQL string + digestMemo struct { sync.Once normalized string digest *parser.Digest @@ -424,26 +427,39 @@ type StatementContext struct { } } +var defaultErrLevels = func() (l errctx.LevelMap) { + l[errctx.ErrGroupDividedByZero] = errctx.LevelWarn + return +}() + // NewStmtCtx creates a new statement context func NewStmtCtx() *StatementContext { - sc := &StatementContext{} - sc.typeCtx = types.NewContext(types.DefaultStmtFlags, time.UTC, sc.AppendWarning) - return sc + return NewStmtCtxWithTimeZone(time.UTC) } // NewStmtCtxWithTimeZone creates a new StatementContext with the given timezone func NewStmtCtxWithTimeZone(tz *time.Location) *StatementContext { intest.AssertNotNil(tz) - sc := &StatementContext{} - sc.typeCtx = types.NewContext(types.DefaultStmtFlags, tz, sc.AppendWarning) + sc := &StatementContext{ + ctxID: stmtCtxIDGenerator.Add(1), + } + sc.typeCtx = types.NewContext(types.DefaultStmtFlags, tz, sc) + sc.errCtx = newErrCtx(sc.typeCtx, defaultErrLevels, sc) return sc } // Reset resets a statement context func (sc *StatementContext) Reset() { *sc = StatementContext{ - typeCtx: types.NewContext(types.DefaultStmtFlags, time.UTC, sc.AppendWarning), + ctxID: stmtCtxIDGenerator.Add(1), } + sc.typeCtx = types.NewContext(types.DefaultStmtFlags, time.UTC, sc) + sc.errCtx = newErrCtx(sc.typeCtx, defaultErrLevels, sc) +} + +// CtxID returns the context id of the statement +func (sc *StatementContext) CtxID() uint64 { + return sc.ctxID } // TimeZone returns the timezone of the type context @@ -468,20 +484,24 @@ func (sc *StatementContext) TypeCtx() types.Context { } // ErrCtx returns the error context -// TODO: add a cache to the `ErrCtx` if needed, though it's not a big burden to generate `ErrCtx` everytime. func (sc *StatementContext) ErrCtx() errctx.Context { - ctx := errctx.NewContext(sc.AppendWarning) + return sc.errCtx +} - if sc.TypeFlags().IgnoreTruncateErr() { - ctx = ctx.WithErrGroupLevel(errctx.ErrGroupTruncate, errctx.LevelIgnore) - } else if sc.TypeFlags().TruncateAsWarning() { - ctx = ctx.WithErrGroupLevel(errctx.ErrGroupTruncate, errctx.LevelWarn) - } +// SetErrLevels sets the error levels for statement +// The argument otherLevels is used to set the error levels except truncate +func (sc *StatementContext) SetErrLevels(otherLevels errctx.LevelMap) { + sc.errCtx = newErrCtx(sc.typeCtx, otherLevels, sc) +} - if sc.OverflowAsWarning { - ctx = ctx.WithErrGroupLevel(errctx.ErrGroupOverflow, errctx.LevelWarn) - } - return ctx +// ErrLevels returns the current `errctx.LevelMap` +func (sc *StatementContext) ErrLevels() errctx.LevelMap { + return sc.errCtx.LevelMap() +} + +// ErrGroupLevel returns the error level for the given error group +func (sc *StatementContext) ErrGroupLevel(group errctx.ErrGroup) errctx.Level { + return sc.errCtx.LevelForGroup(group) } // TypeFlags returns the type flags @@ -492,6 +512,7 @@ func (sc *StatementContext) TypeFlags() types.Flags { // SetTypeFlags sets the type flags func (sc *StatementContext) SetTypeFlags(flags types.Flags) { sc.typeCtx = sc.typeCtx.WithFlags(flags) + sc.errCtx = newErrCtx(sc.typeCtx, sc.errCtx.LevelMap(), sc) } // HandleTruncate ignores or returns the error based on the TypeContext inside. @@ -510,6 +531,16 @@ func (sc *StatementContext) HandleError(err error) error { return errCtx.HandleError(err) } +// HandleErrorWithAlias handles the error based on `ErrCtx()` +func (sc *StatementContext) HandleErrorWithAlias(internalErr, err, warnErr error) error { + intest.AssertNotNil(sc) + if sc == nil { + return err + } + errCtx := sc.ErrCtx() + return errCtx.HandleErrorWithAlias(internalErr, err, warnErr) +} + // StmtHints are SessionVars related sql hints. type StmtHints struct { // Hint Information @@ -781,16 +812,33 @@ func (sc *StatementContext) SetSkipPlanCache(reason error) { if !sc.UseCache { return // avoid unnecessary warnings } + + if sc.ForcePlanCache { + sc.AppendWarning(errors.NewNoStackErrorf("force plan-cache: may use risky cached plan: %s", reason.Error())) + return + } + sc.setSkipPlanCache(reason) +} + +// ForceSetSkipPlanCache sets to skip the plan cache and records the reason. +func (sc *StatementContext) ForceSetSkipPlanCache(reason error) { + if sc.CacheType == DefaultNoCache { + return + } + sc.setSkipPlanCache(reason) +} + +func (sc *StatementContext) setSkipPlanCache(reason error) { sc.UseCache = false switch sc.CacheType { case DefaultNoCache: - sc.AppendWarning(errors.New("unknown cache type")) + sc.AppendWarning(errors.NewNoStackError("unknown cache type")) case SessionPrepared: - sc.AppendWarning(errors.Errorf("skip prepared plan-cache: %s", reason.Error())) + sc.AppendWarning(errors.NewNoStackErrorf("skip prepared plan-cache: %s", reason.Error())) case SessionNonPrepared: if sc.InExplainStmt && sc.ExplainFormat == "plan_cache" { // use "plan_cache" rather than types.ExplainFormatPlanCache to avoid import cycle - sc.AppendWarning(errors.Errorf("skip non-prepared plan-cache: %s", reason.Error())) + sc.AppendWarning(errors.NewNoStackErrorf("skip non-prepared plan-cache: %s", reason.Error())) } } } @@ -1052,19 +1100,6 @@ func (sc *StatementContext) AppendExtraError(warn error) { } } -// HandleOverflow treats ErrOverflow as warnings or returns the error based on the StmtCtx.OverflowAsWarning state. -func (sc *StatementContext) HandleOverflow(err error, warnErr error) error { - if err == nil { - return nil - } - - if sc.OverflowAsWarning { - sc.AppendWarning(warnErr) - return nil - } - return err -} - // resetMuForRetry resets the changed states of sc.mu during execution. func (sc *StatementContext) resetMuForRetry() { sc.mu.Lock() @@ -1162,6 +1197,7 @@ func (sc *StatementContext) GetExecDetails() execdetails.ExecDetails { // PushDownFlags converts StatementContext to tipb.SelectRequest.Flags. func (sc *StatementContext) PushDownFlags() uint64 { var flags uint64 + ec := sc.ErrCtx() if sc.InInsertStmt { flags |= model.FlagInInsertStmt } else if sc.InUpdateStmt || sc.InDeleteStmt { @@ -1173,14 +1209,13 @@ func (sc *StatementContext) PushDownFlags() uint64 { flags |= model.FlagIgnoreTruncate } else if sc.TypeFlags().TruncateAsWarning() { flags |= model.FlagTruncateAsWarning - } - if sc.OverflowAsWarning { + // TODO: remove this flag from TiKV. flags |= model.FlagOverflowAsWarning } if sc.TypeFlags().IgnoreZeroInDate() { flags |= model.FlagIgnoreZeroInDate } - if sc.DividedByZeroAsWarning { + if ec.LevelForGroup(errctx.ErrGroupDividedByZero) != errctx.LevelError { flags |= model.FlagDividedByZeroAsWarning } if sc.InLoadDataStmt { @@ -1241,8 +1276,11 @@ func (sc *StatementContext) InitFromPBFlagAndTz(flags uint64, tz *time.Location) sc.InInsertStmt = (flags & model.FlagInInsertStmt) > 0 sc.InSelectStmt = (flags & model.FlagInSelectStmt) > 0 sc.InDeleteStmt = (flags & model.FlagInUpdateOrDeleteStmt) > 0 - sc.OverflowAsWarning = (flags & model.FlagOverflowAsWarning) > 0 - sc.DividedByZeroAsWarning = (flags & model.FlagDividedByZeroAsWarning) > 0 + levels := sc.ErrLevels() + levels[errctx.ErrGroupDividedByZero] = errctx.ResolveErrLevel(false, + (flags&model.FlagDividedByZeroAsWarning) > 0, + ) + sc.SetErrLevels(levels) sc.SetTimeZone(tz) sc.SetTypeFlags(types.DefaultStmtFlags. WithIgnoreTruncateErr((flags & model.FlagIgnoreTruncate) > 0). @@ -1266,10 +1304,10 @@ func (sc *StatementContext) RecordRangeFallback(rangeMaxSize int64) { // If range fallback happens, it means ether the query is unreasonable(for example, several long IN lists) or tidb_opt_range_max_size is too small // and the generated plan is probably suboptimal. In that case we don't put it into plan cache. if sc.UseCache { - sc.SetSkipPlanCache(errors.Errorf("in-list is too long")) + sc.SetSkipPlanCache(errors.NewNoStackError("in-list is too long")) } if !sc.RangeFallback { - sc.AppendWarning(errors.Errorf("Memory capacity of %v bytes for 'tidb_opt_range_max_size' exceeded when building ranges. Less accurate ranges such as full range are chosen", rangeMaxSize)) + sc.AppendWarning(errors.NewNoStackErrorf("Memory capacity of %v bytes for 'tidb_opt_range_max_size' exceeded when building ranges. Less accurate ranges such as full range are chosen", rangeMaxSize)) sc.RangeFallback = true } } @@ -1399,6 +1437,18 @@ func (sc *StatementContext) TypeCtxOrDefault() types.Context { return types.DefaultStmtNoWarningContext } +func newErrCtx(tc types.Context, otherLevels errctx.LevelMap, handler contextutil.WarnHandler) errctx.Context { + l := errctx.LevelError + if flags := tc.Flags(); flags.IgnoreTruncateErr() { + l = errctx.LevelIgnore + } else if flags.TruncateAsWarning() { + l = errctx.LevelWarn + } + + otherLevels[errctx.ErrGroupTruncate] = l + return errctx.NewContextWithLevels(otherLevels, handler) +} + // UsedStatsInfoForTable records stats that are used during query and their information. type UsedStatsInfoForTable struct { Name string diff --git a/pkg/sessionctx/stmtctx/stmtctx_test.go b/pkg/sessionctx/stmtctx/stmtctx_test.go index 60b5bdad3ff84..b6f733a8c7625 100644 --- a/pkg/sessionctx/stmtctx/stmtctx_test.go +++ b/pkg/sessionctx/stmtctx/stmtctx_test.go @@ -25,6 +25,7 @@ import ( "time" "github.com/pingcap/errors" + "github.com/pingcap/tidb/pkg/errctx" "github.com/pingcap/tidb/pkg/kv" "github.com/pingcap/tidb/pkg/sessionctx/stmtctx" "github.com/pingcap/tidb/pkg/sessionctx/variable" @@ -81,6 +82,7 @@ func TestCopTasksDetails(t *testing.T) { func TestStatementContextPushDownFLags(t *testing.T) { newStmtCtx := func(fn func(*stmtctx.StatementContext)) *stmtctx.StatementContext { sc := stmtctx.NewStmtCtx() + sc.SetErrLevels(errctx.LevelMap{}) fn(sc) return sc } @@ -94,17 +96,22 @@ func TestStatementContextPushDownFLags(t *testing.T) { {newStmtCtx(func(sc *stmtctx.StatementContext) { sc.InDeleteStmt = true }), 16}, {newStmtCtx(func(sc *stmtctx.StatementContext) { sc.InSelectStmt = true }), 32}, {newStmtCtx(func(sc *stmtctx.StatementContext) { sc.SetTypeFlags(sc.TypeFlags().WithIgnoreTruncateErr(true)) }), 1}, - {newStmtCtx(func(sc *stmtctx.StatementContext) { sc.SetTypeFlags(sc.TypeFlags().WithTruncateAsWarning(true)) }), 2}, - {newStmtCtx(func(sc *stmtctx.StatementContext) { sc.OverflowAsWarning = true }), 64}, + {newStmtCtx(func(sc *stmtctx.StatementContext) { sc.SetTypeFlags(sc.TypeFlags().WithTruncateAsWarning(true)) }), 66}, {newStmtCtx(func(sc *stmtctx.StatementContext) { sc.SetTypeFlags(sc.TypeFlags().WithIgnoreZeroInDate(true)) }), 128}, - {newStmtCtx(func(sc *stmtctx.StatementContext) { sc.DividedByZeroAsWarning = true }), 256}, + {newStmtCtx(func(sc *stmtctx.StatementContext) { + var levels errctx.LevelMap + levels[errctx.ErrGroupDividedByZero] = errctx.LevelWarn + sc.SetErrLevels(levels) + }), 256}, {newStmtCtx(func(sc *stmtctx.StatementContext) { sc.InLoadDataStmt = true }), 1024}, {newStmtCtx(func(sc *stmtctx.StatementContext) { sc.InSelectStmt = true sc.SetTypeFlags(sc.TypeFlags().WithTruncateAsWarning(true)) - }), 34}, + }), 98}, {newStmtCtx(func(sc *stmtctx.StatementContext) { - sc.DividedByZeroAsWarning = true + var levels errctx.LevelMap + levels[errctx.ErrGroupDividedByZero] = errctx.LevelWarn + sc.SetErrLevels(levels) sc.SetTypeFlags(sc.TypeFlags().WithIgnoreTruncateErr(true)) }), 257}, {newStmtCtx(func(sc *stmtctx.StatementContext) { @@ -318,7 +325,10 @@ func TestNewStmtCtx(t *testing.T) { require.Equal(t, types.DefaultStmtFlags, sc.TypeFlags()) require.Same(t, time.UTC, sc.TimeZone()) require.Same(t, time.UTC, sc.TimeZone()) - sc.AppendWarning(errors.New("err1")) + var levels errctx.LevelMap + levels[errctx.ErrGroupDividedByZero] = errctx.LevelWarn + require.Equal(t, errctx.NewContextWithLevels(levels, sc), sc.ErrCtx()) + sc.AppendWarning(errors.NewNoStackError("err1")) warnings := sc.GetWarnings() require.Equal(t, 1, len(warnings)) require.Equal(t, stmtctx.WarnLevelWarning, warnings[0].Level) @@ -329,7 +339,8 @@ func TestNewStmtCtx(t *testing.T) { require.Equal(t, types.DefaultStmtFlags, sc.TypeFlags()) require.Same(t, tz, sc.TimeZone()) require.Same(t, tz, sc.TimeZone()) - sc.AppendWarning(errors.New("err2")) + require.Equal(t, errctx.NewContextWithLevels(levels, sc), sc.ErrCtx()) + sc.AppendWarning(errors.NewNoStackError("err2")) warnings = sc.GetWarnings() require.Equal(t, 1, len(warnings)) require.Equal(t, stmtctx.WarnLevelWarning, warnings[0].Level) @@ -348,13 +359,18 @@ func TestSetStmtCtxTypeFlags(t *testing.T) { sc := stmtctx.NewStmtCtx() require.Equal(t, types.DefaultStmtFlags, sc.TypeFlags()) + levels := errctx.LevelMap{} + sc.SetErrLevels(levels) sc.SetTypeFlags(types.FlagAllowNegativeToUnsigned | types.FlagSkipASCIICheck) require.Equal(t, types.FlagAllowNegativeToUnsigned|types.FlagSkipASCIICheck, sc.TypeFlags()) require.Equal(t, sc.TypeFlags(), sc.TypeFlags()) + require.Equal(t, errctx.NewContextWithLevels(levels, sc), sc.ErrCtx()) sc.SetTypeFlags(types.FlagSkipASCIICheck | types.FlagSkipUTF8Check | types.FlagTruncateAsWarning) require.Equal(t, types.FlagSkipASCIICheck|types.FlagSkipUTF8Check|types.FlagTruncateAsWarning, sc.TypeFlags()) require.Equal(t, sc.TypeFlags(), sc.TypeFlags()) + levels[errctx.ErrGroupTruncate] = errctx.LevelWarn + require.Equal(t, errctx.NewContextWithLevels(levels, sc), sc.ErrCtx()) } func TestResetStmtCtx(t *testing.T) { @@ -363,14 +379,18 @@ func TestResetStmtCtx(t *testing.T) { tz := time.FixedZone("UTC+1", 2*60*60) sc.SetTimeZone(tz) - sc.SetTypeFlags(types.FlagAllowNegativeToUnsigned | types.FlagSkipASCIICheck) - sc.AppendWarning(errors.New("err1")) + sc.SetTypeFlags(types.FlagIgnoreTruncateErr | types.FlagAllowNegativeToUnsigned | types.FlagSkipASCIICheck) + sc.AppendWarning(errors.NewNoStackError("err1")) sc.InRestrictedSQL = true sc.StmtType = "Insert" require.Same(t, tz, sc.TimeZone()) - require.Equal(t, types.FlagAllowNegativeToUnsigned|types.FlagSkipASCIICheck, sc.TypeFlags()) + require.Equal(t, types.FlagIgnoreTruncateErr|types.FlagAllowNegativeToUnsigned|types.FlagSkipASCIICheck, sc.TypeFlags()) require.Equal(t, 1, len(sc.GetWarnings())) + levels := errctx.LevelMap{} + levels[errctx.ErrGroupTruncate] = errctx.LevelIgnore + levels[errctx.ErrGroupDividedByZero] = errctx.LevelWarn + require.Equal(t, errctx.NewContextWithLevels(levels, sc), sc.ErrCtx()) sc.Reset() require.Same(t, time.UTC, sc.TimeZone()) @@ -380,9 +400,72 @@ func TestResetStmtCtx(t *testing.T) { require.False(t, sc.InRestrictedSQL) require.Empty(t, sc.StmtType) require.Equal(t, 0, len(sc.GetWarnings())) - sc.AppendWarning(errors.New("err2")) + sc.AppendWarning(errors.NewNoStackError("err2")) warnings := sc.GetWarnings() require.Equal(t, 1, len(warnings)) require.Equal(t, stmtctx.WarnLevelWarning, warnings[0].Level) require.Equal(t, "err2", warnings[0].Err.Error()) + levels = errctx.LevelMap{} + levels[errctx.ErrGroupDividedByZero] = errctx.LevelWarn + require.Equal(t, errctx.NewContextWithLevels(levels, sc), sc.ErrCtx()) +} + +func TestStmtCtxID(t *testing.T) { + sc := stmtctx.NewStmtCtx() + currentID := sc.CtxID() + + cases := []struct { + fn func() *stmtctx.StatementContext + }{ + {func() *stmtctx.StatementContext { return stmtctx.NewStmtCtx() }}, + {func() *stmtctx.StatementContext { return stmtctx.NewStmtCtxWithTimeZone(time.Local) }}, + {func() *stmtctx.StatementContext { + sc.Reset() + return sc + }}, + } + + for _, c := range cases { + ctxID := c.fn().CtxID() + require.Greater(t, ctxID, currentID) + currentID = ctxID + } +} + +func TestErrCtx(t *testing.T) { + sc := stmtctx.NewStmtCtx() + // the default errCtx + err := types.ErrTruncated + require.Error(t, sc.HandleError(err)) + levels := errctx.LevelMap{} + levels[errctx.ErrGroupDividedByZero] = errctx.LevelWarn + require.Equal(t, errctx.NewContextWithLevels(levels, sc), sc.ErrCtx()) + levels[errctx.ErrGroupDividedByZero] = errctx.LevelError + + // set error levels + levels[errctx.ErrGroupAutoIncReadFailed] = errctx.LevelIgnore + sc.SetErrLevels(levels) + require.Equal(t, errctx.NewContextWithLevels(levels, sc), sc.ErrCtx()) + + // reset the types flags will re-initialize the error flag, but keeps the error levels unchanged except for ErrGroupTruncate + sc.SetTypeFlags(types.DefaultStmtFlags | types.FlagTruncateAsWarning) + require.NoError(t, sc.HandleError(err)) + levels = errctx.LevelMap{} + levels[errctx.ErrGroupTruncate] = errctx.LevelWarn + levels[errctx.ErrGroupAutoIncReadFailed] = errctx.LevelIgnore + require.Equal(t, errctx.NewContextWithLevels(levels, sc), sc.ErrCtx()) + + // SetErrLevels will not affect ErrGroupTruncate + sc.SetErrLevels(errctx.LevelMap{}) + levels = errctx.LevelMap{} + levels[errctx.ErrGroupTruncate] = errctx.LevelWarn + require.Equal(t, errctx.NewContextWithLevels(levels, sc), sc.ErrCtx()) +} + +func BenchmarkErrCtx(b *testing.B) { + sc := stmtctx.NewStmtCtx() + + for i := 0; i < b.N; i++ { + sc.ErrCtx() + } } diff --git a/pkg/sessionctx/variable/BUILD.bazel b/pkg/sessionctx/variable/BUILD.bazel index 081592a5e5b08..d7ad78566993b 100644 --- a/pkg/sessionctx/variable/BUILD.bazel +++ b/pkg/sessionctx/variable/BUILD.bazel @@ -21,6 +21,7 @@ go_library( deps = [ "//pkg/config", "//pkg/domain/resourcegroup", + "//pkg/errctx", "//pkg/errno", "//pkg/keyspace", "//pkg/kv", @@ -49,6 +50,7 @@ go_library( "//pkg/util/distrole", "//pkg/util/execdetails", "//pkg/util/gctuner", + "//pkg/util/intest", "//pkg/util/kvcache", "//pkg/util/logutil", "//pkg/util/mathutil", diff --git a/pkg/sessionctx/variable/main_test.go b/pkg/sessionctx/variable/main_test.go index 7fdcaff28c86e..90b6abe8a546e 100644 --- a/pkg/sessionctx/variable/main_test.go +++ b/pkg/sessionctx/variable/main_test.go @@ -25,6 +25,7 @@ func TestMain(m *testing.M) { testsetup.SetupForCommonTest() opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), diff --git a/pkg/sessionctx/variable/noop.go b/pkg/sessionctx/variable/noop.go index 8593a16c446ed..098439c4262fb 100644 --- a/pkg/sessionctx/variable/noop.go +++ b/pkg/sessionctx/variable/noop.go @@ -16,6 +16,8 @@ package variable import ( "math" + + "github.com/pingcap/errors" ) // The following sysVars are noops. @@ -170,7 +172,6 @@ var noopSysVars = []*SysVar{ {Scope: ScopeNone, Name: "performance_schema_max_file_classes", Value: "50"}, {Scope: ScopeGlobal, Name: "expire_logs_days", Value: "0"}, {Scope: ScopeGlobal | ScopeSession, Name: BinlogRowQueryLogEvents, Value: Off, Type: TypeBool}, - {Scope: ScopeGlobal, Name: DefaultPasswordLifetime, Value: "0", Type: TypeInt, MinValue: 0, MaxValue: math.MaxUint16}, {Scope: ScopeNone, Name: "pid_file", Value: "/usr/local/mysql/data/localhost.pid"}, {Scope: ScopeNone, Name: "innodb_undo_tablespaces", Value: "0"}, {Scope: ScopeGlobal, Name: InnodbStatusOutputLocks, Value: Off, Type: TypeBool, AutoConvertNegativeBool: true}, @@ -197,11 +198,11 @@ var noopSysVars = []*SysVar{ {Scope: ScopeGlobal | ScopeSession, Name: SQLAutoIsNull, Value: Off, Type: TypeBool, IsHintUpdatableVerfied: true, Validation: func(vars *SessionVars, normalizedValue string, originalValue string, scope ScopeFlag) (string, error) { // checkSQLAutoIsNull requires TiDBEnableNoopFuncs != OFF for the same scope otherwise an error will be returned. // See also https://github.com/pingcap/tidb/issues/28230 - errMsg := ErrFunctionsNoopImpl.GenWithStackByArgs("sql_auto_is_null") + errMsg := ErrFunctionsNoopImpl.FastGenByArgs("sql_auto_is_null") if TiDBOptOn(normalizedValue) { if scope == ScopeSession && vars.NoopFuncsMode != OnInt { if vars.NoopFuncsMode == OffInt { - return Off, errMsg + return Off, errors.Trace(errMsg) } vars.StmtCtx.AppendWarning(errMsg) } @@ -211,7 +212,7 @@ var noopSysVars = []*SysVar{ return originalValue, errUnknownSystemVariable.GenWithStackByArgs(TiDBEnableNoopFuncs) } if val == Off { - return Off, errMsg + return Off, errors.Trace(errMsg) } if val == Warn { vars.StmtCtx.AppendWarning(errMsg) diff --git a/pkg/sessionctx/variable/session.go b/pkg/sessionctx/variable/session.go index 567d5fb5ed55e..59b3993d96d75 100644 --- a/pkg/sessionctx/variable/session.go +++ b/pkg/sessionctx/variable/session.go @@ -34,6 +34,7 @@ import ( "github.com/pingcap/errors" "github.com/pingcap/tidb/pkg/config" "github.com/pingcap/tidb/pkg/domain/resourcegroup" + "github.com/pingcap/tidb/pkg/errctx" "github.com/pingcap/tidb/pkg/kv" "github.com/pingcap/tidb/pkg/meta/autoid" "github.com/pingcap/tidb/pkg/metrics" @@ -106,12 +107,6 @@ type RetryInfo struct { LastRcReadTS uint64 } -// ReuseChunkPool save Alloc object -type ReuseChunkPool struct { - mu sync.Mutex - Alloc chunk.Allocator -} - // Clean does some clean work. func (r *RetryInfo) Clean() { r.autoIncrementIDs.clean() @@ -1203,6 +1198,9 @@ type SessionVars struct { // EnableClusteredIndex indicates whether to enable clustered index when creating a new table. EnableClusteredIndex ClusteredIndexDefMode + // EnableGlobalIndex indicates whether we could create an global index on a partition table or not. + EnableGlobalIndex bool + // PresumeKeyNotExists indicates lazy existence checking is enabled. PresumeKeyNotExists bool @@ -1392,6 +1390,9 @@ type SessionVars struct { // EnableNonPreparedPlanCacheForDML indicates whether to enable non-prepared plan cache for DML statements. EnableNonPreparedPlanCacheForDML bool + // EnableFuzzyBinding indicates whether to enable fuzzy binding. + EnableFuzzyBinding bool + // PlanCacheInvalidationOnFreshStats controls if plan cache will be invalidated automatically when // related stats are analyzed after the plan cache is generated. PlanCacheInvalidationOnFreshStats bool @@ -1453,10 +1454,10 @@ type SessionVars struct { // When set to true, `col is (not) null`(`col` is index prefix column) is regarded as index filter rather than table filter. OptPrefixIndexSingleScan bool - // ChunkPool Several chunks and columns are cached - ChunkPool ReuseChunkPool - // EnableReuseCheck indicates request chunk whether use chunk alloc - EnableReuseCheck bool + // chunkPool Several chunks and columns are cached + chunkPool chunk.Allocator + // EnableReuseChunk indicates request chunk whether use chunk alloc + EnableReuseChunk bool // EnableAdvancedJoinHint indicates whether the join method hint is compatible with join order hint. EnableAdvancedJoinHint bool @@ -1482,6 +1483,7 @@ type SessionVars struct { shardRand *rand.Rand // Resource group name + // NOTE: all statement relate opeartion should use StmtCtx.ResourceGroupName instead. ResourceGroupName string // PessimisticTransactionFairLocking controls whether fair locking for pessimistic transaction @@ -1562,6 +1564,10 @@ type SessionVars struct { CompressionAlgorithm int CompressionLevel int + + // TxnEntrySizeLimit indicates indicates the max size of a entry in membuf. The default limit (from config) will be + // overwritten if this value is not 0. + TxnEntrySizeLimit uint64 } // GetOptimizerFixControlMap returns the specified value of the optimizer fix control. @@ -1600,19 +1606,13 @@ func (s *SessionVars) IsPlanReplayerCaptureEnabled() bool { return s.EnablePlanReplayerCapture || s.EnablePlanReplayedContinuesCapture } -// GetNewChunkWithCapacity Attempt to request memory from the chunk pool -// thread safety -func (s *SessionVars) GetNewChunkWithCapacity(fields []*types.FieldType, capacity int, maxCachesize int, pool chunk.Allocator) *chunk.Chunk { - if pool == nil { - return chunk.New(fields, capacity, maxCachesize) - } - s.ChunkPool.mu.Lock() - defer s.ChunkPool.mu.Unlock() - if pool.CheckReuseAllocSize() && (!s.GetUseChunkAlloc()) { - s.StmtCtx.SetUseChunkAlloc() +// GetChunkAllocator returns a vaid chunk allocator. +func (s *SessionVars) GetChunkAllocator() chunk.Allocator { + if s.chunkPool == nil { + return chunk.NewEmptyAllocator() } - chk := pool.Alloc(fields, capacity, maxCachesize) - return chk + + return s.chunkPool } // ExchangeChunkStatus give the status to preUseChunkAlloc @@ -1627,35 +1627,38 @@ func (s *SessionVars) GetUseChunkAlloc() bool { // SetAlloc Attempt to set the buffer pool address func (s *SessionVars) SetAlloc(alloc chunk.Allocator) { - if !s.EnableReuseCheck { + if !s.EnableReuseChunk { + s.chunkPool = nil + return + } + if alloc == nil { + s.chunkPool = nil return } - s.ChunkPool.Alloc = alloc + s.chunkPool = chunk.NewReuseHookAllocator( + chunk.NewSyncAllocator(alloc), + func() { + s.StmtCtx.SetUseChunkAlloc() + }, + ) } -// IsAllocValid check if chunk reuse is enable or ChunkPool is inused. +// IsAllocValid check if chunk reuse is enable or chunkPool is inused. func (s *SessionVars) IsAllocValid() bool { - if !s.EnableReuseCheck { + if !s.EnableReuseChunk { return false } - s.ChunkPool.mu.Lock() - defer s.ChunkPool.mu.Unlock() - return s.ChunkPool.Alloc != nil + return s.chunkPool != nil } -// ClearAlloc indicates stop reuse chunk -func (s *SessionVars) ClearAlloc(alloc *chunk.Allocator, b bool) { - if !b { - s.ChunkPool.Alloc = nil +// ClearAlloc indicates stop reuse chunk. If `hasErr` is true, it'll also recreate the `alloc` in parameter. +func (s *SessionVars) ClearAlloc(alloc *chunk.Allocator, hasErr bool) { + if !hasErr { + s.chunkPool = nil return } - // If an error is reported, re-apply for alloc - // Prevent the goroutine left before, affecting the execution of the next sql - // issuse 38918 - s.ChunkPool.mu.Lock() - s.ChunkPool.Alloc = nil - s.ChunkPool.mu.Unlock() + s.chunkPool = nil *alloc = chunk.NewAllocator() } @@ -1732,9 +1735,9 @@ func (s *SessionVars) RaiseWarningWhenMPPEnforced(warning string) { return } if s.StmtCtx.InExplainStmt { - s.StmtCtx.AppendWarning(errors.New(warning)) + s.StmtCtx.AppendWarning(errors.NewNoStackError(warning)) } else { - s.StmtCtx.AppendExtraWarning(errors.New(warning)) + s.StmtCtx.AppendExtraWarning(errors.NewNoStackError(warning)) } } @@ -2016,9 +2019,9 @@ func NewSessionVars(hctx HookContext) *SessionVars { EnableTiFlashReadForWriteStmt: true, ForeignKeyChecks: DefTiDBForeignKeyChecks, HookContext: hctx, - EnableReuseCheck: DefTiDBEnableReusechunk, + EnableReuseChunk: DefTiDBEnableReusechunk, preUseChunkAlloc: DefTiDBUseAlloc, - ChunkPool: ReuseChunkPool{Alloc: nil}, + chunkPool: nil, mppExchangeCompressionMode: DefaultExchangeCompressionMode, mppVersion: kv.MppVersionUnspecified, EnableLateMaterialization: DefTiDBOptEnableLateMaterialization, @@ -2026,6 +2029,7 @@ func NewSessionVars(hctx HookContext) *SessionVars { ResourceGroupName: resourcegroup.DefaultResourceGroupName, DefaultCollationForUTF8MB4: mysql.DefaultCollationName, } + vars.StmtCtx.ResourceGroupName = resourcegroup.DefaultResourceGroupName vars.KVVars = tikvstore.NewVariables(&vars.SQLKiller.Signal) vars.Concurrency = Concurrency{ indexLookupConcurrency: DefIndexLookupConcurrency, @@ -2034,6 +2038,7 @@ func NewSessionVars(hctx HookContext) *SessionVars { hashJoinConcurrency: DefTiDBHashJoinConcurrency, projectionConcurrency: DefTiDBProjectionConcurrency, distSQLScanConcurrency: DefDistSQLScanConcurrency, + analyzeDistSQLScanConcurrency: DefAnalyzeDistSQLScanConcurrency, hashAggPartialConcurrency: DefTiDBHashAggPartialConcurrency, hashAggFinalConcurrency: DefTiDBHashAggFinalConcurrency, windowConcurrency: DefTiDBWindowConcurrency, @@ -2602,7 +2607,7 @@ func (s *SessionVars) GetPrevStmtDigest() string { // LazyCheckKeyNotExists returns if we can lazy check key not exists. func (s *SessionVars) LazyCheckKeyNotExists() bool { - return s.PresumeKeyNotExists || (s.TxnCtx != nil && s.TxnCtx.IsPessimistic && !s.StmtCtx.DupKeyAsWarning) + return s.PresumeKeyNotExists || (s.TxnCtx != nil && s.TxnCtx.IsPessimistic && s.StmtCtx.ErrGroupLevel(errctx.ErrGroupDupKey) == errctx.LevelError) } // GetTemporaryTable returns a TempTable by tableInfo. @@ -2737,6 +2742,9 @@ type Concurrency struct { // distSQLScanConcurrency is the number of concurrent dist SQL scan worker. distSQLScanConcurrency int + // analyzeDistSQLScanConcurrency is the number of concurrent dist SQL scan worker when to analyze. + analyzeDistSQLScanConcurrency int + // hashJoinConcurrency is the number of concurrent hash join outer worker. // hashJoinConcurrency is deprecated, use ExecutorConcurrency instead. hashJoinConcurrency int @@ -2776,6 +2784,9 @@ type Concurrency struct { // SourceAddr is the source address of request. Available in coprocessor ONLY. SourceAddr net.TCPAddr + + // IdleTransactionTimeout indicates the maximum time duration a transaction could be idle, unit is second. + IdleTransactionTimeout int } // SetIndexLookupConcurrency set the number of concurrent index lookup worker. @@ -2793,6 +2804,11 @@ func (c *Concurrency) SetDistSQLScanConcurrency(n int) { c.distSQLScanConcurrency = n } +// SetAnalyzeDistSQLScanConcurrency set the number of concurrent dist SQL scan worker when to analyze. +func (c *Concurrency) SetAnalyzeDistSQLScanConcurrency(n int) { + c.analyzeDistSQLScanConcurrency = n +} + // SetHashJoinConcurrency set the number of concurrent hash join outer worker. func (c *Concurrency) SetHashJoinConcurrency(n int) { c.hashJoinConcurrency = n @@ -2859,6 +2875,11 @@ func (c *Concurrency) DistSQLScanConcurrency() int { return c.distSQLScanConcurrency } +// AnalyzeDistSQLScanConcurrency return the number of concurrent dist SQL scan worker when to analyze. +func (c *Concurrency) AnalyzeDistSQLScanConcurrency() int { + return c.analyzeDistSQLScanConcurrency +} + // HashJoinConcurrency return the number of concurrent hash join outer worker. func (c *Concurrency) HashJoinConcurrency() int { if c.hashJoinConcurrency != ConcurrencyUnset { @@ -3093,6 +3114,14 @@ const ( SlowLogIsWriteCacheTable = "IsWriteCacheTable" // SlowLogIsSyncStatsFailed is used to indicate whether any failure happen during sync stats SlowLogIsSyncStatsFailed = "IsSyncStatsFailed" + // SlowLogResourceGroup is the resource group name that the current session bind. + SlowLogResourceGroup = "Resource_group" + // SlowLogRRU is the read request_unit(RU) cost + SlowLogRRU = "Request_unit_read" + // SlowLogWRU is the write request_unit(RU) cost + SlowLogWRU = "Request_unit_write" + // SlowLogWaitRUDuration is the total duration for kv requests to wait available request-units. + SlowLogWaitRUDuration = "Time_queued_by_rc" ) // GenerateBinaryPlan decides whether we should record binary plan in slow log and stmt summary. @@ -3148,6 +3177,10 @@ type SlowQueryLogItems struct { UsedStats map[int64]*stmtctx.UsedStatsInfoForTable IsSyncStatsFailed bool Warnings []JSONSQLWarnForSlowLog + ResourceGroupName string + RRU float64 + WRU float64 + WaitRUDuration time.Duration } // SlowLogFormat uses for formatting slow log. @@ -3345,6 +3378,20 @@ func (s *SessionVars) SlowLogFormat(logItems *SlowQueryLogItems) string { if len(logItems.BinaryPlan) != 0 { writeSlowLogItem(&buf, SlowLogBinaryPlan, logItems.BinaryPlan) } + + if logItems.ResourceGroupName != "" { + writeSlowLogItem(&buf, SlowLogResourceGroup, logItems.ResourceGroupName) + } + if logItems.RRU > 0.0 { + writeSlowLogItem(&buf, SlowLogRRU, strconv.FormatFloat(logItems.RRU, 'f', -1, 64)) + } + if logItems.WRU > 0.0 { + writeSlowLogItem(&buf, SlowLogWRU, strconv.FormatFloat(logItems.WRU, 'f', -1, 64)) + } + if logItems.WaitRUDuration > time.Duration(0) { + writeSlowLogItem(&buf, SlowLogWaitRUDuration, strconv.FormatFloat(logItems.WaitRUDuration.Seconds(), 'f', -1, 64)) + } + if logItems.PrevStmt != "" { writeSlowLogItem(&buf, SlowLogPrevStmt, logItems.PrevStmt) } diff --git a/pkg/sessionctx/variable/session_test.go b/pkg/sessionctx/variable/session_test.go index b45046836d8fe..6f1776be7d177 100644 --- a/pkg/sessionctx/variable/session_test.go +++ b/pkg/sessionctx/variable/session_test.go @@ -258,7 +258,11 @@ func TestSlowLogFormat(t *testing.T) { # Succ: true # IsExplicitTxn: true # IsSyncStatsFailed: false -# IsWriteCacheTable: true` +# IsWriteCacheTable: true +# Resource_group: rg1 +# Request_unit_read: 50 +# Request_unit_write: 100.56 +# Time_queued_by_rc: 0.134` sql := "select * from t;" _, digest := parser.NormalizeDigest(sql) logItems := &variable.SlowQueryLogItems{ @@ -297,6 +301,10 @@ func TestSlowLogFormat(t *testing.T) { IsExplicitTxn: true, IsWriteCacheTable: true, UsedStats: map[int64]*stmtctx.UsedStatsInfoForTable{1: usedStats1, 2: usedStats2}, + ResourceGroupName: "rg1", + RRU: 50.0, + WRU: 100.56, + WaitRUDuration: 134 * time.Millisecond, } logString := seVar.SlowLogFormat(logItems) require.Equal(t, resultFields+"\n"+sql, logString) @@ -461,33 +469,33 @@ func TestGetReuseChunk(t *testing.T) { // SetAlloc efficient sessVars.SetAlloc(nil) - require.Nil(t, sessVars.ChunkPool.Alloc) + require.False(t, sessVars.IsAllocValid()) require.False(t, sessVars.GetUseChunkAlloc()) // alloc is nil ,Allocate memory from the system - chk1 := sessVars.GetNewChunkWithCapacity(fieldTypes, 10, 10, sessVars.ChunkPool.Alloc) + chk1 := sessVars.GetChunkAllocator().Alloc(fieldTypes, 10, 10) require.NotNil(t, chk1) chunkReuseMap := make(map[*chunk.Chunk]struct{}, 14) columnReuseMap := make(map[*chunk.Column]struct{}, 14) alloc := chunk.NewAllocator() - sessVars.EnableReuseCheck = true + sessVars.EnableReuseChunk = true sessVars.SetAlloc(alloc) - require.NotNil(t, sessVars.ChunkPool.Alloc) - require.Equal(t, alloc, sessVars.ChunkPool.Alloc) + require.True(t, sessVars.IsAllocValid()) require.False(t, sessVars.GetUseChunkAlloc()) //tries to apply from the cache initCap := 10 - chk1 = sessVars.GetNewChunkWithCapacity(fieldTypes, initCap, initCap, sessVars.ChunkPool.Alloc) + chk1 = sessVars.GetChunkAllocator().Alloc(fieldTypes, initCap, initCap) require.NotNil(t, chk1) chunkReuseMap[chk1] = struct{}{} for i := 0; i < chk1.NumCols(); i++ { columnReuseMap[chk1.Column(i)] = struct{}{} } + require.True(t, sessVars.GetUseChunkAlloc()) alloc.Reset() - chkres1 := sessVars.GetNewChunkWithCapacity(fieldTypes, 10, 10, sessVars.ChunkPool.Alloc) + chkres1 := sessVars.GetChunkAllocator().Alloc(fieldTypes, 10, 10) require.NotNil(t, chkres1) _, exist := chunkReuseMap[chkres1] require.True(t, exist) @@ -495,14 +503,14 @@ func TestGetReuseChunk(t *testing.T) { _, exist := columnReuseMap[chkres1.Column(i)] require.True(t, exist) } - allocpool := variable.ReuseChunkPool{Alloc: alloc} - sessVars.ClearAlloc(&allocpool.Alloc, false) - require.Equal(t, alloc, allocpool.Alloc) + var allocpool chunk.Allocator = alloc + sessVars.ClearAlloc(&allocpool, false) + require.Equal(t, alloc, allocpool) - sessVars.ClearAlloc(&allocpool.Alloc, true) - require.NotEqual(t, allocpool.Alloc, alloc) - require.Nil(t, sessVars.ChunkPool.Alloc) + sessVars.ClearAlloc(&allocpool, true) + require.NotEqual(t, allocpool, alloc) + require.False(t, sessVars.IsAllocValid()) } func TestUserVarConcurrently(t *testing.T) { diff --git a/pkg/sessionctx/variable/setvar_affect.go b/pkg/sessionctx/variable/setvar_affect.go index 24d0f09fc641e..301d709493f3d 100644 --- a/pkg/sessionctx/variable/setvar_affect.go +++ b/pkg/sessionctx/variable/setvar_affect.go @@ -56,12 +56,14 @@ var isHintUpdatableVerified = map[string]struct{}{ "tidb_index_join_batch_size": {}, "tidb_index_lookup_size": {}, "tidb_index_serial_scan_concurrency": {}, + "tidb_init_chunk_size": {}, "tidb_allow_batch_cop": {}, "tidb_allow_mpp": {}, "tidb_enforce_mpp": {}, "tidb_max_bytes_before_tiflash_external_join": {}, "tidb_max_bytes_before_tiflash_external_group_by": {}, "tidb_max_bytes_before_tiflash_external_sort": {}, + "tidb_max_chunk_size": {}, "tidb_min_paging_size": {}, "tidb_max_paging_size": {}, "tidb_enable_cascades_planner": {}, diff --git a/pkg/sessionctx/variable/statusvar.go b/pkg/sessionctx/variable/statusvar.go index aa89943404ce4..7ce4c59cb358c 100644 --- a/pkg/sessionctx/variable/statusvar.go +++ b/pkg/sessionctx/variable/statusvar.go @@ -122,9 +122,8 @@ var tlsCiphers = []uint16{ var tlsSupportedCiphers string // Taken from https://github.com/openssl/openssl/blob/c784a838e0947fcca761ee62def7d077dc06d37f/include/openssl/ssl.h#L141 . +// Update: remove tlsv1.0 and v1.1 support var tlsVersionString = map[uint16]string{ - tls.VersionTLS10: "TLSv1", - tls.VersionTLS11: "TLSv1.1", tls.VersionTLS12: "TLSv1.2", tls.VersionTLS13: "TLSv1.3", } diff --git a/pkg/sessionctx/variable/sysvar.go b/pkg/sessionctx/variable/sysvar.go index c481344a693fb..f4d95760c1293 100644 --- a/pkg/sessionctx/variable/sysvar.go +++ b/pkg/sessionctx/variable/sysvar.go @@ -33,6 +33,7 @@ import ( "github.com/pingcap/tidb/pkg/parser" "github.com/pingcap/tidb/pkg/parser/ast" "github.com/pingcap/tidb/pkg/parser/charset" + "github.com/pingcap/tidb/pkg/parser/model" "github.com/pingcap/tidb/pkg/parser/mysql" "github.com/pingcap/tidb/pkg/planner/util/fixcontrol" "github.com/pingcap/tidb/pkg/privilege/privileges/ldap" @@ -43,6 +44,7 @@ import ( "github.com/pingcap/tidb/pkg/util/collate" distroleutil "github.com/pingcap/tidb/pkg/util/distrole" "github.com/pingcap/tidb/pkg/util/gctuner" + "github.com/pingcap/tidb/pkg/util/intest" "github.com/pingcap/tidb/pkg/util/logutil" "github.com/pingcap/tidb/pkg/util/mathutil" "github.com/pingcap/tidb/pkg/util/memory" @@ -686,6 +688,7 @@ var defaultSysVars = []*SysVar{ }, }, {Scope: ScopeGlobal, Name: ValidatePasswordDictionary, Value: "", Type: TypeStr}, + {Scope: ScopeGlobal, Name: DefaultPasswordLifetime, Value: "0", Type: TypeInt, MinValue: 0, MaxValue: math.MaxUint16}, {Scope: ScopeGlobal, Name: DisconnectOnExpiredPassword, Value: On, Type: TypeBool, ReadOnly: true, GetGlobal: func(_ context.Context, s *SessionVars) (string, error) { return BoolToOnOff(!IsSandBoxModeEnabled.Load()), nil }}, @@ -705,6 +708,12 @@ var defaultSysVars = []*SysVar{ (*SetPDClientDynamicOption.Load())(TiDBEnableTSOFollowerProxy, val) return nil }}, + {Scope: ScopeGlobal, Name: PDEnableFollowerHandleRegion, Value: BoolToOnOff(DefPDEnableFollowerHandleRegion), Type: TypeBool, GetGlobal: func(_ context.Context, sv *SessionVars) (string, error) { + return BoolToOnOff(EnablePDFollowerHandleRegion.Load()), nil + }, SetGlobal: func(_ context.Context, s *SessionVars, val string) error { + (*SetPDClientDynamicOption.Load())(PDEnableFollowerHandleRegion, val) + return nil + }}, {Scope: ScopeGlobal, Name: TiDBEnableLocalTxn, Value: BoolToOnOff(DefTiDBEnableLocalTxn), Hidden: true, Type: TypeBool, Depended: true, GetGlobal: func(_ context.Context, sv *SessionVars) (string, error) { return BoolToOnOff(EnableLocalTxn.Load()), nil }, SetGlobal: func(_ context.Context, s *SessionVars, val string) error { @@ -1043,7 +1052,7 @@ var defaultSysVars = []*SysVar{ intVal = bt } if intVal > 0 && intVal < 128 { // 128 Bytes - s.StmtCtx.AppendWarning(ErrTruncatedWrongValue.GenWithStackByArgs(TiDBServerMemoryLimitSessMinSize, originalValue)) + s.StmtCtx.AppendWarning(ErrTruncatedWrongValue.FastGenByArgs(TiDBServerMemoryLimitSessMinSize, originalValue)) intVal = 128 } return strconv.FormatUint(intVal, 10), nil @@ -1213,6 +1222,10 @@ var defaultSysVars = []*SysVar{ s.EnableNonPreparedPlanCacheForDML = TiDBOptOn(val) return nil }}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBOptEnableFuzzyBinding, Value: BoolToOnOff(false), Type: TypeBool, IsHintUpdatableVerfied: true, SetSession: func(s *SessionVars, val string) error { + s.EnableFuzzyBinding = TiDBOptOn(val) + return nil + }}, {Scope: ScopeGlobal | ScopeSession, Name: TiDBNonPreparedPlanCacheSize, Value: strconv.FormatUint(uint64(DefTiDBNonPreparedPlanCacheSize), 10), Type: TypeUnsigned, MinValue: 1, MaxValue: 100000, SetSession: func(s *SessionVars, val string) error { uVal, err := strconv.ParseUint(val, 10, 64) if err == nil { @@ -1276,6 +1289,18 @@ var defaultSysVars = []*SysVar{ }, GetGlobal: func(_ context.Context, s *SessionVars) (string, error) { return BoolToOnOff(EnableDistTask.Load()), nil }}, + {Scope: ScopeGlobal, Name: TiDBDDLVersion, Value: strconv.FormatInt(model.TiDBDDLV1, 10), Type: TypeEnum, PossibleValues: []string{strconv.FormatInt(model.TiDBDDLV1, 10), strconv.FormatInt(model.TiDBDDLV2, 10)}, SetGlobal: func(_ context.Context, s *SessionVars, val string) error { + v := TidbOptInt64(val, model.TiDBDDLV1) + if DDLVersion.Load() != v { + err := SwitchDDLVersion(v) + if err != nil { + return err + } + } + return nil + }, GetGlobal: func(_ context.Context, s *SessionVars) (string, error) { + return strconv.FormatInt(DDLVersion.Load(), 10), nil + }}, {Scope: ScopeGlobal, Name: TiDBEnableNoopVariables, Value: BoolToOnOff(DefTiDBEnableNoopVariables), Type: TypeEnum, PossibleValues: []string{Off, On}, SetGlobal: func(_ context.Context, s *SessionVars, val string) error { EnableNoopVariables.Store(TiDBOptOn(val)) return nil @@ -1295,7 +1320,7 @@ var defaultSysVars = []*SysVar{ return BoolToOnOff(EnableTmpStorageOnOOM.Load()), nil }}, {Scope: ScopeGlobal, Name: TiDBAutoBuildStatsConcurrency, Value: strconv.Itoa(DefTiDBAutoBuildStatsConcurrency), Type: TypeInt, MinValue: 1, MaxValue: MaxConfigurableConcurrency}, - {Scope: ScopeGlobal, Name: TiDBSysProcScanConcurrency, Value: strconv.Itoa(DefTiDBSysProcScanConcurrency), Type: TypeInt, MinValue: 1, MaxValue: MaxConfigurableConcurrency}, + {Scope: ScopeGlobal, Name: TiDBSysProcScanConcurrency, Value: strconv.Itoa(DefTiDBSysProcScanConcurrency), Type: TypeInt, MinValue: 1, MaxValue: math.MaxInt32}, {Scope: ScopeGlobal, Name: TiDBMemoryUsageAlarmRatio, Value: strconv.FormatFloat(DefMemoryUsageAlarmRatio, 'f', -1, 64), Type: TypeFloat, MinValue: 0.0, MaxValue: 1.0, SetGlobal: func(_ context.Context, s *SessionVars, val string) error { MemoryUsageAlarmRatio.Store(tidbOptFloat64(val, DefMemoryUsageAlarmRatio)) return nil @@ -1561,7 +1586,7 @@ var defaultSysVars = []*SysVar{ if mathutil.IntBits == 32 { if val, err := strconv.ParseUint(normalizedValue, 10, 64); err == nil { if val > uint64(math.MaxUint32) { - vars.StmtCtx.AppendWarning(ErrTruncatedWrongValue.GenWithStackByArgs(GroupConcatMaxLen, originalValue)) + vars.StmtCtx.AppendWarning(ErrTruncatedWrongValue.FastGenByArgs(GroupConcatMaxLen, originalValue)) return strconv.FormatInt(int64(math.MaxUint32), 10), nil } } @@ -1598,7 +1623,7 @@ var defaultSysVars = []*SysVar{ } remainder := u % 1024 if remainder != 0 { - vars.StmtCtx.AppendWarning(ErrTruncatedWrongValue.GenWithStackByArgs(MaxAllowedPacket, normalizedValue)) + vars.StmtCtx.AppendWarning(ErrTruncatedWrongValue.FastGenByArgs(MaxAllowedPacket, normalizedValue)) u -= remainder } return strconv.FormatUint(u, 10), nil @@ -1670,6 +1695,10 @@ var defaultSysVars = []*SysVar{ s.distSQLScanConcurrency = tidbOptPositiveInt32(val, DefDistSQLScanConcurrency) return nil }}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBAnalyzeDistSQLScanConcurrency, Value: strconv.Itoa(DefAnalyzeDistSQLScanConcurrency), Type: TypeUnsigned, MinValue: 1, MaxValue: math.MaxInt32, SetSession: func(s *SessionVars, val string) error { + s.analyzeDistSQLScanConcurrency = tidbOptPositiveInt32(val, DefAnalyzeDistSQLScanConcurrency) + return nil + }}, {Scope: ScopeGlobal | ScopeSession, Name: TiDBOptInSubqToJoinAndAgg, Value: BoolToOnOff(DefOptInSubqToJoinAndAgg), Type: TypeBool, SetSession: func(s *SessionVars, val string) error { s.SetAllowInSubqToJoinAndAgg(TiDBOptOn(val)) return nil @@ -1880,6 +1909,13 @@ var defaultSysVars = []*SysVar{ s.KVVars.BackOffWeight = tidbOptPositiveInt32(val, tikvstore.DefBackOffWeight) return nil }}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBTxnEntrySizeLimit, Value: strconv.Itoa(DefTiDBTxnEntrySizeLimit), Type: TypeUnsigned, MinValue: 0, MaxValue: config.MaxTxnEntrySizeLimit, SetSession: func(s *SessionVars, val string) error { + s.TxnEntrySizeLimit = TidbOptUint64(val, DefTiDBTxnEntrySizeLimit) + return nil + }, SetGlobal: func(ctx context.Context, s *SessionVars, val string) error { + TxnEntrySizeLimit.Store(TidbOptUint64(val, DefTiDBTxnEntrySizeLimit)) + return nil + }}, {Scope: ScopeGlobal | ScopeSession, Name: TiDBRetryLimit, Value: strconv.Itoa(DefTiDBRetryLimit), Type: TypeInt, MinValue: -1, MaxValue: math.MaxInt64, SetSession: func(s *SessionVars, val string) error { s.RetryLimit = TidbOptInt64(val, DefTiDBRetryLimit) return nil @@ -1892,7 +1928,7 @@ var defaultSysVars = []*SysVar{ s.ConstraintCheckInPlace = TiDBOptOn(val) return nil }}, - {Scope: ScopeGlobal | ScopeSession, Name: TiDBTxnMode, Value: DefTiDBTxnMode, AllowEmptyAll: true, Type: TypeEnum, PossibleValues: []string{"pessimistic", "optimistic"}, SetSession: func(s *SessionVars, val string) error { + {Scope: ScopeGlobal | ScopeSession, Name: TiDBTxnMode, Value: DefTiDBTxnMode, AllowEmptyAll: true, Type: TypeEnum, PossibleValues: []string{PessimisticTxnMode, OptimisticTxnMode}, SetSession: func(s *SessionVars, val string) error { s.TxnMode = strings.ToUpper(val) return nil }}, @@ -1915,7 +1951,7 @@ var defaultSysVars = []*SysVar{ {Scope: ScopeGlobal | ScopeSession, Name: TiDBEnableFastAnalyze, Value: BoolToOnOff(DefTiDBUseFastAnalyze), Type: TypeBool, Validation: func(vars *SessionVars, normalizedValue string, originalValue string, scope ScopeFlag) (string, error) { if TiDBOptOn(normalizedValue) { - vars.StmtCtx.AppendWarning(errors.New("the fast analyze feature has already been removed in TiDB v7.5.0, so this will have no effect")) + vars.StmtCtx.AppendWarning(errors.NewNoStackError("the fast analyze feature has already been removed in TiDB v7.5.0, so this will have no effect")) } return normalizedValue, nil }, @@ -2052,6 +2088,10 @@ var defaultSysVars = []*SysVar{ s.EnableClusteredIndex = TiDBOptEnableClustered(val) return nil }}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBEnableGlobalIndex, Type: TypeBool, Value: BoolToOnOff(DefTiDBEnableGlobalIndex), SetSession: func(s *SessionVars, val string) error { + s.EnableGlobalIndex = TiDBOptOn(val) + return nil + }}, {Scope: ScopeGlobal | ScopeSession, Name: TiDBPartitionPruneMode, Value: DefTiDBPartitionPruneMode, Type: TypeEnum, PossibleValues: []string{"static", "dynamic", "static-only", "dynamic-only"}, Validation: func(vars *SessionVars, normalizedValue string, originalValue string, scope ScopeFlag) (string, error) { mode := PartitionPruneMode(normalizedValue).Update() if !mode.Valid() { @@ -2063,15 +2103,15 @@ var defaultSysVars = []*SysVar{ }, SetSession: func(s *SessionVars, val string) error { newMode := strings.ToLower(strings.TrimSpace(val)) if PartitionPruneMode(s.PartitionPruneMode.Load()) == Static && PartitionPruneMode(newMode) == Dynamic { - s.StmtCtx.AppendWarning(errors.New("Please analyze all partition tables again for consistency between partition and global stats")) - s.StmtCtx.AppendWarning(errors.New("Please avoid setting partition prune mode to dynamic at session level and set partition prune mode to dynamic at global level")) + s.StmtCtx.AppendWarning(errors.NewNoStackError("Please analyze all partition tables again for consistency between partition and global stats")) + s.StmtCtx.AppendWarning(errors.NewNoStackError("Please avoid setting partition prune mode to dynamic at session level and set partition prune mode to dynamic at global level")) } s.PartitionPruneMode.Store(newMode) return nil }, SetGlobal: func(_ context.Context, s *SessionVars, val string) error { newMode := strings.ToLower(strings.TrimSpace(val)) if PartitionPruneMode(newMode) == Dynamic { - s.StmtCtx.AppendWarning(errors.New("Please analyze all partition tables again for consistency between partition and global stats")) + s.StmtCtx.AppendWarning(errors.NewNoStackError("Please analyze all partition tables again for consistency between partition and global stats")) } return nil }}, @@ -2119,7 +2159,7 @@ var defaultSysVars = []*SysVar{ {Scope: ScopeGlobal | ScopeSession, Name: TiDBEnableExchangePartition, Value: On, Type: TypeBool, Validation: func(vars *SessionVars, s string, s2 string, flag ScopeFlag) (string, error) { if s == Off { - vars.StmtCtx.AppendWarning(errors.New("tidb_enable_exchange_partition is always turned on. This variable has been deprecated and will be removed in the future releases")) + vars.StmtCtx.AppendWarning(errors.NewNoStackError("tidb_enable_exchange_partition is always turned on. This variable has been deprecated and will be removed in the future releases")) } return On, nil }, @@ -2238,7 +2278,7 @@ var defaultSysVars = []*SysVar{ }, Validation: func(vars *SessionVars, normalizedValue string, originalValue string, scope ScopeFlag) (string, error) { intVal := TidbOptInt64(normalizedValue, DefTiDBMemQuotaQuery) if intVal > 0 && intVal < 128 { - vars.StmtCtx.AppendWarning(ErrTruncatedWrongValue.GenWithStackByArgs(TiDBMemQuotaQuery, originalValue)) + vars.StmtCtx.AppendWarning(ErrTruncatedWrongValue.FastGenByArgs(TiDBMemQuotaQuery, originalValue)) normalizedValue = "128" } return normalizedValue, nil @@ -2337,7 +2377,7 @@ var defaultSysVars = []*SysVar{ {Scope: ScopeGlobal | ScopeSession, Name: TiDBEnableTiFlashReadForWriteStmt, Value: On, Type: TypeBool, Validation: func(vars *SessionVars, s string, s2 string, flag ScopeFlag) (string, error) { if s == Off { - vars.StmtCtx.AppendWarning(errors.New("tidb_enable_tiflash_read_for_write_stmt is always turned on. This variable has been deprecated and will be removed in the future releases")) + vars.StmtCtx.AppendWarning(errors.NewNoStackError("tidb_enable_tiflash_read_for_write_stmt is always turned on. This variable has been deprecated and will be removed in the future releases")) } return On, nil }, @@ -2399,7 +2439,7 @@ var defaultSysVars = []*SysVar{ }}, {Scope: ScopeGlobal | ScopeSession, Name: TiDBEnableReusechunk, Value: BoolToOnOff(DefTiDBEnableReusechunk), Type: TypeBool, SetSession: func(s *SessionVars, val string) error { - s.EnableReuseCheck = TiDBOptOn(val) + s.EnableReuseChunk = TiDBOptOn(val) return nil }}, {Scope: ScopeGlobal, Name: TiDBIgnoreInlistPlanDigest, Value: BoolToOnOff(DefTiDBIgnoreInlistPlanDigest), Type: TypeBool, SetGlobal: func(ctx context.Context, vars *SessionVars, s string) error { @@ -2628,7 +2668,7 @@ var defaultSysVars = []*SysVar{ return err } for _, warning := range warnings { - vars.StmtCtx.AppendWarning(errors.New(warning)) + vars.StmtCtx.AppendWarning(errors.NewNoStackError(warning)) } return nil }, @@ -2638,7 +2678,7 @@ var defaultSysVars = []*SysVar{ return err } for _, warning := range warnings { - s.StmtCtx.AppendWarning(errors.New(warning)) + s.StmtCtx.AppendWarning(errors.NewNoStackError(warning)) } s.OptimizerFixControl = newMap return nil @@ -2892,7 +2932,7 @@ var defaultSysVars = []*SysVar{ chars := []rune(normalizedValue) warningAdded := false if len(chars) > 64 { - s.StmtCtx.AppendWarning(ErrTruncatedWrongValue.GenWithStackByArgs(TiDBSessionAlias, originalValue)) + s.StmtCtx.AppendWarning(ErrTruncatedWrongValue.FastGenByArgs(TiDBSessionAlias, originalValue)) warningAdded = true chars = chars[:64] normalizedValue = string(chars) @@ -2901,7 +2941,7 @@ var defaultSysVars = []*SysVar{ // truncate to a valid identifier for normalizedValue != "" && util.IsInCorrectIdentifierName(normalizedValue) { if !warningAdded { - s.StmtCtx.AppendWarning(ErrTruncatedWrongValue.GenWithStackByArgs(TiDBSessionAlias, originalValue)) + s.StmtCtx.AppendWarning(ErrTruncatedWrongValue.FastGenByArgs(TiDBSessionAlias, originalValue)) warningAdded = true } chars = chars[:len(chars)-1] @@ -2939,7 +2979,14 @@ var defaultSysVars = []*SysVar{ return normalizedValue, nil }, SetGlobal: func(ctx context.Context, vars *SessionVars, s string) error { - ServiceScope.Store(strings.ToLower(s)) + newValue := strings.ToLower(s) + ServiceScope.Store(newValue) + oldConfig := config.GetGlobalConfig() + if oldConfig.Instance.TiDBServiceScope != newValue { + newConfig := *oldConfig + newConfig.Instance.TiDBServiceScope = newValue + config.StoreGlobalConfig(&newConfig) + } return nil }, GetGlobal: func(ctx context.Context, vars *SessionVars) (string, error) { return ServiceScope.Load(), nil @@ -2949,6 +2996,42 @@ var defaultSysVars = []*SysVar{ SchemaVersionCacheLimit.Store(TidbOptInt64(val, DefTiDBSchemaVersionCacheLimit)) return nil }}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBIdleTransactionTimeout, Value: strconv.Itoa(DefTiDBIdleTransactionTimeout), Type: TypeUnsigned, MinValue: 0, MaxValue: secondsPerYear, + SetSession: func(s *SessionVars, val string) error { + s.IdleTransactionTimeout = tidbOptPositiveInt32(val, DefTiDBIdleTransactionTimeout) + return nil + }}, +} + +// GlobalSystemVariableInitialValue gets the default value for a system variable including ones that are dynamically set (e.g. based on the store) +func GlobalSystemVariableInitialValue(varName, varVal string) string { + switch varName { + case TiDBEnableAsyncCommit, TiDBEnable1PC: + if config.GetGlobalConfig().Store == "tikv" { + varVal = On + } + case TiDBMemOOMAction: + if intest.InTest { + varVal = OOMActionLog + } + case TiDBEnableAutoAnalyze: + if intest.InTest { + varVal = Off + } + // For the following sysvars, we change the default + // FOR NEW INSTALLS ONLY. In most cases you don't want to do this. + // It is better to change the value in the Sysvar struct, so that + // all installs will have the same value. + case TiDBRowFormatVersion: + varVal = strconv.Itoa(DefTiDBRowFormatV2) + case TiDBTxnAssertionLevel: + varVal = AssertionFastStr + case TiDBEnableMutationChecker: + varVal = On + case TiDBPessimisticTransactionFairLocking: + varVal = On + } + return varVal } func setTiFlashComputeDispatchPolicy(s *SessionVars, val string) error { @@ -2976,6 +3059,11 @@ var SetCharsetVariables = []string{ const ( // MaskPwd is the mask of password for LDAP variables. MaskPwd = "******" + + // PessimisticTxnMode is the name for tidb_txn_mode system variable. + PessimisticTxnMode = "pessimistic" + // OptimisticTxnMode is the name for tidb_txn_mode system variable. + OptimisticTxnMode = "optimistic" ) const ( diff --git a/pkg/sessionctx/variable/sysvar_test.go b/pkg/sessionctx/variable/sysvar_test.go index e275aa7be2fde..0408cff31d293 100644 --- a/pkg/sessionctx/variable/sysvar_test.go +++ b/pkg/sessionctx/variable/sysvar_test.go @@ -1453,3 +1453,61 @@ func TestSetTiDBCloudStorageURI(t *testing.T) { require.Len(t, val, 0) cancel() } + +func TestGlobalSystemVariableInitialValue(t *testing.T) { + vars := []struct { + name string + val string + initVal string + }{ + { + TiDBTxnMode, + DefTiDBTxnMode, + "pessimistic", + }, + { + TiDBEnableAsyncCommit, + BoolToOnOff(DefTiDBEnableAsyncCommit), + BoolToOnOff(DefTiDBEnableAsyncCommit), + }, + { + TiDBEnable1PC, + BoolToOnOff(DefTiDBEnable1PC), + BoolToOnOff(DefTiDBEnable1PC), + }, + { + TiDBMemOOMAction, + DefTiDBMemOOMAction, + OOMActionLog, + }, + { + TiDBEnableAutoAnalyze, + BoolToOnOff(DefTiDBEnableAutoAnalyze), + Off, + }, + { + TiDBRowFormatVersion, + strconv.Itoa(DefTiDBRowFormatV1), + strconv.Itoa(DefTiDBRowFormatV2), + }, + { + TiDBTxnAssertionLevel, + DefTiDBTxnAssertionLevel, + AssertionFastStr, + }, + { + TiDBEnableMutationChecker, + BoolToOnOff(DefTiDBEnableMutationChecker), + On, + }, + { + TiDBPessimisticTransactionFairLocking, + BoolToOnOff(DefTiDBPessimisticTransactionFairLocking), + On, + }, + } + for _, v := range vars { + initVal := GlobalSystemVariableInitialValue(v.name, v.val) + require.Equal(t, v.initVal, initVal) + } +} diff --git a/pkg/sessionctx/variable/tidb_vars.go b/pkg/sessionctx/variable/tidb_vars.go index 5e8f839450202..471ffd84535bb 100644 --- a/pkg/sessionctx/variable/tidb_vars.go +++ b/pkg/sessionctx/variable/tidb_vars.go @@ -22,6 +22,7 @@ import ( "github.com/pingcap/tidb/pkg/config" "github.com/pingcap/tidb/pkg/kv" + "github.com/pingcap/tidb/pkg/parser/model" "github.com/pingcap/tidb/pkg/parser/mysql" "github.com/pingcap/tidb/pkg/sessionctx/variable/featuretag/disttask" "github.com/pingcap/tidb/pkg/util/memory" @@ -298,6 +299,9 @@ const ( // If the query has a LIMIT clause, high concurrency makes the system do much more work than needed. TiDBDistSQLScanConcurrency = "tidb_distsql_scan_concurrency" + // TiDBAnalyzeDistSQLScanConcurrency is used to set the concurrency of a distsql scan task for analyze statement. + TiDBAnalyzeDistSQLScanConcurrency = "tidb_analyze_distsql_scan_concurrency" + // TiDBOptInSubqToJoinAndAgg is used to enable/disable the optimizer rule of rewriting IN subquery. TiDBOptInSubqToJoinAndAgg = "tidb_opt_insubq_to_join_and_agg" @@ -602,6 +606,9 @@ const ( // TiDBEvolvePlanBaselines indicates whether the evolution of plan baselines is enabled. TiDBEvolvePlanBaselines = "tidb_evolve_plan_baselines" + // TiDBOptEnableFuzzyBinding indicates whether to enable the universal binding. + TiDBOptEnableFuzzyBinding = "tidb_opt_enable_fuzzy_binding" + // TiDBEnableExtendedStats indicates whether the extended statistics feature is enabled. TiDBEnableExtendedStats = "tidb_enable_extended_stats" @@ -630,6 +637,9 @@ const ( // TiDBEnableClusteredIndex indicates if clustered index feature is enabled. TiDBEnableClusteredIndex = "tidb_enable_clustered_index" + // TiDBEnableGlobalIndex means if we could create an global index on a partition table or not. + TiDBEnableGlobalIndex = "tidb_enable_global_index" + // TiDBPartitionPruneMode indicates the partition prune mode used. TiDBPartitionPruneMode = "tidb_partition_prune_mode" @@ -713,6 +723,9 @@ const ( // TiDBEnableTSOFollowerProxy indicates whether to enable the TSO Follower Proxy feature of PD client. TiDBEnableTSOFollowerProxy = "tidb_enable_tso_follower_proxy" + // PDEnableFollowerHandleRegion indicates whether to enable the PD Follower handle region API. + PDEnableFollowerHandleRegion = "pd_enable_follower_handle_region" + // TiDBEnableOrderedResultMode indicates if stabilize query results. TiDBEnableOrderedResultMode = "tidb_enable_ordered_result_mode" @@ -920,6 +933,9 @@ const ( // TiDBOptObjective indicates whether the optimizer should be more stable, predictable or more aggressive. // Please see comments of SessionVars.OptObjective for details. TiDBOptObjective = "tidb_opt_objective" + + // TiDBTxnEntrySizeLimit indicates the max size of a entry in membuf. + TiDBTxnEntrySizeLimit = "tidb_txn_entry_size_limit" ) // TiDB vars that have only global scope @@ -933,7 +949,7 @@ const ( TiDBGCLifetime = "tidb_gc_life_time" // TiDBGCConcurrency sets the concurrency of garbage collection. -1 = AUTO value TiDBGCConcurrency = "tidb_gc_concurrency" - // TiDBGCScanLockMode enables the green GC feature (default) + // TiDBGCScanLockMode enables the green GC feature (deprecated) TiDBGCScanLockMode = "tidb_gc_scan_lock_mode" // TiDBGCMaxWaitTime sets max time for gc advances the safepoint delayed by active transactions TiDBGCMaxWaitTime = "tidb_gc_max_wait_time" @@ -977,6 +993,8 @@ const ( TiDBMaxAutoAnalyzeTime = "tidb_max_auto_analyze_time" // TiDBEnableDistTask indicates whether to enable the distributed execute background tasks(For example DDL, Import etc). TiDBEnableDistTask = "tidb_enable_dist_task" + // TiDBDDLVersion is used to store tidb ddl version. + TiDBDDLVersion = "tidb_ddl_version" // TiDBGenerateBinaryPlan indicates whether binary plan should be generated in slow log and statements summary. TiDBGenerateBinaryPlan = "tidb_generate_binary_plan" // TiDBEnableGCAwareMemoryTrack indicates whether to turn-on GC-aware memory track. @@ -1114,6 +1132,10 @@ const ( // TiDBEnableTiFlashPipelineMode means if we should use pipeline model to execute query or not in tiflash. // It's deprecated and setting it will not have any effect. TiDBEnableTiFlashPipelineMode = "tidb_enable_tiflash_pipeline_model" + // TiDBIdleTransactionTimeout indicates the maximum time duration a transaction could be idle, unit is second. + // Any idle transaction will be killed after being idle for `tidb_idle_transaction_timeout` seconds. + // This is similar to https://docs.percona.com/percona-server/5.7/management/innodb_kill_idle_trx.html and https://mariadb.com/kb/en/transaction-timeouts/ + TiDBIdleTransactionTimeout = "tidb_idle_transaction_timeout" ) // TiDB intentional limits @@ -1134,6 +1156,7 @@ const ( DefIndexJoinBatchSize = 25000 DefIndexLookupSize = 20000 DefDistSQLScanConcurrency = 15 + DefAnalyzeDistSQLScanConcurrency = 4 DefBuildStatsConcurrency = 2 DefBuildSamplingStatsConcurrency = 2 DefAutoAnalyzeRatio = 0.5 @@ -1206,7 +1229,7 @@ const ( DefTiFlashQuerySpillRatio = 0.7 DefTiDBEnableTiFlashPipelineMode = true DefTiDBMPPStoreFailTTL = "60s" - DefTiDBTxnMode = "" + DefTiDBTxnMode = PessimisticTxnMode DefTiDBRowFormatV1 = 1 DefTiDBRowFormatV2 = 2 DefTiDBDDLReorgWorkerCount = 4 @@ -1252,6 +1275,7 @@ const ( DefTiDBEnableCollectExecutionInfo = true DefTiDBAllowAutoRandExplicitInsert = false DefTiDBEnableClusteredIndex = ClusteredIndexDefModeOn + DefTiDBEnableGlobalIndex = false DefTiDBRedactLog = false DefTiDBRestrictedReadOnly = false DefTiDBSuperReadOnly = false @@ -1272,6 +1296,7 @@ const ( DefTiDBEnableLocalTxn = false DefTiDBTSOClientBatchMaxWaitTime = 0.0 // 0ms DefTiDBEnableTSOFollowerProxy = false + DefPDEnableFollowerHandleRegion = false DefTiDBEnableOrderedResultMode = false DefTiDBEnablePseudoForOutdatedStats = false DefTiDBRegardNULLAsPoint = true @@ -1428,6 +1453,8 @@ const ( DefTiDBOptEnableHashJoin = true DefTiDBOptObjective = OptObjectiveModerate DefTiDBSchemaVersionCacheLimit = 16 + DefTiDBIdleTransactionTimeout = 0 + DefTiDBTxnEntrySizeLimit = 0 ) // Process global variables. @@ -1456,6 +1483,7 @@ var ( EnableLocalTxn = atomic.NewBool(DefTiDBEnableLocalTxn) MaxTSOBatchWaitInterval = atomic.NewFloat64(DefTiDBTSOClientBatchMaxWaitTime) EnableTSOFollowerProxy = atomic.NewBool(DefTiDBEnableTSOFollowerProxy) + EnablePDFollowerHandleRegion = atomic.NewBool(DefPDEnableFollowerHandleRegion) RestrictedReadOnly = atomic.NewBool(DefTiDBRestrictedReadOnly) VarTiDBSuperReadOnly = atomic.NewBool(DefTiDBSuperReadOnly) PersistAnalyzeOptions = atomic.NewBool(DefTiDBPersistAnalyzeOptions) @@ -1471,6 +1499,7 @@ var ( // variables for plan cache PreparedPlanCacheMemoryGuardRatio = atomic.NewFloat64(DefTiDBPrepPlanCacheMemoryGuardRatio) EnableDistTask = atomic.NewBool(DefTiDBEnableDistTask) + DDLVersion = atomic.NewInt64(model.TiDBDDLV1) DDLForce2Queue = atomic.NewBool(false) EnableNoopVariables = atomic.NewBool(DefTiDBEnableNoopVariables) EnableMDL = atomic.NewBool(false) @@ -1528,6 +1557,7 @@ var ( SchemaVersionCacheLimit = atomic.NewInt64(DefTiDBSchemaVersionCacheLimit) CloudStorageURI = atomic.NewString("") IgnoreInlistPlanDigest = atomic.NewBool(DefTiDBIgnoreInlistPlanDigest) + TxnEntrySizeLimit = atomic.NewUint64(DefTiDBTxnEntrySizeLimit) ) var ( @@ -1545,6 +1575,8 @@ var ( EnableDDL func() error = nil // DisableDDL is the func registered by ddl to disable running ddl in this instance. DisableDDL func() error = nil + // SwitchDDLVersion is the func registered by DDL to switch DDL version. + SwitchDDLVersion func(version int64) error // SetExternalTimestamp is the func registered by staleread to set externaltimestamp in pd SetExternalTimestamp func(ctx context.Context, ts uint64) error // GetExternalTimestamp is the func registered by staleread to get externaltimestamp from pd diff --git a/pkg/sessionctx/variable/variable.go b/pkg/sessionctx/variable/variable.go index 5aff7f6724929..ee46a7736b527 100644 --- a/pkg/sessionctx/variable/variable.go +++ b/pkg/sessionctx/variable/variable.go @@ -402,11 +402,11 @@ func (sv *SysVar) checkDurationSystemVar(value string, vars *SessionVars) (strin } // Check for min/max violations if int64(d) < sv.MinValue { - vars.StmtCtx.AppendWarning(ErrTruncatedWrongValue.GenWithStackByArgs(sv.Name, value)) + vars.StmtCtx.AppendWarning(ErrTruncatedWrongValue.FastGenByArgs(sv.Name, value)) return time.Duration(sv.MinValue).String(), nil } if uint64(d) > sv.MaxValue { - vars.StmtCtx.AppendWarning(ErrTruncatedWrongValue.GenWithStackByArgs(sv.Name, value)) + vars.StmtCtx.AppendWarning(ErrTruncatedWrongValue.FastGenByArgs(sv.Name, value)) return time.Duration(sv.MaxValue).String(), nil } // return a string representation of the duration @@ -425,7 +425,7 @@ func (sv *SysVar) checkUInt64SystemVar(value string, vars *SessionVars) (string, if err != nil { return value, ErrWrongTypeForVar.GenWithStackByArgs(sv.Name) } - vars.StmtCtx.AppendWarning(ErrTruncatedWrongValue.GenWithStackByArgs(sv.Name, value)) + vars.StmtCtx.AppendWarning(ErrTruncatedWrongValue.FastGenByArgs(sv.Name, value)) return strconv.FormatInt(sv.MinValue, 10), nil } val, err := strconv.ParseUint(value, 10, 64) @@ -433,11 +433,11 @@ func (sv *SysVar) checkUInt64SystemVar(value string, vars *SessionVars) (string, return value, ErrWrongTypeForVar.GenWithStackByArgs(sv.Name) } if val < uint64(sv.MinValue) { - vars.StmtCtx.AppendWarning(ErrTruncatedWrongValue.GenWithStackByArgs(sv.Name, value)) + vars.StmtCtx.AppendWarning(ErrTruncatedWrongValue.FastGenByArgs(sv.Name, value)) return strconv.FormatInt(sv.MinValue, 10), nil } if val > sv.MaxValue { - vars.StmtCtx.AppendWarning(ErrTruncatedWrongValue.GenWithStackByArgs(sv.Name, value)) + vars.StmtCtx.AppendWarning(ErrTruncatedWrongValue.FastGenByArgs(sv.Name, value)) return strconv.FormatUint(sv.MaxValue, 10), nil } return value, nil @@ -452,11 +452,11 @@ func (sv *SysVar) checkInt64SystemVar(value string, vars *SessionVars) (string, return value, ErrWrongTypeForVar.GenWithStackByArgs(sv.Name) } if val < sv.MinValue { - vars.StmtCtx.AppendWarning(ErrTruncatedWrongValue.GenWithStackByArgs(sv.Name, value)) + vars.StmtCtx.AppendWarning(ErrTruncatedWrongValue.FastGenByArgs(sv.Name, value)) return strconv.FormatInt(sv.MinValue, 10), nil } if val > int64(sv.MaxValue) { - vars.StmtCtx.AppendWarning(ErrTruncatedWrongValue.GenWithStackByArgs(sv.Name, value)) + vars.StmtCtx.AppendWarning(ErrTruncatedWrongValue.FastGenByArgs(sv.Name, value)) return strconv.FormatUint(sv.MaxValue, 10), nil } return value, nil @@ -484,11 +484,11 @@ func (sv *SysVar) checkFloatSystemVar(value string, vars *SessionVars) (string, return value, ErrWrongTypeForVar.GenWithStackByArgs(sv.Name) } if val < float64(sv.MinValue) { - vars.StmtCtx.AppendWarning(ErrTruncatedWrongValue.GenWithStackByArgs(sv.Name, value)) + vars.StmtCtx.AppendWarning(ErrTruncatedWrongValue.FastGenByArgs(sv.Name, value)) return strconv.FormatInt(sv.MinValue, 10), nil } if val > float64(sv.MaxValue) { - vars.StmtCtx.AppendWarning(ErrTruncatedWrongValue.GenWithStackByArgs(sv.Name, value)) + vars.StmtCtx.AppendWarning(ErrTruncatedWrongValue.FastGenByArgs(sv.Name, value)) return strconv.FormatUint(sv.MaxValue, 10), nil } return value, nil diff --git a/pkg/sessionctx/variable/variable_test.go b/pkg/sessionctx/variable/variable_test.go index 99365b72d0cc4..21fafb42313f1 100644 --- a/pkg/sessionctx/variable/variable_test.go +++ b/pkg/sessionctx/variable/variable_test.go @@ -431,6 +431,9 @@ func TestIsNoop(t *testing.T) { sv = GetSysVar(ReadOnly) require.True(t, sv.IsNoop) + + sv = GetSysVar(DefaultPasswordLifetime) + require.False(t, sv.IsNoop) } // TestDefaultValuesAreSettable that sysvars defaults are logically valid. i.e. diff --git a/pkg/sessionctx/variable/varsutil.go b/pkg/sessionctx/variable/varsutil.go index 46e13f2e0a8c4..8d3262786bcc3 100644 --- a/pkg/sessionctx/variable/varsutil.go +++ b/pkg/sessionctx/variable/varsutil.go @@ -136,7 +136,7 @@ func checkDefaultCollationForUTF8MB4(vars *SessionVars, normalizedValue string, func checkCharacterSet(normalizedValue string, argName string) (string, error) { if normalizedValue == "" { - return normalizedValue, errors.Trace(ErrWrongValueForVar.GenWithStackByArgs(argName, "NULL")) + return normalizedValue, errors.Trace(ErrWrongValueForVar.FastGenByArgs(argName, "NULL")) } cs, err := charset.GetCharsetInfo(normalizedValue) if err != nil { @@ -147,14 +147,14 @@ func checkCharacterSet(normalizedValue string, argName string) (string, error) { // checkReadOnly requires TiDBEnableNoopFuncs=1 for the same scope otherwise an error will be returned. func checkReadOnly(vars *SessionVars, normalizedValue string, originalValue string, scope ScopeFlag, offlineMode bool) (string, error) { - errMsg := ErrFunctionsNoopImpl.GenWithStackByArgs("READ ONLY") + errMsg := ErrFunctionsNoopImpl.FastGenByArgs("READ ONLY") if offlineMode { - errMsg = ErrFunctionsNoopImpl.GenWithStackByArgs("OFFLINE MODE") + errMsg = ErrFunctionsNoopImpl.FastGenByArgs("OFFLINE MODE") } if TiDBOptOn(normalizedValue) { if scope == ScopeSession && vars.NoopFuncsMode != OnInt { if vars.NoopFuncsMode == OffInt { - return Off, errMsg + return Off, errors.Trace(errMsg) } vars.StmtCtx.AppendWarning(errMsg) } @@ -164,7 +164,7 @@ func checkReadOnly(vars *SessionVars, normalizedValue string, originalValue stri return originalValue, errUnknownSystemVariable.GenWithStackByArgs(TiDBEnableNoopFuncs) } if val == Off { - return Off, errMsg + return Off, errors.Trace(errMsg) } if val == Warn { vars.StmtCtx.AppendWarning(errMsg) @@ -176,7 +176,7 @@ func checkReadOnly(vars *SessionVars, normalizedValue string, originalValue stri func checkIsolationLevel(vars *SessionVars, normalizedValue string, originalValue string, scope ScopeFlag) (string, error) { if normalizedValue == "SERIALIZABLE" || normalizedValue == "READ-UNCOMMITTED" { - returnErr := ErrUnsupportedIsolationLevel.GenWithStackByArgs(normalizedValue) + returnErr := ErrUnsupportedIsolationLevel.FastGenByArgs(normalizedValue) if !TiDBOptOn(vars.systems[TiDBSkipIsolationLevelCheck]) { return normalizedValue, ErrUnsupportedIsolationLevel.GenWithStackByArgs(normalizedValue) } @@ -362,7 +362,7 @@ func tidbOptFloat64(opt string, defaultVal float64) float64 { func parseMemoryLimit(s *SessionVars, normalizedValue string, originalValue string) (byteSize uint64, normalizedStr string, err error) { defer func() { if err == nil && byteSize > 0 && byteSize < (512<<20) { - s.StmtCtx.AppendWarning(ErrTruncatedWrongValue.GenWithStackByArgs(TiDBServerMemoryLimit, originalValue)) + s.StmtCtx.AppendWarning(ErrTruncatedWrongValue.FastGenByArgs(TiDBServerMemoryLimit, originalValue)) byteSize = 512 << 20 normalizedStr = "512MB" } diff --git a/pkg/sessiontxn/isolation/main_test.go b/pkg/sessiontxn/isolation/main_test.go index d6814c0d71f78..1c14db4138442 100644 --- a/pkg/sessiontxn/isolation/main_test.go +++ b/pkg/sessiontxn/isolation/main_test.go @@ -39,6 +39,7 @@ func TestMain(m *testing.M) { tikv.EnableFailpoints() opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), diff --git a/pkg/sessiontxn/staleread/BUILD.bazel b/pkg/sessiontxn/staleread/BUILD.bazel index 409cbd1ef7280..5ac9cf58bb4d0 100644 --- a/pkg/sessiontxn/staleread/BUILD.bazel +++ b/pkg/sessiontxn/staleread/BUILD.bazel @@ -55,6 +55,7 @@ go_test( "//pkg/parser/auth", "//pkg/sessionctx", "//pkg/sessiontxn", + "//pkg/store/mockstore", "//pkg/table/temptable", "//pkg/testkit", "//pkg/testkit/testsetup", diff --git a/pkg/sessiontxn/staleread/main_test.go b/pkg/sessiontxn/staleread/main_test.go index afdeee22b656a..bcb42bb80fb48 100644 --- a/pkg/sessiontxn/staleread/main_test.go +++ b/pkg/sessiontxn/staleread/main_test.go @@ -26,6 +26,7 @@ func TestMain(m *testing.M) { tikv.EnableFailpoints() opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), diff --git a/pkg/sessiontxn/staleread/processor_test.go b/pkg/sessiontxn/staleread/processor_test.go index 8a7e9813301ba..9f6adc817a46d 100644 --- a/pkg/sessiontxn/staleread/processor_test.go +++ b/pkg/sessiontxn/staleread/processor_test.go @@ -28,6 +28,7 @@ import ( "github.com/pingcap/tidb/pkg/parser/ast" "github.com/pingcap/tidb/pkg/sessionctx" "github.com/pingcap/tidb/pkg/sessiontxn/staleread" + "github.com/pingcap/tidb/pkg/store/mockstore" "github.com/pingcap/tidb/pkg/table/temptable" "github.com/pingcap/tidb/pkg/testkit" "github.com/stretchr/testify/require" @@ -103,7 +104,7 @@ func getCurrentExternalTimestamp(t *testing.T, tk *testkit.TestKit) uint64 { } func TestStaleReadProcessorWithSelectTable(t *testing.T) { - store := testkit.CreateMockStore(t) + store := testkit.CreateMockStore(t, mockstore.WithStoreType(mockstore.EmbedUnistore)) tk := testkit.NewTestKit(t, store) tn := astTableWithAsOf(t, "") p1 := genStaleReadPoint(t, tk) @@ -229,7 +230,7 @@ func TestStaleReadProcessorWithSelectTable(t *testing.T) { } func TestStaleReadProcessorWithExecutePreparedStmt(t *testing.T) { - store := testkit.CreateMockStore(t) + store := testkit.CreateMockStore(t, mockstore.WithStoreType(mockstore.EmbedUnistore)) tk := testkit.NewTestKit(t, store) p1 := genStaleReadPoint(t, tk) //p2 := genStaleReadPoint(t, tk) diff --git a/pkg/sessiontxn/txn_context_test.go b/pkg/sessiontxn/txn_context_test.go index 4a2e58027cf30..acfb4e3e0b211 100644 --- a/pkg/sessiontxn/txn_context_test.go +++ b/pkg/sessiontxn/txn_context_test.go @@ -40,6 +40,7 @@ func TestMain(m *testing.M) { testsetup.SetupForCommonTest() opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), diff --git a/pkg/statistics/BUILD.bazel b/pkg/statistics/BUILD.bazel index d6a2cb58b6c10..6997f6ceb6d1e 100644 --- a/pkg/statistics/BUILD.bazel +++ b/pkg/statistics/BUILD.bazel @@ -43,6 +43,7 @@ go_library( "//pkg/util/dbterror", "//pkg/util/fastrand", "//pkg/util/hack", + "//pkg/util/intest", "//pkg/util/logutil", "//pkg/util/memory", "//pkg/util/ranger", @@ -77,7 +78,7 @@ go_test( data = glob(["testdata/**"]), embed = [":statistics"], flaky = True, - shard_count = 34, + shard_count = 35, deps = [ "//pkg/config", "//pkg/parser/ast", diff --git a/pkg/statistics/analyze.go b/pkg/statistics/analyze.go index c836ca153520b..f14b5b59342b7 100644 --- a/pkg/statistics/analyze.go +++ b/pkg/statistics/analyze.go @@ -74,6 +74,9 @@ func (a *AnalyzeResult) DestroyAndPutToPool() { for _, f := range a.Fms { f.DestroyAndPutToPool() } + for _, h := range a.Hist { + h.DestroyAndPutToPool() + } } // AnalyzeResults represents the analyze results of a task. diff --git a/pkg/statistics/builder.go b/pkg/statistics/builder.go index 914760f0980c5..c71247f9bb078 100644 --- a/pkg/statistics/builder.go +++ b/pkg/statistics/builder.go @@ -127,7 +127,7 @@ func BuildColumnHist(ctx sessionctx.Context, numBuckets, id int64, collector *Sa } sc := ctx.GetSessionVars().StmtCtx samples := collector.Samples - samples, err := SortSampleItems(sc, samples) + err := sortSampleItems(sc, samples) if err != nil { return nil, err } @@ -241,6 +241,7 @@ func BuildHistAndTopN( tp *types.FieldType, isColumn bool, memTracker *memory.Tracker, + needExtStats bool, ) (*Histogram, *TopN, error) { bufferedMemSize := int64(0) bufferedReleaseSize := int64(0) @@ -278,8 +279,15 @@ func BuildHistAndTopN( return NewHistogram(id, ndv, nullCount, 0, tp, 0, collector.TotalSize), nil, nil } sc := ctx.GetSessionVars().StmtCtx - samples := collector.Samples - samples, err := SortSampleItems(sc, samples) + var samples []*SampleItem + // if we need to build extended stats, we need to copy the samples to avoid modifying the original samples. + if needExtStats { + samples = make([]*SampleItem, len(collector.Samples)) + copy(samples, collector.Samples) + } else { + samples = collector.Samples + } + err := sortSampleItems(sc, samples) if err != nil { return nil, nil, err } @@ -305,7 +313,9 @@ func BuildHistAndTopN( if isColumn { corrXYSum += float64(i) * float64(samples[i].Ordinal) } - + if numTopN == 0 { + continue + } sampleBytes, err := getComparedBytes(samples[i].Value) if err != nil { return nil, nil, errors.Trace(err) @@ -350,77 +360,79 @@ func BuildHistAndTopN( // Handle the counting for the last value. Basically equal to the case 2 above. // now topn is empty: append the "current" count directly - if len(topNList) == 0 { - topNList = append(topNList, TopNMeta{Encoded: cur, Count: uint64(curCnt)}) - } else if len(topNList) < numTopN || uint64(curCnt) > topNList[len(topNList)-1].Count { - // now topn is not full, or the "current" count is larger than the least count in the topn: need to find a slot to insert the "current" - j := len(topNList) - for ; j > 0; j-- { - if uint64(curCnt) < topNList[j-1].Count { - break + if numTopN != 0 { + if len(topNList) == 0 { + topNList = append(topNList, TopNMeta{Encoded: cur, Count: uint64(curCnt)}) + } else if len(topNList) < numTopN || uint64(curCnt) > topNList[len(topNList)-1].Count { + // now topn is not full, or the "current" count is larger than the least count in the topn: need to find a slot to insert the "current" + j := len(topNList) + for ; j > 0; j-- { + if uint64(curCnt) < topNList[j-1].Count { + break + } + } + topNList = append(topNList, TopNMeta{}) + copy(topNList[j+1:], topNList[j:]) + topNList[j] = TopNMeta{Encoded: cur, Count: uint64(curCnt)} + if len(topNList) > numTopN { + topNList = topNList[:numTopN] } - } - topNList = append(topNList, TopNMeta{}) - copy(topNList[j+1:], topNList[j:]) - topNList[j] = TopNMeta{Encoded: cur, Count: uint64(curCnt)} - if len(topNList) > numTopN { - topNList = topNList[:numTopN] } } topNList = pruneTopNItem(topNList, ndv, nullCount, sampleNum, count) // Step2: exclude topn from samples - for i := int64(0); i < int64(len(samples)); i++ { - sampleBytes, err := getComparedBytes(samples[i].Value) - if err != nil { - return nil, nil, errors.Trace(err) - } - // For debugging invalid sample data. - var ( - foundTwice bool - firstTimeSample types.Datum - ) - for j := 0; j < len(topNList); j++ { - if bytes.Equal(sampleBytes, topNList[j].Encoded) { - // This should never happen, but we met this panic before, so we add this check here. - // See: https://github.com/pingcap/tidb/issues/35948 - if foundTwice { - datumString, err := firstTimeSample.ToString() - if err != nil { - statslogutil.StatsLogger.Error("try to convert datum to string failed", zap.Error(err)) - } + if numTopN != 0 { + for i := int64(0); i < int64(len(samples)); i++ { + sampleBytes, err := getComparedBytes(samples[i].Value) + if err != nil { + return nil, nil, errors.Trace(err) + } + // For debugging invalid sample data. + var ( + foundTwice bool + firstTimeSample types.Datum + ) + for j := 0; j < len(topNList); j++ { + if bytes.Equal(sampleBytes, topNList[j].Encoded) { + // This should never happen, but we met this panic before, so we add this check here. + // See: https://github.com/pingcap/tidb/issues/35948 + if foundTwice { + datumString, err := firstTimeSample.ToString() + if err != nil { + statslogutil.StatsLogger().Error("try to convert datum to string failed", zap.Error(err)) + } - statslogutil.StatsLogger.Warn( - "invalid sample data", - zap.Bool("isColumn", isColumn), - zap.Int64("columnID", id), - zap.String("datum", datumString), - zap.Binary("sampleBytes", sampleBytes), - zap.Binary("topNBytes", topNList[j].Encoded), - ) - // NOTE: if we don't return here, we may meet panic in the following code. - // The i may decrease to a negative value. - // We haven't fix the issue here, because we don't know how to - // remove the invalid sample data from the samples. - break + statslogutil.StatsLogger().Warn( + "invalid sample data", + zap.Bool("isColumn", isColumn), + zap.Int64("columnID", id), + zap.String("datum", datumString), + zap.Binary("sampleBytes", sampleBytes), + zap.Binary("topNBytes", topNList[j].Encoded), + ) + // NOTE: if we don't return here, we may meet panic in the following code. + // The i may decrease to a negative value. + // We haven't fix the issue here, because we don't know how to + // remove the invalid sample data from the samples. + break + } + // First time to find the same value in topN: need to record the sample data for debugging. + firstTimeSample = samples[i].Value + // Found the same value in topn: need to skip over this value in samples. + copy(samples[i:], samples[uint64(i)+topNList[j].Count:]) + samples = samples[:uint64(len(samples))-topNList[j].Count] + i-- + foundTwice = true + continue } - // First time to find the same value in topN: need to record the sample data for debugging. - firstTimeSample = samples[i].Value - // Found the same value in topn: need to skip over this value in samples. - copy(samples[i:], samples[uint64(i)+topNList[j].Count:]) - samples = samples[:uint64(len(samples))-topNList[j].Count] - i-- - foundTwice = true - continue } } } - for i := 0; i < len(topNList); i++ { - topNList[i].Count *= uint64(sampleFactor) - } topn := &TopN{TopN: topNList} + topn.Scale(sampleFactor) if uint64(count) <= topn.TotalCount() || int(hg.NDV) <= len(topn.TopN) { // TopN includes all sample data @@ -443,7 +455,7 @@ func BuildHistAndTopN( // We assume that the ones not in the top-n list's selectivity is 1/remained_ndv which is the internal implementation of EqualRowCount func pruneTopNItem(topns []TopNMeta, ndv, nullCount, sampleRows, totalRows int64) []TopNMeta { // If the sampleRows holds all rows, or NDV of samples equals to actual NDV, we just return the TopN directly. - if sampleRows == totalRows || totalRows <= 1 || int64(len(topns)) >= ndv { + if sampleRows == totalRows || totalRows <= 1 || int64(len(topns)) >= ndv || len(topns) == 0 { return topns } // Sum the occurrence except the least common one from the top-n list. To check whether the lest common one is worth diff --git a/pkg/statistics/builder_ext_stats.go b/pkg/statistics/builder_ext_stats.go index 4be47ffbfc2cd..098e6b35203e3 100644 --- a/pkg/statistics/builder_ext_stats.go +++ b/pkg/statistics/builder_ext_stats.go @@ -105,7 +105,7 @@ func fillExtStatsCorrVals(sctx sessionctx.Context, item *ExtendedStatsItem, cols sc := sctx.GetSessionVars().StmtCtx var err error - samplesX, err = SortSampleItems(sc, samplesX) + err = sortSampleItems(sc, samplesX) if err != nil { return nil } @@ -118,7 +118,9 @@ func fillExtStatsCorrVals(sctx sessionctx.Context, item *ExtendedStatsItem, cols itemY.Ordinal = i samplesYInXOrder = append(samplesYInXOrder, itemY) } - samplesYInYOrder, err := SortSampleItems(sc, samplesYInXOrder) + samplesYInYOrder := make([]*SampleItem, len(samplesYInXOrder)) + copy(samplesYInYOrder, samplesYInXOrder) + err = sortSampleItems(sc, samplesYInYOrder) if err != nil { return nil } diff --git a/pkg/statistics/builder_test.go b/pkg/statistics/builder_test.go index 54f2875c399cd..237d808a6cd7d 100644 --- a/pkg/statistics/builder_test.go +++ b/pkg/statistics/builder_test.go @@ -15,6 +15,7 @@ package statistics import ( + "math/rand" "testing" "github.com/pingcap/tidb/pkg/parser/mysql" @@ -26,6 +27,7 @@ import ( // BenchmarkBuildHistAndTopN is used to benchmark the performance of BuildHistAndTopN. // go test -benchmem -run=^$ -bench ^BenchmarkBuildHistAndTopN$ github.com/pingcap/tidb/pkg/statistics +// * The NDV is 1000000 func BenchmarkBuildHistAndTopN(b *testing.B) { ctx := mock.NewContext() const cnt = 1000_000 @@ -72,6 +74,59 @@ func BenchmarkBuildHistAndTopN(b *testing.B) { memoryTracker := memory.NewTracker(10, 1024*1024*1024) b.ResetTimer() for i := 0; i < b.N; i++ { - _, _, _ = BuildHistAndTopN(ctx, 256, 500, 0, collector, filedType, true, memoryTracker) + _, _, _ = BuildHistAndTopN(ctx, 256, 500, 0, collector, filedType, true, memoryTracker, false) + } +} + +// BenchmarkBuildHistAndTopNWithLowNDV is used to benchmark the performance of BuildHistAndTopN with low NDV. +// go test -benchmem -run=^$ -bench ^BenchmarkBuildHistAndTopNWithLowNDV github.com/pingcap/tidb/pkg/statistics +// * NDV is 102 +func BenchmarkBuildHistAndTopNWithLowNDV(b *testing.B) { + ctx := mock.NewContext() + const cnt = 1000_000 + sketch := NewFMSketch(cnt) + data := make([]*SampleItem, 0, 8) + total := 0 + for i := 1; i <= 1_000; i++ { + total++ + d := types.NewIntDatum(int64(1000)) + err := sketch.InsertValue(ctx.GetSessionVars().StmtCtx, d) + require.NoError(b, err) + data = append(data, &SampleItem{Value: d}) + } + for i := 1; i <= 1_000; i++ { + total++ + d := types.NewIntDatum(int64(2000)) + err := sketch.InsertValue(ctx.GetSessionVars().StmtCtx, d) + require.NoError(b, err) + data = append(data, &SampleItem{Value: d}) + } + end := total / 2 + for i := 0; i < end; i++ { + total++ + d := types.NewIntDatum(rand.Int63n(50)) + err := sketch.InsertValue(ctx.GetSessionVars().StmtCtx, d) + require.NoError(b, err) + data = append(data, &SampleItem{Value: d}) + } + end = cnt - total + for i := 0; i < end; i++ { + d := types.NewIntDatum(rand.Int63n(100)) + err := sketch.InsertValue(ctx.GetSessionVars().StmtCtx, d) + require.NoError(b, err) + data = append(data, &SampleItem{Value: d}) + } + collector := &SampleCollector{ + Samples: data, + NullCount: 0, + Count: int64(len(data)), + FMSketch: sketch, + TotalSize: int64(len(data)) * 8, + } + filedType := types.NewFieldType(mysql.TypeLong) + memoryTracker := memory.NewTracker(10, 1024*1024*1024) + b.ResetTimer() + for i := 0; i < b.N; i++ { + _, _, _ = BuildHistAndTopN(ctx, 256, 500, 0, collector, filedType, true, memoryTracker, false) } } diff --git a/pkg/statistics/cmsketch.go b/pkg/statistics/cmsketch.go index 5851749238052..ff30aea0c89e4 100644 --- a/pkg/statistics/cmsketch.go +++ b/pkg/statistics/cmsketch.go @@ -536,6 +536,13 @@ type TopN struct { TopN []TopNMeta } +// Scale scales the TopN by the given factor. +func (c *TopN) Scale(scaleFactor float64) { + for i := range c.TopN { + c.TopN[i].Count = uint64(float64(c.TopN[i].Count) * scaleFactor) + } +} + // AppendTopN appends a topn into the TopN struct. func (c *TopN) AppendTopN(data []byte, count uint64) { if c == nil { @@ -854,8 +861,8 @@ func SortTopnMeta(topnMetas []TopNMeta) { // TopnMetaCompare compare topnMeta func TopnMetaCompare(i, j TopNMeta) int { - c := cmp.Compare(i.Count, j.Count) - if c == 0 { + c := cmp.Compare(j.Count, i.Count) + if c != 0 { return c } return bytes.Compare(i.Encoded, j.Encoded) diff --git a/pkg/statistics/cmsketch_test.go b/pkg/statistics/cmsketch_test.go index 0258fc0630102..f97663e443ae6 100644 --- a/pkg/statistics/cmsketch_test.go +++ b/pkg/statistics/cmsketch_test.go @@ -266,3 +266,23 @@ func TestSortTopnMeta(t *testing.T) { SortTopnMeta(data) require.Equal(t, uint64(2), data[0].Count) } + +func TestTopNScale(t *testing.T) { + for _, scaleFactor := range []float64{0.9999, 1.00001, 1.9999, 4.9999, 5.001, 9.99} { + var data []TopNMeta + sumCount := uint64(0) + for i := 0; i < 20; i++ { + cnt := uint64(rand.Intn(100000)) + data = append(data, TopNMeta{ + Count: cnt, + }) + sumCount += cnt + } + topN := TopN{TopN: data} + topN.Scale(scaleFactor) + scaleCount := float64(sumCount) * scaleFactor + delta := math.Abs(float64(topN.TotalCount()) - scaleCount) + roundErrorRatio := delta / scaleCount + require.Less(t, roundErrorRatio, 0.0001) + } +} diff --git a/pkg/statistics/column.go b/pkg/statistics/column.go index 5f2d38efdf011..507a72c2e04a3 100644 --- a/pkg/statistics/column.go +++ b/pkg/statistics/column.go @@ -15,8 +15,6 @@ package statistics import ( - "strconv" - "github.com/pingcap/tidb/pkg/parser/model" "github.com/pingcap/tidb/pkg/parser/mysql" "github.com/pingcap/tidb/pkg/planner/util/debugtrace" @@ -168,7 +166,9 @@ func (c *Column) IsInvalid( if (!c.IsStatsInitialized() || c.IsLoadNeeded()) && stmtctx != nil { if stmtctx.StatsLoad.Timeout > 0 { logutil.BgLogger().Warn("Hist for column should already be loaded as sync but not found.", - zap.String(strconv.FormatInt(c.Info.ID, 10), c.Info.Name.O)) + zap.Int64("table_id", c.PhysicalID), + zap.Int64("column_id", c.Info.ID), + zap.String("column_name", c.Info.Name.O)) } // In some tests, the c.Info is not set, so we add this check here. // When we are using stats from PseudoTable(), the table ID will possibly be -1. diff --git a/pkg/statistics/fmsketch.go b/pkg/statistics/fmsketch.go index 7df6878752353..147702545f488 100644 --- a/pkg/statistics/fmsketch.go +++ b/pkg/statistics/fmsketch.go @@ -217,16 +217,7 @@ func (s *FMSketch) MemoryUsage() (sum int64) { } func (s *FMSketch) reset() { - // not use hashset.Clear, it will release all memory and Not conducive to memory reuse. - // the size of set is not more than 10000. - set := make([]uint64, 0, s.hashset.Count()) - s.hashset.Iter(func(k uint64, v bool) (stop bool) { - set = append(set, k) - return false - }) - for _, k := range set { - s.hashset.Delete(k) - } + s.hashset.Clear() s.mask = 0 s.maxSize = 0 } diff --git a/pkg/statistics/handle/autoanalyze/BUILD.bazel b/pkg/statistics/handle/autoanalyze/BUILD.bazel index 45fe7126994c1..af5cfac537d75 100644 --- a/pkg/statistics/handle/autoanalyze/BUILD.bazel +++ b/pkg/statistics/handle/autoanalyze/BUILD.bazel @@ -6,23 +6,21 @@ go_library( importpath = "github.com/pingcap/tidb/pkg/statistics/handle/autoanalyze", visibility = ["//visibility:public"], deps = [ + "//pkg/domain/infosync", "//pkg/infoschema", - "//pkg/metrics", - "//pkg/parser/ast", "//pkg/parser/model", "//pkg/sessionctx", "//pkg/sessionctx/variable", "//pkg/statistics", + "//pkg/statistics/handle/autoanalyze/exec", + "//pkg/statistics/handle/lockstats", "//pkg/statistics/handle/logutil", "//pkg/statistics/handle/types", "//pkg/statistics/handle/util", - "//pkg/table", "//pkg/types", "//pkg/util", - "//pkg/util/chunk", "//pkg/util/logutil", "//pkg/util/sqlescape", - "//pkg/util/sqlexec", "//pkg/util/timeutil", "@com_github_pingcap_errors//:errors", "@com_github_pingcap_failpoint//:failpoint", @@ -35,13 +33,24 @@ go_test( timeout = "short", srcs = ["autoanalyze_test.go"], flaky = True, - shard_count = 6, + shard_count = 11, deps = [ ":autoanalyze", + "//pkg/domain/infosync", "//pkg/parser/model", + "//pkg/parser/mysql", + "//pkg/sessionctx", + "//pkg/sessionctx/variable", "//pkg/statistics", + "//pkg/statistics/handle/util", + "//pkg/statistics/handle/util/test", "//pkg/testkit", + "//pkg/types", + "//pkg/util/chunk", + "//pkg/util/sqlexec/mock", + "@com_github_pingcap_failpoint//:failpoint", "@com_github_stretchr_testify//require", "@com_github_tikv_client_go_v2//oracle", + "@org_uber_go_mock//gomock", ], ) diff --git a/pkg/statistics/handle/autoanalyze/autoanalyze.go b/pkg/statistics/handle/autoanalyze/autoanalyze.go index 66f9ed161d564..df4c559a4c47d 100644 --- a/pkg/statistics/handle/autoanalyze/autoanalyze.go +++ b/pkg/statistics/handle/autoanalyze/autoanalyze.go @@ -15,32 +15,32 @@ package autoanalyze import ( + "context" "fmt" "math" "math/rand" + "net" "strconv" "strings" "time" "github.com/pingcap/errors" "github.com/pingcap/failpoint" + "github.com/pingcap/tidb/pkg/domain/infosync" "github.com/pingcap/tidb/pkg/infoschema" - "github.com/pingcap/tidb/pkg/metrics" - "github.com/pingcap/tidb/pkg/parser/ast" "github.com/pingcap/tidb/pkg/parser/model" "github.com/pingcap/tidb/pkg/sessionctx" "github.com/pingcap/tidb/pkg/sessionctx/variable" "github.com/pingcap/tidb/pkg/statistics" + "github.com/pingcap/tidb/pkg/statistics/handle/autoanalyze/exec" + "github.com/pingcap/tidb/pkg/statistics/handle/lockstats" statslogutil "github.com/pingcap/tidb/pkg/statistics/handle/logutil" statstypes "github.com/pingcap/tidb/pkg/statistics/handle/types" statsutil "github.com/pingcap/tidb/pkg/statistics/handle/util" - "github.com/pingcap/tidb/pkg/table" "github.com/pingcap/tidb/pkg/types" "github.com/pingcap/tidb/pkg/util" - "github.com/pingcap/tidb/pkg/util/chunk" "github.com/pingcap/tidb/pkg/util/logutil" "github.com/pingcap/tidb/pkg/util/sqlescape" - "github.com/pingcap/tidb/pkg/util/sqlexec" "github.com/pingcap/tidb/pkg/util/timeutil" "go.uber.org/zap" ) @@ -76,10 +76,168 @@ func (sa *statsAnalyze) DeleteAnalyzeJobs(updateTime time.Time) error { }) } -// HandleAutoAnalyze analyzes the newly created table or index. -func (sa *statsAnalyze) HandleAutoAnalyze(is infoschema.InfoSchema) (analyzed bool) { +// CleanupCorruptedAnalyzeJobsOnCurrentInstance cleans up the potentially corrupted analyze job. +// It only cleans up the jobs that are associated with the current instance. +func (sa *statsAnalyze) CleanupCorruptedAnalyzeJobsOnCurrentInstance(currentRunningProcessIDs map[uint64]struct{}) error { + return statsutil.CallWithSCtx(sa.statsHandle.SPool(), func(sctx sessionctx.Context) error { + return CleanupCorruptedAnalyzeJobsOnCurrentInstance(sctx, currentRunningProcessIDs) + }, statsutil.FlagWrapTxn) +} + +// CleanupCorruptedAnalyzeJobsOnDeadInstances removes analyze jobs that may have been corrupted. +// Specifically, it removes jobs associated with instances that no longer exist in the cluster. +func (sa *statsAnalyze) CleanupCorruptedAnalyzeJobsOnDeadInstances() error { + return statsutil.CallWithSCtx(sa.statsHandle.SPool(), func(sctx sessionctx.Context) error { + return CleanupCorruptedAnalyzeJobsOnDeadInstances(sctx) + }, statsutil.FlagWrapTxn) +} + +// SelectAnalyzeJobsOnCurrentInstanceSQL is the SQL to select the analyze jobs whose +// state is `pending` or `running` and the update time is more than 10 minutes ago +// and the instance is current instance. +const SelectAnalyzeJobsOnCurrentInstanceSQL = `SELECT id, process_id + FROM mysql.analyze_jobs + WHERE instance = %? + AND state IN ('pending', 'running') + AND update_time < CONVERT_TZ(%?, '+00:00', @@TIME_ZONE)` + +// SelectAnalyzeJobsSQL is the SQL to select the analyze jobs whose +// state is `pending` or `running` and the update time is more than 10 minutes ago. +const SelectAnalyzeJobsSQL = `SELECT id, instance + FROM mysql.analyze_jobs + WHERE state IN ('pending', 'running') + AND update_time < CONVERT_TZ(%?, '+00:00', @@TIME_ZONE)` + +// BatchUpdateAnalyzeJobSQL is the SQL to update the analyze jobs to `failed` state. +const BatchUpdateAnalyzeJobSQL = `UPDATE mysql.analyze_jobs + SET state = 'failed', + fail_reason = 'TiDB Server is down when running the analyze job', + process_id = NULL + WHERE id IN (%?)` + +func tenMinutesAgo() string { + return time.Now().Add(-10 * time.Minute).UTC().Format(types.TimeFormat) +} + +// CleanupCorruptedAnalyzeJobsOnCurrentInstance cleans up the potentially corrupted analyze job from current instance. +// Exported for testing. +func CleanupCorruptedAnalyzeJobsOnCurrentInstance( + sctx sessionctx.Context, + currentRunningProcessIDs map[uint64]struct{}, +) error { + serverInfo, err := infosync.GetServerInfo() + if err != nil { + return errors.Trace(err) + } + instance := net.JoinHostPort(serverInfo.IP, strconv.Itoa(int(serverInfo.Port))) + // Get all the analyze jobs whose state is `pending` or `running` and the update time is more than 10 minutes ago + // and the instance is current instance. + rows, _, err := statsutil.ExecRows( + sctx, + SelectAnalyzeJobsOnCurrentInstanceSQL, + instance, + tenMinutesAgo(), + ) + if err != nil { + return errors.Trace(err) + } + + jobIDs := make([]string, 0, len(rows)) + for _, row := range rows { + // The process ID is typically non-null for running or pending jobs. + // However, in rare cases(I don't which case), it may be null. Therefore, it's necessary to check its value. + if !row.IsNull(1) { + processID := row.GetUint64(1) + // If the process id is not in currentRunningProcessIDs, we need to clean up the job. + // They don't belong to current instance any more. + if _, ok := currentRunningProcessIDs[processID]; !ok { + jobID := row.GetUint64(0) + jobIDs = append(jobIDs, strconv.FormatUint(jobID, 10)) + } + } + } + + // Do a batch update to clean up the jobs. + if len(jobIDs) > 0 { + _, _, err = statsutil.ExecRows( + sctx, + BatchUpdateAnalyzeJobSQL, + jobIDs, + ) + if err != nil { + return errors.Trace(err) + } + statslogutil.StatsLogger().Info( + "clean up the potentially corrupted analyze jobs from current instance", + zap.Strings("jobIDs", jobIDs), + ) + } + + return nil +} + +// CleanupCorruptedAnalyzeJobsOnDeadInstances cleans up the potentially corrupted analyze job from dead instances. +func CleanupCorruptedAnalyzeJobsOnDeadInstances( + sctx sessionctx.Context, +) error { + rows, _, err := statsutil.ExecRows( + sctx, + SelectAnalyzeJobsSQL, + tenMinutesAgo(), + ) + if err != nil { + return errors.Trace(err) + } + if len(rows) == 0 { + return nil + } + + // Get all the instances from etcd. + serverInfo, err := infosync.GetAllServerInfo(context.Background()) + if err != nil { + return errors.Trace(err) + } + instances := make(map[string]struct{}, len(serverInfo)) + for _, info := range serverInfo { + instance := net.JoinHostPort(info.IP, strconv.Itoa(int(info.Port))) + instances[instance] = struct{}{} + } + + jobIDs := make([]string, 0, len(rows)) + for _, row := range rows { + // If the instance is not in instances, we need to clean up the job. + // It means the instance is down or the instance is not in the cluster any more. + instance := row.GetString(1) + if _, ok := instances[instance]; !ok { + jobID := row.GetUint64(0) + jobIDs = append(jobIDs, strconv.FormatUint(jobID, 10)) + } + } + + // Do a batch update to clean up the jobs. + if len(jobIDs) > 0 { + _, _, err = statsutil.ExecRows( + sctx, + BatchUpdateAnalyzeJobSQL, + jobIDs, + ) + if err != nil { + return errors.Trace(err) + } + statslogutil.StatsLogger().Info( + "clean up the potentially corrupted analyze jobs from dead instances", + zap.Strings("jobIDs", jobIDs), + ) + } + + return nil +} + +// HandleAutoAnalyze analyzes the outdated tables. (The change percent of the table exceeds the threshold) +// It also analyzes newly created tables and newly added indexes. +func (sa *statsAnalyze) HandleAutoAnalyze() (analyzed bool) { _ = statsutil.CallWithSCtx(sa.statsHandle.SPool(), func(sctx sessionctx.Context) error { - analyzed = HandleAutoAnalyze(sctx, sa.statsHandle, sa.sysProcTracker, is) + analyzed = HandleAutoAnalyze(sctx, sa.statsHandle, sa.sysProcTracker) return nil }) return @@ -139,31 +297,15 @@ func getAutoAnalyzeParameters(sctx sessionctx.Context) map[string]string { return parameters } -func getAllTidsAndPids(tbls []table.Table) []int64 { - tidsAndPids := make([]int64, 0, len(tbls)) - for _, tbl := range tbls { - tidsAndPids = append(tidsAndPids, tbl.Meta().ID) - tblInfo := tbl.Meta() - pi := tblInfo.GetPartitionInfo() - if pi != nil { - for _, def := range pi.Definitions { - tidsAndPids = append(tidsAndPids, def.ID) - } - } - } - return tidsAndPids -} - // HandleAutoAnalyze analyzes the newly created table or index. func HandleAutoAnalyze( sctx sessionctx.Context, statsHandle statstypes.StatsHandle, sysProcTracker sessionctx.SysProcTracker, - is infoschema.InfoSchema, ) (analyzed bool) { defer func() { if r := recover(); r != nil { - statslogutil.StatsLogger.Error( + statslogutil.StatsLogger().Error( "HandleAutoAnalyze panicked", zap.Any("recover", r), zap.Stack("stack"), @@ -171,17 +313,15 @@ func HandleAutoAnalyze( } }() - dbs := is.AllSchemaNames() parameters := getAutoAnalyzeParameters(sctx) autoAnalyzeRatio := parseAutoAnalyzeRatio(parameters[variable.TiDBAutoAnalyzeRatio]) - // Get the available time period for auto analyze and check if the current time is in the period. start, end, err := parseAnalyzePeriod( parameters[variable.TiDBAutoAnalyzeStartTime], parameters[variable.TiDBAutoAnalyzeEndTime], ) if err != nil { - statslogutil.StatsLogger.Error( + statslogutil.StatsLogger().Error( "parse auto analyze period failed", zap.Error(err), ) @@ -190,13 +330,51 @@ func HandleAutoAnalyze( if !timeutil.WithinDayTimePeriod(start, end, time.Now()) { return false } - pruneMode := variable.PartitionPruneMode(sctx.GetSessionVars().PartitionPruneMode.Load()) + + return RandomPickOneTableAndTryAutoAnalyze( + sctx, + statsHandle, + sysProcTracker, + autoAnalyzeRatio, + pruneMode, + start, + end, + ) +} + +// RandomPickOneTableAndTryAutoAnalyze randomly picks one table and tries to analyze it. +// 1. If the table is not analyzed, analyze it. +// 2. If the table is analyzed, analyze it when "tbl.ModifyCount/tbl.Count > autoAnalyzeRatio". +// 3. If the table is analyzed, analyze its indices when the index is not analyzed. +// 4. If the table is locked, skip it. +// Exposed solely for testing. +func RandomPickOneTableAndTryAutoAnalyze( + sctx sessionctx.Context, + statsHandle statstypes.StatsHandle, + sysProcTracker sessionctx.SysProcTracker, + autoAnalyzeRatio float64, + pruneMode variable.PartitionPruneMode, + start, end time.Time, +) bool { + is := sctx.GetDomainInfoSchema().(infoschema.InfoSchema) + dbs := is.AllSchemaNames() // Shuffle the database and table slice to randomize the order of analyzing tables. rd := rand.New(rand.NewSource(time.Now().UnixNano())) // #nosec G404 rd.Shuffle(len(dbs), func(i, j int) { dbs[i], dbs[j] = dbs[j], dbs[i] }) + // Query locked tables once to minimize overhead. + // Outdated lock info is acceptable as we verify table lock status pre-analysis. + lockedTables, err := lockstats.QueryLockedTables(sctx) + if err != nil { + statslogutil.StatsLogger().Error( + "check table lock failed", + zap.Error(err), + ) + return false + } + for _, db := range dbs { // Ignore the memory and system database. if util.IsMemOrSysDB(strings.ToLower(db)) { @@ -212,18 +390,13 @@ func HandleAutoAnalyze( tbls[i], tbls[j] = tbls[j], tbls[i] }) - tidsAndPids := getAllTidsAndPids(tbls) - lockedTables, err := statsHandle.GetLockedTables(tidsAndPids...) - if err != nil { - statslogutil.StatsLogger.Error( - "check table lock failed", - zap.Error(err), - ) - continue - } - // We need to check every partition of every table to see if it needs to be analyzed. for _, tbl := range tbls { + // Sometimes the tables are too many. Auto-analyze will take too much time on it. + // so we need to check the available time. + if !timeutil.WithinDayTimePeriod(start, end, time.Now()) { + return false + } // If table locked, skip analyze all partitions of the table. // FIXME: This check is not accurate, because other nodes may change the table lock status at any time. if _, ok := lockedTables[tbl.Meta().ID]; ok { @@ -238,7 +411,7 @@ func HandleAutoAnalyze( pi := tblInfo.GetPartitionInfo() // No partitions, analyze the whole table. if pi == nil { - statsTbl := statsHandle.GetTableStats(tblInfo) + statsTbl := statsHandle.GetTableStatsForAutoAnalyze(tblInfo) sql := "analyze table %n.%n" analyzed := tryAutoAnalyzeTable(sctx, statsHandle, sysProcTracker, tblInfo, statsTbl, autoAnalyzeRatio, sql, db, tblInfo.Name.O) if analyzed { @@ -249,14 +422,24 @@ func HandleAutoAnalyze( continue } // Only analyze the partition that has not been locked. - var partitionDefs []model.PartitionDefinition + partitionDefs := make([]model.PartitionDefinition, 0, len(pi.Definitions)) for _, def := range pi.Definitions { if _, ok := lockedTables[def.ID]; !ok { partitionDefs = append(partitionDefs, def) } } + partitionStats := getPartitionStats(statsHandle, tblInfo, partitionDefs) if pruneMode == variable.Dynamic { - analyzed := tryAutoAnalyzePartitionTableInDynamicMode(sctx, statsHandle, sysProcTracker, tblInfo, partitionDefs, db, autoAnalyzeRatio) + analyzed := tryAutoAnalyzePartitionTableInDynamicMode( + sctx, + statsHandle, + sysProcTracker, + tblInfo, + partitionDefs, + partitionStats, + db, + autoAnalyzeRatio, + ) if analyzed { return true } @@ -264,7 +447,7 @@ func HandleAutoAnalyze( } for _, def := range partitionDefs { sql := "analyze table %n.%n partition %n" - statsTbl := statsHandle.GetPartitionStats(tblInfo, def.ID) + statsTbl := partitionStats[def.ID] analyzed := tryAutoAnalyzeTable(sctx, statsHandle, sysProcTracker, tblInfo, statsTbl, autoAnalyzeRatio, sql, db, tblInfo.Name.O, def.Name.O) if analyzed { return true @@ -276,6 +459,20 @@ func HandleAutoAnalyze( return false } +func getPartitionStats( + statsHandle statstypes.StatsHandle, + tblInfo *model.TableInfo, + defs []model.PartitionDefinition, +) map[int64]*statistics.Table { + partitionStats := make(map[int64]*statistics.Table, len(defs)) + + for _, def := range defs { + partitionStats[def.ID] = statsHandle.GetPartitionStats(tblInfo, def.ID) + } + + return partitionStats +} + // AutoAnalyzeMinCnt means if the count of table is less than this value, we don't need to do auto analyze. // Exported for testing. var AutoAnalyzeMinCnt int64 = 1000 @@ -291,10 +488,10 @@ func tryAutoAnalyzeTable( sql string, params ...interface{}, ) bool { - // 1. If the stats are not loaded, we don't need to analyze it. + // 1. If the statistics are either not loaded or are classified as pseudo, there is no need for analyze // 2. If the table is too small, we don't want to waste time to analyze it. // Leave the opportunity to other bigger tables. - if statsTbl.Pseudo || statsTbl.RealtimeCount < AutoAnalyzeMinCnt { + if statsTbl == nil || statsTbl.RealtimeCount < AutoAnalyzeMinCnt || statsTbl.Pseudo { return false } @@ -307,7 +504,7 @@ func tryAutoAnalyzeTable( if err != nil { return false } - statslogutil.StatsLogger.Info( + statslogutil.StatsLogger().Info( "auto analyze triggered", zap.String("sql", escaped), zap.String("reason", reason), @@ -315,7 +512,7 @@ func tryAutoAnalyzeTable( tableStatsVer := sctx.GetSessionVars().AnalyzeVersion statistics.CheckAnalyzeVerOnTable(statsTbl, &tableStatsVer) - execAutoAnalyze(sctx, statsHandle, sysProcTracker, tableStatsVer, sql, params...) + exec.AutoAnalyze(sctx, statsHandle, sysProcTracker, tableStatsVer, sql, params...) return true } @@ -330,13 +527,13 @@ func tryAutoAnalyzeTable( return false } - statslogutil.StatsLogger.Info( + statslogutil.StatsLogger().Info( "auto analyze for unanalyzed indexes", zap.String("sql", escaped), ) tableStatsVer := sctx.GetSessionVars().AnalyzeVersion statistics.CheckAnalyzeVerOnTable(statsTbl, &tableStatsVer) - execAutoAnalyze(sctx, statsHandle, sysProcTracker, tableStatsVer, sqlWithIdx, paramsWithIdx...) + exec.AutoAnalyze(sctx, statsHandle, sysProcTracker, tableStatsVer, sqlWithIdx, paramsWithIdx...) return true } } @@ -392,6 +589,7 @@ func tryAutoAnalyzePartitionTableInDynamicMode( sysProcTracker sessionctx.SysProcTracker, tblInfo *model.TableInfo, partitionDefs []model.PartitionDefinition, + partitionStats map[int64]*statistics.Table, db string, ratio float64, ) bool { @@ -400,7 +598,7 @@ func tryAutoAnalyzePartitionTableInDynamicMode( needAnalyzePartitionNames := make([]interface{}, 0, len(partitionDefs)) for _, def := range partitionDefs { - partitionStatsTbl := statsHandle.GetPartitionStats(tblInfo, def.ID) + partitionStatsTbl := partitionStats[def.ID] // 1. If the stats are not loaded, we don't need to analyze it. // 2. If the table is too small, we don't want to waste time to analyze it. // Leave the opportunity to other bigger tables. @@ -412,7 +610,7 @@ func tryAutoAnalyzePartitionTableInDynamicMode( ratio, ); needAnalyze { needAnalyzePartitionNames = append(needAnalyzePartitionNames, def.Name.O) - statslogutil.StatsLogger.Info( + statslogutil.StatsLogger().Info( "need to auto analyze", zap.String("database", db), zap.String("table", tblInfo.Name.String()), @@ -437,7 +635,7 @@ func tryAutoAnalyzePartitionTableInDynamicMode( } if len(needAnalyzePartitionNames) > 0 { - statslogutil.StatsLogger.Info("start to auto analyze", + statslogutil.StatsLogger().Info("start to auto analyze", zap.String("database", db), zap.String("table", tblInfo.Name.String()), zap.Any("partitions", needAnalyzePartitionNames), @@ -457,13 +655,13 @@ func tryAutoAnalyzePartitionTableInDynamicMode( sql := getSQL("analyze table %n.%n partition", "", end-start) params := append([]interface{}{db, tblInfo.Name.O}, needAnalyzePartitionNames[start:end]...) - statslogutil.StatsLogger.Info( + statslogutil.StatsLogger().Info( "auto analyze triggered", zap.String("database", db), zap.String("table", tblInfo.Name.String()), zap.Any("partitions", needAnalyzePartitionNames[start:end]), ) - execAutoAnalyze(sctx, statsHandle, sysProcTracker, tableStatsVer, sql, params...) + exec.AutoAnalyze(sctx, statsHandle, sysProcTracker, tableStatsVer, sql, params...) } return true @@ -475,7 +673,7 @@ func tryAutoAnalyzePartitionTableInDynamicMode( } // Collect all the partition names that need to analyze. for _, def := range partitionDefs { - partitionStatsTbl := statsHandle.GetPartitionStats(tblInfo, def.ID) + partitionStatsTbl := partitionStats[def.ID] if _, ok := partitionStatsTbl.Indices[idx.ID]; !ok { needAnalyzePartitionNames = append(needAnalyzePartitionNames, def.Name.O) statistics.CheckAnalyzeVerOnTable(partitionStatsTbl, &tableStatsVer) @@ -495,13 +693,13 @@ func tryAutoAnalyzePartitionTableInDynamicMode( sql := getSQL("analyze table %n.%n partition", " index %n", end-start) params := append([]interface{}{db, tblInfo.Name.O}, needAnalyzePartitionNames[start:end]...) params = append(params, idx.Name.O) - statslogutil.StatsLogger.Info("auto analyze for unanalyzed", + statslogutil.StatsLogger().Info("auto analyze for unanalyzed", zap.String("database", db), zap.String("table", tblInfo.Name.String()), zap.String("index", idx.Name.String()), zap.Any("partitions", needAnalyzePartitionNames[start:end]), ) - execAutoAnalyze(sctx, statsHandle, sysProcTracker, tableStatsVer, sql, params...) + exec.AutoAnalyze(sctx, statsHandle, sysProcTracker, tableStatsVer, sql, params...) } return true @@ -511,61 +709,6 @@ func tryAutoAnalyzePartitionTableInDynamicMode( return false } -var execOptionForAnalyze = map[int]sqlexec.OptionFuncAlias{ - statistics.Version0: sqlexec.ExecOptionAnalyzeVer1, - statistics.Version1: sqlexec.ExecOptionAnalyzeVer1, - statistics.Version2: sqlexec.ExecOptionAnalyzeVer2, -} - -func execAutoAnalyze( - sctx sessionctx.Context, - statsHandle statstypes.StatsHandle, - sysProcTracker sessionctx.SysProcTracker, - statsVer int, - sql string, - params ...interface{}, -) { - startTime := time.Now() - _, _, err := execAnalyzeStmt(sctx, statsHandle, sysProcTracker, statsVer, sql, params...) - dur := time.Since(startTime) - metrics.AutoAnalyzeHistogram.Observe(dur.Seconds()) - if err != nil { - escaped, err1 := sqlescape.EscapeSQL(sql, params...) - if err1 != nil { - escaped = "" - } - statslogutil.StatsLogger.Error( - "auto analyze failed", - zap.String("sql", escaped), - zap.Duration("cost_time", dur), - zap.Error(err), - ) - metrics.AutoAnalyzeCounter.WithLabelValues("failed").Inc() - } else { - metrics.AutoAnalyzeCounter.WithLabelValues("succ").Inc() - } -} - -func execAnalyzeStmt( - sctx sessionctx.Context, - statsHandle statstypes.StatsHandle, - sysProcTracker sessionctx.SysProcTracker, - statsVer int, - sql string, - params ...interface{}, -) ([]chunk.Row, []*ast.ResultField, error) { - pruneMode := sctx.GetSessionVars().PartitionPruneMode.Load() - analyzeSnapshot := sctx.GetSessionVars().EnableAnalyzeSnapshot - optFuncs := []sqlexec.OptionFuncAlias{ - execOptionForAnalyze[statsVer], - sqlexec.GetAnalyzeSnapshotOption(analyzeSnapshot), - sqlexec.GetPartitionPruneModeOption(pruneMode), - sqlexec.ExecOptionUseCurSession, - sqlexec.ExecOptionWithSysProcTrack(statsHandle.AutoAnalyzeProcID(), sysProcTracker.Track, sysProcTracker.UnTrack), - } - return statsutil.ExecWithOpts(sctx, optFuncs, sql, params...) -} - // insertAnalyzeJob inserts analyze job into mysql.analyze_jobs and gets job ID for further updating job. func insertAnalyzeJob(sctx sessionctx.Context, job *statistics.AnalyzeJob, instance string, procID uint64) (err error) { jobInfo := job.JobInfo diff --git a/pkg/statistics/handle/autoanalyze/autoanalyze_test.go b/pkg/statistics/handle/autoanalyze/autoanalyze_test.go index 0dff953bcfa68..091e43a63ce37 100644 --- a/pkg/statistics/handle/autoanalyze/autoanalyze_test.go +++ b/pkg/statistics/handle/autoanalyze/autoanalyze_test.go @@ -15,19 +15,90 @@ package autoanalyze_test import ( + "encoding/json" "fmt" "strings" "testing" "time" + "github.com/pingcap/failpoint" + "github.com/pingcap/tidb/pkg/domain/infosync" "github.com/pingcap/tidb/pkg/parser/model" + "github.com/pingcap/tidb/pkg/parser/mysql" + "github.com/pingcap/tidb/pkg/sessionctx" + "github.com/pingcap/tidb/pkg/sessionctx/variable" "github.com/pingcap/tidb/pkg/statistics" "github.com/pingcap/tidb/pkg/statistics/handle/autoanalyze" + statsutil "github.com/pingcap/tidb/pkg/statistics/handle/util" + "github.com/pingcap/tidb/pkg/statistics/handle/util/test" "github.com/pingcap/tidb/pkg/testkit" + "github.com/pingcap/tidb/pkg/types" + "github.com/pingcap/tidb/pkg/util/chunk" + "github.com/pingcap/tidb/pkg/util/sqlexec/mock" "github.com/stretchr/testify/require" "github.com/tikv/client-go/v2/oracle" + "go.uber.org/mock/gomock" ) +func TestAutoAnalyzeLockedTable(t *testing.T) { + store, dom := testkit.CreateMockStoreAndDomain(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("create table t (a int)") + tk.MustExec("insert into t values (1)") + h := dom.StatsHandle() + err := h.HandleDDLEvent(<-h.DDLEventCh()) + require.NoError(t, err) + require.NoError(t, h.DumpStatsDeltaToKV(true)) + // Lock the table. + tk.MustExec("lock stats t") + is := dom.InfoSchema() + require.NoError(t, h.Update(is)) + autoanalyze.AutoAnalyzeMinCnt = 0 + defer func() { + autoanalyze.AutoAnalyzeMinCnt = 1000 + }() + // Try to analyze the locked table, it should not analyze the table. + require.False(t, dom.StatsHandle().HandleAutoAnalyze()) + + // Unlock the table. + tk.MustExec("unlock stats t") + // Try again, it should analyze the table. + require.True(t, dom.StatsHandle().HandleAutoAnalyze()) +} + +func TestDisableAutoAnalyze(t *testing.T) { + store, dom := testkit.CreateMockStoreAndDomain(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("create table t (a int)") + tk.MustExec("insert into t values (1)") + h := dom.StatsHandle() + err := h.HandleDDLEvent(<-h.DDLEventCh()) + require.NoError(t, err) + require.NoError(t, h.DumpStatsDeltaToKV(true)) + is := dom.InfoSchema() + require.NoError(t, h.Update(is)) + + // Set auto analyze ratio to 0. + tk.MustExec("set @@global.tidb_auto_analyze_ratio = 0") + autoanalyze.AutoAnalyzeMinCnt = 0 + defer func() { + autoanalyze.AutoAnalyzeMinCnt = 1000 + }() + // Even auto analyze ratio is set to 0, we still need to analyze the unanalyzed tables. + require.True(t, dom.StatsHandle().HandleAutoAnalyze()) + require.NoError(t, h.Update(is)) + + // Try again, it should not analyze the table because it's already analyzed and auto analyze ratio is 0. + require.False(t, dom.StatsHandle().HandleAutoAnalyze()) + + // Index analyze doesn't depend on auto analyze ratio. Only control by tidb_enable_auto_analyze. + // Even auto analyze ratio is set to 0, we still need to analyze the newly created index. + tk.MustExec("alter table t add index ia(a)") + require.True(t, dom.StatsHandle().HandleAutoAnalyze()) +} + func TestAutoAnalyzeOnChangeAnalyzeVer(t *testing.T) { store, dom := testkit.CreateMockStoreAndDomain(t) tk := testkit.NewTestKit(t, store) @@ -47,7 +118,7 @@ func TestAutoAnalyzeOnChangeAnalyzeVer(t *testing.T) { is := do.InfoSchema() require.NoError(t, h.Update(is)) // Auto analyze when global ver is 1. - h.HandleAutoAnalyze(is) + h.HandleAutoAnalyze() require.NoError(t, h.Update(is)) tbl, err := is.TableByName(model.NewCIStr("test"), model.NewCIStr("t")) require.NoError(t, err) @@ -64,7 +135,7 @@ func TestAutoAnalyzeOnChangeAnalyzeVer(t *testing.T) { require.NoError(t, h.DumpStatsDeltaToKV(true)) require.NoError(t, h.Update(is)) // Auto analyze t whose version is 1 after setting global ver to 2. - h.HandleAutoAnalyze(is) + h.HandleAutoAnalyze() require.NoError(t, h.Update(is)) statsTbl1 = h.GetTableStats(tbl.Meta()) require.Equal(t, int64(5), statsTbl1.RealtimeCount) @@ -85,7 +156,7 @@ func TestAutoAnalyzeOnChangeAnalyzeVer(t *testing.T) { tbl2, err := is.TableByName(model.NewCIStr("test"), model.NewCIStr("tt")) require.NoError(t, err) require.NoError(t, h.Update(is)) - h.HandleAutoAnalyze(is) + h.HandleAutoAnalyze() require.NoError(t, h.Update(is)) statsTbl2 := h.GetTableStats(tbl2.Meta()) // Since it's a newly created table. Auto analyze should analyze it's statistics to version2. @@ -221,7 +292,7 @@ func TestAutoAnalyzeSkipColumnTypes(t *testing.T) { defer func() { autoanalyze.AutoAnalyzeMinCnt = originalVal }() - require.True(t, h.HandleAutoAnalyze(dom.InfoSchema())) + require.True(t, h.HandleAutoAnalyze()) tk.MustQuery("select job_info from mysql.analyze_jobs where job_info like '%auto analyze table%'").Check(testkit.Rows("auto analyze table columns a, b, d with 256 buckets, 500 topn, 1 samplerate")) } @@ -241,7 +312,7 @@ func TestAutoAnalyzeOnEmptyTable(t *testing.T) { start, end := fmt.Sprintf("%02d:%02d +0000", h, m), fmt.Sprintf("%02d:%02d +0000", h, m) tk.MustExec(fmt.Sprintf("set global tidb_auto_analyze_start_time='%v'", start)) tk.MustExec(fmt.Sprintf("set global tidb_auto_analyze_end_time='%v'", end)) - dom.StatsHandle().HandleAutoAnalyze(dom.InfoSchema()) + dom.StatsHandle().HandleAutoAnalyze() tk.MustExec("use test") tk.MustExec("create table t (a int, index idx(a))") @@ -253,11 +324,11 @@ func TestAutoAnalyzeOnEmptyTable(t *testing.T) { require.NoError(t, dom.StatsHandle().Update(dom.InfoSchema())) // test if it will be limited by the time range - require.False(t, dom.StatsHandle().HandleAutoAnalyze(dom.InfoSchema())) + require.False(t, dom.StatsHandle().HandleAutoAnalyze()) tk.MustExec("set global tidb_auto_analyze_start_time='00:00 +0000'") tk.MustExec("set global tidb_auto_analyze_end_time='23:59 +0000'") - require.True(t, dom.StatsHandle().HandleAutoAnalyze(dom.InfoSchema())) + require.True(t, dom.StatsHandle().HandleAutoAnalyze()) } func TestAutoAnalyzeOutOfSpecifiedTime(t *testing.T) { @@ -276,7 +347,7 @@ func TestAutoAnalyzeOutOfSpecifiedTime(t *testing.T) { start, end := fmt.Sprintf("%02d:%02d +0000", h, m), fmt.Sprintf("%02d:%02d +0000", h, m) tk.MustExec(fmt.Sprintf("set global tidb_auto_analyze_start_time='%v'", start)) tk.MustExec(fmt.Sprintf("set global tidb_auto_analyze_end_time='%v'", end)) - dom.StatsHandle().HandleAutoAnalyze(dom.InfoSchema()) + dom.StatsHandle().HandleAutoAnalyze() tk.MustExec("use test") tk.MustExec("create table t (a int)") @@ -287,13 +358,200 @@ func TestAutoAnalyzeOutOfSpecifiedTime(t *testing.T) { require.NoError(t, dom.StatsHandle().DumpStatsDeltaToKV(true)) require.NoError(t, dom.StatsHandle().Update(dom.InfoSchema())) - require.False(t, dom.StatsHandle().HandleAutoAnalyze(dom.InfoSchema())) + require.False(t, dom.StatsHandle().HandleAutoAnalyze()) tk.MustExec("analyze table t") tk.MustExec("alter table t add index ia(a)") - require.False(t, dom.StatsHandle().HandleAutoAnalyze(dom.InfoSchema())) + require.False(t, dom.StatsHandle().HandleAutoAnalyze()) tk.MustExec("set global tidb_auto_analyze_start_time='00:00 +0000'") tk.MustExec("set global tidb_auto_analyze_end_time='23:59 +0000'") - require.True(t, dom.StatsHandle().HandleAutoAnalyze(dom.InfoSchema())) + require.True(t, dom.StatsHandle().HandleAutoAnalyze()) +} + +func makeFailpointRes(t *testing.T, v interface{}) string { + bytes, err := json.Marshal(v) + require.NoError(t, err) + return fmt.Sprintf("return(`%s`)", string(bytes)) +} + +func getMockedServerInfo() map[string]*infosync.ServerInfo { + mockedAllServerInfos := map[string]*infosync.ServerInfo{ + "s1": { + ID: "s1", + IP: "127.0.0.1", + Port: 4000, + }, + "s2": { + ID: "s2", + IP: "127.0.0.2", + Port: 4000, + }, + } + return mockedAllServerInfos +} + +func TestCleanupCorruptedAnalyzeJobsOnCurrentInstance(t *testing.T) { + ctrl := gomock.NewController(t) + defer ctrl.Finish() + exec := mock.NewMockRestrictedSQLExecutor(ctrl) + + require.NoError(t, + failpoint.Enable( + "github.com/pingcap/tidb/pkg/domain/infosync/mockGetServerInfo", + makeFailpointRes(t, getMockedServerInfo()["s1"]), + ), + ) + defer func() { + failpoint.Disable("github.com/pingcap/tidb/pkg/domain/infosync/mockGetServerInfo") + }() + + // Create a new chunk with capacity for three fields + c := chunk.NewChunkWithCapacity([]*types.FieldType{ + types.NewFieldType(mysql.TypeLonglong), // id + types.NewFieldType(mysql.TypeLonglong), // process_id + types.NewFieldType(mysql.TypeVarchar), // instance + }, 3) + + // Append values for each field + c.AppendInt64(0, int64(1)) // id + c.AppendInt64(1, int64(1)) // process_id + + c.AppendInt64(0, int64(2)) // id + c.AppendNull(1) // process_id + + c.AppendInt64(0, int64(3)) // id + c.AppendInt64(1, int64(3)) // process_id + // Create a row from the chunk + rows := []chunk.Row{c.GetRow(0), c.GetRow(1), c.GetRow(2)} + + // Set up the mock function to return the row + exec.EXPECT().ExecRestrictedSQL( + gomock.All(&test.CtxMatcher{}), + statsutil.UseCurrentSessionOpt, + autoanalyze.SelectAnalyzeJobsOnCurrentInstanceSQL, + "127.0.0.1:4000", + gomock.Any(), + ).Return(rows, nil, nil) + + exec.EXPECT().ExecRestrictedSQL( + gomock.All(&test.CtxMatcher{}), + statsutil.UseCurrentSessionOpt, + autoanalyze.BatchUpdateAnalyzeJobSQL, + []interface{}{[]string{"1"}}, + ).Return(nil, nil, nil) + + err := autoanalyze.CleanupCorruptedAnalyzeJobsOnCurrentInstance( + mock.WrapAsSCtx(exec), + map[uint64]struct{}{ + 3: {}, + 4: {}, + }, + ) + require.NoError(t, err) + + // Set up the mock function to return the row + exec.EXPECT().ExecRestrictedSQL( + gomock.All(&test.CtxMatcher{}), + statsutil.UseCurrentSessionOpt, + autoanalyze.SelectAnalyzeJobsOnCurrentInstanceSQL, + "127.0.0.1:4000", + ).Return(rows, nil, nil) + + exec.EXPECT().ExecRestrictedSQL( + gomock.All(&test.CtxMatcher{}), + statsutil.UseCurrentSessionOpt, + autoanalyze.BatchUpdateAnalyzeJobSQL, + []interface{}{[]string{"1", "3"}}, + ).Return(nil, nil, nil) + + // No running analyze jobs on current instance. + err = autoanalyze.CleanupCorruptedAnalyzeJobsOnCurrentInstance( + mock.WrapAsSCtx(exec), + map[uint64]struct{}{}, + ) + require.NoError(t, err) +} + +func TestCleanupCorruptedAnalyzeJobsOnDeadInstances(t *testing.T) { + ctrl := gomock.NewController(t) + defer ctrl.Finish() + exec := mock.NewMockRestrictedSQLExecutor(ctrl) + + require.NoError( + t, + failpoint.Enable( + "github.com/pingcap/tidb/pkg/domain/infosync/mockGetAllServerInfo", + makeFailpointRes(t, getMockedServerInfo()), + ), + ) + defer func() { + require.NoError( + t, failpoint.Disable("github.com/pingcap/tidb/pkg/domain/infosync/mockGetAllServerInfo"), + ) + }() + // Create a new chunk with capacity for three fields + c := chunk.NewChunkWithCapacity([]*types.FieldType{ + types.NewFieldType(mysql.TypeLonglong), // id + types.NewFieldType(mysql.TypeVarchar), // instance + }, 3) + + // Append values for each field + c.AppendInt64(0, int64(1)) // id + c.AppendString(1, "127.0.0.1:4000") // instance + + c.AppendInt64(0, int64(2)) // id + c.AppendString(1, "10.0.0.1:4000") // unknown instance + + c.AppendInt64(0, int64(3)) // id + c.AppendString(1, "127.0.0.1:4000") // valid instance + // Create a row from the chunk + rows := []chunk.Row{c.GetRow(0), c.GetRow(1), c.GetRow(2)} + // Set up the mock function to return the row + exec.EXPECT().ExecRestrictedSQL( + gomock.All(&test.CtxMatcher{}), + statsutil.UseCurrentSessionOpt, + autoanalyze.SelectAnalyzeJobsSQL, + gomock.Any(), + ).Return(rows, nil, nil) + + exec.EXPECT().ExecRestrictedSQL( + gomock.All(&test.CtxMatcher{}), + statsutil.UseCurrentSessionOpt, + autoanalyze.BatchUpdateAnalyzeJobSQL, + []interface{}{[]string{"2"}}, + ).Return(nil, nil, nil) + + err := autoanalyze.CleanupCorruptedAnalyzeJobsOnDeadInstances( + mock.WrapAsSCtx(exec), + ) + require.NoError(t, err) +} + +func TestSkipAutoAnalyzeOutsideTheAvailableTime(t *testing.T) { + store, dom := testkit.CreateMockStoreAndDomain(t) + tk := testkit.NewTestKit(t, store) + ttStart := time.Now().Add(-2 * time.Hour) + ttEnd := time.Now().Add(-1 * time.Hour) + for i := 0; i < 2; i++ { + dbName := fmt.Sprintf("db%d", i) + tk.MustExec(fmt.Sprintf("create database %s", dbName)) + for j := 0; j < 2; j++ { + tableName := fmt.Sprintf("table%d", j) + tk.MustExec(fmt.Sprintf("create table %s.%s (a int)", dbName, tableName)) + } + } + se, err := dom.SysSessionPool().Get() + require.NoError(t, err) + require.False(t, + autoanalyze.RandomPickOneTableAndTryAutoAnalyze( + se.(sessionctx.Context), + dom.StatsHandle(), + dom.SysProcTracker(), + 0.6, + variable.Dynamic, + ttStart, + ttEnd, + ), + ) } diff --git a/pkg/statistics/handle/autoanalyze/exec/BUILD.bazel b/pkg/statistics/handle/autoanalyze/exec/BUILD.bazel new file mode 100644 index 0000000000000..02bb9a2300e51 --- /dev/null +++ b/pkg/statistics/handle/autoanalyze/exec/BUILD.bazel @@ -0,0 +1,35 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") + +go_library( + name = "exec", + srcs = ["exec.go"], + importpath = "github.com/pingcap/tidb/pkg/statistics/handle/autoanalyze/exec", + visibility = ["//visibility:public"], + deps = [ + "//pkg/metrics", + "//pkg/parser/ast", + "//pkg/sessionctx", + "//pkg/statistics", + "//pkg/statistics/handle/logutil", + "//pkg/statistics/handle/types", + "//pkg/statistics/handle/util", + "//pkg/util/chunk", + "//pkg/util/sqlescape", + "//pkg/util/sqlexec", + "@org_uber_go_zap//:zap", + ], +) + +go_test( + name = "exec_test", + timeout = "short", + srcs = ["exec_test.go"], + flaky = True, + deps = [ + ":exec", + "//pkg/parser/model", + "//pkg/sessionctx", + "//pkg/testkit", + "@com_github_stretchr_testify//require", + ], +) diff --git a/pkg/statistics/handle/autoanalyze/exec/exec.go b/pkg/statistics/handle/autoanalyze/exec/exec.go new file mode 100644 index 0000000000000..eb9baecd979b5 --- /dev/null +++ b/pkg/statistics/handle/autoanalyze/exec/exec.go @@ -0,0 +1,87 @@ +// Copyright 2024 PingCAP, 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. + +package exec + +import ( + "time" + + "github.com/pingcap/tidb/pkg/metrics" + "github.com/pingcap/tidb/pkg/parser/ast" + "github.com/pingcap/tidb/pkg/sessionctx" + "github.com/pingcap/tidb/pkg/statistics" + statslogutil "github.com/pingcap/tidb/pkg/statistics/handle/logutil" + statstypes "github.com/pingcap/tidb/pkg/statistics/handle/types" + statsutil "github.com/pingcap/tidb/pkg/statistics/handle/util" + "github.com/pingcap/tidb/pkg/util/chunk" + "github.com/pingcap/tidb/pkg/util/sqlescape" + "github.com/pingcap/tidb/pkg/util/sqlexec" + "go.uber.org/zap" +) + +var execOptionForAnalyze = map[int]sqlexec.OptionFuncAlias{ + statistics.Version0: sqlexec.ExecOptionAnalyzeVer1, + statistics.Version1: sqlexec.ExecOptionAnalyzeVer1, + statistics.Version2: sqlexec.ExecOptionAnalyzeVer2, +} + +// AutoAnalyze executes the auto analyze task. +func AutoAnalyze( + sctx sessionctx.Context, + statsHandle statstypes.StatsHandle, + sysProcTracker sessionctx.SysProcTracker, + statsVer int, + sql string, + params ...interface{}, +) { + startTime := time.Now() + _, _, err := execAnalyzeStmt(sctx, statsHandle, sysProcTracker, statsVer, sql, params...) + dur := time.Since(startTime) + metrics.AutoAnalyzeHistogram.Observe(dur.Seconds()) + if err != nil { + escaped, err1 := sqlescape.EscapeSQL(sql, params...) + if err1 != nil { + escaped = "" + } + statslogutil.StatsLogger().Error( + "auto analyze failed", + zap.String("sql", escaped), + zap.Duration("cost_time", dur), + zap.Error(err), + ) + metrics.AutoAnalyzeCounter.WithLabelValues("failed").Inc() + } else { + metrics.AutoAnalyzeCounter.WithLabelValues("succ").Inc() + } +} + +func execAnalyzeStmt( + sctx sessionctx.Context, + statsHandle statstypes.StatsHandle, + sysProcTracker sessionctx.SysProcTracker, + statsVer int, + sql string, + params ...interface{}, +) ([]chunk.Row, []*ast.ResultField, error) { + pruneMode := sctx.GetSessionVars().PartitionPruneMode.Load() + analyzeSnapshot := sctx.GetSessionVars().EnableAnalyzeSnapshot + optFuncs := []sqlexec.OptionFuncAlias{ + execOptionForAnalyze[statsVer], + sqlexec.GetAnalyzeSnapshotOption(analyzeSnapshot), + sqlexec.GetPartitionPruneModeOption(pruneMode), + sqlexec.ExecOptionUseCurSession, + sqlexec.ExecOptionWithSysProcTrack(statsHandle.AutoAnalyzeProcID(), sysProcTracker.Track, sysProcTracker.UnTrack), + } + return statsutil.ExecWithOpts(sctx, optFuncs, sql, params...) +} diff --git a/pkg/statistics/handle/autoanalyze/exec/exec_test.go b/pkg/statistics/handle/autoanalyze/exec/exec_test.go new file mode 100644 index 0000000000000..e651476c52be9 --- /dev/null +++ b/pkg/statistics/handle/autoanalyze/exec/exec_test.go @@ -0,0 +1,52 @@ +// Copyright 2024 PingCAP, 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. + +package exec_test + +import ( + "testing" + + "github.com/pingcap/tidb/pkg/parser/model" + "github.com/pingcap/tidb/pkg/sessionctx" + "github.com/pingcap/tidb/pkg/statistics/handle/autoanalyze/exec" + "github.com/pingcap/tidb/pkg/testkit" + "github.com/stretchr/testify/require" +) + +func TestExecAutoAnalyzes(t *testing.T) { + store, dom := testkit.CreateMockStoreAndDomain(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + + tk.MustExec("create table t (a int, b int, index idx(a))") + tk.MustExec("insert into t values (1, 1), (2, 2), (3, 3)") + + se := tk.Session() + sctx := se.(sessionctx.Context) + handle := dom.StatsHandle() + + exec.AutoAnalyze( + sctx, + handle, + dom.SysProcTracker(), + 2, "analyze table %n", "t", + ) + + // Check the result of analyze. + is := dom.InfoSchema() + tbl, err := is.TableByName(model.NewCIStr("test"), model.NewCIStr("t")) + require.NoError(t, err) + tblStats := handle.GetTableStats(tbl.Meta()) + require.Equal(t, int64(3), tblStats.RealtimeCount) +} diff --git a/pkg/statistics/handle/autoanalyze/priorityqueue/BUILD.bazel b/pkg/statistics/handle/autoanalyze/priorityqueue/BUILD.bazel new file mode 100644 index 0000000000000..d54b143f627e7 --- /dev/null +++ b/pkg/statistics/handle/autoanalyze/priorityqueue/BUILD.bazel @@ -0,0 +1,37 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") + +go_library( + name = "priorityqueue", + srcs = [ + "interval.go", + "job.go", + "queue.go", + ], + importpath = "github.com/pingcap/tidb/pkg/statistics/handle/autoanalyze/priorityqueue", + visibility = ["//visibility:public"], + deps = [ + "//pkg/sessionctx", + "//pkg/statistics/handle/util", + ], +) + +go_test( + name = "priorityqueue_test", + timeout = "short", + srcs = [ + "interval_test.go", + "main_test.go", + "queue_test.go", + ], + embed = [":priorityqueue"], + flaky = True, + shard_count = 4, + deps = [ + "//pkg/session", + "//pkg/sessionctx", + "//pkg/testkit", + "//pkg/testkit/testsetup", + "@com_github_stretchr_testify//require", + "@org_uber_go_goleak//:goleak", + ], +) diff --git a/pkg/statistics/handle/autoanalyze/priorityqueue/interval.go b/pkg/statistics/handle/autoanalyze/priorityqueue/interval.go new file mode 100644 index 0000000000000..38e618d1783ab --- /dev/null +++ b/pkg/statistics/handle/autoanalyze/priorityqueue/interval.go @@ -0,0 +1,134 @@ +// Copyright 2024 PingCAP, 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. + +package priorityqueue + +import ( + "time" + + "github.com/pingcap/tidb/pkg/sessionctx" + "github.com/pingcap/tidb/pkg/statistics/handle/util" +) + +const avgDurationQueryForTable = ` + SELECT AVG(TIMESTAMPDIFF(SECOND, start_time, end_time)) AS avg_duration + FROM ( + SELECT start_time, end_time + FROM mysql.analyze_jobs + WHERE table_schema = %? AND table_name = %? AND state = 'finished' AND fail_reason IS NULL AND partition_name = '' + ORDER BY id DESC + LIMIT 5 + ) AS recent_analyses; +` + +// For multiple partitions, we only need to return the average duration of the most recent 5 successful analyses +// from all partitions. +const avgDurationQueryForPartition = ` + SELECT AVG(TIMESTAMPDIFF(SECOND, start_time, end_time)) AS avg_duration + FROM ( + SELECT start_time, end_time + FROM mysql.analyze_jobs + WHERE table_schema = %? AND table_name = %? AND state = 'finished' AND fail_reason IS NULL AND partition_name in (%?) + ORDER BY id DESC + LIMIT 5 + ) AS recent_analyses; +` + +const lastFailedDurationQueryForTable = ` + SELECT TIMESTAMPDIFF(SECOND, start_time, CURRENT_TIMESTAMP) + FROM mysql.analyze_jobs + WHERE table_schema = %? AND table_name = %? AND state = 'failed' AND partition_name = '' + ORDER BY id DESC + LIMIT 1; +` + +// For multiple partitions, we only need to return the duration of the most recent failed analysis. +// We pick the minimum duration of all failed analyses because we want to be conservative. +const lastFailedDurationQueryForPartition = ` + SELECT + MIN(TIMESTAMPDIFF(SECOND, start_time, CURRENT_TIMESTAMP)) AS min_duration + FROM + mysql.analyze_jobs + WHERE + table_schema = %? AND + table_name = %? AND + state = 'failed' AND + partition_name IN (%?); +` + +// getAverageAnalysisDuration returns the average duration of the last 5 successful analyses for each specified partition. +// If there are no successful analyses, it returns 0. +func getAverageAnalysisDuration( + sctx sessionctx.Context, + schema, tableName string, + partitionNames ...string, +) (time.Duration, error) { + query := "" + params := make([]any, 0, len(partitionNames)+3) + if len(partitionNames) == 0 { + query = avgDurationQueryForTable + params = append(params, schema, tableName) + } else { + query = avgDurationQueryForPartition + params = append(params, schema, tableName, partitionNames) + } + + rows, _, err := util.ExecRows(sctx, query, params...) + if err != nil { + return 0, err + } + + // NOTE: if there are no successful analyses, we return 0. + if len(rows) == 0 || rows[0].IsNull(0) { + return 0, nil + } + avgDuration := rows[0].GetMyDecimal(0) + duration, err := avgDuration.ToFloat64() + if err != nil { + return 0, err + } + + return time.Duration(duration) * time.Second, nil +} + +// getLastFailedAnalysisDuration returns the duration since the last failed analysis. +// If there is no failed analysis, it returns 0. +func getLastFailedAnalysisDuration( + sctx sessionctx.Context, + schema, tableName string, + partitionNames ...string, +) (time.Duration, error) { + query := "" + params := make([]any, 0, len(partitionNames)+3) + if len(partitionNames) == 0 { + query = lastFailedDurationQueryForTable + params = append(params, schema, tableName) + } else { + query = lastFailedDurationQueryForPartition + params = append(params, schema, tableName, partitionNames) + } + + rows, _, err := util.ExecRows(sctx, query, params...) + if err != nil { + return 0, err + } + + // NOTE: if there are no failed analyses, we return 0. + if len(rows) == 0 || rows[0].IsNull(0) { + return 0, nil + } + lastFailedDuration := rows[0].GetUint64(0) + + return time.Duration(lastFailedDuration) * time.Second, nil +} diff --git a/pkg/statistics/handle/autoanalyze/priorityqueue/interval_test.go b/pkg/statistics/handle/autoanalyze/priorityqueue/interval_test.go new file mode 100644 index 0000000000000..819fd3ab94d42 --- /dev/null +++ b/pkg/statistics/handle/autoanalyze/priorityqueue/interval_test.go @@ -0,0 +1,322 @@ +// Copyright 2024 PingCAP, 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. + +package priorityqueue + +import ( + "testing" + "time" + + "github.com/pingcap/tidb/pkg/session" + "github.com/pingcap/tidb/pkg/sessionctx" + "github.com/pingcap/tidb/pkg/testkit" + "github.com/stretchr/testify/require" +) + +func TestGetAverageAnalysisDuration(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec(session.CreateAnalyzeJobs) + // Empty table. + se := tk.Session() + sctx := se.(sessionctx.Context) + avgDuration, err := getAverageAnalysisDuration( + sctx, + "example_schema", "example_table", "example_partition", + ) + require.NoError(t, err) + require.Equal(t, time.Duration(0), avgDuration) + + initJobs(tk) + + // Partitioned table. + insertMultipleFinishedJobs(tk, "example_table", "example_partition") + // Only one partition. + avgDuration, err = getAverageAnalysisDuration( + sctx, + "example_schema", "example_table", "example_partition", + ) + require.NoError(t, err) + require.Equal(t, time.Duration(3600)*time.Second, avgDuration) + // Multiple partitions. + avgDuration, err = getAverageAnalysisDuration( + sctx, + "example_schema", "example_table", "example_partition", "example_partition1", + ) + require.NoError(t, err) + require.Equal(t, time.Duration(3600)*time.Second, avgDuration) + // Non-partitioned table. + insertMultipleFinishedJobs(tk, "example_table1", "") + avgDuration, err = getAverageAnalysisDuration(sctx, "example_schema", "example_table1") + require.NoError(t, err) + require.Equal(t, time.Duration(3600)*time.Second, avgDuration) +} + +func insertMultipleFinishedJobs(tk *testkit.TestKit, tableName string, partitionName string) { + jobs := []struct { + dbName string + tableName string + partitionName string + startTime string + endTime string + }{ + // This is a special case its duration is 30 minutes. + // But the id is smaller than the following records. + // So it will not be selected. + {"example_schema", tableName, partitionName, "2022-01-01 7:00:00", "2022-01-01 7:30:00"}, + // Other records. + {"example_schema", tableName, partitionName, "2022-01-01 09:00:00", "2022-01-01 10:00:00"}, + {"example_schema", tableName, partitionName, "2022-01-01 10:00:00", "2022-01-01 11:00:00"}, + {"example_schema", tableName, partitionName, "2022-01-01 11:00:00", "2022-01-01 12:00:00"}, + {"example_schema", tableName, partitionName, "2022-01-01 13:00:00", "2022-01-01 14:00:00"}, + {"example_schema", tableName, partitionName, "2022-01-01 14:00:00", "2022-01-01 15:00:00"}, + } + + for _, job := range jobs { + insertFinishedJob(tk, job.dbName, job.tableName, job.partitionName, job.startTime, job.endTime) + } +} + +func TestGetLastFailedAnalysisDuration(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec(session.CreateAnalyzeJobs) + // Empty table. + se := tk.Session() + sctx := se.(sessionctx.Context) + lastFailedDuration, err := getLastFailedAnalysisDuration( + sctx, + "example_schema", "example_table", "example_partition", + ) + require.NoError(t, err) + require.Equal(t, time.Duration(0), lastFailedDuration) + initJobs(tk) + + // Partitioned table. + insertFailedJob(tk, "example_schema", "example_table", "example_partition") + insertFailedJob(tk, "example_schema", "example_table", "example_partition1") + // Only one partition. + lastFailedDuration, err = getLastFailedAnalysisDuration( + sctx, + "example_schema", "example_table", "example_partition", + ) + require.NoError(t, err) + require.GreaterOrEqual(t, lastFailedDuration, time.Duration(24)*time.Hour) + // Multiple partitions. + lastFailedDuration, err = getLastFailedAnalysisDuration( + sctx, + "example_schema", "example_table", "example_partition", "example_partition1", + ) + require.NoError(t, err) + require.GreaterOrEqual(t, lastFailedDuration, time.Duration(24)*time.Hour) + // Non-partitioned table. + insertFailedJob(tk, "example_schema", "example_table1", "") + lastFailedDuration, err = getLastFailedAnalysisDuration(sctx, "example_schema", "example_table1") + require.NoError(t, err) + require.GreaterOrEqual(t, lastFailedDuration, time.Duration(24)*time.Hour) +} + +func initJobs(tk *testkit.TestKit) { + tk.MustExec(` + INSERT INTO mysql.analyze_jobs ( + table_schema, + table_name, + partition_name, + job_info, + start_time, + state, + instance + ) VALUES ( + 'example_schema', + 'example_table', + 'example_partition', + 'Job information for pending job', + NULL, + 'pending', + 'example_instance' + ); +`) + + tk.MustExec(` + INSERT INTO mysql.analyze_jobs ( + table_schema, + table_name, + partition_name, + job_info, + start_time, + state, + instance + ) VALUES ( + 'example_schema', + 'example_table', + 'example_partition', + 'Job information for running job', + '2022-01-01 10:00:00', + 'running', + 'example_instance' + ); +`) + + tk.MustExec(` + INSERT INTO mysql.analyze_jobs ( + table_schema, + table_name, + partition_name, + job_info, + start_time, + end_time, + state, + fail_reason, + instance + ) VALUES ( + 'example_schema', + 'example_table', + 'example_partition', + 'Job information for failed job', + '2022-01-01 09:00:00', + '2022-01-01 10:00:00', + 'failed', + 'Some reason for failure', + 'example_instance' + ); +`) +} + +func insertFinishedJob( + tk *testkit.TestKit, + dbName string, + tableName string, + partitionName string, + startTime string, + endTime string, +) { + if partitionName == "" { + tk.MustExec(` + INSERT INTO mysql.analyze_jobs ( + table_schema, + table_name, + job_info, + start_time, + end_time, + state, + instance + ) VALUES ( + ?, + ?, + 'Job information for finished job', + ?, + ?, + 'finished', + 'example_instance' + ); + `, + dbName, + tableName, + startTime, + endTime, + ) + } else { + tk.MustExec(` + INSERT INTO mysql.analyze_jobs ( + table_schema, + table_name, + partition_name, + job_info, + start_time, + end_time, + state, + instance + ) VALUES ( + ?, + ?, + ?, + 'Job information for finished job', + ?, + ?, + 'finished', + 'example_instance' + ); + `, + dbName, + tableName, + partitionName, + startTime, + endTime, + ) + } +} + +func insertFailedJob( + tk *testkit.TestKit, + dbName string, + tableName string, + partitionName string, +) { + if partitionName == "" { + tk.MustExec(` + INSERT INTO mysql.analyze_jobs ( + table_schema, + table_name, + job_info, + start_time, + end_time, + state, + fail_reason, + instance + ) VALUES ( + ?, + ?, + 'Job information for failed job', + '2024-01-01 09:00:00', + '2024-01-01 10:00:00', + 'failed', + 'Some reason for failure', + 'example_instance' + ); + `, + dbName, + tableName, + ) + } else { + tk.MustExec(` + INSERT INTO mysql.analyze_jobs ( + table_schema, + table_name, + partition_name, + job_info, + start_time, + end_time, + state, + fail_reason, + instance + ) VALUES ( + ?, + ?, + ?, + 'Job information for failed job', + '2024-01-01 09:00:00', + '2024-01-01 10:00:00', + 'failed', + 'Some reason for failure', + 'example_instance' + ); + `, + dbName, + tableName, + partitionName, + ) + } +} diff --git a/pkg/statistics/handle/autoanalyze/priorityqueue/job.go b/pkg/statistics/handle/autoanalyze/priorityqueue/job.go new file mode 100644 index 0000000000000..a7df252f5aa10 --- /dev/null +++ b/pkg/statistics/handle/autoanalyze/priorityqueue/job.go @@ -0,0 +1,21 @@ +// Copyright 2024 PingCAP, 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. + +package priorityqueue + +// TableAnalysisJob defines the structure for table analysis job information. +type TableAnalysisJob struct { + // TODO: add more information about the job. + Weight float64 +} diff --git a/pkg/statistics/handle/autoanalyze/priorityqueue/main_test.go b/pkg/statistics/handle/autoanalyze/priorityqueue/main_test.go new file mode 100644 index 0000000000000..d4c40b7725e0c --- /dev/null +++ b/pkg/statistics/handle/autoanalyze/priorityqueue/main_test.go @@ -0,0 +1,34 @@ +// Copyright 2024 PingCAP, 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. + +package priorityqueue + +import ( + "testing" + + "github.com/pingcap/tidb/pkg/testkit/testsetup" + "go.uber.org/goleak" +) + +func TestMain(m *testing.M) { + opts := []goleak.Option{ + goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), + goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), + goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), + goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), + } + testsetup.SetupForCommonTest() + goleak.VerifyTestMain(m, opts...) +} diff --git a/pkg/statistics/handle/autoanalyze/priorityqueue/queue.go b/pkg/statistics/handle/autoanalyze/priorityqueue/queue.go new file mode 100644 index 0000000000000..e25a0e92a1033 --- /dev/null +++ b/pkg/statistics/handle/autoanalyze/priorityqueue/queue.go @@ -0,0 +1,44 @@ +// Copyright 2024 PingCAP, 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. + +package priorityqueue + +// An AnalysisQueue implements heap.Interface and holds TableAnalysisJobs. +type AnalysisQueue []*TableAnalysisJob + +// Implement the sort.Interface methods for the priority queue. + +func (aq AnalysisQueue) Len() int { return len(aq) } +func (aq AnalysisQueue) Less(i, j int) bool { + // We want Pop to give us the highest, not lowest, priority, so we use greater than here. + return aq[i].Weight > aq[j].Weight +} +func (aq AnalysisQueue) Swap(i, j int) { + aq[i], aq[j] = aq[j], aq[i] +} + +// Push adds an item to the priority queue. +func (aq *AnalysisQueue) Push(x any) { + item := x.(*TableAnalysisJob) + *aq = append(*aq, item) +} + +// Pop removes the highest priority item from the queue. +func (aq *AnalysisQueue) Pop() any { + old := *aq + n := len(old) + item := old[n-1] + *aq = old[0 : n-1] + return item +} diff --git a/pkg/statistics/handle/autoanalyze/priorityqueue/queue_test.go b/pkg/statistics/handle/autoanalyze/priorityqueue/queue_test.go new file mode 100644 index 0000000000000..7a21f98ff5a5a --- /dev/null +++ b/pkg/statistics/handle/autoanalyze/priorityqueue/queue_test.go @@ -0,0 +1,58 @@ +// Copyright 2024 PingCAP, 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. + +package priorityqueue + +import ( + "container/heap" + "testing" + + "github.com/stretchr/testify/require" +) + +func TestAnalysisQueue(t *testing.T) { + // Test data + job1 := &TableAnalysisJob{Weight: 10} + job2 := &TableAnalysisJob{Weight: 5} + job3 := &TableAnalysisJob{Weight: 15} + + // Create an empty priority queue + queue := AnalysisQueue{} + + // Push items into the queue + heap.Push(&queue, job1) + heap.Push(&queue, job2) + heap.Push(&queue, job3) + + // Test Len() + require.Equal(t, 3, queue.Len(), "Length of the queue should be 3") + + // Test Less() + require.True(t, queue.Less(0, 1), "Item at index 0 should have higher priority than item at index 1") + + // Test Swap() + queue.Swap(0, 2) + require.NotEqual(t, float64(15), queue[0].Weight, "Item at index 0 should not have weight 15 after swap") +} + +func TestPushPop(t *testing.T) { + // Test Push and Pop operations together + queue := AnalysisQueue{} + heap.Push(&queue, &TableAnalysisJob{Weight: 10}) + heap.Push(&queue, &TableAnalysisJob{Weight: 5}) + + poppedItem := heap.Pop(&queue).(*TableAnalysisJob) + require.Equal(t, float64(10), poppedItem.Weight, "Popped item should have weight 10") + require.Equal(t, 1, queue.Len(), "After Pop, length of the queue should be 1") +} diff --git a/pkg/statistics/handle/bootstrap.go b/pkg/statistics/handle/bootstrap.go index 0e3adc40d2c45..676ae05f701fd 100644 --- a/pkg/statistics/handle/bootstrap.go +++ b/pkg/statistics/handle/bootstrap.go @@ -467,7 +467,9 @@ func (h *Handle) initStatsBuckets(cache statstypes.StatsCache) error { } // InitStatsLite initiates the stats cache. The function is liter and faster than InitStats. -// Column/index stats are not loaded, i.e., we only load scalars such as NDV, NullCount, Correlation and don't load CMSketch/Histogram/TopN. +// 1. Basic stats meta data is loaded.(count, modify count, etc.) +// 2. Column/index stats are loaded. (only histogram) +// 3. TopN, Bucket, FMSketch are not loaded. func (h *Handle) InitStatsLite(is infoschema.InfoSchema) (err error) { defer func() { _, err1 := util.Exec(h.initStatsCtx, "commit") @@ -492,8 +494,8 @@ func (h *Handle) InitStatsLite(is infoschema.InfoSchema) (err error) { } // InitStats initiates the stats cache. -// Index/PK stats are fully loaded. -// Column stats are not loaded, i.e., we only load scalars such as NDV, NullCount, Correlation and don't load CMSketch/Histogram/TopN. +// 1. Basic stats meta data is loaded.(count, modify count, etc.) +// 2. Column/index stats are loaded. (histogram, topn, buckets, FMSketch) func (h *Handle) InitStats(is infoschema.InfoSchema) (err error) { loadFMSketch := config.GetGlobalConfig().Performance.EnableLoadFMSketch defer func() { diff --git a/pkg/statistics/handle/cache/statscache.go b/pkg/statistics/handle/cache/statscache.go index e09ff2df107d8..2573b0f02ee20 100644 --- a/pkg/statistics/handle/cache/statscache.go +++ b/pkg/statistics/handle/cache/statscache.go @@ -101,7 +101,7 @@ func (s *StatsCacheImpl) Update(is infoschema.InfoSchema) error { tbl, err := s.statsHandle.TableStatsFromStorage(tableInfo, physicalID, false, 0) // Error is not nil may mean that there are some ddl changes on this table, we will not update it. if err != nil { - statslogutil.StatsLogger.Error("error occurred when read table stats", zap.String("table", tableInfo.Name.O), zap.Error(err)) + statslogutil.StatsLogger().Error("error occurred when read table stats", zap.String("table", tableInfo.Name.O), zap.Error(err)) continue } if tbl == nil { diff --git a/pkg/statistics/handle/ddl/BUILD.bazel b/pkg/statistics/handle/ddl/BUILD.bazel index 067d58c44f5ed..7386b905ede7f 100644 --- a/pkg/statistics/handle/ddl/BUILD.bazel +++ b/pkg/statistics/handle/ddl/BUILD.bazel @@ -2,14 +2,27 @@ load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") go_library( name = "ddl", - srcs = ["ddl.go"], + srcs = [ + "ddl.go", + "drop_partition.go", + "exchange_partition.go", + "reorganize_partition.go", + "truncate_partition.go", + ], importpath = "github.com/pingcap/tidb/pkg/statistics/handle/ddl", visibility = ["//visibility:public"], deps = [ + "//pkg/infoschema", "//pkg/parser/model", + "//pkg/sessionctx", "//pkg/sessionctx/variable", + "//pkg/statistics/handle/lockstats", + "//pkg/statistics/handle/logutil", + "//pkg/statistics/handle/storage", "//pkg/statistics/handle/types", "//pkg/statistics/handle/util", + "@com_github_pingcap_errors//:errors", + "@org_uber_go_zap//:zap", ], ) @@ -18,10 +31,11 @@ go_test( timeout = "short", srcs = ["ddl_test.go"], flaky = True, - shard_count = 4, + shard_count = 17, deps = [ "//pkg/parser/model", "//pkg/planner/cardinality", + "//pkg/statistics/handle/util", "//pkg/testkit", "//pkg/types", "//pkg/util/mock", diff --git a/pkg/statistics/handle/ddl/ddl.go b/pkg/statistics/handle/ddl/ddl.go index e4657614a5219..f7904e66b78e8 100644 --- a/pkg/statistics/handle/ddl/ddl.go +++ b/pkg/statistics/handle/ddl/ddl.go @@ -15,8 +15,12 @@ package ddl import ( + "github.com/pingcap/errors" "github.com/pingcap/tidb/pkg/parser/model" + "github.com/pingcap/tidb/pkg/sessionctx" "github.com/pingcap/tidb/pkg/sessionctx/variable" + "github.com/pingcap/tidb/pkg/statistics/handle/lockstats" + "github.com/pingcap/tidb/pkg/statistics/handle/storage" "github.com/pingcap/tidb/pkg/statistics/handle/types" "github.com/pingcap/tidb/pkg/statistics/handle/util" ) @@ -47,7 +51,7 @@ func (h *ddlHandlerImpl) HandleDDLEvent(t *util.DDLEvent) error { switch t.GetType() { case model.ActionCreateTable: newTableInfo := t.GetCreateTableInfo() - ids, err := h.getInitStateTableIDs(newTableInfo) + ids, err := h.getTableIDs(newTableInfo) if err != nil { return err } @@ -57,8 +61,8 @@ func (h *ddlHandlerImpl) HandleDDLEvent(t *util.DDLEvent) error { } } case model.ActionTruncateTable: - newTableInfo, _ := t.GetTruncateTableInfo() - ids, err := h.getInitStateTableIDs(newTableInfo) + newTableInfo, droppedTableInfo := t.GetTruncateTableInfo() + ids, err := h.getTableIDs(newTableInfo) if err != nil { return err } @@ -67,20 +71,31 @@ func (h *ddlHandlerImpl) HandleDDLEvent(t *util.DDLEvent) error { return err } } + + // Remove the old table stats. + droppedIDs, err := h.getTableIDs(droppedTableInfo) + if err != nil { + return err + } + for _, id := range droppedIDs { + if err := h.statsWriter.UpdateStatsMetaVersionForGC(id); err != nil { + return err + } + } case model.ActionDropTable: droppedTableInfo := t.GetDropTableInfo() - ids, err := h.getInitStateTableIDs(droppedTableInfo) + ids, err := h.getTableIDs(droppedTableInfo) if err != nil { return err } for _, id := range ids { - if err := h.statsWriter.ResetTableStats2KVForDrop(id); err != nil { + if err := h.statsWriter.UpdateStatsMetaVersionForGC(id); err != nil { return err } } case model.ActionAddColumn: newTableInfo, newColumnInfo := t.GetAddColumnInfo() - ids, err := h.getInitStateTableIDs(newTableInfo) + ids, err := h.getTableIDs(newTableInfo) if err != nil { return err } @@ -92,7 +107,7 @@ func (h *ddlHandlerImpl) HandleDDLEvent(t *util.DDLEvent) error { case model.ActionModifyColumn: newTableInfo, modifiedColumnInfo := t.GetModifyColumnInfo() - ids, err := h.getInitStateTableIDs(newTableInfo) + ids, err := h.getTableIDs(newTableInfo) if err != nil { return err } @@ -109,65 +124,128 @@ func (h *ddlHandlerImpl) HandleDDLEvent(t *util.DDLEvent) error { } } case model.ActionTruncateTablePartition: - globalTableInfo, addedPartInfo, _ := t.GetTruncatePartitionInfo() - for _, def := range addedPartInfo.Definitions { - if err := h.statsWriter.InsertTableStats2KV(globalTableInfo, def.ID); err != nil { - return err - } + if err := h.onTruncatePartitions(t); err != nil { + return err } case model.ActionDropTablePartition: - pruneMode, err := util.GetCurrentPruneMode(h.statsHandler.SPool()) - if err != nil { + if err := h.onDropPartitions(t); err != nil { return err } - globalTableInfo, droppedPartitionInfo := t.GetDropPartitionInfo() - if variable.PartitionPruneMode(pruneMode) == variable.Dynamic && droppedPartitionInfo != nil { - if err := h.globalStatsHandler.UpdateGlobalStats(globalTableInfo); err != nil { - return err - } - } - for _, def := range droppedPartitionInfo.Definitions { - if err := h.statsWriter.ResetTableStats2KVForDrop(def.ID); err != nil { - return err - } + case model.ActionExchangeTablePartition: + if err := h.onExchangeAPartition(t); err != nil { + return err } case model.ActionReorganizePartition: - globalTableInfo, addedPartInfo, _ := t.GetReorganizePartitionInfo() - for _, def := range addedPartInfo.Definitions { - // TODO: Should we trigger analyze instead of adding 0s? - if err := h.statsWriter.InsertTableStats2KV(globalTableInfo, def.ID); err != nil { - return err - } - // Do not update global stats, since the data have not changed! + if err := h.onReorganizePartitions(t); err != nil { + return err } case model.ActionAlterTablePartitioning: - globalTableInfo, addedPartInfo := t.GetAddPartitioningInfo() - // Add partitioning + oldSingleTableID, globalTableInfo, addedPartInfo := t.GetAddPartitioningInfo() + // Add new partition stats. for _, def := range addedPartInfo.Definitions { - // TODO: Should we trigger analyze instead of adding 0s? if err := h.statsWriter.InsertTableStats2KV(globalTableInfo, def.ID); err != nil { return err } } // Change id for global stats, since the data has not changed! - // Note that globalTableInfo is the new table info - // and addedPartInfo.NewTableID is actually the old table ID! - // (see onReorganizePartition) - return h.statsWriter.ChangeGlobalStatsID(addedPartInfo.NewTableID, globalTableInfo.ID) + // Note: This operation will update all tables related to statistics with the new ID. + return h.statsWriter.ChangeGlobalStatsID(oldSingleTableID, globalTableInfo.ID) case model.ActionRemovePartitioning: // Change id for global stats, since the data has not changed! - // Note that newSingleTableInfo is the new table info - // and droppedPartInfo.NewTableID is actually the old table ID! - // (see onReorganizePartition) - newSingleTableInfo, droppedPartInfo := t.GetRemovePartitioningInfo() - return h.statsWriter.ChangeGlobalStatsID(droppedPartInfo.NewTableID, newSingleTableInfo.ID) + // Note: This operation will update all tables related to statistics with the new ID. + oldTblID, + newSingleTableInfo, + droppedPartInfo := t.GetRemovePartitioningInfo() + if err := h.statsWriter.ChangeGlobalStatsID(oldTblID, newSingleTableInfo.ID); err != nil { + return err + } + + // Remove partition stats. + for _, def := range droppedPartInfo.Definitions { + if err := h.statsWriter.UpdateStatsMetaVersionForGC(def.ID); err != nil { + return err + } + } case model.ActionFlashbackCluster: return h.statsWriter.UpdateStatsVersion() } return nil } -func (h *ddlHandlerImpl) getInitStateTableIDs(tblInfo *model.TableInfo) (ids []int64, err error) { +// updateStatsWithCountDeltaAndModifyCountDelta updates +// the global stats with the given count delta and modify count delta. +// Only used by some special DDLs, such as exchange partition. +func updateStatsWithCountDeltaAndModifyCountDelta( + sctx sessionctx.Context, + tableID int64, + countDelta, modifyCountDelta int64, +) error { + lockedTables, err := lockstats.QueryLockedTables(sctx) + if err != nil { + return errors.Trace(err) + } + isLocked := false + if _, ok := lockedTables[tableID]; ok { + isLocked = true + } + startTS, err := util.GetStartTS(sctx) + if err != nil { + return errors.Trace(err) + } + if isLocked { + // For locked tables, it is possible that the record gets deleted. So it can be negative. + _, err = util.Exec( + sctx, + "INSERT INTO mysql.stats_table_locked "+ + "(version, count, modify_count, table_id) "+ + "VALUES (%?, %?, %?, %?) "+ + "ON DUPLICATE KEY UPDATE "+ + "version = VALUES(version), "+ + "count = count + VALUES(count), "+ + "modify_count = modify_count + VALUES(modify_count)", + startTS, + countDelta, + modifyCountDelta, + tableID, + ) + return err + } + + // Because count can not be negative, so we need to get the current and calculate the delta. + count, modifyCount, isNull, err := storage.StatsMetaCountAndModifyCount(sctx, tableID) + if err != nil { + return err + } + if isNull { + _, err = util.Exec( + sctx, + "INSERT INTO mysql.stats_meta "+ + "(version, count, modify_count, table_id) "+ + "VALUES (%?, GREATEST(0, %?), GREATEST(0, %?), %?)", + startTS, + countDelta, + modifyCountDelta, + tableID, + ) + } else { + _, err = util.Exec( + sctx, + "UPDATE mysql.stats_meta SET "+ + "version = %?, "+ + "count = GREATEST(0, %?), "+ + "modify_count = GREATEST(0, %?) "+ + "WHERE table_id = %?", + startTS, + count+countDelta, + modifyCount+modifyCountDelta, + tableID, + ) + } + + return err +} + +func (h *ddlHandlerImpl) getTableIDs(tblInfo *model.TableInfo) (ids []int64, err error) { pi := tblInfo.GetPartitionInfo() if pi == nil { return []int64{tblInfo.ID}, nil diff --git a/pkg/statistics/handle/ddl/ddl_test.go b/pkg/statistics/handle/ddl/ddl_test.go index 8672dc3bac9c3..e1613a2a2e750 100644 --- a/pkg/statistics/handle/ddl/ddl_test.go +++ b/pkg/statistics/handle/ddl/ddl_test.go @@ -15,10 +15,12 @@ package ddl_test import ( + "fmt" "testing" "github.com/pingcap/tidb/pkg/parser/model" "github.com/pingcap/tidb/pkg/planner/cardinality" + "github.com/pingcap/tidb/pkg/statistics/handle/util" "github.com/pingcap/tidb/pkg/testkit" "github.com/pingcap/tidb/pkg/types" "github.com/pingcap/tidb/pkg/util/mock" @@ -84,17 +86,139 @@ func TestDDLTable(t *testing.T) { require.Nil(t, h.Update(is)) statsTbl = h.GetTableStats(tableInfo) require.False(t, statsTbl.Pseudo) +} - testKit.MustExec("truncate table t1") - is = do.InfoSchema() - tbl, err = is.TableByName(model.NewCIStr("test"), model.NewCIStr("t1")) +func TestTruncateTable(t *testing.T) { + store, do := testkit.CreateMockStoreAndDomain(t) + testKit := testkit.NewTestKit(t, store) + testKit.MustExec("use test") + testKit.MustExec("create table t (c1 int, c2 int)") + is := do.InfoSchema() + tbl, err := is.TableByName(model.NewCIStr("test"), model.NewCIStr("t")) require.NoError(t, err) - tableInfo = tbl.Meta() - err = h.HandleDDLEvent(<-h.DDLEventCh()) + tableInfo := tbl.Meta() + h := do.StatsHandle() + // Insert some data. + testKit.MustExec("insert into t values (1,2),(2,2),(6,2),(11,2),(16,2)") + testKit.MustExec("analyze table t") + err = h.Update(do.InfoSchema()) require.NoError(t, err) - require.Nil(t, h.Update(is)) - statsTbl = h.GetTableStats(tableInfo) + statsTbl := h.GetTableStats(tableInfo) require.False(t, statsTbl.Pseudo) + + // Get stats update version. + rows := testKit.MustQuery( + "select version from mysql.stats_meta where table_id = ?", + tableInfo.ID, + ).Rows() + require.Len(t, rows, 1) + version := rows[0][0].(string) + + // Truncate table. + testKit.MustExec("truncate table t") + + // Find the truncate table partition event. + truncateTableEvent := findEvent(h.DDLEventCh(), model.ActionTruncateTable) + err = h.HandleDDLEvent(truncateTableEvent) + require.NoError(t, err) + + // Get new table info. + is = do.InfoSchema() + tbl, err = is.TableByName(model.NewCIStr("test"), model.NewCIStr("t")) + require.NoError(t, err) + newTableInfo := tbl.Meta() + // Get new added table's stats meta. + rows = testKit.MustQuery( + "select version from mysql.stats_meta where table_id = ?", newTableInfo.ID, + ).Rows() + require.Len(t, rows, 1) + + // Check the version again. + rows = testKit.MustQuery( + "select version from mysql.stats_meta where table_id = ?", tableInfo.ID, + ).Rows() + require.Len(t, rows, 1) + // Version gets updated after truncate the table. + require.NotEqual(t, version, rows[0][0].(string)) +} + +func TestTruncateAPartitionedTable(t *testing.T) { + store, do := testkit.CreateMockStoreAndDomain(t) + testKit := testkit.NewTestKit(t, store) + h := do.StatsHandle() + testKit.MustExec("use test") + testKit.MustExec("drop table if exists t") + testKit.MustExec(` + create table t ( + a int, + b int, + primary key(a), + index idx(b) + ) + partition by range (a) ( + partition p0 values less than (6), + partition p1 values less than (11) + ) + `) + testKit.MustExec("insert into t values (1,2),(2,2),(6,2)") + testKit.MustExec("analyze table t") + is := do.InfoSchema() + tbl, err := is.TableByName( + model.NewCIStr("test"), model.NewCIStr("t"), + ) + require.NoError(t, err) + tableInfo := tbl.Meta() + pi := tableInfo.GetPartitionInfo() + require.NotNil(t, pi) + for _, def := range pi.Definitions { + statsTbl := h.GetPartitionStats(tableInfo, def.ID) + require.False(t, statsTbl.Pseudo) + } + err = h.Update(is) + require.NoError(t, err) + + // Get partition p0's and p1's stats update version. + partitionP0ID := pi.Definitions[0].ID + partitionP1ID := pi.Definitions[1].ID + // Get it from stats_meat first. + rows := testKit.MustQuery( + "select version from mysql.stats_meta where table_id in (?, ?) order by table_id", partitionP0ID, partitionP1ID, + ).Rows() + require.Len(t, rows, 2) + versionP0 := rows[0][0].(string) + versionP1 := rows[1][0].(string) + + // Truncate the whole table. + testKit.MustExec("truncate table t") + // Find the truncate table event. + truncateTableEvent := findEvent(h.DDLEventCh(), model.ActionTruncateTable) + err = h.HandleDDLEvent(truncateTableEvent) + require.NoError(t, err) + + // Get new table info. + is = do.InfoSchema() + tbl, err = is.TableByName(model.NewCIStr("test"), model.NewCIStr("t")) + require.NoError(t, err) + newTableInfo := tbl.Meta() + // Get all new added partitions ID. + newPartitionIDs := make([]int64, 0, len(newTableInfo.Partition.Definitions)) + for _, def := range newTableInfo.Partition.Definitions { + newPartitionIDs = append(newPartitionIDs, def.ID) + } + // Check new added table's stats meta. + rows = testKit.MustQuery( + "select version from mysql.stats_meta where table_id in (?, ?) order by table_id", newPartitionIDs[0], newPartitionIDs[1], + ).Rows() + require.Len(t, rows, 2) + + // Check the version again. + rows = testKit.MustQuery( + "select version from mysql.stats_meta where table_id in (?, ?) order by table_id", partitionP0ID, partitionP1ID, + ).Rows() + require.Len(t, rows, 2) + // Version gets updated after truncate the table. + require.NotEqual(t, versionP0, rows[0][0].(string)) + require.NotEqual(t, versionP1, rows[1][0].(string)) } func TestDDLHistogram(t *testing.T) { @@ -252,35 +376,861 @@ PARTITION BY RANGE ( a ) ( statsTbl := h.GetPartitionStats(tableInfo, def.ID) require.False(t, statsTbl.Pseudo) } + } +} - truncatePartition := "alter table t truncate partition p4" - testKit.MustExec(truncatePartition) - is = do.InfoSchema() - tbl, err = is.TableByName(model.NewCIStr("test"), model.NewCIStr("t")) - require.NoError(t, err) - tableInfo = tbl.Meta() - err = h.HandleDDLEvent(<-h.DDLEventCh()) - require.NoError(t, err) - require.Nil(t, h.Update(is)) - pi = tableInfo.GetPartitionInfo() - for _, def := range pi.Definitions { - statsTbl := h.GetPartitionStats(tableInfo, def.ID) - require.False(t, statsTbl.Pseudo) - } +func TestReorgPartitions(t *testing.T) { + store, do := testkit.CreateMockStoreAndDomain(t) + testKit := testkit.NewTestKit(t, store) + h := do.StatsHandle() + testKit.MustExec("use test") + testKit.MustExec("drop table if exists t") + testKit.MustExec(` + create table t ( + a int, + b int, + primary key(a), + index idx(b) + ) + partition by range (a) ( + partition p0 values less than (6), + partition p1 values less than (11), + partition p2 values less than (16), + partition p3 values less than (21) + ) + `) + testKit.MustExec("insert into t values (1,2),(2,2),(6,2),(11,2),(16,2)") + testKit.MustExec("analyze table t") + is := do.InfoSchema() + tbl, err := is.TableByName( + model.NewCIStr("test"), model.NewCIStr("t"), + ) + require.NoError(t, err) + tableInfo := tbl.Meta() + pi := tableInfo.GetPartitionInfo() + for _, def := range pi.Definitions { + statsTbl := h.GetPartitionStats(tableInfo, def.ID) + require.False(t, statsTbl.Pseudo) + } + err = h.Update(is) + require.NoError(t, err) + // Get all the partition IDs. + partitionIDs := make(map[int64]struct{}, len(pi.Definitions)) + for _, def := range pi.Definitions { + partitionIDs[def.ID] = struct{}{} + } - reorganizePartition := "alter table t reorganize partition p0,p1 into (partition p0 values less than (11))" - testKit.MustExec(reorganizePartition) - is = do.InfoSchema() - tbl, err = is.TableByName(model.NewCIStr("test"), model.NewCIStr("t")) - require.NoError(t, err) - tableInfo = tbl.Meta() - err = h.HandleDDLEvent(<-h.DDLEventCh()) - require.NoError(t, err) - require.Nil(t, h.Update(is)) - pi = tableInfo.GetPartitionInfo() - for _, def := range pi.Definitions { - statsTbl := h.GetPartitionStats(tableInfo, def.ID) - require.False(t, statsTbl.Pseudo) + // Get partition p0 and p1's stats update version. + partitionP0ID := pi.Definitions[0].ID + partitionP1ID := pi.Definitions[1].ID + // Get it from stats_meat first. + rows := testKit.MustQuery( + "select version from mysql.stats_meta where table_id in (?, ?) order by table_id", partitionP0ID, partitionP1ID, + ).Rows() + require.Len(t, rows, 2) + versionP0 := rows[0][0].(string) + versionP1 := rows[1][0].(string) + + // Reorganize two partitions. + testKit.MustExec("alter table t reorganize partition p0, p1 into (partition p0 values less than (11))") + // Find the reorganize partition event. + reorganizePartitionEvent := findEvent(h.DDLEventCh(), model.ActionReorganizePartition) + err = h.HandleDDLEvent(reorganizePartitionEvent) + require.NoError(t, err) + require.Nil(t, h.Update(is)) + + // Check the version again. + rows = testKit.MustQuery( + "select version from mysql.stats_meta where table_id in (?, ?) order by table_id", partitionP0ID, partitionP1ID, + ).Rows() + require.Len(t, rows, 2) + require.NotEqual(t, versionP0, rows[0][0].(string)) + require.NotEqual(t, versionP1, rows[1][0].(string)) +} + +func TestIncreasePartitionCountOfHashPartitionTable(t *testing.T) { + store, do := testkit.CreateMockStoreAndDomain(t) + testKit := testkit.NewTestKit(t, store) + h := do.StatsHandle() + + testKit.MustExec("use test") + testKit.MustExec("drop table if exists t") + testKit.MustExec("create table t (a int, b int) partition by hash(a) partitions 2") + testKit.MustExec("insert into t values (1,2),(2,2),(6,2),(11,2),(16,2)") + testKit.MustExec("analyze table t") + is := do.InfoSchema() + tbl, err := is.TableByName( + model.NewCIStr("test"), model.NewCIStr("t"), + ) + require.NoError(t, err) + tableInfo := tbl.Meta() + pi := tableInfo.GetPartitionInfo() + for _, def := range pi.Definitions { + statsTbl := h.GetPartitionStats(tableInfo, def.ID) + require.False(t, statsTbl.Pseudo) + } + err = h.Update(is) + require.NoError(t, err) + + // Get partition p0 and p1's stats update version. + partitionP0ID := pi.Definitions[0].ID + partitionP1ID := pi.Definitions[1].ID + // Get it from stats_meat first. + rows := testKit.MustQuery( + "select version from mysql.stats_meta where table_id in (?, ?) order by table_id", partitionP0ID, partitionP1ID, + ).Rows() + require.Len(t, rows, 2) + versionP0 := rows[0][0].(string) + versionP1 := rows[1][0].(string) + + // Increase the partition count to 4. + testKit.MustExec("alter table t add partition partitions 2") + // Find the reorganize partition event. + reorganizePartitionEvent := findEvent(h.DDLEventCh(), model.ActionReorganizePartition) + err = h.HandleDDLEvent(reorganizePartitionEvent) + require.NoError(t, err) + require.Nil(t, h.Update(is)) + + // Check new partitions are added. + is = do.InfoSchema() + tbl, err = is.TableByName( + model.NewCIStr("test"), model.NewCIStr("t"), + ) + require.NoError(t, err) + tableInfo = tbl.Meta() + pi = tableInfo.GetPartitionInfo() + require.Len(t, pi.Definitions, 4) + // Check the stats meta. + rows = testKit.MustQuery( + "select version from mysql.stats_meta where table_id in (?, ?, ?, ?) order by table_id", + pi.Definitions[0].ID, pi.Definitions[1].ID, pi.Definitions[2].ID, pi.Definitions[3].ID, + ).Rows() + require.Len(t, rows, 4) + + // Check the old partitions' stats version is changed. + rows = testKit.MustQuery( + "select version from mysql.stats_meta where table_id in (?, ?) order by table_id", partitionP0ID, partitionP1ID, + ).Rows() + require.Len(t, rows, 2) + require.NotEqual(t, versionP0, rows[0][0].(string)) + require.NotEqual(t, versionP1, rows[1][0].(string)) +} + +func TestDecreasePartitionCountOfHashPartitionTable(t *testing.T) { + store, do := testkit.CreateMockStoreAndDomain(t) + testKit := testkit.NewTestKit(t, store) + h := do.StatsHandle() + + testKit.MustExec("use test") + testKit.MustExec("drop table if exists t") + testKit.MustExec("create table t (a int, b int) partition by hash(a) partitions 4") + testKit.MustExec("insert into t values (1,2),(2,2),(6,2),(11,2),(16,2)") + testKit.MustExec("analyze table t") + is := do.InfoSchema() + tbl, err := is.TableByName( + model.NewCIStr("test"), model.NewCIStr("t"), + ) + require.NoError(t, err) + tableInfo := tbl.Meta() + pi := tableInfo.GetPartitionInfo() + require.Len(t, pi.Definitions, 4) + for _, def := range pi.Definitions { + statsTbl := h.GetPartitionStats(tableInfo, def.ID) + require.False(t, statsTbl.Pseudo) + } + err = h.Update(is) + require.NoError(t, err) + + // Get partition p0 and p1's stats update version. + partitionP0ID := pi.Definitions[0].ID + partitionP1ID := pi.Definitions[1].ID + partitionP2ID := pi.Definitions[2].ID + partitionP3ID := pi.Definitions[3].ID + // Get it from stats_meat first. + rows := testKit.MustQuery( + "select version from mysql.stats_meta where table_id in (?, ?, ?, ?) order by table_id", + partitionP0ID, partitionP1ID, partitionP2ID, partitionP3ID, + ).Rows() + require.Len(t, rows, 4) + versionP0 := rows[0][0].(string) + versionP1 := rows[1][0].(string) + versionP2 := rows[2][0].(string) + versionP3 := rows[3][0].(string) + + // Decrease the partition count to 2. + testKit.MustExec("alter table t coalesce partition 2") + // Find the reorganize partition event. + reorganizePartitionEvent := findEvent(h.DDLEventCh(), model.ActionReorganizePartition) + err = h.HandleDDLEvent(reorganizePartitionEvent) + require.NoError(t, err) + require.Nil(t, h.Update(is)) + + // Check new partitions are added. + is = do.InfoSchema() + tbl, err = is.TableByName( + model.NewCIStr("test"), model.NewCIStr("t"), + ) + require.NoError(t, err) + tableInfo = tbl.Meta() + pi = tableInfo.GetPartitionInfo() + require.Len(t, pi.Definitions, 2) + // Check the stats meta. + rows = testKit.MustQuery( + "select version from mysql.stats_meta where table_id in (?, ?) order by table_id", + pi.Definitions[0].ID, pi.Definitions[1].ID, + ).Rows() + require.Len(t, rows, 2) + + // Check the old partitions' stats version is changed. + rows = testKit.MustQuery( + "select version from mysql.stats_meta where table_id in (?, ?, ?, ?) order by table_id", + partitionP0ID, partitionP1ID, partitionP2ID, partitionP3ID, + ).Rows() + require.Len(t, rows, 4) + require.NotEqual(t, versionP0, rows[0][0].(string)) + require.NotEqual(t, versionP1, rows[1][0].(string)) + require.NotEqual(t, versionP2, rows[2][0].(string)) + require.NotEqual(t, versionP3, rows[3][0].(string)) +} + +func TestTruncateAPartition(t *testing.T) { + store, do := testkit.CreateMockStoreAndDomain(t) + testKit := testkit.NewTestKit(t, store) + h := do.StatsHandle() + testKit.MustExec("use test") + testKit.MustExec("drop table if exists t") + testKit.MustExec(` + create table t ( + a int, + b int, + primary key(a), + index idx(b) + ) + partition by range (a) ( + partition p0 values less than (6), + partition p1 values less than (11), + partition p2 values less than (16), + partition p3 values less than (21) + ) + `) + testKit.MustExec("insert into t values (1,2),(2,2),(6,2),(11,2),(16,2)") + testKit.MustExec("analyze table t") + is := do.InfoSchema() + tbl, err := is.TableByName( + model.NewCIStr("test"), model.NewCIStr("t"), + ) + require.NoError(t, err) + tableInfo := tbl.Meta() + pi := tableInfo.GetPartitionInfo() + for _, def := range pi.Definitions { + statsTbl := h.GetPartitionStats(tableInfo, def.ID) + require.False(t, statsTbl.Pseudo) + } + err = h.Update(is) + require.NoError(t, err) + + // Get partition p0's stats update version. + partitionID := pi.Definitions[0].ID + // Get it from stats_meat first. + rows := testKit.MustQuery( + "select version from mysql.stats_meta where table_id = ?", partitionID, + ).Rows() + require.Len(t, rows, 1) + version := rows[0][0].(string) + + testKit.MustExec("alter table t truncate partition p0") + // Find the truncate partition event. + truncatePartitionEvent := findEvent(h.DDLEventCh(), model.ActionTruncateTablePartition) + err = h.HandleDDLEvent(truncatePartitionEvent) + require.NoError(t, err) + // Check global stats meta. + // Because we have truncated a partition, the count should be 5 - 2 = 3 and the modify count should be 2. + testKit.MustQuery( + "select count, modify_count from mysql.stats_meta where table_id = ?", tableInfo.ID, + ).Check( + testkit.Rows("3 2"), + ) + + // Check the version again. + rows = testKit.MustQuery( + "select version from mysql.stats_meta where table_id = ?", partitionID, + ).Rows() + require.Len(t, rows, 1) + // Version gets updated after truncate the partition. + require.NotEqual(t, version, rows[0][0].(string)) +} + +func TestTruncateAHashPartition(t *testing.T) { + store, do := testkit.CreateMockStoreAndDomain(t) + testKit := testkit.NewTestKit(t, store) + h := do.StatsHandle() + testKit.MustExec("use test") + testKit.MustExec("drop table if exists t") + testKit.MustExec(` + create table t ( + a bigint, + b int, + primary key(a), + index idx(b) + ) + partition by hash(a) partitions 4 + `) + testKit.MustExec("insert into t values (1,2),(2,2),(6,2),(11,2),(16,2)") + testKit.MustExec("analyze table t") + is := do.InfoSchema() + tbl, err := is.TableByName( + model.NewCIStr("test"), model.NewCIStr("t"), + ) + require.NoError(t, err) + tableInfo := tbl.Meta() + pi := tableInfo.GetPartitionInfo() + require.NotNil(t, pi) + for _, def := range pi.Definitions { + statsTbl := h.GetPartitionStats(tableInfo, def.ID) + require.False(t, statsTbl.Pseudo) + } + err = h.Update(is) + require.NoError(t, err) + + // Get partition p0's stats update version. + partitionID := pi.Definitions[0].ID + // Get it from stats_meat first. + rows := testKit.MustQuery( + "select version from mysql.stats_meta where table_id = ?", partitionID, + ).Rows() + require.Len(t, rows, 1) + version := rows[0][0].(string) + + testKit.MustExec("alter table t truncate partition p0") + // Find the truncate partition event. + truncatePartitionEvent := findEvent(h.DDLEventCh(), model.ActionTruncateTablePartition) + err = h.HandleDDLEvent(truncatePartitionEvent) + require.NoError(t, err) + // Check global stats meta. + // Because we have truncated a partition, the count should be 5 - 1 = 4 and the modify count should be 1. + testKit.MustQuery( + "select count, modify_count from mysql.stats_meta where table_id = ?", tableInfo.ID, + ).Check( + testkit.Rows("4 1"), + ) + + // Check the version again. + rows = testKit.MustQuery( + "select version from mysql.stats_meta where table_id = ?", partitionID, + ).Rows() + require.Len(t, rows, 1) + // Version gets updated after truncate the partition. + require.NotEqual(t, version, rows[0][0].(string)) +} + +func TestTruncatePartitions(t *testing.T) { + store, do := testkit.CreateMockStoreAndDomain(t) + testKit := testkit.NewTestKit(t, store) + h := do.StatsHandle() + testKit.MustExec("use test") + testKit.MustExec("drop table if exists t") + testKit.MustExec(` + create table t ( + a int, + b int, + primary key(a), + index idx(b) + ) + partition by range (a) ( + partition p0 values less than (6), + partition p1 values less than (11), + partition p2 values less than (16), + partition p3 values less than (21) + ) + `) + testKit.MustExec("insert into t values (1,2),(2,2),(6,2),(11,2),(16,2)") + testKit.MustExec("analyze table t") + is := do.InfoSchema() + tbl, err := is.TableByName( + model.NewCIStr("test"), model.NewCIStr("t"), + ) + require.NoError(t, err) + tableInfo := tbl.Meta() + pi := tableInfo.GetPartitionInfo() + for _, def := range pi.Definitions { + statsTbl := h.GetPartitionStats(tableInfo, def.ID) + require.False(t, statsTbl.Pseudo) + } + err = h.Update(is) + require.NoError(t, err) + + // Get partition p0 and p1's stats update version. + partitionP0ID := pi.Definitions[0].ID + partitionP1ID := pi.Definitions[1].ID + // Get it from stats_meat first. + rows := testKit.MustQuery( + "select version from mysql.stats_meta where table_id in (?, ?) order by table_id", partitionP0ID, partitionP1ID, + ).Rows() + require.Len(t, rows, 2) + versionP0 := rows[0][0].(string) + versionP1 := rows[1][0].(string) + + // Truncate two partitions. + testKit.MustExec("alter table t truncate partition p0, p1") + // Find the truncate partition event. + truncatePartitionEvent := findEvent(h.DDLEventCh(), model.ActionTruncateTablePartition) + err = h.HandleDDLEvent(truncatePartitionEvent) + require.NoError(t, err) + // Check global stats meta. + // Because we have truncated two partitions, the count should be 5 - 2 - 1 = 2 and the modify count should be 3. + testKit.MustQuery( + "select count, modify_count from mysql.stats_meta where table_id = ?", tableInfo.ID, + ).Check( + testkit.Rows("2 3"), + ) + + // Check the version again. + rows = testKit.MustQuery( + "select version from mysql.stats_meta where table_id in (?, ?) order by table_id", partitionP0ID, partitionP1ID, + ).Rows() + require.Len(t, rows, 2) + // Version gets updated after truncate the partition. + require.NotEqual(t, versionP0, rows[0][0].(string)) + require.NotEqual(t, versionP1, rows[1][0].(string)) +} + +func TestDropAPartition(t *testing.T) { + store, do := testkit.CreateMockStoreAndDomain(t) + testKit := testkit.NewTestKit(t, store) + h := do.StatsHandle() + testKit.MustExec("use test") + testKit.MustExec("drop table if exists t") + testKit.MustExec(` + create table t ( + a int, + b int, + primary key(a), + index idx(b) + ) + partition by range (a) ( + partition p0 values less than (6), + partition p1 values less than (11), + partition p2 values less than (16), + partition p3 values less than (21) + ) + `) + testKit.MustExec("insert into t values (1,2),(2,2),(6,2),(11,2),(16,2)") + testKit.MustExec("analyze table t") + is := do.InfoSchema() + tbl, err := is.TableByName( + model.NewCIStr("test"), model.NewCIStr("t"), + ) + require.NoError(t, err) + tableInfo := tbl.Meta() + pi := tableInfo.GetPartitionInfo() + for _, def := range pi.Definitions { + statsTbl := h.GetPartitionStats(tableInfo, def.ID) + require.False(t, statsTbl.Pseudo) + } + err = h.Update(is) + require.NoError(t, err) + + testKit.MustExec("alter table t drop partition p0") + // Find the drop partition event. + dropPartitionEvent := findEvent(h.DDLEventCh(), model.ActionDropTablePartition) + + err = h.HandleDDLEvent(dropPartitionEvent) + require.NoError(t, err) + // Check the global stats meta. + // Because we have dropped a partition, the count should be 3 and the modify count should be 2. + testKit.MustQuery( + "select count, modify_count from mysql.stats_meta where table_id = ?", tableInfo.ID, + ).Check( + testkit.Rows("3 2"), + ) + + // Get partition p0's stats update version. + partitionID := pi.Definitions[0].ID + // Get it from stats_meta first. + rows := testKit.MustQuery( + "select version from mysql.stats_meta where table_id = ?", partitionID, + ).Rows() + require.Len(t, rows, 1) + version := rows[0][0].(string) + + // Check the update version is changed. + rows = testKit.MustQuery( + "select version from mysql.stats_meta where table_id = ?", tableInfo.ID, + ).Rows() + require.Len(t, rows, 1) + require.NotEqual(t, version, rows[0][0].(string)) +} + +func TestDropPartitions(t *testing.T) { + store, do := testkit.CreateMockStoreAndDomain(t) + testKit := testkit.NewTestKit(t, store) + h := do.StatsHandle() + testKit.MustExec("use test") + testKit.MustExec("drop table if exists t") + testKit.MustExec(` + create table t ( + a int, + b int, + primary key(a), + index idx(b) + ) + partition by range (a) ( + partition p0 values less than (6), + partition p1 values less than (11), + partition p2 values less than (16), + partition p3 values less than (21) + ) + `) + testKit.MustExec("insert into t values (1,2),(2,2),(6,2),(11,2),(16,2)") + testKit.MustExec("analyze table t") + is := do.InfoSchema() + tbl, err := is.TableByName( + model.NewCIStr("test"), model.NewCIStr("t"), + ) + require.NoError(t, err) + tableInfo := tbl.Meta() + pi := tableInfo.GetPartitionInfo() + for _, def := range pi.Definitions { + statsTbl := h.GetPartitionStats(tableInfo, def.ID) + require.False(t, statsTbl.Pseudo) + } + err = h.Update(is) + require.NoError(t, err) + + // Get partition p0 and p1's stats update version. + partitionP0ID := pi.Definitions[0].ID + partitionP1ID := pi.Definitions[1].ID + // Get it from stats_meat first. + rows := testKit.MustQuery( + "select version from mysql.stats_meta where table_id in (?, ?) order by table_id", + partitionP0ID, partitionP1ID, + ).Rows() + require.Len(t, rows, 2) + versionP0 := rows[0][0].(string) + versionP1 := rows[1][0].(string) + + // Drop partition p0 and p1. + testKit.MustExec("alter table t drop partition p0,p1") + // Find the drop partition event. + dropPartitionEvent := findEvent(h.DDLEventCh(), model.ActionDropTablePartition) + + err = h.HandleDDLEvent(dropPartitionEvent) + require.NoError(t, err) + + // Check the global stats meta. + // Because we have dropped two partitions, + // the count should be 5 - 2 - 1 = 2 and the modify count should be 2 +1 = 3. + testKit.MustQuery( + "select count, modify_count from mysql.stats_meta where table_id = ?", tableInfo.ID, + ).Check( + testkit.Rows("2 3"), + ) + + // Check the update versions are changed. + rows = testKit.MustQuery( + "select version from mysql.stats_meta where table_id in (?, ?) order by table_id", + partitionP0ID, partitionP1ID, + ).Rows() + require.Len(t, rows, 2) + require.NotEqual(t, versionP0, rows[0][0].(string)) + require.NotEqual(t, versionP1, rows[1][0].(string)) +} + +func TestExchangeAPartition(t *testing.T) { + store, do := testkit.CreateMockStoreAndDomain(t) + testKit := testkit.NewTestKit(t, store) + h := do.StatsHandle() + testKit.MustExec("use test") + testKit.MustExec("drop table if exists t") + // Create a table with 4 partitions. + testKit.MustExec(` + create table t ( + a int, + b int, + primary key(a), + index idx(b) + ) + partition by range (a) ( + partition p0 values less than (6), + partition p1 values less than (11), + partition p2 values less than (16), + partition p3 values less than (21) + ) + `) + testKit.MustExec("insert into t values (1,2),(2,2),(6,2),(11,2),(16,2)") + h.DumpStatsDeltaToKV(true) + + testKit.MustExec("analyze table t") + is := do.InfoSchema() + tbl, err := is.TableByName( + model.NewCIStr("test"), model.NewCIStr("t"), + ) + require.NoError(t, err) + tableInfo := tbl.Meta() + pi := tableInfo.GetPartitionInfo() + for _, def := range pi.Definitions { + statsTbl := h.GetPartitionStats(tableInfo, def.ID) + require.False(t, statsTbl.Pseudo) + } + // Create a normal table to exchange partition. + testKit.MustExec("drop table if exists t1") + testKit.MustExec("create table t1 (a int, b int, primary key(a), index idx(b))") + // Insert some data which meets the condition of the partition p0. + testKit.MustExec("insert into t1 values (1,2),(2,2),(3,2),(4,2),(5,2)") + err = h.DumpStatsDeltaToKV(true) + require.NoError(t, err) + + testKit.MustExec("analyze table t1") + is = do.InfoSchema() + tbl1, err := is.TableByName( + model.NewCIStr("test"), model.NewCIStr("t1"), + ) + require.NoError(t, err) + tableInfo1 := tbl1.Meta() + statsTbl1 := h.GetTableStats(tableInfo1) + require.False(t, statsTbl1.Pseudo) + + // Check the global stats meta before exchange partition. + testKit.MustQuery( + fmt.Sprintf("select count, modify_count from mysql.stats_meta where table_id = %d", tableInfo.ID), + ).Check( + testkit.Rows("5 0"), + ) + + // Exchange partition p0 with table t1. + testKit.MustExec("alter table t exchange partition p0 with table t1") + // Find the exchange partition event. + exchangePartitionEvent := findEvent(h.DDLEventCh(), model.ActionExchangeTablePartition) + err = h.HandleDDLEvent(exchangePartitionEvent) + require.NoError(t, err) + // Check the global stats meta. + // Because we have exchanged a partition, the count should be 5 and the modify count should be 5(table) + 2(partition). + // 5 -> Five rows are added to table 't' as 't1' is included as a new partition. + // 2 -> Two rows are removed from table 't' as partition 'p0' is no longer a part of it. + testKit.MustQuery( + fmt.Sprintf("select count, modify_count from mysql.stats_meta where table_id = %d", tableInfo.ID), + ).Check( + testkit.Rows("8 7"), + ) + + // Create another normal table with no data to exchange partition. + testKit.MustExec("drop table if exists t2") + testKit.MustExec("create table t2 (a int, b int, primary key(a), index idx(b))") + testKit.MustExec("analyze table t2") + is = do.InfoSchema() + tbl2, err := is.TableByName( + model.NewCIStr("test"), model.NewCIStr("t2"), + ) + require.NoError(t, err) + tableInfo2 := tbl2.Meta() + statsTbl2 := h.GetTableStats(tableInfo2) + require.False(t, statsTbl2.Pseudo) + err = h.Update(do.InfoSchema()) + require.NoError(t, err) + + // Insert some data to partition p1 before exchange partition. + testKit.MustExec("insert into t values (7,2),(8,2),(9,2),(10,2)") + err = h.DumpStatsDeltaToKV(true) + require.NoError(t, err) + testKit.MustQuery( + fmt.Sprintf("select count, modify_count from mysql.stats_meta where table_id = %d", tableInfo.ID), + ).Check( + // modify_count = 7 + 4 = 11 + testkit.Rows("12 11"), + ) + + testKit.MustExec("alter table t exchange partition p1 with table t2") + // Find the exchange partition event. + exchangePartitionEvent = findEvent(h.DDLEventCh(), model.ActionExchangeTablePartition) + err = h.HandleDDLEvent(exchangePartitionEvent) + require.NoError(t, err) + // Check the global stats meta. + testKit.MustQuery( + fmt.Sprintf("select count, modify_count from mysql.stats_meta where table_id = %d", tableInfo.ID), + ).Check( + // count = 12 - 5(old partition) + 0(new table) = 7 + // modify_count = 11 + 5(old partition) + 0(new table) - 4(old partition) = 12 + // 5 -> Five rows are removed from table 't' as partition 'p1' is no longer a part of it. + // 0 -> No rows are added to table 't' as 't2' is added as a partition to it. + // 4 -> Four rows are subtracted from table 't' due to the insertion of four rows into partition 'p1'. + testkit.Rows("7 12"), + ) + + // Test if the global stats is accidentally dropped. + // Create another normal table with no data to exchange partition. + testKit.MustExec("drop table if exists t3") + testKit.MustExec("create table t3 (a int, b int, primary key(a), index idx(b))") + testKit.MustExec("analyze table t3") + is = do.InfoSchema() + tbl3, err := is.TableByName( + model.NewCIStr("test"), model.NewCIStr("t3"), + ) + require.NoError(t, err) + tableInfo3 := tbl3.Meta() + statsTbl3 := h.GetTableStats(tableInfo3) + require.False(t, statsTbl3.Pseudo) + err = h.Update(do.InfoSchema()) + require.NoError(t, err) + + testKit.MustExec("alter table t exchange partition p2 with table t3") + // Drop the global stats. + testKit.MustExec(fmt.Sprintf("delete from mysql.stats_meta where table_id = %d", tableInfo.ID)) + // Find the exchange partition event. + exchangePartitionEvent = findEvent(h.DDLEventCh(), model.ActionExchangeTablePartition) + err = h.HandleDDLEvent(exchangePartitionEvent) + require.NoError(t, err) + // Check the global stats meta. + testKit.MustQuery( + fmt.Sprintf("select count, modify_count from mysql.stats_meta where table_id = %d", tableInfo.ID), + ).Check( + // Insert the global stats back. + testkit.Rows("0 1"), + ) +} + +func TestRemovePartitioning(t *testing.T) { + store, do := testkit.CreateMockStoreAndDomain(t) + testKit := testkit.NewTestKit(t, store) + h := do.StatsHandle() + testKit.MustExec("use test") + testKit.MustExec("drop table if exists t") + // Create a table with 4 partitions. + testKit.MustExec(` + create table t ( + a int, + b int, + primary key(a), + index idx(b) + ) + partition by range (a) ( + partition p0 values less than (6), + partition p1 values less than (11), + partition p2 values less than (16), + partition p3 values less than (21) + ) + `) + testKit.MustExec("insert into t values (1,2),(2,2),(6,2),(11,2),(16,2)") + h.DumpStatsDeltaToKV(true) + + testKit.MustExec("analyze table t") + is := do.InfoSchema() + tbl, err := is.TableByName( + model.NewCIStr("test"), model.NewCIStr("t"), + ) + require.NoError(t, err) + tableInfo := tbl.Meta() + pi := tableInfo.GetPartitionInfo() + for _, def := range pi.Definitions { + statsTbl := h.GetPartitionStats(tableInfo, def.ID) + require.False(t, statsTbl.Pseudo) + } + + // Get all partitions' stats update version. + partitionP0ID := pi.Definitions[0].ID + partitionP1ID := pi.Definitions[1].ID + partitionP2ID := pi.Definitions[2].ID + partitionP3ID := pi.Definitions[3].ID + // Get it from stats_meta first. + rows := testKit.MustQuery( + "select version from mysql.stats_meta where table_id in (?, ?, ?, ?) order by table_id", + partitionP0ID, partitionP1ID, partitionP2ID, partitionP3ID, + ).Rows() + require.Len(t, rows, 4) + versionP0 := rows[0][0].(string) + versionP1 := rows[1][0].(string) + versionP2 := rows[2][0].(string) + versionP3 := rows[3][0].(string) + + // Remove partitioning. + testKit.MustExec("alter table t remove partitioning") + // Find the remove partitioning event. + removePartitioningEvent := findEvent(h.DDLEventCh(), model.ActionRemovePartitioning) + err = h.HandleDDLEvent(removePartitioningEvent) + require.NoError(t, err) + // Check the global stats meta make sure the count and modify count are not changed. + // Get new table id after remove partitioning. + is = do.InfoSchema() + tbl, err = is.TableByName( + model.NewCIStr("test"), model.NewCIStr("t"), + ) + require.NoError(t, err) + tableInfo = tbl.Meta() + testKit.MustQuery( + fmt.Sprintf("select count, modify_count from mysql.stats_meta where table_id = %d", tableInfo.ID), + ).Check( + testkit.Rows("5 0"), + ) + + // Check the update versions are changed. + rows = testKit.MustQuery( + "select version from mysql.stats_meta where table_id in (?, ?, ?, ?) order by table_id", + partitionP0ID, partitionP1ID, partitionP2ID, partitionP3ID, + ).Rows() + require.Len(t, rows, 4) + require.NotEqual(t, versionP0, rows[0][0].(string)) + require.NotEqual(t, versionP1, rows[1][0].(string)) + require.NotEqual(t, versionP2, rows[2][0].(string)) + require.NotEqual(t, versionP3, rows[3][0].(string)) +} + +func TestAddPartitioning(t *testing.T) { + store, do := testkit.CreateMockStoreAndDomain(t) + testKit := testkit.NewTestKit(t, store) + h := do.StatsHandle() + testKit.MustExec("use test") + testKit.MustExec("drop table if exists t") + // Create a table without partitioning. + testKit.MustExec(` + create table t ( + a int, + b int, + primary key(a), + index idx(b) + ) + `) + testKit.MustExec("insert into t values (1,2),(2,2),(6,2),(11,2),(16,2)") + h.DumpStatsDeltaToKV(true) + testKit.MustExec("analyze table t") + is := do.InfoSchema() + tbl, err := is.TableByName( + model.NewCIStr("test"), model.NewCIStr("t"), + ) + require.NoError(t, err) + tableInfo := tbl.Meta() + // Check the global stats meta before add partitioning. + testKit.MustQuery( + fmt.Sprintf("select count, modify_count from mysql.stats_meta where table_id = %d", tableInfo.ID), + ).Check( + testkit.Rows("5 0"), + ) + + // Add partitioning. + testKit.MustExec("alter table t partition by hash(a) partitions 3") + // Find the add partitioning event. + addPartitioningEvent := findEvent(h.DDLEventCh(), model.ActionAlterTablePartitioning) + err = h.HandleDDLEvent(addPartitioningEvent) + require.NoError(t, err) + // Check the global stats meta make sure the count and modify count are not changed. + // Get new table id after remove partitioning. + is = do.InfoSchema() + tbl, err = is.TableByName( + model.NewCIStr("test"), model.NewCIStr("t"), + ) + require.NoError(t, err) + tableInfo = tbl.Meta() + testKit.MustQuery( + fmt.Sprintf("select count, modify_count from mysql.stats_meta where table_id = %d", tableInfo.ID), + ).Check( + testkit.Rows("5 0"), + ) +} + +func findEvent(eventCh <-chan *util.DDLEvent, eventType model.ActionType) *util.DDLEvent { + // Find the target event. + for { + event := <-eventCh + if event.GetType() == eventType { + return event } } } diff --git a/pkg/statistics/handle/ddl/drop_partition.go b/pkg/statistics/handle/ddl/drop_partition.go new file mode 100644 index 0000000000000..9ff8c8011a059 --- /dev/null +++ b/pkg/statistics/handle/ddl/drop_partition.go @@ -0,0 +1,79 @@ +// Copyright 2023 PingCAP, 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. + +package ddl + +import ( + "github.com/pingcap/errors" + "github.com/pingcap/tidb/pkg/sessionctx" + "github.com/pingcap/tidb/pkg/sessionctx/variable" + "github.com/pingcap/tidb/pkg/statistics/handle/lockstats" + "github.com/pingcap/tidb/pkg/statistics/handle/storage" + "github.com/pingcap/tidb/pkg/statistics/handle/util" +) + +func (h *ddlHandlerImpl) onDropPartitions(t *util.DDLEvent) error { + globalTableInfo, droppedPartitionInfo := t.GetDropPartitionInfo() + // Note: Put all the operations in a transaction. + if err := util.CallWithSCtx(h.statsHandler.SPool(), func(sctx sessionctx.Context) error { + count := int64(0) + for _, def := range droppedPartitionInfo.Definitions { + // Get the count and modify count of the partition. + tableCount, _, _, err := storage.StatsMetaCountAndModifyCount(sctx, def.ID) + if err != nil { + return err + } + count += tableCount + } + if count != 0 { + lockedTables, err := lockstats.QueryLockedTables(sctx) + if err != nil { + return errors.Trace(err) + } + isLocked := false + if _, ok := lockedTables[globalTableInfo.ID]; ok { + isLocked = true + } + startTS, err := util.GetStartTS(sctx) + if err != nil { + return errors.Trace(err) + } + + // Because we drop the partition, we should subtract the count from the global stats. + delta := -count + err = storage.UpdateStatsMeta( + sctx, + startTS, + variable.TableDelta{Count: count, Delta: delta}, + globalTableInfo.ID, + isLocked, + ) + return err + } + + return nil + }, util.FlagWrapTxn); err != nil { + return err + } + + // Reset the partition stats. + // It's OK to put those operations in different transactions. Because it will not affect the correctness. + for _, def := range droppedPartitionInfo.Definitions { + if err := h.statsWriter.UpdateStatsMetaVersionForGC(def.ID); err != nil { + return err + } + } + + return nil +} diff --git a/pkg/statistics/handle/ddl/exchange_partition.go b/pkg/statistics/handle/ddl/exchange_partition.go new file mode 100644 index 0000000000000..af93bc905e2fe --- /dev/null +++ b/pkg/statistics/handle/ddl/exchange_partition.go @@ -0,0 +1,147 @@ +// Copyright 2023 PingCAP, 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. + +package ddl + +import ( + "github.com/pingcap/errors" + "github.com/pingcap/tidb/pkg/infoschema" + "github.com/pingcap/tidb/pkg/parser/model" + "github.com/pingcap/tidb/pkg/sessionctx" + "github.com/pingcap/tidb/pkg/statistics/handle/logutil" + "github.com/pingcap/tidb/pkg/statistics/handle/storage" + "github.com/pingcap/tidb/pkg/statistics/handle/util" + "go.uber.org/zap" +) + +func (h *ddlHandlerImpl) onExchangeAPartition(t *util.DDLEvent) error { + globalTableInfo, originalPartInfo, + originalTableInfo := t.GetExchangePartitionInfo() + // Note: Put all the operations in a transaction. + if err := util.CallWithSCtx(h.statsHandler.SPool(), func(sctx sessionctx.Context) error { + partCount, partModifyCount, tableCount, tableModifyCount, err := getCountsAndModifyCounts( + sctx, + originalPartInfo.Definitions[0].ID, + originalTableInfo.ID, + ) + if err != nil { + return err + } + + // The count of the partition should be added to the table. + // The formula is: total_count = original_table_count - original_partition_count + new_table_count. + // So the delta is : new_table_count - original_partition_count. + countDelta := tableCount - partCount + // Initially, the sum of tableCount and partCount represents + // the operation of deleting the partition and adding the table. + // Therefore, they are considered as modifyCountDelta. + // Next, since the old partition no longer belongs to the table, + // the modify count of the partition should be subtracted. + // The modify count of the table should be added as we are adding the table as a partition. + modifyCountDelta := (tableCount + partCount) - partModifyCount + tableModifyCount + + // Update the global stats. + if modifyCountDelta != 0 || countDelta != 0 { + is := sctx.GetDomainInfoSchema().(infoschema.InfoSchema) + globalTableSchema, ok := is.SchemaByTable(globalTableInfo) + if !ok { + return errors.Errorf("schema not found for table %s", globalTableInfo.Name.O) + } + if err := updateStatsWithCountDeltaAndModifyCountDelta( + sctx, + globalTableInfo.ID, countDelta, modifyCountDelta, + ); err != nil { + fields := exchangePartitionLogFields( + globalTableSchema.Name.O, + globalTableInfo, + originalPartInfo.Definitions[0], + originalTableInfo, + countDelta, modifyCountDelta, + partCount, + partModifyCount, + tableCount, + tableModifyCount, + ) + fields = append(fields, zap.Error(err)) + logutil.StatsLogger().Error( + "Update global stats after exchange partition failed", + fields..., + ) + return err + } + logutil.StatsLogger().Info( + "Update global stats after exchange partition", + exchangePartitionLogFields( + globalTableSchema.Name.O, + globalTableInfo, + originalPartInfo.Definitions[0], + originalTableInfo, + countDelta, modifyCountDelta, + partCount, + partModifyCount, + tableCount, + tableModifyCount, + )..., + ) + } + return nil + }, util.FlagWrapTxn); err != nil { + return err + } + + return nil +} + +func getCountsAndModifyCounts( + sctx sessionctx.Context, + partitionID, tableID int64, +) (partCount, partModifyCount, tableCount, tableModifyCount int64, err error) { + partCount, partModifyCount, _, err = storage.StatsMetaCountAndModifyCount(sctx, partitionID) + if err != nil { + return + } + + tableCount, tableModifyCount, _, err = storage.StatsMetaCountAndModifyCount(sctx, tableID) + if err != nil { + return + } + + return +} + +func exchangePartitionLogFields( + globalTableSchemaName string, + globalTableInfo *model.TableInfo, + originalPartDef model.PartitionDefinition, + originalTableInfo *model.TableInfo, + countDelta, modifyCountDelta, + partCount, partModifyCount, + tableCount, tableModifyCount int64, +) []zap.Field { + return []zap.Field{ + zap.String("globalTableSchema", globalTableSchemaName), + zap.Int64("globalTableID", globalTableInfo.ID), + zap.String("globalTableName", globalTableInfo.Name.O), + zap.Int64("countDelta", countDelta), + zap.Int64("modifyCountDelta", modifyCountDelta), + zap.Int64("partitionID", originalPartDef.ID), + zap.String("partitionName", originalPartDef.Name.O), + zap.Int64("partitionCount", partCount), + zap.Int64("partitionModifyCount", partModifyCount), + zap.Int64("tableID", originalTableInfo.ID), + zap.String("tableName", originalTableInfo.Name.O), + zap.Int64("tableCount", tableCount), + zap.Int64("tableModifyCount", tableModifyCount), + } +} diff --git a/pkg/statistics/handle/ddl/reorganize_partition.go b/pkg/statistics/handle/ddl/reorganize_partition.go new file mode 100644 index 0000000000000..2c9d3faa5367e --- /dev/null +++ b/pkg/statistics/handle/ddl/reorganize_partition.go @@ -0,0 +1,47 @@ +// Copyright 2023 PingCAP, 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. + +package ddl + +import ( + "github.com/pingcap/tidb/pkg/statistics/handle/util" +) + +func (h *ddlHandlerImpl) onReorganizePartitions(t *util.DDLEvent) error { + globalTableInfo, + addedPartInfo, + droppedPartitionInfo := t.GetReorganizePartitionInfo() + // Avoid updating global stats as the data remains unchanged. + // For new partitions, it's crucial to correctly insert the count and modify count correctly. + // However, this is challenging due to the need to know the count of the new partitions. + // Given that a partition can be split into two, determining the count of the new partitions is so hard. + // It's acceptable to not update it immediately, + // as the new partitions will be analyzed shortly due to the absence of statistics for them. + // Therefore, the auto-analyze worker will handle them in the near future. + for _, def := range addedPartInfo.Definitions { + if err := h.statsWriter.InsertTableStats2KV(globalTableInfo, def.ID); err != nil { + return err + } + } + + // Reset the partition stats. + // It's OK to put those operations in different transactions. Because it will not affect the correctness. + for _, def := range droppedPartitionInfo.Definitions { + if err := h.statsWriter.UpdateStatsMetaVersionForGC(def.ID); err != nil { + return err + } + } + + return nil +} diff --git a/pkg/statistics/handle/ddl/truncate_partition.go b/pkg/statistics/handle/ddl/truncate_partition.go new file mode 100644 index 0000000000000..e05e51df2b0bf --- /dev/null +++ b/pkg/statistics/handle/ddl/truncate_partition.go @@ -0,0 +1,161 @@ +// Copyright 2023 PingCAP, 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. + +package ddl + +import ( + "github.com/pingcap/errors" + "github.com/pingcap/tidb/pkg/infoschema" + "github.com/pingcap/tidb/pkg/parser/model" + "github.com/pingcap/tidb/pkg/sessionctx" + "github.com/pingcap/tidb/pkg/sessionctx/variable" + "github.com/pingcap/tidb/pkg/statistics/handle/lockstats" + "github.com/pingcap/tidb/pkg/statistics/handle/logutil" + "github.com/pingcap/tidb/pkg/statistics/handle/storage" + "github.com/pingcap/tidb/pkg/statistics/handle/util" + "go.uber.org/zap" +) + +func (h *ddlHandlerImpl) onTruncatePartitions(t *util.DDLEvent) error { + globalTableInfo, addedPartInfo, droppedPartInfo := t.GetTruncatePartitionInfo() + // First, add the new stats meta record for the new partitions. + for _, def := range addedPartInfo.Definitions { + if err := h.statsWriter.InsertTableStats2KV(globalTableInfo, def.ID); err != nil { + return err + } + } + + // Second, clean up the old stats meta from global stats meta for the dropped partitions. + // Do not forget to put those operations in one transaction. + if err := util.CallWithSCtx(h.statsHandler.SPool(), func(sctx sessionctx.Context) error { + count := int64(0) + partitionIDs := make([]int64, 0, len(droppedPartInfo.Definitions)) + partitionNames := make([]string, 0, len(droppedPartInfo.Definitions)) + for _, def := range droppedPartInfo.Definitions { + // Get the count and modify count of the partition. + tableCount, _, _, err := storage.StatsMetaCountAndModifyCount(sctx, def.ID) + if err != nil { + return err + } + count += tableCount + partitionIDs = append(partitionIDs, def.ID) + partitionNames = append(partitionNames, def.Name.O) + } + + if count != 0 { + is := sctx.GetDomainInfoSchema().(infoschema.InfoSchema) + globalTableSchema, ok := is.SchemaByTable(globalTableInfo) + if !ok { + return errors.Errorf("schema not found for table %s", globalTableInfo.Name.O) + } + lockedTables, err := lockstats.QueryLockedTables(sctx) + if err != nil { + return errors.Trace(err) + } + isLocked := false + if _, ok := lockedTables[globalTableInfo.ID]; ok { + isLocked = true + } + startTS, err := util.GetStartTS(sctx) + if err != nil { + return errors.Trace(err) + } + + // Because we drop the partition, we should subtract the count from the global stats. + // Note: We don't need to subtract the modify count from the global stats. + // For example: + // 1. The partition has 100 rows. + // 2. We deleted 100 rows from the partition. + // 3. The global stats has `count - 100 rows` and 100 modify count. + // 4. We drop the partition. + // 5. The global stats should not be `count` and 0 modify count. We need to keep the modify count. + delta := -count + err = storage.UpdateStatsMeta( + sctx, + startTS, + variable.TableDelta{Count: count, Delta: delta}, + globalTableInfo.ID, + isLocked, + ) + if err != nil { + fields := truncatePartitionsLogFields( + globalTableSchema, + globalTableInfo, + partitionIDs, + partitionNames, + count, + delta, + startTS, + isLocked, + ) + fields = append(fields, zap.Error(err)) + logutil.StatsLogger().Error("Update global stats after truncate partition failed", + fields..., + ) + return err + } + + logutil.StatsLogger().Info("Update global stats after truncate partition", + truncatePartitionsLogFields( + globalTableSchema, + globalTableInfo, + partitionIDs, + partitionNames, + count, + delta, + startTS, + isLocked, + )..., + ) + return nil + } + + return nil + }, util.FlagWrapTxn); err != nil { + return err + } + + // Third, clean up the old stats meta from partition stats meta for the dropped partitions. + // It's OK to put those operations in different transactions. Because it will not affect the correctness. + for _, def := range droppedPartInfo.Definitions { + if err := h.statsWriter.UpdateStatsMetaVersionForGC(def.ID); err != nil { + return err + } + } + + return nil +} + +func truncatePartitionsLogFields( + globalTableSchema *model.DBInfo, + globalTableInfo *model.TableInfo, + partitionIDs []int64, + partitionNames []string, + count int64, + delta int64, + startTS uint64, + isLocked bool, +) []zap.Field { + return []zap.Field{ + zap.String("schema", globalTableSchema.Name.O), + zap.Int64("tableID", globalTableInfo.ID), + zap.String("tableName", globalTableInfo.Name.O), + zap.Int64s("partitionIDs", partitionIDs), + zap.Strings("partitionNames", partitionNames), + zap.Int64("count", count), + zap.Int64("delta", delta), + zap.Uint64("startTS", startTS), + zap.Bool("isLocked", isLocked), + } +} diff --git a/pkg/statistics/handle/globalstats/BUILD.bazel b/pkg/statistics/handle/globalstats/BUILD.bazel index 81f237df5ae2c..b97a69f7991f4 100644 --- a/pkg/statistics/handle/globalstats/BUILD.bazel +++ b/pkg/statistics/handle/globalstats/BUILD.bazel @@ -16,7 +16,6 @@ go_library( "//pkg/parser/model", "//pkg/sessionctx", "//pkg/sessionctx/stmtctx", - "//pkg/sessiontxn", "//pkg/statistics", "//pkg/statistics/handle/logutil", "//pkg/statistics/handle/storage", @@ -38,16 +37,17 @@ go_test( name = "globalstats_test", timeout = "short", srcs = [ - "globalstats_test.go", + "global_stats_internal_test.go", + "global_stats_test.go", "main_test.go", "topn_bench_test.go", "topn_test.go", ], embed = [":globalstats"], flaky = True, - shard_count = 23, + shard_count = 26, deps = [ - "//pkg/config", + "//pkg/domain", "//pkg/parser/model", "//pkg/parser/mysql", "//pkg/sessionctx/stmtctx", diff --git a/pkg/statistics/handle/globalstats/global_stats.go b/pkg/statistics/handle/globalstats/global_stats.go index af2eaf52d745f..65fa86d3f4163 100644 --- a/pkg/statistics/handle/globalstats/global_stats.go +++ b/pkg/statistics/handle/globalstats/global_stats.go @@ -22,10 +22,8 @@ import ( "github.com/pingcap/tidb/pkg/parser/ast" "github.com/pingcap/tidb/pkg/parser/model" "github.com/pingcap/tidb/pkg/sessionctx" - "github.com/pingcap/tidb/pkg/sessiontxn" "github.com/pingcap/tidb/pkg/statistics" statstypes "github.com/pingcap/tidb/pkg/statistics/handle/types" - "github.com/pingcap/tidb/pkg/statistics/handle/util" "github.com/pingcap/tidb/pkg/types" "github.com/pingcap/tidb/pkg/util/logutil" "github.com/tiancaiamao/gp" @@ -57,14 +55,6 @@ func (sg *statsGlobalImpl) MergePartitionStats2GlobalStatsByTableID(sc sessionct return MergePartitionStats2GlobalStatsByTableID(sc, sg.statsHandler, opts, is, physicalID, isIndex, histIDs) } -// UpdateGlobalStats will trigger the merge of global-stats when we drop table partition -func (sg *statsGlobalImpl) UpdateGlobalStats(tblInfo *model.TableInfo) error { - // We need to merge the partition-level stats to global-stats when we drop table partition in dynamic mode. - return util.CallWithSCtx(sg.statsHandler.SPool(), func(sctx sessionctx.Context) error { - return UpdateGlobalStats(sctx, sg.statsHandler, tblInfo) - }) -} - // GlobalStats is used to store the statistics contained in the global-level stats // which is generated by the merge of partition-level stats. // It will both store the column stats and index stats. @@ -135,16 +125,10 @@ func MergePartitionStats2GlobalStatsByTableID( } globalTableInfo := globalTable.Meta() - - worker, err := NewAsyncMergePartitionStats2GlobalStats(statsHandle, globalTableInfo, histIDs, is) - if err != nil { - return nil, errors.Trace(err) - } - err = worker.MergePartitionStats2GlobalStats(sc, opts, isIndex) + globalStats, err = MergePartitionStats2GlobalStats(sc, statsHandle, opts, is, globalTableInfo, isIndex, histIDs) if err != nil { return nil, errors.Trace(err) } - globalStats = worker.Result() if len(globalStats.MissingPartitionStats) > 0 { var item string if !isIndex { @@ -170,107 +154,6 @@ var analyzeOptionDefault = map[ast.AnalyzeOptionType]uint64{ ast.AnalyzeOptNumTopN: 20, } -// UpdateGlobalStats update the global-level stats based on the partition-level stats. -func UpdateGlobalStats( - sctx sessionctx.Context, - statsHandle statstypes.StatsHandle, - tblInfo *model.TableInfo) error { - tableID := tblInfo.ID - is := sessiontxn.GetTxnManager(sctx).GetTxnInfoSchema() - globalStats, err := statsHandle.TableStatsFromStorage(tblInfo, tableID, true, 0) - if err != nil { - return err - } - // If we do not currently have global-stats, no new global-stats will be generated. - if globalStats == nil { - return nil - } - opts := make(map[ast.AnalyzeOptionType]uint64, len(analyzeOptionDefault)) - for key, val := range analyzeOptionDefault { - opts[key] = val - } - // Use current global-stats related information to construct the opts for `MergePartitionStats2GlobalStats` function. - globalColStatsTopNNum, globalColStatsBucketNum := 0, 0 - for colID := range globalStats.Columns { - globalColStatsTopN := globalStats.Columns[colID].TopN - if globalColStatsTopN != nil && len(globalColStatsTopN.TopN) > globalColStatsTopNNum { - globalColStatsTopNNum = len(globalColStatsTopN.TopN) - } - globalColStats := globalStats.Columns[colID] - if globalColStats != nil && len(globalColStats.Buckets) > globalColStatsBucketNum { - globalColStatsBucketNum = len(globalColStats.Buckets) - } - } - if globalColStatsTopNNum != 0 { - opts[ast.AnalyzeOptNumTopN] = uint64(globalColStatsTopNNum) - } - if globalColStatsBucketNum != 0 { - opts[ast.AnalyzeOptNumBuckets] = uint64(globalColStatsBucketNum) - } - // Generate the new column global-stats - newColGlobalStats, err := MergePartitionStats2GlobalStats(sctx, statsHandle, opts, is, tblInfo, false, nil) - if err != nil { - return err - } - if len(newColGlobalStats.MissingPartitionStats) > 0 { - logutil.BgLogger().Warn("missing partition stats when merging global stats", zap.String("table", tblInfo.Name.L), - zap.String("item", "columns"), zap.Strings("missing", newColGlobalStats.MissingPartitionStats)) - } - for i := 0; i < newColGlobalStats.Num; i++ { - hg, cms, topN := newColGlobalStats.Hg[i], newColGlobalStats.Cms[i], newColGlobalStats.TopN[i] - if hg == nil { - // All partitions have no stats so global stats are not created. - continue - } - // fms for global stats doesn't need to dump to kv. - err = statsHandle.SaveStatsToStorage(tableID, newColGlobalStats.Count, newColGlobalStats.ModifyCount, - 0, hg, cms, topN, 2, 1, false, util.StatsMetaHistorySourceSchemaChange) - if err != nil { - return err - } - } - - // Generate the new index global-stats - globalIdxStatsTopNNum, globalIdxStatsBucketNum := 0, 0 - for _, idx := range tblInfo.Indices { - globalIdxStatsTopN := globalStats.Indices[idx.ID].TopN - if globalIdxStatsTopN != nil && len(globalIdxStatsTopN.TopN) > globalIdxStatsTopNNum { - globalIdxStatsTopNNum = len(globalIdxStatsTopN.TopN) - } - globalIdxStats := globalStats.Indices[idx.ID] - if globalIdxStats != nil && len(globalIdxStats.Buckets) > globalIdxStatsBucketNum { - globalIdxStatsBucketNum = len(globalIdxStats.Buckets) - } - if globalIdxStatsTopNNum != 0 { - opts[ast.AnalyzeOptNumTopN] = uint64(globalIdxStatsTopNNum) - } - if globalIdxStatsBucketNum != 0 { - opts[ast.AnalyzeOptNumBuckets] = uint64(globalIdxStatsBucketNum) - } - newIndexGlobalStats, err := MergePartitionStats2GlobalStats(sctx, statsHandle, opts, is, tblInfo, true, []int64{idx.ID}) - if err != nil { - return err - } - if len(newIndexGlobalStats.MissingPartitionStats) > 0 { - logutil.BgLogger().Warn("missing partition stats when merging global stats", zap.String("table", tblInfo.Name.L), - zap.String("item", "index "+idx.Name.L), zap.Strings("missing", newIndexGlobalStats.MissingPartitionStats)) - } - for i := 0; i < newIndexGlobalStats.Num; i++ { - hg, cms, topN := newIndexGlobalStats.Hg[i], newIndexGlobalStats.Cms[i], newIndexGlobalStats.TopN[i] - if hg == nil { - // All partitions have no stats so global stats are not created. - continue - } - // fms for global stats doesn't need to dump to kv. - err = statsHandle.SaveStatsToStorage(tableID, newIndexGlobalStats.Count, newIndexGlobalStats.ModifyCount, 1, hg, cms, topN, 2, 1, false, util.StatsMetaHistorySourceSchemaChange) - if err != nil { - return err - } - } - } - return nil -} - // blockingMergePartitionStats2GlobalStats merge the partition-level stats to global-level stats based on the tableInfo. // It is the old algorithm to merge partition-level stats to global-level stats. It will happen the OOM. because it will load all the partition-level stats into memory. func blockingMergePartitionStats2GlobalStats( diff --git a/pkg/statistics/handle/globalstats/global_stats_async.go b/pkg/statistics/handle/globalstats/global_stats_async.go index 0ecfd66463866..2ef30c6cdba24 100644 --- a/pkg/statistics/handle/globalstats/global_stats_async.go +++ b/pkg/statistics/handle/globalstats/global_stats_async.go @@ -225,7 +225,7 @@ func (a *AsyncMergePartitionStats2GlobalStats) dealErrPartitionColumnStatsMissin func (a *AsyncMergePartitionStats2GlobalStats) ioWorker(sctx sessionctx.Context, isIndex bool) (err error) { defer func() { if r := recover(); r != nil { - statslogutil.StatsLogger.Warn("ioWorker panic", zap.Stack("stack"), zap.Any("error", r)) + statslogutil.StatsLogger().Warn("ioWorker panic", zap.Stack("stack"), zap.Any("error", r)) close(a.ioWorkerExitWhenErrChan) err = errors.New(fmt.Sprint(r)) } @@ -260,7 +260,7 @@ func (a *AsyncMergePartitionStats2GlobalStats) ioWorker(sctx sessionctx.Context, func (a *AsyncMergePartitionStats2GlobalStats) cpuWorker(stmtCtx *stmtctx.StatementContext, sctx sessionctx.Context, opts map[ast.AnalyzeOptionType]uint64, isIndex bool, tz *time.Location, analyzeVersion int) (err error) { defer func() { if r := recover(); r != nil { - statslogutil.StatsLogger.Warn("cpuWorker panic", zap.Stack("stack"), zap.Any("error", r)) + statslogutil.StatsLogger().Warn("cpuWorker panic", zap.Stack("stack"), zap.Any("error", r)) err = errors.New(fmt.Sprint(r)) } close(a.cpuWorkerExitChan) @@ -282,7 +282,7 @@ func (a *AsyncMergePartitionStats2GlobalStats) cpuWorker(stmtCtx *stmtctx.Statem } err = a.dealCMSketch() if err != nil { - statslogutil.StatsLogger.Warn("dealCMSketch failed", zap.Error(err)) + statslogutil.StatsLogger().Warn("dealCMSketch failed", zap.Error(err)) return err } failpoint.Inject("PanicSameTime", func(val failpoint.Value) { @@ -293,7 +293,7 @@ func (a *AsyncMergePartitionStats2GlobalStats) cpuWorker(stmtCtx *stmtctx.Statem }) err = a.dealHistogramAndTopN(stmtCtx, sctx, opts, isIndex, tz, analyzeVersion) if err != nil { - statslogutil.StatsLogger.Warn("dealHistogramAndTopN failed", zap.Error(err)) + statslogutil.StatsLogger().Warn("dealHistogramAndTopN failed", zap.Error(err)) return err } return nil @@ -361,7 +361,7 @@ func (a *AsyncMergePartitionStats2GlobalStats) loadFmsketch(sctx sessionctx.Cont fmsketch, i, }: case <-a.cpuWorkerExitChan: - statslogutil.StatsLogger.Warn("ioWorker detects CPUWorker has exited") + statslogutil.StatsLogger().Warn("ioWorker detects CPUWorker has exited") return nil } } @@ -392,7 +392,7 @@ func (a *AsyncMergePartitionStats2GlobalStats) loadCMsketch(sctx sessionctx.Cont cmsketch, i, }: case <-a.cpuWorkerExitChan: - statslogutil.StatsLogger.Warn("ioWorker detects CPUWorker has exited") + statslogutil.StatsLogger().Warn("ioWorker detects CPUWorker has exited") return nil } } @@ -434,7 +434,7 @@ func (a *AsyncMergePartitionStats2GlobalStats) loadHistogramAndTopN(sctx session NewStatsWrapper(hists, topn), i, }: case <-a.cpuWorkerExitChan: - statslogutil.StatsLogger.Warn("ioWorker detects CPUWorker has exited") + statslogutil.StatsLogger().Warn("ioWorker detects CPUWorker has exited") return nil } } @@ -515,17 +515,18 @@ func (a *AsyncMergePartitionStats2GlobalStats) dealHistogramAndTopN(stmtCtx *stm } // Merge histogram. - a.globalStats.Hg[item.idx], err = statistics.MergePartitionHist2GlobalHist(stmtCtx, allhg, poppedTopN, + globalHg := &(a.globalStats.Hg[item.idx]) + *globalHg, err = statistics.MergePartitionHist2GlobalHist(stmtCtx, allhg, poppedTopN, int64(opts[ast.AnalyzeOptNumBuckets]), isIndex) if err != nil { return err } // NOTICE: after merging bucket NDVs have the trend to be underestimated, so for safe we don't use them. - for j := range a.globalStats.Hg[item.idx].Buckets { - a.globalStats.Hg[item.idx].Buckets[j].NDV = 0 + for j := range (*globalHg).Buckets { + (*globalHg).Buckets[j].NDV = 0 } - a.globalStats.Hg[item.idx].NDV = a.globalStatsNDV[item.idx] + (*globalHg).NDV = a.globalStatsNDV[item.idx] case <-a.ioWorkerExitWhenErrChan: return nil } diff --git a/pkg/statistics/handle/globalstats/global_stats_internal_test.go b/pkg/statistics/handle/globalstats/global_stats_internal_test.go new file mode 100644 index 0000000000000..fb675c9d2b602 --- /dev/null +++ b/pkg/statistics/handle/globalstats/global_stats_internal_test.go @@ -0,0 +1,432 @@ +// Copyright 2023 PingCAP, 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. + +package globalstats_test + +import ( + "fmt" + "math/rand" + "strings" + "testing" + + "github.com/pingcap/tidb/pkg/domain" + "github.com/pingcap/tidb/pkg/testkit" + "github.com/stretchr/testify/require" +) + +func testGlobalStats2(t *testing.T, tk *testkit.TestKit, dom *domain.Domain) { + tk.MustExec("use test") + tk.MustExec("set @@tidb_partition_prune_mode='dynamic'") + tk.MustExec("set @@tidb_analyze_version=2") + + // int + (column & index with 1 column) + tk.MustExec("drop table if exists tint") + tk.MustExec("create table tint (c int, key(c)) partition by range (c) (partition p0 values less than (10), partition p1 values less than (20))") + tk.MustExec("insert into tint values (1), (2), (3), (4), (4), (5), (5), (5), (null), (11), (12), (13), (14), (15), (16), (16), (16), (16), (17), (17)") + require.NoError(t, dom.StatsHandle().DumpStatsDeltaToKV(true)) + tk.MustExec("analyze table tint with 2 topn, 2 buckets") + + tk.MustQuery("select modify_count, count from mysql.stats_meta order by table_id asc").Check(testkit.Rows( + "0 20", // global: g.count = p0.count + p1.count + "0 9", // p0 + "0 11")) // p1 + + tk.MustQuery("show stats_topn where table_name='tint' and is_index=0").Check(testkit.Rows( + "test tint global c 0 5 3", + "test tint global c 0 16 4", + "test tint p0 c 0 4 2", + "test tint p0 c 0 5 3", + "test tint p1 c 0 16 4", + "test tint p1 c 0 17 2")) + + tk.MustQuery("show stats_topn where table_name='tint' and is_index=1").Check(testkit.Rows( + "test tint global c 1 5 3", + "test tint global c 1 16 4", + "test tint p0 c 1 4 2", + "test tint p0 c 1 5 3", + "test tint p1 c 1 16 4", + "test tint p1 c 1 17 2")) + + tk.MustQuery("show stats_buckets where is_index=0").Check(testkit.Rows( + // db, tbl, part, col, isIdx, bucketID, count, repeat, lower, upper, ndv + "test tint global c 0 0 5 2 1 4 0", // bucket.ndv is not maintained for column histograms + "test tint global c 0 1 12 2 17 17 0", + "test tint p0 c 0 0 2 1 1 2 0", + "test tint p0 c 0 1 3 1 3 3 0", + "test tint p1 c 0 0 3 1 11 13 0", + "test tint p1 c 0 1 5 1 14 15 0")) + + tk.MustQuery("select distinct_count, null_count, tot_col_size from mysql.stats_histograms where is_index=0 order by table_id asc").Check( + testkit.Rows("12 1 19", // global, g = p0 + p1 + "5 1 8", // p0 + "7 0 11")) // p1 + + tk.MustQuery("show stats_buckets where is_index=1").Check(testkit.Rows( + // db, tbl, part, col, isIdx, bucketID, count, repeat, lower, upper, ndv + "test tint global c 1 0 5 2 1 4 0", // 4 is popped from p0.TopN, so g.ndv = p0.ndv+1 + "test tint global c 1 1 12 2 17 17 0", // same with the column's + "test tint p0 c 1 0 2 1 1 2 0", + "test tint p0 c 1 1 3 1 3 3 0", + "test tint p1 c 1 0 3 1 11 13 0", + "test tint p1 c 1 1 5 1 14 15 0")) + + tk.MustQuery("select distinct_count, null_count from mysql.stats_histograms where is_index=1 order by table_id asc").Check( + testkit.Rows("12 1", // global, g = p0 + p1 + "5 1", // p0 + "7 0")) // p1 + + // double + (column + index with 1 column) + tk.MustExec("drop table if exists tdouble") + tk.MustExec(`create table tdouble (a int, c double, key(c)) partition by range (a)` + + `(partition p0 values less than(10),partition p1 values less than(20))`) + tk.MustExec(`insert into tdouble values ` + + `(1, 1), (2, 2), (3, 3), (4, 4), (4, 4), (5, 5), (5, 5), (5, 5), (null, null), ` + // values in p0 + `(11, 11), (12, 12), (13, 13), (14, 14), (15, 15), (16, 16), (16, 16), (16, 16), (16, 16), (17, 17), (17, 17)`) // values in p1 + require.NoError(t, dom.StatsHandle().DumpStatsDeltaToKV(true)) + tk.MustExec("analyze table tdouble with 2 topn, 2 buckets") + + rs := tk.MustQuery("show stats_meta where table_name='tdouble'").Rows() + require.Equal(t, "20", rs[0][5].(string)) // g.count = p0.count + p1.count + require.Equal(t, "9", rs[1][5].(string)) // p0.count + require.Equal(t, "11", rs[2][5].(string)) // p1.count + + tk.MustQuery("show stats_topn where table_name='tdouble' and is_index=0 and column_name='c'").Check(testkit.Rows( + `test tdouble global c 0 5 3`, + `test tdouble global c 0 16 4`, + `test tdouble p0 c 0 4 2`, + `test tdouble p0 c 0 5 3`, + `test tdouble p1 c 0 16 4`, + `test tdouble p1 c 0 17 2`)) + + tk.MustQuery("show stats_topn where table_name='tdouble' and is_index=1 and column_name='c'").Check(testkit.Rows( + `test tdouble global c 1 5 3`, + `test tdouble global c 1 16 4`, + `test tdouble p0 c 1 4 2`, + `test tdouble p0 c 1 5 3`, + `test tdouble p1 c 1 16 4`, + `test tdouble p1 c 1 17 2`)) + + tk.MustQuery("show stats_buckets where table_name='tdouble' and is_index=0 and column_name='c'").Check(testkit.Rows( + // db, tbl, part, col, isIdx, bucketID, count, repeat, lower, upper, ndv + "test tdouble global c 0 0 5 2 1 4 0", // bucket.ndv is not maintained for column histograms + "test tdouble global c 0 1 12 2 17 17 0", + "test tdouble p0 c 0 0 2 1 1 2 0", + "test tdouble p0 c 0 1 3 1 3 3 0", + "test tdouble p1 c 0 0 3 1 11 13 0", + "test tdouble p1 c 0 1 5 1 14 15 0")) + + rs = tk.MustQuery("show stats_histograms where table_name='tdouble' and column_name='c' and is_index=0").Rows() + require.Equal(t, "12", rs[0][6].(string)) // g.ndv = p0 + p1 + require.Equal(t, "5", rs[1][6].(string)) + require.Equal(t, "7", rs[2][6].(string)) + require.Equal(t, "1", rs[0][7].(string)) // g.null_count = p0 + p1 + require.Equal(t, "1", rs[1][7].(string)) + require.Equal(t, "0", rs[2][7].(string)) + + tk.MustQuery("show stats_buckets where table_name='tdouble' and is_index=1 and column_name='c'").Check(testkit.Rows( + // db, tbl, part, col, isIdx, bucketID, count, repeat, lower, upper, ndv + "test tdouble global c 1 0 5 2 1 4 0", // 4 is popped from p0.TopN, so g.ndv = p0.ndv+1 + "test tdouble global c 1 1 12 2 17 17 0", + "test tdouble p0 c 1 0 2 1 1 2 0", + "test tdouble p0 c 1 1 3 1 3 3 0", + "test tdouble p1 c 1 0 3 1 11 13 0", + "test tdouble p1 c 1 1 5 1 14 15 0")) + + rs = tk.MustQuery("show stats_histograms where table_name='tdouble' and column_name='c' and is_index=1").Rows() + require.Equal(t, "12", rs[0][6].(string)) // g.ndv = p0 + p1 + require.Equal(t, "5", rs[1][6].(string)) + require.Equal(t, "7", rs[2][6].(string)) + require.Equal(t, "1", rs[0][7].(string)) // g.null_count = p0 + p1 + require.Equal(t, "1", rs[1][7].(string)) + require.Equal(t, "0", rs[2][7].(string)) + + // decimal + (column + index with 1 column) + tk.MustExec("drop table if exists tdecimal") + tk.MustExec(`create table tdecimal (a int, c decimal(10, 2), key(c)) partition by range (a)` + + `(partition p0 values less than(10),partition p1 values less than(20))`) + tk.MustExec(`insert into tdecimal values ` + + `(1, 1), (2, 2), (3, 3), (4, 4), (4, 4), (5, 5), (5, 5), (5, 5), (null, null), ` + // values in p0 + `(11, 11), (12, 12), (13, 13), (14, 14), (15, 15), (16, 16), (16, 16), (16, 16), (16, 16), (17, 17), (17, 17)`) // values in p1 + require.NoError(t, dom.StatsHandle().DumpStatsDeltaToKV(true)) + tk.MustExec("analyze table tdecimal with 2 topn, 2 buckets") + + rs = tk.MustQuery("show stats_meta where table_name='tdecimal'").Rows() + require.Equal(t, "20", rs[0][5].(string)) // g.count = p0.count + p1.count + require.Equal(t, "9", rs[1][5].(string)) // p0.count + require.Equal(t, "11", rs[2][5].(string)) // p1.count + + tk.MustQuery("show stats_topn where table_name='tdecimal' and is_index=0 and column_name='c'").Check(testkit.Rows( + `test tdecimal global c 0 5.00 3`, + `test tdecimal global c 0 16.00 4`, + `test tdecimal p0 c 0 4.00 2`, + `test tdecimal p0 c 0 5.00 3`, + `test tdecimal p1 c 0 16.00 4`, + `test tdecimal p1 c 0 17.00 2`)) + + tk.MustQuery("show stats_topn where table_name='tdecimal' and is_index=1 and column_name='c'").Check(testkit.Rows( + `test tdecimal global c 1 5.00 3`, + `test tdecimal global c 1 16.00 4`, + `test tdecimal p0 c 1 4.00 2`, + `test tdecimal p0 c 1 5.00 3`, + `test tdecimal p1 c 1 16.00 4`, + `test tdecimal p1 c 1 17.00 2`)) + + tk.MustQuery("show stats_buckets where table_name='tdecimal' and is_index=0 and column_name='c'").Check(testkit.Rows( + // db, tbl, part, col, isIdx, bucketID, count, repeat, lower, upper, ndv + "test tdecimal global c 0 0 5 2 1.00 4.00 0", // bucket.ndv is not maintained for column histograms + "test tdecimal global c 0 1 12 2 17.00 17.00 0", + "test tdecimal p0 c 0 0 2 1 1.00 2.00 0", + "test tdecimal p0 c 0 1 3 1 3.00 3.00 0", + "test tdecimal p1 c 0 0 3 1 11.00 13.00 0", + "test tdecimal p1 c 0 1 5 1 14.00 15.00 0")) + + rs = tk.MustQuery("show stats_histograms where table_name='tdecimal' and column_name='c' and is_index=0").Rows() + require.Equal(t, "12", rs[0][6].(string)) // g.ndv = p0 + p1 + require.Equal(t, "5", rs[1][6].(string)) + require.Equal(t, "7", rs[2][6].(string)) + require.Equal(t, "1", rs[0][7].(string)) // g.null_count = p0 + p1 + require.Equal(t, "1", rs[1][7].(string)) + require.Equal(t, "0", rs[2][7].(string)) + + tk.MustQuery("show stats_buckets where table_name='tdecimal' and is_index=1 and column_name='c'").Check(testkit.Rows( + // db, tbl, part, col, isIdx, bucketID, count, repeat, lower, upper, ndv + "test tdecimal global c 1 0 5 2 1.00 4.00 0", // 4 is popped from p0.TopN, so g.ndv = p0.ndv+1 + "test tdecimal global c 1 1 12 2 17.00 17.00 0", + "test tdecimal p0 c 1 0 2 1 1.00 2.00 0", + "test tdecimal p0 c 1 1 3 1 3.00 3.00 0", + "test tdecimal p1 c 1 0 3 1 11.00 13.00 0", + "test tdecimal p1 c 1 1 5 1 14.00 15.00 0")) + + rs = tk.MustQuery("show stats_histograms where table_name='tdecimal' and column_name='c' and is_index=1").Rows() + require.Equal(t, "12", rs[0][6].(string)) // g.ndv = p0 + p1 + require.Equal(t, "5", rs[1][6].(string)) + require.Equal(t, "7", rs[2][6].(string)) + require.Equal(t, "1", rs[0][7].(string)) // g.null_count = p0 + p1 + require.Equal(t, "1", rs[1][7].(string)) + require.Equal(t, "0", rs[2][7].(string)) + + // datetime + (column + index with 1 column) + tk.MustExec("drop table if exists tdatetime") + tk.MustExec(`create table tdatetime (a int, c datetime, key(c)) partition by range (a)` + + `(partition p0 values less than(10),partition p1 values less than(20))`) + tk.MustExec(`insert into tdatetime values ` + + `(1, '2000-01-01'), (2, '2000-01-02'), (3, '2000-01-03'), (4, '2000-01-04'), (4, '2000-01-04'), (5, '2000-01-05'), (5, '2000-01-05'), (5, '2000-01-05'), (null, null), ` + // values in p0 + `(11, '2000-01-11'), (12, '2000-01-12'), (13, '2000-01-13'), (14, '2000-01-14'), (15, '2000-01-15'), (16, '2000-01-16'), (16, '2000-01-16'), (16, '2000-01-16'), (16, '2000-01-16'), (17, '2000-01-17'), (17, '2000-01-17')`) // values in p1 + require.NoError(t, dom.StatsHandle().DumpStatsDeltaToKV(true)) + tk.MustExec("analyze table tdatetime with 2 topn, 2 buckets") + + rs = tk.MustQuery("show stats_meta where table_name='tdatetime'").Rows() + require.Equal(t, "20", rs[0][5].(string)) // g.count = p0.count + p1.count + require.Equal(t, "9", rs[1][5].(string)) // p0.count + require.Equal(t, "11", rs[2][5].(string)) // p1.count + + tk.MustQuery("show stats_topn where table_name='tdatetime' and is_index=0 and column_name='c'").Check(testkit.Rows( + `test tdatetime global c 0 2000-01-05 00:00:00 3`, + `test tdatetime global c 0 2000-01-16 00:00:00 4`, + `test tdatetime p0 c 0 2000-01-04 00:00:00 2`, + `test tdatetime p0 c 0 2000-01-05 00:00:00 3`, + `test tdatetime p1 c 0 2000-01-16 00:00:00 4`, + `test tdatetime p1 c 0 2000-01-17 00:00:00 2`)) + + tk.MustQuery("show stats_topn where table_name='tdatetime' and is_index=1 and column_name='c'").Check(testkit.Rows( + `test tdatetime global c 1 2000-01-05 00:00:00 3`, + `test tdatetime global c 1 2000-01-16 00:00:00 4`, + `test tdatetime p0 c 1 2000-01-04 00:00:00 2`, + `test tdatetime p0 c 1 2000-01-05 00:00:00 3`, + `test tdatetime p1 c 1 2000-01-16 00:00:00 4`, + `test tdatetime p1 c 1 2000-01-17 00:00:00 2`)) + + tk.MustQuery("show stats_buckets where table_name='tdatetime' and is_index=0 and column_name='c'").Check(testkit.Rows( + // db, tbl, part, col, isIdx, bucketID, count, repeat, lower, upper, ndv + "test tdatetime global c 0 0 5 2 2000-01-01 00:00:00 2000-01-04 00:00:00 0", // bucket.ndv is not maintained for column histograms + "test tdatetime global c 0 1 12 2 2000-01-17 00:00:00 2000-01-17 00:00:00 0", + "test tdatetime p0 c 0 0 2 1 2000-01-01 00:00:00 2000-01-02 00:00:00 0", + "test tdatetime p0 c 0 1 3 1 2000-01-03 00:00:00 2000-01-03 00:00:00 0", + "test tdatetime p1 c 0 0 3 1 2000-01-11 00:00:00 2000-01-13 00:00:00 0", + "test tdatetime p1 c 0 1 5 1 2000-01-14 00:00:00 2000-01-15 00:00:00 0")) + + rs = tk.MustQuery("show stats_histograms where table_name='tdatetime' and column_name='c' and is_index=0").Rows() + require.Equal(t, "12", rs[0][6].(string)) // g.ndv = p0 + p1 + require.Equal(t, "5", rs[1][6].(string)) + require.Equal(t, "7", rs[2][6].(string)) + require.Equal(t, "1", rs[0][7].(string)) // g.null_count = p0 + p1 + require.Equal(t, "1", rs[1][7].(string)) + require.Equal(t, "0", rs[2][7].(string)) + + tk.MustQuery("show stats_buckets where table_name='tdatetime' and is_index=1 and column_name='c'").Check(testkit.Rows( + // db, tbl, part, col, isIdx, bucketID, count, repeat, lower, upper, ndv + "test tdatetime global c 1 0 5 2 2000-01-01 00:00:00 2000-01-04 00:00:00 0", // 4 is popped from p0.TopN, so g.ndv = p0.ndv+1 + "test tdatetime global c 1 1 12 2 2000-01-17 00:00:00 2000-01-17 00:00:00 0", + "test tdatetime p0 c 1 0 2 1 2000-01-01 00:00:00 2000-01-02 00:00:00 0", + "test tdatetime p0 c 1 1 3 1 2000-01-03 00:00:00 2000-01-03 00:00:00 0", + "test tdatetime p1 c 1 0 3 1 2000-01-11 00:00:00 2000-01-13 00:00:00 0", + "test tdatetime p1 c 1 1 5 1 2000-01-14 00:00:00 2000-01-15 00:00:00 0")) + + rs = tk.MustQuery("show stats_histograms where table_name='tdatetime' and column_name='c' and is_index=1").Rows() + require.Equal(t, "12", rs[0][6].(string)) // g.ndv = p0 + p1 + require.Equal(t, "5", rs[1][6].(string)) + require.Equal(t, "7", rs[2][6].(string)) + require.Equal(t, "1", rs[0][7].(string)) // g.null_count = p0 + p1 + require.Equal(t, "1", rs[1][7].(string)) + require.Equal(t, "0", rs[2][7].(string)) + + // string + (column + index with 1 column) + tk.MustExec("drop table if exists tstring") + tk.MustExec(`create table tstring (a int, c varchar(32), key(c)) partition by range (a)` + + `(partition p0 values less than(10),partition p1 values less than(20))`) + tk.MustExec(`insert into tstring values ` + + `(1, 'a1'), (2, 'a2'), (3, 'a3'), (4, 'a4'), (4, 'a4'), (5, 'a5'), (5, 'a5'), (5, 'a5'), (null, null), ` + // values in p0 + `(11, 'b11'), (12, 'b12'), (13, 'b13'), (14, 'b14'), (15, 'b15'), (16, 'b16'), (16, 'b16'), (16, 'b16'), (16, 'b16'), (17, 'b17'), (17, 'b17')`) // values in p1 + require.NoError(t, dom.StatsHandle().DumpStatsDeltaToKV(true)) + tk.MustExec("analyze table tstring with 2 topn, 2 buckets") + + rs = tk.MustQuery("show stats_meta where table_name='tstring'").Rows() + require.Equal(t, "20", rs[0][5].(string)) // g.count = p0.count + p1.count + require.Equal(t, "9", rs[1][5].(string)) // p0.count + require.Equal(t, "11", rs[2][5].(string)) // p1.count + + tk.MustQuery("show stats_topn where table_name='tstring' and is_index=0 and column_name='c'").Check(testkit.Rows( + `test tstring global c 0 a5 3`, + `test tstring global c 0 b16 4`, + `test tstring p0 c 0 a4 2`, + `test tstring p0 c 0 a5 3`, + `test tstring p1 c 0 b16 4`, + `test tstring p1 c 0 b17 2`)) + + tk.MustQuery("show stats_topn where table_name='tstring' and is_index=1 and column_name='c'").Check(testkit.Rows( + `test tstring global c 1 a5 3`, + `test tstring global c 1 b16 4`, + `test tstring p0 c 1 a4 2`, + `test tstring p0 c 1 a5 3`, + `test tstring p1 c 1 b16 4`, + `test tstring p1 c 1 b17 2`)) + + tk.MustQuery("show stats_buckets where table_name='tstring' and is_index=0 and column_name='c'").Check(testkit.Rows( + // db, tbl, part, col, isIdx, bucketID, count, repeat, lower, upper, ndv + "test tstring global c 0 0 5 2 a1 a4 0", // bucket.ndv is not maintained for column histograms + "test tstring global c 0 1 12 2 b17 b17 0", + "test tstring p0 c 0 0 2 1 a1 a2 0", + "test tstring p0 c 0 1 3 1 a3 a3 0", + "test tstring p1 c 0 0 3 1 b11 b13 0", + "test tstring p1 c 0 1 5 1 b14 b15 0")) + + rs = tk.MustQuery("show stats_histograms where table_name='tstring' and column_name='c' and is_index=0").Rows() + require.Equal(t, "12", rs[0][6].(string)) // g.ndv = p0 + p1 + require.Equal(t, "5", rs[1][6].(string)) + require.Equal(t, "7", rs[2][6].(string)) + require.Equal(t, "1", rs[0][7].(string)) // g.null_count = p0 + p1 + require.Equal(t, "1", rs[1][7].(string)) + require.Equal(t, "0", rs[2][7].(string)) + + tk.MustQuery("show stats_buckets where table_name='tstring' and is_index=1 and column_name='c'").Check(testkit.Rows( + // db, tbl, part, col, isIdx, bucketID, count, repeat, lower, upper, ndv + "test tstring global c 1 0 5 2 a1 a4 0", // 4 is popped from p0.TopN, so g.ndv = p0.ndv+1 + "test tstring global c 1 1 12 2 b17 b17 0", + "test tstring p0 c 1 0 2 1 a1 a2 0", + "test tstring p0 c 1 1 3 1 a3 a3 0", + "test tstring p1 c 1 0 3 1 b11 b13 0", + "test tstring p1 c 1 1 5 1 b14 b15 0")) + + rs = tk.MustQuery("show stats_histograms where table_name='tstring' and column_name='c' and is_index=1").Rows() + require.Equal(t, "12", rs[0][6].(string)) // g.ndv = p0 + p1 + require.Equal(t, "5", rs[1][6].(string)) + require.Equal(t, "7", rs[2][6].(string)) + require.Equal(t, "1", rs[0][7].(string)) // g.null_count = p0 + p1 + require.Equal(t, "1", rs[1][7].(string)) + require.Equal(t, "0", rs[2][7].(string)) +} + +func testIssues24349(testKit *testkit.TestKit) { + testKit.MustExec("create table t (a int, b int) partition by hash(a) partitions 3") + testKit.MustExec("insert into t values (0, 3), (0, 3), (0, 3), (0, 2), (1, 1), (1, 2), (1, 2), (1, 2), (1, 3), (1, 4), (2, 1), (2, 1)") + testKit.MustExec("analyze table t with 1 topn, 3 buckets") + testKit.MustQuery("show stats_buckets where partition_name='global'").Check(testkit.Rows( + "test t global a 0 0 2 2 0 2 0", + "test t global b 0 0 3 1 1 2 0", + "test t global b 0 1 10 1 4 4 0", + )) +} + +func testGlobalStatsAndSQLBinding(tk *testkit.TestKit) { + tk.MustExec("use test") + tk.MustExec("create database test_global_stats") + tk.MustExec("use test_global_stats") + tk.MustExec("set @@tidb_partition_prune_mode = 'dynamic'") + tk.MustExec("set tidb_cost_model_version=2") + + // hash and range and list partition + tk.MustExec("create table thash(a int, b int, key(a)) partition by hash(a) partitions 4") + tk.MustExec(`create table trange(a int, b int, key(a)) partition by range(a) ( + partition p0 values less than (200), + partition p1 values less than (400), + partition p2 values less than (600), + partition p3 values less than (800), + partition p4 values less than (1001))`) + tk.MustExec(`create table tlist (a int, b int, key(a)) partition by list (a) ( + partition p0 values in (0, 1, 2, 3, 4, 5, 6, 7, 8, 9), + partition p1 values in (10, 11, 12, 13, 14, 15, 16, 17, 18, 19), + partition p2 values in (20, 21, 22, 23, 24, 25, 26, 27, 28, 29), + partition p3 values in (30, 31, 32, 33, 34, 35, 36, 37, 38, 39), + partition p4 values in (40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50))`) + + // construct some special data distribution + vals := make([]string, 0, 1000) + listVals := make([]string, 0, 1000) + for i := 0; i < 1000; i++ { + if i < 10 { + // for hash and range partition, 1% of records are in [0, 100) + vals = append(vals, fmt.Sprintf("(%v, %v)", rand.Intn(100), rand.Intn(100))) + // for list partition, 1% of records are equal to 0 + listVals = append(listVals, "(0, 0)") + } else { + vals = append(vals, fmt.Sprintf("(%v, %v)", 100+rand.Intn(900), 100+rand.Intn(900))) + listVals = append(listVals, fmt.Sprintf("(%v, %v)", 1+rand.Intn(50), 1+rand.Intn(50))) + } + } + tk.MustExec("insert into thash values " + strings.Join(vals, ",")) + tk.MustExec("insert into trange values " + strings.Join(vals, ",")) + tk.MustExec("insert into tlist values " + strings.Join(listVals, ",")) + + // before analyzing, the planner will choose TableScan to access the 1% of records + tk.MustHavePlan("select * from thash where a<100", "TableFullScan") + tk.MustHavePlan("select * from trange where a<100", "TableFullScan") + tk.MustHavePlan("select * from tlist where a<1", "TableFullScan") + + tk.MustExec("analyze table thash") + tk.MustExec("analyze table trange") + tk.MustExec("analyze table tlist") + + tk.MustHavePlan("select * from thash where a<100", "TableFullScan") + tk.MustHavePlan("select * from trange where a<100", "TableFullScan") + tk.MustHavePlan("select * from tlist where a<1", "TableFullScan") + + // create SQL bindings + tk.MustExec("create session binding for select * from thash where a<100 using select * from thash ignore index(a) where a<100") + tk.MustExec("create session binding for select * from trange where a<100 using select * from trange ignore index(a) where a<100") + tk.MustExec("create session binding for select * from tlist where a<100 using select * from tlist ignore index(a) where a<100") + + // use TableScan again since the Index(a) is ignored + tk.MustHavePlan("select * from thash where a<100", "TableFullScan") + tk.MustHavePlan("select * from trange where a<100", "TableFullScan") + tk.MustHavePlan("select * from tlist where a<1", "TableFullScan") + + // drop SQL bindings + tk.MustExec("drop session binding for select * from thash where a<100") + tk.MustExec("drop session binding for select * from trange where a<100") + tk.MustExec("drop session binding for select * from tlist where a<100") + + tk.MustHavePlan("select * from thash where a<100", "TableFullScan") + tk.MustHavePlan("select * from trange where a<100", "TableFullScan") + tk.MustHavePlan("select * from tlist where a<1", "TableFullScan") +} diff --git a/pkg/statistics/handle/globalstats/globalstats_test.go b/pkg/statistics/handle/globalstats/global_stats_test.go similarity index 70% rename from pkg/statistics/handle/globalstats/globalstats_test.go rename to pkg/statistics/handle/globalstats/global_stats_test.go index a996d8b689d1b..71f3717d480e8 100644 --- a/pkg/statistics/handle/globalstats/globalstats_test.go +++ b/pkg/statistics/handle/globalstats/global_stats_test.go @@ -20,7 +20,6 @@ import ( "time" "github.com/pingcap/failpoint" - "github.com/pingcap/tidb/pkg/config" "github.com/pingcap/tidb/pkg/parser/model" "github.com/pingcap/tidb/pkg/testkit" "github.com/stretchr/testify/require" @@ -300,325 +299,17 @@ partition by range (a) ( func TestGlobalStatsData2(t *testing.T) { store, dom := testkit.CreateMockStoreAndDomain(t) tk := testkit.NewTestKit(t, store) - tk.MustExec("use test") - tk.MustExec("set @@tidb_partition_prune_mode='dynamic'") - tk.MustExec("set @@tidb_analyze_version=2") + testGlobalStats2(t, tk, dom) +} - // int + (column & index with 1 column) - tk.MustExec("drop table if exists tint") - tk.MustExec("create table tint (c int, key(c)) partition by range (c) (partition p0 values less than (10), partition p1 values less than (20))") - tk.MustExec("insert into tint values (1), (2), (3), (4), (4), (5), (5), (5), (null), (11), (12), (13), (14), (15), (16), (16), (16), (16), (17), (17)") - require.NoError(t, dom.StatsHandle().DumpStatsDeltaToKV(true)) - tk.MustExec("analyze table tint with 2 topn, 2 buckets") - - tk.MustQuery("select modify_count, count from mysql.stats_meta order by table_id asc").Check(testkit.Rows( - "0 20", // global: g.count = p0.count + p1.count - "0 9", // p0 - "0 11")) // p1 - - tk.MustQuery("show stats_topn where table_name='tint' and is_index=0").Check(testkit.Rows( - "test tint global c 0 5 3", - "test tint global c 0 16 4", - "test tint p0 c 0 4 2", - "test tint p0 c 0 5 3", - "test tint p1 c 0 16 4", - "test tint p1 c 0 17 2")) - - tk.MustQuery("show stats_topn where table_name='tint' and is_index=1").Check(testkit.Rows( - "test tint global c 1 5 3", - "test tint global c 1 16 4", - "test tint p0 c 1 4 2", - "test tint p0 c 1 5 3", - "test tint p1 c 1 16 4", - "test tint p1 c 1 17 2")) - - tk.MustQuery("show stats_buckets where is_index=0").Check(testkit.Rows( - // db, tbl, part, col, isIdx, bucketID, count, repeat, lower, upper, ndv - "test tint global c 0 0 5 2 1 4 0", // bucket.ndv is not maintained for column histograms - "test tint global c 0 1 12 2 17 17 0", - "test tint p0 c 0 0 2 1 1 2 0", - "test tint p0 c 0 1 3 1 3 3 0", - "test tint p1 c 0 0 3 1 11 13 0", - "test tint p1 c 0 1 5 1 14 15 0")) - - tk.MustQuery("select distinct_count, null_count, tot_col_size from mysql.stats_histograms where is_index=0 order by table_id asc").Check( - testkit.Rows("12 1 19", // global, g = p0 + p1 - "5 1 8", // p0 - "7 0 11")) // p1 - - tk.MustQuery("show stats_buckets where is_index=1").Check(testkit.Rows( - // db, tbl, part, col, isIdx, bucketID, count, repeat, lower, upper, ndv - "test tint global c 1 0 5 2 1 4 0", // 4 is popped from p0.TopN, so g.ndv = p0.ndv+1 - "test tint global c 1 1 12 2 17 17 0", // same with the column's - "test tint p0 c 1 0 2 1 1 2 0", - "test tint p0 c 1 1 3 1 3 3 0", - "test tint p1 c 1 0 3 1 11 13 0", - "test tint p1 c 1 1 5 1 14 15 0")) - - tk.MustQuery("select distinct_count, null_count from mysql.stats_histograms where is_index=1 order by table_id asc").Check( - testkit.Rows("12 1", // global, g = p0 + p1 - "5 1", // p0 - "7 0")) // p1 - - // double + (column + index with 1 column) - tk.MustExec("drop table if exists tdouble") - tk.MustExec(`create table tdouble (a int, c double, key(c)) partition by range (a)` + - `(partition p0 values less than(10),partition p1 values less than(20))`) - tk.MustExec(`insert into tdouble values ` + - `(1, 1), (2, 2), (3, 3), (4, 4), (4, 4), (5, 5), (5, 5), (5, 5), (null, null), ` + // values in p0 - `(11, 11), (12, 12), (13, 13), (14, 14), (15, 15), (16, 16), (16, 16), (16, 16), (16, 16), (17, 17), (17, 17)`) // values in p1 - require.NoError(t, dom.StatsHandle().DumpStatsDeltaToKV(true)) - tk.MustExec("analyze table tdouble with 2 topn, 2 buckets") - - rs := tk.MustQuery("show stats_meta where table_name='tdouble'").Rows() - require.Equal(t, "20", rs[0][5].(string)) // g.count = p0.count + p1.count - require.Equal(t, "9", rs[1][5].(string)) // p0.count - require.Equal(t, "11", rs[2][5].(string)) // p1.count - - tk.MustQuery("show stats_topn where table_name='tdouble' and is_index=0 and column_name='c'").Check(testkit.Rows( - `test tdouble global c 0 5 3`, - `test tdouble global c 0 16 4`, - `test tdouble p0 c 0 4 2`, - `test tdouble p0 c 0 5 3`, - `test tdouble p1 c 0 16 4`, - `test tdouble p1 c 0 17 2`)) - - tk.MustQuery("show stats_topn where table_name='tdouble' and is_index=1 and column_name='c'").Check(testkit.Rows( - `test tdouble global c 1 5 3`, - `test tdouble global c 1 16 4`, - `test tdouble p0 c 1 4 2`, - `test tdouble p0 c 1 5 3`, - `test tdouble p1 c 1 16 4`, - `test tdouble p1 c 1 17 2`)) - - tk.MustQuery("show stats_buckets where table_name='tdouble' and is_index=0 and column_name='c'").Check(testkit.Rows( - // db, tbl, part, col, isIdx, bucketID, count, repeat, lower, upper, ndv - "test tdouble global c 0 0 5 2 1 4 0", // bucket.ndv is not maintained for column histograms - "test tdouble global c 0 1 12 2 17 17 0", - "test tdouble p0 c 0 0 2 1 1 2 0", - "test tdouble p0 c 0 1 3 1 3 3 0", - "test tdouble p1 c 0 0 3 1 11 13 0", - "test tdouble p1 c 0 1 5 1 14 15 0")) - - rs = tk.MustQuery("show stats_histograms where table_name='tdouble' and column_name='c' and is_index=0").Rows() - require.Equal(t, "12", rs[0][6].(string)) // g.ndv = p0 + p1 - require.Equal(t, "5", rs[1][6].(string)) - require.Equal(t, "7", rs[2][6].(string)) - require.Equal(t, "1", rs[0][7].(string)) // g.null_count = p0 + p1 - require.Equal(t, "1", rs[1][7].(string)) - require.Equal(t, "0", rs[2][7].(string)) - - tk.MustQuery("show stats_buckets where table_name='tdouble' and is_index=1 and column_name='c'").Check(testkit.Rows( - // db, tbl, part, col, isIdx, bucketID, count, repeat, lower, upper, ndv - "test tdouble global c 1 0 5 2 1 4 0", // 4 is popped from p0.TopN, so g.ndv = p0.ndv+1 - "test tdouble global c 1 1 12 2 17 17 0", - "test tdouble p0 c 1 0 2 1 1 2 0", - "test tdouble p0 c 1 1 3 1 3 3 0", - "test tdouble p1 c 1 0 3 1 11 13 0", - "test tdouble p1 c 1 1 5 1 14 15 0")) - - rs = tk.MustQuery("show stats_histograms where table_name='tdouble' and column_name='c' and is_index=1").Rows() - require.Equal(t, "12", rs[0][6].(string)) // g.ndv = p0 + p1 - require.Equal(t, "5", rs[1][6].(string)) - require.Equal(t, "7", rs[2][6].(string)) - require.Equal(t, "1", rs[0][7].(string)) // g.null_count = p0 + p1 - require.Equal(t, "1", rs[1][7].(string)) - require.Equal(t, "0", rs[2][7].(string)) - - // decimal + (column + index with 1 column) - tk.MustExec("drop table if exists tdecimal") - tk.MustExec(`create table tdecimal (a int, c decimal(10, 2), key(c)) partition by range (a)` + - `(partition p0 values less than(10),partition p1 values less than(20))`) - tk.MustExec(`insert into tdecimal values ` + - `(1, 1), (2, 2), (3, 3), (4, 4), (4, 4), (5, 5), (5, 5), (5, 5), (null, null), ` + // values in p0 - `(11, 11), (12, 12), (13, 13), (14, 14), (15, 15), (16, 16), (16, 16), (16, 16), (16, 16), (17, 17), (17, 17)`) // values in p1 - require.NoError(t, dom.StatsHandle().DumpStatsDeltaToKV(true)) - tk.MustExec("analyze table tdecimal with 2 topn, 2 buckets") - - rs = tk.MustQuery("show stats_meta where table_name='tdecimal'").Rows() - require.Equal(t, "20", rs[0][5].(string)) // g.count = p0.count + p1.count - require.Equal(t, "9", rs[1][5].(string)) // p0.count - require.Equal(t, "11", rs[2][5].(string)) // p1.count - - tk.MustQuery("show stats_topn where table_name='tdecimal' and is_index=0 and column_name='c'").Check(testkit.Rows( - `test tdecimal global c 0 5.00 3`, - `test tdecimal global c 0 16.00 4`, - `test tdecimal p0 c 0 4.00 2`, - `test tdecimal p0 c 0 5.00 3`, - `test tdecimal p1 c 0 16.00 4`, - `test tdecimal p1 c 0 17.00 2`)) - - tk.MustQuery("show stats_topn where table_name='tdecimal' and is_index=1 and column_name='c'").Check(testkit.Rows( - `test tdecimal global c 1 5.00 3`, - `test tdecimal global c 1 16.00 4`, - `test tdecimal p0 c 1 4.00 2`, - `test tdecimal p0 c 1 5.00 3`, - `test tdecimal p1 c 1 16.00 4`, - `test tdecimal p1 c 1 17.00 2`)) - - tk.MustQuery("show stats_buckets where table_name='tdecimal' and is_index=0 and column_name='c'").Check(testkit.Rows( - // db, tbl, part, col, isIdx, bucketID, count, repeat, lower, upper, ndv - "test tdecimal global c 0 0 5 2 1.00 4.00 0", // bucket.ndv is not maintained for column histograms - "test tdecimal global c 0 1 12 2 17.00 17.00 0", - "test tdecimal p0 c 0 0 2 1 1.00 2.00 0", - "test tdecimal p0 c 0 1 3 1 3.00 3.00 0", - "test tdecimal p1 c 0 0 3 1 11.00 13.00 0", - "test tdecimal p1 c 0 1 5 1 14.00 15.00 0")) - - rs = tk.MustQuery("show stats_histograms where table_name='tdecimal' and column_name='c' and is_index=0").Rows() - require.Equal(t, "12", rs[0][6].(string)) // g.ndv = p0 + p1 - require.Equal(t, "5", rs[1][6].(string)) - require.Equal(t, "7", rs[2][6].(string)) - require.Equal(t, "1", rs[0][7].(string)) // g.null_count = p0 + p1 - require.Equal(t, "1", rs[1][7].(string)) - require.Equal(t, "0", rs[2][7].(string)) - - tk.MustQuery("show stats_buckets where table_name='tdecimal' and is_index=1 and column_name='c'").Check(testkit.Rows( - // db, tbl, part, col, isIdx, bucketID, count, repeat, lower, upper, ndv - "test tdecimal global c 1 0 5 2 1.00 4.00 0", // 4 is popped from p0.TopN, so g.ndv = p0.ndv+1 - "test tdecimal global c 1 1 12 2 17.00 17.00 0", - "test tdecimal p0 c 1 0 2 1 1.00 2.00 0", - "test tdecimal p0 c 1 1 3 1 3.00 3.00 0", - "test tdecimal p1 c 1 0 3 1 11.00 13.00 0", - "test tdecimal p1 c 1 1 5 1 14.00 15.00 0")) - - rs = tk.MustQuery("show stats_histograms where table_name='tdecimal' and column_name='c' and is_index=1").Rows() - require.Equal(t, "12", rs[0][6].(string)) // g.ndv = p0 + p1 - require.Equal(t, "5", rs[1][6].(string)) - require.Equal(t, "7", rs[2][6].(string)) - require.Equal(t, "1", rs[0][7].(string)) // g.null_count = p0 + p1 - require.Equal(t, "1", rs[1][7].(string)) - require.Equal(t, "0", rs[2][7].(string)) - - // datetime + (column + index with 1 column) - tk.MustExec("drop table if exists tdatetime") - tk.MustExec(`create table tdatetime (a int, c datetime, key(c)) partition by range (a)` + - `(partition p0 values less than(10),partition p1 values less than(20))`) - tk.MustExec(`insert into tdatetime values ` + - `(1, '2000-01-01'), (2, '2000-01-02'), (3, '2000-01-03'), (4, '2000-01-04'), (4, '2000-01-04'), (5, '2000-01-05'), (5, '2000-01-05'), (5, '2000-01-05'), (null, null), ` + // values in p0 - `(11, '2000-01-11'), (12, '2000-01-12'), (13, '2000-01-13'), (14, '2000-01-14'), (15, '2000-01-15'), (16, '2000-01-16'), (16, '2000-01-16'), (16, '2000-01-16'), (16, '2000-01-16'), (17, '2000-01-17'), (17, '2000-01-17')`) // values in p1 - require.NoError(t, dom.StatsHandle().DumpStatsDeltaToKV(true)) - tk.MustExec("analyze table tdatetime with 2 topn, 2 buckets") - - rs = tk.MustQuery("show stats_meta where table_name='tdatetime'").Rows() - require.Equal(t, "20", rs[0][5].(string)) // g.count = p0.count + p1.count - require.Equal(t, "9", rs[1][5].(string)) // p0.count - require.Equal(t, "11", rs[2][5].(string)) // p1.count - - tk.MustQuery("show stats_topn where table_name='tdatetime' and is_index=0 and column_name='c'").Check(testkit.Rows( - `test tdatetime global c 0 2000-01-05 00:00:00 3`, - `test tdatetime global c 0 2000-01-16 00:00:00 4`, - `test tdatetime p0 c 0 2000-01-04 00:00:00 2`, - `test tdatetime p0 c 0 2000-01-05 00:00:00 3`, - `test tdatetime p1 c 0 2000-01-16 00:00:00 4`, - `test tdatetime p1 c 0 2000-01-17 00:00:00 2`)) - - tk.MustQuery("show stats_topn where table_name='tdatetime' and is_index=1 and column_name='c'").Check(testkit.Rows( - `test tdatetime global c 1 2000-01-05 00:00:00 3`, - `test tdatetime global c 1 2000-01-16 00:00:00 4`, - `test tdatetime p0 c 1 2000-01-04 00:00:00 2`, - `test tdatetime p0 c 1 2000-01-05 00:00:00 3`, - `test tdatetime p1 c 1 2000-01-16 00:00:00 4`, - `test tdatetime p1 c 1 2000-01-17 00:00:00 2`)) - - tk.MustQuery("show stats_buckets where table_name='tdatetime' and is_index=0 and column_name='c'").Check(testkit.Rows( - // db, tbl, part, col, isIdx, bucketID, count, repeat, lower, upper, ndv - "test tdatetime global c 0 0 5 2 2000-01-01 00:00:00 2000-01-04 00:00:00 0", // bucket.ndv is not maintained for column histograms - "test tdatetime global c 0 1 12 2 2000-01-17 00:00:00 2000-01-17 00:00:00 0", - "test tdatetime p0 c 0 0 2 1 2000-01-01 00:00:00 2000-01-02 00:00:00 0", - "test tdatetime p0 c 0 1 3 1 2000-01-03 00:00:00 2000-01-03 00:00:00 0", - "test tdatetime p1 c 0 0 3 1 2000-01-11 00:00:00 2000-01-13 00:00:00 0", - "test tdatetime p1 c 0 1 5 1 2000-01-14 00:00:00 2000-01-15 00:00:00 0")) - - rs = tk.MustQuery("show stats_histograms where table_name='tdatetime' and column_name='c' and is_index=0").Rows() - require.Equal(t, "12", rs[0][6].(string)) // g.ndv = p0 + p1 - require.Equal(t, "5", rs[1][6].(string)) - require.Equal(t, "7", rs[2][6].(string)) - require.Equal(t, "1", rs[0][7].(string)) // g.null_count = p0 + p1 - require.Equal(t, "1", rs[1][7].(string)) - require.Equal(t, "0", rs[2][7].(string)) - - tk.MustQuery("show stats_buckets where table_name='tdatetime' and is_index=1 and column_name='c'").Check(testkit.Rows( - // db, tbl, part, col, isIdx, bucketID, count, repeat, lower, upper, ndv - "test tdatetime global c 1 0 5 2 2000-01-01 00:00:00 2000-01-04 00:00:00 0", // 4 is popped from p0.TopN, so g.ndv = p0.ndv+1 - "test tdatetime global c 1 1 12 2 2000-01-17 00:00:00 2000-01-17 00:00:00 0", - "test tdatetime p0 c 1 0 2 1 2000-01-01 00:00:00 2000-01-02 00:00:00 0", - "test tdatetime p0 c 1 1 3 1 2000-01-03 00:00:00 2000-01-03 00:00:00 0", - "test tdatetime p1 c 1 0 3 1 2000-01-11 00:00:00 2000-01-13 00:00:00 0", - "test tdatetime p1 c 1 1 5 1 2000-01-14 00:00:00 2000-01-15 00:00:00 0")) - - rs = tk.MustQuery("show stats_histograms where table_name='tdatetime' and column_name='c' and is_index=1").Rows() - require.Equal(t, "12", rs[0][6].(string)) // g.ndv = p0 + p1 - require.Equal(t, "5", rs[1][6].(string)) - require.Equal(t, "7", rs[2][6].(string)) - require.Equal(t, "1", rs[0][7].(string)) // g.null_count = p0 + p1 - require.Equal(t, "1", rs[1][7].(string)) - require.Equal(t, "0", rs[2][7].(string)) - - // string + (column + index with 1 column) - tk.MustExec("drop table if exists tstring") - tk.MustExec(`create table tstring (a int, c varchar(32), key(c)) partition by range (a)` + - `(partition p0 values less than(10),partition p1 values less than(20))`) - tk.MustExec(`insert into tstring values ` + - `(1, 'a1'), (2, 'a2'), (3, 'a3'), (4, 'a4'), (4, 'a4'), (5, 'a5'), (5, 'a5'), (5, 'a5'), (null, null), ` + // values in p0 - `(11, 'b11'), (12, 'b12'), (13, 'b13'), (14, 'b14'), (15, 'b15'), (16, 'b16'), (16, 'b16'), (16, 'b16'), (16, 'b16'), (17, 'b17'), (17, 'b17')`) // values in p1 - require.NoError(t, dom.StatsHandle().DumpStatsDeltaToKV(true)) - tk.MustExec("analyze table tstring with 2 topn, 2 buckets") - - rs = tk.MustQuery("show stats_meta where table_name='tstring'").Rows() - require.Equal(t, "20", rs[0][5].(string)) // g.count = p0.count + p1.count - require.Equal(t, "9", rs[1][5].(string)) // p0.count - require.Equal(t, "11", rs[2][5].(string)) // p1.count - - tk.MustQuery("show stats_topn where table_name='tstring' and is_index=0 and column_name='c'").Check(testkit.Rows( - `test tstring global c 0 a5 3`, - `test tstring global c 0 b16 4`, - `test tstring p0 c 0 a4 2`, - `test tstring p0 c 0 a5 3`, - `test tstring p1 c 0 b16 4`, - `test tstring p1 c 0 b17 2`)) - - tk.MustQuery("show stats_topn where table_name='tstring' and is_index=1 and column_name='c'").Check(testkit.Rows( - `test tstring global c 1 a5 3`, - `test tstring global c 1 b16 4`, - `test tstring p0 c 1 a4 2`, - `test tstring p0 c 1 a5 3`, - `test tstring p1 c 1 b16 4`, - `test tstring p1 c 1 b17 2`)) - - tk.MustQuery("show stats_buckets where table_name='tstring' and is_index=0 and column_name='c'").Check(testkit.Rows( - // db, tbl, part, col, isIdx, bucketID, count, repeat, lower, upper, ndv - "test tstring global c 0 0 5 2 a1 a4 0", // bucket.ndv is not maintained for column histograms - "test tstring global c 0 1 12 2 b17 b17 0", - "test tstring p0 c 0 0 2 1 a1 a2 0", - "test tstring p0 c 0 1 3 1 a3 a3 0", - "test tstring p1 c 0 0 3 1 b11 b13 0", - "test tstring p1 c 0 1 5 1 b14 b15 0")) - - rs = tk.MustQuery("show stats_histograms where table_name='tstring' and column_name='c' and is_index=0").Rows() - require.Equal(t, "12", rs[0][6].(string)) // g.ndv = p0 + p1 - require.Equal(t, "5", rs[1][6].(string)) - require.Equal(t, "7", rs[2][6].(string)) - require.Equal(t, "1", rs[0][7].(string)) // g.null_count = p0 + p1 - require.Equal(t, "1", rs[1][7].(string)) - require.Equal(t, "0", rs[2][7].(string)) - - tk.MustQuery("show stats_buckets where table_name='tstring' and is_index=1 and column_name='c'").Check(testkit.Rows( - // db, tbl, part, col, isIdx, bucketID, count, repeat, lower, upper, ndv - "test tstring global c 1 0 5 2 a1 a4 0", // 4 is popped from p0.TopN, so g.ndv = p0.ndv+1 - "test tstring global c 1 1 12 2 b17 b17 0", - "test tstring p0 c 1 0 2 1 a1 a2 0", - "test tstring p0 c 1 1 3 1 a3 a3 0", - "test tstring p1 c 1 0 3 1 b11 b13 0", - "test tstring p1 c 1 1 5 1 b14 b15 0")) - - rs = tk.MustQuery("show stats_histograms where table_name='tstring' and column_name='c' and is_index=1").Rows() - require.Equal(t, "12", rs[0][6].(string)) // g.ndv = p0 + p1 - require.Equal(t, "5", rs[1][6].(string)) - require.Equal(t, "7", rs[2][6].(string)) - require.Equal(t, "1", rs[0][7].(string)) // g.null_count = p0 + p1 - require.Equal(t, "1", rs[1][7].(string)) - require.Equal(t, "0", rs[2][7].(string)) +func TestGlobalStatsData2WithConcurrency(t *testing.T) { + store, dom := testkit.CreateMockStoreAndDomain(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("set global tidb_merge_partition_stats_concurrency=2") + defer func() { + tk.MustExec("set global tidb_merge_partition_stats_concurrency=1") + }() + testGlobalStats2(t, tk, dom) } func TestGlobalStatsData3(t *testing.T) { @@ -903,32 +594,21 @@ func TestDDLPartition4GlobalStats(t *testing.T) { globalStats := h.GetTableStats(tableInfo) require.Equal(t, int64(15), globalStats.RealtimeCount) - tk.MustExec("alter table t drop partition p3, p5;") - require.NoError(t, h.DumpStatsDeltaToKV(true)) - require.NoError(t, h.HandleDDLEvent(<-h.DDLEventCh())) - require.NoError(t, h.Update(is)) - result = tk.MustQuery("show stats_meta where table_name = 't';").Rows() - require.Len(t, result, 5) - // The value of global.count will be updated automatically after we drop the table partition. - globalStats = h.GetTableStats(tableInfo) - require.Equal(t, int64(11), globalStats.RealtimeCount) - tk.MustExec("alter table t truncate partition p2, p4;") require.NoError(t, h.DumpStatsDeltaToKV(true)) require.NoError(t, h.HandleDDLEvent(<-h.DDLEventCh())) require.NoError(t, h.Update(is)) - // The value of global.count will not be updated automatically when we truncate the table partition. - // Because the partition-stats in the partition table which have been truncated has not been updated. + // We will update the global-stats after the truncate operation. globalStats = h.GetTableStats(tableInfo) require.Equal(t, int64(11), globalStats.RealtimeCount) tk.MustExec("analyze table t;") result = tk.MustQuery("show stats_meta where table_name = 't';").Rows() // The truncate operation only delete the data from the partition p2 and p4. It will not delete the partition-stats. - require.Len(t, result, 5) + require.Len(t, result, 7) // The result for the globalStats.count will be right now globalStats = h.GetTableStats(tableInfo) - require.Equal(t, int64(7), globalStats.RealtimeCount) + require.Equal(t, int64(11), globalStats.RealtimeCount) } func TestGlobalStatsNDV(t *testing.T) { @@ -1163,11 +843,6 @@ func TestGlobalStats(t *testing.T) { } func TestGlobalIndexStatistics(t *testing.T) { - defer config.RestoreFunc()() - config.UpdateGlobal(func(conf *config.Config) { - conf.EnableGlobalIndex = true - }) - store, dom := testkit.CreateMockStoreAndDomain(t) h := dom.StatsHandle() originLease := h.Lease() @@ -1175,6 +850,10 @@ func TestGlobalIndexStatistics(t *testing.T) { h.SetLease(time.Millisecond) tk := testkit.NewTestKit(t, store) tk.MustExec("use test") + tk.MustExec("set tidb_enable_global_index=true") + defer func() { + tk.MustExec("set tidb_enable_global_index=default") + }() for i, version := range []string{"1", "2"} { tk.MustExec("set @@session.tidb_analyze_version = " + version) @@ -1265,13 +944,18 @@ func TestIssues24349WithConcurrency(t *testing.T) { testIssues24349(testKit) } -func testIssues24349(testKit *testkit.TestKit) { - testKit.MustExec("create table t (a int, b int) partition by hash(a) partitions 3") - testKit.MustExec("insert into t values (0, 3), (0, 3), (0, 3), (0, 2), (1, 1), (1, 2), (1, 2), (1, 2), (1, 3), (1, 4), (2, 1), (2, 1)") - testKit.MustExec("analyze table t with 1 topn, 3 buckets") - testKit.MustQuery("show stats_buckets where partition_name='global'").Check(testkit.Rows( - "test t global a 0 0 2 2 0 2 0", - "test t global b 0 0 3 1 1 2 0", - "test t global b 0 1 10 1 4 4 0", - )) +func TestGlobalStatsAndSQLBinding(t *testing.T) { + store := testkit.CreateMockStore(t) + + tk := testkit.NewTestKit(t, store) + tk.MustExec("set global tidb_merge_partition_stats_concurrency=1") + testGlobalStatsAndSQLBinding(tk) +} + +func TestGlobalStatsAndSQLBindingWithConcurrency(t *testing.T) { + store := testkit.CreateMockStore(t) + + tk := testkit.NewTestKit(t, store) + tk.MustExec("set global tidb_merge_partition_stats_concurrency=2") + testGlobalStatsAndSQLBinding(tk) } diff --git a/pkg/statistics/handle/globalstats/main_test.go b/pkg/statistics/handle/globalstats/main_test.go index 6958737630779..4bc5c4791f0de 100644 --- a/pkg/statistics/handle/globalstats/main_test.go +++ b/pkg/statistics/handle/globalstats/main_test.go @@ -24,6 +24,7 @@ import ( func TestMain(m *testing.M) { opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), diff --git a/pkg/statistics/handle/globalstats/merge_worker.go b/pkg/statistics/handle/globalstats/merge_worker.go index 7a63adee65fb2..b702acaa797f7 100644 --- a/pkg/statistics/handle/globalstats/merge_worker.go +++ b/pkg/statistics/handle/globalstats/merge_worker.go @@ -43,8 +43,11 @@ type topnStatsMergeWorker struct { respCh chan<- *TopnStatsMergeResponse // the stats in the wrapper should only be read during the worker statsWrapper *StatsWrapper + // Different TopN structures may hold the same value, we have to merge them. + counter map[hack.MutableString]float64 // shardMutex is used to protect `statsWrapper.AllHg` shardMutex []sync.Mutex + mu sync.Mutex } // NewTopnStatsMergeWorker returns topn merge worker @@ -54,8 +57,9 @@ func NewTopnStatsMergeWorker( wrapper *StatsWrapper, killer *sqlkiller.SQLKiller) *topnStatsMergeWorker { worker := &topnStatsMergeWorker{ - taskCh: taskCh, - respCh: respCh, + taskCh: taskCh, + respCh: respCh, + counter: make(map[hack.MutableString]float64), } worker.statsWrapper = wrapper worker.shardMutex = make([]sync.Mutex, len(wrapper.AllHg)) @@ -79,15 +83,11 @@ func NewTopnStatsMergeTask(start, end int) *TopnStatsMergeTask { // TopnStatsMergeResponse indicates topn merge worker response type TopnStatsMergeResponse struct { - Err error - TopN *statistics.TopN - PopedTopn []statistics.TopNMeta + Err error } // Run runs topn merge like statistics.MergePartTopN2GlobalTopN -func (worker *topnStatsMergeWorker) Run(timeZone *time.Location, isIndex bool, - n uint32, - version int) { +func (worker *topnStatsMergeWorker) Run(timeZone *time.Location, isIndex bool, version int) { for task := range worker.taskCh { start := task.start end := task.end @@ -95,17 +95,12 @@ func (worker *topnStatsMergeWorker) Run(timeZone *time.Location, isIndex bool, allTopNs := worker.statsWrapper.AllTopN allHists := worker.statsWrapper.AllHg resp := &TopnStatsMergeResponse{} - if statistics.CheckEmptyTopNs(checkTopNs) { - worker.respCh <- resp - return - } + partNum := len(allTopNs) - // Different TopN structures may hold the same value, we have to merge them. - counter := make(map[hack.MutableString]float64) + // datumMap is used to store the mapping from the string type to datum type. // The datum is used to find the value in the histogram. datumMap := statistics.NewDatumMapCache() - for i, topN := range checkTopNs { i = i + start if err := worker.killer.HandleSignal(); err != nil { @@ -118,12 +113,15 @@ func (worker *topnStatsMergeWorker) Run(timeZone *time.Location, isIndex bool, } for _, val := range topN.TopN { encodedVal := hack.String(val.Encoded) - _, exists := counter[encodedVal] - counter[encodedVal] += float64(val.Count) + worker.mu.Lock() + _, exists := worker.counter[encodedVal] + worker.counter[encodedVal] += float64(val.Count) if exists { + worker.mu.Unlock() // We have already calculated the encodedVal from the histogram, so just continue to next topN value. continue } + worker.mu.Unlock() // We need to check whether the value corresponding to encodedVal is contained in other partition-level stats. // 1. Check the topN first. // 2. If the topN doesn't contain the value corresponding to encodedVal. We should check the histogram. @@ -147,31 +145,26 @@ func (worker *topnStatsMergeWorker) Run(timeZone *time.Location, isIndex bool, } datum = d } + worker.shardMutex[j].Lock() // Get the row count which the value is equal to the encodedVal from histogram. count, _ := allHists[j].EqualRowCount(nil, datum, isIndex) if count != 0 { - counter[encodedVal] += count // Remove the value corresponding to encodedVal from the histogram. - worker.shardMutex[j].Lock() worker.statsWrapper.AllHg[j].BinarySearchRemoveVal(statistics.TopNMeta{Encoded: datum.GetBytes(), Count: uint64(count)}) - worker.shardMutex[j].Unlock() + } + worker.shardMutex[j].Unlock() + if count != 0 { + worker.mu.Lock() + worker.counter[encodedVal] += count + worker.mu.Unlock() } } } } - numTop := len(counter) - if numTop == 0 { - worker.respCh <- resp - continue - } - sorted := make([]statistics.TopNMeta, 0, numTop) - for value, cnt := range counter { - data := hack.Slice(string(value)) - sorted = append(sorted, statistics.TopNMeta{Encoded: data, Count: uint64(cnt)}) - } - globalTopN, leftTopN := statistics.GetMergedTopNFromSortedSlice(sorted, n) - resp.TopN = globalTopN - resp.PopedTopn = leftTopN worker.respCh <- resp } } + +func (worker *topnStatsMergeWorker) Result() map[hack.MutableString]float64 { + return worker.counter +} diff --git a/pkg/statistics/handle/globalstats/topn.go b/pkg/statistics/handle/globalstats/topn.go index 9e9f14a068a54..171756b82357b 100644 --- a/pkg/statistics/handle/globalstats/topn.go +++ b/pkg/statistics/handle/globalstats/topn.go @@ -30,8 +30,12 @@ import ( func mergeGlobalStatsTopN(gp *gp.Pool, sc sessionctx.Context, wrapper *StatsWrapper, timeZone *time.Location, version int, n uint32, isIndex bool) (*statistics.TopN, []statistics.TopNMeta, []*statistics.Histogram, error) { + if statistics.CheckEmptyTopNs(wrapper.AllTopN) { + return nil, nil, wrapper.AllHg, nil + } mergeConcurrency := sc.GetSessionVars().AnalyzePartitionMergeConcurrency killer := &sc.GetSessionVars().SQLKiller + // use original method if concurrency equals 1 or for version1 if mergeConcurrency < 2 { return MergePartTopN2GlobalTopN(timeZone, version, wrapper.AllTopN, n, wrapper.AllHg, isIndex, killer) @@ -78,12 +82,12 @@ func MergeGlobalStatsTopNByConcurrency( taskNum := len(tasks) taskCh := make(chan *TopnStatsMergeTask, taskNum) respCh := make(chan *TopnStatsMergeResponse, taskNum) + worker := NewTopnStatsMergeWorker(taskCh, respCh, wrapper, killer) for i := 0; i < mergeConcurrency; i++ { - worker := NewTopnStatsMergeWorker(taskCh, respCh, wrapper, killer) wg.Add(1) gp.Go(func() { defer wg.Done() - worker.Run(timeZone, isIndex, n, version) + worker.Run(timeZone, isIndex, version) }) } for _, task := range tasks { @@ -92,8 +96,6 @@ func MergeGlobalStatsTopNByConcurrency( close(taskCh) wg.Wait() close(respCh) - resps := make([]*TopnStatsMergeResponse, 0) - // handle Error hasErr := false errMsg := make([]string, 0) @@ -102,27 +104,21 @@ func MergeGlobalStatsTopNByConcurrency( hasErr = true errMsg = append(errMsg, resp.Err.Error()) } - resps = append(resps, resp) } if hasErr { return nil, nil, nil, errors.New(strings.Join(errMsg, ",")) } // fetch the response from each worker and merge them into global topn stats - sorted := make([]statistics.TopNMeta, 0, mergeConcurrency) - leftTopn := make([]statistics.TopNMeta, 0) - for _, resp := range resps { - if resp.TopN != nil { - sorted = append(sorted, resp.TopN.TopN...) - } - leftTopn = append(leftTopn, resp.PopedTopn...) + counter := worker.Result() + numTop := len(counter) + sorted := make([]statistics.TopNMeta, 0, numTop) + for value, cnt := range counter { + data := hack.Slice(string(value)) + sorted = append(sorted, statistics.TopNMeta{Encoded: data, Count: uint64(cnt)}) } - globalTopN, popedTopn := statistics.GetMergedTopNFromSortedSlice(sorted, n) - - result := append(leftTopn, popedTopn...) - statistics.SortTopnMeta(result) - return globalTopN, result, wrapper.AllHg, nil + return globalTopN, popedTopn, wrapper.AllHg, nil } // MergePartTopN2GlobalTopN is used to merge the partition-level topN to global-level topN. @@ -149,10 +145,6 @@ func MergePartTopN2GlobalTopN( isIndex bool, killer *sqlkiller.SQLKiller, ) (*statistics.TopN, []statistics.TopNMeta, []*statistics.Histogram, error) { - if statistics.CheckEmptyTopNs(topNs) { - return nil, nil, hists, nil - } - partNum := len(topNs) // Different TopN structures may hold the same value, we have to merge them. counter := make(map[hack.MutableString]float64) diff --git a/pkg/statistics/handle/handle.go b/pkg/statistics/handle/handle.go index 2b7e3044becb6..dd523bb8a7a8a 100644 --- a/pkg/statistics/handle/handle.go +++ b/pkg/statistics/handle/handle.go @@ -53,7 +53,10 @@ type Handle struct { // LeaseGetter is used to get stats lease. util.LeaseGetter - // initStatsCtx is the ctx only used for initStats + // initStatsCtx is a context specifically used for initStats. + // It's not designed for concurrent use, so avoid using it in such scenarios. + // Currently, it's only utilized within initStats, which is exclusively used during bootstrap. + // Since bootstrap is a one-time operation, using this context remains safe. initStatsCtx sessionctx.Context // TableInfoGetter is used to fetch table meta info. @@ -132,7 +135,11 @@ func NewHandle( handle.StatsAnalyze = autoanalyze.NewStatsAnalyze(handle, tracker) handle.StatsSyncLoad = syncload.NewStatsSyncLoad(handle) handle.StatsGlobal = globalstats.NewStatsGlobal(handle) - handle.DDL = ddl.NewDDLHandler(handle.StatsReadWriter, handle, handle.StatsGlobal) + handle.DDL = ddl.NewDDLHandler( + handle.StatsReadWriter, + handle, + handle.StatsGlobal, + ) return handle, nil } @@ -142,9 +149,18 @@ func (h *Handle) GetTableStats(tblInfo *model.TableInfo) *statistics.Table { return h.GetPartitionStats(tblInfo, tblInfo.ID) } +// GetTableStatsForAutoAnalyze is to get table stats but it will +func (h *Handle) GetTableStatsForAutoAnalyze(tblInfo *model.TableInfo) *statistics.Table { + return h.getPartitionStats(tblInfo, tblInfo.ID, false) +} + // GetPartitionStats retrieves the partition stats from cache. // TODO: remove GetTableStats later on. func (h *Handle) GetPartitionStats(tblInfo *model.TableInfo, pid int64) *statistics.Table { + return h.getPartitionStats(tblInfo, pid, true) +} + +func (h *Handle) getPartitionStats(tblInfo *model.TableInfo, pid int64, returnPseudo bool) *statistics.Table { var tbl *statistics.Table if h == nil { tbl = statistics.PseudoTable(tblInfo, false) @@ -153,12 +169,15 @@ func (h *Handle) GetPartitionStats(tblInfo *model.TableInfo, pid int64) *statist } tbl, ok := h.Get(pid) if !ok { - tbl = statistics.PseudoTable(tblInfo, false) - tbl.PhysicalID = pid - if tblInfo.GetPartitionInfo() == nil || h.Len() < 64 { - h.UpdateStatsCache([]*statistics.Table{tbl}, nil) + if returnPseudo { + tbl = statistics.PseudoTable(tblInfo, false) + tbl.PhysicalID = pid + if tblInfo.GetPartitionInfo() == nil || h.Len() < 64 { + h.UpdateStatsCache([]*statistics.Table{tbl}, nil) + } + return tbl } - return tbl + return nil } return tbl } @@ -168,11 +187,11 @@ func (h *Handle) FlushStats() { for len(h.DDLEventCh()) > 0 { e := <-h.DDLEventCh() if err := h.HandleDDLEvent(e); err != nil { - statslogutil.StatsLogger.Error("handle ddl event fail", zap.Error(err)) + statslogutil.StatsLogger().Error("handle ddl event fail", zap.Error(err)) } } if err := h.DumpStatsDeltaToKV(true); err != nil { - statslogutil.StatsLogger.Error("dump stats delta fail", zap.Error(err)) + statslogutil.StatsLogger().Error("dump stats delta fail", zap.Error(err)) } } diff --git a/pkg/statistics/handle/handletest/analyze/main_test.go b/pkg/statistics/handle/handletest/analyze/main_test.go index 5e316bafb8bf7..0cadfcccdafbb 100644 --- a/pkg/statistics/handle/handletest/analyze/main_test.go +++ b/pkg/statistics/handle/handletest/analyze/main_test.go @@ -24,6 +24,7 @@ import ( func TestMain(m *testing.M) { opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), diff --git a/pkg/statistics/handle/handletest/lockstats/main_test.go b/pkg/statistics/handle/handletest/lockstats/main_test.go index 32a94995f02d3..52f60bbcecf9b 100644 --- a/pkg/statistics/handle/handletest/lockstats/main_test.go +++ b/pkg/statistics/handle/handletest/lockstats/main_test.go @@ -24,6 +24,7 @@ import ( func TestMain(m *testing.M) { opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), diff --git a/pkg/statistics/handle/handletest/main_test.go b/pkg/statistics/handle/handletest/main_test.go index 8937f9012b800..6bf105a34ef3c 100644 --- a/pkg/statistics/handle/handletest/main_test.go +++ b/pkg/statistics/handle/handletest/main_test.go @@ -24,6 +24,7 @@ import ( func TestMain(m *testing.M) { opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), diff --git a/pkg/statistics/handle/handletest/statstest/main_test.go b/pkg/statistics/handle/handletest/statstest/main_test.go index ff45bb491696a..b67b9ea6815e7 100644 --- a/pkg/statistics/handle/handletest/statstest/main_test.go +++ b/pkg/statistics/handle/handletest/statstest/main_test.go @@ -24,6 +24,7 @@ import ( func TestMain(m *testing.M) { opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), diff --git a/pkg/statistics/handle/history/history_stats.go b/pkg/statistics/handle/history/history_stats.go index 9acebeb010d8e..dd71aa0b75085 100644 --- a/pkg/statistics/handle/history/history_stats.go +++ b/pkg/statistics/handle/history/history_stats.go @@ -53,7 +53,10 @@ func (sh *statsHistoryImpl) RecordHistoricalStatsToStorage(dbName string, tableI if err != nil { return 0, errors.Trace(err) } - + if js == nil { + logutil.BgLogger().Warn("no stats data to record", zap.String("dbName", dbName), zap.String("tableName", tableInfo.Name.O)) + return 0, nil + } var version uint64 err = util.CallWithSCtx(sh.statsHandle.SPool(), func(sctx sessionctx.Context) error { version, err = RecordHistoricalStatsToStorage(sctx, physicalID, js) diff --git a/pkg/statistics/handle/lockstats/lock_stats.go b/pkg/statistics/handle/lockstats/lock_stats.go index 20c78784efcba..bb4a04cd2600b 100644 --- a/pkg/statistics/handle/lockstats/lock_stats.go +++ b/pkg/statistics/handle/lockstats/lock_stats.go @@ -156,7 +156,7 @@ func AddLockedTables( ids = append(ids, pid) } } - logutil.StatsLogger.Info("lock table", + logutil.StatsLogger().Info("lock table", zap.Any("tables", tables), ) @@ -210,7 +210,7 @@ func AddLockedPartitions( pNames = append(pNames, pName) } - logutil.StatsLogger.Info("lock partitions", + logutil.StatsLogger().Info("lock partitions", zap.Int64("tableID", tid), zap.String("tableName", tableName), zap.Int64s("partitionIDs", pids), @@ -291,7 +291,7 @@ func generateStableSkippedPartitionsMessage(ids []int64, tableName string, skipp func insertIntoStatsTableLocked(sctx sessionctx.Context, tid int64) error { _, _, err := util.ExecRows(sctx, insertSQL, tid, tid) if err != nil { - logutil.StatsLogger.Error("error occurred when insert mysql.stats_table_locked", zap.Error(err)) + logutil.StatsLogger().Error("error occurred when insert mysql.stats_table_locked", zap.Error(err)) return err } return nil diff --git a/pkg/statistics/handle/lockstats/main_test.go b/pkg/statistics/handle/lockstats/main_test.go index 32a94995f02d3..52f60bbcecf9b 100644 --- a/pkg/statistics/handle/lockstats/main_test.go +++ b/pkg/statistics/handle/lockstats/main_test.go @@ -24,6 +24,7 @@ import ( func TestMain(m *testing.M) { opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), diff --git a/pkg/statistics/handle/lockstats/unlock_stats.go b/pkg/statistics/handle/lockstats/unlock_stats.go index 21d422d66d691..1c72679c5462d 100644 --- a/pkg/statistics/handle/lockstats/unlock_stats.go +++ b/pkg/statistics/handle/lockstats/unlock_stats.go @@ -54,7 +54,7 @@ func RemoveLockedTables( } } - statslogutil.StatsLogger.Info("unlock table", + statslogutil.StatsLogger().Info("unlock table", zap.Any("tables", tables), ) @@ -107,7 +107,7 @@ func RemoveLockedPartitions( for pid := range pidNames { pids = append(pids, pid) } - statslogutil.StatsLogger.Info("unlock partitions", + statslogutil.StatsLogger().Info("unlock partitions", zap.Int64("tableID", tid), zap.String("tableName", tableName), zap.Int64s("partitionIDs", pids), diff --git a/pkg/statistics/handle/lockstats/unlock_stats_test.go b/pkg/statistics/handle/lockstats/unlock_stats_test.go index 62dfce7352bcf..b09f158276e4a 100644 --- a/pkg/statistics/handle/lockstats/unlock_stats_test.go +++ b/pkg/statistics/handle/lockstats/unlock_stats_test.go @@ -32,7 +32,7 @@ import ( func wrapAsSCtx(exec *mock.MockRestrictedSQLExecutor) sessionctx.Context { sctx := mockctx.NewContext() - sctx.SetValue(mock.MockRestrictedSQLExecutorKey{}, exec) + sctx.SetValue(mock.RestrictedSQLExecutorKey{}, exec) return sctx } diff --git a/pkg/statistics/handle/logutil/logutil.go b/pkg/statistics/handle/logutil/logutil.go index c3ae89384dda8..ea791531a7760 100644 --- a/pkg/statistics/handle/logutil/logutil.go +++ b/pkg/statistics/handle/logutil/logutil.go @@ -19,7 +19,7 @@ import ( "go.uber.org/zap" ) -var ( - // StatsLogger with category "stats" is used to log statistic related messages. - StatsLogger = logutil.BgLogger().With(zap.String("category", "stats")) -) +// StatsLogger with category "stats" is used to log statistic related messages. +func StatsLogger() *zap.Logger { + return logutil.BgLogger().With(zap.String("category", "stats")) +} diff --git a/pkg/statistics/handle/main_test.go b/pkg/statistics/handle/main_test.go index 5145d6e4b1801..50e4289a822bc 100644 --- a/pkg/statistics/handle/main_test.go +++ b/pkg/statistics/handle/main_test.go @@ -24,6 +24,7 @@ import ( func TestMain(m *testing.M) { opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), diff --git a/pkg/statistics/handle/storage/BUILD.bazel b/pkg/statistics/handle/storage/BUILD.bazel index def09ccf1bf7d..416e4ff2c4096 100644 --- a/pkg/statistics/handle/storage/BUILD.bazel +++ b/pkg/statistics/handle/storage/BUILD.bazel @@ -52,9 +52,10 @@ go_test( "dump_test.go", "gc_test.go", "read_test.go", + "stats_read_writer_test.go", ], flaky = True, - shard_count = 20, + shard_count = 22, deps = [ ":storage", "//pkg/domain", @@ -63,6 +64,7 @@ go_test( "//pkg/sessionctx/variable", "//pkg/statistics", "//pkg/statistics/handle/internal", + "//pkg/statistics/handle/types", "//pkg/statistics/handle/util", "//pkg/testkit", "//pkg/types", diff --git a/pkg/statistics/handle/storage/dump_test.go b/pkg/statistics/handle/storage/dump_test.go index 454fd69fd6130..a5f7fcd7a899e 100644 --- a/pkg/statistics/handle/storage/dump_test.go +++ b/pkg/statistics/handle/storage/dump_test.go @@ -19,6 +19,8 @@ import ( "encoding/json" "errors" "fmt" + "math" + "runtime" "strings" "testing" @@ -27,6 +29,7 @@ import ( "github.com/pingcap/tidb/pkg/statistics" "github.com/pingcap/tidb/pkg/statistics/handle/internal" "github.com/pingcap/tidb/pkg/statistics/handle/storage" + statstypes "github.com/pingcap/tidb/pkg/statistics/handle/types" handleutil "github.com/pingcap/tidb/pkg/statistics/handle/util" "github.com/pingcap/tidb/pkg/testkit" "github.com/pingcap/tidb/pkg/util" @@ -125,6 +128,17 @@ func getStatsJSON(t *testing.T, dom *domain.Domain, db, tableName string) *handl return jsonTbl } +func persistStats(ctx context.Context, t *testing.T, dom *domain.Domain, db, tableName string, persist statstypes.PersistFunc) { + is := dom.InfoSchema() + h := dom.StatsHandle() + require.Nil(t, h.Update(is)) + table, err := is.TableByName(model.NewCIStr(db), model.NewCIStr(tableName)) + require.NoError(t, err) + tableInfo := table.Meta() + err = h.PersistStatsBySnapshot(ctx, "test", tableInfo, math.MaxUint64, persist) + require.NoError(t, err) +} + func TestDumpGlobalStats(t *testing.T) { store, dom := testkit.CreateMockStoreAndDomain(t) tk := testkit.NewTestKit(t, store) @@ -226,6 +240,10 @@ func TestLoadPartitionStats(t *testing.T) { func TestLoadPartitionStatsErrPanic(t *testing.T) { store, dom := testkit.CreateMockStoreAndDomain(t) tk := testkit.NewTestKit(t, store) + val := runtime.GOMAXPROCS(1) + defer func() { + runtime.GOMAXPROCS(val) + }() tk.MustExec("use test") tk.MustExec("set @@tidb_analyze_version = 2") tk.MustExec("set @@tidb_partition_prune_mode = 'dynamic'") @@ -616,3 +634,44 @@ func TestLoadStatsFromOldVersion(t *testing.T) { require.False(t, idx.IsStatsInitialized()) } } + +func TestPersistStats(t *testing.T) { + ctx := context.Background() + store, dom := testkit.CreateMockStoreAndDomain(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t1") + tk.MustExec("drop table if exists t2") + createTable := `CREATE TABLE t1 (a int, b int, primary key(a), index idx(b)) +PARTITION BY RANGE ( a ) ( + PARTITION p0 VALUES LESS THAN (6), + PARTITION p1 VALUES LESS THAN (11), + PARTITION p2 VALUES LESS THAN (16), + PARTITION p3 VALUES LESS THAN (21) +)` + tk.MustExec(createTable) + tk.MustExec("CREATE TABLE t2 (a int, b int, primary key(a), index idx(b))") + for i := 1; i < 21; i++ { + tk.MustExec("insert into t1 values (?, ?)", i, i) + tk.MustExec("insert into t2 values (?, ?)", i, i) + } + tk.MustExec("analyze table t1") + tk.MustExec("analyze table t2") + + statsCnt := 0 + persistStats(ctx, t, dom, "test", "t1", func(ctx context.Context, jsonTable *handleutil.JSONTable, physicalID int64) error { + require.True(t, physicalID > 0) + require.NotNil(t, jsonTable) + statsCnt += 1 + return nil + }) + require.Equal(t, statsCnt, 5) + statsCnt = 0 + persistStats(ctx, t, dom, "test", "t2", func(ctx context.Context, jsonTable *handleutil.JSONTable, physicalID int64) error { + require.True(t, physicalID > 0) + require.NotNil(t, jsonTable) + statsCnt += 1 + return nil + }) + require.Equal(t, statsCnt, 1) +} diff --git a/pkg/statistics/handle/storage/json.go b/pkg/statistics/handle/storage/json.go index 25334184b3f50..e8ef3e7e632c6 100644 --- a/pkg/statistics/handle/storage/json.go +++ b/pkg/statistics/handle/storage/json.go @@ -115,6 +115,7 @@ func GenJSONTableFromStats(sctx sessionctx.Context, dbName string, tableInfo *mo } jsonTbl.Columns[col.Info.Name.L] = proto col.FMSketch.DestroyAndPutToPool() + hist.DestroyAndPutToPool() } for _, idx := range tbl.Indices { proto := dumpJSONCol(&idx.Histogram, idx.CMSketch, idx.TopN, nil, &idx.StatsVer) diff --git a/pkg/statistics/handle/storage/read.go b/pkg/statistics/handle/storage/read.go index 531b8872d3c66..fb5cc3c18d159 100644 --- a/pkg/statistics/handle/storage/read.go +++ b/pkg/statistics/handle/storage/read.go @@ -200,7 +200,7 @@ func ExtendedStatsFromStorage(sctx sessionctx.Context, table *statistics.Table, colIDs := row.GetString(3) err := json.Unmarshal([]byte(colIDs), &item.ColIDs) if err != nil { - statslogutil.StatsLogger.Error("decode column IDs failed", zap.String("column_ids", colIDs), zap.Error(err)) + statslogutil.StatsLogger().Error("decode column IDs failed", zap.String("column_ids", colIDs), zap.Error(err)) return nil, err } statsStr := row.GetString(4) @@ -208,7 +208,7 @@ func ExtendedStatsFromStorage(sctx sessionctx.Context, table *statistics.Table, if statsStr != "" { item.ScalarVals, err = strconv.ParseFloat(statsStr, 64) if err != nil { - statslogutil.StatsLogger.Error("parse scalar stats failed", zap.String("stats", statsStr), zap.Error(err)) + statslogutil.StatsLogger().Error("parse scalar stats failed", zap.String("stats", statsStr), zap.Error(err)) return nil, err } } diff --git a/pkg/statistics/handle/storage/save.go b/pkg/statistics/handle/storage/save.go index 897bf242d429b..38c8ccefc5f59 100644 --- a/pkg/statistics/handle/storage/save.go +++ b/pkg/statistics/handle/storage/save.go @@ -197,7 +197,7 @@ func SaveTableStatsToStorage(sctx sessionctx.Context, if modifyCnt < 0 { modifyCnt = 0 } - statslogutil.StatsLogger.Info("incrementally update modifyCount", + statslogutil.StatsLogger().Info("incrementally update modifyCount", zap.Int64("tableID", tableID), zap.Int64("curModifyCnt", curModifyCnt), zap.Int64("results.BaseModifyCnt", results.BaseModifyCnt), @@ -208,7 +208,7 @@ func SaveTableStatsToStorage(sctx sessionctx.Context, if cnt < 0 { cnt = 0 } - statslogutil.StatsLogger.Info("incrementally update count", + statslogutil.StatsLogger().Info("incrementally update count", zap.Int64("tableID", tableID), zap.Int64("curCnt", curCnt), zap.Int64("results.Count", results.Count), @@ -219,7 +219,7 @@ func SaveTableStatsToStorage(sctx sessionctx.Context, if cnt < 0 { cnt = 0 } - statslogutil.StatsLogger.Info("directly update count", + statslogutil.StatsLogger().Info("directly update count", zap.Int64("tableID", tableID), zap.Int64("results.Count", results.Count), zap.Int64("count", cnt)) @@ -325,9 +325,18 @@ func SaveTableStatsToStorage(sctx sessionctx.Context, // If count is negative, both count and modify count would not be used and not be written to the table. Unless, corresponding // fields in the stats_meta table will be updated. // TODO: refactor to reduce the number of parameters -func SaveStatsToStorage(sctx sessionctx.Context, - tableID int64, count, modifyCount int64, isIndex int, hg *statistics.Histogram, - cms *statistics.CMSketch, topN *statistics.TopN, statsVersion int, isAnalyzed int64, updateAnalyzeTime bool) (statsVer uint64, err error) { +func SaveStatsToStorage( + sctx sessionctx.Context, + tableID int64, + count, modifyCount int64, + isIndex int, + hg *statistics.Histogram, + cms *statistics.CMSketch, + topN *statistics.TopN, + statsVersion int, + isAnalyzed int64, + updateAnalyzeTime bool, +) (statsVer uint64, err error) { version, err := util.GetStartTS(sctx) if err != nil { return 0, errors.Trace(err) diff --git a/pkg/statistics/handle/storage/stats_read_writer.go b/pkg/statistics/handle/storage/stats_read_writer.go index 596fc64495379..bb2f471f4190c 100644 --- a/pkg/statistics/handle/storage/stats_read_writer.go +++ b/pkg/statistics/handle/storage/stats_read_writer.go @@ -162,9 +162,9 @@ func (s *statsReadWriter) ChangeGlobalStatsID(from, to int64) (err error) { }, util.FlagWrapTxn) } -// ResetTableStats2KVForDrop update the version of mysql.stats_meta. -// Then GC worker will delete the old version of stats. -func (s *statsReadWriter) ResetTableStats2KVForDrop(physicalID int64) (err error) { +// UpdateStatsMetaVersionForGC update the version of mysql.stats_meta. +// See more details in the interface definition. +func (s *statsReadWriter) UpdateStatsMetaVersionForGC(physicalID int64) (err error) { statsVer := uint64(0) defer func() { if err == nil && statsVer != 0 { @@ -177,9 +177,14 @@ func (s *statsReadWriter) ResetTableStats2KVForDrop(physicalID int64) (err error if err != nil { return errors.Trace(err) } - if _, err := util.Exec(sctx, "update mysql.stats_meta set version=%? where table_id =%?", startTS, physicalID); err != nil { + if _, err := util.Exec( + sctx, + "update mysql.stats_meta set version=%? where table_id =%?", + startTS, physicalID, + ); err != nil { return err } + statsVer = startTS return nil }, util.FlagWrapTxn) } @@ -215,6 +220,33 @@ func (s *statsReadWriter) StatsMetaCountAndModifyCount(tableID int64) (count, mo return } +// UpdateStatsMetaDelta updates the count and modify_count for the given table in mysql.stats_meta. +func (s *statsReadWriter) UpdateStatsMetaDelta(tableID int64, count, delta int64) (err error) { + err = util.CallWithSCtx(s.statsHandler.SPool(), func(sctx sessionctx.Context) error { + lockedTables, err := s.statsHandler.GetLockedTables(tableID) + if err != nil { + return errors.Trace(err) + } + isLocked := false + if len(lockedTables) > 0 { + isLocked = true + } + startTS, err := util.GetStartTS(sctx) + if err != nil { + return errors.Trace(err) + } + err = UpdateStatsMeta( + sctx, + startTS, + variable.TableDelta{Count: count, Delta: delta}, + tableID, + isLocked, + ) + return err + }, util.FlagWrapTxn) + return +} + // TableStatsFromStorage loads table stats info from storage. func (s *statsReadWriter) TableStatsFromStorage(tableInfo *model.TableInfo, physicalID int64, loadAll bool, snapshot uint64) (statsTbl *statistics.Table, err error) { err = util.CallWithSCtx(s.statsHandler.SPool(), func(sctx sessionctx.Context) error { @@ -233,8 +265,18 @@ func (s *statsReadWriter) TableStatsFromStorage(tableInfo *model.TableInfo, phys // If count is negative, both count and modify count would not be used and not be written to the table. Unless, corresponding // fields in the stats_meta table will be updated. // TODO: refactor to reduce the number of parameters -func (s *statsReadWriter) SaveStatsToStorage(tableID int64, count, modifyCount int64, isIndex int, hg *statistics.Histogram, - cms *statistics.CMSketch, topN *statistics.TopN, statsVersion int, isAnalyzed int64, updateAnalyzeTime bool, source string) (err error) { +func (s *statsReadWriter) SaveStatsToStorage( + tableID int64, + count, modifyCount int64, + isIndex int, + hg *statistics.Histogram, + cms *statistics.CMSketch, + topN *statistics.TopN, + statsVersion int, + isAnalyzed int64, + updateAnalyzeTime bool, + source string, +) (err error) { var statsVer uint64 err = util.CallWithSCtx(s.statsHandler.SPool(), func(sctx sessionctx.Context) error { statsVer, err = SaveStatsToStorage(sctx, tableID, @@ -414,6 +456,51 @@ func (s *statsReadWriter) DumpHistoricalStatsBySnapshot( return jsonTbl, fallbackTbls, nil } +// PersistStatsBySnapshot dumps statistic to json and call the function for each partition statistic to persist. +// Notice: +// 1. It might call the function `persist` with nil jsontable. +// 2. It is only used by BR, so partitions' statistic are always dumped. +// +// TODO: once we support column-level statistic dump, it should replace the `PersistStatsBySnapshot` and `DumpStatsToJSON`. +func (s *statsReadWriter) PersistStatsBySnapshot( + ctx context.Context, + dbName string, + tableInfo *model.TableInfo, + snapshot uint64, + persist statstypes.PersistFunc, +) error { + pi := tableInfo.GetPartitionInfo() + if pi == nil { + jsonTable, err := s.TableStatsToJSON(dbName, tableInfo, tableInfo.ID, snapshot) + if err != nil { + return errors.Trace(err) + } + return persist(ctx, jsonTable, tableInfo.ID) + } + + for _, def := range pi.Definitions { + tbl, err := s.TableStatsToJSON(dbName, tableInfo, def.ID, snapshot) + if err != nil { + return errors.Trace(err) + } + if tbl == nil { + continue + } + if err := persist(ctx, tbl, def.ID); err != nil { + return errors.Trace(err) + } + } + // dump its global-stats if existed + tbl, err := s.TableStatsToJSON(dbName, tableInfo, tableInfo.ID, snapshot) + if err != nil { + return errors.Trace(err) + } + if tbl != nil { + return persist(ctx, tbl, tableInfo.ID) + } + return nil +} + // DumpStatsToJSONBySnapshot dumps statistic to json. func (s *statsReadWriter) DumpStatsToJSONBySnapshot(dbName string, tableInfo *model.TableInfo, snapshot uint64, dumpPartitionStats bool) (*util.JSONTable, error) { pruneMode, err := util.GetCurrentPruneMode(s.statsHandler.SPool()) @@ -513,27 +600,64 @@ func (s *statsReadWriter) TableStatsToJSON(dbName string, tableInfo *model.Table // TestLoadStatsErr is only for test. type TestLoadStatsErr struct{} -// LoadStatsFromJSON will load statistic from JSONTable, and save it to the storage. -// In final, it will also udpate the stats cache. -func (s *statsReadWriter) LoadStatsFromJSON(ctx context.Context, is infoschema.InfoSchema, - jsonTbl *util.JSONTable, concurrencyForPartition uint8) error { - if err := s.LoadStatsFromJSONNoUpdate(ctx, is, jsonTbl, concurrencyForPartition); err != nil { - return errors.Trace(err) +// LoadStatsFromJSONConcurrently consumes concurrently the statistic task from `taskCh`. +func (s *statsReadWriter) LoadStatsFromJSONConcurrently( + ctx context.Context, + tableInfo *model.TableInfo, + taskCh chan *statstypes.PartitionStatisticLoadTask, + concurrencyForPartition int, +) error { + nCPU := runtime.GOMAXPROCS(0) + if concurrencyForPartition == 0 { + concurrencyForPartition = (nCPU + 1) / 2 // default + } + concurrencyForPartition = min(concurrencyForPartition, nCPU) // for safety + + var wg sync.WaitGroup + e := new(atomic.Pointer[error]) + for i := 0; i < concurrencyForPartition; i++ { + wg.Add(1) + s.statsHandler.GPool().Go(func() { + defer func() { + if r := recover(); r != nil { + err := fmt.Errorf("%v", r) + e.CompareAndSwap(nil, &err) + } + wg.Done() + }() + + for tbl := range taskCh { + if tbl == nil { + continue + } + + loadFunc := s.loadStatsFromJSON + if intest.InTest && ctx.Value(TestLoadStatsErr{}) != nil { + loadFunc = ctx.Value(TestLoadStatsErr{}).(func(*model.TableInfo, int64, *util.JSONTable) error) + } + + err := loadFunc(tableInfo, tbl.PhysicalID, tbl.JSONTable) + if err != nil { + e.CompareAndSwap(nil, &err) + return + } + if e.Load() != nil { + return + } + } + }) } - return errors.Trace(s.statsHandler.Update(is)) + wg.Wait() + if e.Load() != nil { + return *e.Load() + } + + return nil } // LoadStatsFromJSONNoUpdate will load statistic from JSONTable, and save it to the storage. func (s *statsReadWriter) LoadStatsFromJSONNoUpdate(ctx context.Context, is infoschema.InfoSchema, - jsonTbl *util.JSONTable, concurrencyForPartition uint8) error { - nCPU := uint8(runtime.GOMAXPROCS(0)) - if concurrencyForPartition == 0 { - concurrencyForPartition = nCPU / 2 // default - } - if concurrencyForPartition > nCPU { - concurrencyForPartition = nCPU // for safety - } - + jsonTbl *util.JSONTable, concurrencyForPartition int) error { table, err := is.TableByName(model.NewCIStr(jsonTbl.DatabaseName), model.NewCIStr(jsonTbl.TableName)) if err != nil { return errors.Trace(err) @@ -547,61 +671,42 @@ func (s *statsReadWriter) LoadStatsFromJSONNoUpdate(ctx context.Context, is info } } else { // load partition statistics concurrently - taskCh := make(chan model.PartitionDefinition, len(pi.Definitions)) + taskCh := make(chan *statstypes.PartitionStatisticLoadTask, len(pi.Definitions)+1) for _, def := range pi.Definitions { - taskCh <- def - } - close(taskCh) - var wg sync.WaitGroup - e := new(atomic.Pointer[error]) - for i := 0; i < int(concurrencyForPartition); i++ { - wg.Add(1) - s.statsHandler.GPool().Go(func() { - defer func() { - if r := recover(); r != nil { - err := fmt.Errorf("%v", r) - e.CompareAndSwap(nil, &err) - } - wg.Done() - }() - - for def := range taskCh { - tbl := jsonTbl.Partitions[def.Name.L] - if tbl == nil { - continue - } - - loadFunc := s.loadStatsFromJSON - if intest.InTest && ctx.Value(TestLoadStatsErr{}) != nil { - loadFunc = ctx.Value(TestLoadStatsErr{}).(func(*model.TableInfo, int64, *util.JSONTable) error) - } - - err := loadFunc(tableInfo, def.ID, tbl) - if err != nil { - e.CompareAndSwap(nil, &err) - return - } - if e.Load() != nil { - return - } + tbl := jsonTbl.Partitions[def.Name.L] + if tbl != nil { + taskCh <- &statstypes.PartitionStatisticLoadTask{ + PhysicalID: def.ID, + JSONTable: tbl, } - }) - } - wg.Wait() - if e.Load() != nil { - return *e.Load() + } } // load global-stats if existed if globalStats, ok := jsonTbl.Partitions[util.TiDBGlobalStats]; ok { - if err := s.loadStatsFromJSON(tableInfo, tableInfo.ID, globalStats); err != nil { - return errors.Trace(err) + taskCh <- &statstypes.PartitionStatisticLoadTask{ + PhysicalID: tableInfo.ID, + JSONTable: globalStats, } } + close(taskCh) + if err := s.LoadStatsFromJSONConcurrently(ctx, tableInfo, taskCh, concurrencyForPartition); err != nil { + return errors.Trace(err) + } } return nil } +// LoadStatsFromJSON will load statistic from JSONTable, and save it to the storage. +// In final, it will also udpate the stats cache. +func (s *statsReadWriter) LoadStatsFromJSON(ctx context.Context, is infoschema.InfoSchema, + jsonTbl *util.JSONTable, concurrencyForPartition int) error { + if err := s.LoadStatsFromJSONNoUpdate(ctx, is, jsonTbl, concurrencyForPartition); err != nil { + return errors.Trace(err) + } + return errors.Trace(s.statsHandler.Update(is)) +} + func (s *statsReadWriter) loadStatsFromJSON(tableInfo *model.TableInfo, physicalID int64, jsonTbl *util.JSONTable) error { tbl, err := TableStatsFromJSON(tableInfo, physicalID, jsonTbl) if err != nil { @@ -612,7 +717,7 @@ func (s *statsReadWriter) loadStatsFromJSON(tableInfo *model.TableInfo, physical // loadStatsFromJSON doesn't support partition table now. // The table level count and modify_count would be overridden by the SaveMetaToStorage below, so we don't need // to care about them here. - err = s.SaveStatsToStorage(tbl.PhysicalID, tbl.RealtimeCount, 0, 0, &col.Histogram, col.CMSketch, col.TopN, int(col.GetStatsVer()), 1, false, util.StatsMetaHistorySourceLoadStats) + err = s.SaveStatsToStorage(tbl.PhysicalID, tbl.RealtimeCount, 0, 0, &col.Histogram, col.CMSketch, col.TopN, int(col.GetStatsVer()), statistics.AnalyzeFlag, false, util.StatsMetaHistorySourceLoadStats) if err != nil { return errors.Trace(err) } @@ -621,7 +726,7 @@ func (s *statsReadWriter) loadStatsFromJSON(tableInfo *model.TableInfo, physical // loadStatsFromJSON doesn't support partition table now. // The table level count and modify_count would be overridden by the SaveMetaToStorage below, so we don't need // to care about them here. - err = s.SaveStatsToStorage(tbl.PhysicalID, tbl.RealtimeCount, 0, 1, &idx.Histogram, idx.CMSketch, idx.TopN, int(idx.GetStatsVer()), 1, false, util.StatsMetaHistorySourceLoadStats) + err = s.SaveStatsToStorage(tbl.PhysicalID, tbl.RealtimeCount, 0, 1, &idx.Histogram, idx.CMSketch, idx.TopN, int(idx.GetStatsVer()), statistics.AnalyzeFlag, false, util.StatsMetaHistorySourceLoadStats) if err != nil { return errors.Trace(err) } diff --git a/pkg/statistics/handle/storage/stats_read_writer_test.go b/pkg/statistics/handle/storage/stats_read_writer_test.go new file mode 100644 index 0000000000000..3abbdc9bc91bf --- /dev/null +++ b/pkg/statistics/handle/storage/stats_read_writer_test.go @@ -0,0 +1,82 @@ +// Copyright 2023 PingCAP, 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. + +package storage_test + +import ( + "testing" + + "github.com/pingcap/tidb/pkg/parser/model" + "github.com/pingcap/tidb/pkg/testkit" + "github.com/stretchr/testify/require" +) + +func TestUpdateStatsMetaVersionForGC(t *testing.T) { + store, do := testkit.CreateMockStoreAndDomain(t) + testKit := testkit.NewTestKit(t, store) + h := do.StatsHandle() + testKit.MustExec("use test") + testKit.MustExec("drop table if exists t") + testKit.MustExec(` + create table t ( + a int, + b int, + primary key(a), + index idx(b) + ) + partition by range (a) ( + partition p0 values less than (6), + partition p1 values less than (11), + partition p2 values less than (16), + partition p3 values less than (21) + ) + `) + testKit.MustExec("insert into t values (1,2),(2,2),(6,2),(11,2),(16,2)") + testKit.MustExec("analyze table t") + is := do.InfoSchema() + tbl, err := is.TableByName( + model.NewCIStr("test"), model.NewCIStr("t"), + ) + require.NoError(t, err) + tableInfo := tbl.Meta() + pi := tableInfo.GetPartitionInfo() + for _, def := range pi.Definitions { + statsTbl := h.GetPartitionStats(tableInfo, def.ID) + require.False(t, statsTbl.Pseudo) + } + err = h.Update(is) + require.NoError(t, err) + + // Reset one partition stats. + p0 := pi.Definitions[0] + err = h.UpdateStatsMetaVersionForGC(p0.ID) + require.NoError(t, err) + + // Get partition stats from stats_meta table. + rows := testKit.MustQuery( + "select version from mysql.stats_meta where table_id = ?", + p0.ID, + ).Rows() + require.Equal(t, 1, len(rows)) + // Parse version from stats_meta. + version := rows[0][0].(string) + + // Check stats_meta_history again. The version should be the same. + rows = testKit.MustQuery( + "select count(*) from mysql.stats_meta_history where table_id = ? and version = ?", + p0.ID, + version, + ).Rows() + require.Equal(t, 1, len(rows)) +} diff --git a/pkg/statistics/handle/types/interfaces.go b/pkg/statistics/handle/types/interfaces.go index c65de0f68802d..b7b7a65fd3130 100644 --- a/pkg/statistics/handle/types/interfaces.go +++ b/pkg/statistics/handle/types/interfaces.go @@ -115,8 +115,20 @@ type StatsAnalyze interface { // DeleteAnalyzeJobs deletes the analyze jobs whose update time is earlier than updateTime. DeleteAnalyzeJobs(updateTime time.Time) error - // HandleAutoAnalyze analyzes the newly created table or index. - HandleAutoAnalyze(is infoschema.InfoSchema) (analyzed bool) + // CleanupCorruptedAnalyzeJobsOnCurrentInstance cleans up the corrupted analyze job. + // A corrupted analyze job is one that is in a 'pending' or 'running' state, + // but is associated with a TiDB instance that is either not currently running or has been restarted. + // We use current running analyze jobs to check whether the analyze job is corrupted. + CleanupCorruptedAnalyzeJobsOnCurrentInstance(currentRunningProcessIDs map[uint64]struct{}) error + + // CleanupCorruptedAnalyzeJobsOnDeadInstances purges analyze jobs that are associated with non-existent instances. + // This function is specifically designed to handle jobs that have become corrupted due to + // their associated instances being removed from the current cluster. + CleanupCorruptedAnalyzeJobsOnDeadInstances() error + + // HandleAutoAnalyze analyzes the outdated tables. (The change percent of the table exceeds the threshold) + // It also analyzes newly created tables and newly added indexes. + HandleAutoAnalyze() (analyzed bool) // CheckAnalyzeVersion checks whether all the statistics versions of this table's columns and indexes are the same. CheckAnalyzeVersion(tblInfo *model.TableInfo, physicalIDs []int64, version *int) bool @@ -216,6 +228,15 @@ type StatsLock interface { GetTableLockedAndClearForTest() (map[int64]struct{}, error) } +// PartitionStatisticLoadTask currently records a partition-level jsontable. +type PartitionStatisticLoadTask struct { + JSONTable *statsutil.JSONTable + PhysicalID int64 +} + +// PersistFunc is used to persist JSONTable in the partition level. +type PersistFunc func(ctx context.Context, jsonTable *statsutil.JSONTable, physicalID int64) error + // StatsReadWriter is used to read and write stats to the storage. // TODO: merge and remove some methods. type StatsReadWriter interface { @@ -228,6 +249,10 @@ type StatsReadWriter interface { // StatsMetaCountAndModifyCount reads count and modify_count for the given table from mysql.stats_meta. StatsMetaCountAndModifyCount(tableID int64) (count, modifyCount int64, err error) + // UpdateStatsMetaDelta updates the count and modify_count for the given table in mysql.stats_meta. + // It will add the delta to the original count and modify_count. The delta can be positive or negative. + UpdateStatsMetaDelta(tableID int64, count, delta int64) (err error) + // LoadNeededHistograms will load histograms for those needed columns/indices and put them into the cache. LoadNeededHistograms() (err error) @@ -252,9 +277,30 @@ type StatsReadWriter interface { // then tidb-server will reload automatic. UpdateStatsVersion() error - // ResetTableStats2KVForDrop update the version of mysql.stats_meta. - // Then GC worker will delete the old version of stats. - ResetTableStats2KVForDrop(physicalID int64) (err error) + // UpdateStatsMetaVersionForGC updates the version of mysql.stats_meta, + // ensuring it is greater than the last garbage collection (GC) time. + // The GC worker deletes old stats based on a safe time point, + // calculated as now() - 10 * max(stats lease, ddl lease). + // The range [last GC time, safe time point) is chosen to prevent + // the simultaneous deletion of numerous stats, minimizing potential + // performance issues. + // This function ensures the version is updated beyond the last GC time, + // allowing the GC worker to delete outdated stats. + // + // Explanation: + // - ddl lease: 10 + // - stats lease: 3 + // - safe time point: now() - 10 * 10 = now() - 100 + // - now: 200 + // - last GC time: 90 + // - [last GC time, safe time point) = [90, 100) + // - To trigger stats deletion, the version must be updated beyond 90. + // + // This safeguards scenarios where a table remains unchanged for an extended period. + // For instance, if a table was created at time 90, and it's now time 200, + // with the last GC time at 95 and the safe time point at 100, + // updating the version beyond 95 ensures eventual deletion of stats. + UpdateStatsMetaVersionForGC(physicalID int64) (err error) // ChangeGlobalStatsID changes the global stats ID. ChangeGlobalStatsID(from, to int64) (err error) @@ -282,12 +328,21 @@ type StatsReadWriter interface { // DumpStatsToJSONBySnapshot dumps statistic to json. DumpStatsToJSONBySnapshot(dbName string, tableInfo *model.TableInfo, snapshot uint64, dumpPartitionStats bool) (*statsutil.JSONTable, error) + // PersistStatsBySnapshot dumps statistic to json and call the function for each partition statistic to persist. + // Notice: + // 1. It might call the function `persist` with nil jsontable. + // 2. It is only used by BR, so partitions' statistic are always dumped. + PersistStatsBySnapshot(ctx context.Context, dbName string, tableInfo *model.TableInfo, snapshot uint64, persist PersistFunc) error + + // LoadStatsFromJSONConcurrently consumes concurrently the statistic task from `taskCh`. + LoadStatsFromJSONConcurrently(ctx context.Context, tableInfo *model.TableInfo, taskCh chan *PartitionStatisticLoadTask, concurrencyForPartition int) error + // LoadStatsFromJSON will load statistic from JSONTable, and save it to the storage. // In final, it will also udpate the stats cache. - LoadStatsFromJSON(ctx context.Context, is infoschema.InfoSchema, jsonTbl *statsutil.JSONTable, concurrencyForPartition uint8) error + LoadStatsFromJSON(ctx context.Context, is infoschema.InfoSchema, jsonTbl *statsutil.JSONTable, concurrencyForPartition int) error // LoadStatsFromJSONNoUpdate will load statistic from JSONTable, and save it to the storage. - LoadStatsFromJSONNoUpdate(ctx context.Context, is infoschema.InfoSchema, jsonTbl *statsutil.JSONTable, concurrencyForPartition uint8) error + LoadStatsFromJSONNoUpdate(ctx context.Context, is infoschema.InfoSchema, jsonTbl *statsutil.JSONTable, concurrencyForPartition int) error // Methods for extended stast. @@ -348,9 +403,6 @@ type StatsGlobal interface { isIndex bool, histIDs []int64, ) (globalStats interface{}, err error) - - // UpdateGlobalStats will trigger the merge of global-stats when we drop table partition - UpdateGlobalStats(tblInfo *model.TableInfo) error } // DDL is used to handle ddl events. @@ -378,6 +430,9 @@ type StatsHandle interface { // GetTableStats retrieves the statistics table from cache, and the cache will be updated by a goroutine. GetTableStats(tblInfo *model.TableInfo) *statistics.Table + // GetTableStatsForAutoAnalyze retrieves the statistics table from cache, but it will not return pseudo. + GetTableStatsForAutoAnalyze(tblInfo *model.TableInfo) *statistics.Table + // GetPartitionStats retrieves the partition stats from cache. GetPartitionStats(tblInfo *model.TableInfo, pid int64) *statistics.Table diff --git a/pkg/statistics/handle/updatetest/main_test.go b/pkg/statistics/handle/updatetest/main_test.go index c90aded5dfabd..c10ec74b44ad1 100644 --- a/pkg/statistics/handle/updatetest/main_test.go +++ b/pkg/statistics/handle/updatetest/main_test.go @@ -24,6 +24,7 @@ import ( func TestMain(m *testing.M) { opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), diff --git a/pkg/statistics/handle/updatetest/update_test.go b/pkg/statistics/handle/updatetest/update_test.go index ff03126a57ba7..ebb11de4d2d47 100644 --- a/pkg/statistics/handle/updatetest/update_test.go +++ b/pkg/statistics/handle/updatetest/update_test.go @@ -388,7 +388,7 @@ func TestAutoUpdate(t *testing.T) { require.NoError(t, err) require.NoError(t, h.DumpStatsDeltaToKV(true)) require.NoError(t, h.Update(is)) - h.HandleAutoAnalyze(is) + h.HandleAutoAnalyze() require.NoError(t, h.Update(is)) stats = h.GetTableStats(tableInfo) require.Equal(t, int64(5), stats.RealtimeCount) @@ -406,7 +406,7 @@ func TestAutoUpdate(t *testing.T) { require.NoError(t, err) require.NoError(t, h.DumpStatsDeltaToKV(true)) require.NoError(t, h.Update(is)) - h.HandleAutoAnalyze(is) + h.HandleAutoAnalyze() require.NoError(t, h.Update(is)) stats = h.GetTableStats(tableInfo) require.Equal(t, int64(6), stats.RealtimeCount) @@ -416,7 +416,7 @@ func TestAutoUpdate(t *testing.T) { require.NoError(t, err) require.NoError(t, h.DumpStatsDeltaToKV(true)) require.NoError(t, h.Update(is)) - h.HandleAutoAnalyze(is) + h.HandleAutoAnalyze() require.NoError(t, h.Update(is)) stats = h.GetTableStats(tableInfo) require.Equal(t, int64(7), stats.RealtimeCount) @@ -426,7 +426,7 @@ func TestAutoUpdate(t *testing.T) { require.NoError(t, err) require.NoError(t, h.DumpStatsDeltaToKV(true)) require.NoError(t, h.Update(is)) - h.HandleAutoAnalyze(is) + h.HandleAutoAnalyze() require.NoError(t, h.Update(is)) stats = h.GetTableStats(tableInfo) require.Equal(t, int64(8), stats.RealtimeCount) @@ -445,7 +445,7 @@ func TestAutoUpdate(t *testing.T) { tbl, err = is.TableByName(model.NewCIStr("test"), model.NewCIStr("t")) require.NoError(t, err) tableInfo = tbl.Meta() - h.HandleAutoAnalyze(is) + h.HandleAutoAnalyze() require.NoError(t, h.Update(is)) testKit.MustExec("explain select * from t where a > 'a'") require.NoError(t, h.LoadNeededHistograms()) @@ -491,7 +491,7 @@ func TestAutoUpdatePartition(t *testing.T) { testKit.MustExec("insert into t values (1)") require.NoError(t, h.DumpStatsDeltaToKV(true)) require.NoError(t, h.Update(is)) - h.HandleAutoAnalyze(is) + h.HandleAutoAnalyze() stats = h.GetPartitionStats(tableInfo, pi.Definitions[0].ID) require.Equal(t, int64(1), stats.RealtimeCount) require.Equal(t, int64(0), stats.ModifyCount) @@ -518,7 +518,7 @@ func TestIssue25700(t *testing.T) { require.NoError(t, dom.StatsHandle().DumpStatsDeltaToKV(true)) require.NoError(t, dom.StatsHandle().Update(dom.InfoSchema())) - require.True(t, dom.StatsHandle().HandleAutoAnalyze(dom.InfoSchema())) + require.True(t, dom.StatsHandle().HandleAutoAnalyze()) require.Equal(t, "finished", tk.MustQuery("show analyze status").Rows()[1][7]) } @@ -648,9 +648,8 @@ func BenchmarkHandleAutoAnalyze(b *testing.B) { testKit := testkit.NewTestKit(b, store) testKit.MustExec("use test") h := dom.StatsHandle() - is := dom.InfoSchema() for i := 0; i < b.N; i++ { - h.HandleAutoAnalyze(is) + h.HandleAutoAnalyze() } } @@ -834,7 +833,7 @@ func TestAutoUpdatePartitionInDynamicOnlyMode(t *testing.T) { require.Equal(t, int64(3), partitionStats.RealtimeCount) require.Equal(t, int64(1), partitionStats.ModifyCount) - h.HandleAutoAnalyze(is) + h.HandleAutoAnalyze() require.NoError(t, h.Update(is)) globalStats = h.GetTableStats(tableInfo) partitionStats = h.GetPartitionStats(tableInfo, pi.Definitions[0].ID) @@ -885,19 +884,19 @@ func TestAutoAnalyzeRatio(t *testing.T) { require.NoError(t, h.DumpStatsDeltaToKV(true)) require.NoError(t, h.Update(is)) require.Equal(t, getStatsHealthy(), 44) - require.True(t, h.HandleAutoAnalyze(is)) + require.True(t, h.HandleAutoAnalyze()) tk.MustExec("delete from t limit 12") require.NoError(t, h.DumpStatsDeltaToKV(true)) require.NoError(t, h.Update(is)) require.Equal(t, getStatsHealthy(), 61) - require.False(t, h.HandleAutoAnalyze(is)) + require.False(t, h.HandleAutoAnalyze()) tk.MustExec("delete from t limit 4") require.NoError(t, h.DumpStatsDeltaToKV(true)) require.NoError(t, h.Update(is)) require.Equal(t, getStatsHealthy(), 48) - require.True(t, h.HandleAutoAnalyze(dom.InfoSchema())) + require.True(t, h.HandleAutoAnalyze()) } func TestDumpColumnStatsUsage(t *testing.T) { @@ -1104,7 +1103,7 @@ func TestStatsLockUnlockForAutoAnalyze(t *testing.T) { tk.MustExec("insert into t values (1)" + strings.Repeat(", (1)", 10)) require.NoError(t, h.DumpStatsDeltaToKV(true)) require.NoError(t, h.Update(is)) - require.True(t, h.HandleAutoAnalyze(is)) + require.True(t, h.HandleAutoAnalyze()) tbl, err := dom.InfoSchema().TableByName(model.NewCIStr("test"), model.NewCIStr("t")) require.Nil(t, err) @@ -1119,7 +1118,7 @@ func TestStatsLockUnlockForAutoAnalyze(t *testing.T) { tk.MustExec("delete from t limit 12") require.NoError(t, h.DumpStatsDeltaToKV(true)) require.NoError(t, h.Update(is)) - require.False(t, h.HandleAutoAnalyze(is)) + require.False(t, h.HandleAutoAnalyze()) tblStats1 := h.GetTableStats(tbl.Meta()) require.Equal(t, tblStats, tblStats1) @@ -1300,13 +1299,13 @@ func TestAutoAnalyzePartitionTableAfterAddingIndex(t *testing.T) { tk.MustExec("set session tidb_analyze_version = 2") tk.MustExec("set session tidb_partition_prune_mode = 'dynamic'") tk.MustExec("analyze table t") - require.False(t, h.HandleAutoAnalyze(dom.InfoSchema())) + require.False(t, h.HandleAutoAnalyze()) tk.MustExec("alter table t add index idx(a)") tbl, err := dom.InfoSchema().TableByName(model.NewCIStr("test"), model.NewCIStr("t")) require.NoError(t, err) tblInfo := tbl.Meta() idxInfo := tblInfo.Indices[0] require.Nil(t, h.GetTableStats(tblInfo).Indices[idxInfo.ID]) - require.True(t, h.HandleAutoAnalyze(dom.InfoSchema())) + require.True(t, h.HandleAutoAnalyze()) require.NotNil(t, h.GetTableStats(tblInfo).Indices[idxInfo.ID]) } diff --git a/pkg/statistics/handle/usage/collector/BUILD.bazel b/pkg/statistics/handle/usage/collector/BUILD.bazel new file mode 100644 index 0000000000000..d6cf0630093b1 --- /dev/null +++ b/pkg/statistics/handle/usage/collector/BUILD.bazel @@ -0,0 +1,18 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") + +go_library( + name = "collector", + srcs = ["collector.go"], + importpath = "github.com/pingcap/tidb/pkg/statistics/handle/usage/collector", + visibility = ["//visibility:public"], +) + +go_test( + name = "collector_test", + timeout = "short", + srcs = ["collector_test.go"], + embed = [":collector"], + flaky = True, + shard_count = 3, + deps = ["@com_github_stretchr_testify//require"], +) diff --git a/pkg/statistics/handle/usage/collector/collector.go b/pkg/statistics/handle/usage/collector/collector.go new file mode 100644 index 0000000000000..8fa98c284ac8c --- /dev/null +++ b/pkg/statistics/handle/usage/collector/collector.go @@ -0,0 +1,172 @@ +// Copyright 2024 PingCAP, 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. + +package collector + +import ( + "sync" + "time" +) + +const ( + defaultTimeout = 5 * time.Minute + defaultChannelSize = 10 +) + +// GlobalCollector provides a utility to collect stats data from each session +type GlobalCollector[T any] interface { + SpawnSession() SessionCollector[T] + Close() + StartWorker() +} + +var _ GlobalCollector[int] = &globalCollector[int]{} + +// globalCollector is an implementation of `GlobalCollector` +type globalCollector[T any] struct { + mergeFn func(T) + dataCh chan T + highPriorityDataCh chan T + closeCh chan struct{} + wg sync.WaitGroup + timeout time.Duration + + closeOnce sync.Once +} + +// NewGlobalCollector creates a new global collector +func NewGlobalCollector[T any](mergeFn func(T)) GlobalCollector[T] { + g := &globalCollector[T]{ + mergeFn: mergeFn, + // Now the timeout and channel size is not configurable for the simplicity. + // If there is a scenario in which tuning timeout and channel size is necessary, feel free to expand this + // constructor. + timeout: defaultTimeout, + dataCh: make(chan T, defaultChannelSize), + highPriorityDataCh: make(chan T, defaultChannelSize), + closeCh: make(chan struct{}), + } + return g +} + +// SpawnSession creates a related session collector from the global collector +func (g *globalCollector[T]) SpawnSession() SessionCollector[T] { + return &sessionCollector[T]{ + timeout: g.timeout, + dataCh: g.dataCh, + highPriorityDataCh: g.highPriorityDataCh, + lastUpdate: time.Now(), + } +} + +// StartWorker spawns a goroutine to merge the data +func (g *globalCollector[T]) StartWorker() { + g.wg.Add(1) + go func() { + defer g.wg.Done() + + loop: + for { + // nested selection to make sure `highPriorityDataCh` is selected before the normal `dataCh` + select { + case data := <-g.highPriorityDataCh: + g.mergeFn(data) + case <-g.closeCh: + break loop + default: + select { + case data := <-g.dataCh: + g.mergeFn(data) + case data := <-g.highPriorityDataCh: + g.mergeFn(data) + case <-g.closeCh: + break loop + } + } + } + + // drain out the data from channel + g.flush() + }() +} + +// flush reads all data from the channel, until the channel is empty +func (g *globalCollector[T]) flush() { + for { + select { + case data := <-g.highPriorityDataCh: + g.mergeFn(data) + case data := <-g.dataCh: + g.mergeFn(data) + default: + return + } + } +} + +// Close closes the background worker of the global collector +func (g *globalCollector[T]) Close() { + g.closeOnce.Do(func() { + close(g.closeCh) + g.wg.Wait() + }) +} + +// SessionCollector is an interface to send stats data to the global collector +type SessionCollector[T any] interface { + // SendDelta sends the data to the global collector. This function will not block (unless the `timeout` reached). It + // returns a bool to represent whether the data has been sent successfully. + SendDelta(data T) bool + // SendDeltaSync sends the data to the global collector. Unlike `SendDelta`, this function will always block and + // wait until the data has been received by the global collector. + SendDeltaSync(data T) bool +} + +var _ SessionCollector[int] = &sessionCollector[int]{} + +// sessionCollector is the collector attached to each session to send the data to global collector +type sessionCollector[T any] struct { + lastUpdate time.Time + dataCh chan<- T + highPriorityDataCh chan<- T + closeCh <-chan struct{} + timeout time.Duration +} + +// SendDelta implements `SessionCollector[T]` interface +func (s *sessionCollector[T]) SendDelta(data T) bool { + if time.Since(s.lastUpdate) > s.timeout { + return s.SendDeltaSync(data) + } + + // don't block on the channel + select { + case s.dataCh <- data: + s.lastUpdate = time.Now() + return true + default: + return false + } +} + +// SendDeltaSync implements `SessionCollector[T]` interface +func (s *sessionCollector[T]) SendDeltaSync(data T) bool { + select { + case s.highPriorityDataCh <- data: + s.lastUpdate = time.Now() + return true + case <-s.closeCh: + return false + } +} diff --git a/pkg/statistics/handle/usage/collector/collector_test.go b/pkg/statistics/handle/usage/collector/collector_test.go new file mode 100644 index 0000000000000..e7118e326ec45 --- /dev/null +++ b/pkg/statistics/handle/usage/collector/collector_test.go @@ -0,0 +1,99 @@ +// Copyright 2024 PingCAP, 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. + +package collector + +import ( + "sync" + "sync/atomic" + "testing" + + "github.com/stretchr/testify/require" +) + +func TestSessionSendDelta(t *testing.T) { + num := 0 + mergeFn := func(delta int) { + num += delta + } + + g := NewGlobalCollector(mergeFn) + g.StartWorker() + s := g.SpawnSession() + expect := 0 + for i := 0; i < 256; i++ { + if s.SendDelta(1) { + expect += 1 + } + } + + g.Close() + require.Equal(t, expect, num) +} + +func TestSessionParallelSendDelta(t *testing.T) { + num := 0 + var expect atomic.Int64 + mergeFn := func(delta int) { + num += delta + } + + g := NewGlobalCollector(mergeFn) + g.StartWorker() + sessionCount := 256 + var wg sync.WaitGroup + for i := 0; i < sessionCount; i++ { + s := g.SpawnSession() + wg.Add(1) + go func() { + for i := 0; i < 256; i++ { + if s.SendDelta(1) { + expect.Add(1) + } + } + wg.Done() + }() + } + + wg.Wait() + g.Close() + require.Equal(t, expect.Load(), int64(num)) +} + +func TestSessionParallelSendDeltaSync(t *testing.T) { + num := 0 + mergeFn := func(delta int) { + num += delta + } + + g := NewGlobalCollector(mergeFn) + g.StartWorker() + sessionCount := 256 + var wg sync.WaitGroup + + for i := 0; i < sessionCount; i++ { + wg.Add(1) + s := g.SpawnSession() + go func() { + for i := 0; i < 256; i++ { + s.SendDeltaSync(1) + } + wg.Done() + }() + } + wg.Wait() + + g.Close() + require.Equal(t, sessionCount*256, num) +} diff --git a/pkg/statistics/handle/util/BUILD.bazel b/pkg/statistics/handle/util/BUILD.bazel index 1f10614908675..6cbc0155b6028 100644 --- a/pkg/statistics/handle/util/BUILD.bazel +++ b/pkg/statistics/handle/util/BUILD.bazel @@ -20,6 +20,7 @@ go_library( "//pkg/parser/terror", "//pkg/sessionctx", "//pkg/sessionctx/variable", + "//pkg/statistics/handle/logutil", "//pkg/table", "//pkg/util/chunk", "//pkg/util/intest", @@ -31,6 +32,7 @@ go_library( "@com_github_tiancaiamao_gp//:gp", "@com_github_tikv_client_go_v2//oracle", "@org_uber_go_atomic//:atomic", + "@org_uber_go_zap//:zap", ], ) diff --git a/pkg/statistics/handle/util/ddl_event.go b/pkg/statistics/handle/util/ddl_event.go index 36b0a39d08244..1827eea2497cf 100644 --- a/pkg/statistics/handle/util/ddl_event.go +++ b/pkg/statistics/handle/util/ddl_event.go @@ -18,6 +18,8 @@ import ( "fmt" "github.com/pingcap/tidb/pkg/parser/model" + "github.com/pingcap/tidb/pkg/statistics/handle/logutil" + "go.uber.org/zap" ) // DDLEvent contains the information of a ddl event that is used to update stats. @@ -31,7 +33,10 @@ type DDLEvent struct { oldTableInfo *model.TableInfo oldPartInfo *model.PartitionInfo columnInfos []*model.ColumnInfo - tp model.ActionType + // This value is used to store the table ID during a transition. + // It applies when a table structure is being changed from partitioned to non-partitioned, or vice versa. + oldTableID int64 + tp model.ActionType } // NewCreateTableEvent creates a new ddl event that creates a table. @@ -152,23 +157,42 @@ func (e *DDLEvent) GetDropPartitionInfo() (globalTableInfo *model.TableInfo, dro } // NewExchangePartitionEvent creates a new ddl event that exchanges a partition. +// Please make sure pass the information before the exchange. func NewExchangePartitionEvent( globalTableInfo *model.TableInfo, - exchangedPartInfo *model.PartitionInfo, - exchangedTableInfo *model.TableInfo, + originalPartInfo *model.PartitionInfo, + originalTableInfo *model.TableInfo, ) *DDLEvent { + if len(originalPartInfo.Definitions) != 1 { + allIDs := make([]int64, 0, len(originalPartInfo.Definitions)) + allNames := make([]string, 0, len(originalPartInfo.Definitions)) + for _, def := range originalPartInfo.Definitions { + allIDs = append(allIDs, def.ID) + allNames = append(allNames, def.Name.O) + } + logutil.StatsLogger().Error("Exchange partition should only have one partition to exchange", + zap.Int64("globalTableID", globalTableInfo.ID), + zap.String("globalTableName", globalTableInfo.Name.O), + zap.Int64("tableID", originalTableInfo.ID), + zap.String("tableName", originalTableInfo.Name.O), + zap.Int64s("allPartitionIDs", allIDs), + zap.Strings("allPartitionNames", allNames), + ) + } return &DDLEvent{ tp: model.ActionExchangeTablePartition, tableInfo: globalTableInfo, - partInfo: exchangedPartInfo, - oldTableInfo: exchangedTableInfo, + partInfo: originalPartInfo, + oldTableInfo: originalTableInfo, } } -func (e *DDLEvent) getExchangePartitionInfo() ( +// GetExchangePartitionInfo gets the table info of the table that is exchanged a partition.\ +// Note: All information pertains to the state before the exchange. +func (e *DDLEvent) GetExchangePartitionInfo() ( globalTableInfo *model.TableInfo, - exchangedPartInfo *model.PartitionInfo, - exchangedTableInfo *model.TableInfo, + originalPartInfo *model.PartitionInfo, + originalTableInfo *model.TableInfo, ) { return e.tableInfo, e.partInfo, e.oldTableInfo } @@ -223,29 +247,37 @@ func (e *DDLEvent) GetTruncatePartitionInfo() ( // NewAddPartitioningEvent creates a new ddl event that converts a single table to a partitioned table. // For example, `alter table t partition by range (c1) (partition p1 values less than (10))`. func NewAddPartitioningEvent( + oldSingleTableID int64, newGlobalTableInfo *model.TableInfo, addedPartInfo *model.PartitionInfo, ) *DDLEvent { return &DDLEvent{ - tp: model.ActionAlterTablePartitioning, - tableInfo: newGlobalTableInfo, - partInfo: addedPartInfo, + tp: model.ActionAlterTablePartitioning, + oldTableID: oldSingleTableID, + tableInfo: newGlobalTableInfo, + partInfo: addedPartInfo, } } // GetAddPartitioningInfo gets the table info of the table that is converted to a partitioned table. -func (e *DDLEvent) GetAddPartitioningInfo() (newGlobalTableInfo *model.TableInfo, addedPartInfo *model.PartitionInfo) { - return e.tableInfo, e.partInfo +func (e *DDLEvent) GetAddPartitioningInfo() ( + oldSingleTableID int64, + newGlobalTableInfo *model.TableInfo, + addedPartInfo *model.PartitionInfo, +) { + return e.oldTableID, e.tableInfo, e.partInfo } // NewRemovePartitioningEvent creates a new ddl event that converts a partitioned table to a single table. // For example, `alter table t remove partitioning`. func NewRemovePartitioningEvent( + oldPartitionedTableID int64, newSingleTableInfo *model.TableInfo, droppedPartInfo *model.PartitionInfo, ) *DDLEvent { return &DDLEvent{ tp: model.ActionRemovePartitioning, + oldTableID: oldPartitionedTableID, tableInfo: newSingleTableInfo, oldPartInfo: droppedPartInfo, } @@ -253,10 +285,11 @@ func NewRemovePartitioningEvent( // GetRemovePartitioningInfo gets the table info of the table that is converted to a single table. func (e *DDLEvent) GetRemovePartitioningInfo() ( + oldPartitionedTableID int64, newSingleTableInfo *model.TableInfo, droppedPartInfo *model.PartitionInfo, ) { - return e.tableInfo, e.oldPartInfo + return e.oldTableID, e.tableInfo, e.oldPartInfo } // NewFlashbackClusterEvent creates a new ddl event that flashes back the cluster. diff --git a/pkg/statistics/handle/util/test/BUILD.bazel b/pkg/statistics/handle/util/test/BUILD.bazel new file mode 100644 index 0000000000000..03d3f3231d84d --- /dev/null +++ b/pkg/statistics/handle/util/test/BUILD.bazel @@ -0,0 +1,12 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library") + +go_library( + name = "test", + srcs = ["ctx_matcher.go"], + importpath = "github.com/pingcap/tidb/pkg/statistics/handle/util/test", + visibility = ["//visibility:public"], + deps = [ + "//pkg/kv", + "@com_github_tikv_client_go_v2//util", + ], +) diff --git a/pkg/statistics/handle/util/test/ctx_matcher.go b/pkg/statistics/handle/util/test/ctx_matcher.go new file mode 100644 index 0000000000000..67364a8b536cf --- /dev/null +++ b/pkg/statistics/handle/util/test/ctx_matcher.go @@ -0,0 +1,37 @@ +// Copyright 2023 PingCAP, 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. + +package test + +import ( + "context" + + "github.com/pingcap/tidb/pkg/kv" + "github.com/tikv/client-go/v2/util" +) + +// CtxMatcher is a matcher for context.Context +type CtxMatcher struct{} + +// Matches returns true if the context is internal_stats source. +func (*CtxMatcher) Matches(x interface{}) bool { + ctx := x.(context.Context) + s := util.RequestSourceFromCtx(ctx) + return s == util.InternalRequest+"_"+kv.InternalTxnStats +} + +// String returns the description of CtxMatcher. +func (*CtxMatcher) String() string { + return "all txns should be internal_stats source" +} diff --git a/pkg/statistics/handle/util/util.go b/pkg/statistics/handle/util/util.go index 930173255ee50..84d0fa4703db1 100644 --- a/pkg/statistics/handle/util/util.go +++ b/pkg/statistics/handle/util/util.go @@ -208,7 +208,7 @@ func Exec(sctx sessionctx.Context, sql string, args ...interface{}) (sqlexec.Rec // ExecRows is a helper function to execute sql and return rows and fields. func ExecRows(sctx sessionctx.Context, sql string, args ...interface{}) (rows []chunk.Row, fields []*ast.ResultField, err error) { if intest.InTest { - if v := sctx.Value(mock.MockRestrictedSQLExecutorKey{}); v != nil { + if v := sctx.Value(mock.RestrictedSQLExecutorKey{}); v != nil { return v.(*mock.MockRestrictedSQLExecutor).ExecRestrictedSQL(StatsCtx, UseCurrentSessionOpt, sql, args...) } diff --git a/pkg/statistics/histogram.go b/pkg/statistics/histogram.go index 77f0bed10fe87..c69eb18f3c08a 100644 --- a/pkg/statistics/histogram.go +++ b/pkg/statistics/histogram.go @@ -16,10 +16,10 @@ package statistics import ( "bytes" + "cmp" "fmt" "math" "slices" - "sort" "strings" "sync" "time" @@ -40,6 +40,7 @@ import ( "github.com/pingcap/tidb/pkg/util/chunk" "github.com/pingcap/tidb/pkg/util/codec" "github.com/pingcap/tidb/pkg/util/collate" + "github.com/pingcap/tidb/pkg/util/intest" "github.com/pingcap/tidb/pkg/util/ranger" "github.com/pingcap/tipb/go-tipb" "github.com/twmb/murmur3" @@ -118,7 +119,7 @@ func NewHistogram(id, ndv, nullCount int64, version uint64, tp *types.FieldType, NullCount: nullCount, LastUpdateVersion: version, Tp: tp, - Bounds: chunk.NewChunkWithCapacity([]*types.FieldType{tp}, 2*bucketSize), + Bounds: chunk.NewChunkFromPoolWithCapacity([]*types.FieldType{tp}, 2*bucketSize), Buckets: make([]Bucket, 0, bucketSize), TotColSize: totColSize, } @@ -175,11 +176,12 @@ func (hg *Histogram) updateLastBucket(upper *types.Datum, count, repeat int64, n hg.Bounds.TruncateTo(2*l - 1) hg.Bounds.AppendDatum(0, upper) // The sampling case doesn't hold NDV since the low sampling rate. So check the NDV here. - if needBucketNDV && hg.Buckets[l-1].NDV > 0 { - hg.Buckets[l-1].NDV++ + bucket := &hg.Buckets[l-1] + if needBucketNDV && bucket.NDV > 0 { + bucket.NDV++ } - hg.Buckets[l-1].Count = count - hg.Buckets[l-1].Repeat = repeat + bucket.Count = count + bucket.Repeat = repeat } // DecodeTo decodes the histogram bucket values into `tp`. @@ -219,6 +221,14 @@ func (hg *Histogram) Len() int { return len(hg.Buckets) } +// DestroyAndPutToPool resets the FMSketch and puts it to the pool. +func (hg *Histogram) DestroyAndPutToPool() { + if hg == nil { + return + } + hg.Bounds.Destroy(len(hg.Buckets), []*types.FieldType{hg.Tp}) +} + // HistogramEqual tests if two histograms are equal. func HistogramEqual(a, b *Histogram, ignoreID bool) bool { if ignoreID { @@ -251,11 +261,6 @@ const ( // AnalyzeFlag is set when the statistics comes from analyze. const AnalyzeFlag = 1 -// IsAnalyzed checks whether this flag contains AnalyzeFlag. -func IsAnalyzed(flag int64) bool { - return (flag & AnalyzeFlag) > 0 -} - // ValueToString converts a possible encoded value to a formatted string. If the value is encoded, then // idxCols equals to number of origin values, else idxCols is 0. func ValueToString(vars *variable.SessionVars, value *types.Datum, idxCols int, idxColumnTypes []byte) (string, error) { @@ -289,12 +294,13 @@ func (hg *Histogram) BucketToString(bktID, idxCols int) string { // BinarySearchRemoveVal removes the value from the TopN using binary search. func (hg *Histogram) BinarySearchRemoveVal(valCntPairs TopNMeta) { lowIdx, highIdx := 0, hg.Len()-1 + column := hg.Bounds.Column(0) // if hg is too small, we don't need to check the branch. because the cost is more than binary search. if hg.Len() > 4 { - if cmpResult := bytes.Compare(hg.Bounds.Column(0).GetRaw(highIdx*2+1), valCntPairs.Encoded); cmpResult < 0 { + if cmpResult := bytes.Compare(column.GetRaw(highIdx*2+1), valCntPairs.Encoded); cmpResult < 0 { return } - if cmpResult := bytes.Compare(hg.Bounds.Column(0).GetRaw(lowIdx), valCntPairs.Encoded); cmpResult > 0 { + if cmpResult := bytes.Compare(column.GetRaw(lowIdx), valCntPairs.Encoded); cmpResult > 0 { return } } @@ -302,25 +308,27 @@ func (hg *Histogram) BinarySearchRemoveVal(valCntPairs TopNMeta) { var found bool for lowIdx <= highIdx { midIdx = (lowIdx + highIdx) / 2 - cmpResult := bytes.Compare(hg.Bounds.Column(0).GetRaw(midIdx*2), valCntPairs.Encoded) + cmpResult := bytes.Compare(column.GetRaw(midIdx*2), valCntPairs.Encoded) if cmpResult > 0 { highIdx = midIdx - 1 continue } - cmpResult = bytes.Compare(hg.Bounds.Column(0).GetRaw(midIdx*2+1), valCntPairs.Encoded) + cmpResult = bytes.Compare(column.GetRaw(midIdx*2+1), valCntPairs.Encoded) if cmpResult < 0 { lowIdx = midIdx + 1 continue } - if hg.Buckets[midIdx].NDV > 0 { - hg.Buckets[midIdx].NDV-- + midbucket := &hg.Buckets[midIdx] + + if midbucket.NDV > 0 { + midbucket.NDV-- } if cmpResult == 0 { - hg.Buckets[midIdx].Repeat = 0 + midbucket.Repeat = 0 } - hg.Buckets[midIdx].Count -= int64(valCntPairs.Count) - if hg.Buckets[midIdx].Count < 0 { - hg.Buckets[midIdx].Count = 0 + midbucket.Count -= int64(valCntPairs.Count) + if midbucket.Count < 0 { + midbucket.Count = 0 } found = true break @@ -1092,17 +1100,6 @@ func (hg *Histogram) Copy() *Histogram { return &newHist } -// RemoveUpperBound removes the upper bound from histogram. -// It is used when merge stats for incremental analyze. -func (hg *Histogram) RemoveUpperBound() *Histogram { - hg.Buckets[hg.Len()-1].Count -= hg.Buckets[hg.Len()-1].Repeat - hg.Buckets[hg.Len()-1].Repeat = 0 - if hg.NDV > 0 { - hg.NDV-- - } - return hg -} - // TruncateHistogram truncates the histogram to `numBkt` buckets. func (hg *Histogram) TruncateHistogram(numBkt int) *Histogram { hist := hg.Copy() @@ -1162,7 +1159,7 @@ func (hg *Histogram) ExtractTopN(cms *CMSketch, topN *TopN, numCols int, numTopN } } } - sort.SliceStable(dataCnts, func(i, j int) bool { return dataCnts[i].cnt >= dataCnts[j].cnt }) + slices.SortStableFunc(dataCnts, func(a, b dataCnt) int { return -cmp.Compare(a.cnt, b.cnt) }) if len(dataCnts) > int(numTopN) { dataCnts = dataCnts[:numTopN] } @@ -1189,6 +1186,9 @@ func newbucket4MergingForRecycle() *bucket4Merging { func releasebucket4MergingForRecycle(b *bucket4Merging) { b.disjointNDV = 0 + b.Repeat = 0 + b.NDV = 0 + b.Count = 0 bucket4MergingPool.Put(b) } @@ -1268,7 +1268,7 @@ func mergeBucketNDV(sc *stmtctx.StatementContext, left *bucket4Merging, right *b // illegal order. if upperCompare < 0 { err := errors.Errorf("illegal bucket order") - statslogutil.StatsLogger.Warn("fail to mergeBucketNDV", zap.Error(err)) + statslogutil.StatsLogger().Warn("fail to mergeBucketNDV", zap.Error(err)) return nil, err } // ___right_| @@ -1284,7 +1284,7 @@ func mergeBucketNDV(sc *stmtctx.StatementContext, left *bucket4Merging, right *b // illegal order. if lowerCompare < 0 { err := errors.Errorf("illegal bucket order") - statslogutil.StatsLogger.Warn("fail to mergeBucketNDV", zap.Error(err)) + statslogutil.StatsLogger().Warn("fail to mergeBucketNDV", zap.Error(err)) return nil, err } // |___right___| @@ -1376,6 +1376,9 @@ func mergePartitionBuckets(sc *stmtctx.StatementContext, buckets []*bucket4Mergi right := buckets[len(buckets)-1].Clone() totNDV := int64(0) + intest.Assert(res.Count == 0, "Count in the new bucket4Merging should be 0") + intest.Assert(res.Repeat == 0, "Repeat in the new bucket4Merging should be 0") + intest.Assert(res.NDV == 0, "NDV in the new bucket4Merging bucket4Merging should be 0") for i := len(buckets) - 1; i >= 0; i-- { totNDV += buckets[i].NDV res.Count += buckets[i].Count @@ -1478,7 +1481,9 @@ func MergePartitionHist2GlobalHist(sc *stmtctx.StatementContext, hists []*Histog tail := 0 for i := range buckets { if buckets[i].Count != 0 { - buckets[tail] = buckets[i] + // Because we will reuse the tail of the slice in `releasebucket4MergingForRecycle`, + // we need to shift the non-empty buckets to the front. + buckets[tail], buckets[i] = buckets[i], buckets[tail] tail++ } } diff --git a/pkg/statistics/histogram_test.go b/pkg/statistics/histogram_test.go index 73dcac6ac5ff7..d51b367a3dc46 100644 --- a/pkg/statistics/histogram_test.go +++ b/pkg/statistics/histogram_test.go @@ -276,6 +276,170 @@ func TestMergePartitionLevelHist(t *testing.T) { }, expBucketNumber: 3, }, + { + // issue#49023 + partitionHists: [][]*bucket4Test{ + { + // Col(1) = [1, 4,|| 6, 9, 9,|| 12, 12, 12,|| 13, 14, 15] + { + lower: 1, + upper: 4, + count: 2, + repeat: 1, + ndv: 2, + }, + { + lower: 6, + upper: 9, + count: 5, + repeat: 2, + ndv: 2, + }, + { + lower: 12, + upper: 12, + count: 5, + repeat: 3, + ndv: 1, + }, + { + lower: 13, + upper: 15, + count: 11, + repeat: 1, + ndv: 3, + }, + }, + // Col(2) = [2, 5,|| 6, 7, 7,|| 11, 11, 11,|| 13, 14, 17] + { + { + lower: 2, + upper: 5, + count: 2, + repeat: 1, + ndv: 2, + }, + { + lower: 6, + upper: 7, + count: 2, + repeat: 2, + ndv: 2, + }, + { + lower: 11, + upper: 11, + count: 8, + repeat: 3, + ndv: 1, + }, + { + lower: 13, + upper: 17, + count: 11, + repeat: 1, + ndv: 3, + }, + }, + // Col(3) = [2, 5,|| 6, 7, 7,|| 11, 11, 11,|| 13, 14, 17] + { + { + lower: 2, + upper: 5, + count: 2, + repeat: 1, + ndv: 2, + }, + { + lower: 6, + upper: 7, + count: 2, + repeat: 2, + ndv: 2, + }, + { + lower: 11, + upper: 11, + count: 8, + repeat: 3, + ndv: 1, + }, + { + lower: 13, + upper: 17, + count: 11, + repeat: 1, + ndv: 3, + }, + }, + // Col(4) = [2, 5,|| 6, 7, 7,|| 11, 11, 11,|| 13, 14, 17] + { + { + lower: 2, + upper: 5, + count: 2, + repeat: 1, + ndv: 2, + }, + { + lower: 6, + upper: 7, + count: 2, + repeat: 2, + ndv: 2, + }, + { + lower: 11, + upper: 11, + count: 8, + repeat: 3, + ndv: 1, + }, + { + lower: 13, + upper: 17, + count: 11, + repeat: 1, + ndv: 3, + }, + }, + }, + totColSize: []int64{11, 11, 11, 11}, + popedTopN: []topN4Test{ + { + data: 18, + count: 5, + }, + { + data: 4, + count: 6, + }, + }, + expHist: []*bucket4Test{ + { + lower: 1, + upper: 9, + count: 17, + repeat: 2, + ndv: 10, + }, + { + lower: 11, + upper: 11, + count: 35, + repeat: 9, + ndv: 1, + }, + { + lower: 11, + upper: 18, + count: 55, + repeat: 5, + ndv: 8, + }, + }, + expBucketNumber: 3, + }, } for _, tt := range tests { diff --git a/pkg/statistics/main_test.go b/pkg/statistics/main_test.go index 0a460ffa6139c..edce06a48d2d6 100644 --- a/pkg/statistics/main_test.go +++ b/pkg/statistics/main_test.go @@ -47,6 +47,7 @@ func TestMain(m *testing.M) { opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), @@ -105,10 +106,9 @@ func createTestStatisticsSamples(t *testing.T) *testStatisticsSamples { } sc := stmtctx.NewStmtCtx() - var err error - s.samples, err = SortSampleItems(sc, samples) + err := sortSampleItems(sc, samples) require.NoError(t, err) - + s.samples = samples rc := &recordSet{ data: make([]types.Datum, s.count), count: s.count, diff --git a/pkg/statistics/sample.go b/pkg/statistics/sample.go index 5d056abd115d9..77d444e2163af 100644 --- a/pkg/statistics/sample.go +++ b/pkg/statistics/sample.go @@ -61,12 +61,9 @@ func CopySampleItems(items []*SampleItem) []*SampleItem { return n } -// SortSampleItems shallow copies and sorts a slice of SampleItem. -func SortSampleItems(sc *stmtctx.StatementContext, items []*SampleItem) ([]*SampleItem, error) { - sortedItems := make([]*SampleItem, len(items)) - copy(sortedItems, items) +func sortSampleItems(sc *stmtctx.StatementContext, items []*SampleItem) error { var err error - slices.SortStableFunc(sortedItems, func(i, j *SampleItem) int { + slices.SortStableFunc(items, func(i, j *SampleItem) int { var cmp int cmp, err = i.Value.Compare(sc.TypeCtx(), &j.Value, collate.GetBinaryCollator()) if err != nil { @@ -74,7 +71,7 @@ func SortSampleItems(sc *stmtctx.StatementContext, items []*SampleItem) ([]*Samp } return cmp }) - return sortedItems, err + return err } // SampleCollector will collect Samples and calculate the count and ndv of an attribute. diff --git a/pkg/statistics/sample_test.go b/pkg/statistics/sample_test.go index ea7bc8f47eb12..5153b3fa89fe2 100644 --- a/pkg/statistics/sample_test.go +++ b/pkg/statistics/sample_test.go @@ -180,7 +180,7 @@ func TestBuildStatsOnRowSample(t *testing.T) { TotalSize: int64(len(data)) * 8, } tp := types.NewFieldType(mysql.TypeLonglong) - hist, topN, err := BuildHistAndTopN(ctx, 5, 4, 1, collector, tp, true, nil) + hist, topN, err := BuildHistAndTopN(ctx, 5, 4, 1, collector, tp, true, nil, false) require.Nilf(t, err, "%+v", err) topNStr, err := topN.DecodedString(ctx, []byte{tp.GetType()}) require.NoError(t, err) diff --git a/pkg/statistics/statistics_test.go b/pkg/statistics/statistics_test.go index 2ff46f2104e0e..7655bf38131a6 100644 --- a/pkg/statistics/statistics_test.go +++ b/pkg/statistics/statistics_test.go @@ -537,7 +537,7 @@ func SubTestBuild() func(*testing.T) { count = col.LessRowCount(nil, types.NewIntDatum(1)) require.Equal(t, 5, int(count)) - colv2, topnv2, err := BuildHistAndTopN(ctx, int(bucketCount), topNCount, 2, collector, types.NewFieldType(mysql.TypeLonglong), true, nil) + colv2, topnv2, err := BuildHistAndTopN(ctx, int(bucketCount), topNCount, 2, collector, types.NewFieldType(mysql.TypeLonglong), true, nil, false) require.NoError(t, err) require.NotNil(t, topnv2.TopN) // The most common one's occurrence is 9990, the second most common one's occurrence is 30. diff --git a/pkg/statistics/table.go b/pkg/statistics/table.go index 64f017e17a353..e488dfff04c5c 100644 --- a/pkg/statistics/table.go +++ b/pkg/statistics/table.go @@ -106,7 +106,11 @@ type HistColl struct { Idx2ColumnIDs map[int64][]int64 // ColID2IdxIDs maps the column id to a list index ids whose first column is it. It's used to calculate the selectivity in planner. ColID2IdxIDs map[int64][]int64 - PhysicalID int64 + // MVIdx2Columns maps the index id to its columns by expression.Column. + // For normal index, the column id is enough, as we already have in Idx2ColumnIDs. But currently, mv index needs more + // information to match the filter against the mv index columns, and we need this map to provide this information. + MVIdx2Columns map[int64][]*expression.Column + PhysicalID int64 // TODO: add AnalyzeCount here RealtimeCount int64 // RealtimeCount is the current table row count, maintained by applying stats delta based on AnalyzeCount. ModifyCount int64 // Total modify count in a table. @@ -432,6 +436,29 @@ func (coll *HistColl) GetAnalyzeRowCount() float64 { return -1 } +// GetScaledRealtimeAndModifyCnt scale the RealtimeCount and ModifyCount for some special indexes where the total row +// count is different from the total row count of the table. Currently, only the mv index is this case. +// Because we will use the RealtimeCount and ModifyCount during the estimation for ranges on this index (like the upper +// bound for the out-of-range estimation logic and the IncreaseFactor logic), we can't directly use the RealtimeCount and +// ModifyCount of the table. Instead, we should scale them before using. +// For example, if the table analyze row count is 1000 and realtime row count is 1500, and the mv index total count is 5000, +// when calculating the IncreaseFactor, it should be 1500/1000 = 1.5 for normal columns/indexes, and we should use the +// same 1.5 for mv index. But obviously, use 1500/5000 would be wrong, the correct calculation should be 7500/5000 = 1.5. +// So we add this function to get this 7500. +func (coll *HistColl) GetScaledRealtimeAndModifyCnt(idxStats *Index) (realtimeCnt, modifyCnt int64) { + // In theory, we can apply this scale logic on all indexes. But currently, we only apply it on the mv index to avoid + // any unexpected changes caused by factors like precision difference. + if idxStats == nil || idxStats.Info == nil || !idxStats.Info.MVIndex || !idxStats.IsFullLoad() { + return coll.RealtimeCount, coll.ModifyCount + } + analyzeRowCount := coll.GetAnalyzeRowCount() + if analyzeRowCount <= 0 { + return coll.RealtimeCount, coll.ModifyCount + } + scale := idxStats.TotalRowCount() / analyzeRowCount + return int64(float64(coll.RealtimeCount) * scale), int64(float64(coll.ModifyCount) * scale) +} + // GetStatsHealthy calculates stats healthy if the table stats is not pseudo. // If the table stats is pseudo, it returns 0, false, otherwise it returns stats healthy, true. func (t *Table) GetStatsHealthy() (int64, bool) { @@ -568,6 +595,7 @@ func (coll *HistColl) GenerateHistCollFromColumnInfo(tblInfo *model.TableInfo, c newIdxHistMap := make(map[int64]*Index) idx2Columns := make(map[int64][]int64) colID2IdxIDs := make(map[int64][]int64) + mvIdx2Columns := make(map[int64][]*expression.Column) for id, idxHist := range coll.Indices { idxInfo := idxID2idxInfo[id] if idxInfo == nil { @@ -588,6 +616,12 @@ func (coll *HistColl) GenerateHistCollFromColumnInfo(tblInfo *model.TableInfo, c colID2IdxIDs[ids[0]] = append(colID2IdxIDs[ids[0]], idxHist.ID) newIdxHistMap[idxHist.ID] = idxHist idx2Columns[idxHist.ID] = ids + if idxInfo.MVIndex { + cols, ok := PrepareCols4MVIndex(tblInfo, idxInfo, columns) + if ok { + mvIdx2Columns[id] = cols + } + } } for _, idxIDs := range colID2IdxIDs { slices.Sort(idxIDs) @@ -602,6 +636,7 @@ func (coll *HistColl) GenerateHistCollFromColumnInfo(tblInfo *model.TableInfo, c Indices: newIdxHistMap, ColID2IdxIDs: colID2IdxIDs, Idx2ColumnIDs: idx2Columns, + MVIdx2Columns: mvIdx2Columns, } return newColl } @@ -683,3 +718,12 @@ func CheckAnalyzeVerOnTable(tbl *Table, version *int) bool { // This table has no statistics yet. We can directly return true. return true } + +// PrepareCols4MVIndex helps to identify the columns of an MV index. We need this information for estimation. +// This logic is shared between the estimation logic and the access path generation logic. We'd like to put the mv index +// related functions together in the planner/core package. So we use this trick here to avoid the import cycle. +var PrepareCols4MVIndex func( + tableInfo *model.TableInfo, + mvIndex *model.IndexInfo, + tblCols []*expression.Column, +) (idxCols []*expression.Column, ok bool) diff --git a/pkg/store/copr/batch_coprocessor.go b/pkg/store/copr/batch_coprocessor.go index 739a3c3abd996..6246aa87b6eb9 100644 --- a/pkg/store/copr/batch_coprocessor.go +++ b/pkg/store/copr/batch_coprocessor.go @@ -655,7 +655,6 @@ func buildBatchCopTasksConsistentHash( fetchTopoStart := time.Now() for { retryNum++ - // todo: use AssureAndGetTopo() after SNS is done. storesStr, err = tiflashcompute.GetGlobalTopoFetcher().FetchAndGetTopo() if err != nil { return nil, err @@ -979,7 +978,7 @@ func buildBatchCopTasksCore(bo *backoff.Backoffer, store *kvStore, rangesForEach regionIDErrMsg += fmt.Sprintf("%d, ", regionIDsInOtherZones[i]) } warningMsg += regionIDErrMsg + "etc" - appendWarning(errors.Errorf(warningMsg)) + appendWarning(errors.NewNoStackErrorf(warningMsg)) } for _, task := range storeTaskMap { @@ -1168,7 +1167,12 @@ func (b *batchCopIterator) recvFromRespCh(ctx context.Context) (resp *batchCopRe case resp, ok = <-b.respChan: return case <-ticker.C: - if atomic.LoadUint32(b.vars.Killed) == 1 { + killed := atomic.LoadUint32(b.vars.Killed) + if killed != 0 { + logutil.Logger(ctx).Info( + "a killed signal is received", + zap.Uint32("signal", killed), + ) resp = &batchCopResponse{err: derr.ErrQueryInterrupted} ok = true return diff --git a/pkg/store/copr/copr_test/main_test.go b/pkg/store/copr/copr_test/main_test.go index 8aa21cc3baed8..3ff792b5c1875 100644 --- a/pkg/store/copr/copr_test/main_test.go +++ b/pkg/store/copr/copr_test/main_test.go @@ -40,8 +40,9 @@ func TestMain(m *testing.M) { opts := []goleak.Option{ // TODO: figure the reason and shorten this list goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), - goleak.IgnoreTopFunction("github.com/tikv/client-go/v2/internal/retry.newBackoffFn.func1"), + goleak.IgnoreTopFunction("github.com/tikv/client-go/v2/config/retry.newBackoffFn.func1"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/v3.waitRetryBackoff"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), diff --git a/pkg/store/copr/coprocessor.go b/pkg/store/copr/coprocessor.go index 233827f762db4..006a76e309abe 100644 --- a/pkg/store/copr/coprocessor.go +++ b/pkg/store/copr/coprocessor.go @@ -937,7 +937,12 @@ func (it *copIterator) recvFromRespCh(ctx context.Context, respCh <-chan *copRes exit = true return case <-ticker.C: - if atomic.LoadUint32(it.vars.Killed) == 1 { + killed := atomic.LoadUint32(it.vars.Killed) + if killed != 0 { + logutil.Logger(ctx).Info( + "a killed signal is received", + zap.Uint32("signal", killed), + ) resp = &copResponse{err: derr.ErrQueryInterrupted} ok = true return @@ -1862,8 +1867,15 @@ func (worker *copIteratorWorker) calculateRemain(ranges *KeyRanges, split *copro // finished checks the flags and finished channel, it tells whether the worker is finished. func (worker *copIteratorWorker) finished() bool { - if worker.vars != nil && worker.vars.Killed != nil && atomic.LoadUint32(worker.vars.Killed) == 1 { - return true + if worker.vars != nil && worker.vars.Killed != nil { + killed := atomic.LoadUint32(worker.vars.Killed) + if killed != 0 { + logutil.BgLogger().Info( + "a killed signal is received in copIteratorWorker", + zap.Uint32("signal", killed), + ) + return true + } } select { case <-worker.finishCh: diff --git a/pkg/store/copr/main_test.go b/pkg/store/copr/main_test.go index 2322592fcc3ac..ad6f13003c504 100644 --- a/pkg/store/copr/main_test.go +++ b/pkg/store/copr/main_test.go @@ -38,6 +38,7 @@ func TestMain(m *testing.M) { opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/pingcap/goleveldb/leveldb.(*DB).mpoolDrain"), goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), diff --git a/pkg/store/driver/error/error_test.go b/pkg/store/driver/error/error_test.go index 32be5d1708973..b6d3a288d7edb 100644 --- a/pkg/store/driver/error/error_test.go +++ b/pkg/store/driver/error/error_test.go @@ -29,6 +29,7 @@ func TestMain(m *testing.M) { testsetup.SetupForCommonTest() opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), diff --git a/pkg/store/driver/main_test.go b/pkg/store/driver/main_test.go index 7f1e5224acaa3..f0624ab827f4e 100644 --- a/pkg/store/driver/main_test.go +++ b/pkg/store/driver/main_test.go @@ -41,9 +41,11 @@ func TestMain(m *testing.M) { tikv.EnableFailpoints() opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), + goleak.IgnoreTopFunction("syscall.Syscall"), } goleak.VerifyTestMain(m, opts...) } diff --git a/pkg/store/driver/tikv_driver.go b/pkg/store/driver/tikv_driver.go index 199661d56f95d..cd8bfa2cec98c 100644 --- a/pkg/store/driver/tikv_driver.go +++ b/pkg/store/driver/tikv_driver.go @@ -215,7 +215,7 @@ func (d TiKVDriver) OpenWithOptions(path string, options ...Option) (resStore kv ) s, err = tikv.NewKVStore(uuid, pdClient, spkv, &injectTraceClient{Client: rpcClient}, - tikv.WithPDHTTPClient(etcdAddrs, pdhttp.WithTLSConfig(tlsConfig), pdhttp.WithMetrics(metrics.PDAPIRequestCounter, metrics.PDAPIExecutionHistogram))) + tikv.WithPDHTTPClient("tikv-driver", etcdAddrs, pdhttp.WithTLSConfig(tlsConfig), pdhttp.WithMetrics(metrics.PDAPIRequestCounter, metrics.PDAPIExecutionHistogram))) if err != nil { return nil, errors.Trace(err) } diff --git a/pkg/store/driver/txn/main_test.go b/pkg/store/driver/txn/main_test.go index 03165ac094bde..73358d37bb505 100644 --- a/pkg/store/driver/txn/main_test.go +++ b/pkg/store/driver/txn/main_test.go @@ -25,6 +25,7 @@ func TestMain(m *testing.M) { testsetup.SetupForCommonTest() opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), diff --git a/pkg/store/driver/txn/txn_driver.go b/pkg/store/driver/txn/txn_driver.go index 4f1c9e075cf04..d335cff79bf20 100644 --- a/pkg/store/driver/txn/txn_driver.go +++ b/pkg/store/driver/txn/txn_driver.go @@ -17,7 +17,6 @@ package txn import ( "bytes" "context" - "sync/atomic" "time" "github.com/pingcap/errors" @@ -54,7 +53,8 @@ type tikvTxn struct { func NewTiKVTxn(txn *tikv.KVTxn) kv.Transaction { txn.SetKVFilter(TiDBKVFilter{}) - entryLimit := atomic.LoadUint64(&kv.TxnEntrySizeLimit) + // init default size limits by config + entryLimit := kv.TxnEntrySizeLimit.Load() totalLimit := kv.TxnTotalSizeLimit.Load() txn.GetUnionStore().SetEntrySizeLimit(entryLimit, totalLimit) @@ -281,6 +281,9 @@ func (txn *tikvTxn) SetOption(opt int, val interface{}) { txn.KVTxn.GetSnapshot().SetLoadBasedReplicaReadThreshold(val.(time.Duration)) case kv.TiKVClientReadTimeout: txn.KVTxn.GetSnapshot().SetKVReadTimeout(time.Duration(val.(uint64) * uint64(time.Millisecond))) + case kv.SizeLimits: + limits := val.(kv.TxnSizeLimits) + txn.KVTxn.GetUnionStore().SetEntrySizeLimit(limits.Entry, limits.Total) } } diff --git a/pkg/store/gcworker/BUILD.bazel b/pkg/store/gcworker/BUILD.bazel index 25f5b2d2e7134..9d434c74b72d5 100644 --- a/pkg/store/gcworker/BUILD.bazel +++ b/pkg/store/gcworker/BUILD.bazel @@ -34,7 +34,6 @@ go_library( "@com_github_tikv_client_go_v2//tikv", "@com_github_tikv_client_go_v2//tikvrpc", "@com_github_tikv_client_go_v2//txnkv/rangetask", - "@com_github_tikv_client_go_v2//txnkv/txnlock", "@com_github_tikv_client_go_v2//util", "@com_github_tikv_pd_client//:client", "@org_uber_go_zap//:zap", @@ -51,7 +50,7 @@ go_test( embed = [":gcworker"], flaky = True, race = "on", - shard_count = 29, + shard_count = 25, deps = [ "//pkg/ddl/placement", "//pkg/ddl/util", diff --git a/pkg/store/gcworker/gc_worker.go b/pkg/store/gcworker/gc_worker.go index 97ccd85bb1a92..f7030a6220c0b 100644 --- a/pkg/store/gcworker/gc_worker.go +++ b/pkg/store/gcworker/gc_worker.go @@ -16,14 +16,12 @@ package gcworker import ( "bytes" - "container/heap" "context" "encoding/hex" "encoding/json" "fmt" "math" "os" - "slices" "strconv" "strings" "sync" @@ -57,7 +55,6 @@ import ( "github.com/tikv/client-go/v2/tikv" "github.com/tikv/client-go/v2/tikvrpc" "github.com/tikv/client-go/v2/txnkv/rangetask" - "github.com/tikv/client-go/v2/txnkv/txnlock" tikvutil "github.com/tikv/client-go/v2/util" pd "github.com/tikv/pd/client" "go.uber.org/zap" @@ -157,10 +154,7 @@ const ( gcModeDistributed = "distributed" gcModeDefault = gcModeDistributed - gcScanLockModeKey = "tikv_gc_scan_lock_mode" - gcScanLockModeLegacy = "legacy" - gcScanLockModePhysical = "physical" - gcScanLockModeDefault = gcScanLockModeLegacy + gcScanLockModeKey = "tikv_gc_scan_lock_mode" gcAutoConcurrencyKey = "tikv_gc_auto_concurrency" gcDefaultAutoConcurrency = true @@ -189,12 +183,11 @@ var gcVariableComments = map[string]string{ gcEnableKey: "Current GC enable status", gcModeKey: "Mode of GC, \"central\" or \"distributed\"", gcAutoConcurrencyKey: "Let TiDB pick the concurrency automatically. If set false, tikv_gc_concurrency will be used", - gcScanLockModeKey: "Mode of scanning locks, \"physical\" or \"legacy\"", + gcScanLockModeKey: "Mode of scanning locks, \"physical\" or \"legacy\".(Deprecated)", } const ( unsafeDestroyRangeTimeout = 5 * time.Minute - accessLockObserverTimeout = 10 * time.Second gcTimeout = 5 * time.Minute ) @@ -745,11 +738,8 @@ func (w *GCWorker) runGCJob(ctx context.Context, safePoint uint64, concurrency i failpoint.Return(errors.New("mock failure of runGCJoB")) }) metrics.GCWorkerCounter.WithLabelValues("run_job").Inc() - usePhysical, err := w.checkUsePhysicalScanLock() - if err != nil { - return errors.Trace(err) - } - _, err = w.resolveLocks(ctx, safePoint, concurrency, usePhysical) + + err := w.resolveLocks(ctx, safePoint, concurrency) if err != nil { logutil.Logger(ctx).Error("resolve locks returns an error", zap.String("category", "gc worker"), zap.String("uuid", w.uuid), @@ -1128,49 +1118,7 @@ func (w *GCWorker) checkUseDistributedGC() bool { return true } -func (w *GCWorker) checkUsePhysicalScanLock() (bool, error) { - str, err := w.loadValueFromSysTable(gcScanLockModeKey) - if err != nil { - return false, errors.Trace(err) - } - if str == "" { - err = w.saveValueToSysTable(gcScanLockModeKey, gcScanLockModeDefault) - if err != nil { - return false, errors.Trace(err) - } - str = gcScanLockModeDefault - } - if strings.EqualFold(str, gcScanLockModePhysical) { - return true, nil - } - if strings.EqualFold(str, gcScanLockModeLegacy) { - return false, nil - } - logutil.BgLogger().Warn("legacy scan lock mode will be used", zap.String("category", "gc worker"), - zap.String("invalid scan lock mode", str)) - return false, nil -} - -func (w *GCWorker) resolveLocks(ctx context.Context, safePoint uint64, concurrency int, usePhysical bool) (bool, error) { - if !usePhysical { - return false, w.legacyResolveLocks(ctx, safePoint, concurrency) - } - - // First try resolve locks with physical scan - err := w.resolveLocksPhysical(ctx, safePoint) - if err == nil { - return true, nil - } - - logutil.Logger(ctx).Error("resolve locks with physical scan failed, trying fallback to legacy resolve lock", zap.String("category", "gc worker"), - zap.String("uuid", w.uuid), - zap.Uint64("safePoint", safePoint), - zap.Error(err)) - - return false, w.legacyResolveLocks(ctx, safePoint, concurrency) -} - -func (w *GCWorker) legacyResolveLocks( +func (w *GCWorker) resolveLocks( ctx context.Context, safePoint uint64, concurrency int, @@ -1209,340 +1157,6 @@ func (w *GCWorker) legacyResolveLocks( return nil } -// resolveLocksPhysical uses TiKV's `PhysicalScanLock` to scan stale locks in the cluster and resolve them. It tries to -// ensure no lock whose ts <= safePoint is left. -func (w *GCWorker) resolveLocksPhysical(ctx context.Context, safePoint uint64) error { - metrics.GCWorkerCounter.WithLabelValues("resolve_locks_physical").Inc() - logutil.Logger(ctx).Info("start resolve locks with physical scan locks", zap.String("category", "gc worker"), - zap.String("uuid", w.uuid), - zap.Uint64("safePoint", safePoint)) - startTime := time.Now() - - registeredStores := make(map[uint64]*metapb.Store) - defer w.removeLockObservers(ctx, safePoint, registeredStores) - - dirtyStores, err := w.getStoresMapForGC(ctx) - if err != nil { - return errors.Trace(err) - } - - for retry := 0; retry < 3; retry++ { - err = w.registerLockObservers(ctx, safePoint, dirtyStores) - if err != nil { - return errors.Trace(err) - } - for id, store := range dirtyStores { - registeredStores[id] = store - } - - resolvedStores, err := w.physicalScanAndResolveLocks(ctx, safePoint, dirtyStores) - if err != nil { - return errors.Trace(err) - } - - failpoint.Inject("beforeCheckLockObservers", func() {}) - - stores, err := w.getStoresMapForGC(ctx) - if err != nil { - return errors.Trace(err) - } - - checkedStores, err := w.checkLockObservers(ctx, safePoint, stores) - if err != nil { - return errors.Trace(err) - } - - for store := range stores { - if _, ok := checkedStores[store]; ok { - // The store is resolved and checked. - if _, ok := resolvedStores[store]; ok { - delete(stores, store) - } - // The store is checked and has been resolved before. - // If the store is checked and not resolved, we can retry to resolve it again, so leave it in dirtyStores. - if _, ok := dirtyStores[store]; !ok { - delete(stores, store) - } - } else if _, ok := registeredStores[store]; ok { - // The store has been registered and it's dirty due to too many collected locks. Fall back to legacy mode. - // We can't remove the lock observer from the store and retry the whole procedure because if the store - // receives duplicated remove and register requests during resolving locks, the store will be cleaned - // when checking but the lock observer drops some locks. It may results in missing locks. - return errors.Errorf("store %v is dirty", store) - } - } - dirtyStores = stores - - // If there are still dirty stores, continue the loop to clean them again. - // Only dirty stores will be scanned in the next loop. - if len(dirtyStores) == 0 { - break - } - } - - if len(dirtyStores) != 0 { - return errors.Errorf("still has %d dirty stores after physical resolve locks", len(dirtyStores)) - } - - logutil.Logger(ctx).Info("finish resolve locks with physical scan locks", zap.String("category", "gc worker"), - zap.String("uuid", w.uuid), - zap.Uint64("safePoint", safePoint), - zap.Duration("takes", time.Since(startTime))) - metrics.GCHistogram.WithLabelValues("resolve_locks").Observe(time.Since(startTime).Seconds()) - return nil -} - -func (w *GCWorker) registerLockObservers(ctx context.Context, safePoint uint64, stores map[uint64]*metapb.Store) error { - logutil.Logger(ctx).Info("registering lock observers to tikv", zap.String("category", "gc worker"), - zap.String("uuid", w.uuid), - zap.Uint64("safePoint", safePoint)) - - req := tikvrpc.NewRequest(tikvrpc.CmdRegisterLockObserver, &kvrpcpb.RegisterLockObserverRequest{ - MaxTs: safePoint, - }) - - for _, store := range stores { - address := store.Address - - resp, err := w.tikvStore.GetTiKVClient().SendRequest(ctx, address, req, accessLockObserverTimeout) - if err != nil { - return errors.Trace(err) - } - if resp.Resp == nil { - return errors.Trace(tikverr.ErrBodyMissing) - } - errStr := resp.Resp.(*kvrpcpb.RegisterLockObserverResponse).Error - if len(errStr) > 0 { - return errors.Errorf("register lock observer on store %v returns error: %v", store.Id, errStr) - } - } - - return nil -} - -// checkLockObservers checks the state of each store's lock observer. If any lock collected by the observers, resolve -// them. Returns ids of clean stores. -func (w *GCWorker) checkLockObservers(ctx context.Context, safePoint uint64, stores map[uint64]*metapb.Store) (map[uint64]interface{}, error) { - logutil.Logger(ctx).Info("checking lock observers", zap.String("category", "gc worker"), - zap.String("uuid", w.uuid), - zap.Uint64("safePoint", safePoint)) - - req := tikvrpc.NewRequest(tikvrpc.CmdCheckLockObserver, &kvrpcpb.CheckLockObserverRequest{ - MaxTs: safePoint, - }) - cleanStores := make(map[uint64]interface{}, len(stores)) - - logError := func(store *metapb.Store, err error) { - logutil.Logger(ctx).Error("failed to check lock observer for store", zap.String("category", "gc worker"), - zap.String("uuid", w.uuid), - zap.Any("store", store), - zap.Error(err)) - } - - // When error occurs, this function doesn't fail immediately, but continues without adding the failed store to - // cleanStores set. - for _, store := range stores { - address := store.Address - - resp, err := w.tikvStore.GetTiKVClient().SendRequest(ctx, address, req, accessLockObserverTimeout) - if err != nil { - logError(store, err) - continue - } - if resp.Resp == nil { - logError(store, tikverr.ErrBodyMissing) - continue - } - respInner := resp.Resp.(*kvrpcpb.CheckLockObserverResponse) - if len(respInner.Error) > 0 { - err = errors.Errorf("check lock observer on store %v returns error: %v", store.Id, respInner.Error) - logError(store, err) - continue - } - - // No need to resolve observed locks on uncleaned stores. - if !respInner.IsClean { - logutil.Logger(ctx).Warn("check lock observer: store is not clean", zap.String("category", "gc worker"), - zap.String("uuid", w.uuid), - zap.Any("store", store)) - continue - } - - if len(respInner.Locks) > 0 { - // Resolve the observed locks. - locks := make([]*txnlock.Lock, len(respInner.Locks)) - for i, lockInfo := range respInner.Locks { - locks[i] = txnlock.NewLock(lockInfo) - } - slices.SortFunc(locks, func(i, j *txnlock.Lock) int { - return bytes.Compare(i.Key, j.Key) - }) - err = w.resolveLocksAcrossRegions(ctx, locks) - - if err != nil { - err = errors.Errorf("check lock observer on store %v returns error: %v", store.Id, respInner.Error) - logError(store, err) - continue - } - } - cleanStores[store.Id] = nil - } - - return cleanStores, nil -} - -func (w *GCWorker) removeLockObservers(ctx context.Context, safePoint uint64, stores map[uint64]*metapb.Store) { - logutil.Logger(ctx).Info("removing lock observers", zap.String("category", "gc worker"), - zap.String("uuid", w.uuid), - zap.Uint64("safePoint", safePoint)) - - req := tikvrpc.NewRequest(tikvrpc.CmdRemoveLockObserver, &kvrpcpb.RemoveLockObserverRequest{ - MaxTs: safePoint, - }) - - logError := func(store *metapb.Store, err error) { - logutil.Logger(ctx).Warn("failed to remove lock observer from store", zap.String("category", "gc worker"), - zap.String("uuid", w.uuid), - zap.Any("store", store), - zap.Error(err)) - } - - for _, store := range stores { - address := store.Address - - resp, err := w.tikvStore.GetTiKVClient().SendRequest(ctx, address, req, accessLockObserverTimeout) - if err != nil { - logError(store, err) - continue - } - if resp.Resp == nil { - logError(store, tikverr.ErrBodyMissing) - continue - } - errStr := resp.Resp.(*kvrpcpb.RemoveLockObserverResponse).Error - if len(errStr) > 0 { - err = errors.Errorf("remove lock observer on store %v returns error: %v", store.Id, errStr) - logError(store, err) - } - } -} - -// physicalScanAndResolveLocks performs physical scan lock and resolves these locks. Returns successful stores -func (w *GCWorker) physicalScanAndResolveLocks(ctx context.Context, safePoint uint64, stores map[uint64]*metapb.Store) (map[uint64]interface{}, error) { - ctx, cancel := context.WithCancel(ctx) - // Cancel all spawned goroutines for lock scanning and resolving. - defer cancel() - - scanner := newMergeLockScanner(safePoint, w.tikvStore.GetTiKVClient(), stores) - err := scanner.Start(ctx) - if err != nil { - return nil, errors.Trace(err) - } - - taskCh := make(chan []*txnlock.Lock, len(stores)) - errCh := make(chan error, len(stores)) - - wg := &sync.WaitGroup{} - for range stores { - wg.Add(1) - go func() { - defer wg.Done() - for { - select { - case locks, ok := <-taskCh: - if !ok { - // All locks have been resolved. - return - } - err := w.resolveLocksAcrossRegions(ctx, locks) - if err != nil { - logutil.Logger(ctx).Error("resolve locks failed", zap.Error(err)) - errCh <- err - } - case <-ctx.Done(): - return - } - } - }() - } - - for { - locks := scanner.NextBatch(128) - if len(locks) == 0 { - break - } - - select { - case taskCh <- locks: - case err := <-errCh: - return nil, errors.Trace(err) - case <-ctx.Done(): - return nil, ctx.Err() - } - } - - close(taskCh) - // Wait for all locks resolved. - wg.Wait() - - select { - case err := <-errCh: - return nil, errors.Trace(err) - default: - } - - return scanner.GetSucceededStores(), nil -} - -func (w *GCWorker) resolveLocksAcrossRegions(ctx context.Context, locks []*txnlock.Lock) error { - failpoint.Inject("resolveLocksAcrossRegionsErr", func(v failpoint.Value) { - ms := v.(int) - time.Sleep(time.Duration(ms) * time.Millisecond) - failpoint.Return(errors.New("injectedError")) - }) - - bo := tikv.NewGcResolveLockMaxBackoffer(ctx) - - for { - if len(locks) == 0 { - break - } - - key := locks[0].Key - loc, err := w.tikvStore.GetRegionCache().LocateKey(bo, key) - if err != nil { - return errors.Trace(err) - } - - locksInRegion := make([]*txnlock.Lock, 0) - - for _, lock := range locks { - if !loc.Contains(lock.Key) { - break - } - locksInRegion = append(locksInRegion, lock) - } - - ok, err := w.tikvStore.GetLockResolver().BatchResolveLocks(bo, locksInRegion, loc.Region) - if err != nil { - return errors.Trace(err) - } - if !ok { - err = bo.Backoff(tikv.BoTxnLock(), errors.Errorf("remain locks: %d", len(locks))) - if err != nil { - return errors.Trace(err) - } - continue - } - - // Recreate backoffer for next region - bo = tikv.NewGcResolveLockMaxBackoffer(ctx) - locks = locks[len(locksInRegion):] - } - - return nil -} - const gcOneRegionMaxBackoff = 20000 func (w *GCWorker) uploadSafePointToPD(ctx context.Context, safePoint uint64) error { @@ -2052,7 +1666,7 @@ func RunGCJob(ctx context.Context, regionLockResolver tikv.RegionLockResolver, s return errors.Trace(err) } - _, err = gcWorker.resolveLocks(ctx, safePoint, concurrency, false) + err = gcWorker.resolveLocks(ctx, safePoint, concurrency) if err != nil { return errors.Trace(err) } @@ -2085,8 +1699,7 @@ func RunDistributedGCJob(ctx context.Context, regionLockResolver tikv.RegionLock if err != nil { return errors.Trace(err) } - - _, err = gcWorker.resolveLocks(ctx, safePoint, concurrency, false) + err = gcWorker.resolveLocks(ctx, safePoint, concurrency) if err != nil { return errors.Trace(err) } @@ -2106,16 +1719,16 @@ func RunDistributedGCJob(ctx context.Context, regionLockResolver tikv.RegionLock return nil } -// RunResolveLocks resolves all locks before the safePoint and returns whether the physical scan mode is used. +// RunResolveLocks resolves all locks before the safePoint. // It is exported only for test, do not use it in the production environment. -func RunResolveLocks(ctx context.Context, s tikv.Storage, pd pd.Client, safePoint uint64, identifier string, concurrency int, usePhysical bool) (bool, error) { +func RunResolveLocks(ctx context.Context, s tikv.Storage, pd pd.Client, safePoint uint64, identifier string, concurrency int) error { gcWorker := &GCWorker{ tikvStore: s, uuid: identifier, pdClient: pd, regionLockResolver: tikv.NewRegionLockResolver("test-resolver", s), } - return gcWorker.resolveLocks(ctx, safePoint, concurrency, usePhysical) + return gcWorker.resolveLocks(ctx, safePoint, concurrency) } // MockGCWorker is for test. @@ -2152,220 +1765,3 @@ func (w *MockGCWorker) DeleteRanges(ctx context.Context, safePoint uint64) error ctx = kv.WithInternalSourceType(ctx, kv.InternalTxnGC) return w.worker.deleteRanges(ctx, safePoint, 1) } - -const scanLockResultBufferSize = 128 - -// mergeLockScanner is used to scan specified stores by using PhysicalScanLock. For multiple stores, the scanner will -// merge the scan results of each store, and remove the duplicating items from different stores. -type mergeLockScanner struct { - safePoint uint64 - client tikv.Client - stores map[uint64]*metapb.Store - receivers mergeReceiver - currentLock *txnlock.Lock - scanLockLimit uint32 -} - -type receiver struct { - Ch <-chan scanLockResult - StoreID uint64 - NextLock *txnlock.Lock - Err error -} - -func (r *receiver) PeekNextLock() *txnlock.Lock { - if r.NextLock != nil { - return r.NextLock - } - result, ok := <-r.Ch - if !ok { - return nil - } - r.Err = result.Err - r.NextLock = result.Lock - return r.NextLock -} - -func (r *receiver) TakeNextLock() *txnlock.Lock { - lock := r.PeekNextLock() - r.NextLock = nil - return lock -} - -// mergeReceiver is a list of receivers -type mergeReceiver []*receiver - -func (r mergeReceiver) Len() int { - return len(r) -} - -func (r mergeReceiver) Less(i, j int) bool { - lhs := r[i].PeekNextLock() - rhs := r[j].PeekNextLock() - // nil which means the receiver has finished should be the greatest one. - if lhs == nil { - // lhs >= rhs - return false - } - if rhs == nil { - // lhs != nil, so lhs < rhs - return true - } - ord := bytes.Compare(lhs.Key, rhs.Key) - return ord < 0 || (ord == 0 && lhs.TxnID < rhs.TxnID) -} - -func (r mergeReceiver) Swap(i, j int) { - r[i], r[j] = r[j], r[i] -} - -func (r *mergeReceiver) Push(x interface{}) { - *r = append(*r, x.(*receiver)) -} - -func (r *mergeReceiver) Pop() interface{} { - receivers := *r - res := receivers[len(receivers)-1] - *r = receivers[:len(receivers)-1] - return res -} - -type scanLockResult struct { - Lock *txnlock.Lock - Err error -} - -func newMergeLockScanner(safePoint uint64, client tikv.Client, stores map[uint64]*metapb.Store) *mergeLockScanner { - scanner := &mergeLockScanner{ - safePoint: safePoint, - client: client, - stores: stores, - scanLockLimit: tikv.GCScanLockLimit, - } - failpoint.Inject("lowPhysicalScanLockLimit", func() { - scanner.scanLockLimit = 3 - }) - return scanner -} - -// Start initializes the scanner and enables retrieving items from the scanner. -func (s *mergeLockScanner) Start(ctx context.Context) error { - receivers := make([]*receiver, 0, len(s.stores)) - - for storeID, store := range s.stores { - ch := make(chan scanLockResult, scanLockResultBufferSize) - store1 := store - go func() { - defer close(ch) - - err := s.physicalScanLocksForStore(ctx, s.safePoint, store1, ch) - if err != nil { - logutil.Logger(ctx).Error("physical scan lock for store encountered error", - zap.Uint64("safePoint", s.safePoint), - zap.Any("store", store1), - zap.Error(err)) - - select { - case ch <- scanLockResult{Err: err}: - case <-ctx.Done(): - } - } - }() - receivers = append(receivers, &receiver{Ch: ch, StoreID: storeID}) - } - - s.startWithReceivers(receivers) - - return nil -} - -func (s *mergeLockScanner) startWithReceivers(receivers []*receiver) { - s.receivers = receivers - heap.Init(&s.receivers) -} - -func (s *mergeLockScanner) Next() *txnlock.Lock { - for { - nextReceiver := s.receivers[0] - nextLock := nextReceiver.TakeNextLock() - heap.Fix(&s.receivers, 0) - - if nextLock == nil { - return nil - } - if s.currentLock == nil || !bytes.Equal(s.currentLock.Key, nextLock.Key) || s.currentLock.TxnID != nextLock.TxnID { - s.currentLock = nextLock - return nextLock - } - } -} - -func (s *mergeLockScanner) NextBatch(batchSize int) []*txnlock.Lock { - result := make([]*txnlock.Lock, 0, batchSize) - for len(result) < batchSize { - lock := s.Next() - if lock == nil { - break - } - result = append(result, lock) - } - return result -} - -// GetSucceededStores gets a set of successfully scanned stores. Only call this after finishing scanning all locks. -func (s *mergeLockScanner) GetSucceededStores() map[uint64]interface{} { - stores := make(map[uint64]interface{}, len(s.receivers)) - for _, receiver := range s.receivers { - if receiver.Err == nil { - stores[receiver.StoreID] = nil - } - } - return stores -} - -func (s *mergeLockScanner) physicalScanLocksForStore(ctx context.Context, safePoint uint64, store *metapb.Store, lockCh chan<- scanLockResult) error { - address := store.Address - req := tikvrpc.NewRequest(tikvrpc.CmdPhysicalScanLock, &kvrpcpb.PhysicalScanLockRequest{ - MaxTs: safePoint, - Limit: s.scanLockLimit, - }) - - nextKey := make([]byte, 0) - - for { - req.PhysicalScanLock().StartKey = nextKey - - response, err := s.client.SendRequest(ctx, address, req, tikv.ReadTimeoutMedium) - if err != nil { - return errors.Trace(err) - } - if response.Resp == nil { - return errors.Trace(tikverr.ErrBodyMissing) - } - resp := response.Resp.(*kvrpcpb.PhysicalScanLockResponse) - if len(resp.Error) > 0 { - return errors.Errorf("physical scan lock received error from store: %v", resp.Error) - } - - if len(resp.Locks) == 0 { - break - } - - nextKey = resp.Locks[len(resp.Locks)-1].Key - nextKey = append(nextKey, 0) - - for _, lockInfo := range resp.Locks { - select { - case lockCh <- scanLockResult{Lock: txnlock.NewLock(lockInfo)}: - case <-ctx.Done(): - return ctx.Err() - } - } - - if len(resp.Locks) < int(s.scanLockLimit) { - break - } - } - - return nil -} diff --git a/pkg/store/gcworker/gc_worker_test.go b/pkg/store/gcworker/gc_worker_test.go index 99199bfb7e57a..2e07bcd3ff817 100644 --- a/pkg/store/gcworker/gc_worker_test.go +++ b/pkg/store/gcworker/gc_worker_test.go @@ -21,8 +21,6 @@ import ( "math" "sort" "strconv" - "sync" - "sync/atomic" "testing" "time" @@ -597,38 +595,6 @@ func TestCheckGCMode(t *testing.T) { require.True(t, useDistributedGC) } -func TestCheckScanLockMode(t *testing.T) { - s := createGCWorkerSuite(t) - - usePhysical, err := s.gcWorker.checkUsePhysicalScanLock() - require.NoError(t, err) - require.False(t, usePhysical) - require.Equal(t, usePhysical, gcScanLockModeDefault == gcScanLockModePhysical) - - // Now the row must be set to the default value. - str, err := s.gcWorker.loadValueFromSysTable(gcScanLockModeKey) - require.NoError(t, err) - require.Equal(t, gcScanLockModeDefault, str) - - err = s.gcWorker.saveValueToSysTable(gcScanLockModeKey, gcScanLockModePhysical) - require.NoError(t, err) - usePhysical, err = s.gcWorker.checkUsePhysicalScanLock() - require.NoError(t, err) - require.True(t, usePhysical) - - err = s.gcWorker.saveValueToSysTable(gcScanLockModeKey, gcScanLockModeLegacy) - require.NoError(t, err) - usePhysical, err = s.gcWorker.checkUsePhysicalScanLock() - require.NoError(t, err) - require.False(t, usePhysical) - - err = s.gcWorker.saveValueToSysTable(gcScanLockModeKey, "invalid_mode") - require.NoError(t, err) - usePhysical, err = s.gcWorker.checkUsePhysicalScanLock() - require.NoError(t, err) - require.False(t, usePhysical) -} - func TestNeedsGCOperationForStore(t *testing.T) { newStore := func(state metapb.StoreState, hasEngineLabel bool, engineLabel string) *metapb.Store { store := &metapb.Store{} @@ -1403,499 +1369,6 @@ func (s *mockGCWorkerSuite) loadEtcdSafePoint(t *testing.T) uint64 { return res } -func makeMergedChannel(t *testing.T, count int) (*mergeLockScanner, []chan scanLockResult, []uint64, <-chan []*txnlock.Lock) { - scanner := &mergeLockScanner{} - channels := make([]chan scanLockResult, 0, count) - receivers := make([]*receiver, 0, count) - storeIDs := make([]uint64, 0, count) - - for i := 0; i < count; i++ { - ch := make(chan scanLockResult, 10) - receiver := &receiver{ - Ch: ch, - StoreID: uint64(i), - } - - channels = append(channels, ch) - receivers = append(receivers, receiver) - storeIDs = append(storeIDs, uint64(i)) - } - - resultCh := make(chan []*txnlock.Lock) - // Initializing and getting result from scanner is blocking operations. Collect the result in a separated thread. - go func() { - scanner.startWithReceivers(receivers) - // Get a batch of a enough-large size to get all results. - result := scanner.NextBatch(1000) - require.Less(t, len(result), 1000) - resultCh <- result - }() - - return scanner, channels, storeIDs, resultCh -} - -func (s *mockGCWorkerSuite) makeMergedMockClient(t *testing.T, count int) (*mergeLockScanner, []chan scanLockResult, []uint64, <-chan []*txnlock.Lock) { - stores := s.cluster.GetAllStores() - require.Len(t, stores, count) - - storeIDs := make([]uint64, count) - for i := 0; i < count; i++ { - storeIDs[i] = stores[i].Id - } - - const scanLockLimit = 3 - - storesMap, err := s.gcWorker.getStoresMapForGC(gcContext()) - require.NoError(t, err) - scanner := newMergeLockScanner(100000, s.client, storesMap) - scanner.scanLockLimit = scanLockLimit - channels := make([]chan scanLockResult, 0, len(stores)) - - for range stores { - ch := make(chan scanLockResult, 10) - - channels = append(channels, ch) - } - - s.client.physicalScanLockHandler = func(addr string, req *tikvrpc.Request) (*tikvrpc.Response, error) { - for i, store := range stores { - if store.Address == addr { - locks := make([]*kvrpcpb.LockInfo, 0, 3) - errStr := "" - for j := 0; j < scanLockLimit; j++ { - res, ok := <-channels[i] - if !ok { - break - } - if res.Err != nil { - errStr = res.Err.Error() - locks = nil - break - } - lockInfo := &kvrpcpb.LockInfo{Key: res.Lock.Key, LockVersion: res.Lock.TxnID} - locks = append(locks, lockInfo) - } - - return &tikvrpc.Response{ - Resp: &kvrpcpb.PhysicalScanLockResponse{ - Locks: locks, - Error: errStr, - }, - }, nil - } - } - return nil, errors.Errorf("No store in the cluster has address %v", addr) - } - - resultCh := make(chan []*txnlock.Lock) - // Initializing and getting result from scanner is blocking operations. Collect the result in a separated thread. - go func() { - err := scanner.Start(gcContext()) - require.NoError(t, err) - // Get a batch of a enough-large size to get all results. - result := scanner.NextBatch(1000) - require.Less(t, len(result), 1000) - resultCh <- result - }() - - return scanner, channels, storeIDs, resultCh -} - -func TestMergeLockScanner(t *testing.T) { - s := createGCWorkerSuite(t) - - // Shortcuts to make the following test code simpler - - // Get stores by index, and get their store IDs. - makeIDSet := func(storeIDs []uint64, indices ...uint64) map[uint64]interface{} { - res := make(map[uint64]interface{}) - for _, i := range indices { - res[storeIDs[i]] = nil - } - return res - } - - makeLock := func(key string, ts uint64) *txnlock.Lock { - return &txnlock.Lock{Key: []byte(key), TxnID: ts} - } - - makeLockList := func(locks ...*txnlock.Lock) []*txnlock.Lock { - res := make([]*txnlock.Lock, 0, len(locks)) - res = append(res, locks...) - return res - } - - makeLockListByKey := func(keys ...string) []*txnlock.Lock { - res := make([]*txnlock.Lock, 0, len(keys)) - for _, key := range keys { - res = append(res, makeLock(key, 0)) - } - return res - } - - sendLocks := func(ch chan<- scanLockResult, locks ...*txnlock.Lock) { - for _, lock := range locks { - ch <- scanLockResult{Lock: lock} - } - } - - sendLocksByKey := func(ch chan<- scanLockResult, keys ...string) []*txnlock.Lock { - locks := make([]*txnlock.Lock, 0, len(keys)) - for _, key := range keys { - locks = append(locks, makeLock(key, 0)) - } - sendLocks(ch, locks...) - return locks - } - - sendErr := func(ch chan<- scanLockResult) { - ch <- scanLockResult{Err: errors.New("error")} - } - - // No lock. - scanner, sendCh, storeIDs, resCh := makeMergedChannel(t, 1) - close(sendCh[0]) - require.Len(t, <-resCh, 0) - require.Equal(t, makeIDSet(storeIDs, 0), scanner.GetSucceededStores()) - - scanner, sendCh, storeIDs, resCh = makeMergedChannel(t, 1) - locks := sendLocksByKey(sendCh[0], "a", "b", "c") - close(sendCh[0]) - require.Equal(t, locks, <-resCh) - require.Equal(t, makeIDSet(storeIDs, 0), scanner.GetSucceededStores()) - - // Send locks with error - scanner, sendCh, storeIDs, resCh = makeMergedChannel(t, 1) - locks = sendLocksByKey(sendCh[0], "a", "b", "c") - sendErr(sendCh[0]) - close(sendCh[0]) - require.Equal(t, locks, <-resCh) - require.Equal(t, makeIDSet(storeIDs), scanner.GetSucceededStores()) - - // Merge sort locks with different keys. - scanner, sendCh, storeIDs, resCh = makeMergedChannel(t, 2) - locks = sendLocksByKey(sendCh[0], "a", "c", "e") - time.Sleep(time.Millisecond * 100) - locks = append(locks, sendLocksByKey(sendCh[1], "b", "d", "f")...) - close(sendCh[0]) - close(sendCh[1]) - sort.Slice(locks, func(i, j int) bool { - return bytes.Compare(locks[i].Key, locks[j].Key) < 0 - }) - require.Equal(t, locks, <-resCh) - require.Equal(t, makeIDSet(storeIDs, 0, 1), scanner.GetSucceededStores()) - - // Merge sort locks with different timestamps. - scanner, sendCh, storeIDs, resCh = makeMergedChannel(t, 2) - sendLocks(sendCh[0], makeLock("a", 0), makeLock("a", 1)) - time.Sleep(time.Millisecond * 100) - sendLocks(sendCh[1], makeLock("a", 1), makeLock("a", 2), makeLock("b", 0)) - close(sendCh[0]) - close(sendCh[1]) - require.Equal(t, makeLockList(makeLock("a", 0), makeLock("a", 1), makeLock("a", 2), makeLock("b", 0)), <-resCh) - require.Equal(t, makeIDSet(storeIDs, 0, 1), scanner.GetSucceededStores()) - - for _, useMock := range []bool{false, true} { - channel := makeMergedChannel - if useMock { - channel = s.makeMergedMockClient - } - - scanner, sendCh, storeIDs, resCh = channel(t, 3) - sendLocksByKey(sendCh[0], "a", "d", "g", "h") - time.Sleep(time.Millisecond * 100) - sendLocksByKey(sendCh[1], "a", "d", "f", "h") - time.Sleep(time.Millisecond * 100) - sendLocksByKey(sendCh[2], "b", "c", "e", "h") - close(sendCh[0]) - close(sendCh[1]) - close(sendCh[2]) - require.Equal(t, makeLockListByKey("a", "b", "c", "d", "e", "f", "g", "h"), <-resCh) - require.Equal(t, makeIDSet(storeIDs, 0, 1, 2), scanner.GetSucceededStores()) - - scanner, sendCh, storeIDs, resCh = channel(t, 3) - sendLocksByKey(sendCh[0], "a", "d", "g", "h") - time.Sleep(time.Millisecond * 100) - sendLocksByKey(sendCh[1], "a", "d", "f", "h") - time.Sleep(time.Millisecond * 100) - sendLocksByKey(sendCh[2], "b", "c", "e", "h") - sendErr(sendCh[0]) - close(sendCh[0]) - close(sendCh[1]) - close(sendCh[2]) - require.Equal(t, makeLockListByKey("a", "b", "c", "d", "e", "f", "g", "h"), <-resCh) - require.Equal(t, makeIDSet(storeIDs, 1, 2), scanner.GetSucceededStores()) - - scanner, sendCh, storeIDs, resCh = channel(t, 3) - sendLocksByKey(sendCh[0], "a\x00", "a\x00\x00", "b", "b\x00") - sendLocksByKey(sendCh[1], "a", "a\x00\x00", "a\x00\x00\x00", "c") - sendLocksByKey(sendCh[2], "1", "a\x00", "a\x00\x00", "b") - close(sendCh[0]) - close(sendCh[1]) - close(sendCh[2]) - require.Equal(t, makeLockListByKey("1", "a", "a\x00", "a\x00\x00", "a\x00\x00\x00", "b", "b\x00", "c"), <-resCh) - require.Equal(t, makeIDSet(storeIDs, 0, 1, 2), scanner.GetSucceededStores()) - - scanner, sendCh, storeIDs, resCh = channel(t, 3) - sendLocks(sendCh[0], makeLock("a", 0), makeLock("d", 0), makeLock("g", 0), makeLock("h", 0)) - sendLocks(sendCh[1], makeLock("a", 1), makeLock("b", 0), makeLock("c", 0), makeLock("d", 1)) - sendLocks(sendCh[2], makeLock("e", 0), makeLock("g", 1), makeLock("g", 2), makeLock("h", 0)) - close(sendCh[0]) - close(sendCh[1]) - close(sendCh[2]) - locks := makeLockList( - makeLock("a", 0), - makeLock("a", 1), - makeLock("b", 0), - makeLock("c", 0), - makeLock("d", 0), - makeLock("d", 1), - makeLock("e", 0), - makeLock("g", 0), - makeLock("g", 1), - makeLock("g", 2), - makeLock("h", 0)) - require.Equal(t, locks, <-resCh) - require.Equal(t, makeIDSet(storeIDs, 0, 1, 2), scanner.GetSucceededStores()) - } -} - -func TestResolveLocksPhysical(t *testing.T) { - s := createGCWorkerSuite(t) - - alwaysSucceedHandler := func(addr string, req *tikvrpc.Request) (*tikvrpc.Response, error) { - switch req.Type { - case tikvrpc.CmdPhysicalScanLock: - return &tikvrpc.Response{Resp: &kvrpcpb.PhysicalScanLockResponse{Locks: nil, Error: ""}}, nil - case tikvrpc.CmdRegisterLockObserver: - return &tikvrpc.Response{Resp: &kvrpcpb.RegisterLockObserverResponse{Error: ""}}, nil - case tikvrpc.CmdCheckLockObserver: - return &tikvrpc.Response{Resp: &kvrpcpb.CheckLockObserverResponse{Error: "", IsClean: true, Locks: nil}}, nil - case tikvrpc.CmdRemoveLockObserver: - return &tikvrpc.Response{Resp: &kvrpcpb.RemoveLockObserverResponse{Error: ""}}, nil - default: - panic("unreachable") - } - } - alwaysFailHandler := func(addr string, req *tikvrpc.Request) (*tikvrpc.Response, error) { - switch req.Type { - case tikvrpc.CmdPhysicalScanLock: - return &tikvrpc.Response{Resp: &kvrpcpb.PhysicalScanLockResponse{Locks: nil, Error: "error"}}, nil - case tikvrpc.CmdRegisterLockObserver: - return &tikvrpc.Response{Resp: &kvrpcpb.RegisterLockObserverResponse{Error: "error"}}, nil - case tikvrpc.CmdCheckLockObserver: - return &tikvrpc.Response{Resp: &kvrpcpb.CheckLockObserverResponse{Error: "error", IsClean: false, Locks: nil}}, nil - case tikvrpc.CmdRemoveLockObserver: - return &tikvrpc.Response{Resp: &kvrpcpb.RemoveLockObserverResponse{Error: "error"}}, nil - default: - panic("unreachable") - } - } - reset := func() { - s.client.physicalScanLockHandler = alwaysSucceedHandler - s.client.registerLockObserverHandler = alwaysSucceedHandler - s.client.checkLockObserverHandler = alwaysSucceedHandler - s.client.removeLockObserverHandler = alwaysSucceedHandler - } - - ctx := gcContext() - var safePoint uint64 = 10000 - - // No lock - reset() - physicalUsed, err := s.gcWorker.resolveLocks(ctx, safePoint, 3, true) - require.True(t, physicalUsed) - require.NoError(t, err) - - // Should fall back on the legacy mode when fails to register lock observers. - reset() - s.client.registerLockObserverHandler = alwaysFailHandler - physicalUsed, err = s.gcWorker.resolveLocks(ctx, safePoint, 3, true) - require.False(t, physicalUsed) - require.NoError(t, err) - - // Should fall back when fails to resolve locks. - reset() - s.client.physicalScanLockHandler = func(addr string, req *tikvrpc.Request) (*tikvrpc.Response, error) { - locks := []*kvrpcpb.LockInfo{{Key: []byte{0}}} - return &tikvrpc.Response{Resp: &kvrpcpb.PhysicalScanLockResponse{Locks: locks, Error: ""}}, nil - } - require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/store/gcworker/resolveLocksAcrossRegionsErr", "return(100)")) - physicalUsed, err = s.gcWorker.resolveLocks(ctx, safePoint, 3, true) - require.False(t, physicalUsed) - require.NoError(t, err) - require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/store/gcworker/resolveLocksAcrossRegionsErr")) - - // Shouldn't fall back when fails to scan locks less than 3 times. - reset() - var returnError uint32 = 1 - s.client.physicalScanLockHandler = func(addr string, req *tikvrpc.Request) (*tikvrpc.Response, error) { - if atomic.CompareAndSwapUint32(&returnError, 1, 0) { - return alwaysFailHandler(addr, req) - } - return alwaysSucceedHandler(addr, req) - } - physicalUsed, err = s.gcWorker.resolveLocks(ctx, safePoint, 3, true) - require.True(t, physicalUsed) - require.NoError(t, err) - - // Should fall back if reaches retry limit - reset() - s.client.physicalScanLockHandler = alwaysFailHandler - physicalUsed, err = s.gcWorker.resolveLocks(ctx, safePoint, 3, true) - require.False(t, physicalUsed) - require.NoError(t, err) - - // Should fall back when one registered store is dirty. - reset() - s.client.checkLockObserverHandler = func(addr string, req *tikvrpc.Request) (*tikvrpc.Response, error) { - return &tikvrpc.Response{Resp: &kvrpcpb.CheckLockObserverResponse{Error: "", IsClean: false, Locks: nil}}, nil - } - physicalUsed, err = s.gcWorker.resolveLocks(ctx, safePoint, 3, true) - require.False(t, physicalUsed) - require.NoError(t, err) - - // When fails to check lock observer in a store, we assume the store is dirty. - // Should fall back when fails to check lock observers. - reset() - s.client.checkLockObserverHandler = alwaysFailHandler - physicalUsed, err = s.gcWorker.resolveLocks(ctx, safePoint, 3, true) - require.False(t, physicalUsed) - require.NoError(t, err) - - // Shouldn't fall back when the dirty store is newly added. - reset() - var wg sync.WaitGroup - wg.Add(1) - require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/store/gcworker/beforeCheckLockObservers", "pause")) - go func() { - defer wg.Done() - physicalUsed, err := s.gcWorker.resolveLocks(ctx, safePoint, 3, true) - require.True(t, physicalUsed) - require.NoError(t, err) - }() - // Sleep to let the goroutine pause. - time.Sleep(500 * time.Millisecond) - s.cluster.AddStore(100, "store100") - once := true - s.client.checkLockObserverHandler = func(addr string, req *tikvrpc.Request) (*tikvrpc.Response, error) { - // The newly added store returns IsClean=false for the first time. - if addr == "store100" && once { - once = false - return &tikvrpc.Response{Resp: &kvrpcpb.CheckLockObserverResponse{Error: "", IsClean: false, Locks: nil}}, nil - } - return alwaysSucceedHandler(addr, req) - } - require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/store/gcworker/beforeCheckLockObservers")) - wg.Wait() - - // Shouldn't fall back when a store is removed. - reset() - wg.Add(1) - require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/store/gcworker/beforeCheckLockObservers", "pause")) - go func() { - defer wg.Done() - physicalUsed, err := s.gcWorker.resolveLocks(ctx, safePoint, 3, true) - require.True(t, physicalUsed) - require.NoError(t, err) - }() - // Sleep to let the goroutine pause. - time.Sleep(500 * time.Millisecond) - s.cluster.RemoveStore(100) - require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/store/gcworker/beforeCheckLockObservers")) - wg.Wait() - - // Should fall back when a cleaned store becomes dirty. - reset() - wg.Add(1) - require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/store/gcworker/beforeCheckLockObservers", "pause")) - go func() { - defer wg.Done() - physicalUsed, err := s.gcWorker.resolveLocks(ctx, safePoint, 3, true) - require.False(t, physicalUsed) - require.NoError(t, err) - }() - // Sleep to let the goroutine pause. - time.Sleep(500 * time.Millisecond) - store := s.cluster.GetAllStores()[0] - var onceClean uint32 = 1 - s.cluster.AddStore(100, "store100") - var onceDirty uint32 = 1 - s.client.checkLockObserverHandler = func(addr string, req *tikvrpc.Request) (*tikvrpc.Response, error) { - switch addr { - case "store100": - // The newly added store returns IsClean=false for the first time. - if atomic.CompareAndSwapUint32(&onceDirty, 1, 0) { - return &tikvrpc.Response{Resp: &kvrpcpb.CheckLockObserverResponse{Error: "", IsClean: false, Locks: nil}}, nil - } - return alwaysSucceedHandler(addr, req) - case store.Address: - // The store returns IsClean=true for the first time. - if atomic.CompareAndSwapUint32(&onceClean, 1, 0) { - return alwaysSucceedHandler(addr, req) - } - return &tikvrpc.Response{Resp: &kvrpcpb.CheckLockObserverResponse{Error: "", IsClean: false, Locks: nil}}, nil - default: - return alwaysSucceedHandler(addr, req) - } - } - require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/store/gcworker/beforeCheckLockObservers")) - wg.Wait() - - // Shouldn't fall back when fails to remove lock observers. - reset() - s.client.removeLockObserverHandler = alwaysFailHandler - physicalUsed, err = s.gcWorker.resolveLocks(ctx, safePoint, 3, true) - require.True(t, physicalUsed) - require.NoError(t, err) -} - -func TestPhysicalScanLockDeadlock(t *testing.T) { - s := createGCWorkerSuite(t) - - ctx := gcContext() - stores := s.cluster.GetAllStores() - require.Greater(t, len(stores), 1) - - s.client.physicalScanLockHandler = func(addr string, req *tikvrpc.Request) (*tikvrpc.Response, error) { - require.Equal(t, stores[0].Address, addr) - scanReq := req.PhysicalScanLock() - scanLockLimit := int(scanReq.Limit) - locks := make([]*kvrpcpb.LockInfo, 0, scanReq.Limit) - for i := 0; i < scanLockLimit; i++ { - // The order of keys doesn't matter. - locks = append(locks, &kvrpcpb.LockInfo{Key: []byte{byte(i)}}) - } - return &tikvrpc.Response{ - Resp: &kvrpcpb.PhysicalScanLockResponse{ - Locks: locks, - Error: "", - }, - }, nil - } - - // Sleep 1000ms to let the main goroutine block on sending tasks. - // Inject error to the goroutine resolving locks so that the main goroutine will block forever if it doesn't handle channels properly. - require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/store/gcworker/resolveLocksAcrossRegionsErr", "return(1000)")) - defer func() { - require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/store/gcworker/resolveLocksAcrossRegionsErr")) - }() - - done := make(chan interface{}) - go func() { - defer close(done) - storesMap := map[uint64]*metapb.Store{stores[0].Id: stores[0]} - succeeded, err := s.gcWorker.physicalScanAndResolveLocks(ctx, 10000, storesMap) - require.Nil(t, succeeded) - require.EqualError(t, err, "injectedError") - }() - select { - case <-done: - case <-time.After(5 * time.Second): - require.FailNow(t, "physicalScanAndResolveLocks blocks") - } -} - func TestGCPlacementRules(t *testing.T) { s := createGCWorkerSuite(t) diff --git a/pkg/store/gcworker/main_test.go b/pkg/store/gcworker/main_test.go index 56fc39a194aac..d267f55f5fb6c 100644 --- a/pkg/store/gcworker/main_test.go +++ b/pkg/store/gcworker/main_test.go @@ -31,6 +31,7 @@ func TestMain(m *testing.M) { goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("net/http.(*persistConn).writeLoop"), goleak.IgnoreTopFunction("internal/poll.runtime_pollWait"), diff --git a/pkg/store/helper/helper.go b/pkg/store/helper/helper.go index acc65afd5b03e..0205fedeba885 100644 --- a/pkg/store/helper/helper.go +++ b/pkg/store/helper/helper.go @@ -81,6 +81,10 @@ type Storage interface { type Helper struct { Store Storage RegionCache *tikv.RegionCache + // pdHTTPCli is used to send http request to PD. + // This field is lazy initialized in `TryGetPDHTTPClient`, + // and should be tagged with the caller ID before using. + pdHTTPCli pd.Client } // NewHelper gets a Helper from Storage @@ -93,11 +97,15 @@ func NewHelper(store Storage) *Helper { // TryGetPDHTTPClient tries to get a PD HTTP client if it's available. func (h *Helper) TryGetPDHTTPClient() (pd.Client, error) { + if h.pdHTTPCli != nil { + return h.pdHTTPCli, nil + } cli := h.Store.GetPDHTTPClient() if cli == nil { return nil, errors.New("pd http client unavailable") } - return cli, nil + h.pdHTTPCli = cli.WithCallerID("tidb-store-helper") + return h.pdHTTPCli, nil } // MaxBackoffTimeoutForMvccGet is a derived value from previous implementation possible experiencing value 5000ms. @@ -806,7 +814,7 @@ func (h *Helper) GetPDRegionStats(ctx context.Context, tableID int64, noIndexSta startKey = codec.EncodeBytes([]byte{}, startKey) endKey = codec.EncodeBytes([]byte{}, endKey) - return pdCli.GetRegionStatusByKeyRange(ctx, startKey, endKey) + return pdCli.GetRegionStatusByKeyRange(ctx, pd.NewKeyRange(startKey, endKey), false) } // GetTiFlashTableIDFromEndKey computes tableID from pd rule's endKey. diff --git a/pkg/store/helper/helper_test.go b/pkg/store/helper/helper_test.go index 21774cfc13ebe..0702928091984 100644 --- a/pkg/store/helper/helper_test.go +++ b/pkg/store/helper/helper_test.go @@ -152,7 +152,7 @@ func createMockStore(t *testing.T) (store helper.Storage) { mockstore.WithClusterInspector(func(c testutils.Cluster) { mockstore.BootstrapWithMultiRegions(c, []byte("x")) }), - mockstore.WithTiKVOptions(tikv.WithPDHTTPClient(pdAddrs)), + mockstore.WithTiKVOptions(tikv.WithPDHTTPClient("store-helper-test", pdAddrs)), ) require.NoError(t, err) diff --git a/pkg/store/helper/main_test.go b/pkg/store/helper/main_test.go index 35406a5675883..3b9ad6ce87f0c 100644 --- a/pkg/store/helper/main_test.go +++ b/pkg/store/helper/main_test.go @@ -25,9 +25,13 @@ func TestMain(m *testing.M) { testsetup.SetupForCommonTest() opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), + goleak.IgnoreTopFunction("net.(*Resolver).lookupIPAddr.func2"), + goleak.IgnoreTopFunction("net.(*Resolver).goLookupIPCNAMEOrder.func4"), + goleak.IgnoreTopFunction("internal/poll.runtime_pollWait"), } goleak.VerifyTestMain(m, opts...) } diff --git a/pkg/store/main_test.go b/pkg/store/main_test.go index 30f695b07771c..ac02fda468749 100644 --- a/pkg/store/main_test.go +++ b/pkg/store/main_test.go @@ -24,7 +24,9 @@ import ( func TestMain(m *testing.M) { testsetup.SetupForCommonTest() opts := []goleak.Option{ + goleak.IgnoreTopFunction("syscall.Syscall"), goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), diff --git a/pkg/store/mockstore/BUILD.bazel b/pkg/store/mockstore/BUILD.bazel index 97677e14d3a3d..a9419cfc3d4c4 100644 --- a/pkg/store/mockstore/BUILD.bazel +++ b/pkg/store/mockstore/BUILD.bazel @@ -17,6 +17,7 @@ go_library( "//pkg/store/mockstore/mockstorage", "//pkg/store/mockstore/unistore", "//pkg/testkit/testenv", + "@com_github_otiai10_copy//:copy", "@com_github_pingcap_errors//:errors", "@com_github_tikv_client_go_v2//testutils", "@com_github_tikv_client_go_v2//tikv", diff --git a/pkg/store/mockstore/main_test.go b/pkg/store/mockstore/main_test.go index f182f7617bc90..858a740f5dd4a 100644 --- a/pkg/store/mockstore/main_test.go +++ b/pkg/store/mockstore/main_test.go @@ -32,6 +32,7 @@ func TestMain(m *testing.M) { } opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), diff --git a/pkg/store/mockstore/mockcopr/BUILD.bazel b/pkg/store/mockstore/mockcopr/BUILD.bazel index 3eb69ae39b10a..04f01dbe0cec1 100644 --- a/pkg/store/mockstore/mockcopr/BUILD.bazel +++ b/pkg/store/mockstore/mockcopr/BUILD.bazel @@ -23,6 +23,7 @@ go_library( "//pkg/parser/model", "//pkg/parser/mysql", "//pkg/parser/terror", + "//pkg/sessionctx", "//pkg/sessionctx/stmtctx", "//pkg/statistics", "//pkg/tablecodec", @@ -30,6 +31,7 @@ go_library( "//pkg/util/chunk", "//pkg/util/codec", "//pkg/util/collate", + "//pkg/util/mock", "//pkg/util/rowcodec", "//pkg/util/timeutil", "@com_github_golang_protobuf//proto", diff --git a/pkg/store/mockstore/mockcopr/aggregate.go b/pkg/store/mockstore/mockcopr/aggregate.go index 606bd21c001b0..1a996929783f2 100644 --- a/pkg/store/mockstore/mockcopr/aggregate.go +++ b/pkg/store/mockstore/mockcopr/aggregate.go @@ -118,11 +118,12 @@ func (e *hashAggExec) Next(ctx context.Context) (value [][]byte, err error) { gk := e.groupKeys[e.currGroupIdx] value = make([][]byte, 0, len(e.groupByExprs)+2*len(e.aggExprs)) aggCtxs := e.getContexts(gk) - errCtx := e.evalCtx.sc.ErrCtx() + sc := e.evalCtx.sctx.GetSessionVars().StmtCtx + errCtx := sc.ErrCtx() for i, agg := range e.aggExprs { partialResults := agg.GetPartialResult(aggCtxs[i]) for _, result := range partialResults { - data, err := codec.EncodeValue(e.evalCtx.sc.TimeZone(), nil, result) + data, err := codec.EncodeValue(sc.TimeZone(), nil, result) err = errCtx.HandleError(err) if err != nil { return nil, errors.Trace(err) @@ -143,13 +144,14 @@ func (e *hashAggExec) getGroupKey() ([]byte, [][]byte, error) { } bufLen := 0 row := make([][]byte, 0, length) - errCtx := e.evalCtx.sc.ErrCtx() + sc := e.evalCtx.sctx.GetSessionVars().StmtCtx + errCtx := sc.ErrCtx() for _, item := range e.groupByExprs { - v, err := item.EvalWithInnerCtx(chunk.MutRowFromDatums(e.row).ToRow()) + v, err := item.Eval(e.evalCtx.sctx, chunk.MutRowFromDatums(e.row).ToRow()) if err != nil { return nil, nil, errors.Trace(err) } - b, err := codec.EncodeValue(e.evalCtx.sc.TimeZone(), nil, v) + b, err := codec.EncodeValue(sc.TimeZone(), nil, v) err = errCtx.HandleError(err) if err != nil { return nil, nil, errors.Trace(err) @@ -183,7 +185,7 @@ func (e *hashAggExec) aggregate(value [][]byte) error { // Update aggregate expressions. aggCtxs := e.getContexts(gk) for i, agg := range e.aggExprs { - err = agg.Update(aggCtxs[i], e.evalCtx.sc, chunk.MutRowFromDatums(e.row).ToRow()) + err = agg.Update(aggCtxs[i], e.evalCtx.sctx.GetSessionVars().StmtCtx, chunk.MutRowFromDatums(e.row).ToRow()) if err != nil { return errors.Trace(err) } @@ -197,7 +199,7 @@ func (e *hashAggExec) getContexts(groupKey []byte) []*aggregation.AggEvaluateCon if !ok { aggCtxs = make([]*aggregation.AggEvaluateContext, 0, len(e.aggExprs)) for _, agg := range e.aggExprs { - aggCtxs = append(aggCtxs, agg.CreateContext(e.evalCtx.sc)) + aggCtxs = append(aggCtxs, agg.CreateContext(e.evalCtx.sctx)) } e.aggCtxsMap[groupKeyString] = aggCtxs } @@ -250,11 +252,12 @@ func (e *streamAggExec) Counts() []int64 { func (e *streamAggExec) getPartialResult() ([][]byte, error) { value := make([][]byte, 0, len(e.groupByExprs)+2*len(e.aggExprs)) - errCtx := e.evalCtx.sc.ErrCtx() + sc := e.evalCtx.sctx.GetSessionVars().StmtCtx + errCtx := sc.ErrCtx() for i, agg := range e.aggExprs { partialResults := agg.GetPartialResult(e.aggCtxs[i]) for _, result := range partialResults { - data, err := codec.EncodeValue(e.evalCtx.sc.TimeZone(), nil, result) + data, err := codec.EncodeValue(sc.TimeZone(), nil, result) err = errCtx.HandleError(err) if err != nil { return nil, errors.Trace(err) @@ -262,11 +265,11 @@ func (e *streamAggExec) getPartialResult() ([][]byte, error) { value = append(value, data) } // Clear the aggregate context. - e.aggCtxs[i] = agg.CreateContext(e.evalCtx.sc) + e.aggCtxs[i] = agg.CreateContext(e.evalCtx.sctx) } e.currGroupByValues = e.currGroupByValues[:0] for _, d := range e.currGroupByRow { - buf, err := codec.EncodeValue(e.evalCtx.sc.TimeZone(), nil, d) + buf, err := codec.EncodeValue(sc.TimeZone(), nil, d) err = errCtx.HandleError(err) if err != nil { return nil, errors.Trace(err) @@ -288,12 +291,12 @@ func (e *streamAggExec) meetNewGroup(row [][]byte) (bool, error) { matched, firstGroup = false, true } for i, item := range e.groupByExprs { - d, err := item.EvalWithInnerCtx(chunk.MutRowFromDatums(e.row).ToRow()) + d, err := item.Eval(e.evalCtx.sctx, chunk.MutRowFromDatums(e.row).ToRow()) if err != nil { return false, errors.Trace(err) } if matched { - c, err := d.Compare(e.evalCtx.sc.TypeCtx(), &e.nextGroupByRow[i], e.groupByCollators[i]) + c, err := d.Compare(e.evalCtx.sctx.GetSessionVars().StmtCtx.TypeCtx(), &e.nextGroupByRow[i], e.groupByCollators[i]) if err != nil { return false, errors.Trace(err) } @@ -349,7 +352,7 @@ func (e *streamAggExec) Next(ctx context.Context) (retRow [][]byte, err error) { } } for i, agg := range e.aggExprs { - err = agg.Update(e.aggCtxs[i], e.evalCtx.sc, chunk.MutRowFromDatums(e.row).ToRow()) + err = agg.Update(e.aggCtxs[i], e.evalCtx.sctx.GetSessionVars().StmtCtx, chunk.MutRowFromDatums(e.row).ToRow()) if err != nil { return nil, errors.Trace(err) } diff --git a/pkg/store/mockstore/mockcopr/analyze.go b/pkg/store/mockstore/mockcopr/analyze.go index 87cabb184163b..b58793ec0bb10 100644 --- a/pkg/store/mockstore/mockcopr/analyze.go +++ b/pkg/store/mockstore/mockcopr/analyze.go @@ -88,7 +88,9 @@ func (h coprHandler) handleAnalyzeIndexReq(req *coprocessor.Request, analyzeReq if err != nil { return nil, errors.Trace(err) } - statsBuilder := statistics.NewSortedBuilder(flagsAndTzToStatementContext(analyzeReq.Flags, tz), analyzeReq.IdxReq.BucketSize, 0, types.NewFieldType(mysql.TypeBlob), statistics.Version1) + sctx := flagsAndTzToSessionContext(analyzeReq.Flags, tz) + sc := sctx.GetSessionVars().StmtCtx + statsBuilder := statistics.NewSortedBuilder(sc, analyzeReq.IdxReq.BucketSize, 0, types.NewFieldType(mysql.TypeBlob), statistics.Version1) var cms *statistics.CMSketch if analyzeReq.IdxReq.CmsketchDepth != nil && analyzeReq.IdxReq.CmsketchWidth != nil { cms = statistics.NewCMSketch(*analyzeReq.IdxReq.CmsketchDepth, *analyzeReq.IdxReq.CmsketchWidth) @@ -138,9 +140,9 @@ func (h coprHandler) handleAnalyzeColumnsReq(req *coprocessor.Request, analyzeRe return nil, errors.Trace(err) } - sc := flagsAndTzToStatementContext(analyzeReq.Flags, tz) + sctx := flagsAndTzToSessionContext(analyzeReq.Flags, tz) - evalCtx := &evalContext{sc: sc} + evalCtx := &evalContext{sctx: sctx} columns := analyzeReq.ColReq.ColumnsInfo evalCtx.setColumnInfo(columns) ranges, err := h.extractKVRanges(req.Ranges, false) @@ -215,7 +217,7 @@ func (h coprHandler) handleAnalyzeColumnsReq(req *coprocessor.Request, analyzeRe } colReq := analyzeReq.ColReq builder := statistics.SampleBuilder{ - Sc: sc, + Sc: sctx.GetSessionVars().StmtCtx, RecordSet: e, ColLen: numCols, MaxBucketSize: colReq.BucketSize, @@ -225,7 +227,7 @@ func (h coprHandler) handleAnalyzeColumnsReq(req *coprocessor.Request, analyzeRe ColsFieldType: fts, } if pkID != -1 { - builder.PkBuilder = statistics.NewSortedBuilder(sc, builder.MaxBucketSize, pkID, types.NewFieldType(mysql.TypeBlob), statistics.Version1) + builder.PkBuilder = statistics.NewSortedBuilder(sctx.GetSessionVars().StmtCtx, builder.MaxBucketSize, pkID, types.NewFieldType(mysql.TypeBlob), statistics.Version1) } if colReq.CmsketchWidth != nil && colReq.CmsketchDepth != nil { builder.CMSketchWidth = *colReq.CmsketchWidth diff --git a/pkg/store/mockstore/mockcopr/cop_handler_dag.go b/pkg/store/mockstore/mockcopr/cop_handler_dag.go index c1fac6fa803d3..03d09f78a38f2 100644 --- a/pkg/store/mockstore/mockcopr/cop_handler_dag.go +++ b/pkg/store/mockstore/mockcopr/cop_handler_dag.go @@ -32,12 +32,14 @@ import ( "github.com/pingcap/tidb/pkg/parser/model" "github.com/pingcap/tidb/pkg/parser/mysql" "github.com/pingcap/tidb/pkg/parser/terror" + "github.com/pingcap/tidb/pkg/sessionctx" "github.com/pingcap/tidb/pkg/sessionctx/stmtctx" "github.com/pingcap/tidb/pkg/tablecodec" "github.com/pingcap/tidb/pkg/types" "github.com/pingcap/tidb/pkg/util/chunk" "github.com/pingcap/tidb/pkg/util/codec" "github.com/pingcap/tidb/pkg/util/collate" + "github.com/pingcap/tidb/pkg/util/mock" "github.com/pingcap/tidb/pkg/util/rowcodec" "github.com/pingcap/tidb/pkg/util/timeutil" "github.com/pingcap/tipb/go-tipb" @@ -82,7 +84,8 @@ func (h coprHandler) handleCopDAGRequest(req *coprocessor.Request) *coprocessor. execDetails = e.ExecDetails() } - selResp := h.initSelectResponse(err, dagCtx.evalCtx.sc.GetWarnings(), e.Counts()) + sc := dagCtx.evalCtx.sctx.GetSessionVars().StmtCtx + selResp := h.initSelectResponse(err, sc.GetWarnings(), e.Counts()) if err == nil { err = h.fillUpData4SelectResponse(selResp, dagReq, dagCtx, rows) } @@ -107,13 +110,13 @@ func (h coprHandler) buildDAGExecutor(req *coprocessor.Request) (*dagContext, ex if err != nil { return nil, nil, nil, errors.Trace(err) } - sc := flagsAndTzToStatementContext(dagReq.Flags, tz) + sctx := flagsAndTzToSessionContext(dagReq.Flags, tz) ctx := &dagContext{ dagReq: dagReq, keyRanges: req.Ranges, startTS: req.StartTs, - evalCtx: &evalContext{sc: sc}, + evalCtx: &evalContext{sctx: sctx}, } var e executor if len(dagReq.Executors) == 0 { @@ -301,7 +304,7 @@ func (h coprHandler) buildSelection(ctx *dagContext, executor *tipb.Executor) (* return nil, errors.Trace(err) } } - conds, err := convertToExprs(ctx.evalCtx.sc, ctx.evalCtx.fieldTps, pbConds) + conds, err := convertToExprs(ctx.evalCtx.sctx, ctx.evalCtx.fieldTps, pbConds) if err != nil { return nil, errors.Trace(err) } @@ -322,7 +325,7 @@ func (h coprHandler) getAggInfo(ctx *dagContext, executor *tipb.Executor) ([]agg var relatedColOffsets []int for _, expr := range executor.Aggregation.AggFunc { var aggExpr aggregation.Aggregation - aggExpr, err = aggregation.NewDistAggFunc(expr, ctx.evalCtx.fieldTps, ctx.evalCtx.sc) + aggExpr, err = aggregation.NewDistAggFunc(expr, ctx.evalCtx.fieldTps, ctx.evalCtx.sctx) if err != nil { return nil, nil, nil, errors.Trace(err) } @@ -338,7 +341,7 @@ func (h coprHandler) getAggInfo(ctx *dagContext, executor *tipb.Executor) ([]agg return nil, nil, nil, errors.Trace(err) } } - groupBys, err := convertToExprs(ctx.evalCtx.sc, ctx.evalCtx.fieldTps, executor.Aggregation.GetGroupBy()) + groupBys, err := convertToExprs(ctx.evalCtx.sctx, ctx.evalCtx.fieldTps, executor.Aggregation.GetGroupBy()) if err != nil { return nil, nil, nil, errors.Trace(err) } @@ -371,7 +374,7 @@ func (h coprHandler) buildStreamAgg(ctx *dagContext, executor *tipb.Executor) (* } aggCtxs := make([]*aggregation.AggEvaluateContext, 0, len(aggs)) for _, agg := range aggs { - aggCtxs = append(aggCtxs, agg.CreateContext(ctx.evalCtx.sc)) + aggCtxs = append(aggCtxs, agg.CreateContext(ctx.evalCtx.sctx)) } groupByCollators := make([]collate.Collator, 0, len(groupBys)) for _, expr := range groupBys { @@ -407,11 +410,11 @@ func (h coprHandler) buildTopN(ctx *dagContext, executor *tipb.Executor) (*topNE totalCount: int(topN.Limit), topNSorter: topNSorter{ orderByItems: topN.OrderBy, - sc: ctx.evalCtx.sc, + sc: ctx.evalCtx.sctx.GetSessionVars().StmtCtx, }, } - conds, err := convertToExprs(ctx.evalCtx.sc, ctx.evalCtx.fieldTps, pbConds) + conds, err := convertToExprs(ctx.evalCtx.sctx, ctx.evalCtx.fieldTps, pbConds) if err != nil { return nil, errors.Trace(err) } @@ -430,7 +433,7 @@ type evalContext struct { colIDs map[int64]int columnInfos []*tipb.ColumnInfo fieldTps []*types.FieldType - sc *stmtctx.StatementContext + sctx sessionctx.Context } func (e *evalContext) setColumnInfo(cols []*tipb.ColumnInfo) { @@ -450,7 +453,7 @@ func (e *evalContext) setColumnInfo(cols []*tipb.ColumnInfo) { func (e *evalContext) decodeRelatedColumnVals(relatedColOffsets []int, value [][]byte, row []types.Datum) error { var err error for _, offset := range relatedColOffsets { - row[offset], err = tablecodec.DecodeColumnValue(value[offset], e.fieldTps[offset], e.sc.TimeZone()) + row[offset], err = tablecodec.DecodeColumnValue(value[offset], e.fieldTps[offset], e.sctx.GetSessionVars().StmtCtx.TimeZone()) if err != nil { return errors.Trace(err) } @@ -458,11 +461,13 @@ func (e *evalContext) decodeRelatedColumnVals(relatedColOffsets []int, value [][ return nil } -// flagsAndTzToStatementContext creates a StatementContext from a `tipb.SelectRequest.Flags`. -func flagsAndTzToStatementContext(flags uint64, tz *time.Location) *stmtctx.StatementContext { +// flagsAndTzToSessionContext creates a StatementContext from a `tipb.SelectRequest.Flags`. +func flagsAndTzToSessionContext(flags uint64, tz *time.Location) sessionctx.Context { + sctx := mock.NewContext() sc := stmtctx.NewStmtCtx() sc.InitFromPBFlagAndTz(flags, tz) - return sc + sctx.GetSessionVars().StmtCtx = sc + return sctx } // MockGRPCClientStream is exported for testing purpose. @@ -544,7 +549,7 @@ func (h coprHandler) fillUpData4SelectResponse(selResp *tipb.SelectResponse, dag h.encodeDefault(selResp, rows, dagReq.OutputOffsets) case tipb.EncodeType_TypeChunk: colTypes := h.constructRespSchema(dagCtx) - loc := dagCtx.evalCtx.sc.TimeZone() + loc := dagCtx.evalCtx.sctx.GetSessionVars().StmtCtx.TimeZone() err := h.encodeChunk(selResp, rows, colTypes, dagReq.OutputOffsets, loc) if err != nil { return err diff --git a/pkg/store/mockstore/mockcopr/executor.go b/pkg/store/mockstore/mockcopr/executor.go index bdc1a38c07475..6b415878c623f 100644 --- a/pkg/store/mockstore/mockcopr/executor.go +++ b/pkg/store/mockstore/mockcopr/executor.go @@ -26,7 +26,7 @@ import ( "github.com/pingcap/tidb/pkg/kv" "github.com/pingcap/tidb/pkg/parser/model" "github.com/pingcap/tidb/pkg/parser/mysql" - "github.com/pingcap/tidb/pkg/sessionctx/stmtctx" + "github.com/pingcap/tidb/pkg/sessionctx" "github.com/pingcap/tidb/pkg/tablecodec" "github.com/pingcap/tidb/pkg/types" "github.com/pingcap/tidb/pkg/util/chunk" @@ -404,9 +404,9 @@ func (e *selectionExec) Counts() []int64 { } // evalBool evaluates expression to a boolean value. -func evalBool(exprs []expression.Expression, row []types.Datum, ctx *stmtctx.StatementContext) (bool, error) { +func evalBool(exprs []expression.Expression, row []types.Datum, ctx sessionctx.Context) (bool, error) { for _, expr := range exprs { - data, err := expr.EvalWithInnerCtx(chunk.MutRowFromDatums(row).ToRow()) + data, err := expr.Eval(ctx, chunk.MutRowFromDatums(row).ToRow()) if err != nil { return false, errors.Trace(err) } @@ -414,8 +414,7 @@ func evalBool(exprs []expression.Expression, row []types.Datum, ctx *stmtctx.Sta return false, nil } - isBool, err := data.ToBool(ctx.TypeCtx()) - isBool, err = expression.HandleOverflowOnSelection(ctx, isBool, err) + isBool, err := data.ToBool(ctx.GetSessionVars().StmtCtx.TypeCtx()) if err != nil { return false, errors.Trace(err) } @@ -443,7 +442,7 @@ func (e *selectionExec) Next(ctx context.Context) (value [][]byte, err error) { if err != nil { return nil, errors.Trace(err) } - match, err := evalBool(e.conditions, e.row, e.evalCtx.sc) + match, err := evalBool(e.conditions, e.row, e.evalCtx.sctx) if err != nil { return nil, errors.Trace(err) } @@ -542,7 +541,7 @@ func (e *topNExec) evalTopN(value [][]byte) error { return errors.Trace(err) } for i, expr := range e.orderByExprs { - newRow.key[i], err = expr.EvalWithInnerCtx(chunk.MutRowFromDatums(e.row).ToRow()) + newRow.key[i], err = expr.Eval(e.evalCtx.sctx, chunk.MutRowFromDatums(e.row).ToRow()) if err != nil { return errors.Trace(err) } @@ -662,10 +661,10 @@ func getRowData(columns []*tipb.ColumnInfo, colIDs map[int64]int, handle int64, return values, nil } -func convertToExprs(sc *stmtctx.StatementContext, fieldTps []*types.FieldType, pbExprs []*tipb.Expr) ([]expression.Expression, error) { +func convertToExprs(sctx sessionctx.Context, fieldTps []*types.FieldType, pbExprs []*tipb.Expr) ([]expression.Expression, error) { exprs := make([]expression.Expression, 0, len(pbExprs)) for _, expr := range pbExprs { - e, err := expression.PBToExpr(expr, fieldTps, sc) + e, err := expression.PBToExpr(sctx, expr, fieldTps) if err != nil { return nil, errors.Trace(err) } diff --git a/pkg/store/mockstore/mockcopr/main_test.go b/pkg/store/mockstore/mockcopr/main_test.go index 8926b86bc1dd1..bb1310c7ea7cd 100644 --- a/pkg/store/mockstore/mockcopr/main_test.go +++ b/pkg/store/mockstore/mockcopr/main_test.go @@ -27,6 +27,7 @@ func TestMain(m *testing.M) { testsetup.SetupForCommonTest() opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), diff --git a/pkg/store/mockstore/mockstore.go b/pkg/store/mockstore/mockstore.go index d8945e5401056..a3a87e6b86f7a 100644 --- a/pkg/store/mockstore/mockstore.go +++ b/pkg/store/mockstore/mockstore.go @@ -16,8 +16,11 @@ package mockstore import ( "net/url" + "os" + "path/filepath" "strings" + cp "github.com/otiai10/copy" "github.com/pingcap/errors" "github.com/pingcap/tidb/pkg/config" "github.com/pingcap/tidb/pkg/kv" @@ -192,6 +195,14 @@ func NewMockStore(options ...MockTiKVStoreOption) (kv.Storage, error) { case MockTiKV: store, err = newMockTikvStore(&opt) case EmbedUnistore: + // Don't do this unless we figure out why the test image does not accelerate out unit tests. + // if opt.path == "" && len(options) == 0 && ImageAvailable() { + // // Create the store from the image. + // if path, err := copyImage(); err == nil { + // opt.path = path + // } + // } + store, err = newUnistore(&opt) default: panic("unsupported mockstore") @@ -206,6 +217,31 @@ func NewMockStore(options ...MockTiKVStoreOption) (kv.Storage, error) { return store, nil } +// ImageFilePath is used by testing, it's the file path for the bootstraped store image. +const ImageFilePath = "/tmp/tidb-unistore-bootstraped-image/" + +// ImageAvailable checks whether the store image file is available. +func ImageAvailable() bool { + _, err := os.ReadDir(ImageFilePath) + if err != nil { + return false + } + _, err = os.ReadDir(filepath.Join(ImageFilePath, "kv")) + return err == nil +} + +func copyImage() (string, error) { + path, err := os.MkdirTemp("", "tidb-unistore-temp") + if err != nil { + return "", err + } + err = cp.Copy(ImageFilePath, path) + if err != nil { + return "", err + } + return path, nil +} + // BootstrapWithSingleStore initializes a Cluster with 1 Region and 1 Store. func BootstrapWithSingleStore(cluster testutils.Cluster) (storeID, peerID, regionID uint64) { switch x := cluster.(type) { diff --git a/pkg/store/mockstore/unistore/cophandler/analyze.go b/pkg/store/mockstore/unistore/cophandler/analyze.go index e77a41942a2a1..3a5a20b7a525c 100644 --- a/pkg/store/mockstore/unistore/cophandler/analyze.go +++ b/pkg/store/mockstore/unistore/cophandler/analyze.go @@ -31,6 +31,7 @@ import ( "github.com/pingcap/tidb/pkg/parser/charset" "github.com/pingcap/tidb/pkg/parser/model" "github.com/pingcap/tidb/pkg/parser/mysql" + "github.com/pingcap/tidb/pkg/sessionctx" "github.com/pingcap/tidb/pkg/sessionctx/stmtctx" "github.com/pingcap/tidb/pkg/statistics" "github.com/pingcap/tidb/pkg/store/mockstore/unistore/tikv/dbreader" @@ -90,11 +91,12 @@ func handleAnalyzeIndexReq(dbReader *dbreader.DBReader, rans []kv.KeyRange, anal } tz := time.FixedZone("UTC", int(analyzeReq.TimeZoneOffset)) - sctx := flagsAndTzToStatementContext(analyzeReq.Flags, tz) + sctx := flagsAndTzToSessionContext(analyzeReq.Flags, tz) + sc := sctx.GetSessionVars().StmtCtx processor := &analyzeIndexProcessor{ sctx: sctx, colLen: int(analyzeReq.IdxReq.NumColumns), - statsBuilder: statistics.NewSortedBuilder(sctx, analyzeReq.IdxReq.BucketSize, 0, types.NewFieldType(mysql.TypeBlob), int(statsVer)), + statsBuilder: statistics.NewSortedBuilder(sc, analyzeReq.IdxReq.BucketSize, 0, types.NewFieldType(mysql.TypeBlob), int(statsVer)), statsVer: statsVer, } if analyzeReq.IdxReq.TopNSize != nil { @@ -144,9 +146,11 @@ func handleAnalyzeCommonHandleReq(dbReader *dbreader.DBReader, rans []kv.KeyRang } tz := time.FixedZone("UTC", int(analyzeReq.TimeZoneOffset)) + sctx := flagsAndTzToSessionContext(analyzeReq.Flags, tz) + sc := sctx.GetSessionVars().StmtCtx processor := &analyzeCommonHandleProcessor{ colLen: int(analyzeReq.IdxReq.NumColumns), - statsBuilder: statistics.NewSortedBuilder(flagsAndTzToStatementContext(analyzeReq.Flags, tz), analyzeReq.IdxReq.BucketSize, 0, types.NewFieldType(mysql.TypeBlob), statsVer), + statsBuilder: statistics.NewSortedBuilder(sc, analyzeReq.IdxReq.BucketSize, 0, types.NewFieldType(mysql.TypeBlob), statsVer), } if analyzeReq.IdxReq.CmsketchDepth != nil && analyzeReq.IdxReq.CmsketchWidth != nil { processor.cms = statistics.NewCMSketch(*analyzeReq.IdxReq.CmsketchDepth, *analyzeReq.IdxReq.CmsketchWidth) @@ -172,7 +176,7 @@ func handleAnalyzeCommonHandleReq(dbReader *dbreader.DBReader, rans []kv.KeyRang type analyzeIndexProcessor struct { skipVal - sctx *stmtctx.StatementContext + sctx sessionctx.Context colLen int statsBuilder *statistics.SortedBuilder cms *statistics.CMSketch @@ -200,7 +204,7 @@ func (p *analyzeIndexProcessor) Process(key, _ []byte) error { } if p.fms != nil { - if err := p.fms.InsertValue(p.sctx, types.NewBytesDatum(safeCopy(p.rowBuf))); err != nil { + if err := p.fms.InsertValue(p.sctx.GetSessionVars().StmtCtx, types.NewBytesDatum(safeCopy(p.rowBuf))); err != nil { return err } } @@ -271,14 +275,14 @@ type analyzeColumnsExec struct { func buildBaseAnalyzeColumnsExec(dbReader *dbreader.DBReader, rans []kv.KeyRange, analyzeReq *tipb.AnalyzeReq, startTS uint64) (*analyzeColumnsExec, *statistics.SampleBuilder, int64, error) { tz := time.FixedZone("UTC", int(analyzeReq.TimeZoneOffset)) - sc := flagsAndTzToStatementContext(analyzeReq.Flags, tz) - evalCtx := &evalContext{sc: sc} + sctx := flagsAndTzToSessionContext(analyzeReq.Flags, tz) + evalCtx := &evalContext{sctx: sctx} columns := analyzeReq.ColReq.ColumnsInfo evalCtx.setColumnInfo(columns) if len(analyzeReq.ColReq.PrimaryColumnIds) > 0 { evalCtx.primaryCols = analyzeReq.ColReq.PrimaryColumnIds } - decoder, err := newRowDecoder(evalCtx.columnInfos, evalCtx.fieldTps, evalCtx.primaryCols, evalCtx.sc.TimeZone()) + decoder, err := newRowDecoder(evalCtx.columnInfos, evalCtx.fieldTps, evalCtx.primaryCols, sctx.GetSessionVars().StmtCtx.TimeZone()) if err != nil { return nil, nil, -1, err } @@ -324,7 +328,7 @@ func buildBaseAnalyzeColumnsExec(dbReader *dbreader.DBReader, rans []kv.KeyRange } colReq := analyzeReq.ColReq builder := statistics.SampleBuilder{ - Sc: sc, + Sc: sctx.GetSessionVars().StmtCtx, ColLen: numCols, MaxBucketSize: colReq.BucketSize, MaxFMSketchSize: colReq.SketchSize, @@ -337,7 +341,7 @@ func buildBaseAnalyzeColumnsExec(dbReader *dbreader.DBReader, rans []kv.KeyRange statsVer = int(*analyzeReq.ColReq.Version) } if pkID != -1 { - builder.PkBuilder = statistics.NewSortedBuilder(sc, builder.MaxBucketSize, pkID, types.NewFieldType(mysql.TypeBlob), statsVer) + builder.PkBuilder = statistics.NewSortedBuilder(builder.Sc, builder.MaxBucketSize, pkID, types.NewFieldType(mysql.TypeBlob), statsVer) } if colReq.CmsketchWidth != nil && colReq.CmsketchDepth != nil { builder.CMSketchWidth = *colReq.CmsketchWidth @@ -377,14 +381,15 @@ func handleAnalyzeFullSamplingReq( startTS uint64, ) (*coprocessor.Response, error) { tz := time.FixedZone("UTC", int(analyzeReq.TimeZoneOffset)) - sc := flagsAndTzToStatementContext(analyzeReq.Flags, tz) - evalCtx := &evalContext{sc: sc} + sctx := flagsAndTzToSessionContext(analyzeReq.Flags, tz) + evalCtx := &evalContext{sctx: sctx} columns := analyzeReq.ColReq.ColumnsInfo evalCtx.setColumnInfo(columns) if len(analyzeReq.ColReq.PrimaryColumnIds) > 0 { evalCtx.primaryCols = analyzeReq.ColReq.PrimaryColumnIds } - decoder, err := newRowDecoder(evalCtx.columnInfos, evalCtx.fieldTps, evalCtx.primaryCols, evalCtx.sc.TimeZone()) + loc := sctx.GetSessionVars().StmtCtx.TimeZone() + decoder, err := newRowDecoder(evalCtx.columnInfos, evalCtx.fieldTps, evalCtx.primaryCols, loc) if err != nil { return nil, err } @@ -431,7 +436,7 @@ func handleAnalyzeFullSamplingReq( colReq := analyzeReq.ColReq /* #nosec G404 */ builder := &statistics.RowSampleBuilder{ - Sc: sc, + Sc: sctx.GetSessionVars().StmtCtx, RecordSet: e, ColsFieldType: fts, Collators: collators, @@ -488,6 +493,7 @@ func (e *analyzeColumnsExec) Process(key, value []byte) error { return errors.Trace(err) } row := e.chk.GetRow(0) + sc := e.evalCtx.sctx.GetSessionVars().StmtCtx for i, tp := range e.evalCtx.fieldTps { d := row.GetDatum(i, tp) if d.IsNull() { @@ -495,8 +501,8 @@ func (e *analyzeColumnsExec) Process(key, value []byte) error { continue } - value, err := tablecodec.EncodeValue(e.evalCtx.sc.TimeZone(), nil, d) - err = e.evalCtx.sc.HandleError(err) + value, err := tablecodec.EncodeValue(sc.TimeZone(), nil, d) + err = sc.HandleError(err) if err != nil { return err } @@ -533,12 +539,13 @@ func handleAnalyzeMixedReq(dbReader *dbreader.DBReader, rans []kv.KeyRange, anal return nil, err } tz := time.FixedZone("UTC", int(analyzeReq.TimeZoneOffset)) - sctx := flagsAndTzToStatementContext(analyzeReq.Flags, tz) + sctx := flagsAndTzToSessionContext(analyzeReq.Flags, tz) + sc := sctx.GetSessionVars().StmtCtx e := &analyzeMixedExec{ - sctx: sctx, + sctx: sctx.GetSessionVars().StmtCtx, analyzeColumnsExec: *colExec, colLen: int(analyzeReq.IdxReq.NumColumns), - statsBuilder: statistics.NewSortedBuilder(sctx, analyzeReq.IdxReq.BucketSize, 0, types.NewFieldType(mysql.TypeBlob), int(statsVer)), + statsBuilder: statistics.NewSortedBuilder(sc, analyzeReq.IdxReq.BucketSize, 0, types.NewFieldType(mysql.TypeBlob), int(statsVer)), statsVer: statsVer, } builder.RecordSet = e diff --git a/pkg/store/mockstore/unistore/cophandler/closure_exec.go b/pkg/store/mockstore/unistore/cophandler/closure_exec.go index 0ebeb3e0c996d..67e0e5a59edd5 100644 --- a/pkg/store/mockstore/unistore/cophandler/closure_exec.go +++ b/pkg/store/mockstore/unistore/cophandler/closure_exec.go @@ -30,7 +30,6 @@ import ( "github.com/pingcap/tidb/pkg/parser/mysql" "github.com/pingcap/tidb/pkg/parser/terror" "github.com/pingcap/tidb/pkg/sessionctx" - "github.com/pingcap/tidb/pkg/sessionctx/stmtctx" "github.com/pingcap/tidb/pkg/store/mockstore/unistore/lockstore" "github.com/pingcap/tidb/pkg/store/mockstore/unistore/tikv/dbreader" "github.com/pingcap/tidb/pkg/store/mockstore/unistore/tikv/mvcc" @@ -38,7 +37,6 @@ import ( "github.com/pingcap/tidb/pkg/types" "github.com/pingcap/tidb/pkg/util/chunk" "github.com/pingcap/tidb/pkg/util/codec" - mockpkg "github.com/pingcap/tidb/pkg/util/mock" "github.com/pingcap/tidb/pkg/util/rowcodec" "github.com/pingcap/tidb/pkg/util/timeutil" "github.com/pingcap/tipb/go-tipb" @@ -132,7 +130,7 @@ func buildClosureExecutorFromExecutorList(dagCtx *dagContext, executors []*tipb. } var err error if secondExec := executors[1]; secondExec.Tp == tipb.ExecType_TypeSelection { - ce.selectionCtx.conditions, err = convertToExprs(ce.sc, ce.fieldTps, secondExec.Selection.Conditions) + ce.selectionCtx.conditions, err = convertToExprs(ce.sctx, ce.fieldTps, secondExec.Selection.Conditions) if err != nil { return errors.Trace(err) } @@ -185,10 +183,10 @@ func buildClosureExecutor(dagCtx *dagContext, dagReq *tipb.DAGRequest) (*closure return ce, nil } -func convertToExprs(sc *stmtctx.StatementContext, fieldTps []*types.FieldType, pbExprs []*tipb.Expr) ([]expression.Expression, error) { +func convertToExprs(sctx sessionctx.Context, fieldTps []*types.FieldType, pbExprs []*tipb.Expr) ([]expression.Expression, error) { exprs := make([]expression.Expression, 0, len(pbExprs)) for _, expr := range pbExprs { - e, err := expression.PBToExpr(expr, fieldTps, sc) + e, err := expression.PBToExpr(sctx, expr, fieldTps) if err != nil { return nil, errors.Trace(err) } @@ -243,9 +241,6 @@ func newClosureExecutor(dagCtx *dagContext, outputOffsets []uint32, scanExec *ti startTS: dagCtx.startTS, limit: math.MaxInt64, } - seCtx := mockpkg.NewContext() - seCtx.GetSessionVars().StmtCtx = e.sc - e.seCtx = seCtx switch scanExec.Tp { case tipb.ExecType_TypeTableScan: dagCtx.setColumnInfo(scanExec.TblScan.Columns) @@ -286,7 +281,7 @@ func newClosureExecutor(dagCtx *dagContext, outputOffsets []uint32, scanExec *ti e.kvRanges = ranges e.scanCtx.chk = chunk.NewChunkWithCapacity(e.fieldTps, 32) if e.scanType == TableScan { - e.scanCtx.decoder, err = newRowDecoder(e.evalContext.columnInfos, e.evalContext.fieldTps, e.evalContext.primaryCols, e.evalContext.sc.TimeZone()) + e.scanCtx.decoder, err = newRowDecoder(e.evalContext.columnInfos, e.evalContext.fieldTps, e.evalContext.primaryCols, e.evalContext.sctx.GetSessionVars().StmtCtx.TimeZone()) if err != nil { return nil, errors.Trace(err) } @@ -479,7 +474,6 @@ type closureExecutor struct { *dagContext outputOff []uint32 resultFieldType []*types.FieldType - seCtx sessionctx.Context kvRanges []kv.KeyRange startTS uint64 ignoreLock bool @@ -675,8 +669,9 @@ func (e *countStarProcessor) Finish() error { // countFinish is used for `count(*)`. func (e *closureExecutor) countFinish() error { d := types.NewIntDatum(int64(e.rowCount)) - rowData, err := codec.EncodeValue(e.sc.TimeZone(), nil, d) - err = e.sc.HandleError(err) + sc := e.evalContext.sctx.GetSessionVars().StmtCtx + rowData, err := codec.EncodeValue(sc.TimeZone(), nil, d) + err = sc.HandleError(err) if err != nil { return errors.Trace(err) } @@ -791,8 +786,8 @@ func (e *closureExecutor) processSelection(needCollectDetail bool) (gotRow bool, row := chk.GetRow(chk.NumRows() - 1) gotRow = true for _, expr := range e.selectionCtx.conditions { - wc := e.sc.WarningCount() - d, err := expr.Eval(e.seCtx, row) + wc := e.sctx.GetSessionVars().StmtCtx.WarningCount() + d, err := expr.Eval(e.sctx, row) if err != nil { return false, errors.Trace(err) } @@ -800,21 +795,21 @@ func (e *closureExecutor) processSelection(needCollectDetail bool) (gotRow bool, if d.IsNull() { gotRow = false } else { - isTrue, err := d.ToBool(e.sc.TypeCtx()) - isTrue, err = expression.HandleOverflowOnSelection(e.sc, isTrue, err) + isTrue, err := d.ToBool(e.sctx.GetSessionVars().StmtCtx.TypeCtx()) if err != nil { return false, errors.Trace(err) } gotRow = isTrue != 0 } if !gotRow { - if e.sc.WarningCount() > wc { + sc := e.sctx.GetSessionVars().StmtCtx + if sc.WarningCount() > wc { // Deep-copy error object here, because the data it referenced is going to be truncated. - warns := e.sc.TruncateWarnings(int(wc)) + warns := sc.TruncateWarnings(int(wc)) for i, warn := range warns { warns[i].Err = e.copyError(warn.Err) } - e.sc.AppendWarnings(warns) + sc.AppendWarnings(warns) } chk.TruncateTo(chk.NumRows() - 1) break @@ -926,7 +921,7 @@ func (e *closureExecutor) indexScanProcessCore(key, value []byte) error { } } chk := e.scanCtx.chk - decoder := codec.NewDecoder(chk, e.sc.TimeZone()) + decoder := codec.NewDecoder(chk, e.sctx.GetSessionVars().StmtCtx.TimeZone()) for i, colVal := range values { if i < len(e.fieldTps) { _, err = decoder.DecodeOne(colVal, i, e.fieldTps[i]) @@ -947,7 +942,8 @@ func (e *closureExecutor) indexScanProcessCore(key, value []byte) error { func (e *closureExecutor) chunkToOldChunk(chk *chunk.Chunk) error { var oldRow []types.Datum - errCtx := e.sc.ErrCtx() + sc := e.sctx.GetSessionVars().StmtCtx + errCtx := sc.ErrCtx() for i := 0; i < chk.NumRows(); i++ { oldRow = oldRow[:0] if e.outputOff != nil { @@ -962,7 +958,7 @@ func (e *closureExecutor) chunkToOldChunk(chk *chunk.Chunk) error { } } var err error - e.oldRowBuf, err = codec.EncodeValue(e.sc.TimeZone(), e.oldRowBuf[:0], oldRow...) + e.oldRowBuf, err = codec.EncodeValue(sc.TimeZone(), e.oldRowBuf[:0], oldRow...) err = errCtx.HandleError(err) if err != nil { return errors.Trace(err) @@ -1030,7 +1026,7 @@ func (e *topNProcessor) Process(key, value []byte) (err error) { ctx := e.topNCtx row := e.scanCtx.chk.GetRow(0) for i, expr := range ctx.orderByExprs { - d, err := expr.Eval(e.seCtx, row) + d, err := expr.Eval(e.sctx, row) if err != nil { return errors.Trace(err) } @@ -1110,7 +1106,7 @@ func (e *hashAggProcessor) Process(key, value []byte) (err error) { // Update aggregate expressions. aggCtxs := e.getContexts(gk) for i, agg := range e.aggExprs { - err = agg.Update(aggCtxs[i], e.sc, row) + err = agg.Update(aggCtxs[i], e.sctx.GetSessionVars().StmtCtx, row) if err != nil { return errors.Trace(err) } @@ -1125,13 +1121,14 @@ func (e *hashAggProcessor) getGroupKey(row chunk.Row) ([]byte, error) { return nil, nil } key := make([]byte, 0, 32) - errCtx := e.sc.ErrCtx() + sc := e.sctx.GetSessionVars().StmtCtx + errCtx := sc.ErrCtx() for _, item := range e.groupByExprs { - v, err := item.Eval(e.seCtx, row) + v, err := item.Eval(e.sctx, row) if err != nil { return nil, errors.Trace(err) } - b, err := codec.EncodeValue(e.sc.TimeZone(), nil, v) + b, err := codec.EncodeValue(sc.TimeZone(), nil, v) err = errCtx.HandleError(err) if err != nil { return nil, errors.Trace(err) @@ -1146,7 +1143,7 @@ func (e *hashAggProcessor) getContexts(groupKey []byte) []*aggregation.AggEvalua if !ok { aggCtxs = make([]*aggregation.AggEvaluateContext, 0, len(e.aggExprs)) for _, agg := range e.aggExprs { - aggCtxs = append(aggCtxs, agg.CreateContext(e.sc)) + aggCtxs = append(aggCtxs, agg.CreateContext(e.sctx)) } e.aggCtxsMap[string(groupKey)] = aggCtxs } @@ -1154,14 +1151,15 @@ func (e *hashAggProcessor) getContexts(groupKey []byte) []*aggregation.AggEvalua } func (e *hashAggProcessor) Finish() error { - errCtx := e.sc.ErrCtx() + tc := e.sctx.GetSessionVars().StmtCtx + errCtx := tc.ErrCtx() for i, gk := range e.groupKeys { aggCtxs := e.getContexts(gk) e.oldRowBuf = e.oldRowBuf[:0] for i, agg := range e.aggExprs { partialResults := agg.GetPartialResult(aggCtxs[i]) var err error - e.oldRowBuf, err = codec.EncodeValue(e.sc.TimeZone(), e.oldRowBuf, partialResults...) + e.oldRowBuf, err = codec.EncodeValue(tc.TimeZone(), e.oldRowBuf, partialResults...) err = errCtx.HandleError(err) if err != nil { return err diff --git a/pkg/store/mockstore/unistore/cophandler/cop_handler.go b/pkg/store/mockstore/unistore/cophandler/cop_handler.go index 05ad5a41e791b..67d707f7b6c4a 100644 --- a/pkg/store/mockstore/unistore/cophandler/cop_handler.go +++ b/pkg/store/mockstore/unistore/cophandler/cop_handler.go @@ -33,6 +33,7 @@ import ( "github.com/pingcap/tidb/pkg/parser/model" "github.com/pingcap/tidb/pkg/parser/mysql" "github.com/pingcap/tidb/pkg/parser/terror" + "github.com/pingcap/tidb/pkg/sessionctx" "github.com/pingcap/tidb/pkg/sessionctx/stmtctx" "github.com/pingcap/tidb/pkg/store/mockstore/unistore/client" "github.com/pingcap/tidb/pkg/store/mockstore/unistore/lockstore" @@ -42,6 +43,7 @@ import ( "github.com/pingcap/tidb/pkg/util/chunk" "github.com/pingcap/tidb/pkg/util/codec" "github.com/pingcap/tidb/pkg/util/collate" + "github.com/pingcap/tidb/pkg/util/mock" "github.com/pingcap/tidb/pkg/util/rowcodec" "github.com/pingcap/tipb/go-tipb" ) @@ -143,15 +145,16 @@ func handleCopDAGRequest(dbReader *dbreader.DBReader, lockStore *lockstore.MemSt exec, chunks, lastRange, counts, ndvs, err := buildAndRunMPPExecutor(dagCtx, dagReq, req.PagingSize) + sc := dagCtx.sctx.GetSessionVars().StmtCtx if err != nil { errMsg := err.Error() if strings.HasPrefix(errMsg, ErrExecutorNotSupportedMsg) { resp.OtherError = err.Error() return resp } - return genRespWithMPPExec(nil, lastRange, nil, nil, exec, dagReq, err, dagCtx.sc.GetWarnings(), time.Since(startTime)) + return genRespWithMPPExec(nil, lastRange, nil, nil, exec, dagReq, err, sc.GetWarnings(), time.Since(startTime)) } - return genRespWithMPPExec(chunks, lastRange, counts, ndvs, exec, dagReq, err, dagCtx.sc.GetWarnings(), time.Since(startTime)) + return genRespWithMPPExec(chunks, lastRange, counts, ndvs, exec, dagReq, err, sc.GetWarnings(), time.Since(startTime)) } func buildAndRunMPPExecutor(dagCtx *dagContext, dagReq *tipb.DAGRequest, pagingSize uint64) (mppExec, []tipb.Chunk, *coprocessor.KeyRange, []int64, []int64, error) { @@ -167,7 +170,7 @@ func buildAndRunMPPExecutor(dagCtx *dagContext, dagReq *tipb.DAGRequest, pagingS ndvs = make([]int64, len(dagCtx.keyRanges)) } builder := &mppExecBuilder{ - sc: dagCtx.sc, + sctx: dagCtx.sctx, dbReader: dagCtx.dbReader, dagReq: dagReq, dagCtx: dagCtx, @@ -240,7 +243,8 @@ func useDefaultEncoding(chk *chunk.Chunk, dagCtx *dagContext, dagReq *tipb.DAGRe var datums []types.Datum var err error numRows := chk.NumRows() - errCtx := dagCtx.sc.ErrCtx() + sc := dagCtx.sctx.GetSessionVars().StmtCtx + errCtx := sc.ErrCtx() for i := 0; i < numRows; i++ { datums = datums[:0] if dagReq.OutputOffsets != nil { @@ -252,7 +256,7 @@ func useDefaultEncoding(chk *chunk.Chunk, dagCtx *dagContext, dagReq *tipb.DAGRe datums = append(datums, chk.GetRow(i).GetDatum(j, ft)) } } - buf, err = codec.EncodeValue(dagCtx.sc.TimeZone(), buf[:0], datums...) + buf, err = codec.EncodeValue(sc.TimeZone(), buf[:0], datums...) err = errCtx.HandleError(err) if err != nil { return nil, errors.Trace(err) @@ -308,9 +312,9 @@ func buildDAG(reader *dbreader.DBReader, lockStore *lockstore.MemStore, req *cop return nil, nil, errors.Trace(err) } } - sc := flagsAndTzToStatementContext(dagReq.Flags, tz) + sctx := flagsAndTzToSessionContext(dagReq.Flags, tz) ctx := &dagContext{ - evalContext: &evalContext{sc: sc}, + evalContext: &evalContext{sctx: sctx}, dbReader: reader, lockStore: lockStore, dagReq: dagReq, @@ -327,13 +331,13 @@ func getAggInfo(ctx *dagContext, pbAgg *tipb.Aggregation) ([]aggregation.Aggrega var err error for _, expr := range pbAgg.AggFunc { var aggExpr aggregation.Aggregation - aggExpr, err = aggregation.NewDistAggFunc(expr, ctx.fieldTps, ctx.sc) + aggExpr, err = aggregation.NewDistAggFunc(expr, ctx.fieldTps, ctx.sctx) if err != nil { return nil, nil, errors.Trace(err) } aggs = append(aggs, aggExpr) } - groupBys, err := convertToExprs(ctx.sc, ctx.fieldTps, pbAgg.GetGroupBy()) + groupBys, err := convertToExprs(ctx.sctx, ctx.fieldTps, pbAgg.GetGroupBy()) if err != nil { return nil, nil, errors.Trace(err) } @@ -350,10 +354,10 @@ func getTopNInfo(ctx *evalContext, topN *tipb.TopN) (heap *topNHeap, conds []exp totalCount: int(topN.Limit), topNSorter: topNSorter{ orderByItems: topN.OrderBy, - sc: ctx.sc, + sc: ctx.sctx.GetSessionVars().StmtCtx, }, } - if conds, err = convertToExprs(ctx.sc, ctx.fieldTps, pbConds); err != nil { + if conds, err = convertToExprs(ctx.sctx, ctx.fieldTps, pbConds); err != nil { return nil, nil, errors.Trace(err) } @@ -364,7 +368,7 @@ type evalContext struct { columnInfos []*tipb.ColumnInfo fieldTps []*types.FieldType primaryCols []int64 - sc *stmtctx.StatementContext + sctx sessionctx.Context } func (e *evalContext) setColumnInfo(cols []*tipb.ColumnInfo) { @@ -423,11 +427,13 @@ func newRowDecoder(columnInfos []*tipb.ColumnInfo, fieldTps []*types.FieldType, return rowcodec.NewChunkDecoder(cols, pkCols, def, timeZone), nil } -// flagsAndTzToStatementContext creates a StatementContext from a `tipb.SelectRequest.Flags`. -func flagsAndTzToStatementContext(flags uint64, tz *time.Location) *stmtctx.StatementContext { +// flagsAndTzToSessionContext creates a sessionctx.Context from a `tipb.SelectRequest.Flags`. +func flagsAndTzToSessionContext(flags uint64, tz *time.Location) sessionctx.Context { sc := stmtctx.NewStmtCtx() sc.InitFromPBFlagAndTz(flags, tz) - return sc + sctx := mock.NewContext() + sctx.GetSessionVars().StmtCtx = sc + return sctx } // ErrLocked is returned when trying to Read/Write on a locked key. Client should diff --git a/pkg/store/mockstore/unistore/cophandler/cop_handler_test.go b/pkg/store/mockstore/unistore/cophandler/cop_handler_test.go index b3155d288ee64..1fc00fef1e18e 100644 --- a/pkg/store/mockstore/unistore/cophandler/cop_handler_test.go +++ b/pkg/store/mockstore/unistore/cophandler/cop_handler_test.go @@ -181,10 +181,10 @@ func isPrefixNext(key []byte, expected []byte) bool { func newDagContext(t require.TestingT, store *testStore, keyRanges []kv.KeyRange, dagReq *tipb.DAGRequest, startTs uint64) *dagContext { tz, err := timeutil.ConstructTimeZone(dagReq.TimeZoneName, int(dagReq.TimeZoneOffset)) require.NoError(t, err) - sc := flagsAndTzToStatementContext(dagReq.Flags, tz) + sctx := flagsAndTzToSessionContext(dagReq.Flags, tz) txn := store.db.NewTransaction(false) dagCtx := &dagContext{ - evalContext: &evalContext{sc: sc}, + evalContext: &evalContext{sctx: sctx}, dbReader: dbreader.NewDBReader(nil, []byte{255}, txn), lockStore: store.locks, dagReq: dagReq, diff --git a/pkg/store/mockstore/unistore/cophandler/main_test.go b/pkg/store/mockstore/unistore/cophandler/main_test.go index 70ebd2afc4fe2..fd3c1dcf82f35 100644 --- a/pkg/store/mockstore/unistore/cophandler/main_test.go +++ b/pkg/store/mockstore/unistore/cophandler/main_test.go @@ -25,6 +25,7 @@ func TestMain(m *testing.M) { testsetup.SetupForCommonTest() opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), diff --git a/pkg/store/mockstore/unistore/cophandler/mpp.go b/pkg/store/mockstore/unistore/cophandler/mpp.go index 876301ad53972..92f5507c3484e 100644 --- a/pkg/store/mockstore/unistore/cophandler/mpp.go +++ b/pkg/store/mockstore/unistore/cophandler/mpp.go @@ -27,7 +27,7 @@ import ( "github.com/pingcap/tidb/pkg/expression/aggregation" "github.com/pingcap/tidb/pkg/parser/model" "github.com/pingcap/tidb/pkg/parser/mysql" - "github.com/pingcap/tidb/pkg/sessionctx/stmtctx" + "github.com/pingcap/tidb/pkg/sessionctx" "github.com/pingcap/tidb/pkg/store/mockstore/unistore/client" "github.com/pingcap/tidb/pkg/store/mockstore/unistore/tikv/dbreader" "github.com/pingcap/tidb/pkg/tablecodec" @@ -54,7 +54,7 @@ const ( ) type mppExecBuilder struct { - sc *stmtctx.StatementContext + sctx sessionctx.Context dbReader *dbreader.DBReader mppCtx *MPPCtx dagReq *tipb.DAGRequest @@ -71,7 +71,7 @@ func (b *mppExecBuilder) buildMPPTableScan(pb *tipb.TableScan) (*tableScanExec, return nil, errors.Trace(err) } ts := &tableScanExec{ - baseMPPExec: baseMPPExec{sc: b.sc, mppCtx: b.mppCtx}, + baseMPPExec: baseMPPExec{sctx: b.sctx, mppCtx: b.mppCtx}, startTS: b.dagCtx.startTS, kvRanges: ranges, dbReader: b.dbReader, @@ -92,7 +92,7 @@ func (b *mppExecBuilder) buildMPPTableScan(pb *tipb.TableScan) (*tableScanExec, ft := fieldTypeFromPBColumn(col) ts.fieldTypes = append(ts.fieldTypes, ft) } - ts.decoder, err = newRowDecoder(pb.Columns, ts.fieldTypes, pb.PrimaryColumnIds, b.sc.TimeZone()) + ts.decoder, err = newRowDecoder(pb.Columns, ts.fieldTypes, pb.PrimaryColumnIds, b.sctx.GetSessionVars().StmtCtx.TimeZone()) return ts, err } @@ -102,7 +102,7 @@ func (b *mppExecBuilder) buildMPPPartitionTableScan(pb *tipb.PartitionTableScan) return nil, errors.Trace(err) } ts := &tableScanExec{ - baseMPPExec: baseMPPExec{sc: b.sc, mppCtx: b.mppCtx}, + baseMPPExec: baseMPPExec{sctx: b.sctx, mppCtx: b.mppCtx}, startTS: b.dagCtx.startTS, kvRanges: ranges, dbReader: b.dbReader, @@ -115,7 +115,7 @@ func (b *mppExecBuilder) buildMPPPartitionTableScan(pb *tipb.PartitionTableScan) ft := fieldTypeFromPBColumn(col) ts.fieldTypes = append(ts.fieldTypes, ft) } - ts.decoder, err = newRowDecoder(pb.Columns, ts.fieldTypes, pb.PrimaryColumnIds, b.sc.TimeZone()) + ts.decoder, err = newRowDecoder(pb.Columns, ts.fieldTypes, pb.PrimaryColumnIds, b.sctx.GetSessionVars().StmtCtx.TimeZone()) return ts, err } @@ -172,7 +172,7 @@ func (b *mppExecBuilder) buildIdxScan(pb *tipb.IndexScan) (*indexScanExec, error prevVals = make([][]byte, numIdxCols) } idxScan := &indexScanExec{ - baseMPPExec: baseMPPExec{sc: b.sc, fieldTypes: fieldTypes}, + baseMPPExec: baseMPPExec{sctx: b.sctx, fieldTypes: fieldTypes}, startTS: b.dagCtx.startTS, kvRanges: ranges, dbReader: b.dbReader, @@ -197,7 +197,7 @@ func (b *mppExecBuilder) buildLimit(pb *tipb.Limit) (*limitExec, error) { return nil, err } exec := &limitExec{ - baseMPPExec: baseMPPExec{sc: b.sc, mppCtx: b.mppCtx, fieldTypes: child.getFieldTypes(), children: []mppExec{child}}, + baseMPPExec: baseMPPExec{sctx: b.sctx, mppCtx: b.mppCtx, fieldTypes: child.getFieldTypes(), children: []mppExec{child}}, limit: pb.GetLimit(), } return exec, nil @@ -209,7 +209,7 @@ func (b *mppExecBuilder) buildExpand(pb *tipb.Expand) (mppExec, error) { return nil, err } exec := &expandExec{ - baseMPPExec: baseMPPExec{sc: b.sc, mppCtx: b.mppCtx, children: []mppExec{child}}, + baseMPPExec: baseMPPExec{sctx: b.sctx, mppCtx: b.mppCtx, children: []mppExec{child}}, } childFieldTypes := child.getFieldTypes() @@ -218,7 +218,7 @@ func (b *mppExecBuilder) buildExpand(pb *tipb.Expand) (mppExec, error) { for _, gs := range pb.GroupingSets { tidbGs := expression.GroupingSet{} for _, groupingExprs := range gs.GroupingExprs { - tidbGroupingExprs, err := convertToExprs(b.sc, childFieldTypes, groupingExprs.GroupingExpr) + tidbGroupingExprs, err := convertToExprs(b.sctx, childFieldTypes, groupingExprs.GroupingExpr) if err != nil { return nil, err } @@ -273,16 +273,16 @@ func (b *mppExecBuilder) buildTopN(pb *tipb.TopN) (mppExec, error) { totalCount: int(pb.Limit), topNSorter: topNSorter{ orderByItems: pb.OrderBy, - sc: b.sc, + sc: b.sctx.GetSessionVars().StmtCtx, }, } fieldTps := child.getFieldTypes() var conds []expression.Expression - if conds, err = convertToExprs(b.sc, fieldTps, pbConds); err != nil { + if conds, err = convertToExprs(b.sctx, fieldTps, pbConds); err != nil { return nil, errors.Trace(err) } exec := &topNExec{ - baseMPPExec: baseMPPExec{sc: b.sc, mppCtx: b.mppCtx, fieldTypes: fieldTps, children: []mppExec{child}}, + baseMPPExec: baseMPPExec{sctx: b.sctx, mppCtx: b.mppCtx, fieldTypes: fieldTps, children: []mppExec{child}}, heap: heap, conds: conds, row: newTopNSortRow(len(conds)), @@ -305,7 +305,7 @@ func (b *mppExecBuilder) buildMPPExchangeSender(pb *tipb.ExchangeSender) (*exchS e := &exchSenderExec{ baseMPPExec: baseMPPExec{ - sc: b.sc, + sctx: b.sctx, mppCtx: b.mppCtx, children: []mppExec{child}, fieldTypes: child.getFieldTypes(), @@ -315,7 +315,7 @@ func (b *mppExecBuilder) buildMPPExchangeSender(pb *tipb.ExchangeSender) (*exchS if pb.Tp == tipb.ExchangeType_Hash { // remove the limitation of len(pb.PartitionKeys) == 1 for _, partitionKey := range pb.PartitionKeys { - expr, err := expression.PBToExpr(partitionKey, child.getFieldTypes(), b.sc) + expr, err := expression.PBToExpr(b.sctx, partitionKey, child.getFieldTypes()) if err != nil { return nil, errors.Trace(err) } @@ -354,7 +354,7 @@ func (b *mppExecBuilder) buildMPPExchangeSender(pb *tipb.ExchangeSender) (*exchS func (b *mppExecBuilder) buildMPPExchangeReceiver(pb *tipb.ExchangeReceiver) (*exchRecvExec, error) { e := &exchRecvExec{ baseMPPExec: baseMPPExec{ - sc: b.sc, + sctx: b.sctx, mppCtx: b.mppCtx, }, exchangeReceiver: pb, @@ -373,7 +373,7 @@ func (b *mppExecBuilder) buildMPPExchangeReceiver(pb *tipb.ExchangeReceiver) (*e func (b *mppExecBuilder) buildMPPJoin(pb *tipb.Join, children []*tipb.Executor) (*joinExec, error) { e := &joinExec{ baseMPPExec: baseMPPExec{ - sc: b.sc, + sctx: b.sctx, mppCtx: b.mppCtx, }, Join: pb, @@ -412,12 +412,12 @@ func (b *mppExecBuilder) buildMPPJoin(pb *tipb.Join, children []*tipb.Executor) if pb.InnerIdx == 1 { e.probeChild = leftCh e.buildChild = rightCh - probeExpr, err := expression.PBToExpr(pb.LeftJoinKeys[0], leftCh.getFieldTypes(), b.sc) + probeExpr, err := expression.PBToExpr(b.sctx, pb.LeftJoinKeys[0], leftCh.getFieldTypes()) if err != nil { return nil, errors.Trace(err) } e.probeKey = probeExpr.(*expression.Column) - buildExpr, err := expression.PBToExpr(pb.RightJoinKeys[0], rightCh.getFieldTypes(), b.sc) + buildExpr, err := expression.PBToExpr(b.sctx, pb.RightJoinKeys[0], rightCh.getFieldTypes()) if err != nil { return nil, errors.Trace(err) } @@ -425,12 +425,12 @@ func (b *mppExecBuilder) buildMPPJoin(pb *tipb.Join, children []*tipb.Executor) } else { e.probeChild = rightCh e.buildChild = leftCh - buildExpr, err := expression.PBToExpr(pb.LeftJoinKeys[0], leftCh.getFieldTypes(), b.sc) + buildExpr, err := expression.PBToExpr(b.sctx, pb.LeftJoinKeys[0], leftCh.getFieldTypes()) if err != nil { return nil, errors.Trace(err) } e.buildKey = buildExpr.(*expression.Column) - probeExpr, err := expression.PBToExpr(pb.RightJoinKeys[0], rightCh.getFieldTypes(), b.sc) + probeExpr, err := expression.PBToExpr(b.sctx, pb.RightJoinKeys[0], rightCh.getFieldTypes()) if err != nil { return nil, errors.Trace(err) } @@ -445,7 +445,12 @@ func (b *mppExecBuilder) buildMPPJoin(pb *tipb.Join, children []*tipb.Executor) } func (b *mppExecBuilder) buildMPPProj(proj *tipb.Projection) (*projExec, error) { - e := &projExec{} + e := &projExec{ + baseMPPExec: baseMPPExec{ + sctx: b.sctx, + mppCtx: b.mppCtx, + }, + } chExec, err := b.buildMPPExecutor(proj.Child) if err != nil { @@ -454,7 +459,7 @@ func (b *mppExecBuilder) buildMPPProj(proj *tipb.Projection) (*projExec, error) e.children = []mppExec{chExec} for _, pbExpr := range proj.Exprs { - expr, err := expression.PBToExpr(pbExpr, chExec.getFieldTypes(), b.sc) + expr, err := expression.PBToExpr(b.sctx, pbExpr, chExec.getFieldTypes()) if err != nil { return nil, errors.Trace(err) } @@ -472,14 +477,14 @@ func (b *mppExecBuilder) buildMPPSel(sel *tipb.Selection) (*selExec, error) { e := &selExec{ baseMPPExec: baseMPPExec{ fieldTypes: chExec.getFieldTypes(), - sc: b.sc, + sctx: b.sctx, mppCtx: b.mppCtx, children: []mppExec{chExec}, }, } for _, pbExpr := range sel.Conditions { - expr, err := expression.PBToExpr(pbExpr, chExec.getFieldTypes(), b.sc) + expr, err := expression.PBToExpr(b.sctx, pbExpr, chExec.getFieldTypes()) if err != nil { return nil, errors.Trace(err) } @@ -490,6 +495,10 @@ func (b *mppExecBuilder) buildMPPSel(sel *tipb.Selection) (*selExec, error) { func (b *mppExecBuilder) buildMPPAgg(agg *tipb.Aggregation) (*aggExec, error) { e := &aggExec{ + baseMPPExec: baseMPPExec{ + sctx: b.sctx, + mppCtx: b.mppCtx, + }, groups: make(map[string]struct{}), aggCtxsMap: make(map[string][]*aggregation.AggEvaluateContext), processed: false, @@ -503,19 +512,19 @@ func (b *mppExecBuilder) buildMPPAgg(agg *tipb.Aggregation) (*aggExec, error) { for _, aggFunc := range agg.AggFunc { ft := expression.PbTypeToFieldType(aggFunc.FieldType) e.fieldTypes = append(e.fieldTypes, ft) - aggExpr, err := aggregation.NewDistAggFunc(aggFunc, chExec.getFieldTypes(), b.sc) + aggExpr, err := aggregation.NewDistAggFunc(aggFunc, chExec.getFieldTypes(), b.sctx) if err != nil { return nil, errors.Trace(err) } e.aggExprs = append(e.aggExprs, aggExpr) } - e.sc = b.sc + e.sctx = b.sctx for _, gby := range agg.GroupBy { ft := expression.PbTypeToFieldType(gby.FieldType) e.fieldTypes = append(e.fieldTypes, ft) e.groupByTypes = append(e.groupByTypes, ft) - gbyExpr, err := expression.PBToExpr(gby, chExec.getFieldTypes(), b.sc) + gbyExpr, err := expression.PBToExpr(b.sctx, gby, chExec.getFieldTypes()) if err != nil { return nil, errors.Trace(err) } @@ -578,7 +587,7 @@ func HandleMPPDAGReq(dbReader *dbreader.DBReader, req *coprocessor.Request, mppC builder := mppExecBuilder{ dbReader: dbReader, mppCtx: mppCtx, - sc: flagsAndTzToStatementContext(dagReq.Flags, tz), + sctx: flagsAndTzToSessionContext(dagReq.Flags, tz), dagReq: dagReq, dagCtx: dagCtx, } diff --git a/pkg/store/mockstore/unistore/cophandler/mpp_exec.go b/pkg/store/mockstore/unistore/cophandler/mpp_exec.go index ea3d450f79dca..ca2c7d600c424 100644 --- a/pkg/store/mockstore/unistore/cophandler/mpp_exec.go +++ b/pkg/store/mockstore/unistore/cophandler/mpp_exec.go @@ -32,7 +32,7 @@ import ( "github.com/pingcap/tidb/pkg/expression/aggregation" "github.com/pingcap/tidb/pkg/kv" "github.com/pingcap/tidb/pkg/parser/mysql" - "github.com/pingcap/tidb/pkg/sessionctx/stmtctx" + "github.com/pingcap/tidb/pkg/sessionctx" "github.com/pingcap/tidb/pkg/store/mockstore/unistore/lockstore" "github.com/pingcap/tidb/pkg/store/mockstore/unistore/tikv/dbreader" "github.com/pingcap/tidb/pkg/tablecodec" @@ -61,7 +61,7 @@ type mppExec interface { } type baseMPPExec struct { - sc *stmtctx.StatementContext + sctx sessionctx.Context mppCtx *MPPCtx @@ -304,7 +304,7 @@ func (e *indexScanExec) Process(key, value []byte) error { e.prevVals[i] = append(e.prevVals[i][:0], values[i]...) } } - decoder := codec.NewDecoder(e.chk, e.sc.TimeZone()) + decoder := codec.NewDecoder(e.chk, e.sctx.GetSessionVars().StmtCtx.TimeZone()) for i, value := range values { if i < len(e.fieldTypes) { _, err = decoder.DecodeOne(value, i, e.fieldTypes[i]) @@ -559,7 +559,7 @@ func (e *topNExec) open() error { for i := 0; i < numRows; i++ { row := chk.GetRow(i) for j, cond := range e.conds { - d, err := cond.EvalWithInnerCtx(row) + d, err := cond.Eval(e.sctx, row) if err != nil { return err } @@ -611,6 +611,7 @@ func (e *exchSenderExec) open() error { func (e *exchSenderExec) toTiPBChunk(chk *chunk.Chunk) ([]tipb.Chunk, error) { var oldRow []types.Datum oldChunks := make([]tipb.Chunk, 0) + sc := e.sctx.GetSessionVars().StmtCtx for i := 0; i < chk.NumRows(); i++ { oldRow = oldRow[:0] for _, outputOff := range e.outputOffsets { @@ -619,8 +620,8 @@ func (e *exchSenderExec) toTiPBChunk(chk *chunk.Chunk) ([]tipb.Chunk, error) { } var err error var oldRowBuf []byte - oldRowBuf, err = codec.EncodeValue(e.sc.TimeZone(), oldRowBuf[:0], oldRow...) - err = e.sc.HandleError(err) + oldRowBuf, err = codec.EncodeValue(sc.TimeZone(), oldRowBuf[:0], oldRow...) + err = sc.HandleError(err) if err != nil { return nil, errors.Trace(err) } @@ -641,6 +642,8 @@ func (e *exchSenderExec) next() (*chunk.Chunk, error) { panic(err) } }() + + sc := e.sctx.GetSessionVars().StmtCtx for { chk, err := e.children[0].next() if err != nil { @@ -664,7 +667,7 @@ func (e *exchSenderExec) next() (*chunk.Chunk, error) { hashVals.Reset() // use hash values to get unique uint64 to mod. // collect all the hash key datum. - err := codec.HashChunkRow(e.sc.TypeCtx(), hashVals, row, e.hashKeyTypes, e.hashKeyOffsets, payload) + err := codec.HashChunkRow(sc.TypeCtx(), hashVals, row, e.hashKeyTypes, e.hashKeyOffsets, payload) if err != nil { for _, tunnel := range e.tunnels { tunnel.ErrCh <- err @@ -851,7 +854,7 @@ type joinExec struct { } func (e *joinExec) getHashKey(keyCol types.Datum) (str string, err error) { - keyCol, err = keyCol.ConvertTo(e.sc.TypeCtx(), e.comKeyTp) + keyCol, err = keyCol.ConvertTo(e.sctx.GetSessionVars().StmtCtx.TypeCtx(), e.comKeyTp) if err != nil { return str, errors.Trace(err) } @@ -1007,14 +1010,15 @@ func (e *aggExec) getGroupKey(row chunk.Row) (*chunk.MutRow, []byte, error) { } key := make([]byte, 0, DefaultBatchSize) gbyRow := chunk.MutRowFromTypes(e.groupByTypes) + sc := e.sctx.GetSessionVars().StmtCtx for i, item := range e.groupByExprs { - v, err := item.EvalWithInnerCtx(row) + v, err := item.Eval(e.sctx, row) if err != nil { return nil, nil, errors.Trace(err) } gbyRow.SetDatum(i, v) - b, err := codec.EncodeValue(e.sc.TimeZone(), nil, v) - err = e.sc.HandleError(err) + b, err := codec.EncodeValue(sc.TimeZone(), nil, v) + err = sc.HandleError(err) if err != nil { return nil, nil, errors.Trace(err) } @@ -1028,7 +1032,7 @@ func (e *aggExec) getContexts(groupKey []byte) []*aggregation.AggEvaluateContext if !ok { aggCtxs = make([]*aggregation.AggEvaluateContext, 0, len(e.aggExprs)) for _, agg := range e.aggExprs { - aggCtxs = append(aggCtxs, agg.CreateContext(e.sc)) + aggCtxs = append(aggCtxs, agg.CreateContext(e.sctx)) } e.aggCtxsMap[string(groupKey)] = aggCtxs } @@ -1061,7 +1065,7 @@ func (e *aggExec) processAllRows() (*chunk.Chunk, error) { aggCtxs := e.getContexts(gk) for i, agg := range e.aggExprs { - err = agg.Update(aggCtxs[i], e.sc, row) + err = agg.Update(aggCtxs[i], e.sctx.GetSessionVars().StmtCtx, row) if err != nil { return nil, errors.Trace(err) } @@ -1078,7 +1082,7 @@ func (e *aggExec) processAllRows() (*chunk.Chunk, error) { result := agg.GetResult(aggCtxs[i]) if e.fieldTypes[i].GetType() == mysql.TypeLonglong && result.Kind() == types.KindMysqlDecimal { var err error - result, err = result.ConvertTo(e.sc.TypeCtx(), e.fieldTypes[i]) + result, err = result.ConvertTo(e.sctx.GetSessionVars().StmtCtx.TypeCtx(), e.fieldTypes[i]) if err != nil { return nil, errors.Trace(err) } @@ -1127,7 +1131,7 @@ func (e *selExec) next() (*chunk.Chunk, error) { row := chk.GetRow(rows) passCheck := true for _, cond := range e.conditions { - d, err := cond.EvalWithInnerCtx(row) + d, err := cond.Eval(e.sctx, row) if err != nil { return nil, errors.Trace(err) } @@ -1135,11 +1139,7 @@ func (e *selExec) next() (*chunk.Chunk, error) { if d.IsNull() { passCheck = false } else { - isBool, err := d.ToBool(e.sc.TypeCtx()) - if err != nil { - return nil, errors.Trace(err) - } - isBool, err = expression.HandleOverflowOnSelection(e.sc, isBool, err) + isBool, err := d.ToBool(e.sctx.GetSessionVars().StmtCtx.TypeCtx()) if err != nil { return nil, errors.Trace(err) } @@ -1182,7 +1182,7 @@ func (e *projExec) next() (*chunk.Chunk, error) { row := chk.GetRow(i) newRow := chunk.MutRowFromTypes(e.fieldTypes) for i, expr := range e.exprs { - d, err := expr.EvalWithInnerCtx(row) + d, err := expr.Eval(e.sctx, row) if err != nil { return nil, errors.Trace(err) } diff --git a/pkg/store/mockstore/unistore/lockstore/main_test.go b/pkg/store/mockstore/unistore/lockstore/main_test.go index 06fbeddf91b88..643cde4e511b1 100644 --- a/pkg/store/mockstore/unistore/lockstore/main_test.go +++ b/pkg/store/mockstore/unistore/lockstore/main_test.go @@ -25,6 +25,7 @@ func TestMain(m *testing.M) { testsetup.SetupForCommonTest() opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), diff --git a/pkg/store/mockstore/unistore/main_test.go b/pkg/store/mockstore/unistore/main_test.go index 956f743a5513d..4809b412bc2a0 100644 --- a/pkg/store/mockstore/unistore/main_test.go +++ b/pkg/store/mockstore/unistore/main_test.go @@ -25,6 +25,7 @@ func TestMain(m *testing.M) { testsetup.SetupForCommonTest() opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), diff --git a/pkg/store/mockstore/unistore/mock.go b/pkg/store/mockstore/unistore/mock.go index d96426491c5ca..3cf178750ea0c 100644 --- a/pkg/store/mockstore/unistore/mock.go +++ b/pkg/store/mockstore/unistore/mock.go @@ -16,6 +16,8 @@ package unistore import ( "os" + spath "path" + "strings" "github.com/pingcap/errors" usconf "github.com/pingcap/tidb/pkg/store/mockstore/unistore/config" @@ -31,6 +33,8 @@ func New(path string) (*RPCClient, pd.Client, *Cluster, error) { if path, err = os.MkdirTemp("", "tidb-unistore-temp"); err != nil { return nil, nil, nil, err } + } + if strings.HasPrefix(path, spath.Join(os.TempDir(), "tidb-unistore-temp")) { persistent = false } diff --git a/pkg/store/mockstore/unistore/pd.go b/pkg/store/mockstore/unistore/pd.go index 04b6bae42ee14..f6325088a1032 100644 --- a/pkg/store/mockstore/unistore/pd.go +++ b/pkg/store/mockstore/unistore/pd.go @@ -165,7 +165,7 @@ func (c *pdClient) SplitAndScatterRegions(ctx context.Context, splitKeys [][]byt return nil, nil } -func (c *pdClient) GetRegionFromMember(ctx context.Context, key []byte, memberURLs []string) (*pd.Region, error) { +func (c *pdClient) GetRegionFromMember(ctx context.Context, key []byte, memberURLs []string, opts ...pd.GetRegionOption) (*pd.Region, error) { return nil, nil } diff --git a/pkg/store/mockstore/unistore/tikv/main_test.go b/pkg/store/mockstore/unistore/tikv/main_test.go index 68820867df647..8245d7b8587ba 100644 --- a/pkg/store/mockstore/unistore/tikv/main_test.go +++ b/pkg/store/mockstore/unistore/tikv/main_test.go @@ -25,6 +25,7 @@ func TestMain(m *testing.M) { testsetup.SetupForCommonTest() opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), diff --git a/pkg/store/mockstore/unistore/tikv/mock_region.go b/pkg/store/mockstore/unistore/tikv/mock_region.go index 41a4da282cd37..f54de9a570e75 100644 --- a/pkg/store/mockstore/unistore/tikv/mock_region.go +++ b/pkg/store/mockstore/unistore/tikv/mock_region.go @@ -369,6 +369,8 @@ func (rm *MockRegionManager) SplitTable(tableID int64, count int) { tableStart := tablecodec.GenTableRecordPrefix(tableID) tableEnd := tableStart.PrefixNext() keys := rm.calculateSplitKeys(tableStart, tableEnd, count) + rm.mu.Lock() + defer rm.mu.Unlock() if _, err := rm.splitKeys(keys); err != nil { panic(err) } @@ -379,6 +381,8 @@ func (rm *MockRegionManager) SplitIndex(tableID, indexID int64, count int) { indexStart := tablecodec.EncodeTableIndexPrefix(tableID, indexID) indexEnd := indexStart.PrefixNext() keys := rm.calculateSplitKeys(indexStart, indexEnd, count) + rm.mu.Lock() + defer rm.mu.Unlock() if _, err := rm.splitKeys(keys); err != nil { panic(err) } @@ -387,22 +391,71 @@ func (rm *MockRegionManager) SplitIndex(tableID, indexID int64, count int) { // SplitKeys evenly splits the start, end key into "count" regions. func (rm *MockRegionManager) SplitKeys(start, end kv.Key, count int) { keys := rm.calculateSplitKeys(start, end, count) + rm.mu.Lock() + defer rm.mu.Unlock() if _, err := rm.splitKeys(keys); err != nil { panic(err) } } +// SplitArbitrary splits the cluster by the split point manually provided. +// The keys provided are raw key. +func (rm *MockRegionManager) SplitArbitrary(keys ...[]byte) { + splitKeys := make([][]byte, 0, len(keys)) + for _, key := range keys { + encKey := codec.EncodeBytes(nil, key) + splitKeys = append(splitKeys, encKey) + } + if _, err := rm.splitKeys(splitKeys); err != nil { + panic(err) + } +} + // SplitRegion implements the RegionManager interface. func (rm *MockRegionManager) SplitRegion(req *kvrpcpb.SplitRegionRequest) *kvrpcpb.SplitRegionResponse { - if _, err := rm.GetRegionFromCtx(req.Context); err != nil { - return &kvrpcpb.SplitRegionResponse{RegionError: err} - } splitKeys := make([][]byte, 0, len(req.SplitKeys)) for _, rawKey := range req.SplitKeys { splitKeys = append(splitKeys, codec.EncodeBytes(nil, rawKey)) } slices.SortFunc(splitKeys, bytes.Compare) + ctxPeer := req.Context.GetPeer() + if ctxPeer != nil { + _, err := rm.GetStoreAddrByStoreID(ctxPeer.GetStoreId()) + if err != nil { + return &kvrpcpb.SplitRegionResponse{RegionError: &errorpb.Error{ + Message: "store not match", + StoreNotMatch: &errorpb.StoreNotMatch{}, + }} + } + } + + rm.mu.Lock() + defer rm.mu.Unlock() + ri := rm.regions[req.Context.RegionId] + if ri == nil { + return &kvrpcpb.SplitRegionResponse{RegionError: &errorpb.Error{ + Message: "region not found", + RegionNotFound: &errorpb.RegionNotFound{ + RegionId: req.Context.GetRegionId(), + }, + }} + } + // Region epoch does not match. + if rm.isEpochStale(ri.getRegionEpoch(), req.Context.GetRegionEpoch()) { + return &kvrpcpb.SplitRegionResponse{RegionError: &errorpb.Error{ + Message: "stale epoch", + EpochNotMatch: &errorpb.EpochNotMatch{ + CurrentRegions: []*metapb.Region{{ + Id: ri.meta.Id, + StartKey: ri.meta.StartKey, + EndKey: ri.meta.EndKey, + RegionEpoch: ri.getRegionEpoch(), + Peers: ri.meta.Peers, + }}, + }, + }} + } newRegions, err := rm.splitKeys(splitKeys) if err != nil { return &kvrpcpb.SplitRegionResponse{RegionError: &errorpb.Error{Message: err.Error()}} @@ -448,8 +501,8 @@ func (rm *MockRegionManager) calculateSplitKeys(start, end []byte, count int) [] return splitKeys } +// Should call `rm.mu.Lock()` before call this method. func (rm *MockRegionManager) splitKeys(keys [][]byte) ([]*regionCtx, error) { - rm.mu.Lock() newRegions := make([]*regionCtx, 0, len(keys)) rm.sortedRegions.AscendGreaterOrEqual(newBtreeSearchItem(keys[0]), func(item btree.Item) bool { if len(keys) == 0 { @@ -513,7 +566,6 @@ func (rm *MockRegionManager) splitKeys(keys [][]byte) ([]*regionCtx, error) { rm.regions[region.meta.Id] = region rm.sortedRegions.ReplaceOrInsert(newBtreeItem(region)) } - rm.mu.Unlock() return newRegions, rm.saveRegions(newRegions) } @@ -590,7 +642,7 @@ func (rm *MockRegionManager) saveRegions(regions []*regionCtx) error { // Limit limits the maximum number of regions returned. // If a region has no leader, corresponding leader will be placed by a peer // with empty value (PeerID is 0). -func (rm *MockRegionManager) ScanRegions(startKey, endKey []byte, limit int) []*pdclient.Region { +func (rm *MockRegionManager) ScanRegions(startKey, endKey []byte, limit int, _ ...pdclient.GetRegionOption) []*pdclient.Region { rm.mu.RLock() defer rm.mu.RUnlock() @@ -854,8 +906,8 @@ func (pd *MockPD) GetAllStores(ctx context.Context, opts ...pdclient.GetStoreOpt // Limit limits the maximum number of regions returned. // If a region has no leader, corresponding leader will be placed by a peer // with empty value (PeerID is 0). -func (pd *MockPD) ScanRegions(ctx context.Context, startKey []byte, endKey []byte, limit int) ([]*pdclient.Region, error) { - regions := pd.rm.ScanRegions(startKey, endKey, limit) +func (pd *MockPD) ScanRegions(ctx context.Context, startKey []byte, endKey []byte, limit int, opts ...pdclient.GetRegionOption) ([]*pdclient.Region, error) { + regions := pd.rm.ScanRegions(startKey, endKey, limit, opts...) return regions, nil } diff --git a/pkg/store/mockstore/unistore/util/lockwaiter/main_test.go b/pkg/store/mockstore/unistore/util/lockwaiter/main_test.go index 9a8c5400c95c3..f1db70b2b3353 100644 --- a/pkg/store/mockstore/unistore/util/lockwaiter/main_test.go +++ b/pkg/store/mockstore/unistore/util/lockwaiter/main_test.go @@ -25,6 +25,7 @@ func TestMain(m *testing.M) { testsetup.SetupForCommonTest() opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), diff --git a/pkg/store/store_test.go b/pkg/store/store_test.go index a05ea58be6fac..6185c3bab03a6 100644 --- a/pkg/store/store_test.go +++ b/pkg/store/store_test.go @@ -169,7 +169,7 @@ func TestGetSet(t *testing.T) { } func TestSeek(t *testing.T) { - store, err := mockstore.NewMockStore() + store, err := mockstore.NewMockStore(mockstore.WithStoreType(mockstore.EmbedUnistore)) require.NoError(t, err) defer func() { require.NoError(t, store.Close()) @@ -337,7 +337,7 @@ func TestSetNil(t *testing.T) { } func TestBasicSeek(t *testing.T) { - store, err := mockstore.NewMockStore() + store, err := mockstore.NewMockStore(mockstore.WithStoreType(mockstore.EmbedUnistore)) require.NoError(t, err) defer func() { require.NoError(t, store.Close()) diff --git a/pkg/structure/main_test.go b/pkg/structure/main_test.go index a8e0eeaa9c7fb..ac8e6daff992a 100644 --- a/pkg/structure/main_test.go +++ b/pkg/structure/main_test.go @@ -25,6 +25,7 @@ func TestMain(m *testing.M) { testsetup.SetupForCommonTest() opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), diff --git a/pkg/structure/string.go b/pkg/structure/string.go index 0fc37c5b0b7f4..d916eb10ded5c 100644 --- a/pkg/structure/string.go +++ b/pkg/structure/string.go @@ -67,6 +67,34 @@ func (t *TxStructure) Inc(key []byte, step int64) (int64, error) { return n, errors.Trace(err) } +// Iterate iterates all keys in the same prefix. +func (t *TxStructure) Iterate(key, upperBound []byte, fn func(k []byte, v []byte) error) error { + dataPrefix := t.EncodeStringDataKey(key) + upperBoundDataPrefix := t.EncodeStringDataKey(upperBound) + it, err := t.reader.Iter(dataPrefix, upperBoundDataPrefix) + if err != nil { + return errors.Trace(err) + } + + for it.Valid() { + k, err := t.decodeStringDataKey(it.Key()) + if err != nil { + return errors.Trace(err) + } + + if err = fn(k, it.Value()); err != nil { + return errors.Trace(err) + } + + err = it.Next() + if err != nil { + return errors.Trace(err) + } + } + + return nil +} + // Clear removes the string value of the key. func (t *TxStructure) Clear(key []byte) error { if t.readWriter == nil { diff --git a/pkg/structure/structure_test.go b/pkg/structure/structure_test.go index 1a95bb5dedbc7..92b31824f6351 100644 --- a/pkg/structure/structure_test.go +++ b/pkg/structure/structure_test.go @@ -39,6 +39,12 @@ func TestString(t *testing.T) { err = tx.Set(key, value) require.NoError(t, err) + tx.Iterate([]byte("a"), []byte("b"), func(k, v []byte) error { + require.Equal(t, k, key) + require.Equal(t, v, value) + return nil + }) + v, err := tx.Get(key) require.NoError(t, err) require.Equal(t, value, v) diff --git a/pkg/structure/type.go b/pkg/structure/type.go index 88b8223600653..3741acef6a3be 100644 --- a/pkg/structure/type.go +++ b/pkg/structure/type.go @@ -53,6 +53,34 @@ func (t *TxStructure) EncodeStringDataKey(key []byte) kv.Key { return codec.EncodeUint(ek, uint64(StringData)) } +func (t *TxStructure) decodeStringDataKey(ek kv.Key) ([]byte, error) { + var ( + key []byte + err error + tp uint64 + ) + + if !bytes.HasPrefix(ek, t.prefix) { + return nil, errors.New("invalid encoded hash data key prefix") + } + + ek = ek[len(t.prefix):] + + ek, key, err = codec.DecodeBytes(ek, nil) + if err != nil { + return nil, errors.Trace(err) + } + + ek, tp, err = codec.DecodeUint(ek) + if err != nil { + return nil, errors.Trace(err) + } else if TypeFlag(tp) != StringData { + return nil, ErrInvalidHashKeyFlag.GenWithStack("invalid encoded string data key flag %c", byte(tp)) + } + + return key, errors.Trace(err) +} + // nolint:unused func (t *TxStructure) encodeHashMetaKey(key []byte) kv.Key { ek := make([]byte, 0, len(t.prefix)+codec.EncodedBytesLength(len(key))+8) diff --git a/pkg/table/BUILD.bazel b/pkg/table/BUILD.bazel index 8f5df5622c166..f9e72c9866dab 100644 --- a/pkg/table/BUILD.bazel +++ b/pkg/table/BUILD.bazel @@ -11,6 +11,7 @@ go_library( importpath = "github.com/pingcap/tidb/pkg/table", visibility = ["//visibility:public"], deps = [ + "//pkg/errctx", "//pkg/errno", "//pkg/expression", "//pkg/kv", @@ -27,6 +28,7 @@ go_library( "//pkg/util/chunk", "//pkg/util/dbterror", "//pkg/util/hack", + "//pkg/util/intest", "//pkg/util/logutil", "//pkg/util/mock", "//pkg/util/sqlexec", @@ -50,6 +52,7 @@ go_test( race = "on", shard_count = 9, deps = [ + "//pkg/errctx", "//pkg/errno", "//pkg/expression", "//pkg/parser/ast", diff --git a/pkg/table/column.go b/pkg/table/column.go index dfaa736290f69..d14bce08b1236 100644 --- a/pkg/table/column.go +++ b/pkg/table/column.go @@ -25,6 +25,7 @@ import ( "time" "github.com/pingcap/errors" + "github.com/pingcap/tidb/pkg/errctx" "github.com/pingcap/tidb/pkg/expression" "github.com/pingcap/tidb/pkg/parser" "github.com/pingcap/tidb/pkg/parser/ast" @@ -33,10 +34,10 @@ import ( "github.com/pingcap/tidb/pkg/parser/mysql" field_types "github.com/pingcap/tidb/pkg/parser/types" "github.com/pingcap/tidb/pkg/sessionctx" - "github.com/pingcap/tidb/pkg/sessionctx/stmtctx" "github.com/pingcap/tidb/pkg/types" "github.com/pingcap/tidb/pkg/util/chunk" "github.com/pingcap/tidb/pkg/util/hack" + "github.com/pingcap/tidb/pkg/util/intest" "github.com/pingcap/tidb/pkg/util/logutil" "github.com/pingcap/tidb/pkg/util/timeutil" "go.uber.org/zap" @@ -46,11 +47,40 @@ import ( type Column struct { *model.ColumnInfo // If this column is a generated column, the expression will be stored here. - GeneratedExpr ast.ExprNode + GeneratedExpr *ClonableExprNode // If this column has default expr value, this expression will be stored here. DefaultExpr ast.ExprNode } +// ClonableExprNode is a wrapper for ast.ExprNode. +type ClonableExprNode struct { + ctor func() ast.ExprNode + internal ast.ExprNode +} + +// NewClonableExprNode creates a ClonableExprNode. +func NewClonableExprNode(ctor func() ast.ExprNode, internal ast.ExprNode) *ClonableExprNode { + return &ClonableExprNode{ + ctor: ctor, + internal: internal, + } +} + +// Clone makes a "copy" of internal ast.ExprNode by reconstructing it. +func (n *ClonableExprNode) Clone() ast.ExprNode { + intest.AssertNotNil(n.ctor) + if n.ctor == nil { + return n.internal + } + return n.ctor() +} + +// Internal returns the reference of the internal ast.ExprNode. +// Note: only use this method when you are sure that the internal ast.ExprNode is not modified concurrently. +func (n *ClonableExprNode) Internal() ast.ExprNode { + return n.internal +} + // String implements fmt.Stringer interface. func (c *Column) String() string { ans := []string{c.Name.O, types.TypeToStr(c.GetType(), c.GetCharset())} @@ -227,7 +257,7 @@ func handleZeroDatetime(ctx sessionctx.Context, col *model.ColumnInfo, casted ty // if NO_ZERO_IN_DATE is enabled, dates with zero parts are inserted as '0000-00-00' and produce a warning // If NO_ZERO_IN_DATE mode and strict mode are enabled, dates with zero parts are not permitted and inserts produce an error, unless IGNORE is given as well. For INSERT IGNORE and UPDATE IGNORE, dates with zero parts are inserted as '0000-00-00' and produce a warning. - ignoreErr := sc.DupKeyAsWarning + ignoreErr := sc.ErrGroupLevel(errctx.ErrGroupDupKey) != errctx.LevelError // Timestamp in MySQL is since EPOCH 1970-01-01 00:00:00 UTC and can by definition not have invalid dates! // Zero date is special for MySQL timestamp and *NOT* 1970-01-01 00:00:00, but 0000-00-00 00:00:00! @@ -242,9 +272,9 @@ func handleZeroDatetime(ctx sessionctx.Context, col *model.ColumnInfo, casted ty // * **ST**: STRICT_TRANS_TABLES // * **ELSE**: empty or NO_ZERO_IN_DATE_MODE if tm.IsZero() && col.GetType() == mysql.TypeTimestamp { - innerErr := types.ErrWrongValue.GenWithStackByArgs(zeroT, str) + innerErr := types.ErrWrongValue.FastGenByArgs(zeroT, str) if mode.HasStrictMode() && !ignoreErr && (tmIsInvalid || mode.HasNoZeroDateMode()) { - return types.NewDatum(zeroV), true, innerErr + return types.NewDatum(zeroV), true, errors.Trace(innerErr) } if tmIsInvalid || mode.HasNoZeroDateMode() { @@ -253,11 +283,12 @@ func handleZeroDatetime(ctx sessionctx.Context, col *model.ColumnInfo, casted ty return types.NewDatum(zeroV), true, nil } else if tmIsInvalid && col.GetType() == mysql.TypeTimestamp { // Prevent from being stored! Invalid timestamp! + warn := types.ErrWrongValue.FastGenByArgs(zeroT, str) if mode.HasStrictMode() { - return types.NewDatum(zeroV), true, types.ErrWrongValue.GenWithStackByArgs(zeroT, str) + return types.NewDatum(zeroV), true, errors.Trace(warn) } // no strict mode, truncate to 0000-00-00 00:00:00 - sc.AppendWarning(types.ErrWrongValue.GenWithStackByArgs(zeroT, str)) + sc.AppendWarning(warn) return types.NewDatum(zeroV), true, nil } else if tm.IsZero() || tm.InvalidZero() { if tm.IsZero() { @@ -271,9 +302,9 @@ func handleZeroDatetime(ctx sessionctx.Context, col *model.ColumnInfo, casted ty } } - innerErr := types.ErrWrongValue.GenWithStackByArgs(zeroT, str) + innerErr := types.ErrWrongValue.FastGenByArgs(zeroT, str) if mode.HasStrictMode() && !ignoreErr { - return types.NewDatum(zeroV), true, innerErr + return types.NewDatum(zeroV), true, errors.Trace(innerErr) } // TODO: as in MySQL 8.0's implement, warning message is `types.ErrWarnDataOutOfRange`, @@ -323,7 +354,6 @@ func CastValue(ctx sessionctx.Context, val types.Datum, col *model.ColumnInfo, r } err = sc.HandleTruncate(err) - err = sc.HandleOverflow(err, err) if forceIgnoreTruncate { err = nil @@ -463,10 +493,9 @@ func (c *Column) CheckNotNull(data *types.Datum, rowCntInLoadData uint64) error // error is ErrWarnNullToNotnull. // Otherwise, the error is ErrColumnCantNull. // If BadNullAsWarning is true, it will append the error as a warning, else return the error. -func (c *Column) HandleBadNull(d *types.Datum, sc *stmtctx.StatementContext, rowCntInLoadData uint64) error { +func (c *Column) HandleBadNull(ec errctx.Context, d *types.Datum, rowCntInLoadData uint64) error { if err := c.CheckNotNull(d, rowCntInLoadData); err != nil { - if sc.BadNullAsWarning { - sc.AppendWarning(err) + if ec.HandleError(err) == nil { *d = GetZeroValue(c.ToInfo()) return nil } @@ -625,8 +654,8 @@ func getColDefaultValueFromNil(ctx sessionctx.Context, col *model.ColumnInfo, ar return types.Datum{}, nil } } - if sc.BadNullAsWarning { - sc.AppendWarning(ErrColumnCantNull.FastGenByArgs(col.Name)) + ec := sc.ErrCtx() + if ec.HandleError(ErrColumnCantNull.FastGenByArgs(col.Name)) == nil { return GetZeroValue(col), nil } return types.Datum{}, ErrNoDefaultValue.GenWithStackByArgs(col.Name) diff --git a/pkg/table/column_test.go b/pkg/table/column_test.go index c951fdf60e79f..140d04de41701 100644 --- a/pkg/table/column_test.go +++ b/pkg/table/column_test.go @@ -18,6 +18,7 @@ import ( "fmt" "testing" + "github.com/pingcap/tidb/pkg/errctx" "github.com/pingcap/tidb/pkg/expression" "github.com/pingcap/tidb/pkg/parser/ast" "github.com/pingcap/tidb/pkg/parser/charset" @@ -130,18 +131,20 @@ func TestHandleBadNull(t *testing.T) { col := newCol("a") sc := stmtctx.NewStmtCtx() d := types.Datum{} - err := col.HandleBadNull(&d, sc, 0) + err := col.HandleBadNull(sc.ErrCtx(), &d, 0) require.NoError(t, err) cmp, err := d.Compare(sc.TypeCtx(), &types.Datum{}, collate.GetBinaryCollator()) require.NoError(t, err) require.Equal(t, 0, cmp) col.AddFlag(mysql.NotNullFlag) - err = col.HandleBadNull(&types.Datum{}, sc, 0) + err = col.HandleBadNull(sc.ErrCtx(), &types.Datum{}, 0) require.Error(t, err) - sc.BadNullAsWarning = true - err = col.HandleBadNull(&types.Datum{}, sc, 0) + var levels errctx.LevelMap + levels[errctx.ErrGroupBadNull] = errctx.LevelWarn + sc.SetErrLevels(levels) + err = col.HandleBadNull(sc.ErrCtx(), &types.Datum{}, 0) require.NoError(t, err) } @@ -464,7 +467,10 @@ func TestGetDefaultValue(t *testing.T) { }() for _, tt := range tests { - ctx.GetSessionVars().StmtCtx.BadNullAsWarning = !tt.strict + sc := ctx.GetSessionVars().StmtCtx + levels := sc.ErrLevels() + levels[errctx.ErrGroupBadNull] = errctx.ResolveErrLevel(false, !tt.strict) + sc.SetErrLevels(levels) val, err := GetColDefaultValue(ctx, tt.colInfo) if err != nil { require.Errorf(t, tt.err, "%v", err) @@ -478,7 +484,10 @@ func TestGetDefaultValue(t *testing.T) { } for _, tt := range tests { - ctx.GetSessionVars().StmtCtx.BadNullAsWarning = !tt.strict + sc := ctx.GetSessionVars().StmtCtx + levels := sc.ErrLevels() + levels[errctx.ErrGroupBadNull] = errctx.ResolveErrLevel(false, !tt.strict) + sc.SetErrLevels(levels) val, err := GetColOriginDefaultValue(ctx, tt.colInfo) if err != nil { require.Errorf(t, tt.err, "%v", err) diff --git a/pkg/table/main_test.go b/pkg/table/main_test.go index 8a462d3cf2754..6262d6a090d0c 100644 --- a/pkg/table/main_test.go +++ b/pkg/table/main_test.go @@ -25,6 +25,7 @@ func TestMain(m *testing.M) { testsetup.SetupForCommonTest() opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), diff --git a/pkg/table/tables/index.go b/pkg/table/tables/index.go index 8fb48acb87db8..7e6f68e26ae6b 100644 --- a/pkg/table/tables/index.go +++ b/pkg/table/tables/index.go @@ -36,7 +36,6 @@ import ( type index struct { idxInfo *model.IndexInfo tblInfo *model.TableInfo - prefix kv.Key phyTblID int64 // initNeedRestoreData is used to initialize `needRestoredData` in `index.Create()`. // This routine cannot be done in `NewIndex()` because `needRestoreData` relies on `NewCollationEnabled()` and @@ -58,19 +57,9 @@ func NeedRestoredData(idxCols []*model.IndexColumn, colInfos []*model.ColumnInfo // NewIndex builds a new Index object. func NewIndex(physicalID int64, tblInfo *model.TableInfo, indexInfo *model.IndexInfo) table.Index { - // The prefix can't encode from tblInfo.ID, because table partition may change the id to partition id. - var prefix kv.Key - if indexInfo.Global { - // In glabal index of partition table, prefix start with tblInfo.ID. - prefix = tablecodec.EncodeTableIndexPrefix(tblInfo.ID, indexInfo.ID) - } else { - // Otherwise, start with physicalID. - prefix = tablecodec.EncodeTableIndexPrefix(physicalID, indexInfo.ID) - } index := &index{ idxInfo: indexInfo, tblInfo: tblInfo, - prefix: prefix, phyTblID: physicalID, } return index diff --git a/pkg/table/tables/main_test.go b/pkg/table/tables/main_test.go index eb5437736a86e..8a9ebad70d8cb 100644 --- a/pkg/table/tables/main_test.go +++ b/pkg/table/tables/main_test.go @@ -25,6 +25,7 @@ func TestMain(m *testing.M) { testsetup.SetupForCommonTest() opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), diff --git a/pkg/table/tables/partition.go b/pkg/table/tables/partition.go index dc036ba94f1a3..26b0f3b098ee5 100644 --- a/pkg/table/tables/partition.go +++ b/pkg/table/tables/partition.go @@ -1862,7 +1862,8 @@ func parseExpr(p *parser.Parser, exprStr string) (ast.ExprNode, error) { exprStr = "select " + exprStr stmts, _, err := p.ParseSQL(exprStr) if err != nil { - return nil, util.SyntaxWarn(err) + // if you want to use warn like an error, trace the stack info by yourself. + return nil, errors.Trace(util.SyntaxWarn(err)) } fields := stmts[0].(*ast.SelectStmt).Fields.Fields return fields[0].Expr, nil diff --git a/pkg/table/tables/tables.go b/pkg/table/tables/tables.go index 640f6e0244768..6204a34fe5ec3 100644 --- a/pkg/table/tables/tables.go +++ b/pkg/table/tables/tables.go @@ -33,6 +33,7 @@ import ( "github.com/pingcap/tidb/pkg/kv" "github.com/pingcap/tidb/pkg/meta" "github.com/pingcap/tidb/pkg/meta/autoid" + "github.com/pingcap/tidb/pkg/parser/ast" "github.com/pingcap/tidb/pkg/parser/model" "github.com/pingcap/tidb/pkg/parser/mysql" "github.com/pingcap/tidb/pkg/sessionctx" @@ -65,18 +66,18 @@ type TableCommon struct { // physicalTableID is a unique int64 to identify a physical table. physicalTableID int64 Columns []*table.Column - PublicColumns []*table.Column - VisibleColumns []*table.Column - HiddenColumns []*table.Column - WritableColumns []*table.Column - FullHiddenColsAndVisibleColumns []*table.Column + publicColumns []*table.Column + visibleColumns []*table.Column + hiddenColumns []*table.Column + writableColumns []*table.Column + fullHiddenColsAndVisibleColumns []*table.Column indices []table.Index meta *model.TableInfo allocs autoid.Allocators sequence *sequenceCommon dependencyColumnOffsets []int Constraints []*table.Constraint - WritableConstraints []*table.Constraint + writableConstraints []*table.Constraint // recordPrefix and indexPrefix are generated using physicalTableID. recordPrefix kv.Key @@ -138,15 +139,21 @@ func TableFromMeta(allocs autoid.Allocators, tblInfo *model.TableInfo) (table.Ta col := table.ToColumn(colInfo) if col.IsGenerated() { - expr, err := generatedexpr.ParseExpression(colInfo.GeneratedExprString) + genStr := colInfo.GeneratedExprString + expr, err := buildGeneratedExpr(tblInfo, genStr) if err != nil { return nil, err } - expr, err = generatedexpr.SimpleResolveName(expr, tblInfo) - if err != nil { - return nil, err - } - col.GeneratedExpr = expr + col.GeneratedExpr = table.NewClonableExprNode(func() ast.ExprNode { + newExpr, err1 := buildGeneratedExpr(tblInfo, genStr) + if err1 != nil { + logutil.BgLogger().Warn("unexpected parse generated string error", + zap.String("generatedStr", genStr), + zap.Error(err1)) + return expr + } + return newExpr + }, expr) } // default value is expr. if col.DefaultIsExpr { @@ -177,6 +184,18 @@ func TableFromMeta(allocs autoid.Allocators, tblInfo *model.TableInfo) (table.Ta return newPartitionedTable(&t, tblInfo) } +func buildGeneratedExpr(tblInfo *model.TableInfo, genExpr string) (ast.ExprNode, error) { + expr, err := generatedexpr.ParseExpression(genExpr) + if err != nil { + return nil, err + } + expr, err = generatedexpr.SimpleResolveName(expr, tblInfo) + if err != nil { + return nil, err + } + return expr, nil +} + // initTableCommon initializes a TableCommon struct. func initTableCommon(t *TableCommon, tblInfo *model.TableInfo, physicalTableID int64, cols []*table.Column, allocs autoid.Allocators, constraints []*table.Constraint) { t.tableID = tblInfo.ID @@ -184,13 +203,7 @@ func initTableCommon(t *TableCommon, tblInfo *model.TableInfo, physicalTableID i t.allocs = allocs t.meta = tblInfo t.Columns = cols - t.PublicColumns = t.Cols() - t.VisibleColumns = t.VisibleCols() - t.HiddenColumns = t.HiddenCols() - t.WritableColumns = t.WritableCols() - t.FullHiddenColsAndVisibleColumns = t.FullHiddenColsAndVisibleCols() t.Constraints = constraints - t.WritableConstraints = t.WritableConstraint() t.recordPrefix = tablecodec.GenTableRecordPrefix(physicalTableID) t.indexPrefix = tablecodec.GenTableIndexPrefix(physicalTableID) if tblInfo.IsSequence() { @@ -287,32 +300,32 @@ func (t *TableCommon) getCols(mode getColsMode) []*table.Column { // Cols implements table.Table Cols interface. func (t *TableCommon) Cols() []*table.Column { - if len(t.PublicColumns) > 0 { - return t.PublicColumns + if len(t.publicColumns) > 0 { + return t.publicColumns } return t.getCols(full) } // VisibleCols implements table.Table VisibleCols interface. func (t *TableCommon) VisibleCols() []*table.Column { - if len(t.VisibleColumns) > 0 { - return t.VisibleColumns + if len(t.visibleColumns) > 0 { + return t.visibleColumns } return t.getCols(visible) } // HiddenCols implements table.Table HiddenCols interface. func (t *TableCommon) HiddenCols() []*table.Column { - if len(t.HiddenColumns) > 0 { - return t.HiddenColumns + if len(t.hiddenColumns) > 0 { + return t.hiddenColumns } return t.getCols(hidden) } // WritableCols implements table WritableCols interface. func (t *TableCommon) WritableCols() []*table.Column { - if len(t.WritableColumns) > 0 { - return t.WritableColumns + if len(t.writableColumns) > 0 { + return t.writableColumns } writableColumns := make([]*table.Column, 0, len(t.Columns)) for _, col := range t.Columns { @@ -331,8 +344,8 @@ func (t *TableCommon) DeletableCols() []*table.Column { // WritableConstraint returns constraints of the table in writable states. func (t *TableCommon) WritableConstraint() []*table.Constraint { - if len(t.WritableConstraints) > 0 { - return t.WritableConstraints + if len(t.writableConstraints) > 0 { + return t.writableConstraints } if t.Constraints == nil { return nil @@ -366,8 +379,8 @@ func (t *TableCommon) CheckRowConstraint(sctx sessionctx.Context, rowToCheck []t // FullHiddenColsAndVisibleCols implements table FullHiddenColsAndVisibleCols interface. func (t *TableCommon) FullHiddenColsAndVisibleCols() []*table.Column { - if len(t.FullHiddenColsAndVisibleColumns) > 0 { - return t.FullHiddenColsAndVisibleColumns + if len(t.fullHiddenColsAndVisibleColumns) > 0 { + return t.fullHiddenColsAndVisibleColumns } cols := make([]*table.Column, 0, len(t.Columns)) @@ -1014,7 +1027,7 @@ func (t *TableCommon) AddRecord(sctx sessionctx.Context, r []types.Datum, opts . _, err = txn.Get(ctx, key) } if err == nil { - handleStr := getDuplicateErrorHandleString(t, recordID, r) + handleStr := getDuplicateErrorHandleString(t.Meta(), recordID, r) return recordID, kv.ErrKeyExists.FastGenByArgs(handleStr, t.Meta().Name.String()+".PRIMARY") } else if !kv.ErrNotExist.Equal(err) { return recordID, err @@ -1147,6 +1160,8 @@ func (t *TableCommon) addIndices(sctx sessionctx.Context, recordID kv.Handle, r } var dupErr error if !skipCheck && v.Meta().Unique { + // Make error message consistent with MySQL. + tablecodec.TruncateIndexValues(t.meta, v.Meta(), indexVals) entryKey, err := genIndexKeyStr(indexVals) if err != nil { return nil, err @@ -1536,6 +1551,7 @@ func (t *TableCommon) buildIndexForRow(ctx sessionctx.Context, h kv.Handle, vals if _, err := idx.Create(ctx, txn, vals, h, rsData, opts...); err != nil { if kv.ErrKeyExists.Equal(err) { // Make error message consistent with MySQL. + tablecodec.TruncateIndexValues(t.meta, idx.Meta(), vals) entryKey, err1 := genIndexKeyStr(vals) if err1 != nil { // if genIndexKeyStr failed, return the original error. @@ -1982,29 +1998,25 @@ func FindIndexByColName(t table.Table, name string) table.Index { return nil } -func getDuplicateErrorHandleString(t table.Table, handle kv.Handle, row []types.Datum) string { +func getDuplicateErrorHandleString(tblInfo *model.TableInfo, handle kv.Handle, row []types.Datum) string { if handle.IsInt() { return kv.GetDuplicateErrorHandleString(handle) } - var pk table.Index - for _, idx := range t.Indices() { - if idx.Meta().Primary { - pk = idx - break - } - } - if pk == nil { + pkIdx := FindPrimaryIndex(tblInfo) + if pkIdx == nil { return kv.GetDuplicateErrorHandleString(handle) } - var err error - str := make([]string, len(pk.Meta().Columns)) - for i, col := range pk.Meta().Columns { - str[i], err = row[col.Offset].ToString() - if err != nil { - return kv.GetDuplicateErrorHandleString(handle) - } + pkDts := make([]types.Datum, 0, len(pkIdx.Columns)) + for _, idxCol := range pkIdx.Columns { + pkDts = append(pkDts, row[idxCol.Offset]) + } + tablecodec.TruncateIndexValues(tblInfo, pkIdx, pkDts) + entryKey, err := genIndexKeyStr(pkDts) + if err != nil { + // if genIndexKeyStr failed, return DuplicateErrorHandleString. + return kv.GetDuplicateErrorHandleString(handle) } - return strings.Join(str, "-") + return entryKey } func init() { diff --git a/pkg/table/tables/tables_test.go b/pkg/table/tables/tables_test.go index 76561f3feca79..88f19b2e4b1f2 100644 --- a/pkg/table/tables/tables_test.go +++ b/pkg/table/tables/tables_test.go @@ -426,12 +426,6 @@ func TestHiddenColumn(t *testing.T) { colInfo[1].Hidden = true colInfo[3].Hidden = true colInfo[5].Hidden = true - tc := tb.(*tables.TableCommon) - // Reset related caches - tc.VisibleColumns = nil - tc.WritableColumns = nil - tc.HiddenColumns = nil - tc.FullHiddenColsAndVisibleColumns = nil // Basic test cols := tb.VisibleCols() diff --git a/pkg/table/tables/test/partition/main_test.go b/pkg/table/tables/test/partition/main_test.go index cb52e876dd375..9fc8d75a1433b 100644 --- a/pkg/table/tables/test/partition/main_test.go +++ b/pkg/table/tables/test/partition/main_test.go @@ -25,6 +25,7 @@ func TestMain(m *testing.M) { testsetup.SetupForCommonTest() opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), diff --git a/pkg/table/tables/test/partition/partition_test.go b/pkg/table/tables/test/partition/partition_test.go index 2b6c6c1b9d2ed..0fb59623f96b8 100644 --- a/pkg/table/tables/test/partition/partition_test.go +++ b/pkg/table/tables/test/partition/partition_test.go @@ -408,10 +408,11 @@ func TestExchangePartitionStates(t *testing.T) { logutil.BgLogger().Info("Got state", zap.String("State", s)) break } - gotime.Sleep(50 * gotime.Millisecond) + gotime.Sleep(10 * gotime.Millisecond) } - // Sleep 50ms to wait load InforSchema finish, issue #46815. - gotime.Sleep(50 * gotime.Millisecond) + dom := domain.GetDomain(tk.Session()) + // Make sure the table schema is the new schema. + require.NoError(t, dom.Reload()) } waitFor("t", "write only", 4) tk3.MustExec(`BEGIN`) @@ -519,10 +520,11 @@ func TestExchangePartitionCheckConstraintStates(t *testing.T) { logutil.BgLogger().Info("Got state", zap.String("State", s)) break } - gotime.Sleep(50 * gotime.Millisecond) + gotime.Sleep(10 * gotime.Millisecond) } - // Sleep 50ms to wait load InforSchema finish. - gotime.Sleep(50 * gotime.Millisecond) + dom := domain.GetDomain(tk.Session()) + // Make sure the table schema is the new schema. + require.NoError(t, dom.Reload()) } waitFor("nt", "write only", 4) @@ -630,10 +632,11 @@ func TestExchangePartitionCheckConstraintStatesTwo(t *testing.T) { logutil.BgLogger().Info("Got state", zap.String("State", s)) break } - gotime.Sleep(50 * gotime.Millisecond) + gotime.Sleep(10 * gotime.Millisecond) } - // Sleep 50ms to wait load InforSchema finish. - gotime.Sleep(50 * gotime.Millisecond) + dom := domain.GetDomain(tk.Session()) + // Make sure the table schema is the new schema. + require.NoError(t, dom.Reload()) } waitFor("nt", "write only", 4) @@ -691,8 +694,9 @@ func TestAddKeyPartitionStates(t *testing.T) { } gotime.Sleep(10 * gotime.Millisecond) } - // Sleep 50ms to wait load InforSchema finish. - gotime.Sleep(50 * gotime.Millisecond) + dom := domain.GetDomain(tk.Session()) + // Make sure the table schema is the new schema. + require.NoError(t, dom.Reload()) } waitFor(4, "delete only") tk3.MustExec(`BEGIN`) diff --git a/pkg/table/temptable/BUILD.bazel b/pkg/table/temptable/BUILD.bazel index ef4b9bbcb1e54..22984092c9d88 100644 --- a/pkg/table/temptable/BUILD.bazel +++ b/pkg/table/temptable/BUILD.bazel @@ -24,7 +24,6 @@ go_library( "//pkg/tablecodec", "@com_github_pingcap_errors//:errors", "@com_github_tikv_client_go_v2//tikv", - "@org_golang_x_exp//maps", ], ) diff --git a/pkg/table/temptable/ddl_test.go b/pkg/table/temptable/ddl_test.go index 40c56218d77ec..70822493c412a 100644 --- a/pkg/table/temptable/ddl_test.go +++ b/pkg/table/temptable/ddl_test.go @@ -31,7 +31,7 @@ import ( ) func createTestSuite(t *testing.T) (sessionctx.Context, *temporaryTableDDL) { - store, err := mockstore.NewMockStore() + store, err := mockstore.NewMockStore(mockstore.WithStoreType(mockstore.EmbedUnistore)) require.NoError(t, err) sctx := mock.NewContext() diff --git a/pkg/table/temptable/interceptor.go b/pkg/table/temptable/interceptor.go index 9582b061f2633..e4a3408db5d7d 100644 --- a/pkg/table/temptable/interceptor.go +++ b/pkg/table/temptable/interceptor.go @@ -17,6 +17,7 @@ package temptable import ( "bytes" "context" + "maps" "math" "github.com/pingcap/errors" @@ -26,7 +27,6 @@ import ( "github.com/pingcap/tidb/pkg/sessionctx" "github.com/pingcap/tidb/pkg/store/driver/txn" "github.com/pingcap/tidb/pkg/tablecodec" - "golang.org/x/exp/maps" ) var ( diff --git a/pkg/table/temptable/main_test.go b/pkg/table/temptable/main_test.go index f21b39ed361c1..a454252630191 100644 --- a/pkg/table/temptable/main_test.go +++ b/pkg/table/temptable/main_test.go @@ -39,6 +39,7 @@ func TestMain(m *testing.M) { goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), } testsetup.SetupForCommonTest() diff --git a/pkg/tablecodec/main_test.go b/pkg/tablecodec/main_test.go index 3c1d0cdf8fc5c..98f36b00e9f81 100644 --- a/pkg/tablecodec/main_test.go +++ b/pkg/tablecodec/main_test.go @@ -25,6 +25,7 @@ func TestMain(m *testing.M) { testsetup.SetupForCommonTest() opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), diff --git a/pkg/tablecodec/rowindexcodec/main_test.go b/pkg/tablecodec/rowindexcodec/main_test.go index e61e69cc14f82..3be515429cb6d 100644 --- a/pkg/tablecodec/rowindexcodec/main_test.go +++ b/pkg/tablecodec/rowindexcodec/main_test.go @@ -25,6 +25,7 @@ func TestMain(m *testing.M) { testsetup.SetupForCommonTest() opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), diff --git a/pkg/tablecodec/tablecodec.go b/pkg/tablecodec/tablecodec.go index 347d71221cbe0..5787f16ecc109 100644 --- a/pkg/tablecodec/tablecodec.go +++ b/pkg/tablecodec/tablecodec.go @@ -998,7 +998,7 @@ func decodeIntHandleInIndexValue(data []byte) kv.Handle { // EncodeTableIndexPrefix encodes index prefix with tableID and idxID. func EncodeTableIndexPrefix(tableID, idxID int64) kv.Key { - key := make([]byte, 0, prefixLen) + key := make([]byte, 0, prefixLen+idLen) key = appendTableIndexPrefix(key, tableID) key = codec.EncodeInt(key, idxID) return key diff --git a/pkg/telemetry/cte_test/cte_test.go b/pkg/telemetry/cte_test/cte_test.go index 445223978b562..e1fd876c0b70d 100644 --- a/pkg/telemetry/cte_test/cte_test.go +++ b/pkg/telemetry/cte_test/cte_test.go @@ -36,6 +36,7 @@ func TestMain(m *testing.M) { opts := []goleak.Option{ goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("syscall.Syscall"), } diff --git a/pkg/telemetry/main_test.go b/pkg/telemetry/main_test.go index 4be768056ca02..77dbed2989109 100644 --- a/pkg/telemetry/main_test.go +++ b/pkg/telemetry/main_test.go @@ -39,6 +39,7 @@ func TestMain(m *testing.M) { opts := []goleak.Option{ goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), goleak.IgnoreTopFunction("net/http.(*persistConn).writeLoop"), diff --git a/pkg/testkit/mockstore.go b/pkg/testkit/mockstore.go index b5cdb8726d7c7..f5a232e76c685 100644 --- a/pkg/testkit/mockstore.go +++ b/pkg/testkit/mockstore.go @@ -18,7 +18,9 @@ package testkit import ( "flag" + "os" "sync" + "syscall" "testing" "time" @@ -65,10 +67,66 @@ func CreateMockStore(t testing.TB, opts ...mockstore.MockTiKVStoreOption) kv.Sto view.Stop() }) gctuner.GlobalMemoryLimitTuner.Stop() + tryMakeImage() store, _ := CreateMockStoreAndDomain(t, opts...) return store } +// tryMakeImage tries to create a bootstraped storage, the store is used as image for testing later. +func tryMakeImage(opts ...mockstore.MockTiKVStoreOption) { + if mockstore.ImageAvailable() { + return + } + retry, err := false, error(nil) + for err == nil { + retry, err = tryMakeImageOnce() + if !retry { + break + } + time.Sleep(100 * time.Millisecond) + } +} + +func tryMakeImageOnce() (retry bool, err error) { + const lockFile = "/tmp/tidb-unistore-bootstraped-image-lock-file" + lock, err := os.Create(lockFile) + if err != nil { + return true, nil + } + defer func() { err = os.Remove(lockFile) }() + defer lock.Close() + + // Prevent other process from creating the image concurrently + err = syscall.Flock(int(lock.Fd()), syscall.LOCK_EX|syscall.LOCK_NB) + if err != nil { + return true, nil + } + defer func() { err = syscall.Flock(int(lock.Fd()), syscall.LOCK_UN) }() + + // Now this is the only instance to do the operation. + store, err := mockstore.NewMockStore( + mockstore.WithStoreType(mockstore.EmbedUnistore), + mockstore.WithPath(mockstore.ImageFilePath)) + if err != nil { + return false, err + } + + session.SetSchemaLease(500 * time.Millisecond) + session.DisableStats4Test() + domain.DisablePlanReplayerBackgroundJob4Test() + domain.DisableDumpHistoricalStats4Test() + dom, err := session.BootstrapSession(store) + if err != nil { + return false, err + } + dom.SetStatsUpdating(true) + + dom.Close() + err = store.Close() + + return false, err +} + // DistExecutionContext is the context // that used in Distributed execution test for Dist task framework and DDL. type DistExecutionContext struct { @@ -167,6 +225,11 @@ func (d *DistExecutionContext) GetDomain(idx int) *domain.Domain { return d.domains[idx] } +// GetDomainCnt get domain count. +func (d *DistExecutionContext) GetDomainCnt() int { + return len(d.domains) +} + // NewDistExecutionContext create DistExecutionContext for testing. func NewDistExecutionContext(t testing.TB, serverNum int) *DistExecutionContext { store, err := mockstore.NewMockStore() diff --git a/pkg/testkit/testutil/BUILD.bazel b/pkg/testkit/testutil/BUILD.bazel index 6280c49a42d71..95bbde2957f49 100644 --- a/pkg/testkit/testutil/BUILD.bazel +++ b/pkg/testkit/testutil/BUILD.bazel @@ -30,8 +30,5 @@ go_test( srcs = ["require_test.go"], embed = [":testutil"], flaky = True, - deps = [ - "@com_github_stretchr_testify//require", - "@org_uber_go_goleak//:goleak", - ], + deps = ["@com_github_stretchr_testify//require"], ) diff --git a/pkg/testkit/testutil/require_test.go b/pkg/testkit/testutil/require_test.go index 49491a62c7619..1e787c37ee464 100644 --- a/pkg/testkit/testutil/require_test.go +++ b/pkg/testkit/testutil/require_test.go @@ -18,11 +18,9 @@ import ( "testing" "github.com/stretchr/testify/require" - "go.uber.org/goleak" ) func TestCompareUnorderedString(t *testing.T) { - defer goleak.VerifyNone(t) require.True(t, CompareUnorderedStringSlice([]string{"1", "1", "2"}, []string{"1", "1", "2"})) require.True(t, CompareUnorderedStringSlice([]string{"1", "1", "2"}, []string{"1", "2", "1"})) require.False(t, CompareUnorderedStringSlice([]string{"1", "1"}, []string{"1", "2", "1"})) diff --git a/pkg/timer/api/main_test.go b/pkg/timer/api/main_test.go index a5c704628e325..80aeb54e96691 100644 --- a/pkg/timer/api/main_test.go +++ b/pkg/timer/api/main_test.go @@ -23,5 +23,12 @@ import ( func TestMain(m *testing.M) { testsetup.SetupForCommonTest() - goleak.VerifyTestMain(m) + opts := []goleak.Option{ + goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), + goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), + goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), + } + testsetup.SetupForCommonTest() + goleak.VerifyTestMain(m, opts...) } diff --git a/pkg/timer/main_test.go b/pkg/timer/main_test.go index c0c6b2bf6eff5..a814c9908f557 100644 --- a/pkg/timer/main_test.go +++ b/pkg/timer/main_test.go @@ -25,6 +25,7 @@ func TestMain(m *testing.M) { testsetup.SetupForCommonTest() opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/golang/glog.(*loggingT).flushDaemon"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), diff --git a/pkg/timer/runtime/BUILD.bazel b/pkg/timer/runtime/BUILD.bazel index 13deabc6f9e38..dabc8b21e867c 100644 --- a/pkg/timer/runtime/BUILD.bazel +++ b/pkg/timer/runtime/BUILD.bazel @@ -18,7 +18,6 @@ go_library( "@com_github_google_uuid//:uuid", "@com_github_pingcap_errors//:errors", "@com_github_prometheus_client_golang//prometheus", - "@org_golang_x_exp//maps", "@org_uber_go_zap//:zap", ], ) diff --git a/pkg/timer/runtime/main_test.go b/pkg/timer/runtime/main_test.go index 4f98163999a89..71e87b95360cf 100644 --- a/pkg/timer/runtime/main_test.go +++ b/pkg/timer/runtime/main_test.go @@ -30,7 +30,14 @@ import ( func TestMain(m *testing.M) { testsetup.SetupForCommonTest() - goleak.VerifyTestMain(m) + opts := []goleak.Option{ + goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), + goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), + goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), + } + testsetup.SetupForCommonTest() + goleak.VerifyTestMain(m, opts...) } type mockHook struct { diff --git a/pkg/timer/runtime/runtime.go b/pkg/timer/runtime/runtime.go index 9901214864f19..6685853a04964 100644 --- a/pkg/timer/runtime/runtime.go +++ b/pkg/timer/runtime/runtime.go @@ -18,6 +18,7 @@ import ( "context" "encoding/hex" "fmt" + "maps" "sync" "time" @@ -28,7 +29,6 @@ import ( "github.com/pingcap/tidb/pkg/util/logutil" "github.com/prometheus/client_golang/prometheus" "go.uber.org/zap" - "golang.org/x/exp/maps" ) var ( diff --git a/pkg/ttl/cache/main_test.go b/pkg/ttl/cache/main_test.go index 15ec7eaf7fe2b..ff06ca9d0a359 100644 --- a/pkg/ttl/cache/main_test.go +++ b/pkg/ttl/cache/main_test.go @@ -25,6 +25,7 @@ func TestMain(m *testing.M) { testsetup.SetupForCommonTest() opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), diff --git a/pkg/ttl/cache/split_test.go b/pkg/ttl/cache/split_test.go index d1a34a5ea2e5b..298dedc7a563a 100644 --- a/pkg/ttl/cache/split_test.go +++ b/pkg/ttl/cache/split_test.go @@ -62,7 +62,7 @@ type mockPDClient struct { regionsSorted bool } -func (c *mockPDClient) ScanRegions(_ context.Context, key, endKey []byte, limit int) ([]*pd.Region, error) { +func (c *mockPDClient) ScanRegions(_ context.Context, key, endKey []byte, limit int, _ ...pd.GetRegionOption) ([]*pd.Region, error) { if len(c.regions) == 0 { return []*pd.Region{newMockRegion(1, []byte{}, []byte{0xFF, 0xFF})}, nil } diff --git a/pkg/ttl/session/main_test.go b/pkg/ttl/session/main_test.go index 07cb8a84ef232..8ee6890a2a5ee 100644 --- a/pkg/ttl/session/main_test.go +++ b/pkg/ttl/session/main_test.go @@ -25,6 +25,7 @@ func TestMain(m *testing.M) { testsetup.SetupForCommonTest() opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), diff --git a/pkg/ttl/sqlbuilder/main_test.go b/pkg/ttl/sqlbuilder/main_test.go index a5bf3a3315e60..ffce4501b28fe 100644 --- a/pkg/ttl/sqlbuilder/main_test.go +++ b/pkg/ttl/sqlbuilder/main_test.go @@ -25,6 +25,7 @@ func TestMain(m *testing.M) { testsetup.SetupForCommonTest() opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), diff --git a/pkg/ttl/ttlworker/job_manager_integration_test.go b/pkg/ttl/ttlworker/job_manager_integration_test.go index fc8162e6e5002..99d5b832e4832 100644 --- a/pkg/ttl/ttlworker/job_manager_integration_test.go +++ b/pkg/ttl/ttlworker/job_manager_integration_test.go @@ -226,7 +226,7 @@ func TestTTLAutoAnalyze(t *testing.T) { is := dom.InfoSchema() require.NoError(t, h.DumpStatsDeltaToKV(true)) require.NoError(t, h.Update(is)) - require.True(t, h.HandleAutoAnalyze(is)) + require.True(t, h.HandleAutoAnalyze()) } func TestTriggerTTLJob(t *testing.T) { diff --git a/pkg/types/BUILD.bazel b/pkg/types/BUILD.bazel index 416a8f81070f8..bd29720a792d6 100644 --- a/pkg/types/BUILD.bazel +++ b/pkg/types/BUILD.bazel @@ -52,6 +52,7 @@ go_library( "//pkg/parser/terror", "//pkg/parser/types", "//pkg/util/collate", + "//pkg/util/context", "//pkg/util/dbterror", "//pkg/util/hack", "//pkg/util/intest", @@ -106,6 +107,7 @@ go_test( "//pkg/parser/terror", "//pkg/testkit/testsetup", "//pkg/util/collate", + "//pkg/util/context", "//pkg/util/hack", "@com_github_pingcap_errors//:errors", "@com_github_stretchr_testify//assert", diff --git a/pkg/types/compare.go b/pkg/types/compare.go index ec55f15e2fa22..0ca7f5befa26b 100644 --- a/pkg/types/compare.go +++ b/pkg/types/compare.go @@ -15,6 +15,7 @@ package types import ( + "cmp" "math" "github.com/pingcap/tidb/pkg/util/collate" @@ -84,3 +85,27 @@ func VecCompareIU(x []int64, y []uint64, res []int64) { func CompareString(x, y, collation string) int { return collate.GetCollator(collation).Compare(x, y) } + +// CompareInt return an integer comparing the integer x to y with signed or unsigned. +func CompareInt(arg0 int64, isUnsigned0 bool, arg1 int64, isUnsigned1 bool) int { + var res int + switch { + case isUnsigned0 && isUnsigned1: + res = cmp.Compare(uint64(arg0), uint64(arg1)) + case isUnsigned0 && !isUnsigned1: + if arg1 < 0 || uint64(arg0) > math.MaxInt64 { + res = 1 + } else { + res = cmp.Compare(arg0, arg1) + } + case !isUnsigned0 && isUnsigned1: + if arg0 < 0 || uint64(arg1) > math.MaxInt64 { + res = -1 + } else { + res = cmp.Compare(arg0, arg1) + } + case !isUnsigned0 && !isUnsigned1: + res = cmp.Compare(arg0, arg1) + } + return res +} diff --git a/pkg/types/context.go b/pkg/types/context.go index 8f894d35942c2..b515c78fddc72 100644 --- a/pkg/types/context.go +++ b/pkg/types/context.go @@ -17,6 +17,7 @@ package types import ( "time" + contextutil "github.com/pingcap/tidb/pkg/util/context" "github.com/pingcap/tidb/pkg/util/intest" ) @@ -197,18 +198,18 @@ func (f Flags) WithCastTimeToYearThroughConcat(flag bool) Flags { // Context provides the information when converting between different types. type Context struct { - flags Flags - loc *time.Location - appendWarningFn func(err error) + flags Flags + loc *time.Location + warnHandler contextutil.WarnHandler } // NewContext creates a new `Context` -func NewContext(flags Flags, loc *time.Location, appendWarningFn func(err error)) Context { - intest.Assert(loc != nil && appendWarningFn != nil) +func NewContext(flags Flags, loc *time.Location, handler contextutil.WarnHandler) Context { + intest.Assert(loc != nil && handler != nil) return Context{ - flags: flags, - loc: loc, - appendWarningFn: appendWarningFn, + flags: flags, + loc: loc, + warnHandler: handler, } } @@ -242,32 +243,25 @@ func (c *Context) Location() *time.Location { return c.loc } -// AppendWarning appends the error to warning. If the inner `appendWarningFn` is nil, do nothing. +// AppendWarning appends the error to warning. If the inner `warnHandler` is nil, do nothing. func (c *Context) AppendWarning(err error) { - intest.Assert(c.appendWarningFn != nil) - if fn := c.appendWarningFn; fn != nil { - // appendWarningFn should always not be nil, check fn != nil here to just make code safe. - fn(err) + intest.Assert(c.warnHandler != nil) + if w := c.warnHandler; w != nil { + // warnHandler should always not be nil, check fn != nil here to just make code safe. + w.AppendWarning(err) } } -// AppendWarningFunc returns the inner `appendWarningFn` -func (c *Context) AppendWarningFunc() func(err error) { - return c.appendWarningFn -} - // DefaultStmtFlags is the default flags for statement context with the flag `FlagAllowNegativeToUnsigned` set. // TODO: make DefaultStmtFlags to be equal with StrictFlags, and setting flag `FlagAllowNegativeToUnsigned` // is only for make the code to be equivalent with the old implement during refactoring. const DefaultStmtFlags = StrictFlags | FlagAllowNegativeToUnsigned | FlagIgnoreZeroDateErr // DefaultStmtNoWarningContext is the context with default statement flags without any other special configuration -var DefaultStmtNoWarningContext = NewContext(DefaultStmtFlags, time.UTC, func(_ error) { - // the error is ignored -}) +var DefaultStmtNoWarningContext = NewContext(DefaultStmtFlags, time.UTC, contextutil.IgnoreWarn) // StrictContext is the most strict context which returns every error it meets -var StrictContext = NewContext(StrictFlags, time.UTC, func(_ error) { - // this context should never append warnings - // However, the implementation of `types` may still append some warnings. TODO: remove them in the future. -}) +// +// this context should never append warnings +// However, the implementation of `types` may still append some warnings. TODO: remove them in the future. +var StrictContext = NewContext(StrictFlags, time.UTC, contextutil.IgnoreWarn) diff --git a/pkg/types/context_test.go b/pkg/types/context_test.go index 0bd8d5cbcc811..38d1874ab5024 100644 --- a/pkg/types/context_test.go +++ b/pkg/types/context_test.go @@ -20,11 +20,12 @@ import ( "testing" "time" + contextutil "github.com/pingcap/tidb/pkg/util/context" "github.com/stretchr/testify/require" ) func TestWithNewFlags(t *testing.T) { - ctx := NewContext(FlagSkipASCIICheck, time.UTC, func(_ error) {}) + ctx := NewContext(FlagSkipASCIICheck, time.UTC, contextutil.IgnoreWarn) ctx2 := ctx.WithFlags(FlagSkipUTF8Check) require.Equal(t, FlagSkipASCIICheck, ctx.Flags()) require.Equal(t, FlagSkipUTF8Check, ctx2.Flags()) diff --git a/pkg/types/convert_test.go b/pkg/types/convert_test.go index 86d9893edff21..41dd4753d315c 100644 --- a/pkg/types/convert_test.go +++ b/pkg/types/convert_test.go @@ -864,7 +864,7 @@ func TestGetValidInt(t *testing.T) { {"123de", "123", true, true}, } warnings := &warnStore{} - ctx := NewContext(DefaultStmtFlags.WithTruncateAsWarning(true), time.UTC, warnings.AppendWarning) + ctx := NewContext(DefaultStmtFlags.WithTruncateAsWarning(true), time.UTC, warnings) warningCount := 0 for i, tt := range tests { prefix, err := getValidIntPrefix(ctx, tt.origin, false) diff --git a/pkg/types/core_time.go b/pkg/types/core_time.go index aaf3f5711fea9..1729ecb8a647d 100644 --- a/pkg/types/core_time.go +++ b/pkg/types/core_time.go @@ -280,14 +280,30 @@ func compareTime(a, b CoreTime) int { // Dig it and we found it's caused by golang api time.Date(year int, month Month, day, hour, min, sec, nsec int, loc *Location) Time , // it says October 32 converts to November 1 ,it conflicts with mysql. // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_date-add -func AddDate(year, month, day int64, ot gotime.Time) (nt gotime.Time) { +func AddDate(year, month, day int64, ot gotime.Time) (nt gotime.Time, _ error) { + // We must limit the range of year, month and day to avoid overflow. + // The datetime range is from '1000-01-01 00:00:00.000000' to '9999-12-31 23:59:59.499999', + // so it is safe to limit the added value from -10000*365 to 10000*365. + const maxAdd = 10000 * 365 + const minAdd = -maxAdd + if year > maxAdd || year < minAdd || + month > maxAdd || month < minAdd || + day > maxAdd || day < minAdd { + return nt, ErrDatetimeFunctionOverflow.GenWithStackByArgs("datetime") + } + df := getFixDays(int(year), int(month), int(day), ot) if df != 0 { nt = ot.AddDate(int(year), int(month), df) } else { nt = ot.AddDate(int(year), int(month), int(day)) } - return nt + + if nt.Year() < 0 || nt.Year() > 9999 { + return nt, ErrDatetimeFunctionOverflow.GenWithStackByArgs("datetime") + } + + return nt, nil } func calcTimeFromSec(to *CoreTime, seconds, microseconds int) { diff --git a/pkg/types/core_time_test.go b/pkg/types/core_time_test.go index 999a5504f0899..54a1b8e27bf9f 100644 --- a/pkg/types/core_time_test.go +++ b/pkg/types/core_time_test.go @@ -263,16 +263,33 @@ func TestAddDate(t *testing.T) { month int day int ot time.Time + err bool }{ - {01, 1, 0, time.Date(2000, 1, 01, 0, 0, 0, 0, time.UTC)}, - {02, 1, 12, time.Date(2000, 1, 01, 0, 0, 0, 0, time.UTC)}, - {03, 1, 12, time.Date(2000, 1, 01, 0, 0, 0, 0, time.UTC)}, - {04, 2, 24, time.Date(2000, 2, 10, 0, 0, 0, 0, time.UTC)}, - {01, 04, 05, time.Date(2019, 04, 01, 1, 2, 3, 4, time.UTC)}, + {01, 1, 0, time.Date(2000, 1, 01, 0, 0, 0, 0, time.UTC), false}, + {02, 1, 12, time.Date(2000, 1, 01, 0, 0, 0, 0, time.UTC), false}, + {03, 1, 12, time.Date(2000, 1, 01, 0, 0, 0, 0, time.UTC), false}, + {04, 2, 24, time.Date(2000, 2, 10, 0, 0, 0, 0, time.UTC), false}, + {01, 04, 05, time.Date(2019, 04, 01, 1, 2, 3, 4, time.UTC), false}, + {7999, 1, 1, time.Date(2000, 1, 01, 0, 0, 0, 0, time.UTC), false}, + {-2000, 1, 1, time.Date(2000, 1, 01, 0, 0, 0, 0, time.UTC), false}, + {8000, 1, 1, time.Date(2000, 1, 01, 0, 0, 0, 0, time.UTC), true}, + {10001 * 365, 1, 1, time.Date(2000, 1, 01, 0, 0, 0, 0, time.UTC), true}, + {01, 10001 * 36, 1, time.Date(2000, 1, 01, 0, 0, 0, 0, time.UTC), true}, + {01, 1, 10001 * 365, time.Date(2000, 1, 01, 0, 0, 0, 0, time.UTC), true}, + {-2001, 1, 1, time.Date(2000, 1, 01, 0, 0, 0, 0, time.UTC), true}, + {-10001 * 365, 1, 1, time.Date(2000, 1, 01, 0, 0, 0, 0, time.UTC), true}, + {01, -10001 * 36, 1, time.Date(2000, 1, 01, 0, 0, 0, 0, time.UTC), true}, + {01, 1, -10001 * 365, time.Date(2000, 1, 01, 0, 0, 0, 0, time.UTC), true}, } for _, tt := range tests { - res := AddDate(int64(tt.year), int64(tt.month), int64(tt.day), tt.ot) + res, err := AddDate(int64(tt.year), int64(tt.month), int64(tt.day), tt.ot) + if tt.err { + require.EqualError(t, err, ErrDatetimeFunctionOverflow.GenWithStackByArgs("datetime").Error()) + require.True(t, ErrDatetimeFunctionOverflow.Equal(err)) + continue + } + require.NoError(t, err) require.Equal(t, tt.year+tt.ot.Year(), res.Year()) } } diff --git a/pkg/types/datum.go b/pkg/types/datum.go index 91ba76c3df978..6cb2ecc500c6d 100644 --- a/pkg/types/datum.go +++ b/pkg/types/datum.go @@ -1157,10 +1157,10 @@ func ProduceStrWithSpecifiedTp(s string, tp *FieldType, ctx Context, padZero boo trimed := strings.TrimRight(overflowed, " \t\n\r") if len(trimed) == 0 && !IsBinaryStr(tp) && IsTypeChar(tp.GetType()) { if tp.GetType() == mysql.TypeVarchar { - ctx.AppendWarning(ErrTruncated.GenWithStack("Data truncated, field len %d, data len %d", flen, characterLen)) + ctx.AppendWarning(ErrTruncated.FastGen("Data truncated, field len %d, data len %d", flen, characterLen)) } } else { - err = ErrDataTooLong.GenWithStack("Data Too Long, field len %d, data len %d", flen, characterLen) + err = ErrDataTooLong.FastGen("Data Too Long, field len %d, data len %d", flen, characterLen) } } @@ -1515,7 +1515,7 @@ func ProduceDecWithSpecifiedTp(ctx Context, dec *MyDecimal, tp *FieldType) (_ *M // select cast(111 as decimal(1)) causes a warning in MySQL. err = ErrOverflow.GenWithStackByArgs("DECIMAL", fmt.Sprintf("(%d, %d)", flen, decimal)) } else if old != nil && dec.Compare(old) != 0 { - ctx.AppendWarning(ErrTruncatedWrongVal.GenWithStackByArgs("DECIMAL", old)) + ctx.AppendWarning(ErrTruncatedWrongVal.FastGenByArgs("DECIMAL", old)) } } diff --git a/pkg/types/datum_test.go b/pkg/types/datum_test.go index 53dc48ef05c69..5abc09e2b9c56 100644 --- a/pkg/types/datum_test.go +++ b/pkg/types/datum_test.go @@ -638,7 +638,7 @@ func TestProduceDecWithSpecifiedTp(t *testing.T) { {"-99.9999", 6, 3, "-100.000", false, true}, } warnings := &warnStore{} - ctx := NewContext(DefaultStmtFlags, time.UTC, warnings.AppendWarning) + ctx := NewContext(DefaultStmtFlags, time.UTC, warnings) for _, tt := range tests { tp := NewFieldTypeBuilder().SetType(mysql.TypeNewDecimal).SetFlen(tt.flen).SetDecimal(tt.frac).BuildP() dec := NewDecFromStringForTest(tt.dec) diff --git a/pkg/types/format_test.go b/pkg/types/format_test.go index a6caefdbe4911..8db9d57d858f4 100644 --- a/pkg/types/format_test.go +++ b/pkg/types/format_test.go @@ -20,11 +20,12 @@ import ( "github.com/pingcap/tidb/pkg/parser/mysql" "github.com/pingcap/tidb/pkg/types" + contextutil "github.com/pingcap/tidb/pkg/util/context" "github.com/stretchr/testify/require" ) func TestTimeFormatMethod(t *testing.T) { - typeCtx := types.NewContext(types.StrictFlags.WithIgnoreZeroInDate(true), time.UTC, func(err error) {}) + typeCtx := types.NewContext(types.StrictFlags.WithIgnoreZeroInDate(true), time.UTC, contextutil.IgnoreWarn) tblDate := []struct { Input string Format string @@ -78,7 +79,7 @@ func TestTimeFormatMethod(t *testing.T) { } func TestStrToDate(t *testing.T) { - typeCtx := types.NewContext(types.StrictFlags.WithIgnoreZeroInDate(true), time.UTC, func(err error) {}) + typeCtx := types.NewContext(types.StrictFlags.WithIgnoreZeroInDate(true), time.UTC, contextutil.IgnoreWarn) tests := []struct { input string format string diff --git a/pkg/types/main_test.go b/pkg/types/main_test.go index e18894ac68b20..81a98931f9c23 100644 --- a/pkg/types/main_test.go +++ b/pkg/types/main_test.go @@ -25,6 +25,7 @@ func TestMain(m *testing.M) { testsetup.SetupForCommonTest() opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), diff --git a/pkg/types/parser_driver/main_test.go b/pkg/types/parser_driver/main_test.go index 50aa866ac77f3..fe8dbb752ef8b 100644 --- a/pkg/types/parser_driver/main_test.go +++ b/pkg/types/parser_driver/main_test.go @@ -25,6 +25,7 @@ func TestMain(m *testing.M) { testsetup.SetupForCommonTest() opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), } diff --git a/pkg/types/time.go b/pkg/types/time.go index c4acba3b21e65..a643e1f77bbec 100644 --- a/pkg/types/time.go +++ b/pkg/types/time.go @@ -953,7 +953,7 @@ func parseDatetime(ctx Context, str string, fsp int, isFloat bool) (Time, error) seps, fracStr, hasTZ, tzSign, tzHour, tzSep, tzMinute, truncatedOrIncorrect := splitDateTime(str) if truncatedOrIncorrect { - ctx.AppendWarning(ErrTruncatedWrongVal.GenWithStackByArgs("datetime", str)) + ctx.AppendWarning(ErrTruncatedWrongVal.FastGenByArgs("datetime", str)) } /* if we have timezone parsed, there are the following cases to be considered, however some of them are wrongly parsed, and we should consider absorb them back to seps. @@ -1116,11 +1116,11 @@ func parseDatetime(ctx Context, str string, fsp int, isFloat bool) (Time, error) truncatedOrIncorrect = err != nil } if truncatedOrIncorrect { - ctx.AppendWarning(ErrTruncatedWrongVal.GenWithStackByArgs("datetime", str)) + ctx.AppendWarning(ErrTruncatedWrongVal.FastGenByArgs("datetime", str)) err = nil } case 2: - return ZeroDatetime, errors.Trace(ErrWrongValue.GenWithStackByArgs(DateTimeStr, str)) + return ZeroDatetime, errors.Trace(ErrWrongValue.FastGenByArgs(DateTimeStr, str)) case 3: // YYYY-MM-DD err = scanTimeArgs(seps, &year, &month, &day) @@ -1139,7 +1139,7 @@ func parseDatetime(ctx Context, str string, fsp int, isFloat bool) (Time, error) // For case like `2020-05-28 23:59:59 00:00:00`, the seps should be > 6, the reluctant parts should be truncated. seps = seps[:6] // YYYY-MM-DD HH-MM-SS - ctx.AppendWarning(ErrTruncatedWrongVal.GenWithStackByArgs("datetime", str)) + ctx.AppendWarning(ErrTruncatedWrongVal.FastGenByArgs("datetime", str)) err = scanTimeArgs(seps, &year, &month, &day, &hour, &minute, &second) hhmmss = true } @@ -2301,9 +2301,12 @@ func parseSingleTimeValue(unit string, format string, strictCheck bool) (year in if len(format) > 0 && format[0] == '-' { sign = int64(-1) } + + // We should also continue even if an error occurs here + // because the called may ignore the error and use the return value. iv, err := strconv.ParseInt(format[0:decimalPointPos], 10, 64) if err != nil { - return 0, 0, 0, 0, 0, ErrWrongValue.GenWithStackByArgs(DateTimeStr, format) + err = ErrWrongValue.GenWithStackByArgs(DateTimeStr, format) } riv := iv // Rounded integer value @@ -2312,22 +2315,23 @@ func parseSingleTimeValue(unit string, format string, strictCheck bool) (year in lf := len(format) - 1 // Has fraction part if decimalPointPos < lf { + var tmpErr error dvPre := oneToSixDigitRegex.FindString(format[decimalPointPos+1:]) // the numberical prefix of the fraction part decimalLen = len(dvPre) if decimalLen >= 6 { // MySQL rounds down to 1e-6. - if dv, err = strconv.ParseInt(dvPre[0:6], 10, 64); err != nil { - return 0, 0, 0, 0, 0, ErrWrongValue.GenWithStackByArgs(DateTimeStr, format) + if dv, tmpErr = strconv.ParseInt(dvPre[0:6], 10, 64); tmpErr != nil && err == nil { + err = ErrWrongValue.GenWithStackByArgs(DateTimeStr, format) } } else { - if dv, err = strconv.ParseInt(dvPre+"000000"[:6-decimalLen], 10, 64); err != nil { - return 0, 0, 0, 0, 0, ErrWrongValue.GenWithStackByArgs(DateTimeStr, format) + if dv, tmpErr = strconv.ParseInt(dvPre+"000000"[:6-decimalLen], 10, 64); tmpErr != nil && err == nil { + err = ErrWrongValue.GenWithStackByArgs(DateTimeStr, format) } } if dv >= 500000 { // Round up, and we should keep 6 digits for microsecond, so dv should in [000000, 999999]. riv += sign } - if unit != "SECOND" { + if unit != "SECOND" && err == nil { err = ErrTruncatedWrongVal.GenWithStackByArgs(format) } dv *= sign @@ -2421,39 +2425,44 @@ func parseTimeValue(format string, index, cnt int) (years int64, months int64, d index-- } + // ParseInt may return an error when overflowed, but we should continue to parse the rest of the string because + // the caller may ignore the error and use the return value. + // In this case, we should return a big value to make sure the result date after adding this interval + // is also overflowed and NULL is returned to the user. years, err = strconv.ParseInt(fields[YearIndex], 10, 64) if err != nil { - return 0, 0, 0, 0, 0, ErrWrongValue.GenWithStackByArgs(DateTimeStr, originalFmt) + err = ErrWrongValue.GenWithStackByArgs(DateTimeStr, originalFmt) } - months, err = strconv.ParseInt(fields[MonthIndex], 10, 64) - if err != nil { - return 0, 0, 0, 0, 0, ErrWrongValue.GenWithStackByArgs(DateTimeStr, originalFmt) + var tmpErr error + months, tmpErr = strconv.ParseInt(fields[MonthIndex], 10, 64) + if err == nil && tmpErr != nil { + err = ErrWrongValue.GenWithStackByArgs(DateTimeStr, originalFmt) } - days, err = strconv.ParseInt(fields[DayIndex], 10, 64) - if err != nil { - return 0, 0, 0, 0, 0, ErrWrongValue.GenWithStackByArgs(DateTimeStr, originalFmt) + days, tmpErr = strconv.ParseInt(fields[DayIndex], 10, 64) + if err == nil && tmpErr != nil { + err = ErrWrongValue.GenWithStackByArgs(DateTimeStr, originalFmt) } - hours, err := strconv.ParseInt(fields[HourIndex], 10, 64) - if err != nil { - return 0, 0, 0, 0, 0, ErrWrongValue.GenWithStackByArgs(DateTimeStr, originalFmt) + hours, tmpErr := strconv.ParseInt(fields[HourIndex], 10, 64) + if tmpErr != nil && err == nil { + err = ErrWrongValue.GenWithStackByArgs(DateTimeStr, originalFmt) } - minutes, err := strconv.ParseInt(fields[MinuteIndex], 10, 64) - if err != nil { - return 0, 0, 0, 0, 0, ErrWrongValue.GenWithStackByArgs(DateTimeStr, originalFmt) + minutes, tmpErr := strconv.ParseInt(fields[MinuteIndex], 10, 64) + if tmpErr != nil && err == nil { + err = ErrWrongValue.GenWithStackByArgs(DateTimeStr, originalFmt) } - seconds, err := strconv.ParseInt(fields[SecondIndex], 10, 64) - if err != nil { - return 0, 0, 0, 0, 0, ErrWrongValue.GenWithStackByArgs(DateTimeStr, originalFmt) + seconds, tmpErr := strconv.ParseInt(fields[SecondIndex], 10, 64) + if tmpErr != nil && err == nil { + err = ErrWrongValue.GenWithStackByArgs(DateTimeStr, originalFmt) } - microseconds, err := strconv.ParseInt(alignFrac(fields[MicrosecondIndex], MaxFsp), 10, 64) - if err != nil { - return 0, 0, 0, 0, 0, ErrWrongValue.GenWithStackByArgs(DateTimeStr, originalFmt) + microseconds, tmpErr := strconv.ParseInt(alignFrac(fields[MicrosecondIndex], MaxFsp), 10, 64) + if tmpErr != nil && err == nil { + err = ErrWrongValue.GenWithStackByArgs(DateTimeStr, originalFmt) } seconds = hours*3600 + minutes*60 + seconds days += seconds / (3600 * 24) seconds %= 3600 * 24 - return years, months, days, seconds*int64(gotime.Second) + microseconds*int64(gotime.Microsecond), fsp, nil + return years, months, days, seconds*int64(gotime.Second) + microseconds*int64(gotime.Microsecond), fsp, err } func parseAndValidateDurationValue(format string, index, cnt int) (int64, int, error) { @@ -2908,7 +2917,7 @@ func (t *Time) StrToDate(typeCtx Context, date, format string) bool { if warning { // Only append this warning when success but still need warning. // Currently this only happens when `date` has extra characters at the end. - typeCtx.AppendWarning(ErrTruncatedWrongVal.GenWithStackByArgs(DateTimeStr, date)) + typeCtx.AppendWarning(ErrTruncatedWrongVal.FastGenByArgs(DateTimeStr, date)) } return true } diff --git a/pkg/types/time_test.go b/pkg/types/time_test.go index bff3fd3f8c8e5..4910ae075b655 100644 --- a/pkg/types/time_test.go +++ b/pkg/types/time_test.go @@ -26,6 +26,7 @@ import ( "github.com/pingcap/tidb/pkg/parser/mysql" "github.com/pingcap/tidb/pkg/parser/terror" "github.com/pingcap/tidb/pkg/types" + contextutil "github.com/pingcap/tidb/pkg/util/context" "github.com/stretchr/testify/require" ) @@ -60,9 +61,9 @@ func TestTimeEncoding(t *testing.T) { func TestDateTime(t *testing.T) { var warnings []error - typeCtx := types.NewContext(types.StrictFlags.WithIgnoreZeroInDate(true), time.UTC, func(err error) { + typeCtx := types.NewContext(types.StrictFlags.WithIgnoreZeroInDate(true), time.UTC, contextutil.NewFuncWarnHandlerForTest(func(err error) { warnings = append(warnings, err) - }) + })) table := []struct { Input string Expect string @@ -209,7 +210,7 @@ func TestTimestamp(t *testing.T) { } func TestDate(t *testing.T) { - typeCtx := types.NewContext(types.StrictFlags.WithIgnoreZeroInDate(true), time.UTC, func(err error) {}) + typeCtx := types.NewContext(types.StrictFlags.WithIgnoreZeroInDate(true), time.UTC, contextutil.IgnoreWarn) table := []struct { Input string Expect string @@ -303,7 +304,7 @@ func TestDate(t *testing.T) { } func TestTime(t *testing.T) { - typeCtx := types.NewContext(types.StrictFlags.WithIgnoreZeroInDate(true), time.UTC, func(err error) {}) + typeCtx := types.NewContext(types.StrictFlags.WithIgnoreZeroInDate(true), time.UTC, contextutil.IgnoreWarn) table := []struct { Input string Expect string @@ -449,7 +450,7 @@ func TestDurationAdd(t *testing.T) { } func TestDurationSub(t *testing.T) { - typeCtx := types.NewContext(types.StrictFlags.WithIgnoreZeroInDate(true), time.UTC, func(err error) {}) + typeCtx := types.NewContext(types.StrictFlags.WithIgnoreZeroInDate(true), time.UTC, contextutil.IgnoreWarn) table := []struct { Input string Fsp int @@ -472,7 +473,7 @@ func TestDurationSub(t *testing.T) { } func TestTimeFsp(t *testing.T) { - typeCtx := types.NewContext(types.StrictFlags.WithIgnoreZeroInDate(true), time.UTC, func(err error) {}) + typeCtx := types.NewContext(types.StrictFlags.WithIgnoreZeroInDate(true), time.UTC, contextutil.IgnoreWarn) table := []struct { Input string Fsp int @@ -701,7 +702,7 @@ func TestParseTimeFromNum(t *testing.T) { func TestToNumber(t *testing.T) { losAngelesTz, err := time.LoadLocation("America/Los_Angeles") require.NoError(t, err) - typeCtx := types.NewContext(types.StrictFlags.WithIgnoreZeroInDate(true), losAngelesTz, func(err error) {}) + typeCtx := types.NewContext(types.StrictFlags.WithIgnoreZeroInDate(true), losAngelesTz, contextutil.IgnoreWarn) tblDateTime := []struct { Input string Fsp int @@ -773,7 +774,7 @@ func TestToNumber(t *testing.T) { } func TestParseTimeFromFloatString(t *testing.T) { - typeCtx := types.NewContext(types.StrictFlags.WithIgnoreZeroInDate(true), time.UTC, func(err error) {}) + typeCtx := types.NewContext(types.StrictFlags.WithIgnoreZeroInDate(true), time.UTC, contextutil.IgnoreWarn) table := []struct { Input string Fsp int @@ -840,7 +841,7 @@ func TestParseFrac(t *testing.T) { } func TestRoundFrac(t *testing.T) { - typeCtx := types.NewContext(types.StrictFlags.WithIgnoreZeroInDate(true), time.UTC, func(err error) {}) + typeCtx := types.NewContext(types.StrictFlags.WithIgnoreZeroInDate(true), time.UTC, contextutil.IgnoreWarn) tbl := []struct { Input string Fsp int @@ -931,7 +932,7 @@ func TestRoundFrac(t *testing.T) { func TestConvert(t *testing.T) { losAngelesTz, _ := time.LoadLocation("America/Los_Angeles") - typeCtx := types.NewContext(types.StrictFlags.WithIgnoreZeroInDate(true), losAngelesTz, func(err error) {}) + typeCtx := types.NewContext(types.StrictFlags.WithIgnoreZeroInDate(true), losAngelesTz, contextutil.IgnoreWarn) tbl := []struct { Input string Fsp int @@ -1774,7 +1775,7 @@ func TestIsDateFormat(t *testing.T) { } func TestParseTimeFromInt64(t *testing.T) { - typeCtx := types.NewContext(types.StrictFlags.WithIgnoreZeroInDate(true), time.UTC, func(err error) {}) + typeCtx := types.NewContext(types.StrictFlags.WithIgnoreZeroInDate(true), time.UTC, contextutil.IgnoreWarn) input := int64(20190412140000) output, err := types.ParseTimeFromInt64(typeCtx, input) @@ -1791,7 +1792,7 @@ func TestParseTimeFromInt64(t *testing.T) { } func TestParseTimeFromFloat64(t *testing.T) { - typeCtx := types.NewContext(types.StrictFlags.WithIgnoreZeroInDate(true), time.UTC, func(err error) {}) + typeCtx := types.NewContext(types.StrictFlags.WithIgnoreZeroInDate(true), time.UTC, contextutil.IgnoreWarn) cases := []struct { f float64 @@ -1834,7 +1835,7 @@ func TestParseTimeFromFloat64(t *testing.T) { } func TestParseTimeFromDecimal(t *testing.T) { - typeCtx := types.NewContext(types.StrictFlags.WithIgnoreZeroInDate(true), time.UTC, func(err error) {}) + typeCtx := types.NewContext(types.StrictFlags.WithIgnoreZeroInDate(true), time.UTC, contextutil.IgnoreWarn) cases := []struct { d *types.MyDecimal @@ -1909,7 +1910,7 @@ func TestGetFracIndex(t *testing.T) { } func TestTimeOverflow(t *testing.T) { - typeCtx := types.NewContext(types.StrictFlags.WithIgnoreZeroInDate(true), time.UTC, func(err error) {}) + typeCtx := types.NewContext(types.StrictFlags.WithIgnoreZeroInDate(true), time.UTC, contextutil.IgnoreWarn) table := []struct { Input string Output bool @@ -2001,7 +2002,7 @@ func TestCheckMonthDay(t *testing.T) { {types.FromDate(3200, 2, 29, 0, 0, 0, 0), true}, } - typeCtx := types.NewContext(types.StrictFlags.WithIgnoreInvalidDateErr(false), time.UTC, func(err error) {}) + typeCtx := types.NewContext(types.StrictFlags.WithIgnoreInvalidDateErr(false), time.UTC, contextutil.IgnoreWarn) for _, tt := range dates { v := types.NewTime(tt.date, mysql.TypeDate, types.DefaultFsp) @@ -2166,7 +2167,7 @@ func TestParseWithTimezone(t *testing.T) { }, } for ith, ca := range cases { - v, err := types.ParseTime(types.NewContext(types.StrictFlags, ca.sysTZ, func(err error) {}), ca.lit, mysql.TypeTimestamp, ca.fsp) + v, err := types.ParseTime(types.NewContext(types.StrictFlags, ca.sysTZ, contextutil.IgnoreWarn), ca.lit, mysql.TypeTimestamp, ca.fsp) require.NoErrorf(t, err, "tidb time parse misbehaved on %d", ith) if err != nil { continue @@ -2209,9 +2210,9 @@ func TestDurationConvertToYearFromNow(t *testing.T) { } for _, c := range cases { - ctx := types.NewContext(types.StrictFlags.WithCastTimeToYearThroughConcat(c.throughStr), c.sysTZ, func(_ error) { + ctx := types.NewContext(types.StrictFlags.WithCastTimeToYearThroughConcat(c.throughStr), c.sysTZ, contextutil.NewFuncWarnHandlerForTest(func(_ error) { require.Fail(t, "shouldn't append warninng") - }) + })) now, err := time.Parse(time.RFC3339, c.nowLit) require.NoError(t, err) diff --git a/pkg/util/BUILD.bazel b/pkg/util/BUILD.bazel index c292501389a4f..8b05a7d43f46b 100644 --- a/pkg/util/BUILD.bazel +++ b/pkg/util/BUILD.bazel @@ -82,6 +82,7 @@ go_test( "//pkg/testkit/testsetup", "//pkg/types", "//pkg/util/fastrand", + "//pkg/util/logutil", "//pkg/util/memory", "@com_github_pingcap_errors//:errors", "@com_github_stretchr_testify//assert", diff --git a/pkg/util/admin/main_test.go b/pkg/util/admin/main_test.go index 98458e4d747fd..fe5ca4e6a60dd 100644 --- a/pkg/util/admin/main_test.go +++ b/pkg/util/admin/main_test.go @@ -32,6 +32,7 @@ func TestMain(m *testing.M) { opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), } diff --git a/pkg/util/arena/main_test.go b/pkg/util/arena/main_test.go index 1a6ed68534ada..62e360f9c65de 100644 --- a/pkg/util/arena/main_test.go +++ b/pkg/util/arena/main_test.go @@ -25,6 +25,7 @@ func TestMain(m *testing.M) { testsetup.SetupForCommonTest() opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), } diff --git a/pkg/util/benchdaily/main_test.go b/pkg/util/benchdaily/main_test.go index e6915fd19d87e..8b1f2a0a26455 100644 --- a/pkg/util/benchdaily/main_test.go +++ b/pkg/util/benchdaily/main_test.go @@ -25,6 +25,7 @@ func TestMain(m *testing.M) { testsetup.SetupForCommonTest() opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), } diff --git a/pkg/util/bitmap/main_test.go b/pkg/util/bitmap/main_test.go index 2b41b309c4d69..c9049d4781453 100644 --- a/pkg/util/bitmap/main_test.go +++ b/pkg/util/bitmap/main_test.go @@ -25,6 +25,7 @@ func TestMain(m *testing.M) { testsetup.SetupForCommonTest() opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), } diff --git a/pkg/util/cgroup/cgroup_cpu_linux.go b/pkg/util/cgroup/cgroup_cpu_linux.go index a75033a7d09c7..e39f9f9d6c0cf 100644 --- a/pkg/util/cgroup/cgroup_cpu_linux.go +++ b/pkg/util/cgroup/cgroup_cpu_linux.go @@ -17,6 +17,7 @@ package cgroup import ( + "fmt" "math" "os" "runtime" @@ -24,6 +25,7 @@ import ( "github.com/pingcap/errors" "github.com/pingcap/failpoint" + "github.com/pingcap/log" ) // GetCgroupCPU returns the CPU usage and quota for the current cgroup. @@ -66,10 +68,30 @@ func inContainer(path string) bool { if err != nil { return false } - if strings.Contains(string(v), "docker") || - strings.Contains(string(v), "kubepods") || - strings.Contains(string(v), "containerd") { - return true + + // For cgroup V1, check /proc/self/cgroup + if path == procPathCGroup { + if strings.Contains(string(v), "docker") || + strings.Contains(string(v), "kubepods") || + strings.Contains(string(v), "containerd") { + return true + } + } + + // For cgroup V2, check /proc/self/mountinfo + if path == procPathMountInfo { + lines := strings.Split(string(v), "\n") + for _, line := range lines { + v := strings.Split(line, " ") + // check mount point is on overlay or not. + // v[4] means `mount point`, v[8] means `filesystem type`. + // see details from https://man7.org/linux/man-pages/man5/proc.5.html + if len(v) >= 8 && v[4] == "\\" && v[8] == "overlay" { + log.Info(fmt.Sprintf("TiDB runs in a container, mount info: %s", line)) + return true + } + } } + return false } diff --git a/pkg/util/checksum/main_test.go b/pkg/util/checksum/main_test.go index 70535f9187fe1..f91dfc6d2981c 100644 --- a/pkg/util/checksum/main_test.go +++ b/pkg/util/checksum/main_test.go @@ -25,6 +25,7 @@ func TestMain(m *testing.M) { testsetup.SetupForCommonTest() opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), } diff --git a/pkg/util/chunk/BUILD.bazel b/pkg/util/chunk/BUILD.bazel index 8aa1fa4f47f36..965932cd98bcc 100644 --- a/pkg/util/chunk/BUILD.bazel +++ b/pkg/util/chunk/BUILD.bazel @@ -5,6 +5,7 @@ go_library( srcs = [ "alloc.go", "chunk.go", + "chunk_in_disk.go", "chunk_util.go", "codec.go", "column.go", @@ -31,6 +32,7 @@ go_library( "//pkg/util/hack", "//pkg/util/logutil", "//pkg/util/memory", + "//pkg/util/syncutil", "@com_github_pingcap_errors//:errors", "@com_github_pingcap_failpoint//:failpoint", "@org_golang_x_sys//cpu", @@ -43,6 +45,7 @@ go_test( timeout = "short", srcs = [ "alloc_test.go", + "chunk_in_disk_test.go", "chunk_test.go", "chunk_util_test.go", "codec_test.go", diff --git a/pkg/util/chunk/alloc.go b/pkg/util/chunk/alloc.go index ac40309a88c7c..470c82e03c66e 100644 --- a/pkg/util/chunk/alloc.go +++ b/pkg/util/chunk/alloc.go @@ -16,6 +16,7 @@ package chunk import ( "math" + "sync" "github.com/pingcap/tidb/pkg/types" ) @@ -241,3 +242,103 @@ func (cList *columnList) push(col *Column) { cList.allocColumns = append(cList.allocColumns, col) } } + +var _ Allocator = &syncAllocator{} + +// syncAllocator uses a mutex to protect the allocator. +type syncAllocator struct { + mu sync.Mutex + alloc Allocator +} + +// NewSyncAllocator creates the synchronized version of the `alloc` +func NewSyncAllocator(alloc Allocator) Allocator { + return &syncAllocator{ + alloc: alloc, + } +} + +// Alloc implements `Allocator` for `*syncAllocator` +func (s *syncAllocator) Alloc(fields []*types.FieldType, capacity, maxChunkSize int) *Chunk { + s.mu.Lock() + defer s.mu.Unlock() + + return s.alloc.Alloc(fields, capacity, maxChunkSize) +} + +// CheckReuseAllocSize implements `Allocator` for `*syncAllocator` +func (s *syncAllocator) CheckReuseAllocSize() bool { + s.mu.Lock() + defer s.mu.Unlock() + + return s.alloc.CheckReuseAllocSize() +} + +// Reset implements `Allocator` for `*syncAllocator` +func (s *syncAllocator) Reset() { + s.mu.Lock() + defer s.mu.Unlock() + + s.alloc.Reset() +} + +var _ Allocator = &reuseHookAllocator{} + +// reuseHookAllocator will run the function hook when it allocates the first chunk from reused part +type reuseHookAllocator struct { + once sync.Once + f func() + + alloc Allocator +} + +// NewReuseHookAllocator creates an allocator, which will call the function `f` when the first reused chunk is allocated. +func NewReuseHookAllocator(alloc Allocator, f func()) Allocator { + return &reuseHookAllocator{ + f: f, + alloc: alloc, + } +} + +// Alloc implements `Allocator` for `*reuseHookAllocator` +func (r *reuseHookAllocator) Alloc(fields []*types.FieldType, capacity, maxChunkSize int) *Chunk { + if r.alloc.CheckReuseAllocSize() { + r.once.Do(r.f) + } + + return r.alloc.Alloc(fields, capacity, maxChunkSize) +} + +// CheckReuseAllocSize implements `Allocator` for `*reuseHookAllocator` +func (r *reuseHookAllocator) CheckReuseAllocSize() bool { + return r.alloc.CheckReuseAllocSize() +} + +// Reset implements `Allocator` for `*reuseHookAllocator` +func (r *reuseHookAllocator) Reset() { + r.alloc.Reset() +} + +var _ Allocator = emptyAllocator{} + +type emptyAllocator struct{} + +var defaultEmptyAllocator Allocator = emptyAllocator{} + +// NewEmptyAllocator creates an empty pool, which will always call `chunk.New` to create a new chunk +func NewEmptyAllocator() Allocator { + return defaultEmptyAllocator +} + +// Alloc implements `Allocator` for `*emptyAllocator` +func (emptyAllocator) Alloc(fields []*types.FieldType, capacity, maxChunkSize int) *Chunk { + return New(fields, capacity, maxChunkSize) +} + +// CheckReuseAllocSize implements `Allocator` for `*emptyAllocator` +func (emptyAllocator) CheckReuseAllocSize() bool { + return false +} + +// Reset implements `Allocator` for `*emptyAllocator` +func (emptyAllocator) Reset() {} diff --git a/pkg/util/chunk/alloc_test.go b/pkg/util/chunk/alloc_test.go index b3838c96fca7d..59b404d39d533 100644 --- a/pkg/util/chunk/alloc_test.go +++ b/pkg/util/chunk/alloc_test.go @@ -15,6 +15,8 @@ package chunk import ( + "sync" + "sync/atomic" "testing" "github.com/pingcap/tidb/pkg/parser/mysql" @@ -289,3 +291,71 @@ func TestColumnAllocatorCheck(t *testing.T) { num = alloc.columnAlloc.pool[getFixedLen(types.NewFieldTypeBuilder().SetType(mysql.TypeDatetime).BuildP())].Len() require.Equal(t, num, 4) } + +func TestReuseHookAllocator(t *testing.T) { + fieldTypes := []*types.FieldType{ + types.NewFieldType(mysql.TypeVarchar), + types.NewFieldType(mysql.TypeJSON), + types.NewFieldType(mysql.TypeFloat), + types.NewFieldType(mysql.TypeNewDecimal), + types.NewFieldType(mysql.TypeDouble), + types.NewFieldType(mysql.TypeLonglong), + types.NewFieldType(mysql.TypeTimestamp), + types.NewFieldType(mysql.TypeDatetime), + } + + var reuse atomic.Int64 + + InitChunkAllocSize(0, 0) + alloc := NewReuseHookAllocator(NewAllocator(), func() { + reuse.Add(1) + }) + // as we init MaxFreeChunks and MaxFreeColumns as 0, the reuse is still 0 after alloc + chk := alloc.Alloc(fieldTypes, 5, 100) + require.NotNil(t, chk) + require.Equal(t, int64(0), reuse.Load()) + + InitChunkAllocSize(10, 20) + alloc = NewReuseHookAllocator(NewAllocator(), func() { + reuse.Add(1) + }) + chk = alloc.Alloc(fieldTypes, 5, 100) + require.NotNil(t, chk) + require.Equal(t, int64(1), reuse.Load()) + // Another alloc will not touch it + chk = alloc.Alloc(fieldTypes, 5, 100) + require.NotNil(t, chk) + require.Equal(t, int64(1), reuse.Load()) +} + +func TestSyncAllocator(t *testing.T) { + fieldTypes := []*types.FieldType{ + types.NewFieldType(mysql.TypeVarchar), + types.NewFieldType(mysql.TypeJSON), + types.NewFieldType(mysql.TypeFloat), + types.NewFieldType(mysql.TypeNewDecimal), + types.NewFieldType(mysql.TypeDouble), + types.NewFieldType(mysql.TypeLonglong), + types.NewFieldType(mysql.TypeTimestamp), + types.NewFieldType(mysql.TypeDatetime), + } + + alloc := NewSyncAllocator(NewAllocator()) + + wg := &sync.WaitGroup{} + for i := 0; i < 1000; i++ { + wg.Add(1) + go func() { + for j := 0; j < 10; j++ { + for k := 0; k < 100; k++ { + chk := alloc.Alloc(fieldTypes, 5, 100) + require.NotNil(t, chk) + } + alloc.Reset() + } + + wg.Done() + }() + } + wg.Wait() +} diff --git a/pkg/util/chunk/chunk.go b/pkg/util/chunk/chunk.go index 6242de8450633..03f2abd0b2ea1 100644 --- a/pkg/util/chunk/chunk.go +++ b/pkg/util/chunk/chunk.go @@ -54,11 +54,28 @@ const ( ZeroCapacity = 0 ) +// NewEmptyChunk creates an empty chunk +func NewEmptyChunk(fields []*types.FieldType) *Chunk { + chk := &Chunk{ + columns: make([]*Column, 0, len(fields)), + } + + for _, f := range fields { + chk.columns = append(chk.columns, NewEmptyColumn(f)) + } + return chk +} + // NewChunkWithCapacity creates a new chunk with field types and capacity. func NewChunkWithCapacity(fields []*types.FieldType, capacity int) *Chunk { return New(fields, capacity, capacity) } +// NewChunkFromPoolWithCapacity creates a new chunk with field types and capacity from the pool. +func NewChunkFromPoolWithCapacity(fields []*types.FieldType, initCap int) *Chunk { + return getChunkFromPool(initCap, fields) +} + // New creates a new chunk. // // cap: the limit for the max number of rows. @@ -657,3 +674,8 @@ func (c *Chunk) AppendPartialRows(colOff int, rows []Row) { } } } + +// Destroy is to destroy the Chunk and put Chunk into the pool +func (c *Chunk) Destroy(initCap int, fields []*types.FieldType) { + putChunkFromPool(initCap, fields, c) +} diff --git a/pkg/util/chunk/chunk_in_disk.go b/pkg/util/chunk/chunk_in_disk.go new file mode 100644 index 0000000000000..f648f2c1bf453 --- /dev/null +++ b/pkg/util/chunk/chunk_in_disk.go @@ -0,0 +1,317 @@ +// Copyright 2023 PingCAP, 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. + +package chunk + +import ( + "io" + "os" + "strconv" + "unsafe" + + errors2 "github.com/pingcap/errors" + "github.com/pingcap/tidb/pkg/parser/terror" + "github.com/pingcap/tidb/pkg/types" + "github.com/pingcap/tidb/pkg/util/disk" + "github.com/pingcap/tidb/pkg/util/memory" +) + +const byteLen = int64(unsafe.Sizeof(byte(0))) +const intLen = int64(unsafe.Sizeof(int(0))) +const int64Len = int64(unsafe.Sizeof(int64(0))) + +const chkFixedSize = intLen * 4 +const colMetaSize = int64Len * 4 + +const defaultChunkDataInDiskByChunksPath = "defaultChunkDataInDiskByChunksPath" + +// DataInDiskByChunks represents some data stored in temporary disk. +// They can only be restored by chunks. +type DataInDiskByChunks struct { + fieldTypes []*types.FieldType + offsetOfEachChunk []int64 + + totalDataSize int64 + totalRowNum int64 + diskTracker *disk.Tracker // track disk usage. + + dataFile diskFileReaderWriter + + // Write or read data needs this buffer to temporarily store data + buf []byte +} + +// NewDataInDiskByChunks creates a new DataInDiskByChunks with field types. +func NewDataInDiskByChunks(fieldTypes []*types.FieldType) *DataInDiskByChunks { + d := &DataInDiskByChunks{ + fieldTypes: fieldTypes, + totalDataSize: 0, + totalRowNum: 0, + // TODO: set the quota of disk usage. + diskTracker: disk.NewTracker(memory.LabelForChunkDataInDiskByChunks, -1), + buf: make([]byte, 0, 4096), + } + return d +} + +func (d *DataInDiskByChunks) initDiskFile() (err error) { + err = disk.CheckAndInitTempDir() + if err != nil { + return + } + err = d.dataFile.initWithFileName(defaultChunkDataInDiskByChunksPath + strconv.Itoa(d.diskTracker.Label())) + return +} + +// GetDiskTracker returns the memory tracker of this List. +func (d *DataInDiskByChunks) GetDiskTracker() *disk.Tracker { + return d.diskTracker +} + +// Add adds a chunk to the DataInDiskByChunks. Caller must make sure the input chk has the same field types. +// Warning: Do not concurrently call this function. +func (d *DataInDiskByChunks) Add(chk *Chunk) (err error) { + if chk.NumRows() == 0 { + return errors2.New("Chunk spilled to disk should have at least 1 row") + } + + if d.dataFile.file == nil { + err = d.initDiskFile() + if err != nil { + return + } + } + + serializedBytesNum := d.serializeDataToBuf(chk) + + var writeNum int + writeNum, err = d.dataFile.write(d.buf) + if err != nil { + return + } + + if int64(writeNum) != serializedBytesNum { + return errors2.New("Some data fail to be spilled to disk") + } + d.offsetOfEachChunk = append(d.offsetOfEachChunk, d.totalDataSize) + d.totalDataSize += serializedBytesNum + d.totalRowNum += int64(chk.NumRows()) + d.dataFile.offWrite += serializedBytesNum + + d.diskTracker.Consume(serializedBytesNum) + return +} + +func (d *DataInDiskByChunks) getChunkSize(chkIdx int) int64 { + totalChunkNum := len(d.offsetOfEachChunk) + if chkIdx == totalChunkNum-1 { + return d.totalDataSize - d.offsetOfEachChunk[chkIdx] + } + return d.offsetOfEachChunk[chkIdx+1] - d.offsetOfEachChunk[chkIdx] +} + +// GetChunk gets a Chunk from the DataInDiskByChunks by chkIdx. +func (d *DataInDiskByChunks) GetChunk(chkIdx int) (*Chunk, error) { + reader := d.dataFile.getSectionReader(d.offsetOfEachChunk[chkIdx]) + chkSize := d.getChunkSize(chkIdx) + + if cap(d.buf) < int(chkSize) { + d.buf = make([]byte, chkSize) + } else { + d.buf = d.buf[:chkSize] + } + + readByteNum, err := io.ReadFull(reader, d.buf) + if err != nil { + return nil, err + } + + if int64(readByteNum) != chkSize { + return nil, errors2.New("Fail to restore the spilled chunk") + } + + chk := NewEmptyChunk(d.fieldTypes) + d.deserializeDataToChunk(chk) + + return chk, nil +} + +// Close releases the disk resource. +func (d *DataInDiskByChunks) Close() { + if d.dataFile.file != nil { + d.diskTracker.Consume(-d.diskTracker.BytesConsumed()) + terror.Call(d.dataFile.file.Close) + terror.Log(os.Remove(d.dataFile.file.Name())) + } +} + +func (d *DataInDiskByChunks) serializeColMeta(pos int64, length int64, nullMapSize int64, dataSize int64, offsetSize int64) { + *(*int64)(unsafe.Pointer(&d.buf[pos])) = length + *(*int64)(unsafe.Pointer(&d.buf[pos+int64Len])) = nullMapSize + *(*int64)(unsafe.Pointer(&d.buf[pos+int64Len*2])) = dataSize + *(*int64)(unsafe.Pointer(&d.buf[pos+int64Len*3])) = offsetSize +} + +func (d *DataInDiskByChunks) serializeOffset(pos *int64, offsets []int64, offsetSize int64) { + d.buf = d.buf[:*pos+offsetSize] + for _, offset := range offsets { + *(*int64)(unsafe.Pointer(&d.buf[*pos])) = offset + *pos += int64Len + } +} + +func (d *DataInDiskByChunks) serializeChunkData(pos *int64, chk *Chunk, selSize int64) { + d.buf = d.buf[:chkFixedSize] + *(*int)(unsafe.Pointer(&d.buf[*pos])) = chk.numVirtualRows + *(*int)(unsafe.Pointer(&d.buf[*pos+intLen])) = chk.capacity + *(*int)(unsafe.Pointer(&d.buf[*pos+intLen*2])) = chk.requiredRows + *(*int)(unsafe.Pointer(&d.buf[*pos+intLen*3])) = int(selSize) + *pos += chkFixedSize + + d.buf = d.buf[:*pos+selSize] + + selLen := len(chk.sel) + for i := 0; i < selLen; i++ { + *(*int)(unsafe.Pointer(&d.buf[*pos])) = chk.sel[i] + *pos += intLen + } +} + +func (d *DataInDiskByChunks) serializeColumns(pos *int64, chk *Chunk) { + for _, col := range chk.columns { + d.buf = d.buf[:*pos+colMetaSize] + nullMapSize := int64(len(col.nullBitmap)) * byteLen + dataSize := int64(len(col.data)) * byteLen + offsetSize := int64(len(col.offsets)) * int64Len + d.serializeColMeta(*pos, int64(col.length), nullMapSize, dataSize, offsetSize) + *pos += colMetaSize + + d.buf = append(d.buf, col.nullBitmap...) + d.buf = append(d.buf, col.data...) + *pos += nullMapSize + dataSize + d.serializeOffset(pos, col.offsets, offsetSize) + } +} + +// Serialized format of a chunk: +// chunk data: | numVirtualRows | capacity | requiredRows | selSize | sel... | +// column1 data: | length | nullMapSize | dataSize | offsetSize | nullBitmap... | data... | offsets... | +// column2 data: | length | nullMapSize | dataSize | offsetSize | nullBitmap... | data... | offsets... | +// ... +// columnN data: | length | nullMapSize | dataSize | offsetSize | nullBitmap... | data... | offsets... | +// +// `xxx...` means this is a variable field filled by bytes. +func (d *DataInDiskByChunks) serializeDataToBuf(chk *Chunk) int64 { + totalBytes := int64(0) + + // Calculate total memory that buffer needs + selSize := int64(len(chk.sel)) * intLen + totalBytes += chkFixedSize + selSize + for _, col := range chk.columns { + nullMapSize := int64(len(col.nullBitmap)) * byteLen + dataSize := int64(len(col.data)) * byteLen + offsetSize := int64(len(col.offsets)) * int64Len + totalBytes += colMetaSize + nullMapSize + dataSize + offsetSize + } + + if cap(d.buf) < int(totalBytes) { + d.buf = make([]byte, 0, totalBytes) + } + + pos := int64(0) + d.serializeChunkData(&pos, chk, selSize) + d.serializeColumns(&pos, chk) + return totalBytes +} + +func (d *DataInDiskByChunks) deserializeColMeta(pos *int64) (length int64, nullMapSize int64, dataSize int64, offsetSize int64) { + length = *(*int64)(unsafe.Pointer(&d.buf[*pos])) + *pos += int64Len + + nullMapSize = *(*int64)(unsafe.Pointer(&d.buf[*pos])) + *pos += int64Len + + dataSize = *(*int64)(unsafe.Pointer(&d.buf[*pos])) + *pos += int64Len + + offsetSize = *(*int64)(unsafe.Pointer(&d.buf[*pos])) + *pos += int64Len + return +} + +func (d *DataInDiskByChunks) deserializeSel(chk *Chunk, pos *int64, selSize int) { + selLen := int64(selSize) / intLen + chk.sel = make([]int, selLen) + for i := int64(0); i < selLen; i++ { + chk.sel[i] = *(*int)(unsafe.Pointer(&d.buf[*pos])) + *pos += intLen + } +} + +func (d *DataInDiskByChunks) deserializeChunkData(chk *Chunk, pos *int64) { + chk.numVirtualRows = *(*int)(unsafe.Pointer(&d.buf[*pos])) + *pos += intLen + + chk.capacity = *(*int)(unsafe.Pointer(&d.buf[*pos])) + *pos += intLen + + chk.requiredRows = *(*int)(unsafe.Pointer(&d.buf[*pos])) + *pos += intLen + + selSize := *(*int)(unsafe.Pointer(&d.buf[*pos])) + *pos += intLen + if selSize != 0 { + d.deserializeSel(chk, pos, selSize) + } +} + +func (d *DataInDiskByChunks) deserializeOffsets(dst []int64, pos *int64) { + offsetNum := len(dst) + for i := 0; i < offsetNum; i++ { + dst[i] = *(*int64)(unsafe.Pointer(&d.buf[*pos])) + *pos += int64Len + } +} + +func (d *DataInDiskByChunks) deserializeColumns(chk *Chunk, pos *int64) { + for _, col := range chk.columns { + length, nullMapSize, dataSize, offsetSize := d.deserializeColMeta(pos) + col.nullBitmap = make([]byte, nullMapSize) + col.data = make([]byte, dataSize) + col.offsets = make([]int64, offsetSize/int64Len) + + col.length = int(length) + copy(col.nullBitmap, d.buf[*pos:*pos+nullMapSize]) + *pos += nullMapSize + copy(col.data, d.buf[*pos:*pos+dataSize]) + *pos += dataSize + d.deserializeOffsets(col.offsets, pos) + } +} + +func (d *DataInDiskByChunks) deserializeDataToChunk(chk *Chunk) { + pos := int64(0) + d.deserializeChunkData(chk, &pos) + d.deserializeColumns(chk, &pos) +} + +// NumRows returns total spilled row number +func (d *DataInDiskByChunks) NumRows() int64 { + return d.totalRowNum +} + +// NumChunks returns total spilled chunk number +func (d *DataInDiskByChunks) NumChunks() int { + return len(d.offsetOfEachChunk) +} diff --git a/pkg/util/chunk/chunk_in_disk_test.go b/pkg/util/chunk/chunk_in_disk_test.go new file mode 100644 index 0000000000000..ce23c233ac0da --- /dev/null +++ b/pkg/util/chunk/chunk_in_disk_test.go @@ -0,0 +1,86 @@ +// Copyright 2023 PingCAP, 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. + +package chunk + +import ( + "math/rand" + "testing" + + "github.com/stretchr/testify/require" +) + +func stripAuxDataForChunk(chk *Chunk) { + chk.capacity = 0 + chk.requiredRows = 0 + chk.numVirtualRows = 0 + chk.sel = nil +} + +func addAuxDataForChunks(chunks []*Chunk) { + for _, chk := range chunks { + chk.capacity = rand.Intn(100) + chk.requiredRows = rand.Intn(100) + chk.numVirtualRows = rand.Intn(100) + + selLen := rand.Intn(50) + 1 + chk.sel = make([]int, selLen) + for i := 0; i < selLen; i++ { + chk.sel[i] = rand.Int() + } + } +} + +func checkAuxDataForChunk(t *testing.T, chk1, chk2 *Chunk) { + require.Equal(t, chk1.capacity, chk2.capacity) + require.Equal(t, chk1.requiredRows, chk2.requiredRows) + require.Equal(t, chk1.numVirtualRows, chk2.numVirtualRows) + require.Equal(t, len(chk1.sel), len(chk2.sel)) + + length := len(chk1.sel) + for i := 0; i < length; i++ { + require.Equal(t, chk1.sel[i], chk2.sel[i]) + } +} + +func checkChunk(t *testing.T, chk1, chk2 *Chunk) { + checkAuxDataForChunk(t, chk1, chk2) + stripAuxDataForChunk(chk1) + stripAuxDataForChunk(chk2) + + require.Equal(t, chk1.NumRows(), chk2.NumRows()) + numRows := chk1.NumRows() + for i := 0; i < numRows; i++ { + checkRow(t, chk1.GetRow(i), chk2.GetRow(i)) + } +} + +func TestDataInDiskByChunks(t *testing.T) { + numChk, numRow := 100, 1000 + chks, fields := initChunks(numChk, numRow) + addAuxDataForChunks(chks) + dataInDiskByChunks := NewDataInDiskByChunks(fields) + defer dataInDiskByChunks.Close() + + for _, chk := range chks { + err := dataInDiskByChunks.Add(chk) + require.NoError(t, err) + } + + for i := 0; i < numChk; i++ { + chk, err := dataInDiskByChunks.GetChunk(i) + require.NoError(t, err) + checkChunk(t, chk, chks[i]) + } +} diff --git a/pkg/util/chunk/chunk_util.go b/pkg/util/chunk/chunk_util.go index 5e96d73e71fe9..b0157f2b2bdc7 100644 --- a/pkg/util/chunk/chunk_util.go +++ b/pkg/util/chunk/chunk_util.go @@ -14,7 +14,15 @@ package chunk -import "github.com/pingcap/errors" +import ( + "io" + "os" + + "github.com/pingcap/errors" + "github.com/pingcap/tidb/pkg/config" + "github.com/pingcap/tidb/pkg/util/checksum" + "github.com/pingcap/tidb/pkg/util/encrypt" +) // CopySelectedJoinRowsDirect directly copies the selected joined rows from the source Chunk // to the destination Chunk. @@ -165,3 +173,67 @@ func copySameOuterRows(outerColOffset, outerColLen int, src *Chunk, numRows int, } } } + +// diskFileReaderWriter represents a Reader and a Writer for the temporary disk file. +type diskFileReaderWriter struct { + file *os.File + writer io.WriteCloser + + // offWrite is the current offset for writing. + offWrite int64 + + checksumWriter *checksum.Writer + cipherWriter *encrypt.Writer // cipherWriter is only enable when config SpilledFileEncryptionMethod is "aes128-ctr" + + // ctrCipher stores the key and nonce using by aes encrypt io layer + ctrCipher *encrypt.CtrCipher +} + +func (l *diskFileReaderWriter) initWithFileName(fileName string) (err error) { + // `os.CreateTemp` will insert random string so that a random file name will be generated. + l.file, err = os.CreateTemp(config.GetGlobalConfig().TempStoragePath, fileName) + if err != nil { + return errors.Trace(err) + } + var underlying io.WriteCloser = l.file + if config.GetGlobalConfig().Security.SpilledFileEncryptionMethod != config.SpilledFileEncryptionMethodPlaintext { + // The possible values of SpilledFileEncryptionMethod are "plaintext", "aes128-ctr" + l.ctrCipher, err = encrypt.NewCtrCipher() + if err != nil { + return + } + l.cipherWriter = encrypt.NewWriter(l.file, l.ctrCipher) + underlying = l.cipherWriter + } + l.checksumWriter = checksum.NewWriter(underlying) + l.writer = l.checksumWriter + l.offWrite = 0 + return +} + +func (l *diskFileReaderWriter) getReader() io.ReaderAt { + var underlying io.ReaderAt = l.file + if l.ctrCipher != nil { + underlying = NewReaderWithCache(encrypt.NewReader(l.file, l.ctrCipher), l.cipherWriter.GetCache(), l.cipherWriter.GetCacheDataOffset()) + } + if l.checksumWriter != nil { + underlying = NewReaderWithCache(checksum.NewReader(underlying), l.checksumWriter.GetCache(), l.checksumWriter.GetCacheDataOffset()) + } + return underlying +} + +func (l *diskFileReaderWriter) getSectionReader(off int64) *io.SectionReader { + checksumReader := l.getReader() + r := io.NewSectionReader(checksumReader, off, l.offWrite-off) + return r +} + +func (l *diskFileReaderWriter) getWriter() io.Writer { + return l.writer +} + +func (l *diskFileReaderWriter) write(writeData []byte) (n int, err error) { + writeNum, err := l.writer.Write(writeData) + l.offWrite += int64(writeNum) + return writeNum, err +} diff --git a/pkg/util/chunk/column.go b/pkg/util/chunk/column.go index e83d939669690..5b2a3e87369e7 100644 --- a/pkg/util/chunk/column.go +++ b/pkg/util/chunk/column.go @@ -17,6 +17,7 @@ package chunk import ( "fmt" "math/bits" + "math/rand" "reflect" "time" "unsafe" @@ -82,6 +83,16 @@ func (DefaultColumnAllocator) NewColumn(ft *types.FieldType, capacity int) *Colu return newColumn(getFixedLen(ft), capacity) } +// NewEmptyColumn creates a new column with nothing. +func NewEmptyColumn(ft *types.FieldType) *Column { + elemLen := getFixedLen(ft) + col := Column{} + if elemLen != varElemLen { + col.elemBuf = make([]byte, elemLen) + } + return &col +} + // NewColumn creates a new column with the specific type and capacity. func NewColumn(ft *types.FieldType, capacity int) *Column { return newColumn(getFixedLen(ft), capacity) @@ -762,3 +773,12 @@ func (c *Column) MergeNulls(cols ...*Column) { } } } + +// DestroyDataForTest destroies data in the column so that +// we can test if data in column are deeply copied. +func (c *Column) DestroyDataForTest() { + dataByteNum := len(c.data) + for i := 0; i < dataByteNum; i++ { + c.data[i] = byte(rand.Intn(256)) + } +} diff --git a/pkg/util/chunk/iterator.go b/pkg/util/chunk/iterator.go index 74d78b9cb62ea..73b65792f9f1d 100644 --- a/pkg/util/chunk/iterator.go +++ b/pkg/util/chunk/iterator.go @@ -53,9 +53,12 @@ type Iterator interface { Error() error } -// NewIterator4Slice returns a Iterator for Row slice. -func NewIterator4Slice(rows []Row) Iterator { - return &Iterator4Slice{rows: rows} +// NewIterator4Slice returns a *Iterator4Slice for Row slice. +func NewIterator4Slice(rows []Row) *Iterator4Slice { + return &Iterator4Slice{ + rows: rows, + cursor: 0, + } } // Iterator4Slice is used to iterate rows inside a slice. diff --git a/pkg/util/chunk/iterator_test.go b/pkg/util/chunk/iterator_test.go index b764be28124ed..18a1cdb5412f0 100644 --- a/pkg/util/chunk/iterator_test.go +++ b/pkg/util/chunk/iterator_test.go @@ -114,7 +114,8 @@ func TestIterator(t *testing.T) { ptrs2 = append(ptrs2, ptr2) } - it := NewIterator4Slice(rows) + var it Iterator + it = NewIterator4Slice(rows) checkEqual(it, expected, t) it.Begin() for i := 0; i < 5; i++ { diff --git a/pkg/util/chunk/main_test.go b/pkg/util/chunk/main_test.go index 2aa418ca86456..537ba61253fee 100644 --- a/pkg/util/chunk/main_test.go +++ b/pkg/util/chunk/main_test.go @@ -31,10 +31,17 @@ func TestMain(m *testing.M) { conf.TempStoragePath = path }) + opts := []goleak.Option{ + goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), + goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), + goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), + } + goleak.VerifyTestMain(wrapper{ M: m, cleanUp: func() { os.RemoveAll(path) }, - }) + }, opts...) } // wrap *testing.M to do the clean up after m.Run() and before os.Exit() diff --git a/pkg/util/chunk/pool.go b/pkg/util/chunk/pool.go index f4fbcfbbcb07f..a578daf44f19d 100644 --- a/pkg/util/chunk/pool.go +++ b/pkg/util/chunk/pool.go @@ -18,8 +18,44 @@ import ( "sync" "github.com/pingcap/tidb/pkg/types" + "github.com/pingcap/tidb/pkg/util/syncutil" ) +var ( + globalChunkPoolMutex syncutil.RWMutex + // globalChunkPool is a chunk pool, the key is the init capacity. + globalChunkPool = make(map[int]*Pool) +) + +// getChunkFromPool gets a Chunk from the Pool. In fact, initCap is the size of the bucket in the histogram. +// so it will not have too many difference value. +func getChunkFromPool(initCap int, fields []*types.FieldType) *Chunk { + globalChunkPoolMutex.RLock() + pool, ok := globalChunkPool[initCap] + globalChunkPoolMutex.RUnlock() + if ok { + return pool.GetChunk(fields) + } + globalChunkPoolMutex.Lock() + defer globalChunkPoolMutex.Unlock() + globalChunkPool[initCap] = NewPool(initCap) + return globalChunkPool[initCap].GetChunk(fields) +} + +func putChunkFromPool(initCap int, fields []*types.FieldType, chk *Chunk) { + globalChunkPoolMutex.RLock() + pool, ok := globalChunkPool[initCap] + globalChunkPoolMutex.RUnlock() + if ok { + pool.PutChunk(fields, chk) + return + } + globalChunkPoolMutex.Lock() + defer globalChunkPoolMutex.Unlock() + globalChunkPool[initCap] = NewPool(initCap) + globalChunkPool[initCap].PutChunk(fields, chk) +} + // Pool is the Column pool. // NOTE: Pool is non-copyable. type Pool struct { @@ -36,11 +72,11 @@ type Pool struct { func NewPool(initCap int) *Pool { return &Pool{ initCap: initCap, - varLenColPool: &sync.Pool{New: func() interface{} { return newVarLenColumn(initCap) }}, - fixLenColPool4: &sync.Pool{New: func() interface{} { return newFixedLenColumn(4, initCap) }}, - fixLenColPool8: &sync.Pool{New: func() interface{} { return newFixedLenColumn(8, initCap) }}, - fixLenColPool16: &sync.Pool{New: func() interface{} { return newFixedLenColumn(16, initCap) }}, - fixLenColPool40: &sync.Pool{New: func() interface{} { return newFixedLenColumn(40, initCap) }}, + varLenColPool: &sync.Pool{New: func() any { return newVarLenColumn(initCap) }}, + fixLenColPool4: &sync.Pool{New: func() any { return newFixedLenColumn(4, initCap) }}, + fixLenColPool8: &sync.Pool{New: func() any { return newFixedLenColumn(8, initCap) }}, + fixLenColPool16: &sync.Pool{New: func() any { return newFixedLenColumn(16, initCap) }}, + fixLenColPool40: &sync.Pool{New: func() any { return newFixedLenColumn(40, initCap) }}, } } @@ -69,17 +105,19 @@ func (p *Pool) GetChunk(fields []*types.FieldType) *Chunk { // PutChunk puts a Chunk back to the Pool. func (p *Pool) PutChunk(fields []*types.FieldType, chk *Chunk) { for i, f := range fields { + c := chk.columns[i] + c.reset() switch elemLen := getFixedLen(f); elemLen { case varElemLen: - p.varLenColPool.Put(chk.columns[i]) + p.varLenColPool.Put(c) case 4: - p.fixLenColPool4.Put(chk.columns[i]) + p.fixLenColPool4.Put(c) case 8: - p.fixLenColPool8.Put(chk.columns[i]) + p.fixLenColPool8.Put(c) case 16: - p.fixLenColPool16.Put(chk.columns[i]) + p.fixLenColPool16.Put(c) case 40: - p.fixLenColPool40.Put(chk.columns[i]) + p.fixLenColPool40.Put(c) } } chk.columns = nil // release the Column references. diff --git a/pkg/util/chunk/row.go b/pkg/util/chunk/row.go index 2b5e2a3376021..d08dabbb7916f 100644 --- a/pkg/util/chunk/row.go +++ b/pkg/util/chunk/row.go @@ -16,11 +16,15 @@ package chunk import ( "strconv" + "unsafe" "github.com/pingcap/tidb/pkg/parser/mysql" "github.com/pingcap/tidb/pkg/types" ) +// RowSize is the size of `Row{}` +const RowSize = int64(unsafe.Sizeof(Row{})) + // Row represents a row of data, can be used to access values. type Row struct { c *Chunk diff --git a/pkg/util/chunk/row_container.go b/pkg/util/chunk/row_container.go index ed23cf8d70528..4a9c3e2fd81ab 100644 --- a/pkg/util/chunk/row_container.go +++ b/pkg/util/chunk/row_container.go @@ -15,12 +15,12 @@ package chunk import ( - "errors" "fmt" "sort" "sync" "time" + "github.com/pingcap/errors" "github.com/pingcap/failpoint" "github.com/pingcap/tidb/pkg/types" "github.com/pingcap/tidb/pkg/util/disk" @@ -30,6 +30,9 @@ import ( "golang.org/x/sys/cpu" ) +// ErrCannotAddBecauseSorted indicate that the SortPartition is sorted and prohibit inserting data. +var ErrCannotAddBecauseSorted = errors.New("can not add because sorted") + type rowContainerRecord struct { inMemory *List inDisk *DataInDiskByRows @@ -480,9 +483,6 @@ func (a *baseSpillDiskAction) WaitForTest() { a.testWg.Wait() } -// ErrCannotAddBecauseSorted indicate that the SortedRowContainer is sorted and prohibit inserting data. -var ErrCannotAddBecauseSorted = errors.New("can not add because sorted") - // SortedRowContainer provides a place for many rows, so many that we might want to sort and spill them into disk. type SortedRowContainer struct { *RowContainer diff --git a/pkg/util/chunk/row_container_reader.go b/pkg/util/chunk/row_container_reader.go index e0f3b0e314060..ca124083079c5 100644 --- a/pkg/util/chunk/row_container_reader.go +++ b/pkg/util/chunk/row_container_reader.go @@ -19,6 +19,8 @@ import ( "runtime" "sync" + "github.com/pingcap/errors" + "github.com/pingcap/failpoint" "github.com/pingcap/tidb/pkg/util/logutil" ) @@ -122,6 +124,11 @@ func (reader *rowContainerReader) startWorker() { for chkIdx := 0; chkIdx < reader.rc.NumChunks(); chkIdx++ { chk, err := reader.rc.GetChunk(chkIdx) + failpoint.Inject("get-chunk-error", func(val failpoint.Value) { + if val.(bool) { + err = errors.New("fail to get chunk for test") + } + }) if err != nil { reader.err = err return diff --git a/pkg/util/chunk/row_in_disk.go b/pkg/util/chunk/row_in_disk.go index 3fb7d09878d25..77c378eacc790 100644 --- a/pkg/util/chunk/row_in_disk.go +++ b/pkg/util/chunk/row_in_disk.go @@ -21,12 +21,9 @@ import ( "strconv" errors2 "github.com/pingcap/errors" - "github.com/pingcap/tidb/pkg/config" "github.com/pingcap/tidb/pkg/parser/terror" "github.com/pingcap/tidb/pkg/types" - "github.com/pingcap/tidb/pkg/util/checksum" "github.com/pingcap/tidb/pkg/util/disk" - "github.com/pingcap/tidb/pkg/util/encrypt" "github.com/pingcap/tidb/pkg/util/memory" ) @@ -43,61 +40,6 @@ type DataInDiskByRows struct { offsetFile diskFileReaderWriter } -// diskFileReaderWriter represents a Reader and a Writer for the temporary disk file. -type diskFileReaderWriter struct { - disk *os.File - w io.WriteCloser - // offWrite is the current offset for writing. - offWrite int64 - - checksumWriter *checksum.Writer - cipherWriter *encrypt.Writer // cipherWriter is only enable when config SpilledFileEncryptionMethod is "aes128-ctr" - - // ctrCipher stores the key and nonce using by aes encrypt io layer - ctrCipher *encrypt.CtrCipher -} - -func (l *diskFileReaderWriter) initWithFileName(fileName string) (err error) { - l.disk, err = os.CreateTemp(config.GetGlobalConfig().TempStoragePath, fileName) - if err != nil { - return errors2.Trace(err) - } - var underlying io.WriteCloser = l.disk - if config.GetGlobalConfig().Security.SpilledFileEncryptionMethod != config.SpilledFileEncryptionMethodPlaintext { - // The possible values of SpilledFileEncryptionMethod are "plaintext", "aes128-ctr" - l.ctrCipher, err = encrypt.NewCtrCipher() - if err != nil { - return - } - l.cipherWriter = encrypt.NewWriter(l.disk, l.ctrCipher) - underlying = l.cipherWriter - } - l.checksumWriter = checksum.NewWriter(underlying) - l.w = l.checksumWriter - return -} - -func (l *diskFileReaderWriter) getReader() io.ReaderAt { - var underlying io.ReaderAt = l.disk - if l.ctrCipher != nil { - underlying = NewReaderWithCache(encrypt.NewReader(l.disk, l.ctrCipher), l.cipherWriter.GetCache(), l.cipherWriter.GetCacheDataOffset()) - } - if l.checksumWriter != nil { - underlying = NewReaderWithCache(checksum.NewReader(underlying), l.checksumWriter.GetCache(), l.checksumWriter.GetCacheDataOffset()) - } - return underlying -} - -func (l *diskFileReaderWriter) getSectionReader(off int64) *io.SectionReader { - checksumReader := l.getReader() - r := io.NewSectionReader(checksumReader, off, l.offWrite-off) - return r -} - -func (l *diskFileReaderWriter) getWriter() io.Writer { - return l.w -} - var defaultChunkDataInDiskByRowsPath = "chunk.DataInDiskByRows" var defaultChunkDataInDiskByRowsOffsetPath = "chunk.DataInDiskByRowsOffset" @@ -141,7 +83,7 @@ func (l *DataInDiskByRows) Add(chk *Chunk) (err error) { if chk.NumRows() == 0 { return errors2.New("chunk appended to List should have at least 1 row") } - if l.dataFile.disk == nil { + if l.dataFile.file == nil { err = l.initDiskFile() if err != nil { return @@ -255,14 +197,14 @@ func (l *DataInDiskByRows) NumChunks() int { // Close releases the disk resource. func (l *DataInDiskByRows) Close() error { - if l.dataFile.disk != nil { + if l.dataFile.file != nil { l.diskTracker.Consume(-l.diskTracker.BytesConsumed()) - terror.Call(l.dataFile.disk.Close) - terror.Log(os.Remove(l.dataFile.disk.Name())) + terror.Call(l.dataFile.file.Close) + terror.Log(os.Remove(l.dataFile.file.Name())) } - if l.offsetFile.disk != nil { - terror.Call(l.offsetFile.disk.Close) - terror.Log(os.Remove(l.offsetFile.disk.Name())) + if l.offsetFile.file != nil { + terror.Call(l.offsetFile.file.Close) + terror.Log(os.Remove(l.offsetFile.file.Name())) } return nil } diff --git a/pkg/util/chunk/row_in_disk_test.go b/pkg/util/chunk/row_in_disk_test.go index 453b32be292f8..c463beb03b63d 100644 --- a/pkg/util/chunk/row_in_disk_test.go +++ b/pkg/util/chunk/row_in_disk_test.go @@ -16,7 +16,6 @@ package chunk import ( "bytes" - "fmt" "io" "math/rand" "os" @@ -34,6 +33,16 @@ import ( "github.com/stretchr/testify/require" ) +func genString() string { + retStr := "西xi瓜gua" + factor := rand.Intn(5) + for i := 0; i < factor; i++ { + retStr += retStr + } + + return retStr +} + func initChunks(numChk, numRow int) ([]*Chunk, []*types.FieldType) { fields := []*types.FieldType{ types.NewFieldType(mysql.TypeVarString), @@ -48,12 +57,12 @@ func initChunks(numChk, numRow int) ([]*Chunk, []*types.FieldType) { chk := NewChunkWithCapacity(fields, numRow) for rowIdx := 0; rowIdx < numRow; rowIdx++ { data := int64(chkIdx*numRow + rowIdx) - chk.AppendString(0, fmt.Sprint(data)) + chk.AppendString(0, genString()) chk.AppendNull(1) chk.AppendNull(2) chk.AppendInt64(3, data) if chkIdx%2 == 0 { - chk.AppendJSON(4, types.CreateBinaryJSON(fmt.Sprint(data))) + chk.AppendJSON(4, types.CreateBinaryJSON(genString())) } else { chk.AppendNull(4) } @@ -70,15 +79,15 @@ func TestDataInDiskByRows(t *testing.T) { defer func() { err := l.Close() require.NoError(t, err) - require.NotNil(t, l.dataFile.disk) - _, err = os.Stat(l.dataFile.disk.Name()) + require.NotNil(t, l.dataFile.file) + _, err = os.Stat(l.dataFile.file.Name()) require.True(t, os.IsNotExist(err)) }() for _, chk := range chks { err := l.Add(chk) assert.NoError(t, err) } - require.True(t, strings.HasPrefix(l.dataFile.disk.Name(), filepath.Join(os.TempDir(), "tidb_enable_tmp_storage_on_oom"))) + require.True(t, strings.HasPrefix(l.dataFile.file.Name(), filepath.Join(os.TempDir(), "tidb_enable_tmp_storage_on_oom"))) assert.Equal(t, numChk, l.NumChunks()) assert.Greater(t, l.GetDiskTracker().BytesConsumed(), int64(0)) @@ -143,14 +152,14 @@ type listInDiskWriteDisk struct { } func (l *diskFileReaderWriter) flushForTest() (err error) { - err = l.disk.Close() + err = l.file.Close() if err != nil { return } - l.w = nil + l.writer = nil // the l.disk is the underlying object of the l.w, it will be closed // after calling l.w.Close, we need to reopen it before reading rows. - l.disk, err = os.Open(l.disk.Name()) + l.file, err = os.Open(l.file.Name()) if err != nil { return errors2.Trace(err) } @@ -163,15 +172,15 @@ func newDataInDiskByRowsWriteDisk(fieldTypes []*types.FieldType) (*listInDiskWri if err != nil { return nil, err } - l.dataFile.disk = disk - l.dataFile.w = disk + l.dataFile.file = disk + l.dataFile.writer = disk disk2, err := os.CreateTemp(config.GetGlobalConfig().TempStoragePath, "offset"+strconv.Itoa(l.diskTracker.Label())) if err != nil { return nil, err } - l.offsetFile.disk = disk2 - l.offsetFile.w = disk2 + l.offsetFile.file = disk2 + l.offsetFile.writer = disk2 return &l, nil } @@ -185,7 +194,7 @@ func (l *listInDiskWriteDisk) GetRow(ptr RowPtr) (row Row, err error) { return } - r := io.NewSectionReader(l.dataFile.disk, off, l.dataFile.offWrite-off) + r := io.NewSectionReader(l.dataFile.file, off, l.dataFile.offWrite-off) format := rowInDisk{numCol: len(l.fieldTypes)} _, err = format.ReadFrom(r) if err != nil { diff --git a/pkg/util/codec/codec.go b/pkg/util/codec/codec.go index 01cd8399166e7..42cf3eefef586 100644 --- a/pkg/util/codec/codec.go +++ b/pkg/util/codec/codec.go @@ -883,6 +883,9 @@ func DecodeAsDateTime(b []byte, tp byte, loc *time.Location) (remain []byte, d t case uvarintFlag: // Datetime can be encoded as Uvarint b, v, err = DecodeUvarint(b) + case NilFlag: + // null value should also be decoded out. + return b, d, nil default: return b, d, errors.Errorf("invalid encoded key flag %v", flag) diff --git a/pkg/util/codec/codec_test.go b/pkg/util/codec/codec_test.go index c67aac19f188e..12cfdb7fda93d 100644 --- a/pkg/util/codec/codec_test.go +++ b/pkg/util/codec/codec_test.go @@ -786,7 +786,7 @@ func TestDecimal(t *testing.T) { err = sc.HandleError(err) require.NoError(t, err) - sc.OverflowAsWarning = true + sc.SetTypeFlags(types.DefaultStmtFlags.WithTruncateAsWarning(true)) decimalDatum.SetLength(12) decimalDatum.SetFrac(10) _, err = EncodeValue(sc.TimeZone(), nil, decimalDatum) diff --git a/pkg/util/codec/main_test.go b/pkg/util/codec/main_test.go index b052b268e77d1..deac36d0dd47a 100644 --- a/pkg/util/codec/main_test.go +++ b/pkg/util/codec/main_test.go @@ -25,6 +25,7 @@ func TestMain(m *testing.M) { testsetup.SetupForCommonTest() opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), } diff --git a/pkg/util/collate/main_test.go b/pkg/util/collate/main_test.go index fa97d7d4464a2..0d17190795229 100644 --- a/pkg/util/collate/main_test.go +++ b/pkg/util/collate/main_test.go @@ -25,6 +25,7 @@ func TestMain(m *testing.M) { testsetup.SetupForCommonTest() opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), } diff --git a/pkg/util/context/BUILD.bazel b/pkg/util/context/BUILD.bazel new file mode 100644 index 0000000000000..a879bb3b0ac9e --- /dev/null +++ b/pkg/util/context/BUILD.bazel @@ -0,0 +1,8 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library") + +go_library( + name = "context", + srcs = ["warn.go"], + importpath = "github.com/pingcap/tidb/pkg/util/context", + visibility = ["//visibility:public"], +) diff --git a/pkg/util/context/warn.go b/pkg/util/context/warn.go new file mode 100644 index 0000000000000..9b4b53d600d7b --- /dev/null +++ b/pkg/util/context/warn.go @@ -0,0 +1,44 @@ +// Copyright 2023 PingCAP, 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. + +package context + +// WarnHandler provides a function to add a warning. +// Using interface rather than a simple function/closure can avoid memory allocation in some cases. +// See https://github.com/pingcap/tidb/issues/49277 +type WarnHandler interface { + // AppendWarning appends a warning + AppendWarning(err error) +} + +type ignoreWarn struct{} + +func (*ignoreWarn) AppendWarning(_ error) {} + +// IgnoreWarn is WarnHandler which does nothing +var IgnoreWarn WarnHandler = &ignoreWarn{} + +type funcWarnHandler struct { + fn func(err error) +} + +func (r *funcWarnHandler) AppendWarning(err error) { + r.fn(err) +} + +// NewFuncWarnHandlerForTest creates a `WarnHandler` which will use the function to handle warn +// To have a better performance, it's not suggested to use this function in production. +func NewFuncWarnHandlerForTest(fn func(err error)) WarnHandler { + return &funcWarnHandler{fn} +} diff --git a/pkg/util/cpu/BUILD.bazel b/pkg/util/cpu/BUILD.bazel index 50332f6fbaeec..d0284eea2b4b4 100644 --- a/pkg/util/cpu/BUILD.bazel +++ b/pkg/util/cpu/BUILD.bazel @@ -10,6 +10,7 @@ go_library( "//pkg/util/cgroup", "//pkg/util/mathutil", "@com_github_cloudfoundry_gosigar//:gosigar", + "@com_github_pingcap_failpoint//:failpoint", "@com_github_pingcap_log//:log", "@org_uber_go_atomic//:atomic", "@org_uber_go_zap//:zap", diff --git a/pkg/util/cpu/cpu.go b/pkg/util/cpu/cpu.go index 4be66d05421a7..6d14cbfada58d 100644 --- a/pkg/util/cpu/cpu.go +++ b/pkg/util/cpu/cpu.go @@ -16,10 +16,12 @@ package cpu import ( "os" + "runtime" "sync" "time" sigar "github.com/cloudfoundry/gosigar" + "github.com/pingcap/failpoint" "github.com/pingcap/log" "github.com/pingcap/tidb/pkg/metrics" "github.com/pingcap/tidb/pkg/util/cgroup" @@ -120,3 +122,11 @@ func getCPUTime() (userTimeMillis, sysTimeMillis int64, err error) { } return int64(cpuTime.User), int64(cpuTime.Sys), nil } + +// GetCPUCount returns the number of logical CPUs usable by the current process. +func GetCPUCount() int { + failpoint.Inject("mockNumCpu", func(val failpoint.Value) { + failpoint.Return(val.(int)) + }) + return runtime.GOMAXPROCS(0) +} diff --git a/pkg/util/cpu/main_test.go b/pkg/util/cpu/main_test.go index f0dadb7da4c73..e3447fda1e47f 100644 --- a/pkg/util/cpu/main_test.go +++ b/pkg/util/cpu/main_test.go @@ -24,6 +24,7 @@ import ( func TestMain(m *testing.M) { opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), diff --git a/pkg/util/cpuprofile/cpuprofile.go b/pkg/util/cpuprofile/cpuprofile.go index 9ecda5d677d56..80a26f12841f3 100644 --- a/pkg/util/cpuprofile/cpuprofile.go +++ b/pkg/util/cpuprofile/cpuprofile.go @@ -211,7 +211,7 @@ func (p *parallelCPUProfiler) sendToConsumers() { defer func() { p.Unlock() if r := recover(); r != nil { - logutil.BgLogger().Error("parallel cpu profiler panic", zap.Any("recover", r)) + logutil.BgLogger().Error("parallel cpu profiler panic", zap.Any("recover", r), zap.Stack("stack")) } }() diff --git a/pkg/util/cpuprofile/cpuprofile_test.go b/pkg/util/cpuprofile/cpuprofile_test.go index f8d3cc0925f0f..d852721ba861f 100644 --- a/pkg/util/cpuprofile/cpuprofile_test.go +++ b/pkg/util/cpuprofile/cpuprofile_test.go @@ -36,7 +36,14 @@ func TestMain(m *testing.M) { testsetup.SetupForCommonTest() // To speed up testing DefProfileDuration = time.Millisecond * 200 - goleak.VerifyTestMain(m) + opts := []goleak.Option{ + goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), + goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), + goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), + } + testsetup.SetupForCommonTest() + goleak.VerifyTestMain(m, opts...) } func TestBasicAPI(t *testing.T) { diff --git a/pkg/util/cteutil/BUILD.bazel b/pkg/util/cteutil/BUILD.bazel index eaeb81968a4ba..cd8010f53d966 100644 --- a/pkg/util/cteutil/BUILD.bazel +++ b/pkg/util/cteutil/BUILD.bazel @@ -10,6 +10,7 @@ go_library( "//pkg/util/chunk", "//pkg/util/disk", "//pkg/util/memory", + "//pkg/util/syncutil", "@com_github_pingcap_errors//:errors", ], ) diff --git a/pkg/util/cteutil/main_test.go b/pkg/util/cteutil/main_test.go index 6ad7525828b32..ec0e6d4615b8d 100644 --- a/pkg/util/cteutil/main_test.go +++ b/pkg/util/cteutil/main_test.go @@ -25,6 +25,7 @@ func TestMain(m *testing.M) { testsetup.SetupForCommonTest() opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), } diff --git a/pkg/util/cteutil/storage.go b/pkg/util/cteutil/storage.go index a3f334794b2fc..dd172e02b13e7 100644 --- a/pkg/util/cteutil/storage.go +++ b/pkg/util/cteutil/storage.go @@ -15,13 +15,12 @@ package cteutil import ( - "sync" - "github.com/pingcap/errors" "github.com/pingcap/tidb/pkg/types" "github.com/pingcap/tidb/pkg/util/chunk" "github.com/pingcap/tidb/pkg/util/disk" "github.com/pingcap/tidb/pkg/util/memory" + "github.com/pingcap/tidb/pkg/util/syncutil" ) var _ Storage = &StorageRC{} @@ -99,7 +98,7 @@ type StorageRC struct { refCnt int chkSize int iter int - mu sync.Mutex + mu syncutil.Mutex done bool } diff --git a/pkg/util/dbterror/ddl_terror.go b/pkg/util/dbterror/ddl_terror.go index 3260488586af3..fa61b6ac9e892 100644 --- a/pkg/util/dbterror/ddl_terror.go +++ b/pkg/util/dbterror/ddl_terror.go @@ -19,6 +19,7 @@ import ( mysql "github.com/pingcap/tidb/pkg/errno" parser_mysql "github.com/pingcap/tidb/pkg/parser/mysql" + "github.com/pingcap/tidb/pkg/parser/terror" ) var ( @@ -34,6 +35,8 @@ var ( ErrCancelledDDLJob = ClassDDL.NewStd(mysql.ErrCancelledDDLJob) // ErrPausedDDLJob returns when the DDL job cannot be paused. ErrPausedDDLJob = ClassDDL.NewStd(mysql.ErrPausedDDLJob) + // ErrBDRRestrictedDDL means the DDL is restricted in BDR mode. + ErrBDRRestrictedDDL = ClassDDL.NewStd(mysql.ErrBDRRestrictedDDL) // ErrRunMultiSchemaChanges means we run multi schema changes. ErrRunMultiSchemaChanges = ClassDDL.NewStdErr(mysql.ErrUnsupportedDDLOperation, parser_mysql.Message(fmt.Sprintf(mysql.MySQLErrName[mysql.ErrUnsupportedDDLOperation].Raw, "multi schema change for %s"), nil)) // ErrOperateSameColumn means we change the same columns multiple times in a DDL. @@ -511,4 +514,7 @@ var ReorgRetryableErrCodes = map[uint16]struct{}{ mysql.ErrWriteConflictInTiDB: {}, mysql.ErrTxnRetryable: {}, mysql.ErrNotOwner: {}, + + // Temporary network partitioning may cause pk commit failure. + uint16(terror.CodeResultUndetermined): {}, } diff --git a/pkg/util/dbterror/main_test.go b/pkg/util/dbterror/main_test.go index bc0d4b93b72c2..2c6a229e38c34 100644 --- a/pkg/util/dbterror/main_test.go +++ b/pkg/util/dbterror/main_test.go @@ -25,6 +25,7 @@ func TestMain(m *testing.M) { testsetup.SetupForCommonTest() opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), } goleak.VerifyTestMain(m, opts...) diff --git a/pkg/util/dbutil/BUILD.bazel b/pkg/util/dbutil/BUILD.bazel index 2accabbc687bf..42ad7c68dec62 100644 --- a/pkg/util/dbutil/BUILD.bazel +++ b/pkg/util/dbutil/BUILD.bazel @@ -24,7 +24,6 @@ go_library( "//pkg/parser/model", "//pkg/parser/mysql", "//pkg/planner/core", - "//pkg/sessionctx/stmtctx", "//pkg/types", "//pkg/types/parser_driver", "//pkg/util", diff --git a/pkg/util/dbutil/common.go b/pkg/util/dbutil/common.go index dabae40c8059d..afe32ba03f713 100644 --- a/pkg/util/dbutil/common.go +++ b/pkg/util/dbutil/common.go @@ -32,7 +32,6 @@ import ( "github.com/pingcap/tidb/pkg/parser" "github.com/pingcap/tidb/pkg/parser/model" tmysql "github.com/pingcap/tidb/pkg/parser/mysql" - "github.com/pingcap/tidb/pkg/sessionctx/stmtctx" "github.com/pingcap/tidb/pkg/types" "github.com/pingcap/tidb/pkg/util" "github.com/pingcap/tidb/pkg/util/dbterror" @@ -550,8 +549,7 @@ func AnalyzeValuesFromBuckets(valueString string, cols []*model.ColumnInfo) ([]s for i, col := range cols { if IsTimeTypeAndNeedDecode(col.GetType()) { // check if values[i] is already a time string - sc := stmtctx.NewStmtCtxWithTimeZone(time.UTC) - _, err := types.ParseTime(sc.TypeCtx(), values[i], col.GetType(), types.MinFsp) + _, err := types.ParseTime(types.DefaultStmtNoWarningContext, values[i], col.GetType(), types.MinFsp) if err == nil { continue } diff --git a/pkg/util/deadlockhistory/main_test.go b/pkg/util/deadlockhistory/main_test.go index 1ee38c2ae7f03..15266142de78f 100644 --- a/pkg/util/deadlockhistory/main_test.go +++ b/pkg/util/deadlockhistory/main_test.go @@ -25,6 +25,7 @@ func TestMain(m *testing.M) { testsetup.SetupForCommonTest() opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), } diff --git a/pkg/util/disjointset/main_test.go b/pkg/util/disjointset/main_test.go index 60272b24db0ba..75bae7fc1fd9b 100644 --- a/pkg/util/disjointset/main_test.go +++ b/pkg/util/disjointset/main_test.go @@ -25,6 +25,7 @@ func TestMain(m *testing.M) { testsetup.SetupForCommonTest() opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), } diff --git a/pkg/util/disk/main_test.go b/pkg/util/disk/main_test.go index e02420162d5ef..056351761b00e 100644 --- a/pkg/util/disk/main_test.go +++ b/pkg/util/disk/main_test.go @@ -25,6 +25,7 @@ func TestMain(m *testing.M) { testsetup.SetupForCommonTest() opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), } diff --git a/pkg/util/disttask/BUILD.bazel b/pkg/util/disttask/BUILD.bazel index dc6f7fb37ff53..e418bc836174e 100644 --- a/pkg/util/disttask/BUILD.bazel +++ b/pkg/util/disttask/BUILD.bazel @@ -14,5 +14,8 @@ go_test( srcs = ["idservice_test.go"], embed = [":disttask"], flaky = True, - deps = ["@com_github_stretchr_testify//require"], + deps = [ + "//pkg/domain/infosync", + "@com_github_stretchr_testify//require", + ], ) diff --git a/pkg/util/disttask/idservice.go b/pkg/util/disttask/idservice.go index 8f3d3d891f5fc..fea4fb13ed0a5 100644 --- a/pkg/util/disttask/idservice.go +++ b/pkg/util/disttask/idservice.go @@ -25,9 +25,8 @@ import ( // GenerateExecID used to generate IP:port as exec_id value // This function is used by distributed task execution to generate serverID string to // correlated one subtask to on TiDB node to be executed. -func GenerateExecID(ip string, port uint) string { - portstring := fmt.Sprintf("%d", port) - return net.JoinHostPort(ip, portstring) +func GenerateExecID(info *infosync.ServerInfo) string { + return net.JoinHostPort(info.IP, fmt.Sprintf("%d", info.Port)) } // MatchServerInfo will check if the schedulerID matched in all serverInfos. @@ -38,7 +37,7 @@ func MatchServerInfo(serverInfos []*infosync.ServerInfo, schedulerID string) boo // FindServerInfo will find the schedulerID in all serverInfos. func FindServerInfo(serverInfos []*infosync.ServerInfo, schedulerID string) int { for i, serverInfo := range serverInfos { - serverID := GenerateExecID(serverInfo.IP, serverInfo.Port) + serverID := GenerateExecID(serverInfo) if serverID == schedulerID { return i } @@ -53,7 +52,7 @@ func GenerateSubtaskExecID(ctx context.Context, id string) string { return "" } if serverNode, ok := serverInfos[id]; ok { - return GenerateExecID(serverNode.IP, serverNode.Port) + return GenerateExecID(serverNode) } return "" } @@ -65,7 +64,7 @@ func GenerateSubtaskExecID4Test(id string) string { return "" } if serverNode, ok := serverInfos[id]; ok { - return GenerateExecID(serverNode.IP, serverNode.Port) + return GenerateExecID(serverNode) } return "" } diff --git a/pkg/util/disttask/idservice_test.go b/pkg/util/disttask/idservice_test.go index d14b26a1439a1..d991b6b4b80b0 100644 --- a/pkg/util/disttask/idservice_test.go +++ b/pkg/util/disttask/idservice_test.go @@ -17,21 +17,22 @@ package disttaskutil import ( "testing" + "github.com/pingcap/tidb/pkg/domain/infosync" "github.com/stretchr/testify/require" ) // This testCase show GenerateExecID only generate string by input parametas func TestGenServerID(t *testing.T) { var str string - serverIO := GenerateExecID("", 0) + serverIO := GenerateExecID(&infosync.ServerInfo{IP: "", Port: 0}) require.Equal(t, serverIO, ":0") - serverIO = GenerateExecID("10.124.122.25", 3456) + serverIO = GenerateExecID(&infosync.ServerInfo{IP: "10.124.122.25", Port: 3456}) require.Equal(t, serverIO, "10.124.122.25:3456") - serverIO = GenerateExecID("10.124", 3456) + serverIO = GenerateExecID(&infosync.ServerInfo{IP: "10.124", Port: 3456}) require.Equal(t, serverIO, "10.124:3456") - serverIO = GenerateExecID(str, 65537) + serverIO = GenerateExecID(&infosync.ServerInfo{IP: str, Port: 65537}) require.Equal(t, serverIO, ":65537") // IPv6 testcase - serverIO = GenerateExecID("ABCD:EF01:2345:6789:ABCD:EF01:2345:6789", 65537) + serverIO = GenerateExecID(&infosync.ServerInfo{IP: "ABCD:EF01:2345:6789:ABCD:EF01:2345:6789", Port: 65537}) require.Equal(t, serverIO, "[ABCD:EF01:2345:6789:ABCD:EF01:2345:6789]:65537") } diff --git a/pkg/util/encrypt/main_test.go b/pkg/util/encrypt/main_test.go index b791ab5bce537..a6a3d417b246a 100644 --- a/pkg/util/encrypt/main_test.go +++ b/pkg/util/encrypt/main_test.go @@ -22,7 +22,12 @@ import ( ) func TestMain(m *testing.M) { + opts := []goleak.Option{ + goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), + goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), + goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), + } testsetup.SetupForCommonTest() - - goleak.VerifyTestMain(m) + goleak.VerifyTestMain(m, opts...) } diff --git a/pkg/util/engine/BUILD.bazel b/pkg/util/engine/BUILD.bazel index 5afe79b899187..c21b6957317d3 100644 --- a/pkg/util/engine/BUILD.bazel +++ b/pkg/util/engine/BUILD.bazel @@ -1,9 +1,24 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") +load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") go_library( name = "engine", srcs = ["engine.go"], importpath = "github.com/pingcap/tidb/pkg/util/engine", visibility = ["//visibility:public"], - deps = ["@com_github_pingcap_kvproto//pkg/metapb"], + deps = [ + "@com_github_pingcap_kvproto//pkg/metapb", + "@com_github_tikv_pd_client//http", + ], +) + +go_test( + name = "engine_test", + timeout = "short", + srcs = ["engine_test.go"], + embed = [":engine"], + flaky = True, + deps = [ + "@com_github_stretchr_testify//require", + "@com_github_tikv_pd_client//http", + ], ) diff --git a/pkg/util/engine/engine.go b/pkg/util/engine/engine.go index 0a1614041f3bc..06800328c81c6 100644 --- a/pkg/util/engine/engine.go +++ b/pkg/util/engine/engine.go @@ -16,9 +16,10 @@ package engine import ( "github.com/pingcap/kvproto/pkg/metapb" + pdhttp "github.com/tikv/pd/client/http" ) -// IsTiFlash tests whether the store is based on tiflash engine. +// IsTiFlash check whether the store is based on tiflash engine. func IsTiFlash(store *metapb.Store) bool { for _, label := range store.Labels { if label.Key == "engine" && (label.Value == "tiflash_compute" || label.Value == "tiflash") { @@ -27,3 +28,14 @@ func IsTiFlash(store *metapb.Store) bool { } return false } + +// IsTiFlashHTTPResp tests whether the store is based on tiflash engine from a PD +// HTTP response. +func IsTiFlashHTTPResp(store *pdhttp.MetaStore) bool { + for _, label := range store.Labels { + if label.Key == "engine" && (label.Value == "tiflash_compute" || label.Value == "tiflash") { + return true + } + } + return false +} diff --git a/pkg/util/engine/engine_test.go b/pkg/util/engine/engine_test.go new file mode 100644 index 0000000000000..f15c28530c7a6 --- /dev/null +++ b/pkg/util/engine/engine_test.go @@ -0,0 +1,79 @@ +// Copyright 2024 PingCAP, 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. +package engine + +import ( + "testing" + + "github.com/stretchr/testify/require" + pdhttp "github.com/tikv/pd/client/http" +) + +func TestIsTiFlashHTTPResp(t *testing.T) { + tests := []struct { + name string + store *pdhttp.MetaStore + want bool + }{ + { + name: "Test with TiFlash label", + store: &pdhttp.MetaStore{ + Labels: []pdhttp.StoreLabel{ + { + Key: "engine", + Value: "tiflash", + }, + }, + }, + want: true, + }, + { + name: "Test with TiFlash label 2", + store: &pdhttp.MetaStore{ + Labels: []pdhttp.StoreLabel{ + { + Key: "engine", + Value: "tiflash_compute", + }, + }, + }, + want: true, + }, + { + name: "Test without TiFlash label", + store: &pdhttp.MetaStore{ + Labels: []pdhttp.StoreLabel{ + { + Key: "engine", + Value: "not_tiflash", + }, + }, + }, + want: false, + }, + { + name: "Test with no labels", + store: &pdhttp.MetaStore{ + Labels: []pdhttp.StoreLabel{}, + }, + want: false, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + require.Equal(t, tt.want, IsTiFlashHTTPResp(tt.store)) + }) + } +} diff --git a/pkg/util/execdetails/main_test.go b/pkg/util/execdetails/main_test.go index 401137ccd8c65..53de62fa0c4a4 100644 --- a/pkg/util/execdetails/main_test.go +++ b/pkg/util/execdetails/main_test.go @@ -24,6 +24,7 @@ func TestMain(m *testing.M) { testsetup.SetupForCommonTest() opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), } diff --git a/pkg/util/expensivequery/expensivequerey_test.go b/pkg/util/expensivequery/expensivequerey_test.go index 3013355b111e2..f2065ee1d4a96 100644 --- a/pkg/util/expensivequery/expensivequerey_test.go +++ b/pkg/util/expensivequery/expensivequerey_test.go @@ -25,6 +25,7 @@ func TestMain(m *testing.M) { testsetup.SetupForCommonTest() opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), diff --git a/pkg/util/fastrand/main_test.go b/pkg/util/fastrand/main_test.go index 91dfb427f065b..11ae979799f15 100644 --- a/pkg/util/fastrand/main_test.go +++ b/pkg/util/fastrand/main_test.go @@ -25,6 +25,7 @@ func TestMain(m *testing.M) { testsetup.SetupForCommonTest() opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), } diff --git a/pkg/util/format/main_test.go b/pkg/util/format/main_test.go index 760fc94afa085..576d9ae87bd73 100644 --- a/pkg/util/format/main_test.go +++ b/pkg/util/format/main_test.go @@ -25,6 +25,7 @@ func TestMain(m *testing.M) { testsetup.SetupForCommonTest() opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), } diff --git a/pkg/util/gctuner/memory_limit_tuner.go b/pkg/util/gctuner/memory_limit_tuner.go index b226248bcd0a6..f6ec8dfe33357 100644 --- a/pkg/util/gctuner/memory_limit_tuner.go +++ b/pkg/util/gctuner/memory_limit_tuner.go @@ -33,9 +33,11 @@ var GlobalMemoryLimitTuner = &memoryLimitTuner{} // So we can change memory limit dynamically to avoid frequent GC when memory usage is greater than the limit. type memoryLimitTuner struct { finalizer *finalizer - isTuning atomicutil.Bool + isValidValueSet atomicutil.Bool percentage atomicutil.Float64 - waitingReset atomicutil.Bool + adjustPercentageInProgress atomicutil.Bool + serverMemLimitBeforeAdjust atomicutil.Uint64 + percentageBeforeAdjust atomicutil.Float64 nextGCTriggeredByMemoryLimit atomicutil.Bool } @@ -56,7 +58,7 @@ func WaitMemoryLimitTunerExitInTest() { // tuning check the memory nextGC and judge whether this GC is trigger by memory limit. // Go runtime ensure that it will be called serially. func (t *memoryLimitTuner) tuning() { - if !t.isTuning.Load() { + if !t.isValidValueSet.Load() { return } r := memory.ForceReadMemStats() @@ -72,7 +74,11 @@ func (t *memoryLimitTuner) tuning() { // - Only if NextGC >= MemoryLimit , the **next** GC will be triggered by MemoryLimit. Thus, we need to reset // MemoryLimit after the **next** GC happens if needed. if float64(r.HeapInuse)*ratio > float64(debug.SetMemoryLimit(-1)) { - if t.nextGCTriggeredByMemoryLimit.Load() && t.waitingReset.CompareAndSwap(false, true) { + if t.nextGCTriggeredByMemoryLimit.Load() && t.adjustPercentageInProgress.CompareAndSwap(false, true) { + // It's ok to update `adjustPercentageInProgress`, `serverMemLimitBeforeAdjust` and `percentageBeforeAdjust` not in a transaction. + // The update of memory limit is eventually consistent. + t.serverMemLimitBeforeAdjust.Store(memory.ServerMemoryLimit.Load()) + t.percentageBeforeAdjust.Store(t.GetPercentage()) go func() { if intest.InTest { memoryGoroutineCntInTest.Inc() @@ -85,6 +91,12 @@ func (t *memoryLimitTuner) tuning() { if intest.InTest { resetInterval = 3 * time.Second } + failpoint.Inject("mockUpdateGlobalVarDuringAdjustPercentage", func(val failpoint.Value) { + if val, ok := val.(bool); val && ok { + time.Sleep(300 * time.Millisecond) + t.UpdateMemoryLimit() + } + }) failpoint.Inject("testMemoryLimitTuner", func(val failpoint.Value) { if val, ok := val.(bool); val && ok { resetInterval = 1 * time.Second @@ -92,7 +104,7 @@ func (t *memoryLimitTuner) tuning() { }) time.Sleep(resetInterval) debug.SetMemoryLimit(t.calcMemoryLimit(t.GetPercentage())) - for !t.waitingReset.CompareAndSwap(true, false) { + for !t.adjustPercentageInProgress.CompareAndSwap(true, false) { continue } }() @@ -128,12 +140,17 @@ func (t *memoryLimitTuner) GetPercentage() float64 { // UpdateMemoryLimit updates the memory limit. // This function should be called when `tidb_server_memory_limit` or `tidb_server_memory_limit_gc_trigger` is modified. func (t *memoryLimitTuner) UpdateMemoryLimit() { + if t.adjustPercentageInProgress.Load() { + if t.serverMemLimitBeforeAdjust.Load() == memory.ServerMemoryLimit.Load() && t.percentageBeforeAdjust.Load() == t.GetPercentage() { + return + } + } var memoryLimit = t.calcMemoryLimit(t.GetPercentage()) if memoryLimit == math.MaxInt64 { - t.isTuning.Store(false) + t.isValidValueSet.Store(false) memoryLimit = initGOMemoryLimitValue } else { - t.isTuning.Store(true) + t.isValidValueSet.Store(true) } debug.SetMemoryLimit(memoryLimit) } diff --git a/pkg/util/gctuner/memory_limit_tuner_test.go b/pkg/util/gctuner/memory_limit_tuner_test.go index ab354530d852c..9104dd197cd9e 100644 --- a/pkg/util/gctuner/memory_limit_tuner_test.go +++ b/pkg/util/gctuner/memory_limit_tuner_test.go @@ -57,16 +57,16 @@ func TestGlobalMemoryTuner(t *testing.T) { memory.ServerMemoryLimit.Store(1 << 30) // 1GB GlobalMemoryLimitTuner.SetPercentage(0.8) // 1GB * 80% = 800MB GlobalMemoryLimitTuner.UpdateMemoryLimit() - require.True(t, GlobalMemoryLimitTuner.isTuning.Load()) + require.True(t, GlobalMemoryLimitTuner.isValidValueSet.Load()) defer func() { // If test.count > 1, wait tuning finished. require.Eventually(t, func() bool { //nolint: all_revive - return GlobalMemoryLimitTuner.isTuning.Load() + return GlobalMemoryLimitTuner.isValidValueSet.Load() }, 5*time.Second, 100*time.Millisecond) require.Eventually(t, func() bool { //nolint: all_revive - return !GlobalMemoryLimitTuner.waitingReset.Load() + return !GlobalMemoryLimitTuner.adjustPercentageInProgress.Load() }, 5*time.Second, 100*time.Millisecond) require.Eventually(t, func() bool { //nolint: all_revive @@ -85,7 +85,7 @@ func TestGlobalMemoryTuner(t *testing.T) { runtime.ReadMemStats(r) nextGC := r.NextGC memoryLimit := GlobalMemoryLimitTuner.calcMemoryLimit(GlobalMemoryLimitTuner.GetPercentage()) - // In golang source, nextGC = memoryLimit - three parts memory. + // Refer to golang source code, nextGC = memoryLimit - nonHeapMemory - overageMemory - headroom require.True(t, nextGC < uint64(memoryLimit)) } @@ -94,7 +94,7 @@ func TestGlobalMemoryTuner(t *testing.T) { memory210mb := allocator.alloc(210 << 20) require.Eventually(t, func() bool { - return GlobalMemoryLimitTuner.waitingReset.Load() && gcNum < getNowGCNum() + return GlobalMemoryLimitTuner.adjustPercentageInProgress.Load() && gcNum < getNowGCNum() }, 5*time.Second, 100*time.Millisecond) // Test waiting for reset require.Eventually(t, func() bool { @@ -123,3 +123,110 @@ func TestGlobalMemoryTuner(t *testing.T) { allocator.free(memory210mb) allocator.free(memory600mb) } + +func TestIssue48741(t *testing.T) { + // Close GOGCTuner + gogcTuner := EnableGOGCTuner.Load() + EnableGOGCTuner.Store(false) + defer EnableGOGCTuner.Store(gogcTuner) + + getMemoryLimitGCTotal := func() int64 { + return memory.MemoryLimitGCTotal.Load() + } + + waitingTunningFinishFn := func() { + for GlobalMemoryLimitTuner.adjustPercentageInProgress.Load() { + time.Sleep(10 * time.Millisecond) + } + } + + allocator := &mockAllocator{} + defer allocator.freeAll() + + checkIfMemoryLimitIsModified := func() { + // Try to trigger GC by 1GB * 80% = 800MB (tidb_server_memory_limit * tidb_server_memory_limit_gc_trigger) + gcNum := getMemoryLimitGCTotal() + memory810mb := allocator.alloc(810 << 20) + require.Eventually(t, + // Wait for the GC triggered by memory810mb + func() bool { + return GlobalMemoryLimitTuner.adjustPercentageInProgress.Load() && gcNum < getMemoryLimitGCTotal() + }, + 500*time.Millisecond, 100*time.Millisecond) + + // update memoryLimit, and sleep 500ms, let t.UpdateMemoryLimit() be called. + memory.ServerMemoryLimit.Store(1500 << 20) // 1.5 GB + time.Sleep(500 * time.Millisecond) + // UpdateMemoryLimit success during tunning. + require.True(t, GlobalMemoryLimitTuner.adjustPercentageInProgress.Load()) + require.Equal(t, debug.SetMemoryLimit(-1), int64(1500<<20*80/100)) + waitingTunningFinishFn() + // After the GC triggered by memory810mb. + gcNumAfterMemory810mb := getMemoryLimitGCTotal() + + memory200mb := allocator.alloc(200 << 20) + time.Sleep(2 * time.Second) + // The heapInUse is less than 1.5GB * 80% = 1.2GB, so the gc will not be triggered. + require.Equal(t, gcNumAfterMemory810mb, getMemoryLimitGCTotal()) + + memory300mb := allocator.alloc(300 << 20) + require.Eventually(t, + // Wait for the GC triggered by memory300mb + func() bool { + return GlobalMemoryLimitTuner.adjustPercentageInProgress.Load() && gcNumAfterMemory810mb < getMemoryLimitGCTotal() + }, + 5*time.Second, 100*time.Millisecond) + + // Sleep 500ms, let t.UpdateMemoryLimit() be called. + time.Sleep(500 * time.Millisecond) + // The memory limit will be 1.5GB * 110% during tunning. + require.Equal(t, debug.SetMemoryLimit(-1), int64(1500<<20*110/100)) + require.True(t, GlobalMemoryLimitTuner.adjustPercentageInProgress.Load()) + + allocator.free(memory810mb) + allocator.free(memory200mb) + allocator.free(memory300mb) + } + + checkIfMemoryLimitNotModified := func() { + // Try to trigger GC by 1GB * 80% = 800MB (tidb_server_memory_limit * tidb_server_memory_limit_gc_trigger) + gcNum := getMemoryLimitGCTotal() + memory810mb := allocator.alloc(810 << 20) + require.Eventually(t, + // Wait for the GC triggered by memory810mb + func() bool { + return GlobalMemoryLimitTuner.adjustPercentageInProgress.Load() && gcNum < getMemoryLimitGCTotal() + }, + 500*time.Millisecond, 100*time.Millisecond) + + // During the process of adjusting the percentage, the memory limit will be set to 1GB * 110% = 1.1GB. + require.Equal(t, debug.SetMemoryLimit(-1), int64(1<<30*110/100)) + + gcNumAfterMemory810mb := getMemoryLimitGCTotal() + // After the GC triggered by memory810mb. + waitingTunningFinishFn() + + require.Eventually(t, + // The GC will be trigged immediately after memoryLimit is set back to 1GB * 80% = 800MB. + func() bool { + return GlobalMemoryLimitTuner.adjustPercentageInProgress.Load() && gcNumAfterMemory810mb < getMemoryLimitGCTotal() + }, + 2*time.Second, 100*time.Millisecond) + + allocator.free(memory810mb) + } + + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/util/gctuner/mockUpdateGlobalVarDuringAdjustPercentage", "return(true)")) + defer func() { + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/util/gctuner/mockUpdateGlobalVarDuringAdjustPercentage")) + }() + + memory.ServerMemoryLimit.Store(1 << 30) // 1GB + GlobalMemoryLimitTuner.SetPercentage(0.8) // 1GB * 80% = 800MB + GlobalMemoryLimitTuner.UpdateMemoryLimit() + require.Equal(t, debug.SetMemoryLimit(-1), int64(1<<30*80/100)) + + checkIfMemoryLimitNotModified() + waitingTunningFinishFn() + checkIfMemoryLimitIsModified() +} diff --git a/pkg/util/generatedexpr/main_test.go b/pkg/util/generatedexpr/main_test.go index e9bc74444d9c2..cecfabc08b050 100644 --- a/pkg/util/generatedexpr/main_test.go +++ b/pkg/util/generatedexpr/main_test.go @@ -25,6 +25,7 @@ func TestMain(m *testing.M) { testsetup.SetupForCommonTest() opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), } diff --git a/pkg/util/hack/hack.go b/pkg/util/hack/hack.go index 1a60c1a0b2eb4..7af5e850bcb14 100644 --- a/pkg/util/hack/hack.go +++ b/pkg/util/hack/hack.go @@ -15,6 +15,8 @@ package hack import ( + "runtime" + "strings" "unsafe" ) @@ -41,12 +43,21 @@ func Slice(s string) []byte { // Represent as LoadFactorNum/LoadFactorDen, to allow integer math. // They are from the golang definition. ref: https://github.com/golang/go/blob/go1.13.15/src/runtime/map.go#L68-L71 const ( - // LoadFactorNum is the numerator of load factor - LoadFactorNum = 13 // LoadFactorDen is the denominator of load factor LoadFactorDen = 2 ) +// LoadFactorNum is the numerator of load factor +var LoadFactorNum = 13 + +func init() { + // In go1.21, the load factor num becomes 12 and go team has decided not to backport the fix to 1.21. + // See more details in https://github.com/golang/go/issues/63438 + if strings.Contains(runtime.Version(), `go1.21`) { + LoadFactorNum = 12 + } +} + const ( // DefBucketMemoryUsageForMapStrToSlice = bucketSize*(1+unsafe.Sizeof(string) + unsafe.Sizeof(slice))+2*ptrSize // ref https://github.com/golang/go/blob/go1.15.6/src/reflect/type.go#L2162. diff --git a/pkg/util/hack/main_test.go b/pkg/util/hack/main_test.go index cba7dcb8cd9f2..34dd6ee7f2e6f 100644 --- a/pkg/util/hack/main_test.go +++ b/pkg/util/hack/main_test.go @@ -25,6 +25,7 @@ func TestMain(m *testing.M) { testsetup.SetupForCommonTest() opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), } diff --git a/pkg/util/hint/BUILD.bazel b/pkg/util/hint/BUILD.bazel index d56776688ca8d..6b01ecd60ff2f 100644 --- a/pkg/util/hint/BUILD.bazel +++ b/pkg/util/hint/BUILD.bazel @@ -2,7 +2,11 @@ load("@io_bazel_rules_go//go:def.bzl", "go_library") go_library( name = "hint", - srcs = ["hint_processor.go"], + srcs = [ + "hint.go", + "hint_processor.go", + "hint_query_block.go", + ], importpath = "github.com/pingcap/tidb/pkg/util/hint", visibility = ["//visibility:public"], deps = [ diff --git a/pkg/util/hint/hint.go b/pkg/util/hint/hint.go new file mode 100644 index 0000000000000..bd6baf2bd2063 --- /dev/null +++ b/pkg/util/hint/hint.go @@ -0,0 +1,634 @@ +// Copyright 2023 PingCAP, 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. + +package hint + +import ( + "bytes" + "fmt" + "strings" + + mysql "github.com/pingcap/tidb/pkg/errno" + "github.com/pingcap/tidb/pkg/parser/ast" + "github.com/pingcap/tidb/pkg/parser/model" + "github.com/pingcap/tidb/pkg/sessionctx" + "github.com/pingcap/tidb/pkg/util/dbterror" +) + +// Hint flags listed here are used by PlanBuilder.subQueryHintFlags. +const ( + // TiDBMergeJoin is hint enforce merge join. + TiDBMergeJoin = "tidb_smj" + // HintSMJ is hint enforce merge join. + HintSMJ = "merge_join" + // HintNoMergeJoin is the hint to enforce the query not to use merge join. + HintNoMergeJoin = "no_merge_join" + + // TiDBBroadCastJoin indicates applying broadcast join by force. + TiDBBroadCastJoin = "tidb_bcj" + // HintBCJ indicates applying broadcast join by force. + HintBCJ = "broadcast_join" + // HintShuffleJoin indicates applying shuffle join by force. + HintShuffleJoin = "shuffle_join" + + // HintStraightJoin causes TiDB to join tables in the order in which they appear in the FROM clause. + HintStraightJoin = "straight_join" + // HintLeading specifies the set of tables to be used as the prefix in the execution plan. + HintLeading = "leading" + + // TiDBIndexNestedLoopJoin is hint enforce index nested loop join. + TiDBIndexNestedLoopJoin = "tidb_inlj" + // HintINLJ is hint enforce index nested loop join. + HintINLJ = "inl_join" + // HintINLHJ is hint enforce index nested loop hash join. + HintINLHJ = "inl_hash_join" + // HintINLMJ is hint enforce index nested loop merge join. + HintINLMJ = "inl_merge_join" + // HintNoIndexJoin is the hint to enforce the query not to use index join. + HintNoIndexJoin = "no_index_join" + // HintNoIndexHashJoin is the hint to enforce the query not to use index hash join. + HintNoIndexHashJoin = "no_index_hash_join" + // HintNoIndexMergeJoin is the hint to enforce the query not to use index merge join. + HintNoIndexMergeJoin = "no_index_merge_join" + // TiDBHashJoin is hint enforce hash join. + TiDBHashJoin = "tidb_hj" + // HintNoHashJoin is the hint to enforce the query not to use hash join. + HintNoHashJoin = "no_hash_join" + // HintHJ is hint enforce hash join. + HintHJ = "hash_join" + // HintHashJoinBuild is hint enforce hash join's build side + HintHashJoinBuild = "hash_join_build" + // HintHashJoinProbe is hint enforce hash join's probe side + HintHashJoinProbe = "hash_join_probe" + // HintHashAgg is hint enforce hash aggregation. + HintHashAgg = "hash_agg" + // HintStreamAgg is hint enforce stream aggregation. + HintStreamAgg = "stream_agg" + // HintMPP1PhaseAgg enforces the optimizer to use the mpp-1phase aggregation. + HintMPP1PhaseAgg = "mpp_1phase_agg" + // HintMPP2PhaseAgg enforces the optimizer to use the mpp-2phase aggregation. + HintMPP2PhaseAgg = "mpp_2phase_agg" + // HintUseIndex is hint enforce using some indexes. + HintUseIndex = "use_index" + // HintIgnoreIndex is hint enforce ignoring some indexes. + HintIgnoreIndex = "ignore_index" + // HintForceIndex make optimizer to use this index even if it thinks a table scan is more efficient. + HintForceIndex = "force_index" + // HintOrderIndex is hint enforce using some indexes and keep the index's order. + HintOrderIndex = "order_index" + // HintNoOrderIndex is hint enforce using some indexes and not keep the index's order. + HintNoOrderIndex = "no_order_index" + // HintAggToCop is hint enforce pushing aggregation to coprocessor. + HintAggToCop = "agg_to_cop" + // HintReadFromStorage is hint enforce some tables read from specific type of storage. + HintReadFromStorage = "read_from_storage" + // HintTiFlash is a label represents the tiflash storage type. + HintTiFlash = "tiflash" + // HintTiKV is a label represents the tikv storage type. + HintTiKV = "tikv" + // HintIndexMerge is a hint to enforce using some indexes at the same time. + HintIndexMerge = "use_index_merge" + // HintTimeRange is a hint to specify the time range for metrics summary tables + HintTimeRange = "time_range" + // HintIgnorePlanCache is a hint to enforce ignoring plan cache + HintIgnorePlanCache = "ignore_plan_cache" + // HintLimitToCop is a hint enforce pushing limit or topn to coprocessor. + HintLimitToCop = "limit_to_cop" + // HintMerge is a hint which can switch turning inline for the CTE. + HintMerge = "merge" + // HintSemiJoinRewrite is a hint to force we rewrite the semi join operator as much as possible. + HintSemiJoinRewrite = "semi_join_rewrite" + // HintNoDecorrelate indicates a LogicalApply not to be decorrelated. + HintNoDecorrelate = "no_decorrelate" + + // HintMemoryQuota sets the memory limit for a query + HintMemoryQuota = "memory_quota" + // HintUseToja is a hint to optimize `in (select ...)` subquery into `join` + HintUseToja = "use_toja" + // HintNoIndexMerge is a hint to disable index merge + HintNoIndexMerge = "no_index_merge" + // HintMaxExecutionTime specifies the max allowed execution time in milliseconds + HintMaxExecutionTime = "max_execution_time" + + // HintFlagSemiJoinRewrite corresponds to HintSemiJoinRewrite. + HintFlagSemiJoinRewrite uint64 = 1 << iota + // HintFlagNoDecorrelate corresponds to HintNoDecorrelate. + HintFlagNoDecorrelate +) + +const ( + // PreferINLJ indicates that the optimizer prefers to use index nested loop join. + PreferINLJ uint = 1 << iota + // PreferINLHJ indicates that the optimizer prefers to use index nested loop hash join. + PreferINLHJ + // PreferINLMJ indicates that the optimizer prefers to use index nested loop merge join. + PreferINLMJ + // PreferHJBuild indicates that the optimizer prefers to use hash join. + PreferHJBuild + // PreferHJProbe indicates that the optimizer prefers to use hash join. + PreferHJProbe + // PreferHashJoin indicates that the optimizer prefers to use hash join. + PreferHashJoin + // PreferNoHashJoin indicates that the optimizer prefers not to use hash join. + PreferNoHashJoin + // PreferMergeJoin indicates that the optimizer prefers to use merge join. + PreferMergeJoin + // PreferNoMergeJoin indicates that the optimizer prefers not to use merge join. + PreferNoMergeJoin + // PreferNoIndexJoin indicates that the optimizer prefers not to use index join. + PreferNoIndexJoin + // PreferNoIndexHashJoin indicates that the optimizer prefers not to use index hash join. + PreferNoIndexHashJoin + // PreferNoIndexMergeJoin indicates that the optimizer prefers not to use index merge join. + PreferNoIndexMergeJoin + // PreferBCJoin indicates that the optimizer prefers to use broadcast join. + PreferBCJoin + // PreferShuffleJoin indicates that the optimizer prefers to use shuffle join. + PreferShuffleJoin + // PreferRewriteSemiJoin indicates that the optimizer prefers to rewrite semi join. + PreferRewriteSemiJoin + + // PreferLeftAsINLJInner indicates that the optimizer prefers to use left child as inner child of index nested loop join. + PreferLeftAsINLJInner + // PreferRightAsINLJInner indicates that the optimizer prefers to use right child as inner child of index nested loop join. + PreferRightAsINLJInner + // PreferLeftAsINLHJInner indicates that the optimizer prefers to use left child as inner child of index nested loop hash join. + PreferLeftAsINLHJInner + // PreferRightAsINLHJInner indicates that the optimizer prefers to use right child as inner child of index nested loop hash join. + PreferRightAsINLHJInner + // PreferLeftAsINLMJInner indicates that the optimizer prefers to use left child as inner child of index nested loop merge join. + PreferLeftAsINLMJInner + // PreferRightAsINLMJInner indicates that the optimizer prefers to use right child as inner child of index nested loop merge join. + PreferRightAsINLMJInner + // PreferLeftAsHJBuild indicates that the optimizer prefers to use left child as build child of hash join. + PreferLeftAsHJBuild + // PreferRightAsHJBuild indicates that the optimizer prefers to use right child as build child of hash join. + PreferRightAsHJBuild + // PreferLeftAsHJProbe indicates that the optimizer prefers to use left child as probe child of hash join. + PreferLeftAsHJProbe + // PreferRightAsHJProbe indicates that the optimizer prefers to use right child as probe child of hash join. + PreferRightAsHJProbe + + // PreferHashAgg indicates that the optimizer prefers to use hash aggregation. + PreferHashAgg + // PreferStreamAgg indicates that the optimizer prefers to use stream aggregation. + PreferStreamAgg + // PreferMPP1PhaseAgg indicates that the optimizer prefers to use 1-phase aggregation. + PreferMPP1PhaseAgg + // PreferMPP2PhaseAgg indicates that the optimizer prefers to use 2-phase aggregation. + PreferMPP2PhaseAgg +) + +const ( + // PreferTiKV indicates that the optimizer prefers to use TiKV layer. + PreferTiKV = 1 << iota + // PreferTiFlash indicates that the optimizer prefers to use TiFlash layer. + PreferTiFlash +) + +// IndexNestedLoopJoinTables stores hint information about index nested loop join. +type IndexNestedLoopJoinTables struct { + INLJTables []TableInfo + INLHJTables []TableInfo + INLMJTables []TableInfo +} + +// TableHintInfo stores all table-level hint information. +// TableHintInfo is just another representation of ast.TableOptimizerHint, which is easier for the planner to use. +type TableHintInfo struct { + IndexNestedLoopJoinTables + NoIndexJoinTables IndexNestedLoopJoinTables + SortMergeJoinTables []TableInfo + BroadcastJoinTables []TableInfo + ShuffleJoinTables []TableInfo + HashJoinTables []TableInfo + NoHashJoinTables []TableInfo + NoMergeJoinTables []TableInfo + IndexHintList []IndexHintInfo + TiFlashTables []TableInfo + TiKVTables []TableInfo + AggHints AggHintInfo + IndexMergeHintList []IndexHintInfo + TimeRangeHint ast.HintTimeRange + LimitHints LimitHintInfo + MergeHints MergeHintInfo + LeadingJoinOrder []TableInfo + HJBuildTables []TableInfo + HJProbeTables []TableInfo +} + +// LimitHintInfo stores limit hint information. +type LimitHintInfo struct { + PreferLimitToCop bool +} + +// MergeHintInfo ...one bool flag for cte +type MergeHintInfo struct { + PreferMerge bool +} + +// TableInfo indicates which table this hint should take effect on. +type TableInfo struct { + DBName model.CIStr // the database name + TblName model.CIStr // the table name + Partitions []model.CIStr // partition information + SelectOffset int // the select block offset of this hint + Matched bool // whether this hint is applied successfully +} + +// IndexHintInfo indicates which index this hint should take effect on. +type IndexHintInfo struct { + DBName model.CIStr // the database name + TblName model.CIStr // the table name + Partitions []model.CIStr // partition information + IndexHint *ast.IndexHint // the original parser index hint structure + // Matched indicates whether this index hint + // has been successfully applied to a DataSource. + // If an IndexHintInfo is not Matched after building + // a Select statement, we will generate a warning for it. + Matched bool +} + +// Match checks whether the hint is matched with the given dbName and tblName. +func (hint *IndexHintInfo) Match(dbName, tblName model.CIStr) bool { + return hint.TblName.L == tblName.L && + (hint.DBName.L == dbName.L || + hint.DBName.L == "*") // for universal bindings, e.g. *.t +} + +// HintTypeString returns the string representation of the hint type. +func (hint *IndexHintInfo) HintTypeString() string { + switch hint.IndexHint.HintType { + case ast.HintUse: + return "use_index" + case ast.HintIgnore: + return "ignore_index" + case ast.HintForce: + return "force_index" + } + return "" +} + +// IndexString formats the IndexHint as DBName.tableName[, indexNames]. +func (hint *IndexHintInfo) IndexString() string { + var indexListString string + indexList := make([]string, len(hint.IndexHint.IndexNames)) + for i := range hint.IndexHint.IndexNames { + indexList[i] = hint.IndexHint.IndexNames[i].L + } + if len(indexList) > 0 { + indexListString = fmt.Sprintf(", %s", strings.Join(indexList, ", ")) + } + return fmt.Sprintf("%s.%s%s", hint.DBName, hint.TblName, indexListString) +} + +// AggHintInfo stores Agg hint information. +type AggHintInfo struct { + PreferAggType uint + PreferAggToCop bool +} + +// IfPreferMergeJoin checks whether the join hint is merge join. +func (info *TableHintInfo) IfPreferMergeJoin(tableNames ...*TableInfo) bool { + return info.MatchTableName(tableNames, info.SortMergeJoinTables) +} + +// IfPreferBroadcastJoin checks whether the join hint is broadcast join. +func (info *TableHintInfo) IfPreferBroadcastJoin(tableNames ...*TableInfo) bool { + return info.MatchTableName(tableNames, info.BroadcastJoinTables) +} + +// IfPreferShuffleJoin checks whether the join hint is shuffle join. +func (info *TableHintInfo) IfPreferShuffleJoin(tableNames ...*TableInfo) bool { + return info.MatchTableName(tableNames, info.ShuffleJoinTables) +} + +// IfPreferHashJoin checks whether the join hint is hash join. +func (info *TableHintInfo) IfPreferHashJoin(tableNames ...*TableInfo) bool { + return info.MatchTableName(tableNames, info.HashJoinTables) +} + +// IfPreferNoHashJoin checks whether the join hint is no hash join. +func (info *TableHintInfo) IfPreferNoHashJoin(tableNames ...*TableInfo) bool { + return info.MatchTableName(tableNames, info.NoHashJoinTables) +} + +// IfPreferNoMergeJoin checks whether the join hint is no merge join. +func (info *TableHintInfo) IfPreferNoMergeJoin(tableNames ...*TableInfo) bool { + return info.MatchTableName(tableNames, info.NoMergeJoinTables) +} + +// IfPreferHJBuild checks whether the join hint is hash join build side. +func (info *TableHintInfo) IfPreferHJBuild(tableNames ...*TableInfo) bool { + return info.MatchTableName(tableNames, info.HJBuildTables) +} + +// IfPreferHJProbe checks whether the join hint is hash join probe side. +func (info *TableHintInfo) IfPreferHJProbe(tableNames ...*TableInfo) bool { + return info.MatchTableName(tableNames, info.HJProbeTables) +} + +// IfPreferINLJ checks whether the join hint is index nested loop join. +func (info *TableHintInfo) IfPreferINLJ(tableNames ...*TableInfo) bool { + return info.MatchTableName(tableNames, info.IndexNestedLoopJoinTables.INLJTables) +} + +// IfPreferINLHJ checks whether the join hint is index nested loop hash join. +func (info *TableHintInfo) IfPreferINLHJ(tableNames ...*TableInfo) bool { + return info.MatchTableName(tableNames, info.IndexNestedLoopJoinTables.INLHJTables) +} + +// IfPreferINLMJ checks whether the join hint is index nested loop merge join. +func (info *TableHintInfo) IfPreferINLMJ(tableNames ...*TableInfo) bool { + return info.MatchTableName(tableNames, info.IndexNestedLoopJoinTables.INLMJTables) +} + +// IfPreferNoIndexJoin checks whether the join hint is no index join. +func (info *TableHintInfo) IfPreferNoIndexJoin(tableNames ...*TableInfo) bool { + return info.MatchTableName(tableNames, info.NoIndexJoinTables.INLJTables) +} + +// IfPreferNoIndexHashJoin checks whether the join hint is no index hash join. +func (info *TableHintInfo) IfPreferNoIndexHashJoin(tableNames ...*TableInfo) bool { + return info.MatchTableName(tableNames, info.NoIndexJoinTables.INLHJTables) +} + +// IfPreferNoIndexMergeJoin checks whether the join hint is no index merge join. +func (info *TableHintInfo) IfPreferNoIndexMergeJoin(tableNames ...*TableInfo) bool { + return info.MatchTableName(tableNames, info.NoIndexJoinTables.INLMJTables) +} + +// IfPreferTiFlash checks whether the hint hit the need of TiFlash. +func (info *TableHintInfo) IfPreferTiFlash(tableName *TableInfo) *TableInfo { + return info.matchTiKVOrTiFlash(tableName, info.TiFlashTables) +} + +// IfPreferTiKV checks whether the hint hit the need of TiKV. +func (info *TableHintInfo) IfPreferTiKV(tableName *TableInfo) *TableInfo { + return info.matchTiKVOrTiFlash(tableName, info.TiKVTables) +} + +func (*TableHintInfo) matchTiKVOrTiFlash(tableName *TableInfo, hintTables []TableInfo) *TableInfo { + if tableName == nil { + return nil + } + for i, tbl := range hintTables { + if tableName.DBName.L == tbl.DBName.L && tableName.TblName.L == tbl.TblName.L && tbl.SelectOffset == tableName.SelectOffset { + hintTables[i].Matched = true + return &tbl + } + } + return nil +} + +// MatchTableName checks whether the hint hit the need. +// Only need either side matches one on the list. +// Even though you can put 2 tables on the list, +// it doesn't mean optimizer will reorder to make them +// join directly. +// Which it joins on with depend on sequence of traverse +// and without reorder, user might adjust themselves. +// This is similar to MySQL hints. +func (*TableHintInfo) MatchTableName(tables []*TableInfo, hintTables []TableInfo) bool { + hintMatched := false + for _, table := range tables { + for i, curEntry := range hintTables { + if table == nil { + continue + } + if (curEntry.DBName.L == table.DBName.L || curEntry.DBName.L == "*") && + curEntry.TblName.L == table.TblName.L && + table.SelectOffset == curEntry.SelectOffset { + hintTables[i].Matched = true + hintMatched = true + break + } + } + } + return hintMatched +} + +// RemoveDuplicatedHints removes duplicated hints in this hit list. +func RemoveDuplicatedHints(hints []*ast.TableOptimizerHint) []*ast.TableOptimizerHint { + if len(hints) < 2 { + return hints + } + m := make(map[string]struct{}, len(hints)) + res := make([]*ast.TableOptimizerHint, 0, len(hints)) + for _, hint := range hints { + key := RestoreTableOptimizerHint(hint) + if _, ok := m[key]; ok { + continue + } + m[key] = struct{}{} + res = append(res, hint) + } + return res +} + +// TableNames2HintTableInfo converts table names to TableInfo. +func TableNames2HintTableInfo(ctx sessionctx.Context, hintName string, hintTables []ast.HintTable, p *QBHintHandler, currentOffset int) []TableInfo { + if len(hintTables) == 0 { + return nil + } + hintTableInfos := make([]TableInfo, 0, len(hintTables)) + defaultDBName := model.NewCIStr(ctx.GetSessionVars().CurrentDB) + isInapplicable := false + for _, hintTable := range hintTables { + tableInfo := TableInfo{ + DBName: hintTable.DBName, + TblName: hintTable.TableName, + Partitions: hintTable.PartitionList, + SelectOffset: p.GetHintOffset(hintTable.QBName, currentOffset), + } + if tableInfo.DBName.L == "" { + tableInfo.DBName = defaultDBName + } + switch hintName { + case TiDBMergeJoin, HintSMJ, TiDBIndexNestedLoopJoin, HintINLJ, + HintINLHJ, HintINLMJ, TiDBHashJoin, HintHJ, HintLeading: + if len(tableInfo.Partitions) > 0 { + isInapplicable = true + } + } + hintTableInfos = append(hintTableInfos, tableInfo) + } + if isInapplicable { + ctx.GetSessionVars().StmtCtx.AppendWarning( + fmt.Errorf("Optimizer Hint %s is inapplicable on specified partitions", + Restore2JoinHint(hintName, hintTableInfos))) + return nil + } + return hintTableInfos +} + +func restore2TableHint(hintTables ...TableInfo) string { + buffer := bytes.NewBufferString("") + for i, table := range hintTables { + buffer.WriteString(table.TblName.L) + if len(table.Partitions) > 0 { + buffer.WriteString(" PARTITION(") + for j, partition := range table.Partitions { + if j > 0 { + buffer.WriteString(", ") + } + buffer.WriteString(partition.L) + } + buffer.WriteString(")") + } + if i < len(hintTables)-1 { + buffer.WriteString(", ") + } + } + return buffer.String() +} + +// Restore2JoinHint restores join hint to string. +func Restore2JoinHint(hintType string, hintTables []TableInfo) string { + if len(hintTables) == 0 { + return strings.ToUpper(hintType) + } + buffer := bytes.NewBufferString("/*+ ") + buffer.WriteString(strings.ToUpper(hintType)) + buffer.WriteString("(") + buffer.WriteString(restore2TableHint(hintTables...)) + buffer.WriteString(") */") + return buffer.String() +} + +// Restore2IndexHint restores index hint to string. +func Restore2IndexHint(hintType string, hintIndex IndexHintInfo) string { + buffer := bytes.NewBufferString("/*+ ") + buffer.WriteString(strings.ToUpper(hintType)) + buffer.WriteString("(") + buffer.WriteString(restore2TableHint(TableInfo{ + DBName: hintIndex.DBName, + TblName: hintIndex.TblName, + Partitions: hintIndex.Partitions, + })) + if hintIndex.IndexHint != nil && len(hintIndex.IndexHint.IndexNames) > 0 { + for i, indexName := range hintIndex.IndexHint.IndexNames { + if i > 0 { + buffer.WriteString(",") + } + buffer.WriteString(" " + indexName.L) + } + } + buffer.WriteString(") */") + return buffer.String() +} + +// Restore2StorageHint restores storage hint to string. +func Restore2StorageHint(tiflashTables, tikvTables []TableInfo) string { + buffer := bytes.NewBufferString("/*+ ") + buffer.WriteString(strings.ToUpper(HintReadFromStorage)) + buffer.WriteString("(") + if len(tiflashTables) > 0 { + buffer.WriteString("tiflash[") + buffer.WriteString(restore2TableHint(tiflashTables...)) + buffer.WriteString("]") + if len(tikvTables) > 0 { + buffer.WriteString(", ") + } + } + if len(tikvTables) > 0 { + buffer.WriteString("tikv[") + buffer.WriteString(restore2TableHint(tikvTables...)) + buffer.WriteString("]") + } + buffer.WriteString(") */") + return buffer.String() +} + +// ExtractUnmatchedTables extracts unmatched tables from hintTables. +func ExtractUnmatchedTables(hintTables []TableInfo) []string { + var tableNames []string + for _, table := range hintTables { + if !table.Matched { + tableNames = append(tableNames, table.TblName.O) + } + } + return tableNames +} + +var ( + errInternal = dbterror.ClassOptimizer.NewStd(mysql.ErrInternal) +) + +// CollectUnmatchedHintWarnings collects warnings for unmatched hints from this TableHintInfo. +func CollectUnmatchedHintWarnings(hintInfo *TableHintInfo) (warnings []error) { + warnings = append(warnings, collectUnmatchedIndexHintWarning(hintInfo.IndexHintList, false)...) + warnings = append(warnings, collectUnmatchedIndexHintWarning(hintInfo.IndexMergeHintList, true)...) + warnings = append(warnings, collectUnmatchedJoinHintWarning(HintINLJ, TiDBIndexNestedLoopJoin, hintInfo.IndexNestedLoopJoinTables.INLJTables)...) + warnings = append(warnings, collectUnmatchedJoinHintWarning(HintINLHJ, "", hintInfo.IndexNestedLoopJoinTables.INLHJTables)...) + warnings = append(warnings, collectUnmatchedJoinHintWarning(HintINLMJ, "", hintInfo.IndexNestedLoopJoinTables.INLMJTables)...) + warnings = append(warnings, collectUnmatchedJoinHintWarning(HintSMJ, TiDBMergeJoin, hintInfo.SortMergeJoinTables)...) + warnings = append(warnings, collectUnmatchedJoinHintWarning(HintBCJ, TiDBBroadCastJoin, hintInfo.BroadcastJoinTables)...) + warnings = append(warnings, collectUnmatchedJoinHintWarning(HintShuffleJoin, HintShuffleJoin, hintInfo.ShuffleJoinTables)...) + warnings = append(warnings, collectUnmatchedJoinHintWarning(HintHJ, TiDBHashJoin, hintInfo.HashJoinTables)...) + warnings = append(warnings, collectUnmatchedJoinHintWarning(HintHashJoinBuild, "", hintInfo.HJBuildTables)...) + warnings = append(warnings, collectUnmatchedJoinHintWarning(HintHashJoinProbe, "", hintInfo.HJProbeTables)...) + warnings = append(warnings, collectUnmatchedJoinHintWarning(HintLeading, "", hintInfo.LeadingJoinOrder)...) + warnings = append(warnings, collectUnmatchedStorageHintWarning(hintInfo.TiFlashTables, hintInfo.TiKVTables)...) + return warnings +} + +func collectUnmatchedIndexHintWarning(indexHints []IndexHintInfo, usedForIndexMerge bool) (warnings []error) { + for _, hint := range indexHints { + if !hint.Matched { + var hintTypeString string + if usedForIndexMerge { + hintTypeString = "use_index_merge" + } else { + hintTypeString = hint.HintTypeString() + } + errMsg := fmt.Sprintf("%s(%s) is inapplicable, check whether the table(%s.%s) exists", + hintTypeString, + hint.IndexString(), + hint.DBName, + hint.TblName, + ) + warnings = append(warnings, errInternal.FastGen(errMsg)) + } + } + return warnings +} + +func collectUnmatchedJoinHintWarning(joinType string, joinTypeAlias string, hintTables []TableInfo) (warnings []error) { + unMatchedTables := ExtractUnmatchedTables(hintTables) + if len(unMatchedTables) == 0 { + return + } + if len(joinTypeAlias) != 0 { + joinTypeAlias = fmt.Sprintf(" or %s", Restore2JoinHint(joinTypeAlias, hintTables)) + } + + errMsg := fmt.Sprintf("There are no matching table names for (%s) in optimizer hint %s%s. Maybe you can use the table alias name", + strings.Join(unMatchedTables, ", "), Restore2JoinHint(joinType, hintTables), joinTypeAlias) + warnings = append(warnings, errInternal.GenWithStack(errMsg)) + return warnings +} + +func collectUnmatchedStorageHintWarning(tiflashTables, tikvTables []TableInfo) (warnings []error) { + unMatchedTiFlashTables := ExtractUnmatchedTables(tiflashTables) + unMatchedTiKVTables := ExtractUnmatchedTables(tikvTables) + if len(unMatchedTiFlashTables)+len(unMatchedTiKVTables) == 0 { + return + } + errMsg := fmt.Sprintf("There are no matching table names for (%s) in optimizer hint %s. Maybe you can use the table alias name", + strings.Join(append(unMatchedTiFlashTables, unMatchedTiKVTables...), ", "), + Restore2StorageHint(tiflashTables, tikvTables)) + warnings = append(warnings, errInternal.GenWithStack(errMsg)) + return warnings +} diff --git a/pkg/util/hint/hint_processor.go b/pkg/util/hint/hint_processor.go index 59d94e754d134..7a296e74ad943 100644 --- a/pkg/util/hint/hint_processor.go +++ b/pkg/util/hint/hint_processor.go @@ -16,7 +16,6 @@ package hint import ( "fmt" - "strconv" "strings" "github.com/pingcap/errors" @@ -89,6 +88,18 @@ func ExtractTableHintsFromStmtNode(node ast.Node, sctx sessionctx.Context) []*as // check duplicated hints checkInsertStmtHintDuplicated(node, sctx) return x.TableHints + case *ast.SetOprStmt: + var result []*ast.TableOptimizerHint + if x.SelectList == nil { + return nil + } + for _, s := range x.SelectList.Selects { + tmp := ExtractTableHintsFromStmtNode(s, sctx) + if len(tmp) != 0 { + result = append(result, tmp...) + } + } + return result default: return nil } @@ -261,7 +272,7 @@ func ParseHintsSet(p *parser.Parser, sql, charset, collation, db string) (*Hints return nil, nil, nil, fmt.Errorf("bind_sql must be a single statement: %s", sql) } hs := CollectHint(stmtNodes[0]) - processor := &BlockHintProcessor{} + processor := NewQBHintHandler(nil) stmtNodes[0].Accept(processor) topNodeType := nodeType4Stmt(stmtNodes[0]) for i, tblHints := range hs.tableHints { @@ -319,183 +330,6 @@ func extractHintWarns(warns []error) []error { return nil } -// BlockHintProcessor processes hints at different level of sql statement. -type BlockHintProcessor struct { - QbNameMap map[string]int // Map from query block name to select stmt offset. - QbHints map[int][]*ast.TableOptimizerHint // Group all hints at same query block. - - // Used for the view's hint - QbNameMap4View map[string][]ast.HintTable // Map from view's query block name to view's table list. - QbHints4View map[string][]*ast.TableOptimizerHint // Group all hints at same query block for view hints. - QbNameUsed4View map[string]struct{} // Store all the qb_name hints which are used for view - - Ctx sessionctx.Context - selectStmtOffset int -} - -// MaxSelectStmtOffset returns the current stmt offset. -func (p *BlockHintProcessor) MaxSelectStmtOffset() int { - return p.selectStmtOffset -} - -// Enter implements Visitor interface. -func (p *BlockHintProcessor) Enter(in ast.Node) (ast.Node, bool) { - switch node := in.(type) { - case *ast.UpdateStmt: - p.checkQueryBlockHints(node.TableHints, 0) - case *ast.DeleteStmt: - p.checkQueryBlockHints(node.TableHints, 0) - case *ast.SelectStmt: - p.selectStmtOffset++ - node.QueryBlockOffset = p.selectStmtOffset - // Handle the view hints and update the left hint. - node.TableHints = p.handleViewHints(node.TableHints, node.QueryBlockOffset) - p.checkQueryBlockHints(node.TableHints, node.QueryBlockOffset) - case *ast.ExplainStmt: - return in, true - case *ast.CreateBindingStmt: - return in, true - } - return in, false -} - -// Leave implements Visitor interface. -func (*BlockHintProcessor) Leave(in ast.Node) (ast.Node, bool) { - return in, true -} - -const hintQBName = "qb_name" - -// checkQueryBlockHints checks the validity of query blocks and records the map of query block name to select offset. -func (p *BlockHintProcessor) checkQueryBlockHints(hints []*ast.TableOptimizerHint, offset int) { - var qbName string - for _, hint := range hints { - if hint.HintName.L != hintQBName { - continue - } - if qbName != "" { - if p.Ctx != nil { - p.Ctx.GetSessionVars().StmtCtx.AppendWarning(fmt.Errorf("There are more than two query names in same query block, using the first one %s", qbName)) - } - } else { - qbName = hint.QBName.L - } - } - if qbName == "" { - return - } - if p.QbNameMap == nil { - p.QbNameMap = make(map[string]int) - } - if _, ok := p.QbNameMap[qbName]; ok { - if p.Ctx != nil { - p.Ctx.GetSessionVars().StmtCtx.AppendWarning(fmt.Errorf("Duplicate query block name %s, only the first one is effective", qbName)) - } - } else { - p.QbNameMap[qbName] = offset - } -} - -func (p *BlockHintProcessor) handleViewHints(hints []*ast.TableOptimizerHint, offset int) (leftHints []*ast.TableOptimizerHint) { - if len(hints) == 0 { - return - } - - usedHints := make([]bool, len(hints)) - // handle the query block name hints for view - for i, hint := range hints { - if hint.HintName.L != hintQBName || len(hint.Tables) == 0 { - continue - } - usedHints[i] = true - if p.QbNameMap4View == nil { - p.QbNameMap4View = make(map[string][]ast.HintTable) - p.QbNameUsed4View = make(map[string]struct{}) - } - qbName := hint.QBName.L - if qbName == "" { - continue - } - if _, ok := p.QbNameMap4View[qbName]; ok { - if p.Ctx != nil { - p.Ctx.GetSessionVars().StmtCtx.AppendWarning(fmt.Errorf("Duplicate query block name %s for view's query block hint, only the first one is effective", qbName)) - } - } else { - if offset != 1 { - // If there are some qb_name hints for view are not defined in the first query block, - // we should add the query block number where it is located to the first table in the view's qb_name hint table list. - qbNum := hint.Tables[0].QBName.L - if qbNum == "" { - hint.Tables[0].QBName = model.NewCIStr(fmt.Sprintf("%s%d", defaultSelectBlockPrefix, offset)) - } - } - p.QbNameMap4View[qbName] = hint.Tables - } - } - - // handle the view hints - for i, hint := range hints { - if usedHints[i] || hint.HintName.L == hintQBName { - continue - } - - ok := false - qbName := hint.QBName.L - if qbName != "" { - _, ok = p.QbNameMap4View[qbName] - } else if len(hint.Tables) > 0 { - // Only support to define the tables belong to the same query block in one view hint - qbName = hint.Tables[0].QBName.L - _, ok = p.QbNameMap4View[qbName] - if ok { - for _, table := range hint.Tables { - if table.QBName.L != qbName { - ok = false - break - } - } - if !ok { - p.Ctx.GetSessionVars().StmtCtx.AppendWarning(fmt.Errorf("Only one query block name is allowed in a view hint, otherwise the hint will be invalid")) - usedHints[i] = true - } - } - } - - if ok { - if p.QbHints4View == nil { - p.QbHints4View = make(map[string][]*ast.TableOptimizerHint) - } - usedHints[i] = true - p.QbHints4View[qbName] = append(p.QbHints4View[qbName], hint) - } - } - - for i, hint := range hints { - if !usedHints[i] { - leftHints = append(leftHints, hint) - } - } - return -} - -// HandleUnusedViewHints handle the unused view hints. -func (p *BlockHintProcessor) HandleUnusedViewHints() { - if p.QbNameMap4View != nil { - for qbName := range p.QbNameMap4View { - _, ok := p.QbNameUsed4View[qbName] - if !ok && p.Ctx != nil { - p.Ctx.GetSessionVars().StmtCtx.AppendWarning(fmt.Errorf("The qb_name hint %s is unused, please check whether the table list in the qb_name hint %s is correct", qbName, qbName)) - } - } - } -} - -const ( - defaultUpdateBlockName = "upd_1" - defaultDeleteBlockName = "del_1" - defaultSelectBlockPrefix = "sel_" -) - // NodeType indicates if the node is for SELECT / UPDATE / DELETE. type NodeType int @@ -524,102 +358,6 @@ func nodeType4Stmt(node ast.StmtNode) NodeType { return TypeInvalid } -// getBlockName finds the offset of query block name. It uses 0 as offset for top level update or delete, -// -1 for invalid block name. -func (p *BlockHintProcessor) getBlockOffset(blockName model.CIStr) int { - if p.QbNameMap != nil { - level, ok := p.QbNameMap[blockName.L] - if ok { - return level - } - } - // Handle the default query block name. - if blockName.L == defaultUpdateBlockName || blockName.L == defaultDeleteBlockName { - return 0 - } - if strings.HasPrefix(blockName.L, defaultSelectBlockPrefix) { - suffix := blockName.L[len(defaultSelectBlockPrefix):] - level, err := strconv.ParseInt(suffix, 10, 64) - if err != nil || level > int64(p.selectStmtOffset) { - return -1 - } - return int(level) - } - return -1 -} - -// GetHintOffset gets the offset of stmt that the hints take effects. -func (p *BlockHintProcessor) GetHintOffset(qbName model.CIStr, currentOffset int) int { - if qbName.L != "" { - return p.getBlockOffset(qbName) - } - return currentOffset -} - -func (p *BlockHintProcessor) checkTableQBName(tables []ast.HintTable) bool { - for _, table := range tables { - if table.QBName.L != "" && p.getBlockOffset(table.QBName) < 0 { - return false - } - } - return true -} - -func (p *BlockHintProcessor) isHint4View(hint *ast.TableOptimizerHint) bool { - if hint.QBName.L != "" { - if p.QbNameMap4View != nil { - _, ok := p.QbNameMap4View[hint.QBName.L] - return ok - } - return false - } - allViewHints := true - for _, table := range hint.Tables { - qbName := table.QBName.L - if _, ok := p.QbNameMap4View[qbName]; !ok { - allViewHints = false - break - } - } - return allViewHints -} - -// GetCurrentStmtHints extracts all hints that take effects at current stmt. -func (p *BlockHintProcessor) GetCurrentStmtHints(hints []*ast.TableOptimizerHint, currentOffset int) []*ast.TableOptimizerHint { - if p.QbHints == nil { - p.QbHints = make(map[int][]*ast.TableOptimizerHint) - } - for _, hint := range hints { - if hint.HintName.L == hintQBName { - continue - } - offset := p.GetHintOffset(hint.QBName, currentOffset) - if offset < 0 || !p.checkTableQBName(hint.Tables) { - if p.Ctx != nil { - hintStr := RestoreTableOptimizerHint(hint) - p.Ctx.GetSessionVars().StmtCtx.AppendWarning(fmt.Errorf("Hint %s is ignored due to unknown query block name", hintStr)) - } - continue - } - p.QbHints[offset] = append(p.QbHints[offset], hint) - } - return p.QbHints[currentOffset] -} - -// GenerateQBName builds QBName from offset. -func GenerateQBName(nodeType NodeType, blockOffset int) (model.CIStr, error) { - if blockOffset == 0 { - if nodeType == TypeDelete { - return model.NewCIStr(defaultDeleteBlockName), nil - } - if nodeType == TypeUpdate { - return model.NewCIStr(defaultUpdateBlockName), nil - } - return model.NewCIStr(""), fmt.Errorf("Unexpected NodeType %d when block offset is 0", nodeType) - } - return model.NewCIStr(fmt.Sprintf("%s%d", defaultSelectBlockPrefix, blockOffset)), nil -} - // CheckBindingFromHistoryBindable checks whether the ast and hint string from history is bindable. // Not support: // 1. query use tiFlash engine diff --git a/pkg/util/hint/hint_query_block.go b/pkg/util/hint/hint_query_block.go new file mode 100644 index 0000000000000..3e12029bbd277 --- /dev/null +++ b/pkg/util/hint/hint_query_block.go @@ -0,0 +1,310 @@ +// Copyright 2023 PingCAP, 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. + +package hint + +import ( + "fmt" + "strconv" + "strings" + + "github.com/pingcap/tidb/pkg/parser/ast" + "github.com/pingcap/tidb/pkg/parser/model" + "github.com/pingcap/tidb/pkg/sessionctx" +) + +// QBHintHandler is used to handle hints at different query blocks. +// See the 2 examples below: +// 1) `select /*+ use_index(@sel_2 t2, a) */ * from t1, (select a*2 as b from t2) tx where a>b`; +// 2) `select /*+ use_index(@qb_xxx t2, a) */ * from t1, (select /*+ qb_name(qb_xxx) */ a*2 as b from t2) tx where a>b`; +// In both cases, the `use_index` hint doesn't take effect directly, since a specific qb_name is specified, and this +// QBHintHandler is used to handle this cases. +type QBHintHandler struct { + QBNameToSelOffset map[string]int // map[QBName]SelectOffset + QBOffsetToHints map[int][]*ast.TableOptimizerHint // map[QueryBlockOffset]Hints + + // Used for the view's hint + ViewQBNameToTable map[string][]ast.HintTable // map[QBName]TableInfo + ViewQBNameToHints map[string][]*ast.TableOptimizerHint // map[QBName]Hints + ViewQBNameUsed map[string]struct{} // map[QBName]Used + + Ctx sessionctx.Context + selectStmtOffset int +} + +// NewQBHintHandler creates a QBHintHandler. +func NewQBHintHandler(ctx sessionctx.Context) *QBHintHandler { + return &QBHintHandler{ + Ctx: ctx, + } +} + +// MaxSelectStmtOffset returns the current stmt offset. +func (p *QBHintHandler) MaxSelectStmtOffset() int { + return p.selectStmtOffset +} + +// Enter implements Visitor interface. +func (p *QBHintHandler) Enter(in ast.Node) (ast.Node, bool) { + switch node := in.(type) { + case *ast.UpdateStmt: + p.checkQueryBlockHints(node.TableHints, 0) + case *ast.DeleteStmt: + p.checkQueryBlockHints(node.TableHints, 0) + case *ast.SelectStmt: + p.selectStmtOffset++ + node.QueryBlockOffset = p.selectStmtOffset + // Handle the view hints and update the left hint. + node.TableHints = p.handleViewHints(node.TableHints, node.QueryBlockOffset) + p.checkQueryBlockHints(node.TableHints, node.QueryBlockOffset) + case *ast.ExplainStmt: + return in, true + case *ast.CreateBindingStmt: + return in, true + } + return in, false +} + +// Leave implements Visitor interface. +func (*QBHintHandler) Leave(in ast.Node) (ast.Node, bool) { + return in, true +} + +const hintQBName = "qb_name" + +// checkQueryBlockHints checks the validity of query blocks and records the map of query block name to select offset. +func (p *QBHintHandler) checkQueryBlockHints(hints []*ast.TableOptimizerHint, offset int) { + var qbName string + for _, hint := range hints { + if hint.HintName.L != hintQBName { + continue + } + if qbName != "" { + if p.Ctx != nil { + p.Ctx.GetSessionVars().StmtCtx.AppendWarning(fmt.Errorf("There are more than two query names in same query block, using the first one %s", qbName)) + } + } else { + qbName = hint.QBName.L + } + } + if qbName == "" { + return + } + if p.QBNameToSelOffset == nil { + p.QBNameToSelOffset = make(map[string]int) + } + if _, ok := p.QBNameToSelOffset[qbName]; ok { + if p.Ctx != nil { + p.Ctx.GetSessionVars().StmtCtx.AppendWarning(fmt.Errorf("Duplicate query block name %s, only the first one is effective", qbName)) + } + } else { + p.QBNameToSelOffset[qbName] = offset + } +} + +func (p *QBHintHandler) handleViewHints(hints []*ast.TableOptimizerHint, offset int) (leftHints []*ast.TableOptimizerHint) { + if len(hints) == 0 { + return + } + + usedHints := make([]bool, len(hints)) + // handle the query block name hints for view + for i, hint := range hints { + if hint.HintName.L != hintQBName || len(hint.Tables) == 0 { + continue + } + usedHints[i] = true + if p.ViewQBNameToTable == nil { + p.ViewQBNameToTable = make(map[string][]ast.HintTable) + p.ViewQBNameUsed = make(map[string]struct{}) + } + qbName := hint.QBName.L + if qbName == "" { + continue + } + if _, ok := p.ViewQBNameToTable[qbName]; ok { + if p.Ctx != nil { + p.Ctx.GetSessionVars().StmtCtx.AppendWarning(fmt.Errorf("Duplicate query block name %s for view's query block hint, only the first one is effective", qbName)) + } + } else { + if offset != 1 { + // If there are some qb_name hints for view are not defined in the first query block, + // we should add the query block number where it is located to the first table in the view's qb_name hint table list. + qbNum := hint.Tables[0].QBName.L + if qbNum == "" { + hint.Tables[0].QBName = model.NewCIStr(fmt.Sprintf("%s%d", defaultSelectBlockPrefix, offset)) + } + } + p.ViewQBNameToTable[qbName] = hint.Tables + } + } + + // handle the view hints + for i, hint := range hints { + if usedHints[i] || hint.HintName.L == hintQBName { + continue + } + + ok := false + qbName := hint.QBName.L + if qbName != "" { + _, ok = p.ViewQBNameToTable[qbName] + } else if len(hint.Tables) > 0 { + // Only support to define the tables belong to the same query block in one view hint + qbName = hint.Tables[0].QBName.L + _, ok = p.ViewQBNameToTable[qbName] + if ok { + for _, table := range hint.Tables { + if table.QBName.L != qbName { + ok = false + break + } + } + if !ok { + p.Ctx.GetSessionVars().StmtCtx.AppendWarning(fmt.Errorf("Only one query block name is allowed in a view hint, otherwise the hint will be invalid")) + usedHints[i] = true + } + } + } + + if ok { + if p.ViewQBNameToHints == nil { + p.ViewQBNameToHints = make(map[string][]*ast.TableOptimizerHint) + } + usedHints[i] = true + p.ViewQBNameToHints[qbName] = append(p.ViewQBNameToHints[qbName], hint) + } + } + + for i, hint := range hints { + if !usedHints[i] { + leftHints = append(leftHints, hint) + } + } + return +} + +// HandleUnusedViewHints handle the unused view hints. +func (p *QBHintHandler) HandleUnusedViewHints() { + if p.ViewQBNameToTable != nil { + for qbName := range p.ViewQBNameToTable { + _, ok := p.ViewQBNameUsed[qbName] + if !ok && p.Ctx != nil { + p.Ctx.GetSessionVars().StmtCtx.AppendWarning(fmt.Errorf("The qb_name hint %s is unused, please check whether the table list in the qb_name hint %s is correct", qbName, qbName)) + } + } + } +} + +const ( + defaultUpdateBlockName = "upd_1" + defaultDeleteBlockName = "del_1" + defaultSelectBlockPrefix = "sel_" +) + +// getBlockName finds the offset of query block name. It uses 0 as offset for top level update or delete, +// -1 for invalid block name. +func (p *QBHintHandler) getBlockOffset(blockName model.CIStr) int { + if p.QBNameToSelOffset != nil { + level, ok := p.QBNameToSelOffset[blockName.L] + if ok { + return level + } + } + // Handle the default query block name. + if blockName.L == defaultUpdateBlockName || blockName.L == defaultDeleteBlockName { + return 0 + } + if strings.HasPrefix(blockName.L, defaultSelectBlockPrefix) { + suffix := blockName.L[len(defaultSelectBlockPrefix):] + level, err := strconv.ParseInt(suffix, 10, 64) + if err != nil || level > int64(p.selectStmtOffset) { + return -1 + } + return int(level) + } + return -1 +} + +// GetHintOffset gets the offset of stmt that the hints take effects. +func (p *QBHintHandler) GetHintOffset(qbName model.CIStr, currentOffset int) int { + if qbName.L != "" { + return p.getBlockOffset(qbName) + } + return currentOffset +} + +func (p *QBHintHandler) checkTableQBName(tables []ast.HintTable) bool { + for _, table := range tables { + if table.QBName.L != "" && p.getBlockOffset(table.QBName) < 0 { + return false + } + } + return true +} + +func (p *QBHintHandler) isHint4View(hint *ast.TableOptimizerHint) bool { + if hint.QBName.L != "" { + if p.ViewQBNameToTable != nil { + _, ok := p.ViewQBNameToTable[hint.QBName.L] + return ok + } + return false + } + allViewHints := true + for _, table := range hint.Tables { + qbName := table.QBName.L + if _, ok := p.ViewQBNameToTable[qbName]; !ok { + allViewHints = false + break + } + } + return allViewHints +} + +// GetCurrentStmtHints extracts all hints that take effects at current stmt. +func (p *QBHintHandler) GetCurrentStmtHints(hints []*ast.TableOptimizerHint, currentOffset int) []*ast.TableOptimizerHint { + if p.QBOffsetToHints == nil { + p.QBOffsetToHints = make(map[int][]*ast.TableOptimizerHint) + } + for _, hint := range hints { + if hint.HintName.L == hintQBName { + continue + } + offset := p.GetHintOffset(hint.QBName, currentOffset) + if offset < 0 || !p.checkTableQBName(hint.Tables) { + if p.Ctx != nil { + hintStr := RestoreTableOptimizerHint(hint) + p.Ctx.GetSessionVars().StmtCtx.AppendWarning(fmt.Errorf("Hint %s is ignored due to unknown query block name", hintStr)) + } + continue + } + p.QBOffsetToHints[offset] = append(p.QBOffsetToHints[offset], hint) + } + return p.QBOffsetToHints[currentOffset] +} + +// GenerateQBName builds QBName from offset. +func GenerateQBName(nodeType NodeType, qbOffset int) (model.CIStr, error) { + if qbOffset == 0 { + if nodeType == TypeDelete { + return model.NewCIStr(defaultDeleteBlockName), nil + } + if nodeType == TypeUpdate { + return model.NewCIStr(defaultUpdateBlockName), nil + } + return model.NewCIStr(""), fmt.Errorf("Unexpected NodeType %d when block offset is 0", nodeType) + } + return model.NewCIStr(fmt.Sprintf("%s%d", defaultSelectBlockPrefix, qbOffset)), nil +} diff --git a/pkg/util/keydecoder/main_test.go b/pkg/util/keydecoder/main_test.go index 4df44739f2dac..75a5bcaf9dd68 100644 --- a/pkg/util/keydecoder/main_test.go +++ b/pkg/util/keydecoder/main_test.go @@ -24,6 +24,7 @@ import ( func TestMain(m *testing.M) { opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), } diff --git a/pkg/util/kvcache/main_test.go b/pkg/util/kvcache/main_test.go index b4c6c23422645..d74daf55d3dc8 100644 --- a/pkg/util/kvcache/main_test.go +++ b/pkg/util/kvcache/main_test.go @@ -25,6 +25,7 @@ func TestMain(m *testing.M) { testsetup.SetupForCommonTest() opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), } diff --git a/pkg/util/localpool/main_test.go b/pkg/util/localpool/main_test.go index 58e280974d634..cabecfab09ba7 100644 --- a/pkg/util/localpool/main_test.go +++ b/pkg/util/localpool/main_test.go @@ -25,6 +25,7 @@ func TestMain(m *testing.M) { testsetup.SetupForCommonTest() opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), } diff --git a/pkg/util/logutil/main_test.go b/pkg/util/logutil/main_test.go index 5ab6d0991e04e..e84a04de092d7 100644 --- a/pkg/util/logutil/main_test.go +++ b/pkg/util/logutil/main_test.go @@ -44,6 +44,7 @@ func TestMain(m *testing.M) { testsetup.SetupForCommonTest() opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("gopkg.in/natefinch/lumberjack%2ev2.(*Logger).millRun"), } diff --git a/pkg/util/main_test.go b/pkg/util/main_test.go index 0de0070ab2afa..bf04338f10d8e 100644 --- a/pkg/util/main_test.go +++ b/pkg/util/main_test.go @@ -25,6 +25,7 @@ func TestMain(m *testing.M) { testsetup.SetupForCommonTest() opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), } diff --git a/pkg/util/mathutil/main_test.go b/pkg/util/mathutil/main_test.go index a87c5cc6aecb0..7a14ec8f93a39 100644 --- a/pkg/util/mathutil/main_test.go +++ b/pkg/util/mathutil/main_test.go @@ -25,6 +25,7 @@ func TestMain(m *testing.M) { testsetup.SetupForCommonTest() opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), } diff --git a/pkg/util/memory/main_test.go b/pkg/util/memory/main_test.go index 5c77593cb6d00..08084096cb625 100644 --- a/pkg/util/memory/main_test.go +++ b/pkg/util/memory/main_test.go @@ -22,7 +22,12 @@ import ( ) func TestMain(m *testing.M) { + opts := []goleak.Option{ + goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), + goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), + goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), + } testsetup.SetupForCommonTest() - - goleak.VerifyTestMain(m) + goleak.VerifyTestMain(m, opts...) } diff --git a/pkg/util/memory/tracker.go b/pkg/util/memory/tracker.go index e60987066b667..d228474e3f455 100644 --- a/pkg/util/memory/tracker.go +++ b/pkg/util/memory/tracker.go @@ -72,7 +72,7 @@ var ( // The actions that could be triggered are: SpillDiskAction, SortAndSpillDiskAction, rateLimitAction, // PanicOnExceed, globalPanicOnExceed, LogOnExceed. type Tracker struct { - bytesLimit atomic.Value + bytesLimit atomic.Pointer[bytesLimits] actionMuForHardLimit actionMu actionMuForSoftLimit actionMu Killer *sqlkiller.SQLKiller @@ -177,7 +177,7 @@ func NewGlobalTracker(label int, bytesLimit int64) *Tracker { // CheckBytesLimit check whether the bytes limit of the tracker is equal to a value. // Only used in test. func (t *Tracker) CheckBytesLimit(val int64) bool { - return t.bytesLimit.Load().(*bytesLimits).bytesHardLimit == val + return t.bytesLimit.Load().bytesHardLimit == val } // SetBytesLimit sets the bytes limit for this tracker. @@ -192,20 +192,20 @@ func (t *Tracker) SetBytesLimit(bytesLimit int64) { // GetBytesLimit gets the bytes limit for this tracker. // "bytesHardLimit <= 0" means no limit. func (t *Tracker) GetBytesLimit() int64 { - return t.bytesLimit.Load().(*bytesLimits).bytesHardLimit + return t.bytesLimit.Load().bytesHardLimit } // CheckExceed checks whether the consumed bytes is exceed for this tracker. func (t *Tracker) CheckExceed() bool { - bytesHardLimit := t.bytesLimit.Load().(*bytesLimits).bytesHardLimit + bytesHardLimit := t.bytesLimit.Load().bytesHardLimit return atomic.LoadInt64(&t.bytesConsumed) >= bytesHardLimit && bytesHardLimit > 0 } // SetActionOnExceed sets the action when memory usage exceeds bytesHardLimit. func (t *Tracker) SetActionOnExceed(a ActionOnExceed) { t.actionMuForHardLimit.Lock() + defer t.actionMuForHardLimit.Unlock() t.actionMuForHardLimit.actionOnExceed = a - t.actionMuForHardLimit.Unlock() } // FallbackOldAndSetNewAction sets the action when memory usage exceeds bytesHardLimit @@ -406,7 +406,7 @@ func (t *Tracker) Consume(bs int64) { } bytesConsumed := atomic.AddInt64(&tracker.bytesConsumed, bs) bytesReleased := atomic.LoadInt64(&tracker.bytesReleased) - limits := tracker.bytesLimit.Load().(*bytesLimits) + limits := tracker.bytesLimit.Load() if bytesConsumed+bytesReleased >= limits.bytesHardLimit && limits.bytesHardLimit > 0 { rootExceed = tracker } @@ -839,6 +839,10 @@ const ( LabelForMemDB int = -28 // LabelForCursorFetch represents the label of the execution of cursor fetch LabelForCursorFetch int = -29 + // LabelForChunkDataInDiskByChunks represents the label of the chunk list in disk + LabelForChunkDataInDiskByChunks int = -30 + // LabelForSortPartition represents the label of the sort partition + LabelForSortPartition = -31 ) // MetricsTypes is used to get label for metrics diff --git a/pkg/util/misc.go b/pkg/util/misc.go index 1b0fce47d2b64..abbe9a9f66287 100644 --- a/pkg/util/misc.go +++ b/pkg/util/misc.go @@ -174,7 +174,7 @@ func SyntaxWarn(err error) error { } } - return parser.ErrParse.GenWithStackByArgs(syntaxErrorPrefix, err.Error()) + return parser.ErrParse.FastGenByArgs(syntaxErrorPrefix, err.Error()) } var ( @@ -485,12 +485,8 @@ func LoadTLSCertificates(ca, key, cert string, autoTLS bool, rsaKeySize int) (tl requireTLS := tlsutil.RequireSecureTransport.Load() - var minTLSVersion uint16 = tls.VersionTLS11 + var minTLSVersion uint16 = tls.VersionTLS12 switch tlsver := config.GetGlobalConfig().Security.MinTLSVersion; tlsver { - case "TLSv1.0": - minTLSVersion = tls.VersionTLS10 - case "TLSv1.1": - minTLSVersion = tls.VersionTLS11 case "TLSv1.2": minTLSVersion = tls.VersionTLS12 case "TLSv1.3": @@ -503,9 +499,8 @@ func LoadTLSCertificates(ca, key, cert string, autoTLS bool, rsaKeySize int) (tl ) } if minTLSVersion < tls.VersionTLS12 { - logutil.BgLogger().Warn( - "Minimum TLS version allows pre-TLSv1.2 protocols, this is not recommended", - ) + err = errors.New("Minimum TLS version pre-TLSv1.2 protocols are not allowed") + return } // Try loading CA cert. diff --git a/pkg/util/mock/context.go b/pkg/util/mock/context.go index 56dc4ae1ad50d..24bf504cb1fa6 100644 --- a/pkg/util/mock/context.go +++ b/pkg/util/mock/context.go @@ -450,6 +450,11 @@ func (c *Context) InSandBoxMode() bool { return c.inSandBoxMode } +// SetInfoSchema is to set info shema for the test. +func (c *Context) SetInfoSchema(is sessionctx.InfoschemaMetaVersion) { + c.is = is +} + // Close implements the sessionctx.Context interface. func (*Context) Close() {} diff --git a/pkg/util/mock/main_test.go b/pkg/util/mock/main_test.go index 0bea359a75d0e..28264fbe37db8 100644 --- a/pkg/util/mock/main_test.go +++ b/pkg/util/mock/main_test.go @@ -25,6 +25,7 @@ func TestMain(m *testing.M) { testsetup.SetupForCommonTest() opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), diff --git a/pkg/util/mvmap/main_test.go b/pkg/util/mvmap/main_test.go index 7ba67dea80350..1c5ac6c151991 100644 --- a/pkg/util/mvmap/main_test.go +++ b/pkg/util/mvmap/main_test.go @@ -25,6 +25,7 @@ func TestMain(m *testing.M) { testsetup.SetupForCommonTest() opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), } diff --git a/pkg/util/paging/main_test.go b/pkg/util/paging/main_test.go index 51c55f873da42..fd5aef62c58a3 100644 --- a/pkg/util/paging/main_test.go +++ b/pkg/util/paging/main_test.go @@ -25,6 +25,7 @@ func TestMain(m *testing.M) { testsetup.SetupForCommonTest() opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), } diff --git a/pkg/util/parser/ast.go b/pkg/util/parser/ast.go index 3c6495d650d1b..f730a07098c2d 100644 --- a/pkg/util/parser/ast.go +++ b/pkg/util/parser/ast.go @@ -118,6 +118,13 @@ func SimpleCases(node ast.StmtNode, defaultDB, origin string) (s string, ok bool return builder.String(), true } +// Three flags for restore with default DB: +// 1. RestoreStringSingleQuotes specifies to use single quotes to surround the string; +// 2. RestoreSpacesAroundBinaryOperation specifies to add space around binary operation; +// 3. RestoreStringWithoutCharset specifies to not print charset before string; +// 4. RestoreNameBackQuotes specifies to use back quotes to surround the name; +const defaultRestoreFlag = format.RestoreStringSingleQuotes | format.RestoreSpacesAroundBinaryOperation | format.RestoreStringWithoutCharset | format.RestoreNameBackQuotes + // RestoreWithDefaultDB returns restore strings for StmtNode with defaultDB // This function is customized for SQL bind usage. func RestoreWithDefaultDB(node ast.StmtNode, defaultDB, origin string) string { @@ -125,12 +132,7 @@ func RestoreWithDefaultDB(node ast.StmtNode, defaultDB, origin string) string { return s } var sb strings.Builder - // Three flags for restore with default DB: - // 1. RestoreStringSingleQuotes specifies to use single quotes to surround the string; - // 2. RestoreSpacesAroundBinaryOperation specifies to add space around binary operation; - // 3. RestoreStringWithoutCharset specifies to not print charset before string; - // 4. RestoreNameBackQuotes specifies to use back quotes to surround the name; - ctx := format.NewRestoreCtx(format.RestoreStringSingleQuotes|format.RestoreSpacesAroundBinaryOperation|format.RestoreStringWithoutCharset|format.RestoreNameBackQuotes, &sb) + ctx := format.NewRestoreCtx(defaultRestoreFlag, &sb) ctx.DefaultDB = defaultDB if err := node.Restore(ctx); err != nil { logutil.BgLogger().Debug("restore SQL failed", zap.String("category", "sql-bind"), zap.Error(err)) @@ -138,3 +140,15 @@ func RestoreWithDefaultDB(node ast.StmtNode, defaultDB, origin string) string { } return sb.String() } + +// RestoreWithoutDB returns restore strings for StmtNode without schema name. +// This function is customized for universal SQL binding. +func RestoreWithoutDB(node ast.StmtNode) string { + var sb strings.Builder + ctx := format.NewRestoreCtx(defaultRestoreFlag|format.RestoreWithoutSchemaName, &sb) + if err := node.Restore(ctx); err != nil { + logutil.BgLogger().Debug("restore SQL failed", zap.String("category", "sql-bind"), zap.Error(err)) + return "" + } + return sb.String() +} diff --git a/pkg/util/parser/main_test.go b/pkg/util/parser/main_test.go index dc54105b04d67..b11a48b6bc514 100644 --- a/pkg/util/parser/main_test.go +++ b/pkg/util/parser/main_test.go @@ -25,6 +25,7 @@ func TestMain(m *testing.M) { testsetup.SetupForCommonTest() opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), } diff --git a/pkg/util/plancodec/main_test.go b/pkg/util/plancodec/main_test.go index 8dc97a2e08e21..22f4f0cb7cd8e 100644 --- a/pkg/util/plancodec/main_test.go +++ b/pkg/util/plancodec/main_test.go @@ -25,6 +25,7 @@ func TestMain(m *testing.M) { testsetup.SetupForCommonTest() opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), } diff --git a/pkg/util/prefetch/BUILD.bazel b/pkg/util/prefetch/BUILD.bazel new file mode 100644 index 0000000000000..29b6ff8d31096 --- /dev/null +++ b/pkg/util/prefetch/BUILD.bazel @@ -0,0 +1,17 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") + +go_library( + name = "prefetch", + srcs = ["reader.go"], + importpath = "github.com/pingcap/tidb/pkg/util/prefetch", + visibility = ["//visibility:public"], +) + +go_test( + name = "prefetch_test", + timeout = "short", + srcs = ["reader_test.go"], + embed = [":prefetch"], + flaky = True, + deps = ["@com_github_stretchr_testify//require"], +) diff --git a/pkg/util/prefetch/reader.go b/pkg/util/prefetch/reader.go new file mode 100644 index 0000000000000..f61d5bf016764 --- /dev/null +++ b/pkg/util/prefetch/reader.go @@ -0,0 +1,113 @@ +// Copyright 2023 PingCAP, 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. + +package prefetch + +import ( + "bytes" + "io" + "sync" +) + +// Reader is a reader that prefetches data from the underlying reader. +type Reader struct { + r io.ReadCloser + curBufReader *bytes.Reader + buf [2][]byte + bufIdx int + bufCh chan []byte + err error // after bufCh is closed + wg sync.WaitGroup + + closed bool + closedCh chan struct{} +} + +// NewReader creates a new Reader. +func NewReader(r io.ReadCloser, prefetchSize int) io.ReadCloser { + ret := &Reader{ + r: r, + bufCh: make(chan []byte), + err: nil, + closedCh: make(chan struct{}), + } + ret.buf[0] = make([]byte, prefetchSize/2) + ret.buf[1] = make([]byte, prefetchSize/2) + ret.wg.Add(1) + go ret.run() + return ret +} + +func (r *Reader) run() { + defer r.wg.Done() + for { + r.bufIdx = (r.bufIdx + 1) % 2 + buf := r.buf[r.bufIdx] + n, err := r.r.Read(buf) + buf = buf[:n] + select { + case <-r.closedCh: + return + case r.bufCh <- buf: + } + if err != nil { + r.err = err + close(r.bufCh) + return + } + } +} + +// Read implements io.Reader. Read should not be called concurrently with Close. +func (r *Reader) Read(data []byte) (int, error) { + total := 0 + for { + if r.curBufReader == nil { + b, ok := <-r.bufCh + if !ok { + if total > 0 { + return total, nil + } + return 0, r.err + } + + r.curBufReader = bytes.NewReader(b) + } + + expected := len(data) + n, err := r.curBufReader.Read(data) + total += n + if n == expected { + return total, nil + } + + data = data[n:] + if err == io.EOF || r.curBufReader.Len() == 0 { + r.curBufReader = nil + continue + } + } +} + +// Close implements io.Closer. Close should not be called concurrently with Read. +func (r *Reader) Close() error { + if r.closed { + return nil + } + ret := r.r.Close() + close(r.closedCh) + r.wg.Wait() + r.closed = true + return ret +} diff --git a/pkg/util/prefetch/reader_test.go b/pkg/util/prefetch/reader_test.go new file mode 100644 index 0000000000000..0d2972ed80289 --- /dev/null +++ b/pkg/util/prefetch/reader_test.go @@ -0,0 +1,82 @@ +// Copyright 2023 PingCAP, 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. + +package prefetch + +import ( + "bytes" + "io" + "testing" + + "github.com/stretchr/testify/require" +) + +func TestBasic(t *testing.T) { + source := bytes.NewReader([]byte("01234567890")) + r := NewReader(io.NopCloser(source), 3) + buf := make([]byte, 1) + n, err := r.Read(buf) + require.NoError(t, err) + require.EqualValues(t, 1, n) + require.EqualValues(t, "0", buf[:n]) + + buf = make([]byte, 2) + n, err = r.Read(buf) + require.NoError(t, err) + require.EqualValues(t, 2, n) + require.EqualValues(t, "12", buf[:n]) + + buf = make([]byte, 3) + n, err = r.Read(buf) + require.NoError(t, err) + require.EqualValues(t, 3, n) + require.EqualValues(t, "345", buf[:n]) + + buf = make([]byte, 4) + n, err = r.Read(buf) + require.NoError(t, err) + require.EqualValues(t, 4, n) + require.EqualValues(t, "6789", buf[:n]) + n, err = r.Read(buf) + require.NoError(t, err) + require.EqualValues(t, 1, n) + require.EqualValues(t, "0", buf[:n]) + _, err = r.Read(buf) + require.ErrorIs(t, err, io.EOF) + + source = bytes.NewReader([]byte("01234567890")) + r = NewReader(io.NopCloser(source), 3) + buf = make([]byte, 11) + n, err = r.Read(buf) + require.NoError(t, err) + require.EqualValues(t, 11, n) + _, err = r.Read(buf) + require.ErrorIs(t, err, io.EOF) + + source = bytes.NewReader([]byte("01234")) + r = NewReader(io.NopCloser(source), 100) + buf = make([]byte, 11) + n, err = r.Read(buf) + require.NoError(t, err) + require.EqualValues(t, 5, n) + _, err = r.Read(buf) + require.ErrorIs(t, err, io.EOF) +} + +func TestCloseBeforeDrainRead(t *testing.T) { + data := make([]byte, 1024) + r := NewReader(io.NopCloser(bytes.NewReader(data)), 2) + err := r.Close() + require.NoError(t, err) +} diff --git a/pkg/util/printer/main_test.go b/pkg/util/printer/main_test.go index 773220ce96303..581f8a2ad5884 100644 --- a/pkg/util/printer/main_test.go +++ b/pkg/util/printer/main_test.go @@ -25,6 +25,7 @@ func TestMain(m *testing.M) { testsetup.SetupForCommonTest() opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), } diff --git a/pkg/util/profile/main_test.go b/pkg/util/profile/main_test.go index bf6400442e635..350b9aa02484e 100644 --- a/pkg/util/profile/main_test.go +++ b/pkg/util/profile/main_test.go @@ -25,6 +25,7 @@ func TestMain(m *testing.M) { testsetup.SetupForCommonTest() opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), } diff --git a/pkg/util/ranger/BUILD.bazel b/pkg/util/ranger/BUILD.bazel index 935274ab75cf0..fa230a789bbf5 100644 --- a/pkg/util/ranger/BUILD.bazel +++ b/pkg/util/ranger/BUILD.bazel @@ -30,6 +30,7 @@ go_library( "//pkg/util/codec", "//pkg/util/collate", "//pkg/util/dbterror", + "//pkg/util/hack", "@com_github_pingcap_errors//:errors", ], ) diff --git a/pkg/util/ranger/checker.go b/pkg/util/ranger/checker.go index b279678459460..7fe2131ed162f 100644 --- a/pkg/util/ranger/checker.go +++ b/pkg/util/ranger/checker.go @@ -141,16 +141,6 @@ func (c *conditionChecker) checkScalarFunction(scalar *expression.ScalarFunction func (c *conditionChecker) checkLikeFunc(scalar *expression.ScalarFunction) (isAccessCond, shouldReserve bool) { _, collation := scalar.CharsetAndCollation() - if collate.NewCollationEnabled() && !collate.IsBinCollation(collation) { - // The algorithm constructs the range in byte-level: for example, ab% is mapped to [ab, ac] by adding 1 to the last byte. - // However, this is incorrect for non-binary collation strings because the sort key order is not the same as byte order. - // For example, "`%" is mapped to the range [`, a](where ` is 0x60 and a is 0x61). - // Because the collation utf8_general_ci is case-insensitive, a and A have the same sort key. - // Finally, the range comes to be [`, A], which is actually an empty range. - // See https://github.com/pingcap/tidb/issues/31174 for more details. - // In short, when the column type is non-binary collation string, we cannot use `like` expressions to generate the range. - return false, true - } if !collate.CompatibleCollate(scalar.GetArgs()[0].GetType().GetCollate(), collation) { return false, true } @@ -168,11 +158,20 @@ func (c *conditionChecker) checkLikeFunc(scalar *expression.ScalarFunction) (isA if err != nil { return false, true } + likeFuncReserve := !c.isFullLengthColumn() + + // Different from `=`, trailing spaces are always significant, and can't be ignored in `like`. + // In tidb's implementation, for PAD SPACE collations, the trailing spaces are removed in the index key. So we are + // unable to distinguish 'xxx' from 'xxx ' by a single index range scan, and we may read more data than needed by + // the `like` function. Therefore, a Selection is needed to filter the data. + if isPadSpaceCollation(collation) { + likeFuncReserve = true + } + if len(patternStr) == 0 { - return true, !c.isFullLengthColumn() + return true, likeFuncReserve } escape := byte(scalar.GetArgs()[2].(*expression.Constant).Value.GetInt64()) - likeFuncReserve := !c.isFullLengthColumn() for i := 0; i < len(patternStr); i++ { if patternStr[i] == escape { i++ diff --git a/pkg/util/ranger/detacher.go b/pkg/util/ranger/detacher.go index b898e2260eeb9..37ff8ab1ddc85 100644 --- a/pkg/util/ranger/detacher.go +++ b/pkg/util/ranger/detacher.go @@ -241,7 +241,7 @@ func compareCNFItemRangeResult(curResult, bestResult *cnfItemRangeResult) (curIs // e.g, for input CNF expressions ((a,b) in ((1,1),(2,2))) and a > 1 and ((a,b,c) in (1,1,1),(2,2,2)) // ((a,b,c) in (1,1,1),(2,2,2)) would be extracted. func extractBestCNFItemRanges(sctx sessionctx.Context, conds []expression.Expression, cols []*expression.Column, - lengths []int, rangeMaxSize int64) (*cnfItemRangeResult, []*valueInfo, error) { + lengths []int, rangeMaxSize int64, convertToSortKey bool) (*cnfItemRangeResult, []*valueInfo, error) { if len(conds) < 2 { return nil, nil, nil } @@ -260,7 +260,7 @@ func extractBestCNFItemRanges(sctx sessionctx.Context, conds []expression.Expres // We build ranges for `(a,b) in ((1,1),(1,2))` and get `[1 1, 1 1] [1 2, 1 2]`, which are point ranges and we can // append `c = 1` to the point ranges. However, if we choose to merge consecutive ranges here, we get `[1 1, 1 2]`, // which are not point ranges, and we cannot append `c = 1` anymore. - res, err := detachCondAndBuildRangeWithoutMerging(sctx, tmpConds, cols, lengths, rangeMaxSize) + res, err := detachCondAndBuildRangeWithoutMerging(sctx, tmpConds, cols, lengths, rangeMaxSize, convertToSortKey) if err != nil { return nil, nil, err } @@ -303,7 +303,7 @@ func unionColumnValues(lhs, rhs []*valueInfo) []*valueInfo { // detachCNFCondAndBuildRangeForIndex will detach the index filters from table filters. These conditions are connected with `and` // It will first find the point query column and then extract the range query column. // considerDNF is true means it will try to extract access conditions from the DNF expressions. -func (d *rangeDetacher) detachCNFCondAndBuildRangeForIndex(conditions []expression.Expression, tpSlice []*types.FieldType, considerDNF bool) (*DetachRangeResult, error) { +func (d *rangeDetacher) detachCNFCondAndBuildRangeForIndex(conditions []expression.Expression, newTpSlice []*types.FieldType, considerDNF bool) (*DetachRangeResult, error) { var ( eqCount int ranges Ranges @@ -316,7 +316,7 @@ func (d *rangeDetacher) detachCNFCondAndBuildRangeForIndex(conditions []expressi return res, nil } var remainedConds []expression.Expression - ranges, accessConds, remainedConds, err = d.buildRangeOnColsByCNFCond(tpSlice, len(accessConds), accessConds) + ranges, accessConds, remainedConds, err = d.buildRangeOnColsByCNFCond(newTpSlice, len(accessConds), accessConds) if err != nil { return nil, err } @@ -336,7 +336,7 @@ func (d *rangeDetacher) detachCNFCondAndBuildRangeForIndex(conditions []expressi // Therefore, we need to calculate pointRanges separately so that it can be used to append tail ranges in considerDNF branch. // See https://github.com/pingcap/tidb/issues/26029 for details. var pointRanges Ranges - if hasPrefix(d.lengths) && fixPrefixColRange(ranges, d.lengths, tpSlice) { + if hasPrefix(d.lengths) { if d.mergeConsecutive { pointRanges = make(Ranges, 0, len(ranges)) for _, ran := range ranges { @@ -376,7 +376,7 @@ func (d *rangeDetacher) detachCNFCondAndBuildRangeForIndex(conditions []expressi ctx: d.sctx, } if considerDNF { - bestCNFItemRes, columnValues, err := extractBestCNFItemRanges(d.sctx, conditions, d.cols, d.lengths, d.rangeMaxSize) + bestCNFItemRes, columnValues, err := extractBestCNFItemRanges(d.sctx, conditions, d.cols, d.lengths, d.rangeMaxSize, d.convertToSortKey) if err != nil { return nil, err } @@ -452,7 +452,7 @@ func (d *rangeDetacher) detachCNFCondAndBuildRangeForIndex(conditions []expressi } // `eqOrInCount` must be 0 when coming here. res.AccessConds, res.RemainedConds = detachColumnCNFConditions(d.sctx, newConditions, checker) - ranges, res.AccessConds, remainedConds, err = d.buildCNFIndexRange(tpSlice, 0, res.AccessConds) + ranges, res.AccessConds, remainedConds, err = d.buildCNFIndexRange(newTpSlice, 0, res.AccessConds) if err != nil { return nil, err } @@ -473,7 +473,7 @@ func (d *rangeDetacher) detachCNFCondAndBuildRangeForIndex(conditions []expressi accessConds = append(accessConds, cond) // TODO: if it's prefix column, we need to add cond to filterConds? } - ranges, accessConds, remainedConds, err = d.buildCNFIndexRange(tpSlice, eqOrInCount, accessConds) + ranges, accessConds, remainedConds, err = d.buildCNFIndexRange(newTpSlice, eqOrInCount, accessConds) if err != nil { return nil, err } @@ -608,7 +608,7 @@ func extractValueInfo(expr expression.Expression) *valueInfo { func ExtractEqAndInCondition(sctx sessionctx.Context, conditions []expression.Expression, cols []*expression.Column, lengths []int) ([]expression.Expression, []expression.Expression, []expression.Expression, []*valueInfo, bool) { var filters []expression.Expression - rb := builder{ctx: sctx} + rb := builder{sctx: sctx} accesses := make([]expression.Expression, len(cols)) points := make([][]*point, len(cols)) mergedAccesses := make([]expression.Expression, len(cols)) @@ -627,12 +627,16 @@ func ExtractEqAndInCondition(sctx sessionctx.Context, conditions []expression.Ex } // Multiple Eq/In conditions for one column in CNF, apply intersection on them // Lazily compute the points for the previously visited Eq/In + newTp := newFieldType(cols[offset].GetType()) collator := collate.GetCollator(cols[offset].GetType().GetCollate()) if mergedAccesses[offset] == nil { mergedAccesses[offset] = accesses[offset] - points[offset] = rb.build(accesses[offset], collator) + // Note that this is a relatively special usage of build(). We will restore the points back to Expression for + // later use and may build the Expression to points again. + // We need to keep the original value here, which means we neither cut prefix nor convert to sort key. + points[offset] = rb.build(accesses[offset], newTp, types.UnspecifiedLength, false) } - points[offset] = rb.intersection(points[offset], rb.build(cond, collator), collator) + points[offset] = rb.intersection(points[offset], rb.build(cond, newTp, types.UnspecifiedLength, false), collator) if len(points[offset]) == 0 { // Early termination if false expression found if expression.MaybeOverOptimized4PlanCache(sctx, conditions) { // `a>@x and a<@y` --> `invalid-range if @x>=@y` @@ -715,7 +719,7 @@ func (d *rangeDetacher) detachDNFCondAndBuildRangeForIndex(condition *expression optPrefixIndexSingleScan: d.sctx.GetSessionVars().OptPrefixIndexSingleScan, ctx: d.sctx, } - rb := builder{ctx: d.sctx} + rb := builder{sctx: d.sctx} dnfItems := expression.FlattenDNFConditions(condition) newAccessItems := make([]expression.Expression, 0, len(dnfItems)) var totalRanges Ranges @@ -773,9 +777,10 @@ func (d *rangeDetacher) detachDNFCondAndBuildRangeForIndex(condition *expression if shouldReserve { hasResidual = true } - points := rb.build(item, collate.GetCollator(newTpSlice[0].GetCollate())) + points := rb.build(item, newTpSlice[0], d.lengths[0], d.convertToSortKey) + tmpNewTp := convertStringFTToBinaryCollate(newTpSlice[0]) // TODO: restrict the mem usage of ranges - ranges, rangeFallback, err := points2Ranges(d.sctx, points, newTpSlice[0], d.rangeMaxSize) + ranges, rangeFallback, err := points2Ranges(d.sctx, points, tmpNewTp, d.rangeMaxSize) if err != nil { return nil, nil, nil, false, errors.Trace(err) } @@ -805,10 +810,6 @@ func (d *rangeDetacher) detachDNFCondAndBuildRangeForIndex(condition *expression } } - // Take prefix index into consideration. - if hasPrefix(d.lengths) { - fixPrefixColRange(totalRanges, d.lengths, newTpSlice) - } totalRanges, err := UnionRanges(d.sctx, totalRanges, d.mergeConsecutive) if err != nil { return nil, nil, nil, false, errors.Trace(err) @@ -871,6 +872,7 @@ func DetachCondAndBuildRangeForIndex(sctx sessionctx.Context, conditions []expre cols: cols, lengths: lengths, mergeConsecutive: true, + convertToSortKey: true, rangeMaxSize: rangeMaxSize, } return d.detachCondAndBuildRangeForCols() @@ -879,13 +881,14 @@ func DetachCondAndBuildRangeForIndex(sctx sessionctx.Context, conditions []expre // detachCondAndBuildRangeWithoutMerging detaches the index filters from table filters and uses them to build ranges. // When building ranges, it doesn't merge consecutive ranges. func detachCondAndBuildRangeWithoutMerging(sctx sessionctx.Context, conditions []expression.Expression, cols []*expression.Column, - lengths []int, rangeMaxSize int64) (*DetachRangeResult, error) { + lengths []int, rangeMaxSize int64, convertToSortKey bool) (*DetachRangeResult, error) { d := &rangeDetacher{ sctx: sctx, allConds: conditions, cols: cols, lengths: lengths, mergeConsecutive: false, + convertToSortKey: convertToSortKey, rangeMaxSize: rangeMaxSize, } return d.detachCondAndBuildRangeForCols() @@ -897,7 +900,7 @@ func detachCondAndBuildRangeWithoutMerging(sctx sessionctx.Context, conditions [ // The returned values are encapsulated into a struct DetachRangeResult, see its comments for explanation. func DetachCondAndBuildRangeForPartition(sctx sessionctx.Context, conditions []expression.Expression, cols []*expression.Column, lengths []int, rangeMaxSize int64) (*DetachRangeResult, error) { - return detachCondAndBuildRangeWithoutMerging(sctx, conditions, cols, lengths, rangeMaxSize) + return detachCondAndBuildRangeWithoutMerging(sctx, conditions, cols, lengths, rangeMaxSize, false) } type rangeDetacher struct { @@ -906,6 +909,7 @@ type rangeDetacher struct { cols []*expression.Column lengths []int mergeConsecutive bool + convertToSortKey bool rangeMaxSize int64 } @@ -952,6 +956,7 @@ func DetachSimpleCondAndBuildRangeForIndex(sctx sessionctx.Context, conditions [ cols: cols, lengths: lengths, mergeConsecutive: true, + convertToSortKey: true, rangeMaxSize: rangeMaxSize, } res, err := d.detachCNFCondAndBuildRangeForIndex(conditions, newTpSlice, false) diff --git a/pkg/util/ranger/main_test.go b/pkg/util/ranger/main_test.go index e4ab0093e2f8b..81b31a53dbdd6 100644 --- a/pkg/util/ranger/main_test.go +++ b/pkg/util/ranger/main_test.go @@ -35,6 +35,7 @@ func TestMain(m *testing.M) { opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), diff --git a/pkg/util/ranger/points.go b/pkg/util/ranger/points.go index feebebb36441d..872aa72f79b2e 100644 --- a/pkg/util/ranger/points.go +++ b/pkg/util/ranger/points.go @@ -24,12 +24,14 @@ import ( "github.com/pingcap/tidb/pkg/errno" "github.com/pingcap/tidb/pkg/expression" "github.com/pingcap/tidb/pkg/parser/ast" + "github.com/pingcap/tidb/pkg/parser/charset" "github.com/pingcap/tidb/pkg/parser/mysql" "github.com/pingcap/tidb/pkg/sessionctx" "github.com/pingcap/tidb/pkg/types" "github.com/pingcap/tidb/pkg/util/chunk" "github.com/pingcap/tidb/pkg/util/collate" "github.com/pingcap/tidb/pkg/util/dbterror" + "github.com/pingcap/tidb/pkg/util/hack" ) // Error instances. @@ -134,6 +136,50 @@ func rangePointEqualValueLess(a, b *point) bool { return a.excl && !b.excl } +func pointsConvertToSortKey(sctx sessionctx.Context, inputPs []*point, newTp *types.FieldType) ([]*point, error) { + // Only handle normal string type here. + // Currently, set won't be pushed down and it shouldn't reach here in theory. + // For enum, we have separate logic for it, like handleEnumFromBinOp(). For now, it only supports point range, + // intervals are not supported. So we also don't need to handle enum here. + if newTp.EvalType() != types.ETString || + newTp.GetType() == mysql.TypeEnum || + newTp.GetType() == mysql.TypeSet { + return inputPs, nil + } + ps := make([]*point, 0, len(inputPs)) + for _, p := range inputPs { + np, err := pointConvertToSortKey(sctx, p, newTp, true) + if err != nil { + return nil, err + } + ps = append(ps, np) + } + return ps, nil +} + +func pointConvertToSortKey( + sctx sessionctx.Context, + inputP *point, + newTp *types.FieldType, + trimTrailingSpace bool, +) (*point, error) { + p, err := convertPoint(sctx, inputP, newTp) + if err != nil { + return nil, err + } + if p.value.Kind() != types.KindString || newTp.GetCollate() == charset.CollationBin || !collate.NewCollationEnabled() { + return p, nil + } + sortKey := p.value.GetBytes() + if !trimTrailingSpace { + sortKey = collate.GetCollator(newTp.GetCollate()).KeyWithoutTrimRightSpace(string(hack.String(sortKey))) + } else { + sortKey = collate.GetCollator(newTp.GetCollate()).Key(string(hack.String(sortKey))) + } + + return &point{value: types.NewBytesDatum(sortKey), excl: p.excl, start: p.start}, nil +} + func (r *pointSorter) Swap(i, j int) { r.points[i], r.points[j] = r.points[j], r.points[i] } @@ -182,16 +228,28 @@ func NullRange() Ranges { // builder is the range builder struct. type builder struct { - err error - ctx sessionctx.Context + err error + sctx sessionctx.Context } -func (r *builder) build(expr expression.Expression, collator collate.Collator) []*point { +// build converts Expression on one column into point, which can be further built into Range. +// If the input prefixLen is not types.UnspecifiedLength, it means it's for a prefix column in a prefix index. In such +// cases, we should cut the prefix and adjust the exclusiveness. Ref: cutPrefixForPoints(). +// convertToSortKey indicates whether the string values should be converted to sort key. +// Converting to sort key can make `like` function be built into Range for new collation column. But we can't restore +// the original value from the sort key, so the usage of the result may be limited, like when you need to restore the +// result points back to Expression. +func (r *builder) build( + expr expression.Expression, + newTp *types.FieldType, + prefixLen int, + convertToSortKey bool, +) []*point { switch x := expr.(type) { case *expression.Column: return r.buildFromColumn() case *expression.ScalarFunction: - return r.buildFromScalarFunc(x, collator) + return r.buildFromScalarFunc(x, newTp, prefixLen, convertToSortKey) case *expression.Constant: return r.buildFromConstant(x) } @@ -200,7 +258,7 @@ func (r *builder) build(expr expression.Expression, collator collate.Collator) [ } func (r *builder) buildFromConstant(expr *expression.Constant) []*point { - dt, err := expr.Eval(r.ctx, chunk.Row{}) + dt, err := expr.Eval(r.sctx, chunk.Row{}) if err != nil { r.err = err return nil @@ -209,7 +267,7 @@ func (r *builder) buildFromConstant(expr *expression.Constant) []*point { return nil } - tc := r.ctx.GetSessionVars().StmtCtx.TypeCtx() + tc := r.sctx.GetSessionVars().StmtCtx.TypeCtx() val, err := dt.ToBool(tc) if err != nil { r.err = err @@ -233,7 +291,12 @@ func (*builder) buildFromColumn() []*point { return []*point{startPoint1, endPoint1, startPoint2, endPoint2} } -func (r *builder) buildFromBinOp(expr *expression.ScalarFunction) []*point { +func (r *builder) buildFromBinOp( + expr *expression.ScalarFunction, + newTp *types.FieldType, + prefixLen int, + convertToSortKey bool, +) []*point { // This has been checked that the binary operation is comparison operation, and one of // the operand is column name expression. var ( @@ -243,7 +306,7 @@ func (r *builder) buildFromBinOp(expr *expression.ScalarFunction) []*point { ft *types.FieldType ) - tc := r.ctx.GetSessionVars().StmtCtx.TypeCtx() + tc := r.sctx.GetSessionVars().StmtCtx.TypeCtx() // refineValueAndOp refines the constant datum and operator: // 1. for string type since we may eval the constant to another collation instead of its own collation. // 2. for year type since 2-digit year value need adjustment, see https://dev.mysql.com/doc/refman/5.6/en/year.html @@ -285,7 +348,7 @@ func (r *builder) buildFromBinOp(expr *expression.ScalarFunction) []*point { var ok bool if col, ok = expr.GetArgs()[0].(*expression.Column); ok { ft = col.RetType - value, err = expr.GetArgs()[1].Eval(r.ctx, chunk.Row{}) + value, err = expr.GetArgs()[1].Eval(r.sctx, chunk.Row{}) if err != nil { return nil } @@ -296,7 +359,7 @@ func (r *builder) buildFromBinOp(expr *expression.ScalarFunction) []*point { return nil } ft = col.RetType - value, err = expr.GetArgs()[0].Eval(r.ctx, chunk.Row{}) + value, err = expr.GetArgs()[0].Eval(r.sctx, chunk.Row{}) if err != nil { return nil } @@ -340,40 +403,50 @@ func (r *builder) buildFromBinOp(expr *expression.ScalarFunction) []*point { return handleEnumFromBinOp(tc, ft, value, op) } + var res []*point switch op { case ast.NullEQ: if value.IsNull() { - return []*point{{start: true}, {}} // [null, null] + res = []*point{{start: true}, {}} // [null, null] + break } fallthrough case ast.EQ: startPoint := &point{value: value, start: true} endPoint := &point{value: value} - return []*point{startPoint, endPoint} + res = []*point{startPoint, endPoint} case ast.NE: startPoint1 := &point{value: types.MinNotNullDatum(), start: true} endPoint1 := &point{value: value, excl: true} startPoint2 := &point{value: value, start: true, excl: true} endPoint2 := &point{value: types.MaxValueDatum()} - return []*point{startPoint1, endPoint1, startPoint2, endPoint2} + res = []*point{startPoint1, endPoint1, startPoint2, endPoint2} case ast.LT: startPoint := &point{value: types.MinNotNullDatum(), start: true} endPoint := &point{value: value, excl: true} - return []*point{startPoint, endPoint} + res = []*point{startPoint, endPoint} case ast.LE: startPoint := &point{value: types.MinNotNullDatum(), start: true} endPoint := &point{value: value} - return []*point{startPoint, endPoint} + res = []*point{startPoint, endPoint} case ast.GT: startPoint := &point{value: value, start: true, excl: true} endPoint := &point{value: types.MaxValueDatum()} - return []*point{startPoint, endPoint} + res = []*point{startPoint, endPoint} case ast.GE: startPoint := &point{value: value, start: true} endPoint := &point{value: types.MaxValueDatum()} - return []*point{startPoint, endPoint} + res = []*point{startPoint, endPoint} } - return nil + cutPrefixForPoints(res, prefixLen, ft) + if convertToSortKey { + res, err = pointsConvertToSortKey(r.sctx, res, newTp) + if err != nil { + r.err = err + return getFullRange() + } + } + return res } // handleUnsignedCol handles the case when unsigned column meets negative value. @@ -555,19 +628,25 @@ func (*builder) buildFromIsFalse(_ *expression.ScalarFunction, isNot int) []*poi return []*point{startPoint, endPoint} } -func (r *builder) buildFromIn(expr *expression.ScalarFunction) ([]*point, bool) { +func (r *builder) buildFromIn( + expr *expression.ScalarFunction, + newTp *types.FieldType, + prefixLen int, + convertToSortKey bool, +) ([]*point, bool) { list := expr.GetArgs()[1:] rangePoints := make([]*point, 0, len(list)*2) hasNull := false - colCollate := expr.GetArgs()[0].GetType().GetCollate() - tc := r.ctx.GetSessionVars().StmtCtx.TypeCtx() + ft := expr.GetArgs()[0].GetType() + colCollate := ft.GetCollate() + tc := r.sctx.GetSessionVars().StmtCtx.TypeCtx() for _, e := range list { v, ok := e.(*expression.Constant) if !ok { r.err = ErrUnsupportedType.GenWithStack("expr:%v is not constant", e) return getFullRange(), hasNull } - dt, err := v.Eval(r.ctx, chunk.Row{}) + dt, err := v.Eval(r.sctx, chunk.Row{}) if err != nil { r.err = ErrUnsupportedType.GenWithStack("expr:%v is not evaluated", e) return getFullRange(), hasNull @@ -632,15 +711,30 @@ func (r *builder) buildFromIn(expr *expression.ScalarFunction) ([]*point, bool) if curPos > 0 { curPos++ } - return rangePoints[:curPos], hasNull + rangePoints = rangePoints[:curPos] + cutPrefixForPoints(rangePoints, prefixLen, ft) + var err error + if convertToSortKey { + rangePoints, err = pointsConvertToSortKey(r.sctx, rangePoints, newTp) + if err != nil { + r.err = err + return getFullRange(), false + } + } + return rangePoints, hasNull } -func (r *builder) newBuildFromPatternLike(expr *expression.ScalarFunction) []*point { +func (r *builder) newBuildFromPatternLike( + expr *expression.ScalarFunction, + newTp *types.FieldType, + prefixLen int, + convertToSortKey bool, +) []*point { _, collation := expr.CharsetAndCollation() if !collate.CompatibleCollate(expr.GetArgs()[0].GetType().GetCollate(), collation) { return getFullRange() } - pdt, err := expr.GetArgs()[1].(*expression.Constant).Eval(r.ctx, chunk.Row{}) + pdt, err := expr.GetArgs()[1].(*expression.Constant).Eval(r.sctx, chunk.Row{}) tpOfPattern := expr.GetArgs()[0].GetType() if err != nil { r.err = errors.Trace(err) @@ -651,13 +745,22 @@ func (r *builder) newBuildFromPatternLike(expr *expression.ScalarFunction) []*po r.err = errors.Trace(err) return getFullRange() } + // non-exceptional return case 1: empty pattern if pattern == "" { startPoint := &point{value: types.NewStringDatum(""), start: true} endPoint := &point{value: types.NewStringDatum("")} - return []*point{startPoint, endPoint} + res := []*point{startPoint, endPoint} + if convertToSortKey { + res, err = pointsConvertToSortKey(r.sctx, res, newTp) + if err != nil { + r.err = err + return getFullRange() + } + } + return res } lowValue := make([]byte, 0, len(pattern)) - edt, err := expr.GetArgs()[2].(*expression.Constant).Eval(r.ctx, chunk.Row{}) + edt, err := expr.GetArgs()[2].(*expression.Constant).Eval(r.sctx, chunk.Row{}) if err != nil { r.err = errors.Trace(err) return getFullRange() @@ -681,36 +784,86 @@ func (r *builder) newBuildFromPatternLike(expr *expression.ScalarFunction) []*po break } else if pattern[i] == '_' { // Get the prefix, but exclude the prefix. - // e.g., "abc_x", the start point exclude "abc", - // because the string length is more than 3. - exclude = true + // e.g., "abc_x", the start point excludes "abc" because the string length is more than 3. + // + // However, like the similar check in (*conditionChecker).checkLikeFunc(), in tidb's implementation, for + // PAD SPACE collations, the trailing spaces are removed in the index key. So we are unable to distinguish + // 'xxx' from 'xxx ' by a single index range scan. If we exclude the start point for PAD SPACE collation, + // we will actually miss 'xxx ', which will cause wrong results. + if !isPadSpaceCollation(collation) { + exclude = true + } isExactMatch = false break } lowValue = append(lowValue, pattern[i]) } + // non-exceptional return case 2: no characters before the wildcard if len(lowValue) == 0 { return []*point{{value: types.MinNotNullDatum(), start: true}, {value: types.MaxValueDatum()}} } + // non-exceptional return case 3: pattern contains valid characters and doesn't contain the wildcard if isExactMatch { val := types.NewCollationStringDatum(string(lowValue), tpOfPattern.GetCollate()) - return []*point{{value: val, start: true}, {value: val}} - } - startPoint := &point{start: true, excl: exclude} - startPoint.value.SetBytesAsString(lowValue, tpOfPattern.GetCollate(), uint32(tpOfPattern.GetFlen())) - highValue := make([]byte, len(lowValue)) - copy(highValue, lowValue) - endPoint := &point{excl: true} - for i := len(highValue) - 1; i >= 0; i-- { + startPoint := &point{value: val, start: true} + endPoint := &point{value: val} + res := []*point{startPoint, endPoint} + cutPrefixForPoints(res, prefixLen, tpOfPattern) + if convertToSortKey { + res, err = pointsConvertToSortKey(r.sctx, res, newTp) + if err != nil { + r.err = err + return getFullRange() + } + } + return res + } + + // non-exceptional return case 4: pattern contains valid characters and contains the wildcard + + // non-exceptional return case 4-1 + // If it's not a _bin or binary collation, and we don't convert the value to the sort key, we can't build + // a range for the wildcard. + if !convertToSortKey && + !collate.IsBinCollation(tpOfPattern.GetCollate()) { + return []*point{{value: types.MinNotNullDatum(), start: true}, {value: types.MaxValueDatum()}} + } + + // non-exceptional return case 4-2: build a range for the wildcard + // the end_key is sortKey(start_value) + 1 + originalStartPoint := &point{start: true, excl: exclude} + originalStartPoint.value.SetBytesAsString(lowValue, tpOfPattern.GetCollate(), uint32(tpOfPattern.GetFlen())) + cutPrefixForPoints([]*point{originalStartPoint}, prefixLen, tpOfPattern) + + // If we don't trim the trailing spaces, which means using KeyWithoutTrimRightSpace() instead of Key(), we can build + // a smaller range for better performance, e.g., LIKE ' %'. + // However, if it's a PAD SPACE collation, we must trim the trailing spaces for the start point to ensure the correctness. + // Because the trailing spaces are trimmed in the stored index key. For example, for LIKE 'abc %' on utf8mb4_bin + // column, the start key should be 'abd' instead of 'abc ', but the end key can be 'abc!'. ( ' ' is 32 and '!' is 33 + // in ASCII) + shouldTrimTrailingSpace := isPadSpaceCollation(collation) + startPoint, err := pointConvertToSortKey(r.sctx, originalStartPoint, newTp, shouldTrimTrailingSpace) + if err != nil { + r.err = errors.Trace(err) + return getFullRange() + } + sortKeyPointWithoutTrim, err := pointConvertToSortKey(r.sctx, originalStartPoint, newTp, false) + if err != nil { + r.err = errors.Trace(err) + return getFullRange() + } + sortKeyWithoutTrim := append([]byte{}, sortKeyPointWithoutTrim.value.GetBytes()...) + endPoint := &point{value: types.MaxValueDatum(), excl: true} + for i := len(sortKeyWithoutTrim) - 1; i >= 0; i-- { // Make the end point value more than the start point value, // and the length of the end point value is the same as the length of the start point value. // e.g., the start point value is "abc", so the end point value is "abd". - highValue[i]++ - if highValue[i] != 0 { - endPoint.value.SetBytesAsString(highValue, tpOfPattern.GetCollate(), uint32(tpOfPattern.GetFlen())) + sortKeyWithoutTrim[i]++ + if sortKeyWithoutTrim[i] != 0 { + endPoint.value.SetBytes(sortKeyWithoutTrim) break } - // If highValue[i] is 255 and highValue[i]++ is 0, then the end point value is max value. + // If sortKeyWithoutTrim[i] is 255 and sortKeyWithoutTrim[i]++ is 0, then the end point value is max value. if i == 0 { endPoint.value = types.MaxValueDatum() } @@ -718,7 +871,20 @@ func (r *builder) newBuildFromPatternLike(expr *expression.ScalarFunction) []*po return []*point{startPoint, endPoint} } -func (r *builder) buildFromNot(expr *expression.ScalarFunction) []*point { +// isPadSpaceCollation returns whether the collation is a PAD SPACE collation. +// Since all collations, except for binary, implemented in tidb are PAD SPACE collations for now, we use a simple +// collation != binary check here. We may also move it to collation related packages when NO PAD collations are +// implemented in the future. +func isPadSpaceCollation(collation string) bool { + return collation != charset.CollationBin +} + +func (r *builder) buildFromNot( + expr *expression.ScalarFunction, + newTp *types.FieldType, + prefixLen int, + convertToSortKey bool, +) []*point { switch n := expr.FuncName.L; n { case ast.IsTruthWithoutNull: return r.buildFromIsTrue(expr, 1, false) @@ -731,7 +897,14 @@ func (r *builder) buildFromNot(expr *expression.ScalarFunction) []*point { isUnsignedIntCol bool nonNegativePos int ) - rangePoints, hasNull := r.buildFromIn(expr) + // Note that we must handle the cutting prefix and converting to sort key in buildFromNot, because if we cut the + // prefix inside buildFromIn(), the inversion logic here would make an incomplete and wrong range. + // For example, for index col(1), col NOT IN ('aaa', 'bbb'), if we cut the prefix in buildFromIn(), we would get + // ['a', 'a'], ['b', 'b'] from there. Then after in this function we would get ['' 'a'), ('a', 'b'), ('b', +inf] + // as the result. This is wrong because data like 'ab' would be missed. Actually we are unable to build a range + // for this case. + // So we must cut the prefix in this function, therefore converting to sort key must also be done here. + rangePoints, hasNull := r.buildFromIn(expr, newTp, types.UnspecifiedLength, false) if hasNull { return nil } @@ -757,6 +930,15 @@ func (r *builder) buildFromNot(expr *expression.ScalarFunction) []*point { // Append the interval (last element, max value]. retRangePoints = append(retRangePoints, &point{value: previousValue, start: true, excl: true}) retRangePoints = append(retRangePoints, &point{value: types.MaxValueDatum()}) + cutPrefixForPoints(retRangePoints, prefixLen, expr.GetArgs()[0].GetType()) + if convertToSortKey { + var err error + retRangePoints, err = pointsConvertToSortKey(r.sctx, retRangePoints, newTp) + if err != nil { + r.err = err + return getFullRange() + } + } return retRangePoints case ast.Like: // Pattern not like is not supported. @@ -773,14 +955,27 @@ func (r *builder) buildFromNot(expr *expression.ScalarFunction) []*point { return getFullRange() } -func (r *builder) buildFromScalarFunc(expr *expression.ScalarFunction, collator collate.Collator) []*point { +func (r *builder) buildFromScalarFunc( + expr *expression.ScalarFunction, + newTp *types.FieldType, + prefixLen int, + convertToSortKey bool, +) []*point { switch op := expr.FuncName.L; op { case ast.GE, ast.GT, ast.LT, ast.LE, ast.EQ, ast.NE, ast.NullEQ: - return r.buildFromBinOp(expr) + return r.buildFromBinOp(expr, newTp, prefixLen, convertToSortKey) case ast.LogicAnd: - return r.intersection(r.build(expr.GetArgs()[0], collator), r.build(expr.GetArgs()[1], collator), collator) + collator := collate.GetCollator(newTp.GetCollate()) + if convertToSortKey { + collator = collate.GetCollator(charset.CollationBin) + } + return r.intersection(r.build(expr.GetArgs()[0], newTp, prefixLen, convertToSortKey), r.build(expr.GetArgs()[1], newTp, prefixLen, convertToSortKey), collator) case ast.LogicOr: - return r.union(r.build(expr.GetArgs()[0], collator), r.build(expr.GetArgs()[1], collator), collator) + collator := collate.GetCollator(newTp.GetCollate()) + if convertToSortKey { + collator = collate.GetCollator(charset.CollationBin) + } + return r.union(r.build(expr.GetArgs()[0], newTp, prefixLen, convertToSortKey), r.build(expr.GetArgs()[1], newTp, prefixLen, convertToSortKey), collator) case ast.IsTruthWithoutNull: return r.buildFromIsTrue(expr, 0, false) case ast.IsTruthWithNull: @@ -788,25 +983,31 @@ func (r *builder) buildFromScalarFunc(expr *expression.ScalarFunction, collator case ast.IsFalsity: return r.buildFromIsFalse(expr, 0) case ast.In: - retPoints, _ := r.buildFromIn(expr) + retPoints, _ := r.buildFromIn(expr, newTp, prefixLen, convertToSortKey) return retPoints case ast.Like: - return r.newBuildFromPatternLike(expr) + return r.newBuildFromPatternLike(expr, newTp, prefixLen, convertToSortKey) case ast.IsNull: startPoint := &point{start: true} endPoint := &point{} return []*point{startPoint, endPoint} case ast.UnaryNot: - return r.buildFromNot(expr.GetArgs()[0].(*expression.ScalarFunction)) + return r.buildFromNot(expr.GetArgs()[0].(*expression.ScalarFunction), newTp, prefixLen, convertToSortKey) } return nil } +// We need an input collator because our (*Datum).Compare(), which is used in this method, needs an explicit collator +// input to handle comparison for string and bytes. +// Note that if the points are converted to sort key, the collator should be set to charset.CollationBin. func (r *builder) intersection(a, b []*point, collator collate.Collator) []*point { return r.merge(a, b, false, collator) } +// We need an input collator because our (*Datum).Compare(), which is used in this method, needs an explicit collator +// input to handle comparison for string and bytes. +// Note that if the points are converted to sort key, the collator should be set to charset.CollationBin. func (r *builder) union(a, b []*point, collator collate.Collator) []*point { return r.merge(a, b, true, collator) } @@ -814,7 +1015,7 @@ func (r *builder) union(a, b []*point, collator collate.Collator) []*point { func (r *builder) mergeSorted(a, b []*point, collator collate.Collator) []*point { ret := make([]*point, 0, len(a)+len(b)) i, j := 0, 0 - tc := r.ctx.GetSessionVars().StmtCtx.TypeCtx() + tc := r.sctx.GetSessionVars().StmtCtx.TypeCtx() for i < len(a) && j < len(b) { less, err := rangePointLess(tc, a[i], b[j], collator) if err != nil { diff --git a/pkg/util/ranger/ranger.go b/pkg/util/ranger/ranger.go index 40f1dcf6ca5b5..01a381c5f6b26 100644 --- a/pkg/util/ranger/ranger.go +++ b/pkg/util/ranger/ranger.go @@ -60,13 +60,13 @@ func validInterval(sctx sessionctx.Context, low, high *point) (bool, error) { // convertPoints does some preprocessing on rangePoints to make them ready to build ranges. Preprocessing includes converting // points to the specified type, validating intervals and skipping impossible intervals. -func convertPoints(sctx sessionctx.Context, rangePoints []*point, tp *types.FieldType, skipNull bool, tableRange bool) ([]*point, error) { +func convertPoints(sctx sessionctx.Context, rangePoints []*point, newTp *types.FieldType, skipNull bool, tableRange bool) ([]*point, error) { i := 0 numPoints := len(rangePoints) var minValueDatum, maxValueDatum types.Datum if tableRange { // Currently, table's kv range cannot accept encoded value of MaxValueDatum. we need to convert it. - isUnsigned := mysql.HasUnsignedFlag(tp.GetFlag()) + isUnsigned := mysql.HasUnsignedFlag(newTp.GetFlag()) if isUnsigned { minValueDatum.SetUint64(0) maxValueDatum.SetUint64(math.MaxUint64) @@ -76,7 +76,7 @@ func convertPoints(sctx sessionctx.Context, rangePoints []*point, tp *types.Fiel } } for j := 0; j < numPoints; j += 2 { - startPoint, err := convertPoint(sctx, rangePoints[j], tp) + startPoint, err := convertPoint(sctx, rangePoints[j], newTp) if err != nil { return nil, errors.Trace(err) } @@ -88,7 +88,7 @@ func convertPoints(sctx sessionctx.Context, rangePoints []*point, tp *types.Fiel startPoint.value = minValueDatum } } - endPoint, err := convertPoint(sctx, rangePoints[j+1], tp) + endPoint, err := convertPoint(sctx, rangePoints[j+1], newTp) if err != nil { return nil, errors.Trace(err) } @@ -124,15 +124,15 @@ func estimateMemUsageForPoints2Ranges(rangePoints []*point) int64 { // Only one column is built there. If there're multiple columns, use appendPoints2Ranges. // rangeMaxSize is the max memory limit for ranges. O indicates no memory limit. // If the second return value is true, it means that the estimated memory usage of ranges exceeds rangeMaxSize and it falls back to full range. -func points2Ranges(sctx sessionctx.Context, rangePoints []*point, tp *types.FieldType, rangeMaxSize int64) (Ranges, bool, error) { - convertedPoints, err := convertPoints(sctx, rangePoints, tp, mysql.HasNotNullFlag(tp.GetFlag()), false) +func points2Ranges(sctx sessionctx.Context, rangePoints []*point, newTp *types.FieldType, rangeMaxSize int64) (Ranges, bool, error) { + convertedPoints, err := convertPoints(sctx, rangePoints, newTp, mysql.HasNotNullFlag(newTp.GetFlag()), false) if err != nil { return nil, false, errors.Trace(err) } // Estimate whether rangeMaxSize will be exceeded first before converting points to ranges. if rangeMaxSize > 0 && estimateMemUsageForPoints2Ranges(convertedPoints) > rangeMaxSize { var fullRange Ranges - if mysql.HasNotNullFlag(tp.GetFlag()) { + if mysql.HasNotNullFlag(newTp.GetFlag()) { fullRange = FullNotNullRange() } else { fullRange = FullRange() @@ -147,46 +147,46 @@ func points2Ranges(sctx sessionctx.Context, rangePoints []*point, tp *types.Fiel LowExclude: startPoint.excl, HighVal: []types.Datum{endPoint.value}, HighExclude: endPoint.excl, - Collators: []collate.Collator{collate.GetCollator(tp.GetCollate())}, + Collators: []collate.Collator{collate.GetCollator(newTp.GetCollate())}, } ranges = append(ranges, ran) } return ranges, false, nil } -func convertPoint(sctx sessionctx.Context, point *point, tp *types.FieldType) (*point, error) { +func convertPoint(sctx sessionctx.Context, point *point, newTp *types.FieldType) (*point, error) { sc := sctx.GetSessionVars().StmtCtx switch point.value.Kind() { case types.KindMaxValue, types.KindMinNotNull: return point, nil } - casted, err := point.value.ConvertTo(sc.TypeCtx(), tp) + casted, err := point.value.ConvertTo(sc.TypeCtx(), newTp) if err != nil { if sctx.GetSessionVars().StmtCtx.InPreparedPlanBuilding { // skip plan cache in this case for safety. sctx.GetSessionVars().StmtCtx.SetSkipPlanCache(errors.Errorf("%s when converting %v", err.Error(), point.value)) } //revive:disable:empty-block - if tp.GetType() == mysql.TypeYear && terror.ErrorEqual(err, types.ErrWarnDataOutOfRange) { + if newTp.GetType() == mysql.TypeYear && terror.ErrorEqual(err, types.ErrWarnDataOutOfRange) { // see issue #20101: overflow when converting integer to year - } else if tp.GetType() == mysql.TypeBit && terror.ErrorEqual(err, types.ErrDataTooLong) { + } else if newTp.GetType() == mysql.TypeBit && terror.ErrorEqual(err, types.ErrDataTooLong) { // see issue #19067: we should ignore the types.ErrDataTooLong when we convert value to TypeBit value - } else if tp.GetType() == mysql.TypeNewDecimal && terror.ErrorEqual(err, types.ErrOverflow) { + } else if newTp.GetType() == mysql.TypeNewDecimal && terror.ErrorEqual(err, types.ErrOverflow) { // Ignore the types.ErrOverflow when we convert TypeNewDecimal values. // A trimmed valid boundary point value would be returned then. Accordingly, the `excl` of the point // would be adjusted. Impossible ranges would be skipped by the `validInterval` call later. - } else if point.value.Kind() == types.KindMysqlTime && tp.GetType() == mysql.TypeTimestamp && terror.ErrorEqual(err, types.ErrWrongValue) { + } else if point.value.Kind() == types.KindMysqlTime && newTp.GetType() == mysql.TypeTimestamp && terror.ErrorEqual(err, types.ErrWrongValue) { // See issue #28424: query failed after add index // Ignore conversion from Date[Time] to Timestamp since it must be either out of range or impossible date, which will not match a point select - } else if tp.GetType() == mysql.TypeEnum && terror.ErrorEqual(err, types.ErrTruncated) { + } else if newTp.GetType() == mysql.TypeEnum && terror.ErrorEqual(err, types.ErrTruncated) { // Ignore the types.ErrorTruncated when we convert TypeEnum values. // We should cover Enum upper overflow, and convert to the biggest value. if point.value.GetInt64() > 0 { - upperEnum, err := types.ParseEnumValue(tp.GetElems(), uint64(len(tp.GetElems()))) + upperEnum, err := types.ParseEnumValue(newTp.GetElems(), uint64(len(newTp.GetElems()))) if err != nil { return nil, err } - casted.SetMysqlEnum(upperEnum, tp.GetCollate()) + casted.SetMysqlEnum(upperEnum, newTp.GetCollate()) } } else if terror.ErrorEqual(err, charset.ErrInvalidCharacterString) { // The invalid string can be produced by changing datum's underlying bytes directly. @@ -198,7 +198,7 @@ func convertPoint(sctx sessionctx.Context, point *point, tp *types.FieldType) (* } //revive:enable:empty-block } - valCmpCasted, err := point.value.Compare(sc.TypeCtx(), &casted, collate.GetCollator(tp.GetCollate())) + valCmpCasted, err := point.value.Compare(sc.TypeCtx(), &casted, collate.GetCollator(newTp.GetCollate())) if err != nil { return point, errors.Trace(err) } @@ -272,8 +272,8 @@ func estimateMemUsageForAppendPoints2Ranges(origin Ranges, rangePoints []*point) // If the second return value is true, it means that the estimated memory usage of ranges after appending points exceeds // rangeMaxSize and the function rejects appending points to ranges. func appendPoints2Ranges(sctx sessionctx.Context, origin Ranges, rangePoints []*point, - ft *types.FieldType, rangeMaxSize int64) (Ranges, bool, error) { - convertedPoints, err := convertPoints(sctx, rangePoints, ft, false, false) + newTp *types.FieldType, rangeMaxSize int64) (Ranges, bool, error) { + convertedPoints, err := convertPoints(sctx, rangePoints, newTp, false, false) if err != nil { return nil, false, errors.Trace(err) } @@ -287,7 +287,7 @@ func appendPoints2Ranges(sctx sessionctx.Context, origin Ranges, rangePoints []* if !oRange.IsPoint(sctx) { newIndexRanges = append(newIndexRanges, oRange) } else { - newRanges, err := appendPoints2IndexRange(oRange, convertedPoints, ft) + newRanges, err := appendPoints2IndexRange(oRange, convertedPoints, newTp) if err != nil { return nil, false, errors.Trace(err) } @@ -384,13 +384,13 @@ func AppendRanges2PointRanges(pointRanges Ranges, ranges Ranges, rangeMaxSize in // It will remove the nil and convert MinNotNull and MaxValue to MinInt64 or MinUint64 and MaxInt64 or MaxUint64. // rangeMaxSize is the max memory limit for ranges. O indicates no memory limit. // If the second return value is true, it means that the estimated memory usage of ranges exceeds rangeMaxSize and it falls back to full range. -func points2TableRanges(sctx sessionctx.Context, rangePoints []*point, tp *types.FieldType, rangeMaxSize int64) (Ranges, bool, error) { - convertedPoints, err := convertPoints(sctx, rangePoints, tp, true, true) +func points2TableRanges(sctx sessionctx.Context, rangePoints []*point, newTp *types.FieldType, rangeMaxSize int64) (Ranges, bool, error) { + convertedPoints, err := convertPoints(sctx, rangePoints, newTp, true, true) if err != nil { return nil, false, errors.Trace(err) } if rangeMaxSize > 0 && estimateMemUsageForPoints2Ranges(convertedPoints) > rangeMaxSize { - return FullIntRange(mysql.HasUnsignedFlag(tp.GetFlag())), true, nil + return FullIntRange(mysql.HasUnsignedFlag(newTp.GetFlag())), true, nil } ranges := make(Ranges, 0, len(convertedPoints)/2) for i := 0; i < len(convertedPoints); i += 2 { @@ -400,7 +400,7 @@ func points2TableRanges(sctx sessionctx.Context, rangePoints []*point, tp *types LowExclude: startPoint.excl, HighVal: []types.Datum{endPoint.value}, HighExclude: endPoint.excl, - Collators: []collate.Collator{collate.GetCollator(tp.GetCollate())}, + Collators: []collate.Collator{collate.GetCollator(newTp.GetCollate())}, } ranges = append(ranges, ran) } @@ -412,11 +412,12 @@ func points2TableRanges(sctx sessionctx.Context, rangePoints []*point, tp *types // The second return value is the conditions used to build ranges and the third return value is the remained conditions. func buildColumnRange(accessConditions []expression.Expression, sctx sessionctx.Context, tp *types.FieldType, tableRange bool, colLen int, rangeMaxSize int64) (Ranges, []expression.Expression, []expression.Expression, error) { - rb := builder{ctx: sctx} + rb := builder{sctx: sctx} + newTp := newFieldType(tp) rangePoints := getFullRange() for _, cond := range accessConditions { - collator := collate.GetCollator(tp.GetCollate()) - rangePoints = rb.intersection(rangePoints, rb.build(cond, collator), collator) + collator := collate.GetCollator(charset.CollationBin) + rangePoints = rb.intersection(rangePoints, rb.build(cond, newTp, colLen, true), collator) if rb.err != nil { return nil, nil, nil, errors.Trace(rb.err) } @@ -426,7 +427,7 @@ func buildColumnRange(accessConditions []expression.Expression, sctx sessionctx. rangeFallback bool err error ) - newTp := newFieldType(tp) + newTp = convertStringFTToBinaryCollate(newTp) if tableRange { ranges, rangeFallback, err = points2TableRanges(sctx, rangePoints, newTp, rangeMaxSize) } else { @@ -440,17 +441,6 @@ func buildColumnRange(accessConditions []expression.Expression, sctx sessionctx. return ranges, nil, accessConditions, nil } if colLen != types.UnspecifiedLength { - for _, ran := range ranges { - // If the length of the last column of LowVal is equal to the prefix length, LowExclude should be set false. - // For example, `col_varchar > 'xx'` should be converted to range [xx, +inf) when the prefix index length of - // `col_varchar` is 2. Otherwise we would miss values like 'xxx' if we execute (xx, +inf) index range scan. - if CutDatumByPrefixLen(&ran.LowVal[0], colLen, tp) || ReachPrefixLen(&ran.LowVal[0], colLen, tp) { - ran.LowExclude = false - } - if CutDatumByPrefixLen(&ran.HighVal[0], colLen, tp) { - ran.HighExclude = false - } - } ranges, err = UnionRanges(sctx, ranges, true) if err != nil { return nil, nil, nil, err @@ -486,7 +476,7 @@ func BuildColumnRange(conds []expression.Expression, sctx sessionctx.Context, tp func (d *rangeDetacher) buildRangeOnColsByCNFCond(newTp []*types.FieldType, eqAndInCount int, accessConds []expression.Expression) (Ranges, []expression.Expression, []expression.Expression, error) { - rb := builder{ctx: d.sctx} + rb := builder{sctx: d.sctx} var ( ranges Ranges rangeFallback bool @@ -494,14 +484,15 @@ func (d *rangeDetacher) buildRangeOnColsByCNFCond(newTp []*types.FieldType, eqAn ) for i := 0; i < eqAndInCount; i++ { // Build ranges for equal or in access conditions. - point := rb.build(accessConds[i], collate.GetCollator(newTp[i].GetCollate())) + point := rb.build(accessConds[i], newTp[i], d.lengths[i], d.convertToSortKey) if rb.err != nil { return nil, nil, nil, errors.Trace(rb.err) } + tmpNewTp := convertStringFTToBinaryCollate(newTp[i]) if i == 0 { - ranges, rangeFallback, err = points2Ranges(d.sctx, point, newTp[i], d.rangeMaxSize) + ranges, rangeFallback, err = points2Ranges(d.sctx, point, tmpNewTp, d.rangeMaxSize) } else { - ranges, rangeFallback, err = appendPoints2Ranges(d.sctx, ranges, point, newTp[i], d.rangeMaxSize) + ranges, rangeFallback, err = appendPoints2Ranges(d.sctx, ranges, point, tmpNewTp, d.rangeMaxSize) } if err != nil { return nil, nil, nil, errors.Trace(err) @@ -515,15 +506,26 @@ func (d *rangeDetacher) buildRangeOnColsByCNFCond(newTp []*types.FieldType, eqAn // Build rangePoints for non-equal access conditions. for i := eqAndInCount; i < len(accessConds); i++ { collator := collate.GetCollator(newTp[eqAndInCount].GetCollate()) - rangePoints = rb.intersection(rangePoints, rb.build(accessConds[i], collator), collator) + if d.convertToSortKey { + collator = collate.GetCollator(charset.CollationBin) + } + rangePoints = rb.intersection(rangePoints, rb.build(accessConds[i], newTp[eqAndInCount], d.lengths[eqAndInCount], d.convertToSortKey), collator) if rb.err != nil { return nil, nil, nil, errors.Trace(rb.err) } } + var tmpNewTp *types.FieldType + if eqAndInCount == 0 || eqAndInCount < len(accessConds) { + if d.convertToSortKey { + tmpNewTp = convertStringFTToBinaryCollate(newTp[eqAndInCount]) + } else { + tmpNewTp = newTp[eqAndInCount] + } + } if eqAndInCount == 0 { - ranges, rangeFallback, err = points2Ranges(d.sctx, rangePoints, newTp[0], d.rangeMaxSize) + ranges, rangeFallback, err = points2Ranges(d.sctx, rangePoints, tmpNewTp, d.rangeMaxSize) } else if eqAndInCount < len(accessConds) { - ranges, rangeFallback, err = appendPoints2Ranges(d.sctx, ranges, rangePoints, newTp[eqAndInCount], d.rangeMaxSize) + ranges, rangeFallback, err = appendPoints2Ranges(d.sctx, ranges, rangePoints, tmpNewTp, d.rangeMaxSize) } if err != nil { return nil, nil, nil, errors.Trace(err) @@ -535,6 +537,18 @@ func (d *rangeDetacher) buildRangeOnColsByCNFCond(newTp []*types.FieldType, eqAn return ranges, accessConds, nil, nil } +func convertStringFTToBinaryCollate(ft *types.FieldType) *types.FieldType { + if ft.EvalType() != types.ETString || + ft.GetType() == mysql.TypeEnum || + ft.GetType() == mysql.TypeSet { + return ft + } + newTp := ft.Clone() + newTp.SetCharset(charset.CharsetBin) + newTp.SetCollate(charset.CollationBin) + return newTp +} + // buildCNFIndexRange builds the range for index where the top layer is CNF. func (d *rangeDetacher) buildCNFIndexRange(newTp []*types.FieldType, eqAndInCount int, accessConds []expression.Expression) (Ranges, []expression.Expression, []expression.Expression, error) { @@ -545,11 +559,9 @@ func (d *rangeDetacher) buildCNFIndexRange(newTp []*types.FieldType, eqAndInCoun // Take prefix index into consideration. if hasPrefix(d.lengths) { - if fixPrefixColRange(ranges, d.lengths, newTp) { - ranges, err = UnionRanges(d.sctx, ranges, d.mergeConsecutive) - if err != nil { - return nil, nil, nil, errors.Trace(err) - } + ranges, err = UnionRanges(d.sctx, ranges, d.mergeConsecutive) + if err != nil { + return nil, nil, nil, errors.Trace(err) } } @@ -622,47 +634,28 @@ func hasPrefix(lengths []int) bool { return false } -// fixPrefixColRange checks whether the range of one column exceeds the length and needs to be cut. -// It specially handles the last column of each range point. If the last one need to be cut, it will -// change the exclude status of that point and return `true` to tell -// that we need do a range merging since that interval may have intersection. -// e.g. if the interval is (-inf -inf, a xxxxx), (a xxxxx, +inf +inf) and the length of the last column is 3, -// -// then we'll change it to (-inf -inf, a xxx], [a xxx, +inf +inf). You can see that this two interval intersect, -// so we need a merge operation. -// -// Q: only checking the last column to decide whether the endpoint's exclude status needs to be reset is enough? -// A: Yes, suppose that the interval is (-inf -inf, a xxxxx b) and only the second column needs to be cut. -// -// The result would be (-inf -inf, a xxx b) if the length of it is 3. Obviously we only need to care about the data -// whose the first two key is `a` and `xxx`. It read all data whose index value begins with `a` and `xxx` and the third -// value less than `b`, covering the values begin with `a` and `xxxxx` and the third value less than `b` perfectly. -// So in this case we don't need to reset its exclude status. The right endpoint case can be proved in the same way. -func fixPrefixColRange(ranges Ranges, lengths []int, tp []*types.FieldType) bool { - var hasCut bool - for _, ran := range ranges { - lowTail := len(ran.LowVal) - 1 - for i := 0; i < lowTail; i++ { - hasCut = CutDatumByPrefixLen(&ran.LowVal[i], lengths[i], tp[i]) || hasCut - } - lowCut := CutDatumByPrefixLen(&ran.LowVal[lowTail], lengths[lowTail], tp[lowTail]) - // If the length of the last column of LowVal is equal to the prefix length, LowExclude should be set false. - // For example, `col_varchar > 'xx'` should be converted to range [xx, +inf) when the prefix index length of - // `col_varchar` is 2. Otherwise we would miss values like 'xxx' if we execute (xx, +inf) index range scan. - if lowCut || ReachPrefixLen(&ran.LowVal[lowTail], lengths[lowTail], tp[lowTail]) { - ran.LowExclude = false - } - highTail := len(ran.HighVal) - 1 - for i := 0; i < highTail; i++ { - hasCut = CutDatumByPrefixLen(&ran.HighVal[i], lengths[i], tp[i]) || hasCut +// cutPrefixForPoints cuts the prefix of points according to the prefix length of the prefix index. +// It may modify the point.value and point.excl. The modification is in-place. +// This function doesn't require the start and end points to be paired in the input. +func cutPrefixForPoints(points []*point, length int, tp *types.FieldType) { + if length == types.UnspecifiedLength { + return + } + for _, p := range points { + if p == nil { + continue } - highCut := CutDatumByPrefixLen(&ran.HighVal[highTail], lengths[highTail], tp[highTail]) - if highCut { - ran.HighExclude = false + cut := CutDatumByPrefixLen(&p.value, length, tp) + // In two cases, we need to convert the exclusive point to an inclusive point. + // case 1: we actually cut the value to accommodate the prefix index. + if cut || + // case 2: the value is already equal to the prefix index. + // For example, col_varchar > 'xx' should be converted to range [xx, +inf) when the prefix index length of + // `col_varchar` is 2. Otherwise, we would miss values like 'xxx' if we execute (xx, +inf) index range scan. + (p.start && ReachPrefixLen(&p.value, length, tp)) { + p.excl = false } - hasCut = hasCut || lowCut || highCut } - return hasCut } // CutDatumByPrefixLen cuts the datum according to the prefix length. @@ -705,8 +698,10 @@ func ReachPrefixLen(v *types.Datum, length int, tp *types.FieldType) bool { return false } -// We cannot use the FieldType of column directly. e.g. the column a is int32 and we have a > 1111111111111111111. +// In util/ranger, for each datum that is used in the Range, we will convert data type for them. +// But we cannot use the FieldType of column directly. e.g. the column a is int32 and we have a > 1111111111111111111. // Obviously the constant is bigger than MaxInt32, so we will get overflow error if we use the FieldType of column a. +// In util/ranger here, we usually use "newTp" to emphasize its difference from the original FieldType of the column. func newFieldType(tp *types.FieldType) *types.FieldType { switch tp.GetType() { // To avoid overflow error. diff --git a/pkg/util/ranger/ranger_test.go b/pkg/util/ranger/ranger_test.go index ce519eb053ce9..3e1575e92c83b 100644 --- a/pkg/util/ranger/ranger_test.go +++ b/pkg/util/ranger/ranger_test.go @@ -1106,7 +1106,7 @@ create table t( indexPos: 0, exprStr: `a LIKE 'abc%'`, accessConds: `[like(test.t.a, abc%, 92)]`, - filterConds: "[]", + filterConds: "[like(test.t.a, abc%, 92)]", resultStr: "[[\"abc\",\"abd\")]", }, { @@ -1114,20 +1114,20 @@ create table t( exprStr: "a LIKE 'abc_'", accessConds: "[like(test.t.a, abc_, 92)]", filterConds: "[like(test.t.a, abc_, 92)]", - resultStr: "[(\"abc\",\"abd\")]", + resultStr: "[[\"abc\",\"abd\")]", }, { indexPos: 0, exprStr: "a LIKE 'abc'", accessConds: "[like(test.t.a, abc, 92)]", - filterConds: "[]", + filterConds: "[like(test.t.a, abc, 92)]", resultStr: "[[\"abc\",\"abc\"]]", }, { indexPos: 0, exprStr: `a LIKE "ab\_c"`, accessConds: "[like(test.t.a, ab\\_c, 92)]", - filterConds: "[]", + filterConds: "[like(test.t.a, ab\\_c, 92)]", resultStr: "[[\"ab_c\",\"ab_c\"]]", }, { @@ -1141,21 +1141,21 @@ create table t( indexPos: 0, exprStr: `a LIKE '\%a'`, accessConds: "[like(test.t.a, \\%a, 92)]", - filterConds: "[]", + filterConds: "[like(test.t.a, \\%a, 92)]", resultStr: `[["%a","%a"]]`, }, { indexPos: 0, exprStr: `a LIKE "\\"`, accessConds: "[like(test.t.a, \\, 92)]", - filterConds: "[]", + filterConds: "[like(test.t.a, \\, 92)]", resultStr: "[[\"\\\\\",\"\\\\\"]]", }, { indexPos: 0, exprStr: `a LIKE "\\\\a%"`, accessConds: `[like(test.t.a, \\a%, 92)]`, - filterConds: "[]", + filterConds: "[like(test.t.a, \\\\a%, 92)]", resultStr: "[[\"\\\\a\",\"\\\\b\")]", }, { @@ -1303,7 +1303,7 @@ create table t( exprStr: `e = "你好啊"`, accessConds: "[eq(test.t.e, 你好啊)]", filterConds: "[eq(test.t.e, 你好啊)]", - resultStr: "[[0xE4BD,0xE4BD]]", + resultStr: "[[\"\\xe4\\xbd\",\"\\xe4\\xbd\"]]", }, { indexPos: 2, @@ -1338,21 +1338,21 @@ create table t( exprStr: "f >= 'a' and f <= 'B'", accessConds: "[ge(test.t.f, a) le(test.t.f, B)]", filterConds: "[]", - resultStr: "[[\"a\",\"B\"]]", + resultStr: "[[\"\\x00A\",\"\\x00B\"]]", }, { indexPos: 4, exprStr: "f in ('a', 'B')", accessConds: "[in(test.t.f, a, B)]", filterConds: "[]", - resultStr: "[[\"a\",\"a\"] [\"B\",\"B\"]]", + resultStr: "[[\"\\x00A\",\"\\x00A\"] [\"\\x00B\",\"\\x00B\"]]", }, { indexPos: 4, exprStr: "f = 'a' and f = 'B' collate utf8mb4_bin", accessConds: "[eq(test.t.f, a)]", filterConds: "[eq(test.t.f, B)]", - resultStr: "[[\"a\",\"a\"]]", + resultStr: "[[\"\\x00A\",\"\\x00A\"]]", }, { indexPos: 4, @@ -1366,7 +1366,7 @@ create table t( exprStr: "d in ('aab', 'aac') and e = 'a'", accessConds: "[in(test.t.d, aab, aac) eq(test.t.e, a)]", filterConds: "[in(test.t.d, aab, aac)]", - resultStr: "[[\"aa\" 0x61,\"aa\" 0x61]]", + resultStr: "[[\"aa\" \"a\",\"aa\" \"a\"]]", }, { indexPos: 6, diff --git a/pkg/util/ranger/types.go b/pkg/util/ranger/types.go index 1ca9df2c7fb0f..f6eee7abdf774 100644 --- a/pkg/util/ranger/types.go +++ b/pkg/util/ranger/types.go @@ -271,7 +271,7 @@ func formatDatum(d types.Datum, isLeftSide bool) string { return "+inf" } case types.KindBytes: - return fmt.Sprintf("0x%X", d.GetValue()) + return fmt.Sprintf("%q", d.GetValue()) case types.KindString: return fmt.Sprintf("%q", d.GetValue()) case types.KindMysqlEnum, types.KindMysqlSet, diff --git a/pkg/util/resourcegrouptag/main_test.go b/pkg/util/resourcegrouptag/main_test.go index ca0858b62b118..f770ff4442f57 100644 --- a/pkg/util/resourcegrouptag/main_test.go +++ b/pkg/util/resourcegrouptag/main_test.go @@ -25,6 +25,7 @@ func TestMain(m *testing.M) { testsetup.SetupForCommonTest() opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), } diff --git a/pkg/util/rowDecoder/main_test.go b/pkg/util/rowDecoder/main_test.go index 0318dea55610b..e512b8f14e8b7 100644 --- a/pkg/util/rowDecoder/main_test.go +++ b/pkg/util/rowDecoder/main_test.go @@ -24,6 +24,7 @@ import ( func TestMain(m *testing.M) { opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), } diff --git a/pkg/util/rowcodec/decoder.go b/pkg/util/rowcodec/decoder.go index ee33bce2acb3a..13dd0820faea6 100644 --- a/pkg/util/rowcodec/decoder.go +++ b/pkg/util/rowcodec/decoder.go @@ -389,7 +389,7 @@ func (decoder *BytesDecoder) decodeToBytesInternal(outputOffset map[int64]int, h values := make([][]byte, len(outputOffset)) for i := range decoder.columns { col := &decoder.columns[i] - tp := fieldType2Flag(col.Ft.GetType(), col.Ft.GetFlag()&mysql.UnsignedFlag == 0) + tp := fieldType2Flag(col.Ft.ArrayType().GetType(), col.Ft.GetFlag()&mysql.UnsignedFlag == 0) colID := col.ID offset := outputOffset[colID] idx, isNil, notFound := r.findColID(colID) diff --git a/pkg/util/rowcodec/main_test.go b/pkg/util/rowcodec/main_test.go index a59f3a2efe399..1adcedc7638df 100644 --- a/pkg/util/rowcodec/main_test.go +++ b/pkg/util/rowcodec/main_test.go @@ -28,6 +28,7 @@ func TestMain(m *testing.M) { testsetup.SetupForCommonTest() opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), } diff --git a/pkg/util/security.go b/pkg/util/security.go index a2b5c9470bc02..ccdf1edc02694 100644 --- a/pkg/util/security.go +++ b/pkg/util/security.go @@ -94,7 +94,7 @@ func ToTLSConfigWithVerify(caPath, certPath, keyPath string, verifyCN []string) } /* #nosec G402 */ tlsCfg := &tls.Config{ - MinVersion: tls.VersionTLS10, + MinVersion: tls.VersionTLS12, Certificates: certificates, RootCAs: certPool, ClientCAs: certPool, @@ -183,7 +183,7 @@ func NewTLSConfig(opts ...TLSConfigOption) (*tls.Config, error) { /* #nosec G402 */ tlsCfg := &tls.Config{ - MinVersion: tls.VersionTLS10, + MinVersion: tls.VersionTLS12, InsecureSkipVerify: true, NextProtos: []string{"h2", "http/1.2"}, // specify `h2` to let Go use HTTP/2. } diff --git a/pkg/util/security_test.go b/pkg/util/security_test.go index e34d8420487b6..92af20563ce36 100644 --- a/pkg/util/security_test.go +++ b/pkg/util/security_test.go @@ -75,14 +75,13 @@ func TestVerifyCommonNameAndRotate(t *testing.T) { util.WithVerifyCommonName([]string{"client1"}), ) require.NoError(t, err) - port := 9292 - url := fmt.Sprintf("https://127.0.0.1:%d", port) ctx, cancel := context.WithCancel(context.Background()) - server := runServer(ctx, serverTLS, port, t) + server, port := runServer(ctx, serverTLS, t) defer func() { cancel() server.Close() }() + url := fmt.Sprintf("https://127.0.0.1:%d", port) clientTLS1, err := util.NewTLSConfig( util.WithCAContent(caData), @@ -131,6 +130,53 @@ func TestVerifyCommonNameAndRotate(t *testing.T) { require.NoError(t, resp.Body.Close()) } +func TestTLSVersion(t *testing.T) { + caData, certs, keys := generateCerts(t, []string{"server", "client"}) + serverCert, serverKey := certs[0], keys[0] + clientCert, clientKey := certs[1], keys[1] + + serverTLS, err := util.NewTLSConfig( + util.WithCAContent(caData), + util.WithCertAndKeyContent(serverCert, serverKey), + ) + require.NoError(t, err) + ctx, cancel := context.WithCancel(context.Background()) + server, port := runServer(ctx, serverTLS, t) + defer func() { + cancel() + server.Close() + }() + url := fmt.Sprintf("https://127.0.0.1:%d", port) + + clientTLS1, err := util.NewTLSConfig( + util.WithCAContent(caData), + util.WithCertAndKeyContent(clientCert, clientKey), + ) + require.NoError(t, err) + + type testCase struct { + version uint16 + succ bool + } + testCases := []testCase{ + {tls.VersionTLS10, false}, + {tls.VersionTLS11, false}, + {tls.VersionTLS12, true}, + {tls.VersionTLS13, true}, + } + for _, c := range testCases { + clientTLS1.MinVersion = c.version + clientTLS1.MaxVersion = c.version + resp, err := util.ClientWithTLS(clientTLS1).Get(url) + if c.succ { + require.NoError(t, err) + require.NoError(t, resp.Body.Close()) + } else { + require.Error(t, err) + } + } +} + func TestCA(t *testing.T) { caData, certs, keys := generateCerts(t, []string{"server", "client"}) serverCert, serverKey := certs[0], keys[0] @@ -143,14 +189,13 @@ func TestCA(t *testing.T) { util.WithCertAndKeyContent(serverCert, serverKey), ) require.NoError(t, err) - port := 9293 - url := fmt.Sprintf("https://127.0.0.1:%d", port) ctx, cancel := context.WithCancel(context.Background()) - server := runServer(ctx, serverTLS, port, t) + server, port := runServer(ctx, serverTLS, t) defer func() { cancel() server.Close() }() + url := fmt.Sprintf("https://127.0.0.1:%d", port) // test only CA clientTLS1, err := util.NewTLSConfig( @@ -202,18 +247,19 @@ func handler(w http.ResponseWriter, req *http.Request) { w.Write([]byte("This an example server")) } -func runServer(ctx context.Context, tlsCfg *tls.Config, port int, t *testing.T) *http.Server { +func runServer(ctx context.Context, tlsCfg *tls.Config, t *testing.T) (*http.Server, int) { http.HandleFunc("/", handler) - server := &http.Server{Addr: fmt.Sprintf(":%d", port), Handler: nil} + server := &http.Server{Addr: ":0", Handler: nil} conn, err := net.Listen("tcp", server.Addr) if err != nil { require.NoError(t, err) } + port := conn.Addr().(*net.TCPAddr).Port tlsListener := tls.NewListener(conn, tlsCfg) go server.Serve(tlsListener) - return server + return server, port } // generateCerts returns the PEM contents of a CA certificate and some certificates and private keys per Common Name in diff --git a/pkg/util/selection/main_test.go b/pkg/util/selection/main_test.go index c8b0050402311..daf113f2e0fda 100644 --- a/pkg/util/selection/main_test.go +++ b/pkg/util/selection/main_test.go @@ -25,6 +25,7 @@ func TestMain(m *testing.M) { testsetup.SetupForCommonTest() opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), } diff --git a/pkg/util/sem/main_test.go b/pkg/util/sem/main_test.go index 5bb48dd2b821b..919c79fb74e7b 100644 --- a/pkg/util/sem/main_test.go +++ b/pkg/util/sem/main_test.go @@ -25,6 +25,7 @@ func TestMain(m *testing.M) { testsetup.SetupForCommonTest() opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), diff --git a/pkg/util/serialization/BUILD.bazel b/pkg/util/serialization/BUILD.bazel new file mode 100644 index 0000000000000..eafb5e533a4a7 --- /dev/null +++ b/pkg/util/serialization/BUILD.bazel @@ -0,0 +1,18 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library") + +go_library( + name = "serialization", + srcs = [ + "common_util.go", + "deserialization_util.go", + "serialization_util.go", + ], + importpath = "github.com/pingcap/tidb/pkg/util/serialization", + visibility = ["//visibility:public"], + deps = [ + "//pkg/parser/mysql", + "//pkg/types", + "//pkg/util/chunk", + "//pkg/util/dbterror", + ], +) diff --git a/pkg/util/serialization/common_util.go b/pkg/util/serialization/common_util.go new file mode 100644 index 0000000000000..a9b315e93a162 --- /dev/null +++ b/pkg/util/serialization/common_util.go @@ -0,0 +1,58 @@ +// Copyright 2023 PingCAP, 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. + +package serialization + +import ( + "time" + "unsafe" + + "github.com/pingcap/tidb/pkg/parser/mysql" + "github.com/pingcap/tidb/pkg/types" + "github.com/pingcap/tidb/pkg/util/dbterror" +) + +var ( + // ErrInternal is an error for spill + ErrInternal = dbterror.ClassOptimizer.NewStd(mysql.ErrInternal) +) + +// These types are used for serializing or deserializing interface type +const ( + BoolType = iota + Int64Type + Uint64Type + FloatType + StringType + BinaryJSONType + OpaqueType + TimeType + DurationType + + InterfaceTypeCodeLen = int64(1) + JSONTypeCodeLen = int64(types.JSONTypeCode(1)) + BoolLen = int64(unsafe.Sizeof(true)) + ByteLen = int64(unsafe.Sizeof(byte(0))) + Int8Len = int64(unsafe.Sizeof(int8(0))) + Uint8Len = int64(unsafe.Sizeof(uint8(0))) + IntLen = int64(unsafe.Sizeof(int(0))) + Int32Len = int64(unsafe.Sizeof(int32(0))) + Uint32Len = int64(unsafe.Sizeof(uint32(0))) + Int64Len = int64(unsafe.Sizeof(int64(0))) + Uint64Len = int64(unsafe.Sizeof(uint64(0))) + Float32Len = int64(unsafe.Sizeof(float32(0))) + Float64Len = int64(unsafe.Sizeof(float64(0))) + TimeLen = int64(unsafe.Sizeof(types.Time{})) + TimeDurationLen = int64(unsafe.Sizeof(time.Duration(0))) +) diff --git a/pkg/util/serialization/deserialization_util.go b/pkg/util/serialization/deserialization_util.go new file mode 100644 index 0000000000000..328e4b44e662b --- /dev/null +++ b/pkg/util/serialization/deserialization_util.go @@ -0,0 +1,236 @@ +// Copyright 2023 PingCAP, 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. + +package serialization + +import ( + "bytes" + "time" + "unsafe" + + "github.com/pingcap/tidb/pkg/types" + "github.com/pingcap/tidb/pkg/util/chunk" +) + +// PosAndBuf is the parameter of all DeserializeXXX functions +type PosAndBuf struct { + Buf []byte + Pos int64 +} + +// Reset resets data in PosAndBuf +func (p *PosAndBuf) Reset(col *chunk.Column, idx int) { + p.Buf = col.GetBytes(idx) + p.Pos = 0 +} + +func deserializeBuffer(posAndBuf *PosAndBuf) []byte { + bufLen := DeserializeInt(posAndBuf) // Get buffer length + retVal := posAndBuf.Buf[posAndBuf.Pos : posAndBuf.Pos+int64(bufLen)] + posAndBuf.Pos += int64(bufLen) + return retVal +} + +// DeserializeByte deserializes byte type +func DeserializeByte(posAndBuf *PosAndBuf) byte { + retVal := posAndBuf.Buf[posAndBuf.Pos] + posAndBuf.Pos++ + return retVal +} + +// DeserializeBool deserializes bool type +func DeserializeBool(posAndBuf *PosAndBuf) bool { + retVal := *(*bool)(unsafe.Pointer(&posAndBuf.Buf[posAndBuf.Pos])) + posAndBuf.Pos += BoolLen + return retVal +} + +// DeserializeInt deserializes int type +func DeserializeInt(posAndBuf *PosAndBuf) int { + retVal := *(*int)(unsafe.Pointer(&posAndBuf.Buf[posAndBuf.Pos])) + posAndBuf.Pos += IntLen + return retVal +} + +// DeserializeInt8 deserializes int8 type +func DeserializeInt8(posAndBuf *PosAndBuf) int8 { + retVal := *(*int8)(unsafe.Pointer(&posAndBuf.Buf[posAndBuf.Pos])) + posAndBuf.Pos += Int8Len + return retVal +} + +// DeserializeUint8 deserializes int8 type +func DeserializeUint8(posAndBuf *PosAndBuf) uint8 { + retVal := *(*uint8)(unsafe.Pointer(&posAndBuf.Buf[posAndBuf.Pos])) + posAndBuf.Pos += Uint8Len + return retVal +} + +// DeserializeInt32 deserializes int32 type +func DeserializeInt32(posAndBuf *PosAndBuf) int32 { + retVal := *(*int32)(unsafe.Pointer(&posAndBuf.Buf[posAndBuf.Pos])) + posAndBuf.Pos += Int32Len + return retVal +} + +// DeserializeUint32 deserializes uint32 type +func DeserializeUint32(posAndBuf *PosAndBuf) uint32 { + retVal := *(*uint32)(unsafe.Pointer(&posAndBuf.Buf[posAndBuf.Pos])) + posAndBuf.Pos += Uint32Len + return retVal +} + +// DeserializeUint64 deserializes uint64 type +func DeserializeUint64(posAndBuf *PosAndBuf) uint64 { + retVal := *(*uint64)(unsafe.Pointer(&posAndBuf.Buf[posAndBuf.Pos])) + posAndBuf.Pos += Uint64Len + return retVal +} + +// DeserializeInt64 deserializes int64 type +func DeserializeInt64(posAndBuf *PosAndBuf) int64 { + retVal := *(*int64)(unsafe.Pointer(&posAndBuf.Buf[posAndBuf.Pos])) + posAndBuf.Pos += Int64Len + return retVal +} + +// DeserializeFloat32 deserializes float32 type +func DeserializeFloat32(posAndBuf *PosAndBuf) float32 { + retVal := *(*float32)(unsafe.Pointer(&posAndBuf.Buf[posAndBuf.Pos])) + posAndBuf.Pos += Float32Len + return retVal +} + +// DeserializeFloat64 deserializes float64 type +func DeserializeFloat64(posAndBuf *PosAndBuf) float64 { + retVal := *(*float64)(unsafe.Pointer(&posAndBuf.Buf[posAndBuf.Pos])) + posAndBuf.Pos += Float64Len + return retVal +} + +// DeserializeMyDecimal deserializes MyDecimal type +func DeserializeMyDecimal(posAndBuf *PosAndBuf) types.MyDecimal { + retVal := *(*types.MyDecimal)(unsafe.Pointer(&posAndBuf.Buf[posAndBuf.Pos])) + posAndBuf.Pos += types.MyDecimalStructSize + return retVal +} + +// DeserializeTime deserializes Time type +func DeserializeTime(posAndBuf *PosAndBuf) types.Time { + retVal := *(*types.Time)(unsafe.Pointer(&posAndBuf.Buf[posAndBuf.Pos])) + posAndBuf.Pos += TimeLen + return retVal +} + +// DeserializeTimeDuration deserializes time.Duration type +func DeserializeTimeDuration(posAndBuf *PosAndBuf) time.Duration { + retVal := *(*time.Duration)(unsafe.Pointer(&posAndBuf.Buf[posAndBuf.Pos])) + posAndBuf.Pos += TimeDurationLen + return retVal +} + +// DeserializeTypesDuration deserializes types.Duration type +func DeserializeTypesDuration(posAndBuf *PosAndBuf) types.Duration { + retVal := types.Duration{} + retVal.Duration = DeserializeTimeDuration(posAndBuf) + retVal.Fsp = DeserializeInt(posAndBuf) + return retVal +} + +// DeserializeJSONTypeCode deserializes JSONTypeCode type +func DeserializeJSONTypeCode(posAndBuf *PosAndBuf) types.JSONTypeCode { + retVal := *(*types.JSONTypeCode)(unsafe.Pointer(&posAndBuf.Buf[posAndBuf.Pos])) + posAndBuf.Pos += JSONTypeCodeLen + return retVal +} + +// DeserializeBinaryJSON deserializes BinaryJSON type +func DeserializeBinaryJSON(posAndBuf *PosAndBuf) types.BinaryJSON { + retValue := types.BinaryJSON{} + retValue.TypeCode = DeserializeJSONTypeCode(posAndBuf) + buf := deserializeBuffer(posAndBuf) + retValue.Value = make([]byte, len(buf)) + copy(retValue.Value, buf) + return retValue +} + +// DeserializeSet deserializes Set type +func DeserializeSet(posAndBuf *PosAndBuf) types.Set { + retValue := types.Set{} + retValue.Value = DeserializeUint64(posAndBuf) + retValue.Name = DeserializeString(posAndBuf) + return retValue +} + +// DeserializeEnum deserializes Enum type +func DeserializeEnum(posAndBuf *PosAndBuf) types.Enum { + retValue := types.Enum{} + retValue.Value = DeserializeUint64(posAndBuf) + retValue.Name = DeserializeString(posAndBuf) + return retValue +} + +// DeserializeOpaque deserializes Opaque type +func DeserializeOpaque(posAndBuf *PosAndBuf) types.Opaque { + retVal := types.Opaque{} + retVal.TypeCode = DeserializeByte(posAndBuf) + buf := deserializeBuffer(posAndBuf) + retVal.Buf = make([]byte, len(buf)) + copy(retVal.Buf, buf) + return retVal +} + +// DeserializeString deserializes String type +func DeserializeString(posAndBuf *PosAndBuf) string { + buf := deserializeBuffer(posAndBuf) + return string(buf) +} + +// DeserializeBytesBuffer deserializes bytes.Buffer type +func DeserializeBytesBuffer(posAndBuf *PosAndBuf) *bytes.Buffer { + buf := deserializeBuffer(posAndBuf) + tmp := make([]byte, len(buf)) + copy(tmp, buf) + return bytes.NewBuffer(tmp) +} + +// DeserializeInterface deserializes interface type +func DeserializeInterface(posAndBuf *PosAndBuf) interface{} { + // Get type + dataType := int(posAndBuf.Buf[posAndBuf.Pos]) + posAndBuf.Pos += InterfaceTypeCodeLen + + switch dataType { + case BoolType: + return DeserializeBool(posAndBuf) + case Int64Type: + return DeserializeInt64(posAndBuf) + case Uint64Type: + return DeserializeUint64(posAndBuf) + case FloatType: + return DeserializeFloat64(posAndBuf) + case StringType: + return DeserializeString(posAndBuf) + case BinaryJSONType: + return DeserializeBinaryJSON(posAndBuf) + case OpaqueType: + return DeserializeOpaque(posAndBuf) + case TimeType: + return DeserializeTime(posAndBuf) + case DurationType: + return DeserializeTypesDuration(posAndBuf) + default: + panic("Invalid data type happens in agg spill deserializing!") + } +} diff --git a/pkg/util/serialization/serialization_util.go b/pkg/util/serialization/serialization_util.go new file mode 100644 index 0000000000000..3e4dbb6228093 --- /dev/null +++ b/pkg/util/serialization/serialization_util.go @@ -0,0 +1,208 @@ +// Copyright 2023 PingCAP, 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. + +package serialization + +import ( + "bytes" + "time" + "unsafe" + + "github.com/pingcap/tidb/pkg/types" +) + +func serializeBuffer(value []byte, buf []byte) []byte { + length := len(value) + buf = SerializeInt(length, buf) + return append(buf, value...) +} + +// SerializeByte serializes byte type +func SerializeByte(value byte, buf []byte) []byte { + return append(buf, value) +} + +// SerializeBool serializes bool type +func SerializeBool(value bool, buf []byte) []byte { + var tmp [BoolLen]byte + *(*bool)(unsafe.Pointer(&tmp[0])) = value + return append(buf, tmp[:]...) +} + +// SerializeInt serializes int type +func SerializeInt(value int, buf []byte) []byte { + var tmp [IntLen]byte + *(*int)(unsafe.Pointer(&tmp[0])) = value + return append(buf, tmp[:]...) +} + +// SerializeInt8 serializes int8 type +func SerializeInt8(value int8, buf []byte) []byte { + var tmp [Int8Len]byte + *(*int8)(unsafe.Pointer(&tmp[0])) = value + return append(buf, tmp[:]...) +} + +// SerializeUint8 serializes uint8 type +func SerializeUint8(value uint8, buf []byte) []byte { + var tmp [Uint8Len]byte + *(*uint8)(unsafe.Pointer(&tmp[0])) = value + return append(buf, tmp[:]...) +} + +// SerializeInt32 serializes int32 type +func SerializeInt32(value int32, buf []byte) []byte { + var tmp [Int32Len]byte + *(*int32)(unsafe.Pointer(&tmp[0])) = value + return append(buf, tmp[:]...) +} + +// SerializeUint32 serializes uint32 type +func SerializeUint32(value uint32, buf []byte) []byte { + var tmp [Uint32Len]byte + *(*uint32)(unsafe.Pointer(&tmp[0])) = value + return append(buf, tmp[:]...) +} + +// SerializeUint64 serializes uint64 type +func SerializeUint64(value uint64, buf []byte) []byte { + var tmp [Uint64Len]byte + *(*uint64)(unsafe.Pointer(&tmp[0])) = value + return append(buf, tmp[:]...) +} + +// SerializeInt64 serializes int64 type +func SerializeInt64(value int64, buf []byte) []byte { + var tmp [Int64Len]byte + *(*int64)(unsafe.Pointer(&tmp[0])) = value + return append(buf, tmp[:]...) +} + +// SerializeFloat32 serializes float32 type +func SerializeFloat32(value float32, buf []byte) []byte { + var tmp [Float32Len]byte + *(*float32)(unsafe.Pointer(&tmp[0])) = value + return append(buf, tmp[:]...) +} + +// SerializeFloat64 serializes float64 type +func SerializeFloat64(value float64, buf []byte) []byte { + var tmp [Float64Len]byte + *(*float64)(unsafe.Pointer(&tmp[0])) = value + return append(buf, tmp[:]...) +} + +// SerializeMyDecimal serializes MyDecimal type +func SerializeMyDecimal(value *types.MyDecimal, buf []byte) []byte { + var tmp [types.MyDecimalStructSize]byte + *(*types.MyDecimal)(unsafe.Pointer(&tmp[0])) = *value + return append(buf, tmp[:]...) +} + +// SerializeTime serializes Time type +func SerializeTime(value types.Time, buf []byte) []byte { + var tmp [TimeLen]byte + *(*types.Time)(unsafe.Pointer(&tmp[0])) = value + return append(buf, tmp[:]...) +} + +// SerializeGoTimeDuration serializes time.Duration type +func SerializeGoTimeDuration(value time.Duration, buf []byte) []byte { + var tmp [TimeDurationLen]byte + *(*time.Duration)(unsafe.Pointer(&tmp[0])) = value + return append(buf, tmp[:]...) +} + +// SerializeTypesDuration serializes types.Duration type +func SerializeTypesDuration(value types.Duration, buf []byte) []byte { + buf = SerializeGoTimeDuration(value.Duration, buf) + return SerializeInt(value.Fsp, buf) +} + +// SerializeJSONTypeCode serializes JSONTypeCode type +func SerializeJSONTypeCode(value types.JSONTypeCode, buf []byte) []byte { + var tmp [JSONTypeCodeLen]byte + *(*types.JSONTypeCode)(unsafe.Pointer(&tmp[0])) = value + return append(buf, tmp[:]...) +} + +// SerializeBinaryJSON serializes BinaryJSON type +func SerializeBinaryJSON(value *types.BinaryJSON, buf []byte) []byte { + buf = SerializeByte(value.TypeCode, buf) + return serializeBuffer(value.Value, buf) +} + +// SerializeSet serializes Set type +func SerializeSet(value *types.Set, buf []byte) []byte { + buf = SerializeUint64(value.Value, buf) + return serializeBuffer([]byte(value.Name), buf) +} + +// SerializeEnum serializes Enum type +func SerializeEnum(value *types.Enum, buf []byte) []byte { + buf = SerializeUint64(value.Value, buf) + return serializeBuffer([]byte(value.Name), buf) +} + +// SerializeOpaque serializes Opaque type +func SerializeOpaque(value types.Opaque, buf []byte) []byte { + buf = SerializeByte(value.TypeCode, buf) + return serializeBuffer(value.Buf, buf) +} + +// SerializeString serializes String type +func SerializeString(value string, buf []byte) []byte { + return serializeBuffer([]byte(value), buf) +} + +// SerializeBytesBuffer serializes bytes.Buffer type +func SerializeBytesBuffer(value *bytes.Buffer, buf []byte) []byte { + bufferBytes := value.Bytes() + return serializeBuffer(bufferBytes, buf) +} + +// SerializeInterface serialize interface type +func SerializeInterface(value interface{}, buf []byte) []byte { + switch v := value.(type) { + case bool: + buf = append(buf, BoolType) + return SerializeBool(v, buf) + case int64: + buf = append(buf, Int64Type) + return SerializeInt64(v, buf) + case uint64: + buf = append(buf, Uint64Type) + return SerializeUint64(v, buf) + case float64: + buf = append(buf, FloatType) + return SerializeFloat64(v, buf) + case string: + buf = append(buf, StringType) + return SerializeString(v, buf) + case types.BinaryJSON: + buf = append(buf, BinaryJSONType) + return SerializeBinaryJSON(&v, buf) + case types.Opaque: + buf = append(buf, OpaqueType) + return SerializeOpaque(v, buf) + case types.Time: + buf = append(buf, TimeType) + return SerializeTime(v, buf) + case types.Duration: + buf = append(buf, DurationType) + return SerializeTypesDuration(v, buf) + default: + panic("Agg spill encounters an unexpected interface type!") + } +} diff --git a/pkg/util/set/main_test.go b/pkg/util/set/main_test.go index cb2ed37af7781..537fd281badcb 100644 --- a/pkg/util/set/main_test.go +++ b/pkg/util/set/main_test.go @@ -25,6 +25,7 @@ func TestMain(m *testing.M) { testsetup.SetupForCommonTest() opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), } diff --git a/pkg/util/set/mem_aware_map.go b/pkg/util/set/mem_aware_map.go index d2b8a564a783f..0ec3c773229e5 100644 --- a/pkg/util/set/mem_aware_map.go +++ b/pkg/util/set/mem_aware_map.go @@ -37,7 +37,7 @@ func EstimateMapSize(length int, bucketSize uint64) uint64 { if length == 0 { return 0 } - bInMap := uint64(math.Ceil(math.Log2(float64(length) * hack.LoadFactorDen / hack.LoadFactorNum))) + bInMap := uint64(math.Ceil(math.Log2(float64(length) * hack.LoadFactorDen / float64(hack.LoadFactorNum)))) return bucketSize * uint64(1< (float64)(p)/1000 { + if killer.ConnID != 0 { + targetStatus := rand.Int31n(5) + atomic.StoreUint32(&killer.Signal, uint32(targetStatus)) + } + } + } + }) status := atomic.LoadUint32(&killer.Signal) switch status { case QueryInterrupted: diff --git a/pkg/util/stmtsummary/evicted.go b/pkg/util/stmtsummary/evicted.go index ab1e45a4723ac..8dbcef632d382 100644 --- a/pkg/util/stmtsummary/evicted.go +++ b/pkg/util/stmtsummary/evicted.go @@ -381,4 +381,8 @@ func addInfo(addTo *stmtSummaryByDigestElement, addWith *stmtSummaryByDigestElem addTo.sumWriteSQLRespTotal += addWith.sumWriteSQLRespTotal addTo.sumErrors += addWith.sumErrors + + addTo.StmtRUSummary.Merge(&addWith.StmtRUSummary) + // resourceGroupName might not be inited because when it is a evicted item. + addTo.resourceGroupName = addWith.resourceGroupName } diff --git a/pkg/util/stmtsummary/main_test.go b/pkg/util/stmtsummary/main_test.go index dd39f90bd3673..475014b8003a9 100644 --- a/pkg/util/stmtsummary/main_test.go +++ b/pkg/util/stmtsummary/main_test.go @@ -25,6 +25,7 @@ func TestMain(m *testing.M) { testsetup.SetupForCommonTest() opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), } diff --git a/pkg/util/stmtsummary/reader.go b/pkg/util/stmtsummary/reader.go index 4ecaf59bdd004..4c5541e87f7cd 100644 --- a/pkg/util/stmtsummary/reader.go +++ b/pkg/util/stmtsummary/reader.go @@ -313,6 +313,13 @@ const ( Charset = "CHARSET" Collation = "COLLATION" PlanHint = "PLAN_HINT" + AvgRequestUnitReadStr = "AVG_REQUEST_UNIT_READ" + MaxRequestUnitReadStr = "MAX_REQUEST_UNIT_READ" + AvgRequestUnitWriteStr = "AVG_REQUEST_UNIT_WRITE" + MaxRequestUnitWriteStr = "MAX_REQUEST_UNIT_WRITE" + AvgQueuedRcTimeStr = "AVG_QUEUED_RC_TIME" + MaxQueuedRcTimeStr = "MAX_QUEUED_RC_TIME" + ResourceGroupName = "RESOURCE_GROUP" ) type columnValueFactory func(reader *stmtSummaryReader, ssElement *stmtSummaryByDigestElement, ssbd *stmtSummaryByDigest) interface{} @@ -632,4 +639,25 @@ var columnValueFactoryMap = map[string]columnValueFactory{ PlanHint: func(_ *stmtSummaryReader, ssElement *stmtSummaryByDigestElement, _ *stmtSummaryByDigest) interface{} { return ssElement.planHint }, + AvgRequestUnitReadStr: func(_ *stmtSummaryReader, ssElement *stmtSummaryByDigestElement, _ *stmtSummaryByDigest) interface{} { + return avgSumFloat(ssElement.SumRRU, ssElement.execCount) + }, + MaxRequestUnitReadStr: func(_ *stmtSummaryReader, ssElement *stmtSummaryByDigestElement, _ *stmtSummaryByDigest) interface{} { + return ssElement.MaxRRU + }, + AvgRequestUnitWriteStr: func(_ *stmtSummaryReader, ssElement *stmtSummaryByDigestElement, _ *stmtSummaryByDigest) interface{} { + return avgSumFloat(ssElement.SumWRU, ssElement.execCount) + }, + MaxRequestUnitWriteStr: func(_ *stmtSummaryReader, ssElement *stmtSummaryByDigestElement, _ *stmtSummaryByDigest) interface{} { + return ssElement.MaxWRU + }, + AvgQueuedRcTimeStr: func(_ *stmtSummaryReader, ssElement *stmtSummaryByDigestElement, _ *stmtSummaryByDigest) interface{} { + return avgInt(int64(ssElement.SumRUWaitDuration), ssElement.execCount) + }, + MaxQueuedRcTimeStr: func(_ *stmtSummaryReader, ssElement *stmtSummaryByDigestElement, _ *stmtSummaryByDigest) interface{} { + return int64(ssElement.MaxRUWaitDuration) + }, + ResourceGroupName: func(_ *stmtSummaryReader, ssElement *stmtSummaryByDigestElement, _ *stmtSummaryByDigest) interface{} { + return ssElement.resourceGroupName + }, } diff --git a/pkg/util/stmtsummary/statement_summary.go b/pkg/util/stmtsummary/statement_summary.go index 9b428a48d2756..943ca4570a173 100644 --- a/pkg/util/stmtsummary/statement_summary.go +++ b/pkg/util/stmtsummary/statement_summary.go @@ -50,6 +50,8 @@ type stmtSummaryByDigestKey struct { planDigest string // `hash` is the hash value of this object. hash []byte + // `resourceGroupName` is the resource group's name of this statement is bind to. + resourceGroupName string } // Hash implements SimpleLRUCache.Key. @@ -62,6 +64,7 @@ func (key *stmtSummaryByDigestKey) Hash() []byte { key.hash = append(key.hash, hack.Slice(key.schemaName)...) key.hash = append(key.hash, hack.Slice(key.prevDigest)...) key.hash = append(key.hash, hack.Slice(key.planDigest)...) + key.hash = append(key.hash, hack.Slice(key.resourceGroupName)...) } return key.hash } @@ -211,6 +214,9 @@ type stmtSummaryByDigestElement struct { // pessimistic execution retry information. execRetryCount uint execRetryTime time.Duration + // request-units + resourceGroupName string + StmtRUSummary } // StmtExecInfo records execution information of each statement. @@ -244,11 +250,13 @@ type StmtExecInfo struct { ExecRetryCount uint ExecRetryTime time.Duration execdetails.StmtExecDetails - ResultRows int64 - TiKVExecDetails util.ExecDetails - Prepared bool - KeyspaceName string - KeyspaceID uint32 + ResultRows int64 + TiKVExecDetails util.ExecDetails + Prepared bool + KeyspaceName string + KeyspaceID uint32 + ResourceGroupName string + RUDetail *util.RUDetails } // newStmtSummaryByDigestMap creates an empty stmtSummaryByDigestMap. @@ -299,10 +307,11 @@ func (ssMap *stmtSummaryByDigestMap) AddStatement(sei *StmtExecInfo) { historySize := ssMap.historySize() key := &stmtSummaryByDigestKey{ - schemaName: sei.SchemaName, - digest: sei.Digest, - prevDigest: sei.PrevSQLDigest, - planDigest: sei.PlanDigest, + schemaName: sei.SchemaName, + digest: sei.Digest, + prevDigest: sei.PrevSQLDigest, + planDigest: sei.PlanDigest, + resourceGroupName: sei.ResourceGroupName, } // Calculate hash value in advance, to reduce the time holding the lock. key.Hash() @@ -651,20 +660,21 @@ func newStmtSummaryByDigestElement(sei *StmtExecInfo, beginTime int64, intervalS // PrevSQL is already truncated to cfg.Log.QueryLogMaxLen. prevSQL: sei.PrevSQL, // samplePlan needs to be decoded so it can't be truncated. - samplePlan: samplePlan, - sampleBinaryPlan: binPlan, - planHint: planHint, - indexNames: sei.StmtCtx.IndexNames, - minLatency: sei.TotalLatency, - firstSeen: sei.StartTime, - lastSeen: sei.StartTime, - backoffTypes: make(map[string]int), - authUsers: make(map[string]struct{}), - planInCache: false, - planCacheHits: 0, - planInBinding: false, - prepared: sei.Prepared, - minResultRows: math.MaxInt64, + samplePlan: samplePlan, + sampleBinaryPlan: binPlan, + planHint: planHint, + indexNames: sei.StmtCtx.IndexNames, + minLatency: sei.TotalLatency, + firstSeen: sei.StartTime, + lastSeen: sei.StartTime, + backoffTypes: make(map[string]int), + authUsers: make(map[string]struct{}), + planInCache: false, + planCacheHits: 0, + planInBinding: false, + prepared: sei.Prepared, + minResultRows: math.MaxInt64, + resourceGroupName: sei.ResourceGroupName, } ssElement.add(sei, intervalSeconds) return ssElement @@ -888,6 +898,9 @@ func (ssElement *stmtSummaryByDigestElement) add(sei *StmtExecInfo, intervalSeco ssElement.sumPDTotal += time.Duration(atomic.LoadInt64(&sei.TiKVExecDetails.WaitPDRespDuration)) ssElement.sumBackoffTotal += time.Duration(atomic.LoadInt64(&sei.TiKVExecDetails.BackoffDuration)) ssElement.sumWriteSQLRespTotal += sei.StmtExecDetails.WriteSQLRespDuration + + // request-units + ssElement.StmtRUSummary.Add(sei.RUDetail) } // Truncate SQL to maxSQLLength. @@ -949,9 +962,63 @@ func avgFloat(sum int64, count int64) float64 { return 0 } +func avgSumFloat(sum float64, count int64) float64 { + if count > 0 { + return sum / float64(count) + } + return 0 +} + func convertEmptyToNil(str string) interface{} { if str == "" { return nil } return str } + +// StmtRUSummary is the request-units summary for each type of statements. +type StmtRUSummary struct { + SumRRU float64 `json:"sum_rru"` + SumWRU float64 `json:"sum_wru"` + SumRUWaitDuration time.Duration `json:"sum_ru_wait_duration"` + MaxRRU float64 `json:"max_rru"` + MaxWRU float64 `json:"max_wru"` + MaxRUWaitDuration time.Duration `json:"max_ru_wait_duration"` +} + +// Add add a new sample value to the ru summary record. +func (s *StmtRUSummary) Add(info *util.RUDetails) { + if info != nil { + rru := info.RRU() + s.SumRRU += rru + if s.MaxRRU < rru { + s.MaxRRU = rru + } + wru := info.WRU() + s.SumWRU += wru + if s.MaxWRU < wru { + s.MaxWRU = wru + } + ruWaitDur := info.RUWaitDuration() + s.SumRUWaitDuration += ruWaitDur + if s.MaxRUWaitDuration < ruWaitDur { + s.MaxRUWaitDuration = ruWaitDur + } + } +} + +// Merge merges the value of 2 ru summary records. +func (s *StmtRUSummary) Merge(other *StmtRUSummary) { + s.SumRRU += other.SumRRU + s.SumWRU += other.SumWRU + s.SumRUWaitDuration += other.SumRUWaitDuration + if s.MaxRRU < other.MaxRRU { + s.MaxRRU = other.MaxRRU + } + if s.MaxWRU < other.MaxWRU { + s.MaxWRU = other.MaxWRU + } + if s.MaxRUWaitDuration < other.MaxRUWaitDuration { + s.MaxRUWaitDuration = other.MaxRUWaitDuration + } +} diff --git a/pkg/util/stmtsummary/statement_summary_test.go b/pkg/util/stmtsummary/statement_summary_test.go index e9ab25166f6a3..c60442ebc79c3 100644 --- a/pkg/util/stmtsummary/statement_summary_test.go +++ b/pkg/util/stmtsummary/statement_summary_test.go @@ -74,9 +74,10 @@ func TestAddStatement(t *testing.T) { stmtExecInfo1 := generateAnyExecInfo() stmtExecInfo1.ExecDetail.CommitDetail.Mu.PrewriteBackoffTypes = make([]string, 0) key := &stmtSummaryByDigestKey{ - schemaName: stmtExecInfo1.SchemaName, - digest: stmtExecInfo1.Digest, - planDigest: stmtExecInfo1.PlanDigest, + schemaName: stmtExecInfo1.SchemaName, + digest: stmtExecInfo1.Digest, + planDigest: stmtExecInfo1.PlanDigest, + resourceGroupName: stmtExecInfo1.ResourceGroupName, } samplePlan, _ := stmtExecInfo1.PlanGenerator() stmtExecInfo1.ExecDetail.CommitDetail.Mu.Lock() @@ -137,6 +138,15 @@ func TestAddStatement(t *testing.T) { sumAffectedRows: stmtExecInfo1.StmtCtx.AffectedRows(), firstSeen: stmtExecInfo1.StartTime, lastSeen: stmtExecInfo1.StartTime, + StmtRUSummary: StmtRUSummary{ + SumRRU: stmtExecInfo1.RUDetail.RRU(), + MaxRRU: stmtExecInfo1.RUDetail.RRU(), + SumWRU: stmtExecInfo1.RUDetail.WRU(), + MaxWRU: stmtExecInfo1.RUDetail.WRU(), + SumRUWaitDuration: stmtExecInfo1.RUDetail.RUWaitDuration(), + MaxRUWaitDuration: stmtExecInfo1.RUDetail.RUWaitDuration(), + }, + resourceGroupName: stmtExecInfo1.ResourceGroupName, } stmtExecInfo1.ExecDetail.CommitDetail.Mu.Unlock() history := list.New() @@ -225,11 +235,13 @@ func TestAddStatement(t *testing.T) { }, CalleeAddress: "202", }, }, - StmtCtx: sc, - MemMax: 20000, - DiskMax: 20000, - StartTime: time.Date(2019, 1, 1, 10, 10, 20, 10, time.UTC), - Succeed: true, + StmtCtx: sc, + MemMax: 20000, + DiskMax: 20000, + StartTime: time.Date(2019, 1, 1, 10, 10, 20, 10, time.UTC), + Succeed: true, + RUDetail: util.NewRUDetailsWith(123.0, 45.6, 2*time.Second), + ResourceGroupName: "rg1", } stmtExecInfo2.StmtCtx.AddAffectedRows(200) expectedSummaryElement.execCount++ @@ -284,6 +296,12 @@ func TestAddStatement(t *testing.T) { expectedSummaryElement.maxDisk = stmtExecInfo2.DiskMax expectedSummaryElement.sumAffectedRows += stmtExecInfo2.StmtCtx.AffectedRows() expectedSummaryElement.lastSeen = stmtExecInfo2.StartTime + expectedSummaryElement.SumRRU += stmtExecInfo2.RUDetail.RRU() + expectedSummaryElement.MaxRRU = stmtExecInfo2.RUDetail.RRU() + expectedSummaryElement.SumWRU += stmtExecInfo2.RUDetail.WRU() + expectedSummaryElement.MaxWRU = stmtExecInfo2.RUDetail.WRU() + expectedSummaryElement.SumRUWaitDuration += stmtExecInfo2.RUDetail.RUWaitDuration() + expectedSummaryElement.MaxRUWaitDuration = stmtExecInfo2.RUDetail.RUWaitDuration() ssMap.AddStatement(stmtExecInfo2) summary, ok = ssMap.summaryMap.Get(key) @@ -361,11 +379,13 @@ func TestAddStatement(t *testing.T) { CalleeAddress: "302", }, }, - StmtCtx: sc, - MemMax: 200, - DiskMax: 200, - StartTime: time.Date(2019, 1, 1, 10, 10, 0, 10, time.UTC), - Succeed: true, + StmtCtx: sc, + MemMax: 200, + DiskMax: 200, + StartTime: time.Date(2019, 1, 1, 10, 10, 0, 10, time.UTC), + Succeed: true, + RUDetail: util.NewRUDetailsWith(0.12, 0.34, 5*time.Microsecond), + ResourceGroupName: "rg1", } stmtExecInfo3.StmtCtx.AddAffectedRows(20000) expectedSummaryElement.execCount++ @@ -397,6 +417,9 @@ func TestAddStatement(t *testing.T) { expectedSummaryElement.sumDisk += stmtExecInfo3.DiskMax expectedSummaryElement.sumAffectedRows += stmtExecInfo3.StmtCtx.AffectedRows() expectedSummaryElement.firstSeen = stmtExecInfo3.StartTime + expectedSummaryElement.SumRRU += stmtExecInfo3.RUDetail.RRU() + expectedSummaryElement.SumWRU += stmtExecInfo3.RUDetail.WRU() + expectedSummaryElement.SumRUWaitDuration += stmtExecInfo3.RUDetail.RUWaitDuration() ssMap.AddStatement(stmtExecInfo3) summary, ok = ssMap.summaryMap.Get(key) @@ -408,9 +431,10 @@ func TestAddStatement(t *testing.T) { stmtExecInfo4.SchemaName = "schema2" stmtExecInfo4.ExecDetail.CommitDetail = nil key = &stmtSummaryByDigestKey{ - schemaName: stmtExecInfo4.SchemaName, - digest: stmtExecInfo4.Digest, - planDigest: stmtExecInfo4.PlanDigest, + schemaName: stmtExecInfo4.SchemaName, + digest: stmtExecInfo4.Digest, + planDigest: stmtExecInfo4.PlanDigest, + resourceGroupName: stmtExecInfo4.ResourceGroupName, } ssMap.AddStatement(stmtExecInfo4) require.Equal(t, 2, ssMap.summaryMap.Size()) @@ -421,9 +445,10 @@ func TestAddStatement(t *testing.T) { stmtExecInfo5 := stmtExecInfo1 stmtExecInfo5.Digest = "digest2" key = &stmtSummaryByDigestKey{ - schemaName: stmtExecInfo5.SchemaName, - digest: stmtExecInfo5.Digest, - planDigest: stmtExecInfo4.PlanDigest, + schemaName: stmtExecInfo5.SchemaName, + digest: stmtExecInfo5.Digest, + planDigest: stmtExecInfo4.PlanDigest, + resourceGroupName: stmtExecInfo5.ResourceGroupName, } ssMap.AddStatement(stmtExecInfo5) require.Equal(t, 3, ssMap.summaryMap.Size()) @@ -434,9 +459,10 @@ func TestAddStatement(t *testing.T) { stmtExecInfo6 := stmtExecInfo1 stmtExecInfo6.PlanDigest = "plan_digest2" key = &stmtSummaryByDigestKey{ - schemaName: stmtExecInfo6.SchemaName, - digest: stmtExecInfo6.Digest, - planDigest: stmtExecInfo6.PlanDigest, + schemaName: stmtExecInfo6.SchemaName, + digest: stmtExecInfo6.Digest, + planDigest: stmtExecInfo6.PlanDigest, + resourceGroupName: stmtExecInfo6.ResourceGroupName, } ssMap.AddStatement(stmtExecInfo6) require.Equal(t, 4, ssMap.summaryMap.Size()) @@ -454,9 +480,10 @@ func TestAddStatement(t *testing.T) { return string(buf), "" } key = &stmtSummaryByDigestKey{ - schemaName: stmtExecInfo7.SchemaName, - digest: stmtExecInfo7.Digest, - planDigest: stmtExecInfo7.PlanDigest, + schemaName: stmtExecInfo7.SchemaName, + digest: stmtExecInfo7.Digest, + planDigest: stmtExecInfo7.PlanDigest, + resourceGroupName: stmtExecInfo7.ResourceGroupName, } ssMap.AddStatement(stmtExecInfo7) require.Equal(t, 5, ssMap.summaryMap.Size()) @@ -544,7 +571,9 @@ func matchStmtSummaryByDigest(first, second *stmtSummaryByDigest) bool { ssElement1.maxMem != ssElement2.maxMem || ssElement1.sumAffectedRows != ssElement2.sumAffectedRows || !ssElement1.firstSeen.Equal(ssElement2.firstSeen) || - !ssElement1.lastSeen.Equal(ssElement2.lastSeen) { + !ssElement1.lastSeen.Equal(ssElement2.lastSeen) || + ssElement1.resourceGroupName != ssElement2.resourceGroupName || + ssElement1.StmtRUSummary != ssElement2.StmtRUSummary { return false } if len(ssElement1.backoffTypes) != len(ssElement2.backoffTypes) { @@ -656,11 +685,13 @@ func generateAnyExecInfo() *StmtExecInfo { CalleeAddress: "129", }, }, - StmtCtx: sc, - MemMax: 10000, - DiskMax: 10000, - StartTime: time.Date(2019, 1, 1, 10, 10, 10, 10, time.UTC), - Succeed: true, + StmtCtx: sc, + MemMax: 10000, + DiskMax: 10000, + StartTime: time.Date(2019, 1, 1, 10, 10, 10, 10, time.UTC), + Succeed: true, + ResourceGroupName: "rg1", + RUDetail: util.NewRUDetailsWith(1.1, 2.5, 2*time.Millisecond), } stmtExecInfo.StmtCtx.AddAffectedRows(10000) return stmtExecInfo @@ -759,6 +790,13 @@ func newStmtSummaryReaderForTest(ssMap *stmtSummaryByDigestMap) *stmtSummaryRead PrevSampleTextStr, PlanDigestStr, PlanStr, + AvgRequestUnitReadStr, + MaxRequestUnitReadStr, + AvgRequestUnitWriteStr, + MaxRequestUnitWriteStr, + AvgQueuedRcTimeStr, + MaxQueuedRcTimeStr, + ResourceGroupName, } cols := make([]*model.ColumnInfo, len(columnNames)) for i := range columnNames { @@ -816,7 +854,9 @@ func TestToDatum(t *testing.T) { stmtExecInfo1.ExecDetail.CommitDetail.TxnRetry, stmtExecInfo1.ExecDetail.CommitDetail.TxnRetry, 0, 0, 1, fmt.Sprintf("%s:1", boTxnLockName), stmtExecInfo1.MemMax, stmtExecInfo1.MemMax, stmtExecInfo1.DiskMax, stmtExecInfo1.DiskMax, 0, 0, 0, 0, 0, 0, 0, 0, stmtExecInfo1.StmtCtx.AffectedRows(), - f, f, 0, 0, 0, stmtExecInfo1.OriginalSQL, stmtExecInfo1.PrevSQL, "plan_digest", ""} + f, f, 0, 0, 0, stmtExecInfo1.OriginalSQL, stmtExecInfo1.PrevSQL, "plan_digest", "", stmtExecInfo1.RUDetail.RRU(), stmtExecInfo1.RUDetail.RRU(), + stmtExecInfo1.RUDetail.WRU(), stmtExecInfo1.RUDetail.WRU(), int64(stmtExecInfo1.RUDetail.RUWaitDuration()), int64(stmtExecInfo1.RUDetail.RUWaitDuration()), + stmtExecInfo1.ResourceGroupName} stmtExecInfo1.ExecDetail.CommitDetail.Mu.Unlock() match(t, datums[0], expectedDatum...) datums = reader.GetStmtSummaryHistoryRows() @@ -864,7 +904,9 @@ func TestToDatum(t *testing.T) { stmtExecInfo1.ExecDetail.CommitDetail.TxnRetry, stmtExecInfo1.ExecDetail.CommitDetail.TxnRetry, 0, 0, 1, fmt.Sprintf("%s:1", boTxnLockName), stmtExecInfo1.MemMax, stmtExecInfo1.MemMax, stmtExecInfo1.DiskMax, stmtExecInfo1.DiskMax, 0, 0, 0, 0, 0, 0, 0, 0, stmtExecInfo1.StmtCtx.AffectedRows(), - f, f, 0, 0, 0, "", "", "", ""} + f, f, 0, 0, 0, "", "", "", "", stmtExecInfo1.RUDetail.RRU(), stmtExecInfo1.RUDetail.RRU(), + stmtExecInfo1.RUDetail.WRU(), stmtExecInfo1.RUDetail.WRU(), int64(stmtExecInfo1.RUDetail.RUWaitDuration()), int64(stmtExecInfo1.RUDetail.RUWaitDuration()), + stmtExecInfo1.ResourceGroupName} expectedDatum[4] = stmtExecInfo2.Digest match(t, datums[0], expectedDatum...) match(t, datums[1], expectedEvictedDatum...) @@ -939,9 +981,10 @@ func TestMaxStmtCount(t *testing.T) { // LRU cache should work. for i := loops - 10; i < loops; i++ { key := &stmtSummaryByDigestKey{ - schemaName: stmtExecInfo1.SchemaName, - digest: fmt.Sprintf("digest%d", i), - planDigest: stmtExecInfo1.PlanDigest, + schemaName: stmtExecInfo1.SchemaName, + digest: fmt.Sprintf("digest%d", i), + planDigest: stmtExecInfo1.PlanDigest, + resourceGroupName: stmtExecInfo1.ResourceGroupName, } _, ok := sm.Get(key) require.True(t, ok) @@ -985,10 +1028,11 @@ func TestMaxSQLLength(t *testing.T) { ssMap.AddStatement(stmtExecInfo1) key := &stmtSummaryByDigestKey{ - schemaName: stmtExecInfo1.SchemaName, - digest: stmtExecInfo1.Digest, - planDigest: stmtExecInfo1.PlanDigest, - prevDigest: stmtExecInfo1.PrevSQLDigest, + schemaName: stmtExecInfo1.SchemaName, + digest: stmtExecInfo1.Digest, + planDigest: stmtExecInfo1.PlanDigest, + prevDigest: stmtExecInfo1.PrevSQLDigest, + resourceGroupName: stmtExecInfo1.ResourceGroupName, } value, ok := ssMap.summaryMap.Get(key) require.True(t, ok) @@ -1193,9 +1237,10 @@ func TestRefreshCurrentSummary(t *testing.T) { ssMap.beginTimeForCurInterval = now + 10 stmtExecInfo1 := generateAnyExecInfo() key := &stmtSummaryByDigestKey{ - schemaName: stmtExecInfo1.SchemaName, - digest: stmtExecInfo1.Digest, - planDigest: stmtExecInfo1.PlanDigest, + schemaName: stmtExecInfo1.SchemaName, + digest: stmtExecInfo1.Digest, + planDigest: stmtExecInfo1.PlanDigest, + resourceGroupName: stmtExecInfo1.ResourceGroupName, } ssMap.AddStatement(stmtExecInfo1) require.Equal(t, 1, ssMap.summaryMap.Size()) @@ -1243,9 +1288,10 @@ func TestSummaryHistory(t *testing.T) { stmtExecInfo1 := generateAnyExecInfo() key := &stmtSummaryByDigestKey{ - schemaName: stmtExecInfo1.SchemaName, - digest: stmtExecInfo1.Digest, - planDigest: stmtExecInfo1.PlanDigest, + schemaName: stmtExecInfo1.SchemaName, + digest: stmtExecInfo1.Digest, + planDigest: stmtExecInfo1.PlanDigest, + resourceGroupName: stmtExecInfo1.ResourceGroupName, } for i := 0; i < 11; i++ { ssMap.beginTimeForCurInterval = now + int64(i+1)*10 @@ -1315,10 +1361,11 @@ func TestPrevSQL(t *testing.T) { stmtExecInfo1.PrevSQLDigest = "prevSQLDigest" ssMap.AddStatement(stmtExecInfo1) key := &stmtSummaryByDigestKey{ - schemaName: stmtExecInfo1.SchemaName, - digest: stmtExecInfo1.Digest, - planDigest: stmtExecInfo1.PlanDigest, - prevDigest: stmtExecInfo1.PrevSQLDigest, + schemaName: stmtExecInfo1.SchemaName, + digest: stmtExecInfo1.Digest, + planDigest: stmtExecInfo1.PlanDigest, + prevDigest: stmtExecInfo1.PrevSQLDigest, + resourceGroupName: stmtExecInfo1.ResourceGroupName, } require.Equal(t, 1, ssMap.summaryMap.Size()) _, ok := ssMap.summaryMap.Get(key) @@ -1347,9 +1394,10 @@ func TestEndTime(t *testing.T) { stmtExecInfo1 := generateAnyExecInfo() ssMap.AddStatement(stmtExecInfo1) key := &stmtSummaryByDigestKey{ - schemaName: stmtExecInfo1.SchemaName, - digest: stmtExecInfo1.Digest, - planDigest: stmtExecInfo1.PlanDigest, + schemaName: stmtExecInfo1.SchemaName, + digest: stmtExecInfo1.Digest, + planDigest: stmtExecInfo1.PlanDigest, + resourceGroupName: stmtExecInfo1.ResourceGroupName, } require.Equal(t, 1, ssMap.summaryMap.Size()) value, ok := ssMap.summaryMap.Get(key) @@ -1396,9 +1444,10 @@ func TestPointGet(t *testing.T) { stmtExecInfo1.PlanDigestGen = fakePlanDigestGenerator ssMap.AddStatement(stmtExecInfo1) key := &stmtSummaryByDigestKey{ - schemaName: stmtExecInfo1.SchemaName, - digest: stmtExecInfo1.Digest, - planDigest: "", + schemaName: stmtExecInfo1.SchemaName, + digest: stmtExecInfo1.Digest, + planDigest: "", + resourceGroupName: stmtExecInfo1.ResourceGroupName, } require.Equal(t, 1, ssMap.summaryMap.Size()) value, ok := ssMap.summaryMap.Get(key) diff --git a/pkg/util/stmtsummary/v2/column.go b/pkg/util/stmtsummary/v2/column.go index ec5ad55510402..91e25fdd33502 100644 --- a/pkg/util/stmtsummary/v2/column.go +++ b/pkg/util/stmtsummary/v2/column.go @@ -128,6 +128,13 @@ const ( Charset = "CHARSET" Collation = "COLLATION" PlanHint = "PLAN_HINT" + AvgRequestUnitRead = "AVG_REQUEST_UNIT_READ" + MaxRequestUnitRead = "MAX_REQUEST_UNIT_READ" + AvgRequestUnitWrite = "AVG_REQUEST_UNIT_WRITE" + MaxRequestUnitWrite = "MAX_REQUEST_UNIT_WRITE" + AvgQueuedRcTimeStr = "AVG_QUEUED_RC_TIME" + MaxQueuedRcTimeStr = "MAX_QUEUED_RC_TIME" + ResourceGroupName = "RESOURCE_GROUP" ) type columnInfo interface { @@ -454,6 +461,27 @@ var columnFactoryMap = map[string]columnFactory{ PlanHint: func(info columnInfo, record *StmtRecord) interface{} { return record.PlanHint }, + AvgRequestUnitRead: func(info columnInfo, record *StmtRecord) interface{} { + return avgSumFloat(record.SumRRU, record.ExecCount) + }, + MaxRequestUnitRead: func(info columnInfo, record *StmtRecord) interface{} { + return record.MaxRRU + }, + AvgRequestUnitWrite: func(info columnInfo, record *StmtRecord) interface{} { + return avgSumFloat(record.SumWRU, record.ExecCount) + }, + MaxRequestUnitWrite: func(info columnInfo, record *StmtRecord) interface{} { + return record.MaxWRU + }, + AvgQueuedRcTimeStr: func(info columnInfo, record *StmtRecord) interface{} { + return avgInt(int64(record.SumRUWaitDuration), record.ExecCount) + }, + MaxQueuedRcTimeStr: func(info columnInfo, record *StmtRecord) interface{} { + return int64(record.MaxRUWaitDuration) + }, + ResourceGroupName: func(info columnInfo, record *StmtRecord) interface{} { + return record.ResourceGroupName + }, } func makeColumnFactories(columns []*model.ColumnInfo) []columnFactory { @@ -514,6 +542,13 @@ func avgFloat(sum int64, count int64) float64 { return 0 } +func avgSumFloat(sum float64, count int64) float64 { + if count > 0 { + return sum / float64(count) + } + return 0 +} + func convertEmptyToNil(str string) interface{} { if str == "" { return nil diff --git a/pkg/util/stmtsummary/v2/main_test.go b/pkg/util/stmtsummary/v2/main_test.go index f3ec7e160415a..e697b909ad3f3 100644 --- a/pkg/util/stmtsummary/v2/main_test.go +++ b/pkg/util/stmtsummary/v2/main_test.go @@ -25,6 +25,7 @@ func TestMain(m *testing.M) { testsetup.SetupForCommonTest() opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), diff --git a/pkg/util/stmtsummary/v2/reader_test.go b/pkg/util/stmtsummary/v2/reader_test.go index 0439d431a8994..533bc7ba2ba72 100644 --- a/pkg/util/stmtsummary/v2/reader_test.go +++ b/pkg/util/stmtsummary/v2/reader_test.go @@ -17,6 +17,7 @@ package stmtsummary import ( "bufio" "context" + "fmt" "os" "testing" "time" @@ -59,7 +60,7 @@ func TestStmtFile(t *testing.T) { require.NoError(t, f.file.Close()) }() require.Equal(t, int64(1), f.begin) - require.Equal(t, int64(1672129280), f.end) // 2022-12-27T16-21-20.245 == 1672129280 + require.Equal(t, time.Date(2022, 12, 27, 16, 21, 20, 245000000, time.Local).Unix(), f.end) // Check if seek 0. firstLine, err := util.ReadLine(bufio.NewReader(f.file), maxLineSize) @@ -89,10 +90,11 @@ func TestStmtFileInvalidLine(t *testing.T) { require.NoError(t, f.file.Close()) }() require.Equal(t, int64(1), f.begin) - require.Equal(t, int64(1672129280), f.end) // 2022-12-27T16-21-20.245 == 1672129280 + require.Equal(t, time.Date(2022, 12, 27, 16, 21, 20, 245000000, time.Local).Unix(), f.end) } func TestStmtFiles(t *testing.T) { + t1 := time.Date(2022, 12, 27, 16, 21, 20, 245000000, time.Local) filename1 := "tidb-statements-2022-12-27T16-21-20.245.log" filename2 := "tidb-statements.log" @@ -101,9 +103,9 @@ func TestStmtFiles(t *testing.T) { defer func() { require.NoError(t, os.Remove(filename1)) }() - _, err = file.WriteString("{\"begin\":1672128520,\"end\":1672128530}\n") + _, err = file.WriteString(fmt.Sprintf("{\"begin\":%d,\"end\":%d}\n", t1.Unix()-760, t1.Unix()-750)) require.NoError(t, err) - _, err = file.WriteString("{\"begin\":1672129270,\"end\":1672129280}\n") + _, err = file.WriteString(fmt.Sprintf("{\"begin\":%d,\"end\":%d}\n", t1.Unix()-10, t1.Unix())) require.NoError(t, err) require.NoError(t, file.Close()) @@ -112,9 +114,9 @@ func TestStmtFiles(t *testing.T) { defer func() { require.NoError(t, os.Remove(filename2)) }() - _, err = file.WriteString("{\"begin\":1672129270,\"end\":1672129280}\n") + _, err = file.WriteString(fmt.Sprintf("{\"begin\":%d,\"end\":%d}\n", t1.Unix()-10, t1.Unix())) require.NoError(t, err) - _, err = file.WriteString("{\"begin\":1672129380,\"end\":1672129390}\n") + _, err = file.WriteString(fmt.Sprintf("{\"begin\":%d,\"end\":%d}\n", t1.Unix()+100, t1.Unix()+110)) require.NoError(t, err) require.NoError(t, file.Close()) @@ -129,7 +131,7 @@ func TestStmtFiles(t *testing.T) { func() { files, err := newStmtFiles(context.Background(), []*StmtTimeRange{ - {Begin: 1672129270, End: 1672129271}, + {Begin: t1.Unix() - 10, End: t1.Unix() - 9}, }) require.NoError(t, err) defer files.close() @@ -140,7 +142,7 @@ func TestStmtFiles(t *testing.T) { func() { files, err := newStmtFiles(context.Background(), []*StmtTimeRange{ - {Begin: 0, End: 1672129270}, + {Begin: 0, End: t1.Unix() - 10}, }) require.NoError(t, err) defer files.close() @@ -151,7 +153,7 @@ func TestStmtFiles(t *testing.T) { func() { files, err := newStmtFiles(context.Background(), []*StmtTimeRange{ - {Begin: 0, End: 1672129269}, + {Begin: 0, End: t1.Unix() - 11}, }) require.NoError(t, err) defer files.close() @@ -170,7 +172,7 @@ func TestStmtFiles(t *testing.T) { func() { files, err := newStmtFiles(context.Background(), []*StmtTimeRange{ - {Begin: 1672129281, End: 0}, + {Begin: t1.Unix() + 1, End: 0}, }) require.NoError(t, err) defer files.close() diff --git a/pkg/util/stmtsummary/v2/record.go b/pkg/util/stmtsummary/v2/record.go index 2cc85bac40fa7..fdb87a8da910a 100644 --- a/pkg/util/stmtsummary/v2/record.go +++ b/pkg/util/stmtsummary/v2/record.go @@ -147,6 +147,9 @@ type StmtRecord struct { KeyspaceName string `json:"keyspace_name,omitempty"` KeyspaceID uint32 `json:"keyspace_id,omitempty"` + // request units(RU) + ResourceGroupName string `json:"resource_group_name"` + stmtsummary.StmtRUSummary } // NewStmtRecord creates a new StmtRecord from StmtExecInfo. @@ -201,19 +204,20 @@ func NewStmtRecord(info *stmtsummary.StmtExecInfo) *StmtRecord { // PrevSQL is already truncated to cfg.Log.QueryLogMaxLen. PrevSQL: info.PrevSQL, // SamplePlan needs to be decoded so it can't be truncated. - SamplePlan: samplePlan, - SampleBinaryPlan: binPlan, - PlanHint: planHint, - IndexNames: info.StmtCtx.IndexNames, - MinLatency: info.TotalLatency, - BackoffTypes: make(map[string]int), - AuthUsers: make(map[string]struct{}), - MinResultRows: math.MaxInt64, - Prepared: info.Prepared, - FirstSeen: info.StartTime, - LastSeen: info.StartTime, - KeyspaceName: info.KeyspaceName, - KeyspaceID: info.KeyspaceID, + SamplePlan: samplePlan, + SampleBinaryPlan: binPlan, + PlanHint: planHint, + IndexNames: info.StmtCtx.IndexNames, + MinLatency: info.TotalLatency, + BackoffTypes: make(map[string]int), + AuthUsers: make(map[string]struct{}), + MinResultRows: math.MaxInt64, + Prepared: info.Prepared, + FirstSeen: info.StartTime, + LastSeen: info.StartTime, + KeyspaceName: info.KeyspaceName, + KeyspaceID: info.KeyspaceID, + ResourceGroupName: info.ResourceGroupName, } } @@ -405,6 +409,8 @@ func (r *StmtRecord) Add(info *stmtsummary.StmtExecInfo) { r.SumPDTotal += time.Duration(atomic.LoadInt64(&info.TiKVExecDetails.WaitPDRespDuration)) r.SumBackoffTotal += time.Duration(atomic.LoadInt64(&info.TiKVExecDetails.BackoffDuration)) r.SumWriteSQLRespTotal += info.StmtExecDetails.WriteSQLRespDuration + // RU + r.StmtRUSummary.Add(info.RUDetail) } // Merge merges the statistics of another StmtRecord to this StmtRecord. @@ -559,6 +565,7 @@ func (r *StmtRecord) Merge(other *StmtRecord) { r.SumBackoffTotal += other.SumBackoffTotal r.SumWriteSQLRespTotal += other.SumWriteSQLRespTotal r.SumErrors += other.SumErrors + r.StmtRUSummary.Merge(&other.StmtRUSummary) } // Truncate SQL to maxSQLLength. @@ -659,13 +666,15 @@ func GenerateStmtExecInfo4Test(digest string) *stmtsummary.StmtExecInfo { CalleeAddress: "129", }, }, - StmtCtx: sc, - MemMax: 10000, - DiskMax: 10000, - StartTime: time.Date(2019, 1, 1, 10, 10, 10, 10, time.UTC), - Succeed: true, - KeyspaceName: "keyspace_a", - KeyspaceID: 1, + StmtCtx: sc, + MemMax: 10000, + DiskMax: 10000, + StartTime: time.Date(2019, 1, 1, 10, 10, 10, 10, time.UTC), + Succeed: true, + KeyspaceName: "keyspace_a", + KeyspaceID: 1, + ResourceGroupName: "rg1", + RUDetail: util.NewRUDetailsWith(1.2, 3.4, 2*time.Millisecond), } stmtExecInfo.StmtCtx.AddAffectedRows(10000) return stmtExecInfo diff --git a/pkg/util/stmtsummary/v2/record_test.go b/pkg/util/stmtsummary/v2/record_test.go index 7f0a3ef39a39c..494afb81f548d 100644 --- a/pkg/util/stmtsummary/v2/record_test.go +++ b/pkg/util/stmtsummary/v2/record_test.go @@ -45,6 +45,7 @@ func TestStmtRecord(t *testing.T) { require.Zero(t, record1.ExecCount) require.Zero(t, record1.SumLatency) require.Zero(t, record1.MaxLatency) + require.Equal(t, info.ResourceGroupName, record1.ResourceGroupName) record1.Add(info) require.Len(t, record1.AuthUsers, 1) @@ -53,6 +54,12 @@ func TestStmtRecord(t *testing.T) { require.Equal(t, info.TotalLatency, record1.SumLatency) require.Equal(t, info.TotalLatency, record1.MaxLatency) require.Equal(t, info.TotalLatency, record1.MinLatency) + require.Equal(t, info.RUDetail.RRU(), record1.MaxRRU) + require.Equal(t, info.RUDetail.RRU(), record1.SumRRU) + require.Equal(t, info.RUDetail.WRU(), record1.MaxWRU) + require.Equal(t, info.RUDetail.WRU(), record1.SumWRU) + require.Equal(t, info.RUDetail.RUWaitDuration(), record1.MaxRUWaitDuration) + require.Equal(t, info.RUDetail.RUWaitDuration(), record1.SumRUWaitDuration) record2 := NewStmtRecord(info) record2.Add(info) @@ -63,4 +70,7 @@ func TestStmtRecord(t *testing.T) { require.Equal(t, info.TotalLatency*2, record2.SumLatency) require.Equal(t, info.TotalLatency, record2.MaxLatency) require.Equal(t, info.TotalLatency, record2.MinLatency) + require.Equal(t, info.RUDetail.RRU()*2, record2.SumRRU) + require.Equal(t, info.RUDetail.WRU()*2, record2.SumWRU) + require.Equal(t, info.RUDetail.RUWaitDuration()*2, record2.SumRUWaitDuration) } diff --git a/pkg/util/stmtsummary/v2/stmtsummary.go b/pkg/util/stmtsummary/v2/stmtsummary.go index e7892c3e78535..b827fd2a6970a 100644 --- a/pkg/util/stmtsummary/v2/stmtsummary.go +++ b/pkg/util/stmtsummary/v2/stmtsummary.go @@ -246,10 +246,11 @@ func (s *StmtSummary) Add(info *stmtsummary.StmtExecInfo) { } k := &stmtKey{ - schemaName: info.SchemaName, - digest: info.Digest, - prevDigest: info.PrevSQLDigest, - planDigest: info.PlanDigest, + schemaName: info.SchemaName, + digest: info.Digest, + prevDigest: info.PrevSQLDigest, + planDigest: info.PlanDigest, + resourceGroupName: info.ResourceGroupName, } k.Hash() // Calculate hash value in advance, to reduce the time holding the window lock. @@ -455,6 +456,8 @@ type stmtKey struct { prevDigest string // The digest of the plan of this SQL. planDigest string + // `resourceGroupName` is the resource group's name of this statement is bind to. + resourceGroupName string // `hash` is the hash value of this object. hash []byte } @@ -469,6 +472,7 @@ func (k *stmtKey) Hash() []byte { k.hash = append(k.hash, hack.Slice(k.schemaName)...) k.hash = append(k.hash, hack.Slice(k.prevDigest)...) k.hash = append(k.hash, hack.Slice(k.planDigest)...) + k.hash = append(k.hash, hack.Slice(k.resourceGroupName)...) } return k.hash } diff --git a/pkg/util/stmtsummary/v2/tests/main_test.go b/pkg/util/stmtsummary/v2/tests/main_test.go index c5a825bfa4229..674d17a838ea8 100644 --- a/pkg/util/stmtsummary/v2/tests/main_test.go +++ b/pkg/util/stmtsummary/v2/tests/main_test.go @@ -25,6 +25,7 @@ func TestMain(m *testing.M) { testsetup.SetupForCommonTest() opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), diff --git a/pkg/util/stringutil/main_test.go b/pkg/util/stringutil/main_test.go index fa2992c77d0e9..2378fc0a77d3f 100644 --- a/pkg/util/stringutil/main_test.go +++ b/pkg/util/stringutil/main_test.go @@ -25,6 +25,7 @@ func TestMain(m *testing.M) { testsetup.SetupForCommonTest() opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), } diff --git a/pkg/util/sys/linux/main_test.go b/pkg/util/sys/linux/main_test.go index c106fbc062e85..9f013b7c303e6 100644 --- a/pkg/util/sys/linux/main_test.go +++ b/pkg/util/sys/linux/main_test.go @@ -25,6 +25,7 @@ func TestMain(m *testing.M) { testsetup.SetupForCommonTest() opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), } diff --git a/pkg/util/sys/storage/main_test.go b/pkg/util/sys/storage/main_test.go index 8961a999b8d33..e8a42eeef8e78 100644 --- a/pkg/util/sys/storage/main_test.go +++ b/pkg/util/sys/storage/main_test.go @@ -25,6 +25,7 @@ func TestMain(m *testing.M) { testsetup.SetupForCommonTest() opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), } diff --git a/pkg/util/systimemon/main_test.go b/pkg/util/systimemon/main_test.go index 931b406f4b62a..7849078db5cd0 100644 --- a/pkg/util/systimemon/main_test.go +++ b/pkg/util/systimemon/main_test.go @@ -26,6 +26,7 @@ func TestMain(m *testing.M) { opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("github.com/pingcap/tidb/pkg/util/systimemon.StartMonitor"), } diff --git a/pkg/util/texttree/main_test.go b/pkg/util/texttree/main_test.go index 57a2d78b7347b..d30e6de924861 100644 --- a/pkg/util/texttree/main_test.go +++ b/pkg/util/texttree/main_test.go @@ -25,6 +25,7 @@ func TestMain(m *testing.M) { testsetup.SetupForCommonTest() opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), } diff --git a/pkg/util/tiflashcompute/topo_fetcher.go b/pkg/util/tiflashcompute/topo_fetcher.go index 3b15159aa2636..28bb0bad034df 100644 --- a/pkg/util/tiflashcompute/topo_fetcher.go +++ b/pkg/util/tiflashcompute/topo_fetcher.go @@ -75,6 +75,25 @@ const ( var errTopoFetcher = dbterror.ClassUtil.NewStd(errno.ErrInternal) +// RecoveryType is for MPPErrRecovery. +type RecoveryType uint32 + +const ( + // RecoveryTypeNull means no need to recovery error. + RecoveryTypeNull RecoveryType = iota + // RecoveryTypeMemLimit means need to recovery MemLimit error. + RecoveryTypeMemLimit +) + +func (r *RecoveryType) toString() (string, error) { + if *r == RecoveryTypeNull { + return "Null", nil + } else if *r == RecoveryTypeMemLimit { + return "MemLimit", nil + } + return "", errors.New("unsupported recovery type for topo_fetcher") +} + // TopoFetcher is interface for fetching topo from AutoScaler. // We support the following kinds of AutoScaler for now: // 1. MockAutoScaler: Normally for test, can run in local environment. @@ -82,13 +101,12 @@ var errTopoFetcher = dbterror.ClassUtil.NewStd(errno.ErrInternal) // 3. GCPAutoScaler: AutoScaler runs on GCP. // 4. TestAutoScaler: AutoScaler just for unit test. type TopoFetcher interface { - // Return tiflash compute topo cache, if topo is empty, will fetch topo from AutoScaler. - // If topo is empty after fetch, will return error. - AssureAndGetTopo() ([]string, error) - // Always fetch topo from AutoScaler, then return topo. - // If topo is empty, will not return error. You can call AssureAndGetTopo() to make sure topo is not empty. + // If topo is empty, will not return error. FetchAndGetTopo() ([]string, error) + + // Try recovery error then fetch new topo. + RecoveryAndGetTopo(recovery RecoveryType, oriCNCnt int) ([]string, error) } // IsValidAutoScalerConfig return true if user config of autoscaler type is valid. @@ -163,26 +181,6 @@ func NewMockAutoScalerFetcher(addr string) *MockTopoFetcher { return f } -// AssureAndGetTopo implements TopoFetcher interface. -func (f *MockTopoFetcher) AssureAndGetTopo() ([]string, error) { - curTopo := f.getTopo() - - if len(curTopo) == 0 { - logutil.BgLogger().Info("tiflash compute topo is empty, updating") - err := f.assureTopo(1) - if err != nil { - return nil, err - } - } - - curTopo = f.getTopo() - logutil.BgLogger().Debug("AssureAndGetTopo", zap.Any("topo", curTopo)) - if len(curTopo) == 0 { - return curTopo, errors.New("topo is still empty after updated from mock AutoScaler") - } - return curTopo, nil -} - // FetchAndGetTopo implements TopoFetcher interface. func (f *MockTopoFetcher) FetchAndGetTopo() ([]string, error) { err := f.fetchTopo() @@ -195,6 +193,11 @@ func (f *MockTopoFetcher) FetchAndGetTopo() ([]string, error) { return curTopo, nil } +// RecoveryAndGetTopo implements TopoFetcher interface. +func (*MockTopoFetcher) RecoveryAndGetTopo(RecoveryType, int) ([]string, error) { + return nil, errors.New("RecoveryAndGetTopo not implemented") +} + // getTopo return the cached topo. func (f *MockTopoFetcher) getTopo() []string { f.mu.RLock() @@ -320,19 +323,30 @@ func NewAWSAutoScalerFetcher(addr string, clusterID string, isFixed bool) *AWSTo return f } -// AssureAndGetTopo implements TopoFetcher interface. -func (*AWSTopoFetcher) AssureAndGetTopo() ([]string, error) { - return nil, errors.New("AWSTopoFetcher AssureAndGetTopo not implemented") -} - // FetchAndGetTopo implements TopoFetcher interface. func (f *AWSTopoFetcher) FetchAndGetTopo() (curTopo []string, err error) { + return f.fetchAndGetTopo(RecoveryTypeNull, 0) +} + +// RecoveryAndGetTopo implements TopoFetcher interface. +func (f *AWSTopoFetcher) RecoveryAndGetTopo(recovery RecoveryType, oriCNCnt int) (curTopo []string, err error) { + return f.fetchAndGetTopo(recovery, oriCNCnt) +} + +func (f *AWSTopoFetcher) fetchAndGetTopo(recovery RecoveryType, oriCNCnt int) (curTopo []string, err error) { defer func() { logutil.BgLogger().Info("AWSTopoFetcher FetchAndGetTopo done", zap.Any("curTopo", curTopo)) }() + if recovery != RecoveryTypeNull && recovery != RecoveryTypeMemLimit { + return nil, errors.Errorf("topo_fetcher cannot handle error: %v", recovery) + } + + if recovery == RecoveryTypeMemLimit && oriCNCnt == 0 { + return nil, errors.New("ori CN count should not be zero") + } + if f.isFixedPool { - // todo: delete this when AssureAndGetTopo() is done. curTopo, _ = f.getTopo() if len(curTopo) != 0 { return curTopo, nil @@ -345,7 +359,7 @@ func (f *AWSTopoFetcher) FetchAndGetTopo() (curTopo []string, err error) { return curTopo, nil } - if err = f.fetchTopo(); err != nil { + if err = f.fetchTopo(recovery, oriCNCnt); err != nil { return nil, err } @@ -418,9 +432,19 @@ func (f *AWSTopoFetcher) fetchFixedPoolTopo() error { return nil } -func (f *AWSTopoFetcher) fetchTopo() error { +func (f *AWSTopoFetcher) fetchTopo(recovery RecoveryType, oriCNCnt int) error { para := url.Values{} para.Add("tidbclusterid", f.clusterID) + + if recovery == RecoveryTypeMemLimit { + msg, err := recovery.toString() + if err != nil { + return err + } + para.Add("recovery", msg) + para.Add("cn_cnt", strconv.Itoa(oriCNCnt)) + } + u := url.URL{ Scheme: "http", Host: f.addr, @@ -456,12 +480,12 @@ func NewTestAutoScalerFetcher() *TestTopoFetcher { return &TestTopoFetcher{} } -// AssureAndGetTopo implements TopoFetcher interface. -func (*TestTopoFetcher) AssureAndGetTopo() ([]string, error) { - return []string{}, nil -} - // FetchAndGetTopo implements TopoFetcher interface. func (*TestTopoFetcher) FetchAndGetTopo() ([]string, error) { return []string{}, nil } + +// RecoveryAndGetTopo implements TopoFetcher interface. +func (*TestTopoFetcher) RecoveryAndGetTopo(RecoveryType, int) ([]string, error) { + return nil, errors.New("RecoveryAndGetTopo not implemented") +} diff --git a/pkg/util/timeutil/main_test.go b/pkg/util/timeutil/main_test.go index 430895db6ddb1..61b701541db96 100644 --- a/pkg/util/timeutil/main_test.go +++ b/pkg/util/timeutil/main_test.go @@ -25,6 +25,7 @@ func TestMain(m *testing.M) { testsetup.SetupForCommonTest() opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), } diff --git a/pkg/util/topsql/collector/main_test.go b/pkg/util/topsql/collector/main_test.go index dbbcf9a14ee90..a5f1b170995e8 100644 --- a/pkg/util/topsql/collector/main_test.go +++ b/pkg/util/topsql/collector/main_test.go @@ -31,6 +31,7 @@ func TestMain(m *testing.M) { testsetup.SetupForCommonTest() opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), } diff --git a/pkg/util/topsql/main_test.go b/pkg/util/topsql/main_test.go index 34d5699b9bb9a..e4330ae05a789 100644 --- a/pkg/util/topsql/main_test.go +++ b/pkg/util/topsql/main_test.go @@ -25,6 +25,7 @@ func TestMain(m *testing.M) { testsetup.SetupForCommonTest() opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), } diff --git a/pkg/util/topsql/reporter/main_test.go b/pkg/util/topsql/reporter/main_test.go index bee96b1b93f66..ce020eadf2783 100644 --- a/pkg/util/topsql/reporter/main_test.go +++ b/pkg/util/topsql/reporter/main_test.go @@ -25,6 +25,7 @@ func TestMain(m *testing.M) { testsetup.SetupForCommonTest() opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), } diff --git a/pkg/util/topsql/stmtstats/main_test.go b/pkg/util/topsql/stmtstats/main_test.go index 5c1c4384c3508..2d2c80307f9c6 100644 --- a/pkg/util/topsql/stmtstats/main_test.go +++ b/pkg/util/topsql/stmtstats/main_test.go @@ -25,6 +25,7 @@ func TestMain(m *testing.M) { testsetup.SetupForCommonTest() opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), } diff --git a/pkg/util/tracing/main_test.go b/pkg/util/tracing/main_test.go index 0a11113f6469a..aff3f4039777c 100644 --- a/pkg/util/tracing/main_test.go +++ b/pkg/util/tracing/main_test.go @@ -25,6 +25,7 @@ func TestMain(m *testing.M) { testsetup.SetupForCommonTest() opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), } diff --git a/pkg/util/tracing/util.go b/pkg/util/tracing/util.go index 4c45b61b322f4..74e4df97dfda6 100644 --- a/pkg/util/tracing/util.go +++ b/pkg/util/tracing/util.go @@ -73,6 +73,18 @@ func ChildSpanFromContxt(ctx context.Context, opName string) (opentracing.Span, return noopSpan(), ctx } +// StartRegionWithNewRootSpan return Region together with the context. +// It create and start a new span by globalTracer and store it into `ctx`. +func StartRegionWithNewRootSpan(ctx context.Context, regionType string) (Region, context.Context) { + span := opentracing.GlobalTracer().StartSpan(regionType) + r := Region{ + Region: trace.StartRegion(ctx, regionType), + Span: span, + } + ctx = opentracing.ContextWithSpan(ctx, span) + return r, ctx +} + // StartRegion provides better API, integrating both opentracing and runtime.trace facilities into one. // Recommended usage is // diff --git a/pkg/util/util.go b/pkg/util/util.go index ced69cfbd0bb7..83ca110e11c7a 100644 --- a/pkg/util/util.go +++ b/pkg/util/util.go @@ -300,7 +300,9 @@ func IsInCorrectIdentifierName(name string) bool { // GetRecoverError gets the error from recover. func GetRecoverError(r interface{}) error { if err, ok := r.(error); ok { - return err + // Runtime panic also implements error interface. + // So do not forget to add stack info for it. + return errors.Trace(err) } return errors.Errorf("%v", r) } diff --git a/pkg/util/vitess/main_test.go b/pkg/util/vitess/main_test.go index 911d8b424df13..1aaae6eba9bdc 100644 --- a/pkg/util/vitess/main_test.go +++ b/pkg/util/vitess/main_test.go @@ -25,6 +25,7 @@ func TestMain(m *testing.M) { testsetup.SetupForCommonTest() opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), } diff --git a/pkg/util/wait_group_wrapper.go b/pkg/util/wait_group_wrapper.go index 7685b2e8cf690..d9428004faa05 100644 --- a/pkg/util/wait_group_wrapper.go +++ b/pkg/util/wait_group_wrapper.go @@ -158,6 +158,20 @@ func (w *WaitGroupWrapper) Run(exec func()) { }() } +// Go works like Run, but it also logs on panic. +func (w *WaitGroupWrapper) Go(exec func()) { + w.Add(1) + go func() { + defer w.Done() + defer func() { + if r := recover(); r != nil { + logutil.BgLogger().Error("panic in wait group", zap.Any("recover", r), zap.Stack("stack")) + } + }() + exec() + }() +} + // RunWithRecover wraps goroutine startup call with force recovery, add 1 to WaitGroup // and call done when function return. it will dump current goroutine stack into log if catch any recover result. // exec is that execute logic function. recoverFn is that handler will be called after recover and before dump stack, @@ -229,8 +243,7 @@ func (g *ErrorGroupWithRecover) Go(fn func() error) { g.Group.Go(func() (err error) { defer func() { if r := recover(); r != nil { - // stack is automatically printed - logutil.BgLogger().Error("panic in error group", zap.Any("recover", r)) + logutil.BgLogger().Error("panic in error group", zap.Any("recover", r), zap.Stack("stack")) err = GetRecoverError(r) } }() diff --git a/pkg/util/wait_group_wrapper_test.go b/pkg/util/wait_group_wrapper_test.go index 00eb606faf36b..7c18a437fbc70 100644 --- a/pkg/util/wait_group_wrapper_test.go +++ b/pkg/util/wait_group_wrapper_test.go @@ -16,9 +16,12 @@ package util import ( "fmt" + "os" + "path" "testing" "time" + "github.com/pingcap/tidb/pkg/util/logutil" "github.com/stretchr/testify/require" "go.uber.org/atomic" ) @@ -91,11 +94,52 @@ func TestWaitGroupWrapperCheck(t *testing.T) { require.False(t, wg.check()) } +func TestWaitGroupWrapperGo(t *testing.T) { + file, fileName := prepareStdoutLogger(t) + var wg WaitGroupWrapper + wg.Go(func() { + middleF() + }) + wg.Wait() + require.NoError(t, file.Close()) + content, err := os.ReadFile(fileName) + require.NoError(t, err) + require.Contains(t, string(content), "pkg/util.middleF") +} + +func prepareStdoutLogger(t *testing.T) (*os.File, string) { + bak := os.Stdout + t.Cleanup(func() { + os.Stdout = bak + }) + tempDir := t.TempDir() + fileName := path.Join(tempDir, "test.log") + file, err := os.OpenFile(fileName, os.O_CREATE|os.O_WRONLY, 0644) + require.NoError(t, err) + os.Stdout = file + // InitLogger contains zap.AddStacktrace(zapcore.FatalLevel), so log level + // below fatal will not contain stack automatically. + require.NoError(t, logutil.InitLogger(&logutil.LogConfig{})) + + return file, fileName +} + +func middleF() { + var a int + _ = 10 / a +} + func TestNewErrorGroupWithRecover(t *testing.T) { + file, fileName := prepareStdoutLogger(t) eg := NewErrorGroupWithRecover() eg.Go(func() error { - panic("test") + middleF() + return nil }) err := eg.Wait() - require.Errorf(t, err, "test") + require.ErrorContains(t, err, "runtime error: integer divide by zero") + require.NoError(t, file.Close()) + content, err := os.ReadFile(fileName) + require.NoError(t, err) + require.Contains(t, string(content), "pkg/util.middleF") } diff --git a/tests/globalkilltest/BUILD.bazel b/tests/globalkilltest/BUILD.bazel index ad929a04e2df0..81e43a1c2af77 100644 --- a/tests/globalkilltest/BUILD.bazel +++ b/tests/globalkilltest/BUILD.bazel @@ -1,4 +1,4 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_test") +load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") go_test( name = "globalkilltest_test", @@ -7,6 +7,7 @@ go_test( "global_kill_test.go", "main_test.go", ], + embed = [":globalkilltest"], flaky = True, deps = [ "//pkg/testkit/testsetup", @@ -21,3 +22,17 @@ go_test( "@org_uber_go_zap//:zap", ], ) + +go_library( + name = "globalkilltest", + srcs = ["util.go"], + importpath = "github.com/pingcap/tidb/tests/globalkilltest", + visibility = ["//visibility:public"], + deps = [ + "//pkg/server", + "//pkg/util", + "@com_github_pingcap_errors//:errors", + "@com_github_pingcap_log//:log", + "@org_uber_go_zap//:zap", + ], +) diff --git a/tests/globalkilltest/Dockerfile b/tests/globalkilltest/Dockerfile index 0d90ea007145f..331cacd1016ea 100644 --- a/tests/globalkilltest/Dockerfile +++ b/tests/globalkilltest/Dockerfile @@ -17,7 +17,7 @@ FROM rockylinux:9 RUN dnf update -y && dnf groupinstall 'Development Tools' -y RUN dnf install procps-ng mysql -y -ENV GOLANG_VERSION 1.21.1 +ENV GOLANG_VERSION 1.21.6 ENV ARCH amd64 ENV GOLANG_DOWNLOAD_URL https://dl.google.com/go/go$GOLANG_VERSION.linux-$ARCH.tar.gz ENV GOPATH /go diff --git a/tests/globalkilltest/global_kill_test.go b/tests/globalkilltest/global_kill_test.go index f6d6210d35fd6..8420c91cb0dc5 100644 --- a/tests/globalkilltest/global_kill_test.go +++ b/tests/globalkilltest/global_kill_test.go @@ -58,8 +58,9 @@ var ( ) const ( - waitToStartup = 500 * time.Millisecond - msgErrConnectPD = "connect PD err: %v. Establish a cluster with PD & TiKV, and provide PD client path by `--pd=[,]" + waitToStartup = 500 * time.Millisecond + msgErrConnectPD = "connect PD err: %v. Establish a cluster with PD & TiKV, and provide PD client path by `--pd=[,]" + timeoutConnectDB = 20 * time.Second ) // GlobalKillSuite is used for automated test of "Global Kill" feature. @@ -170,8 +171,7 @@ func (s *GlobalKillSuite) startTiKV(dataDir string) (err error) { if err != nil { return errors.Trace(err) } - time.Sleep(500 * time.Millisecond) - return nil + return errors.Trace(checkTiKVStatus()) } func (s *GlobalKillSuite) startPD(dataDir string) (err error) { @@ -185,8 +185,7 @@ func (s *GlobalKillSuite) startPD(dataDir string) (err error) { if err != nil { return errors.Trace(err) } - time.Sleep(500 * time.Millisecond) - return nil + return errors.Trace(checkPDHealth(*pdClientPath)) } func (s *GlobalKillSuite) startCluster() (err error) { @@ -199,7 +198,6 @@ func (s *GlobalKillSuite) startCluster() (err error) { if err != nil { return errors.Trace(err) } - time.Sleep(10 * time.Second) return nil } @@ -266,8 +264,7 @@ func (s *GlobalKillSuite) startTiDBWithoutPD(port int, statusPort int) (cmd *exe if err != nil { return nil, errors.Trace(err) } - time.Sleep(500 * time.Millisecond) - return cmd, nil + return cmd, errors.Trace(checkTiDBStatus(statusPort)) } func (s *GlobalKillSuite) startTiDBWithPD(port int, statusPort int, pdPath string) (cmd *exec.Cmd, err error) { @@ -285,8 +282,7 @@ func (s *GlobalKillSuite) startTiDBWithPD(port int, statusPort int, pdPath strin if err != nil { return nil, errors.Trace(err) } - time.Sleep(500 * time.Millisecond) - return cmd, nil + return cmd, errors.Trace(checkTiDBStatus(statusPort)) } func (s *GlobalKillSuite) mustStartTiDBWithPD(t *testing.T, port int, statusPort int, pdPath string) *exec.Cmd { @@ -335,9 +331,8 @@ func (s *GlobalKillSuite) connectTiDB(port int) (db *sql.DB, err error) { dsn := fmt.Sprintf("root@(%s)/test", addr) sleepTime := 250 * time.Millisecond sleepTimeLimit := 1 * time.Second - maxRetryDuration := 20 * time.Second startTime := time.Now() - for i := 0; time.Since(startTime) < maxRetryDuration; i++ { + for i := 0; time.Since(startTime) < timeoutConnectDB; i++ { db, err = sql.Open("mysql", dsn) if err != nil { log.Warn("open addr failed", diff --git a/tests/globalkilltest/util.go b/tests/globalkilltest/util.go new file mode 100644 index 0000000000000..07ed44d0b98ab --- /dev/null +++ b/tests/globalkilltest/util.go @@ -0,0 +1,134 @@ +// Copyright 2023 PingCAP, 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. + +package globalkilltest + +import ( + "encoding/json" + "fmt" + "net/http" + "time" + + "github.com/pingcap/errors" + "github.com/pingcap/log" + "github.com/pingcap/tidb/pkg/server" + "github.com/pingcap/tidb/pkg/util" + "go.uber.org/zap" +) + +const ( + timeoutCheckPDStatus = 10 * time.Second + timeoutCheckTiKVStatus = 30 * time.Second + timeoutCheckTiDBStatus = 60 * time.Second // First start up of TiDB would take a long time. + + retryInterval = 500 * time.Millisecond +) + +func withRetry[T any](fn func() (T, error), timeout time.Duration) (resp T, err error) { + startTime := time.Now() + retry := 0 + for time.Since(startTime) < timeout { + retry += 1 + resp, err = fn() + if err == nil { + break + } + log.Debug("withRetry", zap.Error(err), zap.Int("retry", retry)) + time.Sleep(retryInterval) + } + return resp, errors.Trace(err) +} + +func checkPDHealth(host string) error { + url := util.ComposeURL(host, "/health") + + request := func() (interface{}, error) { + resp, err := util.InternalHTTPClient().Get(url) + if err != nil { + return nil, errors.Trace(err) + } + + if resp.StatusCode != http.StatusOK { + return nil, fmt.Errorf("PD health status code %d", resp.StatusCode) + } + defer resp.Body.Close() + var health struct { + Health string `json:"health"` + } + dec := json.NewDecoder(resp.Body) + err = dec.Decode(&health) + if err != nil { + return nil, errors.Trace(err) + } + + log.Info("PD health", zap.Any("health", health)) + if health.Health != "true" { + return nil, fmt.Errorf("PD not healthy %v", health.Health) + } + return nil, nil + } + + _, err := withRetry(request, timeoutCheckPDStatus) + return errors.Trace(err) +} + +func checkTiKVStatus() error { + url := util.ComposeURL("127.0.0.1:20180", "/status") + + request := func() (interface{}, error) { + resp, err := util.InternalHTTPClient().Get(url) + if err != nil { + return nil, errors.Trace(err) + } + + log.Info("TiKV status", zap.Any("status", resp.StatusCode)) + if resp.StatusCode != http.StatusOK { + return nil, fmt.Errorf("TiKV status code %d", resp.StatusCode) + } + resp.Body.Close() + return nil, nil + } + + _, err := withRetry(request, timeoutCheckTiKVStatus) + return errors.Trace(err) +} + +func checkTiDBStatus(statusPort int) error { + host := fmt.Sprintf("127.0.0.1:%d", statusPort) + url := util.ComposeURL(host, "/status") + + request := func() (interface{}, error) { + resp, err := util.InternalHTTPClient().Get(url) + if err != nil { + return nil, errors.Trace(err) + } + + if resp.StatusCode != http.StatusOK { + return nil, fmt.Errorf("TiDB status code %d", resp.StatusCode) + } + defer resp.Body.Close() + var status server.Status + dec := json.NewDecoder(resp.Body) + err = dec.Decode(&status) + if err != nil { + return nil, errors.Trace(err) + } + + log.Info("TiDB status", zap.Any("status", status)) + return nil, nil + } + + _, err := withRetry(request, timeoutCheckTiDBStatus) + return errors.Trace(err) +} diff --git a/tests/graceshutdown/main_test.go b/tests/graceshutdown/main_test.go index f72736582352a..35d723b38e152 100644 --- a/tests/graceshutdown/main_test.go +++ b/tests/graceshutdown/main_test.go @@ -25,6 +25,7 @@ func TestMain(m *testing.M) { testsetup.SetupForCommonTest() opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("syscall.syscall6"), } diff --git a/tests/integrationtest/config.toml b/tests/integrationtest/config.toml index 4b2c1112b42c4..9653b7bad7864 100644 --- a/tests/integrationtest/config.toml +++ b/tests/integrationtest/config.toml @@ -15,6 +15,7 @@ lease = "0" host = "127.0.0.1" new_collations_enabled_on_first_bootstrap = true +enable-table-lock = true [status] status-host = "127.0.0.1" diff --git a/tests/integrationtest/disable_new_collation.toml b/tests/integrationtest/disable_new_collation.toml index 928e2a14633cc..4d8c5ed9cdc1b 100644 --- a/tests/integrationtest/disable_new_collation.toml +++ b/tests/integrationtest/disable_new_collation.toml @@ -15,6 +15,7 @@ lease = "0" host = "127.0.0.1" new_collations_enabled_on_first_bootstrap = false +enable-table-lock = true [status] status-host = "127.0.0.1" diff --git a/tests/integrationtest/r/bindinfo/bind.result b/tests/integrationtest/r/bindinfo/bind.result index 400aeaad6dc58..e574970576b15 100644 --- a/tests/integrationtest/r/bindinfo/bind.result +++ b/tests/integrationtest/r/bindinfo/bind.result @@ -370,11 +370,11 @@ select * from `bindinfo__bind` . `t` where `a` in ( ... ) SELECT * FROM `bindinf set binding disabled for select * from t where a in(1); show global bindings where original_sql like '%bindinfo__bind%'; Original_sql Bind_sql Default_db Status Create_time Update_time Charset Collation Source Sql_digest Plan_digest -select * from `bindinfo__bind` . `t` where `a` in ( ... ) SELECT * FROM `bindinfo__bind`.`t` WHERE `a` IN (1) disabled utf8mb4 utf8mb4_general_ci manual b67d59db636eefe4353553308079b13a6e0ea71235906ab3ce0c7f9e99c06ed8 +select * from `bindinfo__bind` . `t` where `a` in ( ... ) SELECT * FROM `bindinfo__bind`.`t` WHERE `a` IN (1) bindinfo__bind enabled utf8mb4 utf8mb4_general_ci manual b67d59db636eefe4353553308079b13a6e0ea71235906ab3ce0c7f9e99c06ed8 set binding enabled for select * from t where a in(1,2,3,4,5); show global bindings where original_sql like '%bindinfo__bind%'; Original_sql Bind_sql Default_db Status Create_time Update_time Charset Collation Source Sql_digest Plan_digest -select * from `bindinfo__bind` . `t` where `a` in ( ... ) SELECT * FROM `bindinfo__bind`.`t` WHERE `a` IN (1) enabled utf8mb4 utf8mb4_general_ci manual b67d59db636eefe4353553308079b13a6e0ea71235906ab3ce0c7f9e99c06ed8 +select * from `bindinfo__bind` . `t` where `a` in ( ... ) SELECT * FROM `bindinfo__bind`.`t` WHERE `a` IN (1) bindinfo__bind enabled utf8mb4 utf8mb4_general_ci manual b67d59db636eefe4353553308079b13a6e0ea71235906ab3ce0c7f9e99c06ed8 drop global binding for select * from t where a in(1,2,3); drop table if exists t; create table t (a varchar(10) CHARACTER SET utf8); diff --git a/tests/integrationtest/r/collation_agg_func_disabled.result b/tests/integrationtest/r/collation_agg_func_disabled.result index 8e911e701c027..a49920b66d6ad 100644 --- a/tests/integrationtest/r/collation_agg_func_disabled.result +++ b/tests/integrationtest/r/collation_agg_func_disabled.result @@ -131,13 +131,10 @@ approx_count_distinct(value collate utf8mb4_bin, value1) create table tt(a char(10), b enum('a', 'B', 'c'), c set('a', 'B', 'c'), d json) collate utf8mb4_general_ci; insert into tt values ("a", "a", "a", JSON_OBJECT("a", "a")); insert into tt values ("A", "A", "A", JSON_OBJECT("A", "A")); -Error 1265 (01000): Data truncated for column 'b' at row 1 insert into tt values ("b", "b", "b", JSON_OBJECT("b", "b")); -Error 1265 (01000): Data truncated for column 'b' at row 1 insert into tt values ("B", "B", "B", JSON_OBJECT("B", "B")); insert into tt values ("c", "c", "c", JSON_OBJECT("c", "c")); insert into tt values ("C", "C", "C", JSON_OBJECT("C", "C")); -Error 1265 (01000): Data truncated for column 'b' at row 1 split table tt by (0), (1), (2), (3), (4), (5); TOTAL_SPLIT_REGION SCATTER_FINISH_RATIO 6 1 diff --git a/tests/integrationtest/r/collation_check_use_collation_disabled.result b/tests/integrationtest/r/collation_check_use_collation_disabled.result index 187944472605b..245c5292b0b7f 100644 --- a/tests/integrationtest/r/collation_check_use_collation_disabled.result +++ b/tests/integrationtest/r/collation_check_use_collation_disabled.result @@ -30,7 +30,6 @@ drop table if exists t; create table t(a enum('a', 'b') charset utf8mb4 collate utf8mb4_general_ci, b varchar(20)); insert into t values ("b", "c"); insert into t values ("B", "b"); -Error 1265 (01000): Data truncated for column 'a' at row 1 select * from t where 'B' collate utf8mb4_general_ci in (a); a b select * from t where 'B' collate utf8mb4_bin in (a); @@ -80,7 +79,6 @@ drop table if exists t; create table t(a set('a', 'b') charset utf8mb4 collate utf8mb4_general_ci, b varchar(20)); insert into t values ("b", "c"); insert into t values ("B", "b"); -Error 1265 (01000): Data truncated for column 'a' at row 1 select * from t where 'B' collate utf8mb4_general_ci in (a); a b select * from t where 'B' collate utf8mb4_bin in (a); diff --git a/tests/integrationtest/r/collation_misc_disabled.result b/tests/integrationtest/r/collation_misc_disabled.result index 3ade6d0088237..035de1187efa1 100644 --- a/tests/integrationtest/r/collation_misc_disabled.result +++ b/tests/integrationtest/r/collation_misc_disabled.result @@ -38,9 +38,9 @@ Error 8200 (HY000): Unsupported modify charset from latin1 to utf8 alter table t modify column a varchar(20) charset utf8mb4 collate utf8bin; Error 1273 (HY000): Unknown collation: 'utf8bin' alter table t collate LATIN1_GENERAL_CI charset utf8 collate utf8_bin; -Error 1302 (HY000): Conflicting declarations: 'CHARACTER SET latin1' and 'CHARACTER SET utf8' +Got one of the listed errors alter table t collate LATIN1_GENERAL_CI collate UTF8MB4_UNICODE_ci collate utf8_bin; -Error 1253 (42000): COLLATION 'utf8mb4_unicode_ci' is not valid for CHARACTER SET 'latin1' +Got one of the listed errors drop table t; create table t(a varchar(20) charset latin1); insert into t values ("t_value"); diff --git a/tests/integrationtest/r/collation_misc_enabled.result b/tests/integrationtest/r/collation_misc_enabled.result index 77cc520dba40a..bee35b7f1bd7d 100644 --- a/tests/integrationtest/r/collation_misc_enabled.result +++ b/tests/integrationtest/r/collation_misc_enabled.result @@ -38,9 +38,9 @@ Error 8200 (HY000): Unsupported modify charset from latin1 to utf8 alter table t modify column a varchar(20) charset utf8mb4 collate utf8bin; Error 1273 (HY000): Unknown collation: 'utf8bin' alter table t collate LATIN1_GENERAL_CI charset utf8 collate utf8_bin; -Error 1273 (HY000): Unsupported collation when new collation is enabled: 'latin1_general_ci' +Got one of the listed errors alter table t collate LATIN1_GENERAL_CI collate UTF8MB4_UNICODE_ci collate utf8_bin; -Error 1273 (HY000): Unsupported collation when new collation is enabled: 'latin1_general_ci' +Got one of the listed errors drop table t; create table t(a varchar(20) charset latin1); insert into t values ("t_value"); @@ -51,7 +51,6 @@ a t_value create database if not exists cd_test_utf8 CHARACTER SET utf8 COLLATE utf8_bin; create database if not exists cd_test_latin1 CHARACTER SET latin1 COLLATE latin1_swedish_ci; -Error 1273 (HY000): Unsupported collation when new collation is enabled: 'latin1_swedish_ci' use cd_test_utf8; select @@character_set_database; @@character_set_database @@ -60,7 +59,6 @@ select @@collation_database; @@collation_database utf8_bin use cd_test_latin1; -Error 1049 (42000): Unknown database 'cd_test_latin1' select @@character_set_database; @@character_set_database utf8 @@ -68,7 +66,6 @@ select @@collation_database; @@collation_database utf8_bin create database if not exists test_db CHARACTER SET latin1 COLLATE latin1_swedish_ci; -Error 1273 (HY000): Unsupported collation when new collation is enabled: 'latin1_swedish_ci' with cte as (select cast('2010-09-09' as date) a union select '2010-09-09 ') select count(*) from cte; count(*) 1 diff --git a/tests/integrationtest/r/db_integration.result b/tests/integrationtest/r/db_integration.result new file mode 100644 index 0000000000000..be0df44591bf1 --- /dev/null +++ b/tests/integrationtest/r/db_integration.result @@ -0,0 +1,33 @@ +DROP TABLE IF EXISTS u1,u2; +CREATE TABLE u1 (id INT PRIMARY KEY, c1 VARCHAR(36) DEFAULT UUID()); +CREATE TABLE u2 (id INT PRIMARY KEY, c1 VARBINARY(16) DEFAULT UUID_TO_BIN(UUID())); +ALTER TABLE u1 ADD COLUMN c2 VARCHAR(36) DEFAULT (UUID()); +Error 1674 (HY000): Statement is unsafe because it uses a system function that may return a different value on the slave +ALTER TABLE u2 ADD COLUMN c2 VARBINARY(16) DEFAULT UUID_TO_BIN(UUID(), 1); +Error 1674 (HY000): Statement is unsafe because it uses a system function that may return a different value on the slave +INSERT INTO u1(id) VALUES (1),(2),(3); +INSERT INTO u2(id) VALUES (1),(2),(3); +SELECT IS_UUID(c1) FROM u1; +IS_UUID(c1) +1 +1 +1 +SELECT IS_UUID(BIN_TO_UUID(c1)) FROM u2; +IS_UUID(BIN_TO_UUID(c1)) +1 +1 +1 +SHOW CREATE TABLE u1; +Table Create Table +u1 CREATE TABLE `u1` ( + `id` int(11) NOT NULL, + `c1` varchar(36) DEFAULT uuid(), + PRIMARY KEY (`id`) /*T![clustered_index] CLUSTERED */ +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin +SHOW CREATE TABLE u2; +Table Create Table +u2 CREATE TABLE `u2` ( + `id` int(11) NOT NULL, + `c1` varbinary(16) DEFAULT uuid_to_bin(uuid()), + PRIMARY KEY (`id`) /*T![clustered_index] CLUSTERED */ +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin diff --git a/tests/integrationtest/r/ddl/bdr_mode.result b/tests/integrationtest/r/ddl/bdr_mode.result new file mode 100644 index 0000000000000..bdfd9a9c361ba --- /dev/null +++ b/tests/integrationtest/r/ddl/bdr_mode.result @@ -0,0 +1,483 @@ +create database bdr_mode; +use bdr_mode; +admin set bdr role primary; +create table t(a int); +alter table t add column b int; +alter table t drop column b; +Error 8263 (HY000): The operation is not allowed while the bdr role of this cluster is set to primary. +alter table t add index idx_a(a); +alter table t alter index idx_a invisible; +alter table t alter index idx_a visible; +alter table t rename index idx_a to idx_a_2; +alter table t drop index idx_a_2; +create table t2(a int, primary key (a)); +rename table t to t3, t2 to t4; +Error 8263 (HY000): The operation is not allowed while the bdr role of this cluster is set to primary. +alter table t add foreign key (a) references t2(a); +Error 8263 (HY000): The operation is not allowed while the bdr role of this cluster is set to primary. +admin unset bdr role; +alter table t add foreign key (a) references t2(a); +admin set bdr role primary; +alter table t drop foreign key fk_1; +Error 8263 (HY000): The operation is not allowed while the bdr role of this cluster is set to primary. +admin unset bdr role; +alter table t drop foreign key fk_1; +alter table t drop index fk_1; +admin set bdr role primary; +truncate table t2; +Error 8263 (HY000): The operation is not allowed while the bdr role of this cluster is set to primary. +drop table t2; +Error 8263 (HY000): The operation is not allowed while the bdr role of this cluster is set to primary. +alter table t modify column a bigint; +Error 8263 (HY000): The operation is not allowed while the bdr role of this cluster is set to primary. +alter table t auto_increment = 6000; +Error 8263 (HY000): The operation is not allowed while the bdr role of this cluster is set to primary. +alter table t alter column a set default 1; +alter table t shard_row_id_bits = 4; +Error 8263 (HY000): The operation is not allowed while the bdr role of this cluster is set to primary. +alter table t comment = 'test'; +admin unset bdr role; +drop table t; +drop table t2; +admin set bdr role primary; +create table t(a int) partition by range(a) ( +partition p0 values less than (5), +partition p1 values less than (10), +partition p2 values less than (15)); +alter table t add partition (partition p3 values less than (100)); +create placement policy pp4 followers=4; +alter table t placement policy=pp4; +Error 8263 (HY000): The operation is not allowed while the bdr role of this cluster is set to primary. +alter table t partition p3 placement policy=pp4; +Error 8263 (HY000): The operation is not allowed while the bdr role of this cluster is set to primary. +alter database bdr_mode placement policy=pp4; +Error 8263 (HY000): The operation is not allowed while the bdr role of this cluster is set to primary. +alter placement policy pp4 followers=3; +alter table t placement policy=default; +Error 8263 (HY000): The operation is not allowed while the bdr role of this cluster is set to primary. +alter table t partition p3 placement policy=default; +Error 8263 (HY000): The operation is not allowed while the bdr role of this cluster is set to primary. +alter database bdr_mode placement policy=default; +Error 8263 (HY000): The operation is not allowed while the bdr role of this cluster is set to primary. +drop placement policy pp4; +alter table t attributes="merge_option=allow"; +Error 8263 (HY000): The operation is not allowed while the bdr role of this cluster is set to primary. +alter table t partition p3 attributes="key1=value1"; +Error 8263 (HY000): The operation is not allowed while the bdr role of this cluster is set to primary. +create table t2(a int); +alter table t exchange partition p0 with table t2; +Error 8263 (HY000): The operation is not allowed while the bdr role of this cluster is set to primary. +alter table t truncate partition p0; +Error 8263 (HY000): The operation is not allowed while the bdr role of this cluster is set to primary. +alter table t reorganize partition p0 into +( +partition p4 values less than (0), +partition p5 values less than (5) +); +Error 8263 (HY000): The operation is not allowed while the bdr role of this cluster is set to primary. +alter table t drop partition p0; +Error 8263 (HY000): The operation is not allowed while the bdr role of this cluster is set to primary. +admin unset bdr role; +drop table t2; +admin set bdr role primary; +create placement policy pp1 followers=1; +alter table t partition by range (a) (partition p0 values less than (1000000), partition pMax values less than (maxvalue) placement policy pp1); +Error 8263 (HY000): The operation is not allowed while the bdr role of this cluster is set to primary. +admin unset bdr role; +drop table t; +admin set bdr role primary; +drop placement policy pp1; +create table t(a int); +set global tidb_enable_check_constraint=ON; +alter table t add constraint `a_check` check(a > 0); +Error 8263 (HY000): The operation is not allowed while the bdr role of this cluster is set to primary. +admin unset bdr role; +alter table t add constraint `a_check` check(a > 0); +admin set bdr role primary; +alter table t alter constraint `a_check` enforced; +Error 8263 (HY000): The operation is not allowed while the bdr role of this cluster is set to primary. +alter table t drop constraint `a_check`; +Error 8263 (HY000): The operation is not allowed while the bdr role of this cluster is set to primary. +admin unset bdr role; +alter table t drop constraint `a_check`; +admin set bdr role primary; +set global tidb_enable_check_constraint=OFF; +alter table t cache; +Error 8263 (HY000): The operation is not allowed while the bdr role of this cluster is set to primary. +admin unset bdr role; +alter table t cache; +admin set bdr role primary; +alter table t nocache; +Error 8263 (HY000): The operation is not allowed while the bdr role of this cluster is set to primary. +admin unset bdr role; +alter table t nocache; +admin set bdr role primary; +CREATE TABLE ttl_test (created_at datetime) TTL = `created_at` + INTERVAL 5 DAY; +ALTER TABLE ttl_test TTL = `created_at` + INTERVAL 2 YEAR; +alter table ttl_test remove ttl; +admin unset bdr role; +drop table ttl_test; +admin set bdr role primary; +alter table t add primary key (a); +Error 8263 (HY000): The operation is not allowed while the bdr role of this cluster is set to primary. +admin unset bdr role; +alter table t add primary key (a); +admin set bdr role primary; +alter table t drop primary key; +alter table t add unique index (a); +Error 8263 (HY000): The operation is not allowed while the bdr role of this cluster is set to primary. +alter table t auto_id_cache = 10; +Error 8263 (HY000): The operation is not allowed while the bdr role of this cluster is set to primary. +create table t_random(a bigint auto_random, primary key (a)); +alter table t_random auto_random_base = 10; +Error 8263 (HY000): The operation is not allowed while the bdr role of this cluster is set to primary. +admin unset bdr role; +drop table t_random; +admin set bdr role primary; +create sequence seq; +Error 8263 (HY000): The operation is not allowed while the bdr role of this cluster is set to primary. +admin unset bdr role; +create sequence seq; +admin set bdr role primary; +alter sequence seq restart; +Error 8263 (HY000): The operation is not allowed while the bdr role of this cluster is set to primary. +drop sequence seq; +Error 8263 (HY000): The operation is not allowed while the bdr role of this cluster is set to primary. +admin unset bdr role; +drop sequence seq; +admin set bdr role primary; +create view v as select 1 as b; +drop view v; +alter table t charset utf8mb4 collate utf8mb4_unicode_ci; +Error 8263 (HY000): The operation is not allowed while the bdr role of this cluster is set to primary. +alter database bdr_mode default character set = utf8; +Error 8263 (HY000): The operation is not allowed while the bdr role of this cluster is set to primary. +admin unset bdr role; +drop database bdr_mode; +admin set bdr role primary; +create resource group rg1 ru_per_sec = 100; +create user user1; +alter user `user1` resource group `rg1`; +alter resource group rg1 ru_per_sec = 200; +drop user user1; +drop resource group if exists rg1; +create database bdr_mode; +use bdr_mode; +create table t(a int, b int); +admin set bdr role secondary; +alter table t add column c int; +Error 8263 (HY000): The operation is not allowed while the bdr role of this cluster is set to secondary. +alter table t drop column b; +Error 8263 (HY000): The operation is not allowed while the bdr role of this cluster is set to secondary. +alter table t add index idx_a(a); +Error 8263 (HY000): The operation is not allowed while the bdr role of this cluster is set to secondary. +admin unset bdr role; +alter table t add index idx_a(a); +admin set bdr role secondary; +alter table t alter index idx_a invisible; +Error 8263 (HY000): The operation is not allowed while the bdr role of this cluster is set to secondary. +admin unset bdr role; +alter table t alter index idx_a invisible; +admin set bdr role secondary; +alter table t alter index idx_a visible; +Error 8263 (HY000): The operation is not allowed while the bdr role of this cluster is set to secondary. +alter table t rename index idx_a to idx_a_2; +Error 8263 (HY000): The operation is not allowed while the bdr role of this cluster is set to secondary. +alter table t drop index idx_a; +Error 8263 (HY000): The operation is not allowed while the bdr role of this cluster is set to secondary. +admin unset bdr role; +alter table t drop index idx_a; +create table t2(a int, primary key (a)); +admin set bdr role secondary; +rename table t to t3, t2 to t4; +Error 8263 (HY000): The operation is not allowed while the bdr role of this cluster is set to secondary. +alter table t add foreign key (a) references t2(a); +Error 8263 (HY000): The operation is not allowed while the bdr role of this cluster is set to secondary. +admin unset bdr role; +alter table t add foreign key (a) references t2(a); +admin set bdr role secondary; +alter table t drop foreign key fk_1; +Error 8263 (HY000): The operation is not allowed while the bdr role of this cluster is set to secondary. +admin unset bdr role; +alter table t drop foreign key fk_1; +alter table t drop index fk_1; +admin set bdr role secondary; +truncate table t2; +Error 8263 (HY000): The operation is not allowed while the bdr role of this cluster is set to secondary. +drop table t2; +Error 8263 (HY000): The operation is not allowed while the bdr role of this cluster is set to secondary. +alter table t modify column a bigint; +Error 8263 (HY000): The operation is not allowed while the bdr role of this cluster is set to secondary. +alter table t auto_increment = 6000; +Error 8263 (HY000): The operation is not allowed while the bdr role of this cluster is set to secondary. +alter table t alter column a set default 1; +Error 8263 (HY000): The operation is not allowed while the bdr role of this cluster is set to secondary. +alter table t shard_row_id_bits = 4; +Error 8263 (HY000): The operation is not allowed while the bdr role of this cluster is set to secondary. +alter table t comment = 'test'; +Error 8263 (HY000): The operation is not allowed while the bdr role of this cluster is set to secondary. +admin unset bdr role; +drop table t; +drop table t2; +admin set bdr role secondary; +create table t(a int) partition by range(a) ( +partition p0 values less than (5), +partition p1 values less than (10), +partition p2 values less than (15)); +Error 8263 (HY000): The operation is not allowed while the bdr role of this cluster is set to secondary. +admin unset bdr role; +create table t(a int) partition by range(a) ( +partition p0 values less than (5), +partition p1 values less than (10), +partition p2 values less than (15)); +admin set bdr role secondary; +alter table t add partition (partition p3 values less than (100)); +Error 8263 (HY000): The operation is not allowed while the bdr role of this cluster is set to secondary. +create placement policy pp4 followers=4; +alter table t placement policy=pp4; +Error 8263 (HY000): The operation is not allowed while the bdr role of this cluster is set to secondary. +alter table t partition p2 placement policy=pp4; +Error 8263 (HY000): The operation is not allowed while the bdr role of this cluster is set to secondary. +alter database bdr_mode placement policy=pp4; +Error 8263 (HY000): The operation is not allowed while the bdr role of this cluster is set to secondary. +alter placement policy pp4 followers=3; +alter table t placement policy=default; +Error 8263 (HY000): The operation is not allowed while the bdr role of this cluster is set to secondary. +alter table t partition p2 placement policy=default; +Error 8263 (HY000): The operation is not allowed while the bdr role of this cluster is set to secondary. +alter database bdr_mode placement policy=default; +Error 8263 (HY000): The operation is not allowed while the bdr role of this cluster is set to secondary. +drop placement policy pp4; +alter table t attributes="merge_option=allow"; +Error 8263 (HY000): The operation is not allowed while the bdr role of this cluster is set to secondary. +alter table t partition p2 attributes="key1=value1"; +Error 8263 (HY000): The operation is not allowed while the bdr role of this cluster is set to secondary. +admin unset bdr role; +create table t2(a int); +admin set bdr role secondary; +alter table t exchange partition p0 with table t2; +Error 8263 (HY000): The operation is not allowed while the bdr role of this cluster is set to secondary. +alter table t truncate partition p0; +Error 8263 (HY000): The operation is not allowed while the bdr role of this cluster is set to secondary. +alter table t reorganize partition p0 into +( +partition p4 values less than (0), +partition p5 values less than (5) +); +Error 8263 (HY000): The operation is not allowed while the bdr role of this cluster is set to secondary. +alter table t drop partition p2; +Error 8263 (HY000): The operation is not allowed while the bdr role of this cluster is set to secondary. +admin unset bdr role; +drop table t2; +admin set bdr role secondary; +create placement policy pp1 followers=1; +alter table t partition by range (a) (partition p0 values less than (1000000), partition pMax values less than (maxvalue) placement policy pp1); +Error 8263 (HY000): The operation is not allowed while the bdr role of this cluster is set to secondary. +admin unset bdr role; +drop table t; +admin set bdr role secondary; +drop placement policy pp1; +admin unset bdr role; +create table t(a int); +admin set bdr role secondary; +set global tidb_enable_check_constraint=ON; +alter table t add constraint `a_check` check(a > 0); +Error 8263 (HY000): The operation is not allowed while the bdr role of this cluster is set to secondary. +admin unset bdr role; +alter table t add constraint `a_check` check(a > 0); +admin set bdr role secondary; +alter table t alter constraint `a_check` enforced; +Error 8263 (HY000): The operation is not allowed while the bdr role of this cluster is set to secondary. +alter table t drop constraint `a_check`; +Error 8263 (HY000): The operation is not allowed while the bdr role of this cluster is set to secondary. +admin unset bdr role; +alter table t drop constraint `a_check`; +admin set bdr role secondary; +set global tidb_enable_check_constraint=OFF; +alter table t cache; +Error 8263 (HY000): The operation is not allowed while the bdr role of this cluster is set to secondary. +admin unset bdr role; +alter table t cache; +admin set bdr role secondary; +alter table t nocache; +Error 8263 (HY000): The operation is not allowed while the bdr role of this cluster is set to secondary. +admin unset bdr role; +alter table t nocache; +CREATE TABLE ttl_test (created_at datetime) TTL = `created_at` + INTERVAL 5 DAY; +admin set bdr role secondary; +ALTER TABLE ttl_test TTL = `created_at` + INTERVAL 2 YEAR; +Error 8263 (HY000): The operation is not allowed while the bdr role of this cluster is set to secondary. +alter table ttl_test remove ttl; +Error 8263 (HY000): The operation is not allowed while the bdr role of this cluster is set to secondary. +drop table ttl_test; +Error 8263 (HY000): The operation is not allowed while the bdr role of this cluster is set to secondary. +alter table t add primary key (a); +Error 8263 (HY000): The operation is not allowed while the bdr role of this cluster is set to secondary. +admin unset bdr role; +alter table t add primary key (a); +admin set bdr role secondary; +alter table t drop primary key; +Error 8263 (HY000): The operation is not allowed while the bdr role of this cluster is set to secondary. +admin unset bdr role; +alter table t drop primary key; +admin set bdr role secondary; +alter table t add unique index (a); +Error 8263 (HY000): The operation is not allowed while the bdr role of this cluster is set to secondary. +alter table t auto_id_cache = 10; +Error 8263 (HY000): The operation is not allowed while the bdr role of this cluster is set to secondary. +admin unset bdr role; +create table t_random(a bigint auto_random, primary key (a)); +admin set bdr role secondary; +alter table t_random auto_random_base = 10; +Error 8263 (HY000): The operation is not allowed while the bdr role of this cluster is set to secondary. +admin unset bdr role; +drop table t_random; +admin set bdr role secondary; +create sequence seq; +Error 8263 (HY000): The operation is not allowed while the bdr role of this cluster is set to secondary. +admin unset bdr role; +create sequence seq; +admin set bdr role secondary; +alter sequence seq restart; +Error 8263 (HY000): The operation is not allowed while the bdr role of this cluster is set to secondary. +drop sequence seq; +Error 8263 (HY000): The operation is not allowed while the bdr role of this cluster is set to secondary. +admin unset bdr role; +drop sequence seq; +admin set bdr role secondary; +create view v as select 1 as b; +Error 8263 (HY000): The operation is not allowed while the bdr role of this cluster is set to secondary. +admin unset bdr role; +create view v as select 1 as b; +admin set bdr role secondary; +drop view v; +Error 8263 (HY000): The operation is not allowed while the bdr role of this cluster is set to secondary. +admin unset bdr role; +drop view v; +admin set bdr role secondary; +alter table t charset utf8mb4 collate utf8mb4_unicode_ci; +Error 8263 (HY000): The operation is not allowed while the bdr role of this cluster is set to secondary. +alter database bdr_mode default character set = utf8; +Error 8263 (HY000): The operation is not allowed while the bdr role of this cluster is set to secondary. +drop database bdr_mode; +Error 8263 (HY000): The operation is not allowed while the bdr role of this cluster is set to secondary. +admin unset bdr role; +drop database bdr_mode; +admin set bdr role secondary; +create resource group rg1 ru_per_sec = 100; +create user user1; +alter user `user1` resource group `rg1`; +alter resource group rg1 ru_per_sec = 200; +drop user user1; +drop resource group if exists rg1; +admin unset bdr role; +create database bdr_mode; +use bdr_mode; +create table t(a int); +alter table t add column b int; +alter table t drop column b; +alter table t add index idx_a(a); +alter table t alter index idx_a invisible; +alter table t alter index idx_a visible; +alter table t rename index idx_a to idx_a_2; +alter table t drop index idx_a_2; +create table t2(a int, primary key (a)); +rename table t to t3, t2 to t4; +rename table t3 to t, t4 to t2; +alter table t add foreign key (a) references t2(a); +alter table t drop foreign key fk_1; +alter table t drop index fk_1; +truncate table t2; +drop table t2; +alter table t modify column a bigint; +alter table t auto_increment = 6000; +alter table t alter column a set default 1; +alter table t shard_row_id_bits = 4; +alter table t comment = 'test'; +drop table t; +create table t(a int) partition by range(a) ( +partition p0 values less than (5), +partition p1 values less than (10), +partition p2 values less than (15)); +alter table t add partition (partition p3 values less than (100)); +create placement policy pp4 followers=4; +alter table t placement policy=pp4; +alter table t partition p3 placement policy=pp4; +alter database bdr_mode placement policy=pp4; +alter placement policy pp4 followers=3; +alter table t placement policy=default; +alter table t partition p3 placement policy=default; +alter database bdr_mode placement policy=default; +drop placement policy pp4; +alter table t attributes="merge_option=allow"; +alter table t partition p3 attributes="key1=value1"; +create table t2(a int); +alter table t exchange partition p0 with table t2; +alter table t truncate partition p0; +alter table t reorganize partition p0 into +( +partition p4 values less than (0), +partition p5 values less than (5) +); +alter table t drop partition p5; +drop table t2; +create placement policy pp1 followers=1; +alter table t partition by range (a) (partition p0 values less than (1000000), partition pMax values less than (maxvalue) placement policy pp1); +drop table t; +drop placement policy pp1; +create table t(a int); +set global tidb_enable_check_constraint=ON; +alter table t add constraint `a_check` check(a > 0); +alter table t alter constraint `a_check` enforced; +alter table t drop constraint `a_check`; +set global tidb_enable_check_constraint=OFF; +alter table t cache; +alter table t nocache; +CREATE TABLE ttl_test (created_at datetime) TTL = `created_at` + INTERVAL 5 DAY; +ALTER TABLE ttl_test TTL = `created_at` + INTERVAL 2 YEAR; +alter table ttl_test remove ttl; +drop table ttl_test; +alter table t add primary key (a); +alter table t drop primary key; +alter table t add unique index (a); +alter table t drop index a; +alter table t auto_id_cache = 10; +create table t_random(a bigint auto_random, primary key (a)); +alter table t_random auto_random_base = 10; +drop table t_random; +create sequence seq; +alter sequence seq restart; +drop sequence seq; +create view v as select 1 as b; +drop view v; +alter table t charset utf8mb4 collate utf8mb4_unicode_ci; +alter database bdr_mode default character set = utf8; +drop database bdr_mode; +create resource group rg1 ru_per_sec = 100; +create user user1; +alter user `user1` resource group `rg1`; +alter resource group rg1 ru_per_sec = 200; +drop user user1; +drop resource group if exists rg1; +admin unset bdr role; +create database bdr_mode; +use bdr_mode; +admin set bdr role primary; +create table t(a int); +alter table t modify column a bigint; +Error 8263 (HY000): The operation is not allowed while the bdr role of this cluster is set to primary. +alter table t modify column a int default 10; +alter table t modify column a int comment "test"; +Error 8263 (HY000): The operation is not allowed while the bdr role of this cluster is set to primary. +alter table t modify column a int default 100 comment "test"; +admin unset bdr role; +drop table t; +admin set bdr role primary; +create table t(a int); +alter table t add column b int; +alter table t add column c int null; +alter table t add column d int not null; +Error 8263 (HY000): The operation is not allowed while the bdr role of this cluster is set to primary. +alter table t add column d int not null default 10; +admin unset bdr role; +drop database bdr_mode; diff --git a/tests/integrationtest/r/ddl/constraint.result b/tests/integrationtest/r/ddl/constraint.result index 4e47d5d198866..54840371c81a9 100644 --- a/tests/integrationtest/r/ddl/constraint.result +++ b/tests/integrationtest/r/ddl/constraint.result @@ -480,55 +480,55 @@ select * from s; a 1 drop table if exists t1, t2; -CREATE TABLE t1 (CHECK (c1 <> c2), c1 INT CHECK (c1 > 10), c2 INT CONSTRAINT c2_positive CHECK (c2 > 0)); +CREATE TABLE t1 (CHECK (c1 <> c2), c1 INT CHECK (c1 > 10), c2 INT CONSTRAINT c2_positive_for_t1 CHECK (c2 > 0)); insert into t1 values (2, 2); Error 3819 (HY000): Check constraint 't1_chk_1' is violated. insert into t1 values (9, 2); Error 3819 (HY000): Check constraint 't1_chk_2' is violated. insert into t1 values (14, -4); -Error 3819 (HY000): Check constraint 'c2_positive' is violated. +Error 3819 (HY000): Check constraint 'c2_positive_for_t1' is violated. insert into t1(c1) values (9); Error 3819 (HY000): Check constraint 't1_chk_2' is violated. insert into t1(c2) values (-3); -Error 3819 (HY000): Check constraint 'c2_positive' is violated. +Error 3819 (HY000): Check constraint 'c2_positive_for_t1' is violated. insert into t1 values (14, 4); insert into t1 values (null, 4); insert into t1 values (13, null); insert into t1 values (null, null); insert into t1(c1) values (null); insert into t1(c2) values (null); -CREATE TABLE t2 (CHECK (c1 <> c2), c1 INT CHECK (c1 > 10), c2 INT CONSTRAINT c2_positive CHECK (c2 > 0), c3 int as (c1 + c2) check(c3 > 15)); +CREATE TABLE t2 (CHECK (c1 <> c2), c1 INT CHECK (c1 > 10), c2 INT CONSTRAINT c2_positive_for_t2 CHECK (c2 > 0), c3 int as (c1 + c2) check(c3 > 15)); insert into t2(c1, c2) values (11, 1); Error 3819 (HY000): Check constraint 't2_chk_3' is violated. insert into t2(c1, c2) values (12, 7); drop table if exists t1, t2; -CREATE TABLE t1 (CHECK (c1 <> c2), c1 INT CHECK (c1 > 10), c2 INT CONSTRAINT c2_positive CHECK (c2 > 0)); +CREATE TABLE t1 (CHECK (c1 <> c2), c1 INT CHECK (c1 > 10), c2 INT CONSTRAINT c2_positive_for_t1 CHECK (c2 > 0)); insert into t1 values (11, 12), (12, 13), (13, 14), (14, 15), (15, 16); update t1 set c2 = -c2; -Error 3819 (HY000): Check constraint 'c2_positive' is violated. +Error 3819 (HY000): Check constraint 'c2_positive_for_t1' is violated. update t1 set c2 = c1; Error 3819 (HY000): Check constraint 't1_chk_1' is violated. update t1 set c1 = c1 - 10; Error 3819 (HY000): Check constraint 't1_chk_2' is violated. update t1 set c2 = -10 where c2 = 12; -Error 3819 (HY000): Check constraint 'c2_positive' is violated. -CREATE TABLE t2 (CHECK (c1 <> c2), c1 INT CHECK (c1 > 10), c2 INT CONSTRAINT c2_positive CHECK (c2 > 0), c3 int as (c1 + c2) check(c3 > 15)); +Error 3819 (HY000): Check constraint 'c2_positive_for_t1' is violated. +CREATE TABLE t2 (CHECK (c1 <> c2), c1 INT CHECK (c1 > 10), c2 INT CONSTRAINT c2_positive_for_t2 CHECK (c2 > 0), c3 int as (c1 + c2) check(c3 > 15)); insert into t2(c1, c2) values (11, 12), (12, 13), (13, 14), (14, 15), (15, 16); update t2 set c2 = c2 - 10; Error 3819 (HY000): Check constraint 't2_chk_3' is violated. update t2 set c2 = c2 - 5; drop table if exists t1, t2; -CREATE TABLE t1 (CHECK (c1 <> c2), c1 INT CHECK (c1 > 10), c2 INT CONSTRAINT c2_positive CHECK (c2 > 0)) partition by hash(c2) partitions 5; +CREATE TABLE t1 (CHECK (c1 <> c2), c1 INT CHECK (c1 > 10), c2 INT CONSTRAINT c2_positive_for_t1 CHECK (c2 > 0)) partition by hash(c2) partitions 5; insert into t1 values (11, 12), (12, 13), (13, 14), (14, 15), (15, 16); update t1 set c2 = -c2; -Error 3819 (HY000): Check constraint 'c2_positive' is violated. +Error 3819 (HY000): Check constraint 'c2_positive_for_t1' is violated. update t1 set c2 = c1; Error 3819 (HY000): Check constraint 't1_chk_1' is violated. update t1 set c1 = c1 - 10; Error 3819 (HY000): Check constraint 't1_chk_2' is violated. update t1 set c2 = -10 where c2 = 12; -Error 3819 (HY000): Check constraint 'c2_positive' is violated. -CREATE TABLE t2 (CHECK (c1 <> c2), c1 INT CHECK (c1 > 10), c2 INT CONSTRAINT c2_positive CHECK (c2 > 0), c3 int as (c1 + c2) check(c3 > 15)) partition by hash(c2) partitions 5; +Error 3819 (HY000): Check constraint 'c2_positive_for_t1' is violated. +CREATE TABLE t2 (CHECK (c1 <> c2), c1 INT CHECK (c1 > 10), c2 INT CONSTRAINT c2_positive_for_t2 CHECK (c2 > 0), c3 int as (c1 + c2) check(c3 > 15)) partition by hash(c2) partitions 5; insert into t2(c1, c2) values (11, 12), (12, 13), (13, 14), (14, 15), (15, 16); update t2 set c2 = c2 - 10; Error 3819 (HY000): Check constraint 't2_chk_3' is violated. diff --git a/tests/integrationtest/r/ddl/db_integration.result b/tests/integrationtest/r/ddl/db_integration.result index 507558b7702f8..ef71f0c8f7f69 100644 --- a/tests/integrationtest/r/ddl/db_integration.result +++ b/tests/integrationtest/r/ddl/db_integration.result @@ -701,7 +701,7 @@ rename table t to t1; insert into t1 values(); select * from t1; a -101 +2 drop table if exists t; drop table if exists t1; create table t(a int) auto_id_cache 100; @@ -714,7 +714,7 @@ rename table t to t1; insert into t1 values(); select _tidb_rowid from t1; _tidb_rowid -101 +2 drop table if exists t; drop table if exists t1; create table t(a int null, b int auto_increment unique) auto_id_cache 100; @@ -727,7 +727,7 @@ rename table t to t1; insert into t1(b) values(NULL); select b, _tidb_rowid from t1; b _tidb_rowid -101 102 +3 4 delete from t1; alter table t1 auto_id_cache 200; show create table t1; @@ -736,17 +736,17 @@ t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` int(11) NOT NULL AUTO_INCREMENT, UNIQUE KEY `b` (`b`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin AUTO_INCREMENT=201 /*T![auto_id_cache] AUTO_ID_CACHE=200 */ +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin AUTO_INCREMENT=101 /*T![auto_id_cache] AUTO_ID_CACHE=200 */ insert into t1(b) values(NULL); select b, _tidb_rowid from t1; b _tidb_rowid -201 202 +101 102 delete from t1; rename table t1 to t; insert into t(b) values(NULL); select b, _tidb_rowid from t; b _tidb_rowid -401 402 +103 104 delete from t; drop table if exists t; drop table if exists t1; @@ -770,7 +770,7 @@ rename table t to t1; insert into t1(a) values(NULL); select a from t1; a -7 +5 drop table if exists t; create table t(a int) auto_id_cache = 9223372036854775808; Error 1105 (HY000): table option auto_id_cache overflows int64 @@ -1216,3 +1216,78 @@ alter table t reorganize partition p0 into (partition p01 values less than (10), show warnings; Level Code Message Warning 1105 The statistics of related partitions will be outdated after reorganizing partitions. Please use 'ANALYZE TABLE' statement if you want to update it now +drop table if exists t; +create table t (a int, b real); +alter table t add primary key ((a+b)) nonclustered; +Error 3756 (HY000): The primary key cannot be an expression index +create table t(a int, index((cast(a as JSON)))); +Error 3753 (HY000): Cannot create an expression index on a function that returns a JSON or GEOMETRY value +drop table if exists t; +create table t (a int, b real); +alter table t add primary key ((a+b)) nonclustered; +Error 3756 (HY000): The primary key cannot be an expression index +alter table t add index ((rand())); +Error 3758 (HY000): Expression of expression index 'expression_index' contains a disallowed function +alter table t add index ((now()+1)); +Error 3758 (HY000): Expression of expression index 'expression_index' contains a disallowed function +alter table t add column (_V$_idx_0 int); +alter table t add index idx((a+1)); +Error 1060 (42S21): Duplicate column name '_V$_idx_0' +alter table t drop column _V$_idx_0; +alter table t add index idx((a+1)); +alter table t add column (_V$_idx_0 int); +Error 1060 (42S21): Duplicate column name '_V$_idx_0' +alter table t drop index idx; +alter table t add column (_V$_idx_0 int); +alter table t add column (_V$_expression_index_0 int); +alter table t add index ((a+1)); +Error 1060 (42S21): Duplicate column name '_V$_expression_index_0' +alter table t drop column _V$_expression_index_0; +alter table t add index ((a+1)); +alter table t drop column _V$_expression_index_0; +Error 1091 (42000): Can't DROP '_V$_expression_index_0'; check that column/key exists +alter table t add column e int as (_V$_expression_index_0 + 1); +Error 1054 (42S22): Unknown column '_v$_expression_index_0' in 'generated column function' +drop table if exists t; +create table t (j json, key k (((j,j)))); +Error 3800 (HY000): Expression of expression index 'k' cannot refer to a row value +create table t (j json, key k ((j+1),(j+1))); +create table t1 (col1 int, index ((concat('')))); +Error 3761 (HY000): The used storage engine cannot index the expression 'concat(_utf8mb4'')' +CREATE TABLE t1 (col1 INT, PRIMARY KEY ((ABS(col1))) NONCLUSTERED); +Error 3756 (HY000): The primary key cannot be an expression index +drop table if exists t; +create table t(id char(10) primary key, short_name char(10), name char(10), key n((upper(`name`)))); +update t t1 set t1.short_name='a' where t1.id='1'; +set @@tidb_enable_strict_double_type_check = 'ON'; +drop table if exists double_type_check; +create table double_type_check(id int, c double(10)); +Error 1149 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use +set @@tidb_enable_strict_double_type_check = 'OFF'; +create table double_type_check(id int, c double(10)); +set @@tidb_enable_strict_double_type_check = default; +drop table if exists t1, t2, tt; +begin; +create temporary table t1(id int primary key, v int); +select * from t1; +id v +insert into t1 values(123, 456); +select * from t1 where id=123; +id v +123 456 +truncate table t1; +select * from t1 where id=123; +id v +commit; +create table tt(id int); +begin; +create temporary table t1(id int); +insert into tt select * from t1; +drop table tt; +create table t2(id int primary key, v int); +insert into t2 values(234, 567); +begin; +create temporary table t2(id int primary key, v int); +select * from t2 where id=234; +id v +commit; diff --git a/tests/integrationtest/r/ddl/db_partition.result b/tests/integrationtest/r/ddl/db_partition.result index eb8321953ca51..11d6fa003f641 100644 --- a/tests/integrationtest/r/ddl/db_partition.result +++ b/tests/integrationtest/r/ddl/db_partition.result @@ -3294,3 +3294,176 @@ partition by range(unix_timestamp(time_recorded)) ( partition p1 values less than (1559192604) ); set @@session.tidb_enable_table_partition = default; +set @@tidb_enable_exchange_partition=1; +drop table if exists pt1; +create table pt1(a int, b int, c int) PARTITION BY hash (a) partitions 1; +alter table pt1 add index idx((a+c)); +drop table if exists nt1; +create table nt1(a int, b int, c int); +alter table pt1 exchange partition p0 with table nt1; +Error 1736 (HY000): Tables have different definitions +alter table nt1 add column (`_V$_idx_0` bigint(20) generated always as (a+b) virtual); +alter table pt1 exchange partition p0 with table nt1; +Error 1736 (HY000): Tables have different definitions +alter table nt1 drop column `_V$_idx_0`; +alter table nt1 add index idx((b-c)); +alter table pt1 exchange partition p0 with table nt1; +Error 1736 (HY000): Tables have different definitions +alter table nt1 drop index idx; +alter table nt1 add index idx((concat(a, b))); +alter table pt1 exchange partition p0 with table nt1; +Error 1736 (HY000): Tables have different definitions +drop table if exists nt2; +create table nt2 (a int, b int, c int); +alter table nt2 add index idx((a+c)); +alter table pt1 exchange partition p0 with table nt2; +set tidb_enable_global_index=true; +drop database if exists partition_exchange; +create database partition_exchange; +use partition_exchange; +create table pt (id int not null) partition by hash (id) partitions 4; +create table nt (id int(1) not null); +alter table pt exchange partition p0 with table nt; +create table pt1 (id int not null, fname varchar(3)) partition by hash (id) partitions 4; +create table nt1 (id int not null, fname varchar(4)); +alter table pt1 exchange partition p0 with table nt1; +Error 1736 (HY000): Tables have different definitions +create table pt2 (id int not null, salary decimal) partition by hash(id) partitions 4; +create table nt2 (id int not null, salary decimal(3,2)); +alter table pt2 exchange partition p0 with table nt2; +Error 1736 (HY000): Tables have different definitions +create table pt3 (id int not null, salary decimal) partition by hash(id) partitions 1; +create table nt3 (id int not null, salary decimal(10, 1)); +alter table pt3 exchange partition p0 with table nt3; +Error 1736 (HY000): Tables have different definitions +create table pt4 (id int not null) partition by hash(id) partitions 1; +create table nt4 (id1 int not null); +alter table pt4 exchange partition p0 with table nt4; +Error 1736 (HY000): Tables have different definitions +create table pt5 (id int not null, primary key (id)) partition by hash(id) partitions 1; +create table nt5 (id int not null); +alter table pt5 exchange partition p0 with table nt5; +Error 1736 (HY000): Tables have different definitions +create table pt6 (id int not null, salary decimal, index idx (id, salary)) partition by hash(id) partitions 1; +create table nt6 (id int not null, salary decimal, index idx (salary, id)); +alter table pt6 exchange partition p0 with table nt6; +Error 1736 (HY000): Tables have different definitions +create table pt7 (id int not null, index idx (id) invisible) partition by hash(id) partitions 1; +create table nt7 (id int not null, index idx (id)); +alter table pt7 exchange partition p0 with table nt7; +create table pt8 (id int not null, index idx (id)) partition by hash(id) partitions 1; +create table nt8 (id int not null, index id_idx (id)); +alter table pt8 exchange partition p0 with table nt8; +Error 1736 (HY000): Tables have different definitions +## Generated column (virtual) +create table pt10 (id int not null, lname varchar(30), fname varchar(100) generated always as (concat(lname,' ')) virtual) partition by hash(id) partitions 1; +create table nt10 (id int not null, lname varchar(30), fname varchar(100)); +alter table pt10 exchange partition p0 with table nt10; +Error 3106 (HY000): 'Exchanging partitions for non-generated columns' is not supported for generated columns. +create table pt11 (id int not null, lname varchar(30), fname varchar(100)) partition by hash(id) partitions 1; +create table nt11 (id int not null, lname varchar(30), fname varchar(100) generated always as (concat(lname, ' ')) virtual); +alter table pt11 exchange partition p0 with table nt11; +Error 3106 (HY000): 'Exchanging partitions for non-generated columns' is not supported for generated columns. +create table pt12 (id int not null, lname varchar(30), fname varchar(100) generated always as (concat(lname,' ')) stored) partition by hash(id) partitions 1; +create table nt12 (id int not null, lname varchar(30), fname varchar(100)); +alter table pt12 exchange partition p0 with table nt12; +Error 1736 (HY000): Tables have different definitions +create table pt13 (id int not null, lname varchar(30), fname varchar(100)) partition by hash(id) partitions 1; +create table nt13 (id int not null, lname varchar(30), fname varchar(100) generated always as (concat(lname, ' ')) stored); +alter table pt13 exchange partition p0 with table nt13; +Error 1736 (HY000): Tables have different definitions +create table pt14 (id int not null, lname varchar(30), fname varchar(100) generated always as (concat(lname, ' ')) virtual) partition by hash(id) partitions 1; +create table nt14 (id int not null, lname varchar(30), fname varchar(100) generated always as (concat(lname, ' ')) virtual); +alter table pt14 exchange partition p0 with table nt14; +## unique index +create table pt15 (id int not null, unique index uk_id (id)) partition by hash(id) partitions 1; +create table nt15 (id int not null, index uk_id (id)); +alter table pt15 exchange partition p0 with table nt15; +Error 1736 (HY000): Tables have different definitions +## auto_increment +create table pt16 (id int not null primary key auto_increment) partition by hash(id) partitions 1; +create table nt16 (id int not null primary key); +alter table pt16 exchange partition p0 with table nt16; +Error 1736 (HY000): Tables have different definitions +## default +create table pt17 (id int not null default 1) partition by hash(id) partitions 1; +create table nt17 (id int not null); +alter table pt17 exchange partition p0 with table nt17; +## view test +create table pt18 (id int not null) partition by hash(id) partitions 1; +create view nt18 as select id from nt17; +alter table pt18 exchange partition p0 with table nt18; +Error 1177 (42000): Can't open table +create table pt19 (id int not null, lname varchar(30), fname varchar(100) generated always as (concat(lname, ' ')) stored) partition by hash(id) partitions 1; +create table nt19 (id int not null, lname varchar(30), fname varchar(100) generated always as (concat(lname, ' ')) virtual); +alter table pt19 exchange partition p0 with table nt19; +Error 3106 (HY000): 'Exchanging partitions for non-generated columns' is not supported for generated columns. +create table pt20 (id int not null) partition by hash(id) partitions 1; +create table nt20 (id int default null); +alter table pt20 exchange partition p0 with table nt20; +Error 1736 (HY000): Tables have different definitions +## unsigned +create table pt21 (id int unsigned) partition by hash(id) partitions 1; +create table nt21 (id int); +alter table pt21 exchange partition p0 with table nt21; +Error 1736 (HY000): Tables have different definitions +## zerofill +create table pt22 (id int) partition by hash(id) partitions 1; +create table nt22 (id int zerofill); +alter table pt22 exchange partition p0 with table nt22; +Error 1736 (HY000): Tables have different definitions +create table pt23 (id int, lname varchar(10) charset binary) partition by hash(id) partitions 1; +create table nt23 (id int, lname varchar(10)); +alter table pt23 exchange partition p0 with table nt23; +Error 1736 (HY000): Tables have different definitions +create table pt25 (id int, a datetime on update current_timestamp) partition by hash(id) partitions 1; +create table nt25 (id int, a datetime); +alter table pt25 exchange partition p0 with table nt25; +create table pt26 (id int not null, lname varchar(30), fname varchar(100) generated always as (concat(lname, ' ')) virtual) partition by hash(id) partitions 1; +create table nt26 (id int not null, lname varchar(30), fname varchar(100) generated always as (concat(id, ' ')) virtual); +alter table pt26 exchange partition p0 with table nt26; +Error 1736 (HY000): Tables have different definitions +create table pt27 (a int key, b int, index(a)) partition by hash(a) partitions 1; +create table nt27 (a int not null, b int, index(a)); +alter table pt27 exchange partition p0 with table nt27; +Error 1736 (HY000): Tables have different definitions +create table pt28 (a int primary key, b int, index(a)) partition by hash(a) partitions 1; +create table nt28 (a int not null, b int, index(a)); +alter table pt28 exchange partition p0 with table nt28; +Error 1736 (HY000): Tables have different definitions +create table pt29 (a int primary key, b int) partition by hash(a) partitions 1; +create table nt29 (a int not null, b int, index(a)); +alter table pt29 exchange partition p0 with table nt29; +Error 1736 (HY000): Tables have different definitions +create table pt30 (a int primary key, b int) partition by hash(a) partitions 1; +create table nt30 (a int, b int, unique index(a)); +alter table pt30 exchange partition p0 with table nt30; +Error 1736 (HY000): Tables have different definitions +## auto_increment +create table pt31 (id bigint not null primary key auto_increment) partition by hash(id) partitions 1; +create table nt31 (id bigint not null primary key); +alter table pt31 exchange partition p0 with table nt31; +Error 1736 (HY000): Tables have different definitions +## auto_random +create table pt32 (id bigint not null primary key AUTO_RANDOM) partition by hash(id) partitions 1; +create table nt32 (id bigint not null primary key); +alter table pt32 exchange partition p0 with table nt32; +Error 1736 (HY000): Tables have different definitions +## global temporary table +create table pt33 (id int) partition by hash(id) partitions 1; +create global temporary table nt33 (id int) on commit delete rows; +alter table pt33 exchange partition p0 with table nt33; +Error 1733 (HY000): Table to exchange with partition is temporary: 'nt33' +## local temporary table +create table pt34 (id int) partition by hash(id) partitions 1; +create temporary table nt34 (id int); +alter table pt34 exchange partition p0 with table nt34; +Error 1733 (HY000): Table to exchange with partition is temporary: 'nt34' +## global index +create table pt35 (a int, b int, unique index(b)) partition by hash(a) partitions 1; +create table nt35 (a int, b int, unique index(b)); +alter table pt35 exchange partition p0 with table nt35; +Error 1731 (HY000): Non matching attribute 'global index: b' between partition and table +drop database partition_exchange; +use ddl__db_partition; +set tidb_enable_global_index=default; diff --git a/tests/integrationtest/r/ddl/db_table.result b/tests/integrationtest/r/ddl/db_table.result index a62837e6c4565..0d679a8742989 100644 --- a/tests/integrationtest/r/ddl/db_table.result +++ b/tests/integrationtest/r/ddl/db_table.result @@ -57,6 +57,7 @@ NULL 1 update t1 set id=-1 where id=1; LOCK TABLE t1 READ; update t1 set id=1 where id=1; +Error 1099 (HY000): Table 't1' was locked with a READ lock and can't be updated unlock tables; update t1 set id=1 where id=-1; drop table t1; diff --git a/tests/integrationtest/r/ddl/foreign_key.result b/tests/integrationtest/r/ddl/foreign_key.result index 5928783ddefee..07ccc3b97acd3 100644 --- a/tests/integrationtest/r/ddl/foreign_key.result +++ b/tests/integrationtest/r/ddl/foreign_key.result @@ -43,6 +43,16 @@ alter table t2 modify column a decimal(30, 15); Error 1832 (HY000): Cannot change column 'a': used in a foreign key constraint 'fk' alter table t2 modify column a decimal(5, 2); Error 1832 (HY000): Cannot change column 'a': used in a foreign key constraint 'fk' +drop table t1, t2; +create table t1 (a bigint(10) key); +create table t2 (a bigint(10), constraint fk foreign key (a) references t1(a)); +alter table t2 modify column a bigint(5); +alter table t1 modify column a bigint(1); +drop table t1, t2; +create table t1 (id int key, b decimal(8, 5), index(b)); +create table t2 (a decimal(10, 5), constraint fk foreign key (a) references t1(b)); +alter table t1 modify column b decimal(10, 5); +Error 1833 (HY000): Cannot change column 'b': used in a foreign key constraint 'fk' of table 'ddl__foreign_key.t2' set @@global.tidb_enable_foreign_key=default; set @@foreign_key_checks=default; set @@global.tidb_enable_foreign_key=1; @@ -197,27 +207,3 @@ id b 2 2 admin check table t1,t2; set @@foreign_key_checks=default; -set @@foreign_key_checks=1; -drop table if exists employee; -create table employee (id bigint auto_increment key, pid bigint); -insert into employee (id) values (1),(2),(3),(4),(5),(6),(7),(8); -insert into employee (pid) select pid from employee; -insert into employee (pid) select pid from employee; -insert into employee (pid) select pid from employee; -insert into employee (pid) select pid from employee; -insert into employee (pid) select pid from employee; -insert into employee (pid) select pid from employee; -insert into employee (pid) select pid from employee; -insert into employee (pid) select pid from employee; -insert into employee (pid) select pid from employee; -insert into employee (pid) select pid from employee; -insert into employee (pid) select pid from employee; -insert into employee (pid) select pid from employee; -insert into employee (pid) select pid from employee; -insert into employee (pid) select pid from employee; -update employee set pid=id-1 where id>1; -set @a=now(6); -alter table employee add foreign key fk_1(pid) references employee(id); -select timestampdiff(microsecond, @a, now(6)) < 1000000; -timestampdiff(microsecond, @a, now(6)) < 1000000 -1 diff --git a/tests/integrationtest/r/ddl/global_index.result b/tests/integrationtest/r/ddl/global_index.result new file mode 100644 index 0000000000000..f00c311307b31 --- /dev/null +++ b/tests/integrationtest/r/ddl/global_index.result @@ -0,0 +1,58 @@ +set tidb_enable_global_index=true; +drop table if exists test_global; +create table test_global ( a int, b int, c int, unique key p_b(b)) +partition by range( a ) ( +partition p1 values less than (10), +partition p2 values less than (20) +); +insert into test_global values (1,2,2); +insert into test_global values (11,2,2); +Error 1062 (23000): Duplicate entry '2' for key 'test_global.p_b' +insert into test_global values (11,2,2); +Error 1062 (23000): Duplicate entry '2' for key 'test_global.p_b' +# NULL will not get 'duplicate key' error here +insert into test_global(a,c) values (1,2); +insert into test_global(a,c) values (11,2); +drop table if exists test_global; +create table test_global ( a int, b int, c int, primary key p_b(b) /*T![clustered_index] CLUSTERED */) +partition by range( a ) ( +partition p1 values less than (10), +partition p2 values less than (20) +); +Error 1503 (HY000): A CLUSTERED INDEX must include all columns in the table's partitioning function +drop table if exists test_global; +create table test_global ( a int, b int, c int, primary key p_b_c(b, c) /*T![clustered_index] CLUSTERED */) +partition by range( a ) ( +partition p1 values less than (10), +partition p2 values less than (20) +); +Error 1503 (HY000): A CLUSTERED INDEX must include all columns in the table's partitioning function +drop table if exists test_global; +create table test_global ( a int, b int, c int, primary key (b) /*T![clustered_index] NONCLUSTERED */) +partition by range( a ) ( +partition p1 values less than (10), +partition p2 values less than (20) +); +insert into test_global values (1,2,2); +insert into test_global values (11,2,2); +Error 1062 (23000): Duplicate entry '2' for key 'test_global.PRIMARY' +insert into test_global values (11,2,2); +Error 1062 (23000): Duplicate entry '2' for key 'test_global.PRIMARY' +drop table if exists test_global; +create table test_global ( a int, b int, c int) +partition by range( a ) ( +partition p1 values less than (10), +partition p2 values less than (20), +partition p3 values less than (30) +); +alter table test_global add unique index idx_b (b); +insert into test_global values (1, 1, 1), (8, 8, 8), (11, 11, 11), (12, 12, 12); +update test_global set a = 2 where a = 11; +update test_global set a = 13 where a = 12; +analyze table test_global; +select * from test_global use index(idx_b) order by a; +a b c +1 1 1 +2 11 11 +8 8 8 +13 12 12 diff --git a/tests/integrationtest/r/ddl/integration.result b/tests/integrationtest/r/ddl/integration.result index f4c64ac851ba6..31d3984d97e3b 100644 --- a/tests/integrationtest/r/ddl/integration.result +++ b/tests/integrationtest/r/ddl/integration.result @@ -91,3 +91,11 @@ rename table t to t1; Error 8242 (HY000): 'Rename Table' is unsupported on cache tables. alter table t nocache; drop table if exists t; +drop table if exists t; +create table t (d int default '18446744073709551616' ); +Error 1067 (42000): Invalid default value for 'd' +set sql_mode=''; +create table t (d int default '18446744073709551616' ); +Level Code Message +Warning 1690 BIGINT value is out of range in '18446744073709551616' +set sql_mode=DEFAULT; diff --git a/tests/integrationtest/r/ddl/serial.result b/tests/integrationtest/r/ddl/serial.result index 0de92fadf720e..61f55af5964b4 100644 --- a/tests/integrationtest/r/ddl/serial.result +++ b/tests/integrationtest/r/ddl/serial.result @@ -88,3 +88,24 @@ alter table t1 modify a varchar(20) charset utf8 collate utf8_roman_ci; Error 1273 (HY000): Unsupported collation when new collation is enabled: 'utf8_roman_ci' drop database if exists ucd; use ddl__serial; +drop table if exists t1, tmp1; +create table t1 (id int); +create temporary table tmp1 (id int primary key, a int unique, b int); +rename table tmp1 to tmp2; +Error 8200 (HY000): TiDB doesn't support RENAME TABLE for local temporary table +alter table tmp1 add column c int; +Error 8200 (HY000): TiDB doesn't support ALTER TABLE for local temporary table +alter table tmp1 add index b(b); +Error 8200 (HY000): TiDB doesn't support ALTER TABLE for local temporary table +create index a on tmp1(b); +Error 8200 (HY000): TiDB doesn't support CREATE INDEX for local temporary table +drop index a on tmp1; +Error 8200 (HY000): TiDB doesn't support DROP INDEX for local temporary table +lock tables tmp1 read; +Error 8200 (HY000): TiDB doesn't support LOCK TABLES for local temporary table +lock tables tmp1 write; +Error 8200 (HY000): TiDB doesn't support LOCK TABLES for local temporary table +lock tables t1 read, tmp1 read; +Error 8200 (HY000): TiDB doesn't support LOCK TABLES for local temporary table +admin cleanup table lock tmp1; +Error 8200 (HY000): TiDB doesn't support ADMIN CLEANUP TABLE LOCK for local temporary table diff --git a/tests/integrationtest/r/executor/autoid.result b/tests/integrationtest/r/executor/autoid.result index 3c617c0a345eb..e27f47445cde5 100644 --- a/tests/integrationtest/r/executor/autoid.result +++ b/tests/integrationtest/r/executor/autoid.result @@ -480,7 +480,7 @@ insert into t11 values (); select * from t11; id 1 -30001 +2 create table t2 (id int key auto_increment) auto_id_cache 1; insert into t2 values (); rename table t2 to t22; @@ -496,7 +496,7 @@ insert into t33 values (); select * from t33; id 1 -101 +2 drop table if exists t0; create table t0 (id int auto_increment,k int,c char(120)) ; drop table if exists t1; diff --git a/tests/integrationtest/r/executor/cte.result b/tests/integrationtest/r/executor/cte.result index 60f4967359e55..a611705fee2ff 100644 --- a/tests/integrationtest/r/executor/cte.result +++ b/tests/integrationtest/r/executor/cte.result @@ -1,4 +1,3 @@ -set tidb_max_chunk_size=default; with recursive cte1 as (select 1 c1 union all select c1 + 1 c1 from cte1 where c1 < 5) select * from cte1; c1 1 @@ -406,3 +405,20 @@ a 1 use executor__cte; drop database executor__cte1; +set tidb_max_chunk_size=32; +drop table if exists t1; +create table t1(c1 int); +insert into t1 values(0), (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), (39), (40), (41), (42), (43), (44), (45), (46), (47), (48), (49), (50), (51), (52), (53), (54), (55), (56), (57), (58), (59), (60), (61), (62), (63), (64), (65), (66), (67), (68), (69), (70), (71), (72), (73), (74), (75), (76), (77), (78), (79), (80), (81), (82), (83), (84), (85), (86), (87), (88), (89), (90), (91), (92), (93), (94), (95), (96), (97), (98), (99), (100), (101), (102), (103), (104), (105), (106), (107), (108), (109), (110), (111), (112), (113), (114), (115), (116), (117), (118), (119), (120), (121), (122), (123), (124), (125), (126), (127), (128), (129), (130), (131), (132), (133), (134), (135), (136), (137), (138), (139), (140), (141), (142), (143), (144), (145), (146), (147), (148), (149), (150), (151), (152), (153), (154), (155), (156), (157), (158), (159), (160), (161), (162), (163), (164), (165), (166), (167), (168), (169), (170), (171), (172), (173), (174), (175), (176), (177), (178), (179), (180), (181), (182), (183), (184), (185), (186), (187), (188), (189), (190), (191), (192), (193), (194), (195), (196), (197), (198), (199), (200), (201), (202), (203), (204), (205), (206), (207), (208), (209), (210), (211), (212), (213), (214), (215), (216), (217), (218), (219), (220), (221), (222), (223), (224), (225), (226), (227), (228), (229), (230), (231), (232), (233), (234), (235), (236), (237), (238), (239), (240), (241), (242), (243), (244), (245), (246), (247), (248), (249), (250), (251), (252), (253), (254), (255), (256), (257), (258), (259), (260), (261), (262), (263), (264), (265), (266), (267), (268), (269), (270), (271), (272), (273), (274), (275), (276), (277), (278), (279), (280), (281), (282), (283), (284), (285), (286), (287), (288), (289), (290), (291), (292), (293), (294), (295), (296), (297), (298), (299); +with recursive cte1(c1) as (select c1 from t1 union select c1 + 1 c1 from cte1 limit 1 offset 100) select * from cte1; +c1 +100 +set tidb_max_chunk_size=default; +create table issue46522 (id int primary key); +insert into issue46522 values (1); +set @@tidb_disable_txn_auto_retry = off; +begin optimistic; +insert into issue46522 with t1 as (select id+1 from issue46522 where id = 1) select * from t1; +begin optimistic; +update issue46522 set id = id + 1; +commit; +commit; diff --git a/tests/integrationtest/r/executor/delete.result b/tests/integrationtest/r/executor/delete.result index d452dd98a9e21..3f20878d397c3 100644 --- a/tests/integrationtest/r/executor/delete.result +++ b/tests/integrationtest/r/executor/delete.result @@ -107,3 +107,18 @@ id data 11 321 22 322 23 323 +drop table if exists t; +create table t (id char(255)); +insert into t values ('18446744073709551616'); +delete from t where cast(id as unsigned) = 1; +Error 1690 (22003): BIGINT value is out of range in '18446744073709551616' +update t set id = '1' where cast(id as unsigned) = 1; +Error 1690 (22003): BIGINT value is out of range in '18446744073709551616' +set sql_mode='' +delete from t where cast(id as unsigned) = 1; +Level Code Message +Warning 1292 Truncated incorrect INTEGER value: '18446744073709551616' +update t set id = '1' where cast(id as unsigned) = 1; +Level Code Message +Warning 1292 Truncated incorrect INTEGER value: '18446744073709551616' +set sql_mode=DEFAULT diff --git a/tests/integrationtest/r/executor/executor.result b/tests/integrationtest/r/executor/executor.result index e84cda08a7f47..cbb02d5e20027 100644 --- a/tests/integrationtest/r/executor/executor.result +++ b/tests/integrationtest/r/executor/executor.result @@ -3933,8 +3933,8 @@ a 1 2 3 -SELECT `s`.`count(a)` FROM (SELECT COUNT(`a`) FROM `test`.`t`) AS `s`; -Error 1146 (42S02): Table 'test.t' doesn't exist +SELECT `s`.`count(a)` FROM (SELECT COUNT(`a`) FROM `executor__executor`.`t`) AS `s`; +Error 1054 (42S22): Unknown column 's.count(a)' in 'field list' drop view v; create definer='root'@'localhost' view v as select * from (select count(a) from t) s; select * from v; @@ -4278,7 +4278,7 @@ and ssci.item_sk = csci.item_sk) limit 100; admin show bdr role; BDR_ROLE -none + admin set bdr role primary; admin show bdr role; BDR_ROLE @@ -4287,15 +4287,16 @@ admin set bdr role secondary; admin show bdr role; BDR_ROLE secondary -admin set bdr role local_only; +admin unset bdr role; admin show bdr role; BDR_ROLE -local_only + admin set bdr role test_err; Error 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your TiDB version for the right syntax to use line 1 column 27 near "test_err;" admin show bdr role; BDR_ROLE -local_only + +admin unset bdr role; set global tidb_mem_oom_action='CANCEL'; drop table if exists t, t1; create table t(a int, b int, index idx(a)); @@ -4549,3 +4550,32 @@ stmt_type Update set @@tidb_mem_quota_query=default; set global tidb_mem_oom_action=default; +drop table if exists t; +drop user if exists 'testuser'@'localhost'; +create table t(a int); +create user 'testuser'@'localhost'; +LOCK TABLE executor__executor.t WRITE; +Error 1044 (42000): Access denied for user 'testuser'@'localhost' to database 'executor__executor' +GRANT LOCK TABLES ON executor__executor.* to 'testuser'@'localhost'; +LOCK TABLE executor__executor.t WRITE; +Error 1142 (42000): SELECT command denied to user 'testuser'@'localhost' for table 't' +REVOKE ALL ON executor__executor.* FROM 'testuser'@'localhost'; +GRANT SELECT ON executor__executor.* to 'testuser'@'localhost'; +LOCK TABLE executor__executor.t WRITE; +Error 1044 (42000): Access denied for user 'testuser'@'localhost' to database 'executor__executor' +GRANT LOCK TABLES ON executor__executor.* to 'testuser'@'localhost'; +LOCK TABLE executor__executor.t WRITE; +drop database if exists test2; +create database test2; +create table test2.t2(a int); +LOCK TABLE executor__executor.t WRITE, test2.t2 WRITE; +Error 1044 (42000): Access denied for user 'testuser'@'localhost' to database 'test2' +GRANT LOCK TABLES ON test2.* to 'testuser'@'localhost'; +LOCK TABLE executor__executor.t WRITE, test2.t2 WRITE; +Error 1142 (42000): SELECT command denied to user 'testuser'@'localhost' for table 't2' +GRANT SELECT ON test2.* to 'testuser'@'localhost'; +LOCK TABLE executor__executor.t WRITE, test2.t2 WRITE; +LOCK TABLE executor__executor.t WRITE, test2.t2 WRITE; +Error 8020 (HY000): Table 't' was locked in WRITE by server: session: +unlock tables; +drop user 'testuser'@'localhost'; diff --git a/tests/integrationtest/r/executor/explain.result b/tests/integrationtest/r/executor/explain.result index b1753240540db..08612373c20d1 100644 --- a/tests/integrationtest/r/executor/explain.result +++ b/tests/integrationtest/r/executor/explain.result @@ -300,3 +300,78 @@ explain select * from v3; id estRows task access object operator info TableReader_7 10000.00 root data:TableFullScan_6 └─TableFullScan_6 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo +drop table if exists t1; +create table t1( +id1 varchar(2) DEFAULT '00', +id2 varchar(30) NOT NULL, +id3 datetime DEFAULT NULL, +id4 varchar(100) NOT NULL DEFAULT 'ecifdata', +id5 datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, +id6 int(11) DEFAULT NULL, +id7 int(11) DEFAULT NULL, +UNIQUE KEY UI_id2 (id2), +KEY ix_id1 (id1) +); +drop table if exists t2; +create table t2( +id10 varchar(40) NOT NULL, +id2 varchar(30) NOT NULL, +KEY IX_id2 (id2), +PRIMARY KEY (id10) +); +drop table if exists t3; +create table t3( +id20 varchar(40) DEFAULT NULL, +UNIQUE KEY IX_id20 (id20) +); +explain UPDATE t1 a +SET a.id1 = '04', +a.id3 = CURRENT_TIMESTAMP, +a.id4 = SUBSTRING_INDEX(USER(), '@', 1), +a.id5 = CURRENT_TIMESTAMP +WHERE a.id1 = '03' +AND a.id6 - IFNULL(a.id7, 0) = +( +SELECT COUNT(1) +FROM t2 b, t3 c +WHERE b.id10 = c.id20 +AND b.id2 = a.id2 +AND b.id2 in ( +SELECT rn.id2 +FROM t1 rn +WHERE rn.id1 = '03' +) +); +id estRows task access object operator info +Update_17 N/A root N/A +└─Projection_28 8.00 root executor__explain.t1.id1, executor__explain.t1.id2, executor__explain.t1.id3, executor__explain.t1.id4, executor__explain.t1.id5, executor__explain.t1.id6, executor__explain.t1.id7, executor__explain.t1._tidb_rowid + └─Selection_29 8.00 root eq(minus(executor__explain.t1.id6, ifnull(executor__explain.t1.id7, 0)), ifnull(Column#22, 0)) + └─HashJoin_32 10.00 root left outer join, equal:[eq(executor__explain.t1.id2, executor__explain.t2.id2)] + ├─HashAgg_69(Build) 12.50 root group by:executor__explain.t2.id2, funcs:count(1)->Column#22, funcs:firstrow(executor__explain.t2.id2)->executor__explain.t2.id2 + │ └─IndexJoin_76 15.62 root inner join, inner:IndexReader_75, outer key:executor__explain.t2.id10, inner key:executor__explain.t3.id20, equal cond:eq(executor__explain.t2.id10, executor__explain.t3.id20) + │ ├─IndexHashJoin_93(Build) 12.50 root inner join, inner:IndexLookUp_90, outer key:executor__explain.t1.id2, inner key:executor__explain.t2.id2, equal cond:eq(executor__explain.t1.id2, executor__explain.t2.id2) + │ │ ├─Projection_103(Build) 10.00 root executor__explain.t1.id2 + │ │ │ └─IndexLookUp_109 10.00 root + │ │ │ ├─IndexRangeScan_107(Build) 10.00 cop[tikv] table:rn, index:ix_id1(id1) range:["03","03"], keep order:false, stats:pseudo + │ │ │ └─TableRowIDScan_108(Probe) 10.00 cop[tikv] table:rn keep order:false, stats:pseudo + │ │ └─IndexLookUp_90(Probe) 12.50 root + │ │ ├─IndexRangeScan_88(Build) 12.50 cop[tikv] table:b, index:IX_id2(id2) range: decided by [eq(executor__explain.t2.id2, executor__explain.t1.id2)], keep order:false, stats:pseudo + │ │ └─TableRowIDScan_89(Probe) 12.50 cop[tikv] table:b keep order:false, stats:pseudo + │ └─IndexReader_75(Probe) 12.50 root index:Selection_74 + │ └─Selection_74 12.50 cop[tikv] not(isnull(executor__explain.t3.id20)) + │ └─IndexRangeScan_73 12.50 cop[tikv] table:c, index:IX_id20(id20) range: decided by [eq(executor__explain.t3.id20, executor__explain.t2.id10)], keep order:false, stats:pseudo + └─IndexLookUp_68(Probe) 10.00 root + ├─IndexRangeScan_66(Build) 10.00 cop[tikv] table:a, index:ix_id1(id1) range:["03","03"], keep order:false, stats:pseudo + └─TableRowIDScan_67(Probe) 10.00 cop[tikv] table:a keep order:false, stats:pseudo +drop table if exists t; +create table t (a int, b int, index (a)); +insert into t values (1, 1); +explain analyze select * from t t1, t t2 where t1.b = t2.a and t1.b = 2333; +id estRows actRows task access object execution info operator info memory disk +HashJoin_8 100.00 0 root CARTESIAN inner join +├─IndexLookUp_18(Build) 10.00 0 root +│ ├─IndexRangeScan_16(Build) 10.00 0 cop[tikv] table:t2, index:a(a) range:[2333,2333], keep order:false, stats:pseudo +│ └─TableRowIDScan_17(Probe) 10.00 0 cop[tikv] table:t2 keep order:false, stats:pseudo +└─TableReader_12(Probe) 10.00 0 root data:Selection_11 + └─Selection_11 10.00 0 cop[tikv] eq(executor__explain.t.b, 2333) + └─TableFullScan_10 10000.00 1 cop[tikv] table:t1 keep order:false, stats:pseudo diff --git a/tests/integrationtest/r/executor/foreign_key.result b/tests/integrationtest/r/executor/foreign_key.result index b02a4751c3330..b0ba6ed955906 100644 --- a/tests/integrationtest/r/executor/foreign_key.result +++ b/tests/integrationtest/r/executor/foreign_key.result @@ -431,3 +431,26 @@ id pid SET GLOBAL tidb_mem_oom_action = DEFAULT; set @@tidb_mem_quota_query=DEFAULT; set @@foreign_key_checks=DEFAULT; +set @@global.tidb_enable_foreign_key=1; +set @@foreign_key_checks=1; +drop table if exists t1, t2; +create table t1 (id int key); +create table t2 (id int key, foreign key fk (id) references t1(id) ON DELETE CASCADE ON UPDATE CASCADE); +insert into t1 values (1), (2), (3); +insert into t2 values (1), (2), (3); +lock table t2 read; +set @@foreign_key_checks=1; +delete from t1 where id = 1; +Error 8020 (HY000): Table 't2' was locked in READ by server: session: +unlock tables; +delete from t1 where id = 1; +select * from t1 order by id; +id +2 +3 +select * from t2 order by id; +id +2 +3 +set @@global.tidb_enable_foreign_key=default; +set @@foreign_key_checks=default; diff --git a/tests/integrationtest/r/executor/index_merge_reader.result b/tests/integrationtest/r/executor/index_merge_reader.result index f12ac443dd22b..f5dd21525baad 100644 --- a/tests/integrationtest/r/executor/index_merge_reader.result +++ b/tests/integrationtest/r/executor/index_merge_reader.result @@ -530,3 +530,29 @@ select /*+ use_index_merge(t1, primary, idx1, idx2) */ c1 from t1 where c1 < 102 Error 8175 (HY000): Your query has been cancelled due to exceeding the allowed memory limit for a single SQL query. Please try narrowing your query scope or increase the tidb_mem_quota_query limit and try again.[conn=] set global tidb_mem_oom_action = DEFAULT; set @@tidb_mem_quota_query = default; +drop table if exists t; +CREATE TABLE `t` (`a` mediumint(9) NOT NULL,`b` year(4) NOT NULL,`c` varbinary(62) NOT NULL,`d` text COLLATE utf8mb4_unicode_ci NOT NULL,`e` tinyint(4) NOT NULL DEFAULT '115',`f` smallint(6) DEFAULT '2675',`g` date DEFAULT '1981-09-17',`h` mediumint(8) unsigned NOT NULL,`i` varchar(384) CHARACTER SET gbk COLLATE gbk_bin DEFAULT NULL,UNIQUE KEY `idx_23` (`h`,`f`),PRIMARY KEY (`h`,`a`) /*T![clustered_index] CLUSTERED */,UNIQUE KEY `idx_25` (`h`,`i`(5),`e`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin PARTITION BY HASH (`h`) PARTITIONS 1; +INSERT INTO `t` VALUES (2065948,1999,_binary '8jxN','rf',-54,-5656,'1987-07-03',259254,'7me坨'),(-8248164,2024,_binary 'zA5A','s)DAkX3',-93,-12983,'2027-12-18',299573,'LUf咲'),(-6131509,2023,_binary 'xdex#Y2','1th%h',-51,19149,'2013-10-28',428279,'矷莒X'),(7545837,1998,_binary 'PCVO','&(lJw6',30,4093,'1987-07-03',736235,'腏@TOIJ'),(-7449472,2029,_binary 'B7&jrl','EjbFfX!',80,-7590,'2011-11-03',765580,'堮ZQF_'),(-7176200,1988,_binary 'tiPglv7mX_#','CnCtNb',-25,NULL,'1987-07-03',842956,'Gq羣嗳殓'),(-115168,2036,_binary 'BqmX$-4It','!8#dvH',82,18787,'1991-09-20',921706,'椉2庘v'),(6665100,1987,_binary '4IJgk0fr4','(D',-73,28628,'1987-07-03',1149668,'摔玝S渉'),(-4065661,2021,_binary '8G%','xDO39xw#',-107,17356,'1970-12-20',1316239,'+0c35掬-阗'),(7622462,1990,_binary '&o+)s)D0','kjoS9Dzld',84,688,'1987-07-03',1403663,'$H鍿_M~'),(5269354,2018,_binary 'wq9hC8','s8XPrN+',-2,-31272,'2008-05-26',1534517,'y椁n躁Q'),(2065948,1982,_binary '8jxNjbksV','g$+i4dg',11,19800,'1987-07-03',1591457,'z^+H~薼A'),(4076971,2024,_binary '&!RrsH','7Mpvk',-63,-632,'2032-10-28',1611011,'鬰+EXmx'),(3522062,1981,_binary ')nq#!UiHKk8','j~wFe77ai',50,6951,'1987-07-03',1716854,'J'),(7859777,2012,_binary 'PBA5xgJ&G&','UM7o!u',18,-5978,'1987-07-03',1967012,'e)浢L獹'),(2065948,2028,_binary '8jxNjbk','JmsEki9t4',51,12002,'2017-12-23',1981288,'mp氏襚'); +explain format='brief' SELECT /*+ AGG_TO_COP() STREAM_AGG()*/ (NOT (`t`.`i`>=_UTF8MB4'j筧8') OR NOT (`t`.`i`=_UTF8MB4'暈lH忧ll6')) IS TRUE,MAX(`t`.`e`) AS `r0`,QUOTE(`t`.`i`) AS `r1` FROM `t` WHERE `t`.`h`>240817 OR `t`.`i` BETWEEN _UTF8MB4'WVz' AND _UTF8MB4'G#駧褉ZC領*lov' GROUP BY `t`.`i`; +id estRows task access object operator info +Projection 2666.67 root istrue(or(not(ge(executor__index_merge_reader.t.i, j筧8)), not(eq(executor__index_merge_reader.t.i, 暈lH忧ll6))))->Column#11, Column#10, quote(executor__index_merge_reader.t.i)->Column#12 +└─StreamAgg 2666.67 root group by:executor__index_merge_reader.t.i, funcs:max(executor__index_merge_reader.t.e)->Column#10, funcs:firstrow(executor__index_merge_reader.t.i)->executor__index_merge_reader.t.i + └─Sort 3333.33 root executor__index_merge_reader.t.i + └─IndexMerge 3333.33 root type: union + ├─TableRangeScan(Build) 3333.33 cop[tikv] table:t, partition:p0 range:(240817,+inf], keep order:false, stats:pseudo + ├─IndexFullScan(Build) 0.00 cop[tikv] table:t, partition:p0, index:idx_25(h, i, e) keep order:false, stats:pseudo + └─TableRowIDScan(Probe) 3333.33 cop[tikv] table:t, partition:p0 keep order:false, stats:pseudo +select count(*) from (SELECT /*+ AGG_TO_COP() STREAM_AGG()*/ (NOT (`t`.`i`>=_UTF8MB4'j筧8') OR NOT (`t`.`i`=_UTF8MB4'暈lH忧ll6')) IS TRUE,MAX(`t`.`e`) AS `r0`,QUOTE(`t`.`i`) AS `r1` FROM `t` WHERE `t`.`h`>240817 OR `t`.`i` BETWEEN _UTF8MB4'WVz' AND _UTF8MB4'G#駧褉ZC領*lov' GROUP BY `t`.`i`) derived; +count(*) +16 +explain format='brief' SELECT /*+ AGG_TO_COP() */ (NOT (`t`.`i`>=_UTF8MB4'j筧8') OR NOT (`t`.`i`=_UTF8MB4'暈lH忧ll6')) IS TRUE,MAX(`t`.`e`) AS `r0`,QUOTE(`t`.`i`) AS `r1` FROM `t` WHERE `t`.`h`>240817 OR `t`.`i` BETWEEN _UTF8MB4'WVz' AND _UTF8MB4'G#駧褉ZC領*lov' GROUP BY `t`.`i`; +id estRows task access object operator info +Projection 2666.67 root istrue(or(not(ge(executor__index_merge_reader.t.i, j筧8)), not(eq(executor__index_merge_reader.t.i, 暈lH忧ll6))))->Column#11, Column#10, quote(executor__index_merge_reader.t.i)->Column#12 +└─HashAgg 2666.67 root group by:executor__index_merge_reader.t.i, funcs:max(executor__index_merge_reader.t.e)->Column#10, funcs:firstrow(executor__index_merge_reader.t.i)->executor__index_merge_reader.t.i + └─IndexMerge 3333.33 root type: union + ├─TableRangeScan(Build) 3333.33 cop[tikv] table:t, partition:p0 range:(240817,+inf], keep order:false, stats:pseudo + ├─IndexFullScan(Build) 0.00 cop[tikv] table:t, partition:p0, index:idx_25(h, i, e) keep order:false, stats:pseudo + └─TableRowIDScan(Probe) 3333.33 cop[tikv] table:t, partition:p0 keep order:false, stats:pseudo +select count(*) from (SELECT /*+ AGG_TO_COP() */ (NOT (`t`.`i`>=_UTF8MB4'j筧8') OR NOT (`t`.`i`=_UTF8MB4'暈lH忧ll6')) IS TRUE,MAX(`t`.`e`) AS `r0`,QUOTE(`t`.`i`) AS `r1` FROM `t` WHERE `t`.`h`>240817 OR `t`.`i` BETWEEN _UTF8MB4'WVz' AND _UTF8MB4'G#駧褉ZC領*lov' GROUP BY `t`.`i`) derived; +count(*) +16 diff --git a/tests/integrationtest/r/executor/infoschema_reader.result b/tests/integrationtest/r/executor/infoschema_reader.result index 15ab1dfb7ce46..4745b06b79a02 100644 --- a/tests/integrationtest/r/executor/infoschema_reader.result +++ b/tests/integrationtest/r/executor/infoschema_reader.result @@ -283,3 +283,31 @@ SELECT * FROM information_schema.user_privileges WHERE grantee="'usageuser'@'%'" GRANTEE TABLE_CATALOG PRIVILEGE_TYPE IS_GRANTABLE 'usageuser'@'%' def BACKUP_ADMIN NO 'usageuser'@'%' def SELECT YES +select VARIABLE_NAME from information_schema.VARIABLES_INFO where DEFAULT_VALUE = CURRENT_VALUE and variable_name in ('tidb_enable_async_commit','tidb_enable_1pc', 'tidb_mem_oom_action', 'tidb_enable_auto_analyze', 'tidb_row_format_version', 'tidb_txn_assertion_level', 'tidb_enable_mutation_checker', 'tidb_pessimistic_txn_fair_locking') order by VARIABLE_NAME; +VARIABLE_NAME +tidb_enable_1pc +tidb_enable_async_commit +tidb_enable_auto_analyze +tidb_enable_mutation_checker +tidb_mem_oom_action +tidb_pessimistic_txn_fair_locking +tidb_row_format_version +tidb_txn_assertion_level +set global tidb_enable_async_commit = default; +set global tidb_enable_1pc = default; +set global tidb_mem_oom_action = default; +set global tidb_enable_auto_analyze = default; +set global tidb_row_format_version = default; +set global tidb_txn_assertion_level = default; +set global tidb_enable_mutation_checker = default; +set global tidb_pessimistic_txn_fair_locking = default; +select a.VARIABLE_NAME from information_schema.VARIABLES_INFO as a, mysql.GLOBAL_VARIABLES as b where a.VARIABLE_NAME = b.VARIABLE_NAME and a.DEFAULT_VALUE = b.VARIABLE_VALUE and a.CURRENT_VALUE = b.VARIABLE_VALUE and a.variable_name in ('tidb_enable_async_commit','tidb_enable_1pc', 'tidb_mem_oom_action', 'tidb_enable_auto_analyze', 'tidb_row_format_version', 'tidb_txn_assertion_level', 'tidb_enable_mutation_checker', 'tidb_pessimistic_txn_fair_locking') order by VARIABLE_NAME; +VARIABLE_NAME +tidb_enable_1pc +tidb_enable_async_commit +tidb_enable_auto_analyze +tidb_enable_mutation_checker +tidb_mem_oom_action +tidb_pessimistic_txn_fair_locking +tidb_row_format_version +tidb_txn_assertion_level diff --git a/tests/integrationtest/r/executor/insert.result b/tests/integrationtest/r/executor/insert.result index 977ff1e9ac41e..b6efffe682611 100644 --- a/tests/integrationtest/r/executor/insert.result +++ b/tests/integrationtest/r/executor/insert.result @@ -2131,3 +2131,13 @@ insert into t1 set c1 = 0.1 on duplicate key update c1 = 1; select * from t1 use index(primary); c1 1.0000 +drop table if exists t; +create table t (d int); +insert into t values (cast('18446744073709551616' as unsigned)); +Error 1690 (22003): BIGINT UNSIGNED value is out of range in '18446744073709551616' +set sql_mode=''; +insert into t values (cast('18446744073709551616' as unsigned)); +Level Code Message +Warning 1264 Out of range value for column 'd' at row 1 +Warning 1292 Truncated incorrect INTEGER value: '18446744073709551616' +set sql_mode=DEFAULT; diff --git a/tests/integrationtest/r/executor/issues.result b/tests/integrationtest/r/executor/issues.result index 952378b5effb7..ae6bcdb9888bb 100644 --- a/tests/integrationtest/r/executor/issues.result +++ b/tests/integrationtest/r/executor/issues.result @@ -831,3 +831,37 @@ explain select ps_partkey, sum(ps_supplycost * ps_availqty) as value from partsu Error 8175 (HY000): Your query has been cancelled due to exceeding the allowed memory limit for a single SQL query. Please try narrowing your query scope or increase the tidb_mem_quota_query limit and try again.[conn=] SET GLOBAL tidb_mem_oom_action = DEFAULT; set @@tidb_mem_quota_query=default; +drop table if exists issue49369; +CREATE TABLE `issue49369` ( +`x` varchar(32) COLLATE utf8mb4_bin DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin; +insert into t select round(cast('88888899999999999888888888888888888888888888888888888.11111111111111111111' as decimal(18,12)) * cast('88888899999999999888888888888888888888888888888888888.11111111111111111111' as decimal(42,18)) ); +Error 1690 (22003): DECIMAL value is out of range in '(18, 12)' +set @@sql_mode = ''; +insert into t select round(cast('88888899999999999888888888888888888888888888888888888.11111111111111111111' as decimal(18,12)) * cast('88888899999999999888888888888888888888888888888888888.11111111111111111111' as decimal(42,18)) ); +show warnings; +Level Code Message +Warning 1690 DECIMAL value is out of range in '(18, 12)' +Warning 1690 DECIMAL value is out of range in '(42, 18)' +Warning 1690 %s value is out of range in '%s' +select * from t; +c +1 +2 +2147483647 +set @@sql_mode = default; +set @@tidb_max_chunk_size = 32; +drop table if exists t, s; +CREATE TABLE `t` (`c` char(1)) COLLATE=utf8_general_ci ; +insert into t values("V"),("v"); +insert into t values("V"),("v"),("v"); +CREATE TABLE `s` (`col_61` int); +insert into s values(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1); +insert into s values(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1); +SELECT /*+ stream_agg()*/ count(`t`.`c`) FROM (`s`) JOIN `t` GROUP BY `t`.`c`; +count(`t`.`c`) +170 +SELECT count(`t`.`c`) FROM (`s`) JOIN `t` GROUP BY `t`.`c`; +count(`t`.`c`) +170 +set @@tidb_max_chunk_size = default; diff --git a/tests/integrationtest/r/executor/jointest/hash_join.result b/tests/integrationtest/r/executor/jointest/hash_join.result index 3f253e7607002..5821b8aa19d0f 100644 --- a/tests/integrationtest/r/executor/jointest/hash_join.result +++ b/tests/integrationtest/r/executor/jointest/hash_join.result @@ -306,3 +306,29 @@ set @@tidb_max_chunk_size=default; set @@tidb_index_lookup_join_concurrency=default; set @@session.tidb_executor_concurrency = default; set @@session.tidb_hash_join_concurrency = default; +create table tbl_3 ( col_11 mediumint unsigned not null default 8346281 ,col_12 enum ( 'Alice','Bob','Charlie','David' ) ,col_13 time not null default '07:10:30.00' ,col_14 timestamp ,col_15 varbinary ( 194 ) not null default '-ZpCzjqdl4hsyo' , key idx_5 ( col_14 ,col_11 ,col_12 ) ,primary key ( col_11 ,col_15 ) /*T![clustered_index] clustered */ ) charset utf8mb4 collate utf8mb4_bin partition by range ( col_11 ) ( partition p0 values less than (530262), partition p1 values less than (9415740), partition p2 values less than (11007444), partition p3 values less than (maxvalue) ); +insert into tbl_3 values ( 8838143,'David','23:41:27.00','1993-02-23','g0q~Z0b*PpMPKJxYbIE' ); +insert into tbl_3 values ( 9082223,'Alice','02:25:16.00','2035-11-08','i' ); +insert into tbl_3 values ( 2483729,'Charlie','14:43:13.00','1970-09-10','w6o6WFYyL5' ); +insert into tbl_3 values ( 4135401,'Charlie','19:30:34.00','2017-06-07','2FZmy9lanL8' ); +insert into tbl_3 values ( 1479390,'Alice','20:40:08.00','1984-06-10','LeoVONgN~iJz&inj' ); +insert into tbl_3 values ( 10427825,'Charlie','15:27:35.00','1986-12-25','tWJ' ); +insert into tbl_3 values ( 12794792,'Charlie','04:10:08.00','2034-08-08','hvpXVQyuP' ); +insert into tbl_3 values ( 4696775,'Charlie','05:07:43.00','1984-07-31','SKOW9I^sM$4xNk' ); +insert into tbl_3 values ( 8963236,'Alice','08:18:31.00','2022-04-17','v4DsE' ); +insert into tbl_3 values ( 9048951,'Alice','05:19:47.00','2018-09-22','sJ!vs' ); +SELECT `col_14` +FROM +tbl_3 +WHERE +( +(`tbl_3`.`col_15` < 'dV') +AND `tbl_3`.`col_12` IN ( +SELECT `col_12` FROM `tbl_3` WHERE NOT (ISNULL(`tbl_3`.`col_12`)) +) +) +ORDER BY IF(ISNULL(`col_14`),0,1),`col_14`; +col_14 +1984-06-10 00:00:00 +1984-07-31 00:00:00 +2017-06-07 00:00:00 diff --git a/tests/integrationtest/r/executor/partition/global_index.result b/tests/integrationtest/r/executor/partition/global_index.result new file mode 100644 index 0000000000000..31c71562491ea --- /dev/null +++ b/tests/integrationtest/r/executor/partition/global_index.result @@ -0,0 +1,235 @@ +set tidb_enable_global_index=true; +drop table if exists p; +create table p (id int, c int) partition by range (c) ( +partition p0 values less than (4), +partition p1 values less than (7), +partition p2 values less than (10)); +alter table p add unique idx(id); +insert into p values (1,3), (3,4), (5,6), (7,9); +analyze table p; +drop table if exists t; +create table t (id int, c int); +insert into t values (1, 3); +analyze table t; +select id from p use index (idx) order by id; +id +1 +3 +5 +7 +select * from p use index (idx); +id c +1 3 +3 4 +5 6 +7 9 +select count(*) from p use index (idx); +count(*) +4 +select count(*) from p partition(p0) use index (idx); +count(*) +1 +select * from p partition(p0) use index (idx); +id c +1 3 +select id from p partition(p0) use index (idx); +id +1 +select /*+ INL_JOIN(p, t) */ * from p inner join t on p.id = t.id; +id c id c +1 3 1 3 +select /*+ INL_JOIN(p, t) */ p.id from p inner join t on p.id = t.id; +id +1 +select /*+ INL_JOIN(p, t) */ * from p partition(p0) inner join t on p.id = t.id; +id c id c +1 3 1 3 +select /*+ INL_JOIN(p, t) */ p.id from p partition(p0) inner join t on p.id = t.id; +id +1 +drop table if exists p, t; +create table p (id int, c int, d int, e int, primary key(d, c) clustered) partition by range (c) ( +partition p0 values less than (4), +partition p1 values less than (7), +partition p2 values less than (10)); +alter table p add unique idx(id); +insert into p values (1,3,1,1), (3,4,3,3), (5,6,5,5), (7,9,7,7); +analyze table p; +create table t (id int, c int); +insert into t values (1, 3); +analyze table t; +select id from p partition(p0) use index (idx); +id +1 +select /*+ INL_JOIN(p, t) */ * from p partition(p0) inner join t on p.id = t.id; +id c d e id c +1 3 1 1 1 3 +select /*+ INL_JOIN(p, t) */ p.id from p partition(p0) inner join t on p.id = t.id; +id +1 +drop table if exists p; +create table p (a int, b int GENERATED ALWAYS AS (3*a-2*a) VIRTUAL) partition by hash(b) partitions 2; +alter table p add unique index idx (a); +insert into p (a) values (1),(2),(3); +analyze table p; +select * from p use index (idx); +a b +1 1 +2 2 +3 3 +drop table if exists test_t1; +CREATE TABLE test_t1 ( +a int(11) NOT NULL, +b int(11) DEFAULT NULL, +c int(11) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin +PARTITION BY RANGE (c) ( +PARTITION p0 VALUES LESS THAN (10), +PARTITION p1 VALUES LESS THAN (MAXVALUE) +); +alter table test_t1 add unique p_a (a); +insert into test_t1 values (1,1,1); +explain format='brief' select * from test_t1 where a = 1; +id estRows task access object operator info +Point_Get 1.00 root table:test_t1, index:p_a(a) +select * from test_t1 where a = 1; +a b c +1 1 1 +analyze table test_t1; +explain format='brief' select * from test_t1 where a = 1; +id estRows task access object operator info +Point_Get 1.00 root table:test_t1, index:p_a(a) +select * from test_t1 where a = 1; +a b c +1 1 1 +SET session tidb_enable_index_merge = ON; +drop table if exists t; +CREATE TABLE t ( +a int(11) NOT NULL, +b int(11) DEFAULT NULL, +c int(11) DEFAULT NULL, +d int(11) NOT NULL AUTO_INCREMENT, +KEY idx_bd (b, c), +UNIQUE KEY uidx_ac(a) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin +PARTITION BY RANGE (c) ( +PARTITION p0 VALUES LESS THAN (10), +PARTITION p1 VALUES LESS THAN (MAXVALUE) +); +insert into t values (1,1,1,1),(2,2,2,2),(3,3,3,3),(4,4,4,4),(5,5,5,5),(6,6,6,6),(7,7,7,7),(8,8,8,8); +analyze table t; +# when index_merge has global index as its partial path, ignore it. +explain select /*+ use_index_merge(t, uidx_ac, idx_bc) */ * from t where a=1 or b=2; +id estRows task access object operator info +TableReader_7 1.88 root partition:all data:Selection_6 +└─Selection_6 1.88 cop[tikv] or(eq(executor__partition__global_index.t.a, 1), eq(executor__partition__global_index.t.b, 2)) + └─TableFullScan_5 8.00 cop[tikv] table:t keep order:false +select /*+ use_index_merge(t, uidx_ac, idx_bc) */ * from t where a=1 or b=2; +a b c d +1 1 1 1 +2 2 2 2 +SET session tidb_enable_index_merge = DEFAULT; +drop table if exists t; +create table t (a varchar(10), b varchar(1) GENERATED ALWAYS AS (substr(a,1,1)) VIRTUAL) partition by list columns(b) (partition p0 values in ('a','c'), partition p1 values in ('b','d')); +alter table t add unique index (a); +insert into t (a) values ('aaa'),('abc'),('acd'); +analyze table t; +select a from t partition (p0) order by a; +a +aaa +abc +acd +select * from t where a = 'abc' order by a; +a b +abc a +update t set a='bbb' where a = 'aaa'; +admin check table t; +select a from t order by a; +a +abc +acd +bbb +select a from t partition (p0) order by a; +a +abc +acd +select a from t partition (p1) order by a; +a +bbb +select * from t where a = 'bbb' order by a; +a b +bbb b +insert into t (a) values ('abc'); +Error 1062 (23000): Duplicate entry 'abc' for key 't.a' +insert into t (a) values ('abc') on duplicate key update a='bbc'; +select a from t order by a; +a +acd +bbb +bbc +select * from t where a = 'bbc'; +a b +bbc b +select a from t partition (p0) order by a; +a +acd +select a from t partition (p1) order by a; +a +bbb +bbc +explain format = 'brief' select a from t partition (p1) order by a; +id estRows task access object operator info +IndexReader 3.00 root partition:p1 index:IndexFullScan +└─IndexFullScan 3.00 cop[tikv] table:t, index:a(a) keep order:true +drop table if exists t; +create table t (a varchar(10), b varchar(1) GENERATED ALWAYS AS (substr(a,1,1)) STORED) partition by list columns(b) (partition p0 values in ('a','c'), partition p1 values in ('b','d')); +alter table t add unique index (a); +insert into t (a) values ('aaa'),('abc'),('acd'); +analyze table t; +select a from t partition (p0) order by a; +a +aaa +abc +acd +select * from t where a = 'abc' order by a; +a b +abc a +update t set a='bbb' where a = 'aaa'; +admin check table t; +select a from t order by a; +a +abc +acd +bbb +select a from t partition (p0) order by a; +a +abc +acd +select a from t partition (p1) order by a; +a +bbb +select * from t where a = 'bbb' order by a; +a b +bbb b +insert into t (a) values ('abc'); +Error 1062 (23000): Duplicate entry 'abc' for key 't.a' +insert into t (a) values ('abc') on duplicate key update a='bbc'; +select a from t order by a; +a +acd +bbb +bbc +select * from t where a = 'bbc'; +a b +bbc b +select a from t partition (p0) order by a; +a +acd +select a from t partition (p1) order by a; +a +bbb +bbc +explain format = 'brief' select a from t partition (p1) order by a; +id estRows task access object operator info +IndexReader 3.00 root partition:p1 index:IndexFullScan +└─IndexFullScan 3.00 cop[tikv] table:t, index:a(a) keep order:true diff --git a/tests/integrationtest/r/executor/partition/issues.result b/tests/integrationtest/r/executor/partition/issues.result index 36acea78dcc46..bc1dbcb6f70b5 100644 --- a/tests/integrationtest/r/executor/partition/issues.result +++ b/tests/integrationtest/r/executor/partition/issues.result @@ -459,3 +459,117 @@ IndexJoin_20 0.80 root inner join, inner:TableReader_19, outer key:executor__pa └─TableRangeScan_17 0.80 cop[tikv] table:c range: decided by [eq(executor__partition__issues.c.txt_account_id, executor__partition__issues.t.txn_account_id) eq(executor__partition__issues.c.serial_id, executor__partition__issues.t.serial_id) eq(executor__partition__issues.c.occur_trade_date, 2022-11-17 00:00:00.000000)], keep order:false set @@tidb_opt_advanced_join_hint=default; set tidb_partition_prune_mode=default; +drop table if exists t; +CREATE TABLE `t` ( +`col_51` bigint(20) unsigned NOT NULL, +PRIMARY KEY (`col_51`) /*T![clustered_index] CLUSTERED */ +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin +PARTITION BY HASH (`col_51`) PARTITIONS 5; +insert into t values (9223372036854775807), (9223372036854775808), (9223372036854775809), (9223372036854775812), (9223372036854775813); +analyze table t; +desc SELECT * FROM `t` WHERE `t`.`col_51` BETWEEN 9223372036854775807 AND 9223372036854775808; +id estRows task access object operator info +TableReader_6 2.00 root partition:p2,p3 data:TableRangeScan_5 +└─TableRangeScan_5 2.00 cop[tikv] table:t range:[9223372036854775807,9223372036854775808], keep order:false +SELECT * FROM `t` WHERE `t`.`col_51` BETWEEN 9223372036854775807 AND 9223372036854775808; +col_51 +9223372036854775807 +9223372036854775808 +explain select * from t where col_51 between 9223372036854775812 and 9223372036854775813; +id estRows task access object operator info +TableReader_6 2.00 root partition:p3,p4 data:TableRangeScan_5 +└─TableRangeScan_5 2.00 cop[tikv] table:t range:[9223372036854775812,9223372036854775813], keep order:false +select * from t where col_51 between 9223372036854775812 and 9223372036854775813; +col_51 +9223372036854775812 +9223372036854775813 +drop table if exists t; +CREATE TABLE `t` ( +`col_51` bigint(20) NOT NULL, +PRIMARY KEY (`col_51`) /*T![clustered_index] CLUSTERED */ +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin +PARTITION BY HASH (`col_51`) PARTITIONS 5; +insert into t values (9223372036854775807), (-9223372036854775808); +analyze table t; +desc SELECT * FROM `t` WHERE `t`.`col_51` BETWEEN -9223372036854775808 AND 9223372036854775807; +id estRows task access object operator info +TableReader_6 2.00 root partition:all data:TableFullScan_5 +└─TableFullScan_5 2.00 cop[tikv] table:t keep order:false +SELECT * FROM `t` WHERE `t`.`col_51` BETWEEN -9223372036854775808 AND 9223372036854775807; +col_51 +-9223372036854775808 +9223372036854775807 +drop table if exists t; +CREATE TABLE `t` ( +`col_51` bigint(20) unsigned NOT NULL, +PRIMARY KEY (`col_51`) /*T![clustered_index] CLUSTERED */ +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin +PARTITION BY KEY (`col_51`) PARTITIONS 5; +insert into t values (9223372036854775807), (9223372036854775808), (9223372036854775809); +analyze table t; +desc SELECT * FROM `t` WHERE `t`.`col_51` BETWEEN 9223372036854775807 AND 9223372036854775808; +id estRows task access object operator info +TableReader_6 2.00 root partition:p2 data:TableRangeScan_5 +└─TableRangeScan_5 2.00 cop[tikv] table:t range:[9223372036854775807,9223372036854775808], keep order:false +SELECT * FROM `t` WHERE `t`.`col_51` BETWEEN 9223372036854775807 AND 9223372036854775808; +col_51 +9223372036854775807 +9223372036854775808 +drop table if exists t; +CREATE TABLE `t` ( +`col_51` bigint(20) NOT NULL, +PRIMARY KEY (`col_51`) /*T![clustered_index] CLUSTERED */ +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin +PARTITION BY KEY (`col_51`) PARTITIONS 5; +insert into t values (9223372036854775807), (-9223372036854775808); +analyze table t; +desc SELECT * FROM `t` WHERE `t`.`col_51` BETWEEN -9223372036854775808 AND 9223372036854775807; +id estRows task access object operator info +TableReader_6 2.00 root partition:all data:TableFullScan_5 +└─TableFullScan_5 2.00 cop[tikv] table:t keep order:false +SELECT * FROM `t` WHERE `t`.`col_51` BETWEEN -9223372036854775808 AND 9223372036854775807; +col_51 +-9223372036854775808 +9223372036854775807 +drop table if exists t; +CREATE TABLE `t` ( +`col_29` tinyint(4) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci +PARTITION BY HASH (`col_29`) PARTITIONS 7; +INSERT INTO `t` VALUES (-1), (11), (-128), (39), (-46), (38), (-102), (-99), (-87), (-127), (-89), (43), (108), (59), (0), (24), (101), (37), (-103), (90), (-95), (-44), (123), (124), (-123), (-52), (-49), (-98), (-104), (-68), (2), (-24), (67), (89), (1), (-65), (36), (-109), (41), (5), (98), (-63), (-14), (127), (-6), (121), (14), (-122); +analyze table t; +explain select * from t where col_29 between -2 and -1; +id estRows task access object operator info +TableReader_7 1.00 root partition:p1,p2 data:Selection_6 +└─Selection_6 1.00 cop[tikv] ge(executor__partition__issues.t.col_29, -2), le(executor__partition__issues.t.col_29, -1) + └─TableFullScan_5 48.00 cop[tikv] table:t keep order:false +select * from t where col_29 between -2 and -1; +col_29 +-1 +explain select * from t where col_29 between -2 and 0; +id estRows task access object operator info +TableReader_7 2.00 root partition:p0,p1,p2 data:Selection_6 +└─Selection_6 2.00 cop[tikv] ge(executor__partition__issues.t.col_29, -2), le(executor__partition__issues.t.col_29, 0) + └─TableFullScan_5 48.00 cop[tikv] table:t keep order:false +select * from t where col_29 between -2 and 0; +col_29 +-1 +0 +explain select * from t where col_29 between -2 and 1; +id estRows task access object operator info +TableReader_7 3.00 root partition:p0,p1,p2 data:Selection_6 +└─Selection_6 3.00 cop[tikv] ge(executor__partition__issues.t.col_29, -2), le(executor__partition__issues.t.col_29, 1) + └─TableFullScan_5 48.00 cop[tikv] table:t keep order:false +select * from t where col_29 between -2 and 1; +col_29 +-1 +0 +1 +explain select * from t where col_29 between -7 and -6; +id estRows task access object operator info +TableReader_7 1.00 root partition:p0,p6 data:Selection_6 +└─Selection_6 1.00 cop[tikv] ge(executor__partition__issues.t.col_29, -7), le(executor__partition__issues.t.col_29, -6) + └─TableFullScan_5 48.00 cop[tikv] table:t keep order:false +select * from t where col_29 between -7 and -6; +col_29 +-6 diff --git a/tests/integrationtest/r/executor/partition/write.result b/tests/integrationtest/r/executor/partition/write.result index 06c6839eef19c..97d5330aa2e1c 100644 --- a/tests/integrationtest/r/executor/partition/write.result +++ b/tests/integrationtest/r/executor/partition/write.result @@ -7,7 +7,7 @@ partition by list (id*2 + b*b + b*b - b*b*2 - abs(id)) ( partition p0 values in (3,5,6,9,17), partition p1 values in (1,2,10,11,19,20), partition p2 values in (4,12,13,14,18), -partition p3 values in (7,8,15,16,null) +partition p3 values in (7,8,15,16,27,null) ); analyze table t; ## Test add unique index failed. @@ -812,3 +812,31 @@ select * from tIssue989; a b 111 2 set @@session.tidb_enable_table_partition = default; +drop table if exists insert_update_ignore_test; +create table insert_update_ignore_test (a int) partition by range (a) (partition p0 values less than (100), partition p1 values less than (200)); +insert ignore into insert_update_ignore_test values(1000); +show warnings where Message not like '%disable dynamic pruning%'; +Level Code Message +Warning 1526 Table has no partition for value 1000 +insert ignore into insert_update_ignore_test partition(p0) values(101); +show warnings where Message not like '%disable dynamic pruning%'; +Level Code Message +Warning 1748 Found a row not matching the given partition set +select * from insert_update_ignore_test; +a +insert into insert_update_ignore_test values(1); +update ignore insert_update_ignore_test set a=1000; +show warnings where Message not like '%disable dynamic pruning%'; +Level Code Message +Warning 1526 Table has no partition for value 1000 +select * from insert_update_ignore_test; +a +1 +update ignore insert_update_ignore_test partition(p0) set a=101; +show warnings where Message not like '%disable dynamic pruning%'; +Level Code Message +Warning 1748 Found a row not matching the given partition set +select * from insert_update_ignore_test; +a +1 +drop table insert_update_ignore_test; diff --git a/tests/integrationtest/r/executor/point_get.result b/tests/integrationtest/r/executor/point_get.result index aa1eaf1c81b59..225902d8b71e0 100644 --- a/tests/integrationtest/r/executor/point_get.result +++ b/tests/integrationtest/r/executor/point_get.result @@ -256,21 +256,21 @@ set @@sql_mode=""; explain format='brief' select * from t where a = "a"; id estRows task access object operator info IndexLookUp 10.00 root -├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:idx_1(a) range:[0x61,0x61], keep order:false, stats:pseudo +├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:idx_1(a) range:["a","a"], keep order:false, stats:pseudo └─TableRowIDScan(Probe) 10.00 cop[tikv] table:t keep order:false, stats:pseudo select * from t where a = "a"; a b explain format='brief' select * from t where a = "a "; id estRows task access object operator info IndexLookUp 10.00 root -├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:idx_1(a) range:[0x6120,0x6120], keep order:false, stats:pseudo +├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:idx_1(a) range:["a ","a "], keep order:false, stats:pseudo └─TableRowIDScan(Probe) 10.00 cop[tikv] table:t keep order:false, stats:pseudo select * from t where a = "a "; a b explain format='brief' select * from t where a = "a "; id estRows task access object operator info IndexLookUp 10.00 root -├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:idx_1(a) range:[0x612020,0x612020], keep order:false, stats:pseudo +├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:idx_1(a) range:["a ","a "], keep order:false, stats:pseudo └─TableRowIDScan(Probe) 10.00 cop[tikv] table:t keep order:false, stats:pseudo select * from t where a = "a "; a b @@ -278,7 +278,7 @@ explain format='brief' select hex(a), hex(b) from t where a = "a\0"; id estRows task access object operator info Projection 10.00 root hex(executor__point_get.t.a)->Column#4, hex(executor__point_get.t.b)->Column#5 └─IndexLookUp 10.00 root - ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:idx_1(a) range:[0x6100,0x6100], keep order:false, stats:pseudo + ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:idx_1(a) range:["a\x00","a\x00"], keep order:false, stats:pseudo └─TableRowIDScan(Probe) 10.00 cop[tikv] table:t keep order:false, stats:pseudo select hex(a), hex(b) from t where a = "a\0"; hex(a) hex(b) @@ -287,21 +287,21 @@ set @@sql_mode=""; explain format='brief' select * from t tmp where a = "a"; id estRows task access object operator info IndexLookUp 10.00 root -├─IndexRangeScan(Build) 10.00 cop[tikv] table:tmp, index:idx_1(a) range:[0x61,0x61], keep order:false, stats:pseudo +├─IndexRangeScan(Build) 10.00 cop[tikv] table:tmp, index:idx_1(a) range:["a","a"], keep order:false, stats:pseudo └─TableRowIDScan(Probe) 10.00 cop[tikv] table:tmp keep order:false, stats:pseudo select * from t tmp where a = "a"; a b explain format='brief' select * from t tmp where a = "a "; id estRows task access object operator info IndexLookUp 10.00 root -├─IndexRangeScan(Build) 10.00 cop[tikv] table:tmp, index:idx_1(a) range:[0x6120,0x6120], keep order:false, stats:pseudo +├─IndexRangeScan(Build) 10.00 cop[tikv] table:tmp, index:idx_1(a) range:["a ","a "], keep order:false, stats:pseudo └─TableRowIDScan(Probe) 10.00 cop[tikv] table:tmp keep order:false, stats:pseudo select * from t tmp where a = "a "; a b explain format='brief' select * from t tmp where a = "a "; id estRows task access object operator info IndexLookUp 10.00 root -├─IndexRangeScan(Build) 10.00 cop[tikv] table:tmp, index:idx_1(a) range:[0x612020,0x612020], keep order:false, stats:pseudo +├─IndexRangeScan(Build) 10.00 cop[tikv] table:tmp, index:idx_1(a) range:["a ","a "], keep order:false, stats:pseudo └─TableRowIDScan(Probe) 10.00 cop[tikv] table:tmp keep order:false, stats:pseudo select * from t tmp where a = "a "; a b @@ -309,7 +309,7 @@ explain format='brief' select hex(a), hex(b) from t tmp where a = "a\0"; id estRows task access object operator info Projection 10.00 root hex(executor__point_get.t.a)->Column#4, hex(executor__point_get.t.b)->Column#5 └─IndexLookUp 10.00 root - ├─IndexRangeScan(Build) 10.00 cop[tikv] table:tmp, index:idx_1(a) range:[0x6100,0x6100], keep order:false, stats:pseudo + ├─IndexRangeScan(Build) 10.00 cop[tikv] table:tmp, index:idx_1(a) range:["a\x00","a\x00"], keep order:false, stats:pseudo └─TableRowIDScan(Probe) 10.00 cop[tikv] table:tmp keep order:false, stats:pseudo select hex(a), hex(b) from t tmp where a = "a\0"; hex(a) hex(b) @@ -318,14 +318,14 @@ insert into t values("a ", "b "); explain format='brief' select * from t where a = "a"; id estRows task access object operator info IndexLookUp 10.00 root -├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:idx_1(a) range:[0x61,0x61], keep order:false, stats:pseudo +├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:idx_1(a) range:["a","a"], keep order:false, stats:pseudo └─TableRowIDScan(Probe) 10.00 cop[tikv] table:t keep order:false, stats:pseudo select * from t where a = "a"; a b explain format='brief' select * from t where a = "a "; id estRows task access object operator info IndexLookUp 10.00 root -├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:idx_1(a) range:[0x6120,0x6120], keep order:false, stats:pseudo +├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:idx_1(a) range:["a ","a "], keep order:false, stats:pseudo └─TableRowIDScan(Probe) 10.00 cop[tikv] table:t keep order:false, stats:pseudo select * from t where a = "a "; a b @@ -333,21 +333,21 @@ a b explain format='brief' select * from t where a = "a "; id estRows task access object operator info IndexLookUp 10.00 root -├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:idx_1(a) range:[0x612020,0x612020], keep order:false, stats:pseudo +├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:idx_1(a) range:["a ","a "], keep order:false, stats:pseudo └─TableRowIDScan(Probe) 10.00 cop[tikv] table:t keep order:false, stats:pseudo select * from t where a = "a "; a b explain format='brief' select * from t where a = "a"; id estRows task access object operator info IndexLookUp 10.00 root -├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:idx_1(a) range:[0x61,0x61], keep order:false, stats:pseudo +├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:idx_1(a) range:["a","a"], keep order:false, stats:pseudo └─TableRowIDScan(Probe) 10.00 cop[tikv] table:t keep order:false, stats:pseudo select * from t where a = "a"; a b explain format='brief' select * from t where a = "a "; id estRows task access object operator info IndexLookUp 10.00 root -├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:idx_1(a) range:[0x6120,0x6120], keep order:false, stats:pseudo +├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:idx_1(a) range:["a ","a "], keep order:false, stats:pseudo └─TableRowIDScan(Probe) 10.00 cop[tikv] table:t keep order:false, stats:pseudo select * from t where a = "a "; a b @@ -355,7 +355,7 @@ a b explain format='brief' select * from t where a = "a "; id estRows task access object operator info IndexLookUp 10.00 root -├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:idx_1(a) range:[0x612020,0x612020], keep order:false, stats:pseudo +├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:idx_1(a) range:["a ","a "], keep order:false, stats:pseudo └─TableRowIDScan(Probe) 10.00 cop[tikv] table:t keep order:false, stats:pseudo select * from t where a = "a "; a b @@ -631,3 +631,24 @@ update t set c = c + 1 where pk = 2; commit; Error 8002 (HY000): can not retry select for update statement set session tidb_txn_mode=pessimistic; +drop table if exists point; +create table point (id int primary key, c int, d varchar(10), unique c_d (c, d)); +insert point values (1, 1, 'a'); +insert point values (2, 2, 'b'); +lock tables point write; +select * from point where id = 1; +id c d +1 1 a +explain analyze select * from point where id = 1; +id estRows actRows task access object execution info operator info memory disk +Point_Get_1 1.00 1 root table:point .*num_rpc.* handle:1 N/A N/A +unlock tables; +update point set c = 3 where id = 1; +lock tables point write; +select * from point where id = 1; +id c d +1 3 a +explain analyze select * from point where id = 1; +id estRows actRows task access object execution info operator info memory disk +Point_Get_1 1.00 1 root table:point .*num_rpc.* handle:1 N/A N/A +unlock tables; diff --git a/tests/integrationtest/r/executor/show.result b/tests/integrationtest/r/executor/show.result index b76ab526b3387..c82e21e5302d2 100644 --- a/tests/integrationtest/r/executor/show.result +++ b/tests/integrationtest/r/executor/show.result @@ -1123,3 +1123,12 @@ select * from information_schema.COLLATIONS where IS_DEFAULT='Yes' and CHARACTER COLLATION_NAME CHARACTER_SET_NAME ID IS_DEFAULT IS_COMPILED SORTLEN utf8mb4_bin utf8mb4 46 Yes Yes 1 set @@session.default_collation_for_utf8mb4=default; +DROP TABLE IF EXISTS `t`; +CREATE TABLE `t` (a BIGINT PRIMARY KEY AUTO_RANDOM(2), b INT) PRE_SPLIT_REGIONS=4; +SHOW CREATE TABLE `t`; +Table Create Table +t CREATE TABLE `t` ( + `a` bigint(20) NOT NULL /*T![auto_rand] AUTO_RANDOM(2) */, + `b` int(11) DEFAULT NULL, + PRIMARY KEY (`a`) /*T![clustered_index] CLUSTERED */ +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin /*T! PRE_SPLIT_REGIONS=2 */ diff --git a/tests/integrationtest/r/executor/simple.result b/tests/integrationtest/r/executor/simple.result index 283aad1280361..6358dbe781af8 100644 --- a/tests/integrationtest/r/executor/simple.result +++ b/tests/integrationtest/r/executor/simple.result @@ -338,6 +338,9 @@ SET RESOURCE GROUP default; SELECT CURRENT_RESOURCE_GROUP(); CURRENT_RESOURCE_GROUP() default +SELECT /*+ RESOURCE_GROUP(rg1)*/ CURRENT_RESOURCE_GROUP(); +CURRENT_RESOURCE_GROUP() +rg1 SELECT CURRENT_RESOURCE_GROUP(); CURRENT_RESOURCE_GROUP() rg1 diff --git a/tests/integrationtest/r/executor/split_table.result b/tests/integrationtest/r/executor/split_table.result index 340b148ff795d..9270bf0327a7d 100644 --- a/tests/integrationtest/r/executor/split_table.result +++ b/tests/integrationtest/r/executor/split_table.result @@ -100,11 +100,6 @@ split table t by ('aaa', 100.0), ('qqq', 20.0), ('zzz', 100.0), ('zzz', 1000.0); TOTAL_SPLIT_REGION SCATTER_FINISH_RATIO 3 1 drop table t; -create table t (a int, b int, c int, d int, primary key(a, c, d)); -split table t between (0, 0, 0) and (0, 0, 1) regions 1000; -TOTAL_SPLIT_REGION SCATTER_FINISH_RATIO -999 1 -drop table t; create table t (a int, b int, c int, d int, primary key(d, a, c)); split table t by (0, 0, 0), (1, 2, 3), (65535, 65535, 65535); TOTAL_SPLIT_REGION SCATTER_FINISH_RATIO @@ -116,5 +111,5 @@ Error 1265 (01000): Incorrect value: '' for column 'b' drop table t; CREATE TABLE t (`id` varchar(10) NOT NULL, primary key (`id`) CLUSTERED); split table t index `primary` between (0) and (1000) regions 2; -Error 1176 (42000): Key 'primary' doesn't exist in table 't' +Error 1176 (42000): unable to split clustered index, please split table instead. set tidb_enable_clustered_index=default; diff --git a/tests/integrationtest/r/executor/update.result b/tests/integrationtest/r/executor/update.result index 5b11c91279039..547b159443ecd 100644 --- a/tests/integrationtest/r/executor/update.result +++ b/tests/integrationtest/r/executor/update.result @@ -521,13 +521,13 @@ analyze table t; insert ignore into t values (1); update ignore t set a=2 where a=1; affected rows: 0 -info: Rows matched: 1 Changed: 0 Warnings: 0 +info: Rows matched: 1 Changed: 0 Warnings: 1 drop table if exists t; create table t (a int key) partition by list (a) (partition p0 values in (0,1)); insert ignore into t values (1); update ignore t set a=2 where a=1; affected rows: 0 -info: Rows matched: 1 Changed: 0 Warnings: 0 +info: Rows matched: 1 Changed: 0 Warnings: 1 set @@session.tidb_enable_list_partition = default; drop table if exists t; create table t(id integer auto_increment, t1 datetime, t2 datetime, primary key (id)); diff --git a/tests/integrationtest/r/executor/write.result b/tests/integrationtest/r/executor/write.result index 70bfb62329b75..2d8beea1b32d9 100644 --- a/tests/integrationtest/r/executor/write.result +++ b/tests/integrationtest/r/executor/write.result @@ -2012,8 +2012,8 @@ replace replace_test_1 select id, c1 from replace_test; affected rows: 4 info: Records: 4 Duplicates: 0 Warnings: 0 begin; -replace replace_test_0 select c1 from replace_test; -Error 1146 (42S02): Table 'executor__write.replace_test_0' doesn't exist +replace replace_test_1 select c1 from replace_test; +Error 1136 (21S01): Column count doesn't match value count at row 1 rollback; create table replace_test_2 (id int, c1 int); replace replace_test_1 select id, c1 from replace_test union select id * 10, c1 * 10 from replace_test; diff --git a/tests/integrationtest/r/explain_easy.result b/tests/integrationtest/r/explain_easy.result index 83e569d15ba5e..1a200d1932a66 100644 --- a/tests/integrationtest/r/explain_easy.result +++ b/tests/integrationtest/r/explain_easy.result @@ -197,7 +197,7 @@ HashAgg 24000.00 root group by:Column#10, funcs:firstrow(Column#11)->Column#10 └─IndexReader 8000.00 root index:StreamAgg └─StreamAgg 8000.00 cop[tikv] group by:explain_easy.t2.c1, └─IndexFullScan 10000.00 cop[tikv] table:t2, index:c1(c1) keep order:true, stats:pseudo -select * from information_schema.tidb_indexes where table_name='t4'; +select * from information_schema.tidb_indexes where table_name='t4' and table_schema='explain_easy'; TABLE_SCHEMA TABLE_NAME NON_UNIQUE KEY_NAME SEQ_IN_INDEX COLUMN_NAME SUB_PART INDEX_COMMENT Expression INDEX_ID IS_VISIBLE CLUSTERED explain_easy t4 0 PRIMARY 1 a NULL NULL 0 YES YES explain_easy t4 1 idx 1 a NULL NULL 1 YES NO @@ -789,13 +789,13 @@ create table t(a binary(16) not null, b varchar(2) default null, c varchar(100) explain format = 'brief' select * from t where a=x'FA34E1093CB428485734E3917F000000' and b='xb'; id estRows task access object operator info IndexLookUp 0.10 root -├─IndexRangeScan(Build) 0.10 cop[tikv] table:t, index:a(a, b) range:[0xFA34E1093CB428485734E3917F000000 "xb",0xFA34E1093CB428485734E3917F000000 "xb"], keep order:false, stats:pseudo +├─IndexRangeScan(Build) 0.10 cop[tikv] table:t, index:a(a, b) range:["\xfa4\xe1\t<\xb4(HW4\xe3\x91\x7f\x00\x00\x00" "xb","\xfa4\xe1\t<\xb4(HW4\xe3\x91\x7f\x00\x00\x00" "xb"], keep order:false, stats:pseudo └─TableRowIDScan(Probe) 0.10 cop[tikv] table:t keep order:false, stats:pseudo explain format = 'brief' update t set c = 'ssss' where a=x'FA34E1093CB428485734E3917F000000' and b='xb'; id estRows task access object operator info Update N/A root N/A └─IndexLookUp 0.10 root - ├─IndexRangeScan(Build) 0.10 cop[tikv] table:t, index:a(a, b) range:[0xFA34E1093CB428485734E3917F000000 "xb",0xFA34E1093CB428485734E3917F000000 "xb"], keep order:false, stats:pseudo + ├─IndexRangeScan(Build) 0.10 cop[tikv] table:t, index:a(a, b) range:["\xfa4\xe1\t<\xb4(HW4\xe3\x91\x7f\x00\x00\x00" "xb","\xfa4\xe1\t<\xb4(HW4\xe3\x91\x7f\x00\x00\x00" "xb"], keep order:false, stats:pseudo └─TableRowIDScan(Probe) 0.10 cop[tikv] table:t keep order:false, stats:pseudo drop table if exists t; create table t(a int, b int); diff --git a/tests/integrationtest/r/explain_easy_stats.result b/tests/integrationtest/r/explain_easy_stats.result index 1e508ac0300b9..1d375da7ac63c 100644 --- a/tests/integrationtest/r/explain_easy_stats.result +++ b/tests/integrationtest/r/explain_easy_stats.result @@ -178,7 +178,9 @@ id estRows task access object operator info Point_Get 1.00 root table:index_prune, index:PRIMARY(a, b) explain format = 'brief' select * from index_prune WHERE a = 1010010404050976781 AND b = 26467085526790 GROUP BY b ORDER BY a limit 1; id estRows task access object operator info -Point_Get 1.00 root table:index_prune, index:PRIMARY(a, b) +TopN 1.00 root explain_easy_stats.index_prune.a, offset:0, count:1 +└─StreamAgg 1.00 root group by:explain_easy_stats.index_prune.b, funcs:firstrow(explain_easy_stats.index_prune.a)->explain_easy_stats.index_prune.a, funcs:firstrow(explain_easy_stats.index_prune.b)->explain_easy_stats.index_prune.b, funcs:firstrow(explain_easy_stats.index_prune.c)->explain_easy_stats.index_prune.c + └─Point_Get 1.00 root table:index_prune, index:PRIMARY(a, b) drop table if exists t1, t2, t3, index_prune; set @@session.tidb_opt_insubq_to_join_and_agg=1; drop table if exists tbl; diff --git a/tests/integrationtest/r/explain_generate_column_substitute.result b/tests/integrationtest/r/explain_generate_column_substitute.result index 0a1b4a035342c..f80b514fad34e 100644 --- a/tests/integrationtest/r/explain_generate_column_substitute.result +++ b/tests/integrationtest/r/explain_generate_column_substitute.result @@ -396,7 +396,8 @@ id estRows task access object operator info StreamAgg 1.00 root funcs:count(Column#6)->Column#4 └─IndexReader 1.00 root index:StreamAgg └─StreamAgg 1.00 cop[tikv] funcs:count(1)->Column#6 - └─IndexRangeScan 250.00 cop[tikv] table:tbl1, index:expression_index(md5(`s`)) range:["02e74f10e0327ad868d138f2b4fdd6f","02e74f10e0327ad868d138f2b4fdd6g"), keep order:false, stats:pseudo + └─Selection 250.00 cop[tikv] like(md5(cast(explain_generate_column_substitute.tbl1.s, var_string(20))), "02e74f10e0327ad868d138f2b4fdd6f%", 92) + └─IndexRangeScan 250.00 cop[tikv] table:tbl1, index:expression_index(md5(`s`)) range:["02e74f10e0327ad868d138f2b4fdd6f","02e74f10e0327ad868d138f2b4fdd6g"), keep order:false, stats:pseudo select count(*) from tbl1 use index() where md5(s) like '02e74f10e0327ad868d138f2b4fdd6f%'; count(*) 64 @@ -428,14 +429,14 @@ StreamAgg 4.80 root group by:upper(explain_generate_column_substitute.t.b), fun └─IndexFullScan 6.00 cop[tikv] table:t, index:expression_index_2(upper(`b`)) keep order:true desc format = 'brief' select count(upper(b)) from t use index() group by upper(b); id estRows task access object operator info -HashAgg 6.00 root group by:Column#9, funcs:count(Column#8)->Column#7 -└─Projection 6.00 root upper(explain_generate_column_substitute.t.b)->Column#8, upper(explain_generate_column_substitute.t.b)->Column#9 +HashAgg 6.00 root group by:Column#11, funcs:count(Column#10)->Column#7 +└─Projection 6.00 root upper(explain_generate_column_substitute.t.b)->Column#10, upper(explain_generate_column_substitute.t.b)->Column#11 └─TableReader 6.00 root data:TableFullScan └─TableFullScan 6.00 cop[tikv] table:t keep order:false desc format = 'brief' select max(upper(b)) from t use index() group by upper(b); id estRows task access object operator info -HashAgg 6.00 root group by:Column#9, funcs:max(Column#8)->Column#7 -└─Projection 6.00 root upper(explain_generate_column_substitute.t.b)->Column#8, upper(explain_generate_column_substitute.t.b)->Column#9 +HashAgg 6.00 root group by:Column#11, funcs:max(Column#10)->Column#7 +└─Projection 6.00 root upper(explain_generate_column_substitute.t.b)->Column#10, upper(explain_generate_column_substitute.t.b)->Column#11 └─TableReader 6.00 root data:TableFullScan └─TableFullScan 6.00 cop[tikv] table:t keep order:false drop table if exists t; diff --git a/tests/integrationtest/r/expression/cast.result b/tests/integrationtest/r/expression/cast.result index c4d5a2d63d3f8..6628ec0af24c6 100644 --- a/tests/integrationtest/r/expression/cast.result +++ b/tests/integrationtest/r/expression/cast.result @@ -97,3 +97,14 @@ select 1 from t where y = YEAR(CURDATE()); select cast(cast('14:15' as time) as year) = YEAR(CURDATE()); cast(cast('14:15' as time) as year) = YEAR(CURDATE()) 1 +explain select null as a union all select 'a' as a; +id estRows task access object operator info +Union_8 2.00 root +├─Projection_10 1.00 root ->Column#3 +│ └─TableDual_11 1.00 root rows:1 +└─Projection_12 1.00 root a->Column#3 + └─TableDual_13 1.00 root rows:1 +select null as a union all select 'a' as a; +a +NULL +a diff --git a/tests/integrationtest/r/expression/charset_and_collation.result b/tests/integrationtest/r/expression/charset_and_collation.result index 99e6bd15af159..4e792011683ba 100644 --- a/tests/integrationtest/r/expression/charset_and_collation.result +++ b/tests/integrationtest/r/expression/charset_and_collation.result @@ -1895,7 +1895,7 @@ c 1 explain format="brief" select v from t where v < 'b' order by v; id estRows task access object operator info IndexReader 3323.33 root index:IndexRangeScan -└─IndexRangeScan 3323.33 cop[tikv] table:t, index:v(v) range:[-inf,"b"), keep order:true, stats:pseudo +└─IndexRangeScan 3323.33 cop[tikv] table:t, index:v(v) range:[-inf,"\x00B"), keep order:true, stats:pseudo select v from t where v < 'b' order by v; v @@ -1906,7 +1906,7 @@ a explain format="brief" select v from t where v < 'b' and v > ' ' order by v; id estRows task access object operator info IndexReader 250.00 root index:IndexRangeScan -└─IndexRangeScan 250.00 cop[tikv] table:t, index:v(v) range:(" ","b"), keep order:true, stats:pseudo +└─IndexRangeScan 250.00 cop[tikv] table:t, index:v(v) range:("","\x00B"), keep order:true, stats:pseudo select v from t where v < 'b' and v > ' ' order by v; v a @@ -1916,7 +1916,7 @@ a explain format="brief" select v from t_bin where v < 'b' order by v; id estRows task access object operator info IndexReader 3323.33 root index:IndexRangeScan -└─IndexRangeScan 3323.33 cop[tikv] table:t_bin, index:v(v) range:[-inf,0x62), keep order:true, stats:pseudo +└─IndexRangeScan 3323.33 cop[tikv] table:t_bin, index:v(v) range:[-inf,"b"), keep order:true, stats:pseudo select v from t_bin where v < 'b' order by v; v @@ -1924,7 +1924,7 @@ a explain format="brief" select v from t_bin where v < 'b' and v > ' ' order by v; id estRows task access object operator info IndexReader 250.00 root index:IndexRangeScan -└─IndexRangeScan 250.00 cop[tikv] table:t_bin, index:v(v) range:(0x20,0x62), keep order:true, stats:pseudo +└─IndexRangeScan 250.00 cop[tikv] table:t_bin, index:v(v) range:(" ","b"), keep order:true, stats:pseudo select v from t_bin where v < 'b' and v > ' ' order by v; v a @@ -1932,7 +1932,7 @@ explain format="brief" select id from t use index(v) where v < 'b'; id estRows task access object operator info Projection 3323.33 root expression__charset_and_collation.t.id └─IndexLookUp 3323.33 root - ├─IndexRangeScan(Build) 3323.33 cop[tikv] table:t, index:v(v) range:[-inf,"b"), keep order:false, stats:pseudo + ├─IndexRangeScan(Build) 3323.33 cop[tikv] table:t, index:v(v) range:[-inf,"\x00B"), keep order:false, stats:pseudo └─TableRowIDScan(Probe) 3323.33 cop[tikv] table:t keep order:false, stats:pseudo select id from t use index(v) where v < 'b'; id @@ -1945,7 +1945,7 @@ explain format="brief" select id from t use index(v) where v < 'b' and v > ' '; id estRows task access object operator info Projection 250.00 root expression__charset_and_collation.t.id └─IndexLookUp 250.00 root - ├─IndexRangeScan(Build) 250.00 cop[tikv] table:t, index:v(v) range:(" ","b"), keep order:false, stats:pseudo + ├─IndexRangeScan(Build) 250.00 cop[tikv] table:t, index:v(v) range:("","\x00B"), keep order:false, stats:pseudo └─TableRowIDScan(Probe) 250.00 cop[tikv] table:t keep order:false, stats:pseudo select id from t use index(v) where v < 'b' and v > ' '; id @@ -1957,7 +1957,7 @@ explain format="brief" select id from t_bin use index(v) where v < 'b'; id estRows task access object operator info Projection 3323.33 root expression__charset_and_collation.t_bin.id └─IndexLookUp 3323.33 root - ├─IndexRangeScan(Build) 3323.33 cop[tikv] table:t_bin, index:v(v) range:[-inf,0x62), keep order:false, stats:pseudo + ├─IndexRangeScan(Build) 3323.33 cop[tikv] table:t_bin, index:v(v) range:[-inf,"b"), keep order:false, stats:pseudo └─TableRowIDScan(Probe) 3323.33 cop[tikv] table:t_bin keep order:false, stats:pseudo select id from t_bin use index(v) where v < 'b'; id @@ -1967,7 +1967,7 @@ explain format="brief" select id from t_bin use index(v) where v < 'b' and v > ' id estRows task access object operator info Projection 250.00 root expression__charset_and_collation.t_bin.id └─IndexLookUp 250.00 root - ├─IndexRangeScan(Build) 250.00 cop[tikv] table:t_bin, index:v(v) range:(0x20,0x62), keep order:false, stats:pseudo + ├─IndexRangeScan(Build) 250.00 cop[tikv] table:t_bin, index:v(v) range:(" ","b"), keep order:false, stats:pseudo └─TableRowIDScan(Probe) 250.00 cop[tikv] table:t_bin keep order:false, stats:pseudo select id from t_bin use index(v) where v < 'b' and v > ' '; id diff --git a/tests/integrationtest/r/expression/enum_set.result b/tests/integrationtest/r/expression/enum_set.result new file mode 100644 index 0000000000000..70757919a0e27 --- /dev/null +++ b/tests/integrationtest/r/expression/enum_set.result @@ -0,0 +1,54 @@ +drop table if exists t01; +CREATE TABLE `t01` ( +`6524d87a` timestamp DEFAULT '2024-10-02 01:54:55', +`744e4d52` int(11) NOT NULL DEFAULT '2023959529', +`087de3b2` varchar(122) DEFAULT '36h0hvfpylz0f0iv9h0ownfcg3rehi4', +`26cbbf2a` enum('l7i9','3sdz3','83','4','92p','4g','8y5rn','7gp','7','1','e') NOT NULL DEFAULT '4', +PRIMARY KEY (`744e4d52`,`26cbbf2a`) /*T![clustered_index] CLUSTERED */ +) ENGINE=InnoDB DEFAULT CHARSET=gbk COLLATE=gbk_chinese_ci COMMENT='7ad99128' +PARTITION BY HASH (`744e4d52`) PARTITIONS 9; +insert ignore into t01 values ("2023-01-01 20:01:02", 123, 'abcd', ''); +select `t01`.`26cbbf2a` as r0 from `t01` where `t01`.`6524d87a` in ( '2010-05-25') or not( `t01`.`26cbbf2a` > '1' ) ; +r0 + +CREATE TABLE `t047d7221` ( +`col_14_1` enum('Alice','Bob','Charlie','David') COLLATE utf8mb4_general_ci DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +INSERT INTO `t047d7221` VALUES ('Charlie'),('Charlie'),('David'),('Bob'),('Bob'),('Charlie'),('David'),('Bob'),('Charlie'),('David'),('Bob'),('Bob'),('David'),('Alice'),('David'),('Alice'),('Charlie'),('Charlie'),('David'),('Alice'),('David'); +CREATE TABLE `t3fa8f3ec` ( +`col_31` timestamp NOT NULL, +`col_32` mediumint(9) DEFAULT '-4350144', +`col_33` json DEFAULT NULL, +`col_34` time NOT NULL DEFAULT '14:52:13', +`col_35` float DEFAULT NULL, +`col_36` decimal(14,10) DEFAULT NULL, +`col_37` bit(32) DEFAULT NULL, +UNIQUE KEY `idx_14` (`col_32`,`col_37`,`col_34`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +INSERT INTO `t3fa8f3ec` VALUES ('2032-12-07 16:00:00',4171813,'null','06:50:04',628.79083,0.0000000000,_binary '0x1'),('2032-12-07 16:00:00',-562928,'null','06:35:17',628.79083,0.0000000000,_binary '0x1'),('2012-05-10 16:00:00',-5344713,'null','03:29:46',628.79083,0.0000000000,_binary '0x1'),('1983-06-11 16:00:00',3067543,'null','07:07:40',628.79083,0.0000000000,_binary '0x1'),('1979-03-16 16:00:00',5251228,'null','06:21:55',628.79083,0.0000000000,_binary '0x1'),('2008-04-22 16:00:00',-3305758,'null','02:42:21',628.79083,0.0000000000,_binary '0x1'),('2025-03-16 16:00:00',1451903,'null','09:50:08',628.79083,0.0000000000,_binary '0x1'),('2017-03-17 16:00:00',1752413,'null','15:55:09',628.79083,0.0000000000,_binary '0x1'),('2020-03-11 16:00:00',-5845368,'null','03:40:14',628.79083,0.0000000000,_binary '0x1'),('2002-11-27 16:00:00',693868,'null','16:15:51',628.79083,0.0000000000,_binary '0x1'),('2020-10-06 16:00:00',6098278,'null','03:01:46',628.79083,0.0000000000,_binary '0x1'),('2001-01-24 16:00:00',-5515593,'null','09:49:41',628.79083,0.0000000000,_binary '0x1'),('1973-12-09 16:00:00',7401513,'null','14:00:07',628.79083,0.0000000000,_binary '0x1'),('1982-03-19 16:00:00',4056108,'null','19:08:54',628.79083,0.0000000000,_binary '0x1'),('2032-12-07 16:00:00',6734101,'null','05:06:04',628.79083,0.0000000000,_binary '0x1'),('2032-12-07 16:00:00',-2705751,'null','03:18:49',628.79083,0.0000000000,_binary '0x1'),('2032-12-07 16:00:00',3783896,'null','03:03:39',628.79083,0.0000000000,_binary '0x1'),('2032-12-07 16:00:00',7486166,'null','02:47:01',628.79083,0.0000000000,_binary '0x1'),('2032-12-07 16:00:00',-5914941,'null','03:17:47',628.79083,0.0000000000,_binary '0x1'),('2032-12-07 16:00:00',6356646,'null','06:14:33',628.79083,0.0000000000,_binary '0x1'),('2035-05-01 16:00:00',-718476,'null','03:08:09',628.79083,0.0000000000,_binary '0x1'),('1991-03-10 16:00:00',-3825016,'null','11:39:20',628.79083,0.0000000000,_binary '0x1'),('2014-10-05 16:00:00',7724461,'null','18:16:29',628.79083,0.0000000000,_binary '0x1'),('1980-08-13 16:00:00',-1425586,'null','19:32:41',628.79083,0.0000000000,_binary '0x1'),('2009-08-22 16:00:00',-6087216,'null','07:49:31',628.79083,0.0000000000,_binary '0x1'),('2004-02-14 16:00:00',-2440696,'null','06:25:48',628.79083,0.0000000000,_binary '0x1'),('2002-02-02 16:00:00',-3965686,'null','18:36:41',628.79083,0.0000000000,_binary '0x1'),('2018-09-20 16:00:00',-2090316,'null','01:21:13',628.79083,0.0000000000,_binary '0x1'),('2032-12-07 16:00:00',-2719454,'null','06:12:56',628.79083,0.0000000000,_binary '0x1'),('2032-12-07 16:00:00',-2719454,'null','01:04:04',628.79083,0.0000000000,_binary '0x1'),('2032-12-07 16:00:00',-5801694,'null','06:59:41',628.79083,0.0000000000,_binary '0x1'),('2032-12-07 16:00:00',-2719454,'null','03:48:16',628.79083,0.0000000000,_binary '0x1'),('2032-12-07 16:00:00',-2719454,'null','05:13:54',628.79083,0.0000000000,_binary '0x1'),('2032-12-07 16:00:00',-2719454,'null','03:42:29',628.79083,0.0000000000,_binary '0x1'),('2032-12-07 16:00:00',-2719454,'null','01:19:57',628.79083,0.0000000000,_binary '0x1'),('2032-12-07 16:00:00',-2719454,'null','00:55:46',628.79083,0.0000000000,_binary '0x1'),('2010-09-14 16:00:00',4849424,'null','06:02:32',628.79083,0.0000000000,_binary '0x1'),('2002-07-30 16:00:00',6109034,'null','06:33:39',628.79083,0.0000000000,_binary '0x1'),('1971-08-21 16:00:00',5571999,'null','12:13:37',628.79083,0.0000000000,_binary '0x1'),('2032-10-11 16:00:00',3762434,'null','09:10:40',628.79083,0.0000000000,_binary '0x1'),('2005-09-08 16:00:00',-6554119,'null','19:36:37',628.79083,0.0000000000,_binary '0x1'),('1981-01-10 16:00:00',-1179289,'null','09:35:00',628.79083,0.0000000000,_binary '0x1'),('2028-08-22 16:00:00',8316284,'null','08:16:44',628.79083,0.0000000000,_binary '0x1'),('1979-05-17 16:00:00',-5318419,'null','17:59:56',628.79083,0.0000000000,_binary '0x1'),('2027-05-11 16:00:00',-5371444,'null','17:19:10',628.79083,0.0000000000,_binary '0x1'),('2013-12-25 16:00:00',-189564,'null','12:04:41',628.79083,0.0000000000,_binary '0x1'),('2016-01-16 16:00:00',-3987539,'null','02:11:34',628.79083,0.0000000000,_binary '0x1'),('1982-11-11 16:00:00',-852334,'null','03:04:13',628.79083,0.0000000000,_binary '0x1'),('2032-12-07 16:00:00',7925662,'null','03:18:23',628.79083,0.0000000000,_binary '0x1'),('2032-12-07 16:00:00',-2454587,'null','02:55:28',628.79083,0.0000000000,_binary '0x1'),('2032-12-07 16:00:00',5739127,'null','06:03:13',628.79083,0.0000000000,_binary '0x1'),('2003-09-24 16:00:00',7753112,'null','00:20:56',628.79083,0.0000000000,_binary '0x1'),('1974-06-27 16:00:00',5429127,'null','02:58:31',628.79083,0.0000000000,_binary '0x1'),('2019-05-10 16:00:00',-5681972,'null','02:17:08',628.79083,0.0000000000,_binary '0x1'),('1992-02-11 16:00:00',1122337,'null','03:41:03',628.79083,0.0000000000,_binary '0x1'),('2036-11-28 16:00:00',40717,'null','03:30:04',628.79083,0.0000000000,_binary '0x1'),('1985-09-24 16:00:00',-4983092,'null','19:41:50',628.79083,0.0000000000,_binary '0x1'),('1972-04-05 16:00:00',520097,'null','19:24:54',628.79083,0.0000000000,_binary '0x1'),('2023-08-19 16:00:00',396327,'null','22:37:52',628.79083,0.0000000000,_binary '0x1'),('2019-12-27 16:00:00',-4990207,'null','12:18:44',628.79083,0.0000000000,_binary '0x1'),('2011-10-04 16:00:00',-149632,'null','20:59:59',628.79083,0.0000000000,_binary '0x1'),('1979-02-22 16:00:00',1099937,'null','12:28:27',628.79083,0.0000000000,_binary '0x1'),('2033-11-19 16:00:00',1089042,'true','14:37:01',4436.5244,0.0138000000,_binary '0x1'),('2032-12-07 16:00:00',-6008365,'null','00:45:53',628.79083,0.0000000000,_binary '0x1'),('2032-12-07 16:00:00',NULL,'null','03:22:27',628.79083,0.0000000000,_binary '0x1'),('2032-12-07 16:00:00',-3819435,'null','00:03:28',628.79083,0.0000000000,_binary '0x1'),('2012-01-19 16:00:00',7593580,'null','03:17:19',628.79083,0.0000000000,_binary '0x1'),('2007-06-11 16:00:00',-5412530,'null','05:17:36',628.79083,0.0000000000,_binary '0x1'),('2010-05-01 16:00:00',2846505,'null','02:19:05',628.79083,0.0000000000,_binary '0x1'),('1989-03-30 16:00:00',7038365,'null','13:30:27',628.79083,0.0000000000,_binary '0x1'),('2021-01-20 16:00:00',NULL,'null','11:07:47',628.79083,0.0000000000,_binary '0x1'),('2025-07-01 16:00:00',4456660,'null','01:27:15',628.79083,0.0000000000,_binary '0x1'),('2029-02-04 16:00:00',4791195,'null','14:38:02',628.79083,0.0000000000,_binary '0x1'),('1978-08-02 16:00:00',4369375,'null','11:30:30',628.79083,0.0000000000,_binary '0x1'),('1974-11-15 16:00:00',4095160,'null','01:56:26',628.79083,0.0000000000,_binary '0x1'),('2008-03-28 16:00:00',NULL,'null','22:59:27',628.79083,0.0000000000,_binary '0x1'); +select t047d7221.col_14_1, t3fa8f3ec.col_36 from t047d7221 left join t3fa8f3ec on t047d7221.col_14_1 = t3fa8f3ec.col_36 where t047d7221.col_14_1 in ( 'Charlie' ); +col_14_1 col_36 +Charlie NULL +Charlie NULL +Charlie NULL +Charlie NULL +Charlie NULL +Charlie NULL +insert into t3fa8f3ec values('1982-03-19 16:00:00', 23423, null, '09:49:41', 628.79083, 3.0, 0x00307831); +select t047d7221.col_14_1, t3fa8f3ec.col_36 from t047d7221 left join t3fa8f3ec on t047d7221.col_14_1 = t3fa8f3ec.col_36 where t047d7221.col_14_1 in ( 'Charlie' ); +col_14_1 col_36 +Charlie 3.0000000000 +Charlie 3.0000000000 +Charlie 3.0000000000 +Charlie 3.0000000000 +Charlie 3.0000000000 +Charlie 3.0000000000 +insert into t3fa8f3ec values('1982-03-19 16:00:00', 23424, null, '09:49:41', 628.79083, 3.1, 0x00307831); +select t047d7221.col_14_1, t3fa8f3ec.col_36 from t047d7221 left join t3fa8f3ec on t047d7221.col_14_1 = t3fa8f3ec.col_36 where t047d7221.col_14_1 in ( 'Charlie' ); +col_14_1 col_36 +Charlie 3.0000000000 +Charlie 3.0000000000 +Charlie 3.0000000000 +Charlie 3.0000000000 +Charlie 3.0000000000 +Charlie 3.0000000000 diff --git a/tests/integrationtest/r/expression/issues.result b/tests/integrationtest/r/expression/issues.result index f83efc641ffb1..ca2c8e2dcd66d 100644 --- a/tests/integrationtest/r/expression/issues.result +++ b/tests/integrationtest/r/expression/issues.result @@ -482,19 +482,19 @@ SELECT 10000101000000 + INTERVAL "111111111111." SECOND; 4520-12-21 05:31:51 SELECT 10000101000000 + INTERVAL "111111111111111111.5" MICROSECOND; 10000101000000 + INTERVAL "111111111111111111.5" MICROSECOND -4520-12-21 05:31:51.111112 +4520-12-21 05:31:51.111111 SELECT 10000101000000 + INTERVAL "111111111111111112.5" MICROSECOND; 10000101000000 + INTERVAL "111111111111111112.5" MICROSECOND -4520-12-21 05:31:51.111113 +4520-12-21 05:31:51.111112 SELECT 10000101000000 + INTERVAL "111111111111111111.500000" MICROSECOND; 10000101000000 + INTERVAL "111111111111111111.500000" MICROSECOND -4520-12-21 05:31:51.111112 +4520-12-21 05:31:51.111111 SELECT 10000101000000 + INTERVAL "111111111111111111.50000000" MICROSECOND; 10000101000000 + INTERVAL "111111111111111111.50000000" MICROSECOND -4520-12-21 05:31:51.111112 +4520-12-21 05:31:51.111111 SELECT 10000101000000 + INTERVAL "111111111111111111.6" MICROSECOND; 10000101000000 + INTERVAL "111111111111111111.6" MICROSECOND -4520-12-21 05:31:51.111112 +4520-12-21 05:31:51.111111 SELECT 10000101000000 + INTERVAL "111111111111111111.499999" MICROSECOND; 10000101000000 + INTERVAL "111111111111111111.499999" MICROSECOND 4520-12-21 05:31:51.111111 @@ -1750,24 +1750,28 @@ a b drop table if exists t; create table t(a varchar(32)) DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -insert into t values('ʞ'), ('İ'); +insert into t values('ʞ'), ('İ'), ('ß'); set @@tidb_enable_vectorized_expression = false; select binary upper(a), lower(a) from t order by upper(a); binary upper(a) lower(a) İ i +ß ß Ʞ ʞ select distinct upper(a), lower(a) from t order by upper(a); upper(a) lower(a) İ i +ß ß Ʞ ʞ set @@tidb_enable_vectorized_expression = true; select binary upper(a), lower(a) from t order by upper(a); binary upper(a) lower(a) İ i +ß ß Ʞ ʞ select distinct upper(a), lower(a) from t order by upper(a); upper(a) lower(a) İ i +ß ß Ʞ ʞ set @@tidb_enable_vectorized_expression = default; drop table if exists t; @@ -2094,9 +2098,9 @@ create table t(a char(4) collate utf8_general_ci primary key /*T![clustered_inde insert into t values('`?'); explain format='brief' select * from t where a like '`%'; id estRows task access object operator info -TableReader 8000.00 root data:Selection -└─Selection 8000.00 cop[tikv] like(expression__issues.t.a, "`%", 92) - └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo +TableReader 250.00 root data:Selection +└─Selection 250.00 cop[tikv] like(expression__issues.t.a, "`%", 92) + └─TableRangeScan 250.00 cop[tikv] table:t range:["\x00`","\x00a"), keep order:false, stats:pseudo select * from t where a like '`%'; a `? @@ -2106,7 +2110,7 @@ insert into t values('`?'); explain format='brief' select * from t where a like '`%'; id estRows task access object operator info TableReader 250.00 root data:TableRangeScan -└─TableRangeScan 250.00 cop[tikv] table:t range:[0x60,0x61), keep order:false, stats:pseudo +└─TableRangeScan 250.00 cop[tikv] table:t range:["`","a"), keep order:false, stats:pseudo select * from t where a like '`%'; a `? @@ -3165,3 +3169,26 @@ set sql_mode='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DAT insert into table_20220419(lastLoginDate) select lastLoginDate from table_20220419; Error 1292 (22007): Incorrect datetime value: '0000-00-00 00:00:00' set sql_mode=default; +drop table if exists test.t; +create table test.t (a varchar(10), b tinyint(1)); +insert into test.t values ("abc", 1); +select * from test.t where (a, b) in (('a', 1), (null, 0)); +a b +update test.t set b = 0 where (a, b) in (('a', 1), (null, 0)); +SHOW WARNINGS; +Level Code Message +drop table if exists test.t; +create table if not exists test.ast (i varchar(20)); +create table if not exists test.acc (j varchar(20), k varchar(20), l varchar(20), m varchar(20)); +explain format='brief' with t as(select i, (case when b.j = '20001' then b.l else b.k end) an from test.ast a inner join test.acc b on (a.i = b.m) and a.i = 'astp2019121731703151'), t1 as (select i, group_concat(an order by an separator '; ') an from t group by i) select * from t1; +id estRows task access object operator info +Projection 8.00 root test.ast.i, Column#32 +└─HashAgg 8.00 root group by:Column#37, funcs:group_concat(Column#34 order by Column#35 separator "; ")->Column#32, funcs:firstrow(Column#36)->test.ast.i + └─Projection 100.00 root case(eq(test.acc.j, 20001), test.acc.l, test.acc.k)->Column#34, case(eq(test.acc.j, 20001), test.acc.l, test.acc.k)->Column#35, test.ast.i->Column#36, test.ast.i->Column#37 + └─HashJoin 100.00 root CARTESIAN inner join + ├─TableReader(Build) 10.00 root data:Selection + │ └─Selection 10.00 cop[tikv] eq(test.ast.i, "astp2019121731703151") + │ └─TableFullScan 10000.00 cop[tikv] table:a keep order:false, stats:pseudo + └─TableReader(Probe) 10.00 root data:Selection + └─Selection 10.00 cop[tikv] eq("astp2019121731703151", test.acc.m) + └─TableFullScan 10000.00 cop[tikv] table:b keep order:false, stats:pseudo diff --git a/tests/integrationtest/r/expression/misc.result b/tests/integrationtest/r/expression/misc.result index f38373ac8aec2..e55f8fc4fe65d 100644 --- a/tests/integrationtest/r/expression/misc.result +++ b/tests/integrationtest/r/expression/misc.result @@ -238,7 +238,7 @@ select /*+ unknown_hint(c1)*/ 1; 1 1 Level Code Message -Warning 1064 Optimizer hint syntax error at line 1 column 23 near "unknown_hint(c1)*/" +Warning 8061 Optimizer hint unknown_hint is not supported by TiDB and is ignored select 1 from /*+ test1() */ t; 1 Level Code Message diff --git a/tests/integrationtest/r/expression/multi_valued_index.result b/tests/integrationtest/r/expression/multi_valued_index.result index 63409df1abe80..996b530da5a6e 100644 --- a/tests/integrationtest/r/expression/multi_valued_index.result +++ b/tests/integrationtest/r/expression/multi_valued_index.result @@ -506,3 +506,13 @@ Error 3903 (HY000): Invalid JSON value for CAST for expression index 'idx' insert into t values (json_array(cast('{"a":1}' as json))); Error 3903 (HY000): Invalid JSON value for CAST for expression index 'idx' set sql_mode=default; +drop table if exists t; +create table t (j json not null, str varchar(5), KEY `idx` ((cast(`j` as unsigned array)),`str`)); +insert into t values ('1', 'abcde'); +drop table t; +create table t (j json not null, str varchar(5) collate utf8mb4_unicode_ci, KEY `idx` ((cast(`j` as unsigned array)),`str`)); +insert into t values ('1', 'abcde'); +drop table t; +create table t (j json not null, str varchar(5) collate gbk_chinese_ci, KEY `idx` ((cast(`j` as unsigned array)),`str`)); +insert into t values ('1', 'abcde'); +drop table t; diff --git a/tests/integrationtest/r/expression/plan_cache.result b/tests/integrationtest/r/expression/plan_cache.result index 8559e2da02230..0357d7f94f1e1 100644 --- a/tests/integrationtest/r/expression/plan_cache.result +++ b/tests/integrationtest/r/expression/plan_cache.result @@ -94,16 +94,181 @@ set tidb_enable_prepared_plan_cache=ON; drop table if exists t1; create table t1 (a varchar(40)); insert into t1 values ('C1'),('R1'); +insert into mysql.expr_pushdown_blacklist values('regexp_like', 'tikv,tiflash,tidb', 'for test'); +insert into mysql.expr_pushdown_blacklist values('regexp_substr', 'tikv,tiflash,tidb', 'for test'); +insert into mysql.expr_pushdown_blacklist values('regexp_instr', 'tikv,tiflash,tidb', 'for test'); +insert into mysql.expr_pushdown_blacklist values('regexp_replace', 'tikv,tiflash,tidb', 'for test'); +admin reload expr_pushdown_blacklist; +set tidb_enable_vectorized_expression=ON; prepare stmt1 from 'select a from t1 where a rlike ?'; +prepare stmt2 from 'select a, regexp_substr(a, ?) from t1 order by a asc'; +prepare stmt3 from 'select a, regexp_instr(a, ?) from t1 order by a asc'; +prepare stmt4 from 'select a, regexp_replace(a, ?, ?) from t1 order by a asc'; set @a='^C.*'; +set @r='xxxx'; execute stmt1 using @a; a C1 +execute stmt2 using @a; +a regexp_substr(a, ?) +C1 C1 +R1 NULL +execute stmt3 using @a; +a regexp_instr(a, ?) +C1 1 +R1 0 +execute stmt4 using @a, @r; +a regexp_replace(a, ?, ?) +C1 xxxx +R1 R1 +set @r='yyyy'; +execute stmt4 using @a, @r; +a regexp_replace(a, ?, ?) +C1 yyyy +R1 R1 set @a='^R.*'; execute stmt1 using @a; a R1 +execute stmt2 using @a; +a regexp_substr(a, ?) +C1 NULL +R1 R1 +execute stmt3 using @a; +a regexp_instr(a, ?) +C1 0 +R1 1 +execute stmt4 using @a, @r; +a regexp_replace(a, ?, ?) +C1 C1 +R1 yyyy +set tidb_enable_vectorized_expression=OFF; +set @a='^C.*'; +set @r='xxxx'; +execute stmt1 using @a; +a +C1 +execute stmt2 using @a; +a regexp_substr(a, ?) +C1 C1 +R1 NULL +execute stmt3 using @a; +a regexp_instr(a, ?) +C1 1 +R1 0 +execute stmt4 using @a, @r; +a regexp_replace(a, ?, ?) +C1 xxxx +R1 R1 +set @r='yyyy'; +execute stmt4 using @a, @r; +a regexp_replace(a, ?, ?) +C1 yyyy +R1 R1 +set @a='^R.*'; +execute stmt1 using @a; +a +R1 +execute stmt2 using @a; +a regexp_substr(a, ?) +C1 NULL +R1 R1 +execute stmt3 using @a; +a regexp_instr(a, ?) +C1 0 +R1 1 +execute stmt4 using @a, @r; +a regexp_replace(a, ?, ?) +C1 C1 +R1 yyyy +delete from mysql.expr_pushdown_blacklist where name like 'regexp%' and store_type = 'tikv,tiflash,tidb' and reason = 'for test'; +admin reload expr_pushdown_blacklist; set tidb_enable_prepared_plan_cache=default; +set tidb_enable_vectorized_expression=default; +set tidb_enable_prepared_plan_cache=ON; +drop table if exists t1; +create table t1 (a varchar(40)); +insert into t1 values ('C1'),('R1'),('c1'),('r1'); +insert into mysql.expr_pushdown_blacklist values('like', 'tikv,tiflash,tidb', 'for test'); +insert into mysql.expr_pushdown_blacklist values('ilike', 'tikv,tiflash,tidb', 'for test'); +admin reload expr_pushdown_blacklist; +set tidb_enable_vectorized_expression=ON; +prepare stmt1 from 'select a from t1 where a like ? order by a asc'; +prepare stmt2 from 'select a from t1 where a ilike ? order by a asc'; +set @a='%C%'; +execute stmt1 using @a; +a +C1 +execute stmt2 using @a; +a +C1 +c1 +set @a='%R%'; +execute stmt1 using @a; +a +R1 +execute stmt2 using @a; +a +R1 +r1 +set tidb_enable_vectorized_expression=OFF; +set @a='%C%'; +execute stmt1 using @a; +a +C1 +execute stmt2 using @a; +a +C1 +c1 +set @a='%R%'; +execute stmt1 using @a; +a +R1 +execute stmt2 using @a; +a +R1 +r1 +delete from mysql.expr_pushdown_blacklist where name in ('like', 'ilike') and store_type = 'tikv,tiflash,tidb' and reason = 'for test'; +admin reload expr_pushdown_blacklist; +set tidb_enable_prepared_plan_cache=default; +set tidb_enable_vectorized_expression=default; +set tidb_enable_prepared_plan_cache=ON; +drop table if exists t1; +create table t1 (a varchar(40)); +insert into t1 values ('a'),('b'); +insert into mysql.expr_pushdown_blacklist values('aes_encrypt', 'tikv,tiflash,tidb', 'for test'); +admin reload expr_pushdown_blacklist; +set tidb_enable_vectorized_expression=ON; +prepare stmt1 from 'select a, hex(aes_encrypt(a, ?)) from t1 order by a asc'; +set @a='xx'; +execute stmt1 using @a; +a hex(aes_encrypt(a, ?)) +a DA767CA0BE9CE9A1A979F6169A84B712 +b 56F19741AA9177000269D07B6C4C6D7D +set @a='yy'; +execute stmt1 using @a; +a hex(aes_encrypt(a, ?)) +a 1318DA9E3BFC5FBEF34E5ACAFA944B09 +b 1670ED5A2E8650BBCB09D7DF67B29FFC +execute stmt2 using @a; +a +set tidb_enable_vectorized_expression=OFF; +set @a='xx'; +execute stmt1 using @a; +a hex(aes_encrypt(a, ?)) +a DA767CA0BE9CE9A1A979F6169A84B712 +b 56F19741AA9177000269D07B6C4C6D7D +set @a='yy'; +execute stmt1 using @a; +a hex(aes_encrypt(a, ?)) +a 1318DA9E3BFC5FBEF34E5ACAFA944B09 +b 1670ED5A2E8650BBCB09D7DF67B29FFC +execute stmt2 using @a; +a +delete from mysql.expr_pushdown_blacklist where name like 'aes_%' and store_type = 'tikv,tiflash,tidb' and reason = 'for test'; +admin reload expr_pushdown_blacklist; +set tidb_enable_prepared_plan_cache=default; +set tidb_enable_vectorized_expression=default; set tidb_enable_prepared_plan_cache=ON; drop table if exists t; create table t(col_int int); diff --git a/tests/integrationtest/r/expression/time.result b/tests/integrationtest/r/expression/time.result index 605a611240314..0888b7c8b701f 100644 --- a/tests/integrationtest/r/expression/time.result +++ b/tests/integrationtest/r/expression/time.result @@ -132,6 +132,284 @@ date("1900-01-01") - interval 1.123456789e3 second select 19000101000000 - interval 1.123456789e3 second; 19000101000000 - interval 1.123456789e3 second 1899-12-31 23:41:16.543211 +SELECT "1900-01-01 00:00:00" + INTERVAL "2" HOUR; +"1900-01-01 00:00:00" + INTERVAL "2" HOUR +1900-01-01 02:00:00 +SELECT "1900-01-01 00:00:00" + INTERVAL "-2" HOUR; +"1900-01-01 00:00:00" + INTERVAL "-2" HOUR +1899-12-31 22:00:00 +SELECT "1900-01-01 00:00:00" + INTERVAL "128" HOUR; +"1900-01-01 00:00:00" + INTERVAL "128" HOUR +1900-01-06 08:00:00 +SELECT "1900-01-01 00:00:00" + INTERVAL "1e+3" HOUR; +"1900-01-01 00:00:00" + INTERVAL "1e+3" HOUR +1900-01-01 01:00:00 +SELECT "1900-01-01 00:00:00" + INTERVAL "1+1" HOUR; +"1900-01-01 00:00:00" + INTERVAL "1+1" HOUR +1900-01-01 01:00:00 +drop table if exists t; +create table t (id int primary key auto_increment, a varchar(32)); +insert into t (a) values(''), ('+1'), ('+1+2'), ('-1'), ('2.2'), ('2.9'), ('2.2+1'), ('2+2.2'), ('5-2'), ('1e2'), +('true'), ('false'), ('xxx'), ('xxx+1'), ('xxx1'), (' 1 '), ('xxx-1'), +('9223372036854775808'), ('-9223372036854775809'), ('9223372036854775808-02'), ('-9223372036854775809-02'); +select id, a, "1900-01-01 00:00:00" + INTERVAL a MICROSECOND as result from t order by id ASC; +id a result +1 1900-01-01 00:00:00 +2 +1 1900-01-01 00:00:00.000001 +3 +1+2 1900-01-01 00:00:00.000001 +4 -1 1899-12-31 23:59:59.999999 +5 2.2 1900-01-01 00:00:00.000002 +6 2.9 1900-01-01 00:00:00.000002 +7 2.2+1 1900-01-01 00:00:00.000002 +8 2+2.2 1900-01-01 00:00:00.000002 +9 5-2 1900-01-01 00:00:00.000005 +10 1e2 1900-01-01 00:00:00.000001 +11 true 1900-01-01 00:00:00 +12 false 1900-01-01 00:00:00 +13 xxx 1900-01-01 00:00:00 +14 xxx+1 1900-01-01 00:00:00 +15 xxx1 1900-01-01 00:00:00 +16 1 1900-01-01 00:00:00.000001 +17 xxx-1 1900-01-01 00:00:00 +18 9223372036854775808 NULL +19 -9223372036854775809 NULL +20 9223372036854775808-02 NULL +21 -9223372036854775809-02 NULL +select id, a, "1900-01-01 00:00:00" + INTERVAL a SECOND as result from t order by id ASC; +id a result +1 1900-01-01 00:00:00 +2 +1 1900-01-01 00:00:01 +3 +1+2 1900-01-01 00:00:01 +4 -1 1899-12-31 23:59:59 +5 2.2 1900-01-01 00:00:02.200000 +6 2.9 1900-01-01 00:00:02.900000 +7 2.2+1 1900-01-01 00:00:02.200000 +8 2+2.2 1900-01-01 00:00:02 +9 5-2 1900-01-01 00:00:05 +10 1e2 1900-01-01 00:01:40 +11 true 1900-01-01 00:00:00 +12 false 1900-01-01 00:00:00 +13 xxx 1900-01-01 00:00:00 +14 xxx+1 1900-01-01 00:00:00 +15 xxx1 1900-01-01 00:00:00 +16 1 1900-01-01 00:00:01 +17 xxx-1 1900-01-01 00:00:00 +18 9223372036854775808 NULL +19 -9223372036854775809 NULL +20 9223372036854775808-02 NULL +21 -9223372036854775809-02 NULL +select id, a, "1900-01-01 00:00:00" + INTERVAL a MINUTE as result from t order by id ASC; +id a result +1 1900-01-01 00:00:00 +2 +1 1900-01-01 00:01:00 +3 +1+2 1900-01-01 00:01:00 +4 -1 1899-12-31 23:59:00 +5 2.2 1900-01-01 00:02:00 +6 2.9 1900-01-01 00:02:00 +7 2.2+1 1900-01-01 00:02:00 +8 2+2.2 1900-01-01 00:02:00 +9 5-2 1900-01-01 00:05:00 +10 1e2 1900-01-01 00:01:00 +11 true 1900-01-01 00:00:00 +12 false 1900-01-01 00:00:00 +13 xxx 1900-01-01 00:00:00 +14 xxx+1 1900-01-01 00:00:00 +15 xxx1 1900-01-01 00:00:00 +16 1 1900-01-01 00:01:00 +17 xxx-1 1900-01-01 00:00:00 +18 9223372036854775808 NULL +19 -9223372036854775809 NULL +20 9223372036854775808-02 NULL +21 -9223372036854775809-02 NULL +select id, a, "1900-01-01 00:00:00" + INTERVAL a HOUR as result from t order by id ASC; +id a result +1 1900-01-01 00:00:00 +2 +1 1900-01-01 01:00:00 +3 +1+2 1900-01-01 01:00:00 +4 -1 1899-12-31 23:00:00 +5 2.2 1900-01-01 02:00:00 +6 2.9 1900-01-01 02:00:00 +7 2.2+1 1900-01-01 02:00:00 +8 2+2.2 1900-01-01 02:00:00 +9 5-2 1900-01-01 05:00:00 +10 1e2 1900-01-01 01:00:00 +11 true 1900-01-01 00:00:00 +12 false 1900-01-01 00:00:00 +13 xxx 1900-01-01 00:00:00 +14 xxx+1 1900-01-01 00:00:00 +15 xxx1 1900-01-01 00:00:00 +16 1 1900-01-01 01:00:00 +17 xxx-1 1900-01-01 00:00:00 +18 9223372036854775808 NULL +19 -9223372036854775809 NULL +20 9223372036854775808-02 NULL +21 -9223372036854775809-02 NULL +select id, a, "1900-01-01 00:00:00" + INTERVAL a DAY as result from t order by id ASC; +id a result +1 1900-01-01 00:00:00 +2 +1 1900-01-02 00:00:00 +3 +1+2 1900-01-02 00:00:00 +4 -1 1899-12-31 00:00:00 +5 2.2 1900-01-03 00:00:00 +6 2.9 1900-01-03 00:00:00 +7 2.2+1 1900-01-03 00:00:00 +8 2+2.2 1900-01-03 00:00:00 +9 5-2 1900-01-06 00:00:00 +10 1e2 1900-01-02 00:00:00 +11 true 1900-01-01 00:00:00 +12 false 1900-01-01 00:00:00 +13 xxx 1900-01-01 00:00:00 +14 xxx+1 1900-01-01 00:00:00 +15 xxx1 1900-01-01 00:00:00 +16 1 1900-01-02 00:00:00 +17 xxx-1 1900-01-01 00:00:00 +18 9223372036854775808 NULL +19 -9223372036854775809 NULL +20 9223372036854775808-02 NULL +21 -9223372036854775809-02 NULL +select id, a, "1900-01-01 00:00:00" + INTERVAL a WEEK as result from t order by id ASC; +id a result +1 1900-01-01 00:00:00 +2 +1 1900-01-08 00:00:00 +3 +1+2 1900-01-08 00:00:00 +4 -1 1899-12-25 00:00:00 +5 2.2 1900-01-15 00:00:00 +6 2.9 1900-01-15 00:00:00 +7 2.2+1 1900-01-15 00:00:00 +8 2+2.2 1900-01-15 00:00:00 +9 5-2 1900-02-05 00:00:00 +10 1e2 1900-01-08 00:00:00 +11 true 1900-01-01 00:00:00 +12 false 1900-01-01 00:00:00 +13 xxx 1900-01-01 00:00:00 +14 xxx+1 1900-01-01 00:00:00 +15 xxx1 1900-01-01 00:00:00 +16 1 1900-01-08 00:00:00 +17 xxx-1 1900-01-01 00:00:00 +18 9223372036854775808 NULL +19 -9223372036854775809 NULL +20 9223372036854775808-02 NULL +21 -9223372036854775809-02 NULL +select id, a, "1900-01-01 00:00:00" + INTERVAL a MONTH as result from t order by id ASC; +id a result +1 1900-01-01 00:00:00 +2 +1 1900-02-01 00:00:00 +3 +1+2 1900-02-01 00:00:00 +4 -1 1899-12-01 00:00:00 +5 2.2 1900-03-01 00:00:00 +6 2.9 1900-03-01 00:00:00 +7 2.2+1 1900-03-01 00:00:00 +8 2+2.2 1900-03-01 00:00:00 +9 5-2 1900-06-01 00:00:00 +10 1e2 1900-02-01 00:00:00 +11 true 1900-01-01 00:00:00 +12 false 1900-01-01 00:00:00 +13 xxx 1900-01-01 00:00:00 +14 xxx+1 1900-01-01 00:00:00 +15 xxx1 1900-01-01 00:00:00 +16 1 1900-02-01 00:00:00 +17 xxx-1 1900-01-01 00:00:00 +18 9223372036854775808 NULL +19 -9223372036854775809 NULL +20 9223372036854775808-02 NULL +21 -9223372036854775809-02 NULL +select id, a, "1900-01-01 00:00:00" + INTERVAL a QUARTER as result from t order by id ASC; +id a result +1 1900-01-01 00:00:00 +2 +1 1900-04-01 00:00:00 +3 +1+2 1900-04-01 00:00:00 +4 -1 1899-10-01 00:00:00 +5 2.2 1900-07-01 00:00:00 +6 2.9 1900-07-01 00:00:00 +7 2.2+1 1900-07-01 00:00:00 +8 2+2.2 1900-07-01 00:00:00 +9 5-2 1901-04-01 00:00:00 +10 1e2 1900-04-01 00:00:00 +11 true 1900-01-01 00:00:00 +12 false 1900-01-01 00:00:00 +13 xxx 1900-01-01 00:00:00 +14 xxx+1 1900-01-01 00:00:00 +15 xxx1 1900-01-01 00:00:00 +16 1 1900-04-01 00:00:00 +17 xxx-1 1900-01-01 00:00:00 +18 9223372036854775808 NULL +19 -9223372036854775809 NULL +20 9223372036854775808-02 NULL +21 -9223372036854775809-02 NULL +select id, a, "1900-01-01 00:00:00" + INTERVAL a YEAR as result from t order by id ASC; +id a result +1 1900-01-01 00:00:00 +2 +1 1901-01-01 00:00:00 +3 +1+2 1901-01-01 00:00:00 +4 -1 1899-01-01 00:00:00 +5 2.2 1902-01-01 00:00:00 +6 2.9 1902-01-01 00:00:00 +7 2.2+1 1902-01-01 00:00:00 +8 2+2.2 1902-01-01 00:00:00 +9 5-2 1905-01-01 00:00:00 +10 1e2 1901-01-01 00:00:00 +11 true 1900-01-01 00:00:00 +12 false 1900-01-01 00:00:00 +13 xxx 1900-01-01 00:00:00 +14 xxx+1 1900-01-01 00:00:00 +15 xxx1 1900-01-01 00:00:00 +16 1 1901-01-01 00:00:00 +17 xxx-1 1900-01-01 00:00:00 +18 9223372036854775808 NULL +19 -9223372036854775809 NULL +20 9223372036854775808-02 NULL +21 -9223372036854775809-02 NULL +select "1900-01-01 00:00:00" + INTERVAL true MICROSECOND; +"1900-01-01 00:00:00" + INTERVAL true MICROSECOND +1900-01-01 00:00:00.000001 +select "1900-01-01 00:00:00" + INTERVAL "1.2" MICROSECOND; +"1900-01-01 00:00:00" + INTERVAL "1.2" MICROSECOND +1900-01-01 00:00:00.000001 +select "1900-01-01 00:00:00" + INTERVAL "1.9" MINUTE; +"1900-01-01 00:00:00" + INTERVAL "1.9" MINUTE +1900-01-01 00:01:00 +select "1900-01-01 00:00:00" + INTERVAL 1.2 MICROSECOND; +"1900-01-01 00:00:00" + INTERVAL 1.2 MICROSECOND +1900-01-01 00:00:00.000001 +select "1900-01-01 00:00:00" + INTERVAL 1.9 MICROSECOND; +"1900-01-01 00:00:00" + INTERVAL 1.9 MICROSECOND +1900-01-01 00:00:00.000002 +select "1900-01-01 00:00:00" + INTERVAL true SECOND; +"1900-01-01 00:00:00" + INTERVAL true SECOND +1900-01-01 00:00:01 +select "1900-01-01 00:00:00" + INTERVAL 1.2 SECOND; +"1900-01-01 00:00:00" + INTERVAL 1.2 SECOND +1900-01-01 00:00:01.200000 +select "1900-01-01 00:00:00" + INTERVAL "1+2" SECOND; +"1900-01-01 00:00:00" + INTERVAL "1+2" SECOND +1900-01-01 00:00:01 +select "1900-01-01 00:00:00" + INTERVAL "1.2+2" SECOND; +"1900-01-01 00:00:00" + INTERVAL "1.2+2" SECOND +1900-01-01 00:00:01.200000 +select "1900-01-01 00:00:00" + INTERVAL "1+2.2" SECOND; +"1900-01-01 00:00:00" + INTERVAL "1+2.2" SECOND +1900-01-01 00:00:01 +select "1900-01-01 00:00:00" + INTERVAL "0.000001" SECOND; +"1900-01-01 00:00:00" + INTERVAL "0.000001" SECOND +1900-01-01 00:00:00.000001 +select "1900-01-01 00:00:00" + INTERVAL "0.0000009" SECOND; +"1900-01-01 00:00:00" + INTERVAL "0.0000009" SECOND +1900-01-01 00:00:00 +select "1900-01-01 00:00:00" + INTERVAL true MINUTE; +"1900-01-01 00:00:00" + INTERVAL true MINUTE +1900-01-01 00:01:00 +select "1900-01-01 00:00:00" + INTERVAL "1.2" MINUTE; +"1900-01-01 00:00:00" + INTERVAL "1.2" MINUTE +1900-01-01 00:01:00 +select "1900-01-01 00:00:00" + INTERVAL "1.9" MINUTE; +"1900-01-01 00:00:00" + INTERVAL "1.9" MINUTE +1900-01-01 00:01:00 +select "1900-01-01 00:00:00" + INTERVAL 1.2 MINUTE; +"1900-01-01 00:00:00" + INTERVAL 1.2 MINUTE +1900-01-01 00:01:00 +select "1900-01-01 00:00:00" + INTERVAL 1.9 MINUTE; +"1900-01-01 00:00:00" + INTERVAL 1.9 MINUTE +1900-01-01 00:02:00 drop table if exists t; create table t(a datetime(6), b timestamp); insert t values (20010101100000.123456, 20110707101112.123456); @@ -528,3 +806,261 @@ NULL NULL NULL set sql_mode=default; +select "1000-01-01 00:00:00" + INTERVAL 9223372036854775808 day; +"1000-01-01 00:00:00" + INTERVAL 9223372036854775808 day +NULL +select "1000-01-01 00:00:00" + INTERVAL 18446744073709551616 day; +"1000-01-01 00:00:00" + INTERVAL 18446744073709551616 day +NULL +drop table if exists t1; +create table t1(a decimal(65, 2)); +insert into t1 (a) values (1), (1.4), (1.5), (1.6), (-1), (-1.4), (-1.5), (-1.6), (-1000.5); +insert into t1 (a) values (315600000000000000), (9223372036854775808), (18446744073709551615), (18446744073709551616), (-9223372036854775808), (-9223372036854775809); +set @@tidb_enable_vectorized_expression=0; +select a, "1000-01-01 00:00:00" + INTERVAL a YEAR from t1 order by a ASC; +a "1000-01-01 00:00:00" + INTERVAL a YEAR +-9223372036854775809.00 NULL +-9223372036854775808.00 NULL +-1000.50 NULL +-1.60 0998-01-01 00:00:00 +-1.50 0998-01-01 00:00:00 +-1.40 0999-01-01 00:00:00 +-1.00 0999-01-01 00:00:00 +1.00 1001-01-01 00:00:00 +1.40 1001-01-01 00:00:00 +1.50 1002-01-01 00:00:00 +1.60 1002-01-01 00:00:00 +315600000000000000.00 NULL +9223372036854775808.00 NULL +18446744073709551615.00 NULL +18446744073709551616.00 NULL +select a, "1000-01-01 00:00:00" + INTERVAL a MINUTE from t1 order by a ASC; +a "1000-01-01 00:00:00" + INTERVAL a MINUTE +-9223372036854775809.00 NULL +-9223372036854775808.00 NULL +-1000.50 0999-12-31 07:19:00 +-1.60 0999-12-31 23:58:00 +-1.50 0999-12-31 23:58:00 +-1.40 0999-12-31 23:59:00 +-1.00 0999-12-31 23:59:00 +1.00 1000-01-01 00:01:00 +1.40 1000-01-01 00:01:00 +1.50 1000-01-01 00:02:00 +1.60 1000-01-01 00:02:00 +315600000000000000.00 NULL +9223372036854775808.00 NULL +18446744073709551615.00 NULL +18446744073709551616.00 NULL +select a, "1000-01-01 00:00:00" + INTERVAL a MICROSECOND from t1 order by a ASC; +a "1000-01-01 00:00:00" + INTERVAL a MICROSECOND +-9223372036854775809.00 NULL +-9223372036854775808.00 NULL +-1000.50 0999-12-31 23:59:59.998999 +-1.60 0999-12-31 23:59:59.999998 +-1.50 0999-12-31 23:59:59.999998 +-1.40 0999-12-31 23:59:59.999999 +-1.00 0999-12-31 23:59:59.999999 +1.00 1000-01-01 00:00:00.000001 +1.40 1000-01-01 00:00:00.000001 +1.50 1000-01-01 00:00:00.000002 +1.60 1000-01-01 00:00:00.000002 +315600000000000000.00 NULL +9223372036854775808.00 NULL +18446744073709551615.00 NULL +18446744073709551616.00 NULL +select a, "1000-01-01 00:00:00" + INTERVAL cast(a as char) DAY from t1 order by a ASC; +a "1000-01-01 00:00:00" + INTERVAL cast(a as char) DAY +-9223372036854775809.00 NULL +-9223372036854775808.00 NULL +-1000.50 0997-04-06 00:00:00 +-1.60 0999-12-31 00:00:00 +-1.50 0999-12-31 00:00:00 +-1.40 0999-12-31 00:00:00 +-1.00 0999-12-31 00:00:00 +1.00 1000-01-02 00:00:00 +1.40 1000-01-02 00:00:00 +1.50 1000-01-02 00:00:00 +1.60 1000-01-02 00:00:00 +315600000000000000.00 NULL +9223372036854775808.00 NULL +18446744073709551615.00 NULL +18446744073709551616.00 NULL +select a, "1000-01-01 00:00:00" + INTERVAL cast(a as signed) DAY from t1 order by a ASC; +a "1000-01-01 00:00:00" + INTERVAL cast(a as signed) DAY +-9223372036854775809.00 NULL +-9223372036854775808.00 NULL +-1000.50 0997-04-05 00:00:00 +-1.60 0999-12-30 00:00:00 +-1.50 0999-12-30 00:00:00 +-1.40 0999-12-31 00:00:00 +-1.00 0999-12-31 00:00:00 +1.00 1000-01-02 00:00:00 +1.40 1000-01-02 00:00:00 +1.50 1000-01-03 00:00:00 +1.60 1000-01-03 00:00:00 +315600000000000000.00 NULL +9223372036854775808.00 NULL +18446744073709551615.00 NULL +18446744073709551616.00 NULL +select a, "1000-01-01 00:00:00" + INTERVAL cast(a as unsigned) DAY from t1 order by a ASC; +a "1000-01-01 00:00:00" + INTERVAL cast(a as unsigned) DAY +-9223372036854775809.00 1000-01-01 00:00:00 +-9223372036854775808.00 1000-01-01 00:00:00 +-1000.50 1000-01-01 00:00:00 +-1.60 1000-01-01 00:00:00 +-1.50 1000-01-01 00:00:00 +-1.40 1000-01-01 00:00:00 +-1.00 1000-01-01 00:00:00 +1.00 1000-01-02 00:00:00 +1.40 1000-01-02 00:00:00 +1.50 1000-01-03 00:00:00 +1.60 1000-01-03 00:00:00 +315600000000000000.00 NULL +9223372036854775808.00 NULL +18446744073709551615.00 NULL +18446744073709551616.00 NULL +set @@tidb_enable_vectorized_expression=1; +select a, "1000-01-01 00:00:00" + INTERVAL a YEAR from t1 order by a ASC; +a "1000-01-01 00:00:00" + INTERVAL a YEAR +-9223372036854775809.00 NULL +-9223372036854775808.00 NULL +-1000.50 NULL +-1.60 0998-01-01 00:00:00 +-1.50 0998-01-01 00:00:00 +-1.40 0999-01-01 00:00:00 +-1.00 0999-01-01 00:00:00 +1.00 1001-01-01 00:00:00 +1.40 1001-01-01 00:00:00 +1.50 1002-01-01 00:00:00 +1.60 1002-01-01 00:00:00 +315600000000000000.00 NULL +9223372036854775808.00 NULL +18446744073709551615.00 NULL +18446744073709551616.00 NULL +select a, "1000-01-01 00:00:00" + INTERVAL a MINUTE from t1 order by a ASC; +a "1000-01-01 00:00:00" + INTERVAL a MINUTE +-9223372036854775809.00 NULL +-9223372036854775808.00 NULL +-1000.50 0999-12-31 07:19:00 +-1.60 0999-12-31 23:58:00 +-1.50 0999-12-31 23:58:00 +-1.40 0999-12-31 23:59:00 +-1.00 0999-12-31 23:59:00 +1.00 1000-01-01 00:01:00 +1.40 1000-01-01 00:01:00 +1.50 1000-01-01 00:02:00 +1.60 1000-01-01 00:02:00 +315600000000000000.00 NULL +9223372036854775808.00 NULL +18446744073709551615.00 NULL +18446744073709551616.00 NULL +select a, "1000-01-01 00:00:00" + INTERVAL a MICROSECOND from t1 order by a ASC; +a "1000-01-01 00:00:00" + INTERVAL a MICROSECOND +-9223372036854775809.00 NULL +-9223372036854775808.00 NULL +-1000.50 0999-12-31 23:59:59.998999 +-1.60 0999-12-31 23:59:59.999998 +-1.50 0999-12-31 23:59:59.999998 +-1.40 0999-12-31 23:59:59.999999 +-1.00 0999-12-31 23:59:59.999999 +1.00 1000-01-01 00:00:00.000001 +1.40 1000-01-01 00:00:00.000001 +1.50 1000-01-01 00:00:00.000002 +1.60 1000-01-01 00:00:00.000002 +315600000000000000.00 NULL +9223372036854775808.00 NULL +18446744073709551615.00 NULL +18446744073709551616.00 NULL +select a, "1000-01-01 00:00:00" + INTERVAL cast(a as char) DAY from t1 order by a ASC; +a "1000-01-01 00:00:00" + INTERVAL cast(a as char) DAY +-9223372036854775809.00 NULL +-9223372036854775808.00 NULL +-1000.50 0997-04-06 00:00:00 +-1.60 0999-12-31 00:00:00 +-1.50 0999-12-31 00:00:00 +-1.40 0999-12-31 00:00:00 +-1.00 0999-12-31 00:00:00 +1.00 1000-01-02 00:00:00 +1.40 1000-01-02 00:00:00 +1.50 1000-01-02 00:00:00 +1.60 1000-01-02 00:00:00 +315600000000000000.00 NULL +9223372036854775808.00 NULL +18446744073709551615.00 NULL +18446744073709551616.00 NULL +select a, "1000-01-01 00:00:00" + INTERVAL cast(a as signed) DAY from t1 order by a ASC; +a "1000-01-01 00:00:00" + INTERVAL cast(a as signed) DAY +-9223372036854775809.00 NULL +-9223372036854775808.00 NULL +-1000.50 0997-04-05 00:00:00 +-1.60 0999-12-30 00:00:00 +-1.50 0999-12-30 00:00:00 +-1.40 0999-12-31 00:00:00 +-1.00 0999-12-31 00:00:00 +1.00 1000-01-02 00:00:00 +1.40 1000-01-02 00:00:00 +1.50 1000-01-03 00:00:00 +1.60 1000-01-03 00:00:00 +315600000000000000.00 NULL +9223372036854775808.00 NULL +18446744073709551615.00 NULL +18446744073709551616.00 NULL +select a, "1000-01-01 00:00:00" + INTERVAL cast(a as unsigned) DAY from t1 order by a ASC; +a "1000-01-01 00:00:00" + INTERVAL cast(a as unsigned) DAY +-9223372036854775809.00 1000-01-01 00:00:00 +-9223372036854775808.00 1000-01-01 00:00:00 +-1000.50 1000-01-01 00:00:00 +-1.60 1000-01-01 00:00:00 +-1.50 1000-01-01 00:00:00 +-1.40 1000-01-01 00:00:00 +-1.00 1000-01-01 00:00:00 +1.00 1000-01-02 00:00:00 +1.40 1000-01-02 00:00:00 +1.50 1000-01-03 00:00:00 +1.60 1000-01-03 00:00:00 +315600000000000000.00 NULL +9223372036854775808.00 NULL +18446744073709551615.00 NULL +18446744073709551616.00 NULL +create table t2(a decimal(65, 2), d datetime); +set @old_sql_mode=@@sql_mode; +set @@sql_mode=''; +insert into t2 values('1', "1000-01-01 00:00:00" + INTERVAL "+1" YEAR); +insert into t2 values('-1', "1000-01-01 00:00:00" + INTERVAL "-1" YEAR); +insert into t2 values('0', "1000-01-01 00:00:00" + INTERVAL "XXX" YEAR); +insert into t2 values('99999', "1000-01-01 00:00:00" + INTERVAL 99999 YEAR); +insert into t2 values('116777216', "1000-01-01 00:00:00" + INTERVAL 116777216 YEAR); +insert into t2 values('9223372036854775809', "1000-01-01 00:00:00" + INTERVAL 9223372036854775808 YEAR); +insert into t2 values('18446744073709551616', "1000-01-01 00:00:00" + INTERVAL 18446744073709551616 YEAR); +insert into t2 values('-9223372036854775809', "1000-01-01 00:00:00" + INTERVAL -9223372036854775809 YEAR); +select a, d from t2 order by a ASC; +a d +-9223372036854775809.00 NULL +-1.00 0999-01-01 00:00:00 +0.00 1000-01-01 00:00:00 +1.00 1001-01-01 00:00:00 +99999.00 NULL +116777216.00 NULL +9223372036854775809.00 NULL +18446744073709551616.00 NULL +truncate table t2; +set @@sql_mode=@old_sql_mode; +insert into t2 values('1', "1000-01-01 00:00:00" + INTERVAL "+1" YEAR); +insert into t2 values('-1', "1000-01-01 00:00:00" + INTERVAL "-1" YEAR); +insert into t2 values('0', "1000-01-01 00:00:00" + INTERVAL "XXX" YEAR); +Error 1292 (22007): Truncated incorrect DECIMAL value: 'XXX' +insert into t2 values('99999', "1000-01-01 00:00:00" + INTERVAL 99999 YEAR); +Error 1441 (22008): Datetime function: datetime field overflow +insert into t2 values('116777216', "1000-01-01 00:00:00" + INTERVAL 116777216 YEAR); +Error 1441 (22008): Datetime function: datetime field overflow +insert into t2 values('9223372036854775809', "1000-01-01 00:00:00" + INTERVAL 9223372036854775808 YEAR); +Error 1292 (22007): Incorrect datetime value: '9223372036854775808' +insert into t2 values('18446744073709551616', "1000-01-01 00:00:00" + INTERVAL 18446744073709551616 YEAR); +Error 1292 (22007): Truncated incorrect DECIMAL value: '18446744073709551616' +insert into t2 values('-9223372036854775809', "1000-01-01 00:00:00" + INTERVAL -9223372036854775809 YEAR); +Error 1292 (22007): Truncated incorrect DECIMAL value: '-9223372036854775809' +select a, d from t2 order by a ASC; +a d +-1.00 0999-01-01 00:00:00 +1.00 1001-01-01 00:00:00 +drop table if exists t1; diff --git a/tests/integrationtest/r/generated_columns.result b/tests/integrationtest/r/generated_columns.result index ed24b37f4ae9c..70271adc2da03 100644 --- a/tests/integrationtest/r/generated_columns.result +++ b/tests/integrationtest/r/generated_columns.result @@ -264,3 +264,16 @@ EXPLAIN format = 'brief' SELECT c, a FROM tu WHERE c in(1, 2, 3); id estRows task access object operator info Projection 3.00 root generated_columns.tu.c, generated_columns.tu.a └─Batch_Point_Get 3.00 root table:tu, index:uk(c) keep order:false, desc:false +set @@sql_mode=default; +drop table if exists t1; +create table t1(a int); +insert into t1 values(0); +alter table t1 add index i((100/a)); +Error 1365 (22012): Division by 0 +drop table t1; +set @@sql_mode=''; +create table t1(a int); +insert into t1 values(0); +alter table t1 add index i((100/a)); +drop table t1; +set @@sql_mode=default; diff --git a/tests/integrationtest/r/index_merge.result b/tests/integrationtest/r/index_merge.result index 0b2e1b89bec8a..261363f92873c 100644 --- a/tests/integrationtest/r/index_merge.result +++ b/tests/integrationtest/r/index_merge.result @@ -453,8 +453,8 @@ c1 c2 c3 ///// MEMORY Table explain select count(c1) from (select /*+ use_index_merge(t_alias), stream_agg() */ count(1) c1 from information_schema.statements_summary where sum_latency >= 0 or max_latency >= 0 order by 1) dt; id estRows task access object operator info -StreamAgg_9 1.00 root funcs:count(Column#96)->Column#97 -└─StreamAgg_11 1.00 root funcs:count(1)->Column#96 +StreamAgg_9 1.00 root funcs:count(Column#103)->Column#104 +└─StreamAgg_11 1.00 root funcs:count(1)->Column#103 └─MemTableScan_15 10000.00 root table:STATEMENTS_SUMMARY show warnings; Level Code Message diff --git a/tests/integrationtest/r/infoschema/tables.result b/tests/integrationtest/r/infoschema/tables.result index 83f3be1c312eb..86f5d2f8c6453 100644 --- a/tests/integrationtest/r/infoschema/tables.result +++ b/tests/integrationtest/r/infoschema/tables.result @@ -230,7 +230,7 @@ innodb_compression_level GLOBAL 6 8 NULL NULL NULL YES SET GLOBAL innodb_compression_level = DEFAULT; SELECT * FROM variables_info WHERE variable_name = 'tidb_txn_mode'; VARIABLE_NAME VARIABLE_SCOPE DEFAULT_VALUE CURRENT_VALUE MIN_VALUE MAX_VALUE POSSIBLE_VALUES IS_NOOP -tidb_txn_mode SESSION,GLOBAL pessimistic NULL NULL pessimistic,optimistic NO +tidb_txn_mode SESSION,GLOBAL pessimistic pessimistic NULL NULL pessimistic,optimistic NO SELECT * FROM variables_info WHERE variable_name = 'max_connections' AND is_noop='NO'; VARIABLE_NAME VARIABLE_SCOPE DEFAULT_VALUE CURRENT_VALUE MIN_VALUE MAX_VALUE POSSIBLE_VALUES IS_NOOP max_connections INSTANCE 0 0 0 100000 NULL NO diff --git a/tests/integrationtest/r/parser/integration.result b/tests/integrationtest/r/parser/integration.result new file mode 100644 index 0000000000000..64e3cf81597d9 --- /dev/null +++ b/tests/integrationtest/r/parser/integration.result @@ -0,0 +1,9 @@ +drop table if exists t; +create table t(d date); +replace into t values ('2004-04-31'); +Error 1292 (22007): Incorrect date value: '2004-04-31' for column 'd' at row 1 +replace /*+ SET_VAR(sql_mode='ALLOW_INVALID_DATES') */ into t values ('2004-04-31'); +drop table if exists t; +create table t(a INT, KEY(a)); +insert /*+ SET_VAR(sql_mode='') */ into t values (2); +replace /*+ SET_VAR(sql_mode='') */ into t values (2); diff --git a/tests/integrationtest/r/planner/cascades/integration.result b/tests/integrationtest/r/planner/cascades/integration.result index 8b3e15e1845bb..65b42dde9159c 100644 --- a/tests/integrationtest/r/planner/cascades/integration.result +++ b/tests/integrationtest/r/planner/cascades/integration.result @@ -971,3 +971,26 @@ a b 1 11 2 22 3 33 +SET SESSION tidb_opt_fix_control = '44262:ON'; +drop table if exists pt1; +create table pt1(a bigint, b bigint) partition by hash(a) partitions 4; +insert into pt1 values(1,10); +insert into pt1 values(2,20); +insert into pt1 values(3,30); +insert into pt1 values(4,40); +insert into pt1 values(5,50); +set @@tidb_enable_cascades_planner = 1; +explain select * from pt1 order by a; +id estRows task access object operator info +Sort_11 10000.00 root planner__cascades__integration.pt1.a +└─TableReader_9 10000.00 root partition:all data:TableFullScan_10 + └─TableFullScan_10 10000.00 cop[tikv] table:pt1 keep order:false, stats:pseudo +select * from pt1 order by a; +a b +1 10 +2 20 +3 30 +4 40 +5 50 +set session tidb_opt_fix_control = default; +set @@tidb_enable_cascades_planner = default; diff --git a/tests/integrationtest/r/planner/core/casetest/index/index.result b/tests/integrationtest/r/planner/core/casetest/index/index.result new file mode 100644 index 0000000000000..cfef251c4316a --- /dev/null +++ b/tests/integrationtest/r/planner/core/casetest/index/index.result @@ -0,0 +1,837 @@ +set tidb_cost_model_version=2; +drop table if exists t1, t2; +set tidb_enable_clustered_index=int_only; +create table t1(a int not null, c int not null); +create table t2(a int not null, b int not null, c int not null, primary key(a,b)); +insert into t1 values(1,1); +insert into t2 values(1,1,1),(1,2,1); +analyze table t1,t2; +explain format = 'brief' select /*+ TIDB_INLJ(t2) */ * from t1 join t2 on t1.a = t2.a and t1.c = t2.c; +id estRows task access object operator info +IndexJoin 2.00 root inner join, inner:IndexLookUp, outer key:planner__core__casetest__index__index.t1.a, inner key:planner__core__casetest__index__index.t2.a, equal cond:eq(planner__core__casetest__index__index.t1.a, planner__core__casetest__index__index.t2.a), eq(planner__core__casetest__index__index.t1.c, planner__core__casetest__index__index.t2.c) +├─TableReader(Build) 1.00 root data:TableFullScan +│ └─TableFullScan 1.00 cop[tikv] table:t1 keep order:false +└─IndexLookUp(Probe) 2.00 root + ├─IndexRangeScan(Build) 2.00 cop[tikv] table:t2, index:PRIMARY(a, b) range: decided by [eq(planner__core__casetest__index__index.t2.a, planner__core__casetest__index__index.t1.a)], keep order:false + └─TableRowIDScan(Probe) 2.00 cop[tikv] table:t2 keep order:false +explain format = 'brief' select /*+ TIDB_INLJ(t2) */ * from t1 join t2 on t1.a = t2.a and t1.c <= t2.b; +id estRows task access object operator info +IndexJoin 2.00 root inner join, inner:IndexLookUp, outer key:planner__core__casetest__index__index.t1.a, inner key:planner__core__casetest__index__index.t2.a, equal cond:eq(planner__core__casetest__index__index.t1.a, planner__core__casetest__index__index.t2.a), other cond:le(planner__core__casetest__index__index.t1.c, planner__core__casetest__index__index.t2.b) +├─TableReader(Build) 1.00 root data:TableFullScan +│ └─TableFullScan 1.00 cop[tikv] table:t1 keep order:false +└─IndexLookUp(Probe) 2.00 root + ├─IndexRangeScan(Build) 2.00 cop[tikv] table:t2, index:PRIMARY(a, b) range: decided by [eq(planner__core__casetest__index__index.t2.a, planner__core__casetest__index__index.t1.a) le(planner__core__casetest__index__index.t1.c, planner__core__casetest__index__index.t2.b)], keep order:false + └─TableRowIDScan(Probe) 2.00 cop[tikv] table:t2 keep order:false +explain format = 'brief' select /*+ TIDB_INLJ(t2) */ * from t1 join t2 on t1.a = t2.a and t2.b = 1; +id estRows task access object operator info +IndexJoin 1.00 root inner join, inner:IndexLookUp, outer key:planner__core__casetest__index__index.t1.a, inner key:planner__core__casetest__index__index.t2.a, equal cond:eq(planner__core__casetest__index__index.t1.a, planner__core__casetest__index__index.t2.a) +├─TableReader(Build) 1.00 root data:TableFullScan +│ └─TableFullScan 1.00 cop[tikv] table:t1 keep order:false +└─IndexLookUp(Probe) 1.00 root + ├─IndexRangeScan(Build) 1.00 cop[tikv] table:t2, index:PRIMARY(a, b) range: decided by [eq(planner__core__casetest__index__index.t2.a, planner__core__casetest__index__index.t1.a) eq(planner__core__casetest__index__index.t2.b, 1)], keep order:false + └─TableRowIDScan(Probe) 1.00 cop[tikv] table:t2 keep order:false +set tidb_enable_clustered_index=default; +drop table if exists t2; +create table t2(pk int primary key, a json, b json, c int, d int, e int, index idx(c, (cast(a as signed array))), index idx2((cast(b as signed array)), c), index idx3(c, d), index idx4(d)); +explain select /*+ use_index_merge(t2, idx2, idx) */ * from t2 where (1 member of (a) and c=1) or (2 member of (b) and c=1); -- 1: OR index merge from multi complicated mv index (memberof); +id estRows task access object operator info +IndexMerge_8 0.20 root type: union +├─IndexRangeScan_5(Build) 0.10 cop[tikv] table:t2, index:idx(c, cast(`a` as signed array)) range:[1 1,1 1], keep order:false, stats:pseudo +├─IndexRangeScan_6(Build) 0.10 cop[tikv] table:t2, index:idx2(cast(`b` as signed array), c) range:[2 1,2 1], keep order:false, stats:pseudo +└─TableRowIDScan_7(Probe) 0.20 cop[tikv] table:t2 keep order:false, stats:pseudo +explain select /*+ use_index_merge(t2, idx2, idx) */ * from t2 where (1 member of (a) and c=1) or (2 member of (b) and c=1); -- 2: OR index merge from multi complicated mv index (memberof); +id estRows task access object operator info +IndexMerge_8 0.20 root type: union +├─IndexRangeScan_5(Build) 0.10 cop[tikv] table:t2, index:idx(c, cast(`a` as signed array)) range:[1 1,1 1], keep order:false, stats:pseudo +├─IndexRangeScan_6(Build) 0.10 cop[tikv] table:t2, index:idx2(cast(`b` as signed array), c) range:[2 1,2 1], keep order:false, stats:pseudo +└─TableRowIDScan_7(Probe) 0.20 cop[tikv] table:t2 keep order:false, stats:pseudo +explain select /*+ use_index_merge(t2, idx2, idx) */ * from t2 where (1 member of (a) and c=1 and d=2) or (2 member of (b) and c=3 and d=2); -- 3: OR index merge from multi complicated mv index (memberof),while each DNF item contains redundant condition, which should be remained as table filters; +id estRows task access object operator info +IndexMerge_9 0.20 root type: union +├─IndexRangeScan_5(Build) 0.10 cop[tikv] table:t2, index:idx(c, cast(`a` as signed array)) range:[1 1,1 1], keep order:false, stats:pseudo +├─IndexRangeScan_6(Build) 0.10 cop[tikv] table:t2, index:idx2(cast(`b` as signed array), c) range:[2 3,2 3], keep order:false, stats:pseudo +└─Selection_8(Probe) 0.20 cop[tikv] or(and(json_memberof(cast(1, json BINARY), planner__core__casetest__index__index.t2.a), and(eq(planner__core__casetest__index__index.t2.c, 1), eq(planner__core__casetest__index__index.t2.d, 2))), and(json_memberof(cast(2, json BINARY), planner__core__casetest__index__index.t2.b), and(eq(planner__core__casetest__index__index.t2.c, 3), eq(planner__core__casetest__index__index.t2.d, 2)))) + └─TableRowIDScan_7 0.20 cop[tikv] table:t2 keep order:false, stats:pseudo +explain select /*+ use_index_merge(t2, idx2, idx) */ * from t2 where ( json_contains(a, '[1, 2, 3]') and c=1 and d=2) or (2 member of (b) and c=3 and d=2); -- 4: OR index merge from multi complicated mv index (memberof),make full use of DNF item's condition even if the predicate is intersection case (json_contains); +id estRows task access object operator info +IndexMerge_9 0.01 root type: union +├─IndexRangeScan_5(Build) 10.00 cop[tikv] table:t2, index:idx(c, cast(`a` as signed array)) range:[1,1], keep order:false, stats:pseudo +├─IndexRangeScan_6(Build) 0.10 cop[tikv] table:t2, index:idx2(cast(`b` as signed array), c) range:[2 3,2 3], keep order:false, stats:pseudo +└─Selection_8(Probe) 0.01 cop[tikv] or(and(json_contains(planner__core__casetest__index__index.t2.a, cast("[1, 2, 3]", json BINARY)), and(eq(planner__core__casetest__index__index.t2.c, 1), eq(planner__core__casetest__index__index.t2.d, 2))), and(json_memberof(cast(2, json BINARY), planner__core__casetest__index__index.t2.b), and(eq(planner__core__casetest__index__index.t2.c, 3), eq(planner__core__casetest__index__index.t2.d, 2)))) + └─TableRowIDScan_7 10.10 cop[tikv] table:t2 keep order:false, stats:pseudo +explain select /*+ use_index_merge(t2, idx2, idx) */ * from t2 where ( json_overlaps(a, '[1, 2, 3]') and c=1 and d=2) or (2 member of (b) and c=3 and d=2); -- 5: OR index merge from multi complicated mv index (memberof),make full use of DNF item's condition even if the predicate is intersection case (json_contains); +id estRows task access object operator info +Selection_5 0.32 root or(and(json_overlaps(planner__core__casetest__index__index.t2.a, cast("[1, 2, 3]", json BINARY)), and(eq(planner__core__casetest__index__index.t2.c, 1), eq(planner__core__casetest__index__index.t2.d, 2))), and(json_memberof(cast(2, json BINARY), planner__core__casetest__index__index.t2.b), and(eq(planner__core__casetest__index__index.t2.c, 3), eq(planner__core__casetest__index__index.t2.d, 2)))) +└─IndexMerge_11 0.40 root type: union + ├─IndexRangeScan_6(Build) 0.10 cop[tikv] table:t2, index:idx(c, cast(`a` as signed array)) range:[1 1,1 1], keep order:false, stats:pseudo + ├─IndexRangeScan_7(Build) 0.10 cop[tikv] table:t2, index:idx(c, cast(`a` as signed array)) range:[1 2,1 2], keep order:false, stats:pseudo + ├─IndexRangeScan_8(Build) 0.10 cop[tikv] table:t2, index:idx(c, cast(`a` as signed array)) range:[1 3,1 3], keep order:false, stats:pseudo + ├─IndexRangeScan_9(Build) 0.10 cop[tikv] table:t2, index:idx2(cast(`b` as signed array), c) range:[2 3,2 3], keep order:false, stats:pseudo + └─TableRowIDScan_10(Probe) 0.40 cop[tikv] table:t2 keep order:false, stats:pseudo +explain select /*+ use_index_merge(t2, idx2, idx, idx4) */ * from t2 where ( json_contains(a, '[1, 2, 3]') and d=2) or (2 member of (b) and c=3 and d=2); -- 6: OR index merge from multi complicated mv index (memberof),make full use of other DNF items even if one of the DNF items fails; +id estRows task access object operator info +IndexMerge_9 0.01 root type: union +├─IndexRangeScan_5(Build) 10.00 cop[tikv] table:t2, index:idx4(d) range:[2,2], keep order:false, stats:pseudo +├─IndexRangeScan_6(Build) 0.10 cop[tikv] table:t2, index:idx2(cast(`b` as signed array), c) range:[2 3,2 3], keep order:false, stats:pseudo +└─Selection_8(Probe) 0.01 cop[tikv] or(and(json_contains(planner__core__casetest__index__index.t2.a, cast("[1, 2, 3]", json BINARY)), eq(planner__core__casetest__index__index.t2.d, 2)), and(json_memberof(cast(2, json BINARY), planner__core__casetest__index__index.t2.b), and(eq(planner__core__casetest__index__index.t2.c, 3), eq(planner__core__casetest__index__index.t2.d, 2)))) + └─TableRowIDScan_7 10.10 cop[tikv] table:t2 keep order:false, stats:pseudo +explain select /*+ use_index_merge(t2, idx2, idx) */ * from t2 where (1 member of (a) and 1 member of (b) and c=3) or (3 member of (b) and c=4); -- 7: OR index merge from multi complicated mv index (memberof),each DNF item can be more complicated like a another embedded CNF member-of composition.; +id estRows task access object operator info +IndexMerge_9 0.20 root type: union +├─IndexRangeScan_5(Build) 0.10 cop[tikv] table:t2, index:idx(c, cast(`a` as signed array)) range:[3 1,3 1], keep order:false, stats:pseudo +├─IndexRangeScan_6(Build) 0.10 cop[tikv] table:t2, index:idx2(cast(`b` as signed array), c) range:[3 4,3 4], keep order:false, stats:pseudo +└─Selection_8(Probe) 0.20 cop[tikv] or(and(json_memberof(cast(1, json BINARY), planner__core__casetest__index__index.t2.a), and(json_memberof(cast(1, json BINARY), planner__core__casetest__index__index.t2.b), eq(planner__core__casetest__index__index.t2.c, 3))), and(json_memberof(cast(3, json BINARY), planner__core__casetest__index__index.t2.b), eq(planner__core__casetest__index__index.t2.c, 4))) + └─TableRowIDScan_7 0.20 cop[tikv] table:t2 keep order:false, stats:pseudo +explain select /*+ use_index_merge(t2, idx2, idx) */ * from t2 where (1 member of (a) and 1 member of (b) and c=3) or (3 member of (b) and c=4) or e=1; -- 8: OR index merge from multi complicated mv index (memberof), each DNF item should be strict or lax used as index partial path.; +id estRows task access object operator info +TableReader_7 10.18 root data:Selection_6 +└─Selection_6 10.18 cop[tikv] or(and(json_memberof(cast(1, json BINARY), planner__core__casetest__index__index.t2.a), and(json_memberof(cast(1, json BINARY), planner__core__casetest__index__index.t2.b), eq(planner__core__casetest__index__index.t2.c, 3))), or(and(json_memberof(cast(3, json BINARY), planner__core__casetest__index__index.t2.b), eq(planner__core__casetest__index__index.t2.c, 4)), eq(planner__core__casetest__index__index.t2.e, 1))) + └─TableFullScan_5 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo +explain select /*+ use_index_merge(t2, idx2, idx, idx4) */ * from t2 where (1 member of (a) and 1 member of (b) and c=3) or (3 member of (b) and c=4) or d=1; -- 9: OR index merge from multi complicated mv index (memberof), each DNF item should be strict or lax used as index partial path, specify the index in index merge hint; +id estRows task access object operator info +IndexMerge_10 0.01 root type: union +├─IndexRangeScan_5(Build) 10.00 cop[tikv] table:t2, index:idx4(d) range:[1,1], keep order:false, stats:pseudo +├─IndexRangeScan_6(Build) 0.10 cop[tikv] table:t2, index:idx(c, cast(`a` as signed array)) range:[3 1,3 1], keep order:false, stats:pseudo +├─IndexRangeScan_7(Build) 0.10 cop[tikv] table:t2, index:idx2(cast(`b` as signed array), c) range:[3 4,3 4], keep order:false, stats:pseudo +└─Selection_9(Probe) 0.01 cop[tikv] or(and(json_memberof(cast(1, json BINARY), planner__core__casetest__index__index.t2.a), and(json_memberof(cast(1, json BINARY), planner__core__casetest__index__index.t2.b), eq(planner__core__casetest__index__index.t2.c, 3))), or(and(json_memberof(cast(3, json BINARY), planner__core__casetest__index__index.t2.b), eq(planner__core__casetest__index__index.t2.c, 4)), eq(planner__core__casetest__index__index.t2.d, 1))) + └─TableRowIDScan_8 10.20 cop[tikv] table:t2 keep order:false, stats:pseudo +drop table if exists t1, t2; +create table t1(pk int primary key, a json, b json, c int, d int, index idx((cast(a as signed array))), index idx2((cast(b as signed array)))); +create table t2(pk int primary key, a json, b json, c int, d int, index idx(c, (cast(a as signed array))), index idx2((cast(b as signed array)), c), index idx3(c, d), index idx4(d)); +explain select /*+ use_index_merge(t1, idx2, idx) */ * from t1 where 1 member of (a) and 2 member of (b); -- 1: AND index merge from multi member mv index predicate, since member of is single partial path, it can be merged with outer index merge.; +id estRows task access object operator info +IndexMerge_8 0.01 root type: intersection +├─IndexRangeScan_5(Build) 10.00 cop[tikv] table:t1, index:idx(cast(`a` as signed array)) range:[1,1], keep order:false, stats:pseudo +├─IndexRangeScan_6(Build) 10.00 cop[tikv] table:t1, index:idx2(cast(`b` as signed array)) range:[2,2], keep order:false, stats:pseudo +└─TableRowIDScan_7(Probe) 0.01 cop[tikv] table:t1 keep order:false, stats:pseudo +explain select /*+ use_index_merge(t2, idx2, idx) */ * from t2 where 1 member of (a) and c=1 and 2 member of (b); -- 2: AND index merge from multi complicated mv index; +id estRows task access object operator info +IndexMerge_8 0.00 root type: intersection +├─IndexRangeScan_5(Build) 0.10 cop[tikv] table:t2, index:idx(c, cast(`a` as signed array)) range:[1 1,1 1], keep order:false, stats:pseudo +├─IndexRangeScan_6(Build) 0.10 cop[tikv] table:t2, index:idx2(cast(`b` as signed array), c) range:[2 1,2 1], keep order:false, stats:pseudo +└─TableRowIDScan_7(Probe) 0.00 cop[tikv] table:t2 keep order:false, stats:pseudo +explain select /*+ use_index_merge(t2, idx2, idx, idx4) */ * from t2 where 1 member of (a) and c=1 and 2 member of (b) and d=3; -- 3: AND index merge from multi complicated mv indexes and normal indexes; +id estRows task access object operator info +IndexMerge_9 0.00 root type: intersection +├─IndexRangeScan_5(Build) 10.00 cop[tikv] table:t2, index:idx4(d) range:[3,3], keep order:false, stats:pseudo +├─IndexRangeScan_6(Build) 0.10 cop[tikv] table:t2, index:idx(c, cast(`a` as signed array)) range:[1 1,1 1], keep order:false, stats:pseudo +├─IndexRangeScan_7(Build) 0.10 cop[tikv] table:t2, index:idx2(cast(`b` as signed array), c) range:[2 1,2 1], keep order:false, stats:pseudo +└─TableRowIDScan_8(Probe) 0.00 cop[tikv] table:t2 keep order:false, stats:pseudo +explain select /*+ use_index_merge(t2, idx2, idx, idx3) */ * from t2 where json_contains(a, '[1, 2, 3]') and c=1 and 2 member of (b) and d=3; -- 4: AND index merge from multi complicated mv indexes (json_contains (intersection))and normal indexes; +id estRows task access object operator info +IndexMerge_11 0.00 root type: intersection +├─IndexRangeScan_5(Build) 0.10 cop[tikv] table:t2, index:idx3(c, d) range:[1 3,1 3], keep order:false, stats:pseudo +├─IndexRangeScan_6(Build) 0.10 cop[tikv] table:t2, index:idx(c, cast(`a` as signed array)) range:[1 1,1 1], keep order:false, stats:pseudo +├─IndexRangeScan_7(Build) 0.10 cop[tikv] table:t2, index:idx(c, cast(`a` as signed array)) range:[1 2,1 2], keep order:false, stats:pseudo +├─IndexRangeScan_8(Build) 0.10 cop[tikv] table:t2, index:idx(c, cast(`a` as signed array)) range:[1 3,1 3], keep order:false, stats:pseudo +├─IndexRangeScan_9(Build) 0.10 cop[tikv] table:t2, index:idx2(cast(`b` as signed array), c) range:[2 1,2 1], keep order:false, stats:pseudo +└─TableRowIDScan_10(Probe) 0.00 cop[tikv] table:t2 keep order:false, stats:pseudo +explain select /*+ use_index_merge(t2, idx2, idx, idx3) */ * from t2 where json_overlaps(a, '[1, 2, 3]') and c=1 and 2 member of (b) and d=3; -- 5: AND index merge from multi complicated mv indexes (json_overlap (intersection))and normal indexes; +id estRows task access object operator info +Selection_5 0.00 root json_overlaps(planner__core__casetest__index__index.t2.a, cast("[1, 2, 3]", json BINARY)) +└─IndexMerge_9 0.00 root type: intersection + ├─IndexRangeScan_6(Build) 0.10 cop[tikv] table:t2, index:idx3(c, d) range:[1 3,1 3], keep order:false, stats:pseudo + ├─IndexRangeScan_7(Build) 0.10 cop[tikv] table:t2, index:idx2(cast(`b` as signed array), c) range:[2 1,2 1], keep order:false, stats:pseudo + └─TableRowIDScan_8(Probe) 0.00 cop[tikv] table:t2 keep order:false, stats:pseudo +explain select /*+ use_index_merge(t2, idx2, idx) */ * from t2 where 1 member of (a) and c=1 and c=2; -- 6: AND index merge from multi complicated mv indexes (empty range); +id estRows task access object operator info +TableDual_5 0.00 root rows:0 +drop table if exists t; +create table t(a int, b int, c int, unique index(a), unique index(b), primary key(c)); +explain format = 'brief' select /*+ USE_INDEX_MERGE(t, a, b) */ * from t where a = 1 or b = 2; +id estRows task access object operator info +IndexMerge 2.00 root type: union +├─IndexRangeScan(Build) 1.00 cop[tikv] table:t, index:a(a) range:[1,1], keep order:false, stats:pseudo +├─IndexRangeScan(Build) 1.00 cop[tikv] table:t, index:b(b) range:[2,2], keep order:false, stats:pseudo +└─TableRowIDScan(Probe) 2.00 cop[tikv] table:t keep order:false, stats:pseudo +explain format = 'brief' select /*+ USE_INDEX_MERGE(t, A, B) */ * from t where a = 1 or b = 2; +id estRows task access object operator info +IndexMerge 2.00 root type: union +├─IndexRangeScan(Build) 1.00 cop[tikv] table:t, index:a(a) range:[1,1], keep order:false, stats:pseudo +├─IndexRangeScan(Build) 1.00 cop[tikv] table:t, index:b(b) range:[2,2], keep order:false, stats:pseudo +└─TableRowIDScan(Probe) 2.00 cop[tikv] table:t keep order:false, stats:pseudo +explain format = 'brief' select /*+ USE_INDEX_MERGE(t, primary) */ * from t where 1 or t.c; +id estRows task access object operator info +TableReader 10000.00 root data:TableFullScan +└─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo +explain format = 'brief' select /*+ USE_INDEX_MERGE(t, a, b, c) */ * from t where 1 or t.a = 1 or t.b = 2; +id estRows task access object operator info +TableReader 10000.00 root data:Selection +└─Selection 10000.00 cop[tikv] or(1, or(eq(planner__core__casetest__index__index.t.a, 1), eq(planner__core__casetest__index__index.t.b, 2))) + └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo +drop table if exists t1, t2, t3, t4; +create table t1(a int, b int, primary key (a), key idx_t1_b (b)); +create table t2(a int, b int, primary key (a), key idx_t1_b (b)); +create table t3(a int, b int, c int); +create table t4(a int, b int, c int, primary key (a, b) clustered); +desc format = 'brief' select /*+ TIDB_INLJ(t2)*/ * from t1, t2 where t1.a = t2.a and t1.b = t2.b; +id estRows task access object operator info +IndexJoin 12487.50 root inner join, inner:TableReader, outer key:planner__core__casetest__index__index.t1.a, inner key:planner__core__casetest__index__index.t2.a, equal cond:eq(planner__core__casetest__index__index.t1.a, planner__core__casetest__index__index.t2.a), eq(planner__core__casetest__index__index.t1.b, planner__core__casetest__index__index.t2.b) +├─IndexReader(Build) 9990.00 root index:IndexFullScan +│ └─IndexFullScan 9990.00 cop[tikv] table:t1, index:idx_t1_b(b) keep order:false, stats:pseudo +└─TableReader(Probe) 9980.01 root data:Selection + └─Selection 9980.01 cop[tikv] not(isnull(planner__core__casetest__index__index.t2.b)) + └─TableRangeScan 9990.00 cop[tikv] table:t2 range: decided by [planner__core__casetest__index__index.t1.a], keep order:false, stats:pseudo +desc format = 'brief' select /*+ TIDB_INLJ(t2)*/ * from t1, t2 where t1.a = t2.a and t1.b = t2.a and t1.b = t2.b; +id estRows task access object operator info +IndexJoin 12487.50 root inner join, inner:TableReader, outer key:planner__core__casetest__index__index.t1.a, planner__core__casetest__index__index.t1.b, inner key:planner__core__casetest__index__index.t2.a, planner__core__casetest__index__index.t2.a, equal cond:eq(planner__core__casetest__index__index.t1.a, planner__core__casetest__index__index.t2.a), eq(planner__core__casetest__index__index.t1.b, planner__core__casetest__index__index.t2.a), eq(planner__core__casetest__index__index.t1.b, planner__core__casetest__index__index.t2.b) +├─IndexReader(Build) 9990.00 root index:IndexFullScan +│ └─IndexFullScan 9990.00 cop[tikv] table:t1, index:idx_t1_b(b) keep order:false, stats:pseudo +└─TableReader(Probe) 9980.01 root data:Selection + └─Selection 9980.01 cop[tikv] not(isnull(planner__core__casetest__index__index.t2.b)) + └─TableRangeScan 9990.00 cop[tikv] table:t2 range: decided by [planner__core__casetest__index__index.t1.a planner__core__casetest__index__index.t1.b], keep order:false, stats:pseudo +desc format = 'brief' select /*+ INL_JOIN(t4) */ * from t3 join t4 on t3.a = t4.a where t4.b = 1; +id estRows task access object operator info +Projection 12.50 root planner__core__casetest__index__index.t3.a, planner__core__casetest__index__index.t3.b, planner__core__casetest__index__index.t3.c, planner__core__casetest__index__index.t4.a, planner__core__casetest__index__index.t4.b, planner__core__casetest__index__index.t4.c +└─IndexJoin 12.50 root inner join, inner:TableReader, outer key:planner__core__casetest__index__index.t3.a, inner key:planner__core__casetest__index__index.t4.a, equal cond:eq(planner__core__casetest__index__index.t3.a, planner__core__casetest__index__index.t4.a) + ├─TableReader(Build) 9990.00 root data:Selection + │ └─Selection 9990.00 cop[tikv] not(isnull(planner__core__casetest__index__index.t3.a)) + │ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo + └─TableReader(Probe) 9.99 root data:Selection + └─Selection 9.99 cop[tikv] eq(planner__core__casetest__index__index.t4.b, 1) + └─TableRangeScan 9990.00 cop[tikv] table:t4 range: decided by [eq(planner__core__casetest__index__index.t4.a, planner__core__casetest__index__index.t3.a) eq(planner__core__casetest__index__index.t4.b, 1)], keep order:false, stats:pseudo +desc format = 'brief' select /*+ INL_JOIN(t4) */ * from t3 join t4 on t3.b = t4.b where t4.a = 1; +id estRows task access object operator info +Projection 12.50 root planner__core__casetest__index__index.t3.a, planner__core__casetest__index__index.t3.b, planner__core__casetest__index__index.t3.c, planner__core__casetest__index__index.t4.a, planner__core__casetest__index__index.t4.b, planner__core__casetest__index__index.t4.c +└─IndexJoin 12.50 root inner join, inner:TableReader, outer key:planner__core__casetest__index__index.t3.b, inner key:planner__core__casetest__index__index.t4.b, equal cond:eq(planner__core__casetest__index__index.t3.b, planner__core__casetest__index__index.t4.b) + ├─TableReader(Build) 9990.00 root data:Selection + │ └─Selection 9990.00 cop[tikv] not(isnull(planner__core__casetest__index__index.t3.b)) + │ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo + └─TableReader(Probe) 9.99 root data:Selection + └─Selection 9.99 cop[tikv] eq(planner__core__casetest__index__index.t4.a, 1) + └─TableRangeScan 9990.00 cop[tikv] table:t4 range: decided by [eq(planner__core__casetest__index__index.t4.b, planner__core__casetest__index__index.t3.b) eq(planner__core__casetest__index__index.t4.a, 1)], keep order:false, stats:pseudo +set tidb_cost_model_version=2; +drop table if exists t1, t2; +create table t1(a int not null, b int not null, c int not null); +create table t2(a int not null, b int not null, c int not null, index idx1(a,b), index idx2(c)); +insert into t1 values(1,1,1),(1,1,1),(1,1,1); +insert into t2 values(1,1,1),(1,1,2),(1,1,3); +analyze table t1, t2; +explain format = 'brief' select /*+ inl_join(t2) */ * from t1, t2 where t1.a = t2.a and t1.b = t2.b and t1.c = t2.c; +id estRows task access object operator info +IndexJoin 3.00 root inner join, inner:IndexLookUp, outer key:planner__core__casetest__index__index.t1.c, inner key:planner__core__casetest__index__index.t2.c, equal cond:eq(planner__core__casetest__index__index.t1.a, planner__core__casetest__index__index.t2.a), eq(planner__core__casetest__index__index.t1.b, planner__core__casetest__index__index.t2.b), eq(planner__core__casetest__index__index.t1.c, planner__core__casetest__index__index.t2.c) +├─TableReader(Build) 3.00 root data:TableFullScan +│ └─TableFullScan 3.00 cop[tikv] table:t1 keep order:false +└─IndexLookUp(Probe) 3.00 root + ├─IndexRangeScan(Build) 3.00 cop[tikv] table:t2, index:idx2(c) range: decided by [eq(planner__core__casetest__index__index.t2.c, planner__core__casetest__index__index.t1.c)], keep order:false + └─TableRowIDScan(Probe) 3.00 cop[tikv] table:t2 keep order:false +set tidb_cost_model_version=default; +drop table if exists t; +create table t (a int, b int, unique key(a), unique key(b)); +insert into t value (1, 5), (2, 4), (3, 3), (4, 2), (5, 1); +insert into t value (6, 0), (7, -1), (8, -2), (9, -3), (10, -4); +analyze table t; +desc format='brief' select /*+ use_index_merge(t) */ * from t where a =1 or (b=1 and b+2>1); +id estRows task access object operator info +IndexMerge 8.00 root type: union +├─IndexRangeScan(Build) 1.00 cop[tikv] table:t, index:a(a) range:[1,1], keep order:false +├─Selection(Build) 1.00 cop[tikv] 1 +│ └─IndexRangeScan 1.00 cop[tikv] table:t, index:b(b) range:[1,1], keep order:false +└─TableRowIDScan(Probe) 8.00 cop[tikv] table:t keep order:false +show warnings; +Level Code Message +desc format='brief' select /*+ use_index_merge(t) */ * from t where a =1 or (b=1 and length(b)=1); +id estRows task access object operator info +IndexMerge 8.00 root type: union +├─IndexRangeScan(Build) 1.00 cop[tikv] table:t, index:a(a) range:[1,1], keep order:false +├─Selection(Build) 1.00 cop[tikv] 1 +│ └─IndexRangeScan 1.00 cop[tikv] table:t, index:b(b) range:[1,1], keep order:false +└─TableRowIDScan(Probe) 8.00 cop[tikv] table:t keep order:false +show warnings; +Level Code Message +desc format='brief' select /*+ use_index_merge(t) */ * from t where (a=1 and length(a)=1) or (b=1 and length(b)=1); +id estRows task access object operator info +IndexMerge 8.00 root type: union +├─Selection(Build) 1.00 cop[tikv] 1 +│ └─IndexRangeScan 1.00 cop[tikv] table:t, index:a(a) range:[1,1], keep order:false +├─Selection(Build) 1.00 cop[tikv] 1 +│ └─IndexRangeScan 1.00 cop[tikv] table:t, index:b(b) range:[1,1], keep order:false +└─TableRowIDScan(Probe) 8.00 cop[tikv] table:t keep order:false +show warnings; +Level Code Message +desc format='brief' select /*+ use_index_merge(t) */ * from t where (a=1 and length(b)=1) or (b=1 and length(a)=1); +id estRows task access object operator info +IndexMerge 0.29 root type: union +├─IndexRangeScan(Build) 1.00 cop[tikv] table:t, index:a(a) range:[1,1], keep order:false +├─IndexRangeScan(Build) 1.00 cop[tikv] table:t, index:b(b) range:[1,1], keep order:false +└─Selection(Probe) 0.29 cop[tikv] or(and(eq(planner__core__casetest__index__index.t.a, 1), eq(length(cast(planner__core__casetest__index__index.t.b, var_string(20))), 1)), and(eq(planner__core__casetest__index__index.t.b, 1), eq(length(cast(planner__core__casetest__index__index.t.a, var_string(20))), 1))) + └─TableRowIDScan 1.90 cop[tikv] table:t keep order:false +show warnings; +Level Code Message +set tidb_cost_model_version=2; +set tidb_enable_clustered_index=on; +drop table if exists t; +create table t (a int, b varchar(20), c decimal(40,10), d int, primary key(a,b), key(c)); +insert into t values (1,"111",1.1,11), (2,"222",2.2,12), (3,"333",3.3,13); +analyze table t; +explain format = 'brief'select /*+ inl_join(t1, t2) */ * from t t1 join t t2 on t1.a = t2.a; +id estRows task access object operator info +IndexJoin 3.00 root inner join, inner:TableReader, outer key:planner__core__casetest__index__index.t.a, inner key:planner__core__casetest__index__index.t.a, equal cond:eq(planner__core__casetest__index__index.t.a, planner__core__casetest__index__index.t.a) +├─TableReader(Build) 3.00 root data:TableFullScan +│ └─TableFullScan 3.00 cop[tikv] table:t1 keep order:false +└─TableReader(Probe) 3.00 root data:TableRangeScan + └─TableRangeScan 3.00 cop[tikv] table:t2 range: decided by [eq(planner__core__casetest__index__index.t.a, planner__core__casetest__index__index.t.a)], keep order:false +select /*+ inl_join(t1, t2) */ * from t t1 join t t2 on t1.a = t2.a; +a b c d a b c d +1 111 1.1000000000 11 1 111 1.1000000000 11 +2 222 2.2000000000 12 2 222 2.2000000000 12 +3 333 3.3000000000 13 3 333 3.3000000000 13 +explain format = 'brief'select /*+ inl_merge_join(t1, t2) */ * from t t1 join t t2 on t1.a = t2.a; +id estRows task access object operator info +IndexMergeJoin 3.00 root inner join, inner:TableReader, outer key:planner__core__casetest__index__index.t.a, inner key:planner__core__casetest__index__index.t.a +├─TableReader(Build) 3.00 root data:TableFullScan +│ └─TableFullScan 3.00 cop[tikv] table:t1 keep order:false +└─TableReader(Probe) 3.00 root data:TableRangeScan + └─TableRangeScan 3.00 cop[tikv] table:t2 range: decided by [eq(planner__core__casetest__index__index.t.a, planner__core__casetest__index__index.t.a)], keep order:true +select /*+ inl_merge_join(t1, t2) */ * from t t1 join t t2 on t1.a = t2.a; +a b c d a b c d +1 111 1.1000000000 11 1 111 1.1000000000 11 +2 222 2.2000000000 12 2 222 2.2000000000 12 +3 333 3.3000000000 13 3 333 3.3000000000 13 +explain format = 'brief'select /*+ inl_hash_join(t1, t2) */ * from t t1 join t t2 on t1.a = t2.a; +id estRows task access object operator info +IndexHashJoin 3.00 root inner join, inner:TableReader, outer key:planner__core__casetest__index__index.t.a, inner key:planner__core__casetest__index__index.t.a, equal cond:eq(planner__core__casetest__index__index.t.a, planner__core__casetest__index__index.t.a) +├─TableReader(Build) 3.00 root data:TableFullScan +│ └─TableFullScan 3.00 cop[tikv] table:t1 keep order:false +└─TableReader(Probe) 3.00 root data:TableRangeScan + └─TableRangeScan 3.00 cop[tikv] table:t2 range: decided by [eq(planner__core__casetest__index__index.t.a, planner__core__casetest__index__index.t.a)], keep order:false +select /*+ inl_hash_join(t1, t2) */ * from t t1 join t t2 on t1.a = t2.a; +a b c d a b c d +1 111 1.1000000000 11 1 111 1.1000000000 11 +2 222 2.2000000000 12 2 222 2.2000000000 12 +3 333 3.3000000000 13 3 333 3.3000000000 13 +explain format = 'brief'select /*+ inl_join(t1, t2) */ * from t t1 join t t2 on t1.a = t2.a and t1.b = t2.b; +id estRows task access object operator info +IndexJoin 3.00 root inner join, inner:TableReader, outer key:planner__core__casetest__index__index.t.a, planner__core__casetest__index__index.t.b, inner key:planner__core__casetest__index__index.t.a, planner__core__casetest__index__index.t.b, equal cond:eq(planner__core__casetest__index__index.t.a, planner__core__casetest__index__index.t.a), eq(planner__core__casetest__index__index.t.b, planner__core__casetest__index__index.t.b) +├─TableReader(Build) 3.00 root data:TableFullScan +│ └─TableFullScan 3.00 cop[tikv] table:t1 keep order:false +└─TableReader(Probe) 3.00 root data:TableRangeScan + └─TableRangeScan 3.00 cop[tikv] table:t2 range: decided by [eq(planner__core__casetest__index__index.t.a, planner__core__casetest__index__index.t.a) eq(planner__core__casetest__index__index.t.b, planner__core__casetest__index__index.t.b)], keep order:false +select /*+ inl_join(t1, t2) */ * from t t1 join t t2 on t1.a = t2.a and t1.b = t2.b; +a b c d a b c d +1 111 1.1000000000 11 1 111 1.1000000000 11 +2 222 2.2000000000 12 2 222 2.2000000000 12 +3 333 3.3000000000 13 3 333 3.3000000000 13 +explain format = 'brief'select /*+ inl_join(t1, t2) */ * from t t1 join t t2 on t1.c = t2.c; +id estRows task access object operator info +IndexJoin 3.00 root inner join, inner:IndexLookUp, outer key:planner__core__casetest__index__index.t.c, inner key:planner__core__casetest__index__index.t.c, equal cond:eq(planner__core__casetest__index__index.t.c, planner__core__casetest__index__index.t.c) +├─TableReader(Build) 3.00 root data:Selection +│ └─Selection 3.00 cop[tikv] not(isnull(planner__core__casetest__index__index.t.c)) +│ └─TableFullScan 3.00 cop[tikv] table:t1 keep order:false +└─IndexLookUp(Probe) 3.00 root + ├─Selection(Build) 3.00 cop[tikv] not(isnull(planner__core__casetest__index__index.t.c)) + │ └─IndexRangeScan 3.00 cop[tikv] table:t2, index:c(c) range: decided by [eq(planner__core__casetest__index__index.t.c, planner__core__casetest__index__index.t.c)], keep order:false + └─TableRowIDScan(Probe) 3.00 cop[tikv] table:t2 keep order:false +select /*+ inl_join(t1, t2) */ * from t t1 join t t2 on t1.c = t2.c; +a b c d a b c d +1 111 1.1000000000 11 1 111 1.1000000000 11 +2 222 2.2000000000 12 2 222 2.2000000000 12 +3 333 3.3000000000 13 3 333 3.3000000000 13 +explain format = 'brief'select /*+ inl_merge_join(t1,t2) */ t2.a, t2.c, t2.d from t t1 left join t t2 on t1.a = t2.c; +id estRows task access object operator info +IndexMergeJoin 3.00 root left outer join, inner:Projection, outer key:Column#9, inner key:planner__core__casetest__index__index.t.c +├─Projection(Build) 3.00 root cast(planner__core__casetest__index__index.t.a, decimal(10,0) BINARY)->Column#9 +│ └─IndexReader 3.00 root index:IndexFullScan +│ └─IndexFullScan 3.00 cop[tikv] table:t1, index:c(c) keep order:false +└─Projection(Probe) 3.00 root planner__core__casetest__index__index.t.a, planner__core__casetest__index__index.t.c, planner__core__casetest__index__index.t.d + └─IndexLookUp 3.00 root + ├─IndexRangeScan(Build) 3.00 cop[tikv] table:t2, index:c(c) range: decided by [eq(planner__core__casetest__index__index.t.c, Column#9)], keep order:true + └─TableRowIDScan(Probe) 3.00 cop[tikv] table:t2 keep order:false +select /*+ inl_merge_join(t1,t2) */ t2.a, t2.c, t2.d from t t1 left join t t2 on t1.a = t2.c; +a c d +NULL NULL NULL +NULL NULL NULL +NULL NULL NULL +set tidb_enable_clustered_index=default; +set tidb_cost_model_version=default; +set tidb_cost_model_version=2; +drop table if exists t1, t2; +create table t1(c1 int, c2 int, c3 int, primary key(c1), key(c2)); +insert into t1 values(1, 1, 1); +insert into t1 values(2, 2, 2); +create table t2(c1 int, c2 int, c3 int); +insert into t2 values(1, 1, 1); +insert into t2 values(2, 2, 2); +drop table if exists tt1, tt2; +create table tt1 (c_int int, c_str varchar(40), c_datetime datetime, c_decimal decimal(12, 6), primary key(c_int), key(c_int), key(c_str), unique key(c_decimal), key(c_datetime)); +create table tt2 like tt1 ; +insert into tt1 (c_int, c_str, c_datetime, c_decimal) values (6, 'sharp payne', '2020-06-07 10:40:39', 6.117000) , +(7, 'objective kare', '2020-02-05 18:47:26', 1.053000) , +(8, 'thirsty pasteur', '2020-01-02 13:06:56', 2.506000) , +(9, 'blissful wilbur', '2020-06-04 11:34:04', 9.144000) , +(10, 'reverent mclean', '2020-02-12 07:36:26', 7.751000) ; +insert into tt2 (c_int, c_str, c_datetime, c_decimal) values (6, 'beautiful joliot', '2020-01-16 01:44:37', 5.627000) , +(7, 'hopeful blackburn', '2020-05-23 21:44:20', 7.890000) , +(8, 'ecstatic davinci', '2020-02-01 12:27:17', 5.648000) , +(9, 'hopeful lewin', '2020-05-05 05:58:25', 7.288000) , +(10, 'sharp jennings', '2020-01-28 04:35:03', 9.758000) ; +explain format=brief select * from t2 where c1 < all(select /*+ use_index_merge(t1) */ c1 from t1 where (c1 = 10 and c1 = t2.c3 or c2 = 1 and c2 = t2.c3) and substring(c3, 10)) order by c1; +id estRows task access object operator info +Sort 10000.00 root planner__core__casetest__index__index.t2.c1 +└─Projection 10000.00 root planner__core__casetest__index__index.t2.c1, planner__core__casetest__index__index.t2.c2, planner__core__casetest__index__index.t2.c3 + └─Apply 10000.00 root CARTESIAN inner join, other cond:or(and(lt(planner__core__casetest__index__index.t2.c1, Column#8), if(ne(Column#9, 0), NULL, 1)), or(eq(Column#10, 0), if(isnull(planner__core__casetest__index__index.t2.c1), NULL, 0))) + ├─TableReader(Build) 10000.00 root data:TableFullScan + │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo + └─StreamAgg(Probe) 10000.00 root funcs:min(planner__core__casetest__index__index.t1.c1)->Column#8, funcs:sum(0)->Column#9, funcs:count(1)->Column#10 + └─IndexMerge 63.35 root type: union + ├─Selection(Build) 10000.00 cop[tikv] eq(10, planner__core__casetest__index__index.t2.c3) + │ └─TableRangeScan 10000.00 cop[tikv] table:t1 range:[10,10], keep order:false, stats:pseudo + ├─Selection(Build) 80000.00 cop[tikv] eq(1, planner__core__casetest__index__index.t2.c3) + │ └─IndexRangeScan 100000.00 cop[tikv] table:t1, index:c2(c2) range:[1,1], keep order:false, stats:pseudo + └─Selection(Probe) 63.35 cop[tikv] or(and(eq(planner__core__casetest__index__index.t1.c1, 10), eq(10, planner__core__casetest__index__index.t2.c3)), and(eq(planner__core__casetest__index__index.t1.c2, 1), eq(1, planner__core__casetest__index__index.t2.c3))), substring(cast(planner__core__casetest__index__index.t1.c3, var_string(20)), 10) + └─TableRowIDScan 89992.00 cop[tikv] table:t1 keep order:false, stats:pseudo +select * from t2 where c1 < all(select /*+ use_index_merge(t1) */ c1 from t1 where (c1 = 10 and c1 = t2.c3 or c2 = 1 and c2 = t2.c3) and substring(c3, 10)) order by c1; +c1 c2 c3 +1 1 1 +2 2 2 +explain format=brief select * from t2 where c1 < all(select /*+ use_index_merge(t1) */ c1 from t1 where (c1 = 10 and c1 = t2.c3 or c2 = 1 and c2 = t2.c3) and reverse(c3)) order by c1; +id estRows task access object operator info +Sort 10000.00 root planner__core__casetest__index__index.t2.c1 +└─Projection 10000.00 root planner__core__casetest__index__index.t2.c1, planner__core__casetest__index__index.t2.c2, planner__core__casetest__index__index.t2.c3 + └─Apply 10000.00 root CARTESIAN inner join, other cond:or(and(lt(planner__core__casetest__index__index.t2.c1, Column#8), if(ne(Column#9, 0), NULL, 1)), or(eq(Column#10, 0), if(isnull(planner__core__casetest__index__index.t2.c1), NULL, 0))) + ├─TableReader(Build) 10000.00 root data:TableFullScan + │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo + └─StreamAgg(Probe) 10000.00 root funcs:min(planner__core__casetest__index__index.t1.c1)->Column#8, funcs:sum(0)->Column#9, funcs:count(1)->Column#10 + └─IndexMerge 63.35 root type: union + ├─Selection(Build) 10000.00 cop[tikv] eq(10, planner__core__casetest__index__index.t2.c3) + │ └─TableRangeScan 10000.00 cop[tikv] table:t1 range:[10,10], keep order:false, stats:pseudo + ├─Selection(Build) 80000.00 cop[tikv] eq(1, planner__core__casetest__index__index.t2.c3) + │ └─IndexRangeScan 100000.00 cop[tikv] table:t1, index:c2(c2) range:[1,1], keep order:false, stats:pseudo + └─Selection(Probe) 63.35 cop[tikv] or(and(eq(planner__core__casetest__index__index.t1.c1, 10), eq(10, planner__core__casetest__index__index.t2.c3)), and(eq(planner__core__casetest__index__index.t1.c2, 1), eq(1, planner__core__casetest__index__index.t2.c3))), reverse(cast(planner__core__casetest__index__index.t1.c3, var_string(20))) + └─TableRowIDScan 89992.00 cop[tikv] table:t1 keep order:false, stats:pseudo +select * from t2 where c1 < all(select /*+ use_index_merge(t1) */ c1 from t1 where (c1 = 10 and c1 = t2.c3 or c2 = 1 and c2 = t2.c3) and reverse(c3)) order by c1; +c1 c2 c3 +2 2 2 +explain format=brief select * from t2 where c1 < all(select /*+ use_index_merge(t1) */ c1 from t1 where (c1 >= 10 and c1 = t2.c3 or c2 = 1 and c2 = t2.c3) and substring(c3, 10)) order by c1; +id estRows task access object operator info +Sort 10000.00 root planner__core__casetest__index__index.t2.c1 +└─Projection 10000.00 root planner__core__casetest__index__index.t2.c1, planner__core__casetest__index__index.t2.c2, planner__core__casetest__index__index.t2.c3 + └─Apply 10000.00 root CARTESIAN inner join, other cond:or(and(lt(planner__core__casetest__index__index.t2.c1, Column#8), if(ne(Column#9, 0), NULL, 1)), or(eq(Column#10, 0), if(isnull(planner__core__casetest__index__index.t2.c1), NULL, 0))) + ├─TableReader(Build) 10000.00 root data:TableFullScan + │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo + └─StreamAgg(Probe) 10000.00 root funcs:min(planner__core__casetest__index__index.t1.c1)->Column#8, funcs:sum(0)->Column#9, funcs:count(1)->Column#10 + └─IndexMerge 30263.46 root type: union + ├─Selection(Build) 33333.33 cop[tikv] eq(planner__core__casetest__index__index.t1.c1, planner__core__casetest__index__index.t2.c3) + │ └─TableRangeScan 33333333.33 cop[tikv] table:t1 range:[10,+inf], keep order:false, stats:pseudo + ├─Selection(Build) 80000.00 cop[tikv] eq(1, planner__core__casetest__index__index.t2.c3) + │ └─IndexRangeScan 100000.00 cop[tikv] table:t1, index:c2(c2) range:[1,1], keep order:false, stats:pseudo + └─Selection(Probe) 30263.46 cop[tikv] or(and(ge(planner__core__casetest__index__index.t1.c1, 10), eq(planner__core__casetest__index__index.t1.c1, planner__core__casetest__index__index.t2.c3)), and(eq(planner__core__casetest__index__index.t1.c2, 1), eq(1, planner__core__casetest__index__index.t2.c3))), substring(cast(planner__core__casetest__index__index.t1.c3, var_string(20)), 10) + └─TableRowIDScan 33386666.67 cop[tikv] table:t1 keep order:false, stats:pseudo +select * from t2 where c1 < all(select /*+ use_index_merge(t1) */ c1 from t1 where (c1 >= 10 and c1 = t2.c3 or c2 = 1 and c2 = t2.c3) and substring(c3, 10)) order by c1; +c1 c2 c3 +1 1 1 +2 2 2 +explain format=brief select c_int from tt1 where c_decimal < all (select /*+ use_index_merge(tt2) */ c_decimal from tt2 where tt1.c_int = tt2.c_int and tt1.c_datetime > tt2.c_datetime and tt2.c_decimal = 9.060 or tt2.c_str <= 'interesting shtern' and tt1.c_int = tt2.c_int) order by 1; +id estRows task access object operator info +Projection 10000.00 root planner__core__casetest__index__index.tt1.c_int +└─Apply 10000.00 root CARTESIAN inner join, other cond:or(and(lt(planner__core__casetest__index__index.tt1.c_decimal, Column#9), if(ne(Column#10, 0), NULL, 1)), or(eq(Column#11, 0), if(isnull(planner__core__casetest__index__index.tt1.c_decimal), NULL, 0))) + ├─TableReader(Build) 10000.00 root data:TableFullScan + │ └─TableFullScan 10000.00 cop[tikv] table:tt1 keep order:true, stats:pseudo + └─StreamAgg(Probe) 10000.00 root funcs:min(Column#14)->Column#9, funcs:sum(Column#15)->Column#10, funcs:count(1)->Column#11 + └─Projection 11.05 root planner__core__casetest__index__index.tt2.c_decimal->Column#14, cast(isnull(planner__core__casetest__index__index.tt2.c_decimal), decimal(20,0) BINARY)->Column#15 + └─IndexMerge 11.05 root type: union + ├─Selection(Build) 10.00 cop[tikv] eq(planner__core__casetest__index__index.tt1.c_int, planner__core__casetest__index__index.tt2.c_int) + │ └─IndexRangeScan 10000.00 cop[tikv] table:tt2, index:c_decimal(c_decimal) range:[9.060000,9.060000], keep order:false, stats:pseudo + ├─Selection(Build) 33233.33 cop[tikv] eq(planner__core__casetest__index__index.tt1.c_int, planner__core__casetest__index__index.tt2.c_int) + │ └─IndexRangeScan 33233333.33 cop[tikv] table:tt2, index:c_str(c_str) range:[-inf,"interesting shtern"], keep order:false, stats:pseudo + └─Selection(Probe) 11.05 cop[tikv] or(and(eq(planner__core__casetest__index__index.tt1.c_int, planner__core__casetest__index__index.tt2.c_int), and(gt(planner__core__casetest__index__index.tt1.c_datetime, planner__core__casetest__index__index.tt2.c_datetime), eq(planner__core__casetest__index__index.tt2.c_decimal, 9.060))), and(le(planner__core__casetest__index__index.tt2.c_str, "interesting shtern"), eq(planner__core__casetest__index__index.tt1.c_int, planner__core__casetest__index__index.tt2.c_int))) + └─TableRowIDScan 33243.33 cop[tikv] table:tt2 keep order:false, stats:pseudo +select c_int from tt1 where c_decimal < all (select /*+ use_index_merge(tt2) */ c_decimal from tt2 where tt1.c_int = tt2.c_int and tt1.c_datetime > tt2.c_datetime and tt2.c_decimal = 9.060 or tt2.c_str <= 'interesting shtern' and tt1.c_int = tt2.c_int) order by 1; +c_int +7 +8 +10 +explain format=brief select c_int from tt1 where c_decimal > all (select /*+ use_index_merge(tt2) */ c_decimal from tt2 where tt2.c_int = 7 and tt2.c_int < tt1.c_decimal or tt2.c_str >= 'zzzzzzzzzzzzzzzzzzz' and tt1.c_int = tt2.c_int) order by 1; +id estRows task access object operator info +Projection 10000.00 root planner__core__casetest__index__index.tt1.c_int +└─Apply 10000.00 root CARTESIAN inner join, other cond:or(and(gt(planner__core__casetest__index__index.tt1.c_decimal, Column#9), if(ne(Column#10, 0), NULL, 1)), or(eq(Column#11, 0), if(isnull(planner__core__casetest__index__index.tt1.c_decimal), NULL, 0))) + ├─TableReader(Build) 10000.00 root data:TableFullScan + │ └─TableFullScan 10000.00 cop[tikv] table:tt1 keep order:true, stats:pseudo + └─StreamAgg(Probe) 10000.00 root funcs:max(Column#14)->Column#9, funcs:sum(Column#15)->Column#10, funcs:count(1)->Column#11 + └─Projection 17.91 root planner__core__casetest__index__index.tt2.c_decimal->Column#14, cast(isnull(planner__core__casetest__index__index.tt2.c_decimal), decimal(20,0) BINARY)->Column#15 + └─IndexMerge 17.91 root type: union + ├─Selection(Build) 10000.00 cop[tikv] lt(7, planner__core__casetest__index__index.tt1.c_decimal) + │ └─TableRangeScan 10000.00 cop[tikv] table:tt2 range:[7,7], keep order:false, stats:pseudo + ├─Selection(Build) 33333.33 cop[tikv] eq(planner__core__casetest__index__index.tt1.c_int, planner__core__casetest__index__index.tt2.c_int) + │ └─IndexRangeScan 33333333.33 cop[tikv] table:tt2, index:c_str(c_str) range:["zzzzzzzzzzzzzzzzzzz",+inf], keep order:false, stats:pseudo + └─Selection(Probe) 17.91 cop[tikv] or(and(eq(planner__core__casetest__index__index.tt2.c_int, 7), lt(7, planner__core__casetest__index__index.tt1.c_decimal)), and(ge(planner__core__casetest__index__index.tt2.c_str, "zzzzzzzzzzzzzzzzzzz"), eq(planner__core__casetest__index__index.tt1.c_int, planner__core__casetest__index__index.tt2.c_int))) + └─TableRowIDScan 43330.00 cop[tikv] table:tt2 keep order:false, stats:pseudo +select c_int from tt1 where c_decimal > all (select /*+ use_index_merge(tt2) */ c_decimal from tt2 where tt2.c_int = 7 and tt2.c_int < tt1.c_decimal or tt2.c_str >= 'zzzzzzzzzzzzzzzzzzz' and tt1.c_int = tt2.c_int) order by 1; +c_int +6 +7 +8 +9 +set tidb_cost_model_version=default; +drop table if exists t1, t2; +create table t1(a int, b int, c varchar(10), d varchar(10), index idx_a_b_c_d(a, b, c(2), d(2))); +create table t2(e int, f int, g varchar(10), h varchar(10)); +set @@tidb_opt_range_max_size = 0; +explain format='brief' select /*+ inl_join(t1) */ * from t1 join t2 on t1.b = t2.e and t1.d = t2.g where t1.a in (1, 3) and t1.c in ('aaa', 'bbb'); +id estRows task access object operator info +IndexJoin 0.50 root inner join, inner:IndexLookUp, outer key:planner__core__casetest__index__index.t2.e, planner__core__casetest__index__index.t2.g, inner key:planner__core__casetest__index__index.t1.b, planner__core__casetest__index__index.t1.d, equal cond:eq(planner__core__casetest__index__index.t2.e, planner__core__casetest__index__index.t1.b), eq(planner__core__casetest__index__index.t2.g, planner__core__casetest__index__index.t1.d) +├─TableReader(Build) 9980.01 root data:Selection +│ └─Selection 9980.01 cop[tikv] not(isnull(planner__core__casetest__index__index.t2.e)), not(isnull(planner__core__casetest__index__index.t2.g)) +│ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo +└─IndexLookUp(Probe) 0.50 root + ├─Selection(Build) 249.50 cop[tikv] not(isnull(planner__core__casetest__index__index.t1.b)), not(isnull(planner__core__casetest__index__index.t1.d)) + │ └─IndexRangeScan 250.00 cop[tikv] table:t1, index:idx_a_b_c_d(a, b, c, d) range: decided by [eq(planner__core__casetest__index__index.t1.b, planner__core__casetest__index__index.t2.e) eq(planner__core__casetest__index__index.t1.d, planner__core__casetest__index__index.t2.g) in(planner__core__casetest__index__index.t1.a, 1, 3) in(planner__core__casetest__index__index.t1.c, aaa, bbb)], keep order:false, stats:pseudo + └─Selection(Probe) 0.50 cop[tikv] in(planner__core__casetest__index__index.t1.c, "aaa", "bbb") + └─TableRowIDScan 249.50 cop[tikv] table:t1 keep order:false, stats:pseudo +show warnings; +Level Code Message +set @@tidb_opt_range_max_size = 2900; +explain format='brief' select /*+ inl_join(t1) */ * from t1 join t2 on t1.b = t2.e and t1.d = t2.g where t1.a in (1, 3) and t1.c in ('aaa', 'bbb'); +id estRows task access object operator info +IndexJoin 0.50 root inner join, inner:IndexLookUp, outer key:planner__core__casetest__index__index.t2.e, inner key:planner__core__casetest__index__index.t1.b, equal cond:eq(planner__core__casetest__index__index.t2.e, planner__core__casetest__index__index.t1.b), eq(planner__core__casetest__index__index.t2.g, planner__core__casetest__index__index.t1.d) +├─TableReader(Build) 9980.01 root data:Selection +│ └─Selection 9980.01 cop[tikv] not(isnull(planner__core__casetest__index__index.t2.e)), not(isnull(planner__core__casetest__index__index.t2.g)) +│ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo +└─IndexLookUp(Probe) 0.50 root + ├─Selection(Build) 249.50 cop[tikv] not(isnull(planner__core__casetest__index__index.t1.b)), not(isnull(planner__core__casetest__index__index.t1.d)) + │ └─IndexRangeScan 250.00 cop[tikv] table:t1, index:idx_a_b_c_d(a, b, c, d) range: decided by [eq(planner__core__casetest__index__index.t1.b, planner__core__casetest__index__index.t2.e) in(planner__core__casetest__index__index.t1.a, 1, 3) in(planner__core__casetest__index__index.t1.c, aaa, bbb)], keep order:false, stats:pseudo + └─Selection(Probe) 0.50 cop[tikv] in(planner__core__casetest__index__index.t1.c, "aaa", "bbb") + └─TableRowIDScan 249.50 cop[tikv] table:t1 keep order:false, stats:pseudo +show warnings; +Level Code Message +Warning 1105 Memory capacity of 2900 bytes for 'tidb_opt_range_max_size' exceeded when building ranges. Less accurate ranges such as full range are chosen +set @@tidb_opt_range_max_size = 2300; +explain format='brief' select /*+ inl_join(t1) */ * from t1 join t2 on t1.b = t2.e and t1.d = t2.g where t1.a in (1, 3) and t1.c in ('aaa', 'bbb'); +id estRows task access object operator info +IndexJoin 0.50 root inner join, inner:IndexLookUp, outer key:planner__core__casetest__index__index.t2.e, inner key:planner__core__casetest__index__index.t1.b, equal cond:eq(planner__core__casetest__index__index.t2.e, planner__core__casetest__index__index.t1.b), eq(planner__core__casetest__index__index.t2.g, planner__core__casetest__index__index.t1.d) +├─TableReader(Build) 9980.01 root data:Selection +│ └─Selection 9980.01 cop[tikv] not(isnull(planner__core__casetest__index__index.t2.e)), not(isnull(planner__core__casetest__index__index.t2.g)) +│ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo +└─IndexLookUp(Probe) 0.50 root + ├─Selection(Build) 249.50 cop[tikv] not(isnull(planner__core__casetest__index__index.t1.b)), not(isnull(planner__core__casetest__index__index.t1.d)) + │ └─IndexRangeScan 250.00 cop[tikv] table:t1, index:idx_a_b_c_d(a, b, c, d) range: decided by [eq(planner__core__casetest__index__index.t1.b, planner__core__casetest__index__index.t2.e) in(planner__core__casetest__index__index.t1.a, 1, 3)], keep order:false, stats:pseudo + └─Selection(Probe) 0.50 cop[tikv] in(planner__core__casetest__index__index.t1.c, "aaa", "bbb") + └─TableRowIDScan 249.50 cop[tikv] table:t1 keep order:false, stats:pseudo +show warnings; +Level Code Message +Warning 1105 Memory capacity of 2300 bytes for 'tidb_opt_range_max_size' exceeded when building ranges. Less accurate ranges such as full range are chosen +set @@tidb_opt_range_max_size = 700; +explain format='brief' select /*+ inl_join(t1) */ * from t1 join t2 on t1.b = t2.e and t1.d = t2.g where t1.a in (1, 3) and t1.c in ('aaa', 'bbb'); +id estRows task access object operator info +HashJoin 0.05 root inner join, equal:[eq(planner__core__casetest__index__index.t1.b, planner__core__casetest__index__index.t2.e) eq(planner__core__casetest__index__index.t1.d, planner__core__casetest__index__index.t2.g)] +├─IndexLookUp(Build) 0.04 root +│ ├─Selection(Build) 19.96 cop[tikv] not(isnull(planner__core__casetest__index__index.t1.b)), not(isnull(planner__core__casetest__index__index.t1.d)) +│ │ └─IndexRangeScan 20.00 cop[tikv] table:t1, index:idx_a_b_c_d(a, b, c, d) range:[1,1], [3,3], keep order:false, stats:pseudo +│ └─Selection(Probe) 0.04 cop[tikv] in(planner__core__casetest__index__index.t1.c, "aaa", "bbb") +│ └─TableRowIDScan 19.96 cop[tikv] table:t1 keep order:false, stats:pseudo +└─TableReader(Probe) 9980.01 root data:Selection + └─Selection 9980.01 cop[tikv] not(isnull(planner__core__casetest__index__index.t2.e)), not(isnull(planner__core__casetest__index__index.t2.g)) + └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo +show warnings; +Level Code Message +Warning 1105 Memory capacity of 700 bytes for 'tidb_opt_range_max_size' exceeded when building ranges. Less accurate ranges such as full range are chosen +Warning 1815 Optimizer Hint /*+ INL_JOIN(t1) */ or /*+ TIDB_INLJ(t1) */ is inapplicable +set @@tidb_opt_range_max_size = 0; +explain format='brief' select /*+ inl_join(t1) */ * from t1 join t2 on t1.a = t2.e where t1.b > 1 and t1.b < 10; +id estRows task access object operator info +IndexJoin 312.19 root inner join, inner:IndexLookUp, outer key:planner__core__casetest__index__index.t2.e, inner key:planner__core__casetest__index__index.t1.a, equal cond:eq(planner__core__casetest__index__index.t2.e, planner__core__casetest__index__index.t1.a) +├─TableReader(Build) 9990.00 root data:Selection +│ └─Selection 9990.00 cop[tikv] not(isnull(planner__core__casetest__index__index.t2.e)) +│ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo +└─IndexLookUp(Probe) 312.19 root + ├─Selection(Build) 312.19 cop[tikv] not(isnull(planner__core__casetest__index__index.t1.a)) + │ └─IndexRangeScan 312.50 cop[tikv] table:t1, index:idx_a_b_c_d(a, b, c, d) range: decided by [eq(planner__core__casetest__index__index.t1.a, planner__core__casetest__index__index.t2.e) gt(planner__core__casetest__index__index.t1.b, 1) lt(planner__core__casetest__index__index.t1.b, 10)], keep order:false, stats:pseudo + └─TableRowIDScan(Probe) 312.19 cop[tikv] table:t1 keep order:false, stats:pseudo +show warnings; +Level Code Message +set @@tidb_opt_range_max_size = 300; +explain format='brief' select /*+ inl_join(t1) */ * from t1 join t2 on t1.a = t2.e where t1.b > 1 and t1.b < 10; +id estRows task access object operator info +IndexJoin 312.19 root inner join, inner:IndexLookUp, outer key:planner__core__casetest__index__index.t2.e, inner key:planner__core__casetest__index__index.t1.a, equal cond:eq(planner__core__casetest__index__index.t2.e, planner__core__casetest__index__index.t1.a) +├─TableReader(Build) 9990.00 root data:Selection +│ └─Selection 9990.00 cop[tikv] not(isnull(planner__core__casetest__index__index.t2.e)) +│ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo +└─IndexLookUp(Probe) 312.19 root + ├─Selection(Build) 312.19 cop[tikv] gt(planner__core__casetest__index__index.t1.b, 1), lt(planner__core__casetest__index__index.t1.b, 10), not(isnull(planner__core__casetest__index__index.t1.a)) + │ └─IndexRangeScan 12500.00 cop[tikv] table:t1, index:idx_a_b_c_d(a, b, c, d) range: decided by [eq(planner__core__casetest__index__index.t1.a, planner__core__casetest__index__index.t2.e)], keep order:false, stats:pseudo + └─TableRowIDScan(Probe) 312.19 cop[tikv] table:t1 keep order:false, stats:pseudo +show warnings; +Level Code Message +Warning 1105 Memory capacity of 300 bytes for 'tidb_opt_range_max_size' exceeded when building ranges. Less accurate ranges such as full range are chosen +set @@tidb_opt_range_max_size = 0; +explain format='brief' select /*+ inl_join(t1) */ * from t1 join t2 on t1.a = t2.e where t1.b > t2.f and t1.b < t2.f + 10; +id estRows task access object operator info +IndexJoin 12475.01 root inner join, inner:IndexLookUp, outer key:planner__core__casetest__index__index.t2.e, inner key:planner__core__casetest__index__index.t1.a, equal cond:eq(planner__core__casetest__index__index.t2.e, planner__core__casetest__index__index.t1.a), other cond:gt(planner__core__casetest__index__index.t1.b, planner__core__casetest__index__index.t2.f), lt(planner__core__casetest__index__index.t1.b, plus(planner__core__casetest__index__index.t2.f, 10)) +├─TableReader(Build) 9980.01 root data:Selection +│ └─Selection 9980.01 cop[tikv] not(isnull(planner__core__casetest__index__index.t2.e)), not(isnull(planner__core__casetest__index__index.t2.f)) +│ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo +└─IndexLookUp(Probe) 12475.01 root + ├─Selection(Build) 12475.01 cop[tikv] not(isnull(planner__core__casetest__index__index.t1.a)), not(isnull(planner__core__casetest__index__index.t1.b)) + │ └─IndexRangeScan 12500.00 cop[tikv] table:t1, index:idx_a_b_c_d(a, b, c, d) range: decided by [eq(planner__core__casetest__index__index.t1.a, planner__core__casetest__index__index.t2.e) lt(planner__core__casetest__index__index.t1.b, plus(planner__core__casetest__index__index.t2.f, 10)) gt(planner__core__casetest__index__index.t1.b, planner__core__casetest__index__index.t2.f)], keep order:false, stats:pseudo + └─TableRowIDScan(Probe) 12475.01 cop[tikv] table:t1 keep order:false, stats:pseudo +show warnings; +Level Code Message +set @@tidb_opt_range_max_size = 300; +explain format='brief' select /*+ inl_join(t1) */ * from t1 join t2 on t1.a = t2.e where t1.b > t2.f and t1.b < t2.f + 10; +id estRows task access object operator info +IndexJoin 12475.01 root inner join, inner:IndexLookUp, outer key:planner__core__casetest__index__index.t2.e, inner key:planner__core__casetest__index__index.t1.a, equal cond:eq(planner__core__casetest__index__index.t2.e, planner__core__casetest__index__index.t1.a), other cond:gt(planner__core__casetest__index__index.t1.b, planner__core__casetest__index__index.t2.f), lt(planner__core__casetest__index__index.t1.b, plus(planner__core__casetest__index__index.t2.f, 10)) +├─TableReader(Build) 9980.01 root data:Selection +│ └─Selection 9980.01 cop[tikv] not(isnull(planner__core__casetest__index__index.t2.e)), not(isnull(planner__core__casetest__index__index.t2.f)) +│ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo +└─IndexLookUp(Probe) 12475.01 root + ├─Selection(Build) 12475.01 cop[tikv] not(isnull(planner__core__casetest__index__index.t1.a)), not(isnull(planner__core__casetest__index__index.t1.b)) + │ └─IndexRangeScan 12500.00 cop[tikv] table:t1, index:idx_a_b_c_d(a, b, c, d) range: decided by [eq(planner__core__casetest__index__index.t1.a, planner__core__casetest__index__index.t2.e)], keep order:false, stats:pseudo + └─TableRowIDScan(Probe) 12475.01 cop[tikv] table:t1 keep order:false, stats:pseudo +show warnings; +Level Code Message +Warning 1105 Memory capacity of 300 bytes for 'tidb_opt_range_max_size' exceeded when building ranges. Less accurate ranges such as full range are chosen +set @@tidb_opt_range_max_size = default; +set tidb_cost_model_version=2; +drop table if exists t1, t2, t3, t4; +create table t1(a int, b int, c int, d int, e int, f int, g int, primary key (a), unique key c_d_e (c, d, e), unique key f (f), unique key f_g (f, g), key g (g)); +create table t2(a int, b int, c int, d int, unique index idx_a (a), unique index idx_b_c (b, c), unique index idx_b_c_a_d (b, c, a, d)); +create table t3(a bigint, b varchar(255), c bigint, primary key(a, b) clustered); +create table t4(a bigint, b varchar(255), c bigint, primary key(a, b) nonclustered); +set @@tidb_enable_chunk_rpc = on; +explain format = 'verbose' select * from t1 where a = 3 or a = 5; +id estRows estCost task access object operator info +Batch_Point_Get_5 2.00 887.04 root table:t1 handle:[3 5], keep order:false, desc:false +show warnings; +Level Code Message +Note 1105 handle of t1 is selected since the path only has point ranges +explain format = 'verbose' select f, g from t1 where f = 2 and g in (3, 4, 5); +id estRows estCost task access object operator info +Batch_Point_Get_5 3.00 380.16 root table:t1, index:f_g(f, g) keep order:false, desc:false +show warnings; +Level Code Message +Note 1105 unique index f_g of t1 is selected since the path only has point ranges with single scan +explain format = 'verbose' select * from t1 where c = 1 and (d = 2 or d = 3) and e in (4, 5); +id estRows estCost task access object operator info +Batch_Point_Get_5 4.00 1774.08 root table:t1, index:c_d_e(c, d, e) keep order:false, desc:false +show warnings; +Level Code Message +Note 1105 unique index c_d_e of t1 is selected since the path only has point ranges with double scan +explain format = 'verbose' select f, g from t1 where f = 2 and g > 3; +id estRows estCost task access object operator info +IndexReader_6 33.33 733.82 root index:IndexRangeScan_5 +└─IndexRangeScan_5 33.33 6783.33 cop[tikv] table:t1, index:f_g(f, g) range:(2 3,2 +inf], keep order:false, stats:pseudo +show warnings; +Level Code Message +Note 1105 unique index f_g of t1 is selected since the path only fetches limited number of rows with single scan +explain format = 'verbose' select a, b, c from t2 where a = 1 and b = 2 and c in (1, 2, 3, 4, 5); +id estRows estCost task access object operator info +Selection_6 0.01 289.88 root eq(planner__core__casetest__index__index.t2.b, 2), in(planner__core__casetest__index__index.t2.c, 1, 2, 3, 4, 5) +└─Point_Get_5 1.00 190.08 root table:t2, index:idx_a(a) +show warnings; +Level Code Message +Note 1105 unique index idx_a of t2 is selected since the path only has point ranges with double scan +explain format = 'verbose' select * from t3 where (a = 1 or a = 3) and b = 'xx'; +id estRows estCost task access object operator info +Batch_Point_Get_5 2.00 1449.36 root table:t3, clustered index:PRIMARY(a, b) keep order:false, desc:false +show warnings; +Level Code Message +Note 1105 handle of t3 is selected since the path only has point ranges +explain format = 'verbose' select * from t4 where (a = 1 or a = 3) and b = 'xx'; +id estRows estCost task access object operator info +Batch_Point_Get_5 2.00 1449.36 root table:t4, index:PRIMARY(a, b) keep order:false, desc:false +show warnings; +Level Code Message +Note 1105 unique index PRIMARY of t4 is selected since the path only has point ranges with double scan +explain format = 'verbose' select a, b from t3 where (a = 1 or a = 3) and b = 'xx'; +id estRows estCost task access object operator info +Batch_Point_Get_5 2.00 1322.64 root table:t3, clustered index:PRIMARY(a, b) keep order:false, desc:false +show warnings; +Level Code Message +Note 1105 handle of t3 is selected since the path only has point ranges +explain format = 'verbose' select a, b from t4 where (a = 1 or a = 3) and b = 'xx'; +id estRows estCost task access object operator info +Batch_Point_Get_5 2.00 1322.64 root table:t4, index:PRIMARY(a, b) keep order:false, desc:false +show warnings; +Level Code Message +Note 1105 unique index PRIMARY of t4 is selected since the path only has point ranges with single scan +explain format = 'verbose' update t1 set b = 2 where a = 4 or a = 6; +id estRows estCost task access object operator info +Update_4 N/A N/A root N/A +└─Batch_Point_Get_6 2.00 887.04 root table:t1 handle:[4 6], keep order:false, desc:false +show warnings; +Level Code Message +Note 1105 handle of t1 is selected since the path only has point ranges +explain format = 'verbose' delete from t1 where f = 2 and g in (3, 4); +id estRows estCost task access object operator info +Delete_4 N/A N/A root N/A +└─Selection_7 2.00 493.42 root in(planner__core__casetest__index__index.t1.g, 3, 4) + └─Point_Get_6 1.00 443.52 root table:t1, index:f(f) +show warnings; +Level Code Message +Note 1105 unique index f of t1 is selected since the path only has point ranges with double scan +explain format = 'verbose' insert into t3 select a, b, c from t1 where f = 2; +id estRows estCost task access object operator info +Insert_1 N/A N/A root N/A +└─Projection_6 1.00 253.74 root planner__core__casetest__index__index.t1.a, planner__core__casetest__index__index.t1.b, planner__core__casetest__index__index.t1.c + └─Point_Get_7 1.00 253.44 root table:t1, index:f(f) +show warnings; +Level Code Message +Note 1105 unique index f of t1 is selected since the path only has point ranges with double scan +explain format = 'verbose' replace into t3 select a, b, c from t1 where a = 3; +id estRows estCost task access object operator info +Insert_1 N/A N/A root N/A +└─Point_Get_7 1.00 190.08 root table:t1 handle:3 +show warnings; +Level Code Message +Note 1105 handle of t1 is selected since the path only has point ranges +set @@tidb_enable_chunk_rpc = default; +set tidb_cost_model_version=default; +set tidb_cost_model_version=2; +drop table if exists t; +create table t(a int, b int, c int, d int, index idx(a,b,c)); +desc format = 'brief' select * from t where a = 1 and b > 2 and b < 10 and d = 10 order by b,c limit 10; +id estRows task access object operator info +Limit 0.00 root offset:0, count:10 +└─Projection 0.00 root planner__core__casetest__index__index.t.a, planner__core__casetest__index__index.t.b, planner__core__casetest__index__index.t.c, planner__core__casetest__index__index.t.d + └─IndexLookUp 0.00 root + ├─IndexRangeScan(Build) 2.50 cop[tikv] table:t, index:idx(a, b, c) range:(1 2,1 10), keep order:true, stats:pseudo + └─Selection(Probe) 0.00 cop[tikv] eq(planner__core__casetest__index__index.t.d, 10) + └─TableRowIDScan 2.50 cop[tikv] table:t keep order:false, stats:pseudo +desc format = 'brief' select * from t where a = 1 and b > 2 and b < 10 and d = 10 order by b desc, c desc limit 10; +id estRows task access object operator info +Limit 0.00 root offset:0, count:10 +└─Projection 0.00 root planner__core__casetest__index__index.t.a, planner__core__casetest__index__index.t.b, planner__core__casetest__index__index.t.c, planner__core__casetest__index__index.t.d + └─IndexLookUp 0.00 root + ├─IndexRangeScan(Build) 2.50 cop[tikv] table:t, index:idx(a, b, c) range:(1 2,1 10), keep order:true, desc, stats:pseudo + └─Selection(Probe) 0.00 cop[tikv] eq(planner__core__casetest__index__index.t.d, 10) + └─TableRowIDScan 2.50 cop[tikv] table:t keep order:false, stats:pseudo +set tidb_cost_model_version=default; +set tidb_enable_clustered_index=on; +drop table if exists t1; +create table t1 (a int, b varchar(20), c decimal(40,10), d int, primary key(a,b), key(c)); +insert into t1 values (1,"111",1.1,11), (2,"222",2.2,12), (3,"333",3.3,13); +analyze table t1; +explain format='brief' select * from t1; +id estRows task access object operator info +TableReader 3.00 root data:TableFullScan +└─TableFullScan 3.00 cop[tikv] table:t1 keep order:false +select * from t1; +a b c d +1 111 1.1000000000 11 +2 222 2.2000000000 12 +3 333 3.3000000000 13 +explain format='brief' select * from t1 where t1.a >= 1 and t1.a < 4; +id estRows task access object operator info +TableReader 3.00 root data:TableRangeScan +└─TableRangeScan 3.00 cop[tikv] table:t1 range:[1,4), keep order:false +select * from t1 where t1.a >= 1 and t1.a < 4; +a b c d +1 111 1.1000000000 11 +2 222 2.2000000000 12 +3 333 3.3000000000 13 +explain format='brief' select * from t1 where t1.a = 1 and t1.b < "333"; +id estRows task access object operator info +TableReader 0.82 root data:TableRangeScan +└─TableRangeScan 0.82 cop[tikv] table:t1 range:[1 -inf,1 "333"), keep order:false +select * from t1 where t1.a = 1 and t1.b < "333"; +a b c d +1 111 1.1000000000 11 +explain format='brief' select t1.a, t1.b, t1.c from t1 where t1.c = 3.3; +id estRows task access object operator info +IndexReader 1.00 root index:IndexRangeScan +└─IndexRangeScan 1.00 cop[tikv] table:t1, index:c(c) range:[3.3000000000,3.3000000000], keep order:false +select t1.a, t1.b, t1.c from t1 where t1.c = 3.3; +a b c +3 333 3.3000000000 +explain format='brief' select t1.b, t1.c from t1 where t1.c = 2.2; +id estRows task access object operator info +IndexReader 1.00 root index:IndexRangeScan +└─IndexRangeScan 1.00 cop[tikv] table:t1, index:c(c) range:[2.2000000000,2.2000000000], keep order:false +select t1.b, t1.c from t1 where t1.c = 2.2; +b c +222 2.2000000000 +explain format='brief' select /*+ use_index(t1, c) */ * from t1; +id estRows task access object operator info +IndexLookUp 3.00 root +├─IndexFullScan(Build) 3.00 cop[tikv] table:t1, index:c(c) keep order:false +└─TableRowIDScan(Probe) 3.00 cop[tikv] table:t1 keep order:false +select /*+ use_index(t1, c) */ * from t1; +a b c d +1 111 1.1000000000 11 +2 222 2.2000000000 12 +3 333 3.3000000000 13 +explain format='brief' select * from t1 use index(c) where t1.c in (2.2, 3.3); +id estRows task access object operator info +IndexLookUp 2.00 root +├─IndexRangeScan(Build) 2.00 cop[tikv] table:t1, index:c(c) range:[2.2000000000,2.2000000000], [3.3000000000,3.3000000000], keep order:false +└─TableRowIDScan(Probe) 2.00 cop[tikv] table:t1 keep order:false +select * from t1 use index(c) where t1.c in (2.2, 3.3); +a b c d +2 222 2.2000000000 12 +3 333 3.3000000000 13 +explain format='brief' select * from t1 where t1.a = 1 order by b; +id estRows task access object operator info +TableReader 1.00 root data:TableRangeScan +└─TableRangeScan 1.00 cop[tikv] table:t1 range:[1,1], keep order:true +select * from t1 where t1.a = 1 order by b; +a b c d +1 111 1.1000000000 11 +explain format='brief' select * from t1 order by a, b limit 1; +id estRows task access object operator info +Limit 1.00 root offset:0, count:1 +└─TableReader 1.00 root data:Limit + └─Limit 1.00 cop[tikv] offset:0, count:1 + └─TableFullScan 1.00 cop[tikv] table:t1 keep order:true +select * from t1 order by a, b limit 1; +a b c d +1 111 1.1000000000 11 +explain format='brief' select /*+ use_index_merge(t1 primary, c) */ * from t1 where t1.a >= 1 or t1.c = 2.2; +id estRows task access object operator info +IndexMerge 3.00 root type: union +├─TableRangeScan(Build) 3.00 cop[tikv] table:t1 range:[1,+inf], keep order:false +├─IndexRangeScan(Build) 1.00 cop[tikv] table:t1, index:c(c) range:[2.2000000000,2.2000000000], keep order:false +└─TableRowIDScan(Probe) 3.00 cop[tikv] table:t1 keep order:false +select /*+ use_index_merge(t1 primary, c) */ * from t1 where t1.a >= 1 or t1.c = 2.2; +a b c d +1 111 1.1000000000 11 +2 222 2.2000000000 12 +3 333 3.3000000000 13 +explain format='brief' select /*+ use_index_merge(t1 primary, c) */ * from t1 where t1.a = 1 and t1.b = '111' or t1.c = 3.3; +id estRows task access object operator info +IndexMerge 1.67 root type: union +├─TableRangeScan(Build) 1.00 cop[tikv] table:t1 range:[1 "111",1 "111"], keep order:false +├─IndexRangeScan(Build) 1.00 cop[tikv] table:t1, index:c(c) range:[3.3000000000,3.3000000000], keep order:false +└─TableRowIDScan(Probe) 1.67 cop[tikv] table:t1 keep order:false +select /*+ use_index_merge(t1 primary, c) */ * from t1 where t1.a = 1 and t1.b = '111' or t1.c = 3.3; +a b c d +1 111 1.1000000000 11 +3 333 3.3000000000 13 +set tidb_enable_clustered_index=default; +drop table if exists t; +create table t(pk varbinary(255) NOT NULL, domains json null, image_signatures json null, canonical_links json null, fpi json null, KEY `domains` ((cast(`domains` as char(253) array))), KEY `image_signatures` ((cast(`image_signatures` as char(32) array))),KEY `canonical_links` ((cast(`canonical_links` as char(1000) array))), KEY `fpi` ((cast(`fpi` as unsigned array)))); +explain format='brief' SELECT pk FROM t WHERE "B2c32" member of (domains) OR "2eoqyp6399" member of (image_signatures) OR "E33EAdAc2Bee.com/s/link" member of (canonical_links) OR json_contains(fpi, '[69236881]') LIMIT 10; +id estRows task access object operator info +Projection 10.00 root planner__core__casetest__index__index.t.pk +└─IndexMerge 10.00 root type: union, limit embedded(offset:0, count:10) + ├─Limit(Build) 2.50 cop[tikv] offset:0, count:10 + │ └─IndexRangeScan 2.50 cop[tikv] table:t, index:domains(cast(`domains` as char(253) array)) range:["B2c32","B2c32"], keep order:false, stats:pseudo + ├─Limit(Build) 2.50 cop[tikv] offset:0, count:10 + │ └─IndexRangeScan 2.50 cop[tikv] table:t, index:image_signatures(cast(`image_signatures` as char(32) array)) range:["2eoqyp6399","2eoqyp6399"], keep order:false, stats:pseudo + ├─Limit(Build) 2.50 cop[tikv] offset:0, count:10 + │ └─IndexRangeScan 2.50 cop[tikv] table:t, index:canonical_links(cast(`canonical_links` as char(1000) array)) range:["E33EAdAc2Bee.com/s/link","E33EAdAc2Bee.com/s/link"], keep order:false, stats:pseudo + ├─Limit(Build) 2.50 cop[tikv] offset:0, count:10 + │ └─IndexRangeScan 2.50 cop[tikv] table:t, index:fpi(cast(`fpi` as unsigned array)) range:[69236881,69236881], keep order:false, stats:pseudo + └─TableRowIDScan(Probe) 10.00 cop[tikv] table:t keep order:false, stats:pseudo +drop table if exists t1, t2; +CREATE TABLE `t1` (`a` varchar(488) COLLATE utf8_general_ci DEFAULT NULL, `b` binary(206) DEFAULT '0', `c` json DEFAULT NULL, UNIQUE KEY `idx_29` (`a`,(cast(`c` as signed array)),`b`), UNIQUE KEY `idx_30` ((cast(`c` as signed array)),`a`(5))) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `t2` (`a` float NOT NULL DEFAULT '5217.6055',`b` json NOT NULL,`c` json NOT NULL,`d` varchar(181) COLLATE gbk_bin NOT NULL DEFAULT 'FbVkA~^', KEY `idx_26` (`a`),PRIMARY KEY (`a`,`d`) /*T![clustered_index] NONCLUSTERED */,UNIQUE KEY `idx_28` (`a`,(cast(`b` as binary(64) array)),`d`)) ENGINE=InnoDB DEFAULT CHARSET=gbk COLLATE=gbk_bin; +EXPLAIN format='brief' SELECT /*+ inl_join(t1)*/ `t2`.`c` AS `r0` FROM `t1` JOIN `t2` ON `t1`.`a`=`t2`.`d` WHERE `t2`.`d`='' AND NOT (6252179388429456273 MEMBER OF (`t1`.`c`)); +id estRows task access object operator info +HashJoin 12.50 root inner join, equal:[eq(planner__core__casetest__index__index.t2.d, planner__core__casetest__index__index.t1.a)] +├─TableReader(Build) 10.00 root data:Selection +│ └─Selection 10.00 cop[tikv] eq(planner__core__casetest__index__index.t2.d, "") +│ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo +└─TableReader(Probe) 7992.00 root data:Selection + └─Selection 7992.00 cop[tikv] not(isnull(planner__core__casetest__index__index.t1.a)), not(istrue_with_null(json_memberof(cast(6252179388429456273, json BINARY), planner__core__casetest__index__index.t1.c))) + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +SHOW WARNINGS +Level Code Message +Warning 1815 Optimizer Hint /*+ INL_JOIN(t1) */ or /*+ TIDB_INLJ(t1) */ is inapplicable +DROP table if exists t; +CREATE TABLE `t` (`pk` varbinary(255) NOT NULL,`nslc` json DEFAULT NULL,`fpi` json DEFAULT NULL,`point_of_sale_country` varchar(2) DEFAULT NULL,PRIMARY KEY (`pk`) /*T![clustered_index] CLUSTERED */,KEY `fpi` ((cast(`fpi` as unsigned array))),KEY `nslc` ((cast(`nslc` as char(1000) array)),`point_of_sale_country`),KEY `nslc_old` ((cast(`nslc` as char(1000) array)))); +EXPLAIN format='brief' SELECT /*+ use_index_merge(t, fpi, nslc_old, nslc) */ * FROM t WHERE 15975127 member of (fpi) AND "OC8p0106XTkt.org/s/link" member of (nslc) LIMIT 10; +id estRows task access object operator info +IndexMerge 0.01 root type: intersection, limit embedded(offset:0, count:10) +├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:fpi(cast(`fpi` as unsigned array)) range:[15975127,15975127], keep order:false, stats:pseudo +├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:nslc(cast(`nslc` as char(1000) array), point_of_sale_country) range:["OC8p0106XTkt.org/s/link","OC8p0106XTkt.org/s/link"], keep order:false, stats:pseudo +└─TableRowIDScan(Probe) 0.01 cop[tikv] table:t keep order:false, stats:pseudo diff --git a/tests/integrationtest/r/planner/core/casetest/integration.result b/tests/integrationtest/r/planner/core/casetest/integration.result index 7f6d88be5f824..dac5cb5414831 100644 --- a/tests/integrationtest/r/planner/core/casetest/integration.result +++ b/tests/integrationtest/r/planner/core/casetest/integration.result @@ -1420,23 +1420,27 @@ create table t1 (a int, b int); create table t2_part (a int, b int, key(a)) partition by hash(a) partitions 4; explain select /*+ TIDB_INLJ(t2_part@sel_2) */ * from t1 where t1.b<10 and not exists (select 1 from t2_part where t1.a=t2_part.a and t2_part.b<20); id estRows task access object operator info -HashJoin_15 2658.67 root anti semi join, equal:[eq(planner__core__casetest__integration.t1.a, planner__core__casetest__integration.t2_part.a)] -├─PartitionUnion_19(Build) 13293.33 root -│ ├─TableReader_22 3323.33 root data:Selection_21 -│ │ └─Selection_21 3323.33 cop[tikv] lt(planner__core__casetest__integration.t2_part.b, 20) -│ │ └─TableFullScan_20 10000.00 cop[tikv] table:t2_part, partition:p0 keep order:false, stats:pseudo -│ ├─TableReader_25 3323.33 root data:Selection_24 -│ │ └─Selection_24 3323.33 cop[tikv] lt(planner__core__casetest__integration.t2_part.b, 20) -│ │ └─TableFullScan_23 10000.00 cop[tikv] table:t2_part, partition:p1 keep order:false, stats:pseudo -│ ├─TableReader_28 3323.33 root data:Selection_27 -│ │ └─Selection_27 3323.33 cop[tikv] lt(planner__core__casetest__integration.t2_part.b, 20) -│ │ └─TableFullScan_26 10000.00 cop[tikv] table:t2_part, partition:p2 keep order:false, stats:pseudo -│ └─TableReader_31 3323.33 root data:Selection_30 -│ └─Selection_30 3323.33 cop[tikv] lt(planner__core__casetest__integration.t2_part.b, 20) -│ └─TableFullScan_29 10000.00 cop[tikv] table:t2_part, partition:p3 keep order:false, stats:pseudo -└─TableReader_18(Probe) 3323.33 root data:Selection_17 - └─Selection_17 3323.33 cop[tikv] lt(planner__core__casetest__integration.t1.b, 10) - └─TableFullScan_16 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +HashJoin_19 2658.67 root anti semi join, equal:[eq(planner__core__casetest__integration.t1.a, planner__core__casetest__integration.t2_part.a)] +├─PartitionUnion_23(Build) 13293.33 root +│ ├─Projection_24 3323.33 root planner__core__casetest__integration.t2_part.a +│ │ └─TableReader_27 3323.33 root data:Selection_26 +│ │ └─Selection_26 3323.33 cop[tikv] lt(planner__core__casetest__integration.t2_part.b, 20) +│ │ └─TableFullScan_25 10000.00 cop[tikv] table:t2_part, partition:p0 keep order:false, stats:pseudo +│ ├─Projection_28 3323.33 root planner__core__casetest__integration.t2_part.a +│ │ └─TableReader_31 3323.33 root data:Selection_30 +│ │ └─Selection_30 3323.33 cop[tikv] lt(planner__core__casetest__integration.t2_part.b, 20) +│ │ └─TableFullScan_29 10000.00 cop[tikv] table:t2_part, partition:p1 keep order:false, stats:pseudo +│ ├─Projection_32 3323.33 root planner__core__casetest__integration.t2_part.a +│ │ └─TableReader_35 3323.33 root data:Selection_34 +│ │ └─Selection_34 3323.33 cop[tikv] lt(planner__core__casetest__integration.t2_part.b, 20) +│ │ └─TableFullScan_33 10000.00 cop[tikv] table:t2_part, partition:p2 keep order:false, stats:pseudo +│ └─Projection_36 3323.33 root planner__core__casetest__integration.t2_part.a +│ └─TableReader_39 3323.33 root data:Selection_38 +│ └─Selection_38 3323.33 cop[tikv] lt(planner__core__casetest__integration.t2_part.b, 20) +│ └─TableFullScan_37 10000.00 cop[tikv] table:t2_part, partition:p3 keep order:false, stats:pseudo +└─TableReader_22(Probe) 3323.33 root data:Selection_21 + └─Selection_21 3323.33 cop[tikv] lt(planner__core__casetest__integration.t1.b, 10) + └─TableFullScan_20 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo Level Code Message Warning 1105 disable dynamic pruning due to t2_part has no global stats Warning 1815 Optimizer Hint /*+ INL_JOIN(t2_part) */ or /*+ TIDB_INLJ(t2_part) */ is inapplicable @@ -1451,3 +1455,232 @@ IndexJoin_13 2658.67 root anti semi join, inner:IndexLookUp_12, outer key:plann ├─IndexRangeScan_9(Build) 12500.00 cop[tikv] table:t2_part, index:a(a) range: decided by [eq(planner__core__casetest__integration.t2_part.a, planner__core__casetest__integration.t1.a)], keep order:false, stats:pseudo └─Selection_11(Probe) 4154.17 cop[tikv] lt(planner__core__casetest__integration.t2_part.b, 20) └─TableRowIDScan_10 12500.00 cop[tikv] table:t2_part keep order:false, stats:pseudo +drop table if exists t; +create table t(a int(11) not null, b int) partition by range (a) (partition p0 values less than (4), partition p1 values less than(10), partition p2 values less than maxvalue); +insert into t values (1, 1),(10, 10),(11, 11); +set tidb_opt_fix_control='44262:ON'; +explain format = 'brief' select * from t where a in (1, 2,'11'); +id estRows task access object operator info +TableReader 30.00 root partition:p0,p2 data:Selection +└─Selection 30.00 cop[tikv] in(planner__core__casetest__integration.t.a, 1, 2, 11) + └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo +explain format = 'brief' select * from t where a in (17, null); +id estRows task access object operator info +TableReader 10.00 root partition:p0,p2 data:Selection +└─Selection 10.00 cop[tikv] in(planner__core__casetest__integration.t.a, 17, NULL) + └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo +explain format = 'brief' select * from t where a in (16, 'abc'); +id estRows task access object operator info +TableReader 20.00 root partition:p0,p2 data:Selection +└─Selection 20.00 cop[tikv] in(planner__core__casetest__integration.t.a, 16, 0) + └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo +explain format = 'brief' select * from t where a in (15, 0.12, 3.47); +id estRows task access object operator info +TableReader 10.00 root partition:p2 data:Selection +└─Selection 10.00 cop[tikv] or(eq(planner__core__casetest__integration.t.a, 15), 0) + └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo +explain format = 'brief' select * from t where a in (0.12, 3.47); +id estRows task access object operator info +TableDual 0.00 root rows:0 +explain format = 'brief' select * from t where a in (14, floor(3.47)); +id estRows task access object operator info +TableReader 20.00 root partition:p0,p2 data:Selection +└─Selection 20.00 cop[tikv] in(planner__core__casetest__integration.t.a, 14, 3) + └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo +explain format = 'brief' select * from t where b in (3, 4); +id estRows task access object operator info +TableReader 20.00 root partition:all data:Selection +└─Selection 20.00 cop[tikv] in(planner__core__casetest__integration.t.b, 3, 4) + └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo +set tidb_opt_fix_control=default; +drop table if exists pt; +create table pt (id int, c int, key i_id(id), key i_c(c)) partition by range (c) ( +partition p0 values less than (4), +partition p1 values less than (7), +partition p2 values less than (10)); +set @@tidb_enable_index_merge = 1; +set tidb_opt_fix_control='44262:ON'; +## Table reader +explain format='brief' select * from pt where c > 10; +id estRows task access object operator info +TableReader 3333.33 root partition:dual data:Selection +└─Selection 3333.33 cop[tikv] gt(planner__core__casetest__integration.pt.c, 10) + └─TableFullScan 10000.00 cop[tikv] table:pt keep order:false, stats:pseudo +explain format='brief' select * from pt where c > 8; +id estRows task access object operator info +TableReader 3333.33 root partition:p2 data:Selection +└─Selection 3333.33 cop[tikv] gt(planner__core__casetest__integration.pt.c, 8) + └─TableFullScan 10000.00 cop[tikv] table:pt keep order:false, stats:pseudo +explain format='brief' select * from pt where c < 2 or c >= 9; +id estRows task access object operator info +TableReader 6656.67 root partition:p0,p2 data:Selection +└─Selection 6656.67 cop[tikv] or(lt(planner__core__casetest__integration.pt.c, 2), ge(planner__core__casetest__integration.pt.c, 9)) + └─TableFullScan 10000.00 cop[tikv] table:pt keep order:false, stats:pseudo +## Index reader +explain format='brief' select c from pt; +id estRows task access object operator info +IndexReader 10000.00 root partition:all index:IndexFullScan +└─IndexFullScan 10000.00 cop[tikv] table:pt, index:i_c(c) keep order:false, stats:pseudo +explain format='brief' select c from pt where c > 10; +id estRows task access object operator info +IndexReader 3333.33 root partition:dual index:IndexRangeScan +└─IndexRangeScan 3333.33 cop[tikv] table:pt, index:i_c(c) range:(10,+inf], keep order:false, stats:pseudo +explain format='brief' select c from pt where c > 8; +id estRows task access object operator info +IndexReader 3333.33 root partition:p2 index:IndexRangeScan +└─IndexRangeScan 3333.33 cop[tikv] table:pt, index:i_c(c) range:(8,+inf], keep order:false, stats:pseudo +explain format='brief' select c from pt where c < 2 or c >= 9; +id estRows task access object operator info +IndexReader 6656.67 root partition:p0,p2 index:IndexRangeScan +└─IndexRangeScan 6656.67 cop[tikv] table:pt, index:i_c(c) range:[-inf,2), [9,+inf], keep order:false, stats:pseudo +## Index Lookup +explain format='brief' select /*+ use_index(pt, i_id) */ * from pt; +id estRows task access object operator info +IndexLookUp 10000.00 root partition:all +├─IndexFullScan(Build) 10000.00 cop[tikv] table:pt, index:i_id(id) keep order:false, stats:pseudo +└─TableRowIDScan(Probe) 10000.00 cop[tikv] table:pt keep order:false, stats:pseudo +explain format='brief' select /*+ use_index(pt, i_id) */ * from pt where id < 4 and c > 10; +id estRows task access object operator info +IndexLookUp 1107.78 root partition:dual +├─IndexRangeScan(Build) 3323.33 cop[tikv] table:pt, index:i_id(id) range:[-inf,4), keep order:false, stats:pseudo +└─Selection(Probe) 1107.78 cop[tikv] gt(planner__core__casetest__integration.pt.c, 10) + └─TableRowIDScan 3323.33 cop[tikv] table:pt keep order:false, stats:pseudo +explain format='brief' select /*+ use_index(pt, i_id) */ * from pt where id < 10 and c > 8; +id estRows task access object operator info +IndexLookUp 1107.78 root partition:p2 +├─IndexRangeScan(Build) 3323.33 cop[tikv] table:pt, index:i_id(id) range:[-inf,10), keep order:false, stats:pseudo +└─Selection(Probe) 1107.78 cop[tikv] gt(planner__core__casetest__integration.pt.c, 8) + └─TableRowIDScan 3323.33 cop[tikv] table:pt keep order:false, stats:pseudo +explain format='brief' select /*+ use_index(pt, i_id) */ * from pt where id < 10 and c < 2 or c >= 9; +id estRows task access object operator info +IndexLookUp 5325.33 root partition:p0,p2 +├─IndexFullScan(Build) 10000.00 cop[tikv] table:pt, index:i_id(id) keep order:false, stats:pseudo +└─Selection(Probe) 5325.33 cop[tikv] or(and(lt(planner__core__casetest__integration.pt.id, 10), lt(planner__core__casetest__integration.pt.c, 2)), ge(planner__core__casetest__integration.pt.c, 9)) + └─TableRowIDScan 10000.00 cop[tikv] table:pt keep order:false, stats:pseudo +## Partition selection +explain format='brief' select * from pt partition (p0) where c > 8; +id estRows task access object operator info +TableReader 3333.33 root partition:dual data:Selection +└─Selection 3333.33 cop[tikv] gt(planner__core__casetest__integration.pt.c, 8) + └─TableFullScan 10000.00 cop[tikv] table:pt keep order:false, stats:pseudo +explain format='brief' select c from pt partition (p0, p2) where c > 8; +id estRows task access object operator info +IndexReader 3333.33 root partition:p2 index:IndexRangeScan +└─IndexRangeScan 3333.33 cop[tikv] table:pt, index:i_c(c) range:(8,+inf], keep order:false, stats:pseudo +explain format='brief' select /*+ use_index(pt, i_id) */ * from pt partition (p1, p2) where c < 3 and id = 5; +id estRows task access object operator info +IndexLookUp 3.32 root partition:dual +├─IndexRangeScan(Build) 10.00 cop[tikv] table:pt, index:i_id(id) range:[5,5], keep order:false, stats:pseudo +└─Selection(Probe) 3.32 cop[tikv] lt(planner__core__casetest__integration.pt.c, 3) + └─TableRowIDScan 10.00 cop[tikv] table:pt keep order:false, stats:pseudo +## Index Merge +explain format='brief' select * from pt where id = 4 or c < 7; +id estRows task access object operator info +IndexMerge 3330.01 root partition:all type: union +├─IndexRangeScan(Build) 10.00 cop[tikv] table:pt, index:i_id(id) range:[4,4], keep order:false, stats:pseudo +├─IndexRangeScan(Build) 3323.33 cop[tikv] table:pt, index:i_c(c) range:[-inf,7), keep order:false, stats:pseudo +└─TableRowIDScan(Probe) 3330.01 cop[tikv] table:pt keep order:false, stats:pseudo +explain format='brief' select * from pt where id > 4 or c = 7; +id estRows task access object operator info +IndexMerge 3340.00 root partition:all type: union +├─IndexRangeScan(Build) 3333.33 cop[tikv] table:pt, index:i_id(id) range:(4,+inf], keep order:false, stats:pseudo +├─IndexRangeScan(Build) 10.00 cop[tikv] table:pt, index:i_c(c) range:[7,7], keep order:false, stats:pseudo +└─TableRowIDScan(Probe) 3340.00 cop[tikv] table:pt keep order:false, stats:pseudo +set tidb_opt_fix_control=default; +set @@tidb_enable_index_merge = default; +drop table if exists github_events; +CREATE TABLE `github_events` ( +`id` bigint(20) NOT NULL DEFAULT '0', +`type` varchar(29) NOT NULL DEFAULT 'Event', +`created_at` datetime NOT NULL DEFAULT '1970-01-01 00:00:00', +`repo_id` bigint(20) NOT NULL DEFAULT '0', +`repo_name` varchar(140) NOT NULL DEFAULT '', +`actor_id` bigint(20) NOT NULL DEFAULT '0', +`actor_login` varchar(40) NOT NULL DEFAULT '', +`language` varchar(26) NOT NULL DEFAULT '', +`additions` bigint(20) NOT NULL DEFAULT '0', +`deletions` bigint(20) NOT NULL DEFAULT '0', +`action` varchar(11) NOT NULL DEFAULT '', +`number` int(11) NOT NULL DEFAULT '0', +`commit_id` varchar(40) NOT NULL DEFAULT '', +`comment_id` bigint(20) NOT NULL DEFAULT '0', +`org_login` varchar(40) NOT NULL DEFAULT '', +`org_id` bigint(20) NOT NULL DEFAULT '0', +`state` varchar(6) NOT NULL DEFAULT '', +`closed_at` datetime NOT NULL DEFAULT '1970-01-01 00:00:00', +`comments` int(11) NOT NULL DEFAULT '0', +`pr_merged_at` datetime NOT NULL DEFAULT '1970-01-01 00:00:00', +`pr_merged` tinyint(1) NOT NULL DEFAULT '0', +`pr_changed_files` int(11) NOT NULL DEFAULT '0', +`pr_review_comments` int(11) NOT NULL DEFAULT '0', +`pr_or_issue_id` bigint(20) NOT NULL DEFAULT '0', +`event_day` date NOT NULL, +`event_month` date NOT NULL, +`event_year` int(11) NOT NULL, +`push_size` int(11) NOT NULL DEFAULT '0', +`push_distinct_size` int(11) NOT NULL DEFAULT '0', +`creator_user_login` varchar(40) NOT NULL DEFAULT '', +`creator_user_id` bigint(20) NOT NULL DEFAULT '0', +`pr_or_issue_created_at` datetime NOT NULL DEFAULT '1970-01-01 00:00:00', +KEY `index_github_events_on_id` (`id`), +KEY `index_github_events_on_created_at` (`created_at`), +KEY `index_github_events_on_repo_id_type_action_month_actor_login` (`repo_id`,`type`,`action`,`event_month`,`actor_login`), +KEY `index_ge_on_repo_id_type_action_pr_merged_created_at_add_del` (`repo_id`,`type`,`action`,`pr_merged`,`created_at`,`additions`,`deletions`), +KEY `index_ge_on_creator_id_type_action_merged_created_at_add_del` (`creator_user_id`,`type`,`action`,`pr_merged`,`created_at`,`additions`,`deletions`), +KEY `index_ge_on_actor_id_type_action_created_at_repo_id_commits` (`actor_id`,`type`,`action`,`created_at`,`repo_id`,`push_distinct_size`), +KEY `index_ge_on_repo_id_type_action_created_at_number_pdsize_psize` (`repo_id`,`type`,`action`,`created_at`,`number`,`push_distinct_size`,`push_size`), +KEY `index_ge_on_repo_id_type_action_created_at_actor_login` (`repo_id`,`type`,`action`,`created_at`,`actor_login`), +KEY `index_ge_on_repo_name_type` (`repo_name`,`type`), +KEY `index_ge_on_actor_login_type` (`actor_login`,`type`), +KEY `index_ge_on_org_login_type` (`org_login`,`type`), +KEY `index_ge_on_language` (`language`), +KEY `index_ge_on_org_id_type` (`org_id`,`type`), +KEY `index_ge_on_actor_login_lower` ((lower(`actor_login`))), +KEY `index_ge_on_repo_name_lower` ((lower(`repo_name`))), +KEY `index_ge_on_language_lower` ((lower(`language`))), +KEY `index_ge_on_type_action` (`type`,`action`) /*!80000 INVISIBLE */, +KEY `index_ge_on_repo_id_type_created_at` (`repo_id`,`type`,`created_at`), +KEY `index_ge_on_repo_id_created_at` (`repo_id`,`created_at`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin +PARTITION BY LIST COLUMNS(`type`) +(PARTITION `push_event` VALUES IN ('PushEvent'), +PARTITION `create_event` VALUES IN ('CreateEvent'), +PARTITION `pull_request_event` VALUES IN ('PullRequestEvent'), +PARTITION `watch_event` VALUES IN ('WatchEvent'), +PARTITION `issue_comment_event` VALUES IN ('IssueCommentEvent'), +PARTITION `issues_event` VALUES IN ('IssuesEvent'), +PARTITION `delete_event` VALUES IN ('DeleteEvent'), +PARTITION `fork_event` VALUES IN ('ForkEvent'), +PARTITION `pull_request_review_comment_event` VALUES IN ('PullRequestReviewCommentEvent'), +PARTITION `pull_request_review_event` VALUES IN ('PullRequestReviewEvent'), +PARTITION `gollum_event` VALUES IN ('GollumEvent'), +PARTITION `release_event` VALUES IN ('ReleaseEvent'), +PARTITION `member_event` VALUES IN ('MemberEvent'), +PARTITION `commit_comment_event` VALUES IN ('CommitCommentEvent'), +PARTITION `public_event` VALUES IN ('PublicEvent'), +PARTITION `gist_event` VALUES IN ('GistEvent'), +PARTITION `follow_event` VALUES IN ('FollowEvent'), +PARTITION `event` VALUES IN ('Event'), +PARTITION `download_event` VALUES IN ('DownloadEvent'), +PARTITION `team_add_event` VALUES IN ('TeamAddEvent'), +PARTITION `fork_apply_event` VALUES IN ('ForkApplyEvent')); +SELECT +repo_id, GROUP_CONCAT( +DISTINCT actor_login +ORDER BY cnt DESC +SEPARATOR ',' +) AS actor_logins +FROM ( +SELECT +ge.repo_id AS repo_id, +ge.actor_login AS actor_login, +COUNT(*) AS cnt +FROM github_events ge +WHERE +type = 'PullRequestEvent' AND action = 'opened' +AND (ge.created_at >= DATE_SUB(NOW(), INTERVAL 1 DAY) AND ge.created_at <= NOW()) +GROUP BY ge.repo_id, ge.actor_login +ORDER BY cnt DESC +) sub +GROUP BY repo_id; +repo_id actor_logins diff --git a/tests/integrationtest/r/planner/core/casetest/partition/integration_partition.result b/tests/integrationtest/r/planner/core/casetest/partition/integration_partition.result index 51c9c68b2d67c..dd34b8ef6e571 100644 --- a/tests/integrationtest/r/planner/core/casetest/partition/integration_partition.result +++ b/tests/integrationtest/r/planner/core/casetest/partition/integration_partition.result @@ -539,21 +539,23 @@ Projection 3.33 root list_partition_pruning.t.a └─TableRowIDScan 3333.33 cop[tikv] table:t keep order:false, stats:pseudo explain format='brief' select a from trange use index (ia) where a > 10 and c = 10 order by a limit 10; id estRows task access object operator info -Projection 10.00 root list_partition_pruning.trange.a -└─TopN 10.00 root list_partition_pruning.trange.a, offset:0, count:10 - └─PartitionUnion 10.00 root - ├─Limit 3.33 root offset:0, count:10 - │ └─Projection 3.33 root list_partition_pruning.trange.a, list_partition_pruning.trange.c - │ └─IndexLookUp 3.33 root - │ ├─IndexRangeScan(Build) 3333.33 cop[tikv] table:trange, partition:p1, index:ia(a) range:(10,+inf], keep order:true, stats:pseudo - │ └─Selection(Probe) 3.33 cop[tikv] eq(list_partition_pruning.trange.c, 10) - │ └─TableRowIDScan 3333.33 cop[tikv] table:trange, partition:p1 keep order:false, stats:pseudo - ├─Limit 3.33 root offset:0, count:10 - │ └─Projection 3.33 root list_partition_pruning.trange.a, list_partition_pruning.trange.c - │ └─IndexLookUp 3.33 root - │ ├─IndexRangeScan(Build) 3333.33 cop[tikv] table:trange, partition:p2, index:ia(a) range:(10,+inf], keep order:true, stats:pseudo - │ └─Selection(Probe) 3.33 cop[tikv] eq(list_partition_pruning.trange.c, 10) - │ └─TableRowIDScan 3333.33 cop[tikv] table:trange, partition:p2 keep order:false, stats:pseudo +TopN 10.00 root list_partition_pruning.trange.a, offset:0, count:10 +└─PartitionUnion 10.00 root + ├─Projection 3.33 root list_partition_pruning.trange.a + │ └─Limit 3.33 root offset:0, count:10 + │ └─Projection 3.33 root list_partition_pruning.trange.a, list_partition_pruning.trange.c + │ └─IndexLookUp 3.33 root + │ ├─IndexRangeScan(Build) 3333.33 cop[tikv] table:trange, partition:p1, index:ia(a) range:(10,+inf], keep order:true, stats:pseudo + │ └─Selection(Probe) 3.33 cop[tikv] eq(list_partition_pruning.trange.c, 10) + │ └─TableRowIDScan 3333.33 cop[tikv] table:trange, partition:p1 keep order:false, stats:pseudo + ├─Projection 3.33 root list_partition_pruning.trange.a + │ └─Limit 3.33 root offset:0, count:10 + │ └─Projection 3.33 root list_partition_pruning.trange.a, list_partition_pruning.trange.c + │ └─IndexLookUp 3.33 root + │ ├─IndexRangeScan(Build) 3333.33 cop[tikv] table:trange, partition:p2, index:ia(a) range:(10,+inf], keep order:true, stats:pseudo + │ └─Selection(Probe) 3.33 cop[tikv] eq(list_partition_pruning.trange.c, 10) + │ └─TableRowIDScan 3333.33 cop[tikv] table:trange, partition:p2 keep order:false, stats:pseudo + └─Projection 3.33 root list_partition_pruning.trange.a └─Limit 3.33 root offset:0, count:10 └─Projection 3.33 root list_partition_pruning.trange.a, list_partition_pruning.trange.c └─IndexLookUp 3.33 root @@ -562,15 +564,16 @@ Projection 10.00 root list_partition_pruning.trange.a └─TableRowIDScan 3333.33 cop[tikv] table:trange, partition:p3 keep order:false, stats:pseudo explain format='brief' select a from tlist use index (ia) where a > 10 and c = 10 order by a limit 10; id estRows task access object operator info -Projection 6.67 root list_partition_pruning.tlist.a -└─TopN 6.67 root list_partition_pruning.tlist.a, offset:0, count:10 - └─PartitionUnion 6.67 root - ├─Limit 3.33 root offset:0, count:10 - │ └─Projection 3.33 root list_partition_pruning.tlist.a, list_partition_pruning.tlist.c - │ └─IndexLookUp 3.33 root - │ ├─IndexRangeScan(Build) 3333.33 cop[tikv] table:tlist, partition:p0, index:ia(a) range:(10,+inf], keep order:true, stats:pseudo - │ └─Selection(Probe) 3.33 cop[tikv] eq(list_partition_pruning.tlist.c, 10) - │ └─TableRowIDScan 3333.33 cop[tikv] table:tlist, partition:p0 keep order:false, stats:pseudo +TopN 6.67 root list_partition_pruning.tlist.a, offset:0, count:10 +└─PartitionUnion 6.67 root + ├─Projection 3.33 root list_partition_pruning.tlist.a + │ └─Limit 3.33 root offset:0, count:10 + │ └─Projection 3.33 root list_partition_pruning.tlist.a, list_partition_pruning.tlist.c + │ └─IndexLookUp 3.33 root + │ ├─IndexRangeScan(Build) 3333.33 cop[tikv] table:tlist, partition:p0, index:ia(a) range:(10,+inf], keep order:true, stats:pseudo + │ └─Selection(Probe) 3.33 cop[tikv] eq(list_partition_pruning.tlist.c, 10) + │ └─TableRowIDScan 3333.33 cop[tikv] table:tlist, partition:p0 keep order:false, stats:pseudo + └─Projection 3.33 root list_partition_pruning.tlist.a └─Limit 3.33 root offset:0, count:10 └─Projection 3.33 root list_partition_pruning.tlist.a, list_partition_pruning.tlist.c └─IndexLookUp 3.33 root @@ -579,27 +582,30 @@ Projection 6.67 root list_partition_pruning.tlist.a └─TableRowIDScan 3333.33 cop[tikv] table:tlist, partition:p1 keep order:false, stats:pseudo explain format='brief' select a from thash use index (ia) where a > 10 and c = 10 order by a limit 10; id estRows task access object operator info -Projection 10.00 root list_partition_pruning.thash.a -└─TopN 10.00 root list_partition_pruning.thash.a, offset:0, count:10 - └─PartitionUnion 13.33 root - ├─Limit 3.33 root offset:0, count:10 - │ └─Projection 3.33 root list_partition_pruning.thash.a, list_partition_pruning.thash.c - │ └─IndexLookUp 3.33 root - │ ├─IndexRangeScan(Build) 3333.33 cop[tikv] table:thash, partition:p0, index:ia(a) range:(10,+inf], keep order:true, stats:pseudo - │ └─Selection(Probe) 3.33 cop[tikv] eq(list_partition_pruning.thash.c, 10) - │ └─TableRowIDScan 3333.33 cop[tikv] table:thash, partition:p0 keep order:false, stats:pseudo - ├─Limit 3.33 root offset:0, count:10 - │ └─Projection 3.33 root list_partition_pruning.thash.a, list_partition_pruning.thash.c - │ └─IndexLookUp 3.33 root - │ ├─IndexRangeScan(Build) 3333.33 cop[tikv] table:thash, partition:p1, index:ia(a) range:(10,+inf], keep order:true, stats:pseudo - │ └─Selection(Probe) 3.33 cop[tikv] eq(list_partition_pruning.thash.c, 10) - │ └─TableRowIDScan 3333.33 cop[tikv] table:thash, partition:p1 keep order:false, stats:pseudo - ├─Limit 3.33 root offset:0, count:10 - │ └─Projection 3.33 root list_partition_pruning.thash.a, list_partition_pruning.thash.c - │ └─IndexLookUp 3.33 root - │ ├─IndexRangeScan(Build) 3333.33 cop[tikv] table:thash, partition:p2, index:ia(a) range:(10,+inf], keep order:true, stats:pseudo - │ └─Selection(Probe) 3.33 cop[tikv] eq(list_partition_pruning.thash.c, 10) - │ └─TableRowIDScan 3333.33 cop[tikv] table:thash, partition:p2 keep order:false, stats:pseudo +TopN 10.00 root list_partition_pruning.thash.a, offset:0, count:10 +└─PartitionUnion 13.33 root + ├─Projection 3.33 root list_partition_pruning.thash.a + │ └─Limit 3.33 root offset:0, count:10 + │ └─Projection 3.33 root list_partition_pruning.thash.a, list_partition_pruning.thash.c + │ └─IndexLookUp 3.33 root + │ ├─IndexRangeScan(Build) 3333.33 cop[tikv] table:thash, partition:p0, index:ia(a) range:(10,+inf], keep order:true, stats:pseudo + │ └─Selection(Probe) 3.33 cop[tikv] eq(list_partition_pruning.thash.c, 10) + │ └─TableRowIDScan 3333.33 cop[tikv] table:thash, partition:p0 keep order:false, stats:pseudo + ├─Projection 3.33 root list_partition_pruning.thash.a + │ └─Limit 3.33 root offset:0, count:10 + │ └─Projection 3.33 root list_partition_pruning.thash.a, list_partition_pruning.thash.c + │ └─IndexLookUp 3.33 root + │ ├─IndexRangeScan(Build) 3333.33 cop[tikv] table:thash, partition:p1, index:ia(a) range:(10,+inf], keep order:true, stats:pseudo + │ └─Selection(Probe) 3.33 cop[tikv] eq(list_partition_pruning.thash.c, 10) + │ └─TableRowIDScan 3333.33 cop[tikv] table:thash, partition:p1 keep order:false, stats:pseudo + ├─Projection 3.33 root list_partition_pruning.thash.a + │ └─Limit 3.33 root offset:0, count:10 + │ └─Projection 3.33 root list_partition_pruning.thash.a, list_partition_pruning.thash.c + │ └─IndexLookUp 3.33 root + │ ├─IndexRangeScan(Build) 3333.33 cop[tikv] table:thash, partition:p2, index:ia(a) range:(10,+inf], keep order:true, stats:pseudo + │ └─Selection(Probe) 3.33 cop[tikv] eq(list_partition_pruning.thash.c, 10) + │ └─TableRowIDScan 3333.33 cop[tikv] table:thash, partition:p2 keep order:false, stats:pseudo + └─Projection 3.33 root list_partition_pruning.thash.a └─Limit 3.33 root offset:0, count:10 └─Projection 3.33 root list_partition_pruning.thash.a, list_partition_pruning.thash.c └─IndexLookUp 3.33 root diff --git a/tests/integrationtest/r/planner/core/casetest/physicalplantest/physical_plan.result b/tests/integrationtest/r/planner/core/casetest/physicalplantest/physical_plan.result index 5db9c5101fc29..b83a1fe725cc1 100644 --- a/tests/integrationtest/r/planner/core/casetest/physicalplantest/physical_plan.result +++ b/tests/integrationtest/r/planner/core/casetest/physicalplantest/physical_plan.result @@ -200,13 +200,12 @@ Level Code Message explain format = 'brief' select /*+ LIMIT_TO_COP() */ a from tn where a div 2 order by a limit 1; id estRows task access object operator info Limit 1.00 root offset:0, count:1 -└─Selection 1.00 root intdiv(planner__core__casetest__physicalplantest__physical_plan.tn.a, 2) - └─IndexReader 1.00 root index:IndexFullScan - └─IndexFullScan 1.00 cop[tikv] table:tn, index:a(a, b, c, d) keep order:true, stats:pseudo +└─IndexReader 1.00 root index:Limit + └─Limit 1.00 cop[tikv] offset:0, count:1 + └─Selection 1.00 cop[tikv] intdiv(planner__core__casetest__physicalplantest__physical_plan.tn.a, 2) + └─IndexFullScan 1.25 cop[tikv] table:tn, index:a(a, b, c, d) keep order:true, stats:pseudo show warnings; Level Code Message -Warning 1105 Scalar function 'intdiv'(signature: IntDivideInt, return type: bigint(20)) is not supported to push down to storage layer now. -Warning 1815 Optimizer Hint LIMIT_TO_COP is inapplicable explain format = 'brief' select /*+ LIMIT_TO_COP() */ a from tn where a > 10 limit 1; id estRows task access object operator info Limit 1.00 root offset:0, count:1 @@ -3308,21 +3307,21 @@ Projection 249.75 root planner__core__casetest__physicalplantest__physical_plan │ └─StreamAgg 249.75 root funcs:max(planner__core__casetest__physicalplantest__physical_plan.tc.id)->Column#14 │ └─TopN 62.38 root planner__core__casetest__physicalplantest__physical_plan.tc.id:desc, offset:0, count:1 │ └─IndexLookUp 62.38 root - │ ├─Selection(Build) 62.44 cop[tikv] eq(planner__core__casetest__physicalplantest__physical_plan.ta.name, planner__core__casetest__physicalplantest__physical_plan.tc.name) + │ ├─Selection(Build) 62.38 cop[tikv] eq(planner__core__casetest__physicalplantest__physical_plan.ta.name, planner__core__casetest__physicalplantest__physical_plan.tc.name), like(planner__core__casetest__physicalplantest__physical_plan.tc.name, "chad99%", 92) │ │ └─IndexRangeScan 62437.50 cop[tikv] table:tc, index:idx_tc_name(name) range:["chad99","chad9:"), keep order:false, stats:pseudo │ └─TopN(Probe) 62.38 cop[tikv] planner__core__casetest__physicalplantest__physical_plan.tc.id:desc, offset:0, count:1 │ └─Selection 62.38 cop[tikv] not(isnull(planner__core__casetest__physicalplantest__physical_plan.tc.id)) - │ └─TableRowIDScan 62.44 cop[tikv] table:tc keep order:false, stats:pseudo + │ └─TableRowIDScan 62.38 cop[tikv] table:tc keep order:false, stats:pseudo └─Selection(Probe) 199.80 root gt(Column#19, 100) └─MaxOneRow 249.75 root └─StreamAgg 249.75 root funcs:max(planner__core__casetest__physicalplantest__physical_plan.td.id)->Column#19 - └─Limit 62.38 root offset:0, count:1 - └─Projection 62.38 root planner__core__casetest__physicalplantest__physical_plan.td.id, planner__core__casetest__physicalplantest__physical_plan.td.name - └─IndexLookUp 62.38 root - ├─Selection(Build) 2495.00 cop[tikv] eq(planner__core__casetest__physicalplantest__physical_plan.ta.id, planner__core__casetest__physicalplantest__physical_plan.td.id) - │ └─IndexFullScan 2495002.50 cop[tikv] table:td, index:idx_tc_id(id) keep order:true, desc, stats:pseudo - └─Selection(Probe) 62.38 cop[tikv] like(planner__core__casetest__physicalplantest__physical_plan.td.name, "chad999%", 92) - └─TableRowIDScan 2495.00 cop[tikv] table:td keep order:false, stats:pseudo + └─TopN 62.38 root planner__core__casetest__physicalplantest__physical_plan.td.id:desc, offset:0, count:1 + └─IndexLookUp 62.38 root + ├─Selection(Build) 1560.94 cop[tikv] like(planner__core__casetest__physicalplantest__physical_plan.td.name, "chad999%", 92) + │ └─IndexRangeScan 62437.50 cop[tikv] table:td, index:idx_tc_name(name) range:["chad999","chad99:"), keep order:false, stats:pseudo + └─TopN(Probe) 62.38 cop[tikv] planner__core__casetest__physicalplantest__physical_plan.td.id:desc, offset:0, count:1 + └─Selection 62.38 cop[tikv] eq(planner__core__casetest__physicalplantest__physical_plan.ta.id, planner__core__casetest__physicalplantest__physical_plan.td.id), not(isnull(planner__core__casetest__physicalplantest__physical_plan.td.id)) + └─TableRowIDScan 1560.94 cop[tikv] table:td keep order:false, stats:pseudo SELECT ta.NAME FROM ta WHERE EXISTS (select /*+ semi_join_rewrite() */ 1 from tb where ta.code = tb.code and tb.NAME LIKE 'chad9%') AND (select /*+ no_decorrelate() */ max(id) from tc where ta.name=tc.name and tc.name like 'chad99%') > 100 and (select /*+ no_decorrelate() */ max(id) from td where ta.id=td.id and td.name like 'chad999%') > 100; NAME show warnings; @@ -3335,29 +3334,31 @@ Projection 10000.00 root planner__core__casetest__physicalplantest__physical_pl │ ├─Apply(Build) 10000.00 root CARTESIAN semi join │ │ ├─TableReader(Build) 10000.00 root data:TableFullScan │ │ │ └─TableFullScan 10000.00 cop[tikv] table:ta keep order:false, stats:pseudo - │ │ └─TableReader(Probe) 2500.00 root data:Selection - │ │ └─Selection 2500.00 cop[tikv] eq(planner__core__casetest__physicalplantest__physical_plan.ta.code, planner__core__casetest__physicalplantest__physical_plan.tb.code), like(planner__core__casetest__physicalplantest__physical_plan.tb.name, "chad9%", 92) - │ │ └─TableFullScan 100000000.00 cop[tikv] table:tb keep order:false, stats:pseudo + │ │ └─IndexLookUp(Probe) 2500.00 root + │ │ ├─Selection(Build) 62500.00 cop[tikv] like(planner__core__casetest__physicalplantest__physical_plan.tb.name, "chad9%", 92) + │ │ │ └─IndexRangeScan 2500000.00 cop[tikv] table:tb, index:idx_tb_name(name) range:["chad9","chad:"), keep order:false, stats:pseudo + │ │ └─Selection(Probe) 2500.00 cop[tikv] eq(planner__core__casetest__physicalplantest__physical_plan.ta.code, planner__core__casetest__physicalplantest__physical_plan.tb.code) + │ │ └─TableRowIDScan 62500.00 cop[tikv] table:tb keep order:false, stats:pseudo │ └─Selection(Probe) 8000.00 root gt(Column#14, 100) │ └─MaxOneRow 10000.00 root │ └─StreamAgg 10000.00 root funcs:max(planner__core__casetest__physicalplantest__physical_plan.tc.id)->Column#14 │ └─TopN 2497.50 root planner__core__casetest__physicalplantest__physical_plan.tc.id:desc, offset:0, count:1 │ └─IndexLookUp 2497.50 root - │ ├─Selection(Build) 2500.00 cop[tikv] eq(planner__core__casetest__physicalplantest__physical_plan.ta.name, planner__core__casetest__physicalplantest__physical_plan.tc.name) + │ ├─Selection(Build) 2497.50 cop[tikv] eq(planner__core__casetest__physicalplantest__physical_plan.ta.name, planner__core__casetest__physicalplantest__physical_plan.tc.name), like(planner__core__casetest__physicalplantest__physical_plan.tc.name, "chad99%", 92) │ │ └─IndexRangeScan 2500000.00 cop[tikv] table:tc, index:idx_tc_name(name) range:["chad99","chad9:"), keep order:false, stats:pseudo │ └─TopN(Probe) 2497.50 cop[tikv] planner__core__casetest__physicalplantest__physical_plan.tc.id:desc, offset:0, count:1 │ └─Selection 2497.50 cop[tikv] not(isnull(planner__core__casetest__physicalplantest__physical_plan.tc.id)) - │ └─TableRowIDScan 2500.00 cop[tikv] table:tc keep order:false, stats:pseudo + │ └─TableRowIDScan 2497.50 cop[tikv] table:tc keep order:false, stats:pseudo └─Selection(Probe) 8000.00 root gt(Column#19, 100) └─MaxOneRow 10000.00 root └─StreamAgg 10000.00 root funcs:max(planner__core__casetest__physicalplantest__physical_plan.td.id)->Column#19 - └─Limit 2497.50 root offset:0, count:1 - └─Projection 2497.50 root planner__core__casetest__physicalplantest__physical_plan.td.id, planner__core__casetest__physicalplantest__physical_plan.td.name - └─IndexLookUp 2497.50 root - ├─Selection(Build) 99900.00 cop[tikv] eq(planner__core__casetest__physicalplantest__physical_plan.ta.id, planner__core__casetest__physicalplantest__physical_plan.td.id) - │ └─IndexFullScan 99900000.00 cop[tikv] table:td, index:idx_tc_id(id) keep order:true, desc, stats:pseudo - └─Selection(Probe) 2497.50 cop[tikv] like(planner__core__casetest__physicalplantest__physical_plan.td.name, "chad999%", 92) - └─TableRowIDScan 99900.00 cop[tikv] table:td keep order:false, stats:pseudo + └─TopN 2497.50 root planner__core__casetest__physicalplantest__physical_plan.td.id:desc, offset:0, count:1 + └─IndexLookUp 2497.50 root + ├─Selection(Build) 62500.00 cop[tikv] like(planner__core__casetest__physicalplantest__physical_plan.td.name, "chad999%", 92) + │ └─IndexRangeScan 2500000.00 cop[tikv] table:td, index:idx_tc_name(name) range:["chad999","chad99:"), keep order:false, stats:pseudo + └─TopN(Probe) 2497.50 cop[tikv] planner__core__casetest__physicalplantest__physical_plan.td.id:desc, offset:0, count:1 + └─Selection 2497.50 cop[tikv] eq(planner__core__casetest__physicalplantest__physical_plan.ta.id, planner__core__casetest__physicalplantest__physical_plan.td.id), not(isnull(planner__core__casetest__physicalplantest__physical_plan.td.id)) + └─TableRowIDScan 62500.00 cop[tikv] table:td keep order:false, stats:pseudo SELECT ta.NAME FROM ta WHERE EXISTS (select /*+ no_decorrelate() */ 1 from tb where ta.code = tb.code and tb.NAME LIKE 'chad9%') AND (select /*+ no_decorrelate() */ max(id) from tc where ta.name=tc.name and tc.name like 'chad99%') > 100 and (select /*+ no_decorrelate() */ max(id) from td where ta.id=td.id and td.name like 'chad999%') > 100; NAME show warnings; @@ -3678,18 +3679,18 @@ show warnings; Level Code Message explain format = 'brief' select /*+ use_index(t, kj) */ * from t where (1 member of (j)) limit 1; id estRows task access object operator info -IndexMerge 0.00 root type: union, limit embedded(offset:0, count:1) -├─Limit(Build) 0.00 cop[tikv] offset:0, count:1 -│ └─IndexRangeScan 0.00 cop[tikv] table:t, index:kj(cast(`j` as signed array)) range:[1,1], keep order:false, stats:pseudo -└─TableRowIDScan(Probe) 0.00 cop[tikv] table:t keep order:false, stats:pseudo +IndexMerge 1.00 root type: union, limit embedded(offset:0, count:1) +├─Limit(Build) 1.00 cop[tikv] offset:0, count:1 +│ └─IndexRangeScan 1.00 cop[tikv] table:t, index:kj(cast(`j` as signed array)) range:[1,1], keep order:false, stats:pseudo +└─TableRowIDScan(Probe) 1.00 cop[tikv] table:t keep order:false, stats:pseudo show warnings; Level Code Message explain format = 'brief' select /*+ use_index(t, kj) */ * from t where json_contains(j, '[1, 2, 3]') limit 1; id estRows task access object operator info IndexMerge 0.00 root type: intersection, limit embedded(offset:0, count:1) -├─IndexRangeScan(Build) 0.00 cop[tikv] table:t, index:kj(cast(`j` as signed array)) range:[1,1], keep order:false, stats:pseudo -├─IndexRangeScan(Build) 0.00 cop[tikv] table:t, index:kj(cast(`j` as signed array)) range:[2,2], keep order:false, stats:pseudo -├─IndexRangeScan(Build) 0.00 cop[tikv] table:t, index:kj(cast(`j` as signed array)) range:[3,3], keep order:false, stats:pseudo +├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:kj(cast(`j` as signed array)) range:[1,1], keep order:false, stats:pseudo +├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:kj(cast(`j` as signed array)) range:[2,2], keep order:false, stats:pseudo +├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:kj(cast(`j` as signed array)) range:[3,3], keep order:false, stats:pseudo └─TableRowIDScan(Probe) 0.00 cop[tikv] table:t keep order:false, stats:pseudo show warnings; Level Code Message @@ -3697,46 +3698,46 @@ explain format = 'brief' select /*+ use_index(t, kj) */ * from t where json_over id estRows task access object operator info Limit 1.00 root offset:0, count:1 └─Selection 1.00 root json_overlaps(planner__core__casetest__physicalplantest__physical_plan.t.j, cast("[1, 2, 3]", json BINARY)) - └─IndexMerge 0.00 root type: union - ├─IndexRangeScan(Build) 0.00 cop[tikv] table:t, index:kj(cast(`j` as signed array)) range:[1,1], keep order:false, stats:pseudo - ├─IndexRangeScan(Build) 0.00 cop[tikv] table:t, index:kj(cast(`j` as signed array)) range:[2,2], keep order:false, stats:pseudo - ├─IndexRangeScan(Build) 0.00 cop[tikv] table:t, index:kj(cast(`j` as signed array)) range:[3,3], keep order:false, stats:pseudo - └─TableRowIDScan(Probe) 0.00 cop[tikv] table:t keep order:false, stats:pseudo + └─IndexMerge 1.00 root type: union + ├─IndexRangeScan(Build) 0.33 cop[tikv] table:t, index:kj(cast(`j` as signed array)) range:[1,1], keep order:false, stats:pseudo + ├─IndexRangeScan(Build) 0.33 cop[tikv] table:t, index:kj(cast(`j` as signed array)) range:[2,2], keep order:false, stats:pseudo + ├─IndexRangeScan(Build) 0.33 cop[tikv] table:t, index:kj(cast(`j` as signed array)) range:[3,3], keep order:false, stats:pseudo + └─TableRowIDScan(Probe) 1.00 cop[tikv] table:t keep order:false, stats:pseudo show warnings; Level Code Message Warning 1105 Scalar function 'json_overlaps'(signature: Unspecified, return type: bigint(20)) is not supported to push down to storage layer now. explain format = 'brief' select /*+ use_index(t, kj) */ * from t where (1 member of (j) and a=1 ) limit 1; id estRows task access object operator info -Limit 1.00 root offset:0, count:1 -└─IndexMerge 0.00 root type: union - ├─IndexRangeScan(Build) 1.25 cop[tikv] table:t, index:kj(cast(`j` as signed array)) range:[1,1], keep order:false, stats:pseudo - └─Limit(Probe) 0.00 cop[tikv] offset:0, count:1 - └─Selection 0.00 cop[tikv] eq(planner__core__casetest__physicalplantest__physical_plan.t.a, 1) - └─TableRowIDScan 1.25 cop[tikv] table:t keep order:false, stats:pseudo +Limit 0.01 root offset:0, count:1 +└─IndexMerge 0.01 root type: union + ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:kj(cast(`j` as signed array)) range:[1,1], keep order:false, stats:pseudo + └─Limit(Probe) 0.01 cop[tikv] offset:0, count:1 + └─Selection 0.01 cop[tikv] eq(planner__core__casetest__physicalplantest__physical_plan.t.a, 1) + └─TableRowIDScan 10.00 cop[tikv] table:t keep order:false, stats:pseudo show warnings; Level Code Message explain format = 'brief' select /*+ use_index(t, kj) */ * from t where json_contains(j, '[1, 2, 3]') and a=1 limit 1; id estRows task access object operator info -Limit 1.00 root offset:0, count:1 +Limit 0.00 root offset:0, count:1 └─IndexMerge 0.00 root type: intersection - ├─IndexRangeScan(Build) 1.25 cop[tikv] table:t, index:kj(cast(`j` as signed array)) range:[1,1], keep order:false, stats:pseudo - ├─IndexRangeScan(Build) 1.25 cop[tikv] table:t, index:kj(cast(`j` as signed array)) range:[2,2], keep order:false, stats:pseudo - ├─IndexRangeScan(Build) 1.25 cop[tikv] table:t, index:kj(cast(`j` as signed array)) range:[3,3], keep order:false, stats:pseudo + ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:kj(cast(`j` as signed array)) range:[1,1], keep order:false, stats:pseudo + ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:kj(cast(`j` as signed array)) range:[2,2], keep order:false, stats:pseudo + ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:kj(cast(`j` as signed array)) range:[3,3], keep order:false, stats:pseudo └─Limit(Probe) 0.00 cop[tikv] offset:0, count:1 └─Selection 0.00 cop[tikv] eq(planner__core__casetest__physicalplantest__physical_plan.t.a, 1) - └─TableRowIDScan 1.25 cop[tikv] table:t keep order:false, stats:pseudo + └─TableRowIDScan 0.00 cop[tikv] table:t keep order:false, stats:pseudo show warnings; Level Code Message explain format = 'brief' select /*+ use_index(t, kj) */ * from t where json_overlaps(j, '[1, 2, 3]') and a=1 limit 1; id estRows task access object operator info Limit 1.00 root offset:0, count:1 └─Selection 1.00 root json_overlaps(planner__core__casetest__physicalplantest__physical_plan.t.j, cast("[1, 2, 3]", json BINARY)) - └─IndexMerge 1.00 root type: union + └─IndexMerge 0.00 root type: union ├─IndexRangeScan(Build) 1.00 cop[tikv] table:t, index:kj(cast(`j` as signed array)) range:[1,1], keep order:false, stats:pseudo ├─IndexRangeScan(Build) 1.00 cop[tikv] table:t, index:kj(cast(`j` as signed array)) range:[2,2], keep order:false, stats:pseudo ├─IndexRangeScan(Build) 1.00 cop[tikv] table:t, index:kj(cast(`j` as signed array)) range:[3,3], keep order:false, stats:pseudo - └─Selection(Probe) 1.00 cop[tikv] eq(planner__core__casetest__physicalplantest__physical_plan.t.a, 1) - └─TableRowIDScan 1.00 cop[tikv] table:t keep order:false, stats:pseudo + └─Selection(Probe) 0.00 cop[tikv] eq(planner__core__casetest__physicalplantest__physical_plan.t.a, 1) + └─TableRowIDScan 3.00 cop[tikv] table:t keep order:false, stats:pseudo show warnings; Level Code Message Warning 1105 Scalar function 'json_overlaps'(signature: Unspecified, return type: bigint(20)) is not supported to push down to storage layer now. diff --git a/tests/integrationtest/r/planner/core/casetest/rule/rule_derive_topn_from_window.result b/tests/integrationtest/r/planner/core/casetest/rule/rule_derive_topn_from_window.result index 3e1005263bc9d..dfa248d4e8880 100644 --- a/tests/integrationtest/r/planner/core/casetest/rule/rule_derive_topn_from_window.result +++ b/tests/integrationtest/r/planner/core/casetest/rule/rule_derive_topn_from_window.result @@ -289,7 +289,7 @@ Sort 0.89 root planner__core__casetest__rule__rule_derive_topn_from_window.cust └─TableReader 1.11 root data:TopN └─TopN 1.11 cop[tikv] partition by planner__core__casetest__rule__rule_derive_topn_from_window.customer.primary_key, planner__core__casetest__rule__rule_derive_topn_from_window.customer.secondary_key order by planner__core__casetest__rule__rule_derive_topn_from_window.customer.c_timestamp, offset:0, count:10 └─Selection 1.11 cop[tikv] ge(planner__core__casetest__rule__rule_derive_topn_from_window.customer.c_timestamp, 1661883508511000000) - └─TableRangeScan 33.33 cop[tikv] table:customer range:[0x0002 0x0001,0x0002 +inf], keep order:false, stats:pseudo + └─TableRangeScan 33.33 cop[tikv] table:customer range:["\x00\x02" "\x00\x01","\x00\x02" +inf], keep order:false, stats:pseudo select * from (select *, row_number() over (partition by primary_key, secondary_key order by c_timestamp) as rownum from customer where primary_key = 0x002 and secondary_key >= 0x001 and c_timestamp >= 1661883508511000000) as nested where rownum <= 10 order by secondary_key desc; primary_key secondary_key c_timestamp value rownum explain format = 'brief' select * from (select row_number() over (partition by b) as rownumber from td) DT where rownumber <= 1 -- pattern is applicable with partition by prefix of primary key; diff --git a/tests/integrationtest/r/planner/core/casetest/rule/rule_join_reorder.result b/tests/integrationtest/r/planner/core/casetest/rule/rule_join_reorder.result index 5cf778d646009..a9135cc00da33 100644 --- a/tests/integrationtest/r/planner/core/casetest/rule/rule_join_reorder.result +++ b/tests/integrationtest/r/planner/core/casetest/rule/rule_join_reorder.result @@ -5468,24 +5468,19 @@ IndexMergeJoin 4.69 root inner join, inner:Projection, outer key:planner__core_ └─TableRowIDScan(Probe) 4.69 cop[tikv] table:t2 keep order:false, stats:pseudo explain format = 'brief' select /*+ leading(t2, t3@sel_2) */ * from t1 join t2 on t1.a=t2.a where t1.a in (select t3.a from t3); id estRows task access object operator info -IndexMergeJoin 4.69 root inner join, inner:Projection, outer key:planner__core__casetest__rule__rule_join_reorder.t1.a, inner key:planner__core__casetest__rule__rule_join_reorder.t2.a -├─IndexMergeJoin(Build) 3.75 root inner join, inner:Projection, outer key:planner__core__casetest__rule__rule_join_reorder.t3.a, inner key:planner__core__casetest__rule__rule_join_reorder.t1.a -│ ├─StreamAgg(Build) 3.00 root group by:planner__core__casetest__rule__rule_join_reorder.t3.a, funcs:firstrow(planner__core__casetest__rule__rule_join_reorder.t3.a)->planner__core__casetest__rule__rule_join_reorder.t3.a -│ │ └─IndexReader 3.00 root index:StreamAgg -│ │ └─StreamAgg 3.00 cop[tikv] group by:planner__core__casetest__rule__rule_join_reorder.t3.a, -│ │ └─IndexFullScan 3.00 cop[tikv] table:t3, index:a(a) keep order:true -│ └─Projection(Probe) 3.75 root planner__core__casetest__rule__rule_join_reorder.t1.a, planner__core__casetest__rule__rule_join_reorder.t1.b -│ └─IndexLookUp 3.75 root -│ ├─Selection(Build) 3.75 cop[tikv] not(isnull(planner__core__casetest__rule__rule_join_reorder.t1.a)) -│ │ └─IndexRangeScan 3.75 cop[tikv] table:t1, index:a(a) range: decided by [eq(planner__core__casetest__rule__rule_join_reorder.t1.a, planner__core__casetest__rule__rule_join_reorder.t3.a)], keep order:true, stats:pseudo -│ └─TableRowIDScan(Probe) 3.75 cop[tikv] table:t1 keep order:false, stats:pseudo -└─Projection(Probe) 4.69 root planner__core__casetest__rule__rule_join_reorder.t2.a, planner__core__casetest__rule__rule_join_reorder.t2.b - └─IndexLookUp 4.69 root - ├─Selection(Build) 4.69 cop[tikv] not(isnull(planner__core__casetest__rule__rule_join_reorder.t2.a)) - │ └─IndexRangeScan 4.69 cop[tikv] table:t2, index:a(a) range: decided by [eq(planner__core__casetest__rule__rule_join_reorder.t2.a, planner__core__casetest__rule__rule_join_reorder.t1.a)], keep order:true, stats:pseudo - └─TableRowIDScan(Probe) 4.69 cop[tikv] table:t2 keep order:false, stats:pseudo -Level Code Message -Warning 1815 We can only use one leading hint at most, when multiple leading hints are used, all leading hints will be invalid +Projection 37462.50 root planner__core__casetest__rule__rule_join_reorder.t1.a, planner__core__casetest__rule__rule_join_reorder.t1.b, planner__core__casetest__rule__rule_join_reorder.t2.a, planner__core__casetest__rule__rule_join_reorder.t2.b +└─HashJoin 37462.50 root inner join, equal:[eq(planner__core__casetest__rule__rule_join_reorder.t2.a, planner__core__casetest__rule__rule_join_reorder.t1.a) eq(planner__core__casetest__rule__rule_join_reorder.t3.a, planner__core__casetest__rule__rule_join_reorder.t1.a)] + ├─TableReader(Build) 9990.00 root data:Selection + │ └─Selection 9990.00 cop[tikv] not(isnull(planner__core__casetest__rule__rule_join_reorder.t1.a)) + │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo + └─HashJoin(Probe) 29970.00 root CARTESIAN inner join + ├─StreamAgg(Build) 3.00 root group by:planner__core__casetest__rule__rule_join_reorder.t3.a, funcs:firstrow(planner__core__casetest__rule__rule_join_reorder.t3.a)->planner__core__casetest__rule__rule_join_reorder.t3.a + │ └─IndexReader 3.00 root index:StreamAgg + │ └─StreamAgg 3.00 cop[tikv] group by:planner__core__casetest__rule__rule_join_reorder.t3.a, + │ └─IndexFullScan 3.00 cop[tikv] table:t3, index:a(a) keep order:true + └─TableReader(Probe) 9990.00 root data:Selection + └─Selection 9990.00 cop[tikv] not(isnull(planner__core__casetest__rule__rule_join_reorder.t2.a)) + └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo explain format = 'brief' select /*+ leading(t1, t3@sel_2) */ * from t1 join t2 on t1.a=t2.a where t1.a in (select t3.a from t3); id estRows task access object operator info IndexMergeJoin 4.69 root inner join, inner:Projection, outer key:planner__core__casetest__rule__rule_join_reorder.t1.a, inner key:planner__core__casetest__rule__rule_join_reorder.t2.a @@ -5504,28 +5499,21 @@ IndexMergeJoin 4.69 root inner join, inner:Projection, outer key:planner__core_ ├─Selection(Build) 4.69 cop[tikv] not(isnull(planner__core__casetest__rule__rule_join_reorder.t2.a)) │ └─IndexRangeScan 4.69 cop[tikv] table:t2, index:a(a) range: decided by [eq(planner__core__casetest__rule__rule_join_reorder.t2.a, planner__core__casetest__rule__rule_join_reorder.t1.a)], keep order:true, stats:pseudo └─TableRowIDScan(Probe) 4.69 cop[tikv] table:t2 keep order:false, stats:pseudo -Level Code Message -Warning 1815 We can only use one leading hint at most, when multiple leading hints are used, all leading hints will be invalid explain format = 'brief' select /*+ leading(t3@sel_2, t2) */ * from t1 join t2 on t1.a=t2.a where t1.a in (select t3.a from t3); id estRows task access object operator info -IndexMergeJoin 4.69 root inner join, inner:Projection, outer key:planner__core__casetest__rule__rule_join_reorder.t1.a, inner key:planner__core__casetest__rule__rule_join_reorder.t2.a -├─IndexMergeJoin(Build) 3.75 root inner join, inner:Projection, outer key:planner__core__casetest__rule__rule_join_reorder.t3.a, inner key:planner__core__casetest__rule__rule_join_reorder.t1.a -│ ├─StreamAgg(Build) 3.00 root group by:planner__core__casetest__rule__rule_join_reorder.t3.a, funcs:firstrow(planner__core__casetest__rule__rule_join_reorder.t3.a)->planner__core__casetest__rule__rule_join_reorder.t3.a -│ │ └─IndexReader 3.00 root index:StreamAgg -│ │ └─StreamAgg 3.00 cop[tikv] group by:planner__core__casetest__rule__rule_join_reorder.t3.a, -│ │ └─IndexFullScan 3.00 cop[tikv] table:t3, index:a(a) keep order:true -│ └─Projection(Probe) 3.75 root planner__core__casetest__rule__rule_join_reorder.t1.a, planner__core__casetest__rule__rule_join_reorder.t1.b -│ └─IndexLookUp 3.75 root -│ ├─Selection(Build) 3.75 cop[tikv] not(isnull(planner__core__casetest__rule__rule_join_reorder.t1.a)) -│ │ └─IndexRangeScan 3.75 cop[tikv] table:t1, index:a(a) range: decided by [eq(planner__core__casetest__rule__rule_join_reorder.t1.a, planner__core__casetest__rule__rule_join_reorder.t3.a)], keep order:true, stats:pseudo -│ └─TableRowIDScan(Probe) 3.75 cop[tikv] table:t1 keep order:false, stats:pseudo -└─Projection(Probe) 4.69 root planner__core__casetest__rule__rule_join_reorder.t2.a, planner__core__casetest__rule__rule_join_reorder.t2.b - └─IndexLookUp 4.69 root - ├─Selection(Build) 4.69 cop[tikv] not(isnull(planner__core__casetest__rule__rule_join_reorder.t2.a)) - │ └─IndexRangeScan 4.69 cop[tikv] table:t2, index:a(a) range: decided by [eq(planner__core__casetest__rule__rule_join_reorder.t2.a, planner__core__casetest__rule__rule_join_reorder.t1.a)], keep order:true, stats:pseudo - └─TableRowIDScan(Probe) 4.69 cop[tikv] table:t2 keep order:false, stats:pseudo -Level Code Message -Warning 1815 We can only use one leading hint at most, when multiple leading hints are used, all leading hints will be invalid +Projection 37462.50 root planner__core__casetest__rule__rule_join_reorder.t1.a, planner__core__casetest__rule__rule_join_reorder.t1.b, planner__core__casetest__rule__rule_join_reorder.t2.a, planner__core__casetest__rule__rule_join_reorder.t2.b +└─HashJoin 37462.50 root inner join, equal:[eq(planner__core__casetest__rule__rule_join_reorder.t2.a, planner__core__casetest__rule__rule_join_reorder.t1.a) eq(planner__core__casetest__rule__rule_join_reorder.t3.a, planner__core__casetest__rule__rule_join_reorder.t1.a)] + ├─TableReader(Build) 9990.00 root data:Selection + │ └─Selection 9990.00 cop[tikv] not(isnull(planner__core__casetest__rule__rule_join_reorder.t1.a)) + │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo + └─HashJoin(Probe) 29970.00 root CARTESIAN inner join + ├─StreamAgg(Build) 3.00 root group by:planner__core__casetest__rule__rule_join_reorder.t3.a, funcs:firstrow(planner__core__casetest__rule__rule_join_reorder.t3.a)->planner__core__casetest__rule__rule_join_reorder.t3.a + │ └─IndexReader 3.00 root index:StreamAgg + │ └─StreamAgg 3.00 cop[tikv] group by:planner__core__casetest__rule__rule_join_reorder.t3.a, + │ └─IndexFullScan 3.00 cop[tikv] table:t3, index:a(a) keep order:true + └─TableReader(Probe) 9990.00 root data:Selection + └─Selection 9990.00 cop[tikv] not(isnull(planner__core__casetest__rule__rule_join_reorder.t2.a)) + └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo explain format = 'brief' select /*+ leading(t3@sel_2, t1) */ * from t1 join t2 on t1.a=t2.a where t1.a in (select t3.a from t3); id estRows task access object operator info IndexMergeJoin 4.69 root inner join, inner:Projection, outer key:planner__core__casetest__rule__rule_join_reorder.t1.a, inner key:planner__core__casetest__rule__rule_join_reorder.t2.a @@ -5544,8 +5532,6 @@ IndexMergeJoin 4.69 root inner join, inner:Projection, outer key:planner__core_ ├─Selection(Build) 4.69 cop[tikv] not(isnull(planner__core__casetest__rule__rule_join_reorder.t2.a)) │ └─IndexRangeScan 4.69 cop[tikv] table:t2, index:a(a) range: decided by [eq(planner__core__casetest__rule__rule_join_reorder.t2.a, planner__core__casetest__rule__rule_join_reorder.t1.a)], keep order:true, stats:pseudo └─TableRowIDScan(Probe) 4.69 cop[tikv] table:t2 keep order:false, stats:pseudo -Level Code Message -Warning 1815 We can only use one leading hint at most, when multiple leading hints are used, all leading hints will be invalid explain format = 'brief' select /*+ leading(t4) */ * from t1 join t2 on t1.a=t2.a join t4 on t1.b = t4.b where t1.a not in (select t3.a from t3); id estRows task access object operator info HashJoin 12475.01 root Null-aware anti semi join, equal:[eq(planner__core__casetest__rule__rule_join_reorder.t1.a, planner__core__casetest__rule__rule_join_reorder.t3.a)] @@ -7157,20 +7143,19 @@ HashJoin 12487.50 root left outer join, equal:[eq(planner__core__casetest__rule └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo explain format = 'brief' select /*+ leading(t2, t3@sel_2) */ * from t1 join t2 on t1.a=t2.a where t1.a in (select t3.a from t3); id estRows task access object operator info -HashJoin 12487.50 root inner join, equal:[eq(planner__core__casetest__rule__rule_join_reorder.t1.a, planner__core__casetest__rule__rule_join_reorder.t3.a)] -├─StreamAgg(Build) 7992.00 root group by:planner__core__casetest__rule__rule_join_reorder.t3.a, funcs:firstrow(planner__core__casetest__rule__rule_join_reorder.t3.a)->planner__core__casetest__rule__rule_join_reorder.t3.a -│ └─IndexReader 7992.00 root index:StreamAgg -│ └─StreamAgg 7992.00 cop[tikv] group by:planner__core__casetest__rule__rule_join_reorder.t3.a, -│ └─IndexFullScan 9990.00 cop[tikv] table:t3, index:a(a) keep order:true, stats:pseudo -└─HashJoin(Probe) 12487.50 root inner join, equal:[eq(planner__core__casetest__rule__rule_join_reorder.t1.a, planner__core__casetest__rule__rule_join_reorder.t2.a)] +Projection 99800100.00 root planner__core__casetest__rule__rule_join_reorder.t1.a, planner__core__casetest__rule__rule_join_reorder.t1.b, planner__core__casetest__rule__rule_join_reorder.t2.a, planner__core__casetest__rule__rule_join_reorder.t2.b +└─HashJoin 99800100.00 root inner join, equal:[eq(planner__core__casetest__rule__rule_join_reorder.t2.a, planner__core__casetest__rule__rule_join_reorder.t1.a) eq(planner__core__casetest__rule__rule_join_reorder.t3.a, planner__core__casetest__rule__rule_join_reorder.t1.a)] ├─TableReader(Build) 9990.00 root data:Selection - │ └─Selection 9990.00 cop[tikv] not(isnull(planner__core__casetest__rule__rule_join_reorder.t2.a)) - │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo - └─TableReader(Probe) 9990.00 root data:Selection - └─Selection 9990.00 cop[tikv] not(isnull(planner__core__casetest__rule__rule_join_reorder.t1.a)) - └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo -Level Code Message -Warning 1815 We can only use one leading hint at most, when multiple leading hints are used, all leading hints will be invalid + │ └─Selection 9990.00 cop[tikv] not(isnull(planner__core__casetest__rule__rule_join_reorder.t1.a)) + │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo + └─HashJoin(Probe) 79840080.00 root CARTESIAN inner join + ├─StreamAgg(Build) 7992.00 root group by:planner__core__casetest__rule__rule_join_reorder.t3.a, funcs:firstrow(planner__core__casetest__rule__rule_join_reorder.t3.a)->planner__core__casetest__rule__rule_join_reorder.t3.a + │ └─IndexReader 7992.00 root index:StreamAgg + │ └─StreamAgg 7992.00 cop[tikv] group by:planner__core__casetest__rule__rule_join_reorder.t3.a, + │ └─IndexFullScan 9990.00 cop[tikv] table:t3, index:a(a) keep order:true, stats:pseudo + └─TableReader(Probe) 9990.00 root data:Selection + └─Selection 9990.00 cop[tikv] not(isnull(planner__core__casetest__rule__rule_join_reorder.t2.a)) + └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo explain format = 'brief' select /*+ leading(t4) */ * from t1 left join t2 on t1.a=t2.a right join t4 on t1.b = t4.b where t1.a not in (select t3.a from t3); id estRows task access object operator info HashJoin 12487.50 root Null-aware anti semi join, equal:[eq(planner__core__casetest__rule__rule_join_reorder.t1.a, planner__core__casetest__rule__rule_join_reorder.t3.a)] diff --git a/tests/integrationtest/r/planner/core/cbo.result b/tests/integrationtest/r/planner/core/cbo.result index 230e53fe949ca..0847873f33bb9 100644 --- a/tests/integrationtest/r/planner/core/cbo.result +++ b/tests/integrationtest/r/planner/core/cbo.result @@ -73,10 +73,10 @@ Projection_9 1.00 1 root NULL time:, loops:, RU:, Concurrency:OFF └─StreamAgg_11 1.00 1 root NULL time:, loops: funcs:sum(Column#16)->Column#8, funcs:firstrow(Column#17)->planner__core__cbo.t1.a, funcs:firstrow(Column#18)->planner__core__cbo.t1.b N/A └─Projection_53 4.00 3 root NULL time:, loops:, Concurrency:OFF cast(planner__core__cbo.t1.c, decimal(10,0) BINARY)->Column#16, planner__core__cbo.t1.a->Column#17, planner__core__cbo.t1.b->Column#18 N/A └─HashJoin_51 4.00 3 root NULL time:, loops:, build_hash_table:{total:, fetch:, build:}, probe:{concurrency:, total:, max:, probe:, fetch:} inner join, equal:[eq(planner__core__cbo.t1.a, planner__core__cbo.t2.b)] - ├─TableReader_30(Build) 6.00 6 root NULL time:, loops:, cop_task: {num:, max:, proc_keys:, rpc_num:, rpc_time:, copr_cache_hit_ratio:, build_task_duration:, max_distsql_concurrency:} data:Selection_29 N/A + ├─TableReader_30(Build) 6.00 6 root NULL time.*loops.*cop_task.* data:Selection_29 N/A │ └─Selection_29 6.00 6 cop[tikv] NULL tikv_task:{time:, loops:} gt(planner__core__cbo.t2.b, 1), not(isnull(planner__core__cbo.t2.b)) N/A N/A │ └─TableFullScan_28 6.00 6 cop[tikv] table:t2 tikv_task:{time:, loops:} keep order:false N/A N/A - └─TableReader_33(Probe) 4.00 4 root NULL time:, loops:, cop_task: {num:, max:, proc_keys:, rpc_num:, rpc_time:, copr_cache_hit_ratio:, build_task_duration:, max_distsql_concurrency:} data:Selection_32 N/A + └─TableReader_33(Probe) 4.00 4 root NULL time.*loops.*cop_task.* data:Selection_32 N/A └─Selection_32 4.00 4 cop[tikv] NULL tikv_task:{time:, loops:} gt(planner__core__cbo.t1.a, 1), not(isnull(planner__core__cbo.t1.a)) N/A N/A └─TableFullScan_31 5.00 5 cop[tikv] table:t1 tikv_task:{time:, loops:} keep order:false N/A N/A set sql_mode=default; diff --git a/tests/integrationtest/r/planner/core/indexmerge_path.result b/tests/integrationtest/r/planner/core/indexmerge_path.result index 5d9692411d014..07f2f8cd44483 100644 --- a/tests/integrationtest/r/planner/core/indexmerge_path.result +++ b/tests/integrationtest/r/planner/core/indexmerge_path.result @@ -7,14 +7,10 @@ set tidb_analyze_version=2; analyze table t; Level Code Message Note 1105 Analyze use auto adjusted sample rate 1.000000 for table planner__core__indexmerge_path.t, reason to use this rate is "use min(1, 110000/10000) as the sample-rate=1" -Warning 1105 analyzing multi-valued indexes is not supported, skip idx -Warning 1105 analyzing multi-valued indexes is not supported, skip idx2 analyze table t index idx; Level Code Message Note 1105 Analyze use auto adjusted sample rate 1.000000 for table planner__core__indexmerge_path.t, reason to use this rate is "TiDB assumes that the table is empty, use sample-rate=1" Warning 1105 The version 2 would collect all statistics not only the selected indexes -Warning 1105 analyzing multi-valued indexes is not supported, skip idx -Warning 1105 analyzing multi-valued indexes is not supported, skip idx2 set tidb_analyze_version=1; analyze table t; Level Code Message @@ -54,9 +50,9 @@ TableReader 2658.67 root data:Selection └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo explain format = 'brief' select /*+ use_index_merge(t, j0_1) */ * from t where (1 member of (j0->'$.path1')) and (2 member of (j1)) and a<10; id estRows task access object operator info -IndexMerge 2.66 root type: union +IndexMerge 0.00 root type: union ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_1(cast(json_extract(`j0`, _utf8mb4'$.path1') as signed array)) range:[1,1], keep order:false, stats:pseudo -└─Selection(Probe) 2.66 cop[tikv] json_memberof(cast(2, json BINARY), planner__core__indexmerge_path.t.j1), lt(planner__core__indexmerge_path.t.a, 10) +└─Selection(Probe) 0.00 cop[tikv] json_memberof(cast(2, json BINARY), planner__core__indexmerge_path.t.j1), lt(planner__core__indexmerge_path.t.a, 10) └─TableRowIDScan 10.00 cop[tikv] table:t keep order:false, stats:pseudo explain format = 'brief' select /*+ use_index(t, j0_0) */ * from t where (1 member of (j0->'$.path0')); id estRows task access object operator info @@ -93,59 +89,59 @@ IndexMerge 3.32 root type: union └─TableRowIDScan 10.00 cop[tikv] table:t keep order:false, stats:pseudo explain format = 'brief' select /*+ use_index_merge(t, j1) */ * from t where (1 member of (j0->'$.path1')) and (2 member of (j1)) and a<10; id estRows task access object operator info -IndexMerge 2.66 root type: union +IndexMerge 0.00 root type: union ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_1(cast(json_extract(`j0`, _utf8mb4'$.path1') as signed array)) range:[1,1], keep order:false, stats:pseudo -└─Selection(Probe) 2.66 cop[tikv] json_memberof(cast(2, json BINARY), planner__core__indexmerge_path.t.j1), lt(planner__core__indexmerge_path.t.a, 10) +└─Selection(Probe) 0.00 cop[tikv] json_memberof(cast(2, json BINARY), planner__core__indexmerge_path.t.j1), lt(planner__core__indexmerge_path.t.a, 10) └─TableRowIDScan 10.00 cop[tikv] table:t keep order:false, stats:pseudo explain format = 'brief' select /*+ use_index_merge(t, j0_0) */ * from t where json_contains((j0->'$.path0'), '[1, 2, 3]'); id estRows task access object operator info -IndexMerge 10.00 root type: intersection +IndexMerge 0.00 root type: intersection ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_0(cast(json_extract(`j0`, _utf8mb4'$.path0') as signed array)) range:[1,1], keep order:false, stats:pseudo ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_0(cast(json_extract(`j0`, _utf8mb4'$.path0') as signed array)) range:[2,2], keep order:false, stats:pseudo ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_0(cast(json_extract(`j0`, _utf8mb4'$.path0') as signed array)) range:[3,3], keep order:false, stats:pseudo -└─TableRowIDScan(Probe) 10.00 cop[tikv] table:t keep order:false, stats:pseudo +└─TableRowIDScan(Probe) 0.00 cop[tikv] table:t keep order:false, stats:pseudo explain format = 'brief' select /*+ use_index_merge(t, j0_0) */ * from t where json_overlaps((j0->'$.path0'), '[1, 2, 3]'); id estRows task access object operator info -Selection 8.00 root json_overlaps(json_extract(planner__core__indexmerge_path.t.j0, "$.path0"), cast("[1, 2, 3]", json BINARY)) -└─IndexMerge 10.00 root type: union +Selection 23.98 root json_overlaps(json_extract(planner__core__indexmerge_path.t.j0, "$.path0"), cast("[1, 2, 3]", json BINARY)) +└─IndexMerge 29.97 root type: union ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_0(cast(json_extract(`j0`, _utf8mb4'$.path0') as signed array)) range:[1,1], keep order:false, stats:pseudo ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_0(cast(json_extract(`j0`, _utf8mb4'$.path0') as signed array)) range:[2,2], keep order:false, stats:pseudo ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_0(cast(json_extract(`j0`, _utf8mb4'$.path0') as signed array)) range:[3,3], keep order:false, stats:pseudo - └─TableRowIDScan(Probe) 10.00 cop[tikv] table:t keep order:false, stats:pseudo + └─TableRowIDScan(Probe) 29.97 cop[tikv] table:t keep order:false, stats:pseudo explain format = 'brief' select /*+ use_index_merge(t, j0_0) */ * from t where json_overlaps('[1, 2, 3]', (j0->'$.path0')); id estRows task access object operator info -Selection 8.00 root json_overlaps(cast("[1, 2, 3]", json BINARY), json_extract(planner__core__indexmerge_path.t.j0, "$.path0")) -└─IndexMerge 10.00 root type: union +Selection 23.98 root json_overlaps(cast("[1, 2, 3]", json BINARY), json_extract(planner__core__indexmerge_path.t.j0, "$.path0")) +└─IndexMerge 29.97 root type: union ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_0(cast(json_extract(`j0`, _utf8mb4'$.path0') as signed array)) range:[1,1], keep order:false, stats:pseudo ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_0(cast(json_extract(`j0`, _utf8mb4'$.path0') as signed array)) range:[2,2], keep order:false, stats:pseudo ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_0(cast(json_extract(`j0`, _utf8mb4'$.path0') as signed array)) range:[3,3], keep order:false, stats:pseudo - └─TableRowIDScan(Probe) 10.00 cop[tikv] table:t keep order:false, stats:pseudo + └─TableRowIDScan(Probe) 29.97 cop[tikv] table:t keep order:false, stats:pseudo explain format = 'brief' select /*+ use_index_merge(t, j0_0) */ * from t where json_contains((j0->'$.path0'), '[1, 2, 3]') and a<10; id estRows task access object operator info -IndexMerge 3.32 root type: intersection +IndexMerge 0.00 root type: intersection ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_0(cast(json_extract(`j0`, _utf8mb4'$.path0') as signed array)) range:[1,1], keep order:false, stats:pseudo ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_0(cast(json_extract(`j0`, _utf8mb4'$.path0') as signed array)) range:[2,2], keep order:false, stats:pseudo ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_0(cast(json_extract(`j0`, _utf8mb4'$.path0') as signed array)) range:[3,3], keep order:false, stats:pseudo -└─Selection(Probe) 3.32 cop[tikv] lt(planner__core__indexmerge_path.t.a, 10) - └─TableRowIDScan 10.00 cop[tikv] table:t keep order:false, stats:pseudo +└─Selection(Probe) 0.00 cop[tikv] lt(planner__core__indexmerge_path.t.a, 10) + └─TableRowIDScan 0.00 cop[tikv] table:t keep order:false, stats:pseudo explain format = 'brief' select /*+ use_index_merge(t, j0_0) */ * from t where json_overlaps((j0->'$.path0'), '[1, 2, 3]') and a<10; id estRows task access object operator info -Selection 8.00 root json_overlaps(json_extract(planner__core__indexmerge_path.t.j0, "$.path0"), cast("[1, 2, 3]", json BINARY)) -└─IndexMerge 3.32 root type: union +Selection 23.98 root json_overlaps(json_extract(planner__core__indexmerge_path.t.j0, "$.path0"), cast("[1, 2, 3]", json BINARY)) +└─IndexMerge 9.96 root type: union ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_0(cast(json_extract(`j0`, _utf8mb4'$.path0') as signed array)) range:[1,1], keep order:false, stats:pseudo ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_0(cast(json_extract(`j0`, _utf8mb4'$.path0') as signed array)) range:[2,2], keep order:false, stats:pseudo ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_0(cast(json_extract(`j0`, _utf8mb4'$.path0') as signed array)) range:[3,3], keep order:false, stats:pseudo - └─Selection(Probe) 3.32 cop[tikv] lt(planner__core__indexmerge_path.t.a, 10) - └─TableRowIDScan 10.00 cop[tikv] table:t keep order:false, stats:pseudo + └─Selection(Probe) 9.96 cop[tikv] lt(planner__core__indexmerge_path.t.a, 10) + └─TableRowIDScan 29.97 cop[tikv] table:t keep order:false, stats:pseudo explain format = 'brief' select /*+ use_index_merge(t, j0_0) */ * from t where json_overlaps('[1, 2, 3]', (j0->'$.path0')) and a<10; id estRows task access object operator info -Selection 8.00 root json_overlaps(cast("[1, 2, 3]", json BINARY), json_extract(planner__core__indexmerge_path.t.j0, "$.path0")) -└─IndexMerge 3.32 root type: union +Selection 23.98 root json_overlaps(cast("[1, 2, 3]", json BINARY), json_extract(planner__core__indexmerge_path.t.j0, "$.path0")) +└─IndexMerge 9.96 root type: union ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_0(cast(json_extract(`j0`, _utf8mb4'$.path0') as signed array)) range:[1,1], keep order:false, stats:pseudo ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_0(cast(json_extract(`j0`, _utf8mb4'$.path0') as signed array)) range:[2,2], keep order:false, stats:pseudo ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_0(cast(json_extract(`j0`, _utf8mb4'$.path0') as signed array)) range:[3,3], keep order:false, stats:pseudo - └─Selection(Probe) 3.32 cop[tikv] lt(planner__core__indexmerge_path.t.a, 10) - └─TableRowIDScan 10.00 cop[tikv] table:t keep order:false, stats:pseudo + └─Selection(Probe) 9.96 cop[tikv] lt(planner__core__indexmerge_path.t.a, 10) + └─TableRowIDScan 29.97 cop[tikv] table:t keep order:false, stats:pseudo explain format = 'brief' select /*+ use_index_merge(t, j0_0) */ * from t where json_contains((j0->'$.path0'), '1'); id estRows task access object operator info IndexMerge 10.00 root type: intersection @@ -186,46 +182,46 @@ Selection 8.00 root json_overlaps(cast("1", json BINARY), json_extract(planner_ explain format = 'brief' select /*+ use_index_merge(t, j0_string) */ * from t where ("a" member of (j0->'$.path_string')); id estRows task access object operator info IndexMerge 10.00 root type: union -├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_string(cast(json_extract(`j0`, _utf8mb4'$.path_string') as char(10) array)) range:[0x61,0x61], keep order:false, stats:pseudo +├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_string(cast(json_extract(`j0`, _utf8mb4'$.path_string') as char(10) array)) range:["a","a"], keep order:false, stats:pseudo └─TableRowIDScan(Probe) 10.00 cop[tikv] table:t keep order:false, stats:pseudo explain format = 'brief' select /*+ use_index_merge(t, j0_string) */ * from t where ("a" member of (j0->'$.path_string')) and a<10; id estRows task access object operator info IndexMerge 3.32 root type: union -├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_string(cast(json_extract(`j0`, _utf8mb4'$.path_string') as char(10) array)) range:[0x61,0x61], keep order:false, stats:pseudo +├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_string(cast(json_extract(`j0`, _utf8mb4'$.path_string') as char(10) array)) range:["a","a"], keep order:false, stats:pseudo └─Selection(Probe) 3.32 cop[tikv] lt(planner__core__indexmerge_path.t.a, 10) └─TableRowIDScan 10.00 cop[tikv] table:t keep order:false, stats:pseudo explain format = 'brief' select /*+ use_index_merge(t, j0_string) */ * from t where json_contains((j0->'$.path_string'), '["a", "b", "c"]'); id estRows task access object operator info -IndexMerge 10.00 root type: intersection -├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_string(cast(json_extract(`j0`, _utf8mb4'$.path_string') as char(10) array)) range:[0x61,0x61], keep order:false, stats:pseudo -├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_string(cast(json_extract(`j0`, _utf8mb4'$.path_string') as char(10) array)) range:[0x62,0x62], keep order:false, stats:pseudo -├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_string(cast(json_extract(`j0`, _utf8mb4'$.path_string') as char(10) array)) range:[0x63,0x63], keep order:false, stats:pseudo -└─TableRowIDScan(Probe) 10.00 cop[tikv] table:t keep order:false, stats:pseudo +IndexMerge 0.00 root type: intersection +├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_string(cast(json_extract(`j0`, _utf8mb4'$.path_string') as char(10) array)) range:["a","a"], keep order:false, stats:pseudo +├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_string(cast(json_extract(`j0`, _utf8mb4'$.path_string') as char(10) array)) range:["b","b"], keep order:false, stats:pseudo +├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_string(cast(json_extract(`j0`, _utf8mb4'$.path_string') as char(10) array)) range:["c","c"], keep order:false, stats:pseudo +└─TableRowIDScan(Probe) 0.00 cop[tikv] table:t keep order:false, stats:pseudo explain format = 'brief' select /*+ use_index_merge(t, j0_string) */ * from t where json_contains((j0->'$.path_string'), '["a", "b", "c"]') and a<10; id estRows task access object operator info -IndexMerge 3.32 root type: intersection -├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_string(cast(json_extract(`j0`, _utf8mb4'$.path_string') as char(10) array)) range:[0x61,0x61], keep order:false, stats:pseudo -├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_string(cast(json_extract(`j0`, _utf8mb4'$.path_string') as char(10) array)) range:[0x62,0x62], keep order:false, stats:pseudo -├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_string(cast(json_extract(`j0`, _utf8mb4'$.path_string') as char(10) array)) range:[0x63,0x63], keep order:false, stats:pseudo -└─Selection(Probe) 3.32 cop[tikv] lt(planner__core__indexmerge_path.t.a, 10) - └─TableRowIDScan 10.00 cop[tikv] table:t keep order:false, stats:pseudo +IndexMerge 0.00 root type: intersection +├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_string(cast(json_extract(`j0`, _utf8mb4'$.path_string') as char(10) array)) range:["a","a"], keep order:false, stats:pseudo +├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_string(cast(json_extract(`j0`, _utf8mb4'$.path_string') as char(10) array)) range:["b","b"], keep order:false, stats:pseudo +├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_string(cast(json_extract(`j0`, _utf8mb4'$.path_string') as char(10) array)) range:["c","c"], keep order:false, stats:pseudo +└─Selection(Probe) 0.00 cop[tikv] lt(planner__core__indexmerge_path.t.a, 10) + └─TableRowIDScan 0.00 cop[tikv] table:t keep order:false, stats:pseudo explain format = 'brief' select /*+ use_index_merge(t, j0_string) */ * from t where json_overlaps((j0->'$.path_string'), '["a", "b", "c"]'); id estRows task access object operator info -Selection 8.00 root json_overlaps(json_extract(planner__core__indexmerge_path.t.j0, "$.path_string"), cast("["a", "b", "c"]", json BINARY)) -└─IndexMerge 10.00 root type: union - ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_string(cast(json_extract(`j0`, _utf8mb4'$.path_string') as char(10) array)) range:[0x61,0x61], keep order:false, stats:pseudo - ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_string(cast(json_extract(`j0`, _utf8mb4'$.path_string') as char(10) array)) range:[0x62,0x62], keep order:false, stats:pseudo - ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_string(cast(json_extract(`j0`, _utf8mb4'$.path_string') as char(10) array)) range:[0x63,0x63], keep order:false, stats:pseudo - └─TableRowIDScan(Probe) 10.00 cop[tikv] table:t keep order:false, stats:pseudo +Selection 23.98 root json_overlaps(json_extract(planner__core__indexmerge_path.t.j0, "$.path_string"), cast("["a", "b", "c"]", json BINARY)) +└─IndexMerge 29.97 root type: union + ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_string(cast(json_extract(`j0`, _utf8mb4'$.path_string') as char(10) array)) range:["a","a"], keep order:false, stats:pseudo + ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_string(cast(json_extract(`j0`, _utf8mb4'$.path_string') as char(10) array)) range:["b","b"], keep order:false, stats:pseudo + ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_string(cast(json_extract(`j0`, _utf8mb4'$.path_string') as char(10) array)) range:["c","c"], keep order:false, stats:pseudo + └─TableRowIDScan(Probe) 29.97 cop[tikv] table:t keep order:false, stats:pseudo explain format = 'brief' select /*+ use_index_merge(t, j0_string) */ * from t where json_overlaps((j0->'$.path_string'), '["a", "b", "c"]') and a<10; id estRows task access object operator info -Selection 8.00 root json_overlaps(json_extract(planner__core__indexmerge_path.t.j0, "$.path_string"), cast("["a", "b", "c"]", json BINARY)) -└─IndexMerge 3.32 root type: union - ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_string(cast(json_extract(`j0`, _utf8mb4'$.path_string') as char(10) array)) range:[0x61,0x61], keep order:false, stats:pseudo - ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_string(cast(json_extract(`j0`, _utf8mb4'$.path_string') as char(10) array)) range:[0x62,0x62], keep order:false, stats:pseudo - ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_string(cast(json_extract(`j0`, _utf8mb4'$.path_string') as char(10) array)) range:[0x63,0x63], keep order:false, stats:pseudo - └─Selection(Probe) 3.32 cop[tikv] lt(planner__core__indexmerge_path.t.a, 10) - └─TableRowIDScan 10.00 cop[tikv] table:t keep order:false, stats:pseudo +Selection 23.98 root json_overlaps(json_extract(planner__core__indexmerge_path.t.j0, "$.path_string"), cast("["a", "b", "c"]", json BINARY)) +└─IndexMerge 9.96 root type: union + ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_string(cast(json_extract(`j0`, _utf8mb4'$.path_string') as char(10) array)) range:["a","a"], keep order:false, stats:pseudo + ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_string(cast(json_extract(`j0`, _utf8mb4'$.path_string') as char(10) array)) range:["b","b"], keep order:false, stats:pseudo + ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_string(cast(json_extract(`j0`, _utf8mb4'$.path_string') as char(10) array)) range:["c","c"], keep order:false, stats:pseudo + └─Selection(Probe) 9.96 cop[tikv] lt(planner__core__indexmerge_path.t.a, 10) + └─TableRowIDScan 29.97 cop[tikv] table:t keep order:false, stats:pseudo explain format = 'brief' select /*+ use_index_merge(t, j0_date) */ * from t where ("2023-01-01" member of (j0->'$.path_date')); id estRows task access object operator info TableReader 8000.00 root data:Selection @@ -238,76 +234,76 @@ TableReader 2658.67 root data:Selection └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo explain format = 'brief' select /*+ use_index_merge(t, j0_date) */ * from t where json_contains((j0->'$.path_date'), json_array(cast('2023-01-01' as date), cast('2023-01-02' as date), cast('2023-01-03' as date))); id estRows task access object operator info -IndexMerge 10.00 root type: intersection +IndexMerge 0.00 root type: intersection ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_date(cast(json_extract(`j0`, _utf8mb4'$.path_date') as date array)) range:[2023-01-01,2023-01-01], keep order:false, stats:pseudo ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_date(cast(json_extract(`j0`, _utf8mb4'$.path_date') as date array)) range:[2023-01-02,2023-01-02], keep order:false, stats:pseudo ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_date(cast(json_extract(`j0`, _utf8mb4'$.path_date') as date array)) range:[2023-01-03,2023-01-03], keep order:false, stats:pseudo -└─TableRowIDScan(Probe) 10.00 cop[tikv] table:t keep order:false, stats:pseudo +└─TableRowIDScan(Probe) 0.00 cop[tikv] table:t keep order:false, stats:pseudo explain format = 'brief' select /*+ use_index_merge(t, j0_date) */ * from t where json_contains((j0->'$.path_date'), json_array(cast('2023-01-01' as date), cast('2023-01-02' as date), cast('2023-01-03' as date))) and a<10; id estRows task access object operator info -IndexMerge 3.32 root type: intersection +IndexMerge 0.00 root type: intersection ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_date(cast(json_extract(`j0`, _utf8mb4'$.path_date') as date array)) range:[2023-01-01,2023-01-01], keep order:false, stats:pseudo ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_date(cast(json_extract(`j0`, _utf8mb4'$.path_date') as date array)) range:[2023-01-02,2023-01-02], keep order:false, stats:pseudo ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_date(cast(json_extract(`j0`, _utf8mb4'$.path_date') as date array)) range:[2023-01-03,2023-01-03], keep order:false, stats:pseudo -└─Selection(Probe) 3.32 cop[tikv] lt(planner__core__indexmerge_path.t.a, 10) - └─TableRowIDScan 10.00 cop[tikv] table:t keep order:false, stats:pseudo +└─Selection(Probe) 0.00 cop[tikv] lt(planner__core__indexmerge_path.t.a, 10) + └─TableRowIDScan 0.00 cop[tikv] table:t keep order:false, stats:pseudo explain format = 'brief' select /*+ use_index_merge(t, j0_date) */ * from t where json_overlaps((j0->'$.path_date'), json_array(cast('2023-01-01' as date), cast('2023-01-02' as date), cast('2023-01-03' as date))); id estRows task access object operator info -Selection 8.00 root json_overlaps(json_extract(planner__core__indexmerge_path.t.j0, "$.path_date"), json_array(cast(2023-01-01, json BINARY), cast(2023-01-02, json BINARY), cast(2023-01-03, json BINARY))) -└─IndexMerge 10.00 root type: union +Selection 23.98 root json_overlaps(json_extract(planner__core__indexmerge_path.t.j0, "$.path_date"), json_array(cast(2023-01-01, json BINARY), cast(2023-01-02, json BINARY), cast(2023-01-03, json BINARY))) +└─IndexMerge 29.97 root type: union ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_date(cast(json_extract(`j0`, _utf8mb4'$.path_date') as date array)) range:[2023-01-01,2023-01-01], keep order:false, stats:pseudo ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_date(cast(json_extract(`j0`, _utf8mb4'$.path_date') as date array)) range:[2023-01-02,2023-01-02], keep order:false, stats:pseudo ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_date(cast(json_extract(`j0`, _utf8mb4'$.path_date') as date array)) range:[2023-01-03,2023-01-03], keep order:false, stats:pseudo - └─TableRowIDScan(Probe) 10.00 cop[tikv] table:t keep order:false, stats:pseudo + └─TableRowIDScan(Probe) 29.97 cop[tikv] table:t keep order:false, stats:pseudo explain format = 'brief' select /*+ use_index_merge(t, j0_date) */ * from t where json_overlaps((j0->'$.path_date'), json_array(cast('2023-01-01' as date), cast('2023-01-02' as date), cast('2023-01-03' as date))) and a<10; id estRows task access object operator info -Selection 8.00 root json_overlaps(json_extract(planner__core__indexmerge_path.t.j0, "$.path_date"), json_array(cast(2023-01-01, json BINARY), cast(2023-01-02, json BINARY), cast(2023-01-03, json BINARY))) -└─IndexMerge 3.32 root type: union +Selection 23.98 root json_overlaps(json_extract(planner__core__indexmerge_path.t.j0, "$.path_date"), json_array(cast(2023-01-01, json BINARY), cast(2023-01-02, json BINARY), cast(2023-01-03, json BINARY))) +└─IndexMerge 9.96 root type: union ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_date(cast(json_extract(`j0`, _utf8mb4'$.path_date') as date array)) range:[2023-01-01,2023-01-01], keep order:false, stats:pseudo ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_date(cast(json_extract(`j0`, _utf8mb4'$.path_date') as date array)) range:[2023-01-02,2023-01-02], keep order:false, stats:pseudo ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:j0_date(cast(json_extract(`j0`, _utf8mb4'$.path_date') as date array)) range:[2023-01-03,2023-01-03], keep order:false, stats:pseudo - └─Selection(Probe) 3.32 cop[tikv] lt(planner__core__indexmerge_path.t.a, 10) - └─TableRowIDScan 10.00 cop[tikv] table:t keep order:false, stats:pseudo + └─Selection(Probe) 9.96 cop[tikv] lt(planner__core__indexmerge_path.t.a, 10) + └─TableRowIDScan 29.97 cop[tikv] table:t keep order:false, stats:pseudo drop table if exists t; create table t(a int, b int, c int, j json, index idx1((cast(j as signed array))), index idx2(a, b, (cast(j as signed array)), c)); explain format = 'brief' select /*+ use_index_merge(t, idx1) */ * from t where (1 member of (j)) or (2 member of (j)); id estRows task access object operator info -IndexMerge 10.00 root type: union +IndexMerge 19.99 root type: union ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:idx1(cast(`j` as signed array)) range:[1,1], keep order:false, stats:pseudo ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:idx1(cast(`j` as signed array)) range:[2,2], keep order:false, stats:pseudo -└─TableRowIDScan(Probe) 10.00 cop[tikv] table:t keep order:false, stats:pseudo +└─TableRowIDScan(Probe) 19.99 cop[tikv] table:t keep order:false, stats:pseudo explain format = 'brief' select /*+ use_index_merge(t, idx1) */ * from t where ((1 member of (j)) or (2 member of (j))) and (a > 10); id estRows task access object operator info -IndexMerge 3.33 root type: union +IndexMerge 6.66 root type: union ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:idx1(cast(`j` as signed array)) range:[1,1], keep order:false, stats:pseudo ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:idx1(cast(`j` as signed array)) range:[2,2], keep order:false, stats:pseudo -└─Selection(Probe) 3.33 cop[tikv] gt(planner__core__indexmerge_path.t.a, 10) - └─TableRowIDScan 10.00 cop[tikv] table:t keep order:false, stats:pseudo +└─Selection(Probe) 6.66 cop[tikv] gt(planner__core__indexmerge_path.t.a, 10) + └─TableRowIDScan 19.99 cop[tikv] table:t keep order:false, stats:pseudo explain format = 'brief' select /*+ use_index_merge(t, idx1) */ * from t where (json_overlaps(j, '[1, 2]')) or (json_overlaps(j, '[3, 4]')); id estRows task access object operator info -Selection 8.00 root or(json_overlaps(planner__core__indexmerge_path.t.j, cast("[1, 2]", json BINARY)), json_overlaps(planner__core__indexmerge_path.t.j, cast("[3, 4]", json BINARY))) -└─IndexMerge 10.00 root type: union +Selection 31.95 root or(json_overlaps(planner__core__indexmerge_path.t.j, cast("[1, 2]", json BINARY)), json_overlaps(planner__core__indexmerge_path.t.j, cast("[3, 4]", json BINARY))) +└─IndexMerge 39.94 root type: union ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:idx1(cast(`j` as signed array)) range:[1,1], keep order:false, stats:pseudo ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:idx1(cast(`j` as signed array)) range:[2,2], keep order:false, stats:pseudo ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:idx1(cast(`j` as signed array)) range:[3,3], keep order:false, stats:pseudo ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:idx1(cast(`j` as signed array)) range:[4,4], keep order:false, stats:pseudo - └─TableRowIDScan(Probe) 10.00 cop[tikv] table:t keep order:false, stats:pseudo + └─TableRowIDScan(Probe) 39.94 cop[tikv] table:t keep order:false, stats:pseudo explain format = 'brief' select /*+ use_index_merge(t, idx1) */ * from t where ((json_overlaps(j, '[1, 2]')) or (json_overlaps(j, '[3, 4]'))) and (a > 10); id estRows task access object operator info -Selection 8.00 root or(json_overlaps(planner__core__indexmerge_path.t.j, cast("[1, 2]", json BINARY)), json_overlaps(planner__core__indexmerge_path.t.j, cast("[3, 4]", json BINARY))) -└─IndexMerge 3.33 root type: union +Selection 31.95 root or(json_overlaps(planner__core__indexmerge_path.t.j, cast("[1, 2]", json BINARY)), json_overlaps(planner__core__indexmerge_path.t.j, cast("[3, 4]", json BINARY))) +└─IndexMerge 13.31 root type: union ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:idx1(cast(`j` as signed array)) range:[1,1], keep order:false, stats:pseudo ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:idx1(cast(`j` as signed array)) range:[2,2], keep order:false, stats:pseudo ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:idx1(cast(`j` as signed array)) range:[3,3], keep order:false, stats:pseudo ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:idx1(cast(`j` as signed array)) range:[4,4], keep order:false, stats:pseudo - └─Selection(Probe) 3.33 cop[tikv] gt(planner__core__indexmerge_path.t.a, 10) - └─TableRowIDScan 10.00 cop[tikv] table:t keep order:false, stats:pseudo + └─Selection(Probe) 13.31 cop[tikv] gt(planner__core__indexmerge_path.t.a, 10) + └─TableRowIDScan 39.94 cop[tikv] table:t keep order:false, stats:pseudo explain format = 'brief' select /*+ use_index_merge(t, idx1) */ * from t where (json_contains(j, '[1, 2]')) or (json_contains(j, '[3, 4]')); id estRows task access object operator info -TableReader 9600.00 root data:Selection -└─Selection 9600.00 cop[tikv] or(json_contains(planner__core__indexmerge_path.t.j, cast("[1, 2]", json BINARY)), json_contains(planner__core__indexmerge_path.t.j, cast("[3, 4]", json BINARY))) +TableReader 0.02 root data:Selection +└─Selection 0.02 cop[tikv] or(json_contains(planner__core__indexmerge_path.t.j, cast("[1, 2]", json BINARY)), json_contains(planner__core__indexmerge_path.t.j, cast("[3, 4]", json BINARY))) └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo explain format = 'brief' select /*+ use_index_merge(t, idx2) */ * from t where (a=1 and b=2 and (3 member of (j))) or (a=11 and b=12 and (13 member of (j))); id estRows task access object operator info @@ -344,34 +340,34 @@ IndexMerge 0.00 root type: union └─TableRowIDScan(Probe) 0.00 cop[tikv] table:t keep order:false, stats:pseudo explain format = 'brief' select /*+ use_index_merge(t, idx) */ * from t where a=1 and b=2; id estRows task access object operator info -IndexMerge 0.10 root type: union -├─IndexRangeScan(Build) 0.10 cop[tikv] table:t, index:idx(a, b, cast(`j` as signed array), c) range:[1 2,1 2], keep order:false, stats:pseudo -└─TableRowIDScan(Probe) 0.10 cop[tikv] table:t keep order:false, stats:pseudo +TableReader 0.01 root data:Selection +└─Selection 0.01 cop[tikv] eq(planner__core__indexmerge_path.t.a, 1), eq(planner__core__indexmerge_path.t.b, 2) + └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo explain format = 'brief' select /*+ use_index_merge(t, idx) */ * from t where a=1; id estRows task access object operator info -IndexMerge 10.00 root type: union -├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:idx(a, b, cast(`j` as signed array), c) range:[1,1], keep order:false, stats:pseudo -└─TableRowIDScan(Probe) 10.00 cop[tikv] table:t keep order:false, stats:pseudo +TableReader 10.00 root data:Selection +└─Selection 10.00 cop[tikv] eq(planner__core__indexmerge_path.t.a, 1) + └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo explain format = 'brief' select /*+ use_index_merge(t, idx2) */ * from t where a=1 and b=2 and ('3' member of (j->'$.str')) and c=4; id estRows task access object operator info IndexMerge 0.00 root type: union -├─IndexRangeScan(Build) 0.00 cop[tikv] table:t, index:idx2(a, b, cast(json_extract(`j`, _utf8mb4'$.str') as char(10) array), c) range:[1 2 0x33 4,1 2 0x33 4], keep order:false, stats:pseudo +├─IndexRangeScan(Build) 0.00 cop[tikv] table:t, index:idx2(a, b, cast(json_extract(`j`, _utf8mb4'$.str') as char(10) array), c) range:[1 2 "3" 4,1 2 "3" 4], keep order:false, stats:pseudo └─TableRowIDScan(Probe) 0.00 cop[tikv] table:t keep order:false, stats:pseudo explain format = 'brief' select /*+ use_index_merge(t, idx2) */ * from t where a=1 and b=2 and ('3' member of (j->'$.str')); id estRows task access object operator info IndexMerge 0.00 root type: union -├─IndexRangeScan(Build) 0.00 cop[tikv] table:t, index:idx2(a, b, cast(json_extract(`j`, _utf8mb4'$.str') as char(10) array), c) range:[1 2 0x33,1 2 0x33], keep order:false, stats:pseudo +├─IndexRangeScan(Build) 0.00 cop[tikv] table:t, index:idx2(a, b, cast(json_extract(`j`, _utf8mb4'$.str') as char(10) array), c) range:[1 2 "3",1 2 "3"], keep order:false, stats:pseudo └─TableRowIDScan(Probe) 0.00 cop[tikv] table:t keep order:false, stats:pseudo explain format = 'brief' select /*+ use_index_merge(t, idx2) */ * from t where a=1 and b=2; id estRows task access object operator info -IndexMerge 0.10 root type: union -├─IndexRangeScan(Build) 0.10 cop[tikv] table:t, index:idx(a, b, cast(`j` as signed array), c) range:[1 2,1 2], keep order:false, stats:pseudo -└─TableRowIDScan(Probe) 0.10 cop[tikv] table:t keep order:false, stats:pseudo +TableReader 0.01 root data:Selection +└─Selection 0.01 cop[tikv] eq(planner__core__indexmerge_path.t.a, 1), eq(planner__core__indexmerge_path.t.b, 2) + └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo explain format = 'brief' select /*+ use_index_merge(t, idx2) */ * from t where a=1; id estRows task access object operator info -IndexMerge 10.00 root type: union -├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:idx(a, b, cast(`j` as signed array), c) range:[1,1], keep order:false, stats:pseudo -└─TableRowIDScan(Probe) 10.00 cop[tikv] table:t keep order:false, stats:pseudo +TableReader 10.00 root data:Selection +└─Selection 10.00 cop[tikv] eq(planner__core__indexmerge_path.t.a, 1) + └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo explain format = 'brief' select /*+ use_index(t, idx) */ * from t where a=1 and b=2 and (3 member of (j)) and c=4; id estRows task access object operator info IndexMerge 0.00 root type: union @@ -384,14 +380,14 @@ IndexMerge 0.00 root type: union └─TableRowIDScan(Probe) 0.00 cop[tikv] table:t keep order:false, stats:pseudo explain format = 'brief' select /*+ use_index(t, idx) */ * from t where a=1 and b=2; id estRows task access object operator info -IndexMerge 0.10 root type: union -├─IndexRangeScan(Build) 0.10 cop[tikv] table:t, index:idx(a, b, cast(`j` as signed array), c) range:[1 2,1 2], keep order:false, stats:pseudo -└─TableRowIDScan(Probe) 0.10 cop[tikv] table:t keep order:false, stats:pseudo +TableReader 0.01 root data:Selection +└─Selection 0.01 cop[tikv] eq(planner__core__indexmerge_path.t.a, 1), eq(planner__core__indexmerge_path.t.b, 2) + └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo explain format = 'brief' select * from t use index(idx) where a=1; id estRows task access object operator info -IndexMerge 10.00 root type: union -├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:idx(a, b, cast(`j` as signed array), c) range:[1,1], keep order:false, stats:pseudo -└─TableRowIDScan(Probe) 10.00 cop[tikv] table:t keep order:false, stats:pseudo +TableReader 10.00 root data:Selection +└─Selection 10.00 cop[tikv] eq(planner__core__indexmerge_path.t.a, 1) + └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo explain format = 'brief' select * from t force index(idx) where a=1 and b=2 and (3 member of (j)); id estRows task access object operator info IndexMerge 0.00 root type: union @@ -399,15 +395,15 @@ IndexMerge 0.00 root type: union └─TableRowIDScan(Probe) 0.00 cop[tikv] table:t keep order:false, stats:pseudo explain format = 'brief' select * from t force index(idx) where a=1; id estRows task access object operator info -IndexMerge 10.00 root type: union -├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:idx(a, b, cast(`j` as signed array), c) range:[1,1], keep order:false, stats:pseudo -└─TableRowIDScan(Probe) 10.00 cop[tikv] table:t keep order:false, stats:pseudo +TableReader 10.00 root data:Selection +└─Selection 10.00 cop[tikv] eq(planner__core__indexmerge_path.t.a, 1) + └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo drop table if exists t; create table t(a int, j json, index i_int((cast(j->'$.int' as signed array)))); explain format = 'brief' select (j->'$.int') from t where (1 member of (j->'$.int')); id estRows task access object operator info -Projection 8000.00 root json_extract(planner__core__indexmerge_path.t.j, $.int)->Column#5 +Projection 10.00 root json_extract(planner__core__indexmerge_path.t.j, $.int)->Column#5 └─IndexMerge 10.00 root type: union ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:i_int(cast(json_extract(`j`, _utf8mb4'$.int') as signed array)) range:[1,1], keep order:false, stats:pseudo └─TableRowIDScan(Probe) 10.00 cop[tikv] table:t keep order:false, stats:pseudo @@ -424,53 +420,53 @@ IndexMerge 3.32 root type: union └─TableRowIDScan 10.00 cop[tikv] table:t keep order:false, stats:pseudo explain format = 'brief' select (j->'$.int') from t where json_contains((j->'$.int'), '[1, 2, 3]'); id estRows task access object operator info -Projection 8000.00 root json_extract(planner__core__indexmerge_path.t.j, $.int)->Column#5 -└─IndexMerge 10.00 root type: intersection +Projection 0.00 root json_extract(planner__core__indexmerge_path.t.j, $.int)->Column#5 +└─IndexMerge 0.00 root type: intersection ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:i_int(cast(json_extract(`j`, _utf8mb4'$.int') as signed array)) range:[1,1], keep order:false, stats:pseudo ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:i_int(cast(json_extract(`j`, _utf8mb4'$.int') as signed array)) range:[2,2], keep order:false, stats:pseudo ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:i_int(cast(json_extract(`j`, _utf8mb4'$.int') as signed array)) range:[3,3], keep order:false, stats:pseudo - └─TableRowIDScan(Probe) 10.00 cop[tikv] table:t keep order:false, stats:pseudo + └─TableRowIDScan(Probe) 0.00 cop[tikv] table:t keep order:false, stats:pseudo explain format = 'brief' select * from t where json_contains((j->'$.int'), '[1, 2, 3]'); id estRows task access object operator info -IndexMerge 10.00 root type: intersection +IndexMerge 0.00 root type: intersection ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:i_int(cast(json_extract(`j`, _utf8mb4'$.int') as signed array)) range:[1,1], keep order:false, stats:pseudo ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:i_int(cast(json_extract(`j`, _utf8mb4'$.int') as signed array)) range:[2,2], keep order:false, stats:pseudo ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:i_int(cast(json_extract(`j`, _utf8mb4'$.int') as signed array)) range:[3,3], keep order:false, stats:pseudo -└─TableRowIDScan(Probe) 10.00 cop[tikv] table:t keep order:false, stats:pseudo +└─TableRowIDScan(Probe) 0.00 cop[tikv] table:t keep order:false, stats:pseudo explain format = 'brief' select * from t where json_contains((j->'$.int'), '[1, 2, 3]') and a<10; id estRows task access object operator info -IndexMerge 3.32 root type: intersection +IndexMerge 0.00 root type: intersection ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:i_int(cast(json_extract(`j`, _utf8mb4'$.int') as signed array)) range:[1,1], keep order:false, stats:pseudo ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:i_int(cast(json_extract(`j`, _utf8mb4'$.int') as signed array)) range:[2,2], keep order:false, stats:pseudo ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:i_int(cast(json_extract(`j`, _utf8mb4'$.int') as signed array)) range:[3,3], keep order:false, stats:pseudo -└─Selection(Probe) 3.32 cop[tikv] lt(planner__core__indexmerge_path.t.a, 10) - └─TableRowIDScan 10.00 cop[tikv] table:t keep order:false, stats:pseudo +└─Selection(Probe) 0.00 cop[tikv] lt(planner__core__indexmerge_path.t.a, 10) + └─TableRowIDScan 0.00 cop[tikv] table:t keep order:false, stats:pseudo explain format = 'brief' select (j->'$.int') from t where json_overlaps((j->'$.int'), '[1, 2, 3]'); id estRows task access object operator info -Projection 8000.00 root json_extract(planner__core__indexmerge_path.t.j, $.int)->Column#5 -└─Selection 8000.00 root json_overlaps(json_extract(planner__core__indexmerge_path.t.j, "$.int"), cast("[1, 2, 3]", json BINARY)) - └─IndexMerge 10.00 root type: union +Projection 23.98 root json_extract(planner__core__indexmerge_path.t.j, $.int)->Column#5 +└─Selection 23.98 root json_overlaps(json_extract(planner__core__indexmerge_path.t.j, "$.int"), cast("[1, 2, 3]", json BINARY)) + └─IndexMerge 29.97 root type: union ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:i_int(cast(json_extract(`j`, _utf8mb4'$.int') as signed array)) range:[1,1], keep order:false, stats:pseudo ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:i_int(cast(json_extract(`j`, _utf8mb4'$.int') as signed array)) range:[2,2], keep order:false, stats:pseudo ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:i_int(cast(json_extract(`j`, _utf8mb4'$.int') as signed array)) range:[3,3], keep order:false, stats:pseudo - └─TableRowIDScan(Probe) 10.00 cop[tikv] table:t keep order:false, stats:pseudo + └─TableRowIDScan(Probe) 29.97 cop[tikv] table:t keep order:false, stats:pseudo explain format = 'brief' select * from t where json_overlaps((j->'$.int'), '[1, 2, 3]'); id estRows task access object operator info -Selection 8000.00 root json_overlaps(json_extract(planner__core__indexmerge_path.t.j, "$.int"), cast("[1, 2, 3]", json BINARY)) -└─IndexMerge 10.00 root type: union +Selection 23.98 root json_overlaps(json_extract(planner__core__indexmerge_path.t.j, "$.int"), cast("[1, 2, 3]", json BINARY)) +└─IndexMerge 29.97 root type: union ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:i_int(cast(json_extract(`j`, _utf8mb4'$.int') as signed array)) range:[1,1], keep order:false, stats:pseudo ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:i_int(cast(json_extract(`j`, _utf8mb4'$.int') as signed array)) range:[2,2], keep order:false, stats:pseudo ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:i_int(cast(json_extract(`j`, _utf8mb4'$.int') as signed array)) range:[3,3], keep order:false, stats:pseudo - └─TableRowIDScan(Probe) 10.00 cop[tikv] table:t keep order:false, stats:pseudo + └─TableRowIDScan(Probe) 29.97 cop[tikv] table:t keep order:false, stats:pseudo explain format = 'brief' select * from t where json_overlaps((j->'$.int'), '[1, 2, 3]') and a<10; id estRows task access object operator info -Selection 2658.67 root json_overlaps(json_extract(planner__core__indexmerge_path.t.j, "$.int"), cast("[1, 2, 3]", json BINARY)) -└─IndexMerge 3.32 root type: union +Selection 23.98 root json_overlaps(json_extract(planner__core__indexmerge_path.t.j, "$.int"), cast("[1, 2, 3]", json BINARY)) +└─IndexMerge 9.96 root type: union ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:i_int(cast(json_extract(`j`, _utf8mb4'$.int') as signed array)) range:[1,1], keep order:false, stats:pseudo ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:i_int(cast(json_extract(`j`, _utf8mb4'$.int') as signed array)) range:[2,2], keep order:false, stats:pseudo ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:i_int(cast(json_extract(`j`, _utf8mb4'$.int') as signed array)) range:[3,3], keep order:false, stats:pseudo - └─Selection(Probe) 3.32 cop[tikv] lt(planner__core__indexmerge_path.t.a, 10) - └─TableRowIDScan 10.00 cop[tikv] table:t keep order:false, stats:pseudo + └─Selection(Probe) 9.96 cop[tikv] lt(planner__core__indexmerge_path.t.a, 10) + └─TableRowIDScan 29.97 cop[tikv] table:t keep order:false, stats:pseudo drop table if exists t; create table t(j json, index kj((cast(j as signed array)))); prepare st from 'select /*+ use_index_merge(t, kj) */ * from t where (1 member of (j))'; @@ -503,11 +499,18 @@ TableReader_7 8000.00 root data:Selection_6 drop table if exists t; create table t(a int, j json, index kj((cast(j as signed array)))); explain format = 'brief' select /*+ use_index(t, kj) */ * from t; -Error 1815 (HY000): Internal : Can't find a proper physical plan for this query +id estRows task access object operator info +TableReader 10000.00 root data:TableFullScan +└─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo explain format = 'brief' select /*+ use_index(t, kj) */ a from t; -Error 1815 (HY000): Internal : Can't find a proper physical plan for this query +id estRows task access object operator info +TableReader 10000.00 root data:TableFullScan +└─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo explain format = 'brief' select /*+ use_index(t, kj) */ * from t where a<10; -Error 1815 (HY000): Internal : Can't find a proper physical plan for this query +id estRows task access object operator info +TableReader 3323.33 root data:Selection +└─Selection 3323.33 cop[tikv] lt(planner__core__indexmerge_path.t.a, 10) + └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo explain format = 'brief' select /*+ use_index(t, kj) */ * from t where (1 member of (j)); id estRows task access object operator info IndexMerge 10.00 root type: union @@ -520,7 +523,10 @@ IndexMerge 0.01 root type: union └─Selection(Probe) 0.01 cop[tikv] eq(planner__core__indexmerge_path.t.a, 10) └─TableRowIDScan 10.00 cop[tikv] table:t keep order:false, stats:pseudo explain format = 'brief' select /*+ use_index(t, kj) */ * from t where (1 member of (j)) or a=10; -Error 1815 (HY000): Internal : Can't find a proper physical plan for this query +id estRows task access object operator info +TableReader 19.99 root data:Selection +└─Selection 19.99 cop[tikv] or(json_memberof(cast(1, json BINARY), planner__core__indexmerge_path.t.j), eq(planner__core__indexmerge_path.t.a, 10)) + └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo explain format = 'brief' select /*+ use_index_merge(t, kj) */ * from t; id estRows task access object operator info TableReader 10000.00 root data:TableFullScan @@ -536,8 +542,8 @@ TableReader 3323.33 root data:Selection └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo explain format = 'brief' select /*+ use_index_merge(t, kj) */ * from t where (1 member of (j)) or a=10; id estRows task access object operator info -TableReader 8002.00 root data:Selection -└─Selection 8002.00 cop[tikv] or(json_memberof(cast(1, json BINARY), planner__core__indexmerge_path.t.j), eq(planner__core__indexmerge_path.t.a, 10)) +TableReader 19.99 root data:Selection +└─Selection 19.99 cop[tikv] or(json_memberof(cast(1, json BINARY), planner__core__indexmerge_path.t.j), eq(planner__core__indexmerge_path.t.a, 10)) └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo drop table if exists t; create table t(a int, j json, index kj((cast(j as signed array)))); @@ -549,13 +555,13 @@ IndexMerge 10.00 root type: union ALTER TABLE t ALTER INDEX kj INVISIBLE; explain format='brief' select /*+ use_index(t, kj) */ * from t where (1 member of (j)); id estRows task access object operator info -TableReader 8000.00 root data:Selection -└─Selection 8000.00 cop[tikv] json_memberof(cast(1, json BINARY), planner__core__indexmerge_path.t.j) +TableReader 10.00 root data:Selection +└─Selection 10.00 cop[tikv] json_memberof(cast(1, json BINARY), planner__core__indexmerge_path.t.j) └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo explain format='brief' select /*+ use_index_merge(t, kj) */ * from t where (1 member of (j)); id estRows task access object operator info -TableReader 8000.00 root data:Selection -└─Selection 8000.00 cop[tikv] json_memberof(cast(1, json BINARY), planner__core__indexmerge_path.t.j) +TableReader 10.00 root data:Selection +└─Selection 10.00 cop[tikv] json_memberof(cast(1, json BINARY), planner__core__indexmerge_path.t.j) └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo ALTER TABLE t ALTER INDEX kj VISIBLE; explain format='brief' select /*+ use_index(t, kj) */ * from t where (1 member of (j)); @@ -582,7 +588,8 @@ select /*+ use_index_merge(t, kj) */ count(*) from t where json_overlaps((j), '[ count(*) 2 select /*+ use_index(t, kj) */ count(*) from t; -Error 1815 (HY000): Internal : Can't find a proper physical plan for this query +count(*) +4 drop table if exists t; create table t(j json, index kj((cast(j as signed array)))); insert into t values ('[1]'); @@ -660,3 +667,75 @@ a 1 select /*+ use_index_merge(t, j0_0) */ a from t where ('1' member of (j0->'$.path0')); a +drop table if exists t; +create table t(a int, b int, c int, d json, index iad(a, (cast(d->'$.b' as signed array)))); +insert into t value(1,1,1, '{"b":[1,2,3,4]}'); +insert into t value(2,2,2, '{"b":[3,4,5,6]}'); +set tidb_analyze_version=2; +analyze table t; +explain select * from t use index (iad) where a = 1; +id estRows task access object operator info +TableReader_7 1.00 root data:Selection_6 +└─Selection_6 1.00 cop[tikv] eq(planner__core__indexmerge_path.t.a, 1) + └─TableFullScan_5 2.00 cop[tikv] table:t keep order:false +explain select * from t use index (iad) where a = 1 and (2 member of (d->'$.b')); +id estRows task access object operator info +IndexMerge_7 1.00 root type: union +├─IndexRangeScan_5(Build) 1.00 cop[tikv] table:t, index:iad(a, cast(json_extract(`d`, _utf8mb4'$.b') as signed array)) range:[1 2,1 2], keep order:false, stats:partial[d:unInitialized] +└─TableRowIDScan_6(Probe) 1.00 cop[tikv] table:t keep order:false, stats:partial[d:unInitialized] +drop table if exists t; +create table t(a int, d json, index iad(a, (cast(d->'$.b' as signed array)))); +insert into t value(1,'{"b":[]}'), (2,'{"b":[]}'); +select * from t use index (iad) where a = 1; +a d +1 {"b": []} +select * from t ignore index (iad) where a = 1; +a d +1 {"b": []} +drop table if exists t; +create table t (j json, key mvi( (cast(j as char(5) array)) ) ); +insert into t values ('[]'); +insert into t values ('["abc"]'); +select * from t use index (mvi) where json_contains(j, '[]'); +j +[] +["abc"] +select * from t ignore index (mvi) where json_contains(j, '[]'); +j +[] +["abc"] +drop table if exists t; +create table t(a int, b json); +insert into t value (1, '{"a":[1,2,3], "b": [2,3,4]}'); +analyze table t; +alter table t add index ibb( (cast(b->'$.b' as signed array)) ); +explain select /*+ use_index_merge(t) */ * from t where 10 member of (b->'$.b'); +id estRows task access object operator info +IndexMerge_7 1.00 root type: union +├─IndexRangeScan_5(Build) 1.00 cop[tikv] table:t, index:ibb(cast(json_extract(`b`, _utf8mb4'$.b') as signed array)) range:[10,10], keep order:false, stats:partial[ibb:missing, b:unInitialized] +└─TableRowIDScan_6(Probe) 1.00 cop[tikv] table:t keep order:false, stats:partial[ibb:missing, b:unInitialized] +drop table if exists t, t1; +create table t (j json, i bigint(20) not null primary key, key mvi((cast(j as unsigned array)))); +insert into t values ('[1,2,3]', 1); +explain format=brief select * from t force index(mvi) where isnull(i) or json_contains(j, '1'); +id estRows task access object operator info +IndexMerge 10.00 root type: union +├─TableFullScan(Build) 0.00 cop[tikv] table:t keep order:false, stats:pseudo +├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:mvi(cast(`j` as unsigned array)) range:[1,1], keep order:false, stats:pseudo +└─TableRowIDScan(Probe) 10.00 cop[tikv] table:t keep order:false, stats:pseudo +select * from t force index(mvi) where isnull(i) or json_contains(j, '1'); +j i +[1, 2, 3] 1 +create table t1 (j json, a bigint(20), b int, primary key(a,b), key mvi((cast(j as unsigned array)))); +explain format=brief select /*+ use_index_merge(t1, mvi, primary) */ * from t1 where a = 1 or json_contains(j, '1'); +id estRows task access object operator info +IndexMerge 19.99 root type: union +├─IndexRangeScan(Build) 10.00 cop[tikv] table:t1, index:PRIMARY(a, b) range:[1,1], keep order:false, stats:pseudo +├─IndexRangeScan(Build) 10.00 cop[tikv] table:t1, index:mvi(cast(`j` as unsigned array)) range:[1,1], keep order:false, stats:pseudo +└─TableRowIDScan(Probe) 19.99 cop[tikv] table:t1 keep order:false, stats:pseudo +explain format=brief select /*+ use_index_merge(t1, mvi, primary) */ * from t1 where (a = 1 and b = 2) or json_contains(j, '1'); +id estRows task access object operator info +IndexMerge 11.00 root type: union +├─IndexRangeScan(Build) 1.00 cop[tikv] table:t1, index:PRIMARY(a, b) range:[1 2,1 2], keep order:false, stats:pseudo +├─IndexRangeScan(Build) 10.00 cop[tikv] table:t1, index:mvi(cast(`j` as unsigned array)) range:[1,1], keep order:false, stats:pseudo +└─TableRowIDScan(Probe) 11.00 cop[tikv] table:t1 keep order:false, stats:pseudo diff --git a/tests/integrationtest/r/planner/core/integration.result b/tests/integrationtest/r/planner/core/integration.result index e6aa80d06ab11..1594c23d170e2 100644 --- a/tests/integrationtest/r/planner/core/integration.result +++ b/tests/integrationtest/r/planner/core/integration.result @@ -3421,13 +3421,13 @@ abc drop table if exists t; drop table if exists tbl_29711; CREATE TABLE `tbl_29711` (`col_250` text COLLATE utf8_unicode_ci NOT NULL,`col_251` enum('Alice','Bob','Charlie','David') COLLATE utf8_unicode_ci NOT NULL DEFAULT 'Charlie',PRIMARY KEY (`col_251`,`col_250`(1)) NONCLUSTERED); -explain format=brief select col_250,col_251 from tbl_29711 where col_251 between 'Bob' and 'David' order by col_250,col_251 limit 6; +explain format=brief select col_250,col_251 from tbl_29711 use index (primary) where col_251 between 'Bob' and 'David' order by col_250,col_251 limit 6; id estRows task access object operator info TopN 6.00 root planner__core__integration.tbl_29711.col_250, planner__core__integration.tbl_29711.col_251, offset:0, count:6 └─IndexLookUp 6.00 root - ├─IndexRangeScan(Build) 30.00 cop[tikv] table:tbl_29711, index:PRIMARY(col_251, col_250) range:["Bob","Bob"], ["Charlie","Charlie"], ["David","David"], keep order:false, stats:pseudo + ├─IndexRangeScan(Build) 250.00 cop[tikv] table:tbl_29711, index:PRIMARY(col_251, col_250) range:["Bob","David"], keep order:false, stats:pseudo └─TopN(Probe) 6.00 cop[tikv] planner__core__integration.tbl_29711.col_250, planner__core__integration.tbl_29711.col_251, offset:0, count:6 - └─TableRowIDScan 30.00 cop[tikv] table:tbl_29711 keep order:false, stats:pseudo + └─TableRowIDScan 250.00 cop[tikv] table:tbl_29711 keep order:false, stats:pseudo drop table if exists t29711; CREATE TABLE `t29711` (`a` varchar(10) DEFAULT NULL,`b` int(11) DEFAULT NULL,`c` int(11) DEFAULT NULL,KEY `ia` (`a`(2))); explain format=brief select * from t29711 use index (ia) order by a limit 10; @@ -4088,6 +4088,7 @@ select @@last_plan_from_binding; @@last_plan_from_binding 1 drop global binding for select * from t27949 where b=1; +set @@sql_select_limit=default; drop table if exists t1, t2; create table t1(a int, b int); create table t2(a int, b int); @@ -4169,10 +4170,9 @@ nwbk 8ue 13mdezixgcn ## For now tidb doesn't support push set type to TiKV, and column a is a set type, so we shouldn't generate a IndexMerge path. explain format='brief' select /*+ use_index_merge(t) */ * from t where a between 'e6yd' and 'z' or b <> '8ue'; id estRows task access object operator info -Limit 100.00 root offset:0, count:100 -└─Selection 100.00 root or(and(ge(planner__core__integration.t.a, "e6yd"), le(planner__core__integration.t.a, "z")), ne(planner__core__integration.t.b, "8ue")) - └─TableReader 100.00 root data:TableFullScan - └─TableFullScan 100.00 cop[tikv] table:t keep order:false, stats:pseudo +Selection 8000.00 root or(and(ge(planner__core__integration.t.a, "e6yd"), le(planner__core__integration.t.a, "z")), ne(planner__core__integration.t.b, "8ue")) +└─TableReader 10000.00 root data:TableFullScan + └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo drop table if exists planner__core__integration.first_range; create table planner__core__integration.first_range(p int not null, o tinyint not null, v int not null); insert into planner__core__integration.first_range (p, o, v) values (0, 0, 0), (1, 1, 1), (1, 2, 2), (1, 4, 4), (1, 8, 8), (2, 0, 0), (2, 3, 3), (2, 10, 10), (2, 13, 13), (2, 15, 15), (3, 1, 1), (3, 3, 3), (3, 5, 5), (3, 9, 9), (3, 15, 15), (3, 20, 20), (3, 31, 31); @@ -4222,3 +4222,133 @@ create table t1(c1 int); select * from t1 group by t1.c1 having count(1) > 1 order by count(1) limit 10; c1 set tidb_enable_ordered_result_mode = DEFAULT; +set tidb_cost_model_version=2; +drop view if exists v, v1, v2; +drop table if exists t, t1, t2, t3; +create table t(a int, b int); +create table t1(a int, b int); +create table t2(a int, b int); +create table t3(a int, b int); +create definer='root'@'localhost' view v as select t.a, t.b from t join (select count(*) as a from t1 join t2 join t3 where t1.b=t2.b and t2.a = t3.a group by t2.a) tt on t.a = tt.a; +create definer='root'@'localhost' view v1 as select t.a, t.b from t join (select count(*) as a from t1 join v on t1.b=v.b group by v.a) tt on t.a = tt.a; +create definer='root'@'localhost' view v2 as select t.a, t.b from t join (select count(*) as a from t1 join v1 on t1.b=v1.b group by v1.a) tt on t.a = tt.a; +select * from v2; +a b +select @@last_plan_from_binding; +@@last_plan_from_binding +0 +create global binding for select * from v2 using select /*+ qb_name(qb_v_2, v2.v1@sel_2 .v@sel_2 .@sel_2), merge_join(t1@qb_v_2), stream_agg(@qb_v_2), qb_name(qb_v_1, v2. v1@sel_2 .v@sel_2 .@sel_1), merge_join(t@qb_v_1) */ * from v2; +select * from v2; +a b +select @@last_plan_from_binding; +@@last_plan_from_binding +1 +show global bindings where original_sql like '%planner__core__integration%'; +Original_sql Bind_sql Default_db Status Create_time Update_time Charset Collation Source Sql_digest Plan_digest +select * from `planner__core__integration` . `v2` SELECT /*+ qb_name(`qb_v_2` , `v2`. `v1`@`sel_2`. `v`@`sel_2`. ``@`sel_2`) merge_join(`t1`@`qb_v_2`) stream_agg(@`qb_v_2`) qb_name(`qb_v_1` , `v2`. `v1`@`sel_2`. `v`@`sel_2`. ``@`sel_1`) merge_join(`t`@`qb_v_1`)*/ * FROM `planner__core__integration`.`v2` planner__core__integration enabled utf8mb4 utf8mb4_general_ci manual d1c36cc45519f8c3ec7ffd42ebcc49b1fe160d7a93e23d1568843517ac4009e6 +drop global binding for select * from v2; +select * from v2; +a b +select @@last_plan_from_binding; +@@last_plan_from_binding +0 +show global bindings where original_sql like '%planner__core__integration%'; +Original_sql Bind_sql Default_db Status Create_time Update_time Charset Collation Source Sql_digest Plan_digest +set tidb_cost_model_version=default; +set tidb_cost_model_version=2; +drop table if exists t1; +create table t1(a int, b int, index idx_a(a)); + +## create binding for order_index hint +select * from t1 where a<10 order by a limit 1; +a b +select @@last_plan_from_binding; +@@last_plan_from_binding +0 +create global binding for select * from t1 where a<10 order by a limit 1 using select /*+ order_index(t1, idx_a) */ * from t1 where a<10 order by a limit 1; +select * from t1 where a<10 order by a limit 1; +a b +select @@last_plan_from_binding; +@@last_plan_from_binding +1 +show global bindings where original_sql like '%planner__core__integration%'; +Original_sql Bind_sql Default_db Status Create_time Update_time Charset Collation Source Sql_digest Plan_digest +select * from `planner__core__integration` . `t1` where `a` < ? order by `a` limit ? SELECT /*+ order_index(`t1` `idx_a`)*/ * FROM `planner__core__integration`.`t1` WHERE `a` < 10 ORDER BY `a` LIMIT 1 planner__core__integration enabled utf8mb4 utf8mb4_general_ci manual d91fc2fee71140e271779ae603bf13e793040345ad88a8e6ab1d8a5cf313e3fb + +drop global binding for select * from t1 where a<10 order by a limit 1; +select * from t1 where a<10 order by a limit 1; +a b +select @@last_plan_from_binding; +@@last_plan_from_binding +0 +show global bindings where original_sql like '%planner__core__integration%'; +Original_sql Bind_sql Default_db Status Create_time Update_time Charset Collation Source Sql_digest Plan_digest + +## create binding for no_order_index hint +create global binding for select * from t1 where a<10 order by a limit 1 using select /*+ no_order_index(t1, idx_a) */ * from t1 where a<10 order by a limit 1; +select * from t1 where a<10 order by a limit 1; +a b +select @@last_plan_from_binding; +@@last_plan_from_binding +1 +show global bindings where original_sql like '%planner__core__integration%'; +Original_sql Bind_sql Default_db Status Create_time Update_time Charset Collation Source Sql_digest Plan_digest +select * from `planner__core__integration` . `t1` where `a` < ? order by `a` limit ? SELECT /*+ no_order_index(`t1` `idx_a`)*/ * FROM `planner__core__integration`.`t1` WHERE `a` < 10 ORDER BY `a` LIMIT 1 planner__core__integration enabled utf8mb4 utf8mb4_general_ci manual d91fc2fee71140e271779ae603bf13e793040345ad88a8e6ab1d8a5cf313e3fb + +drop global binding for select * from t1 where a<10 order by a limit 1; +select * from t1 where a<10 order by a limit 1; +a b +select @@last_plan_from_binding; +@@last_plan_from_binding +0 +show global bindings where original_sql like '%planner__core__integration%'; +Original_sql Bind_sql Default_db Status Create_time Update_time Charset Collation Source Sql_digest Plan_digest +set tidb_cost_model_version=default; +drop table if exists t; +set tidb_opt_fix_control='44262:ON'; +create table t (id int, c int) partition by range (id) (partition p0 values less than (4), partition p1 values less than (7)); +insert into t values(3, 3), (5, 5); +explain format = 'brief' select * from t where c = 1 and id = c; +id estRows task access object operator info +TableReader 0.01 root partition:p0 data:Selection +└─Selection 0.01 cop[tikv] eq(planner__core__integration.t.c, 1), eq(planner__core__integration.t.id, 1) + └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo +drop table if exists sbtest; +CREATE TABLE sbtest ( +id int(10) unsigned NOT NULL AUTO_INCREMENT, +k int(10) unsigned NOT NULL DEFAULT '0', +c char(120) NOT NULL DEFAULT '', +pad char(60) NOT NULL DEFAULT '', +PRIMARY KEY (id) /*T![clustered_index] CLUSTERED */, +KEY k (k) +); +set @@tidb_opt_fix_control = '46177:off'; +explain format='brief' select row_number() over(order by a.k) from (select * from sbtest where id<10) a; +id estRows task access object operator info +Projection 10.00 root Column#6->Column#7 +└─Window 10.00 root row_number()->Column#6 over(order by planner__core__integration.sbtest.k rows between current row and current row) + └─IndexReader 10.00 root index:Selection + └─Selection 10.00 cop[tikv] lt(planner__core__integration.sbtest.id, 10) + └─IndexFullScan 10000.00 cop[tikv] table:sbtest, index:k(k) keep order:true, stats:pseudo +explain format='brief' select /*+ stream_agg() */ count(1) from sbtest where id<1 group by k; +id estRows task access object operator info +StreamAgg 1.00 root group by:planner__core__integration.sbtest.k, funcs:count(Column#6)->Column#5 +└─IndexReader 1.00 root index:StreamAgg + └─StreamAgg 1.00 cop[tikv] group by:planner__core__integration.sbtest.k, funcs:count(1)->Column#6 + └─Selection 1.00 cop[tikv] lt(planner__core__integration.sbtest.id, 1) + └─IndexFullScan 10000.00 cop[tikv] table:sbtest, index:k(k) keep order:true, stats:pseudo +set @@tidb_opt_fix_control = '46177:on'; +explain format='brief' select row_number() over(order by a.k) from (select * from sbtest where id<10) a; +id estRows task access object operator info +Projection 10.00 root Column#6->Column#7 +└─Window 10.00 root row_number()->Column#6 over(order by planner__core__integration.sbtest.k rows between current row and current row) + └─Sort 10.00 root planner__core__integration.sbtest.k + └─TableReader 10.00 root data:TableRangeScan + └─TableRangeScan 10.00 cop[tikv] table:sbtest range:[0,10), keep order:false, stats:pseudo +explain format='brief' select /*+ stream_agg() */ count(1) from sbtest where id<1 group by k; +id estRows task access object operator info +StreamAgg 1.00 root group by:planner__core__integration.sbtest.k, funcs:count(1)->Column#5 +└─Sort 1.00 root planner__core__integration.sbtest.k + └─TableReader 1.00 root data:TableRangeScan + └─TableRangeScan 1.00 cop[tikv] table:sbtest range:[0,1), keep order:false, stats:pseudo +set @@tidb_opt_fix_control = default; diff --git a/tests/integrationtest/r/planner/core/integration_partition.result b/tests/integrationtest/r/planner/core/integration_partition.result index cde260e489166..a01bb11e95a97 100644 --- a/tests/integrationtest/r/planner/core/integration_partition.result +++ b/tests/integrationtest/r/planner/core/integration_partition.result @@ -1361,3 +1361,22 @@ select * from t where col1 = floor(202303); col1 202303 drop database issue42323; +drop database if exists list_partition_pri; +create database list_partition_pri; +use list_partition_pri; +set tidb_enable_list_partition = 1; +create table tlist (a int) partition by list (a) (partition p0 values in (0), partition p1 values in (1)); +drop user if exists 'priv_test'@'%'; +create user 'priv_test'@'%'; +grant select on list_partition_pri.tlist to 'priv_test'; +use list_partition_pri; +alter table tlist truncate partition p0; +Error 1142 (42000): ALTER command denied to user 'priv_test'@'%' for table 'tlist' +alter table tlist drop partition p0; +Error 1142 (42000): ALTER command denied to user 'priv_test'@'%' for table 'tlist' +alter table tlist add partition (partition p2 values in (2)); +Error 1142 (42000): ALTER command denied to user 'priv_test'@'%' for table 'tlist' +insert into tlist values (1); +Error 1142 (42000): INSERT command denied to user 'priv_test'@'%' for table 'tlist' +use planner__core__integration_partition; +set tidb_enable_list_partition = DEFAULT; diff --git a/tests/integrationtest/r/planner/core/issuetest/planner_issue.result b/tests/integrationtest/r/planner/core/issuetest/planner_issue.result index 5d95672abacb7..72bfff299b387 100644 --- a/tests/integrationtest/r/planner/core/issuetest/planner_issue.result +++ b/tests/integrationtest/r/planner/core/issuetest/planner_issue.result @@ -180,3 +180,155 @@ LEFT JOIN tmp3 c3 ON c3.id = '1'; id id 1 1 1 1 +drop table if exists t; +create table t(a int, b int); +set @@tidb_max_chunk_size = 32; +insert into t values(1, 1); +insert into t select a+1, a+1 from t; +insert into t select a+2, a+2 from t; +insert into t select a+4, a+4 from t; +insert into t select a+8, a+8 from t; +insert into t select a+16, a+16 from t; +insert into t select a+32, a+32 from t; +select a from (select 100 as a, 100 as b union all select * from t) t where b != 0; +a +100 +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 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +set @@tidb_max_chunk_size = default; +drop table if exists t1, t2; +create table t1(a varchar(20) collate utf8mb4_bin, index ia(a)); +insert into t1 value('测试'),('测试 '),('xxx '); +explain format = brief select *,length(a) from t1 where a like '测试 %'; +id estRows task access object operator info +Projection 250.00 root planner__core__issuetest__planner_issue.t1.a, length(planner__core__issuetest__planner_issue.t1.a)->Column#3 +└─UnionScan 250.00 root like(planner__core__issuetest__planner_issue.t1.a, "测试 %", 92) + └─IndexReader 250.00 root index:Selection + └─Selection 250.00 cop[tikv] like(planner__core__issuetest__planner_issue.t1.a, "测试 %", 92) + └─IndexRangeScan 250.00 cop[tikv] table:t1, index:ia(a) range:["测试","测试!"), keep order:false, stats:pseudo +explain format = brief select *,length(a) from t1 where a like '测试'; +id estRows task access object operator info +Projection 10.00 root planner__core__issuetest__planner_issue.t1.a, length(planner__core__issuetest__planner_issue.t1.a)->Column#3 +└─UnionScan 10.00 root like(planner__core__issuetest__planner_issue.t1.a, "测试", 92) + └─IndexReader 10.00 root index:Selection + └─Selection 10.00 cop[tikv] like(planner__core__issuetest__planner_issue.t1.a, "测试", 92) + └─IndexRangeScan 10.00 cop[tikv] table:t1, index:ia(a) range:["测试","测试"], keep order:false, stats:pseudo +select *,length(a) from t1 where a like '测试 %'; +a length(a) +测试 8 +select *,length(a) from t1 where a like '测试'; +a length(a) +测试 6 +explain format = brief select * from t1 use index (ia) where a like 'xxx_'; +id estRows task access object operator info +Projection 250.00 root planner__core__issuetest__planner_issue.t1.a +└─UnionScan 250.00 root like(planner__core__issuetest__planner_issue.t1.a, "xxx_", 92) + └─IndexReader 250.00 root index:Selection + └─Selection 250.00 cop[tikv] like(planner__core__issuetest__planner_issue.t1.a, "xxx_", 92) + └─IndexRangeScan 250.00 cop[tikv] table:t1, index:ia(a) range:["xxx","xxy"), keep order:false, stats:pseudo +select * from t1 use index (ia) where a like 'xxx_'; +a +xxx +create table t2(a varchar(20) collate gbk_chinese_ci, index ia(a)); +insert into t2 value('测试'),('测试 '); +explain format = brief select *,length(a) from t2 where a like '测试 %'; +id estRows task access object operator info +Projection 250.00 root planner__core__issuetest__planner_issue.t2.a, length(to_binary(planner__core__issuetest__planner_issue.t2.a))->Column#3 +└─UnionScan 250.00 root like(planner__core__issuetest__planner_issue.t2.a, "测试 %", 92) + └─IndexReader 250.00 root index:Selection + └─Selection 250.00 cop[tikv] like(planner__core__issuetest__planner_issue.t2.a, "测试 %", 92) + └─IndexRangeScan 250.00 cop[tikv] table:t2, index:ia(a) range:["\x89\a\xba%","\x89\a\xba%!"), keep order:false, stats:pseudo +explain format = brief select *,length(a) from t2 where a like '测试'; +id estRows task access object operator info +Projection 10.00 root planner__core__issuetest__planner_issue.t2.a, length(to_binary(planner__core__issuetest__planner_issue.t2.a))->Column#3 +└─UnionScan 10.00 root like(planner__core__issuetest__planner_issue.t2.a, "测试", 92) + └─IndexReader 10.00 root index:Selection + └─Selection 10.00 cop[tikv] like(planner__core__issuetest__planner_issue.t2.a, "测试", 92) + └─IndexRangeScan 10.00 cop[tikv] table:t2, index:ia(a) range:["\x89\a\xba%","\x89\a\xba%"], keep order:false, stats:pseudo +select *,length(a) from t2 where a like '测试 %'; +a length(a) +测试 6 +select *,length(a) from t2 where a like '测试'; +a length(a) +测试 4 +drop view if exists v1; +create view v1(id) as +with recursive cte(a) as (select 1 union select a+1 from cte where a<3) +select * from cte; +create table test2(id int,value int); +insert into test2 values(1,1),(2,2),(3,3),(4,4),(5,5); +update test2 +set value=0 +where test2.id in +( +select * from v1 +); +select * from test2; +id value +1 0 +2 0 +3 0 +4 4 +5 5 diff --git a/tests/integrationtest/r/planner/core/memtable_predicate_extractor.result b/tests/integrationtest/r/planner/core/memtable_predicate_extractor.result new file mode 100644 index 0000000000000..07edaaf17ef23 --- /dev/null +++ b/tests/integrationtest/r/planner/core/memtable_predicate_extractor.result @@ -0,0 +1,121 @@ +drop table if exists t, abclmn; +create table t(id int, abctime int,DATETIME_PRECISION int); +create table abclmn(a int); +select TABLE_NAME from information_schema.columns where table_schema = 'planner__core__memtable_predicate_extractor' and column_name like 'i%'; +TABLE_NAME +t +select TABLE_NAME from information_schema.columns where table_schema = 'PLANNER__CORE__MEMTABLE_PREDICATE_EXTRACTOR' and column_name like 'I%'; +TABLE_NAME +t +select TABLE_NAME from information_schema.columns where table_schema = 'PLANNER__CORE__MEMTABLE_PREDICATE_EXTRACTOR' and column_name like 'ID'; +TABLE_NAME +t +select TABLE_NAME from information_schema.columns where table_schema = 'PLANNER__CORE__MEMTABLE_PREDICATE_EXTRACTOR' and column_name like 'id'; +TABLE_NAME +t +select column_name from information_schema.columns where table_schema = 'PLANNER__CORE__MEMTABLE_PREDICATE_EXTRACTOR' and (column_name like 'i%' or column_name like '%d'); +column_name +id +select column_name from information_schema.columns where table_schema = 'PLANNER__CORE__MEMTABLE_PREDICATE_EXTRACTOR' and (column_name like 'abc%' and column_name like '%time'); +column_name +abctime +select TABLE_NAME, column_name from information_schema.columns where table_schema = 'PLANNER__CORE__MEMTABLE_PREDICATE_EXTRACTOR' and column_name like '%time'; +TABLE_NAME column_name +t abctime +describe t; +Field Type Null Key Default Extra +id int(11) YES NULL +abctime int(11) YES NULL +DATETIME_PRECISION int(11) YES NULL +describe t id; +Field Type Null Key Default Extra +id int(11) YES NULL +describe t ID; +Field Type Null Key Default Extra +id int(11) YES NULL +describe t 'I%'; +Error 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your TiDB version for the right syntax to use line 1 column 15 near "'I%';" +describe t I%; +Error 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your TiDB version for the right syntax to use line 1 column 13 near "%;" +show columns from t like 'abctime'; +Field Type Null Key Default Extra +abctime int(11) YES NULL +show columns from t like 'ABCTIME'; +Field Type Null Key Default Extra +abctime int(11) YES NULL +show columns from t like 'abc%'; +Field Type Null Key Default Extra +abctime int(11) YES NULL +show columns from t like 'ABC%'; +Field Type Null Key Default Extra +abctime int(11) YES NULL +show columns from t like '%ime'; +Field Type Null Key Default Extra +abctime int(11) YES NULL +show columns from t like '%IME'; +Field Type Null Key Default Extra +abctime int(11) YES NULL +show columns in t like '%ime'; +Field Type Null Key Default Extra +abctime int(11) YES NULL +show columns in t like '%IME'; +Field Type Null Key Default Extra +abctime int(11) YES NULL +show fields in t like '%ime'; +Field Type Null Key Default Extra +abctime int(11) YES NULL +show fields in t like '%IME'; +Field Type Null Key Default Extra +abctime int(11) YES NULL +show columns from t where field like '%time'; +Field Type Null Key Default Extra +abctime int(11) YES NULL +show columns from t where field = 'abctime'; +Field Type Null Key Default Extra +abctime int(11) YES NULL +show columns in t where field = 'abctime'; +Field Type Null Key Default Extra +abctime int(11) YES NULL +show fields from t where field = 'abctime'; +Field Type Null Key Default Extra +abctime int(11) YES NULL +show fields in t where field = 'abctime'; +Field Type Null Key Default Extra +abctime int(11) YES NULL +explain t; +Field Type Null Key Default Extra +id int(11) YES NULL +abctime int(11) YES NULL +DATETIME_PRECISION int(11) YES NULL +show columns from t like id; +Error 1054 (42S22): Unknown column 'id' in 'where clause' +show columns from t like `id`; +Error 1054 (42S22): Unknown column 'id' in 'where clause' +show tables like 't'; +Tables_in_planner__core__memtable_predicate_extractor (t) +t +show tables like 'T'; +Tables_in_planner__core__memtable_predicate_extractor (T) +t +show tables like 'ABCLMN'; +Tables_in_planner__core__memtable_predicate_extractor (ABCLMN) +abclmn +show tables like 'ABC%'; +Tables_in_planner__core__memtable_predicate_extractor (ABC%) +abclmn +show tables like '%lmn'; +Tables_in_planner__core__memtable_predicate_extractor (%lmn) +abclmn +show full tables like '%lmn'; +Tables_in_planner__core__memtable_predicate_extractor (%lmn) Table_type +abclmn BASE TABLE +show tables like T; +Error 1054 (42S22): Unknown column 't' in 'where clause' +show tables like `T`; +Error 1054 (42S22): Unknown column 't' in 'where clause' +drop table if exists _bar, bar; +create table _bar (id int); +create table bar (id int); +show tables like '\_%'; +Tables_in_planner__core__memtable_predicate_extractor (\_%) +_bar diff --git a/tests/integrationtest/r/planner/core/partition_pruner.result b/tests/integrationtest/r/planner/core/partition_pruner.result index b978eb7b6e696..43e7f20d79904 100644 --- a/tests/integrationtest/r/planner/core/partition_pruner.result +++ b/tests/integrationtest/r/planner/core/partition_pruner.result @@ -3643,3 +3643,50 @@ ID PARTITION_NO CREATE_TIME 1 200000 2022-12-29 2 200000 2023-01-01 drop database issue43459; +use planner__core__partition_pruner; +drop table if exists t; +create table t(a bigint unsigned) +PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (5086706), +PARTITION `p1` VALUES LESS THAN (7268292), +PARTITION `p2` VALUES LESS THAN (16545422), +PARTITION `p3` VALUES LESS THAN (9223372036854775810)); +desc select * from t where a BETWEEN -6895222 AND 3125507; +id estRows task access object operator info +TableReader_9 250.00 root data:Selection_8 +└─Selection_8 250.00 cop[tikv] ge(planner__core__partition_pruner.t.a, -6895222), le(planner__core__partition_pruner.t.a, 3125507) + └─TableFullScan_7 10000.00 cop[tikv] table:t, partition:p0 keep order:false, stats:pseudo +desc select * from t where a > 9223372036854775808; +id estRows task access object operator info +TableReader_9 3333.33 root data:Selection_8 +└─Selection_8 3333.33 cop[tikv] gt(planner__core__partition_pruner.t.a, 9223372036854775808) + └─TableFullScan_7 10000.00 cop[tikv] table:t, partition:p3 keep order:false, stats:pseudo +desc select * from t where a in (-6895222, 3125507, 9223372036854775809); +id estRows task access object operator info +PartitionUnion_9 40.00 root +├─TableReader_12 20.00 root data:Selection_11 +│ └─Selection_11 20.00 cop[tikv] in(planner__core__partition_pruner.t.a, -6895222, 3125507, 9223372036854775809) +│ └─TableFullScan_10 10000.00 cop[tikv] table:t, partition:p0 keep order:false, stats:pseudo +└─TableReader_15 20.00 root data:Selection_14 + └─Selection_14 20.00 cop[tikv] in(planner__core__partition_pruner.t.a, -6895222, 3125507, 9223372036854775809) + └─TableFullScan_13 10000.00 cop[tikv] table:t, partition:p3 keep order:false, stats:pseudo +drop table if exists t; +create table t(a bigint) +PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (5086706), +PARTITION `p1` VALUES LESS THAN (7268292), +PARTITION `p2` VALUES LESS THAN (16545422), +PARTITION `p3` VALUES LESS THAN (9223372036854775807)); +desc select * from t where a BETWEEN -6895222 AND 3125507; +id estRows task access object operator info +TableReader_9 250.00 root data:Selection_8 +└─Selection_8 250.00 cop[tikv] ge(planner__core__partition_pruner.t.a, -6895222), le(planner__core__partition_pruner.t.a, 3125507) + └─TableFullScan_7 10000.00 cop[tikv] table:t, partition:p0 keep order:false, stats:pseudo +desc select * from t where a > 9223372036854775808; +id estRows task access object operator info +TableDual_7 0.00 root rows:0 +desc select * from t where a in (-6895222, 3125507, 9223372036854775809); +id estRows task access object operator info +TableReader_9 8000.00 root data:Selection_8 +└─Selection_8 8000.00 cop[tikv] in(planner__core__partition_pruner.t.a, -6895222, 3125507, 9223372036854775809) + └─TableFullScan_7 10000.00 cop[tikv] table:t, partition:p0 keep order:false, stats:pseudo diff --git a/tests/integrationtest/r/planner/core/physical_plan.result b/tests/integrationtest/r/planner/core/physical_plan.result index 20f47876d58ec..5e7476f38c566 100644 --- a/tests/integrationtest/r/planner/core/physical_plan.result +++ b/tests/integrationtest/r/planner/core/physical_plan.result @@ -39,3 +39,41 @@ explain format = 'brief' select * from (select * from t1 order by a) tmp; id estRows task access object operator info TableReader 10000.00 root data:TableFullScan └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +set tidb_cost_model_version=2; +drop table if exists t, t1, t2, t3; +create table t(a int, b int, key(a)); +create table t1(a int, b int, key(a)); +create table t2(a int, b int, key(a)); +create table t3(a int, b int, key(a)); +select * from t1 join t2 on t1.a=t2.a join t3 on t2.b=t3.b; +a b a b a b +select @@last_plan_from_binding; +@@last_plan_from_binding +0 +create global binding for select * from t1 join t2 on t1.a=t2.a join t3 on t2.b=t3.b using select /*+ hash_join_build(t1) */ * from t1 join t2 on t1.a=t2.a join t3 on t2.b=t3.b; +select * from t1 join t2 on t1.a=t2.a join t3 on t2.b=t3.b; +a b a b a b +select @@last_plan_from_binding; +@@last_plan_from_binding +1 +show global bindings where original_sql like '%planner__core__physical_plan%'; +Original_sql Bind_sql Default_db Status Create_time Update_time Charset Collation Source Sql_digest Plan_digest +select * from ( `planner__core__physical_plan` . `t1` join `planner__core__physical_plan` . `t2` on `t1` . `a` = `t2` . `a` ) join `planner__core__physical_plan` . `t3` on `t2` . `b` = `t3` . `b` SELECT /*+ hash_join_build(`t1`)*/ * FROM (`planner__core__physical_plan`.`t1` JOIN `planner__core__physical_plan`.`t2` ON `t1`.`a` = `t2`.`a`) JOIN `planner__core__physical_plan`.`t3` ON `t2`.`b` = `t3`.`b` planner__core__physical_plan enabled utf8mb4 utf8mb4_general_ci manual ac0814c7f1fc1102b1622bb8b8d084931aa2352d5c0deb30034c63b6f4e2b28e +create global binding for select * from t1 join t2 on t1.a=t2.a join t3 on t2.b=t3.b using select /*+ hash_join_probe(t1) */ * from t1 join t2 on t1.a=t2.a join t3 on t2.b=t3.b; +select * from t1 join t2 on t1.a=t2.a join t3 on t2.b=t3.b; +a b a b a b +select @@last_plan_from_binding; +@@last_plan_from_binding +1 +show global bindings where original_sql like '%planner__core__physical_plan%'; +Original_sql Bind_sql Default_db Status Create_time Update_time Charset Collation Source Sql_digest Plan_digest +select * from ( `planner__core__physical_plan` . `t1` join `planner__core__physical_plan` . `t2` on `t1` . `a` = `t2` . `a` ) join `planner__core__physical_plan` . `t3` on `t2` . `b` = `t3` . `b` SELECT /*+ hash_join_probe(`t1`)*/ * FROM (`planner__core__physical_plan`.`t1` JOIN `planner__core__physical_plan`.`t2` ON `t1`.`a` = `t2`.`a`) JOIN `planner__core__physical_plan`.`t3` ON `t2`.`b` = `t3`.`b` planner__core__physical_plan enabled utf8mb4 utf8mb4_general_ci manual ac0814c7f1fc1102b1622bb8b8d084931aa2352d5c0deb30034c63b6f4e2b28e +drop global binding for select * from t1 join t2 on t1.a=t2.a join t3 on t2.b=t3.b; +select * from t1 join t2 on t1.a=t2.a join t3 on t2.b=t3.b; +a b a b a b +select @@last_plan_from_binding; +@@last_plan_from_binding +0 +show global bindings where original_sql like '%planner__core__physical_plan%'; +Original_sql Bind_sql Default_db Status Create_time Update_time Charset Collation Source Sql_digest Plan_digest +set tidb_cost_model_version=DEFAULT; diff --git a/tests/integrationtest/r/planner/core/plan.result b/tests/integrationtest/r/planner/core/plan.result index 76bee6627810d..9d06bcb39cde9 100644 --- a/tests/integrationtest/r/planner/core/plan.result +++ b/tests/integrationtest/r/planner/core/plan.result @@ -137,8 +137,9 @@ CREATE TABLE `t1` ( `a` varchar(10) DEFAULT NULL, `b` varchar(10) DEFAULT NULL explain format='brief' select * from t1 where concat(a, b) like "aadwa" and a = "a"; id estRows task access object operator info Projection 0.10 root planner__core__plan.t1.a, planner__core__plan.t1.b -└─IndexReader 0.10 root index:IndexRangeScan - └─IndexRangeScan 0.10 cop[tikv] table:t1, index:idx2(a, concat(`a`, `b`), b) range:["a" "aadwa","a" "aadwa"], keep order:false, stats:pseudo +└─IndexReader 0.10 root index:Selection + └─Selection 0.10 cop[tikv] like(concat(planner__core__plan.t1.a, planner__core__plan.t1.b), "aadwa", 92) + └─IndexRangeScan 0.10 cop[tikv] table:t1, index:idx2(a, concat(`a`, `b`), b) range:["a" "aadwa","a" "aadwa"], keep order:false, stats:pseudo explain format='brief' select b from t1 where concat(a, b) >= "aa" and a = "b"; id estRows task access object operator info Projection 33.33 root planner__core__plan.t1.b @@ -147,8 +148,9 @@ Projection 33.33 root planner__core__plan.t1.b explain format='brief' select * from t1 where concat(a, b) like "aadwa" and a = "a"; id estRows task access object operator info Projection 0.10 root planner__core__plan.t1.a, planner__core__plan.t1.b -└─IndexReader 0.10 root index:IndexRangeScan - └─IndexRangeScan 0.10 cop[tikv] table:t1, index:idx2(a, concat(`a`, `b`), b) range:["a" "aadwa","a" "aadwa"], keep order:false, stats:pseudo +└─IndexReader 0.10 root index:Selection + └─Selection 0.10 cop[tikv] like(concat(planner__core__plan.t1.a, planner__core__plan.t1.b), "aadwa", 92) + └─IndexRangeScan 0.10 cop[tikv] table:t1, index:idx2(a, concat(`a`, `b`), b) range:["a" "aadwa","a" "aadwa"], keep order:false, stats:pseudo explain format='brief' select b from t1 where concat(a, b) >= "aa" and a = "b"; id estRows task access object operator info Projection 33.33 root planner__core__plan.t1.b @@ -157,8 +159,9 @@ Projection 33.33 root planner__core__plan.t1.b explain format='brief' select * from t1 where concat(a, b) like "aadwa" and a = "a"; id estRows task access object operator info Projection 0.10 root planner__core__plan.t1.a, planner__core__plan.t1.b -└─IndexReader 0.10 root index:IndexRangeScan - └─IndexRangeScan 0.10 cop[tikv] table:t1, index:idx2(a, concat(`a`, `b`), b) range:["a" "aadwa","a" "aadwa"], keep order:false, stats:pseudo +└─IndexReader 0.10 root index:Selection + └─Selection 0.10 cop[tikv] like(concat(planner__core__plan.t1.a, planner__core__plan.t1.b), "aadwa", 92) + └─IndexRangeScan 0.10 cop[tikv] table:t1, index:idx2(a, concat(`a`, `b`), b) range:["a" "aadwa","a" "aadwa"], keep order:false, stats:pseudo explain format='brief' select b from t1 where concat(a, b) >= "aa" and a = "b"; id estRows task access object operator info Projection 33.33 root planner__core__plan.t1.b @@ -167,8 +170,9 @@ Projection 33.33 root planner__core__plan.t1.b explain format='brief' select * from t1 where concat(a, b) like "aadwa" and a = "a"; id estRows task access object operator info Projection 0.10 root planner__core__plan.t1.a, planner__core__plan.t1.b -└─IndexReader 0.10 root index:IndexRangeScan - └─IndexRangeScan 0.10 cop[tikv] table:t1, index:idx2(a, concat(`a`, `b`), b) range:["a" "aadwa","a" "aadwa"], keep order:false, stats:pseudo +└─IndexReader 0.10 root index:Selection + └─Selection 0.10 cop[tikv] like(concat(planner__core__plan.t1.a, planner__core__plan.t1.b), "aadwa", 92) + └─IndexRangeScan 0.10 cop[tikv] table:t1, index:idx2(a, concat(`a`, `b`), b) range:["a" "aadwa","a" "aadwa"], keep order:false, stats:pseudo explain format='brief' select b from t1 where concat(a, b) >= "aa" and a = "b"; id estRows task access object operator info Projection 33.33 root planner__core__plan.t1.b @@ -177,8 +181,9 @@ Projection 33.33 root planner__core__plan.t1.b explain format='brief' select * from t1 where concat(a, b) like "aadwa" and a = "a"; id estRows task access object operator info Projection 0.10 root planner__core__plan.t1.a, planner__core__plan.t1.b -└─IndexReader 0.10 root index:IndexRangeScan - └─IndexRangeScan 0.10 cop[tikv] table:t1, index:idx2(a, concat(`a`, `b`), b) range:["a" "aadwa","a" "aadwa"], keep order:false, stats:pseudo +└─IndexReader 0.10 root index:Selection + └─Selection 0.10 cop[tikv] like(concat(planner__core__plan.t1.a, planner__core__plan.t1.b), "aadwa", 92) + └─IndexRangeScan 0.10 cop[tikv] table:t1, index:idx2(a, concat(`a`, `b`), b) range:["a" "aadwa","a" "aadwa"], keep order:false, stats:pseudo explain format='brief' select b from t1 where concat(a, b) >= "aa" and a = "b"; id estRows task access object operator info Projection 33.33 root planner__core__plan.t1.b @@ -187,8 +192,9 @@ Projection 33.33 root planner__core__plan.t1.b explain format='brief' select * from t1 where concat(a, b) like "aadwa" and a = "a"; id estRows task access object operator info Projection 0.10 root planner__core__plan.t1.a, planner__core__plan.t1.b -└─IndexReader 0.10 root index:IndexRangeScan - └─IndexRangeScan 0.10 cop[tikv] table:t1, index:idx2(a, concat(`a`, `b`), b) range:["a" "aadwa","a" "aadwa"], keep order:false, stats:pseudo +└─IndexReader 0.10 root index:Selection + └─Selection 0.10 cop[tikv] like(concat(planner__core__plan.t1.a, planner__core__plan.t1.b), "aadwa", 92) + └─IndexRangeScan 0.10 cop[tikv] table:t1, index:idx2(a, concat(`a`, `b`), b) range:["a" "aadwa","a" "aadwa"], keep order:false, stats:pseudo explain format='brief' select b from t1 where concat(a, b) >= "aa" and a = "b"; id estRows task access object operator info Projection 33.33 root planner__core__plan.t1.b @@ -197,8 +203,9 @@ Projection 33.33 root planner__core__plan.t1.b explain format='brief' select * from t1 where concat(a, b) like "aadwa" and a = "a"; id estRows task access object operator info Projection 0.10 root planner__core__plan.t1.a, planner__core__plan.t1.b -└─IndexReader 0.10 root index:IndexRangeScan - └─IndexRangeScan 0.10 cop[tikv] table:t1, index:idx2(a, concat(`a`, `b`), b) range:["a" "aadwa","a" "aadwa"], keep order:false, stats:pseudo +└─IndexReader 0.10 root index:Selection + └─Selection 0.10 cop[tikv] like(concat(planner__core__plan.t1.a, planner__core__plan.t1.b), "aadwa", 92) + └─IndexRangeScan 0.10 cop[tikv] table:t1, index:idx2(a, concat(`a`, `b`), b) range:["a" "aadwa","a" "aadwa"], keep order:false, stats:pseudo explain format='brief' select b from t1 where concat(a, b) >= "aa" and a = "b"; id estRows task access object operator info Projection 33.33 root planner__core__plan.t1.b @@ -207,8 +214,9 @@ Projection 33.33 root planner__core__plan.t1.b explain format='brief' select * from t1 where concat(a, b) like "aadwa" and a = "a"; id estRows task access object operator info Projection 0.10 root planner__core__plan.t1.a, planner__core__plan.t1.b -└─IndexReader 0.10 root index:IndexRangeScan - └─IndexRangeScan 0.10 cop[tikv] table:t1, index:idx2(a, concat(`a`, `b`), b) range:["a" "aadwa","a" "aadwa"], keep order:false, stats:pseudo +└─IndexReader 0.10 root index:Selection + └─Selection 0.10 cop[tikv] like(concat(planner__core__plan.t1.a, planner__core__plan.t1.b), "aadwa", 92) + └─IndexRangeScan 0.10 cop[tikv] table:t1, index:idx2(a, concat(`a`, `b`), b) range:["a" "aadwa","a" "aadwa"], keep order:false, stats:pseudo explain format='brief' select b from t1 where concat(a, b) >= "aa" and a = "b"; id estRows task access object operator info Projection 33.33 root planner__core__plan.t1.b @@ -217,8 +225,9 @@ Projection 33.33 root planner__core__plan.t1.b explain format='brief' select * from t1 where concat(a, b) like "aadwa" and a = "a"; id estRows task access object operator info Projection 0.10 root planner__core__plan.t1.a, planner__core__plan.t1.b -└─IndexReader 0.10 root index:IndexRangeScan - └─IndexRangeScan 0.10 cop[tikv] table:t1, index:idx2(a, concat(`a`, `b`), b) range:["a" "aadwa","a" "aadwa"], keep order:false, stats:pseudo +└─IndexReader 0.10 root index:Selection + └─Selection 0.10 cop[tikv] like(concat(planner__core__plan.t1.a, planner__core__plan.t1.b), "aadwa", 92) + └─IndexRangeScan 0.10 cop[tikv] table:t1, index:idx2(a, concat(`a`, `b`), b) range:["a" "aadwa","a" "aadwa"], keep order:false, stats:pseudo explain format='brief' select b from t1 where concat(a, b) >= "aa" and a = "b"; id estRows task access object operator info Projection 33.33 root planner__core__plan.t1.b @@ -227,8 +236,9 @@ Projection 33.33 root planner__core__plan.t1.b explain format='brief' select * from t1 where concat(a, b) like "aadwa" and a = "a"; id estRows task access object operator info Projection 0.10 root planner__core__plan.t1.a, planner__core__plan.t1.b -└─IndexReader 0.10 root index:IndexRangeScan - └─IndexRangeScan 0.10 cop[tikv] table:t1, index:idx2(a, concat(`a`, `b`), b) range:["a" "aadwa","a" "aadwa"], keep order:false, stats:pseudo +└─IndexReader 0.10 root index:Selection + └─Selection 0.10 cop[tikv] like(concat(planner__core__plan.t1.a, planner__core__plan.t1.b), "aadwa", 92) + └─IndexRangeScan 0.10 cop[tikv] table:t1, index:idx2(a, concat(`a`, `b`), b) range:["a" "aadwa","a" "aadwa"], keep order:false, stats:pseudo explain format='brief' select b from t1 where concat(a, b) >= "aa" and a = "b"; id estRows task access object operator info Projection 33.33 root planner__core__plan.t1.b @@ -424,3 +434,22 @@ fcbpdt fcbpsq procst cipstx cipsst dyngtg blncdt 20230925 12023092502158016 1 CI010000 ACSC EAYT 20230925 EXPLAIN FORMAT = TRADITIONAL ((VALUES ROW ()) ORDER BY 1); Error 1051 (42S02): Unknown table '' +drop table if exists p, t; +create table p (id int, c int, key i_id(id), key i_c(c)); +create table t (id int); +insert into p values (3,3), (4,4), (6,6), (9,9); +insert into t values (4), (9); +select /*+ INL_JOIN(p) */ * from p, t where p.id = t.id; +id c id +4 4 4 +9 9 9 +explain analyze format='brief' select /*+ INL_JOIN(p) */ * from p, t where p.id = t.id; +id estRows actRows task access object execution info operator info memory disk +IndexJoin 12487.50 2 root +├─TableReader(Build) 9990.00 2 root +│ └─Selection 9990.00 2 cop[tikv] +│ └─TableFullScan 10000.00 2 cop[tikv] +└─IndexLookUp(Probe) 12487.50 2 root + ├─Selection(Build) 12487.50 2 cop[tikv] + │ └─IndexRangeScan 12500.00 2 cop[tikv] + └─TableRowIDScan(Probe) 12487.50 2 cop[tikv] diff --git a/tests/integrationtest/r/planner/core/plan_cost_ver2.result b/tests/integrationtest/r/planner/core/plan_cost_ver2.result index 13e276f5444f1..5b692f8cbfded 100644 --- a/tests/integrationtest/r/planner/core/plan_cost_ver2.result +++ b/tests/integrationtest/r/planner/core/plan_cost_ver2.result @@ -247,3 +247,14 @@ Limit_9 0.17 root offset:0, count:100000 └─Limit_21(Probe) 0.17 cop[tikv] offset:0, count:100000 └─Selection_16 0.17 cop[tikv] eq(planner__core__plan_cost_ver2.t.c, 20), ne(planner__core__plan_cost_ver2.t.b, 200) └─TableRowIDScan_15 250.00 cop[tikv] table:t keep order:false, stats:pseudo +drop table if exists t; +create table t (a int); +set @@tidb_cost_model_version=2; +explain format='true_card_cost' select * from t; +Error 1105 (HY000): 'explain format=true_card_cost' cannot work without 'analyze', please use 'explain analyze format=true_card_cost' +explain analyze format='true_card_cost' select * from t where a<3; +id estRows estCost costFormula actRows task access object execution info operator info memory disk +TableReader_7 3323.33 0.00 (((cpu(0*filters(1)*tikv_cpu_factor(49.9))) + (scan(0*logrowsize(32)*tikv_scan_factor(40.7)))) + (net(0*rowsize(16)*tidb_kv_net_factor(3.96))))/15.00 0 root +└─Selection_6 3323.33 0.00 (cpu(0*filters(1)*tikv_cpu_factor(49.9))) + (scan(0*logrowsize(32)*tikv_scan_factor(40.7))) 0 cop[tikv] + └─TableFullScan_5 10000.00 0.00 scan(0*logrowsize(32)*tikv_scan_factor(40.7)) 0 cop[tikv] table:t +set @@tidb_cost_model_version=DEFAULT; diff --git a/tests/integrationtest/r/planner/core/point_get_plan.result b/tests/integrationtest/r/planner/core/point_get_plan.result index 13d2d97ba1985..005a81660da99 100644 --- a/tests/integrationtest/r/planner/core/point_get_plan.result +++ b/tests/integrationtest/r/planner/core/point_get_plan.result @@ -586,3 +586,36 @@ select * from t2 where col1 = 0x000039; COL1 9 drop table t1, t2; +drop table if exists fu; +create table fu (id int primary key, val int); +insert into fu values (6, 6); +explain format = 'brief' select * from fu where id = 6 for update; +id estRows task access object operator info +Point_Get 1.00 root table:fu handle:6 +select * from fu where id = 6 for update; +id val +6 6 +begin; +explain format = 'brief' select * from fu where id = 6 for update; +id estRows task access object operator info +Point_Get 1.00 root table:fu handle:6, lock +select * from fu where id = 6 for update; +id val +6 6 +rollback; +set @@session.autocommit = 0; +explain format = 'brief' select * from fu where id = 6 for update; +id estRows task access object operator info +Point_Get 1.00 root table:fu handle:6, lock +select * from fu where id = 6 for update; +id val +6 6 +rollback; +set @@session.autocommit = default; +drop table if exists tbllock; +create table tbllock(id int, c int); +insert into tbllock values(1, 2), (2, 2); +lock table tbllock read; +update tbllock set c = 3 where id = 2; +Error 1099 (HY000): Table 'tbllock' was locked with a READ lock and can't be updated +unlock tables; diff --git a/tests/integrationtest/r/planner/core/range_scan_for_like.result b/tests/integrationtest/r/planner/core/range_scan_for_like.result new file mode 100644 index 0000000000000..058de729e4589 --- /dev/null +++ b/tests/integrationtest/r/planner/core/range_scan_for_like.result @@ -0,0 +1,1035 @@ +create table t(a varchar(20) collate utf8mb4_general_ci, index ia(a)); +insert into t value('测试'),('测试Abc'),('测试 '),('你好'),('aABBccdd'),('Aa'),(''),(' '),(' '),(' 语言'),(' 语 言 '),('测测试 '),('测测试 '),(NULL); +explain select *, length(a) from t use index (ia) where a like '测试%' order by a,_tidb_rowid; +id estRows task access object operator info +Projection_6 250.00 root planner__core__range_scan_for_like.t.a, Column#3->Column#5 +└─Projection_13 250.00 root planner__core__range_scan_for_like.t.a, length(planner__core__range_scan_for_like.t.a)->Column#3, planner__core__range_scan_for_like.t._tidb_rowid + └─IndexReader_16 250.00 root index:Selection_15 + └─Selection_15 250.00 cop[tikv] like(planner__core__range_scan_for_like.t.a, "测试%", 92) + └─IndexRangeScan_14 250.00 cop[tikv] table:t, index:ia(a) range:["mK\x8b\xd5","mK\x8b\xd6"), keep order:true, stats:pseudo +select *, length(a) from t use index (ia) where a like '测试%' order by a,_tidb_rowid; +a length(a) +测试 6 +测试 11 +测试Abc 9 +explain select *, length(a) from t use index (ia) where a like '测%%' order by a,_tidb_rowid; +id estRows task access object operator info +Projection_6 250.00 root planner__core__range_scan_for_like.t.a, Column#3->Column#5 +└─Projection_13 250.00 root planner__core__range_scan_for_like.t.a, length(planner__core__range_scan_for_like.t.a)->Column#3, planner__core__range_scan_for_like.t._tidb_rowid + └─IndexReader_16 250.00 root index:Selection_15 + └─Selection_15 250.00 cop[tikv] like(planner__core__range_scan_for_like.t.a, "测%%", 92) + └─IndexRangeScan_14 250.00 cop[tikv] table:t, index:ia(a) range:["mK","mL"), keep order:true, stats:pseudo +select *, length(a) from t use index (ia) where a like '测%%' order by a,_tidb_rowid; +a length(a) +测测试 10 +测测试 13 +测试 6 +测试 11 +测试Abc 9 +explain select *, length(a) from t use index (ia) where a like '测%%试' order by a,_tidb_rowid; +id estRows task access object operator info +Projection_6 250.00 root planner__core__range_scan_for_like.t.a, Column#3->Column#5 +└─Projection_13 250.00 root planner__core__range_scan_for_like.t.a, length(planner__core__range_scan_for_like.t.a)->Column#3, planner__core__range_scan_for_like.t._tidb_rowid + └─IndexReader_16 250.00 root index:Selection_15 + └─Selection_15 250.00 cop[tikv] like(planner__core__range_scan_for_like.t.a, "测%%试", 92) + └─IndexRangeScan_14 250.00 cop[tikv] table:t, index:ia(a) range:["mK","mL"), keep order:true, stats:pseudo +select *, length(a) from t use index (ia) where a like '测%%试' order by a,_tidb_rowid; +a length(a) +测试 6 +explain select *, length(a) from t use index (ia) where a like '测试%%' order by a,_tidb_rowid; +id estRows task access object operator info +Projection_6 250.00 root planner__core__range_scan_for_like.t.a, Column#3->Column#5 +└─Projection_13 250.00 root planner__core__range_scan_for_like.t.a, length(planner__core__range_scan_for_like.t.a)->Column#3, planner__core__range_scan_for_like.t._tidb_rowid + └─IndexReader_16 250.00 root index:Selection_15 + └─Selection_15 250.00 cop[tikv] like(planner__core__range_scan_for_like.t.a, "测试%%", 92) + └─IndexRangeScan_14 250.00 cop[tikv] table:t, index:ia(a) range:["mK\x8b\xd5","mK\x8b\xd6"), keep order:true, stats:pseudo +select *, length(a) from t use index (ia) where a like '测试%%' order by a,_tidb_rowid; +a length(a) +测试 6 +测试 11 +测试Abc 9 +explain select *, length(a) from t use index (ia) where a like '测试_' order by a,_tidb_rowid; +id estRows task access object operator info +Projection_6 250.00 root planner__core__range_scan_for_like.t.a, Column#3->Column#5 +└─Projection_13 250.00 root planner__core__range_scan_for_like.t.a, length(planner__core__range_scan_for_like.t.a)->Column#3, planner__core__range_scan_for_like.t._tidb_rowid + └─IndexReader_16 250.00 root index:Selection_15 + └─Selection_15 250.00 cop[tikv] like(planner__core__range_scan_for_like.t.a, "测试_", 92) + └─IndexRangeScan_14 250.00 cop[tikv] table:t, index:ia(a) range:["mK\x8b\xd5","mK\x8b\xd6"), keep order:true, stats:pseudo +select *, length(a) from t use index (ia) where a like '测试_' order by a,_tidb_rowid; +a length(a) +explain select *, length(a) from t use index (ia) where a like '你好%' order by a,_tidb_rowid; +id estRows task access object operator info +Projection_6 250.00 root planner__core__range_scan_for_like.t.a, Column#3->Column#5 +└─Projection_13 250.00 root planner__core__range_scan_for_like.t.a, length(planner__core__range_scan_for_like.t.a)->Column#3, planner__core__range_scan_for_like.t._tidb_rowid + └─IndexReader_16 250.00 root index:Selection_15 + └─Selection_15 250.00 cop[tikv] like(planner__core__range_scan_for_like.t.a, "你好%", 92) + └─IndexRangeScan_14 250.00 cop[tikv] table:t, index:ia(a) range:["O`Y}","O`Y~"), keep order:true, stats:pseudo +select *, length(a) from t use index (ia) where a like '你好%' order by a,_tidb_rowid; +a length(a) +你好 6 +explain select *, length(a) from t use index (ia) where a like 'aa' order by a,_tidb_rowid; +id estRows task access object operator info +Projection_6 10.00 root planner__core__range_scan_for_like.t.a, Column#3->Column#5 +└─Projection_13 10.00 root planner__core__range_scan_for_like.t.a, length(planner__core__range_scan_for_like.t.a)->Column#3, planner__core__range_scan_for_like.t._tidb_rowid + └─IndexReader_16 10.00 root index:Selection_15 + └─Selection_15 10.00 cop[tikv] like(planner__core__range_scan_for_like.t.a, "aa", 92) + └─IndexRangeScan_14 10.00 cop[tikv] table:t, index:ia(a) range:["\x00A\x00A","\x00A\x00A"], keep order:true, stats:pseudo +select *, length(a) from t use index (ia) where a like 'aa' order by a,_tidb_rowid; +a length(a) +Aa 2 +explain select *, length(a) from t use index (ia) where a like 'aa%' order by a,_tidb_rowid; +id estRows task access object operator info +Projection_6 250.00 root planner__core__range_scan_for_like.t.a, Column#3->Column#5 +└─Projection_13 250.00 root planner__core__range_scan_for_like.t.a, length(planner__core__range_scan_for_like.t.a)->Column#3, planner__core__range_scan_for_like.t._tidb_rowid + └─IndexReader_16 250.00 root index:Selection_15 + └─Selection_15 250.00 cop[tikv] like(planner__core__range_scan_for_like.t.a, "aa%", 92) + └─IndexRangeScan_14 250.00 cop[tikv] table:t, index:ia(a) range:["\x00A\x00A","\x00A\x00B"), keep order:true, stats:pseudo +select *, length(a) from t use index (ia) where a like 'aa%' order by a,_tidb_rowid; +a length(a) +Aa 2 +aABBccdd 8 +explain select *, length(a) from t use index (ia) where a like 'aa%cc' order by a,_tidb_rowid; +id estRows task access object operator info +Projection_6 250.00 root planner__core__range_scan_for_like.t.a, Column#3->Column#5 +└─Projection_13 250.00 root planner__core__range_scan_for_like.t.a, length(planner__core__range_scan_for_like.t.a)->Column#3, planner__core__range_scan_for_like.t._tidb_rowid + └─IndexReader_16 250.00 root index:Selection_15 + └─Selection_15 250.00 cop[tikv] like(planner__core__range_scan_for_like.t.a, "aa%cc", 92) + └─IndexRangeScan_14 250.00 cop[tikv] table:t, index:ia(a) range:["\x00A\x00A","\x00A\x00B"), keep order:true, stats:pseudo +select *, length(a) from t use index (ia) where a like 'aa%cc' order by a,_tidb_rowid; +a length(a) +explain select *, length(a) from t use index (ia) where a like '' order by a,_tidb_rowid; +id estRows task access object operator info +Projection_6 10.00 root planner__core__range_scan_for_like.t.a, Column#3->Column#5 +└─Projection_13 10.00 root planner__core__range_scan_for_like.t.a, length(planner__core__range_scan_for_like.t.a)->Column#3, planner__core__range_scan_for_like.t._tidb_rowid + └─IndexReader_16 10.00 root index:Selection_15 + └─Selection_15 10.00 cop[tikv] like(planner__core__range_scan_for_like.t.a, "", 92) + └─IndexRangeScan_14 10.00 cop[tikv] table:t, index:ia(a) range:["",""], keep order:true, stats:pseudo +select *, length(a) from t use index (ia) where a like '' order by a,_tidb_rowid; +a length(a) + 0 +explain select *, length(a) from t use index (ia) where a like ' ' order by a,_tidb_rowid; +id estRows task access object operator info +Projection_6 10.00 root planner__core__range_scan_for_like.t.a, Column#3->Column#5 +└─Projection_13 10.00 root planner__core__range_scan_for_like.t.a, length(planner__core__range_scan_for_like.t.a)->Column#3, planner__core__range_scan_for_like.t._tidb_rowid + └─IndexReader_16 10.00 root index:Selection_15 + └─Selection_15 10.00 cop[tikv] like(planner__core__range_scan_for_like.t.a, " ", 92) + └─IndexRangeScan_14 10.00 cop[tikv] table:t, index:ia(a) range:["",""], keep order:true, stats:pseudo +select *, length(a) from t use index (ia) where a like ' ' order by a,_tidb_rowid; +a length(a) + 1 +explain select *, length(a) from t use index (ia) where a like 'aa%dd' order by a,_tidb_rowid; +id estRows task access object operator info +Projection_6 250.00 root planner__core__range_scan_for_like.t.a, Column#3->Column#5 +└─Projection_13 250.00 root planner__core__range_scan_for_like.t.a, length(planner__core__range_scan_for_like.t.a)->Column#3, planner__core__range_scan_for_like.t._tidb_rowid + └─IndexReader_16 250.00 root index:Selection_15 + └─Selection_15 250.00 cop[tikv] like(planner__core__range_scan_for_like.t.a, "aa%dd", 92) + └─IndexRangeScan_14 250.00 cop[tikv] table:t, index:ia(a) range:["\x00A\x00A","\x00A\x00B"), keep order:true, stats:pseudo +select *, length(a) from t use index (ia) where a like 'aa%dd' order by a,_tidb_rowid; +a length(a) +aABBccdd 8 +explain select *, length(a) from t use index (ia) where a like 'aa%%dd' order by a,_tidb_rowid; +id estRows task access object operator info +Projection_6 250.00 root planner__core__range_scan_for_like.t.a, Column#3->Column#5 +└─Projection_13 250.00 root planner__core__range_scan_for_like.t.a, length(planner__core__range_scan_for_like.t.a)->Column#3, planner__core__range_scan_for_like.t._tidb_rowid + └─IndexReader_16 250.00 root index:Selection_15 + └─Selection_15 250.00 cop[tikv] like(planner__core__range_scan_for_like.t.a, "aa%%dd", 92) + └─IndexRangeScan_14 250.00 cop[tikv] table:t, index:ia(a) range:["\x00A\x00A","\x00A\x00B"), keep order:true, stats:pseudo +select *, length(a) from t use index (ia) where a like 'aa%%dd' order by a,_tidb_rowid; +a length(a) +aABBccdd 8 +explain select *, length(a) from t use index (ia) where a like 'aa_bccdd' order by a,_tidb_rowid; +id estRows task access object operator info +Projection_6 250.00 root planner__core__range_scan_for_like.t.a, Column#3->Column#5 +└─Projection_13 250.00 root planner__core__range_scan_for_like.t.a, length(planner__core__range_scan_for_like.t.a)->Column#3, planner__core__range_scan_for_like.t._tidb_rowid + └─IndexReader_16 250.00 root index:Selection_15 + └─Selection_15 250.00 cop[tikv] like(planner__core__range_scan_for_like.t.a, "aa_bccdd", 92) + └─IndexRangeScan_14 250.00 cop[tikv] table:t, index:ia(a) range:["\x00A\x00A","\x00A\x00B"), keep order:true, stats:pseudo +select *, length(a) from t use index (ia) where a like 'aa_bccdd' order by a,_tidb_rowid; +a length(a) +aABBccdd 8 +explain select *, length(a) from t use index (ia) where a like '%%' order by a,_tidb_rowid; +id estRows task access object operator info +Projection_6 8000.00 root planner__core__range_scan_for_like.t.a, Column#3->Column#5 +└─Projection_13 8000.00 root planner__core__range_scan_for_like.t.a, length(planner__core__range_scan_for_like.t.a)->Column#3, planner__core__range_scan_for_like.t._tidb_rowid + └─IndexReader_16 8000.00 root index:Selection_15 + └─Selection_15 8000.00 cop[tikv] like(planner__core__range_scan_for_like.t.a, "%%", 92) + └─IndexFullScan_14 10000.00 cop[tikv] table:t, index:ia(a) keep order:true, stats:pseudo +select *, length(a) from t use index (ia) where a like '%%' order by a,_tidb_rowid; +a length(a) + 0 + 1 + 2 + 语 言 10 + 语言 7 +Aa 2 +aABBccdd 8 +你好 6 +测测试 10 +测测试 13 +测试 6 +测试 11 +测试Abc 9 +explain select *, length(a) from t use index (ia) where a like ' %%' order by a,_tidb_rowid; +id estRows task access object operator info +Projection_6 250.00 root planner__core__range_scan_for_like.t.a, Column#3->Column#5 +└─Projection_13 250.00 root planner__core__range_scan_for_like.t.a, length(planner__core__range_scan_for_like.t.a)->Column#3, planner__core__range_scan_for_like.t._tidb_rowid + └─IndexReader_16 250.00 root index:Selection_15 + └─Selection_15 250.00 cop[tikv] like(planner__core__range_scan_for_like.t.a, " %%", 92) + └─IndexRangeScan_14 250.00 cop[tikv] table:t, index:ia(a) range:["","\x00!"), keep order:true, stats:pseudo +select *, length(a) from t use index (ia) where a like ' %%' order by a,_tidb_rowid; +a length(a) + 1 + 2 + 语 言 10 + 语言 7 +explain select *, length(a) from t use index (ia) where a like ' %%语言' order by a,_tidb_rowid; +id estRows task access object operator info +Projection_6 250.00 root planner__core__range_scan_for_like.t.a, Column#3->Column#5 +└─Projection_13 250.00 root planner__core__range_scan_for_like.t.a, length(planner__core__range_scan_for_like.t.a)->Column#3, planner__core__range_scan_for_like.t._tidb_rowid + └─IndexReader_16 250.00 root index:Selection_15 + └─Selection_15 250.00 cop[tikv] like(planner__core__range_scan_for_like.t.a, " %%语言", 92) + └─IndexRangeScan_14 250.00 cop[tikv] table:t, index:ia(a) range:["","\x00!"), keep order:true, stats:pseudo +select *, length(a) from t use index (ia) where a like ' %%语言' order by a,_tidb_rowid; +a length(a) + 语言 7 +explain select *, length(a) from t use index (ia) where a like ' 语 %' order by a,_tidb_rowid; +id estRows task access object operator info +Projection_6 250.00 root planner__core__range_scan_for_like.t.a, Column#3->Column#5 +└─Projection_13 250.00 root planner__core__range_scan_for_like.t.a, length(planner__core__range_scan_for_like.t.a)->Column#3, planner__core__range_scan_for_like.t._tidb_rowid + └─IndexReader_16 250.00 root index:Selection_15 + └─Selection_15 250.00 cop[tikv] like(planner__core__range_scan_for_like.t.a, " 语 %", 92) + └─IndexRangeScan_14 250.00 cop[tikv] table:t, index:ia(a) range:["\x00 \x00 \x8b\xed","\x00 \x00 \x8b\xed\x00!"), keep order:true, stats:pseudo +select *, length(a) from t use index (ia) where a like ' 语 %' order by a,_tidb_rowid; +a length(a) + 语 言 10 +explain select *, length(a) from t use index (ia) where a like ' 语 _' order by a,_tidb_rowid; +id estRows task access object operator info +Projection_6 250.00 root planner__core__range_scan_for_like.t.a, Column#3->Column#5 +└─Projection_13 250.00 root planner__core__range_scan_for_like.t.a, length(planner__core__range_scan_for_like.t.a)->Column#3, planner__core__range_scan_for_like.t._tidb_rowid + └─IndexReader_16 250.00 root index:Selection_15 + └─Selection_15 250.00 cop[tikv] like(planner__core__range_scan_for_like.t.a, " 语 _", 92) + └─IndexRangeScan_14 250.00 cop[tikv] table:t, index:ia(a) range:["\x00 \x00 \x8b\xed","\x00 \x00 \x8b\xed\x00 \x00!"), keep order:true, stats:pseudo +select *, length(a) from t use index (ia) where a like ' 语 _' order by a,_tidb_rowid; +a length(a) +drop table t; +create table t(a varchar(20) collate utf8mb4_unicode_ci, unique index ia(a)); +insert into t value(''),('测试'),('测试abc'),('你好'),('aabbccdd'),(' 语言'),(' 语 言 '),('测测试 '); +explain select *, length(a) from t use index (ia) where a like '测试%' order by a,_tidb_rowid; +id estRows task access object operator info +Projection_6 250.00 root planner__core__range_scan_for_like.t.a, Column#3->Column#5 +└─Sort_7 250.00 root planner__core__range_scan_for_like.t.a, planner__core__range_scan_for_like.t._tidb_rowid + └─Projection_9 250.00 root planner__core__range_scan_for_like.t.a, length(planner__core__range_scan_for_like.t.a)->Column#3, planner__core__range_scan_for_like.t._tidb_rowid + └─IndexReader_12 250.00 root index:Selection_11 + └─Selection_11 250.00 cop[tikv] like(planner__core__range_scan_for_like.t.a, "测试%", 92) + └─IndexRangeScan_10 250.00 cop[tikv] table:t, index:ia(a) range:["\xfb@\xedK\xfbA\x8b\xd5","\xfb@\xedK\xfbA\x8b\xd6"), keep order:false, stats:pseudo +select *, length(a) from t use index (ia) where a like '测试%' order by a,_tidb_rowid; +a length(a) +测试 6 +测试abc 9 +explain select *, length(a) from t use index (ia) where a like '测%%' order by a,_tidb_rowid; +id estRows task access object operator info +Projection_6 250.00 root planner__core__range_scan_for_like.t.a, Column#3->Column#5 +└─Sort_7 250.00 root planner__core__range_scan_for_like.t.a, planner__core__range_scan_for_like.t._tidb_rowid + └─Projection_9 250.00 root planner__core__range_scan_for_like.t.a, length(planner__core__range_scan_for_like.t.a)->Column#3, planner__core__range_scan_for_like.t._tidb_rowid + └─IndexReader_12 250.00 root index:Selection_11 + └─Selection_11 250.00 cop[tikv] like(planner__core__range_scan_for_like.t.a, "测%%", 92) + └─IndexRangeScan_10 250.00 cop[tikv] table:t, index:ia(a) range:["\xfb@\xedK","\xfb@\xedL"), keep order:false, stats:pseudo +select *, length(a) from t use index (ia) where a like '测%%' order by a,_tidb_rowid; +a length(a) +测测试 13 +测试 6 +测试abc 9 +explain select *, length(a) from t use index (ia) where a like '测%%试' order by a,_tidb_rowid; +id estRows task access object operator info +Projection_6 250.00 root planner__core__range_scan_for_like.t.a, Column#3->Column#5 +└─Sort_7 250.00 root planner__core__range_scan_for_like.t.a, planner__core__range_scan_for_like.t._tidb_rowid + └─Projection_9 250.00 root planner__core__range_scan_for_like.t.a, length(planner__core__range_scan_for_like.t.a)->Column#3, planner__core__range_scan_for_like.t._tidb_rowid + └─IndexReader_12 250.00 root index:Selection_11 + └─Selection_11 250.00 cop[tikv] like(planner__core__range_scan_for_like.t.a, "测%%试", 92) + └─IndexRangeScan_10 250.00 cop[tikv] table:t, index:ia(a) range:["\xfb@\xedK","\xfb@\xedL"), keep order:false, stats:pseudo +select *, length(a) from t use index (ia) where a like '测%%试' order by a,_tidb_rowid; +a length(a) +测试 6 +explain select *, length(a) from t use index (ia) where a like '测试%%' order by a,_tidb_rowid; +id estRows task access object operator info +Projection_6 250.00 root planner__core__range_scan_for_like.t.a, Column#3->Column#5 +└─Sort_7 250.00 root planner__core__range_scan_for_like.t.a, planner__core__range_scan_for_like.t._tidb_rowid + └─Projection_9 250.00 root planner__core__range_scan_for_like.t.a, length(planner__core__range_scan_for_like.t.a)->Column#3, planner__core__range_scan_for_like.t._tidb_rowid + └─IndexReader_12 250.00 root index:Selection_11 + └─Selection_11 250.00 cop[tikv] like(planner__core__range_scan_for_like.t.a, "测试%%", 92) + └─IndexRangeScan_10 250.00 cop[tikv] table:t, index:ia(a) range:["\xfb@\xedK\xfbA\x8b\xd5","\xfb@\xedK\xfbA\x8b\xd6"), keep order:false, stats:pseudo +select *, length(a) from t use index (ia) where a like '测试%%' order by a,_tidb_rowid; +a length(a) +测试 6 +测试abc 9 +explain select *, length(a) from t use index (ia) where a like '测试_' order by a,_tidb_rowid; +id estRows task access object operator info +Projection_6 250.00 root planner__core__range_scan_for_like.t.a, Column#3->Column#5 +└─Sort_7 250.00 root planner__core__range_scan_for_like.t.a, planner__core__range_scan_for_like.t._tidb_rowid + └─Projection_9 250.00 root planner__core__range_scan_for_like.t.a, length(planner__core__range_scan_for_like.t.a)->Column#3, planner__core__range_scan_for_like.t._tidb_rowid + └─IndexReader_12 250.00 root index:Selection_11 + └─Selection_11 250.00 cop[tikv] like(planner__core__range_scan_for_like.t.a, "测试_", 92) + └─IndexRangeScan_10 250.00 cop[tikv] table:t, index:ia(a) range:["\xfb@\xedK\xfbA\x8b\xd5","\xfb@\xedK\xfbA\x8b\xd6"), keep order:false, stats:pseudo +select *, length(a) from t use index (ia) where a like '测试_' order by a,_tidb_rowid; +a length(a) +explain select *, length(a) from t use index (ia) where a like '你好%' order by a,_tidb_rowid; +id estRows task access object operator info +Projection_6 250.00 root planner__core__range_scan_for_like.t.a, Column#3->Column#5 +└─Sort_7 250.00 root planner__core__range_scan_for_like.t.a, planner__core__range_scan_for_like.t._tidb_rowid + └─Projection_9 250.00 root planner__core__range_scan_for_like.t.a, length(planner__core__range_scan_for_like.t.a)->Column#3, planner__core__range_scan_for_like.t._tidb_rowid + └─IndexReader_12 250.00 root index:Selection_11 + └─Selection_11 250.00 cop[tikv] like(planner__core__range_scan_for_like.t.a, "你好%", 92) + └─IndexRangeScan_10 250.00 cop[tikv] table:t, index:ia(a) range:["\xfb@\xcf`\xfb@\xd9}","\xfb@\xcf`\xfb@\xd9~"), keep order:false, stats:pseudo +select *, length(a) from t use index (ia) where a like '你好%' order by a,_tidb_rowid; +a length(a) +你好 6 +explain select *, length(a) from t use index (ia) where a like 'aa' order by a,_tidb_rowid; +id estRows task access object operator info +Projection_6 1.00 root planner__core__range_scan_for_like.t.a, Column#3->Column#5 +└─Sort_7 1.00 root planner__core__range_scan_for_like.t.a, planner__core__range_scan_for_like.t._tidb_rowid + └─Projection_9 1.00 root planner__core__range_scan_for_like.t.a, length(planner__core__range_scan_for_like.t.a)->Column#3, planner__core__range_scan_for_like.t._tidb_rowid + └─Selection_11 1.00 root like(planner__core__range_scan_for_like.t.a, "aa", 92) + └─Point_Get_10 1.00 root table:t, index:ia(a) +select *, length(a) from t use index (ia) where a like 'aa' order by a,_tidb_rowid; +a length(a) +explain select *, length(a) from t use index (ia) where a like 'aa%' order by a,_tidb_rowid; +id estRows task access object operator info +Projection_6 250.00 root planner__core__range_scan_for_like.t.a, Column#3->Column#5 +└─Sort_7 250.00 root planner__core__range_scan_for_like.t.a, planner__core__range_scan_for_like.t._tidb_rowid + └─Projection_9 250.00 root planner__core__range_scan_for_like.t.a, length(planner__core__range_scan_for_like.t.a)->Column#3, planner__core__range_scan_for_like.t._tidb_rowid + └─IndexReader_12 250.00 root index:Selection_11 + └─Selection_11 250.00 cop[tikv] like(planner__core__range_scan_for_like.t.a, "aa%", 92) + └─IndexRangeScan_10 250.00 cop[tikv] table:t, index:ia(a) range:["\x0e3\x0e3","\x0e3\x0e4"), keep order:false, stats:pseudo +select *, length(a) from t use index (ia) where a like 'aa%' order by a,_tidb_rowid; +a length(a) +aabbccdd 8 +explain select *, length(a) from t use index (ia) where a like 'aa%cc' order by a,_tidb_rowid; +id estRows task access object operator info +Projection_6 250.00 root planner__core__range_scan_for_like.t.a, Column#3->Column#5 +└─Sort_7 250.00 root planner__core__range_scan_for_like.t.a, planner__core__range_scan_for_like.t._tidb_rowid + └─Projection_9 250.00 root planner__core__range_scan_for_like.t.a, length(planner__core__range_scan_for_like.t.a)->Column#3, planner__core__range_scan_for_like.t._tidb_rowid + └─IndexReader_12 250.00 root index:Selection_11 + └─Selection_11 250.00 cop[tikv] like(planner__core__range_scan_for_like.t.a, "aa%cc", 92) + └─IndexRangeScan_10 250.00 cop[tikv] table:t, index:ia(a) range:["\x0e3\x0e3","\x0e3\x0e4"), keep order:false, stats:pseudo +select *, length(a) from t use index (ia) where a like 'aa%cc' order by a,_tidb_rowid; +a length(a) +explain select *, length(a) from t use index (ia) where a like '' order by a,_tidb_rowid; +id estRows task access object operator info +Projection_6 1.00 root planner__core__range_scan_for_like.t.a, Column#3->Column#5 +└─Sort_7 1.00 root planner__core__range_scan_for_like.t.a, planner__core__range_scan_for_like.t._tidb_rowid + └─Projection_9 1.00 root planner__core__range_scan_for_like.t.a, length(planner__core__range_scan_for_like.t.a)->Column#3, planner__core__range_scan_for_like.t._tidb_rowid + └─Selection_11 1.00 root like(planner__core__range_scan_for_like.t.a, "", 92) + └─Point_Get_10 1.00 root table:t, index:ia(a) +select *, length(a) from t use index (ia) where a like '' order by a,_tidb_rowid; +a length(a) + 0 +explain select *, length(a) from t use index (ia) where a like 'aa%dd' order by a,_tidb_rowid; +id estRows task access object operator info +Projection_6 250.00 root planner__core__range_scan_for_like.t.a, Column#3->Column#5 +└─Sort_7 250.00 root planner__core__range_scan_for_like.t.a, planner__core__range_scan_for_like.t._tidb_rowid + └─Projection_9 250.00 root planner__core__range_scan_for_like.t.a, length(planner__core__range_scan_for_like.t.a)->Column#3, planner__core__range_scan_for_like.t._tidb_rowid + └─IndexReader_12 250.00 root index:Selection_11 + └─Selection_11 250.00 cop[tikv] like(planner__core__range_scan_for_like.t.a, "aa%dd", 92) + └─IndexRangeScan_10 250.00 cop[tikv] table:t, index:ia(a) range:["\x0e3\x0e3","\x0e3\x0e4"), keep order:false, stats:pseudo +select *, length(a) from t use index (ia) where a like 'aa%dd' order by a,_tidb_rowid; +a length(a) +aabbccdd 8 +explain select *, length(a) from t use index (ia) where a like 'aa%%dd' order by a,_tidb_rowid; +id estRows task access object operator info +Projection_6 250.00 root planner__core__range_scan_for_like.t.a, Column#3->Column#5 +└─Sort_7 250.00 root planner__core__range_scan_for_like.t.a, planner__core__range_scan_for_like.t._tidb_rowid + └─Projection_9 250.00 root planner__core__range_scan_for_like.t.a, length(planner__core__range_scan_for_like.t.a)->Column#3, planner__core__range_scan_for_like.t._tidb_rowid + └─IndexReader_12 250.00 root index:Selection_11 + └─Selection_11 250.00 cop[tikv] like(planner__core__range_scan_for_like.t.a, "aa%%dd", 92) + └─IndexRangeScan_10 250.00 cop[tikv] table:t, index:ia(a) range:["\x0e3\x0e3","\x0e3\x0e4"), keep order:false, stats:pseudo +select *, length(a) from t use index (ia) where a like 'aa%%dd' order by a,_tidb_rowid; +a length(a) +aabbccdd 8 +explain select *, length(a) from t use index (ia) where a like 'aa_bccdd' order by a,_tidb_rowid; +id estRows task access object operator info +Projection_6 250.00 root planner__core__range_scan_for_like.t.a, Column#3->Column#5 +└─Sort_7 250.00 root planner__core__range_scan_for_like.t.a, planner__core__range_scan_for_like.t._tidb_rowid + └─Projection_9 250.00 root planner__core__range_scan_for_like.t.a, length(planner__core__range_scan_for_like.t.a)->Column#3, planner__core__range_scan_for_like.t._tidb_rowid + └─IndexReader_12 250.00 root index:Selection_11 + └─Selection_11 250.00 cop[tikv] like(planner__core__range_scan_for_like.t.a, "aa_bccdd", 92) + └─IndexRangeScan_10 250.00 cop[tikv] table:t, index:ia(a) range:["\x0e3\x0e3","\x0e3\x0e4"), keep order:false, stats:pseudo +select *, length(a) from t use index (ia) where a like 'aa_bccdd' order by a,_tidb_rowid; +a length(a) +aabbccdd 8 +explain select *, length(a) from t use index (ia) where a like '%%' order by a,_tidb_rowid; +id estRows task access object operator info +Projection_6 8000.00 root planner__core__range_scan_for_like.t.a, Column#3->Column#5 +└─Sort_7 8000.00 root planner__core__range_scan_for_like.t.a, planner__core__range_scan_for_like.t._tidb_rowid + └─Projection_9 8000.00 root planner__core__range_scan_for_like.t.a, length(planner__core__range_scan_for_like.t.a)->Column#3, planner__core__range_scan_for_like.t._tidb_rowid + └─IndexReader_12 8000.00 root index:Selection_11 + └─Selection_11 8000.00 cop[tikv] like(planner__core__range_scan_for_like.t.a, "%%", 92) + └─IndexFullScan_10 10000.00 cop[tikv] table:t, index:ia(a) keep order:false, stats:pseudo +select *, length(a) from t use index (ia) where a like '%%' order by a,_tidb_rowid; +a length(a) + 0 + 语 言 10 + 语言 7 +aabbccdd 8 +你好 6 +测测试 13 +测试 6 +测试abc 9 +explain select *, length(a) from t use index (ia) where a like ' %%' order by a,_tidb_rowid; +id estRows task access object operator info +Projection_6 250.00 root planner__core__range_scan_for_like.t.a, Column#3->Column#5 +└─Sort_7 250.00 root planner__core__range_scan_for_like.t.a, planner__core__range_scan_for_like.t._tidb_rowid + └─Projection_9 250.00 root planner__core__range_scan_for_like.t.a, length(planner__core__range_scan_for_like.t.a)->Column#3, planner__core__range_scan_for_like.t._tidb_rowid + └─IndexReader_12 250.00 root index:Selection_11 + └─Selection_11 250.00 cop[tikv] like(planner__core__range_scan_for_like.t.a, " %%", 92) + └─IndexRangeScan_10 250.00 cop[tikv] table:t, index:ia(a) range:["","\x02\n"), keep order:false, stats:pseudo +select *, length(a) from t use index (ia) where a like ' %%' order by a,_tidb_rowid; +a length(a) + 语 言 10 + 语言 7 +explain select *, length(a) from t use index (ia) where a like ' %%语言' order by a,_tidb_rowid; +id estRows task access object operator info +Projection_6 250.00 root planner__core__range_scan_for_like.t.a, Column#3->Column#5 +└─Sort_7 250.00 root planner__core__range_scan_for_like.t.a, planner__core__range_scan_for_like.t._tidb_rowid + └─Projection_9 250.00 root planner__core__range_scan_for_like.t.a, length(planner__core__range_scan_for_like.t.a)->Column#3, planner__core__range_scan_for_like.t._tidb_rowid + └─IndexReader_12 250.00 root index:Selection_11 + └─Selection_11 250.00 cop[tikv] like(planner__core__range_scan_for_like.t.a, " %%语言", 92) + └─IndexRangeScan_10 250.00 cop[tikv] table:t, index:ia(a) range:["","\x02\n"), keep order:false, stats:pseudo +select *, length(a) from t use index (ia) where a like ' %%语言' order by a,_tidb_rowid; +a length(a) + 语言 7 +explain select *, length(a) from t use index (ia) where a like ' 语 %' order by a,_tidb_rowid; +id estRows task access object operator info +Projection_6 250.00 root planner__core__range_scan_for_like.t.a, Column#3->Column#5 +└─Sort_7 250.00 root planner__core__range_scan_for_like.t.a, planner__core__range_scan_for_like.t._tidb_rowid + └─Projection_9 250.00 root planner__core__range_scan_for_like.t.a, length(planner__core__range_scan_for_like.t.a)->Column#3, planner__core__range_scan_for_like.t._tidb_rowid + └─IndexReader_12 250.00 root index:Selection_11 + └─Selection_11 250.00 cop[tikv] like(planner__core__range_scan_for_like.t.a, " 语 %", 92) + └─IndexRangeScan_10 250.00 cop[tikv] table:t, index:ia(a) range:["\x02\t\x02\t\xfbA\x8b\xed","\x02\t\x02\t\xfbA\x8b\xed\x02\n"), keep order:false, stats:pseudo +select *, length(a) from t use index (ia) where a like ' 语 %' order by a,_tidb_rowid; +a length(a) + 语 言 10 +explain select *, length(a) from t use index (ia) where a like ' 语 _' order by a,_tidb_rowid; +id estRows task access object operator info +Projection_6 250.00 root planner__core__range_scan_for_like.t.a, Column#3->Column#5 +└─Sort_7 250.00 root planner__core__range_scan_for_like.t.a, planner__core__range_scan_for_like.t._tidb_rowid + └─Projection_9 250.00 root planner__core__range_scan_for_like.t.a, length(planner__core__range_scan_for_like.t.a)->Column#3, planner__core__range_scan_for_like.t._tidb_rowid + └─IndexReader_12 250.00 root index:Selection_11 + └─Selection_11 250.00 cop[tikv] like(planner__core__range_scan_for_like.t.a, " 语 _", 92) + └─IndexRangeScan_10 250.00 cop[tikv] table:t, index:ia(a) range:["\x02\t\x02\t\xfbA\x8b\xed","\x02\t\x02\t\xfbA\x8b\xed\x02\t\x02\n"), keep order:false, stats:pseudo +select *, length(a) from t use index (ia) where a like ' 语 _' order by a,_tidb_rowid; +a length(a) +drop table t; +create table t(a varchar(20) collate utf8mb4_0900_ai_ci, b varchar(20) collate ascii_bin, c bigint, primary key(a(1), b) clustered); +insert into t (a, b, c) values +('测试1', 'asdfgh', 345346), +('你好2', 'qqwweerrrr', 987765), +('こんにちは3', 'zxcvbnn', 1111111), +('안녕하세요4', 'asdfgh ', 3333333333), +('Ciao5', ' asdfgh', 444400), +('Hola6', ' asdfgh ', 6666), +('Bonjour ', '', 888888888), +('Olá8', ' ', 9999999), +('Привет9', ' ', 321321), +('Hallo10', '12345', 35678); +explain select * from t use index (primary) where a like '测试%' and b like 'asd%' order by a,b; +id estRows task access object operator info +Sort_5 6.25 root planner__core__range_scan_for_like.t.a, planner__core__range_scan_for_like.t.b +└─TableReader_10 6.25 root data:Selection_9 + └─Selection_9 6.25 cop[tikv] like(planner__core__range_scan_for_like.t.a, "测试%", 92), like(planner__core__range_scan_for_like.t.b, "asd%", 92) + └─TableRangeScan_8 250.00 cop[tikv] table:t range:["\xfb@\xedK","\xfb@\xedL"), keep order:false, stats:pseudo +select * from t use index (primary) where a like '测试%' and b like 'asd%' order by a,b; +a b c +测试1 asdfgh 345346 +explain select * from t use index (primary) where a like '测试1' and b like 'asdfgh %' order by a,b; +id estRows task access object operator info +Sort_5 0.25 root planner__core__range_scan_for_like.t.a, planner__core__range_scan_for_like.t.b +└─TableReader_10 0.25 root data:Selection_9 + └─Selection_9 0.25 cop[tikv] like(planner__core__range_scan_for_like.t.a, "测试1", 92), like(planner__core__range_scan_for_like.t.b, "asdfgh %", 92) + └─TableRangeScan_8 10.00 cop[tikv] table:t range:["\xfb@\xedK","\xfb@\xedK"], keep order:false, stats:pseudo +select * from t use index (primary) where a like '测试1' and b like 'asdfgh %' order by a,b; +a b c +explain select * from t use index (primary) where a like 'こんにち_' and b like 'zxc%' order by a,b; +id estRows task access object operator info +Sort_5 6.25 root planner__core__range_scan_for_like.t.a, planner__core__range_scan_for_like.t.b +└─TableReader_10 6.25 root data:Selection_9 + └─Selection_9 6.25 cop[tikv] like(planner__core__range_scan_for_like.t.a, "こんにち_", 92), like(planner__core__range_scan_for_like.t.b, "zxc%", 92) + └─TableRangeScan_8 250.00 cop[tikv] table:t range:["=d","=e"), keep order:false, stats:pseudo +select * from t use index (primary) where a like 'こんにち_' and b like 'zxc%' order by a,b; +a b c +explain select * from t use index (primary) where a like '안녕하세요%' and b like 'asd%' order by a,b; +id estRows task access object operator info +Sort_5 6.25 root planner__core__range_scan_for_like.t.a, planner__core__range_scan_for_like.t.b +└─TableReader_10 6.25 root data:Selection_9 + └─Selection_9 6.25 cop[tikv] like(planner__core__range_scan_for_like.t.a, "안녕하세요%", 92), like(planner__core__range_scan_for_like.t.b, "asd%", 92) + └─TableRangeScan_8 250.00 cop[tikv] table:t range:["<\x00 'aabb' order by a,_tidb_rowid; +id estRows task access object operator info +Projection_6 3333.33 root planner__core__range_scan_for_like.t.a, planner__core__range_scan_for_like.t.b +└─Sort_7 3333.33 root planner__core__range_scan_for_like.t.a, planner__core__range_scan_for_like.t._tidb_rowid + └─IndexLookUp_12 3333.33 root + ├─IndexRangeScan_9(Build) 3333.33 cop[tikv] table:t, index:ia(a, b) range:["\x00A\x00A\x00B",+inf], keep order:false, stats:pseudo + └─Selection_11(Probe) 3333.33 cop[tikv] gt(planner__core__range_scan_for_like.t.a, "aabb") + └─TableRowIDScan_10 3333.33 cop[tikv] table:t keep order:false, stats:pseudo +select * from t use index (ia) where a > 'aabb' order by a,_tidb_rowid; +a b +aABBccdd 890 +你好 111 +测测试 2468 +测测试 99999 +测试 222 +测试 543 +测试Abc 324 +explain select * from t use index (ia) where a > 'aab' order by a,_tidb_rowid; +id estRows task access object operator info +Projection_6 3333.33 root planner__core__range_scan_for_like.t.a, planner__core__range_scan_for_like.t.b +└─Sort_7 3333.33 root planner__core__range_scan_for_like.t.a, planner__core__range_scan_for_like.t._tidb_rowid + └─IndexLookUp_12 3333.33 root + ├─IndexRangeScan_9(Build) 3333.33 cop[tikv] table:t, index:ia(a, b) range:["\x00A\x00A\x00B",+inf], keep order:false, stats:pseudo + └─Selection_11(Probe) 3333.33 cop[tikv] gt(planner__core__range_scan_for_like.t.a, "aab") + └─TableRowIDScan_10 3333.33 cop[tikv] table:t keep order:false, stats:pseudo +select * from t use index (ia) where a > 'aab' order by a,_tidb_rowid; +a b +aabB 456 +aABBccdd 890 +你好 111 +测测试 2468 +测测试 99999 +测试 222 +测试 543 +测试Abc 324 +explain select * from t use index (ia) where a > 'aa' order by a,_tidb_rowid; +id estRows task access object operator info +Projection_6 3333.33 root planner__core__range_scan_for_like.t.a, planner__core__range_scan_for_like.t.b +└─Sort_7 3333.33 root planner__core__range_scan_for_like.t.a, planner__core__range_scan_for_like.t._tidb_rowid + └─IndexLookUp_12 3333.33 root + ├─IndexRangeScan_9(Build) 3333.33 cop[tikv] table:t, index:ia(a, b) range:("\x00A\x00A",+inf], keep order:false, stats:pseudo + └─Selection_11(Probe) 3333.33 cop[tikv] gt(planner__core__range_scan_for_like.t.a, "aa") + └─TableRowIDScan_10 3333.33 cop[tikv] table:t keep order:false, stats:pseudo +select * from t use index (ia) where a > 'aa' order by a,_tidb_rowid; +a b +aab 456 +aabB 456 +aABBccdd 890 +你好 111 +测测试 2468 +测测试 99999 +测试 222 +测试 543 +测试Abc 324 +explain select * from t use index (ia) where a < 'aabb' order by a,_tidb_rowid; +id estRows task access object operator info +Projection_6 3323.33 root planner__core__range_scan_for_like.t.a, planner__core__range_scan_for_like.t.b +└─Sort_7 3323.33 root planner__core__range_scan_for_like.t.a, planner__core__range_scan_for_like.t._tidb_rowid + └─IndexLookUp_12 3323.33 root + ├─IndexRangeScan_9(Build) 3323.33 cop[tikv] table:t, index:ia(a, b) range:[-inf,"\x00A\x00A\x00B"], keep order:false, stats:pseudo + └─Selection_11(Probe) 3323.33 cop[tikv] lt(planner__core__range_scan_for_like.t.a, "aabb") + └─TableRowIDScan_10 3323.33 cop[tikv] table:t keep order:false, stats:pseudo +select * from t use index (ia) where a < 'aabb' order by a,_tidb_rowid; +a b + 234 + 11111 + 66666 + 语 言 3579 + 语言 55555 +A 456 +Aa 456 +aab 456 +explain select * from t use index (ia) where a < 'aab' order by a,_tidb_rowid; +id estRows task access object operator info +Projection_6 3323.33 root planner__core__range_scan_for_like.t.a, planner__core__range_scan_for_like.t.b +└─Sort_7 3323.33 root planner__core__range_scan_for_like.t.a, planner__core__range_scan_for_like.t._tidb_rowid + └─IndexLookUp_12 3323.33 root + ├─IndexRangeScan_9(Build) 3323.33 cop[tikv] table:t, index:ia(a, b) range:[-inf,"\x00A\x00A\x00B"), keep order:false, stats:pseudo + └─Selection_11(Probe) 3323.33 cop[tikv] lt(planner__core__range_scan_for_like.t.a, "aab") + └─TableRowIDScan_10 3323.33 cop[tikv] table:t keep order:false, stats:pseudo +select * from t use index (ia) where a < 'aab' order by a,_tidb_rowid; +a b + 234 + 11111 + 66666 + 语 言 3579 + 语言 55555 +A 456 +Aa 456 +explain select * from t use index (ia) where a < 'aa' order by a,_tidb_rowid; +id estRows task access object operator info +Projection_6 3323.33 root planner__core__range_scan_for_like.t.a, planner__core__range_scan_for_like.t.b +└─Sort_7 3323.33 root planner__core__range_scan_for_like.t.a, planner__core__range_scan_for_like.t._tidb_rowid + └─IndexLookUp_12 3323.33 root + ├─IndexRangeScan_9(Build) 3323.33 cop[tikv] table:t, index:ia(a, b) range:[-inf,"\x00A\x00A"), keep order:false, stats:pseudo + └─Selection_11(Probe) 3323.33 cop[tikv] lt(planner__core__range_scan_for_like.t.a, "aa") + └─TableRowIDScan_10 3323.33 cop[tikv] table:t keep order:false, stats:pseudo +select * from t use index (ia) where a < 'aa' order by a,_tidb_rowid; +a b + 234 + 11111 + 66666 + 语 言 3579 + 语言 55555 +A 456 +explain select * from t use index (ia) where a != 'aa' order by a,_tidb_rowid; +id estRows task access object operator info +Projection_6 6656.67 root planner__core__range_scan_for_like.t.a, planner__core__range_scan_for_like.t.b +└─Sort_7 6656.67 root planner__core__range_scan_for_like.t.a, planner__core__range_scan_for_like.t._tidb_rowid + └─IndexLookUp_12 6656.67 root + ├─IndexFullScan_9(Build) 10000.00 cop[tikv] table:t, index:ia(a, b) keep order:false, stats:pseudo + └─Selection_11(Probe) 6656.67 cop[tikv] ne(planner__core__range_scan_for_like.t.a, "aa") + └─TableRowIDScan_10 10000.00 cop[tikv] table:t keep order:false, stats:pseudo +select * from t use index (ia) where a != 'aa' order by a,_tidb_rowid; +a b + 234 + 11111 + 66666 + 语 言 3579 + 语言 55555 +A 456 +aab 456 +aabB 456 +aABBccdd 890 +你好 111 +测测试 2468 +测测试 99999 +测试 222 +测试 543 +测试Abc 324 +explain select * from t use index (ia) where a != 'aaBbc' order by a,_tidb_rowid; +id estRows task access object operator info +Projection_6 6656.67 root planner__core__range_scan_for_like.t.a, planner__core__range_scan_for_like.t.b +└─Sort_7 6656.67 root planner__core__range_scan_for_like.t.a, planner__core__range_scan_for_like.t._tidb_rowid + └─IndexLookUp_12 6656.67 root + ├─IndexFullScan_9(Build) 10000.00 cop[tikv] table:t, index:ia(a, b) keep order:false, stats:pseudo + └─Selection_11(Probe) 6656.67 cop[tikv] ne(planner__core__range_scan_for_like.t.a, "aaBbc") + └─TableRowIDScan_10 10000.00 cop[tikv] table:t keep order:false, stats:pseudo +select * from t use index (ia) where a != 'aaBbc' order by a,_tidb_rowid; +a b + 234 + 11111 + 66666 + 语 言 3579 + 语言 55555 +A 456 +Aa 456 +aab 456 +aabB 456 +aABBccdd 890 +你好 111 +测测试 2468 +测测试 99999 +测试 222 +测试 543 +测试Abc 324 +explain select * from t use index (ia) where a like '测试abc' order by a,_tidb_rowid; +id estRows task access object operator info +Projection_6 10.00 root planner__core__range_scan_for_like.t.a, planner__core__range_scan_for_like.t.b +└─Sort_7 10.00 root planner__core__range_scan_for_like.t.a, planner__core__range_scan_for_like.t._tidb_rowid + └─IndexLookUp_12 10.00 root + ├─IndexRangeScan_9(Build) 10.00 cop[tikv] table:t, index:ia(a, b) range:["mK\x8b\xd5\x00A","mK\x8b\xd5\x00A"], keep order:false, stats:pseudo + └─Selection_11(Probe) 10.00 cop[tikv] like(planner__core__range_scan_for_like.t.a, "测试abc", 92) + └─TableRowIDScan_10 10.00 cop[tikv] table:t keep order:false, stats:pseudo +select * from t use index (ia) where a like '测试abc' order by a,_tidb_rowid; +a b +测试Abc 324 +explain select * from t use index (ia) where a = '测试abc' order by a,_tidb_rowid; +id estRows task access object operator info +Projection_6 10.00 root planner__core__range_scan_for_like.t.a, planner__core__range_scan_for_like.t.b +└─Sort_7 10.00 root planner__core__range_scan_for_like.t.a, planner__core__range_scan_for_like.t._tidb_rowid + └─IndexLookUp_12 10.00 root + ├─IndexRangeScan_9(Build) 10.00 cop[tikv] table:t, index:ia(a, b) range:["mK\x8b\xd5\x00A","mK\x8b\xd5\x00A"], keep order:false, stats:pseudo + └─Selection_11(Probe) 10.00 cop[tikv] eq(planner__core__range_scan_for_like.t.a, "测试abc") + └─TableRowIDScan_10 10.00 cop[tikv] table:t keep order:false, stats:pseudo +select * from t use index (ia) where a = '测试abc' order by a,_tidb_rowid; +a b +测试Abc 324 +explain select * from t use index (ia) where a like 'aa' order by a,_tidb_rowid; +id estRows task access object operator info +Projection_6 10.00 root planner__core__range_scan_for_like.t.a, planner__core__range_scan_for_like.t.b +└─Sort_7 10.00 root planner__core__range_scan_for_like.t.a, planner__core__range_scan_for_like.t._tidb_rowid + └─IndexLookUp_12 10.00 root + ├─IndexRangeScan_9(Build) 10.00 cop[tikv] table:t, index:ia(a, b) range:["\x00A\x00A","\x00A\x00A"], keep order:false, stats:pseudo + └─Selection_11(Probe) 10.00 cop[tikv] like(planner__core__range_scan_for_like.t.a, "aa", 92) + └─TableRowIDScan_10 10.00 cop[tikv] table:t keep order:false, stats:pseudo +select * from t use index (ia) where a like 'aa' order by a,_tidb_rowid; +a b +Aa 456 +explain select * from t use index (ia) where a = 'aa' order by a,_tidb_rowid; +id estRows task access object operator info +Projection_6 10.00 root planner__core__range_scan_for_like.t.a, planner__core__range_scan_for_like.t.b +└─Sort_7 10.00 root planner__core__range_scan_for_like.t.a, planner__core__range_scan_for_like.t._tidb_rowid + └─IndexLookUp_12 10.00 root + ├─IndexRangeScan_9(Build) 10.00 cop[tikv] table:t, index:ia(a, b) range:["\x00A\x00A","\x00A\x00A"], keep order:false, stats:pseudo + └─Selection_11(Probe) 10.00 cop[tikv] eq(planner__core__range_scan_for_like.t.a, "aa") + └─TableRowIDScan_10 10.00 cop[tikv] table:t keep order:false, stats:pseudo +select * from t use index (ia) where a = 'aa' order by a,_tidb_rowid; +a b +Aa 456 +explain select * from t use index (ia) where a like '测测试 ' order by a,_tidb_rowid; +id estRows task access object operator info +Projection_6 10.00 root planner__core__range_scan_for_like.t.a, planner__core__range_scan_for_like.t.b +└─Sort_7 10.00 root planner__core__range_scan_for_like.t.a, planner__core__range_scan_for_like.t._tidb_rowid + └─IndexLookUp_12 10.00 root + ├─IndexRangeScan_9(Build) 10.00 cop[tikv] table:t, index:ia(a, b) range:["mKmK\x8b\xd5","mKmK\x8b\xd5"], keep order:false, stats:pseudo + └─Selection_11(Probe) 10.00 cop[tikv] like(planner__core__range_scan_for_like.t.a, "测测试 ", 92) + └─TableRowIDScan_10 10.00 cop[tikv] table:t keep order:false, stats:pseudo +select * from t use index (ia) where a like '测测试 ' order by a,_tidb_rowid; +a b +测测试 2468 +explain select * from t use index (ia) where a = '测测试 ' order by a,_tidb_rowid; +id estRows task access object operator info +Projection_6 10.00 root planner__core__range_scan_for_like.t.a, planner__core__range_scan_for_like.t.b +└─Sort_7 10.00 root planner__core__range_scan_for_like.t.a, planner__core__range_scan_for_like.t._tidb_rowid + └─IndexLookUp_12 10.00 root + ├─IndexRangeScan_9(Build) 10.00 cop[tikv] table:t, index:ia(a, b) range:["mKmK\x8b\xd5","mKmK\x8b\xd5"], keep order:false, stats:pseudo + └─Selection_11(Probe) 10.00 cop[tikv] eq(planner__core__range_scan_for_like.t.a, "测测试 ") + └─TableRowIDScan_10 10.00 cop[tikv] table:t keep order:false, stats:pseudo +select * from t use index (ia) where a = '测测试 ' order by a,_tidb_rowid; +a b +测测试 2468 +测测试 99999 +explain select * from t use index (ia) where a like ' 语 言' order by a,_tidb_rowid; +id estRows task access object operator info +Projection_6 10.00 root planner__core__range_scan_for_like.t.a, planner__core__range_scan_for_like.t.b +└─Sort_7 10.00 root planner__core__range_scan_for_like.t.a, planner__core__range_scan_for_like.t._tidb_rowid + └─IndexLookUp_12 10.00 root + ├─IndexRangeScan_9(Build) 10.00 cop[tikv] table:t, index:ia(a, b) range:["\x00 \x00 \x8b\xed","\x00 \x00 \x8b\xed"], keep order:false, stats:pseudo + └─Selection_11(Probe) 10.00 cop[tikv] like(planner__core__range_scan_for_like.t.a, " 语 言", 92) + └─TableRowIDScan_10 10.00 cop[tikv] table:t keep order:false, stats:pseudo +select * from t use index (ia) where a like ' 语 言' order by a,_tidb_rowid; +a b + 语 言 3579 +explain select * from t use index (ia) where a = ' 语 言' order by a,_tidb_rowid; +id estRows task access object operator info +Projection_6 10.00 root planner__core__range_scan_for_like.t.a, planner__core__range_scan_for_like.t.b +└─Sort_7 10.00 root planner__core__range_scan_for_like.t.a, planner__core__range_scan_for_like.t._tidb_rowid + └─IndexLookUp_12 10.00 root + ├─IndexRangeScan_9(Build) 10.00 cop[tikv] table:t, index:ia(a, b) range:["\x00 \x00 \x8b\xed","\x00 \x00 \x8b\xed"], keep order:false, stats:pseudo + └─Selection_11(Probe) 10.00 cop[tikv] eq(planner__core__range_scan_for_like.t.a, " 语 言") + └─TableRowIDScan_10 10.00 cop[tikv] table:t keep order:false, stats:pseudo +select * from t use index (ia) where a = ' 语 言' order by a,_tidb_rowid; +a b + 语 言 3579 +explain select * from t use index (ia) where a like '测试%' order by a,_tidb_rowid; +id estRows task access object operator info +Projection_6 250.00 root planner__core__range_scan_for_like.t.a, planner__core__range_scan_for_like.t.b +└─Sort_7 250.00 root planner__core__range_scan_for_like.t.a, planner__core__range_scan_for_like.t._tidb_rowid + └─IndexLookUp_12 250.00 root + ├─IndexRangeScan_9(Build) 250.00 cop[tikv] table:t, index:ia(a, b) range:["mK\x8b\xd5","mK\x8b\xd6"), keep order:false, stats:pseudo + └─Selection_11(Probe) 250.00 cop[tikv] like(planner__core__range_scan_for_like.t.a, "测试%", 92) + └─TableRowIDScan_10 250.00 cop[tikv] table:t keep order:false, stats:pseudo +select * from t use index (ia) where a like '测试%' order by a,_tidb_rowid; +a b +测试 222 +测试 543 +测试Abc 324 +explain select * from t use index (ia) where a like '测_' order by a,_tidb_rowid; +id estRows task access object operator info +Projection_6 250.00 root planner__core__range_scan_for_like.t.a, planner__core__range_scan_for_like.t.b +└─Sort_7 250.00 root planner__core__range_scan_for_like.t.a, planner__core__range_scan_for_like.t._tidb_rowid + └─IndexLookUp_12 250.00 root + ├─IndexRangeScan_9(Build) 250.00 cop[tikv] table:t, index:ia(a, b) range:["mK","mL"), keep order:false, stats:pseudo + └─Selection_11(Probe) 250.00 cop[tikv] like(planner__core__range_scan_for_like.t.a, "测_", 92) + └─TableRowIDScan_10 250.00 cop[tikv] table:t keep order:false, stats:pseudo +select * from t use index (ia) where a like '测_' order by a,_tidb_rowid; +a b +测试 222 +explain select * from t use index (ia) where a like '测测试 %' order by a,_tidb_rowid; +id estRows task access object operator info +Projection_6 250.00 root planner__core__range_scan_for_like.t.a, planner__core__range_scan_for_like.t.b +└─Sort_7 250.00 root planner__core__range_scan_for_like.t.a, planner__core__range_scan_for_like.t._tidb_rowid + └─IndexLookUp_12 250.00 root + ├─IndexRangeScan_9(Build) 250.00 cop[tikv] table:t, index:ia(a, b) range:["mKmK\x8b\xd5","mKmK\x8b\xd6"), keep order:false, stats:pseudo + └─Selection_11(Probe) 250.00 cop[tikv] like(planner__core__range_scan_for_like.t.a, "测测试 %", 92) + └─TableRowIDScan_10 250.00 cop[tikv] table:t keep order:false, stats:pseudo +select * from t use index (ia) where a like '测测试 %' order by a,_tidb_rowid; +a b +测测试 2468 +测测试 99999 +explain select * from t use index (ia) where a like '测试a__' order by a,_tidb_rowid; +id estRows task access object operator info +Projection_6 250.00 root planner__core__range_scan_for_like.t.a, planner__core__range_scan_for_like.t.b +└─Sort_7 250.00 root planner__core__range_scan_for_like.t.a, planner__core__range_scan_for_like.t._tidb_rowid + └─IndexLookUp_12 250.00 root + ├─IndexRangeScan_9(Build) 250.00 cop[tikv] table:t, index:ia(a, b) range:["mK\x8b\xd5\x00A","mK\x8b\xd5\x00B"), keep order:false, stats:pseudo + └─Selection_11(Probe) 250.00 cop[tikv] like(planner__core__range_scan_for_like.t.a, "测试a__", 92) + └─TableRowIDScan_10 250.00 cop[tikv] table:t keep order:false, stats:pseudo +select * from t use index (ia) where a like '测试a__' order by a,_tidb_rowid; +a b +测试Abc 324 +explain select * from t use index (ia) where a like '测试 __' order by a,_tidb_rowid; +id estRows task access object operator info +Projection_6 250.00 root planner__core__range_scan_for_like.t.a, planner__core__range_scan_for_like.t.b +└─Sort_7 250.00 root planner__core__range_scan_for_like.t.a, planner__core__range_scan_for_like.t._tidb_rowid + └─IndexLookUp_12 250.00 root + ├─IndexRangeScan_9(Build) 250.00 cop[tikv] table:t, index:ia(a, b) range:["mK\x8b\xd5","mK\x8b\xd5\x00!"), keep order:false, stats:pseudo + └─Selection_11(Probe) 250.00 cop[tikv] like(planner__core__range_scan_for_like.t.a, "测试 __", 92) + └─TableRowIDScan_10 250.00 cop[tikv] table:t keep order:false, stats:pseudo +select * from t use index (ia) where a like '测试 __' order by a,_tidb_rowid; +a b +测试 543 +explain select * from t use index (ia) where a like ' _' order by a,_tidb_rowid; +id estRows task access object operator info +Projection_6 250.00 root planner__core__range_scan_for_like.t.a, planner__core__range_scan_for_like.t.b +└─Sort_7 250.00 root planner__core__range_scan_for_like.t.a, planner__core__range_scan_for_like.t._tidb_rowid + └─IndexLookUp_12 250.00 root + ├─IndexRangeScan_9(Build) 250.00 cop[tikv] table:t, index:ia(a, b) range:["","\x00!"), keep order:false, stats:pseudo + └─Selection_11(Probe) 250.00 cop[tikv] like(planner__core__range_scan_for_like.t.a, " _", 92) + └─TableRowIDScan_10 250.00 cop[tikv] table:t keep order:false, stats:pseudo +select * from t use index (ia) where a like ' _' order by a,_tidb_rowid; +a b +explain select * from t use index (ia) where a like ' %' order by a,_tidb_rowid; +id estRows task access object operator info +Projection_6 250.00 root planner__core__range_scan_for_like.t.a, planner__core__range_scan_for_like.t.b +└─Sort_7 250.00 root planner__core__range_scan_for_like.t.a, planner__core__range_scan_for_like.t._tidb_rowid + └─IndexLookUp_12 250.00 root + ├─IndexRangeScan_9(Build) 250.00 cop[tikv] table:t, index:ia(a, b) range:["","\x00 \x00 \x00!"), keep order:false, stats:pseudo + └─Selection_11(Probe) 250.00 cop[tikv] like(planner__core__range_scan_for_like.t.a, " %", 92) + └─TableRowIDScan_10 250.00 cop[tikv] table:t keep order:false, stats:pseudo +select * from t use index (ia) where a like ' %' order by a,_tidb_rowid; +a b + 66666 +explain select * from t use index (ia) where a like ' 语言%%' order by a,_tidb_rowid; +id estRows task access object operator info +Projection_6 250.00 root planner__core__range_scan_for_like.t.a, planner__core__range_scan_for_like.t.b +└─Sort_7 250.00 root planner__core__range_scan_for_like.t.a, planner__core__range_scan_for_like.t._tidb_rowid + └─IndexLookUp_12 250.00 root + ├─IndexRangeScan_9(Build) 250.00 cop[tikv] table:t, index:ia(a, b) range:["\x00 \x8b\xed\x8a\x00","\x00 \x8b\xed\x8a\x01"), keep order:false, stats:pseudo + └─Selection_11(Probe) 250.00 cop[tikv] like(planner__core__range_scan_for_like.t.a, " 语言%%", 92) + └─TableRowIDScan_10 250.00 cop[tikv] table:t keep order:false, stats:pseudo +select * from t use index (ia) where a like ' 语言%%' order by a,_tidb_rowid; +a b + 语言 55555 +explain select * from t use index (ia) where a not in ('aabc','dd') order by a,_tidb_rowid; +id estRows task access object operator info +Projection_6 3583.33 root planner__core__range_scan_for_like.t.a, planner__core__range_scan_for_like.t.b +└─Sort_7 3583.33 root planner__core__range_scan_for_like.t.a, planner__core__range_scan_for_like.t._tidb_rowid + └─IndexLookUp_12 3583.33 root + ├─IndexRangeScan_9(Build) 3583.33 cop[tikv] table:t, index:ia(a, b) range:(NULL,"\x00D\x00D"), ("\x00D\x00D",+inf], keep order:false, stats:pseudo + └─Selection_11(Probe) 3583.33 cop[tikv] not(in(planner__core__range_scan_for_like.t.a, "aabc", "dd")) + └─TableRowIDScan_10 3583.33 cop[tikv] table:t keep order:false, stats:pseudo +select * from t use index (ia) where a not in ('aabc','dd') order by a,_tidb_rowid; +a b + 234 + 11111 + 66666 + 语 言 3579 + 语言 55555 +A 456 +Aa 456 +aab 456 +aabB 456 +aABBccdd 890 +你好 111 +测测试 2468 +测测试 99999 +测试 222 +测试 543 +测试Abc 324 +explain select * from t where a >= 'aabb' and a <= 'aabd' and b = 456 order by a,_tidb_rowid; +id estRows task access object operator info +Projection_6 0.01 root planner__core__range_scan_for_like.t.a, planner__core__range_scan_for_like.t.b +└─Sort_7 0.01 root planner__core__range_scan_for_like.t.a, planner__core__range_scan_for_like.t._tidb_rowid + └─IndexLookUp_16 0.01 root + ├─Selection_14(Build) 0.01 cop[tikv] eq(planner__core__range_scan_for_like.t.b, 456) + │ └─IndexRangeScan_12 10.00 cop[tikv] table:t, index:ia(a, b) range:["\x00A\x00A\x00B","\x00A\x00A\x00B"], keep order:false, stats:pseudo + └─Selection_15(Probe) 0.01 cop[tikv] ge(planner__core__range_scan_for_like.t.a, "aabb"), le(planner__core__range_scan_for_like.t.a, "aabd") + └─TableRowIDScan_13 0.01 cop[tikv] table:t keep order:false, stats:pseudo +select * from t where a >= 'aabb' and a <= 'aabd' and b = 456 order by a,_tidb_rowid; +a b +aabB 456 diff --git a/tests/integrationtest/r/planner/core/rule_join_reorder.result b/tests/integrationtest/r/planner/core/rule_join_reorder.result index f44de88a60d6d..3e4fa745acca8 100644 --- a/tests/integrationtest/r/planner/core/rule_join_reorder.result +++ b/tests/integrationtest/r/planner/core/rule_join_reorder.result @@ -126,3 +126,56 @@ Projection 155781.72 root planner__core__rule_join_reorder.t3.market_id, planne │ └─TableFullScan 10000.00 cop[tikv] table:p keep order:false, stats:pseudo └─TableReader(Probe) 10000.00 root data:TableFullScan └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +drop table if exists t, t1, t2, t3; +create table t(a int, b int, key(a)); +create table t1(a int, b int, key(a)); +create table t2(a int, b int, key(a)); +create table t3(a int, b int, key(a)); +select * from t1 join t2 on t1.a=t2.a join t3 on t2.b=t3.b; +a b a b a b +select @@last_plan_from_binding; +@@last_plan_from_binding +0 +create global binding for select * from t1 join t2 on t1.a=t2.a join t3 on t2.b=t3.b using select /*+ straight_join() */ * from t1 join t2 on t1.a=t2.a join t3 on t2.b=t3.b; +select * from t1 join t2 on t1.a=t2.a join t3 on t2.b=t3.b; +a b a b a b +select @@last_plan_from_binding; +@@last_plan_from_binding +1 +show global bindings where original_sql like '%planner__core__rule_join_reorder%'; +Original_sql Bind_sql Default_db Status Create_time Update_time Charset Collation Source Sql_digest Plan_digest +select * from ( `planner__core__rule_join_reorder` . `t1` join `planner__core__rule_join_reorder` . `t2` on `t1` . `a` = `t2` . `a` ) join `planner__core__rule_join_reorder` . `t3` on `t2` . `b` = `t3` . `b` SELECT /*+ straight_join()*/ * FROM (`planner__core__rule_join_reorder`.`t1` JOIN `planner__core__rule_join_reorder`.`t2` ON `t1`.`a` = `t2`.`a`) JOIN `planner__core__rule_join_reorder`.`t3` ON `t2`.`b` = `t3`.`b` planner__core__rule_join_reorder enabled utf8mb4 utf8mb4_general_ci manual 07450843a30e0679fcc588369b6a6c5247d1a004fbad485c759177227f45c21f +drop global binding for select * from t1 join t2 on t1.a=t2.a join t3 on t2.b=t3.b; +select * from t1 join t2 on t1.a=t2.a join t3 on t2.b=t3.b; +a b a b a b +select @@last_plan_from_binding; +@@last_plan_from_binding +0 +show global bindings where original_sql like '%planner__core__rule_join_reorder%'; +Original_sql Bind_sql Default_db Status Create_time Update_time Charset Collation Source Sql_digest Plan_digest +create global binding for select * from t1 join t2 on t1.a=t2.a join t3 on t2.b=t3.b using select /*+ leading(t3) */ * from t1 join t2 on t1.a=t2.a join t3 on t2.b=t3.b; +select * from t1 join t2 on t1.a=t2.a join t3 on t2.b=t3.b; +a b a b a b +select @@last_plan_from_binding; +@@last_plan_from_binding +1 +show global bindings where original_sql like '%planner__core__rule_join_reorder%'; +Original_sql Bind_sql Default_db Status Create_time Update_time Charset Collation Source Sql_digest Plan_digest +select * from ( `planner__core__rule_join_reorder` . `t1` join `planner__core__rule_join_reorder` . `t2` on `t1` . `a` = `t2` . `a` ) join `planner__core__rule_join_reorder` . `t3` on `t2` . `b` = `t3` . `b` SELECT /*+ leading(`t3`)*/ * FROM (`planner__core__rule_join_reorder`.`t1` JOIN `planner__core__rule_join_reorder`.`t2` ON `t1`.`a` = `t2`.`a`) JOIN `planner__core__rule_join_reorder`.`t3` ON `t2`.`b` = `t3`.`b` planner__core__rule_join_reorder enabled utf8mb4 utf8mb4_general_ci manual 07450843a30e0679fcc588369b6a6c5247d1a004fbad485c759177227f45c21f +drop global binding for select * from t1 join t2 on t1.a=t2.a join t3 on t2.b=t3.b; +select * from t1 join t2 on t1.a=t2.a left join t3 on t2.b=t3.b; +a b a b a b +select @@last_plan_from_binding; +@@last_plan_from_binding +0 +show global bindings where original_sql like '%planner__core__rule_join_reorder%'; +Original_sql Bind_sql Default_db Status Create_time Update_time Charset Collation Source Sql_digest Plan_digest +create global binding for select * from t1 join t2 on t1.a=t2.a left join t3 on t2.b=t3.b using select /*+ leading(t2) */ * from t1 join t2 on t1.a=t2.a left join t3 on t2.b=t3.b; +select * from t1 join t2 on t1.a=t2.a left join t3 on t2.b=t3.b; +a b a b a b +select @@last_plan_from_binding; +@@last_plan_from_binding +1 +show global bindings where original_sql like '%planner__core__rule_join_reorder%'; +Original_sql Bind_sql Default_db Status Create_time Update_time Charset Collation Source Sql_digest Plan_digest +select * from ( `planner__core__rule_join_reorder` . `t1` join `planner__core__rule_join_reorder` . `t2` on `t1` . `a` = `t2` . `a` ) left join `planner__core__rule_join_reorder` . `t3` on `t2` . `b` = `t3` . `b` SELECT /*+ leading(`t2`)*/ * FROM (`planner__core__rule_join_reorder`.`t1` JOIN `planner__core__rule_join_reorder`.`t2` ON `t1`.`a` = `t2`.`a`) LEFT JOIN `planner__core__rule_join_reorder`.`t3` ON `t2`.`b` = `t3`.`b` planner__core__rule_join_reorder enabled utf8mb4 utf8mb4_general_ci manual 18f83ecaecd781fb67bd8b3e4a82b3c1cdb21813134712c735a56708b87f1709 diff --git a/tests/integrationtest/r/planner/core/tests/prepare/issue.result b/tests/integrationtest/r/planner/core/tests/prepare/issue.result index 0a02ea28b054f..f1885588db9f4 100644 --- a/tests/integrationtest/r/planner/core/tests/prepare/issue.result +++ b/tests/integrationtest/r/planner/core/tests/prepare/issue.result @@ -134,6 +134,7 @@ a b select @@last_plan_from_cache; @@last_plan_from_cache 0 +set tidb_enable_prepared_plan_cache=DEFAULT; CREATE TABLE UK_MU16407 (COL3 timestamp NULL DEFAULT NULL, UNIQUE KEY U3(COL3)); insert into UK_MU16407 values("1985-08-31 18:03:27"); PREPARE st FROM 'SELECT COL3 FROM UK_MU16407 WHERE COL3>?'; @@ -164,6 +165,7 @@ execute stmt using @a,@b,@c,@d; COL2 126 126 +set tidb_enable_prepared_plan_cache=DEFAULT; set tidb_enable_prepared_plan_cache=1; drop table if exists t1, t2; CREATE TABLE t1 (c_int int, c_str varchar(40), PRIMARY KEY (c_int, c_str)); @@ -199,6 +201,7 @@ a b c a b select @@last_plan_from_cache; @@last_plan_from_cache 1 +set tidb_enable_prepared_plan_cache=DEFAULT; set tidb_enable_prepared_plan_cache=1; drop table if exists PK_SIGNED_10094; CREATE TABLE PK_SIGNED_10094 (COL1 decimal(55,0) NOT NULL, PRIMARY KEY (COL1)); @@ -220,6 +223,7 @@ COL1 select @@last_plan_from_cache; @@last_plan_from_cache 1 +set tidb_enable_prepared_plan_cache=DEFAULT; set tidb_enable_prepared_plan_cache=1; drop table if exists PK_S_MULTI_37; CREATE TABLE PK_S_MULTI_37 (COL1 decimal(55,0) NOT NULL, COL2 decimal(55,0) NOT NULL,PRIMARY KEY (COL1, COL2) /*T![clustered_index] NONCLUSTERED */) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin; @@ -229,6 +233,7 @@ set @a=1; execute stmt using @a; SUM(COL1+?) col2 -9999999999999999999999999999999999999999999998 1 +set tidb_enable_prepared_plan_cache=DEFAULT; set tidb_enable_prepared_plan_cache=1; set @@tidb_enable_collect_execution_info=0; drop table if exists t; @@ -312,6 +317,8 @@ count(distinct col1) select/*+ hash_agg() */ count(distinct col1) from PK_TCOLLATION10197 where col1 > '龺'; count(distinct col1) 0 +set tidb_enable_prepared_plan_cache=DEFAULT; +set tidb_enable_clustered_index=DEFAULT; set tidb_enable_prepared_plan_cache=1; set tidb_enable_clustered_index=on; drop table if exists t; @@ -397,6 +404,8 @@ select @@last_plan_from_cache; 0 execute stmt using @z; col1 +set tidb_enable_prepared_plan_cache=DEFAULT; +set tidb_enable_clustered_index=DEFAULT; set tidb_enable_prepared_plan_cache=1; drop table if exists t; create table t(col1 enum('aa', 'bb'), col2 int, index(col1, col2)); @@ -418,6 +427,7 @@ col1 col2 col1 col2 select @@last_plan_from_cache; @@last_plan_from_cache 1 +set tidb_enable_prepared_plan_cache=DEFAULT; drop table if exists t4; create table t4 (a date); prepare st1 from "insert into t4(a) select dt from (select ? as dt from dual union all select sysdate() ) a"; @@ -426,3 +436,149 @@ execute st1 using @t; select count(*) from t4; count(*) 2 +set tidb_enable_prepared_plan_cache=1; +drop table if exists t; +create table t(a int); +prepare stmt from 'select * from t'; +execute stmt; +a +select EXEC_COUNT,plan_cache_hits, plan_in_cache from information_schema.statements_summary where digest_text='select * from `t`' and TABLE_NAMES = 'planner__core__tests__prepare__issue.t'; +EXEC_COUNT plan_cache_hits plan_in_cache +1 0 0 +execute stmt; +a +select EXEC_COUNT,plan_cache_hits, plan_in_cache from information_schema.statements_summary where digest_text='select * from `t`' and TABLE_NAMES = 'planner__core__tests__prepare__issue.t'; +EXEC_COUNT plan_cache_hits plan_in_cache +2 1 1 +prepare stmt from 'select * from t'; +execute stmt; +a +select @@last_plan_from_cache; +@@last_plan_from_cache +1 +select EXEC_COUNT, plan_cache_hits, plan_in_cache from information_schema.statements_summary where digest_text='select * from `t`' and TABLE_NAMES = 'planner__core__tests__prepare__issue.t'; +EXEC_COUNT plan_cache_hits plan_in_cache +3 2 1 +drop table if exists t; +create table t(a int primary key, b int, c int); +prepare stmt from 'select * from t where a = 2 or a = ?'; +set @p = 3; +execute stmt using @p; +a b c +select @@last_plan_from_cache; +@@last_plan_from_cache +0 +execute stmt using @p; +a b c +select @@last_plan_from_cache; +@@last_plan_from_cache +0 +drop table if exists t; +CREATE TABLE `t` (`COL1` bigint(20) DEFAULT NULL COMMENT 'WITH DEFAULT', UNIQUE KEY `UK_COL1` (`COL1`)); +insert into t values(-3865356285544170443),(9223372036854775807); +prepare stmt from 'select/*+ hash_agg() */ max(col1) from t where col1 = ? and col1 > ?;'; +set @a=-3865356285544170443, @b=-4055949188488870713; +execute stmt using @a,@b; +max(col1) +-3865356285544170443 +drop table if exists t; +create table t (a int, b int, index ab(a, b)); +insert into t values (1, 1), (2, 2); +prepare s1 from 'select * from t use index(ab) where a>=? and b>=? and b<=?'; +set @a=1, @b=1, @c=1; +execute s1 using @a, @b, @c; +a b +1 1 +set @a=1, @b=1, @c=10; +execute s1 using @a, @b, @c; +a b +1 1 +2 2 +select @@last_plan_from_cache; +@@last_plan_from_cache +0 +drop table if exists UK_GCOL_VIRTUAL_18928; +CREATE TABLE UK_GCOL_VIRTUAL_18928 ( +COL102 bigint(20) DEFAULT NULL, +COL103 bigint(20) DEFAULT NULL, +COL1 bigint(20) GENERATED ALWAYS AS (COL102 & 10) VIRTUAL, +COL2 varchar(20) DEFAULT NULL, +COL4 datetime DEFAULT NULL, +COL3 bigint(20) DEFAULT NULL, +COL5 float DEFAULT NULL, +UNIQUE KEY UK_COL1 (COL1)); +insert into UK_GCOL_VIRTUAL_18928(col102,col2) values("-5175976006730879891", "屘厒镇览錻碛斵大擔觏譨頙硺箄魨搝珄鋧扭趖"); +prepare stmt from 'SELECT * FROM UK_GCOL_VIRTUAL_18928 WHERE col1 < ? AND col2 != ?'; +set @a=10, @b="aa"; +execute stmt using @a, @b; +COL102 COL103 COL1 COL2 COL4 COL3 COL5 +-5175976006730879891 NULL 8 屘厒镇览錻碛斵大擔觏譨頙硺箄魨搝珄鋧扭趖 NULL NULL NULL +drop table if exists UK_MU14722; +CREATE TABLE UK_MU14722 ( +COL1 tinytext DEFAULT NULL, +COL2 tinyint(16) DEFAULT NULL, +COL3 datetime DEFAULT NULL, +COL4 int(11) DEFAULT NULL, +UNIQUE KEY U_M_COL (COL1(10)), +UNIQUE KEY U_M_COL2 (COL2), +UNIQUE KEY U_M_COL3 (COL3)); +insert into UK_MU14722 values("輮睅麤敜溺她晁瀪襄頮鹛涓誗钷廔筪惌嶙鎢塴", -121, "3383-02-19 07:58:28" , -639457963), +("偧孇鱓鼂瘠钻篝醗時鷷聽箌磇砀玸眞扦鸇祈灇", 127, "7902-03-05 08:54:04", -1094128660), +("浀玡慃淛漉围甧鴎史嬙砊齄w章炢忲噑硓哈樘", -127, "5813-04-16 03:07:20", -333397107), +("鑝粼啎鸼贖桖弦簼赭蠅鏪鐥蕿捐榥疗耹岜鬓槊", -117, "7753-11-24 10:14:24", 654872077); +prepare stmt from 'SELECT * FROM UK_MU14722 WHERE col2 > ? OR col2 BETWEEN ? AND ? ORDER BY COL2 + ? LIMIT 3'; +set @a=30410, @b=3937, @c=22045, @d=-4374; +execute stmt using @a,@b,@c,@d; +COL1 COL2 COL3 COL4 +set @a=127, @b=127, @c=127, @d=127; +execute stmt using @a,@b,@c,@d; +COL1 COL2 COL3 COL4 +偧孇鱓鼂瘠钻篝醗時鷷聽箌磇砀玸眞扦鸇祈灇 127 7902-03-05 08:54:04 -1094128660 +drop table if exists PK_AUTO_RANDOM9111; +CREATE TABLE `PK_AUTO_RANDOM9111` ( `COL1` bigint(45) NOT NULL , `COL2` varchar(20) DEFAULT NULL, `COL4` datetime DEFAULT NULL, `COL3` bigint(20) DEFAULT NULL, `COL5` float DEFAULT NULL, PRIMARY KEY (`COL1`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin; +insert into PK_AUTO_RANDOM9111(col1) values (-9223372036854775808), (9223372036854775807); +set @a=9223372036854775807, @b=1; +prepare stmt from 'select min(col1) from PK_AUTO_RANDOM9111 where col1 > ?;'; +execute stmt using @a; +min(col1) +NULL +execute stmt using @a; +min(col1) +NULL +select @@last_plan_from_cache; +@@last_plan_from_cache +0 +execute stmt using @b; +min(col1) +9223372036854775807 +select @@last_plan_from_cache; +@@last_plan_from_cache +0 +execute stmt using @a; +min(col1) +NULL +select @@last_plan_from_cache; +@@last_plan_from_cache +1 +set tidb_enable_prepared_plan_cache=DEFAULT; +use test; +drop table if exists t0; +CREATE TABLE t0 (c1 double, c2 double); +select +exists ( +select +subq_2.c0 as c8 +from +(select +ref_153.c1 as c0 +from +t0 as ref_153 +group by ref_153.c1 having 0 <> ( +select 1 +from +t0 as ref_173 +where count(ref_153.c2) = avg(ref_153.c2) +order by c1 desc limit 1)) as subq_2 +) as c10; +c10 +0 diff --git a/tests/integrationtest/r/privilege/privileges.result b/tests/integrationtest/r/privilege/privileges.result index f34df558730dd..bfec177d50a06 100644 --- a/tests/integrationtest/r/privilege/privileges.result +++ b/tests/integrationtest/r/privilege/privileges.result @@ -133,15 +133,14 @@ set global innodb_commit_concurrency=16; Error 1227 (42000): Access denied; you need (at least one of) the SUPER or SYSTEM_VARIABLES_ADMIN privilege(s) for this operation # TestCheckPointGetDBPrivilege CREATE USER 'tester'@'localhost'; -GRANT SELECT,UPDATE ON privilege__privileges.* TO 'tester'@'localhost'; +GRANT SELECT,UPDATE ON privilege__privileges2.* TO 'tester'@'localhost'; create database if not exists privilege__privileges; create table privilege__privileges.t(id int, v int, primary key(id)); insert into privilege__privileges.t(id, v) values(1, 1); -use privilege__privileges; select * from privilege__privileges.t where id = 1; -id v -1 1 +Error 1142 (42000): SELECT command denied to user 'tester'@'localhost' for table 't' update privilege__privileges.t set v = 2 where id = 1; +Error 1142 (42000): SELECT command denied to user 'tester'@'localhost' for table 't' DROP USER 'tester'@'localhost'; CREATE DATABASE if not exists privilege__privileges; USE privilege__privileges; @@ -328,8 +327,8 @@ GRANT USAGE ON *.* TO 'column'@'%' GRANT SELECT(a), INSERT(c), UPDATE(a, b) ON `privilege__privileges`.`column_table` TO 'column'@'%' CREATE USER 'tableaccess'@'localhost'; CREATE TABLE fieldlistt1 (a int); -desc fieldlistt1; -Error 1046 (3D000): No database selected +desc privilege__privileges.fieldlistt1; +Error 1142 (42000): SELECT command denied to user 'tableaccess'@'localhost' for table 'fieldlistt1' CREATE USER tr_insert; CREATE USER tr_update; CREATE USER tr_delete; diff --git a/tests/integrationtest/r/session/bootstrap_upgrade.result b/tests/integrationtest/r/session/bootstrap_upgrade.result index 607399d02891b..fb4381489d146 100644 --- a/tests/integrationtest/r/session/bootstrap_upgrade.result +++ b/tests/integrationtest/r/session/bootstrap_upgrade.result @@ -36,9 +36,13 @@ tidb_background_subtask_history CREATE TABLE `tidb_background_subtask_history` ( `exec_expired` timestamp NULL DEFAULT NULL, `state` varchar(64) NOT NULL, `checkpoint` longblob NOT NULL, + `concurrency` int(11) DEFAULT NULL, + `create_time` timestamp NULL DEFAULT NULL, `start_time` bigint(20) DEFAULT NULL, `state_update_time` bigint(20) DEFAULT NULL, + `end_time` timestamp NULL DEFAULT NULL, `meta` longblob DEFAULT NULL, + `ordinal` int(11) DEFAULT NULL, `error` blob DEFAULT NULL, `summary` json DEFAULT NULL, PRIMARY KEY (`id`) /*T![clustered_index] CLUSTERED */, @@ -48,7 +52,7 @@ tidb_background_subtask_history CREATE TABLE `tidb_background_subtask_history` ( insert into tidb_background_subtask(id, state, checkpoint) values (1, 0, ""); insert into tidb_background_subtask_history select * from tidb_background_subtask; select * from tidb_background_subtask_history; -id step namespace task_key ddl_physical_tid type exec_id exec_expired state checkpoint start_time state_update_time meta error summary -1 NULL NULL NULL NULL NULL NULL NULL 0 NULL NULL NULL NULL NULL +id step namespace task_key ddl_physical_tid type exec_id exec_expired state checkpoint concurrency create_time start_time state_update_time end_time meta ordinal error summary +1 NULL NULL NULL NULL NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL NULL NULL truncate table tidb_background_subtask; truncate table tidb_background_subtask_history; diff --git a/tests/integrationtest/r/session/clustered_index.result b/tests/integrationtest/r/session/clustered_index.result index 1e4ea32c0b2cd..c4b84a24273a7 100644 --- a/tests/integrationtest/r/session/clustered_index.result +++ b/tests/integrationtest/r/session/clustered_index.result @@ -202,10 +202,10 @@ select group_concat(name order by name separator '.') from t use index(idx); group_concat(name order by name separator '.') aaa.bbb update t set name = 'aaaaa' where name = 'bbb'; -Error 1062 (23000): Duplicate entry 'aaaaa' for key 't.PRIMARY' +Error 1062 (23000): Duplicate entry 'aa' for key 't.PRIMARY' update ignore t set name = 'aaaaa' where name = 'bbb'; Level Code Message -Warning 1062 Duplicate entry 'aaaaa' for key 't.PRIMARY' +Warning 1062 Duplicate entry 'aa' for key 't.PRIMARY' admin check table t; drop table if exists t1, t2; create table t1 (c_str varchar(40), c_decimal decimal(12, 6) , primary key(c_str(8))); @@ -439,7 +439,7 @@ bbbbb -48 insert into t values ('bb', 0); Error 1062 (23000): Duplicate entry 'b' for key 't.PRIMARY' insert into t values ('aa', 0); -Error 1062 (23000): Duplicate entry 'aa' for key 't.PRIMARY' +Error 1062 (23000): Duplicate entry 'a' for key 't.PRIMARY' commit; select * from t; col_1 col_2 diff --git a/tests/integrationtest/r/session/vars.result b/tests/integrationtest/r/session/vars.result index bc440927b61d6..2f354c8baadcc 100644 --- a/tests/integrationtest/r/session/vars.result +++ b/tests/integrationtest/r/session/vars.result @@ -62,6 +62,17 @@ set global tidb_enable_tso_follower_proxy = off; select @@tidb_enable_tso_follower_proxy; @@tidb_enable_tso_follower_proxy 0 +select @@pd_enable_follower_handle_region; +@@pd_enable_follower_handle_region +0 +set global pd_enable_follower_handle_region = on; +select @@pd_enable_follower_handle_region; +@@pd_enable_follower_handle_region +1 +set global pd_enable_follower_handle_region = off; +select @@pd_enable_follower_handle_region; +@@pd_enable_follower_handle_region +0 set tidb_tso_client_batch_max_wait_time = 0; Error 1229 (HY000): Variable 'tidb_tso_client_batch_max_wait_time' is a GLOBAL variable and should be set with SET GLOBAL set global tidb_enable_tso_follower_proxy = default; diff --git a/tests/integrationtest/r/sessionctx/setvar.result b/tests/integrationtest/r/sessionctx/setvar.result index 22830f86c9356..43c0f11367fd5 100644 --- a/tests/integrationtest/r/sessionctx/setvar.result +++ b/tests/integrationtest/r/sessionctx/setvar.result @@ -1630,6 +1630,24 @@ select /*+ set_var(max_execution_time=100) */ @@max_execution_time; select @@max_execution_time; @@max_execution_time 1000 +select @@tidb_max_chunk_size; +@@tidb_max_chunk_size +32 +select /*+ set_var(tidb_max_chunk_size=32) */ @@tidb_max_chunk_size; +@@tidb_max_chunk_size +32 +select @@tidb_max_chunk_size; +@@tidb_max_chunk_size +32 +select @@tidb_init_chunk_size; +@@tidb_init_chunk_size +1 +select /*+ set_var(tidb_init_chunk_size=3) */ @@tidb_init_chunk_size; +@@tidb_init_chunk_size +3 +select @@tidb_init_chunk_size; +@@tidb_init_chunk_size +1 set @@global.max_execution_time=1000; select @@max_execution_time; @@max_execution_time diff --git a/tests/integrationtest/r/table/index.result b/tests/integrationtest/r/table/index.result index 8ee408a5bf243..7cec18d6bd831 100644 --- a/tests/integrationtest/r/table/index.result +++ b/tests/integrationtest/r/table/index.result @@ -16,3 +16,18 @@ insert into t values (4, 3, 3); Error 1062 (23000): Duplicate entry '3' for key 't.v2' set @@tidb_txn_assertion_level=default; set @@tidb_constraint_check_in_place=default; +drop table if exists t; +create table t(a varchar(20), b varchar(20), unique index idx_a(a(1))); +insert into t values ('qaa', 'abc'); +insert into t values ('qbb', 'xyz'); +Error 1062 (23000): Duplicate entry 'q' for key 't.idx_a' +insert into t values ('rcc', 'xyz'); +select * from t order by a; +a b +qaa abc +rcc xyz +update t set a = 'qcc' where a = 'rcc'; +Error 1062 (23000): Duplicate entry 'q' for key 't.idx_a' +update ignore t set a = 'qcc' where a = 'rcc'; +Level Code Message +Warning 1062 Duplicate entry 'q' for key 't.idx_a' diff --git a/tests/integrationtest/run-tests.sh b/tests/integrationtest/run-tests.sh index e0142e77d0692..3595e18529cef 100755 --- a/tests/integrationtest/run-tests.sh +++ b/tests/integrationtest/run-tests.sh @@ -40,7 +40,7 @@ function help_message() -d : \"y\" or \"Y\" for only enabling the new collation during test. \"n\" or \"N\" for only disabling the new collation during test. - \"b\" or \"B\" for both tests [default]. + \"b\" or \"B\" for tests the prefix is `collation`, enabling and disabling new collation during test, and for other tests, only enabling the new collation [default]. Enable/Disable the new collation during the integration test. -s : Use tidb-server in for testing. @@ -88,7 +88,7 @@ function build_mysql_tester() { echo "building mysql-tester binary: $mysql_tester" rm -rf $mysql_tester - GOBIN=$PWD go install github.com/pingcap/mysql-tester/src@77628a8d2fae0c2f4cbc059d45785ae9615c817a + GOBIN=$PWD go install github.com/pingcap/mysql-tester/src@17b728effac3dd2f347bf508d4920657860ef719 mv src mysql_tester } @@ -120,7 +120,7 @@ while getopts "t:s:r:b:d:c:i:h:p" opt; do build=0 ;; *) - help_messge 1>&2 + help_message 1>&2 exit 1 ;; esac @@ -133,8 +133,11 @@ while getopts "t:s:r:b:d:c:i:h:p" opt; do n|N) collation_opt=0 ;; + b|B) + collation_opt=2 + ;; *) - help_messge 1>&2 + help_message 1>&2 exit 1 ;; esac @@ -232,10 +235,10 @@ function run_mysql_tester() if [ $record -eq 1 ]; then if [ "$record_case" = 'all' ]; then echo "record all cases" - $mysql_tester -port "$port" --collation-disable=$coll_disabled --record + $mysql_tester -port "$port" --check-error=true --collation-disable=$coll_disabled --record else echo "record result for case: \"$record_case\"" - $mysql_tester -port "$port" --collation-disable=$coll_disabled --record $record_case + $mysql_tester -port "$port" --check-error=true --collation-disable=$coll_disabled --record $record_case fi else if [ -z "$tests" ]; then @@ -243,7 +246,7 @@ function run_mysql_tester() else echo "run integration test cases($coll_msg): $tests" fi - $mysql_tester -port "$port" --collation-disable=$coll_disabled $tests + $mysql_tester -port "$port" --check-error=true --collation-disable=$coll_disabled $tests fi } @@ -260,7 +263,39 @@ function check_data_race() { } enabled_new_collation="" +function check_case_name() { + if [ $collation_opt != 2 ]; then + return + fi + + case="" + + if [ $record -eq 0 ]; then + if [ -z "$tests" ]; then + return + fi + case=$tests + fi + + if [ $record -eq 1 ]; then + if [ "$record_case" = 'all' ]; then + return + fi + case=$record_case + fi + + IFS='/' read -ra parts <<< "$case" + + last_part="${parts[${#parts[@]}-1]}" + + if [[ $last_part == collation* || $tests == collation* ]]; then + collation_opt=2 + else + collation_opt=1 + fi +} +check_case_name if [[ $collation_opt = 0 || $collation_opt = 2 ]]; then enabled_new_collation=0 start_tidb_server diff --git a/tests/integrationtest/t/collation_agg_func.test b/tests/integrationtest/t/collation_agg_func.test index ec96073b64cd3..8d8f74f089b0d 100644 --- a/tests/integrationtest/t/collation_agg_func.test +++ b/tests/integrationtest/t/collation_agg_func.test @@ -44,13 +44,13 @@ select approx_count_distinct(value collate utf8mb4_bin, value1) from t; # minMax create table tt(a char(10), b enum('a', 'B', 'c'), c set('a', 'B', 'c'), d json) collate utf8mb4_general_ci; insert into tt values ("a", "a", "a", JSON_OBJECT("a", "a")); ---error 1265 +--error 0,1265 insert into tt values ("A", "A", "A", JSON_OBJECT("A", "A")); ---error 1265 +--error 0,1265 insert into tt values ("b", "b", "b", JSON_OBJECT("b", "b")); insert into tt values ("B", "B", "B", JSON_OBJECT("B", "B")); insert into tt values ("c", "c", "c", JSON_OBJECT("c", "c")); ---error 1265 +--error 0,1265 insert into tt values ("C", "C", "C", JSON_OBJECT("C", "C")); split table tt by (0), (1), (2), (3), (4), (5); desc format='brief' select min(a) from tt; @@ -88,14 +88,10 @@ desc format='brief' select max(c collate utf8mb4_bin) from tt; select max(c collate utf8mb4_bin) from tt; desc format='brief' select min(d) from tt; select min(d) from tt; ---error 1253 desc format='brief' select min(d collate utf8mb4_bin) from tt; ---error 1253 select min(d collate utf8mb4_bin) from tt; desc format='brief' select max(d) from tt; select max(d) from tt; ---error 1253 desc format='brief' select max(d collate utf8mb4_bin) from tt; ---error 1253 select max(d collate utf8mb4_bin) from tt; diff --git a/tests/integrationtest/t/collation_check_use_collation.test b/tests/integrationtest/t/collation_check_use_collation.test index c7a9823740d94..8e48cd2a50d30 100644 --- a/tests/integrationtest/t/collation_check_use_collation.test +++ b/tests/integrationtest/t/collation_check_use_collation.test @@ -10,7 +10,6 @@ CREATE TABLE `t1` ( ); insert into t values ("A"); # Ignore error for the disabled new-collation case. ---error 1265 insert into t1 values ("a"); select a as a_col from t where t.a = all (select a collate utf8mb4_general_ci from t1); select a as a_col from t where t.a != any (select a collate utf8mb4_general_ci from t1); @@ -29,7 +28,7 @@ drop table if exists t; create table t(a enum('a', 'b') charset utf8mb4 collate utf8mb4_general_ci, b varchar(20)); insert into t values ("b", "c"); # Ignore error for the disabled new-collation case. ---error 1265 +--error 0,1265 insert into t values ("B", "b"); select * from t where 'B' collate utf8mb4_general_ci in (a); select * from t where 'B' collate utf8mb4_bin in (a); @@ -57,7 +56,7 @@ drop table if exists t; create table t(a set('a', 'b') charset utf8mb4 collate utf8mb4_general_ci, b varchar(20)); insert into t values ("b", "c"); # Ignore error for the disabled new-collation case. ---error 1265 +--error 0,1265 insert into t values ("B", "b"); select * from t where 'B' collate utf8mb4_general_ci in (a); select * from t where 'B' collate utf8mb4_bin in (a); diff --git a/tests/integrationtest/t/collation_misc.test b/tests/integrationtest/t/collation_misc.test index 5549cd265da8c..85c55049d0bca 100644 --- a/tests/integrationtest/t/collation_misc.test +++ b/tests/integrationtest/t/collation_misc.test @@ -50,18 +50,18 @@ select * from t; # TestCharsetDatabase create database if not exists cd_test_utf8 CHARACTER SET utf8 COLLATE utf8_bin; ---error 1273 +--error 0,1273 create database if not exists cd_test_latin1 CHARACTER SET latin1 COLLATE latin1_swedish_ci; use cd_test_utf8; select @@character_set_database; select @@collation_database; ---error 1049 +--error 0,1049 use cd_test_latin1; select @@character_set_database; select @@collation_database; # DefaultDBAfterDropCurDB ---error 1273 +--error 0,1273 create database if not exists test_db CHARACTER SET latin1 COLLATE latin1_swedish_ci; # CollationUnion diff --git a/tests/integrationtest/t/db_integration.test b/tests/integrationtest/t/db_integration.test new file mode 100644 index 0000000000000..727fa68826478 --- /dev/null +++ b/tests/integrationtest/t/db_integration.test @@ -0,0 +1,16 @@ +DROP TABLE IF EXISTS u1,u2; +CREATE TABLE u1 (id INT PRIMARY KEY, c1 VARCHAR(36) DEFAULT UUID()); +CREATE TABLE u2 (id INT PRIMARY KEY, c1 VARBINARY(16) DEFAULT UUID_TO_BIN(UUID())); + +--error 1674 +ALTER TABLE u1 ADD COLUMN c2 VARCHAR(36) DEFAULT (UUID()); + +--error 1674 +ALTER TABLE u2 ADD COLUMN c2 VARBINARY(16) DEFAULT UUID_TO_BIN(UUID(), 1); + +INSERT INTO u1(id) VALUES (1),(2),(3); +INSERT INTO u2(id) VALUES (1),(2),(3); +SELECT IS_UUID(c1) FROM u1; +SELECT IS_UUID(BIN_TO_UUID(c1)) FROM u2; +SHOW CREATE TABLE u1; +SHOW CREATE TABLE u2; diff --git a/tests/integrationtest/t/ddl/bdr_mode.test b/tests/integrationtest/t/ddl/bdr_mode.test new file mode 100644 index 0000000000000..9c1c9262c60f6 --- /dev/null +++ b/tests/integrationtest/t/ddl/bdr_mode.test @@ -0,0 +1,568 @@ +# NOTE: +# 1. lock/unlock table is a experimental feature, and it need be configured +# in configuration file. So we do not test it. +# 2. ActionAlterTableStatsOptions is not used. + +# *******TestPrimaryRole******* +create database bdr_mode; +use bdr_mode; +admin set bdr role primary; + +create table t(a int); +alter table t add column b int; +-- error 8263 +alter table t drop column b; +alter table t add index idx_a(a); +alter table t alter index idx_a invisible; +alter table t alter index idx_a visible; +alter table t rename index idx_a to idx_a_2; +alter table t drop index idx_a_2; + +create table t2(a int, primary key (a)); +-- error 8263 +rename table t to t3, t2 to t4; +-- error 8263 +alter table t add foreign key (a) references t2(a); +admin unset bdr role; +alter table t add foreign key (a) references t2(a); +admin set bdr role primary; +-- error 8263 +alter table t drop foreign key fk_1; +admin unset bdr role; +alter table t drop foreign key fk_1; +alter table t drop index fk_1; +admin set bdr role primary; +-- error 8263 +truncate table t2; +-- error 8263 +drop table t2; + +-- error 8263 +alter table t modify column a bigint; +-- error 8263 +alter table t auto_increment = 6000; +alter table t alter column a set default 1; +-- error 8263 +alter table t shard_row_id_bits = 4; +alter table t comment = 'test'; +admin unset bdr role; +drop table t; +drop table t2; +admin set bdr role primary; + +# add partition +create table t(a int) partition by range(a) ( + partition p0 values less than (5), + partition p1 values less than (10), + partition p2 values less than (15)); +alter table t add partition (partition p3 values less than (100)); + +# placement rule +create placement policy pp4 followers=4; +-- error 8263 +alter table t placement policy=pp4; +-- error 8263 +alter table t partition p3 placement policy=pp4; +-- error 8263 +alter database bdr_mode placement policy=pp4; +alter placement policy pp4 followers=3; +-- error 8263 +alter table t placement policy=default; +-- error 8263 +alter table t partition p3 placement policy=default; +-- error 8263 +alter database bdr_mode placement policy=default; +drop placement policy pp4; + +-- error 8263 +alter table t attributes="merge_option=allow"; +-- error 8263 +alter table t partition p3 attributes="key1=value1"; + +# exchange/truncate/drop partition +create table t2(a int); +-- error 8263 +alter table t exchange partition p0 with table t2; +-- error 8263 +alter table t truncate partition p0; +-- error 8263 +alter table t reorganize partition p0 into +( + partition p4 values less than (0), + partition p5 values less than (5) +); +-- error 8263 +alter table t drop partition p0; +admin unset bdr role; +drop table t2; +admin set bdr role primary; + +create placement policy pp1 followers=1; +-- error 8263 +alter table t partition by range (a) (partition p0 values less than (1000000), partition pMax values less than (maxvalue) placement policy pp1); +admin unset bdr role; +drop table t; +admin set bdr role primary; +drop placement policy pp1; + +create table t(a int); +# add/alter/drop constraint +set global tidb_enable_check_constraint=ON; +-- error 8263 +alter table t add constraint `a_check` check(a > 0); +admin unset bdr role; +alter table t add constraint `a_check` check(a > 0); +admin set bdr role primary; +-- error 8263 +alter table t alter constraint `a_check` enforced; +-- error 8263 +alter table t drop constraint `a_check`; +admin unset bdr role; +alter table t drop constraint `a_check`; +admin set bdr role primary; +set global tidb_enable_check_constraint=OFF; + +# cache +-- error 8263 +alter table t cache; +admin unset bdr role; +alter table t cache; +admin set bdr role primary; +-- error 8263 +alter table t nocache; +admin unset bdr role; +alter table t nocache; +admin set bdr role primary; + +# alter ttl +CREATE TABLE ttl_test (created_at datetime) TTL = `created_at` + INTERVAL 5 DAY; +ALTER TABLE ttl_test TTL = `created_at` + INTERVAL 2 YEAR; +alter table ttl_test remove ttl; +admin unset bdr role; +drop table ttl_test; +admin set bdr role primary; + +-- error 8263 +alter table t add primary key (a); +admin unset bdr role; +alter table t add primary key (a); +admin set bdr role primary; +alter table t drop primary key; +-- error 8263 +alter table t add unique index (a); +-- error 8263 +alter table t auto_id_cache = 10; + +create table t_random(a bigint auto_random, primary key (a)); +-- error 8263 +alter table t_random auto_random_base = 10; +admin unset bdr role; +drop table t_random; +admin set bdr role primary; + +-- error 8263 +create sequence seq; +admin unset bdr role; +create sequence seq; +admin set bdr role primary; +-- error 8263 +alter sequence seq restart; +-- error 8263 +drop sequence seq; +admin unset bdr role; +drop sequence seq; +admin set bdr role primary; + +create view v as select 1 as b; +drop view v; + +-- error 8263 +alter table t charset utf8mb4 collate utf8mb4_unicode_ci; +-- error 8263 +alter database bdr_mode default character set = utf8; +admin unset bdr role; +drop database bdr_mode; +admin set bdr role primary; + +# resource group +create resource group rg1 ru_per_sec = 100; +create user user1; +alter user `user1` resource group `rg1`; +alter resource group rg1 ru_per_sec = 200; +drop user user1; +drop resource group if exists rg1; + +# *******TestSecondaryRole******* +create database bdr_mode; +use bdr_mode; + +create table t(a int, b int); +admin set bdr role secondary; +-- error 8263 +alter table t add column c int; +-- error 8263 +alter table t drop column b; +-- error 8263 +alter table t add index idx_a(a); +admin unset bdr role; +alter table t add index idx_a(a); +admin set bdr role secondary; +-- error 8263 +alter table t alter index idx_a invisible; +admin unset bdr role; +alter table t alter index idx_a invisible; +admin set bdr role secondary; +-- error 8263 +alter table t alter index idx_a visible; +-- error 8263 +alter table t rename index idx_a to idx_a_2; +-- error 8263 +alter table t drop index idx_a; +admin unset bdr role; +alter table t drop index idx_a; + +create table t2(a int, primary key (a)); +admin set bdr role secondary; +-- error 8263 +rename table t to t3, t2 to t4; +-- error 8263 +alter table t add foreign key (a) references t2(a); +admin unset bdr role; +alter table t add foreign key (a) references t2(a); +admin set bdr role secondary; +-- error 8263 +alter table t drop foreign key fk_1; +admin unset bdr role; +alter table t drop foreign key fk_1; +alter table t drop index fk_1; +admin set bdr role secondary; +-- error 8263 +truncate table t2; +-- error 8263 +drop table t2; + +-- error 8263 +alter table t modify column a bigint; +-- error 8263 +alter table t auto_increment = 6000; +-- error 8263 +alter table t alter column a set default 1; +-- error 8263 +alter table t shard_row_id_bits = 4; +-- error 8263 +alter table t comment = 'test'; +admin unset bdr role; +drop table t; +drop table t2; +admin set bdr role secondary; + +# add partition +-- error 8263 +create table t(a int) partition by range(a) ( + partition p0 values less than (5), + partition p1 values less than (10), + partition p2 values less than (15)); +admin unset bdr role; +create table t(a int) partition by range(a) ( + partition p0 values less than (5), + partition p1 values less than (10), + partition p2 values less than (15)); +admin set bdr role secondary; +-- error 8263 +alter table t add partition (partition p3 values less than (100)); + +# placement rule +create placement policy pp4 followers=4; +-- error 8263 +alter table t placement policy=pp4; +-- error 8263 +alter table t partition p2 placement policy=pp4; +-- error 8263 +alter database bdr_mode placement policy=pp4; +alter placement policy pp4 followers=3; +-- error 8263 +alter table t placement policy=default; +-- error 8263 +alter table t partition p2 placement policy=default; +-- error 8263 +alter database bdr_mode placement policy=default; +drop placement policy pp4; + +-- error 8263 +alter table t attributes="merge_option=allow"; +-- error 8263 +alter table t partition p2 attributes="key1=value1"; + +# exchange/truncate/drop partition +admin unset bdr role; +create table t2(a int); +admin set bdr role secondary; +-- error 8263 +alter table t exchange partition p0 with table t2; +-- error 8263 +alter table t truncate partition p0; +-- error 8263 +alter table t reorganize partition p0 into +( + partition p4 values less than (0), + partition p5 values less than (5) +); +-- error 8263 +alter table t drop partition p2; +admin unset bdr role; +drop table t2; +admin set bdr role secondary; + +create placement policy pp1 followers=1; +-- error 8263 +alter table t partition by range (a) (partition p0 values less than (1000000), partition pMax values less than (maxvalue) placement policy pp1); +admin unset bdr role; +drop table t; +admin set bdr role secondary; +drop placement policy pp1; + +admin unset bdr role; +create table t(a int); +admin set bdr role secondary; +# add/alter/drop constraint +set global tidb_enable_check_constraint=ON; +-- error 8263 +alter table t add constraint `a_check` check(a > 0); +admin unset bdr role; +alter table t add constraint `a_check` check(a > 0); +admin set bdr role secondary; +-- error 8263 +alter table t alter constraint `a_check` enforced; +-- error 8263 +alter table t drop constraint `a_check`; +admin unset bdr role; +alter table t drop constraint `a_check`; +admin set bdr role secondary; +set global tidb_enable_check_constraint=OFF; + +# cache +-- error 8263 +alter table t cache; +admin unset bdr role; +alter table t cache; +admin set bdr role secondary; +-- error 8263 +alter table t nocache; +admin unset bdr role; +alter table t nocache; + +# alter ttl +CREATE TABLE ttl_test (created_at datetime) TTL = `created_at` + INTERVAL 5 DAY; +admin set bdr role secondary; +-- error 8263 +ALTER TABLE ttl_test TTL = `created_at` + INTERVAL 2 YEAR; +-- error 8263 +alter table ttl_test remove ttl; +-- error 8263 +drop table ttl_test; + +-- error 8263 +alter table t add primary key (a); +admin unset bdr role; +alter table t add primary key (a); +admin set bdr role secondary; +-- error 8263 +alter table t drop primary key; +admin unset bdr role; +alter table t drop primary key; +admin set bdr role secondary; +-- error 8263 +alter table t add unique index (a); +-- error 8263 +alter table t auto_id_cache = 10; + +admin unset bdr role; +create table t_random(a bigint auto_random, primary key (a)); +admin set bdr role secondary; +-- error 8263 +alter table t_random auto_random_base = 10; +admin unset bdr role; +drop table t_random; +admin set bdr role secondary; + +-- error 8263 +create sequence seq; +admin unset bdr role; +create sequence seq; +admin set bdr role secondary; +-- error 8263 +alter sequence seq restart; +-- error 8263 +drop sequence seq; +admin unset bdr role; +drop sequence seq; +admin set bdr role secondary; + +-- error 8263 +create view v as select 1 as b; +admin unset bdr role; +create view v as select 1 as b; +admin set bdr role secondary; +-- error 8263 +drop view v; +admin unset bdr role; +drop view v; +admin set bdr role secondary; + +-- error 8263 +alter table t charset utf8mb4 collate utf8mb4_unicode_ci; +-- error 8263 +alter database bdr_mode default character set = utf8; +-- error 8263 +drop database bdr_mode; +admin unset bdr role; +drop database bdr_mode; +admin set bdr role secondary; + +# resource group +create resource group rg1 ru_per_sec = 100; +create user user1; +alter user `user1` resource group `rg1`; +alter resource group rg1 ru_per_sec = 200; +drop user user1; +drop resource group if exists rg1; + +# *******TestLocalOnlyRole******* +admin unset bdr role; +create database bdr_mode; +use bdr_mode; +create table t(a int); +alter table t add column b int; +alter table t drop column b; +alter table t add index idx_a(a); +alter table t alter index idx_a invisible; +alter table t alter index idx_a visible; +alter table t rename index idx_a to idx_a_2; +alter table t drop index idx_a_2; + +create table t2(a int, primary key (a)); +rename table t to t3, t2 to t4; +rename table t3 to t, t4 to t2; +alter table t add foreign key (a) references t2(a); +alter table t drop foreign key fk_1; +alter table t drop index fk_1; +truncate table t2; +drop table t2; + +alter table t modify column a bigint; +alter table t auto_increment = 6000; +alter table t alter column a set default 1; +alter table t shard_row_id_bits = 4; +alter table t comment = 'test'; +drop table t; + +# add partition +create table t(a int) partition by range(a) ( + partition p0 values less than (5), + partition p1 values less than (10), + partition p2 values less than (15)); +alter table t add partition (partition p3 values less than (100)); + +# placement rule +create placement policy pp4 followers=4; +alter table t placement policy=pp4; +alter table t partition p3 placement policy=pp4; +alter database bdr_mode placement policy=pp4; +alter placement policy pp4 followers=3; +alter table t placement policy=default; +alter table t partition p3 placement policy=default; +alter database bdr_mode placement policy=default; +drop placement policy pp4; + +alter table t attributes="merge_option=allow"; +alter table t partition p3 attributes="key1=value1"; + +# exchange/truncate/drop partition +create table t2(a int); +alter table t exchange partition p0 with table t2; +alter table t truncate partition p0; +alter table t reorganize partition p0 into +( + partition p4 values less than (0), + partition p5 values less than (5) +); +alter table t drop partition p5; +drop table t2; + +create placement policy pp1 followers=1; +alter table t partition by range (a) (partition p0 values less than (1000000), partition pMax values less than (maxvalue) placement policy pp1); +drop table t; +drop placement policy pp1; + +create table t(a int); +# add/alter/drop constraint +set global tidb_enable_check_constraint=ON; +alter table t add constraint `a_check` check(a > 0); +alter table t alter constraint `a_check` enforced; +alter table t drop constraint `a_check`; +set global tidb_enable_check_constraint=OFF; + +# cache +alter table t cache; +alter table t nocache; + +# alter ttl +CREATE TABLE ttl_test (created_at datetime) TTL = `created_at` + INTERVAL 5 DAY; +ALTER TABLE ttl_test TTL = `created_at` + INTERVAL 2 YEAR; +alter table ttl_test remove ttl; +drop table ttl_test; + +alter table t add primary key (a); +alter table t drop primary key; +alter table t add unique index (a); +alter table t drop index a; +alter table t auto_id_cache = 10; + +create table t_random(a bigint auto_random, primary key (a)); +alter table t_random auto_random_base = 10; +drop table t_random; + +create sequence seq; +alter sequence seq restart; +drop sequence seq; + +create view v as select 1 as b; +drop view v; + +alter table t charset utf8mb4 collate utf8mb4_unicode_ci; +alter database bdr_mode default character set = utf8; +drop database bdr_mode; + +# resource group +create resource group rg1 ru_per_sec = 100; +create user user1; +alter user `user1` resource group `rg1`; +alter resource group rg1 ru_per_sec = 200; +drop user user1; +drop resource group if exists rg1; +admin unset bdr role; + +# *******TestModifyColumn******* +create database bdr_mode; +use bdr_mode; +admin set bdr role primary; +create table t(a int); +-- error 8263 +alter table t modify column a bigint; +alter table t modify column a int default 10; +-- error 8263 +alter table t modify column a int comment "test"; +alter table t modify column a int default 100 comment "test"; +admin unset bdr role; +drop table t; + +# *******TestAddColumn******* +admin set bdr role primary; +create table t(a int); +alter table t add column b int; +alter table t add column c int null; +-- error 8263 +alter table t add column d int not null; +alter table t add column d int not null default 10; +admin unset bdr role; +drop database bdr_mode; diff --git a/tests/integrationtest/t/ddl/constraint.test b/tests/integrationtest/t/ddl/constraint.test index 2496734ae2baa..4becc4152e911 100644 --- a/tests/integrationtest/t/ddl/constraint.test +++ b/tests/integrationtest/t/ddl/constraint.test @@ -469,7 +469,7 @@ select * from s; # TestCheckConstraintOnInsert drop table if exists t1, t2; -CREATE TABLE t1 (CHECK (c1 <> c2), c1 INT CHECK (c1 > 10), c2 INT CONSTRAINT c2_positive CHECK (c2 > 0)); +CREATE TABLE t1 (CHECK (c1 <> c2), c1 INT CHECK (c1 > 10), c2 INT CONSTRAINT c2_positive_for_t1 CHECK (c2 > 0)); -- error 3819 insert into t1 values (2, 2); -- error 3819 @@ -486,14 +486,14 @@ insert into t1 values (13, null); insert into t1 values (null, null); insert into t1(c1) values (null); insert into t1(c2) values (null); -CREATE TABLE t2 (CHECK (c1 <> c2), c1 INT CHECK (c1 > 10), c2 INT CONSTRAINT c2_positive CHECK (c2 > 0), c3 int as (c1 + c2) check(c3 > 15)); +CREATE TABLE t2 (CHECK (c1 <> c2), c1 INT CHECK (c1 > 10), c2 INT CONSTRAINT c2_positive_for_t2 CHECK (c2 > 0), c3 int as (c1 + c2) check(c3 > 15)); -- error 3819 insert into t2(c1, c2) values (11, 1); insert into t2(c1, c2) values (12, 7); # TestCheckConstraintOnUpdate drop table if exists t1, t2; -CREATE TABLE t1 (CHECK (c1 <> c2), c1 INT CHECK (c1 > 10), c2 INT CONSTRAINT c2_positive CHECK (c2 > 0)); +CREATE TABLE t1 (CHECK (c1 <> c2), c1 INT CHECK (c1 > 10), c2 INT CONSTRAINT c2_positive_for_t1 CHECK (c2 > 0)); insert into t1 values (11, 12), (12, 13), (13, 14), (14, 15), (15, 16); -- error 3819 update t1 set c2 = -c2; @@ -503,7 +503,7 @@ update t1 set c2 = c1; update t1 set c1 = c1 - 10; -- error 3819 update t1 set c2 = -10 where c2 = 12; -CREATE TABLE t2 (CHECK (c1 <> c2), c1 INT CHECK (c1 > 10), c2 INT CONSTRAINT c2_positive CHECK (c2 > 0), c3 int as (c1 + c2) check(c3 > 15)); +CREATE TABLE t2 (CHECK (c1 <> c2), c1 INT CHECK (c1 > 10), c2 INT CONSTRAINT c2_positive_for_t2 CHECK (c2 > 0), c3 int as (c1 + c2) check(c3 > 15)); insert into t2(c1, c2) values (11, 12), (12, 13), (13, 14), (14, 15), (15, 16); -- error 3819 update t2 set c2 = c2 - 10; @@ -511,7 +511,7 @@ update t2 set c2 = c2 - 5; # TestCheckConstraintOnUpdateWithPartition drop table if exists t1, t2; -CREATE TABLE t1 (CHECK (c1 <> c2), c1 INT CHECK (c1 > 10), c2 INT CONSTRAINT c2_positive CHECK (c2 > 0)) partition by hash(c2) partitions 5; +CREATE TABLE t1 (CHECK (c1 <> c2), c1 INT CHECK (c1 > 10), c2 INT CONSTRAINT c2_positive_for_t1 CHECK (c2 > 0)) partition by hash(c2) partitions 5; insert into t1 values (11, 12), (12, 13), (13, 14), (14, 15), (15, 16); -- error 3819 update t1 set c2 = -c2; @@ -521,7 +521,7 @@ update t1 set c2 = c1; update t1 set c1 = c1 - 10; -- error 3819 update t1 set c2 = -10 where c2 = 12; -CREATE TABLE t2 (CHECK (c1 <> c2), c1 INT CHECK (c1 > 10), c2 INT CONSTRAINT c2_positive CHECK (c2 > 0), c3 int as (c1 + c2) check(c3 > 15)) partition by hash(c2) partitions 5; +CREATE TABLE t2 (CHECK (c1 <> c2), c1 INT CHECK (c1 > 10), c2 INT CONSTRAINT c2_positive_for_t2 CHECK (c2 > 0), c3 int as (c1 + c2) check(c3 > 15)) partition by hash(c2) partitions 5; insert into t2(c1, c2) values (11, 12), (12, 13), (13, 14), (14, 15), (15, 16); -- error 3819 update t2 set c2 = c2 - 10; @@ -619,7 +619,6 @@ create table t(a int); insert into t values(1), (2), (3); -- error 3819 alter table t add constraint check(a < 2); --- error 3819 alter table t add constraint check(a < 2) not enforced; # TestAlterTableDropCheckConstraints @@ -666,12 +665,12 @@ CREATE TABLE `t` (`a` int(11) DEFAULT NULL); show create table t; insert t values(1); select * from t; --- error 3940 +-- error 3819 alter table t ADD CONSTRAINT chk CHECK (a > 1) ENFORCED; --- error 3940 +-- error 3819 alter table t ADD CONSTRAINT chk CHECK (a > 1) ENFORCED; alter table t ADD CONSTRAINT chk CHECK (a > 1) NOT ENFORCED; --- error 3940 +-- error 3819 ALTER TABLE t ALTER CONSTRAINT chk ENFORCED; show create table t; alter table t drop CONSTRAINT chk; diff --git a/tests/integrationtest/t/ddl/db_integration.test b/tests/integrationtest/t/ddl/db_integration.test index 8b5c170681b05..74949497795f2 100644 --- a/tests/integrationtest/t/ddl/db_integration.test +++ b/tests/integrationtest/t/ddl/db_integration.test @@ -1019,3 +1019,92 @@ create table t (id bigint, b varchar(20), index idxb(b)) partition by range(id) alter table t reorganize partition p0 into (partition p01 values less than (10), partition p02 values less than (20)); show warnings; + +# TestCreateExpressionIndexError +drop table if exists t; +create table t (a int, b real); +-- error 3756 +alter table t add primary key ((a+b)) nonclustered; +-- error 3753 +create table t(a int, index((cast(a as JSON)))); +drop table if exists t; +create table t (a int, b real); +-- error 3756 +alter table t add primary key ((a+b)) nonclustered; +-- error 3758 +alter table t add index ((rand())); +-- error 3758 +alter table t add index ((now()+1)); +alter table t add column (_V$_idx_0 int); +-- error 1060 +alter table t add index idx((a+1)); +alter table t drop column _V$_idx_0; +alter table t add index idx((a+1)); +-- error 1060 +alter table t add column (_V$_idx_0 int); +alter table t drop index idx; +alter table t add column (_V$_idx_0 int); +alter table t add column (_V$_expression_index_0 int); +-- error 1060 +alter table t add index ((a+1)); +alter table t drop column _V$_expression_index_0; +alter table t add index ((a+1)); +-- error 1091 +alter table t drop column _V$_expression_index_0; +-- error 1054 +alter table t add column e int as (_V$_expression_index_0 + 1); + +## NOTE (#18150): In creating expression index, row value is not allowed. +drop table if exists t; +-- error 3800 +create table t (j json, key k (((j,j)))); +create table t (j json, key k ((j+1),(j+1))); +-- error 3761 +create table t1 (col1 int, index ((concat('')))); +-- error 3756 +CREATE TABLE t1 (col1 INT, PRIMARY KEY ((ABS(col1))) NONCLUSTERED); + +## For issue 26349 +drop table if exists t; +create table t(id char(10) primary key, short_name char(10), name char(10), key n((upper(`name`)))); +update t t1 set t1.short_name='a' where t1.id='1'; + + +# TestStrictDoubleTypeCheck +set @@tidb_enable_strict_double_type_check = 'ON'; +drop table if exists double_type_check; +--error 1149 +create table double_type_check(id int, c double(10)); +set @@tidb_enable_strict_double_type_check = 'OFF'; +create table double_type_check(id int, c double(10)); +set @@tidb_enable_strict_double_type_check = default; + + +# TestCreateTempTableInTxn +# https://github.com/pingcap/tidb/issues/35644 +drop table if exists t1, t2, tt; +begin; +create temporary table t1(id int primary key, v int); +select * from t1; +insert into t1 values(123, 456); +select * from t1 where id=123; +truncate table t1; +select * from t1 where id=123; +commit; + +connect (conn1, localhost, root,, ddl__db_integration); +create table tt(id int); +begin; +create temporary table t1(id int); +insert into tt select * from t1; +drop table tt; +disconnect conn1; + +connect (conn1, localhost, root,, ddl__db_integration); +create table t2(id int primary key, v int); +insert into t2 values(234, 567); +begin; +create temporary table t2(id int primary key, v int); +select * from t2 where id=234; +commit; +disconnect conn1; diff --git a/tests/integrationtest/t/ddl/db_partition.test b/tests/integrationtest/t/ddl/db_partition.test index 3f8389edbdac8..16079fbb88620 100644 --- a/tests/integrationtest/t/ddl/db_partition.test +++ b/tests/integrationtest/t/ddl/db_partition.test @@ -307,7 +307,7 @@ explain format = 'brief' select * from t where a is null; explain format = 'brief' select * from t where a = 3; # TODO: check ranges with 1,2 and 3 matching values, including 'holes' matching DEFAULT # DEFAULT partition will not be used in reorganize partition if not included in the source/destination --- error 8112 +-- error 1526 alter table t reorganize partition p0 into (partition p0 values in (0)); drop table t; CREATE TABLE t (a VARCHAR(100),b INT) PARTITION BY LIST COLUMNS (a) (PARTITION p1 VALUES IN ('a', 'b', 'DEFAULT'),PARTITION pDef DEFAULT); @@ -369,7 +369,7 @@ explain format = 'brief' select * from t where a >= "3" and a <= "4"; --sorted_result select * from t where a >= "3" and a <= "4"; # DEFAULT partition will not be used in reorganize partition if not included in the source/destination --- error 8112 +-- error 1526 alter table t reorganize partition p0 into (partition p0 values in (0)); set @@tidb_partition_prune_mode = default; @@ -2212,4 +2212,227 @@ create table t5 ( time_recorded timestamp ) partition by range(unix_timestamp(time_recorded)) ( partition p1 values less than (1559192604) ); -set @@session.tidb_enable_table_partition = default; \ No newline at end of file +set @@session.tidb_enable_table_partition = default; + + +# TestExchangePartitionExpressIndex +set @@tidb_enable_exchange_partition=1; +drop table if exists pt1; +create table pt1(a int, b int, c int) PARTITION BY hash (a) partitions 1; +alter table pt1 add index idx((a+c)); + +drop table if exists nt1; +create table nt1(a int, b int, c int); +--error 1736 +alter table pt1 exchange partition p0 with table nt1; + +alter table nt1 add column (`_V$_idx_0` bigint(20) generated always as (a+b) virtual); +--error 1736 +alter table pt1 exchange partition p0 with table nt1; + +## test different expression index when expression returns same field type +alter table nt1 drop column `_V$_idx_0`; +alter table nt1 add index idx((b-c)); +--error 1736 +alter table pt1 exchange partition p0 with table nt1; + +## test different expression index when expression returns different field type +alter table nt1 drop index idx; +alter table nt1 add index idx((concat(a, b))); +--error 1736 +alter table pt1 exchange partition p0 with table nt1; + +drop table if exists nt2; +create table nt2 (a int, b int, c int); +alter table nt2 add index idx((a+c)); +alter table pt1 exchange partition p0 with table nt2; + + +# TestExchangePartitionTableCompatiable +set tidb_enable_global_index=true; + +drop database if exists partition_exchange; +create database partition_exchange; +use partition_exchange; + +create table pt (id int not null) partition by hash (id) partitions 4; +create table nt (id int(1) not null); +alter table pt exchange partition p0 with table nt; + +create table pt1 (id int not null, fname varchar(3)) partition by hash (id) partitions 4; +create table nt1 (id int not null, fname varchar(4)); +-- error 1736 +alter table pt1 exchange partition p0 with table nt1; + +create table pt2 (id int not null, salary decimal) partition by hash(id) partitions 4; +create table nt2 (id int not null, salary decimal(3,2)); +-- error 1736 +alter table pt2 exchange partition p0 with table nt2; + +create table pt3 (id int not null, salary decimal) partition by hash(id) partitions 1; +create table nt3 (id int not null, salary decimal(10, 1)); +-- error 1736 +alter table pt3 exchange partition p0 with table nt3; + +create table pt4 (id int not null) partition by hash(id) partitions 1; +create table nt4 (id1 int not null); +-- error 1736 +alter table pt4 exchange partition p0 with table nt4; + +create table pt5 (id int not null, primary key (id)) partition by hash(id) partitions 1; +create table nt5 (id int not null); +-- error 1736 +alter table pt5 exchange partition p0 with table nt5; + +create table pt6 (id int not null, salary decimal, index idx (id, salary)) partition by hash(id) partitions 1; +create table nt6 (id int not null, salary decimal, index idx (salary, id)); +-- error 1736 +alter table pt6 exchange partition p0 with table nt6; + +create table pt7 (id int not null, index idx (id) invisible) partition by hash(id) partitions 1; +create table nt7 (id int not null, index idx (id)); +alter table pt7 exchange partition p0 with table nt7; + +create table pt8 (id int not null, index idx (id)) partition by hash(id) partitions 1; +create table nt8 (id int not null, index id_idx (id)); +-- error 1736 +alter table pt8 exchange partition p0 with table nt8; + +--echo ## Generated column (virtual) +create table pt10 (id int not null, lname varchar(30), fname varchar(100) generated always as (concat(lname,' ')) virtual) partition by hash(id) partitions 1; +create table nt10 (id int not null, lname varchar(30), fname varchar(100)); +-- error 3106 +alter table pt10 exchange partition p0 with table nt10; + +create table pt11 (id int not null, lname varchar(30), fname varchar(100)) partition by hash(id) partitions 1; +create table nt11 (id int not null, lname varchar(30), fname varchar(100) generated always as (concat(lname, ' ')) virtual); +-- error 3106 +alter table pt11 exchange partition p0 with table nt11; + +create table pt12 (id int not null, lname varchar(30), fname varchar(100) generated always as (concat(lname,' ')) stored) partition by hash(id) partitions 1; +create table nt12 (id int not null, lname varchar(30), fname varchar(100)); +-- error 1736 +alter table pt12 exchange partition p0 with table nt12; + +create table pt13 (id int not null, lname varchar(30), fname varchar(100)) partition by hash(id) partitions 1; +create table nt13 (id int not null, lname varchar(30), fname varchar(100) generated always as (concat(lname, ' ')) stored); +-- error 1736 +alter table pt13 exchange partition p0 with table nt13; + +create table pt14 (id int not null, lname varchar(30), fname varchar(100) generated always as (concat(lname, ' ')) virtual) partition by hash(id) partitions 1; +create table nt14 (id int not null, lname varchar(30), fname varchar(100) generated always as (concat(lname, ' ')) virtual); +alter table pt14 exchange partition p0 with table nt14; + +--echo ## unique index +create table pt15 (id int not null, unique index uk_id (id)) partition by hash(id) partitions 1; +create table nt15 (id int not null, index uk_id (id)); +-- error 1736 +alter table pt15 exchange partition p0 with table nt15; + +--echo ## auto_increment +create table pt16 (id int not null primary key auto_increment) partition by hash(id) partitions 1; +create table nt16 (id int not null primary key); +-- error 1736 +alter table pt16 exchange partition p0 with table nt16; + +--echo ## default +create table pt17 (id int not null default 1) partition by hash(id) partitions 1; +create table nt17 (id int not null); +alter table pt17 exchange partition p0 with table nt17; + +--echo ## view test +create table pt18 (id int not null) partition by hash(id) partitions 1; +create view nt18 as select id from nt17; +-- error 1177 +alter table pt18 exchange partition p0 with table nt18; + +create table pt19 (id int not null, lname varchar(30), fname varchar(100) generated always as (concat(lname, ' ')) stored) partition by hash(id) partitions 1; +create table nt19 (id int not null, lname varchar(30), fname varchar(100) generated always as (concat(lname, ' ')) virtual); +-- error 3106 +alter table pt19 exchange partition p0 with table nt19; + +create table pt20 (id int not null) partition by hash(id) partitions 1; +create table nt20 (id int default null); +-- error 1736 +alter table pt20 exchange partition p0 with table nt20; + +--echo ## unsigned +create table pt21 (id int unsigned) partition by hash(id) partitions 1; +create table nt21 (id int); +-- error 1736 +alter table pt21 exchange partition p0 with table nt21; + +--echo ## zerofill +create table pt22 (id int) partition by hash(id) partitions 1; +create table nt22 (id int zerofill); +-- error 1736 +alter table pt22 exchange partition p0 with table nt22; + +create table pt23 (id int, lname varchar(10) charset binary) partition by hash(id) partitions 1; +create table nt23 (id int, lname varchar(10)); +-- error 1736 +alter table pt23 exchange partition p0 with table nt23; + +create table pt25 (id int, a datetime on update current_timestamp) partition by hash(id) partitions 1; +create table nt25 (id int, a datetime); +alter table pt25 exchange partition p0 with table nt25; + +create table pt26 (id int not null, lname varchar(30), fname varchar(100) generated always as (concat(lname, ' ')) virtual) partition by hash(id) partitions 1; +create table nt26 (id int not null, lname varchar(30), fname varchar(100) generated always as (concat(id, ' ')) virtual); +-- error 1736 +alter table pt26 exchange partition p0 with table nt26; + +create table pt27 (a int key, b int, index(a)) partition by hash(a) partitions 1; +create table nt27 (a int not null, b int, index(a)); +-- error 1736 +alter table pt27 exchange partition p0 with table nt27; + +create table pt28 (a int primary key, b int, index(a)) partition by hash(a) partitions 1; +create table nt28 (a int not null, b int, index(a)); +-- error 1736 +alter table pt28 exchange partition p0 with table nt28; + +create table pt29 (a int primary key, b int) partition by hash(a) partitions 1; +create table nt29 (a int not null, b int, index(a)); +-- error 1736 +alter table pt29 exchange partition p0 with table nt29; + +create table pt30 (a int primary key, b int) partition by hash(a) partitions 1; +create table nt30 (a int, b int, unique index(a)); +-- error 1736 +alter table pt30 exchange partition p0 with table nt30; + +--echo ## auto_increment +create table pt31 (id bigint not null primary key auto_increment) partition by hash(id) partitions 1; +create table nt31 (id bigint not null primary key); +-- error 1736 +alter table pt31 exchange partition p0 with table nt31; + +--echo ## auto_random +create table pt32 (id bigint not null primary key AUTO_RANDOM) partition by hash(id) partitions 1; +create table nt32 (id bigint not null primary key); +-- error 1736 +alter table pt32 exchange partition p0 with table nt32; + +--echo ## global temporary table +create table pt33 (id int) partition by hash(id) partitions 1; +create global temporary table nt33 (id int) on commit delete rows; +-- error 1733 +alter table pt33 exchange partition p0 with table nt33; + +--echo ## local temporary table +create table pt34 (id int) partition by hash(id) partitions 1; +create temporary table nt34 (id int); +-- error 1733 +alter table pt34 exchange partition p0 with table nt34; + +--echo ## global index +create table pt35 (a int, b int, unique index(b)) partition by hash(a) partitions 1; +create table nt35 (a int, b int, unique index(b)); +-- error 1731 +alter table pt35 exchange partition p0 with table nt35; + +drop database partition_exchange; +use ddl__db_partition; +set tidb_enable_global_index=default; + diff --git a/tests/integrationtest/t/ddl/foreign_key.test b/tests/integrationtest/t/ddl/foreign_key.test index 12118b7a8a449..c2186b1d85125 100644 --- a/tests/integrationtest/t/ddl/foreign_key.test +++ b/tests/integrationtest/t/ddl/foreign_key.test @@ -52,6 +52,18 @@ alter table t2 modify column a decimal(30, 15); -- error 1832 alter table t2 modify column a decimal(5, 2); +drop table t1, t2; +create table t1 (a bigint(10) key); +create table t2 (a bigint(10), constraint fk foreign key (a) references t1(a)); +alter table t2 modify column a bigint(5); +alter table t1 modify column a bigint(1); + +drop table t1, t2; +create table t1 (id int key, b decimal(8, 5), index(b)); +create table t2 (a decimal(10, 5), constraint fk foreign key (a) references t1(b)); +-- error 1833 +alter table t1 modify column b decimal(10, 5); + set @@global.tidb_enable_foreign_key=default; set @@foreign_key_checks=default; diff --git a/tests/integrationtest/t/ddl/global_index.test b/tests/integrationtest/t/ddl/global_index.test new file mode 100644 index 0000000000000..372c0e955eb36 --- /dev/null +++ b/tests/integrationtest/t/ddl/global_index.test @@ -0,0 +1,62 @@ +set tidb_enable_global_index=true; + +# TestCreatePartitionTableWithGlobalIndex +drop table if exists test_global; +create table test_global ( a int, b int, c int, unique key p_b(b)) +partition by range( a ) ( + partition p1 values less than (10), + partition p2 values less than (20) +); +insert into test_global values (1,2,2); +-- error 1062 +insert into test_global values (11,2,2); +-- error 1062 +insert into test_global values (11,2,2); + +--echo # NULL will not get 'duplicate key' error here +insert into test_global(a,c) values (1,2); +insert into test_global(a,c) values (11,2); + +drop table if exists test_global; +-- error 1503 +create table test_global ( a int, b int, c int, primary key p_b(b) /*T![clustered_index] CLUSTERED */) +partition by range( a ) ( + partition p1 values less than (10), + partition p2 values less than (20) +); + +drop table if exists test_global; +-- error 1503 +create table test_global ( a int, b int, c int, primary key p_b_c(b, c) /*T![clustered_index] CLUSTERED */) +partition by range( a ) ( + partition p1 values less than (10), + partition p2 values less than (20) +); + +drop table if exists test_global; +create table test_global ( a int, b int, c int, primary key (b) /*T![clustered_index] NONCLUSTERED */) +partition by range( a ) ( + partition p1 values less than (10), + partition p2 values less than (20) +); +insert into test_global values (1,2,2); +-- error 1062 +insert into test_global values (11,2,2); +-- error 1062 +insert into test_global values (11,2,2); + +# TestUpdateGlobalIndex +drop table if exists test_global; +create table test_global ( a int, b int, c int) +partition by range( a ) ( + partition p1 values less than (10), + partition p2 values less than (20), + partition p3 values less than (30) +); +alter table test_global add unique index idx_b (b); +insert into test_global values (1, 1, 1), (8, 8, 8), (11, 11, 11), (12, 12, 12); +update test_global set a = 2 where a = 11; +update test_global set a = 13 where a = 12; +analyze table test_global; +select * from test_global use index(idx_b) order by a; + diff --git a/tests/integrationtest/t/ddl/integration.test b/tests/integrationtest/t/ddl/integration.test index 36d87b0e74f5f..4104c1f824c67 100644 --- a/tests/integrationtest/t/ddl/integration.test +++ b/tests/integrationtest/t/ddl/integration.test @@ -73,3 +73,12 @@ rename table t to t1; alter table t nocache; drop table if exists t; +# TestNonStrictCreateTableOverflowError +drop table if exists t; +-- error 1067 +create table t (d int default '18446744073709551616' ); +set sql_mode=''; +-- enable_warnings +create table t (d int default '18446744073709551616' ); +-- disable_warnings +set sql_mode=DEFAULT; diff --git a/tests/integrationtest/t/ddl/serial.test b/tests/integrationtest/t/ddl/serial.test index bb136851aab21..95d2fbae4afb7 100644 --- a/tests/integrationtest/t/ddl/serial.test +++ b/tests/integrationtest/t/ddl/serial.test @@ -98,3 +98,27 @@ alter table t1 modify a varchar(20) charset utf8 collate utf8_roman_ci; # mustGetUnsupportedCollation("alter table t convert to collate utf8mb4_unicode_ci", "utf8mb4_unicode_ci") drop database if exists ucd; use ddl__serial; + + +# TestLocalTemporaryTableBlockedDDL +drop table if exists t1, tmp1; +create table t1 (id int); +create temporary table tmp1 (id int primary key, a int unique, b int); +--error 8200 +rename table tmp1 to tmp2; +--error 8200 +alter table tmp1 add column c int; +--error 8200 +alter table tmp1 add index b(b); +--error 8200 +create index a on tmp1(b); +--error 8200 +drop index a on tmp1; +--error 8200 +lock tables tmp1 read; +--error 8200 +lock tables tmp1 write; +--error 8200 +lock tables t1 read, tmp1 read; +--error 8200 +admin cleanup table lock tmp1; diff --git a/tests/integrationtest/t/ddl/table_modify.test b/tests/integrationtest/t/ddl/table_modify.test index 3426116ceb2b5..0254a15edd118 100644 --- a/tests/integrationtest/t/ddl/table_modify.test +++ b/tests/integrationtest/t/ddl/table_modify.test @@ -20,45 +20,45 @@ create table dbCollateTest (a varchar(10)); show create table dbCollateTest; -- error 1291 create table t_enum (a enum('e','e')); --- error 1290 +-- error 1115 create table t_enum (a enum('e','E')) charset=utf7 collate=utf8_general_ci; --- error 1290 +-- error 1115 create table t_enum (a enum('abc','Abc')) charset=utf7 collate=utf8_general_ci; --- error 1290 +-- error 1115 create table t_enum (a enum('e','E')) charset=utf7 collate=utf8_unicode_ci; --- error 1290 +-- error 1115 create table t_enum (a enum('ss','ß')) charset=utf7 collate=utf8_unicode_ci; --- error 1290 +-- error 1115 create table t_enum (a enum('æ','ae')) charset=utf7mb4 collate=utf8mb4_0900_ai_ci; --- error 1290 +-- error 1291 create table t_enum (a set('e','e')); --- error 1290 +-- error 1115 create table t_enum (a set('e','E')) charset=utf7 collate=utf8_general_ci; --- error 1290 +-- error 1115 create table t_enum (a set('abc','Abc')) charset=utf7 collate=utf8_general_ci; --- error 1290 +-- error 1115 create table t_enum (a enum('B','b')) charset=utf7 collate=utf8_general_ci; --- error 1290 +-- error 1115 create table t_enum (a set('e','E')) charset=utf7 collate=utf8_unicode_ci; --- error 1290 +-- error 1115 create table t_enum (a set('ss','ß')) charset=utf7 collate=utf8_unicode_ci; --- error 1290 +-- error 1115 create table t_enum (a enum('ss','ß')) charset=utf7 collate=utf8_unicode_ci; --- error 1290 +-- error 1115 create table t_enum (a set('æ','ae')) charset=utf7mb4 collate=utf8mb4_0900_ai_ci; CREATE TABLE x (a INT) ENGINE = MyISAM; CREATE TABLE y (a INT) ENGINE = MyISAM; --- error 8231 +-- error 8232 CREATE TABLE z (a INT) ENGINE = MERGE UNION = (x, y); --- error 8231 +-- error 8232 ALTER TABLE x UNION = (y); drop table x; drop table y; CREATE TABLE x (a INT) ENGINE = MyISAM; CREATE TABLE y (a INT) ENGINE = MyISAM; --- error 8232 +-- error 8233 CREATE TABLE z (a INT) ENGINE = MERGE INSERT_METHOD=LAST; --- error 8232 +-- error 8233 ALTER TABLE x INSERT_METHOD=LAST; drop table x; drop table y; diff --git a/tests/integrationtest/t/executor/aggregate.test b/tests/integrationtest/t/executor/aggregate.test index 9159d7ca035df..66a542c0829bd 100644 --- a/tests/integrationtest/t/executor/aggregate.test +++ b/tests/integrationtest/t/executor/aggregate.test @@ -741,15 +741,15 @@ select b like '%a' from t group by c; select c REGEXP '1.*' from t group by b; --error 1055 select -b from t group by c; ---error 1055 +--error 8123 select a, max(b) from t; ---error 1055 +--error 8123 select sum(a)+b from t; ---error 1055 +--error 8123 select count(b), c from t; select count(b), any_value(c) from t; select count(b), any_value(c) + 2 from t; ---error 1055 +--error 8123 select distinct a, b, count(a) from t; select a from t group by a,b,c; select b from t group by b; @@ -804,7 +804,7 @@ select * from (select * from t) as e group by b,c; select c from t group by c,d order by d; --error 1055 select c from t group by c order by d; ---error 1055 +--error 1052 select c from t,x group by t.c; set sql_mode = default; set @@session.tidb_enable_new_only_full_group_by_check = default; diff --git a/tests/integrationtest/t/executor/autoid.test b/tests/integrationtest/t/executor/autoid.test index aa1651888cdb3..7adb3104caf80 100644 --- a/tests/integrationtest/t/executor/autoid.test +++ b/tests/integrationtest/t/executor/autoid.test @@ -303,7 +303,6 @@ create table t1 (id int key auto_increment); insert into t1 values (); rename table t1 to t11; insert into t11 values (); -## TODO(tiancaiamao): fix bug and uncomment here, rename table should not discard the cached AUTO_ID. select * from t11; ## auto_id_cache 1 use another implementation and do not have such bug. @@ -317,7 +316,6 @@ create table t3 (id int key auto_increment) auto_id_cache 100; insert into t3 values (); rename table t3 to t33; insert into t33 values (); -## TODO(tiancaiamao): fix bug and uncomment here, rename table should not discard the cached AUTO_ID. select * from t33; # TestAutoIDConstraint diff --git a/tests/integrationtest/t/executor/cte.test b/tests/integrationtest/t/executor/cte.test index 1176a509c1456..8a45d3997c326 100644 --- a/tests/integrationtest/t/executor/cte.test +++ b/tests/integrationtest/t/executor/cte.test @@ -1,6 +1,3 @@ -## Delete it when https://github.com/pingcap/tidb/issues/48808 merged -set tidb_max_chunk_size=default; - # TestBasicCTE with recursive cte1 as (select 1 c1 union all select c1 + 1 c1 from cte1 where c1 < 5) select * from cte1; with recursive cte1 as (select 1 c1 union all select 2 c1 union all select c1 + 1 c1 from cte1 where c1 < 10) select * from cte1 order by c1; @@ -148,3 +145,27 @@ use executor__cte1; select * from executor__cte.v; use executor__cte; drop database executor__cte1; + +# TestCTEMaxChunkSizeIsSmall +set tidb_max_chunk_size=32; +drop table if exists t1; +create table t1(c1 int); +insert into t1 values(0), (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), (39), (40), (41), (42), (43), (44), (45), (46), (47), (48), (49), (50), (51), (52), (53), (54), (55), (56), (57), (58), (59), (60), (61), (62), (63), (64), (65), (66), (67), (68), (69), (70), (71), (72), (73), (74), (75), (76), (77), (78), (79), (80), (81), (82), (83), (84), (85), (86), (87), (88), (89), (90), (91), (92), (93), (94), (95), (96), (97), (98), (99), (100), (101), (102), (103), (104), (105), (106), (107), (108), (109), (110), (111), (112), (113), (114), (115), (116), (117), (118), (119), (120), (121), (122), (123), (124), (125), (126), (127), (128), (129), (130), (131), (132), (133), (134), (135), (136), (137), (138), (139), (140), (141), (142), (143), (144), (145), (146), (147), (148), (149), (150), (151), (152), (153), (154), (155), (156), (157), (158), (159), (160), (161), (162), (163), (164), (165), (166), (167), (168), (169), (170), (171), (172), (173), (174), (175), (176), (177), (178), (179), (180), (181), (182), (183), (184), (185), (186), (187), (188), (189), (190), (191), (192), (193), (194), (195), (196), (197), (198), (199), (200), (201), (202), (203), (204), (205), (206), (207), (208), (209), (210), (211), (212), (213), (214), (215), (216), (217), (218), (219), (220), (221), (222), (223), (224), (225), (226), (227), (228), (229), (230), (231), (232), (233), (234), (235), (236), (237), (238), (239), (240), (241), (242), (243), (244), (245), (246), (247), (248), (249), (250), (251), (252), (253), (254), (255), (256), (257), (258), (259), (260), (261), (262), (263), (264), (265), (266), (267), (268), (269), (270), (271), (272), (273), (274), (275), (276), (277), (278), (279), (280), (281), (282), (283), (284), (285), (286), (287), (288), (289), (290), (291), (292), (293), (294), (295), (296), (297), (298), (299); +with recursive cte1(c1) as (select c1 from t1 union select c1 + 1 c1 from cte1 limit 1 offset 100) select * from cte1; +set tidb_max_chunk_size=default; + +# TestIssue46522 +create table issue46522 (id int primary key); +insert into issue46522 values (1); +set @@tidb_disable_txn_auto_retry = off; +begin optimistic; +insert into issue46522 with t1 as (select id+1 from issue46522 where id = 1) select * from t1; + +connect (conn1, localhost, root,, executor__cte); +begin optimistic; +update issue46522 set id = id + 1; +commit; +disconnect conn1; +connection default; + +commit; \ No newline at end of file diff --git a/tests/integrationtest/t/executor/delete.test b/tests/integrationtest/t/executor/delete.test index 45b5f3ec4df8e..b238e70274716 100644 --- a/tests/integrationtest/t/executor/delete.test +++ b/tests/integrationtest/t/executor/delete.test @@ -45,7 +45,7 @@ SHOW WARNINGS; delete from delete_test; --disable_info create view v as select * from delete_test; --- error 1356 +-- error 1105 delete from v where name = 'aaa'; drop view v; create sequence seq; @@ -97,4 +97,23 @@ delete t1, t2 from t1 inner join t2 inner join t3 where t1.id=t2.id and t2.id=t3 --sorted_result select * from t3; +# TestNonStrictDeleteUpdateOverflowExpression +drop table if exists t; +create table t (id char(255)); +insert into t values ('18446744073709551616'); +# TODO: the error and warning message is different between TiDB and TiKV. Fix it. +-- replace_regex /BIGINT UNSIGNED/BIGINT/ +-- error 1690 +delete from t where cast(id as unsigned) = 1; +-- replace_regex /BIGINT UNSIGNED/BIGINT/ +-- error 1690 +update t set id = '1' where cast(id as unsigned) = 1; +set sql_mode='' +-- enable_warnings +-- replace_regex /evaluation failed: // +delete from t where cast(id as unsigned) = 1; +-- replace_regex /evaluation failed: // +update t set id = '1' where cast(id as unsigned) = 1; +-- disable_warnings +set sql_mode=DEFAULT diff --git a/tests/integrationtest/t/executor/executor.test b/tests/integrationtest/t/executor/executor.test index bf5ac6da7dda2..e177f2cd6df01 100644 --- a/tests/integrationtest/t/executor/executor.test +++ b/tests/integrationtest/t/executor/executor.test @@ -2226,7 +2226,7 @@ drop view v; create definer='root'@'localhost' view v as select * from (select a from t group by a) s; select * from v order by 1; -- error 1054 -SELECT `s`.`count(a)` FROM (SELECT COUNT(`a`) FROM `test`.`t`) AS `s`; +SELECT `s`.`count(a)` FROM (SELECT COUNT(`a`) FROM `executor__executor`.`t`) AS `s`; drop view v; create definer='root'@'localhost' view v as select * from (select count(a) from t) s; select * from v; @@ -2543,11 +2543,12 @@ admin set bdr role primary; admin show bdr role; admin set bdr role secondary; admin show bdr role; -admin set bdr role local_only; +admin unset bdr role; admin show bdr role; --error 1064 admin set bdr role test_err; admin show bdr role; +admin unset bdr role; # TestCompileOutOfMemoryQuota # Test for issue: https://github.com/pingcap/tidb/issues/38322 @@ -2848,3 +2849,66 @@ select stmt_type from information_schema.statements_summary where digest_text = set @@tidb_mem_quota_query=default; set global tidb_mem_oom_action=default; + + +# TestTableLockPrivilege +drop table if exists t; +drop user if exists 'testuser'@'localhost'; +create table t(a int); +create user 'testuser'@'localhost'; + +connect (conn1, localhost, testuser,,); +--error 1044 +LOCK TABLE executor__executor.t WRITE; + +connection default; +GRANT LOCK TABLES ON executor__executor.* to 'testuser'@'localhost'; + +connection conn1; +--error 1142 +LOCK TABLE executor__executor.t WRITE; + +connection default; +REVOKE ALL ON executor__executor.* FROM 'testuser'@'localhost'; +GRANT SELECT ON executor__executor.* to 'testuser'@'localhost'; + +connection conn1; +--error 1044 +LOCK TABLE executor__executor.t WRITE; + +connection default; +GRANT LOCK TABLES ON executor__executor.* to 'testuser'@'localhost'; + +connection conn1; +LOCK TABLE executor__executor.t WRITE; + +connection default; +drop database if exists test2; +create database test2; +create table test2.t2(a int); + +connection conn1; +--error 1044 +LOCK TABLE executor__executor.t WRITE, test2.t2 WRITE; + +connection default; +GRANT LOCK TABLES ON test2.* to 'testuser'@'localhost'; + +connection conn1; +--error 1142 +LOCK TABLE executor__executor.t WRITE, test2.t2 WRITE; + +connection default; +GRANT SELECT ON test2.* to 'testuser'@'localhost'; + +connection conn1; +LOCK TABLE executor__executor.t WRITE, test2.t2 WRITE; + +connection default; +--replace_regex /server: .*session: .*/server: session: / +--error 8020 +LOCK TABLE executor__executor.t WRITE, test2.t2 WRITE; + +disconnect conn1; +unlock tables; +drop user 'testuser'@'localhost'; diff --git a/tests/integrationtest/t/executor/explain.test b/tests/integrationtest/t/executor/explain.test index 5d72e5d223a22..21475c2399bcb 100644 --- a/tests/integrationtest/t/executor/explain.test +++ b/tests/integrationtest/t/executor/explain.test @@ -162,3 +162,55 @@ explain select * from t3; explain select * from v3; disconnect conn1; + +# TestIssue47331 +drop table if exists t1; +create table t1( + id1 varchar(2) DEFAULT '00', + id2 varchar(30) NOT NULL, + id3 datetime DEFAULT NULL, + id4 varchar(100) NOT NULL DEFAULT 'ecifdata', + id5 datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + id6 int(11) DEFAULT NULL, + id7 int(11) DEFAULT NULL, + UNIQUE KEY UI_id2 (id2), + KEY ix_id1 (id1) +); +drop table if exists t2; +create table t2( + id10 varchar(40) NOT NULL, + id2 varchar(30) NOT NULL, + KEY IX_id2 (id2), + PRIMARY KEY (id10) +); +drop table if exists t3; +create table t3( + id20 varchar(40) DEFAULT NULL, + UNIQUE KEY IX_id20 (id20) +); +explain UPDATE t1 a +SET a.id1 = '04', + a.id3 = CURRENT_TIMESTAMP, + a.id4 = SUBSTRING_INDEX(USER(), '@', 1), + a.id5 = CURRENT_TIMESTAMP +WHERE a.id1 = '03' + AND a.id6 - IFNULL(a.id7, 0) = + ( + SELECT COUNT(1) + FROM t2 b, t3 c + WHERE b.id10 = c.id20 + AND b.id2 = a.id2 + AND b.id2 in ( + SELECT rn.id2 + FROM t1 rn + WHERE rn.id1 = '03' + ) + ); + + +# TestExplainAnalyzeActRowsNotEmpty +drop table if exists t; +create table t (a int, b int, index (a)); +insert into t values (1, 1); +--replace_column 6 8 9 +explain analyze select * from t t1, t t2 where t1.b = t2.a and t1.b = 2333; diff --git a/tests/integrationtest/t/executor/foreign_key.test b/tests/integrationtest/t/executor/foreign_key.test index 46b274f662f30..79e0e9fef6b89 100644 --- a/tests/integrationtest/t/executor/foreign_key.test +++ b/tests/integrationtest/t/executor/foreign_key.test @@ -46,7 +46,7 @@ create table t3 (b int, a int, id int, primary key (a), foreign key (a) referen insert into t1 (id, a, b) values (1, 1, 1); insert into t2 (id, a, b) values (1, 1, 1); insert into t3 (id, a, b) values (1, 1, 1); ---error 1452 +--error 1451 update t1 set id=2 where id = 1; update t1 set a=2 where id = 1; update t1 set b=2 where id = 1; @@ -57,10 +57,10 @@ create table t3 (b int, a int, id int, primary key (a), foreign key (a) referen insert into t1 (id, a, b) values (1, 1, 1); insert into t2 (id, a, b) values (1, 1, 1); insert into t3 (id, a, b) values (1, 1, 1); ---error 1452 +--error 1451 delete from t1 where a=1; delete from t2 where id=1; ---error 1452 +--error 1451 delete from t1 where a=1; delete from t3 where id=1; delete from t1 where id=1; @@ -152,7 +152,7 @@ replace into t2 values (1, 1); replace into t2 (id) values (2); --error 1452 replace into t2 values (1, 2); ---error 1452 +--error 1451 replace into t1 values (1, 2); alter table t2 drop foreign key fk_1; alter table t2 add constraint fk_1 foreign key (a) references t1(a) on delete cascade; @@ -225,9 +225,9 @@ insert into t2 (a) values (1),(2); --error 1452 insert into t2 (a) values (3); select * from t2 order by a; ---error 1452 +--error 1451 delete from t1 where b=1; ---error 1452 +--error 1451 update t1 set a=a+10 where a=1; alter table t2 drop foreign key fk; alter table t2 add foreign key fk (b) references t1(b) on delete cascade; @@ -245,9 +245,9 @@ insert into t1 values (1,1),(2,2); insert into t2 values (1,1),(2,2); --error 1452 insert into t2 values (3,3); ---error 1452 +--error 1451 update t1 set b=b+10 where b=1; ---error 1452 +--error 1451 delete from t1 where b=1; -- error 1553 alter table t1 drop index idx1; @@ -273,9 +273,9 @@ insert into t1 (id, a) values (2, '{"id": "2", "data": [2,22,222]}'); insert into t2 values (1,1),(2,2); --error 1452 insert into t2 values (3,3); ---error 1452 +--error 1451 update t1 set a='{"id": "10", "data": [1,11,111]}' where id=1; ---error 1452 +--error 1451 delete from t1 where id=1; alter table t2 drop foreign key fk; alter table t2 add foreign key fk (b) references t1(b) on delete set null on update cascade; @@ -347,3 +347,33 @@ set @@tidb_mem_quota_query=DEFAULT; set @@foreign_key_checks=DEFAULT; +# TestTableLockInForeignKeyCascade +set @@global.tidb_enable_foreign_key=1; +set @@foreign_key_checks=1; +drop table if exists t1, t2; +create table t1 (id int key); +create table t2 (id int key, foreign key fk (id) references t1(id) ON DELETE CASCADE ON UPDATE CASCADE); +insert into t1 values (1), (2), (3); +insert into t2 values (1), (2), (3); +lock table t2 read; + +connect (conn1, localhost, root,, executor__foreign_key); +set @@foreign_key_checks=1; +--replace_regex /server: .*session: .*/server: session: / +--error 8020 +delete from t1 where id = 1; + +connection default; +unlock tables; + +connection conn1; +delete from t1 where id = 1; + +connection default; +select * from t1 order by id; +select * from t2 order by id; +disconnect conn1; + +set @@global.tidb_enable_foreign_key=default; +set @@foreign_key_checks=default; + diff --git a/tests/integrationtest/t/executor/index_merge_reader.test b/tests/integrationtest/t/executor/index_merge_reader.test index 922fff1e7d08a..3e0813bb5d647 100644 --- a/tests/integrationtest/t/executor/index_merge_reader.test +++ b/tests/integrationtest/t/executor/index_merge_reader.test @@ -287,3 +287,11 @@ select /*+ use_index_merge(t1, primary, idx1, idx2) */ c1 from t1 where c1 < 102 set global tidb_mem_oom_action = DEFAULT; set @@tidb_mem_quota_query = default; +# TestIndexMergeIssue49605 +drop table if exists t; +CREATE TABLE `t` (`a` mediumint(9) NOT NULL,`b` year(4) NOT NULL,`c` varbinary(62) NOT NULL,`d` text COLLATE utf8mb4_unicode_ci NOT NULL,`e` tinyint(4) NOT NULL DEFAULT '115',`f` smallint(6) DEFAULT '2675',`g` date DEFAULT '1981-09-17',`h` mediumint(8) unsigned NOT NULL,`i` varchar(384) CHARACTER SET gbk COLLATE gbk_bin DEFAULT NULL,UNIQUE KEY `idx_23` (`h`,`f`),PRIMARY KEY (`h`,`a`) /*T![clustered_index] CLUSTERED */,UNIQUE KEY `idx_25` (`h`,`i`(5),`e`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin PARTITION BY HASH (`h`) PARTITIONS 1; +INSERT INTO `t` VALUES (2065948,1999,_binary '8jxN','rf',-54,-5656,'1987-07-03',259254,'7me坨'),(-8248164,2024,_binary 'zA5A','s)DAkX3',-93,-12983,'2027-12-18',299573,'LUf咲'),(-6131509,2023,_binary 'xdex#Y2','1th%h',-51,19149,'2013-10-28',428279,'矷莒X'),(7545837,1998,_binary 'PCVO','&(lJw6',30,4093,'1987-07-03',736235,'腏@TOIJ'),(-7449472,2029,_binary 'B7&jrl','EjbFfX!',80,-7590,'2011-11-03',765580,'堮ZQF_'),(-7176200,1988,_binary 'tiPglv7mX_#','CnCtNb',-25,NULL,'1987-07-03',842956,'Gq羣嗳殓'),(-115168,2036,_binary 'BqmX$-4It','!8#dvH',82,18787,'1991-09-20',921706,'椉2庘v'),(6665100,1987,_binary '4IJgk0fr4','(D',-73,28628,'1987-07-03',1149668,'摔玝S渉'),(-4065661,2021,_binary '8G%','xDO39xw#',-107,17356,'1970-12-20',1316239,'+0c35掬-阗'),(7622462,1990,_binary '&o+)s)D0','kjoS9Dzld',84,688,'1987-07-03',1403663,'$H鍿_M~'),(5269354,2018,_binary 'wq9hC8','s8XPrN+',-2,-31272,'2008-05-26',1534517,'y椁n躁Q'),(2065948,1982,_binary '8jxNjbksV','g$+i4dg',11,19800,'1987-07-03',1591457,'z^+H~薼A'),(4076971,2024,_binary '&!RrsH','7Mpvk',-63,-632,'2032-10-28',1611011,'鬰+EXmx'),(3522062,1981,_binary ')nq#!UiHKk8','j~wFe77ai',50,6951,'1987-07-03',1716854,'J'),(7859777,2012,_binary 'PBA5xgJ&G&','UM7o!u',18,-5978,'1987-07-03',1967012,'e)浢L獹'),(2065948,2028,_binary '8jxNjbk','JmsEki9t4',51,12002,'2017-12-23',1981288,'mp氏襚'); +explain format='brief' SELECT /*+ AGG_TO_COP() STREAM_AGG()*/ (NOT (`t`.`i`>=_UTF8MB4'j筧8') OR NOT (`t`.`i`=_UTF8MB4'暈lH忧ll6')) IS TRUE,MAX(`t`.`e`) AS `r0`,QUOTE(`t`.`i`) AS `r1` FROM `t` WHERE `t`.`h`>240817 OR `t`.`i` BETWEEN _UTF8MB4'WVz' AND _UTF8MB4'G#駧褉ZC領*lov' GROUP BY `t`.`i`; +select count(*) from (SELECT /*+ AGG_TO_COP() STREAM_AGG()*/ (NOT (`t`.`i`>=_UTF8MB4'j筧8') OR NOT (`t`.`i`=_UTF8MB4'暈lH忧ll6')) IS TRUE,MAX(`t`.`e`) AS `r0`,QUOTE(`t`.`i`) AS `r1` FROM `t` WHERE `t`.`h`>240817 OR `t`.`i` BETWEEN _UTF8MB4'WVz' AND _UTF8MB4'G#駧褉ZC領*lov' GROUP BY `t`.`i`) derived; +explain format='brief' SELECT /*+ AGG_TO_COP() */ (NOT (`t`.`i`>=_UTF8MB4'j筧8') OR NOT (`t`.`i`=_UTF8MB4'暈lH忧ll6')) IS TRUE,MAX(`t`.`e`) AS `r0`,QUOTE(`t`.`i`) AS `r1` FROM `t` WHERE `t`.`h`>240817 OR `t`.`i` BETWEEN _UTF8MB4'WVz' AND _UTF8MB4'G#駧褉ZC領*lov' GROUP BY `t`.`i`; +select count(*) from (SELECT /*+ AGG_TO_COP() */ (NOT (`t`.`i`>=_UTF8MB4'j筧8') OR NOT (`t`.`i`=_UTF8MB4'暈lH忧ll6')) IS TRUE,MAX(`t`.`e`) AS `r0`,QUOTE(`t`.`i`) AS `r1` FROM `t` WHERE `t`.`h`>240817 OR `t`.`i` BETWEEN _UTF8MB4'WVz' AND _UTF8MB4'G#駧褉ZC領*lov' GROUP BY `t`.`i`) derived; diff --git a/tests/integrationtest/t/executor/infoschema_reader.test b/tests/integrationtest/t/executor/infoschema_reader.test index b25bb80e93da6..f996f0f990c67 100644 --- a/tests/integrationtest/t/executor/infoschema_reader.test +++ b/tests/integrationtest/t/executor/infoschema_reader.test @@ -239,3 +239,15 @@ SELECT * FROM information_schema.user_privileges WHERE grantee="'usageuser'@'%'" connection default; disconnect conn1; + +# test information_schema.VARIABLES_INFO DEFAULT_VALUE +select VARIABLE_NAME from information_schema.VARIABLES_INFO where DEFAULT_VALUE = CURRENT_VALUE and variable_name in ('tidb_enable_async_commit','tidb_enable_1pc', 'tidb_mem_oom_action', 'tidb_enable_auto_analyze', 'tidb_row_format_version', 'tidb_txn_assertion_level', 'tidb_enable_mutation_checker', 'tidb_pessimistic_txn_fair_locking') order by VARIABLE_NAME; +set global tidb_enable_async_commit = default; +set global tidb_enable_1pc = default; +set global tidb_mem_oom_action = default; +set global tidb_enable_auto_analyze = default; +set global tidb_row_format_version = default; +set global tidb_txn_assertion_level = default; +set global tidb_enable_mutation_checker = default; +set global tidb_pessimistic_txn_fair_locking = default; +select a.VARIABLE_NAME from information_schema.VARIABLES_INFO as a, mysql.GLOBAL_VARIABLES as b where a.VARIABLE_NAME = b.VARIABLE_NAME and a.DEFAULT_VALUE = b.VARIABLE_VALUE and a.CURRENT_VALUE = b.VARIABLE_VALUE and a.variable_name in ('tidb_enable_async_commit','tidb_enable_1pc', 'tidb_mem_oom_action', 'tidb_enable_auto_analyze', 'tidb_row_format_version', 'tidb_txn_assertion_level', 'tidb_enable_mutation_checker', 'tidb_pessimistic_txn_fair_locking') order by VARIABLE_NAME; diff --git a/tests/integrationtest/t/executor/insert.test b/tests/integrationtest/t/executor/insert.test index 8d241c2a5d7e6..f1b0ca3826393 100644 --- a/tests/integrationtest/t/executor/insert.test +++ b/tests/integrationtest/t/executor/insert.test @@ -1615,3 +1615,14 @@ create table t1(c1 decimal(6,4), primary key(c1)); insert into t1 set c1 = 0.1; insert into t1 set c1 = 0.1 on duplicate key update c1 = 1; select * from t1 use index(primary); + +# TestNonStrictInsertOverflowValue +drop table if exists t; +create table t (d int); +-- error 1690 +insert into t values (cast('18446744073709551616' as unsigned)); +set sql_mode=''; +--enable_warnings +insert into t values (cast('18446744073709551616' as unsigned)); +--disable_warnings +set sql_mode=DEFAULT; diff --git a/tests/integrationtest/t/executor/issues.test b/tests/integrationtest/t/executor/issues.test index c0b92997199ba..736464d7a2892 100644 --- a/tests/integrationtest/t/executor/issues.test +++ b/tests/integrationtest/t/executor/issues.test @@ -198,7 +198,7 @@ SELECT * FROM t2; update t1 as a, t2 as t1 set a.c1 = 1, t1.c2 = 2; SELECT * FROM t1; SELECT * FROM t2; --- error +--error 1054 update t1 as a, t2 set t1.c1 = 10; # TestIssue5055 @@ -633,3 +633,30 @@ set @@tidb_mem_quota_query=128; explain select ps_partkey, sum(ps_supplycost * ps_availqty) as value from partsupp, supplier, nation where ps_suppkey = s_suppkey and s_nationkey = n_nationkey and n_name = 'MOZAMBIQUE' group by ps_partkey having sum(ps_supplycost * ps_availqty) > ( select sum(ps_supplycost * ps_availqty) * 0.0001000000 from partsupp, supplier, nation where ps_suppkey = s_suppkey and s_nationkey = n_nationkey and n_name = 'MOZAMBIQUE' ) order by value desc; SET GLOBAL tidb_mem_oom_action = DEFAULT; set @@tidb_mem_quota_query=default; + + +# TestIssue49369 +drop table if exists issue49369; +CREATE TABLE `issue49369` ( + `x` varchar(32) COLLATE utf8mb4_bin DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin; +--error 1690 +insert into t select round(cast('88888899999999999888888888888888888888888888888888888.11111111111111111111' as decimal(18,12)) * cast('88888899999999999888888888888888888888888888888888888.11111111111111111111' as decimal(42,18)) ); +set @@sql_mode = ''; +insert into t select round(cast('88888899999999999888888888888888888888888888888888888.11111111111111111111' as decimal(18,12)) * cast('88888899999999999888888888888888888888888888888888888.11111111111111111111' as decimal(42,18)) ); +show warnings; +select * from t; +set @@sql_mode = default; + +# TestIssue49902 +set @@tidb_max_chunk_size = 32; +drop table if exists t, s; +CREATE TABLE `t` (`c` char(1)) COLLATE=utf8_general_ci ; +insert into t values("V"),("v"); +insert into t values("V"),("v"),("v"); +CREATE TABLE `s` (`col_61` int); +insert into s values(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1); +insert into s values(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1); +SELECT /*+ stream_agg()*/ count(`t`.`c`) FROM (`s`) JOIN `t` GROUP BY `t`.`c`; +SELECT count(`t`.`c`) FROM (`s`) JOIN `t` GROUP BY `t`.`c`; +set @@tidb_max_chunk_size = default; \ No newline at end of file diff --git a/tests/integrationtest/t/executor/jointest/hash_join.test b/tests/integrationtest/t/executor/jointest/hash_join.test index 54e82c01fc6fa..ad56e58526b8b 100644 --- a/tests/integrationtest/t/executor/jointest/hash_join.test +++ b/tests/integrationtest/t/executor/jointest/hash_join.test @@ -163,3 +163,29 @@ set @@tidb_max_chunk_size=default; set @@tidb_index_lookup_join_concurrency=default; set @@session.tidb_executor_concurrency = default; set @@session.tidb_hash_join_concurrency = default; + +## https://github.com/pingcap/tidb/issues/48991 +create table tbl_3 ( col_11 mediumint unsigned not null default 8346281 ,col_12 enum ( 'Alice','Bob','Charlie','David' ) ,col_13 time not null default '07:10:30.00' ,col_14 timestamp ,col_15 varbinary ( 194 ) not null default '-ZpCzjqdl4hsyo' , key idx_5 ( col_14 ,col_11 ,col_12 ) ,primary key ( col_11 ,col_15 ) /*T![clustered_index] clustered */ ) charset utf8mb4 collate utf8mb4_bin partition by range ( col_11 ) ( partition p0 values less than (530262), partition p1 values less than (9415740), partition p2 values less than (11007444), partition p3 values less than (maxvalue) ); + +insert into tbl_3 values ( 8838143,'David','23:41:27.00','1993-02-23','g0q~Z0b*PpMPKJxYbIE' ); +insert into tbl_3 values ( 9082223,'Alice','02:25:16.00','2035-11-08','i' ); +insert into tbl_3 values ( 2483729,'Charlie','14:43:13.00','1970-09-10','w6o6WFYyL5' ); +insert into tbl_3 values ( 4135401,'Charlie','19:30:34.00','2017-06-07','2FZmy9lanL8' ); +insert into tbl_3 values ( 1479390,'Alice','20:40:08.00','1984-06-10','LeoVONgN~iJz&inj' ); +insert into tbl_3 values ( 10427825,'Charlie','15:27:35.00','1986-12-25','tWJ' ); +insert into tbl_3 values ( 12794792,'Charlie','04:10:08.00','2034-08-08','hvpXVQyuP' ); +insert into tbl_3 values ( 4696775,'Charlie','05:07:43.00','1984-07-31','SKOW9I^sM$4xNk' ); +insert into tbl_3 values ( 8963236,'Alice','08:18:31.00','2022-04-17','v4DsE' ); +insert into tbl_3 values ( 9048951,'Alice','05:19:47.00','2018-09-22','sJ!vs' ); + +SELECT `col_14` +FROM + tbl_3 +WHERE + ( + (`tbl_3`.`col_15` < 'dV') + AND `tbl_3`.`col_12` IN ( + SELECT `col_12` FROM `tbl_3` WHERE NOT (ISNULL(`tbl_3`.`col_12`)) + ) + ) +ORDER BY IF(ISNULL(`col_14`),0,1),`col_14`; diff --git a/tests/integrationtest/t/executor/partition/global_index.test b/tests/integrationtest/t/executor/partition/global_index.test new file mode 100644 index 0000000000000..87882e9772feb --- /dev/null +++ b/tests/integrationtest/t/executor/partition/global_index.test @@ -0,0 +1,170 @@ +set tidb_enable_global_index=true; + +# Prepare data +drop table if exists p; +create table p (id int, c int) partition by range (c) ( +partition p0 values less than (4), +partition p1 values less than (7), +partition p2 values less than (10)); +alter table p add unique idx(id); +insert into p values (1,3), (3,4), (5,6), (7,9); +analyze table p; +drop table if exists t; +create table t (id int, c int); +insert into t values (1, 3); +analyze table t; + +# TestGlobalIndexScan +select id from p use index (idx) order by id; + +# TestGlobalIndexDoubleRead +--sorted_result +select * from p use index (idx); + +# TestAggWithGlobalIndex +select count(*) from p use index (idx); +select count(*) from p partition(p0) use index (idx); + +# TestGlobalIndexSelectSpecifiedPartition +select * from p partition(p0) use index (idx); + +# TestGlobalIndexScanSpecifiedPartition +select id from p partition(p0) use index (idx); + +# TestGlobalIndexJoin +--sorted_result +select /*+ INL_JOIN(p, t) */ * from p inner join t on p.id = t.id; +select /*+ INL_JOIN(p, t) */ p.id from p inner join t on p.id = t.id; + +# TestGlobalIndexJoinSpecifiedPartition +--sorted_result +select /*+ INL_JOIN(p, t) */ * from p partition(p0) inner join t on p.id = t.id; +select /*+ INL_JOIN(p, t) */ p.id from p partition(p0) inner join t on p.id = t.id; + + +# Prepare tables with clustered index +drop table if exists p, t; +create table p (id int, c int, d int, e int, primary key(d, c) clustered) partition by range (c) ( +partition p0 values less than (4), +partition p1 values less than (7), +partition p2 values less than (10)); +alter table p add unique idx(id); +insert into p values (1,3,1,1), (3,4,3,3), (5,6,5,5), (7,9,7,7); +analyze table p; +create table t (id int, c int); +insert into t values (1, 3); +analyze table t; + +# TestGlobalIndexScanForClusteredSpecifiedPartition +select id from p partition(p0) use index (idx); + +# TestGlobalIndexJoinForClusteredSpecifiedPartition +select /*+ INL_JOIN(p, t) */ * from p partition(p0) inner join t on p.id = t.id; +select /*+ INL_JOIN(p, t) */ p.id from p partition(p0) inner join t on p.id = t.id; + + +# TestIssue21732 +drop table if exists p; +create table p (a int, b int GENERATED ALWAYS AS (3*a-2*a) VIRTUAL) partition by hash(b) partitions 2; +alter table p add unique index idx (a); +insert into p (a) values (1),(2),(3); +analyze table p; +--sorted_result +select * from p use index (idx); + + +# TestGlobalIndexForIssue40149 +drop table if exists test_t1; +CREATE TABLE test_t1 ( + a int(11) NOT NULL, + b int(11) DEFAULT NULL, + c int(11) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin +PARTITION BY RANGE (c) ( + PARTITION p0 VALUES LESS THAN (10), + PARTITION p1 VALUES LESS THAN (MAXVALUE) +); +alter table test_t1 add unique p_a (a); +insert into test_t1 values (1,1,1); + +explain format='brief' select * from test_t1 where a = 1; +select * from test_t1 where a = 1; + +analyze table test_t1; +explain format='brief' select * from test_t1 where a = 1; +select * from test_t1 where a = 1; + + +# TestGlobalIndexMerge +SET session tidb_enable_index_merge = ON; +drop table if exists t; +CREATE TABLE t ( + a int(11) NOT NULL, + b int(11) DEFAULT NULL, + c int(11) DEFAULT NULL, + d int(11) NOT NULL AUTO_INCREMENT, + KEY idx_bd (b, c), + UNIQUE KEY uidx_ac(a) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin +PARTITION BY RANGE (c) ( + PARTITION p0 VALUES LESS THAN (10), + PARTITION p1 VALUES LESS THAN (MAXVALUE) +); +insert into t values (1,1,1,1),(2,2,2,2),(3,3,3,3),(4,4,4,4),(5,5,5,5),(6,6,6,6),(7,7,7,7),(8,8,8,8); +analyze table t; +--echo # when index_merge has global index as its partial path, ignore it. +explain select /*+ use_index_merge(t, uidx_ac, idx_bc) */ * from t where a=1 or b=2; +--sorted_result +select /*+ use_index_merge(t, uidx_ac, idx_bc) */ * from t where a=1 or b=2; + +SET session tidb_enable_index_merge = DEFAULT; + + +# TestListColumnsPartitionWithGlobalIndex +## Test generated column with global index +drop table if exists t; +## Test for virtual generated column with global index +create table t (a varchar(10), b varchar(1) GENERATED ALWAYS AS (substr(a,1,1)) VIRTUAL) partition by list columns(b) (partition p0 values in ('a','c'), partition p1 values in ('b','d')); +alter table t add unique index (a); +insert into t (a) values ('aaa'),('abc'),('acd'); +analyze table t; +select a from t partition (p0) order by a; +select * from t where a = 'abc' order by a; +update t set a='bbb' where a = 'aaa'; +admin check table t; +select a from t order by a; +select a from t partition (p0) order by a; +select a from t partition (p1) order by a; +select * from t where a = 'bbb' order by a; +-- error 1062 +insert into t (a) values ('abc'); +insert into t (a) values ('abc') on duplicate key update a='bbc'; +select a from t order by a; +select * from t where a = 'bbc'; +select a from t partition (p0) order by a; +select a from t partition (p1) order by a; +explain format = 'brief' select a from t partition (p1) order by a; + +drop table if exists t; +## Test for stored generated column with global index +create table t (a varchar(10), b varchar(1) GENERATED ALWAYS AS (substr(a,1,1)) STORED) partition by list columns(b) (partition p0 values in ('a','c'), partition p1 values in ('b','d')); +alter table t add unique index (a); +insert into t (a) values ('aaa'),('abc'),('acd'); +analyze table t; +select a from t partition (p0) order by a; +select * from t where a = 'abc' order by a; +update t set a='bbb' where a = 'aaa'; +admin check table t; +select a from t order by a; +select a from t partition (p0) order by a; +select a from t partition (p1) order by a; +select * from t where a = 'bbb' order by a; +-- error 1062 +insert into t (a) values ('abc'); +insert into t (a) values ('abc') on duplicate key update a='bbc'; +select a from t order by a; +select * from t where a = 'bbc'; +select a from t partition (p0) order by a; +select a from t partition (p1) order by a; +explain format = 'brief' select a from t partition (p1) order by a; + diff --git a/tests/integrationtest/t/executor/partition/issues.test b/tests/integrationtest/t/executor/partition/issues.test index 5ffd753115768..385c2adbbf3b4 100644 --- a/tests/integrationtest/t/executor/partition/issues.test +++ b/tests/integrationtest/t/executor/partition/issues.test @@ -253,3 +253,87 @@ from and c.occur_trade_date = '2022-11-17' and c.serial_id = t.serial_id; set @@tidb_opt_advanced_join_hint=default; set tidb_partition_prune_mode=default; + + +# TestIssue49842 +## For Hash partition +drop table if exists t; +CREATE TABLE `t` ( + `col_51` bigint(20) unsigned NOT NULL, + PRIMARY KEY (`col_51`) /*T![clustered_index] CLUSTERED */ +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin +PARTITION BY HASH (`col_51`) PARTITIONS 5; +insert into t values (9223372036854775807), (9223372036854775808), (9223372036854775809), (9223372036854775812), (9223372036854775813); +analyze table t; +desc SELECT * FROM `t` WHERE `t`.`col_51` BETWEEN 9223372036854775807 AND 9223372036854775808; +--sorted_result +SELECT * FROM `t` WHERE `t`.`col_51` BETWEEN 9223372036854775807 AND 9223372036854775808; + +explain select * from t where col_51 between 9223372036854775812 and 9223372036854775813; +--sorted_result +select * from t where col_51 between 9223372036854775812 and 9223372036854775813; + +drop table if exists t; +CREATE TABLE `t` ( + `col_51` bigint(20) NOT NULL, + PRIMARY KEY (`col_51`) /*T![clustered_index] CLUSTERED */ +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin +PARTITION BY HASH (`col_51`) PARTITIONS 5; +insert into t values (9223372036854775807), (-9223372036854775808); +analyze table t; +desc SELECT * FROM `t` WHERE `t`.`col_51` BETWEEN -9223372036854775808 AND 9223372036854775807; +--sorted_result +SELECT * FROM `t` WHERE `t`.`col_51` BETWEEN -9223372036854775808 AND 9223372036854775807; + +## For Key partition +drop table if exists t; +CREATE TABLE `t` ( + `col_51` bigint(20) unsigned NOT NULL, + PRIMARY KEY (`col_51`) /*T![clustered_index] CLUSTERED */ +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin +PARTITION BY KEY (`col_51`) PARTITIONS 5; +insert into t values (9223372036854775807), (9223372036854775808), (9223372036854775809); +analyze table t; +desc SELECT * FROM `t` WHERE `t`.`col_51` BETWEEN 9223372036854775807 AND 9223372036854775808; +--sorted_result +SELECT * FROM `t` WHERE `t`.`col_51` BETWEEN 9223372036854775807 AND 9223372036854775808; + +drop table if exists t; +CREATE TABLE `t` ( + `col_51` bigint(20) NOT NULL, + PRIMARY KEY (`col_51`) /*T![clustered_index] CLUSTERED */ +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin +PARTITION BY KEY (`col_51`) PARTITIONS 5; +insert into t values (9223372036854775807), (-9223372036854775808); +analyze table t; +desc SELECT * FROM `t` WHERE `t`.`col_51` BETWEEN -9223372036854775808 AND 9223372036854775807; +--sorted_result +SELECT * FROM `t` WHERE `t`.`col_51` BETWEEN -9223372036854775808 AND 9223372036854775807; + + +# TestIssue50044 +drop table if exists t; +CREATE TABLE `t` ( + `col_29` tinyint(4) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci +PARTITION BY HASH (`col_29`) PARTITIONS 7; +INSERT INTO `t` VALUES (-1), (11), (-128), (39), (-46), (38), (-102), (-99), (-87), (-127), (-89), (43), (108), (59), (0), (24), (101), (37), (-103), (90), (-95), (-44), (123), (124), (-123), (-52), (-49), (-98), (-104), (-68), (2), (-24), (67), (89), (1), (-65), (36), (-109), (41), (5), (98), (-63), (-14), (127), (-6), (121), (14), (-122); +analyze table t; + +explain select * from t where col_29 between -2 and -1; +--sorted_result +select * from t where col_29 between -2 and -1; + +explain select * from t where col_29 between -2 and 0; +--sorted_result +select * from t where col_29 between -2 and 0; + +explain select * from t where col_29 between -2 and 1; +--sorted_result +select * from t where col_29 between -2 and 1; + +# TestIssue50427 +explain select * from t where col_29 between -7 and -6; +--sorted_result +select * from t where col_29 between -7 and -6; + diff --git a/tests/integrationtest/t/executor/partition/write.test b/tests/integrationtest/t/executor/partition/write.test index 6eb3724786d05..79feccc409042 100644 --- a/tests/integrationtest/t/executor/partition/write.test +++ b/tests/integrationtest/t/executor/partition/write.test @@ -7,7 +7,7 @@ create table t (id int, name varchar(10),b int generated always as (length(name) partition p0 values in (3,5,6,9,17), partition p1 values in (1,2,10,11,19,20), partition p2 values in (4,12,13,14,18), - partition p3 values in (7,8,15,16,null) + partition p3 values in (7,8,15,16,27,null) ); analyze table t; @@ -602,3 +602,20 @@ replace into tIssue989(a, b) values (111, 2); select * from tIssue989; set @@session.tidb_enable_table_partition = default; + +## test partition insert/update ignore to invalid partition +drop table if exists insert_update_ignore_test; +create table insert_update_ignore_test (a int) partition by range (a) (partition p0 values less than (100), partition p1 values less than (200)); +insert ignore into insert_update_ignore_test values(1000); +show warnings where Message not like '%disable dynamic pruning%'; +insert ignore into insert_update_ignore_test partition(p0) values(101); +show warnings where Message not like '%disable dynamic pruning%'; +select * from insert_update_ignore_test; +insert into insert_update_ignore_test values(1); +update ignore insert_update_ignore_test set a=1000; +show warnings where Message not like '%disable dynamic pruning%'; +select * from insert_update_ignore_test; +update ignore insert_update_ignore_test partition(p0) set a=101; +show warnings where Message not like '%disable dynamic pruning%'; +select * from insert_update_ignore_test; +drop table insert_update_ignore_test; diff --git a/tests/integrationtest/t/executor/point_get.test b/tests/integrationtest/t/executor/point_get.test index 80cde93550a40..48b9877c3e905 100644 --- a/tests/integrationtest/t/executor/point_get.test +++ b/tests/integrationtest/t/executor/point_get.test @@ -357,3 +357,23 @@ commit; disconnect conn1; set session tidb_txn_mode=pessimistic; + + +# TestPointGetWriteLock +drop table if exists point; +create table point (id int primary key, c int, d varchar(10), unique c_d (c, d)); +insert point values (1, 1, 'a'); +insert point values (2, 2, 'b'); +lock tables point write; +select * from point where id = 1; +--replace_regex /.*num_rpc.*/.*num_rpc.*/ +explain analyze select * from point where id = 1; +unlock tables; + +update point set c = 3 where id = 1; +lock tables point write; +select * from point where id = 1; +--replace_regex /.*num_rpc.*/.*num_rpc.*/ +explain analyze select * from point where id = 1; +unlock tables; + diff --git a/tests/integrationtest/t/executor/show.test b/tests/integrationtest/t/executor/show.test index ef88ad76614eb..b490834323beb 100644 --- a/tests/integrationtest/t/executor/show.test +++ b/tests/integrationtest/t/executor/show.test @@ -427,3 +427,8 @@ select * from information_schema.COLLATIONS; show character set like '%utf8mb4%'; select * from information_schema.COLLATIONS where IS_DEFAULT='Yes' and CHARACTER_SET_NAME='utf8mb4'; set @@session.default_collation_for_utf8mb4=default; + +# TestShowPreSplitRegionsForAutoRandomTables +DROP TABLE IF EXISTS `t`; +CREATE TABLE `t` (a BIGINT PRIMARY KEY AUTO_RANDOM(2), b INT) PRE_SPLIT_REGIONS=4; +SHOW CREATE TABLE `t`; diff --git a/tests/integrationtest/t/executor/simple.test b/tests/integrationtest/t/executor/simple.test index 5075371e0d362..91fdeb0433513 100644 --- a/tests/integrationtest/t/executor/simple.test +++ b/tests/integrationtest/t/executor/simple.test @@ -391,6 +391,7 @@ SET RESOURCE GROUP ``; SELECT CURRENT_RESOURCE_GROUP(); SET RESOURCE GROUP default; SELECT CURRENT_RESOURCE_GROUP(); +SELECT /*+ RESOURCE_GROUP(rg1)*/ CURRENT_RESOURCE_GROUP(); connection conn1; SELECT CURRENT_RESOURCE_GROUP(); diff --git a/tests/integrationtest/t/executor/split_table.test b/tests/integrationtest/t/executor/split_table.test index fa8981076f3ce..e6673755cccc1 100644 --- a/tests/integrationtest/t/executor/split_table.test +++ b/tests/integrationtest/t/executor/split_table.test @@ -129,9 +129,6 @@ split table t between ('aaa', 0.0) and ('aaa', 100.0) regions 10; split table t by ('aaa', 0.0), ('aaa', 20.0), ('aaa', 100.0); split table t by ('aaa', 100.0), ('qqq', 20.0), ('zzz', 100.0), ('zzz', 1000.0); drop table t; -create table t (a int, b int, c int, d int, primary key(a, c, d)); -split table t between (0, 0, 0) and (0, 0, 1) regions 1000; -drop table t; create table t (a int, b int, c int, d int, primary key(d, a, c)); split table t by (0, 0, 0), (1, 2, 3), (65535, 65535, 65535); drop table if exists t; diff --git a/tests/integrationtest/t/executor/update.test b/tests/integrationtest/t/executor/update.test index 26989f69b92ce..1e9f2dbacd747 100644 --- a/tests/integrationtest/t/executor/update.test +++ b/tests/integrationtest/t/executor/update.test @@ -494,7 +494,7 @@ set @@sql_mode=default; drop view if exists v; create view v as select * from t; --- error 1356 +-- error 1288 update v set a = '2000-11-11'; drop view v; diff --git a/tests/integrationtest/t/executor/write.test b/tests/integrationtest/t/executor/write.test index a76250b25ab29..abea1af658bc4 100644 --- a/tests/integrationtest/t/executor/write.test +++ b/tests/integrationtest/t/executor/write.test @@ -589,7 +589,7 @@ select * from t partition(p3) order by id; insert ignore into t values (15, 'a'),(17,'a'); select * from t partition(p0,p1,p2) order by id; select * from t partition(p3) order by id; ---error 1062 +--error 1526 insert into t values (100, 'd'); delete from t; insert into t values (1, 'a'),(2,'b'),(3,'c'); @@ -611,7 +611,7 @@ select * from t order by id; --error 1062 update t set id=id+17 where id in (3,10); select * from t order by id; ---error 1062 +--error 1526 update t set id=id*2 where id in (3,20); select * from t order by id; delete from t; @@ -624,7 +624,7 @@ select * from t partition(p2) order by id; select * from t partition(p3) order by id; replace into t values (1, 'x'),(7,'x'); select * from t order by id; ---error 1062 +--error 1526 replace into t values (10,'x'),(50,'x'); select * from t order by id; delete from t where id = 3; @@ -721,7 +721,7 @@ select * from t order by id; --error 1062 update t set id=id+1 where location='w' and id in (1,2); select * from t order by id; ---error 1062 +--error 1526 update t set id=id+3 where location='w' and id in (1,2); select * from t order by id; update t set location='s', id=14 where location='e' and id=8; @@ -1258,8 +1258,8 @@ create table replace_test_1 (id int, c1 int); replace replace_test_1 select id, c1 from replace_test; --disable_info begin; --- error 1135 -replace replace_test_0 select c1 from replace_test; +--error 1136 +replace replace_test_1 select c1 from replace_test; rollback; create table replace_test_2 (id int, c1 int); diff --git a/tests/integrationtest/t/explain_easy.test b/tests/integrationtest/t/explain_easy.test index 2d452215da985..23dda18f3c003 100644 --- a/tests/integrationtest/t/explain_easy.test +++ b/tests/integrationtest/t/explain_easy.test @@ -42,7 +42,7 @@ explain format = 'brief' select if(10, t1.c1, t1.c2) from t1; explain format = 'brief' select c1 from t2 union select c1 from t2 union all select c1 from t2; explain format = 'brief' select c1 from t2 union all select c1 from t2 union select c1 from t2; -select * from information_schema.tidb_indexes where table_name='t4'; +select * from information_schema.tidb_indexes where table_name='t4' and table_schema='explain_easy'; # https://github.com/pingcap/tidb/issues/9125 explain format = 'brief' select count(1) from (select count(1) from (select * from t1 where c3 = 100) k) k2; diff --git a/tests/integrationtest/t/expression/builtin.test b/tests/integrationtest/t/expression/builtin.test index fff649ae6ac0f..2e6d67e27c3bf 100644 --- a/tests/integrationtest/t/expression/builtin.test +++ b/tests/integrationtest/t/expression/builtin.test @@ -1350,7 +1350,7 @@ select name_const("hello", b) from t; select name_const("hello", 1+1) from t; -- error 1210 select name_const(concat('a', 'b'), 555) from t; --- error 1210 +-- error 1582 select name_const(555) from t; select name_const("hello", 1); @@ -1513,7 +1513,7 @@ select sleep(1); select sleep(0); select sleep('a'); show warnings; --- error 1510 +-- error 1210 select sleep(-1); SELECT INET_ATON('10.0.5.9'); SELECT INET_NTOA(167773449); diff --git a/tests/integrationtest/t/expression/cast.test b/tests/integrationtest/t/expression/cast.test index 20929c52ddd52..e1681e4d87934 100644 --- a/tests/integrationtest/t/expression/cast.test +++ b/tests/integrationtest/t/expression/cast.test @@ -62,3 +62,8 @@ create table t (y year); insert into t values (cast('14:15' as time)); select 1 from t where y = YEAR(CURDATE()); select cast(cast('14:15' as time) as year) = YEAR(CURDATE()); + +# TestIssue49526 +explain select null as a union all select 'a' as a; +--sorted_result +select null as a union all select 'a' as a; diff --git a/tests/integrationtest/t/expression/enum_set.test b/tests/integrationtest/t/expression/enum_set.test new file mode 100644 index 0000000000000..90044f079b7d9 --- /dev/null +++ b/tests/integrationtest/t/expression/enum_set.test @@ -0,0 +1,34 @@ +# https://github.com/pingcap/tidb/issues/49487 +drop table if exists t01; +CREATE TABLE `t01` ( + `6524d87a` timestamp DEFAULT '2024-10-02 01:54:55', + `744e4d52` int(11) NOT NULL DEFAULT '2023959529', + `087de3b2` varchar(122) DEFAULT '36h0hvfpylz0f0iv9h0ownfcg3rehi4', + `26cbbf2a` enum('l7i9','3sdz3','83','4','92p','4g','8y5rn','7gp','7','1','e') NOT NULL DEFAULT '4', + PRIMARY KEY (`744e4d52`,`26cbbf2a`) /*T![clustered_index] CLUSTERED */ +) ENGINE=InnoDB DEFAULT CHARSET=gbk COLLATE=gbk_chinese_ci COMMENT='7ad99128' +PARTITION BY HASH (`744e4d52`) PARTITIONS 9; +insert ignore into t01 values ("2023-01-01 20:01:02", 123, 'abcd', ''); +select `t01`.`26cbbf2a` as r0 from `t01` where `t01`.`6524d87a` in ( '2010-05-25') or not( `t01`.`26cbbf2a` > '1' ) ; + +# ENUM const propgation in outer join +CREATE TABLE `t047d7221` ( + `col_14_1` enum('Alice','Bob','Charlie','David') COLLATE utf8mb4_general_ci DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +INSERT INTO `t047d7221` VALUES ('Charlie'),('Charlie'),('David'),('Bob'),('Bob'),('Charlie'),('David'),('Bob'),('Charlie'),('David'),('Bob'),('Bob'),('David'),('Alice'),('David'),('Alice'),('Charlie'),('Charlie'),('David'),('Alice'),('David'); +CREATE TABLE `t3fa8f3ec` ( + `col_31` timestamp NOT NULL, + `col_32` mediumint(9) DEFAULT '-4350144', + `col_33` json DEFAULT NULL, + `col_34` time NOT NULL DEFAULT '14:52:13', + `col_35` float DEFAULT NULL, + `col_36` decimal(14,10) DEFAULT NULL, + `col_37` bit(32) DEFAULT NULL, + UNIQUE KEY `idx_14` (`col_32`,`col_37`,`col_34`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +INSERT INTO `t3fa8f3ec` VALUES ('2032-12-07 16:00:00',4171813,'null','06:50:04',628.79083,0.0000000000,_binary '0x1'),('2032-12-07 16:00:00',-562928,'null','06:35:17',628.79083,0.0000000000,_binary '0x1'),('2012-05-10 16:00:00',-5344713,'null','03:29:46',628.79083,0.0000000000,_binary '0x1'),('1983-06-11 16:00:00',3067543,'null','07:07:40',628.79083,0.0000000000,_binary '0x1'),('1979-03-16 16:00:00',5251228,'null','06:21:55',628.79083,0.0000000000,_binary '0x1'),('2008-04-22 16:00:00',-3305758,'null','02:42:21',628.79083,0.0000000000,_binary '0x1'),('2025-03-16 16:00:00',1451903,'null','09:50:08',628.79083,0.0000000000,_binary '0x1'),('2017-03-17 16:00:00',1752413,'null','15:55:09',628.79083,0.0000000000,_binary '0x1'),('2020-03-11 16:00:00',-5845368,'null','03:40:14',628.79083,0.0000000000,_binary '0x1'),('2002-11-27 16:00:00',693868,'null','16:15:51',628.79083,0.0000000000,_binary '0x1'),('2020-10-06 16:00:00',6098278,'null','03:01:46',628.79083,0.0000000000,_binary '0x1'),('2001-01-24 16:00:00',-5515593,'null','09:49:41',628.79083,0.0000000000,_binary '0x1'),('1973-12-09 16:00:00',7401513,'null','14:00:07',628.79083,0.0000000000,_binary '0x1'),('1982-03-19 16:00:00',4056108,'null','19:08:54',628.79083,0.0000000000,_binary '0x1'),('2032-12-07 16:00:00',6734101,'null','05:06:04',628.79083,0.0000000000,_binary '0x1'),('2032-12-07 16:00:00',-2705751,'null','03:18:49',628.79083,0.0000000000,_binary '0x1'),('2032-12-07 16:00:00',3783896,'null','03:03:39',628.79083,0.0000000000,_binary '0x1'),('2032-12-07 16:00:00',7486166,'null','02:47:01',628.79083,0.0000000000,_binary '0x1'),('2032-12-07 16:00:00',-5914941,'null','03:17:47',628.79083,0.0000000000,_binary '0x1'),('2032-12-07 16:00:00',6356646,'null','06:14:33',628.79083,0.0000000000,_binary '0x1'),('2035-05-01 16:00:00',-718476,'null','03:08:09',628.79083,0.0000000000,_binary '0x1'),('1991-03-10 16:00:00',-3825016,'null','11:39:20',628.79083,0.0000000000,_binary '0x1'),('2014-10-05 16:00:00',7724461,'null','18:16:29',628.79083,0.0000000000,_binary '0x1'),('1980-08-13 16:00:00',-1425586,'null','19:32:41',628.79083,0.0000000000,_binary '0x1'),('2009-08-22 16:00:00',-6087216,'null','07:49:31',628.79083,0.0000000000,_binary '0x1'),('2004-02-14 16:00:00',-2440696,'null','06:25:48',628.79083,0.0000000000,_binary '0x1'),('2002-02-02 16:00:00',-3965686,'null','18:36:41',628.79083,0.0000000000,_binary '0x1'),('2018-09-20 16:00:00',-2090316,'null','01:21:13',628.79083,0.0000000000,_binary '0x1'),('2032-12-07 16:00:00',-2719454,'null','06:12:56',628.79083,0.0000000000,_binary '0x1'),('2032-12-07 16:00:00',-2719454,'null','01:04:04',628.79083,0.0000000000,_binary '0x1'),('2032-12-07 16:00:00',-5801694,'null','06:59:41',628.79083,0.0000000000,_binary '0x1'),('2032-12-07 16:00:00',-2719454,'null','03:48:16',628.79083,0.0000000000,_binary '0x1'),('2032-12-07 16:00:00',-2719454,'null','05:13:54',628.79083,0.0000000000,_binary '0x1'),('2032-12-07 16:00:00',-2719454,'null','03:42:29',628.79083,0.0000000000,_binary '0x1'),('2032-12-07 16:00:00',-2719454,'null','01:19:57',628.79083,0.0000000000,_binary '0x1'),('2032-12-07 16:00:00',-2719454,'null','00:55:46',628.79083,0.0000000000,_binary '0x1'),('2010-09-14 16:00:00',4849424,'null','06:02:32',628.79083,0.0000000000,_binary '0x1'),('2002-07-30 16:00:00',6109034,'null','06:33:39',628.79083,0.0000000000,_binary '0x1'),('1971-08-21 16:00:00',5571999,'null','12:13:37',628.79083,0.0000000000,_binary '0x1'),('2032-10-11 16:00:00',3762434,'null','09:10:40',628.79083,0.0000000000,_binary '0x1'),('2005-09-08 16:00:00',-6554119,'null','19:36:37',628.79083,0.0000000000,_binary '0x1'),('1981-01-10 16:00:00',-1179289,'null','09:35:00',628.79083,0.0000000000,_binary '0x1'),('2028-08-22 16:00:00',8316284,'null','08:16:44',628.79083,0.0000000000,_binary '0x1'),('1979-05-17 16:00:00',-5318419,'null','17:59:56',628.79083,0.0000000000,_binary '0x1'),('2027-05-11 16:00:00',-5371444,'null','17:19:10',628.79083,0.0000000000,_binary '0x1'),('2013-12-25 16:00:00',-189564,'null','12:04:41',628.79083,0.0000000000,_binary '0x1'),('2016-01-16 16:00:00',-3987539,'null','02:11:34',628.79083,0.0000000000,_binary '0x1'),('1982-11-11 16:00:00',-852334,'null','03:04:13',628.79083,0.0000000000,_binary '0x1'),('2032-12-07 16:00:00',7925662,'null','03:18:23',628.79083,0.0000000000,_binary '0x1'),('2032-12-07 16:00:00',-2454587,'null','02:55:28',628.79083,0.0000000000,_binary '0x1'),('2032-12-07 16:00:00',5739127,'null','06:03:13',628.79083,0.0000000000,_binary '0x1'),('2003-09-24 16:00:00',7753112,'null','00:20:56',628.79083,0.0000000000,_binary '0x1'),('1974-06-27 16:00:00',5429127,'null','02:58:31',628.79083,0.0000000000,_binary '0x1'),('2019-05-10 16:00:00',-5681972,'null','02:17:08',628.79083,0.0000000000,_binary '0x1'),('1992-02-11 16:00:00',1122337,'null','03:41:03',628.79083,0.0000000000,_binary '0x1'),('2036-11-28 16:00:00',40717,'null','03:30:04',628.79083,0.0000000000,_binary '0x1'),('1985-09-24 16:00:00',-4983092,'null','19:41:50',628.79083,0.0000000000,_binary '0x1'),('1972-04-05 16:00:00',520097,'null','19:24:54',628.79083,0.0000000000,_binary '0x1'),('2023-08-19 16:00:00',396327,'null','22:37:52',628.79083,0.0000000000,_binary '0x1'),('2019-12-27 16:00:00',-4990207,'null','12:18:44',628.79083,0.0000000000,_binary '0x1'),('2011-10-04 16:00:00',-149632,'null','20:59:59',628.79083,0.0000000000,_binary '0x1'),('1979-02-22 16:00:00',1099937,'null','12:28:27',628.79083,0.0000000000,_binary '0x1'),('2033-11-19 16:00:00',1089042,'true','14:37:01',4436.5244,0.0138000000,_binary '0x1'),('2032-12-07 16:00:00',-6008365,'null','00:45:53',628.79083,0.0000000000,_binary '0x1'),('2032-12-07 16:00:00',NULL,'null','03:22:27',628.79083,0.0000000000,_binary '0x1'),('2032-12-07 16:00:00',-3819435,'null','00:03:28',628.79083,0.0000000000,_binary '0x1'),('2012-01-19 16:00:00',7593580,'null','03:17:19',628.79083,0.0000000000,_binary '0x1'),('2007-06-11 16:00:00',-5412530,'null','05:17:36',628.79083,0.0000000000,_binary '0x1'),('2010-05-01 16:00:00',2846505,'null','02:19:05',628.79083,0.0000000000,_binary '0x1'),('1989-03-30 16:00:00',7038365,'null','13:30:27',628.79083,0.0000000000,_binary '0x1'),('2021-01-20 16:00:00',NULL,'null','11:07:47',628.79083,0.0000000000,_binary '0x1'),('2025-07-01 16:00:00',4456660,'null','01:27:15',628.79083,0.0000000000,_binary '0x1'),('2029-02-04 16:00:00',4791195,'null','14:38:02',628.79083,0.0000000000,_binary '0x1'),('1978-08-02 16:00:00',4369375,'null','11:30:30',628.79083,0.0000000000,_binary '0x1'),('1974-11-15 16:00:00',4095160,'null','01:56:26',628.79083,0.0000000000,_binary '0x1'),('2008-03-28 16:00:00',NULL,'null','22:59:27',628.79083,0.0000000000,_binary '0x1'); +select t047d7221.col_14_1, t3fa8f3ec.col_36 from t047d7221 left join t3fa8f3ec on t047d7221.col_14_1 = t3fa8f3ec.col_36 where t047d7221.col_14_1 in ( 'Charlie' ); +insert into t3fa8f3ec values('1982-03-19 16:00:00', 23423, null, '09:49:41', 628.79083, 3.0, 0x00307831); +select t047d7221.col_14_1, t3fa8f3ec.col_36 from t047d7221 left join t3fa8f3ec on t047d7221.col_14_1 = t3fa8f3ec.col_36 where t047d7221.col_14_1 in ( 'Charlie' ); +insert into t3fa8f3ec values('1982-03-19 16:00:00', 23424, null, '09:49:41', 628.79083, 3.1, 0x00307831); +select t047d7221.col_14_1, t3fa8f3ec.col_36 from t047d7221 left join t3fa8f3ec on t047d7221.col_14_1 = t3fa8f3ec.col_36 where t047d7221.col_14_1 in ( 'Charlie' ); \ No newline at end of file diff --git a/tests/integrationtest/t/expression/issues.test b/tests/integrationtest/t/expression/issues.test index d48e177d3c446..4c74962b84244 100644 --- a/tests/integrationtest/t/expression/issues.test +++ b/tests/integrationtest/t/expression/issues.test @@ -1193,7 +1193,7 @@ select a from t1 order by a; # TestIssue32488 drop table if exists t; create table t(a varchar(32)) DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -insert into t values('ʞ'), ('İ'); +insert into t values('ʞ'), ('İ'), ('ß'); set @@tidb_enable_vectorized_expression = false; select binary upper(a), lower(a) from t order by upper(a); select distinct upper(a), lower(a) from t order by upper(a); @@ -2147,3 +2147,17 @@ set sql_mode='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DAT -- error 1292 insert into table_20220419(lastLoginDate) select lastLoginDate from table_20220419; set sql_mode=default; + +# TestIssue49015 +drop table if exists test.t; +create table test.t (a varchar(10), b tinyint(1)); +insert into test.t values ("abc", 1); +select * from test.t where (a, b) in (('a', 1), (null, 0)); +update test.t set b = 0 where (a, b) in (('a', 1), (null, 0)); +SHOW WARNINGS; + +# TestIssue49986 +drop table if exists test.t; +create table if not exists test.ast (i varchar(20)); +create table if not exists test.acc (j varchar(20), k varchar(20), l varchar(20), m varchar(20)); +explain format='brief' with t as(select i, (case when b.j = '20001' then b.l else b.k end) an from test.ast a inner join test.acc b on (a.i = b.m) and a.i = 'astp2019121731703151'), t1 as (select i, group_concat(an order by an separator '; ') an from t group by i) select * from t1; diff --git a/tests/integrationtest/t/expression/json.test b/tests/integrationtest/t/expression/json.test index 142b46288ce18..6d6a0f6b250e0 100644 --- a/tests/integrationtest/t/expression/json.test +++ b/tests/integrationtest/t/expression/json.test @@ -343,7 +343,7 @@ select json_storage_free(NULL); select json_storage_free('{}'); select json_storage_free('1'); select json_storage_free('{"a": "b"}'); --- error 1064 +-- error 3140 select json_storage_free('{"c":["a","b"]'); # TestJSONExtractFromLast diff --git a/tests/integrationtest/t/expression/multi_valued_index.test b/tests/integrationtest/t/expression/multi_valued_index.test index a52bf2009ed0d..a075fca16014f 100644 --- a/tests/integrationtest/t/expression/multi_valued_index.test +++ b/tests/integrationtest/t/expression/multi_valued_index.test @@ -511,3 +511,15 @@ insert into t values (json_array(cast("2022-02-02 11:00:00" as datetime))); insert into t values (json_array(cast('{"a":1}' as json))); set sql_mode=default; + +# TestMultiValuedIndexInCompoundIndex +drop table if exists t; +create table t (j json not null, str varchar(5), KEY `idx` ((cast(`j` as unsigned array)),`str`)); +insert into t values ('1', 'abcde'); +drop table t; +create table t (j json not null, str varchar(5) collate utf8mb4_unicode_ci, KEY `idx` ((cast(`j` as unsigned array)),`str`)); +insert into t values ('1', 'abcde'); +drop table t; +create table t (j json not null, str varchar(5) collate gbk_chinese_ci, KEY `idx` ((cast(`j` as unsigned array)),`str`)); +insert into t values ('1', 'abcde'); +drop table t; diff --git a/tests/integrationtest/t/expression/plan_cache.test b/tests/integrationtest/t/expression/plan_cache.test index 2d211d1187cf7..15df0c82ee369 100644 --- a/tests/integrationtest/t/expression/plan_cache.test +++ b/tests/integrationtest/t/expression/plan_cache.test @@ -67,12 +67,101 @@ set tidb_enable_prepared_plan_cache=ON; drop table if exists t1; create table t1 (a varchar(40)); insert into t1 values ('C1'),('R1'); +insert into mysql.expr_pushdown_blacklist values('regexp_like', 'tikv,tiflash,tidb', 'for test'); +insert into mysql.expr_pushdown_blacklist values('regexp_substr', 'tikv,tiflash,tidb', 'for test'); +insert into mysql.expr_pushdown_blacklist values('regexp_instr', 'tikv,tiflash,tidb', 'for test'); +insert into mysql.expr_pushdown_blacklist values('regexp_replace', 'tikv,tiflash,tidb', 'for test'); +admin reload expr_pushdown_blacklist; +set tidb_enable_vectorized_expression=ON; prepare stmt1 from 'select a from t1 where a rlike ?'; +prepare stmt2 from 'select a, regexp_substr(a, ?) from t1 order by a asc'; +prepare stmt3 from 'select a, regexp_instr(a, ?) from t1 order by a asc'; +prepare stmt4 from 'select a, regexp_replace(a, ?, ?) from t1 order by a asc'; +set @a='^C.*'; +set @r='xxxx'; +execute stmt1 using @a; +execute stmt2 using @a; +execute stmt3 using @a; +execute stmt4 using @a, @r; +set @r='yyyy'; +execute stmt4 using @a, @r; +set @a='^R.*'; +execute stmt1 using @a; +execute stmt2 using @a; +execute stmt3 using @a; +execute stmt4 using @a, @r; +set tidb_enable_vectorized_expression=OFF; set @a='^C.*'; +set @r='xxxx'; execute stmt1 using @a; +execute stmt2 using @a; +execute stmt3 using @a; +execute stmt4 using @a, @r; +set @r='yyyy'; +execute stmt4 using @a, @r; set @a='^R.*'; execute stmt1 using @a; +execute stmt2 using @a; +execute stmt3 using @a; +execute stmt4 using @a, @r; +delete from mysql.expr_pushdown_blacklist where name like 'regexp%' and store_type = 'tikv,tiflash,tidb' and reason = 'for test'; +admin reload expr_pushdown_blacklist; set tidb_enable_prepared_plan_cache=default; +set tidb_enable_vectorized_expression=default; + +# TestCacheLikeAndIlike +set tidb_enable_prepared_plan_cache=ON; +drop table if exists t1; +create table t1 (a varchar(40)); +insert into t1 values ('C1'),('R1'),('c1'),('r1'); +insert into mysql.expr_pushdown_blacklist values('like', 'tikv,tiflash,tidb', 'for test'); +insert into mysql.expr_pushdown_blacklist values('ilike', 'tikv,tiflash,tidb', 'for test'); +admin reload expr_pushdown_blacklist; +set tidb_enable_vectorized_expression=ON; +prepare stmt1 from 'select a from t1 where a like ? order by a asc'; +prepare stmt2 from 'select a from t1 where a ilike ? order by a asc'; +set @a='%C%'; +execute stmt1 using @a; +execute stmt2 using @a; +set @a='%R%'; +execute stmt1 using @a; +execute stmt2 using @a; +set tidb_enable_vectorized_expression=OFF; +set @a='%C%'; +execute stmt1 using @a; +execute stmt2 using @a; +set @a='%R%'; +execute stmt1 using @a; +execute stmt2 using @a; +delete from mysql.expr_pushdown_blacklist where name in ('like', 'ilike') and store_type = 'tikv,tiflash,tidb' and reason = 'for test'; +admin reload expr_pushdown_blacklist; +set tidb_enable_prepared_plan_cache=default; +set tidb_enable_vectorized_expression=default; + +# TestCacheAes +set tidb_enable_prepared_plan_cache=ON; +drop table if exists t1; +create table t1 (a varchar(40)); +insert into t1 values ('a'),('b'); +insert into mysql.expr_pushdown_blacklist values('aes_encrypt', 'tikv,tiflash,tidb', 'for test'); +admin reload expr_pushdown_blacklist; +set tidb_enable_vectorized_expression=ON; +prepare stmt1 from 'select a, hex(aes_encrypt(a, ?)) from t1 order by a asc'; +set @a='xx'; +execute stmt1 using @a; +set @a='yy'; +execute stmt1 using @a; +execute stmt2 using @a; +set tidb_enable_vectorized_expression=OFF; +set @a='xx'; +execute stmt1 using @a; +set @a='yy'; +execute stmt1 using @a; +execute stmt2 using @a; +delete from mysql.expr_pushdown_blacklist where name like 'aes_%' and store_type = 'tikv,tiflash,tidb' and reason = 'for test'; +admin reload expr_pushdown_blacklist; +set tidb_enable_prepared_plan_cache=default; +set tidb_enable_vectorized_expression=default; # TestCacheRefineArgs set tidb_enable_prepared_plan_cache=ON; diff --git a/tests/integrationtest/t/expression/time.test b/tests/integrationtest/t/expression/time.test index 1a45d2a925219..50efbebbba102 100644 --- a/tests/integrationtest/t/expression/time.test +++ b/tests/integrationtest/t/expression/time.test @@ -50,6 +50,46 @@ SELECT 19000101000000.0005 + INTERVAL 0.0005 SECOND; select date("1900-01-01") - interval 1.123456789e3 second; select 19000101000000 - interval 1.123456789e3 second; +# TestDateTimeAddString +SELECT "1900-01-01 00:00:00" + INTERVAL "2" HOUR; +SELECT "1900-01-01 00:00:00" + INTERVAL "-2" HOUR; +SELECT "1900-01-01 00:00:00" + INTERVAL "128" HOUR; +SELECT "1900-01-01 00:00:00" + INTERVAL "1e+3" HOUR; +SELECT "1900-01-01 00:00:00" + INTERVAL "1+1" HOUR; +drop table if exists t; +create table t (id int primary key auto_increment, a varchar(32)); +insert into t (a) values(''), ('+1'), ('+1+2'), ('-1'), ('2.2'), ('2.9'), ('2.2+1'), ('2+2.2'), ('5-2'), ('1e2'), +('true'), ('false'), ('xxx'), ('xxx+1'), ('xxx1'), (' 1 '), ('xxx-1'), +('9223372036854775808'), ('-9223372036854775809'), ('9223372036854775808-02'), ('-9223372036854775809-02'); +select id, a, "1900-01-01 00:00:00" + INTERVAL a MICROSECOND as result from t order by id ASC; +select id, a, "1900-01-01 00:00:00" + INTERVAL a SECOND as result from t order by id ASC; +select id, a, "1900-01-01 00:00:00" + INTERVAL a MINUTE as result from t order by id ASC; +select id, a, "1900-01-01 00:00:00" + INTERVAL a HOUR as result from t order by id ASC; +select id, a, "1900-01-01 00:00:00" + INTERVAL a DAY as result from t order by id ASC; +select id, a, "1900-01-01 00:00:00" + INTERVAL a WEEK as result from t order by id ASC; +select id, a, "1900-01-01 00:00:00" + INTERVAL a MONTH as result from t order by id ASC; +select id, a, "1900-01-01 00:00:00" + INTERVAL a QUARTER as result from t order by id ASC; +select id, a, "1900-01-01 00:00:00" + INTERVAL a YEAR as result from t order by id ASC; + +# TestAddIntervalSpecialCase +select "1900-01-01 00:00:00" + INTERVAL true MICROSECOND; +select "1900-01-01 00:00:00" + INTERVAL "1.2" MICROSECOND; +select "1900-01-01 00:00:00" + INTERVAL "1.9" MINUTE; +select "1900-01-01 00:00:00" + INTERVAL 1.2 MICROSECOND; +select "1900-01-01 00:00:00" + INTERVAL 1.9 MICROSECOND; +select "1900-01-01 00:00:00" + INTERVAL true SECOND; +select "1900-01-01 00:00:00" + INTERVAL 1.2 SECOND; +select "1900-01-01 00:00:00" + INTERVAL "1+2" SECOND; +select "1900-01-01 00:00:00" + INTERVAL "1.2+2" SECOND; +select "1900-01-01 00:00:00" + INTERVAL "1+2.2" SECOND; +select "1900-01-01 00:00:00" + INTERVAL "0.000001" SECOND; +select "1900-01-01 00:00:00" + INTERVAL "0.0000009" SECOND; +select "1900-01-01 00:00:00" + INTERVAL true MINUTE; +select "1900-01-01 00:00:00" + INTERVAL "1.2" MINUTE; +select "1900-01-01 00:00:00" + INTERVAL "1.9" MINUTE; +select "1900-01-01 00:00:00" + INTERVAL 1.2 MINUTE; +select "1900-01-01 00:00:00" + INTERVAL 1.9 MINUTE; + # TestDecimalConvertToTime # for issue #9770 drop table if exists t; @@ -229,3 +269,60 @@ insert into t1 (d) select date_add('9999-12-31',interval 1 year); insert into t1 (d) select date_add('9999-12-31',interval 1 day); select * from t1; set sql_mode=default; + +# Test date add interval overflow +select "1000-01-01 00:00:00" + INTERVAL 9223372036854775808 day; +select "1000-01-01 00:00:00" + INTERVAL 18446744073709551616 day; + +drop table if exists t1; +create table t1(a decimal(65, 2)); +insert into t1 (a) values (1), (1.4), (1.5), (1.6), (-1), (-1.4), (-1.5), (-1.6), (-1000.5); + +insert into t1 (a) values (315600000000000000), (9223372036854775808), (18446744073709551615), (18446744073709551616), (-9223372036854775808), (-9223372036854775809); +set @@tidb_enable_vectorized_expression=0; +select a, "1000-01-01 00:00:00" + INTERVAL a YEAR from t1 order by a ASC; +select a, "1000-01-01 00:00:00" + INTERVAL a MINUTE from t1 order by a ASC; +select a, "1000-01-01 00:00:00" + INTERVAL a MICROSECOND from t1 order by a ASC; +select a, "1000-01-01 00:00:00" + INTERVAL cast(a as char) DAY from t1 order by a ASC; +select a, "1000-01-01 00:00:00" + INTERVAL cast(a as signed) DAY from t1 order by a ASC; +select a, "1000-01-01 00:00:00" + INTERVAL cast(a as unsigned) DAY from t1 order by a ASC; + +set @@tidb_enable_vectorized_expression=1; +select a, "1000-01-01 00:00:00" + INTERVAL a YEAR from t1 order by a ASC; +select a, "1000-01-01 00:00:00" + INTERVAL a MINUTE from t1 order by a ASC; +select a, "1000-01-01 00:00:00" + INTERVAL a MICROSECOND from t1 order by a ASC; +select a, "1000-01-01 00:00:00" + INTERVAL cast(a as char) DAY from t1 order by a ASC; +select a, "1000-01-01 00:00:00" + INTERVAL cast(a as signed) DAY from t1 order by a ASC; +select a, "1000-01-01 00:00:00" + INTERVAL cast(a as unsigned) DAY from t1 order by a ASC; + +create table t2(a decimal(65, 2), d datetime); +set @old_sql_mode=@@sql_mode; +set @@sql_mode=''; +insert into t2 values('1', "1000-01-01 00:00:00" + INTERVAL "+1" YEAR); +insert into t2 values('-1', "1000-01-01 00:00:00" + INTERVAL "-1" YEAR); +insert into t2 values('0', "1000-01-01 00:00:00" + INTERVAL "XXX" YEAR); +insert into t2 values('99999', "1000-01-01 00:00:00" + INTERVAL 99999 YEAR); +insert into t2 values('116777216', "1000-01-01 00:00:00" + INTERVAL 116777216 YEAR); +insert into t2 values('9223372036854775809', "1000-01-01 00:00:00" + INTERVAL 9223372036854775808 YEAR); +insert into t2 values('18446744073709551616', "1000-01-01 00:00:00" + INTERVAL 18446744073709551616 YEAR); +insert into t2 values('-9223372036854775809', "1000-01-01 00:00:00" + INTERVAL -9223372036854775809 YEAR); +select a, d from t2 order by a ASC; + +truncate table t2; +set @@sql_mode=@old_sql_mode; +insert into t2 values('1', "1000-01-01 00:00:00" + INTERVAL "+1" YEAR); +insert into t2 values('-1', "1000-01-01 00:00:00" + INTERVAL "-1" YEAR); +--error 1292 +insert into t2 values('0', "1000-01-01 00:00:00" + INTERVAL "XXX" YEAR); +--error 1441 +insert into t2 values('99999', "1000-01-01 00:00:00" + INTERVAL 99999 YEAR); +--error 1441 +insert into t2 values('116777216', "1000-01-01 00:00:00" + INTERVAL 116777216 YEAR); +--error 1292 +insert into t2 values('9223372036854775809', "1000-01-01 00:00:00" + INTERVAL 9223372036854775808 YEAR); +--error 1292 +insert into t2 values('18446744073709551616', "1000-01-01 00:00:00" + INTERVAL 18446744073709551616 YEAR); +--error 1292 +insert into t2 values('-9223372036854775809', "1000-01-01 00:00:00" + INTERVAL -9223372036854775809 YEAR); +select a, d from t2 order by a ASC; +drop table if exists t1; diff --git a/tests/integrationtest/t/generated_columns.test b/tests/integrationtest/t/generated_columns.test index 2048395f10f9a..6bdbf31b42040 100644 --- a/tests/integrationtest/t/generated_columns.test +++ b/tests/integrationtest/t/generated_columns.test @@ -162,3 +162,20 @@ EXPLAIN format = 'brief' SELECT * FROM tu WHERE c = 1; EXPLAIN format = 'brief' SELECT a, c FROM tu WHERE c = 1; EXPLAIN format = 'brief' SELECT * FROM tu WHERE c in(1, 2, 3); EXPLAIN format = 'brief' SELECT c, a FROM tu WHERE c in(1, 2, 3); + +# should handle divide zero error for default sql mode +set @@sql_mode=default; +drop table if exists t1; +create table t1(a int); +insert into t1 values(0); +--error 1365 +alter table t1 add index i((100/a)); +drop table t1; + +# should ignore divide zero error for default sql mode +set @@sql_mode=''; +create table t1(a int); +insert into t1 values(0); +alter table t1 add index i((100/a)); +drop table t1; +set @@sql_mode=default; diff --git a/tests/integrationtest/t/parser/integration.test b/tests/integrationtest/t/parser/integration.test new file mode 100644 index 0000000000000..533949c580c5a --- /dev/null +++ b/tests/integrationtest/t/parser/integration.test @@ -0,0 +1,10 @@ +# TestIssue34325 +drop table if exists t; +create table t(d date); +-- error 1292 +replace into t values ('2004-04-31'); +replace /*+ SET_VAR(sql_mode='ALLOW_INVALID_DATES') */ into t values ('2004-04-31'); +drop table if exists t; +create table t(a INT, KEY(a)); +insert /*+ SET_VAR(sql_mode='') */ into t values (2); +replace /*+ SET_VAR(sql_mode='') */ into t values (2); diff --git a/tests/integrationtest/t/planner/cascades/integration.test b/tests/integrationtest/t/planner/cascades/integration.test index 4eaf53e8753ed..4d6b695aabeda 100644 --- a/tests/integrationtest/t/planner/cascades/integration.test +++ b/tests/integrationtest/t/planner/cascades/integration.test @@ -260,3 +260,22 @@ explain select a from (select a from t where b > 2 order by a, b limit 3 offset select a from (select a from t where b > 2 order by a, b limit 3 offset 1) as t1 order by a limit 2 offset 1; explain select * from (select * from t order by a limit 3) as t1 order by a, b limit 5; select * from (select * from t order by a limit 3) as t1 order by a, b limit 5; + + +# TestCascadePlannerHashedPartTable +SET SESSION tidb_opt_fix_control = '44262:ON'; +drop table if exists pt1; +create table pt1(a bigint, b bigint) partition by hash(a) partitions 4; +insert into pt1 values(1,10); +insert into pt1 values(2,20); +insert into pt1 values(3,30); +insert into pt1 values(4,40); +insert into pt1 values(5,50); +set @@tidb_enable_cascades_planner = 1; +explain select * from pt1 order by a; +select * from pt1 order by a; + +set session tidb_opt_fix_control = default; +set @@tidb_enable_cascades_planner = default; + + diff --git a/tests/integrationtest/t/planner/core/casetest/index/index.test b/tests/integrationtest/t/planner/core/casetest/index/index.test new file mode 100644 index 0000000000000..430b486cc44a2 --- /dev/null +++ b/tests/integrationtest/t/planner/core/casetest/index/index.test @@ -0,0 +1,292 @@ +# TestIndexJoinUniqueCompositeIndex +set tidb_cost_model_version=2; +drop table if exists t1, t2; +set tidb_enable_clustered_index=int_only; +create table t1(a int not null, c int not null); +create table t2(a int not null, b int not null, c int not null, primary key(a,b)); +insert into t1 values(1,1); +insert into t2 values(1,1,1),(1,2,1); +analyze table t1,t2; +## Row count of IndexScan should be 2. +explain format = 'brief' select /*+ TIDB_INLJ(t2) */ * from t1 join t2 on t1.a = t2.a and t1.c = t2.c; +## Row count of IndexScan should be 2. +explain format = 'brief' select /*+ TIDB_INLJ(t2) */ * from t1 join t2 on t1.a = t2.a and t1.c <= t2.b; +## Row count of IndexScan should be 1. +explain format = 'brief' select /*+ TIDB_INLJ(t2) */ * from t1 join t2 on t1.a = t2.a and t2.b = 1; +set tidb_enable_clustered_index=default; + + +# TestIndexMergeFromComposedDNFCondition +drop table if exists t2; +create table t2(pk int primary key, a json, b json, c int, d int, e int, index idx(c, (cast(a as signed array))), index idx2((cast(b as signed array)), c), index idx3(c, d), index idx4(d)); +explain select /*+ use_index_merge(t2, idx2, idx) */ * from t2 where (1 member of (a) and c=1) or (2 member of (b) and c=1); -- 1: OR index merge from multi complicated mv index (memberof); +explain select /*+ use_index_merge(t2, idx2, idx) */ * from t2 where (1 member of (a) and c=1) or (2 member of (b) and c=1); -- 2: OR index merge from multi complicated mv index (memberof); +explain select /*+ use_index_merge(t2, idx2, idx) */ * from t2 where (1 member of (a) and c=1 and d=2) or (2 member of (b) and c=3 and d=2); -- 3: OR index merge from multi complicated mv index (memberof),while each DNF item contains redundant condition, which should be remained as table filters; +explain select /*+ use_index_merge(t2, idx2, idx) */ * from t2 where ( json_contains(a, '[1, 2, 3]') and c=1 and d=2) or (2 member of (b) and c=3 and d=2); -- 4: OR index merge from multi complicated mv index (memberof),make full use of DNF item's condition even if the predicate is intersection case (json_contains); +explain select /*+ use_index_merge(t2, idx2, idx) */ * from t2 where ( json_overlaps(a, '[1, 2, 3]') and c=1 and d=2) or (2 member of (b) and c=3 and d=2); -- 5: OR index merge from multi complicated mv index (memberof),make full use of DNF item's condition even if the predicate is intersection case (json_contains); +explain select /*+ use_index_merge(t2, idx2, idx, idx4) */ * from t2 where ( json_contains(a, '[1, 2, 3]') and d=2) or (2 member of (b) and c=3 and d=2); -- 6: OR index merge from multi complicated mv index (memberof),make full use of other DNF items even if one of the DNF items fails; +explain select /*+ use_index_merge(t2, idx2, idx) */ * from t2 where (1 member of (a) and 1 member of (b) and c=3) or (3 member of (b) and c=4); -- 7: OR index merge from multi complicated mv index (memberof),each DNF item can be more complicated like a another embedded CNF member-of composition.; +explain select /*+ use_index_merge(t2, idx2, idx) */ * from t2 where (1 member of (a) and 1 member of (b) and c=3) or (3 member of (b) and c=4) or e=1; -- 8: OR index merge from multi complicated mv index (memberof), each DNF item should be strict or lax used as index partial path.; +explain select /*+ use_index_merge(t2, idx2, idx, idx4) */ * from t2 where (1 member of (a) and 1 member of (b) and c=3) or (3 member of (b) and c=4) or d=1; -- 9: OR index merge from multi complicated mv index (memberof), each DNF item should be strict or lax used as index partial path, specify the index in index merge hint; + +# TestIndexMergeFromComposedCNFCondition +drop table if exists t1, t2; +create table t1(pk int primary key, a json, b json, c int, d int, index idx((cast(a as signed array))), index idx2((cast(b as signed array)))); +create table t2(pk int primary key, a json, b json, c int, d int, index idx(c, (cast(a as signed array))), index idx2((cast(b as signed array)), c), index idx3(c, d), index idx4(d)); +explain select /*+ use_index_merge(t1, idx2, idx) */ * from t1 where 1 member of (a) and 2 member of (b); -- 1: AND index merge from multi member mv index predicate, since member of is single partial path, it can be merged with outer index merge.; +explain select /*+ use_index_merge(t2, idx2, idx) */ * from t2 where 1 member of (a) and c=1 and 2 member of (b); -- 2: AND index merge from multi complicated mv index; +explain select /*+ use_index_merge(t2, idx2, idx, idx4) */ * from t2 where 1 member of (a) and c=1 and 2 member of (b) and d=3; -- 3: AND index merge from multi complicated mv indexes and normal indexes; +explain select /*+ use_index_merge(t2, idx2, idx, idx3) */ * from t2 where json_contains(a, '[1, 2, 3]') and c=1 and 2 member of (b) and d=3; -- 4: AND index merge from multi complicated mv indexes (json_contains (intersection))and normal indexes; +explain select /*+ use_index_merge(t2, idx2, idx, idx3) */ * from t2 where json_overlaps(a, '[1, 2, 3]') and c=1 and 2 member of (b) and d=3; -- 5: AND index merge from multi complicated mv indexes (json_overlap (intersection))and normal indexes; +explain select /*+ use_index_merge(t2, idx2, idx) */ * from t2 where 1 member of (a) and c=1 and c=2; -- 6: AND index merge from multi complicated mv indexes (empty range); + + +# TestIndexMerge +drop table if exists t; +create table t(a int, b int, c int, unique index(a), unique index(b), primary key(c)); +explain format = 'brief' select /*+ USE_INDEX_MERGE(t, a, b) */ * from t where a = 1 or b = 2; +explain format = 'brief' select /*+ USE_INDEX_MERGE(t, A, B) */ * from t where a = 1 or b = 2; +explain format = 'brief' select /*+ USE_INDEX_MERGE(t, primary) */ * from t where 1 or t.c; +explain format = 'brief' select /*+ USE_INDEX_MERGE(t, a, b, c) */ * from t where 1 or t.a = 1 or t.b = 2; + + +# TestIndexJoinTableRange +## for issue #14822 and #38258 +drop table if exists t1, t2, t3, t4; +create table t1(a int, b int, primary key (a), key idx_t1_b (b)); +create table t2(a int, b int, primary key (a), key idx_t1_b (b)); +create table t3(a int, b int, c int); +create table t4(a int, b int, c int, primary key (a, b) clustered); +desc format = 'brief' select /*+ TIDB_INLJ(t2)*/ * from t1, t2 where t1.a = t2.a and t1.b = t2.b; +desc format = 'brief' select /*+ TIDB_INLJ(t2)*/ * from t1, t2 where t1.a = t2.a and t1.b = t2.a and t1.b = t2.b; +desc format = 'brief' select /*+ INL_JOIN(t4) */ * from t3 join t4 on t3.a = t4.a where t4.b = 1; +desc format = 'brief' select /*+ INL_JOIN(t4) */ * from t3 join t4 on t3.b = t4.b where t4.a = 1; + + +# TestIndexJoinInnerIndexNDV +set tidb_cost_model_version=2; +drop table if exists t1, t2; +create table t1(a int not null, b int not null, c int not null); +create table t2(a int not null, b int not null, c int not null, index idx1(a,b), index idx2(c)); +insert into t1 values(1,1,1),(1,1,1),(1,1,1); +insert into t2 values(1,1,1),(1,1,2),(1,1,3); +analyze table t1, t2; +## t2 should use idx2 instead of idx1, since idx2 has larger NDV. +explain format = 'brief' select /*+ inl_join(t2) */ * from t1, t2 where t1.a = t2.a and t1.b = t2.b and t1.c = t2.c; +set tidb_cost_model_version=default; + + +# TestIndexMergeSerial +drop table if exists t; +create table t (a int, b int, unique key(a), unique key(b)); +insert into t value (1, 5), (2, 4), (3, 3), (4, 2), (5, 1); +insert into t value (6, 0), (7, -1), (8, -2), (9, -3), (10, -4); +analyze table t; +desc format='brief' select /*+ use_index_merge(t) */ * from t where a =1 or (b=1 and b+2>1); +show warnings; +desc format='brief' select /*+ use_index_merge(t) */ * from t where a =1 or (b=1 and length(b)=1); +show warnings; +desc format='brief' select /*+ use_index_merge(t) */ * from t where (a=1 and length(a)=1) or (b=1 and length(b)=1); +show warnings; +desc format='brief' select /*+ use_index_merge(t) */ * from t where (a=1 and length(b)=1) or (b=1 and length(a)=1); +show warnings; + + +# TestIndexJoinOnClusteredIndex +set tidb_cost_model_version=2; +set tidb_enable_clustered_index=on; +drop table if exists t; +create table t (a int, b varchar(20), c decimal(40,10), d int, primary key(a,b), key(c)); +insert into t values (1,"111",1.1,11), (2,"222",2.2,12), (3,"333",3.3,13); +analyze table t; +explain format = 'brief'select /*+ inl_join(t1, t2) */ * from t t1 join t t2 on t1.a = t2.a; +select /*+ inl_join(t1, t2) */ * from t t1 join t t2 on t1.a = t2.a; +explain format = 'brief'select /*+ inl_merge_join(t1, t2) */ * from t t1 join t t2 on t1.a = t2.a; +select /*+ inl_merge_join(t1, t2) */ * from t t1 join t t2 on t1.a = t2.a; +explain format = 'brief'select /*+ inl_hash_join(t1, t2) */ * from t t1 join t t2 on t1.a = t2.a; +select /*+ inl_hash_join(t1, t2) */ * from t t1 join t t2 on t1.a = t2.a; +explain format = 'brief'select /*+ inl_join(t1, t2) */ * from t t1 join t t2 on t1.a = t2.a and t1.b = t2.b; +select /*+ inl_join(t1, t2) */ * from t t1 join t t2 on t1.a = t2.a and t1.b = t2.b; +explain format = 'brief'select /*+ inl_join(t1, t2) */ * from t t1 join t t2 on t1.c = t2.c; +select /*+ inl_join(t1, t2) */ * from t t1 join t t2 on t1.c = t2.c; +explain format = 'brief'select /*+ inl_merge_join(t1,t2) */ t2.a, t2.c, t2.d from t t1 left join t t2 on t1.a = t2.c; +select /*+ inl_merge_join(t1,t2) */ t2.a, t2.c, t2.d from t t1 left join t t2 on t1.a = t2.c; +set tidb_enable_clustered_index=default; +set tidb_cost_model_version=default; + + +# TestIndexMergeWithCorrelatedColumns +set tidb_cost_model_version=2; +drop table if exists t1, t2; +create table t1(c1 int, c2 int, c3 int, primary key(c1), key(c2)); +insert into t1 values(1, 1, 1); +insert into t1 values(2, 2, 2); +create table t2(c1 int, c2 int, c3 int); +insert into t2 values(1, 1, 1); +insert into t2 values(2, 2, 2); +drop table if exists tt1, tt2; +create table tt1 (c_int int, c_str varchar(40), c_datetime datetime, c_decimal decimal(12, 6), primary key(c_int), key(c_int), key(c_str), unique key(c_decimal), key(c_datetime)); +create table tt2 like tt1 ; +insert into tt1 (c_int, c_str, c_datetime, c_decimal) values (6, 'sharp payne', '2020-06-07 10:40:39', 6.117000) , + (7, 'objective kare', '2020-02-05 18:47:26', 1.053000) , + (8, 'thirsty pasteur', '2020-01-02 13:06:56', 2.506000) , + (9, 'blissful wilbur', '2020-06-04 11:34:04', 9.144000) , + (10, 'reverent mclean', '2020-02-12 07:36:26', 7.751000) ; +insert into tt2 (c_int, c_str, c_datetime, c_decimal) values (6, 'beautiful joliot', '2020-01-16 01:44:37', 5.627000) , + (7, 'hopeful blackburn', '2020-05-23 21:44:20', 7.890000) , + (8, 'ecstatic davinci', '2020-02-01 12:27:17', 5.648000) , + (9, 'hopeful lewin', '2020-05-05 05:58:25', 7.288000) , + (10, 'sharp jennings', '2020-01-28 04:35:03', 9.758000) ; +explain format=brief select * from t2 where c1 < all(select /*+ use_index_merge(t1) */ c1 from t1 where (c1 = 10 and c1 = t2.c3 or c2 = 1 and c2 = t2.c3) and substring(c3, 10)) order by c1; +select * from t2 where c1 < all(select /*+ use_index_merge(t1) */ c1 from t1 where (c1 = 10 and c1 = t2.c3 or c2 = 1 and c2 = t2.c3) and substring(c3, 10)) order by c1; +explain format=brief select * from t2 where c1 < all(select /*+ use_index_merge(t1) */ c1 from t1 where (c1 = 10 and c1 = t2.c3 or c2 = 1 and c2 = t2.c3) and reverse(c3)) order by c1; +select * from t2 where c1 < all(select /*+ use_index_merge(t1) */ c1 from t1 where (c1 = 10 and c1 = t2.c3 or c2 = 1 and c2 = t2.c3) and reverse(c3)) order by c1; +explain format=brief select * from t2 where c1 < all(select /*+ use_index_merge(t1) */ c1 from t1 where (c1 >= 10 and c1 = t2.c3 or c2 = 1 and c2 = t2.c3) and substring(c3, 10)) order by c1; +select * from t2 where c1 < all(select /*+ use_index_merge(t1) */ c1 from t1 where (c1 >= 10 and c1 = t2.c3 or c2 = 1 and c2 = t2.c3) and substring(c3, 10)) order by c1; + +## Test correlated column in IndexPath.TableFilters. +explain format=brief select c_int from tt1 where c_decimal < all (select /*+ use_index_merge(tt2) */ c_decimal from tt2 where tt1.c_int = tt2.c_int and tt1.c_datetime > tt2.c_datetime and tt2.c_decimal = 9.060 or tt2.c_str <= 'interesting shtern' and tt1.c_int = tt2.c_int) order by 1; +select c_int from tt1 where c_decimal < all (select /*+ use_index_merge(tt2) */ c_decimal from tt2 where tt1.c_int = tt2.c_int and tt1.c_datetime > tt2.c_datetime and tt2.c_decimal = 9.060 or tt2.c_str <= 'interesting shtern' and tt1.c_int = tt2.c_int) order by 1; + +## Test correlated column in TablePath.TableFilters. +explain format=brief select c_int from tt1 where c_decimal > all (select /*+ use_index_merge(tt2) */ c_decimal from tt2 where tt2.c_int = 7 and tt2.c_int < tt1.c_decimal or tt2.c_str >= 'zzzzzzzzzzzzzzzzzzz' and tt1.c_int = tt2.c_int) order by 1; +select c_int from tt1 where c_decimal > all (select /*+ use_index_merge(tt2) */ c_decimal from tt2 where tt2.c_int = 7 and tt2.c_int < tt1.c_decimal or tt2.c_str >= 'zzzzzzzzzzzzzzzzzzz' and tt1.c_int = tt2.c_int) order by 1; +set tidb_cost_model_version=default; + + +# TestIndexJoinRangeFallback +drop table if exists t1, t2; +create table t1(a int, b int, c varchar(10), d varchar(10), index idx_a_b_c_d(a, b, c(2), d(2))); +create table t2(e int, f int, g varchar(10), h varchar(10)); +set @@tidb_opt_range_max_size = 0; +explain format='brief' select /*+ inl_join(t1) */ * from t1 join t2 on t1.b = t2.e and t1.d = t2.g where t1.a in (1, 3) and t1.c in ('aaa', 'bbb'); +show warnings; +set @@tidb_opt_range_max_size = 2900; +explain format='brief' select /*+ inl_join(t1) */ * from t1 join t2 on t1.b = t2.e and t1.d = t2.g where t1.a in (1, 3) and t1.c in ('aaa', 'bbb'); +show warnings; +set @@tidb_opt_range_max_size = 2300; +explain format='brief' select /*+ inl_join(t1) */ * from t1 join t2 on t1.b = t2.e and t1.d = t2.g where t1.a in (1, 3) and t1.c in ('aaa', 'bbb'); +show warnings; +set @@tidb_opt_range_max_size = 700; +explain format='brief' select /*+ inl_join(t1) */ * from t1 join t2 on t1.b = t2.e and t1.d = t2.g where t1.a in (1, 3) and t1.c in ('aaa', 'bbb'); +show warnings; +set @@tidb_opt_range_max_size = 0; +explain format='brief' select /*+ inl_join(t1) */ * from t1 join t2 on t1.a = t2.e where t1.b > 1 and t1.b < 10; +show warnings; +set @@tidb_opt_range_max_size = 300; +explain format='brief' select /*+ inl_join(t1) */ * from t1 join t2 on t1.a = t2.e where t1.b > 1 and t1.b < 10; +show warnings; +set @@tidb_opt_range_max_size = 0; +explain format='brief' select /*+ inl_join(t1) */ * from t1 join t2 on t1.a = t2.e where t1.b > t2.f and t1.b < t2.f + 10; +show warnings; +set @@tidb_opt_range_max_size = 300; +explain format='brief' select /*+ inl_join(t1) */ * from t1 join t2 on t1.a = t2.e where t1.b > t2.f and t1.b < t2.f + 10; +show warnings; +set @@tidb_opt_range_max_size = default; + + +# TestHeuristicIndexSelection +set tidb_cost_model_version=2; +drop table if exists t1, t2, t3, t4; +create table t1(a int, b int, c int, d int, e int, f int, g int, primary key (a), unique key c_d_e (c, d, e), unique key f (f), unique key f_g (f, g), key g (g)); +create table t2(a int, b int, c int, d int, unique index idx_a (a), unique index idx_b_c (b, c), unique index idx_b_c_a_d (b, c, a, d)); +create table t3(a bigint, b varchar(255), c bigint, primary key(a, b) clustered); +create table t4(a bigint, b varchar(255), c bigint, primary key(a, b) nonclustered); +set @@tidb_enable_chunk_rpc = on; +explain format = 'verbose' select * from t1 where a = 3 or a = 5; +show warnings; +explain format = 'verbose' select f, g from t1 where f = 2 and g in (3, 4, 5); +show warnings; +explain format = 'verbose' select * from t1 where c = 1 and (d = 2 or d = 3) and e in (4, 5); +show warnings; +explain format = 'verbose' select f, g from t1 where f = 2 and g > 3; +show warnings; +explain format = 'verbose' select a, b, c from t2 where a = 1 and b = 2 and c in (1, 2, 3, 4, 5); +show warnings; +explain format = 'verbose' select * from t3 where (a = 1 or a = 3) and b = 'xx'; +show warnings; +explain format = 'verbose' select * from t4 where (a = 1 or a = 3) and b = 'xx'; +show warnings; +explain format = 'verbose' select a, b from t3 where (a = 1 or a = 3) and b = 'xx'; +show warnings; +explain format = 'verbose' select a, b from t4 where (a = 1 or a = 3) and b = 'xx'; +show warnings; +explain format = 'verbose' update t1 set b = 2 where a = 4 or a = 6; +show warnings; +explain format = 'verbose' delete from t1 where f = 2 and g in (3, 4); +show warnings; +explain format = 'verbose' insert into t3 select a, b, c from t1 where f = 2; +show warnings; +explain format = 'verbose' replace into t3 select a, b, c from t1 where a = 3; +show warnings; +set @@tidb_enable_chunk_rpc = default; +set tidb_cost_model_version=default; + + +# TestLimitIndexLookUpKeepOrder +set tidb_cost_model_version=2; +drop table if exists t; +create table t(a int, b int, c int, d int, index idx(a,b,c)); +desc format = 'brief' select * from t where a = 1 and b > 2 and b < 10 and d = 10 order by b,c limit 10; +desc format = 'brief' select * from t where a = 1 and b > 2 and b < 10 and d = 10 order by b desc, c desc limit 10; +set tidb_cost_model_version=default; + + +# TestAccessPathOnClusterIndex +set tidb_enable_clustered_index=on; +drop table if exists t1; +create table t1 (a int, b varchar(20), c decimal(40,10), d int, primary key(a,b), key(c)); +insert into t1 values (1,"111",1.1,11), (2,"222",2.2,12), (3,"333",3.3,13); +analyze table t1; +explain format='brief' select * from t1; +--sorted_result +select * from t1; +explain format='brief' select * from t1 where t1.a >= 1 and t1.a < 4; +--sorted_result +select * from t1 where t1.a >= 1 and t1.a < 4; +explain format='brief' select * from t1 where t1.a = 1 and t1.b < "333"; +--sorted_result +select * from t1 where t1.a = 1 and t1.b < "333"; +explain format='brief' select t1.a, t1.b, t1.c from t1 where t1.c = 3.3; +--sorted_result +select t1.a, t1.b, t1.c from t1 where t1.c = 3.3; +explain format='brief' select t1.b, t1.c from t1 where t1.c = 2.2; +--sorted_result +select t1.b, t1.c from t1 where t1.c = 2.2; +explain format='brief' select /*+ use_index(t1, c) */ * from t1; +--sorted_result +select /*+ use_index(t1, c) */ * from t1; +explain format='brief' select * from t1 use index(c) where t1.c in (2.2, 3.3); +--sorted_result +select * from t1 use index(c) where t1.c in (2.2, 3.3); +explain format='brief' select * from t1 where t1.a = 1 order by b; +--sorted_result +select * from t1 where t1.a = 1 order by b; +explain format='brief' select * from t1 order by a, b limit 1; +--sorted_result +select * from t1 order by a, b limit 1; +explain format='brief' select /*+ use_index_merge(t1 primary, c) */ * from t1 where t1.a >= 1 or t1.c = 2.2; +--sorted_result +select /*+ use_index_merge(t1 primary, c) */ * from t1 where t1.a >= 1 or t1.c = 2.2; +explain format='brief' select /*+ use_index_merge(t1 primary, c) */ * from t1 where t1.a = 1 and t1.b = '111' or t1.c = 3.3; +--sorted_result +select /*+ use_index_merge(t1 primary, c) */ * from t1 where t1.a = 1 and t1.b = '111' or t1.c = 3.3; +set tidb_enable_clustered_index=default; + +# TestIndexMergeIssue50265 +drop table if exists t; +create table t(pk varbinary(255) NOT NULL, domains json null, image_signatures json null, canonical_links json null, fpi json null, KEY `domains` ((cast(`domains` as char(253) array))), KEY `image_signatures` ((cast(`image_signatures` as char(32) array))),KEY `canonical_links` ((cast(`canonical_links` as char(1000) array))), KEY `fpi` ((cast(`fpi` as unsigned array)))); +explain format='brief' SELECT pk FROM t WHERE "B2c32" member of (domains) OR "2eoqyp6399" member of (image_signatures) OR "E33EAdAc2Bee.com/s/link" member of (canonical_links) OR json_contains(fpi, '[69236881]') LIMIT 10; + +# TestIndexMergeIssue50382 +drop table if exists t1, t2; +CREATE TABLE `t1` (`a` varchar(488) COLLATE utf8_general_ci DEFAULT NULL, `b` binary(206) DEFAULT '0', `c` json DEFAULT NULL, UNIQUE KEY `idx_29` (`a`,(cast(`c` as signed array)),`b`), UNIQUE KEY `idx_30` ((cast(`c` as signed array)),`a`(5))) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `t2` (`a` float NOT NULL DEFAULT '5217.6055',`b` json NOT NULL,`c` json NOT NULL,`d` varchar(181) COLLATE gbk_bin NOT NULL DEFAULT 'FbVkA~^', KEY `idx_26` (`a`),PRIMARY KEY (`a`,`d`) /*T![clustered_index] NONCLUSTERED */,UNIQUE KEY `idx_28` (`a`,(cast(`b` as binary(64) array)),`d`)) ENGINE=InnoDB DEFAULT CHARSET=gbk COLLATE=gbk_bin; +EXPLAIN format='brief' SELECT /*+ inl_join(t1)*/ `t2`.`c` AS `r0` FROM `t1` JOIN `t2` ON `t1`.`a`=`t2`.`d` WHERE `t2`.`d`='' AND NOT (6252179388429456273 MEMBER OF (`t1`.`c`)); +SHOW WARNINGS + +# TestIndexMergeEliminateRedundantAndPaths +DROP table if exists t; +CREATE TABLE `t` (`pk` varbinary(255) NOT NULL,`nslc` json DEFAULT NULL,`fpi` json DEFAULT NULL,`point_of_sale_country` varchar(2) DEFAULT NULL,PRIMARY KEY (`pk`) /*T![clustered_index] CLUSTERED */,KEY `fpi` ((cast(`fpi` as unsigned array))),KEY `nslc` ((cast(`nslc` as char(1000) array)),`point_of_sale_country`),KEY `nslc_old` ((cast(`nslc` as char(1000) array)))); +EXPLAIN format='brief' SELECT /*+ use_index_merge(t, fpi, nslc_old, nslc) */ * FROM t WHERE 15975127 member of (fpi) AND "OC8p0106XTkt.org/s/link" member of (nslc) LIMIT 10; + diff --git a/tests/integrationtest/t/planner/core/casetest/integration.test b/tests/integrationtest/t/planner/core/casetest/integration.test index e2cae34d3003f..bbee41b57fc97 100644 --- a/tests/integrationtest/t/planner/core/casetest/integration.test +++ b/tests/integrationtest/t/planner/core/casetest/integration.test @@ -475,3 +475,148 @@ set @@tidb_opt_fix_control = "44262:ON"; explain select /*+ TIDB_INLJ(t2_part@sel_2) */ * from t1 where t1.b<10 and not exists (select 1 from t2_part where t1.a=t2_part.a and t2_part.b<20); --disable_warnings + +# TestPartitionPruningForInExpr +drop table if exists t; +create table t(a int(11) not null, b int) partition by range (a) (partition p0 values less than (4), partition p1 values less than(10), partition p2 values less than maxvalue); +insert into t values (1, 1),(10, 10),(11, 11); +set tidb_opt_fix_control='44262:ON'; +explain format = 'brief' select * from t where a in (1, 2,'11'); +explain format = 'brief' select * from t where a in (17, null); +explain format = 'brief' select * from t where a in (16, 'abc'); +explain format = 'brief' select * from t where a in (15, 0.12, 3.47); +explain format = 'brief' select * from t where a in (0.12, 3.47); +explain format = 'brief' select * from t where a in (14, floor(3.47)); +explain format = 'brief' select * from t where b in (3, 4); +set tidb_opt_fix_control=default; + + +# TestPartitionExplain +drop table if exists pt; +create table pt (id int, c int, key i_id(id), key i_c(c)) partition by range (c) ( +partition p0 values less than (4), +partition p1 values less than (7), +partition p2 values less than (10)); +set @@tidb_enable_index_merge = 1; +set tidb_opt_fix_control='44262:ON'; +--echo ## Table reader +explain format='brief' select * from pt where c > 10; +explain format='brief' select * from pt where c > 8; +explain format='brief' select * from pt where c < 2 or c >= 9; +--echo ## Index reader +explain format='brief' select c from pt; +explain format='brief' select c from pt where c > 10; +explain format='brief' select c from pt where c > 8; +explain format='brief' select c from pt where c < 2 or c >= 9; +--echo ## Index Lookup +explain format='brief' select /*+ use_index(pt, i_id) */ * from pt; +explain format='brief' select /*+ use_index(pt, i_id) */ * from pt where id < 4 and c > 10; +explain format='brief' select /*+ use_index(pt, i_id) */ * from pt where id < 10 and c > 8; +explain format='brief' select /*+ use_index(pt, i_id) */ * from pt where id < 10 and c < 2 or c >= 9; +--echo ## Partition selection +explain format='brief' select * from pt partition (p0) where c > 8; +explain format='brief' select c from pt partition (p0, p2) where c > 8; +explain format='brief' select /*+ use_index(pt, i_id) */ * from pt partition (p1, p2) where c < 3 and id = 5; +--echo ## Index Merge +explain format='brief' select * from pt where id = 4 or c < 7; +explain format='brief' select * from pt where id > 4 or c = 7; +set tidb_opt_fix_control=default; +set @@tidb_enable_index_merge = default; + + +# TestIssue41957 +drop table if exists github_events; +CREATE TABLE `github_events` ( + `id` bigint(20) NOT NULL DEFAULT '0', + `type` varchar(29) NOT NULL DEFAULT 'Event', + `created_at` datetime NOT NULL DEFAULT '1970-01-01 00:00:00', + `repo_id` bigint(20) NOT NULL DEFAULT '0', + `repo_name` varchar(140) NOT NULL DEFAULT '', + `actor_id` bigint(20) NOT NULL DEFAULT '0', + `actor_login` varchar(40) NOT NULL DEFAULT '', + `language` varchar(26) NOT NULL DEFAULT '', + `additions` bigint(20) NOT NULL DEFAULT '0', + `deletions` bigint(20) NOT NULL DEFAULT '0', + `action` varchar(11) NOT NULL DEFAULT '', + `number` int(11) NOT NULL DEFAULT '0', + `commit_id` varchar(40) NOT NULL DEFAULT '', + `comment_id` bigint(20) NOT NULL DEFAULT '0', + `org_login` varchar(40) NOT NULL DEFAULT '', + `org_id` bigint(20) NOT NULL DEFAULT '0', + `state` varchar(6) NOT NULL DEFAULT '', + `closed_at` datetime NOT NULL DEFAULT '1970-01-01 00:00:00', + `comments` int(11) NOT NULL DEFAULT '0', + `pr_merged_at` datetime NOT NULL DEFAULT '1970-01-01 00:00:00', + `pr_merged` tinyint(1) NOT NULL DEFAULT '0', + `pr_changed_files` int(11) NOT NULL DEFAULT '0', + `pr_review_comments` int(11) NOT NULL DEFAULT '0', + `pr_or_issue_id` bigint(20) NOT NULL DEFAULT '0', + `event_day` date NOT NULL, + `event_month` date NOT NULL, + `event_year` int(11) NOT NULL, + `push_size` int(11) NOT NULL DEFAULT '0', + `push_distinct_size` int(11) NOT NULL DEFAULT '0', + `creator_user_login` varchar(40) NOT NULL DEFAULT '', + `creator_user_id` bigint(20) NOT NULL DEFAULT '0', + `pr_or_issue_created_at` datetime NOT NULL DEFAULT '1970-01-01 00:00:00', + KEY `index_github_events_on_id` (`id`), + KEY `index_github_events_on_created_at` (`created_at`), + KEY `index_github_events_on_repo_id_type_action_month_actor_login` (`repo_id`,`type`,`action`,`event_month`,`actor_login`), + KEY `index_ge_on_repo_id_type_action_pr_merged_created_at_add_del` (`repo_id`,`type`,`action`,`pr_merged`,`created_at`,`additions`,`deletions`), + KEY `index_ge_on_creator_id_type_action_merged_created_at_add_del` (`creator_user_id`,`type`,`action`,`pr_merged`,`created_at`,`additions`,`deletions`), + KEY `index_ge_on_actor_id_type_action_created_at_repo_id_commits` (`actor_id`,`type`,`action`,`created_at`,`repo_id`,`push_distinct_size`), + KEY `index_ge_on_repo_id_type_action_created_at_number_pdsize_psize` (`repo_id`,`type`,`action`,`created_at`,`number`,`push_distinct_size`,`push_size`), + KEY `index_ge_on_repo_id_type_action_created_at_actor_login` (`repo_id`,`type`,`action`,`created_at`,`actor_login`), + KEY `index_ge_on_repo_name_type` (`repo_name`,`type`), + KEY `index_ge_on_actor_login_type` (`actor_login`,`type`), + KEY `index_ge_on_org_login_type` (`org_login`,`type`), + KEY `index_ge_on_language` (`language`), + KEY `index_ge_on_org_id_type` (`org_id`,`type`), + KEY `index_ge_on_actor_login_lower` ((lower(`actor_login`))), + KEY `index_ge_on_repo_name_lower` ((lower(`repo_name`))), + KEY `index_ge_on_language_lower` ((lower(`language`))), + KEY `index_ge_on_type_action` (`type`,`action`) /*!80000 INVISIBLE */, + KEY `index_ge_on_repo_id_type_created_at` (`repo_id`,`type`,`created_at`), + KEY `index_ge_on_repo_id_created_at` (`repo_id`,`created_at`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin +PARTITION BY LIST COLUMNS(`type`) +(PARTITION `push_event` VALUES IN ('PushEvent'), + PARTITION `create_event` VALUES IN ('CreateEvent'), + PARTITION `pull_request_event` VALUES IN ('PullRequestEvent'), + PARTITION `watch_event` VALUES IN ('WatchEvent'), + PARTITION `issue_comment_event` VALUES IN ('IssueCommentEvent'), + PARTITION `issues_event` VALUES IN ('IssuesEvent'), + PARTITION `delete_event` VALUES IN ('DeleteEvent'), + PARTITION `fork_event` VALUES IN ('ForkEvent'), + PARTITION `pull_request_review_comment_event` VALUES IN ('PullRequestReviewCommentEvent'), + PARTITION `pull_request_review_event` VALUES IN ('PullRequestReviewEvent'), + PARTITION `gollum_event` VALUES IN ('GollumEvent'), + PARTITION `release_event` VALUES IN ('ReleaseEvent'), + PARTITION `member_event` VALUES IN ('MemberEvent'), + PARTITION `commit_comment_event` VALUES IN ('CommitCommentEvent'), + PARTITION `public_event` VALUES IN ('PublicEvent'), + PARTITION `gist_event` VALUES IN ('GistEvent'), + PARTITION `follow_event` VALUES IN ('FollowEvent'), + PARTITION `event` VALUES IN ('Event'), + PARTITION `download_event` VALUES IN ('DownloadEvent'), + PARTITION `team_add_event` VALUES IN ('TeamAddEvent'), + PARTITION `fork_apply_event` VALUES IN ('ForkApplyEvent')); +SELECT + repo_id, GROUP_CONCAT( + DISTINCT actor_login + ORDER BY cnt DESC + SEPARATOR ',' + ) AS actor_logins +FROM ( + SELECT + ge.repo_id AS repo_id, + ge.actor_login AS actor_login, + COUNT(*) AS cnt + FROM github_events ge + WHERE + type = 'PullRequestEvent' AND action = 'opened' + AND (ge.created_at >= DATE_SUB(NOW(), INTERVAL 1 DAY) AND ge.created_at <= NOW()) + GROUP BY ge.repo_id, ge.actor_login + ORDER BY cnt DESC +) sub +GROUP BY repo_id; diff --git a/tests/integrationtest/t/planner/core/cbo.test b/tests/integrationtest/t/planner/core/cbo.test index 7eab31bc66b5e..911bfbd47b309 100644 --- a/tests/integrationtest/t/planner/core/cbo.test +++ b/tests/integrationtest/t/planner/core/cbo.test @@ -59,6 +59,6 @@ create table t2(a int, b int); insert into t1 values (1, 1, 1), (2, 2, 2), (3, 3, 3), (4, 4, 4), (5, 5, 5); insert into t2 values (2, 22), (3, 33), (5, 55), (233, 2), (333, 3), (3434, 5); analyze table t1, t2; ---replace_regex /:[ ]?[.0-9]+[nµms]*/:/ /, scan_detail: {.*}// / tot_proc:.*?, tot_wait:.*?,// /[.0-9]+ ((KB)|(Bytes))// +--replace_regex /:[ ]?[.0-9]+[nµms]*/:/ /time.*loops.*cop_task.*/time.*loops.*cop_task.*/ /, scan_detail: {.*}// /[.0-9]+ ((KB)|(Bytes))// explain analyze select t1.a, t1.b, sum(t1.c) from t1 join t2 on t1.a = t2.b where t1.a > 1; set sql_mode=default; diff --git a/tests/integrationtest/t/planner/core/indexmerge_path.test b/tests/integrationtest/t/planner/core/indexmerge_path.test index 6d82ad3981aa0..5d71c82f75e60 100644 --- a/tests/integrationtest/t/planner/core/indexmerge_path.test +++ b/tests/integrationtest/t/planner/core/indexmerge_path.test @@ -135,15 +135,11 @@ explain select j from t where j in (1, 2); # TestEnforceMVIndex drop table if exists t; create table t(a int, j json, index kj((cast(j as signed array)))); --- error 1815 explain format = 'brief' select /*+ use_index(t, kj) */ * from t; --- error 1815 explain format = 'brief' select /*+ use_index(t, kj) */ a from t; --- error 1815 explain format = 'brief' select /*+ use_index(t, kj) */ * from t where a<10; explain format = 'brief' select /*+ use_index(t, kj) */ * from t where (1 member of (j)); explain format = 'brief' select /*+ use_index(t, kj) */ * from t where (1 member of (j)) and a=10; --- error 1815 explain format = 'brief' select /*+ use_index(t, kj) */ * from t where (1 member of (j)) or a=10; explain format = 'brief' select /*+ use_index_merge(t, kj) */ * from t; explain format = 'brief' select /*+ use_index_merge(t, kj) */ a from t; @@ -173,7 +169,6 @@ select /*+ use_index_merge(t, kj) */ count(*) from t; select /*+ use_index_merge(t, kj) */ count(*) from t where (1 member of (j)); select /*+ use_index_merge(t, kj) */ count(*) from t where json_contains((j), '[1]'); select /*+ use_index_merge(t, kj) */ count(*) from t where json_overlaps((j), '[1]'); --- error 1815 select /*+ use_index(t, kj) */ count(*) from t; @@ -229,4 +224,42 @@ select /*+ no_index_merge() */ a from t where ('1' member of (j0->'$.path0')); select /*+ use_index_merge(t, j0_0) */ a from t where (1 member of (j0->'$.path0')); select /*+ use_index_merge(t, j0_0) */ a from t where ('1' member of (j0->'$.path0')); +drop table if exists t; +create table t(a int, b int, c int, d json, index iad(a, (cast(d->'$.b' as signed array)))); +insert into t value(1,1,1, '{"b":[1,2,3,4]}'); +insert into t value(2,2,2, '{"b":[3,4,5,6]}'); +set tidb_analyze_version=2; +analyze table t; +explain select * from t use index (iad) where a = 1; +explain select * from t use index (iad) where a = 1 and (2 member of (d->'$.b')); + +# TestMultiValuedIndexWithoutRelatedColumnCondition +drop table if exists t; +create table t(a int, d json, index iad(a, (cast(d->'$.b' as signed array)))); +insert into t value(1,'{"b":[]}'), (2,'{"b":[]}'); +select * from t use index (iad) where a = 1; +select * from t ignore index (iad) where a = 1; +drop table if exists t; +create table t (j json, key mvi( (cast(j as char(5) array)) ) ); +insert into t values ('[]'); +insert into t values ('["abc"]'); +select * from t use index (mvi) where json_contains(j, '[]'); +select * from t ignore index (mvi) where json_contains(j, '[]'); + +# TestIssue50298 +drop table if exists t; +create table t(a int, b json); +insert into t value (1, '{"a":[1,2,3], "b": [2,3,4]}'); +analyze table t; +alter table t add index ibb( (cast(b->'$.b' as signed array)) ); +explain select /*+ use_index_merge(t) */ * from t where 10 member of (b->'$.b'); +# TestIssue50420 +drop table if exists t, t1; +create table t (j json, i bigint(20) not null primary key, key mvi((cast(j as unsigned array)))); +insert into t values ('[1,2,3]', 1); +explain format=brief select * from t force index(mvi) where isnull(i) or json_contains(j, '1'); +select * from t force index(mvi) where isnull(i) or json_contains(j, '1'); +create table t1 (j json, a bigint(20), b int, primary key(a,b), key mvi((cast(j as unsigned array)))); +explain format=brief select /*+ use_index_merge(t1, mvi, primary) */ * from t1 where a = 1 or json_contains(j, '1'); +explain format=brief select /*+ use_index_merge(t1, mvi, primary) */ * from t1 where (a = 1 and b = 2) or json_contains(j, '1'); diff --git a/tests/integrationtest/t/planner/core/integration.test b/tests/integrationtest/t/planner/core/integration.test index 75d985b760db7..4eaf641d118c5 100644 --- a/tests/integrationtest/t/planner/core/integration.test +++ b/tests/integrationtest/t/planner/core/integration.test @@ -789,23 +789,23 @@ drop table if exists tc; drop view if exists v; CREATE TABLE `ta` ( `id` varchar(36) NOT NULL , - `status` varchar(1) NOT NULL + `status` varchar(1) NOT NULL ); CREATE TABLE `tb` ( `id` varchar(36) NOT NULL , - `status` varchar(1) NOT NULL + `status` varchar(1) NOT NULL ); CREATE TABLE `tc` ( `id` varchar(36) NOT NULL , - `status` varchar(1) NOT NULL + `status` varchar(1) NOT NULL ); insert into ta values('1','1'); insert into tb values('1','1'); insert into tc values('1','1'); create definer='root'@'localhost' view v as -select -concat(`ta`.`status`,`tb`.`status`) AS `status`, -`ta`.`id` AS `id` from (`ta` join `tb`) +select +concat(`ta`.`status`,`tb`.`status`) AS `status`, +`ta`.`id` AS `id` from (`ta` join `tb`) where (`ta`.`id` = `tb`.`id`); SELECT tc.status,v.id FROM tc, v WHERE tc.id = v.id AND v.status = '11'; @@ -1744,7 +1744,7 @@ drop table if exists t; # TestIssues29711 drop table if exists tbl_29711; CREATE TABLE `tbl_29711` (`col_250` text COLLATE utf8_unicode_ci NOT NULL,`col_251` enum('Alice','Bob','Charlie','David') COLLATE utf8_unicode_ci NOT NULL DEFAULT 'Charlie',PRIMARY KEY (`col_251`,`col_250`(1)) NONCLUSTERED); -explain format=brief select col_250,col_251 from tbl_29711 where col_251 between 'Bob' and 'David' order by col_250,col_251 limit 6; +explain format=brief select col_250,col_251 from tbl_29711 use index (primary) where col_251 between 'Bob' and 'David' order by col_250,col_251 limit 6; drop table if exists t29711; CREATE TABLE `t29711` (`a` varchar(10) DEFAULT NULL,`b` int(11) DEFAULT NULL,`c` int(11) DEFAULT NULL,KEY `ia` (`a`(2))); explain format=brief select * from t29711 use index (ia) order by a limit 10; @@ -2187,6 +2187,7 @@ execute stmt; select @@last_plan_from_binding; drop global binding for select * from t27949 where b=1; +set @@sql_select_limit=default; # TestIssue30804 drop table if exists t1, t2; @@ -2295,3 +2296,93 @@ create table t1(c1 int); select * from t1 group by t1.c1 having count(1) > 1 order by count(1) limit 10; set tidb_enable_ordered_result_mode = DEFAULT; + +# TestViewHintWithBinding +set tidb_cost_model_version=2; +drop view if exists v, v1, v2; +drop table if exists t, t1, t2, t3; +create table t(a int, b int); +create table t1(a int, b int); +create table t2(a int, b int); +create table t3(a int, b int); +create definer='root'@'localhost' view v as select t.a, t.b from t join (select count(*) as a from t1 join t2 join t3 where t1.b=t2.b and t2.a = t3.a group by t2.a) tt on t.a = tt.a; +create definer='root'@'localhost' view v1 as select t.a, t.b from t join (select count(*) as a from t1 join v on t1.b=v.b group by v.a) tt on t.a = tt.a; +create definer='root'@'localhost' view v2 as select t.a, t.b from t join (select count(*) as a from t1 join v1 on t1.b=v1.b group by v1.a) tt on t.a = tt.a; +select * from v2; +select @@last_plan_from_binding; +create global binding for select * from v2 using select /*+ qb_name(qb_v_2, v2.v1@sel_2 .v@sel_2 .@sel_2), merge_join(t1@qb_v_2), stream_agg(@qb_v_2), qb_name(qb_v_1, v2. v1@sel_2 .v@sel_2 .@sel_1), merge_join(t@qb_v_1) */ * from v2; +select * from v2; +select @@last_plan_from_binding; +--replace_column 5 6 +show global bindings where original_sql like '%planner__core__integration%'; +drop global binding for select * from v2; +select * from v2; +select @@last_plan_from_binding; +--replace_column 5 6 +show global bindings where original_sql like '%planner__core__integration%'; + +set tidb_cost_model_version=default; + + +# TestKeepOrderHintWithBinding +set tidb_cost_model_version=2; +drop table if exists t1; +create table t1(a int, b int, index idx_a(a)); +--echo +--echo ## create binding for order_index hint +select * from t1 where a<10 order by a limit 1; +select @@last_plan_from_binding; +create global binding for select * from t1 where a<10 order by a limit 1 using select /*+ order_index(t1, idx_a) */ * from t1 where a<10 order by a limit 1; +select * from t1 where a<10 order by a limit 1; +select @@last_plan_from_binding; +--replace_column 5 6 +show global bindings where original_sql like '%planner__core__integration%'; +--echo +drop global binding for select * from t1 where a<10 order by a limit 1; +select * from t1 where a<10 order by a limit 1; +select @@last_plan_from_binding; +--replace_column 5 6 +show global bindings where original_sql like '%planner__core__integration%'; +--echo +--echo ## create binding for no_order_index hint +create global binding for select * from t1 where a<10 order by a limit 1 using select /*+ no_order_index(t1, idx_a) */ * from t1 where a<10 order by a limit 1; +select * from t1 where a<10 order by a limit 1; +select @@last_plan_from_binding; +--replace_column 5 6 +show global bindings where original_sql like '%planner__core__integration%'; +--echo +drop global binding for select * from t1 where a<10 order by a limit 1; +select * from t1 where a<10 order by a limit 1; +select @@last_plan_from_binding; +--replace_column 5 6 +show global bindings where original_sql like '%planner__core__integration%'; + +set tidb_cost_model_version=default; + + +# TestIssue20139 +drop table if exists t; +set tidb_opt_fix_control='44262:ON'; +create table t (id int, c int) partition by range (id) (partition p0 values less than (4), partition p1 values less than (7)); +insert into t values(3, 3), (5, 5); +explain format = 'brief' select * from t where c = 1 and id = c; + + +# TestIssue46177 +drop table if exists sbtest; +CREATE TABLE sbtest ( + id int(10) unsigned NOT NULL AUTO_INCREMENT, + k int(10) unsigned NOT NULL DEFAULT '0', + c char(120) NOT NULL DEFAULT '', + pad char(60) NOT NULL DEFAULT '', + PRIMARY KEY (id) /*T![clustered_index] CLUSTERED */, + KEY k (k) +); +## cannot choose the best plan with RangeScan. +set @@tidb_opt_fix_control = '46177:off'; +explain format='brief' select row_number() over(order by a.k) from (select * from sbtest where id<10) a; +explain format='brief' select /*+ stream_agg() */ count(1) from sbtest where id<1 group by k; +set @@tidb_opt_fix_control = '46177:on'; +explain format='brief' select row_number() over(order by a.k) from (select * from sbtest where id<10) a; +explain format='brief' select /*+ stream_agg() */ count(1) from sbtest where id<1 group by k; +set @@tidb_opt_fix_control = default; diff --git a/tests/integrationtest/t/planner/core/integration_partition.test b/tests/integrationtest/t/planner/core/integration_partition.test index f4a5bc71f3d8c..ff7bec9b45371 100644 --- a/tests/integrationtest/t/planner/core/integration_partition.test +++ b/tests/integrationtest/t/planner/core/integration_partition.test @@ -349,9 +349,9 @@ create database list_partition_temp_table; use list_partition_temp_table; drop table if exists tlist; set tidb_enable_list_partition = 1; ---error 1526 +--error 1562 create global temporary table t(a int, b int) partition by list(a) (partition p0 values in (0)) on commit delete rows; ---error 1526 +--error 1562 create global temporary table t(a int, b int) partition by list columns (a) (partition p0 values in (0)) on commit delete rows; @@ -817,6 +817,7 @@ explain format=brief select * from t1 where a = 'a' AND c = 'd'; select * from t1 where a = 'a' AND c = 'd'; drop table t1; + # TestPartitionProcessorWithUninitializedTable drop table if exists q1, q2; create table q1(a int, b int, key (a)) partition by range (a) (partition p0 values less than (10), partition p1 values less than (20)); @@ -827,6 +828,7 @@ explain format=brief select * from q1,q2; analyze table q2; explain format=brief select * from q1,q2; + # TestIssue42323 create database issue42323; use issue42323; @@ -842,3 +844,28 @@ select * from t where col1 = floor(202303); drop database issue42323; +# TestListPartitionPrivilege +drop database if exists list_partition_pri; +create database list_partition_pri; +use list_partition_pri; +set tidb_enable_list_partition = 1; +create table tlist (a int) partition by list (a) (partition p0 values in (0), partition p1 values in (1)); +drop user if exists 'priv_test'@'%'; +create user 'priv_test'@'%'; +grant select on list_partition_pri.tlist to 'priv_test'; + +connect (conn1, localhost, priv_test,,); +use list_partition_pri; +--error 1142 +alter table tlist truncate partition p0; +--error 1142 +alter table tlist drop partition p0; +--error 1142 +alter table tlist add partition (partition p2 values in (2)); +--error 1142 +insert into tlist values (1); +disconnect conn1; + +use planner__core__integration_partition; +set tidb_enable_list_partition = DEFAULT; + diff --git a/tests/integrationtest/t/planner/core/issuetest/planner_issue.test b/tests/integrationtest/t/planner/core/issuetest/planner_issue.test index 1b58c7c5046c7..f41f312cd82e4 100644 --- a/tests/integrationtest/t/planner/core/issuetest/planner_issue.test +++ b/tests/integrationtest/t/planner/core/issuetest/planner_issue.test @@ -136,3 +136,53 @@ FROM t2 db LEFT JOIN tmp3 c2 ON c2.id = '1' LEFT JOIN tmp3 c3 ON c3.id = '1'; + +# https://github.com/pingcap/tidb/issues/48755 +drop table if exists t; +create table t(a int, b int); +set @@tidb_max_chunk_size = 32; +# insert into more than 32 rows to the table. +insert into t values(1, 1); +insert into t select a+1, a+1 from t; +insert into t select a+2, a+2 from t; +insert into t select a+4, a+4 from t; +insert into t select a+8, a+8 from t; +insert into t select a+16, a+16 from t; +insert into t select a+32, a+32 from t; +select a from (select 100 as a, 100 as b union all select * from t) t where b != 0; +set @@tidb_max_chunk_size = default; + +# https://github.com/pingcap/tidb/issues/48821 +# https://github.com/pingcap/tidb/issues/48983 +drop table if exists t1, t2; +create table t1(a varchar(20) collate utf8mb4_bin, index ia(a)); +insert into t1 value('测试'),('测试 '),('xxx '); +explain format = brief select *,length(a) from t1 where a like '测试 %'; +explain format = brief select *,length(a) from t1 where a like '测试'; +select *,length(a) from t1 where a like '测试 %'; +select *,length(a) from t1 where a like '测试'; +explain format = brief select * from t1 use index (ia) where a like 'xxx_'; +select * from t1 use index (ia) where a like 'xxx_'; +create table t2(a varchar(20) collate gbk_chinese_ci, index ia(a)); +insert into t2 value('测试'),('测试 '); +explain format = brief select *,length(a) from t2 where a like '测试 %'; +explain format = brief select *,length(a) from t2 where a like '测试'; +select *,length(a) from t2 where a like '测试 %'; +select *,length(a) from t2 where a like '测试'; + +# https://github.com/pingcap/tidb/issues/48969 +drop view if exists v1; +create view v1(id) as +with recursive cte(a) as (select 1 union select a+1 from cte where a<3) +select * from cte; + +create table test2(id int,value int); +insert into test2 values(1,1),(2,2),(3,3),(4,4),(5,5); + +update test2 +set value=0 +where test2.id in +( + select * from v1 +); +select * from test2; diff --git a/tests/integrationtest/t/planner/core/memtable_predicate_extractor.test b/tests/integrationtest/t/planner/core/memtable_predicate_extractor.test new file mode 100644 index 0000000000000..33c50b68a9c7b --- /dev/null +++ b/tests/integrationtest/t/planner/core/memtable_predicate_extractor.test @@ -0,0 +1,55 @@ +# TestPredicateQuery +drop table if exists t, abclmn; +create table t(id int, abctime int,DATETIME_PRECISION int); +create table abclmn(a int); +select TABLE_NAME from information_schema.columns where table_schema = 'planner__core__memtable_predicate_extractor' and column_name like 'i%'; +select TABLE_NAME from information_schema.columns where table_schema = 'PLANNER__CORE__MEMTABLE_PREDICATE_EXTRACTOR' and column_name like 'I%'; +select TABLE_NAME from information_schema.columns where table_schema = 'PLANNER__CORE__MEMTABLE_PREDICATE_EXTRACTOR' and column_name like 'ID'; +select TABLE_NAME from information_schema.columns where table_schema = 'PLANNER__CORE__MEMTABLE_PREDICATE_EXTRACTOR' and column_name like 'id'; +select column_name from information_schema.columns where table_schema = 'PLANNER__CORE__MEMTABLE_PREDICATE_EXTRACTOR' and (column_name like 'i%' or column_name like '%d'); +select column_name from information_schema.columns where table_schema = 'PLANNER__CORE__MEMTABLE_PREDICATE_EXTRACTOR' and (column_name like 'abc%' and column_name like '%time'); +select TABLE_NAME, column_name from information_schema.columns where table_schema = 'PLANNER__CORE__MEMTABLE_PREDICATE_EXTRACTOR' and column_name like '%time'; +describe t; +describe t id; +describe t ID; +-- error 1064 +describe t 'I%'; +-- error 1064 +describe t I%; +show columns from t like 'abctime'; +show columns from t like 'ABCTIME'; +show columns from t like 'abc%'; +show columns from t like 'ABC%'; +show columns from t like '%ime'; +show columns from t like '%IME'; +show columns in t like '%ime'; +show columns in t like '%IME'; +show fields in t like '%ime'; +show fields in t like '%IME'; +show columns from t where field like '%time'; +show columns from t where field = 'abctime'; +show columns in t where field = 'abctime'; +show fields from t where field = 'abctime'; +show fields in t where field = 'abctime'; +explain t; +-- error 1054 +show columns from t like id; +-- error 1054 +show columns from t like `id`; +show tables like 't'; +show tables like 'T'; +show tables like 'ABCLMN'; +show tables like 'ABC%'; +show tables like '%lmn'; +show full tables like '%lmn'; +-- error 1054 +show tables like T; +-- error 1054 +show tables like `T`; + +## For issue46618 +drop table if exists _bar, bar; +create table _bar (id int); +create table bar (id int); +show tables like '\_%'; + diff --git a/tests/integrationtest/t/planner/core/partition_pruner.test b/tests/integrationtest/t/planner/core/partition_pruner.test index 324d2a1752cd6..b6dda1b763f12 100644 --- a/tests/integrationtest/t/planner/core/partition_pruner.test +++ b/tests/integrationtest/t/planner/core/partition_pruner.test @@ -1012,3 +1012,27 @@ select * from test1 where partition_no >= 200000; drop database issue43459; +# TestIssue50082 +use planner__core__partition_pruner; +drop table if exists t; +create table t(a bigint unsigned) +PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (5086706), + PARTITION `p1` VALUES LESS THAN (7268292), + PARTITION `p2` VALUES LESS THAN (16545422), + PARTITION `p3` VALUES LESS THAN (9223372036854775810)); +desc select * from t where a BETWEEN -6895222 AND 3125507; +desc select * from t where a > 9223372036854775808; +desc select * from t where a in (-6895222, 3125507, 9223372036854775809); + +drop table if exists t; +create table t(a bigint) +PARTITION BY RANGE (`a`) +(PARTITION `p0` VALUES LESS THAN (5086706), + PARTITION `p1` VALUES LESS THAN (7268292), + PARTITION `p2` VALUES LESS THAN (16545422), + PARTITION `p3` VALUES LESS THAN (9223372036854775807)); +desc select * from t where a BETWEEN -6895222 AND 3125507; +desc select * from t where a > 9223372036854775808; +desc select * from t where a in (-6895222, 3125507, 9223372036854775809); + diff --git a/tests/integrationtest/t/planner/core/physical_plan.test b/tests/integrationtest/t/planner/core/physical_plan.test index ebe0feba8a706..5fc57fb9ce2a6 100644 --- a/tests/integrationtest/t/planner/core/physical_plan.test +++ b/tests/integrationtest/t/planner/core/physical_plan.test @@ -35,3 +35,32 @@ insert into t1 (a,b,c) value(3,4,5); explain format = 'brief' select * from (select * from t1 order by a) tmp; +# TestHJBuildAndProbeHintWithBinding +set tidb_cost_model_version=2; +drop table if exists t, t1, t2, t3; +create table t(a int, b int, key(a)); +create table t1(a int, b int, key(a)); +create table t2(a int, b int, key(a)); +create table t3(a int, b int, key(a)); + +select * from t1 join t2 on t1.a=t2.a join t3 on t2.b=t3.b; +select @@last_plan_from_binding; +create global binding for select * from t1 join t2 on t1.a=t2.a join t3 on t2.b=t3.b using select /*+ hash_join_build(t1) */ * from t1 join t2 on t1.a=t2.a join t3 on t2.b=t3.b; +select * from t1 join t2 on t1.a=t2.a join t3 on t2.b=t3.b; +select @@last_plan_from_binding; +--replace_column 5 6 +show global bindings where original_sql like '%planner__core__physical_plan%'; + +create global binding for select * from t1 join t2 on t1.a=t2.a join t3 on t2.b=t3.b using select /*+ hash_join_probe(t1) */ * from t1 join t2 on t1.a=t2.a join t3 on t2.b=t3.b; +select * from t1 join t2 on t1.a=t2.a join t3 on t2.b=t3.b; +select @@last_plan_from_binding; +--replace_column 5 6 +show global bindings where original_sql like '%planner__core__physical_plan%'; + +drop global binding for select * from t1 join t2 on t1.a=t2.a join t3 on t2.b=t3.b; +select * from t1 join t2 on t1.a=t2.a join t3 on t2.b=t3.b; +select @@last_plan_from_binding; +--replace_column 5 6 +show global bindings where original_sql like '%planner__core__physical_plan%'; + +set tidb_cost_model_version=DEFAULT; diff --git a/tests/integrationtest/t/planner/core/plan.test b/tests/integrationtest/t/planner/core/plan.test index 896fd62e082f7..4b18143dcc46b 100644 --- a/tests/integrationtest/t/planner/core/plan.test +++ b/tests/integrationtest/t/planner/core/plan.test @@ -198,3 +198,14 @@ select * from golang1; # TestExplainValuesStatement --error 1051 EXPLAIN FORMAT = TRADITIONAL ((VALUES ROW ()) ORDER BY 1); + + +# TestIssue35090 +drop table if exists p, t; +create table p (id int, c int, key i_id(id), key i_c(c)); +create table t (id int); +insert into p values (3,3), (4,4), (6,6), (9,9); +insert into t values (4), (9); +select /*+ INL_JOIN(p) */ * from p, t where p.id = t.id; +--replace_column 5 6 7 8 9 +explain analyze format='brief' select /*+ INL_JOIN(p) */ * from p, t where p.id = t.id; diff --git a/tests/integrationtest/t/planner/core/plan_cost_ver2.test b/tests/integrationtest/t/planner/core/plan_cost_ver2.test index 56039848c5e23..81246b7353de1 100644 --- a/tests/integrationtest/t/planner/core/plan_cost_ver2.test +++ b/tests/integrationtest/t/planner/core/plan_cost_ver2.test @@ -74,3 +74,14 @@ set @@tidb_cost_model_version=1; explain select * from t where a between 1 and 5 and b != 200 and c = 20 limit 100000; +# TestCostModelShowFormula +drop table if exists t; +create table t (a int); +set @@tidb_cost_model_version=2; +## 'true_card_cost' must work with 'explain analyze' +--error 1105 +explain format='true_card_cost' select * from t; +--replace_column 8 9 10 11 +explain analyze format='true_card_cost' select * from t where a<3; + +set @@tidb_cost_model_version=DEFAULT; diff --git a/tests/integrationtest/t/planner/core/point_get_plan.test b/tests/integrationtest/t/planner/core/point_get_plan.test index 65ddaf8d0e4b7..795cdaeb3d6c6 100644 --- a/tests/integrationtest/t/planner/core/point_get_plan.test +++ b/tests/integrationtest/t/planner/core/point_get_plan.test @@ -336,3 +336,34 @@ select * from t2 where col1 = 0x000039; drop table t1, t2; +# TestPointGetForUpdate +drop table if exists fu; +create table fu (id int primary key, val int); +insert into fu values (6, 6); + +## In autocommit mode, outside a transaction, "for update" doesn't take effect. +explain format = 'brief' select * from fu where id = 6 for update; +select * from fu where id = 6 for update; + +begin; +explain format = 'brief' select * from fu where id = 6 for update; +select * from fu where id = 6 for update; +rollback; + +set @@session.autocommit = 0; +explain format = 'brief' select * from fu where id = 6 for update; +select * from fu where id = 6 for update; +rollback; + +set @@session.autocommit = default; + + +# TestUpdateWithTableReadLockWillFail +drop table if exists tbllock; +create table tbllock(id int, c int); +insert into tbllock values(1, 2), (2, 2); +lock table tbllock read; +--error 1099 +update tbllock set c = 3 where id = 2; + +unlock tables; diff --git a/tests/integrationtest/t/planner/core/range_scan_for_like.test b/tests/integrationtest/t/planner/core/range_scan_for_like.test new file mode 100644 index 0000000000000..ff60df3f17584 --- /dev/null +++ b/tests/integrationtest/t/planner/core/range_scan_for_like.test @@ -0,0 +1,231 @@ +# Suite 1: utf8mb4_general_ci + normal index +create table t(a varchar(20) collate utf8mb4_general_ci, index ia(a)); +insert into t value('测试'),('测试Abc'),('测试 '),('你好'),('aABBccdd'),('Aa'),(''),(' '),(' '),(' 语言'),(' 语 言 '),('测测试 '),('测测试 '),(NULL); +# test cases for the pattern string cover: +# with/without wildcard +# start/end with wildcard +# [non-]ascii characters +# [only] contain empty string/space +explain select *, length(a) from t use index (ia) where a like '测试%' order by a,_tidb_rowid; +select *, length(a) from t use index (ia) where a like '测试%' order by a,_tidb_rowid; +explain select *, length(a) from t use index (ia) where a like '测%%' order by a,_tidb_rowid; +select *, length(a) from t use index (ia) where a like '测%%' order by a,_tidb_rowid; +explain select *, length(a) from t use index (ia) where a like '测%%试' order by a,_tidb_rowid; +select *, length(a) from t use index (ia) where a like '测%%试' order by a,_tidb_rowid; +explain select *, length(a) from t use index (ia) where a like '测试%%' order by a,_tidb_rowid; +select *, length(a) from t use index (ia) where a like '测试%%' order by a,_tidb_rowid; +explain select *, length(a) from t use index (ia) where a like '测试_' order by a,_tidb_rowid; +select *, length(a) from t use index (ia) where a like '测试_' order by a,_tidb_rowid; +explain select *, length(a) from t use index (ia) where a like '你好%' order by a,_tidb_rowid; +select *, length(a) from t use index (ia) where a like '你好%' order by a,_tidb_rowid; +explain select *, length(a) from t use index (ia) where a like 'aa' order by a,_tidb_rowid; +select *, length(a) from t use index (ia) where a like 'aa' order by a,_tidb_rowid; +explain select *, length(a) from t use index (ia) where a like 'aa%' order by a,_tidb_rowid; +select *, length(a) from t use index (ia) where a like 'aa%' order by a,_tidb_rowid; +explain select *, length(a) from t use index (ia) where a like 'aa%cc' order by a,_tidb_rowid; +select *, length(a) from t use index (ia) where a like 'aa%cc' order by a,_tidb_rowid; +explain select *, length(a) from t use index (ia) where a like '' order by a,_tidb_rowid; +select *, length(a) from t use index (ia) where a like '' order by a,_tidb_rowid; +explain select *, length(a) from t use index (ia) where a like ' ' order by a,_tidb_rowid; +select *, length(a) from t use index (ia) where a like ' ' order by a,_tidb_rowid; +explain select *, length(a) from t use index (ia) where a like 'aa%dd' order by a,_tidb_rowid; +select *, length(a) from t use index (ia) where a like 'aa%dd' order by a,_tidb_rowid; +explain select *, length(a) from t use index (ia) where a like 'aa%%dd' order by a,_tidb_rowid; +select *, length(a) from t use index (ia) where a like 'aa%%dd' order by a,_tidb_rowid; +explain select *, length(a) from t use index (ia) where a like 'aa_bccdd' order by a,_tidb_rowid; +select *, length(a) from t use index (ia) where a like 'aa_bccdd' order by a,_tidb_rowid; +explain select *, length(a) from t use index (ia) where a like '%%' order by a,_tidb_rowid; +select *, length(a) from t use index (ia) where a like '%%' order by a,_tidb_rowid; +explain select *, length(a) from t use index (ia) where a like ' %%' order by a,_tidb_rowid; +select *, length(a) from t use index (ia) where a like ' %%' order by a,_tidb_rowid; +explain select *, length(a) from t use index (ia) where a like ' %%语言' order by a,_tidb_rowid; +select *, length(a) from t use index (ia) where a like ' %%语言' order by a,_tidb_rowid; +explain select *, length(a) from t use index (ia) where a like ' 语 %' order by a,_tidb_rowid; +select *, length(a) from t use index (ia) where a like ' 语 %' order by a,_tidb_rowid; +explain select *, length(a) from t use index (ia) where a like ' 语 _' order by a,_tidb_rowid; +select *, length(a) from t use index (ia) where a like ' 语 _' order by a,_tidb_rowid; +drop table t; +# Suite 2: utf8mb4_unicode_ci + unique index +create table t(a varchar(20) collate utf8mb4_unicode_ci, unique index ia(a)); +insert into t value(''),('测试'),('测试abc'),('你好'),('aabbccdd'),(' 语言'),(' 语 言 '),('测测试 '); +# test cases for the pattern string are the same with Suite 1 +explain select *, length(a) from t use index (ia) where a like '测试%' order by a,_tidb_rowid; +select *, length(a) from t use index (ia) where a like '测试%' order by a,_tidb_rowid; +explain select *, length(a) from t use index (ia) where a like '测%%' order by a,_tidb_rowid; +select *, length(a) from t use index (ia) where a like '测%%' order by a,_tidb_rowid; +explain select *, length(a) from t use index (ia) where a like '测%%试' order by a,_tidb_rowid; +select *, length(a) from t use index (ia) where a like '测%%试' order by a,_tidb_rowid; +explain select *, length(a) from t use index (ia) where a like '测试%%' order by a,_tidb_rowid; +select *, length(a) from t use index (ia) where a like '测试%%' order by a,_tidb_rowid; +explain select *, length(a) from t use index (ia) where a like '测试_' order by a,_tidb_rowid; +select *, length(a) from t use index (ia) where a like '测试_' order by a,_tidb_rowid; +explain select *, length(a) from t use index (ia) where a like '你好%' order by a,_tidb_rowid; +select *, length(a) from t use index (ia) where a like '你好%' order by a,_tidb_rowid; +explain select *, length(a) from t use index (ia) where a like 'aa' order by a,_tidb_rowid; +select *, length(a) from t use index (ia) where a like 'aa' order by a,_tidb_rowid; +explain select *, length(a) from t use index (ia) where a like 'aa%' order by a,_tidb_rowid; +select *, length(a) from t use index (ia) where a like 'aa%' order by a,_tidb_rowid; +explain select *, length(a) from t use index (ia) where a like 'aa%cc' order by a,_tidb_rowid; +select *, length(a) from t use index (ia) where a like 'aa%cc' order by a,_tidb_rowid; +explain select *, length(a) from t use index (ia) where a like '' order by a,_tidb_rowid; +select *, length(a) from t use index (ia) where a like '' order by a,_tidb_rowid; +explain select *, length(a) from t use index (ia) where a like 'aa%dd' order by a,_tidb_rowid; +select *, length(a) from t use index (ia) where a like 'aa%dd' order by a,_tidb_rowid; +explain select *, length(a) from t use index (ia) where a like 'aa%%dd' order by a,_tidb_rowid; +select *, length(a) from t use index (ia) where a like 'aa%%dd' order by a,_tidb_rowid; +explain select *, length(a) from t use index (ia) where a like 'aa_bccdd' order by a,_tidb_rowid; +select *, length(a) from t use index (ia) where a like 'aa_bccdd' order by a,_tidb_rowid; +explain select *, length(a) from t use index (ia) where a like '%%' order by a,_tidb_rowid; +select *, length(a) from t use index (ia) where a like '%%' order by a,_tidb_rowid; +explain select *, length(a) from t use index (ia) where a like ' %%' order by a,_tidb_rowid; +select *, length(a) from t use index (ia) where a like ' %%' order by a,_tidb_rowid; +explain select *, length(a) from t use index (ia) where a like ' %%语言' order by a,_tidb_rowid; +select *, length(a) from t use index (ia) where a like ' %%语言' order by a,_tidb_rowid; +explain select *, length(a) from t use index (ia) where a like ' 语 %' order by a,_tidb_rowid; +select *, length(a) from t use index (ia) where a like ' 语 %' order by a,_tidb_rowid; +explain select *, length(a) from t use index (ia) where a like ' 语 _' order by a,_tidb_rowid; +select *, length(a) from t use index (ia) where a like ' 语 _' order by a,_tidb_rowid; +drop table t; +# Suite 3: utf8mb4_0900_ai_ci + ascii_bin + multi-column index + prefix index + primary key (clustered) +create table t(a varchar(20) collate utf8mb4_0900_ai_ci, b varchar(20) collate ascii_bin, c bigint, primary key(a(1), b) clustered); +insert into t (a, b, c) values +('测试1', 'asdfgh', 345346), +('你好2', 'qqwweerrrr', 987765), +('こんにちは3', 'zxcvbnn', 1111111), +('안녕하세요4', 'asdfgh ', 3333333333), +('Ciao5', ' asdfgh', 444400), +('Hola6', ' asdfgh ', 6666), +('Bonjour ', '', 888888888), +('Olá8', ' ', 9999999), +('Привет9', ' ', 321321), +('Hallo10', '12345', 35678); +explain select * from t use index (primary) where a like '测试%' and b like 'asd%' order by a,b; +select * from t use index (primary) where a like '测试%' and b like 'asd%' order by a,b; +explain select * from t use index (primary) where a like '测试1' and b like 'asdfgh %' order by a,b; +select * from t use index (primary) where a like '测试1' and b like 'asdfgh %' order by a,b; +explain select * from t use index (primary) where a like 'こんにち_' and b like 'zxc%' order by a,b; +select * from t use index (primary) where a like 'こんにち_' and b like 'zxc%' order by a,b; +explain select * from t use index (primary) where a like '안녕하세요%' and b like 'asd%' order by a,b; +select * from t use index (primary) where a like '안녕하세요%' and b like 'asd%' order by a,b; +explain select * from t use index (primary) where a like 'Ciáo%' and b like ' _%' order by a,b; +select * from t use index (primary) where a like 'Ciáo%' and b like ' _%' order by a,b; +explain select * from t use index (primary) where a like '%HoLa%' and b like ' asdfgh' order by a,b; +select * from t use index (primary) where a like '%HoLa%' and b like ' asdfgh' order by a,b; +explain select * from t use index (primary) where a like 'bonjour _%' and b like '' order by a,b; +select * from t use index (primary) where a like 'bonjour _%' and b like '' order by a,b; +explain select * from t use index (primary) where a like 'OLa%' and b like '_' order by a,b; +select * from t use index (primary) where a like 'OLa%' and b like '_' order by a,b; +explain select * from t use index (primary) where a like 'Приве__' and b like ' %' order by a,b; +select * from t use index (primary) where a like 'Приве__' and b like ' %' order by a,b; +explain select * from t use index (primary) where a like 'Hallo%' and b like '123%' order by a,b; +select * from t use index (primary) where a like 'Hallo%' and b like '123%' order by a,b; +drop table t; +# Suite 4: gbk_chinese_ci + latin1_bin + multi-column index + prefix index + primary key (nonclustered) +create table t(a varchar(20) collate gbk_chinese_ci, b varchar(20) collate latin1_bin, c bigint, primary key(a, b(5)) nonclustered); +insert into t (a, b, c) values +('测试1', 'asdfgh', 345346), +('你好2', 'qqwweerrrr', 987765), +('zxcvbnn',0xE38193E38293E381ABE381A1E381AF33, 1111111), +('asdfgh ', 0xEC9588EB8595ED9598EC84B8EC9A9434, 3333333333), +('Ciao5', ' asdfgh', 444400), +(' asdfgh ', 'Hola6', 6666), +('Bonjour ', '', 888888888), +('Olá8', ' ', 9999999), +('Привет9', ' ', 321321), +(' ', '12345', 35678); +set names utf8mb4; +explain select * from t use index (primary) where a like '测试%' and b like 'asd%' order by a,b; +select * from t use index (primary) where a like '测试%' and b like 'asd%' order by a,b; +explain select * from t use index (primary) where a like '测试1' and b like 'asdfgh %' order by a,b; +select * from t use index (primary) where a like '测试1' and b like 'asdfgh %' order by a,b; +set names latin1; +explain select * from t use index (primary) where b like 'こんにち_' and a like 'zxc%' order by a,b; +select * from t use index (primary) where b like 'こんにち_' and a like 'zxc%' order by a,b; +explain select * from t use index (primary) where b like '안녕하세요%' and a like 'asd%' order by a,b; +select * from t use index (primary) where b like '안녕하세요%' and a like 'asd%' order by a,b; +set names utf8mb4; +explain select * from t use index (primary) where a like 'Ciao%' and b like ' _%' order by a,b; +select * from t use index (primary) where a like 'Ciao%' and b like ' _%' order by a,b; +explain select * from t use index (primary) where b like 'HoLa%' and a like ' asdfgh' order by a,b; +select * from t use index (primary) where b like 'HoLa%' and a like ' asdfgh' order by a,b; +explain select * from t use index (primary) where a like 'bonjour _%' and b like '' order by a,b; +select * from t use index (primary) where a like 'bonjour _%' and b like '' order by a,b; +explain select * from t use index (primary) where a like 'OLá' and b like '_' order by a,b; +select * from t use index (primary) where a like 'OLá' and b like '_' order by a,b; +explain select * from t use index (primary) where a like 'Приве__' and b like ' %' order by a,b; +select * from t use index (primary) where a like 'Приве__' and b like ' %' order by a,b; +explain select * from t use index (primary) where a like ' %' and b like '123%' order by a,b; +select * from t use index (primary) where a like ' %' and b like '123%' order by a,b; +drop table t; +# Suite 5: utf8mb4_general_ci + prefix index +create table t(a varchar(20) collate utf8mb4_general_ci, b bigint, index ia(a(3),b)); +insert into t value +('测试',222), +('测试Abc',324), +('测试 ',543), +('你好',111), +('aABBccdd',890), +('A',456), +('Aa',456), +('aab',456), +('aabB',456), +('',234), +(' ',11111), +(' ',66666), +(' 语言',55555), +(' 语 言',3579), +('测测试 ',2468), +('测测试 ',99999), +(NULL,10); +explain select * from t use index (ia) where a > 'aabb' order by a,_tidb_rowid; +select * from t use index (ia) where a > 'aabb' order by a,_tidb_rowid; +explain select * from t use index (ia) where a > 'aab' order by a,_tidb_rowid; +select * from t use index (ia) where a > 'aab' order by a,_tidb_rowid; +explain select * from t use index (ia) where a > 'aa' order by a,_tidb_rowid; +select * from t use index (ia) where a > 'aa' order by a,_tidb_rowid; +explain select * from t use index (ia) where a < 'aabb' order by a,_tidb_rowid; +select * from t use index (ia) where a < 'aabb' order by a,_tidb_rowid; +explain select * from t use index (ia) where a < 'aab' order by a,_tidb_rowid; +select * from t use index (ia) where a < 'aab' order by a,_tidb_rowid; +explain select * from t use index (ia) where a < 'aa' order by a,_tidb_rowid; +select * from t use index (ia) where a < 'aa' order by a,_tidb_rowid; +explain select * from t use index (ia) where a != 'aa' order by a,_tidb_rowid; +select * from t use index (ia) where a != 'aa' order by a,_tidb_rowid; +explain select * from t use index (ia) where a != 'aaBbc' order by a,_tidb_rowid; +select * from t use index (ia) where a != 'aaBbc' order by a,_tidb_rowid; +explain select * from t use index (ia) where a like '测试abc' order by a,_tidb_rowid; +select * from t use index (ia) where a like '测试abc' order by a,_tidb_rowid; +explain select * from t use index (ia) where a = '测试abc' order by a,_tidb_rowid; +select * from t use index (ia) where a = '测试abc' order by a,_tidb_rowid; +explain select * from t use index (ia) where a like 'aa' order by a,_tidb_rowid; +select * from t use index (ia) where a like 'aa' order by a,_tidb_rowid; +explain select * from t use index (ia) where a = 'aa' order by a,_tidb_rowid; +select * from t use index (ia) where a = 'aa' order by a,_tidb_rowid; +explain select * from t use index (ia) where a like '测测试 ' order by a,_tidb_rowid; +select * from t use index (ia) where a like '测测试 ' order by a,_tidb_rowid; +explain select * from t use index (ia) where a = '测测试 ' order by a,_tidb_rowid; +select * from t use index (ia) where a = '测测试 ' order by a,_tidb_rowid; +explain select * from t use index (ia) where a like ' 语 言' order by a,_tidb_rowid; +select * from t use index (ia) where a like ' 语 言' order by a,_tidb_rowid; +explain select * from t use index (ia) where a = ' 语 言' order by a,_tidb_rowid; +select * from t use index (ia) where a = ' 语 言' order by a,_tidb_rowid; +explain select * from t use index (ia) where a like '测试%' order by a,_tidb_rowid; +select * from t use index (ia) where a like '测试%' order by a,_tidb_rowid; +explain select * from t use index (ia) where a like '测_' order by a,_tidb_rowid; +select * from t use index (ia) where a like '测_' order by a,_tidb_rowid; +explain select * from t use index (ia) where a like '测测试 %' order by a,_tidb_rowid; +select * from t use index (ia) where a like '测测试 %' order by a,_tidb_rowid; +explain select * from t use index (ia) where a like '测试a__' order by a,_tidb_rowid; +select * from t use index (ia) where a like '测试a__' order by a,_tidb_rowid; +explain select * from t use index (ia) where a like '测试 __' order by a,_tidb_rowid; +select * from t use index (ia) where a like '测试 __' order by a,_tidb_rowid; +explain select * from t use index (ia) where a like ' _' order by a,_tidb_rowid; +select * from t use index (ia) where a like ' _' order by a,_tidb_rowid; +explain select * from t use index (ia) where a like ' %' order by a,_tidb_rowid; +select * from t use index (ia) where a like ' %' order by a,_tidb_rowid; +explain select * from t use index (ia) where a like ' 语言%%' order by a,_tidb_rowid; +select * from t use index (ia) where a like ' 语言%%' order by a,_tidb_rowid; +explain select * from t use index (ia) where a not in ('aabc','dd') order by a,_tidb_rowid; +select * from t use index (ia) where a not in ('aabc','dd') order by a,_tidb_rowid; +explain select * from t where a >= 'aabb' and a <= 'aabd' and b = 456 order by a,_tidb_rowid; +select * from t where a >= 'aabb' and a <= 'aabd' and b = 456 order by a,_tidb_rowid; diff --git a/tests/integrationtest/t/planner/core/rule_join_reorder.test b/tests/integrationtest/t/planner/core/rule_join_reorder.test index 0b194d572bf6c..4596484c4a041 100644 --- a/tests/integrationtest/t/planner/core/rule_join_reorder.test +++ b/tests/integrationtest/t/planner/core/rule_join_reorder.test @@ -79,3 +79,42 @@ FROM t3 tt AND tt.te_partition = o.partition_no; + +# TestJoinOrderHintWithBinding +drop table if exists t, t1, t2, t3; +create table t(a int, b int, key(a)); +create table t1(a int, b int, key(a)); +create table t2(a int, b int, key(a)); +create table t3(a int, b int, key(a)); + +select * from t1 join t2 on t1.a=t2.a join t3 on t2.b=t3.b; +select @@last_plan_from_binding; +create global binding for select * from t1 join t2 on t1.a=t2.a join t3 on t2.b=t3.b using select /*+ straight_join() */ * from t1 join t2 on t1.a=t2.a join t3 on t2.b=t3.b; +select * from t1 join t2 on t1.a=t2.a join t3 on t2.b=t3.b; +select @@last_plan_from_binding; +--replace_column 5 6 +show global bindings where original_sql like '%planner__core__rule_join_reorder%'; + +drop global binding for select * from t1 join t2 on t1.a=t2.a join t3 on t2.b=t3.b; +select * from t1 join t2 on t1.a=t2.a join t3 on t2.b=t3.b; +select @@last_plan_from_binding; +--replace_column 5 6 +show global bindings where original_sql like '%planner__core__rule_join_reorder%'; + +create global binding for select * from t1 join t2 on t1.a=t2.a join t3 on t2.b=t3.b using select /*+ leading(t3) */ * from t1 join t2 on t1.a=t2.a join t3 on t2.b=t3.b; +select * from t1 join t2 on t1.a=t2.a join t3 on t2.b=t3.b; +select @@last_plan_from_binding; +--replace_column 5 6 +show global bindings where original_sql like '%planner__core__rule_join_reorder%'; +drop global binding for select * from t1 join t2 on t1.a=t2.a join t3 on t2.b=t3.b; + +select * from t1 join t2 on t1.a=t2.a left join t3 on t2.b=t3.b; +select @@last_plan_from_binding; +--replace_column 5 6 +show global bindings where original_sql like '%planner__core__rule_join_reorder%'; + +create global binding for select * from t1 join t2 on t1.a=t2.a left join t3 on t2.b=t3.b using select /*+ leading(t2) */ * from t1 join t2 on t1.a=t2.a left join t3 on t2.b=t3.b; +select * from t1 join t2 on t1.a=t2.a left join t3 on t2.b=t3.b; +select @@last_plan_from_binding; +--replace_column 5 6 +show global bindings where original_sql like '%planner__core__rule_join_reorder%'; diff --git a/tests/integrationtest/t/planner/core/tests/prepare/issue.test b/tests/integrationtest/t/planner/core/tests/prepare/issue.test index 0056cfb8b2144..50a7448d34eb1 100644 --- a/tests/integrationtest/t/planner/core/tests/prepare/issue.test +++ b/tests/integrationtest/t/planner/core/tests/prepare/issue.test @@ -95,6 +95,7 @@ prepare stmt from "select * from t where a=10"; execute stmt; execute stmt; select @@last_plan_from_cache; +set tidb_enable_prepared_plan_cache=DEFAULT; # TestIssue42439 CREATE TABLE UK_MU16407 (COL3 timestamp NULL DEFAULT NULL, UNIQUE KEY U3(COL3)); @@ -122,6 +123,8 @@ set @a=-29408, @b=-9254, @c=-1849, @d=-2346; execute stmt using @a,@b,@c,@d; set @a=126, @b=126, @c=-125, @d=707; execute stmt using @a,@b,@c,@d; +set tidb_enable_prepared_plan_cache=DEFAULT; + # TestIssue28867 set tidb_enable_prepared_plan_cache=1; @@ -148,6 +151,8 @@ set @a=1; execute stmt using @a; execute stmt using @a; select @@last_plan_from_cache; +set tidb_enable_prepared_plan_cache=DEFAULT; + # TestIssue29565 set tidb_enable_prepared_plan_cache=1; @@ -163,6 +168,8 @@ select @@last_plan_from_cache; set @a=7309027171262036496, @b=-9798213896406520625; execute stmt using @a,@b; select @@last_plan_from_cache; +set tidb_enable_prepared_plan_cache=DEFAULT; + # TestIssue31730 set tidb_enable_prepared_plan_cache=1; @@ -172,6 +179,8 @@ insert into PK_S_MULTI_37 values(-9999999999999999999999999999999999999999999999 prepare stmt from 'SELECT SUM(COL1+?), col2 FROM PK_S_MULTI_37 GROUP BY col2'; set @a=1; execute stmt using @a; +set tidb_enable_prepared_plan_cache=DEFAULT; + # TestIssue28828 set tidb_enable_prepared_plan_cache=1; @@ -216,6 +225,9 @@ select @@last_plan_from_cache; prepare stmt from 'select/*+ hash_agg() */ count(distinct col1) from PK_TCOLLATION10197 where col1 > ?;'; execute stmt using @b; select/*+ hash_agg() */ count(distinct col1) from PK_TCOLLATION10197 where col1 > '龺'; +set tidb_enable_prepared_plan_cache=DEFAULT; +set tidb_enable_clustered_index=DEFAULT; + # TestIssue29993 set tidb_enable_prepared_plan_cache=1; @@ -265,6 +277,9 @@ select @@last_plan_from_cache; execute stmt using @z; select @@last_plan_from_cache; execute stmt using @z; +set tidb_enable_prepared_plan_cache=DEFAULT; +set tidb_enable_clustered_index=DEFAULT; + # TestIssue30100 set tidb_enable_prepared_plan_cache=1; @@ -280,6 +295,8 @@ set @a=0; execute stmt using @a; execute stmt using @a; select @@last_plan_from_cache; +set tidb_enable_prepared_plan_cache=DEFAULT; + # TestIssue37901 drop table if exists t4; @@ -289,3 +306,123 @@ set @t='2022-01-01 00:00:00.000000'; execute st1 using @t; select count(*) from t4; + +# TestIssueEnablePreparedPlanCache2 +set tidb_enable_prepared_plan_cache=1; + +## Issue18066 +drop table if exists t; +create table t(a int); +prepare stmt from 'select * from t'; +execute stmt; +select EXEC_COUNT,plan_cache_hits, plan_in_cache from information_schema.statements_summary where digest_text='select * from `t`' and TABLE_NAMES = 'planner__core__tests__prepare__issue.t'; +execute stmt; +select EXEC_COUNT,plan_cache_hits, plan_in_cache from information_schema.statements_summary where digest_text='select * from `t`' and TABLE_NAMES = 'planner__core__tests__prepare__issue.t'; +prepare stmt from 'select * from t'; +execute stmt; +select @@last_plan_from_cache; +select EXEC_COUNT, plan_cache_hits, plan_in_cache from information_schema.statements_summary where digest_text='select * from `t`' and TABLE_NAMES = 'planner__core__tests__prepare__issue.t'; + +## TestIssue26873 +drop table if exists t; +create table t(a int primary key, b int, c int); +prepare stmt from 'select * from t where a = 2 or a = ?'; +set @p = 3; +execute stmt using @p; +select @@last_plan_from_cache; +execute stmt using @p; +select @@last_plan_from_cache; + +## TestIssue29511 +drop table if exists t; +CREATE TABLE `t` (`COL1` bigint(20) DEFAULT NULL COMMENT 'WITH DEFAULT', UNIQUE KEY `UK_COL1` (`COL1`)); +insert into t values(-3865356285544170443),(9223372036854775807); +prepare stmt from 'select/*+ hash_agg() */ max(col1) from t where col1 = ? and col1 > ?;'; +set @a=-3865356285544170443, @b=-4055949188488870713; +execute stmt using @a,@b; + +## TestIssue23671 +drop table if exists t; +create table t (a int, b int, index ab(a, b)); +insert into t values (1, 1), (2, 2); +prepare s1 from 'select * from t use index(ab) where a>=? and b>=? and b<=?'; +set @a=1, @b=1, @c=1; +execute s1 using @a, @b, @c; +set @a=1, @b=1, @c=10; +execute s1 using @a, @b, @c; +select @@last_plan_from_cache; + +## TestIssue28920 +drop table if exists UK_GCOL_VIRTUAL_18928; +CREATE TABLE UK_GCOL_VIRTUAL_18928 ( + COL102 bigint(20) DEFAULT NULL, + COL103 bigint(20) DEFAULT NULL, + COL1 bigint(20) GENERATED ALWAYS AS (COL102 & 10) VIRTUAL, + COL2 varchar(20) DEFAULT NULL, + COL4 datetime DEFAULT NULL, + COL3 bigint(20) DEFAULT NULL, + COL5 float DEFAULT NULL, + UNIQUE KEY UK_COL1 (COL1)); +insert into UK_GCOL_VIRTUAL_18928(col102,col2) values("-5175976006730879891", "屘厒镇览錻碛斵大擔觏譨頙硺箄魨搝珄鋧扭趖"); +prepare stmt from 'SELECT * FROM UK_GCOL_VIRTUAL_18928 WHERE col1 < ? AND col2 != ?'; +set @a=10, @b="aa"; +execute stmt using @a, @b; + +## Issue29296 +drop table if exists UK_MU14722; +CREATE TABLE UK_MU14722 ( + COL1 tinytext DEFAULT NULL, + COL2 tinyint(16) DEFAULT NULL, + COL3 datetime DEFAULT NULL, + COL4 int(11) DEFAULT NULL, + UNIQUE KEY U_M_COL (COL1(10)), + UNIQUE KEY U_M_COL2 (COL2), + UNIQUE KEY U_M_COL3 (COL3)); +insert into UK_MU14722 values("輮睅麤敜溺她晁瀪襄頮鹛涓誗钷廔筪惌嶙鎢塴", -121, "3383-02-19 07:58:28" , -639457963), + ("偧孇鱓鼂瘠钻篝醗時鷷聽箌磇砀玸眞扦鸇祈灇", 127, "7902-03-05 08:54:04", -1094128660), + ("浀玡慃淛漉围甧鴎史嬙砊齄w章炢忲噑硓哈樘", -127, "5813-04-16 03:07:20", -333397107), + ("鑝粼啎鸼贖桖弦簼赭蠅鏪鐥蕿捐榥疗耹岜鬓槊", -117, "7753-11-24 10:14:24", 654872077); +prepare stmt from 'SELECT * FROM UK_MU14722 WHERE col2 > ? OR col2 BETWEEN ? AND ? ORDER BY COL2 + ? LIMIT 3'; +set @a=30410, @b=3937, @c=22045, @d=-4374; +execute stmt using @a,@b,@c,@d; +set @a=127, @b=127, @c=127, @d=127; +execute stmt using @a,@b,@c,@d; + +## TestIssue28246 +drop table if exists PK_AUTO_RANDOM9111; +CREATE TABLE `PK_AUTO_RANDOM9111` ( `COL1` bigint(45) NOT NULL , `COL2` varchar(20) DEFAULT NULL, `COL4` datetime DEFAULT NULL, `COL3` bigint(20) DEFAULT NULL, `COL5` float DEFAULT NULL, PRIMARY KEY (`COL1`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin; +insert into PK_AUTO_RANDOM9111(col1) values (-9223372036854775808), (9223372036854775807); +set @a=9223372036854775807, @b=1; +prepare stmt from 'select min(col1) from PK_AUTO_RANDOM9111 where col1 > ?;'; +## The plan contains the tableDual, so it will not be cached. +execute stmt using @a; +execute stmt using @a; +select @@last_plan_from_cache; +execute stmt using @b; +select @@last_plan_from_cache; +execute stmt using @a; +select @@last_plan_from_cache; + +set tidb_enable_prepared_plan_cache=DEFAULT; + +# TestIssue42739 + +use test; +drop table if exists t0; +CREATE TABLE t0 (c1 double, c2 double); +select + exists ( + select + subq_2.c0 as c8 + from + (select + ref_153.c1 as c0 + from + t0 as ref_153 + group by ref_153.c1 having 0 <> ( + select 1 + from + t0 as ref_173 + where count(ref_153.c2) = avg(ref_153.c2) + order by c1 desc limit 1)) as subq_2 + ) as c10; diff --git a/tests/integrationtest/t/planner/funcdep/only_full_group_by.test b/tests/integrationtest/t/planner/funcdep/only_full_group_by.test index bd8c7c1e6bc1f..32a1c4f86a1e0 100644 --- a/tests/integrationtest/t/planner/funcdep/only_full_group_by.test +++ b/tests/integrationtest/t/planner/funcdep/only_full_group_by.test @@ -39,11 +39,11 @@ CREATE TABLE t ( a INT, c INT GENERATED ALWAYS AS (a+2), d INT GENERATED ALWAYS SELECT t1.d FROM t as t1, t as t2 WHERE t2.d>t1.c GROUP BY t2.a; -- error 1055 SELECT (SELECT t1.c FROM t as t1 GROUP BY -3) FROM t as t2; --- error 1055 +-- error 3065 SELECT DISTINCT t1.a FROM t as t1 ORDER BY t1.d LIMIT 1; --- error 1055 +-- error 3065 SELECT DISTINCT t1.a FROM t as t1 ORDER BY t1.d LIMIT 1; --- error 1055 +-- error 3065 SELECT (SELECT DISTINCT t1.a FROM t as t1 ORDER BY t1.d LIMIT 1) FROM t as t2; drop table if exists t; CREATE TABLE t(a INT NULL, b INT NOT NULL, c INT, UNIQUE(a,b)); @@ -128,7 +128,6 @@ create table t1(a int, b int); create table t2(c int, d int); -- error 1055 select t4.d from t1 left join (t2 as t3 join t2 as t4 on t4.d=3) on t1.a=10 group by ""; --- error 1055 select t4.d from t1 join (t2 as t3 left join t2 as t4 on t4.d=3) on t1.a=10 group by ""; -- error 1055 select t4.d from t1 join (t2 as t3 left join t2 as t4 on t4.d=3 and t4.c+t3.c=2) on t1.a=10 group by ""; diff --git a/tests/integrationtest/t/privilege/privileges.test b/tests/integrationtest/t/privilege/privileges.test index 9dcb9409c319f..971f4adf0ecd4 100644 --- a/tests/integrationtest/t/privilege/privileges.test +++ b/tests/integrationtest/t/privilege/privileges.test @@ -193,20 +193,17 @@ connection default; --echo # TestCheckPointGetDBPrivilege CREATE USER 'tester'@'localhost'; -GRANT SELECT,UPDATE ON privilege__privileges.* TO 'tester'@'localhost'; +GRANT SELECT,UPDATE ON privilege__privileges2.* TO 'tester'@'localhost'; create database if not exists privilege__privileges; create table privilege__privileges.t(id int, v int, primary key(id)); insert into privilege__privileges.t(id, v) values(1, 1); connect (tester,localhost,tester,,); -connection tester; -use privilege__privileges; --error ErrTableaccessDenied select * from privilege__privileges.t where id = 1; --error ErrTableaccessDenied update privilege__privileges.t set v = 2 where id = 1; disconnect tester; -connection default; DROP USER 'tester'@'localhost'; # TestGrantLockTables @@ -237,7 +234,7 @@ GRANT ALL ON *.* TO 'hasgrant'; GRANT ALL ON mysql.* TO 'withoutgrant'; connect (hasgrant,localhost,hasgrant,,); connection hasgrant; ---error WITHOUT GRANT OPTION +--error 8121 REVOKE SELECT ON mysql.* FROM 'withoutgrant'; connection default; @@ -515,9 +512,8 @@ connection default; CREATE USER 'tableaccess'@'localhost'; CREATE TABLE fieldlistt1 (a int); connect (field_list,localhost,tableaccess,,); -connection field_list; --error ErrTableaccessDenied -desc fieldlistt1; +desc privilege__privileges.fieldlistt1; disconnect field_list; connection default; @@ -596,18 +592,18 @@ connection nobodyuser2; ALTER USER 'nobodyuser2' IDENTIFIED BY 'newpassword'; ALTER USER 'nobodyuser2' IDENTIFIED BY ''; ALTER USER 'nobodyuser3' IDENTIFIED BY ''; ---error Access denied; +--error 1227 ALTER USER 'nobodyuser4' IDENTIFIED BY 'newpassword'; ---error Access denied; +--error 1227 ALTER USER 'superuser2' IDENTIFIED BY 'newpassword'; disconnect nobodyuser2; connect (nobodyuser3,localhost,nobodyuser3,,); connection nobodyuser3; ALTER USER 'nobodyuser3' IDENTIFIED BY ''; ---error Access denied +--error 1227 ALTER USER 'nobodyuser4' IDENTIFIED BY 'newpassword'; ---error Access denied +--error 1227 ALTER USER 'superuser2' IDENTIFIED BY 'newpassword'; disconnect nobodyuser3; @@ -615,7 +611,7 @@ connect (nobodyuser5,localhost,nobodyuser5,,); connection nobodyuser5; ALTER USER 'nobodyuser2' IDENTIFIED BY ''; ALTER USER 'nobodyuser3' IDENTIFIED BY ''; ---error Access denied +--error 1227 ALTER USER 'nobodyuser4' IDENTIFIED BY 'newpassword'; disconnect nobodyuser5; @@ -638,12 +634,12 @@ CREATE USER ru6@localhost; connect (ru1,localhost,ru1,,); connection ru1; ---error Access denied +--error 1227 RENAME USER ru3 TO ru4; connection default; GRANT UPDATE ON mysql.user TO 'ru1'@'localhost'; connection ru1; ---error Access denied +--error 1227 RENAME USER ru3 TO ru4; connection default; GRANT CREATE USER ON *.* TO 'ru1'@'localhost'; @@ -652,22 +648,21 @@ RENAME USER ru3 TO ru4; RENAME USER 'ru4'@'%' TO 'ru3'@'localhost'; RENAME USER 'ru3'@'localhost' TO 'ru3'@'%'; connection default; ---error Operation RENAME USER failed +--error 1396 RENAME USER ru3 TO ru1@localhost; connection ru1; ---error Operation RENAME USER failed +--error 1396 RENAME USER ru4 TO ru5@localhost; ---error Operation RENAME USER failed +--error 1396 RENAME USER ru3 TO ru3; ---error Operation RENAME USER failed +--error 1396 RENAME USER ru3 TO ru5@localhost, ru4 TO ru7; ---error Operation RENAME USER failed +--error 1396 RENAME USER ru3 TO ru5@localhost, ru6@localhost TO ru1@localhost; ---error Operation RENAME USER failed RENAME USER 'ru3' TO 'ru3_tmp', ru6@localhost TO ru3, 'ru3_tmp' to ru6@localhost; ---error Operation RENAME USER failed +--error 1470 RENAME USER 'ru6@localhost' TO '1234567890abcdefGHIKL1234567890abcdefGHIKL@localhost'; ---error Operation RENAME USER failed +--error 1470 RENAME USER 'ru6@localhost' TO 'some_user_name@host_1234567890abcdefghij1234567890abcdefghij1234567890abcdefghij1234567890abcdefghij1234567890abcdefghij1234567890abcdefghij1234567890abcdefghij1234567890abcdefghij1234567890abcdefghij1234567890abcdefghij1234567890abcdefghij1234567890abcdefghij1234567890X'; connection default; DROP USER ru6@localhost; @@ -738,7 +733,7 @@ disconnect superuser; connect (nobodyuser,localhost,nobodyuser,,); connection nobodyuser; ---error Fail +--error 1044 SET PASSWORD for 'superuser' = 'newpassword'; disconnect nobodyuser; connection default; diff --git a/tests/integrationtest/t/session/vars.test b/tests/integrationtest/t/session/vars.test index 86f4518b00795..0f7d4fc12b760 100644 --- a/tests/integrationtest/t/session/vars.test +++ b/tests/integrationtest/t/session/vars.test @@ -35,6 +35,11 @@ set global tidb_enable_tso_follower_proxy = on; select @@tidb_enable_tso_follower_proxy; set global tidb_enable_tso_follower_proxy = off; select @@tidb_enable_tso_follower_proxy; +select @@pd_enable_follower_handle_region; +set global pd_enable_follower_handle_region = on; +select @@pd_enable_follower_handle_region; +set global pd_enable_follower_handle_region = off; +select @@pd_enable_follower_handle_region; -- error 1229 set tidb_tso_client_batch_max_wait_time = 0; set global tidb_enable_tso_follower_proxy = default; diff --git a/tests/integrationtest/t/sessionctx/setvar.test b/tests/integrationtest/t/sessionctx/setvar.test index 2b936cae58fc5..f62fc8808926a 100644 --- a/tests/integrationtest/t/sessionctx/setvar.test +++ b/tests/integrationtest/t/sessionctx/setvar.test @@ -666,6 +666,12 @@ select @@max_execution_time; select /*+ set_var(max_execution_time=100) */ @@max_execution_time; # The value is the changed value 1000, not the default value 0. select @@max_execution_time; +select @@tidb_max_chunk_size; +select /*+ set_var(tidb_max_chunk_size=32) */ @@tidb_max_chunk_size; +select @@tidb_max_chunk_size; +select @@tidb_init_chunk_size; +select /*+ set_var(tidb_init_chunk_size=3) */ @@tidb_init_chunk_size; +select @@tidb_init_chunk_size; set @@global.max_execution_time=1000; connect (conn1,localhost,root,,sessionctx__setvar); diff --git a/tests/integrationtest/t/table/index.test b/tests/integrationtest/t/table/index.test index 529a32e94a949..3d760a3a7dbf6 100644 --- a/tests/integrationtest/t/table/index.test +++ b/tests/integrationtest/t/table/index.test @@ -20,3 +20,16 @@ insert into t values (4, 3, 3); set @@tidb_txn_assertion_level=default; set @@tidb_constraint_check_in_place=default; +# TestDuplicateErrorOnPrefixIndex, Issue: #44316. +drop table if exists t; +create table t(a varchar(20), b varchar(20), unique index idx_a(a(1))); +insert into t values ('qaa', 'abc'); +-- error 1062 +insert into t values ('qbb', 'xyz'); +insert into t values ('rcc', 'xyz'); +select * from t order by a; +-- error 1062 +update t set a = 'qcc' where a = 'rcc'; +--enable_warnings; +update ignore t set a = 'qcc' where a = 'rcc'; +--disable_warnings; diff --git a/tests/readonlytest/BUILD.bazel b/tests/readonlytest/BUILD.bazel index 43be31b700440..d7f97572bfe21 100644 --- a/tests/readonlytest/BUILD.bazel +++ b/tests/readonlytest/BUILD.bazel @@ -9,6 +9,8 @@ go_test( ], flaky = True, deps = [ + "//pkg/kv", + "//pkg/testkit", "//pkg/testkit/testsetup", "@com_github_go_sql_driver_mysql//:mysql", "@com_github_stretchr_testify//require", diff --git a/tests/readonlytest/main_test.go b/tests/readonlytest/main_test.go index 3a84b229cbc5b..af11d04d8e178 100644 --- a/tests/readonlytest/main_test.go +++ b/tests/readonlytest/main_test.go @@ -25,6 +25,7 @@ func TestMain(m *testing.M) { testsetup.SetupForCommonTest() opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), diff --git a/tests/readonlytest/readonly_test.go b/tests/readonlytest/readonly_test.go index 654e2542738e5..8ae846fe1ace1 100644 --- a/tests/readonlytest/readonly_test.go +++ b/tests/readonlytest/readonly_test.go @@ -23,6 +23,8 @@ import ( "time" _ "github.com/go-sql-driver/mysql" + "github.com/pingcap/tidb/pkg/kv" + "github.com/pingcap/tidb/pkg/testkit" "github.com/stretchr/testify/require" "go.opencensus.io/stats/view" ) @@ -266,3 +268,21 @@ func TestReplicationWriter(t *testing.T) { <-timer.C done <- struct{}{} } + +func TestInternalSQL(t *testing.T) { + ctx := kv.WithInternalSourceType(context.Background(), kv.InternalTxnStats) + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + + defer func() { + tk.MustExec("set global tidb_restricted_read_only=default") + tk.MustExec("set global tidb_super_read_only=default") + }() + + tk.MustExec("set global tidb_restricted_read_only=On") + tk.MustExec("set global tidb_super_read_only=On") + + sql := "insert into mysql.stats_top_n (table_id, is_index, hist_id, value, count) values (874, 0, 1, 'a', 3)" + _, err := tk.Session().ExecuteInternal(ctx, sql) + require.NoError(t, err) +} diff --git a/tests/realtikvtest/addindextest/BUILD.bazel b/tests/realtikvtest/addindextest/BUILD.bazel index c00366a0974c8..b4a48ddfd890e 100644 --- a/tests/realtikvtest/addindextest/BUILD.bazel +++ b/tests/realtikvtest/addindextest/BUILD.bazel @@ -1,23 +1,4 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "addindextest", - srcs = [ - "common.go", - "compatibility.go", - "workload.go", - ], - importpath = "github.com/pingcap/tidb/tests/realtikvtest/addindextest", - visibility = ["//visibility:public"], - deps = [ - "//pkg/kv", - "//pkg/testkit", - "//pkg/util/logutil", - "@com_github_pingcap_failpoint//:failpoint", - "@com_github_stretchr_testify//require", - "@org_uber_go_zap//:zap", - ], -) +load("@io_bazel_rules_go//go:def.bzl", "go_test") go_test( name = "addindextest_test", @@ -30,11 +11,11 @@ go_test( "multi_schema_change_test.go", "pitr_test.go", ], - embed = [":addindextest"], deps = [ "//pkg/config", "//pkg/testkit", "//tests/realtikvtest", + "//tests/realtikvtest/addindextestutil", "@com_github_stretchr_testify//require", ], ) diff --git a/tests/realtikvtest/addindextest/add_index_test.go b/tests/realtikvtest/addindextest/add_index_test.go index 3e71d83596082..284cbeebfb7ad 100644 --- a/tests/realtikvtest/addindextest/add_index_test.go +++ b/tests/realtikvtest/addindextest/add_index_test.go @@ -20,6 +20,7 @@ import ( "github.com/pingcap/tidb/pkg/config" "github.com/pingcap/tidb/pkg/testkit" "github.com/pingcap/tidb/tests/realtikvtest" + "github.com/pingcap/tidb/tests/realtikvtest/addindextestutil" ) func init() { @@ -28,29 +29,14 @@ func init() { }) } -func initTest(t *testing.T) *suiteContext { - store := realtikvtest.CreateMockStoreAndSetup(t) - tk := testkit.NewTestKit(t, store) - tk.MustExec("drop database if exists addindex;") - tk.MustExec("create database addindex;") - tk.MustExec("use addindex;") - tk.MustExec(`set global tidb_ddl_enable_fast_reorg=on;`) - - ctx := newSuiteContext(t, tk, store) - createTable(tk) - insertRows(tk) - initWorkloadParams(ctx) - return ctx -} - func TestCreateNonUniqueIndex(t *testing.T) { var colIDs = [][]int{ {1, 4, 7, 10, 13, 16, 19, 22, 25}, {2, 5, 8, 11, 14, 17, 20, 23, 26}, {3, 6, 9, 12, 15, 18, 21, 24, 27}, } - ctx := initTest(t) - testOneColFrame(ctx, colIDs, addIndexNonUnique) + ctx := addindextestutil.InitTest(t) + addindextestutil.TestOneColFrame(ctx, colIDs, addindextestutil.AddIndexNonUnique) } func TestCreateUniqueIndex(t *testing.T) { @@ -59,18 +45,18 @@ func TestCreateUniqueIndex(t *testing.T) { {2, 9, 11, 17}, {3, 12, 25}, } - ctx := initTest(t) - testOneColFrame(ctx, colIDs, addIndexUnique) + ctx := addindextestutil.InitTest(t) + addindextestutil.TestOneColFrame(ctx, colIDs, addindextestutil.AddIndexUnique) } func TestCreatePrimaryKey(t *testing.T) { - ctx := initTest(t) - testOneIndexFrame(ctx, 0, addIndexPK) + ctx := addindextestutil.InitTest(t) + addindextestutil.TestOneIndexFrame(ctx, 0, addindextestutil.AddIndexPK) } func TestCreateGenColIndex(t *testing.T) { - ctx := initTest(t) - testOneIndexFrame(ctx, 29, addIndexGenCol) + ctx := addindextestutil.InitTest(t) + addindextestutil.TestOneIndexFrame(ctx, 29, addindextestutil.AddIndexGenCol) } func TestCreateMultiColsIndex(t *testing.T) { @@ -97,8 +83,8 @@ func TestCreateMultiColsIndex(t *testing.T) { {18, 21, 24, 27}, } } - ctx := initTest(t) - testTwoColsFrame(ctx, coliIDs, coljIDs, addIndexMultiCols) + ctx := addindextestutil.InitTest(t) + addindextestutil.TestTwoColsFrame(ctx, coliIDs, coljIDs, addindextestutil.AddIndexMultiCols) } func TestAddForeignKeyWithAutoCreateIndex(t *testing.T) { diff --git a/tests/realtikvtest/addindextest/concurrent_ddl_test.go b/tests/realtikvtest/addindextest/concurrent_ddl_test.go index 0791a19254661..975aa67194baa 100644 --- a/tests/realtikvtest/addindextest/concurrent_ddl_test.go +++ b/tests/realtikvtest/addindextest/concurrent_ddl_test.go @@ -17,26 +17,19 @@ package addindextest import ( "testing" + "github.com/pingcap/tidb/tests/realtikvtest/addindextestutil" "github.com/stretchr/testify/require" ) -func initConcurrentDDLTest(t *testing.T, colIIDs [][]int, colJIDs [][]int, tType testType) *suiteContext { - ctx := initCompCtx(t) - ctx.CompCtx.isConcurrentDDL = true - ctx.CompCtx.tType = tType - ctx.CompCtx.colIIDs = colIIDs - ctx.CompCtx.colJIDs = colJIDs - return ctx -} func TestConcurrentDDLCreateNonUniqueIndex(t *testing.T) { var colIDs = [][]int{ {1, 4, 7, 10, 13}, {14, 17, 20, 23, 26}, {3, 6, 9, 21, 24}, } - ctx := initConcurrentDDLTest(t, colIDs, nil, TestNonUnique) - ctx.CompCtx.start(ctx) - err := ctx.CompCtx.stop(ctx) + ctx := addindextestutil.InitConcurrentDDLTest(t, colIDs, nil, addindextestutil.TestNonUnique) + ctx.CompCtx.Start(ctx) + err := ctx.CompCtx.Stop(ctx) require.NoError(t, err) } @@ -46,23 +39,23 @@ func TestConcurrentDDLCreateUniqueIndex(t *testing.T) { {2, 11, 17}, {3, 19, 25}, } - ctx := initConcurrentDDLTest(t, colIDs, nil, TestUnique) - ctx.CompCtx.start(ctx) - err := ctx.CompCtx.stop(ctx) + ctx := addindextestutil.InitConcurrentDDLTest(t, colIDs, nil, addindextestutil.TestUnique) + ctx.CompCtx.Start(ctx) + err := ctx.CompCtx.Stop(ctx) require.NoError(t, err) } func TestConcurrentDDLCreatePrimaryKey(t *testing.T) { - ctx := initConcurrentDDLTest(t, nil, nil, TestPK) - ctx.CompCtx.start(ctx) - err := ctx.CompCtx.stop(ctx) + ctx := addindextestutil.InitConcurrentDDLTest(t, nil, nil, addindextestutil.TestPK) + ctx.CompCtx.Start(ctx) + err := ctx.CompCtx.Stop(ctx) require.NoError(t, err) } func TestConcurrentDDLCreateGenColIndex(t *testing.T) { - ctx := initConcurrentDDLTest(t, nil, nil, TestGenIndex) - ctx.CompCtx.start(ctx) - err := ctx.CompCtx.stop(ctx) + ctx := addindextestutil.InitConcurrentDDLTest(t, nil, nil, addindextestutil.TestGenIndex) + ctx.CompCtx.Start(ctx) + err := ctx.CompCtx.Stop(ctx) require.NoError(t, err) } @@ -77,8 +70,8 @@ func TestConcurrentDDLCreateMultiColsIndex(t *testing.T) { {23}, {19}, } - ctx := initConcurrentDDLTest(t, coliIDs, coljIDs, TestMultiCols) - ctx.CompCtx.start(ctx) - err := ctx.CompCtx.stop(ctx) + ctx := addindextestutil.InitConcurrentDDLTest(t, coliIDs, coljIDs, addindextestutil.TestMultiCols) + ctx.CompCtx.Start(ctx) + err := ctx.CompCtx.Stop(ctx) require.NoError(t, err) } diff --git a/tests/realtikvtest/addindextest/failpoints_test.go b/tests/realtikvtest/addindextest/failpoints_test.go index 98a0f8e50ff53..1b530dc7824ac 100644 --- a/tests/realtikvtest/addindextest/failpoints_test.go +++ b/tests/realtikvtest/addindextest/failpoints_test.go @@ -16,13 +16,9 @@ package addindextest import ( "testing" -) -func initTestFailpoint(t *testing.T) *suiteContext { - ctx := initTest(t) - ctx.isFailpointsTest = true - return ctx -} + "github.com/pingcap/tidb/tests/realtikvtest/addindextestutil" +) func TestFailpointsCreateNonUniqueIndex(t *testing.T) { if !*FullMode { @@ -33,8 +29,8 @@ func TestFailpointsCreateNonUniqueIndex(t *testing.T) { {2, 5, 8, 11, 14, 17, 20, 23, 26}, {3, 6, 9, 12, 15, 18, 21, 24, 27}, } - ctx := initTestFailpoint(t) - testOneColFrame(ctx, colIDs, addIndexNonUnique) + ctx := addindextestutil.InitTestFailpoint(t) + addindextestutil.TestOneColFrame(ctx, colIDs, addindextestutil.AddIndexNonUnique) } func TestFailpointsCreateUniqueIndex(t *testing.T) { @@ -46,24 +42,24 @@ func TestFailpointsCreateUniqueIndex(t *testing.T) { {2, 9, 11, 17}, {3, 12, 25}, } - ctx := initTestFailpoint(t) - testOneColFrame(ctx, colIDs, addIndexUnique) + ctx := addindextestutil.InitTestFailpoint(t) + addindextestutil.TestOneColFrame(ctx, colIDs, addindextestutil.AddIndexUnique) } func TestFailpointsCreatePrimaryKeyFailpoints(t *testing.T) { if !*FullMode { t.Skip() } - ctx := initTest(t) - testOneIndexFrame(ctx, 0, addIndexPK) + ctx := addindextestutil.InitTest(t) + addindextestutil.TestOneIndexFrame(ctx, 0, addindextestutil.AddIndexPK) } func TestFailpointsCreateGenColIndex(t *testing.T) { if !*FullMode { t.Skip() } - ctx := initTestFailpoint(t) - testOneIndexFrame(ctx, 29, addIndexGenCol) + ctx := addindextestutil.InitTestFailpoint(t) + addindextestutil.TestOneIndexFrame(ctx, 29, addindextestutil.AddIndexGenCol) } func TestFailpointsCreateMultiColsIndex(t *testing.T) { @@ -80,6 +76,6 @@ func TestFailpointsCreateMultiColsIndex(t *testing.T) { {14, 17, 20}, {18, 21, 24}, } - ctx := initTestFailpoint(t) - testTwoColsFrame(ctx, coliIDs, coljIDs, addIndexMultiCols) + ctx := addindextestutil.InitTestFailpoint(t) + addindextestutil.TestTwoColsFrame(ctx, coliIDs, coljIDs, addindextestutil.AddIndexMultiCols) } diff --git a/tests/realtikvtest/addindextest/multi_schema_change_test.go b/tests/realtikvtest/addindextest/multi_schema_change_test.go index 873ca4e173930..01ee9d8ba45fa 100644 --- a/tests/realtikvtest/addindextest/multi_schema_change_test.go +++ b/tests/realtikvtest/addindextest/multi_schema_change_test.go @@ -16,22 +16,19 @@ package addindextest import ( "testing" + + "github.com/pingcap/tidb/tests/realtikvtest/addindextestutil" ) -func initCompCtx(t *testing.T) *suiteContext { - ctx := initTest(t) - initCompCtxParams(ctx) - return ctx -} func TestMultiSchemaChangeCreateNonUniqueIndex(t *testing.T) { var colIDs = [][]int{ {1, 4, 7}, {2, 5, 8}, {3, 6, 9}, } - ctx := initCompCtx(t) - ctx.CompCtx.isMultiSchemaChange = true - testOneColFrame(ctx, colIDs, addIndexNonUnique) + ctx := addindextestutil.InitCompCtx(t) + ctx.CompCtx.IsMultiSchemaChange = true + addindextestutil.TestOneColFrame(ctx, colIDs, addindextestutil.AddIndexNonUnique) } func TestMultiSchemaChangeCreateUniqueIndex(t *testing.T) { @@ -40,21 +37,21 @@ func TestMultiSchemaChangeCreateUniqueIndex(t *testing.T) { {2, 19}, {11}, } - ctx := initCompCtx(t) - ctx.CompCtx.isMultiSchemaChange = true - testOneColFrame(ctx, colIDs, addIndexUnique) + ctx := addindextestutil.InitCompCtx(t) + ctx.CompCtx.IsMultiSchemaChange = true + addindextestutil.TestOneColFrame(ctx, colIDs, addindextestutil.AddIndexUnique) } func TestMultiSchemaChangeCreatePrimaryKey(t *testing.T) { - ctx := initCompCtx(t) - ctx.CompCtx.isMultiSchemaChange = true - testOneIndexFrame(ctx, 0, addIndexPK) + ctx := addindextestutil.InitCompCtx(t) + ctx.CompCtx.IsMultiSchemaChange = true + addindextestutil.TestOneIndexFrame(ctx, 0, addindextestutil.AddIndexPK) } func TestMultiSchemaChangeCreateGenColIndex(t *testing.T) { - ctx := initCompCtx(t) - ctx.CompCtx.isMultiSchemaChange = true - testOneIndexFrame(ctx, 29, addIndexGenCol) + ctx := addindextestutil.InitCompCtx(t) + ctx.CompCtx.IsMultiSchemaChange = true + addindextestutil.TestOneIndexFrame(ctx, 29, addindextestutil.AddIndexGenCol) } func TestMultiSchemaChangeMultiColsIndex(t *testing.T) { @@ -68,7 +65,7 @@ func TestMultiSchemaChangeMultiColsIndex(t *testing.T) { {14}, {18}, } - ctx := initCompCtx(t) - ctx.CompCtx.isMultiSchemaChange = true - testTwoColsFrame(ctx, coliIDs, coljIDs, addIndexMultiCols) + ctx := addindextestutil.InitCompCtx(t) + ctx.CompCtx.IsMultiSchemaChange = true + addindextestutil.TestTwoColsFrame(ctx, coliIDs, coljIDs, addindextestutil.AddIndexMultiCols) } diff --git a/tests/realtikvtest/addindextest/pitr_test.go b/tests/realtikvtest/addindextest/pitr_test.go index d1df50d08847a..99de2ed9842d1 100644 --- a/tests/realtikvtest/addindextest/pitr_test.go +++ b/tests/realtikvtest/addindextest/pitr_test.go @@ -14,7 +14,11 @@ package addindextest -import "testing" +import ( + "testing" + + "github.com/pingcap/tidb/tests/realtikvtest/addindextestutil" +) func TestPiTRCreateNonUniqueIndex(t *testing.T) { var colIDs = [][]int{ @@ -22,9 +26,9 @@ func TestPiTRCreateNonUniqueIndex(t *testing.T) { {2, 5, 8}, {3, 6, 9}, } - ctx := initCompCtx(t) - ctx.CompCtx.isPiTR = true - testOneColFrame(ctx, colIDs, addIndexNonUnique) + ctx := addindextestutil.InitCompCtx(t) + ctx.CompCtx.IsPiTR = true + addindextestutil.TestOneColFrame(ctx, colIDs, addindextestutil.AddIndexNonUnique) } func TestPiTRCreateUniqueIndex(t *testing.T) { @@ -33,21 +37,21 @@ func TestPiTRCreateUniqueIndex(t *testing.T) { {11}, {19}, } - ctx := initCompCtx(t) - ctx.CompCtx.isPiTR = true - testOneColFrame(ctx, colIDs, addIndexUnique) + ctx := addindextestutil.InitCompCtx(t) + ctx.CompCtx.IsPiTR = true + addindextestutil.TestOneColFrame(ctx, colIDs, addindextestutil.AddIndexUnique) } func TestPiTRCreatePrimaryKey(t *testing.T) { - ctx := initCompCtx(t) - ctx.CompCtx.isPiTR = true - testOneIndexFrame(ctx, 0, addIndexPK) + ctx := addindextestutil.InitCompCtx(t) + ctx.CompCtx.IsPiTR = true + addindextestutil.TestOneIndexFrame(ctx, 0, addindextestutil.AddIndexPK) } func TestPiTRCreateGenColIndex(t *testing.T) { - ctx := initCompCtx(t) - ctx.CompCtx.isPiTR = true - testOneIndexFrame(ctx, 29, addIndexGenCol) + ctx := addindextestutil.InitCompCtx(t) + ctx.CompCtx.IsPiTR = true + addindextestutil.TestOneIndexFrame(ctx, 29, addindextestutil.AddIndexGenCol) } func TestPiTRCreateMultiColsIndex(t *testing.T) { @@ -61,7 +65,7 @@ func TestPiTRCreateMultiColsIndex(t *testing.T) { {23}, {27}, } - ctx := initCompCtx(t) - ctx.CompCtx.isPiTR = true - testTwoColsFrame(ctx, coliIDs, coljIDs, addIndexMultiCols) + ctx := addindextestutil.InitCompCtx(t) + ctx.CompCtx.IsPiTR = true + addindextestutil.TestTwoColsFrame(ctx, coliIDs, coljIDs, addindextestutil.AddIndexMultiCols) } diff --git a/tests/realtikvtest/addindextest1/BUILD.bazel b/tests/realtikvtest/addindextest1/BUILD.bazel index 9126f15f9bca9..81338ccc87456 100644 --- a/tests/realtikvtest/addindextest1/BUILD.bazel +++ b/tests/realtikvtest/addindextest1/BUILD.bazel @@ -12,11 +12,13 @@ go_test( "//pkg/config", "//pkg/ddl", "//pkg/ddl/util/callback", - "//pkg/disttask/framework/dispatcher", "//pkg/disttask/framework/proto", + "//pkg/disttask/framework/scheduler", + "//pkg/disttask/framework/storage", "//pkg/errno", "//pkg/kv", "//pkg/parser/model", + "//pkg/sessionctx/variable", "//pkg/store/helper", "//pkg/tablecodec", "//pkg/testkit", @@ -24,5 +26,6 @@ go_test( "//tests/realtikvtest", "@com_github_pingcap_failpoint//:failpoint", "@com_github_stretchr_testify//require", + "@com_github_tikv_client_go_v2//util", ], ) diff --git a/tests/realtikvtest/addindextest1/disttask_test.go b/tests/realtikvtest/addindextest1/disttask_test.go index 54a3ee5d32e6c..e9c7582c0b667 100644 --- a/tests/realtikvtest/addindextest1/disttask_test.go +++ b/tests/realtikvtest/addindextest1/disttask_test.go @@ -15,23 +15,28 @@ package addindextest import ( + "context" + "fmt" "testing" "github.com/pingcap/failpoint" "github.com/pingcap/tidb/pkg/config" "github.com/pingcap/tidb/pkg/ddl" "github.com/pingcap/tidb/pkg/ddl/util/callback" - "github.com/pingcap/tidb/pkg/disttask/framework/dispatcher" "github.com/pingcap/tidb/pkg/disttask/framework/proto" + "github.com/pingcap/tidb/pkg/disttask/framework/scheduler" + "github.com/pingcap/tidb/pkg/disttask/framework/storage" "github.com/pingcap/tidb/pkg/errno" "github.com/pingcap/tidb/pkg/kv" "github.com/pingcap/tidb/pkg/parser/model" + "github.com/pingcap/tidb/pkg/sessionctx/variable" "github.com/pingcap/tidb/pkg/store/helper" "github.com/pingcap/tidb/pkg/tablecodec" "github.com/pingcap/tidb/pkg/testkit" "github.com/pingcap/tidb/pkg/types" "github.com/pingcap/tidb/tests/realtikvtest" "github.com/stretchr/testify/require" + "github.com/tikv/client-go/v2/util" ) func init() { @@ -41,6 +46,13 @@ func init() { } func TestAddIndexDistBasic(t *testing.T) { + // mock that we only have 1 cpu, add-index task can be scheduled as usual + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/util/cpu/mockNumCpu", `return(1)`)) + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/disttask/framework/storage/testSetLastTaskID", `return(true)`)) + t.Cleanup(func() { + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/util/cpu/mockNumCpu")) + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/disttask/framework/storage/testSetLastTaskID")) + }) store := realtikvtest.CreateMockStoreAndSetup(t) if store.Name() != "TiKV" { t.Skip("TiKV store only") @@ -52,6 +64,9 @@ func TestAddIndexDistBasic(t *testing.T) { tk.MustExec("use test;") tk.MustExec(`set global tidb_enable_dist_task=1;`) + bak := variable.GetDDLReorgWorkerCounter() + tk.MustExec("set global tidb_ddl_reorg_worker_cnt = 111") + require.Equal(t, int32(111), variable.GetDDLReorgWorkerCounter()) tk.MustExec("create table t(a bigint auto_random primary key) partition by hash(a) partitions 20;") tk.MustExec("insert into t values (), (), (), (), (), ()") tk.MustExec("insert into t values (), (), (), (), (), ()") @@ -61,6 +76,15 @@ func TestAddIndexDistBasic(t *testing.T) { tk.MustExec("split table t between (3) and (8646911284551352360) regions 50;") tk.MustExec("alter table t add index idx(a);") tk.MustExec("admin check index t idx;") + taskMgr, err := storage.GetTaskManager() + require.NoError(t, err) + ctx := util.WithInternalSourceType(context.Background(), "dispatcher") + task, err := taskMgr.GetTaskByIDWithHistory(ctx, storage.TestLastTaskID.Load()) + require.NoError(t, err) + require.Equal(t, 1, task.Concurrency) + + tk.MustExec(fmt.Sprintf("set global tidb_ddl_reorg_worker_cnt = %d", bak)) + require.Equal(t, bak, variable.GetDDLReorgWorkerCounter()) tk.MustExec("create table t1(a bigint auto_random primary key);") tk.MustExec("insert into t1 values (), (), (), (), (), ()") @@ -71,10 +95,10 @@ func TestAddIndexDistBasic(t *testing.T) { tk.MustExec("alter table t1 add index idx(a);") tk.MustExec("admin check index t1 idx;") - require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/disttask/framework/scheduler/MockRunSubtaskContextCanceled", "1*return(true)")) + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/disttask/framework/taskexecutor/MockRunSubtaskContextCanceled", "1*return(true)")) tk.MustExec("alter table t1 add index idx1(a);") tk.MustExec("admin check index t1 idx1;") - require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/disttask/framework/scheduler/MockRunSubtaskContextCanceled")) + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/disttask/framework/taskexecutor/MockRunSubtaskContextCanceled")) require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/ddl/injectPanicForTableScan", "return()")) tk.MustExecToErr("alter table t1 add index idx2(a);") @@ -128,6 +152,7 @@ func TestAddIndexDistCancel(t *testing.T) { } func TestAddIndexDistPauseAndResume(t *testing.T) { + t.Skip("unstable") // TODO(tangenta): fix this unstable test store, dom := realtikvtest.CreateMockStoreAndDomainAndSetup(t) if store.Name() != "TiKV" { t.Skip("TiKV store only") @@ -154,7 +179,7 @@ func TestAddIndexDistPauseAndResume(t *testing.T) { <-ddl.TestSyncChan } - dispatcher.MockDMLExecutionOnPausedState = func(task *proto.Task) { + scheduler.MockDMLExecutionOnPausedState = func(task *proto.Task) { row := tk1.MustQuery("select job_id from mysql.tidb_ddl_job").Rows() require.Equal(t, 1, len(row)) jobID := row[0][0].(string) @@ -169,13 +194,13 @@ func TestAddIndexDistPauseAndResume(t *testing.T) { } require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/ddl/mockDMLExecutionAddIndexSubTaskFinish", "3*return(true)")) - require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/disttask/framework/dispatcher/mockDMLExecutionOnPausedState", "return(true)")) + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/disttask/framework/scheduler/mockDMLExecutionOnPausedState", "return(true)")) require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/ddl/syncDDLTaskPause", "return()")) tk.MustExec(`set global tidb_enable_dist_task=1;`) tk.MustExec("alter table t add index idx1(a);") tk.MustExec("admin check table t;") require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/ddl/mockDMLExecutionAddIndexSubTaskFinish")) - require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/disttask/framework/dispatcher/mockDMLExecutionOnPausedState")) + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/disttask/framework/scheduler/mockDMLExecutionOnPausedState")) // dist task succeed, job paused and resumed. var hook = &callback.TestDDLCallback{Do: dom} diff --git a/tests/realtikvtest/addindextest2/BUILD.bazel b/tests/realtikvtest/addindextest2/BUILD.bazel index 9caa91fe19679..6c60e45eac88f 100644 --- a/tests/realtikvtest/addindextest2/BUILD.bazel +++ b/tests/realtikvtest/addindextest2/BUILD.bazel @@ -13,7 +13,7 @@ go_test( "//br/pkg/storage", "//pkg/config", "//pkg/ddl/util/callback", - "//pkg/disttask/framework/dispatcher", + "//pkg/disttask/framework/scheduler", "//pkg/parser/model", "//pkg/sessionctx/variable", "//pkg/testkit", diff --git a/tests/realtikvtest/addindextest2/global_sort_test.go b/tests/realtikvtest/addindextest2/global_sort_test.go index 9c0274978df88..f75c03dbee35c 100644 --- a/tests/realtikvtest/addindextest2/global_sort_test.go +++ b/tests/realtikvtest/addindextest2/global_sort_test.go @@ -28,7 +28,7 @@ import ( "github.com/pingcap/tidb/br/pkg/storage" "github.com/pingcap/tidb/pkg/config" "github.com/pingcap/tidb/pkg/ddl/util/callback" - "github.com/pingcap/tidb/pkg/disttask/framework/dispatcher" + "github.com/pingcap/tidb/pkg/disttask/framework/scheduler" "github.com/pingcap/tidb/pkg/parser/model" "github.com/pingcap/tidb/pkg/sessionctx/variable" "github.com/pingcap/tidb/pkg/testkit" @@ -57,8 +57,7 @@ func genStorageURI(t *testing.T) (host string, port uint16, uri string) { func checkFileCleaned(t *testing.T, jobID int64, sortStorageURI string) { storeBackend, err := storage.ParseBackend(sortStorageURI, nil) require.NoError(t, err) - opts := &storage.ExternalStorageOptions{NoCredentials: true} - extStore, err := storage.New(context.Background(), storeBackend, opts) + extStore, err := storage.NewWithDefaultOpt(context.Background(), storeBackend) require.NoError(t, err) prefix := strconv.Itoa(int(jobID)) dataFiles, statFiles, err := external.GetAllFileNames(context.Background(), extStore, prefix) @@ -82,7 +81,7 @@ func TestGlobalSortBasic(t *testing.T) { store, dom := realtikvtest.CreateMockStoreAndDomainAndSetup(t) tk := testkit.NewTestKit(t, store) - require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/disttask/framework/dispatcher/WaitCleanUpFinished", "return()")) + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/disttask/framework/scheduler/WaitCleanUpFinished", "return()")) tk.MustExec("drop database if exists addindexlit;") tk.MustExec("create database addindexlit;") tk.MustExec("use addindexlit;") @@ -119,17 +118,17 @@ func TestGlobalSortBasic(t *testing.T) { tk.MustExec("alter table t add index idx(a);") dom.DDL().SetHook(origin) tk.MustExec("admin check table t;") - <-dispatcher.WaitCleanUpFinished + <-scheduler.WaitCleanUpFinished checkFileCleaned(t, jobID, cloudStorageURI) require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/ddl/forceMergeSort", "return()")) tk.MustExec("alter table t add index idx1(a);") dom.DDL().SetHook(origin) tk.MustExec("admin check table t;") - <-dispatcher.WaitCleanUpFinished + <-scheduler.WaitCleanUpFinished checkFileCleaned(t, jobID, cloudStorageURI) - require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/disttask/framework/dispatcher/WaitCleanUpFinished")) + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/disttask/framework/scheduler/WaitCleanUpFinished")) require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/ddl/forceMergeSort")) } @@ -215,7 +214,12 @@ func TestAddIndexIngestShowReorgTp(t *testing.T) { tk.MustExec("set @@global.tidb_ddl_enable_fast_reorg = 1;") tk.MustExec("create table t (a int);") + tk.MustExec("alter table t add index idx(a);") + tk.MustQuery("select * from t use index(idx);").Check(testkit.Rows()) + tk.MustExec("alter table t drop index idx;") + tk.MustExec("insert into t values (1), (2), (3);") + tk.MustExec("set @@global.tidb_enable_dist_task = 0;") tk.MustExec("alter table t add index idx(a);") rows := tk.MustQuery("admin show ddl jobs 1;").Rows() diff --git a/tests/realtikvtest/addindextestutil/BUILD.bazel b/tests/realtikvtest/addindextestutil/BUILD.bazel new file mode 100644 index 0000000000000..723b7960d262c --- /dev/null +++ b/tests/realtikvtest/addindextestutil/BUILD.bazel @@ -0,0 +1,21 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library") + +go_library( + name = "addindextestutil", + srcs = [ + "common.go", + "compatibility.go", + "workload.go", + ], + importpath = "github.com/pingcap/tidb/tests/realtikvtest/addindextestutil", + visibility = ["//visibility:public"], + deps = [ + "//pkg/kv", + "//pkg/testkit", + "//pkg/util/logutil", + "//tests/realtikvtest", + "@com_github_pingcap_failpoint//:failpoint", + "@com_github_stretchr_testify//require", + "@org_uber_go_zap//:zap", + ], +) diff --git a/tests/realtikvtest/addindextest/common.go b/tests/realtikvtest/addindextestutil/common.go similarity index 92% rename from tests/realtikvtest/addindextest/common.go rename to tests/realtikvtest/addindextestutil/common.go index d91ff72dfdcbc..b0b5216f670fe 100644 --- a/tests/realtikvtest/addindextest/common.go +++ b/tests/realtikvtest/addindextestutil/common.go @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -package addindextest +package addindextestutil import ( "context" @@ -25,6 +25,7 @@ import ( "github.com/pingcap/tidb/pkg/kv" "github.com/pingcap/tidb/pkg/testkit" "github.com/pingcap/tidb/pkg/util/logutil" + "github.com/pingcap/tidb/tests/realtikvtest" "github.com/stretchr/testify/require" "go.uber.org/zap" ) @@ -34,7 +35,8 @@ const ( nonPartTabNum = 1 ) -type suiteContext struct { +// SuiteContext wraps test context for add index. +type SuiteContext struct { ctx context.Context cancel func() store kv.Storage @@ -52,15 +54,15 @@ type suiteContext struct { CompCtx *CompatibilityContext } -func (s *suiteContext) getTestKit() *testkit.TestKit { +func (s *SuiteContext) getTestKit() *testkit.TestKit { return s.tkPool.Get().(*testkit.TestKit) } -func (s *suiteContext) putTestKit(tk *testkit.TestKit) { +func (s *SuiteContext) putTestKit(tk *testkit.TestKit) { s.tkPool.Put(tk) } -func (s *suiteContext) done() bool { +func (s *SuiteContext) done() bool { select { case <-s.ctx.Done(): return true @@ -69,8 +71,8 @@ func (s *suiteContext) done() bool { } } -func newSuiteContext(t *testing.T, tk *testkit.TestKit, store kv.Storage) *suiteContext { - return &suiteContext{ +func newSuiteContext(t *testing.T, tk *testkit.TestKit, store kv.Storage) *SuiteContext { + return &SuiteContext{ store: store, t: t, tk: tk, @@ -81,6 +83,22 @@ func newSuiteContext(t *testing.T, tk *testkit.TestKit, store kv.Storage) *suite } } +// InitTest inits SuiteContext for test. +func InitTest(t *testing.T) *SuiteContext { + store := realtikvtest.CreateMockStoreAndSetup(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("drop database if exists addindex;") + tk.MustExec("create database addindex;") + tk.MustExec("use addindex;") + tk.MustExec(`set global tidb_ddl_enable_fast_reorg=on;`) + + ctx := newSuiteContext(t, tk, store) + createTable(tk) + insertRows(tk) + initWorkloadParams(ctx) + return ctx +} + func genTableStr(tableName string) string { tableDef := "create table addindex." + tableName + " (" + "c0 int, c1 bit(8), c2 boolean, c3 tinyint default 3, c4 smallint not null, c5 mediumint," + @@ -213,7 +231,7 @@ func insertRows(tk *testkit.TestKit) { } } -func createIndexOneCol(ctx *suiteContext, tableID int, colID int) (err error) { +func createIndexOneCol(ctx *SuiteContext, tableID int, colID int) (err error) { addIndexStr := " add index idx" var ddlStr string if ctx.isPK { @@ -238,12 +256,12 @@ func createIndexOneCol(ctx *suiteContext, tableID int, colID int) (err error) { ddlStr = "alter table addindex.t" + strconv.Itoa(tableID) + addIndexStr + strconv.Itoa(colID) + "(c0, c" + strconv.Itoa(colID) + ")" } } - if ctx.CompCtx != nil && ctx.CompCtx.isMultiSchemaChange { + if ctx.CompCtx != nil && ctx.CompCtx.IsMultiSchemaChange { colID += 60 ddlStr += " , add column c" + strconv.Itoa(colID) + " int;" } logutil.BgLogger().Info("createIndexOneCol", zap.String("category", "add index test"), zap.String("sql", ddlStr)) - if ctx.CompCtx != nil && ctx.CompCtx.isConcurrentDDL { + if ctx.CompCtx != nil && ctx.CompCtx.IsConcurrentDDL { _, err = ctx.CompCtx.executor[tableID].tk.Exec(ddlStr) } else { _, err = ctx.tk.Exec(ddlStr) @@ -258,7 +276,7 @@ func createIndexOneCol(ctx *suiteContext, tableID int, colID int) (err error) { return err } -func createIndexTwoCols(ctx *suiteContext, tableID int, indexID int, colID1 int, colID2 int) (err error) { +func createIndexTwoCols(ctx *SuiteContext, tableID int, indexID int, colID1 int, colID2 int) (err error) { var colID1Str, colID2Str string addIndexStr := " add index idx" if ctx.isPK { @@ -277,12 +295,12 @@ func createIndexTwoCols(ctx *suiteContext, tableID int, indexID int, colID1 int, colID2Str = strconv.Itoa(colID2) } ddlStr := "alter table addindex.t" + strconv.Itoa(tableID) + addIndexStr + strconv.Itoa(indexID) + "(c" + colID1Str + ", c" + colID2Str + ")" - if ctx.CompCtx != nil && ctx.CompCtx.isMultiSchemaChange { + if ctx.CompCtx != nil && ctx.CompCtx.IsMultiSchemaChange { colID1 += 60 ddlStr += " , add column c" + strconv.Itoa(colID1) + " varchar(10);" } logutil.BgLogger().Info("createIndexTwoCols", zap.String("category", "add index test"), zap.String("sql", ddlStr)) - if ctx.CompCtx != nil && ctx.CompCtx.isConcurrentDDL { + if ctx.CompCtx != nil && ctx.CompCtx.IsConcurrentDDL { _, err = ctx.CompCtx.executor[tableID].tk.Exec(ddlStr) } else { _, err = ctx.tk.Exec(ddlStr) @@ -295,10 +313,10 @@ func createIndexTwoCols(ctx *suiteContext, tableID int, indexID int, colID1 int, return err } -func checkResult(ctx *suiteContext, tableName string, indexID int, tkID int) { +func checkResult(ctx *SuiteContext, tableName string, indexID int, tkID int) { var err error adminCheckSQL := "admin check index " + tableName + " idx" + strconv.Itoa(indexID) - if ctx.CompCtx != nil && ctx.CompCtx.isConcurrentDDL { + if ctx.CompCtx != nil && ctx.CompCtx.IsConcurrentDDL { _, err = ctx.CompCtx.executor[tkID].tk.Exec(adminCheckSQL) } else { _, err = ctx.tk.Exec(adminCheckSQL) @@ -309,7 +327,7 @@ func checkResult(ctx *suiteContext, tableName string, indexID int, tkID int) { } require.NoError(ctx.t, err) - if ctx.CompCtx != nil && ctx.CompCtx.isConcurrentDDL { + if ctx.CompCtx != nil && ctx.CompCtx.IsConcurrentDDL { require.Equal(ctx.t, uint64(0), ctx.CompCtx.executor[tkID].tk.Session().AffectedRows()) _, err = ctx.CompCtx.executor[tkID].tk.Exec("alter table " + tableName + " drop index idx" + strconv.Itoa(indexID)) } else { @@ -324,10 +342,10 @@ func checkResult(ctx *suiteContext, tableName string, indexID int, tkID int) { require.NoError(ctx.t, err) } -func checkTableResult(ctx *suiteContext, tableName string, tkID int) { +func checkTableResult(ctx *SuiteContext, tableName string, tkID int) { var err error adminCheckSQL := "admin check table " + tableName - if ctx.CompCtx != nil && ctx.CompCtx.isConcurrentDDL { + if ctx.CompCtx != nil && ctx.CompCtx.IsConcurrentDDL { _, err = ctx.CompCtx.executor[tkID].tk.Exec(adminCheckSQL) } else { _, err = ctx.tk.Exec(adminCheckSQL) @@ -337,14 +355,15 @@ func checkTableResult(ctx *suiteContext, tableName string, tkID int) { zap.String("sql", adminCheckSQL), zap.Error(err)) } require.NoError(ctx.t, err) - if ctx.CompCtx != nil && ctx.CompCtx.isConcurrentDDL { + if ctx.CompCtx != nil && ctx.CompCtx.IsConcurrentDDL { require.Equal(ctx.t, uint64(0), ctx.CompCtx.executor[tkID].tk.Session().AffectedRows()) } else { require.Equal(ctx.t, uint64(0), ctx.tk.Session().AffectedRows()) } } -func testOneColFrame(ctx *suiteContext, colIDs [][]int, f func(*suiteContext, int, string, int) error) { +// TestOneColFrame test 1 col frame. +func TestOneColFrame(ctx *SuiteContext, colIDs [][]int, f func(*SuiteContext, int, string, int) error) { for tableID := 0; tableID < ctx.tableNum; tableID++ { tableName := "addindex.t" + strconv.Itoa(tableID) for _, i := range colIDs[tableID] { @@ -377,7 +396,8 @@ func testOneColFrame(ctx *suiteContext, colIDs [][]int, f func(*suiteContext, in } } -func testTwoColsFrame(ctx *suiteContext, iIDs [][]int, jIDs [][]int, f func(*suiteContext, int, string, int, int, int) error) { +// TestTwoColsFrame test 2 columns frame. +func TestTwoColsFrame(ctx *SuiteContext, iIDs [][]int, jIDs [][]int, f func(*SuiteContext, int, string, int, int, int) error) { for tableID := 0; tableID < ctx.tableNum; tableID++ { tableName := "addindex.t" + strconv.Itoa(tableID) indexID := 0 @@ -411,7 +431,8 @@ func testTwoColsFrame(ctx *suiteContext, iIDs [][]int, jIDs [][]int, f func(*sui } } -func testOneIndexFrame(ctx *suiteContext, colID int, f func(*suiteContext, int, string, int) error) { +// TestOneIndexFrame test 1 index frame. +func TestOneIndexFrame(ctx *SuiteContext, colID int, f func(*SuiteContext, int, string, int) error) { for tableID := 0; tableID < ctx.tableNum; tableID++ { tableName := "addindex.t" + strconv.Itoa(tableID) if ctx.workload != nil { @@ -442,14 +463,16 @@ func testOneIndexFrame(ctx *suiteContext, colID int, f func(*suiteContext, int, } } -func addIndexNonUnique(ctx *suiteContext, tableID int, tableName string, indexID int) (err error) { +// AddIndexNonUnique test add index with non-unique key. +func AddIndexNonUnique(ctx *SuiteContext, tableID int, tableName string, indexID int) (err error) { ctx.isPK = false ctx.isUnique = false err = createIndexOneCol(ctx, tableID, indexID) return err } -func addIndexUnique(ctx *suiteContext, tableID int, tableName string, indexID int) (err error) { +// AddIndexUnique test add index with unique key. +func AddIndexUnique(ctx *SuiteContext, tableID int, tableName string, indexID int) (err error) { ctx.isPK = false ctx.isUnique = true if indexID == 0 || indexID == 6 || indexID == 11 || indexID == 19 || tableID > 0 { @@ -472,21 +495,24 @@ func addIndexUnique(ctx *suiteContext, tableID int, tableName string, indexID in return err } -func addIndexPK(ctx *suiteContext, tableID int, tableName string, colID int) (err error) { +// AddIndexPK test add index with pk. +func AddIndexPK(ctx *SuiteContext, tableID int, tableName string, colID int) (err error) { ctx.isPK = true ctx.isUnique = false err = createIndexOneCol(ctx, tableID, 0) return err } -func addIndexGenCol(ctx *suiteContext, tableID int, tableName string, colID int) (err error) { +// AddIndexGenCol test add index with gen col. +func AddIndexGenCol(ctx *SuiteContext, tableID int, tableName string, colID int) (err error) { ctx.isPK = false ctx.isUnique = false err = createIndexOneCol(ctx, tableID, 29) return err } -func addIndexMultiCols(ctx *suiteContext, tableID int, tableName string, indexID int, colID1 int, colID2 int) (err error) { +// AddIndexMultiCols test add index with 2 columns. +func AddIndexMultiCols(ctx *SuiteContext, tableID int, tableName string, indexID int, colID1 int, colID2 int) (err error) { ctx.isPK = false ctx.isUnique = false if colID1 != colID2 { @@ -514,7 +540,7 @@ var failpoints = []failpointsPath{ {"github.com/pingcap/tidb/pkg/ddl/mockMergeSlow", "return"}, } -func useFailpoints(ctx *suiteContext, failpos int) { +func useFailpoints(ctx *SuiteContext, failpos int) { defer ctx.failSync.Done() logutil.BgLogger().Info("stack", zap.Stack("cur stack"), zap.Int("id:", failpos)) failpos %= 7 @@ -524,3 +550,10 @@ func useFailpoints(ctx *suiteContext, failpos int) { require.NoError(ctx.t, failpoint.Disable(failpoints[failpos].failpath)) logutil.BgLogger().Info("stack", zap.Stack("cur stack"), zap.Int("id:", failpos), zap.Bool("disable failpoints:", true)) } + +// InitTestFailpoint inits SuiteContext for failpoint tests. +func InitTestFailpoint(t *testing.T) *SuiteContext { + ctx := InitTest(t) + ctx.isFailpointsTest = true + return ctx +} diff --git a/tests/realtikvtest/addindextest/compatibility.go b/tests/realtikvtest/addindextestutil/compatibility.go similarity index 69% rename from tests/realtikvtest/addindextest/compatibility.go rename to tests/realtikvtest/addindextestutil/compatibility.go index 5cd0a69141c08..afb4097fc14c8 100644 --- a/tests/realtikvtest/addindextest/compatibility.go +++ b/tests/realtikvtest/addindextestutil/compatibility.go @@ -12,10 +12,11 @@ // See the License for the specific language governing permissions and // limitations under the License. -package addindextest +package addindextestutil import ( "strconv" + "testing" "github.com/pingcap/tidb/pkg/testkit" "github.com/pingcap/tidb/pkg/util/logutil" @@ -42,15 +43,22 @@ const ( // CompatibilityContext is context of compatibility test. type CompatibilityContext struct { - isMultiSchemaChange bool - isConcurrentDDL bool - isPiTR bool + IsMultiSchemaChange bool + IsConcurrentDDL bool + IsPiTR bool executor []*executor colIIDs [][]int colJIDs [][]int tType testType } +// InitCompCtx inits SuiteContext for compatibility tests. +func InitCompCtx(t *testing.T) *SuiteContext { + ctx := InitTest(t) + InitCompCtxParams(ctx) + return ctx +} + type paraDDLChan struct { err error finished bool @@ -70,14 +78,26 @@ func newExecutor(tableID int) *executor { return &er } -func initCompCtxParams(ctx *suiteContext) { +// InitCompCtxParams inits params for compatibility tests. +func InitCompCtxParams(ctx *SuiteContext) { ctx.CompCtx = &compCtx - compCtx.isConcurrentDDL = false - compCtx.isMultiSchemaChange = false - compCtx.isPiTR = false + compCtx.IsConcurrentDDL = false + compCtx.IsMultiSchemaChange = false + compCtx.IsPiTR = false +} + +// InitConcurrentDDLTest inits params for compatibility tests with concurrent ddl. +func InitConcurrentDDLTest(t *testing.T, colIIDs [][]int, colJIDs [][]int, tType testType) *SuiteContext { + ctx := InitCompCtx(t) + ctx.CompCtx.IsConcurrentDDL = true + ctx.CompCtx.tType = tType + ctx.CompCtx.colIIDs = colIIDs + ctx.CompCtx.colJIDs = colJIDs + return ctx } -func (cCtx *CompatibilityContext) start(ctx *suiteContext) { +// Start start the compatibility tests. +func (cCtx *CompatibilityContext) Start(ctx *SuiteContext) { cCtx.executor = cCtx.executor[:0] for i := 0; i < 3; i++ { er := newExecutor(i) @@ -87,7 +107,8 @@ func (cCtx *CompatibilityContext) start(ctx *suiteContext) { } } -func (cCtx *CompatibilityContext) stop(ctx *suiteContext) error { +// Stop stop the compatibility tests. +func (cCtx *CompatibilityContext) Stop(ctx *SuiteContext) error { count := 3 for i := 0; i < 3; i++ { pdChan := <-cCtx.executor[i].PDChan @@ -107,22 +128,22 @@ func (cCtx *CompatibilityContext) stop(ctx *suiteContext) error { return nil } -func (e *executor) run(ctx *suiteContext) { +func (e *executor) run(ctx *SuiteContext) { var ( err error erChan paraDDLChan ) switch ctx.CompCtx.tType { case TestNonUnique: - err = testOneColFramePara(ctx, e.id, ctx.CompCtx.colIIDs, addIndexNonUnique) + err = testOneColFramePara(ctx, e.id, ctx.CompCtx.colIIDs, AddIndexNonUnique) case TestUnique: - err = testOneColFramePara(ctx, e.id, ctx.CompCtx.colIIDs, addIndexUnique) + err = testOneColFramePara(ctx, e.id, ctx.CompCtx.colIIDs, AddIndexUnique) case TestPK: - err = testOneIndexFramePara(ctx, e.id, 0, addIndexPK) + err = testOneIndexFramePara(ctx, e.id, 0, AddIndexPK) case TestGenIndex: - err = testOneIndexFramePara(ctx, e.id, 29, addIndexGenCol) + err = testOneIndexFramePara(ctx, e.id, 29, AddIndexGenCol) case TestMultiCols: - err = testTwoColsFramePara(ctx, e.id, ctx.CompCtx.colIIDs, ctx.CompCtx.colJIDs, addIndexMultiCols) + err = testTwoColsFramePara(ctx, e.id, ctx.CompCtx.colIIDs, ctx.CompCtx.colJIDs, AddIndexMultiCols) default: } erChan.err = err @@ -130,7 +151,7 @@ func (e *executor) run(ctx *suiteContext) { e.PDChan <- &erChan } -func testOneColFramePara(ctx *suiteContext, tableID int, colIDs [][]int, f func(*suiteContext, int, string, int) error) (err error) { +func testOneColFramePara(ctx *SuiteContext, tableID int, colIDs [][]int, f func(*SuiteContext, int, string, int) error) (err error) { tableName := "addindex.t" + strconv.Itoa(tableID) for _, i := range colIDs[tableID] { err = f(ctx, tableID, tableName, i) @@ -149,7 +170,7 @@ func testOneColFramePara(ctx *suiteContext, tableID int, colIDs [][]int, f func( return err } -func testTwoColsFramePara(ctx *suiteContext, tableID int, iIDs [][]int, jIDs [][]int, f func(*suiteContext, int, string, int, int, int) error) (err error) { +func testTwoColsFramePara(ctx *SuiteContext, tableID int, iIDs [][]int, jIDs [][]int, f func(*SuiteContext, int, string, int, int, int) error) (err error) { tableName := "addindex.t" + strconv.Itoa(tableID) indexID := 0 for _, i := range iIDs[tableID] { @@ -171,7 +192,7 @@ func testTwoColsFramePara(ctx *suiteContext, tableID int, iIDs [][]int, jIDs [][ return err } -func testOneIndexFramePara(ctx *suiteContext, tableID int, colID int, f func(*suiteContext, int, string, int) error) (err error) { +func testOneIndexFramePara(ctx *SuiteContext, tableID int, colID int, f func(*SuiteContext, int, string, int) error) (err error) { tableName := "addindex.t" + strconv.Itoa(tableID) err = f(ctx, tableID, tableName, colID) if err != nil { diff --git a/tests/realtikvtest/addindextest/workload.go b/tests/realtikvtest/addindextestutil/workload.go similarity index 91% rename from tests/realtikvtest/addindextest/workload.go rename to tests/realtikvtest/addindextestutil/workload.go index d337b119a592c..24653a35fbbc1 100644 --- a/tests/realtikvtest/addindextest/workload.go +++ b/tests/realtikvtest/addindextestutil/workload.go @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -package addindextest +package addindextestutil import ( "context" @@ -33,7 +33,7 @@ var ( wCtx = workload{} ) -func initWorkloadParams(ctx *suiteContext) { +func initWorkloadParams(ctx *SuiteContext) { ctx.ctx, ctx.cancel = context.WithCancel(context.Background()) ctx.workload = &wCtx ctx.tkPool = &sync.Pool{New: func() interface{} { @@ -87,7 +87,7 @@ func newWorker(wID int, ty int) *worker { return &wr } -func (w *worker) run(ctx *suiteContext, wl *workload) { +func (w *worker) run(ctx *SuiteContext, wl *workload) { var err error tk := ctx.getTestKit() tk.MustExec("use addindex") @@ -116,7 +116,7 @@ func (w *worker) run(ctx *suiteContext, wl *workload) { w.wChan <- &wchan } -func (w *workload) start(ctx *suiteContext, colIDs ...int) { +func (w *workload) start(ctx *SuiteContext, colIDs ...int) { initWorkLoadContext(w, colIDs...) w.wr = w.wr[:0] for i := 0; i < 3; i++ { @@ -126,7 +126,7 @@ func (w *workload) start(ctx *suiteContext, colIDs ...int) { } } -func (w *workload) stop(ctx *suiteContext, tableID int) (err error) { +func (w *workload) stop(ctx *SuiteContext, tableID int) (err error) { ctx.cancel() count := 3 for i := 0; i < 3; i++ { @@ -145,7 +145,7 @@ func (w *workload) stop(ctx *suiteContext, tableID int) (err error) { return err } -func isSkippedError(err error, ctx *suiteContext) bool { +func isSkippedError(err error, ctx *SuiteContext) bool { if err == nil { return true } @@ -170,7 +170,7 @@ func insertStr(tableName string, id int, date string) string { return insStr } -func insertWorker(ctx *suiteContext, tk *testkit.TestKit) error { +func insertWorker(ctx *SuiteContext, tk *testkit.TestKit) error { insStr := insertStr(wCtx.tableName, wCtx.insertID, wCtx.date) rs, err := tk.Exec(insStr) if !isSkippedError(err, ctx) { @@ -188,7 +188,7 @@ func insertWorker(ctx *suiteContext, tk *testkit.TestKit) error { return nil } -func updateStr(ctx *suiteContext, tableName string, colID []int) (uStr string) { +func updateStr(ctx *SuiteContext, tableName string, colID []int) (uStr string) { var updateStr string id := rand.Intn(ctx.rowNum + 1) for i := 0; i < len(colID); i++ { @@ -206,7 +206,7 @@ func updateStr(ctx *suiteContext, tableName string, colID []int) (uStr string) { return updateStr } -func updateWorker(ctx *suiteContext, tk *testkit.TestKit) error { +func updateWorker(ctx *SuiteContext, tk *testkit.TestKit) error { upStr := updateStr(ctx, wCtx.tableName, wCtx.colID) rs, err := tk.Exec(upStr) @@ -228,7 +228,7 @@ func deleteStr(tableName string, id int) string { return delStr } -func deleteWorker(ctx *suiteContext, wl *workload, tk *testkit.TestKit) error { +func deleteWorker(ctx *SuiteContext, wl *workload, tk *testkit.TestKit) error { id := rand.Intn(ctx.rowNum + 1) delStr := deleteStr(wl.tableName, id) rs, err := tk.Exec(delStr) diff --git a/tests/realtikvtest/brietest/BUILD.bazel b/tests/realtikvtest/brietest/BUILD.bazel index a2cadcef3823b..f1a20bff34dff 100644 --- a/tests/realtikvtest/brietest/BUILD.bazel +++ b/tests/realtikvtest/brietest/BUILD.bazel @@ -2,16 +2,19 @@ load("@io_bazel_rules_go//go:def.bzl", "go_test") go_test( name = "brietest_test", - timeout = "moderate", + timeout = "long", srcs = [ "backup_restore_test.go", "binlog_test.go", "brie_test.go", "main_test.go", + "operator_test.go", ], flaky = True, race = "on", deps = [ + "//br/pkg/task", + "//br/pkg/task/operator", "//pkg/config", "//pkg/executor", "//pkg/parser/mysql", @@ -20,11 +23,17 @@ go_test( "//pkg/testkit", "//pkg/testkit/testsetup", "//tests/realtikvtest", + "@com_github_google_uuid//:uuid", "@com_github_pingcap_failpoint//:failpoint", + "@com_github_pingcap_kvproto//pkg/import_sstpb", + "@com_github_pingcap_kvproto//pkg/kvrpcpb", "@com_github_pingcap_log//:log", "@com_github_pingcap_tipb//go-binlog", "@com_github_stretchr_testify//require", + "@com_github_tikv_client_go_v2//oracle", + "@com_github_tikv_pd_client//:client", "@org_golang_google_grpc//:grpc", + "@org_golang_google_grpc//credentials/insecure", "@org_uber_go_goleak//:goleak", "@org_uber_go_zap//zapcore", ], diff --git a/tests/realtikvtest/brietest/backup_restore_test.go b/tests/realtikvtest/brietest/backup_restore_test.go index 370a49e4b6ea2..7b74b04f740be 100644 --- a/tests/realtikvtest/brietest/backup_restore_test.go +++ b/tests/realtikvtest/brietest/backup_restore_test.go @@ -15,8 +15,10 @@ package brietest import ( + "fmt" "os" "path" + "strings" "testing" "github.com/pingcap/tidb/pkg/config" @@ -70,3 +72,46 @@ func TestBackupAndRestore(t *testing.T) { tk.MustQuery("select count(*) from t1").Check(testkit.Rows("3")) tk.MustExec("drop database br") } + +func TestRestoreMultiTables(t *testing.T) { + tk := initTestKit(t) + tk.MustExec("create database if not exists br") + tk.MustExec("use br") + + tablesNameSet := make(map[string]struct{}) + tableNum := 1000 + for i := 0; i < tableNum; i += 1 { + tk.MustExec(fmt.Sprintf("create table table_%d (a int primary key, b json, c varchar(20))", i)) + tk.MustExec(fmt.Sprintf("insert into table_%d values (1, '{\"a\": 1, \"b\": 2}', '123')", i)) + tk.MustQuery(fmt.Sprintf("select count(*) from table_%d", i)).Check(testkit.Rows("1")) + tablesNameSet[fmt.Sprintf("table_%d", i)] = struct{}{} + } + + tmpDir := path.Join(os.TempDir(), "bk1") + require.NoError(t, os.RemoveAll(tmpDir)) + // backup database to tmp dir + tk.MustQuery("backup database br to 'local://" + tmpDir + "'") + + // remove database for recovery + tk.MustExec("drop database br") + + // restore database with backup data + tk.MustQuery("restore database * from 'local://" + tmpDir + "'") + tk.MustExec("use br") + ddlCreateTablesRows := tk.MustQuery("admin show ddl jobs where JOB_TYPE = 'create tables'").Rows() + cnt := 0 + for _, row := range ddlCreateTablesRows { + tables := row[2].(string) + require.NotEqual(t, "", tables) + for _, table := range strings.Split(tables, ",") { + _, ok := tablesNameSet[table] + require.True(t, ok) + cnt += 1 + } + } + require.Equal(t, tableNum, cnt) + for i := 0; i < tableNum; i += 1 { + tk.MustQuery(fmt.Sprintf("select count(*) from table_%d", i)).Check(testkit.Rows("1")) + } + tk.MustExec("drop database br") +} diff --git a/tests/realtikvtest/brietest/main_test.go b/tests/realtikvtest/brietest/main_test.go index 91ad1d36f2ece..c8117a7615e96 100644 --- a/tests/realtikvtest/brietest/main_test.go +++ b/tests/realtikvtest/brietest/main_test.go @@ -26,6 +26,7 @@ func TestMain(m *testing.M) { opts := []goleak.Option{ goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("google.golang.org/grpc.(*ccBalancerWrapper).watcher"), goleak.IgnoreTopFunction("google.golang.org/grpc/internal/transport.(*http2Client).keepalive"), diff --git a/tests/realtikvtest/brietest/operator_test.go b/tests/realtikvtest/brietest/operator_test.go new file mode 100644 index 0000000000000..863ae10f12ade --- /dev/null +++ b/tests/realtikvtest/brietest/operator_test.go @@ -0,0 +1,226 @@ +// Copyright 2023 PingCAP, 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. + +package brietest + +import ( + "context" + "encoding/json" + "fmt" + "net/http" + "testing" + "time" + + "github.com/google/uuid" + "github.com/pingcap/kvproto/pkg/import_sstpb" + "github.com/pingcap/kvproto/pkg/kvrpcpb" + "github.com/pingcap/tidb/br/pkg/task" + "github.com/pingcap/tidb/br/pkg/task/operator" + "github.com/stretchr/testify/require" + "github.com/tikv/client-go/v2/oracle" + pd "github.com/tikv/pd/client" + "google.golang.org/grpc" + "google.golang.org/grpc/credentials/insecure" +) + +var ( + serviceGCSafepointPrefix = "pd/api/v1/gc/safepoint" + schedulersPrefix = "pd/api/v1/schedulers" +) + +func getJSON(url string, response any) error { + resp, err := http.Get(url) + if err != nil { + return err + } + defer resp.Body.Close() + return json.NewDecoder(resp.Body).Decode(response) +} + +func pdAPI(cfg operator.PauseGcConfig, path string) string { + return fmt.Sprintf("http://%s/%s", cfg.Config.PD[0], path) +} + +type GcSafePoints struct { + SPs []struct { + ServiceID string `json:"service_id"` + ExpiredAt int64 `json:"expired_at"` + SafePoint int64 `json:"safe_point"` + } `json:"service_gc_safe_points"` +} + +func verifyGCStopped(t *require.Assertions, cfg operator.PauseGcConfig) { + var result GcSafePoints + t.NoError(getJSON(pdAPI(cfg, serviceGCSafepointPrefix), &result)) + for _, sp := range result.SPs { + if sp.ServiceID != "gc_worker" { + t.Equal(int64(cfg.SafePoint)-1, sp.SafePoint, result.SPs) + } + } +} + +func verifyGCNotStopped(t *require.Assertions, cfg operator.PauseGcConfig) { + var result GcSafePoints + t.NoError(getJSON(pdAPI(cfg, serviceGCSafepointPrefix), &result)) + for _, sp := range result.SPs { + if sp.ServiceID != "gc_worker" { + t.FailNowf("the service gc safepoint exists", "it is %#v", sp) + } + } +} + +func verifyLightningStopped(t *require.Assertions, cfg operator.PauseGcConfig) { + cx := context.Background() + pdc, err := pd.NewClient(cfg.Config.PD, pd.SecurityOption{}) + t.NoError(err) + defer pdc.Close() + t.NoError(err) + region, err := pdc.GetRegion(cx, []byte("a")) + t.NoError(err) + store, err := pdc.GetStore(cx, region.Leader.StoreId) + t.NoError(err) + conn, err := grpc.DialContext(cx, store.Address, grpc.WithTransportCredentials(insecure.NewCredentials()), grpc.WithBlock()) + t.NoError(err) + ingestCli := import_sstpb.NewImportSSTClient(conn) + wcli, err := ingestCli.Write(cx) + t.NoError(err) + u := uuid.New() + meta := &import_sstpb.SSTMeta{ + Uuid: u[:], + RegionId: region.Meta.GetId(), + RegionEpoch: region.Meta.GetRegionEpoch(), + Range: &import_sstpb.Range{ + Start: []byte("a"), + End: []byte("b"), + }, + } + rpcCx := kvrpcpb.Context{ + RegionId: region.Meta.GetId(), + RegionEpoch: region.Meta.GetRegionEpoch(), + Peer: region.Leader, + } + t.NoError(wcli.Send(&import_sstpb.WriteRequest{Chunk: &import_sstpb.WriteRequest_Meta{Meta: meta}, Context: &rpcCx})) + phy, log, err := pdc.GetTS(cx) + t.NoError(err) + wb := &import_sstpb.WriteBatch{ + CommitTs: oracle.ComposeTS(phy, log), + Pairs: []*import_sstpb.Pair{ + {Key: []byte("a1"), Value: []byte("You may wondering, why here is such a key.")}, + {Key: []byte("a2"), Value: []byte("And what if this has been really imported?")}, + {Key: []byte("a3"), Value: []byte("I dunno too. But we need to have a try.")}, + }, + } + t.NoError(wcli.Send(&import_sstpb.WriteRequest{Chunk: &import_sstpb.WriteRequest_Batch{Batch: wb}, Context: &rpcCx})) + resp, err := wcli.CloseAndRecv() + t.NoError(err) + t.Nil(resp.Error, "res = %s", resp) + realMeta := resp.Metas[0] + + res, err := ingestCli.Ingest(cx, &import_sstpb.IngestRequest{ + Context: &rpcCx, + Sst: realMeta, + }) + t.NoError(err) + t.Contains(res.GetError().GetMessage(), "Suspended", "res = %s", res) + t.NotNil(res.GetError().GetServerIsBusy(), "res = %s", res) +} + +func verifySchedulersStopped(t *require.Assertions, cfg operator.PauseGcConfig) { + var ( + schedulers []string + pausedSchedulers []string + target = pdAPI(cfg, schedulersPrefix) + ) + + t.NoError(getJSON(target, &schedulers)) + enabledSchedulers := map[string]struct{}{} + for _, sched := range schedulers { + enabledSchedulers[sched] = struct{}{} + } + t.NoError(getJSON(target+"?status=paused", &pausedSchedulers)) + for _, scheduler := range pausedSchedulers { + t.Contains(enabledSchedulers, scheduler) + } +} + +func verifySchedulerNotStopped(t *require.Assertions, cfg operator.PauseGcConfig) { + var ( + schedulers []string + pausedSchedulers []string + target = pdAPI(cfg, schedulersPrefix) + ) + + t.NoError(getJSON(target, &schedulers)) + enabledSchedulers := map[string]struct{}{} + for _, sched := range schedulers { + enabledSchedulers[sched] = struct{}{} + } + t.NoError(getJSON(target+"?status=paused", &pausedSchedulers)) + for _, scheduler := range pausedSchedulers { + t.NotContains(enabledSchedulers, scheduler) + } +} + +func TestOperator(t *testing.T) { + req := require.New(t) + rd := make(chan struct{}) + ex := make(chan struct{}) + cfg := operator.PauseGcConfig{ + Config: task.Config{ + PD: []string{"127.0.0.1:2379"}, + }, + TTL: 5 * time.Minute, + SafePoint: oracle.GoTimeToTS(time.Now()), + OnAllReady: func() { + close(rd) + }, + OnExit: func() { + close(ex) + }, + } + + verifyGCNotStopped(req, cfg) + verifySchedulerNotStopped(req, cfg) + + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + go func() { + req.NoError(operator.AdaptEnvForSnapshotBackup(ctx, &cfg)) + }() + req.Eventually(func() bool { + select { + case <-rd: + return true + default: + return false + } + }, 10*time.Second, time.Second) + + verifyGCStopped(req, cfg) + verifyLightningStopped(req, cfg) + verifySchedulersStopped(req, cfg) + cancel() + + req.Eventually(func() bool { + select { + case <-ex: + return true + default: + return false + } + }, 10*time.Second, time.Second) + + verifySchedulerNotStopped(req, cfg) + verifyGCNotStopped(req, cfg) +} diff --git a/tests/realtikvtest/flashbacktest/BUILD.bazel b/tests/realtikvtest/flashbacktest/BUILD.bazel index 1af86e76f1c04..041715f070d3a 100644 --- a/tests/realtikvtest/flashbacktest/BUILD.bazel +++ b/tests/realtikvtest/flashbacktest/BUILD.bazel @@ -18,6 +18,7 @@ go_test( "//pkg/parser/model", "//pkg/testkit", "//pkg/testkit/testsetup", + "//pkg/types", "//tests/realtikvtest", "@com_github_pingcap_failpoint//:failpoint", "@com_github_stretchr_testify//assert", diff --git a/tests/realtikvtest/flashbacktest/flashback_test.go b/tests/realtikvtest/flashbacktest/flashback_test.go index bdf75056074bf..dfe3b4bc92e22 100644 --- a/tests/realtikvtest/flashbacktest/flashback_test.go +++ b/tests/realtikvtest/flashbacktest/flashback_test.go @@ -29,6 +29,7 @@ import ( "github.com/pingcap/tidb/pkg/meta" "github.com/pingcap/tidb/pkg/parser/model" "github.com/pingcap/tidb/pkg/testkit" + "github.com/pingcap/tidb/pkg/types" "github.com/pingcap/tidb/tests/realtikvtest" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -85,7 +86,7 @@ func TestFlashback(t *testing.T) { fmt.Sprintf("return(%v)", injectSafeTS))) tk.MustExec("insert t values (4), (5), (6)") - tk.MustExec(fmt.Sprintf("flashback cluster to timestamp '%s'", oracle.GetTimeFromTS(ts))) + tk.MustExec(fmt.Sprintf("flashback cluster to timestamp '%s'", oracle.GetTimeFromTS(ts).Format(types.TimeFSPFormat))) tk.MustExec("admin check table t") require.Equal(t, tk.MustQuery("select max(a) from t").Rows()[0][0], "3") @@ -121,7 +122,7 @@ func TestPrepareFlashbackFailed(t *testing.T) { require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/ddl/mockPrepareMeetsEpochNotMatch", `return(true)`)) tk.MustExec("insert t values (4), (5), (6)") - tk.MustExec(fmt.Sprintf("flashback cluster to timestamp '%s'", oracle.GetTimeFromTS(ts))) + tk.MustExec(fmt.Sprintf("flashback cluster to timestamp '%s'", oracle.GetTimeFromTS(ts).Format(types.TimeFSPFormat))) tk.MustExec("admin check table t") require.Equal(t, tk.MustQuery("select max(a) from t").Rows()[0][0], "3") @@ -169,7 +170,7 @@ func TestFlashbackAddDropIndex(t *testing.T) { fmt.Sprintf("return(%v)", injectSafeTS))) tk.MustExec("insert t values (4), (5), (6)") - tk.MustExec(fmt.Sprintf("flashback cluster to timestamp '%s'", oracle.GetTimeFromTS(ts))) + tk.MustExec(fmt.Sprintf("flashback cluster to timestamp '%s'", oracle.GetTimeFromTS(ts).Format(types.TimeFSPFormat))) tk.MustExec("admin check table t") require.Equal(t, tk.MustQuery("select max(a) from t use index(i)").Rows()[0][0], "3") @@ -214,7 +215,7 @@ func TestFlashbackAddDropModifyColumn(t *testing.T) { fmt.Sprintf("return(%v)", injectSafeTS))) tk.MustExec("insert t values (4, 4), (5, 5), (6, 6)") - tk.MustExec(fmt.Sprintf("flashback cluster to timestamp '%s'", oracle.GetTimeFromTS(ts))) + tk.MustExec(fmt.Sprintf("flashback cluster to timestamp '%s'", oracle.GetTimeFromTS(ts).Format(types.TimeFSPFormat))) tk.MustExec("admin check table t") require.Equal(t, tk.MustQuery("show create table t").Rows()[0][1], "CREATE TABLE `t` (\n"+ @@ -265,7 +266,7 @@ func TestFlashbackBasicRenameDropCreateTable(t *testing.T) { require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/ddl/injectSafeTS", fmt.Sprintf("return(%v)", injectSafeTS))) - tk.MustExec(fmt.Sprintf("flashback cluster to timestamp '%s'", oracle.GetTimeFromTS(ts))) + tk.MustExec(fmt.Sprintf("flashback cluster to timestamp '%s'", oracle.GetTimeFromTS(ts).Format(types.TimeFSPFormat))) tk.MustExec("admin check table t") require.Equal(t, tk.MustQuery("select max(a) from t").Rows()[0][0], "3") @@ -303,7 +304,7 @@ func TestFlashbackCreateDropTableWithData(t *testing.T) { require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/ddl/injectSafeTS", fmt.Sprintf("return(%v)", injectSafeTS))) - tk.MustExec(fmt.Sprintf("flashback cluster to timestamp '%s'", oracle.GetTimeFromTS(ts))) + tk.MustExec(fmt.Sprintf("flashback cluster to timestamp '%s'", oracle.GetTimeFromTS(ts).Format(types.TimeFSPFormat))) tk.MustExec("admin check table t") require.Equal(t, tk.MustQuery("select count(a) from t").Rows()[0][0], "0") @@ -342,7 +343,7 @@ func TestFlashbackCreateDropSchema(t *testing.T) { require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/ddl/injectSafeTS", fmt.Sprintf("return(%v)", injectSafeTS))) - tk.MustExec(fmt.Sprintf("flashback cluster to timestamp '%s'", oracle.GetTimeFromTS(ts))) + tk.MustExec(fmt.Sprintf("flashback cluster to timestamp '%s'", oracle.GetTimeFromTS(ts).Format(types.TimeFSPFormat))) tk.MustExec("admin check table test.t") res := tk.MustQuery("select max(a) from test.t").Rows() @@ -381,7 +382,7 @@ func TestFlashbackAutoID(t *testing.T) { require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/ddl/injectSafeTS", fmt.Sprintf("return(%v)", injectSafeTS))) - tk.MustExec(fmt.Sprintf("flashback cluster to timestamp '%s'", oracle.GetTimeFromTS(ts))) + tk.MustExec(fmt.Sprintf("flashback cluster to timestamp '%s'", oracle.GetTimeFromTS(ts).Format(types.TimeFSPFormat))) tk.MustExec("admin check table t") res = tk.MustQuery("select max(a) from t").Rows() @@ -421,7 +422,7 @@ func TestFlashbackSequence(t *testing.T) { require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/ddl/injectSafeTS", fmt.Sprintf("return(%v)", injectSafeTS))) - tk.MustExec(fmt.Sprintf("flashback cluster to timestamp '%s'", oracle.GetTimeFromTS(ts))) + tk.MustExec(fmt.Sprintf("flashback cluster to timestamp '%s'", oracle.GetTimeFromTS(ts).Format(types.TimeFSPFormat))) // flashback schema and skip cached values res = tk.MustQuery("select nextval(seq)").Rows() @@ -465,7 +466,7 @@ func TestFlashbackPartitionTable(t *testing.T) { require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/ddl/injectSafeTS", fmt.Sprintf("return(%v)", injectSafeTS))) - tk.MustExec(fmt.Sprintf("flashback cluster to timestamp '%s'", oracle.GetTimeFromTS(ts))) + tk.MustExec(fmt.Sprintf("flashback cluster to timestamp '%s'", oracle.GetTimeFromTS(ts).Format(types.TimeFSPFormat))) tk.MustExec("admin check table t") res = tk.MustQuery("select max(a), min(a), count(*) from t").Rows() @@ -506,7 +507,7 @@ func TestFlashbackTmpTable(t *testing.T) { require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/ddl/injectSafeTS", fmt.Sprintf("return(%v)", injectSafeTS))) - tk.MustExec(fmt.Sprintf("flashback cluster to timestamp '%s'", oracle.GetTimeFromTS(ts))) + tk.MustExec(fmt.Sprintf("flashback cluster to timestamp '%s'", oracle.GetTimeFromTS(ts).Format(types.TimeFSPFormat))) res := tk.MustQuery("select max(a) from t").Rows() require.Equal(t, res[0][0], "3") @@ -522,7 +523,7 @@ func TestFlashbackTmpTable(t *testing.T) { require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/pkg/ddl/injectSafeTS", fmt.Sprintf("return(%v)", injectSafeTS))) - tk.MustExec(fmt.Sprintf("flashback cluster to timestamp '%s'", oracle.GetTimeFromTS(ts))) + tk.MustExec(fmt.Sprintf("flashback cluster to timestamp '%s'", oracle.GetTimeFromTS(ts).Format(types.TimeFSPFormat))) tk.MustGetErrCode("select * from t", errno.ErrNoSuchTable) @@ -572,7 +573,7 @@ func TestFlashbackInProcessErrorMsg(t *testing.T) { } } dom.DDL().SetHook(hook) - tk.Exec(fmt.Sprintf("flashback cluster to timestamp '%s'", oracle.GetTimeFromTS(ts))) + tk.Exec(fmt.Sprintf("flashback cluster to timestamp '%s'", oracle.GetTimeFromTS(ts).Format(types.TimeFSPFormat))) dom.DDL().SetHook(originHook) require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/pkg/ddl/injectSafeTS")) diff --git a/tests/realtikvtest/flashbacktest/main_test.go b/tests/realtikvtest/flashbacktest/main_test.go index 9223b647d4958..8bd1b422f6852 100644 --- a/tests/realtikvtest/flashbacktest/main_test.go +++ b/tests/realtikvtest/flashbacktest/main_test.go @@ -26,6 +26,7 @@ func TestMain(m *testing.M) { opts := []goleak.Option{ goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("google.golang.org/grpc.(*ccBalancerWrapper).watcher"), goleak.IgnoreTopFunction("google.golang.org/grpc/internal/transport.(*http2Client).keepalive"), diff --git a/tests/realtikvtest/importintotest/BUILD.bazel b/tests/realtikvtest/importintotest/BUILD.bazel index a9ad8e82643d0..1a33c1f009b60 100644 --- a/tests/realtikvtest/importintotest/BUILD.bazel +++ b/tests/realtikvtest/importintotest/BUILD.bazel @@ -23,10 +23,10 @@ go_test( "//br/pkg/streamhelper", "//br/pkg/utils", "//pkg/config", - "//pkg/disttask/framework/dispatcher", "//pkg/disttask/framework/proto", "//pkg/disttask/framework/scheduler", "//pkg/disttask/framework/storage", + "//pkg/disttask/framework/taskexecutor", "//pkg/disttask/importinto", "//pkg/domain/infosync", "//pkg/executor", @@ -51,7 +51,7 @@ go_test( "@com_github_stretchr_testify//require", "@com_github_stretchr_testify//suite", "@com_github_tikv_client_go_v2//util", - "@com_github_tikv_pd_client//:client", + "@com_github_tikv_pd_client//http", "@io_etcd_go_etcd_client_v3//:client", "@org_uber_go_atomic//:atomic", "@org_uber_go_mock//gomock", diff --git a/tests/realtikvtest/importintotest/import_into_test.go b/tests/realtikvtest/importintotest/import_into_test.go index 9e3b39724f1d1..aa600c3885b90 100644 --- a/tests/realtikvtest/importintotest/import_into_test.go +++ b/tests/realtikvtest/importintotest/import_into_test.go @@ -35,7 +35,8 @@ import ( "github.com/pingcap/tidb/br/pkg/mock" "github.com/pingcap/tidb/br/pkg/mock/mocklocal" "github.com/pingcap/tidb/br/pkg/utils" - "github.com/pingcap/tidb/pkg/disttask/framework/dispatcher" + "github.com/pingcap/tidb/pkg/disttask/framework/proto" + "github.com/pingcap/tidb/pkg/disttask/framework/scheduler" "github.com/pingcap/tidb/pkg/disttask/framework/storage" "github.com/pingcap/tidb/pkg/disttask/importinto" "github.com/pingcap/tidb/pkg/domain/infosync" @@ -48,7 +49,7 @@ import ( "github.com/pingcap/tidb/pkg/util/sem" "github.com/stretchr/testify/require" "github.com/tikv/client-go/v2/util" - pd "github.com/tikv/pd/client" + pdhttp "github.com/tikv/pd/client/http" clientv3 "go.etcd.io/etcd/client/v3" "go.uber.org/atomic" "go.uber.org/mock/gomock" @@ -768,29 +769,29 @@ func (s *mockGCSSuite) TestColumnsAndUserVars() { taskManager := storage.NewTaskManager(pool) ctx := context.Background() ctx = util.WithInternalSourceType(ctx, "taskManager") - subtasks, err := taskManager.GetSucceedSubtasksByStep(ctx, storage.TestLastTaskID.Load(), importinto.StepImport) + subtasks, err := taskManager.GetAllSubtasksByStepAndState(ctx, storage.TestLastTaskID.Load(), importinto.StepImport, proto.SubtaskStateSucceed) s.NoError(err) s.Len(subtasks, 1) serverInfo, err := infosync.GetServerInfo() s.NoError(err) for _, st := range subtasks { - s.Equal(net.JoinHostPort(serverInfo.IP, strconv.Itoa(int(serverInfo.Port))), st.SchedulerID) + s.Equal(net.JoinHostPort(serverInfo.IP, strconv.Itoa(int(serverInfo.Port))), st.ExecID) } } func (s *mockGCSSuite) checkTaskMetaRedacted(jobID int64) { - globalTaskManager, err := storage.GetTaskManager() + taskManager, err := storage.GetTaskManager() s.NoError(err) taskKey := importinto.TaskKey(jobID) s.NoError(err) ctx := context.Background() ctx = util.WithInternalSourceType(ctx, "taskManager") - globalTask, err2 := globalTaskManager.GetGlobalTaskByKeyWithHistory(ctx, taskKey) + task, err2 := taskManager.GetTaskByKeyWithHistory(ctx, taskKey) s.NoError(err2) - s.Regexp(`[?&]access-key=xxxxxx`, string(globalTask.Meta)) - s.Contains(string(globalTask.Meta), "secret-access-key=xxxxxx") - s.NotContains(string(globalTask.Meta), "aaaaaa") - s.NotContains(string(globalTask.Meta), "bbbbbb") + s.Regexp(`[?&]access-key=xxxxxx`, string(task.Meta)) + s.Contains(string(task.Meta), "secret-access-key=xxxxxx") + s.NotContains(string(task.Meta), "aaaaaa") + s.NotContains(string(task.Meta), "bbbbbb") } func (s *mockGCSSuite) TestImportMode() { @@ -810,7 +811,7 @@ func (s *mockGCSSuite) TestImportMode() { switcher.EXPECT().ToImportMode(gomock.Any(), gomock.Any()).DoAndReturn(toImportModeFn).Times(1) switcher.EXPECT().ToNormalMode(gomock.Any(), gomock.Any()).DoAndReturn(toNormalModeFn).Times(1) backup := importer.NewTiKVModeSwitcher - importer.NewTiKVModeSwitcher = func(tls *common.TLS, pdCli pd.Client, logger *zap.Logger) local.TiKVModeSwitcher { + importer.NewTiKVModeSwitcher = func(*common.TLS, pdhttp.Client, *zap.Logger) local.TiKVModeSwitcher { return switcher } s.T().Cleanup(func() { @@ -828,7 +829,7 @@ func (s *mockGCSSuite) TestImportMode() { // NOTE: this case only runs when current instance is TiDB owner, if you run it locally, // better start a cluster without TiDB instance. s.enableFailpoint("github.com/pingcap/tidb/pkg/parser/ast/forceRedactURL", "return(true)") - s.enableFailpoint("github.com/pingcap/tidb/pkg/disttask/framework/dispatcher/WaitCleanUpFinished", "return()") + s.enableFailpoint("github.com/pingcap/tidb/pkg/disttask/framework/scheduler/WaitCleanUpFinished", "return()") sql := fmt.Sprintf(`IMPORT INTO load_data.import_mode FROM 'gs://test-load/import_mode-*.tsv?access-key=aaaaaa&secret-access-key=bbbbbb&endpoint=%s'`, gcsEndpoint) rows := s.tk.MustQuery(sql).Rows() s.Len(rows, 1) @@ -836,7 +837,7 @@ func (s *mockGCSSuite) TestImportMode() { s.NoError(err) s.tk.MustQuery("SELECT * FROM load_data.import_mode;").Sort().Check(testkit.Rows("1 11 111")) s.Greater(intoNormalTime, intoImportTime) - <-dispatcher.WaitCleanUpFinished + <-scheduler.WaitCleanUpFinished s.checkTaskMetaRedacted(int64(jobID)) // after import step, we should enter normal mode, i.e. we only call ToImportMode once intoNormalTime, intoImportTime = time.Time{}, time.Time{} @@ -852,7 +853,7 @@ func (s *mockGCSSuite) TestImportMode() { s.Greater(intoNormalTime, intoImportTime) s.NoError(failpoint.Disable("github.com/pingcap/tidb/pkg/disttask/importinto/clearLastSwitchTime")) s.NoError(failpoint.Disable("github.com/pingcap/tidb/pkg/disttask/importinto/waitBeforePostProcess")) - <-dispatcher.WaitCleanUpFinished + <-scheduler.WaitCleanUpFinished // test disable_tikv_import_mode, should not call ToImportMode and ToNormalMode s.tk.MustExec("truncate table load_data.import_mode;") @@ -860,7 +861,7 @@ func (s *mockGCSSuite) TestImportMode() { s.tk.MustQuery(sql) s.tk.MustQuery("SELECT * FROM load_data.import_mode;").Sort().Check(testkit.Rows("1 11 111")) s.tk.MustExec("truncate table load_data.import_mode;") - <-dispatcher.WaitCleanUpFinished + <-scheduler.WaitCleanUpFinished // test with multirocksdb s.enableFailpoint("github.com/pingcap/tidb/pkg/ddl/util/IsRaftKv2", "return(true)") @@ -869,7 +870,7 @@ func (s *mockGCSSuite) TestImportMode() { s.tk.MustQuery(sql) s.tk.MustQuery("SELECT * FROM load_data.import_mode;").Sort().Check(testkit.Rows("1 11 111")) s.tk.MustExec("truncate table load_data.import_mode;") - <-dispatcher.WaitCleanUpFinished + <-scheduler.WaitCleanUpFinished s.NoError(failpoint.Disable("github.com/pingcap/tidb/pkg/ddl/util/IsRaftKv2")) @@ -885,9 +886,9 @@ func (s *mockGCSSuite) TestImportMode() { err = s.tk.QueryToErr(sql) s.Error(err) s.Greater(intoNormalTime, intoImportTime) - <-dispatcher.WaitCleanUpFinished + <-scheduler.WaitCleanUpFinished s.checkTaskMetaRedacted(importer.TestLastImportJobID.Load()) - s.NoError(failpoint.Disable("github.com/pingcap/tidb/pkg/disttask/framework/dispatcher/WaitCleanUpFinished")) + s.NoError(failpoint.Disable("github.com/pingcap/tidb/pkg/disttask/framework/scheduler/WaitCleanUpFinished")) } func (s *mockGCSSuite) TestRegisterTask() { diff --git a/tests/realtikvtest/importintotest/job_test.go b/tests/realtikvtest/importintotest/job_test.go index 493454b97d3be..5dfbec10226a2 100644 --- a/tests/realtikvtest/importintotest/job_test.go +++ b/tests/realtikvtest/importintotest/job_test.go @@ -29,8 +29,8 @@ import ( "github.com/pingcap/failpoint" "github.com/pingcap/tidb/br/pkg/utils" "github.com/pingcap/tidb/pkg/disttask/framework/proto" - "github.com/pingcap/tidb/pkg/disttask/framework/scheduler" "github.com/pingcap/tidb/pkg/disttask/framework/storage" + "github.com/pingcap/tidb/pkg/disttask/framework/taskexecutor" "github.com/pingcap/tidb/pkg/disttask/importinto" "github.com/pingcap/tidb/pkg/executor" "github.com/pingcap/tidb/pkg/executor/importer" @@ -184,7 +184,7 @@ func (s *mockGCSSuite) TestShowJob() { checkJobsMatch(rows) // show running jobs with 2 subtasks - s.enableFailpoint("github.com/pingcap/tidb/pkg/disttask/framework/scheduler/syncAfterSubtaskFinish", `return(true)`) + s.enableFailpoint("github.com/pingcap/tidb/pkg/disttask/framework/taskexecutor/syncAfterSubtaskFinish", `return(true)`) s.server.CreateObject(fakestorage.Object{ ObjectAttrs: fakestorage.ObjectAttrs{BucketName: "test-show-job", Name: "t2.csv"}, Content: []byte("3\n4"), @@ -194,7 +194,7 @@ func (s *mockGCSSuite) TestShowJob() { go func() { defer wg.Done() // wait first subtask finish - <-scheduler.TestSyncChan + <-taskexecutor.TestSyncChan jobInfo = &importer.JobInfo{ ID: importer.TestLastImportJobID.Load(), @@ -236,16 +236,16 @@ func (s *mockGCSSuite) TestShowJob() { s.True(got) // resume the scheduler - scheduler.TestSyncChan <- struct{}{} + taskexecutor.TestSyncChan <- struct{}{} // wait second subtask finish - <-scheduler.TestSyncChan + <-taskexecutor.TestSyncChan rows = tk2.MustQuery(fmt.Sprintf("show import job %d", importer.TestLastImportJobID.Load())).Rows() s.Len(rows, 1) jobInfo.Summary.ImportedRows = 4 s.compareJobInfoWithoutTime(jobInfo, rows[0]) - // resume the scheduler, need disable failpoint first, otherwise the post-process subtask will be blocked - s.NoError(failpoint.Disable("github.com/pingcap/tidb/pkg/disttask/framework/scheduler/syncAfterSubtaskFinish")) - scheduler.TestSyncChan <- struct{}{} + // resume the taskexecutor, need disable failpoint first, otherwise the post-process subtask will be blocked + s.NoError(failpoint.Disable("github.com/pingcap/tidb/pkg/disttask/framework/taskexecutor/syncAfterSubtaskFinish")) + taskexecutor.TestSyncChan <- struct{}{} }() s.tk.MustQuery(fmt.Sprintf(`import into t3 FROM 'gs://test-show-job/t*.csv?access-key=aaaaaa&secret-access-key=bbbbbb&endpoint=%s' with thread=1, __max_engine_size='1'`, gcsEndpoint)) wg.Wait() @@ -401,12 +401,12 @@ func (s *mockGCSSuite) TestCancelJob() { s.ErrorIs(err, exeerrors.ErrLoadDataJobNotFound) getTask := func(jobID int64) *proto.Task { - globalTaskManager, err := storage.GetTaskManager() + taskManager, err := storage.GetTaskManager() s.NoError(err) taskKey := importinto.TaskKey(jobID) - globalTask, err := globalTaskManager.GetGlobalTaskByKeyWithHistory(ctx, taskKey) + task, err := taskManager.GetTaskByKeyWithHistory(ctx, taskKey) s.NoError(err) - return globalTask + return task } // cancel a running job created by self @@ -420,9 +420,6 @@ func (s *mockGCSSuite) TestCancelJob() { s.NoError(err) // wait job started <-importinto.TestSyncChan - // dist framework has bug, the cancelled status might be overridden by running status, - // so we wait it turn running before cancel, see https://github.com/pingcap/tidb/issues/44443 - time.Sleep(3 * time.Second) s.tk.MustExec(fmt.Sprintf("cancel import job %d", jobID1)) rows := s.tk.MustQuery(fmt.Sprintf("show import job %d", jobID1)).Rows() s.Len(rows, 1) @@ -462,7 +459,7 @@ func (s *mockGCSSuite) TestCancelJob() { s.NoError(failpoint.Disable("github.com/pingcap/tidb/pkg/disttask/importinto/waitBeforeSortChunk")) s.NoError(failpoint.Disable("github.com/pingcap/tidb/pkg/disttask/importinto/syncAfterJobStarted")) s.enableFailpoint("github.com/pingcap/tidb/pkg/disttask/importinto/syncBeforePostProcess", "return(true)") - s.enableFailpoint("github.com/pingcap/tidb/pkg/disttask/importinto/waitCtxDone", "return(true)") + s.enableFailpoint("github.com/pingcap/tidb/pkg/executor/importer/waitCtxDone", "return(true)") result2 := s.tk.MustQuery(fmt.Sprintf(`import into t2 FROM 'gs://test_cancel_job/t.csv?endpoint=%s' with detached`, gcsEndpoint)).Rows() s.Len(result2, 1) @@ -470,9 +467,22 @@ func (s *mockGCSSuite) TestCancelJob() { s.NoError(err) // wait job reach post-process phase <-importinto.TestSyncChan - s.tk.MustExec(fmt.Sprintf("cancel import job %d", jobID2)) + wg := sync.WaitGroup{} + wg.Add(1) + go func() { + defer wg.Done() + s.tk.MustExec(fmt.Sprintf("cancel import job %d", jobID2)) + }() + s.Require().Eventually(func() bool { + task := getTask(int64(jobID2)) + return task.State != proto.TaskStatePending && task.State != proto.TaskStateRunning + }, 10*time.Second, 500*time.Millisecond) // resume the job importinto.TestSyncChan <- struct{}{} + wg.Wait() + // cancel import job will wait dist task done + task := getTask(int64(jobID2)) + s.Equal(proto.TaskStateReverted, task.State) rows2 := s.tk.MustQuery(fmt.Sprintf("show import job %d", jobID2)).Rows() s.Len(rows2, 1) jobInfo = &importer.JobInfo{ @@ -491,63 +501,75 @@ func (s *mockGCSSuite) TestCancelJob() { ErrorMessage: "cancelled by user", } s.compareJobInfoWithoutTime(jobInfo, rows2[0]) - globalTaskManager, err := storage.GetTaskManager() + taskManager, err := storage.GetTaskManager() s.NoError(err) taskKey := importinto.TaskKey(int64(jobID2)) s.NoError(err) s.Require().Eventually(func() bool { - globalTask, err2 := globalTaskManager.GetGlobalTaskByKeyWithHistory(ctx, taskKey) + task2, err2 := taskManager.GetTaskByKeyWithHistory(ctx, taskKey) s.NoError(err2) - subtasks, err2 := globalTaskManager.GetSubtasksForImportInto(ctx, globalTask.ID, importinto.StepPostProcess) + subtasks, err2 := taskManager.GetSubtasksWithHistory(ctx, task2.ID, importinto.StepPostProcess) s.NoError(err2) s.Len(subtasks, 2) // framework will generate a subtask when canceling var cancelled bool for _, st := range subtasks { - if st.State == proto.TaskStateCanceled { + if st.State == proto.SubtaskStateCanceled { cancelled = true break } } - return globalTask.State == proto.TaskStateReverted && cancelled + return task2.State == proto.TaskStateReverted && cancelled }, maxWaitTime, 1*time.Second) - // todo: enable it when https://github.com/pingcap/tidb/issues/44443 fixed - //// cancel a pending job created by test_cancel_job2 using root - //s.NoError(failpoint.Disable("github.com/pingcap/tidb/pkg/disttask/importinto/syncAfterJobStarted")) - //s.enableFailpoint("github.com/pingcap/tidb/pkg/disttask/importinto/syncBeforeJobStarted", "return(true)") - //result2 := s.tk.MustQuery(fmt.Sprintf(`import into t2 FROM 'gs://test_cancel_job/t.csv?endpoint=%s' with detached`, - // gcsEndpoint)).Rows() - //s.Len(result2, 1) - //jobID2, err := strconv.Atoi(result2[0][0].(string)) - //s.NoError(err) - //// wait job reached to the point before job started - //<-loaddata.TestSyncChan - //s.NoError(s.tk.Session().Auth(&auth.UserIdentity{Username: "root", Hostname: "localhost"}, nil, nil, nil)) - //s.tk.MustExec(fmt.Sprintf("cancel import job %d", jobID2)) - //// resume the job - //loaddata.TestSyncChan <- struct{}{} - //rows = s.tk.MustQuery(fmt.Sprintf("show import job %d", jobID2)).Rows() - //s.Len(rows, 1) - //jobInfo = &importer.JobInfo{ - // ID: int64(jobID2), - // TableSchema: "test_cancel_job", - // TableName: "t2", - // TableID: tableID2, - // CreatedBy: "test_cancel_job2@localhost", - // Parameters: importer.ImportParameters{ - // FileLocation: fmt.Sprintf(`gs://test_cancel_job/t.csv?endpoint=%s`, gcsEndpoint), - // Format: importer.DataFormatCSV, - // }, - // SourceFileSize: 3, - // Status: "cancelled", - // Step: "", - // ErrorMessage: "cancelled by user", - //} - //s.compareJobInfoWithoutTime(jobInfo, rows[0]) - //s.Require().Eventually(func() bool { - // task := getTask(int64(jobID2)) - // return task.State == proto.TaskStateReverted - //}, 10*time.Second, 500*time.Millisecond) + // cancel a pending job created by test_cancel_job2 using root + s.NoError(failpoint.Disable("github.com/pingcap/tidb/pkg/disttask/importinto/syncBeforePostProcess")) + s.NoError(failpoint.Disable("github.com/pingcap/tidb/pkg/executor/importer/waitCtxDone")) + s.enableFailpoint("github.com/pingcap/tidb/pkg/disttask/importinto/syncBeforeJobStarted", "return(true)") + s.NoError(s.tk.Session().Auth(&auth.UserIdentity{Username: "root", Hostname: "localhost"}, nil, nil, nil)) + s.tk.MustExec("truncate table t2") + tableID2 = do.MustGetTableID(s.T(), "test_cancel_job", "t2") + s.NoError(s.tk.Session().Auth(&auth.UserIdentity{Username: "test_cancel_job2", Hostname: "localhost"}, nil, nil, nil)) + result2 = s.tk.MustQuery(fmt.Sprintf(`import into t2 FROM 'gs://test_cancel_job/t.csv?endpoint=%s' with detached`, + gcsEndpoint)).Rows() + s.Len(result2, 1) + jobID2, err = strconv.Atoi(result2[0][0].(string)) + s.NoError(err) + // wait job reached to the point before job started + <-importinto.TestSyncChan + s.NoError(s.tk.Session().Auth(&auth.UserIdentity{Username: "root", Hostname: "localhost"}, nil, nil, nil)) + wg = sync.WaitGroup{} + wg.Add(1) + go func() { + defer wg.Done() + s.tk.MustExec(fmt.Sprintf("cancel import job %d", jobID2)) + }() + s.Require().Eventually(func() bool { + task := getTask(int64(jobID2)) + return task.State != proto.TaskStatePending && task.State != proto.TaskStateRunning + }, 10*time.Second, 500*time.Millisecond) + // resume the job + importinto.TestSyncChan <- struct{}{} + wg.Wait() + task = getTask(int64(jobID2)) + s.Equal(proto.TaskStateReverted, task.State) + rows = s.tk.MustQuery(fmt.Sprintf("show import job %d", jobID2)).Rows() + s.Len(rows, 1) + jobInfo = &importer.JobInfo{ + ID: int64(jobID2), + TableSchema: "test_cancel_job", + TableName: "t2", + TableID: tableID2, + CreatedBy: "test_cancel_job2@localhost", + Parameters: importer.ImportParameters{ + FileLocation: fmt.Sprintf(`gs://test_cancel_job/t.csv?endpoint=%s`, gcsEndpoint), + Format: importer.DataFormatCSV, + }, + SourceFileSize: 3, + Status: "cancelled", + Step: "importing", + ErrorMessage: "cancelled by user", + } + s.compareJobInfoWithoutTime(jobInfo, rows[0]) } func (s *mockGCSSuite) TestJobFailWhenDispatchSubtask() { @@ -622,13 +644,13 @@ func (s *mockGCSSuite) TestKillBeforeFinish() { rows := s.tk.MustQuery(fmt.Sprintf("show import job %d", jobID)).Rows() s.Len(rows, 1) s.Equal("cancelled", rows[0][5]) - globalTaskManager, err := storage.GetTaskManager() + taskManager, err := storage.GetTaskManager() s.NoError(err) taskKey := importinto.TaskKey(jobID) s.NoError(err) s.Require().Eventually(func() bool { - globalTask, err2 := globalTaskManager.GetGlobalTaskByKeyWithHistory(ctx, taskKey) + task, err2 := taskManager.GetTaskByKeyWithHistory(ctx, taskKey) s.NoError(err2) - return globalTask.State == proto.TaskStateReverted + return task.State == proto.TaskStateReverted }, maxWaitTime, 1*time.Second) } diff --git a/tests/realtikvtest/importintotest/util_test.go b/tests/realtikvtest/importintotest/util_test.go index 2afa9a2c5d41d..5e594fa62865e 100644 --- a/tests/realtikvtest/importintotest/util_test.go +++ b/tests/realtikvtest/importintotest/util_test.go @@ -47,7 +47,7 @@ var ( maxWaitTime = 30 * time.Second ) -func TestLoadRemote(t *testing.T) { +func TestImportInto(t *testing.T) { suite.Run(t, &mockGCSSuite{}) } diff --git a/tests/realtikvtest/importintotest2/BUILD.bazel b/tests/realtikvtest/importintotest2/BUILD.bazel index 02337087b1329..eeb95a299f22e 100644 --- a/tests/realtikvtest/importintotest2/BUILD.bazel +++ b/tests/realtikvtest/importintotest2/BUILD.bazel @@ -4,6 +4,7 @@ go_test( name = "importintotest2_test", timeout = "moderate", srcs = [ + "from_select_test.go", "main_test.go", "write_after_import_test.go", ], @@ -13,9 +14,11 @@ go_test( "//br/pkg/lightning/common", "//pkg/config", "//pkg/domain", + "//pkg/executor/importer", "//pkg/infoschema", "//pkg/kv", "//pkg/parser/model", + "//pkg/planner/core", "//pkg/testkit", "//tests/realtikvtest", "@com_github_fsouza_fake_gcs_server//fakestorage", diff --git a/tests/realtikvtest/importintotest2/from_select_test.go b/tests/realtikvtest/importintotest2/from_select_test.go new file mode 100644 index 0000000000000..d0d8012df2a0e --- /dev/null +++ b/tests/realtikvtest/importintotest2/from_select_test.go @@ -0,0 +1,90 @@ +// Copyright 2024 PingCAP, 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. + +package importintotest + +import ( + "fmt" + "slices" + "strings" + + "github.com/pingcap/tidb/pkg/executor/importer" + "github.com/pingcap/tidb/pkg/planner/core" + "github.com/pingcap/tidb/pkg/testkit" +) + +func (s *mockGCSSuite) TestImportFromSelectBasic() { + s.prepareAndUseDB("from_select") + s.tk.MustExec("create table src(id int, v varchar(64))") + s.tk.MustExec("create table dst(id int, v varchar(64))") + s.tk.MustExec("insert into src values(4, 'aaaaaa'), (5, 'bbbbbb'), (6, 'cccccc'), (7, 'dddddd')") + + s.ErrorIs(s.tk.ExecToErr(`import into dst FROM select id from src`), core.ErrWrongValueCountOnRow) + s.ErrorIs(s.tk.ExecToErr(`import into dst(id) FROM select * from src`), core.ErrWrongValueCountOnRow) + + s.tk.MustExec(`import into dst FROM select * from src`) + s.Equal(uint64(4), s.tk.Session().GetSessionVars().StmtCtx.AffectedRows()) + s.Contains(s.tk.Session().LastMessage(), "Records: 4,") + s.tk.MustQuery("select * from dst").Check(testkit.Rows("4 aaaaaa", "5 bbbbbb", "6 cccccc", "7 dddddd")) + + // non-empty table + s.ErrorContains(s.tk.ExecToErr(`import into dst FROM select * from src`), "target table is not empty") + + // with where + s.tk.MustExec("truncate table dst") + s.tk.MustExec(`import into dst FROM select * from src where id > 5`) + s.Equal(uint64(2), s.tk.Session().GetSessionVars().StmtCtx.AffectedRows()) + s.Contains(s.tk.Session().LastMessage(), "Records: 2,") + s.tk.MustQuery("select * from dst").Check(testkit.Rows("6 cccccc", "7 dddddd")) + + // parallel + s.enableFailpoint("github.com/pingcap/tidb/pkg/util/cpu/mockNumCpu", `return(8)`) + s.tk.MustExec("truncate table src") + s.tk.MustExec("truncate table dst") + var count = 5000 + values := make([]string, 0, count) + queryResult := make([]string, 0, count) + for i := 0; i < count; i++ { + values = append(values, fmt.Sprintf("(%d, 'abc-%d')", i, i)) + queryResult = append(queryResult, fmt.Sprintf("%d abc-%d", i, i)) + } + slices.Sort(queryResult) + s.tk.MustExec("insert into src values " + strings.Join(values, ",")) + s.tk.MustExec(`import into dst FROM select * from src with thread = 8`) + s.Equal(uint64(count), s.tk.Session().GetSessionVars().StmtCtx.AffectedRows()) + s.Contains(s.tk.Session().LastMessage(), fmt.Sprintf("Records: %d,", count)) + s.tk.MustQuery("select * from dst").Sort().Check(testkit.Rows(queryResult...)) +} + +func (s *mockGCSSuite) TestImportFromSelectColumnList() { + s.prepareAndUseDB("from_select") + s.tk.MustExec("create table src(id int, a varchar(64))") + s.tk.MustExec("create table dst(id int auto_increment primary key, a varchar(64), b int default 10, c int)") + s.tk.MustExec("insert into src values(4, 'aaaaaa'), (5, 'bbbbbb'), (6, 'cccccc'), (7, 'dddddd')") + s.tk.MustExec(`import into dst(c, a) FROM select * from src order by id`) + s.tk.MustQuery("select * from dst").Check(testkit.Rows("1 aaaaaa 10 4", "2 bbbbbb 10 5", "3 cccccc 10 6", "4 dddddd 10 7")) + + s.tk.MustExec("truncate table dst") + s.tk.MustExec("create table src2(id int, a varchar(64))") + s.tk.MustExec("insert into src2 values(4, 'four'), (5, 'five')") + s.tk.MustExec(`import into dst(c, a) FROM select y.id, y.a from src x join src2 y on x.id = y.id order by y.id`) + s.tk.MustQuery("select * from dst").Check(testkit.Rows("1 four 10 4", "2 five 10 5")) +} + +func (s *mockGCSSuite) TestWriteAfterImportFromSelect() { + s.prepareAndUseDB("from_select") + s.tk.MustExec("create table dt(id int, v varchar(64))") + s.tk.MustExec("insert into dt values(4, 'aaaaaa'), (5, 'bbbbbb'), (6, 'cccccc'), (7, 'dddddd')") + s.testWriteAfterImport(`import into t FROM select * from from_select.dt`, importer.DataSourceTypeQuery) +} diff --git a/tests/realtikvtest/importintotest2/main_test.go b/tests/realtikvtest/importintotest2/main_test.go index 645422f2a68cb..c6eb2e0c3bd40 100644 --- a/tests/realtikvtest/importintotest2/main_test.go +++ b/tests/realtikvtest/importintotest2/main_test.go @@ -45,7 +45,7 @@ var ( gcsEndpoint = fmt.Sprintf(gcsEndpointFormat, gcsHost, gcsPort) ) -func TestLoadRemote(t *testing.T) { +func TestImportInto(t *testing.T) { suite.Run(t, &mockGCSSuite{}) } diff --git a/tests/realtikvtest/importintotest2/write_after_import_test.go b/tests/realtikvtest/importintotest2/write_after_import_test.go index dd3591366c291..34605ae995a03 100644 --- a/tests/realtikvtest/importintotest2/write_after_import_test.go +++ b/tests/realtikvtest/importintotest2/write_after_import_test.go @@ -21,142 +21,243 @@ import ( "github.com/fsouza/fake-gcs-server/fakestorage" "github.com/pingcap/tidb/br/pkg/lightning/common" "github.com/pingcap/tidb/pkg/domain" + "github.com/pingcap/tidb/pkg/executor/importer" "github.com/pingcap/tidb/pkg/infoschema" "github.com/pingcap/tidb/pkg/parser/model" "github.com/pingcap/tidb/pkg/testkit" ) -func (s *mockGCSSuite) TestWriteAfterImport() { - // 2 files, each with 18 bytes, divide by column count 2, the calculated id - // range is [1, 9], [10, 18], the max id if it's used during encoding will be 11. - s.server.CreateObject(fakestorage.Object{ - ObjectAttrs: fakestorage.ObjectAttrs{BucketName: "write_after_import", Name: "1.csv"}, - Content: []byte("4,aaaaaa\n5,bbbbbb\n"), - }) - s.server.CreateObject(fakestorage.Object{ - ObjectAttrs: fakestorage.ObjectAttrs{BucketName: "write_after_import", Name: "2.csv"}, - Content: []byte("6,cccccc\n7,dddddd\n"), - }) - cases := []struct { - createTableSQL string - insertSQL string - insertedData string - nextGlobalAutoID []int64 - autoIDCache1 bool - }{ +type caseResult struct { + insertedData string + nextGlobalAutoID []int64 +} + +type writeAfterImportCase struct { + createTableSQL string + insertSQL string + caseResults map[importer.DataSourceType]caseResult + autoIDCache1 bool +} + +func (s *mockGCSSuite) testWriteAfterImport(importSQL string, sourceType importer.DataSourceType) { + cases := []writeAfterImportCase{ // with auto_increment { - createTableSQL: "CREATE TABLE t (id int AUTO_INCREMENT PRIMARY KEY CLUSTERED, v varchar(64))", - insertSQL: "insert into t(v) values(1)", - insertedData: "8 1", - nextGlobalAutoID: []int64{8}, + createTableSQL: "CREATE TABLE t (id int AUTO_INCREMENT PRIMARY KEY CLUSTERED, v varchar(64))", + insertSQL: "insert into t(v) values(1)", + caseResults: map[importer.DataSourceType]caseResult{ + importer.DataSourceTypeFile: { + insertedData: "8 1", + nextGlobalAutoID: []int64{8}, + }, + importer.DataSourceTypeQuery: { + insertedData: "8 1", + nextGlobalAutoID: []int64{8}, + }, + }, }, { - createTableSQL: "CREATE TABLE t (id int AUTO_INCREMENT PRIMARY KEY CLUSTERED, v varchar(64)) AUTO_ID_CACHE 1", - insertSQL: "insert into t(v) values(1)", - insertedData: "8 1", - nextGlobalAutoID: []int64{8, 8}, - autoIDCache1: true, + createTableSQL: "CREATE TABLE t (id int AUTO_INCREMENT PRIMARY KEY CLUSTERED, v varchar(64)) AUTO_ID_CACHE 1", + insertSQL: "insert into t(v) values(1)", + caseResults: map[importer.DataSourceType]caseResult{ + importer.DataSourceTypeFile: { + insertedData: "8 1", + nextGlobalAutoID: []int64{8, 8}, + }, + importer.DataSourceTypeQuery: { + insertedData: "8 1", + nextGlobalAutoID: []int64{8, 8}, + }, + }, + autoIDCache1: true, }, { - createTableSQL: "CREATE TABLE t (id int AUTO_INCREMENT PRIMARY KEY NONCLUSTERED, v varchar(64))", - insertSQL: "insert into t(v) values(1)", - insertedData: "12 1", - nextGlobalAutoID: []int64{12}, + createTableSQL: "CREATE TABLE t (id int AUTO_INCREMENT PRIMARY KEY NONCLUSTERED, v varchar(64))", + insertSQL: "insert into t(v) values(1)", + caseResults: map[importer.DataSourceType]caseResult{ + importer.DataSourceTypeFile: { + insertedData: "12 1", + nextGlobalAutoID: []int64{12}, + }, + importer.DataSourceTypeQuery: { + insertedData: "8 1", + nextGlobalAutoID: []int64{8}, + }, + }, }, { - createTableSQL: "CREATE TABLE t (id int AUTO_INCREMENT PRIMARY KEY NONCLUSTERED, v varchar(64)) AUTO_ID_CACHE 1", - insertSQL: "insert into t(v) values(1)", - insertedData: "12 1", - nextGlobalAutoID: []int64{12, 12}, - autoIDCache1: true, + createTableSQL: "CREATE TABLE t (id int AUTO_INCREMENT PRIMARY KEY NONCLUSTERED, v varchar(64)) AUTO_ID_CACHE 1", + insertSQL: "insert into t(v) values(1)", + caseResults: map[importer.DataSourceType]caseResult{ + importer.DataSourceTypeFile: { + insertedData: "12 1", + nextGlobalAutoID: []int64{12, 12}, + }, + importer.DataSourceTypeQuery: { + insertedData: "8 1", + nextGlobalAutoID: []int64{8, 8}, + }, + }, + autoIDCache1: true, }, // without auto_increment { createTableSQL: "CREATE TABLE t (id int PRIMARY KEY CLUSTERED, v varchar(64))", insertSQL: "insert into t values(1,1)", - insertedData: "1 1", + caseResults: map[importer.DataSourceType]caseResult{ + importer.DataSourceTypeFile: { + insertedData: "1 1", + }, + importer.DataSourceTypeQuery: { + insertedData: "1 1", + }, + }, }, { createTableSQL: "CREATE TABLE t (id int PRIMARY KEY CLUSTERED, v varchar(64)) AUTO_ID_CACHE 1", insertSQL: "insert into t values(1,1)", - insertedData: "1 1", - autoIDCache1: true, + caseResults: map[importer.DataSourceType]caseResult{ + importer.DataSourceTypeFile: { + insertedData: "1 1", + }, + importer.DataSourceTypeQuery: { + insertedData: "1 1", + }, + }, + autoIDCache1: true, }, { - createTableSQL: "CREATE TABLE t (id int, v varchar(64))", - insertSQL: "insert into t values(1,1)", - insertedData: "1 1", - nextGlobalAutoID: []int64{12}, + createTableSQL: "CREATE TABLE t (id int, v varchar(64))", + insertSQL: "insert into t values(1,1)", + caseResults: map[importer.DataSourceType]caseResult{ + importer.DataSourceTypeFile: { + insertedData: "1 1", + nextGlobalAutoID: []int64{12}, + }, + importer.DataSourceTypeQuery: { + insertedData: "1 1", + nextGlobalAutoID: []int64{5}, + }, + }, }, { - createTableSQL: "CREATE TABLE t (id int, v varchar(64)) AUTO_ID_CACHE 1", - insertSQL: "insert into t values(1,1)", - insertedData: "1 1", - nextGlobalAutoID: []int64{12}, - autoIDCache1: true, + createTableSQL: "CREATE TABLE t (id int, v varchar(64)) AUTO_ID_CACHE 1", + insertSQL: "insert into t values(1,1)", + caseResults: map[importer.DataSourceType]caseResult{ + importer.DataSourceTypeFile: { + insertedData: "1 1", + nextGlobalAutoID: []int64{12}, + }, + importer.DataSourceTypeQuery: { + insertedData: "1 1", + nextGlobalAutoID: []int64{5}, + }, + }, + autoIDCache1: true, }, { - createTableSQL: "CREATE TABLE t (id int PRIMARY KEY NONCLUSTERED, v varchar(64))", - insertSQL: "insert into t values(1,1)", - insertedData: "1 1", - nextGlobalAutoID: []int64{12}, + createTableSQL: "CREATE TABLE t (id int PRIMARY KEY NONCLUSTERED, v varchar(64))", + insertSQL: "insert into t values(1,1)", + caseResults: map[importer.DataSourceType]caseResult{ + importer.DataSourceTypeFile: { + insertedData: "1 1", + nextGlobalAutoID: []int64{12}, + }, + importer.DataSourceTypeQuery: { + insertedData: "1 1", + nextGlobalAutoID: []int64{5}, + }, + }, }, { - createTableSQL: "CREATE TABLE t (id int PRIMARY KEY NONCLUSTERED, v varchar(64)) AUTO_ID_CACHE 1", - insertSQL: "insert into t values(1,1)", - insertedData: "1 1", - nextGlobalAutoID: []int64{12}, - autoIDCache1: true, + createTableSQL: "CREATE TABLE t (id int PRIMARY KEY NONCLUSTERED, v varchar(64)) AUTO_ID_CACHE 1", + insertSQL: "insert into t values(1,1)", + caseResults: map[importer.DataSourceType]caseResult{ + importer.DataSourceTypeFile: { + insertedData: "1 1", + nextGlobalAutoID: []int64{12}, + }, + importer.DataSourceTypeQuery: { + insertedData: "1 1", + nextGlobalAutoID: []int64{5}, + }, + }, + autoIDCache1: true, }, // with auto_random { - createTableSQL: "CREATE TABLE t (id bigint PRIMARY KEY auto_random, v varchar(64))", - insertSQL: "insert into t(v) values(1)", - insertedData: "8 1", - nextGlobalAutoID: []int64{8}, - autoIDCache1: true, + createTableSQL: "CREATE TABLE t (id bigint PRIMARY KEY auto_random, v varchar(64))", + insertSQL: "insert into t(v) values(1)", + caseResults: map[importer.DataSourceType]caseResult{ + importer.DataSourceTypeFile: { + insertedData: "8 1", + nextGlobalAutoID: []int64{8}, + }, + importer.DataSourceTypeQuery: { + insertedData: "8 1", + nextGlobalAutoID: []int64{8}, + }, + }, + autoIDCache1: true, }, } allData := []string{"4 aaaaaa", "5 bbbbbb", "6 cccccc", "7 dddddd"} s.prepareAndUseDB("write_after_import") - loadDataSQL := fmt.Sprintf( - `import into t FROM 'gs://write_after_import/*.csv?endpoint=%s'`, gcsEndpoint) s.T().Cleanup(func() { s.tk.MustExec("drop table if exists t;") }) - for _, c := range cases { - fmt.Println("current case ", c.createTableSQL) - s.tk.MustExec("drop table if exists t;") - s.tk.MustExec(c.createTableSQL) - s.tk.MustQuery(loadDataSQL) - querySQL := "SELECT * FROM t;" - s.tk.MustQuery(querySQL).Check(testkit.Rows(allData...)) + for i, c := range cases { + s.Run(fmt.Sprintf("case-%d", i), func() { + fmt.Println("current case ", c.createTableSQL) + s.tk.MustExec("drop table if exists t;") + s.tk.MustExec(c.createTableSQL) + if sourceType == importer.DataSourceTypeFile { + s.tk.MustQuery(importSQL) + } else { + s.tk.MustExec(importSQL) + } + querySQL := "SELECT * FROM t;" + s.tk.MustQuery(querySQL).Check(testkit.Rows(allData...)) - is := s.tk.Session().GetDomainInfoSchema().(infoschema.InfoSchema) - dbInfo, ok := is.SchemaByName(model.NewCIStr("write_after_import")) - s.True(ok) - tableObj, err := is.TableByName(model.NewCIStr("write_after_import"), model.NewCIStr("t")) - s.NoError(err) - if common.TableHasAutoID(tableObj.Meta()) { - allocators, err := common.GetGlobalAutoIDAlloc(domain.GetDomain(s.tk.Session()), dbInfo.ID, tableObj.Meta()) + is := s.tk.Session().GetDomainInfoSchema().(infoschema.InfoSchema) + dbInfo, ok := is.SchemaByName(model.NewCIStr("write_after_import")) + s.True(ok) + tableObj, err := is.TableByName(model.NewCIStr("write_after_import"), model.NewCIStr("t")) s.NoError(err) - var nextGlobalAutoID []int64 - for _, alloc := range allocators { - id, err := alloc.NextGlobalAutoID() + if common.TableHasAutoID(tableObj.Meta()) { + allocators, err := common.GetGlobalAutoIDAlloc(domain.GetDomain(s.tk.Session()), dbInfo.ID, tableObj.Meta()) s.NoError(err) - nextGlobalAutoID = append(nextGlobalAutoID, id) + var nextGlobalAutoID []int64 + for _, alloc := range allocators { + id, err := alloc.NextGlobalAutoID() + s.NoError(err) + nextGlobalAutoID = append(nextGlobalAutoID, id) + } + s.Equal(c.caseResults[sourceType].nextGlobalAutoID, nextGlobalAutoID) } - s.Equal(c.nextGlobalAutoID, nextGlobalAutoID) - } - // when autoIDCache1=true, the id service is not started in real-tikv-test, cannot insert. - if !c.autoIDCache1 { - s.tk.MustExec(c.insertSQL) - newAllData := append(allData, c.insertedData) - slices.Sort(newAllData) - s.tk.MustQuery(querySQL).Sort().Check(testkit.Rows(newAllData...)) - } + // when autoIDCache1=true, the id service is not started in real-tikv-test, cannot insert. + if !c.autoIDCache1 { + s.tk.MustExec(c.insertSQL) + newAllData := append(allData, c.caseResults[sourceType].insertedData) + slices.Sort(newAllData) + s.tk.MustQuery(querySQL).Sort().Check(testkit.Rows(newAllData...)) + } + }) } } +func (s *mockGCSSuite) TestWriteAfterImportFromFile() { + // 2 files, each with 18 bytes, divide by column count 2, the calculated id + // range is [1, 9], [10, 18], the max id if it's used during encoding will be 11. + s.server.CreateObject(fakestorage.Object{ + ObjectAttrs: fakestorage.ObjectAttrs{BucketName: "write_after_import", Name: "1.csv"}, + Content: []byte("4,aaaaaa\n5,bbbbbb\n"), + }) + s.server.CreateObject(fakestorage.Object{ + ObjectAttrs: fakestorage.ObjectAttrs{BucketName: "write_after_import", Name: "2.csv"}, + Content: []byte("6,cccccc\n7,dddddd\n"), + }) + importSQL := fmt.Sprintf(`import into t FROM 'gs://write_after_import/*.csv?endpoint=%s'`, gcsEndpoint) + s.testWriteAfterImport(importSQL, importer.DataSourceTypeFile) +} diff --git a/tests/realtikvtest/importintotest3/main_test.go b/tests/realtikvtest/importintotest3/main_test.go index 645422f2a68cb..c6eb2e0c3bd40 100644 --- a/tests/realtikvtest/importintotest3/main_test.go +++ b/tests/realtikvtest/importintotest3/main_test.go @@ -45,7 +45,7 @@ var ( gcsEndpoint = fmt.Sprintf(gcsEndpointFormat, gcsHost, gcsPort) ) -func TestLoadRemote(t *testing.T) { +func TestImportInto(t *testing.T) { suite.Run(t, &mockGCSSuite{}) } diff --git a/tests/realtikvtest/importintotest4/BUILD.bazel b/tests/realtikvtest/importintotest4/BUILD.bazel index ffd62326a2093..d7a68debdb9ac 100644 --- a/tests/realtikvtest/importintotest4/BUILD.bazel +++ b/tests/realtikvtest/importintotest4/BUILD.bazel @@ -13,7 +13,7 @@ go_test( deps = [ "//br/pkg/lightning/config", "//pkg/config", - "//pkg/disttask/framework/dispatcher", + "//pkg/disttask/framework/scheduler", "//pkg/disttask/framework/storage", "//pkg/disttask/importinto", "//pkg/executor/importer", diff --git a/tests/realtikvtest/importintotest4/global_sort_test.go b/tests/realtikvtest/importintotest4/global_sort_test.go index b84b3f9929bf9..65ef869d86e3a 100644 --- a/tests/realtikvtest/importintotest4/global_sort_test.go +++ b/tests/realtikvtest/importintotest4/global_sort_test.go @@ -25,7 +25,7 @@ import ( "time" "github.com/fsouza/fake-gcs-server/fakestorage" - "github.com/pingcap/tidb/pkg/disttask/framework/dispatcher" + "github.com/pingcap/tidb/pkg/disttask/framework/scheduler" "github.com/pingcap/tidb/pkg/disttask/framework/storage" "github.com/pingcap/tidb/pkg/disttask/importinto" "github.com/pingcap/tidb/pkg/executor/importer" @@ -61,7 +61,7 @@ func (s *mockGCSSuite) TestGlobalSortBasic() { s.tk.MustExec(`create table t (a bigint primary key, b varchar(100), c varchar(100), d int, key(a), key(c,d), key(d));`) s.enableFailpoint("github.com/pingcap/tidb/pkg/parser/ast/forceRedactURL", "return(true)") - s.enableFailpoint("github.com/pingcap/tidb/pkg/disttask/framework/dispatcher/WaitCleanUpFinished", "return()") + s.enableFailpoint("github.com/pingcap/tidb/pkg/disttask/framework/scheduler/WaitCleanUpFinished", "return()") sortStorageURI := fmt.Sprintf("gs://sorted/import?endpoint=%s&access-key=aaaaaa&secret-access-key=bbbbbb", gcsEndpoint) importSQL := fmt.Sprintf(`import into t FROM 'gs://gs-basic/t.*.csv?endpoint=%s' @@ -76,7 +76,7 @@ func (s *mockGCSSuite) TestGlobalSortBasic() { )) // check all sorted data cleaned up - <-dispatcher.WaitCleanUpFinished + <-scheduler.WaitCleanUpFinished _, files, err := s.server.ListObjectsWithOptions("sorted", fakestorage.ListOptions{Prefix: "import"}) s.NoError(err) @@ -87,13 +87,13 @@ func (s *mockGCSSuite) TestGlobalSortBasic() { redactedSortStorageURI := fmt.Sprintf("gs://sorted/import?endpoint=%s&access-key=xxxxxx&secret-access-key=xxxxxx", gcsEndpoint) urlEqual(s.T(), redactedSortStorageURI, jobInfo.Parameters.Options["cloud_storage_uri"].(string)) s.Equal(uint64(6), jobInfo.Summary.ImportedRows) - globalTaskManager, err := storage.GetTaskManager() + taskManager, err := storage.GetTaskManager() s.NoError(err) taskKey := importinto.TaskKey(int64(jobID)) - globalTask, err2 := globalTaskManager.GetGlobalTaskByKeyWithHistory(ctx, taskKey) + task, err2 := taskManager.GetTaskByKeyWithHistory(ctx, taskKey) s.NoError(err2) taskMeta := importinto.TaskMeta{} - s.NoError(json.Unmarshal(globalTask.Meta, &taskMeta)) + s.NoError(json.Unmarshal(task.Meta, &taskMeta)) urlEqual(s.T(), redactedSortStorageURI, taskMeta.Plan.CloudStorageURI) // merge-sort data kv @@ -105,7 +105,7 @@ func (s *mockGCSSuite) TestGlobalSortBasic() { "1 foo1 bar1 123", "2 foo2 bar2 456", "3 foo3 bar3 789", "4 foo4 bar4 123", "5 foo5 bar5 223", "6 foo6 bar6 323", )) - <-dispatcher.WaitCleanUpFinished + <-scheduler.WaitCleanUpFinished // failed task, should clean up all sorted data too. s.enableFailpoint("github.com/pingcap/tidb/pkg/disttask/importinto/failWhenDispatchWriteIngestSubtask", "return(true)") @@ -115,12 +115,12 @@ func (s *mockGCSSuite) TestGlobalSortBasic() { jobID, err = strconv.Atoi(result[0][0].(string)) s.NoError(err) s.Eventually(func() bool { - globalTask, err2 = globalTaskManager.GetGlobalTaskByKeyWithHistory(ctx, importinto.TaskKey(int64(jobID))) + task, err2 = taskManager.GetTaskByKeyWithHistory(ctx, importinto.TaskKey(int64(jobID))) s.NoError(err2) - return globalTask.State == "failed" + return task.State == "failed" }, 30*time.Second, 300*time.Millisecond) // check all sorted data cleaned up - <-dispatcher.WaitCleanUpFinished + <-scheduler.WaitCleanUpFinished _, files, err = s.server.ListObjectsWithOptions("sorted", fakestorage.ListOptions{Prefix: "import"}) s.NoError(err) diff --git a/tests/realtikvtest/importintotest4/main_test.go b/tests/realtikvtest/importintotest4/main_test.go index 645422f2a68cb..c6eb2e0c3bd40 100644 --- a/tests/realtikvtest/importintotest4/main_test.go +++ b/tests/realtikvtest/importintotest4/main_test.go @@ -45,7 +45,7 @@ var ( gcsEndpoint = fmt.Sprintf(gcsEndpointFormat, gcsHost, gcsPort) ) -func TestLoadRemote(t *testing.T) { +func TestImportInto(t *testing.T) { suite.Run(t, &mockGCSSuite{}) } diff --git a/tests/realtikvtest/importintotest4/split_file_test.go b/tests/realtikvtest/importintotest4/split_file_test.go index 6d8a5bf7e4665..646c937b08b68 100644 --- a/tests/realtikvtest/importintotest4/split_file_test.go +++ b/tests/realtikvtest/importintotest4/split_file_test.go @@ -58,14 +58,14 @@ func (s *mockGCSSuite) TestSplitFile() { s.Len(result, 1) jobID, err := strconv.Atoi(result[0][0].(string)) s.NoError(err) - globalTaskManager, err := storage.GetTaskManager() + taskManager, err := storage.GetTaskManager() s.NoError(err) taskKey := importinto.TaskKey(int64(jobID)) s.NoError(err) - globalTask, err2 := globalTaskManager.GetGlobalTaskByKeyWithHistory(ctx, taskKey) + task, err2 := taskManager.GetTaskByKeyWithHistory(ctx, taskKey) s.NoError(err2) - subtasks, err2 := globalTaskManager.GetSubtasksForImportInto(ctx, globalTask.ID, importinto.StepImport) + subtasks, err2 := taskManager.GetSubtasksWithHistory(ctx, task.ID, importinto.StepImport) s.NoError(err2) s.Len(subtasks, 3) s.tk.MustQuery("select * from t").Sort().Check(testkit.Rows(allData...)) diff --git a/tests/realtikvtest/pessimistictest/BUILD.bazel b/tests/realtikvtest/pessimistictest/BUILD.bazel index f2f71713d2670..e8fe76ff36556 100644 --- a/tests/realtikvtest/pessimistictest/BUILD.bazel +++ b/tests/realtikvtest/pessimistictest/BUILD.bazel @@ -38,6 +38,7 @@ go_test( "@com_github_pingcap_errors//:errors", "@com_github_pingcap_failpoint//:failpoint", "@com_github_stretchr_testify//require", + "@com_github_tikv_client_go_v2//config", "@com_github_tikv_client_go_v2//oracle", "@com_github_tikv_client_go_v2//testutils", "@com_github_tikv_client_go_v2//tikv", diff --git a/tests/realtikvtest/pessimistictest/pessimistic_test.go b/tests/realtikvtest/pessimistictest/pessimistic_test.go index 9a42086bb087f..c9542668804cd 100644 --- a/tests/realtikvtest/pessimistictest/pessimistic_test.go +++ b/tests/realtikvtest/pessimistictest/pessimistic_test.go @@ -53,6 +53,7 @@ import ( "github.com/pingcap/tidb/pkg/util/sqlkiller" "github.com/pingcap/tidb/tests/realtikvtest" "github.com/stretchr/testify/require" + tikvcfg "github.com/tikv/client-go/v2/config" "github.com/tikv/client-go/v2/oracle" "github.com/tikv/client-go/v2/testutils" "github.com/tikv/client-go/v2/tikv" @@ -3488,7 +3489,7 @@ func TestIssueBatchResolveLocks(t *testing.T) { // Simulate a later GC that should resolve all stale lock produced in above steps. currentTS, err := store.CurrentVersion(kv.GlobalTxnScope) require.NoError(t, err) - _, err = gcworker.RunResolveLocks(context.Background(), store.(tikv.Storage), domain.GetPDClient(), currentTS.Ver, "gc-worker-test-batch-resolve-locks", 1, false) + err = gcworker.RunResolveLocks(context.Background(), store.(tikv.Storage), domain.GetPDClient(), currentTS.Ver, "gc-worker-test-batch-resolve-locks", 1) require.NoError(t, err) // Check row 6 unlocked @@ -3567,3 +3568,37 @@ func TestIssue42937(t *testing.T) { "5 11", )) } + +func TestEndTxnOnLockExpire(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("create table t(a int, b int)") + tk.MustExec("prepare ps_commit from 'commit'") + tk.MustExec("prepare ps_rollback from 'rollback'") + + defer setLockTTL(300).restore() + defer tikvcfg.UpdateGlobal(func(conf *tikvcfg.Config) { + conf.MaxTxnTTL = 500 + })() + + for _, tt := range []struct { + name string + endTxnSQL string + }{ + {"CommitTxt", "commit"}, + {"CommitBin", "execute ps_commit"}, + {"RollbackTxt", "rollback"}, + {"RollbackBin", "execute ps_rollback"}, + } { + t.Run(tt.name, func(t *testing.T) { + tk.Exec("delete from t") + tk.Exec("insert into t values (1, 1)") + tk.Exec("begin pessimistic") + tk.Exec("update t set b = 10 where a = 1") + time.Sleep(time.Second) + tk.MustContainErrMsg("select * from t", "TTL manager has timed out") + tk.MustExec(tt.endTxnSQL) + }) + } +} diff --git a/tests/realtikvtest/statisticstest/main_test.go b/tests/realtikvtest/statisticstest/main_test.go index 74d6f781165be..d58e83ed1cfd6 100644 --- a/tests/realtikvtest/statisticstest/main_test.go +++ b/tests/realtikvtest/statisticstest/main_test.go @@ -24,6 +24,7 @@ import ( func TestMain(m *testing.M) { opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), } diff --git a/tests/realtikvtest/testkit.go b/tests/realtikvtest/testkit.go index 1b8fc505ca11c..7b02594637424 100644 --- a/tests/realtikvtest/testkit.go +++ b/tests/realtikvtest/testkit.go @@ -68,8 +68,9 @@ func RunTestMain(m *testing.M) { tikv.EnableFailpoints() opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"), + goleak.IgnoreTopFunction("github.com/bazelbuild/rules_go/go/tools/bzltestutil.RegisterTimeoutHandler.func1"), goleak.IgnoreTopFunction("github.com/lestrrat-go/httprc.runFetchWorker"), - goleak.IgnoreTopFunction("github.com/tikv/client-go/v2/internal/retry.newBackoffFn.func1"), + goleak.IgnoreTopFunction("github.com/tikv/client-go/v2/config/retry.newBackoffFn.func1"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/v3.waitRetryBackoff"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("google.golang.org/grpc.(*addrConn).resetTransport"), @@ -80,7 +81,7 @@ func RunTestMain(m *testing.M) { goleak.IgnoreTopFunction("net/http.(*persistConn).writeLoop"), goleak.IgnoreTopFunction("github.com/tikv/client-go/v2/txnkv/transaction.keepAlive"), // backoff function will lead to sleep, so there is a high probability of goroutine leak while it's doing backoff. - goleak.IgnoreTopFunction("github.com/tikv/client-go/v2/internal/retry.(*Config).createBackoffFn.newBackoffFn.func2"), + goleak.IgnoreTopFunction("github.com/tikv/client-go/v2/config/retry.(*Config).createBackoffFn.newBackoffFn.func2"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), } callback := func(i int) int { diff --git a/tests/realtikvtest/txntest/txn_test.go b/tests/realtikvtest/txntest/txn_test.go index b22e917ae4c3a..33f821fc406e7 100644 --- a/tests/realtikvtest/txntest/txn_test.go +++ b/tests/realtikvtest/txntest/txn_test.go @@ -290,3 +290,55 @@ func TestSelectLockForPartitionTable(t *testing.T) { res = <-ch require.True(t, res) } + +func TestTxnEntrySizeLimit(t *testing.T) { + store := testkit.CreateMockStore(t) + tk1 := testkit.NewTestKit(t, store) + tk2 := testkit.NewTestKit(t, store) + tk1.MustExec("use test") + tk2.MustExec("use test") + tk1.MustExec("create table t (a int, b longtext)") + + // cannot insert a large entry by default + tk1.MustContainErrMsg("insert into t values (1, repeat('a', 7340032))", "[kv:8025]entry too large, the max entry size is 6291456") + + // increase the entry size limit allow user write large entries + tk1.MustExec("set session tidb_txn_entry_size_limit=8388608") + tk1.MustExec("insert into t values (1, repeat('a', 7340032))") + tk1.MustContainErrMsg("insert into t values (1, repeat('a', 9427968))", "[kv:8025]entry too large, the max entry size is 8388608") + + // update session var does not affect other sessions + tk2.MustContainErrMsg("insert into t values (1, repeat('a', 7340032))", "[kv:8025]entry too large, the max entry size is 6291456") + tk3 := testkit.NewTestKit(t, store) + tk3.MustExec("use test") + tk3.MustContainErrMsg("insert into t values (1, repeat('a', 7340032))", "[kv:8025]entry too large, the max entry size is 6291456") + + // update session var does not affect internal session used by ddl backfilling + tk1.MustContainErrMsg("alter table t modify column a varchar(255)", "[kv:8025]entry too large, the max entry size is 6291456") + + // update global var allows ddl backfilling write large entries + tk1.MustExec("set global tidb_txn_entry_size_limit=8388608") + tk1.MustExec("alter table t modify column a varchar(255)") + tk2.MustExec("alter table t modify column a int") + + // update global var does not affect existing sessions + tk2.MustContainErrMsg("insert into t values (1, repeat('a', 7340032))", "[kv:8025]entry too large, the max entry size is 6291456") + tk3.MustContainErrMsg("insert into t values (1, repeat('a', 7340032))", "[kv:8025]entry too large, the max entry size is 6291456") + + // update global var affects new sessions + tk4 := testkit.NewTestKit(t, store) + tk4.MustExec("use test") + tk4.MustExec("insert into t values (2, repeat('b', 7340032))") + + // reset global var to default + tk1.MustExec("set global tidb_txn_entry_size_limit=0") + tk1.MustContainErrMsg("alter table t modify column a varchar(255)", "[kv:8025]entry too large, the max entry size is 6291456") + tk2.MustContainErrMsg("alter table t modify column a varchar(255)", "[kv:8025]entry too large, the max entry size is 6291456") + tk3.MustContainErrMsg("alter table t modify column a varchar(255)", "[kv:8025]entry too large, the max entry size is 6291456") + tk4.MustContainErrMsg("alter table t modify column a varchar(255)", "[kv:8025]entry too large, the max entry size is 6291456") + + // reset session var to default + tk1.MustExec("insert into t values (3, repeat('c', 7340032))") + tk1.MustExec("set session tidb_txn_entry_size_limit=0") + tk1.MustContainErrMsg("insert into t values (1, repeat('a', 7340032))", "[kv:8025]entry too large, the max entry size is 6291456") +} diff --git a/tools/check/check-bazel-prepare-rbe.sh b/tools/check/check-bazel-prepare-rbe.sh index 31f2739b71935..988bdb56ce7bd 100644 --- a/tools/check/check-bazel-prepare-rbe.sh +++ b/tools/check/check-bazel-prepare-rbe.sh @@ -20,9 +20,9 @@ # or to zero if all commands of the pipeline exit successfully. set -euo pipefail -before_checksum=`find . -type f \( -name *.bazel -o -name *.bzl \) -exec md5sum {} \;| sort -k 2` +before_checksum=`find . -type f \( -name '*.bazel' -o -name '*.bzl' \) -exec md5sum {} \;| sort -k 2` make bazel_ci_prepare_rbe -after_checksum=`find . -type f \( -name *.bazel -o -name *.bzl \) -exec md5sum {} \;| sort -k 2` +after_checksum=`find . -type f \( -name '*.bazel' -o -name '*.bzl' \) -exec md5sum {} \;| sort -k 2` if [ "$before_checksum" != "$after_checksum" ] then echo "Please run \`make bazel_prepare\` to update \`.bazel\` files, or just apply the following git diff (run \`git apply -\` and paste following contents):" diff --git a/tools/check/check-bazel-prepare.sh b/tools/check/check-bazel-prepare.sh index d24ce59cfa64e..43f7a4089b4f4 100755 --- a/tools/check/check-bazel-prepare.sh +++ b/tools/check/check-bazel-prepare.sh @@ -20,9 +20,9 @@ # or to zero if all commands of the pipeline exit successfully. set -euo pipefail -before_checksum=`find . -type f \( -name *.bazel -o -name *.bzl \) -exec md5sum {} \;| sort -k 2` +before_checksum=`find . -type f \( -name '*.bazel' -o -name '*.bzl' \) -exec md5sum {} \;| sort -k 2` make bazel_ci_prepare -after_checksum=`find . -type f \( -name *.bazel -o -name *.bzl \) -exec md5sum {} \;| sort -k 2` +after_checksum=`find . -type f \( -name '*.bazel' -o -name '*.bzl' \) -exec md5sum {} \;| sort -k 2` if [ "$before_checksum" != "$after_checksum" ] then echo "Please run \`make bazel_prepare\` to update \`.bazel\` files, or just apply the following git diff (run \`git apply -\` and paste following contents):" diff --git a/tools/check/ut.go b/tools/check/ut.go index 6fb662bed1edb..c28c535377c40 100644 --- a/tools/check/ut.go +++ b/tools/check/ut.go @@ -29,6 +29,7 @@ import ( "regexp" "runtime" "sort" + "strconv" "strings" "sync" "time" @@ -97,6 +98,7 @@ func (t *task) String() string { } var p int +var buildParallel int var workDir string func cmdList(args ...string) bool { @@ -309,7 +311,7 @@ func cmdRun(args ...string) bool { tasks = tmp } - fmt.Printf("building task finish, maxproc=%d, count=%d, takes=%v\n", p, len(tasks), time.Since(start)) + fmt.Printf("building task finish, parallelism=%d, count=%d, takes=%v\n", buildParallel, len(tasks), time.Since(start)) taskCh := make(chan task, 100) works := make([]numa, p) @@ -342,26 +344,31 @@ func cmdRun(args ...string) bool { } } + if coverprofile != "" { + collectCoverProfileFile() + } + for _, work := range works { if work.Fail { return false } } - if coverprofile != "" { - collectCoverProfileFile() - } return true } func parseCaseListFromFile(fileName string) (map[string]struct{}, error) { + ret := make(map[string]struct{}) + f, err := os.Open(filepath.Clean(fileName)) + if os.IsNotExist(err) { + return ret, nil + } if err != nil { return nil, withTrace(err) } //nolint: errcheck defer f.Close() - ret := make(map[string]struct{}) s := bufio.NewScanner(f) for s.Scan() { line := s.Bytes() @@ -448,6 +455,8 @@ func main() { // Get the correct count of CPU if it's in docker. p = runtime.GOMAXPROCS(0) + // We use 2 * p for `go build` to make it faster. + buildParallel = p * 2 var err error workDir, err = os.Getwd() if err != nil { @@ -870,7 +879,7 @@ func buildTestBinaryMulti(pkgs []string) error { } var cmd *exec.Cmd - cmd = exec.Command("go", "test", "--tags=intest", "--exec", xprogPath, "-vet", "off", "-count", "0") + cmd = exec.Command("go", "test", "--tags=intest", "-p", strconv.Itoa(buildParallel), "--exec", xprogPath, "-vet", "off", "-count", "0") if coverprofile != "" { cmd.Args = append(cmd.Args, "-cover") }